*offset -= MLX5_EEPROM_PAGE_LENGTH;
 }
 
+static int mlx5_mcia_max_bytes(struct mlx5_core_dev *dev)
+{
+       /* mcia supports either 12 dwords or 32 dwords */
+       return (MLX5_CAP_MCAM_FEATURE(dev, mcia_32dwords) ? 32 : 12) * sizeof(u32);
+}
+
 static int mlx5_query_mcia(struct mlx5_core_dev *dev,
                           struct mlx5_module_eeprom_query_params *params, u8 *data)
 {
        void *ptr;
        u16 size;
 
-       size = min_t(int, params->size, MLX5_EEPROM_MAX_BYTES);
+       size = min_t(int, params->size, mlx5_mcia_max_bytes(dev));
 
        MLX5_SET(mcia_reg, in, l, 0);
        MLX5_SET(mcia_reg, in, size, size);
 
 };
 
 struct mlx5_ifc_mcam_enhanced_features_bits {
-       u8         reserved_at_0[0x6a];
+       u8         reserved_at_0[0x5d];
+       u8         mcia_32dwords[0x1];
+       u8         reserved_at_5e[0xc];
        u8         reset_state[0x1];
        u8         ptpcyc2realtime_modify[0x1];
        u8         reserved_at_6c[0x2];
 
        MLX5_AN_LINK_DOWN   = 4,
 };
 
-#define MLX5_EEPROM_MAX_BYTES                  32
 #define MLX5_EEPROM_IDENTIFIER_BYTE_MASK       0x000000ff
 #define MLX5_I2C_ADDR_LOW              0x50
 #define MLX5_I2C_ADDR_HIGH             0x51