Commit aa46dfff authored by Vasundhara Volam's avatar Vasundhara Volam Committed by David S. Miller

bnxt_en: Improve bnxt_ulp_stop()/bnxt_ulp_start() call sequence.

We call bnxt_ulp_stop() to notify the RDMA driver that some error or
imminent reset is about to happen.  After that we always call
some variants of bnxt_close().

In the next patch, we will integrate the recently added error
recovery with the RDMA driver.  In response to ulp_stop, the
RDMA driver may free MSIX vectors and that will also trigger
bnxt_close().  To avoid bnxt_close() from being called twice,
we set a new flag after ulp_stop is called.  If the RDMA driver
frees MSIX vectors while the new flag is set, we will not call
bnxt_close(), knowing that it will happen in due course.

With this change, we must make sure that the bnxt_close() call
after ulp_stop will reset IRQ.  Modify bnxt_reset_task()
accordingly if we call ulp_stop.
Signed-off-by: default avatarVasundhara Volam <vasundhara-v.volam@broadcom.com>
Signed-off-by: default avatarMichael Chan <michael.chan@broadcom.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 627c89d0
...@@ -9927,12 +9927,15 @@ static void bnxt_reset_task(struct bnxt *bp, bool silent) ...@@ -9927,12 +9927,15 @@ static void bnxt_reset_task(struct bnxt *bp, bool silent)
if (netif_running(bp->dev)) { if (netif_running(bp->dev)) {
int rc; int rc;
if (!silent) if (silent) {
bnxt_close_nic(bp, false, false);
bnxt_open_nic(bp, false, false);
} else {
bnxt_ulp_stop(bp); bnxt_ulp_stop(bp);
bnxt_close_nic(bp, false, false); bnxt_close_nic(bp, true, false);
rc = bnxt_open_nic(bp, false, false); rc = bnxt_open_nic(bp, true, false);
if (!silent && !rc) bnxt_ulp_start(bp, rc);
bnxt_ulp_start(bp); }
} }
} }
...@@ -12005,10 +12008,9 @@ static pci_ers_result_t bnxt_io_slot_reset(struct pci_dev *pdev) ...@@ -12005,10 +12008,9 @@ static pci_ers_result_t bnxt_io_slot_reset(struct pci_dev *pdev)
if (!err && netif_running(netdev)) if (!err && netif_running(netdev))
err = bnxt_open(netdev); err = bnxt_open(netdev);
if (!err) { if (!err)
result = PCI_ERS_RESULT_RECOVERED; result = PCI_ERS_RESULT_RECOVERED;
bnxt_ulp_start(bp); bnxt_ulp_start(bp, err);
}
} }
if (result != PCI_ERS_RESULT_RECOVERED && netif_running(netdev)) if (result != PCI_ERS_RESULT_RECOVERED && netif_running(netdev))
......
...@@ -182,7 +182,7 @@ static int bnxt_free_msix_vecs(struct bnxt_en_dev *edev, int ulp_id) ...@@ -182,7 +182,7 @@ static int bnxt_free_msix_vecs(struct bnxt_en_dev *edev, int ulp_id)
edev->ulp_tbl[ulp_id].msix_requested = 0; edev->ulp_tbl[ulp_id].msix_requested = 0;
edev->flags &= ~BNXT_EN_FLAG_MSIX_REQUESTED; edev->flags &= ~BNXT_EN_FLAG_MSIX_REQUESTED;
if (netif_running(dev)) { if (netif_running(dev) && !(edev->flags & BNXT_EN_FLAG_ULP_STOPPED)) {
bnxt_close_nic(bp, true, false); bnxt_close_nic(bp, true, false);
bnxt_open_nic(bp, true, false); bnxt_open_nic(bp, true, false);
} }
...@@ -266,6 +266,7 @@ void bnxt_ulp_stop(struct bnxt *bp) ...@@ -266,6 +266,7 @@ void bnxt_ulp_stop(struct bnxt *bp)
if (!edev) if (!edev)
return; return;
edev->flags |= BNXT_EN_FLAG_ULP_STOPPED;
for (i = 0; i < BNXT_MAX_ULP; i++) { for (i = 0; i < BNXT_MAX_ULP; i++) {
struct bnxt_ulp *ulp = &edev->ulp_tbl[i]; struct bnxt_ulp *ulp = &edev->ulp_tbl[i];
...@@ -276,7 +277,7 @@ void bnxt_ulp_stop(struct bnxt *bp) ...@@ -276,7 +277,7 @@ void bnxt_ulp_stop(struct bnxt *bp)
} }
} }
void bnxt_ulp_start(struct bnxt *bp) void bnxt_ulp_start(struct bnxt *bp, int err)
{ {
struct bnxt_en_dev *edev = bp->edev; struct bnxt_en_dev *edev = bp->edev;
struct bnxt_ulp_ops *ops; struct bnxt_ulp_ops *ops;
...@@ -285,6 +286,11 @@ void bnxt_ulp_start(struct bnxt *bp) ...@@ -285,6 +286,11 @@ void bnxt_ulp_start(struct bnxt *bp)
if (!edev) if (!edev)
return; return;
edev->flags &= ~BNXT_EN_FLAG_ULP_STOPPED;
if (err)
return;
for (i = 0; i < BNXT_MAX_ULP; i++) { for (i = 0; i < BNXT_MAX_ULP; i++) {
struct bnxt_ulp *ulp = &edev->ulp_tbl[i]; struct bnxt_ulp *ulp = &edev->ulp_tbl[i];
......
...@@ -64,6 +64,7 @@ struct bnxt_en_dev { ...@@ -64,6 +64,7 @@ struct bnxt_en_dev {
#define BNXT_EN_FLAG_ROCE_CAP (BNXT_EN_FLAG_ROCEV1_CAP | \ #define BNXT_EN_FLAG_ROCE_CAP (BNXT_EN_FLAG_ROCEV1_CAP | \
BNXT_EN_FLAG_ROCEV2_CAP) BNXT_EN_FLAG_ROCEV2_CAP)
#define BNXT_EN_FLAG_MSIX_REQUESTED 0x4 #define BNXT_EN_FLAG_MSIX_REQUESTED 0x4
#define BNXT_EN_FLAG_ULP_STOPPED 0x8
const struct bnxt_en_ops *en_ops; const struct bnxt_en_ops *en_ops;
struct bnxt_ulp ulp_tbl[BNXT_MAX_ULP]; struct bnxt_ulp ulp_tbl[BNXT_MAX_ULP];
}; };
...@@ -92,7 +93,7 @@ int bnxt_get_ulp_msix_num(struct bnxt *bp); ...@@ -92,7 +93,7 @@ int bnxt_get_ulp_msix_num(struct bnxt *bp);
int bnxt_get_ulp_msix_base(struct bnxt *bp); int bnxt_get_ulp_msix_base(struct bnxt *bp);
int bnxt_get_ulp_stat_ctxs(struct bnxt *bp); int bnxt_get_ulp_stat_ctxs(struct bnxt *bp);
void bnxt_ulp_stop(struct bnxt *bp); void bnxt_ulp_stop(struct bnxt *bp);
void bnxt_ulp_start(struct bnxt *bp); void bnxt_ulp_start(struct bnxt *bp, int err);
void bnxt_ulp_sriov_cfg(struct bnxt *bp, int num_vfs); void bnxt_ulp_sriov_cfg(struct bnxt *bp, int num_vfs);
void bnxt_ulp_shutdown(struct bnxt *bp); void bnxt_ulp_shutdown(struct bnxt *bp);
void bnxt_ulp_irq_stop(struct bnxt *bp); void bnxt_ulp_irq_stop(struct bnxt *bp);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment