}
/* speed in units of 1Mb */
-static const u32 mlx5e_link_speed[MLX5E_LINK_MODES_NUMBER] = {
- [MLX5E_1000BASE_CX_SGMII] = 1000,
- [MLX5E_1000BASE_KX] = 1000,
- [MLX5E_10GBASE_CX4] = 10000,
- [MLX5E_10GBASE_KX4] = 10000,
- [MLX5E_10GBASE_KR] = 10000,
- [MLX5E_20GBASE_KR2] = 20000,
- [MLX5E_40GBASE_CR4] = 40000,
- [MLX5E_40GBASE_KR4] = 40000,
- [MLX5E_56GBASE_R4] = 56000,
- [MLX5E_10GBASE_CR] = 10000,
- [MLX5E_10GBASE_SR] = 10000,
- [MLX5E_10GBASE_ER] = 10000,
- [MLX5E_40GBASE_SR4] = 40000,
- [MLX5E_40GBASE_LR4] = 40000,
- [MLX5E_50GBASE_SR2] = 50000,
- [MLX5E_100GBASE_CR4] = 100000,
- [MLX5E_100GBASE_SR4] = 100000,
- [MLX5E_100GBASE_KR4] = 100000,
- [MLX5E_100GBASE_LR4] = 100000,
- [MLX5E_100BASE_TX] = 100,
- [MLX5E_1000BASE_T] = 1000,
- [MLX5E_10GBASE_T] = 10000,
- [MLX5E_25GBASE_CR] = 25000,
- [MLX5E_25GBASE_KR] = 25000,
- [MLX5E_25GBASE_SR] = 25000,
- [MLX5E_50GBASE_CR2] = 50000,
- [MLX5E_50GBASE_KR2] = 50000,
+static const struct mlx5_link_info mlx5e_link_info[MLX5E_LINK_MODES_NUMBER] = {
+ [MLX5E_1000BASE_CX_SGMII] = {.speed = 1000},
+ [MLX5E_1000BASE_KX] = {.speed = 1000},
+ [MLX5E_10GBASE_CX4] = {.speed = 10000},
+ [MLX5E_10GBASE_KX4] = {.speed = 10000},
+ [MLX5E_10GBASE_KR] = {.speed = 10000},
+ [MLX5E_20GBASE_KR2] = {.speed = 20000},
+ [MLX5E_40GBASE_CR4] = {.speed = 40000},
+ [MLX5E_40GBASE_KR4] = {.speed = 40000},
+ [MLX5E_56GBASE_R4] = {.speed = 56000},
+ [MLX5E_10GBASE_CR] = {.speed = 10000},
+ [MLX5E_10GBASE_SR] = {.speed = 10000},
+ [MLX5E_10GBASE_ER] = {.speed = 10000},
+ [MLX5E_40GBASE_SR4] = {.speed = 40000},
+ [MLX5E_40GBASE_LR4] = {.speed = 40000},
+ [MLX5E_50GBASE_SR2] = {.speed = 50000},
+ [MLX5E_100GBASE_CR4] = {.speed = 100000},
+ [MLX5E_100GBASE_SR4] = {.speed = 100000},
+ [MLX5E_100GBASE_KR4] = {.speed = 100000},
+ [MLX5E_100GBASE_LR4] = {.speed = 100000},
+ [MLX5E_100BASE_TX] = {.speed = 100},
+ [MLX5E_1000BASE_T] = {.speed = 1000},
+ [MLX5E_10GBASE_T] = {.speed = 10000},
+ [MLX5E_25GBASE_CR] = {.speed = 25000},
+ [MLX5E_25GBASE_KR] = {.speed = 25000},
+ [MLX5E_25GBASE_SR] = {.speed = 25000},
+ [MLX5E_50GBASE_CR2] = {.speed = 50000},
+ [MLX5E_50GBASE_KR2] = {.speed = 50000},
};
-static const u32 mlx5e_ext_link_speed[MLX5E_EXT_LINK_MODES_NUMBER] = {
- [MLX5E_SGMII_100M] = 100,
- [MLX5E_1000BASE_X_SGMII] = 1000,
- [MLX5E_5GBASE_R] = 5000,
- [MLX5E_10GBASE_XFI_XAUI_1] = 10000,
- [MLX5E_40GBASE_XLAUI_4_XLPPI_4] = 40000,
- [MLX5E_25GAUI_1_25GBASE_CR_KR] = 25000,
- [MLX5E_50GAUI_2_LAUI_2_50GBASE_CR2_KR2] = 50000,
- [MLX5E_50GAUI_1_LAUI_1_50GBASE_CR_KR] = 50000,
- [MLX5E_CAUI_4_100GBASE_CR4_KR4] = 100000,
- [MLX5E_100GAUI_2_100GBASE_CR2_KR2] = 100000,
- [MLX5E_200GAUI_4_200GBASE_CR4_KR4] = 200000,
- [MLX5E_400GAUI_8_400GBASE_CR8] = 400000,
- [MLX5E_100GAUI_1_100GBASE_CR_KR] = 100000,
- [MLX5E_200GAUI_2_200GBASE_CR2_KR2] = 200000,
- [MLX5E_400GAUI_4_400GBASE_CR4_KR4] = 400000,
- [MLX5E_800GAUI_8_800GBASE_CR8_KR8] = 800000,
- [MLX5E_200GAUI_1_200GBASE_CR1_KR1] = 200000,
- [MLX5E_400GAUI_2_400GBASE_CR2_KR2] = 400000,
- [MLX5E_800GAUI_4_800GBASE_CR4_KR4] = 800000,
+static const struct mlx5_link_info
+mlx5e_ext_link_info[MLX5E_EXT_LINK_MODES_NUMBER] = {
+ [MLX5E_SGMII_100M] = {.speed = 100},
+ [MLX5E_1000BASE_X_SGMII] = {.speed = 1000},
+ [MLX5E_5GBASE_R] = {.speed = 5000},
+ [MLX5E_10GBASE_XFI_XAUI_1] = {.speed = 10000},
+ [MLX5E_40GBASE_XLAUI_4_XLPPI_4] = {.speed = 40000},
+ [MLX5E_25GAUI_1_25GBASE_CR_KR] = {.speed = 25000},
+ [MLX5E_50GAUI_2_LAUI_2_50GBASE_CR2_KR2] = {.speed = 50000},
+ [MLX5E_50GAUI_1_LAUI_1_50GBASE_CR_KR] = {.speed = 50000},
+ [MLX5E_CAUI_4_100GBASE_CR4_KR4] = {.speed = 100000},
+ [MLX5E_100GAUI_2_100GBASE_CR2_KR2] = {.speed = 100000},
+ [MLX5E_200GAUI_4_200GBASE_CR4_KR4] = {.speed = 200000},
+ [MLX5E_400GAUI_8_400GBASE_CR8] = {.speed = 400000},
+ [MLX5E_100GAUI_1_100GBASE_CR_KR] = {.speed = 100000},
+ [MLX5E_200GAUI_2_200GBASE_CR2_KR2] = {.speed = 200000},
+ [MLX5E_400GAUI_4_400GBASE_CR4_KR4] = {.speed = 400000},
+ [MLX5E_800GAUI_8_800GBASE_CR8_KR8] = {.speed = 800000},
+ [MLX5E_200GAUI_1_200GBASE_CR1_KR1] = {.speed = 200000},
+ [MLX5E_400GAUI_2_400GBASE_CR2_KR2] = {.speed = 400000},
+ [MLX5E_800GAUI_4_800GBASE_CR4_KR4] = {.speed = 800000},
};
int mlx5_port_query_eth_proto(struct mlx5_core_dev *dev, u8 port, bool ext,
return !!eproto.cap;
}
-static void mlx5e_port_get_speed_arr(struct mlx5_core_dev *mdev,
- const u32 **arr, u32 *size,
- bool force_legacy)
+static void mlx5e_port_get_link_mode_info_arr(struct mlx5_core_dev *mdev,
+ const struct mlx5_link_info **arr,
+ u32 *size,
+ bool force_legacy)
{
bool ext = force_legacy ? false : mlx5_ptys_ext_supported(mdev);
- *size = ext ? ARRAY_SIZE(mlx5e_ext_link_speed) :
- ARRAY_SIZE(mlx5e_link_speed);
- *arr = ext ? mlx5e_ext_link_speed : mlx5e_link_speed;
+ *size = ext ? ARRAY_SIZE(mlx5e_ext_link_info) :
+ ARRAY_SIZE(mlx5e_link_info);
+ *arr = ext ? mlx5e_ext_link_info : mlx5e_link_info;
}
-u32 mlx5_port_ptys2speed(struct mlx5_core_dev *mdev, u32 eth_proto_oper,
- bool force_legacy)
+const struct mlx5_link_info *mlx5_port_ptys2info(struct mlx5_core_dev *mdev,
+ u32 eth_proto_oper,
+ bool force_legacy)
{
unsigned long temp = eth_proto_oper;
- const u32 *table;
- u32 speed = 0;
+ const struct mlx5_link_info *table;
u32 max_size;
int i;
- mlx5e_port_get_speed_arr(mdev, &table, &max_size, force_legacy);
+ mlx5e_port_get_link_mode_info_arr(mdev, &table, &max_size,
+ force_legacy);
i = find_first_bit(&temp, max_size);
if (i < max_size)
- speed = table[i];
- return speed;
+ return &table[i];
+
+ return NULL;
}
-u32 mlx5_port_speed2linkmodes(struct mlx5_core_dev *mdev, u32 speed,
- bool force_legacy)
+u32 mlx5_port_info2linkmodes(struct mlx5_core_dev *mdev,
+ struct mlx5_link_info *info,
+ bool force_legacy)
{
+ const struct mlx5_link_info *table;
u32 link_modes = 0;
- const u32 *table;
u32 max_size;
int i;
- mlx5e_port_get_speed_arr(mdev, &table, &max_size, force_legacy);
+ mlx5e_port_get_link_mode_info_arr(mdev, &table, &max_size,
+ force_legacy);
for (i = 0; i < max_size; ++i) {
- if (table[i] == speed)
+ if (table[i].speed == info->speed)
link_modes |= MLX5E_PROT_MASK(i);
}
return link_modes;
int mlx5_port_max_linkspeed(struct mlx5_core_dev *mdev, u32 *speed)
{
+ const struct mlx5_link_info *table;
struct mlx5_port_eth_proto eproto;
u32 max_speed = 0;
- const u32 *table;
u32 max_size;
bool ext;
int err;
if (err)
return err;
- mlx5e_port_get_speed_arr(mdev, &table, &max_size, false);
+ mlx5e_port_get_link_mode_info_arr(mdev, &table, &max_size, false);
for (i = 0; i < max_size; ++i)
if (eproto.cap & MLX5E_PROT_MASK(i))
- max_speed = max(max_speed, table[i]);
+ max_speed = max(max_speed, table[i].speed);
*speed = max_speed;
return 0;