ionic: check for queues before deleting
authorShannon Nelson <snelson@pensando.io>
Sat, 28 Mar 2020 03:14:46 +0000 (20:14 -0700)
committerDavid S. Miller <davem@davemloft.net>
Mon, 30 Mar 2020 18:40:50 +0000 (11:40 -0700)
Make sure the queue structures exist before trying
to delete them.  This addresses a couple of error
recovery issues.

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 bab471b82e5229cfd6f19fa88acbeb5226f2b9ab..99c2d0bdcdb5d26edcbe3a77abdfcacd73736987 100644 (file)
@@ -1437,13 +1437,20 @@ static void ionic_txrx_disable(struct ionic_lif *lif)
        unsigned int i;
        int err;
 
-       for (i = 0; i < lif->nxqs; i++) {
-               err = ionic_qcq_disable(lif->txqcqs[i].qcq);
-               if (err == -ETIMEDOUT)
-                       break;
-               err = ionic_qcq_disable(lif->rxqcqs[i].qcq);
-               if (err == -ETIMEDOUT)
-                       break;
+       if (lif->txqcqs) {
+               for (i = 0; i < lif->nxqs; i++) {
+                       err = ionic_qcq_disable(lif->txqcqs[i].qcq);
+                       if (err == -ETIMEDOUT)
+                               break;
+               }
+       }
+
+       if (lif->rxqcqs) {
+               for (i = 0; i < lif->nxqs; i++) {
+                       err = ionic_qcq_disable(lif->rxqcqs[i].qcq);
+                       if (err == -ETIMEDOUT)
+                               break;
+               }
        }
 }
 
@@ -1451,14 +1458,20 @@ static void ionic_txrx_deinit(struct ionic_lif *lif)
 {
        unsigned int i;
 
-       for (i = 0; i < lif->nxqs; i++) {
-               ionic_lif_qcq_deinit(lif, lif->txqcqs[i].qcq);
-               ionic_tx_flush(&lif->txqcqs[i].qcq->cq);
-               ionic_tx_empty(&lif->txqcqs[i].qcq->q);
+       if (lif->txqcqs) {
+               for (i = 0; i < lif->nxqs; i++) {
+                       ionic_lif_qcq_deinit(lif, lif->txqcqs[i].qcq);
+                       ionic_tx_flush(&lif->txqcqs[i].qcq->cq);
+                       ionic_tx_empty(&lif->txqcqs[i].qcq->q);
+               }
+       }
 
-               ionic_lif_qcq_deinit(lif, lif->rxqcqs[i].qcq);
-               ionic_rx_flush(&lif->rxqcqs[i].qcq->cq);
-               ionic_rx_empty(&lif->rxqcqs[i].qcq->q);
+       if (lif->rxqcqs) {
+               for (i = 0; i < lif->nxqs; i++) {
+                       ionic_lif_qcq_deinit(lif, lif->rxqcqs[i].qcq);
+                       ionic_rx_flush(&lif->rxqcqs[i].qcq->cq);
+                       ionic_rx_empty(&lif->rxqcqs[i].qcq->q);
+               }
        }
 }
 
@@ -1466,12 +1479,18 @@ static void ionic_txrx_free(struct ionic_lif *lif)
 {
        unsigned int i;
 
-       for (i = 0; i < lif->nxqs; i++) {
-               ionic_qcq_free(lif, lif->txqcqs[i].qcq);
-               lif->txqcqs[i].qcq = NULL;
+       if (lif->txqcqs) {
+               for (i = 0; i < lif->nxqs; i++) {
+                       ionic_qcq_free(lif, lif->txqcqs[i].qcq);
+                       lif->txqcqs[i].qcq = NULL;
+               }
+       }
 
-               ionic_qcq_free(lif, lif->rxqcqs[i].qcq);
-               lif->rxqcqs[i].qcq = NULL;
+       if (lif->rxqcqs) {
+               for (i = 0; i < lif->nxqs; i++) {
+                       ionic_qcq_free(lif, lif->rxqcqs[i].qcq);
+                       lif->rxqcqs[i].qcq = NULL;
+               }
        }
 }