|
|
@@ -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");
|