net/mlx5: Query the maximum MCIA register read size from firmware
authorGal Pressman <gal@nvidia.com>
Mon, 17 Jan 2022 13:14:44 +0000 (15:14 +0200)
committerSaeed Mahameed <saeedm@nvidia.com>
Fri, 11 Mar 2022 07:38:24 +0000 (23:38 -0800)
The MCIA register supports either 12 or 32 dwords, use the correct value
by querying the capability from the MCAM register.

Signed-off-by: Gal Pressman <gal@nvidia.com>
Reviewed-by: Maxim Mikityanskiy <maximmi@nvidia.com>
Signed-off-by: Saeed Mahameed <saeedm@nvidia.com>
drivers/net/ethernet/mellanox/mlx5/core/port.c
include/linux/mlx5/mlx5_ifc.h
include/linux/mlx5/port.h

index 289b29a..418ab77 100644 (file)
@@ -365,6 +365,12 @@ static void mlx5_sfp_eeprom_params_set(u16 *i2c_addr, int *page_num, u16 *offset
        *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)
 {
@@ -374,7 +380,7 @@ static int mlx5_query_mcia(struct mlx5_core_dev *dev,
        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);
index 318fae4..745107f 100644 (file)
@@ -9691,7 +9691,9 @@ struct mlx5_ifc_pcam_reg_bits {
 };
 
 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];
index 77ea4f9..402413b 100644 (file)
@@ -56,7 +56,6 @@ enum mlx5_an_status {
        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