1 /************************************************************************** 2 3 Copyright (c) 2007, Chelsio Inc. 4 All rights reserved. 5 6 Redistribution and use in source and binary forms, with or without 7 modification, are permitted provided that the following conditions are met: 8 9 1. Redistributions of source code must retain the above copyright notice, 10 this list of conditions and the following disclaimer. 11 12 2. Neither the name of the Chelsio Corporation nor the names of its 13 contributors may be used to endorse or promote products derived from 14 this software without specific prior written permission. 15 16 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 17 AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 18 IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 19 ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE 20 LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 21 CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 22 SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 23 INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 24 CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 25 ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 26 POSSIBILITY OF SUCH DAMAGE. 27 28 ***************************************************************************/ 29 30 #include <sys/cdefs.h> 31 __FBSDID("$FreeBSD$"); 32 33 #include <sys/param.h> 34 #include <sys/systm.h> 35 #include <sys/kernel.h> 36 #include <sys/bus.h> 37 #include <sys/module.h> 38 #include <sys/pciio.h> 39 #include <sys/conf.h> 40 #include <machine/bus.h> 41 #include <machine/resource.h> 42 #include <sys/bus_dma.h> 43 #include <sys/rman.h> 44 #include <sys/ioccom.h> 45 #include <sys/mbuf.h> 46 #include <sys/linker.h> 47 #include <sys/firmware.h> 48 #include <sys/socket.h> 49 #include <sys/sockio.h> 50 #include <sys/smp.h> 51 #include <sys/sysctl.h> 52 #include <sys/queue.h> 53 #include <sys/taskqueue.h> 54 55 #include <net/bpf.h> 56 #include <net/ethernet.h> 57 #include <net/if.h> 58 #include <net/if_arp.h> 59 #include <net/if_dl.h> 60 #include <net/if_media.h> 61 #include <net/if_types.h> 62 63 #include <netinet/in_systm.h> 64 #include <netinet/in.h> 65 #include <netinet/if_ether.h> 66 #include <netinet/ip.h> 67 #include <netinet/ip.h> 68 #include <netinet/tcp.h> 69 #include <netinet/udp.h> 70 71 #include <dev/pci/pcireg.h> 72 #include <dev/pci/pcivar.h> 73 #include <dev/pci/pci_private.h> 74 75 #ifdef CONFIG_DEFINED 76 #include <cxgb_include.h> 77 #else 78 #include <dev/cxgb/cxgb_include.h> 79 #endif 80 81 #ifdef PRIV_SUPPORTED 82 #include <sys/priv.h> 83 #endif 84 85 static int cxgb_setup_msix(adapter_t *, int); 86 static void cxgb_teardown_msix(adapter_t *); 87 static void cxgb_init(void *); 88 static void cxgb_init_locked(struct port_info *); 89 static void cxgb_stop_locked(struct port_info *); 90 static void cxgb_set_rxmode(struct port_info *); 91 static int cxgb_ioctl(struct ifnet *, unsigned long, caddr_t); 92 static void cxgb_start(struct ifnet *); 93 static void cxgb_start_proc(void *, int ncount); 94 static int cxgb_media_change(struct ifnet *); 95 static void cxgb_media_status(struct ifnet *, struct ifmediareq *); 96 static int setup_sge_qsets(adapter_t *); 97 static void cxgb_async_intr(void *); 98 static void cxgb_ext_intr_handler(void *, int); 99 static void cxgb_tick_handler(void *, int); 100 static void cxgb_down_locked(struct adapter *sc); 101 static void cxgb_tick(void *); 102 static void setup_rss(adapter_t *sc); 103 104 /* Attachment glue for the PCI controller end of the device. Each port of 105 * the device is attached separately, as defined later. 106 */ 107 static int cxgb_controller_probe(device_t); 108 static int cxgb_controller_attach(device_t); 109 static int cxgb_controller_detach(device_t); 110 static void cxgb_free(struct adapter *); 111 static __inline void reg_block_dump(struct adapter *ap, uint8_t *buf, unsigned int start, 112 unsigned int end); 113 static void cxgb_get_regs(adapter_t *sc, struct ifconf_regs *regs, uint8_t *buf); 114 static int cxgb_get_regs_len(void); 115 static int offload_open(struct port_info *pi); 116 static void touch_bars(device_t dev); 117 118 #ifdef notyet 119 static int offload_close(struct toedev *tdev); 120 #endif 121 122 123 static device_method_t cxgb_controller_methods[] = { 124 DEVMETHOD(device_probe, cxgb_controller_probe), 125 DEVMETHOD(device_attach, cxgb_controller_attach), 126 DEVMETHOD(device_detach, cxgb_controller_detach), 127 128 /* bus interface */ 129 DEVMETHOD(bus_print_child, bus_generic_print_child), 130 DEVMETHOD(bus_driver_added, bus_generic_driver_added), 131 132 { 0, 0 } 133 }; 134 135 static driver_t cxgb_controller_driver = { 136 "cxgbc", 137 cxgb_controller_methods, 138 sizeof(struct adapter) 139 }; 140 141 static devclass_t cxgb_controller_devclass; 142 DRIVER_MODULE(cxgbc, pci, cxgb_controller_driver, cxgb_controller_devclass, 0, 0); 143 144 /* 145 * Attachment glue for the ports. Attachment is done directly to the 146 * controller device. 147 */ 148 static int cxgb_port_probe(device_t); 149 static int cxgb_port_attach(device_t); 150 static int cxgb_port_detach(device_t); 151 152 static device_method_t cxgb_port_methods[] = { 153 DEVMETHOD(device_probe, cxgb_port_probe), 154 DEVMETHOD(device_attach, cxgb_port_attach), 155 DEVMETHOD(device_detach, cxgb_port_detach), 156 { 0, 0 } 157 }; 158 159 static driver_t cxgb_port_driver = { 160 "cxgb", 161 cxgb_port_methods, 162 0 163 }; 164 165 static d_ioctl_t cxgb_extension_ioctl; 166 static d_open_t cxgb_extension_open; 167 static d_close_t cxgb_extension_close; 168 169 static struct cdevsw cxgb_cdevsw = { 170 .d_version = D_VERSION, 171 .d_flags = 0, 172 .d_open = cxgb_extension_open, 173 .d_close = cxgb_extension_close, 174 .d_ioctl = cxgb_extension_ioctl, 175 .d_name = "cxgb", 176 }; 177 178 static devclass_t cxgb_port_devclass; 179 DRIVER_MODULE(cxgb, cxgbc, cxgb_port_driver, cxgb_port_devclass, 0, 0); 180 181 #define SGE_MSIX_COUNT (SGE_QSETS + 1) 182 183 extern int collapse_mbufs; 184 /* 185 * The driver uses the best interrupt scheme available on a platform in the 186 * order MSI-X, MSI, legacy pin interrupts. This parameter determines which 187 * of these schemes the driver may consider as follows: 188 * 189 * msi = 2: choose from among all three options 190 * msi = 1 : only consider MSI and pin interrupts 191 * msi = 0: force pin interrupts 192 */ 193 static int msi_allowed = 2; 194 195 TUNABLE_INT("hw.cxgb.msi_allowed", &msi_allowed); 196 SYSCTL_NODE(_hw, OID_AUTO, cxgb, CTLFLAG_RD, 0, "CXGB driver parameters"); 197 SYSCTL_UINT(_hw_cxgb, OID_AUTO, msi_allowed, CTLFLAG_RDTUN, &msi_allowed, 0, 198 "MSI-X, MSI, INTx selector"); 199 200 /* 201 * The driver enables offload as a default. 202 * To disable it, use ofld_disable = 1. 203 */ 204 static int ofld_disable = 0; 205 TUNABLE_INT("hw.cxgb.ofld_disable", &ofld_disable); 206 SYSCTL_UINT(_hw_cxgb, OID_AUTO, ofld_disable, CTLFLAG_RDTUN, &ofld_disable, 0, 207 "disable ULP offload"); 208 209 /* 210 * The driver uses an auto-queue algorithm by default. 211 * To disable it and force a single queue-set per port, use singleq = 1. 212 */ 213 static int singleq = 1; 214 TUNABLE_INT("hw.cxgb.singleq", &singleq); 215 SYSCTL_UINT(_hw_cxgb, OID_AUTO, singleq, CTLFLAG_RDTUN, &singleq, 0, 216 "use a single queue-set per port"); 217 218 enum { 219 MAX_TXQ_ENTRIES = 16384, 220 MAX_CTRL_TXQ_ENTRIES = 1024, 221 MAX_RSPQ_ENTRIES = 16384, 222 MAX_RX_BUFFERS = 16384, 223 MAX_RX_JUMBO_BUFFERS = 16384, 224 MIN_TXQ_ENTRIES = 4, 225 MIN_CTRL_TXQ_ENTRIES = 4, 226 MIN_RSPQ_ENTRIES = 32, 227 MIN_FL_ENTRIES = 32, 228 MIN_FL_JUMBO_ENTRIES = 32 229 }; 230 231 struct filter_info { 232 u32 sip; 233 u32 sip_mask; 234 u32 dip; 235 u16 sport; 236 u16 dport; 237 u32 vlan:12; 238 u32 vlan_prio:3; 239 u32 mac_hit:1; 240 u32 mac_idx:4; 241 u32 mac_vld:1; 242 u32 pkt_type:2; 243 u32 report_filter_id:1; 244 u32 pass:1; 245 u32 rss:1; 246 u32 qset:3; 247 u32 locked:1; 248 u32 valid:1; 249 }; 250 251 enum { FILTER_NO_VLAN_PRI = 7 }; 252 253 #define PORT_MASK ((1 << MAX_NPORTS) - 1) 254 255 /* Table for probing the cards. The desc field isn't actually used */ 256 struct cxgb_ident { 257 uint16_t vendor; 258 uint16_t device; 259 int index; 260 char *desc; 261 } cxgb_identifiers[] = { 262 {PCI_VENDOR_ID_CHELSIO, 0x0020, 0, "PE9000"}, 263 {PCI_VENDOR_ID_CHELSIO, 0x0021, 1, "T302E"}, 264 {PCI_VENDOR_ID_CHELSIO, 0x0022, 2, "T310E"}, 265 {PCI_VENDOR_ID_CHELSIO, 0x0023, 3, "T320X"}, 266 {PCI_VENDOR_ID_CHELSIO, 0x0024, 1, "T302X"}, 267 {PCI_VENDOR_ID_CHELSIO, 0x0025, 3, "T320E"}, 268 {PCI_VENDOR_ID_CHELSIO, 0x0026, 2, "T310X"}, 269 {PCI_VENDOR_ID_CHELSIO, 0x0030, 2, "T3B10"}, 270 {PCI_VENDOR_ID_CHELSIO, 0x0031, 3, "T3B20"}, 271 {PCI_VENDOR_ID_CHELSIO, 0x0032, 1, "T3B02"}, 272 {PCI_VENDOR_ID_CHELSIO, 0x0033, 4, "T3B04"}, 273 {0, 0, 0, NULL} 274 }; 275 276 277 static int set_eeprom(struct port_info *pi, const uint8_t *data, int len, int offset); 278 279 static inline char 280 t3rev2char(struct adapter *adapter) 281 { 282 char rev = 'z'; 283 284 switch(adapter->params.rev) { 285 case T3_REV_A: 286 rev = 'a'; 287 break; 288 case T3_REV_B: 289 case T3_REV_B2: 290 rev = 'b'; 291 break; 292 case T3_REV_C: 293 rev = 'c'; 294 break; 295 } 296 return rev; 297 } 298 299 static struct cxgb_ident * 300 cxgb_get_ident(device_t dev) 301 { 302 struct cxgb_ident *id; 303 304 for (id = cxgb_identifiers; id->desc != NULL; id++) { 305 if ((id->vendor == pci_get_vendor(dev)) && 306 (id->device == pci_get_device(dev))) { 307 return (id); 308 } 309 } 310 return (NULL); 311 } 312 313 static const struct adapter_info * 314 cxgb_get_adapter_info(device_t dev) 315 { 316 struct cxgb_ident *id; 317 const struct adapter_info *ai; 318 319 id = cxgb_get_ident(dev); 320 if (id == NULL) 321 return (NULL); 322 323 ai = t3_get_adapter_info(id->index); 324 325 return (ai); 326 } 327 328 static int 329 cxgb_controller_probe(device_t dev) 330 { 331 const struct adapter_info *ai; 332 char *ports, buf[80]; 333 int nports; 334 335 ai = cxgb_get_adapter_info(dev); 336 if (ai == NULL) 337 return (ENXIO); 338 339 nports = ai->nports0 + ai->nports1; 340 if (nports == 1) 341 ports = "port"; 342 else 343 ports = "ports"; 344 345 snprintf(buf, sizeof(buf), "%s RNIC, %d %s", ai->desc, nports, ports); 346 device_set_desc_copy(dev, buf); 347 return (BUS_PROBE_DEFAULT); 348 } 349 350 #define FW_FNAME "t3fw%d%d%d" 351 #define TPEEPROM_NAME "t3%ctpe%d%d%d" 352 #define TPSRAM_NAME "t3%cps%d%d%d" 353 354 static int 355 upgrade_fw(adapter_t *sc) 356 { 357 char buf[32]; 358 #ifdef FIRMWARE_LATEST 359 const struct firmware *fw; 360 #else 361 struct firmware *fw; 362 #endif 363 int status; 364 365 snprintf(&buf[0], sizeof(buf), FW_FNAME, FW_VERSION_MAJOR, 366 FW_VERSION_MINOR, FW_VERSION_MICRO); 367 368 fw = firmware_get(buf); 369 370 if (fw == NULL) { 371 device_printf(sc->dev, "Could not find firmware image %s\n", buf); 372 return (ENOENT); 373 } else 374 device_printf(sc->dev, "updating firmware on card with %s\n", buf); 375 status = t3_load_fw(sc, (const uint8_t *)fw->data, fw->datasize); 376 377 device_printf(sc->dev, "firmware update returned %s %d\n", (status == 0) ? "success" : "fail", status); 378 379 firmware_put(fw, FIRMWARE_UNLOAD); 380 381 return (status); 382 } 383 384 static int 385 cxgb_controller_attach(device_t dev) 386 { 387 device_t child; 388 const struct adapter_info *ai; 389 struct adapter *sc; 390 int i, error = 0; 391 uint32_t vers; 392 int port_qsets = 1; 393 #ifdef MSI_SUPPORTED 394 int msi_needed, reg; 395 #endif 396 sc = device_get_softc(dev); 397 sc->dev = dev; 398 sc->msi_count = 0; 399 ai = cxgb_get_adapter_info(dev); 400 401 /* 402 * XXX not really related but a recent addition 403 */ 404 #ifdef MSI_SUPPORTED 405 /* find the PCIe link width and set max read request to 4KB*/ 406 if (pci_find_extcap(dev, PCIY_EXPRESS, ®) == 0) { 407 uint16_t lnk, pectl; 408 lnk = pci_read_config(dev, reg + 0x12, 2); 409 sc->link_width = (lnk >> 4) & 0x3f; 410 411 pectl = pci_read_config(dev, reg + 0x8, 2); 412 pectl = (pectl & ~0x7000) | (5 << 12); 413 pci_write_config(dev, reg + 0x8, pectl, 2); 414 } 415 416 if (sc->link_width != 0 && sc->link_width <= 4 && 417 (ai->nports0 + ai->nports1) <= 2) { 418 device_printf(sc->dev, 419 "PCIe x%d Link, expect reduced performance\n", 420 sc->link_width); 421 } 422 #endif 423 touch_bars(dev); 424 pci_enable_busmaster(dev); 425 /* 426 * Allocate the registers and make them available to the driver. 427 * The registers that we care about for NIC mode are in BAR 0 428 */ 429 sc->regs_rid = PCIR_BAR(0); 430 if ((sc->regs_res = bus_alloc_resource_any(dev, SYS_RES_MEMORY, 431 &sc->regs_rid, RF_ACTIVE)) == NULL) { 432 device_printf(dev, "Cannot allocate BAR\n"); 433 return (ENXIO); 434 } 435 436 snprintf(sc->lockbuf, ADAPTER_LOCK_NAME_LEN, "cxgb controller lock %d", 437 device_get_unit(dev)); 438 ADAPTER_LOCK_INIT(sc, sc->lockbuf); 439 440 snprintf(sc->reglockbuf, ADAPTER_LOCK_NAME_LEN, "SGE reg lock %d", 441 device_get_unit(dev)); 442 snprintf(sc->mdiolockbuf, ADAPTER_LOCK_NAME_LEN, "cxgb mdio lock %d", 443 device_get_unit(dev)); 444 snprintf(sc->elmerlockbuf, ADAPTER_LOCK_NAME_LEN, "cxgb elmer lock %d", 445 device_get_unit(dev)); 446 447 MTX_INIT(&sc->sge.reg_lock, sc->reglockbuf, NULL, MTX_DEF); 448 MTX_INIT(&sc->mdio_lock, sc->mdiolockbuf, NULL, MTX_DEF); 449 MTX_INIT(&sc->elmer_lock, sc->elmerlockbuf, NULL, MTX_DEF); 450 451 sc->bt = rman_get_bustag(sc->regs_res); 452 sc->bh = rman_get_bushandle(sc->regs_res); 453 sc->mmio_len = rman_get_size(sc->regs_res); 454 455 if (t3_prep_adapter(sc, ai, 1) < 0) { 456 printf("prep adapter failed\n"); 457 error = ENODEV; 458 goto out; 459 } 460 /* Allocate the BAR for doing MSI-X. If it succeeds, try to allocate 461 * enough messages for the queue sets. If that fails, try falling 462 * back to MSI. If that fails, then try falling back to the legacy 463 * interrupt pin model. 464 */ 465 #ifdef MSI_SUPPORTED 466 467 sc->msix_regs_rid = 0x20; 468 if ((msi_allowed >= 2) && 469 (sc->msix_regs_res = bus_alloc_resource_any(dev, SYS_RES_MEMORY, 470 &sc->msix_regs_rid, RF_ACTIVE)) != NULL) { 471 472 msi_needed = sc->msi_count = SGE_MSIX_COUNT; 473 474 if (((error = pci_alloc_msix(dev, &sc->msi_count)) != 0) || 475 (sc->msi_count != msi_needed)) { 476 device_printf(dev, "msix allocation failed - msi_count = %d" 477 " msi_needed=%d will try msi err=%d\n", sc->msi_count, 478 msi_needed, error); 479 sc->msi_count = 0; 480 pci_release_msi(dev); 481 bus_release_resource(dev, SYS_RES_MEMORY, 482 sc->msix_regs_rid, sc->msix_regs_res); 483 sc->msix_regs_res = NULL; 484 } else { 485 sc->flags |= USING_MSIX; 486 sc->cxgb_intr = t3_intr_msix; 487 } 488 } 489 490 if ((msi_allowed >= 1) && (sc->msi_count == 0)) { 491 sc->msi_count = 1; 492 if (pci_alloc_msi(dev, &sc->msi_count)) { 493 device_printf(dev, "alloc msi failed - will try INTx\n"); 494 sc->msi_count = 0; 495 pci_release_msi(dev); 496 } else { 497 sc->flags |= USING_MSI; 498 sc->irq_rid = 1; 499 sc->cxgb_intr = t3_intr_msi; 500 } 501 } 502 #endif 503 if (sc->msi_count == 0) { 504 device_printf(dev, "using line interrupts\n"); 505 sc->irq_rid = 0; 506 sc->cxgb_intr = t3b_intr; 507 } 508 509 510 /* Create a private taskqueue thread for handling driver events */ 511 #ifdef TASKQUEUE_CURRENT 512 sc->tq = taskqueue_create("cxgb_taskq", M_NOWAIT, 513 taskqueue_thread_enqueue, &sc->tq); 514 #else 515 sc->tq = taskqueue_create_fast("cxgb_taskq", M_NOWAIT, 516 taskqueue_thread_enqueue, &sc->tq); 517 #endif 518 if (sc->tq == NULL) { 519 device_printf(dev, "failed to allocate controller task queue\n"); 520 goto out; 521 } 522 523 taskqueue_start_threads(&sc->tq, 1, PI_NET, "%s taskq", 524 device_get_nameunit(dev)); 525 TASK_INIT(&sc->ext_intr_task, 0, cxgb_ext_intr_handler, sc); 526 TASK_INIT(&sc->tick_task, 0, cxgb_tick_handler, sc); 527 528 529 /* Create a periodic callout for checking adapter status */ 530 callout_init(&sc->cxgb_tick_ch, TRUE); 531 532 if (t3_check_fw_version(sc) != 0) { 533 /* 534 * Warn user that a firmware update will be attempted in init. 535 */ 536 device_printf(dev, "firmware needs to be updated to version %d.%d.%d\n", 537 FW_VERSION_MAJOR, FW_VERSION_MINOR, FW_VERSION_MICRO); 538 sc->flags &= ~FW_UPTODATE; 539 } else { 540 sc->flags |= FW_UPTODATE; 541 } 542 543 if (t3_check_tpsram_version(sc) != 0) { 544 /* 545 * Warn user that a firmware update will be attempted in init. 546 */ 547 device_printf(dev, "SRAM needs to be updated to version %c-%d.%d.%d\n", 548 t3rev2char(sc), TP_VERSION_MAJOR, TP_VERSION_MINOR, TP_VERSION_MICRO); 549 sc->flags &= ~TPS_UPTODATE; 550 } else { 551 sc->flags |= TPS_UPTODATE; 552 } 553 554 if ((sc->flags & USING_MSIX) && !singleq) 555 port_qsets = min((SGE_QSETS/(sc)->params.nports), mp_ncpus); 556 557 /* 558 * Create a child device for each MAC. The ethernet attachment 559 * will be done in these children. 560 */ 561 for (i = 0; i < (sc)->params.nports; i++) { 562 struct port_info *pi; 563 564 if ((child = device_add_child(dev, "cxgb", -1)) == NULL) { 565 device_printf(dev, "failed to add child port\n"); 566 error = EINVAL; 567 goto out; 568 } 569 pi = &sc->port[i]; 570 pi->adapter = sc; 571 pi->nqsets = port_qsets; 572 pi->first_qset = i*port_qsets; 573 pi->port_id = i; 574 pi->tx_chan = i >= ai->nports0; 575 pi->txpkt_intf = pi->tx_chan ? 2 * (i - ai->nports0) + 1 : 2 * i; 576 sc->rxpkt_map[pi->txpkt_intf] = i; 577 sc->portdev[i] = child; 578 device_set_softc(child, pi); 579 } 580 if ((error = bus_generic_attach(dev)) != 0) 581 goto out; 582 583 /* 584 * XXX need to poll for link status 585 */ 586 sc->params.stats_update_period = 1; 587 588 /* initialize sge private state */ 589 t3_sge_init_adapter(sc); 590 591 t3_led_ready(sc); 592 593 cxgb_offload_init(); 594 if (is_offload(sc)) { 595 setbit(&sc->registered_device_map, OFFLOAD_DEVMAP_BIT); 596 cxgb_adapter_ofld(sc); 597 } 598 error = t3_get_fw_version(sc, &vers); 599 if (error) 600 goto out; 601 602 snprintf(&sc->fw_version[0], sizeof(sc->fw_version), "%d.%d.%d", 603 G_FW_VERSION_MAJOR(vers), G_FW_VERSION_MINOR(vers), 604 G_FW_VERSION_MICRO(vers)); 605 606 t3_add_sysctls(sc); 607 out: 608 if (error) 609 cxgb_free(sc); 610 611 return (error); 612 } 613 614 static int 615 cxgb_controller_detach(device_t dev) 616 { 617 struct adapter *sc; 618 619 sc = device_get_softc(dev); 620 621 cxgb_free(sc); 622 623 return (0); 624 } 625 626 static void 627 cxgb_free(struct adapter *sc) 628 { 629 int i; 630 631 ADAPTER_LOCK(sc); 632 /* 633 * drops the lock 634 */ 635 cxgb_down_locked(sc); 636 637 #ifdef MSI_SUPPORTED 638 if (sc->flags & (USING_MSI | USING_MSIX)) { 639 device_printf(sc->dev, "releasing msi message(s)\n"); 640 pci_release_msi(sc->dev); 641 } else { 642 device_printf(sc->dev, "no msi message to release\n"); 643 } 644 #endif 645 if (sc->msix_regs_res != NULL) { 646 bus_release_resource(sc->dev, SYS_RES_MEMORY, sc->msix_regs_rid, 647 sc->msix_regs_res); 648 } 649 650 if (sc->tq != NULL) { 651 taskqueue_drain(sc->tq, &sc->ext_intr_task); 652 taskqueue_drain(sc->tq, &sc->tick_task); 653 } 654 t3_sge_deinit_sw(sc); 655 /* 656 * Wait for last callout 657 */ 658 659 tsleep(&sc, 0, "cxgb unload", 3*hz); 660 661 for (i = 0; i < (sc)->params.nports; ++i) { 662 if (sc->portdev[i] != NULL) 663 device_delete_child(sc->dev, sc->portdev[i]); 664 } 665 666 bus_generic_detach(sc->dev); 667 if (sc->tq != NULL) 668 taskqueue_free(sc->tq); 669 #ifdef notyet 670 if (is_offload(sc)) { 671 cxgb_adapter_unofld(sc); 672 if (isset(&sc->open_device_map, OFFLOAD_DEVMAP_BIT)) 673 offload_close(&sc->tdev); 674 } 675 #endif 676 677 t3_free_sge_resources(sc); 678 free(sc->filters, M_DEVBUF); 679 t3_sge_free(sc); 680 681 cxgb_offload_exit(); 682 683 if (sc->regs_res != NULL) 684 bus_release_resource(sc->dev, SYS_RES_MEMORY, sc->regs_rid, 685 sc->regs_res); 686 687 MTX_DESTROY(&sc->mdio_lock); 688 MTX_DESTROY(&sc->sge.reg_lock); 689 MTX_DESTROY(&sc->elmer_lock); 690 ADAPTER_LOCK_DEINIT(sc); 691 692 return; 693 } 694 695 /** 696 * setup_sge_qsets - configure SGE Tx/Rx/response queues 697 * @sc: the controller softc 698 * 699 * Determines how many sets of SGE queues to use and initializes them. 700 * We support multiple queue sets per port if we have MSI-X, otherwise 701 * just one queue set per port. 702 */ 703 static int 704 setup_sge_qsets(adapter_t *sc) 705 { 706 int i, j, err, irq_idx = 0, qset_idx = 0; 707 u_int ntxq = SGE_TXQ_PER_SET; 708 709 if ((err = t3_sge_alloc(sc)) != 0) { 710 device_printf(sc->dev, "t3_sge_alloc returned %d\n", err); 711 return (err); 712 } 713 714 if (sc->params.rev > 0 && !(sc->flags & USING_MSI)) 715 irq_idx = -1; 716 717 for (i = 0; i < (sc)->params.nports; i++) { 718 struct port_info *pi = &sc->port[i]; 719 720 for (j = 0; j < pi->nqsets; j++, qset_idx++) { 721 err = t3_sge_alloc_qset(sc, qset_idx, (sc)->params.nports, 722 (sc->flags & USING_MSIX) ? qset_idx + 1 : irq_idx, 723 &sc->params.sge.qset[qset_idx], ntxq, pi); 724 if (err) { 725 t3_free_sge_resources(sc); 726 device_printf(sc->dev, "t3_sge_alloc_qset failed with %d\n", 727 err); 728 return (err); 729 } 730 } 731 } 732 733 return (0); 734 } 735 736 static void 737 cxgb_teardown_msix(adapter_t *sc) 738 { 739 int i, nqsets; 740 741 for (nqsets = i = 0; i < (sc)->params.nports; i++) 742 nqsets += sc->port[i].nqsets; 743 744 for (i = 0; i < nqsets; i++) { 745 if (sc->msix_intr_tag[i] != NULL) { 746 bus_teardown_intr(sc->dev, sc->msix_irq_res[i], 747 sc->msix_intr_tag[i]); 748 sc->msix_intr_tag[i] = NULL; 749 } 750 if (sc->msix_irq_res[i] != NULL) { 751 bus_release_resource(sc->dev, SYS_RES_IRQ, 752 sc->msix_irq_rid[i], sc->msix_irq_res[i]); 753 sc->msix_irq_res[i] = NULL; 754 } 755 } 756 } 757 758 static int 759 cxgb_setup_msix(adapter_t *sc, int msix_count) 760 { 761 int i, j, k, nqsets, rid; 762 763 /* The first message indicates link changes and error conditions */ 764 sc->irq_rid = 1; 765 if ((sc->irq_res = bus_alloc_resource_any(sc->dev, SYS_RES_IRQ, 766 &sc->irq_rid, RF_SHAREABLE | RF_ACTIVE)) == NULL) { 767 device_printf(sc->dev, "Cannot allocate msix interrupt\n"); 768 return (EINVAL); 769 } 770 771 if (bus_setup_intr(sc->dev, sc->irq_res, INTR_MPSAFE|INTR_TYPE_NET, 772 #ifdef INTR_FILTERS 773 NULL, 774 #endif 775 cxgb_async_intr, sc, &sc->intr_tag)) { 776 device_printf(sc->dev, "Cannot set up interrupt\n"); 777 return (EINVAL); 778 } 779 for (i = k = 0; i < (sc)->params.nports; i++) { 780 nqsets = sc->port[i].nqsets; 781 for (j = 0; j < nqsets; j++, k++) { 782 struct sge_qset *qs = &sc->sge.qs[k]; 783 784 rid = k + 2; 785 if (cxgb_debug) 786 printf("rid=%d ", rid); 787 if ((sc->msix_irq_res[k] = bus_alloc_resource_any( 788 sc->dev, SYS_RES_IRQ, &rid, 789 RF_SHAREABLE | RF_ACTIVE)) == NULL) { 790 device_printf(sc->dev, "Cannot allocate " 791 "interrupt for message %d\n", rid); 792 return (EINVAL); 793 } 794 sc->msix_irq_rid[k] = rid; 795 printf("setting up interrupt for port=%d\n", 796 qs->port->port_id); 797 if (bus_setup_intr(sc->dev, sc->msix_irq_res[k], 798 INTR_MPSAFE|INTR_TYPE_NET, 799 #ifdef INTR_FILTERS 800 NULL, 801 #endif 802 t3_intr_msix, qs, &sc->msix_intr_tag[k])) { 803 device_printf(sc->dev, "Cannot set up " 804 "interrupt for message %d\n", rid); 805 return (EINVAL); 806 } 807 } 808 } 809 810 811 return (0); 812 } 813 814 static int 815 cxgb_port_probe(device_t dev) 816 { 817 struct port_info *p; 818 char buf[80]; 819 820 p = device_get_softc(dev); 821 822 snprintf(buf, sizeof(buf), "Port %d %s", p->port_id, p->port_type->desc); 823 device_set_desc_copy(dev, buf); 824 return (0); 825 } 826 827 828 static int 829 cxgb_makedev(struct port_info *pi) 830 { 831 832 pi->port_cdev = make_dev(&cxgb_cdevsw, pi->ifp->if_dunit, 833 UID_ROOT, GID_WHEEL, 0600, if_name(pi->ifp)); 834 835 if (pi->port_cdev == NULL) 836 return (ENOMEM); 837 838 pi->port_cdev->si_drv1 = (void *)pi; 839 840 return (0); 841 } 842 843 844 #ifdef TSO_SUPPORTED 845 #define CXGB_CAP (IFCAP_VLAN_HWTAGGING | IFCAP_VLAN_MTU | IFCAP_HWCSUM | IFCAP_VLAN_HWCSUM | IFCAP_TSO | IFCAP_JUMBO_MTU) 846 /* Don't enable TSO6 yet */ 847 #define CXGB_CAP_ENABLE (IFCAP_VLAN_HWTAGGING | IFCAP_VLAN_MTU | IFCAP_HWCSUM | IFCAP_VLAN_HWCSUM | IFCAP_TSO4 | IFCAP_JUMBO_MTU) 848 #else 849 #define CXGB_CAP (IFCAP_VLAN_HWTAGGING | IFCAP_VLAN_MTU | IFCAP_HWCSUM | IFCAP_JUMBO_MTU) 850 /* Don't enable TSO6 yet */ 851 #define CXGB_CAP_ENABLE (IFCAP_VLAN_HWTAGGING | IFCAP_VLAN_MTU | IFCAP_HWCSUM | IFCAP_JUMBO_MTU) 852 #define IFCAP_TSO4 0x0 853 #define IFCAP_TSO6 0x0 854 #define CSUM_TSO 0x0 855 #endif 856 857 858 static int 859 cxgb_port_attach(device_t dev) 860 { 861 struct port_info *p; 862 struct ifnet *ifp; 863 int err, media_flags; 864 865 p = device_get_softc(dev); 866 867 snprintf(p->lockbuf, PORT_NAME_LEN, "cxgb port lock %d:%d", 868 device_get_unit(device_get_parent(dev)), p->port_id); 869 PORT_LOCK_INIT(p, p->lockbuf); 870 871 /* Allocate an ifnet object and set it up */ 872 ifp = p->ifp = if_alloc(IFT_ETHER); 873 if (ifp == NULL) { 874 device_printf(dev, "Cannot allocate ifnet\n"); 875 return (ENOMEM); 876 } 877 878 /* 879 * Note that there is currently no watchdog timer. 880 */ 881 if_initname(ifp, device_get_name(dev), device_get_unit(dev)); 882 ifp->if_init = cxgb_init; 883 ifp->if_softc = p; 884 ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST; 885 ifp->if_ioctl = cxgb_ioctl; 886 ifp->if_start = cxgb_start; 887 ifp->if_timer = 0; /* Disable ifnet watchdog */ 888 ifp->if_watchdog = NULL; 889 890 ifp->if_snd.ifq_drv_maxlen = TX_ETH_Q_SIZE; 891 IFQ_SET_MAXLEN(&ifp->if_snd, ifp->if_snd.ifq_drv_maxlen); 892 IFQ_SET_READY(&ifp->if_snd); 893 894 ifp->if_hwassist = ifp->if_capabilities = ifp->if_capenable = 0; 895 ifp->if_capabilities |= CXGB_CAP; 896 ifp->if_capenable |= CXGB_CAP_ENABLE; 897 ifp->if_hwassist |= (CSUM_TCP | CSUM_UDP | CSUM_IP | CSUM_TSO); 898 /* 899 * disable TSO on 4-port - it isn't supported by the firmware yet 900 */ 901 if (p->adapter->params.nports > 2) { 902 ifp->if_capabilities &= ~(IFCAP_TSO4 | IFCAP_TSO6); 903 ifp->if_capenable &= ~(IFCAP_TSO4 | IFCAP_TSO6); 904 ifp->if_hwassist &= ~CSUM_TSO; 905 } 906 907 ether_ifattach(ifp, p->hw_addr); 908 /* 909 * Only default to jumbo frames on 10GigE 910 */ 911 if (p->adapter->params.nports <= 2) 912 ifp->if_mtu = 9000; 913 if ((err = cxgb_makedev(p)) != 0) { 914 printf("makedev failed %d\n", err); 915 return (err); 916 } 917 ifmedia_init(&p->media, IFM_IMASK, cxgb_media_change, 918 cxgb_media_status); 919 920 if (!strcmp(p->port_type->desc, "10GBASE-CX4")) { 921 media_flags = IFM_ETHER | IFM_10G_CX4 | IFM_FDX; 922 } else if (!strcmp(p->port_type->desc, "10GBASE-SR")) { 923 media_flags = IFM_ETHER | IFM_10G_SR | IFM_FDX; 924 } else if (!strcmp(p->port_type->desc, "10GBASE-XR")) { 925 media_flags = IFM_ETHER | IFM_10G_LR | IFM_FDX; 926 } else if (!strcmp(p->port_type->desc, "10/100/1000BASE-T")) { 927 ifmedia_add(&p->media, IFM_ETHER | IFM_10_T, 0, NULL); 928 ifmedia_add(&p->media, IFM_ETHER | IFM_10_T | IFM_FDX, 929 0, NULL); 930 ifmedia_add(&p->media, IFM_ETHER | IFM_100_TX, 931 0, NULL); 932 ifmedia_add(&p->media, IFM_ETHER | IFM_100_TX | IFM_FDX, 933 0, NULL); 934 ifmedia_add(&p->media, IFM_ETHER | IFM_1000_T | IFM_FDX, 935 0, NULL); 936 media_flags = 0; 937 } else { 938 printf("unsupported media type %s\n", p->port_type->desc); 939 return (ENXIO); 940 } 941 if (media_flags) { 942 ifmedia_add(&p->media, media_flags, 0, NULL); 943 ifmedia_set(&p->media, media_flags); 944 } else { 945 ifmedia_add(&p->media, IFM_ETHER | IFM_AUTO, 0, NULL); 946 ifmedia_set(&p->media, IFM_ETHER | IFM_AUTO); 947 } 948 949 950 snprintf(p->taskqbuf, TASKQ_NAME_LEN, "cxgb_port_taskq%d", p->port_id); 951 #ifdef TASKQUEUE_CURRENT 952 /* Create a port for handling TX without starvation */ 953 p->tq = taskqueue_create(p->taskqbuf, M_NOWAIT, 954 taskqueue_thread_enqueue, &p->tq); 955 #else 956 /* Create a port for handling TX without starvation */ 957 p->tq = taskqueue_create_fast(p->taskqbuf, M_NOWAIT, 958 taskqueue_thread_enqueue, &p->tq); 959 #endif 960 961 if (p->tq == NULL) { 962 device_printf(dev, "failed to allocate port task queue\n"); 963 return (ENOMEM); 964 } 965 taskqueue_start_threads(&p->tq, 1, PI_NET, "%s taskq", 966 device_get_nameunit(dev)); 967 968 TASK_INIT(&p->start_task, 0, cxgb_start_proc, ifp); 969 970 t3_sge_init_port(p); 971 972 return (0); 973 } 974 975 static int 976 cxgb_port_detach(device_t dev) 977 { 978 struct port_info *p; 979 980 p = device_get_softc(dev); 981 982 PORT_LOCK(p); 983 if (p->ifp->if_drv_flags & IFF_DRV_RUNNING) 984 cxgb_stop_locked(p); 985 PORT_UNLOCK(p); 986 987 if (p->tq != NULL) { 988 taskqueue_drain(p->tq, &p->start_task); 989 taskqueue_free(p->tq); 990 p->tq = NULL; 991 } 992 993 ether_ifdetach(p->ifp); 994 /* 995 * the lock may be acquired in ifdetach 996 */ 997 PORT_LOCK_DEINIT(p); 998 if_free(p->ifp); 999 1000 if (p->port_cdev != NULL) 1001 destroy_dev(p->port_cdev); 1002 1003 return (0); 1004 } 1005 1006 void 1007 t3_fatal_err(struct adapter *sc) 1008 { 1009 u_int fw_status[4]; 1010 1011 if (sc->flags & FULL_INIT_DONE) { 1012 t3_sge_stop(sc); 1013 t3_write_reg(sc, A_XGM_TX_CTRL, 0); 1014 t3_write_reg(sc, A_XGM_RX_CTRL, 0); 1015 t3_write_reg(sc, XGM_REG(A_XGM_TX_CTRL, 1), 0); 1016 t3_write_reg(sc, XGM_REG(A_XGM_RX_CTRL, 1), 0); 1017 t3_intr_disable(sc); 1018 } 1019 device_printf(sc->dev,"encountered fatal error, operation suspended\n"); 1020 if (!t3_cim_ctl_blk_read(sc, 0xa0, 4, fw_status)) 1021 device_printf(sc->dev, "FW_ status: 0x%x, 0x%x, 0x%x, 0x%x\n", 1022 fw_status[0], fw_status[1], fw_status[2], fw_status[3]); 1023 } 1024 1025 int 1026 t3_os_find_pci_capability(adapter_t *sc, int cap) 1027 { 1028 device_t dev; 1029 struct pci_devinfo *dinfo; 1030 pcicfgregs *cfg; 1031 uint32_t status; 1032 uint8_t ptr; 1033 1034 dev = sc->dev; 1035 dinfo = device_get_ivars(dev); 1036 cfg = &dinfo->cfg; 1037 1038 status = pci_read_config(dev, PCIR_STATUS, 2); 1039 if (!(status & PCIM_STATUS_CAPPRESENT)) 1040 return (0); 1041 1042 switch (cfg->hdrtype & PCIM_HDRTYPE) { 1043 case 0: 1044 case 1: 1045 ptr = PCIR_CAP_PTR; 1046 break; 1047 case 2: 1048 ptr = PCIR_CAP_PTR_2; 1049 break; 1050 default: 1051 return (0); 1052 break; 1053 } 1054 ptr = pci_read_config(dev, ptr, 1); 1055 1056 while (ptr != 0) { 1057 if (pci_read_config(dev, ptr + PCICAP_ID, 1) == cap) 1058 return (ptr); 1059 ptr = pci_read_config(dev, ptr + PCICAP_NEXTPTR, 1); 1060 } 1061 1062 return (0); 1063 } 1064 1065 int 1066 t3_os_pci_save_state(struct adapter *sc) 1067 { 1068 device_t dev; 1069 struct pci_devinfo *dinfo; 1070 1071 dev = sc->dev; 1072 dinfo = device_get_ivars(dev); 1073 1074 pci_cfg_save(dev, dinfo, 0); 1075 return (0); 1076 } 1077 1078 int 1079 t3_os_pci_restore_state(struct adapter *sc) 1080 { 1081 device_t dev; 1082 struct pci_devinfo *dinfo; 1083 1084 dev = sc->dev; 1085 dinfo = device_get_ivars(dev); 1086 1087 pci_cfg_restore(dev, dinfo); 1088 return (0); 1089 } 1090 1091 /** 1092 * t3_os_link_changed - handle link status changes 1093 * @adapter: the adapter associated with the link change 1094 * @port_id: the port index whose limk status has changed 1095 * @link_stat: the new status of the link 1096 * @speed: the new speed setting 1097 * @duplex: the new duplex setting 1098 * @fc: the new flow-control setting 1099 * 1100 * This is the OS-dependent handler for link status changes. The OS 1101 * neutral handler takes care of most of the processing for these events, 1102 * then calls this handler for any OS-specific processing. 1103 */ 1104 void 1105 t3_os_link_changed(adapter_t *adapter, int port_id, int link_status, int speed, 1106 int duplex, int fc) 1107 { 1108 struct port_info *pi = &adapter->port[port_id]; 1109 struct cmac *mac = &adapter->port[port_id].mac; 1110 1111 if ((pi->ifp->if_flags & IFF_UP) == 0) 1112 return; 1113 1114 if (link_status) { 1115 t3_mac_enable(mac, MAC_DIRECTION_RX); 1116 if_link_state_change(pi->ifp, LINK_STATE_UP); 1117 } else { 1118 if_link_state_change(pi->ifp, LINK_STATE_DOWN); 1119 pi->phy.ops->power_down(&pi->phy, 1); 1120 t3_mac_disable(mac, MAC_DIRECTION_RX); 1121 t3_link_start(&pi->phy, mac, &pi->link_config); 1122 } 1123 } 1124 1125 /* 1126 * Interrupt-context handler for external (PHY) interrupts. 1127 */ 1128 void 1129 t3_os_ext_intr_handler(adapter_t *sc) 1130 { 1131 if (cxgb_debug) 1132 printf("t3_os_ext_intr_handler\n"); 1133 /* 1134 * Schedule a task to handle external interrupts as they may be slow 1135 * and we use a mutex to protect MDIO registers. We disable PHY 1136 * interrupts in the meantime and let the task reenable them when 1137 * it's done. 1138 */ 1139 ADAPTER_LOCK(sc); 1140 if (sc->slow_intr_mask) { 1141 sc->slow_intr_mask &= ~F_T3DBG; 1142 t3_write_reg(sc, A_PL_INT_ENABLE0, sc->slow_intr_mask); 1143 taskqueue_enqueue(sc->tq, &sc->ext_intr_task); 1144 } 1145 ADAPTER_UNLOCK(sc); 1146 } 1147 1148 void 1149 t3_os_set_hw_addr(adapter_t *adapter, int port_idx, u8 hw_addr[]) 1150 { 1151 1152 /* 1153 * The ifnet might not be allocated before this gets called, 1154 * as this is called early on in attach by t3_prep_adapter 1155 * save the address off in the port structure 1156 */ 1157 if (cxgb_debug) 1158 printf("set_hw_addr on idx %d addr %6D\n", port_idx, hw_addr, ":"); 1159 bcopy(hw_addr, adapter->port[port_idx].hw_addr, ETHER_ADDR_LEN); 1160 } 1161 1162 /** 1163 * link_start - enable a port 1164 * @p: the port to enable 1165 * 1166 * Performs the MAC and PHY actions needed to enable a port. 1167 */ 1168 static void 1169 cxgb_link_start(struct port_info *p) 1170 { 1171 struct ifnet *ifp; 1172 struct t3_rx_mode rm; 1173 struct cmac *mac = &p->mac; 1174 1175 ifp = p->ifp; 1176 1177 t3_init_rx_mode(&rm, p); 1178 if (!mac->multiport) 1179 t3_mac_reset(mac); 1180 t3_mac_set_mtu(mac, ifp->if_mtu + ETHER_HDR_LEN + ETHER_VLAN_ENCAP_LEN); 1181 t3_mac_set_address(mac, 0, p->hw_addr); 1182 t3_mac_set_rx_mode(mac, &rm); 1183 t3_link_start(&p->phy, mac, &p->link_config); 1184 t3_mac_enable(mac, MAC_DIRECTION_RX | MAC_DIRECTION_TX); 1185 } 1186 1187 /** 1188 * setup_rss - configure Receive Side Steering (per-queue connection demux) 1189 * @adap: the adapter 1190 * 1191 * Sets up RSS to distribute packets to multiple receive queues. We 1192 * configure the RSS CPU lookup table to distribute to the number of HW 1193 * receive queues, and the response queue lookup table to narrow that 1194 * down to the response queues actually configured for each port. 1195 * We always configure the RSS mapping for two ports since the mapping 1196 * table has plenty of entries. 1197 */ 1198 static void 1199 setup_rss(adapter_t *adap) 1200 { 1201 int i; 1202 u_int nq[2]; 1203 uint8_t cpus[SGE_QSETS + 1]; 1204 uint16_t rspq_map[RSS_TABLE_SIZE]; 1205 1206 for (i = 0; i < SGE_QSETS; ++i) 1207 cpus[i] = i; 1208 cpus[SGE_QSETS] = 0xff; 1209 1210 nq[0] = nq[1] = 0; 1211 for_each_port(adap, i) { 1212 const struct port_info *pi = adap2pinfo(adap, i); 1213 1214 nq[pi->tx_chan] += pi->nqsets; 1215 } 1216 nq[0] = max(nq[0], 1U); 1217 nq[1] = max(nq[1], 1U); 1218 for (i = 0; i < RSS_TABLE_SIZE / 2; ++i) { 1219 rspq_map[i] = i % nq[0]; 1220 rspq_map[i + RSS_TABLE_SIZE / 2] = (i % nq[1]) + nq[0]; 1221 } 1222 /* Calculate the reverse RSS map table */ 1223 for (i = 0; i < RSS_TABLE_SIZE; ++i) 1224 if (adap->rrss_map[rspq_map[i]] == 0xff) 1225 adap->rrss_map[rspq_map[i]] = i; 1226 1227 t3_config_rss(adap, F_RQFEEDBACKENABLE | F_TNLLKPEN | F_TNLMAPEN | 1228 F_TNLPRTEN | F_TNL2TUPEN | F_TNL4TUPEN | F_OFDMAPEN | 1229 V_RRCPLCPUSIZE(6), cpus, rspq_map); 1230 1231 } 1232 1233 /* 1234 * Sends an mbuf to an offload queue driver 1235 * after dealing with any active network taps. 1236 */ 1237 static inline int 1238 offload_tx(struct toedev *tdev, struct mbuf *m) 1239 { 1240 int ret; 1241 1242 critical_enter(); 1243 ret = t3_offload_tx(tdev, m); 1244 critical_exit(); 1245 return (ret); 1246 } 1247 1248 static int 1249 write_smt_entry(struct adapter *adapter, int idx) 1250 { 1251 struct port_info *pi = &adapter->port[idx]; 1252 struct cpl_smt_write_req *req; 1253 struct mbuf *m; 1254 1255 if ((m = m_gethdr(M_NOWAIT, MT_DATA)) == NULL) 1256 return (ENOMEM); 1257 1258 req = mtod(m, struct cpl_smt_write_req *); 1259 req->wr.wr_hi = htonl(V_WR_OP(FW_WROPCODE_FORWARD)); 1260 OPCODE_TID(req) = htonl(MK_OPCODE_TID(CPL_SMT_WRITE_REQ, idx)); 1261 req->mtu_idx = NMTUS - 1; /* should be 0 but there's a T3 bug */ 1262 req->iff = idx; 1263 memset(req->src_mac1, 0, sizeof(req->src_mac1)); 1264 memcpy(req->src_mac0, pi->hw_addr, ETHER_ADDR_LEN); 1265 1266 m_set_priority(m, 1); 1267 1268 offload_tx(&adapter->tdev, m); 1269 1270 return (0); 1271 } 1272 1273 static int 1274 init_smt(struct adapter *adapter) 1275 { 1276 int i; 1277 1278 for_each_port(adapter, i) 1279 write_smt_entry(adapter, i); 1280 return 0; 1281 } 1282 1283 static void 1284 init_port_mtus(adapter_t *adapter) 1285 { 1286 unsigned int mtus = adapter->port[0].ifp->if_mtu; 1287 1288 if (adapter->port[1].ifp) 1289 mtus |= adapter->port[1].ifp->if_mtu << 16; 1290 t3_write_reg(adapter, A_TP_MTU_PORT_TABLE, mtus); 1291 } 1292 1293 static void 1294 send_pktsched_cmd(struct adapter *adap, int sched, int qidx, int lo, 1295 int hi, int port) 1296 { 1297 struct mbuf *m; 1298 struct mngt_pktsched_wr *req; 1299 1300 m = m_gethdr(M_DONTWAIT, MT_DATA); 1301 if (m) { 1302 req = mtod(m, struct mngt_pktsched_wr *); 1303 req->wr_hi = htonl(V_WR_OP(FW_WROPCODE_MNGT)); 1304 req->mngt_opcode = FW_MNGTOPCODE_PKTSCHED_SET; 1305 req->sched = sched; 1306 req->idx = qidx; 1307 req->min = lo; 1308 req->max = hi; 1309 req->binding = port; 1310 m->m_len = m->m_pkthdr.len = sizeof(*req); 1311 t3_mgmt_tx(adap, m); 1312 } 1313 } 1314 1315 static void 1316 bind_qsets(adapter_t *sc) 1317 { 1318 int i, j; 1319 1320 for (i = 0; i < (sc)->params.nports; ++i) { 1321 const struct port_info *pi = adap2pinfo(sc, i); 1322 1323 for (j = 0; j < pi->nqsets; ++j) { 1324 send_pktsched_cmd(sc, 1, pi->first_qset + j, -1, 1325 -1, pi->tx_chan); 1326 1327 } 1328 } 1329 } 1330 1331 static void 1332 update_tpeeprom(struct adapter *adap) 1333 { 1334 #ifdef FIRMWARE_LATEST 1335 const struct firmware *tpeeprom; 1336 #else 1337 struct firmware *tpeeprom; 1338 #endif 1339 1340 char buf[64]; 1341 uint32_t version; 1342 unsigned int major, minor; 1343 int ret, len; 1344 char rev; 1345 1346 t3_seeprom_read(adap, TP_SRAM_OFFSET, &version); 1347 1348 major = G_TP_VERSION_MAJOR(version); 1349 minor = G_TP_VERSION_MINOR(version); 1350 if (major == TP_VERSION_MAJOR && minor == TP_VERSION_MINOR) 1351 return; 1352 1353 rev = t3rev2char(adap); 1354 1355 snprintf(buf, sizeof(buf), TPEEPROM_NAME, rev, 1356 TP_VERSION_MAJOR, TP_VERSION_MINOR, TP_VERSION_MICRO); 1357 1358 tpeeprom = firmware_get(buf); 1359 if (tpeeprom == NULL) { 1360 device_printf(adap->dev, "could not load TP EEPROM: unable to load %s\n", 1361 buf); 1362 return; 1363 } 1364 1365 len = tpeeprom->datasize - 4; 1366 1367 ret = t3_check_tpsram(adap, tpeeprom->data, tpeeprom->datasize); 1368 if (ret) 1369 goto release_tpeeprom; 1370 1371 if (len != TP_SRAM_LEN) { 1372 device_printf(adap->dev, "%s length is wrong len=%d expected=%d\n", buf, len, TP_SRAM_LEN); 1373 return; 1374 } 1375 1376 ret = set_eeprom(&adap->port[0], tpeeprom->data, tpeeprom->datasize, 1377 TP_SRAM_OFFSET); 1378 1379 if (!ret) { 1380 device_printf(adap->dev, 1381 "Protocol SRAM image updated in EEPROM to %d.%d.%d\n", 1382 TP_VERSION_MAJOR, TP_VERSION_MINOR, TP_VERSION_MICRO); 1383 } else 1384 device_printf(adap->dev, "Protocol SRAM image update in EEPROM failed\n"); 1385 1386 release_tpeeprom: 1387 firmware_put(tpeeprom, FIRMWARE_UNLOAD); 1388 1389 return; 1390 } 1391 1392 static int 1393 update_tpsram(struct adapter *adap) 1394 { 1395 #ifdef FIRMWARE_LATEST 1396 const struct firmware *tpsram; 1397 #else 1398 struct firmware *tpsram; 1399 #endif 1400 char buf[64]; 1401 int ret; 1402 char rev; 1403 1404 rev = t3rev2char(adap); 1405 if (!rev) 1406 return 0; 1407 1408 update_tpeeprom(adap); 1409 1410 snprintf(buf, sizeof(buf), TPSRAM_NAME, rev, 1411 TP_VERSION_MAJOR, TP_VERSION_MINOR, TP_VERSION_MICRO); 1412 1413 tpsram = firmware_get(buf); 1414 if (tpsram == NULL){ 1415 device_printf(adap->dev, "could not load TP SRAM: unable to load %s\n", 1416 buf); 1417 return (EINVAL); 1418 } else 1419 device_printf(adap->dev, "updating TP SRAM with %s\n", buf); 1420 1421 ret = t3_check_tpsram(adap, tpsram->data, tpsram->datasize); 1422 if (ret) 1423 goto release_tpsram; 1424 1425 ret = t3_set_proto_sram(adap, tpsram->data); 1426 if (ret) 1427 device_printf(adap->dev, "loading protocol SRAM failed\n"); 1428 1429 release_tpsram: 1430 firmware_put(tpsram, FIRMWARE_UNLOAD); 1431 1432 return ret; 1433 } 1434 1435 /** 1436 * cxgb_up - enable the adapter 1437 * @adap: adapter being enabled 1438 * 1439 * Called when the first port is enabled, this function performs the 1440 * actions necessary to make an adapter operational, such as completing 1441 * the initialization of HW modules, and enabling interrupts. 1442 * 1443 */ 1444 static int 1445 cxgb_up(struct adapter *sc) 1446 { 1447 int err = 0; 1448 1449 if ((sc->flags & FULL_INIT_DONE) == 0) { 1450 1451 if ((sc->flags & FW_UPTODATE) == 0) 1452 if ((err = upgrade_fw(sc))) 1453 goto out; 1454 if ((sc->flags & TPS_UPTODATE) == 0) 1455 if ((err = update_tpsram(sc))) 1456 goto out; 1457 err = t3_init_hw(sc, 0); 1458 if (err) 1459 goto out; 1460 1461 t3_write_reg(sc, A_ULPRX_TDDP_PSZ, V_HPZ0(PAGE_SHIFT - 12)); 1462 1463 err = setup_sge_qsets(sc); 1464 if (err) 1465 goto out; 1466 1467 setup_rss(sc); 1468 sc->flags |= FULL_INIT_DONE; 1469 } 1470 1471 t3_intr_clear(sc); 1472 1473 /* If it's MSI or INTx, allocate a single interrupt for everything */ 1474 if ((sc->flags & USING_MSIX) == 0) { 1475 if ((sc->irq_res = bus_alloc_resource_any(sc->dev, SYS_RES_IRQ, 1476 &sc->irq_rid, RF_SHAREABLE | RF_ACTIVE)) == NULL) { 1477 device_printf(sc->dev, "Cannot allocate interrupt rid=%d\n", 1478 sc->irq_rid); 1479 err = EINVAL; 1480 goto out; 1481 } 1482 device_printf(sc->dev, "allocated irq_res=%p\n", sc->irq_res); 1483 1484 if (bus_setup_intr(sc->dev, sc->irq_res, INTR_MPSAFE|INTR_TYPE_NET, 1485 #ifdef INTR_FILTERS 1486 NULL, 1487 #endif 1488 sc->cxgb_intr, sc, &sc->intr_tag)) { 1489 device_printf(sc->dev, "Cannot set up interrupt\n"); 1490 err = EINVAL; 1491 goto irq_err; 1492 } 1493 } else { 1494 cxgb_setup_msix(sc, sc->msi_count); 1495 } 1496 1497 t3_sge_start(sc); 1498 t3_intr_enable(sc); 1499 1500 if (!(sc->flags & QUEUES_BOUND)) { 1501 printf("bind qsets\n"); 1502 bind_qsets(sc); 1503 sc->flags |= QUEUES_BOUND; 1504 } 1505 out: 1506 return (err); 1507 irq_err: 1508 CH_ERR(sc, "request_irq failed, err %d\n", err); 1509 goto out; 1510 } 1511 1512 1513 /* 1514 * Release resources when all the ports and offloading have been stopped. 1515 */ 1516 static void 1517 cxgb_down_locked(struct adapter *sc) 1518 { 1519 int i; 1520 1521 t3_sge_stop(sc); 1522 t3_intr_disable(sc); 1523 1524 if (sc->intr_tag != NULL) { 1525 bus_teardown_intr(sc->dev, sc->irq_res, sc->intr_tag); 1526 sc->intr_tag = NULL; 1527 } 1528 if (sc->irq_res != NULL) { 1529 device_printf(sc->dev, "de-allocating interrupt irq_rid=%d irq_res=%p\n", 1530 sc->irq_rid, sc->irq_res); 1531 bus_release_resource(sc->dev, SYS_RES_IRQ, sc->irq_rid, 1532 sc->irq_res); 1533 sc->irq_res = NULL; 1534 } 1535 1536 if (sc->flags & USING_MSIX) 1537 cxgb_teardown_msix(sc); 1538 ADAPTER_UNLOCK(sc); 1539 1540 callout_drain(&sc->cxgb_tick_ch); 1541 callout_drain(&sc->sge_timer_ch); 1542 1543 if (sc->tq != NULL) { 1544 taskqueue_drain(sc->tq, &sc->slow_intr_task); 1545 for (i = 0; i < sc->params.nports; i++) 1546 taskqueue_drain(sc->tq, &sc->port[i].timer_reclaim_task); 1547 } 1548 #ifdef notyet 1549 1550 if (sc->port[i].tq != NULL) 1551 #endif 1552 1553 } 1554 1555 static int 1556 offload_open(struct port_info *pi) 1557 { 1558 struct adapter *adapter = pi->adapter; 1559 struct toedev *tdev = TOEDEV(pi->ifp); 1560 int adap_up = adapter->open_device_map & PORT_MASK; 1561 int err = 0; 1562 1563 if (atomic_cmpset_int(&adapter->open_device_map, 1564 (adapter->open_device_map & ~OFFLOAD_DEVMAP_BIT), 1565 (adapter->open_device_map | OFFLOAD_DEVMAP_BIT)) == 0) 1566 return (0); 1567 1568 ADAPTER_LOCK(pi->adapter); 1569 if (!adap_up) 1570 err = cxgb_up(adapter); 1571 ADAPTER_UNLOCK(pi->adapter); 1572 if (err) 1573 return (err); 1574 1575 t3_tp_set_offload_mode(adapter, 1); 1576 tdev->lldev = adapter->port[0].ifp; 1577 err = cxgb_offload_activate(adapter); 1578 if (err) 1579 goto out; 1580 1581 init_port_mtus(adapter); 1582 t3_load_mtus(adapter, adapter->params.mtus, adapter->params.a_wnd, 1583 adapter->params.b_wnd, 1584 adapter->params.rev == 0 ? 1585 adapter->port[0].ifp->if_mtu : 0xffff); 1586 init_smt(adapter); 1587 1588 /* Call back all registered clients */ 1589 cxgb_add_clients(tdev); 1590 1591 out: 1592 /* restore them in case the offload module has changed them */ 1593 if (err) { 1594 t3_tp_set_offload_mode(adapter, 0); 1595 clrbit(&adapter->open_device_map, OFFLOAD_DEVMAP_BIT); 1596 cxgb_set_dummy_ops(tdev); 1597 } 1598 return (err); 1599 } 1600 #ifdef notyet 1601 static int 1602 offload_close(struct toedev *tdev) 1603 { 1604 struct adapter *adapter = tdev2adap(tdev); 1605 1606 if (!isset(&adapter->open_device_map, OFFLOAD_DEVMAP_BIT)) 1607 return (0); 1608 1609 /* Call back all registered clients */ 1610 cxgb_remove_clients(tdev); 1611 tdev->lldev = NULL; 1612 cxgb_set_dummy_ops(tdev); 1613 t3_tp_set_offload_mode(adapter, 0); 1614 clrbit(&adapter->open_device_map, OFFLOAD_DEVMAP_BIT); 1615 1616 if (!adapter->open_device_map) 1617 cxgb_down(adapter); 1618 1619 cxgb_offload_deactivate(adapter); 1620 return (0); 1621 } 1622 #endif 1623 1624 static void 1625 cxgb_init(void *arg) 1626 { 1627 struct port_info *p = arg; 1628 1629 PORT_LOCK(p); 1630 cxgb_init_locked(p); 1631 PORT_UNLOCK(p); 1632 } 1633 1634 static void 1635 cxgb_init_locked(struct port_info *p) 1636 { 1637 struct ifnet *ifp; 1638 adapter_t *sc = p->adapter; 1639 int err; 1640 1641 PORT_LOCK_ASSERT_OWNED(p); 1642 ifp = p->ifp; 1643 1644 ADAPTER_LOCK(p->adapter); 1645 if ((sc->open_device_map == 0) && (err = cxgb_up(sc))) { 1646 ADAPTER_UNLOCK(p->adapter); 1647 cxgb_stop_locked(p); 1648 return; 1649 } 1650 if (p->adapter->open_device_map == 0) { 1651 t3_intr_clear(sc); 1652 t3_sge_init_adapter(sc); 1653 } 1654 setbit(&p->adapter->open_device_map, p->port_id); 1655 ADAPTER_UNLOCK(p->adapter); 1656 1657 if (is_offload(sc) && !ofld_disable) { 1658 err = offload_open(p); 1659 if (err) 1660 log(LOG_WARNING, 1661 "Could not initialize offload capabilities\n"); 1662 } 1663 cxgb_link_start(p); 1664 t3_link_changed(sc, p->port_id); 1665 ifp->if_baudrate = p->link_config.speed * 1000000; 1666 1667 device_printf(sc->dev, "enabling interrupts on port=%d\n", p->port_id); 1668 t3_port_intr_enable(sc, p->port_id); 1669 1670 callout_reset(&sc->cxgb_tick_ch, sc->params.stats_update_period * hz, 1671 cxgb_tick, sc); 1672 1673 ifp->if_drv_flags |= IFF_DRV_RUNNING; 1674 ifp->if_drv_flags &= ~IFF_DRV_OACTIVE; 1675 } 1676 1677 static void 1678 cxgb_set_rxmode(struct port_info *p) 1679 { 1680 struct t3_rx_mode rm; 1681 struct cmac *mac = &p->mac; 1682 1683 PORT_LOCK_ASSERT_OWNED(p); 1684 1685 t3_init_rx_mode(&rm, p); 1686 t3_mac_set_rx_mode(mac, &rm); 1687 } 1688 1689 static void 1690 cxgb_stop_locked(struct port_info *p) 1691 { 1692 struct ifnet *ifp; 1693 1694 PORT_LOCK_ASSERT_OWNED(p); 1695 ADAPTER_LOCK_ASSERT_NOTOWNED(p->adapter); 1696 1697 ifp = p->ifp; 1698 1699 t3_port_intr_disable(p->adapter, p->port_id); 1700 ifp->if_drv_flags &= ~(IFF_DRV_RUNNING | IFF_DRV_OACTIVE); 1701 p->phy.ops->power_down(&p->phy, 1); 1702 t3_mac_disable(&p->mac, MAC_DIRECTION_TX | MAC_DIRECTION_RX); 1703 1704 ADAPTER_LOCK(p->adapter); 1705 clrbit(&p->adapter->open_device_map, p->port_id); 1706 1707 1708 if (p->adapter->open_device_map == 0) { 1709 cxgb_down_locked(p->adapter); 1710 } else 1711 ADAPTER_UNLOCK(p->adapter); 1712 1713 } 1714 1715 static int 1716 cxgb_set_mtu(struct port_info *p, int mtu) 1717 { 1718 struct ifnet *ifp = p->ifp; 1719 int error = 0; 1720 1721 if ((mtu < ETHERMIN) || (mtu > ETHER_MAX_LEN_JUMBO)) 1722 error = EINVAL; 1723 else if (ifp->if_mtu != mtu) { 1724 PORT_LOCK(p); 1725 ifp->if_mtu = mtu; 1726 if (ifp->if_drv_flags & IFF_DRV_RUNNING) { 1727 callout_stop(&p->adapter->cxgb_tick_ch); 1728 cxgb_stop_locked(p); 1729 cxgb_init_locked(p); 1730 } 1731 PORT_UNLOCK(p); 1732 } 1733 return (error); 1734 } 1735 1736 static int 1737 cxgb_ioctl(struct ifnet *ifp, unsigned long command, caddr_t data) 1738 { 1739 struct port_info *p = ifp->if_softc; 1740 struct ifaddr *ifa = (struct ifaddr *)data; 1741 struct ifreq *ifr = (struct ifreq *)data; 1742 int flags, error = 0; 1743 uint32_t mask; 1744 1745 /* 1746 * XXX need to check that we aren't in the middle of an unload 1747 */ 1748 switch (command) { 1749 case SIOCSIFMTU: 1750 error = cxgb_set_mtu(p, ifr->ifr_mtu); 1751 break; 1752 case SIOCSIFADDR: 1753 case SIOCGIFADDR: 1754 PORT_LOCK(p); 1755 if (ifa->ifa_addr->sa_family == AF_INET) { 1756 ifp->if_flags |= IFF_UP; 1757 if (!(ifp->if_drv_flags & IFF_DRV_RUNNING)) 1758 cxgb_init_locked(p); 1759 arp_ifinit(ifp, ifa); 1760 } else 1761 error = ether_ioctl(ifp, command, data); 1762 PORT_UNLOCK(p); 1763 break; 1764 case SIOCSIFFLAGS: 1765 callout_drain(&p->adapter->cxgb_tick_ch); 1766 PORT_LOCK(p); 1767 if (ifp->if_flags & IFF_UP) { 1768 if (ifp->if_drv_flags & IFF_DRV_RUNNING) { 1769 flags = p->if_flags; 1770 if (((ifp->if_flags ^ flags) & IFF_PROMISC) || 1771 ((ifp->if_flags ^ flags) & IFF_ALLMULTI)) 1772 cxgb_set_rxmode(p); 1773 } else 1774 cxgb_init_locked(p); 1775 p->if_flags = ifp->if_flags; 1776 } else if (ifp->if_drv_flags & IFF_DRV_RUNNING) 1777 cxgb_stop_locked(p); 1778 1779 if (ifp->if_drv_flags & IFF_DRV_RUNNING) { 1780 adapter_t *sc = p->adapter; 1781 callout_reset(&sc->cxgb_tick_ch, 1782 sc->params.stats_update_period * hz, 1783 cxgb_tick, sc); 1784 } 1785 PORT_UNLOCK(p); 1786 break; 1787 case SIOCSIFMEDIA: 1788 case SIOCGIFMEDIA: 1789 error = ifmedia_ioctl(ifp, ifr, &p->media, command); 1790 break; 1791 case SIOCSIFCAP: 1792 PORT_LOCK(p); 1793 mask = ifr->ifr_reqcap ^ ifp->if_capenable; 1794 if (mask & IFCAP_TXCSUM) { 1795 if (IFCAP_TXCSUM & ifp->if_capenable) { 1796 ifp->if_capenable &= ~(IFCAP_TXCSUM|IFCAP_TSO4); 1797 ifp->if_hwassist &= ~(CSUM_TCP | CSUM_UDP 1798 | CSUM_TSO); 1799 } else { 1800 ifp->if_capenable |= IFCAP_TXCSUM; 1801 ifp->if_hwassist |= (CSUM_TCP | CSUM_UDP); 1802 } 1803 } else if (mask & IFCAP_RXCSUM) { 1804 if (IFCAP_RXCSUM & ifp->if_capenable) { 1805 ifp->if_capenable &= ~IFCAP_RXCSUM; 1806 } else { 1807 ifp->if_capenable |= IFCAP_RXCSUM; 1808 } 1809 } 1810 if (mask & IFCAP_TSO4) { 1811 if (IFCAP_TSO4 & ifp->if_capenable) { 1812 ifp->if_capenable &= ~IFCAP_TSO4; 1813 ifp->if_hwassist &= ~CSUM_TSO; 1814 } else if (IFCAP_TXCSUM & ifp->if_capenable) { 1815 ifp->if_capenable |= IFCAP_TSO4; 1816 ifp->if_hwassist |= CSUM_TSO; 1817 } else { 1818 if (cxgb_debug) 1819 printf("cxgb requires tx checksum offload" 1820 " be enabled to use TSO\n"); 1821 error = EINVAL; 1822 } 1823 } 1824 PORT_UNLOCK(p); 1825 break; 1826 default: 1827 error = ether_ioctl(ifp, command, data); 1828 break; 1829 } 1830 return (error); 1831 } 1832 1833 static int 1834 cxgb_start_tx(struct ifnet *ifp, uint32_t txmax) 1835 { 1836 struct sge_qset *qs; 1837 struct sge_txq *txq; 1838 struct port_info *p = ifp->if_softc; 1839 struct mbuf *m = NULL; 1840 int err, in_use_init, free; 1841 1842 if (!p->link_config.link_ok) 1843 return (ENXIO); 1844 1845 if (IFQ_DRV_IS_EMPTY(&ifp->if_snd)) 1846 return (ENOBUFS); 1847 1848 qs = &p->adapter->sge.qs[p->first_qset]; 1849 txq = &qs->txq[TXQ_ETH]; 1850 err = 0; 1851 1852 if (txq->flags & TXQ_TRANSMITTING) 1853 return (EINPROGRESS); 1854 1855 mtx_lock(&txq->lock); 1856 txq->flags |= TXQ_TRANSMITTING; 1857 in_use_init = txq->in_use; 1858 while ((txq->in_use - in_use_init < txmax) && 1859 (txq->size > txq->in_use + TX_MAX_DESC)) { 1860 free = 0; 1861 IFQ_DRV_DEQUEUE(&ifp->if_snd, m); 1862 if (m == NULL) 1863 break; 1864 /* 1865 * Convert chain to M_IOVEC 1866 */ 1867 KASSERT((m->m_flags & M_IOVEC) == 0, ("IOVEC set too early")); 1868 #ifdef notyet 1869 m0 = m; 1870 if (collapse_mbufs && m->m_pkthdr.len > MCLBYTES && 1871 m_collapse(m, TX_MAX_SEGS, &m0) == EFBIG) { 1872 if ((m0 = m_defrag(m, M_NOWAIT)) != NULL) { 1873 m = m0; 1874 m_collapse(m, TX_MAX_SEGS, &m0); 1875 } else 1876 break; 1877 } 1878 m = m0; 1879 #endif 1880 if ((err = t3_encap(p, &m, &free)) != 0) 1881 break; 1882 BPF_MTAP(ifp, m); 1883 if (free) 1884 m_freem(m); 1885 } 1886 txq->flags &= ~TXQ_TRANSMITTING; 1887 mtx_unlock(&txq->lock); 1888 1889 if (__predict_false(err)) { 1890 if (err == ENOMEM) { 1891 ifp->if_drv_flags |= IFF_DRV_OACTIVE; 1892 IFQ_LOCK(&ifp->if_snd); 1893 IFQ_DRV_PREPEND(&ifp->if_snd, m); 1894 IFQ_UNLOCK(&ifp->if_snd); 1895 } 1896 } 1897 if (err == 0 && m == NULL) 1898 err = ENOBUFS; 1899 else if ((err == 0) && (txq->size <= txq->in_use + TX_MAX_DESC) && 1900 (ifp->if_drv_flags & IFF_DRV_OACTIVE) == 0) { 1901 ifp->if_drv_flags |= IFF_DRV_OACTIVE; 1902 err = ENOSPC; 1903 } 1904 return (err); 1905 } 1906 1907 static void 1908 cxgb_start_proc(void *arg, int ncount) 1909 { 1910 struct ifnet *ifp = arg; 1911 struct port_info *pi = ifp->if_softc; 1912 struct sge_qset *qs; 1913 struct sge_txq *txq; 1914 int error; 1915 1916 qs = &pi->adapter->sge.qs[pi->first_qset]; 1917 txq = &qs->txq[TXQ_ETH]; 1918 1919 do { 1920 if (desc_reclaimable(txq) > TX_CLEAN_MAX_DESC >> 2) 1921 taskqueue_enqueue(pi->tq, &txq->qreclaim_task); 1922 1923 error = cxgb_start_tx(ifp, TX_START_MAX_DESC); 1924 } while (error == 0); 1925 } 1926 1927 static void 1928 cxgb_start(struct ifnet *ifp) 1929 { 1930 struct port_info *pi = ifp->if_softc; 1931 struct sge_qset *qs; 1932 struct sge_txq *txq; 1933 int err; 1934 1935 qs = &pi->adapter->sge.qs[pi->first_qset]; 1936 txq = &qs->txq[TXQ_ETH]; 1937 1938 if (desc_reclaimable(txq) > TX_CLEAN_MAX_DESC >> 2) 1939 taskqueue_enqueue(pi->tq, 1940 &txq->qreclaim_task); 1941 1942 err = cxgb_start_tx(ifp, TX_START_MAX_DESC); 1943 1944 if (err == 0) 1945 taskqueue_enqueue(pi->tq, &pi->start_task); 1946 } 1947 1948 1949 static int 1950 cxgb_media_change(struct ifnet *ifp) 1951 { 1952 if_printf(ifp, "media change not supported\n"); 1953 return (ENXIO); 1954 } 1955 1956 static void 1957 cxgb_media_status(struct ifnet *ifp, struct ifmediareq *ifmr) 1958 { 1959 struct port_info *p = ifp->if_softc; 1960 1961 ifmr->ifm_status = IFM_AVALID; 1962 ifmr->ifm_active = IFM_ETHER; 1963 1964 if (!p->link_config.link_ok) 1965 return; 1966 1967 ifmr->ifm_status |= IFM_ACTIVE; 1968 1969 switch (p->link_config.speed) { 1970 case 10: 1971 ifmr->ifm_active |= IFM_10_T; 1972 break; 1973 case 100: 1974 ifmr->ifm_active |= IFM_100_TX; 1975 break; 1976 case 1000: 1977 ifmr->ifm_active |= IFM_1000_T; 1978 break; 1979 } 1980 1981 if (p->link_config.duplex) 1982 ifmr->ifm_active |= IFM_FDX; 1983 else 1984 ifmr->ifm_active |= IFM_HDX; 1985 } 1986 1987 static void 1988 cxgb_async_intr(void *data) 1989 { 1990 adapter_t *sc = data; 1991 1992 if (cxgb_debug) 1993 device_printf(sc->dev, "cxgb_async_intr\n"); 1994 /* 1995 * May need to sleep - defer to taskqueue 1996 */ 1997 taskqueue_enqueue(sc->tq, &sc->slow_intr_task); 1998 } 1999 2000 static void 2001 cxgb_ext_intr_handler(void *arg, int count) 2002 { 2003 adapter_t *sc = (adapter_t *)arg; 2004 2005 if (cxgb_debug) 2006 printf("cxgb_ext_intr_handler\n"); 2007 2008 t3_phy_intr_handler(sc); 2009 2010 /* Now reenable external interrupts */ 2011 ADAPTER_LOCK(sc); 2012 if (sc->slow_intr_mask) { 2013 sc->slow_intr_mask |= F_T3DBG; 2014 t3_write_reg(sc, A_PL_INT_CAUSE0, F_T3DBG); 2015 t3_write_reg(sc, A_PL_INT_ENABLE0, sc->slow_intr_mask); 2016 } 2017 ADAPTER_UNLOCK(sc); 2018 } 2019 2020 static void 2021 check_link_status(adapter_t *sc) 2022 { 2023 int i; 2024 2025 for (i = 0; i < (sc)->params.nports; ++i) { 2026 struct port_info *p = &sc->port[i]; 2027 2028 if (!(p->port_type->caps & SUPPORTED_IRQ)) 2029 t3_link_changed(sc, i); 2030 p->ifp->if_baudrate = p->link_config.speed * 1000000; 2031 } 2032 } 2033 2034 static void 2035 check_t3b2_mac(struct adapter *adapter) 2036 { 2037 int i; 2038 2039 for_each_port(adapter, i) { 2040 struct port_info *p = &adapter->port[i]; 2041 struct ifnet *ifp = p->ifp; 2042 int status; 2043 2044 if ((ifp->if_drv_flags & IFF_DRV_RUNNING) == 0) 2045 continue; 2046 2047 status = 0; 2048 PORT_LOCK(p); 2049 if ((ifp->if_drv_flags & IFF_DRV_RUNNING)) 2050 status = t3b2_mac_watchdog_task(&p->mac); 2051 if (status == 1) 2052 p->mac.stats.num_toggled++; 2053 else if (status == 2) { 2054 struct cmac *mac = &p->mac; 2055 2056 t3_mac_set_mtu(mac, ifp->if_mtu + ETHER_HDR_LEN 2057 + ETHER_VLAN_ENCAP_LEN); 2058 t3_mac_set_address(mac, 0, p->hw_addr); 2059 cxgb_set_rxmode(p); 2060 t3_link_start(&p->phy, mac, &p->link_config); 2061 t3_mac_enable(mac, MAC_DIRECTION_RX | MAC_DIRECTION_TX); 2062 t3_port_intr_enable(adapter, p->port_id); 2063 p->mac.stats.num_resets++; 2064 } 2065 PORT_UNLOCK(p); 2066 } 2067 } 2068 2069 static void 2070 cxgb_tick(void *arg) 2071 { 2072 adapter_t *sc = (adapter_t *)arg; 2073 2074 taskqueue_enqueue(sc->tq, &sc->tick_task); 2075 2076 if (sc->open_device_map != 0) 2077 callout_reset(&sc->cxgb_tick_ch, sc->params.stats_update_period * hz, 2078 cxgb_tick, sc); 2079 } 2080 2081 static void 2082 cxgb_tick_handler(void *arg, int count) 2083 { 2084 adapter_t *sc = (adapter_t *)arg; 2085 const struct adapter_params *p = &sc->params; 2086 2087 ADAPTER_LOCK(sc); 2088 if (p->linkpoll_period) 2089 check_link_status(sc); 2090 2091 /* 2092 * adapter lock can currently only be acquire after the 2093 * port lock 2094 */ 2095 ADAPTER_UNLOCK(sc); 2096 2097 if (p->rev == T3_REV_B2 && p->nports < 4) 2098 check_t3b2_mac(sc); 2099 } 2100 2101 static void 2102 touch_bars(device_t dev) 2103 { 2104 /* 2105 * Don't enable yet 2106 */ 2107 #if !defined(__LP64__) && 0 2108 u32 v; 2109 2110 pci_read_config_dword(pdev, PCI_BASE_ADDRESS_1, &v); 2111 pci_write_config_dword(pdev, PCI_BASE_ADDRESS_1, v); 2112 pci_read_config_dword(pdev, PCI_BASE_ADDRESS_3, &v); 2113 pci_write_config_dword(pdev, PCI_BASE_ADDRESS_3, v); 2114 pci_read_config_dword(pdev, PCI_BASE_ADDRESS_5, &v); 2115 pci_write_config_dword(pdev, PCI_BASE_ADDRESS_5, v); 2116 #endif 2117 } 2118 2119 static int 2120 set_eeprom(struct port_info *pi, const uint8_t *data, int len, int offset) 2121 { 2122 uint8_t *buf; 2123 int err = 0; 2124 u32 aligned_offset, aligned_len, *p; 2125 struct adapter *adapter = pi->adapter; 2126 2127 2128 aligned_offset = offset & ~3; 2129 aligned_len = (len + (offset & 3) + 3) & ~3; 2130 2131 if (aligned_offset != offset || aligned_len != len) { 2132 buf = malloc(aligned_len, M_DEVBUF, M_WAITOK|M_ZERO); 2133 if (!buf) 2134 return (ENOMEM); 2135 err = t3_seeprom_read(adapter, aligned_offset, (u32 *)buf); 2136 if (!err && aligned_len > 4) 2137 err = t3_seeprom_read(adapter, 2138 aligned_offset + aligned_len - 4, 2139 (u32 *)&buf[aligned_len - 4]); 2140 if (err) 2141 goto out; 2142 memcpy(buf + (offset & 3), data, len); 2143 } else 2144 buf = (uint8_t *)(uintptr_t)data; 2145 2146 err = t3_seeprom_wp(adapter, 0); 2147 if (err) 2148 goto out; 2149 2150 for (p = (u32 *)buf; !err && aligned_len; aligned_len -= 4, p++) { 2151 err = t3_seeprom_write(adapter, aligned_offset, *p); 2152 aligned_offset += 4; 2153 } 2154 2155 if (!err) 2156 err = t3_seeprom_wp(adapter, 1); 2157 out: 2158 if (buf != data) 2159 free(buf, M_DEVBUF); 2160 return err; 2161 } 2162 2163 2164 static int 2165 in_range(int val, int lo, int hi) 2166 { 2167 return val < 0 || (val <= hi && val >= lo); 2168 } 2169 2170 static int 2171 cxgb_extension_open(struct cdev *dev, int flags, int fmp, d_thread_t *td) 2172 { 2173 return (0); 2174 } 2175 2176 static int 2177 cxgb_extension_close(struct cdev *dev, int flags, int fmt, d_thread_t *td) 2178 { 2179 return (0); 2180 } 2181 2182 static int 2183 cxgb_extension_ioctl(struct cdev *dev, unsigned long cmd, caddr_t data, 2184 int fflag, struct thread *td) 2185 { 2186 int mmd, error = 0; 2187 struct port_info *pi = dev->si_drv1; 2188 adapter_t *sc = pi->adapter; 2189 2190 #ifdef PRIV_SUPPORTED 2191 if (priv_check(td, PRIV_DRIVER)) { 2192 if (cxgb_debug) 2193 printf("user does not have access to privileged ioctls\n"); 2194 return (EPERM); 2195 } 2196 #else 2197 if (suser(td)) { 2198 if (cxgb_debug) 2199 printf("user does not have access to privileged ioctls\n"); 2200 return (EPERM); 2201 } 2202 #endif 2203 2204 switch (cmd) { 2205 case SIOCGMIIREG: { 2206 uint32_t val; 2207 struct cphy *phy = &pi->phy; 2208 struct mii_data *mid = (struct mii_data *)data; 2209 2210 if (!phy->mdio_read) 2211 return (EOPNOTSUPP); 2212 if (is_10G(sc)) { 2213 mmd = mid->phy_id >> 8; 2214 if (!mmd) 2215 mmd = MDIO_DEV_PCS; 2216 else if (mmd > MDIO_DEV_XGXS) 2217 return (EINVAL); 2218 2219 error = phy->mdio_read(sc, mid->phy_id & 0x1f, mmd, 2220 mid->reg_num, &val); 2221 } else 2222 error = phy->mdio_read(sc, mid->phy_id & 0x1f, 0, 2223 mid->reg_num & 0x1f, &val); 2224 if (error == 0) 2225 mid->val_out = val; 2226 break; 2227 } 2228 case SIOCSMIIREG: { 2229 struct cphy *phy = &pi->phy; 2230 struct mii_data *mid = (struct mii_data *)data; 2231 2232 if (!phy->mdio_write) 2233 return (EOPNOTSUPP); 2234 if (is_10G(sc)) { 2235 mmd = mid->phy_id >> 8; 2236 if (!mmd) 2237 mmd = MDIO_DEV_PCS; 2238 else if (mmd > MDIO_DEV_XGXS) 2239 return (EINVAL); 2240 2241 error = phy->mdio_write(sc, mid->phy_id & 0x1f, 2242 mmd, mid->reg_num, mid->val_in); 2243 } else 2244 error = phy->mdio_write(sc, mid->phy_id & 0x1f, 0, 2245 mid->reg_num & 0x1f, 2246 mid->val_in); 2247 break; 2248 } 2249 case CHELSIO_SETREG: { 2250 struct ch_reg *edata = (struct ch_reg *)data; 2251 if ((edata->addr & 0x3) != 0 || edata->addr >= sc->mmio_len) 2252 return (EFAULT); 2253 t3_write_reg(sc, edata->addr, edata->val); 2254 break; 2255 } 2256 case CHELSIO_GETREG: { 2257 struct ch_reg *edata = (struct ch_reg *)data; 2258 if ((edata->addr & 0x3) != 0 || edata->addr >= sc->mmio_len) 2259 return (EFAULT); 2260 edata->val = t3_read_reg(sc, edata->addr); 2261 break; 2262 } 2263 case CHELSIO_GET_SGE_CONTEXT: { 2264 struct ch_cntxt *ecntxt = (struct ch_cntxt *)data; 2265 mtx_lock(&sc->sge.reg_lock); 2266 switch (ecntxt->cntxt_type) { 2267 case CNTXT_TYPE_EGRESS: 2268 error = t3_sge_read_ecntxt(sc, ecntxt->cntxt_id, 2269 ecntxt->data); 2270 break; 2271 case CNTXT_TYPE_FL: 2272 error = t3_sge_read_fl(sc, ecntxt->cntxt_id, 2273 ecntxt->data); 2274 break; 2275 case CNTXT_TYPE_RSP: 2276 error = t3_sge_read_rspq(sc, ecntxt->cntxt_id, 2277 ecntxt->data); 2278 break; 2279 case CNTXT_TYPE_CQ: 2280 error = t3_sge_read_cq(sc, ecntxt->cntxt_id, 2281 ecntxt->data); 2282 break; 2283 default: 2284 error = EINVAL; 2285 break; 2286 } 2287 mtx_unlock(&sc->sge.reg_lock); 2288 break; 2289 } 2290 case CHELSIO_GET_SGE_DESC: { 2291 struct ch_desc *edesc = (struct ch_desc *)data; 2292 int ret; 2293 if (edesc->queue_num >= SGE_QSETS * 6) 2294 return (EINVAL); 2295 ret = t3_get_desc(&sc->sge.qs[edesc->queue_num / 6], 2296 edesc->queue_num % 6, edesc->idx, edesc->data); 2297 if (ret < 0) 2298 return (EINVAL); 2299 edesc->size = ret; 2300 break; 2301 } 2302 case CHELSIO_SET_QSET_PARAMS: { 2303 struct qset_params *q; 2304 struct ch_qset_params *t = (struct ch_qset_params *)data; 2305 2306 if (t->qset_idx >= SGE_QSETS) 2307 return (EINVAL); 2308 if (!in_range(t->intr_lat, 0, M_NEWTIMER) || 2309 !in_range(t->cong_thres, 0, 255) || 2310 !in_range(t->txq_size[0], MIN_TXQ_ENTRIES, 2311 MAX_TXQ_ENTRIES) || 2312 !in_range(t->txq_size[1], MIN_TXQ_ENTRIES, 2313 MAX_TXQ_ENTRIES) || 2314 !in_range(t->txq_size[2], MIN_CTRL_TXQ_ENTRIES, 2315 MAX_CTRL_TXQ_ENTRIES) || 2316 !in_range(t->fl_size[0], MIN_FL_ENTRIES, MAX_RX_BUFFERS) || 2317 !in_range(t->fl_size[1], MIN_FL_ENTRIES, 2318 MAX_RX_JUMBO_BUFFERS) || 2319 !in_range(t->rspq_size, MIN_RSPQ_ENTRIES, MAX_RSPQ_ENTRIES)) 2320 return (EINVAL); 2321 if ((sc->flags & FULL_INIT_DONE) && 2322 (t->rspq_size >= 0 || t->fl_size[0] >= 0 || 2323 t->fl_size[1] >= 0 || t->txq_size[0] >= 0 || 2324 t->txq_size[1] >= 0 || t->txq_size[2] >= 0 || 2325 t->polling >= 0 || t->cong_thres >= 0)) 2326 return (EBUSY); 2327 2328 q = &sc->params.sge.qset[t->qset_idx]; 2329 2330 if (t->rspq_size >= 0) 2331 q->rspq_size = t->rspq_size; 2332 if (t->fl_size[0] >= 0) 2333 q->fl_size = t->fl_size[0]; 2334 if (t->fl_size[1] >= 0) 2335 q->jumbo_size = t->fl_size[1]; 2336 if (t->txq_size[0] >= 0) 2337 q->txq_size[0] = t->txq_size[0]; 2338 if (t->txq_size[1] >= 0) 2339 q->txq_size[1] = t->txq_size[1]; 2340 if (t->txq_size[2] >= 0) 2341 q->txq_size[2] = t->txq_size[2]; 2342 if (t->cong_thres >= 0) 2343 q->cong_thres = t->cong_thres; 2344 if (t->intr_lat >= 0) { 2345 struct sge_qset *qs = &sc->sge.qs[t->qset_idx]; 2346 2347 q->coalesce_nsecs = t->intr_lat*1000; 2348 t3_update_qset_coalesce(qs, q); 2349 } 2350 break; 2351 } 2352 case CHELSIO_GET_QSET_PARAMS: { 2353 struct qset_params *q; 2354 struct ch_qset_params *t = (struct ch_qset_params *)data; 2355 2356 if (t->qset_idx >= SGE_QSETS) 2357 return (EINVAL); 2358 2359 q = &(sc)->params.sge.qset[t->qset_idx]; 2360 t->rspq_size = q->rspq_size; 2361 t->txq_size[0] = q->txq_size[0]; 2362 t->txq_size[1] = q->txq_size[1]; 2363 t->txq_size[2] = q->txq_size[2]; 2364 t->fl_size[0] = q->fl_size; 2365 t->fl_size[1] = q->jumbo_size; 2366 t->polling = q->polling; 2367 t->intr_lat = q->coalesce_nsecs / 1000; 2368 t->cong_thres = q->cong_thres; 2369 break; 2370 } 2371 case CHELSIO_SET_QSET_NUM: { 2372 struct ch_reg *edata = (struct ch_reg *)data; 2373 unsigned int port_idx = pi->port_id; 2374 2375 if (sc->flags & FULL_INIT_DONE) 2376 return (EBUSY); 2377 if (edata->val < 1 || 2378 (edata->val > 1 && !(sc->flags & USING_MSIX))) 2379 return (EINVAL); 2380 if (edata->val + sc->port[!port_idx].nqsets > SGE_QSETS) 2381 return (EINVAL); 2382 sc->port[port_idx].nqsets = edata->val; 2383 sc->port[0].first_qset = 0; 2384 /* 2385 * XXX hardcode ourselves to 2 ports just like LEEENUX 2386 */ 2387 sc->port[1].first_qset = sc->port[0].nqsets; 2388 break; 2389 } 2390 case CHELSIO_GET_QSET_NUM: { 2391 struct ch_reg *edata = (struct ch_reg *)data; 2392 edata->val = pi->nqsets; 2393 break; 2394 } 2395 #ifdef notyet 2396 case CHELSIO_LOAD_FW: 2397 case CHELSIO_GET_PM: 2398 case CHELSIO_SET_PM: 2399 return (EOPNOTSUPP); 2400 break; 2401 #endif 2402 case CHELSIO_SETMTUTAB: { 2403 struct ch_mtus *m = (struct ch_mtus *)data; 2404 int i; 2405 2406 if (!is_offload(sc)) 2407 return (EOPNOTSUPP); 2408 if (offload_running(sc)) 2409 return (EBUSY); 2410 if (m->nmtus != NMTUS) 2411 return (EINVAL); 2412 if (m->mtus[0] < 81) /* accommodate SACK */ 2413 return (EINVAL); 2414 2415 /* 2416 * MTUs must be in ascending order 2417 */ 2418 for (i = 1; i < NMTUS; ++i) 2419 if (m->mtus[i] < m->mtus[i - 1]) 2420 return (EINVAL); 2421 2422 memcpy(sc->params.mtus, m->mtus, 2423 sizeof(sc->params.mtus)); 2424 break; 2425 } 2426 case CHELSIO_GETMTUTAB: { 2427 struct ch_mtus *m = (struct ch_mtus *)data; 2428 2429 if (!is_offload(sc)) 2430 return (EOPNOTSUPP); 2431 2432 memcpy(m->mtus, sc->params.mtus, sizeof(m->mtus)); 2433 m->nmtus = NMTUS; 2434 break; 2435 } 2436 case CHELSIO_DEVUP: 2437 if (!is_offload(sc)) 2438 return (EOPNOTSUPP); 2439 return offload_open(pi); 2440 break; 2441 case CHELSIO_GET_MEM: { 2442 struct ch_mem_range *t = (struct ch_mem_range *)data; 2443 struct mc7 *mem; 2444 uint8_t *useraddr; 2445 u64 buf[32]; 2446 2447 if (!is_offload(sc)) 2448 return (EOPNOTSUPP); 2449 if (!(sc->flags & FULL_INIT_DONE)) 2450 return (EIO); /* need the memory controllers */ 2451 if ((t->addr & 0x7) || (t->len & 0x7)) 2452 return (EINVAL); 2453 if (t->mem_id == MEM_CM) 2454 mem = &sc->cm; 2455 else if (t->mem_id == MEM_PMRX) 2456 mem = &sc->pmrx; 2457 else if (t->mem_id == MEM_PMTX) 2458 mem = &sc->pmtx; 2459 else 2460 return (EINVAL); 2461 2462 /* 2463 * Version scheme: 2464 * bits 0..9: chip version 2465 * bits 10..15: chip revision 2466 */ 2467 t->version = 3 | (sc->params.rev << 10); 2468 2469 /* 2470 * Read 256 bytes at a time as len can be large and we don't 2471 * want to use huge intermediate buffers. 2472 */ 2473 useraddr = (uint8_t *)(t + 1); /* advance to start of buffer */ 2474 while (t->len) { 2475 unsigned int chunk = min(t->len, sizeof(buf)); 2476 2477 error = t3_mc7_bd_read(mem, t->addr / 8, chunk / 8, buf); 2478 if (error) 2479 return (-error); 2480 if (copyout(buf, useraddr, chunk)) 2481 return (EFAULT); 2482 useraddr += chunk; 2483 t->addr += chunk; 2484 t->len -= chunk; 2485 } 2486 break; 2487 } 2488 case CHELSIO_READ_TCAM_WORD: { 2489 struct ch_tcam_word *t = (struct ch_tcam_word *)data; 2490 2491 if (!is_offload(sc)) 2492 return (EOPNOTSUPP); 2493 if (!(sc->flags & FULL_INIT_DONE)) 2494 return (EIO); /* need MC5 */ 2495 return -t3_read_mc5_range(&sc->mc5, t->addr, 1, t->buf); 2496 break; 2497 } 2498 case CHELSIO_SET_TRACE_FILTER: { 2499 struct ch_trace *t = (struct ch_trace *)data; 2500 const struct trace_params *tp; 2501 2502 tp = (const struct trace_params *)&t->sip; 2503 if (t->config_tx) 2504 t3_config_trace_filter(sc, tp, 0, t->invert_match, 2505 t->trace_tx); 2506 if (t->config_rx) 2507 t3_config_trace_filter(sc, tp, 1, t->invert_match, 2508 t->trace_rx); 2509 break; 2510 } 2511 case CHELSIO_SET_PKTSCHED: { 2512 struct ch_pktsched_params *p = (struct ch_pktsched_params *)data; 2513 if (sc->open_device_map == 0) 2514 return (EAGAIN); 2515 send_pktsched_cmd(sc, p->sched, p->idx, p->min, p->max, 2516 p->binding); 2517 break; 2518 } 2519 case CHELSIO_IFCONF_GETREGS: { 2520 struct ifconf_regs *regs = (struct ifconf_regs *)data; 2521 int reglen = cxgb_get_regs_len(); 2522 uint8_t *buf = malloc(REGDUMP_SIZE, M_DEVBUF, M_NOWAIT); 2523 if (buf == NULL) { 2524 return (ENOMEM); 2525 } if (regs->len > reglen) 2526 regs->len = reglen; 2527 else if (regs->len < reglen) { 2528 error = E2BIG; 2529 goto done; 2530 } 2531 cxgb_get_regs(sc, regs, buf); 2532 error = copyout(buf, regs->data, reglen); 2533 2534 done: 2535 free(buf, M_DEVBUF); 2536 2537 break; 2538 } 2539 case CHELSIO_SET_HW_SCHED: { 2540 struct ch_hw_sched *t = (struct ch_hw_sched *)data; 2541 unsigned int ticks_per_usec = core_ticks_per_usec(sc); 2542 2543 if ((sc->flags & FULL_INIT_DONE) == 0) 2544 return (EAGAIN); /* need TP to be initialized */ 2545 if (t->sched >= NTX_SCHED || !in_range(t->mode, 0, 1) || 2546 !in_range(t->channel, 0, 1) || 2547 !in_range(t->kbps, 0, 10000000) || 2548 !in_range(t->class_ipg, 0, 10000 * 65535 / ticks_per_usec) || 2549 !in_range(t->flow_ipg, 0, 2550 dack_ticks_to_usec(sc, 0x7ff))) 2551 return (EINVAL); 2552 2553 if (t->kbps >= 0) { 2554 error = t3_config_sched(sc, t->kbps, t->sched); 2555 if (error < 0) 2556 return (-error); 2557 } 2558 if (t->class_ipg >= 0) 2559 t3_set_sched_ipg(sc, t->sched, t->class_ipg); 2560 if (t->flow_ipg >= 0) { 2561 t->flow_ipg *= 1000; /* us -> ns */ 2562 t3_set_pace_tbl(sc, &t->flow_ipg, t->sched, 1); 2563 } 2564 if (t->mode >= 0) { 2565 int bit = 1 << (S_TX_MOD_TIMER_MODE + t->sched); 2566 2567 t3_set_reg_field(sc, A_TP_TX_MOD_QUEUE_REQ_MAP, 2568 bit, t->mode ? bit : 0); 2569 } 2570 if (t->channel >= 0) 2571 t3_set_reg_field(sc, A_TP_TX_MOD_QUEUE_REQ_MAP, 2572 1 << t->sched, t->channel << t->sched); 2573 break; 2574 } 2575 default: 2576 return (EOPNOTSUPP); 2577 break; 2578 } 2579 2580 return (error); 2581 } 2582 2583 static __inline void 2584 reg_block_dump(struct adapter *ap, uint8_t *buf, unsigned int start, 2585 unsigned int end) 2586 { 2587 uint32_t *p = (uint32_t *)buf + start; 2588 2589 for ( ; start <= end; start += sizeof(uint32_t)) 2590 *p++ = t3_read_reg(ap, start); 2591 } 2592 2593 #define T3_REGMAP_SIZE (3 * 1024) 2594 static int 2595 cxgb_get_regs_len(void) 2596 { 2597 return T3_REGMAP_SIZE; 2598 } 2599 #undef T3_REGMAP_SIZE 2600 2601 static void 2602 cxgb_get_regs(adapter_t *sc, struct ifconf_regs *regs, uint8_t *buf) 2603 { 2604 2605 /* 2606 * Version scheme: 2607 * bits 0..9: chip version 2608 * bits 10..15: chip revision 2609 * bit 31: set for PCIe cards 2610 */ 2611 regs->version = 3 | (sc->params.rev << 10) | (is_pcie(sc) << 31); 2612 2613 /* 2614 * We skip the MAC statistics registers because they are clear-on-read. 2615 * Also reading multi-register stats would need to synchronize with the 2616 * periodic mac stats accumulation. Hard to justify the complexity. 2617 */ 2618 memset(buf, 0, REGDUMP_SIZE); 2619 reg_block_dump(sc, buf, 0, A_SG_RSPQ_CREDIT_RETURN); 2620 reg_block_dump(sc, buf, A_SG_HI_DRB_HI_THRSH, A_ULPRX_PBL_ULIMIT); 2621 reg_block_dump(sc, buf, A_ULPTX_CONFIG, A_MPS_INT_CAUSE); 2622 reg_block_dump(sc, buf, A_CPL_SWITCH_CNTRL, A_CPL_MAP_TBL_DATA); 2623 reg_block_dump(sc, buf, A_SMB_GLOBAL_TIME_CFG, A_XGM_SERDES_STAT3); 2624 reg_block_dump(sc, buf, A_XGM_SERDES_STATUS0, 2625 XGM_REG(A_XGM_SERDES_STAT3, 1)); 2626 reg_block_dump(sc, buf, XGM_REG(A_XGM_SERDES_STATUS0, 1), 2627 XGM_REG(A_XGM_RX_SPI4_SOP_EOP_CNT, 1)); 2628 } 2629