aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMichael Chan <michael.chan@broadcom.com>2018-03-31 13:54:13 -0400
committerDavid S. Miller <davem@davemloft.net>2018-03-31 23:24:19 -0400
commitdb4723b3cd2d836ae44382d16e6a4418ae8929dc (patch)
treeaa615245c7d3f43745658462364bb9ec9660cee5
parent00db3cba35211cd7d458d378a5931fadfa86a17c (diff)
bnxt_en: Check max_tx_scheduler_inputs value from firmware.
When checking for the maximum pre-set TX channels for ethtool -l, we need to check the current max_tx_scheduler_inputs parameter from firmware. This parameter specifies the max input for the internal QoS nodes currently available to this function. The function's TX rings will be capped by this parameter. By adding this logic, we provide a more accurate pre-set max TX channels to the user. 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.c8
-rw-r--r--drivers/net/ethernet/broadcom/bnxt/bnxt.h2
-rw-r--r--drivers/net/ethernet/broadcom/bnxt/bnxt_ethtool.c11
3 files changed, 19 insertions, 2 deletions
diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt.c b/drivers/net/ethernet/broadcom/bnxt/bnxt.c
index 2251327f8cdf..62b7d69cc8e5 100644
--- a/drivers/net/ethernet/broadcom/bnxt/bnxt.c
+++ b/drivers/net/ethernet/broadcom/bnxt/bnxt.c
@@ -5093,7 +5093,7 @@ func_qcfg_exit:
5093 return rc; 5093 return rc;
5094} 5094}
5095 5095
5096static int bnxt_hwrm_func_resc_qcaps(struct bnxt *bp) 5096int bnxt_hwrm_func_resc_qcaps(struct bnxt *bp, bool all)
5097{ 5097{
5098 struct hwrm_func_resource_qcaps_output *resp = bp->hwrm_cmd_resp_addr; 5098 struct hwrm_func_resource_qcaps_output *resp = bp->hwrm_cmd_resp_addr;
5099 struct hwrm_func_resource_qcaps_input req = {0}; 5099 struct hwrm_func_resource_qcaps_input req = {0};
@@ -5110,6 +5110,10 @@ static int bnxt_hwrm_func_resc_qcaps(struct bnxt *bp)
5110 goto hwrm_func_resc_qcaps_exit; 5110 goto hwrm_func_resc_qcaps_exit;
5111 } 5111 }
5112 5112
5113 hw_resc->max_tx_sch_inputs = le16_to_cpu(resp->max_tx_scheduler_inputs);
5114 if (!all)
5115 goto hwrm_func_resc_qcaps_exit;
5116
5113 hw_resc->min_rsscos_ctxs = le16_to_cpu(resp->min_rsscos_ctx); 5117 hw_resc->min_rsscos_ctxs = le16_to_cpu(resp->min_rsscos_ctx);
5114 hw_resc->max_rsscos_ctxs = le16_to_cpu(resp->max_rsscos_ctx); 5118 hw_resc->max_rsscos_ctxs = le16_to_cpu(resp->max_rsscos_ctx);
5115 hw_resc->min_cp_rings = le16_to_cpu(resp->min_cmpl_rings); 5119 hw_resc->min_cp_rings = le16_to_cpu(resp->min_cmpl_rings);
@@ -5216,7 +5220,7 @@ static int bnxt_hwrm_func_qcaps(struct bnxt *bp)
5216 if (rc) 5220 if (rc)
5217 return rc; 5221 return rc;
5218 if (bp->hwrm_spec_code >= 0x10803) { 5222 if (bp->hwrm_spec_code >= 0x10803) {
5219 rc = bnxt_hwrm_func_resc_qcaps(bp); 5223 rc = bnxt_hwrm_func_resc_qcaps(bp, true);
5220 if (!rc) 5224 if (!rc)
5221 bp->flags |= BNXT_FLAG_NEW_RM; 5225 bp->flags |= BNXT_FLAG_NEW_RM;
5222 } 5226 }
diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt.h b/drivers/net/ethernet/broadcom/bnxt/bnxt.h
index 78034b504baa..22aa290c94a0 100644
--- a/drivers/net/ethernet/broadcom/bnxt/bnxt.h
+++ b/drivers/net/ethernet/broadcom/bnxt/bnxt.h
@@ -786,6 +786,7 @@ struct bnxt_hw_resc {
786 u16 min_tx_rings; 786 u16 min_tx_rings;
787 u16 max_tx_rings; 787 u16 max_tx_rings;
788 u16 resv_tx_rings; 788 u16 resv_tx_rings;
789 u16 max_tx_sch_inputs;
789 u16 min_rx_rings; 790 u16 min_rx_rings;
790 u16 max_rx_rings; 791 u16 max_rx_rings;
791 u16 resv_rx_rings; 792 u16 resv_rx_rings;
@@ -1456,6 +1457,7 @@ int bnxt_hwrm_set_pause(struct bnxt *);
1456int bnxt_hwrm_set_link_setting(struct bnxt *, bool, bool); 1457int bnxt_hwrm_set_link_setting(struct bnxt *, bool, bool);
1457int bnxt_hwrm_alloc_wol_fltr(struct bnxt *bp); 1458int bnxt_hwrm_alloc_wol_fltr(struct bnxt *bp);
1458int bnxt_hwrm_free_wol_fltr(struct bnxt *bp); 1459int bnxt_hwrm_free_wol_fltr(struct bnxt *bp);
1460int bnxt_hwrm_func_resc_qcaps(struct bnxt *bp, bool all);
1459int bnxt_hwrm_fw_set_time(struct bnxt *); 1461int bnxt_hwrm_fw_set_time(struct bnxt *);
1460int bnxt_open_nic(struct bnxt *, bool, bool); 1462int bnxt_open_nic(struct bnxt *, bool, bool);
1461int bnxt_half_open_nic(struct bnxt *bp); 1463int bnxt_half_open_nic(struct bnxt *bp);
diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt_ethtool.c b/drivers/net/ethernet/broadcom/bnxt/bnxt_ethtool.c
index e184e4bbe544..8d8ccd67e0e2 100644
--- a/drivers/net/ethernet/broadcom/bnxt/bnxt_ethtool.c
+++ b/drivers/net/ethernet/broadcom/bnxt/bnxt_ethtool.c
@@ -425,15 +425,26 @@ static void bnxt_get_channels(struct net_device *dev,
425 struct ethtool_channels *channel) 425 struct ethtool_channels *channel)
426{ 426{
427 struct bnxt *bp = netdev_priv(dev); 427 struct bnxt *bp = netdev_priv(dev);
428 struct bnxt_hw_resc *hw_resc = &bp->hw_resc;
428 int max_rx_rings, max_tx_rings, tcs; 429 int max_rx_rings, max_tx_rings, tcs;
430 int max_tx_sch_inputs;
431
432 /* Get the most up-to-date max_tx_sch_inputs. */
433 if (bp->flags & BNXT_FLAG_NEW_RM)
434 bnxt_hwrm_func_resc_qcaps(bp, false);
435 max_tx_sch_inputs = hw_resc->max_tx_sch_inputs;
429 436
430 bnxt_get_max_rings(bp, &max_rx_rings, &max_tx_rings, true); 437 bnxt_get_max_rings(bp, &max_rx_rings, &max_tx_rings, true);
438 if (max_tx_sch_inputs)
439 max_tx_rings = min_t(int, max_tx_rings, max_tx_sch_inputs);
431 channel->max_combined = min_t(int, max_rx_rings, max_tx_rings); 440 channel->max_combined = min_t(int, max_rx_rings, max_tx_rings);
432 441
433 if (bnxt_get_max_rings(bp, &max_rx_rings, &max_tx_rings, false)) { 442 if (bnxt_get_max_rings(bp, &max_rx_rings, &max_tx_rings, false)) {
434 max_rx_rings = 0; 443 max_rx_rings = 0;
435 max_tx_rings = 0; 444 max_tx_rings = 0;
436 } 445 }
446 if (max_tx_sch_inputs)
447 max_tx_rings = min_t(int, max_tx_rings, max_tx_sch_inputs);
437 448
438 tcs = netdev_get_num_tc(dev); 449 tcs = netdev_get_num_tc(dev);
439 if (tcs > 1) 450 if (tcs > 1)