1 /*- 2 * Copyright (c) 2013 Tsubai Masanari 3 * Copyright (c) 2013 Bryan Venteicher <bryanv@FreeBSD.org> 4 * Copyright (c) 2018 Patrick Kelsey 5 * 6 * Permission to use, copy, modify, and distribute this software for any 7 * purpose with or without fee is hereby granted, provided that the above 8 * copyright notice and this permission notice appear in all copies. 9 * 10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 11 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 12 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 13 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 14 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 15 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 16 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 17 * 18 * $OpenBSD: src/sys/dev/pci/if_vmx.c,v 1.11 2013/06/22 00:28:10 uebayasi Exp $ 19 */ 20 21 /* Driver for VMware vmxnet3 virtual ethernet devices. */ 22 23 #include <sys/cdefs.h> 24 __FBSDID("$FreeBSD$"); 25 26 #include "opt_rss.h" 27 28 #include <sys/param.h> 29 #include <sys/systm.h> 30 #include <sys/kernel.h> 31 #include <sys/endian.h> 32 #include <sys/sockio.h> 33 #include <sys/mbuf.h> 34 #include <sys/malloc.h> 35 #include <sys/module.h> 36 #include <sys/socket.h> 37 #include <sys/sysctl.h> 38 #include <sys/smp.h> 39 #include <vm/vm.h> 40 #include <vm/pmap.h> 41 42 #include <net/ethernet.h> 43 #include <net/if.h> 44 #include <net/if_var.h> 45 #include <net/if_arp.h> 46 #include <net/if_dl.h> 47 #include <net/if_types.h> 48 #include <net/if_media.h> 49 #include <net/if_vlan_var.h> 50 #include <net/iflib.h> 51 #ifdef RSS 52 #include <net/rss_config.h> 53 #endif 54 55 #include <netinet/in_systm.h> 56 #include <netinet/in.h> 57 #include <netinet/ip.h> 58 #include <netinet/ip6.h> 59 #include <netinet6/ip6_var.h> 60 #include <netinet/udp.h> 61 #include <netinet/tcp.h> 62 63 #include <machine/bus.h> 64 #include <machine/resource.h> 65 #include <sys/bus.h> 66 #include <sys/rman.h> 67 68 #include <dev/pci/pcireg.h> 69 #include <dev/pci/pcivar.h> 70 71 #include "ifdi_if.h" 72 73 #include "if_vmxreg.h" 74 #include "if_vmxvar.h" 75 76 #include "opt_inet.h" 77 #include "opt_inet6.h" 78 79 #define VMXNET3_VMWARE_VENDOR_ID 0x15AD 80 #define VMXNET3_VMWARE_DEVICE_ID 0x07B0 81 82 static pci_vendor_info_t vmxnet3_vendor_info_array[] = 83 { 84 PVID(VMXNET3_VMWARE_VENDOR_ID, VMXNET3_VMWARE_DEVICE_ID, "VMware VMXNET3 Ethernet Adapter"), 85 /* required last entry */ 86 PVID_END 87 }; 88 89 static void *vmxnet3_register(device_t); 90 static int vmxnet3_attach_pre(if_ctx_t); 91 static int vmxnet3_msix_intr_assign(if_ctx_t, int); 92 static void vmxnet3_free_irqs(struct vmxnet3_softc *); 93 static int vmxnet3_attach_post(if_ctx_t); 94 static int vmxnet3_detach(if_ctx_t); 95 static int vmxnet3_shutdown(if_ctx_t); 96 static int vmxnet3_suspend(if_ctx_t); 97 static int vmxnet3_resume(if_ctx_t); 98 99 static int vmxnet3_alloc_resources(struct vmxnet3_softc *); 100 static void vmxnet3_free_resources(struct vmxnet3_softc *); 101 static int vmxnet3_check_version(struct vmxnet3_softc *); 102 static void vmxnet3_set_interrupt_idx(struct vmxnet3_softc *); 103 104 static int vmxnet3_queues_shared_alloc(struct vmxnet3_softc *); 105 static void vmxnet3_init_txq(struct vmxnet3_softc *, int); 106 static int vmxnet3_tx_queues_alloc(if_ctx_t, caddr_t *, uint64_t *, int, int); 107 static void vmxnet3_init_rxq(struct vmxnet3_softc *, int, int); 108 static int vmxnet3_rx_queues_alloc(if_ctx_t, caddr_t *, uint64_t *, int, int); 109 static void vmxnet3_queues_free(if_ctx_t); 110 111 static int vmxnet3_alloc_shared_data(struct vmxnet3_softc *); 112 static void vmxnet3_free_shared_data(struct vmxnet3_softc *); 113 static int vmxnet3_alloc_mcast_table(struct vmxnet3_softc *); 114 static void vmxnet3_free_mcast_table(struct vmxnet3_softc *); 115 static void vmxnet3_init_shared_data(struct vmxnet3_softc *); 116 static void vmxnet3_reinit_rss_shared_data(struct vmxnet3_softc *); 117 static void vmxnet3_reinit_shared_data(struct vmxnet3_softc *); 118 static int vmxnet3_alloc_data(struct vmxnet3_softc *); 119 static void vmxnet3_free_data(struct vmxnet3_softc *); 120 121 static void vmxnet3_evintr(struct vmxnet3_softc *); 122 static int vmxnet3_isc_txd_encap(void *, if_pkt_info_t); 123 static void vmxnet3_isc_txd_flush(void *, uint16_t, qidx_t); 124 static int vmxnet3_isc_txd_credits_update(void *, uint16_t, bool); 125 static int vmxnet3_isc_rxd_available(void *, uint16_t, qidx_t, qidx_t); 126 static int vmxnet3_isc_rxd_pkt_get(void *, if_rxd_info_t); 127 static void vmxnet3_isc_rxd_refill(void *, if_rxd_update_t); 128 static void vmxnet3_isc_rxd_flush(void *, uint16_t, uint8_t, qidx_t); 129 static int vmxnet3_legacy_intr(void *); 130 static int vmxnet3_rxq_intr(void *); 131 static int vmxnet3_event_intr(void *); 132 133 static void vmxnet3_stop(if_ctx_t); 134 135 static void vmxnet3_txinit(struct vmxnet3_softc *, struct vmxnet3_txqueue *); 136 static void vmxnet3_rxinit(struct vmxnet3_softc *, struct vmxnet3_rxqueue *); 137 static void vmxnet3_reinit_queues(struct vmxnet3_softc *); 138 static int vmxnet3_enable_device(struct vmxnet3_softc *); 139 static void vmxnet3_reinit_rxfilters(struct vmxnet3_softc *); 140 static void vmxnet3_init(if_ctx_t); 141 static void vmxnet3_multi_set(if_ctx_t); 142 static int vmxnet3_mtu_set(if_ctx_t, uint32_t); 143 static void vmxnet3_media_status(if_ctx_t, struct ifmediareq *); 144 static int vmxnet3_media_change(if_ctx_t); 145 static int vmxnet3_promisc_set(if_ctx_t, int); 146 static uint64_t vmxnet3_get_counter(if_ctx_t, ift_counter); 147 static void vmxnet3_update_admin_status(if_ctx_t); 148 static void vmxnet3_txq_timer(if_ctx_t, uint16_t); 149 150 static void vmxnet3_update_vlan_filter(struct vmxnet3_softc *, int, 151 uint16_t); 152 static void vmxnet3_vlan_register(if_ctx_t, uint16_t); 153 static void vmxnet3_vlan_unregister(if_ctx_t, uint16_t); 154 static void vmxnet3_set_rxfilter(struct vmxnet3_softc *, int); 155 156 static void vmxnet3_refresh_host_stats(struct vmxnet3_softc *); 157 static int vmxnet3_link_is_up(struct vmxnet3_softc *); 158 static void vmxnet3_link_status(struct vmxnet3_softc *); 159 static void vmxnet3_set_lladdr(struct vmxnet3_softc *); 160 static void vmxnet3_get_lladdr(struct vmxnet3_softc *); 161 162 static void vmxnet3_setup_txq_sysctl(struct vmxnet3_txqueue *, 163 struct sysctl_ctx_list *, struct sysctl_oid_list *); 164 static void vmxnet3_setup_rxq_sysctl(struct vmxnet3_rxqueue *, 165 struct sysctl_ctx_list *, struct sysctl_oid_list *); 166 static void vmxnet3_setup_queue_sysctl(struct vmxnet3_softc *, 167 struct sysctl_ctx_list *, struct sysctl_oid_list *); 168 static void vmxnet3_setup_sysctl(struct vmxnet3_softc *); 169 170 static void vmxnet3_write_bar0(struct vmxnet3_softc *, bus_size_t, 171 uint32_t); 172 static uint32_t vmxnet3_read_bar1(struct vmxnet3_softc *, bus_size_t); 173 static void vmxnet3_write_bar1(struct vmxnet3_softc *, bus_size_t, 174 uint32_t); 175 static void vmxnet3_write_cmd(struct vmxnet3_softc *, uint32_t); 176 static uint32_t vmxnet3_read_cmd(struct vmxnet3_softc *, uint32_t); 177 178 static int vmxnet3_tx_queue_intr_enable(if_ctx_t, uint16_t); 179 static int vmxnet3_rx_queue_intr_enable(if_ctx_t, uint16_t); 180 static void vmxnet3_link_intr_enable(if_ctx_t); 181 static void vmxnet3_enable_intr(struct vmxnet3_softc *, int); 182 static void vmxnet3_disable_intr(struct vmxnet3_softc *, int); 183 static void vmxnet3_intr_enable_all(if_ctx_t); 184 static void vmxnet3_intr_disable_all(if_ctx_t); 185 186 typedef enum { 187 VMXNET3_BARRIER_RD, 188 VMXNET3_BARRIER_WR, 189 VMXNET3_BARRIER_RDWR, 190 } vmxnet3_barrier_t; 191 192 static void vmxnet3_barrier(struct vmxnet3_softc *, vmxnet3_barrier_t); 193 194 static device_method_t vmxnet3_methods[] = { 195 /* Device interface */ 196 DEVMETHOD(device_register, vmxnet3_register), 197 DEVMETHOD(device_probe, iflib_device_probe), 198 DEVMETHOD(device_attach, iflib_device_attach), 199 DEVMETHOD(device_detach, iflib_device_detach), 200 DEVMETHOD(device_shutdown, iflib_device_shutdown), 201 DEVMETHOD(device_suspend, iflib_device_suspend), 202 DEVMETHOD(device_resume, iflib_device_resume), 203 DEVMETHOD_END 204 }; 205 206 static driver_t vmxnet3_driver = { 207 "vmx", vmxnet3_methods, sizeof(struct vmxnet3_softc) 208 }; 209 210 static devclass_t vmxnet3_devclass; 211 DRIVER_MODULE(vmx, pci, vmxnet3_driver, vmxnet3_devclass, 0, 0); 212 IFLIB_PNP_INFO(pci, vmx, vmxnet3_vendor_info_array); 213 MODULE_VERSION(vmx, 2); 214 215 MODULE_DEPEND(vmx, pci, 1, 1, 1); 216 MODULE_DEPEND(vmx, ether, 1, 1, 1); 217 MODULE_DEPEND(vmx, iflib, 1, 1, 1); 218 219 static device_method_t vmxnet3_iflib_methods[] = { 220 DEVMETHOD(ifdi_tx_queues_alloc, vmxnet3_tx_queues_alloc), 221 DEVMETHOD(ifdi_rx_queues_alloc, vmxnet3_rx_queues_alloc), 222 DEVMETHOD(ifdi_queues_free, vmxnet3_queues_free), 223 224 DEVMETHOD(ifdi_attach_pre, vmxnet3_attach_pre), 225 DEVMETHOD(ifdi_attach_post, vmxnet3_attach_post), 226 DEVMETHOD(ifdi_detach, vmxnet3_detach), 227 228 DEVMETHOD(ifdi_init, vmxnet3_init), 229 DEVMETHOD(ifdi_stop, vmxnet3_stop), 230 DEVMETHOD(ifdi_multi_set, vmxnet3_multi_set), 231 DEVMETHOD(ifdi_mtu_set, vmxnet3_mtu_set), 232 DEVMETHOD(ifdi_media_status, vmxnet3_media_status), 233 DEVMETHOD(ifdi_media_change, vmxnet3_media_change), 234 DEVMETHOD(ifdi_promisc_set, vmxnet3_promisc_set), 235 DEVMETHOD(ifdi_get_counter, vmxnet3_get_counter), 236 DEVMETHOD(ifdi_update_admin_status, vmxnet3_update_admin_status), 237 DEVMETHOD(ifdi_timer, vmxnet3_txq_timer), 238 239 DEVMETHOD(ifdi_tx_queue_intr_enable, vmxnet3_tx_queue_intr_enable), 240 DEVMETHOD(ifdi_rx_queue_intr_enable, vmxnet3_rx_queue_intr_enable), 241 DEVMETHOD(ifdi_link_intr_enable, vmxnet3_link_intr_enable), 242 DEVMETHOD(ifdi_intr_enable, vmxnet3_intr_enable_all), 243 DEVMETHOD(ifdi_intr_disable, vmxnet3_intr_disable_all), 244 DEVMETHOD(ifdi_msix_intr_assign, vmxnet3_msix_intr_assign), 245 246 DEVMETHOD(ifdi_vlan_register, vmxnet3_vlan_register), 247 DEVMETHOD(ifdi_vlan_unregister, vmxnet3_vlan_unregister), 248 249 DEVMETHOD(ifdi_shutdown, vmxnet3_shutdown), 250 DEVMETHOD(ifdi_suspend, vmxnet3_suspend), 251 DEVMETHOD(ifdi_resume, vmxnet3_resume), 252 253 DEVMETHOD_END 254 }; 255 256 static driver_t vmxnet3_iflib_driver = { 257 "vmx", vmxnet3_iflib_methods, sizeof(struct vmxnet3_softc) 258 }; 259 260 struct if_txrx vmxnet3_txrx = { 261 .ift_txd_encap = vmxnet3_isc_txd_encap, 262 .ift_txd_flush = vmxnet3_isc_txd_flush, 263 .ift_txd_credits_update = vmxnet3_isc_txd_credits_update, 264 .ift_rxd_available = vmxnet3_isc_rxd_available, 265 .ift_rxd_pkt_get = vmxnet3_isc_rxd_pkt_get, 266 .ift_rxd_refill = vmxnet3_isc_rxd_refill, 267 .ift_rxd_flush = vmxnet3_isc_rxd_flush, 268 .ift_legacy_intr = vmxnet3_legacy_intr 269 }; 270 271 static struct if_shared_ctx vmxnet3_sctx_init = { 272 .isc_magic = IFLIB_MAGIC, 273 .isc_q_align = 512, 274 275 .isc_tx_maxsize = VMXNET3_TX_MAXSIZE, 276 .isc_tx_maxsegsize = VMXNET3_TX_MAXSEGSIZE, 277 .isc_tso_maxsize = VMXNET3_TSO_MAXSIZE + sizeof(struct ether_vlan_header), 278 .isc_tso_maxsegsize = VMXNET3_TX_MAXSEGSIZE, 279 280 /* 281 * These values are used to configure the busdma tag used for 282 * receive descriptors. Each receive descriptor only points to one 283 * buffer. 284 */ 285 .isc_rx_maxsize = VMXNET3_RX_MAXSEGSIZE, /* One buf per descriptor */ 286 .isc_rx_nsegments = 1, /* One mapping per descriptor */ 287 .isc_rx_maxsegsize = VMXNET3_RX_MAXSEGSIZE, 288 289 .isc_admin_intrcnt = 1, 290 .isc_vendor_info = vmxnet3_vendor_info_array, 291 .isc_driver_version = "2", 292 .isc_driver = &vmxnet3_iflib_driver, 293 .isc_flags = IFLIB_HAS_RXCQ | IFLIB_HAS_TXCQ | IFLIB_SINGLE_IRQ_RX_ONLY, 294 295 /* 296 * Number of receive queues per receive queue set, with associated 297 * descriptor settings for each. 298 */ 299 .isc_nrxqs = 3, 300 .isc_nfl = 2, /* one free list for each receive command queue */ 301 .isc_nrxd_min = {VMXNET3_MIN_RX_NDESC, VMXNET3_MIN_RX_NDESC, VMXNET3_MIN_RX_NDESC}, 302 .isc_nrxd_max = {VMXNET3_MAX_RX_NDESC, VMXNET3_MAX_RX_NDESC, VMXNET3_MAX_RX_NDESC}, 303 .isc_nrxd_default = {VMXNET3_DEF_RX_NDESC, VMXNET3_DEF_RX_NDESC, VMXNET3_DEF_RX_NDESC}, 304 305 /* 306 * Number of transmit queues per transmit queue set, with associated 307 * descriptor settings for each. 308 */ 309 .isc_ntxqs = 2, 310 .isc_ntxd_min = {VMXNET3_MIN_TX_NDESC, VMXNET3_MIN_TX_NDESC}, 311 .isc_ntxd_max = {VMXNET3_MAX_TX_NDESC, VMXNET3_MAX_TX_NDESC}, 312 .isc_ntxd_default = {VMXNET3_DEF_TX_NDESC, VMXNET3_DEF_TX_NDESC}, 313 }; 314 315 static void * 316 vmxnet3_register(device_t dev) 317 { 318 return (&vmxnet3_sctx_init); 319 } 320 321 static int 322 trunc_powerof2(int val) 323 { 324 325 return (1U << (fls(val) - 1)); 326 } 327 328 static int 329 vmxnet3_attach_pre(if_ctx_t ctx) 330 { 331 device_t dev; 332 if_softc_ctx_t scctx; 333 struct vmxnet3_softc *sc; 334 uint32_t intr_config; 335 int error; 336 337 dev = iflib_get_dev(ctx); 338 sc = iflib_get_softc(ctx); 339 sc->vmx_dev = dev; 340 sc->vmx_ctx = ctx; 341 sc->vmx_sctx = iflib_get_sctx(ctx); 342 sc->vmx_scctx = iflib_get_softc_ctx(ctx); 343 sc->vmx_ifp = iflib_get_ifp(ctx); 344 sc->vmx_media = iflib_get_media(ctx); 345 scctx = sc->vmx_scctx; 346 347 scctx->isc_tx_nsegments = VMXNET3_TX_MAXSEGS; 348 scctx->isc_tx_tso_segments_max = VMXNET3_TX_MAXSEGS; 349 /* isc_tx_tso_size_max doesn't include possible vlan header */ 350 scctx->isc_tx_tso_size_max = VMXNET3_TSO_MAXSIZE; 351 scctx->isc_tx_tso_segsize_max = VMXNET3_TX_MAXSEGSIZE; 352 scctx->isc_txrx = &vmxnet3_txrx; 353 354 /* If 0, the iflib tunable was not set, so set to the default */ 355 if (scctx->isc_nrxqsets == 0) 356 scctx->isc_nrxqsets = VMXNET3_DEF_RX_QUEUES; 357 scctx->isc_nrxqsets = trunc_powerof2(scctx->isc_nrxqsets); 358 scctx->isc_nrxqsets_max = min(VMXNET3_MAX_RX_QUEUES, mp_ncpus); 359 scctx->isc_nrxqsets_max = trunc_powerof2(scctx->isc_nrxqsets_max); 360 361 /* If 0, the iflib tunable was not set, so set to the default */ 362 if (scctx->isc_ntxqsets == 0) 363 scctx->isc_ntxqsets = VMXNET3_DEF_TX_QUEUES; 364 scctx->isc_ntxqsets = trunc_powerof2(scctx->isc_ntxqsets); 365 scctx->isc_ntxqsets_max = min(VMXNET3_MAX_TX_QUEUES, mp_ncpus); 366 scctx->isc_ntxqsets_max = trunc_powerof2(scctx->isc_ntxqsets_max); 367 368 /* 369 * Enforce that the transmit completion queue descriptor count is 370 * the same as the transmit command queue descriptor count. 371 */ 372 scctx->isc_ntxd[0] = scctx->isc_ntxd[1]; 373 scctx->isc_txqsizes[0] = 374 sizeof(struct vmxnet3_txcompdesc) * scctx->isc_ntxd[0]; 375 scctx->isc_txqsizes[1] = 376 sizeof(struct vmxnet3_txdesc) * scctx->isc_ntxd[1]; 377 378 /* 379 * Enforce that the receive completion queue descriptor count is the 380 * sum of the receive command queue descriptor counts, and that the 381 * second receive command queue descriptor count is the same as the 382 * first one. 383 */ 384 scctx->isc_nrxd[2] = scctx->isc_nrxd[1]; 385 scctx->isc_nrxd[0] = scctx->isc_nrxd[1] + scctx->isc_nrxd[2]; 386 scctx->isc_rxqsizes[0] = 387 sizeof(struct vmxnet3_rxcompdesc) * scctx->isc_nrxd[0]; 388 scctx->isc_rxqsizes[1] = 389 sizeof(struct vmxnet3_rxdesc) * scctx->isc_nrxd[1]; 390 scctx->isc_rxqsizes[2] = 391 sizeof(struct vmxnet3_rxdesc) * scctx->isc_nrxd[2]; 392 393 /* 394 * Initialize the max frame size and descriptor queue buffer 395 * sizes. 396 */ 397 vmxnet3_mtu_set(ctx, if_getmtu(sc->vmx_ifp)); 398 399 scctx->isc_rss_table_size = UPT1_RSS_MAX_IND_TABLE_SIZE; 400 401 /* Map PCI BARs */ 402 error = vmxnet3_alloc_resources(sc); 403 if (error) 404 goto fail; 405 406 /* Check device versions */ 407 error = vmxnet3_check_version(sc); 408 if (error) 409 goto fail; 410 411 /* 412 * The interrupt mode can be set in the hypervisor configuration via 413 * the parameter ethernet<N>.intrMode. 414 */ 415 intr_config = vmxnet3_read_cmd(sc, VMXNET3_CMD_GET_INTRCFG); 416 sc->vmx_intr_mask_mode = (intr_config >> 2) & 0x03; 417 418 /* 419 * Configure the softc context to attempt to configure the interrupt 420 * mode now indicated by intr_config. iflib will follow the usual 421 * fallback path MSI-X -> MSI -> LEGACY, starting at the configured 422 * starting mode. 423 */ 424 switch (intr_config & 0x03) { 425 case VMXNET3_IT_AUTO: 426 case VMXNET3_IT_MSIX: 427 scctx->isc_msix_bar = pci_msix_table_bar(dev); 428 break; 429 case VMXNET3_IT_MSI: 430 scctx->isc_msix_bar = -1; 431 scctx->isc_disable_msix = 1; 432 break; 433 case VMXNET3_IT_LEGACY: 434 scctx->isc_msix_bar = 0; 435 break; 436 } 437 438 scctx->isc_tx_csum_flags = VMXNET3_CSUM_ALL_OFFLOAD; 439 scctx->isc_capabilities = scctx->isc_capenable = 440 IFCAP_TXCSUM | IFCAP_TXCSUM_IPV6 | 441 IFCAP_TSO4 | IFCAP_TSO6 | 442 IFCAP_RXCSUM | IFCAP_RXCSUM_IPV6 | 443 IFCAP_VLAN_MTU | IFCAP_VLAN_HWTAGGING | 444 IFCAP_VLAN_HWCSUM | IFCAP_VLAN_HWTSO | 445 IFCAP_JUMBO_MTU; 446 447 /* These capabilities are not enabled by default. */ 448 scctx->isc_capabilities |= IFCAP_LRO | IFCAP_VLAN_HWFILTER; 449 450 vmxnet3_get_lladdr(sc); 451 iflib_set_mac(ctx, sc->vmx_lladdr); 452 453 return (0); 454 fail: 455 /* 456 * We must completely clean up anything allocated above as iflib 457 * will not invoke any other driver entry points as a result of this 458 * failure. 459 */ 460 vmxnet3_free_resources(sc); 461 462 return (error); 463 } 464 465 static int 466 vmxnet3_msix_intr_assign(if_ctx_t ctx, int msix) 467 { 468 struct vmxnet3_softc *sc; 469 if_softc_ctx_t scctx; 470 struct vmxnet3_rxqueue *rxq; 471 int error; 472 int i; 473 char irq_name[16]; 474 475 sc = iflib_get_softc(ctx); 476 scctx = sc->vmx_scctx; 477 478 for (i = 0; i < scctx->isc_nrxqsets; i++) { 479 snprintf(irq_name, sizeof(irq_name), "rxq%d", i); 480 481 rxq = &sc->vmx_rxq[i]; 482 error = iflib_irq_alloc_generic(ctx, &rxq->vxrxq_irq, i + 1, 483 IFLIB_INTR_RXTX, vmxnet3_rxq_intr, rxq, i, irq_name); 484 if (error) { 485 device_printf(iflib_get_dev(ctx), 486 "Failed to register rxq %d interrupt handler\n", i); 487 return (error); 488 } 489 } 490 491 for (i = 0; i < scctx->isc_ntxqsets; i++) { 492 snprintf(irq_name, sizeof(irq_name), "txq%d", i); 493 494 /* 495 * Don't provide the corresponding rxq irq for reference - 496 * we want the transmit task to be attached to a task queue 497 * that is different from the one used by the corresponding 498 * rxq irq. That is because the TX doorbell writes are very 499 * expensive as virtualized MMIO operations, so we want to 500 * be able to defer them to another core when possible so 501 * that they don't steal receive processing cycles during 502 * stack turnarounds like TCP ACK generation. The other 503 * piece to this approach is enabling the iflib abdicate 504 * option (currently via an interface-specific 505 * tunable/sysctl). 506 */ 507 iflib_softirq_alloc_generic(ctx, NULL, IFLIB_INTR_TX, NULL, i, 508 irq_name); 509 } 510 511 error = iflib_irq_alloc_generic(ctx, &sc->vmx_event_intr_irq, 512 scctx->isc_nrxqsets + 1, IFLIB_INTR_ADMIN, vmxnet3_event_intr, sc, 0, 513 "event"); 514 if (error) { 515 device_printf(iflib_get_dev(ctx), 516 "Failed to register event interrupt handler\n"); 517 return (error); 518 } 519 520 return (0); 521 } 522 523 static void 524 vmxnet3_free_irqs(struct vmxnet3_softc *sc) 525 { 526 if_softc_ctx_t scctx; 527 struct vmxnet3_rxqueue *rxq; 528 int i; 529 530 scctx = sc->vmx_scctx; 531 532 for (i = 0; i < scctx->isc_nrxqsets; i++) { 533 rxq = &sc->vmx_rxq[i]; 534 iflib_irq_free(sc->vmx_ctx, &rxq->vxrxq_irq); 535 } 536 537 iflib_irq_free(sc->vmx_ctx, &sc->vmx_event_intr_irq); 538 } 539 540 static int 541 vmxnet3_attach_post(if_ctx_t ctx) 542 { 543 if_softc_ctx_t scctx; 544 struct vmxnet3_softc *sc; 545 int error; 546 547 scctx = iflib_get_softc_ctx(ctx); 548 sc = iflib_get_softc(ctx); 549 550 if (scctx->isc_nrxqsets > 1) 551 sc->vmx_flags |= VMXNET3_FLAG_RSS; 552 553 error = vmxnet3_alloc_data(sc); 554 if (error) 555 goto fail; 556 557 vmxnet3_set_interrupt_idx(sc); 558 vmxnet3_setup_sysctl(sc); 559 560 ifmedia_add(sc->vmx_media, IFM_ETHER | IFM_AUTO, 0, NULL); 561 ifmedia_set(sc->vmx_media, IFM_ETHER | IFM_AUTO); 562 563 fail: 564 return (error); 565 } 566 567 static int 568 vmxnet3_detach(if_ctx_t ctx) 569 { 570 struct vmxnet3_softc *sc; 571 572 sc = iflib_get_softc(ctx); 573 574 vmxnet3_free_irqs(sc); 575 vmxnet3_free_data(sc); 576 vmxnet3_free_resources(sc); 577 578 return (0); 579 } 580 581 static int 582 vmxnet3_shutdown(if_ctx_t ctx) 583 { 584 585 return (0); 586 } 587 588 static int 589 vmxnet3_suspend(if_ctx_t ctx) 590 { 591 592 return (0); 593 } 594 595 static int 596 vmxnet3_resume(if_ctx_t ctx) 597 { 598 599 return (0); 600 } 601 602 static int 603 vmxnet3_alloc_resources(struct vmxnet3_softc *sc) 604 { 605 device_t dev; 606 int rid; 607 608 dev = sc->vmx_dev; 609 610 rid = PCIR_BAR(0); 611 sc->vmx_res0 = bus_alloc_resource_any(dev, SYS_RES_MEMORY, &rid, 612 RF_ACTIVE); 613 if (sc->vmx_res0 == NULL) { 614 device_printf(dev, 615 "could not map BAR0 memory\n"); 616 return (ENXIO); 617 } 618 619 sc->vmx_iot0 = rman_get_bustag(sc->vmx_res0); 620 sc->vmx_ioh0 = rman_get_bushandle(sc->vmx_res0); 621 622 rid = PCIR_BAR(1); 623 sc->vmx_res1 = bus_alloc_resource_any(dev, SYS_RES_MEMORY, &rid, 624 RF_ACTIVE); 625 if (sc->vmx_res1 == NULL) { 626 device_printf(dev, 627 "could not map BAR1 memory\n"); 628 return (ENXIO); 629 } 630 631 sc->vmx_iot1 = rman_get_bustag(sc->vmx_res1); 632 sc->vmx_ioh1 = rman_get_bushandle(sc->vmx_res1); 633 634 return (0); 635 } 636 637 static void 638 vmxnet3_free_resources(struct vmxnet3_softc *sc) 639 { 640 device_t dev; 641 642 dev = sc->vmx_dev; 643 644 if (sc->vmx_res0 != NULL) { 645 bus_release_resource(dev, SYS_RES_MEMORY, 646 rman_get_rid(sc->vmx_res0), sc->vmx_res0); 647 sc->vmx_res0 = NULL; 648 } 649 650 if (sc->vmx_res1 != NULL) { 651 bus_release_resource(dev, SYS_RES_MEMORY, 652 rman_get_rid(sc->vmx_res1), sc->vmx_res1); 653 sc->vmx_res1 = NULL; 654 } 655 } 656 657 static int 658 vmxnet3_check_version(struct vmxnet3_softc *sc) 659 { 660 device_t dev; 661 uint32_t version; 662 663 dev = sc->vmx_dev; 664 665 version = vmxnet3_read_bar1(sc, VMXNET3_BAR1_VRRS); 666 if ((version & 0x01) == 0) { 667 device_printf(dev, "unsupported hardware version %#x\n", 668 version); 669 return (ENOTSUP); 670 } 671 vmxnet3_write_bar1(sc, VMXNET3_BAR1_VRRS, 1); 672 673 version = vmxnet3_read_bar1(sc, VMXNET3_BAR1_UVRS); 674 if ((version & 0x01) == 0) { 675 device_printf(dev, "unsupported UPT version %#x\n", version); 676 return (ENOTSUP); 677 } 678 vmxnet3_write_bar1(sc, VMXNET3_BAR1_UVRS, 1); 679 680 return (0); 681 } 682 683 static void 684 vmxnet3_set_interrupt_idx(struct vmxnet3_softc *sc) 685 { 686 if_softc_ctx_t scctx; 687 struct vmxnet3_txqueue *txq; 688 struct vmxnet3_txq_shared *txs; 689 struct vmxnet3_rxqueue *rxq; 690 struct vmxnet3_rxq_shared *rxs; 691 int intr_idx; 692 int i; 693 694 scctx = sc->vmx_scctx; 695 696 /* 697 * There is always one interrupt per receive queue, assigned 698 * starting with the first interrupt. When there is only one 699 * interrupt available, the event interrupt shares the receive queue 700 * interrupt, otherwise it uses the interrupt following the last 701 * receive queue interrupt. Transmit queues are not assigned 702 * interrupts, so they are given indexes beyond the indexes that 703 * correspond to the real interrupts. 704 */ 705 706 /* The event interrupt is always the last vector. */ 707 sc->vmx_event_intr_idx = scctx->isc_vectors - 1; 708 709 intr_idx = 0; 710 for (i = 0; i < scctx->isc_nrxqsets; i++, intr_idx++) { 711 rxq = &sc->vmx_rxq[i]; 712 rxs = rxq->vxrxq_rs; 713 rxq->vxrxq_intr_idx = intr_idx; 714 rxs->intr_idx = rxq->vxrxq_intr_idx; 715 } 716 717 /* 718 * Assign the tx queues interrupt indexes above what we are actually 719 * using. These interrupts will never be enabled. 720 */ 721 intr_idx = scctx->isc_vectors; 722 for (i = 0; i < scctx->isc_ntxqsets; i++, intr_idx++) { 723 txq = &sc->vmx_txq[i]; 724 txs = txq->vxtxq_ts; 725 txq->vxtxq_intr_idx = intr_idx; 726 txs->intr_idx = txq->vxtxq_intr_idx; 727 } 728 } 729 730 static int 731 vmxnet3_queues_shared_alloc(struct vmxnet3_softc *sc) 732 { 733 if_softc_ctx_t scctx; 734 int size; 735 int error; 736 737 scctx = sc->vmx_scctx; 738 739 /* 740 * The txq and rxq shared data areas must be allocated contiguously 741 * as vmxnet3_driver_shared contains only a single address member 742 * for the shared queue data area. 743 */ 744 size = scctx->isc_ntxqsets * sizeof(struct vmxnet3_txq_shared) + 745 scctx->isc_nrxqsets * sizeof(struct vmxnet3_rxq_shared); 746 error = iflib_dma_alloc_align(sc->vmx_ctx, size, 128, &sc->vmx_qs_dma, 0); 747 if (error) { 748 device_printf(sc->vmx_dev, "cannot alloc queue shared memory\n"); 749 return (error); 750 } 751 752 return (0); 753 } 754 755 static void 756 vmxnet3_init_txq(struct vmxnet3_softc *sc, int q) 757 { 758 struct vmxnet3_txqueue *txq; 759 struct vmxnet3_comp_ring *txc; 760 struct vmxnet3_txring *txr; 761 if_softc_ctx_t scctx; 762 763 txq = &sc->vmx_txq[q]; 764 txc = &txq->vxtxq_comp_ring; 765 txr = &txq->vxtxq_cmd_ring; 766 scctx = sc->vmx_scctx; 767 768 snprintf(txq->vxtxq_name, sizeof(txq->vxtxq_name), "%s-tx%d", 769 device_get_nameunit(sc->vmx_dev), q); 770 771 txq->vxtxq_sc = sc; 772 txq->vxtxq_id = q; 773 txc->vxcr_ndesc = scctx->isc_ntxd[0]; 774 txr->vxtxr_ndesc = scctx->isc_ntxd[1]; 775 } 776 777 static int 778 vmxnet3_tx_queues_alloc(if_ctx_t ctx, caddr_t *vaddrs, uint64_t *paddrs, 779 int ntxqs, int ntxqsets) 780 { 781 struct vmxnet3_softc *sc; 782 int q; 783 int error; 784 caddr_t kva; 785 786 sc = iflib_get_softc(ctx); 787 788 /* Allocate the array of transmit queues */ 789 sc->vmx_txq = malloc(sizeof(struct vmxnet3_txqueue) * 790 ntxqsets, M_DEVBUF, M_NOWAIT | M_ZERO); 791 if (sc->vmx_txq == NULL) 792 return (ENOMEM); 793 794 /* Initialize driver state for each transmit queue */ 795 for (q = 0; q < ntxqsets; q++) 796 vmxnet3_init_txq(sc, q); 797 798 /* 799 * Allocate queue state that is shared with the device. This check 800 * and call is performed in both vmxnet3_tx_queues_alloc() and 801 * vmxnet3_rx_queues_alloc() so that we don't have to care which 802 * order iflib invokes those routines in. 803 */ 804 if (sc->vmx_qs_dma.idi_size == 0) { 805 error = vmxnet3_queues_shared_alloc(sc); 806 if (error) 807 return (error); 808 } 809 810 kva = sc->vmx_qs_dma.idi_vaddr; 811 for (q = 0; q < ntxqsets; q++) { 812 sc->vmx_txq[q].vxtxq_ts = (struct vmxnet3_txq_shared *) kva; 813 kva += sizeof(struct vmxnet3_txq_shared); 814 } 815 816 /* Record descriptor ring vaddrs and paddrs */ 817 for (q = 0; q < ntxqsets; q++) { 818 struct vmxnet3_txqueue *txq; 819 struct vmxnet3_txring *txr; 820 struct vmxnet3_comp_ring *txc; 821 822 txq = &sc->vmx_txq[q]; 823 txc = &txq->vxtxq_comp_ring; 824 txr = &txq->vxtxq_cmd_ring; 825 826 /* Completion ring */ 827 txc->vxcr_u.txcd = 828 (struct vmxnet3_txcompdesc *) vaddrs[q * ntxqs + 0]; 829 txc->vxcr_paddr = paddrs[q * ntxqs + 0]; 830 831 /* Command ring */ 832 txr->vxtxr_txd = 833 (struct vmxnet3_txdesc *) vaddrs[q * ntxqs + 1]; 834 txr->vxtxr_paddr = paddrs[q * ntxqs + 1]; 835 } 836 837 return (0); 838 } 839 840 static void 841 vmxnet3_init_rxq(struct vmxnet3_softc *sc, int q, int nrxqs) 842 { 843 struct vmxnet3_rxqueue *rxq; 844 struct vmxnet3_comp_ring *rxc; 845 struct vmxnet3_rxring *rxr; 846 if_softc_ctx_t scctx; 847 int i; 848 849 rxq = &sc->vmx_rxq[q]; 850 rxc = &rxq->vxrxq_comp_ring; 851 scctx = sc->vmx_scctx; 852 853 snprintf(rxq->vxrxq_name, sizeof(rxq->vxrxq_name), "%s-rx%d", 854 device_get_nameunit(sc->vmx_dev), q); 855 856 rxq->vxrxq_sc = sc; 857 rxq->vxrxq_id = q; 858 859 /* 860 * First rxq is the completion queue, so there are nrxqs - 1 command 861 * rings starting at iflib queue id 1. 862 */ 863 rxc->vxcr_ndesc = scctx->isc_nrxd[0]; 864 for (i = 0; i < nrxqs - 1; i++) { 865 rxr = &rxq->vxrxq_cmd_ring[i]; 866 rxr->vxrxr_ndesc = scctx->isc_nrxd[i + 1]; 867 } 868 } 869 870 static int 871 vmxnet3_rx_queues_alloc(if_ctx_t ctx, caddr_t *vaddrs, uint64_t *paddrs, 872 int nrxqs, int nrxqsets) 873 { 874 struct vmxnet3_softc *sc; 875 if_softc_ctx_t scctx; 876 int q; 877 int i; 878 int error; 879 caddr_t kva; 880 881 sc = iflib_get_softc(ctx); 882 scctx = sc->vmx_scctx; 883 884 /* Allocate the array of receive queues */ 885 sc->vmx_rxq = malloc(sizeof(struct vmxnet3_rxqueue) * 886 nrxqsets, M_DEVBUF, M_NOWAIT | M_ZERO); 887 if (sc->vmx_rxq == NULL) 888 return (ENOMEM); 889 890 /* Initialize driver state for each receive queue */ 891 for (q = 0; q < nrxqsets; q++) 892 vmxnet3_init_rxq(sc, q, nrxqs); 893 894 /* 895 * Allocate queue state that is shared with the device. This check 896 * and call is performed in both vmxnet3_tx_queues_alloc() and 897 * vmxnet3_rx_queues_alloc() so that we don't have to care which 898 * order iflib invokes those routines in. 899 */ 900 if (sc->vmx_qs_dma.idi_size == 0) { 901 error = vmxnet3_queues_shared_alloc(sc); 902 if (error) 903 return (error); 904 } 905 906 kva = sc->vmx_qs_dma.idi_vaddr + 907 scctx->isc_ntxqsets * sizeof(struct vmxnet3_txq_shared); 908 for (q = 0; q < nrxqsets; q++) { 909 sc->vmx_rxq[q].vxrxq_rs = (struct vmxnet3_rxq_shared *) kva; 910 kva += sizeof(struct vmxnet3_rxq_shared); 911 } 912 913 /* Record descriptor ring vaddrs and paddrs */ 914 for (q = 0; q < nrxqsets; q++) { 915 struct vmxnet3_rxqueue *rxq; 916 struct vmxnet3_rxring *rxr; 917 struct vmxnet3_comp_ring *rxc; 918 919 rxq = &sc->vmx_rxq[q]; 920 rxc = &rxq->vxrxq_comp_ring; 921 922 /* Completion ring */ 923 rxc->vxcr_u.rxcd = 924 (struct vmxnet3_rxcompdesc *) vaddrs[q * nrxqs + 0]; 925 rxc->vxcr_paddr = paddrs[q * nrxqs + 0]; 926 927 /* Command ring(s) */ 928 for (i = 0; i < nrxqs - 1; i++) { 929 rxr = &rxq->vxrxq_cmd_ring[i]; 930 931 rxr->vxrxr_rxd = 932 (struct vmxnet3_rxdesc *) vaddrs[q * nrxqs + 1 + i]; 933 rxr->vxrxr_paddr = paddrs[q * nrxqs + 1 + i]; 934 } 935 } 936 937 return (0); 938 } 939 940 static void 941 vmxnet3_queues_free(if_ctx_t ctx) 942 { 943 struct vmxnet3_softc *sc; 944 945 sc = iflib_get_softc(ctx); 946 947 /* Free queue state area that is shared with the device */ 948 if (sc->vmx_qs_dma.idi_size != 0) { 949 iflib_dma_free(&sc->vmx_qs_dma); 950 sc->vmx_qs_dma.idi_size = 0; 951 } 952 953 /* Free array of receive queues */ 954 if (sc->vmx_rxq != NULL) { 955 free(sc->vmx_rxq, M_DEVBUF); 956 sc->vmx_rxq = NULL; 957 } 958 959 /* Free array of transmit queues */ 960 if (sc->vmx_txq != NULL) { 961 free(sc->vmx_txq, M_DEVBUF); 962 sc->vmx_txq = NULL; 963 } 964 } 965 966 static int 967 vmxnet3_alloc_shared_data(struct vmxnet3_softc *sc) 968 { 969 device_t dev; 970 size_t size; 971 int error; 972 973 dev = sc->vmx_dev; 974 975 /* Top level state structure shared with the device */ 976 size = sizeof(struct vmxnet3_driver_shared); 977 error = iflib_dma_alloc_align(sc->vmx_ctx, size, 1, &sc->vmx_ds_dma, 0); 978 if (error) { 979 device_printf(dev, "cannot alloc shared memory\n"); 980 return (error); 981 } 982 sc->vmx_ds = (struct vmxnet3_driver_shared *) sc->vmx_ds_dma.idi_vaddr; 983 984 /* RSS table state shared with the device */ 985 if (sc->vmx_flags & VMXNET3_FLAG_RSS) { 986 size = sizeof(struct vmxnet3_rss_shared); 987 error = iflib_dma_alloc_align(sc->vmx_ctx, size, 128, 988 &sc->vmx_rss_dma, 0); 989 if (error) { 990 device_printf(dev, "cannot alloc rss shared memory\n"); 991 return (error); 992 } 993 sc->vmx_rss = 994 (struct vmxnet3_rss_shared *) sc->vmx_rss_dma.idi_vaddr; 995 } 996 997 return (0); 998 } 999 1000 static void 1001 vmxnet3_free_shared_data(struct vmxnet3_softc *sc) 1002 { 1003 1004 /* Free RSS table state shared with the device */ 1005 if (sc->vmx_rss != NULL) { 1006 iflib_dma_free(&sc->vmx_rss_dma); 1007 sc->vmx_rss = NULL; 1008 } 1009 1010 /* Free top level state structure shared with the device */ 1011 if (sc->vmx_ds != NULL) { 1012 iflib_dma_free(&sc->vmx_ds_dma); 1013 sc->vmx_ds = NULL; 1014 } 1015 } 1016 1017 static int 1018 vmxnet3_alloc_mcast_table(struct vmxnet3_softc *sc) 1019 { 1020 int error; 1021 1022 /* Multicast table state shared with the device */ 1023 error = iflib_dma_alloc_align(sc->vmx_ctx, 1024 VMXNET3_MULTICAST_MAX * ETHER_ADDR_LEN, 32, &sc->vmx_mcast_dma, 0); 1025 if (error) 1026 device_printf(sc->vmx_dev, "unable to alloc multicast table\n"); 1027 else 1028 sc->vmx_mcast = sc->vmx_mcast_dma.idi_vaddr; 1029 1030 return (error); 1031 } 1032 1033 static void 1034 vmxnet3_free_mcast_table(struct vmxnet3_softc *sc) 1035 { 1036 1037 /* Free multicast table state shared with the device */ 1038 if (sc->vmx_mcast != NULL) { 1039 iflib_dma_free(&sc->vmx_mcast_dma); 1040 sc->vmx_mcast = NULL; 1041 } 1042 } 1043 1044 static void 1045 vmxnet3_init_shared_data(struct vmxnet3_softc *sc) 1046 { 1047 struct vmxnet3_driver_shared *ds; 1048 if_softc_ctx_t scctx; 1049 struct vmxnet3_txqueue *txq; 1050 struct vmxnet3_txq_shared *txs; 1051 struct vmxnet3_rxqueue *rxq; 1052 struct vmxnet3_rxq_shared *rxs; 1053 int i; 1054 1055 ds = sc->vmx_ds; 1056 scctx = sc->vmx_scctx; 1057 1058 /* 1059 * Initialize fields of the shared data that remains the same across 1060 * reinits. Note the shared data is zero'd when allocated. 1061 */ 1062 1063 ds->magic = VMXNET3_REV1_MAGIC; 1064 1065 /* DriverInfo */ 1066 ds->version = VMXNET3_DRIVER_VERSION; 1067 ds->guest = VMXNET3_GOS_FREEBSD | 1068 #ifdef __LP64__ 1069 VMXNET3_GOS_64BIT; 1070 #else 1071 VMXNET3_GOS_32BIT; 1072 #endif 1073 ds->vmxnet3_revision = 1; 1074 ds->upt_version = 1; 1075 1076 /* Misc. conf */ 1077 ds->driver_data = vtophys(sc); 1078 ds->driver_data_len = sizeof(struct vmxnet3_softc); 1079 ds->queue_shared = sc->vmx_qs_dma.idi_paddr; 1080 ds->queue_shared_len = sc->vmx_qs_dma.idi_size; 1081 ds->nrxsg_max = IFLIB_MAX_RX_SEGS; 1082 1083 /* RSS conf */ 1084 if (sc->vmx_flags & VMXNET3_FLAG_RSS) { 1085 ds->rss.version = 1; 1086 ds->rss.paddr = sc->vmx_rss_dma.idi_paddr; 1087 ds->rss.len = sc->vmx_rss_dma.idi_size; 1088 } 1089 1090 /* Interrupt control. */ 1091 ds->automask = sc->vmx_intr_mask_mode == VMXNET3_IMM_AUTO; 1092 /* 1093 * Total number of interrupt indexes we are using in the shared 1094 * config data, even though we don't actually allocate interrupt 1095 * resources for the tx queues. Some versions of the device will 1096 * fail to initialize successfully if interrupt indexes are used in 1097 * the shared config that exceed the number of interrupts configured 1098 * here. 1099 */ 1100 ds->nintr = (scctx->isc_vectors == 1) ? 1101 2 : (scctx->isc_nrxqsets + scctx->isc_ntxqsets + 1); 1102 ds->evintr = sc->vmx_event_intr_idx; 1103 ds->ictrl = VMXNET3_ICTRL_DISABLE_ALL; 1104 1105 for (i = 0; i < ds->nintr; i++) 1106 ds->modlevel[i] = UPT1_IMOD_ADAPTIVE; 1107 1108 /* Receive filter. */ 1109 ds->mcast_table = sc->vmx_mcast_dma.idi_paddr; 1110 ds->mcast_tablelen = sc->vmx_mcast_dma.idi_size; 1111 1112 /* Tx queues */ 1113 for (i = 0; i < scctx->isc_ntxqsets; i++) { 1114 txq = &sc->vmx_txq[i]; 1115 txs = txq->vxtxq_ts; 1116 1117 txs->cmd_ring = txq->vxtxq_cmd_ring.vxtxr_paddr; 1118 txs->cmd_ring_len = txq->vxtxq_cmd_ring.vxtxr_ndesc; 1119 txs->comp_ring = txq->vxtxq_comp_ring.vxcr_paddr; 1120 txs->comp_ring_len = txq->vxtxq_comp_ring.vxcr_ndesc; 1121 txs->driver_data = vtophys(txq); 1122 txs->driver_data_len = sizeof(struct vmxnet3_txqueue); 1123 } 1124 1125 /* Rx queues */ 1126 for (i = 0; i < scctx->isc_nrxqsets; i++) { 1127 rxq = &sc->vmx_rxq[i]; 1128 rxs = rxq->vxrxq_rs; 1129 1130 rxs->cmd_ring[0] = rxq->vxrxq_cmd_ring[0].vxrxr_paddr; 1131 rxs->cmd_ring_len[0] = rxq->vxrxq_cmd_ring[0].vxrxr_ndesc; 1132 rxs->cmd_ring[1] = rxq->vxrxq_cmd_ring[1].vxrxr_paddr; 1133 rxs->cmd_ring_len[1] = rxq->vxrxq_cmd_ring[1].vxrxr_ndesc; 1134 rxs->comp_ring = rxq->vxrxq_comp_ring.vxcr_paddr; 1135 rxs->comp_ring_len = rxq->vxrxq_comp_ring.vxcr_ndesc; 1136 rxs->driver_data = vtophys(rxq); 1137 rxs->driver_data_len = sizeof(struct vmxnet3_rxqueue); 1138 } 1139 } 1140 1141 static void 1142 vmxnet3_reinit_rss_shared_data(struct vmxnet3_softc *sc) 1143 { 1144 /* 1145 * Use the same key as the Linux driver until FreeBSD can do 1146 * RSS (presumably Toeplitz) in software. 1147 */ 1148 static const uint8_t rss_key[UPT1_RSS_MAX_KEY_SIZE] = { 1149 0x3b, 0x56, 0xd1, 0x56, 0x13, 0x4a, 0xe7, 0xac, 1150 0xe8, 0x79, 0x09, 0x75, 0xe8, 0x65, 0x79, 0x28, 1151 0x35, 0x12, 0xb9, 0x56, 0x7c, 0x76, 0x4b, 0x70, 1152 0xd8, 0x56, 0xa3, 0x18, 0x9b, 0x0a, 0xee, 0xf3, 1153 0x96, 0xa6, 0x9f, 0x8f, 0x9e, 0x8c, 0x90, 0xc9, 1154 }; 1155 1156 if_softc_ctx_t scctx; 1157 struct vmxnet3_rss_shared *rss; 1158 #ifdef RSS 1159 uint8_t rss_algo; 1160 #endif 1161 int i; 1162 1163 scctx = sc->vmx_scctx; 1164 rss = sc->vmx_rss; 1165 1166 rss->hash_type = 1167 UPT1_RSS_HASH_TYPE_IPV4 | UPT1_RSS_HASH_TYPE_TCP_IPV4 | 1168 UPT1_RSS_HASH_TYPE_IPV6 | UPT1_RSS_HASH_TYPE_TCP_IPV6; 1169 rss->hash_func = UPT1_RSS_HASH_FUNC_TOEPLITZ; 1170 rss->hash_key_size = UPT1_RSS_MAX_KEY_SIZE; 1171 rss->ind_table_size = UPT1_RSS_MAX_IND_TABLE_SIZE; 1172 #ifdef RSS 1173 /* 1174 * If the software RSS is configured to anything else other than 1175 * Toeplitz, then just do Toeplitz in "hardware" for the sake of 1176 * the packet distribution, but report the hash as opaque to 1177 * disengage from the software RSS. 1178 */ 1179 rss_algo = rss_gethashalgo(); 1180 if (rss_algo == RSS_HASH_TOEPLITZ) { 1181 rss_getkey(rss->hash_key); 1182 for (i = 0; i < UPT1_RSS_MAX_IND_TABLE_SIZE; i++) { 1183 rss->ind_table[i] = rss_get_indirection_to_bucket(i) % 1184 scctx->isc_nrxqsets; 1185 } 1186 sc->vmx_flags |= VMXNET3_FLAG_SOFT_RSS; 1187 } else 1188 #endif 1189 { 1190 memcpy(rss->hash_key, rss_key, UPT1_RSS_MAX_KEY_SIZE); 1191 for (i = 0; i < UPT1_RSS_MAX_IND_TABLE_SIZE; i++) 1192 rss->ind_table[i] = i % scctx->isc_nrxqsets; 1193 sc->vmx_flags &= ~VMXNET3_FLAG_SOFT_RSS; 1194 } 1195 } 1196 1197 static void 1198 vmxnet3_reinit_shared_data(struct vmxnet3_softc *sc) 1199 { 1200 struct ifnet *ifp; 1201 struct vmxnet3_driver_shared *ds; 1202 if_softc_ctx_t scctx; 1203 1204 ifp = sc->vmx_ifp; 1205 ds = sc->vmx_ds; 1206 scctx = sc->vmx_scctx; 1207 1208 ds->mtu = ifp->if_mtu; 1209 ds->ntxqueue = scctx->isc_ntxqsets; 1210 ds->nrxqueue = scctx->isc_nrxqsets; 1211 1212 ds->upt_features = 0; 1213 if (ifp->if_capenable & (IFCAP_RXCSUM | IFCAP_RXCSUM_IPV6)) 1214 ds->upt_features |= UPT1_F_CSUM; 1215 if (ifp->if_capenable & IFCAP_VLAN_HWTAGGING) 1216 ds->upt_features |= UPT1_F_VLAN; 1217 if (ifp->if_capenable & IFCAP_LRO) 1218 ds->upt_features |= UPT1_F_LRO; 1219 1220 if (sc->vmx_flags & VMXNET3_FLAG_RSS) { 1221 ds->upt_features |= UPT1_F_RSS; 1222 vmxnet3_reinit_rss_shared_data(sc); 1223 } 1224 1225 vmxnet3_write_bar1(sc, VMXNET3_BAR1_DSL, sc->vmx_ds_dma.idi_paddr); 1226 vmxnet3_write_bar1(sc, VMXNET3_BAR1_DSH, 1227 (uint64_t) sc->vmx_ds_dma.idi_paddr >> 32); 1228 } 1229 1230 static int 1231 vmxnet3_alloc_data(struct vmxnet3_softc *sc) 1232 { 1233 int error; 1234 1235 error = vmxnet3_alloc_shared_data(sc); 1236 if (error) 1237 return (error); 1238 1239 error = vmxnet3_alloc_mcast_table(sc); 1240 if (error) 1241 return (error); 1242 1243 vmxnet3_init_shared_data(sc); 1244 1245 return (0); 1246 } 1247 1248 static void 1249 vmxnet3_free_data(struct vmxnet3_softc *sc) 1250 { 1251 1252 vmxnet3_free_mcast_table(sc); 1253 vmxnet3_free_shared_data(sc); 1254 } 1255 1256 static void 1257 vmxnet3_evintr(struct vmxnet3_softc *sc) 1258 { 1259 device_t dev; 1260 struct vmxnet3_txq_shared *ts; 1261 struct vmxnet3_rxq_shared *rs; 1262 uint32_t event; 1263 1264 dev = sc->vmx_dev; 1265 1266 /* Clear events. */ 1267 event = sc->vmx_ds->event; 1268 vmxnet3_write_bar1(sc, VMXNET3_BAR1_EVENT, event); 1269 1270 if (event & VMXNET3_EVENT_LINK) 1271 vmxnet3_link_status(sc); 1272 1273 if (event & (VMXNET3_EVENT_TQERROR | VMXNET3_EVENT_RQERROR)) { 1274 vmxnet3_read_cmd(sc, VMXNET3_CMD_GET_STATUS); 1275 ts = sc->vmx_txq[0].vxtxq_ts; 1276 if (ts->stopped != 0) 1277 device_printf(dev, "Tx queue error %#x\n", ts->error); 1278 rs = sc->vmx_rxq[0].vxrxq_rs; 1279 if (rs->stopped != 0) 1280 device_printf(dev, "Rx queue error %#x\n", rs->error); 1281 1282 /* XXX - rely on liflib watchdog to reset us? */ 1283 device_printf(dev, "Rx/Tx queue error event ... " 1284 "waiting for iflib watchdog reset\n"); 1285 } 1286 1287 if (event & VMXNET3_EVENT_DIC) 1288 device_printf(dev, "device implementation change event\n"); 1289 if (event & VMXNET3_EVENT_DEBUG) 1290 device_printf(dev, "debug event\n"); 1291 } 1292 1293 static int 1294 vmxnet3_isc_txd_encap(void *vsc, if_pkt_info_t pi) 1295 { 1296 struct vmxnet3_softc *sc; 1297 struct vmxnet3_txqueue *txq; 1298 struct vmxnet3_txring *txr; 1299 struct vmxnet3_txdesc *txd, *sop; 1300 bus_dma_segment_t *segs; 1301 int nsegs; 1302 int pidx; 1303 int hdrlen; 1304 int i; 1305 int gen; 1306 1307 sc = vsc; 1308 txq = &sc->vmx_txq[pi->ipi_qsidx]; 1309 txr = &txq->vxtxq_cmd_ring; 1310 segs = pi->ipi_segs; 1311 nsegs = pi->ipi_nsegs; 1312 pidx = pi->ipi_pidx; 1313 1314 KASSERT(nsegs <= VMXNET3_TX_MAXSEGS, 1315 ("%s: packet with too many segments %d", __func__, nsegs)); 1316 1317 sop = &txr->vxtxr_txd[pidx]; 1318 gen = txr->vxtxr_gen ^ 1; /* Owned by cpu (yet) */ 1319 1320 for (i = 0; i < nsegs; i++) { 1321 txd = &txr->vxtxr_txd[pidx]; 1322 1323 txd->addr = segs[i].ds_addr; 1324 txd->len = segs[i].ds_len; 1325 txd->gen = gen; 1326 txd->dtype = 0; 1327 txd->offload_mode = VMXNET3_OM_NONE; 1328 txd->offload_pos = 0; 1329 txd->hlen = 0; 1330 txd->eop = 0; 1331 txd->compreq = 0; 1332 txd->vtag_mode = 0; 1333 txd->vtag = 0; 1334 1335 if (++pidx == txr->vxtxr_ndesc) { 1336 pidx = 0; 1337 txr->vxtxr_gen ^= 1; 1338 } 1339 gen = txr->vxtxr_gen; 1340 } 1341 txd->eop = 1; 1342 txd->compreq = !!(pi->ipi_flags & IPI_TX_INTR); 1343 pi->ipi_new_pidx = pidx; 1344 1345 /* 1346 * VLAN 1347 */ 1348 if (pi->ipi_mflags & M_VLANTAG) { 1349 sop->vtag_mode = 1; 1350 sop->vtag = pi->ipi_vtag; 1351 } 1352 1353 /* 1354 * TSO and checksum offloads 1355 */ 1356 hdrlen = pi->ipi_ehdrlen + pi->ipi_ip_hlen; 1357 if (pi->ipi_csum_flags & CSUM_TSO) { 1358 sop->offload_mode = VMXNET3_OM_TSO; 1359 sop->hlen = hdrlen + pi->ipi_tcp_hlen; 1360 sop->offload_pos = pi->ipi_tso_segsz; 1361 } else if (pi->ipi_csum_flags & (VMXNET3_CSUM_OFFLOAD | 1362 VMXNET3_CSUM_OFFLOAD_IPV6)) { 1363 sop->offload_mode = VMXNET3_OM_CSUM; 1364 sop->hlen = hdrlen; 1365 sop->offload_pos = hdrlen + 1366 ((pi->ipi_ipproto == IPPROTO_TCP) ? 1367 offsetof(struct tcphdr, th_sum) : 1368 offsetof(struct udphdr, uh_sum)); 1369 } 1370 1371 /* Finally, change the ownership. */ 1372 vmxnet3_barrier(sc, VMXNET3_BARRIER_WR); 1373 sop->gen ^= 1; 1374 1375 return (0); 1376 } 1377 1378 static void 1379 vmxnet3_isc_txd_flush(void *vsc, uint16_t txqid, qidx_t pidx) 1380 { 1381 struct vmxnet3_softc *sc; 1382 struct vmxnet3_txqueue *txq; 1383 1384 sc = vsc; 1385 txq = &sc->vmx_txq[txqid]; 1386 1387 /* 1388 * pidx is what we last set ipi_new_pidx to in 1389 * vmxnet3_isc_txd_encap() 1390 */ 1391 1392 /* 1393 * Avoid expensive register updates if the flush request is 1394 * redundant. 1395 */ 1396 if (txq->vxtxq_last_flush == pidx) 1397 return; 1398 txq->vxtxq_last_flush = pidx; 1399 vmxnet3_write_bar0(sc, VMXNET3_BAR0_TXH(txq->vxtxq_id), pidx); 1400 } 1401 1402 static int 1403 vmxnet3_isc_txd_credits_update(void *vsc, uint16_t txqid, bool clear) 1404 { 1405 struct vmxnet3_softc *sc; 1406 struct vmxnet3_txqueue *txq; 1407 struct vmxnet3_comp_ring *txc; 1408 struct vmxnet3_txcompdesc *txcd; 1409 struct vmxnet3_txring *txr; 1410 int processed; 1411 1412 sc = vsc; 1413 txq = &sc->vmx_txq[txqid]; 1414 txc = &txq->vxtxq_comp_ring; 1415 txr = &txq->vxtxq_cmd_ring; 1416 1417 /* 1418 * If clear is true, we need to report the number of TX command ring 1419 * descriptors that have been processed by the device. If clear is 1420 * false, we just need to report whether or not at least one TX 1421 * command ring descriptor has been processed by the device. 1422 */ 1423 processed = 0; 1424 for (;;) { 1425 txcd = &txc->vxcr_u.txcd[txc->vxcr_next]; 1426 if (txcd->gen != txc->vxcr_gen) 1427 break; 1428 else if (!clear) 1429 return (1); 1430 vmxnet3_barrier(sc, VMXNET3_BARRIER_RD); 1431 1432 if (++txc->vxcr_next == txc->vxcr_ndesc) { 1433 txc->vxcr_next = 0; 1434 txc->vxcr_gen ^= 1; 1435 } 1436 1437 if (txcd->eop_idx < txr->vxtxr_next) 1438 processed += txr->vxtxr_ndesc - 1439 (txr->vxtxr_next - txcd->eop_idx) + 1; 1440 else 1441 processed += txcd->eop_idx - txr->vxtxr_next + 1; 1442 txr->vxtxr_next = (txcd->eop_idx + 1) % txr->vxtxr_ndesc; 1443 } 1444 1445 return (processed); 1446 } 1447 1448 static int 1449 vmxnet3_isc_rxd_available(void *vsc, uint16_t rxqid, qidx_t idx, qidx_t budget) 1450 { 1451 struct vmxnet3_softc *sc; 1452 struct vmxnet3_rxqueue *rxq; 1453 struct vmxnet3_comp_ring *rxc; 1454 struct vmxnet3_rxcompdesc *rxcd; 1455 int avail; 1456 int completed_gen; 1457 #ifdef INVARIANTS 1458 int expect_sop = 1; 1459 #endif 1460 sc = vsc; 1461 rxq = &sc->vmx_rxq[rxqid]; 1462 rxc = &rxq->vxrxq_comp_ring; 1463 1464 avail = 0; 1465 completed_gen = rxc->vxcr_gen; 1466 for (;;) { 1467 rxcd = &rxc->vxcr_u.rxcd[idx]; 1468 if (rxcd->gen != completed_gen) 1469 break; 1470 vmxnet3_barrier(sc, VMXNET3_BARRIER_RD); 1471 1472 #ifdef INVARIANTS 1473 if (expect_sop) 1474 KASSERT(rxcd->sop, ("%s: expected sop", __func__)); 1475 else 1476 KASSERT(!rxcd->sop, ("%s: unexpected sop", __func__)); 1477 expect_sop = rxcd->eop; 1478 #endif 1479 if (rxcd->eop && (rxcd->len != 0)) 1480 avail++; 1481 if (avail > budget) 1482 break; 1483 if (++idx == rxc->vxcr_ndesc) { 1484 idx = 0; 1485 completed_gen ^= 1; 1486 } 1487 } 1488 1489 return (avail); 1490 } 1491 1492 static int 1493 vmxnet3_isc_rxd_pkt_get(void *vsc, if_rxd_info_t ri) 1494 { 1495 struct vmxnet3_softc *sc; 1496 if_softc_ctx_t scctx; 1497 struct vmxnet3_rxqueue *rxq; 1498 struct vmxnet3_comp_ring *rxc; 1499 struct vmxnet3_rxcompdesc *rxcd; 1500 if_rxd_frag_t frag; 1501 int cqidx; 1502 uint16_t total_len; 1503 uint8_t nfrags; 1504 uint8_t i; 1505 uint8_t flid; 1506 1507 sc = vsc; 1508 scctx = sc->vmx_scctx; 1509 rxq = &sc->vmx_rxq[ri->iri_qsidx]; 1510 rxc = &rxq->vxrxq_comp_ring; 1511 1512 /* 1513 * Get a single packet starting at the given index in the completion 1514 * queue. That we have been called indicates that 1515 * vmxnet3_isc_rxd_available() has already verified that either 1516 * there is a complete packet available starting at the given index, 1517 * or there are one or more zero length packets starting at the 1518 * given index followed by a complete packet, so no verification of 1519 * ownership of the descriptors (and no associated read barrier) is 1520 * required here. 1521 */ 1522 cqidx = ri->iri_cidx; 1523 rxcd = &rxc->vxcr_u.rxcd[cqidx]; 1524 while (rxcd->len == 0) { 1525 KASSERT(rxcd->sop && rxcd->eop, 1526 ("%s: zero-length packet without both sop and eop set", 1527 __func__)); 1528 rxc->vxcr_zero_length++; 1529 if (++cqidx == rxc->vxcr_ndesc) { 1530 cqidx = 0; 1531 rxc->vxcr_gen ^= 1; 1532 } 1533 rxcd = &rxc->vxcr_u.rxcd[cqidx]; 1534 } 1535 KASSERT(rxcd->sop, ("%s: expected sop", __func__)); 1536 1537 /* 1538 * RSS and flow ID. 1539 * Types other than M_HASHTYPE_NONE and M_HASHTYPE_OPAQUE_HASH should 1540 * be used only if the software RSS is enabled and it uses the same 1541 * algorithm and the hash key as the "hardware". If the software RSS 1542 * is not enabled, then it's simply pointless to use those types. 1543 * If it's enabled but with different parameters, then hash values will 1544 * not match. 1545 */ 1546 ri->iri_flowid = rxcd->rss_hash; 1547 #ifdef RSS 1548 if ((sc->vmx_flags & VMXNET3_FLAG_SOFT_RSS) != 0) { 1549 switch (rxcd->rss_type) { 1550 case VMXNET3_RCD_RSS_TYPE_NONE: 1551 ri->iri_flowid = ri->iri_qsidx; 1552 ri->iri_rsstype = M_HASHTYPE_NONE; 1553 break; 1554 case VMXNET3_RCD_RSS_TYPE_IPV4: 1555 ri->iri_rsstype = M_HASHTYPE_RSS_IPV4; 1556 break; 1557 case VMXNET3_RCD_RSS_TYPE_TCPIPV4: 1558 ri->iri_rsstype = M_HASHTYPE_RSS_TCP_IPV4; 1559 break; 1560 case VMXNET3_RCD_RSS_TYPE_IPV6: 1561 ri->iri_rsstype = M_HASHTYPE_RSS_IPV6; 1562 break; 1563 case VMXNET3_RCD_RSS_TYPE_TCPIPV6: 1564 ri->iri_rsstype = M_HASHTYPE_RSS_TCP_IPV6; 1565 break; 1566 default: 1567 ri->iri_rsstype = M_HASHTYPE_OPAQUE_HASH; 1568 break; 1569 } 1570 } else 1571 #endif 1572 { 1573 switch (rxcd->rss_type) { 1574 case VMXNET3_RCD_RSS_TYPE_NONE: 1575 ri->iri_flowid = ri->iri_qsidx; 1576 ri->iri_rsstype = M_HASHTYPE_NONE; 1577 break; 1578 default: 1579 ri->iri_rsstype = M_HASHTYPE_OPAQUE_HASH; 1580 break; 1581 } 1582 } 1583 1584 /* 1585 * The queue numbering scheme used for rxcd->qid is as follows: 1586 * - All of the command ring 0s are numbered [0, nrxqsets - 1] 1587 * - All of the command ring 1s are numbered [nrxqsets, 2*nrxqsets - 1] 1588 * 1589 * Thus, rxcd->qid less than nrxqsets indicates command ring (and 1590 * flid) 0, and rxcd->qid greater than or equal to nrxqsets 1591 * indicates command ring (and flid) 1. 1592 */ 1593 nfrags = 0; 1594 total_len = 0; 1595 do { 1596 rxcd = &rxc->vxcr_u.rxcd[cqidx]; 1597 KASSERT(rxcd->gen == rxc->vxcr_gen, 1598 ("%s: generation mismatch", __func__)); 1599 KASSERT(nfrags < IFLIB_MAX_RX_SEGS, 1600 ("%s: too many fragments", __func__)); 1601 if (__predict_true(rxcd->len != 0)) { 1602 frag = &ri->iri_frags[nfrags]; 1603 flid = (rxcd->qid >= scctx->isc_nrxqsets) ? 1 : 0; 1604 frag->irf_flid = flid; 1605 frag->irf_idx = rxcd->rxd_idx; 1606 frag->irf_len = rxcd->len; 1607 total_len += rxcd->len; 1608 nfrags++; 1609 } else { 1610 rxc->vcxr_zero_length_frag++; 1611 } 1612 if (++cqidx == rxc->vxcr_ndesc) { 1613 cqidx = 0; 1614 rxc->vxcr_gen ^= 1; 1615 } 1616 } while (!rxcd->eop); 1617 1618 ri->iri_cidx = cqidx; 1619 ri->iri_nfrags = nfrags; 1620 ri->iri_len = total_len; 1621 1622 /* 1623 * If there's an error, the last descriptor in the packet will 1624 * have the error indicator set. In this case, set all 1625 * fragment lengths to zero. This will cause iflib to discard 1626 * the packet, but process all associated descriptors through 1627 * the refill mechanism. 1628 */ 1629 if (__predict_false(rxcd->error)) { 1630 rxc->vxcr_pkt_errors++; 1631 for (i = 0; i < nfrags; i++) { 1632 frag = &ri->iri_frags[i]; 1633 frag->irf_len = 0; 1634 } 1635 } else { 1636 /* Checksum offload information is in the last descriptor. */ 1637 if (!rxcd->no_csum) { 1638 uint32_t csum_flags = 0; 1639 1640 if (rxcd->ipv4) { 1641 csum_flags |= CSUM_IP_CHECKED; 1642 if (rxcd->ipcsum_ok) 1643 csum_flags |= CSUM_IP_VALID; 1644 } 1645 if (!rxcd->fragment && (rxcd->tcp || rxcd->udp)) { 1646 csum_flags |= CSUM_L4_CALC; 1647 if (rxcd->csum_ok) { 1648 csum_flags |= CSUM_L4_VALID; 1649 ri->iri_csum_data = 0xffff; 1650 } 1651 } 1652 ri->iri_csum_flags = csum_flags; 1653 } 1654 1655 /* VLAN information is in the last descriptor. */ 1656 if (rxcd->vlan) { 1657 ri->iri_flags |= M_VLANTAG; 1658 ri->iri_vtag = rxcd->vtag; 1659 } 1660 } 1661 1662 return (0); 1663 } 1664 1665 static void 1666 vmxnet3_isc_rxd_refill(void *vsc, if_rxd_update_t iru) 1667 { 1668 struct vmxnet3_softc *sc; 1669 struct vmxnet3_rxqueue *rxq; 1670 struct vmxnet3_rxring *rxr; 1671 struct vmxnet3_rxdesc *rxd; 1672 uint64_t *paddrs; 1673 int count; 1674 int len; 1675 int idx; 1676 int i; 1677 uint8_t flid; 1678 uint8_t btype; 1679 1680 count = iru->iru_count; 1681 len = iru->iru_buf_size; 1682 flid = iru->iru_flidx; 1683 paddrs = iru->iru_paddrs; 1684 1685 sc = vsc; 1686 rxq = &sc->vmx_rxq[iru->iru_qsidx]; 1687 rxr = &rxq->vxrxq_cmd_ring[flid]; 1688 rxd = rxr->vxrxr_rxd; 1689 1690 /* 1691 * Command ring 0 is filled with BTYPE_HEAD descriptors, and 1692 * command ring 1 is filled with BTYPE_BODY descriptors. 1693 */ 1694 btype = (flid == 0) ? VMXNET3_BTYPE_HEAD : VMXNET3_BTYPE_BODY; 1695 /* 1696 * The refill entries from iflib will advance monotonically, 1697 * but the refilled descriptors may not be contiguous due to 1698 * earlier skipping of descriptors by the device. The refill 1699 * entries from iflib need an entire state update, while the 1700 * descriptors previously skipped by the device only need to 1701 * have their generation numbers updated. 1702 */ 1703 idx = rxr->vxrxr_refill_start; 1704 i = 0; 1705 do { 1706 if (idx == iru->iru_idxs[i]) { 1707 rxd[idx].addr = paddrs[i]; 1708 rxd[idx].len = len; 1709 rxd[idx].btype = btype; 1710 i++; 1711 } else 1712 rxr->vxrxr_desc_skips++; 1713 rxd[idx].gen = rxr->vxrxr_gen; 1714 1715 if (++idx == rxr->vxrxr_ndesc) { 1716 idx = 0; 1717 rxr->vxrxr_gen ^= 1; 1718 } 1719 } while (i != count); 1720 rxr->vxrxr_refill_start = idx; 1721 } 1722 1723 static void 1724 vmxnet3_isc_rxd_flush(void *vsc, uint16_t rxqid, uint8_t flid, qidx_t pidx) 1725 { 1726 struct vmxnet3_softc *sc; 1727 bus_size_t r; 1728 1729 sc = vsc; 1730 1731 if (flid == 0) 1732 r = VMXNET3_BAR0_RXH1(rxqid); 1733 else 1734 r = VMXNET3_BAR0_RXH2(rxqid); 1735 1736 vmxnet3_write_bar0(sc, r, pidx); 1737 } 1738 1739 static int 1740 vmxnet3_legacy_intr(void *xsc) 1741 { 1742 struct vmxnet3_softc *sc; 1743 if_softc_ctx_t scctx; 1744 if_ctx_t ctx; 1745 1746 sc = xsc; 1747 scctx = sc->vmx_scctx; 1748 ctx = sc->vmx_ctx; 1749 1750 /* 1751 * When there is only a single interrupt configured, this routine 1752 * runs in fast interrupt context, following which the rxq 0 task 1753 * will be enqueued. 1754 */ 1755 if (scctx->isc_intr == IFLIB_INTR_LEGACY) { 1756 if (vmxnet3_read_bar1(sc, VMXNET3_BAR1_INTR) == 0) 1757 return (FILTER_HANDLED); 1758 } 1759 if (sc->vmx_intr_mask_mode == VMXNET3_IMM_ACTIVE) 1760 vmxnet3_intr_disable_all(ctx); 1761 1762 if (sc->vmx_ds->event != 0) 1763 iflib_admin_intr_deferred(ctx); 1764 1765 /* 1766 * XXX - When there is both rxq and event activity, do we care 1767 * whether the rxq 0 task or the admin task re-enables the interrupt 1768 * first? 1769 */ 1770 return (FILTER_SCHEDULE_THREAD); 1771 } 1772 1773 static int 1774 vmxnet3_rxq_intr(void *vrxq) 1775 { 1776 struct vmxnet3_softc *sc; 1777 struct vmxnet3_rxqueue *rxq; 1778 1779 rxq = vrxq; 1780 sc = rxq->vxrxq_sc; 1781 1782 if (sc->vmx_intr_mask_mode == VMXNET3_IMM_ACTIVE) 1783 vmxnet3_disable_intr(sc, rxq->vxrxq_intr_idx); 1784 1785 return (FILTER_SCHEDULE_THREAD); 1786 } 1787 1788 static int 1789 vmxnet3_event_intr(void *vsc) 1790 { 1791 struct vmxnet3_softc *sc; 1792 1793 sc = vsc; 1794 1795 if (sc->vmx_intr_mask_mode == VMXNET3_IMM_ACTIVE) 1796 vmxnet3_disable_intr(sc, sc->vmx_event_intr_idx); 1797 1798 /* 1799 * The work will be done via vmxnet3_update_admin_status(), and the 1800 * interrupt will be re-enabled in vmxnet3_link_intr_enable(). 1801 * 1802 * The interrupt will be re-enabled by vmxnet3_link_intr_enable(). 1803 */ 1804 return (FILTER_SCHEDULE_THREAD); 1805 } 1806 1807 static void 1808 vmxnet3_stop(if_ctx_t ctx) 1809 { 1810 struct vmxnet3_softc *sc; 1811 1812 sc = iflib_get_softc(ctx); 1813 1814 sc->vmx_link_active = 0; 1815 vmxnet3_write_cmd(sc, VMXNET3_CMD_DISABLE); 1816 vmxnet3_write_cmd(sc, VMXNET3_CMD_RESET); 1817 } 1818 1819 static void 1820 vmxnet3_txinit(struct vmxnet3_softc *sc, struct vmxnet3_txqueue *txq) 1821 { 1822 struct vmxnet3_txring *txr; 1823 struct vmxnet3_comp_ring *txc; 1824 1825 txq->vxtxq_last_flush = -1; 1826 1827 txr = &txq->vxtxq_cmd_ring; 1828 txr->vxtxr_next = 0; 1829 txr->vxtxr_gen = VMXNET3_INIT_GEN; 1830 /* 1831 * iflib has zeroed out the descriptor array during the prior attach 1832 * or stop 1833 */ 1834 1835 txc = &txq->vxtxq_comp_ring; 1836 txc->vxcr_next = 0; 1837 txc->vxcr_gen = VMXNET3_INIT_GEN; 1838 /* 1839 * iflib has zeroed out the descriptor array during the prior attach 1840 * or stop 1841 */ 1842 } 1843 1844 static void 1845 vmxnet3_rxinit(struct vmxnet3_softc *sc, struct vmxnet3_rxqueue *rxq) 1846 { 1847 struct vmxnet3_rxring *rxr; 1848 struct vmxnet3_comp_ring *rxc; 1849 int i; 1850 1851 /* 1852 * The descriptors will be populated with buffers during a 1853 * subsequent invocation of vmxnet3_isc_rxd_refill() 1854 */ 1855 for (i = 0; i < sc->vmx_sctx->isc_nrxqs - 1; i++) { 1856 rxr = &rxq->vxrxq_cmd_ring[i]; 1857 rxr->vxrxr_gen = VMXNET3_INIT_GEN; 1858 rxr->vxrxr_desc_skips = 0; 1859 rxr->vxrxr_refill_start = 0; 1860 /* 1861 * iflib has zeroed out the descriptor array during the 1862 * prior attach or stop 1863 */ 1864 } 1865 1866 for (/**/; i < VMXNET3_RXRINGS_PERQ; i++) { 1867 rxr = &rxq->vxrxq_cmd_ring[i]; 1868 rxr->vxrxr_gen = 0; 1869 rxr->vxrxr_desc_skips = 0; 1870 rxr->vxrxr_refill_start = 0; 1871 bzero(rxr->vxrxr_rxd, 1872 rxr->vxrxr_ndesc * sizeof(struct vmxnet3_rxdesc)); 1873 } 1874 1875 rxc = &rxq->vxrxq_comp_ring; 1876 rxc->vxcr_next = 0; 1877 rxc->vxcr_gen = VMXNET3_INIT_GEN; 1878 rxc->vxcr_zero_length = 0; 1879 rxc->vcxr_zero_length_frag = 0; 1880 rxc->vxcr_pkt_errors = 0; 1881 /* 1882 * iflib has zeroed out the descriptor array during the prior attach 1883 * or stop 1884 */ 1885 } 1886 1887 static void 1888 vmxnet3_reinit_queues(struct vmxnet3_softc *sc) 1889 { 1890 if_softc_ctx_t scctx; 1891 int q; 1892 1893 scctx = sc->vmx_scctx; 1894 1895 for (q = 0; q < scctx->isc_ntxqsets; q++) 1896 vmxnet3_txinit(sc, &sc->vmx_txq[q]); 1897 1898 for (q = 0; q < scctx->isc_nrxqsets; q++) 1899 vmxnet3_rxinit(sc, &sc->vmx_rxq[q]); 1900 } 1901 1902 static int 1903 vmxnet3_enable_device(struct vmxnet3_softc *sc) 1904 { 1905 if_softc_ctx_t scctx; 1906 int q; 1907 1908 scctx = sc->vmx_scctx; 1909 1910 if (vmxnet3_read_cmd(sc, VMXNET3_CMD_ENABLE) != 0) { 1911 device_printf(sc->vmx_dev, "device enable command failed!\n"); 1912 return (1); 1913 } 1914 1915 /* Reset the Rx queue heads. */ 1916 for (q = 0; q < scctx->isc_nrxqsets; q++) { 1917 vmxnet3_write_bar0(sc, VMXNET3_BAR0_RXH1(q), 0); 1918 vmxnet3_write_bar0(sc, VMXNET3_BAR0_RXH2(q), 0); 1919 } 1920 1921 return (0); 1922 } 1923 1924 static void 1925 vmxnet3_reinit_rxfilters(struct vmxnet3_softc *sc) 1926 { 1927 struct ifnet *ifp; 1928 1929 ifp = sc->vmx_ifp; 1930 1931 vmxnet3_set_rxfilter(sc, if_getflags(ifp)); 1932 1933 if (ifp->if_capenable & IFCAP_VLAN_HWFILTER) 1934 bcopy(sc->vmx_vlan_filter, sc->vmx_ds->vlan_filter, 1935 sizeof(sc->vmx_ds->vlan_filter)); 1936 else 1937 bzero(sc->vmx_ds->vlan_filter, 1938 sizeof(sc->vmx_ds->vlan_filter)); 1939 vmxnet3_write_cmd(sc, VMXNET3_CMD_VLAN_FILTER); 1940 } 1941 1942 static void 1943 vmxnet3_init(if_ctx_t ctx) 1944 { 1945 struct vmxnet3_softc *sc; 1946 1947 sc = iflib_get_softc(ctx); 1948 1949 /* Use the current MAC address. */ 1950 bcopy(IF_LLADDR(sc->vmx_ifp), sc->vmx_lladdr, ETHER_ADDR_LEN); 1951 vmxnet3_set_lladdr(sc); 1952 1953 vmxnet3_reinit_shared_data(sc); 1954 vmxnet3_reinit_queues(sc); 1955 1956 vmxnet3_enable_device(sc); 1957 1958 vmxnet3_reinit_rxfilters(sc); 1959 vmxnet3_link_status(sc); 1960 } 1961 1962 static void 1963 vmxnet3_multi_set(if_ctx_t ctx) 1964 { 1965 1966 vmxnet3_set_rxfilter(iflib_get_softc(ctx), 1967 if_getflags(iflib_get_ifp(ctx))); 1968 } 1969 1970 static int 1971 vmxnet3_mtu_set(if_ctx_t ctx, uint32_t mtu) 1972 { 1973 struct vmxnet3_softc *sc; 1974 if_softc_ctx_t scctx; 1975 1976 sc = iflib_get_softc(ctx); 1977 scctx = sc->vmx_scctx; 1978 1979 if (mtu > VMXNET3_TX_MAXSIZE - (ETHER_HDR_LEN + ETHER_VLAN_ENCAP_LEN + 1980 ETHER_CRC_LEN)) 1981 return (EINVAL); 1982 1983 /* 1984 * Update the max frame size so that the rx mbuf size is 1985 * chosen based on the new mtu during the interface init that 1986 * will occur after this routine returns. 1987 */ 1988 scctx->isc_max_frame_size = mtu + 1989 ETHER_HDR_LEN + ETHER_VLAN_ENCAP_LEN + ETHER_CRC_LEN; 1990 /* RX completion queue - n/a */ 1991 scctx->isc_rxd_buf_size[0] = 0; 1992 /* 1993 * For header-type descriptors (used for first segment of 1994 * packet), let iflib determine the buffer size based on the 1995 * max frame size. 1996 */ 1997 scctx->isc_rxd_buf_size[1] = 0; 1998 /* 1999 * For body-type descriptors (used for jumbo frames and LRO), 2000 * always use page-sized buffers. 2001 */ 2002 scctx->isc_rxd_buf_size[2] = MJUMPAGESIZE; 2003 2004 return (0); 2005 } 2006 2007 static void 2008 vmxnet3_media_status(if_ctx_t ctx, struct ifmediareq * ifmr) 2009 { 2010 struct vmxnet3_softc *sc; 2011 2012 sc = iflib_get_softc(ctx); 2013 2014 ifmr->ifm_status = IFM_AVALID; 2015 ifmr->ifm_active = IFM_ETHER; 2016 2017 if (vmxnet3_link_is_up(sc) != 0) { 2018 ifmr->ifm_status |= IFM_ACTIVE; 2019 ifmr->ifm_active |= IFM_AUTO; 2020 } else 2021 ifmr->ifm_active |= IFM_NONE; 2022 } 2023 2024 static int 2025 vmxnet3_media_change(if_ctx_t ctx) 2026 { 2027 2028 /* Ignore. */ 2029 return (0); 2030 } 2031 2032 static int 2033 vmxnet3_promisc_set(if_ctx_t ctx, int flags) 2034 { 2035 2036 vmxnet3_set_rxfilter(iflib_get_softc(ctx), flags); 2037 2038 return (0); 2039 } 2040 2041 static uint64_t 2042 vmxnet3_get_counter(if_ctx_t ctx, ift_counter cnt) 2043 { 2044 if_t ifp = iflib_get_ifp(ctx); 2045 2046 if (cnt < IFCOUNTERS) 2047 return if_get_counter_default(ifp, cnt); 2048 2049 return (0); 2050 } 2051 2052 static void 2053 vmxnet3_update_admin_status(if_ctx_t ctx) 2054 { 2055 struct vmxnet3_softc *sc; 2056 2057 sc = iflib_get_softc(ctx); 2058 if (sc->vmx_ds->event != 0) 2059 vmxnet3_evintr(sc); 2060 2061 vmxnet3_refresh_host_stats(sc); 2062 } 2063 2064 static void 2065 vmxnet3_txq_timer(if_ctx_t ctx, uint16_t qid) 2066 { 2067 /* Host stats refresh is global, so just trigger it on txq 0 */ 2068 if (qid == 0) 2069 vmxnet3_refresh_host_stats(iflib_get_softc(ctx)); 2070 } 2071 2072 static void 2073 vmxnet3_update_vlan_filter(struct vmxnet3_softc *sc, int add, uint16_t tag) 2074 { 2075 int idx, bit; 2076 2077 if (tag == 0 || tag > 4095) 2078 return; 2079 2080 idx = (tag >> 5) & 0x7F; 2081 bit = tag & 0x1F; 2082 2083 /* Update our private VLAN bitvector. */ 2084 if (add) 2085 sc->vmx_vlan_filter[idx] |= (1 << bit); 2086 else 2087 sc->vmx_vlan_filter[idx] &= ~(1 << bit); 2088 } 2089 2090 static void 2091 vmxnet3_vlan_register(if_ctx_t ctx, uint16_t tag) 2092 { 2093 2094 vmxnet3_update_vlan_filter(iflib_get_softc(ctx), 1, tag); 2095 } 2096 2097 static void 2098 vmxnet3_vlan_unregister(if_ctx_t ctx, uint16_t tag) 2099 { 2100 2101 vmxnet3_update_vlan_filter(iflib_get_softc(ctx), 0, tag); 2102 } 2103 2104 static u_int 2105 vmxnet3_hash_maddr(void *arg, struct sockaddr_dl *sdl, u_int count) 2106 { 2107 struct vmxnet3_softc *sc = arg; 2108 2109 if (count < VMXNET3_MULTICAST_MAX) 2110 bcopy(LLADDR(sdl), &sc->vmx_mcast[count * ETHER_ADDR_LEN], 2111 ETHER_ADDR_LEN); 2112 2113 return (1); 2114 } 2115 2116 static void 2117 vmxnet3_set_rxfilter(struct vmxnet3_softc *sc, int flags) 2118 { 2119 struct ifnet *ifp; 2120 struct vmxnet3_driver_shared *ds; 2121 u_int mode; 2122 2123 ifp = sc->vmx_ifp; 2124 ds = sc->vmx_ds; 2125 2126 mode = VMXNET3_RXMODE_UCAST | VMXNET3_RXMODE_BCAST; 2127 if (flags & IFF_PROMISC) 2128 mode |= VMXNET3_RXMODE_PROMISC; 2129 if (flags & IFF_ALLMULTI) 2130 mode |= VMXNET3_RXMODE_ALLMULTI; 2131 else { 2132 int cnt; 2133 2134 cnt = if_foreach_llmaddr(ifp, vmxnet3_hash_maddr, sc); 2135 if (cnt >= VMXNET3_MULTICAST_MAX) { 2136 cnt = 0; 2137 mode |= VMXNET3_RXMODE_ALLMULTI; 2138 } else if (cnt > 0) 2139 mode |= VMXNET3_RXMODE_MCAST; 2140 ds->mcast_tablelen = cnt * ETHER_ADDR_LEN; 2141 } 2142 2143 ds->rxmode = mode; 2144 2145 vmxnet3_write_cmd(sc, VMXNET3_CMD_SET_FILTER); 2146 vmxnet3_write_cmd(sc, VMXNET3_CMD_SET_RXMODE); 2147 } 2148 2149 static void 2150 vmxnet3_refresh_host_stats(struct vmxnet3_softc *sc) 2151 { 2152 2153 vmxnet3_write_cmd(sc, VMXNET3_CMD_GET_STATS); 2154 } 2155 2156 static int 2157 vmxnet3_link_is_up(struct vmxnet3_softc *sc) 2158 { 2159 uint32_t status; 2160 2161 status = vmxnet3_read_cmd(sc, VMXNET3_CMD_GET_LINK); 2162 return !!(status & 0x1); 2163 } 2164 2165 static void 2166 vmxnet3_link_status(struct vmxnet3_softc *sc) 2167 { 2168 if_ctx_t ctx; 2169 uint64_t speed; 2170 int link; 2171 2172 ctx = sc->vmx_ctx; 2173 link = vmxnet3_link_is_up(sc); 2174 speed = IF_Gbps(10); 2175 2176 if (link != 0 && sc->vmx_link_active == 0) { 2177 sc->vmx_link_active = 1; 2178 iflib_link_state_change(ctx, LINK_STATE_UP, speed); 2179 } else if (link == 0 && sc->vmx_link_active != 0) { 2180 sc->vmx_link_active = 0; 2181 iflib_link_state_change(ctx, LINK_STATE_DOWN, speed); 2182 } 2183 } 2184 2185 static void 2186 vmxnet3_set_lladdr(struct vmxnet3_softc *sc) 2187 { 2188 uint32_t ml, mh; 2189 2190 ml = sc->vmx_lladdr[0]; 2191 ml |= sc->vmx_lladdr[1] << 8; 2192 ml |= sc->vmx_lladdr[2] << 16; 2193 ml |= sc->vmx_lladdr[3] << 24; 2194 vmxnet3_write_bar1(sc, VMXNET3_BAR1_MACL, ml); 2195 2196 mh = sc->vmx_lladdr[4]; 2197 mh |= sc->vmx_lladdr[5] << 8; 2198 vmxnet3_write_bar1(sc, VMXNET3_BAR1_MACH, mh); 2199 } 2200 2201 static void 2202 vmxnet3_get_lladdr(struct vmxnet3_softc *sc) 2203 { 2204 uint32_t ml, mh; 2205 2206 ml = vmxnet3_read_cmd(sc, VMXNET3_CMD_GET_MACL); 2207 mh = vmxnet3_read_cmd(sc, VMXNET3_CMD_GET_MACH); 2208 2209 sc->vmx_lladdr[0] = ml; 2210 sc->vmx_lladdr[1] = ml >> 8; 2211 sc->vmx_lladdr[2] = ml >> 16; 2212 sc->vmx_lladdr[3] = ml >> 24; 2213 sc->vmx_lladdr[4] = mh; 2214 sc->vmx_lladdr[5] = mh >> 8; 2215 } 2216 2217 static void 2218 vmxnet3_setup_txq_sysctl(struct vmxnet3_txqueue *txq, 2219 struct sysctl_ctx_list *ctx, struct sysctl_oid_list *child) 2220 { 2221 struct sysctl_oid *node, *txsnode; 2222 struct sysctl_oid_list *list, *txslist; 2223 struct UPT1_TxStats *txstats; 2224 char namebuf[16]; 2225 2226 txstats = &txq->vxtxq_ts->stats; 2227 2228 snprintf(namebuf, sizeof(namebuf), "txq%d", txq->vxtxq_id); 2229 node = SYSCTL_ADD_NODE(ctx, child, OID_AUTO, namebuf, 2230 CTLFLAG_RD | CTLFLAG_MPSAFE, NULL, "Transmit Queue"); 2231 txq->vxtxq_sysctl = list = SYSCTL_CHILDREN(node); 2232 2233 /* 2234 * Add statistics reported by the host. These are updated by the 2235 * iflib txq timer on txq 0. 2236 */ 2237 txsnode = SYSCTL_ADD_NODE(ctx, list, OID_AUTO, "hstats", 2238 CTLFLAG_RD | CTLFLAG_MPSAFE, NULL, "Host Statistics"); 2239 txslist = SYSCTL_CHILDREN(txsnode); 2240 SYSCTL_ADD_UQUAD(ctx, txslist, OID_AUTO, "tso_packets", CTLFLAG_RD, 2241 &txstats->TSO_packets, "TSO packets"); 2242 SYSCTL_ADD_UQUAD(ctx, txslist, OID_AUTO, "tso_bytes", CTLFLAG_RD, 2243 &txstats->TSO_bytes, "TSO bytes"); 2244 SYSCTL_ADD_UQUAD(ctx, txslist, OID_AUTO, "ucast_packets", CTLFLAG_RD, 2245 &txstats->ucast_packets, "Unicast packets"); 2246 SYSCTL_ADD_UQUAD(ctx, txslist, OID_AUTO, "unicast_bytes", CTLFLAG_RD, 2247 &txstats->ucast_bytes, "Unicast bytes"); 2248 SYSCTL_ADD_UQUAD(ctx, txslist, OID_AUTO, "mcast_packets", CTLFLAG_RD, 2249 &txstats->mcast_packets, "Multicast packets"); 2250 SYSCTL_ADD_UQUAD(ctx, txslist, OID_AUTO, "mcast_bytes", CTLFLAG_RD, 2251 &txstats->mcast_bytes, "Multicast bytes"); 2252 SYSCTL_ADD_UQUAD(ctx, txslist, OID_AUTO, "error", CTLFLAG_RD, 2253 &txstats->error, "Errors"); 2254 SYSCTL_ADD_UQUAD(ctx, txslist, OID_AUTO, "discard", CTLFLAG_RD, 2255 &txstats->discard, "Discards"); 2256 } 2257 2258 static void 2259 vmxnet3_setup_rxq_sysctl(struct vmxnet3_rxqueue *rxq, 2260 struct sysctl_ctx_list *ctx, struct sysctl_oid_list *child) 2261 { 2262 struct sysctl_oid *node, *rxsnode; 2263 struct sysctl_oid_list *list, *rxslist; 2264 struct UPT1_RxStats *rxstats; 2265 char namebuf[16]; 2266 2267 rxstats = &rxq->vxrxq_rs->stats; 2268 2269 snprintf(namebuf, sizeof(namebuf), "rxq%d", rxq->vxrxq_id); 2270 node = SYSCTL_ADD_NODE(ctx, child, OID_AUTO, namebuf, 2271 CTLFLAG_RD | CTLFLAG_MPSAFE, NULL, "Receive Queue"); 2272 rxq->vxrxq_sysctl = list = SYSCTL_CHILDREN(node); 2273 2274 /* 2275 * Add statistics reported by the host. These are updated by the 2276 * iflib txq timer on txq 0. 2277 */ 2278 rxsnode = SYSCTL_ADD_NODE(ctx, list, OID_AUTO, "hstats", 2279 CTLFLAG_RD | CTLFLAG_MPSAFE, NULL, "Host Statistics"); 2280 rxslist = SYSCTL_CHILDREN(rxsnode); 2281 SYSCTL_ADD_UQUAD(ctx, rxslist, OID_AUTO, "lro_packets", CTLFLAG_RD, 2282 &rxstats->LRO_packets, "LRO packets"); 2283 SYSCTL_ADD_UQUAD(ctx, rxslist, OID_AUTO, "lro_bytes", CTLFLAG_RD, 2284 &rxstats->LRO_bytes, "LRO bytes"); 2285 SYSCTL_ADD_UQUAD(ctx, rxslist, OID_AUTO, "ucast_packets", CTLFLAG_RD, 2286 &rxstats->ucast_packets, "Unicast packets"); 2287 SYSCTL_ADD_UQUAD(ctx, rxslist, OID_AUTO, "unicast_bytes", CTLFLAG_RD, 2288 &rxstats->ucast_bytes, "Unicast bytes"); 2289 SYSCTL_ADD_UQUAD(ctx, rxslist, OID_AUTO, "mcast_packets", CTLFLAG_RD, 2290 &rxstats->mcast_packets, "Multicast packets"); 2291 SYSCTL_ADD_UQUAD(ctx, rxslist, OID_AUTO, "mcast_bytes", CTLFLAG_RD, 2292 &rxstats->mcast_bytes, "Multicast bytes"); 2293 SYSCTL_ADD_UQUAD(ctx, rxslist, OID_AUTO, "bcast_packets", CTLFLAG_RD, 2294 &rxstats->bcast_packets, "Broadcast packets"); 2295 SYSCTL_ADD_UQUAD(ctx, rxslist, OID_AUTO, "bcast_bytes", CTLFLAG_RD, 2296 &rxstats->bcast_bytes, "Broadcast bytes"); 2297 SYSCTL_ADD_UQUAD(ctx, rxslist, OID_AUTO, "nobuffer", CTLFLAG_RD, 2298 &rxstats->nobuffer, "No buffer"); 2299 SYSCTL_ADD_UQUAD(ctx, rxslist, OID_AUTO, "error", CTLFLAG_RD, 2300 &rxstats->error, "Errors"); 2301 } 2302 2303 static void 2304 vmxnet3_setup_debug_sysctl(struct vmxnet3_softc *sc, 2305 struct sysctl_ctx_list *ctx, struct sysctl_oid_list *child) 2306 { 2307 if_softc_ctx_t scctx; 2308 struct sysctl_oid *node; 2309 struct sysctl_oid_list *list; 2310 int i; 2311 2312 scctx = sc->vmx_scctx; 2313 2314 for (i = 0; i < scctx->isc_ntxqsets; i++) { 2315 struct vmxnet3_txqueue *txq = &sc->vmx_txq[i]; 2316 2317 node = SYSCTL_ADD_NODE(ctx, txq->vxtxq_sysctl, OID_AUTO, 2318 "debug", CTLFLAG_RD | CTLFLAG_MPSAFE, NULL, ""); 2319 list = SYSCTL_CHILDREN(node); 2320 2321 SYSCTL_ADD_UINT(ctx, list, OID_AUTO, "cmd_next", CTLFLAG_RD, 2322 &txq->vxtxq_cmd_ring.vxtxr_next, 0, ""); 2323 SYSCTL_ADD_UINT(ctx, list, OID_AUTO, "cmd_ndesc", CTLFLAG_RD, 2324 &txq->vxtxq_cmd_ring.vxtxr_ndesc, 0, ""); 2325 SYSCTL_ADD_INT(ctx, list, OID_AUTO, "cmd_gen", CTLFLAG_RD, 2326 &txq->vxtxq_cmd_ring.vxtxr_gen, 0, ""); 2327 SYSCTL_ADD_UINT(ctx, list, OID_AUTO, "comp_next", CTLFLAG_RD, 2328 &txq->vxtxq_comp_ring.vxcr_next, 0, ""); 2329 SYSCTL_ADD_UINT(ctx, list, OID_AUTO, "comp_ndesc", CTLFLAG_RD, 2330 &txq->vxtxq_comp_ring.vxcr_ndesc, 0,""); 2331 SYSCTL_ADD_INT(ctx, list, OID_AUTO, "comp_gen", CTLFLAG_RD, 2332 &txq->vxtxq_comp_ring.vxcr_gen, 0, ""); 2333 } 2334 2335 for (i = 0; i < scctx->isc_nrxqsets; i++) { 2336 struct vmxnet3_rxqueue *rxq = &sc->vmx_rxq[i]; 2337 2338 node = SYSCTL_ADD_NODE(ctx, rxq->vxrxq_sysctl, OID_AUTO, 2339 "debug", CTLFLAG_RD | CTLFLAG_MPSAFE, NULL, ""); 2340 list = SYSCTL_CHILDREN(node); 2341 2342 SYSCTL_ADD_UINT(ctx, list, OID_AUTO, "cmd0_ndesc", CTLFLAG_RD, 2343 &rxq->vxrxq_cmd_ring[0].vxrxr_ndesc, 0, ""); 2344 SYSCTL_ADD_INT(ctx, list, OID_AUTO, "cmd0_gen", CTLFLAG_RD, 2345 &rxq->vxrxq_cmd_ring[0].vxrxr_gen, 0, ""); 2346 SYSCTL_ADD_U64(ctx, list, OID_AUTO, "cmd0_desc_skips", CTLFLAG_RD, 2347 &rxq->vxrxq_cmd_ring[0].vxrxr_desc_skips, 0, ""); 2348 SYSCTL_ADD_UINT(ctx, list, OID_AUTO, "cmd1_ndesc", CTLFLAG_RD, 2349 &rxq->vxrxq_cmd_ring[1].vxrxr_ndesc, 0, ""); 2350 SYSCTL_ADD_INT(ctx, list, OID_AUTO, "cmd1_gen", CTLFLAG_RD, 2351 &rxq->vxrxq_cmd_ring[1].vxrxr_gen, 0, ""); 2352 SYSCTL_ADD_U64(ctx, list, OID_AUTO, "cmd1_desc_skips", CTLFLAG_RD, 2353 &rxq->vxrxq_cmd_ring[1].vxrxr_desc_skips, 0, ""); 2354 SYSCTL_ADD_UINT(ctx, list, OID_AUTO, "comp_ndesc", CTLFLAG_RD, 2355 &rxq->vxrxq_comp_ring.vxcr_ndesc, 0,""); 2356 SYSCTL_ADD_INT(ctx, list, OID_AUTO, "comp_gen", CTLFLAG_RD, 2357 &rxq->vxrxq_comp_ring.vxcr_gen, 0, ""); 2358 SYSCTL_ADD_U64(ctx, list, OID_AUTO, "comp_zero_length", CTLFLAG_RD, 2359 &rxq->vxrxq_comp_ring.vxcr_zero_length, 0, ""); 2360 SYSCTL_ADD_U64(ctx, list, OID_AUTO, "comp_zero_length_frag", 2361 CTLFLAG_RD, &rxq->vxrxq_comp_ring.vcxr_zero_length_frag, 2362 0, ""); 2363 SYSCTL_ADD_U64(ctx, list, OID_AUTO, "comp_pkt_errors", CTLFLAG_RD, 2364 &rxq->vxrxq_comp_ring.vxcr_pkt_errors, 0, ""); 2365 } 2366 } 2367 2368 static void 2369 vmxnet3_setup_queue_sysctl(struct vmxnet3_softc *sc, 2370 struct sysctl_ctx_list *ctx, struct sysctl_oid_list *child) 2371 { 2372 if_softc_ctx_t scctx; 2373 int i; 2374 2375 scctx = sc->vmx_scctx; 2376 2377 for (i = 0; i < scctx->isc_ntxqsets; i++) 2378 vmxnet3_setup_txq_sysctl(&sc->vmx_txq[i], ctx, child); 2379 for (i = 0; i < scctx->isc_nrxqsets; i++) 2380 vmxnet3_setup_rxq_sysctl(&sc->vmx_rxq[i], ctx, child); 2381 2382 vmxnet3_setup_debug_sysctl(sc, ctx, child); 2383 } 2384 2385 static void 2386 vmxnet3_setup_sysctl(struct vmxnet3_softc *sc) 2387 { 2388 device_t dev; 2389 struct sysctl_ctx_list *ctx; 2390 struct sysctl_oid *tree; 2391 struct sysctl_oid_list *child; 2392 2393 dev = sc->vmx_dev; 2394 ctx = device_get_sysctl_ctx(dev); 2395 tree = device_get_sysctl_tree(dev); 2396 child = SYSCTL_CHILDREN(tree); 2397 2398 vmxnet3_setup_queue_sysctl(sc, ctx, child); 2399 } 2400 2401 static void 2402 vmxnet3_write_bar0(struct vmxnet3_softc *sc, bus_size_t r, uint32_t v) 2403 { 2404 2405 bus_space_write_4(sc->vmx_iot0, sc->vmx_ioh0, r, v); 2406 } 2407 2408 static uint32_t 2409 vmxnet3_read_bar1(struct vmxnet3_softc *sc, bus_size_t r) 2410 { 2411 2412 return (bus_space_read_4(sc->vmx_iot1, sc->vmx_ioh1, r)); 2413 } 2414 2415 static void 2416 vmxnet3_write_bar1(struct vmxnet3_softc *sc, bus_size_t r, uint32_t v) 2417 { 2418 2419 bus_space_write_4(sc->vmx_iot1, sc->vmx_ioh1, r, v); 2420 } 2421 2422 static void 2423 vmxnet3_write_cmd(struct vmxnet3_softc *sc, uint32_t cmd) 2424 { 2425 2426 vmxnet3_write_bar1(sc, VMXNET3_BAR1_CMD, cmd); 2427 } 2428 2429 static uint32_t 2430 vmxnet3_read_cmd(struct vmxnet3_softc *sc, uint32_t cmd) 2431 { 2432 2433 vmxnet3_write_cmd(sc, cmd); 2434 bus_space_barrier(sc->vmx_iot1, sc->vmx_ioh1, 0, 0, 2435 BUS_SPACE_BARRIER_READ | BUS_SPACE_BARRIER_WRITE); 2436 return (vmxnet3_read_bar1(sc, VMXNET3_BAR1_CMD)); 2437 } 2438 2439 static void 2440 vmxnet3_enable_intr(struct vmxnet3_softc *sc, int irq) 2441 { 2442 2443 vmxnet3_write_bar0(sc, VMXNET3_BAR0_IMASK(irq), 0); 2444 } 2445 2446 static void 2447 vmxnet3_disable_intr(struct vmxnet3_softc *sc, int irq) 2448 { 2449 2450 vmxnet3_write_bar0(sc, VMXNET3_BAR0_IMASK(irq), 1); 2451 } 2452 2453 static int 2454 vmxnet3_tx_queue_intr_enable(if_ctx_t ctx, uint16_t qid) 2455 { 2456 /* Not using interrupts for TX */ 2457 return (0); 2458 } 2459 2460 static int 2461 vmxnet3_rx_queue_intr_enable(if_ctx_t ctx, uint16_t qid) 2462 { 2463 struct vmxnet3_softc *sc; 2464 2465 sc = iflib_get_softc(ctx); 2466 vmxnet3_enable_intr(sc, sc->vmx_rxq[qid].vxrxq_intr_idx); 2467 return (0); 2468 } 2469 2470 static void 2471 vmxnet3_link_intr_enable(if_ctx_t ctx) 2472 { 2473 struct vmxnet3_softc *sc; 2474 2475 sc = iflib_get_softc(ctx); 2476 vmxnet3_enable_intr(sc, sc->vmx_event_intr_idx); 2477 } 2478 2479 static void 2480 vmxnet3_intr_enable_all(if_ctx_t ctx) 2481 { 2482 struct vmxnet3_softc *sc; 2483 if_softc_ctx_t scctx; 2484 int i; 2485 2486 sc = iflib_get_softc(ctx); 2487 scctx = sc->vmx_scctx; 2488 sc->vmx_ds->ictrl &= ~VMXNET3_ICTRL_DISABLE_ALL; 2489 for (i = 0; i < scctx->isc_vectors; i++) 2490 vmxnet3_enable_intr(sc, i); 2491 } 2492 2493 static void 2494 vmxnet3_intr_disable_all(if_ctx_t ctx) 2495 { 2496 struct vmxnet3_softc *sc; 2497 int i; 2498 2499 sc = iflib_get_softc(ctx); 2500 /* 2501 * iflib may invoke this routine before vmxnet3_attach_post() has 2502 * run, which is before the top level shared data area is 2503 * initialized and the device made aware of it. 2504 */ 2505 if (sc->vmx_ds != NULL) 2506 sc->vmx_ds->ictrl |= VMXNET3_ICTRL_DISABLE_ALL; 2507 for (i = 0; i < VMXNET3_MAX_INTRS; i++) 2508 vmxnet3_disable_intr(sc, i); 2509 } 2510 2511 /* 2512 * Since this is a purely paravirtualized device, we do not have 2513 * to worry about DMA coherency. But at times, we must make sure 2514 * both the compiler and CPU do not reorder memory operations. 2515 */ 2516 static inline void 2517 vmxnet3_barrier(struct vmxnet3_softc *sc, vmxnet3_barrier_t type) 2518 { 2519 2520 switch (type) { 2521 case VMXNET3_BARRIER_RD: 2522 rmb(); 2523 break; 2524 case VMXNET3_BARRIER_WR: 2525 wmb(); 2526 break; 2527 case VMXNET3_BARRIER_RDWR: 2528 mb(); 2529 break; 2530 default: 2531 panic("%s: bad barrier type %d", __func__, type); 2532 } 2533 } 2534