mlxsw: spectrum: Extend to support Spectrum-3 ASIC
authorJiri Pirko <jiri@mellanox.com>
Wed, 7 Aug 2019 10:42:31 +0000 (13:42 +0300)
committerDavid S. Miller <davem@davemloft.net>
Fri, 9 Aug 2019 05:27:09 +0000 (22:27 -0700)
Extend existing driver for Spectrum and Spectrum-2 ASICs
to support Spectrum-3 ASIC as well.

Signed-off-by: Jiri Pirko <jiri@mellanox.com>
Reviewed-by: Petr Machata <petrm@mellanox.com>
Signed-off-by: Ido Schimmel <idosch@mellanox.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/mellanox/mlxsw/Kconfig
drivers/net/ethernet/mellanox/mlxsw/pci.h
drivers/net/ethernet/mellanox/mlxsw/spectrum.c

index 06c80343d9ed32c9ab8228a7e93d9a3914b805fd..f458fd1ce9f8bbac0e14f97ca8c70d83d7be3b96 100644 (file)
@@ -71,7 +71,7 @@ config MLXSW_SWITCHX2
          module will be called mlxsw_switchx2.
 
 config MLXSW_SPECTRUM
-       tristate "Mellanox Technologies Spectrum support"
+       tristate "Mellanox Technologies Spectrum family support"
        depends on MLXSW_CORE && MLXSW_PCI && NET_SWITCHDEV && VLAN_8021Q
        depends on PSAMPLE || PSAMPLE=n
        depends on BRIDGE || BRIDGE=n
@@ -87,8 +87,8 @@ config MLXSW_SPECTRUM
        select NET_PTP_CLASSIFY if PTP_1588_CLOCK
        default m
        ---help---
-         This driver supports Mellanox Technologies Spectrum Ethernet
-         Switch ASICs.
+         This driver supports Mellanox Technologies
+         Spectrum/Spectrum-2/Spectrum-3 Ethernet Switch ASICs.
 
          To compile this driver as a module, choose M here: the
          module will be called mlxsw_spectrum.
index 946339e13eb92b057920416c023a27f4d00c275c..5b1323645a5dfe3138c31cfd510f3e0cdf7cecdc 100644 (file)
@@ -9,6 +9,7 @@
 #define PCI_DEVICE_ID_MELLANOX_SWITCHX2                0xc738
 #define PCI_DEVICE_ID_MELLANOX_SPECTRUM                0xcb84
 #define PCI_DEVICE_ID_MELLANOX_SPECTRUM2       0xcf6c
+#define PCI_DEVICE_ID_MELLANOX_SPECTRUM3       0xcf70
 #define PCI_DEVICE_ID_MELLANOX_SWITCHIB                0xcb20
 #define PCI_DEVICE_ID_MELLANOX_SWITCHIB2       0xcf08
 
index 5a8e94c0a95a814b33327ae0946a84b9a60ae6b3..389861ece4189f088be8a526e9f74e74978988f1 100644 (file)
@@ -65,6 +65,7 @@ static const struct mlxsw_fw_rev mlxsw_sp1_fw_rev = {
 
 static const char mlxsw_sp1_driver_name[] = "mlxsw_spectrum";
 static const char mlxsw_sp2_driver_name[] = "mlxsw_spectrum2";
+static const char mlxsw_sp3_driver_name[] = "mlxsw_spectrum3";
 static const char mlxsw_sp_driver_version[] = "1.0";
 
 static const unsigned char mlxsw_sp1_mac_mask[ETH_ALEN] = {
@@ -5290,6 +5291,35 @@ static struct mlxsw_driver mlxsw_sp2_driver = {
        .res_query_enabled              = true,
 };
 
+static struct mlxsw_driver mlxsw_sp3_driver = {
+       .kind                           = mlxsw_sp3_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,
+       .flash_update                   = mlxsw_sp_flash_update,
+       .txhdr_construct                = mlxsw_sp_txhdr_construct,
+       .resources_register             = mlxsw_sp2_resources_register,
+       .params_register                = mlxsw_sp2_params_register,
+       .params_unregister              = mlxsw_sp2_params_unregister,
+       .ptp_transmitted                = mlxsw_sp_ptp_transmitted,
+       .txhdr_len                      = MLXSW_TXHDR_LEN,
+       .profile                        = &mlxsw_sp2_config_profile,
+       .res_query_enabled              = true,
+};
+
 bool mlxsw_sp_port_dev_check(const struct net_device *dev)
 {
        return dev->netdev_ops == &mlxsw_sp_port_netdev_ops;
@@ -6324,6 +6354,16 @@ static struct pci_driver mlxsw_sp2_pci_driver = {
        .id_table = mlxsw_sp2_pci_id_table,
 };
 
+static const struct pci_device_id mlxsw_sp3_pci_id_table[] = {
+       {PCI_VDEVICE(MELLANOX, PCI_DEVICE_ID_MELLANOX_SPECTRUM3), 0},
+       {0, },
+};
+
+static struct pci_driver mlxsw_sp3_pci_driver = {
+       .name = mlxsw_sp3_driver_name,
+       .id_table = mlxsw_sp3_pci_id_table,
+};
+
 static int __init mlxsw_sp_module_init(void)
 {
        int err;
@@ -6339,6 +6379,10 @@ static int __init mlxsw_sp_module_init(void)
        if (err)
                goto err_sp2_core_driver_register;
 
+       err = mlxsw_core_driver_register(&mlxsw_sp3_driver);
+       if (err)
+               goto err_sp3_core_driver_register;
+
        err = mlxsw_pci_driver_register(&mlxsw_sp1_pci_driver);
        if (err)
                goto err_sp1_pci_driver_register;
@@ -6347,11 +6391,19 @@ static int __init mlxsw_sp_module_init(void)
        if (err)
                goto err_sp2_pci_driver_register;
 
+       err = mlxsw_pci_driver_register(&mlxsw_sp3_pci_driver);
+       if (err)
+               goto err_sp3_pci_driver_register;
+
        return 0;
 
+err_sp3_pci_driver_register:
+       mlxsw_pci_driver_unregister(&mlxsw_sp2_pci_driver);
 err_sp2_pci_driver_register:
        mlxsw_pci_driver_unregister(&mlxsw_sp1_pci_driver);
 err_sp1_pci_driver_register:
+       mlxsw_core_driver_unregister(&mlxsw_sp3_driver);
+err_sp3_core_driver_register:
        mlxsw_core_driver_unregister(&mlxsw_sp2_driver);
 err_sp2_core_driver_register:
        mlxsw_core_driver_unregister(&mlxsw_sp1_driver);
@@ -6363,8 +6415,10 @@ err_sp1_core_driver_register:
 
 static void __exit mlxsw_sp_module_exit(void)
 {
+       mlxsw_pci_driver_unregister(&mlxsw_sp3_pci_driver);
        mlxsw_pci_driver_unregister(&mlxsw_sp2_pci_driver);
        mlxsw_pci_driver_unregister(&mlxsw_sp1_pci_driver);
+       mlxsw_core_driver_unregister(&mlxsw_sp3_driver);
        mlxsw_core_driver_unregister(&mlxsw_sp2_driver);
        mlxsw_core_driver_unregister(&mlxsw_sp1_driver);
        unregister_inet6addr_validator_notifier(&mlxsw_sp_inet6addr_valid_nb);
@@ -6379,4 +6433,5 @@ MODULE_AUTHOR("Jiri Pirko <jiri@mellanox.com>");
 MODULE_DESCRIPTION("Mellanox Spectrum driver");
 MODULE_DEVICE_TABLE(pci, mlxsw_sp1_pci_id_table);
 MODULE_DEVICE_TABLE(pci, mlxsw_sp2_pci_id_table);
+MODULE_DEVICE_TABLE(pci, mlxsw_sp3_pci_id_table);
 MODULE_FIRMWARE(MLXSW_SP1_FW_FILENAME);