diff options
author | Jesse Brandeburg <jesse.brandeburg@intel.com> | 2013-09-11 04:40:01 -0400 |
---|---|---|
committer | Jeff Kirsher <jeffrey.t.kirsher@intel.com> | 2013-09-11 04:58:15 -0400 |
commit | 7daa6bf3294e518cf939830c1a8ec2a6a96204ac (patch) | |
tree | 3937454547416742cae94c8f431ede849848e219 /drivers/net | |
parent | c7d05ca89f8e40d4c80834ef0c097226947d120a (diff) |
i40e: driver core headers
This patch contains the main driver header files, containing
structures and data types specific to the linux driver.
i40e_osdep.h contains some code that helps us adapt our OS agnostic code to
Linux.
Signed-off-by: Jesse Brandeburg <jesse.brandeburg@intel.com>
Signed-off-by: Shannon Nelson <shannon.nelson@intel.com>
CC: PJ Waskiewicz <peter.p.waskiewicz.jr@intel.com>
CC: e1000-devel@lists.sourceforge.net
Tested-by: Kavindya Deegala <kavindya.s.deegala@intel.com>
Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
Diffstat (limited to 'drivers/net')
-rw-r--r-- | drivers/net/ethernet/intel/i40e/i40e.h | 558 | ||||
-rw-r--r-- | drivers/net/ethernet/intel/i40e/i40e_osdep.h | 82 | ||||
-rw-r--r-- | drivers/net/ethernet/intel/i40e/i40e_txrx.h | 259 |
3 files changed, 899 insertions, 0 deletions
diff --git a/drivers/net/ethernet/intel/i40e/i40e.h b/drivers/net/ethernet/intel/i40e/i40e.h new file mode 100644 index 000000000000..b5252eb8a6c7 --- /dev/null +++ b/drivers/net/ethernet/intel/i40e/i40e.h | |||
@@ -0,0 +1,558 @@ | |||
1 | /******************************************************************************* | ||
2 | * | ||
3 | * Intel Ethernet Controller XL710 Family Linux Driver | ||
4 | * Copyright(c) 2013 Intel Corporation. | ||
5 | * | ||
6 | * This program is free software; you can redistribute it and/or modify it | ||
7 | * under the terms and conditions of the GNU General Public License, | ||
8 | * version 2, as published by the Free Software Foundation. | ||
9 | * | ||
10 | * This program is distributed in the hope it will be useful, but WITHOUT | ||
11 | * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | ||
12 | * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for | ||
13 | * more details. | ||
14 | * | ||
15 | * You should have received a copy of the GNU General Public License along with | ||
16 | * this program; if not, write to the Free Software Foundation, Inc., | ||
17 | * 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. | ||
18 | * | ||
19 | * The full GNU General Public License is included in this distribution in | ||
20 | * the file called "COPYING". | ||
21 | * | ||
22 | * Contact Information: | ||
23 | * e1000-devel Mailing List <e1000-devel@lists.sourceforge.net> | ||
24 | * Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497 | ||
25 | * | ||
26 | ******************************************************************************/ | ||
27 | |||
28 | #ifndef _I40E_H_ | ||
29 | #define _I40E_H_ | ||
30 | |||
31 | #include <net/tcp.h> | ||
32 | #include <linux/init.h> | ||
33 | #include <linux/types.h> | ||
34 | #include <linux/errno.h> | ||
35 | #include <linux/module.h> | ||
36 | #include <linux/pci.h> | ||
37 | #include <linux/aer.h> | ||
38 | #include <linux/netdevice.h> | ||
39 | #include <linux/ioport.h> | ||
40 | #include <linux/slab.h> | ||
41 | #include <linux/list.h> | ||
42 | #include <linux/string.h> | ||
43 | #include <linux/in.h> | ||
44 | #include <linux/ip.h> | ||
45 | #include <linux/tcp.h> | ||
46 | #include <linux/sctp.h> | ||
47 | #include <linux/pkt_sched.h> | ||
48 | #include <linux/ipv6.h> | ||
49 | #include <linux/version.h> | ||
50 | #include <net/checksum.h> | ||
51 | #include <net/ip6_checksum.h> | ||
52 | #include <linux/ethtool.h> | ||
53 | #include <linux/if_vlan.h> | ||
54 | #include "i40e_type.h" | ||
55 | #include "i40e_prototype.h" | ||
56 | #include "i40e_virtchnl.h" | ||
57 | #include "i40e_virtchnl_pf.h" | ||
58 | #include "i40e_txrx.h" | ||
59 | |||
60 | /* Useful i40e defaults */ | ||
61 | #define I40E_BASE_PF_SEID 16 | ||
62 | #define I40E_BASE_VSI_SEID 512 | ||
63 | #define I40E_BASE_VEB_SEID 288 | ||
64 | #define I40E_MAX_VEB 16 | ||
65 | |||
66 | #define I40E_MAX_NUM_DESCRIPTORS 4096 | ||
67 | #define I40E_MAX_REGISTER 0x0038FFFF | ||
68 | #define I40E_DEFAULT_NUM_DESCRIPTORS 512 | ||
69 | #define I40E_REQ_DESCRIPTOR_MULTIPLE 32 | ||
70 | #define I40E_MIN_NUM_DESCRIPTORS 64 | ||
71 | #define I40E_MIN_MSIX 2 | ||
72 | #define I40E_DEFAULT_NUM_VMDQ_VSI 8 /* max 256 VSIs */ | ||
73 | #define I40E_DEFAULT_QUEUES_PER_VMDQ 2 /* max 16 qps */ | ||
74 | #define I40E_DEFAULT_QUEUES_PER_VF 4 | ||
75 | #define I40E_DEFAULT_QUEUES_PER_TC 1 /* should be a power of 2 */ | ||
76 | #define I40E_FDIR_RING 0 | ||
77 | #define I40E_FDIR_RING_COUNT 32 | ||
78 | #define I40E_MAX_AQ_BUF_SIZE 4096 | ||
79 | #define I40E_AQ_LEN 32 | ||
80 | #define I40E_AQ_WORK_LIMIT 16 | ||
81 | #define I40E_MAX_USER_PRIORITY 8 | ||
82 | #define I40E_DEFAULT_MSG_ENABLE 4 | ||
83 | |||
84 | #define I40E_NVM_VERSION_LO_SHIFT 0 | ||
85 | #define I40E_NVM_VERSION_LO_MASK (0xf << I40E_NVM_VERSION_LO_SHIFT) | ||
86 | #define I40E_NVM_VERSION_MID_SHIFT 4 | ||
87 | #define I40E_NVM_VERSION_MID_MASK (0xff << I40E_NVM_VERSION_MID_SHIFT) | ||
88 | #define I40E_NVM_VERSION_HI_SHIFT 12 | ||
89 | #define I40E_NVM_VERSION_HI_MASK (0xf << I40E_NVM_VERSION_HI_SHIFT) | ||
90 | |||
91 | /* magic for getting defines into strings */ | ||
92 | #define STRINGIFY(foo) #foo | ||
93 | #define XSTRINGIFY(bar) STRINGIFY(bar) | ||
94 | |||
95 | #ifndef ARCH_HAS_PREFETCH | ||
96 | #define prefetch(X) | ||
97 | #endif | ||
98 | |||
99 | #define I40E_RX_DESC(R, i) \ | ||
100 | ((ring_is_16byte_desc_enabled(R)) \ | ||
101 | ? (union i40e_32byte_rx_desc *) \ | ||
102 | (&(((union i40e_16byte_rx_desc *)((R)->desc))[i])) \ | ||
103 | : (&(((union i40e_32byte_rx_desc *)((R)->desc))[i]))) | ||
104 | #define I40E_TX_DESC(R, i) \ | ||
105 | (&(((struct i40e_tx_desc *)((R)->desc))[i])) | ||
106 | #define I40E_TX_CTXTDESC(R, i) \ | ||
107 | (&(((struct i40e_tx_context_desc *)((R)->desc))[i])) | ||
108 | #define I40E_TX_FDIRDESC(R, i) \ | ||
109 | (&(((struct i40e_filter_program_desc *)((R)->desc))[i])) | ||
110 | |||
111 | /* default to trying for four seconds */ | ||
112 | #define I40E_TRY_LINK_TIMEOUT (4 * HZ) | ||
113 | |||
114 | /* driver state flags */ | ||
115 | enum i40e_state_t { | ||
116 | __I40E_TESTING, | ||
117 | __I40E_CONFIG_BUSY, | ||
118 | __I40E_CONFIG_DONE, | ||
119 | __I40E_DOWN, | ||
120 | __I40E_NEEDS_RESTART, | ||
121 | __I40E_SERVICE_SCHED, | ||
122 | __I40E_ADMINQ_EVENT_PENDING, | ||
123 | __I40E_MDD_EVENT_PENDING, | ||
124 | __I40E_VFLR_EVENT_PENDING, | ||
125 | __I40E_RESET_RECOVERY_PENDING, | ||
126 | __I40E_RESET_INTR_RECEIVED, | ||
127 | __I40E_REINIT_REQUESTED, | ||
128 | __I40E_PF_RESET_REQUESTED, | ||
129 | __I40E_CORE_RESET_REQUESTED, | ||
130 | __I40E_GLOBAL_RESET_REQUESTED, | ||
131 | __I40E_FILTER_OVERFLOW_PROMISC, | ||
132 | }; | ||
133 | |||
134 | enum i40e_interrupt_policy { | ||
135 | I40E_INTERRUPT_BEST_CASE, | ||
136 | I40E_INTERRUPT_MEDIUM, | ||
137 | I40E_INTERRUPT_LOWEST | ||
138 | }; | ||
139 | |||
140 | struct i40e_lump_tracking { | ||
141 | u16 num_entries; | ||
142 | u16 search_hint; | ||
143 | u16 list[0]; | ||
144 | #define I40E_PILE_VALID_BIT 0x8000 | ||
145 | }; | ||
146 | |||
147 | #define I40E_DEFAULT_ATR_SAMPLE_RATE 20 | ||
148 | #define I40E_FDIR_MAX_RAW_PACKET_LOOKUP 512 | ||
149 | struct i40e_fdir_data { | ||
150 | u16 q_index; | ||
151 | u8 flex_off; | ||
152 | u8 pctype; | ||
153 | u16 dest_vsi; | ||
154 | u8 dest_ctl; | ||
155 | u8 fd_status; | ||
156 | u16 cnt_index; | ||
157 | u32 fd_id; | ||
158 | u8 *raw_packet; | ||
159 | }; | ||
160 | |||
161 | #define I40E_DCB_PRIO_TYPE_STRICT 0 | ||
162 | #define I40E_DCB_PRIO_TYPE_ETS 1 | ||
163 | #define I40E_DCB_STRICT_PRIO_CREDITS 127 | ||
164 | #define I40E_MAX_USER_PRIORITY 8 | ||
165 | /* DCB per TC information data structure */ | ||
166 | struct i40e_tc_info { | ||
167 | u16 qoffset; /* Queue offset from base queue */ | ||
168 | u16 qcount; /* Total Queues */ | ||
169 | u8 netdev_tc; /* Netdev TC index if netdev associated */ | ||
170 | }; | ||
171 | |||
172 | /* TC configuration data structure */ | ||
173 | struct i40e_tc_configuration { | ||
174 | u8 numtc; /* Total number of enabled TCs */ | ||
175 | u8 enabled_tc; /* TC map */ | ||
176 | struct i40e_tc_info tc_info[I40E_MAX_TRAFFIC_CLASS]; | ||
177 | }; | ||
178 | |||
179 | /* struct that defines the Ethernet device */ | ||
180 | struct i40e_pf { | ||
181 | struct pci_dev *pdev; | ||
182 | struct i40e_hw hw; | ||
183 | unsigned long state; | ||
184 | unsigned long link_check_timeout; | ||
185 | struct msix_entry *msix_entries; | ||
186 | u16 num_msix_entries; | ||
187 | bool fc_autoneg_status; | ||
188 | |||
189 | u16 eeprom_version; | ||
190 | u16 num_vmdq_vsis; /* num vmdq pools this pf has set up */ | ||
191 | u16 num_vmdq_qps; /* num queue pairs per vmdq pool */ | ||
192 | u16 num_vmdq_msix; /* num queue vectors per vmdq pool */ | ||
193 | u16 num_req_vfs; /* num vfs requested for this vf */ | ||
194 | u16 num_vf_qps; /* num queue pairs per vf */ | ||
195 | u16 num_tc_qps; /* num queue pairs per TC */ | ||
196 | u16 num_lan_qps; /* num lan queues this pf has set up */ | ||
197 | u16 num_lan_msix; /* num queue vectors for the base pf vsi */ | ||
198 | u16 rss_size; /* num queues in the RSS array */ | ||
199 | u16 rss_size_max; /* HW defined max RSS queues */ | ||
200 | u16 fdir_pf_filter_count; /* num of guaranteed filters for this PF */ | ||
201 | u8 atr_sample_rate; | ||
202 | |||
203 | enum i40e_interrupt_policy int_policy; | ||
204 | u16 rx_itr_default; | ||
205 | u16 tx_itr_default; | ||
206 | u16 msg_enable; | ||
207 | char misc_int_name[IFNAMSIZ + 9]; | ||
208 | u16 adminq_work_limit; /* num of admin receive queue desc to process */ | ||
209 | int service_timer_period; | ||
210 | struct timer_list service_timer; | ||
211 | struct work_struct service_task; | ||
212 | |||
213 | u64 flags; | ||
214 | #define I40E_FLAG_RX_CSUM_ENABLED (u64)(1 << 1) | ||
215 | #define I40E_FLAG_MSI_ENABLED (u64)(1 << 2) | ||
216 | #define I40E_FLAG_MSIX_ENABLED (u64)(1 << 3) | ||
217 | #define I40E_FLAG_RX_1BUF_ENABLED (u64)(1 << 4) | ||
218 | #define I40E_FLAG_RX_PS_ENABLED (u64)(1 << 5) | ||
219 | #define I40E_FLAG_RSS_ENABLED (u64)(1 << 6) | ||
220 | #define I40E_FLAG_MQ_ENABLED (u64)(1 << 7) | ||
221 | #define I40E_FLAG_VMDQ_ENABLED (u64)(1 << 8) | ||
222 | #define I40E_FLAG_FDIR_REQUIRES_REINIT (u64)(1 << 9) | ||
223 | #define I40E_FLAG_NEED_LINK_UPDATE (u64)(1 << 10) | ||
224 | #define I40E_FLAG_IN_NETPOLL (u64)(1 << 13) | ||
225 | #define I40E_FLAG_16BYTE_RX_DESC_ENABLED (u64)(1 << 14) | ||
226 | #define I40E_FLAG_CLEAN_ADMINQ (u64)(1 << 15) | ||
227 | #define I40E_FLAG_FILTER_SYNC (u64)(1 << 16) | ||
228 | #define I40E_FLAG_PROCESS_MDD_EVENT (u64)(1 << 18) | ||
229 | #define I40E_FLAG_PROCESS_VFLR_EVENT (u64)(1 << 19) | ||
230 | #define I40E_FLAG_SRIOV_ENABLED (u64)(1 << 20) | ||
231 | #define I40E_FLAG_DCB_ENABLED (u64)(1 << 21) | ||
232 | #define I40E_FLAG_FDIR_ENABLED (u64)(1 << 22) | ||
233 | #define I40E_FLAG_FDIR_ATR_ENABLED (u64)(1 << 23) | ||
234 | #define I40E_FLAG_MFP_ENABLED (u64)(1 << 27) | ||
235 | |||
236 | u16 num_tx_queues; | ||
237 | u16 num_rx_queues; | ||
238 | |||
239 | bool stat_offsets_loaded; | ||
240 | struct i40e_hw_port_stats stats; | ||
241 | struct i40e_hw_port_stats stats_offsets; | ||
242 | u32 tx_timeout_count; | ||
243 | u32 tx_timeout_recovery_level; | ||
244 | unsigned long tx_timeout_last_recovery; | ||
245 | u32 hw_csum_rx_error; | ||
246 | u32 led_status; | ||
247 | u16 corer_count; /* Core reset count */ | ||
248 | u16 globr_count; /* Global reset count */ | ||
249 | u16 empr_count; /* EMP reset count */ | ||
250 | u16 pfr_count; /* PF reset count */ | ||
251 | |||
252 | struct mutex switch_mutex; | ||
253 | u16 lan_vsi; /* our default LAN VSI */ | ||
254 | u16 lan_veb; /* initial relay, if exists */ | ||
255 | #define I40E_NO_VEB 0xffff | ||
256 | #define I40E_NO_VSI 0xffff | ||
257 | u16 next_vsi; /* Next unallocated VSI - 0-based! */ | ||
258 | struct i40e_vsi **vsi; | ||
259 | struct i40e_veb *veb[I40E_MAX_VEB]; | ||
260 | |||
261 | struct i40e_lump_tracking *qp_pile; | ||
262 | struct i40e_lump_tracking *irq_pile; | ||
263 | |||
264 | /* switch config info */ | ||
265 | u16 pf_seid; | ||
266 | u16 main_vsi_seid; | ||
267 | u16 mac_seid; | ||
268 | struct i40e_aqc_get_switch_config_data *sw_config; | ||
269 | struct kobject *switch_kobj; | ||
270 | #ifdef CONFIG_DEBUG_FS | ||
271 | struct dentry *i40e_dbg_pf; | ||
272 | #endif /* CONFIG_DEBUG_FS */ | ||
273 | |||
274 | /* sr-iov config info */ | ||
275 | struct i40e_vf *vf; | ||
276 | int num_alloc_vfs; /* actual number of VFs allocated */ | ||
277 | u32 vf_aq_requests; | ||
278 | |||
279 | /* DCBx/DCBNL capability for PF that indicates | ||
280 | * whether DCBx is managed by firmware or host | ||
281 | * based agent (LLDPAD). Also, indicates what | ||
282 | * flavor of DCBx protocol (IEEE/CEE) is supported | ||
283 | * by the device. For now we're supporting IEEE | ||
284 | * mode only. | ||
285 | */ | ||
286 | u16 dcbx_cap; | ||
287 | |||
288 | u32 fcoe_hmc_filt_num; | ||
289 | u32 fcoe_hmc_cntx_num; | ||
290 | struct i40e_filter_control_settings filter_settings; | ||
291 | }; | ||
292 | |||
293 | struct i40e_mac_filter { | ||
294 | struct list_head list; | ||
295 | u8 macaddr[ETH_ALEN]; | ||
296 | #define I40E_VLAN_ANY -1 | ||
297 | s16 vlan; | ||
298 | u8 counter; /* number of instances of this filter */ | ||
299 | bool is_vf; /* filter belongs to a VF */ | ||
300 | bool is_netdev; /* filter belongs to a netdev */ | ||
301 | bool changed; /* filter needs to be sync'd to the HW */ | ||
302 | }; | ||
303 | |||
304 | struct i40e_veb { | ||
305 | struct i40e_pf *pf; | ||
306 | u16 idx; | ||
307 | u16 veb_idx; /* index of VEB parent */ | ||
308 | u16 seid; | ||
309 | u16 uplink_seid; | ||
310 | u16 stats_idx; /* index of VEB parent */ | ||
311 | u8 enabled_tc; | ||
312 | u16 flags; | ||
313 | u16 bw_limit; | ||
314 | u8 bw_max_quanta; | ||
315 | bool is_abs_credits; | ||
316 | u8 bw_tc_share_credits[I40E_MAX_TRAFFIC_CLASS]; | ||
317 | u16 bw_tc_limit_credits[I40E_MAX_TRAFFIC_CLASS]; | ||
318 | u8 bw_tc_max_quanta[I40E_MAX_TRAFFIC_CLASS]; | ||
319 | struct kobject *kobj; | ||
320 | bool stat_offsets_loaded; | ||
321 | struct i40e_eth_stats stats; | ||
322 | struct i40e_eth_stats stats_offsets; | ||
323 | }; | ||
324 | |||
325 | /* struct that defines a VSI, associated with a dev */ | ||
326 | struct i40e_vsi { | ||
327 | struct net_device *netdev; | ||
328 | unsigned long active_vlans[BITS_TO_LONGS(VLAN_N_VID)]; | ||
329 | bool netdev_registered; | ||
330 | bool stat_offsets_loaded; | ||
331 | |||
332 | u32 current_netdev_flags; | ||
333 | unsigned long state; | ||
334 | #define I40E_VSI_FLAG_FILTER_CHANGED (1<<0) | ||
335 | #define I40E_VSI_FLAG_VEB_OWNER (1<<1) | ||
336 | unsigned long flags; | ||
337 | |||
338 | struct list_head mac_filter_list; | ||
339 | |||
340 | /* VSI stats */ | ||
341 | struct rtnl_link_stats64 net_stats; | ||
342 | struct rtnl_link_stats64 net_stats_offsets; | ||
343 | struct i40e_eth_stats eth_stats; | ||
344 | struct i40e_eth_stats eth_stats_offsets; | ||
345 | u32 tx_restart; | ||
346 | u32 tx_busy; | ||
347 | u32 rx_buf_failed; | ||
348 | u32 rx_page_failed; | ||
349 | |||
350 | /* These are arrays of rings, allocated at run-time */ | ||
351 | struct i40e_ring *rx_rings; | ||
352 | struct i40e_ring *tx_rings; | ||
353 | |||
354 | u16 work_limit; | ||
355 | /* high bit set means dynamic, use accessor routines to read/write. | ||
356 | * hardware only supports 2us resolution for the ITR registers. | ||
357 | * these values always store the USER setting, and must be converted | ||
358 | * before programming to a register. | ||
359 | */ | ||
360 | u16 rx_itr_setting; | ||
361 | u16 tx_itr_setting; | ||
362 | |||
363 | u16 max_frame; | ||
364 | u16 rx_hdr_len; | ||
365 | u16 rx_buf_len; | ||
366 | u8 dtype; | ||
367 | |||
368 | /* List of q_vectors allocated to this VSI */ | ||
369 | struct i40e_q_vector *q_vectors; | ||
370 | int num_q_vectors; | ||
371 | int base_vector; | ||
372 | |||
373 | u16 seid; /* HW index of this VSI (absolute index) */ | ||
374 | u16 id; /* VSI number */ | ||
375 | u16 uplink_seid; | ||
376 | |||
377 | u16 base_queue; /* vsi's first queue in hw array */ | ||
378 | u16 alloc_queue_pairs; /* Allocated Tx/Rx queues */ | ||
379 | u16 num_queue_pairs; /* Used tx and rx pairs */ | ||
380 | u16 num_desc; | ||
381 | enum i40e_vsi_type type; /* VSI type, e.g., LAN, FCoE, etc */ | ||
382 | u16 vf_id; /* Virtual function ID for SRIOV VSIs */ | ||
383 | |||
384 | struct i40e_tc_configuration tc_config; | ||
385 | struct i40e_aqc_vsi_properties_data info; | ||
386 | |||
387 | /* VSI BW limit (absolute across all TCs) */ | ||
388 | u16 bw_limit; /* VSI BW Limit (0 = disabled) */ | ||
389 | u8 bw_max_quanta; /* Max Quanta when BW limit is enabled */ | ||
390 | |||
391 | /* Relative TC credits across VSIs */ | ||
392 | u8 bw_ets_share_credits[I40E_MAX_TRAFFIC_CLASS]; | ||
393 | /* TC BW limit credits within VSI */ | ||
394 | u16 bw_ets_limit_credits[I40E_MAX_TRAFFIC_CLASS]; | ||
395 | /* TC BW limit max quanta within VSI */ | ||
396 | u8 bw_ets_max_quanta[I40E_MAX_TRAFFIC_CLASS]; | ||
397 | |||
398 | struct i40e_pf *back; /* Backreference to associated PF */ | ||
399 | u16 idx; /* index in pf->vsi[] */ | ||
400 | u16 veb_idx; /* index of VEB parent */ | ||
401 | struct kobject *kobj; /* sysfs object */ | ||
402 | |||
403 | /* VSI specific handlers */ | ||
404 | irqreturn_t (*irq_handler)(int irq, void *data); | ||
405 | } ____cacheline_internodealigned_in_smp; | ||
406 | |||
407 | struct i40e_netdev_priv { | ||
408 | struct i40e_vsi *vsi; | ||
409 | }; | ||
410 | |||
411 | /* struct that defines an interrupt vector */ | ||
412 | struct i40e_q_vector { | ||
413 | struct i40e_vsi *vsi; | ||
414 | |||
415 | u16 v_idx; /* index in the vsi->q_vector array. */ | ||
416 | u16 reg_idx; /* register index of the interrupt */ | ||
417 | |||
418 | struct napi_struct napi; | ||
419 | |||
420 | struct i40e_ring_container rx; | ||
421 | struct i40e_ring_container tx; | ||
422 | |||
423 | u8 num_ringpairs; /* total number of ring pairs in vector */ | ||
424 | |||
425 | char name[IFNAMSIZ + 9]; | ||
426 | cpumask_t affinity_mask; | ||
427 | } ____cacheline_internodealigned_in_smp; | ||
428 | |||
429 | /* lan device */ | ||
430 | struct i40e_device { | ||
431 | struct list_head list; | ||
432 | struct i40e_pf *pf; | ||
433 | }; | ||
434 | |||
435 | /** | ||
436 | * i40e_fw_version_str - format the FW and NVM version strings | ||
437 | * @hw: ptr to the hardware info | ||
438 | **/ | ||
439 | static inline char *i40e_fw_version_str(struct i40e_hw *hw) | ||
440 | { | ||
441 | static char buf[32]; | ||
442 | |||
443 | snprintf(buf, sizeof(buf), | ||
444 | "f%d.%d a%d.%d n%02d.%02d.%02d e%08x", | ||
445 | hw->aq.fw_maj_ver, hw->aq.fw_min_ver, | ||
446 | hw->aq.api_maj_ver, hw->aq.api_min_ver, | ||
447 | (hw->nvm.version & I40E_NVM_VERSION_HI_MASK) | ||
448 | >> I40E_NVM_VERSION_HI_SHIFT, | ||
449 | (hw->nvm.version & I40E_NVM_VERSION_MID_MASK) | ||
450 | >> I40E_NVM_VERSION_MID_SHIFT, | ||
451 | (hw->nvm.version & I40E_NVM_VERSION_LO_MASK) | ||
452 | >> I40E_NVM_VERSION_LO_SHIFT, | ||
453 | hw->nvm.eetrack); | ||
454 | |||
455 | return buf; | ||
456 | } | ||
457 | |||
458 | /** | ||
459 | * i40e_netdev_to_pf: Retrieve the PF struct for given netdev | ||
460 | * @netdev: the corresponding netdev | ||
461 | * | ||
462 | * Return the PF struct for the given netdev | ||
463 | **/ | ||
464 | static inline struct i40e_pf *i40e_netdev_to_pf(struct net_device *netdev) | ||
465 | { | ||
466 | struct i40e_netdev_priv *np = netdev_priv(netdev); | ||
467 | struct i40e_vsi *vsi = np->vsi; | ||
468 | |||
469 | return vsi->back; | ||
470 | } | ||
471 | |||
472 | static inline void i40e_vsi_setup_irqhandler(struct i40e_vsi *vsi, | ||
473 | irqreturn_t (*irq_handler)(int, void *)) | ||
474 | { | ||
475 | vsi->irq_handler = irq_handler; | ||
476 | } | ||
477 | |||
478 | /** | ||
479 | * i40e_rx_is_programming_status - check for programming status descriptor | ||
480 | * @qw: the first quad word of the program status descriptor | ||
481 | * | ||
482 | * The value of in the descriptor length field indicate if this | ||
483 | * is a programming status descriptor for flow director or FCoE | ||
484 | * by the value of I40E_RX_PROG_STATUS_DESC_LENGTH, otherwise | ||
485 | * it is a packet descriptor. | ||
486 | **/ | ||
487 | static inline bool i40e_rx_is_programming_status(u64 qw) | ||
488 | { | ||
489 | return I40E_RX_PROG_STATUS_DESC_LENGTH == | ||
490 | (qw >> I40E_RX_PROG_STATUS_DESC_LENGTH_SHIFT); | ||
491 | } | ||
492 | |||
493 | /* needed by i40e_ethtool.c */ | ||
494 | int i40e_up(struct i40e_vsi *vsi); | ||
495 | void i40e_down(struct i40e_vsi *vsi); | ||
496 | extern const char i40e_driver_name[]; | ||
497 | extern const char i40e_driver_version_str[]; | ||
498 | void i40e_do_reset(struct i40e_pf *pf, u32 reset_flags); | ||
499 | void i40e_update_stats(struct i40e_vsi *vsi); | ||
500 | void i40e_update_eth_stats(struct i40e_vsi *vsi); | ||
501 | struct rtnl_link_stats64 *i40e_get_vsi_stats_struct(struct i40e_vsi *vsi); | ||
502 | int i40e_fetch_switch_configuration(struct i40e_pf *pf, | ||
503 | bool printconfig); | ||
504 | |||
505 | /* needed by i40e_main.c */ | ||
506 | void i40e_add_fdir_filter(struct i40e_fdir_data fdir_data, | ||
507 | struct i40e_ring *tx_ring); | ||
508 | void i40e_add_remove_filter(struct i40e_fdir_data fdir_data, | ||
509 | struct i40e_ring *tx_ring); | ||
510 | void i40e_update_fdir_filter(struct i40e_fdir_data fdir_data, | ||
511 | struct i40e_ring *tx_ring); | ||
512 | int i40e_program_fdir_filter(struct i40e_fdir_data *fdir_data, | ||
513 | struct i40e_pf *pf, bool add); | ||
514 | |||
515 | void i40e_set_ethtool_ops(struct net_device *netdev); | ||
516 | struct i40e_mac_filter *i40e_add_filter(struct i40e_vsi *vsi, | ||
517 | u8 *macaddr, s16 vlan, | ||
518 | bool is_vf, bool is_netdev); | ||
519 | void i40e_del_filter(struct i40e_vsi *vsi, u8 *macaddr, s16 vlan, | ||
520 | bool is_vf, bool is_netdev); | ||
521 | int i40e_sync_vsi_filters(struct i40e_vsi *vsi); | ||
522 | struct i40e_vsi *i40e_vsi_setup(struct i40e_pf *pf, u8 type, | ||
523 | u16 uplink, u32 param1); | ||
524 | int i40e_vsi_release(struct i40e_vsi *vsi); | ||
525 | struct i40e_vsi *i40e_vsi_lookup(struct i40e_pf *pf, enum i40e_vsi_type type, | ||
526 | struct i40e_vsi *start_vsi); | ||
527 | struct i40e_veb *i40e_veb_setup(struct i40e_pf *pf, u16 flags, u16 uplink_seid, | ||
528 | u16 downlink_seid, u8 enabled_tc); | ||
529 | void i40e_veb_release(struct i40e_veb *veb); | ||
530 | |||
531 | i40e_status i40e_vsi_add_pvid(struct i40e_vsi *vsi, u16 vid); | ||
532 | void i40e_vsi_remove_pvid(struct i40e_vsi *vsi); | ||
533 | void i40e_vsi_reset_stats(struct i40e_vsi *vsi); | ||
534 | void i40e_pf_reset_stats(struct i40e_pf *pf); | ||
535 | #ifdef CONFIG_DEBUG_FS | ||
536 | void i40e_dbg_pf_init(struct i40e_pf *pf); | ||
537 | void i40e_dbg_pf_exit(struct i40e_pf *pf); | ||
538 | void i40e_dbg_init(void); | ||
539 | void i40e_dbg_exit(void); | ||
540 | #else | ||
541 | static inline void i40e_dbg_pf_init(struct i40e_pf *pf) {} | ||
542 | static inline void i40e_dbg_pf_exit(struct i40e_pf *pf) {} | ||
543 | static inline void i40e_dbg_init(void) {} | ||
544 | static inline void i40e_dbg_exit(void) {} | ||
545 | #endif /* CONFIG_DEBUG_FS*/ | ||
546 | void i40e_irq_dynamic_enable(struct i40e_vsi *vsi, int vector); | ||
547 | int i40e_ioctl(struct net_device *netdev, struct ifreq *ifr, int cmd); | ||
548 | void i40e_vlan_stripping_disable(struct i40e_vsi *vsi); | ||
549 | int i40e_vsi_add_vlan(struct i40e_vsi *vsi, s16 vid); | ||
550 | int i40e_vsi_kill_vlan(struct i40e_vsi *vsi, s16 vid); | ||
551 | struct i40e_mac_filter *i40e_put_mac_in_vlan(struct i40e_vsi *vsi, u8 *macaddr, | ||
552 | bool is_vf, bool is_netdev); | ||
553 | bool i40e_is_vsi_in_vlan(struct i40e_vsi *vsi); | ||
554 | struct i40e_mac_filter *i40e_find_mac(struct i40e_vsi *vsi, u8 *macaddr, | ||
555 | bool is_vf, bool is_netdev); | ||
556 | void i40e_vlan_stripping_enable(struct i40e_vsi *vsi); | ||
557 | |||
558 | #endif /* _I40E_H_ */ | ||
diff --git a/drivers/net/ethernet/intel/i40e/i40e_osdep.h b/drivers/net/ethernet/intel/i40e/i40e_osdep.h new file mode 100644 index 000000000000..702c81ba86e3 --- /dev/null +++ b/drivers/net/ethernet/intel/i40e/i40e_osdep.h | |||
@@ -0,0 +1,82 @@ | |||
1 | /******************************************************************************* | ||
2 | * | ||
3 | * Intel Ethernet Controller XL710 Family Linux Driver | ||
4 | * Copyright(c) 2013 Intel Corporation. | ||
5 | * | ||
6 | * This program is free software; you can redistribute it and/or modify it | ||
7 | * under the terms and conditions of the GNU General Public License, | ||
8 | * version 2, as published by the Free Software Foundation. | ||
9 | * | ||
10 | * This program is distributed in the hope it will be useful, but WITHOUT | ||
11 | * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | ||
12 | * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for | ||
13 | * more details. | ||
14 | * | ||
15 | * You should have received a copy of the GNU General Public License along with | ||
16 | * this program; if not, write to the Free Software Foundation, Inc., | ||
17 | * 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. | ||
18 | * | ||
19 | * The full GNU General Public License is included in this distribution in | ||
20 | * the file called "COPYING". | ||
21 | * | ||
22 | * Contact Information: | ||
23 | * e1000-devel Mailing List <e1000-devel@lists.sourceforge.net> | ||
24 | * Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497 | ||
25 | * | ||
26 | ******************************************************************************/ | ||
27 | |||
28 | #ifndef _I40E_OSDEP_H_ | ||
29 | #define _I40E_OSDEP_H_ | ||
30 | |||
31 | #include <linux/types.h> | ||
32 | #include <linux/if_ether.h> | ||
33 | #include <linux/if_vlan.h> | ||
34 | #include <linux/tcp.h> | ||
35 | #include <linux/pci.h> | ||
36 | #include <linux/highuid.h> | ||
37 | |||
38 | /* get readq/writeq support for 32 bit kernels, use the low-first version */ | ||
39 | #include <asm-generic/io-64-nonatomic-lo-hi.h> | ||
40 | |||
41 | /* File to be the magic between shared code and | ||
42 | * actual OS primitives | ||
43 | */ | ||
44 | |||
45 | #define hw_dbg(hw, S, A...) do {} while (0) | ||
46 | |||
47 | #define wr32(a, reg, value) writel((value), ((a)->hw_addr + (reg))) | ||
48 | #define rd32(a, reg) readl((a)->hw_addr + (reg)) | ||
49 | |||
50 | #define wr64(a, reg, value) writeq((value), ((a)->hw_addr + (reg))) | ||
51 | #define rd64(a, reg) readq((a)->hw_addr + (reg)) | ||
52 | #define i40e_flush(a) readl((a)->hw_addr + I40E_GLGEN_STAT) | ||
53 | |||
54 | /* memory allocation tracking */ | ||
55 | struct i40e_dma_mem { | ||
56 | void *va; | ||
57 | dma_addr_t pa; | ||
58 | u32 size; | ||
59 | } __packed; | ||
60 | |||
61 | #define i40e_allocate_dma_mem(h, m, unused, s, a) \ | ||
62 | i40e_allocate_dma_mem_d(h, m, s, a) | ||
63 | #define i40e_free_dma_mem(h, m) i40e_free_dma_mem_d(h, m) | ||
64 | |||
65 | struct i40e_virt_mem { | ||
66 | void *va; | ||
67 | u32 size; | ||
68 | } __packed; | ||
69 | |||
70 | #define i40e_allocate_virt_mem(h, m, s) i40e_allocate_virt_mem_d(h, m, s) | ||
71 | #define i40e_free_virt_mem(h, m) i40e_free_virt_mem_d(h, m) | ||
72 | |||
73 | #define i40e_debug(h, m, s, ...) \ | ||
74 | do { \ | ||
75 | if (((m) & (h)->debug_mask)) \ | ||
76 | pr_info("i40e %02x.%x " s, \ | ||
77 | (h)->bus.device, (h)->bus.func, \ | ||
78 | ##__VA_ARGS__); \ | ||
79 | } while (0) | ||
80 | |||
81 | typedef enum i40e_status_code i40e_status; | ||
82 | #endif /* _I40E_OSDEP_H_ */ | ||
diff --git a/drivers/net/ethernet/intel/i40e/i40e_txrx.h b/drivers/net/ethernet/intel/i40e/i40e_txrx.h new file mode 100644 index 000000000000..b1d7722d98a7 --- /dev/null +++ b/drivers/net/ethernet/intel/i40e/i40e_txrx.h | |||
@@ -0,0 +1,259 @@ | |||
1 | /******************************************************************************* | ||
2 | * | ||
3 | * Intel Ethernet Controller XL710 Family Linux Driver | ||
4 | * Copyright(c) 2013 Intel Corporation. | ||
5 | * | ||
6 | * This program is free software; you can redistribute it and/or modify it | ||
7 | * under the terms and conditions of the GNU General Public License, | ||
8 | * version 2, as published by the Free Software Foundation. | ||
9 | * | ||
10 | * This program is distributed in the hope it will be useful, but WITHOUT | ||
11 | * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | ||
12 | * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for | ||
13 | * more details. | ||
14 | * | ||
15 | * You should have received a copy of the GNU General Public License along with | ||
16 | * this program; if not, write to the Free Software Foundation, Inc., | ||
17 | * 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. | ||
18 | * | ||
19 | * The full GNU General Public License is included in this distribution in | ||
20 | * the file called "COPYING". | ||
21 | * | ||
22 | * Contact Information: | ||
23 | * e1000-devel Mailing List <e1000-devel@lists.sourceforge.net> | ||
24 | * Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497 | ||
25 | * | ||
26 | ******************************************************************************/ | ||
27 | |||
28 | /* Interrupt Throttling and Rate Limiting (storm control) Goodies */ | ||
29 | |||
30 | #define I40E_MAX_ITR 0x07FF | ||
31 | #define I40E_MIN_ITR 0x0001 | ||
32 | #define I40E_ITR_USEC_RESOLUTION 2 | ||
33 | #define I40E_MAX_IRATE 0x03F | ||
34 | #define I40E_MIN_IRATE 0x001 | ||
35 | #define I40E_IRATE_USEC_RESOLUTION 4 | ||
36 | #define I40E_ITR_100K 0x0005 | ||
37 | #define I40E_ITR_20K 0x0019 | ||
38 | #define I40E_ITR_8K 0x003E | ||
39 | #define I40E_ITR_4K 0x007A | ||
40 | #define I40E_ITR_RX_DEF I40E_ITR_8K | ||
41 | #define I40E_ITR_TX_DEF I40E_ITR_4K | ||
42 | #define I40E_ITR_DYNAMIC 0x8000 /* use top bit as a flag */ | ||
43 | #define I40E_MIN_INT_RATE 250 /* ~= 1000000 / (I40E_MAX_ITR * 2) */ | ||
44 | #define I40E_MAX_INT_RATE 500000 /* == 1000000 / (I40E_MIN_ITR * 2) */ | ||
45 | #define I40E_DEFAULT_IRQ_WORK 256 | ||
46 | #define ITR_TO_REG(setting) ((setting & ~I40E_ITR_DYNAMIC) >> 1) | ||
47 | #define ITR_IS_DYNAMIC(setting) (!!(setting & I40E_ITR_DYNAMIC)) | ||
48 | #define ITR_REG_TO_USEC(itr_reg) (itr_reg << 1) | ||
49 | |||
50 | #define I40E_QUEUE_END_OF_LIST 0x7FF | ||
51 | |||
52 | #define I40E_ITR_NONE 3 | ||
53 | #define I40E_RX_ITR 0 | ||
54 | #define I40E_TX_ITR 1 | ||
55 | #define I40E_PE_ITR 2 | ||
56 | /* Supported Rx Buffer Sizes */ | ||
57 | #define I40E_RXBUFFER_512 512 /* Used for packet split */ | ||
58 | #define I40E_RXBUFFER_2048 2048 | ||
59 | #define I40E_RXBUFFER_3072 3072 /* For FCoE MTU of 2158 */ | ||
60 | #define I40E_RXBUFFER_4096 4096 | ||
61 | #define I40E_RXBUFFER_8192 8192 | ||
62 | #define I40E_MAX_RXBUFFER 9728 /* largest size for single descriptor */ | ||
63 | |||
64 | /* NOTE: netdev_alloc_skb reserves up to 64 bytes, NET_IP_ALIGN means we | ||
65 | * reserve 2 more, and skb_shared_info adds an additional 384 bytes more, | ||
66 | * this adds up to 512 bytes of extra data meaning the smallest allocation | ||
67 | * we could have is 1K. | ||
68 | * i.e. RXBUFFER_512 --> size-1024 slab | ||
69 | */ | ||
70 | #define I40E_RX_HDR_SIZE I40E_RXBUFFER_512 | ||
71 | |||
72 | /* How many Rx Buffers do we bundle into one write to the hardware ? */ | ||
73 | #define I40E_RX_BUFFER_WRITE 16 /* Must be power of 2 */ | ||
74 | #define I40E_RX_NEXT_DESC(r, i, n) \ | ||
75 | do { \ | ||
76 | (i)++; \ | ||
77 | if ((i) == (r)->count) \ | ||
78 | i = 0; \ | ||
79 | (n) = I40E_RX_DESC((r), (i)); \ | ||
80 | } while (0) | ||
81 | |||
82 | #define I40E_RX_NEXT_DESC_PREFETCH(r, i, n) \ | ||
83 | do { \ | ||
84 | I40E_RX_NEXT_DESC((r), (i), (n)); \ | ||
85 | prefetch((n)); \ | ||
86 | } while (0) | ||
87 | |||
88 | #define i40e_rx_desc i40e_32byte_rx_desc | ||
89 | |||
90 | #define I40E_MIN_TX_LEN 17 | ||
91 | #define I40E_MAX_DATA_PER_TXD 16383 /* aka 16kB - 1 */ | ||
92 | |||
93 | /* Tx Descriptors needed, worst case */ | ||
94 | #define TXD_USE_COUNT(S) DIV_ROUND_UP((S), I40E_MAX_DATA_PER_TXD) | ||
95 | #define DESC_NEEDED ((MAX_SKB_FRAGS * TXD_USE_COUNT(PAGE_SIZE)) + 4) | ||
96 | |||
97 | #define I40E_TX_FLAGS_CSUM (u32)(1) | ||
98 | #define I40E_TX_FLAGS_HW_VLAN (u32)(1 << 1) | ||
99 | #define I40E_TX_FLAGS_SW_VLAN (u32)(1 << 2) | ||
100 | #define I40E_TX_FLAGS_TSO (u32)(1 << 3) | ||
101 | #define I40E_TX_FLAGS_IPV4 (u32)(1 << 4) | ||
102 | #define I40E_TX_FLAGS_IPV6 (u32)(1 << 5) | ||
103 | #define I40E_TX_FLAGS_FCCRC (u32)(1 << 6) | ||
104 | #define I40E_TX_FLAGS_FSO (u32)(1 << 7) | ||
105 | #define I40E_TX_FLAGS_TXSW (u32)(1 << 8) | ||
106 | #define I40E_TX_FLAGS_MAPPED_AS_PAGE (u32)(1 << 9) | ||
107 | #define I40E_TX_FLAGS_VLAN_MASK 0xffff0000 | ||
108 | #define I40E_TX_FLAGS_VLAN_PRIO_MASK 0xe0000000 | ||
109 | #define I40E_TX_FLAGS_VLAN_PRIO_SHIFT 29 | ||
110 | #define I40E_TX_FLAGS_VLAN_SHIFT 16 | ||
111 | |||
112 | struct i40e_tx_buffer { | ||
113 | struct sk_buff *skb; | ||
114 | dma_addr_t dma; | ||
115 | unsigned long time_stamp; | ||
116 | u16 length; | ||
117 | u32 tx_flags; | ||
118 | struct i40e_tx_desc *next_to_watch; | ||
119 | unsigned int bytecount; | ||
120 | u16 gso_segs; | ||
121 | u8 mapped_as_page; | ||
122 | }; | ||
123 | |||
124 | struct i40e_rx_buffer { | ||
125 | struct sk_buff *skb; | ||
126 | dma_addr_t dma; | ||
127 | struct page *page; | ||
128 | dma_addr_t page_dma; | ||
129 | unsigned int page_offset; | ||
130 | }; | ||
131 | |||
132 | struct i40e_tx_queue_stats { | ||
133 | u64 packets; | ||
134 | u64 bytes; | ||
135 | u64 restart_queue; | ||
136 | u64 tx_busy; | ||
137 | u64 completed; | ||
138 | u64 tx_done_old; | ||
139 | }; | ||
140 | |||
141 | struct i40e_rx_queue_stats { | ||
142 | u64 packets; | ||
143 | u64 bytes; | ||
144 | u64 non_eop_descs; | ||
145 | u64 alloc_rx_page_failed; | ||
146 | u64 alloc_rx_buff_failed; | ||
147 | }; | ||
148 | |||
149 | enum i40e_ring_state_t { | ||
150 | __I40E_TX_FDIR_INIT_DONE, | ||
151 | __I40E_TX_XPS_INIT_DONE, | ||
152 | __I40E_TX_DETECT_HANG, | ||
153 | __I40E_HANG_CHECK_ARMED, | ||
154 | __I40E_RX_PS_ENABLED, | ||
155 | __I40E_RX_LRO_ENABLED, | ||
156 | __I40E_RX_16BYTE_DESC_ENABLED, | ||
157 | }; | ||
158 | |||
159 | #define ring_is_ps_enabled(ring) \ | ||
160 | test_bit(__I40E_RX_PS_ENABLED, &(ring)->state) | ||
161 | #define set_ring_ps_enabled(ring) \ | ||
162 | set_bit(__I40E_RX_PS_ENABLED, &(ring)->state) | ||
163 | #define clear_ring_ps_enabled(ring) \ | ||
164 | clear_bit(__I40E_RX_PS_ENABLED, &(ring)->state) | ||
165 | #define check_for_tx_hang(ring) \ | ||
166 | test_bit(__I40E_TX_DETECT_HANG, &(ring)->state) | ||
167 | #define set_check_for_tx_hang(ring) \ | ||
168 | set_bit(__I40E_TX_DETECT_HANG, &(ring)->state) | ||
169 | #define clear_check_for_tx_hang(ring) \ | ||
170 | clear_bit(__I40E_TX_DETECT_HANG, &(ring)->state) | ||
171 | #define ring_is_lro_enabled(ring) \ | ||
172 | test_bit(__I40E_RX_LRO_ENABLED, &(ring)->state) | ||
173 | #define set_ring_lro_enabled(ring) \ | ||
174 | set_bit(__I40E_RX_LRO_ENABLED, &(ring)->state) | ||
175 | #define clear_ring_lro_enabled(ring) \ | ||
176 | clear_bit(__I40E_RX_LRO_ENABLED, &(ring)->state) | ||
177 | #define ring_is_16byte_desc_enabled(ring) \ | ||
178 | test_bit(__I40E_RX_16BYTE_DESC_ENABLED, &(ring)->state) | ||
179 | #define set_ring_16byte_desc_enabled(ring) \ | ||
180 | set_bit(__I40E_RX_16BYTE_DESC_ENABLED, &(ring)->state) | ||
181 | #define clear_ring_16byte_desc_enabled(ring) \ | ||
182 | clear_bit(__I40E_RX_16BYTE_DESC_ENABLED, &(ring)->state) | ||
183 | |||
184 | /* struct that defines a descriptor ring, associated with a VSI */ | ||
185 | struct i40e_ring { | ||
186 | void *desc; /* Descriptor ring memory */ | ||
187 | struct device *dev; /* Used for DMA mapping */ | ||
188 | struct net_device *netdev; /* netdev ring maps to */ | ||
189 | union { | ||
190 | struct i40e_tx_buffer *tx_bi; | ||
191 | struct i40e_rx_buffer *rx_bi; | ||
192 | }; | ||
193 | unsigned long state; | ||
194 | u16 queue_index; /* Queue number of ring */ | ||
195 | u8 dcb_tc; /* Traffic class of ring */ | ||
196 | u8 __iomem *tail; | ||
197 | |||
198 | u16 count; /* Number of descriptors */ | ||
199 | u16 reg_idx; /* HW register index of the ring */ | ||
200 | u16 rx_hdr_len; | ||
201 | u16 rx_buf_len; | ||
202 | u8 dtype; | ||
203 | #define I40E_RX_DTYPE_NO_SPLIT 0 | ||
204 | #define I40E_RX_DTYPE_SPLIT_ALWAYS 1 | ||
205 | #define I40E_RX_DTYPE_HEADER_SPLIT 2 | ||
206 | u8 hsplit; | ||
207 | #define I40E_RX_SPLIT_L2 0x1 | ||
208 | #define I40E_RX_SPLIT_IP 0x2 | ||
209 | #define I40E_RX_SPLIT_TCP_UDP 0x4 | ||
210 | #define I40E_RX_SPLIT_SCTP 0x8 | ||
211 | |||
212 | /* used in interrupt processing */ | ||
213 | u16 next_to_use; | ||
214 | u16 next_to_clean; | ||
215 | |||
216 | u8 atr_sample_rate; | ||
217 | u8 atr_count; | ||
218 | |||
219 | bool ring_active; /* is ring online or not */ | ||
220 | |||
221 | /* stats structs */ | ||
222 | union { | ||
223 | struct i40e_tx_queue_stats tx_stats; | ||
224 | struct i40e_rx_queue_stats rx_stats; | ||
225 | }; | ||
226 | |||
227 | unsigned int size; /* length of descriptor ring in bytes */ | ||
228 | dma_addr_t dma; /* physical address of ring */ | ||
229 | |||
230 | struct i40e_vsi *vsi; /* Backreference to associated VSI */ | ||
231 | struct i40e_q_vector *q_vector; /* Backreference to associated vector */ | ||
232 | } ____cacheline_internodealigned_in_smp; | ||
233 | |||
234 | enum i40e_latency_range { | ||
235 | I40E_LOWEST_LATENCY = 0, | ||
236 | I40E_LOW_LATENCY = 1, | ||
237 | I40E_BULK_LATENCY = 2, | ||
238 | }; | ||
239 | |||
240 | struct i40e_ring_container { | ||
241 | #define I40E_MAX_RINGPAIR_PER_VECTOR 8 | ||
242 | /* array of pointers to rings */ | ||
243 | struct i40e_ring *ring[I40E_MAX_RINGPAIR_PER_VECTOR]; | ||
244 | unsigned int total_bytes; /* total bytes processed this int */ | ||
245 | unsigned int total_packets; /* total packets processed this int */ | ||
246 | u16 count; | ||
247 | enum i40e_latency_range latency_range; | ||
248 | u16 itr; | ||
249 | }; | ||
250 | |||
251 | void i40e_alloc_rx_buffers(struct i40e_ring *rxr, u16 cleaned_count); | ||
252 | netdev_tx_t i40e_lan_xmit_frame(struct sk_buff *skb, struct net_device *netdev); | ||
253 | void i40e_clean_tx_ring(struct i40e_ring *tx_ring); | ||
254 | void i40e_clean_rx_ring(struct i40e_ring *rx_ring); | ||
255 | int i40e_setup_tx_descriptors(struct i40e_ring *tx_ring); | ||
256 | int i40e_setup_rx_descriptors(struct i40e_ring *rx_ring); | ||
257 | void i40e_free_tx_resources(struct i40e_ring *tx_ring); | ||
258 | void i40e_free_rx_resources(struct i40e_ring *rx_ring); | ||
259 | int i40e_napi_poll(struct napi_struct *napi, int budget); | ||