1 /**************************************************************************
3 Copyright (c) 2007-2009, Chelsio Inc.
6 Redistribution and use in source and binary forms, with or without
7 modification, are permitted provided that the following conditions are met:
9 1. Redistributions of source code must retain the above copyright notice,
10 this list of conditions and the following disclaimer.
12 2. Neither the name of the Chelsio Corporation nor the names of its
13 contributors may be used to endorse or promote products derived from
14 this software without specific prior written permission.
16 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
17 AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18 IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19 ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
20 LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
21 CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
22 SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
23 INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
24 CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
25 ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
26 POSSIBILITY OF SUCH DAMAGE.
28 ***************************************************************************/
30 #include <sys/cdefs.h>
31 __FBSDID("$FreeBSD$");
33 #include <sys/param.h>
34 #include <sys/systm.h>
35 #include <sys/kernel.h>
37 #include <sys/module.h>
38 #include <sys/pciio.h>
40 #include <machine/bus.h>
41 #include <machine/resource.h>
42 #include <sys/bus_dma.h>
45 #include <sys/ioccom.h>
47 #include <sys/linker.h>
48 #include <sys/firmware.h>
49 #include <sys/socket.h>
50 #include <sys/sockio.h>
52 #include <sys/sysctl.h>
53 #include <sys/syslog.h>
54 #include <sys/queue.h>
55 #include <sys/taskqueue.h>
59 #include <net/ethernet.h>
61 #include <net/if_arp.h>
62 #include <net/if_dl.h>
63 #include <net/if_media.h>
64 #include <net/if_types.h>
65 #include <net/if_vlan_var.h>
67 #include <netinet/in_systm.h>
68 #include <netinet/in.h>
69 #include <netinet/if_ether.h>
70 #include <netinet/ip.h>
71 #include <netinet/ip.h>
72 #include <netinet/tcp.h>
73 #include <netinet/udp.h>
75 #include <dev/pci/pcireg.h>
76 #include <dev/pci/pcivar.h>
77 #include <dev/pci/pci_private.h>
79 #include <cxgb_include.h>
85 static int cxgb_setup_interrupts(adapter_t *);
86 static void cxgb_teardown_interrupts(adapter_t *);
87 static void cxgb_init(void *);
88 static int cxgb_init_locked(struct port_info *);
89 static int cxgb_uninit_locked(struct port_info *);
90 static int cxgb_uninit_synchronized(struct port_info *);
91 static int cxgb_ioctl(struct ifnet *, unsigned long, caddr_t);
92 static int cxgb_media_change(struct ifnet *);
93 static int cxgb_ifm_type(int);
94 static void cxgb_build_medialist(struct port_info *);
95 static void cxgb_media_status(struct ifnet *, struct ifmediareq *);
96 static int setup_sge_qsets(adapter_t *);
97 static void cxgb_async_intr(void *);
98 static void cxgb_ext_intr_handler(void *, int);
99 static void cxgb_tick_handler(void *, int);
100 static void cxgb_tick(void *);
101 static void setup_rss(adapter_t *sc);
102 static int alloc_filters(struct adapter *);
103 static int setup_hw_filters(struct adapter *);
104 static int set_filter(struct adapter *, int, const struct filter_info *);
105 static inline void mk_set_tcb_field(struct cpl_set_tcb_field *, unsigned int,
106 unsigned int, u64, u64);
107 static inline void set_tcb_field_ulp(struct cpl_set_tcb_field *, unsigned int,
108 unsigned int, u64, u64);
110 /* Attachment glue for the PCI controller end of the device. Each port of
111 * the device is attached separately, as defined later.
113 static int cxgb_controller_probe(device_t);
114 static int cxgb_controller_attach(device_t);
115 static int cxgb_controller_detach(device_t);
116 static void cxgb_free(struct adapter *);
117 static __inline void reg_block_dump(struct adapter *ap, uint8_t *buf, unsigned int start,
119 static void cxgb_get_regs(adapter_t *sc, struct ch_ifconf_regs *regs, uint8_t *buf);
120 static int cxgb_get_regs_len(void);
121 static int offload_open(struct port_info *pi);
122 static void touch_bars(device_t dev);
123 static int offload_close(struct t3cdev *tdev);
124 static void cxgb_update_mac_settings(struct port_info *p);
126 static device_method_t cxgb_controller_methods[] = {
127 DEVMETHOD(device_probe, cxgb_controller_probe),
128 DEVMETHOD(device_attach, cxgb_controller_attach),
129 DEVMETHOD(device_detach, cxgb_controller_detach),
132 DEVMETHOD(bus_print_child, bus_generic_print_child),
133 DEVMETHOD(bus_driver_added, bus_generic_driver_added),
138 static driver_t cxgb_controller_driver = {
140 cxgb_controller_methods,
141 sizeof(struct adapter)
144 static devclass_t cxgb_controller_devclass;
145 DRIVER_MODULE(cxgbc, pci, cxgb_controller_driver, cxgb_controller_devclass, 0, 0);
148 * Attachment glue for the ports. Attachment is done directly to the
151 static int cxgb_port_probe(device_t);
152 static int cxgb_port_attach(device_t);
153 static int cxgb_port_detach(device_t);
155 static device_method_t cxgb_port_methods[] = {
156 DEVMETHOD(device_probe, cxgb_port_probe),
157 DEVMETHOD(device_attach, cxgb_port_attach),
158 DEVMETHOD(device_detach, cxgb_port_detach),
162 static driver_t cxgb_port_driver = {
168 static d_ioctl_t cxgb_extension_ioctl;
169 static d_open_t cxgb_extension_open;
170 static d_close_t cxgb_extension_close;
172 static struct cdevsw cxgb_cdevsw = {
173 .d_version = D_VERSION,
175 .d_open = cxgb_extension_open,
176 .d_close = cxgb_extension_close,
177 .d_ioctl = cxgb_extension_ioctl,
181 static devclass_t cxgb_port_devclass;
182 DRIVER_MODULE(cxgb, cxgbc, cxgb_port_driver, cxgb_port_devclass, 0, 0);
185 * The driver uses the best interrupt scheme available on a platform in the
186 * order MSI-X, MSI, legacy pin interrupts. This parameter determines which
187 * of these schemes the driver may consider as follows:
189 * msi = 2: choose from among all three options
190 * msi = 1 : only consider MSI and pin interrupts
191 * msi = 0: force pin interrupts
193 static int msi_allowed = 2;
195 TUNABLE_INT("hw.cxgb.msi_allowed", &msi_allowed);
196 SYSCTL_NODE(_hw, OID_AUTO, cxgb, CTLFLAG_RD, 0, "CXGB driver parameters");
197 SYSCTL_UINT(_hw_cxgb, OID_AUTO, msi_allowed, CTLFLAG_RDTUN, &msi_allowed, 0,
198 "MSI-X, MSI, INTx selector");
201 * The driver enables offload as a default.
202 * To disable it, use ofld_disable = 1.
204 static int ofld_disable = 0;
205 TUNABLE_INT("hw.cxgb.ofld_disable", &ofld_disable);
206 SYSCTL_UINT(_hw_cxgb, OID_AUTO, ofld_disable, CTLFLAG_RDTUN, &ofld_disable, 0,
207 "disable ULP offload");
210 * The driver uses an auto-queue algorithm by default.
211 * To disable it and force a single queue-set per port, use multiq = 0
213 static int multiq = 1;
214 TUNABLE_INT("hw.cxgb.multiq", &multiq);
215 SYSCTL_UINT(_hw_cxgb, OID_AUTO, multiq, CTLFLAG_RDTUN, &multiq, 0,
216 "use min(ncpus/ports, 8) queue-sets per port");
219 * By default the driver will not update the firmware unless
220 * it was compiled against a newer version
223 static int force_fw_update = 0;
224 TUNABLE_INT("hw.cxgb.force_fw_update", &force_fw_update);
225 SYSCTL_UINT(_hw_cxgb, OID_AUTO, force_fw_update, CTLFLAG_RDTUN, &force_fw_update, 0,
226 "update firmware even if up to date");
228 int cxgb_use_16k_clusters = -1;
229 TUNABLE_INT("hw.cxgb.use_16k_clusters", &cxgb_use_16k_clusters);
230 SYSCTL_INT(_hw_cxgb, OID_AUTO, use_16k_clusters, CTLFLAG_RDTUN,
231 &cxgb_use_16k_clusters, 0, "use 16kB clusters for the jumbo queue ");
234 * Tune the size of the output queue.
236 int cxgb_snd_queue_len = IFQ_MAXLEN;
237 TUNABLE_INT("hw.cxgb.snd_queue_len", &cxgb_snd_queue_len);
238 SYSCTL_UINT(_hw_cxgb, OID_AUTO, snd_queue_len, CTLFLAG_RDTUN,
239 &cxgb_snd_queue_len, 0, "send queue size ");
243 MAX_TXQ_ENTRIES = 16384,
244 MAX_CTRL_TXQ_ENTRIES = 1024,
245 MAX_RSPQ_ENTRIES = 16384,
246 MAX_RX_BUFFERS = 16384,
247 MAX_RX_JUMBO_BUFFERS = 16384,
249 MIN_CTRL_TXQ_ENTRIES = 4,
250 MIN_RSPQ_ENTRIES = 32,
252 MIN_FL_JUMBO_ENTRIES = 32
267 u32 report_filter_id:1;
275 enum { FILTER_NO_VLAN_PRI = 7 };
277 #define EEPROM_MAGIC 0x38E2F10C
279 #define PORT_MASK ((1 << MAX_NPORTS) - 1)
281 /* Table for probing the cards. The desc field isn't actually used */
287 } cxgb_identifiers[] = {
288 {PCI_VENDOR_ID_CHELSIO, 0x0020, 0, "PE9000"},
289 {PCI_VENDOR_ID_CHELSIO, 0x0021, 1, "T302E"},
290 {PCI_VENDOR_ID_CHELSIO, 0x0022, 2, "T310E"},
291 {PCI_VENDOR_ID_CHELSIO, 0x0023, 3, "T320X"},
292 {PCI_VENDOR_ID_CHELSIO, 0x0024, 1, "T302X"},
293 {PCI_VENDOR_ID_CHELSIO, 0x0025, 3, "T320E"},
294 {PCI_VENDOR_ID_CHELSIO, 0x0026, 2, "T310X"},
295 {PCI_VENDOR_ID_CHELSIO, 0x0030, 2, "T3B10"},
296 {PCI_VENDOR_ID_CHELSIO, 0x0031, 3, "T3B20"},
297 {PCI_VENDOR_ID_CHELSIO, 0x0032, 1, "T3B02"},
298 {PCI_VENDOR_ID_CHELSIO, 0x0033, 4, "T3B04"},
299 {PCI_VENDOR_ID_CHELSIO, 0x0035, 6, "T3C10"},
300 {PCI_VENDOR_ID_CHELSIO, 0x0036, 3, "S320E-CR"},
301 {PCI_VENDOR_ID_CHELSIO, 0x0037, 7, "N320E-G2"},
305 static int set_eeprom(struct port_info *pi, const uint8_t *data, int len, int offset);
309 t3rev2char(struct adapter *adapter)
313 switch(adapter->params.rev) {
328 static struct cxgb_ident *
329 cxgb_get_ident(device_t dev)
331 struct cxgb_ident *id;
333 for (id = cxgb_identifiers; id->desc != NULL; id++) {
334 if ((id->vendor == pci_get_vendor(dev)) &&
335 (id->device == pci_get_device(dev))) {
342 static const struct adapter_info *
343 cxgb_get_adapter_info(device_t dev)
345 struct cxgb_ident *id;
346 const struct adapter_info *ai;
348 id = cxgb_get_ident(dev);
352 ai = t3_get_adapter_info(id->index);
358 cxgb_controller_probe(device_t dev)
360 const struct adapter_info *ai;
361 char *ports, buf[80];
364 ai = cxgb_get_adapter_info(dev);
368 nports = ai->nports0 + ai->nports1;
374 snprintf(buf, sizeof(buf), "%s, %d %s", ai->desc, nports, ports);
375 device_set_desc_copy(dev, buf);
376 return (BUS_PROBE_DEFAULT);
379 #define FW_FNAME "cxgb_t3fw"
380 #define TPEEPROM_NAME "cxgb_t3%c_tp_eeprom"
381 #define TPSRAM_NAME "cxgb_t3%c_protocol_sram"
384 upgrade_fw(adapter_t *sc)
386 const struct firmware *fw;
390 if ((fw = firmware_get(FW_FNAME)) == NULL) {
391 device_printf(sc->dev, "Could not find firmware image %s\n", FW_FNAME);
394 device_printf(sc->dev, "installing firmware on card\n");
395 status = t3_load_fw(sc, (const uint8_t *)fw->data, fw->datasize);
398 device_printf(sc->dev, "failed to install firmware: %d\n",
401 t3_get_fw_version(sc, &vers);
402 snprintf(&sc->fw_version[0], sizeof(sc->fw_version), "%d.%d.%d",
403 G_FW_VERSION_MAJOR(vers), G_FW_VERSION_MINOR(vers),
404 G_FW_VERSION_MICRO(vers));
407 firmware_put(fw, FIRMWARE_UNLOAD);
413 * The cxgb_controller_attach function is responsible for the initial
414 * bringup of the device. Its responsibilities include:
416 * 1. Determine if the device supports MSI or MSI-X.
417 * 2. Allocate bus resources so that we can access the Base Address Register
418 * 3. Create and initialize mutexes for the controller and its control
419 * logic such as SGE and MDIO.
420 * 4. Call hardware specific setup routine for the adapter as a whole.
421 * 5. Allocate the BAR for doing MSI-X.
422 * 6. Setup the line interrupt iff MSI-X is not supported.
423 * 7. Create the driver's taskq.
424 * 8. Start one task queue service thread.
425 * 9. Check if the firmware and SRAM are up-to-date. They will be
426 * auto-updated later (before FULL_INIT_DONE), if required.
427 * 10. Create a child device for each MAC (port)
428 * 11. Initialize T3 private state.
429 * 12. Trigger the LED
430 * 13. Setup offload iff supported.
431 * 14. Reset/restart the tick callout.
434 * NOTE: Any modification or deviation from this list MUST be reflected in
435 * the above comment. Failure to do so will result in problems on various
436 * error conditions including link flapping.
439 cxgb_controller_attach(device_t dev)
442 const struct adapter_info *ai;
450 sc = device_get_softc(dev);
453 ai = cxgb_get_adapter_info(dev);
455 /* find the PCIe link width and set max read request to 4KB*/
456 if (pci_find_extcap(dev, PCIY_EXPRESS, ®) == 0) {
458 lnk = pci_read_config(dev, reg + 0x12, 2);
459 sc->link_width = (lnk >> 4) & 0x3f;
461 pectl = pci_read_config(dev, reg + 0x8, 2);
462 pectl = (pectl & ~0x7000) | (5 << 12);
463 pci_write_config(dev, reg + 0x8, pectl, 2);
466 if (sc->link_width != 0 && sc->link_width <= 4 &&
467 (ai->nports0 + ai->nports1) <= 2) {
468 device_printf(sc->dev,
469 "PCIe x%d Link, expect reduced performance\n",
474 pci_enable_busmaster(dev);
476 * Allocate the registers and make them available to the driver.
477 * The registers that we care about for NIC mode are in BAR 0
479 sc->regs_rid = PCIR_BAR(0);
480 if ((sc->regs_res = bus_alloc_resource_any(dev, SYS_RES_MEMORY,
481 &sc->regs_rid, RF_ACTIVE)) == NULL) {
482 device_printf(dev, "Cannot allocate BAR region 0\n");
485 sc->udbs_rid = PCIR_BAR(2);
487 if (is_offload(sc) &&
488 ((sc->udbs_res = bus_alloc_resource_any(dev, SYS_RES_MEMORY,
489 &sc->udbs_rid, RF_ACTIVE)) == NULL)) {
490 device_printf(dev, "Cannot allocate BAR region 1\n");
495 snprintf(sc->lockbuf, ADAPTER_LOCK_NAME_LEN, "cxgb controller lock %d",
496 device_get_unit(dev));
497 ADAPTER_LOCK_INIT(sc, sc->lockbuf);
499 snprintf(sc->reglockbuf, ADAPTER_LOCK_NAME_LEN, "SGE reg lock %d",
500 device_get_unit(dev));
501 snprintf(sc->mdiolockbuf, ADAPTER_LOCK_NAME_LEN, "cxgb mdio lock %d",
502 device_get_unit(dev));
503 snprintf(sc->elmerlockbuf, ADAPTER_LOCK_NAME_LEN, "cxgb elmer lock %d",
504 device_get_unit(dev));
506 MTX_INIT(&sc->sge.reg_lock, sc->reglockbuf, NULL, MTX_SPIN);
507 MTX_INIT(&sc->mdio_lock, sc->mdiolockbuf, NULL, MTX_DEF);
508 MTX_INIT(&sc->elmer_lock, sc->elmerlockbuf, NULL, MTX_DEF);
510 sc->bt = rman_get_bustag(sc->regs_res);
511 sc->bh = rman_get_bushandle(sc->regs_res);
512 sc->mmio_len = rman_get_size(sc->regs_res);
514 for (i = 0; i < MAX_NPORTS; i++)
515 sc->port[i].adapter = sc;
517 if (t3_prep_adapter(sc, ai, 1) < 0) {
518 printf("prep adapter failed\n");
522 /* Allocate the BAR for doing MSI-X. If it succeeds, try to allocate
523 * enough messages for the queue sets. If that fails, try falling
524 * back to MSI. If that fails, then try falling back to the legacy
525 * interrupt pin model.
527 sc->msix_regs_rid = 0x20;
528 if ((msi_allowed >= 2) &&
529 (sc->msix_regs_res = bus_alloc_resource_any(dev, SYS_RES_MEMORY,
530 &sc->msix_regs_rid, RF_ACTIVE)) != NULL) {
533 port_qsets = min(SGE_QSETS/sc->params.nports, mp_ncpus);
534 msi_needed = sc->msi_count = sc->params.nports * port_qsets + 1;
536 if (pci_msix_count(dev) == 0 ||
537 (error = pci_alloc_msix(dev, &sc->msi_count)) != 0 ||
538 sc->msi_count != msi_needed) {
539 device_printf(dev, "alloc msix failed - "
540 "msi_count=%d, msi_needed=%d, err=%d; "
541 "will try MSI\n", sc->msi_count,
545 pci_release_msi(dev);
546 bus_release_resource(dev, SYS_RES_MEMORY,
547 sc->msix_regs_rid, sc->msix_regs_res);
548 sc->msix_regs_res = NULL;
550 sc->flags |= USING_MSIX;
551 sc->cxgb_intr = cxgb_async_intr;
553 "using MSI-X interrupts (%u vectors)\n",
558 if ((msi_allowed >= 1) && (sc->msi_count == 0)) {
560 if ((error = pci_alloc_msi(dev, &sc->msi_count)) != 0) {
561 device_printf(dev, "alloc msi failed - "
562 "err=%d; will try INTx\n", error);
565 pci_release_msi(dev);
567 sc->flags |= USING_MSI;
568 sc->cxgb_intr = t3_intr_msi;
569 device_printf(dev, "using MSI interrupts\n");
572 if (sc->msi_count == 0) {
573 device_printf(dev, "using line interrupts\n");
574 sc->cxgb_intr = t3b_intr;
577 /* Create a private taskqueue thread for handling driver events */
578 sc->tq = taskqueue_create("cxgb_taskq", M_NOWAIT,
579 taskqueue_thread_enqueue, &sc->tq);
580 if (sc->tq == NULL) {
581 device_printf(dev, "failed to allocate controller task queue\n");
585 taskqueue_start_threads(&sc->tq, 1, PI_NET, "%s taskq",
586 device_get_nameunit(dev));
587 TASK_INIT(&sc->ext_intr_task, 0, cxgb_ext_intr_handler, sc);
588 TASK_INIT(&sc->tick_task, 0, cxgb_tick_handler, sc);
591 /* Create a periodic callout for checking adapter status */
592 callout_init(&sc->cxgb_tick_ch, TRUE);
594 if (t3_check_fw_version(sc) < 0 || force_fw_update) {
596 * Warn user that a firmware update will be attempted in init.
598 device_printf(dev, "firmware needs to be updated to version %d.%d.%d\n",
599 FW_VERSION_MAJOR, FW_VERSION_MINOR, FW_VERSION_MICRO);
600 sc->flags &= ~FW_UPTODATE;
602 sc->flags |= FW_UPTODATE;
605 if (t3_check_tpsram_version(sc) < 0) {
607 * Warn user that a firmware update will be attempted in init.
609 device_printf(dev, "SRAM needs to be updated to version %c-%d.%d.%d\n",
610 t3rev2char(sc), TP_VERSION_MAJOR, TP_VERSION_MINOR, TP_VERSION_MICRO);
611 sc->flags &= ~TPS_UPTODATE;
613 sc->flags |= TPS_UPTODATE;
617 * Create a child device for each MAC. The ethernet attachment
618 * will be done in these children.
620 for (i = 0; i < (sc)->params.nports; i++) {
621 struct port_info *pi;
623 if ((child = device_add_child(dev, "cxgb", -1)) == NULL) {
624 device_printf(dev, "failed to add child port\n");
630 pi->nqsets = port_qsets;
631 pi->first_qset = i*port_qsets;
633 pi->tx_chan = i >= ai->nports0;
634 pi->txpkt_intf = pi->tx_chan ? 2 * (i - ai->nports0) + 1 : 2 * i;
635 sc->rxpkt_map[pi->txpkt_intf] = i;
636 sc->port[i].tx_chan = i >= ai->nports0;
637 sc->portdev[i] = child;
638 device_set_softc(child, pi);
640 if ((error = bus_generic_attach(dev)) != 0)
643 /* initialize sge private state */
644 t3_sge_init_adapter(sc);
649 if (is_offload(sc)) {
650 setbit(&sc->registered_device_map, OFFLOAD_DEVMAP_BIT);
651 cxgb_adapter_ofld(sc);
653 error = t3_get_fw_version(sc, &vers);
657 snprintf(&sc->fw_version[0], sizeof(sc->fw_version), "%d.%d.%d",
658 G_FW_VERSION_MAJOR(vers), G_FW_VERSION_MINOR(vers),
659 G_FW_VERSION_MICRO(vers));
661 snprintf(buf, sizeof(buf), "%s %sNIC\t E/C: %s S/N: %s",
662 ai->desc, is_offload(sc) ? "R" : "",
663 sc->params.vpd.ec, sc->params.vpd.sn);
664 device_set_desc_copy(dev, buf);
666 snprintf(&sc->port_types[0], sizeof(sc->port_types), "%x%x%x%x",
667 sc->params.vpd.port_type[0], sc->params.vpd.port_type[1],
668 sc->params.vpd.port_type[2], sc->params.vpd.port_type[3]);
670 device_printf(sc->dev, "Firmware Version %s\n", &sc->fw_version[0]);
671 callout_reset(&sc->cxgb_tick_ch, CXGB_TICKS(sc), cxgb_tick, sc);
672 t3_add_attach_sysctls(sc);
681 * The cxgb_controller_detach routine is called with the device is
682 * unloaded from the system.
686 cxgb_controller_detach(device_t dev)
690 sc = device_get_softc(dev);
698 * The cxgb_free() is called by the cxgb_controller_detach() routine
699 * to tear down the structures that were built up in
700 * cxgb_controller_attach(), and should be the final piece of work
701 * done when fully unloading the driver.
704 * 1. Shutting down the threads started by the cxgb_controller_attach()
706 * 2. Stopping the lower level device and all callouts (cxgb_down_locked()).
707 * 3. Detaching all of the port devices created during the
708 * cxgb_controller_attach() routine.
709 * 4. Removing the device children created via cxgb_controller_attach().
710 * 5. Releasing PCI resources associated with the device.
711 * 6. Turning off the offload support, iff it was turned on.
712 * 7. Destroying the mutexes created in cxgb_controller_attach().
716 cxgb_free(struct adapter *sc)
721 sc->flags |= CXGB_SHUTDOWN;
725 * Make sure all child devices are gone.
727 bus_generic_detach(sc->dev);
728 for (i = 0; i < (sc)->params.nports; i++) {
729 if (sc->portdev[i] &&
730 device_delete_child(sc->dev, sc->portdev[i]) != 0)
731 device_printf(sc->dev, "failed to delete child port\n");
735 * At this point, it is as if cxgb_port_detach has run on all ports, and
736 * cxgb_down has run on the adapter. All interrupts have been silenced,
737 * all open devices have been closed.
739 KASSERT(sc->open_device_map == 0, ("%s: device(s) still open (%x)",
740 __func__, sc->open_device_map));
741 for (i = 0; i < sc->params.nports; i++) {
742 KASSERT(sc->port[i].ifp == NULL, ("%s: port %i undead!",
747 * Finish off the adapter's callouts.
749 callout_drain(&sc->cxgb_tick_ch);
750 callout_drain(&sc->sge_timer_ch);
753 * Release resources grabbed under FULL_INIT_DONE by cxgb_up. The
754 * sysctls are cleaned up by the kernel linker.
756 if (sc->flags & FULL_INIT_DONE) {
757 t3_free_sge_resources(sc);
758 sc->flags &= ~FULL_INIT_DONE;
762 * Release all interrupt resources.
764 cxgb_teardown_interrupts(sc);
765 if (sc->flags & (USING_MSI | USING_MSIX)) {
766 device_printf(sc->dev, "releasing msi message(s)\n");
767 pci_release_msi(sc->dev);
769 device_printf(sc->dev, "no msi message to release\n");
772 if (sc->msix_regs_res != NULL) {
773 bus_release_resource(sc->dev, SYS_RES_MEMORY, sc->msix_regs_rid,
778 * Free the adapter's taskqueue.
780 if (sc->tq != NULL) {
781 taskqueue_free(sc->tq);
785 if (is_offload(sc)) {
786 clrbit(&sc->registered_device_map, OFFLOAD_DEVMAP_BIT);
787 cxgb_adapter_unofld(sc);
791 if (sc->flags & CXGB_OFLD_INIT)
792 cxgb_offload_deactivate(sc);
794 free(sc->filters, M_DEVBUF);
799 if (sc->udbs_res != NULL)
800 bus_release_resource(sc->dev, SYS_RES_MEMORY, sc->udbs_rid,
803 if (sc->regs_res != NULL)
804 bus_release_resource(sc->dev, SYS_RES_MEMORY, sc->regs_rid,
807 MTX_DESTROY(&sc->mdio_lock);
808 MTX_DESTROY(&sc->sge.reg_lock);
809 MTX_DESTROY(&sc->elmer_lock);
810 ADAPTER_LOCK_DEINIT(sc);
814 * setup_sge_qsets - configure SGE Tx/Rx/response queues
815 * @sc: the controller softc
817 * Determines how many sets of SGE queues to use and initializes them.
818 * We support multiple queue sets per port if we have MSI-X, otherwise
819 * just one queue set per port.
822 setup_sge_qsets(adapter_t *sc)
824 int i, j, err, irq_idx = 0, qset_idx = 0;
825 u_int ntxq = SGE_TXQ_PER_SET;
827 if ((err = t3_sge_alloc(sc)) != 0) {
828 device_printf(sc->dev, "t3_sge_alloc returned %d\n", err);
832 if (sc->params.rev > 0 && !(sc->flags & USING_MSI))
835 for (i = 0; i < (sc)->params.nports; i++) {
836 struct port_info *pi = &sc->port[i];
838 for (j = 0; j < pi->nqsets; j++, qset_idx++) {
839 err = t3_sge_alloc_qset(sc, qset_idx, (sc)->params.nports,
840 (sc->flags & USING_MSIX) ? qset_idx + 1 : irq_idx,
841 &sc->params.sge.qset[qset_idx], ntxq, pi);
843 t3_free_sge_resources(sc);
844 device_printf(sc->dev, "t3_sge_alloc_qset failed with %d\n",
855 cxgb_teardown_interrupts(adapter_t *sc)
859 for (i = 0; i < SGE_QSETS; i++) {
860 if (sc->msix_intr_tag[i] == NULL) {
862 /* Should have been setup fully or not at all */
863 KASSERT(sc->msix_irq_res[i] == NULL &&
864 sc->msix_irq_rid[i] == 0,
865 ("%s: half-done interrupt (%d).", __func__, i));
870 bus_teardown_intr(sc->dev, sc->msix_irq_res[i],
871 sc->msix_intr_tag[i]);
872 bus_release_resource(sc->dev, SYS_RES_IRQ, sc->msix_irq_rid[i],
873 sc->msix_irq_res[i]);
875 sc->msix_irq_res[i] = sc->msix_intr_tag[i] = NULL;
876 sc->msix_irq_rid[i] = 0;
880 KASSERT(sc->irq_res != NULL,
881 ("%s: half-done interrupt.", __func__));
883 bus_teardown_intr(sc->dev, sc->irq_res, sc->intr_tag);
884 bus_release_resource(sc->dev, SYS_RES_IRQ, sc->irq_rid,
887 sc->irq_res = sc->intr_tag = NULL;
893 cxgb_setup_interrupts(adapter_t *sc)
895 struct resource *res;
897 int i, rid, err, intr_flag = sc->flags & (USING_MSI | USING_MSIX);
899 sc->irq_rid = intr_flag ? 1 : 0;
900 sc->irq_res = bus_alloc_resource_any(sc->dev, SYS_RES_IRQ, &sc->irq_rid,
901 RF_SHAREABLE | RF_ACTIVE);
902 if (sc->irq_res == NULL) {
903 device_printf(sc->dev, "Cannot allocate interrupt (%x, %u)\n",
904 intr_flag, sc->irq_rid);
908 err = bus_setup_intr(sc->dev, sc->irq_res,
909 INTR_MPSAFE | INTR_TYPE_NET, NULL,
910 sc->cxgb_intr, sc, &sc->intr_tag);
913 device_printf(sc->dev,
914 "Cannot set up interrupt (%x, %u, %d)\n",
915 intr_flag, sc->irq_rid, err);
916 bus_release_resource(sc->dev, SYS_RES_IRQ, sc->irq_rid,
918 sc->irq_res = sc->intr_tag = NULL;
923 /* That's all for INTx or MSI */
924 if (!(intr_flag & USING_MSIX) || err)
927 for (i = 0; i < sc->msi_count - 1; i++) {
929 res = bus_alloc_resource_any(sc->dev, SYS_RES_IRQ, &rid,
930 RF_SHAREABLE | RF_ACTIVE);
932 device_printf(sc->dev, "Cannot allocate interrupt "
933 "for message %d\n", rid);
938 err = bus_setup_intr(sc->dev, res, INTR_MPSAFE | INTR_TYPE_NET,
939 NULL, t3_intr_msix, &sc->sge.qs[i], &tag);
941 device_printf(sc->dev, "Cannot set up interrupt "
942 "for message %d (%d)\n", rid, err);
943 bus_release_resource(sc->dev, SYS_RES_IRQ, rid, res);
947 sc->msix_irq_rid[i] = rid;
948 sc->msix_irq_res[i] = res;
949 sc->msix_intr_tag[i] = tag;
953 cxgb_teardown_interrupts(sc);
960 cxgb_port_probe(device_t dev)
966 p = device_get_softc(dev);
968 snprintf(buf, sizeof(buf), "Port %d %s", p->port_id, desc);
969 device_set_desc_copy(dev, buf);
975 cxgb_makedev(struct port_info *pi)
978 pi->port_cdev = make_dev(&cxgb_cdevsw, pi->ifp->if_dunit,
979 UID_ROOT, GID_WHEEL, 0600, if_name(pi->ifp));
981 if (pi->port_cdev == NULL)
984 pi->port_cdev->si_drv1 = (void *)pi;
989 #define CXGB_CAP (IFCAP_VLAN_HWTAGGING | IFCAP_VLAN_MTU | IFCAP_HWCSUM | \
990 IFCAP_VLAN_HWCSUM | IFCAP_TSO | IFCAP_JUMBO_MTU | IFCAP_LRO | \
991 IFCAP_VLAN_HWTSO | IFCAP_LINKSTATE)
992 #define CXGB_CAP_ENABLE (CXGB_CAP & ~IFCAP_TSO6)
995 cxgb_port_attach(device_t dev)
1002 p = device_get_softc(dev);
1004 snprintf(p->lockbuf, PORT_NAME_LEN, "cxgb port lock %d:%d",
1005 device_get_unit(device_get_parent(dev)), p->port_id);
1006 PORT_LOCK_INIT(p, p->lockbuf);
1008 /* Allocate an ifnet object and set it up */
1009 ifp = p->ifp = if_alloc(IFT_ETHER);
1011 device_printf(dev, "Cannot allocate ifnet\n");
1015 if_initname(ifp, device_get_name(dev), device_get_unit(dev));
1016 ifp->if_init = cxgb_init;
1018 ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST;
1019 ifp->if_ioctl = cxgb_ioctl;
1020 ifp->if_start = cxgb_start;
1023 ifp->if_timer = 0; /* Disable ifnet watchdog */
1024 ifp->if_watchdog = NULL;
1026 ifp->if_snd.ifq_drv_maxlen = cxgb_snd_queue_len;
1027 IFQ_SET_MAXLEN(&ifp->if_snd, ifp->if_snd.ifq_drv_maxlen);
1028 IFQ_SET_READY(&ifp->if_snd);
1030 ifp->if_capabilities = CXGB_CAP;
1031 ifp->if_capenable = CXGB_CAP_ENABLE;
1032 ifp->if_hwassist = CSUM_TCP | CSUM_UDP | CSUM_IP | CSUM_TSO;
1035 * Disable TSO on 4-port - it isn't supported by the firmware.
1037 if (sc->params.nports > 2) {
1038 ifp->if_capabilities &= ~(IFCAP_TSO | IFCAP_VLAN_HWTSO);
1039 ifp->if_capenable &= ~(IFCAP_TSO | IFCAP_VLAN_HWTSO);
1040 ifp->if_hwassist &= ~CSUM_TSO;
1043 ether_ifattach(ifp, p->hw_addr);
1044 ifp->if_transmit = cxgb_transmit;
1045 ifp->if_qflush = cxgb_qflush;
1047 #ifdef DEFAULT_JUMBO
1048 if (sc->params.nports <= 2)
1049 ifp->if_mtu = ETHERMTU_JUMBO;
1051 if ((err = cxgb_makedev(p)) != 0) {
1052 printf("makedev failed %d\n", err);
1056 /* Create a list of media supported by this port */
1057 ifmedia_init(&p->media, IFM_IMASK, cxgb_media_change,
1059 cxgb_build_medialist(p);
1061 t3_sge_init_port(p);
1067 * cxgb_port_detach() is called via the device_detach methods when
1068 * cxgb_free() calls the bus_generic_detach. It is responsible for
1069 * removing the device from the view of the kernel, i.e. from all
1070 * interfaces lists etc. This routine is only called when the driver is
1071 * being unloaded, not when the link goes down.
1074 cxgb_port_detach(device_t dev)
1076 struct port_info *p;
1080 p = device_get_softc(dev);
1083 /* Tell cxgb_ioctl and if_init that the port is going away */
1088 mtx_sleep(&sc->flags, &sc->lock, 0, "cxgbdtch", 0);
1092 if (p->port_cdev != NULL)
1093 destroy_dev(p->port_cdev);
1095 cxgb_uninit_synchronized(p);
1096 ether_ifdetach(p->ifp);
1098 for (i = p->first_qset; i < p->first_qset + p->nqsets; i++) {
1099 struct sge_qset *qs = &sc->sge.qs[i];
1100 struct sge_txq *txq = &qs->txq[TXQ_ETH];
1102 callout_drain(&txq->txq_watchdog);
1103 callout_drain(&txq->txq_timer);
1106 PORT_LOCK_DEINIT(p);
1112 wakeup_one(&sc->flags);
1118 t3_fatal_err(struct adapter *sc)
1122 if (sc->flags & FULL_INIT_DONE) {
1124 t3_write_reg(sc, A_XGM_TX_CTRL, 0);
1125 t3_write_reg(sc, A_XGM_RX_CTRL, 0);
1126 t3_write_reg(sc, XGM_REG(A_XGM_TX_CTRL, 1), 0);
1127 t3_write_reg(sc, XGM_REG(A_XGM_RX_CTRL, 1), 0);
1128 t3_intr_disable(sc);
1130 device_printf(sc->dev,"encountered fatal error, operation suspended\n");
1131 if (!t3_cim_ctl_blk_read(sc, 0xa0, 4, fw_status))
1132 device_printf(sc->dev, "FW_ status: 0x%x, 0x%x, 0x%x, 0x%x\n",
1133 fw_status[0], fw_status[1], fw_status[2], fw_status[3]);
1137 t3_os_find_pci_capability(adapter_t *sc, int cap)
1140 struct pci_devinfo *dinfo;
1146 dinfo = device_get_ivars(dev);
1149 status = pci_read_config(dev, PCIR_STATUS, 2);
1150 if (!(status & PCIM_STATUS_CAPPRESENT))
1153 switch (cfg->hdrtype & PCIM_HDRTYPE) {
1159 ptr = PCIR_CAP_PTR_2;
1165 ptr = pci_read_config(dev, ptr, 1);
1168 if (pci_read_config(dev, ptr + PCICAP_ID, 1) == cap)
1170 ptr = pci_read_config(dev, ptr + PCICAP_NEXTPTR, 1);
1177 t3_os_pci_save_state(struct adapter *sc)
1180 struct pci_devinfo *dinfo;
1183 dinfo = device_get_ivars(dev);
1185 pci_cfg_save(dev, dinfo, 0);
1190 t3_os_pci_restore_state(struct adapter *sc)
1193 struct pci_devinfo *dinfo;
1196 dinfo = device_get_ivars(dev);
1198 pci_cfg_restore(dev, dinfo);
1203 * t3_os_link_changed - handle link status changes
1204 * @sc: the adapter associated with the link change
1205 * @port_id: the port index whose link status has changed
1206 * @link_status: the new status of the link
1207 * @speed: the new speed setting
1208 * @duplex: the new duplex setting
1209 * @fc: the new flow-control setting
1211 * This is the OS-dependent handler for link status changes. The OS
1212 * neutral handler takes care of most of the processing for these events,
1213 * then calls this handler for any OS-specific processing.
1216 t3_os_link_changed(adapter_t *adapter, int port_id, int link_status, int speed,
1217 int duplex, int fc, int mac_was_reset)
1219 struct port_info *pi = &adapter->port[port_id];
1220 struct ifnet *ifp = pi->ifp;
1222 /* no race with detach, so ifp should always be good */
1223 KASSERT(ifp, ("%s: if detached.", __func__));
1225 /* Reapply mac settings if they were lost due to a reset */
1226 if (mac_was_reset) {
1228 cxgb_update_mac_settings(pi);
1233 ifp->if_baudrate = IF_Mbps(speed);
1234 if_link_state_change(ifp, LINK_STATE_UP);
1236 if_link_state_change(ifp, LINK_STATE_DOWN);
1240 * t3_os_phymod_changed - handle PHY module changes
1241 * @phy: the PHY reporting the module change
1242 * @mod_type: new module type
1244 * This is the OS-dependent handler for PHY module changes. It is
1245 * invoked when a PHY module is removed or inserted for any OS-specific
1248 void t3_os_phymod_changed(struct adapter *adap, int port_id)
1250 static const char *mod_str[] = {
1251 NULL, "SR", "LR", "LRM", "TWINAX", "TWINAX-L", "unknown"
1253 struct port_info *pi = &adap->port[port_id];
1254 int mod = pi->phy.modtype;
1256 if (mod != pi->media.ifm_cur->ifm_data)
1257 cxgb_build_medialist(pi);
1259 if (mod == phy_modtype_none)
1260 if_printf(pi->ifp, "PHY module unplugged\n");
1262 KASSERT(mod < ARRAY_SIZE(mod_str),
1263 ("invalid PHY module type %d", mod));
1264 if_printf(pi->ifp, "%s PHY module inserted\n", mod_str[mod]);
1269 * Interrupt-context handler for external (PHY) interrupts.
1272 t3_os_ext_intr_handler(adapter_t *sc)
1275 printf("t3_os_ext_intr_handler\n");
1277 * Schedule a task to handle external interrupts as they may be slow
1278 * and we use a mutex to protect MDIO registers. We disable PHY
1279 * interrupts in the meantime and let the task reenable them when
1282 if (sc->slow_intr_mask) {
1284 sc->slow_intr_mask &= ~F_T3DBG;
1285 t3_write_reg(sc, A_PL_INT_ENABLE0, sc->slow_intr_mask);
1286 taskqueue_enqueue(sc->tq, &sc->ext_intr_task);
1292 t3_os_set_hw_addr(adapter_t *adapter, int port_idx, u8 hw_addr[])
1296 * The ifnet might not be allocated before this gets called,
1297 * as this is called early on in attach by t3_prep_adapter
1298 * save the address off in the port structure
1301 printf("set_hw_addr on idx %d addr %6D\n", port_idx, hw_addr, ":");
1302 bcopy(hw_addr, adapter->port[port_idx].hw_addr, ETHER_ADDR_LEN);
1306 * Programs the XGMAC based on the settings in the ifnet. These settings
1307 * include MTU, MAC address, mcast addresses, etc.
1310 cxgb_update_mac_settings(struct port_info *p)
1312 struct ifnet *ifp = p->ifp;
1313 struct t3_rx_mode rm;
1314 struct cmac *mac = &p->mac;
1317 PORT_LOCK_ASSERT_OWNED(p);
1319 bcopy(IF_LLADDR(ifp), p->hw_addr, ETHER_ADDR_LEN);
1322 if (ifp->if_capenable & IFCAP_VLAN_MTU)
1323 mtu += ETHER_VLAN_ENCAP_LEN;
1325 hwtagging = (ifp->if_capenable & IFCAP_VLAN_HWTAGGING) != 0;
1327 t3_mac_set_mtu(mac, mtu);
1328 t3_set_vlan_accel(p->adapter, 1 << p->tx_chan, hwtagging);
1329 t3_mac_set_address(mac, 0, p->hw_addr);
1330 t3_init_rx_mode(&rm, p);
1331 t3_mac_set_rx_mode(mac, &rm);
1336 await_mgmt_replies(struct adapter *adap, unsigned long init_cnt,
1341 while (adap->sge.qs[0].rspq.offload_pkts < init_cnt + n) {
1350 init_tp_parity(struct adapter *adap)
1354 struct cpl_set_tcb_field *greq;
1355 unsigned long cnt = adap->sge.qs[0].rspq.offload_pkts;
1357 t3_tp_set_offload_mode(adap, 1);
1359 for (i = 0; i < 16; i++) {
1360 struct cpl_smt_write_req *req;
1362 m = m_gethdr(M_WAITOK, MT_DATA);
1363 req = mtod(m, struct cpl_smt_write_req *);
1364 m->m_len = m->m_pkthdr.len = sizeof(*req);
1365 memset(req, 0, sizeof(*req));
1366 req->wr.wrh_hi = htonl(V_WR_OP(FW_WROPCODE_FORWARD));
1367 OPCODE_TID(req) = htonl(MK_OPCODE_TID(CPL_SMT_WRITE_REQ, i));
1369 t3_mgmt_tx(adap, m);
1372 for (i = 0; i < 2048; i++) {
1373 struct cpl_l2t_write_req *req;
1375 m = m_gethdr(M_WAITOK, MT_DATA);
1376 req = mtod(m, struct cpl_l2t_write_req *);
1377 m->m_len = m->m_pkthdr.len = sizeof(*req);
1378 memset(req, 0, sizeof(*req));
1379 req->wr.wrh_hi = htonl(V_WR_OP(FW_WROPCODE_FORWARD));
1380 OPCODE_TID(req) = htonl(MK_OPCODE_TID(CPL_L2T_WRITE_REQ, i));
1381 req->params = htonl(V_L2T_W_IDX(i));
1382 t3_mgmt_tx(adap, m);
1385 for (i = 0; i < 2048; i++) {
1386 struct cpl_rte_write_req *req;
1388 m = m_gethdr(M_WAITOK, MT_DATA);
1389 req = mtod(m, struct cpl_rte_write_req *);
1390 m->m_len = m->m_pkthdr.len = sizeof(*req);
1391 memset(req, 0, sizeof(*req));
1392 req->wr.wrh_hi = htonl(V_WR_OP(FW_WROPCODE_FORWARD));
1393 OPCODE_TID(req) = htonl(MK_OPCODE_TID(CPL_RTE_WRITE_REQ, i));
1394 req->l2t_idx = htonl(V_L2T_W_IDX(i));
1395 t3_mgmt_tx(adap, m);
1398 m = m_gethdr(M_WAITOK, MT_DATA);
1399 greq = mtod(m, struct cpl_set_tcb_field *);
1400 m->m_len = m->m_pkthdr.len = sizeof(*greq);
1401 memset(greq, 0, sizeof(*greq));
1402 greq->wr.wrh_hi = htonl(V_WR_OP(FW_WROPCODE_FORWARD));
1403 OPCODE_TID(greq) = htonl(MK_OPCODE_TID(CPL_SET_TCB_FIELD, 0));
1404 greq->mask = htobe64(1);
1405 t3_mgmt_tx(adap, m);
1407 i = await_mgmt_replies(adap, cnt, 16 + 2048 + 2048 + 1);
1408 t3_tp_set_offload_mode(adap, 0);
1413 * setup_rss - configure Receive Side Steering (per-queue connection demux)
1414 * @adap: the adapter
1416 * Sets up RSS to distribute packets to multiple receive queues. We
1417 * configure the RSS CPU lookup table to distribute to the number of HW
1418 * receive queues, and the response queue lookup table to narrow that
1419 * down to the response queues actually configured for each port.
1420 * We always configure the RSS mapping for two ports since the mapping
1421 * table has plenty of entries.
1424 setup_rss(adapter_t *adap)
1428 uint8_t cpus[SGE_QSETS + 1];
1429 uint16_t rspq_map[RSS_TABLE_SIZE];
1431 for (i = 0; i < SGE_QSETS; ++i)
1433 cpus[SGE_QSETS] = 0xff;
1436 for_each_port(adap, i) {
1437 const struct port_info *pi = adap2pinfo(adap, i);
1439 nq[pi->tx_chan] += pi->nqsets;
1441 for (i = 0; i < RSS_TABLE_SIZE / 2; ++i) {
1442 rspq_map[i] = nq[0] ? i % nq[0] : 0;
1443 rspq_map[i + RSS_TABLE_SIZE / 2] = nq[1] ? i % nq[1] + nq[0] : 0;
1446 /* Calculate the reverse RSS map table */
1447 for (i = 0; i < SGE_QSETS; ++i)
1448 adap->rrss_map[i] = 0xff;
1449 for (i = 0; i < RSS_TABLE_SIZE; ++i)
1450 if (adap->rrss_map[rspq_map[i]] == 0xff)
1451 adap->rrss_map[rspq_map[i]] = i;
1453 t3_config_rss(adap, F_RQFEEDBACKENABLE | F_TNLLKPEN | F_TNLMAPEN |
1454 F_TNLPRTEN | F_TNL2TUPEN | F_TNL4TUPEN | F_OFDMAPEN |
1455 F_RRCPLMAPEN | V_RRCPLCPUSIZE(6) | F_HASHTOEPLITZ,
1461 * Sends an mbuf to an offload queue driver
1462 * after dealing with any active network taps.
1465 offload_tx(struct t3cdev *tdev, struct mbuf *m)
1469 ret = t3_offload_tx(tdev, m);
1474 write_smt_entry(struct adapter *adapter, int idx)
1476 struct port_info *pi = &adapter->port[idx];
1477 struct cpl_smt_write_req *req;
1480 if ((m = m_gethdr(M_NOWAIT, MT_DATA)) == NULL)
1483 req = mtod(m, struct cpl_smt_write_req *);
1484 m->m_pkthdr.len = m->m_len = sizeof(struct cpl_smt_write_req);
1486 req->wr.wrh_hi = htonl(V_WR_OP(FW_WROPCODE_FORWARD));
1487 OPCODE_TID(req) = htonl(MK_OPCODE_TID(CPL_SMT_WRITE_REQ, idx));
1488 req->mtu_idx = NMTUS - 1; /* should be 0 but there's a T3 bug */
1490 memset(req->src_mac1, 0, sizeof(req->src_mac1));
1491 memcpy(req->src_mac0, pi->hw_addr, ETHER_ADDR_LEN);
1493 m_set_priority(m, 1);
1495 offload_tx(&adapter->tdev, m);
1501 init_smt(struct adapter *adapter)
1505 for_each_port(adapter, i)
1506 write_smt_entry(adapter, i);
1511 init_port_mtus(adapter_t *adapter)
1513 unsigned int mtus = ETHERMTU | (ETHERMTU << 16);
1515 t3_write_reg(adapter, A_TP_MTU_PORT_TABLE, mtus);
1519 send_pktsched_cmd(struct adapter *adap, int sched, int qidx, int lo,
1523 struct mngt_pktsched_wr *req;
1525 m = m_gethdr(M_DONTWAIT, MT_DATA);
1527 req = mtod(m, struct mngt_pktsched_wr *);
1528 req->wr.wrh_hi = htonl(V_WR_OP(FW_WROPCODE_MNGT));
1529 req->mngt_opcode = FW_MNGTOPCODE_PKTSCHED_SET;
1534 req->binding = port;
1535 m->m_len = m->m_pkthdr.len = sizeof(*req);
1536 t3_mgmt_tx(adap, m);
1541 bind_qsets(adapter_t *sc)
1545 for (i = 0; i < (sc)->params.nports; ++i) {
1546 const struct port_info *pi = adap2pinfo(sc, i);
1548 for (j = 0; j < pi->nqsets; ++j) {
1549 send_pktsched_cmd(sc, 1, pi->first_qset + j, -1,
1557 update_tpeeprom(struct adapter *adap)
1559 const struct firmware *tpeeprom;
1562 unsigned int major, minor;
1566 t3_seeprom_read(adap, TP_SRAM_OFFSET, &version);
1568 major = G_TP_VERSION_MAJOR(version);
1569 minor = G_TP_VERSION_MINOR(version);
1570 if (major == TP_VERSION_MAJOR && minor == TP_VERSION_MINOR)
1573 rev = t3rev2char(adap);
1574 snprintf(name, sizeof(name), TPEEPROM_NAME, rev);
1576 tpeeprom = firmware_get(name);
1577 if (tpeeprom == NULL) {
1578 device_printf(adap->dev,
1579 "could not load TP EEPROM: unable to load %s\n",
1584 len = tpeeprom->datasize - 4;
1586 ret = t3_check_tpsram(adap, tpeeprom->data, tpeeprom->datasize);
1588 goto release_tpeeprom;
1590 if (len != TP_SRAM_LEN) {
1591 device_printf(adap->dev,
1592 "%s length is wrong len=%d expected=%d\n", name,
1597 ret = set_eeprom(&adap->port[0], tpeeprom->data, tpeeprom->datasize,
1601 device_printf(adap->dev,
1602 "Protocol SRAM image updated in EEPROM to %d.%d.%d\n",
1603 TP_VERSION_MAJOR, TP_VERSION_MINOR, TP_VERSION_MICRO);
1605 device_printf(adap->dev,
1606 "Protocol SRAM image update in EEPROM failed\n");
1609 firmware_put(tpeeprom, FIRMWARE_UNLOAD);
1615 update_tpsram(struct adapter *adap)
1617 const struct firmware *tpsram;
1621 rev = t3rev2char(adap);
1622 snprintf(name, sizeof(name), TPSRAM_NAME, rev);
1624 update_tpeeprom(adap);
1626 tpsram = firmware_get(name);
1627 if (tpsram == NULL){
1628 device_printf(adap->dev, "could not load TP SRAM\n");
1631 device_printf(adap->dev, "updating TP SRAM\n");
1633 ret = t3_check_tpsram(adap, tpsram->data, tpsram->datasize);
1635 goto release_tpsram;
1637 ret = t3_set_proto_sram(adap, tpsram->data);
1639 device_printf(adap->dev, "loading protocol SRAM failed\n");
1642 firmware_put(tpsram, FIRMWARE_UNLOAD);
1648 * cxgb_up - enable the adapter
1649 * @adap: adapter being enabled
1651 * Called when the first port is enabled, this function performs the
1652 * actions necessary to make an adapter operational, such as completing
1653 * the initialization of HW modules, and enabling interrupts.
1656 cxgb_up(struct adapter *sc)
1660 KASSERT(sc->open_device_map == 0, ("%s: device(s) already open (%x)",
1661 __func__, sc->open_device_map));
1663 if ((sc->flags & FULL_INIT_DONE) == 0) {
1665 ADAPTER_LOCK_ASSERT_NOTOWNED(sc);
1667 if ((sc->flags & FW_UPTODATE) == 0)
1668 if ((err = upgrade_fw(sc)))
1671 if ((sc->flags & TPS_UPTODATE) == 0)
1672 if ((err = update_tpsram(sc)))
1675 if (is_offload(sc)) {
1676 sc->params.mc5.nservers = 0;
1677 sc->params.mc5.nroutes = 0;
1678 sc->params.mc5.nfilters = t3_mc5_size(&sc->mc5) -
1682 err = t3_init_hw(sc, 0);
1686 t3_set_reg_field(sc, A_TP_PARA_REG5, 0, F_RXDDPOFFINIT);
1687 t3_write_reg(sc, A_ULPRX_TDDP_PSZ, V_HPZ0(PAGE_SHIFT - 12));
1689 err = setup_sge_qsets(sc);
1697 err = cxgb_setup_interrupts(sc);
1701 t3_add_configured_sysctls(sc);
1702 sc->flags |= FULL_INIT_DONE;
1709 if (sc->params.rev >= T3_REV_C && !(sc->flags & TP_PARITY_INIT) &&
1710 is_offload(sc) && init_tp_parity(sc) == 0)
1711 sc->flags |= TP_PARITY_INIT;
1713 if (sc->flags & TP_PARITY_INIT) {
1714 t3_write_reg(sc, A_TP_INT_CAUSE, F_CMCACHEPERR | F_ARPLUTPERR);
1715 t3_write_reg(sc, A_TP_INT_ENABLE, 0x7fbfffff);
1718 if (!(sc->flags & QUEUES_BOUND)) {
1720 setup_hw_filters(sc);
1721 sc->flags |= QUEUES_BOUND;
1724 t3_sge_reset_adapter(sc);
1730 * Called when the last open device is closed. Does NOT undo all of cxgb_up's
1731 * work. Specifically, the resources grabbed under FULL_INIT_DONE are released
1732 * during controller_detach, not here.
1735 cxgb_down(struct adapter *sc)
1738 t3_intr_disable(sc);
1742 offload_open(struct port_info *pi)
1744 struct adapter *sc = pi->adapter;
1745 struct t3cdev *tdev = &sc->tdev;
1747 setbit(&sc->open_device_map, OFFLOAD_DEVMAP_BIT);
1749 t3_tp_set_offload_mode(sc, 1);
1750 tdev->lldev = pi->ifp;
1752 t3_load_mtus(sc, sc->params.mtus, sc->params.a_wnd, sc->params.b_wnd,
1753 sc->params.rev == 0 ? sc->port[0].ifp->if_mtu : 0xffff);
1755 cxgb_add_clients(tdev);
1761 offload_close(struct t3cdev *tdev)
1763 struct adapter *adapter = tdev2adap(tdev);
1765 if (!isset(&adapter->open_device_map, OFFLOAD_DEVMAP_BIT))
1768 /* Call back all registered clients */
1769 cxgb_remove_clients(tdev);
1772 cxgb_set_dummy_ops(tdev);
1773 t3_tp_set_offload_mode(adapter, 0);
1775 clrbit(&adapter->open_device_map, OFFLOAD_DEVMAP_BIT);
1781 * if_init for cxgb ports.
1784 cxgb_init(void *arg)
1786 struct port_info *p = arg;
1787 struct adapter *sc = p->adapter;
1790 cxgb_init_locked(p); /* releases adapter lock */
1791 ADAPTER_LOCK_ASSERT_NOTOWNED(sc);
1795 cxgb_init_locked(struct port_info *p)
1797 struct adapter *sc = p->adapter;
1798 struct ifnet *ifp = p->ifp;
1799 struct cmac *mac = &p->mac;
1800 int i, rc = 0, may_sleep = 0;
1802 ADAPTER_LOCK_ASSERT_OWNED(sc);
1804 while (!IS_DOOMED(p) && IS_BUSY(sc)) {
1805 if (mtx_sleep(&sc->flags, &sc->lock, PCATCH, "cxgbinit", 0)) {
1814 KASSERT(!IS_BUSY(sc), ("%s: controller busy.", __func__));
1817 * The code that runs during one-time adapter initialization can sleep
1818 * so it's important not to hold any locks across it.
1820 may_sleep = sc->flags & FULL_INIT_DONE ? 0 : 1;
1827 if (sc->open_device_map == 0) {
1828 if ((rc = cxgb_up(sc)) != 0)
1831 if (is_offload(sc) && !ofld_disable && offload_open(p))
1833 "Could not initialize offload capabilities\n");
1837 if (isset(&sc->open_device_map, p->port_id) &&
1838 (ifp->if_drv_flags & IFF_DRV_RUNNING)) {
1842 t3_port_intr_enable(sc, p->port_id);
1843 if (!mac->multiport)
1845 cxgb_update_mac_settings(p);
1846 t3_link_start(&p->phy, mac, &p->link_config);
1847 t3_mac_enable(mac, MAC_DIRECTION_RX | MAC_DIRECTION_TX);
1848 ifp->if_drv_flags |= IFF_DRV_RUNNING;
1849 ifp->if_drv_flags &= ~IFF_DRV_OACTIVE;
1852 t3_link_changed(sc, p->port_id);
1854 for (i = p->first_qset; i < p->first_qset + p->nqsets; i++) {
1855 struct sge_qset *qs = &sc->sge.qs[i];
1856 struct sge_txq *txq = &qs->txq[TXQ_ETH];
1858 callout_reset_on(&txq->txq_watchdog, hz, cxgb_tx_watchdog, qs,
1859 txq->txq_watchdog.c_cpu);
1863 setbit(&sc->open_device_map, p->port_id);
1868 KASSERT(IS_BUSY(sc), ("%s: controller not busy.", __func__));
1870 wakeup_one(&sc->flags);
1877 cxgb_uninit_locked(struct port_info *p)
1879 struct adapter *sc = p->adapter;
1882 ADAPTER_LOCK_ASSERT_OWNED(sc);
1884 while (!IS_DOOMED(p) && IS_BUSY(sc)) {
1885 if (mtx_sleep(&sc->flags, &sc->lock, PCATCH, "cxgbunin", 0)) {
1894 KASSERT(!IS_BUSY(sc), ("%s: controller busy.", __func__));
1898 rc = cxgb_uninit_synchronized(p);
1901 KASSERT(IS_BUSY(sc), ("%s: controller not busy.", __func__));
1903 wakeup_one(&sc->flags);
1910 * Called on "ifconfig down", and from port_detach
1913 cxgb_uninit_synchronized(struct port_info *pi)
1915 struct adapter *sc = pi->adapter;
1916 struct ifnet *ifp = pi->ifp;
1919 * taskqueue_drain may cause a deadlock if the adapter lock is held.
1921 ADAPTER_LOCK_ASSERT_NOTOWNED(sc);
1924 * Clear this port's bit from the open device map, and then drain all
1925 * the tasks that can access/manipulate this port's port_info or ifp.
1926 * We disable this port's interrupts here and so the the slow/ext
1927 * interrupt tasks won't be enqueued. The tick task will continue to
1928 * be enqueued every second but the runs after this drain will not see
1929 * this port in the open device map.
1931 * A well behaved task must take open_device_map into account and ignore
1932 * ports that are not open.
1934 clrbit(&sc->open_device_map, pi->port_id);
1935 t3_port_intr_disable(sc, pi->port_id);
1936 taskqueue_drain(sc->tq, &sc->slow_intr_task);
1937 taskqueue_drain(sc->tq, &sc->ext_intr_task);
1938 taskqueue_drain(sc->tq, &sc->tick_task);
1941 ifp->if_drv_flags &= ~(IFF_DRV_RUNNING | IFF_DRV_OACTIVE);
1943 /* disable pause frames */
1944 t3_set_reg_field(sc, A_XGM_TX_CFG + pi->mac.offset, F_TXPAUSEEN, 0);
1946 /* Reset RX FIFO HWM */
1947 t3_set_reg_field(sc, A_XGM_RXFIFO_CFG + pi->mac.offset,
1948 V_RXFIFOPAUSEHWM(M_RXFIFOPAUSEHWM), 0);
1952 /* Wait for TXFIFO empty */
1953 t3_wait_op_done(sc, A_XGM_TXFIFO_CFG + pi->mac.offset,
1954 F_TXFIFO_EMPTY, 1, 20, 5);
1957 t3_mac_disable(&pi->mac, MAC_DIRECTION_RX);
1960 pi->phy.ops->power_down(&pi->phy, 1);
1964 pi->link_config.link_ok = 0;
1965 t3_os_link_changed(sc, pi->port_id, 0, 0, 0, 0, 0);
1967 if ((sc->open_device_map & PORT_MASK) == 0)
1968 offload_close(&sc->tdev);
1970 if (sc->open_device_map == 0)
1971 cxgb_down(pi->adapter);
1977 * Mark lro enabled or disabled in all qsets for this port
1980 cxgb_set_lro(struct port_info *p, int enabled)
1983 struct adapter *adp = p->adapter;
1986 for (i = 0; i < p->nqsets; i++) {
1987 q = &adp->sge.qs[p->first_qset + i];
1988 q->lro.enabled = (enabled != 0);
1994 cxgb_ioctl(struct ifnet *ifp, unsigned long command, caddr_t data)
1996 struct port_info *p = ifp->if_softc;
1997 struct adapter *sc = p->adapter;
1998 struct ifreq *ifr = (struct ifreq *)data;
1999 int flags, error = 0, mtu;
2005 error = IS_DOOMED(p) ? ENXIO : (IS_BUSY(sc) ? EBUSY : 0);
2013 if ((mtu < ETHERMIN) || (mtu > ETHERMTU_JUMBO)) {
2018 cxgb_update_mac_settings(p);
2029 if (ifp->if_flags & IFF_UP) {
2030 if (ifp->if_drv_flags & IFF_DRV_RUNNING) {
2031 flags = p->if_flags;
2032 if (((ifp->if_flags ^ flags) & IFF_PROMISC) ||
2033 ((ifp->if_flags ^ flags) & IFF_ALLMULTI)) {
2039 cxgb_update_mac_settings(p);
2044 error = cxgb_init_locked(p);
2045 p->if_flags = ifp->if_flags;
2046 } else if (ifp->if_drv_flags & IFF_DRV_RUNNING)
2047 error = cxgb_uninit_locked(p);
2051 ADAPTER_LOCK_ASSERT_NOTOWNED(sc);
2056 error = IS_DOOMED(p) ? ENXIO : (IS_BUSY(sc) ? EBUSY : 0);
2060 if (ifp->if_drv_flags & IFF_DRV_RUNNING) {
2062 cxgb_update_mac_settings(p);
2070 error = IS_DOOMED(p) ? ENXIO : (IS_BUSY(sc) ? EBUSY : 0);
2074 mask = ifr->ifr_reqcap ^ ifp->if_capenable;
2075 if (mask & IFCAP_TXCSUM) {
2076 ifp->if_capenable ^= IFCAP_TXCSUM;
2077 ifp->if_hwassist ^= (CSUM_TCP | CSUM_UDP | CSUM_IP);
2079 if (IFCAP_TSO & ifp->if_capenable &&
2080 !(IFCAP_TXCSUM & ifp->if_capenable)) {
2081 ifp->if_capenable &= ~IFCAP_TSO;
2082 ifp->if_hwassist &= ~CSUM_TSO;
2084 "tso disabled due to -txcsum.\n");
2087 if (mask & IFCAP_RXCSUM)
2088 ifp->if_capenable ^= IFCAP_RXCSUM;
2089 if (mask & IFCAP_TSO4) {
2090 ifp->if_capenable ^= IFCAP_TSO4;
2092 if (IFCAP_TSO & ifp->if_capenable) {
2093 if (IFCAP_TXCSUM & ifp->if_capenable)
2094 ifp->if_hwassist |= CSUM_TSO;
2096 ifp->if_capenable &= ~IFCAP_TSO;
2097 ifp->if_hwassist &= ~CSUM_TSO;
2099 "enable txcsum first.\n");
2103 ifp->if_hwassist &= ~CSUM_TSO;
2105 if (mask & IFCAP_LRO) {
2106 ifp->if_capenable ^= IFCAP_LRO;
2108 /* Safe to do this even if cxgb_up not called yet */
2109 cxgb_set_lro(p, ifp->if_capenable & IFCAP_LRO);
2111 if (mask & IFCAP_VLAN_HWTAGGING) {
2112 ifp->if_capenable ^= IFCAP_VLAN_HWTAGGING;
2113 if (ifp->if_drv_flags & IFF_DRV_RUNNING) {
2115 cxgb_update_mac_settings(p);
2119 if (mask & IFCAP_VLAN_MTU) {
2120 ifp->if_capenable ^= IFCAP_VLAN_MTU;
2121 if (ifp->if_drv_flags & IFF_DRV_RUNNING) {
2123 cxgb_update_mac_settings(p);
2127 if (mask & IFCAP_VLAN_HWTSO)
2128 ifp->if_capenable ^= IFCAP_VLAN_HWTSO;
2129 if (mask & IFCAP_VLAN_HWCSUM)
2130 ifp->if_capenable ^= IFCAP_VLAN_HWCSUM;
2132 #ifdef VLAN_CAPABILITIES
2133 VLAN_CAPABILITIES(ifp);
2139 error = ifmedia_ioctl(ifp, ifr, &p->media, command);
2142 error = ether_ioctl(ifp, command, data);
2149 cxgb_media_change(struct ifnet *ifp)
2151 return (EOPNOTSUPP);
2155 * Translates phy->modtype to the correct Ethernet media subtype.
2158 cxgb_ifm_type(int mod)
2161 case phy_modtype_sr:
2162 return (IFM_10G_SR);
2163 case phy_modtype_lr:
2164 return (IFM_10G_LR);
2165 case phy_modtype_lrm:
2166 return (IFM_10G_LRM);
2167 case phy_modtype_twinax:
2168 return (IFM_10G_TWINAX);
2169 case phy_modtype_twinax_long:
2170 return (IFM_10G_TWINAX_LONG);
2171 case phy_modtype_none:
2173 case phy_modtype_unknown:
2174 return (IFM_UNKNOWN);
2177 KASSERT(0, ("%s: modtype %d unknown", __func__, mod));
2178 return (IFM_UNKNOWN);
2182 * Rebuilds the ifmedia list for this port, and sets the current media.
2185 cxgb_build_medialist(struct port_info *p)
2187 struct cphy *phy = &p->phy;
2188 struct ifmedia *media = &p->media;
2189 int mod = phy->modtype;
2190 int m = IFM_ETHER | IFM_FDX;
2194 ifmedia_removeall(media);
2195 if (phy->caps & SUPPORTED_TP && phy->caps & SUPPORTED_Autoneg) {
2198 if (phy->caps & SUPPORTED_10000baseT_Full)
2199 ifmedia_add(media, m | IFM_10G_T, mod, NULL);
2201 if (phy->caps & SUPPORTED_1000baseT_Full)
2202 ifmedia_add(media, m | IFM_1000_T, mod, NULL);
2204 if (phy->caps & SUPPORTED_100baseT_Full)
2205 ifmedia_add(media, m | IFM_100_TX, mod, NULL);
2207 if (phy->caps & SUPPORTED_10baseT_Full)
2208 ifmedia_add(media, m | IFM_10_T, mod, NULL);
2210 ifmedia_add(media, IFM_ETHER | IFM_AUTO, mod, NULL);
2211 ifmedia_set(media, IFM_ETHER | IFM_AUTO);
2213 } else if (phy->caps & SUPPORTED_TP) {
2216 KASSERT(phy->caps & SUPPORTED_10000baseT_Full,
2217 ("%s: unexpected cap 0x%x", __func__, phy->caps));
2219 ifmedia_add(media, m | IFM_10G_CX4, mod, NULL);
2220 ifmedia_set(media, m | IFM_10G_CX4);
2222 } else if (phy->caps & SUPPORTED_FIBRE &&
2223 phy->caps & SUPPORTED_10000baseT_Full) {
2224 /* 10G optical (but includes SFP+ twinax) */
2226 m |= cxgb_ifm_type(mod);
2227 if (IFM_SUBTYPE(m) == IFM_NONE)
2230 ifmedia_add(media, m, mod, NULL);
2231 ifmedia_set(media, m);
2233 } else if (phy->caps & SUPPORTED_FIBRE &&
2234 phy->caps & SUPPORTED_1000baseT_Full) {
2237 /* XXX: Lie and claim to be SX, could actually be any 1G-X */
2238 ifmedia_add(media, m | IFM_1000_SX, mod, NULL);
2239 ifmedia_set(media, m | IFM_1000_SX);
2242 KASSERT(0, ("%s: don't know how to handle 0x%x.", __func__,
2250 cxgb_media_status(struct ifnet *ifp, struct ifmediareq *ifmr)
2252 struct port_info *p = ifp->if_softc;
2253 struct ifmedia_entry *cur = p->media.ifm_cur;
2254 int speed = p->link_config.speed;
2256 if (cur->ifm_data != p->phy.modtype) {
2257 cxgb_build_medialist(p);
2258 cur = p->media.ifm_cur;
2261 ifmr->ifm_status = IFM_AVALID;
2262 if (!p->link_config.link_ok)
2265 ifmr->ifm_status |= IFM_ACTIVE;
2268 * active and current will differ iff current media is autoselect. That
2269 * can happen only for copper RJ45.
2271 if (IFM_SUBTYPE(cur->ifm_media) != IFM_AUTO)
2273 KASSERT(p->phy.caps & SUPPORTED_TP && p->phy.caps & SUPPORTED_Autoneg,
2274 ("%s: unexpected PHY caps 0x%x", __func__, p->phy.caps));
2276 ifmr->ifm_active = IFM_ETHER | IFM_FDX;
2277 if (speed == SPEED_10000)
2278 ifmr->ifm_active |= IFM_10G_T;
2279 else if (speed == SPEED_1000)
2280 ifmr->ifm_active |= IFM_1000_T;
2281 else if (speed == SPEED_100)
2282 ifmr->ifm_active |= IFM_100_TX;
2283 else if (speed == SPEED_10)
2284 ifmr->ifm_active |= IFM_10_T;
2286 KASSERT(0, ("%s: link up but speed unknown (%u)", __func__,
2291 cxgb_async_intr(void *data)
2293 adapter_t *sc = data;
2296 device_printf(sc->dev, "cxgb_async_intr\n");
2298 * May need to sleep - defer to taskqueue
2300 taskqueue_enqueue(sc->tq, &sc->slow_intr_task);
2304 cxgb_ext_intr_handler(void *arg, int count)
2306 adapter_t *sc = (adapter_t *)arg;
2309 printf("cxgb_ext_intr_handler\n");
2311 t3_phy_intr_handler(sc);
2313 /* Now reenable external interrupts */
2315 if (sc->slow_intr_mask) {
2316 sc->slow_intr_mask |= F_T3DBG;
2317 t3_write_reg(sc, A_PL_INT_CAUSE0, F_T3DBG);
2318 t3_write_reg(sc, A_PL_INT_ENABLE0, sc->slow_intr_mask);
2324 link_poll_needed(struct port_info *p)
2326 struct cphy *phy = &p->phy;
2328 if (phy->caps & POLL_LINK_1ST_TIME) {
2329 p->phy.caps &= ~POLL_LINK_1ST_TIME;
2333 return (p->link_fault || !(phy->caps & SUPPORTED_LINK_IRQ));
2337 check_link_status(adapter_t *sc)
2341 for (i = 0; i < (sc)->params.nports; ++i) {
2342 struct port_info *p = &sc->port[i];
2344 if (!isset(&sc->open_device_map, p->port_id))
2347 if (link_poll_needed(p))
2348 t3_link_changed(sc, i);
2353 check_t3b2_mac(struct adapter *sc)
2357 if (sc->flags & CXGB_SHUTDOWN)
2360 for_each_port(sc, i) {
2361 struct port_info *p = &sc->port[i];
2364 struct ifnet *ifp = p->ifp;
2367 if (!isset(&sc->open_device_map, p->port_id) || p->link_fault ||
2368 !p->link_config.link_ok)
2371 KASSERT(ifp->if_drv_flags & IFF_DRV_RUNNING,
2372 ("%s: state mismatch (drv_flags %x, device_map %x)",
2373 __func__, ifp->if_drv_flags, sc->open_device_map));
2376 status = t3b2_mac_watchdog_task(&p->mac);
2378 p->mac.stats.num_toggled++;
2379 else if (status == 2) {
2380 struct cmac *mac = &p->mac;
2382 cxgb_update_mac_settings(p);
2383 t3_link_start(&p->phy, mac, &p->link_config);
2384 t3_mac_enable(mac, MAC_DIRECTION_RX | MAC_DIRECTION_TX);
2385 t3_port_intr_enable(sc, p->port_id);
2386 p->mac.stats.num_resets++;
2393 cxgb_tick(void *arg)
2395 adapter_t *sc = (adapter_t *)arg;
2397 if (sc->flags & CXGB_SHUTDOWN)
2400 taskqueue_enqueue(sc->tq, &sc->tick_task);
2401 callout_reset(&sc->cxgb_tick_ch, CXGB_TICKS(sc), cxgb_tick, sc);
2405 cxgb_tick_handler(void *arg, int count)
2407 adapter_t *sc = (adapter_t *)arg;
2408 const struct adapter_params *p = &sc->params;
2410 uint32_t cause, reset;
2412 if (sc->flags & CXGB_SHUTDOWN || !(sc->flags & FULL_INIT_DONE))
2415 check_link_status(sc);
2417 if (p->rev == T3_REV_B2 && p->nports < 4 && sc->open_device_map)
2420 cause = t3_read_reg(sc, A_SG_INT_CAUSE) & (F_RSPQSTARVE | F_FLEMPTY);
2422 struct sge_qset *qs = &sc->sge.qs[0];
2425 v = t3_read_reg(sc, A_SG_RSPQ_FL_STATUS) & ~0xff00;
2428 for (i = 0; i < SGE_QSETS; i++) {
2430 qs[i].rspq.starved++;
2434 mask <<= SGE_QSETS; /* skip RSPQXDISABLED */
2436 for (i = 0; i < SGE_QSETS * 2; i++) {
2438 qs[i / 2].fl[i % 2].empty++;
2444 t3_write_reg(sc, A_SG_RSPQ_FL_STATUS, v);
2445 t3_write_reg(sc, A_SG_INT_CAUSE, cause);
2448 for (i = 0; i < sc->params.nports; i++) {
2449 struct port_info *pi = &sc->port[i];
2450 struct ifnet *ifp = pi->ifp;
2451 struct cmac *mac = &pi->mac;
2452 struct mac_stats *mstats = &mac->stats;
2455 if (!isset(&sc->open_device_map, pi->port_id))
2459 t3_mac_update_stats(mac);
2462 ifp->if_opackets = mstats->tx_frames;
2463 ifp->if_ipackets = mstats->rx_frames;
2464 ifp->if_obytes = mstats->tx_octets;
2465 ifp->if_ibytes = mstats->rx_octets;
2466 ifp->if_omcasts = mstats->tx_mcast_frames;
2467 ifp->if_imcasts = mstats->rx_mcast_frames;
2468 ifp->if_collisions = mstats->tx_total_collisions;
2469 ifp->if_iqdrops = mstats->rx_cong_drops;
2472 for (j = pi->first_qset; j < pi->first_qset + pi->nqsets; j++)
2473 drops += sc->sge.qs[j].txq[TXQ_ETH].txq_mr->br_drops;
2474 ifp->if_snd.ifq_drops = drops;
2477 mstats->tx_excess_collisions +
2478 mstats->tx_underrun +
2479 mstats->tx_len_errs +
2480 mstats->tx_mac_internal_errs +
2481 mstats->tx_excess_deferral +
2482 mstats->tx_fcs_errs;
2485 mstats->rx_data_errs +
2486 mstats->rx_sequence_errs +
2488 mstats->rx_too_long +
2489 mstats->rx_mac_internal_errs +
2491 mstats->rx_fcs_errs;
2496 /* Count rx fifo overflows, once per second */
2497 cause = t3_read_reg(sc, A_XGM_INT_CAUSE + mac->offset);
2499 if (cause & F_RXFIFO_OVERFLOW) {
2500 mac->stats.rx_fifo_ovfl++;
2501 reset |= F_RXFIFO_OVERFLOW;
2503 t3_write_reg(sc, A_XGM_INT_CAUSE + mac->offset, reset);
2508 touch_bars(device_t dev)
2513 #if !defined(__LP64__) && 0
2516 pci_read_config_dword(pdev, PCI_BASE_ADDRESS_1, &v);
2517 pci_write_config_dword(pdev, PCI_BASE_ADDRESS_1, v);
2518 pci_read_config_dword(pdev, PCI_BASE_ADDRESS_3, &v);
2519 pci_write_config_dword(pdev, PCI_BASE_ADDRESS_3, v);
2520 pci_read_config_dword(pdev, PCI_BASE_ADDRESS_5, &v);
2521 pci_write_config_dword(pdev, PCI_BASE_ADDRESS_5, v);
2526 set_eeprom(struct port_info *pi, const uint8_t *data, int len, int offset)
2530 u32 aligned_offset, aligned_len, *p;
2531 struct adapter *adapter = pi->adapter;
2534 aligned_offset = offset & ~3;
2535 aligned_len = (len + (offset & 3) + 3) & ~3;
2537 if (aligned_offset != offset || aligned_len != len) {
2538 buf = malloc(aligned_len, M_DEVBUF, M_WAITOK|M_ZERO);
2541 err = t3_seeprom_read(adapter, aligned_offset, (u32 *)buf);
2542 if (!err && aligned_len > 4)
2543 err = t3_seeprom_read(adapter,
2544 aligned_offset + aligned_len - 4,
2545 (u32 *)&buf[aligned_len - 4]);
2548 memcpy(buf + (offset & 3), data, len);
2550 buf = (uint8_t *)(uintptr_t)data;
2552 err = t3_seeprom_wp(adapter, 0);
2556 for (p = (u32 *)buf; !err && aligned_len; aligned_len -= 4, p++) {
2557 err = t3_seeprom_write(adapter, aligned_offset, *p);
2558 aligned_offset += 4;
2562 err = t3_seeprom_wp(adapter, 1);
2565 free(buf, M_DEVBUF);
2571 in_range(int val, int lo, int hi)
2573 return val < 0 || (val <= hi && val >= lo);
2577 cxgb_extension_open(struct cdev *dev, int flags, int fmp, struct thread *td)
2583 cxgb_extension_close(struct cdev *dev, int flags, int fmt, struct thread *td)
2589 cxgb_extension_ioctl(struct cdev *dev, unsigned long cmd, caddr_t data,
2590 int fflag, struct thread *td)
2593 struct port_info *pi = dev->si_drv1;
2594 adapter_t *sc = pi->adapter;
2596 #ifdef PRIV_SUPPORTED
2597 if (priv_check(td, PRIV_DRIVER)) {
2599 printf("user does not have access to privileged ioctls\n");
2605 printf("user does not have access to privileged ioctls\n");
2611 case CHELSIO_GET_MIIREG: {
2613 struct cphy *phy = &pi->phy;
2614 struct ch_mii_data *mid = (struct ch_mii_data *)data;
2616 if (!phy->mdio_read)
2617 return (EOPNOTSUPP);
2619 mmd = mid->phy_id >> 8;
2622 else if (mmd > MDIO_DEV_VEND2)
2625 error = phy->mdio_read(sc, mid->phy_id & 0x1f, mmd,
2626 mid->reg_num, &val);
2628 error = phy->mdio_read(sc, mid->phy_id & 0x1f, 0,
2629 mid->reg_num & 0x1f, &val);
2634 case CHELSIO_SET_MIIREG: {
2635 struct cphy *phy = &pi->phy;
2636 struct ch_mii_data *mid = (struct ch_mii_data *)data;
2638 if (!phy->mdio_write)
2639 return (EOPNOTSUPP);
2641 mmd = mid->phy_id >> 8;
2644 else if (mmd > MDIO_DEV_VEND2)
2647 error = phy->mdio_write(sc, mid->phy_id & 0x1f,
2648 mmd, mid->reg_num, mid->val_in);
2650 error = phy->mdio_write(sc, mid->phy_id & 0x1f, 0,
2651 mid->reg_num & 0x1f,
2655 case CHELSIO_SETREG: {
2656 struct ch_reg *edata = (struct ch_reg *)data;
2657 if ((edata->addr & 0x3) != 0 || edata->addr >= sc->mmio_len)
2659 t3_write_reg(sc, edata->addr, edata->val);
2662 case CHELSIO_GETREG: {
2663 struct ch_reg *edata = (struct ch_reg *)data;
2664 if ((edata->addr & 0x3) != 0 || edata->addr >= sc->mmio_len)
2666 edata->val = t3_read_reg(sc, edata->addr);
2669 case CHELSIO_GET_SGE_CONTEXT: {
2670 struct ch_cntxt *ecntxt = (struct ch_cntxt *)data;
2671 mtx_lock_spin(&sc->sge.reg_lock);
2672 switch (ecntxt->cntxt_type) {
2673 case CNTXT_TYPE_EGRESS:
2674 error = -t3_sge_read_ecntxt(sc, ecntxt->cntxt_id,
2678 error = -t3_sge_read_fl(sc, ecntxt->cntxt_id,
2681 case CNTXT_TYPE_RSP:
2682 error = -t3_sge_read_rspq(sc, ecntxt->cntxt_id,
2686 error = -t3_sge_read_cq(sc, ecntxt->cntxt_id,
2693 mtx_unlock_spin(&sc->sge.reg_lock);
2696 case CHELSIO_GET_SGE_DESC: {
2697 struct ch_desc *edesc = (struct ch_desc *)data;
2699 if (edesc->queue_num >= SGE_QSETS * 6)
2701 ret = t3_get_desc(&sc->sge.qs[edesc->queue_num / 6],
2702 edesc->queue_num % 6, edesc->idx, edesc->data);
2708 case CHELSIO_GET_QSET_PARAMS: {
2709 struct qset_params *q;
2710 struct ch_qset_params *t = (struct ch_qset_params *)data;
2711 int q1 = pi->first_qset;
2712 int nqsets = pi->nqsets;
2715 if (t->qset_idx >= nqsets)
2718 i = q1 + t->qset_idx;
2719 q = &sc->params.sge.qset[i];
2720 t->rspq_size = q->rspq_size;
2721 t->txq_size[0] = q->txq_size[0];
2722 t->txq_size[1] = q->txq_size[1];
2723 t->txq_size[2] = q->txq_size[2];
2724 t->fl_size[0] = q->fl_size;
2725 t->fl_size[1] = q->jumbo_size;
2726 t->polling = q->polling;
2728 t->intr_lat = q->coalesce_usecs;
2729 t->cong_thres = q->cong_thres;
2732 if ((sc->flags & FULL_INIT_DONE) == 0)
2734 else if (sc->flags & USING_MSIX)
2735 t->vector = rman_get_start(sc->msix_irq_res[i]);
2737 t->vector = rman_get_start(sc->irq_res);
2741 case CHELSIO_GET_QSET_NUM: {
2742 struct ch_reg *edata = (struct ch_reg *)data;
2743 edata->val = pi->nqsets;
2746 case CHELSIO_LOAD_FW: {
2749 struct ch_mem_range *t = (struct ch_mem_range *)data;
2752 * You're allowed to load a firmware only before FULL_INIT_DONE
2754 * FW_UPTODATE is also set so the rest of the initialization
2755 * will not overwrite what was loaded here. This gives you the
2756 * flexibility to load any firmware (and maybe shoot yourself in
2761 if (sc->open_device_map || sc->flags & FULL_INIT_DONE) {
2766 fw_data = malloc(t->len, M_DEVBUF, M_NOWAIT);
2770 error = copyin(t->buf, fw_data, t->len);
2773 error = -t3_load_fw(sc, fw_data, t->len);
2775 if (t3_get_fw_version(sc, &vers) == 0) {
2776 snprintf(&sc->fw_version[0], sizeof(sc->fw_version),
2777 "%d.%d.%d", G_FW_VERSION_MAJOR(vers),
2778 G_FW_VERSION_MINOR(vers), G_FW_VERSION_MICRO(vers));
2782 sc->flags |= FW_UPTODATE;
2784 free(fw_data, M_DEVBUF);
2788 case CHELSIO_LOAD_BOOT: {
2790 struct ch_mem_range *t = (struct ch_mem_range *)data;
2792 boot_data = malloc(t->len, M_DEVBUF, M_NOWAIT);
2796 error = copyin(t->buf, boot_data, t->len);
2798 error = -t3_load_boot(sc, boot_data, t->len);
2800 free(boot_data, M_DEVBUF);
2803 case CHELSIO_GET_PM: {
2804 struct ch_pm *m = (struct ch_pm *)data;
2805 struct tp_params *p = &sc->params.tp;
2807 if (!is_offload(sc))
2808 return (EOPNOTSUPP);
2810 m->tx_pg_sz = p->tx_pg_size;
2811 m->tx_num_pg = p->tx_num_pgs;
2812 m->rx_pg_sz = p->rx_pg_size;
2813 m->rx_num_pg = p->rx_num_pgs;
2814 m->pm_total = p->pmtx_size + p->chan_rx_size * p->nchan;
2818 case CHELSIO_SET_PM: {
2819 struct ch_pm *m = (struct ch_pm *)data;
2820 struct tp_params *p = &sc->params.tp;
2822 if (!is_offload(sc))
2823 return (EOPNOTSUPP);
2824 if (sc->flags & FULL_INIT_DONE)
2827 if (!m->rx_pg_sz || (m->rx_pg_sz & (m->rx_pg_sz - 1)) ||
2828 !m->tx_pg_sz || (m->tx_pg_sz & (m->tx_pg_sz - 1)))
2829 return (EINVAL); /* not power of 2 */
2830 if (!(m->rx_pg_sz & 0x14000))
2831 return (EINVAL); /* not 16KB or 64KB */
2832 if (!(m->tx_pg_sz & 0x1554000))
2834 if (m->tx_num_pg == -1)
2835 m->tx_num_pg = p->tx_num_pgs;
2836 if (m->rx_num_pg == -1)
2837 m->rx_num_pg = p->rx_num_pgs;
2838 if (m->tx_num_pg % 24 || m->rx_num_pg % 24)
2840 if (m->rx_num_pg * m->rx_pg_sz > p->chan_rx_size ||
2841 m->tx_num_pg * m->tx_pg_sz > p->chan_tx_size)
2844 p->rx_pg_size = m->rx_pg_sz;
2845 p->tx_pg_size = m->tx_pg_sz;
2846 p->rx_num_pgs = m->rx_num_pg;
2847 p->tx_num_pgs = m->tx_num_pg;
2850 case CHELSIO_SETMTUTAB: {
2851 struct ch_mtus *m = (struct ch_mtus *)data;
2854 if (!is_offload(sc))
2855 return (EOPNOTSUPP);
2856 if (offload_running(sc))
2858 if (m->nmtus != NMTUS)
2860 if (m->mtus[0] < 81) /* accommodate SACK */
2864 * MTUs must be in ascending order
2866 for (i = 1; i < NMTUS; ++i)
2867 if (m->mtus[i] < m->mtus[i - 1])
2870 memcpy(sc->params.mtus, m->mtus, sizeof(sc->params.mtus));
2873 case CHELSIO_GETMTUTAB: {
2874 struct ch_mtus *m = (struct ch_mtus *)data;
2876 if (!is_offload(sc))
2877 return (EOPNOTSUPP);
2879 memcpy(m->mtus, sc->params.mtus, sizeof(m->mtus));
2883 case CHELSIO_GET_MEM: {
2884 struct ch_mem_range *t = (struct ch_mem_range *)data;
2890 * Use these to avoid modifying len/addr in the the return
2893 uint32_t len = t->len, addr = t->addr;
2895 if (!is_offload(sc))
2896 return (EOPNOTSUPP);
2897 if (!(sc->flags & FULL_INIT_DONE))
2898 return (EIO); /* need the memory controllers */
2899 if ((addr & 0x7) || (len & 0x7))
2901 if (t->mem_id == MEM_CM)
2903 else if (t->mem_id == MEM_PMRX)
2905 else if (t->mem_id == MEM_PMTX)
2912 * bits 0..9: chip version
2913 * bits 10..15: chip revision
2915 t->version = 3 | (sc->params.rev << 10);
2918 * Read 256 bytes at a time as len can be large and we don't
2919 * want to use huge intermediate buffers.
2921 useraddr = (uint8_t *)t->buf;
2923 unsigned int chunk = min(len, sizeof(buf));
2925 error = t3_mc7_bd_read(mem, addr / 8, chunk / 8, buf);
2928 if (copyout(buf, useraddr, chunk))
2936 case CHELSIO_READ_TCAM_WORD: {
2937 struct ch_tcam_word *t = (struct ch_tcam_word *)data;
2939 if (!is_offload(sc))
2940 return (EOPNOTSUPP);
2941 if (!(sc->flags & FULL_INIT_DONE))
2942 return (EIO); /* need MC5 */
2943 return -t3_read_mc5_range(&sc->mc5, t->addr, 1, t->buf);
2946 case CHELSIO_SET_TRACE_FILTER: {
2947 struct ch_trace *t = (struct ch_trace *)data;
2948 const struct trace_params *tp;
2950 tp = (const struct trace_params *)&t->sip;
2952 t3_config_trace_filter(sc, tp, 0, t->invert_match,
2955 t3_config_trace_filter(sc, tp, 1, t->invert_match,
2959 case CHELSIO_SET_PKTSCHED: {
2960 struct ch_pktsched_params *p = (struct ch_pktsched_params *)data;
2961 if (sc->open_device_map == 0)
2963 send_pktsched_cmd(sc, p->sched, p->idx, p->min, p->max,
2967 case CHELSIO_IFCONF_GETREGS: {
2968 struct ch_ifconf_regs *regs = (struct ch_ifconf_regs *)data;
2969 int reglen = cxgb_get_regs_len();
2970 uint8_t *buf = malloc(reglen, M_DEVBUF, M_NOWAIT);
2974 if (regs->len > reglen)
2976 else if (regs->len < reglen)
2980 cxgb_get_regs(sc, regs, buf);
2981 error = copyout(buf, regs->data, reglen);
2983 free(buf, M_DEVBUF);
2987 case CHELSIO_SET_HW_SCHED: {
2988 struct ch_hw_sched *t = (struct ch_hw_sched *)data;
2989 unsigned int ticks_per_usec = core_ticks_per_usec(sc);
2991 if ((sc->flags & FULL_INIT_DONE) == 0)
2992 return (EAGAIN); /* need TP to be initialized */
2993 if (t->sched >= NTX_SCHED || !in_range(t->mode, 0, 1) ||
2994 !in_range(t->channel, 0, 1) ||
2995 !in_range(t->kbps, 0, 10000000) ||
2996 !in_range(t->class_ipg, 0, 10000 * 65535 / ticks_per_usec) ||
2997 !in_range(t->flow_ipg, 0,
2998 dack_ticks_to_usec(sc, 0x7ff)))
3002 error = t3_config_sched(sc, t->kbps, t->sched);
3006 if (t->class_ipg >= 0)
3007 t3_set_sched_ipg(sc, t->sched, t->class_ipg);
3008 if (t->flow_ipg >= 0) {
3009 t->flow_ipg *= 1000; /* us -> ns */
3010 t3_set_pace_tbl(sc, &t->flow_ipg, t->sched, 1);
3013 int bit = 1 << (S_TX_MOD_TIMER_MODE + t->sched);
3015 t3_set_reg_field(sc, A_TP_TX_MOD_QUEUE_REQ_MAP,
3016 bit, t->mode ? bit : 0);
3018 if (t->channel >= 0)
3019 t3_set_reg_field(sc, A_TP_TX_MOD_QUEUE_REQ_MAP,
3020 1 << t->sched, t->channel << t->sched);
3023 case CHELSIO_GET_EEPROM: {
3025 struct ch_eeprom *e = (struct ch_eeprom *)data;
3026 uint8_t *buf = malloc(EEPROMSIZE, M_DEVBUF, M_NOWAIT);
3031 e->magic = EEPROM_MAGIC;
3032 for (i = e->offset & ~3; !error && i < e->offset + e->len; i += 4)
3033 error = -t3_seeprom_read(sc, i, (uint32_t *)&buf[i]);
3036 error = copyout(buf + e->offset, e->data, e->len);
3038 free(buf, M_DEVBUF);
3041 case CHELSIO_CLEAR_STATS: {
3042 if (!(sc->flags & FULL_INIT_DONE))
3046 t3_mac_update_stats(&pi->mac);
3047 memset(&pi->mac.stats, 0, sizeof(pi->mac.stats));
3051 case CHELSIO_GET_UP_LA: {
3052 struct ch_up_la *la = (struct ch_up_la *)data;
3053 uint8_t *buf = malloc(LA_BUFSIZE, M_DEVBUF, M_NOWAIT);
3057 if (la->bufsize < LA_BUFSIZE)
3061 error = -t3_get_up_la(sc, &la->stopped, &la->idx,
3064 error = copyout(buf, la->data, la->bufsize);
3066 free(buf, M_DEVBUF);
3069 case CHELSIO_GET_UP_IOQS: {
3070 struct ch_up_ioqs *ioqs = (struct ch_up_ioqs *)data;
3071 uint8_t *buf = malloc(IOQS_BUFSIZE, M_DEVBUF, M_NOWAIT);
3077 if (ioqs->bufsize < IOQS_BUFSIZE)
3081 error = -t3_get_up_ioqs(sc, &ioqs->bufsize, buf);
3084 v = (uint32_t *)buf;
3086 ioqs->bufsize -= 4 * sizeof(uint32_t);
3087 ioqs->ioq_rx_enable = *v++;
3088 ioqs->ioq_tx_enable = *v++;
3089 ioqs->ioq_rx_status = *v++;
3090 ioqs->ioq_tx_status = *v++;
3092 error = copyout(v, ioqs->data, ioqs->bufsize);
3095 free(buf, M_DEVBUF);
3098 case CHELSIO_SET_FILTER: {
3099 struct ch_filter *f = (struct ch_filter *)data;;
3100 struct filter_info *p;
3101 unsigned int nfilters = sc->params.mc5.nfilters;
3103 if (!is_offload(sc))
3104 return (EOPNOTSUPP); /* No TCAM */
3105 if (!(sc->flags & FULL_INIT_DONE))
3106 return (EAGAIN); /* mc5 not setup yet */
3108 return (EBUSY); /* TOE will use TCAM */
3111 if (f->filter_id >= nfilters ||
3112 (f->val.dip && f->mask.dip != 0xffffffff) ||
3113 (f->val.sport && f->mask.sport != 0xffff) ||
3114 (f->val.dport && f->mask.dport != 0xffff) ||
3115 (f->val.vlan && f->mask.vlan != 0xfff) ||
3116 (f->val.vlan_prio &&
3117 f->mask.vlan_prio != FILTER_NO_VLAN_PRI) ||
3118 (f->mac_addr_idx != 0xffff && f->mac_addr_idx > 15) ||
3119 f->qset >= SGE_QSETS ||
3120 sc->rrss_map[f->qset] >= RSS_TABLE_SIZE)
3123 /* Was allocated with M_WAITOK */
3124 KASSERT(sc->filters, ("filter table NULL\n"));
3126 p = &sc->filters[f->filter_id];
3130 bzero(p, sizeof(*p));
3131 p->sip = f->val.sip;
3132 p->sip_mask = f->mask.sip;
3133 p->dip = f->val.dip;
3134 p->sport = f->val.sport;
3135 p->dport = f->val.dport;
3136 p->vlan = f->mask.vlan ? f->val.vlan : 0xfff;
3137 p->vlan_prio = f->mask.vlan_prio ? (f->val.vlan_prio & 6) :
3139 p->mac_hit = f->mac_hit;
3140 p->mac_vld = f->mac_addr_idx != 0xffff;
3141 p->mac_idx = f->mac_addr_idx;
3142 p->pkt_type = f->proto;
3143 p->report_filter_id = f->want_filter_id;
3148 error = set_filter(sc, f->filter_id, p);
3153 case CHELSIO_DEL_FILTER: {
3154 struct ch_filter *f = (struct ch_filter *)data;
3155 struct filter_info *p;
3156 unsigned int nfilters = sc->params.mc5.nfilters;
3158 if (!is_offload(sc))
3159 return (EOPNOTSUPP);
3160 if (!(sc->flags & FULL_INIT_DONE))
3162 if (nfilters == 0 || sc->filters == NULL)
3164 if (f->filter_id >= nfilters)
3167 p = &sc->filters[f->filter_id];
3171 return (EFAULT); /* Read "Bad address" as "Bad index" */
3173 bzero(p, sizeof(*p));
3174 p->sip = p->sip_mask = 0xffffffff;
3176 p->vlan_prio = FILTER_NO_VLAN_PRI;
3178 error = set_filter(sc, f->filter_id, p);
3181 case CHELSIO_GET_FILTER: {
3182 struct ch_filter *f = (struct ch_filter *)data;
3183 struct filter_info *p;
3184 unsigned int i, nfilters = sc->params.mc5.nfilters;
3186 if (!is_offload(sc))
3187 return (EOPNOTSUPP);
3188 if (!(sc->flags & FULL_INIT_DONE))
3190 if (nfilters == 0 || sc->filters == NULL)
3193 i = f->filter_id == 0xffffffff ? 0 : f->filter_id + 1;
3194 for (; i < nfilters; i++) {
3195 p = &sc->filters[i];
3199 bzero(f, sizeof(*f));
3202 f->val.sip = p->sip;
3203 f->mask.sip = p->sip_mask;
3204 f->val.dip = p->dip;
3205 f->mask.dip = p->dip ? 0xffffffff : 0;
3206 f->val.sport = p->sport;
3207 f->mask.sport = p->sport ? 0xffff : 0;
3208 f->val.dport = p->dport;
3209 f->mask.dport = p->dport ? 0xffff : 0;
3210 f->val.vlan = p->vlan == 0xfff ? 0 : p->vlan;
3211 f->mask.vlan = p->vlan == 0xfff ? 0 : 0xfff;
3212 f->val.vlan_prio = p->vlan_prio == FILTER_NO_VLAN_PRI ?
3214 f->mask.vlan_prio = p->vlan_prio == FILTER_NO_VLAN_PRI ?
3215 0 : FILTER_NO_VLAN_PRI;
3216 f->mac_hit = p->mac_hit;
3217 f->mac_addr_idx = p->mac_vld ? p->mac_idx : 0xffff;
3218 f->proto = p->pkt_type;
3219 f->want_filter_id = p->report_filter_id;
3228 f->filter_id = 0xffffffff;
3232 return (EOPNOTSUPP);
3239 static __inline void
3240 reg_block_dump(struct adapter *ap, uint8_t *buf, unsigned int start,
3243 uint32_t *p = (uint32_t *)(buf + start);
3245 for ( ; start <= end; start += sizeof(uint32_t))
3246 *p++ = t3_read_reg(ap, start);
3249 #define T3_REGMAP_SIZE (3 * 1024)
3251 cxgb_get_regs_len(void)
3253 return T3_REGMAP_SIZE;
3257 cxgb_get_regs(adapter_t *sc, struct ch_ifconf_regs *regs, uint8_t *buf)
3262 * bits 0..9: chip version
3263 * bits 10..15: chip revision
3264 * bit 31: set for PCIe cards
3266 regs->version = 3 | (sc->params.rev << 10) | (is_pcie(sc) << 31);
3269 * We skip the MAC statistics registers because they are clear-on-read.
3270 * Also reading multi-register stats would need to synchronize with the
3271 * periodic mac stats accumulation. Hard to justify the complexity.
3273 memset(buf, 0, cxgb_get_regs_len());
3274 reg_block_dump(sc, buf, 0, A_SG_RSPQ_CREDIT_RETURN);
3275 reg_block_dump(sc, buf, A_SG_HI_DRB_HI_THRSH, A_ULPRX_PBL_ULIMIT);
3276 reg_block_dump(sc, buf, A_ULPTX_CONFIG, A_MPS_INT_CAUSE);
3277 reg_block_dump(sc, buf, A_CPL_SWITCH_CNTRL, A_CPL_MAP_TBL_DATA);
3278 reg_block_dump(sc, buf, A_SMB_GLOBAL_TIME_CFG, A_XGM_SERDES_STAT3);
3279 reg_block_dump(sc, buf, A_XGM_SERDES_STATUS0,
3280 XGM_REG(A_XGM_SERDES_STAT3, 1));
3281 reg_block_dump(sc, buf, XGM_REG(A_XGM_SERDES_STATUS0, 1),
3282 XGM_REG(A_XGM_RX_SPI4_SOP_EOP_CNT, 1));
3286 alloc_filters(struct adapter *sc)
3288 struct filter_info *p;
3289 unsigned int nfilters = sc->params.mc5.nfilters;
3294 p = malloc(sizeof(*p) * nfilters, M_DEVBUF, M_WAITOK | M_ZERO);
3297 p = &sc->filters[nfilters - 1];
3299 p->vlan_prio = FILTER_NO_VLAN_PRI;
3300 p->pass = p->rss = p->valid = p->locked = 1;
3306 setup_hw_filters(struct adapter *sc)
3309 unsigned int nfilters = sc->params.mc5.nfilters;
3314 t3_enable_filters(sc);
3316 for (i = rc = 0; i < nfilters && !rc; i++) {
3317 if (sc->filters[i].locked)
3318 rc = set_filter(sc, i, &sc->filters[i]);
3325 set_filter(struct adapter *sc, int id, const struct filter_info *f)
3329 struct ulp_txpkt *txpkt;
3330 struct work_request_hdr *wr;
3331 struct cpl_pass_open_req *oreq;
3332 struct cpl_set_tcb_field *sreq;
3334 len = sizeof(*wr) + sizeof(*oreq) + 2 * sizeof(*sreq);
3335 KASSERT(len <= MHLEN, ("filter request too big for an mbuf"));
3337 id += t3_mc5_size(&sc->mc5) - sc->params.mc5.nroutes -
3338 sc->params.mc5.nfilters;
3340 m = m_gethdr(M_WAITOK, MT_DATA);
3341 m->m_len = m->m_pkthdr.len = len;
3342 bzero(mtod(m, char *), len);
3344 wr = mtod(m, struct work_request_hdr *);
3345 wr->wrh_hi = htonl(V_WR_OP(FW_WROPCODE_BYPASS) | F_WR_ATOMIC);
3347 oreq = (struct cpl_pass_open_req *)(wr + 1);
3348 txpkt = (struct ulp_txpkt *)oreq;
3349 txpkt->cmd_dest = htonl(V_ULPTX_CMD(ULP_TXPKT));
3350 txpkt->len = htonl(V_ULPTX_NFLITS(sizeof(*oreq) / 8));
3351 OPCODE_TID(oreq) = htonl(MK_OPCODE_TID(CPL_PASS_OPEN_REQ, id));
3352 oreq->local_port = htons(f->dport);
3353 oreq->peer_port = htons(f->sport);
3354 oreq->local_ip = htonl(f->dip);
3355 oreq->peer_ip = htonl(f->sip);
3356 oreq->peer_netmask = htonl(f->sip_mask);
3358 oreq->opt0l = htonl(F_NO_OFFLOAD);
3359 oreq->opt1 = htonl(V_MAC_MATCH_VALID(f->mac_vld) |
3360 V_CONN_POLICY(CPL_CONN_POLICY_FILTER) |
3361 V_VLAN_PRI(f->vlan_prio >> 1) |
3362 V_VLAN_PRI_VALID(f->vlan_prio != FILTER_NO_VLAN_PRI) |
3363 V_PKT_TYPE(f->pkt_type) | V_OPT1_VLAN(f->vlan) |
3364 V_MAC_MATCH(f->mac_idx | (f->mac_hit << 4)));
3366 sreq = (struct cpl_set_tcb_field *)(oreq + 1);
3367 set_tcb_field_ulp(sreq, id, 1, 0x1800808000ULL,
3368 (f->report_filter_id << 15) | (1 << 23) |
3369 ((u64)f->pass << 35) | ((u64)!f->rss << 36));
3370 set_tcb_field_ulp(sreq + 1, id, 0, 0xffffffff, (2 << 19) | 1);
3373 if (f->pass && !f->rss) {
3374 len = sizeof(*sreq);
3375 m = m_gethdr(M_WAITOK, MT_DATA);
3376 m->m_len = m->m_pkthdr.len = len;
3377 bzero(mtod(m, char *), len);
3378 sreq = mtod(m, struct cpl_set_tcb_field *);
3379 sreq->wr.wrh_hi = htonl(V_WR_OP(FW_WROPCODE_FORWARD));
3380 mk_set_tcb_field(sreq, id, 25, 0x3f80000,
3381 (u64)sc->rrss_map[f->qset] << 19);
3388 mk_set_tcb_field(struct cpl_set_tcb_field *req, unsigned int tid,
3389 unsigned int word, u64 mask, u64 val)
3391 OPCODE_TID(req) = htonl(MK_OPCODE_TID(CPL_SET_TCB_FIELD, tid));
3392 req->reply = V_NO_REPLY(1);
3394 req->word = htons(word);
3395 req->mask = htobe64(mask);
3396 req->val = htobe64(val);
3400 set_tcb_field_ulp(struct cpl_set_tcb_field *req, unsigned int tid,
3401 unsigned int word, u64 mask, u64 val)
3403 struct ulp_txpkt *txpkt = (struct ulp_txpkt *)req;
3405 txpkt->cmd_dest = htonl(V_ULPTX_CMD(ULP_TXPKT));
3406 txpkt->len = htonl(V_ULPTX_NFLITS(sizeof(*req) / 8));
3407 mk_set_tcb_field(req, tid, word, mask, val);