From: Vasundhara Volam <vasundhara-v.vo...@broadcom.com>

For SFP+ modules, 0xA2 page is available only when Diagnostic Monitoring
Type [Address A0h, Byte 92] is implemented. Extend bnxt_get_module_info(),
to read optical diagnostics support at offset 92(0x5c) and set eeprom_len
length to ETH_MODULE_SFF_8436_LEN (to exclude A2 page), if dianostics is
not supported.

Also in bnxt_get_module_info(), module id is read from offset 0x5e which
is not correct. It was working by accident, as offset was not effective
without setting enables flag in the firmware request. SFP module id is
present at location 0. Fix this by removing the offset and read it
from location 0.

Signed-off-by: Vasundhara Volam <vasundhara-v.vo...@broadcom.com>
Signed-off-by: Michael Chan <michael.c...@broadcom.com>
---
 drivers/net/ethernet/broadcom/bnxt/bnxt.h         |  3 +--
 drivers/net/ethernet/broadcom/bnxt/bnxt_ethtool.c | 20 ++++++++------------
 2 files changed, 9 insertions(+), 14 deletions(-)

diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt.h 
b/drivers/net/ethernet/broadcom/bnxt/bnxt.h
index a9c210e..9b14eb6 100644
--- a/drivers/net/ethernet/broadcom/bnxt/bnxt.h
+++ b/drivers/net/ethernet/broadcom/bnxt/bnxt.h
@@ -1414,8 +1414,7 @@ struct bnxt {
 
 #define I2C_DEV_ADDR_A0                                0xa0
 #define I2C_DEV_ADDR_A2                                0xa2
-#define SFP_EEPROM_SFF_8472_COMP_ADDR          0x5e
-#define SFP_EEPROM_SFF_8472_COMP_SIZE          1
+#define SFF_DIAG_SUPPORT_OFFSET                        0x5c
 #define SFF_MODULE_ID_SFP                      0x3
 #define SFF_MODULE_ID_QSFP                     0xc
 #define SFF_MODULE_ID_QSFP_PLUS                        0xd
diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt_ethtool.c 
b/drivers/net/ethernet/broadcom/bnxt/bnxt_ethtool.c
index ad98b78..7270c8b 100644
--- a/drivers/net/ethernet/broadcom/bnxt/bnxt_ethtool.c
+++ b/drivers/net/ethernet/broadcom/bnxt/bnxt_ethtool.c
@@ -2184,9 +2184,8 @@ static int bnxt_read_sfp_module_eeprom_info(struct bnxt 
*bp, u16 i2c_addr,
 static int bnxt_get_module_info(struct net_device *dev,
                                struct ethtool_modinfo *modinfo)
 {
+       u8 data[SFF_DIAG_SUPPORT_OFFSET + 1];
        struct bnxt *bp = netdev_priv(dev);
-       struct hwrm_port_phy_i2c_read_input req = {0};
-       struct hwrm_port_phy_i2c_read_output *output = bp->hwrm_cmd_resp_addr;
        int rc;
 
        /* No point in going further if phy status indicates
@@ -2201,21 +2200,19 @@ static int bnxt_get_module_info(struct net_device *dev,
        if (bp->hwrm_spec_code < 0x10202)
                return -EOPNOTSUPP;
 
-       bnxt_hwrm_cmd_hdr_init(bp, &req, HWRM_PORT_PHY_I2C_READ, -1, -1);
-       req.i2c_slave_addr = I2C_DEV_ADDR_A0;
-       req.page_number = 0;
-       req.page_offset = cpu_to_le16(SFP_EEPROM_SFF_8472_COMP_ADDR);
-       req.data_length = SFP_EEPROM_SFF_8472_COMP_SIZE;
-       req.port_id = cpu_to_le16(bp->pf.port_id);
-       mutex_lock(&bp->hwrm_cmd_lock);
-       rc = _hwrm_send_message(bp, &req, sizeof(req), HWRM_CMD_TIMEOUT);
+       rc = bnxt_read_sfp_module_eeprom_info(bp, I2C_DEV_ADDR_A0, 0, 0,
+                                             SFF_DIAG_SUPPORT_OFFSET + 1,
+                                             data);
        if (!rc) {
-               u32 module_id = le32_to_cpu(output->data[0]);
+               u8 module_id = data[0];
+               u8 diag_supported = data[SFF_DIAG_SUPPORT_OFFSET];
 
                switch (module_id) {
                case SFF_MODULE_ID_SFP:
                        modinfo->type = ETH_MODULE_SFF_8472;
                        modinfo->eeprom_len = ETH_MODULE_SFF_8472_LEN;
+                       if (!diag_supported)
+                               modinfo->eeprom_len = ETH_MODULE_SFF_8436_LEN;
                        break;
                case SFF_MODULE_ID_QSFP:
                case SFF_MODULE_ID_QSFP_PLUS:
@@ -2231,7 +2228,6 @@ static int bnxt_get_module_info(struct net_device *dev,
                        break;
                }
        }
-       mutex_unlock(&bp->hwrm_cmd_lock);
        return rc;
 }
 
-- 
1.8.3.1

Reply via email to