#include <linux/kernel.h>
 #include <linux/err.h>
+#include <linux/sfp.h>
 
 #include "core.h"
 #include "core_env.h"
 {
        u8 module_info[MLXSW_REG_MCIA_EEPROM_MODULE_INFO_SIZE];
        u16 offset = MLXSW_REG_MCIA_EEPROM_MODULE_INFO_SIZE;
-       u8 module_rev_id, module_id;
+       u8 module_rev_id, module_id, diag_mon;
        unsigned int read_size;
        int err;
 
                }
                break;
        case MLXSW_REG_MCIA_EEPROM_MODULE_INFO_ID_SFP:
+               /* Verify if transceiver provides diagnostic monitoring page */
+               err = mlxsw_env_query_module_eeprom(mlxsw_core, module,
+                                                   SFP_DIAGMON, 1, &diag_mon,
+                                                   &read_size);
+               if (err)
+                       return err;
+
+               if (read_size < 1)
+                       return -EIO;
+
                modinfo->type       = ETH_MODULE_SFF_8472;
-               modinfo->eeprom_len = ETH_MODULE_SFF_8472_LEN;
+               if (diag_mon)
+                       modinfo->eeprom_len = ETH_MODULE_SFF_8472_LEN;
+               else
+                       modinfo->eeprom_len = ETH_MODULE_SFF_8472_LEN / 2;
                break;
        default:
                return -EINVAL;