Author: erj
Date: Thu Apr 30 22:53:27 2015
New Revision: 282289
URL: https://svnweb.freebsd.org/changeset/base/282289

Log:
  Add support for certain Intel X550 devices.
  
  These include standalone X550 adapters, X552 10GbE backplane, and
  X552/X557-AT 10GBASE-T; with the latter two being integrated into Xeon D SoCs.
  
  As well, this bumps the ixgbe version number to 2.8.3, and includes updates
  to shared code for support for the new devices.
  
  Differential Revision: D2414
  Reviewed by:  gnn, adrian
  Approved by:  jfv (mentor), gnn (mentor)

Added:
  head/sys/dev/ixgbe/ixgbe_x550.c   (contents, props changed)
  head/sys/dev/ixgbe/ixgbe_x550.h   (contents, props changed)
Modified:
  head/sys/dev/ixgbe/if_ix.c
  head/sys/dev/ixgbe/if_ixv.c
  head/sys/dev/ixgbe/ix_txrx.c
  head/sys/dev/ixgbe/ixgbe.h
  head/sys/dev/ixgbe/ixgbe_82598.c
  head/sys/dev/ixgbe/ixgbe_82598.h
  head/sys/dev/ixgbe/ixgbe_82599.c
  head/sys/dev/ixgbe/ixgbe_82599.h
  head/sys/dev/ixgbe/ixgbe_api.c
  head/sys/dev/ixgbe/ixgbe_api.h
  head/sys/dev/ixgbe/ixgbe_common.c
  head/sys/dev/ixgbe/ixgbe_common.h
  head/sys/dev/ixgbe/ixgbe_dcb.c
  head/sys/dev/ixgbe/ixgbe_dcb.h
  head/sys/dev/ixgbe/ixgbe_dcb_82598.c
  head/sys/dev/ixgbe/ixgbe_dcb_82598.h
  head/sys/dev/ixgbe/ixgbe_dcb_82599.c
  head/sys/dev/ixgbe/ixgbe_dcb_82599.h
  head/sys/dev/ixgbe/ixgbe_mbx.c
  head/sys/dev/ixgbe/ixgbe_mbx.h
  head/sys/dev/ixgbe/ixgbe_osdep.h
  head/sys/dev/ixgbe/ixgbe_phy.c
  head/sys/dev/ixgbe/ixgbe_phy.h
  head/sys/dev/ixgbe/ixgbe_type.h
  head/sys/dev/ixgbe/ixgbe_vf.c
  head/sys/dev/ixgbe/ixgbe_vf.h
  head/sys/dev/ixgbe/ixgbe_x540.c
  head/sys/dev/ixgbe/ixgbe_x540.h

Modified: head/sys/dev/ixgbe/if_ix.c
==============================================================================
--- head/sys/dev/ixgbe/if_ix.c  Thu Apr 30 22:51:15 2015        (r282288)
+++ head/sys/dev/ixgbe/if_ix.c  Thu Apr 30 22:53:27 2015        (r282289)
@@ -54,7 +54,7 @@ int             ixgbe_display_debug_stat
 /*********************************************************************
  *  Driver version
  *********************************************************************/
-char ixgbe_driver_version[] = "2.7.4";
+char ixgbe_driver_version[] = "2.8.3";
 
 /*********************************************************************
  *  PCI Device ID Table
@@ -117,6 +117,8 @@ static int      ixgbe_probe(device_t);
 static int      ixgbe_attach(device_t);
 static int      ixgbe_detach(device_t);
 static int      ixgbe_shutdown(device_t);
+static int     ixgbe_suspend(device_t);
+static int     ixgbe_resume(device_t);
 static int      ixgbe_ioctl(struct ifnet *, u_long, caddr_t);
 static void    ixgbe_init(void *);
 static void    ixgbe_init_locked(struct adapter *);
@@ -136,7 +138,12 @@ static int ixgbe_setup_msix(struct adapt
 static void    ixgbe_free_pci_resources(struct adapter *);
 static void    ixgbe_local_timer(void *);
 static int     ixgbe_setup_interface(device_t, struct adapter *);
+static void    ixgbe_config_dmac(struct adapter *);
+static void    ixgbe_config_delay_values(struct adapter *);
 static void    ixgbe_config_link(struct adapter *);
+static void    ixgbe_check_eee_support(struct adapter *);
+static void    ixgbe_check_wol_support(struct adapter *);
+static int     ixgbe_setup_low_power_mode(struct adapter *);
 static void    ixgbe_rearm_queues(struct adapter *, u64);
 
 static void     ixgbe_initialize_transmit_units(struct adapter *);
@@ -150,9 +157,6 @@ static void     ixgbe_update_stats_count
 static void     ixgbe_set_promisc(struct adapter *);
 static void     ixgbe_set_multi(struct adapter *);
 static void     ixgbe_update_link_status(struct adapter *);
-static int     ixgbe_set_flowcntl(SYSCTL_HANDLER_ARGS);
-static int     ixgbe_set_advertise(SYSCTL_HANDLER_ARGS);
-static int     ixgbe_set_thermal_test(SYSCTL_HANDLER_ARGS);
 static void    ixgbe_set_ivar(struct adapter *, u8, u8, s8);
 static void    ixgbe_configure_ivars(struct adapter *);
 static u8 *    ixgbe_mc_array_itr(struct ixgbe_hw *, u8 **, u32 *);
@@ -161,7 +165,22 @@ static void        ixgbe_setup_vlan_hw_support(
 static void    ixgbe_register_vlan(void *, struct ifnet *, u16);
 static void    ixgbe_unregister_vlan(void *, struct ifnet *, u16);
 
-static void     ixgbe_add_hw_stats(struct adapter *adapter);
+static void    ixgbe_add_device_sysctls(struct adapter *);
+static void     ixgbe_add_hw_stats(struct adapter *);
+
+/* Sysctl handlers */
+static int     ixgbe_set_flowcntl(SYSCTL_HANDLER_ARGS);
+static int     ixgbe_set_advertise(SYSCTL_HANDLER_ARGS);
+static int     ixgbe_sysctl_thermal_test(SYSCTL_HANDLER_ARGS);
+static int     ixgbe_sysctl_dmac(SYSCTL_HANDLER_ARGS);
+static int     ixgbe_sysctl_phy_temp(SYSCTL_HANDLER_ARGS);
+static int     ixgbe_sysctl_phy_overtemp_occurred(SYSCTL_HANDLER_ARGS);
+static int     ixgbe_sysctl_wol_enable(SYSCTL_HANDLER_ARGS);
+static int     ixgbe_sysctl_wufc(SYSCTL_HANDLER_ARGS);
+static int     ixgbe_sysctl_eee_enable(SYSCTL_HANDLER_ARGS);
+static int     ixgbe_sysctl_eee_negotiated(SYSCTL_HANDLER_ARGS);
+static int     ixgbe_sysctl_eee_rx_lpi_status(SYSCTL_HANDLER_ARGS);
+static int     ixgbe_sysctl_eee_tx_lpi_status(SYSCTL_HANDLER_ARGS);
 
 /* Support for pluggable optic modules */
 static bool    ixgbe_sfp_probe(struct adapter *);
@@ -179,6 +198,7 @@ static void ixgbe_handle_que(void *, int
 static void    ixgbe_handle_link(void *, int);
 static void    ixgbe_handle_msf(void *, int);
 static void    ixgbe_handle_mod(void *, int);
+static void    ixgbe_handle_phy(void *, int);
 
 #ifdef IXGBE_FDIR
 static void    ixgbe_reinit_fdir(void *, int);
@@ -198,6 +218,8 @@ static device_method_t ix_methods[] = {
        DEVMETHOD(device_attach, ixgbe_attach),
        DEVMETHOD(device_detach, ixgbe_detach),
        DEVMETHOD(device_shutdown, ixgbe_shutdown),
+       DEVMETHOD(device_suspend, ixgbe_suspend),
+       DEVMETHOD(device_resume, ixgbe_resume),
        DEVMETHOD_END
 };
 
@@ -404,32 +426,6 @@ ixgbe_attach(device_t dev)
        /* Core Lock Init*/
        IXGBE_CORE_LOCK_INIT(adapter, device_get_nameunit(dev));
 
-       /* SYSCTL APIs */
-       SYSCTL_ADD_PROC(device_get_sysctl_ctx(dev),
-                       SYSCTL_CHILDREN(device_get_sysctl_tree(dev)),
-                       OID_AUTO, "fc", CTLTYPE_INT | CTLFLAG_RW,
-                       adapter, 0, ixgbe_set_flowcntl, "I", 
IXGBE_SYSCTL_DESC_SET_FC);
-
-        SYSCTL_ADD_INT(device_get_sysctl_ctx(dev),
-                       SYSCTL_CHILDREN(device_get_sysctl_tree(dev)),
-                       OID_AUTO, "enable_aim", CTLFLAG_RW,
-                       &ixgbe_enable_aim, 1, "Interrupt Moderation");
-
-       /*
-       ** Allow a kind of speed control by forcing the autoneg
-       ** advertised speed list to only a certain value, this
-       ** supports 1G on 82599 devices, and 100Mb on x540.
-       */
-       SYSCTL_ADD_PROC(device_get_sysctl_ctx(dev),
-                       SYSCTL_CHILDREN(device_get_sysctl_tree(dev)),
-                       OID_AUTO, "advertise_speed", CTLTYPE_INT | CTLFLAG_RW,
-                       adapter, 0, ixgbe_set_advertise, "I", 
IXGBE_SYSCTL_DESC_ADV_SPEED);
-
-       SYSCTL_ADD_PROC(device_get_sysctl_ctx(dev),
-                       SYSCTL_CHILDREN(device_get_sysctl_tree(dev)),
-                       OID_AUTO, "ts", CTLTYPE_INT | CTLFLAG_RW, adapter,
-                       0, ixgbe_set_thermal_test, "I", "Thermal Test");
-
        /* Set up the timer callout */
        callout_init_mtx(&adapter->timer, &adapter->core_mtx, 0);
 
@@ -559,22 +555,26 @@ ixgbe_attach(device_t dev)
        adapter->vlan_detach = EVENTHANDLER_REGISTER(vlan_unconfig,
            ixgbe_unregister_vlan, adapter, EVENTHANDLER_PRI_FIRST);
 
-        /*
-       ** Check PCIE slot type/speed/width
-       */
+        /* Check PCIE slot type/speed/width */
        ixgbe_get_slot_info(hw);
 
 
        /* Set an initial default flow control value */
        adapter->fc = ixgbe_fc_full;
 
+       /* Check for certain supported features */
+       ixgbe_check_wol_support(adapter);
+       ixgbe_check_eee_support(adapter);
+
+       /* Add sysctls */
+       ixgbe_add_device_sysctls(adapter);
+       ixgbe_add_hw_stats(adapter);
+
        /* let hardware know driver is loaded */
        ctrl_ext = IXGBE_READ_REG(hw, IXGBE_CTRL_EXT);
        ctrl_ext |= IXGBE_CTRL_EXT_DRV_LOAD;
        IXGBE_WRITE_REG(hw, IXGBE_CTRL_EXT, ctrl_ext);
 
-       ixgbe_add_hw_stats(adapter);
-
 #ifdef DEV_NETMAP
        ixgbe_netmap_attach(adapter);
 #endif /* DEV_NETMAP */
@@ -618,8 +618,9 @@ ixgbe_detach(device_t dev)
                return (EBUSY);
        }
 
+       /* Stop the adapter */
        IXGBE_CORE_LOCK(adapter);
-       ixgbe_stop(adapter);
+       ixgbe_setup_low_power_mode(adapter);
        IXGBE_CORE_UNLOCK(adapter);
 
        for (int i = 0; i < adapter->num_queues; i++, que++, txr++) {
@@ -637,6 +638,7 @@ ixgbe_detach(device_t dev)
                taskqueue_drain(adapter->tq, &adapter->link_task);
                taskqueue_drain(adapter->tq, &adapter->mod_task);
                taskqueue_drain(adapter->tq, &adapter->msf_task);
+               taskqueue_drain(adapter->tq, &adapter->phy_task);
 #ifdef IXGBE_FDIR
                taskqueue_drain(adapter->tq, &adapter->fdir_task);
 #endif
@@ -681,9 +683,77 @@ static int
 ixgbe_shutdown(device_t dev)
 {
        struct adapter *adapter = device_get_softc(dev);
+       int error = 0;
+
+       INIT_DEBUGOUT("ixgbe_shutdown: begin");
+
+       IXGBE_CORE_LOCK(adapter);
+       error = ixgbe_setup_low_power_mode(adapter);
+       IXGBE_CORE_UNLOCK(adapter);
+
+       return (error);
+}
+
+/**
+ * Methods for going from:
+ * D0 -> D3: ixgbe_suspend
+ * D3 -> D0: ixgbe_resume
+ */
+static int
+ixgbe_suspend(device_t dev)
+{
+       struct adapter *adapter = device_get_softc(dev);
+       int error = 0;
+
+       INIT_DEBUGOUT("ixgbe_suspend: begin");
+
+       IXGBE_CORE_LOCK(adapter);
+
+       error = ixgbe_setup_low_power_mode(adapter);
+
+       /* Save state and power down */
+       pci_save_state(dev);
+       pci_set_powerstate(dev, PCI_POWERSTATE_D3);
+
+       IXGBE_CORE_UNLOCK(adapter);
+
+       return (error);
+}
+
+static int
+ixgbe_resume(device_t dev)
+{
+       struct adapter *adapter = device_get_softc(dev);
+       struct ifnet *ifp = adapter->ifp;
+       struct ixgbe_hw *hw = &adapter->hw;
+       u32 wus;
+
+       INIT_DEBUGOUT("ixgbe_resume: begin");
+
        IXGBE_CORE_LOCK(adapter);
-       ixgbe_stop(adapter);
+
+       pci_set_powerstate(dev, PCI_POWERSTATE_D0);
+       pci_restore_state(dev);
+
+       /* Read & clear WUS register */
+       wus = IXGBE_READ_REG(hw, IXGBE_WUS);
+       if (wus)
+               device_printf(dev, "Woken up by (WUS): %#010x\n",
+                   IXGBE_READ_REG(hw, IXGBE_WUS));
+       IXGBE_WRITE_REG(hw, IXGBE_WUS, 0xffffffff);
+       /* And clear WUFC until next low-power transition */
+       IXGBE_WRITE_REG(hw, IXGBE_WUFC, 0);
+
+       /*
+        * Required after D3->D0 transition;
+        * will re-advertise all previous advertised speeds
+        */
+       if (ifp->if_flags & IFF_UP)
+               ixgbe_init_locked(adapter);
+
        IXGBE_CORE_UNLOCK(adapter);
+
+       INIT_DEBUGOUT("ixgbe_resume: end");
        return (0);
 }
 
@@ -736,13 +806,13 @@ ixgbe_ioctl(struct ifnet * ifp, u_long c
                break;
        case SIOCSIFMTU:
                IOCTL_DEBUGOUT("ioctl: SIOCSIFMTU (Set Interface MTU)");
-               if (ifr->ifr_mtu > IXGBE_MAX_FRAME_SIZE - ETHER_HDR_LEN) {
+               if (ifr->ifr_mtu > IXGBE_MAX_MTU) {
                        error = EINVAL;
                } else {
                        IXGBE_CORE_LOCK(adapter);
                        ifp->if_mtu = ifr->ifr_mtu;
                        adapter->max_frame_size =
-                               ifp->if_mtu + ETHER_HDR_LEN + ETHER_CRC_LEN;
+                               ifp->if_mtu + IXGBE_MTU_HDR;
                        ixgbe_init_locked(adapter);
                        IXGBE_CORE_UNLOCK(adapter);
                }
@@ -891,7 +961,7 @@ ixgbe_init_locked(struct adapter *adapte
 
        /* Prepare transmit descriptors and buffers */
        if (ixgbe_setup_transmit_structures(adapter)) {
-               device_printf(dev,"Could not setup transmit structures\n");
+               device_printf(dev, "Could not setup transmit structures\n");
                ixgbe_stop(adapter);
                return;
        }
@@ -917,7 +987,7 @@ ixgbe_init_locked(struct adapter *adapte
 
        /* Prepare receive descriptors and buffers */
        if (ixgbe_setup_receive_structures(adapter)) {
-               device_printf(dev,"Could not setup receive structures\n");
+               device_printf(dev, "Could not setup receive structures\n");
                ixgbe_stop(adapter);
                return;
        }
@@ -932,11 +1002,16 @@ ixgbe_init_locked(struct adapter *adapte
 
        /* Add for Module detection */
        if (hw->mac.type == ixgbe_mac_82599EB)
-               gpie |= IXGBE_SDP2_GPIEN_BY_MAC(hw);
+               gpie |= IXGBE_SDP2_GPIEN;
 
-       /* Thermal Failure Detection */
-       if (hw->mac.type == ixgbe_mac_X540)
-               gpie |= IXGBE_SDP0_GPIEN_BY_MAC(hw);
+       /*
+        * Thermal Failure Detection (X540)
+        * Link Detection (X552)
+        */
+       if (hw->mac.type == ixgbe_mac_X540 ||
+           hw->device_id == IXGBE_DEV_ID_X550EM_X_SFP ||
+           hw->device_id == IXGBE_DEV_ID_X550EM_X_10G_T)
+               gpie |= IXGBE_SDP0_GPIEN_X540;
 
        if (adapter->msix > 1) {
                /* Enable Enhanced MSIX mode */
@@ -948,6 +1023,7 @@ ixgbe_init_locked(struct adapter *adapte
 
        /* Set MTU size */
        if (ifp->if_mtu > ETHERMTU) {
+               /* aka IXGBE_MAXFRS on 82599 and newer */
                mhadd = IXGBE_READ_REG(hw, IXGBE_MHADD);
                mhadd &= ~IXGBE_MHADD_MFS_MASK;
                mhadd |= adapter->max_frame_size << IXGBE_MHADD_MFS_SHIFT;
@@ -955,7 +1031,6 @@ ixgbe_init_locked(struct adapter *adapte
        }
        
        /* Now enable all the queues */
-
        for (int i = 0; i < adapter->num_queues; i++) {
                txdctl = IXGBE_READ_REG(hw, IXGBE_TXDCTL(i));
                txdctl |= IXGBE_TXDCTL_ENABLE;
@@ -1072,55 +1147,25 @@ ixgbe_init_locked(struct adapter *adapte
        /* Set moderation on the Link interrupt */
        IXGBE_WRITE_REG(hw, IXGBE_EITR(adapter->vector), IXGBE_LINK_ITR);
 
+       /* Configure Energy Efficient Ethernet for supported devices */
+       if (adapter->eee_support)
+               ixgbe_setup_eee(hw, adapter->eee_enabled);
+
        /* Config/Enable Link */
        ixgbe_config_link(adapter);
 
        /* Hardware Packet Buffer & Flow Control setup */
-       {
-               u32 rxpb, frame, size, tmp;
-
-               frame = adapter->max_frame_size;
-
-               /* Calculate High Water */
-               switch (hw->mac.type) {
-               case ixgbe_mac_X540:
-               case ixgbe_mac_X550:
-               case ixgbe_mac_X550EM_a:
-               case ixgbe_mac_X550EM_x:
-                       tmp = IXGBE_DV_X540(frame, frame);
-                       break;
-               default:
-                       tmp = IXGBE_DV(frame, frame);
-                       break;
-               }
-               size = IXGBE_BT2KB(tmp);
-               rxpb = IXGBE_READ_REG(hw, IXGBE_RXPBSIZE(0)) >> 10;
-               hw->fc.high_water[0] = rxpb - size;
+       ixgbe_config_delay_values(adapter);
 
-               /* Now calculate Low Water */
-               switch (hw->mac.type) {
-               case ixgbe_mac_X540:
-               case ixgbe_mac_X550:
-               case ixgbe_mac_X550EM_a:
-               case ixgbe_mac_X550EM_x:
-                       tmp = IXGBE_LOW_DV_X540(frame);
-                       break;
-               default:
-                       tmp = IXGBE_LOW_DV(frame);
-                       break;
-               }
-               hw->fc.low_water[0] = IXGBE_BT2KB(tmp);
-               
-               hw->fc.requested_mode = adapter->fc;
-               hw->fc.pause_time = IXGBE_FC_PAUSE;
-               hw->fc.send_xon = TRUE;
-       }
        /* Initialize the FC settings */
        ixgbe_start_hw(hw);
 
        /* Set up VLAN support and filter */
        ixgbe_setup_vlan_hw_support(adapter);
 
+       /* Setup DMA Coalescing */
+       ixgbe_config_dmac(adapter);
+
        /* And now turn on interrupts */
        ixgbe_enable_intr(adapter);
 
@@ -1141,6 +1186,46 @@ ixgbe_init(void *arg)
        return;
 }
 
+static void
+ixgbe_config_delay_values(struct adapter *adapter)
+{
+       struct ixgbe_hw *hw = &adapter->hw;
+       u32 rxpb, frame, size, tmp;
+
+       frame = adapter->max_frame_size;
+
+       /* Calculate High Water */
+       switch (hw->mac.type) {
+       case ixgbe_mac_X540:
+       case ixgbe_mac_X550:
+       case ixgbe_mac_X550EM_x:
+               tmp = IXGBE_DV_X540(frame, frame);
+               break;
+       default:
+               tmp = IXGBE_DV(frame, frame);
+               break;
+       }
+       size = IXGBE_BT2KB(tmp);
+       rxpb = IXGBE_READ_REG(hw, IXGBE_RXPBSIZE(0)) >> 10;
+       hw->fc.high_water[0] = rxpb - size;
+
+       /* Now calculate Low Water */
+       switch (hw->mac.type) {
+       case ixgbe_mac_X540:
+       case ixgbe_mac_X550:
+       case ixgbe_mac_X550EM_x:
+               tmp = IXGBE_LOW_DV_X540(frame);
+               break;
+       default:
+               tmp = IXGBE_LOW_DV(frame);
+               break;
+       }
+       hw->fc.low_water[0] = IXGBE_BT2KB(tmp);
+
+       hw->fc.requested_mode = adapter->fc;
+       hw->fc.pause_time = IXGBE_FC_PAUSE;
+       hw->fc.send_xon = TRUE;
+}
 
 /*
 **
@@ -1195,9 +1280,10 @@ ixgbe_handle_que(void *context, int pend
        struct adapter  *adapter = que->adapter;
        struct tx_ring  *txr = que->txr;
        struct ifnet    *ifp = adapter->ifp;
+       bool            more;
 
        if (ifp->if_drv_flags & IFF_DRV_RUNNING) {
-               ixgbe_rxeof(que);
+               more = ixgbe_rxeof(que);
                IXGBE_TX_LOCK(txr);
                ixgbe_txeof(txr);
 #ifndef IXGBE_LEGACY_TX
@@ -1270,6 +1356,11 @@ ixgbe_legacy_irq(void *arg)
        if (reg_eicr & IXGBE_EICR_LSC)
                taskqueue_enqueue(adapter->tq, &adapter->link_task);
 
+       /* External PHY interrupt */
+       if (hw->device_id == IXGBE_DEV_ID_X550EM_X_10G_T &&
+           (reg_eicr & IXGBE_EICR_GPI_SDP0_X540))
+               taskqueue_enqueue(adapter->tq, &adapter->phy_task);
+
        if (more)
                taskqueue_enqueue(que->tq, &que->que_task);
        else
@@ -1378,9 +1469,9 @@ ixgbe_msix_link(void *arg)
 {
        struct adapter  *adapter = arg;
        struct ixgbe_hw *hw = &adapter->hw;
-       u32             reg_eicr;
+       u32             reg_eicr, mod_mask;
 
-       ++adapter->vector_irq;
+       ++adapter->link_irq;
 
        /* First get the cause */
        reg_eicr = IXGBE_READ_REG(hw, IXGBE_EICS);
@@ -1408,42 +1499,46 @@ ixgbe_msix_link(void *arg)
                        device_printf(adapter->dev, "\nCRITICAL: ECC ERROR!! "
                            "Please Reboot!!\n");
                        IXGBE_WRITE_REG(hw, IXGBE_EICR, IXGBE_EICR_ECC);
-               } else
+               }
 
-               if (ixgbe_is_sfp(hw)) {
-                       if (reg_eicr & IXGBE_EICR_GPI_SDP1) {
-                               IXGBE_WRITE_REG(hw, IXGBE_EICR, 
IXGBE_EICR_GPI_SDP1_BY_MAC(hw));
-                               taskqueue_enqueue(adapter->tq, 
&adapter->msf_task);
-                       } else if (reg_eicr & IXGBE_EICR_GPI_SDP2) {
-                               IXGBE_WRITE_REG(hw, IXGBE_EICR, 
IXGBE_EICR_GPI_SDP2_BY_MAC(hw));
-                               taskqueue_enqueue(adapter->tq, 
&adapter->mod_task);
-                       }
+               /* Check for over temp condition */
+               if (reg_eicr & IXGBE_EICR_TS) {
+                       device_printf(adapter->dev, "\nCRITICAL: OVER TEMP!! "
+                           "PHY IS SHUT DOWN!!\n");
+                       device_printf(adapter->dev, "System shutdown 
required!\n");
+                       IXGBE_WRITE_REG(hw, IXGBE_EICR, IXGBE_EICR_TS);
+               }
+       }
+
+       /* Pluggable optics-related interrupt */
+       if (hw->device_id == IXGBE_DEV_ID_X550EM_X_SFP)
+               mod_mask = IXGBE_EICR_GPI_SDP0_X540;
+       else
+               mod_mask = IXGBE_EICR_GPI_SDP2_BY_MAC(hw);
+
+       if (ixgbe_is_sfp(hw)) {
+               if (reg_eicr & IXGBE_EICR_GPI_SDP1_BY_MAC(hw)) {
+                       IXGBE_WRITE_REG(hw, IXGBE_EICR, 
IXGBE_EICR_GPI_SDP1_BY_MAC(hw));
+                       taskqueue_enqueue(adapter->tq, &adapter->msf_task);
+               } else if (reg_eicr & mod_mask) {
+                       IXGBE_WRITE_REG(hw, IXGBE_EICR, mod_mask);
+                       taskqueue_enqueue(adapter->tq, &adapter->mod_task);
                }
-        } 
+       }
 
        /* Check for fan failure */
        if ((hw->device_id == IXGBE_DEV_ID_82598AT) &&
-           (reg_eicr & IXGBE_EICR_GPI_SDP1_BY_MAC(hw))) {
+           (reg_eicr & IXGBE_EICR_GPI_SDP1)) {
+               IXGBE_WRITE_REG(hw, IXGBE_EICR, IXGBE_EICR_GPI_SDP1);
                 device_printf(adapter->dev, "\nCRITICAL: FAN FAILURE!! "
                    "REPLACE IMMEDIATELY!!\n");
-               IXGBE_WRITE_REG(hw, IXGBE_EICR, IXGBE_EICR_GPI_SDP1_BY_MAC(hw));
        }
 
-       /* Check for over temp condition */
-       switch (hw->mac.type) {
-       case ixgbe_mac_X540:
-       case ixgbe_mac_X550:
-       case ixgbe_mac_X550EM_a:
-               if (reg_eicr & IXGBE_EICR_TS) {
-                       device_printf(adapter->dev, "\nCRITICAL: OVER TEMP!! "
-                           "PHY IS SHUT DOWN!!\n");
-                       device_printf(adapter->dev, "System shutdown 
required\n");
-                       IXGBE_WRITE_REG(hw, IXGBE_EICR, IXGBE_EICR_TS);
-               }
-               break;
-       default:
-               /* Other MACs have no thermal sensor interrupt */
-               break;
+       /* External PHY interrupt */
+       if (hw->device_id == IXGBE_DEV_ID_X550EM_X_10G_T &&
+           (reg_eicr & IXGBE_EICR_GPI_SDP0_X540)) {
+               IXGBE_WRITE_REG(hw, IXGBE_EICR, IXGBE_EICR_GPI_SDP0_X540);
+               taskqueue_enqueue(adapter->tq, &adapter->phy_task);
        }
 
        IXGBE_WRITE_REG(&adapter->hw, IXGBE_EIMS, IXGBE_EIMS_OTHER);
@@ -1542,20 +1637,26 @@ ixgbe_media_status(struct ifnet * ifp, s
        if (layer & IXGBE_PHYSICAL_LAYER_10GBASE_KR)
                switch (adapter->link_speed) {
                case IXGBE_LINK_SPEED_10GB_FULL:
-                       ifmr->ifm_active |= IFM_10_T | IFM_FDX;
+                       ifmr->ifm_active |= IFM_10G_SR | IFM_FDX;
+                       break;
+               case IXGBE_LINK_SPEED_2_5GB_FULL:
+                       ifmr->ifm_active |= IFM_2500_SX | IFM_FDX;
                        break;
                case IXGBE_LINK_SPEED_1GB_FULL:
-                       ifmr->ifm_active |= IFM_10_5 | IFM_FDX;
+                       ifmr->ifm_active |= IFM_1000_CX | IFM_FDX;
                        break;
                }
-       if (layer & IXGBE_PHYSICAL_LAYER_10GBASE_KX4
+       else if (layer & IXGBE_PHYSICAL_LAYER_10GBASE_KX4
            || layer & IXGBE_PHYSICAL_LAYER_1000BASE_KX)
                switch (adapter->link_speed) {
                case IXGBE_LINK_SPEED_10GB_FULL:
-                       ifmr->ifm_active |= IFM_10_2 | IFM_FDX;
+                       ifmr->ifm_active |= IFM_10G_CX4 | IFM_FDX;
+                       break;
+               case IXGBE_LINK_SPEED_2_5GB_FULL:
+                       ifmr->ifm_active |= IFM_2500_SX | IFM_FDX;
                        break;
                case IXGBE_LINK_SPEED_1GB_FULL:
-                       ifmr->ifm_active |= IFM_10_5 | IFM_FDX;
+                       ifmr->ifm_active |= IFM_1000_CX | IFM_FDX;
                        break;
                }
        
@@ -1564,10 +1665,12 @@ ixgbe_media_status(struct ifnet * ifp, s
                ifmr->ifm_active |= IFM_UNKNOWN;
        
 #if __FreeBSD_version >= 900025
-       /* Flow control setting */
-       if (adapter->fc == ixgbe_fc_rx_pause || adapter->fc == ixgbe_fc_full)
+       /* Display current flow control setting used on link */
+       if (hw->fc.current_mode == ixgbe_fc_rx_pause ||
+           hw->fc.current_mode == ixgbe_fc_full)
                ifmr->ifm_active |= IFM_ETH_RXPAUSE;
-       if (adapter->fc == ixgbe_fc_tx_pause || adapter->fc == ixgbe_fc_full)
+       if (hw->fc.current_mode == ixgbe_fc_tx_pause ||
+           hw->fc.current_mode == ixgbe_fc_full)
                ifmr->ifm_active |= IFM_ETH_TXPAUSE;
 #endif
 
@@ -1597,21 +1700,22 @@ ixgbe_media_change(struct ifnet * ifp)
        if (IFM_TYPE(ifm->ifm_media) != IFM_ETHER)
                return (EINVAL);
 
+       if (hw->phy.media_type == ixgbe_media_type_backplane)
+               return (EPERM);
+
        /*
        ** We don't actually need to check against the supported
        ** media types of the adapter; ifmedia will take care of
        ** that for us.
-       **      NOTE: this relies on falling thru the switch
-       **      to get all the values set, it can be confusing.
        */
        switch (IFM_SUBTYPE(ifm->ifm_media)) {
                case IFM_AUTO:
                case IFM_10G_T:
                        speed |= IXGBE_LINK_SPEED_100_FULL;
                case IFM_10G_LRM:
-               case IFM_10G_SR:  /* KR, too */
+               case IFM_10G_SR: /* KR, too */
                case IFM_10G_LR:
-               case IFM_10G_CX4: /* KX4 for now */
+               case IFM_10G_CX4: /* KX4 */
                        speed |= IXGBE_LINK_SPEED_1GB_FULL;
                case IFM_10G_TWINAX:
                        speed |= IXGBE_LINK_SPEED_10GB_FULL;
@@ -1620,7 +1724,7 @@ ixgbe_media_change(struct ifnet * ifp)
                        speed |= IXGBE_LINK_SPEED_100_FULL;
                case IFM_1000_LX:
                case IFM_1000_SX:
-               case IFM_1000_CX: /* KX until there's real support */
+               case IFM_1000_CX: /* KX */
                        speed |= IXGBE_LINK_SPEED_1GB_FULL;
                        break;
                case IFM_100_TX:
@@ -1640,7 +1744,7 @@ ixgbe_media_change(struct ifnet * ifp)
        return (0);
 
 invalid:
-       device_printf(adapter->dev, "Invalid media type\n");
+       device_printf(adapter->dev, "Invalid media type!\n");
        return (EINVAL);
 }
 
@@ -1865,7 +1969,6 @@ ixgbe_update_link_status(struct adapter 
        struct ifnet    *ifp = adapter->ifp;
        device_t dev = adapter->dev;
 
-
        if (adapter->link_up){ 
                if (adapter->link_active == FALSE) {
                        if (bootverbose)
@@ -1875,6 +1978,8 @@ ixgbe_update_link_status(struct adapter 
                        adapter->link_active = TRUE;
                        /* Update any Flow Control changes */
                        ixgbe_fc_enable(&adapter->hw);
+                       /* Update DMA coalescing config */
+                       ixgbe_config_dmac(adapter);
                        if_link_state_change(ifp, LINK_STATE_UP);
                }
        } else { /* Link down */
@@ -1961,7 +2066,7 @@ ixgbe_identify_hardware(struct adapter *
        /* We need this here to set the num_segs below */
        ixgbe_set_mac_type(hw);
 
-       /* Pick up the 82599 and VF settings */
+       /* Pick up the 82599 settings */
        if (hw->mac.type != ixgbe_mac_82598EB) {
                hw->phy.smart_speed = ixgbe_smart_speed;
                adapter->num_segs = IXGBE_82599_SCATTER;
@@ -2071,6 +2176,7 @@ ixgbe_allocate_legacy(struct adapter *ad
        TASK_INIT(&adapter->link_task, 0, ixgbe_handle_link, adapter);
        TASK_INIT(&adapter->mod_task, 0, ixgbe_handle_mod, adapter);
        TASK_INIT(&adapter->msf_task, 0, ixgbe_handle_msf, adapter);
+       TASK_INIT(&adapter->phy_task, 0, ixgbe_handle_phy, adapter);
 #ifdef IXGBE_FDIR
        TASK_INIT(&adapter->fdir_task, 0, ixgbe_reinit_fdir, adapter);
 #endif
@@ -2136,8 +2242,6 @@ ixgbe_allocate_msix(struct adapter *adap
        }
 #endif
 
-
-
        for (int i = 0; i < adapter->num_queues; i++, vector++, que++, txr++) {
                rid = vector + 1;
                que->res = bus_alloc_resource_any(dev, SYS_RES_IRQ, &rid,
@@ -2187,14 +2291,11 @@ ixgbe_allocate_msix(struct adapter *adap
                    "Bound RSS bucket %d to CPU %d\n",
                    i, cpu_id);
 #else
-#if 0 // This is too noisy
-               device_printf(dev,
-                   "Bound queue %d to cpu %d\n",
-                   i, cpu_id);
+               if (bootverbose)
+                       device_printf(dev,
+                           "Bound queue %d to cpu %d\n",
+                           i, cpu_id);
 #endif
-#endif
-
-
 #ifndef IXGBE_LEGACY_TX
                TASK_INIT(&txr->txq_task, 0, ixgbe_deferred_mq_start, txr);
 #endif
@@ -2240,6 +2341,7 @@ ixgbe_allocate_msix(struct adapter *adap
        TASK_INIT(&adapter->link_task, 0, ixgbe_handle_link, adapter);
        TASK_INIT(&adapter->mod_task, 0, ixgbe_handle_mod, adapter);
        TASK_INIT(&adapter->msf_task, 0, ixgbe_handle_msf, adapter);
+       TASK_INIT(&adapter->phy_task, 0, ixgbe_handle_phy, adapter);
 #ifdef IXGBE_FDIR
        TASK_INIT(&adapter->fdir_task, 0, ixgbe_reinit_fdir, adapter);
 #endif
@@ -2465,6 +2567,12 @@ ixgbe_setup_interface(device_t dev, stru
 #if __FreeBSD_version >= 1100036
        if_setgetcounterfn(ifp, ixgbe_get_counter);
 #endif
+#if __FreeBSD_version >= 1100045
+       /* TSO parameters */
+       ifp->if_hw_tsomax = 65518;
+       ifp->if_hw_tsomaxsegcount = IXGBE_82599_SCATTER;
+       ifp->if_hw_tsomaxsegsize = 2048;
+#endif
 #ifndef IXGBE_LEGACY_TX
        ifp->if_transmit = ixgbe_mq_start;
        ifp->if_qflush = ixgbe_qflush;
@@ -2548,10 +2656,6 @@ ixgbe_add_media_types(struct adapter *ad
                ifmedia_add(&adapter->media, IFM_ETHER | IFM_10G_CX4, 0, NULL);
        if (layer & IXGBE_PHYSICAL_LAYER_1000BASE_SX)
                ifmedia_add(&adapter->media, IFM_ETHER | IFM_1000_SX, 0, NULL);
-#if 0
-       if (layer & IXGBE_PHYSICAL_LAYER_1000BASE_LX)
-               ifmedia_add(&adapter->media, IFM_ETHER | IFM_1000_LX, 0, NULL);
-#endif
 
        /*
        ** Other (no matching FreeBSD media type):
@@ -2560,25 +2664,24 @@ ixgbe_add_media_types(struct adapter *ad
        */
        if (layer & IXGBE_PHYSICAL_LAYER_10GBASE_KR) {
                device_printf(dev, "Media supported: 10GbaseKR\n");
-               device_printf(dev, "10GbaseKR mapped to 10baseT\n");
-               ifmedia_add(&adapter->media, IFM_ETHER | IFM_10_T, 0, NULL);
+               device_printf(dev, "10GbaseKR mapped to 10GbaseSR\n");
+               ifmedia_add(&adapter->media, IFM_ETHER | IFM_10G_SR, 0, NULL);
        }
        if (layer & IXGBE_PHYSICAL_LAYER_10GBASE_KX4) {
                device_printf(dev, "Media supported: 10GbaseKX4\n");
-               device_printf(dev, "10GbaseKX4 mapped to 10base2\n");
-               ifmedia_add(&adapter->media, IFM_ETHER | IFM_10_2, 0, NULL);
+               device_printf(dev, "10GbaseKX4 mapped to 10GbaseCX4\n");
+               ifmedia_add(&adapter->media, IFM_ETHER | IFM_10G_CX4, 0, NULL);
        }
        if (layer & IXGBE_PHYSICAL_LAYER_1000BASE_KX) {
                device_printf(dev, "Media supported: 1000baseKX\n");
-               device_printf(dev, "1000baseKX mapped to 10base5\n");
-               ifmedia_add(&adapter->media, IFM_ETHER | IFM_10_5, 0, NULL);
+               device_printf(dev, "1000baseKX mapped to 1000baseCX\n");
+               ifmedia_add(&adapter->media, IFM_ETHER | IFM_1000_CX, 0, NULL);
        }
        if (layer & IXGBE_PHYSICAL_LAYER_1000BASE_BX) {
                /* Someday, someone will care about you... */
                device_printf(dev, "Media supported: 1000baseBX\n");
        }
        
-       /* Very old */
        if (hw->device_id == IXGBE_DEV_ID_82598AT) {
                ifmedia_add(&adapter->media,
                    IFM_ETHER | IFM_1000_T | IFM_FDX, 0, NULL);
@@ -2706,7 +2809,8 @@ ixgbe_initialise_rss_mapping(struct adap
 {
        struct ixgbe_hw *hw = &adapter->hw;
        uint32_t reta;
-       int i, j, queue_id;
+       int i, j, queue_id, table_size;
+       int index_mult;
        uint32_t rss_key[10];
        uint32_t mrqc;
 #ifdef RSS
@@ -2724,8 +2828,23 @@ ixgbe_initialise_rss_mapping(struct adap
        arc4rand(&rss_key, sizeof(rss_key), 0);
 #endif
 
+       /* Set multiplier for RETA setup and table size based on MAC */
+       index_mult = 0x1;
+       table_size = 128;
+       switch (adapter->hw.mac.type) {
+       case ixgbe_mac_82598EB:
+               index_mult = 0x11;
+               break;
+       case ixgbe_mac_X550:
+       case ixgbe_mac_X550EM_x:
+               table_size = 512;
+               break;
+       default:
+               break;
+       }
+
        /* Set up the redirection table */
-       for (i = 0, j = 0; i < 128; i++, j++) {
+       for (i = 0, j = 0; i < table_size; i++, j++) {
                if (j == adapter->num_queues) j = 0;
 #ifdef RSS
                /*
@@ -2736,7 +2855,7 @@ ixgbe_initialise_rss_mapping(struct adap
                queue_id = rss_get_indirection_to_bucket(i);
                queue_id = queue_id % adapter->num_queues;
 #else
-               queue_id = (j * 0x11);
+               queue_id = (j * index_mult);
 #endif
                /*
                 * The low 8 bits are for hash value (n+0);
@@ -2745,7 +2864,10 @@ ixgbe_initialise_rss_mapping(struct adap
                reta = reta >> 8;
                reta = reta | ( ((uint32_t) queue_id) << 24);
                if ((i & 3) == 3) {
-                       IXGBE_WRITE_REG(hw, IXGBE_RETA(i >> 2), reta);
+                       if (i < 128)
+                               IXGBE_WRITE_REG(hw, IXGBE_RETA(i >> 2), reta);
+                       else
+                               IXGBE_WRITE_REG(hw, IXGBE_ERETA((i >> 2) - 32), 
reta);
                        reta = 0;
                }
        }
@@ -2834,8 +2956,10 @@ ixgbe_initialize_receive_units(struct ad
        /* Enable broadcasts */
        fctrl = IXGBE_READ_REG(hw, IXGBE_FCTRL);
        fctrl |= IXGBE_FCTRL_BAM;
-       fctrl |= IXGBE_FCTRL_DPF;
-       fctrl |= IXGBE_FCTRL_PMCF;
+       if (adapter->hw.mac.type == ixgbe_mac_82598EB) {
+               fctrl |= IXGBE_FCTRL_DPF;
+               fctrl |= IXGBE_FCTRL_PMCF;
+       }
        IXGBE_WRITE_REG(hw, IXGBE_FCTRL, fctrl);
 
        /* Set for Jumbo Frames? */
@@ -3045,30 +3169,37 @@ ixgbe_enable_intr(struct adapter *adapte
        mask = (IXGBE_EIMS_ENABLE_MASK & ~IXGBE_EIMS_RTX_QUEUE);
        /* Enable Fan Failure detection */
        if (hw->device_id == IXGBE_DEV_ID_82598AT)
-                   mask |= IXGBE_EIMS_GPI_SDP1_BY_MAC(hw);
+                   mask |= IXGBE_EIMS_GPI_SDP1;
 
        switch (adapter->hw.mac.type) {
                case ixgbe_mac_82599EB:
                        mask |= IXGBE_EIMS_ECC;
                        /* Temperature sensor on some adapters */
-                       mask |= IXGBE_EIMS_GPI_SDP0_BY_MAC(hw);
+                       mask |= IXGBE_EIMS_GPI_SDP0;
                        /* SFP+ (RX_LOS_N & MOD_ABS_N) */
-                       mask |= IXGBE_EIMS_GPI_SDP1_BY_MAC(hw);
-                       mask |= IXGBE_EIMS_GPI_SDP2_BY_MAC(hw);
+                       mask |= IXGBE_EIMS_GPI_SDP1;
+                       mask |= IXGBE_EIMS_GPI_SDP2;
 #ifdef IXGBE_FDIR
                        mask |= IXGBE_EIMS_FLOW_DIR;
 #endif
                        break;
                case ixgbe_mac_X540:
-               case ixgbe_mac_X550:
-               case ixgbe_mac_X550EM_a:
-               case ixgbe_mac_X550EM_x:
                        /* Detect if Thermal Sensor is enabled */
                        fwsm = IXGBE_READ_REG(hw, IXGBE_FWSM);
                        if (fwsm & IXGBE_FWSM_TS_ENABLED)
                                mask |= IXGBE_EIMS_TS;
-                       /* XXX: Which SFP mode line does this look at? */
-                       if (hw->device_id == IXGBE_DEV_ID_X550EM_X_SFP)
+                       mask |= IXGBE_EIMS_ECC;
+#ifdef IXGBE_FDIR
+                       mask |= IXGBE_EIMS_FLOW_DIR;
+#endif
+                       break;
+               case ixgbe_mac_X550:
+               case ixgbe_mac_X550EM_x:
+                       /* MAC thermal sensor is automatically enabled */
+                       mask |= IXGBE_EIMS_TS;
+                       /* Some devices use SDP0 for important information */
+                       if (hw->device_id == IXGBE_DEV_ID_X550EM_X_SFP ||
+                           hw->device_id == IXGBE_DEV_ID_X550EM_X_10G_T)
                                mask |= IXGBE_EIMS_GPI_SDP0_BY_MAC(hw);
                        mask |= IXGBE_EIMS_ECC;
 #ifdef IXGBE_FDIR
@@ -3081,7 +3212,7 @@ ixgbe_enable_intr(struct adapter *adapte
 
        IXGBE_WRITE_REG(hw, IXGBE_EIMS, mask);
 
-       /* With RSS we use auto clear */
+       /* With MSI-X we use auto clear */
        if (adapter->msix_mem) {
                mask = IXGBE_EIMS_ENABLE_MASK;
                /* Don't autoclear Link */
@@ -3135,10 +3266,12 @@ ixgbe_get_slot_info(struct ixgbe_hw *hw)
        if (hw->device_id != IXGBE_DEV_ID_82599_SFP_SF_QP) {
                ixgbe_get_bus_info(hw);
                /* These devices don't use PCI-E */
-               if (hw->mac.type == ixgbe_mac_X550EM_x
-                   || hw->mac.type == ixgbe_mac_X550EM_a)
+               switch (hw->mac.type) {
+               case ixgbe_mac_X550EM_x:
                        return;
-               goto display;
+               default:
+                       goto display;
+               }
        }
 
        /*
@@ -3260,7 +3393,6 @@ ixgbe_set_ivar(struct adapter *adapter, 
        case ixgbe_mac_82599EB:
        case ixgbe_mac_X540:
        case ixgbe_mac_X550:
-       case ixgbe_mac_X550EM_a:
        case ixgbe_mac_X550EM_x:
                if (type == -1) { /* MISC IVAR */
                        index = (entry & 1) * 8;
@@ -3289,8 +3421,14 @@ ixgbe_configure_ivars(struct adapter *ad
 
        if (ixgbe_max_interrupt_rate > 0)
                newitr = (4000000 / ixgbe_max_interrupt_rate) & 0x0FF8;
-       else
+       else {
+               /*
+               ** Disable DMA coalescing if interrupt moderation is
+               ** disabled.
+               */
+               adapter->dmac = 0;
                newitr = 0;
+       }
 
         for (int i = 0; i < adapter->num_queues; i++, que++) {
                /* First the RX queue entry */
@@ -3350,7 +3488,7 @@ ixgbe_handle_link(void *context, int pen
 
        ixgbe_check_link(&adapter->hw,
            &adapter->link_speed, &adapter->link_up, 0);
-               ixgbe_update_link_status(adapter);
+       ixgbe_update_link_status(adapter);
 }
 
 /*
@@ -3410,6 +3548,28 @@ ixgbe_handle_msf(void *context, int pend
        return;
 }
 
+/*
+** Tasklet for handling interrupts from an external PHY
+*/
+static void
+ixgbe_handle_phy(void *context, int pending)
+{
+       struct adapter  *adapter = context;
+       struct ixgbe_hw *hw = &adapter->hw;
+       int error;
+
+       error = hw->phy.ops.handle_lasi(hw);
+       if (error == IXGBE_ERR_OVERTEMP)
+               device_printf(adapter->dev,
+                   "CRITICAL: EXTERNAL PHY OVER TEMP!! "
+                   " PHY will downshift to lower power state!\n");
+       else if (error)
+               device_printf(adapter->dev,
+                   "Error handling LASI interrupt: %d\n",
+                   error);
+       return;
+}
+
 #ifdef IXGBE_FDIR
 /*
 ** Tasklet for reinitializing the Flow Director filter table
@@ -3432,6 +3592,127 @@ ixgbe_reinit_fdir(void *context, int pen
 }
 #endif
 
+/*********************************************************************
+ *
+ *  Configure DMA Coalescing
+ *
+ **********************************************************************/
+static void
+ixgbe_config_dmac(struct adapter *adapter)
+{
+       struct ixgbe_hw *hw = &adapter->hw;
+       struct ixgbe_dmac_config *dcfg = &hw->mac.dmac_config;
+
+       if (hw->mac.type < ixgbe_mac_X550 ||
+           !hw->mac.ops.dmac_config)
+               return;
+
+       if (dcfg->watchdog_timer ^ adapter->dmac ||
+           dcfg->link_speed ^ adapter->link_speed) {
+               dcfg->watchdog_timer = adapter->dmac;
+               dcfg->fcoe_en = false;
+               dcfg->link_speed = adapter->link_speed;
+               dcfg->num_tcs = 1;
+               
+               INIT_DEBUGOUT2("dmac settings: watchdog %d, link speed %d\n",
+                   dcfg->watchdog_timer, dcfg->link_speed);
+
+               hw->mac.ops.dmac_config(hw);
+       }
+}
+
+/*
+ * Checks whether the adapter supports Energy Efficient Ethernet
+ * or not, based on device ID.
+ */
+static void
+ixgbe_check_eee_support(struct adapter *adapter)

*** DIFF OUTPUT TRUNCATED AT 1000 LINES ***
_______________________________________________
svn-src-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to