1*4882a593Smuzhiyun /************************************************************************
2*4882a593Smuzhiyun * s2io.h: A Linux PCI-X Ethernet driver for Neterion 10GbE Server NIC
3*4882a593Smuzhiyun * Copyright(c) 2002-2010 Exar Corp.
4*4882a593Smuzhiyun
5*4882a593Smuzhiyun * This software may be used and distributed according to the terms of
6*4882a593Smuzhiyun * the GNU General Public License (GPL), incorporated herein by reference.
7*4882a593Smuzhiyun * Drivers based on or derived from this code fall under the GPL and must
8*4882a593Smuzhiyun * retain the authorship, copyright and license notice. This file is not
9*4882a593Smuzhiyun * a complete program and may only be used when the entire operating
10*4882a593Smuzhiyun * system is licensed under the GPL.
11*4882a593Smuzhiyun * See the file COPYING in this distribution for more information.
12*4882a593Smuzhiyun ************************************************************************/
13*4882a593Smuzhiyun #include <linux/io-64-nonatomic-lo-hi.h>
14*4882a593Smuzhiyun #ifndef _S2IO_H
15*4882a593Smuzhiyun #define _S2IO_H
16*4882a593Smuzhiyun
17*4882a593Smuzhiyun #define TBD 0
18*4882a593Smuzhiyun #define s2BIT(loc) (0x8000000000000000ULL >> (loc))
19*4882a593Smuzhiyun #define vBIT(val, loc, sz) (((u64)val) << (64-loc-sz))
20*4882a593Smuzhiyun #define INV(d) ((d&0xff)<<24) | (((d>>8)&0xff)<<16) | (((d>>16)&0xff)<<8)| ((d>>24)&0xff)
21*4882a593Smuzhiyun
22*4882a593Smuzhiyun #undef SUCCESS
23*4882a593Smuzhiyun #define SUCCESS 0
24*4882a593Smuzhiyun #define FAILURE -1
25*4882a593Smuzhiyun #define S2IO_MINUS_ONE 0xFFFFFFFFFFFFFFFFULL
26*4882a593Smuzhiyun #define S2IO_DISABLE_MAC_ENTRY 0xFFFFFFFFFFFFULL
27*4882a593Smuzhiyun #define S2IO_MAX_PCI_CONFIG_SPACE_REINIT 100
28*4882a593Smuzhiyun #define S2IO_BIT_RESET 1
29*4882a593Smuzhiyun #define S2IO_BIT_SET 2
30*4882a593Smuzhiyun #define CHECKBIT(value, nbit) (value & (1 << nbit))
31*4882a593Smuzhiyun
32*4882a593Smuzhiyun /* Maximum time to flicker LED when asked to identify NIC using ethtool */
33*4882a593Smuzhiyun #define MAX_FLICKER_TIME 60000 /* 60 Secs */
34*4882a593Smuzhiyun
35*4882a593Smuzhiyun /* Maximum outstanding splits to be configured into xena. */
36*4882a593Smuzhiyun enum {
37*4882a593Smuzhiyun XENA_ONE_SPLIT_TRANSACTION = 0,
38*4882a593Smuzhiyun XENA_TWO_SPLIT_TRANSACTION = 1,
39*4882a593Smuzhiyun XENA_THREE_SPLIT_TRANSACTION = 2,
40*4882a593Smuzhiyun XENA_FOUR_SPLIT_TRANSACTION = 3,
41*4882a593Smuzhiyun XENA_EIGHT_SPLIT_TRANSACTION = 4,
42*4882a593Smuzhiyun XENA_TWELVE_SPLIT_TRANSACTION = 5,
43*4882a593Smuzhiyun XENA_SIXTEEN_SPLIT_TRANSACTION = 6,
44*4882a593Smuzhiyun XENA_THIRTYTWO_SPLIT_TRANSACTION = 7
45*4882a593Smuzhiyun };
46*4882a593Smuzhiyun #define XENA_MAX_OUTSTANDING_SPLITS(n) (n << 4)
47*4882a593Smuzhiyun
48*4882a593Smuzhiyun /* OS concerned variables and constants */
49*4882a593Smuzhiyun #define WATCH_DOG_TIMEOUT 15*HZ
50*4882a593Smuzhiyun #define EFILL 0x1234
51*4882a593Smuzhiyun #define ALIGN_SIZE 127
52*4882a593Smuzhiyun #define PCIX_COMMAND_REGISTER 0x62
53*4882a593Smuzhiyun
54*4882a593Smuzhiyun /*
55*4882a593Smuzhiyun * Debug related variables.
56*4882a593Smuzhiyun */
57*4882a593Smuzhiyun /* different debug levels. */
58*4882a593Smuzhiyun #define ERR_DBG 0
59*4882a593Smuzhiyun #define INIT_DBG 1
60*4882a593Smuzhiyun #define INFO_DBG 2
61*4882a593Smuzhiyun #define TX_DBG 3
62*4882a593Smuzhiyun #define INTR_DBG 4
63*4882a593Smuzhiyun
64*4882a593Smuzhiyun /* Global variable that defines the present debug level of the driver. */
65*4882a593Smuzhiyun static int debug_level = ERR_DBG;
66*4882a593Smuzhiyun
67*4882a593Smuzhiyun /* DEBUG message print. */
68*4882a593Smuzhiyun #define DBG_PRINT(dbg_level, fmt, args...) do { \
69*4882a593Smuzhiyun if (dbg_level <= debug_level) \
70*4882a593Smuzhiyun pr_info(fmt, ##args); \
71*4882a593Smuzhiyun } while (0)
72*4882a593Smuzhiyun
73*4882a593Smuzhiyun /* Protocol assist features of the NIC */
74*4882a593Smuzhiyun #define L3_CKSUM_OK 0xFFFF
75*4882a593Smuzhiyun #define L4_CKSUM_OK 0xFFFF
76*4882a593Smuzhiyun #define S2IO_JUMBO_SIZE 9600
77*4882a593Smuzhiyun
78*4882a593Smuzhiyun /* Driver statistics maintained by driver */
79*4882a593Smuzhiyun struct swStat {
80*4882a593Smuzhiyun unsigned long long single_ecc_errs;
81*4882a593Smuzhiyun unsigned long long double_ecc_errs;
82*4882a593Smuzhiyun unsigned long long parity_err_cnt;
83*4882a593Smuzhiyun unsigned long long serious_err_cnt;
84*4882a593Smuzhiyun unsigned long long soft_reset_cnt;
85*4882a593Smuzhiyun unsigned long long fifo_full_cnt;
86*4882a593Smuzhiyun unsigned long long ring_full_cnt[8];
87*4882a593Smuzhiyun /* LRO statistics */
88*4882a593Smuzhiyun unsigned long long clubbed_frms_cnt;
89*4882a593Smuzhiyun unsigned long long sending_both;
90*4882a593Smuzhiyun unsigned long long outof_sequence_pkts;
91*4882a593Smuzhiyun unsigned long long flush_max_pkts;
92*4882a593Smuzhiyun unsigned long long sum_avg_pkts_aggregated;
93*4882a593Smuzhiyun unsigned long long num_aggregations;
94*4882a593Smuzhiyun /* Other statistics */
95*4882a593Smuzhiyun unsigned long long mem_alloc_fail_cnt;
96*4882a593Smuzhiyun unsigned long long pci_map_fail_cnt;
97*4882a593Smuzhiyun unsigned long long watchdog_timer_cnt;
98*4882a593Smuzhiyun unsigned long long mem_allocated;
99*4882a593Smuzhiyun unsigned long long mem_freed;
100*4882a593Smuzhiyun unsigned long long link_up_cnt;
101*4882a593Smuzhiyun unsigned long long link_down_cnt;
102*4882a593Smuzhiyun unsigned long long link_up_time;
103*4882a593Smuzhiyun unsigned long long link_down_time;
104*4882a593Smuzhiyun
105*4882a593Smuzhiyun /* Transfer Code statistics */
106*4882a593Smuzhiyun unsigned long long tx_buf_abort_cnt;
107*4882a593Smuzhiyun unsigned long long tx_desc_abort_cnt;
108*4882a593Smuzhiyun unsigned long long tx_parity_err_cnt;
109*4882a593Smuzhiyun unsigned long long tx_link_loss_cnt;
110*4882a593Smuzhiyun unsigned long long tx_list_proc_err_cnt;
111*4882a593Smuzhiyun
112*4882a593Smuzhiyun unsigned long long rx_parity_err_cnt;
113*4882a593Smuzhiyun unsigned long long rx_abort_cnt;
114*4882a593Smuzhiyun unsigned long long rx_parity_abort_cnt;
115*4882a593Smuzhiyun unsigned long long rx_rda_fail_cnt;
116*4882a593Smuzhiyun unsigned long long rx_unkn_prot_cnt;
117*4882a593Smuzhiyun unsigned long long rx_fcs_err_cnt;
118*4882a593Smuzhiyun unsigned long long rx_buf_size_err_cnt;
119*4882a593Smuzhiyun unsigned long long rx_rxd_corrupt_cnt;
120*4882a593Smuzhiyun unsigned long long rx_unkn_err_cnt;
121*4882a593Smuzhiyun
122*4882a593Smuzhiyun /* Error/alarm statistics*/
123*4882a593Smuzhiyun unsigned long long tda_err_cnt;
124*4882a593Smuzhiyun unsigned long long pfc_err_cnt;
125*4882a593Smuzhiyun unsigned long long pcc_err_cnt;
126*4882a593Smuzhiyun unsigned long long tti_err_cnt;
127*4882a593Smuzhiyun unsigned long long lso_err_cnt;
128*4882a593Smuzhiyun unsigned long long tpa_err_cnt;
129*4882a593Smuzhiyun unsigned long long sm_err_cnt;
130*4882a593Smuzhiyun unsigned long long mac_tmac_err_cnt;
131*4882a593Smuzhiyun unsigned long long mac_rmac_err_cnt;
132*4882a593Smuzhiyun unsigned long long xgxs_txgxs_err_cnt;
133*4882a593Smuzhiyun unsigned long long xgxs_rxgxs_err_cnt;
134*4882a593Smuzhiyun unsigned long long rc_err_cnt;
135*4882a593Smuzhiyun unsigned long long prc_pcix_err_cnt;
136*4882a593Smuzhiyun unsigned long long rpa_err_cnt;
137*4882a593Smuzhiyun unsigned long long rda_err_cnt;
138*4882a593Smuzhiyun unsigned long long rti_err_cnt;
139*4882a593Smuzhiyun unsigned long long mc_err_cnt;
140*4882a593Smuzhiyun
141*4882a593Smuzhiyun };
142*4882a593Smuzhiyun
143*4882a593Smuzhiyun /* Xpak releated alarm and warnings */
144*4882a593Smuzhiyun struct xpakStat {
145*4882a593Smuzhiyun u64 alarm_transceiver_temp_high;
146*4882a593Smuzhiyun u64 alarm_transceiver_temp_low;
147*4882a593Smuzhiyun u64 alarm_laser_bias_current_high;
148*4882a593Smuzhiyun u64 alarm_laser_bias_current_low;
149*4882a593Smuzhiyun u64 alarm_laser_output_power_high;
150*4882a593Smuzhiyun u64 alarm_laser_output_power_low;
151*4882a593Smuzhiyun u64 warn_transceiver_temp_high;
152*4882a593Smuzhiyun u64 warn_transceiver_temp_low;
153*4882a593Smuzhiyun u64 warn_laser_bias_current_high;
154*4882a593Smuzhiyun u64 warn_laser_bias_current_low;
155*4882a593Smuzhiyun u64 warn_laser_output_power_high;
156*4882a593Smuzhiyun u64 warn_laser_output_power_low;
157*4882a593Smuzhiyun u64 xpak_regs_stat;
158*4882a593Smuzhiyun u32 xpak_timer_count;
159*4882a593Smuzhiyun };
160*4882a593Smuzhiyun
161*4882a593Smuzhiyun
162*4882a593Smuzhiyun /* The statistics block of Xena */
163*4882a593Smuzhiyun struct stat_block {
164*4882a593Smuzhiyun /* Tx MAC statistics counters. */
165*4882a593Smuzhiyun __le32 tmac_data_octets;
166*4882a593Smuzhiyun __le32 tmac_frms;
167*4882a593Smuzhiyun __le64 tmac_drop_frms;
168*4882a593Smuzhiyun __le32 tmac_bcst_frms;
169*4882a593Smuzhiyun __le32 tmac_mcst_frms;
170*4882a593Smuzhiyun __le64 tmac_pause_ctrl_frms;
171*4882a593Smuzhiyun __le32 tmac_ucst_frms;
172*4882a593Smuzhiyun __le32 tmac_ttl_octets;
173*4882a593Smuzhiyun __le32 tmac_any_err_frms;
174*4882a593Smuzhiyun __le32 tmac_nucst_frms;
175*4882a593Smuzhiyun __le64 tmac_ttl_less_fb_octets;
176*4882a593Smuzhiyun __le64 tmac_vld_ip_octets;
177*4882a593Smuzhiyun __le32 tmac_drop_ip;
178*4882a593Smuzhiyun __le32 tmac_vld_ip;
179*4882a593Smuzhiyun __le32 tmac_rst_tcp;
180*4882a593Smuzhiyun __le32 tmac_icmp;
181*4882a593Smuzhiyun __le64 tmac_tcp;
182*4882a593Smuzhiyun __le32 reserved_0;
183*4882a593Smuzhiyun __le32 tmac_udp;
184*4882a593Smuzhiyun
185*4882a593Smuzhiyun /* Rx MAC Statistics counters. */
186*4882a593Smuzhiyun __le32 rmac_data_octets;
187*4882a593Smuzhiyun __le32 rmac_vld_frms;
188*4882a593Smuzhiyun __le64 rmac_fcs_err_frms;
189*4882a593Smuzhiyun __le64 rmac_drop_frms;
190*4882a593Smuzhiyun __le32 rmac_vld_bcst_frms;
191*4882a593Smuzhiyun __le32 rmac_vld_mcst_frms;
192*4882a593Smuzhiyun __le32 rmac_out_rng_len_err_frms;
193*4882a593Smuzhiyun __le32 rmac_in_rng_len_err_frms;
194*4882a593Smuzhiyun __le64 rmac_long_frms;
195*4882a593Smuzhiyun __le64 rmac_pause_ctrl_frms;
196*4882a593Smuzhiyun __le64 rmac_unsup_ctrl_frms;
197*4882a593Smuzhiyun __le32 rmac_accepted_ucst_frms;
198*4882a593Smuzhiyun __le32 rmac_ttl_octets;
199*4882a593Smuzhiyun __le32 rmac_discarded_frms;
200*4882a593Smuzhiyun __le32 rmac_accepted_nucst_frms;
201*4882a593Smuzhiyun __le32 reserved_1;
202*4882a593Smuzhiyun __le32 rmac_drop_events;
203*4882a593Smuzhiyun __le64 rmac_ttl_less_fb_octets;
204*4882a593Smuzhiyun __le64 rmac_ttl_frms;
205*4882a593Smuzhiyun __le64 reserved_2;
206*4882a593Smuzhiyun __le32 rmac_usized_frms;
207*4882a593Smuzhiyun __le32 reserved_3;
208*4882a593Smuzhiyun __le32 rmac_frag_frms;
209*4882a593Smuzhiyun __le32 rmac_osized_frms;
210*4882a593Smuzhiyun __le32 reserved_4;
211*4882a593Smuzhiyun __le32 rmac_jabber_frms;
212*4882a593Smuzhiyun __le64 rmac_ttl_64_frms;
213*4882a593Smuzhiyun __le64 rmac_ttl_65_127_frms;
214*4882a593Smuzhiyun __le64 reserved_5;
215*4882a593Smuzhiyun __le64 rmac_ttl_128_255_frms;
216*4882a593Smuzhiyun __le64 rmac_ttl_256_511_frms;
217*4882a593Smuzhiyun __le64 reserved_6;
218*4882a593Smuzhiyun __le64 rmac_ttl_512_1023_frms;
219*4882a593Smuzhiyun __le64 rmac_ttl_1024_1518_frms;
220*4882a593Smuzhiyun __le32 rmac_ip;
221*4882a593Smuzhiyun __le32 reserved_7;
222*4882a593Smuzhiyun __le64 rmac_ip_octets;
223*4882a593Smuzhiyun __le32 rmac_drop_ip;
224*4882a593Smuzhiyun __le32 rmac_hdr_err_ip;
225*4882a593Smuzhiyun __le32 reserved_8;
226*4882a593Smuzhiyun __le32 rmac_icmp;
227*4882a593Smuzhiyun __le64 rmac_tcp;
228*4882a593Smuzhiyun __le32 rmac_err_drp_udp;
229*4882a593Smuzhiyun __le32 rmac_udp;
230*4882a593Smuzhiyun __le64 rmac_xgmii_err_sym;
231*4882a593Smuzhiyun __le64 rmac_frms_q0;
232*4882a593Smuzhiyun __le64 rmac_frms_q1;
233*4882a593Smuzhiyun __le64 rmac_frms_q2;
234*4882a593Smuzhiyun __le64 rmac_frms_q3;
235*4882a593Smuzhiyun __le64 rmac_frms_q4;
236*4882a593Smuzhiyun __le64 rmac_frms_q5;
237*4882a593Smuzhiyun __le64 rmac_frms_q6;
238*4882a593Smuzhiyun __le64 rmac_frms_q7;
239*4882a593Smuzhiyun __le16 rmac_full_q3;
240*4882a593Smuzhiyun __le16 rmac_full_q2;
241*4882a593Smuzhiyun __le16 rmac_full_q1;
242*4882a593Smuzhiyun __le16 rmac_full_q0;
243*4882a593Smuzhiyun __le16 rmac_full_q7;
244*4882a593Smuzhiyun __le16 rmac_full_q6;
245*4882a593Smuzhiyun __le16 rmac_full_q5;
246*4882a593Smuzhiyun __le16 rmac_full_q4;
247*4882a593Smuzhiyun __le32 reserved_9;
248*4882a593Smuzhiyun __le32 rmac_pause_cnt;
249*4882a593Smuzhiyun __le64 rmac_xgmii_data_err_cnt;
250*4882a593Smuzhiyun __le64 rmac_xgmii_ctrl_err_cnt;
251*4882a593Smuzhiyun __le32 rmac_err_tcp;
252*4882a593Smuzhiyun __le32 rmac_accepted_ip;
253*4882a593Smuzhiyun
254*4882a593Smuzhiyun /* PCI/PCI-X Read transaction statistics. */
255*4882a593Smuzhiyun __le32 new_rd_req_cnt;
256*4882a593Smuzhiyun __le32 rd_req_cnt;
257*4882a593Smuzhiyun __le32 rd_rtry_cnt;
258*4882a593Smuzhiyun __le32 new_rd_req_rtry_cnt;
259*4882a593Smuzhiyun
260*4882a593Smuzhiyun /* PCI/PCI-X Write/Read transaction statistics. */
261*4882a593Smuzhiyun __le32 wr_req_cnt;
262*4882a593Smuzhiyun __le32 wr_rtry_rd_ack_cnt;
263*4882a593Smuzhiyun __le32 new_wr_req_rtry_cnt;
264*4882a593Smuzhiyun __le32 new_wr_req_cnt;
265*4882a593Smuzhiyun __le32 wr_disc_cnt;
266*4882a593Smuzhiyun __le32 wr_rtry_cnt;
267*4882a593Smuzhiyun
268*4882a593Smuzhiyun /* PCI/PCI-X Write / DMA Transaction statistics. */
269*4882a593Smuzhiyun __le32 txp_wr_cnt;
270*4882a593Smuzhiyun __le32 rd_rtry_wr_ack_cnt;
271*4882a593Smuzhiyun __le32 txd_wr_cnt;
272*4882a593Smuzhiyun __le32 txd_rd_cnt;
273*4882a593Smuzhiyun __le32 rxd_wr_cnt;
274*4882a593Smuzhiyun __le32 rxd_rd_cnt;
275*4882a593Smuzhiyun __le32 rxf_wr_cnt;
276*4882a593Smuzhiyun __le32 txf_rd_cnt;
277*4882a593Smuzhiyun
278*4882a593Smuzhiyun /* Tx MAC statistics overflow counters. */
279*4882a593Smuzhiyun __le32 tmac_data_octets_oflow;
280*4882a593Smuzhiyun __le32 tmac_frms_oflow;
281*4882a593Smuzhiyun __le32 tmac_bcst_frms_oflow;
282*4882a593Smuzhiyun __le32 tmac_mcst_frms_oflow;
283*4882a593Smuzhiyun __le32 tmac_ucst_frms_oflow;
284*4882a593Smuzhiyun __le32 tmac_ttl_octets_oflow;
285*4882a593Smuzhiyun __le32 tmac_any_err_frms_oflow;
286*4882a593Smuzhiyun __le32 tmac_nucst_frms_oflow;
287*4882a593Smuzhiyun __le64 tmac_vlan_frms;
288*4882a593Smuzhiyun __le32 tmac_drop_ip_oflow;
289*4882a593Smuzhiyun __le32 tmac_vld_ip_oflow;
290*4882a593Smuzhiyun __le32 tmac_rst_tcp_oflow;
291*4882a593Smuzhiyun __le32 tmac_icmp_oflow;
292*4882a593Smuzhiyun __le32 tpa_unknown_protocol;
293*4882a593Smuzhiyun __le32 tmac_udp_oflow;
294*4882a593Smuzhiyun __le32 reserved_10;
295*4882a593Smuzhiyun __le32 tpa_parse_failure;
296*4882a593Smuzhiyun
297*4882a593Smuzhiyun /* Rx MAC Statistics overflow counters. */
298*4882a593Smuzhiyun __le32 rmac_data_octets_oflow;
299*4882a593Smuzhiyun __le32 rmac_vld_frms_oflow;
300*4882a593Smuzhiyun __le32 rmac_vld_bcst_frms_oflow;
301*4882a593Smuzhiyun __le32 rmac_vld_mcst_frms_oflow;
302*4882a593Smuzhiyun __le32 rmac_accepted_ucst_frms_oflow;
303*4882a593Smuzhiyun __le32 rmac_ttl_octets_oflow;
304*4882a593Smuzhiyun __le32 rmac_discarded_frms_oflow;
305*4882a593Smuzhiyun __le32 rmac_accepted_nucst_frms_oflow;
306*4882a593Smuzhiyun __le32 rmac_usized_frms_oflow;
307*4882a593Smuzhiyun __le32 rmac_drop_events_oflow;
308*4882a593Smuzhiyun __le32 rmac_frag_frms_oflow;
309*4882a593Smuzhiyun __le32 rmac_osized_frms_oflow;
310*4882a593Smuzhiyun __le32 rmac_ip_oflow;
311*4882a593Smuzhiyun __le32 rmac_jabber_frms_oflow;
312*4882a593Smuzhiyun __le32 rmac_icmp_oflow;
313*4882a593Smuzhiyun __le32 rmac_drop_ip_oflow;
314*4882a593Smuzhiyun __le32 rmac_err_drp_udp_oflow;
315*4882a593Smuzhiyun __le32 rmac_udp_oflow;
316*4882a593Smuzhiyun __le32 reserved_11;
317*4882a593Smuzhiyun __le32 rmac_pause_cnt_oflow;
318*4882a593Smuzhiyun __le64 rmac_ttl_1519_4095_frms;
319*4882a593Smuzhiyun __le64 rmac_ttl_4096_8191_frms;
320*4882a593Smuzhiyun __le64 rmac_ttl_8192_max_frms;
321*4882a593Smuzhiyun __le64 rmac_ttl_gt_max_frms;
322*4882a593Smuzhiyun __le64 rmac_osized_alt_frms;
323*4882a593Smuzhiyun __le64 rmac_jabber_alt_frms;
324*4882a593Smuzhiyun __le64 rmac_gt_max_alt_frms;
325*4882a593Smuzhiyun __le64 rmac_vlan_frms;
326*4882a593Smuzhiyun __le32 rmac_len_discard;
327*4882a593Smuzhiyun __le32 rmac_fcs_discard;
328*4882a593Smuzhiyun __le32 rmac_pf_discard;
329*4882a593Smuzhiyun __le32 rmac_da_discard;
330*4882a593Smuzhiyun __le32 rmac_red_discard;
331*4882a593Smuzhiyun __le32 rmac_rts_discard;
332*4882a593Smuzhiyun __le32 reserved_12;
333*4882a593Smuzhiyun __le32 rmac_ingm_full_discard;
334*4882a593Smuzhiyun __le32 reserved_13;
335*4882a593Smuzhiyun __le32 rmac_accepted_ip_oflow;
336*4882a593Smuzhiyun __le32 reserved_14;
337*4882a593Smuzhiyun __le32 link_fault_cnt;
338*4882a593Smuzhiyun u8 buffer[20];
339*4882a593Smuzhiyun struct swStat sw_stat;
340*4882a593Smuzhiyun struct xpakStat xpak_stat;
341*4882a593Smuzhiyun };
342*4882a593Smuzhiyun
343*4882a593Smuzhiyun /* Default value for 'vlan_strip_tag' configuration parameter */
344*4882a593Smuzhiyun #define NO_STRIP_IN_PROMISC 2
345*4882a593Smuzhiyun
346*4882a593Smuzhiyun /*
347*4882a593Smuzhiyun * Structures representing different init time configuration
348*4882a593Smuzhiyun * parameters of the NIC.
349*4882a593Smuzhiyun */
350*4882a593Smuzhiyun
351*4882a593Smuzhiyun #define MAX_TX_FIFOS 8
352*4882a593Smuzhiyun #define MAX_RX_RINGS 8
353*4882a593Smuzhiyun
354*4882a593Smuzhiyun #define FIFO_DEFAULT_NUM 5
355*4882a593Smuzhiyun #define FIFO_UDP_MAX_NUM 2 /* 0 - even, 1 -odd ports */
356*4882a593Smuzhiyun #define FIFO_OTHER_MAX_NUM 1
357*4882a593Smuzhiyun
358*4882a593Smuzhiyun
359*4882a593Smuzhiyun #define MAX_RX_DESC_1 (MAX_RX_RINGS * MAX_RX_BLOCKS_PER_RING * 128)
360*4882a593Smuzhiyun #define MAX_RX_DESC_2 (MAX_RX_RINGS * MAX_RX_BLOCKS_PER_RING * 86)
361*4882a593Smuzhiyun #define MAX_TX_DESC (MAX_AVAILABLE_TXDS)
362*4882a593Smuzhiyun
363*4882a593Smuzhiyun /* FIFO mappings for all possible number of fifos configured */
364*4882a593Smuzhiyun static const int fifo_map[][MAX_TX_FIFOS] = {
365*4882a593Smuzhiyun {0, 0, 0, 0, 0, 0, 0, 0},
366*4882a593Smuzhiyun {0, 0, 0, 0, 1, 1, 1, 1},
367*4882a593Smuzhiyun {0, 0, 0, 1, 1, 1, 2, 2},
368*4882a593Smuzhiyun {0, 0, 1, 1, 2, 2, 3, 3},
369*4882a593Smuzhiyun {0, 0, 1, 1, 2, 2, 3, 4},
370*4882a593Smuzhiyun {0, 0, 1, 1, 2, 3, 4, 5},
371*4882a593Smuzhiyun {0, 0, 1, 2, 3, 4, 5, 6},
372*4882a593Smuzhiyun {0, 1, 2, 3, 4, 5, 6, 7},
373*4882a593Smuzhiyun };
374*4882a593Smuzhiyun
375*4882a593Smuzhiyun static const u16 fifo_selector[MAX_TX_FIFOS] = {0, 1, 3, 3, 7, 7, 7, 7};
376*4882a593Smuzhiyun
377*4882a593Smuzhiyun /* Maintains Per FIFO related information. */
378*4882a593Smuzhiyun struct tx_fifo_config {
379*4882a593Smuzhiyun #define MAX_AVAILABLE_TXDS 8192
380*4882a593Smuzhiyun u32 fifo_len; /* specifies len of FIFO up to 8192, ie no of TxDLs */
381*4882a593Smuzhiyun /* Priority definition */
382*4882a593Smuzhiyun #define TX_FIFO_PRI_0 0 /*Highest */
383*4882a593Smuzhiyun #define TX_FIFO_PRI_1 1
384*4882a593Smuzhiyun #define TX_FIFO_PRI_2 2
385*4882a593Smuzhiyun #define TX_FIFO_PRI_3 3
386*4882a593Smuzhiyun #define TX_FIFO_PRI_4 4
387*4882a593Smuzhiyun #define TX_FIFO_PRI_5 5
388*4882a593Smuzhiyun #define TX_FIFO_PRI_6 6
389*4882a593Smuzhiyun #define TX_FIFO_PRI_7 7 /*lowest */
390*4882a593Smuzhiyun u8 fifo_priority; /* specifies pointer level for FIFO */
391*4882a593Smuzhiyun /* user should not set twos fifos with same pri */
392*4882a593Smuzhiyun u8 f_no_snoop;
393*4882a593Smuzhiyun #define NO_SNOOP_TXD 0x01
394*4882a593Smuzhiyun #define NO_SNOOP_TXD_BUFFER 0x02
395*4882a593Smuzhiyun };
396*4882a593Smuzhiyun
397*4882a593Smuzhiyun
398*4882a593Smuzhiyun /* Maintains per Ring related information */
399*4882a593Smuzhiyun struct rx_ring_config {
400*4882a593Smuzhiyun u32 num_rxd; /*No of RxDs per Rx Ring */
401*4882a593Smuzhiyun #define RX_RING_PRI_0 0 /* highest */
402*4882a593Smuzhiyun #define RX_RING_PRI_1 1
403*4882a593Smuzhiyun #define RX_RING_PRI_2 2
404*4882a593Smuzhiyun #define RX_RING_PRI_3 3
405*4882a593Smuzhiyun #define RX_RING_PRI_4 4
406*4882a593Smuzhiyun #define RX_RING_PRI_5 5
407*4882a593Smuzhiyun #define RX_RING_PRI_6 6
408*4882a593Smuzhiyun #define RX_RING_PRI_7 7 /* lowest */
409*4882a593Smuzhiyun
410*4882a593Smuzhiyun u8 ring_priority; /*Specifies service priority of ring */
411*4882a593Smuzhiyun /* OSM should not set any two rings with same priority */
412*4882a593Smuzhiyun u8 ring_org; /*Organization of ring */
413*4882a593Smuzhiyun #define RING_ORG_BUFF1 0x01
414*4882a593Smuzhiyun #define RX_RING_ORG_BUFF3 0x03
415*4882a593Smuzhiyun #define RX_RING_ORG_BUFF5 0x05
416*4882a593Smuzhiyun
417*4882a593Smuzhiyun u8 f_no_snoop;
418*4882a593Smuzhiyun #define NO_SNOOP_RXD 0x01
419*4882a593Smuzhiyun #define NO_SNOOP_RXD_BUFFER 0x02
420*4882a593Smuzhiyun };
421*4882a593Smuzhiyun
422*4882a593Smuzhiyun /* This structure provides contains values of the tunable parameters
423*4882a593Smuzhiyun * of the H/W
424*4882a593Smuzhiyun */
425*4882a593Smuzhiyun struct config_param {
426*4882a593Smuzhiyun /* Tx Side */
427*4882a593Smuzhiyun u32 tx_fifo_num; /*Number of Tx FIFOs */
428*4882a593Smuzhiyun
429*4882a593Smuzhiyun /* 0-No steering, 1-Priority steering, 2-Default fifo map */
430*4882a593Smuzhiyun #define NO_STEERING 0
431*4882a593Smuzhiyun #define TX_PRIORITY_STEERING 0x1
432*4882a593Smuzhiyun #define TX_DEFAULT_STEERING 0x2
433*4882a593Smuzhiyun u8 tx_steering_type;
434*4882a593Smuzhiyun
435*4882a593Smuzhiyun u8 fifo_mapping[MAX_TX_FIFOS];
436*4882a593Smuzhiyun struct tx_fifo_config tx_cfg[MAX_TX_FIFOS]; /*Per-Tx FIFO config */
437*4882a593Smuzhiyun u32 max_txds; /*Max no. of Tx buffer descriptor per TxDL */
438*4882a593Smuzhiyun u64 tx_intr_type;
439*4882a593Smuzhiyun #define INTA 0
440*4882a593Smuzhiyun #define MSI_X 2
441*4882a593Smuzhiyun u8 intr_type;
442*4882a593Smuzhiyun u8 napi;
443*4882a593Smuzhiyun
444*4882a593Smuzhiyun /* Specifies if Tx Intr is UTILZ or PER_LIST type. */
445*4882a593Smuzhiyun
446*4882a593Smuzhiyun /* Rx Side */
447*4882a593Smuzhiyun u32 rx_ring_num; /*Number of receive rings */
448*4882a593Smuzhiyun #define MAX_RX_BLOCKS_PER_RING 150
449*4882a593Smuzhiyun
450*4882a593Smuzhiyun struct rx_ring_config rx_cfg[MAX_RX_RINGS]; /*Per-Rx Ring config */
451*4882a593Smuzhiyun
452*4882a593Smuzhiyun #define HEADER_ETHERNET_II_802_3_SIZE 14
453*4882a593Smuzhiyun #define HEADER_802_2_SIZE 3
454*4882a593Smuzhiyun #define HEADER_SNAP_SIZE 5
455*4882a593Smuzhiyun #define HEADER_VLAN_SIZE 4
456*4882a593Smuzhiyun
457*4882a593Smuzhiyun #define MIN_MTU 46
458*4882a593Smuzhiyun #define MAX_PYLD 1500
459*4882a593Smuzhiyun #define MAX_MTU (MAX_PYLD+18)
460*4882a593Smuzhiyun #define MAX_MTU_VLAN (MAX_PYLD+22)
461*4882a593Smuzhiyun #define MAX_PYLD_JUMBO 9600
462*4882a593Smuzhiyun #define MAX_MTU_JUMBO (MAX_PYLD_JUMBO+18)
463*4882a593Smuzhiyun #define MAX_MTU_JUMBO_VLAN (MAX_PYLD_JUMBO+22)
464*4882a593Smuzhiyun u16 bus_speed;
465*4882a593Smuzhiyun int max_mc_addr; /* xena=64 herc=256 */
466*4882a593Smuzhiyun int max_mac_addr; /* xena=16 herc=64 */
467*4882a593Smuzhiyun int mc_start_offset; /* xena=16 herc=64 */
468*4882a593Smuzhiyun u8 multiq;
469*4882a593Smuzhiyun };
470*4882a593Smuzhiyun
471*4882a593Smuzhiyun /* Structure representing MAC Addrs */
472*4882a593Smuzhiyun struct mac_addr {
473*4882a593Smuzhiyun u8 mac_addr[ETH_ALEN];
474*4882a593Smuzhiyun };
475*4882a593Smuzhiyun
476*4882a593Smuzhiyun /* Structure that represent every FIFO element in the BAR1
477*4882a593Smuzhiyun * Address location.
478*4882a593Smuzhiyun */
479*4882a593Smuzhiyun struct TxFIFO_element {
480*4882a593Smuzhiyun u64 TxDL_Pointer;
481*4882a593Smuzhiyun
482*4882a593Smuzhiyun u64 List_Control;
483*4882a593Smuzhiyun #define TX_FIFO_LAST_TXD_NUM( val) vBIT(val,0,8)
484*4882a593Smuzhiyun #define TX_FIFO_FIRST_LIST s2BIT(14)
485*4882a593Smuzhiyun #define TX_FIFO_LAST_LIST s2BIT(15)
486*4882a593Smuzhiyun #define TX_FIFO_FIRSTNLAST_LIST vBIT(3,14,2)
487*4882a593Smuzhiyun #define TX_FIFO_SPECIAL_FUNC s2BIT(23)
488*4882a593Smuzhiyun #define TX_FIFO_DS_NO_SNOOP s2BIT(31)
489*4882a593Smuzhiyun #define TX_FIFO_BUFF_NO_SNOOP s2BIT(30)
490*4882a593Smuzhiyun };
491*4882a593Smuzhiyun
492*4882a593Smuzhiyun /* Tx descriptor structure */
493*4882a593Smuzhiyun struct TxD {
494*4882a593Smuzhiyun u64 Control_1;
495*4882a593Smuzhiyun /* bit mask */
496*4882a593Smuzhiyun #define TXD_LIST_OWN_XENA s2BIT(7)
497*4882a593Smuzhiyun #define TXD_T_CODE (s2BIT(12)|s2BIT(13)|s2BIT(14)|s2BIT(15))
498*4882a593Smuzhiyun #define TXD_T_CODE_OK(val) (|(val & TXD_T_CODE))
499*4882a593Smuzhiyun #define GET_TXD_T_CODE(val) ((val & TXD_T_CODE)<<12)
500*4882a593Smuzhiyun #define TXD_GATHER_CODE (s2BIT(22) | s2BIT(23))
501*4882a593Smuzhiyun #define TXD_GATHER_CODE_FIRST s2BIT(22)
502*4882a593Smuzhiyun #define TXD_GATHER_CODE_LAST s2BIT(23)
503*4882a593Smuzhiyun #define TXD_TCP_LSO_EN s2BIT(30)
504*4882a593Smuzhiyun #define TXD_UDP_COF_EN s2BIT(31)
505*4882a593Smuzhiyun #define TXD_UFO_EN s2BIT(31) | s2BIT(30)
506*4882a593Smuzhiyun #define TXD_TCP_LSO_MSS(val) vBIT(val,34,14)
507*4882a593Smuzhiyun #define TXD_UFO_MSS(val) vBIT(val,34,14)
508*4882a593Smuzhiyun #define TXD_BUFFER0_SIZE(val) vBIT(val,48,16)
509*4882a593Smuzhiyun
510*4882a593Smuzhiyun u64 Control_2;
511*4882a593Smuzhiyun #define TXD_TX_CKO_CONTROL (s2BIT(5)|s2BIT(6)|s2BIT(7))
512*4882a593Smuzhiyun #define TXD_TX_CKO_IPV4_EN s2BIT(5)
513*4882a593Smuzhiyun #define TXD_TX_CKO_TCP_EN s2BIT(6)
514*4882a593Smuzhiyun #define TXD_TX_CKO_UDP_EN s2BIT(7)
515*4882a593Smuzhiyun #define TXD_VLAN_ENABLE s2BIT(15)
516*4882a593Smuzhiyun #define TXD_VLAN_TAG(val) vBIT(val,16,16)
517*4882a593Smuzhiyun #define TXD_INT_NUMBER(val) vBIT(val,34,6)
518*4882a593Smuzhiyun #define TXD_INT_TYPE_PER_LIST s2BIT(47)
519*4882a593Smuzhiyun #define TXD_INT_TYPE_UTILZ s2BIT(46)
520*4882a593Smuzhiyun #define TXD_SET_MARKER vBIT(0x6,0,4)
521*4882a593Smuzhiyun
522*4882a593Smuzhiyun u64 Buffer_Pointer;
523*4882a593Smuzhiyun u64 Host_Control; /* reserved for host */
524*4882a593Smuzhiyun };
525*4882a593Smuzhiyun
526*4882a593Smuzhiyun /* Structure to hold the phy and virt addr of every TxDL. */
527*4882a593Smuzhiyun struct list_info_hold {
528*4882a593Smuzhiyun dma_addr_t list_phy_addr;
529*4882a593Smuzhiyun void *list_virt_addr;
530*4882a593Smuzhiyun };
531*4882a593Smuzhiyun
532*4882a593Smuzhiyun /* Rx descriptor structure for 1 buffer mode */
533*4882a593Smuzhiyun struct RxD_t {
534*4882a593Smuzhiyun u64 Host_Control; /* reserved for host */
535*4882a593Smuzhiyun u64 Control_1;
536*4882a593Smuzhiyun #define RXD_OWN_XENA s2BIT(7)
537*4882a593Smuzhiyun #define RXD_T_CODE (s2BIT(12)|s2BIT(13)|s2BIT(14)|s2BIT(15))
538*4882a593Smuzhiyun #define RXD_FRAME_PROTO vBIT(0xFFFF,24,8)
539*4882a593Smuzhiyun #define RXD_FRAME_VLAN_TAG s2BIT(24)
540*4882a593Smuzhiyun #define RXD_FRAME_PROTO_IPV4 s2BIT(27)
541*4882a593Smuzhiyun #define RXD_FRAME_PROTO_IPV6 s2BIT(28)
542*4882a593Smuzhiyun #define RXD_FRAME_IP_FRAG s2BIT(29)
543*4882a593Smuzhiyun #define RXD_FRAME_PROTO_TCP s2BIT(30)
544*4882a593Smuzhiyun #define RXD_FRAME_PROTO_UDP s2BIT(31)
545*4882a593Smuzhiyun #define TCP_OR_UDP_FRAME (RXD_FRAME_PROTO_TCP | RXD_FRAME_PROTO_UDP)
546*4882a593Smuzhiyun #define RXD_GET_L3_CKSUM(val) ((u16)(val>> 16) & 0xFFFF)
547*4882a593Smuzhiyun #define RXD_GET_L4_CKSUM(val) ((u16)(val) & 0xFFFF)
548*4882a593Smuzhiyun
549*4882a593Smuzhiyun u64 Control_2;
550*4882a593Smuzhiyun #define THE_RXD_MARK 0x3
551*4882a593Smuzhiyun #define SET_RXD_MARKER vBIT(THE_RXD_MARK, 0, 2)
552*4882a593Smuzhiyun #define GET_RXD_MARKER(ctrl) ((ctrl & SET_RXD_MARKER) >> 62)
553*4882a593Smuzhiyun
554*4882a593Smuzhiyun #define MASK_VLAN_TAG vBIT(0xFFFF,48,16)
555*4882a593Smuzhiyun #define SET_VLAN_TAG(val) vBIT(val,48,16)
556*4882a593Smuzhiyun #define SET_NUM_TAG(val) vBIT(val,16,32)
557*4882a593Smuzhiyun
558*4882a593Smuzhiyun
559*4882a593Smuzhiyun };
560*4882a593Smuzhiyun /* Rx descriptor structure for 1 buffer mode */
561*4882a593Smuzhiyun struct RxD1 {
562*4882a593Smuzhiyun struct RxD_t h;
563*4882a593Smuzhiyun
564*4882a593Smuzhiyun #define MASK_BUFFER0_SIZE_1 vBIT(0x3FFF,2,14)
565*4882a593Smuzhiyun #define SET_BUFFER0_SIZE_1(val) vBIT(val,2,14)
566*4882a593Smuzhiyun #define RXD_GET_BUFFER0_SIZE_1(_Control_2) \
567*4882a593Smuzhiyun (u16)((_Control_2 & MASK_BUFFER0_SIZE_1) >> 48)
568*4882a593Smuzhiyun u64 Buffer0_ptr;
569*4882a593Smuzhiyun };
570*4882a593Smuzhiyun /* Rx descriptor structure for 3 or 2 buffer mode */
571*4882a593Smuzhiyun
572*4882a593Smuzhiyun struct RxD3 {
573*4882a593Smuzhiyun struct RxD_t h;
574*4882a593Smuzhiyun
575*4882a593Smuzhiyun #define MASK_BUFFER0_SIZE_3 vBIT(0xFF,2,14)
576*4882a593Smuzhiyun #define MASK_BUFFER1_SIZE_3 vBIT(0xFFFF,16,16)
577*4882a593Smuzhiyun #define MASK_BUFFER2_SIZE_3 vBIT(0xFFFF,32,16)
578*4882a593Smuzhiyun #define SET_BUFFER0_SIZE_3(val) vBIT(val,8,8)
579*4882a593Smuzhiyun #define SET_BUFFER1_SIZE_3(val) vBIT(val,16,16)
580*4882a593Smuzhiyun #define SET_BUFFER2_SIZE_3(val) vBIT(val,32,16)
581*4882a593Smuzhiyun #define RXD_GET_BUFFER0_SIZE_3(Control_2) \
582*4882a593Smuzhiyun (u8)((Control_2 & MASK_BUFFER0_SIZE_3) >> 48)
583*4882a593Smuzhiyun #define RXD_GET_BUFFER1_SIZE_3(Control_2) \
584*4882a593Smuzhiyun (u16)((Control_2 & MASK_BUFFER1_SIZE_3) >> 32)
585*4882a593Smuzhiyun #define RXD_GET_BUFFER2_SIZE_3(Control_2) \
586*4882a593Smuzhiyun (u16)((Control_2 & MASK_BUFFER2_SIZE_3) >> 16)
587*4882a593Smuzhiyun #define BUF0_LEN 40
588*4882a593Smuzhiyun #define BUF1_LEN 1
589*4882a593Smuzhiyun
590*4882a593Smuzhiyun u64 Buffer0_ptr;
591*4882a593Smuzhiyun u64 Buffer1_ptr;
592*4882a593Smuzhiyun u64 Buffer2_ptr;
593*4882a593Smuzhiyun };
594*4882a593Smuzhiyun
595*4882a593Smuzhiyun
596*4882a593Smuzhiyun /* Structure that represents the Rx descriptor block which contains
597*4882a593Smuzhiyun * 128 Rx descriptors.
598*4882a593Smuzhiyun */
599*4882a593Smuzhiyun struct RxD_block {
600*4882a593Smuzhiyun #define MAX_RXDS_PER_BLOCK_1 127
601*4882a593Smuzhiyun struct RxD1 rxd[MAX_RXDS_PER_BLOCK_1];
602*4882a593Smuzhiyun
603*4882a593Smuzhiyun u64 reserved_0;
604*4882a593Smuzhiyun #define END_OF_BLOCK 0xFEFFFFFFFFFFFFFFULL
605*4882a593Smuzhiyun u64 reserved_1; /* 0xFEFFFFFFFFFFFFFF to mark last
606*4882a593Smuzhiyun * Rxd in this blk */
607*4882a593Smuzhiyun u64 reserved_2_pNext_RxD_block; /* Logical ptr to next */
608*4882a593Smuzhiyun u64 pNext_RxD_Blk_physical; /* Buff0_ptr.In a 32 bit arch
609*4882a593Smuzhiyun * the upper 32 bits should
610*4882a593Smuzhiyun * be 0 */
611*4882a593Smuzhiyun };
612*4882a593Smuzhiyun
613*4882a593Smuzhiyun #define SIZE_OF_BLOCK 4096
614*4882a593Smuzhiyun
615*4882a593Smuzhiyun #define RXD_MODE_1 0 /* One Buffer mode */
616*4882a593Smuzhiyun #define RXD_MODE_3B 1 /* Two Buffer mode */
617*4882a593Smuzhiyun
618*4882a593Smuzhiyun /* Structure to hold virtual addresses of Buf0 and Buf1 in
619*4882a593Smuzhiyun * 2buf mode. */
620*4882a593Smuzhiyun struct buffAdd {
621*4882a593Smuzhiyun void *ba_0_org;
622*4882a593Smuzhiyun void *ba_1_org;
623*4882a593Smuzhiyun void *ba_0;
624*4882a593Smuzhiyun void *ba_1;
625*4882a593Smuzhiyun };
626*4882a593Smuzhiyun
627*4882a593Smuzhiyun /* Structure which stores all the MAC control parameters */
628*4882a593Smuzhiyun
629*4882a593Smuzhiyun /* This structure stores the offset of the RxD in the ring
630*4882a593Smuzhiyun * from which the Rx Interrupt processor can start picking
631*4882a593Smuzhiyun * up the RxDs for processing.
632*4882a593Smuzhiyun */
633*4882a593Smuzhiyun struct rx_curr_get_info {
634*4882a593Smuzhiyun u32 block_index;
635*4882a593Smuzhiyun u32 offset;
636*4882a593Smuzhiyun u32 ring_len;
637*4882a593Smuzhiyun };
638*4882a593Smuzhiyun
639*4882a593Smuzhiyun struct rx_curr_put_info {
640*4882a593Smuzhiyun u32 block_index;
641*4882a593Smuzhiyun u32 offset;
642*4882a593Smuzhiyun u32 ring_len;
643*4882a593Smuzhiyun };
644*4882a593Smuzhiyun
645*4882a593Smuzhiyun /* This structure stores the offset of the TxDl in the FIFO
646*4882a593Smuzhiyun * from which the Tx Interrupt processor can start picking
647*4882a593Smuzhiyun * up the TxDLs for send complete interrupt processing.
648*4882a593Smuzhiyun */
649*4882a593Smuzhiyun struct tx_curr_get_info {
650*4882a593Smuzhiyun u32 offset;
651*4882a593Smuzhiyun u32 fifo_len;
652*4882a593Smuzhiyun };
653*4882a593Smuzhiyun
654*4882a593Smuzhiyun struct tx_curr_put_info {
655*4882a593Smuzhiyun u32 offset;
656*4882a593Smuzhiyun u32 fifo_len;
657*4882a593Smuzhiyun };
658*4882a593Smuzhiyun
659*4882a593Smuzhiyun struct rxd_info {
660*4882a593Smuzhiyun void *virt_addr;
661*4882a593Smuzhiyun dma_addr_t dma_addr;
662*4882a593Smuzhiyun };
663*4882a593Smuzhiyun
664*4882a593Smuzhiyun /* Structure that holds the Phy and virt addresses of the Blocks */
665*4882a593Smuzhiyun struct rx_block_info {
666*4882a593Smuzhiyun void *block_virt_addr;
667*4882a593Smuzhiyun dma_addr_t block_dma_addr;
668*4882a593Smuzhiyun struct rxd_info *rxds;
669*4882a593Smuzhiyun };
670*4882a593Smuzhiyun
671*4882a593Smuzhiyun /* Data structure to represent a LRO session */
672*4882a593Smuzhiyun struct lro {
673*4882a593Smuzhiyun struct sk_buff *parent;
674*4882a593Smuzhiyun struct sk_buff *last_frag;
675*4882a593Smuzhiyun u8 *l2h;
676*4882a593Smuzhiyun struct iphdr *iph;
677*4882a593Smuzhiyun struct tcphdr *tcph;
678*4882a593Smuzhiyun u32 tcp_next_seq;
679*4882a593Smuzhiyun __be32 tcp_ack;
680*4882a593Smuzhiyun int total_len;
681*4882a593Smuzhiyun int frags_len;
682*4882a593Smuzhiyun int sg_num;
683*4882a593Smuzhiyun int in_use;
684*4882a593Smuzhiyun __be16 window;
685*4882a593Smuzhiyun u16 vlan_tag;
686*4882a593Smuzhiyun u32 cur_tsval;
687*4882a593Smuzhiyun __be32 cur_tsecr;
688*4882a593Smuzhiyun u8 saw_ts;
689*4882a593Smuzhiyun } ____cacheline_aligned;
690*4882a593Smuzhiyun
691*4882a593Smuzhiyun /* Ring specific structure */
692*4882a593Smuzhiyun struct ring_info {
693*4882a593Smuzhiyun /* The ring number */
694*4882a593Smuzhiyun int ring_no;
695*4882a593Smuzhiyun
696*4882a593Smuzhiyun /* per-ring buffer counter */
697*4882a593Smuzhiyun u32 rx_bufs_left;
698*4882a593Smuzhiyun
699*4882a593Smuzhiyun #define MAX_LRO_SESSIONS 32
700*4882a593Smuzhiyun struct lro lro0_n[MAX_LRO_SESSIONS];
701*4882a593Smuzhiyun u8 lro;
702*4882a593Smuzhiyun
703*4882a593Smuzhiyun /* copy of sp->rxd_mode flag */
704*4882a593Smuzhiyun int rxd_mode;
705*4882a593Smuzhiyun
706*4882a593Smuzhiyun /* Number of rxds per block for the rxd_mode */
707*4882a593Smuzhiyun int rxd_count;
708*4882a593Smuzhiyun
709*4882a593Smuzhiyun /* copy of sp pointer */
710*4882a593Smuzhiyun struct s2io_nic *nic;
711*4882a593Smuzhiyun
712*4882a593Smuzhiyun /* copy of sp->dev pointer */
713*4882a593Smuzhiyun struct net_device *dev;
714*4882a593Smuzhiyun
715*4882a593Smuzhiyun /* copy of sp->pdev pointer */
716*4882a593Smuzhiyun struct pci_dev *pdev;
717*4882a593Smuzhiyun
718*4882a593Smuzhiyun /* Per ring napi struct */
719*4882a593Smuzhiyun struct napi_struct napi;
720*4882a593Smuzhiyun
721*4882a593Smuzhiyun unsigned long interrupt_count;
722*4882a593Smuzhiyun
723*4882a593Smuzhiyun /*
724*4882a593Smuzhiyun * Place holders for the virtual and physical addresses of
725*4882a593Smuzhiyun * all the Rx Blocks
726*4882a593Smuzhiyun */
727*4882a593Smuzhiyun struct rx_block_info rx_blocks[MAX_RX_BLOCKS_PER_RING];
728*4882a593Smuzhiyun int block_count;
729*4882a593Smuzhiyun int pkt_cnt;
730*4882a593Smuzhiyun
731*4882a593Smuzhiyun /*
732*4882a593Smuzhiyun * Put pointer info which indictes which RxD has to be replenished
733*4882a593Smuzhiyun * with a new buffer.
734*4882a593Smuzhiyun */
735*4882a593Smuzhiyun struct rx_curr_put_info rx_curr_put_info;
736*4882a593Smuzhiyun
737*4882a593Smuzhiyun /*
738*4882a593Smuzhiyun * Get pointer info which indictes which is the last RxD that was
739*4882a593Smuzhiyun * processed by the driver.
740*4882a593Smuzhiyun */
741*4882a593Smuzhiyun struct rx_curr_get_info rx_curr_get_info;
742*4882a593Smuzhiyun
743*4882a593Smuzhiyun /* interface MTU value */
744*4882a593Smuzhiyun unsigned mtu;
745*4882a593Smuzhiyun
746*4882a593Smuzhiyun /* Buffer Address store. */
747*4882a593Smuzhiyun struct buffAdd **ba;
748*4882a593Smuzhiyun } ____cacheline_aligned;
749*4882a593Smuzhiyun
750*4882a593Smuzhiyun /* Fifo specific structure */
751*4882a593Smuzhiyun struct fifo_info {
752*4882a593Smuzhiyun /* FIFO number */
753*4882a593Smuzhiyun int fifo_no;
754*4882a593Smuzhiyun
755*4882a593Smuzhiyun /* Maximum TxDs per TxDL */
756*4882a593Smuzhiyun int max_txds;
757*4882a593Smuzhiyun
758*4882a593Smuzhiyun /* Place holder of all the TX List's Phy and Virt addresses. */
759*4882a593Smuzhiyun struct list_info_hold *list_info;
760*4882a593Smuzhiyun
761*4882a593Smuzhiyun /*
762*4882a593Smuzhiyun * Current offset within the tx FIFO where driver would write
763*4882a593Smuzhiyun * new Tx frame
764*4882a593Smuzhiyun */
765*4882a593Smuzhiyun struct tx_curr_put_info tx_curr_put_info;
766*4882a593Smuzhiyun
767*4882a593Smuzhiyun /*
768*4882a593Smuzhiyun * Current offset within tx FIFO from where the driver would start freeing
769*4882a593Smuzhiyun * the buffers
770*4882a593Smuzhiyun */
771*4882a593Smuzhiyun struct tx_curr_get_info tx_curr_get_info;
772*4882a593Smuzhiyun #define FIFO_QUEUE_START 0
773*4882a593Smuzhiyun #define FIFO_QUEUE_STOP 1
774*4882a593Smuzhiyun int queue_state;
775*4882a593Smuzhiyun
776*4882a593Smuzhiyun /* copy of sp->dev pointer */
777*4882a593Smuzhiyun struct net_device *dev;
778*4882a593Smuzhiyun
779*4882a593Smuzhiyun /* copy of multiq status */
780*4882a593Smuzhiyun u8 multiq;
781*4882a593Smuzhiyun
782*4882a593Smuzhiyun /* Per fifo lock */
783*4882a593Smuzhiyun spinlock_t tx_lock;
784*4882a593Smuzhiyun
785*4882a593Smuzhiyun /* Per fifo UFO in band structure */
786*4882a593Smuzhiyun u64 *ufo_in_band_v;
787*4882a593Smuzhiyun
788*4882a593Smuzhiyun struct s2io_nic *nic;
789*4882a593Smuzhiyun } ____cacheline_aligned;
790*4882a593Smuzhiyun
791*4882a593Smuzhiyun /* Information related to the Tx and Rx FIFOs and Rings of Xena
792*4882a593Smuzhiyun * is maintained in this structure.
793*4882a593Smuzhiyun */
794*4882a593Smuzhiyun struct mac_info {
795*4882a593Smuzhiyun /* tx side stuff */
796*4882a593Smuzhiyun /* logical pointer of start of each Tx FIFO */
797*4882a593Smuzhiyun struct TxFIFO_element __iomem *tx_FIFO_start[MAX_TX_FIFOS];
798*4882a593Smuzhiyun
799*4882a593Smuzhiyun /* Fifo specific structure */
800*4882a593Smuzhiyun struct fifo_info fifos[MAX_TX_FIFOS];
801*4882a593Smuzhiyun
802*4882a593Smuzhiyun /* Save virtual address of TxD page with zero DMA addr(if any) */
803*4882a593Smuzhiyun void *zerodma_virt_addr;
804*4882a593Smuzhiyun
805*4882a593Smuzhiyun /* rx side stuff */
806*4882a593Smuzhiyun /* Ring specific structure */
807*4882a593Smuzhiyun struct ring_info rings[MAX_RX_RINGS];
808*4882a593Smuzhiyun
809*4882a593Smuzhiyun u16 rmac_pause_time;
810*4882a593Smuzhiyun u16 mc_pause_threshold_q0q3;
811*4882a593Smuzhiyun u16 mc_pause_threshold_q4q7;
812*4882a593Smuzhiyun
813*4882a593Smuzhiyun void *stats_mem; /* orignal pointer to allocated mem */
814*4882a593Smuzhiyun dma_addr_t stats_mem_phy; /* Physical address of the stat block */
815*4882a593Smuzhiyun u32 stats_mem_sz;
816*4882a593Smuzhiyun struct stat_block *stats_info; /* Logical address of the stat block */
817*4882a593Smuzhiyun };
818*4882a593Smuzhiyun
819*4882a593Smuzhiyun /* Default Tunable parameters of the NIC. */
820*4882a593Smuzhiyun #define DEFAULT_FIFO_0_LEN 4096
821*4882a593Smuzhiyun #define DEFAULT_FIFO_1_7_LEN 512
822*4882a593Smuzhiyun #define SMALL_BLK_CNT 30
823*4882a593Smuzhiyun #define LARGE_BLK_CNT 100
824*4882a593Smuzhiyun
825*4882a593Smuzhiyun /*
826*4882a593Smuzhiyun * Structure to keep track of the MSI-X vectors and the corresponding
827*4882a593Smuzhiyun * argument registered against each vector
828*4882a593Smuzhiyun */
829*4882a593Smuzhiyun #define MAX_REQUESTED_MSI_X 9
830*4882a593Smuzhiyun struct s2io_msix_entry
831*4882a593Smuzhiyun {
832*4882a593Smuzhiyun u16 vector;
833*4882a593Smuzhiyun u16 entry;
834*4882a593Smuzhiyun void *arg;
835*4882a593Smuzhiyun
836*4882a593Smuzhiyun u8 type;
837*4882a593Smuzhiyun #define MSIX_ALARM_TYPE 1
838*4882a593Smuzhiyun #define MSIX_RING_TYPE 2
839*4882a593Smuzhiyun
840*4882a593Smuzhiyun u8 in_use;
841*4882a593Smuzhiyun #define MSIX_REGISTERED_SUCCESS 0xAA
842*4882a593Smuzhiyun };
843*4882a593Smuzhiyun
844*4882a593Smuzhiyun struct msix_info_st {
845*4882a593Smuzhiyun u64 addr;
846*4882a593Smuzhiyun u64 data;
847*4882a593Smuzhiyun };
848*4882a593Smuzhiyun
849*4882a593Smuzhiyun /* These flags represent the devices temporary state */
850*4882a593Smuzhiyun enum s2io_device_state_t
851*4882a593Smuzhiyun {
852*4882a593Smuzhiyun __S2IO_STATE_LINK_TASK=0,
853*4882a593Smuzhiyun __S2IO_STATE_CARD_UP
854*4882a593Smuzhiyun };
855*4882a593Smuzhiyun
856*4882a593Smuzhiyun /* Structure representing one instance of the NIC */
857*4882a593Smuzhiyun struct s2io_nic {
858*4882a593Smuzhiyun int rxd_mode;
859*4882a593Smuzhiyun /*
860*4882a593Smuzhiyun * Count of packets to be processed in a given iteration, it will be indicated
861*4882a593Smuzhiyun * by the quota field of the device structure when NAPI is enabled.
862*4882a593Smuzhiyun */
863*4882a593Smuzhiyun int pkts_to_process;
864*4882a593Smuzhiyun struct net_device *dev;
865*4882a593Smuzhiyun struct mac_info mac_control;
866*4882a593Smuzhiyun struct config_param config;
867*4882a593Smuzhiyun struct pci_dev *pdev;
868*4882a593Smuzhiyun void __iomem *bar0;
869*4882a593Smuzhiyun void __iomem *bar1;
870*4882a593Smuzhiyun #define MAX_MAC_SUPPORTED 16
871*4882a593Smuzhiyun #define MAX_SUPPORTED_MULTICASTS MAX_MAC_SUPPORTED
872*4882a593Smuzhiyun
873*4882a593Smuzhiyun struct mac_addr def_mac_addr[256];
874*4882a593Smuzhiyun
875*4882a593Smuzhiyun struct net_device_stats stats;
876*4882a593Smuzhiyun int high_dma_flag;
877*4882a593Smuzhiyun int device_enabled_once;
878*4882a593Smuzhiyun
879*4882a593Smuzhiyun char name[60];
880*4882a593Smuzhiyun
881*4882a593Smuzhiyun /* Timer that handles I/O errors/exceptions */
882*4882a593Smuzhiyun struct timer_list alarm_timer;
883*4882a593Smuzhiyun
884*4882a593Smuzhiyun /* Space to back up the PCI config space */
885*4882a593Smuzhiyun u32 config_space[256 / sizeof(u32)];
886*4882a593Smuzhiyun
887*4882a593Smuzhiyun #define PROMISC 1
888*4882a593Smuzhiyun #define ALL_MULTI 2
889*4882a593Smuzhiyun
890*4882a593Smuzhiyun #define MAX_ADDRS_SUPPORTED 64
891*4882a593Smuzhiyun u16 mc_addr_count;
892*4882a593Smuzhiyun
893*4882a593Smuzhiyun u16 m_cast_flg;
894*4882a593Smuzhiyun u16 all_multi_pos;
895*4882a593Smuzhiyun u16 promisc_flg;
896*4882a593Smuzhiyun
897*4882a593Smuzhiyun /* Restart timer, used to restart NIC if the device is stuck and
898*4882a593Smuzhiyun * a schedule task that will set the correct Link state once the
899*4882a593Smuzhiyun * NIC's PHY has stabilized after a state change.
900*4882a593Smuzhiyun */
901*4882a593Smuzhiyun struct work_struct rst_timer_task;
902*4882a593Smuzhiyun struct work_struct set_link_task;
903*4882a593Smuzhiyun
904*4882a593Smuzhiyun /* Flag that can be used to turn on or turn off the Rx checksum
905*4882a593Smuzhiyun * offload feature.
906*4882a593Smuzhiyun */
907*4882a593Smuzhiyun int rx_csum;
908*4882a593Smuzhiyun
909*4882a593Smuzhiyun /* Below variables are used for fifo selection to transmit a packet */
910*4882a593Smuzhiyun u16 fifo_selector[MAX_TX_FIFOS];
911*4882a593Smuzhiyun
912*4882a593Smuzhiyun /* Total fifos for tcp packets */
913*4882a593Smuzhiyun u8 total_tcp_fifos;
914*4882a593Smuzhiyun
915*4882a593Smuzhiyun /*
916*4882a593Smuzhiyun * Beginning index of udp for udp packets
917*4882a593Smuzhiyun * Value will be equal to
918*4882a593Smuzhiyun * (tx_fifo_num - FIFO_UDP_MAX_NUM - FIFO_OTHER_MAX_NUM)
919*4882a593Smuzhiyun */
920*4882a593Smuzhiyun u8 udp_fifo_idx;
921*4882a593Smuzhiyun
922*4882a593Smuzhiyun u8 total_udp_fifos;
923*4882a593Smuzhiyun
924*4882a593Smuzhiyun /*
925*4882a593Smuzhiyun * Beginning index of fifo for all other packets
926*4882a593Smuzhiyun * Value will be equal to (tx_fifo_num - FIFO_OTHER_MAX_NUM)
927*4882a593Smuzhiyun */
928*4882a593Smuzhiyun u8 other_fifo_idx;
929*4882a593Smuzhiyun
930*4882a593Smuzhiyun struct napi_struct napi;
931*4882a593Smuzhiyun /* after blink, the adapter must be restored with original
932*4882a593Smuzhiyun * values.
933*4882a593Smuzhiyun */
934*4882a593Smuzhiyun u64 adapt_ctrl_org;
935*4882a593Smuzhiyun
936*4882a593Smuzhiyun /* Last known link state. */
937*4882a593Smuzhiyun u16 last_link_state;
938*4882a593Smuzhiyun #define LINK_DOWN 1
939*4882a593Smuzhiyun #define LINK_UP 2
940*4882a593Smuzhiyun
941*4882a593Smuzhiyun int task_flag;
942*4882a593Smuzhiyun unsigned long long start_time;
943*4882a593Smuzhiyun int vlan_strip_flag;
944*4882a593Smuzhiyun #define MSIX_FLG 0xA5
945*4882a593Smuzhiyun int num_entries;
946*4882a593Smuzhiyun struct msix_entry *entries;
947*4882a593Smuzhiyun int msi_detected;
948*4882a593Smuzhiyun wait_queue_head_t msi_wait;
949*4882a593Smuzhiyun struct s2io_msix_entry *s2io_entries;
950*4882a593Smuzhiyun char desc[MAX_REQUESTED_MSI_X][25];
951*4882a593Smuzhiyun
952*4882a593Smuzhiyun int avail_msix_vectors; /* No. of MSI-X vectors granted by system */
953*4882a593Smuzhiyun
954*4882a593Smuzhiyun struct msix_info_st msix_info[0x3f];
955*4882a593Smuzhiyun
956*4882a593Smuzhiyun #define XFRAME_I_DEVICE 1
957*4882a593Smuzhiyun #define XFRAME_II_DEVICE 2
958*4882a593Smuzhiyun u8 device_type;
959*4882a593Smuzhiyun
960*4882a593Smuzhiyun unsigned long clubbed_frms_cnt;
961*4882a593Smuzhiyun unsigned long sending_both;
962*4882a593Smuzhiyun u16 lro_max_aggr_per_sess;
963*4882a593Smuzhiyun volatile unsigned long state;
964*4882a593Smuzhiyun u64 general_int_mask;
965*4882a593Smuzhiyun
966*4882a593Smuzhiyun #define VPD_STRING_LEN 80
967*4882a593Smuzhiyun u8 product_name[VPD_STRING_LEN];
968*4882a593Smuzhiyun u8 serial_num[VPD_STRING_LEN];
969*4882a593Smuzhiyun };
970*4882a593Smuzhiyun
971*4882a593Smuzhiyun #define RESET_ERROR 1
972*4882a593Smuzhiyun #define CMD_ERROR 2
973*4882a593Smuzhiyun
974*4882a593Smuzhiyun /*
975*4882a593Smuzhiyun * Some registers have to be written in a particular order to
976*4882a593Smuzhiyun * expect correct hardware operation. The macro SPECIAL_REG_WRITE
977*4882a593Smuzhiyun * is used to perform such ordered writes. Defines UF (Upper First)
978*4882a593Smuzhiyun * and LF (Lower First) will be used to specify the required write order.
979*4882a593Smuzhiyun */
980*4882a593Smuzhiyun #define UF 1
981*4882a593Smuzhiyun #define LF 2
SPECIAL_REG_WRITE(u64 val,void __iomem * addr,int order)982*4882a593Smuzhiyun static inline void SPECIAL_REG_WRITE(u64 val, void __iomem *addr, int order)
983*4882a593Smuzhiyun {
984*4882a593Smuzhiyun if (order == LF) {
985*4882a593Smuzhiyun writel((u32) (val), addr);
986*4882a593Smuzhiyun (void) readl(addr);
987*4882a593Smuzhiyun writel((u32) (val >> 32), (addr + 4));
988*4882a593Smuzhiyun (void) readl(addr + 4);
989*4882a593Smuzhiyun } else {
990*4882a593Smuzhiyun writel((u32) (val >> 32), (addr + 4));
991*4882a593Smuzhiyun (void) readl(addr + 4);
992*4882a593Smuzhiyun writel((u32) (val), addr);
993*4882a593Smuzhiyun (void) readl(addr);
994*4882a593Smuzhiyun }
995*4882a593Smuzhiyun }
996*4882a593Smuzhiyun
997*4882a593Smuzhiyun /* Interrupt related values of Xena */
998*4882a593Smuzhiyun
999*4882a593Smuzhiyun #define ENABLE_INTRS 1
1000*4882a593Smuzhiyun #define DISABLE_INTRS 2
1001*4882a593Smuzhiyun
1002*4882a593Smuzhiyun /* Highest level interrupt blocks */
1003*4882a593Smuzhiyun #define TX_PIC_INTR (0x0001<<0)
1004*4882a593Smuzhiyun #define TX_DMA_INTR (0x0001<<1)
1005*4882a593Smuzhiyun #define TX_MAC_INTR (0x0001<<2)
1006*4882a593Smuzhiyun #define TX_XGXS_INTR (0x0001<<3)
1007*4882a593Smuzhiyun #define TX_TRAFFIC_INTR (0x0001<<4)
1008*4882a593Smuzhiyun #define RX_PIC_INTR (0x0001<<5)
1009*4882a593Smuzhiyun #define RX_DMA_INTR (0x0001<<6)
1010*4882a593Smuzhiyun #define RX_MAC_INTR (0x0001<<7)
1011*4882a593Smuzhiyun #define RX_XGXS_INTR (0x0001<<8)
1012*4882a593Smuzhiyun #define RX_TRAFFIC_INTR (0x0001<<9)
1013*4882a593Smuzhiyun #define MC_INTR (0x0001<<10)
1014*4882a593Smuzhiyun #define ENA_ALL_INTRS ( TX_PIC_INTR | \
1015*4882a593Smuzhiyun TX_DMA_INTR | \
1016*4882a593Smuzhiyun TX_MAC_INTR | \
1017*4882a593Smuzhiyun TX_XGXS_INTR | \
1018*4882a593Smuzhiyun TX_TRAFFIC_INTR | \
1019*4882a593Smuzhiyun RX_PIC_INTR | \
1020*4882a593Smuzhiyun RX_DMA_INTR | \
1021*4882a593Smuzhiyun RX_MAC_INTR | \
1022*4882a593Smuzhiyun RX_XGXS_INTR | \
1023*4882a593Smuzhiyun RX_TRAFFIC_INTR | \
1024*4882a593Smuzhiyun MC_INTR )
1025*4882a593Smuzhiyun
1026*4882a593Smuzhiyun /* Interrupt masks for the general interrupt mask register */
1027*4882a593Smuzhiyun #define DISABLE_ALL_INTRS 0xFFFFFFFFFFFFFFFFULL
1028*4882a593Smuzhiyun
1029*4882a593Smuzhiyun #define TXPIC_INT_M s2BIT(0)
1030*4882a593Smuzhiyun #define TXDMA_INT_M s2BIT(1)
1031*4882a593Smuzhiyun #define TXMAC_INT_M s2BIT(2)
1032*4882a593Smuzhiyun #define TXXGXS_INT_M s2BIT(3)
1033*4882a593Smuzhiyun #define TXTRAFFIC_INT_M s2BIT(8)
1034*4882a593Smuzhiyun #define PIC_RX_INT_M s2BIT(32)
1035*4882a593Smuzhiyun #define RXDMA_INT_M s2BIT(33)
1036*4882a593Smuzhiyun #define RXMAC_INT_M s2BIT(34)
1037*4882a593Smuzhiyun #define MC_INT_M s2BIT(35)
1038*4882a593Smuzhiyun #define RXXGXS_INT_M s2BIT(36)
1039*4882a593Smuzhiyun #define RXTRAFFIC_INT_M s2BIT(40)
1040*4882a593Smuzhiyun
1041*4882a593Smuzhiyun /* PIC level Interrupts TODO*/
1042*4882a593Smuzhiyun
1043*4882a593Smuzhiyun /* DMA level Inressupts */
1044*4882a593Smuzhiyun #define TXDMA_PFC_INT_M s2BIT(0)
1045*4882a593Smuzhiyun #define TXDMA_PCC_INT_M s2BIT(2)
1046*4882a593Smuzhiyun
1047*4882a593Smuzhiyun /* PFC block interrupts */
1048*4882a593Smuzhiyun #define PFC_MISC_ERR_1 s2BIT(0) /* Interrupt to indicate FIFO full */
1049*4882a593Smuzhiyun
1050*4882a593Smuzhiyun /* PCC block interrupts. */
1051*4882a593Smuzhiyun #define PCC_FB_ECC_ERR vBIT(0xff, 16, 8) /* Interrupt to indicate
1052*4882a593Smuzhiyun PCC_FB_ECC Error. */
1053*4882a593Smuzhiyun
1054*4882a593Smuzhiyun #define RXD_GET_VLAN_TAG(Control_2) (u16)(Control_2 & MASK_VLAN_TAG)
1055*4882a593Smuzhiyun /*
1056*4882a593Smuzhiyun * Prototype declaration.
1057*4882a593Smuzhiyun */
1058*4882a593Smuzhiyun static int s2io_init_nic(struct pci_dev *pdev, const struct pci_device_id *pre);
1059*4882a593Smuzhiyun static void s2io_rem_nic(struct pci_dev *pdev);
1060*4882a593Smuzhiyun static int init_shared_mem(struct s2io_nic *sp);
1061*4882a593Smuzhiyun static void free_shared_mem(struct s2io_nic *sp);
1062*4882a593Smuzhiyun static int init_nic(struct s2io_nic *nic);
1063*4882a593Smuzhiyun static int rx_intr_handler(struct ring_info *ring_data, int budget);
1064*4882a593Smuzhiyun static void s2io_txpic_intr_handle(struct s2io_nic *sp);
1065*4882a593Smuzhiyun static void tx_intr_handler(struct fifo_info *fifo_data);
1066*4882a593Smuzhiyun static void s2io_handle_errors(void * dev_id);
1067*4882a593Smuzhiyun
1068*4882a593Smuzhiyun static void s2io_tx_watchdog(struct net_device *dev, unsigned int txqueue);
1069*4882a593Smuzhiyun static void s2io_set_multicast(struct net_device *dev);
1070*4882a593Smuzhiyun static int rx_osm_handler(struct ring_info *ring_data, struct RxD_t * rxdp);
1071*4882a593Smuzhiyun static void s2io_link(struct s2io_nic * sp, int link);
1072*4882a593Smuzhiyun static void s2io_reset(struct s2io_nic * sp);
1073*4882a593Smuzhiyun static int s2io_poll_msix(struct napi_struct *napi, int budget);
1074*4882a593Smuzhiyun static int s2io_poll_inta(struct napi_struct *napi, int budget);
1075*4882a593Smuzhiyun static void s2io_init_pci(struct s2io_nic * sp);
1076*4882a593Smuzhiyun static int do_s2io_prog_unicast(struct net_device *dev, u8 *addr);
1077*4882a593Smuzhiyun static void s2io_alarm_handle(struct timer_list *t);
1078*4882a593Smuzhiyun static irqreturn_t
1079*4882a593Smuzhiyun s2io_msix_ring_handle(int irq, void *dev_id);
1080*4882a593Smuzhiyun static irqreturn_t
1081*4882a593Smuzhiyun s2io_msix_fifo_handle(int irq, void *dev_id);
1082*4882a593Smuzhiyun static irqreturn_t s2io_isr(int irq, void *dev_id);
1083*4882a593Smuzhiyun static int verify_xena_quiescence(struct s2io_nic *sp);
1084*4882a593Smuzhiyun static const struct ethtool_ops netdev_ethtool_ops;
1085*4882a593Smuzhiyun static void s2io_set_link(struct work_struct *work);
1086*4882a593Smuzhiyun static int s2io_set_swapper(struct s2io_nic * sp);
1087*4882a593Smuzhiyun static void s2io_card_down(struct s2io_nic *nic);
1088*4882a593Smuzhiyun static int s2io_card_up(struct s2io_nic *nic);
1089*4882a593Smuzhiyun static int wait_for_cmd_complete(void __iomem *addr, u64 busy_bit,
1090*4882a593Smuzhiyun int bit_state);
1091*4882a593Smuzhiyun static int s2io_add_isr(struct s2io_nic * sp);
1092*4882a593Smuzhiyun static void s2io_rem_isr(struct s2io_nic * sp);
1093*4882a593Smuzhiyun
1094*4882a593Smuzhiyun static void restore_xmsi_data(struct s2io_nic *nic);
1095*4882a593Smuzhiyun static void do_s2io_store_unicast_mc(struct s2io_nic *sp);
1096*4882a593Smuzhiyun static void do_s2io_restore_unicast_mc(struct s2io_nic *sp);
1097*4882a593Smuzhiyun static u64 do_s2io_read_unicast_mc(struct s2io_nic *sp, int offset);
1098*4882a593Smuzhiyun static int do_s2io_add_mc(struct s2io_nic *sp, u8 *addr);
1099*4882a593Smuzhiyun static int do_s2io_add_mac(struct s2io_nic *sp, u64 addr, int offset);
1100*4882a593Smuzhiyun static int do_s2io_delete_unicast_mc(struct s2io_nic *sp, u64 addr);
1101*4882a593Smuzhiyun
1102*4882a593Smuzhiyun static int s2io_club_tcp_session(struct ring_info *ring_data, u8 *buffer,
1103*4882a593Smuzhiyun u8 **tcp, u32 *tcp_len, struct lro **lro, struct RxD_t *rxdp,
1104*4882a593Smuzhiyun struct s2io_nic *sp);
1105*4882a593Smuzhiyun static void clear_lro_session(struct lro *lro);
1106*4882a593Smuzhiyun static void queue_rx_frame(struct sk_buff *skb, u16 vlan_tag);
1107*4882a593Smuzhiyun static void update_L3L4_header(struct s2io_nic *sp, struct lro *lro);
1108*4882a593Smuzhiyun static void lro_append_pkt(struct s2io_nic *sp, struct lro *lro,
1109*4882a593Smuzhiyun struct sk_buff *skb, u32 tcp_len);
1110*4882a593Smuzhiyun static int rts_ds_steer(struct s2io_nic *nic, u8 ds_codepoint, u8 ring);
1111*4882a593Smuzhiyun
1112*4882a593Smuzhiyun static pci_ers_result_t s2io_io_error_detected(struct pci_dev *pdev,
1113*4882a593Smuzhiyun pci_channel_state_t state);
1114*4882a593Smuzhiyun static pci_ers_result_t s2io_io_slot_reset(struct pci_dev *pdev);
1115*4882a593Smuzhiyun static void s2io_io_resume(struct pci_dev *pdev);
1116*4882a593Smuzhiyun
1117*4882a593Smuzhiyun #define s2io_tcp_mss(skb) skb_shinfo(skb)->gso_size
1118*4882a593Smuzhiyun #define s2io_udp_mss(skb) skb_shinfo(skb)->gso_size
1119*4882a593Smuzhiyun #define s2io_offload_type(skb) skb_shinfo(skb)->gso_type
1120*4882a593Smuzhiyun
1121*4882a593Smuzhiyun #define S2IO_PARM_INT(X, def_val) \
1122*4882a593Smuzhiyun static unsigned int X = def_val;\
1123*4882a593Smuzhiyun module_param(X , uint, 0);
1124*4882a593Smuzhiyun
1125*4882a593Smuzhiyun #endif /* _S2IO_H */
1126