/* Filter for default vnic 0 */
        rc = bnxt_hwrm_set_vnic_filter(bp, 0, 0, bp->dev->dev_addr);
        if (rc) {
-               netdev_err(bp->dev, "HWRM vnic filter failure rc: %x\n", rc);
+               if (BNXT_VF(bp) && rc == -ENODEV)
+                       netdev_err(bp->dev, "Cannot configure L2 filter while PF is unavailable\n");
+               else
+                       netdev_err(bp->dev, "HWRM vnic filter failure rc: %x\n", rc);
                goto err_out;
        }
        vnic->uc_filter_count = 1;
        rc = hwrm_req_send(bp, req);
        if (rc) {
                hwrm_req_drop(bp, req);
+               if (BNXT_VF(bp) && rc == -ENODEV) {
+                       netdev_warn(bp->dev, "Cannot obtain link state while PF unavailable.\n");
+                       rc = 0;
+               }
                return rc;
        }
 
        for (i = 1, off = 0; i < vnic->uc_filter_count; i++, off += ETH_ALEN) {
                rc = bnxt_hwrm_set_vnic_filter(bp, 0, i, vnic->uc_list + off);
                if (rc) {
-                       netdev_err(bp->dev, "HWRM vnic filter failure rc: %x\n",
-                                  rc);
+                       if (BNXT_VF(bp) && rc == -ENODEV) {
+                               if (!test_and_set_bit(BNXT_STATE_L2_FILTER_RETRY, &bp->state))
+                                       netdev_warn(bp->dev, "Cannot configure L2 filters while PF is unavailable, will retry\n");
+                               else
+                                       netdev_dbg(bp->dev, "PF still unavailable while configuring L2 filters.\n");
+                               rc = 0;
+                       } else {
+                               netdev_err(bp->dev, "HWRM vnic filter failure rc: %x\n", rc);
+                       }
                        vnic->uc_filter_count = i;
                        return rc;
                }
        }
+       if (test_and_clear_bit(BNXT_STATE_L2_FILTER_RETRY, &bp->state))
+               netdev_notice(bp->dev, "Retry of L2 filter configuration successful.\n");
 
 skip_uc:
        if ((vnic->rx_mask & CFA_L2_SET_RX_MASK_REQ_MASK_PROMISCUOUS) &&
                }
        }
 
+       if (test_bit(BNXT_STATE_L2_FILTER_RETRY, &bp->state)) {
+               set_bit(BNXT_RX_MASK_SP_EVENT, &bp->sp_event);
+               bnxt_queue_sp_work(bp);
+       }
+
        if ((bp->flags & BNXT_FLAG_CHIP_P5) && !bp->chip_rev &&
            netif_carrier_ok(dev)) {
                set_bit(BNXT_RING_COAL_NOW_SP_EVENT, &bp->sp_event);
        bp->tx_nr_rings = bp->tx_nr_rings_per_tc;
 
        rc = __bnxt_reserve_rings(bp);
-       if (rc)
+       if (rc && rc != -ENODEV)
                netdev_warn(bp->dev, "Unable to reserve tx rings\n");
        bp->tx_nr_rings_per_tc = bp->tx_nr_rings;
        if (sh)
        /* Rings may have been trimmed, re-reserve the trimmed rings. */
        if (bnxt_need_reserve_rings(bp)) {
                rc = __bnxt_reserve_rings(bp);
-               if (rc)
+               if (rc && rc != -ENODEV)
                        netdev_warn(bp->dev, "2nd rings reservation failed.\n");
                bp->tx_nr_rings_per_tc = bp->tx_nr_rings;
        }
        bnxt_clear_int_mode(bp);
        rc = bnxt_set_dflt_rings(bp, true);
        if (rc) {
-               netdev_err(bp->dev, "Not enough rings available.\n");
+               if (BNXT_VF(bp) && rc == -ENODEV)
+                       netdev_err(bp->dev, "Cannot configure VF rings while PF is unavailable.\n");
+               else
+                       netdev_err(bp->dev, "Not enough rings available.\n");
                goto init_dflt_ring_err;
        }
        rc = bnxt_init_int_mode(bp);
        bnxt_set_ring_params(bp);
        rc = bnxt_set_dflt_rings(bp, true);
        if (rc) {
-               netdev_err(bp->dev, "Not enough rings available.\n");
-               rc = -ENOMEM;
+               if (BNXT_VF(bp) && rc == -ENODEV) {
+                       netdev_err(bp->dev, "Cannot configure VF rings while PF is unavailable.\n");
+               } else {
+                       netdev_err(bp->dev, "Not enough rings available.\n");
+                       rc = -ENOMEM;
+               }
                goto init_err_pci_clean;
        }