cxgb_main.c (171469) | cxgb_main.c (171471) |
---|---|
1/************************************************************************** 2 3Copyright (c) 2007, Chelsio Inc. 4All rights reserved. 5 6Redistribution and use in source and binary forms, with or without 7modification, are permitted provided that the following conditions are met: 8 --- 14 unchanged lines hidden (view full) --- 23INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 24CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 25ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 26POSSIBILITY OF SUCH DAMAGE. 27 28***************************************************************************/ 29 30#include <sys/cdefs.h> | 1/************************************************************************** 2 3Copyright (c) 2007, Chelsio Inc. 4All rights reserved. 5 6Redistribution and use in source and binary forms, with or without 7modification, are permitted provided that the following conditions are met: 8 --- 14 unchanged lines hidden (view full) --- 23INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 24CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 25ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 26POSSIBILITY OF SUCH DAMAGE. 27 28***************************************************************************/ 29 30#include <sys/cdefs.h> |
31__FBSDID("$FreeBSD: head/sys/dev/cxgb/cxgb_main.c 171469 2007-07-17 06:12:22Z kmacy $"); | 31__FBSDID("$FreeBSD: head/sys/dev/cxgb/cxgb_main.c 171471 2007-07-17 06:50:35Z kmacy $"); |
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> --- 180 unchanged lines hidden (view full) --- 220 MAX_RX_BUFFERS = 16384, 221 MAX_RX_JUMBO_BUFFERS = 16384, 222 MIN_TXQ_ENTRIES = 4, 223 MIN_CTRL_TXQ_ENTRIES = 4, 224 MIN_RSPQ_ENTRIES = 32, 225 MIN_FL_ENTRIES = 32 226}; 227 | 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> --- 180 unchanged lines hidden (view full) --- 220 MAX_RX_BUFFERS = 16384, 221 MAX_RX_JUMBO_BUFFERS = 16384, 222 MIN_TXQ_ENTRIES = 4, 223 MIN_CTRL_TXQ_ENTRIES = 4, 224 MIN_RSPQ_ENTRIES = 32, 225 MIN_FL_ENTRIES = 32 226}; 227 |
228struct filter_info { 229 u32 sip; 230 u32 sip_mask; 231 u32 dip; 232 u16 sport; 233 u16 dport; 234 u32 vlan:12; 235 u32 vlan_prio:3; 236 u32 mac_hit:1; 237 u32 mac_idx:4; 238 u32 mac_vld:1; 239 u32 pkt_type:2; 240 u32 report_filter_id:1; 241 u32 pass:1; 242 u32 rss:1; 243 u32 qset:3; 244 u32 locked:1; 245 u32 valid:1; 246}; 247 248enum { FILTER_NO_VLAN_PRI = 7 }; 249 |
|
228#define PORT_MASK ((1 << MAX_NPORTS) - 1) 229 230/* Table for probing the cards. The desc field isn't actually used */ 231struct cxgb_ident { 232 uint16_t vendor; 233 uint16_t device; 234 int index; 235 char *desc; --- 7 unchanged lines hidden (view full) --- 243 {PCI_VENDOR_ID_CHELSIO, 0x0026, 2, "T310X"}, 244 {PCI_VENDOR_ID_CHELSIO, 0x0030, 2, "T3B10"}, 245 {PCI_VENDOR_ID_CHELSIO, 0x0031, 3, "T3B20"}, 246 {PCI_VENDOR_ID_CHELSIO, 0x0032, 1, "T3B02"}, 247 {PCI_VENDOR_ID_CHELSIO, 0x0033, 4, "T3B04"}, 248 {0, 0, 0, NULL} 249}; 250 | 250#define PORT_MASK ((1 << MAX_NPORTS) - 1) 251 252/* Table for probing the cards. The desc field isn't actually used */ 253struct cxgb_ident { 254 uint16_t vendor; 255 uint16_t device; 256 int index; 257 char *desc; --- 7 unchanged lines hidden (view full) --- 265 {PCI_VENDOR_ID_CHELSIO, 0x0026, 2, "T310X"}, 266 {PCI_VENDOR_ID_CHELSIO, 0x0030, 2, "T3B10"}, 267 {PCI_VENDOR_ID_CHELSIO, 0x0031, 3, "T3B20"}, 268 {PCI_VENDOR_ID_CHELSIO, 0x0032, 1, "T3B02"}, 269 {PCI_VENDOR_ID_CHELSIO, 0x0033, 4, "T3B04"}, 270 {0, 0, 0, NULL} 271}; 272 |
273 274static int set_eeprom(struct port_info *pi, const uint8_t *data, int len, int offset); 275 276static inline char 277t3rev2char(struct adapter *adapter) 278{ 279 char rev = 'z'; 280 281 switch(adapter->params.rev) { 282 case T3_REV_A: 283 rev = 'a'; 284 break; 285 case T3_REV_B: 286 case T3_REV_B2: 287 rev = 'b'; 288 break; 289 case T3_REV_C: 290 rev = 'c'; 291 break; 292 } 293 return rev; 294} 295 |
|
251static struct cxgb_ident * 252cxgb_get_ident(device_t dev) 253{ 254 struct cxgb_ident *id; 255 256 for (id = cxgb_identifiers; id->desc != NULL; id++) { 257 if ((id->vendor == pci_get_vendor(dev)) && 258 (id->device == pci_get_device(dev))) { --- 35 unchanged lines hidden (view full) --- 294 else 295 ports = "ports"; 296 297 snprintf(buf, sizeof(buf), "%s RNIC, %d %s", ai->desc, nports, ports); 298 device_set_desc_copy(dev, buf); 299 return (BUS_PROBE_DEFAULT); 300} 301 | 296static struct cxgb_ident * 297cxgb_get_ident(device_t dev) 298{ 299 struct cxgb_ident *id; 300 301 for (id = cxgb_identifiers; id->desc != NULL; id++) { 302 if ((id->vendor == pci_get_vendor(dev)) && 303 (id->device == pci_get_device(dev))) { --- 35 unchanged lines hidden (view full) --- 339 else 340 ports = "ports"; 341 342 snprintf(buf, sizeof(buf), "%s RNIC, %d %s", ai->desc, nports, ports); 343 device_set_desc_copy(dev, buf); 344 return (BUS_PROBE_DEFAULT); 345} 346 |
347#define FW_FNAME "t3fw%d%d%d" 348#define TPEEPROM_NAME "t3%ctpe%d%d%d" 349#define TPSRAM_NAME "t3%cps%d%d%d" 350 |
|
302static int 303upgrade_fw(adapter_t *sc) 304{ 305 char buf[32]; 306#ifdef FIRMWARE_LATEST 307 const struct firmware *fw; 308#else 309 struct firmware *fw; 310#endif 311 int status; 312 | 351static int 352upgrade_fw(adapter_t *sc) 353{ 354 char buf[32]; 355#ifdef FIRMWARE_LATEST 356 const struct firmware *fw; 357#else 358 struct firmware *fw; 359#endif 360 int status; 361 |
313 snprintf(&buf[0], sizeof(buf), "t3fw%d%d%d", FW_VERSION_MAJOR, | 362 snprintf(&buf[0], sizeof(buf), FW_FNAME, FW_VERSION_MAJOR, |
314 FW_VERSION_MINOR, FW_VERSION_MICRO); 315 316 fw = firmware_get(buf); 317 318 if (fw == NULL) { 319 device_printf(sc->dev, "Could not find firmware image %s\n", buf); 320 return (ENOENT); | 363 FW_VERSION_MINOR, FW_VERSION_MICRO); 364 365 fw = firmware_get(buf); 366 367 if (fw == NULL) { 368 device_printf(sc->dev, "Could not find firmware image %s\n", buf); 369 return (ENOENT); |
321 } | 370 } else 371 device_printf(sc->dev, "updating firmware on card with %s\n", buf); |
322 status = t3_load_fw(sc, (const uint8_t *)fw->data, fw->datasize); 323 | 372 status = t3_load_fw(sc, (const uint8_t *)fw->data, fw->datasize); 373 |
374 device_printf(sc->dev, "firmware update returned %s %d\n", (status == 0) ? "success" : "fail", status); 375 |
|
324 firmware_put(fw, FIRMWARE_UNLOAD); 325 326 return (status); 327} 328 329static int 330cxgb_controller_attach(device_t dev) 331{ --- 13 unchanged lines hidden (view full) --- 345 uint16_t lnk, pectl; 346 lnk = pci_read_config(dev, reg + 0x12, 2); 347 sc->link_width = (lnk >> 4) & 0x3f; 348 349 pectl = pci_read_config(dev, reg + 0x8, 2); 350 pectl = (pectl & ~0x7000) | (5 << 12); 351 pci_write_config(dev, reg + 0x8, pectl, 2); 352 } | 376 firmware_put(fw, FIRMWARE_UNLOAD); 377 378 return (status); 379} 380 381static int 382cxgb_controller_attach(device_t dev) 383{ --- 13 unchanged lines hidden (view full) --- 397 uint16_t lnk, pectl; 398 lnk = pci_read_config(dev, reg + 0x12, 2); 399 sc->link_width = (lnk >> 4) & 0x3f; 400 401 pectl = pci_read_config(dev, reg + 0x8, 2); 402 pectl = (pectl & ~0x7000) | (5 << 12); 403 pci_write_config(dev, reg + 0x8, pectl, 2); 404 } |
353 if (sc->link_width != 0 && sc->link_width <= 4) { | 405 406 ai = cxgb_get_adapter_info(dev); 407 if (sc->link_width != 0 && sc->link_width <= 4 && 408 (ai->nports0 + ai->nports1) <= 2) { |
354 device_printf(sc->dev, 355 "PCIe x%d Link, expect reduced performance\n", 356 sc->link_width); 357 } 358 359 pci_enable_busmaster(dev); 360 /* 361 * Allocate the registers and make them available to the driver. --- 20 unchanged lines hidden (view full) --- 382 MTX_INIT(&sc->sge.reg_lock, sc->reglockbuf, NULL, MTX_DEF); 383 MTX_INIT(&sc->mdio_lock, sc->mdiolockbuf, NULL, MTX_DEF); 384 MTX_INIT(&sc->elmer_lock, sc->elmerlockbuf, NULL, MTX_DEF); 385 386 sc->bt = rman_get_bustag(sc->regs_res); 387 sc->bh = rman_get_bushandle(sc->regs_res); 388 sc->mmio_len = rman_get_size(sc->regs_res); 389 | 409 device_printf(sc->dev, 410 "PCIe x%d Link, expect reduced performance\n", 411 sc->link_width); 412 } 413 414 pci_enable_busmaster(dev); 415 /* 416 * Allocate the registers and make them available to the driver. --- 20 unchanged lines hidden (view full) --- 437 MTX_INIT(&sc->sge.reg_lock, sc->reglockbuf, NULL, MTX_DEF); 438 MTX_INIT(&sc->mdio_lock, sc->mdiolockbuf, NULL, MTX_DEF); 439 MTX_INIT(&sc->elmer_lock, sc->elmerlockbuf, NULL, MTX_DEF); 440 441 sc->bt = rman_get_bustag(sc->regs_res); 442 sc->bh = rman_get_bushandle(sc->regs_res); 443 sc->mmio_len = rman_get_size(sc->regs_res); 444 |
390 ai = cxgb_get_adapter_info(dev); | |
391 if (t3_prep_adapter(sc, ai, 1) < 0) { 392 printf("prep adapter failed\n"); 393 error = ENODEV; 394 goto out; 395 } 396 /* Allocate the BAR for doing MSI-X. If it succeeds, try to allocate 397 * enough messages for the queue sets. If that fails, try falling 398 * back to MSI. If that fails, then try falling back to the legacy --- 71 unchanged lines hidden (view full) --- 470 * Warn user that a firmware update will be attempted in init. 471 */ 472 device_printf(dev, "firmware needs to be updated to version %d.%d.%d\n", 473 FW_VERSION_MAJOR, FW_VERSION_MINOR, FW_VERSION_MICRO); 474 sc->flags &= ~FW_UPTODATE; 475 } else { 476 sc->flags |= FW_UPTODATE; 477 } | 445 if (t3_prep_adapter(sc, ai, 1) < 0) { 446 printf("prep adapter failed\n"); 447 error = ENODEV; 448 goto out; 449 } 450 /* Allocate the BAR for doing MSI-X. If it succeeds, try to allocate 451 * enough messages for the queue sets. If that fails, try falling 452 * back to MSI. If that fails, then try falling back to the legacy --- 71 unchanged lines hidden (view full) --- 524 * Warn user that a firmware update will be attempted in init. 525 */ 526 device_printf(dev, "firmware needs to be updated to version %d.%d.%d\n", 527 FW_VERSION_MAJOR, FW_VERSION_MINOR, FW_VERSION_MICRO); 528 sc->flags &= ~FW_UPTODATE; 529 } else { 530 sc->flags |= FW_UPTODATE; 531 } |
532 533 if (t3_check_tpsram_version(sc) != 0) { 534 /* 535 * Warn user that a firmware update will be attempted in init. 536 */ 537 device_printf(dev, "SRAM needs to be updated to version %c-%d.%d.%d\n", 538 t3rev2char(sc), TP_VERSION_MAJOR, TP_VERSION_MINOR, TP_VERSION_MICRO); 539 sc->flags &= ~TPS_UPTODATE; 540 } else { 541 sc->flags |= TPS_UPTODATE; 542 } |
|
478 479 if ((sc->flags & USING_MSIX) && !singleq) 480 port_qsets = min((SGE_QSETS/(sc)->params.nports), mp_ncpus); 481 482 /* 483 * Create a child device for each MAC. The ethernet attachment 484 * will be done in these children. 485 */ 486 for (i = 0; i < (sc)->params.nports; i++) { 487 if ((child = device_add_child(dev, "cxgb", -1)) == NULL) { 488 device_printf(dev, "failed to add child port\n"); 489 error = EINVAL; 490 goto out; 491 } | 543 544 if ((sc->flags & USING_MSIX) && !singleq) 545 port_qsets = min((SGE_QSETS/(sc)->params.nports), mp_ncpus); 546 547 /* 548 * Create a child device for each MAC. The ethernet attachment 549 * will be done in these children. 550 */ 551 for (i = 0; i < (sc)->params.nports; i++) { 552 if ((child = device_add_child(dev, "cxgb", -1)) == NULL) { 553 device_printf(dev, "failed to add child port\n"); 554 error = EINVAL; 555 goto out; 556 } |
492 sc->portdev[i] = child; | |
493 sc->port[i].adapter = sc; 494 sc->port[i].nqsets = port_qsets; 495 sc->port[i].first_qset = i*port_qsets; 496 sc->port[i].port = i; | 557 sc->port[i].adapter = sc; 558 sc->port[i].nqsets = port_qsets; 559 sc->port[i].first_qset = i*port_qsets; 560 sc->port[i].port = i; |
561 sc->portdev[i] = child; |
|
497 device_set_softc(child, &sc->port[i]); 498 } 499 if ((error = bus_generic_attach(dev)) != 0) 500 goto out; 501 502 /* 503 * XXX need to poll for link status 504 */ --- 80 unchanged lines hidden (view full) --- 585#ifdef notyet 586 if (is_offload(sc)) { 587 cxgb_adapter_unofld(sc); 588 if (isset(&sc->open_device_map, OFFLOAD_DEVMAP_BIT)) 589 offload_close(&sc->tdev); 590 } 591#endif 592 t3_free_sge_resources(sc); | 562 device_set_softc(child, &sc->port[i]); 563 } 564 if ((error = bus_generic_attach(dev)) != 0) 565 goto out; 566 567 /* 568 * XXX need to poll for link status 569 */ --- 80 unchanged lines hidden (view full) --- 650#ifdef notyet 651 if (is_offload(sc)) { 652 cxgb_adapter_unofld(sc); 653 if (isset(&sc->open_device_map, OFFLOAD_DEVMAP_BIT)) 654 offload_close(&sc->tdev); 655 } 656#endif 657 t3_free_sge_resources(sc); |
658 free(sc->filters, M_DEVBUF); |
|
593 t3_sge_free(sc); 594 595 cxgb_offload_exit(); 596 597 if (sc->regs_res != NULL) 598 bus_release_resource(sc->dev, SYS_RES_MEMORY, sc->regs_rid, 599 sc->regs_res); 600 601 MTX_DESTROY(&sc->mdio_lock); 602 MTX_DESTROY(&sc->sge.reg_lock); 603 MTX_DESTROY(&sc->elmer_lock); 604 ADAPTER_LOCK_DEINIT(sc); 605 606 return; 607} 608 | 659 t3_sge_free(sc); 660 661 cxgb_offload_exit(); 662 663 if (sc->regs_res != NULL) 664 bus_release_resource(sc->dev, SYS_RES_MEMORY, sc->regs_rid, 665 sc->regs_res); 666 667 MTX_DESTROY(&sc->mdio_lock); 668 MTX_DESTROY(&sc->sge.reg_lock); 669 MTX_DESTROY(&sc->elmer_lock); 670 ADAPTER_LOCK_DEINIT(sc); 671 672 return; 673} 674 |
675 676 677static int 678alloc_filters(struct adapter *adap) 679{ 680 struct filter_info *p; 681 int nfilters; 682 683 if ((nfilters = adap->params.mc5.nfilters) == 0) 684 return (0); 685 686 adap->filters = malloc(nfilters*sizeof(struct filter_info), 687 M_DEVBUF, M_ZERO|M_WAITOK); 688 689 if (adap->filters == NULL) 690 return (ENOMEM); 691 692 /* Set the default filters, only need to set non-0 fields here. */ 693 p = &adap->filters[nfilters - 1]; 694 p->vlan = 0xfff; 695 p->vlan_prio = FILTER_NO_VLAN_PRI; 696 p->pass = p->rss = p->valid = p->locked = 1; 697 698 return (0); 699} 700 701static inline void 702set_tcb_field_ulp(struct cpl_set_tcb_field *req, 703 unsigned int tid, unsigned int word, 704 uint64_t mask, uint64_t val) 705{ 706 struct ulp_txpkt *txpkt = (struct ulp_txpkt *)req; 707 708 txpkt->cmd_dest = htonl(V_ULPTX_CMD(ULP_TXPKT)); 709 txpkt->len = htonl(V_ULPTX_NFLITS(sizeof(*req) / 8)); 710 OPCODE_TID(req) = htonl(MK_OPCODE_TID(CPL_SET_TCB_FIELD, tid)); 711 req->reply = V_NO_REPLY(1); 712 req->cpu_idx = 0; 713 req->word = htons(word); 714 req->mask = htobe64(mask); 715 req->val = htobe64(val); 716} 717 718static int 719set_filter(struct adapter *adap, int id, const struct filter_info *f) 720{ 721 int len; 722 struct mbuf *m; 723 struct ulp_txpkt *txpkt; 724 struct work_request_hdr *wr; 725 struct cpl_pass_open_req *oreq; 726 struct cpl_set_tcb_field *sreq; 727 728 len = sizeof(*wr) + sizeof(*oreq) + 2 * sizeof(*sreq); 729 id += t3_mc5_size(&adap->mc5) - adap->params.mc5.nroutes - 730 adap->params.mc5.nfilters; 731 732 m = m_gethdr(M_TRYWAIT, MT_DATA); 733 wr = mtod(m, struct work_request_hdr *); 734 wr->wr_hi = htonl(V_WR_OP(FW_WROPCODE_BYPASS) | F_WR_ATOMIC); 735 m->m_len = m->m_pkthdr.len = len; 736 737 oreq = (struct cpl_pass_open_req *)(wr + 1); 738 txpkt = (struct ulp_txpkt *)oreq; 739 txpkt->cmd_dest = htonl(V_ULPTX_CMD(ULP_TXPKT)); 740 txpkt->len = htonl(V_ULPTX_NFLITS(sizeof(*oreq) / 8)); 741 OPCODE_TID(oreq) = htonl(MK_OPCODE_TID(CPL_PASS_OPEN_REQ, id)); 742 oreq->local_port = htons(f->dport); 743 oreq->peer_port = htons(f->sport); 744 oreq->local_ip = htonl(f->dip); 745 oreq->peer_ip = htonl(f->sip); 746 oreq->peer_netmask = htonl(f->sip_mask); 747 oreq->opt0h = 0; 748 oreq->opt0l = htonl(F_NO_OFFLOAD); 749 oreq->opt1 = htonl(V_MAC_MATCH_VALID(f->mac_vld) | 750 V_CONN_POLICY(CPL_CONN_POLICY_FILTER) | 751 V_VLAN_PRI(f->vlan_prio >> 1) | 752 V_VLAN_PRI_VALID(f->vlan_prio != FILTER_NO_VLAN_PRI) | 753 V_PKT_TYPE(f->pkt_type) | V_OPT1_VLAN(f->vlan) | 754 V_MAC_MATCH(f->mac_idx | (f->mac_hit << 4))); 755 756 sreq = (struct cpl_set_tcb_field *)(oreq + 1); 757 set_tcb_field_ulp(sreq, id, 1, 0x1800808000ULL, 758 (f->report_filter_id << 15) | (1 << 23) | 759 ((u64)f->pass << 35) | ((u64)!f->rss << 36)); 760 set_tcb_field_ulp(sreq + 1, id, 25, 0x3f80000, 761 (u64)adap->rrss_map[f->qset] << 19); 762 t3_mgmt_tx(adap, m); 763 return 0; 764} 765 766static int 767setup_hw_filters(struct adapter *adap) 768{ 769 int i, err; 770 771 if (adap->filters == NULL) 772 return 0; 773 774 t3_enable_filters(adap); 775 776 for (i = err = 0; i < adap->params.mc5.nfilters && !err; i++) 777 if (adap->filters[i].locked) 778 err = set_filter(adap, i, &adap->filters[i]); 779 return err; 780} 781 |
|
609/** 610 * setup_sge_qsets - configure SGE Tx/Rx/response queues 611 * @sc: the controller softc 612 * 613 * Determines how many sets of SGE queues to use and initializes them. 614 * We support multiple queue sets per port if we have MSI-X, otherwise 615 * just one queue set per port. 616 */ --- 185 unchanged lines hidden (view full) --- 802 ifp->if_snd.ifq_drv_maxlen = TX_ETH_Q_SIZE; 803 IFQ_SET_MAXLEN(&ifp->if_snd, ifp->if_snd.ifq_drv_maxlen); 804 IFQ_SET_READY(&ifp->if_snd); 805 806 ifp->if_hwassist = ifp->if_capabilities = ifp->if_capenable = 0; 807 ifp->if_capabilities |= CXGB_CAP; 808 ifp->if_capenable |= CXGB_CAP_ENABLE; 809 ifp->if_hwassist |= (CSUM_TCP | CSUM_UDP | CSUM_IP | CSUM_TSO); | 782/** 783 * setup_sge_qsets - configure SGE Tx/Rx/response queues 784 * @sc: the controller softc 785 * 786 * Determines how many sets of SGE queues to use and initializes them. 787 * We support multiple queue sets per port if we have MSI-X, otherwise 788 * just one queue set per port. 789 */ --- 185 unchanged lines hidden (view full) --- 975 ifp->if_snd.ifq_drv_maxlen = TX_ETH_Q_SIZE; 976 IFQ_SET_MAXLEN(&ifp->if_snd, ifp->if_snd.ifq_drv_maxlen); 977 IFQ_SET_READY(&ifp->if_snd); 978 979 ifp->if_hwassist = ifp->if_capabilities = ifp->if_capenable = 0; 980 ifp->if_capabilities |= CXGB_CAP; 981 ifp->if_capenable |= CXGB_CAP_ENABLE; 982 ifp->if_hwassist |= (CSUM_TCP | CSUM_UDP | CSUM_IP | CSUM_TSO); |
810 | 983 /* 984 * disable TSO on 4-port - it isn't supported by the firmware yet 985 */ 986 if (p->adapter->params.nports > 2) { 987 ifp->if_capabilities &= ~(IFCAP_TSO4 | IFCAP_TSO6); 988 ifp->if_capenable &= ~(IFCAP_TSO4 | IFCAP_TSO6); 989 ifp->if_hwassist &= ~CSUM_TSO; 990 } 991 |
811 ether_ifattach(ifp, p->hw_addr); | 992 ether_ifattach(ifp, p->hw_addr); |
812#ifdef DEFAULT_JUMBO 813 ifp->if_mtu = 9000; 814#endif | 993 /* 994 * Only default to jumbo frames on 10GigE 995 */ 996 if (p->adapter->params.nports <= 2) 997 ifp->if_mtu = 9000; |
815 if ((err = cxgb_makedev(p)) != 0) { 816 printf("makedev failed %d\n", err); 817 return (err); 818 } 819 ifmedia_init(&p->media, IFM_IMASK, cxgb_media_change, 820 cxgb_media_status); 821 822 if (!strcmp(p->port_type->desc, "10GBASE-CX4")) { --- 261 unchanged lines hidden (view full) --- 1084 * down to the response queues actually configured for each port. 1085 * We always configure the RSS mapping for two ports since the mapping 1086 * table has plenty of entries. 1087 */ 1088static void 1089setup_rss(adapter_t *adap) 1090{ 1091 int i; | 998 if ((err = cxgb_makedev(p)) != 0) { 999 printf("makedev failed %d\n", err); 1000 return (err); 1001 } 1002 ifmedia_init(&p->media, IFM_IMASK, cxgb_media_change, 1003 cxgb_media_status); 1004 1005 if (!strcmp(p->port_type->desc, "10GBASE-CX4")) { --- 261 unchanged lines hidden (view full) --- 1267 * down to the response queues actually configured for each port. 1268 * We always configure the RSS mapping for two ports since the mapping 1269 * table has plenty of entries. 1270 */ 1271static void 1272setup_rss(adapter_t *adap) 1273{ 1274 int i; |
1092 u_int nq0 = adap->port[0].nqsets; 1093 u_int nq1 = max((u_int)adap->port[1].nqsets, 1U); | 1275 u_int nq[2]; |
1094 uint8_t cpus[SGE_QSETS + 1]; 1095 uint16_t rspq_map[RSS_TABLE_SIZE]; | 1276 uint8_t cpus[SGE_QSETS + 1]; 1277 uint16_t rspq_map[RSS_TABLE_SIZE]; |
1096 | 1278 1279 nq[0] = adap->port[0].nqsets; 1280 nq[1] = max((u_int)adap->port[1].nqsets, 1U); 1281 |
1097 for (i = 0; i < SGE_QSETS; ++i) 1098 cpus[i] = i; 1099 cpus[SGE_QSETS] = 0xff; 1100 1101 for (i = 0; i < RSS_TABLE_SIZE / 2; ++i) { | 1282 for (i = 0; i < SGE_QSETS; ++i) 1283 cpus[i] = i; 1284 cpus[SGE_QSETS] = 0xff; 1285 1286 for (i = 0; i < RSS_TABLE_SIZE / 2; ++i) { |
1102 rspq_map[i] = i % nq0; 1103 rspq_map[i + RSS_TABLE_SIZE / 2] = (i % nq1) + nq0; | 1287 rspq_map[i] = nq[0] ? i % nq[0] : 0; 1288 rspq_map[i + RSS_TABLE_SIZE / 2] = nq[1] ? i % nq[1] + nq[0] : 0; |
1104 } | 1289 } |
1290 /* Calculate the reverse RSS map table */ 1291 for (i = 0; i < RSS_TABLE_SIZE; ++i) 1292 if (adap->rrss_map[rspq_map[i]] == 0xff) 1293 adap->rrss_map[rspq_map[i]] = i; |
|
1105 1106 t3_config_rss(adap, F_RQFEEDBACKENABLE | F_TNLLKPEN | F_TNLMAPEN | | 1294 1295 t3_config_rss(adap, F_RQFEEDBACKENABLE | F_TNLLKPEN | F_TNLMAPEN | |
1107 F_TNLPRTEN | F_TNL2TUPEN | F_TNL4TUPEN | 1108 V_RRCPLCPUSIZE(6), cpus, rspq_map); | 1296 F_TNLPRTEN | F_TNL2TUPEN | F_TNL4TUPEN | F_OFDMAPEN | 1297 F_RRCPLMAPEN | V_RRCPLCPUSIZE(6), cpus, rspq_map); 1298 |
1109} 1110 1111/* 1112 * Sends an mbuf to an offload queue driver 1113 * after dealing with any active network taps. 1114 */ 1115static inline int 1116offload_tx(struct toedev *tdev, struct mbuf *m) --- 53 unchanged lines hidden (view full) --- 1170 1171static void 1172send_pktsched_cmd(struct adapter *adap, int sched, int qidx, int lo, 1173 int hi, int port) 1174{ 1175 struct mbuf *m; 1176 struct mngt_pktsched_wr *req; 1177 | 1299} 1300 1301/* 1302 * Sends an mbuf to an offload queue driver 1303 * after dealing with any active network taps. 1304 */ 1305static inline int 1306offload_tx(struct toedev *tdev, struct mbuf *m) --- 53 unchanged lines hidden (view full) --- 1360 1361static void 1362send_pktsched_cmd(struct adapter *adap, int sched, int qidx, int lo, 1363 int hi, int port) 1364{ 1365 struct mbuf *m; 1366 struct mngt_pktsched_wr *req; 1367 |
1178 m = m_gethdr(M_NOWAIT, MT_DATA); | 1368 m = m_gethdr(M_DONTWAIT, MT_DATA); |
1179 if (m) { 1180 req = mtod(m, struct mngt_pktsched_wr *); 1181 req->wr_hi = htonl(V_WR_OP(FW_WROPCODE_MNGT)); 1182 req->mngt_opcode = FW_MNGTOPCODE_PKTSCHED_SET; 1183 req->sched = sched; 1184 req->idx = qidx; 1185 req->min = lo; 1186 req->max = hi; --- 12 unchanged lines hidden (view full) --- 1199 const struct port_info *pi = adap2pinfo(sc, i); 1200 1201 for (j = 0; j < pi->nqsets; ++j) 1202 send_pktsched_cmd(sc, 1, pi->first_qset + j, -1, 1203 -1, i); 1204 } 1205} 1206 | 1369 if (m) { 1370 req = mtod(m, struct mngt_pktsched_wr *); 1371 req->wr_hi = htonl(V_WR_OP(FW_WROPCODE_MNGT)); 1372 req->mngt_opcode = FW_MNGTOPCODE_PKTSCHED_SET; 1373 req->sched = sched; 1374 req->idx = qidx; 1375 req->min = lo; 1376 req->max = hi; --- 12 unchanged lines hidden (view full) --- 1389 const struct port_info *pi = adap2pinfo(sc, i); 1390 1391 for (j = 0; j < pi->nqsets; ++j) 1392 send_pktsched_cmd(sc, 1, pi->first_qset + j, -1, 1393 -1, i); 1394 } 1395} 1396 |
1397static void 1398update_tpeeprom(struct adapter *adap) 1399{ 1400 const struct firmware *tpeeprom; 1401 char buf[64]; 1402 uint32_t version; 1403 unsigned int major, minor; 1404 int ret, len; 1405 char rev; 1406 1407 t3_seeprom_read(adap, TP_SRAM_OFFSET, &version); 1408 1409 major = G_TP_VERSION_MAJOR(version); 1410 minor = G_TP_VERSION_MINOR(version); 1411 if (major == TP_VERSION_MAJOR && minor == TP_VERSION_MINOR) 1412 return; 1413 1414 rev = t3rev2char(adap); 1415 1416 snprintf(buf, sizeof(buf), TPEEPROM_NAME, rev, 1417 TP_VERSION_MAJOR, TP_VERSION_MINOR, TP_VERSION_MICRO); 1418 1419 tpeeprom = firmware_get(buf); 1420 if (tpeeprom == NULL) { 1421 device_printf(adap->dev, "could not load TP EEPROM: unable to load %s\n", 1422 buf); 1423 return; 1424 } 1425 1426 len = tpeeprom->datasize - 4; 1427 1428 ret = t3_check_tpsram(adap, tpeeprom->data, tpeeprom->datasize); 1429 if (ret) 1430 goto release_tpeeprom; 1431 1432 if (len != TP_SRAM_LEN) { 1433 device_printf(adap->dev, "%s length is wrong len=%d expected=%d\n", buf, len, TP_SRAM_LEN); 1434 return; 1435 } 1436 1437 ret = set_eeprom(&adap->port[0], tpeeprom->data, tpeeprom->datasize, 1438 TP_SRAM_OFFSET); 1439 1440 if (!ret) { 1441 device_printf(adap->dev, 1442 "Protocol SRAM image updated in EEPROM to %d.%d.%d\n", 1443 TP_VERSION_MAJOR, TP_VERSION_MINOR, TP_VERSION_MICRO); 1444 } else 1445 device_printf(adap->dev, "Protocol SRAM image update in EEPROM failed\n"); 1446 1447release_tpeeprom: 1448 firmware_put(tpeeprom, FIRMWARE_UNLOAD); 1449 1450 return; 1451} 1452 1453static int 1454update_tpsram(struct adapter *adap) 1455{ 1456 const struct firmware *tpsram; 1457 char buf[64]; 1458 int ret; 1459 char rev; 1460 1461 rev = t3rev2char(adap); 1462 if (!rev) 1463 return 0; 1464 1465 update_tpeeprom(adap); 1466 1467 snprintf(buf, sizeof(buf), TPSRAM_NAME, rev, 1468 TP_VERSION_MAJOR, TP_VERSION_MINOR, TP_VERSION_MICRO); 1469 1470 tpsram = firmware_get(buf); 1471 if (tpsram == NULL){ 1472 device_printf(adap->dev, "could not load TP SRAM: unable to load %s\n", 1473 buf); 1474 return (EINVAL); 1475 } else 1476 device_printf(adap->dev, "updating TP SRAM with %s\n", buf); 1477 1478 ret = t3_check_tpsram(adap, tpsram->data, tpsram->datasize); 1479 if (ret) 1480 goto release_tpsram; 1481 1482 ret = t3_set_proto_sram(adap, tpsram->data); 1483 if (ret) 1484 device_printf(adap->dev, "loading protocol SRAM failed\n"); 1485 1486release_tpsram: 1487 firmware_put(tpsram, FIRMWARE_UNLOAD); 1488 1489 return ret; 1490} 1491 |
|
1207/** 1208 * cxgb_up - enable the adapter 1209 * @adap: adapter being enabled 1210 * 1211 * Called when the first port is enabled, this function performs the 1212 * actions necessary to make an adapter operational, such as completing 1213 * the initialization of HW modules, and enabling interrupts. 1214 * 1215 */ 1216static int 1217cxgb_up(struct adapter *sc) 1218{ 1219 int err = 0; 1220 1221 if ((sc->flags & FULL_INIT_DONE) == 0) { 1222 1223 if ((sc->flags & FW_UPTODATE) == 0) | 1492/** 1493 * cxgb_up - enable the adapter 1494 * @adap: adapter being enabled 1495 * 1496 * Called when the first port is enabled, this function performs the 1497 * actions necessary to make an adapter operational, such as completing 1498 * the initialization of HW modules, and enabling interrupts. 1499 * 1500 */ 1501static int 1502cxgb_up(struct adapter *sc) 1503{ 1504 int err = 0; 1505 1506 if ((sc->flags & FULL_INIT_DONE) == 0) { 1507 1508 if ((sc->flags & FW_UPTODATE) == 0) |
1224 err = upgrade_fw(sc); 1225 1226 if (err) 1227 goto out; 1228 | 1509 if ((err = upgrade_fw(sc))) 1510 goto out; 1511 if ((sc->flags & TPS_UPTODATE) == 0) 1512 if ((err = update_tpsram(sc))) 1513 goto out; |
1229 err = t3_init_hw(sc, 0); 1230 if (err) 1231 goto out; 1232 1233 t3_write_reg(sc, A_ULPRX_TDDP_PSZ, V_HPZ0(PAGE_SHIFT - 12)); 1234 1235 err = setup_sge_qsets(sc); 1236 if (err) 1237 goto out; 1238 | 1514 err = t3_init_hw(sc, 0); 1515 if (err) 1516 goto out; 1517 1518 t3_write_reg(sc, A_ULPRX_TDDP_PSZ, V_HPZ0(PAGE_SHIFT - 12)); 1519 1520 err = setup_sge_qsets(sc); 1521 if (err) 1522 goto out; 1523 |
1524 alloc_filters(sc); |
|
1239 setup_rss(sc); 1240 sc->flags |= FULL_INIT_DONE; 1241 } 1242 1243 t3_intr_clear(sc); 1244 1245 /* If it's MSI or INTx, allocate a single interrupt for everything */ 1246 if ((sc->flags & USING_MSIX) == 0) { --- 16 unchanged lines hidden (view full) --- 1263 } 1264 } else { 1265 cxgb_setup_msix(sc, sc->msi_count); 1266 } 1267 1268 t3_sge_start(sc); 1269 t3_intr_enable(sc); 1270 | 1525 setup_rss(sc); 1526 sc->flags |= FULL_INIT_DONE; 1527 } 1528 1529 t3_intr_clear(sc); 1530 1531 /* If it's MSI or INTx, allocate a single interrupt for everything */ 1532 if ((sc->flags & USING_MSIX) == 0) { --- 16 unchanged lines hidden (view full) --- 1549 } 1550 } else { 1551 cxgb_setup_msix(sc, sc->msi_count); 1552 } 1553 1554 t3_sge_start(sc); 1555 t3_intr_enable(sc); 1556 |
1271 if ((sc->flags & (USING_MSIX | QUEUES_BOUND)) == USING_MSIX) | 1557 if ((sc->flags & (USING_MSIX | QUEUES_BOUND)) == USING_MSIX) { |
1272 bind_qsets(sc); | 1558 bind_qsets(sc); |
1273 sc->flags |= QUEUES_BOUND; | 1559 setup_hw_filters(sc); 1560 sc->flags |= QUEUES_BOUND; 1561 } |
1274out: 1275 return (err); 1276irq_err: 1277 CH_ERR(sc, "request_irq failed, err %d\n", err); 1278 goto out; 1279} 1280 1281 --- 47 unchanged lines hidden (view full) --- 1329 (adapter->open_device_map & ~OFFLOAD_DEVMAP_BIT), 1330 (adapter->open_device_map | OFFLOAD_DEVMAP_BIT)) == 0) 1331 return (0); 1332 1333 ADAPTER_LOCK(pi->adapter); 1334 if (!adap_up) 1335 err = cxgb_up(adapter); 1336 ADAPTER_UNLOCK(pi->adapter); | 1562out: 1563 return (err); 1564irq_err: 1565 CH_ERR(sc, "request_irq failed, err %d\n", err); 1566 goto out; 1567} 1568 1569 --- 47 unchanged lines hidden (view full) --- 1617 (adapter->open_device_map & ~OFFLOAD_DEVMAP_BIT), 1618 (adapter->open_device_map | OFFLOAD_DEVMAP_BIT)) == 0) 1619 return (0); 1620 1621 ADAPTER_LOCK(pi->adapter); 1622 if (!adap_up) 1623 err = cxgb_up(adapter); 1624 ADAPTER_UNLOCK(pi->adapter); |
1337 if (err < 0) | 1625 if (err) |
1338 return (err); 1339 1340 t3_tp_set_offload_mode(adapter, 1); 1341 tdev->lldev = adapter->port[0].ifp; 1342 err = cxgb_offload_activate(adapter); 1343 if (err) 1344 goto out; 1345 --- 56 unchanged lines hidden (view full) --- 1402 struct ifnet *ifp; 1403 adapter_t *sc = p->adapter; 1404 int err; 1405 1406 PORT_LOCK_ASSERT_OWNED(p); 1407 ifp = p->ifp; 1408 1409 ADAPTER_LOCK(p->adapter); | 1626 return (err); 1627 1628 t3_tp_set_offload_mode(adapter, 1); 1629 tdev->lldev = adapter->port[0].ifp; 1630 err = cxgb_offload_activate(adapter); 1631 if (err) 1632 goto out; 1633 --- 56 unchanged lines hidden (view full) --- 1690 struct ifnet *ifp; 1691 adapter_t *sc = p->adapter; 1692 int err; 1693 1694 PORT_LOCK_ASSERT_OWNED(p); 1695 ifp = p->ifp; 1696 1697 ADAPTER_LOCK(p->adapter); |
1410 if ((sc->open_device_map == 0) && ((err = cxgb_up(sc)) < 0)) { | 1698 if ((sc->open_device_map == 0) && (err = cxgb_up(sc))) { |
1411 ADAPTER_UNLOCK(p->adapter); 1412 cxgb_stop_locked(p); 1413 return; 1414 } 1415 if (p->adapter->open_device_map == 0) { 1416 t3_intr_clear(sc); 1417 t3_sge_init_adapter(sc); 1418 } --- 442 unchanged lines hidden (view full) --- 1861 check_link_status(sc); 1862 1863 /* 1864 * adapter lock can currently only be acquire after the 1865 * port lock 1866 */ 1867 ADAPTER_UNLOCK(sc); 1868 | 1699 ADAPTER_UNLOCK(p->adapter); 1700 cxgb_stop_locked(p); 1701 return; 1702 } 1703 if (p->adapter->open_device_map == 0) { 1704 t3_intr_clear(sc); 1705 t3_sge_init_adapter(sc); 1706 } --- 442 unchanged lines hidden (view full) --- 2149 check_link_status(sc); 2150 2151 /* 2152 * adapter lock can currently only be acquire after the 2153 * port lock 2154 */ 2155 ADAPTER_UNLOCK(sc); 2156 |
1869 if (p->rev == T3_REV_B2) | 2157 if (p->rev == T3_REV_B2 && p->nports < 4) |
1870 check_t3b2_mac(sc); 1871} 1872 | 2158 check_t3b2_mac(sc); 2159} 2160 |
2161#if 0 2162static void * 2163filter_get_idx(struct seq_file *seq, loff_t pos) 2164{ 2165 int i; 2166 struct adapter *adap = seq->private; 2167 struct filter_info *p = adap->filters; 2168 2169 if (!p) 2170 return NULL; 2171 2172 for (i = 0; i < adap->params.mc5.nfilters; i++, p++) 2173 if (p->valid) { 2174 if (!pos) 2175 return p; 2176 pos--; 2177 } 2178 return NULL; 2179} 2180 2181static void *filter_get_nxt_idx(struct seq_file *seq, struct filter_info *p) 2182{ 2183 struct adapter *adap = seq->private; 2184 struct filter_info *end = &adap->filters[adap->params.mc5.nfilters]; 2185 2186 while (++p < end && !p->valid) 2187 ; 2188 return p < end ? p : NULL; 2189} 2190 2191static void *filter_seq_start(struct seq_file *seq, loff_t *pos) 2192{ 2193 return *pos ? filter_get_idx(seq, *pos - 1) : SEQ_START_TOKEN; 2194} 2195 2196static void *filter_seq_next(struct seq_file *seq, void *v, loff_t *pos) 2197{ 2198 v = *pos ? filter_get_nxt_idx(seq, v) : filter_get_idx(seq, 0); 2199 if (v) 2200 ++*pos; 2201 return v; 2202} 2203 2204static void filter_seq_stop(struct seq_file *seq, void *v) 2205{ 2206} 2207 2208static int filter_seq_show(struct seq_file *seq, void *v) 2209{ 2210 static const char *pkt_type[] = { "any", "tcp", "udp", "frag" }; 2211 2212 if (v == SEQ_START_TOKEN) 2213 seq_puts(seq, "index SIP DIP sport " 2214 "dport VLAN PRI MAC type Q\n"); 2215 else { 2216 char sip[20], dip[20]; 2217 struct filter_info *f = v; 2218 struct adapter *adap = seq->private; 2219 2220 sprintf(sip, NIPQUAD_FMT "/%-2u", HIPQUAD(f->sip), 2221 f->sip_mask ? 33 - ffs(f->sip_mask) : 0); 2222 sprintf(dip, NIPQUAD_FMT, HIPQUAD(f->dip)); 2223 seq_printf(seq, "%5zu %18s %15s ", f - adap->filters, sip, dip); 2224 seq_printf(seq, f->sport ? "%5u " : " * ", f->sport); 2225 seq_printf(seq, f->dport ? "%5u " : " * ", f->dport); 2226 seq_printf(seq, f->vlan != 0xfff ? "%4u " : " * ", f->vlan); 2227 seq_printf(seq, f->vlan_prio == FILTER_NO_VLAN_PRI ? 2228 " * " : "%1u/%1u ", f->vlan_prio, f->vlan_prio | 1); 2229 if (!f->mac_vld) 2230 seq_printf(seq, " * "); 2231 else if (f->mac_hit) 2232 seq_printf(seq, "%3u ", f->mac_idx); 2233 else 2234 seq_printf(seq, " -1 "); 2235 seq_printf(seq, "%4s ", pkt_type[f->pkt_type]); 2236 if (!f->pass) 2237 seq_printf(seq, "-\n"); 2238 else if (f->rss) 2239 seq_printf(seq, "*\n"); 2240 else 2241 seq_printf(seq, "%1u\n", f->qset); 2242 } 2243 return 0; 2244} 2245 2246static struct seq_operations filter_seq_ops = { 2247 .start = filter_seq_start, 2248 .next = filter_seq_next, 2249 .stop = filter_seq_stop, 2250 .show = filter_seq_show 2251}; 2252 2253static int filter_seq_open(struct inode *inode, struct file *file) 2254{ 2255 int rc = seq_open(file, &filter_seq_ops); 2256 2257 if (!rc) { 2258 struct proc_dir_entry *dp = PDE(inode); 2259 struct seq_file *seq = file->private_data; 2260 2261 seq->private = dp->data; 2262 } 2263 return rc; 2264} 2265 2266static struct file_operations filter_seq_fops = { 2267 .owner = THIS_MODULE, 2268 .open = filter_seq_open, 2269 .read = seq_read, 2270 .llseek = seq_lseek, 2271 .release = seq_release 2272}; 2273 2274#endif 2275 |
|
1873static int | 2276static int |
2277set_eeprom(struct port_info *pi, const uint8_t *data, int len, int offset) 2278{ 2279 uint8_t *buf; 2280 int err = 0; 2281 u32 aligned_offset, aligned_len, *p; 2282 struct adapter *adapter = pi->adapter; 2283 2284 2285 aligned_offset = offset & ~3; 2286 aligned_len = (len + (offset & 3) + 3) & ~3; 2287 2288 if (aligned_offset != offset || aligned_len != len) { 2289 buf = malloc(aligned_len, M_DEVBUF, M_WAITOK|M_ZERO); 2290 if (!buf) 2291 return (ENOMEM); 2292 err = t3_seeprom_read(adapter, aligned_offset, (u32 *)buf); 2293 if (!err && aligned_len > 4) 2294 err = t3_seeprom_read(adapter, 2295 aligned_offset + aligned_len - 4, 2296 (u32 *)&buf[aligned_len - 4]); 2297 if (err) 2298 goto out; 2299 memcpy(buf + (offset & 3), data, len); 2300 } else 2301 buf = (uint8_t *)(uintptr_t)data; 2302 2303 err = t3_seeprom_wp(adapter, 0); 2304 if (err) 2305 goto out; 2306 2307 for (p = (u32 *)buf; !err && aligned_len; aligned_len -= 4, p++) { 2308 err = t3_seeprom_write(adapter, aligned_offset, *p); 2309 aligned_offset += 4; 2310 } 2311 2312 if (!err) 2313 err = t3_seeprom_wp(adapter, 1); 2314out: 2315 if (buf != data) 2316 free(buf, M_DEVBUF); 2317 return err; 2318} 2319 2320 2321static int |
|
1874in_range(int val, int lo, int hi) 1875{ 1876 return val < 0 || (val <= hi && val >= lo); 1877} 1878 1879static int 1880cxgb_extension_open(struct cdev *dev, int flags, int fmp, d_thread_t *td) 1881{ --- 36 unchanged lines hidden (view full) --- 1918 1919 if (!phy->mdio_read) 1920 return (EOPNOTSUPP); 1921 if (is_10G(sc)) { 1922 mmd = mid->phy_id >> 8; 1923 if (!mmd) 1924 mmd = MDIO_DEV_PCS; 1925 else if (mmd > MDIO_DEV_XGXS) | 2322in_range(int val, int lo, int hi) 2323{ 2324 return val < 0 || (val <= hi && val >= lo); 2325} 2326 2327static int 2328cxgb_extension_open(struct cdev *dev, int flags, int fmp, d_thread_t *td) 2329{ --- 36 unchanged lines hidden (view full) --- 2366 2367 if (!phy->mdio_read) 2368 return (EOPNOTSUPP); 2369 if (is_10G(sc)) { 2370 mmd = mid->phy_id >> 8; 2371 if (!mmd) 2372 mmd = MDIO_DEV_PCS; 2373 else if (mmd > MDIO_DEV_XGXS) |
1926 return -EINVAL; | 2374 return (EINVAL); |
1927 1928 error = phy->mdio_read(sc, mid->phy_id & 0x1f, mmd, 1929 mid->reg_num, &val); 1930 } else 1931 error = phy->mdio_read(sc, mid->phy_id & 0x1f, 0, 1932 mid->reg_num & 0x1f, &val); 1933 if (error == 0) 1934 mid->val_out = val; --- 73 unchanged lines hidden (view full) --- 2008 edesc->size = ret; 2009 break; 2010 } 2011 case CHELSIO_SET_QSET_PARAMS: { 2012 struct qset_params *q; 2013 struct ch_qset_params *t = (struct ch_qset_params *)data; 2014 2015 if (t->qset_idx >= SGE_QSETS) | 2375 2376 error = phy->mdio_read(sc, mid->phy_id & 0x1f, mmd, 2377 mid->reg_num, &val); 2378 } else 2379 error = phy->mdio_read(sc, mid->phy_id & 0x1f, 0, 2380 mid->reg_num & 0x1f, &val); 2381 if (error == 0) 2382 mid->val_out = val; --- 73 unchanged lines hidden (view full) --- 2456 edesc->size = ret; 2457 break; 2458 } 2459 case CHELSIO_SET_QSET_PARAMS: { 2460 struct qset_params *q; 2461 struct ch_qset_params *t = (struct ch_qset_params *)data; 2462 2463 if (t->qset_idx >= SGE_QSETS) |
2016 return -EINVAL; | 2464 return (EINVAL); |
2017 if (!in_range(t->intr_lat, 0, M_NEWTIMER) || 2018 !in_range(t->cong_thres, 0, 255) || 2019 !in_range(t->txq_size[0], MIN_TXQ_ENTRIES, 2020 MAX_TXQ_ENTRIES) || 2021 !in_range(t->txq_size[1], MIN_TXQ_ENTRIES, 2022 MAX_TXQ_ENTRIES) || 2023 !in_range(t->txq_size[2], MIN_CTRL_TXQ_ENTRIES, 2024 MAX_CTRL_TXQ_ENTRIES) || 2025 !in_range(t->fl_size[0], MIN_FL_ENTRIES, MAX_RX_BUFFERS) || 2026 !in_range(t->fl_size[1], MIN_FL_ENTRIES, 2027 MAX_RX_JUMBO_BUFFERS) || 2028 !in_range(t->rspq_size, MIN_RSPQ_ENTRIES, MAX_RSPQ_ENTRIES)) | 2465 if (!in_range(t->intr_lat, 0, M_NEWTIMER) || 2466 !in_range(t->cong_thres, 0, 255) || 2467 !in_range(t->txq_size[0], MIN_TXQ_ENTRIES, 2468 MAX_TXQ_ENTRIES) || 2469 !in_range(t->txq_size[1], MIN_TXQ_ENTRIES, 2470 MAX_TXQ_ENTRIES) || 2471 !in_range(t->txq_size[2], MIN_CTRL_TXQ_ENTRIES, 2472 MAX_CTRL_TXQ_ENTRIES) || 2473 !in_range(t->fl_size[0], MIN_FL_ENTRIES, MAX_RX_BUFFERS) || 2474 !in_range(t->fl_size[1], MIN_FL_ENTRIES, 2475 MAX_RX_JUMBO_BUFFERS) || 2476 !in_range(t->rspq_size, MIN_RSPQ_ENTRIES, MAX_RSPQ_ENTRIES)) |
2029 return -EINVAL; | 2477 return (EINVAL); |
2030 if ((sc->flags & FULL_INIT_DONE) && 2031 (t->rspq_size >= 0 || t->fl_size[0] >= 0 || 2032 t->fl_size[1] >= 0 || t->txq_size[0] >= 0 || 2033 t->txq_size[1] >= 0 || t->txq_size[2] >= 0 || 2034 t->polling >= 0 || t->cong_thres >= 0)) | 2478 if ((sc->flags & FULL_INIT_DONE) && 2479 (t->rspq_size >= 0 || t->fl_size[0] >= 0 || 2480 t->fl_size[1] >= 0 || t->txq_size[0] >= 0 || 2481 t->txq_size[1] >= 0 || t->txq_size[2] >= 0 || 2482 t->polling >= 0 || t->cong_thres >= 0)) |
2035 return -EBUSY; | 2483 return (EBUSY); |
2036 2037 q = &sc->params.sge.qset[t->qset_idx]; 2038 2039 if (t->rspq_size >= 0) 2040 q->rspq_size = t->rspq_size; 2041 if (t->fl_size[0] >= 0) 2042 q->fl_size = t->fl_size[0]; 2043 if (t->fl_size[1] >= 0) --- 92 unchanged lines hidden (view full) --- 2136 struct ch_mtus *m = (struct ch_mtus *)data; 2137 2138 if (!is_offload(sc)) 2139 return (EOPNOTSUPP); 2140 2141 memcpy(m->mtus, sc->params.mtus, sizeof(m->mtus)); 2142 m->nmtus = NMTUS; 2143 break; | 2484 2485 q = &sc->params.sge.qset[t->qset_idx]; 2486 2487 if (t->rspq_size >= 0) 2488 q->rspq_size = t->rspq_size; 2489 if (t->fl_size[0] >= 0) 2490 q->fl_size = t->fl_size[0]; 2491 if (t->fl_size[1] >= 0) --- 92 unchanged lines hidden (view full) --- 2584 struct ch_mtus *m = (struct ch_mtus *)data; 2585 2586 if (!is_offload(sc)) 2587 return (EOPNOTSUPP); 2588 2589 memcpy(m->mtus, sc->params.mtus, sizeof(m->mtus)); 2590 m->nmtus = NMTUS; 2591 break; |
2592 } 2593 case CHELSIO_SET_FILTER: { 2594 struct ch_filter *f = (struct ch_filter *)data; 2595 struct filter_info *p; 2596 int ret; 2597 2598 if (sc->params.mc5.nfilters == 0) 2599 return (EOPNOTSUPP); 2600 if (!(sc->flags & FULL_INIT_DONE)) 2601 return (EAGAIN); /* can still change nfilters */ 2602 if (sc->filters == NULL) 2603 return (ENOMEM); 2604 2605 if (f->filter_id >= sc->params.mc5.nfilters || 2606 (f->val.dip && f->mask.dip != 0xffffffff) || 2607 (f->val.sport && f->mask.sport != 0xffff) || 2608 (f->val.dport && f->mask.dport != 0xffff) || 2609 (f->mask.vlan && f->mask.vlan != 0xfff) || 2610 (f->mask.vlan_prio && f->mask.vlan_prio != 7) || 2611 (f->mac_addr_idx != 0xffff && f->mac_addr_idx > 15) || 2612 f->qset >= SGE_QSETS || 2613 sc->rrss_map[f->qset] >= RSS_TABLE_SIZE) 2614 return (EINVAL); 2615 2616 p = &sc->filters[f->filter_id]; 2617 if (p->locked) 2618 return (EPERM); 2619 2620 p->sip = f->val.sip; 2621 p->sip_mask = f->mask.sip; 2622 p->dip = f->val.dip; 2623 p->sport = f->val.sport; 2624 p->dport = f->val.dport; 2625 p->vlan = f->mask.vlan ? f->val.vlan : 0xfff; 2626 p->vlan_prio = f->mask.vlan_prio ? (f->val.vlan_prio & 6) : 2627 FILTER_NO_VLAN_PRI; 2628 p->mac_hit = f->mac_hit; 2629 p->mac_vld = f->mac_addr_idx != 0xffff; 2630 p->mac_idx = f->mac_addr_idx; 2631 p->pkt_type = f->proto; 2632 p->report_filter_id = f->want_filter_id; 2633 p->pass = f->pass; 2634 p->rss = f->rss; 2635 p->qset = f->qset; 2636 2637 ret = set_filter(sc, f->filter_id, p); 2638 if (ret) 2639 return ret; 2640 p->valid = 1; 2641 break; 2642 } 2643 case CHELSIO_DEL_FILTER: { 2644 struct ch_filter *f = (struct ch_filter *)data; 2645 struct filter_info *p; 2646 2647 if (sc->params.mc5.nfilters == 0) 2648 return (EOPNOTSUPP); 2649 if (!(sc->flags & FULL_INIT_DONE)) 2650 return (EAGAIN); /* can still change nfilters */ 2651 if (sc->filters == NULL) 2652 return (ENOMEM); 2653 if (f->filter_id >= sc->params.mc5.nfilters) 2654 return (EINVAL); 2655 2656 p = &sc->filters[f->filter_id]; 2657 if (p->locked) 2658 return (EPERM); 2659 memset(p, 0, sizeof(*p)); 2660 p->sip_mask = 0xffffffff; 2661 p->vlan = 0xfff; 2662 p->vlan_prio = FILTER_NO_VLAN_PRI; 2663 p->pkt_type = 1; 2664 return set_filter(sc, f->filter_id, p); |
|
2144 } 2145 case CHELSIO_DEVUP: 2146 if (!is_offload(sc)) 2147 return (EOPNOTSUPP); 2148 return offload_open(pi); 2149 break; 2150 case CHELSIO_GET_MEM: { 2151 struct ch_mem_range *t = (struct ch_mem_range *)data; --- 42 unchanged lines hidden (view full) --- 2194 } 2195 break; 2196 } 2197 case CHELSIO_READ_TCAM_WORD: { 2198 struct ch_tcam_word *t = (struct ch_tcam_word *)data; 2199 2200 if (!is_offload(sc)) 2201 return (EOPNOTSUPP); | 2665 } 2666 case CHELSIO_DEVUP: 2667 if (!is_offload(sc)) 2668 return (EOPNOTSUPP); 2669 return offload_open(pi); 2670 break; 2671 case CHELSIO_GET_MEM: { 2672 struct ch_mem_range *t = (struct ch_mem_range *)data; --- 42 unchanged lines hidden (view full) --- 2715 } 2716 break; 2717 } 2718 case CHELSIO_READ_TCAM_WORD: { 2719 struct ch_tcam_word *t = (struct ch_tcam_word *)data; 2720 2721 if (!is_offload(sc)) 2722 return (EOPNOTSUPP); |
2723 if (!(sc->flags & FULL_INIT_DONE)) 2724 return (EIO); /* need MC5 */ |
|
2202 return -t3_read_mc5_range(&sc->mc5, t->addr, 1, t->buf); 2203 break; 2204 } 2205 case CHELSIO_SET_TRACE_FILTER: { 2206 struct ch_trace *t = (struct ch_trace *)data; 2207 const struct trace_params *tp; 2208 2209 tp = (const struct trace_params *)&t->sip; --- 126 unchanged lines hidden --- | 2725 return -t3_read_mc5_range(&sc->mc5, t->addr, 1, t->buf); 2726 break; 2727 } 2728 case CHELSIO_SET_TRACE_FILTER: { 2729 struct ch_trace *t = (struct ch_trace *)data; 2730 const struct trace_params *tp; 2731 2732 tp = (const struct trace_params *)&t->sip; --- 126 unchanged lines hidden --- |