Linux Kernel  3.7.1
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
vmxnet3_int.h
Go to the documentation of this file.
1 /*
2  * Linux driver for VMware's vmxnet3 ethernet NIC.
3  *
4  * Copyright (C) 2008-2009, VMware, Inc. All Rights Reserved.
5  *
6  * This program is free software; you can redistribute it and/or modify it
7  * under the terms of the GNU General Public License as published by the
8  * Free Software Foundation; version 2 of the License and no later version.
9  *
10  * This program is distributed in the hope that it will be useful, but
11  * WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or
13  * NON INFRINGEMENT. See the GNU General Public License for more
14  * details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this program; if not, write to the Free Software
18  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
19  *
20  * The full GNU General Public License is included in this distribution in
21  * the file called "COPYING".
22  *
23  * Maintained by: Shreyas Bhatewara <[email protected]>
24  *
25  */
26 
27 #ifndef _VMXNET3_INT_H
28 #define _VMXNET3_INT_H
29 
30 #include <linux/bitops.h>
31 #include <linux/ethtool.h>
32 #include <linux/delay.h>
33 #include <linux/netdevice.h>
34 #include <linux/pci.h>
35 #include <linux/compiler.h>
36 #include <linux/slab.h>
37 #include <linux/spinlock.h>
38 #include <linux/ioport.h>
39 #include <linux/highmem.h>
40 #include <linux/init.h>
41 #include <linux/timer.h>
42 #include <linux/skbuff.h>
43 #include <linux/interrupt.h>
44 #include <linux/workqueue.h>
45 #include <linux/uaccess.h>
46 #include <asm/dma.h>
47 #include <asm/page.h>
48 
49 #include <linux/tcp.h>
50 #include <linux/udp.h>
51 #include <linux/ip.h>
52 #include <linux/ipv6.h>
53 #include <linux/in.h>
54 #include <linux/etherdevice.h>
55 #include <asm/checksum.h>
56 #include <linux/if_vlan.h>
57 #include <linux/if_arp.h>
58 #include <linux/inetdevice.h>
59 #include <linux/log2.h>
60 
61 #include "vmxnet3_defs.h"
62 
63 #ifdef DEBUG
64 # define VMXNET3_DRIVER_VERSION_REPORT VMXNET3_DRIVER_VERSION_STRING"-NAPI(debug)"
65 #else
66 # define VMXNET3_DRIVER_VERSION_REPORT VMXNET3_DRIVER_VERSION_STRING"-NAPI"
67 #endif
68 
69 
70 /*
71  * Version numbers
72  */
73 #define VMXNET3_DRIVER_VERSION_STRING "1.1.29.0-k"
74 
75 /* a 32-bit int, each byte encode a verion number in VMXNET3_DRIVER_VERSION */
76 #define VMXNET3_DRIVER_VERSION_NUM 0x01011D00
77 
78 #if defined(CONFIG_PCI_MSI)
79  /* RSS only makes sense if MSI-X is supported. */
80  #define VMXNET3_RSS
81 #endif
82 
83 /*
84  * Capabilities
85  */
86 
87 enum {
88  VMNET_CAP_SG = 0x0001, /* Can do scatter-gather transmits. */
89  VMNET_CAP_IP4_CSUM = 0x0002, /* Can checksum only TCP/UDP over
90  * IPv4 */
91  VMNET_CAP_HW_CSUM = 0x0004, /* Can checksum all packets. */
92  VMNET_CAP_HIGH_DMA = 0x0008, /* Can DMA to high memory. */
93  VMNET_CAP_TOE = 0x0010, /* Supports TCP/IP offload. */
94  VMNET_CAP_TSO = 0x0020, /* Supports TCP Segmentation
95  * offload */
96  VMNET_CAP_SW_TSO = 0x0040, /* Supports SW TCP Segmentation */
97  VMNET_CAP_VMXNET_APROM = 0x0080, /* Vmxnet APROM support */
98  VMNET_CAP_HW_TX_VLAN = 0x0100, /* Can we do VLAN tagging in HW */
99  VMNET_CAP_HW_RX_VLAN = 0x0200, /* Can we do VLAN untagging in HW */
100  VMNET_CAP_SW_VLAN = 0x0400, /* VLAN tagging/untagging in SW */
101  VMNET_CAP_WAKE_PCKT_RCV = 0x0800, /* Can wake on network packet recv? */
102  VMNET_CAP_ENABLE_INT_INLINE = 0x1000, /* Enable Interrupt Inline */
103  VMNET_CAP_ENABLE_HEADER_COPY = 0x2000, /* copy header for vmkernel */
104  VMNET_CAP_TX_CHAIN = 0x4000, /* Guest can use multiple tx entries
105  * for a pkt */
106  VMNET_CAP_RX_CHAIN = 0x8000, /* pkt can span multiple rx entries */
107  VMNET_CAP_LPD = 0x10000, /* large pkt delivery */
108  VMNET_CAP_BPF = 0x20000, /* BPF Support in VMXNET Virtual HW*/
109  VMNET_CAP_SG_SPAN_PAGES = 0x40000, /* Scatter-gather can span multiple*/
110  /* pages transmits */
111  VMNET_CAP_IP6_CSUM = 0x80000, /* Can do IPv6 csum offload. */
112  VMNET_CAP_TSO6 = 0x100000, /* TSO seg. offload for IPv6 pkts. */
113  VMNET_CAP_TSO256k = 0x200000, /* Can do TSO seg offload for */
114  /* pkts up to 256kB. */
115  VMNET_CAP_UPT = 0x400000 /* Support UPT */
116 };
117 
118 /*
119  * PCI vendor and device IDs.
120  */
121 #define PCI_VENDOR_ID_VMWARE 0x15AD
122 #define PCI_DEVICE_ID_VMWARE_VMXNET3 0x07B0
123 #define MAX_ETHERNET_CARDS 10
124 #define MAX_PCI_PASSTHRU_DEVICE 6
125 
133 };
134 
135 static inline void
136 vmxnet3_cmd_ring_adv_next2fill(struct vmxnet3_cmd_ring *ring)
137 {
138  ring->next2fill++;
139  if (unlikely(ring->next2fill == ring->size)) {
140  ring->next2fill = 0;
141  VMXNET3_FLIP_RING_GEN(ring->gen);
142  }
143 }
144 
145 static inline void
146 vmxnet3_cmd_ring_adv_next2comp(struct vmxnet3_cmd_ring *ring)
147 {
149 }
150 
151 static inline int
152 vmxnet3_cmd_ring_desc_avail(struct vmxnet3_cmd_ring *ring)
153 {
154  return (ring->next2comp > ring->next2fill ? 0 : ring->size) +
155  ring->next2comp - ring->next2fill - 1;
156 }
157 
165 };
166 
167 static inline void
168 vmxnet3_comp_ring_adv_next2proc(struct vmxnet3_comp_ring *ring)
169 {
170  ring->next2proc++;
171  if (unlikely(ring->next2proc == ring->size)) {
172  ring->next2proc = 0;
173  VMXNET3_FLIP_RING_GEN(ring->gen);
174  }
175 }
176 
181 };
182 
188 };
189 
195  struct sk_buff *skb;
196 };
197 
199  u64 drop_total; /* # of pkts dropped by the driver, the
200  * counters below track droppings due to
201  * different reasons
202  */
207 
209  u64 linearized; /* # of pkts linearized */
210  u64 copy_skb_header; /* # of times we have to copy skb header */
212 };
213 
215  bool ipv4;
217  u32 eth_ip_hdr_size; /* only valid for pkts requesting tso or csum
218  * offloading
219  */
220  u32 l4_hdr_size; /* only valid if mss != 0 */
221  u32 copy_size; /* # of bytes copied into the data ring */
224 };
225 
227  char name[IFNAMSIZ+8]; /* To identify interrupt */
236  bool stopped;
237  int num_stop; /* # of times the queue is
238  * stopped */
239  int qid;
240 } __attribute__((__aligned__(SMP_CACHE_BYTES)));
246 };
251  union {
252  struct sk_buff *skb;
253  struct page *page;
254  };
256 };
257 
259  struct sk_buff *skb;
261 };
262 
268 };
269 
271  char name[IFNAMSIZ + 8]; /* To identify interrupt */
277  u32 qid; /* rqID in RCD for buffer from 1st ring */
278  u32 qid2; /* rqID in RCD for buffer from 2nd ring */
279  u32 uncommitted[2]; /* # of buffers allocated since last RXPROD
280  * update */
284 } __attribute__((__aligned__(SMP_CACHE_BYTES)));
285 
286 #define VMXNET3_DEVICE_MAX_TX_QUEUES 8
287 #define VMXNET3_DEVICE_MAX_RX_QUEUES 8 /* Keep this value as a power of 2 */
289 /* Should be less than UPT1_RSS_MAX_IND_TABLE_SIZE */
290 #define VMXNET3_RSS_IND_TABLE_SIZE (VMXNET3_DEVICE_MAX_RX_QUEUES * 4)
291 
292 #define VMXNET3_LINUX_MAX_MSIX_VECT (VMXNET3_DEVICE_MAX_TX_QUEUES + \
293  VMXNET3_DEVICE_MAX_RX_QUEUES + 1)
294 #define VMXNET3_LINUX_MIN_MSIX_VECT 2 /* 1 for tx-rx pair and 1 for event */
295 
296 
297 struct vmxnet3_intr {
299  enum vmxnet3_intr_type type; /* MSI-X, MSI, or INTx? */
300  u8 num_intrs; /* # of intr vectors */
301  u8 event_intr_idx; /* idx of the intr vector for event */
302  u8 mod_levels[VMXNET3_LINUX_MAX_MSIX_VECT]; /* moderation level */
304 #ifdef CONFIG_PCI_MSI
305  struct msix_entry msix_entries[VMXNET3_LINUX_MAX_MSIX_VECT];
306 #endif
307 };
308 
309 /* Interrupt sharing schemes, share_intr */
310 #define VMXNET3_INTR_BUDDYSHARE 0 /* Corresponding tx,rx queues share irq */
311 #define VMXNET3_INTR_TXSHARE 1 /* All tx queues share one irq */
312 #define VMXNET3_INTR_DONTSHARE 2 /* each queue has its own irq */
313 
314 
315 #define VMXNET3_STATE_BIT_RESETTING 0
316 #define VMXNET3_STATE_BIT_QUIESCED 1
325  struct Vmxnet3_TxQueueDesc *tqd_start; /* all tx queue desc */
326  struct Vmxnet3_RxQueueDesc *rqd_start; /* all rx queue desc */
328  struct pci_dev *pdev;
329 
330  u8 __iomem *hw_addr0; /* for BAR 0 */
331  u8 __iomem *hw_addr1; /* for BAR 1 */
332 
333 #ifdef VMXNET3_RSS
334  struct UPT1_RSSConf *rss_conf;
335  bool rss;
336 #endif
339 
340  /* rx buffer related */
341  unsigned skb_buf_size;
342  int rx_buf_per_pkt; /* only apply to the 1st ring */
345 
346  /* Wake-on-LAN */
348 
349  /* Link speed */
350  u32 link_speed; /* in mbps */
351 
354 
355  unsigned long state; /* VMXNET3_STATE_BIT_xxx */
356 
359 };
360 
361 #define VMXNET3_WRITE_BAR0_REG(adapter, reg, val) \
362  writel((val), (adapter)->hw_addr0 + (reg))
363 #define VMXNET3_READ_BAR0_REG(adapter, reg) \
364  readl((adapter)->hw_addr0 + (reg))
365 
366 #define VMXNET3_WRITE_BAR1_REG(adapter, reg, val) \
367  writel((val), (adapter)->hw_addr1 + (reg))
368 #define VMXNET3_READ_BAR1_REG(adapter, reg) \
369  readl((adapter)->hw_addr1 + (reg))
370 
371 #define VMXNET3_WAKE_QUEUE_THRESHOLD(tq) (5)
372 #define VMXNET3_RX_ALLOC_THRESHOLD(rq, ring_idx, adapter) \
373  ((rq)->rx_ring[ring_idx].size >> 3)
374 
375 #define VMXNET3_GET_ADDR_LO(dma) ((u32)(dma))
376 #define VMXNET3_GET_ADDR_HI(dma) ((u32)(((u64)(dma)) >> 32))
377 
378 /* must be a multiple of VMXNET3_RING_SIZE_ALIGN */
379 #define VMXNET3_DEF_TX_RING_SIZE 512
380 #define VMXNET3_DEF_RX_RING_SIZE 256
381 
382 #define VMXNET3_MAX_ETH_HDR_SIZE 22
383 #define VMXNET3_MAX_SKB_BUF_SIZE (3*1024)
384 
385 int
387 
388 int
390 
391 void
393 
394 void
396 
397 void
399 
400 void
402 
403 int
405 
406 int
408  u32 tx_ring_size, u32 rx_ring_size, u32 rx_ring2_size);
409 
410 extern void vmxnet3_set_ethtool_ops(struct net_device *netdev);
411 
412 extern struct rtnl_link_stats64 *
414 
415 extern char vmxnet3_driver_name[];
416 #endif