ionic: add timeout error checking for queue disable
authorShannon Nelson <snelson@pensando.io>
Fri, 20 Mar 2020 02:31:48 +0000 (19:31 -0700)
committerDavid S. Miller <davem@davemloft.net>
Sun, 22 Mar 2020 02:56:04 +0000 (19:56 -0700)
Short circuit the cleanup if we get a timeout error from
ionic_qcq_disable() so as to not have to wait too long
on shutdown when we already know the FW is not responding.

Fixes: 0f3154e6bcb3 ("ionic: Add Tx and Rx handling")
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 12e3823b0bc1e0351b1b7243fed97ec9202a8607..c62d3d01d5aaf97f0b0697db75cd410476eb64b4 100644 (file)
@@ -1425,10 +1425,15 @@ static void ionic_lif_rss_deinit(struct ionic_lif *lif)
 static void ionic_txrx_disable(struct ionic_lif *lif)
 {
        unsigned int i;
+       int err;
 
        for (i = 0; i < lif->nxqs; i++) {
-               ionic_qcq_disable(lif->txqcqs[i].qcq);
-               ionic_qcq_disable(lif->rxqcqs[i].qcq);
+               err = ionic_qcq_disable(lif->txqcqs[i].qcq);
+               if (err == -ETIMEDOUT)
+                       break;
+               err = ionic_qcq_disable(lif->rxqcqs[i].qcq);
+               if (err == -ETIMEDOUT)
+                       break;
        }
 }
 
@@ -1552,7 +1557,8 @@ static int ionic_txrx_enable(struct ionic_lif *lif)
                ionic_rx_fill(&lif->rxqcqs[i].qcq->q);
                err = ionic_qcq_enable(lif->rxqcqs[i].qcq);
                if (err) {
-                       ionic_qcq_disable(lif->txqcqs[i].qcq);
+                       if (err != -ETIMEDOUT)
+                               ionic_qcq_disable(lif->txqcqs[i].qcq);
                        goto err_out;
                }
        }
@@ -1561,8 +1567,12 @@ static int ionic_txrx_enable(struct ionic_lif *lif)
 
 err_out:
        while (i--) {
-               ionic_qcq_disable(lif->rxqcqs[i].qcq);
-               ionic_qcq_disable(lif->txqcqs[i].qcq);
+               err = ionic_qcq_disable(lif->rxqcqs[i].qcq);
+               if (err == -ETIMEDOUT)
+                       break;
+               err = ionic_qcq_disable(lif->txqcqs[i].qcq);
+               if (err == -ETIMEDOUT)
+                       break;
        }
 
        return err;