0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027 #ifndef _VMXNET3_DEFS_H_
0028 #define _VMXNET3_DEFS_H_
0029
0030 #include "upt1_defs.h"
0031
0032
0033
0034 enum {
0035 VMXNET3_REG_VRRS = 0x0,
0036 VMXNET3_REG_UVRS = 0x8,
0037 VMXNET3_REG_DSAL = 0x10,
0038 VMXNET3_REG_DSAH = 0x18,
0039 VMXNET3_REG_CMD = 0x20,
0040 VMXNET3_REG_MACL = 0x28,
0041 VMXNET3_REG_MACH = 0x30,
0042 VMXNET3_REG_ICR = 0x38,
0043 VMXNET3_REG_ECR = 0x40,
0044 VMXNET3_REG_DCR = 0x48,
0045
0046
0047 VMXNET3_REG_PTCR = 0x88,
0048
0049
0050 };
0051
0052
0053 enum {
0054 VMXNET3_REG_IMR = 0x0,
0055 VMXNET3_REG_TXPROD = 0x600,
0056 VMXNET3_REG_RXPROD = 0x800,
0057 VMXNET3_REG_RXPROD2 = 0xA00
0058 };
0059
0060
0061 enum {
0062 VMXNET3_REG_LB_TXPROD = 0x1000,
0063 VMXNET3_REG_LB_RXPROD = 0x1400,
0064 VMXNET3_REG_LB_RXPROD2 = 0x1800,
0065 };
0066
0067 #define VMXNET3_PT_REG_SIZE 4096
0068 #define VMXNET3_LARGE_PT_REG_SIZE 8192
0069 #define VMXNET3_VD_REG_SIZE 4096
0070 #define VMXNET3_LARGE_BAR0_REG_SIZE (4096 * 4096)
0071 #define VMXNET3_OOB_REG_SIZE (4094 * 4096)
0072
0073 #define VMXNET3_REG_ALIGN 8
0074 #define VMXNET3_REG_ALIGN_MASK 0x7
0075
0076
0077 #define VMXNET3_IO_TYPE_PT 0
0078 #define VMXNET3_IO_TYPE_VD 1
0079 #define VMXNET3_IO_ADDR(type, reg) (((type) << 24) | ((reg) & 0xFFFFFF))
0080 #define VMXNET3_IO_TYPE(addr) ((addr) >> 24)
0081 #define VMXNET3_IO_REG(addr) ((addr) & 0xFFFFFF)
0082
0083 enum {
0084 VMXNET3_CMD_FIRST_SET = 0xCAFE0000,
0085 VMXNET3_CMD_ACTIVATE_DEV = VMXNET3_CMD_FIRST_SET,
0086 VMXNET3_CMD_QUIESCE_DEV,
0087 VMXNET3_CMD_RESET_DEV,
0088 VMXNET3_CMD_UPDATE_RX_MODE,
0089 VMXNET3_CMD_UPDATE_MAC_FILTERS,
0090 VMXNET3_CMD_UPDATE_VLAN_FILTERS,
0091 VMXNET3_CMD_UPDATE_RSSIDT,
0092 VMXNET3_CMD_UPDATE_IML,
0093 VMXNET3_CMD_UPDATE_PMCFG,
0094 VMXNET3_CMD_UPDATE_FEATURE,
0095 VMXNET3_CMD_RESERVED1,
0096 VMXNET3_CMD_LOAD_PLUGIN,
0097 VMXNET3_CMD_RESERVED2,
0098 VMXNET3_CMD_RESERVED3,
0099 VMXNET3_CMD_SET_COALESCE,
0100 VMXNET3_CMD_REGISTER_MEMREGS,
0101 VMXNET3_CMD_SET_RSS_FIELDS,
0102 VMXNET3_CMD_RESERVED4,
0103 VMXNET3_CMD_RESERVED5,
0104 VMXNET3_CMD_SET_RING_BUFFER_SIZE,
0105
0106 VMXNET3_CMD_FIRST_GET = 0xF00D0000,
0107 VMXNET3_CMD_GET_QUEUE_STATUS = VMXNET3_CMD_FIRST_GET,
0108 VMXNET3_CMD_GET_STATS,
0109 VMXNET3_CMD_GET_LINK,
0110 VMXNET3_CMD_GET_PERM_MAC_LO,
0111 VMXNET3_CMD_GET_PERM_MAC_HI,
0112 VMXNET3_CMD_GET_DID_LO,
0113 VMXNET3_CMD_GET_DID_HI,
0114 VMXNET3_CMD_GET_DEV_EXTRA_INFO,
0115 VMXNET3_CMD_GET_CONF_INTR,
0116 VMXNET3_CMD_GET_RESERVED1,
0117 VMXNET3_CMD_GET_TXDATA_DESC_SIZE,
0118 VMXNET3_CMD_GET_COALESCE,
0119 VMXNET3_CMD_GET_RSS_FIELDS,
0120 VMXNET3_CMD_GET_RESERVED2,
0121 VMXNET3_CMD_GET_RESERVED3,
0122 VMXNET3_CMD_GET_MAX_QUEUES_CONF,
0123 VMXNET3_CMD_GET_RESERVED4,
0124 VMXNET3_CMD_GET_MAX_CAPABILITIES,
0125 VMXNET3_CMD_GET_DCR0_REG,
0126 };
0127
0128
0129
0130
0131
0132
0133
0134
0135
0136
0137
0138
0139
0140
0141
0142
0143
0144
0145
0146 struct Vmxnet3_TxDesc {
0147 __le64 addr;
0148
0149 #ifdef __BIG_ENDIAN_BITFIELD
0150 u32 msscof:14;
0151 u32 ext1:1;
0152 u32 dtype:1;
0153 u32 oco:1;
0154 u32 gen:1;
0155 u32 len:14;
0156 #else
0157 u32 len:14;
0158 u32 gen:1;
0159 u32 oco:1;
0160 u32 dtype:1;
0161 u32 ext1:1;
0162 u32 msscof:14;
0163 #endif
0164
0165 #ifdef __BIG_ENDIAN_BITFIELD
0166 u32 tci:16;
0167 u32 ti:1;
0168 u32 ext2:1;
0169 u32 cq:1;
0170 u32 eop:1;
0171 u32 om:2;
0172 u32 hlen:10;
0173 #else
0174 u32 hlen:10;
0175 u32 om:2;
0176 u32 eop:1;
0177 u32 cq:1;
0178 u32 ext2:1;
0179 u32 ti:1;
0180 u32 tci:16;
0181 #endif
0182 };
0183
0184
0185 #define VMXNET3_OM_NONE 0
0186 #define VMXNET3_OM_ENCAP 1
0187 #define VMXNET3_OM_CSUM 2
0188 #define VMXNET3_OM_TSO 3
0189
0190
0191 #define VMXNET3_TXD_EOP_SHIFT 12
0192 #define VMXNET3_TXD_CQ_SHIFT 13
0193 #define VMXNET3_TXD_GEN_SHIFT 14
0194 #define VMXNET3_TXD_EOP_DWORD_SHIFT 3
0195 #define VMXNET3_TXD_GEN_DWORD_SHIFT 2
0196
0197 #define VMXNET3_TXD_CQ (1 << VMXNET3_TXD_CQ_SHIFT)
0198 #define VMXNET3_TXD_EOP (1 << VMXNET3_TXD_EOP_SHIFT)
0199 #define VMXNET3_TXD_GEN (1 << VMXNET3_TXD_GEN_SHIFT)
0200
0201 #define VMXNET3_HDR_COPY_SIZE 128
0202
0203
0204 struct Vmxnet3_TxDataDesc {
0205 u8 data[VMXNET3_HDR_COPY_SIZE];
0206 };
0207
0208 typedef u8 Vmxnet3_RxDataDesc;
0209
0210 #define VMXNET3_TCD_GEN_SHIFT 31
0211 #define VMXNET3_TCD_GEN_SIZE 1
0212 #define VMXNET3_TCD_TXIDX_SHIFT 0
0213 #define VMXNET3_TCD_TXIDX_SIZE 12
0214 #define VMXNET3_TCD_GEN_DWORD_SHIFT 3
0215
0216 struct Vmxnet3_TxCompDesc {
0217 u32 txdIdx:12;
0218 u32 ext1:20;
0219
0220 __le32 ext2;
0221 __le32 ext3;
0222
0223 u32 rsvd:24;
0224 u32 type:7;
0225 u32 gen:1;
0226 };
0227
0228 struct Vmxnet3_RxDesc {
0229 __le64 addr;
0230
0231 #ifdef __BIG_ENDIAN_BITFIELD
0232 u32 gen:1;
0233 u32 rsvd:15;
0234 u32 dtype:1;
0235 u32 btype:1;
0236 u32 len:14;
0237 #else
0238 u32 len:14;
0239 u32 btype:1;
0240 u32 dtype:1;
0241 u32 rsvd:15;
0242 u32 gen:1;
0243 #endif
0244 u32 ext1;
0245 };
0246
0247
0248 #define VMXNET3_RXD_BTYPE_HEAD 0
0249 #define VMXNET3_RXD_BTYPE_BODY 1
0250
0251
0252 #define VMXNET3_RXD_BTYPE_SHIFT 14
0253 #define VMXNET3_RXD_GEN_SHIFT 31
0254
0255 #define VMXNET3_RCD_HDR_INNER_SHIFT 13
0256
0257 struct Vmxnet3_RxCompDesc {
0258 #ifdef __BIG_ENDIAN_BITFIELD
0259 u32 ext2:1;
0260 u32 cnc:1;
0261 u32 rssType:4;
0262 u32 rqID:10;
0263 u32 sop:1;
0264 u32 eop:1;
0265 u32 ext1:2;
0266
0267 u32 rxdIdx:12;
0268 #else
0269 u32 rxdIdx:12;
0270 u32 ext1:2;
0271
0272 u32 eop:1;
0273 u32 sop:1;
0274 u32 rqID:10;
0275 u32 rssType:4;
0276 u32 cnc:1;
0277 u32 ext2:1;
0278 #endif
0279
0280 __le32 rssHash;
0281
0282 #ifdef __BIG_ENDIAN_BITFIELD
0283 u32 tci:16;
0284 u32 ts:1;
0285 u32 err:1;
0286 u32 len:14;
0287 #else
0288 u32 len:14;
0289 u32 err:1;
0290 u32 ts:1;
0291 u32 tci:16;
0292 #endif
0293
0294
0295 #ifdef __BIG_ENDIAN_BITFIELD
0296 u32 gen:1;
0297 u32 type:7;
0298 u32 fcs:1;
0299 u32 frg:1;
0300 u32 v4:1;
0301 u32 v6:1;
0302 u32 ipc:1;
0303 u32 tcp:1;
0304 u32 udp:1;
0305 u32 tuc:1;
0306 u32 csum:16;
0307 #else
0308 u32 csum:16;
0309 u32 tuc:1;
0310 u32 udp:1;
0311 u32 tcp:1;
0312 u32 ipc:1;
0313 u32 v6:1;
0314 u32 v4:1;
0315 u32 frg:1;
0316 u32 fcs:1;
0317 u32 type:7;
0318 u32 gen:1;
0319 #endif
0320 };
0321
0322 struct Vmxnet3_RxCompDescExt {
0323 __le32 dword1;
0324 u8 segCnt;
0325 u8 dupAckCnt;
0326 __le16 tsDelta;
0327 __le32 dword2;
0328 #ifdef __BIG_ENDIAN_BITFIELD
0329 u32 gen:1;
0330 u32 type:7;
0331 u32 fcs:1;
0332 u32 frg:1;
0333 u32 v4:1;
0334 u32 v6:1;
0335 u32 ipc:1;
0336 u32 tcp:1;
0337 u32 udp:1;
0338 u32 tuc:1;
0339 u32 mss:16;
0340 #else
0341 u32 mss:16;
0342 u32 tuc:1;
0343 u32 udp:1;
0344 u32 tcp:1;
0345 u32 ipc:1;
0346 u32 v6:1;
0347 u32 v4:1;
0348 u32 frg:1;
0349 u32 fcs:1;
0350 u32 type:7;
0351 u32 gen:1;
0352 #endif
0353 };
0354
0355
0356
0357 #define VMXNET3_RCD_TUC_SHIFT 16
0358 #define VMXNET3_RCD_IPC_SHIFT 19
0359
0360
0361 #define VMXNET3_RCD_TYPE_SHIFT 56
0362 #define VMXNET3_RCD_GEN_SHIFT 63
0363
0364
0365 #define VMXNET3_RCD_CSUM_OK (1 << VMXNET3_RCD_TUC_SHIFT | \
0366 1 << VMXNET3_RCD_IPC_SHIFT)
0367 #define VMXNET3_TXD_GEN_SIZE 1
0368 #define VMXNET3_TXD_EOP_SIZE 1
0369
0370
0371 #define VMXNET3_RCD_RSS_TYPE_NONE 0
0372 #define VMXNET3_RCD_RSS_TYPE_IPV4 1
0373 #define VMXNET3_RCD_RSS_TYPE_TCPIPV4 2
0374 #define VMXNET3_RCD_RSS_TYPE_IPV6 3
0375 #define VMXNET3_RCD_RSS_TYPE_TCPIPV6 4
0376 #define VMXNET3_RCD_RSS_TYPE_UDPIPV4 5
0377 #define VMXNET3_RCD_RSS_TYPE_UDPIPV6 6
0378 #define VMXNET3_RCD_RSS_TYPE_ESPIPV4 7
0379 #define VMXNET3_RCD_RSS_TYPE_ESPIPV6 8
0380
0381
0382
0383 union Vmxnet3_GenericDesc {
0384 __le64 qword[2];
0385 __le32 dword[4];
0386 __le16 word[8];
0387 struct Vmxnet3_TxDesc txd;
0388 struct Vmxnet3_RxDesc rxd;
0389 struct Vmxnet3_TxCompDesc tcd;
0390 struct Vmxnet3_RxCompDesc rcd;
0391 struct Vmxnet3_RxCompDescExt rcdExt;
0392 };
0393
0394 #define VMXNET3_INIT_GEN 1
0395
0396
0397 #define VMXNET3_MAX_TX_BUF_SIZE (1 << 14)
0398
0399
0400 #define VMXNET3_TXD_NEEDED(size) (((size) + VMXNET3_MAX_TX_BUF_SIZE - 1) / \
0401 VMXNET3_MAX_TX_BUF_SIZE)
0402
0403
0404 #define VMXNET3_MAX_TXD_PER_PKT 16
0405
0406 #define VMXNET3_MAX_TSO_TXD_PER_PKT 24
0407
0408
0409 #define VMXNET3_MAX_RX_BUF_SIZE ((1 << 14) - 1)
0410
0411 #define VMXNET3_MIN_T0_BUF_SIZE 128
0412 #define VMXNET3_MAX_CSUM_OFFSET 1024
0413
0414
0415 #define VMXNET3_RING_BA_ALIGN 512
0416 #define VMXNET3_RING_BA_MASK (VMXNET3_RING_BA_ALIGN - 1)
0417
0418
0419 #define VMXNET3_RING_SIZE_ALIGN 32
0420 #define VMXNET3_RING_SIZE_MASK (VMXNET3_RING_SIZE_ALIGN - 1)
0421
0422
0423 #define VMXNET3_TXDATA_DESC_SIZE_ALIGN 64
0424 #define VMXNET3_TXDATA_DESC_SIZE_MASK (VMXNET3_TXDATA_DESC_SIZE_ALIGN - 1)
0425
0426
0427 #define VMXNET3_RXDATA_DESC_SIZE_ALIGN 64
0428 #define VMXNET3_RXDATA_DESC_SIZE_MASK (VMXNET3_RXDATA_DESC_SIZE_ALIGN - 1)
0429
0430
0431 #define VMXNET3_TX_RING_MAX_SIZE 4096
0432 #define VMXNET3_TC_RING_MAX_SIZE 4096
0433 #define VMXNET3_RX_RING_MAX_SIZE 4096
0434 #define VMXNET3_RX_RING2_MAX_SIZE 4096
0435 #define VMXNET3_RC_RING_MAX_SIZE 8192
0436
0437 #define VMXNET3_TXDATA_DESC_MIN_SIZE 128
0438 #define VMXNET3_TXDATA_DESC_MAX_SIZE 2048
0439
0440 #define VMXNET3_RXDATA_DESC_MAX_SIZE 2048
0441
0442
0443
0444 enum {
0445 VMXNET3_ERR_NOEOP = 0x80000000,
0446 VMXNET3_ERR_TXD_REUSE = 0x80000001,
0447 VMXNET3_ERR_BIG_PKT = 0x80000002,
0448 VMXNET3_ERR_DESC_NOT_SPT = 0x80000003,
0449 VMXNET3_ERR_SMALL_BUF = 0x80000004,
0450 VMXNET3_ERR_STRESS = 0x80000005,
0451 VMXNET3_ERR_SWITCH = 0x80000006,
0452 VMXNET3_ERR_TXD_INVALID = 0x80000007,
0453 };
0454
0455
0456 #define VMXNET3_CDTYPE_TXCOMP 0
0457 #define VMXNET3_CDTYPE_RXCOMP 3
0458 #define VMXNET3_CDTYPE_RXCOMP_LRO 4
0459
0460 enum {
0461 VMXNET3_GOS_BITS_UNK = 0,
0462 VMXNET3_GOS_BITS_32 = 1,
0463 VMXNET3_GOS_BITS_64 = 2,
0464 };
0465
0466 #define VMXNET3_GOS_TYPE_LINUX 1
0467
0468
0469 struct Vmxnet3_GOSInfo {
0470 #ifdef __BIG_ENDIAN_BITFIELD
0471 u32 gosMisc:10;
0472 u32 gosVer:16;
0473 u32 gosType:4;
0474 u32 gosBits:2;
0475 #else
0476 u32 gosBits:2;
0477 u32 gosType:4;
0478 u32 gosVer:16;
0479 u32 gosMisc:10;
0480 #endif
0481 };
0482
0483 struct Vmxnet3_DriverInfo {
0484 __le32 version;
0485 struct Vmxnet3_GOSInfo gos;
0486 __le32 vmxnet3RevSpt;
0487 __le32 uptVerSpt;
0488 };
0489
0490
0491 #define VMXNET3_REV1_MAGIC 3133079265u
0492
0493
0494
0495
0496
0497
0498
0499 #define VMXNET3_QUEUE_DESC_ALIGN 128
0500
0501
0502 struct Vmxnet3_MiscConf {
0503 struct Vmxnet3_DriverInfo driverInfo;
0504 __le64 uptFeatures;
0505 __le64 ddPA;
0506 __le64 queueDescPA;
0507 __le32 ddLen;
0508 __le32 queueDescLen;
0509 __le32 mtu;
0510 __le16 maxNumRxSG;
0511 u8 numTxQueues;
0512 u8 numRxQueues;
0513 __le32 reserved[4];
0514 };
0515
0516
0517 struct Vmxnet3_TxQueueConf {
0518 __le64 txRingBasePA;
0519 __le64 dataRingBasePA;
0520 __le64 compRingBasePA;
0521 __le64 ddPA;
0522 __le64 reserved;
0523 __le32 txRingSize;
0524 __le32 dataRingSize;
0525 __le32 compRingSize;
0526 __le32 ddLen;
0527 u8 intrIdx;
0528 u8 _pad1[1];
0529 __le16 txDataRingDescSize;
0530 u8 _pad2[4];
0531 };
0532
0533
0534 struct Vmxnet3_RxQueueConf {
0535 __le64 rxRingBasePA[2];
0536 __le64 compRingBasePA;
0537 __le64 ddPA;
0538 __le64 rxDataRingBasePA;
0539 __le32 rxRingSize[2];
0540 __le32 compRingSize;
0541 __le32 ddLen;
0542 u8 intrIdx;
0543 u8 _pad1[1];
0544 __le16 rxDataRingDescSize;
0545 u8 _pad2[4];
0546 };
0547
0548
0549 enum vmxnet3_intr_mask_mode {
0550 VMXNET3_IMM_AUTO = 0,
0551 VMXNET3_IMM_ACTIVE = 1,
0552 VMXNET3_IMM_LAZY = 2
0553 };
0554
0555 enum vmxnet3_intr_type {
0556 VMXNET3_IT_AUTO = 0,
0557 VMXNET3_IT_INTX = 1,
0558 VMXNET3_IT_MSI = 2,
0559 VMXNET3_IT_MSIX = 3
0560 };
0561
0562 #define VMXNET3_MAX_TX_QUEUES 8
0563 #define VMXNET3_MAX_RX_QUEUES 16
0564
0565 #define VMXNET3_MAX_INTRS 25
0566
0567
0568 #define VMXNET3_EXT_MAX_TX_QUEUES 32
0569 #define VMXNET3_EXT_MAX_RX_QUEUES 32
0570
0571 #define VMXNET3_EXT_MAX_INTRS 65
0572 #define VMXNET3_FIRST_SET_INTRS 64
0573
0574
0575 #define VMXNET3_IC_DISABLE_ALL 0x1
0576
0577
0578 struct Vmxnet3_IntrConf {
0579 bool autoMask;
0580 u8 numIntrs;
0581 u8 eventIntrIdx;
0582 u8 modLevels[VMXNET3_MAX_INTRS];
0583
0584 __le32 intrCtrl;
0585 __le32 reserved[2];
0586 };
0587
0588 struct Vmxnet3_IntrConfExt {
0589 u8 autoMask;
0590 u8 numIntrs;
0591 u8 eventIntrIdx;
0592 u8 reserved;
0593 __le32 intrCtrl;
0594 __le32 reserved1;
0595 u8 modLevels[VMXNET3_EXT_MAX_INTRS];
0596
0597
0598 u8 reserved2[3];
0599 };
0600
0601
0602 #define VMXNET3_VFT_SIZE (4096 / (sizeof(u32) * 8))
0603
0604
0605 struct Vmxnet3_QueueStatus {
0606 bool stopped;
0607 u8 _pad[3];
0608 __le32 error;
0609 };
0610
0611
0612 struct Vmxnet3_TxQueueCtrl {
0613 __le32 txNumDeferred;
0614 __le32 txThreshold;
0615 __le64 reserved;
0616 };
0617
0618
0619 struct Vmxnet3_RxQueueCtrl {
0620 bool updateRxProd;
0621 u8 _pad[7];
0622 __le64 reserved;
0623 };
0624
0625 enum {
0626 VMXNET3_RXM_UCAST = 0x01,
0627 VMXNET3_RXM_MCAST = 0x02,
0628 VMXNET3_RXM_BCAST = 0x04,
0629 VMXNET3_RXM_ALL_MULTI = 0x08,
0630 VMXNET3_RXM_PROMISC = 0x10
0631 };
0632
0633 struct Vmxnet3_RxFilterConf {
0634 __le32 rxMode;
0635 __le16 mfTableLen;
0636 __le16 _pad1;
0637 __le64 mfTablePA;
0638 __le32 vfTable[VMXNET3_VFT_SIZE];
0639 };
0640
0641
0642 #define VMXNET3_PM_MAX_FILTERS 6
0643 #define VMXNET3_PM_MAX_PATTERN_SIZE 128
0644 #define VMXNET3_PM_MAX_MASK_SIZE (VMXNET3_PM_MAX_PATTERN_SIZE / 8)
0645
0646 #define VMXNET3_PM_WAKEUP_MAGIC cpu_to_le16(0x01)
0647 #define VMXNET3_PM_WAKEUP_FILTER cpu_to_le16(0x02)
0648
0649
0650
0651 struct Vmxnet3_PM_PktFilter {
0652 u8 maskSize;
0653 u8 patternSize;
0654 u8 mask[VMXNET3_PM_MAX_MASK_SIZE];
0655 u8 pattern[VMXNET3_PM_MAX_PATTERN_SIZE];
0656 u8 pad[6];
0657 };
0658
0659
0660 struct Vmxnet3_PMConf {
0661 __le16 wakeUpEvents;
0662 u8 numFilters;
0663 u8 pad[5];
0664 struct Vmxnet3_PM_PktFilter filters[VMXNET3_PM_MAX_FILTERS];
0665 };
0666
0667
0668 struct Vmxnet3_VariableLenConfDesc {
0669 __le32 confVer;
0670 __le32 confLen;
0671 __le64 confPA;
0672 };
0673
0674
0675 struct Vmxnet3_TxQueueDesc {
0676 struct Vmxnet3_TxQueueCtrl ctrl;
0677 struct Vmxnet3_TxQueueConf conf;
0678
0679
0680 struct Vmxnet3_QueueStatus status;
0681 struct UPT1_TxStats stats;
0682 u8 _pad[88];
0683 };
0684
0685
0686 struct Vmxnet3_RxQueueDesc {
0687 struct Vmxnet3_RxQueueCtrl ctrl;
0688 struct Vmxnet3_RxQueueConf conf;
0689
0690 struct Vmxnet3_QueueStatus status;
0691 struct UPT1_RxStats stats;
0692 u8 __pad[88];
0693 };
0694
0695 struct Vmxnet3_SetPolling {
0696 u8 enablePolling;
0697 };
0698
0699 #define VMXNET3_COAL_STATIC_MAX_DEPTH 128
0700 #define VMXNET3_COAL_RBC_MIN_RATE 100
0701 #define VMXNET3_COAL_RBC_MAX_RATE 100000
0702
0703 enum Vmxnet3_CoalesceMode {
0704 VMXNET3_COALESCE_DISABLED = 0,
0705 VMXNET3_COALESCE_ADAPT = 1,
0706 VMXNET3_COALESCE_STATIC = 2,
0707 VMXNET3_COALESCE_RBC = 3
0708 };
0709
0710 struct Vmxnet3_CoalesceRbc {
0711 u32 rbc_rate;
0712 };
0713
0714 struct Vmxnet3_CoalesceStatic {
0715 u32 tx_depth;
0716 u32 tx_comp_depth;
0717 u32 rx_depth;
0718 };
0719
0720 struct Vmxnet3_CoalesceScheme {
0721 enum Vmxnet3_CoalesceMode coalMode;
0722 union {
0723 struct Vmxnet3_CoalesceRbc coalRbc;
0724 struct Vmxnet3_CoalesceStatic coalStatic;
0725 } coalPara;
0726 };
0727
0728 struct Vmxnet3_MemoryRegion {
0729 __le64 startPA;
0730 __le32 length;
0731 __le16 txQueueBits;
0732 __le16 rxQueueBits;
0733 };
0734
0735 #define MAX_MEMORY_REGION_PER_QUEUE 16
0736 #define MAX_MEMORY_REGION_PER_DEVICE 256
0737
0738 struct Vmxnet3_MemRegs {
0739 __le16 numRegs;
0740 __le16 pad[3];
0741 struct Vmxnet3_MemoryRegion memRegs[1];
0742 };
0743
0744 enum Vmxnet3_RSSField {
0745 VMXNET3_RSS_FIELDS_TCPIP4 = 0x0001,
0746 VMXNET3_RSS_FIELDS_TCPIP6 = 0x0002,
0747 VMXNET3_RSS_FIELDS_UDPIP4 = 0x0004,
0748 VMXNET3_RSS_FIELDS_UDPIP6 = 0x0008,
0749 VMXNET3_RSS_FIELDS_ESPIP4 = 0x0010,
0750 VMXNET3_RSS_FIELDS_ESPIP6 = 0x0020,
0751 };
0752
0753 struct Vmxnet3_RingBufferSize {
0754 __le16 ring1BufSizeType0;
0755 __le16 ring1BufSizeType1;
0756 __le16 ring2BufSizeType1;
0757 __le16 pad;
0758 };
0759
0760
0761
0762
0763 union Vmxnet3_CmdInfo {
0764 struct Vmxnet3_VariableLenConfDesc varConf;
0765 struct Vmxnet3_SetPolling setPolling;
0766 enum Vmxnet3_RSSField setRssFields;
0767 struct Vmxnet3_RingBufferSize ringBufSize;
0768 __le64 data[2];
0769 };
0770
0771 struct Vmxnet3_DSDevRead {
0772
0773 struct Vmxnet3_MiscConf misc;
0774 struct Vmxnet3_IntrConf intrConf;
0775 struct Vmxnet3_RxFilterConf rxFilterConf;
0776 struct Vmxnet3_VariableLenConfDesc rssConfDesc;
0777 struct Vmxnet3_VariableLenConfDesc pmConfDesc;
0778 struct Vmxnet3_VariableLenConfDesc pluginConfDesc;
0779 };
0780
0781 struct Vmxnet3_DSDevReadExt {
0782
0783 struct Vmxnet3_IntrConfExt intrConfExt;
0784 };
0785
0786
0787 struct Vmxnet3_DriverShared {
0788 __le32 magic;
0789
0790 __le32 size;
0791 struct Vmxnet3_DSDevRead devRead;
0792 __le32 ecr;
0793 __le32 reserved;
0794 union {
0795 __le32 reserved1[4];
0796 union Vmxnet3_CmdInfo cmdInfo;
0797
0798
0799
0800 } cu;
0801 struct Vmxnet3_DSDevReadExt devReadExt;
0802 };
0803
0804
0805 #define VMXNET3_ECR_RQERR (1 << 0)
0806 #define VMXNET3_ECR_TQERR (1 << 1)
0807 #define VMXNET3_ECR_LINK (1 << 2)
0808 #define VMXNET3_ECR_DIC (1 << 3)
0809 #define VMXNET3_ECR_DEBUG (1 << 4)
0810
0811
0812 #define VMXNET3_FLIP_RING_GEN(gen) ((gen) = (gen) ^ 0x1)
0813
0814
0815 #define VMXNET3_INC_RING_IDX_ONLY(idx, ring_size) \
0816 do {\
0817 (idx)++;\
0818 if (unlikely((idx) == (ring_size))) {\
0819 (idx) = 0;\
0820 } \
0821 } while (0)
0822
0823 #define VMXNET3_SET_VFTABLE_ENTRY(vfTable, vid) \
0824 (vfTable[vid >> 5] |= (1 << (vid & 31)))
0825 #define VMXNET3_CLEAR_VFTABLE_ENTRY(vfTable, vid) \
0826 (vfTable[vid >> 5] &= ~(1 << (vid & 31)))
0827
0828 #define VMXNET3_VFTABLE_ENTRY_IS_SET(vfTable, vid) \
0829 ((vfTable[vid >> 5] & (1 << (vid & 31))) != 0)
0830
0831 #define VMXNET3_MAX_MTU 9000
0832 #define VMXNET3_V6_MAX_MTU 9190
0833 #define VMXNET3_MIN_MTU 60
0834
0835 #define VMXNET3_LINK_UP (10000 << 16 | 1)
0836 #define VMXNET3_LINK_DOWN 0
0837
0838 #define VMXNET3_DCR_ERROR 31
0839 #define VMXNET3_CAP_UDP_RSS 0
0840 #define VMXNET3_CAP_ESP_RSS_IPV4 1
0841 #define VMXNET3_CAP_GENEVE_CHECKSUM_OFFLOAD 2
0842 #define VMXNET3_CAP_GENEVE_TSO 3
0843 #define VMXNET3_CAP_VXLAN_CHECKSUM_OFFLOAD 4
0844 #define VMXNET3_CAP_VXLAN_TSO 5
0845 #define VMXNET3_CAP_GENEVE_OUTER_CHECKSUM_OFFLOAD 6
0846 #define VMXNET3_CAP_VXLAN_OUTER_CHECKSUM_OFFLOAD 7
0847 #define VMXNET3_CAP_PKT_STEERING_IPV4 8
0848 #define VMXNET3_CAP_VERSION_4_MAX VMXNET3_CAP_PKT_STEERING_IPV4
0849 #define VMXNET3_CAP_ESP_RSS_IPV6 9
0850 #define VMXNET3_CAP_VERSION_5_MAX VMXNET3_CAP_ESP_RSS_IPV6
0851 #define VMXNET3_CAP_ESP_OVER_UDP_RSS 10
0852 #define VMXNET3_CAP_INNER_RSS 11
0853 #define VMXNET3_CAP_INNER_ESP_RSS 12
0854 #define VMXNET3_CAP_CRC32_HASH_FUNC 13
0855 #define VMXNET3_CAP_VERSION_6_MAX VMXNET3_CAP_CRC32_HASH_FUNC
0856 #define VMXNET3_CAP_OAM_FILTER 14
0857 #define VMXNET3_CAP_ESP_QS 15
0858 #define VMXNET3_CAP_LARGE_BAR 16
0859 #define VMXNET3_CAP_OOORX_COMP 17
0860 #define VMXNET3_CAP_VERSION_7_MAX 18
0861
0862 #define VMXNET3_CAP_MAX VMXNET3_CAP_VERSION_7_MAX
0863
0864 #endif