44
44
#include "en_tc.h"
45
45
#include "en/rep/tc.h"
46
46
#include "en/rep/neigh.h"
47
+ #include "en/devlink.h"
47
48
#include "fs_core.h"
48
49
#include "lib/mlx5.h"
49
50
#define CREATE_TRACE_POINTS
@@ -588,26 +589,15 @@ static void mlx5e_build_rep_params(struct net_device *netdev)
588
589
}
589
590
590
591
static void mlx5e_build_rep_netdev (struct net_device * netdev ,
591
- struct mlx5_core_dev * mdev ,
592
- struct mlx5_eswitch_rep * rep )
592
+ struct mlx5_core_dev * mdev )
593
593
{
594
594
SET_NETDEV_DEV (netdev , mdev -> device );
595
- if (rep -> vport == MLX5_VPORT_UPLINK ) {
596
- netdev -> netdev_ops = & mlx5e_netdev_ops ;
597
- /* we want a persistent mac for the uplink rep */
598
- mlx5_query_mac_address (mdev , netdev -> dev_addr );
599
- netdev -> ethtool_ops = & mlx5e_ethtool_ops ;
600
- mlx5e_dcbnl_build_rep_netdev (netdev );
601
- } else {
602
- netdev -> netdev_ops = & mlx5e_netdev_ops_rep ;
603
- eth_hw_addr_random (netdev );
604
- netdev -> ethtool_ops = & mlx5e_rep_ethtool_ops ;
605
- }
595
+ netdev -> netdev_ops = & mlx5e_netdev_ops_rep ;
596
+ eth_hw_addr_random (netdev );
597
+ netdev -> ethtool_ops = & mlx5e_rep_ethtool_ops ;
606
598
607
599
netdev -> watchdog_timeo = 15 * HZ ;
608
600
609
- netdev -> features |= NETIF_F_NETNS_LOCAL ;
610
-
611
601
#if IS_ENABLED (CONFIG_MLX5_CLS_ACT )
612
602
netdev -> hw_features |= NETIF_F_HW_TC ;
613
603
#endif
@@ -619,12 +609,9 @@ static void mlx5e_build_rep_netdev(struct net_device *netdev,
619
609
netdev -> hw_features |= NETIF_F_TSO6 ;
620
610
netdev -> hw_features |= NETIF_F_RXCSUM ;
621
611
622
- if (rep -> vport == MLX5_VPORT_UPLINK )
623
- netdev -> hw_features |= NETIF_F_HW_VLAN_CTAG_RX ;
624
- else
625
- netdev -> features |= NETIF_F_VLAN_CHALLENGED ;
626
-
627
612
netdev -> features |= netdev -> hw_features ;
613
+ netdev -> features |= NETIF_F_VLAN_CHALLENGED ;
614
+ netdev -> features |= NETIF_F_NETNS_LOCAL ;
628
615
}
629
616
630
617
static int mlx5e_init_rep (struct mlx5_core_dev * mdev ,
@@ -990,13 +977,27 @@ static void mlx5e_uplink_rep_enable(struct mlx5e_priv *priv)
990
977
mlx5e_dcbnl_initialize (priv );
991
978
mlx5e_dcbnl_init_app (priv );
992
979
mlx5e_rep_neigh_init (rpriv );
980
+
981
+ netdev -> wanted_features |= NETIF_F_HW_TC ;
982
+
983
+ rtnl_lock ();
984
+ if (netif_running (netdev ))
985
+ mlx5e_open (netdev );
986
+ netif_device_attach (netdev );
987
+ rtnl_unlock ();
993
988
}
994
989
995
990
static void mlx5e_uplink_rep_disable (struct mlx5e_priv * priv )
996
991
{
997
992
struct mlx5e_rep_priv * rpriv = priv -> ppriv ;
998
993
struct mlx5_core_dev * mdev = priv -> mdev ;
999
994
995
+ rtnl_lock ();
996
+ if (netif_running (priv -> netdev ))
997
+ mlx5e_close (priv -> netdev );
998
+ netif_device_detach (priv -> netdev );
999
+ rtnl_unlock ();
1000
+
1000
1001
mlx5e_rep_neigh_cleanup (rpriv );
1001
1002
mlx5e_dcbnl_delete_app (priv );
1002
1003
mlx5_notifier_unregister (mdev , & priv -> events_nb );
@@ -1081,26 +1082,56 @@ static const struct mlx5e_profile mlx5e_uplink_rep_profile = {
1081
1082
1082
1083
/* e-Switch vport representors */
1083
1084
static int
1084
- mlx5e_vport_rep_load (struct mlx5_core_dev * dev , struct mlx5_eswitch_rep * rep )
1085
+ mlx5e_vport_uplink_rep_load (struct mlx5_core_dev * dev , struct mlx5_eswitch_rep * rep )
1086
+ {
1087
+ struct mlx5e_priv * priv = netdev_priv (mlx5_uplink_netdev_get (dev ));
1088
+ struct mlx5e_rep_priv * rpriv = mlx5e_rep_to_rep_priv (rep );
1089
+ struct devlink_port * dl_port ;
1090
+ int err ;
1091
+
1092
+ rpriv -> netdev = priv -> netdev ;
1093
+
1094
+ err = mlx5e_netdev_change_profile (priv , & mlx5e_uplink_rep_profile ,
1095
+ rpriv );
1096
+ if (err )
1097
+ return err ;
1098
+
1099
+ dl_port = mlx5_esw_offloads_devlink_port (dev -> priv .eswitch , rpriv -> rep -> vport );
1100
+ if (dl_port )
1101
+ devlink_port_type_eth_set (dl_port , rpriv -> netdev );
1102
+
1103
+ return 0 ;
1104
+ }
1105
+
1106
+ static void
1107
+ mlx5e_vport_uplink_rep_unload (struct mlx5e_rep_priv * rpriv )
1108
+ {
1109
+ struct net_device * netdev = rpriv -> netdev ;
1110
+ struct devlink_port * dl_port ;
1111
+ struct mlx5_core_dev * dev ;
1112
+ struct mlx5e_priv * priv ;
1113
+
1114
+ priv = netdev_priv (netdev );
1115
+ dev = priv -> mdev ;
1116
+
1117
+ dl_port = mlx5_esw_offloads_devlink_port (dev -> priv .eswitch , rpriv -> rep -> vport );
1118
+ if (dl_port )
1119
+ devlink_port_type_clear (dl_port );
1120
+ mlx5e_netdev_attach_nic_profile (priv );
1121
+ }
1122
+
1123
+ static int
1124
+ mlx5e_vport_vf_rep_load (struct mlx5_core_dev * dev , struct mlx5_eswitch_rep * rep )
1085
1125
{
1126
+ struct mlx5e_rep_priv * rpriv = mlx5e_rep_to_rep_priv (rep );
1086
1127
const struct mlx5e_profile * profile ;
1087
- struct mlx5e_rep_priv * rpriv ;
1088
1128
struct devlink_port * dl_port ;
1089
1129
struct net_device * netdev ;
1090
1130
struct mlx5e_priv * priv ;
1091
1131
unsigned int txqs , rxqs ;
1092
1132
int nch , err ;
1093
1133
1094
- rpriv = kzalloc (sizeof (* rpriv ), GFP_KERNEL );
1095
- if (!rpriv )
1096
- return - ENOMEM ;
1097
-
1098
- /* rpriv->rep to be looked up when profile->init() is called */
1099
- rpriv -> rep = rep ;
1100
-
1101
- profile = (rep -> vport == MLX5_VPORT_UPLINK ) ?
1102
- & mlx5e_uplink_rep_profile : & mlx5e_rep_profile ;
1103
-
1134
+ profile = & mlx5e_rep_profile ;
1104
1135
nch = mlx5e_get_max_num_channels (dev );
1105
1136
txqs = nch * profile -> max_tc ;
1106
1137
rxqs = nch * profile -> rq_groups ;
@@ -1109,29 +1140,19 @@ mlx5e_vport_rep_load(struct mlx5_core_dev *dev, struct mlx5_eswitch_rep *rep)
1109
1140
mlx5_core_warn (dev ,
1110
1141
"Failed to create representor netdev for vport %d\n" ,
1111
1142
rep -> vport );
1112
- kfree (rpriv );
1113
1143
return - EINVAL ;
1114
1144
}
1115
1145
1116
- mlx5e_build_rep_netdev (netdev , dev , rep );
1117
-
1146
+ mlx5e_build_rep_netdev (netdev , dev );
1118
1147
rpriv -> netdev = netdev ;
1119
- rep -> rep_data [REP_ETH ].priv = rpriv ;
1120
- INIT_LIST_HEAD (& rpriv -> vport_sqs_list );
1121
-
1122
- if (rep -> vport == MLX5_VPORT_UPLINK ) {
1123
- err = mlx5e_create_mdev_resources (dev );
1124
- if (err )
1125
- goto err_destroy_netdev ;
1126
- }
1127
1148
1128
1149
priv = netdev_priv (netdev );
1129
1150
priv -> profile = profile ;
1130
1151
priv -> ppriv = rpriv ;
1131
1152
err = profile -> init (dev , netdev );
1132
1153
if (err ) {
1133
1154
netdev_warn (netdev , "rep profile init failed, %d\n" , err );
1134
- goto err_destroy_mdev_resources ;
1155
+ goto err_destroy_netdev ;
1135
1156
}
1136
1157
1137
1158
err = mlx5e_attach_netdev (netdev_priv (netdev ));
@@ -1161,13 +1182,34 @@ mlx5e_vport_rep_load(struct mlx5_core_dev *dev, struct mlx5_eswitch_rep *rep)
1161
1182
err_cleanup_profile :
1162
1183
priv -> profile -> cleanup (priv );
1163
1184
1164
- err_destroy_mdev_resources :
1165
- if (rep -> vport == MLX5_VPORT_UPLINK )
1166
- mlx5e_destroy_mdev_resources (dev );
1167
-
1168
1185
err_destroy_netdev :
1169
1186
mlx5e_destroy_netdev (netdev_priv (netdev ));
1170
- kfree (rpriv );
1187
+ return err ;
1188
+ }
1189
+
1190
+ static int
1191
+ mlx5e_vport_rep_load (struct mlx5_core_dev * dev , struct mlx5_eswitch_rep * rep )
1192
+ {
1193
+ struct mlx5e_rep_priv * rpriv ;
1194
+ int err ;
1195
+
1196
+ rpriv = kzalloc (sizeof (* rpriv ), GFP_KERNEL );
1197
+ if (!rpriv )
1198
+ return - ENOMEM ;
1199
+
1200
+ /* rpriv->rep to be looked up when profile->init() is called */
1201
+ rpriv -> rep = rep ;
1202
+ rep -> rep_data [REP_ETH ].priv = rpriv ;
1203
+ INIT_LIST_HEAD (& rpriv -> vport_sqs_list );
1204
+
1205
+ if (rep -> vport == MLX5_VPORT_UPLINK )
1206
+ err = mlx5e_vport_uplink_rep_load (dev , rep );
1207
+ else
1208
+ err = mlx5e_vport_vf_rep_load (dev , rep );
1209
+
1210
+ if (err )
1211
+ kfree (rpriv );
1212
+
1171
1213
return err ;
1172
1214
}
1173
1215
@@ -1181,15 +1223,19 @@ mlx5e_vport_rep_unload(struct mlx5_eswitch_rep *rep)
1181
1223
struct devlink_port * dl_port ;
1182
1224
void * ppriv = priv -> ppriv ;
1183
1225
1226
+ if (rep -> vport == MLX5_VPORT_UPLINK ) {
1227
+ mlx5e_vport_uplink_rep_unload (rpriv );
1228
+ goto free_ppriv ;
1229
+ }
1230
+
1184
1231
dl_port = mlx5_esw_offloads_devlink_port (dev -> priv .eswitch , rpriv -> rep -> vport );
1185
1232
if (dl_port )
1186
1233
devlink_port_type_clear (dl_port );
1187
1234
unregister_netdev (netdev );
1188
1235
mlx5e_detach_netdev (priv );
1189
1236
priv -> profile -> cleanup (priv );
1190
- if (rep -> vport == MLX5_VPORT_UPLINK )
1191
- mlx5e_destroy_mdev_resources (priv -> mdev );
1192
1237
mlx5e_destroy_netdev (priv );
1238
+ free_ppriv :
1193
1239
kfree (ppriv ); /* mlx5e_rep_priv */
1194
1240
}
1195
1241
0 commit comments