aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid S. Miller <davem@davemloft.net>2018-12-18 19:44:45 -0500
committerDavid S. Miller <davem@davemloft.net>2018-12-18 19:44:45 -0500
commit6c86bc23421ec7949d91b359d831bf8fcfa80ce5 (patch)
treed0ef265d9e2eed29883aa4a7527e725c2ae3ee4f
parenta26d94bff4d5af7c9bf5d5e779282e2258966ec3 (diff)
parentff9b85de5d5d292fa07869f194fd9e3966f1e720 (diff)
Merge tag 'mlx5-uplink-rep-2018-12-15' of git://git.kernel.org/pub/scm/linux/kernel/git/saeed/linux
Saeed Mahameed: ==================== mlx5-uplink-rep-2018-12-15 Or Gerlitz says: This series is essentially a cleanup to align with the rest of the NIC switchdev drivers and make us more robust and clear/n: currently the PF netdev serves as the mlx5 e-switch uplink netdev representor when going into switchdev mode and back as plain NIC netdev when going out. This causes some irregularities and misc troubles. Move to use dedicated uplink rep, as we have for the VF vports. The uplink rep netdev does has sysfs link and supports the sriov vf mac ndo, these two are in use by libvirt and other orchestrators, It also has richer ethtool support to allow controlling the port link & mtu along with supporting dcb and plugging into the mlx5 lag logic. ==================== Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r--drivers/net/ethernet/mellanox/mlx5/core/en.h24
-rw-r--r--drivers/net/ethernet/mellanox/mlx5/core/en_ethtool.c68
-rw-r--r--drivers/net/ethernet/mellanox/mlx5/core/en_main.c91
-rw-r--r--drivers/net/ethernet/mellanox/mlx5/core/en_rep.c535
-rw-r--r--drivers/net/ethernet/mellanox/mlx5/core/en_rep.h14
-rw-r--r--drivers/net/ethernet/mellanox/mlx5/core/en_stats.c2
-rw-r--r--drivers/net/ethernet/mellanox/mlx5/core/en_stats.h1
-rw-r--r--drivers/net/ethernet/mellanox/mlx5/core/en_tc.c39
-rw-r--r--drivers/net/ethernet/mellanox/mlx5/core/en_tc.h8
-rw-r--r--drivers/net/ethernet/mellanox/mlx5/core/eswitch.c11
-rw-r--r--drivers/net/ethernet/mellanox/mlx5/core/eswitch_offloads.c3
11 files changed, 501 insertions, 295 deletions
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en.h b/drivers/net/ethernet/mellanox/mlx5/core/en.h
index 1c4e033b7509..72cc204f9a34 100644
--- a/drivers/net/ethernet/mellanox/mlx5/core/en.h
+++ b/drivers/net/ethernet/mellanox/mlx5/core/en.h
@@ -775,6 +775,7 @@ mlx5e_skb_from_cqe_nonlinear(struct mlx5e_rq *rq, struct mlx5_cqe64 *cqe,
775 struct mlx5e_wqe_frag_info *wi, u32 cqe_bcnt); 775 struct mlx5e_wqe_frag_info *wi, u32 cqe_bcnt);
776 776
777void mlx5e_update_stats(struct mlx5e_priv *priv); 777void mlx5e_update_stats(struct mlx5e_priv *priv);
778void mlx5e_get_stats(struct net_device *dev, struct rtnl_link_stats64 *stats);
778 779
779void mlx5e_init_l2_addr(struct mlx5e_priv *priv); 780void mlx5e_init_l2_addr(struct mlx5e_priv *priv);
780int mlx5e_self_test_num(struct mlx5e_priv *priv); 781int mlx5e_self_test_num(struct mlx5e_priv *priv);
@@ -939,7 +940,7 @@ int mlx5e_create_tis(struct mlx5_core_dev *mdev, int tc,
939void mlx5e_destroy_tis(struct mlx5_core_dev *mdev, u32 tisn); 940void mlx5e_destroy_tis(struct mlx5_core_dev *mdev, u32 tisn);
940 941
941int mlx5e_create_tises(struct mlx5e_priv *priv); 942int mlx5e_create_tises(struct mlx5e_priv *priv);
942void mlx5e_cleanup_nic_tx(struct mlx5e_priv *priv); 943void mlx5e_update_carrier(struct mlx5e_priv *priv);
943int mlx5e_close(struct net_device *netdev); 944int mlx5e_close(struct net_device *netdev);
944int mlx5e_open(struct net_device *netdev); 945int mlx5e_open(struct net_device *netdev);
945void mlx5e_update_ndo_stats(struct mlx5e_priv *priv); 946void mlx5e_update_ndo_stats(struct mlx5e_priv *priv);
@@ -948,6 +949,7 @@ void mlx5e_queue_update_stats(struct mlx5e_priv *priv);
948int mlx5e_bits_invert(unsigned long a, int size); 949int mlx5e_bits_invert(unsigned long a, int size);
949 950
950typedef int (*change_hw_mtu_cb)(struct mlx5e_priv *priv); 951typedef int (*change_hw_mtu_cb)(struct mlx5e_priv *priv);
952int mlx5e_set_dev_port_mtu(struct mlx5e_priv *priv);
951int mlx5e_change_mtu(struct net_device *netdev, int new_mtu, 953int mlx5e_change_mtu(struct net_device *netdev, int new_mtu,
952 change_hw_mtu_cb set_mtu_cb); 954 change_hw_mtu_cb set_mtu_cb);
953 955
@@ -971,12 +973,20 @@ int mlx5e_ethtool_get_coalesce(struct mlx5e_priv *priv,
971 struct ethtool_coalesce *coal); 973 struct ethtool_coalesce *coal);
972int mlx5e_ethtool_set_coalesce(struct mlx5e_priv *priv, 974int mlx5e_ethtool_set_coalesce(struct mlx5e_priv *priv,
973 struct ethtool_coalesce *coal); 975 struct ethtool_coalesce *coal);
976int mlx5e_ethtool_get_link_ksettings(struct mlx5e_priv *priv,
977 struct ethtool_link_ksettings *link_ksettings);
978int mlx5e_ethtool_set_link_ksettings(struct mlx5e_priv *priv,
979 const struct ethtool_link_ksettings *link_ksettings);
974u32 mlx5e_ethtool_get_rxfh_key_size(struct mlx5e_priv *priv); 980u32 mlx5e_ethtool_get_rxfh_key_size(struct mlx5e_priv *priv);
975u32 mlx5e_ethtool_get_rxfh_indir_size(struct mlx5e_priv *priv); 981u32 mlx5e_ethtool_get_rxfh_indir_size(struct mlx5e_priv *priv);
976int mlx5e_ethtool_get_ts_info(struct mlx5e_priv *priv, 982int mlx5e_ethtool_get_ts_info(struct mlx5e_priv *priv,
977 struct ethtool_ts_info *info); 983 struct ethtool_ts_info *info);
978int mlx5e_ethtool_flash_device(struct mlx5e_priv *priv, 984int mlx5e_ethtool_flash_device(struct mlx5e_priv *priv,
979 struct ethtool_flash *flash); 985 struct ethtool_flash *flash);
986void mlx5e_ethtool_get_pauseparam(struct mlx5e_priv *priv,
987 struct ethtool_pauseparam *pauseparam);
988int mlx5e_ethtool_set_pauseparam(struct mlx5e_priv *priv,
989 struct ethtool_pauseparam *pauseparam);
980 990
981/* mlx5e generic netdev management API */ 991/* mlx5e generic netdev management API */
982int mlx5e_netdev_init(struct net_device *netdev, 992int mlx5e_netdev_init(struct net_device *netdev,
@@ -1002,4 +1012,16 @@ void mlx5e_build_rss_params(struct mlx5e_rss_params *rss_params,
1002u8 mlx5e_params_calculate_tx_min_inline(struct mlx5_core_dev *mdev); 1012u8 mlx5e_params_calculate_tx_min_inline(struct mlx5_core_dev *mdev);
1003void mlx5e_rx_dim_work(struct work_struct *work); 1013void mlx5e_rx_dim_work(struct work_struct *work);
1004void mlx5e_tx_dim_work(struct work_struct *work); 1014void mlx5e_tx_dim_work(struct work_struct *work);
1015
1016void mlx5e_add_vxlan_port(struct net_device *netdev, struct udp_tunnel_info *ti);
1017void mlx5e_del_vxlan_port(struct net_device *netdev, struct udp_tunnel_info *ti);
1018netdev_features_t mlx5e_features_check(struct sk_buff *skb,
1019 struct net_device *netdev,
1020 netdev_features_t features);
1021#ifdef CONFIG_MLX5_ESWITCH
1022int mlx5e_set_vf_mac(struct net_device *dev, int vf, u8 *mac);
1023int mlx5e_set_vf_rate(struct net_device *dev, int vf, int min_tx_rate, int max_tx_rate);
1024int mlx5e_get_vf_config(struct net_device *dev, int vf, struct ifla_vf_info *ivi);
1025int mlx5e_get_vf_stats(struct net_device *dev, int vf, struct ifla_vf_stats *vf_stats);
1026#endif
1005#endif /* __MLX5_EN_H__ */ 1027#endif /* __MLX5_EN_H__ */
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_ethtool.c b/drivers/net/ethernet/mellanox/mlx5/core/en_ethtool.c
index da4bb62ac528..6af587cf147f 100644
--- a/drivers/net/ethernet/mellanox/mlx5/core/en_ethtool.c
+++ b/drivers/net/ethernet/mellanox/mlx5/core/en_ethtool.c
@@ -787,10 +787,9 @@ static void get_lp_advertising(u32 eth_proto_lp,
787 ptys2ethtool_adver_link(lp_advertising, eth_proto_lp); 787 ptys2ethtool_adver_link(lp_advertising, eth_proto_lp);
788} 788}
789 789
790static int mlx5e_get_link_ksettings(struct net_device *netdev, 790int mlx5e_ethtool_get_link_ksettings(struct mlx5e_priv *priv,
791 struct ethtool_link_ksettings *link_ksettings) 791 struct ethtool_link_ksettings *link_ksettings)
792{ 792{
793 struct mlx5e_priv *priv = netdev_priv(netdev);
794 struct mlx5_core_dev *mdev = priv->mdev; 793 struct mlx5_core_dev *mdev = priv->mdev;
795 u32 out[MLX5_ST_SZ_DW(ptys_reg)] = {0}; 794 u32 out[MLX5_ST_SZ_DW(ptys_reg)] = {0};
796 u32 rx_pause = 0; 795 u32 rx_pause = 0;
@@ -806,7 +805,7 @@ static int mlx5e_get_link_ksettings(struct net_device *netdev,
806 805
807 err = mlx5_query_port_ptys(mdev, out, sizeof(out), MLX5_PTYS_EN, 1); 806 err = mlx5_query_port_ptys(mdev, out, sizeof(out), MLX5_PTYS_EN, 1);
808 if (err) { 807 if (err) {
809 netdev_err(netdev, "%s: query port ptys failed: %d\n", 808 netdev_err(priv->netdev, "%s: query port ptys failed: %d\n",
810 __func__, err); 809 __func__, err);
811 goto err_query_regs; 810 goto err_query_regs;
812 } 811 }
@@ -826,7 +825,7 @@ static int mlx5e_get_link_ksettings(struct net_device *netdev,
826 825
827 get_supported(eth_proto_cap, link_ksettings); 826 get_supported(eth_proto_cap, link_ksettings);
828 get_advertising(eth_proto_admin, tx_pause, rx_pause, link_ksettings); 827 get_advertising(eth_proto_admin, tx_pause, rx_pause, link_ksettings);
829 get_speed_duplex(netdev, eth_proto_oper, link_ksettings); 828 get_speed_duplex(priv->netdev, eth_proto_oper, link_ksettings);
830 829
831 eth_proto_oper = eth_proto_oper ? eth_proto_oper : eth_proto_cap; 830 eth_proto_oper = eth_proto_oper ? eth_proto_oper : eth_proto_cap;
832 831
@@ -846,7 +845,7 @@ static int mlx5e_get_link_ksettings(struct net_device *netdev,
846 Autoneg); 845 Autoneg);
847 846
848 if (get_fec_supported_advertised(mdev, link_ksettings)) 847 if (get_fec_supported_advertised(mdev, link_ksettings))
849 netdev_dbg(netdev, "%s: FEC caps query failed: %d\n", 848 netdev_dbg(priv->netdev, "%s: FEC caps query failed: %d\n",
850 __func__, err); 849 __func__, err);
851 850
852 if (!an_disable_admin) 851 if (!an_disable_admin)
@@ -857,6 +856,14 @@ err_query_regs:
857 return err; 856 return err;
858} 857}
859 858
859static int mlx5e_get_link_ksettings(struct net_device *netdev,
860 struct ethtool_link_ksettings *link_ksettings)
861{
862 struct mlx5e_priv *priv = netdev_priv(netdev);
863
864 return mlx5e_ethtool_get_link_ksettings(priv, link_ksettings);
865}
866
860static u32 mlx5e_ethtool2ptys_adver_link(const unsigned long *link_modes) 867static u32 mlx5e_ethtool2ptys_adver_link(const unsigned long *link_modes)
861{ 868{
862 u32 i, ptys_modes = 0; 869 u32 i, ptys_modes = 0;
@@ -871,10 +878,9 @@ static u32 mlx5e_ethtool2ptys_adver_link(const unsigned long *link_modes)
871 return ptys_modes; 878 return ptys_modes;
872} 879}
873 880
874static int mlx5e_set_link_ksettings(struct net_device *netdev, 881int mlx5e_ethtool_set_link_ksettings(struct mlx5e_priv *priv,
875 const struct ethtool_link_ksettings *link_ksettings) 882 const struct ethtool_link_ksettings *link_ksettings)
876{ 883{
877 struct mlx5e_priv *priv = netdev_priv(netdev);
878 struct mlx5_core_dev *mdev = priv->mdev; 884 struct mlx5_core_dev *mdev = priv->mdev;
879 u32 eth_proto_cap, eth_proto_admin; 885 u32 eth_proto_cap, eth_proto_admin;
880 bool an_changes = false; 886 bool an_changes = false;
@@ -894,14 +900,14 @@ static int mlx5e_set_link_ksettings(struct net_device *netdev,
894 900
895 err = mlx5_query_port_proto_cap(mdev, &eth_proto_cap, MLX5_PTYS_EN); 901 err = mlx5_query_port_proto_cap(mdev, &eth_proto_cap, MLX5_PTYS_EN);
896 if (err) { 902 if (err) {
897 netdev_err(netdev, "%s: query port eth proto cap failed: %d\n", 903 netdev_err(priv->netdev, "%s: query port eth proto cap failed: %d\n",
898 __func__, err); 904 __func__, err);
899 goto out; 905 goto out;
900 } 906 }
901 907
902 link_modes = link_modes & eth_proto_cap; 908 link_modes = link_modes & eth_proto_cap;
903 if (!link_modes) { 909 if (!link_modes) {
904 netdev_err(netdev, "%s: Not supported link mode(s) requested", 910 netdev_err(priv->netdev, "%s: Not supported link mode(s) requested",
905 __func__); 911 __func__);
906 err = -EINVAL; 912 err = -EINVAL;
907 goto out; 913 goto out;
@@ -909,7 +915,7 @@ static int mlx5e_set_link_ksettings(struct net_device *netdev,
909 915
910 err = mlx5_query_port_proto_admin(mdev, &eth_proto_admin, MLX5_PTYS_EN); 916 err = mlx5_query_port_proto_admin(mdev, &eth_proto_admin, MLX5_PTYS_EN);
911 if (err) { 917 if (err) {
912 netdev_err(netdev, "%s: query port eth proto admin failed: %d\n", 918 netdev_err(priv->netdev, "%s: query port eth proto admin failed: %d\n",
913 __func__, err); 919 __func__, err);
914 goto out; 920 goto out;
915 } 921 }
@@ -931,6 +937,14 @@ out:
931 return err; 937 return err;
932} 938}
933 939
940static int mlx5e_set_link_ksettings(struct net_device *netdev,
941 const struct ethtool_link_ksettings *link_ksettings)
942{
943 struct mlx5e_priv *priv = netdev_priv(netdev);
944
945 return mlx5e_ethtool_set_link_ksettings(priv, link_ksettings);
946}
947
934u32 mlx5e_ethtool_get_rxfh_key_size(struct mlx5e_priv *priv) 948u32 mlx5e_ethtool_get_rxfh_key_size(struct mlx5e_priv *priv)
935{ 949{
936 return sizeof(priv->rss_params.toeplitz_hash_key); 950 return sizeof(priv->rss_params.toeplitz_hash_key);
@@ -1127,25 +1141,31 @@ static int mlx5e_set_tunable(struct net_device *dev,
1127 return err; 1141 return err;
1128} 1142}
1129 1143
1130static void mlx5e_get_pauseparam(struct net_device *netdev, 1144void mlx5e_ethtool_get_pauseparam(struct mlx5e_priv *priv,
1131 struct ethtool_pauseparam *pauseparam) 1145 struct ethtool_pauseparam *pauseparam)
1132{ 1146{
1133 struct mlx5e_priv *priv = netdev_priv(netdev);
1134 struct mlx5_core_dev *mdev = priv->mdev; 1147 struct mlx5_core_dev *mdev = priv->mdev;
1135 int err; 1148 int err;
1136 1149
1137 err = mlx5_query_port_pause(mdev, &pauseparam->rx_pause, 1150 err = mlx5_query_port_pause(mdev, &pauseparam->rx_pause,
1138 &pauseparam->tx_pause); 1151 &pauseparam->tx_pause);
1139 if (err) { 1152 if (err) {
1140 netdev_err(netdev, "%s: mlx5_query_port_pause failed:0x%x\n", 1153 netdev_err(priv->netdev, "%s: mlx5_query_port_pause failed:0x%x\n",
1141 __func__, err); 1154 __func__, err);
1142 } 1155 }
1143} 1156}
1144 1157
1145static int mlx5e_set_pauseparam(struct net_device *netdev, 1158static void mlx5e_get_pauseparam(struct net_device *netdev,
1146 struct ethtool_pauseparam *pauseparam) 1159 struct ethtool_pauseparam *pauseparam)
1160{
1161 struct mlx5e_priv *priv = netdev_priv(netdev);
1162
1163 mlx5e_ethtool_get_pauseparam(priv, pauseparam);
1164}
1165
1166int mlx5e_ethtool_set_pauseparam(struct mlx5e_priv *priv,
1167 struct ethtool_pauseparam *pauseparam)
1147{ 1168{
1148 struct mlx5e_priv *priv = netdev_priv(netdev);
1149 struct mlx5_core_dev *mdev = priv->mdev; 1169 struct mlx5_core_dev *mdev = priv->mdev;
1150 int err; 1170 int err;
1151 1171
@@ -1156,13 +1176,21 @@ static int mlx5e_set_pauseparam(struct net_device *netdev,
1156 pauseparam->rx_pause ? 1 : 0, 1176 pauseparam->rx_pause ? 1 : 0,
1157 pauseparam->tx_pause ? 1 : 0); 1177 pauseparam->tx_pause ? 1 : 0);
1158 if (err) { 1178 if (err) {
1159 netdev_err(netdev, "%s: mlx5_set_port_pause failed:0x%x\n", 1179 netdev_err(priv->netdev, "%s: mlx5_set_port_pause failed:0x%x\n",
1160 __func__, err); 1180 __func__, err);
1161 } 1181 }
1162 1182
1163 return err; 1183 return err;
1164} 1184}
1165 1185
1186static int mlx5e_set_pauseparam(struct net_device *netdev,
1187 struct ethtool_pauseparam *pauseparam)
1188{
1189 struct mlx5e_priv *priv = netdev_priv(netdev);
1190
1191 return mlx5e_ethtool_set_pauseparam(priv, pauseparam);
1192}
1193
1166int mlx5e_ethtool_get_ts_info(struct mlx5e_priv *priv, 1194int mlx5e_ethtool_get_ts_info(struct mlx5e_priv *priv,
1167 struct ethtool_ts_info *info) 1195 struct ethtool_ts_info *info)
1168{ 1196{
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_main.c b/drivers/net/ethernet/mellanox/mlx5/core/en_main.c
index 59745851b5ba..cd6872a9e4dc 100644
--- a/drivers/net/ethernet/mellanox/mlx5/core/en_main.c
+++ b/drivers/net/ethernet/mellanox/mlx5/core/en_main.c
@@ -225,7 +225,7 @@ void mlx5e_set_rq_type(struct mlx5_core_dev *mdev, struct mlx5e_params *params)
225 MLX5_WQ_TYPE_CYCLIC; 225 MLX5_WQ_TYPE_CYCLIC;
226} 226}
227 227
228static void mlx5e_update_carrier(struct mlx5e_priv *priv) 228void mlx5e_update_carrier(struct mlx5e_priv *priv)
229{ 229{
230 struct mlx5_core_dev *mdev = priv->mdev; 230 struct mlx5_core_dev *mdev = priv->mdev;
231 u8 port_state; 231 u8 port_state;
@@ -2821,7 +2821,7 @@ static void mlx5e_query_mtu(struct mlx5_core_dev *mdev,
2821 *mtu = MLX5E_HW2SW_MTU(params, hw_mtu); 2821 *mtu = MLX5E_HW2SW_MTU(params, hw_mtu);
2822} 2822}
2823 2823
2824static int mlx5e_set_dev_port_mtu(struct mlx5e_priv *priv) 2824int mlx5e_set_dev_port_mtu(struct mlx5e_priv *priv)
2825{ 2825{
2826 struct mlx5e_params *params = &priv->channels.params; 2826 struct mlx5e_params *params = &priv->channels.params;
2827 struct net_device *netdev = priv->netdev; 2827 struct net_device *netdev = priv->netdev;
@@ -2901,7 +2901,7 @@ void mlx5e_activate_priv_channels(struct mlx5e_priv *priv)
2901 mlx5e_activate_channels(&priv->channels); 2901 mlx5e_activate_channels(&priv->channels);
2902 netif_tx_start_all_queues(priv->netdev); 2902 netif_tx_start_all_queues(priv->netdev);
2903 2903
2904 if (MLX5_ESWITCH_MANAGER(priv->mdev)) 2904 if (mlx5e_is_vport_rep(priv))
2905 mlx5e_add_sqs_fwd_rules(priv); 2905 mlx5e_add_sqs_fwd_rules(priv);
2906 2906
2907 mlx5e_wait_channels_min_rx_wqes(&priv->channels); 2907 mlx5e_wait_channels_min_rx_wqes(&priv->channels);
@@ -2912,7 +2912,7 @@ void mlx5e_deactivate_priv_channels(struct mlx5e_priv *priv)
2912{ 2912{
2913 mlx5e_redirect_rqts_to_drop(priv); 2913 mlx5e_redirect_rqts_to_drop(priv);
2914 2914
2915 if (MLX5_ESWITCH_MANAGER(priv->mdev)) 2915 if (mlx5e_is_vport_rep(priv))
2916 mlx5e_remove_sqs_fwd_rules(priv); 2916 mlx5e_remove_sqs_fwd_rules(priv);
2917 2917
2918 /* FIXME: This is a W/A only for tx timeout watch dog false alarm when 2918 /* FIXME: This is a W/A only for tx timeout watch dog false alarm when
@@ -3164,7 +3164,7 @@ err_close_tises:
3164 return err; 3164 return err;
3165} 3165}
3166 3166
3167void mlx5e_cleanup_nic_tx(struct mlx5e_priv *priv) 3167static void mlx5e_cleanup_nic_tx(struct mlx5e_priv *priv)
3168{ 3168{
3169 int tc; 3169 int tc;
3170 3170
@@ -3409,7 +3409,8 @@ static int mlx5e_setup_tc_block_cb(enum tc_setup_type type, void *type_data,
3409 3409
3410 switch (type) { 3410 switch (type) {
3411 case TC_SETUP_CLSFLOWER: 3411 case TC_SETUP_CLSFLOWER:
3412 return mlx5e_setup_tc_cls_flower(priv, type_data, MLX5E_TC_INGRESS); 3412 return mlx5e_setup_tc_cls_flower(priv, type_data, MLX5E_TC_INGRESS |
3413 MLX5E_TC_NIC_OFFLOAD);
3413 default: 3414 default:
3414 return -EOPNOTSUPP; 3415 return -EOPNOTSUPP;
3415 } 3416 }
@@ -3452,7 +3453,7 @@ static int mlx5e_setup_tc(struct net_device *dev, enum tc_setup_type type,
3452 } 3453 }
3453} 3454}
3454 3455
3455static void 3456void
3456mlx5e_get_stats(struct net_device *dev, struct rtnl_link_stats64 *stats) 3457mlx5e_get_stats(struct net_device *dev, struct rtnl_link_stats64 *stats)
3457{ 3458{
3458 struct mlx5e_priv *priv = netdev_priv(dev); 3459 struct mlx5e_priv *priv = netdev_priv(dev);
@@ -3596,7 +3597,7 @@ static int set_feature_tc_num_filters(struct net_device *netdev, bool enable)
3596{ 3597{
3597 struct mlx5e_priv *priv = netdev_priv(netdev); 3598 struct mlx5e_priv *priv = netdev_priv(netdev);
3598 3599
3599 if (!enable && mlx5e_tc_num_filters(priv)) { 3600 if (!enable && mlx5e_tc_num_filters(priv, MLX5E_TC_NIC_OFFLOAD)) {
3600 netdev_err(netdev, 3601 netdev_err(netdev,
3601 "Active offloaded tc filters, can't turn hw_tc_offload off\n"); 3602 "Active offloaded tc filters, can't turn hw_tc_offload off\n");
3602 return -EINVAL; 3603 return -EINVAL;
@@ -3898,7 +3899,7 @@ static int mlx5e_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
3898} 3899}
3899 3900
3900#ifdef CONFIG_MLX5_ESWITCH 3901#ifdef CONFIG_MLX5_ESWITCH
3901static int mlx5e_set_vf_mac(struct net_device *dev, int vf, u8 *mac) 3902int mlx5e_set_vf_mac(struct net_device *dev, int vf, u8 *mac)
3902{ 3903{
3903 struct mlx5e_priv *priv = netdev_priv(dev); 3904 struct mlx5e_priv *priv = netdev_priv(dev);
3904 struct mlx5_core_dev *mdev = priv->mdev; 3905 struct mlx5_core_dev *mdev = priv->mdev;
@@ -3935,8 +3936,8 @@ static int mlx5e_set_vf_trust(struct net_device *dev, int vf, bool setting)
3935 return mlx5_eswitch_set_vport_trust(mdev->priv.eswitch, vf + 1, setting); 3936 return mlx5_eswitch_set_vport_trust(mdev->priv.eswitch, vf + 1, setting);
3936} 3937}
3937 3938
3938static int mlx5e_set_vf_rate(struct net_device *dev, int vf, int min_tx_rate, 3939int mlx5e_set_vf_rate(struct net_device *dev, int vf, int min_tx_rate,
3939 int max_tx_rate) 3940 int max_tx_rate)
3940{ 3941{
3941 struct mlx5e_priv *priv = netdev_priv(dev); 3942 struct mlx5e_priv *priv = netdev_priv(dev);
3942 struct mlx5_core_dev *mdev = priv->mdev; 3943 struct mlx5_core_dev *mdev = priv->mdev;
@@ -3977,8 +3978,8 @@ static int mlx5e_set_vf_link_state(struct net_device *dev, int vf,
3977 mlx5_ifla_link2vport(link_state)); 3978 mlx5_ifla_link2vport(link_state));
3978} 3979}
3979 3980
3980static int mlx5e_get_vf_config(struct net_device *dev, 3981int mlx5e_get_vf_config(struct net_device *dev,
3981 int vf, struct ifla_vf_info *ivi) 3982 int vf, struct ifla_vf_info *ivi)
3982{ 3983{
3983 struct mlx5e_priv *priv = netdev_priv(dev); 3984 struct mlx5e_priv *priv = netdev_priv(dev);
3984 struct mlx5_core_dev *mdev = priv->mdev; 3985 struct mlx5_core_dev *mdev = priv->mdev;
@@ -3991,8 +3992,8 @@ static int mlx5e_get_vf_config(struct net_device *dev,
3991 return 0; 3992 return 0;
3992} 3993}
3993 3994
3994static int mlx5e_get_vf_stats(struct net_device *dev, 3995int mlx5e_get_vf_stats(struct net_device *dev,
3995 int vf, struct ifla_vf_stats *vf_stats) 3996 int vf, struct ifla_vf_stats *vf_stats)
3996{ 3997{
3997 struct mlx5e_priv *priv = netdev_priv(dev); 3998 struct mlx5e_priv *priv = netdev_priv(dev);
3998 struct mlx5_core_dev *mdev = priv->mdev; 3999 struct mlx5_core_dev *mdev = priv->mdev;
@@ -4053,8 +4054,7 @@ static void mlx5e_vxlan_queue_work(struct mlx5e_priv *priv, u16 port, int add)
4053 queue_work(priv->wq, &vxlan_work->work); 4054 queue_work(priv->wq, &vxlan_work->work);
4054} 4055}
4055 4056
4056static void mlx5e_add_vxlan_port(struct net_device *netdev, 4057void mlx5e_add_vxlan_port(struct net_device *netdev, struct udp_tunnel_info *ti)
4057 struct udp_tunnel_info *ti)
4058{ 4058{
4059 struct mlx5e_priv *priv = netdev_priv(netdev); 4059 struct mlx5e_priv *priv = netdev_priv(netdev);
4060 4060
@@ -4067,8 +4067,7 @@ static void mlx5e_add_vxlan_port(struct net_device *netdev,
4067 mlx5e_vxlan_queue_work(priv, be16_to_cpu(ti->port), 1); 4067 mlx5e_vxlan_queue_work(priv, be16_to_cpu(ti->port), 1);
4068} 4068}
4069 4069
4070static void mlx5e_del_vxlan_port(struct net_device *netdev, 4070void mlx5e_del_vxlan_port(struct net_device *netdev, struct udp_tunnel_info *ti)
4071 struct udp_tunnel_info *ti)
4072{ 4071{
4073 struct mlx5e_priv *priv = netdev_priv(netdev); 4072 struct mlx5e_priv *priv = netdev_priv(netdev);
4074 4073
@@ -4118,9 +4117,9 @@ out:
4118 return features & ~(NETIF_F_CSUM_MASK | NETIF_F_GSO_MASK); 4117 return features & ~(NETIF_F_CSUM_MASK | NETIF_F_GSO_MASK);
4119} 4118}
4120 4119
4121static netdev_features_t mlx5e_features_check(struct sk_buff *skb, 4120netdev_features_t mlx5e_features_check(struct sk_buff *skb,
4122 struct net_device *netdev, 4121 struct net_device *netdev,
4123 netdev_features_t features) 4122 netdev_features_t features)
4124{ 4123{
4125 struct mlx5e_priv *priv = netdev_priv(netdev); 4124 struct mlx5e_priv *priv = netdev_priv(netdev);
4126 4125
@@ -4380,8 +4379,6 @@ const struct net_device_ops mlx5e_netdev_ops = {
4380 .ndo_get_vf_config = mlx5e_get_vf_config, 4379 .ndo_get_vf_config = mlx5e_get_vf_config,
4381 .ndo_set_vf_link_state = mlx5e_set_vf_link_state, 4380 .ndo_set_vf_link_state = mlx5e_set_vf_link_state,
4382 .ndo_get_vf_stats = mlx5e_get_vf_stats, 4381 .ndo_get_vf_stats = mlx5e_get_vf_stats,
4383 .ndo_has_offload_stats = mlx5e_has_offload_stats,
4384 .ndo_get_offload_stats = mlx5e_get_offload_stats,
4385#endif 4382#endif
4386}; 4383};
4387 4384
@@ -4607,12 +4604,6 @@ static void mlx5e_set_netdev_dev_addr(struct net_device *netdev)
4607 } 4604 }
4608} 4605}
4609 4606
4610#if IS_ENABLED(CONFIG_MLX5_ESWITCH)
4611static const struct switchdev_ops mlx5e_switchdev_ops = {
4612 .switchdev_port_attr_get = mlx5e_attr_get,
4613};
4614#endif
4615
4616static void mlx5e_build_nic_netdev(struct net_device *netdev) 4607static void mlx5e_build_nic_netdev(struct net_device *netdev)
4617{ 4608{
4618 struct mlx5e_priv *priv = netdev_priv(netdev); 4609 struct mlx5e_priv *priv = netdev_priv(netdev);
@@ -4722,12 +4713,6 @@ static void mlx5e_build_nic_netdev(struct net_device *netdev)
4722 netdev->priv_flags |= IFF_UNICAST_FLT; 4713 netdev->priv_flags |= IFF_UNICAST_FLT;
4723 4714
4724 mlx5e_set_netdev_dev_addr(netdev); 4715 mlx5e_set_netdev_dev_addr(netdev);
4725
4726#if IS_ENABLED(CONFIG_MLX5_ESWITCH)
4727 if (MLX5_ESWITCH_MANAGER(mdev))
4728 netdev->switchdev_ops = &mlx5e_switchdev_ops;
4729#endif
4730
4731 mlx5e_ipsec_build_netdev(priv); 4716 mlx5e_ipsec_build_netdev(priv);
4732 mlx5e_tls_build_netdev(priv); 4717 mlx5e_tls_build_netdev(priv);
4733} 4718}
@@ -4907,9 +4892,6 @@ static void mlx5e_nic_enable(struct mlx5e_priv *priv)
4907 if (mlx5e_monitor_counter_supported(priv)) 4892 if (mlx5e_monitor_counter_supported(priv))
4908 mlx5e_monitor_counter_init(priv); 4893 mlx5e_monitor_counter_init(priv);
4909 4894
4910 if (MLX5_ESWITCH_MANAGER(priv->mdev))
4911 mlx5e_register_vport_reps(priv);
4912
4913 if (netdev->reg_state != NETREG_REGISTERED) 4895 if (netdev->reg_state != NETREG_REGISTERED)
4914 return; 4896 return;
4915#ifdef CONFIG_MLX5_CORE_EN_DCB 4897#ifdef CONFIG_MLX5_CORE_EN_DCB
@@ -4942,9 +4924,6 @@ static void mlx5e_nic_disable(struct mlx5e_priv *priv)
4942 4924
4943 queue_work(priv->wq, &priv->set_rx_mode_work); 4925 queue_work(priv->wq, &priv->set_rx_mode_work);
4944 4926
4945 if (MLX5_ESWITCH_MANAGER(priv->mdev))
4946 mlx5e_unregister_vport_reps(priv);
4947
4948 if (mlx5e_monitor_counter_supported(priv)) 4927 if (mlx5e_monitor_counter_supported(priv))
4949 mlx5e_monitor_counter_cleanup(priv); 4928 mlx5e_monitor_counter_cleanup(priv);
4950 4929
@@ -5143,7 +5122,6 @@ static void mlx5e_detach(struct mlx5_core_dev *mdev, void *vpriv)
5143static void *mlx5e_add(struct mlx5_core_dev *mdev) 5122static void *mlx5e_add(struct mlx5_core_dev *mdev)
5144{ 5123{
5145 struct net_device *netdev; 5124 struct net_device *netdev;
5146 void *rpriv = NULL;
5147 void *priv; 5125 void *priv;
5148 int err; 5126 int err;
5149 int nch; 5127 int nch;
@@ -5153,20 +5131,18 @@ static void *mlx5e_add(struct mlx5_core_dev *mdev)
5153 return NULL; 5131 return NULL;
5154 5132
5155#ifdef CONFIG_MLX5_ESWITCH 5133#ifdef CONFIG_MLX5_ESWITCH
5156 if (MLX5_ESWITCH_MANAGER(mdev)) { 5134 if (MLX5_ESWITCH_MANAGER(mdev) &&
5157 rpriv = mlx5e_alloc_nic_rep_priv(mdev); 5135 mlx5_eswitch_mode(mdev->priv.eswitch) == SRIOV_OFFLOADS) {
5158 if (!rpriv) { 5136 mlx5e_rep_register_vport_reps(mdev);
5159 mlx5_core_warn(mdev, "Failed to alloc NIC rep priv data\n"); 5137 return mdev;
5160 return NULL;
5161 }
5162 } 5138 }
5163#endif 5139#endif
5164 5140
5165 nch = mlx5e_get_max_num_channels(mdev); 5141 nch = mlx5e_get_max_num_channels(mdev);
5166 netdev = mlx5e_create_netdev(mdev, &mlx5e_nic_profile, nch, rpriv); 5142 netdev = mlx5e_create_netdev(mdev, &mlx5e_nic_profile, nch, NULL);
5167 if (!netdev) { 5143 if (!netdev) {
5168 mlx5_core_err(mdev, "mlx5e_create_netdev failed\n"); 5144 mlx5_core_err(mdev, "mlx5e_create_netdev failed\n");
5169 goto err_free_rpriv; 5145 return NULL;
5170 } 5146 }
5171 5147
5172 priv = netdev_priv(netdev); 5148 priv = netdev_priv(netdev);
@@ -5192,23 +5168,26 @@ err_detach:
5192 mlx5e_detach(mdev, priv); 5168 mlx5e_detach(mdev, priv);
5193err_destroy_netdev: 5169err_destroy_netdev:
5194 mlx5e_destroy_netdev(priv); 5170 mlx5e_destroy_netdev(priv);
5195err_free_rpriv:
5196 kfree(rpriv);
5197 return NULL; 5171 return NULL;
5198} 5172}
5199 5173
5200static void mlx5e_remove(struct mlx5_core_dev *mdev, void *vpriv) 5174static void mlx5e_remove(struct mlx5_core_dev *mdev, void *vpriv)
5201{ 5175{
5202 struct mlx5e_priv *priv = vpriv; 5176 struct mlx5e_priv *priv;
5203 void *ppriv = priv->ppriv;
5204 5177
5178#ifdef CONFIG_MLX5_ESWITCH
5179 if (MLX5_ESWITCH_MANAGER(mdev) && vpriv == mdev) {
5180 mlx5e_rep_unregister_vport_reps(mdev);
5181 return;
5182 }
5183#endif
5184 priv = vpriv;
5205#ifdef CONFIG_MLX5_CORE_EN_DCB 5185#ifdef CONFIG_MLX5_CORE_EN_DCB
5206 mlx5e_dcbnl_delete_app(priv); 5186 mlx5e_dcbnl_delete_app(priv);
5207#endif 5187#endif
5208 unregister_netdev(priv->netdev); 5188 unregister_netdev(priv->netdev);
5209 mlx5e_detach(mdev, vpriv); 5189 mlx5e_detach(mdev, vpriv);
5210 mlx5e_destroy_netdev(priv); 5190 mlx5e_destroy_netdev(priv);
5211 kfree(ppriv);
5212} 5191}
5213 5192
5214static struct mlx5_interface mlx5e_interface = { 5193static struct mlx5_interface mlx5e_interface = {
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_rep.c b/drivers/net/ethernet/mellanox/mlx5/core/en_rep.c
index e4a34c9ef700..ed1158b58798 100644
--- a/drivers/net/ethernet/mellanox/mlx5/core/en_rep.c
+++ b/drivers/net/ethernet/mellanox/mlx5/core/en_rep.c
@@ -108,7 +108,7 @@ static void mlx5e_rep_get_strings(struct net_device *dev,
108 } 108 }
109} 109}
110 110
111static void mlx5e_rep_update_hw_counters(struct mlx5e_priv *priv) 111static void mlx5e_vf_rep_update_hw_counters(struct mlx5e_priv *priv)
112{ 112{
113 struct mlx5_eswitch *esw = priv->mdev->priv.eswitch; 113 struct mlx5_eswitch *esw = priv->mdev->priv.eswitch;
114 struct mlx5e_rep_priv *rpriv = priv->ppriv; 114 struct mlx5e_rep_priv *rpriv = priv->ppriv;
@@ -131,6 +131,32 @@ static void mlx5e_rep_update_hw_counters(struct mlx5e_priv *priv)
131 vport_stats->tx_bytes = vf_stats.rx_bytes; 131 vport_stats->tx_bytes = vf_stats.rx_bytes;
132} 132}
133 133
134static void mlx5e_uplink_rep_update_hw_counters(struct mlx5e_priv *priv)
135{
136 struct mlx5e_pport_stats *pstats = &priv->stats.pport;
137 struct rtnl_link_stats64 *vport_stats;
138
139 mlx5e_grp_802_3_update_stats(priv);
140
141 vport_stats = &priv->stats.vf_vport;
142
143 vport_stats->rx_packets = PPORT_802_3_GET(pstats, a_frames_received_ok);
144 vport_stats->rx_bytes = PPORT_802_3_GET(pstats, a_octets_received_ok);
145 vport_stats->tx_packets = PPORT_802_3_GET(pstats, a_frames_transmitted_ok);
146 vport_stats->tx_bytes = PPORT_802_3_GET(pstats, a_octets_transmitted_ok);
147}
148
149static void mlx5e_rep_update_hw_counters(struct mlx5e_priv *priv)
150{
151 struct mlx5e_rep_priv *rpriv = priv->ppriv;
152 struct mlx5_eswitch_rep *rep = rpriv->rep;
153
154 if (rep->vport == FDB_UPLINK_VPORT)
155 mlx5e_uplink_rep_update_hw_counters(priv);
156 else
157 mlx5e_vf_rep_update_hw_counters(priv);
158}
159
134static void mlx5e_rep_update_sw_counters(struct mlx5e_priv *priv) 160static void mlx5e_rep_update_sw_counters(struct mlx5e_priv *priv)
135{ 161{
136 struct mlx5e_sw_stats *s = &priv->stats.sw; 162 struct mlx5e_sw_stats *s = &priv->stats.sw;
@@ -266,6 +292,22 @@ static int mlx5e_rep_set_channels(struct net_device *dev,
266 return 0; 292 return 0;
267} 293}
268 294
295static int mlx5e_rep_get_coalesce(struct net_device *netdev,
296 struct ethtool_coalesce *coal)
297{
298 struct mlx5e_priv *priv = netdev_priv(netdev);
299
300 return mlx5e_ethtool_get_coalesce(priv, coal);
301}
302
303static int mlx5e_rep_set_coalesce(struct net_device *netdev,
304 struct ethtool_coalesce *coal)
305{
306 struct mlx5e_priv *priv = netdev_priv(netdev);
307
308 return mlx5e_ethtool_set_coalesce(priv, coal);
309}
310
269static u32 mlx5e_rep_get_rxfh_key_size(struct net_device *netdev) 311static u32 mlx5e_rep_get_rxfh_key_size(struct net_device *netdev)
270{ 312{
271 struct mlx5e_priv *priv = netdev_priv(netdev); 313 struct mlx5e_priv *priv = netdev_priv(netdev);
@@ -280,7 +322,39 @@ static u32 mlx5e_rep_get_rxfh_indir_size(struct net_device *netdev)
280 return mlx5e_ethtool_get_rxfh_indir_size(priv); 322 return mlx5e_ethtool_get_rxfh_indir_size(priv);
281} 323}
282 324
283static const struct ethtool_ops mlx5e_rep_ethtool_ops = { 325static void mlx5e_uplink_rep_get_pauseparam(struct net_device *netdev,
326 struct ethtool_pauseparam *pauseparam)
327{
328 struct mlx5e_priv *priv = netdev_priv(netdev);
329
330 mlx5e_ethtool_get_pauseparam(priv, pauseparam);
331}
332
333static int mlx5e_uplink_rep_set_pauseparam(struct net_device *netdev,
334 struct ethtool_pauseparam *pauseparam)
335{
336 struct mlx5e_priv *priv = netdev_priv(netdev);
337
338 return mlx5e_ethtool_set_pauseparam(priv, pauseparam);
339}
340
341static int mlx5e_uplink_rep_get_link_ksettings(struct net_device *netdev,
342 struct ethtool_link_ksettings *link_ksettings)
343{
344 struct mlx5e_priv *priv = netdev_priv(netdev);
345
346 return mlx5e_ethtool_get_link_ksettings(priv, link_ksettings);
347}
348
349static int mlx5e_uplink_rep_set_link_ksettings(struct net_device *netdev,
350 const struct ethtool_link_ksettings *link_ksettings)
351{
352 struct mlx5e_priv *priv = netdev_priv(netdev);
353
354 return mlx5e_ethtool_set_link_ksettings(priv, link_ksettings);
355}
356
357static const struct ethtool_ops mlx5e_vf_rep_ethtool_ops = {
284 .get_drvinfo = mlx5e_rep_get_drvinfo, 358 .get_drvinfo = mlx5e_rep_get_drvinfo,
285 .get_link = ethtool_op_get_link, 359 .get_link = ethtool_op_get_link,
286 .get_strings = mlx5e_rep_get_strings, 360 .get_strings = mlx5e_rep_get_strings,
@@ -290,11 +364,33 @@ static const struct ethtool_ops mlx5e_rep_ethtool_ops = {
290 .set_ringparam = mlx5e_rep_set_ringparam, 364 .set_ringparam = mlx5e_rep_set_ringparam,
291 .get_channels = mlx5e_rep_get_channels, 365 .get_channels = mlx5e_rep_get_channels,
292 .set_channels = mlx5e_rep_set_channels, 366 .set_channels = mlx5e_rep_set_channels,
367 .get_coalesce = mlx5e_rep_get_coalesce,
368 .set_coalesce = mlx5e_rep_set_coalesce,
293 .get_rxfh_key_size = mlx5e_rep_get_rxfh_key_size, 369 .get_rxfh_key_size = mlx5e_rep_get_rxfh_key_size,
294 .get_rxfh_indir_size = mlx5e_rep_get_rxfh_indir_size, 370 .get_rxfh_indir_size = mlx5e_rep_get_rxfh_indir_size,
295}; 371};
296 372
297int mlx5e_attr_get(struct net_device *dev, struct switchdev_attr *attr) 373static const struct ethtool_ops mlx5e_uplink_rep_ethtool_ops = {
374 .get_drvinfo = mlx5e_rep_get_drvinfo,
375 .get_link = ethtool_op_get_link,
376 .get_strings = mlx5e_rep_get_strings,
377 .get_sset_count = mlx5e_rep_get_sset_count,
378 .get_ethtool_stats = mlx5e_rep_get_ethtool_stats,
379 .get_ringparam = mlx5e_rep_get_ringparam,
380 .set_ringparam = mlx5e_rep_set_ringparam,
381 .get_channels = mlx5e_rep_get_channels,
382 .set_channels = mlx5e_rep_set_channels,
383 .get_coalesce = mlx5e_rep_get_coalesce,
384 .set_coalesce = mlx5e_rep_set_coalesce,
385 .get_link_ksettings = mlx5e_uplink_rep_get_link_ksettings,
386 .set_link_ksettings = mlx5e_uplink_rep_set_link_ksettings,
387 .get_rxfh_key_size = mlx5e_rep_get_rxfh_key_size,
388 .get_rxfh_indir_size = mlx5e_rep_get_rxfh_indir_size,
389 .get_pauseparam = mlx5e_uplink_rep_get_pauseparam,
390 .set_pauseparam = mlx5e_uplink_rep_set_pauseparam,
391};
392
393static int mlx5e_attr_get(struct net_device *dev, struct switchdev_attr *attr)
298{ 394{
299 struct mlx5e_priv *priv = netdev_priv(dev); 395 struct mlx5e_priv *priv = netdev_priv(dev);
300 struct mlx5_eswitch *esw = priv->mdev->priv.eswitch; 396 struct mlx5_eswitch *esw = priv->mdev->priv.eswitch;
@@ -576,21 +672,19 @@ mlx5e_rep_indr_offload(struct net_device *netdev,
576 struct tc_cls_flower_offload *flower, 672 struct tc_cls_flower_offload *flower,
577 struct mlx5e_rep_indr_block_priv *indr_priv) 673 struct mlx5e_rep_indr_block_priv *indr_priv)
578{ 674{
579 int err = 0;
580 struct mlx5e_priv *priv = netdev_priv(indr_priv->rpriv->netdev); 675 struct mlx5e_priv *priv = netdev_priv(indr_priv->rpriv->netdev);
676 int flags = MLX5E_TC_EGRESS | MLX5E_TC_ESW_OFFLOAD;
677 int err = 0;
581 678
582 switch (flower->command) { 679 switch (flower->command) {
583 case TC_CLSFLOWER_REPLACE: 680 case TC_CLSFLOWER_REPLACE:
584 err = mlx5e_configure_flower(netdev, priv, 681 err = mlx5e_configure_flower(netdev, priv, flower, flags);
585 flower, MLX5E_TC_EGRESS);
586 break; 682 break;
587 case TC_CLSFLOWER_DESTROY: 683 case TC_CLSFLOWER_DESTROY:
588 err = mlx5e_delete_flower(netdev, priv, 684 err = mlx5e_delete_flower(netdev, priv, flower, flags);
589 flower, MLX5E_TC_EGRESS);
590 break; 685 break;
591 case TC_CLSFLOWER_STATS: 686 case TC_CLSFLOWER_STATS:
592 err = mlx5e_stats_flower(netdev, priv, 687 err = mlx5e_stats_flower(netdev, priv, flower, flags);
593 flower, MLX5E_TC_EGRESS);
594 break; 688 break;
595 default: 689 default:
596 err = -EOPNOTSUPP; 690 err = -EOPNOTSUPP;
@@ -983,7 +1077,7 @@ void mlx5e_rep_encap_entry_detach(struct mlx5e_priv *priv,
983 mlx5e_rep_neigh_entry_destroy(priv, nhe); 1077 mlx5e_rep_neigh_entry_destroy(priv, nhe);
984} 1078}
985 1079
986static int mlx5e_rep_open(struct net_device *dev) 1080static int mlx5e_vf_rep_open(struct net_device *dev)
987{ 1081{
988 struct mlx5e_priv *priv = netdev_priv(dev); 1082 struct mlx5e_priv *priv = netdev_priv(dev);
989 struct mlx5e_rep_priv *rpriv = priv->ppriv; 1083 struct mlx5e_rep_priv *rpriv = priv->ppriv;
@@ -1005,7 +1099,7 @@ unlock:
1005 return err; 1099 return err;
1006} 1100}
1007 1101
1008static int mlx5e_rep_close(struct net_device *dev) 1102static int mlx5e_vf_rep_close(struct net_device *dev)
1009{ 1103{
1010 struct mlx5e_priv *priv = netdev_priv(dev); 1104 struct mlx5e_priv *priv = netdev_priv(dev);
1011 struct mlx5e_rep_priv *rpriv = priv->ppriv; 1105 struct mlx5e_rep_priv *rpriv = priv->ppriv;
@@ -1062,7 +1156,8 @@ static int mlx5e_rep_setup_tc_cb(enum tc_setup_type type, void *type_data,
1062 1156
1063 switch (type) { 1157 switch (type) {
1064 case TC_SETUP_CLSFLOWER: 1158 case TC_SETUP_CLSFLOWER:
1065 return mlx5e_rep_setup_tc_cls_flower(priv, type_data, MLX5E_TC_INGRESS); 1159 return mlx5e_rep_setup_tc_cls_flower(priv, type_data, MLX5E_TC_INGRESS |
1160 MLX5E_TC_ESW_OFFLOAD);
1066 default: 1161 default:
1067 return -EOPNOTSUPP; 1162 return -EOPNOTSUPP;
1068 } 1163 }
@@ -1101,43 +1196,23 @@ static int mlx5e_rep_setup_tc(struct net_device *dev, enum tc_setup_type type,
1101 1196
1102bool mlx5e_is_uplink_rep(struct mlx5e_priv *priv) 1197bool mlx5e_is_uplink_rep(struct mlx5e_priv *priv)
1103{ 1198{
1104 struct mlx5_eswitch *esw = priv->mdev->priv.eswitch;
1105 struct mlx5e_rep_priv *rpriv = priv->ppriv; 1199 struct mlx5e_rep_priv *rpriv = priv->ppriv;
1106 struct mlx5_eswitch_rep *rep; 1200 struct mlx5_eswitch_rep *rep;
1107 1201
1108 if (!MLX5_ESWITCH_MANAGER(priv->mdev)) 1202 if (!MLX5_ESWITCH_MANAGER(priv->mdev))
1109 return false; 1203 return false;
1110 1204
1111 rep = rpriv->rep; 1205 if (!rpriv) /* non vport rep mlx5e instances don't use this field */
1112 if (esw->mode == SRIOV_OFFLOADS &&
1113 rep && rep->vport == FDB_UPLINK_VPORT)
1114 return true;
1115
1116 return false;
1117}
1118
1119static bool mlx5e_is_vf_vport_rep(struct mlx5e_priv *priv)
1120{
1121 struct mlx5e_rep_priv *rpriv = priv->ppriv;
1122 struct mlx5_eswitch_rep *rep;
1123
1124 if (!MLX5_ESWITCH_MANAGER(priv->mdev))
1125 return false; 1206 return false;
1126 1207
1127 rep = rpriv->rep; 1208 rep = rpriv->rep;
1128 if (rep && rep->vport != FDB_UPLINK_VPORT) 1209 return (rep->vport == FDB_UPLINK_VPORT);
1129 return true;
1130
1131 return false;
1132} 1210}
1133 1211
1134bool mlx5e_has_offload_stats(const struct net_device *dev, int attr_id) 1212static bool mlx5e_rep_has_offload_stats(const struct net_device *dev, int attr_id)
1135{ 1213{
1136 struct mlx5e_priv *priv = netdev_priv(dev);
1137
1138 switch (attr_id) { 1214 switch (attr_id) {
1139 case IFLA_OFFLOAD_XSTATS_CPU_HIT: 1215 case IFLA_OFFLOAD_XSTATS_CPU_HIT:
1140 if (mlx5e_is_vf_vport_rep(priv) || mlx5e_is_uplink_rep(priv))
1141 return true; 1216 return true;
1142 } 1217 }
1143 1218
@@ -1163,8 +1238,8 @@ mlx5e_get_sw_stats64(const struct net_device *dev,
1163 return 0; 1238 return 0;
1164} 1239}
1165 1240
1166int mlx5e_get_offload_stats(int attr_id, const struct net_device *dev, 1241static int mlx5e_rep_get_offload_stats(int attr_id, const struct net_device *dev,
1167 void *sp) 1242 void *sp)
1168{ 1243{
1169 switch (attr_id) { 1244 switch (attr_id) {
1170 case IFLA_OFFLOAD_XSTATS_CPU_HIT: 1245 case IFLA_OFFLOAD_XSTATS_CPU_HIT:
@@ -1175,7 +1250,7 @@ int mlx5e_get_offload_stats(int attr_id, const struct net_device *dev,
1175} 1250}
1176 1251
1177static void 1252static void
1178mlx5e_rep_get_stats(struct net_device *dev, struct rtnl_link_stats64 *stats) 1253mlx5e_vf_rep_get_stats(struct net_device *dev, struct rtnl_link_stats64 *stats)
1179{ 1254{
1180 struct mlx5e_priv *priv = netdev_priv(dev); 1255 struct mlx5e_priv *priv = netdev_priv(dev);
1181 1256
@@ -1184,39 +1259,84 @@ mlx5e_rep_get_stats(struct net_device *dev, struct rtnl_link_stats64 *stats)
1184 memcpy(stats, &priv->stats.vf_vport, sizeof(*stats)); 1259 memcpy(stats, &priv->stats.vf_vport, sizeof(*stats));
1185} 1260}
1186 1261
1262static int mlx5e_vf_rep_change_mtu(struct net_device *netdev, int new_mtu)
1263{
1264 return mlx5e_change_mtu(netdev, new_mtu, NULL);
1265}
1266
1267static int mlx5e_uplink_rep_change_mtu(struct net_device *netdev, int new_mtu)
1268{
1269 return mlx5e_change_mtu(netdev, new_mtu, mlx5e_set_dev_port_mtu);
1270}
1271
1272static int mlx5e_uplink_rep_set_mac(struct net_device *netdev, void *addr)
1273{
1274 struct sockaddr *saddr = addr;
1275
1276 if (!is_valid_ether_addr(saddr->sa_data))
1277 return -EADDRNOTAVAIL;
1278
1279 ether_addr_copy(netdev->dev_addr, saddr->sa_data);
1280 return 0;
1281}
1282
1187static const struct switchdev_ops mlx5e_rep_switchdev_ops = { 1283static const struct switchdev_ops mlx5e_rep_switchdev_ops = {
1188 .switchdev_port_attr_get = mlx5e_attr_get, 1284 .switchdev_port_attr_get = mlx5e_attr_get,
1189}; 1285};
1190 1286
1191static int mlx5e_change_rep_mtu(struct net_device *netdev, int new_mtu) 1287static const struct net_device_ops mlx5e_netdev_ops_vf_rep = {
1192{ 1288 .ndo_open = mlx5e_vf_rep_open,
1193 return mlx5e_change_mtu(netdev, new_mtu, NULL); 1289 .ndo_stop = mlx5e_vf_rep_close,
1194} 1290 .ndo_start_xmit = mlx5e_xmit,
1291 .ndo_get_phys_port_name = mlx5e_rep_get_phys_port_name,
1292 .ndo_setup_tc = mlx5e_rep_setup_tc,
1293 .ndo_get_stats64 = mlx5e_vf_rep_get_stats,
1294 .ndo_has_offload_stats = mlx5e_rep_has_offload_stats,
1295 .ndo_get_offload_stats = mlx5e_rep_get_offload_stats,
1296 .ndo_change_mtu = mlx5e_vf_rep_change_mtu,
1297};
1195 1298
1196static const struct net_device_ops mlx5e_netdev_ops_rep = { 1299static const struct net_device_ops mlx5e_netdev_ops_uplink_rep = {
1197 .ndo_open = mlx5e_rep_open, 1300 .ndo_open = mlx5e_open,
1198 .ndo_stop = mlx5e_rep_close, 1301 .ndo_stop = mlx5e_close,
1199 .ndo_start_xmit = mlx5e_xmit, 1302 .ndo_start_xmit = mlx5e_xmit,
1303 .ndo_set_mac_address = mlx5e_uplink_rep_set_mac,
1200 .ndo_get_phys_port_name = mlx5e_rep_get_phys_port_name, 1304 .ndo_get_phys_port_name = mlx5e_rep_get_phys_port_name,
1201 .ndo_setup_tc = mlx5e_rep_setup_tc, 1305 .ndo_setup_tc = mlx5e_rep_setup_tc,
1202 .ndo_get_stats64 = mlx5e_rep_get_stats, 1306 .ndo_get_stats64 = mlx5e_get_stats,
1203 .ndo_has_offload_stats = mlx5e_has_offload_stats, 1307 .ndo_has_offload_stats = mlx5e_rep_has_offload_stats,
1204 .ndo_get_offload_stats = mlx5e_get_offload_stats, 1308 .ndo_get_offload_stats = mlx5e_rep_get_offload_stats,
1205 .ndo_change_mtu = mlx5e_change_rep_mtu, 1309 .ndo_change_mtu = mlx5e_uplink_rep_change_mtu,
1310 .ndo_udp_tunnel_add = mlx5e_add_vxlan_port,
1311 .ndo_udp_tunnel_del = mlx5e_del_vxlan_port,
1312 .ndo_features_check = mlx5e_features_check,
1313 .ndo_set_vf_mac = mlx5e_set_vf_mac,
1314 .ndo_set_vf_rate = mlx5e_set_vf_rate,
1315 .ndo_get_vf_config = mlx5e_get_vf_config,
1316 .ndo_get_vf_stats = mlx5e_get_vf_stats,
1206}; 1317};
1207 1318
1208static void mlx5e_build_rep_params(struct mlx5_core_dev *mdev, 1319static void mlx5e_build_rep_params(struct net_device *netdev)
1209 struct mlx5e_params *params,
1210 struct mlx5e_rss_params *rss_params,
1211 u16 mtu)
1212{ 1320{
1321 struct mlx5e_priv *priv = netdev_priv(netdev);
1322 struct mlx5e_rep_priv *rpriv = priv->ppriv;
1323 struct mlx5_eswitch_rep *rep = rpriv->rep;
1324 struct mlx5_core_dev *mdev = priv->mdev;
1325 struct mlx5e_params *params;
1326
1213 u8 cq_period_mode = MLX5_CAP_GEN(mdev, cq_period_start_from_cqe) ? 1327 u8 cq_period_mode = MLX5_CAP_GEN(mdev, cq_period_start_from_cqe) ?
1214 MLX5_CQ_PERIOD_MODE_START_FROM_CQE : 1328 MLX5_CQ_PERIOD_MODE_START_FROM_CQE :
1215 MLX5_CQ_PERIOD_MODE_START_FROM_EQE; 1329 MLX5_CQ_PERIOD_MODE_START_FROM_EQE;
1216 1330
1331 params = &priv->channels.params;
1217 params->hard_mtu = MLX5E_ETH_HARD_MTU; 1332 params->hard_mtu = MLX5E_ETH_HARD_MTU;
1218 params->sw_mtu = mtu; 1333 params->sw_mtu = netdev->mtu;
1219 params->log_sq_size = MLX5E_REP_PARAMS_LOG_SQ_SIZE; 1334
1335 /* SQ */
1336 if (rep->vport == FDB_UPLINK_VPORT)
1337 params->log_sq_size = MLX5E_PARAMS_DEFAULT_LOG_SQ_SIZE;
1338 else
1339 params->log_sq_size = MLX5E_REP_PARAMS_LOG_SQ_SIZE;
1220 1340
1221 /* RQ */ 1341 /* RQ */
1222 mlx5e_build_rq_params(mdev, params); 1342 mlx5e_build_rq_params(mdev, params);
@@ -1230,20 +1350,34 @@ static void mlx5e_build_rep_params(struct mlx5_core_dev *mdev,
1230 mlx5_query_min_inline(mdev, &params->tx_min_inline_mode); 1350 mlx5_query_min_inline(mdev, &params->tx_min_inline_mode);
1231 1351
1232 /* RSS */ 1352 /* RSS */
1233 mlx5e_build_rss_params(rss_params, params->num_channels); 1353 mlx5e_build_rss_params(&priv->rss_params, params->num_channels);
1234} 1354}
1235 1355
1236static void mlx5e_build_rep_netdev(struct net_device *netdev) 1356static void mlx5e_build_rep_netdev(struct net_device *netdev)
1237{ 1357{
1238 struct mlx5e_priv *priv = netdev_priv(netdev); 1358 struct mlx5e_priv *priv = netdev_priv(netdev);
1359 struct mlx5e_rep_priv *rpriv = priv->ppriv;
1360 struct mlx5_eswitch_rep *rep = rpriv->rep;
1239 struct mlx5_core_dev *mdev = priv->mdev; 1361 struct mlx5_core_dev *mdev = priv->mdev;
1240 u16 max_mtu;
1241 1362
1242 netdev->netdev_ops = &mlx5e_netdev_ops_rep; 1363 if (rep->vport == FDB_UPLINK_VPORT) {
1364 SET_NETDEV_DEV(netdev, &priv->mdev->pdev->dev);
1365 netdev->netdev_ops = &mlx5e_netdev_ops_uplink_rep;
1366 /* we want a persistent mac for the uplink rep */
1367 mlx5_query_nic_vport_mac_address(mdev, 0, netdev->dev_addr);
1368 netdev->ethtool_ops = &mlx5e_uplink_rep_ethtool_ops;
1369#ifdef CONFIG_MLX5_CORE_EN_DCB
1370 if (MLX5_CAP_GEN(mdev, qos))
1371 netdev->dcbnl_ops = &mlx5e_dcbnl_ops;
1372#endif
1373 } else {
1374 netdev->netdev_ops = &mlx5e_netdev_ops_vf_rep;
1375 eth_hw_addr_random(netdev);
1376 netdev->ethtool_ops = &mlx5e_vf_rep_ethtool_ops;
1377 }
1243 1378
1244 netdev->watchdog_timeo = 15 * HZ; 1379 netdev->watchdog_timeo = 15 * HZ;
1245 1380
1246 netdev->ethtool_ops = &mlx5e_rep_ethtool_ops;
1247 1381
1248 netdev->switchdev_ops = &mlx5e_rep_switchdev_ops; 1382 netdev->switchdev_ops = &mlx5e_rep_switchdev_ops;
1249 1383
@@ -1259,12 +1393,15 @@ static void mlx5e_build_rep_netdev(struct net_device *netdev)
1259 netdev->hw_features |= NETIF_F_RXCSUM; 1393 netdev->hw_features |= NETIF_F_RXCSUM;
1260 1394
1261 netdev->features |= netdev->hw_features; 1395 netdev->features |= netdev->hw_features;
1396}
1262 1397
1263 eth_hw_addr_random(netdev); 1398static int mlx5e_rep_get_default_num_channels(struct mlx5_eswitch_rep *rep,
1264 1399 struct net_device *netdev)
1265 netdev->min_mtu = ETH_MIN_MTU; 1400{
1266 mlx5_query_port_max_mtu(mdev, &max_mtu, 1); 1401 if (rep->vport == FDB_UPLINK_VPORT)
1267 netdev->max_mtu = MLX5E_HW2SW_MTU(&priv->channels.params, max_mtu); 1402 return mlx5e_get_netdev_max_channels(netdev);
1403 else
1404 return 1;
1268} 1405}
1269 1406
1270static int mlx5e_init_rep(struct mlx5_core_dev *mdev, 1407static int mlx5e_init_rep(struct mlx5_core_dev *mdev,
@@ -1273,18 +1410,17 @@ static int mlx5e_init_rep(struct mlx5_core_dev *mdev,
1273 void *ppriv) 1410 void *ppriv)
1274{ 1411{
1275 struct mlx5e_priv *priv = netdev_priv(netdev); 1412 struct mlx5e_priv *priv = netdev_priv(netdev);
1413 struct mlx5e_rep_priv *rpriv = ppriv;
1276 int err; 1414 int err;
1277 1415
1278 err = mlx5e_netdev_init(netdev, priv, mdev, profile, ppriv); 1416 err = mlx5e_netdev_init(netdev, priv, mdev, profile, ppriv);
1279 if (err) 1417 if (err)
1280 return err; 1418 return err;
1281 1419
1282
1283 priv->channels.params.num_channels = 1420 priv->channels.params.num_channels =
1284 mlx5e_get_netdev_max_channels(netdev); 1421 mlx5e_rep_get_default_num_channels(rpriv->rep, netdev);
1285 1422
1286 mlx5e_build_rep_params(mdev, &priv->channels.params, 1423 mlx5e_build_rep_params(netdev);
1287 &priv->rss_params, netdev->mtu);
1288 mlx5e_build_rep_netdev(netdev); 1424 mlx5e_build_rep_netdev(netdev);
1289 1425
1290 mlx5e_timestamp_init(priv); 1426 mlx5e_timestamp_init(priv);
@@ -1407,97 +1543,159 @@ static void mlx5e_cleanup_rep_rx(struct mlx5e_priv *priv)
1407 1543
1408static int mlx5e_init_rep_tx(struct mlx5e_priv *priv) 1544static int mlx5e_init_rep_tx(struct mlx5e_priv *priv)
1409{ 1545{
1410 int err; 1546 struct mlx5e_rep_priv *rpriv = priv->ppriv;
1547 struct mlx5_rep_uplink_priv *uplink_priv;
1548 int tc, err;
1411 1549
1412 err = mlx5e_create_tises(priv); 1550 err = mlx5e_create_tises(priv);
1413 if (err) { 1551 if (err) {
1414 mlx5_core_warn(priv->mdev, "create tises failed, %d\n", err); 1552 mlx5_core_warn(priv->mdev, "create tises failed, %d\n", err);
1415 return err; 1553 return err;
1416 } 1554 }
1555
1556 if (rpriv->rep->vport == FDB_UPLINK_VPORT) {
1557 uplink_priv = &rpriv->uplink_priv;
1558
1559 /* init shared tc flow table */
1560 err = mlx5e_tc_esw_init(&uplink_priv->tc_ht);
1561 if (err)
1562 goto destroy_tises;
1563
1564 /* init indirect block notifications */
1565 INIT_LIST_HEAD(&uplink_priv->tc_indr_block_priv_list);
1566 uplink_priv->netdevice_nb.notifier_call = mlx5e_nic_rep_netdevice_event;
1567 err = register_netdevice_notifier(&uplink_priv->netdevice_nb);
1568 if (err) {
1569 mlx5_core_err(priv->mdev, "Failed to register netdev notifier\n");
1570 goto tc_esw_cleanup;
1571 }
1572 }
1573
1417 return 0; 1574 return 0;
1575
1576tc_esw_cleanup:
1577 mlx5e_tc_esw_cleanup(&uplink_priv->tc_ht);
1578destroy_tises:
1579 for (tc = 0; tc < priv->profile->max_tc; tc++)
1580 mlx5e_destroy_tis(priv->mdev, priv->tisn[tc]);
1581 return err;
1418} 1582}
1419 1583
1420static const struct mlx5e_profile mlx5e_rep_profile = { 1584static void mlx5e_cleanup_rep_tx(struct mlx5e_priv *priv)
1421 .init = mlx5e_init_rep, 1585{
1422 .cleanup = mlx5e_cleanup_rep, 1586 struct mlx5e_rep_priv *rpriv = priv->ppriv;
1423 .init_rx = mlx5e_init_rep_rx, 1587 int tc;
1424 .cleanup_rx = mlx5e_cleanup_rep_rx,
1425 .init_tx = mlx5e_init_rep_tx,
1426 .cleanup_tx = mlx5e_cleanup_nic_tx,
1427 .update_stats = mlx5e_rep_update_hw_counters,
1428 .update_carrier = NULL,
1429 .rx_handlers.handle_rx_cqe = mlx5e_handle_rx_cqe_rep,
1430 .rx_handlers.handle_rx_cqe_mpwqe = mlx5e_handle_rx_cqe_mpwrq,
1431 .max_tc = 1,
1432};
1433 1588
1434/* e-Switch vport representors */ 1589 for (tc = 0; tc < priv->profile->max_tc; tc++)
1590 mlx5e_destroy_tis(priv->mdev, priv->tisn[tc]);
1435 1591
1436static int 1592 if (rpriv->rep->vport == FDB_UPLINK_VPORT) {
1437mlx5e_nic_rep_load(struct mlx5_core_dev *dev, struct mlx5_eswitch_rep *rep) 1593 /* clean indirect TC block notifications */
1438{ 1594 unregister_netdevice_notifier(&rpriv->uplink_priv.netdevice_nb);
1439 struct mlx5e_rep_priv *rpriv = mlx5e_rep_to_rep_priv(rep); 1595 mlx5e_rep_indr_clean_block_privs(rpriv);
1440 struct mlx5e_priv *priv = netdev_priv(rpriv->netdev);
1441 struct mlx5_rep_uplink_priv *uplink_priv = &rpriv->uplink_priv;
1442 int err;
1443 1596
1444 if (test_bit(MLX5E_STATE_OPENED, &priv->state)) { 1597 /* delete shared tc flow table */
1445 err = mlx5e_add_sqs_fwd_rules(priv); 1598 mlx5e_tc_esw_cleanup(&rpriv->uplink_priv.tc_ht);
1446 if (err)
1447 return err;
1448 } 1599 }
1600}
1449 1601
1450 err = mlx5e_rep_neigh_init(rpriv); 1602static void mlx5e_vf_rep_enable(struct mlx5e_priv *priv)
1451 if (err) 1603{
1452 goto err_remove_sqs; 1604 struct net_device *netdev = priv->netdev;
1605 struct mlx5_core_dev *mdev = priv->mdev;
1606 u16 max_mtu;
1453 1607
1454 /* init shared tc flow table */ 1608 netdev->min_mtu = ETH_MIN_MTU;
1455 err = mlx5e_tc_esw_init(&uplink_priv->tc_ht); 1609 mlx5_query_port_max_mtu(mdev, &max_mtu, 1);
1456 if (err) 1610 netdev->max_mtu = MLX5E_HW2SW_MTU(&priv->channels.params, max_mtu);
1457 goto err_neigh_cleanup; 1611}
1458 1612
1459 /* init indirect block notifications */ 1613static int uplink_rep_async_event(struct notifier_block *nb, unsigned long event, void *data)
1460 INIT_LIST_HEAD(&uplink_priv->tc_indr_block_priv_list); 1614{
1461 uplink_priv->netdevice_nb.notifier_call = mlx5e_nic_rep_netdevice_event; 1615 struct mlx5e_priv *priv = container_of(nb, struct mlx5e_priv, events_nb);
1462 err = register_netdevice_notifier(&uplink_priv->netdevice_nb); 1616 struct mlx5_eqe *eqe = data;
1463 if (err) {
1464 mlx5_core_err(priv->mdev, "Failed to register netdev notifier\n");
1465 goto err_indirect_block_cleanup;
1466 }
1467 1617
1468 return 0; 1618 if (event != MLX5_EVENT_TYPE_PORT_CHANGE)
1619 return NOTIFY_DONE;
1469 1620
1470err_indirect_block_cleanup: 1621 switch (eqe->sub_type) {
1471 mlx5e_tc_esw_cleanup(&uplink_priv->tc_ht); 1622 case MLX5_PORT_CHANGE_SUBTYPE_DOWN:
1472err_neigh_cleanup: 1623 case MLX5_PORT_CHANGE_SUBTYPE_ACTIVE:
1473 mlx5e_rep_neigh_cleanup(rpriv); 1624 queue_work(priv->wq, &priv->update_carrier_work);
1474err_remove_sqs: 1625 break;
1475 mlx5e_remove_sqs_fwd_rules(priv); 1626 default:
1476 return err; 1627 return NOTIFY_DONE;
1628 }
1629
1630 return NOTIFY_OK;
1477} 1631}
1478 1632
1479static void 1633static void mlx5e_uplink_rep_enable(struct mlx5e_priv *priv)
1480mlx5e_nic_rep_unload(struct mlx5_eswitch_rep *rep)
1481{ 1634{
1482 struct mlx5e_rep_priv *rpriv = mlx5e_rep_to_rep_priv(rep); 1635 struct net_device *netdev = priv->netdev;
1483 struct mlx5e_priv *priv = netdev_priv(rpriv->netdev); 1636 struct mlx5_core_dev *mdev = priv->mdev;
1484 1637 u16 max_mtu;
1485 if (test_bit(MLX5E_STATE_OPENED, &priv->state))
1486 mlx5e_remove_sqs_fwd_rules(priv);
1487 1638
1488 /* clean indirect TC block notifications */ 1639 netdev->min_mtu = ETH_MIN_MTU;
1489 unregister_netdevice_notifier(&rpriv->uplink_priv.netdevice_nb); 1640 mlx5_query_port_max_mtu(priv->mdev, &max_mtu, 1);
1490 mlx5e_rep_indr_clean_block_privs(rpriv); 1641 netdev->max_mtu = MLX5E_HW2SW_MTU(&priv->channels.params, max_mtu);
1642 mlx5e_set_dev_port_mtu(priv);
1643
1644 mlx5_lag_add(mdev, netdev);
1645 priv->events_nb.notifier_call = uplink_rep_async_event;
1646 mlx5_notifier_register(mdev, &priv->events_nb);
1647#ifdef CONFIG_MLX5_CORE_EN_DCB
1648 mlx5e_dcbnl_initialize(priv);
1649 mlx5e_dcbnl_init_app(priv);
1650#endif
1651}
1491 1652
1492 /* clean uplink offloaded TC rules, delete shared tc flow table */ 1653static void mlx5e_uplink_rep_disable(struct mlx5e_priv *priv)
1493 mlx5e_tc_esw_cleanup(&rpriv->uplink_priv.tc_ht); 1654{
1655 struct mlx5_core_dev *mdev = priv->mdev;
1494 1656
1495 mlx5e_rep_neigh_cleanup(rpriv); 1657#ifdef CONFIG_MLX5_CORE_EN_DCB
1658 mlx5e_dcbnl_delete_app(priv);
1659#endif
1660 mlx5_notifier_unregister(mdev, &priv->events_nb);
1661 mlx5_lag_remove(mdev);
1496} 1662}
1497 1663
1664static const struct mlx5e_profile mlx5e_vf_rep_profile = {
1665 .init = mlx5e_init_rep,
1666 .cleanup = mlx5e_cleanup_rep,
1667 .init_rx = mlx5e_init_rep_rx,
1668 .cleanup_rx = mlx5e_cleanup_rep_rx,
1669 .init_tx = mlx5e_init_rep_tx,
1670 .cleanup_tx = mlx5e_cleanup_rep_tx,
1671 .enable = mlx5e_vf_rep_enable,
1672 .update_stats = mlx5e_vf_rep_update_hw_counters,
1673 .rx_handlers.handle_rx_cqe = mlx5e_handle_rx_cqe_rep,
1674 .rx_handlers.handle_rx_cqe_mpwqe = mlx5e_handle_rx_cqe_mpwrq,
1675 .max_tc = 1,
1676};
1677
1678static const struct mlx5e_profile mlx5e_uplink_rep_profile = {
1679 .init = mlx5e_init_rep,
1680 .cleanup = mlx5e_cleanup_rep,
1681 .init_rx = mlx5e_init_rep_rx,
1682 .cleanup_rx = mlx5e_cleanup_rep_rx,
1683 .init_tx = mlx5e_init_rep_tx,
1684 .cleanup_tx = mlx5e_cleanup_rep_tx,
1685 .enable = mlx5e_uplink_rep_enable,
1686 .disable = mlx5e_uplink_rep_disable,
1687 .update_stats = mlx5e_uplink_rep_update_hw_counters,
1688 .update_carrier = mlx5e_update_carrier,
1689 .rx_handlers.handle_rx_cqe = mlx5e_handle_rx_cqe_rep,
1690 .rx_handlers.handle_rx_cqe_mpwqe = mlx5e_handle_rx_cqe_mpwrq,
1691 .max_tc = MLX5E_MAX_NUM_TC,
1692};
1693
1694/* e-Switch vport representors */
1498static int 1695static int
1499mlx5e_vport_rep_load(struct mlx5_core_dev *dev, struct mlx5_eswitch_rep *rep) 1696mlx5e_vport_rep_load(struct mlx5_core_dev *dev, struct mlx5_eswitch_rep *rep)
1500{ 1697{
1698 const struct mlx5e_profile *profile;
1501 struct mlx5e_rep_priv *rpriv; 1699 struct mlx5e_rep_priv *rpriv;
1502 struct net_device *netdev; 1700 struct net_device *netdev;
1503 int nch, err; 1701 int nch, err;
@@ -1506,8 +1704,12 @@ mlx5e_vport_rep_load(struct mlx5_core_dev *dev, struct mlx5_eswitch_rep *rep)
1506 if (!rpriv) 1704 if (!rpriv)
1507 return -ENOMEM; 1705 return -ENOMEM;
1508 1706
1707 /* rpriv->rep to be looked up when profile->init() is called */
1708 rpriv->rep = rep;
1709
1509 nch = mlx5e_get_max_num_channels(dev); 1710 nch = mlx5e_get_max_num_channels(dev);
1510 netdev = mlx5e_create_netdev(dev, &mlx5e_rep_profile, nch, rpriv); 1711 profile = (rep->vport == FDB_UPLINK_VPORT) ? &mlx5e_uplink_rep_profile : &mlx5e_vf_rep_profile;
1712 netdev = mlx5e_create_netdev(dev, profile, nch, rpriv);
1511 if (!netdev) { 1713 if (!netdev) {
1512 pr_warn("Failed to create representor netdev for vport %d\n", 1714 pr_warn("Failed to create representor netdev for vport %d\n",
1513 rep->vport); 1715 rep->vport);
@@ -1516,15 +1718,20 @@ mlx5e_vport_rep_load(struct mlx5_core_dev *dev, struct mlx5_eswitch_rep *rep)
1516 } 1718 }
1517 1719
1518 rpriv->netdev = netdev; 1720 rpriv->netdev = netdev;
1519 rpriv->rep = rep;
1520 rep->rep_if[REP_ETH].priv = rpriv; 1721 rep->rep_if[REP_ETH].priv = rpriv;
1521 INIT_LIST_HEAD(&rpriv->vport_sqs_list); 1722 INIT_LIST_HEAD(&rpriv->vport_sqs_list);
1522 1723
1724 if (rep->vport == FDB_UPLINK_VPORT) {
1725 err = mlx5e_create_mdev_resources(dev);
1726 if (err)
1727 goto err_destroy_netdev;
1728 }
1729
1523 err = mlx5e_attach_netdev(netdev_priv(netdev)); 1730 err = mlx5e_attach_netdev(netdev_priv(netdev));
1524 if (err) { 1731 if (err) {
1525 pr_warn("Failed to attach representor netdev for vport %d\n", 1732 pr_warn("Failed to attach representor netdev for vport %d\n",
1526 rep->vport); 1733 rep->vport);
1527 goto err_destroy_netdev; 1734 goto err_destroy_mdev_resources;
1528 } 1735 }
1529 1736
1530 err = mlx5e_rep_neigh_init(rpriv); 1737 err = mlx5e_rep_neigh_init(rpriv);
@@ -1549,6 +1756,10 @@ err_neigh_cleanup:
1549err_detach_netdev: 1756err_detach_netdev:
1550 mlx5e_detach_netdev(netdev_priv(netdev)); 1757 mlx5e_detach_netdev(netdev_priv(netdev));
1551 1758
1759err_destroy_mdev_resources:
1760 if (rep->vport == FDB_UPLINK_VPORT)
1761 mlx5e_destroy_mdev_resources(dev);
1762
1552err_destroy_netdev: 1763err_destroy_netdev:
1553 mlx5e_destroy_netdev(netdev_priv(netdev)); 1764 mlx5e_destroy_netdev(netdev_priv(netdev));
1554 kfree(rpriv); 1765 kfree(rpriv);
@@ -1566,6 +1777,8 @@ mlx5e_vport_rep_unload(struct mlx5_eswitch_rep *rep)
1566 unregister_netdev(netdev); 1777 unregister_netdev(netdev);
1567 mlx5e_rep_neigh_cleanup(rpriv); 1778 mlx5e_rep_neigh_cleanup(rpriv);
1568 mlx5e_detach_netdev(priv); 1779 mlx5e_detach_netdev(priv);
1780 if (rep->vport == FDB_UPLINK_VPORT)
1781 mlx5e_destroy_mdev_resources(priv->mdev);
1569 mlx5e_destroy_netdev(priv); 1782 mlx5e_destroy_netdev(priv);
1570 kfree(ppriv); /* mlx5e_rep_priv */ 1783 kfree(ppriv); /* mlx5e_rep_priv */
1571} 1784}
@@ -1579,14 +1792,13 @@ static void *mlx5e_vport_rep_get_proto_dev(struct mlx5_eswitch_rep *rep)
1579 return rpriv->netdev; 1792 return rpriv->netdev;
1580} 1793}
1581 1794
1582static void mlx5e_rep_register_vf_vports(struct mlx5e_priv *priv) 1795void mlx5e_rep_register_vport_reps(struct mlx5_core_dev *mdev)
1583{ 1796{
1584 struct mlx5_core_dev *mdev = priv->mdev; 1797 struct mlx5_eswitch *esw = mdev->priv.eswitch;
1585 struct mlx5_eswitch *esw = mdev->priv.eswitch;
1586 int total_vfs = MLX5_TOTAL_VPORTS(mdev); 1798 int total_vfs = MLX5_TOTAL_VPORTS(mdev);
1587 int vport; 1799 int vport;
1588 1800
1589 for (vport = 1; vport < total_vfs; vport++) { 1801 for (vport = 0; vport < total_vfs; vport++) {
1590 struct mlx5_eswitch_rep_if rep_if = {}; 1802 struct mlx5_eswitch_rep_if rep_if = {};
1591 1803
1592 rep_if.load = mlx5e_vport_rep_load; 1804 rep_if.load = mlx5e_vport_rep_load;
@@ -1596,55 +1808,12 @@ static void mlx5e_rep_register_vf_vports(struct mlx5e_priv *priv)
1596 } 1808 }
1597} 1809}
1598 1810
1599static void mlx5e_rep_unregister_vf_vports(struct mlx5e_priv *priv) 1811void mlx5e_rep_unregister_vport_reps(struct mlx5_core_dev *mdev)
1600{ 1812{
1601 struct mlx5_core_dev *mdev = priv->mdev;
1602 struct mlx5_eswitch *esw = mdev->priv.eswitch; 1813 struct mlx5_eswitch *esw = mdev->priv.eswitch;
1603 int total_vfs = MLX5_TOTAL_VPORTS(mdev); 1814 int total_vfs = MLX5_TOTAL_VPORTS(mdev);
1604 int vport; 1815 int vport;
1605 1816
1606 for (vport = 1; vport < total_vfs; vport++) 1817 for (vport = total_vfs - 1; vport >= 0; vport--)
1607 mlx5_eswitch_unregister_vport_rep(esw, vport, REP_ETH); 1818 mlx5_eswitch_unregister_vport_rep(esw, vport, REP_ETH);
1608} 1819}
1609
1610void mlx5e_register_vport_reps(struct mlx5e_priv *priv)
1611{
1612 struct mlx5_core_dev *mdev = priv->mdev;
1613 struct mlx5_eswitch *esw = mdev->priv.eswitch;
1614 struct mlx5_eswitch_rep_if rep_if;
1615 struct mlx5e_rep_priv *rpriv;
1616
1617 rpriv = priv->ppriv;
1618 rpriv->netdev = priv->netdev;
1619
1620 rep_if.load = mlx5e_nic_rep_load;
1621 rep_if.unload = mlx5e_nic_rep_unload;
1622 rep_if.get_proto_dev = mlx5e_vport_rep_get_proto_dev;
1623 rep_if.priv = rpriv;
1624 INIT_LIST_HEAD(&rpriv->vport_sqs_list);
1625 mlx5_eswitch_register_vport_rep(esw, 0, &rep_if, REP_ETH); /* UPLINK PF vport*/
1626
1627 mlx5e_rep_register_vf_vports(priv); /* VFs vports */
1628}
1629
1630void mlx5e_unregister_vport_reps(struct mlx5e_priv *priv)
1631{
1632 struct mlx5_core_dev *mdev = priv->mdev;
1633 struct mlx5_eswitch *esw = mdev->priv.eswitch;
1634
1635 mlx5e_rep_unregister_vf_vports(priv); /* VFs vports */
1636 mlx5_eswitch_unregister_vport_rep(esw, 0, REP_ETH); /* UPLINK PF*/
1637}
1638
1639void *mlx5e_alloc_nic_rep_priv(struct mlx5_core_dev *mdev)
1640{
1641 struct mlx5_eswitch *esw = mdev->priv.eswitch;
1642 struct mlx5e_rep_priv *rpriv;
1643
1644 rpriv = kzalloc(sizeof(*rpriv), GFP_KERNEL);
1645 if (!rpriv)
1646 return NULL;
1647
1648 rpriv->rep = &esw->offloads.vport_reps[0];
1649 return rpriv;
1650}
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_rep.h b/drivers/net/ethernet/mellanox/mlx5/core/en_rep.h
index 2c8798332c32..5645d3cef1bb 100644
--- a/drivers/net/ethernet/mellanox/mlx5/core/en_rep.h
+++ b/drivers/net/ethernet/mellanox/mlx5/core/en_rep.h
@@ -162,16 +162,12 @@ struct mlx5e_rep_sq {
162}; 162};
163 163
164void *mlx5e_alloc_nic_rep_priv(struct mlx5_core_dev *mdev); 164void *mlx5e_alloc_nic_rep_priv(struct mlx5_core_dev *mdev);
165void mlx5e_register_vport_reps(struct mlx5e_priv *priv); 165void mlx5e_rep_register_vport_reps(struct mlx5_core_dev *mdev);
166void mlx5e_unregister_vport_reps(struct mlx5e_priv *priv); 166void mlx5e_rep_unregister_vport_reps(struct mlx5_core_dev *mdev);
167bool mlx5e_is_uplink_rep(struct mlx5e_priv *priv); 167bool mlx5e_is_uplink_rep(struct mlx5e_priv *priv);
168int mlx5e_add_sqs_fwd_rules(struct mlx5e_priv *priv); 168int mlx5e_add_sqs_fwd_rules(struct mlx5e_priv *priv);
169void mlx5e_remove_sqs_fwd_rules(struct mlx5e_priv *priv); 169void mlx5e_remove_sqs_fwd_rules(struct mlx5e_priv *priv);
170 170
171int mlx5e_get_offload_stats(int attr_id, const struct net_device *dev, void *sp);
172bool mlx5e_has_offload_stats(const struct net_device *dev, int attr_id);
173
174int mlx5e_attr_get(struct net_device *dev, struct switchdev_attr *attr);
175void mlx5e_handle_rx_cqe_rep(struct mlx5e_rq *rq, struct mlx5_cqe64 *cqe); 171void mlx5e_handle_rx_cqe_rep(struct mlx5e_rq *rq, struct mlx5_cqe64 *cqe);
176 172
177int mlx5e_rep_encap_entry_attach(struct mlx5e_priv *priv, 173int mlx5e_rep_encap_entry_attach(struct mlx5e_priv *priv,
@@ -181,11 +177,13 @@ void mlx5e_rep_encap_entry_detach(struct mlx5e_priv *priv,
181 177
182void mlx5e_rep_queue_neigh_stats_work(struct mlx5e_priv *priv); 178void mlx5e_rep_queue_neigh_stats_work(struct mlx5e_priv *priv);
183#else /* CONFIG_MLX5_ESWITCH */ 179#else /* CONFIG_MLX5_ESWITCH */
184static inline void mlx5e_register_vport_reps(struct mlx5e_priv *priv) {}
185static inline void mlx5e_unregister_vport_reps(struct mlx5e_priv *priv) {}
186static inline bool mlx5e_is_uplink_rep(struct mlx5e_priv *priv) { return false; } 180static inline bool mlx5e_is_uplink_rep(struct mlx5e_priv *priv) { return false; }
187static inline int mlx5e_add_sqs_fwd_rules(struct mlx5e_priv *priv) { return 0; } 181static inline int mlx5e_add_sqs_fwd_rules(struct mlx5e_priv *priv) { return 0; }
188static inline void mlx5e_remove_sqs_fwd_rules(struct mlx5e_priv *priv) {} 182static inline void mlx5e_remove_sqs_fwd_rules(struct mlx5e_priv *priv) {}
189#endif 183#endif
190 184
185static inline bool mlx5e_is_vport_rep(struct mlx5e_priv *priv)
186{
187 return (MLX5_ESWITCH_MANAGER(priv->mdev) && priv->ppriv);
188}
191#endif /* __MLX5E_REP_H__ */ 189#endif /* __MLX5E_REP_H__ */
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_stats.c b/drivers/net/ethernet/mellanox/mlx5/core/en_stats.c
index 8224f1e062a8..3071a44e2f30 100644
--- a/drivers/net/ethernet/mellanox/mlx5/core/en_stats.c
+++ b/drivers/net/ethernet/mellanox/mlx5/core/en_stats.c
@@ -486,7 +486,7 @@ static int mlx5e_grp_802_3_fill_stats(struct mlx5e_priv *priv, u64 *data,
486#define MLX5_BASIC_PPCNT_SUPPORTED(mdev) \ 486#define MLX5_BASIC_PPCNT_SUPPORTED(mdev) \
487 (MLX5_CAP_GEN(mdev, pcam_reg) ? MLX5_CAP_PCAM_REG(mdev, ppcnt) : 1) 487 (MLX5_CAP_GEN(mdev, pcam_reg) ? MLX5_CAP_PCAM_REG(mdev, ppcnt) : 1)
488 488
489static void mlx5e_grp_802_3_update_stats(struct mlx5e_priv *priv) 489void mlx5e_grp_802_3_update_stats(struct mlx5e_priv *priv)
490{ 490{
491 struct mlx5e_pport_stats *pstats = &priv->stats.pport; 491 struct mlx5e_pport_stats *pstats = &priv->stats.pport;
492 struct mlx5_core_dev *mdev = priv->mdev; 492 struct mlx5_core_dev *mdev = priv->mdev;
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_stats.h b/drivers/net/ethernet/mellanox/mlx5/core/en_stats.h
index 3f8e870ef4c9..807e60582a6b 100644
--- a/drivers/net/ethernet/mellanox/mlx5/core/en_stats.h
+++ b/drivers/net/ethernet/mellanox/mlx5/core/en_stats.h
@@ -280,5 +280,6 @@ extern const struct mlx5e_stats_grp mlx5e_stats_grps[];
280extern const int mlx5e_num_stats_grps; 280extern const int mlx5e_num_stats_grps;
281 281
282void mlx5e_grp_sw_update_stats(struct mlx5e_priv *priv); 282void mlx5e_grp_sw_update_stats(struct mlx5e_priv *priv);
283void mlx5e_grp_802_3_update_stats(struct mlx5e_priv *priv);
283 284
284#endif /* __MLX5_EN_STATS_H__ */ 285#endif /* __MLX5_EN_STATS_H__ */
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_tc.c b/drivers/net/ethernet/mellanox/mlx5/core/en_tc.c
index 53ebb5a48018..c1a9120412b8 100644
--- a/drivers/net/ethernet/mellanox/mlx5/core/en_tc.c
+++ b/drivers/net/ethernet/mellanox/mlx5/core/en_tc.c
@@ -69,13 +69,13 @@ struct mlx5_nic_flow_attr {
69enum { 69enum {
70 MLX5E_TC_FLOW_INGRESS = MLX5E_TC_INGRESS, 70 MLX5E_TC_FLOW_INGRESS = MLX5E_TC_INGRESS,
71 MLX5E_TC_FLOW_EGRESS = MLX5E_TC_EGRESS, 71 MLX5E_TC_FLOW_EGRESS = MLX5E_TC_EGRESS,
72 MLX5E_TC_FLOW_ESWITCH = BIT(MLX5E_TC_FLOW_BASE), 72 MLX5E_TC_FLOW_ESWITCH = MLX5E_TC_ESW_OFFLOAD,
73 MLX5E_TC_FLOW_NIC = BIT(MLX5E_TC_FLOW_BASE + 1), 73 MLX5E_TC_FLOW_NIC = MLX5E_TC_NIC_OFFLOAD,
74 MLX5E_TC_FLOW_OFFLOADED = BIT(MLX5E_TC_FLOW_BASE + 2), 74 MLX5E_TC_FLOW_OFFLOADED = BIT(MLX5E_TC_FLOW_BASE),
75 MLX5E_TC_FLOW_HAIRPIN = BIT(MLX5E_TC_FLOW_BASE + 3), 75 MLX5E_TC_FLOW_HAIRPIN = BIT(MLX5E_TC_FLOW_BASE + 1),
76 MLX5E_TC_FLOW_HAIRPIN_RSS = BIT(MLX5E_TC_FLOW_BASE + 4), 76 MLX5E_TC_FLOW_HAIRPIN_RSS = BIT(MLX5E_TC_FLOW_BASE + 2),
77 MLX5E_TC_FLOW_SLOW = BIT(MLX5E_TC_FLOW_BASE + 5), 77 MLX5E_TC_FLOW_SLOW = BIT(MLX5E_TC_FLOW_BASE + 3),
78 MLX5E_TC_FLOW_DUP = BIT(MLX5E_TC_FLOW_BASE + 6), 78 MLX5E_TC_FLOW_DUP = BIT(MLX5E_TC_FLOW_BASE + 4),
79}; 79};
80 80
81#define MLX5E_TC_MAX_SPLITS 1 81#define MLX5E_TC_MAX_SPLITS 1
@@ -834,7 +834,7 @@ static void mlx5e_tc_del_nic_flow(struct mlx5e_priv *priv,
834 mlx5_del_flow_rules(flow->rule[0]); 834 mlx5_del_flow_rules(flow->rule[0]);
835 mlx5_fc_destroy(priv->mdev, counter); 835 mlx5_fc_destroy(priv->mdev, counter);
836 836
837 if (!mlx5e_tc_num_filters(priv) && priv->fs.tc.t) { 837 if (!mlx5e_tc_num_filters(priv, MLX5E_TC_NIC_OFFLOAD) && priv->fs.tc.t) {
838 mlx5_destroy_flow_table(priv->fs.tc.t); 838 mlx5_destroy_flow_table(priv->fs.tc.t);
839 priv->fs.tc.t = NULL; 839 priv->fs.tc.t = NULL;
840 } 840 }
@@ -2686,6 +2686,11 @@ static void get_flags(int flags, u16 *flow_flags)
2686 if (flags & MLX5E_TC_EGRESS) 2686 if (flags & MLX5E_TC_EGRESS)
2687 __flow_flags |= MLX5E_TC_FLOW_EGRESS; 2687 __flow_flags |= MLX5E_TC_FLOW_EGRESS;
2688 2688
2689 if (flags & MLX5E_TC_ESW_OFFLOAD)
2690 __flow_flags |= MLX5E_TC_FLOW_ESWITCH;
2691 if (flags & MLX5E_TC_NIC_OFFLOAD)
2692 __flow_flags |= MLX5E_TC_FLOW_NIC;
2693
2689 *flow_flags = __flow_flags; 2694 *flow_flags = __flow_flags;
2690} 2695}
2691 2696
@@ -2696,15 +2701,15 @@ static const struct rhashtable_params tc_ht_params = {
2696 .automatic_shrinking = true, 2701 .automatic_shrinking = true,
2697}; 2702};
2698 2703
2699static struct rhashtable *get_tc_ht(struct mlx5e_priv *priv) 2704static struct rhashtable *get_tc_ht(struct mlx5e_priv *priv, int flags)
2700{ 2705{
2701 struct mlx5_eswitch *esw = priv->mdev->priv.eswitch; 2706 struct mlx5_eswitch *esw = priv->mdev->priv.eswitch;
2702 struct mlx5e_rep_priv *uplink_rpriv; 2707 struct mlx5e_rep_priv *uplink_rpriv;
2703 2708
2704 if (MLX5_VPORT_MANAGER(priv->mdev) && esw->mode == SRIOV_OFFLOADS) { 2709 if (flags & MLX5E_TC_ESW_OFFLOAD) {
2705 uplink_rpriv = mlx5_eswitch_get_uplink_priv(esw, REP_ETH); 2710 uplink_rpriv = mlx5_eswitch_get_uplink_priv(esw, REP_ETH);
2706 return &uplink_rpriv->uplink_priv.tc_ht; 2711 return &uplink_rpriv->uplink_priv.tc_ht;
2707 } else 2712 } else /* NIC offload */
2708 return &priv->fs.tc.ht; 2713 return &priv->fs.tc.ht;
2709} 2714}
2710 2715
@@ -2973,7 +2978,7 @@ int mlx5e_configure_flower(struct net_device *dev, struct mlx5e_priv *priv,
2973 struct tc_cls_flower_offload *f, int flags) 2978 struct tc_cls_flower_offload *f, int flags)
2974{ 2979{
2975 struct netlink_ext_ack *extack = f->common.extack; 2980 struct netlink_ext_ack *extack = f->common.extack;
2976 struct rhashtable *tc_ht = get_tc_ht(priv); 2981 struct rhashtable *tc_ht = get_tc_ht(priv, flags);
2977 struct mlx5e_tc_flow *flow; 2982 struct mlx5e_tc_flow *flow;
2978 int err = 0; 2983 int err = 0;
2979 2984
@@ -3018,7 +3023,7 @@ static bool same_flow_direction(struct mlx5e_tc_flow *flow, int flags)
3018int mlx5e_delete_flower(struct net_device *dev, struct mlx5e_priv *priv, 3023int mlx5e_delete_flower(struct net_device *dev, struct mlx5e_priv *priv,
3019 struct tc_cls_flower_offload *f, int flags) 3024 struct tc_cls_flower_offload *f, int flags)
3020{ 3025{
3021 struct rhashtable *tc_ht = get_tc_ht(priv); 3026 struct rhashtable *tc_ht = get_tc_ht(priv, flags);
3022 struct mlx5e_tc_flow *flow; 3027 struct mlx5e_tc_flow *flow;
3023 3028
3024 flow = rhashtable_lookup_fast(tc_ht, &f->cookie, tc_ht_params); 3029 flow = rhashtable_lookup_fast(tc_ht, &f->cookie, tc_ht_params);
@@ -3038,7 +3043,7 @@ int mlx5e_stats_flower(struct net_device *dev, struct mlx5e_priv *priv,
3038 struct tc_cls_flower_offload *f, int flags) 3043 struct tc_cls_flower_offload *f, int flags)
3039{ 3044{
3040 struct mlx5_devcom *devcom = priv->mdev->priv.devcom; 3045 struct mlx5_devcom *devcom = priv->mdev->priv.devcom;
3041 struct rhashtable *tc_ht = get_tc_ht(priv); 3046 struct rhashtable *tc_ht = get_tc_ht(priv, flags);
3042 struct mlx5_eswitch *peer_esw; 3047 struct mlx5_eswitch *peer_esw;
3043 struct mlx5e_tc_flow *flow; 3048 struct mlx5e_tc_flow *flow;
3044 struct mlx5_fc *counter; 3049 struct mlx5_fc *counter;
@@ -3168,7 +3173,7 @@ void mlx5e_tc_nic_cleanup(struct mlx5e_priv *priv)
3168 if (tc->netdevice_nb.notifier_call) 3173 if (tc->netdevice_nb.notifier_call)
3169 unregister_netdevice_notifier(&tc->netdevice_nb); 3174 unregister_netdevice_notifier(&tc->netdevice_nb);
3170 3175
3171 rhashtable_free_and_destroy(&tc->ht, _mlx5e_tc_del_flow, NULL); 3176 rhashtable_destroy(&tc->ht);
3172 3177
3173 if (!IS_ERR_OR_NULL(tc->t)) { 3178 if (!IS_ERR_OR_NULL(tc->t)) {
3174 mlx5_destroy_flow_table(tc->t); 3179 mlx5_destroy_flow_table(tc->t);
@@ -3186,9 +3191,9 @@ void mlx5e_tc_esw_cleanup(struct rhashtable *tc_ht)
3186 rhashtable_free_and_destroy(tc_ht, _mlx5e_tc_del_flow, NULL); 3191 rhashtable_free_and_destroy(tc_ht, _mlx5e_tc_del_flow, NULL);
3187} 3192}
3188 3193
3189int mlx5e_tc_num_filters(struct mlx5e_priv *priv) 3194int mlx5e_tc_num_filters(struct mlx5e_priv *priv, int flags)
3190{ 3195{
3191 struct rhashtable *tc_ht = get_tc_ht(priv); 3196 struct rhashtable *tc_ht = get_tc_ht(priv, flags);
3192 3197
3193 return atomic_read(&tc_ht->nelems); 3198 return atomic_read(&tc_ht->nelems);
3194} 3199}
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_tc.h b/drivers/net/ethernet/mellanox/mlx5/core/en_tc.h
index a15c08a35054..d2d87f978c06 100644
--- a/drivers/net/ethernet/mellanox/mlx5/core/en_tc.h
+++ b/drivers/net/ethernet/mellanox/mlx5/core/en_tc.h
@@ -42,7 +42,9 @@
42enum { 42enum {
43 MLX5E_TC_INGRESS = BIT(0), 43 MLX5E_TC_INGRESS = BIT(0),
44 MLX5E_TC_EGRESS = BIT(1), 44 MLX5E_TC_EGRESS = BIT(1),
45 MLX5E_TC_LAST_EXPORTED_BIT = 1, 45 MLX5E_TC_NIC_OFFLOAD = BIT(2),
46 MLX5E_TC_ESW_OFFLOAD = BIT(3),
47 MLX5E_TC_LAST_EXPORTED_BIT = 3,
46}; 48};
47 49
48int mlx5e_tc_nic_init(struct mlx5e_priv *priv); 50int mlx5e_tc_nic_init(struct mlx5e_priv *priv);
@@ -68,13 +70,13 @@ void mlx5e_tc_encap_flows_del(struct mlx5e_priv *priv,
68struct mlx5e_neigh_hash_entry; 70struct mlx5e_neigh_hash_entry;
69void mlx5e_tc_update_neigh_used_value(struct mlx5e_neigh_hash_entry *nhe); 71void mlx5e_tc_update_neigh_used_value(struct mlx5e_neigh_hash_entry *nhe);
70 72
71int mlx5e_tc_num_filters(struct mlx5e_priv *priv); 73int mlx5e_tc_num_filters(struct mlx5e_priv *priv, int flags);
72 74
73 75
74#else /* CONFIG_MLX5_ESWITCH */ 76#else /* CONFIG_MLX5_ESWITCH */
75static inline int mlx5e_tc_nic_init(struct mlx5e_priv *priv) { return 0; } 77static inline int mlx5e_tc_nic_init(struct mlx5e_priv *priv) { return 0; }
76static inline void mlx5e_tc_nic_cleanup(struct mlx5e_priv *priv) {} 78static inline void mlx5e_tc_nic_cleanup(struct mlx5e_priv *priv) {}
77static inline int mlx5e_tc_num_filters(struct mlx5e_priv *priv) { return 0; } 79static inline int mlx5e_tc_num_filters(struct mlx5e_priv *priv, int flags) { return 0; }
78#endif 80#endif
79 81
80#endif /* __MLX5_EN_TC_H__ */ 82#endif /* __MLX5_EN_TC_H__ */
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/eswitch.c b/drivers/net/ethernet/mellanox/mlx5/core/eswitch.c
index ef2bec50423d..a44ea7b85614 100644
--- a/drivers/net/ethernet/mellanox/mlx5/core/eswitch.c
+++ b/drivers/net/ethernet/mellanox/mlx5/core/eswitch.c
@@ -1630,6 +1630,7 @@ int mlx5_eswitch_enable_sriov(struct mlx5_eswitch *esw, int nvfs, int mode)
1630 esw_warn(esw->dev, "E-Switch engress ACL is not supported by FW\n"); 1630 esw_warn(esw->dev, "E-Switch engress ACL is not supported by FW\n");
1631 1631
1632 esw_info(esw->dev, "E-Switch enable SRIOV: nvfs(%d) mode (%d)\n", nvfs, mode); 1632 esw_info(esw->dev, "E-Switch enable SRIOV: nvfs(%d) mode (%d)\n", nvfs, mode);
1633
1633 esw->mode = mode; 1634 esw->mode = mode;
1634 1635
1635 mlx5_lag_update(esw->dev); 1636 mlx5_lag_update(esw->dev);
@@ -1637,8 +1638,8 @@ int mlx5_eswitch_enable_sriov(struct mlx5_eswitch *esw, int nvfs, int mode)
1637 if (mode == SRIOV_LEGACY) { 1638 if (mode == SRIOV_LEGACY) {
1638 err = esw_create_legacy_fdb_table(esw); 1639 err = esw_create_legacy_fdb_table(esw);
1639 } else { 1640 } else {
1641 mlx5_reload_interface(esw->dev, MLX5_INTERFACE_PROTOCOL_ETH);
1640 mlx5_reload_interface(esw->dev, MLX5_INTERFACE_PROTOCOL_IB); 1642 mlx5_reload_interface(esw->dev, MLX5_INTERFACE_PROTOCOL_IB);
1641
1642 err = esw_offloads_init(esw, nvfs + 1); 1643 err = esw_offloads_init(esw, nvfs + 1);
1643 } 1644 }
1644 1645
@@ -1669,8 +1670,10 @@ int mlx5_eswitch_enable_sriov(struct mlx5_eswitch *esw, int nvfs, int mode)
1669abort: 1670abort:
1670 esw->mode = SRIOV_NONE; 1671 esw->mode = SRIOV_NONE;
1671 1672
1672 if (mode == SRIOV_OFFLOADS) 1673 if (mode == SRIOV_OFFLOADS) {
1673 mlx5_reload_interface(esw->dev, MLX5_INTERFACE_PROTOCOL_IB); 1674 mlx5_reload_interface(esw->dev, MLX5_INTERFACE_PROTOCOL_IB);
1675 mlx5_reload_interface(esw->dev, MLX5_INTERFACE_PROTOCOL_ETH);
1676 }
1674 1677
1675 return err; 1678 return err;
1676} 1679}
@@ -1712,8 +1715,10 @@ void mlx5_eswitch_disable_sriov(struct mlx5_eswitch *esw)
1712 1715
1713 mlx5_lag_update(esw->dev); 1716 mlx5_lag_update(esw->dev);
1714 1717
1715 if (old_mode == SRIOV_OFFLOADS) 1718 if (old_mode == SRIOV_OFFLOADS) {
1716 mlx5_reload_interface(esw->dev, MLX5_INTERFACE_PROTOCOL_IB); 1719 mlx5_reload_interface(esw->dev, MLX5_INTERFACE_PROTOCOL_IB);
1720 mlx5_reload_interface(esw->dev, MLX5_INTERFACE_PROTOCOL_ETH);
1721 }
1717} 1722}
1718 1723
1719int mlx5_eswitch_init(struct mlx5_core_dev *dev) 1724int mlx5_eswitch_init(struct mlx5_core_dev *dev)
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/eswitch_offloads.c b/drivers/net/ethernet/mellanox/mlx5/core/eswitch_offloads.c
index 76cb57202474..53065b6ae593 100644
--- a/drivers/net/ethernet/mellanox/mlx5/core/eswitch_offloads.c
+++ b/drivers/net/ethernet/mellanox/mlx5/core/eswitch_offloads.c
@@ -1450,9 +1450,6 @@ static int esw_offloads_stop(struct mlx5_eswitch *esw,
1450 } 1450 }
1451 } 1451 }
1452 1452
1453 /* enable back PF RoCE */
1454 mlx5_reload_interface(esw->dev, MLX5_INTERFACE_PROTOCOL_IB);
1455
1456 return err; 1453 return err;
1457} 1454}
1458 1455