const struct mlxsw_bus_info *bus_info;
        u8 max_module_count; /* Maximum number of modules per-slot. */
        u8 num_of_slots; /* Including the main board. */
+       u8 max_eeprom_len; /* Maximum module EEPROM transaction length. */
        struct mutex line_cards_lock; /* Protects line cards. */
        struct mlxsw_env_line_card *line_cards[];
 };
                              int module, u16 offset, u16 size, void *data,
                              bool qsfp, unsigned int *p_read_size)
 {
+       struct mlxsw_env *mlxsw_env = mlxsw_core_env(mlxsw_core);
        char mcia_pl[MLXSW_REG_MCIA_LEN];
        char *eeprom_tmp;
        u16 i2c_addr;
        int status;
        int err;
 
-       /* MCIA register accepts buffer size <= 48. Page of size 128 should be
-        * read by chunks of size 48, 48, 32. Align the size of the last chunk
-        * to avoid reading after the end of the page.
-        */
-       size = min_t(u16, size, MLXSW_REG_MCIA_EEPROM_SIZE);
+       size = min_t(u16, size, mlxsw_env->max_eeprom_len);
 
        if (offset < MLXSW_REG_MCIA_EEPROM_PAGE_LENGTH &&
            offset + size > MLXSW_REG_MCIA_EEPROM_PAGE_LENGTH)
                u8 size;
 
                size = min_t(u8, page->length - bytes_read,
-                            MLXSW_REG_MCIA_EEPROM_SIZE);
+                            mlxsw_env->max_eeprom_len);
 
                mlxsw_reg_mcia_pack(mcia_pl, slot_index, module, page->page,
                                    device_addr + bytes_read, size,
        .got_inactive = mlxsw_env_got_inactive,
 };
 
+static int mlxsw_env_max_module_eeprom_len_query(struct mlxsw_env *mlxsw_env)
+{
+       char mcam_pl[MLXSW_REG_MCAM_LEN];
+       bool mcia_128b_supported;
+       int err;
+
+       mlxsw_reg_mcam_pack(mcam_pl,
+                           MLXSW_REG_MCAM_FEATURE_GROUP_ENHANCED_FEATURES);
+       err = mlxsw_reg_query(mlxsw_env->core, MLXSW_REG(mcam), mcam_pl);
+       if (err)
+               return err;
+
+       mlxsw_reg_mcam_unpack(mcam_pl, MLXSW_REG_MCAM_MCIA_128B,
+                             &mcia_128b_supported);
+
+       mlxsw_env->max_eeprom_len = mcia_128b_supported ? 128 : 48;
+
+       return 0;
+}
+
 int mlxsw_env_init(struct mlxsw_core *mlxsw_core,
                   const struct mlxsw_bus_info *bus_info,
                   struct mlxsw_env **p_env)
        if (err)
                goto err_type_set;
 
+       err = mlxsw_env_max_module_eeprom_len_query(env);
+       if (err)
+               goto err_eeprom_len_query;
+
        env->line_cards[0]->active = true;
 
        return 0;
 
+err_eeprom_len_query:
 err_type_set:
        mlxsw_env_module_event_disable(env, 0);
 err_mlxsw_env_module_event_enable:
 
 
 #define MLXSW_REG_MCIA_EEPROM_PAGE_LENGTH      256
 #define MLXSW_REG_MCIA_EEPROM_UP_PAGE_LENGTH   128
-#define MLXSW_REG_MCIA_EEPROM_SIZE             48
 #define MLXSW_REG_MCIA_I2C_ADDR_LOW            0x50
 #define MLXSW_REG_MCIA_I2C_ADDR_HIGH           0x51
 #define MLXSW_REG_MCIA_PAGE0_LO_OFF            0xa0
  * Bytes to read/write.
  * Access: RW
  */
-MLXSW_ITEM_BUF(reg, mcia, eeprom, 0x10, MLXSW_REG_MCIA_EEPROM_SIZE);
+MLXSW_ITEM_BUF(reg, mcia, eeprom, 0x10, 128);
 
 /* This is used to access the optional upper pages (1-3) in the QSFP+
  * memory map. Page 1 is available on offset 256 through 383, page 2 -