aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMichael Chan <michael.chan@broadcom.com>2018-01-17 03:21:05 -0500
committerDavid S. Miller <davem@davemloft.net>2018-01-17 14:48:25 -0500
commit80fcaf46c09262a71f32bb577c976814c922f864 (patch)
tree67e70abbb61b0d903f4cc121ce60c2d3b5549fdf
parent86e953db0114f396f916344395160aa267bf2627 (diff)
bnxt_en: Restore MSIX after disabling SRIOV.
After SRIOV has been enabled and disabled, the MSIX vectors assigned to the VFs have to be re-initialized. Otherwise they cannot be re-used by the PF. For example, increasing the number of PF rings after disabling SRIOV may fail if the PF uses MSIX vectors previously assigned to the VFs. To fix this, we add logic in bnxt_restore_pf_fw_resources() to close the NIC, clear and re-init MSIX, and re-open the NIC. Signed-off-by: Michael Chan <michael.chan@broadcom.com> Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r--drivers/net/ethernet/broadcom/bnxt/bnxt.c16
-rw-r--r--drivers/net/ethernet/broadcom/bnxt/bnxt.h2
2 files changed, 15 insertions, 3 deletions
diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt.c b/drivers/net/ethernet/broadcom/bnxt/bnxt.c
index 0833a5398958..f759b702e2a0 100644
--- a/drivers/net/ethernet/broadcom/bnxt/bnxt.c
+++ b/drivers/net/ethernet/broadcom/bnxt/bnxt.c
@@ -8061,11 +8061,23 @@ static int bnxt_set_dflt_rings(struct bnxt *bp, bool sh)
8061 return rc; 8061 return rc;
8062} 8062}
8063 8063
8064void bnxt_restore_pf_fw_resources(struct bnxt *bp) 8064int bnxt_restore_pf_fw_resources(struct bnxt *bp)
8065{ 8065{
8066 int rc;
8067
8066 ASSERT_RTNL(); 8068 ASSERT_RTNL();
8069 if (bnxt_ulp_registered(bp->edev, BNXT_ROCE_ULP))
8070 return 0;
8071
8067 bnxt_hwrm_func_qcaps(bp); 8072 bnxt_hwrm_func_qcaps(bp);
8068 bnxt_subtract_ulp_resources(bp, BNXT_ROCE_ULP); 8073 __bnxt_close_nic(bp, true, false);
8074 bnxt_clear_int_mode(bp);
8075 rc = bnxt_init_int_mode(bp);
8076 if (rc)
8077 dev_close(bp->dev);
8078 else
8079 rc = bnxt_open_nic(bp, true, false);
8080 return rc;
8069} 8081}
8070 8082
8071static int bnxt_init_mac_addr(struct bnxt *bp) 8083static int bnxt_init_mac_addr(struct bnxt *bp)
diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt.h b/drivers/net/ethernet/broadcom/bnxt/bnxt.h
index 6ef222b7fa71..42a7b21bd302 100644
--- a/drivers/net/ethernet/broadcom/bnxt/bnxt.h
+++ b/drivers/net/ethernet/broadcom/bnxt/bnxt.h
@@ -1432,7 +1432,7 @@ int bnxt_check_rings(struct bnxt *bp, int tx, int rx, bool sh, int tcs,
1432 int tx_xdp); 1432 int tx_xdp);
1433int bnxt_setup_mq_tc(struct net_device *dev, u8 tc); 1433int bnxt_setup_mq_tc(struct net_device *dev, u8 tc);
1434int bnxt_get_max_rings(struct bnxt *, int *, int *, bool); 1434int bnxt_get_max_rings(struct bnxt *, int *, int *, bool);
1435void bnxt_restore_pf_fw_resources(struct bnxt *bp); 1435int bnxt_restore_pf_fw_resources(struct bnxt *bp);
1436int bnxt_port_attr_get(struct bnxt *bp, struct switchdev_attr *attr); 1436int bnxt_port_attr_get(struct bnxt *bp, struct switchdev_attr *attr);
1437void bnxt_dim_work(struct work_struct *work); 1437void bnxt_dim_work(struct work_struct *work);
1438int bnxt_hwrm_set_ring_coal(struct bnxt *bp, struct bnxt_napi *bnapi); 1438int bnxt_hwrm_set_ring_coal(struct bnxt *bp, struct bnxt_napi *bnapi);