ionic: check qcq ptr in ionic_qcq_disable
authorShannon Nelson <snelson@pensando.io>
Thu, 1 Oct 2020 16:22:42 +0000 (09:22 -0700)
committerDavid S. Miller <davem@davemloft.net>
Fri, 2 Oct 2020 23:30:01 +0000 (16:30 -0700)
There are a couple of error recovery paths that can come through
ionic_qcq_disable() without having set up the qcq, so we need
to make sure we have a valid qcq pointer before using it.

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 5906145e45859c63f1ec4d20d0753526abf229c1..efffdfe1840681389df94f698af5792ef25b1d2f 100644 (file)
@@ -266,29 +266,26 @@ static int ionic_qcq_enable(struct ionic_qcq *qcq)
 
 static int ionic_qcq_disable(struct ionic_qcq *qcq)
 {
-       struct ionic_queue *q = &qcq->q;
-       struct ionic_lif *lif = q->lif;
-       struct ionic_dev *idev;
-       struct device *dev;
+       struct ionic_queue *q;
+       struct ionic_lif *lif;
 
        struct ionic_admin_ctx ctx = {
                .work = COMPLETION_INITIALIZER_ONSTACK(ctx.work),
                .cmd.q_control = {
                        .opcode = IONIC_CMD_Q_CONTROL,
-                       .lif_index = cpu_to_le16(lif->index),
-                       .type = q->type,
-                       .index = cpu_to_le32(q->index),
                        .oper = IONIC_Q_DISABLE,
                },
        };
 
-       idev = &lif->ionic->idev;
-       dev = lif->ionic->dev;
+       if (!qcq)
+               return -ENXIO;
 
-       dev_dbg(dev, "q_disable.index %d q_disable.qtype %d\n",
-               ctx.cmd.q_control.index, ctx.cmd.q_control.type);
+       q = &qcq->q;
+       lif = q->lif;
 
        if (qcq->flags & IONIC_QCQ_F_INTR) {
+               struct ionic_dev *idev = &lif->ionic->idev;
+
                cancel_work_sync(&qcq->dim.work);
                ionic_intr_mask(idev->intr_ctrl, qcq->intr.index,
                                IONIC_INTR_MASK_SET);
@@ -297,6 +294,12 @@ static int ionic_qcq_disable(struct ionic_qcq *qcq)
                napi_disable(&qcq->napi);
        }
 
+       ctx.cmd.q_control.lif_index = cpu_to_le16(lif->index);
+       ctx.cmd.q_control.type = q->type;
+       ctx.cmd.q_control.index = cpu_to_le32(q->index);
+       dev_dbg(lif->ionic->dev, "q_disable.index %d q_disable.qtype %d\n",
+               ctx.cmd.q_control.index, ctx.cmd.q_control.type);
+
        return ionic_adminq_post_wait(lif, &ctx);
 }
 
@@ -1794,6 +1797,12 @@ static int ionic_txrx_enable(struct ionic_lif *lif)
        int i, err;
 
        for (i = 0; i < lif->nxqs; i++) {
+               if (!(lif->rxqcqs[i] && lif->txqcqs[i])) {
+                       dev_err(lif->ionic->dev, "%s: bad qcq %d\n", __func__, i);
+                       err = -ENXIO;
+                       goto err_out;
+               }
+
                ionic_rx_fill(&lif->rxqcqs[i]->q);
                err = ionic_qcq_enable(lif->rxqcqs[i]);
                if (err)