bnx2x: Check if transceiver implements DDM before access
authorMauro S. M. Rodrigues <maurosr@linux.vnet.ibm.com>
Thu, 13 Jun 2019 19:25:40 +0000 (16:25 -0300)
committerDavid S. Miller <davem@davemloft.net>
Tue, 18 Jun 2019 17:02:40 +0000 (10:02 -0700)
Some transceivers may comply with SFF-8472 even though they do not
implement the Digital Diagnostic Monitoring (DDM) interface described in
the spec. The existence of such area is specified by the 6th bit of byte
92, set to 1 if implemented.

Currently, without checking this bit, bnx2x fails trying to read sfp
module's EEPROM with the follow message:

ethtool -m enP5p1s0f1
Cannot get Module EEPROM data: Input/output error

Because it fails to read the additional 256 bytes in which it is assumed
to exist the DDM data.

This issue was noticed using a Mellanox Passive DAC PN 01FT738. The EEPROM
data was confirmed by Mellanox as correct and similar to other Passive
DACs from other manufacturers.

Signed-off-by: Mauro S. M. Rodrigues <maurosr@linux.vnet.ibm.com>
Acked-by: Sudarsana Reddy Kalluru <skalluru@marvell.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/broadcom/bnx2x/bnx2x_ethtool.c
drivers/net/ethernet/broadcom/bnx2x/bnx2x_link.h

index 0745cccd416db7fe71c7bdb7cbe67d2956008064..51fc845de31adca502a86cbd5e83403a830bf626 100644 (file)
@@ -1609,7 +1609,8 @@ static int bnx2x_get_module_info(struct net_device *dev,
        }
 
        if (!sff8472_comp ||
-           (diag_type & SFP_EEPROM_DIAG_ADDR_CHANGE_REQ)) {
+           (diag_type & SFP_EEPROM_DIAG_ADDR_CHANGE_REQ) ||
+           !(diag_type & SFP_EEPROM_DDM_IMPLEMENTED)) {
                modinfo->type = ETH_MODULE_SFF_8079;
                modinfo->eeprom_len = ETH_MODULE_SFF_8079_LEN;
        } else {
index b7d251108c19f56345304d88097619a58b08b8e4..7115f502566458480bf4f73a01cc83e33545c486 100644 (file)
@@ -62,6 +62,7 @@
 #define SFP_EEPROM_DIAG_TYPE_ADDR              0x5c
 #define SFP_EEPROM_DIAG_TYPE_SIZE              1
 #define SFP_EEPROM_DIAG_ADDR_CHANGE_REQ                (1<<2)
+#define SFP_EEPROM_DDM_IMPLEMENTED             (1<<6)
 #define SFP_EEPROM_SFF_8472_COMP_ADDR          0x5e
 #define SFP_EEPROM_SFF_8472_COMP_SIZE          1