1 /*- 2 * Copyright (c) 2011 Chelsio Communications, Inc. 3 * All rights reserved. 4 * Written by: Navdeep Parhar <np@FreeBSD.org> 5 * 6 * Redistribution and use in source and binary forms, with or without 7 * modification, are permitted provided that the following conditions 8 * are met: 9 * 1. Redistributions of source code must retain the above copyright 10 * notice, this list of conditions and the following disclaimer. 11 * 2. Redistributions in binary form must reproduce the above copyright 12 * notice, this list of conditions and the following disclaimer in the 13 * documentation and/or other materials provided with the distribution. 14 * 15 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 16 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 17 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 18 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 19 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 20 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 21 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 22 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 23 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 24 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 25 * SUCH DAMAGE. 26 */ 27 28 #include <sys/cdefs.h> 29 __FBSDID("$FreeBSD$"); 30 31 #include "opt_inet.h" 32 #include "opt_inet6.h" 33 34 #include <sys/param.h> 35 #include <sys/conf.h> 36 #include <sys/priv.h> 37 #include <sys/kernel.h> 38 #include <sys/bus.h> 39 #include <sys/module.h> 40 #include <sys/malloc.h> 41 #include <sys/queue.h> 42 #include <sys/taskqueue.h> 43 #include <sys/pciio.h> 44 #include <dev/pci/pcireg.h> 45 #include <dev/pci/pcivar.h> 46 #include <dev/pci/pci_private.h> 47 #include <sys/firmware.h> 48 #include <sys/sbuf.h> 49 #include <sys/smp.h> 50 #include <sys/socket.h> 51 #include <sys/sockio.h> 52 #include <sys/sysctl.h> 53 #include <net/ethernet.h> 54 #include <net/if.h> 55 #include <net/if_types.h> 56 #include <net/if_dl.h> 57 #include <net/if_vlan_var.h> 58 59 #include "common/common.h" 60 #include "common/t4_msg.h" 61 #include "common/t4_regs.h" 62 #include "common/t4_regs_values.h" 63 #include "t4_ioctl.h" 64 #include "t4_l2t.h" 65 66 /* T4 bus driver interface */ 67 static int t4_probe(device_t); 68 static int t4_attach(device_t); 69 static int t4_detach(device_t); 70 static device_method_t t4_methods[] = { 71 DEVMETHOD(device_probe, t4_probe), 72 DEVMETHOD(device_attach, t4_attach), 73 DEVMETHOD(device_detach, t4_detach), 74 75 DEVMETHOD_END 76 }; 77 static driver_t t4_driver = { 78 "t4nex", 79 t4_methods, 80 sizeof(struct adapter) 81 }; 82 83 84 /* T4 port (cxgbe) interface */ 85 static int cxgbe_probe(device_t); 86 static int cxgbe_attach(device_t); 87 static int cxgbe_detach(device_t); 88 static device_method_t cxgbe_methods[] = { 89 DEVMETHOD(device_probe, cxgbe_probe), 90 DEVMETHOD(device_attach, cxgbe_attach), 91 DEVMETHOD(device_detach, cxgbe_detach), 92 { 0, 0 } 93 }; 94 static driver_t cxgbe_driver = { 95 "cxgbe", 96 cxgbe_methods, 97 sizeof(struct port_info) 98 }; 99 100 static d_ioctl_t t4_ioctl; 101 static d_open_t t4_open; 102 static d_close_t t4_close; 103 104 static struct cdevsw t4_cdevsw = { 105 .d_version = D_VERSION, 106 .d_flags = 0, 107 .d_open = t4_open, 108 .d_close = t4_close, 109 .d_ioctl = t4_ioctl, 110 .d_name = "t4nex", 111 }; 112 113 /* ifnet + media interface */ 114 static void cxgbe_init(void *); 115 static int cxgbe_ioctl(struct ifnet *, unsigned long, caddr_t); 116 static int cxgbe_transmit(struct ifnet *, struct mbuf *); 117 static void cxgbe_qflush(struct ifnet *); 118 static int cxgbe_media_change(struct ifnet *); 119 static void cxgbe_media_status(struct ifnet *, struct ifmediareq *); 120 121 MALLOC_DEFINE(M_CXGBE, "cxgbe", "Chelsio T4 Ethernet driver and services"); 122 123 /* 124 * Correct lock order when you need to acquire multiple locks is t4_list_lock, 125 * then ADAPTER_LOCK, then t4_uld_list_lock. 126 */ 127 static struct mtx t4_list_lock; 128 static SLIST_HEAD(, adapter) t4_list; 129 #ifdef TCP_OFFLOAD 130 static struct mtx t4_uld_list_lock; 131 static SLIST_HEAD(, uld_info) t4_uld_list; 132 #endif 133 134 /* 135 * Tunables. See tweak_tunables() too. 136 */ 137 138 /* 139 * Number of queues for tx and rx, 10G and 1G, NIC and offload. 140 */ 141 #define NTXQ_10G 16 142 static int t4_ntxq10g = -1; 143 TUNABLE_INT("hw.cxgbe.ntxq10g", &t4_ntxq10g); 144 145 #define NRXQ_10G 8 146 static int t4_nrxq10g = -1; 147 TUNABLE_INT("hw.cxgbe.nrxq10g", &t4_nrxq10g); 148 149 #define NTXQ_1G 4 150 static int t4_ntxq1g = -1; 151 TUNABLE_INT("hw.cxgbe.ntxq1g", &t4_ntxq1g); 152 153 #define NRXQ_1G 2 154 static int t4_nrxq1g = -1; 155 TUNABLE_INT("hw.cxgbe.nrxq1g", &t4_nrxq1g); 156 157 #ifdef TCP_OFFLOAD 158 #define NOFLDTXQ_10G 8 159 static int t4_nofldtxq10g = -1; 160 TUNABLE_INT("hw.cxgbe.nofldtxq10g", &t4_nofldtxq10g); 161 162 #define NOFLDRXQ_10G 2 163 static int t4_nofldrxq10g = -1; 164 TUNABLE_INT("hw.cxgbe.nofldrxq10g", &t4_nofldrxq10g); 165 166 #define NOFLDTXQ_1G 2 167 static int t4_nofldtxq1g = -1; 168 TUNABLE_INT("hw.cxgbe.nofldtxq1g", &t4_nofldtxq1g); 169 170 #define NOFLDRXQ_1G 1 171 static int t4_nofldrxq1g = -1; 172 TUNABLE_INT("hw.cxgbe.nofldrxq1g", &t4_nofldrxq1g); 173 #endif 174 175 /* 176 * Holdoff parameters for 10G and 1G ports. 177 */ 178 #define TMR_IDX_10G 1 179 static int t4_tmr_idx_10g = TMR_IDX_10G; 180 TUNABLE_INT("hw.cxgbe.holdoff_timer_idx_10G", &t4_tmr_idx_10g); 181 182 #define PKTC_IDX_10G (-1) 183 static int t4_pktc_idx_10g = PKTC_IDX_10G; 184 TUNABLE_INT("hw.cxgbe.holdoff_pktc_idx_10G", &t4_pktc_idx_10g); 185 186 #define TMR_IDX_1G 1 187 static int t4_tmr_idx_1g = TMR_IDX_1G; 188 TUNABLE_INT("hw.cxgbe.holdoff_timer_idx_1G", &t4_tmr_idx_1g); 189 190 #define PKTC_IDX_1G (-1) 191 static int t4_pktc_idx_1g = PKTC_IDX_1G; 192 TUNABLE_INT("hw.cxgbe.holdoff_pktc_idx_1G", &t4_pktc_idx_1g); 193 194 /* 195 * Size (# of entries) of each tx and rx queue. 196 */ 197 static unsigned int t4_qsize_txq = TX_EQ_QSIZE; 198 TUNABLE_INT("hw.cxgbe.qsize_txq", &t4_qsize_txq); 199 200 static unsigned int t4_qsize_rxq = RX_IQ_QSIZE; 201 TUNABLE_INT("hw.cxgbe.qsize_rxq", &t4_qsize_rxq); 202 203 /* 204 * Interrupt types allowed (bits 0, 1, 2 = INTx, MSI, MSI-X respectively). 205 */ 206 static int t4_intr_types = INTR_MSIX | INTR_MSI | INTR_INTX; 207 TUNABLE_INT("hw.cxgbe.interrupt_types", &t4_intr_types); 208 209 /* 210 * Configuration file. 211 */ 212 static char t4_cfg_file[32] = "default"; 213 TUNABLE_STR("hw.cxgbe.config_file", t4_cfg_file, sizeof(t4_cfg_file)); 214 215 /* 216 * ASIC features that will be used. Disable the ones you don't want so that the 217 * chip resources aren't wasted on features that will not be used. 218 */ 219 static int t4_linkcaps_allowed = 0; /* No DCBX, PPP, etc. by default */ 220 TUNABLE_INT("hw.cxgbe.linkcaps_allowed", &t4_linkcaps_allowed); 221 222 static int t4_niccaps_allowed = FW_CAPS_CONFIG_NIC; 223 TUNABLE_INT("hw.cxgbe.niccaps_allowed", &t4_niccaps_allowed); 224 225 static int t4_toecaps_allowed = -1; 226 TUNABLE_INT("hw.cxgbe.toecaps_allowed", &t4_toecaps_allowed); 227 228 static int t4_rdmacaps_allowed = 0; 229 TUNABLE_INT("hw.cxgbe.rdmacaps_allowed", &t4_rdmacaps_allowed); 230 231 static int t4_iscsicaps_allowed = 0; 232 TUNABLE_INT("hw.cxgbe.iscsicaps_allowed", &t4_iscsicaps_allowed); 233 234 static int t4_fcoecaps_allowed = 0; 235 TUNABLE_INT("hw.cxgbe.fcoecaps_allowed", &t4_fcoecaps_allowed); 236 237 struct intrs_and_queues { 238 int intr_type; /* INTx, MSI, or MSI-X */ 239 int nirq; /* Number of vectors */ 240 int intr_flags; 241 int ntxq10g; /* # of NIC txq's for each 10G port */ 242 int nrxq10g; /* # of NIC rxq's for each 10G port */ 243 int ntxq1g; /* # of NIC txq's for each 1G port */ 244 int nrxq1g; /* # of NIC rxq's for each 1G port */ 245 #ifdef TCP_OFFLOAD 246 int nofldtxq10g; /* # of TOE txq's for each 10G port */ 247 int nofldrxq10g; /* # of TOE rxq's for each 10G port */ 248 int nofldtxq1g; /* # of TOE txq's for each 1G port */ 249 int nofldrxq1g; /* # of TOE rxq's for each 1G port */ 250 #endif 251 }; 252 253 struct filter_entry { 254 uint32_t valid:1; /* filter allocated and valid */ 255 uint32_t locked:1; /* filter is administratively locked */ 256 uint32_t pending:1; /* filter action is pending firmware reply */ 257 uint32_t smtidx:8; /* Source MAC Table index for smac */ 258 struct l2t_entry *l2t; /* Layer Two Table entry for dmac */ 259 260 struct t4_filter_specification fs; 261 }; 262 263 enum { 264 XGMAC_MTU = (1 << 0), 265 XGMAC_PROMISC = (1 << 1), 266 XGMAC_ALLMULTI = (1 << 2), 267 XGMAC_VLANEX = (1 << 3), 268 XGMAC_UCADDR = (1 << 4), 269 XGMAC_MCADDRS = (1 << 5), 270 271 XGMAC_ALL = 0xffff 272 }; 273 274 static int map_bars(struct adapter *); 275 static void setup_memwin(struct adapter *); 276 static int cfg_itype_and_nqueues(struct adapter *, int, int, 277 struct intrs_and_queues *); 278 static int prep_firmware(struct adapter *); 279 static int upload_config_file(struct adapter *, const struct firmware *, 280 uint32_t *, uint32_t *); 281 static int partition_resources(struct adapter *, const struct firmware *); 282 static int get_params__pre_init(struct adapter *); 283 static int get_params__post_init(struct adapter *); 284 static void t4_set_desc(struct adapter *); 285 static void build_medialist(struct port_info *); 286 static int update_mac_settings(struct port_info *, int); 287 static int cxgbe_init_locked(struct port_info *); 288 static int cxgbe_init_synchronized(struct port_info *); 289 static int cxgbe_uninit_locked(struct port_info *); 290 static int cxgbe_uninit_synchronized(struct port_info *); 291 static int setup_intr_handlers(struct adapter *); 292 static int adapter_full_init(struct adapter *); 293 static int adapter_full_uninit(struct adapter *); 294 static int port_full_init(struct port_info *); 295 static int port_full_uninit(struct port_info *); 296 static void quiesce_eq(struct adapter *, struct sge_eq *); 297 static void quiesce_iq(struct adapter *, struct sge_iq *); 298 static void quiesce_fl(struct adapter *, struct sge_fl *); 299 static int t4_alloc_irq(struct adapter *, struct irq *, int rid, 300 driver_intr_t *, void *, char *); 301 static int t4_free_irq(struct adapter *, struct irq *); 302 static void reg_block_dump(struct adapter *, uint8_t *, unsigned int, 303 unsigned int); 304 static void t4_get_regs(struct adapter *, struct t4_regdump *, uint8_t *); 305 static void cxgbe_tick(void *); 306 static void cxgbe_vlan_config(void *, struct ifnet *, uint16_t); 307 static int cpl_not_handled(struct sge_iq *, const struct rss_header *, 308 struct mbuf *); 309 static int an_not_handled(struct sge_iq *, const struct rsp_ctrl *); 310 static int fw_msg_not_handled(struct adapter *, const __be64 *); 311 static int t4_sysctls(struct adapter *); 312 static int cxgbe_sysctls(struct port_info *); 313 static int sysctl_int_array(SYSCTL_HANDLER_ARGS); 314 static int sysctl_bitfield(SYSCTL_HANDLER_ARGS); 315 static int sysctl_holdoff_tmr_idx(SYSCTL_HANDLER_ARGS); 316 static int sysctl_holdoff_pktc_idx(SYSCTL_HANDLER_ARGS); 317 static int sysctl_qsize_rxq(SYSCTL_HANDLER_ARGS); 318 static int sysctl_qsize_txq(SYSCTL_HANDLER_ARGS); 319 static int sysctl_handle_t4_reg64(SYSCTL_HANDLER_ARGS); 320 #ifdef SBUF_DRAIN 321 static int sysctl_cctrl(SYSCTL_HANDLER_ARGS); 322 static int sysctl_cpl_stats(SYSCTL_HANDLER_ARGS); 323 static int sysctl_ddp_stats(SYSCTL_HANDLER_ARGS); 324 static int sysctl_devlog(SYSCTL_HANDLER_ARGS); 325 static int sysctl_fcoe_stats(SYSCTL_HANDLER_ARGS); 326 static int sysctl_hw_sched(SYSCTL_HANDLER_ARGS); 327 static int sysctl_lb_stats(SYSCTL_HANDLER_ARGS); 328 static int sysctl_meminfo(SYSCTL_HANDLER_ARGS); 329 static int sysctl_path_mtus(SYSCTL_HANDLER_ARGS); 330 static int sysctl_pm_stats(SYSCTL_HANDLER_ARGS); 331 static int sysctl_rdma_stats(SYSCTL_HANDLER_ARGS); 332 static int sysctl_tcp_stats(SYSCTL_HANDLER_ARGS); 333 static int sysctl_tids(SYSCTL_HANDLER_ARGS); 334 static int sysctl_tp_err_stats(SYSCTL_HANDLER_ARGS); 335 static int sysctl_tx_rate(SYSCTL_HANDLER_ARGS); 336 #endif 337 static inline void txq_start(struct ifnet *, struct sge_txq *); 338 static uint32_t fconf_to_mode(uint32_t); 339 static uint32_t mode_to_fconf(uint32_t); 340 static uint32_t fspec_to_fconf(struct t4_filter_specification *); 341 static int get_filter_mode(struct adapter *, uint32_t *); 342 static int set_filter_mode(struct adapter *, uint32_t); 343 static inline uint64_t get_filter_hits(struct adapter *, uint32_t); 344 static int get_filter(struct adapter *, struct t4_filter *); 345 static int set_filter(struct adapter *, struct t4_filter *); 346 static int del_filter(struct adapter *, struct t4_filter *); 347 static void clear_filter(struct filter_entry *); 348 static int set_filter_wr(struct adapter *, int); 349 static int del_filter_wr(struct adapter *, int); 350 static int get_sge_context(struct adapter *, struct t4_sge_context *); 351 static int read_card_mem(struct adapter *, struct t4_mem_range *); 352 #ifdef TCP_OFFLOAD 353 static int toe_capability(struct port_info *, int); 354 #endif 355 static int t4_mod_event(module_t, int, void *); 356 357 struct t4_pciids { 358 uint16_t device; 359 char *desc; 360 } t4_pciids[] = { 361 {0xa000, "Chelsio Terminator 4 FPGA"}, 362 {0x4400, "Chelsio T440-dbg"}, 363 {0x4401, "Chelsio T420-CR"}, 364 {0x4402, "Chelsio T422-CR"}, 365 {0x4403, "Chelsio T440-CR"}, 366 {0x4404, "Chelsio T420-BCH"}, 367 {0x4405, "Chelsio T440-BCH"}, 368 {0x4406, "Chelsio T440-CH"}, 369 {0x4407, "Chelsio T420-SO"}, 370 {0x4408, "Chelsio T420-CX"}, 371 {0x4409, "Chelsio T420-BT"}, 372 {0x440a, "Chelsio T404-BT"}, 373 }; 374 375 #ifdef TCP_OFFLOAD 376 /* 377 * service_iq() has an iq and needs the fl. Offset of fl from the iq should be 378 * exactly the same for both rxq and ofld_rxq. 379 */ 380 CTASSERT(offsetof(struct sge_ofld_rxq, iq) == offsetof(struct sge_rxq, iq)); 381 CTASSERT(offsetof(struct sge_ofld_rxq, fl) == offsetof(struct sge_rxq, fl)); 382 #endif 383 384 /* No easy way to include t4_msg.h before adapter.h so we check this way */ 385 CTASSERT(nitems(((struct adapter *)0)->cpl_handler) == NUM_CPL_CMDS); 386 CTASSERT(nitems(((struct adapter *)0)->fw_msg_handler) == NUM_FW6_TYPES); 387 388 static int 389 t4_probe(device_t dev) 390 { 391 int i; 392 uint16_t v = pci_get_vendor(dev); 393 uint16_t d = pci_get_device(dev); 394 uint8_t f = pci_get_function(dev); 395 396 if (v != PCI_VENDOR_ID_CHELSIO) 397 return (ENXIO); 398 399 /* Attach only to PF0 of the FPGA */ 400 if (d == 0xa000 && f != 0) 401 return (ENXIO); 402 403 for (i = 0; i < nitems(t4_pciids); i++) { 404 if (d == t4_pciids[i].device) { 405 device_set_desc(dev, t4_pciids[i].desc); 406 return (BUS_PROBE_DEFAULT); 407 } 408 } 409 410 return (ENXIO); 411 } 412 413 static int 414 t4_attach(device_t dev) 415 { 416 struct adapter *sc; 417 int rc = 0, i, n10g, n1g, rqidx, tqidx; 418 struct intrs_and_queues iaq; 419 struct sge *s; 420 #ifdef TCP_OFFLOAD 421 int ofld_rqidx, ofld_tqidx; 422 #endif 423 424 sc = device_get_softc(dev); 425 sc->dev = dev; 426 427 pci_enable_busmaster(dev); 428 if (pci_find_cap(dev, PCIY_EXPRESS, &i) == 0) { 429 uint32_t v; 430 431 pci_set_max_read_req(dev, 4096); 432 v = pci_read_config(dev, i + PCIER_DEVICE_CTL, 2); 433 v |= PCIEM_CTL_RELAXED_ORD_ENABLE; 434 pci_write_config(dev, i + PCIER_DEVICE_CTL, v, 2); 435 } 436 437 snprintf(sc->lockname, sizeof(sc->lockname), "%s", 438 device_get_nameunit(dev)); 439 mtx_init(&sc->sc_lock, sc->lockname, 0, MTX_DEF); 440 mtx_lock(&t4_list_lock); 441 SLIST_INSERT_HEAD(&t4_list, sc, link); 442 mtx_unlock(&t4_list_lock); 443 444 mtx_init(&sc->sfl_lock, "starving freelists", 0, MTX_DEF); 445 TAILQ_INIT(&sc->sfl); 446 callout_init(&sc->sfl_callout, CALLOUT_MPSAFE); 447 448 rc = map_bars(sc); 449 if (rc != 0) 450 goto done; /* error message displayed already */ 451 452 /* 453 * This is the real PF# to which we're attaching. Works from within PCI 454 * passthrough environments too, where pci_get_function() could return a 455 * different PF# depending on the passthrough configuration. We need to 456 * use the real PF# in all our communication with the firmware. 457 */ 458 sc->pf = G_SOURCEPF(t4_read_reg(sc, A_PL_WHOAMI)); 459 sc->mbox = sc->pf; 460 461 memset(sc->chan_map, 0xff, sizeof(sc->chan_map)); 462 sc->an_handler = an_not_handled; 463 for (i = 0; i < nitems(sc->cpl_handler); i++) 464 sc->cpl_handler[i] = cpl_not_handled; 465 for (i = 0; i < nitems(sc->fw_msg_handler); i++) 466 sc->fw_msg_handler[i] = fw_msg_not_handled; 467 t4_register_cpl_handler(sc, CPL_SET_TCB_RPL, t4_filter_rpl); 468 469 /* Prepare the adapter for operation */ 470 rc = -t4_prep_adapter(sc); 471 if (rc != 0) { 472 device_printf(dev, "failed to prepare adapter: %d.\n", rc); 473 goto done; 474 } 475 476 /* 477 * Do this really early, with the memory windows set up even before the 478 * character device. The userland tool's register i/o and mem read 479 * will work even in "recovery mode". 480 */ 481 setup_memwin(sc); 482 sc->cdev = make_dev(&t4_cdevsw, device_get_unit(dev), UID_ROOT, 483 GID_WHEEL, 0600, "%s", device_get_nameunit(dev)); 484 sc->cdev->si_drv1 = sc; 485 486 /* Go no further if recovery mode has been requested. */ 487 if (TUNABLE_INT_FETCH("hw.cxgbe.sos", &i) && i != 0) { 488 device_printf(dev, "recovery mode.\n"); 489 goto done; 490 } 491 492 /* Prepare the firmware for operation */ 493 rc = prep_firmware(sc); 494 if (rc != 0) 495 goto done; /* error message displayed already */ 496 497 rc = get_params__pre_init(sc); 498 if (rc != 0) 499 goto done; /* error message displayed already */ 500 501 rc = t4_sge_init(sc); 502 if (rc != 0) 503 goto done; /* error message displayed already */ 504 505 if (sc->flags & MASTER_PF) { 506 /* get basic stuff going */ 507 rc = -t4_fw_initialize(sc, sc->mbox); 508 if (rc != 0) { 509 device_printf(dev, "early init failed: %d.\n", rc); 510 goto done; 511 } 512 } 513 514 rc = get_params__post_init(sc); 515 if (rc != 0) 516 goto done; /* error message displayed already */ 517 518 if (sc->flags & MASTER_PF) { 519 uint16_t indsz = min(RX_COPY_THRESHOLD - 1, M_INDICATESIZE); 520 521 /* final tweaks to some settings */ 522 523 t4_load_mtus(sc, sc->params.mtus, sc->params.a_wnd, 524 sc->params.b_wnd); 525 /* 4K, 16K, 64K, 256K DDP "page sizes" */ 526 t4_write_reg(sc, A_ULP_RX_TDDP_PSZ, V_HPZ0(0) | V_HPZ1(2) | 527 V_HPZ2(4) | V_HPZ3(6)); 528 t4_set_reg_field(sc, A_ULP_RX_CTL, F_TDDPTAGTCB, F_TDDPTAGTCB); 529 t4_set_reg_field(sc, A_TP_PARA_REG3, F_TUNNELCNGDROP0 | 530 F_TUNNELCNGDROP1 | F_TUNNELCNGDROP2 | F_TUNNELCNGDROP3, 531 F_TUNNELCNGDROP0 | F_TUNNELCNGDROP1 | F_TUNNELCNGDROP2 | 532 F_TUNNELCNGDROP3); 533 t4_set_reg_field(sc, A_TP_PARA_REG5, 534 V_INDICATESIZE(M_INDICATESIZE) | 535 F_REARMDDPOFFSET | F_RESETDDPOFFSET, 536 V_INDICATESIZE(indsz) | 537 F_REARMDDPOFFSET | F_RESETDDPOFFSET); 538 } else { 539 /* 540 * XXX: Verify that we can live with whatever the master driver 541 * has done so far, and hope that it doesn't change any global 542 * setting from underneath us in the future. 543 */ 544 } 545 546 t4_read_indirect(sc, A_TP_PIO_ADDR, A_TP_PIO_DATA, &sc->filter_mode, 1, 547 A_TP_VLAN_PRI_MAP); 548 549 for (i = 0; i < NCHAN; i++) 550 sc->params.tp.tx_modq[i] = i; 551 552 rc = t4_create_dma_tag(sc); 553 if (rc != 0) 554 goto done; /* error message displayed already */ 555 556 /* 557 * First pass over all the ports - allocate VIs and initialize some 558 * basic parameters like mac address, port type, etc. We also figure 559 * out whether a port is 10G or 1G and use that information when 560 * calculating how many interrupts to attempt to allocate. 561 */ 562 n10g = n1g = 0; 563 for_each_port(sc, i) { 564 struct port_info *pi; 565 566 pi = malloc(sizeof(*pi), M_CXGBE, M_ZERO | M_WAITOK); 567 sc->port[i] = pi; 568 569 /* These must be set before t4_port_init */ 570 pi->adapter = sc; 571 pi->port_id = i; 572 573 /* Allocate the vi and initialize parameters like mac addr */ 574 rc = -t4_port_init(pi, sc->mbox, sc->pf, 0); 575 if (rc != 0) { 576 device_printf(dev, "unable to initialize port %d: %d\n", 577 i, rc); 578 free(pi, M_CXGBE); 579 sc->port[i] = NULL; 580 goto done; 581 } 582 583 snprintf(pi->lockname, sizeof(pi->lockname), "%sp%d", 584 device_get_nameunit(dev), i); 585 mtx_init(&pi->pi_lock, pi->lockname, 0, MTX_DEF); 586 587 if (is_10G_port(pi)) { 588 n10g++; 589 pi->tmr_idx = t4_tmr_idx_10g; 590 pi->pktc_idx = t4_pktc_idx_10g; 591 } else { 592 n1g++; 593 pi->tmr_idx = t4_tmr_idx_1g; 594 pi->pktc_idx = t4_pktc_idx_1g; 595 } 596 597 pi->xact_addr_filt = -1; 598 599 pi->qsize_rxq = t4_qsize_rxq; 600 pi->qsize_txq = t4_qsize_txq; 601 602 pi->dev = device_add_child(dev, "cxgbe", -1); 603 if (pi->dev == NULL) { 604 device_printf(dev, 605 "failed to add device for port %d.\n", i); 606 rc = ENXIO; 607 goto done; 608 } 609 device_set_softc(pi->dev, pi); 610 } 611 612 /* 613 * Interrupt type, # of interrupts, # of rx/tx queues, etc. 614 */ 615 rc = cfg_itype_and_nqueues(sc, n10g, n1g, &iaq); 616 if (rc != 0) 617 goto done; /* error message displayed already */ 618 619 sc->intr_type = iaq.intr_type; 620 sc->intr_count = iaq.nirq; 621 sc->flags |= iaq.intr_flags; 622 623 s = &sc->sge; 624 s->nrxq = n10g * iaq.nrxq10g + n1g * iaq.nrxq1g; 625 s->ntxq = n10g * iaq.ntxq10g + n1g * iaq.ntxq1g; 626 s->neq = s->ntxq + s->nrxq; /* the free list in an rxq is an eq */ 627 s->neq += sc->params.nports + 1;/* ctrl queues: 1 per port + 1 mgmt */ 628 s->niq = s->nrxq + 1; /* 1 extra for firmware event queue */ 629 630 #ifdef TCP_OFFLOAD 631 if (is_offload(sc)) { 632 633 s->nofldrxq = n10g * iaq.nofldrxq10g + n1g * iaq.nofldrxq1g; 634 s->nofldtxq = n10g * iaq.nofldtxq10g + n1g * iaq.nofldtxq1g; 635 s->neq += s->nofldtxq + s->nofldrxq; 636 s->niq += s->nofldrxq; 637 638 s->ofld_rxq = malloc(s->nofldrxq * sizeof(struct sge_ofld_rxq), 639 M_CXGBE, M_ZERO | M_WAITOK); 640 s->ofld_txq = malloc(s->nofldtxq * sizeof(struct sge_wrq), 641 M_CXGBE, M_ZERO | M_WAITOK); 642 } 643 #endif 644 645 s->ctrlq = malloc(sc->params.nports * sizeof(struct sge_wrq), M_CXGBE, 646 M_ZERO | M_WAITOK); 647 s->rxq = malloc(s->nrxq * sizeof(struct sge_rxq), M_CXGBE, 648 M_ZERO | M_WAITOK); 649 s->txq = malloc(s->ntxq * sizeof(struct sge_txq), M_CXGBE, 650 M_ZERO | M_WAITOK); 651 s->iqmap = malloc(s->niq * sizeof(struct sge_iq *), M_CXGBE, 652 M_ZERO | M_WAITOK); 653 s->eqmap = malloc(s->neq * sizeof(struct sge_eq *), M_CXGBE, 654 M_ZERO | M_WAITOK); 655 656 sc->irq = malloc(sc->intr_count * sizeof(struct irq), M_CXGBE, 657 M_ZERO | M_WAITOK); 658 659 t4_init_l2t(sc, M_WAITOK); 660 661 /* 662 * Second pass over the ports. This time we know the number of rx and 663 * tx queues that each port should get. 664 */ 665 rqidx = tqidx = 0; 666 #ifdef TCP_OFFLOAD 667 ofld_rqidx = ofld_tqidx = 0; 668 #endif 669 for_each_port(sc, i) { 670 struct port_info *pi = sc->port[i]; 671 672 if (pi == NULL) 673 continue; 674 675 pi->first_rxq = rqidx; 676 pi->first_txq = tqidx; 677 if (is_10G_port(pi)) { 678 pi->nrxq = iaq.nrxq10g; 679 pi->ntxq = iaq.ntxq10g; 680 } else { 681 pi->nrxq = iaq.nrxq1g; 682 pi->ntxq = iaq.ntxq1g; 683 } 684 685 rqidx += pi->nrxq; 686 tqidx += pi->ntxq; 687 688 #ifdef TCP_OFFLOAD 689 if (is_offload(sc)) { 690 pi->first_ofld_rxq = ofld_rqidx; 691 pi->first_ofld_txq = ofld_tqidx; 692 if (is_10G_port(pi)) { 693 pi->nofldrxq = iaq.nofldrxq10g; 694 pi->nofldtxq = iaq.nofldtxq10g; 695 } else { 696 pi->nofldrxq = iaq.nofldrxq1g; 697 pi->nofldtxq = iaq.nofldtxq1g; 698 } 699 ofld_rqidx += pi->nofldrxq; 700 ofld_tqidx += pi->nofldtxq; 701 } 702 #endif 703 } 704 705 rc = setup_intr_handlers(sc); 706 if (rc != 0) { 707 device_printf(dev, 708 "failed to setup interrupt handlers: %d\n", rc); 709 goto done; 710 } 711 712 rc = bus_generic_attach(dev); 713 if (rc != 0) { 714 device_printf(dev, 715 "failed to attach all child ports: %d\n", rc); 716 goto done; 717 } 718 719 device_printf(dev, 720 "PCIe x%d, %d ports, %d %s interrupt%s, %d eq, %d iq\n", 721 sc->params.pci.width, sc->params.nports, sc->intr_count, 722 sc->intr_type == INTR_MSIX ? "MSI-X" : 723 (sc->intr_type == INTR_MSI ? "MSI" : "INTx"), 724 sc->intr_count > 1 ? "s" : "", sc->sge.neq, sc->sge.niq); 725 726 t4_set_desc(sc); 727 728 done: 729 if (rc != 0 && sc->cdev) { 730 /* cdev was created and so cxgbetool works; recover that way. */ 731 device_printf(dev, 732 "error during attach, adapter is now in recovery mode.\n"); 733 rc = 0; 734 } 735 736 if (rc != 0) 737 t4_detach(dev); 738 else 739 t4_sysctls(sc); 740 741 return (rc); 742 } 743 744 /* 745 * Idempotent 746 */ 747 static int 748 t4_detach(device_t dev) 749 { 750 struct adapter *sc; 751 struct port_info *pi; 752 int i, rc; 753 754 sc = device_get_softc(dev); 755 756 if (sc->flags & FULL_INIT_DONE) 757 t4_intr_disable(sc); 758 759 if (sc->cdev) { 760 destroy_dev(sc->cdev); 761 sc->cdev = NULL; 762 } 763 764 rc = bus_generic_detach(dev); 765 if (rc) { 766 device_printf(dev, 767 "failed to detach child devices: %d\n", rc); 768 return (rc); 769 } 770 771 for (i = 0; i < sc->intr_count; i++) 772 t4_free_irq(sc, &sc->irq[i]); 773 774 for (i = 0; i < MAX_NPORTS; i++) { 775 pi = sc->port[i]; 776 if (pi) { 777 t4_free_vi(pi->adapter, sc->mbox, sc->pf, 0, pi->viid); 778 if (pi->dev) 779 device_delete_child(dev, pi->dev); 780 781 mtx_destroy(&pi->pi_lock); 782 free(pi, M_CXGBE); 783 } 784 } 785 786 if (sc->flags & FULL_INIT_DONE) 787 adapter_full_uninit(sc); 788 789 if (sc->flags & FW_OK) 790 t4_fw_bye(sc, sc->mbox); 791 792 if (sc->intr_type == INTR_MSI || sc->intr_type == INTR_MSIX) 793 pci_release_msi(dev); 794 795 if (sc->regs_res) 796 bus_release_resource(dev, SYS_RES_MEMORY, sc->regs_rid, 797 sc->regs_res); 798 799 if (sc->msix_res) 800 bus_release_resource(dev, SYS_RES_MEMORY, sc->msix_rid, 801 sc->msix_res); 802 803 if (sc->l2t) 804 t4_free_l2t(sc->l2t); 805 806 #ifdef TCP_OFFLOAD 807 free(sc->sge.ofld_rxq, M_CXGBE); 808 free(sc->sge.ofld_txq, M_CXGBE); 809 #endif 810 free(sc->irq, M_CXGBE); 811 free(sc->sge.rxq, M_CXGBE); 812 free(sc->sge.txq, M_CXGBE); 813 free(sc->sge.ctrlq, M_CXGBE); 814 free(sc->sge.iqmap, M_CXGBE); 815 free(sc->sge.eqmap, M_CXGBE); 816 free(sc->tids.ftid_tab, M_CXGBE); 817 t4_destroy_dma_tag(sc); 818 if (mtx_initialized(&sc->sc_lock)) { 819 mtx_lock(&t4_list_lock); 820 SLIST_REMOVE(&t4_list, sc, adapter, link); 821 mtx_unlock(&t4_list_lock); 822 mtx_destroy(&sc->sc_lock); 823 } 824 825 if (mtx_initialized(&sc->sfl_lock)) 826 mtx_destroy(&sc->sfl_lock); 827 828 bzero(sc, sizeof(*sc)); 829 830 return (0); 831 } 832 833 834 static int 835 cxgbe_probe(device_t dev) 836 { 837 char buf[128]; 838 struct port_info *pi = device_get_softc(dev); 839 840 snprintf(buf, sizeof(buf), "port %d", pi->port_id); 841 device_set_desc_copy(dev, buf); 842 843 return (BUS_PROBE_DEFAULT); 844 } 845 846 #define T4_CAP (IFCAP_VLAN_HWTAGGING | IFCAP_VLAN_MTU | IFCAP_HWCSUM | \ 847 IFCAP_VLAN_HWCSUM | IFCAP_TSO | IFCAP_JUMBO_MTU | IFCAP_LRO | \ 848 IFCAP_VLAN_HWTSO | IFCAP_LINKSTATE | IFCAP_HWCSUM_IPV6) 849 #define T4_CAP_ENABLE (T4_CAP) 850 851 static int 852 cxgbe_attach(device_t dev) 853 { 854 struct port_info *pi = device_get_softc(dev); 855 struct ifnet *ifp; 856 857 /* Allocate an ifnet and set it up */ 858 ifp = if_alloc(IFT_ETHER); 859 if (ifp == NULL) { 860 device_printf(dev, "Cannot allocate ifnet\n"); 861 return (ENOMEM); 862 } 863 pi->ifp = ifp; 864 ifp->if_softc = pi; 865 866 callout_init(&pi->tick, CALLOUT_MPSAFE); 867 868 if_initname(ifp, device_get_name(dev), device_get_unit(dev)); 869 ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST; 870 871 ifp->if_init = cxgbe_init; 872 ifp->if_ioctl = cxgbe_ioctl; 873 ifp->if_transmit = cxgbe_transmit; 874 ifp->if_qflush = cxgbe_qflush; 875 876 ifp->if_capabilities = T4_CAP; 877 #ifdef TCP_OFFLOAD 878 if (is_offload(pi->adapter)) 879 ifp->if_capabilities |= IFCAP_TOE4; 880 #endif 881 ifp->if_capenable = T4_CAP_ENABLE; 882 ifp->if_hwassist = CSUM_TCP | CSUM_UDP | CSUM_IP | CSUM_TSO | 883 CSUM_UDP_IPV6 | CSUM_TCP_IPV6; 884 885 /* Initialize ifmedia for this port */ 886 ifmedia_init(&pi->media, IFM_IMASK, cxgbe_media_change, 887 cxgbe_media_status); 888 build_medialist(pi); 889 890 pi->vlan_c = EVENTHANDLER_REGISTER(vlan_config, cxgbe_vlan_config, ifp, 891 EVENTHANDLER_PRI_ANY); 892 893 ether_ifattach(ifp, pi->hw_addr); 894 895 #ifdef TCP_OFFLOAD 896 if (is_offload(pi->adapter)) { 897 device_printf(dev, 898 "%d txq, %d rxq (NIC); %d txq, %d rxq (TOE)\n", 899 pi->ntxq, pi->nrxq, pi->nofldtxq, pi->nofldrxq); 900 } else 901 #endif 902 device_printf(dev, "%d txq, %d rxq\n", pi->ntxq, pi->nrxq); 903 904 cxgbe_sysctls(pi); 905 906 return (0); 907 } 908 909 static int 910 cxgbe_detach(device_t dev) 911 { 912 struct port_info *pi = device_get_softc(dev); 913 struct adapter *sc = pi->adapter; 914 struct ifnet *ifp = pi->ifp; 915 916 /* Tell if_ioctl and if_init that the port is going away */ 917 ADAPTER_LOCK(sc); 918 SET_DOOMED(pi); 919 wakeup(&sc->flags); 920 while (IS_BUSY(sc)) 921 mtx_sleep(&sc->flags, &sc->sc_lock, 0, "t4detach", 0); 922 SET_BUSY(sc); 923 ADAPTER_UNLOCK(sc); 924 925 if (pi->vlan_c) 926 EVENTHANDLER_DEREGISTER(vlan_config, pi->vlan_c); 927 928 PORT_LOCK(pi); 929 ifp->if_drv_flags &= ~IFF_DRV_RUNNING; 930 callout_stop(&pi->tick); 931 PORT_UNLOCK(pi); 932 callout_drain(&pi->tick); 933 934 /* Let detach proceed even if these fail. */ 935 cxgbe_uninit_synchronized(pi); 936 port_full_uninit(pi); 937 938 ifmedia_removeall(&pi->media); 939 ether_ifdetach(pi->ifp); 940 if_free(pi->ifp); 941 942 ADAPTER_LOCK(sc); 943 CLR_BUSY(sc); 944 wakeup_one(&sc->flags); 945 ADAPTER_UNLOCK(sc); 946 947 return (0); 948 } 949 950 static void 951 cxgbe_init(void *arg) 952 { 953 struct port_info *pi = arg; 954 struct adapter *sc = pi->adapter; 955 956 ADAPTER_LOCK(sc); 957 cxgbe_init_locked(pi); /* releases adapter lock */ 958 ADAPTER_LOCK_ASSERT_NOTOWNED(sc); 959 } 960 961 static int 962 cxgbe_ioctl(struct ifnet *ifp, unsigned long cmd, caddr_t data) 963 { 964 int rc = 0, mtu, flags; 965 struct port_info *pi = ifp->if_softc; 966 struct adapter *sc = pi->adapter; 967 struct ifreq *ifr = (struct ifreq *)data; 968 uint32_t mask; 969 970 switch (cmd) { 971 case SIOCSIFMTU: 972 ADAPTER_LOCK(sc); 973 rc = IS_DOOMED(pi) ? ENXIO : (IS_BUSY(sc) ? EBUSY : 0); 974 if (rc) { 975 fail: 976 ADAPTER_UNLOCK(sc); 977 return (rc); 978 } 979 980 mtu = ifr->ifr_mtu; 981 if ((mtu < ETHERMIN) || (mtu > ETHERMTU_JUMBO)) { 982 rc = EINVAL; 983 } else { 984 ifp->if_mtu = mtu; 985 if (ifp->if_drv_flags & IFF_DRV_RUNNING) { 986 t4_update_fl_bufsize(ifp); 987 PORT_LOCK(pi); 988 rc = update_mac_settings(pi, XGMAC_MTU); 989 PORT_UNLOCK(pi); 990 } 991 } 992 ADAPTER_UNLOCK(sc); 993 break; 994 995 case SIOCSIFFLAGS: 996 ADAPTER_LOCK(sc); 997 if (IS_DOOMED(pi)) { 998 rc = ENXIO; 999 goto fail; 1000 } 1001 if (ifp->if_flags & IFF_UP) { 1002 if (ifp->if_drv_flags & IFF_DRV_RUNNING) { 1003 flags = pi->if_flags; 1004 if ((ifp->if_flags ^ flags) & 1005 (IFF_PROMISC | IFF_ALLMULTI)) { 1006 if (IS_BUSY(sc)) { 1007 rc = EBUSY; 1008 goto fail; 1009 } 1010 PORT_LOCK(pi); 1011 rc = update_mac_settings(pi, 1012 XGMAC_PROMISC | XGMAC_ALLMULTI); 1013 PORT_UNLOCK(pi); 1014 } 1015 ADAPTER_UNLOCK(sc); 1016 } else 1017 rc = cxgbe_init_locked(pi); 1018 pi->if_flags = ifp->if_flags; 1019 } else if (ifp->if_drv_flags & IFF_DRV_RUNNING) 1020 rc = cxgbe_uninit_locked(pi); 1021 else 1022 ADAPTER_UNLOCK(sc); 1023 1024 ADAPTER_LOCK_ASSERT_NOTOWNED(sc); 1025 break; 1026 1027 case SIOCADDMULTI: 1028 case SIOCDELMULTI: /* these two can be called with a mutex held :-( */ 1029 ADAPTER_LOCK(sc); 1030 rc = IS_DOOMED(pi) ? ENXIO : (IS_BUSY(sc) ? EBUSY : 0); 1031 if (rc) 1032 goto fail; 1033 1034 if (ifp->if_drv_flags & IFF_DRV_RUNNING) { 1035 PORT_LOCK(pi); 1036 rc = update_mac_settings(pi, XGMAC_MCADDRS); 1037 PORT_UNLOCK(pi); 1038 } 1039 ADAPTER_UNLOCK(sc); 1040 break; 1041 1042 case SIOCSIFCAP: 1043 ADAPTER_LOCK(sc); 1044 rc = IS_DOOMED(pi) ? ENXIO : (IS_BUSY(sc) ? EBUSY : 0); 1045 if (rc) 1046 goto fail; 1047 1048 mask = ifr->ifr_reqcap ^ ifp->if_capenable; 1049 if (mask & IFCAP_TXCSUM) { 1050 ifp->if_capenable ^= IFCAP_TXCSUM; 1051 ifp->if_hwassist ^= (CSUM_TCP | CSUM_UDP | CSUM_IP); 1052 1053 if (IFCAP_TSO4 & ifp->if_capenable && 1054 !(IFCAP_TXCSUM & ifp->if_capenable)) { 1055 ifp->if_capenable &= ~IFCAP_TSO4; 1056 if_printf(ifp, 1057 "tso4 disabled due to -txcsum.\n"); 1058 } 1059 } 1060 if (mask & IFCAP_TXCSUM_IPV6) { 1061 ifp->if_capenable ^= IFCAP_TXCSUM_IPV6; 1062 ifp->if_hwassist ^= (CSUM_UDP_IPV6 | CSUM_TCP_IPV6); 1063 1064 if (IFCAP_TSO6 & ifp->if_capenable && 1065 !(IFCAP_TXCSUM_IPV6 & ifp->if_capenable)) { 1066 ifp->if_capenable &= ~IFCAP_TSO6; 1067 if_printf(ifp, 1068 "tso6 disabled due to -txcsum6.\n"); 1069 } 1070 } 1071 if (mask & IFCAP_RXCSUM) 1072 ifp->if_capenable ^= IFCAP_RXCSUM; 1073 if (mask & IFCAP_RXCSUM_IPV6) 1074 ifp->if_capenable ^= IFCAP_RXCSUM_IPV6; 1075 1076 /* 1077 * Note that we leave CSUM_TSO alone (it is always set). The 1078 * kernel takes both IFCAP_TSOx and CSUM_TSO into account before 1079 * sending a TSO request our way, so it's sufficient to toggle 1080 * IFCAP_TSOx only. 1081 */ 1082 if (mask & IFCAP_TSO4) { 1083 if (!(IFCAP_TSO4 & ifp->if_capenable) && 1084 !(IFCAP_TXCSUM & ifp->if_capenable)) { 1085 if_printf(ifp, "enable txcsum first.\n"); 1086 rc = EAGAIN; 1087 goto fail; 1088 } 1089 ifp->if_capenable ^= IFCAP_TSO4; 1090 } 1091 if (mask & IFCAP_TSO6) { 1092 if (!(IFCAP_TSO6 & ifp->if_capenable) && 1093 !(IFCAP_TXCSUM_IPV6 & ifp->if_capenable)) { 1094 if_printf(ifp, "enable txcsum6 first.\n"); 1095 rc = EAGAIN; 1096 goto fail; 1097 } 1098 ifp->if_capenable ^= IFCAP_TSO6; 1099 } 1100 if (mask & IFCAP_LRO) { 1101 #if defined(INET) || defined(INET6) 1102 int i; 1103 struct sge_rxq *rxq; 1104 1105 ifp->if_capenable ^= IFCAP_LRO; 1106 for_each_rxq(pi, i, rxq) { 1107 if (ifp->if_capenable & IFCAP_LRO) 1108 rxq->iq.flags |= IQ_LRO_ENABLED; 1109 else 1110 rxq->iq.flags &= ~IQ_LRO_ENABLED; 1111 } 1112 #endif 1113 } 1114 #ifdef TCP_OFFLOAD 1115 if (mask & IFCAP_TOE) { 1116 int enable = (ifp->if_capenable ^ mask) & IFCAP_TOE; 1117 1118 rc = toe_capability(pi, enable); 1119 if (rc != 0) 1120 goto fail; 1121 1122 ifp->if_capenable ^= mask; 1123 } 1124 #endif 1125 if (mask & IFCAP_VLAN_HWTAGGING) { 1126 ifp->if_capenable ^= IFCAP_VLAN_HWTAGGING; 1127 if (ifp->if_drv_flags & IFF_DRV_RUNNING) { 1128 PORT_LOCK(pi); 1129 rc = update_mac_settings(pi, XGMAC_VLANEX); 1130 PORT_UNLOCK(pi); 1131 } 1132 } 1133 if (mask & IFCAP_VLAN_MTU) { 1134 ifp->if_capenable ^= IFCAP_VLAN_MTU; 1135 1136 /* Need to find out how to disable auto-mtu-inflation */ 1137 } 1138 if (mask & IFCAP_VLAN_HWTSO) 1139 ifp->if_capenable ^= IFCAP_VLAN_HWTSO; 1140 if (mask & IFCAP_VLAN_HWCSUM) 1141 ifp->if_capenable ^= IFCAP_VLAN_HWCSUM; 1142 1143 #ifdef VLAN_CAPABILITIES 1144 VLAN_CAPABILITIES(ifp); 1145 #endif 1146 ADAPTER_UNLOCK(sc); 1147 break; 1148 1149 case SIOCSIFMEDIA: 1150 case SIOCGIFMEDIA: 1151 ifmedia_ioctl(ifp, ifr, &pi->media, cmd); 1152 break; 1153 1154 default: 1155 rc = ether_ioctl(ifp, cmd, data); 1156 } 1157 1158 return (rc); 1159 } 1160 1161 static int 1162 cxgbe_transmit(struct ifnet *ifp, struct mbuf *m) 1163 { 1164 struct port_info *pi = ifp->if_softc; 1165 struct adapter *sc = pi->adapter; 1166 struct sge_txq *txq = &sc->sge.txq[pi->first_txq]; 1167 struct buf_ring *br; 1168 int rc; 1169 1170 M_ASSERTPKTHDR(m); 1171 1172 if (__predict_false(pi->link_cfg.link_ok == 0)) { 1173 m_freem(m); 1174 return (ENETDOWN); 1175 } 1176 1177 if (m->m_flags & M_FLOWID) 1178 txq += (m->m_pkthdr.flowid % pi->ntxq); 1179 br = txq->br; 1180 1181 if (TXQ_TRYLOCK(txq) == 0) { 1182 struct sge_eq *eq = &txq->eq; 1183 1184 /* 1185 * It is possible that t4_eth_tx finishes up and releases the 1186 * lock between the TRYLOCK above and the drbr_enqueue here. We 1187 * need to make sure that this mbuf doesn't just sit there in 1188 * the drbr. 1189 */ 1190 1191 rc = drbr_enqueue(ifp, br, m); 1192 if (rc == 0 && callout_pending(&eq->tx_callout) == 0 && 1193 !(eq->flags & EQ_DOOMED)) 1194 callout_reset(&eq->tx_callout, 1, t4_tx_callout, eq); 1195 return (rc); 1196 } 1197 1198 /* 1199 * txq->m is the mbuf that is held up due to a temporary shortage of 1200 * resources and it should be put on the wire first. Then what's in 1201 * drbr and finally the mbuf that was just passed in to us. 1202 * 1203 * Return code should indicate the fate of the mbuf that was passed in 1204 * this time. 1205 */ 1206 1207 TXQ_LOCK_ASSERT_OWNED(txq); 1208 if (drbr_needs_enqueue(ifp, br) || txq->m) { 1209 1210 /* Queued for transmission. */ 1211 1212 rc = drbr_enqueue(ifp, br, m); 1213 m = txq->m ? txq->m : drbr_dequeue(ifp, br); 1214 (void) t4_eth_tx(ifp, txq, m); 1215 TXQ_UNLOCK(txq); 1216 return (rc); 1217 } 1218 1219 /* Direct transmission. */ 1220 rc = t4_eth_tx(ifp, txq, m); 1221 if (rc != 0 && txq->m) 1222 rc = 0; /* held, will be transmitted soon (hopefully) */ 1223 1224 TXQ_UNLOCK(txq); 1225 return (rc); 1226 } 1227 1228 static void 1229 cxgbe_qflush(struct ifnet *ifp) 1230 { 1231 struct port_info *pi = ifp->if_softc; 1232 struct sge_txq *txq; 1233 int i; 1234 struct mbuf *m; 1235 1236 /* queues do not exist if !PORT_INIT_DONE. */ 1237 if (pi->flags & PORT_INIT_DONE) { 1238 for_each_txq(pi, i, txq) { 1239 TXQ_LOCK(txq); 1240 m_freem(txq->m); 1241 txq->m = NULL; 1242 while ((m = buf_ring_dequeue_sc(txq->br)) != NULL) 1243 m_freem(m); 1244 TXQ_UNLOCK(txq); 1245 } 1246 } 1247 if_qflush(ifp); 1248 } 1249 1250 static int 1251 cxgbe_media_change(struct ifnet *ifp) 1252 { 1253 struct port_info *pi = ifp->if_softc; 1254 1255 device_printf(pi->dev, "%s unimplemented.\n", __func__); 1256 1257 return (EOPNOTSUPP); 1258 } 1259 1260 static void 1261 cxgbe_media_status(struct ifnet *ifp, struct ifmediareq *ifmr) 1262 { 1263 struct port_info *pi = ifp->if_softc; 1264 struct ifmedia_entry *cur = pi->media.ifm_cur; 1265 int speed = pi->link_cfg.speed; 1266 int data = (pi->port_type << 8) | pi->mod_type; 1267 1268 if (cur->ifm_data != data) { 1269 build_medialist(pi); 1270 cur = pi->media.ifm_cur; 1271 } 1272 1273 ifmr->ifm_status = IFM_AVALID; 1274 if (!pi->link_cfg.link_ok) 1275 return; 1276 1277 ifmr->ifm_status |= IFM_ACTIVE; 1278 1279 /* active and current will differ iff current media is autoselect. */ 1280 if (IFM_SUBTYPE(cur->ifm_media) != IFM_AUTO) 1281 return; 1282 1283 ifmr->ifm_active = IFM_ETHER | IFM_FDX; 1284 if (speed == SPEED_10000) 1285 ifmr->ifm_active |= IFM_10G_T; 1286 else if (speed == SPEED_1000) 1287 ifmr->ifm_active |= IFM_1000_T; 1288 else if (speed == SPEED_100) 1289 ifmr->ifm_active |= IFM_100_TX; 1290 else if (speed == SPEED_10) 1291 ifmr->ifm_active |= IFM_10_T; 1292 else 1293 KASSERT(0, ("%s: link up but speed unknown (%u)", __func__, 1294 speed)); 1295 } 1296 1297 void 1298 t4_fatal_err(struct adapter *sc) 1299 { 1300 t4_set_reg_field(sc, A_SGE_CONTROL, F_GLOBALENABLE, 0); 1301 t4_intr_disable(sc); 1302 log(LOG_EMERG, "%s: encountered fatal error, adapter stopped.\n", 1303 device_get_nameunit(sc->dev)); 1304 } 1305 1306 static int 1307 map_bars(struct adapter *sc) 1308 { 1309 sc->regs_rid = PCIR_BAR(0); 1310 sc->regs_res = bus_alloc_resource_any(sc->dev, SYS_RES_MEMORY, 1311 &sc->regs_rid, RF_ACTIVE); 1312 if (sc->regs_res == NULL) { 1313 device_printf(sc->dev, "cannot map registers.\n"); 1314 return (ENXIO); 1315 } 1316 sc->bt = rman_get_bustag(sc->regs_res); 1317 sc->bh = rman_get_bushandle(sc->regs_res); 1318 sc->mmio_len = rman_get_size(sc->regs_res); 1319 1320 sc->msix_rid = PCIR_BAR(4); 1321 sc->msix_res = bus_alloc_resource_any(sc->dev, SYS_RES_MEMORY, 1322 &sc->msix_rid, RF_ACTIVE); 1323 if (sc->msix_res == NULL) { 1324 device_printf(sc->dev, "cannot map MSI-X BAR.\n"); 1325 return (ENXIO); 1326 } 1327 1328 return (0); 1329 } 1330 1331 static void 1332 setup_memwin(struct adapter *sc) 1333 { 1334 uint32_t bar0; 1335 1336 /* 1337 * Read low 32b of bar0 indirectly via the hardware backdoor mechanism. 1338 * Works from within PCI passthrough environments too, where 1339 * rman_get_start() can return a different value. We need to program 1340 * the memory window decoders with the actual addresses that will be 1341 * coming across the PCIe link. 1342 */ 1343 bar0 = t4_hw_pci_read_cfg4(sc, PCIR_BAR(0)); 1344 bar0 &= (uint32_t) PCIM_BAR_MEM_BASE; 1345 1346 t4_write_reg(sc, PCIE_MEM_ACCESS_REG(A_PCIE_MEM_ACCESS_BASE_WIN, 0), 1347 (bar0 + MEMWIN0_BASE) | V_BIR(0) | 1348 V_WINDOW(ilog2(MEMWIN0_APERTURE) - 10)); 1349 1350 t4_write_reg(sc, PCIE_MEM_ACCESS_REG(A_PCIE_MEM_ACCESS_BASE_WIN, 1), 1351 (bar0 + MEMWIN1_BASE) | V_BIR(0) | 1352 V_WINDOW(ilog2(MEMWIN1_APERTURE) - 10)); 1353 1354 t4_write_reg(sc, PCIE_MEM_ACCESS_REG(A_PCIE_MEM_ACCESS_BASE_WIN, 2), 1355 (bar0 + MEMWIN2_BASE) | V_BIR(0) | 1356 V_WINDOW(ilog2(MEMWIN2_APERTURE) - 10)); 1357 1358 /* flush */ 1359 t4_read_reg(sc, PCIE_MEM_ACCESS_REG(A_PCIE_MEM_ACCESS_BASE_WIN, 2)); 1360 } 1361 1362 static int 1363 cfg_itype_and_nqueues(struct adapter *sc, int n10g, int n1g, 1364 struct intrs_and_queues *iaq) 1365 { 1366 int rc, itype, navail, nrxq10g, nrxq1g, n; 1367 int nofldrxq10g = 0, nofldrxq1g = 0; 1368 1369 bzero(iaq, sizeof(*iaq)); 1370 1371 iaq->ntxq10g = t4_ntxq10g; 1372 iaq->ntxq1g = t4_ntxq1g; 1373 iaq->nrxq10g = nrxq10g = t4_nrxq10g; 1374 iaq->nrxq1g = nrxq1g = t4_nrxq1g; 1375 #ifdef TCP_OFFLOAD 1376 if (is_offload(sc)) { 1377 iaq->nofldtxq10g = t4_nofldtxq10g; 1378 iaq->nofldtxq1g = t4_nofldtxq1g; 1379 iaq->nofldrxq10g = nofldrxq10g = t4_nofldrxq10g; 1380 iaq->nofldrxq1g = nofldrxq1g = t4_nofldrxq1g; 1381 } 1382 #endif 1383 1384 for (itype = INTR_MSIX; itype; itype >>= 1) { 1385 1386 if ((itype & t4_intr_types) == 0) 1387 continue; /* not allowed */ 1388 1389 if (itype == INTR_MSIX) 1390 navail = pci_msix_count(sc->dev); 1391 else if (itype == INTR_MSI) 1392 navail = pci_msi_count(sc->dev); 1393 else 1394 navail = 1; 1395 restart: 1396 if (navail == 0) 1397 continue; 1398 1399 iaq->intr_type = itype; 1400 iaq->intr_flags = 0; 1401 1402 /* 1403 * Best option: an interrupt vector for errors, one for the 1404 * firmware event queue, and one each for each rxq (NIC as well 1405 * as offload). 1406 */ 1407 iaq->nirq = T4_EXTRA_INTR; 1408 iaq->nirq += n10g * (nrxq10g + nofldrxq10g); 1409 iaq->nirq += n1g * (nrxq1g + nofldrxq1g); 1410 if (iaq->nirq <= navail && 1411 (itype != INTR_MSI || powerof2(iaq->nirq))) { 1412 iaq->intr_flags |= INTR_DIRECT; 1413 goto allocate; 1414 } 1415 1416 /* 1417 * Second best option: an interrupt vector for errors, one for 1418 * the firmware event queue, and one each for either NIC or 1419 * offload rxq's. 1420 */ 1421 iaq->nirq = T4_EXTRA_INTR; 1422 iaq->nirq += n10g * max(nrxq10g, nofldrxq10g); 1423 iaq->nirq += n1g * max(nrxq1g, nofldrxq1g); 1424 if (iaq->nirq <= navail && 1425 (itype != INTR_MSI || powerof2(iaq->nirq))) 1426 goto allocate; 1427 1428 /* 1429 * Next best option: an interrupt vector for errors, one for the 1430 * firmware event queue, and at least one per port. At this 1431 * point we know we'll have to downsize nrxq or nofldrxq to fit 1432 * what's available to us. 1433 */ 1434 iaq->nirq = T4_EXTRA_INTR; 1435 iaq->nirq += n10g + n1g; 1436 if (iaq->nirq <= navail) { 1437 int leftover = navail - iaq->nirq; 1438 1439 if (n10g > 0) { 1440 int target = max(nrxq10g, nofldrxq10g); 1441 1442 n = 1; 1443 while (n < target && leftover >= n10g) { 1444 leftover -= n10g; 1445 iaq->nirq += n10g; 1446 n++; 1447 } 1448 iaq->nrxq10g = min(n, nrxq10g); 1449 #ifdef TCP_OFFLOAD 1450 if (is_offload(sc)) 1451 iaq->nofldrxq10g = min(n, nofldrxq10g); 1452 #endif 1453 } 1454 1455 if (n1g > 0) { 1456 int target = max(nrxq1g, nofldrxq1g); 1457 1458 n = 1; 1459 while (n < target && leftover >= n1g) { 1460 leftover -= n1g; 1461 iaq->nirq += n1g; 1462 n++; 1463 } 1464 iaq->nrxq1g = min(n, nrxq1g); 1465 #ifdef TCP_OFFLOAD 1466 if (is_offload(sc)) 1467 iaq->nofldrxq1g = min(n, nofldrxq1g); 1468 #endif 1469 } 1470 1471 if (itype != INTR_MSI || powerof2(iaq->nirq)) 1472 goto allocate; 1473 } 1474 1475 /* 1476 * Least desirable option: one interrupt vector for everything. 1477 */ 1478 iaq->nirq = iaq->nrxq10g = iaq->nrxq1g = 1; 1479 #ifdef TCP_OFFLOAD 1480 if (is_offload(sc)) 1481 iaq->nofldrxq10g = iaq->nofldrxq1g = 1; 1482 #endif 1483 1484 allocate: 1485 navail = iaq->nirq; 1486 rc = 0; 1487 if (itype == INTR_MSIX) 1488 rc = pci_alloc_msix(sc->dev, &navail); 1489 else if (itype == INTR_MSI) 1490 rc = pci_alloc_msi(sc->dev, &navail); 1491 1492 if (rc == 0) { 1493 if (navail == iaq->nirq) 1494 return (0); 1495 1496 /* 1497 * Didn't get the number requested. Use whatever number 1498 * the kernel is willing to allocate (it's in navail). 1499 */ 1500 device_printf(sc->dev, "fewer vectors than requested, " 1501 "type=%d, req=%d, rcvd=%d; will downshift req.\n", 1502 itype, iaq->nirq, navail); 1503 pci_release_msi(sc->dev); 1504 goto restart; 1505 } 1506 1507 device_printf(sc->dev, 1508 "failed to allocate vectors:%d, type=%d, req=%d, rcvd=%d\n", 1509 itype, rc, iaq->nirq, navail); 1510 } 1511 1512 device_printf(sc->dev, 1513 "failed to find a usable interrupt type. " 1514 "allowed=%d, msi-x=%d, msi=%d, intx=1", t4_intr_types, 1515 pci_msix_count(sc->dev), pci_msi_count(sc->dev)); 1516 1517 return (ENXIO); 1518 } 1519 1520 /* 1521 * Install a compatible firmware (if required), establish contact with it (by 1522 * saying hello), and reset the device. If we end up as the master driver, 1523 * partition adapter resources by providing a configuration file to the 1524 * firmware. 1525 */ 1526 static int 1527 prep_firmware(struct adapter *sc) 1528 { 1529 const struct firmware *fw = NULL, *cfg = NULL, *default_cfg; 1530 int rc; 1531 enum dev_state state; 1532 1533 default_cfg = firmware_get(T4_CFGNAME); 1534 1535 /* Check firmware version and install a different one if necessary */ 1536 rc = t4_check_fw_version(sc); 1537 snprintf(sc->fw_version, sizeof(sc->fw_version), "%u.%u.%u.%u", 1538 G_FW_HDR_FW_VER_MAJOR(sc->params.fw_vers), 1539 G_FW_HDR_FW_VER_MINOR(sc->params.fw_vers), 1540 G_FW_HDR_FW_VER_MICRO(sc->params.fw_vers), 1541 G_FW_HDR_FW_VER_BUILD(sc->params.fw_vers)); 1542 if (rc != 0) { 1543 uint32_t v = 0; 1544 1545 fw = firmware_get(T4_FWNAME); 1546 if (fw != NULL) { 1547 const struct fw_hdr *hdr = (const void *)fw->data; 1548 1549 v = ntohl(hdr->fw_ver); 1550 1551 /* 1552 * The firmware module will not be used if it isn't the 1553 * same major version as what the driver was compiled 1554 * with. 1555 */ 1556 if (G_FW_HDR_FW_VER_MAJOR(v) != FW_VERSION_MAJOR) { 1557 device_printf(sc->dev, 1558 "Found firmware image but version %d " 1559 "can not be used with this driver (%d)\n", 1560 G_FW_HDR_FW_VER_MAJOR(v), FW_VERSION_MAJOR); 1561 1562 firmware_put(fw, FIRMWARE_UNLOAD); 1563 fw = NULL; 1564 } 1565 } 1566 1567 if (fw == NULL && rc < 0) { 1568 device_printf(sc->dev, "No usable firmware. " 1569 "card has %d.%d.%d, driver compiled with %d.%d.%d", 1570 G_FW_HDR_FW_VER_MAJOR(sc->params.fw_vers), 1571 G_FW_HDR_FW_VER_MINOR(sc->params.fw_vers), 1572 G_FW_HDR_FW_VER_MICRO(sc->params.fw_vers), 1573 FW_VERSION_MAJOR, FW_VERSION_MINOR, 1574 FW_VERSION_MICRO); 1575 rc = EAGAIN; 1576 goto done; 1577 } 1578 1579 /* 1580 * Always upgrade, even for minor/micro/build mismatches. 1581 * Downgrade only for a major version mismatch or if 1582 * force_firmware_install was specified. 1583 */ 1584 if (fw != NULL && (rc < 0 || v > sc->params.fw_vers)) { 1585 device_printf(sc->dev, 1586 "installing firmware %d.%d.%d.%d on card.\n", 1587 G_FW_HDR_FW_VER_MAJOR(v), G_FW_HDR_FW_VER_MINOR(v), 1588 G_FW_HDR_FW_VER_MICRO(v), G_FW_HDR_FW_VER_BUILD(v)); 1589 1590 rc = -t4_load_fw(sc, fw->data, fw->datasize); 1591 if (rc != 0) { 1592 device_printf(sc->dev, 1593 "failed to install firmware: %d\n", rc); 1594 goto done; 1595 } else { 1596 /* refresh */ 1597 (void) t4_check_fw_version(sc); 1598 snprintf(sc->fw_version, 1599 sizeof(sc->fw_version), "%u.%u.%u.%u", 1600 G_FW_HDR_FW_VER_MAJOR(sc->params.fw_vers), 1601 G_FW_HDR_FW_VER_MINOR(sc->params.fw_vers), 1602 G_FW_HDR_FW_VER_MICRO(sc->params.fw_vers), 1603 G_FW_HDR_FW_VER_BUILD(sc->params.fw_vers)); 1604 } 1605 } 1606 } 1607 1608 /* Contact firmware. */ 1609 rc = t4_fw_hello(sc, sc->mbox, sc->mbox, MASTER_MAY, &state); 1610 if (rc < 0) { 1611 rc = -rc; 1612 device_printf(sc->dev, 1613 "failed to connect to the firmware: %d.\n", rc); 1614 goto done; 1615 } 1616 if (rc == sc->mbox) 1617 sc->flags |= MASTER_PF; 1618 1619 /* Reset device */ 1620 rc = -t4_fw_reset(sc, sc->mbox, F_PIORSTMODE | F_PIORST); 1621 if (rc != 0) { 1622 device_printf(sc->dev, "firmware reset failed: %d.\n", rc); 1623 if (rc != ETIMEDOUT && rc != EIO) 1624 t4_fw_bye(sc, sc->mbox); 1625 goto done; 1626 } 1627 1628 /* Partition adapter resources as specified in the config file. */ 1629 if (sc->flags & MASTER_PF) { 1630 if (strncmp(t4_cfg_file, "default", sizeof(t4_cfg_file))) { 1631 char s[32]; 1632 1633 snprintf(s, sizeof(s), "t4fw_cfg_%s", t4_cfg_file); 1634 cfg = firmware_get(s); 1635 if (cfg == NULL) { 1636 device_printf(sc->dev, 1637 "unable to locate %s module, " 1638 "will use default config file.\n", s); 1639 } 1640 } 1641 1642 rc = partition_resources(sc, cfg ? cfg : default_cfg); 1643 if (rc != 0) 1644 goto done; /* error message displayed already */ 1645 } 1646 1647 sc->flags |= FW_OK; 1648 1649 done: 1650 if (fw != NULL) 1651 firmware_put(fw, FIRMWARE_UNLOAD); 1652 if (cfg != NULL) 1653 firmware_put(cfg, FIRMWARE_UNLOAD); 1654 if (default_cfg != NULL) 1655 firmware_put(default_cfg, FIRMWARE_UNLOAD); 1656 1657 return (rc); 1658 } 1659 1660 #define FW_PARAM_DEV(param) \ 1661 (V_FW_PARAMS_MNEM(FW_PARAMS_MNEM_DEV) | \ 1662 V_FW_PARAMS_PARAM_X(FW_PARAMS_PARAM_DEV_##param)) 1663 #define FW_PARAM_PFVF(param) \ 1664 (V_FW_PARAMS_MNEM(FW_PARAMS_MNEM_PFVF) | \ 1665 V_FW_PARAMS_PARAM_X(FW_PARAMS_PARAM_PFVF_##param)) 1666 1667 /* 1668 * Upload configuration file to card's memory. 1669 */ 1670 static int 1671 upload_config_file(struct adapter *sc, const struct firmware *fw, uint32_t *mt, 1672 uint32_t *ma) 1673 { 1674 int rc, i; 1675 uint32_t param, val, mtype, maddr, bar, off, win, remaining; 1676 const uint32_t *b; 1677 1678 /* Figure out where the firmware wants us to upload it. */ 1679 param = FW_PARAM_DEV(CF); 1680 rc = -t4_query_params(sc, sc->mbox, sc->pf, 0, 1, ¶m, &val); 1681 if (rc != 0) { 1682 /* Firmwares without config file support will fail this way */ 1683 device_printf(sc->dev, 1684 "failed to query config file location: %d.\n", rc); 1685 return (rc); 1686 } 1687 *mt = mtype = G_FW_PARAMS_PARAM_Y(val); 1688 *ma = maddr = G_FW_PARAMS_PARAM_Z(val) << 16; 1689 1690 if (maddr & 3) { 1691 device_printf(sc->dev, 1692 "cannot upload config file (type %u, addr %x).\n", 1693 mtype, maddr); 1694 return (EFAULT); 1695 } 1696 1697 /* Translate mtype/maddr to an address suitable for the PCIe window */ 1698 val = t4_read_reg(sc, A_MA_TARGET_MEM_ENABLE); 1699 val &= F_EDRAM0_ENABLE | F_EDRAM1_ENABLE | F_EXT_MEM_ENABLE; 1700 switch (mtype) { 1701 case FW_MEMTYPE_CF_EDC0: 1702 if (!(val & F_EDRAM0_ENABLE)) 1703 goto err; 1704 bar = t4_read_reg(sc, A_MA_EDRAM0_BAR); 1705 maddr += G_EDRAM0_BASE(bar) << 20; 1706 break; 1707 1708 case FW_MEMTYPE_CF_EDC1: 1709 if (!(val & F_EDRAM1_ENABLE)) 1710 goto err; 1711 bar = t4_read_reg(sc, A_MA_EDRAM1_BAR); 1712 maddr += G_EDRAM1_BASE(bar) << 20; 1713 break; 1714 1715 case FW_MEMTYPE_CF_EXTMEM: 1716 if (!(val & F_EXT_MEM_ENABLE)) 1717 goto err; 1718 bar = t4_read_reg(sc, A_MA_EXT_MEMORY_BAR); 1719 maddr += G_EXT_MEM_BASE(bar) << 20; 1720 break; 1721 1722 default: 1723 err: 1724 device_printf(sc->dev, 1725 "cannot upload config file (type %u, enabled %u).\n", 1726 mtype, val); 1727 return (EFAULT); 1728 } 1729 1730 /* 1731 * Position the PCIe window (we use memwin2) to the 16B aligned area 1732 * just at/before the upload location. 1733 */ 1734 win = maddr & ~0xf; 1735 off = maddr - win; /* offset from the start of the window. */ 1736 t4_write_reg(sc, PCIE_MEM_ACCESS_REG(A_PCIE_MEM_ACCESS_OFFSET, 2), win); 1737 t4_read_reg(sc, PCIE_MEM_ACCESS_REG(A_PCIE_MEM_ACCESS_OFFSET, 2)); 1738 1739 remaining = fw->datasize; 1740 if (remaining > FLASH_CFG_MAX_SIZE || 1741 remaining > MEMWIN2_APERTURE - off) { 1742 device_printf(sc->dev, "cannot upload config file all at once " 1743 "(size %u, max %u, room %u).\n", 1744 remaining, FLASH_CFG_MAX_SIZE, MEMWIN2_APERTURE - off); 1745 return (EFBIG); 1746 } 1747 1748 /* 1749 * XXX: sheer laziness. We deliberately added 4 bytes of useless 1750 * stuffing/comments at the end of the config file so it's ok to simply 1751 * throw away the last remaining bytes when the config file is not an 1752 * exact multiple of 4. 1753 */ 1754 b = fw->data; 1755 for (i = 0; remaining >= 4; i += 4, remaining -= 4) 1756 t4_write_reg(sc, MEMWIN2_BASE + off + i, *b++); 1757 1758 return (rc); 1759 } 1760 1761 /* 1762 * Partition chip resources for use between various PFs, VFs, etc. This is done 1763 * by uploading the firmware configuration file to the adapter and instructing 1764 * the firmware to process it. 1765 */ 1766 static int 1767 partition_resources(struct adapter *sc, const struct firmware *cfg) 1768 { 1769 int rc; 1770 struct fw_caps_config_cmd caps; 1771 uint32_t mtype, maddr, finicsum, cfcsum; 1772 1773 rc = cfg ? upload_config_file(sc, cfg, &mtype, &maddr) : ENOENT; 1774 if (rc != 0) { 1775 mtype = FW_MEMTYPE_CF_FLASH; 1776 maddr = t4_flash_cfg_addr(sc); 1777 } 1778 1779 bzero(&caps, sizeof(caps)); 1780 caps.op_to_write = htobe32(V_FW_CMD_OP(FW_CAPS_CONFIG_CMD) | 1781 F_FW_CMD_REQUEST | F_FW_CMD_READ); 1782 caps.cfvalid_to_len16 = htobe32(F_FW_CAPS_CONFIG_CMD_CFVALID | 1783 V_FW_CAPS_CONFIG_CMD_MEMTYPE_CF(mtype) | 1784 V_FW_CAPS_CONFIG_CMD_MEMADDR64K_CF(maddr >> 16) | FW_LEN16(caps)); 1785 rc = -t4_wr_mbox(sc, sc->mbox, &caps, sizeof(caps), &caps); 1786 if (rc != 0) { 1787 device_printf(sc->dev, 1788 "failed to pre-process config file: %d.\n", rc); 1789 return (rc); 1790 } 1791 1792 finicsum = be32toh(caps.finicsum); 1793 cfcsum = be32toh(caps.cfcsum); 1794 if (finicsum != cfcsum) { 1795 device_printf(sc->dev, 1796 "WARNING: config file checksum mismatch: %08x %08x\n", 1797 finicsum, cfcsum); 1798 } 1799 sc->cfcsum = cfcsum; 1800 1801 #define LIMIT_CAPS(x) do { \ 1802 caps.x &= htobe16(t4_##x##_allowed); \ 1803 sc->x = htobe16(caps.x); \ 1804 } while (0) 1805 1806 /* 1807 * Let the firmware know what features will (not) be used so it can tune 1808 * things accordingly. 1809 */ 1810 LIMIT_CAPS(linkcaps); 1811 LIMIT_CAPS(niccaps); 1812 LIMIT_CAPS(toecaps); 1813 LIMIT_CAPS(rdmacaps); 1814 LIMIT_CAPS(iscsicaps); 1815 LIMIT_CAPS(fcoecaps); 1816 #undef LIMIT_CAPS 1817 1818 caps.op_to_write = htobe32(V_FW_CMD_OP(FW_CAPS_CONFIG_CMD) | 1819 F_FW_CMD_REQUEST | F_FW_CMD_WRITE); 1820 caps.cfvalid_to_len16 = htobe32(FW_LEN16(caps)); 1821 rc = -t4_wr_mbox(sc, sc->mbox, &caps, sizeof(caps), NULL); 1822 if (rc != 0) { 1823 device_printf(sc->dev, 1824 "failed to process config file: %d.\n", rc); 1825 return (rc); 1826 } 1827 1828 return (0); 1829 } 1830 1831 /* 1832 * Retrieve parameters that are needed (or nice to have) prior to calling 1833 * t4_sge_init and t4_fw_initialize. 1834 */ 1835 static int 1836 get_params__pre_init(struct adapter *sc) 1837 { 1838 int rc; 1839 uint32_t param[2], val[2]; 1840 struct fw_devlog_cmd cmd; 1841 struct devlog_params *dlog = &sc->params.devlog; 1842 1843 param[0] = FW_PARAM_DEV(PORTVEC); 1844 param[1] = FW_PARAM_DEV(CCLK); 1845 rc = -t4_query_params(sc, sc->mbox, sc->pf, 0, 2, param, val); 1846 if (rc != 0) { 1847 device_printf(sc->dev, 1848 "failed to query parameters (pre_init): %d.\n", rc); 1849 return (rc); 1850 } 1851 1852 sc->params.portvec = val[0]; 1853 sc->params.nports = bitcount32(val[0]); 1854 sc->params.vpd.cclk = val[1]; 1855 1856 /* Read device log parameters. */ 1857 bzero(&cmd, sizeof(cmd)); 1858 cmd.op_to_write = htobe32(V_FW_CMD_OP(FW_DEVLOG_CMD) | 1859 F_FW_CMD_REQUEST | F_FW_CMD_READ); 1860 cmd.retval_len16 = htobe32(FW_LEN16(cmd)); 1861 rc = -t4_wr_mbox(sc, sc->mbox, &cmd, sizeof(cmd), &cmd); 1862 if (rc != 0) { 1863 device_printf(sc->dev, 1864 "failed to get devlog parameters: %d.\n", rc); 1865 bzero(dlog, sizeof (*dlog)); 1866 rc = 0; /* devlog isn't critical for device operation */ 1867 } else { 1868 val[0] = be32toh(cmd.memtype_devlog_memaddr16_devlog); 1869 dlog->memtype = G_FW_DEVLOG_CMD_MEMTYPE_DEVLOG(val[0]); 1870 dlog->start = G_FW_DEVLOG_CMD_MEMADDR16_DEVLOG(val[0]) << 4; 1871 dlog->size = be32toh(cmd.memsize_devlog); 1872 } 1873 1874 return (rc); 1875 } 1876 1877 /* 1878 * Retrieve various parameters that are of interest to the driver. The device 1879 * has been initialized by the firmware at this point. 1880 */ 1881 static int 1882 get_params__post_init(struct adapter *sc) 1883 { 1884 int rc; 1885 uint32_t param[7], val[7]; 1886 struct fw_caps_config_cmd caps; 1887 1888 param[0] = FW_PARAM_PFVF(IQFLINT_START); 1889 param[1] = FW_PARAM_PFVF(EQ_START); 1890 param[2] = FW_PARAM_PFVF(FILTER_START); 1891 param[3] = FW_PARAM_PFVF(FILTER_END); 1892 rc = -t4_query_params(sc, sc->mbox, sc->pf, 0, 4, param, val); 1893 if (rc != 0) { 1894 device_printf(sc->dev, 1895 "failed to query parameters (post_init): %d.\n", rc); 1896 return (rc); 1897 } 1898 1899 sc->sge.iq_start = val[0]; 1900 sc->sge.eq_start = val[1]; 1901 sc->tids.ftid_base = val[2]; 1902 sc->tids.nftids = val[3] - val[2] + 1; 1903 1904 /* get capabilites */ 1905 bzero(&caps, sizeof(caps)); 1906 caps.op_to_write = htobe32(V_FW_CMD_OP(FW_CAPS_CONFIG_CMD) | 1907 F_FW_CMD_REQUEST | F_FW_CMD_READ); 1908 caps.cfvalid_to_len16 = htobe32(FW_LEN16(caps)); 1909 rc = -t4_wr_mbox(sc, sc->mbox, &caps, sizeof(caps), &caps); 1910 if (rc != 0) { 1911 device_printf(sc->dev, 1912 "failed to get card capabilities: %d.\n", rc); 1913 return (rc); 1914 } 1915 1916 if (caps.toecaps) { 1917 /* query offload-related parameters */ 1918 param[0] = FW_PARAM_DEV(NTID); 1919 param[1] = FW_PARAM_PFVF(SERVER_START); 1920 param[2] = FW_PARAM_PFVF(SERVER_END); 1921 param[3] = FW_PARAM_PFVF(TDDP_START); 1922 param[4] = FW_PARAM_PFVF(TDDP_END); 1923 param[5] = FW_PARAM_DEV(FLOWC_BUFFIFO_SZ); 1924 rc = -t4_query_params(sc, sc->mbox, sc->pf, 0, 6, param, val); 1925 if (rc != 0) { 1926 device_printf(sc->dev, 1927 "failed to query TOE parameters: %d.\n", rc); 1928 return (rc); 1929 } 1930 sc->tids.ntids = val[0]; 1931 sc->tids.natids = min(sc->tids.ntids / 2, MAX_ATIDS); 1932 sc->tids.stid_base = val[1]; 1933 sc->tids.nstids = val[2] - val[1] + 1; 1934 sc->vres.ddp.start = val[3]; 1935 sc->vres.ddp.size = val[4] - val[3] + 1; 1936 sc->params.ofldq_wr_cred = val[5]; 1937 sc->params.offload = 1; 1938 } 1939 if (caps.rdmacaps) { 1940 param[0] = FW_PARAM_PFVF(STAG_START); 1941 param[1] = FW_PARAM_PFVF(STAG_END); 1942 param[2] = FW_PARAM_PFVF(RQ_START); 1943 param[3] = FW_PARAM_PFVF(RQ_END); 1944 param[4] = FW_PARAM_PFVF(PBL_START); 1945 param[5] = FW_PARAM_PFVF(PBL_END); 1946 rc = -t4_query_params(sc, sc->mbox, sc->pf, 0, 6, param, val); 1947 if (rc != 0) { 1948 device_printf(sc->dev, 1949 "failed to query RDMA parameters(1): %d.\n", rc); 1950 return (rc); 1951 } 1952 sc->vres.stag.start = val[0]; 1953 sc->vres.stag.size = val[1] - val[0] + 1; 1954 sc->vres.rq.start = val[2]; 1955 sc->vres.rq.size = val[3] - val[2] + 1; 1956 sc->vres.pbl.start = val[4]; 1957 sc->vres.pbl.size = val[5] - val[4] + 1; 1958 1959 param[0] = FW_PARAM_PFVF(SQRQ_START); 1960 param[1] = FW_PARAM_PFVF(SQRQ_END); 1961 param[2] = FW_PARAM_PFVF(CQ_START); 1962 param[3] = FW_PARAM_PFVF(CQ_END); 1963 param[4] = FW_PARAM_PFVF(OCQ_START); 1964 param[5] = FW_PARAM_PFVF(OCQ_END); 1965 rc = -t4_query_params(sc, 0, 0, 0, 6, param, val); 1966 if (rc != 0) { 1967 device_printf(sc->dev, 1968 "failed to query RDMA parameters(2): %d.\n", rc); 1969 return (rc); 1970 } 1971 sc->vres.qp.start = val[0]; 1972 sc->vres.qp.size = val[1] - val[0] + 1; 1973 sc->vres.cq.start = val[2]; 1974 sc->vres.cq.size = val[3] - val[2] + 1; 1975 sc->vres.ocq.start = val[4]; 1976 sc->vres.ocq.size = val[5] - val[4] + 1; 1977 } 1978 if (caps.iscsicaps) { 1979 param[0] = FW_PARAM_PFVF(ISCSI_START); 1980 param[1] = FW_PARAM_PFVF(ISCSI_END); 1981 rc = -t4_query_params(sc, sc->mbox, sc->pf, 0, 2, param, val); 1982 if (rc != 0) { 1983 device_printf(sc->dev, 1984 "failed to query iSCSI parameters: %d.\n", rc); 1985 return (rc); 1986 } 1987 sc->vres.iscsi.start = val[0]; 1988 sc->vres.iscsi.size = val[1] - val[0] + 1; 1989 } 1990 1991 /* These are finalized by FW initialization, load their values now */ 1992 val[0] = t4_read_reg(sc, A_TP_TIMER_RESOLUTION); 1993 sc->params.tp.tre = G_TIMERRESOLUTION(val[0]); 1994 sc->params.tp.dack_re = G_DELAYEDACKRESOLUTION(val[0]); 1995 t4_read_mtu_tbl(sc, sc->params.mtus, NULL); 1996 1997 return (rc); 1998 } 1999 2000 #undef FW_PARAM_PFVF 2001 #undef FW_PARAM_DEV 2002 2003 static void 2004 t4_set_desc(struct adapter *sc) 2005 { 2006 char buf[128]; 2007 struct adapter_params *p = &sc->params; 2008 2009 snprintf(buf, sizeof(buf), "Chelsio %s %sNIC (rev %d), S/N:%s, E/C:%s", 2010 p->vpd.id, is_offload(sc) ? "R" : "", p->rev, p->vpd.sn, p->vpd.ec); 2011 2012 device_set_desc_copy(sc->dev, buf); 2013 } 2014 2015 static void 2016 build_medialist(struct port_info *pi) 2017 { 2018 struct ifmedia *media = &pi->media; 2019 int data, m; 2020 2021 PORT_LOCK(pi); 2022 2023 ifmedia_removeall(media); 2024 2025 m = IFM_ETHER | IFM_FDX; 2026 data = (pi->port_type << 8) | pi->mod_type; 2027 2028 switch(pi->port_type) { 2029 case FW_PORT_TYPE_BT_XFI: 2030 ifmedia_add(media, m | IFM_10G_T, data, NULL); 2031 break; 2032 2033 case FW_PORT_TYPE_BT_XAUI: 2034 ifmedia_add(media, m | IFM_10G_T, data, NULL); 2035 /* fall through */ 2036 2037 case FW_PORT_TYPE_BT_SGMII: 2038 ifmedia_add(media, m | IFM_1000_T, data, NULL); 2039 ifmedia_add(media, m | IFM_100_TX, data, NULL); 2040 ifmedia_add(media, IFM_ETHER | IFM_AUTO, data, NULL); 2041 ifmedia_set(media, IFM_ETHER | IFM_AUTO); 2042 break; 2043 2044 case FW_PORT_TYPE_CX4: 2045 ifmedia_add(media, m | IFM_10G_CX4, data, NULL); 2046 ifmedia_set(media, m | IFM_10G_CX4); 2047 break; 2048 2049 case FW_PORT_TYPE_SFP: 2050 case FW_PORT_TYPE_FIBER_XFI: 2051 case FW_PORT_TYPE_FIBER_XAUI: 2052 switch (pi->mod_type) { 2053 2054 case FW_PORT_MOD_TYPE_LR: 2055 ifmedia_add(media, m | IFM_10G_LR, data, NULL); 2056 ifmedia_set(media, m | IFM_10G_LR); 2057 break; 2058 2059 case FW_PORT_MOD_TYPE_SR: 2060 ifmedia_add(media, m | IFM_10G_SR, data, NULL); 2061 ifmedia_set(media, m | IFM_10G_SR); 2062 break; 2063 2064 case FW_PORT_MOD_TYPE_LRM: 2065 ifmedia_add(media, m | IFM_10G_LRM, data, NULL); 2066 ifmedia_set(media, m | IFM_10G_LRM); 2067 break; 2068 2069 case FW_PORT_MOD_TYPE_TWINAX_PASSIVE: 2070 case FW_PORT_MOD_TYPE_TWINAX_ACTIVE: 2071 ifmedia_add(media, m | IFM_10G_TWINAX, data, NULL); 2072 ifmedia_set(media, m | IFM_10G_TWINAX); 2073 break; 2074 2075 case FW_PORT_MOD_TYPE_NONE: 2076 m &= ~IFM_FDX; 2077 ifmedia_add(media, m | IFM_NONE, data, NULL); 2078 ifmedia_set(media, m | IFM_NONE); 2079 break; 2080 2081 case FW_PORT_MOD_TYPE_NA: 2082 case FW_PORT_MOD_TYPE_ER: 2083 default: 2084 ifmedia_add(media, m | IFM_UNKNOWN, data, NULL); 2085 ifmedia_set(media, m | IFM_UNKNOWN); 2086 break; 2087 } 2088 break; 2089 2090 case FW_PORT_TYPE_KX4: 2091 case FW_PORT_TYPE_KX: 2092 case FW_PORT_TYPE_KR: 2093 default: 2094 ifmedia_add(media, m | IFM_UNKNOWN, data, NULL); 2095 ifmedia_set(media, m | IFM_UNKNOWN); 2096 break; 2097 } 2098 2099 PORT_UNLOCK(pi); 2100 } 2101 2102 #define FW_MAC_EXACT_CHUNK 7 2103 2104 /* 2105 * Program the port's XGMAC based on parameters in ifnet. The caller also 2106 * indicates which parameters should be programmed (the rest are left alone). 2107 */ 2108 static int 2109 update_mac_settings(struct port_info *pi, int flags) 2110 { 2111 int rc; 2112 struct ifnet *ifp = pi->ifp; 2113 struct adapter *sc = pi->adapter; 2114 int mtu = -1, promisc = -1, allmulti = -1, vlanex = -1; 2115 2116 PORT_LOCK_ASSERT_OWNED(pi); 2117 KASSERT(flags, ("%s: not told what to update.", __func__)); 2118 2119 if (flags & XGMAC_MTU) 2120 mtu = ifp->if_mtu; 2121 2122 if (flags & XGMAC_PROMISC) 2123 promisc = ifp->if_flags & IFF_PROMISC ? 1 : 0; 2124 2125 if (flags & XGMAC_ALLMULTI) 2126 allmulti = ifp->if_flags & IFF_ALLMULTI ? 1 : 0; 2127 2128 if (flags & XGMAC_VLANEX) 2129 vlanex = ifp->if_capenable & IFCAP_VLAN_HWTAGGING ? 1 : 0; 2130 2131 rc = -t4_set_rxmode(sc, sc->mbox, pi->viid, mtu, promisc, allmulti, 1, 2132 vlanex, false); 2133 if (rc) { 2134 if_printf(ifp, "set_rxmode (%x) failed: %d\n", flags, rc); 2135 return (rc); 2136 } 2137 2138 if (flags & XGMAC_UCADDR) { 2139 uint8_t ucaddr[ETHER_ADDR_LEN]; 2140 2141 bcopy(IF_LLADDR(ifp), ucaddr, sizeof(ucaddr)); 2142 rc = t4_change_mac(sc, sc->mbox, pi->viid, pi->xact_addr_filt, 2143 ucaddr, true, true); 2144 if (rc < 0) { 2145 rc = -rc; 2146 if_printf(ifp, "change_mac failed: %d\n", rc); 2147 return (rc); 2148 } else { 2149 pi->xact_addr_filt = rc; 2150 rc = 0; 2151 } 2152 } 2153 2154 if (flags & XGMAC_MCADDRS) { 2155 const uint8_t *mcaddr[FW_MAC_EXACT_CHUNK]; 2156 int del = 1; 2157 uint64_t hash = 0; 2158 struct ifmultiaddr *ifma; 2159 int i = 0, j; 2160 2161 if_maddr_rlock(ifp); 2162 TAILQ_FOREACH(ifma, &ifp->if_multiaddrs, ifma_link) { 2163 if (ifma->ifma_addr->sa_family != AF_LINK) 2164 continue; 2165 mcaddr[i++] = 2166 LLADDR((struct sockaddr_dl *)ifma->ifma_addr); 2167 2168 if (i == FW_MAC_EXACT_CHUNK) { 2169 rc = t4_alloc_mac_filt(sc, sc->mbox, pi->viid, 2170 del, i, mcaddr, NULL, &hash, 0); 2171 if (rc < 0) { 2172 rc = -rc; 2173 for (j = 0; j < i; j++) { 2174 if_printf(ifp, 2175 "failed to add mc address" 2176 " %02x:%02x:%02x:" 2177 "%02x:%02x:%02x rc=%d\n", 2178 mcaddr[j][0], mcaddr[j][1], 2179 mcaddr[j][2], mcaddr[j][3], 2180 mcaddr[j][4], mcaddr[j][5], 2181 rc); 2182 } 2183 goto mcfail; 2184 } 2185 del = 0; 2186 i = 0; 2187 } 2188 } 2189 if (i > 0) { 2190 rc = t4_alloc_mac_filt(sc, sc->mbox, pi->viid, 2191 del, i, mcaddr, NULL, &hash, 0); 2192 if (rc < 0) { 2193 rc = -rc; 2194 for (j = 0; j < i; j++) { 2195 if_printf(ifp, 2196 "failed to add mc address" 2197 " %02x:%02x:%02x:" 2198 "%02x:%02x:%02x rc=%d\n", 2199 mcaddr[j][0], mcaddr[j][1], 2200 mcaddr[j][2], mcaddr[j][3], 2201 mcaddr[j][4], mcaddr[j][5], 2202 rc); 2203 } 2204 goto mcfail; 2205 } 2206 } 2207 2208 rc = -t4_set_addr_hash(sc, sc->mbox, pi->viid, 0, hash, 0); 2209 if (rc != 0) 2210 if_printf(ifp, "failed to set mc address hash: %d", rc); 2211 mcfail: 2212 if_maddr_runlock(ifp); 2213 } 2214 2215 return (rc); 2216 } 2217 2218 static int 2219 cxgbe_init_locked(struct port_info *pi) 2220 { 2221 struct adapter *sc = pi->adapter; 2222 int rc = 0; 2223 2224 ADAPTER_LOCK_ASSERT_OWNED(sc); 2225 2226 while (!IS_DOOMED(pi) && IS_BUSY(sc)) { 2227 if (mtx_sleep(&sc->flags, &sc->sc_lock, PCATCH, "t4init", 0)) { 2228 rc = EINTR; 2229 goto done; 2230 } 2231 } 2232 if (IS_DOOMED(pi)) { 2233 rc = ENXIO; 2234 goto done; 2235 } 2236 KASSERT(!IS_BUSY(sc), ("%s: controller busy.", __func__)); 2237 2238 /* Give up the adapter lock, port init code can sleep. */ 2239 SET_BUSY(sc); 2240 ADAPTER_UNLOCK(sc); 2241 2242 rc = cxgbe_init_synchronized(pi); 2243 2244 done: 2245 ADAPTER_LOCK(sc); 2246 KASSERT(IS_BUSY(sc), ("%s: controller not busy.", __func__)); 2247 CLR_BUSY(sc); 2248 wakeup_one(&sc->flags); 2249 ADAPTER_UNLOCK(sc); 2250 return (rc); 2251 } 2252 2253 static int 2254 cxgbe_init_synchronized(struct port_info *pi) 2255 { 2256 struct adapter *sc = pi->adapter; 2257 struct ifnet *ifp = pi->ifp; 2258 int rc = 0; 2259 2260 ADAPTER_LOCK_ASSERT_NOTOWNED(sc); 2261 2262 if (isset(&sc->open_device_map, pi->port_id)) { 2263 KASSERT(ifp->if_drv_flags & IFF_DRV_RUNNING, 2264 ("mismatch between open_device_map and if_drv_flags")); 2265 return (0); /* already running */ 2266 } 2267 2268 if (!(sc->flags & FULL_INIT_DONE) && 2269 ((rc = adapter_full_init(sc)) != 0)) 2270 return (rc); /* error message displayed already */ 2271 2272 if (!(pi->flags & PORT_INIT_DONE) && 2273 ((rc = port_full_init(pi)) != 0)) 2274 return (rc); /* error message displayed already */ 2275 2276 PORT_LOCK(pi); 2277 rc = update_mac_settings(pi, XGMAC_ALL); 2278 PORT_UNLOCK(pi); 2279 if (rc) 2280 goto done; /* error message displayed already */ 2281 2282 rc = -t4_link_start(sc, sc->mbox, pi->tx_chan, &pi->link_cfg); 2283 if (rc != 0) { 2284 if_printf(ifp, "start_link failed: %d\n", rc); 2285 goto done; 2286 } 2287 2288 rc = -t4_enable_vi(sc, sc->mbox, pi->viid, true, true); 2289 if (rc != 0) { 2290 if_printf(ifp, "enable_vi failed: %d\n", rc); 2291 goto done; 2292 } 2293 2294 /* all ok */ 2295 setbit(&sc->open_device_map, pi->port_id); 2296 ifp->if_drv_flags |= IFF_DRV_RUNNING; 2297 2298 callout_reset(&pi->tick, hz, cxgbe_tick, pi); 2299 done: 2300 if (rc != 0) 2301 cxgbe_uninit_synchronized(pi); 2302 2303 return (rc); 2304 } 2305 2306 static int 2307 cxgbe_uninit_locked(struct port_info *pi) 2308 { 2309 struct adapter *sc = pi->adapter; 2310 int rc; 2311 2312 ADAPTER_LOCK_ASSERT_OWNED(sc); 2313 2314 while (!IS_DOOMED(pi) && IS_BUSY(sc)) { 2315 if (mtx_sleep(&sc->flags, &sc->sc_lock, PCATCH, "t4uninit", 0)) { 2316 rc = EINTR; 2317 goto done; 2318 } 2319 } 2320 if (IS_DOOMED(pi)) { 2321 rc = ENXIO; 2322 goto done; 2323 } 2324 KASSERT(!IS_BUSY(sc), ("%s: controller busy.", __func__)); 2325 SET_BUSY(sc); 2326 ADAPTER_UNLOCK(sc); 2327 2328 rc = cxgbe_uninit_synchronized(pi); 2329 2330 ADAPTER_LOCK(sc); 2331 KASSERT(IS_BUSY(sc), ("%s: controller not busy.", __func__)); 2332 CLR_BUSY(sc); 2333 wakeup_one(&sc->flags); 2334 done: 2335 ADAPTER_UNLOCK(sc); 2336 return (rc); 2337 } 2338 2339 /* 2340 * Idempotent. 2341 */ 2342 static int 2343 cxgbe_uninit_synchronized(struct port_info *pi) 2344 { 2345 struct adapter *sc = pi->adapter; 2346 struct ifnet *ifp = pi->ifp; 2347 int rc; 2348 2349 ADAPTER_LOCK_ASSERT_NOTOWNED(sc); 2350 2351 /* 2352 * Disable the VI so that all its data in either direction is discarded 2353 * by the MPS. Leave everything else (the queues, interrupts, and 1Hz 2354 * tick) intact as the TP can deliver negative advice or data that it's 2355 * holding in its RAM (for an offloaded connection) even after the VI is 2356 * disabled. 2357 */ 2358 rc = -t4_enable_vi(sc, sc->mbox, pi->viid, false, false); 2359 if (rc) { 2360 if_printf(ifp, "disable_vi failed: %d\n", rc); 2361 return (rc); 2362 } 2363 2364 clrbit(&sc->open_device_map, pi->port_id); 2365 ifp->if_drv_flags &= ~IFF_DRV_RUNNING; 2366 2367 pi->link_cfg.link_ok = 0; 2368 pi->link_cfg.speed = 0; 2369 t4_os_link_changed(sc, pi->port_id, 0); 2370 2371 return (0); 2372 } 2373 2374 /* 2375 * It is ok for this function to fail midway and return right away. t4_detach 2376 * will walk the entire sc->irq list and clean up whatever is valid. 2377 */ 2378 static int 2379 setup_intr_handlers(struct adapter *sc) 2380 { 2381 int rc, rid, p, q; 2382 char s[8]; 2383 struct irq *irq; 2384 struct port_info *pi; 2385 struct sge_rxq *rxq; 2386 #ifdef TCP_OFFLOAD 2387 struct sge_ofld_rxq *ofld_rxq; 2388 #endif 2389 2390 /* 2391 * Setup interrupts. 2392 */ 2393 irq = &sc->irq[0]; 2394 rid = sc->intr_type == INTR_INTX ? 0 : 1; 2395 if (sc->intr_count == 1) { 2396 KASSERT(!(sc->flags & INTR_DIRECT), 2397 ("%s: single interrupt && INTR_DIRECT?", __func__)); 2398 2399 rc = t4_alloc_irq(sc, irq, rid, t4_intr_all, sc, "all"); 2400 if (rc != 0) 2401 return (rc); 2402 } else { 2403 /* Multiple interrupts. */ 2404 KASSERT(sc->intr_count >= T4_EXTRA_INTR + sc->params.nports, 2405 ("%s: too few intr.", __func__)); 2406 2407 /* The first one is always error intr */ 2408 rc = t4_alloc_irq(sc, irq, rid, t4_intr_err, sc, "err"); 2409 if (rc != 0) 2410 return (rc); 2411 irq++; 2412 rid++; 2413 2414 /* The second one is always the firmware event queue */ 2415 rc = t4_alloc_irq(sc, irq, rid, t4_intr_evt, &sc->sge.fwq, 2416 "evt"); 2417 if (rc != 0) 2418 return (rc); 2419 irq++; 2420 rid++; 2421 2422 /* 2423 * Note that if INTR_DIRECT is not set then either the NIC rx 2424 * queues or (exclusive or) the TOE rx queueus will be taking 2425 * direct interrupts. 2426 * 2427 * There is no need to check for is_offload(sc) as nofldrxq 2428 * will be 0 if offload is disabled. 2429 */ 2430 for_each_port(sc, p) { 2431 pi = sc->port[p]; 2432 2433 #ifdef TCP_OFFLOAD 2434 /* 2435 * Skip over the NIC queues if they aren't taking direct 2436 * interrupts. 2437 */ 2438 if (!(sc->flags & INTR_DIRECT) && 2439 pi->nofldrxq > pi->nrxq) 2440 goto ofld_queues; 2441 #endif 2442 rxq = &sc->sge.rxq[pi->first_rxq]; 2443 for (q = 0; q < pi->nrxq; q++, rxq++) { 2444 snprintf(s, sizeof(s), "%d.%d", p, q); 2445 rc = t4_alloc_irq(sc, irq, rid, t4_intr, rxq, 2446 s); 2447 if (rc != 0) 2448 return (rc); 2449 irq++; 2450 rid++; 2451 } 2452 2453 #ifdef TCP_OFFLOAD 2454 /* 2455 * Skip over the offload queues if they aren't taking 2456 * direct interrupts. 2457 */ 2458 if (!(sc->flags & INTR_DIRECT)) 2459 continue; 2460 ofld_queues: 2461 ofld_rxq = &sc->sge.ofld_rxq[pi->first_ofld_rxq]; 2462 for (q = 0; q < pi->nofldrxq; q++, ofld_rxq++) { 2463 snprintf(s, sizeof(s), "%d,%d", p, q); 2464 rc = t4_alloc_irq(sc, irq, rid, t4_intr, 2465 ofld_rxq, s); 2466 if (rc != 0) 2467 return (rc); 2468 irq++; 2469 rid++; 2470 } 2471 #endif 2472 } 2473 } 2474 2475 return (0); 2476 } 2477 2478 static int 2479 adapter_full_init(struct adapter *sc) 2480 { 2481 int rc, i; 2482 2483 ADAPTER_LOCK_ASSERT_NOTOWNED(sc); 2484 KASSERT((sc->flags & FULL_INIT_DONE) == 0, 2485 ("%s: FULL_INIT_DONE already", __func__)); 2486 2487 /* 2488 * queues that belong to the adapter (not any particular port). 2489 */ 2490 rc = t4_setup_adapter_queues(sc); 2491 if (rc != 0) 2492 goto done; 2493 2494 for (i = 0; i < nitems(sc->tq); i++) { 2495 sc->tq[i] = taskqueue_create("t4 taskq", M_NOWAIT, 2496 taskqueue_thread_enqueue, &sc->tq[i]); 2497 if (sc->tq[i] == NULL) { 2498 device_printf(sc->dev, 2499 "failed to allocate task queue %d\n", i); 2500 rc = ENOMEM; 2501 goto done; 2502 } 2503 taskqueue_start_threads(&sc->tq[i], 1, PI_NET, "%s tq%d", 2504 device_get_nameunit(sc->dev), i); 2505 } 2506 2507 t4_intr_enable(sc); 2508 sc->flags |= FULL_INIT_DONE; 2509 done: 2510 if (rc != 0) 2511 adapter_full_uninit(sc); 2512 2513 return (rc); 2514 } 2515 2516 static int 2517 adapter_full_uninit(struct adapter *sc) 2518 { 2519 int i; 2520 2521 ADAPTER_LOCK_ASSERT_NOTOWNED(sc); 2522 2523 t4_teardown_adapter_queues(sc); 2524 2525 for (i = 0; i < nitems(sc->tq) && sc->tq[i]; i++) { 2526 taskqueue_free(sc->tq[i]); 2527 sc->tq[i] = NULL; 2528 } 2529 2530 sc->flags &= ~FULL_INIT_DONE; 2531 2532 return (0); 2533 } 2534 2535 static int 2536 port_full_init(struct port_info *pi) 2537 { 2538 struct adapter *sc = pi->adapter; 2539 struct ifnet *ifp = pi->ifp; 2540 uint16_t *rss; 2541 struct sge_rxq *rxq; 2542 int rc, i; 2543 2544 ADAPTER_LOCK_ASSERT_NOTOWNED(sc); 2545 KASSERT((pi->flags & PORT_INIT_DONE) == 0, 2546 ("%s: PORT_INIT_DONE already", __func__)); 2547 2548 sysctl_ctx_init(&pi->ctx); 2549 pi->flags |= PORT_SYSCTL_CTX; 2550 2551 /* 2552 * Allocate tx/rx/fl queues for this port. 2553 */ 2554 rc = t4_setup_port_queues(pi); 2555 if (rc != 0) 2556 goto done; /* error message displayed already */ 2557 2558 /* 2559 * Setup RSS for this port. 2560 */ 2561 rss = malloc(pi->nrxq * sizeof (*rss), M_CXGBE, 2562 M_ZERO | M_WAITOK); 2563 for_each_rxq(pi, i, rxq) { 2564 rss[i] = rxq->iq.abs_id; 2565 } 2566 rc = -t4_config_rss_range(sc, sc->mbox, pi->viid, 0, 2567 pi->rss_size, rss, pi->nrxq); 2568 free(rss, M_CXGBE); 2569 if (rc != 0) { 2570 if_printf(ifp, "rss_config failed: %d\n", rc); 2571 goto done; 2572 } 2573 2574 pi->flags |= PORT_INIT_DONE; 2575 done: 2576 if (rc != 0) 2577 port_full_uninit(pi); 2578 2579 return (rc); 2580 } 2581 2582 /* 2583 * Idempotent. 2584 */ 2585 static int 2586 port_full_uninit(struct port_info *pi) 2587 { 2588 struct adapter *sc = pi->adapter; 2589 int i; 2590 struct sge_rxq *rxq; 2591 struct sge_txq *txq; 2592 #ifdef TCP_OFFLOAD 2593 struct sge_ofld_rxq *ofld_rxq; 2594 struct sge_wrq *ofld_txq; 2595 #endif 2596 2597 if (pi->flags & PORT_INIT_DONE) { 2598 2599 /* Need to quiesce queues. XXX: ctrl queues? */ 2600 2601 for_each_txq(pi, i, txq) { 2602 quiesce_eq(sc, &txq->eq); 2603 } 2604 2605 #ifdef TCP_OFFLOAD 2606 for_each_ofld_txq(pi, i, ofld_txq) { 2607 quiesce_eq(sc, &ofld_txq->eq); 2608 } 2609 #endif 2610 2611 for_each_rxq(pi, i, rxq) { 2612 quiesce_iq(sc, &rxq->iq); 2613 quiesce_fl(sc, &rxq->fl); 2614 } 2615 2616 #ifdef TCP_OFFLOAD 2617 for_each_ofld_rxq(pi, i, ofld_rxq) { 2618 quiesce_iq(sc, &ofld_rxq->iq); 2619 quiesce_fl(sc, &ofld_rxq->fl); 2620 } 2621 #endif 2622 } 2623 2624 t4_teardown_port_queues(pi); 2625 pi->flags &= ~PORT_INIT_DONE; 2626 2627 return (0); 2628 } 2629 2630 static void 2631 quiesce_eq(struct adapter *sc, struct sge_eq *eq) 2632 { 2633 EQ_LOCK(eq); 2634 eq->flags |= EQ_DOOMED; 2635 2636 /* 2637 * Wait for the response to a credit flush if one's 2638 * pending. 2639 */ 2640 while (eq->flags & EQ_CRFLUSHED) 2641 mtx_sleep(eq, &eq->eq_lock, 0, "crflush", 0); 2642 EQ_UNLOCK(eq); 2643 2644 callout_drain(&eq->tx_callout); /* XXX: iffy */ 2645 pause("callout", 10); /* Still iffy */ 2646 2647 taskqueue_drain(sc->tq[eq->tx_chan], &eq->tx_task); 2648 } 2649 2650 static void 2651 quiesce_iq(struct adapter *sc, struct sge_iq *iq) 2652 { 2653 (void) sc; /* unused */ 2654 2655 /* Synchronize with the interrupt handler */ 2656 while (!atomic_cmpset_int(&iq->state, IQS_IDLE, IQS_DISABLED)) 2657 pause("iqfree", 1); 2658 } 2659 2660 static void 2661 quiesce_fl(struct adapter *sc, struct sge_fl *fl) 2662 { 2663 mtx_lock(&sc->sfl_lock); 2664 FL_LOCK(fl); 2665 fl->flags |= FL_DOOMED; 2666 FL_UNLOCK(fl); 2667 mtx_unlock(&sc->sfl_lock); 2668 2669 callout_drain(&sc->sfl_callout); 2670 KASSERT((fl->flags & FL_STARVING) == 0, 2671 ("%s: still starving", __func__)); 2672 } 2673 2674 static int 2675 t4_alloc_irq(struct adapter *sc, struct irq *irq, int rid, 2676 driver_intr_t *handler, void *arg, char *name) 2677 { 2678 int rc; 2679 2680 irq->rid = rid; 2681 irq->res = bus_alloc_resource_any(sc->dev, SYS_RES_IRQ, &irq->rid, 2682 RF_SHAREABLE | RF_ACTIVE); 2683 if (irq->res == NULL) { 2684 device_printf(sc->dev, 2685 "failed to allocate IRQ for rid %d, name %s.\n", rid, name); 2686 return (ENOMEM); 2687 } 2688 2689 rc = bus_setup_intr(sc->dev, irq->res, INTR_MPSAFE | INTR_TYPE_NET, 2690 NULL, handler, arg, &irq->tag); 2691 if (rc != 0) { 2692 device_printf(sc->dev, 2693 "failed to setup interrupt for rid %d, name %s: %d\n", 2694 rid, name, rc); 2695 } else if (name) 2696 bus_describe_intr(sc->dev, irq->res, irq->tag, name); 2697 2698 return (rc); 2699 } 2700 2701 static int 2702 t4_free_irq(struct adapter *sc, struct irq *irq) 2703 { 2704 if (irq->tag) 2705 bus_teardown_intr(sc->dev, irq->res, irq->tag); 2706 if (irq->res) 2707 bus_release_resource(sc->dev, SYS_RES_IRQ, irq->rid, irq->res); 2708 2709 bzero(irq, sizeof(*irq)); 2710 2711 return (0); 2712 } 2713 2714 static void 2715 reg_block_dump(struct adapter *sc, uint8_t *buf, unsigned int start, 2716 unsigned int end) 2717 { 2718 uint32_t *p = (uint32_t *)(buf + start); 2719 2720 for ( ; start <= end; start += sizeof(uint32_t)) 2721 *p++ = t4_read_reg(sc, start); 2722 } 2723 2724 static void 2725 t4_get_regs(struct adapter *sc, struct t4_regdump *regs, uint8_t *buf) 2726 { 2727 int i; 2728 static const unsigned int reg_ranges[] = { 2729 0x1008, 0x1108, 2730 0x1180, 0x11b4, 2731 0x11fc, 0x123c, 2732 0x1300, 0x173c, 2733 0x1800, 0x18fc, 2734 0x3000, 0x30d8, 2735 0x30e0, 0x5924, 2736 0x5960, 0x59d4, 2737 0x5a00, 0x5af8, 2738 0x6000, 0x6098, 2739 0x6100, 0x6150, 2740 0x6200, 0x6208, 2741 0x6240, 0x6248, 2742 0x6280, 0x6338, 2743 0x6370, 0x638c, 2744 0x6400, 0x643c, 2745 0x6500, 0x6524, 2746 0x6a00, 0x6a38, 2747 0x6a60, 0x6a78, 2748 0x6b00, 0x6b84, 2749 0x6bf0, 0x6c84, 2750 0x6cf0, 0x6d84, 2751 0x6df0, 0x6e84, 2752 0x6ef0, 0x6f84, 2753 0x6ff0, 0x7084, 2754 0x70f0, 0x7184, 2755 0x71f0, 0x7284, 2756 0x72f0, 0x7384, 2757 0x73f0, 0x7450, 2758 0x7500, 0x7530, 2759 0x7600, 0x761c, 2760 0x7680, 0x76cc, 2761 0x7700, 0x7798, 2762 0x77c0, 0x77fc, 2763 0x7900, 0x79fc, 2764 0x7b00, 0x7c38, 2765 0x7d00, 0x7efc, 2766 0x8dc0, 0x8e1c, 2767 0x8e30, 0x8e78, 2768 0x8ea0, 0x8f6c, 2769 0x8fc0, 0x9074, 2770 0x90fc, 0x90fc, 2771 0x9400, 0x9458, 2772 0x9600, 0x96bc, 2773 0x9800, 0x9808, 2774 0x9820, 0x983c, 2775 0x9850, 0x9864, 2776 0x9c00, 0x9c6c, 2777 0x9c80, 0x9cec, 2778 0x9d00, 0x9d6c, 2779 0x9d80, 0x9dec, 2780 0x9e00, 0x9e6c, 2781 0x9e80, 0x9eec, 2782 0x9f00, 0x9f6c, 2783 0x9f80, 0x9fec, 2784 0xd004, 0xd03c, 2785 0xdfc0, 0xdfe0, 2786 0xe000, 0xea7c, 2787 0xf000, 0x11190, 2788 0x19040, 0x1906c, 2789 0x19078, 0x19080, 2790 0x1908c, 0x19124, 2791 0x19150, 0x191b0, 2792 0x191d0, 0x191e8, 2793 0x19238, 0x1924c, 2794 0x193f8, 0x19474, 2795 0x19490, 0x194f8, 2796 0x19800, 0x19f30, 2797 0x1a000, 0x1a06c, 2798 0x1a0b0, 0x1a120, 2799 0x1a128, 0x1a138, 2800 0x1a190, 0x1a1c4, 2801 0x1a1fc, 0x1a1fc, 2802 0x1e040, 0x1e04c, 2803 0x1e284, 0x1e28c, 2804 0x1e2c0, 0x1e2c0, 2805 0x1e2e0, 0x1e2e0, 2806 0x1e300, 0x1e384, 2807 0x1e3c0, 0x1e3c8, 2808 0x1e440, 0x1e44c, 2809 0x1e684, 0x1e68c, 2810 0x1e6c0, 0x1e6c0, 2811 0x1e6e0, 0x1e6e0, 2812 0x1e700, 0x1e784, 2813 0x1e7c0, 0x1e7c8, 2814 0x1e840, 0x1e84c, 2815 0x1ea84, 0x1ea8c, 2816 0x1eac0, 0x1eac0, 2817 0x1eae0, 0x1eae0, 2818 0x1eb00, 0x1eb84, 2819 0x1ebc0, 0x1ebc8, 2820 0x1ec40, 0x1ec4c, 2821 0x1ee84, 0x1ee8c, 2822 0x1eec0, 0x1eec0, 2823 0x1eee0, 0x1eee0, 2824 0x1ef00, 0x1ef84, 2825 0x1efc0, 0x1efc8, 2826 0x1f040, 0x1f04c, 2827 0x1f284, 0x1f28c, 2828 0x1f2c0, 0x1f2c0, 2829 0x1f2e0, 0x1f2e0, 2830 0x1f300, 0x1f384, 2831 0x1f3c0, 0x1f3c8, 2832 0x1f440, 0x1f44c, 2833 0x1f684, 0x1f68c, 2834 0x1f6c0, 0x1f6c0, 2835 0x1f6e0, 0x1f6e0, 2836 0x1f700, 0x1f784, 2837 0x1f7c0, 0x1f7c8, 2838 0x1f840, 0x1f84c, 2839 0x1fa84, 0x1fa8c, 2840 0x1fac0, 0x1fac0, 2841 0x1fae0, 0x1fae0, 2842 0x1fb00, 0x1fb84, 2843 0x1fbc0, 0x1fbc8, 2844 0x1fc40, 0x1fc4c, 2845 0x1fe84, 0x1fe8c, 2846 0x1fec0, 0x1fec0, 2847 0x1fee0, 0x1fee0, 2848 0x1ff00, 0x1ff84, 2849 0x1ffc0, 0x1ffc8, 2850 0x20000, 0x2002c, 2851 0x20100, 0x2013c, 2852 0x20190, 0x201c8, 2853 0x20200, 0x20318, 2854 0x20400, 0x20528, 2855 0x20540, 0x20614, 2856 0x21000, 0x21040, 2857 0x2104c, 0x21060, 2858 0x210c0, 0x210ec, 2859 0x21200, 0x21268, 2860 0x21270, 0x21284, 2861 0x212fc, 0x21388, 2862 0x21400, 0x21404, 2863 0x21500, 0x21518, 2864 0x2152c, 0x2153c, 2865 0x21550, 0x21554, 2866 0x21600, 0x21600, 2867 0x21608, 0x21628, 2868 0x21630, 0x2163c, 2869 0x21700, 0x2171c, 2870 0x21780, 0x2178c, 2871 0x21800, 0x21c38, 2872 0x21c80, 0x21d7c, 2873 0x21e00, 0x21e04, 2874 0x22000, 0x2202c, 2875 0x22100, 0x2213c, 2876 0x22190, 0x221c8, 2877 0x22200, 0x22318, 2878 0x22400, 0x22528, 2879 0x22540, 0x22614, 2880 0x23000, 0x23040, 2881 0x2304c, 0x23060, 2882 0x230c0, 0x230ec, 2883 0x23200, 0x23268, 2884 0x23270, 0x23284, 2885 0x232fc, 0x23388, 2886 0x23400, 0x23404, 2887 0x23500, 0x23518, 2888 0x2352c, 0x2353c, 2889 0x23550, 0x23554, 2890 0x23600, 0x23600, 2891 0x23608, 0x23628, 2892 0x23630, 0x2363c, 2893 0x23700, 0x2371c, 2894 0x23780, 0x2378c, 2895 0x23800, 0x23c38, 2896 0x23c80, 0x23d7c, 2897 0x23e00, 0x23e04, 2898 0x24000, 0x2402c, 2899 0x24100, 0x2413c, 2900 0x24190, 0x241c8, 2901 0x24200, 0x24318, 2902 0x24400, 0x24528, 2903 0x24540, 0x24614, 2904 0x25000, 0x25040, 2905 0x2504c, 0x25060, 2906 0x250c0, 0x250ec, 2907 0x25200, 0x25268, 2908 0x25270, 0x25284, 2909 0x252fc, 0x25388, 2910 0x25400, 0x25404, 2911 0x25500, 0x25518, 2912 0x2552c, 0x2553c, 2913 0x25550, 0x25554, 2914 0x25600, 0x25600, 2915 0x25608, 0x25628, 2916 0x25630, 0x2563c, 2917 0x25700, 0x2571c, 2918 0x25780, 0x2578c, 2919 0x25800, 0x25c38, 2920 0x25c80, 0x25d7c, 2921 0x25e00, 0x25e04, 2922 0x26000, 0x2602c, 2923 0x26100, 0x2613c, 2924 0x26190, 0x261c8, 2925 0x26200, 0x26318, 2926 0x26400, 0x26528, 2927 0x26540, 0x26614, 2928 0x27000, 0x27040, 2929 0x2704c, 0x27060, 2930 0x270c0, 0x270ec, 2931 0x27200, 0x27268, 2932 0x27270, 0x27284, 2933 0x272fc, 0x27388, 2934 0x27400, 0x27404, 2935 0x27500, 0x27518, 2936 0x2752c, 0x2753c, 2937 0x27550, 0x27554, 2938 0x27600, 0x27600, 2939 0x27608, 0x27628, 2940 0x27630, 0x2763c, 2941 0x27700, 0x2771c, 2942 0x27780, 0x2778c, 2943 0x27800, 0x27c38, 2944 0x27c80, 0x27d7c, 2945 0x27e00, 0x27e04 2946 }; 2947 2948 regs->version = 4 | (sc->params.rev << 10); 2949 for (i = 0; i < nitems(reg_ranges); i += 2) 2950 reg_block_dump(sc, buf, reg_ranges[i], reg_ranges[i + 1]); 2951 } 2952 2953 static void 2954 cxgbe_tick(void *arg) 2955 { 2956 struct port_info *pi = arg; 2957 struct ifnet *ifp = pi->ifp; 2958 struct sge_txq *txq; 2959 int i, drops; 2960 struct port_stats *s = &pi->stats; 2961 2962 PORT_LOCK(pi); 2963 if (!(ifp->if_drv_flags & IFF_DRV_RUNNING)) { 2964 PORT_UNLOCK(pi); 2965 return; /* without scheduling another callout */ 2966 } 2967 2968 t4_get_port_stats(pi->adapter, pi->tx_chan, s); 2969 2970 ifp->if_opackets = s->tx_frames - s->tx_pause; 2971 ifp->if_ipackets = s->rx_frames - s->rx_pause; 2972 ifp->if_obytes = s->tx_octets - s->tx_pause * 64; 2973 ifp->if_ibytes = s->rx_octets - s->rx_pause * 64; 2974 ifp->if_omcasts = s->tx_mcast_frames - s->tx_pause; 2975 ifp->if_imcasts = s->rx_mcast_frames - s->rx_pause; 2976 ifp->if_iqdrops = s->rx_ovflow0 + s->rx_ovflow1 + s->rx_ovflow2 + 2977 s->rx_ovflow3 + s->rx_trunc0 + s->rx_trunc1 + s->rx_trunc2 + 2978 s->rx_trunc3; 2979 2980 drops = s->tx_drop; 2981 for_each_txq(pi, i, txq) 2982 drops += txq->br->br_drops; 2983 ifp->if_snd.ifq_drops = drops; 2984 2985 ifp->if_oerrors = s->tx_error_frames; 2986 ifp->if_ierrors = s->rx_jabber + s->rx_runt + s->rx_too_long + 2987 s->rx_fcs_err + s->rx_len_err; 2988 2989 callout_schedule(&pi->tick, hz); 2990 PORT_UNLOCK(pi); 2991 } 2992 2993 static void 2994 cxgbe_vlan_config(void *arg, struct ifnet *ifp, uint16_t vid) 2995 { 2996 struct ifnet *vlan; 2997 2998 if (arg != ifp) 2999 return; 3000 3001 vlan = VLAN_DEVAT(ifp, vid); 3002 VLAN_SETCOOKIE(vlan, ifp); 3003 } 3004 3005 static int 3006 cpl_not_handled(struct sge_iq *iq, const struct rss_header *rss, struct mbuf *m) 3007 { 3008 3009 #ifdef INVARIANTS 3010 panic("%s: opcode 0x%02x on iq %p with payload %p", 3011 __func__, rss->opcode, iq, m); 3012 #else 3013 log(LOG_ERR, "%s: opcode 0x%02x on iq %p with payload %p\n", 3014 __func__, rss->opcode, iq, m); 3015 m_freem(m); 3016 #endif 3017 return (EDOOFUS); 3018 } 3019 3020 int 3021 t4_register_cpl_handler(struct adapter *sc, int opcode, cpl_handler_t h) 3022 { 3023 uintptr_t *loc, new; 3024 3025 if (opcode >= nitems(sc->cpl_handler)) 3026 return (EINVAL); 3027 3028 new = h ? (uintptr_t)h : (uintptr_t)cpl_not_handled; 3029 loc = (uintptr_t *) &sc->cpl_handler[opcode]; 3030 atomic_store_rel_ptr(loc, new); 3031 3032 return (0); 3033 } 3034 3035 static int 3036 an_not_handled(struct sge_iq *iq, const struct rsp_ctrl *ctrl) 3037 { 3038 3039 #ifdef INVARIANTS 3040 panic("%s: async notification on iq %p (ctrl %p)", __func__, iq, ctrl); 3041 #else 3042 log(LOG_ERR, "%s: async notification on iq %p (ctrl %p)\n", 3043 __func__, iq, ctrl); 3044 #endif 3045 return (EDOOFUS); 3046 } 3047 3048 int 3049 t4_register_an_handler(struct adapter *sc, an_handler_t h) 3050 { 3051 uintptr_t *loc, new; 3052 3053 new = h ? (uintptr_t)h : (uintptr_t)an_not_handled; 3054 loc = (uintptr_t *) &sc->an_handler; 3055 atomic_store_rel_ptr(loc, new); 3056 3057 return (0); 3058 } 3059 3060 static int 3061 fw_msg_not_handled(struct adapter *sc, const __be64 *rpl) 3062 { 3063 __be64 *r = __DECONST(__be64 *, rpl); 3064 struct cpl_fw6_msg *cpl = member2struct(cpl_fw6_msg, data, r); 3065 3066 #ifdef INVARIANTS 3067 panic("%s: fw_msg type %d", __func__, cpl->type); 3068 #else 3069 log(LOG_ERR, "%s: fw_msg type %d\n", __func__, cpl->type); 3070 #endif 3071 return (EDOOFUS); 3072 } 3073 3074 int 3075 t4_register_fw_msg_handler(struct adapter *sc, int type, fw_msg_handler_t h) 3076 { 3077 uintptr_t *loc, new; 3078 3079 if (type >= nitems(sc->fw_msg_handler)) 3080 return (EINVAL); 3081 3082 new = h ? (uintptr_t)h : (uintptr_t)fw_msg_not_handled; 3083 loc = (uintptr_t *) &sc->fw_msg_handler[type]; 3084 atomic_store_rel_ptr(loc, new); 3085 3086 return (0); 3087 } 3088 3089 static int 3090 t4_sysctls(struct adapter *sc) 3091 { 3092 struct sysctl_ctx_list *ctx; 3093 struct sysctl_oid *oid; 3094 struct sysctl_oid_list *children, *c0; 3095 static char *caps[] = { 3096 "\20\1PPP\2QFC\3DCBX", /* caps[0] linkcaps */ 3097 "\20\1NIC\2VM\3IDS\4UM\5UM_ISGL", /* caps[1] niccaps */ 3098 "\20\1TOE", /* caps[2] toecaps */ 3099 "\20\1RDDP\2RDMAC", /* caps[3] rdmacaps */ 3100 "\20\1INITIATOR_PDU\2TARGET_PDU" /* caps[4] iscsicaps */ 3101 "\3INITIATOR_CNXOFLD\4TARGET_CNXOFLD" 3102 "\5INITIATOR_SSNOFLD\6TARGET_SSNOFLD", 3103 "\20\1INITIATOR\2TARGET\3CTRL_OFLD" /* caps[5] fcoecaps */ 3104 }; 3105 3106 ctx = device_get_sysctl_ctx(sc->dev); 3107 3108 /* 3109 * dev.t4nex.X. 3110 */ 3111 oid = device_get_sysctl_tree(sc->dev); 3112 c0 = children = SYSCTL_CHILDREN(oid); 3113 3114 SYSCTL_ADD_INT(ctx, children, OID_AUTO, "nports", CTLFLAG_RD, 3115 &sc->params.nports, 0, "# of ports"); 3116 3117 SYSCTL_ADD_INT(ctx, children, OID_AUTO, "hw_revision", CTLFLAG_RD, 3118 &sc->params.rev, 0, "chip hardware revision"); 3119 3120 SYSCTL_ADD_STRING(ctx, children, OID_AUTO, "firmware_version", 3121 CTLFLAG_RD, &sc->fw_version, 0, "firmware version"); 3122 3123 SYSCTL_ADD_STRING(ctx, children, OID_AUTO, "cf", 3124 CTLFLAG_RD, &t4_cfg_file, 0, "configuration file"); 3125 3126 SYSCTL_ADD_UINT(ctx, children, OID_AUTO, "cfcsum", CTLFLAG_RD, 3127 &sc->cfcsum, 0, "config file checksum"); 3128 3129 SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "linkcaps", 3130 CTLTYPE_STRING | CTLFLAG_RD, caps[0], sc->linkcaps, 3131 sysctl_bitfield, "A", "available link capabilities"); 3132 3133 SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "niccaps", 3134 CTLTYPE_STRING | CTLFLAG_RD, caps[1], sc->niccaps, 3135 sysctl_bitfield, "A", "available NIC capabilities"); 3136 3137 SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "toecaps", 3138 CTLTYPE_STRING | CTLFLAG_RD, caps[2], sc->toecaps, 3139 sysctl_bitfield, "A", "available TCP offload capabilities"); 3140 3141 SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "rdmacaps", 3142 CTLTYPE_STRING | CTLFLAG_RD, caps[3], sc->rdmacaps, 3143 sysctl_bitfield, "A", "available RDMA capabilities"); 3144 3145 SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "iscsicaps", 3146 CTLTYPE_STRING | CTLFLAG_RD, caps[4], sc->iscsicaps, 3147 sysctl_bitfield, "A", "available iSCSI capabilities"); 3148 3149 SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "fcoecaps", 3150 CTLTYPE_STRING | CTLFLAG_RD, caps[5], sc->fcoecaps, 3151 sysctl_bitfield, "A", "available FCoE capabilities"); 3152 3153 SYSCTL_ADD_INT(ctx, children, OID_AUTO, "core_clock", CTLFLAG_RD, 3154 &sc->params.vpd.cclk, 0, "core clock frequency (in KHz)"); 3155 3156 SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "holdoff_timers", 3157 CTLTYPE_STRING | CTLFLAG_RD, sc->sge.timer_val, 3158 sizeof(sc->sge.timer_val), sysctl_int_array, "A", 3159 "interrupt holdoff timer values (us)"); 3160 3161 SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "holdoff_pkt_counts", 3162 CTLTYPE_STRING | CTLFLAG_RD, sc->sge.counter_val, 3163 sizeof(sc->sge.counter_val), sysctl_int_array, "A", 3164 "interrupt holdoff packet counter values"); 3165 3166 #ifdef SBUF_DRAIN 3167 /* 3168 * dev.t4nex.X.misc. Marked CTLFLAG_SKIP to avoid information overload. 3169 */ 3170 oid = SYSCTL_ADD_NODE(ctx, c0, OID_AUTO, "misc", 3171 CTLFLAG_RD | CTLFLAG_SKIP, NULL, 3172 "logs and miscellaneous information"); 3173 children = SYSCTL_CHILDREN(oid); 3174 3175 SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "cctrl", 3176 CTLTYPE_STRING | CTLFLAG_RD, sc, 0, 3177 sysctl_cctrl, "A", "congestion control"); 3178 3179 SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "cpl_stats", 3180 CTLTYPE_STRING | CTLFLAG_RD, sc, 0, 3181 sysctl_cpl_stats, "A", "CPL statistics"); 3182 3183 SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "ddp_stats", 3184 CTLTYPE_STRING | CTLFLAG_RD, sc, 0, 3185 sysctl_ddp_stats, "A", "DDP statistics"); 3186 3187 SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "devlog", 3188 CTLTYPE_STRING | CTLFLAG_RD, sc, 0, 3189 sysctl_devlog, "A", "firmware's device log"); 3190 3191 SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "fcoe_stats", 3192 CTLTYPE_STRING | CTLFLAG_RD, sc, 0, 3193 sysctl_fcoe_stats, "A", "FCoE statistics"); 3194 3195 SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "hw_sched", 3196 CTLTYPE_STRING | CTLFLAG_RD, sc, 0, 3197 sysctl_hw_sched, "A", "hardware scheduler "); 3198 3199 SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "l2t", 3200 CTLTYPE_STRING | CTLFLAG_RD, sc, 0, 3201 sysctl_l2t, "A", "hardware L2 table"); 3202 3203 SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "lb_stats", 3204 CTLTYPE_STRING | CTLFLAG_RD, sc, 0, 3205 sysctl_lb_stats, "A", "loopback statistics"); 3206 3207 SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "meminfo", 3208 CTLTYPE_STRING | CTLFLAG_RD, sc, 0, 3209 sysctl_meminfo, "A", "memory regions"); 3210 3211 SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "path_mtus", 3212 CTLTYPE_STRING | CTLFLAG_RD, sc, 0, 3213 sysctl_path_mtus, "A", "path MTUs"); 3214 3215 SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "pm_stats", 3216 CTLTYPE_STRING | CTLFLAG_RD, sc, 0, 3217 sysctl_pm_stats, "A", "PM statistics"); 3218 3219 SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "rdma_stats", 3220 CTLTYPE_STRING | CTLFLAG_RD, sc, 0, 3221 sysctl_rdma_stats, "A", "RDMA statistics"); 3222 3223 SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "tcp_stats", 3224 CTLTYPE_STRING | CTLFLAG_RD, sc, 0, 3225 sysctl_tcp_stats, "A", "TCP statistics"); 3226 3227 SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "tids", 3228 CTLTYPE_STRING | CTLFLAG_RD, sc, 0, 3229 sysctl_tids, "A", "TID information"); 3230 3231 SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "tp_err_stats", 3232 CTLTYPE_STRING | CTLFLAG_RD, sc, 0, 3233 sysctl_tp_err_stats, "A", "TP error statistics"); 3234 3235 SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "tx_rate", 3236 CTLTYPE_STRING | CTLFLAG_RD, sc, 0, 3237 sysctl_tx_rate, "A", "Tx rate"); 3238 #endif 3239 3240 #ifdef TCP_OFFLOAD 3241 if (is_offload(sc)) { 3242 /* 3243 * dev.t4nex.X.toe. 3244 */ 3245 oid = SYSCTL_ADD_NODE(ctx, c0, OID_AUTO, "toe", CTLFLAG_RD, 3246 NULL, "TOE parameters"); 3247 children = SYSCTL_CHILDREN(oid); 3248 3249 sc->tt.sndbuf = 256 * 1024; 3250 SYSCTL_ADD_INT(ctx, children, OID_AUTO, "sndbuf", CTLFLAG_RW, 3251 &sc->tt.sndbuf, 0, "max hardware send buffer size"); 3252 3253 sc->tt.ddp = 0; 3254 SYSCTL_ADD_INT(ctx, children, OID_AUTO, "ddp", CTLFLAG_RW, 3255 &sc->tt.ddp, 0, "DDP allowed"); 3256 3257 sc->tt.indsz = G_INDICATESIZE(t4_read_reg(sc, A_TP_PARA_REG5)); 3258 SYSCTL_ADD_INT(ctx, children, OID_AUTO, "indsz", CTLFLAG_RW, 3259 &sc->tt.indsz, 0, "DDP max indicate size allowed"); 3260 3261 sc->tt.ddp_thres = 3262 G_RXCOALESCESIZE(t4_read_reg(sc, A_TP_PARA_REG2)); 3263 SYSCTL_ADD_INT(ctx, children, OID_AUTO, "ddp_thres", CTLFLAG_RW, 3264 &sc->tt.ddp_thres, 0, "DDP threshold"); 3265 } 3266 #endif 3267 3268 3269 return (0); 3270 } 3271 3272 static int 3273 cxgbe_sysctls(struct port_info *pi) 3274 { 3275 struct sysctl_ctx_list *ctx; 3276 struct sysctl_oid *oid; 3277 struct sysctl_oid_list *children; 3278 3279 ctx = device_get_sysctl_ctx(pi->dev); 3280 3281 /* 3282 * dev.cxgbe.X. 3283 */ 3284 oid = device_get_sysctl_tree(pi->dev); 3285 children = SYSCTL_CHILDREN(oid); 3286 3287 SYSCTL_ADD_INT(ctx, children, OID_AUTO, "nrxq", CTLFLAG_RD, 3288 &pi->nrxq, 0, "# of rx queues"); 3289 SYSCTL_ADD_INT(ctx, children, OID_AUTO, "ntxq", CTLFLAG_RD, 3290 &pi->ntxq, 0, "# of tx queues"); 3291 SYSCTL_ADD_INT(ctx, children, OID_AUTO, "first_rxq", CTLFLAG_RD, 3292 &pi->first_rxq, 0, "index of first rx queue"); 3293 SYSCTL_ADD_INT(ctx, children, OID_AUTO, "first_txq", CTLFLAG_RD, 3294 &pi->first_txq, 0, "index of first tx queue"); 3295 3296 #ifdef TCP_OFFLOAD 3297 if (is_offload(pi->adapter)) { 3298 SYSCTL_ADD_INT(ctx, children, OID_AUTO, "nofldrxq", CTLFLAG_RD, 3299 &pi->nofldrxq, 0, 3300 "# of rx queues for offloaded TCP connections"); 3301 SYSCTL_ADD_INT(ctx, children, OID_AUTO, "nofldtxq", CTLFLAG_RD, 3302 &pi->nofldtxq, 0, 3303 "# of tx queues for offloaded TCP connections"); 3304 SYSCTL_ADD_INT(ctx, children, OID_AUTO, "first_ofld_rxq", 3305 CTLFLAG_RD, &pi->first_ofld_rxq, 0, 3306 "index of first TOE rx queue"); 3307 SYSCTL_ADD_INT(ctx, children, OID_AUTO, "first_ofld_txq", 3308 CTLFLAG_RD, &pi->first_ofld_txq, 0, 3309 "index of first TOE tx queue"); 3310 } 3311 #endif 3312 3313 SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "holdoff_tmr_idx", 3314 CTLTYPE_INT | CTLFLAG_RW, pi, 0, sysctl_holdoff_tmr_idx, "I", 3315 "holdoff timer index"); 3316 SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "holdoff_pktc_idx", 3317 CTLTYPE_INT | CTLFLAG_RW, pi, 0, sysctl_holdoff_pktc_idx, "I", 3318 "holdoff packet counter index"); 3319 3320 SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "qsize_rxq", 3321 CTLTYPE_INT | CTLFLAG_RW, pi, 0, sysctl_qsize_rxq, "I", 3322 "rx queue size"); 3323 SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "qsize_txq", 3324 CTLTYPE_INT | CTLFLAG_RW, pi, 0, sysctl_qsize_txq, "I", 3325 "tx queue size"); 3326 3327 /* 3328 * dev.cxgbe.X.stats. 3329 */ 3330 oid = SYSCTL_ADD_NODE(ctx, children, OID_AUTO, "stats", CTLFLAG_RD, 3331 NULL, "port statistics"); 3332 children = SYSCTL_CHILDREN(oid); 3333 3334 #define SYSCTL_ADD_T4_REG64(pi, name, desc, reg) \ 3335 SYSCTL_ADD_OID(ctx, children, OID_AUTO, name, \ 3336 CTLTYPE_U64 | CTLFLAG_RD, pi->adapter, reg, \ 3337 sysctl_handle_t4_reg64, "QU", desc) 3338 3339 SYSCTL_ADD_T4_REG64(pi, "tx_octets", "# of octets in good frames", 3340 PORT_REG(pi->tx_chan, A_MPS_PORT_STAT_TX_PORT_BYTES_L)); 3341 SYSCTL_ADD_T4_REG64(pi, "tx_frames", "total # of good frames", 3342 PORT_REG(pi->tx_chan, A_MPS_PORT_STAT_TX_PORT_FRAMES_L)); 3343 SYSCTL_ADD_T4_REG64(pi, "tx_bcast_frames", "# of broadcast frames", 3344 PORT_REG(pi->tx_chan, A_MPS_PORT_STAT_TX_PORT_BCAST_L)); 3345 SYSCTL_ADD_T4_REG64(pi, "tx_mcast_frames", "# of multicast frames", 3346 PORT_REG(pi->tx_chan, A_MPS_PORT_STAT_TX_PORT_MCAST_L)); 3347 SYSCTL_ADD_T4_REG64(pi, "tx_ucast_frames", "# of unicast frames", 3348 PORT_REG(pi->tx_chan, A_MPS_PORT_STAT_TX_PORT_UCAST_L)); 3349 SYSCTL_ADD_T4_REG64(pi, "tx_error_frames", "# of error frames", 3350 PORT_REG(pi->tx_chan, A_MPS_PORT_STAT_TX_PORT_ERROR_L)); 3351 SYSCTL_ADD_T4_REG64(pi, "tx_frames_64", 3352 "# of tx frames in this range", 3353 PORT_REG(pi->tx_chan, A_MPS_PORT_STAT_TX_PORT_64B_L)); 3354 SYSCTL_ADD_T4_REG64(pi, "tx_frames_65_127", 3355 "# of tx frames in this range", 3356 PORT_REG(pi->tx_chan, A_MPS_PORT_STAT_TX_PORT_65B_127B_L)); 3357 SYSCTL_ADD_T4_REG64(pi, "tx_frames_128_255", 3358 "# of tx frames in this range", 3359 PORT_REG(pi->tx_chan, A_MPS_PORT_STAT_TX_PORT_128B_255B_L)); 3360 SYSCTL_ADD_T4_REG64(pi, "tx_frames_256_511", 3361 "# of tx frames in this range", 3362 PORT_REG(pi->tx_chan, A_MPS_PORT_STAT_TX_PORT_256B_511B_L)); 3363 SYSCTL_ADD_T4_REG64(pi, "tx_frames_512_1023", 3364 "# of tx frames in this range", 3365 PORT_REG(pi->tx_chan, A_MPS_PORT_STAT_TX_PORT_512B_1023B_L)); 3366 SYSCTL_ADD_T4_REG64(pi, "tx_frames_1024_1518", 3367 "# of tx frames in this range", 3368 PORT_REG(pi->tx_chan, A_MPS_PORT_STAT_TX_PORT_1024B_1518B_L)); 3369 SYSCTL_ADD_T4_REG64(pi, "tx_frames_1519_max", 3370 "# of tx frames in this range", 3371 PORT_REG(pi->tx_chan, A_MPS_PORT_STAT_TX_PORT_1519B_MAX_L)); 3372 SYSCTL_ADD_T4_REG64(pi, "tx_drop", "# of dropped tx frames", 3373 PORT_REG(pi->tx_chan, A_MPS_PORT_STAT_TX_PORT_DROP_L)); 3374 SYSCTL_ADD_T4_REG64(pi, "tx_pause", "# of pause frames transmitted", 3375 PORT_REG(pi->tx_chan, A_MPS_PORT_STAT_TX_PORT_PAUSE_L)); 3376 SYSCTL_ADD_T4_REG64(pi, "tx_ppp0", "# of PPP prio 0 frames transmitted", 3377 PORT_REG(pi->tx_chan, A_MPS_PORT_STAT_TX_PORT_PPP0_L)); 3378 SYSCTL_ADD_T4_REG64(pi, "tx_ppp1", "# of PPP prio 1 frames transmitted", 3379 PORT_REG(pi->tx_chan, A_MPS_PORT_STAT_TX_PORT_PPP1_L)); 3380 SYSCTL_ADD_T4_REG64(pi, "tx_ppp2", "# of PPP prio 2 frames transmitted", 3381 PORT_REG(pi->tx_chan, A_MPS_PORT_STAT_TX_PORT_PPP2_L)); 3382 SYSCTL_ADD_T4_REG64(pi, "tx_ppp3", "# of PPP prio 3 frames transmitted", 3383 PORT_REG(pi->tx_chan, A_MPS_PORT_STAT_TX_PORT_PPP3_L)); 3384 SYSCTL_ADD_T4_REG64(pi, "tx_ppp4", "# of PPP prio 4 frames transmitted", 3385 PORT_REG(pi->tx_chan, A_MPS_PORT_STAT_TX_PORT_PPP4_L)); 3386 SYSCTL_ADD_T4_REG64(pi, "tx_ppp5", "# of PPP prio 5 frames transmitted", 3387 PORT_REG(pi->tx_chan, A_MPS_PORT_STAT_TX_PORT_PPP5_L)); 3388 SYSCTL_ADD_T4_REG64(pi, "tx_ppp6", "# of PPP prio 6 frames transmitted", 3389 PORT_REG(pi->tx_chan, A_MPS_PORT_STAT_TX_PORT_PPP6_L)); 3390 SYSCTL_ADD_T4_REG64(pi, "tx_ppp7", "# of PPP prio 7 frames transmitted", 3391 PORT_REG(pi->tx_chan, A_MPS_PORT_STAT_TX_PORT_PPP7_L)); 3392 3393 SYSCTL_ADD_T4_REG64(pi, "rx_octets", "# of octets in good frames", 3394 PORT_REG(pi->tx_chan, A_MPS_PORT_STAT_RX_PORT_BYTES_L)); 3395 SYSCTL_ADD_T4_REG64(pi, "rx_frames", "total # of good frames", 3396 PORT_REG(pi->tx_chan, A_MPS_PORT_STAT_RX_PORT_FRAMES_L)); 3397 SYSCTL_ADD_T4_REG64(pi, "rx_bcast_frames", "# of broadcast frames", 3398 PORT_REG(pi->tx_chan, A_MPS_PORT_STAT_RX_PORT_BCAST_L)); 3399 SYSCTL_ADD_T4_REG64(pi, "rx_mcast_frames", "# of multicast frames", 3400 PORT_REG(pi->tx_chan, A_MPS_PORT_STAT_RX_PORT_MCAST_L)); 3401 SYSCTL_ADD_T4_REG64(pi, "rx_ucast_frames", "# of unicast frames", 3402 PORT_REG(pi->tx_chan, A_MPS_PORT_STAT_RX_PORT_UCAST_L)); 3403 SYSCTL_ADD_T4_REG64(pi, "rx_too_long", "# of frames exceeding MTU", 3404 PORT_REG(pi->tx_chan, A_MPS_PORT_STAT_RX_PORT_MTU_ERROR_L)); 3405 SYSCTL_ADD_T4_REG64(pi, "rx_jabber", "# of jabber frames", 3406 PORT_REG(pi->tx_chan, A_MPS_PORT_STAT_RX_PORT_MTU_CRC_ERROR_L)); 3407 SYSCTL_ADD_T4_REG64(pi, "rx_fcs_err", 3408 "# of frames received with bad FCS", 3409 PORT_REG(pi->tx_chan, A_MPS_PORT_STAT_RX_PORT_CRC_ERROR_L)); 3410 SYSCTL_ADD_T4_REG64(pi, "rx_len_err", 3411 "# of frames received with length error", 3412 PORT_REG(pi->tx_chan, A_MPS_PORT_STAT_RX_PORT_LEN_ERROR_L)); 3413 SYSCTL_ADD_T4_REG64(pi, "rx_symbol_err", "symbol errors", 3414 PORT_REG(pi->tx_chan, A_MPS_PORT_STAT_RX_PORT_SYM_ERROR_L)); 3415 SYSCTL_ADD_T4_REG64(pi, "rx_runt", "# of short frames received", 3416 PORT_REG(pi->tx_chan, A_MPS_PORT_STAT_RX_PORT_LESS_64B_L)); 3417 SYSCTL_ADD_T4_REG64(pi, "rx_frames_64", 3418 "# of rx frames in this range", 3419 PORT_REG(pi->tx_chan, A_MPS_PORT_STAT_RX_PORT_64B_L)); 3420 SYSCTL_ADD_T4_REG64(pi, "rx_frames_65_127", 3421 "# of rx frames in this range", 3422 PORT_REG(pi->tx_chan, A_MPS_PORT_STAT_RX_PORT_65B_127B_L)); 3423 SYSCTL_ADD_T4_REG64(pi, "rx_frames_128_255", 3424 "# of rx frames in this range", 3425 PORT_REG(pi->tx_chan, A_MPS_PORT_STAT_RX_PORT_128B_255B_L)); 3426 SYSCTL_ADD_T4_REG64(pi, "rx_frames_256_511", 3427 "# of rx frames in this range", 3428 PORT_REG(pi->tx_chan, A_MPS_PORT_STAT_RX_PORT_256B_511B_L)); 3429 SYSCTL_ADD_T4_REG64(pi, "rx_frames_512_1023", 3430 "# of rx frames in this range", 3431 PORT_REG(pi->tx_chan, A_MPS_PORT_STAT_RX_PORT_512B_1023B_L)); 3432 SYSCTL_ADD_T4_REG64(pi, "rx_frames_1024_1518", 3433 "# of rx frames in this range", 3434 PORT_REG(pi->tx_chan, A_MPS_PORT_STAT_RX_PORT_1024B_1518B_L)); 3435 SYSCTL_ADD_T4_REG64(pi, "rx_frames_1519_max", 3436 "# of rx frames in this range", 3437 PORT_REG(pi->tx_chan, A_MPS_PORT_STAT_RX_PORT_1519B_MAX_L)); 3438 SYSCTL_ADD_T4_REG64(pi, "rx_pause", "# of pause frames received", 3439 PORT_REG(pi->tx_chan, A_MPS_PORT_STAT_RX_PORT_PAUSE_L)); 3440 SYSCTL_ADD_T4_REG64(pi, "rx_ppp0", "# of PPP prio 0 frames received", 3441 PORT_REG(pi->tx_chan, A_MPS_PORT_STAT_RX_PORT_PPP0_L)); 3442 SYSCTL_ADD_T4_REG64(pi, "rx_ppp1", "# of PPP prio 1 frames received", 3443 PORT_REG(pi->tx_chan, A_MPS_PORT_STAT_RX_PORT_PPP1_L)); 3444 SYSCTL_ADD_T4_REG64(pi, "rx_ppp2", "# of PPP prio 2 frames received", 3445 PORT_REG(pi->tx_chan, A_MPS_PORT_STAT_RX_PORT_PPP2_L)); 3446 SYSCTL_ADD_T4_REG64(pi, "rx_ppp3", "# of PPP prio 3 frames received", 3447 PORT_REG(pi->tx_chan, A_MPS_PORT_STAT_RX_PORT_PPP3_L)); 3448 SYSCTL_ADD_T4_REG64(pi, "rx_ppp4", "# of PPP prio 4 frames received", 3449 PORT_REG(pi->tx_chan, A_MPS_PORT_STAT_RX_PORT_PPP4_L)); 3450 SYSCTL_ADD_T4_REG64(pi, "rx_ppp5", "# of PPP prio 5 frames received", 3451 PORT_REG(pi->tx_chan, A_MPS_PORT_STAT_RX_PORT_PPP5_L)); 3452 SYSCTL_ADD_T4_REG64(pi, "rx_ppp6", "# of PPP prio 6 frames received", 3453 PORT_REG(pi->tx_chan, A_MPS_PORT_STAT_RX_PORT_PPP6_L)); 3454 SYSCTL_ADD_T4_REG64(pi, "rx_ppp7", "# of PPP prio 7 frames received", 3455 PORT_REG(pi->tx_chan, A_MPS_PORT_STAT_RX_PORT_PPP7_L)); 3456 3457 #undef SYSCTL_ADD_T4_REG64 3458 3459 #define SYSCTL_ADD_T4_PORTSTAT(name, desc) \ 3460 SYSCTL_ADD_UQUAD(ctx, children, OID_AUTO, #name, CTLFLAG_RD, \ 3461 &pi->stats.name, desc) 3462 3463 /* We get these from port_stats and they may be stale by upto 1s */ 3464 SYSCTL_ADD_T4_PORTSTAT(rx_ovflow0, 3465 "# drops due to buffer-group 0 overflows"); 3466 SYSCTL_ADD_T4_PORTSTAT(rx_ovflow1, 3467 "# drops due to buffer-group 1 overflows"); 3468 SYSCTL_ADD_T4_PORTSTAT(rx_ovflow2, 3469 "# drops due to buffer-group 2 overflows"); 3470 SYSCTL_ADD_T4_PORTSTAT(rx_ovflow3, 3471 "# drops due to buffer-group 3 overflows"); 3472 SYSCTL_ADD_T4_PORTSTAT(rx_trunc0, 3473 "# of buffer-group 0 truncated packets"); 3474 SYSCTL_ADD_T4_PORTSTAT(rx_trunc1, 3475 "# of buffer-group 1 truncated packets"); 3476 SYSCTL_ADD_T4_PORTSTAT(rx_trunc2, 3477 "# of buffer-group 2 truncated packets"); 3478 SYSCTL_ADD_T4_PORTSTAT(rx_trunc3, 3479 "# of buffer-group 3 truncated packets"); 3480 3481 #undef SYSCTL_ADD_T4_PORTSTAT 3482 3483 return (0); 3484 } 3485 3486 static int 3487 sysctl_int_array(SYSCTL_HANDLER_ARGS) 3488 { 3489 int rc, *i; 3490 struct sbuf sb; 3491 3492 sbuf_new(&sb, NULL, 32, SBUF_AUTOEXTEND); 3493 for (i = arg1; arg2; arg2 -= sizeof(int), i++) 3494 sbuf_printf(&sb, "%d ", *i); 3495 sbuf_trim(&sb); 3496 sbuf_finish(&sb); 3497 rc = sysctl_handle_string(oidp, sbuf_data(&sb), sbuf_len(&sb), req); 3498 sbuf_delete(&sb); 3499 return (rc); 3500 } 3501 3502 static int 3503 sysctl_bitfield(SYSCTL_HANDLER_ARGS) 3504 { 3505 int rc; 3506 struct sbuf *sb; 3507 3508 rc = sysctl_wire_old_buffer(req, 0); 3509 if (rc != 0) 3510 return(rc); 3511 3512 sb = sbuf_new_for_sysctl(NULL, NULL, 128, req); 3513 if (sb == NULL) 3514 return (ENOMEM); 3515 3516 sbuf_printf(sb, "%b", (int)arg2, (char *)arg1); 3517 rc = sbuf_finish(sb); 3518 sbuf_delete(sb); 3519 3520 return (rc); 3521 } 3522 3523 static int 3524 sysctl_holdoff_tmr_idx(SYSCTL_HANDLER_ARGS) 3525 { 3526 struct port_info *pi = arg1; 3527 struct adapter *sc = pi->adapter; 3528 int idx, rc, i; 3529 3530 idx = pi->tmr_idx; 3531 3532 rc = sysctl_handle_int(oidp, &idx, 0, req); 3533 if (rc != 0 || req->newptr == NULL) 3534 return (rc); 3535 3536 if (idx < 0 || idx >= SGE_NTIMERS) 3537 return (EINVAL); 3538 3539 ADAPTER_LOCK(sc); 3540 rc = IS_DOOMED(pi) ? ENXIO : (IS_BUSY(sc) ? EBUSY : 0); 3541 if (rc == 0) { 3542 struct sge_rxq *rxq; 3543 uint8_t v; 3544 3545 v = V_QINTR_TIMER_IDX(idx) | V_QINTR_CNT_EN(pi->pktc_idx != -1); 3546 for_each_rxq(pi, i, rxq) { 3547 #ifdef atomic_store_rel_8 3548 atomic_store_rel_8(&rxq->iq.intr_params, v); 3549 #else 3550 rxq->iq.intr_params = v; 3551 #endif 3552 } 3553 pi->tmr_idx = idx; 3554 } 3555 3556 ADAPTER_UNLOCK(sc); 3557 return (rc); 3558 } 3559 3560 static int 3561 sysctl_holdoff_pktc_idx(SYSCTL_HANDLER_ARGS) 3562 { 3563 struct port_info *pi = arg1; 3564 struct adapter *sc = pi->adapter; 3565 int idx, rc; 3566 3567 idx = pi->pktc_idx; 3568 3569 rc = sysctl_handle_int(oidp, &idx, 0, req); 3570 if (rc != 0 || req->newptr == NULL) 3571 return (rc); 3572 3573 if (idx < -1 || idx >= SGE_NCOUNTERS) 3574 return (EINVAL); 3575 3576 ADAPTER_LOCK(sc); 3577 rc = IS_DOOMED(pi) ? ENXIO : (IS_BUSY(sc) ? EBUSY : 0); 3578 if (rc == 0 && pi->flags & PORT_INIT_DONE) 3579 rc = EBUSY; /* cannot be changed once the queues are created */ 3580 3581 if (rc == 0) 3582 pi->pktc_idx = idx; 3583 3584 ADAPTER_UNLOCK(sc); 3585 return (rc); 3586 } 3587 3588 static int 3589 sysctl_qsize_rxq(SYSCTL_HANDLER_ARGS) 3590 { 3591 struct port_info *pi = arg1; 3592 struct adapter *sc = pi->adapter; 3593 int qsize, rc; 3594 3595 qsize = pi->qsize_rxq; 3596 3597 rc = sysctl_handle_int(oidp, &qsize, 0, req); 3598 if (rc != 0 || req->newptr == NULL) 3599 return (rc); 3600 3601 if (qsize < 128 || (qsize & 7)) 3602 return (EINVAL); 3603 3604 ADAPTER_LOCK(sc); 3605 rc = IS_DOOMED(pi) ? ENXIO : (IS_BUSY(sc) ? EBUSY : 0); 3606 if (rc == 0 && pi->flags & PORT_INIT_DONE) 3607 rc = EBUSY; /* cannot be changed once the queues are created */ 3608 3609 if (rc == 0) 3610 pi->qsize_rxq = qsize; 3611 3612 ADAPTER_UNLOCK(sc); 3613 return (rc); 3614 } 3615 3616 static int 3617 sysctl_qsize_txq(SYSCTL_HANDLER_ARGS) 3618 { 3619 struct port_info *pi = arg1; 3620 struct adapter *sc = pi->adapter; 3621 int qsize, rc; 3622 3623 qsize = pi->qsize_txq; 3624 3625 rc = sysctl_handle_int(oidp, &qsize, 0, req); 3626 if (rc != 0 || req->newptr == NULL) 3627 return (rc); 3628 3629 if (qsize < 128) 3630 return (EINVAL); 3631 3632 ADAPTER_LOCK(sc); 3633 rc = IS_DOOMED(pi) ? ENXIO : (IS_BUSY(sc) ? EBUSY : 0); 3634 if (rc == 0 && pi->flags & PORT_INIT_DONE) 3635 rc = EBUSY; /* cannot be changed once the queues are created */ 3636 3637 if (rc == 0) 3638 pi->qsize_txq = qsize; 3639 3640 ADAPTER_UNLOCK(sc); 3641 return (rc); 3642 } 3643 3644 static int 3645 sysctl_handle_t4_reg64(SYSCTL_HANDLER_ARGS) 3646 { 3647 struct adapter *sc = arg1; 3648 int reg = arg2; 3649 uint64_t val; 3650 3651 val = t4_read_reg64(sc, reg); 3652 3653 return (sysctl_handle_64(oidp, &val, 0, req)); 3654 } 3655 3656 #ifdef SBUF_DRAIN 3657 static int 3658 sysctl_cctrl(SYSCTL_HANDLER_ARGS) 3659 { 3660 struct adapter *sc = arg1; 3661 struct sbuf *sb; 3662 int rc, i; 3663 uint16_t incr[NMTUS][NCCTRL_WIN]; 3664 static const char *dec_fac[] = { 3665 "0.5", "0.5625", "0.625", "0.6875", "0.75", "0.8125", "0.875", 3666 "0.9375" 3667 }; 3668 3669 rc = sysctl_wire_old_buffer(req, 0); 3670 if (rc != 0) 3671 return (rc); 3672 3673 sb = sbuf_new_for_sysctl(NULL, NULL, 4096, req); 3674 if (sb == NULL) 3675 return (ENOMEM); 3676 3677 t4_read_cong_tbl(sc, incr); 3678 3679 for (i = 0; i < NCCTRL_WIN; ++i) { 3680 sbuf_printf(sb, "%2d: %4u %4u %4u %4u %4u %4u %4u %4u\n", i, 3681 incr[0][i], incr[1][i], incr[2][i], incr[3][i], incr[4][i], 3682 incr[5][i], incr[6][i], incr[7][i]); 3683 sbuf_printf(sb, "%8u %4u %4u %4u %4u %4u %4u %4u %5u %s\n", 3684 incr[8][i], incr[9][i], incr[10][i], incr[11][i], 3685 incr[12][i], incr[13][i], incr[14][i], incr[15][i], 3686 sc->params.a_wnd[i], dec_fac[sc->params.b_wnd[i]]); 3687 } 3688 3689 rc = sbuf_finish(sb); 3690 sbuf_delete(sb); 3691 3692 return (rc); 3693 } 3694 3695 static int 3696 sysctl_cpl_stats(SYSCTL_HANDLER_ARGS) 3697 { 3698 struct adapter *sc = arg1; 3699 struct sbuf *sb; 3700 int rc; 3701 struct tp_cpl_stats stats; 3702 3703 rc = sysctl_wire_old_buffer(req, 0); 3704 if (rc != 0) 3705 return (rc); 3706 3707 sb = sbuf_new_for_sysctl(NULL, NULL, 256, req); 3708 if (sb == NULL) 3709 return (ENOMEM); 3710 3711 t4_tp_get_cpl_stats(sc, &stats); 3712 3713 sbuf_printf(sb, " channel 0 channel 1 channel 2 " 3714 "channel 3\n"); 3715 sbuf_printf(sb, "CPL requests: %10u %10u %10u %10u\n", 3716 stats.req[0], stats.req[1], stats.req[2], stats.req[3]); 3717 sbuf_printf(sb, "CPL responses: %10u %10u %10u %10u", 3718 stats.rsp[0], stats.rsp[1], stats.rsp[2], stats.rsp[3]); 3719 3720 rc = sbuf_finish(sb); 3721 sbuf_delete(sb); 3722 3723 return (rc); 3724 } 3725 3726 static int 3727 sysctl_ddp_stats(SYSCTL_HANDLER_ARGS) 3728 { 3729 struct adapter *sc = arg1; 3730 struct sbuf *sb; 3731 int rc; 3732 struct tp_usm_stats stats; 3733 3734 rc = sysctl_wire_old_buffer(req, 0); 3735 if (rc != 0) 3736 return(rc); 3737 3738 sb = sbuf_new_for_sysctl(NULL, NULL, 256, req); 3739 if (sb == NULL) 3740 return (ENOMEM); 3741 3742 t4_get_usm_stats(sc, &stats); 3743 3744 sbuf_printf(sb, "Frames: %u\n", stats.frames); 3745 sbuf_printf(sb, "Octets: %ju\n", stats.octets); 3746 sbuf_printf(sb, "Drops: %u", stats.drops); 3747 3748 rc = sbuf_finish(sb); 3749 sbuf_delete(sb); 3750 3751 return (rc); 3752 } 3753 3754 const char *devlog_level_strings[] = { 3755 [FW_DEVLOG_LEVEL_EMERG] = "EMERG", 3756 [FW_DEVLOG_LEVEL_CRIT] = "CRIT", 3757 [FW_DEVLOG_LEVEL_ERR] = "ERR", 3758 [FW_DEVLOG_LEVEL_NOTICE] = "NOTICE", 3759 [FW_DEVLOG_LEVEL_INFO] = "INFO", 3760 [FW_DEVLOG_LEVEL_DEBUG] = "DEBUG" 3761 }; 3762 3763 const char *devlog_facility_strings[] = { 3764 [FW_DEVLOG_FACILITY_CORE] = "CORE", 3765 [FW_DEVLOG_FACILITY_SCHED] = "SCHED", 3766 [FW_DEVLOG_FACILITY_TIMER] = "TIMER", 3767 [FW_DEVLOG_FACILITY_RES] = "RES", 3768 [FW_DEVLOG_FACILITY_HW] = "HW", 3769 [FW_DEVLOG_FACILITY_FLR] = "FLR", 3770 [FW_DEVLOG_FACILITY_DMAQ] = "DMAQ", 3771 [FW_DEVLOG_FACILITY_PHY] = "PHY", 3772 [FW_DEVLOG_FACILITY_MAC] = "MAC", 3773 [FW_DEVLOG_FACILITY_PORT] = "PORT", 3774 [FW_DEVLOG_FACILITY_VI] = "VI", 3775 [FW_DEVLOG_FACILITY_FILTER] = "FILTER", 3776 [FW_DEVLOG_FACILITY_ACL] = "ACL", 3777 [FW_DEVLOG_FACILITY_TM] = "TM", 3778 [FW_DEVLOG_FACILITY_QFC] = "QFC", 3779 [FW_DEVLOG_FACILITY_DCB] = "DCB", 3780 [FW_DEVLOG_FACILITY_ETH] = "ETH", 3781 [FW_DEVLOG_FACILITY_OFLD] = "OFLD", 3782 [FW_DEVLOG_FACILITY_RI] = "RI", 3783 [FW_DEVLOG_FACILITY_ISCSI] = "ISCSI", 3784 [FW_DEVLOG_FACILITY_FCOE] = "FCOE", 3785 [FW_DEVLOG_FACILITY_FOISCSI] = "FOISCSI", 3786 [FW_DEVLOG_FACILITY_FOFCOE] = "FOFCOE" 3787 }; 3788 3789 static int 3790 sysctl_devlog(SYSCTL_HANDLER_ARGS) 3791 { 3792 struct adapter *sc = arg1; 3793 struct devlog_params *dparams = &sc->params.devlog; 3794 struct fw_devlog_e *buf, *e; 3795 int i, j, rc, nentries, first = 0; 3796 struct sbuf *sb; 3797 uint64_t ftstamp = UINT64_MAX; 3798 3799 if (dparams->start == 0) 3800 return (ENXIO); 3801 3802 nentries = dparams->size / sizeof(struct fw_devlog_e); 3803 3804 buf = malloc(dparams->size, M_CXGBE, M_NOWAIT); 3805 if (buf == NULL) 3806 return (ENOMEM); 3807 3808 rc = -t4_mem_read(sc, dparams->memtype, dparams->start, dparams->size, 3809 (void *)buf); 3810 if (rc != 0) 3811 goto done; 3812 3813 for (i = 0; i < nentries; i++) { 3814 e = &buf[i]; 3815 3816 if (e->timestamp == 0) 3817 break; /* end */ 3818 3819 e->timestamp = be64toh(e->timestamp); 3820 e->seqno = be32toh(e->seqno); 3821 for (j = 0; j < 8; j++) 3822 e->params[j] = be32toh(e->params[j]); 3823 3824 if (e->timestamp < ftstamp) { 3825 ftstamp = e->timestamp; 3826 first = i; 3827 } 3828 } 3829 3830 if (buf[first].timestamp == 0) 3831 goto done; /* nothing in the log */ 3832 3833 rc = sysctl_wire_old_buffer(req, 0); 3834 if (rc != 0) 3835 goto done; 3836 3837 sb = sbuf_new_for_sysctl(NULL, NULL, 4096, req); 3838 if (sb == NULL) { 3839 rc = ENOMEM; 3840 goto done; 3841 } 3842 sbuf_printf(sb, "%10s %15s %8s %8s %s\n", 3843 "Seq#", "Tstamp", "Level", "Facility", "Message"); 3844 3845 i = first; 3846 do { 3847 e = &buf[i]; 3848 if (e->timestamp == 0) 3849 break; /* end */ 3850 3851 sbuf_printf(sb, "%10d %15ju %8s %8s ", 3852 e->seqno, e->timestamp, 3853 (e->level < nitems(devlog_level_strings) ? 3854 devlog_level_strings[e->level] : "UNKNOWN"), 3855 (e->facility < nitems(devlog_facility_strings) ? 3856 devlog_facility_strings[e->facility] : "UNKNOWN")); 3857 sbuf_printf(sb, e->fmt, e->params[0], e->params[1], 3858 e->params[2], e->params[3], e->params[4], 3859 e->params[5], e->params[6], e->params[7]); 3860 3861 if (++i == nentries) 3862 i = 0; 3863 } while (i != first); 3864 3865 rc = sbuf_finish(sb); 3866 sbuf_delete(sb); 3867 done: 3868 free(buf, M_CXGBE); 3869 return (rc); 3870 } 3871 3872 static int 3873 sysctl_fcoe_stats(SYSCTL_HANDLER_ARGS) 3874 { 3875 struct adapter *sc = arg1; 3876 struct sbuf *sb; 3877 int rc; 3878 struct tp_fcoe_stats stats[4]; 3879 3880 rc = sysctl_wire_old_buffer(req, 0); 3881 if (rc != 0) 3882 return (rc); 3883 3884 sb = sbuf_new_for_sysctl(NULL, NULL, 256, req); 3885 if (sb == NULL) 3886 return (ENOMEM); 3887 3888 t4_get_fcoe_stats(sc, 0, &stats[0]); 3889 t4_get_fcoe_stats(sc, 1, &stats[1]); 3890 t4_get_fcoe_stats(sc, 2, &stats[2]); 3891 t4_get_fcoe_stats(sc, 3, &stats[3]); 3892 3893 sbuf_printf(sb, " channel 0 channel 1 " 3894 "channel 2 channel 3\n"); 3895 sbuf_printf(sb, "octetsDDP: %16ju %16ju %16ju %16ju\n", 3896 stats[0].octetsDDP, stats[1].octetsDDP, stats[2].octetsDDP, 3897 stats[3].octetsDDP); 3898 sbuf_printf(sb, "framesDDP: %16u %16u %16u %16u\n", stats[0].framesDDP, 3899 stats[1].framesDDP, stats[2].framesDDP, stats[3].framesDDP); 3900 sbuf_printf(sb, "framesDrop: %16u %16u %16u %16u", 3901 stats[0].framesDrop, stats[1].framesDrop, stats[2].framesDrop, 3902 stats[3].framesDrop); 3903 3904 rc = sbuf_finish(sb); 3905 sbuf_delete(sb); 3906 3907 return (rc); 3908 } 3909 3910 static int 3911 sysctl_hw_sched(SYSCTL_HANDLER_ARGS) 3912 { 3913 struct adapter *sc = arg1; 3914 struct sbuf *sb; 3915 int rc, i; 3916 unsigned int map, kbps, ipg, mode; 3917 unsigned int pace_tab[NTX_SCHED]; 3918 3919 rc = sysctl_wire_old_buffer(req, 0); 3920 if (rc != 0) 3921 return (rc); 3922 3923 sb = sbuf_new_for_sysctl(NULL, NULL, 256, req); 3924 if (sb == NULL) 3925 return (ENOMEM); 3926 3927 map = t4_read_reg(sc, A_TP_TX_MOD_QUEUE_REQ_MAP); 3928 mode = G_TIMERMODE(t4_read_reg(sc, A_TP_MOD_CONFIG)); 3929 t4_read_pace_tbl(sc, pace_tab); 3930 3931 sbuf_printf(sb, "Scheduler Mode Channel Rate (Kbps) " 3932 "Class IPG (0.1 ns) Flow IPG (us)"); 3933 3934 for (i = 0; i < NTX_SCHED; ++i, map >>= 2) { 3935 t4_get_tx_sched(sc, i, &kbps, &ipg); 3936 sbuf_printf(sb, "\n %u %-5s %u ", i, 3937 (mode & (1 << i)) ? "flow" : "class", map & 3); 3938 if (kbps) 3939 sbuf_printf(sb, "%9u ", kbps); 3940 else 3941 sbuf_printf(sb, " disabled "); 3942 3943 if (ipg) 3944 sbuf_printf(sb, "%13u ", ipg); 3945 else 3946 sbuf_printf(sb, " disabled "); 3947 3948 if (pace_tab[i]) 3949 sbuf_printf(sb, "%10u", pace_tab[i]); 3950 else 3951 sbuf_printf(sb, " disabled"); 3952 } 3953 3954 rc = sbuf_finish(sb); 3955 sbuf_delete(sb); 3956 3957 return (rc); 3958 } 3959 3960 static int 3961 sysctl_lb_stats(SYSCTL_HANDLER_ARGS) 3962 { 3963 struct adapter *sc = arg1; 3964 struct sbuf *sb; 3965 int rc, i, j; 3966 uint64_t *p0, *p1; 3967 struct lb_port_stats s[2]; 3968 static const char *stat_name[] = { 3969 "OctetsOK:", "FramesOK:", "BcastFrames:", "McastFrames:", 3970 "UcastFrames:", "ErrorFrames:", "Frames64:", "Frames65To127:", 3971 "Frames128To255:", "Frames256To511:", "Frames512To1023:", 3972 "Frames1024To1518:", "Frames1519ToMax:", "FramesDropped:", 3973 "BG0FramesDropped:", "BG1FramesDropped:", "BG2FramesDropped:", 3974 "BG3FramesDropped:", "BG0FramesTrunc:", "BG1FramesTrunc:", 3975 "BG2FramesTrunc:", "BG3FramesTrunc:" 3976 }; 3977 3978 rc = sysctl_wire_old_buffer(req, 0); 3979 if (rc != 0) 3980 return (rc); 3981 3982 sb = sbuf_new_for_sysctl(NULL, NULL, 4096, req); 3983 if (sb == NULL) 3984 return (ENOMEM); 3985 3986 memset(s, 0, sizeof(s)); 3987 3988 for (i = 0; i < 4; i += 2) { 3989 t4_get_lb_stats(sc, i, &s[0]); 3990 t4_get_lb_stats(sc, i + 1, &s[1]); 3991 3992 p0 = &s[0].octets; 3993 p1 = &s[1].octets; 3994 sbuf_printf(sb, "%s Loopback %u" 3995 " Loopback %u", i == 0 ? "" : "\n", i, i + 1); 3996 3997 for (j = 0; j < nitems(stat_name); j++) 3998 sbuf_printf(sb, "\n%-17s %20ju %20ju", stat_name[j], 3999 *p0++, *p1++); 4000 } 4001 4002 rc = sbuf_finish(sb); 4003 sbuf_delete(sb); 4004 4005 return (rc); 4006 } 4007 4008 struct mem_desc { 4009 unsigned int base; 4010 unsigned int limit; 4011 unsigned int idx; 4012 }; 4013 4014 static int 4015 mem_desc_cmp(const void *a, const void *b) 4016 { 4017 return ((const struct mem_desc *)a)->base - 4018 ((const struct mem_desc *)b)->base; 4019 } 4020 4021 static void 4022 mem_region_show(struct sbuf *sb, const char *name, unsigned int from, 4023 unsigned int to) 4024 { 4025 unsigned int size; 4026 4027 size = to - from + 1; 4028 if (size == 0) 4029 return; 4030 4031 /* XXX: need humanize_number(3) in libkern for a more readable 'size' */ 4032 sbuf_printf(sb, "%-15s %#x-%#x [%u]\n", name, from, to, size); 4033 } 4034 4035 static int 4036 sysctl_meminfo(SYSCTL_HANDLER_ARGS) 4037 { 4038 struct adapter *sc = arg1; 4039 struct sbuf *sb; 4040 int rc, i, n; 4041 uint32_t lo, hi; 4042 static const char *memory[] = { "EDC0:", "EDC1:", "MC:" }; 4043 static const char *region[] = { 4044 "DBQ contexts:", "IMSG contexts:", "FLM cache:", "TCBs:", 4045 "Pstructs:", "Timers:", "Rx FL:", "Tx FL:", "Pstruct FL:", 4046 "Tx payload:", "Rx payload:", "LE hash:", "iSCSI region:", 4047 "TDDP region:", "TPT region:", "STAG region:", "RQ region:", 4048 "RQUDP region:", "PBL region:", "TXPBL region:", "ULPRX state:", 4049 "ULPTX state:", "On-chip queues:" 4050 }; 4051 struct mem_desc avail[3]; 4052 struct mem_desc mem[nitems(region) + 3]; /* up to 3 holes */ 4053 struct mem_desc *md = mem; 4054 4055 rc = sysctl_wire_old_buffer(req, 0); 4056 if (rc != 0) 4057 return (rc); 4058 4059 sb = sbuf_new_for_sysctl(NULL, NULL, 4096, req); 4060 if (sb == NULL) 4061 return (ENOMEM); 4062 4063 for (i = 0; i < nitems(mem); i++) { 4064 mem[i].limit = 0; 4065 mem[i].idx = i; 4066 } 4067 4068 /* Find and sort the populated memory ranges */ 4069 i = 0; 4070 lo = t4_read_reg(sc, A_MA_TARGET_MEM_ENABLE); 4071 if (lo & F_EDRAM0_ENABLE) { 4072 hi = t4_read_reg(sc, A_MA_EDRAM0_BAR); 4073 avail[i].base = G_EDRAM0_BASE(hi) << 20; 4074 avail[i].limit = avail[i].base + (G_EDRAM0_SIZE(hi) << 20); 4075 avail[i].idx = 0; 4076 i++; 4077 } 4078 if (lo & F_EDRAM1_ENABLE) { 4079 hi = t4_read_reg(sc, A_MA_EDRAM1_BAR); 4080 avail[i].base = G_EDRAM1_BASE(hi) << 20; 4081 avail[i].limit = avail[i].base + (G_EDRAM1_SIZE(hi) << 20); 4082 avail[i].idx = 1; 4083 i++; 4084 } 4085 if (lo & F_EXT_MEM_ENABLE) { 4086 hi = t4_read_reg(sc, A_MA_EXT_MEMORY_BAR); 4087 avail[i].base = G_EXT_MEM_BASE(hi) << 20; 4088 avail[i].limit = avail[i].base + (G_EXT_MEM_SIZE(hi) << 20); 4089 avail[i].idx = 2; 4090 i++; 4091 } 4092 if (!i) /* no memory available */ 4093 return 0; 4094 qsort(avail, i, sizeof(struct mem_desc), mem_desc_cmp); 4095 4096 (md++)->base = t4_read_reg(sc, A_SGE_DBQ_CTXT_BADDR); 4097 (md++)->base = t4_read_reg(sc, A_SGE_IMSG_CTXT_BADDR); 4098 (md++)->base = t4_read_reg(sc, A_SGE_FLM_CACHE_BADDR); 4099 (md++)->base = t4_read_reg(sc, A_TP_CMM_TCB_BASE); 4100 (md++)->base = t4_read_reg(sc, A_TP_CMM_MM_BASE); 4101 (md++)->base = t4_read_reg(sc, A_TP_CMM_TIMER_BASE); 4102 (md++)->base = t4_read_reg(sc, A_TP_CMM_MM_RX_FLST_BASE); 4103 (md++)->base = t4_read_reg(sc, A_TP_CMM_MM_TX_FLST_BASE); 4104 (md++)->base = t4_read_reg(sc, A_TP_CMM_MM_PS_FLST_BASE); 4105 4106 /* the next few have explicit upper bounds */ 4107 md->base = t4_read_reg(sc, A_TP_PMM_TX_BASE); 4108 md->limit = md->base - 1 + 4109 t4_read_reg(sc, A_TP_PMM_TX_PAGE_SIZE) * 4110 G_PMTXMAXPAGE(t4_read_reg(sc, A_TP_PMM_TX_MAX_PAGE)); 4111 md++; 4112 4113 md->base = t4_read_reg(sc, A_TP_PMM_RX_BASE); 4114 md->limit = md->base - 1 + 4115 t4_read_reg(sc, A_TP_PMM_RX_PAGE_SIZE) * 4116 G_PMRXMAXPAGE(t4_read_reg(sc, A_TP_PMM_RX_MAX_PAGE)); 4117 md++; 4118 4119 if (t4_read_reg(sc, A_LE_DB_CONFIG) & F_HASHEN) { 4120 hi = t4_read_reg(sc, A_LE_DB_TID_HASHBASE) / 4; 4121 md->base = t4_read_reg(sc, A_LE_DB_HASH_TID_BASE); 4122 md->limit = (sc->tids.ntids - hi) * 16 + md->base - 1; 4123 } else { 4124 md->base = 0; 4125 md->idx = nitems(region); /* hide it */ 4126 } 4127 md++; 4128 4129 #define ulp_region(reg) \ 4130 md->base = t4_read_reg(sc, A_ULP_ ## reg ## _LLIMIT);\ 4131 (md++)->limit = t4_read_reg(sc, A_ULP_ ## reg ## _ULIMIT) 4132 4133 ulp_region(RX_ISCSI); 4134 ulp_region(RX_TDDP); 4135 ulp_region(TX_TPT); 4136 ulp_region(RX_STAG); 4137 ulp_region(RX_RQ); 4138 ulp_region(RX_RQUDP); 4139 ulp_region(RX_PBL); 4140 ulp_region(TX_PBL); 4141 #undef ulp_region 4142 4143 md->base = t4_read_reg(sc, A_ULP_RX_CTX_BASE); 4144 md->limit = md->base + sc->tids.ntids - 1; 4145 md++; 4146 md->base = t4_read_reg(sc, A_ULP_TX_ERR_TABLE_BASE); 4147 md->limit = md->base + sc->tids.ntids - 1; 4148 md++; 4149 4150 md->base = sc->vres.ocq.start; 4151 if (sc->vres.ocq.size) 4152 md->limit = md->base + sc->vres.ocq.size - 1; 4153 else 4154 md->idx = nitems(region); /* hide it */ 4155 md++; 4156 4157 /* add any address-space holes, there can be up to 3 */ 4158 for (n = 0; n < i - 1; n++) 4159 if (avail[n].limit < avail[n + 1].base) 4160 (md++)->base = avail[n].limit; 4161 if (avail[n].limit) 4162 (md++)->base = avail[n].limit; 4163 4164 n = md - mem; 4165 qsort(mem, n, sizeof(struct mem_desc), mem_desc_cmp); 4166 4167 for (lo = 0; lo < i; lo++) 4168 mem_region_show(sb, memory[avail[lo].idx], avail[lo].base, 4169 avail[lo].limit - 1); 4170 4171 sbuf_printf(sb, "\n"); 4172 for (i = 0; i < n; i++) { 4173 if (mem[i].idx >= nitems(region)) 4174 continue; /* skip holes */ 4175 if (!mem[i].limit) 4176 mem[i].limit = i < n - 1 ? mem[i + 1].base - 1 : ~0; 4177 mem_region_show(sb, region[mem[i].idx], mem[i].base, 4178 mem[i].limit); 4179 } 4180 4181 sbuf_printf(sb, "\n"); 4182 lo = t4_read_reg(sc, A_CIM_SDRAM_BASE_ADDR); 4183 hi = t4_read_reg(sc, A_CIM_SDRAM_ADDR_SIZE) + lo - 1; 4184 mem_region_show(sb, "uP RAM:", lo, hi); 4185 4186 lo = t4_read_reg(sc, A_CIM_EXTMEM2_BASE_ADDR); 4187 hi = t4_read_reg(sc, A_CIM_EXTMEM2_ADDR_SIZE) + lo - 1; 4188 mem_region_show(sb, "uP Extmem2:", lo, hi); 4189 4190 lo = t4_read_reg(sc, A_TP_PMM_RX_MAX_PAGE); 4191 sbuf_printf(sb, "\n%u Rx pages of size %uKiB for %u channels\n", 4192 G_PMRXMAXPAGE(lo), 4193 t4_read_reg(sc, A_TP_PMM_RX_PAGE_SIZE) >> 10, 4194 (lo & F_PMRXNUMCHN) ? 2 : 1); 4195 4196 lo = t4_read_reg(sc, A_TP_PMM_TX_MAX_PAGE); 4197 hi = t4_read_reg(sc, A_TP_PMM_TX_PAGE_SIZE); 4198 sbuf_printf(sb, "%u Tx pages of size %u%ciB for %u channels\n", 4199 G_PMTXMAXPAGE(lo), 4200 hi >= (1 << 20) ? (hi >> 20) : (hi >> 10), 4201 hi >= (1 << 20) ? 'M' : 'K', 1 << G_PMTXNUMCHN(lo)); 4202 sbuf_printf(sb, "%u p-structs\n", 4203 t4_read_reg(sc, A_TP_CMM_MM_MAX_PSTRUCT)); 4204 4205 for (i = 0; i < 4; i++) { 4206 lo = t4_read_reg(sc, A_MPS_RX_PG_RSV0 + i * 4); 4207 sbuf_printf(sb, "\nPort %d using %u pages out of %u allocated", 4208 i, G_USED(lo), G_ALLOC(lo)); 4209 } 4210 for (i = 0; i < 4; i++) { 4211 lo = t4_read_reg(sc, A_MPS_RX_PG_RSV4 + i * 4); 4212 sbuf_printf(sb, 4213 "\nLoopback %d using %u pages out of %u allocated", 4214 i, G_USED(lo), G_ALLOC(lo)); 4215 } 4216 4217 rc = sbuf_finish(sb); 4218 sbuf_delete(sb); 4219 4220 return (rc); 4221 } 4222 4223 static int 4224 sysctl_path_mtus(SYSCTL_HANDLER_ARGS) 4225 { 4226 struct adapter *sc = arg1; 4227 struct sbuf *sb; 4228 int rc; 4229 uint16_t mtus[NMTUS]; 4230 4231 rc = sysctl_wire_old_buffer(req, 0); 4232 if (rc != 0) 4233 return (rc); 4234 4235 sb = sbuf_new_for_sysctl(NULL, NULL, 256, req); 4236 if (sb == NULL) 4237 return (ENOMEM); 4238 4239 t4_read_mtu_tbl(sc, mtus, NULL); 4240 4241 sbuf_printf(sb, "%u %u %u %u %u %u %u %u %u %u %u %u %u %u %u %u", 4242 mtus[0], mtus[1], mtus[2], mtus[3], mtus[4], mtus[5], mtus[6], 4243 mtus[7], mtus[8], mtus[9], mtus[10], mtus[11], mtus[12], mtus[13], 4244 mtus[14], mtus[15]); 4245 4246 rc = sbuf_finish(sb); 4247 sbuf_delete(sb); 4248 4249 return (rc); 4250 } 4251 4252 static int 4253 sysctl_pm_stats(SYSCTL_HANDLER_ARGS) 4254 { 4255 struct adapter *sc = arg1; 4256 struct sbuf *sb; 4257 int rc, i; 4258 uint32_t tx_cnt[PM_NSTATS], rx_cnt[PM_NSTATS]; 4259 uint64_t tx_cyc[PM_NSTATS], rx_cyc[PM_NSTATS]; 4260 static const char *pm_stats[] = { 4261 "Read:", "Write bypass:", "Write mem:", "Flush:", "FIFO wait:" 4262 }; 4263 4264 rc = sysctl_wire_old_buffer(req, 0); 4265 if (rc != 0) 4266 return (rc); 4267 4268 sb = sbuf_new_for_sysctl(NULL, NULL, 256, req); 4269 if (sb == NULL) 4270 return (ENOMEM); 4271 4272 t4_pmtx_get_stats(sc, tx_cnt, tx_cyc); 4273 t4_pmrx_get_stats(sc, rx_cnt, rx_cyc); 4274 4275 sbuf_printf(sb, " Tx count Tx cycles " 4276 "Rx count Rx cycles"); 4277 for (i = 0; i < PM_NSTATS; i++) 4278 sbuf_printf(sb, "\n%-13s %10u %20ju %10u %20ju", 4279 pm_stats[i], tx_cnt[i], tx_cyc[i], rx_cnt[i], rx_cyc[i]); 4280 4281 rc = sbuf_finish(sb); 4282 sbuf_delete(sb); 4283 4284 return (rc); 4285 } 4286 4287 static int 4288 sysctl_rdma_stats(SYSCTL_HANDLER_ARGS) 4289 { 4290 struct adapter *sc = arg1; 4291 struct sbuf *sb; 4292 int rc; 4293 struct tp_rdma_stats stats; 4294 4295 rc = sysctl_wire_old_buffer(req, 0); 4296 if (rc != 0) 4297 return (rc); 4298 4299 sb = sbuf_new_for_sysctl(NULL, NULL, 256, req); 4300 if (sb == NULL) 4301 return (ENOMEM); 4302 4303 t4_tp_get_rdma_stats(sc, &stats); 4304 sbuf_printf(sb, "NoRQEModDefferals: %u\n", stats.rqe_dfr_mod); 4305 sbuf_printf(sb, "NoRQEPktDefferals: %u", stats.rqe_dfr_pkt); 4306 4307 rc = sbuf_finish(sb); 4308 sbuf_delete(sb); 4309 4310 return (rc); 4311 } 4312 4313 static int 4314 sysctl_tcp_stats(SYSCTL_HANDLER_ARGS) 4315 { 4316 struct adapter *sc = arg1; 4317 struct sbuf *sb; 4318 int rc; 4319 struct tp_tcp_stats v4, v6; 4320 4321 rc = sysctl_wire_old_buffer(req, 0); 4322 if (rc != 0) 4323 return (rc); 4324 4325 sb = sbuf_new_for_sysctl(NULL, NULL, 256, req); 4326 if (sb == NULL) 4327 return (ENOMEM); 4328 4329 t4_tp_get_tcp_stats(sc, &v4, &v6); 4330 sbuf_printf(sb, 4331 " IP IPv6\n"); 4332 sbuf_printf(sb, "OutRsts: %20u %20u\n", 4333 v4.tcpOutRsts, v6.tcpOutRsts); 4334 sbuf_printf(sb, "InSegs: %20ju %20ju\n", 4335 v4.tcpInSegs, v6.tcpInSegs); 4336 sbuf_printf(sb, "OutSegs: %20ju %20ju\n", 4337 v4.tcpOutSegs, v6.tcpOutSegs); 4338 sbuf_printf(sb, "RetransSegs: %20ju %20ju", 4339 v4.tcpRetransSegs, v6.tcpRetransSegs); 4340 4341 rc = sbuf_finish(sb); 4342 sbuf_delete(sb); 4343 4344 return (rc); 4345 } 4346 4347 static int 4348 sysctl_tids(SYSCTL_HANDLER_ARGS) 4349 { 4350 struct adapter *sc = arg1; 4351 struct sbuf *sb; 4352 int rc; 4353 struct tid_info *t = &sc->tids; 4354 4355 rc = sysctl_wire_old_buffer(req, 0); 4356 if (rc != 0) 4357 return (rc); 4358 4359 sb = sbuf_new_for_sysctl(NULL, NULL, 256, req); 4360 if (sb == NULL) 4361 return (ENOMEM); 4362 4363 if (t->natids) { 4364 sbuf_printf(sb, "ATID range: 0-%u, in use: %u\n", t->natids - 1, 4365 t->atids_in_use); 4366 } 4367 4368 if (t->ntids) { 4369 if (t4_read_reg(sc, A_LE_DB_CONFIG) & F_HASHEN) { 4370 uint32_t b = t4_read_reg(sc, A_LE_DB_SERVER_INDEX) / 4; 4371 4372 if (b) { 4373 sbuf_printf(sb, "TID range: 0-%u, %u-%u", b - 1, 4374 t4_read_reg(sc, A_LE_DB_TID_HASHBASE) / 4, 4375 t->ntids - 1); 4376 } else { 4377 sbuf_printf(sb, "TID range: %u-%u", 4378 t4_read_reg(sc, A_LE_DB_TID_HASHBASE) / 4, 4379 t->ntids - 1); 4380 } 4381 } else 4382 sbuf_printf(sb, "TID range: 0-%u", t->ntids - 1); 4383 sbuf_printf(sb, ", in use: %u\n", 4384 atomic_load_acq_int(&t->tids_in_use)); 4385 } 4386 4387 if (t->nstids) { 4388 sbuf_printf(sb, "STID range: %u-%u, in use: %u\n", t->stid_base, 4389 t->stid_base + t->nstids - 1, t->stids_in_use); 4390 } 4391 4392 if (t->nftids) { 4393 sbuf_printf(sb, "FTID range: %u-%u\n", t->ftid_base, 4394 t->ftid_base + t->nftids - 1); 4395 } 4396 4397 sbuf_printf(sb, "HW TID usage: %u IP users, %u IPv6 users", 4398 t4_read_reg(sc, A_LE_DB_ACT_CNT_IPV4), 4399 t4_read_reg(sc, A_LE_DB_ACT_CNT_IPV6)); 4400 4401 rc = sbuf_finish(sb); 4402 sbuf_delete(sb); 4403 4404 return (rc); 4405 } 4406 4407 static int 4408 sysctl_tp_err_stats(SYSCTL_HANDLER_ARGS) 4409 { 4410 struct adapter *sc = arg1; 4411 struct sbuf *sb; 4412 int rc; 4413 struct tp_err_stats stats; 4414 4415 rc = sysctl_wire_old_buffer(req, 0); 4416 if (rc != 0) 4417 return (rc); 4418 4419 sb = sbuf_new_for_sysctl(NULL, NULL, 256, req); 4420 if (sb == NULL) 4421 return (ENOMEM); 4422 4423 t4_tp_get_err_stats(sc, &stats); 4424 4425 sbuf_printf(sb, " channel 0 channel 1 channel 2 " 4426 "channel 3\n"); 4427 sbuf_printf(sb, "macInErrs: %10u %10u %10u %10u\n", 4428 stats.macInErrs[0], stats.macInErrs[1], stats.macInErrs[2], 4429 stats.macInErrs[3]); 4430 sbuf_printf(sb, "hdrInErrs: %10u %10u %10u %10u\n", 4431 stats.hdrInErrs[0], stats.hdrInErrs[1], stats.hdrInErrs[2], 4432 stats.hdrInErrs[3]); 4433 sbuf_printf(sb, "tcpInErrs: %10u %10u %10u %10u\n", 4434 stats.tcpInErrs[0], stats.tcpInErrs[1], stats.tcpInErrs[2], 4435 stats.tcpInErrs[3]); 4436 sbuf_printf(sb, "tcp6InErrs: %10u %10u %10u %10u\n", 4437 stats.tcp6InErrs[0], stats.tcp6InErrs[1], stats.tcp6InErrs[2], 4438 stats.tcp6InErrs[3]); 4439 sbuf_printf(sb, "tnlCongDrops: %10u %10u %10u %10u\n", 4440 stats.tnlCongDrops[0], stats.tnlCongDrops[1], stats.tnlCongDrops[2], 4441 stats.tnlCongDrops[3]); 4442 sbuf_printf(sb, "tnlTxDrops: %10u %10u %10u %10u\n", 4443 stats.tnlTxDrops[0], stats.tnlTxDrops[1], stats.tnlTxDrops[2], 4444 stats.tnlTxDrops[3]); 4445 sbuf_printf(sb, "ofldVlanDrops: %10u %10u %10u %10u\n", 4446 stats.ofldVlanDrops[0], stats.ofldVlanDrops[1], 4447 stats.ofldVlanDrops[2], stats.ofldVlanDrops[3]); 4448 sbuf_printf(sb, "ofldChanDrops: %10u %10u %10u %10u\n\n", 4449 stats.ofldChanDrops[0], stats.ofldChanDrops[1], 4450 stats.ofldChanDrops[2], stats.ofldChanDrops[3]); 4451 sbuf_printf(sb, "ofldNoNeigh: %u\nofldCongDefer: %u", 4452 stats.ofldNoNeigh, stats.ofldCongDefer); 4453 4454 rc = sbuf_finish(sb); 4455 sbuf_delete(sb); 4456 4457 return (rc); 4458 } 4459 4460 static int 4461 sysctl_tx_rate(SYSCTL_HANDLER_ARGS) 4462 { 4463 struct adapter *sc = arg1; 4464 struct sbuf *sb; 4465 int rc; 4466 u64 nrate[NCHAN], orate[NCHAN]; 4467 4468 rc = sysctl_wire_old_buffer(req, 0); 4469 if (rc != 0) 4470 return (rc); 4471 4472 sb = sbuf_new_for_sysctl(NULL, NULL, 256, req); 4473 if (sb == NULL) 4474 return (ENOMEM); 4475 4476 t4_get_chan_txrate(sc, nrate, orate); 4477 sbuf_printf(sb, " channel 0 channel 1 channel 2 " 4478 "channel 3\n"); 4479 sbuf_printf(sb, "NIC B/s: %10ju %10ju %10ju %10ju\n", 4480 nrate[0], nrate[1], nrate[2], nrate[3]); 4481 sbuf_printf(sb, "Offload B/s: %10ju %10ju %10ju %10ju", 4482 orate[0], orate[1], orate[2], orate[3]); 4483 4484 rc = sbuf_finish(sb); 4485 sbuf_delete(sb); 4486 4487 return (rc); 4488 } 4489 #endif 4490 4491 static inline void 4492 txq_start(struct ifnet *ifp, struct sge_txq *txq) 4493 { 4494 struct buf_ring *br; 4495 struct mbuf *m; 4496 4497 TXQ_LOCK_ASSERT_OWNED(txq); 4498 4499 br = txq->br; 4500 m = txq->m ? txq->m : drbr_dequeue(ifp, br); 4501 if (m) 4502 t4_eth_tx(ifp, txq, m); 4503 } 4504 4505 void 4506 t4_tx_callout(void *arg) 4507 { 4508 struct sge_eq *eq = arg; 4509 struct adapter *sc; 4510 4511 if (EQ_TRYLOCK(eq) == 0) 4512 goto reschedule; 4513 4514 if (eq->flags & EQ_STALLED && !can_resume_tx(eq)) { 4515 EQ_UNLOCK(eq); 4516 reschedule: 4517 if (__predict_true(!(eq->flags && EQ_DOOMED))) 4518 callout_schedule(&eq->tx_callout, 1); 4519 return; 4520 } 4521 4522 EQ_LOCK_ASSERT_OWNED(eq); 4523 4524 if (__predict_true((eq->flags & EQ_DOOMED) == 0)) { 4525 4526 if ((eq->flags & EQ_TYPEMASK) == EQ_ETH) { 4527 struct sge_txq *txq = arg; 4528 struct port_info *pi = txq->ifp->if_softc; 4529 4530 sc = pi->adapter; 4531 } else { 4532 struct sge_wrq *wrq = arg; 4533 4534 sc = wrq->adapter; 4535 } 4536 4537 taskqueue_enqueue(sc->tq[eq->tx_chan], &eq->tx_task); 4538 } 4539 4540 EQ_UNLOCK(eq); 4541 } 4542 4543 void 4544 t4_tx_task(void *arg, int count) 4545 { 4546 struct sge_eq *eq = arg; 4547 4548 EQ_LOCK(eq); 4549 if ((eq->flags & EQ_TYPEMASK) == EQ_ETH) { 4550 struct sge_txq *txq = arg; 4551 txq_start(txq->ifp, txq); 4552 } else { 4553 struct sge_wrq *wrq = arg; 4554 t4_wrq_tx_locked(wrq->adapter, wrq, NULL); 4555 } 4556 EQ_UNLOCK(eq); 4557 } 4558 4559 static uint32_t 4560 fconf_to_mode(uint32_t fconf) 4561 { 4562 uint32_t mode; 4563 4564 mode = T4_FILTER_IPv4 | T4_FILTER_IPv6 | T4_FILTER_IP_SADDR | 4565 T4_FILTER_IP_DADDR | T4_FILTER_IP_SPORT | T4_FILTER_IP_DPORT; 4566 4567 if (fconf & F_FRAGMENTATION) 4568 mode |= T4_FILTER_IP_FRAGMENT; 4569 4570 if (fconf & F_MPSHITTYPE) 4571 mode |= T4_FILTER_MPS_HIT_TYPE; 4572 4573 if (fconf & F_MACMATCH) 4574 mode |= T4_FILTER_MAC_IDX; 4575 4576 if (fconf & F_ETHERTYPE) 4577 mode |= T4_FILTER_ETH_TYPE; 4578 4579 if (fconf & F_PROTOCOL) 4580 mode |= T4_FILTER_IP_PROTO; 4581 4582 if (fconf & F_TOS) 4583 mode |= T4_FILTER_IP_TOS; 4584 4585 if (fconf & F_VLAN) 4586 mode |= T4_FILTER_VLAN; 4587 4588 if (fconf & F_VNIC_ID) 4589 mode |= T4_FILTER_VNIC; 4590 4591 if (fconf & F_PORT) 4592 mode |= T4_FILTER_PORT; 4593 4594 if (fconf & F_FCOE) 4595 mode |= T4_FILTER_FCoE; 4596 4597 return (mode); 4598 } 4599 4600 static uint32_t 4601 mode_to_fconf(uint32_t mode) 4602 { 4603 uint32_t fconf = 0; 4604 4605 if (mode & T4_FILTER_IP_FRAGMENT) 4606 fconf |= F_FRAGMENTATION; 4607 4608 if (mode & T4_FILTER_MPS_HIT_TYPE) 4609 fconf |= F_MPSHITTYPE; 4610 4611 if (mode & T4_FILTER_MAC_IDX) 4612 fconf |= F_MACMATCH; 4613 4614 if (mode & T4_FILTER_ETH_TYPE) 4615 fconf |= F_ETHERTYPE; 4616 4617 if (mode & T4_FILTER_IP_PROTO) 4618 fconf |= F_PROTOCOL; 4619 4620 if (mode & T4_FILTER_IP_TOS) 4621 fconf |= F_TOS; 4622 4623 if (mode & T4_FILTER_VLAN) 4624 fconf |= F_VLAN; 4625 4626 if (mode & T4_FILTER_VNIC) 4627 fconf |= F_VNIC_ID; 4628 4629 if (mode & T4_FILTER_PORT) 4630 fconf |= F_PORT; 4631 4632 if (mode & T4_FILTER_FCoE) 4633 fconf |= F_FCOE; 4634 4635 return (fconf); 4636 } 4637 4638 static uint32_t 4639 fspec_to_fconf(struct t4_filter_specification *fs) 4640 { 4641 uint32_t fconf = 0; 4642 4643 if (fs->val.frag || fs->mask.frag) 4644 fconf |= F_FRAGMENTATION; 4645 4646 if (fs->val.matchtype || fs->mask.matchtype) 4647 fconf |= F_MPSHITTYPE; 4648 4649 if (fs->val.macidx || fs->mask.macidx) 4650 fconf |= F_MACMATCH; 4651 4652 if (fs->val.ethtype || fs->mask.ethtype) 4653 fconf |= F_ETHERTYPE; 4654 4655 if (fs->val.proto || fs->mask.proto) 4656 fconf |= F_PROTOCOL; 4657 4658 if (fs->val.tos || fs->mask.tos) 4659 fconf |= F_TOS; 4660 4661 if (fs->val.vlan_vld || fs->mask.vlan_vld) 4662 fconf |= F_VLAN; 4663 4664 if (fs->val.vnic_vld || fs->mask.vnic_vld) 4665 fconf |= F_VNIC_ID; 4666 4667 if (fs->val.iport || fs->mask.iport) 4668 fconf |= F_PORT; 4669 4670 if (fs->val.fcoe || fs->mask.fcoe) 4671 fconf |= F_FCOE; 4672 4673 return (fconf); 4674 } 4675 4676 static int 4677 get_filter_mode(struct adapter *sc, uint32_t *mode) 4678 { 4679 uint32_t fconf; 4680 4681 t4_read_indirect(sc, A_TP_PIO_ADDR, A_TP_PIO_DATA, &fconf, 1, 4682 A_TP_VLAN_PRI_MAP); 4683 4684 if (sc->filter_mode != fconf) { 4685 log(LOG_WARNING, "%s: cached filter mode out of sync %x %x.\n", 4686 device_get_nameunit(sc->dev), sc->filter_mode, fconf); 4687 sc->filter_mode = fconf; 4688 } 4689 4690 *mode = fconf_to_mode(sc->filter_mode); 4691 4692 return (0); 4693 } 4694 4695 static int 4696 set_filter_mode(struct adapter *sc, uint32_t mode) 4697 { 4698 uint32_t fconf; 4699 int rc; 4700 4701 fconf = mode_to_fconf(mode); 4702 4703 ADAPTER_LOCK(sc); 4704 if (IS_BUSY(sc)) { 4705 rc = EAGAIN; 4706 goto done; 4707 } 4708 4709 if (sc->tids.ftids_in_use > 0) { 4710 rc = EBUSY; 4711 goto done; 4712 } 4713 4714 #ifdef TCP_OFFLOAD 4715 if (sc->offload_map) { 4716 rc = EBUSY; 4717 goto done; 4718 } 4719 #endif 4720 4721 #ifdef notyet 4722 rc = -t4_set_filter_mode(sc, fconf); 4723 if (rc == 0) 4724 sc->filter_mode = fconf; 4725 #else 4726 rc = ENOTSUP; 4727 #endif 4728 4729 done: 4730 ADAPTER_UNLOCK(sc); 4731 return (rc); 4732 } 4733 4734 static inline uint64_t 4735 get_filter_hits(struct adapter *sc, uint32_t fid) 4736 { 4737 uint32_t tcb_base = t4_read_reg(sc, A_TP_CMM_TCB_BASE); 4738 uint64_t hits; 4739 4740 t4_write_reg(sc, PCIE_MEM_ACCESS_REG(A_PCIE_MEM_ACCESS_OFFSET, 0), 4741 tcb_base + (fid + sc->tids.ftid_base) * TCB_SIZE); 4742 t4_read_reg(sc, PCIE_MEM_ACCESS_REG(A_PCIE_MEM_ACCESS_OFFSET, 0)); 4743 hits = t4_read_reg64(sc, MEMWIN0_BASE + 16); 4744 4745 return (be64toh(hits)); 4746 } 4747 4748 static int 4749 get_filter(struct adapter *sc, struct t4_filter *t) 4750 { 4751 int i, nfilters = sc->tids.nftids; 4752 struct filter_entry *f; 4753 4754 ADAPTER_LOCK_ASSERT_OWNED(sc); 4755 4756 if (IS_BUSY(sc)) 4757 return (EAGAIN); 4758 4759 if (sc->tids.ftids_in_use == 0 || sc->tids.ftid_tab == NULL || 4760 t->idx >= nfilters) { 4761 t->idx = 0xffffffff; 4762 return (0); 4763 } 4764 4765 f = &sc->tids.ftid_tab[t->idx]; 4766 for (i = t->idx; i < nfilters; i++, f++) { 4767 if (f->valid) { 4768 t->idx = i; 4769 t->l2tidx = f->l2t ? f->l2t->idx : 0; 4770 t->smtidx = f->smtidx; 4771 if (f->fs.hitcnts) 4772 t->hits = get_filter_hits(sc, t->idx); 4773 else 4774 t->hits = UINT64_MAX; 4775 t->fs = f->fs; 4776 4777 return (0); 4778 } 4779 } 4780 4781 t->idx = 0xffffffff; 4782 return (0); 4783 } 4784 4785 static int 4786 set_filter(struct adapter *sc, struct t4_filter *t) 4787 { 4788 unsigned int nfilters, nports; 4789 struct filter_entry *f; 4790 int i; 4791 4792 ADAPTER_LOCK_ASSERT_OWNED(sc); 4793 4794 nfilters = sc->tids.nftids; 4795 nports = sc->params.nports; 4796 4797 if (nfilters == 0) 4798 return (ENOTSUP); 4799 4800 if (!(sc->flags & FULL_INIT_DONE)) 4801 return (EAGAIN); 4802 4803 if (t->idx >= nfilters) 4804 return (EINVAL); 4805 4806 /* Validate against the global filter mode */ 4807 if ((sc->filter_mode | fspec_to_fconf(&t->fs)) != sc->filter_mode) 4808 return (E2BIG); 4809 4810 if (t->fs.action == FILTER_SWITCH && t->fs.eport >= nports) 4811 return (EINVAL); 4812 4813 if (t->fs.val.iport >= nports) 4814 return (EINVAL); 4815 4816 /* Can't specify an iq if not steering to it */ 4817 if (!t->fs.dirsteer && t->fs.iq) 4818 return (EINVAL); 4819 4820 /* IPv6 filter idx must be 4 aligned */ 4821 if (t->fs.type == 1 && 4822 ((t->idx & 0x3) || t->idx + 4 >= nfilters)) 4823 return (EINVAL); 4824 4825 if (sc->tids.ftid_tab == NULL) { 4826 KASSERT(sc->tids.ftids_in_use == 0, 4827 ("%s: no memory allocated but filters_in_use > 0", 4828 __func__)); 4829 4830 sc->tids.ftid_tab = malloc(sizeof (struct filter_entry) * 4831 nfilters, M_CXGBE, M_NOWAIT | M_ZERO); 4832 if (sc->tids.ftid_tab == NULL) 4833 return (ENOMEM); 4834 } 4835 4836 for (i = 0; i < 4; i++) { 4837 f = &sc->tids.ftid_tab[t->idx + i]; 4838 4839 if (f->pending || f->valid) 4840 return (EBUSY); 4841 if (f->locked) 4842 return (EPERM); 4843 4844 if (t->fs.type == 0) 4845 break; 4846 } 4847 4848 f = &sc->tids.ftid_tab[t->idx]; 4849 f->fs = t->fs; 4850 4851 return set_filter_wr(sc, t->idx); 4852 } 4853 4854 static int 4855 del_filter(struct adapter *sc, struct t4_filter *t) 4856 { 4857 unsigned int nfilters; 4858 struct filter_entry *f; 4859 4860 ADAPTER_LOCK_ASSERT_OWNED(sc); 4861 4862 if (IS_BUSY(sc)) 4863 return (EAGAIN); 4864 4865 nfilters = sc->tids.nftids; 4866 4867 if (nfilters == 0) 4868 return (ENOTSUP); 4869 4870 if (sc->tids.ftid_tab == NULL || sc->tids.ftids_in_use == 0 || 4871 t->idx >= nfilters) 4872 return (EINVAL); 4873 4874 if (!(sc->flags & FULL_INIT_DONE)) 4875 return (EAGAIN); 4876 4877 f = &sc->tids.ftid_tab[t->idx]; 4878 4879 if (f->pending) 4880 return (EBUSY); 4881 if (f->locked) 4882 return (EPERM); 4883 4884 if (f->valid) { 4885 t->fs = f->fs; /* extra info for the caller */ 4886 return del_filter_wr(sc, t->idx); 4887 } 4888 4889 return (0); 4890 } 4891 4892 static void 4893 clear_filter(struct filter_entry *f) 4894 { 4895 if (f->l2t) 4896 t4_l2t_release(f->l2t); 4897 4898 bzero(f, sizeof (*f)); 4899 } 4900 4901 static int 4902 set_filter_wr(struct adapter *sc, int fidx) 4903 { 4904 struct filter_entry *f = &sc->tids.ftid_tab[fidx]; 4905 struct wrqe *wr; 4906 struct fw_filter_wr *fwr; 4907 unsigned int ftid; 4908 4909 ADAPTER_LOCK_ASSERT_OWNED(sc); 4910 4911 if (f->fs.newdmac || f->fs.newvlan) { 4912 /* This filter needs an L2T entry; allocate one. */ 4913 f->l2t = t4_l2t_alloc_switching(sc->l2t); 4914 if (f->l2t == NULL) 4915 return (EAGAIN); 4916 if (t4_l2t_set_switching(sc, f->l2t, f->fs.vlan, f->fs.eport, 4917 f->fs.dmac)) { 4918 t4_l2t_release(f->l2t); 4919 f->l2t = NULL; 4920 return (ENOMEM); 4921 } 4922 } 4923 4924 ftid = sc->tids.ftid_base + fidx; 4925 4926 wr = alloc_wrqe(sizeof(*fwr), &sc->sge.mgmtq); 4927 if (wr == NULL) 4928 return (ENOMEM); 4929 4930 fwr = wrtod(wr); 4931 bzero(fwr, sizeof (*fwr)); 4932 4933 fwr->op_pkd = htobe32(V_FW_WR_OP(FW_FILTER_WR)); 4934 fwr->len16_pkd = htobe32(FW_LEN16(*fwr)); 4935 fwr->tid_to_iq = 4936 htobe32(V_FW_FILTER_WR_TID(ftid) | 4937 V_FW_FILTER_WR_RQTYPE(f->fs.type) | 4938 V_FW_FILTER_WR_NOREPLY(0) | 4939 V_FW_FILTER_WR_IQ(f->fs.iq)); 4940 fwr->del_filter_to_l2tix = 4941 htobe32(V_FW_FILTER_WR_RPTTID(f->fs.rpttid) | 4942 V_FW_FILTER_WR_DROP(f->fs.action == FILTER_DROP) | 4943 V_FW_FILTER_WR_DIRSTEER(f->fs.dirsteer) | 4944 V_FW_FILTER_WR_MASKHASH(f->fs.maskhash) | 4945 V_FW_FILTER_WR_DIRSTEERHASH(f->fs.dirsteerhash) | 4946 V_FW_FILTER_WR_LPBK(f->fs.action == FILTER_SWITCH) | 4947 V_FW_FILTER_WR_DMAC(f->fs.newdmac) | 4948 V_FW_FILTER_WR_SMAC(f->fs.newsmac) | 4949 V_FW_FILTER_WR_INSVLAN(f->fs.newvlan == VLAN_INSERT || 4950 f->fs.newvlan == VLAN_REWRITE) | 4951 V_FW_FILTER_WR_RMVLAN(f->fs.newvlan == VLAN_REMOVE || 4952 f->fs.newvlan == VLAN_REWRITE) | 4953 V_FW_FILTER_WR_HITCNTS(f->fs.hitcnts) | 4954 V_FW_FILTER_WR_TXCHAN(f->fs.eport) | 4955 V_FW_FILTER_WR_PRIO(f->fs.prio) | 4956 V_FW_FILTER_WR_L2TIX(f->l2t ? f->l2t->idx : 0)); 4957 fwr->ethtype = htobe16(f->fs.val.ethtype); 4958 fwr->ethtypem = htobe16(f->fs.mask.ethtype); 4959 fwr->frag_to_ovlan_vldm = 4960 (V_FW_FILTER_WR_FRAG(f->fs.val.frag) | 4961 V_FW_FILTER_WR_FRAGM(f->fs.mask.frag) | 4962 V_FW_FILTER_WR_IVLAN_VLD(f->fs.val.vlan_vld) | 4963 V_FW_FILTER_WR_OVLAN_VLD(f->fs.val.vnic_vld) | 4964 V_FW_FILTER_WR_IVLAN_VLDM(f->fs.mask.vlan_vld) | 4965 V_FW_FILTER_WR_OVLAN_VLDM(f->fs.mask.vnic_vld)); 4966 fwr->smac_sel = 0; 4967 fwr->rx_chan_rx_rpl_iq = htobe16(V_FW_FILTER_WR_RX_CHAN(0) | 4968 V_FW_FILTER_WR_RX_RPL_IQ(sc->sge.fwq.abs_id)); 4969 fwr->maci_to_matchtypem = 4970 htobe32(V_FW_FILTER_WR_MACI(f->fs.val.macidx) | 4971 V_FW_FILTER_WR_MACIM(f->fs.mask.macidx) | 4972 V_FW_FILTER_WR_FCOE(f->fs.val.fcoe) | 4973 V_FW_FILTER_WR_FCOEM(f->fs.mask.fcoe) | 4974 V_FW_FILTER_WR_PORT(f->fs.val.iport) | 4975 V_FW_FILTER_WR_PORTM(f->fs.mask.iport) | 4976 V_FW_FILTER_WR_MATCHTYPE(f->fs.val.matchtype) | 4977 V_FW_FILTER_WR_MATCHTYPEM(f->fs.mask.matchtype)); 4978 fwr->ptcl = f->fs.val.proto; 4979 fwr->ptclm = f->fs.mask.proto; 4980 fwr->ttyp = f->fs.val.tos; 4981 fwr->ttypm = f->fs.mask.tos; 4982 fwr->ivlan = htobe16(f->fs.val.vlan); 4983 fwr->ivlanm = htobe16(f->fs.mask.vlan); 4984 fwr->ovlan = htobe16(f->fs.val.vnic); 4985 fwr->ovlanm = htobe16(f->fs.mask.vnic); 4986 bcopy(f->fs.val.dip, fwr->lip, sizeof (fwr->lip)); 4987 bcopy(f->fs.mask.dip, fwr->lipm, sizeof (fwr->lipm)); 4988 bcopy(f->fs.val.sip, fwr->fip, sizeof (fwr->fip)); 4989 bcopy(f->fs.mask.sip, fwr->fipm, sizeof (fwr->fipm)); 4990 fwr->lp = htobe16(f->fs.val.dport); 4991 fwr->lpm = htobe16(f->fs.mask.dport); 4992 fwr->fp = htobe16(f->fs.val.sport); 4993 fwr->fpm = htobe16(f->fs.mask.sport); 4994 if (f->fs.newsmac) 4995 bcopy(f->fs.smac, fwr->sma, sizeof (fwr->sma)); 4996 4997 f->pending = 1; 4998 sc->tids.ftids_in_use++; 4999 5000 t4_wrq_tx(sc, wr); 5001 return (0); 5002 } 5003 5004 static int 5005 del_filter_wr(struct adapter *sc, int fidx) 5006 { 5007 struct filter_entry *f = &sc->tids.ftid_tab[fidx]; 5008 struct wrqe *wr; 5009 struct fw_filter_wr *fwr; 5010 unsigned int ftid; 5011 5012 ADAPTER_LOCK_ASSERT_OWNED(sc); 5013 5014 ftid = sc->tids.ftid_base + fidx; 5015 5016 wr = alloc_wrqe(sizeof(*fwr), &sc->sge.mgmtq); 5017 if (wr == NULL) 5018 return (ENOMEM); 5019 fwr = wrtod(wr); 5020 bzero(fwr, sizeof (*fwr)); 5021 5022 t4_mk_filtdelwr(ftid, fwr, sc->sge.fwq.abs_id); 5023 5024 f->pending = 1; 5025 t4_wrq_tx(sc, wr); 5026 return (0); 5027 } 5028 5029 int 5030 t4_filter_rpl(struct sge_iq *iq, const struct rss_header *rss, struct mbuf *m) 5031 { 5032 struct adapter *sc = iq->adapter; 5033 const struct cpl_set_tcb_rpl *rpl = (const void *)(rss + 1); 5034 unsigned int idx = GET_TID(rpl); 5035 5036 KASSERT(m == NULL, ("%s: payload with opcode %02x", __func__, 5037 rss->opcode)); 5038 5039 if (idx >= sc->tids.ftid_base && 5040 (idx -= sc->tids.ftid_base) < sc->tids.nftids) { 5041 unsigned int rc = G_COOKIE(rpl->cookie); 5042 struct filter_entry *f = &sc->tids.ftid_tab[idx]; 5043 5044 ADAPTER_LOCK(sc); 5045 if (rc == FW_FILTER_WR_FLT_ADDED) { 5046 f->smtidx = (be64toh(rpl->oldval) >> 24) & 0xff; 5047 f->pending = 0; /* asynchronous setup completed */ 5048 f->valid = 1; 5049 } else { 5050 if (rc != FW_FILTER_WR_FLT_DELETED) { 5051 /* Add or delete failed, display an error */ 5052 log(LOG_ERR, 5053 "filter %u setup failed with error %u\n", 5054 idx, rc); 5055 } 5056 5057 clear_filter(f); 5058 sc->tids.ftids_in_use--; 5059 } 5060 ADAPTER_UNLOCK(sc); 5061 } 5062 5063 return (0); 5064 } 5065 5066 static int 5067 get_sge_context(struct adapter *sc, struct t4_sge_context *cntxt) 5068 { 5069 int rc = EINVAL; 5070 5071 if (cntxt->cid > M_CTXTQID) 5072 return (rc); 5073 5074 if (cntxt->mem_id != CTXT_EGRESS && cntxt->mem_id != CTXT_INGRESS && 5075 cntxt->mem_id != CTXT_FLM && cntxt->mem_id != CTXT_CNM) 5076 return (rc); 5077 5078 if (sc->flags & FW_OK) { 5079 ADAPTER_LOCK(sc); /* Avoid parallel t4_wr_mbox */ 5080 rc = -t4_sge_ctxt_rd(sc, sc->mbox, cntxt->cid, cntxt->mem_id, 5081 &cntxt->data[0]); 5082 ADAPTER_UNLOCK(sc); 5083 } 5084 5085 if (rc != 0) { 5086 /* Read via firmware failed or wasn't even attempted */ 5087 5088 rc = -t4_sge_ctxt_rd_bd(sc, cntxt->cid, cntxt->mem_id, 5089 &cntxt->data[0]); 5090 } 5091 5092 return (rc); 5093 } 5094 5095 static int 5096 read_card_mem(struct adapter *sc, struct t4_mem_range *mr) 5097 { 5098 uint32_t base, size, lo, hi, win, off, remaining, i, n; 5099 uint32_t *buf, *b; 5100 int rc; 5101 5102 /* reads are in multiples of 32 bits */ 5103 if (mr->addr & 3 || mr->len & 3 || mr->len == 0) 5104 return (EINVAL); 5105 5106 /* 5107 * We don't want to deal with potential holes so we mandate that the 5108 * requested region must lie entirely within one of the 3 memories. 5109 */ 5110 lo = t4_read_reg(sc, A_MA_TARGET_MEM_ENABLE); 5111 if (lo & F_EDRAM0_ENABLE) { 5112 hi = t4_read_reg(sc, A_MA_EDRAM0_BAR); 5113 base = G_EDRAM0_BASE(hi) << 20; 5114 size = G_EDRAM0_SIZE(hi) << 20; 5115 if (size > 0 && 5116 mr->addr >= base && mr->addr < base + size && 5117 mr->addr + mr->len <= base + size) 5118 goto proceed; 5119 } 5120 if (lo & F_EDRAM1_ENABLE) { 5121 hi = t4_read_reg(sc, A_MA_EDRAM1_BAR); 5122 base = G_EDRAM1_BASE(hi) << 20; 5123 size = G_EDRAM1_SIZE(hi) << 20; 5124 if (size > 0 && 5125 mr->addr >= base && mr->addr < base + size && 5126 mr->addr + mr->len <= base + size) 5127 goto proceed; 5128 } 5129 if (lo & F_EXT_MEM_ENABLE) { 5130 hi = t4_read_reg(sc, A_MA_EXT_MEMORY_BAR); 5131 base = G_EXT_MEM_BASE(hi) << 20; 5132 size = G_EXT_MEM_SIZE(hi) << 20; 5133 if (size > 0 && 5134 mr->addr >= base && mr->addr < base + size && 5135 mr->addr + mr->len <= base + size) 5136 goto proceed; 5137 } 5138 return (ENXIO); 5139 5140 proceed: 5141 buf = b = malloc(mr->len, M_CXGBE, M_WAITOK); 5142 5143 /* 5144 * Position the PCIe window (we use memwin2) to the 16B aligned area 5145 * just at/before the requested region. 5146 */ 5147 win = mr->addr & ~0xf; 5148 off = mr->addr - win; /* offset of the requested region in the win */ 5149 remaining = mr->len; 5150 5151 while (remaining) { 5152 t4_write_reg(sc, 5153 PCIE_MEM_ACCESS_REG(A_PCIE_MEM_ACCESS_OFFSET, 2), win); 5154 t4_read_reg(sc, 5155 PCIE_MEM_ACCESS_REG(A_PCIE_MEM_ACCESS_OFFSET, 2)); 5156 5157 /* number of bytes that we'll copy in the inner loop */ 5158 n = min(remaining, MEMWIN2_APERTURE - off); 5159 5160 for (i = 0; i < n; i += 4, remaining -= 4) 5161 *b++ = t4_read_reg(sc, MEMWIN2_BASE + off + i); 5162 5163 win += MEMWIN2_APERTURE; 5164 off = 0; 5165 } 5166 5167 rc = copyout(buf, mr->data, mr->len); 5168 free(buf, M_CXGBE); 5169 5170 return (rc); 5171 } 5172 5173 int 5174 t4_os_find_pci_capability(struct adapter *sc, int cap) 5175 { 5176 int i; 5177 5178 return (pci_find_cap(sc->dev, cap, &i) == 0 ? i : 0); 5179 } 5180 5181 int 5182 t4_os_pci_save_state(struct adapter *sc) 5183 { 5184 device_t dev; 5185 struct pci_devinfo *dinfo; 5186 5187 dev = sc->dev; 5188 dinfo = device_get_ivars(dev); 5189 5190 pci_cfg_save(dev, dinfo, 0); 5191 return (0); 5192 } 5193 5194 int 5195 t4_os_pci_restore_state(struct adapter *sc) 5196 { 5197 device_t dev; 5198 struct pci_devinfo *dinfo; 5199 5200 dev = sc->dev; 5201 dinfo = device_get_ivars(dev); 5202 5203 pci_cfg_restore(dev, dinfo); 5204 return (0); 5205 } 5206 5207 void 5208 t4_os_portmod_changed(const struct adapter *sc, int idx) 5209 { 5210 struct port_info *pi = sc->port[idx]; 5211 static const char *mod_str[] = { 5212 NULL, "LR", "SR", "ER", "TWINAX", "active TWINAX", "LRM" 5213 }; 5214 5215 if (pi->mod_type == FW_PORT_MOD_TYPE_NONE) 5216 if_printf(pi->ifp, "transceiver unplugged.\n"); 5217 else if (pi->mod_type == FW_PORT_MOD_TYPE_UNKNOWN) 5218 if_printf(pi->ifp, "unknown transceiver inserted.\n"); 5219 else if (pi->mod_type == FW_PORT_MOD_TYPE_NOTSUPPORTED) 5220 if_printf(pi->ifp, "unsupported transceiver inserted.\n"); 5221 else if (pi->mod_type > 0 && pi->mod_type < nitems(mod_str)) { 5222 if_printf(pi->ifp, "%s transceiver inserted.\n", 5223 mod_str[pi->mod_type]); 5224 } else { 5225 if_printf(pi->ifp, "transceiver (type %d) inserted.\n", 5226 pi->mod_type); 5227 } 5228 } 5229 5230 void 5231 t4_os_link_changed(struct adapter *sc, int idx, int link_stat) 5232 { 5233 struct port_info *pi = sc->port[idx]; 5234 struct ifnet *ifp = pi->ifp; 5235 5236 if (link_stat) { 5237 ifp->if_baudrate = IF_Mbps(pi->link_cfg.speed); 5238 if_link_state_change(ifp, LINK_STATE_UP); 5239 } else 5240 if_link_state_change(ifp, LINK_STATE_DOWN); 5241 } 5242 5243 void 5244 t4_iterate(void (*func)(struct adapter *, void *), void *arg) 5245 { 5246 struct adapter *sc; 5247 5248 mtx_lock(&t4_list_lock); 5249 SLIST_FOREACH(sc, &t4_list, link) { 5250 /* 5251 * func should not make any assumptions about what state sc is 5252 * in - the only guarantee is that sc->sc_lock is a valid lock. 5253 */ 5254 func(sc, arg); 5255 } 5256 mtx_unlock(&t4_list_lock); 5257 } 5258 5259 static int 5260 t4_open(struct cdev *dev, int flags, int type, struct thread *td) 5261 { 5262 return (0); 5263 } 5264 5265 static int 5266 t4_close(struct cdev *dev, int flags, int type, struct thread *td) 5267 { 5268 return (0); 5269 } 5270 5271 static int 5272 t4_ioctl(struct cdev *dev, unsigned long cmd, caddr_t data, int fflag, 5273 struct thread *td) 5274 { 5275 int rc; 5276 struct adapter *sc = dev->si_drv1; 5277 5278 rc = priv_check(td, PRIV_DRIVER); 5279 if (rc != 0) 5280 return (rc); 5281 5282 switch (cmd) { 5283 case CHELSIO_T4_GETREG: { 5284 struct t4_reg *edata = (struct t4_reg *)data; 5285 5286 if ((edata->addr & 0x3) != 0 || edata->addr >= sc->mmio_len) 5287 return (EFAULT); 5288 5289 if (edata->size == 4) 5290 edata->val = t4_read_reg(sc, edata->addr); 5291 else if (edata->size == 8) 5292 edata->val = t4_read_reg64(sc, edata->addr); 5293 else 5294 return (EINVAL); 5295 5296 break; 5297 } 5298 case CHELSIO_T4_SETREG: { 5299 struct t4_reg *edata = (struct t4_reg *)data; 5300 5301 if ((edata->addr & 0x3) != 0 || edata->addr >= sc->mmio_len) 5302 return (EFAULT); 5303 5304 if (edata->size == 4) { 5305 if (edata->val & 0xffffffff00000000) 5306 return (EINVAL); 5307 t4_write_reg(sc, edata->addr, (uint32_t) edata->val); 5308 } else if (edata->size == 8) 5309 t4_write_reg64(sc, edata->addr, edata->val); 5310 else 5311 return (EINVAL); 5312 break; 5313 } 5314 case CHELSIO_T4_REGDUMP: { 5315 struct t4_regdump *regs = (struct t4_regdump *)data; 5316 int reglen = T4_REGDUMP_SIZE; 5317 uint8_t *buf; 5318 5319 if (regs->len < reglen) { 5320 regs->len = reglen; /* hint to the caller */ 5321 return (ENOBUFS); 5322 } 5323 5324 regs->len = reglen; 5325 buf = malloc(reglen, M_CXGBE, M_WAITOK | M_ZERO); 5326 t4_get_regs(sc, regs, buf); 5327 rc = copyout(buf, regs->data, reglen); 5328 free(buf, M_CXGBE); 5329 break; 5330 } 5331 case CHELSIO_T4_GET_FILTER_MODE: 5332 rc = get_filter_mode(sc, (uint32_t *)data); 5333 break; 5334 case CHELSIO_T4_SET_FILTER_MODE: 5335 rc = set_filter_mode(sc, *(uint32_t *)data); 5336 break; 5337 case CHELSIO_T4_GET_FILTER: 5338 ADAPTER_LOCK(sc); 5339 rc = get_filter(sc, (struct t4_filter *)data); 5340 ADAPTER_UNLOCK(sc); 5341 break; 5342 case CHELSIO_T4_SET_FILTER: 5343 ADAPTER_LOCK(sc); 5344 rc = set_filter(sc, (struct t4_filter *)data); 5345 ADAPTER_UNLOCK(sc); 5346 break; 5347 case CHELSIO_T4_DEL_FILTER: 5348 ADAPTER_LOCK(sc); 5349 rc = del_filter(sc, (struct t4_filter *)data); 5350 ADAPTER_UNLOCK(sc); 5351 break; 5352 case CHELSIO_T4_GET_SGE_CONTEXT: 5353 rc = get_sge_context(sc, (struct t4_sge_context *)data); 5354 break; 5355 case CHELSIO_T4_LOAD_FW: { 5356 struct t4_data *fw = (struct t4_data *)data; 5357 uint8_t *fw_data; 5358 5359 if (sc->flags & FULL_INIT_DONE) 5360 return (EBUSY); 5361 5362 fw_data = malloc(fw->len, M_CXGBE, M_NOWAIT); 5363 if (fw_data == NULL) 5364 return (ENOMEM); 5365 5366 rc = copyin(fw->data, fw_data, fw->len); 5367 if (rc == 0) 5368 rc = -t4_load_fw(sc, fw_data, fw->len); 5369 5370 free(fw_data, M_CXGBE); 5371 break; 5372 } 5373 case CHELSIO_T4_GET_MEM: 5374 rc = read_card_mem(sc, (struct t4_mem_range *)data); 5375 break; 5376 default: 5377 rc = EINVAL; 5378 } 5379 5380 return (rc); 5381 } 5382 5383 #ifdef TCP_OFFLOAD 5384 static int 5385 toe_capability(struct port_info *pi, int enable) 5386 { 5387 int rc; 5388 struct adapter *sc = pi->adapter; 5389 5390 ADAPTER_LOCK_ASSERT_OWNED(sc); 5391 5392 if (!is_offload(sc)) 5393 return (ENODEV); 5394 5395 if (enable) { 5396 if (!(sc->flags & FULL_INIT_DONE)) { 5397 log(LOG_WARNING, 5398 "You must enable a cxgbe interface first\n"); 5399 return (EAGAIN); 5400 } 5401 5402 if (isset(&sc->offload_map, pi->port_id)) 5403 return (0); 5404 5405 if (!(sc->flags & TOM_INIT_DONE)) { 5406 rc = t4_activate_uld(sc, ULD_TOM); 5407 if (rc == EAGAIN) { 5408 log(LOG_WARNING, 5409 "You must kldload t4_tom.ko before trying " 5410 "to enable TOE on a cxgbe interface.\n"); 5411 } 5412 if (rc != 0) 5413 return (rc); 5414 KASSERT(sc->tom_softc != NULL, 5415 ("%s: TOM activated but softc NULL", __func__)); 5416 KASSERT(sc->flags & TOM_INIT_DONE, 5417 ("%s: TOM activated but flag not set", __func__)); 5418 } 5419 5420 setbit(&sc->offload_map, pi->port_id); 5421 } else { 5422 if (!isset(&sc->offload_map, pi->port_id)) 5423 return (0); 5424 5425 KASSERT(sc->flags & TOM_INIT_DONE, 5426 ("%s: TOM never initialized?", __func__)); 5427 clrbit(&sc->offload_map, pi->port_id); 5428 } 5429 5430 return (0); 5431 } 5432 5433 /* 5434 * Add an upper layer driver to the global list. 5435 */ 5436 int 5437 t4_register_uld(struct uld_info *ui) 5438 { 5439 int rc = 0; 5440 struct uld_info *u; 5441 5442 mtx_lock(&t4_uld_list_lock); 5443 SLIST_FOREACH(u, &t4_uld_list, link) { 5444 if (u->uld_id == ui->uld_id) { 5445 rc = EEXIST; 5446 goto done; 5447 } 5448 } 5449 5450 SLIST_INSERT_HEAD(&t4_uld_list, ui, link); 5451 ui->refcount = 0; 5452 done: 5453 mtx_unlock(&t4_uld_list_lock); 5454 return (rc); 5455 } 5456 5457 int 5458 t4_unregister_uld(struct uld_info *ui) 5459 { 5460 int rc = EINVAL; 5461 struct uld_info *u; 5462 5463 mtx_lock(&t4_uld_list_lock); 5464 5465 SLIST_FOREACH(u, &t4_uld_list, link) { 5466 if (u == ui) { 5467 if (ui->refcount > 0) { 5468 rc = EBUSY; 5469 goto done; 5470 } 5471 5472 SLIST_REMOVE(&t4_uld_list, ui, uld_info, link); 5473 rc = 0; 5474 goto done; 5475 } 5476 } 5477 done: 5478 mtx_unlock(&t4_uld_list_lock); 5479 return (rc); 5480 } 5481 5482 int 5483 t4_activate_uld(struct adapter *sc, int id) 5484 { 5485 int rc = EAGAIN; 5486 struct uld_info *ui; 5487 5488 mtx_lock(&t4_uld_list_lock); 5489 5490 SLIST_FOREACH(ui, &t4_uld_list, link) { 5491 if (ui->uld_id == id) { 5492 rc = ui->activate(sc); 5493 if (rc == 0) 5494 ui->refcount++; 5495 goto done; 5496 } 5497 } 5498 done: 5499 mtx_unlock(&t4_uld_list_lock); 5500 5501 return (rc); 5502 } 5503 5504 int 5505 t4_deactivate_uld(struct adapter *sc, int id) 5506 { 5507 int rc = EINVAL; 5508 struct uld_info *ui; 5509 5510 mtx_lock(&t4_uld_list_lock); 5511 5512 SLIST_FOREACH(ui, &t4_uld_list, link) { 5513 if (ui->uld_id == id) { 5514 rc = ui->deactivate(sc); 5515 if (rc == 0) 5516 ui->refcount--; 5517 goto done; 5518 } 5519 } 5520 done: 5521 mtx_unlock(&t4_uld_list_lock); 5522 5523 return (rc); 5524 } 5525 #endif 5526 5527 /* 5528 * Come up with reasonable defaults for some of the tunables, provided they're 5529 * not set by the user (in which case we'll use the values as is). 5530 */ 5531 static void 5532 tweak_tunables(void) 5533 { 5534 int nc = mp_ncpus; /* our snapshot of the number of CPUs */ 5535 5536 if (t4_ntxq10g < 1) 5537 t4_ntxq10g = min(nc, NTXQ_10G); 5538 5539 if (t4_ntxq1g < 1) 5540 t4_ntxq1g = min(nc, NTXQ_1G); 5541 5542 if (t4_nrxq10g < 1) 5543 t4_nrxq10g = min(nc, NRXQ_10G); 5544 5545 if (t4_nrxq1g < 1) 5546 t4_nrxq1g = min(nc, NRXQ_1G); 5547 5548 #ifdef TCP_OFFLOAD 5549 if (t4_nofldtxq10g < 1) 5550 t4_nofldtxq10g = min(nc, NOFLDTXQ_10G); 5551 5552 if (t4_nofldtxq1g < 1) 5553 t4_nofldtxq1g = min(nc, NOFLDTXQ_1G); 5554 5555 if (t4_nofldrxq10g < 1) 5556 t4_nofldrxq10g = min(nc, NOFLDRXQ_10G); 5557 5558 if (t4_nofldrxq1g < 1) 5559 t4_nofldrxq1g = min(nc, NOFLDRXQ_1G); 5560 5561 if (t4_toecaps_allowed == -1) 5562 t4_toecaps_allowed = FW_CAPS_CONFIG_TOE; 5563 #else 5564 if (t4_toecaps_allowed == -1) 5565 t4_toecaps_allowed = 0; 5566 #endif 5567 5568 if (t4_tmr_idx_10g < 0 || t4_tmr_idx_10g >= SGE_NTIMERS) 5569 t4_tmr_idx_10g = TMR_IDX_10G; 5570 5571 if (t4_pktc_idx_10g < -1 || t4_pktc_idx_10g >= SGE_NCOUNTERS) 5572 t4_pktc_idx_10g = PKTC_IDX_10G; 5573 5574 if (t4_tmr_idx_1g < 0 || t4_tmr_idx_1g >= SGE_NTIMERS) 5575 t4_tmr_idx_1g = TMR_IDX_1G; 5576 5577 if (t4_pktc_idx_1g < -1 || t4_pktc_idx_1g >= SGE_NCOUNTERS) 5578 t4_pktc_idx_1g = PKTC_IDX_1G; 5579 5580 if (t4_qsize_txq < 128) 5581 t4_qsize_txq = 128; 5582 5583 if (t4_qsize_rxq < 128) 5584 t4_qsize_rxq = 128; 5585 while (t4_qsize_rxq & 7) 5586 t4_qsize_rxq++; 5587 5588 t4_intr_types &= INTR_MSIX | INTR_MSI | INTR_INTX; 5589 } 5590 5591 static int 5592 t4_mod_event(module_t mod, int cmd, void *arg) 5593 { 5594 int rc = 0; 5595 5596 switch (cmd) { 5597 case MOD_LOAD: 5598 t4_sge_modload(); 5599 mtx_init(&t4_list_lock, "T4 adapters", 0, MTX_DEF); 5600 SLIST_INIT(&t4_list); 5601 #ifdef TCP_OFFLOAD 5602 mtx_init(&t4_uld_list_lock, "T4 ULDs", 0, MTX_DEF); 5603 SLIST_INIT(&t4_uld_list); 5604 #endif 5605 tweak_tunables(); 5606 break; 5607 5608 case MOD_UNLOAD: 5609 #ifdef TCP_OFFLOAD 5610 mtx_lock(&t4_uld_list_lock); 5611 if (!SLIST_EMPTY(&t4_uld_list)) { 5612 rc = EBUSY; 5613 mtx_unlock(&t4_uld_list_lock); 5614 break; 5615 } 5616 mtx_unlock(&t4_uld_list_lock); 5617 mtx_destroy(&t4_uld_list_lock); 5618 #endif 5619 mtx_lock(&t4_list_lock); 5620 if (!SLIST_EMPTY(&t4_list)) { 5621 rc = EBUSY; 5622 mtx_unlock(&t4_list_lock); 5623 break; 5624 } 5625 mtx_unlock(&t4_list_lock); 5626 mtx_destroy(&t4_list_lock); 5627 break; 5628 } 5629 5630 return (rc); 5631 } 5632 5633 static devclass_t t4_devclass; 5634 static devclass_t cxgbe_devclass; 5635 5636 DRIVER_MODULE(t4nex, pci, t4_driver, t4_devclass, t4_mod_event, 0); 5637 MODULE_VERSION(t4nex, 1); 5638 5639 DRIVER_MODULE(cxgbe, t4nex, cxgbe_driver, cxgbe_devclass, 0, 0); 5640 MODULE_VERSION(cxgbe, 1); 5641