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
29 bool manual_buffer;29 bool manual_buffer;
30 u32 cable_len;30 u32 cable_len;
31 u32 xoff;31 u32 xoff;
32 u16 port_buff_cell_sz;
32};33};
33 34
34#define MLX5E_MAX_DSCP (64)35#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
78 [MLX5E_400GAUI_8] = 400000,78 [MLX5E_400GAUI_8] = 400000,
79};79};
80 80
81bool 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
81static void mlx5e_port_get_speed_arr(struct mlx5_core_dev *mdev,96static void mlx5e_port_get_speed_arr(struct mlx5_core_dev *mdev,
82 const u32 **arr, u32 *size,97 const u32 **arr, u32 *size,
83 bool force_legacy)98 bool force_legacy)
84{99{
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);
86 101
87 *size = ext ? ARRAY_SIZE(mlx5e_ext_link_speed) :102 *size = ext ? ARRAY_SIZE(mlx5e_ext_link_speed) :
88 ARRAY_SIZE(mlx5e_link_speed);103 ARRAY_SIZE(mlx5e_link_speed);
@@ -177,7 +192,7 @@ int mlx5e_port_linkspeed(struct mlx5_core_dev *mdev, u32 *speed) · 88 unmodified lines
177 bool ext;192 bool ext;
178 int err;193 int err;
179 194
180 ext = MLX5_CAP_PCAM_FEATURE(mdev, ptys_extended_ethernet);195 ext = mlx5e_ptys_ext_supported(mdev);
181 err = mlx5_port_query_eth_proto(mdev, 1, ext, &eproto);196 err = mlx5_port_query_eth_proto(mdev, 1, ext, &eproto);
182 if (err)197 if (err)
183 goto out;198 goto out;
@@ -205,7 +220,7 @@ int mlx5e_port_max_linkspeed(struct mlx5_core_dev *mdev, u32 *speed) · 21 unmodified lines
205 int err;220 int err;
206 int i;221 int i;
207 222
208 ext = MLX5_CAP_PCAM_FEATURE(mdev, ptys_extended_ethernet);223 ext = mlx5e_ptys_ext_supported(mdev);
209 err = mlx5_port_query_eth_proto(mdev, 1, ext, &eproto);224 err = mlx5_port_query_eth_proto(mdev, 1, ext, &eproto);
210 if (err)225 if (err)
211 return err;226 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
54int mlx5e_port_max_linkspeed(struct mlx5_core_dev *mdev, u32 *speed);54int mlx5e_port_max_linkspeed(struct mlx5_core_dev *mdev, u32 *speed);
55u32 mlx5e_port_speed2linkmodes(struct mlx5_core_dev *mdev, u32 speed,55u32 mlx5e_port_speed2linkmodes(struct mlx5_core_dev *mdev, u32 speed,
56 bool force_legacy);56 bool force_legacy);
57 57bool mlx5e_ptys_ext_supported(struct mlx5_core_dev *mdev);
58int mlx5e_port_query_pbmc(struct mlx5_core_dev *mdev, void *out);58int mlx5e_port_query_pbmc(struct mlx5_core_dev *mdev, void *out);
59int mlx5e_port_set_pbmc(struct mlx5_core_dev *mdev, void *in);59int mlx5e_port_set_pbmc(struct mlx5_core_dev *mdev, void *in);
60int mlx5e_port_query_priority2buffer(struct mlx5_core_dev *mdev, u8 *buffer);60int 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
34int mlx5e_port_query_buffer(struct mlx5e_priv *priv,34int mlx5e_port_query_buffer(struct mlx5e_priv *priv,
35 struct mlx5e_port_buffer *port_buffer)35 struct mlx5e_port_buffer *port_buffer)
36{36{
37 u16 port_buff_cell_sz = priv->dcbx.port_buff_cell_sz;
37 struct mlx5_core_dev *mdev = priv->mdev;38 struct mlx5_core_dev *mdev = priv->mdev;
38 int sz = MLX5_ST_SZ_BYTES(pbmc_reg);39 int sz = MLX5_ST_SZ_BYTES(pbmc_reg);
39 u32 total_used = 0;40 u32 total_used = 0;
@@ -57,11 +58,11 @@ int mlx5e_port_query_buffer(struct mlx5e_priv *priv, · 17 unmodified lines
57 port_buffer->buffer[i].epsb =58 port_buffer->buffer[i].epsb =
58 MLX5_GET(bufferx_reg, buffer, epsb);59 MLX5_GET(bufferx_reg, buffer, epsb);
59 port_buffer->buffer[i].size =60 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;
61 port_buffer->buffer[i].xon =62 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;
63 port_buffer->buffer[i].xoff =64 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;
65 total_used += port_buffer->buffer[i].size;66 total_used += port_buffer->buffer[i].size;
66 67
67 mlx5e_dbg(HW, priv, "buffer %d: size=%d, xon=%d, xoff=%d, epsb=%d, lossy=%d\n", i,68 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
73 }74 }
74 75
75 port_buffer->port_buffer_size =76 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;
77 port_buffer->spare_buffer_size =78 port_buffer->spare_buffer_size =
78 port_buffer->port_buffer_size - total_used;79 port_buffer->port_buffer_size - total_used;
79 80
@@ -88,9 +89,9 @@ out: · 8 unmodified lines
88static int port_set_buffer(struct mlx5e_priv *priv,89static int port_set_buffer(struct mlx5e_priv *priv,
89 struct mlx5e_port_buffer *port_buffer)90 struct mlx5e_port_buffer *port_buffer)
90{91{
92 u16 port_buff_cell_sz = priv->dcbx.port_buff_cell_sz;
91 struct mlx5_core_dev *mdev = priv->mdev;93 struct mlx5_core_dev *mdev = priv->mdev;
92 int sz = MLX5_ST_SZ_BYTES(pbmc_reg);94 int sz = MLX5_ST_SZ_BYTES(pbmc_reg);
93 void *buffer;
94 void *in;95 void *in;
95 int err;96 int err;
96 int i;97 int i;
@@ -104,16 +105,18 @@ static int port_set_buffer(struct mlx5e_priv *priv, · 7 unmodified lines
104 goto out;105 goto out;
105 106
106 for (i = 0; i < MLX5E_MAX_BUFFER; i++) {107 for (i = 0; i < MLX5E_MAX_BUFFER; i++) {
107 buffer = MLX5_ADDR_OF(pbmc_reg, in, buffer[i]);108 void *buffer = MLX5_ADDR_OF(pbmc_reg, in, buffer[i]);
108 109 u64 size = port_buffer->buffer[i].size;
109 MLX5_SET(bufferx_reg, buffer, size,110 u64 xoff = port_buffer->buffer[i].xoff;
110 port_buffer->buffer[i].size >> MLX5E_BUFFER_CELL_SHIFT);111 u64 xon = port_buffer->buffer[i].xon;
111 MLX5_SET(bufferx_reg, buffer, lossy,112
112 port_buffer->buffer[i].lossy);113 do_div(size, port_buff_cell_sz);
113 MLX5_SET(bufferx_reg, buffer, xoff_threshold,114 do_div(xoff, port_buff_cell_sz);
114 port_buffer->buffer[i].xoff >> MLX5E_BUFFER_CELL_SHIFT);115 do_div(xon, port_buff_cell_sz);
115 MLX5_SET(bufferx_reg, buffer, xon_threshold,116 MLX5_SET(bufferx_reg, buffer, size, size);
116 port_buffer->buffer[i].xon >> MLX5E_BUFFER_CELL_SHIFT);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);
117 }120 }
118 121
119 err = mlx5e_port_set_pbmc(mdev, in);122 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
143}146}
144 147
145static int update_xoff_threshold(struct mlx5e_port_buffer *port_buffer,148static 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)
147{150{
148 int i;151 int i;
149 152
@@ -155,7 +158,7 @@ static int update_xoff_threshold(struct mlx5e_port_buffer *port_buffer, · 5 unmodified lines
155 }158 }
156 159
157 if (port_buffer->buffer[i].size <160 if (port_buffer->buffer[i].size <
158 (xoff + max_mtu + (1 << MLX5E_BUFFER_CELL_SHIFT))) {161 (xoff + max_mtu + port_buff_cell_sz)) {
159 pr_err("buffer_size[%d]=%d is not enough for lossless buffer\n",162 pr_err("buffer_size[%d]=%d is not enough for lossless buffer\n",
160 i, port_buffer->buffer[i].size);163 i, port_buffer->buffer[i].size);
161 return -ENOMEM;164 return -ENOMEM;
@@ -175,6 +178,7 @@ static int update_xoff_threshold(struct mlx5e_port_buffer *port_buffer, · 13 unmodified lines
175 * @pfc_en: <input> current pfc configuration178 * @pfc_en: <input> current pfc configuration
176 * @buffer: <input> current prio to buffer mapping179 * @buffer: <input> current prio to buffer mapping
177 * @xoff: <input> xoff value180 * @xoff: <input> xoff value
181 * @port_buff_cell_sz: <input> port buffer cell_size
178 * @port_buffer: <output> port receive buffer configuration182 * @port_buffer: <output> port receive buffer configuration
179 * @change: <output>183 * @change: <output>
180 *184 *
@@ -189,7 +193,7 @@ static int update_xoff_threshold(struct mlx5e_port_buffer *port_buffer, · 8 unmodified lines
189 * sets change to true if buffer configuration was modified.193 * sets change to true if buffer configuration was modified.
190 */194 */
191static int update_buffer_lossy(unsigned int max_mtu,195static 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,
193 struct mlx5e_port_buffer *port_buffer,197 struct mlx5e_port_buffer *port_buffer,
194 bool *change)198 bool *change)
195{199{
@@ -225,7 +229,7 @@ static int update_buffer_lossy(unsigned int max_mtu, · 29 unmodified lines
225 }229 }
226 230
227 if (changed) {231 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);
229 if (err)233 if (err)
230 return err;234 return err;
231 235
@@ -262,6 +266,7 @@ int mlx5e_port_manual_buffer_config(struct mlx5e_priv *priv, · 30 unmodified lines
262 u32 *buffer_size,266 u32 *buffer_size,
263 u8 *prio2buffer)267 u8 *prio2buffer)
264{268{
269 u16 port_buff_cell_sz = priv->dcbx.port_buff_cell_sz;
265 struct mlx5e_port_buffer port_buffer;270 struct mlx5e_port_buffer port_buffer;
266 u32 xoff = calculate_xoff(priv, mtu);271 u32 xoff = calculate_xoff(priv, mtu);
267 bool update_prio2buffer = false;272 bool update_prio2buffer = false;
@@ -282,7 +287,7 @@ int mlx5e_port_manual_buffer_config(struct mlx5e_priv *priv, · 14 unmodified lines
282 287
283 if (change & MLX5E_PORT_BUFFER_CABLE_LEN) {288 if (change & MLX5E_PORT_BUFFER_CABLE_LEN) {
284 update_buffer = true;289 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);
286 if (err)291 if (err)
287 return err;292 return err;
288 }293 }
@@ -292,7 +297,7 @@ int mlx5e_port_manual_buffer_config(struct mlx5e_priv *priv, · 3 unmodified lines
292 if (err)297 if (err)
293 return err;298 return err;
294 299
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,
296 &port_buffer, &update_buffer);301 &port_buffer, &update_buffer);
297 if (err)302 if (err)
298 return err;303 return err;
@@ -304,7 +309,7 @@ int mlx5e_port_manual_buffer_config(struct mlx5e_priv *priv, · 5 unmodified lines
304 if (err)309 if (err)
305 return err;310 return err;
306 311
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,
308 xoff, &port_buffer, &update_buffer);313 xoff, &port_buffer, &update_buffer);
309 if (err)314 if (err)
310 return err;315 return err;
@@ -329,7 +334,7 @@ int mlx5e_port_manual_buffer_config(struct mlx5e_priv *priv, · 18 unmodified lines
329 return -EINVAL;334 return -EINVAL;
330 335
331 update_buffer = true;336 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);
333 if (err)338 if (err)
334 return err;339 return err;
335 }340 }
@@ -337,7 +342,7 @@ int mlx5e_port_manual_buffer_config(struct mlx5e_priv *priv, · 1 unmodified line
337 /* Need to update buffer configuration if xoff value is changed */342 /* Need to update buffer configuration if xoff value is changed */
338 if (!update_buffer && xoff != priv->dcbx.xoff) {343 if (!update_buffer && xoff != priv->dcbx.xoff) {
339 update_buffer = true;344 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);
341 if (err)346 if (err)
342 return err;347 return err;
343 }348 }
drivers/net/ethernet/mellanox/mlx5/core/en/port_buffer.h+0−1
@@ -36,7 +36,6 @@ · 35 unmodified lines
36#include "port.h"36#include "port.h"
37 37
38#define MLX5E_MAX_BUFFER 838#define MLX5E_MAX_BUFFER 8
39#define MLX5E_BUFFER_CELL_SHIFT 7
40#define MLX5E_DEFAULT_CABLE_LEN 7 /* 7 meters */39#define MLX5E_DEFAULT_CABLE_LEN 7 /* 7 meters */
41 40
42#define MLX5_BUFFER_SUPPORTED(mdev) (MLX5_CAP_GEN(mdev, pcam_reg) && \41#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
1097 struct mlx5_ct_entry *entry = ptr;1097 struct mlx5_ct_entry *entry = ptr;
1098 1098
1099 mlx5_tc_ct_entry_del_rules(ct_priv, entry);1099 mlx5_tc_ct_entry_del_rules(ct_priv, entry);
1100 kfree(entry);
1100}1101}
1101 1102
1102static void1103static 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
1217 return 0;1217 return 0;
1218}1218}
1219 1219
1220#define MLX5E_BUFFER_CELL_SHIFT 7
1221
1222static 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
1220void mlx5e_dcbnl_initialize(struct mlx5e_priv *priv)1238void mlx5e_dcbnl_initialize(struct mlx5e_priv *priv)
1221{1239{
1222 struct mlx5e_dcbx *dcbx = &priv->dcbx;1240 struct mlx5e_dcbx *dcbx = &priv->dcbx;
@@ -1234,6 +1252,7 @@ void mlx5e_dcbnl_initialize(struct mlx5e_priv *priv) · 11 unmodified lines
1234 if (priv->dcbx.mode == MLX5E_DCBX_PARAM_VER_OPER_HOST)1252 if (priv->dcbx.mode == MLX5E_DCBX_PARAM_VER_OPER_HOST)
1235 priv->dcbx.cap |= DCB_CAP_DCBX_HOST;1253 priv->dcbx.cap |= DCB_CAP_DCBX_HOST;
1236 1254
1255 priv->dcbx.port_buff_cell_sz = mlx5e_query_port_buffers_cell_size(priv);
1237 priv->dcbx.manual_buffer = false;1256 priv->dcbx.manual_buffer = false;
1238 priv->dcbx.cable_len = MLX5E_DEFAULT_CABLE_LEN;1257 priv->dcbx.cable_len = MLX5E_DEFAULT_CABLE_LEN;
1239 1258
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
200 struct ptys2ethtool_config **arr,200 struct ptys2ethtool_config **arr,
201 u32 *size)201 u32 *size)
202{202{
203 bool ext = MLX5_CAP_PCAM_FEATURE(mdev, ptys_extended_ethernet);203 bool ext = mlx5e_ptys_ext_supported(mdev);
204 204
205 *arr = ext ? ptys2ext_ethtool_table : ptys2legacy_ethtool_table;205 *arr = ext ? ptys2ext_ethtool_table : ptys2legacy_ethtool_table;
206 *size = ext ? ARRAY_SIZE(ptys2ext_ethtool_table) :206 *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
883 struct ethtool_link_ksettings *link_ksettings)883 struct ethtool_link_ksettings *link_ksettings)
884{884{
885 unsigned long *lp_advertising = link_ksettings->link_modes.lp_advertising;885 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);
887 887
888 ptys2ethtool_adver_link(lp_advertising, eth_proto_lp, ext);888 ptys2ethtool_adver_link(lp_advertising, eth_proto_lp, ext);
889}889}
@@ -913,7 +913,7 @@ int mlx5e_ethtool_get_link_ksettings(struct mlx5e_priv *priv, · 23 unmodified lines
913 __func__, err);913 __func__, err);
914 goto err_query_regs;914 goto err_query_regs;
915 }915 }
916 ext = MLX5_CAP_PCAM_FEATURE(mdev, ptys_extended_ethernet);916 ext = !!MLX5_GET_ETH_PROTO(ptys_reg, out, true, eth_proto_capability);
917 eth_proto_cap = MLX5_GET_ETH_PROTO(ptys_reg, out, ext,917 eth_proto_cap = MLX5_GET_ETH_PROTO(ptys_reg, out, ext,
918 eth_proto_capability);918 eth_proto_capability);
919 eth_proto_admin = MLX5_GET_ETH_PROTO(ptys_reg, out, ext,919 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
1066 autoneg = link_ksettings->base.autoneg;1066 autoneg = link_ksettings->base.autoneg;
1067 speed = link_ksettings->base.speed;1067 speed = link_ksettings->base.speed;
1068 1068
1069 ext_supported = MLX5_CAP_PCAM_FEATURE(mdev, ptys_extended_ethernet);1069 ext_supported = mlx5e_ptys_ext_supported(mdev);
1070 ext = ext_requested(autoneg, adver, ext_supported);1070 ext = ext_requested(autoneg, adver, ext_supported);
1071 if (!ext_supported && ext)1071 if (!ext_supported && ext)
1072 return -EOPNOTSUPP;1072 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
3104 mlx5_set_port_admin_status(priv->mdev, MLX5_PORT_UP);3104 mlx5_set_port_admin_status(priv->mdev, MLX5_PORT_UP);
3105 mutex_unlock(&priv->state_lock);3105 mutex_unlock(&priv->state_lock);
3106 3106
3107 if (mlx5_vxlan_allowed(priv->mdev->vxlan))
3108 udp_tunnel_get_rx_info(netdev);
3109
3110 return err;3107 return err;
3111}3108}
3112 3109
@@ -5121,6 +5118,10 @@ static int mlx5e_init_nic_rx(struct mlx5e_priv *priv) · 2008 unmodified lines
5121 if (err)5118 if (err)
5122 goto err_destroy_flow_steering;5119 goto err_destroy_flow_steering;
5123 5120
5121#ifdef CONFIG_MLX5_EN_ARFS
5122 priv->netdev->rx_cpu_rmap = mlx5_eq_table_get_rmap(priv->mdev);
5123#endif
5124
5124 return 0;5125 return 0;
5125 5126
5126err_destroy_flow_steering:5127err_destroy_flow_steering:
@@ -5202,6 +5203,8 @@ static void mlx5e_nic_enable(struct mlx5e_priv *priv) · 75 unmodified lines
5202 rtnl_lock();5203 rtnl_lock();
5203 if (netif_running(netdev))5204 if (netif_running(netdev))
5204 mlx5e_open(netdev);5205 mlx5e_open(netdev);
5206 if (mlx5_vxlan_allowed(priv->mdev->vxlan))
5207 udp_tunnel_get_rx_info(netdev);
5205 netif_device_attach(netdev);5208 netif_device_attach(netdev);
5206 rtnl_unlock();5209 rtnl_unlock();
5207}5210}
@@ -5216,6 +5219,8 @@ static void mlx5e_nic_disable(struct mlx5e_priv *priv) · 8 unmodified lines
5216 rtnl_lock();5219 rtnl_lock();
5217 if (netif_running(priv->netdev))5220 if (netif_running(priv->netdev))
5218 mlx5e_close(priv->netdev);5221 mlx5e_close(priv->netdev);
5222 if (mlx5_vxlan_allowed(priv->mdev->vxlan))
5223 udp_tunnel_drop_rx_info(priv->netdev);
5219 netif_device_detach(priv->netdev);5224 netif_device_detach(priv->netdev);
5220 rtnl_unlock();5225 rtnl_unlock();
5221 5226
@@ -5288,10 +5293,6 @@ int mlx5e_netdev_init(struct net_device *netdev, · 66 unmodified lines
5288 /* netdev init */5293 /* netdev init */
5289 netif_carrier_off(netdev);5294 netif_carrier_off(netdev);
5290 5295
5291#ifdef CONFIG_MLX5_EN_ARFS
5292 netdev->rx_cpu_rmap = mlx5_eq_table_get_rmap(mdev);
5293#endif
5294
5295 return 0;5296 return 0;
5296 5297
5297err_free_cpumask:5298err_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
4670 struct mlx5e_rep_priv *rpriv)4670 struct mlx5e_rep_priv *rpriv)
4671{4671{
4672 /* Offloaded flow rule is allowed to duplicate on non-uplink representor4672 /* 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.
4674 */4675 */
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;
4676}4677}
4677 4678
4678int mlx5e_configure_flower(struct net_device *dev, struct mlx5e_priv *priv,4679int 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
4686 4687
4687 rcu_read_lock();4688 rcu_read_lock();
4688 flow = rhashtable_lookup(tc_ht, &f->cookie, tc_ht_params);4689 flow = rhashtable_lookup(tc_ht, &f->cookie, tc_ht_params);
4689 rcu_read_unlock();
4690 if (flow) {4690 if (flow) {
4691 /* Same flow rule offloaded to non-uplink representor sharing tc block,4691 /* Same flow rule offloaded to non-uplink representor sharing tc block,
4692 * just return 0.4692 * just return 0.
4693 */4693 */
4694 if (is_flow_rule_duplicate_allowed(dev, rpriv) && flow->orig_dev != dev)4694 if (is_flow_rule_duplicate_allowed(dev, rpriv) && flow->orig_dev != dev)
4695 goto out;4695 goto rcu_unlock;
4696 4696
4697 NL_SET_ERR_MSG_MOD(extack,4697 NL_SET_ERR_MSG_MOD(extack,
4698 "flow cookie already exists, ignoring");4698 "flow cookie already exists, ignoring");
@@ -4700,8 +4700,12 @@ int mlx5e_configure_flower(struct net_device *dev, struct mlx5e_priv *priv, · 1 unmodified line
4700 "flow cookie %lx already exists, ignoring\n",4700 "flow cookie %lx already exists, ignoring\n",
4701 f->cookie);4701 f->cookie);
4702 err = -EEXIST;4702 err = -EEXIST;
4703 goto out;4703 goto rcu_unlock;
4704 }4704 }
4705rcu_unlock:
4706 rcu_read_unlock();
4707 if (flow)
4708 goto out;
4705 4709
4706 trace_mlx5e_configure_flower(f);4710 trace_mlx5e_configure_flower(f);
4707 err = mlx5e_tc_add_flow(priv, f, flags, dev, &flow);4711 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
217 }217 }
218 218
219 /* Create ingress allow rule */219 /* Create ingress allow rule */
220 memset(spec, 0, sizeof(*spec));
221 spec->match_criteria_enable = MLX5_MATCH_OUTER_HEADERS;220 spec->match_criteria_enable = MLX5_MATCH_OUTER_HEADERS;
222 flow_act.action = MLX5_FLOW_CONTEXT_ACTION_ALLOW;221 flow_act.action = MLX5_FLOW_CONTEXT_ACTION_ALLOW;
223 vport->ingress.allow_rule = mlx5_add_flow_rules(vport->ingress.acl, spec,222 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
293 return 0;293 return 0;
294}294}
295 295
296static int mlx5_eeprom_page(int offset)296static 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
329static int mlx5_qsfp_eeprom_page(u16 offset)
297{330{
298 if (offset < MLX5_EEPROM_PAGE_LENGTH)331 if (offset < MLX5_EEPROM_PAGE_LENGTH)
299 /* Addresses between 0-255 - page 00 */332 /* Addresses between 0-255 - page 00 */
@@ -307,7 +340,7 @@ static int mlx5_eeprom_page(int offset) · 7 unmodified lines
307 MLX5_EEPROM_HIGH_PAGE_LENGTH);340 MLX5_EEPROM_HIGH_PAGE_LENGTH);
308}341}
309 342
310static int mlx5_eeprom_high_page_offset(int page_num)343static int mlx5_qsfp_eeprom_high_page_offset(int page_num)
311{344{
312 if (!page_num) /* Page 0 always start from low page */345 if (!page_num) /* Page 0 always start from low page */
313 return 0;346 return 0;
@@ -316,35 +349,62 @@ static int mlx5_eeprom_high_page_offset(int page_num) · 2 unmodified lines
316 return page_num * MLX5_EEPROM_HIGH_PAGE_LENGTH;349 return page_num * MLX5_EEPROM_HIGH_PAGE_LENGTH;
317}350}
318 351
352static 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
359static 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
319int mlx5_query_module_eeprom(struct mlx5_core_dev *dev,371int mlx5_query_module_eeprom(struct mlx5_core_dev *dev,
320 u16 offset, u16 size, u8 *data)372 u16 offset, u16 size, u8 *data)
321{373{
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)] = {};
323 u32 out[MLX5_ST_SZ_DW(mcia_reg)];376 u32 out[MLX5_ST_SZ_DW(mcia_reg)];
324 u32 in[MLX5_ST_SZ_DW(mcia_reg)];377 u16 i2c_addr = 0;
325 u16 i2c_addr;378 u8 module_id;
326 void *ptr = MLX5_ADDR_OF(mcia_reg, out, dword_0);379 void *ptr;
327 380
328 err = mlx5_query_module_num(dev, &module_num);381 err = mlx5_query_module_num(dev, &module_num);
329 if (err)382 if (err)
330 return err;383 return err;
331 384
332 memset(in, 0, sizeof(in));385 err = mlx5_query_module_id(dev, module_num, &module_id);
333 size = min_t(int, size, MLX5_EEPROM_MAX_BYTES);386 if (err)
334 387 return err;
335 /* Get the page number related to the given offset */
336 page_num = mlx5_eeprom_page(offset);
337 388
338 /* Set the right offset according to the page number,389 switch (module_id) {
339 * For page_num > 0, relative offset is always >= 128 (high page).390 case MLX5_MODULE_ID_SFP:
340 */391 mlx5_sfp_eeprom_params_set(&i2c_addr, &page_num, &offset);
341 offset -= mlx5_eeprom_high_page_offset(page_num);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 }
342 402
343 if (offset + size > MLX5_EEPROM_PAGE_LENGTH)403 if (offset + size > MLX5_EEPROM_PAGE_LENGTH)
344 /* Cross pages read, read until offset 256 in low page */404 /* Cross pages read, read until offset 256 in low page */
345 size -= offset + size - MLX5_EEPROM_PAGE_LENGTH;405 size -= offset + size - MLX5_EEPROM_PAGE_LENGTH;
346 406
347 i2c_addr = MLX5_I2C_ADDR_LOW;407 size = min_t(int, size, MLX5_EEPROM_MAX_BYTES);
348 408
349 MLX5_SET(mcia_reg, in, l, 0);409 MLX5_SET(mcia_reg, in, l, 0);
350 MLX5_SET(mcia_reg, in, module, module_num);410 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
365 return -EIO;425 return -EIO;
366 }426 }
367 427
428 ptr = MLX5_ADDR_OF(mcia_reg, out, dword_0);
368 memcpy(data, ptr, size);429 memcpy(data, ptr, size);
369 430
370 return size;431 return size;
include/linux/mlx5/driver.h+1−0
@@ -147,6 +147,7 @@ enum { · 146 unmodified lines
147 MLX5_REG_MCDA = 0x9063,147 MLX5_REG_MCDA = 0x9063,
148 MLX5_REG_MCAM = 0x907f,148 MLX5_REG_MCAM = 0x907f,
149 MLX5_REG_MIRC = 0x9162,149 MLX5_REG_MIRC = 0x9162,
150 MLX5_REG_SBCAM = 0xB01F,
150 MLX5_REG_RESOURCE_DUMP = 0xC000,151 MLX5_REG_RESOURCE_DUMP = 0xC000,
151};152};
152 153
include/linux/mlx5/mlx5_ifc.h+28−0
@@ -9960,6 +9960,34 @@ struct mlx5_ifc_pptb_reg_bits { · 9959 unmodified lines
9960 u8 untagged_buff[0x4];9960 u8 untagged_buff[0x4];
9961};9961};
9962 9962
9963struct 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
9963struct mlx5_ifc_pbmc_reg_bits {9991struct mlx5_ifc_pbmc_reg_bits {
9964 u8 reserved_at_0[0x8];9992 u8 reserved_at_0[0x8];
9965 u8 local_port[0x8];9993 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