38#include <sys/kernel.h>
40#include <sys/module.h>
43#include <machine/bus.h>
44#include <machine/resource.h>
47#include <sys/ioccom.h>
49#include <sys/linker.h>
50#include <sys/firmware.h>
51#include <sys/socket.h>
52#include <sys/sockio.h>
54#include <sys/sysctl.h>
55#include <sys/syslog.h>
57#include <sys/taskqueue.h>
61#include <net/debugnet.h>
62#include <net/ethernet.h>
64#include <net/if_var.h>
65#include <net/if_arp.h>
67#include <net/if_media.h>
68#include <net/if_types.h>
69#include <net/if_vlan_var.h>
71#include <netinet/in_systm.h>
72#include <netinet/in.h>
73#include <netinet/if_ether.h>
74#include <netinet/ip.h>
75#include <netinet/ip.h>
76#include <netinet/tcp.h>
77#include <netinet/udp.h>
79#include <dev/pci/pcireg.h>
80#include <dev/pci/pcivar.h>
81#include <dev/pci/pci_private.h>
95static int cxgb_ioctl(
struct ifnet *,
unsigned long, caddr_t);
116static int cpl_not_handled(
struct sge_qset *,
struct rsp_desc *,
struct mbuf *);
133static int toe_capability(
struct port_info *,
int);
209 .d_version = D_VERSION,
226static struct mtx t3_uld_list_lock;
239static int msi_allowed = 2;
241SYSCTL_NODE(_hw, OID_AUTO, cxgb, CTLFLAG_RD | CTLFLAG_MPSAFE, 0,
242 "CXGB driver parameters");
243SYSCTL_INT(_hw_cxgb, OID_AUTO, msi_allowed, CTLFLAG_RDTUN, &msi_allowed, 0,
244 "MSI-X, MSI, INTx selector");
250static int multiq = 1;
251SYSCTL_INT(_hw_cxgb, OID_AUTO, multiq, CTLFLAG_RDTUN, &multiq, 0,
252 "use min(ncpus/ports, 8) queue-sets per port");
259static int force_fw_update = 0;
260SYSCTL_INT(_hw_cxgb, OID_AUTO, force_fw_update, CTLFLAG_RDTUN, &force_fw_update, 0,
261 "update firmware even if up to date");
264SYSCTL_INT(_hw_cxgb, OID_AUTO, use_16k_clusters, CTLFLAG_RDTUN,
267static int nfilters = -1;
268SYSCTL_INT(_hw_cxgb, OID_AUTO, nfilters, CTLFLAG_RDTUN,
269 &nfilters, 0,
"max number of entries in the filter table");
272 MAX_TXQ_ENTRIES = 16384,
273 MAX_CTRL_TXQ_ENTRIES = 1024,
274 MAX_RSPQ_ENTRIES = 16384,
275 MAX_RX_BUFFERS = 16384,
276 MAX_RX_JUMBO_BUFFERS = 16384,
278 MIN_CTRL_TXQ_ENTRIES = 4,
279 MIN_RSPQ_ENTRIES = 32,
281 MIN_FL_JUMBO_ENTRIES = 32
306#define EEPROM_MAGIC 0x38E2F10C
308#define PORT_MASK ((1 << MAX_NPORTS) - 1)
340 if ((id->
vendor == pci_get_vendor(dev)) &&
341 (id->
device == pci_get_device(dev))) {
367 char *ports, buf[80];
380 snprintf(buf,
sizeof(buf),
"%s, %d %s", ai->
desc, nports, ports);
381 device_set_desc_copy(dev, buf);
382 return (BUS_PROBE_DEFAULT);
385#define FW_FNAME "cxgb_t3fw"
386#define TPEEPROM_NAME "cxgb_t3%c_tp_eeprom"
387#define TPSRAM_NAME "cxgb_t3%c_protocol_sram"
392 const struct firmware *fw;
396 if ((fw = firmware_get(
FW_FNAME)) == NULL) {
397 device_printf(sc->
dev,
"Could not find firmware image %s\n",
FW_FNAME);
400 device_printf(sc->
dev,
"installing firmware on card\n");
401 status =
t3_load_fw(sc, (
const uint8_t *)fw->data, fw->datasize);
404 device_printf(sc->
dev,
"failed to install firmware: %d\n",
413 firmware_put(fw, FIRMWARE_UNLOAD);
456 sc = device_get_softc(
dev);
462 device_get_unit(
dev));
466 device_get_unit(
dev));
468 device_get_unit(
dev));
470 device_get_unit(
dev));
477 SLIST_INSERT_HEAD(&t3_list, sc, link);
481 if (pci_find_cap(
dev, PCIY_EXPRESS, ®) == 0) {
484 lnk = pci_read_config(
dev, reg + PCIER_LINK_STA, 2);
485 sc->
link_width = (lnk & PCIEM_LINK_STA_WIDTH) >> 4;
488 device_printf(sc->
dev,
489 "PCIe x%d Link, expect reduced performance\n",
493 pci_set_max_read_req(
dev, 4096);
497 pci_enable_busmaster(
dev);
503 if ((sc->
regs_res = bus_alloc_resource_any(
dev, SYS_RES_MEMORY,
504 &sc->
regs_rid, RF_ACTIVE)) == NULL) {
505 device_printf(
dev,
"Cannot allocate BAR region 0\n");
518 printf(
"prep adapter failed\n");
526 ((sc->
udbs_res = bus_alloc_resource_any(
dev, SYS_RES_MEMORY,
527 &sc->
udbs_rid, RF_ACTIVE)) == NULL)) {
528 device_printf(
dev,
"Cannot allocate BAR region 1\n");
539 if ((msi_allowed >= 2) &&
547 if (pci_msix_count(
dev) == 0 ||
550 device_printf(
dev,
"alloc msix failed - "
551 "msi_count=%d, msi_needed=%d, err=%d; "
556 pci_release_msi(
dev);
557 bus_release_resource(
dev, SYS_RES_MEMORY,
564 "using MSI-X interrupts (%u vectors)\n",
569 if ((msi_allowed >= 1) && (sc->
msi_count == 0)) {
571 if ((error = pci_alloc_msi(
dev, &sc->
msi_count)) != 0) {
572 device_printf(
dev,
"alloc msi failed - "
573 "err=%d; will try INTx\n", error);
576 pci_release_msi(
dev);
580 device_printf(
dev,
"using MSI interrupts\n");
584 device_printf(
dev,
"using line interrupts\n");
589 sc->
tq = taskqueue_create(
"cxgb_taskq", M_NOWAIT,
590 taskqueue_thread_enqueue, &sc->
tq);
591 if (sc->
tq == NULL) {
592 device_printf(
dev,
"failed to allocate controller task queue\n");
596 taskqueue_start_threads(&sc->
tq, 1, PI_NET,
"%s taskq",
597 device_get_nameunit(
dev));
608 device_printf(
dev,
"firmware needs to be updated to version %d.%d.%d\n",
610 sc->
flags &= ~FW_UPTODATE;
619 device_printf(
dev,
"SRAM needs to be updated to version %c-%d.%d.%d\n",
621 sc->
flags &= ~TPS_UPTODATE;
633 if ((child = device_add_child(dev,
"cxgb", -1)) == NULL) {
634 device_printf(dev,
"failed to add child port\n");
648 device_set_softc(child, pi);
650 if ((error = bus_generic_attach(dev)) != 0)
666 snprintf(buf,
sizeof(buf),
"%s %sNIC\t E/C: %s S/N: %s",
669 device_set_desc_copy(dev, buf);
675 device_printf(sc->
dev,
"Firmware Version %s\n", &sc->
fw_version[0]);
680 for (i = 0; i < NUM_CPL_HANDLERS; i++)
681 sc->cpl_handler[i] = cpl_not_handled;
703 sc = device_get_softc(
dev);
740 bus_generic_detach(sc->
dev);
743 device_delete_child(sc->
dev, sc->
portdev[i]) != 0)
744 device_printf(sc->
dev,
"failed to delete child port\n");
756 KASSERT(sc->
port[i].
ifp == NULL, (
"%s: port %i undead!",
772 sc->
flags &= ~FULL_INIT_DONE;
780 device_printf(sc->
dev,
"releasing msi message(s)\n");
781 pci_release_msi(sc->
dev);
783 device_printf(sc->
dev,
"no msi message to release\n");
794 if (sc->
tq != NULL) {
795 taskqueue_free(sc->
tq);
803 bus_release_resource(sc->
dev, SYS_RES_MEMORY, sc->
udbs_rid,
807 bus_release_resource(sc->
dev, SYS_RES_MEMORY, sc->
regs_rid,
814 SLIST_REMOVE(&t3_list, sc,
adapter, link);
830 int i, j, err, irq_idx = 0, qset_idx = 0;
834 device_printf(sc->
dev,
"t3_sge_alloc returned %d\n", err);
844 for (j = 0; j < pi->
nqsets; j++, qset_idx++) {
850 device_printf(sc->
dev,
851 "t3_sge_alloc_qset failed with %d\n", err);
873 (
"%s: half-done interrupt (%d).", __func__, i));
889 (
"%s: half-done interrupt.", __func__));
892 bus_release_resource(sc->
dev, SYS_RES_IRQ, sc->
irq_rid,
903 struct resource *res;
907 sc->
irq_rid = intr_flag ? 1 : 0;
909 RF_SHAREABLE | RF_ACTIVE);
911 device_printf(sc->
dev,
"Cannot allocate interrupt (%x, %u)\n",
917 INTR_MPSAFE | INTR_TYPE_NET, NULL,
921 device_printf(sc->
dev,
922 "Cannot set up interrupt (%x, %u, %d)\n",
924 bus_release_resource(sc->
dev, SYS_RES_IRQ, sc->
irq_rid,
936 for (i = 0; i < sc->
msi_count - 1; i++) {
938 res = bus_alloc_resource_any(sc->
dev, SYS_RES_IRQ, &rid,
939 RF_SHAREABLE | RF_ACTIVE);
941 device_printf(sc->
dev,
"Cannot allocate interrupt "
942 "for message %d\n", rid);
947 err = bus_setup_intr(sc->
dev, res, INTR_MPSAFE | INTR_TYPE_NET,
950 device_printf(sc->
dev,
"Cannot set up interrupt "
951 "for message %d (%d)\n", rid, err);
952 bus_release_resource(sc->
dev, SYS_RES_IRQ, rid, res);
959 bus_describe_intr(sc->
dev, res, tag,
"qs%d", i);
976 p = device_get_softc(dev);
978 snprintf(buf,
sizeof(buf),
"Port %d %s", p->
port_id, desc);
979 device_set_desc_copy(dev, buf);
989 UID_ROOT, GID_WHEEL, 0600,
"%s", if_name(pi->
ifp));
999#define CXGB_CAP (IFCAP_VLAN_HWTAGGING | IFCAP_VLAN_MTU | IFCAP_HWCSUM | \
1000 IFCAP_VLAN_HWCSUM | IFCAP_TSO | IFCAP_JUMBO_MTU | IFCAP_LRO | \
1001 IFCAP_VLAN_HWTSO | IFCAP_LINKSTATE | IFCAP_HWCSUM_IPV6)
1002#define CXGB_CAP_ENABLE CXGB_CAP
1012 p = device_get_softc(
dev);
1015 device_get_unit(device_get_parent(
dev)), p->
port_id);
1022 ifp = p->
ifp = if_alloc(IFT_ETHER);
1024 device_printf(
dev,
"Cannot allocate ifnet\n");
1028 if_initname(
ifp, device_get_name(
dev), device_get_unit(
dev));
1031 ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST;
1040 ifp->if_capabilities |= IFCAP_TOE4;
1043 ifp->if_hwassist = CSUM_TCP | CSUM_UDP | CSUM_IP | CSUM_TSO |
1044 CSUM_UDP_IPV6 | CSUM_TCP_IPV6;
1045 ifp->if_hw_tsomax = IP_MAXPACKET;
1046 ifp->if_hw_tsomaxsegcount = 36;
1047 ifp->if_hw_tsomaxsegsize = 65536;
1053 ifp->if_capabilities &= ~(IFCAP_TSO | IFCAP_VLAN_HWTSO);
1054 ifp->if_capenable &= ~(IFCAP_TSO | IFCAP_VLAN_HWTSO);
1055 ifp->if_hwassist &= ~CSUM_TSO;
1061 DEBUGNET_SET(
ifp, cxgb);
1065 ifp->if_mtu = ETHERMTU_JUMBO;
1068 printf(
"makedev failed %d\n", err);
1096 p = device_get_softc(
dev);
1104 mtx_sleep(&sc->
flags, &sc->
lock, 0,
"cxgbdtch", 0);
1112 ether_ifdetach(p->
ifp);
1128 wakeup_one(&sc->
flags);
1146 device_printf(sc->
dev,
"encountered fatal error, operation suspended\n");
1148 device_printf(sc->
dev,
"FW_ status: 0x%x, 0x%x, 0x%x, 0x%x\n",
1149 fw_status[0], fw_status[1], fw_status[2], fw_status[3]);
1156 struct pci_devinfo *dinfo;
1162 dinfo = device_get_ivars(dev);
1165 status = pci_read_config(dev, PCIR_STATUS, 2);
1166 if (!(status & PCIM_STATUS_CAPPRESENT))
1169 switch (cfg->hdrtype & PCIM_HDRTYPE) {
1175 ptr = PCIR_CAP_PTR_2;
1181 ptr = pci_read_config(dev, ptr, 1);
1184 if (pci_read_config(dev, ptr + PCICAP_ID, 1) == cap)
1186 ptr = pci_read_config(dev, ptr + PCICAP_NEXTPTR, 1);
1196 struct pci_devinfo *dinfo;
1199 dinfo = device_get_ivars(dev);
1201 pci_cfg_save(dev, dinfo, 0);
1209 struct pci_devinfo *dinfo;
1212 dinfo = device_get_ivars(dev);
1214 pci_cfg_restore(dev, dinfo);
1233 int duplex,
int fc,
int mac_was_reset)
1236 struct ifnet *
ifp = pi->
ifp;
1239 KASSERT(
ifp, (
"%s: if detached.", __func__));
1242 if (mac_was_reset) {
1249 ifp->if_baudrate = IF_Mbps(speed);
1250 if_link_state_change(
ifp, LINK_STATE_UP);
1252 if_link_state_change(
ifp, LINK_STATE_DOWN);
1266 static const char *mod_str[] = {
1267 NULL,
"SR",
"LR",
"LRM",
"TWINAX",
"TWINAX-L",
"unknown"
1272 if (mod != pi->
media.ifm_cur->ifm_data)
1276 if_printf(pi->
ifp,
"PHY module unplugged\n");
1279 (
"invalid PHY module type %d", mod));
1280 if_printf(pi->
ifp,
"%s PHY module inserted\n", mod_str[mod]);
1294 printf(
"set_hw_addr on idx %d addr %6D\n", port_idx,
hw_addr,
":");
1305 struct ifnet *
ifp = p->
ifp;
1312 bcopy(IF_LLADDR(
ifp), p->
hw_addr, ETHER_ADDR_LEN);
1315 if (
ifp->if_capenable & IFCAP_VLAN_MTU)
1316 mtu += ETHER_VLAN_ENCAP_LEN;
1318 hwtagging = (
ifp->if_capenable & IFCAP_VLAN_HWTAGGING) != 0;
1352 for (i = 0; i < 16; i++) {
1355 m = m_gethdr(M_WAITOK, MT_DATA);
1357 m->m_len = m->m_pkthdr.len =
sizeof(*req);
1358 memset(req, 0,
sizeof(*req));
1365 for (i = 0; i < 2048; i++) {
1368 m = m_gethdr(M_WAITOK, MT_DATA);
1370 m->m_len = m->m_pkthdr.len =
sizeof(*req);
1371 memset(req, 0,
sizeof(*req));
1378 for (i = 0; i < 2048; i++) {
1381 m = m_gethdr(M_WAITOK, MT_DATA);
1383 m->m_len = m->m_pkthdr.len =
sizeof(*req);
1384 memset(req, 0,
sizeof(*req));
1391 m = m_gethdr(M_WAITOK, MT_DATA);
1393 m->m_len = m->m_pkthdr.len =
sizeof(*greq);
1394 memset(greq, 0,
sizeof(*greq));
1397 greq->
mask = htobe64(1);
1435 rspq_map[i] = nq[0] ? i % nq[0] : 0;
1436 rspq_map[i +
RSS_TABLE_SIZE / 2] = nq[1] ? i % nq[1] + nq[0] : 0;
1443 if (adap->
rrss_map[rspq_map[i]] == 0xff)
1459 m = m_gethdr(M_NOWAIT, MT_DATA);
1469 m->m_len = m->m_pkthdr.len =
sizeof(*req);
1479 for (i = 0; i < (sc)->params.nports; ++i) {
1482 for (j = 0; j < pi->
nqsets; ++j) {
1493 const struct firmware *tpeeprom;
1496 unsigned int major, minor;
1510 tpeeprom = firmware_get(name);
1511 if (tpeeprom == NULL) {
1512 device_printf(adap->
dev,
1513 "could not load TP EEPROM: unable to load %s\n",
1518 len = tpeeprom->datasize - 4;
1522 goto release_tpeeprom;
1525 device_printf(adap->
dev,
1526 "%s length is wrong len=%d expected=%d\n", name,
1531 ret =
set_eeprom(&adap->
port[0], tpeeprom->data, tpeeprom->datasize,
1535 device_printf(adap->
dev,
1536 "Protocol SRAM image updated in EEPROM to %d.%d.%d\n",
1539 device_printf(adap->
dev,
1540 "Protocol SRAM image update in EEPROM failed\n");
1543 firmware_put(tpeeprom, FIRMWARE_UNLOAD);
1551 const struct firmware *tpsram;
1560 tpsram = firmware_get(name);
1561 if (tpsram == NULL){
1562 device_printf(adap->
dev,
"could not load TP SRAM\n");
1565 device_printf(adap->
dev,
"updating TP SRAM\n");
1569 goto release_tpsram;
1573 device_printf(adap->
dev,
"loading protocol SRAM failed\n");
1576 firmware_put(tpsram, FIRMWARE_UNLOAD);
1691 struct ifnet *
ifp = p->
ifp;
1693 int i, rc = 0, may_sleep = 0, gave_up_lock = 0;
1699 if (mtx_sleep(&sc->
flags, &sc->
lock, PCATCH,
"cxgbinit", 0)) {
1708 KASSERT(!
IS_BUSY(sc), (
"%s: controller busy.", __func__));
1727 (
ifp->if_drv_flags & IFF_DRV_RUNNING)) {
1737 ifp->if_drv_flags |= IFF_DRV_RUNNING;
1738 ifp->if_drv_flags &= ~IFF_DRV_OACTIVE;
1758 KASSERT(
IS_BUSY(sc), (
"%s: controller not busy.", __func__));
1762 wakeup_one(&sc->
flags);
1776 if (mtx_sleep(&sc->
flags, &sc->
lock, PCATCH,
"cxgbunin", 0)) {
1785 KASSERT(!
IS_BUSY(sc), (
"%s: controller busy.", __func__));
1792 KASSERT(
IS_BUSY(sc), (
"%s: controller not busy.", __func__));
1794 wakeup_one(&sc->
flags);
1807 struct ifnet *
ifp = pi->
ifp;
1834 ifp->if_drv_flags &= ~(IFF_DRV_RUNNING | IFF_DRV_OACTIVE);
1875 for (i = 0; i < p->
nqsets; i++) {
1887 struct ifreq *ifr = (
struct ifreq *)data;
1888 int flags, error = 0, mtu;
1902 if ((mtu < ETHERMIN) || (mtu > ETHERMTU_JUMBO)) {
1918 if (
ifp->if_flags & IFF_UP) {
1919 if (
ifp->if_drv_flags & IFF_DRV_RUNNING) {
1921 if (((
ifp->if_flags ^
flags) & IFF_PROMISC) ||
1922 ((
ifp->if_flags ^
flags) & IFF_ALLMULTI)) {
1935 }
else if (
ifp->if_drv_flags & IFF_DRV_RUNNING)
1949 if (
ifp->if_drv_flags & IFF_DRV_RUNNING) {
1963 mask = ifr->ifr_reqcap ^
ifp->if_capenable;
1964 if (mask & IFCAP_TXCSUM) {
1965 ifp->if_capenable ^= IFCAP_TXCSUM;
1966 ifp->if_hwassist ^= (CSUM_TCP | CSUM_UDP | CSUM_IP);
1968 if (IFCAP_TSO4 &
ifp->if_capenable &&
1969 !(IFCAP_TXCSUM &
ifp->if_capenable)) {
1970 mask &= ~IFCAP_TSO4;
1971 ifp->if_capenable &= ~IFCAP_TSO4;
1973 "tso4 disabled due to -txcsum.\n");
1976 if (mask & IFCAP_TXCSUM_IPV6) {
1977 ifp->if_capenable ^= IFCAP_TXCSUM_IPV6;
1978 ifp->if_hwassist ^= (CSUM_UDP_IPV6 | CSUM_TCP_IPV6);
1980 if (IFCAP_TSO6 &
ifp->if_capenable &&
1981 !(IFCAP_TXCSUM_IPV6 &
ifp->if_capenable)) {
1982 mask &= ~IFCAP_TSO6;
1983 ifp->if_capenable &= ~IFCAP_TSO6;
1985 "tso6 disabled due to -txcsum6.\n");
1988 if (mask & IFCAP_RXCSUM)
1989 ifp->if_capenable ^= IFCAP_RXCSUM;
1990 if (mask & IFCAP_RXCSUM_IPV6)
1991 ifp->if_capenable ^= IFCAP_RXCSUM_IPV6;
1999 if (mask & IFCAP_TSO4) {
2000 if (!(IFCAP_TSO4 &
ifp->if_capenable) &&
2001 !(IFCAP_TXCSUM &
ifp->if_capenable)) {
2002 if_printf(
ifp,
"enable txcsum first.\n");
2006 ifp->if_capenable ^= IFCAP_TSO4;
2008 if (mask & IFCAP_TSO6) {
2009 if (!(IFCAP_TSO6 &
ifp->if_capenable) &&
2010 !(IFCAP_TXCSUM_IPV6 &
ifp->if_capenable)) {
2011 if_printf(
ifp,
"enable txcsum6 first.\n");
2015 ifp->if_capenable ^= IFCAP_TSO6;
2017 if (mask & IFCAP_LRO) {
2018 ifp->if_capenable ^= IFCAP_LRO;
2024 if (mask & IFCAP_TOE4) {
2025 int enable = (
ifp->if_capenable ^ mask) & IFCAP_TOE4;
2027 error = toe_capability(p, enable);
2029 ifp->if_capenable ^= mask;
2032 if (mask & IFCAP_VLAN_HWTAGGING) {
2033 ifp->if_capenable ^= IFCAP_VLAN_HWTAGGING;
2034 if (
ifp->if_drv_flags & IFF_DRV_RUNNING) {
2040 if (mask & IFCAP_VLAN_MTU) {
2041 ifp->if_capenable ^= IFCAP_VLAN_MTU;
2042 if (
ifp->if_drv_flags & IFF_DRV_RUNNING) {
2048 if (mask & IFCAP_VLAN_HWTSO)
2049 ifp->if_capenable ^= IFCAP_VLAN_HWTSO;
2050 if (mask & IFCAP_VLAN_HWCSUM)
2051 ifp->if_capenable ^= IFCAP_VLAN_HWCSUM;
2053#ifdef VLAN_CAPABILITIES
2054 VLAN_CAPABILITIES(
ifp);
2060 error = ifmedia_ioctl(
ifp, ifr, &p->
media, command);
2063 error = ether_ioctl(
ifp, command, data);
2072 return (EOPNOTSUPP);
2083 return (IFM_10G_SR);
2085 return (IFM_10G_LR);
2087 return (IFM_10G_LRM);
2089 return (IFM_10G_TWINAX);
2091 return (IFM_10G_TWINAX_LONG);
2095 return (IFM_UNKNOWN);
2098 KASSERT(0, (
"%s: modtype %d unknown", __func__, mod));
2099 return (IFM_UNKNOWN);
2111 int m = IFM_ETHER | IFM_FDX;
2115 ifmedia_removeall(
media);
2120 ifmedia_add(
media, m | IFM_10G_T, mod, NULL);
2123 ifmedia_add(
media, m | IFM_1000_T, mod, NULL);
2126 ifmedia_add(
media, m | IFM_100_TX, mod, NULL);
2129 ifmedia_add(
media, m | IFM_10_T, mod, NULL);
2131 ifmedia_add(
media, IFM_ETHER | IFM_AUTO, mod, NULL);
2132 ifmedia_set(
media, IFM_ETHER | IFM_AUTO);
2138 (
"%s: unexpected cap 0x%x", __func__,
phy->
caps));
2140 ifmedia_add(
media, m | IFM_10G_CX4, mod, NULL);
2141 ifmedia_set(
media, m | IFM_10G_CX4);
2148 if (IFM_SUBTYPE(m) == IFM_NONE)
2151 ifmedia_add(
media, m, mod, NULL);
2152 ifmedia_set(
media, m);
2159 ifmedia_add(
media, m | IFM_1000_SX, mod, NULL);
2160 ifmedia_set(
media, m | IFM_1000_SX);
2163 KASSERT(0, (
"%s: don't know how to handle 0x%x.", __func__,
2174 struct ifmedia_entry *cur = p->
media.ifm_cur;
2179 cur = p->
media.ifm_cur;
2182 ifmr->ifm_status = IFM_AVALID;
2186 ifmr->ifm_status |= IFM_ACTIVE;
2192 if (IFM_SUBTYPE(cur->ifm_media) != IFM_AUTO)
2195 (
"%s: unexpected PHY caps 0x%x", __func__, p->
phy.
caps));
2197 ifmr->ifm_active = IFM_ETHER | IFM_FDX;
2199 ifmr->ifm_active |= IFM_10G_T;
2201 ifmr->ifm_active |= IFM_1000_T;
2203 ifmr->ifm_active |= IFM_100_TX;
2205 ifmr->ifm_active |= IFM_10_T;
2207 KASSERT(0, (
"%s: link up but speed unknown (%u)", __func__,
2222 case IFCOUNTER_IPACKETS:
2225 case IFCOUNTER_IERRORS:
2231 case IFCOUNTER_OPACKETS:
2234 case IFCOUNTER_OERRORS:
2239 case IFCOUNTER_COLLISIONS:
2242 case IFCOUNTER_IBYTES:
2245 case IFCOUNTER_OBYTES:
2248 case IFCOUNTER_IMCASTS:
2251 case IFCOUNTER_OMCASTS:
2254 case IFCOUNTER_IQDROPS:
2257 case IFCOUNTER_OQDROPS: {
2272 return (if_get_counter_default(
ifp, c));
2337 struct ifnet *
ifp = p->
ifp;
2344 KASSERT(
ifp->if_drv_flags & IFF_DRV_RUNNING,
2345 (
"%s: state mismatch (drv_flags %x, device_map %x)",
2352 else if (status == 2) {
2381 const struct timeval interval = {0, 250000};
2384 timevalsub(&tv, &interval);
2400 uint32_t cause, reset;
2465#if !defined(__LP64__) && 0
2468 pci_read_config_dword(pdev, PCI_BASE_ADDRESS_1, &v);
2469 pci_write_config_dword(pdev, PCI_BASE_ADDRESS_1, v);
2470 pci_read_config_dword(pdev, PCI_BASE_ADDRESS_3, &v);
2471 pci_write_config_dword(pdev, PCI_BASE_ADDRESS_3, v);
2472 pci_read_config_dword(pdev, PCI_BASE_ADDRESS_5, &v);
2473 pci_write_config_dword(pdev, PCI_BASE_ADDRESS_5, v);
2482 u32 aligned_offset, aligned_len, *p;
2486 aligned_offset = offset & ~3;
2487 aligned_len = (len + (offset & 3) + 3) & ~3;
2489 if (aligned_offset != offset || aligned_len != len) {
2490 buf = malloc(aligned_len, M_DEVBUF, M_WAITOK|M_ZERO);
2494 if (!err && aligned_len > 4)
2496 aligned_offset + aligned_len - 4,
2497 (
u32 *)&buf[aligned_len - 4]);
2500 memcpy(buf + (offset & 3), data, len);
2502 buf = (uint8_t *)(uintptr_t)data;
2508 for (p = (
u32 *)buf; !err && aligned_len; aligned_len -= 4, p++) {
2510 aligned_offset += 4;
2517 free(buf, M_DEVBUF);
2525 return val < 0 || (val <= hi && val >= lo);
2542 int fflag,
struct thread *td)
2548#ifdef PRIV_SUPPORTED
2549 if (priv_check(td, PRIV_DRIVER)) {
2551 printf(
"user does not have access to privileged ioctls\n");
2557 printf(
"user does not have access to privileged ioctls\n");
2569 return (EOPNOTSUPP);
2591 return (EOPNOTSUPP);
2718 fw_data = malloc(t->
len, M_DEVBUF, M_NOWAIT);
2722 error = copyin(t->
buf, fw_data, t->
len);
2736 free(fw_data, M_DEVBUF);
2744 boot_data = malloc(t->
len, M_DEVBUF, M_NOWAIT);
2748 error = copyin(t->
buf, boot_data, t->
len);
2752 free(boot_data, M_DEVBUF);
2760 return (EOPNOTSUPP);
2775 return (EOPNOTSUPP);
2807 return (EOPNOTSUPP);
2812 if (m->
mtus[0] < 81)
2818 for (i = 1; i <
NMTUS; ++i)
2829 return (EOPNOTSUPP);
2845 uint32_t len = t->
len, addr = t->
addr;
2848 return (EOPNOTSUPP);
2851 if ((addr & 0x7) || (len & 0x7))
2873 useraddr = (uint8_t *)t->
buf;
2875 unsigned int chunk = min(len,
sizeof(buf));
2880 if (copyout(buf, useraddr, chunk))
2892 return (EOPNOTSUPP);
2922 uint8_t *buf = malloc(reglen, M_DEVBUF, M_NOWAIT);
2926 if (regs->
len > reglen)
2928 else if (regs->
len < reglen)
2933 error = copyout(buf, regs->
data, reglen);
2935 free(buf, M_DEVBUF);
2968 bit, t->
mode ? bit : 0);
2985 buf = malloc(
EEPROMSIZE, M_DEVBUF, M_NOWAIT);
2996 free(buf, M_DEVBUF);
3011 uint8_t *buf = malloc(
LA_BUFSIZE, M_DEVBUF, M_NOWAIT);
3024 free(buf, M_DEVBUF);
3029 uint8_t *buf = malloc(
IOQS_BUFSIZE, M_DEVBUF, M_NOWAIT);
3042 v = (uint32_t *)buf;
3052 free(buf, M_DEVBUF);
3061 return (EOPNOTSUPP);
3081 KASSERT(sc->
filters, (
"filter table NULL\n"));
3087 bzero(p,
sizeof(*p));
3116 return (EOPNOTSUPP);
3119 if (nfilters == 0 || sc->
filters == NULL)
3130 bzero(p,
sizeof(*p));
3144 return (EOPNOTSUPP);
3147 if (nfilters == 0 || sc->
filters == NULL)
3151 for (; i < nfilters; i++) {
3156 bzero(f,
sizeof(*f));
3189 return (EOPNOTSUPP);
3200 uint32_t *p = (uint32_t *)(buf + start);
3202 for ( ; start <= end; start +=
sizeof(uint32_t))
3206#define T3_REGMAP_SIZE (3 * 1024)
3251 p = malloc(
sizeof(*p) * nfilters, M_DEVBUF, M_WAITOK | M_ZERO);
3254 p = &sc->
filters[nfilters - 1];
3273 for (i = rc = 0; i < nfilters && !rc; i++) {
3291 len =
sizeof(*wr) +
sizeof(*oreq) + 2 *
sizeof(*sreq);
3292 KASSERT(len <= MHLEN, (
"filter request too big for an mbuf"));
3297 m = m_gethdr(M_WAITOK, MT_DATA);
3298 m->m_len = m->m_pkthdr.len = len;
3299 bzero(mtod(m,
char *), len);
3331 len =
sizeof(*sreq);
3332 m = m_gethdr(M_WAITOK, MT_DATA);
3333 m->m_len = m->m_pkthdr.len = len;
3334 bzero(mtod(m,
char *), len);
3373 SLIST_FOREACH(sc, &t3_list, link) {
3385toe_capability(
struct port_info *pi,
int enable)
3398 "You must enable a cxgb interface first\n");
3402 if (isset(&sc->offload_map, pi->
port_id))
3406 rc = t3_activate_uld(sc, ULD_TOM);
3409 "You must kldload t3_tom.ko before trying "
3410 "to enable TOE on a cxgb interface.\n");
3414 KASSERT(sc->tom_softc != NULL,
3415 (
"%s: TOM activated but softc NULL", __func__));
3417 (
"%s: TOM activated but flag not set", __func__));
3420 setbit(&sc->offload_map, pi->
port_id);
3428 t3_activate_uld(sc, ULD_IWARP) == 0)
3431 if (!isset(&sc->offload_map, pi->
port_id))
3435 (
"%s: TOM never initialized?", __func__));
3436 clrbit(&sc->offload_map, pi->
port_id);
3446t3_register_uld(
struct uld_info *ui)
3451 mtx_lock(&t3_uld_list_lock);
3452 SLIST_FOREACH(u, &t3_uld_list, link) {
3453 if (u->uld_id == ui->uld_id) {
3459 SLIST_INSERT_HEAD(&t3_uld_list, ui, link);
3462 mtx_unlock(&t3_uld_list_lock);
3467t3_unregister_uld(
struct uld_info *ui)
3472 mtx_lock(&t3_uld_list_lock);
3474 SLIST_FOREACH(u, &t3_uld_list, link) {
3476 if (ui->refcount > 0) {
3481 SLIST_REMOVE(&t3_uld_list, ui, uld_info, link);
3487 mtx_unlock(&t3_uld_list_lock);
3492t3_activate_uld(
struct adapter *sc,
int id)
3495 struct uld_info *ui;
3497 mtx_lock(&t3_uld_list_lock);
3499 SLIST_FOREACH(ui, &t3_uld_list, link) {
3500 if (ui->uld_id ==
id) {
3501 rc = ui->activate(sc);
3508 mtx_unlock(&t3_uld_list_lock);
3514t3_deactivate_uld(
struct adapter *sc,
int id)
3517 struct uld_info *ui;
3519 mtx_lock(&t3_uld_list_lock);
3521 SLIST_FOREACH(ui, &t3_uld_list, link) {
3522 if (ui->uld_id ==
id) {
3523 rc = ui->deactivate(sc);
3530 mtx_unlock(&t3_uld_list_lock);
3546 uintptr_t *loc,
new;
3548 if (opcode >= NUM_CPL_HANDLERS)
3551 new = h ? (uintptr_t)h : (uintptr_t)cpl_not_handled;
3552 loc = (uintptr_t *) &sc->cpl_handler[opcode];
3553 atomic_store_rel_ptr(loc,
new);
3567 SLIST_INIT(&t3_list);
3569 mtx_init(&t3_uld_list_lock,
"T3 ULDs", 0, MTX_DEF);
3570 SLIST_INIT(&t3_uld_list);
3576 mtx_lock(&t3_uld_list_lock);
3577 if (!SLIST_EMPTY(&t3_uld_list)) {
3579 mtx_unlock(&t3_uld_list_lock);
3582 mtx_unlock(&t3_uld_list_lock);
3583 mtx_destroy(&t3_uld_list_lock);
3586 if (!SLIST_EMPTY(&t3_list)) {
3601cxgb_debugnet_init(
struct ifnet *
ifp,
int *nrxr,
int *ncl,
int *clsize)
3606 pi = if_getsoftc(
ifp);
3616cxgb_debugnet_event(
struct ifnet *
ifp,
enum debugnet_ev event)
3622 pi = if_getsoftc(
ifp);
3623 if (event == DEBUGNET_START)
3628 qs->
fl[0].
zone = zone_pack;
3629 qs->
fl[1].
zone = zone_clust;
3635cxgb_debugnet_transmit(
struct ifnet *
ifp,
struct mbuf *m)
3640 pi = if_getsoftc(
ifp);
3641 if ((if_getdrvflags(
ifp) & (IFF_DRV_RUNNING | IFF_DRV_OACTIVE)) !=
3646 return (cxgb_debugnet_encap(qs, &m));
3650cxgb_debugnet_poll(
struct ifnet *
ifp,
int count)
3656 pi = if_getsoftc(
ifp);
3657 if ((if_getdrvflags(
ifp) & IFF_DRV_RUNNING) == 0)
3661 for (i = 0; i < adap->
nqsets; i++)
3662 (
void)cxgb_debugnet_poll_rx(adap, &adap->
sge.
qs[i]);
uint8_t hw_addr[ETHER_ADDR_LEN]
void t3_intr_msi(void *data)
#define ADAPTER_LOCK_NAME_LEN
#define ADAPTER_LOCK(adap)
static __inline void t3_write_reg(adapter_t *adapter, uint32_t reg_addr, uint32_t val)
void t3_add_configured_sysctls(adapter_t *sc)
int t3_mgmt_tx(adapter_t *adap, struct mbuf *m)
#define PORT_UNLOCK(port)
static __inline uint32_t t3_read_reg(adapter_t *adapter, uint32_t reg_addr)
#define ADAPTER_LOCK_INIT(adap, name)
#define PORT_LOCK_INIT(port, name)
void t3_free_sge_resources(adapter_t *, int)
int t3_sge_reset_adapter(adapter_t *)
int t3_sge_alloc_qset(adapter_t *, uint32_t, int, int, const struct qset_params *, int, struct port_info *)
int t3_sge_init_port(struct port_info *)
int(* cpl_handler_t)(struct sge_qset *, struct rsp_desc *, struct mbuf *)
void t3_sge_stop(adapter_t *)
void t3_intr_msix(void *data)
int t3_register_cpl_handler(struct adapter *, int, cpl_handler_t)
void t3_add_attach_sysctls(adapter_t *sc)
#define ADAPTER_LOCK_ASSERT_OWNED(adap)
int t3_get_desc(const struct sge_qset *qs, unsigned int qnum, unsigned int idx, unsigned char *data)
void cxgb_tx_watchdog(void *arg)
#define ADAPTER_LOCK_ASSERT_NOTOWNED(adap)
int t3_sge_free(struct adapter *)
void cxgb_qflush(struct ifnet *ifp)
#define ADAPTER_UNLOCK(adap)
int t3_sge_alloc(struct adapter *)
static __inline struct port_info * adap2pinfo(struct adapter *adap, int idx)
#define ADAPTER_LOCK_DEINIT(adap)
#define PORT_LOCK_ASSERT_OWNED(port)
void t3_sge_start(adapter_t *)
int t3_sge_init_adapter(adapter_t *)
void t3b_intr(void *data)
#define PORT_LOCK_DEINIT(port)
static int offload_running(adapter_t *adapter)
static __inline void t3_init_rx_mode(struct t3_rx_mode *rm, struct port_info *port)
int cxgb_transmit(struct ifnet *ifp, struct mbuf *m)
int t3_set_proto_sram(adapter_t *adap, const u8 *data)
int t3_get_up_ioqs(adapter_t *adapter, u32 *size, void *data)
int t3_load_fw(adapter_t *adapter, const u8 *fw_data, unsigned int size)
void t3_set_reg_field(adapter_t *adap, unsigned int addr, u32 mask, u32 val)
int t3_check_fw_version(adapter_t *adapter)
int t3_seeprom_read(adapter_t *adapter, u32 addr, u32 *data)
int t3_get_fw_version(adapter_t *adapter, u32 *vers)
static int is_10G(const adapter_t *adap)
#define G_TP_VERSION_MAJOR(x)
int t3_get_up_la(adapter_t *adapter, u32 *stopped, u32 *index, u32 *size, void *data)
void t3_link_changed(adapter_t *adapter, int port_id)
static unsigned int core_ticks_per_usec(const adapter_t *adap)
#define XGM_REG(reg_addr, idx)
int t3_read_mc5_range(const struct mc5 *mc5, unsigned int start, unsigned int n, u32 *buf)
int t3_sge_read_cq(adapter_t *adapter, unsigned int id, u32 data[4])
int t3_mac_set_mtu(struct cmac *mac, unsigned int mtu)
int t3_seeprom_write(adapter_t *adapter, u32 addr, u32 data)
int t3_mac_set_address(struct cmac *mac, unsigned int idx, u8 addr[6])
void t3_enable_filters(adapter_t *adap)
int t3_mac_enable(struct cmac *mac, int which)
void t3_port_intr_disable(adapter_t *adapter, int idx)
static unsigned int t3_mc5_size(const struct mc5 *p)
int t3_link_start(struct cphy *phy, struct cmac *mac, struct link_config *lc)
#define G_TP_VERSION_MINOR(x)
int t3_mac_init(struct cmac *mac)
#define PCI_VENDOR_ID_CHELSIO
void t3_intr_clear(adapter_t *adapter)
int t3_mac_disable(struct cmac *mac, int which)
int t3_sge_read_rspq(adapter_t *adapter, unsigned int id, u32 data[4])
static int is_offload(const adapter_t *adap)
int t3_sge_read_fl(adapter_t *adapter, unsigned int id, u32 data[4])
static unsigned int is_pcie(const adapter_t *adap)
int t3_init_hw(adapter_t *adapter, u32 fw_params)
int t3_sge_read_ecntxt(adapter_t *adapter, unsigned int id, u32 data[4])
void t3_config_trace_filter(adapter_t *adapter, const struct trace_params *tp, int filter_index, int invert, int enable)
int t3_prep_adapter(adapter_t *adapter, const struct adapter_info *ai, int reset)
int t3_set_sched_ipg(adapter_t *adap, int sched, unsigned int ipg)
int t3_check_tpsram(adapter_t *adapter, const u8 *tp_ram, unsigned int size)
void t3_port_intr_enable(adapter_t *adapter, int idx)
#define for_each_port(adapter, iter)
void t3_intr_enable(adapter_t *adapter)
static int t3_wait_op_done(adapter_t *adapter, int reg, u32 mask, int polarity, int attempts, int delay)
int t3_cim_ctl_blk_read(adapter_t *adap, unsigned int addr, unsigned int n, unsigned int *valp)
@ phy_modtype_twinax_long
int t3_check_tpsram_version(adapter_t *adapter)
int t3_load_boot(adapter_t *adapter, u8 *fw_data, unsigned int size)
void t3_config_rss(adapter_t *adapter, unsigned int rss_config, const u8 *cpus, const u16 *rspq)
void t3_led_ready(adapter_t *adapter)
void t3_set_pace_tbl(adapter_t *adap, unsigned int *pace_vals, unsigned int start, unsigned int n)
const struct mac_stats * t3_mac_update_stats(struct cmac *mac)
int t3_config_sched(adapter_t *adap, unsigned int kbps, int sched)
int t3_mac_set_rx_mode(struct cmac *mac, struct t3_rx_mode *rm)
int t3_mc7_bd_read(struct mc7 *mc7, unsigned int start, unsigned int n, u64 *buf)
const struct adapter_info * t3_get_adapter_info(unsigned int board_id)
static unsigned int dack_ticks_to_usec(const adapter_t *adap, unsigned int ticks)
void t3_set_vlan_accel(adapter_t *adapter, unsigned int ports, int on)
int t3b2_mac_watchdog_task(struct cmac *mac)
void t3_intr_disable(adapter_t *adapter)
void t3_tp_set_offload_mode(adapter_t *adap, int enable)
int t3_seeprom_wp(adapter_t *adapter, int enable)
#define G_FW_VERSION_MINOR(x)
#define FW_MNGTOPCODE_PKTSCHED_SET
#define G_FW_VERSION_MICRO(x)
#define FW_WROPCODE_BYPASS
#define G_FW_VERSION_MAJOR(x)
#define FW_WROPCODE_FORWARD
#define CHELSIO_LOAD_BOOT
#define CHELSIO_GET_FILTER
#define CHELSIO_GET_UP_LA
#define CHELSIO_GET_QSET_NUM
#define CHELSIO_IFCONF_GETREGS
#define CHELSIO_GET_EEPROM
#define CHELSIO_GET_QSET_PARAMS
#define CHELSIO_GET_MIIREG
#define CHELSIO_SETMTUTAB
#define CHELSIO_SET_TRACE_FILTER
#define CHELSIO_CLEAR_STATS
#define CHELSIO_GET_SGE_CONTEXT
#define CHELSIO_GETMTUTAB
#define CHELSIO_GET_SGE_DESC
#define CHELSIO_GET_UP_IOQS
#define CHELSIO_SET_MIIREG
#define CHELSIO_READ_TCAM_WORD
#define CHELSIO_SET_FILTER
#define CHELSIO_DEL_FILTER
#define CHELSIO_SET_PKTSCHED
#define CHELSIO_SET_HW_SCHED
static int alloc_filters(struct adapter *)
static d_ioctl_t cxgb_extension_ioctl
static int cxgb_ifm_type(int)
static void setup_rss(adapter_t *sc)
static struct cxgb_ident * cxgb_get_ident(device_t dev)
static int update_tpsram(struct adapter *adap)
void cxgb_refresh_stats(struct port_info *pi)
static devclass_t cxgb_controller_devclass
static void check_t3b2_mac(struct adapter *sc)
static d_open_t cxgb_extension_open
static int cxgb_ioctl(struct ifnet *, unsigned long, caddr_t)
static int cxgb_setup_interrupts(adapter_t *)
static __inline char t3rev2char(struct adapter *adapter)
static int await_mgmt_replies(struct adapter *adap, unsigned long init_cnt, unsigned long n)
static void update_tpeeprom(struct adapter *adap)
static int cxgb_port_detach(device_t)
static void cxgb_update_mac_settings(struct port_info *p)
static void cxgb_async_intr(void *)
DRIVER_MODULE(cxgbc, pci, cxgb_controller_driver, cxgb_controller_devclass, cxgbc_mod_event, 0)
void t3_os_phymod_changed(struct adapter *adap, int port_id)
static void cxgb_teardown_interrupts(adapter_t *)
static int set_eeprom(struct port_info *pi, const uint8_t *data, int len, int offset)
static int cxgb_port_probe(device_t)
static int cxgb_controller_attach(device_t)
void t3_iterate(void(*func)(struct adapter *, void *), void *arg)
int t3_os_pci_save_state(struct adapter *sc)
static void cxgb_build_medialist(struct port_info *)
static void send_pktsched_cmd(struct adapter *adap, int sched, int qidx, int lo, int hi, int port)
static void mk_set_tcb_field(struct cpl_set_tcb_field *, unsigned int, unsigned int, u64, u64)
int t3_os_find_pci_capability(adapter_t *sc, int cap)
int t3_os_pci_restore_state(struct adapter *sc)
static d_close_t cxgb_extension_close
static int setup_sge_qsets(adapter_t *)
static int init_tp_parity(struct adapter *adap)
struct cxgb_ident cxgb_identifiers[]
static void set_tcb_field_ulp(struct cpl_set_tcb_field *, unsigned int, unsigned int, u64, u64)
static int cxgb_init_locked(struct port_info *)
static device_method_t cxgb_port_methods[]
static uint64_t cxgb_get_counter(struct ifnet *, ift_counter)
static const struct adapter_info * cxgb_get_adapter_info(device_t dev)
static void cxgb_free(struct adapter *)
static struct cdevsw cxgb_cdevsw
static int cxgb_controller_probe(device_t)
static SLIST_HEAD(adapter)
static int in_range(int val, int lo, int hi)
static int cxgb_controller_detach(device_t)
static void cxgb_tick(void *)
void t3_fatal_err(struct adapter *sc)
static void cxgb_get_regs(adapter_t *sc, struct ch_ifconf_regs *regs, uint8_t *buf)
static int cxgb_uninit_synchronized(struct port_info *)
void t3_os_link_changed(adapter_t *adapter, int port_id, int link_status, int speed, int duplex, int fc, int mac_was_reset)
static void touch_bars(device_t dev)
static device_method_t cxgb_controller_methods[]
static int cxgb_port_attach(device_t)
static int cxgbc_mod_event(module_t, int, void *)
void t3_os_set_hw_addr(adapter_t *adapter, int port_idx, u8 hw_addr[])
static void cxgb_init(void *)
static void check_link_status(void *, int)
MODULE_DEPEND(cxgbc, firmware, 1, 1, 1)
static int cxgb_makedev(struct port_info *pi)
static void link_check_callout(void *)
static int upgrade_fw(adapter_t *sc)
static int setup_hw_filters(struct adapter *)
static __inline void reg_block_dump(struct adapter *ap, uint8_t *buf, unsigned int start, unsigned int end)
static int cxgb_set_lro(struct port_info *p, int enabled)
static int set_filter(struct adapter *, int, const struct filter_info *)
static int cxgb_get_regs_len(void)
static int cxgb_up(struct adapter *sc)
static int cxgb_media_change(struct ifnet *)
static driver_t cxgb_port_driver
static void cxgb_tick_handler(void *, int)
void t3_os_link_intr(struct port_info *pi)
static void cxgb_media_status(struct ifnet *, struct ifmediareq *)
static int cxgb_uninit_locked(struct port_info *)
static void cxgb_down(struct adapter *sc)
static struct mtx t3_list_lock
MODULE_PNP_INFO("U16:vendor;U16:device", pci, cxgbc, cxgb_identifiers, nitems(cxgb_identifiers) - 1)
static void bind_qsets(adapter_t *sc)
static devclass_t cxgb_port_devclass
static driver_t cxgb_controller_driver
#define SUPPORTED_10000baseT_Full
#define SUPPORTED_Autoneg
#define SUPPORTED_1000baseT_Full
#define SUPPORTED_10baseT_Full
#define SUPPORTED_100baseT_Full
#define A_CPL_MAP_TBL_DATA
#define A_CPL_SWITCH_CNTRL
#define A_XGM_SERDES_STAT3
#define F_RQFEEDBACKENABLE
#define A_XGM_SERDES_STATUS0
#define A_SG_RSPQ_CREDIT_RETURN
#define S_TX_MOD_TIMER_MODE
#define A_SG_HI_DRB_HI_THRSH
#define V_RXFIFOPAUSEHWM(x)
#define A_XGM_RX_SPI4_SOP_EOP_CNT
#define A_ULPRX_PBL_ULIMIT
#define A_SG_RSPQ_FL_STATUS
#define A_SMB_GLOBAL_TIME_CFG
#define V_RRCPLCPUSIZE(x)
#define F_RXFIFO_OVERFLOW
#define A_TP_TX_MOD_QUEUE_REQ_MAP
SYSCTL_INT(_hw_cxgb, OID_AUTO, txq_mr_size, CTLFLAG_RDTUN, &cxgb_txq_buf_ring_size, 0, "size of per-queue mbuf ring")
int cxgb_use_16k_clusters
#define V_VLAN_PRI_VALID(x)
#define V_MAC_MATCH_VALID(x)
#define V_ULPTX_NFLITS(x)
#define MK_OPCODE_TID(opcode, tid)
unsigned short mtus[NMTUS]
char mdiolockbuf[ADAPTER_LOCK_NAME_LEN]
struct resource * msix_regs_res
char port_types[MAX_NPORTS+1]
int msix_irq_rid[SGE_QSETS]
struct resource * irq_res
driver_intr_t * cxgb_intr
struct port_info port[MAX_NPORTS]
struct callout sge_timer_ch
device_t portdev[MAX_NPORTS]
struct resource * regs_res
struct resource * udbs_res
struct callout cxgb_tick_ch
struct adapter_params params
struct task slow_intr_task
char reglockbuf[ADAPTER_LOCK_NAME_LEN]
char elmerlockbuf[ADAPTER_LOCK_NAME_LEN]
uint8_t rrss_map[SGE_QSETS]
struct filter_info * filters
struct resource * msix_irq_res[SGE_QSETS]
char lockbuf[ADAPTER_LOCK_NAME_LEN]
void * msix_intr_tag[SGE_QSETS]
struct ch_filter_tuple val
struct ch_filter_tuple mask
struct t3_ioq_entry * data
int(* power_down)(struct cphy *phy, int enable)
int(* mdio_read)(adapter_t *adapter, int phy_addr, int mmd_addr, int reg_addr, unsigned int *val)
int(* mdio_write)(adapter_t *adapter, int phy_addr, int mmd_addr, int reg_addr, unsigned int val)
const struct cphy_ops * ops
unsigned long rx_fifo_ovfl
unsigned long num_toggled
uint8_t hw_addr[ETHER_ADDR_LEN]
struct task link_check_task
struct timeval last_refreshed
struct link_config link_config
char lockbuf[PORT_LOCK_NAME_LEN]
struct callout link_check_ch
unsigned int coalesce_usecs
unsigned int txq_size[SGE_TXQ_PER_SET]
struct qset_params qset[SGE_QSETS]
struct sge_fl fl[SGE_RXQ_PER_SET]
struct sge_txq txq[SGE_TXQ_PER_SET]
struct callout txq_watchdog
struct sge_qset qs[SGE_QSETS]
unsigned int chan_tx_size
unsigned int chan_rx_size