i40e: Tell OS link is going down when calling set_phy_config
authorCatherine Sullivan <catherine.sullivan@intel.com>
Sat, 12 Jul 2014 07:28:16 +0000 (07:28 +0000)
committerJeff Kirsher <jeffrey.t.kirsher@intel.com>
Thu, 4 Sep 2014 08:38:29 +0000 (01:38 -0700)
Since we don't seem to be getting an LSE telling us link is going down
during set_phy_config (but we do get an LSE telling us we are coming
back up), fake one for the OS and tell them link is going down. Also
do an atomic restart no matter what because there are times the user
may want to end with link up even if they started with link down (like
if they accidentally set it to a speed that can't link and are trying to
fix it).

Change-ID: I0a642af9c1d0feb67bce741aba1a9c33bd349ed6
Signed-off-by: Catherine Sullivan <catherine.sullivan@intel.com>
Tested-by: Jim Young <jamesx.m.young@intel.com>
Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
drivers/net/ethernet/intel/i40e/i40e_ethtool.c

index de4ce0e022a4c602b3f39d5c290484e9cbe42bf9..1dda467ae1ac62bdc5428e4c6086c322fdac597d 100644 (file)
@@ -559,9 +559,17 @@ static int i40e_set_settings(struct net_device *netdev,
                config.eeer = abilities.eeer_val;
                config.low_power_ctrl = abilities.d3_lpan;
 
-               /* If link is up set link and an so changes take effect */
-               if (hw->phy.link_info.link_info & I40E_AQ_LINK_UP)
-                       config.abilities |= I40E_AQ_PHY_ENABLE_ATOMIC_LINK;
+               /* set link and auto negotiation so changes take effect */
+               config.abilities |= I40E_AQ_PHY_ENABLE_ATOMIC_LINK;
+               /* If link is up put link down */
+               if (hw->phy.link_info.link_info & I40E_AQ_LINK_UP) {
+                       /* Tell the OS link is going down, the link will go
+                        * back up when fw says it is ready asynchronously
+                        */
+                       netdev_info(netdev, "PHY settings change requested, NIC Link is going down.\n");
+                       netif_carrier_off(netdev);
+                       netif_tx_stop_all_queues(netdev);
+               }
 
                /* make the aq call */
                status = i40e_aq_set_phy_config(hw, &config, NULL);
@@ -678,6 +686,13 @@ static int i40e_set_pauseparam(struct net_device *netdev,
        else
                 return -EINVAL;
 
+       /* Tell the OS link is going down, the link will go back up when fw
+        * says it is ready asynchronously
+        */
+       netdev_info(netdev, "Flow control settings change requested, NIC Link is going down.\n");
+       netif_carrier_off(netdev);
+       netif_tx_stop_all_queues(netdev);
+
        /* Set the fc mode and only restart an if link is up*/
        status = i40e_set_fc(hw, &aq_failures, link_up);