mlxsw: spectrum: Extend to support Spectrum-2 ASIC
Extend existing driver for Spectrum ASIC to support Spectrum-2 ASIC. Signed-off-by: Jiri Pirko <jiri@mellanox.com> Signed-off-by: Ido Schimmel <idosch@mellanox.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
9912e6b8c2
commit
c3ab435466
|
@ -39,6 +39,7 @@
|
||||||
|
|
||||||
#define PCI_DEVICE_ID_MELLANOX_SWITCHX2 0xc738
|
#define PCI_DEVICE_ID_MELLANOX_SWITCHX2 0xc738
|
||||||
#define PCI_DEVICE_ID_MELLANOX_SPECTRUM 0xcb84
|
#define PCI_DEVICE_ID_MELLANOX_SPECTRUM 0xcb84
|
||||||
|
#define PCI_DEVICE_ID_MELLANOX_SPECTRUM2 0xcf6c
|
||||||
#define PCI_DEVICE_ID_MELLANOX_SWITCHIB 0xcb20
|
#define PCI_DEVICE_ID_MELLANOX_SWITCHIB 0xcb20
|
||||||
#define PCI_DEVICE_ID_MELLANOX_SWITCHIB2 0xcf08
|
#define PCI_DEVICE_ID_MELLANOX_SWITCHIB2 0xcf08
|
||||||
|
|
||||||
|
|
|
@ -91,7 +91,8 @@ static const struct mlxsw_fw_rev mlxsw_sp1_fw_rev = {
|
||||||
"." __stringify(MLXSW_SP1_FWREV_MINOR) \
|
"." __stringify(MLXSW_SP1_FWREV_MINOR) \
|
||||||
"." __stringify(MLXSW_SP1_FWREV_SUBMINOR) ".mfa2"
|
"." __stringify(MLXSW_SP1_FWREV_SUBMINOR) ".mfa2"
|
||||||
|
|
||||||
static const char mlxsw_sp_driver_name[] = "mlxsw_spectrum";
|
static const char mlxsw_sp1_driver_name[] = "mlxsw_spectrum";
|
||||||
|
static const char mlxsw_sp2_driver_name[] = "mlxsw_spectrum2";
|
||||||
static const char mlxsw_sp_driver_version[] = "1.0";
|
static const char mlxsw_sp_driver_version[] = "1.0";
|
||||||
|
|
||||||
/* tx_hdr_version
|
/* tx_hdr_version
|
||||||
|
@ -1727,7 +1728,8 @@ static void mlxsw_sp_port_get_drvinfo(struct net_device *dev,
|
||||||
struct mlxsw_sp_port *mlxsw_sp_port = netdev_priv(dev);
|
struct mlxsw_sp_port *mlxsw_sp_port = netdev_priv(dev);
|
||||||
struct mlxsw_sp *mlxsw_sp = mlxsw_sp_port->mlxsw_sp;
|
struct mlxsw_sp *mlxsw_sp = mlxsw_sp_port->mlxsw_sp;
|
||||||
|
|
||||||
strlcpy(drvinfo->driver, mlxsw_sp_driver_name, sizeof(drvinfo->driver));
|
strlcpy(drvinfo->driver, mlxsw_sp->bus_info->device_kind,
|
||||||
|
sizeof(drvinfo->driver));
|
||||||
strlcpy(drvinfo->version, mlxsw_sp_driver_version,
|
strlcpy(drvinfo->version, mlxsw_sp_driver_version,
|
||||||
sizeof(drvinfo->version));
|
sizeof(drvinfo->version));
|
||||||
snprintf(drvinfo->fw_version, sizeof(drvinfo->fw_version),
|
snprintf(drvinfo->fw_version, sizeof(drvinfo->fw_version),
|
||||||
|
@ -3696,14 +3698,6 @@ static int mlxsw_sp_init(struct mlxsw_core *mlxsw_core,
|
||||||
struct mlxsw_sp *mlxsw_sp = mlxsw_core_driver_priv(mlxsw_core);
|
struct mlxsw_sp *mlxsw_sp = mlxsw_core_driver_priv(mlxsw_core);
|
||||||
int err;
|
int err;
|
||||||
|
|
||||||
mlxsw_sp->req_rev = &mlxsw_sp1_fw_rev;
|
|
||||||
mlxsw_sp->fw_filename = MLXSW_SP1_FW_FILENAME;
|
|
||||||
mlxsw_sp->kvdl_ops = &mlxsw_sp1_kvdl_ops;
|
|
||||||
mlxsw_sp->afa_ops = &mlxsw_sp1_act_afa_ops;
|
|
||||||
mlxsw_sp->afk_ops = &mlxsw_sp1_afk_ops;
|
|
||||||
mlxsw_sp->mr_tcam_ops = &mlxsw_sp1_mr_tcam_ops;
|
|
||||||
mlxsw_sp->acl_tcam_ops = &mlxsw_sp1_acl_tcam_ops;
|
|
||||||
|
|
||||||
mlxsw_sp->core = mlxsw_core;
|
mlxsw_sp->core = mlxsw_core;
|
||||||
mlxsw_sp->bus_info = mlxsw_bus_info;
|
mlxsw_sp->bus_info = mlxsw_bus_info;
|
||||||
|
|
||||||
|
@ -3842,6 +3836,36 @@ err_fids_init:
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int mlxsw_sp1_init(struct mlxsw_core *mlxsw_core,
|
||||||
|
const struct mlxsw_bus_info *mlxsw_bus_info)
|
||||||
|
{
|
||||||
|
struct mlxsw_sp *mlxsw_sp = mlxsw_core_driver_priv(mlxsw_core);
|
||||||
|
|
||||||
|
mlxsw_sp->req_rev = &mlxsw_sp1_fw_rev;
|
||||||
|
mlxsw_sp->fw_filename = MLXSW_SP1_FW_FILENAME;
|
||||||
|
mlxsw_sp->kvdl_ops = &mlxsw_sp1_kvdl_ops;
|
||||||
|
mlxsw_sp->afa_ops = &mlxsw_sp1_act_afa_ops;
|
||||||
|
mlxsw_sp->afk_ops = &mlxsw_sp1_afk_ops;
|
||||||
|
mlxsw_sp->mr_tcam_ops = &mlxsw_sp1_mr_tcam_ops;
|
||||||
|
mlxsw_sp->acl_tcam_ops = &mlxsw_sp1_acl_tcam_ops;
|
||||||
|
|
||||||
|
return mlxsw_sp_init(mlxsw_core, mlxsw_bus_info);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int mlxsw_sp2_init(struct mlxsw_core *mlxsw_core,
|
||||||
|
const struct mlxsw_bus_info *mlxsw_bus_info)
|
||||||
|
{
|
||||||
|
struct mlxsw_sp *mlxsw_sp = mlxsw_core_driver_priv(mlxsw_core);
|
||||||
|
|
||||||
|
mlxsw_sp->kvdl_ops = &mlxsw_sp2_kvdl_ops;
|
||||||
|
mlxsw_sp->afa_ops = &mlxsw_sp2_act_afa_ops;
|
||||||
|
mlxsw_sp->afk_ops = &mlxsw_sp2_afk_ops;
|
||||||
|
mlxsw_sp->mr_tcam_ops = &mlxsw_sp2_mr_tcam_ops;
|
||||||
|
mlxsw_sp->acl_tcam_ops = &mlxsw_sp2_acl_tcam_ops;
|
||||||
|
|
||||||
|
return mlxsw_sp_init(mlxsw_core, mlxsw_bus_info);
|
||||||
|
}
|
||||||
|
|
||||||
static void mlxsw_sp_fini(struct mlxsw_core *mlxsw_core)
|
static void mlxsw_sp_fini(struct mlxsw_core *mlxsw_core)
|
||||||
{
|
{
|
||||||
struct mlxsw_sp *mlxsw_sp = mlxsw_core_driver_priv(mlxsw_core);
|
struct mlxsw_sp *mlxsw_sp = mlxsw_core_driver_priv(mlxsw_core);
|
||||||
|
@ -3862,7 +3886,7 @@ static void mlxsw_sp_fini(struct mlxsw_core *mlxsw_core)
|
||||||
mlxsw_sp_kvdl_fini(mlxsw_sp);
|
mlxsw_sp_kvdl_fini(mlxsw_sp);
|
||||||
}
|
}
|
||||||
|
|
||||||
static const struct mlxsw_config_profile mlxsw_sp_config_profile = {
|
static const struct mlxsw_config_profile mlxsw_sp1_config_profile = {
|
||||||
.used_max_mid = 1,
|
.used_max_mid = 1,
|
||||||
.max_mid = MLXSW_SP_MID_MAX,
|
.max_mid = MLXSW_SP_MID_MAX,
|
||||||
.used_flood_tables = 1,
|
.used_flood_tables = 1,
|
||||||
|
@ -3888,6 +3912,28 @@ static const struct mlxsw_config_profile mlxsw_sp_config_profile = {
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static const struct mlxsw_config_profile mlxsw_sp2_config_profile = {
|
||||||
|
.used_max_mid = 1,
|
||||||
|
.max_mid = MLXSW_SP_MID_MAX,
|
||||||
|
.used_flood_tables = 1,
|
||||||
|
.used_flood_mode = 1,
|
||||||
|
.flood_mode = 3,
|
||||||
|
.max_fid_offset_flood_tables = 3,
|
||||||
|
.fid_offset_flood_table_size = VLAN_N_VID - 1,
|
||||||
|
.max_fid_flood_tables = 3,
|
||||||
|
.fid_flood_table_size = MLXSW_SP_FID_8021D_MAX,
|
||||||
|
.used_max_ib_mc = 1,
|
||||||
|
.max_ib_mc = 0,
|
||||||
|
.used_max_pkey = 1,
|
||||||
|
.max_pkey = 0,
|
||||||
|
.swid_config = {
|
||||||
|
{
|
||||||
|
.used_type = 1,
|
||||||
|
.type = MLXSW_PORT_SWID_TYPE_ETH,
|
||||||
|
}
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
static void
|
static void
|
||||||
mlxsw_sp_resource_size_params_prepare(struct mlxsw_core *mlxsw_core,
|
mlxsw_sp_resource_size_params_prepare(struct mlxsw_core *mlxsw_core,
|
||||||
struct devlink_resource_size_params *kvd_size_params,
|
struct devlink_resource_size_params *kvd_size_params,
|
||||||
|
@ -3924,7 +3970,7 @@ mlxsw_sp_resource_size_params_prepare(struct mlxsw_core *mlxsw_core,
|
||||||
DEVLINK_RESOURCE_UNIT_ENTRY);
|
DEVLINK_RESOURCE_UNIT_ENTRY);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int mlxsw_sp_resources_register(struct mlxsw_core *mlxsw_core)
|
static int mlxsw_sp1_resources_kvd_register(struct mlxsw_core *mlxsw_core)
|
||||||
{
|
{
|
||||||
struct devlink *devlink = priv_to_devlink(mlxsw_core);
|
struct devlink *devlink = priv_to_devlink(mlxsw_core);
|
||||||
struct devlink_resource_size_params hash_single_size_params;
|
struct devlink_resource_size_params hash_single_size_params;
|
||||||
|
@ -3935,7 +3981,7 @@ static int mlxsw_sp_resources_register(struct mlxsw_core *mlxsw_core)
|
||||||
const struct mlxsw_config_profile *profile;
|
const struct mlxsw_config_profile *profile;
|
||||||
int err;
|
int err;
|
||||||
|
|
||||||
profile = &mlxsw_sp_config_profile;
|
profile = &mlxsw_sp1_config_profile;
|
||||||
if (!MLXSW_CORE_RES_VALID(mlxsw_core, KVD_SIZE))
|
if (!MLXSW_CORE_RES_VALID(mlxsw_core, KVD_SIZE))
|
||||||
return -EIO;
|
return -EIO;
|
||||||
|
|
||||||
|
@ -3990,6 +4036,16 @@ static int mlxsw_sp_resources_register(struct mlxsw_core *mlxsw_core)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int mlxsw_sp1_resources_register(struct mlxsw_core *mlxsw_core)
|
||||||
|
{
|
||||||
|
return mlxsw_sp1_resources_kvd_register(mlxsw_core);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int mlxsw_sp2_resources_register(struct mlxsw_core *mlxsw_core)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
static int mlxsw_sp_kvd_sizes_get(struct mlxsw_core *mlxsw_core,
|
static int mlxsw_sp_kvd_sizes_get(struct mlxsw_core *mlxsw_core,
|
||||||
const struct mlxsw_config_profile *profile,
|
const struct mlxsw_config_profile *profile,
|
||||||
u64 *p_single_size, u64 *p_double_size,
|
u64 *p_single_size, u64 *p_double_size,
|
||||||
|
@ -4045,10 +4101,10 @@ static int mlxsw_sp_kvd_sizes_get(struct mlxsw_core *mlxsw_core,
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct mlxsw_driver mlxsw_sp_driver = {
|
static struct mlxsw_driver mlxsw_sp1_driver = {
|
||||||
.kind = mlxsw_sp_driver_name,
|
.kind = mlxsw_sp1_driver_name,
|
||||||
.priv_size = sizeof(struct mlxsw_sp),
|
.priv_size = sizeof(struct mlxsw_sp),
|
||||||
.init = mlxsw_sp_init,
|
.init = mlxsw_sp1_init,
|
||||||
.fini = mlxsw_sp_fini,
|
.fini = mlxsw_sp_fini,
|
||||||
.basic_trap_groups_set = mlxsw_sp_basic_trap_groups_set,
|
.basic_trap_groups_set = mlxsw_sp_basic_trap_groups_set,
|
||||||
.port_split = mlxsw_sp_port_split,
|
.port_split = mlxsw_sp_port_split,
|
||||||
|
@ -4064,10 +4120,35 @@ static struct mlxsw_driver mlxsw_sp_driver = {
|
||||||
.sb_occ_port_pool_get = mlxsw_sp_sb_occ_port_pool_get,
|
.sb_occ_port_pool_get = mlxsw_sp_sb_occ_port_pool_get,
|
||||||
.sb_occ_tc_port_bind_get = mlxsw_sp_sb_occ_tc_port_bind_get,
|
.sb_occ_tc_port_bind_get = mlxsw_sp_sb_occ_tc_port_bind_get,
|
||||||
.txhdr_construct = mlxsw_sp_txhdr_construct,
|
.txhdr_construct = mlxsw_sp_txhdr_construct,
|
||||||
.resources_register = mlxsw_sp_resources_register,
|
.resources_register = mlxsw_sp1_resources_register,
|
||||||
.kvd_sizes_get = mlxsw_sp_kvd_sizes_get,
|
.kvd_sizes_get = mlxsw_sp_kvd_sizes_get,
|
||||||
.txhdr_len = MLXSW_TXHDR_LEN,
|
.txhdr_len = MLXSW_TXHDR_LEN,
|
||||||
.profile = &mlxsw_sp_config_profile,
|
.profile = &mlxsw_sp1_config_profile,
|
||||||
|
.res_query_enabled = true,
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct mlxsw_driver mlxsw_sp2_driver = {
|
||||||
|
.kind = mlxsw_sp2_driver_name,
|
||||||
|
.priv_size = sizeof(struct mlxsw_sp),
|
||||||
|
.init = mlxsw_sp2_init,
|
||||||
|
.fini = mlxsw_sp_fini,
|
||||||
|
.basic_trap_groups_set = mlxsw_sp_basic_trap_groups_set,
|
||||||
|
.port_split = mlxsw_sp_port_split,
|
||||||
|
.port_unsplit = mlxsw_sp_port_unsplit,
|
||||||
|
.sb_pool_get = mlxsw_sp_sb_pool_get,
|
||||||
|
.sb_pool_set = mlxsw_sp_sb_pool_set,
|
||||||
|
.sb_port_pool_get = mlxsw_sp_sb_port_pool_get,
|
||||||
|
.sb_port_pool_set = mlxsw_sp_sb_port_pool_set,
|
||||||
|
.sb_tc_pool_bind_get = mlxsw_sp_sb_tc_pool_bind_get,
|
||||||
|
.sb_tc_pool_bind_set = mlxsw_sp_sb_tc_pool_bind_set,
|
||||||
|
.sb_occ_snapshot = mlxsw_sp_sb_occ_snapshot,
|
||||||
|
.sb_occ_max_clear = mlxsw_sp_sb_occ_max_clear,
|
||||||
|
.sb_occ_port_pool_get = mlxsw_sp_sb_occ_port_pool_get,
|
||||||
|
.sb_occ_tc_port_bind_get = mlxsw_sp_sb_occ_tc_port_bind_get,
|
||||||
|
.txhdr_construct = mlxsw_sp_txhdr_construct,
|
||||||
|
.resources_register = mlxsw_sp2_resources_register,
|
||||||
|
.txhdr_len = MLXSW_TXHDR_LEN,
|
||||||
|
.profile = &mlxsw_sp2_config_profile,
|
||||||
.res_query_enabled = true,
|
.res_query_enabled = true,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -4846,14 +4927,24 @@ static struct notifier_block mlxsw_sp_inet6addr_nb __read_mostly = {
|
||||||
.notifier_call = mlxsw_sp_inet6addr_event,
|
.notifier_call = mlxsw_sp_inet6addr_event,
|
||||||
};
|
};
|
||||||
|
|
||||||
static const struct pci_device_id mlxsw_sp_pci_id_table[] = {
|
static const struct pci_device_id mlxsw_sp1_pci_id_table[] = {
|
||||||
{PCI_VDEVICE(MELLANOX, PCI_DEVICE_ID_MELLANOX_SPECTRUM), 0},
|
{PCI_VDEVICE(MELLANOX, PCI_DEVICE_ID_MELLANOX_SPECTRUM), 0},
|
||||||
{0, },
|
{0, },
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct pci_driver mlxsw_sp_pci_driver = {
|
static struct pci_driver mlxsw_sp1_pci_driver = {
|
||||||
.name = mlxsw_sp_driver_name,
|
.name = mlxsw_sp1_driver_name,
|
||||||
.id_table = mlxsw_sp_pci_id_table,
|
.id_table = mlxsw_sp1_pci_id_table,
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct pci_device_id mlxsw_sp2_pci_id_table[] = {
|
||||||
|
{PCI_VDEVICE(MELLANOX, PCI_DEVICE_ID_MELLANOX_SPECTRUM2), 0},
|
||||||
|
{0, },
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct pci_driver mlxsw_sp2_pci_driver = {
|
||||||
|
.name = mlxsw_sp2_driver_name,
|
||||||
|
.id_table = mlxsw_sp2_pci_id_table,
|
||||||
};
|
};
|
||||||
|
|
||||||
static int __init mlxsw_sp_module_init(void)
|
static int __init mlxsw_sp_module_init(void)
|
||||||
|
@ -4865,19 +4956,31 @@ static int __init mlxsw_sp_module_init(void)
|
||||||
register_inet6addr_validator_notifier(&mlxsw_sp_inet6addr_valid_nb);
|
register_inet6addr_validator_notifier(&mlxsw_sp_inet6addr_valid_nb);
|
||||||
register_inet6addr_notifier(&mlxsw_sp_inet6addr_nb);
|
register_inet6addr_notifier(&mlxsw_sp_inet6addr_nb);
|
||||||
|
|
||||||
err = mlxsw_core_driver_register(&mlxsw_sp_driver);
|
err = mlxsw_core_driver_register(&mlxsw_sp1_driver);
|
||||||
if (err)
|
if (err)
|
||||||
goto err_core_driver_register;
|
goto err_sp1_core_driver_register;
|
||||||
|
|
||||||
err = mlxsw_pci_driver_register(&mlxsw_sp_pci_driver);
|
err = mlxsw_core_driver_register(&mlxsw_sp2_driver);
|
||||||
if (err)
|
if (err)
|
||||||
goto err_pci_driver_register;
|
goto err_sp2_core_driver_register;
|
||||||
|
|
||||||
|
err = mlxsw_pci_driver_register(&mlxsw_sp1_pci_driver);
|
||||||
|
if (err)
|
||||||
|
goto err_sp1_pci_driver_register;
|
||||||
|
|
||||||
|
err = mlxsw_pci_driver_register(&mlxsw_sp2_pci_driver);
|
||||||
|
if (err)
|
||||||
|
goto err_sp2_pci_driver_register;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
err_pci_driver_register:
|
err_sp2_pci_driver_register:
|
||||||
mlxsw_core_driver_unregister(&mlxsw_sp_driver);
|
mlxsw_pci_driver_unregister(&mlxsw_sp2_pci_driver);
|
||||||
err_core_driver_register:
|
err_sp1_pci_driver_register:
|
||||||
|
mlxsw_core_driver_unregister(&mlxsw_sp2_driver);
|
||||||
|
err_sp2_core_driver_register:
|
||||||
|
mlxsw_core_driver_unregister(&mlxsw_sp1_driver);
|
||||||
|
err_sp1_core_driver_register:
|
||||||
unregister_inet6addr_notifier(&mlxsw_sp_inet6addr_nb);
|
unregister_inet6addr_notifier(&mlxsw_sp_inet6addr_nb);
|
||||||
unregister_inet6addr_validator_notifier(&mlxsw_sp_inet6addr_valid_nb);
|
unregister_inet6addr_validator_notifier(&mlxsw_sp_inet6addr_valid_nb);
|
||||||
unregister_inetaddr_notifier(&mlxsw_sp_inetaddr_nb);
|
unregister_inetaddr_notifier(&mlxsw_sp_inetaddr_nb);
|
||||||
|
@ -4887,8 +4990,10 @@ err_core_driver_register:
|
||||||
|
|
||||||
static void __exit mlxsw_sp_module_exit(void)
|
static void __exit mlxsw_sp_module_exit(void)
|
||||||
{
|
{
|
||||||
mlxsw_pci_driver_unregister(&mlxsw_sp_pci_driver);
|
mlxsw_pci_driver_unregister(&mlxsw_sp2_pci_driver);
|
||||||
mlxsw_core_driver_unregister(&mlxsw_sp_driver);
|
mlxsw_pci_driver_unregister(&mlxsw_sp1_pci_driver);
|
||||||
|
mlxsw_core_driver_unregister(&mlxsw_sp2_driver);
|
||||||
|
mlxsw_core_driver_unregister(&mlxsw_sp1_driver);
|
||||||
unregister_inet6addr_notifier(&mlxsw_sp_inet6addr_nb);
|
unregister_inet6addr_notifier(&mlxsw_sp_inet6addr_nb);
|
||||||
unregister_inet6addr_validator_notifier(&mlxsw_sp_inet6addr_valid_nb);
|
unregister_inet6addr_validator_notifier(&mlxsw_sp_inet6addr_valid_nb);
|
||||||
unregister_inetaddr_notifier(&mlxsw_sp_inetaddr_nb);
|
unregister_inetaddr_notifier(&mlxsw_sp_inetaddr_nb);
|
||||||
|
@ -4901,5 +5006,6 @@ module_exit(mlxsw_sp_module_exit);
|
||||||
MODULE_LICENSE("Dual BSD/GPL");
|
MODULE_LICENSE("Dual BSD/GPL");
|
||||||
MODULE_AUTHOR("Jiri Pirko <jiri@mellanox.com>");
|
MODULE_AUTHOR("Jiri Pirko <jiri@mellanox.com>");
|
||||||
MODULE_DESCRIPTION("Mellanox Spectrum driver");
|
MODULE_DESCRIPTION("Mellanox Spectrum driver");
|
||||||
MODULE_DEVICE_TABLE(pci, mlxsw_sp_pci_id_table);
|
MODULE_DEVICE_TABLE(pci, mlxsw_sp1_pci_id_table);
|
||||||
|
MODULE_DEVICE_TABLE(pci, mlxsw_sp2_pci_id_table);
|
||||||
MODULE_FIRMWARE(MLXSW_SP1_FW_FILENAME);
|
MODULE_FIRMWARE(MLXSW_SP1_FW_FILENAME);
|
||||||
|
|
Loading…
Reference in New Issue