ionic: decouple link message from netdev state
authorShannon Nelson <snelson@pensando.io>
Sat, 28 Mar 2020 03:14:41 +0000 (20:14 -0700)
committerDavid S. Miller <davem@davemloft.net>
Mon, 30 Mar 2020 18:40:49 +0000 (11:40 -0700)
Rearrange the link_up/link_down messages so that we announce
link up when we first notice that the link is up when the
driver loads, and decouple the link_up/link_down messages from
the UP and DOWN netdev state.

Signed-off-by: Shannon Nelson <snelson@pensando.io>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/pensando/ionic/ionic_lif.c

index 8e24d6a..5dbd088 100644 (file)
@@ -73,31 +73,35 @@ static void ionic_link_status_check(struct ionic_lif *lif)
        u16 link_status;
        bool link_up;
 
+       if (lif->ionic->is_mgmt_nic)
+               return;
+
        link_status = le16_to_cpu(lif->info->status.link_status);
        link_up = link_status == IONIC_PORT_OPER_STATUS_UP;
 
-       /* filter out the no-change cases */
-       if (link_up == netif_carrier_ok(netdev))
-               goto link_out;
-
        if (link_up) {
-               netdev_info(netdev, "Link up - %d Gbps\n",
-                           le32_to_cpu(lif->info->status.link_speed) / 1000);
+               if (!netif_carrier_ok(netdev)) {
+                       u32 link_speed;
 
-               if (test_bit(IONIC_LIF_F_UP, lif->state)) {
-                       netif_tx_wake_all_queues(lif->netdev);
+                       ionic_port_identify(lif->ionic);
+                       link_speed = le32_to_cpu(lif->info->status.link_speed);
+                       netdev_info(netdev, "Link up - %d Gbps\n",
+                                   link_speed / 1000);
                        netif_carrier_on(netdev);
                }
+
+               if (test_bit(IONIC_LIF_F_UP, lif->state))
+                       netif_tx_wake_all_queues(lif->netdev);
        } else {
-               netdev_info(netdev, "Link down\n");
+               if (netif_carrier_ok(netdev)) {
+                       netdev_info(netdev, "Link down\n");
+                       netif_carrier_off(netdev);
+               }
 
-               /* carrier off first to avoid watchdog timeout */
-               netif_carrier_off(netdev);
                if (test_bit(IONIC_LIF_F_UP, lif->state))
                        netif_tx_stop_all_queues(netdev);
        }
 
-link_out:
        clear_bit(IONIC_LIF_F_LINK_CHECK_REQUESTED, lif->state);
 }
 
@@ -1587,8 +1591,6 @@ int ionic_open(struct net_device *netdev)
        struct ionic_lif *lif = netdev_priv(netdev);
        int err;
 
-       netif_carrier_off(netdev);
-
        err = ionic_txrx_alloc(lif);
        if (err)
                return err;
@@ -1936,6 +1938,8 @@ static struct ionic_lif *ionic_lif_alloc(struct ionic *ionic, unsigned int index
        ionic_ethtool_set_ops(netdev);
 
        netdev->watchdog_timeo = 2 * HZ;
+       netif_carrier_off(netdev);
+
        netdev->min_mtu = IONIC_MIN_MTU;
        netdev->max_mtu = IONIC_MAX_MTU;