History

Merge tag 'mlx5-fixes-2020-07-02' of git://git.kernel.org/pub/scm/linux/kernel/git/saeed/linux

Saeed Mahameed says: ==================== mlx5 fixes 2020-07-02 This series introduces some fixes to mlx5 driver. V1->v2: - Drop "ip -s" patch and mirred device hold reference patch. - Will revise them in a later submission. Please pull and let me know if there is any problem. For -stable v5.2 ('net/mlx5: Fix eeprom support for SFP module') For -stable v5.4 ('net/mlx5e: Fix 50G per lane indication') For -stable v5.5 ('net/mlx5e: Fix CPU mapping after function reload to avoid aRFS RX crash') ('net/mlx5e: Fix VXLAN configuration restore after function reload') For -stable v5.7 ('net/mlx5e: CT: Fix memory leak in cleanup') ====================

David S. Miller committed 6 years ago

Commit ca68d562 parents 14b032b eb32b3f14 files · +196 −62Browse files

Unified · Split

14 files
  1. drivers/net/ethernet/mellanox/mlx5/core/en/dcbnl.h +1 −0
  2. drivers/net/ethernet/mellanox/mlx5/core/en/port.c +18 −3
  3. drivers/net/ethernet/mellanox/mlx5/core/en/port.h +1 −1
  4. drivers/net/ethernet/mellanox/mlx5/core/en/port_buffer.c +29 −24
  5. drivers/net/ethernet/mellanox/mlx5/core/en/port_buffer.h +0 −1
  6. drivers/net/ethernet/mellanox/mlx5/core/en/tc_ct.c +1 −0
  7. drivers/net/ethernet/mellanox/mlx5/core/en_dcbnl.c +19 −0
  8. drivers/net/ethernet/mellanox/mlx5/core/en_ethtool.c +4 −4
  9. drivers/net/ethernet/mellanox/mlx5/core/en_main.c +8 −7
  10. drivers/net/ethernet/mellanox/mlx5/core/en_tc.c +9 −5
  11. drivers/net/ethernet/mellanox/mlx5/core/esw/acl/ingress_lgcy.c +0 −1
  12. drivers/net/ethernet/mellanox/mlx5/core/port.c +77 −16
  13. include/linux/mlx5/driver.h +1 −0
  14. include/linux/mlx5/mlx5_ifc.h +28 −0
drivers/net/ethernet/mellanox/mlx5/core/en/dcbnl.h+1−0
@@ -29,6 +29,7 @@ struct mlx5e_dcbx { · 28 unmodified lines
2929 bool manual_buffer;
3030 u32 cable_len;
3131 u32 xoff;
32+ u16 port_buff_cell_sz;
3233 };
3334
3435 #define MLX5E_MAX_DSCP (64)
drivers/net/ethernet/mellanox/mlx5/core/en/port.c+18−3
@@ -78,11 +78,26 @@ static const u32 mlx5e_ext_link_speed[MLX5E_EXT_LINK_MODES_NUMBER] = { · 77 unmodified lines
7878 [MLX5E_400GAUI_8] = 400000,
7979 };
8080
81+bool mlx5e_ptys_ext_supported(struct mlx5_core_dev *mdev)
82+{
83+ struct mlx5e_port_eth_proto eproto;
84+ int err;
85+
86+ if (MLX5_CAP_PCAM_FEATURE(mdev, ptys_extended_ethernet))
87+ return true;
88+
89+ err = mlx5_port_query_eth_proto(mdev, 1, true, &eproto);
90+ if (err)
91+ return false;
92+
93+ return !!eproto.cap;
94+}
95+
8196 static void mlx5e_port_get_speed_arr(struct mlx5_core_dev *mdev,
8297 const u32 **arr, u32 *size,
8398 bool force_legacy)
8499 {
85− bool ext = force_legacy ? false : MLX5_CAP_PCAM_FEATURE(mdev, ptys_extended_ethernet);
100+ bool ext = force_legacy ? false : mlx5e_ptys_ext_supported(mdev);
86101
87102 *size = ext ? ARRAY_SIZE(mlx5e_ext_link_speed) :
88103 ARRAY_SIZE(mlx5e_link_speed);
@@ -177,7 +192,7 @@ int mlx5e_port_linkspeed(struct mlx5_core_dev *mdev, u32 *speed) · 88 unmodified lines
177192 bool ext;
178193 int err;
179194
180− ext = MLX5_CAP_PCAM_FEATURE(mdev, ptys_extended_ethernet);
195+ ext = mlx5e_ptys_ext_supported(mdev);
181196 err = mlx5_port_query_eth_proto(mdev, 1, ext, &eproto);
182197 if (err)
183198 goto out;
@@ -205,7 +220,7 @@ int mlx5e_port_max_linkspeed(struct mlx5_core_dev *mdev, u32 *speed) · 21 unmodified lines
205220 int err;
206221 int i;
207222
208− ext = MLX5_CAP_PCAM_FEATURE(mdev, ptys_extended_ethernet);
223+ ext = mlx5e_ptys_ext_supported(mdev);
209224 err = mlx5_port_query_eth_proto(mdev, 1, ext, &eproto);
210225 if (err)
211226 return err;
drivers/net/ethernet/mellanox/mlx5/core/en/port.h+1−1
@@ -54,7 +54,7 @@ int mlx5e_port_linkspeed(struct mlx5_core_dev *mdev, u32 *speed); · 53 unmodified lines
5454 int mlx5e_port_max_linkspeed(struct mlx5_core_dev *mdev, u32 *speed);
5555 u32 mlx5e_port_speed2linkmodes(struct mlx5_core_dev *mdev, u32 speed,
5656 bool force_legacy);
57−
57+bool mlx5e_ptys_ext_supported(struct mlx5_core_dev *mdev);
5858 int mlx5e_port_query_pbmc(struct mlx5_core_dev *mdev, void *out);
5959 int mlx5e_port_set_pbmc(struct mlx5_core_dev *mdev, void *in);
6060 int mlx5e_port_query_priority2buffer(struct mlx5_core_dev *mdev, u8 *buffer);
drivers/net/ethernet/mellanox/mlx5/core/en/port_buffer.c+29−24
@@ -34,6 +34,7 @@ · 33 unmodified lines
3434 int mlx5e_port_query_buffer(struct mlx5e_priv *priv,
3535 struct mlx5e_port_buffer *port_buffer)
3636 {
37+ u16 port_buff_cell_sz = priv->dcbx.port_buff_cell_sz;
3738 struct mlx5_core_dev *mdev = priv->mdev;
3839 int sz = MLX5_ST_SZ_BYTES(pbmc_reg);
3940 u32 total_used = 0;
@@ -57,11 +58,11 @@ int mlx5e_port_query_buffer(struct mlx5e_priv *priv, · 17 unmodified lines
5758 port_buffer->buffer[i].epsb =
5859 MLX5_GET(bufferx_reg, buffer, epsb);
5960 port_buffer->buffer[i].size =
60− MLX5_GET(bufferx_reg, buffer, size) << MLX5E_BUFFER_CELL_SHIFT;
61+ MLX5_GET(bufferx_reg, buffer, size) * port_buff_cell_sz;
6162 port_buffer->buffer[i].xon =
62− MLX5_GET(bufferx_reg, buffer, xon_threshold) << MLX5E_BUFFER_CELL_SHIFT;
63+ MLX5_GET(bufferx_reg, buffer, xon_threshold) * port_buff_cell_sz;
6364 port_buffer->buffer[i].xoff =
64− MLX5_GET(bufferx_reg, buffer, xoff_threshold) << MLX5E_BUFFER_CELL_SHIFT;
65+ MLX5_GET(bufferx_reg, buffer, xoff_threshold) * port_buff_cell_sz;
6566 total_used += port_buffer->buffer[i].size;
6667
6768 mlx5e_dbg(HW, priv, "buffer %d: size=%d, xon=%d, xoff=%d, epsb=%d, lossy=%d\n", i,
@@ -73,7 +74,7 @@ int mlx5e_port_query_buffer(struct mlx5e_priv *priv, · 5 unmodified lines
7374 }
7475
7576 port_buffer->port_buffer_size =
76− MLX5_GET(pbmc_reg, out, port_buffer_size) << MLX5E_BUFFER_CELL_SHIFT;
77+ MLX5_GET(pbmc_reg, out, port_buffer_size) * port_buff_cell_sz;
7778 port_buffer->spare_buffer_size =
7879 port_buffer->port_buffer_size - total_used;
7980
@@ -88,9 +89,9 @@ out: · 8 unmodified lines
8889 static int port_set_buffer(struct mlx5e_priv *priv,
8990 struct mlx5e_port_buffer *port_buffer)
9091 {
92+ u16 port_buff_cell_sz = priv->dcbx.port_buff_cell_sz;
9193 struct mlx5_core_dev *mdev = priv->mdev;
9294 int sz = MLX5_ST_SZ_BYTES(pbmc_reg);
93− void *buffer;
9495 void *in;
9596 int err;
9697 int i;
@@ -104,16 +105,18 @@ static int port_set_buffer(struct mlx5e_priv *priv, · 7 unmodified lines
104105 goto out;
105106
106107 for (i = 0; i < MLX5E_MAX_BUFFER; i++) {
107− buffer = MLX5_ADDR_OF(pbmc_reg, in, buffer[i]);
108−
109− MLX5_SET(bufferx_reg, buffer, size,
110− port_buffer->buffer[i].size >> MLX5E_BUFFER_CELL_SHIFT);
111− MLX5_SET(bufferx_reg, buffer, lossy,
112− port_buffer->buffer[i].lossy);
113− MLX5_SET(bufferx_reg, buffer, xoff_threshold,
114− port_buffer->buffer[i].xoff >> MLX5E_BUFFER_CELL_SHIFT);
115− MLX5_SET(bufferx_reg, buffer, xon_threshold,
116− port_buffer->buffer[i].xon >> MLX5E_BUFFER_CELL_SHIFT);
108+ void *buffer = MLX5_ADDR_OF(pbmc_reg, in, buffer[i]);
109+ u64 size = port_buffer->buffer[i].size;
110+ u64 xoff = port_buffer->buffer[i].xoff;
111+ u64 xon = port_buffer->buffer[i].xon;
112+
113+ do_div(size, port_buff_cell_sz);
114+ do_div(xoff, port_buff_cell_sz);
115+ do_div(xon, port_buff_cell_sz);
116+ MLX5_SET(bufferx_reg, buffer, size, size);
117+ MLX5_SET(bufferx_reg, buffer, lossy, port_buffer->buffer[i].lossy);
118+ MLX5_SET(bufferx_reg, buffer, xoff_threshold, xoff);
119+ MLX5_SET(bufferx_reg, buffer, xon_threshold, xon);
117120 }
118121
119122 err = mlx5e_port_set_pbmc(mdev, in);
@@ -143,7 +146,7 @@ static u32 calculate_xoff(struct mlx5e_priv *priv, unsigned int mtu) · 23 unmodified lines
143146 }
144147
145148 static int update_xoff_threshold(struct mlx5e_port_buffer *port_buffer,
146− u32 xoff, unsigned int max_mtu)
149+ u32 xoff, unsigned int max_mtu, u16 port_buff_cell_sz)
147150 {
148151 int i;
149152
@@ -155,7 +158,7 @@ static int update_xoff_threshold(struct mlx5e_port_buffer *port_buffer, · 5 unmodified lines
155158 }
156159
157160 if (port_buffer->buffer[i].size <
158− (xoff + max_mtu + (1 << MLX5E_BUFFER_CELL_SHIFT))) {
161+ (xoff + max_mtu + port_buff_cell_sz)) {
159162 pr_err("buffer_size[%d]=%d is not enough for lossless buffer\n",
160163 i, port_buffer->buffer[i].size);
161164 return -ENOMEM;
@@ -175,6 +178,7 @@ static int update_xoff_threshold(struct mlx5e_port_buffer *port_buffer, · 13 unmodified lines
175178 * @pfc_en: <input> current pfc configuration
176179 * @buffer: <input> current prio to buffer mapping
177180 * @xoff: <input> xoff value
181+ * @port_buff_cell_sz: <input> port buffer cell_size
178182 * @port_buffer: <output> port receive buffer configuration
179183 * @change: <output>
180184 *
@@ -189,7 +193,7 @@ static int update_xoff_threshold(struct mlx5e_port_buffer *port_buffer, · 8 unmodified lines
189193 * sets change to true if buffer configuration was modified.
190194 */
191195 static int update_buffer_lossy(unsigned int max_mtu,
192− u8 pfc_en, u8 *buffer, u32 xoff,
196+ u8 pfc_en, u8 *buffer, u32 xoff, u16 port_buff_cell_sz,
193197 struct mlx5e_port_buffer *port_buffer,
194198 bool *change)
195199 {
@@ -225,7 +229,7 @@ static int update_buffer_lossy(unsigned int max_mtu, · 29 unmodified lines
225229 }
226230
227231 if (changed) {
228− err = update_xoff_threshold(port_buffer, xoff, max_mtu);
232+ err = update_xoff_threshold(port_buffer, xoff, max_mtu, port_buff_cell_sz);
229233 if (err)
230234 return err;
231235
@@ -262,6 +266,7 @@ int mlx5e_port_manual_buffer_config(struct mlx5e_priv *priv, · 30 unmodified lines
262266 u32 *buffer_size,
263267 u8 *prio2buffer)
264268 {
269+ u16 port_buff_cell_sz = priv->dcbx.port_buff_cell_sz;
265270 struct mlx5e_port_buffer port_buffer;
266271 u32 xoff = calculate_xoff(priv, mtu);
267272 bool update_prio2buffer = false;
@@ -282,7 +287,7 @@ int mlx5e_port_manual_buffer_config(struct mlx5e_priv *priv, · 14 unmodified lines
282287
283288 if (change & MLX5E_PORT_BUFFER_CABLE_LEN) {
284289 update_buffer = true;
285− err = update_xoff_threshold(&port_buffer, xoff, max_mtu);
290+ err = update_xoff_threshold(&port_buffer, xoff, max_mtu, port_buff_cell_sz);
286291 if (err)
287292 return err;
288293 }
@@ -292,7 +297,7 @@ int mlx5e_port_manual_buffer_config(struct mlx5e_priv *priv, · 3 unmodified lines
292297 if (err)
293298 return err;
294299
295− err = update_buffer_lossy(max_mtu, pfc->pfc_en, buffer, xoff,
300+ err = update_buffer_lossy(max_mtu, pfc->pfc_en, buffer, xoff, port_buff_cell_sz,
296301 &port_buffer, &update_buffer);
297302 if (err)
298303 return err;
@@ -304,7 +309,7 @@ int mlx5e_port_manual_buffer_config(struct mlx5e_priv *priv, · 5 unmodified lines
304309 if (err)
305310 return err;
306311
307− err = update_buffer_lossy(max_mtu, curr_pfc_en, prio2buffer,
312+ err = update_buffer_lossy(max_mtu, curr_pfc_en, prio2buffer, port_buff_cell_sz,
308313 xoff, &port_buffer, &update_buffer);
309314 if (err)
310315 return err;
@@ -329,7 +334,7 @@ int mlx5e_port_manual_buffer_config(struct mlx5e_priv *priv, · 18 unmodified lines
329334 return -EINVAL;
330335
331336 update_buffer = true;
332− err = update_xoff_threshold(&port_buffer, xoff, max_mtu);
337+ err = update_xoff_threshold(&port_buffer, xoff, max_mtu, port_buff_cell_sz);
333338 if (err)
334339 return err;
335340 }
@@ -337,7 +342,7 @@ int mlx5e_port_manual_buffer_config(struct mlx5e_priv *priv, · 1 unmodified line
337342 /* Need to update buffer configuration if xoff value is changed */
338343 if (!update_buffer && xoff != priv->dcbx.xoff) {
339344 update_buffer = true;
340− err = update_xoff_threshold(&port_buffer, xoff, max_mtu);
345+ err = update_xoff_threshold(&port_buffer, xoff, max_mtu, port_buff_cell_sz);
341346 if (err)
342347 return err;
343348 }
drivers/net/ethernet/mellanox/mlx5/core/en/port_buffer.h+0−1
@@ -36,7 +36,6 @@ · 35 unmodified lines
3636 #include "port.h"
3737
3838 #define MLX5E_MAX_BUFFER 8
39−#define MLX5E_BUFFER_CELL_SHIFT 7
4039 #define MLX5E_DEFAULT_CABLE_LEN 7 /* 7 meters */
4140
4241 #define MLX5_BUFFER_SUPPORTED(mdev) (MLX5_CAP_GEN(mdev, pcam_reg) && \
drivers/net/ethernet/mellanox/mlx5/core/en/tc_ct.c+1−0
@@ -1097,6 +1097,7 @@ mlx5_tc_ct_flush_ft_entry(void *ptr, void *arg) · 1096 unmodified lines
10971097 struct mlx5_ct_entry *entry = ptr;
10981098
10991099 mlx5_tc_ct_entry_del_rules(ct_priv, entry);
1100+ kfree(entry);
11001101 }
11011102
11021103 static void
drivers/net/ethernet/mellanox/mlx5/core/en_dcbnl.c+19−0
@@ -1217,6 +1217,24 @@ static int mlx5e_trust_initialize(struct mlx5e_priv *priv) · 1216 unmodified lines
12171217 return 0;
12181218 }
12191219
1220+#define MLX5E_BUFFER_CELL_SHIFT 7
1221+
1222+static u16 mlx5e_query_port_buffers_cell_size(struct mlx5e_priv *priv)
1223+{
1224+ struct mlx5_core_dev *mdev = priv->mdev;
1225+ u32 out[MLX5_ST_SZ_DW(sbcam_reg)] = {};
1226+ u32 in[MLX5_ST_SZ_DW(sbcam_reg)] = {};
1227+
1228+ if (!MLX5_CAP_GEN(mdev, sbcam_reg))
1229+ return (1 << MLX5E_BUFFER_CELL_SHIFT);
1230+
1231+ if (mlx5_core_access_reg(mdev, in, sizeof(in), out, sizeof(out),
1232+ MLX5_REG_SBCAM, 0, 0))
1233+ return (1 << MLX5E_BUFFER_CELL_SHIFT);
1234+
1235+ return MLX5_GET(sbcam_reg, out, cap_cell_size);
1236+}
1237+
12201238 void mlx5e_dcbnl_initialize(struct mlx5e_priv *priv)
12211239 {
12221240 struct mlx5e_dcbx *dcbx = &priv->dcbx;
@@ -1234,6 +1252,7 @@ void mlx5e_dcbnl_initialize(struct mlx5e_priv *priv) · 11 unmodified lines
12341252 if (priv->dcbx.mode == MLX5E_DCBX_PARAM_VER_OPER_HOST)
12351253 priv->dcbx.cap |= DCB_CAP_DCBX_HOST;
12361254
1255+ priv->dcbx.port_buff_cell_sz = mlx5e_query_port_buffers_cell_size(priv);
12371256 priv->dcbx.manual_buffer = false;
12381257 priv->dcbx.cable_len = MLX5E_DEFAULT_CABLE_LEN;
12391258
drivers/net/ethernet/mellanox/mlx5/core/en_ethtool.c+4−4
@@ -200,7 +200,7 @@ static void mlx5e_ethtool_get_speed_arr(struct mlx5_core_dev *mdev, · 199 unmodified lines
200200 struct ptys2ethtool_config **arr,
201201 u32 *size)
202202 {
203− bool ext = MLX5_CAP_PCAM_FEATURE(mdev, ptys_extended_ethernet);
203+ bool ext = mlx5e_ptys_ext_supported(mdev);
204204
205205 *arr = ext ? ptys2ext_ethtool_table : ptys2legacy_ethtool_table;
206206 *size = ext ? ARRAY_SIZE(ptys2ext_ethtool_table) :
@@ -883,7 +883,7 @@ static void get_lp_advertising(struct mlx5_core_dev *mdev, u32 eth_proto_lp, · 676 unmodified lines
883883 struct ethtool_link_ksettings *link_ksettings)
884884 {
885885 unsigned long *lp_advertising = link_ksettings->link_modes.lp_advertising;
886− bool ext = MLX5_CAP_PCAM_FEATURE(mdev, ptys_extended_ethernet);
886+ bool ext = mlx5e_ptys_ext_supported(mdev);
887887
888888 ptys2ethtool_adver_link(lp_advertising, eth_proto_lp, ext);
889889 }
@@ -913,7 +913,7 @@ int mlx5e_ethtool_get_link_ksettings(struct mlx5e_priv *priv, · 23 unmodified lines
913913 __func__, err);
914914 goto err_query_regs;
915915 }
916− ext = MLX5_CAP_PCAM_FEATURE(mdev, ptys_extended_ethernet);
916+ ext = !!MLX5_GET_ETH_PROTO(ptys_reg, out, true, eth_proto_capability);
917917 eth_proto_cap = MLX5_GET_ETH_PROTO(ptys_reg, out, ext,
918918 eth_proto_capability);
919919 eth_proto_admin = MLX5_GET_ETH_PROTO(ptys_reg, out, ext,
@@ -1066,7 +1066,7 @@ int mlx5e_ethtool_set_link_ksettings(struct mlx5e_priv *priv, · 146 unmodified lines
10661066 autoneg = link_ksettings->base.autoneg;
10671067 speed = link_ksettings->base.speed;
10681068
1069− ext_supported = MLX5_CAP_PCAM_FEATURE(mdev, ptys_extended_ethernet);
1069+ ext_supported = mlx5e_ptys_ext_supported(mdev);
10701070 ext = ext_requested(autoneg, adver, ext_supported);
10711071 if (!ext_supported && ext)
10721072 return -EOPNOTSUPP;
drivers/net/ethernet/mellanox/mlx5/core/en_main.c+8−7
@@ -3104,9 +3104,6 @@ int mlx5e_open(struct net_device *netdev) · 3103 unmodified lines
31043104 mlx5_set_port_admin_status(priv->mdev, MLX5_PORT_UP);
31053105 mutex_unlock(&priv->state_lock);
31063106
3107− if (mlx5_vxlan_allowed(priv->mdev->vxlan))
3108− udp_tunnel_get_rx_info(netdev);
3109−
31103107 return err;
31113108 }
31123109
@@ -5121,6 +5118,10 @@ static int mlx5e_init_nic_rx(struct mlx5e_priv *priv) · 2008 unmodified lines
51215118 if (err)
51225119 goto err_destroy_flow_steering;
51235120
5121+#ifdef CONFIG_MLX5_EN_ARFS
5122+ priv->netdev->rx_cpu_rmap = mlx5_eq_table_get_rmap(priv->mdev);
5123+#endif
5124+
51245125 return 0;
51255126
51265127 err_destroy_flow_steering:
@@ -5202,6 +5203,8 @@ static void mlx5e_nic_enable(struct mlx5e_priv *priv) · 75 unmodified lines
52025203 rtnl_lock();
52035204 if (netif_running(netdev))
52045205 mlx5e_open(netdev);
5206+ if (mlx5_vxlan_allowed(priv->mdev->vxlan))
5207+ udp_tunnel_get_rx_info(netdev);
52055208 netif_device_attach(netdev);
52065209 rtnl_unlock();
52075210 }
@@ -5216,6 +5219,8 @@ static void mlx5e_nic_disable(struct mlx5e_priv *priv) · 8 unmodified lines
52165219 rtnl_lock();
52175220 if (netif_running(priv->netdev))
52185221 mlx5e_close(priv->netdev);
5222+ if (mlx5_vxlan_allowed(priv->mdev->vxlan))
5223+ udp_tunnel_drop_rx_info(priv->netdev);
52195224 netif_device_detach(priv->netdev);
52205225 rtnl_unlock();
52215226
@@ -5288,10 +5293,6 @@ int mlx5e_netdev_init(struct net_device *netdev, · 66 unmodified lines
52885293 /* netdev init */
52895294 netif_carrier_off(netdev);
52905295
5291−#ifdef CONFIG_MLX5_EN_ARFS
5292− netdev->rx_cpu_rmap = mlx5_eq_table_get_rmap(mdev);
5293−#endif
5294−
52955296 return 0;
52965297
52975298 err_free_cpumask:
drivers/net/ethernet/mellanox/mlx5/core/en_tc.c+9−5
@@ -4670,9 +4670,10 @@ static bool is_flow_rule_duplicate_allowed(struct net_device *dev, · 4669 unmodified lines
46704670 struct mlx5e_rep_priv *rpriv)
46714671 {
46724672 /* Offloaded flow rule is allowed to duplicate on non-uplink representor
4673− * sharing tc block with other slaves of a lag device.
4673+ * sharing tc block with other slaves of a lag device. Rpriv can be NULL if this
4674+ * function is called from NIC mode.
46744675 */
4675− return netif_is_lag_port(dev) && rpriv->rep->vport != MLX5_VPORT_UPLINK;
4676+ return netif_is_lag_port(dev) && rpriv && rpriv->rep->vport != MLX5_VPORT_UPLINK;
46764677 }
46774678
46784679 int mlx5e_configure_flower(struct net_device *dev, struct mlx5e_priv *priv,
@@ -4686,13 +4687,12 @@ int mlx5e_configure_flower(struct net_device *dev, struct mlx5e_priv *priv, · 7 unmodified lines
46864687
46874688 rcu_read_lock();
46884689 flow = rhashtable_lookup(tc_ht, &f->cookie, tc_ht_params);
4689− rcu_read_unlock();
46904690 if (flow) {
46914691 /* Same flow rule offloaded to non-uplink representor sharing tc block,
46924692 * just return 0.
46934693 */
46944694 if (is_flow_rule_duplicate_allowed(dev, rpriv) && flow->orig_dev != dev)
4695− goto out;
4695+ goto rcu_unlock;
46964696
46974697 NL_SET_ERR_MSG_MOD(extack,
46984698 "flow cookie already exists, ignoring");
@@ -4700,8 +4700,12 @@ int mlx5e_configure_flower(struct net_device *dev, struct mlx5e_priv *priv, · 1 unmodified line
47004700 "flow cookie %lx already exists, ignoring\n",
47014701 f->cookie);
47024702 err = -EEXIST;
4703− goto out;
4703+ goto rcu_unlock;
47044704 }
4705+rcu_unlock:
4706+ rcu_read_unlock();
4707+ if (flow)
4708+ goto out;
47054709
47064710 trace_mlx5e_configure_flower(f);
47074711 err = mlx5e_tc_add_flow(priv, f, flags, dev, &flow);
drivers/net/ethernet/mellanox/mlx5/core/esw/acl/ingress_lgcy.c+0−1
@@ -217,7 +217,6 @@ int esw_acl_ingress_lgcy_setup(struct mlx5_eswitch *esw, · 216 unmodified lines
217217 }
218218
219219 /* Create ingress allow rule */
220− memset(spec, 0, sizeof(*spec));
221220 spec->match_criteria_enable = MLX5_MATCH_OUTER_HEADERS;
222221 flow_act.action = MLX5_FLOW_CONTEXT_ACTION_ALLOW;
223222 vport->ingress.allow_rule = mlx5_add_flow_rules(vport->ingress.acl, spec,
drivers/net/ethernet/mellanox/mlx5/core/port.c+77−16
@@ -293,7 +293,40 @@ static int mlx5_query_module_num(struct mlx5_core_dev *dev, int *module_num) · 292 unmodified lines
293293 return 0;
294294 }
295295
296−static int mlx5_eeprom_page(int offset)
296+static int mlx5_query_module_id(struct mlx5_core_dev *dev, int module_num,
297+ u8 *module_id)
298+{
299+ u32 in[MLX5_ST_SZ_DW(mcia_reg)] = {};
300+ u32 out[MLX5_ST_SZ_DW(mcia_reg)];
301+ int err, status;
302+ u8 *ptr;
303+
304+ MLX5_SET(mcia_reg, in, i2c_device_address, MLX5_I2C_ADDR_LOW);
305+ MLX5_SET(mcia_reg, in, module, module_num);
306+ MLX5_SET(mcia_reg, in, device_address, 0);
307+ MLX5_SET(mcia_reg, in, page_number, 0);
308+ MLX5_SET(mcia_reg, in, size, 1);
309+ MLX5_SET(mcia_reg, in, l, 0);
310+
311+ err = mlx5_core_access_reg(dev, in, sizeof(in), out,
312+ sizeof(out), MLX5_REG_MCIA, 0, 0);
313+ if (err)
314+ return err;
315+
316+ status = MLX5_GET(mcia_reg, out, status);
317+ if (status) {
318+ mlx5_core_err(dev, "query_mcia_reg failed: status: 0x%x\n",
319+ status);
320+ return -EIO;
321+ }
322+ ptr = MLX5_ADDR_OF(mcia_reg, out, dword_0);
323+
324+ *module_id = ptr[0];
325+
326+ return 0;
327+}
328+
329+static int mlx5_qsfp_eeprom_page(u16 offset)
297330 {
298331 if (offset < MLX5_EEPROM_PAGE_LENGTH)
299332 /* Addresses between 0-255 - page 00 */
@@ -307,7 +340,7 @@ static int mlx5_eeprom_page(int offset) · 7 unmodified lines
307340 MLX5_EEPROM_HIGH_PAGE_LENGTH);
308341 }
309342
310−static int mlx5_eeprom_high_page_offset(int page_num)
343+static int mlx5_qsfp_eeprom_high_page_offset(int page_num)
311344 {
312345 if (!page_num) /* Page 0 always start from low page */
313346 return 0;
@@ -316,35 +349,62 @@ static int mlx5_eeprom_high_page_offset(int page_num) · 2 unmodified lines
316349 return page_num * MLX5_EEPROM_HIGH_PAGE_LENGTH;
317350 }
318351
352+static void mlx5_qsfp_eeprom_params_set(u16 *i2c_addr, int *page_num, u16 *offset)
353+{
354+ *i2c_addr = MLX5_I2C_ADDR_LOW;
355+ *page_num = mlx5_qsfp_eeprom_page(*offset);
356+ *offset -= mlx5_qsfp_eeprom_high_page_offset(*page_num);
357+}
358+
359+static void mlx5_sfp_eeprom_params_set(u16 *i2c_addr, int *page_num, u16 *offset)
360+{
361+ *i2c_addr = MLX5_I2C_ADDR_LOW;
362+ *page_num = 0;
363+
364+ if (*offset < MLX5_EEPROM_PAGE_LENGTH)
365+ return;
366+
367+ *i2c_addr = MLX5_I2C_ADDR_HIGH;
368+ *offset -= MLX5_EEPROM_PAGE_LENGTH;
369+}
370+
319371 int mlx5_query_module_eeprom(struct mlx5_core_dev *dev,
320372 u16 offset, u16 size, u8 *data)
321373 {
322− int module_num, page_num, status, err;
374+ int module_num, status, err, page_num = 0;
375+ u32 in[MLX5_ST_SZ_DW(mcia_reg)] = {};
323376 u32 out[MLX5_ST_SZ_DW(mcia_reg)];
324− u32 in[MLX5_ST_SZ_DW(mcia_reg)];
325− u16 i2c_addr;
326− void *ptr = MLX5_ADDR_OF(mcia_reg, out, dword_0);
377+ u16 i2c_addr = 0;
378+ u8 module_id;
379+ void *ptr;
327380
328381 err = mlx5_query_module_num(dev, &module_num);
329382 if (err)
330383 return err;
331384
332− memset(in, 0, sizeof(in));
333− size = min_t(int, size, MLX5_EEPROM_MAX_BYTES);
334−
335− /* Get the page number related to the given offset */
336− page_num = mlx5_eeprom_page(offset);
385+ err = mlx5_query_module_id(dev, module_num, &module_id);
386+ if (err)
387+ return err;
337388
338− /* Set the right offset according to the page number,
339− * For page_num > 0, relative offset is always >= 128 (high page).
340− */
341− offset -= mlx5_eeprom_high_page_offset(page_num);
389+ switch (module_id) {
390+ case MLX5_MODULE_ID_SFP:
391+ mlx5_sfp_eeprom_params_set(&i2c_addr, &page_num, &offset);
392+ break;
393+ case MLX5_MODULE_ID_QSFP:
394+ case MLX5_MODULE_ID_QSFP_PLUS:
395+ case MLX5_MODULE_ID_QSFP28:
396+ mlx5_qsfp_eeprom_params_set(&i2c_addr, &page_num, &offset);
397+ break;
398+ default:
399+ mlx5_core_err(dev, "Module ID not recognized: 0x%x\n", module_id);
400+ return -EINVAL;
401+ }
342402
343403 if (offset + size > MLX5_EEPROM_PAGE_LENGTH)
344404 /* Cross pages read, read until offset 256 in low page */
345405 size -= offset + size - MLX5_EEPROM_PAGE_LENGTH;
346406
347− i2c_addr = MLX5_I2C_ADDR_LOW;
407+ size = min_t(int, size, MLX5_EEPROM_MAX_BYTES);
348408
349409 MLX5_SET(mcia_reg, in, l, 0);
350410 MLX5_SET(mcia_reg, in, module, module_num);
@@ -365,6 +425,7 @@ int mlx5_query_module_eeprom(struct mlx5_core_dev *dev, · 14 unmodified lines
365425 return -EIO;
366426 }
367427
428+ ptr = MLX5_ADDR_OF(mcia_reg, out, dword_0);
368429 memcpy(data, ptr, size);
369430
370431 return size;
include/linux/mlx5/driver.h+1−0
@@ -147,6 +147,7 @@ enum { · 146 unmodified lines
147147 MLX5_REG_MCDA = 0x9063,
148148 MLX5_REG_MCAM = 0x907f,
149149 MLX5_REG_MIRC = 0x9162,
150+ MLX5_REG_SBCAM = 0xB01F,
150151 MLX5_REG_RESOURCE_DUMP = 0xC000,
151152 };
152153
include/linux/mlx5/mlx5_ifc.h+28−0
@@ -9960,6 +9960,34 @@ struct mlx5_ifc_pptb_reg_bits { · 9959 unmodified lines
99609960 u8 untagged_buff[0x4];
99619961 };
99629962
9963+struct mlx5_ifc_sbcam_reg_bits {
9964+ u8 reserved_at_0[0x8];
9965+ u8 feature_group[0x8];
9966+ u8 reserved_at_10[0x8];
9967+ u8 access_reg_group[0x8];
9968+
9969+ u8 reserved_at_20[0x20];
9970+
9971+ u8 sb_access_reg_cap_mask[4][0x20];
9972+
9973+ u8 reserved_at_c0[0x80];
9974+
9975+ u8 sb_feature_cap_mask[4][0x20];
9976+
9977+ u8 reserved_at_1c0[0x40];
9978+
9979+ u8 cap_total_buffer_size[0x20];
9980+
9981+ u8 cap_cell_size[0x10];
9982+ u8 cap_max_pg_buffers[0x8];
9983+ u8 cap_num_pool_supported[0x8];
9984+
9985+ u8 reserved_at_240[0x8];
9986+ u8 cap_sbsr_stat_size[0x8];
9987+ u8 cap_max_tclass_data[0x8];
9988+ u8 cap_max_cpu_ingress_tclass_sb[0x8];
9989+};
9990+
99639991 struct mlx5_ifc_pbmc_reg_bits {
99649992 u8 reserved_at_0[0x8];
99659993 u8 local_port[0x8];

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t