Lines Matching refs:adapter

116 static void	ixgbe_init_locked(struct adapter *);
120 static void ixgbe_identify_hardware(struct adapter *);
121 static int ixgbe_allocate_pci_resources(struct adapter *);
123 static int ixgbe_allocate_msix(struct adapter *);
124 static int ixgbe_allocate_legacy(struct adapter *);
125 static int ixgbe_allocate_queues(struct adapter *);
126 static int ixgbe_setup_msix(struct adapter *);
127 static void ixgbe_free_pci_resources(struct adapter *);
129 static int ixgbe_setup_interface(device_t, struct adapter *);
130 static void ixgbe_config_link(struct adapter *);
133 static int ixgbe_setup_transmit_structures(struct adapter *);
135 static void ixgbe_initialize_transmit_units(struct adapter *);
136 static void ixgbe_free_transmit_structures(struct adapter *);
140 static int ixgbe_setup_receive_structures(struct adapter *);
142 static void ixgbe_initialize_receive_units(struct adapter *);
143 static void ixgbe_free_receive_structures(struct adapter *);
147 static void ixgbe_enable_intr(struct adapter *);
148 static void ixgbe_disable_intr(struct adapter *);
149 static void ixgbe_update_stats_counters(struct adapter *);
153 static void ixgbe_set_promisc(struct adapter *);
154 static void ixgbe_set_multi(struct adapter *);
155 static void ixgbe_update_link_status(struct adapter *);
161 static int ixgbe_dma_malloc(struct adapter *, bus_size_t,
163 static void ixgbe_dma_free(struct adapter *, struct ixgbe_dma_alloc *);
168 static void ixgbe_set_ivar(struct adapter *, u8, u8, s8);
169 static void ixgbe_configure_ivars(struct adapter *);
172 static void ixgbe_setup_vlan_hw_support(struct adapter *);
176 static void ixgbe_add_hw_stats(struct adapter *adapter);
182 static void ixgbe_enable_rx_drop(struct adapter *);
183 static void ixgbe_disable_rx_drop(struct adapter *);
186 static bool ixgbe_sfp_probe(struct adapter *);
187 static void ixgbe_setup_optics(struct adapter *);
224 "ix", ixgbe_methods, sizeof(struct adapter),
379 * adapter based on PCI vendor/device id of the adapter.
440 struct adapter *adapter;
448 /* Allocate, clear, and link in our adapter structure */
449 adapter = device_get_softc(dev);
450 adapter->dev = adapter->osdep.dev = dev;
451 hw = &adapter->hw;
454 IXGBE_CORE_LOCK_INIT(adapter, device_get_nameunit(dev));
461 adapter, 0, ixgbe_set_flowcntl, "I", "Flow Control");
476 adapter, 0, ixgbe_set_advertise, "I", "Link Speed");
480 OID_AUTO, "ts", CTLTYPE_INT | CTLFLAG_RW, adapter,
484 callout_init_mtx(&adapter->timer, &adapter->core_mtx, 0);
487 ixgbe_identify_hardware(adapter);
490 if (ixgbe_allocate_pci_resources(adapter)) {
500 adapter->num_tx_desc = DEFAULT_TXD;
502 adapter->num_tx_desc = ixgbe_txd;
511 s = (ixgbe_rxd * adapter->num_queues) * ixgbe_total_ports;
522 adapter->num_rx_desc = DEFAULT_RXD;
524 adapter->num_rx_desc = ixgbe_rxd;
527 if (ixgbe_allocate_queues(adapter)) {
533 adapter->mta = malloc(sizeof(u8) * IXGBE_ETH_LENGTH_OF_ADDRESS *
535 if (adapter->mta == NULL) {
550 adapter->sfp_probe = TRUE;
563 if (ixgbe_validate_eeprom_checksum(&adapter->hw, &csum) < 0) {
572 device_printf(dev, "This device is a pre-production adapter/"
590 ixgbe_setup_optics(adapter);
592 if ((adapter->msix > 1) && (ixgbe_enable_msix))
593 error = ixgbe_allocate_msix(adapter);
595 error = ixgbe_allocate_legacy(adapter);
600 if (ixgbe_setup_interface(dev, adapter) != 0)
604 ixgbe_update_stats_counters(adapter);
607 adapter->vlan_attach = EVENTHANDLER_REGISTER(vlan_config,
608 ixgbe_register_vlan, adapter, EVENTHANDLER_PRI_FIRST);
609 adapter->vlan_detach = EVENTHANDLER_REGISTER(vlan_unconfig,
610 ixgbe_unregister_vlan, adapter, EVENTHANDLER_PRI_FIRST);
618 adapter->fc = ixgbe_fc_full;
625 ixgbe_add_hw_stats(adapter);
628 ixgbe_netmap_attach(adapter);
633 ixgbe_free_transmit_structures(adapter);
634 ixgbe_free_receive_structures(adapter);
636 if (adapter->ifp != NULL)
637 if_free(adapter->ifp);
638 ixgbe_free_pci_resources(adapter);
639 free(adapter->mta, M_DEVBUF);
648 * This routine stops the adapter and deallocates all the resources
657 struct adapter *adapter = device_get_softc(dev);
658 struct ix_queue *que = adapter->queues;
659 struct tx_ring *txr = adapter->tx_rings;
665 if (adapter->ifp->if_vlantrunk != NULL) {
670 IXGBE_CORE_LOCK(adapter);
671 ixgbe_stop(adapter);
672 IXGBE_CORE_UNLOCK(adapter);
674 for (int i = 0; i < adapter->num_queues; i++, que++, txr++) {
685 if (adapter->tq) {
686 taskqueue_drain(adapter->tq, &adapter->link_task);
687 taskqueue_drain(adapter->tq, &adapter->mod_task);
688 taskqueue_drain(adapter->tq, &adapter->msf_task);
690 taskqueue_drain(adapter->tq, &adapter->fdir_task);
692 taskqueue_free(adapter->tq);
696 ctrl_ext = IXGBE_READ_REG(&adapter->hw, IXGBE_CTRL_EXT);
698 IXGBE_WRITE_REG(&adapter->hw, IXGBE_CTRL_EXT, ctrl_ext);
701 if (adapter->vlan_attach != NULL)
702 EVENTHANDLER_DEREGISTER(vlan_config, adapter->vlan_attach);
703 if (adapter->vlan_detach != NULL)
704 EVENTHANDLER_DEREGISTER(vlan_unconfig, adapter->vlan_detach);
706 ether_ifdetach(adapter->ifp);
707 callout_drain(&adapter->timer);
709 netmap_detach(adapter->ifp);
711 ixgbe_free_pci_resources(adapter);
713 if_free(adapter->ifp);
715 ixgbe_free_transmit_structures(adapter);
716 ixgbe_free_receive_structures(adapter);
717 free(adapter->mta, M_DEVBUF);
719 IXGBE_CORE_LOCK_DESTROY(adapter);
732 struct adapter *adapter = device_get_softc(dev);
733 IXGBE_CORE_LOCK(adapter);
734 ixgbe_stop(adapter);
735 IXGBE_CORE_UNLOCK(adapter);
755 struct adapter *adapter = txr->adapter;
761 if (!adapter->link_active)
796 struct adapter *adapter = ifp->if_softc;
797 struct tx_ring *txr = adapter->tx_rings;
816 struct adapter *adapter = ifp->if_softc;
823 i = m->m_pkthdr.flowid % adapter->num_queues;
825 i = curcpu % adapter->num_queues;
827 txr = &adapter->tx_rings[i];
828 que = &adapter->queues[i];
845 struct adapter *adapter = txr->adapter;
850 adapter->link_active == 0)
903 struct adapter *adapter = txr->adapter;
904 struct ifnet *ifp = adapter->ifp;
918 struct adapter *adapter = ifp->if_softc;
919 struct tx_ring *txr = adapter->tx_rings;
922 for (int i = 0; i < adapter->num_queues; i++, txr++) {
944 struct adapter *adapter = ifp->if_softc;
945 struct ixgbe_hw *hw = &adapter->hw;
972 ixgbe_init(adapter);
984 IXGBE_CORE_LOCK(adapter);
986 adapter->max_frame_size =
988 ixgbe_init_locked(adapter);
989 IXGBE_CORE_UNLOCK(adapter);
994 IXGBE_CORE_LOCK(adapter);
997 if ((ifp->if_flags ^ adapter->if_flags) &
999 ixgbe_set_promisc(adapter);
1002 ixgbe_init_locked(adapter);
1005 ixgbe_stop(adapter);
1006 adapter->if_flags = ifp->if_flags;
1007 IXGBE_CORE_UNLOCK(adapter);
1013 IXGBE_CORE_LOCK(adapter);
1014 ixgbe_disable_intr(adapter);
1015 ixgbe_set_multi(adapter);
1016 ixgbe_enable_intr(adapter);
1017 IXGBE_CORE_UNLOCK(adapter);
1023 error = ifmedia_ioctl(ifp, ifr, &adapter->media, command);
1044 IXGBE_CORE_LOCK(adapter);
1045 ixgbe_init_locked(adapter);
1046 IXGBE_CORE_UNLOCK(adapter);
1089 ixgbe_init_locked(struct adapter *adapter)
1091 struct ifnet *ifp = adapter->ifp;
1092 device_t dev = adapter->dev;
1093 struct ixgbe_hw *hw = &adapter->hw;
1097 mtx_assert(&adapter->core_mtx, MA_OWNED);
1101 callout_stop(&adapter->timer);
1104 ixgbe_set_rar(hw, 0, adapter->hw.mac.addr, 0, IXGBE_RAH_AV);
1107 bcopy(IF_LLADDR(adapter->ifp), hw->mac.addr,
1125 if (ixgbe_setup_transmit_structures(adapter)) {
1127 ixgbe_stop(adapter);
1132 ixgbe_initialize_transmit_units(adapter);
1135 ixgbe_set_multi(adapter);
1141 if (adapter->max_frame_size <= 2048)
1142 adapter->rx_mbuf_sz = MCLBYTES;
1143 else if (adapter->max_frame_size <= 4096)
1144 adapter->rx_mbuf_sz = MJUMPAGESIZE;
1145 else if (adapter->max_frame_size <= 9216)
1146 adapter->rx_mbuf_sz = MJUM9BYTES;
1148 adapter->rx_mbuf_sz = MJUM16BYTES;
1151 if (ixgbe_setup_receive_structures(adapter)) {
1153 ixgbe_stop(adapter);
1158 ixgbe_initialize_receive_units(adapter);
1160 gpie = IXGBE_READ_REG(&adapter->hw, IXGBE_GPIE);
1173 if (adapter->msix > 1) {
1185 mhadd |= adapter->max_frame_size << IXGBE_MHADD_MFS_SHIFT;
1191 for (int i = 0; i < adapter->num_queues; i++) {
1207 for (int i = 0; i < adapter->num_queues; i++) {
1246 struct netmap_adapter *na = NA(adapter->ifp);
1253 IXGBE_WRITE_REG(hw, IXGBE_RDT(i), adapter->num_rx_desc - 1);
1263 callout_reset(&adapter->timer, hz, ixgbe_local_timer, adapter);
1267 ixgbe_configure_ivars(adapter);
1276 ixgbe_set_ivar(adapter, 0, 0, 0);
1277 ixgbe_set_ivar(adapter, 0, 0, 1);
1287 ixgbe_init_fdir_signature_82599(&adapter->hw, fdir_pballoc);
1305 IXGBE_WRITE_REG(hw, IXGBE_EITR(adapter->linkvec), IXGBE_LINK_ITR);
1308 ixgbe_config_link(adapter);
1314 frame = adapter->max_frame_size;
1332 hw->fc.requested_mode = adapter->fc;
1340 ixgbe_setup_vlan_hw_support(adapter);
1343 ixgbe_enable_intr(adapter);
1354 struct adapter *adapter = arg;
1356 IXGBE_CORE_LOCK(adapter);
1357 ixgbe_init_locked(adapter);
1358 IXGBE_CORE_UNLOCK(adapter);
1370 ixgbe_enable_queue(struct adapter *adapter, u32 vector)
1372 struct ixgbe_hw *hw = &adapter->hw;
1390 ixgbe_disable_queue(struct adapter *adapter, u32 vector)
1392 struct ixgbe_hw *hw = &adapter->hw;
1413 struct adapter *adapter = que->adapter;
1415 struct ifnet *ifp = adapter->ifp;
1434 ixgbe_enable_queue(adapter, que->msix);
1436 ixgbe_enable_intr(adapter);
1451 struct adapter *adapter = que->adapter;
1452 struct ixgbe_hw *hw = &adapter->hw;
1453 struct ifnet *ifp = adapter->ifp;
1454 struct tx_ring *txr = adapter->tx_rings;
1463 ixgbe_enable_intr(adapter);
1483 device_printf(adapter->dev, "\nCRITICAL: FAN FAILURE!! "
1490 taskqueue_enqueue(adapter->tq, &adapter->link_task);
1495 ixgbe_enable_intr(adapter);
1509 struct adapter *adapter = que->adapter;
1510 struct ifnet *ifp = adapter->ifp;
1520 ixgbe_disable_queue(adapter, que->msix);
1547 IXGBE_WRITE_REG(&adapter->hw,
1572 if (adapter->hw.mac.type == ixgbe_mac_82598EB)
1590 ixgbe_enable_queue(adapter, que->msix);
1598 struct adapter *adapter = arg;
1599 struct ixgbe_hw *hw = &adapter->hw;
1602 ++adapter->link_irq;
1613 taskqueue_enqueue(adapter->tq, &adapter->link_task);
1615 if (adapter->hw.mac.type != ixgbe_mac_82598EB) {
1619 if (!atomic_cmpset_int(&adapter->fdir_reinit, 0, 1))
1623 taskqueue_enqueue(adapter->tq, &adapter->fdir_task);
1627 device_printf(adapter->dev, "\nCRITICAL: ECC ERROR!! "
1635 taskqueue_enqueue(adapter->tq, &adapter->msf_task);
1639 taskqueue_enqueue(adapter->tq, &adapter->mod_task);
1646 device_printf(adapter->dev, "\nCRITICAL: FAN FAILURE!! "
1654 device_printf(adapter->dev, "\nCRITICAL: OVER TEMP!! "
1656 device_printf(adapter->dev, "System shutdown required\n");
1660 IXGBE_WRITE_REG(&adapter->hw, IXGBE_EIMS, IXGBE_EIMS_OTHER);
1675 struct adapter *adapter = ifp->if_softc;
1678 IXGBE_CORE_LOCK(adapter);
1679 ixgbe_update_link_status(adapter);
1684 if (!adapter->link_active) {
1685 IXGBE_CORE_UNLOCK(adapter);
1691 switch (adapter->link_speed) {
1699 ifmr->ifm_active |= adapter->optics | IFM_FDX;
1703 IXGBE_CORE_UNLOCK(adapter);
1719 struct adapter *adapter = ifp->if_softc;
1720 struct ifmedia *ifm = &adapter->media;
1729 adapter->hw.phy.autoneg_advertised =
1735 device_printf(adapter->dev, "Only auto media type\n");
1753 struct adapter *adapter = txr->adapter;
1759 bus_dma_segment_t segs[adapter->num_segs];
1799 adapter->mbuf_defrag_failed++;
1840 if ((txr->atr_sample) && (!adapter->fdir_reinit)) {
1895 IXGBE_WRITE_REG(&adapter->hw, IXGBE_TDT(txr->me), i);
1902 ixgbe_set_promisc(struct adapter *adapter)
1905 struct ifnet *ifp = adapter->ifp;
1908 reg_rctl = IXGBE_READ_REG(&adapter->hw, IXGBE_FCTRL);
1934 IXGBE_WRITE_REG(&adapter->hw, IXGBE_FCTRL, reg_rctl);
1938 IXGBE_WRITE_REG(&adapter->hw, IXGBE_FCTRL, reg_rctl);
1942 IXGBE_WRITE_REG(&adapter->hw, IXGBE_FCTRL, reg_rctl);
1957 ixgbe_set_multi(struct adapter *adapter)
1964 struct ifnet *ifp = adapter->ifp;
1968 mta = adapter->mta;
1993 fctrl = IXGBE_READ_REG(&adapter->hw, IXGBE_FCTRL);
2004 IXGBE_WRITE_REG(&adapter->hw, IXGBE_FCTRL, fctrl);
2008 ixgbe_update_mc_addr_list(&adapter->hw,
2044 struct adapter *adapter = arg;
2045 device_t dev = adapter->dev;
2046 struct ix_queue *que = adapter->queues;
2047 struct tx_ring *txr = adapter->tx_rings;
2050 mtx_assert(&adapter->core_mtx, MA_OWNED);
2053 if (adapter->sfp_probe)
2054 if (!ixgbe_sfp_probe(adapter))
2057 ixgbe_update_link_status(adapter);
2058 ixgbe_update_stats_counters(adapter);
2064 if (IXGBE_READ_REG(&adapter->hw, IXGBE_TFCS) & IXGBE_TFCS_TXOFF)
2071 for (int i = 0; i < adapter->num_queues; i++, que++, txr++) {
2079 if (hung == adapter->num_queues)
2083 callout_reset(&adapter->timer, hz, ixgbe_local_timer, adapter);
2087 device_printf(adapter->dev, "Watchdog timeout -- resetting\n");
2089 IXGBE_READ_REG(&adapter->hw, IXGBE_TDH(txr->me)),
2090 IXGBE_READ_REG(&adapter->hw, IXGBE_TDT(txr->me)));
2094 adapter->ifp->if_drv_flags &= ~IFF_DRV_RUNNING;
2095 adapter->watchdog_events++;
2096 ixgbe_init_locked(adapter);
2105 ixgbe_update_link_status(struct adapter *adapter)
2107 struct ifnet *ifp = adapter->ifp;
2108 device_t dev = adapter->dev;
2111 if (adapter->link_up){
2112 if (adapter->link_active == FALSE) {
2115 ((adapter->link_speed == 128)? 10:1),
2117 adapter->link_active = TRUE;
2119 ixgbe_fc_enable(&adapter->hw);
2123 if (adapter->link_active == TRUE) {
2127 adapter->link_active = FALSE;
2137 * This routine disables all traffic on the adapter by issuing a
2146 struct adapter *adapter = arg;
2147 struct ixgbe_hw *hw = &adapter->hw;
2148 ifp = adapter->ifp;
2150 mtx_assert(&adapter->core_mtx, MA_OWNED);
2153 ixgbe_disable_intr(adapter);
2154 callout_stop(&adapter->timer);
2168 adapter->link_up = FALSE;
2169 ixgbe_update_link_status(adapter);
2172 ixgbe_set_rar(&adapter->hw, 0, adapter->hw.mac.addr, 0, IXGBE_RAH_AV);
2184 ixgbe_identify_hardware(struct adapter *adapter)
2186 device_t dev = adapter->dev;
2187 struct ixgbe_hw *hw = &adapter->hw;
2204 adapter->num_segs = IXGBE_82599_SCATTER;
2206 adapter->num_segs = IXGBE_82598_SCATTER;
2217 ixgbe_setup_optics(struct adapter *adapter)
2219 struct ixgbe_hw *hw = &adapter->hw;
2225 adapter->optics = IFM_10G_T;
2230 adapter->optics = IFM_1000_T;
2235 adapter->optics = IFM_1000_SX;
2241 adapter->optics = IFM_10G_LR;
2246 adapter->optics = IFM_10G_SR;
2251 adapter->optics = IFM_10G_TWINAX;
2257 adapter->optics = IFM_10G_CX4;
2262 adapter->optics = IFM_ETHER | IFM_AUTO;
2272 ixgbe_allocate_legacy(struct adapter *adapter)
2274 device_t dev = adapter->dev;
2275 struct ix_queue *que = adapter->queues;
2277 struct tx_ring *txr = adapter->tx_rings;
2282 if (adapter->msix == 1)
2286 adapter->res = bus_alloc_resource_any(dev,
2288 if (adapter->res == NULL) {
2305 device_get_nameunit(adapter->dev));
2308 TASK_INIT(&adapter->link_task, 0, ixgbe_handle_link, adapter);
2309 TASK_INIT(&adapter->mod_task, 0, ixgbe_handle_mod, adapter);
2310 TASK_INIT(&adapter->msf_task, 0, ixgbe_handle_msf, adapter);
2312 TASK_INIT(&adapter->fdir_task, 0, ixgbe_reinit_fdir, adapter);
2314 adapter->tq = taskqueue_create_fast("ixgbe_link", M_NOWAIT,
2315 taskqueue_thread_enqueue, &adapter->tq);
2316 taskqueue_start_threads(&adapter->tq, 1, PI_NET, "%s linkq",
2317 device_get_nameunit(adapter->dev));
2319 if ((error = bus_setup_intr(dev, adapter->res,
2321 que, &adapter->tag)) != 0) {
2325 taskqueue_free(adapter->tq);
2327 adapter->tq = NULL;
2331 adapter->que_mask = IXGBE_EIMS_ENABLE_MASK;
2343 ixgbe_allocate_msix(struct adapter *adapter)
2345 device_t dev = adapter->dev;
2346 struct ix_queue *que = adapter->queues;
2347 struct tx_ring *txr = adapter->tx_rings;
2350 for (int i = 0; i < adapter->num_queues; i++, vector++, que++, txr++) {
2372 adapter->que_mask |= (u64)(1 << que->msix);
2377 if (adapter->num_queues > 1)
2387 device_get_nameunit(adapter->dev));
2392 adapter->res = bus_alloc_resource_any(dev,
2394 if (!adapter->res) {
2400 error = bus_setup_intr(dev, adapter->res,
2402 ixgbe_msix_link, adapter, &adapter->tag);
2404 adapter->res = NULL;
2409 bus_describe_intr(dev, adapter->res, adapter->tag, "link");
2411 adapter->linkvec = vector;
2413 TASK_INIT(&adapter->link_task, 0, ixgbe_handle_link, adapter);
2414 TASK_INIT(&adapter->mod_task, 0, ixgbe_handle_mod, adapter);
2415 TASK_INIT(&adapter->msf_task, 0, ixgbe_handle_msf, adapter);
2417 TASK_INIT(&adapter->fdir_task, 0, ixgbe_reinit_fdir, adapter);
2419 adapter->tq = taskqueue_create_fast("ixgbe_link", M_NOWAIT,
2420 taskqueue_thread_enqueue, &adapter->tq);
2421 taskqueue_start_threads(&adapter->tq, 1, PI_NET, "%s linkq",
2422 device_get_nameunit(adapter->dev));
2431 ixgbe_setup_msix(struct adapter *adapter)
2433 device_t dev = adapter->dev;
2445 adapter->msix_mem = bus_alloc_resource_any(dev,
2447 if (adapter->msix_mem == NULL) {
2449 adapter->msix_mem = bus_alloc_resource_any(dev,
2452 if (adapter->msix_mem == NULL) {
2454 device_printf(adapter->dev,
2479 device_printf(adapter->dev,
2486 device_printf(adapter->dev,
2488 adapter->num_queues = queues;
2498 if (adapter->msix_mem != NULL) {
2500 rid, adapter->msix_mem);
2501 adapter->msix_mem = NULL;
2505 device_printf(adapter->dev,"Using an MSI interrupt\n");
2508 device_printf(adapter->dev,"Using a Legacy interrupt\n");
2514 ixgbe_allocate_pci_resources(struct adapter *adapter)
2517 device_t dev = adapter->dev;
2520 adapter->pci_mem = bus_alloc_resource_any(dev, SYS_RES_MEMORY,
2523 if (!(adapter->pci_mem)) {
2528 adapter->osdep.mem_bus_space_tag =
2529 rman_get_bustag(adapter->pci_mem);
2530 adapter->osdep.mem_bus_space_handle =
2531 rman_get_bushandle(adapter->pci_mem);
2532 adapter->hw.hw_addr = (u8 *) &adapter->osdep.mem_bus_space_handle;
2535 adapter->num_queues = 1;
2536 adapter->hw.back = &adapter->osdep;
2543 adapter->msix = ixgbe_setup_msix(adapter);
2548 ixgbe_free_pci_resources(struct adapter * adapter)
2550 struct ix_queue *que = adapter->queues;
2551 device_t dev = adapter->dev;
2554 if (adapter->hw.mac.type == ixgbe_mac_82598EB)
2564 ** We can detect this reliably by the state of the adapter
2567 if (adapter->res == NULL)
2573 for (int i = 0; i < adapter->num_queues; i++, que++) {
2585 if (adapter->linkvec) /* we are doing MSIX */
2586 rid = adapter->linkvec + 1;
2588 (adapter->msix != 0) ? (rid = 1):(rid = 0);
2590 if (adapter->tag != NULL) {
2591 bus_teardown_intr(dev, adapter->res, adapter->tag);
2592 adapter->tag = NULL;
2594 if (adapter->res != NULL)
2595 bus_release_resource(dev, SYS_RES_IRQ, rid, adapter->res);
2598 if (adapter->msix)
2601 if (adapter->msix_mem != NULL)
2603 memrid, adapter->msix_mem);
2605 if (adapter->pci_mem != NULL)
2607 PCIR_BAR(0), adapter->pci_mem);
2618 ixgbe_setup_interface(device_t dev, struct adapter *adapter)
2620 struct ixgbe_hw *hw = &adapter->hw;
2625 ifp = adapter->ifp = if_alloc(IFT_ETHER);
2637 ifp->if_softc = adapter;
2645 IFQ_SET_MAXLEN(&ifp->if_snd, adapter->num_tx_desc - 2);
2646 ifp->if_snd.ifq_drv_maxlen = adapter->num_tx_desc - 2;
2650 ether_ifattach(ifp, adapter->hw.mac.addr);
2652 adapter->max_frame_size =
2680 * Specify the media types supported by this adapter and register
2683 ifmedia_init(&adapter->media, IFM_IMASK, ixgbe_media_change,
2685 ifmedia_add(&adapter->media, IFM_ETHER | adapter->optics, 0, NULL);
2686 ifmedia_set(&adapter->media, IFM_ETHER | adapter->optics);
2688 ifmedia_add(&adapter->media,
2690 ifmedia_add(&adapter->media,
2693 ifmedia_add(&adapter->media, IFM_ETHER | IFM_AUTO, 0, NULL);
2694 ifmedia_set(&adapter->media, IFM_ETHER | IFM_AUTO);
2700 ixgbe_config_link(struct adapter *adapter)
2702 struct ixgbe_hw *hw = &adapter->hw;
2712 taskqueue_enqueue(adapter->tq, &adapter->msf_task);
2714 taskqueue_enqueue(adapter->tq, &adapter->mod_task);
2717 err = ixgbe_check_link(hw, &adapter->link_speed,
2718 &adapter->link_up, FALSE);
2729 autoneg, adapter->link_up);
2748 ixgbe_dma_malloc(struct adapter *adapter, bus_size_t size,
2751 device_t dev = adapter->dev;
2754 r = bus_dma_tag_create(bus_get_dma_tag(adapter->dev), /* parent */
2801 ixgbe_dma_free(struct adapter *adapter, struct ixgbe_dma_alloc *dma)
2818 ixgbe_allocate_queues(struct adapter *adapter)
2820 device_t dev = adapter->dev;
2828 if (!(adapter->queues =
2830 adapter->num_queues, M_DEVBUF, M_NOWAIT | M_ZERO))) {
2837 if (!(adapter->tx_rings =
2839 adapter->num_queues, M_DEVBUF, M_NOWAIT | M_ZERO))) {
2846 if (!(adapter->rx_rings =
2848 adapter->num_queues, M_DEVBUF, M_NOWAIT | M_ZERO))) {
2855 tsize = roundup2(adapter->num_tx_desc *
2863 for (int i = 0; i < adapter->num_queues; i++, txconf++) {
2865 txr = &adapter->tx_rings[i];
2866 txr->adapter = adapter;
2868 txr->num_desc = adapter->num_tx_desc;
2875 if (ixgbe_dma_malloc(adapter, tsize,
2908 rsize = roundup2(adapter->num_rx_desc *
2910 for (int i = 0; i < adapter->num_queues; i++, rxconf++) {
2911 rxr = &adapter->rx_rings[i];
2913 rxr->adapter = adapter;
2915 rxr->num_desc = adapter->num_rx_desc;
2922 if (ixgbe_dma_malloc(adapter, rsize,
2944 for (int i = 0; i < adapter->num_queues; i++) {
2945 que = &adapter->queues[i];
2946 que->adapter = adapter;
2947 que->txr = &adapter->tx_rings[i];
2948 que->rxr = &adapter->rx_rings[i];
2954 for (rxr = adapter->rx_rings; rxconf > 0; rxr++, rxconf--)
2955 ixgbe_dma_free(adapter, &rxr->rxdma);
2957 for (txr = adapter->tx_rings; txconf > 0; txr++, txconf--)
2958 ixgbe_dma_free(adapter, &txr->txdma);
2959 free(adapter->rx_rings, M_DEVBUF);
2961 free(adapter->tx_rings, M_DEVBUF);
2963 free(adapter->queues, M_DEVBUF);
2978 struct adapter *adapter = txr->adapter;
2979 device_t dev = adapter->dev;
2987 bus_get_dma_tag(adapter->dev), /* parent */
2993 adapter->num_segs, /* nsegments */
3005 adapter->num_tx_desc, M_DEVBUF, M_NOWAIT | M_ZERO))) {
3013 for (i = 0; i < adapter->num_tx_desc; i++, txbuf++) {
3024 ixgbe_free_transmit_structures(adapter);
3036 struct adapter *adapter = txr->adapter;
3040 struct netmap_adapter *na = NA(adapter->ifp);
3054 (sizeof(union ixgbe_adv_tx_desc)) * adapter->num_tx_desc);
3091 if (adapter->hw.mac.type != ixgbe_mac_82598EB)
3096 txr->tx_avail = adapter->num_tx_desc;
3109 ixgbe_setup_transmit_structures(struct adapter *adapter)
3111 struct tx_ring *txr = adapter->tx_rings;
3113 for (int i = 0; i < adapter->num_queues; i++, txr++)
3125 ixgbe_initialize_transmit_units(struct adapter *adapter)
3127 struct tx_ring *txr = adapter->tx_rings;
3128 struct ixgbe_hw *hw = &adapter->hw;
3132 for (int i = 0; i < adapter->num_queues; i++, txr++) {
3140 adapter->num_tx_desc * sizeof(union ixgbe_adv_tx_desc));
3201 ixgbe_free_transmit_structures(struct adapter *adapter)
3203 struct tx_ring *txr = adapter->tx_rings;
3205 for (int i = 0; i < adapter->num_queues; i++, txr++) {
3208 ixgbe_dma_free(adapter, &txr->txdma);
3212 free(adapter->tx_rings, M_DEVBUF);
3223 struct adapter *adapter = txr->adapter;
3233 for (i = 0; i < adapter->num_tx_desc; i++, tx_buffer++) {
3521 struct adapter *adapter = txr->adapter;
3575 que = &adapter->queues[txr->me];
3580 ixgbe_fdir_add_signature_filter_82599(&adapter->hw,
3595 struct adapter *adapter = txr->adapter;
3596 struct ifnet *ifp = adapter->ifp;
3753 struct adapter *adapter = rxr->adapter;
3772 if (adapter->max_frame_size <= (MCLBYTES - ETHER_ALIGN))
3812 IXGBE_WRITE_REG(&adapter->hw,
3828 struct adapter *adapter = rxr->adapter;
3829 device_t dev = adapter->dev;
3872 ixgbe_free_receive_structures(adapter);
3901 struct adapter *adapter = rxr->adapter;
3902 struct ixgbe_hw *hw = &adapter->hw;
3906 if ((adapter->ifp->if_capenable & IFCAP_LRO) == 0) {
3915 if (adapter->ifp->if_capenable & IFCAP_NETMAP && !ix_crcstrip)
3980 struct adapter *adapter;
3988 struct netmap_adapter *na = NA(rxr->adapter->ifp);
3992 adapter = rxr->adapter;
3993 ifp = adapter->ifp;
3994 dev = adapter->dev;
4002 rsize = roundup2(adapter->num_rx_desc *
4006 rxr->mbuf_sz = adapter->rx_mbuf_sz;
4039 M_PKTHDR, adapter->rx_mbuf_sz);
4085 lro->ifp = adapter->ifp;
4103 ixgbe_setup_receive_structures(struct adapter *adapter)
4105 struct rx_ring *rxr = adapter->rx_rings;
4108 for (j = 0; j < adapter->num_queues; j++, rxr++)
4120 rxr = &adapter->rx_rings[i];
4137 ixgbe_initialize_receive_units(struct adapter *adapter)
4139 struct rx_ring *rxr = adapter->rx_rings;
4140 struct ixgbe_hw *hw = &adapter->hw;
4141 struct ifnet *ifp = adapter->ifp;
4176 bufsz = (adapter->rx_mbuf_sz +
4179 for (int i = 0; i < adapter->num_queues; i++, rxr++) {
4187 adapter->num_rx_desc * sizeof(union ixgbe_adv_rx_desc));
4205 if (adapter->hw.mac.type != ixgbe_mac_82598EB) {
4216 if (adapter->num_queues > 1) {
4225 if (j == adapter->num_queues) j = 0;
4269 ixgbe_free_receive_structures(struct adapter *adapter)
4271 struct rx_ring *rxr = adapter->rx_rings;
4275 for (int i = 0; i < adapter->num_queues; i++, rxr++) {
4281 ixgbe_dma_free(adapter, &rxr->rxdma);
4284 free(adapter->rx_rings, M_DEVBUF);
4296 struct adapter *adapter = rxr->adapter;
4303 for (int i = 0; i < adapter->num_rx_desc; i++) {
4410 struct adapter *adapter = que->adapter;
4412 struct ifnet *ifp = adapter->ifp;
4500 if (nextp == adapter->num_rx_desc)
4680 struct adapter *adapter = ifp->if_softc;
4689 IXGBE_CORE_LOCK(adapter);
4692 adapter->shadow_vfta[index] |= (1 << bit);
4693 ++adapter->num_vlans;
4694 ixgbe_setup_vlan_hw_support(adapter);
4695 IXGBE_CORE_UNLOCK(adapter);
4706 struct adapter *adapter = ifp->if_softc;
4715 IXGBE_CORE_LOCK(adapter);
4718 adapter->shadow_vfta[index] &= ~(1 << bit);
4719 --adapter->num_vlans;
4721 ixgbe_setup_vlan_hw_support(adapter);
4722 IXGBE_CORE_UNLOCK(adapter);
4726 ixgbe_setup_vlan_hw_support(struct adapter *adapter)
4728 struct ifnet *ifp = adapter->ifp;
4729 struct ixgbe_hw *hw = &adapter->hw;
4740 if (adapter->num_vlans == 0)
4744 for (int i = 0; i < adapter->num_queues; i++) {
4745 rxr = &adapter->rx_rings[i];
4762 if (adapter->shadow_vfta[i] != 0)
4764 adapter->shadow_vfta[i]);
4778 ixgbe_enable_intr(struct adapter *adapter)
4780 struct ixgbe_hw *hw = &adapter->hw;
4781 struct ix_queue *que = adapter->queues;
4789 switch (adapter->hw.mac.type) {
4816 if (adapter->msix_mem) {
4829 for (int i = 0; i < adapter->num_queues; i++, que++)
4830 ixgbe_enable_queue(adapter, que->msix);
4838 ixgbe_disable_intr(struct adapter *adapter)
4840 if (adapter->msix_mem)
4841 IXGBE_WRITE_REG(&adapter->hw, IXGBE_EIAC, 0);
4842 if (adapter->hw.mac.type == ixgbe_mac_82598EB) {
4843 IXGBE_WRITE_REG(&adapter->hw, IXGBE_EIMC, ~0);
4845 IXGBE_WRITE_REG(&adapter->hw, IXGBE_EIMC, 0xFFFF0000);
4846 IXGBE_WRITE_REG(&adapter->hw, IXGBE_EIMC_EX(0), ~0);
4847 IXGBE_WRITE_REG(&adapter->hw, IXGBE_EIMC_EX(1), ~0);
4849 IXGBE_WRITE_FLUSH(&adapter->hw);
4875 ** the slot this adapter is plugged into.
4892 ** For the Quad port adapter we need to parse back
4894 ** slot into which this adapter is plugged. A bit more work.
4986 ixgbe_set_ivar(struct adapter *adapter, u8 entry, u8 vector, s8 type)
4988 struct ixgbe_hw *hw = &adapter->hw;
5004 IXGBE_WRITE_REG(&adapter->hw, IXGBE_IVAR(index), ivar);
5029 ixgbe_configure_ivars(struct adapter *adapter)
5031 struct ix_queue *que = adapter->queues;
5039 for (int i = 0; i < adapter->num_queues; i++, que++) {
5041 ixgbe_set_ivar(adapter, i, que->msix, 0);
5043 ixgbe_set_ivar(adapter, i, que->msix, 1);
5045 IXGBE_WRITE_REG(&adapter->hw,
5050 ixgbe_set_ivar(adapter, 1, adapter->linkvec, -1);
5057 static bool ixgbe_sfp_probe(struct adapter *adapter)
5059 struct ixgbe_hw *hw = &adapter->hw;
5060 device_t dev = adapter->dev;
5072 adapter->sfp_probe = FALSE;
5077 adapter->sfp_probe = FALSE;
5079 ixgbe_setup_optics(adapter);
5093 struct adapter *adapter = context;
5095 ixgbe_check_link(&adapter->hw,
5096 &adapter->link_speed, &adapter->link_up, 0);
5097 ixgbe_update_link_status(adapter);
5106 struct adapter *adapter = context;
5107 struct ixgbe_hw *hw = &adapter->hw;
5108 device_t dev = adapter->dev;
5123 taskqueue_enqueue(adapter->tq, &adapter->msf_task);
5134 struct adapter *adapter = context;
5135 struct ixgbe_hw *hw = &adapter->hw;
5154 struct adapter *adapter = context;
5155 struct ifnet *ifp = adapter->ifp;
5157 if (adapter->fdir_reinit != 1) /* Shouldn't happen */
5159 ixgbe_reinit_fdir_tables_82599(&adapter->hw);
5160 adapter->fdir_reinit = 0;
5162 IXGBE_WRITE_REG(&adapter->hw, IXGBE_EIMS, IXGBE_EIMS_FLOW_DIR);
5175 ixgbe_update_stats_counters(struct adapter *adapter)
5177 struct ifnet *ifp = adapter->ifp;
5178 struct ixgbe_hw *hw = &adapter->hw;
5182 adapter->stats.crcerrs += IXGBE_READ_REG(hw, IXGBE_CRCERRS);
5183 adapter->stats.illerrc += IXGBE_READ_REG(hw, IXGBE_ILLERRC);
5184 adapter->stats.errbc += IXGBE_READ_REG(hw, IXGBE_ERRBC);
5185 adapter->stats.mspdc += IXGBE_READ_REG(hw, IXGBE_MSPDC);
5198 adapter->stats.mpc[i] += mp;
5200 total_missed_rx += adapter->stats.mpc[i];
5202 adapter->stats.rnbc[i] +=
5204 adapter->stats.qbtc[i] +=
5206 adapter->stats.qbrc[i] +=
5208 adapter->stats.pxonrxc[i] +=
5211 adapter->stats.pxonrxc[i] +=
5213 adapter->stats.pxontxc[i] +=
5215 adapter->stats.pxofftxc[i] +=
5217 adapter->stats.pxoffrxc[i] +=
5219 adapter->stats.pxon2offc[i] +=
5223 adapter->stats.qprc[i] += IXGBE_READ_REG(hw, IXGBE_QPRC(i));
5224 adapter->stats.qptc[i] += IXGBE_READ_REG(hw, IXGBE_QPTC(i));
5225 adapter->stats.qprdc[i] += IXGBE_READ_REG(hw, IXGBE_QPRDC(i));
5227 adapter->stats.mlfc += IXGBE_READ_REG(hw, IXGBE_MLFC);
5228 adapter->stats.mrfc += IXGBE_READ_REG(hw, IXGBE_MRFC);
5229 adapter->stats.rlec += IXGBE_READ_REG(hw, IXGBE_RLEC);
5232 adapter->stats.gprc += IXGBE_READ_REG(hw, IXGBE_GPRC);
5233 adapter->stats.gprc -= missed_rx;
5236 adapter->stats.gorc += IXGBE_READ_REG(hw, IXGBE_GORCL) +
5238 adapter->stats.gotc += IXGBE_READ_REG(hw, IXGBE_GOTCL) +
5240 adapter->stats.tor += IXGBE_READ_REG(hw, IXGBE_TORL) +
5242 adapter->stats.lxonrxc += IXGBE_READ_REG(hw, IXGBE_LXONRXCNT);
5243 adapter->stats.lxoffrxc += IXGBE_READ_REG(hw, IXGBE_LXOFFRXCNT);
5245 adapter->stats.lxonrxc += IXGBE_READ_REG(hw, IXGBE_LXONRXC);
5246 adapter->stats.lxoffrxc += IXGBE_READ_REG(hw, IXGBE_LXOFFRXC);
5248 adapter->stats.gorc += IXGBE_READ_REG(hw, IXGBE_GORCH);
5249 adapter->stats.gotc += IXGBE_READ_REG(hw, IXGBE_GOTCH);
5250 adapter->stats.tor += IXGBE_READ_REG(hw, IXGBE_TORH);
5258 adapter->stats.bprc += bprc;
5259 adapter->stats.mprc += IXGBE_READ_REG(hw, IXGBE_MPRC);
5261 adapter->stats.mprc -= bprc;
5263 adapter->stats.prc64 += IXGBE_READ_REG(hw, IXGBE_PRC64);
5264 adapter->stats.prc127 += IXGBE_READ_REG(hw, IXGBE_PRC127);
5265 adapter->stats.prc255 += IXGBE_READ_REG(hw, IXGBE_PRC255);
5266 adapter->stats.prc511 += IXGBE_READ_REG(hw, IXGBE_PRC511);
5267 adapter->stats.prc1023 += IXGBE_READ_REG(hw, IXGBE_PRC1023);
5268 adapter->stats.prc1522 += IXGBE_READ_REG(hw, IXGBE_PRC1522);
5271 adapter->stats.lxontxc += lxon;
5273 adapter->stats.lxofftxc += lxoff;
5276 adapter->stats.gptc += IXGBE_READ_REG(hw, IXGBE_GPTC);
5277 adapter->stats.mptc += IXGBE_READ_REG(hw, IXGBE_MPTC);
5278 adapter->stats.ptc64 += IXGBE_READ_REG(hw, IXGBE_PTC64);
5279 adapter->stats.gptc -= total;
5280 adapter->stats.mptc -= total;
5281 adapter->stats.ptc64 -= total;
5282 adapter->stats.gotc -= total * ETHER_MIN_LEN;
5284 adapter->stats.ruc += IXGBE_READ_REG(hw, IXGBE_RUC);
5285 adapter->stats.rfc += IXGBE_READ_REG(hw, IXGBE_RFC);
5286 adapter->stats.roc += IXGBE_READ_REG(hw, IXGBE_ROC);
5287 adapter->stats.rjc += IXGBE_READ_REG(hw, IXGBE_RJC);
5288 adapter->stats.mngprc += IXGBE_READ_REG(hw, IXGBE_MNGPRC);
5289 adapter->stats.mngpdc += IXGBE_READ_REG(hw, IXGBE_MNGPDC);
5290 adapter->stats.mngptc += IXGBE_READ_REG(hw, IXGBE_MNGPTC);
5291 adapter->stats.tpr += IXGBE_READ_REG(hw, IXGBE_TPR);
5292 adapter->stats.tpt += IXGBE_READ_REG(hw, IXGBE_TPT);
5293 adapter->stats.ptc127 += IXGBE_READ_REG(hw, IXGBE_PTC127);
5294 adapter->stats.ptc255 += IXGBE_READ_REG(hw, IXGBE_PTC255);
5295 adapter->stats.ptc511 += IXGBE_READ_REG(hw, IXGBE_PTC511);
5296 adapter->stats.ptc1023 += IXGBE_READ_REG(hw, IXGBE_PTC1023);
5297 adapter->stats.ptc1522 += IXGBE_READ_REG(hw, IXGBE_PTC1522);
5298 adapter->stats.bptc += IXGBE_READ_REG(hw, IXGBE_BPTC);
5299 adapter->stats.xec += IXGBE_READ_REG(hw, IXGBE_XEC);
5300 adapter->stats.fccrc += IXGBE_READ_REG(hw, IXGBE_FCCRC);
5301 adapter->stats.fclast += IXGBE_READ_REG(hw, IXGBE_FCLAST);
5304 adapter->stats.fcoerpdc += IXGBE_READ_REG(hw, IXGBE_FCOERPDC);
5305 adapter->stats.fcoeprc += IXGBE_READ_REG(hw, IXGBE_FCOEPRC);
5306 adapter->stats.fcoeptc += IXGBE_READ_REG(hw, IXGBE_FCOEPTC);
5307 adapter->stats.fcoedwrc += IXGBE_READ_REG(hw, IXGBE_FCOEDWRC);
5308 adapter->stats.fcoedwtc += IXGBE_READ_REG(hw, IXGBE_FCOEDWTC);
5312 ifp->if_ipackets = adapter->stats.gprc;
5313 ifp->if_opackets = adapter->stats.gptc;
5314 ifp->if_ibytes = adapter->stats.gorc;
5315 ifp->if_obytes = adapter->stats.gotc;
5316 ifp->if_imcasts = adapter->stats.mprc;
5317 ifp->if_omcasts = adapter->stats.mptc;
5322 ifp->if_ierrors = adapter->stats.crcerrs + adapter->stats.rlec;
5336 unsigned val = IXGBE_READ_REG(&txr->adapter->hw, IXGBE_TDH(txr->me));
5354 unsigned val = IXGBE_READ_REG(&txr->adapter->hw, IXGBE_TDT(txr->me));
5372 unsigned val = IXGBE_READ_REG(&rxr->adapter->hw, IXGBE_RDH(rxr->me));
5390 unsigned val = IXGBE_READ_REG(&rxr->adapter->hw, IXGBE_RDT(rxr->me));
5404 reg = IXGBE_READ_REG(&que->adapter->hw, IXGBE_EITR(que->msix));
5421 IXGBE_WRITE_REG(&que->adapter->hw, IXGBE_EITR(que->msix), reg);
5429 ixgbe_add_hw_stats(struct adapter *adapter)
5432 device_t dev = adapter->dev;
5434 struct tx_ring *txr = adapter->tx_rings;
5435 struct rx_ring *rxr = adapter->rx_rings;
5440 struct ixgbe_hw_stats *stats = &adapter->stats;
5450 CTLFLAG_RD, &adapter->dropped_pkts,
5453 CTLFLAG_RD, &adapter->mbuf_defrag_failed,
5456 CTLFLAG_RD, &adapter->watchdog_events,
5459 CTLFLAG_RD, &adapter->link_irq,
5462 for (int i = 0; i < adapter->num_queues; i++, txr++) {
5469 CTLTYPE_UINT | CTLFLAG_RW, &adapter->queues[i],
5470 sizeof(&adapter->queues[i]),
5474 CTLFLAG_RD, &(adapter->queues[i].irqs),
5498 for (int i = 0; i < adapter->num_queues; i++, rxr++) {
5688 struct adapter *adapter = (struct adapter *) arg1;
5690 last = adapter->fc;
5691 error = sysctl_handle_int(oidp, &adapter->fc, 0, req);
5696 if (adapter->fc == last)
5699 switch (adapter->fc) {
5703 adapter->hw.fc.requested_mode = adapter->fc;
5704 if (adapter->num_queues > 1)
5705 ixgbe_disable_rx_drop(adapter);
5708 adapter->hw.fc.requested_mode = ixgbe_fc_none;
5709 if (adapter->num_queues > 1)
5710 ixgbe_enable_rx_drop(adapter);
5713 adapter->fc = last;
5717 adapter->hw.fc.disable_fc_autoneg = TRUE;
5718 ixgbe_fc_enable(&adapter->hw);
5732 struct adapter *adapter;
5737 adapter = (struct adapter *) arg1;
5738 dev = adapter->dev;
5739 hw = &adapter->hw;
5740 last = adapter->advertise;
5742 error = sysctl_handle_int(oidp, &adapter->advertise, 0, req);
5746 if (adapter->advertise == last) /* no change */
5753 if ((adapter->advertise == 2) && (hw->mac.type != ixgbe_mac_X540)) {
5758 if (adapter->advertise == 1)
5760 else if (adapter->advertise == 2)
5762 else if (adapter->advertise == 3)
5766 adapter->advertise = last;
5785 struct adapter *adapter = (struct adapter *) arg1;
5786 struct ixgbe_hw *hw = &adapter->hw;
5813 ixgbe_enable_rx_drop(struct adapter *adapter)
5815 struct ixgbe_hw *hw = &adapter->hw;
5817 for (int i = 0; i < adapter->num_queues; i++) {
5825 ixgbe_disable_rx_drop(struct adapter *adapter)
5827 struct ixgbe_hw *hw = &adapter->hw;
5829 for (int i = 0; i < adapter->num_queues; i++) {