@@ -942,8 +942,8 @@ static void mlxsw_sp_port_vport_destroy(struct mlxsw_sp_port *mlxsw_sp_vport)
942
942
kfree (mlxsw_sp_vport );
943
943
}
944
944
945
- int mlxsw_sp_port_add_vid (struct net_device * dev , __be16 __always_unused proto ,
946
- u16 vid )
945
+ static int mlxsw_sp_port_add_vid (struct net_device * dev ,
946
+ __be16 __always_unused proto , u16 vid )
947
947
{
948
948
struct mlxsw_sp_port * mlxsw_sp_port = netdev_priv (dev );
949
949
struct mlxsw_sp_port * mlxsw_sp_vport ;
@@ -956,41 +956,30 @@ int mlxsw_sp_port_add_vid(struct net_device *dev, __be16 __always_unused proto,
956
956
if (!vid )
957
957
return 0 ;
958
958
959
- if (mlxsw_sp_port_vport_find (mlxsw_sp_port , vid )) {
960
- netdev_warn (dev , "VID=%d already configured\n" , vid );
959
+ if (mlxsw_sp_port_vport_find (mlxsw_sp_port , vid ))
961
960
return 0 ;
962
- }
963
961
964
962
mlxsw_sp_vport = mlxsw_sp_port_vport_create (mlxsw_sp_port , vid );
965
- if (!mlxsw_sp_vport ) {
966
- netdev_err (dev , "Failed to create vPort for VID=%d\n" , vid );
963
+ if (!mlxsw_sp_vport )
967
964
return - ENOMEM ;
968
- }
969
965
970
966
/* When adding the first VLAN interface on a bridged port we need to
971
967
* transition all the active 802.1Q bridge VLANs to use explicit
972
968
* {Port, VID} to FID mappings and set the port's mode to Virtual mode.
973
969
*/
974
970
if (list_is_singular (& mlxsw_sp_port -> vports_list )) {
975
971
err = mlxsw_sp_port_vp_mode_trans (mlxsw_sp_port );
976
- if (err ) {
977
- netdev_err (dev , "Failed to set to Virtual mode\n" );
972
+ if (err )
978
973
goto err_port_vp_mode_trans ;
979
- }
980
974
}
981
975
982
976
err = mlxsw_sp_port_vid_learning_set (mlxsw_sp_vport , vid , false);
983
- if (err ) {
984
- netdev_err (dev , "Failed to disable learning for VID=%d\n" , vid );
977
+ if (err )
985
978
goto err_port_vid_learning_set ;
986
- }
987
979
988
980
err = mlxsw_sp_port_vlan_set (mlxsw_sp_vport , vid , vid , true, untagged );
989
- if (err ) {
990
- netdev_err (dev , "Failed to set VLAN membership for VID=%d\n" ,
991
- vid );
981
+ if (err )
992
982
goto err_port_add_vid ;
993
- }
994
983
995
984
return 0 ;
996
985
@@ -1010,7 +999,6 @@ static int mlxsw_sp_port_kill_vid(struct net_device *dev,
1010
999
struct mlxsw_sp_port * mlxsw_sp_port = netdev_priv (dev );
1011
1000
struct mlxsw_sp_port * mlxsw_sp_vport ;
1012
1001
struct mlxsw_sp_fid * f ;
1013
- int err ;
1014
1002
1015
1003
/* VLAN 0 is removed from HW filter when device goes down, but
1016
1004
* it is reserved in our case, so simply return.
@@ -1019,23 +1007,12 @@ static int mlxsw_sp_port_kill_vid(struct net_device *dev,
1019
1007
return 0 ;
1020
1008
1021
1009
mlxsw_sp_vport = mlxsw_sp_port_vport_find (mlxsw_sp_port , vid );
1022
- if (!mlxsw_sp_vport ) {
1023
- netdev_warn (dev , "VID=%d does not exist\n" , vid );
1010
+ if (WARN_ON (!mlxsw_sp_vport ))
1024
1011
return 0 ;
1025
- }
1026
1012
1027
- err = mlxsw_sp_port_vlan_set (mlxsw_sp_vport , vid , vid , false, false);
1028
- if (err ) {
1029
- netdev_err (dev , "Failed to set VLAN membership for VID=%d\n" ,
1030
- vid );
1031
- return err ;
1032
- }
1013
+ mlxsw_sp_port_vlan_set (mlxsw_sp_vport , vid , vid , false, false);
1033
1014
1034
- err = mlxsw_sp_port_vid_learning_set (mlxsw_sp_vport , vid , true);
1035
- if (err ) {
1036
- netdev_err (dev , "Failed to enable learning for VID=%d\n" , vid );
1037
- return err ;
1038
- }
1015
+ mlxsw_sp_port_vid_learning_set (mlxsw_sp_vport , vid , true);
1039
1016
1040
1017
/* Drop FID reference. If this was the last reference the
1041
1018
* resources will be freed.
@@ -1048,13 +1025,8 @@ static int mlxsw_sp_port_kill_vid(struct net_device *dev,
1048
1025
* transition all active 802.1Q bridge VLANs to use VID to FID
1049
1026
* mappings and set port's mode to VLAN mode.
1050
1027
*/
1051
- if (list_is_singular (& mlxsw_sp_port -> vports_list )) {
1052
- err = mlxsw_sp_port_vlan_mode_trans (mlxsw_sp_port );
1053
- if (err ) {
1054
- netdev_err (dev , "Failed to set to VLAN mode\n" );
1055
- return err ;
1056
- }
1057
- }
1028
+ if (list_is_singular (& mlxsw_sp_port -> vports_list ))
1029
+ mlxsw_sp_port_vlan_mode_trans (mlxsw_sp_port );
1058
1030
1059
1031
mlxsw_sp_port_vport_destroy (mlxsw_sp_vport );
1060
1032
@@ -2076,6 +2048,18 @@ static int mlxsw_sp_port_ets_init(struct mlxsw_sp_port *mlxsw_sp_port)
2076
2048
return 0 ;
2077
2049
}
2078
2050
2051
+ static int mlxsw_sp_port_pvid_vport_create (struct mlxsw_sp_port * mlxsw_sp_port )
2052
+ {
2053
+ mlxsw_sp_port -> pvid = 1 ;
2054
+
2055
+ return mlxsw_sp_port_add_vid (mlxsw_sp_port -> dev , 0 , 1 );
2056
+ }
2057
+
2058
+ static int mlxsw_sp_port_pvid_vport_destroy (struct mlxsw_sp_port * mlxsw_sp_port )
2059
+ {
2060
+ return mlxsw_sp_port_kill_vid (mlxsw_sp_port -> dev , 0 , 1 );
2061
+ }
2062
+
2079
2063
static int mlxsw_sp_port_create (struct mlxsw_sp * mlxsw_sp , u8 local_port ,
2080
2064
bool split , u8 module , u8 width , u8 lane )
2081
2065
{
@@ -2191,7 +2175,15 @@ static int mlxsw_sp_port_create(struct mlxsw_sp *mlxsw_sp, u8 local_port,
2191
2175
goto err_port_dcb_init ;
2192
2176
}
2193
2177
2178
+ err = mlxsw_sp_port_pvid_vport_create (mlxsw_sp_port );
2179
+ if (err ) {
2180
+ dev_err (mlxsw_sp -> bus_info -> dev , "Port %d: Failed to create PVID vPort\n" ,
2181
+ mlxsw_sp_port -> local_port );
2182
+ goto err_port_pvid_vport_create ;
2183
+ }
2184
+
2194
2185
mlxsw_sp_port_switchdev_init (mlxsw_sp_port );
2186
+ mlxsw_sp -> ports [local_port ] = mlxsw_sp_port ;
2195
2187
err = register_netdev (dev );
2196
2188
if (err ) {
2197
2189
dev_err (mlxsw_sp -> bus_info -> dev , "Port %d: Failed to register netdev\n" ,
@@ -2208,25 +2200,23 @@ static int mlxsw_sp_port_create(struct mlxsw_sp *mlxsw_sp, u8 local_port,
2208
2200
goto err_core_port_init ;
2209
2201
}
2210
2202
2211
- err = mlxsw_sp_port_vlan_init (mlxsw_sp_port );
2212
- if (err )
2213
- goto err_port_vlan_init ;
2214
-
2215
- mlxsw_sp -> ports [local_port ] = mlxsw_sp_port ;
2216
2203
return 0 ;
2217
2204
2218
- err_port_vlan_init :
2219
- mlxsw_core_port_fini (& mlxsw_sp_port -> core_port );
2220
2205
err_core_port_init :
2221
2206
unregister_netdev (dev );
2222
2207
err_register_netdev :
2208
+ mlxsw_sp -> ports [local_port ] = NULL ;
2209
+ mlxsw_sp_port_switchdev_fini (mlxsw_sp_port );
2210
+ mlxsw_sp_port_pvid_vport_destroy (mlxsw_sp_port );
2211
+ err_port_pvid_vport_create :
2223
2212
mlxsw_sp_port_dcb_fini (mlxsw_sp_port );
2224
2213
err_port_dcb_init :
2225
2214
err_port_ets_init :
2226
2215
err_port_buffers_init :
2227
2216
err_port_admin_status_set :
2228
2217
err_port_mtu_set :
2229
2218
err_port_speed_by_width_set :
2219
+ mlxsw_sp_port_swid_set (mlxsw_sp_port , MLXSW_PORT_SWID_DISABLED_PORT );
2230
2220
err_port_swid_set :
2231
2221
err_port_system_port_mapping_set :
2232
2222
err_dev_addr_init :
@@ -2246,12 +2236,12 @@ static void mlxsw_sp_port_remove(struct mlxsw_sp *mlxsw_sp, u8 local_port)
2246
2236
2247
2237
if (!mlxsw_sp_port )
2248
2238
return ;
2249
- mlxsw_sp -> ports [local_port ] = NULL ;
2250
2239
mlxsw_core_port_fini (& mlxsw_sp_port -> core_port );
2251
2240
unregister_netdev (mlxsw_sp_port -> dev ); /* This calls ndo_stop */
2252
- mlxsw_sp_port_dcb_fini (mlxsw_sp_port );
2253
- mlxsw_sp_port_kill_vid (mlxsw_sp_port -> dev , 0 , 1 );
2241
+ mlxsw_sp -> ports [local_port ] = NULL ;
2254
2242
mlxsw_sp_port_switchdev_fini (mlxsw_sp_port );
2243
+ mlxsw_sp_port_pvid_vport_destroy (mlxsw_sp_port );
2244
+ mlxsw_sp_port_dcb_fini (mlxsw_sp_port );
2255
2245
mlxsw_sp_port_swid_set (mlxsw_sp_port , MLXSW_PORT_SWID_DISABLED_PORT );
2256
2246
mlxsw_sp_port_module_unmap (mlxsw_sp , mlxsw_sp_port -> local_port );
2257
2247
free_percpu (mlxsw_sp_port -> pcpu_stats );
@@ -2660,6 +2650,26 @@ static const struct mlxsw_rx_listener mlxsw_sp_rx_listener[] = {
2660
2650
.local_port = MLXSW_PORT_DONT_CARE ,
2661
2651
.trap_id = MLXSW_TRAP_ID_ARPUC ,
2662
2652
},
2653
+ {
2654
+ .func = mlxsw_sp_rx_listener_func ,
2655
+ .local_port = MLXSW_PORT_DONT_CARE ,
2656
+ .trap_id = MLXSW_TRAP_ID_MTUERROR ,
2657
+ },
2658
+ {
2659
+ .func = mlxsw_sp_rx_listener_func ,
2660
+ .local_port = MLXSW_PORT_DONT_CARE ,
2661
+ .trap_id = MLXSW_TRAP_ID_TTLERROR ,
2662
+ },
2663
+ {
2664
+ .func = mlxsw_sp_rx_listener_func ,
2665
+ .local_port = MLXSW_PORT_DONT_CARE ,
2666
+ .trap_id = MLXSW_TRAP_ID_LBERROR ,
2667
+ },
2668
+ {
2669
+ .func = mlxsw_sp_rx_listener_func ,
2670
+ .local_port = MLXSW_PORT_DONT_CARE ,
2671
+ .trap_id = MLXSW_TRAP_ID_OSPF ,
2672
+ },
2663
2673
{
2664
2674
.func = mlxsw_sp_rx_listener_func ,
2665
2675
.local_port = MLXSW_PORT_DONT_CARE ,
0 commit comments