lkml.org 
[lkml]   [2019]   [Jan]   [28]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH AUTOSEL 4.19 171/258] bnxt_en: Disable MSIX before re-reserving NQs/CMPL rings.
    Date
    From: Michael Chan <michael.chan@broadcom.com>

    [ Upstream commit 36d65be9a88052cdfc8524eb591baf0e6c878408 ]

    When bringing up a device, the code checks to see if the number of
    MSIX has changed. pci_disable_msix() should be called first before
    changing the number of reserved NQs/CMPL rings. This ensures that
    the MSIX vectors associated with the NQs/CMPL rings are still
    properly mapped when pci_disable_msix() masks the vectors.

    This patch will prevent errors when RDMA support is added for the new
    57500 chips. When the RDMA driver shuts down, the number of NQs is
    decreased and we must use the new sequence to prevent MSIX errors.

    Signed-off-by: Michael Chan <michael.chan@broadcom.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    drivers/net/ethernet/broadcom/bnxt/bnxt.c | 19 +++++++++++--------
    1 file changed, 11 insertions(+), 8 deletions(-)

    diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt.c b/drivers/net/ethernet/broadcom/bnxt/bnxt.c
    index e2d92548226a..034f57500f00 100644
    --- a/drivers/net/ethernet/broadcom/bnxt/bnxt.c
    +++ b/drivers/net/ethernet/broadcom/bnxt/bnxt.c
    @@ -6073,23 +6073,26 @@ static void bnxt_clear_int_mode(struct bnxt *bp)
    int bnxt_reserve_rings(struct bnxt *bp)
    {
    int tcs = netdev_get_num_tc(bp->dev);
    + bool reinit_irq = false;
    int rc;

    if (!bnxt_need_reserve_rings(bp))
    return 0;

    - rc = __bnxt_reserve_rings(bp);
    - if (rc) {
    - netdev_err(bp->dev, "ring reservation failure rc: %d\n", rc);
    - return rc;
    - }
    if (BNXT_NEW_RM(bp) && (bnxt_get_num_msix(bp) != bp->total_irqs)) {
    bnxt_ulp_irq_stop(bp);
    bnxt_clear_int_mode(bp);
    - rc = bnxt_init_int_mode(bp);
    + reinit_irq = true;
    + }
    + rc = __bnxt_reserve_rings(bp);
    + if (reinit_irq) {
    + if (!rc)
    + rc = bnxt_init_int_mode(bp);
    bnxt_ulp_irq_restart(bp, rc);
    - if (rc)
    - return rc;
    + }
    + if (rc) {
    + netdev_err(bp->dev, "ring reservation/IRQ init failure rc: %d\n", rc);
    + return rc;
    }
    if (tcs && (bp->tx_nr_rings_per_tc * tcs != bp->tx_nr_rings)) {
    netdev_err(bp->dev, "tx ring reservation failure\n");
    --
    2.19.1
    \
     
     \ /
      Last update: 2019-01-28 18:15    [W:4.125 / U:0.120 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site