/* Decide whether to use autoneg or not. */
        hw->mac.ops.check_link(hw, &speed, &link_up, false);
-       if (hw->phy.multispeed_fiber && (speed == IXGBE_LINK_SPEED_1GB_FULL))
+       if (!hw->fc.disable_fc_autoneg && hw->phy.multispeed_fiber &&
+           (speed == IXGBE_LINK_SPEED_1GB_FULL))
                ret_val = ixgbe_fc_autoneg(hw);
 
        if (ret_val)
 
 
        /* Decide whether to use autoneg or not. */
        hw->mac.ops.check_link(hw, &speed, &link_up, false);
-       if (hw->phy.multispeed_fiber && (speed == IXGBE_LINK_SPEED_1GB_FULL))
+       if (!hw->fc.disable_fc_autoneg && hw->phy.multispeed_fiber &&
+           (speed == IXGBE_LINK_SPEED_1GB_FULL))
                ret_val = ixgbe_fc_autoneg(hw);
 
        if (ret_val)
 
        struct ixgbe_adapter *adapter = netdev_priv(netdev);
        struct ixgbe_hw *hw = &adapter->hw;
 
-       pause->autoneg = (hw->fc.current_mode == ixgbe_fc_full ? 1 : 0);
+       /*
+        * Flow Control Autoneg isn't on if
+        *  - we didn't ask for it OR
+        *  - it failed, we know this by tx & rx being off
+        */
+       if (hw->fc.disable_fc_autoneg ||
+           (hw->fc.current_mode == ixgbe_fc_none))
+               pause->autoneg = 0;
+       else
+               pause->autoneg = 1;
 
        if (hw->fc.current_mode == ixgbe_fc_rx_pause) {
                pause->rx_pause = 1;
        struct ixgbe_adapter *adapter = netdev_priv(netdev);
        struct ixgbe_hw *hw = &adapter->hw;
 
-       if ((pause->autoneg == AUTONEG_ENABLE) ||
-           (pause->rx_pause && pause->tx_pause))
+       if (pause->autoneg != AUTONEG_ENABLE)
+               hw->fc.disable_fc_autoneg = true;
+       else
+               hw->fc.disable_fc_autoneg = false;
+
+       if (pause->rx_pause && pause->tx_pause)
                hw->fc.requested_mode = ixgbe_fc_full;
        else if (pause->rx_pause && !pause->tx_pause)
                hw->fc.requested_mode = ixgbe_fc_rx_pause;
 
 
        /* default flow control settings */
        hw->fc.requested_mode = ixgbe_fc_full;
+       hw->fc.current_mode = ixgbe_fc_full;    /* init for ethtool output */
        hw->fc.high_water = IXGBE_DEFAULT_FCRTH;
        hw->fc.low_water = IXGBE_DEFAULT_FCRTL;
        hw->fc.pause_time = IXGBE_DEFAULT_FCPAUSE;
        hw->fc.send_xon = true;
+       hw->fc.disable_fc_autoneg = false;
 
        /* enable itr by default in dynamic mode */
        adapter->itr_setting = 1;
 
        u16 pause_time; /* Flow Control Pause timer */
        bool send_xon; /* Flow control send XON */
        bool strict_ieee; /* Strict IEEE mode */
+       bool disable_fc_autoneg; /* Turn off autoneg FC mode */
        enum ixgbe_fc_mode current_mode; /* FC mode in effect */
        enum ixgbe_fc_mode requested_mode; /* FC mode requested by caller */
 };