| From 367758ac450bc1a67c6ec7838b695486f90aa379 Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Thu, 2 Feb 2023 13:55:35 -0800 |
| Subject: ionic: clean interrupt before enabling queue to avoid credit race |
| |
| From: Neel Patel <neel.patel@amd.com> |
| |
| [ Upstream commit e8797a058466b60fc5a3291b92430c93ba90eaff ] |
| |
| Clear the interrupt credits before enabling the queue rather |
| than after to be sure that the enabled queue starts at 0 and |
| that we don't wipe away possible credits after enabling the |
| queue. |
| |
| Fixes: 0f3154e6bcb3 ("ionic: Add Tx and Rx handling") |
| Signed-off-by: Neel Patel <neel.patel@amd.com> |
| Signed-off-by: Shannon Nelson <shannon.nelson@amd.com> |
| Reviewed-by: Leon Romanovsky <leonro@nvidia.com> |
| Signed-off-by: Jakub Kicinski <kuba@kernel.org> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| drivers/net/ethernet/pensando/ionic/ionic_lif.c | 15 ++++++++++++--- |
| 1 file changed, 12 insertions(+), 3 deletions(-) |
| |
| diff --git a/drivers/net/ethernet/pensando/ionic/ionic_lif.c b/drivers/net/ethernet/pensando/ionic/ionic_lif.c |
| index f9c303d76658a..d0841836cf705 100644 |
| --- a/drivers/net/ethernet/pensando/ionic/ionic_lif.c |
| +++ b/drivers/net/ethernet/pensando/ionic/ionic_lif.c |
| @@ -190,6 +190,7 @@ static int ionic_qcq_enable(struct ionic_qcq *qcq) |
| .oper = IONIC_Q_ENABLE, |
| }, |
| }; |
| + int ret; |
| |
| idev = &lif->ionic->idev; |
| dev = lif->ionic->dev; |
| @@ -197,16 +198,24 @@ static int ionic_qcq_enable(struct ionic_qcq *qcq) |
| dev_dbg(dev, "q_enable.index %d q_enable.qtype %d\n", |
| ctx.cmd.q_control.index, ctx.cmd.q_control.type); |
| |
| + if (qcq->flags & IONIC_QCQ_F_INTR) |
| + ionic_intr_clean(idev->intr_ctrl, qcq->intr.index); |
| + |
| + ret = ionic_adminq_post_wait(lif, &ctx); |
| + if (ret) |
| + return ret; |
| + |
| + if (qcq->napi.poll) |
| + napi_enable(&qcq->napi); |
| + |
| if (qcq->flags & IONIC_QCQ_F_INTR) { |
| irq_set_affinity_hint(qcq->intr.vector, |
| &qcq->intr.affinity_mask); |
| - napi_enable(&qcq->napi); |
| - ionic_intr_clean(idev->intr_ctrl, qcq->intr.index); |
| ionic_intr_mask(idev->intr_ctrl, qcq->intr.index, |
| IONIC_INTR_MASK_CLEAR); |
| } |
| |
| - return ionic_adminq_post_wait(lif, &ctx); |
| + return 0; |
| } |
| |
| static int ionic_qcq_disable(struct ionic_qcq *qcq) |
| -- |
| 2.39.0 |
| |