bnxt_en: Add the new firmware API to query hardware resources.
authorMichael Chan <michael.chan@broadcom.com>
Wed, 17 Jan 2018 08:21:07 +0000 (03:21 -0500)
committerDavid S. Miller <davem@davemloft.net>
Wed, 17 Jan 2018 19:48:26 +0000 (14:48 -0500)
The new API HWRM_FUNC_RESOURCE_QCAPS provides min and max hardware
resources.  Use the new API when it is supported by firmware.

Signed-off-by: Michael Chan <michael.chan@broadcom.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/broadcom/bnxt/bnxt.c
drivers/net/ethernet/broadcom/bnxt/bnxt.h

index dce4af94146b39bd9d614253bd7945d790cbd847..f87e0bd14632ad9592dfa8d4bee50df38509ba48 100644 (file)
@@ -4791,7 +4791,46 @@ func_qcfg_exit:
        return rc;
 }
 
-static int bnxt_hwrm_func_qcaps(struct bnxt *bp)
+static int bnxt_hwrm_func_resc_qcaps(struct bnxt *bp)
+{
+       struct hwrm_func_resource_qcaps_output *resp = bp->hwrm_cmd_resp_addr;
+       struct hwrm_func_resource_qcaps_input req = {0};
+       struct bnxt_hw_resc *hw_resc = &bp->hw_resc;
+       int rc;
+
+       bnxt_hwrm_cmd_hdr_init(bp, &req, HWRM_FUNC_RESOURCE_QCAPS, -1, -1);
+       req.fid = cpu_to_le16(0xffff);
+
+       mutex_lock(&bp->hwrm_cmd_lock);
+       rc = _hwrm_send_message(bp, &req, sizeof(req), HWRM_CMD_TIMEOUT);
+       if (rc) {
+               rc = -EIO;
+               goto hwrm_func_resc_qcaps_exit;
+       }
+
+       hw_resc->min_rsscos_ctxs = le16_to_cpu(resp->min_rsscos_ctx);
+       hw_resc->max_rsscos_ctxs = le16_to_cpu(resp->max_rsscos_ctx);
+       hw_resc->min_cp_rings = le16_to_cpu(resp->min_cmpl_rings);
+       hw_resc->max_cp_rings = le16_to_cpu(resp->max_cmpl_rings);
+       hw_resc->min_tx_rings = le16_to_cpu(resp->min_tx_rings);
+       hw_resc->max_tx_rings = le16_to_cpu(resp->max_tx_rings);
+       hw_resc->min_rx_rings = le16_to_cpu(resp->min_rx_rings);
+       hw_resc->max_rx_rings = le16_to_cpu(resp->max_rx_rings);
+       hw_resc->min_hw_ring_grps = le16_to_cpu(resp->min_hw_ring_grps);
+       hw_resc->max_hw_ring_grps = le16_to_cpu(resp->max_hw_ring_grps);
+       hw_resc->min_l2_ctxs = le16_to_cpu(resp->min_l2_ctxs);
+       hw_resc->max_l2_ctxs = le16_to_cpu(resp->max_l2_ctxs);
+       hw_resc->min_vnics = le16_to_cpu(resp->min_vnics);
+       hw_resc->max_vnics = le16_to_cpu(resp->max_vnics);
+       hw_resc->min_stat_ctxs = le16_to_cpu(resp->min_stat_ctx);
+       hw_resc->max_stat_ctxs = le16_to_cpu(resp->max_stat_ctx);
+
+hwrm_func_resc_qcaps_exit:
+       mutex_unlock(&bp->hwrm_cmd_lock);
+       return rc;
+}
+
+static int __bnxt_hwrm_func_qcaps(struct bnxt *bp)
 {
        int rc = 0;
        struct hwrm_func_qcaps_input req = {0};
@@ -4859,6 +4898,21 @@ hwrm_func_qcaps_exit:
        return rc;
 }
 
+static int bnxt_hwrm_func_qcaps(struct bnxt *bp)
+{
+       int rc;
+
+       rc = __bnxt_hwrm_func_qcaps(bp);
+       if (rc)
+               return rc;
+       if (bp->hwrm_spec_code >= 0x10803) {
+               rc = bnxt_hwrm_func_resc_qcaps(bp);
+               if (!rc)
+                       bp->flags |= BNXT_FLAG_NEW_RM;
+       }
+       return 0;
+}
+
 static int bnxt_hwrm_func_reset(struct bnxt *bp)
 {
        struct hwrm_func_reset_input req = {0};
index b8446159a7450329c5d86b2625d35235d6d71e45..9d1298505e43b04147a0ac747d7307082c7b5d32 100644 (file)
@@ -1144,6 +1144,7 @@ struct bnxt {
        #define BNXT_FLAG_FW_DCBX_AGENT 0x800000
        #define BNXT_FLAG_CHIP_NITRO_A0 0x1000000
        #define BNXT_FLAG_DIM           0x2000000
+       #define BNXT_FLAG_NEW_RM        0x8000000
 
        #define BNXT_FLAG_ALL_CONFIG_FEATS (BNXT_FLAG_TPA |             \
                                            BNXT_FLAG_RFS |             \