~n-muench/ubuntu/oneiric/open-vm-tools/open-vm-tools.fix-836277

« back to all changes in this revision

Viewing changes to modules/linux/vmxnet3/vmxnet3_defs.h

  • Committer: Bazaar Package Importer
  • Author(s): Daniel Baumann
  • Date: 2008-10-23 15:32:00 UTC
  • mfrom: (1.1.2 upstream) (2.1.2 sid)
  • Revision ID: james.westby@ubuntu.com-20081023153200-gc1bfx89hj35c799
Tags: 2008.10.10-123053-2
* Correcting typo in dh_installinit call.
* Downgrading depends on module-assistant to recommends.

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/*********************************************************
 
2
 * Copyright (C) 2007 VMware, Inc. All rights reserved.
 
3
 *
 
4
 * This program is free software; you can redistribute it and/or modify it
 
5
 * under the terms of the GNU General Public License as published by the
 
6
 * Free Software Foundation version 2 and no later version.
 
7
 *
 
8
 * This program is distributed in the hope that it will be useful, but
 
9
 * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
 
10
 * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
 
11
 * for more details.
 
12
 *
 
13
 * You should have received a copy of the GNU General Public License along
 
14
 * with this program; if not, write to the Free Software Foundation, Inc.,
 
15
 * 51 Franklin St, Fifth Floor, Boston, MA  02110-1301 USA
 
16
 *
 
17
 *********************************************************/
 
18
 
 
19
/*
 
20
 * vmxnet3_defs.h --
 
21
 *
 
22
 *      Definitions shared by device emulation and guest drivers for
 
23
 *      VMXNET3 NIC
 
24
 */
 
25
 
 
26
#ifndef _VMXNET3_DEFS_H_
 
27
#define _VMXNET3_DEFS_H_
 
28
 
 
29
#define INCLUDE_ALLOW_USERLEVEL
 
30
#define INCLUDE_ALLOW_VMKERNEL
 
31
#define INCLUDE_ALLOW_VMMEXT
 
32
#define INCLUDE_ALLOW_VMCORE
 
33
#define INCLUDE_ALLOW_MODULE
 
34
#include "includeCheck.h"
 
35
 
 
36
#include "upt1_defs.h"
 
37
 
 
38
/* all registers are 32 bit wide */
 
39
/* BAR 1 */
 
40
#define VMXNET3_REG_VRRS  0x0    /* Vmxnet3 Revision Report Selection */
 
41
#define VMXNET3_REG_UVRS  0x8    /* UPT Version Report Selection */
 
42
#define VMXNET3_REG_DSAL  0x10   /* Driver Shared Address Low */
 
43
#define VMXNET3_REG_DSAH  0x18   /* Driver Shared Address High */
 
44
#define VMXNET3_REG_CMD   0x20   /* Command */
 
45
#define VMXNET3_REG_MACL  0x28   /* MAC Address Low */
 
46
#define VMXNET3_REG_MACH  0x30   /* MAC Address High */
 
47
#define VMXNET3_REG_ICR   0x38   /* Interrupt Cause Register */
 
48
#define VMXNET3_REG_ECR   0x40   /* Event Cause Register */
 
49
 
 
50
/* BAR 0 */
 
51
#define VMXNET3_REG_IMR      0x0   /* Interrupt Mask Register */
 
52
#define VMXNET3_REG_TXPROD   0x600 /* Tx Producer Index */
 
53
#define VMXNET3_REG_RXPROD   0x800 /* Rx Producer Index for ring 1 */
 
54
#define VMXNET3_REG_RXPROD2  0xA00 /* Rx Producer Index for ring 2 */
 
55
 
 
56
#define VMXNET3_PT_REG_SIZE     4096    /* BAR 0 */
 
57
#define VMXNET3_VD_REG_SIZE     4096    /* BAR 1 */
 
58
 
 
59
#define VMXNET3_REG_ALIGN       8  /* All registers are 8-byte aligned. */
 
60
#define VMXNET3_REG_ALIGN_MASK  0x7
 
61
 
 
62
/* I/O Mapped access to registers */
 
63
#define VMXNET3_IO_TYPE_PT              0
 
64
#define VMXNET3_IO_TYPE_VD              1
 
65
#define VMXNET3_IO_ADDR(type, reg)      (((type) << 24) | ((reg) & 0xFFFFFF))
 
66
#define VMXNET3_IO_TYPE(addr)           ((addr) >> 24)
 
67
#define VMXNET3_IO_REG(addr)            ((addr) & 0xFFFFFF)
 
68
 
 
69
typedef enum {
 
70
   VMXNET3_CMD_FIRST_SET = 0xCAFE0000,
 
71
   VMXNET3_CMD_ACTIVATE_DEV = VMXNET3_CMD_FIRST_SET,
 
72
   VMXNET3_CMD_QUIESCE_DEV,
 
73
   VMXNET3_CMD_RESET_DEV,
 
74
   VMXNET3_CMD_UPDATE_RX_MODE,
 
75
   VMXNET3_CMD_UPDATE_MAC_FILTERS,
 
76
   VMXNET3_CMD_UPDATE_VLAN_FILTERS,
 
77
   VMXNET3_CMD_UPDATE_RSSIDT,
 
78
   VMXNET3_CMD_UPDATE_IML,
 
79
   VMXNET3_CMD_UPDATE_PMCFG,
 
80
   VMXNET3_CMD_UPDATE_FEATURE,
 
81
 
 
82
   VMXNET3_CMD_FIRST_GET = 0xF00D0000,
 
83
   VMXNET3_CMD_GET_QUEUE_STATUS = VMXNET3_CMD_FIRST_GET,
 
84
   VMXNET3_CMD_GET_STATS,
 
85
   VMXNET3_CMD_GET_LINK,
 
86
   VMXNET3_CMD_GET_PERM_MAC_LO,
 
87
   VMXNET3_CMD_GET_PERM_MAC_HI,
 
88
   VMXNET3_CMD_GET_DID_LO,
 
89
   VMXNET3_CMD_GET_DID_HI,
 
90
   VMXNET3_CMD_GET_DEV_EXTRA_INFO,
 
91
   VMXNET3_CMD_GET_CONF_INTR
 
92
} Vmxnet3_Cmd;
 
93
 
 
94
typedef
 
95
#include "vmware_pack_begin.h"
 
96
struct Vmxnet3_TxDesc {
 
97
   uint64 addr;
 
98
 
 
99
   uint32 len:14;
 
100
   uint32 gen:1;      /* generation bit */
 
101
   uint32 rsvd:1;
 
102
   uint32 dtype:1;    /* descriptor type */
 
103
   uint32 ext1:1;
 
104
   uint32 msscof:14;  /* MSS, checksum offset, flags */
 
105
 
 
106
   uint32 hlen:10;    /* header len */
 
107
   uint32 om:2;       /* offload mode */
 
108
   uint32 eop:1;      /* End Of Packet */
 
109
   uint32 cq:1;       /* completion request */
 
110
   uint32 ext2:1;
 
111
   uint32 ti:1;       /* VLAN Tag Insertion */
 
112
   uint32 tci:16;     /* Tag to Insert */
 
113
}
 
114
#include "vmware_pack_end.h"
 
115
Vmxnet3_TxDesc;
 
116
 
 
117
/* TxDesc.OM values */
 
118
#define VMXNET3_OM_NONE  0
 
119
#define VMXNET3_OM_CSUM  2
 
120
#define VMXNET3_OM_TSO   3
 
121
 
 
122
/* fields in TxDesc we access w/o using bit fields */
 
123
#define VMXNET3_TXD_EOP_SHIFT 12
 
124
#define VMXNET3_TXD_CQ_SHIFT  13
 
125
#define VMXNET3_TXD_GEN_SHIFT 14
 
126
 
 
127
#define VMXNET3_TXD_CQ  (1 << VMXNET3_TXD_CQ_SHIFT)
 
128
#define VMXNET3_TXD_EOP (1 << VMXNET3_TXD_EOP_SHIFT)
 
129
#define VMXNET3_TXD_GEN (1 << VMXNET3_TXD_GEN_SHIFT)
 
130
 
 
131
#define VMXNET3_HDR_COPY_SIZE   128
 
132
 
 
133
typedef
 
134
#include "vmware_pack_begin.h"
 
135
struct vmxnet3_TxDataDesc {
 
136
   uint8 data[VMXNET3_HDR_COPY_SIZE];
 
137
}
 
138
#include "vmware_pack_end.h"
 
139
Vmxnet3_TxDataDesc;
 
140
 
 
141
typedef
 
142
#include "vmware_pack_begin.h"
 
143
struct Vmxnet3_TxCompDesc {
 
144
   uint32 txdIdx:12;    /* Index of the EOP TxDesc */
 
145
   uint32 ext1:20;
 
146
 
 
147
   uint32 ext2;
 
148
   uint32 ext3;
 
149
 
 
150
   uint32 rsvd:24;
 
151
   uint32 type:7;       /* completion type */
 
152
   uint32 gen:1;        /* generation bit */
 
153
}
 
154
#include "vmware_pack_end.h"
 
155
Vmxnet3_TxCompDesc;
 
156
 
 
157
typedef
 
158
#include "vmware_pack_begin.h"
 
159
struct Vmxnet3_RxDesc {
 
160
   uint64 addr;
 
161
 
 
162
   uint32 len:14;
 
163
   uint32 btype:1;      /* Buffer Type */
 
164
   uint32 dtype:1;      /* Descriptor type */
 
165
   uint32 rsvd:15;
 
166
   uint32 gen:1;        /* Generation bit */
 
167
 
 
168
   uint32 ext1;
 
169
}
 
170
#include "vmware_pack_end.h"
 
171
Vmxnet3_RxDesc;
 
172
 
 
173
/* values of RXD.BTYPE */
 
174
#define VMXNET3_RXD_BTYPE_HEAD   0    /* head only */
 
175
#define VMXNET3_RXD_BTYPE_BODY   1    /* body only */
 
176
 
 
177
/* fields in RxDesc we access w/o using bit fields */
 
178
#define VMXNET3_RXD_BTYPE_SHIFT  14
 
179
#define VMXNET3_RXD_GEN_SHIFT    31
 
180
 
 
181
typedef
 
182
#include "vmware_pack_begin.h"
 
183
struct Vmxnet3_RxCompDesc {
 
184
   uint32 rxdIdx:12;    /* Index of the RxDesc */
 
185
   uint32 ext1:2;
 
186
   uint32 eop:1;        /* End of Packet */
 
187
   uint32 sop:1;        /* Start of Packet */
 
188
   uint32 rqID:10;      /* rx queue/ring ID */
 
189
   uint32 rssType:4;    /* RSS hash type used */
 
190
   uint32 cnc:1;        /* Checksum Not Calculated */
 
191
   uint32 ext2:1;
 
192
 
 
193
   uint32 rssHash;      /* RSS hash value */
 
194
 
 
195
   uint32 len:14;       /* data length */
 
196
   uint32 err:1;        /* Error */
 
197
   uint32 ts:1;         /* Tag is stripped */
 
198
   uint32 tci:16;       /* Tag stripped */
 
199
 
 
200
   uint32 csum:16;
 
201
   uint32 tuc:1;        /* TCP/UDP Checksum Correct */
 
202
   uint32 udp:1;        /* UDP packet */
 
203
   uint32 tcp:1;        /* TCP packet */
 
204
   uint32 ipc:1;        /* IP Checksum Correct */
 
205
   uint32 v6:1;         /* IPv6 */
 
206
   uint32 v4:1;         /* IPv4 */
 
207
   uint32 frg:1;        /* IP Fragment */
 
208
   uint32 fcs:1;        /* Frame CRC correct */
 
209
   uint32 type:7;       /* completion type */
 
210
   uint32 gen:1;        /* generation bit */
 
211
}
 
212
#include "vmware_pack_end.h"
 
213
Vmxnet3_RxCompDesc;
 
214
 
 
215
/* fields in RxCompDesc we access via Vmxnet3_GenericDesc.dword[3] */
 
216
#define VMXNET3_RCD_TUC_SHIFT  16
 
217
#define VMXNET3_RCD_IPC_SHIFT  19
 
218
 
 
219
/* fields in RxCompDesc we access via Vmxnet3_GenericDesc.qword[1] */
 
220
#define VMXNET3_RCD_TYPE_SHIFT 56
 
221
#define VMXNET3_RCD_GEN_SHIFT  63
 
222
 
 
223
/* csum OK for TCP/UDP pkts over IP */
 
224
#define VMXNET3_RCD_CSUM_OK (1 << VMXNET3_RCD_TUC_SHIFT | 1 << VMXNET3_RCD_IPC_SHIFT)
 
225
 
 
226
/* value of RxCompDesc.rssType */
 
227
#define VMXNET3_RCD_RSS_TYPE_NONE     0
 
228
#define VMXNET3_RCD_RSS_TYPE_IPV4     1
 
229
#define VMXNET3_RCD_RSS_TYPE_TCPIPV4  2
 
230
#define VMXNET3_RCD_RSS_TYPE_IPV6     3
 
231
#define VMXNET3_RCD_RSS_TYPE_TCPIPV6  4
 
232
 
 
233
/* a union for accessing all cmd/completion descriptors */
 
234
typedef union Vmxnet3_GenericDesc {
 
235
   uint64             qword[2];
 
236
   uint32             dword[4];
 
237
   uint16             word[8];
 
238
   Vmxnet3_TxDesc     txd;
 
239
   Vmxnet3_RxDesc     rxd;
 
240
   Vmxnet3_TxCompDesc tcd;
 
241
   Vmxnet3_RxCompDesc rcd;
 
242
} Vmxnet3_GenericDesc;
 
243
 
 
244
#define VMXNET3_INIT_GEN       1
 
245
 
 
246
/* Max size of a single tx buffer */
 
247
#define VMXNET3_MAX_TX_BUF_SIZE  (1 << 14)
 
248
 
 
249
/* # of tx desc needed for a tx buffer size */
 
250
#define VMXNET3_TXD_NEEDED(size) (((size) + VMXNET3_MAX_TX_BUF_SIZE - 1) / VMXNET3_MAX_TX_BUF_SIZE)
 
251
 
 
252
/* max # of tx descs for a non-tso pkt */
 
253
#define VMXNET3_MAX_TXD_PER_PKT 16
 
254
 
 
255
/* Max size of a single rx buffer */
 
256
#define VMXNET3_MAX_RX_BUF_SIZE  ((1 << 14) - 1)
 
257
/* Minimum size of a type 0 buffer */
 
258
#define VMXNET3_MIN_T0_BUF_SIZE  128
 
259
#define VMXNET3_MAX_CSUM_OFFSET  1024
 
260
 
 
261
/* Ring base address alignment */
 
262
#define VMXNET3_RING_BA_ALIGN   512
 
263
#define VMXNET3_RING_BA_MASK    (VMXNET3_RING_BA_ALIGN - 1)
 
264
 
 
265
/* Ring size must be a multiple of 32 */
 
266
#define VMXNET3_RING_SIZE_ALIGN 32
 
267
#define VMXNET3_RING_SIZE_MASK  (VMXNET3_RING_SIZE_ALIGN - 1)
 
268
 
 
269
/* Max ring size */
 
270
#define VMXNET3_TX_RING_MAX_SIZE   4096
 
271
#define VMXNET3_TC_RING_MAX_SIZE   4096
 
272
#define VMXNET3_RX_RING_MAX_SIZE   4096
 
273
#define VMXNET3_RC_RING_MAX_SIZE   8192
 
274
 
 
275
/* a list of reasons for queue stop */
 
276
 
 
277
#define VMXNET3_ERR_NOEOP        0x80000000  /* cannot find the EOP desc of a pkt */
 
278
#define VMXNET3_ERR_TXD_REUSE    0x80000001  /* reuse a TxDesc before tx completion */
 
279
#define VMXNET3_ERR_BIG_PKT      0x80000002  /* too many TxDesc for a pkt */
 
280
#define VMXNET3_ERR_DESC_NOT_SPT 0x80000003  /* descriptor type not supported */
 
281
#define VMXNET3_ERR_SMALL_BUF    0x80000004  /* type 0 buffer too small */
 
282
#define VMXNET3_ERR_STRESS       0x80000005  /* stress option firing in vmkernel */
 
283
#define VMXNET3_ERR_SWITCH       0x80000006  /* mode switch failure */
 
284
#define VMXNET3_ERR_TXD_INVALID  0x80000007  /* invalid TxDesc */
 
285
 
 
286
/* completion descriptor types */
 
287
#define VMXNET3_CDTYPE_TXCOMP      0    /* Tx Completion Descriptor */
 
288
#define VMXNET3_CDTYPE_RXCOMP      3    /* Rx Completion Descriptor */
 
289
 
 
290
#define VMXNET3_GOS_BITS_UNK    0   /* unknown */
 
291
#define VMXNET3_GOS_BITS_32     1
 
292
#define VMXNET3_GOS_BITS_64     2
 
293
 
 
294
#define VMXNET3_GOS_TYPE_UNK        0 /* unknown */
 
295
#define VMXNET3_GOS_TYPE_LINUX      1
 
296
#define VMXNET3_GOS_TYPE_WIN        2
 
297
#define VMXNET3_GOS_TYPE_SOLARIS    3
 
298
#define VMXNET3_GOS_TYPE_FREEBSD    4
 
299
#define VMXNET3_GOS_TYPE_PXE        5
 
300
 
 
301
/* All structures in DriverShared are padded to multiples of 8 bytes */
 
302
 
 
303
typedef
 
304
#include "vmware_pack_begin.h"
 
305
struct Vmxnet3_GOSInfo {
 
306
   uint32   gosBits: 2;     /* 32-bit or 64-bit? */
 
307
   uint32   gosType: 4;     /* which guest */
 
308
   uint32   gosVer:  16;    /* gos version */
 
309
   uint32   gosMisc: 10;    /* other info about gos */
 
310
 
311
#include "vmware_pack_end.h"
 
312
Vmxnet3_GOSInfo;
 
313
 
 
314
typedef
 
315
#include "vmware_pack_begin.h"
 
316
struct Vmxnet3_DriverInfo {
 
317
   uint32          version;        /* driver version */
 
318
   Vmxnet3_GOSInfo gos;
 
319
   uint32          vmxnet3RevSpt;  /* vmxnet3 revision supported */
 
320
   uint32          uptVerSpt;      /* upt version supported */
 
321
}
 
322
#include "vmware_pack_end.h"
 
323
Vmxnet3_DriverInfo;
 
324
 
 
325
#define VMXNET3_REV1_MAGIC  0xbabefee1
 
326
 
 
327
/* 
 
328
 * QueueDescPA must be 128 bytes aligned. It points to an array of
 
329
 * Vmxnet3_TxQueueDesc followed by an array of Vmxnet3_RxQueueDesc.
 
330
 * The number of Vmxnet3_TxQueueDesc/Vmxnet3_RxQueueDesc are specified by
 
331
 * Vmxnet3_MiscConf.numTxQueues/numRxQueues, respectively.
 
332
 */
 
333
#define VMXNET3_QUEUE_DESC_ALIGN  128
 
334
 
 
335
typedef
 
336
#include "vmware_pack_begin.h"
 
337
struct Vmxnet3_MiscConf {
 
338
   Vmxnet3_DriverInfo driverInfo;
 
339
   uint64             uptFeatures;
 
340
   uint64             ddPA;         /* driver data PA */
 
341
   uint64             queueDescPA;  /* queue descriptor table PA */
 
342
   uint32             ddLen;        /* driver data len */
 
343
   uint32             queueDescLen; /* queue descriptor table len, in bytes */
 
344
   uint32             mtu;
 
345
   uint16             maxNumRxSG;
 
346
   uint8              numTxQueues;
 
347
   uint8              numRxQueues;
 
348
   uint32             reserved[4];
 
349
}
 
350
#include "vmware_pack_end.h"
 
351
Vmxnet3_MiscConf;
 
352
 
 
353
typedef
 
354
#include "vmware_pack_begin.h"
 
355
struct vmxnet3_TxQueueConf {
 
356
   uint64    txRingBasePA;
 
357
   uint64    dataRingBasePA;
 
358
   uint64    compRingBasePA;
 
359
   uint64    ddPA;         /* driver data */
 
360
   uint64    reserved;
 
361
   uint32    txRingSize;   /* # of tx desc */
 
362
   uint32    dataRingSize; /* # of data desc */
 
363
   uint32    compRingSize; /* # of comp desc */
 
364
   uint32    ddLen;        /* size of driver data */
 
365
   uint8     intrIdx;
 
366
   uint8     _pad[7];
 
367
}
 
368
#include "vmware_pack_end.h"
 
369
Vmxnet3_TxQueueConf;
 
370
 
 
371
typedef
 
372
#include "vmware_pack_begin.h"
 
373
struct Vmxnet3_RxQueueConf {
 
374
   uint64    rxRingBasePA[2];
 
375
   uint64    compRingBasePA;
 
376
   uint64    ddPA;            /* driver data */
 
377
   uint64    reserved;
 
378
   uint32    rxRingSize[2];   /* # of rx desc */
 
379
   uint32    compRingSize;    /* # of rx comp desc */
 
380
   uint32    ddLen;           /* size of driver data */
 
381
   uint8     intrIdx;
 
382
   uint8     _pad[7];
 
383
}
 
384
#include "vmware_pack_end.h"
 
385
Vmxnet3_RxQueueConf;
 
386
 
 
387
enum vmxnet3_intr_mask_mode {
 
388
   VMXNET3_IMM_AUTO   = 0,
 
389
   VMXNET3_IMM_ACTIVE = 1,
 
390
   VMXNET3_IMM_LAZY   = 2
 
391
};
 
392
 
 
393
enum vmxnet3_intr_type {
 
394
   VMXNET3_IT_AUTO = 0,
 
395
   VMXNET3_IT_INTX = 1,
 
396
   VMXNET3_IT_MSI  = 2,
 
397
   VMXNET3_IT_MSIX = 3
 
398
};
 
399
 
 
400
#define VMXNET3_MAX_TX_QUEUES  8
 
401
#define VMXNET3_MAX_RX_QUEUES  16
 
402
/* addition 1 for events */
 
403
#define VMXNET3_MAX_INTRS      25
 
404
 
 
405
typedef
 
406
#include "vmware_pack_begin.h"
 
407
struct Vmxnet3_IntrConf {
 
408
   Bool   autoMask;
 
409
   uint8  numIntrs;      /* # of interrupts */
 
410
   uint8  eventIntrIdx;
 
411
   uint8  modLevels[VMXNET3_MAX_INTRS]; /* moderation level for each intr */
 
412
   uint32 reserved[3];
 
413
}
 
414
#include "vmware_pack_end.h"
 
415
Vmxnet3_IntrConf;
 
416
 
 
417
/* one bit per VLAN ID, the size is in the units of uint32 */
 
418
#define VMXNET3_VFT_SIZE  (4096 / (sizeof(uint32) * 8))
 
419
 
 
420
typedef
 
421
#include "vmware_pack_begin.h"
 
422
struct Vmxnet3_QueueStatus {
 
423
   Bool    stopped;
 
424
   uint8   _pad[3];
 
425
   uint32  error;
 
426
}
 
427
#include "vmware_pack_end.h"
 
428
Vmxnet3_QueueStatus;
 
429
 
 
430
typedef
 
431
#include "vmware_pack_begin.h"
 
432
struct Vmxnet3_TxQueueCtrl {
 
433
   uint32  txNumDeferred;
 
434
   uint32  txThreshold;
 
435
   uint64  reserved;
 
436
}
 
437
#include "vmware_pack_end.h"
 
438
Vmxnet3_TxQueueCtrl;
 
439
 
 
440
typedef
 
441
#include "vmware_pack_begin.h"
 
442
struct Vmxnet3_RxQueueCtrl {
 
443
   Bool    updateRxProd;
 
444
   uint8   _pad[7];
 
445
   uint64  reserved;
 
446
}
 
447
#include "vmware_pack_end.h"
 
448
Vmxnet3_RxQueueCtrl;
 
449
 
 
450
#define VMXNET3_RXM_UCAST     0x01  /* unicast only */
 
451
#define VMXNET3_RXM_MCAST     0x02  /* multicast passing the filters */
 
452
#define VMXNET3_RXM_BCAST     0x04  /* broadcast only */
 
453
#define VMXNET3_RXM_ALL_MULTI 0x08  /* all multicast */
 
454
#define VMXNET3_RXM_PROMISC   0x10  /* promiscuous */
 
455
 
 
456
typedef
 
457
#include "vmware_pack_begin.h"
 
458
struct Vmxnet3_RxFilterConf {
 
459
   uint32   rxMode;       /* VMXNET3_RXM_xxx */
 
460
   uint16   mfTableLen;   /* size of the multicast filter table */
 
461
   uint16   _pad1;
 
462
   uint64   mfTablePA;    /* PA of the multicast filters table */
 
463
   uint32   vfTable[VMXNET3_VFT_SIZE]; /* vlan filter */
 
464
}
 
465
#include "vmware_pack_end.h"
 
466
Vmxnet3_RxFilterConf;
 
467
 
 
468
#define VMXNET3_PM_MAX_FILTERS        6
 
469
#define VMXNET3_PM_MAX_PATTERN_SIZE   128
 
470
#define VMXNET3_PM_MAX_MASK_SIZE      (VMXNET3_PM_MAX_PATTERN_SIZE / 8)
 
471
 
 
472
#define VMXNET3_PM_WAKEUP_MAGIC       0x01  /* wake up on magic pkts */
 
473
#define VMXNET3_PM_WAKEUP_FILTER      0x02  /* wake up on pkts matching filters */
 
474
 
 
475
typedef
 
476
#include "vmware_pack_begin.h"
 
477
struct Vmxnet3_PM_PktFilter {
 
478
   uint8 maskSize;
 
479
   uint8 patternSize;
 
480
   uint8 mask[VMXNET3_PM_MAX_MASK_SIZE];
 
481
   uint8 pattern[VMXNET3_PM_MAX_PATTERN_SIZE];
 
482
   uint8 pad[6];
 
483
}
 
484
#include "vmware_pack_end.h"
 
485
Vmxnet3_PM_PktFilter;
 
486
 
 
487
typedef
 
488
#include "vmware_pack_begin.h"
 
489
struct Vmxnet3_PMConf {
 
490
   uint16               wakeUpEvents;  /* VMXNET3_PM_WAKEUP_xxx */
 
491
   uint8                numFilters;
 
492
   uint8                pad[5];
 
493
   Vmxnet3_PM_PktFilter filters[VMXNET3_PM_MAX_FILTERS];
 
494
}
 
495
#include "vmware_pack_end.h"
 
496
Vmxnet3_PMConf;
 
497
 
 
498
typedef
 
499
#include "vmware_pack_begin.h"
 
500
struct Vmxnet3_VariableLenConfDesc {
 
501
   uint32              confVer;
 
502
   uint32              confLen;
 
503
   uint64              confPA;
 
504
}
 
505
#include "vmware_pack_end.h"
 
506
Vmxnet3_VariableLenConfDesc;
 
507
 
 
508
typedef
 
509
#include "vmware_pack_begin.h"
 
510
struct Vmxnet3_DSDevRead {
 
511
   /* read-only region for device, read by dev in response to a SET cmd */
 
512
   Vmxnet3_MiscConf     misc;
 
513
   Vmxnet3_IntrConf     intrConf;
 
514
   Vmxnet3_RxFilterConf rxFilterConf;
 
515
   Vmxnet3_VariableLenConfDesc  rssConfDesc;
 
516
   Vmxnet3_VariableLenConfDesc  pmConfDesc;
 
517
   uint64               reserved[2];
 
518
}
 
519
#include "vmware_pack_end.h"
 
520
Vmxnet3_DSDevRead;
 
521
 
 
522
typedef
 
523
#include "vmware_pack_begin.h"
 
524
struct Vmxnet3_TxQueueDesc {
 
525
   Vmxnet3_TxQueueCtrl ctrl;
 
526
   Vmxnet3_TxQueueConf conf;
 
527
   /* Driver read after a GET command */
 
528
   Vmxnet3_QueueStatus status;
 
529
   UPT1_TxStats        stats;
 
530
   uint8               _pad[88]; /* 128 aligned */
 
531
}
 
532
#include "vmware_pack_end.h"
 
533
Vmxnet3_TxQueueDesc;
 
534
 
 
535
typedef
 
536
#include "vmware_pack_begin.h"
 
537
struct Vmxnet3_RxQueueDesc {
 
538
   Vmxnet3_RxQueueCtrl ctrl;
 
539
   Vmxnet3_RxQueueConf conf;
 
540
   /* Driver read after a GET command */
 
541
   Vmxnet3_QueueStatus status;
 
542
   UPT1_RxStats        stats;
 
543
   uint8               _pad[88]; /* 128 aligned */
 
544
}
 
545
#include "vmware_pack_end.h"
 
546
Vmxnet3_RxQueueDesc;
 
547
 
 
548
typedef
 
549
#include "vmware_pack_begin.h"
 
550
struct Vmxnet3_DriverShared {
 
551
   uint32               magic;
 
552
   uint32               pad; /* make devRead start at 64-bit boundaries */
 
553
   Vmxnet3_DSDevRead    devRead;
 
554
   uint32               ecr;
 
555
   uint32               reserved[5];
 
556
}
 
557
#include "vmware_pack_end.h"
 
558
Vmxnet3_DriverShared;
 
559
 
 
560
#define VMXNET3_ECR_RQERR       (1 << 0)
 
561
#define VMXNET3_ECR_TQERR       (1 << 1)
 
562
#define VMXNET3_ECR_LINK        (1 << 2)
 
563
#define VMXNET3_ECR_DIC         (1 << 3)
 
564
#define VMXNET3_ECR_DEBUG       (1 << 4)
 
565
 
 
566
/* flip the gen bit of a ring */
 
567
#define VMXNET3_FLIP_RING_GEN(gen) ((gen) = (gen) ^ 0x1)
 
568
 
 
569
/* only use this if moving the idx won't affect the gen bit */
 
570
#define VMXNET3_INC_RING_IDX_ONLY(idx, ring_size) \
 
571
do {\
 
572
   (idx)++;\
 
573
   if (UNLIKELY((idx) == (ring_size))) {\
 
574
      (idx) = 0;\
 
575
   }\
 
576
} while (0)
 
577
 
 
578
#define VMXNET3_SET_VFTABLE_ENTRY(vfTable, vid) \
 
579
   vfTable[vid >> 5] |= (1 << (vid & 31))
 
580
#define VMXNET3_CLEAR_VFTABLE_ENTRY(vfTable, vid) \
 
581
   vfTable[vid >> 5] &= ~(1 << (vid & 31))
 
582
 
 
583
#define VMXNET3_VFTABLE_ENTRY_IS_SET(vfTable, vid) \
 
584
   ((vfTable[vid >> 5] & (1 << (vid & 31))) != 0)
 
585
 
 
586
#define VMXNET3_MAX_MTU     9000
 
587
#define VMXNET3_MIN_MTU     60
 
588
 
 
589
#define VMXNET3_LINK_UP         (10000 << 16 | 1)    // 10 Gbps, up
 
590
#define VMXNET3_LINK_DOWN       0
 
591
#endif /* _VMXNET3_DEFS_H_ */