bnxt_en: Pass correct extended TX port statistics size to firmware. [Linux 5.1]

bnxt_en: Pass correct extended TX port statistics size to firmware. [Linux 5.1]

This Linux kernel change "bnxt_en: Pass correct extended TX port statistics size to firmware" is included in the Linux 5.1 release. This change is authored by Michael Chan <michael.chan [at] broadcom.com> on Thu Apr 25 22:31:53 2019 -0400. The commit for this change in Linux stable tree is ad361ad (patch).

bnxt_en: Pass correct extended TX port statistics size to firmware.

If driver determines that extended TX port statistics are not supported
or allocation of the data structure fails, make sure to pass 0 TX stats
size to firmware to disable it.  The firmware returned TX stats size should
also be set to 0 for consistency.  This will prevent
bnxt_get_ethtool_stats() from accessing the NULL TX stats pointer in
case there is mismatch between firmware and driver.

Fixes: 36e53349b60b ("bnxt_en: Add additional extended port statistics.")
Signed-off-by: Michael Chan <michael.chan@broadcom.com>
Signed-off-by: David S. Miller <davem@davemloft.net>

There are 8 lines of Linux source code added/deleted in this change. Code changes to Linux kernel are as follows.

 drivers/net/ethernet/broadcom/bnxt/bnxt.c | 8 ++++++--
 1 file changed, 6 insertions(+), 2 deletions(-)

diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt.c b/drivers/net/ethernet/broadcom/bnxt/bnxt.c
index b03669f..a9172b2 100644
--- a/drivers/net/ethernet/broadcom/bnxt/bnxt.c
+++ b/drivers/net/ethernet/broadcom/bnxt/bnxt.c
@@ -6753,6 +6753,7 @@ static int bnxt_hwrm_port_qstats_ext(struct bnxt *bp)
    struct hwrm_queue_pri2cos_qcfg_input req2 = {0};
    struct hwrm_port_qstats_ext_input req = {0};
    struct bnxt_pf_info *pf = &bp->pf;
+   u32 tx_stat_size;
    int rc;

    if (!(bp->flags & BNXT_FLAG_PORT_STATS_EXT))
@@ -6762,13 +6763,16 @@ static int bnxt_hwrm_port_qstats_ext(struct bnxt *bp)
    req.port_id = cpu_to_le16(pf->port_id);
    req.rx_stat_size = cpu_to_le16(sizeof(struct rx_port_stats_ext));
    req.rx_stat_host_addr = cpu_to_le64(bp->hw_rx_port_stats_ext_map);
-   req.tx_stat_size = cpu_to_le16(sizeof(struct tx_port_stats_ext));
+   tx_stat_size = bp->hw_tx_port_stats_ext ?
+              sizeof(*bp->hw_tx_port_stats_ext) : 0;
+   req.tx_stat_size = cpu_to_le16(tx_stat_size);
    req.tx_stat_host_addr = cpu_to_le64(bp->hw_tx_port_stats_ext_map);
    mutex_lock(&bp->hwrm_cmd_lock);
    rc = _hwrm_send_message(bp, &req, sizeof(req), HWRM_CMD_TIMEOUT);
    if (!rc) {
        bp->fw_rx_stats_ext_size = le16_to_cpu(resp->rx_stat_size) / 8;
-       bp->fw_tx_stats_ext_size = le16_to_cpu(resp->tx_stat_size) / 8;
+       bp->fw_tx_stats_ext_size = tx_stat_size ?
+           le16_to_cpu(resp->tx_stat_size) / 8 : 0;
    } else {
        bp->fw_rx_stats_ext_size = 0;
        bp->fw_tx_stats_ext_size = 0;

Leave a Reply

Your email address will not be published. Required fields are marked *