aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMichael Chan <michael.chan@broadcom.com>2018-08-05 16:51:55 -0400
committerDavid S. Miller <davem@davemloft.net>2018-08-05 20:08:26 -0400
commit25e1acd6b92bde36c03273d883c44c4d0e8995e6 (patch)
tree2bf38672b7d71bd49e7e3ac4a99f40fa4781b5d3
parent97381a1831124c95801fbfaba8436b4abc7d03f5 (diff)
bnxt_en: Notify firmware about IF state changes.
Use latest firmware API to notify firmware about IF state changes. Firmware has the option to clean up resources during IF down and to require the driver to reserve resources again during IF up. 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.c53
-rw-r--r--drivers/net/ethernet/broadcom/bnxt/bnxt.h1
2 files changed, 52 insertions, 2 deletions
diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt.c b/drivers/net/ethernet/broadcom/bnxt/bnxt.c
index 165994047f81..56bd09758e22 100644
--- a/drivers/net/ethernet/broadcom/bnxt/bnxt.c
+++ b/drivers/net/ethernet/broadcom/bnxt/bnxt.c
@@ -3638,7 +3638,9 @@ int bnxt_hwrm_func_rgtr_async_events(struct bnxt *bp, unsigned long *bmap,
3638 3638
3639static int bnxt_hwrm_func_drv_rgtr(struct bnxt *bp) 3639static int bnxt_hwrm_func_drv_rgtr(struct bnxt *bp)
3640{ 3640{
3641 struct hwrm_func_drv_rgtr_output *resp = bp->hwrm_cmd_resp_addr;
3641 struct hwrm_func_drv_rgtr_input req = {0}; 3642 struct hwrm_func_drv_rgtr_input req = {0};
3643 int rc;
3642 3644
3643 bnxt_hwrm_cmd_hdr_init(bp, &req, HWRM_FUNC_DRV_RGTR, -1, -1); 3645 bnxt_hwrm_cmd_hdr_init(bp, &req, HWRM_FUNC_DRV_RGTR, -1, -1);
3644 3646
@@ -3676,7 +3678,15 @@ static int bnxt_hwrm_func_drv_rgtr(struct bnxt *bp)
3676 cpu_to_le32(FUNC_DRV_RGTR_REQ_ENABLES_VF_REQ_FWD); 3678 cpu_to_le32(FUNC_DRV_RGTR_REQ_ENABLES_VF_REQ_FWD);
3677 } 3679 }
3678 3680
3679 return hwrm_send_message(bp, &req, sizeof(req), HWRM_CMD_TIMEOUT); 3681 mutex_lock(&bp->hwrm_cmd_lock);
3682 rc = _hwrm_send_message(bp, &req, sizeof(req), HWRM_CMD_TIMEOUT);
3683 if (rc)
3684 rc = -EIO;
3685 else if (resp->flags &
3686 cpu_to_le32(FUNC_DRV_RGTR_RESP_FLAGS_IF_CHANGE_SUPPORTED))
3687 bp->fw_cap |= BNXT_FW_CAP_IF_CHANGE;
3688 mutex_unlock(&bp->hwrm_cmd_lock);
3689 return rc;
3680} 3690}
3681 3691
3682static int bnxt_hwrm_func_drv_unrgtr(struct bnxt *bp) 3692static int bnxt_hwrm_func_drv_unrgtr(struct bnxt *bp)
@@ -6637,6 +6647,39 @@ static int bnxt_hwrm_shutdown_link(struct bnxt *bp)
6637 return hwrm_send_message(bp, &req, sizeof(req), HWRM_CMD_TIMEOUT); 6647 return hwrm_send_message(bp, &req, sizeof(req), HWRM_CMD_TIMEOUT);
6638} 6648}
6639 6649
6650static int bnxt_hwrm_if_change(struct bnxt *bp, bool up)
6651{
6652 struct hwrm_func_drv_if_change_output *resp = bp->hwrm_cmd_resp_addr;
6653 struct hwrm_func_drv_if_change_input req = {0};
6654 bool resc_reinit = false;
6655 int rc;
6656
6657 if (!(bp->fw_cap & BNXT_FW_CAP_IF_CHANGE))
6658 return 0;
6659
6660 bnxt_hwrm_cmd_hdr_init(bp, &req, HWRM_FUNC_DRV_IF_CHANGE, -1, -1);
6661 if (up)
6662 req.flags = cpu_to_le32(FUNC_DRV_IF_CHANGE_REQ_FLAGS_UP);
6663 mutex_lock(&bp->hwrm_cmd_lock);
6664 rc = _hwrm_send_message(bp, &req, sizeof(req), HWRM_CMD_TIMEOUT);
6665 if (!rc && (resp->flags &
6666 cpu_to_le32(FUNC_DRV_IF_CHANGE_RESP_FLAGS_RESC_CHANGE)))
6667 resc_reinit = true;
6668 mutex_unlock(&bp->hwrm_cmd_lock);
6669
6670 if (up && resc_reinit && BNXT_NEW_RM(bp)) {
6671 struct bnxt_hw_resc *hw_resc = &bp->hw_resc;
6672
6673 rc = bnxt_hwrm_func_resc_qcaps(bp, true);
6674 hw_resc->resv_cp_rings = 0;
6675 hw_resc->resv_tx_rings = 0;
6676 hw_resc->resv_rx_rings = 0;
6677 hw_resc->resv_hw_ring_grps = 0;
6678 hw_resc->resv_vnics = 0;
6679 }
6680 return rc;
6681}
6682
6640static int bnxt_hwrm_port_led_qcaps(struct bnxt *bp) 6683static int bnxt_hwrm_port_led_qcaps(struct bnxt *bp)
6641{ 6684{
6642 struct hwrm_port_led_qcaps_output *resp = bp->hwrm_cmd_resp_addr; 6685 struct hwrm_port_led_qcaps_output *resp = bp->hwrm_cmd_resp_addr;
@@ -6991,8 +7034,13 @@ void bnxt_half_close_nic(struct bnxt *bp)
6991static int bnxt_open(struct net_device *dev) 7034static int bnxt_open(struct net_device *dev)
6992{ 7035{
6993 struct bnxt *bp = netdev_priv(dev); 7036 struct bnxt *bp = netdev_priv(dev);
7037 int rc;
6994 7038
6995 return __bnxt_open_nic(bp, true, true); 7039 bnxt_hwrm_if_change(bp, true);
7040 rc = __bnxt_open_nic(bp, true, true);
7041 if (rc)
7042 bnxt_hwrm_if_change(bp, false);
7043 return rc;
6996} 7044}
6997 7045
6998static bool bnxt_drv_busy(struct bnxt *bp) 7046static bool bnxt_drv_busy(struct bnxt *bp)
@@ -7056,6 +7104,7 @@ static int bnxt_close(struct net_device *dev)
7056 7104
7057 bnxt_close_nic(bp, true, true); 7105 bnxt_close_nic(bp, true, true);
7058 bnxt_hwrm_shutdown_link(bp); 7106 bnxt_hwrm_shutdown_link(bp);
7107 bnxt_hwrm_if_change(bp, false);
7059 return 0; 7108 return 0;
7060} 7109}
7061 7110
diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt.h b/drivers/net/ethernet/broadcom/bnxt/bnxt.h
index ded2affd9ee8..6c40b25716d3 100644
--- a/drivers/net/ethernet/broadcom/bnxt/bnxt.h
+++ b/drivers/net/ethernet/broadcom/bnxt/bnxt.h
@@ -1290,6 +1290,7 @@ struct bnxt {
1290 #define BNXT_FW_CAP_LLDP_AGENT 0x00000002 1290 #define BNXT_FW_CAP_LLDP_AGENT 0x00000002
1291 #define BNXT_FW_CAP_DCBX_AGENT 0x00000004 1291 #define BNXT_FW_CAP_DCBX_AGENT 0x00000004
1292 #define BNXT_FW_CAP_NEW_RM 0x00000008 1292 #define BNXT_FW_CAP_NEW_RM 0x00000008
1293 #define BNXT_FW_CAP_IF_CHANGE 0x00000010
1293 1294
1294#define BNXT_NEW_RM(bp) ((bp)->fw_cap & BNXT_FW_CAP_NEW_RM) 1295#define BNXT_NEW_RM(bp) ((bp)->fw_cap & BNXT_FW_CAP_NEW_RM)
1295 u32 hwrm_spec_code; 1296 u32 hwrm_spec_code;