ionic: block actions during fw reset
authorShannon Nelson <snelson@pensando.io>
Fri, 19 Mar 2021 00:48:08 +0000 (17:48 -0700)
committerDavid S. Miller <davem@davemloft.net>
Fri, 19 Mar 2021 02:16:10 +0000 (19:16 -0700)
Block some actions while the FW is in a reset activity
and the queues are not configured.

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

index b0d8499..e4a5416 100644 (file)
@@ -184,6 +184,10 @@ static int ionic_sriov_configure(struct pci_dev *pdev, int num_vfs)
        struct device *dev = ionic->dev;
        int ret = 0;
 
+       if (ionic->lif &&
+           test_bit(IONIC_LIF_F_FW_RESET, ionic->lif->state))
+               return -EBUSY;
+
        if (num_vfs > 0) {
                ret = pci_enable_sriov(pdev, num_vfs);
                if (ret) {
index b951bf5..0532f7c 100644 (file)
 static void ionic_watchdog_cb(struct timer_list *t)
 {
        struct ionic *ionic = from_timer(ionic, t, watchdog_timer);
+       struct ionic_lif *lif = ionic->lif;
        int hb;
 
        mod_timer(&ionic->watchdog_timer,
                  round_jiffies(jiffies + ionic->watchdog_period));
 
-       if (!ionic->lif)
+       if (!lif)
                return;
 
        hb = ionic_heartbeat_check(ionic);
 
-       if (hb >= 0)
-               ionic_link_status_check_request(ionic->lif, CAN_NOT_SLEEP);
+       if (hb >= 0 &&
+           !test_bit(IONIC_LIF_F_FW_RESET, lif->state))
+               ionic_link_status_check_request(lif, CAN_NOT_SLEEP);
 }
 
 void ionic_init_devinfo(struct ionic *ionic)
index 18fcba4..4f4ca18 100644 (file)
@@ -1477,7 +1477,8 @@ static void ionic_tx_timeout_work(struct work_struct *ws)
 {
        struct ionic_lif *lif = container_of(ws, struct ionic_lif, tx_timeout_work);
 
-       netdev_info(lif->netdev, "Tx Timeout recovery\n");
+       if (test_bit(IONIC_LIF_F_FW_RESET, lif->state))
+               return;
 
        /* if we were stopped before this scheduled job was launched,
         * don't bother the queues as they are already stopped.
@@ -1493,6 +1494,7 @@ static void ionic_tx_timeout(struct net_device *netdev, unsigned int txqueue)
 {
        struct ionic_lif *lif = netdev_priv(netdev);
 
+       netdev_info(lif->netdev, "Tx Timeout triggered - txq %d\n", txqueue);
        schedule_work(&lif->tx_timeout_work);
 }
 
@@ -1834,6 +1836,9 @@ static int ionic_start_queues(struct ionic_lif *lif)
 {
        int err;
 
+       if (test_bit(IONIC_LIF_F_FW_RESET, lif->state))
+               return -EBUSY;
+
        if (test_and_set_bit(IONIC_LIF_F_UP, lif->state))
                return 0;