Skip to content

Commit ca68d56

Browse files
committed
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') ==================== Signed-off-by: David S. Miller <[email protected]>
2 parents 14b032b + eb32b3f commit ca68d56

File tree

14 files changed

+196
-62
lines changed

14 files changed

+196
-62
lines changed

drivers/net/ethernet/mellanox/mlx5/core/en/dcbnl.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ struct mlx5e_dcbx {
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

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -78,11 +78,26 @@ static const u32 mlx5e_ext_link_speed[MLX5E_EXT_LINK_MODES_NUMBER] = {
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)
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)
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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ int mlx5e_port_linkspeed(struct mlx5_core_dev *mdev, u32 *speed);
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

Lines changed: 29 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
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,
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,
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 @@ int mlx5e_port_query_buffer(struct mlx5e_priv *priv,
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,
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)
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,
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,
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,
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,
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,
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,
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,
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,
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,15 +334,15 @@ int mlx5e_port_manual_buffer_config(struct mlx5e_priv *priv,
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
}
336341

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

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,6 @@
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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1097,6 +1097,7 @@ mlx5_tc_ct_flush_ft_entry(void *ptr, void *arg)
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

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1217,6 +1217,24 @@ static int mlx5e_trust_initialize(struct mlx5e_priv *priv)
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)
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

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -200,7 +200,7 @@ static void mlx5e_ethtool_get_speed_arr(struct mlx5_core_dev *mdev,
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,
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,
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,
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

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3104,9 +3104,6 @@ int mlx5e_open(struct net_device *netdev)
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)
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)
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)
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,
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:

0 commit comments

Comments
 (0)