diff options
Diffstat (limited to 'drivers/net/vmxnet3/vmxnet3_int.h')
-rw-r--r-- | drivers/net/vmxnet3/vmxnet3_int.h | 102 |
1 files changed, 64 insertions, 38 deletions
diff --git a/drivers/net/vmxnet3/vmxnet3_int.h b/drivers/net/vmxnet3/vmxnet3_int.h index 2121c735cabd..e08d75e3f170 100644 --- a/drivers/net/vmxnet3/vmxnet3_int.h +++ b/drivers/net/vmxnet3/vmxnet3_int.h | |||
@@ -55,6 +55,7 @@ | |||
55 | #include <linux/if_vlan.h> | 55 | #include <linux/if_vlan.h> |
56 | #include <linux/if_arp.h> | 56 | #include <linux/if_arp.h> |
57 | #include <linux/inetdevice.h> | 57 | #include <linux/inetdevice.h> |
58 | #include <linux/log2.h> | ||
58 | 59 | ||
59 | #include "vmxnet3_defs.h" | 60 | #include "vmxnet3_defs.h" |
60 | 61 | ||
@@ -68,11 +69,15 @@ | |||
68 | /* | 69 | /* |
69 | * Version numbers | 70 | * Version numbers |
70 | */ | 71 | */ |
71 | #define VMXNET3_DRIVER_VERSION_STRING "1.0.14.0-k" | 72 | #define VMXNET3_DRIVER_VERSION_STRING "1.1.18.0-k" |
72 | 73 | ||
73 | /* a 32-bit int, each byte encode a verion number in VMXNET3_DRIVER_VERSION */ | 74 | /* a 32-bit int, each byte encode a verion number in VMXNET3_DRIVER_VERSION */ |
74 | #define VMXNET3_DRIVER_VERSION_NUM 0x01000E00 | 75 | #define VMXNET3_DRIVER_VERSION_NUM 0x01011200 |
75 | 76 | ||
77 | #if defined(CONFIG_PCI_MSI) | ||
78 | /* RSS only makes sense if MSI-X is supported. */ | ||
79 | #define VMXNET3_RSS | ||
80 | #endif | ||
76 | 81 | ||
77 | /* | 82 | /* |
78 | * Capabilities | 83 | * Capabilities |
@@ -218,16 +223,19 @@ struct vmxnet3_tx_ctx { | |||
218 | }; | 223 | }; |
219 | 224 | ||
220 | struct vmxnet3_tx_queue { | 225 | struct vmxnet3_tx_queue { |
226 | char name[IFNAMSIZ+8]; /* To identify interrupt */ | ||
227 | struct vmxnet3_adapter *adapter; | ||
221 | spinlock_t tx_lock; | 228 | spinlock_t tx_lock; |
222 | struct vmxnet3_cmd_ring tx_ring; | 229 | struct vmxnet3_cmd_ring tx_ring; |
223 | struct vmxnet3_tx_buf_info *buf_info; | 230 | struct vmxnet3_tx_buf_info *buf_info; |
224 | struct vmxnet3_tx_data_ring data_ring; | 231 | struct vmxnet3_tx_data_ring data_ring; |
225 | struct vmxnet3_comp_ring comp_ring; | 232 | struct vmxnet3_comp_ring comp_ring; |
226 | struct Vmxnet3_TxQueueCtrl *shared; | 233 | struct Vmxnet3_TxQueueCtrl *shared; |
227 | struct vmxnet3_tq_driver_stats stats; | 234 | struct vmxnet3_tq_driver_stats stats; |
228 | bool stopped; | 235 | bool stopped; |
229 | int num_stop; /* # of times the queue is | 236 | int num_stop; /* # of times the queue is |
230 | * stopped */ | 237 | * stopped */ |
238 | int qid; | ||
231 | } __attribute__((__aligned__(SMP_CACHE_BYTES))); | 239 | } __attribute__((__aligned__(SMP_CACHE_BYTES))); |
232 | 240 | ||
233 | enum vmxnet3_rx_buf_type { | 241 | enum vmxnet3_rx_buf_type { |
@@ -259,6 +267,9 @@ struct vmxnet3_rq_driver_stats { | |||
259 | }; | 267 | }; |
260 | 268 | ||
261 | struct vmxnet3_rx_queue { | 269 | struct vmxnet3_rx_queue { |
270 | char name[IFNAMSIZ + 8]; /* To identify interrupt */ | ||
271 | struct vmxnet3_adapter *adapter; | ||
272 | struct napi_struct napi; | ||
262 | struct vmxnet3_cmd_ring rx_ring[2]; | 273 | struct vmxnet3_cmd_ring rx_ring[2]; |
263 | struct vmxnet3_comp_ring comp_ring; | 274 | struct vmxnet3_comp_ring comp_ring; |
264 | struct vmxnet3_rx_ctx rx_ctx; | 275 | struct vmxnet3_rx_ctx rx_ctx; |
@@ -271,7 +282,16 @@ struct vmxnet3_rx_queue { | |||
271 | struct vmxnet3_rq_driver_stats stats; | 282 | struct vmxnet3_rq_driver_stats stats; |
272 | } __attribute__((__aligned__(SMP_CACHE_BYTES))); | 283 | } __attribute__((__aligned__(SMP_CACHE_BYTES))); |
273 | 284 | ||
274 | #define VMXNET3_LINUX_MAX_MSIX_VECT 1 | 285 | #define VMXNET3_DEVICE_MAX_TX_QUEUES 8 |
286 | #define VMXNET3_DEVICE_MAX_RX_QUEUES 8 /* Keep this value as a power of 2 */ | ||
287 | |||
288 | /* Should be less than UPT1_RSS_MAX_IND_TABLE_SIZE */ | ||
289 | #define VMXNET3_RSS_IND_TABLE_SIZE (VMXNET3_DEVICE_MAX_RX_QUEUES * 4) | ||
290 | |||
291 | #define VMXNET3_LINUX_MAX_MSIX_VECT (VMXNET3_DEVICE_MAX_TX_QUEUES + \ | ||
292 | VMXNET3_DEVICE_MAX_RX_QUEUES + 1) | ||
293 | #define VMXNET3_LINUX_MIN_MSIX_VECT 2 /* 1 for tx-rx pair and 1 for event */ | ||
294 | |||
275 | 295 | ||
276 | struct vmxnet3_intr { | 296 | struct vmxnet3_intr { |
277 | enum vmxnet3_intr_mask_mode mask_mode; | 297 | enum vmxnet3_intr_mask_mode mask_mode; |
@@ -279,35 +299,43 @@ struct vmxnet3_intr { | |||
279 | u8 num_intrs; /* # of intr vectors */ | 299 | u8 num_intrs; /* # of intr vectors */ |
280 | u8 event_intr_idx; /* idx of the intr vector for event */ | 300 | u8 event_intr_idx; /* idx of the intr vector for event */ |
281 | u8 mod_levels[VMXNET3_LINUX_MAX_MSIX_VECT]; /* moderation level */ | 301 | u8 mod_levels[VMXNET3_LINUX_MAX_MSIX_VECT]; /* moderation level */ |
302 | char event_msi_vector_name[IFNAMSIZ+11]; | ||
282 | #ifdef CONFIG_PCI_MSI | 303 | #ifdef CONFIG_PCI_MSI |
283 | struct msix_entry msix_entries[VMXNET3_LINUX_MAX_MSIX_VECT]; | 304 | struct msix_entry msix_entries[VMXNET3_LINUX_MAX_MSIX_VECT]; |
284 | #endif | 305 | #endif |
285 | }; | 306 | }; |
286 | 307 | ||
308 | /* Interrupt sharing schemes, share_intr */ | ||
309 | #define VMXNET3_INTR_BUDDYSHARE 0 /* Corresponding tx,rx queues share irq */ | ||
310 | #define VMXNET3_INTR_TXSHARE 1 /* All tx queues share one irq */ | ||
311 | #define VMXNET3_INTR_DONTSHARE 2 /* each queue has its own irq */ | ||
312 | |||
313 | |||
287 | #define VMXNET3_STATE_BIT_RESETTING 0 | 314 | #define VMXNET3_STATE_BIT_RESETTING 0 |
288 | #define VMXNET3_STATE_BIT_QUIESCED 1 | 315 | #define VMXNET3_STATE_BIT_QUIESCED 1 |
289 | struct vmxnet3_adapter { | 316 | struct vmxnet3_adapter { |
290 | struct vmxnet3_tx_queue tx_queue; | 317 | struct vmxnet3_tx_queue tx_queue[VMXNET3_DEVICE_MAX_TX_QUEUES]; |
291 | struct vmxnet3_rx_queue rx_queue; | 318 | struct vmxnet3_rx_queue rx_queue[VMXNET3_DEVICE_MAX_RX_QUEUES]; |
292 | struct napi_struct napi; | 319 | struct vlan_group *vlan_grp; |
293 | struct vlan_group *vlan_grp; | 320 | struct vmxnet3_intr intr; |
294 | 321 | spinlock_t cmd_lock; | |
295 | struct vmxnet3_intr intr; | 322 | struct Vmxnet3_DriverShared *shared; |
296 | 323 | struct Vmxnet3_PMConf *pm_conf; | |
297 | struct Vmxnet3_DriverShared *shared; | 324 | struct Vmxnet3_TxQueueDesc *tqd_start; /* all tx queue desc */ |
298 | struct Vmxnet3_PMConf *pm_conf; | 325 | struct Vmxnet3_RxQueueDesc *rqd_start; /* all rx queue desc */ |
299 | struct Vmxnet3_TxQueueDesc *tqd_start; /* first tx queue desc */ | 326 | struct net_device *netdev; |
300 | struct Vmxnet3_RxQueueDesc *rqd_start; /* first rx queue desc */ | 327 | struct net_device_stats net_stats; |
301 | struct net_device *netdev; | 328 | struct pci_dev *pdev; |
302 | struct pci_dev *pdev; | 329 | |
303 | 330 | u8 __iomem *hw_addr0; /* for BAR 0 */ | |
304 | u8 *hw_addr0; /* for BAR 0 */ | 331 | u8 __iomem *hw_addr1; /* for BAR 1 */ |
305 | u8 *hw_addr1; /* for BAR 1 */ | 332 | |
306 | 333 | #ifdef VMXNET3_RSS | |
307 | /* feature control */ | 334 | struct UPT1_RSSConf *rss_conf; |
308 | bool rxcsum; | 335 | bool rss; |
309 | bool lro; | 336 | #endif |
310 | bool jumbo_frame; | 337 | u32 num_rx_queues; |
338 | u32 num_tx_queues; | ||
311 | 339 | ||
312 | /* rx buffer related */ | 340 | /* rx buffer related */ |
313 | unsigned skb_buf_size; | 341 | unsigned skb_buf_size; |
@@ -327,17 +355,18 @@ struct vmxnet3_adapter { | |||
327 | unsigned long state; /* VMXNET3_STATE_BIT_xxx */ | 355 | unsigned long state; /* VMXNET3_STATE_BIT_xxx */ |
328 | 356 | ||
329 | int dev_number; | 357 | int dev_number; |
358 | int share_intr; | ||
330 | }; | 359 | }; |
331 | 360 | ||
332 | #define VMXNET3_WRITE_BAR0_REG(adapter, reg, val) \ | 361 | #define VMXNET3_WRITE_BAR0_REG(adapter, reg, val) \ |
333 | writel(cpu_to_le32(val), (adapter)->hw_addr0 + (reg)) | 362 | writel((val), (adapter)->hw_addr0 + (reg)) |
334 | #define VMXNET3_READ_BAR0_REG(adapter, reg) \ | 363 | #define VMXNET3_READ_BAR0_REG(adapter, reg) \ |
335 | le32_to_cpu(readl((adapter)->hw_addr0 + (reg))) | 364 | readl((adapter)->hw_addr0 + (reg)) |
336 | 365 | ||
337 | #define VMXNET3_WRITE_BAR1_REG(adapter, reg, val) \ | 366 | #define VMXNET3_WRITE_BAR1_REG(adapter, reg, val) \ |
338 | writel(cpu_to_le32(val), (adapter)->hw_addr1 + (reg)) | 367 | writel((val), (adapter)->hw_addr1 + (reg)) |
339 | #define VMXNET3_READ_BAR1_REG(adapter, reg) \ | 368 | #define VMXNET3_READ_BAR1_REG(adapter, reg) \ |
340 | le32_to_cpu(readl((adapter)->hw_addr1 + (reg))) | 369 | readl((adapter)->hw_addr1 + (reg)) |
341 | 370 | ||
342 | #define VMXNET3_WAKE_QUEUE_THRESHOLD(tq) (5) | 371 | #define VMXNET3_WAKE_QUEUE_THRESHOLD(tq) (5) |
343 | #define VMXNET3_RX_ALLOC_THRESHOLD(rq, ring_idx, adapter) \ | 372 | #define VMXNET3_RX_ALLOC_THRESHOLD(rq, ring_idx, adapter) \ |
@@ -353,10 +382,6 @@ struct vmxnet3_adapter { | |||
353 | #define VMXNET3_MAX_ETH_HDR_SIZE 22 | 382 | #define VMXNET3_MAX_ETH_HDR_SIZE 22 |
354 | #define VMXNET3_MAX_SKB_BUF_SIZE (3*1024) | 383 | #define VMXNET3_MAX_SKB_BUF_SIZE (3*1024) |
355 | 384 | ||
356 | void set_flag_le16(__le16 *data, u16 flag); | ||
357 | void set_flag_le64(__le64 *data, u64 flag); | ||
358 | void reset_flag_le64(__le64 *data, u64 flag); | ||
359 | |||
360 | int | 385 | int |
361 | vmxnet3_quiesce_dev(struct vmxnet3_adapter *adapter); | 386 | vmxnet3_quiesce_dev(struct vmxnet3_adapter *adapter); |
362 | 387 | ||
@@ -370,12 +395,13 @@ void | |||
370 | vmxnet3_reset_dev(struct vmxnet3_adapter *adapter); | 395 | vmxnet3_reset_dev(struct vmxnet3_adapter *adapter); |
371 | 396 | ||
372 | void | 397 | void |
373 | vmxnet3_tq_destroy(struct vmxnet3_tx_queue *tq, | 398 | vmxnet3_tq_destroy_all(struct vmxnet3_adapter *adapter); |
374 | struct vmxnet3_adapter *adapter); | ||
375 | 399 | ||
376 | void | 400 | void |
377 | vmxnet3_rq_destroy(struct vmxnet3_rx_queue *rq, | 401 | vmxnet3_rq_destroy_all(struct vmxnet3_adapter *adapter); |
378 | struct vmxnet3_adapter *adapter); | 402 | |
403 | int | ||
404 | vmxnet3_set_features(struct net_device *netdev, u32 features); | ||
379 | 405 | ||
380 | int | 406 | int |
381 | vmxnet3_create_queues(struct vmxnet3_adapter *adapter, | 407 | vmxnet3_create_queues(struct vmxnet3_adapter *adapter, |