1 /*- 2 * Copyright (c) 2013 Tsubai Masanari 3 * 4 * Permission to use, copy, modify, and distribute this software for any 5 * purpose with or without fee is hereby granted, provided that the above 6 * copyright notice and this permission notice appear in all copies. 7 * 8 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 9 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 10 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 11 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 12 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 13 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 14 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 15 * 16 * $OpenBSD: src/sys/dev/pci/if_vmxreg.h,v 1.2 2013/06/12 01:07:33 uebayasi Exp $ 17 * 18 * $FreeBSD: head/sys/dev/vmware/vmxnet3/if_vmxreg.h 263259 2014-03-17 05:45:29Z bryanv $ 19 */ 20 21 #ifndef _IF_VMXREG_H 22 #define _IF_VMXREG_H 23 24 struct UPT1_TxStats { 25 uint64_t TSO_packets; 26 uint64_t TSO_bytes; 27 uint64_t ucast_packets; 28 uint64_t ucast_bytes; 29 uint64_t mcast_packets; 30 uint64_t mcast_bytes; 31 uint64_t bcast_packets; 32 uint64_t bcast_bytes; 33 uint64_t error; 34 uint64_t discard; 35 } __packed; 36 37 struct UPT1_RxStats { 38 uint64_t LRO_packets; 39 uint64_t LRO_bytes; 40 uint64_t ucast_packets; 41 uint64_t ucast_bytes; 42 uint64_t mcast_packets; 43 uint64_t mcast_bytes; 44 uint64_t bcast_packets; 45 uint64_t bcast_bytes; 46 uint64_t nobuffer; 47 uint64_t error; 48 } __packed; 49 50 /* Interrupt moderation levels */ 51 #define UPT1_IMOD_NONE 0 /* No moderation */ 52 #define UPT1_IMOD_HIGHEST 7 /* Least interrupts */ 53 #define UPT1_IMOD_ADAPTIVE 8 /* Adaptive interrupt moderation */ 54 55 /* Hardware features */ 56 #define UPT1_F_CSUM 0x0001 /* Rx checksum verification */ 57 #define UPT1_F_RSS 0x0002 /* Receive side scaling */ 58 #define UPT1_F_VLAN 0x0004 /* VLAN tag stripping */ 59 #define UPT1_F_LRO 0x0008 /* Large receive offloading */ 60 61 #define VMXNET3_BAR0_IMASK(irq) (0x000 + (irq) * 8) /* Interrupt mask */ 62 #define VMXNET3_BAR0_TXH(q) (0x600 + (q) * 8) /* Tx head */ 63 #define VMXNET3_BAR0_RXH1(q) (0x800 + (q) * 8) /* Ring1 Rx head */ 64 #define VMXNET3_BAR0_RXH2(q) (0xA00 + (q) * 8) /* Ring2 Rx head */ 65 #define VMXNET3_BAR1_VRRS 0x000 /* VMXNET3 revision report selection */ 66 #define VMXNET3_BAR1_UVRS 0x008 /* UPT version report selection */ 67 #define VMXNET3_BAR1_DSL 0x010 /* Driver shared address low */ 68 #define VMXNET3_BAR1_DSH 0x018 /* Driver shared address high */ 69 #define VMXNET3_BAR1_CMD 0x020 /* Command */ 70 #define VMXNET3_BAR1_MACL 0x028 /* MAC address low */ 71 #define VMXNET3_BAR1_MACH 0x030 /* MAC address high */ 72 #define VMXNET3_BAR1_INTR 0x038 /* Interrupt status */ 73 #define VMXNET3_BAR1_EVENT 0x040 /* Event status */ 74 75 #define VMXNET3_CMD_ENABLE 0xCAFE0000 /* Enable VMXNET3 */ 76 #define VMXNET3_CMD_DISABLE 0xCAFE0001 /* Disable VMXNET3 */ 77 #define VMXNET3_CMD_RESET 0xCAFE0002 /* Reset device */ 78 #define VMXNET3_CMD_SET_RXMODE 0xCAFE0003 /* Set interface flags */ 79 #define VMXNET3_CMD_SET_FILTER 0xCAFE0004 /* Set address filter */ 80 #define VMXNET3_CMD_VLAN_FILTER 0xCAFE0005 /* Set VLAN filter */ 81 #define VMXNET3_CMD_GET_STATUS 0xF00D0000 /* Get queue errors */ 82 #define VMXNET3_CMD_GET_STATS 0xF00D0001 /* Get queue statistics */ 83 #define VMXNET3_CMD_GET_LINK 0xF00D0002 /* Get link status */ 84 #define VMXNET3_CMD_GET_MACL 0xF00D0003 /* Get MAC address low */ 85 #define VMXNET3_CMD_GET_MACH 0xF00D0004 /* Get MAC address high */ 86 #define VMXNET3_CMD_GET_INTRCFG 0xF00D0008 /* Get interrupt config */ 87 88 #define VMXNET3_DMADESC_ALIGN 128 89 #define VMXNET3_INIT_GEN 1 90 91 struct vmxnet3_txdesc { 92 uint64_t addr; 93 94 uint32_t len:14; 95 uint32_t gen:1; /* Generation */ 96 uint32_t pad1:1; 97 uint32_t dtype:1; /* Descriptor type */ 98 uint32_t pad2:1; 99 uint32_t offload_pos:14; /* Offloading position */ 100 101 uint32_t hlen:10; /* Header len */ 102 uint32_t offload_mode:2; /* Offloading mode */ 103 uint32_t eop:1; /* End of packet */ 104 uint32_t compreq:1; /* Completion request */ 105 uint32_t pad3:1; 106 uint32_t vtag_mode:1; /* VLAN tag insertion mode */ 107 uint32_t vtag:16; /* VLAN tag */ 108 } __packed; 109 110 /* Offloading modes */ 111 #define VMXNET3_OM_NONE 0 112 #define VMXNET3_OM_CSUM 2 113 #define VMXNET3_OM_TSO 3 114 115 struct vmxnet3_txcompdesc { 116 uint32_t eop_idx:12; /* EOP index in Tx ring */ 117 uint32_t pad1:20; 118 119 uint32_t pad2:32; 120 uint32_t pad3:32; 121 122 uint32_t rsvd:24; 123 uint32_t type:7; 124 uint32_t gen:1; 125 } __packed; 126 127 struct vmxnet3_rxdesc { 128 uint64_t addr; 129 130 uint32_t len:14; 131 uint32_t btype:1; /* Buffer type */ 132 uint32_t dtype:1; /* Descriptor type */ 133 uint32_t rsvd:15; 134 uint32_t gen:1; 135 136 uint32_t pad1:32; 137 } __packed; 138 139 /* Buffer types */ 140 #define VMXNET3_BTYPE_HEAD 0 /* Head only */ 141 #define VMXNET3_BTYPE_BODY 1 /* Body only */ 142 143 struct vmxnet3_rxcompdesc { 144 uint32_t rxd_idx:12; /* Rx descriptor index */ 145 uint32_t pad1:2; 146 uint32_t eop:1; /* End of packet */ 147 uint32_t sop:1; /* Start of packet */ 148 uint32_t qid:10; 149 uint32_t rss_type:4; 150 uint32_t no_csum:1; /* No checksum calculated */ 151 uint32_t pad2:1; 152 153 uint32_t rss_hash:32; /* RSS hash value */ 154 155 uint32_t len:14; 156 uint32_t error:1; 157 uint32_t vlan:1; /* 802.1Q VLAN frame */ 158 uint32_t vtag:16; /* VLAN tag */ 159 160 uint32_t csum:16; 161 uint32_t csum_ok:1; /* TCP/UDP checksum ok */ 162 uint32_t udp:1; 163 uint32_t tcp:1; 164 uint32_t ipcsum_ok:1; /* IP checksum OK */ 165 uint32_t ipv6:1; 166 uint32_t ipv4:1; 167 uint32_t fragment:1; /* IP fragment */ 168 uint32_t fcs:1; /* Frame CRC correct */ 169 uint32_t type:7; 170 uint32_t gen:1; 171 } __packed; 172 173 #define VMXNET3_RCD_RSS_TYPE_NONE 0 174 #define VMXNET3_RCD_RSS_TYPE_IPV4 1 175 #define VMXNET3_RCD_RSS_TYPE_TCPIPV4 2 176 #define VMXNET3_RCD_RSS_TYPE_IPV6 3 177 #define VMXNET3_RCD_RSS_TYPE_TCPIPV6 4 178 179 #define VMXNET3_REV1_MAGIC 0XBABEFEE1 180 181 #define VMXNET3_GOS_UNKNOWN 0x00 182 #define VMXNET3_GOS_LINUX 0x04 183 #define VMXNET3_GOS_WINDOWS 0x08 184 #define VMXNET3_GOS_SOLARIS 0x0C 185 #define VMXNET3_GOS_FREEBSD 0x10 186 #define VMXNET3_GOS_PXE 0x14 187 188 #define VMXNET3_GOS_32BIT 0x01 189 #define VMXNET3_GOS_64BIT 0x02 190 191 #define VMXNET3_MAX_TX_QUEUES 8 192 #define VMXNET3_MAX_RX_QUEUES 16 193 #define VMXNET3_MAX_INTRS \ 194 (VMXNET3_MAX_TX_QUEUES + VMXNET3_MAX_RX_QUEUES + 1) 195 196 #define VMXNET3_ICTRL_DISABLE_ALL 0x01 197 198 #define VMXNET3_RXMODE_UCAST 0x01 199 #define VMXNET3_RXMODE_MCAST 0x02 200 #define VMXNET3_RXMODE_BCAST 0x04 201 #define VMXNET3_RXMODE_ALLMULTI 0x08 202 #define VMXNET3_RXMODE_PROMISC 0x10 203 204 #define VMXNET3_EVENT_RQERROR 0x01 205 #define VMXNET3_EVENT_TQERROR 0x02 206 #define VMXNET3_EVENT_LINK 0x04 207 #define VMXNET3_EVENT_DIC 0x08 208 #define VMXNET3_EVENT_DEBUG 0x10 209 210 #define VMXNET3_MIN_MTU 60 211 #define VMXNET3_MAX_MTU 9000 212 213 /* Interrupt mask mode. */ 214 #define VMXNET3_IMM_AUTO 0x00 215 #define VMXNET3_IMM_ACTIVE 0x01 216 #define VMXNET3_IMM_LAZY 0x02 217 218 /* Interrupt type. */ 219 #define VMXNET3_IT_AUTO 0x00 220 #define VMXNET3_IT_LEGACY 0x01 221 #define VMXNET3_IT_MSI 0x02 222 #define VMXNET3_IT_MSIX 0x03 223 224 struct vmxnet3_driver_shared { 225 uint32_t magic; 226 uint32_t pad1; 227 228 /* Misc. control */ 229 uint32_t version; /* Driver version */ 230 uint32_t guest; /* Guest OS */ 231 uint32_t vmxnet3_revision; /* Supported VMXNET3 revision */ 232 uint32_t upt_version; /* Supported UPT version */ 233 uint64_t upt_features; 234 uint64_t driver_data; 235 uint64_t queue_shared; 236 uint32_t driver_data_len; 237 uint32_t queue_shared_len; 238 uint32_t mtu; 239 uint16_t nrxsg_max; 240 uint8_t ntxqueue; 241 uint8_t nrxqueue; 242 uint32_t reserved1[4]; 243 244 /* Interrupt control */ 245 uint8_t automask; 246 uint8_t nintr; 247 uint8_t evintr; 248 uint8_t modlevel[VMXNET3_MAX_INTRS]; 249 uint32_t ictrl; 250 uint32_t reserved2[2]; 251 252 /* Receive filter parameters */ 253 uint32_t rxmode; 254 uint16_t mcast_tablelen; 255 uint16_t pad2; 256 uint64_t mcast_table; 257 uint32_t vlan_filter[4096 / 32]; 258 259 struct { 260 uint32_t version; 261 uint32_t len; 262 uint64_t paddr; 263 } rss, pm, plugin; 264 265 uint32_t event; 266 uint32_t reserved3[5]; 267 } __packed; 268 269 struct vmxnet3_txq_shared { 270 /* Control */ 271 uint32_t npending; 272 uint32_t intr_threshold; 273 uint64_t reserved1; 274 275 /* Config */ 276 uint64_t cmd_ring; 277 uint64_t data_ring; 278 uint64_t comp_ring; 279 uint64_t driver_data; 280 uint64_t reserved2; 281 uint32_t cmd_ring_len; 282 uint32_t data_ring_len; 283 uint32_t comp_ring_len; 284 uint32_t driver_data_len; 285 uint8_t intr_idx; 286 uint8_t pad1[7]; 287 288 /* Queue status */ 289 uint8_t stopped; 290 uint8_t pad2[3]; 291 uint32_t error; 292 293 struct UPT1_TxStats stats; 294 295 uint8_t pad3[88]; 296 } __packed; 297 298 struct vmxnet3_rxq_shared { 299 uint8_t update_rxhead; 300 uint8_t pad1[7]; 301 uint64_t reserved1; 302 303 uint64_t cmd_ring[2]; 304 uint64_t comp_ring; 305 uint64_t driver_data; 306 uint64_t reserved2; 307 uint32_t cmd_ring_len[2]; 308 uint32_t comp_ring_len; 309 uint32_t driver_data_len; 310 uint8_t intr_idx; 311 uint8_t pad2[7]; 312 313 uint8_t stopped; 314 uint8_t pad3[3]; 315 uint32_t error; 316 317 struct UPT1_RxStats stats; 318 319 uint8_t pad4[88]; 320 } __packed; 321 322 #define UPT1_RSS_HASH_TYPE_NONE 0x00 323 #define UPT1_RSS_HASH_TYPE_IPV4 0x01 324 #define UPT1_RSS_HASH_TYPE_TCP_IPV4 0x02 325 #define UPT1_RSS_HASH_TYPE_IPV6 0x04 326 #define UPT1_RSS_HASH_TYPE_TCP_IPV6 0x08 327 328 #define UPT1_RSS_HASH_FUNC_NONE 0x00 329 #define UPT1_RSS_HASH_FUNC_TOEPLITZ 0x01 330 331 #define UPT1_RSS_MAX_KEY_SIZE 40 332 #define UPT1_RSS_MAX_IND_TABLE_SIZE 128 333 334 struct vmxnet3_rss_shared { 335 uint16_t hash_type; 336 uint16_t hash_func; 337 uint16_t hash_key_size; 338 uint16_t ind_table_size; 339 uint8_t hash_key[UPT1_RSS_MAX_KEY_SIZE]; 340 uint8_t ind_table[UPT1_RSS_MAX_IND_TABLE_SIZE]; 341 } __packed; 342 343 #endif /* _IF_VMXREG_H */ 344