Skip to content

Commit 19c8474

Browse files
committed
Merge tag 'mlx5-fixes-2019-03-29' of git://git.kernel.org/pub/scm/linux/kernel/git/saeed/linux
Saeed Mahameed says: ==================== Mellanox, mlx5 fixes 2019-03-29 This series introduces some fixes to mlx5 driver. Please pull and let me know if there is any problem. For -stable v4.11 ('net/mlx5: Decrease default mr cache size') For -stable v4.12 ('net/mlx5e: Add a lock on tir list') For -stable v4.13 ('net/mlx5e: Fix error handling when refreshing TIRs') For -stable v4.18 ('net/mlx5e: Update xon formula') For -stable v4.19 ('net: mlx5: Add a missing check on idr_find, free buf') ('net/mlx5e: Update xoff formula') net-next merge Note: When merged with net-next the following simple conflict will appear, drivers/net/ethernet/mellanox/mlx5/core/en/port_buffer.c ++<<<<<<< HEAD (net) + * max_mtu: netdev's max_mtu ++======= + * @mtu: device's MTU ++>>>>>>> net-next To resolve: just replace the line in net-next * @mtu: device's MTU to * @max_mtu: netdev's max_mtu ==================== Signed-off-by: David S. Miller <davem@davemloft.net>
2 parents ec915f4 + 7f1a546 commit 19c8474

File tree

10 files changed

+154
-81
lines changed

10 files changed

+154
-81
lines changed

drivers/net/ethernet/mellanox/mlx5/core/en/port.c

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -96,9 +96,6 @@ int mlx5_port_query_eth_proto(struct mlx5_core_dev *dev, u8 port, bool ext,
9696
if (!eproto)
9797
return -EINVAL;
9898

99-
if (ext != MLX5_CAP_PCAM_FEATURE(dev, ptys_extended_ethernet))
100-
return -EOPNOTSUPP;
101-
10299
err = mlx5_query_port_ptys(dev, out, sizeof(out), MLX5_PTYS_EN, port);
103100
if (err)
104101
return err;

drivers/net/ethernet/mellanox/mlx5/core/en/port_buffer.c

Lines changed: 22 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -122,18 +122,19 @@ static int port_set_buffer(struct mlx5e_priv *priv,
122122
return err;
123123
}
124124

125-
/* xoff = ((301+2.16 * len [m]) * speed [Gbps] + 2.72 MTU [B]) */
125+
/* xoff = ((301+2.16 * len [m]) * speed [Gbps] + 2.72 MTU [B])
126+
* minimum speed value is 40Gbps
127+
*/
126128
static u32 calculate_xoff(struct mlx5e_priv *priv, unsigned int mtu)
127129
{
128130
u32 speed;
129131
u32 xoff;
130132
int err;
131133

132134
err = mlx5e_port_linkspeed(priv->mdev, &speed);
133-
if (err) {
134-
mlx5_core_warn(priv->mdev, "cannot get port speed\n");
135-
return 0;
136-
}
135+
if (err)
136+
speed = SPEED_40000;
137+
speed = max_t(u32, speed, SPEED_40000);
137138

138139
xoff = (301 + 216 * priv->dcbx.cable_len / 100) * speed / 1000 + 272 * mtu / 100;
139140

@@ -142,7 +143,7 @@ static u32 calculate_xoff(struct mlx5e_priv *priv, unsigned int mtu)
142143
}
143144

144145
static int update_xoff_threshold(struct mlx5e_port_buffer *port_buffer,
145-
u32 xoff, unsigned int mtu)
146+
u32 xoff, unsigned int max_mtu)
146147
{
147148
int i;
148149

@@ -154,19 +155,20 @@ static int update_xoff_threshold(struct mlx5e_port_buffer *port_buffer,
154155
}
155156

156157
if (port_buffer->buffer[i].size <
157-
(xoff + mtu + (1 << MLX5E_BUFFER_CELL_SHIFT)))
158+
(xoff + max_mtu + (1 << MLX5E_BUFFER_CELL_SHIFT)))
158159
return -ENOMEM;
159160

160161
port_buffer->buffer[i].xoff = port_buffer->buffer[i].size - xoff;
161-
port_buffer->buffer[i].xon = port_buffer->buffer[i].xoff - mtu;
162+
port_buffer->buffer[i].xon =
163+
port_buffer->buffer[i].xoff - max_mtu;
162164
}
163165

164166
return 0;
165167
}
166168

167169
/**
168170
* update_buffer_lossy()
169-
* mtu: device's MTU
171+
* max_mtu: netdev's max_mtu
170172
* pfc_en: <input> current pfc configuration
171173
* buffer: <input> current prio to buffer mapping
172174
* xoff: <input> xoff value
@@ -183,7 +185,7 @@ static int update_xoff_threshold(struct mlx5e_port_buffer *port_buffer,
183185
* Return 0 if no error.
184186
* Set change to true if buffer configuration is modified.
185187
*/
186-
static int update_buffer_lossy(unsigned int mtu,
188+
static int update_buffer_lossy(unsigned int max_mtu,
187189
u8 pfc_en, u8 *buffer, u32 xoff,
188190
struct mlx5e_port_buffer *port_buffer,
189191
bool *change)
@@ -220,7 +222,7 @@ static int update_buffer_lossy(unsigned int mtu,
220222
}
221223

222224
if (changed) {
223-
err = update_xoff_threshold(port_buffer, xoff, mtu);
225+
err = update_xoff_threshold(port_buffer, xoff, max_mtu);
224226
if (err)
225227
return err;
226228

@@ -230,6 +232,7 @@ static int update_buffer_lossy(unsigned int mtu,
230232
return 0;
231233
}
232234

235+
#define MINIMUM_MAX_MTU 9216
233236
int mlx5e_port_manual_buffer_config(struct mlx5e_priv *priv,
234237
u32 change, unsigned int mtu,
235238
struct ieee_pfc *pfc,
@@ -241,20 +244,22 @@ int mlx5e_port_manual_buffer_config(struct mlx5e_priv *priv,
241244
bool update_prio2buffer = false;
242245
u8 buffer[MLX5E_MAX_PRIORITY];
243246
bool update_buffer = false;
247+
unsigned int max_mtu;
244248
u32 total_used = 0;
245249
u8 curr_pfc_en;
246250
int err;
247251
int i;
248252

249253
mlx5e_dbg(HW, priv, "%s: change=%x\n", __func__, change);
254+
max_mtu = max_t(unsigned int, priv->netdev->max_mtu, MINIMUM_MAX_MTU);
250255

251256
err = mlx5e_port_query_buffer(priv, &port_buffer);
252257
if (err)
253258
return err;
254259

255260
if (change & MLX5E_PORT_BUFFER_CABLE_LEN) {
256261
update_buffer = true;
257-
err = update_xoff_threshold(&port_buffer, xoff, mtu);
262+
err = update_xoff_threshold(&port_buffer, xoff, max_mtu);
258263
if (err)
259264
return err;
260265
}
@@ -264,7 +269,7 @@ int mlx5e_port_manual_buffer_config(struct mlx5e_priv *priv,
264269
if (err)
265270
return err;
266271

267-
err = update_buffer_lossy(mtu, pfc->pfc_en, buffer, xoff,
272+
err = update_buffer_lossy(max_mtu, pfc->pfc_en, buffer, xoff,
268273
&port_buffer, &update_buffer);
269274
if (err)
270275
return err;
@@ -276,8 +281,8 @@ int mlx5e_port_manual_buffer_config(struct mlx5e_priv *priv,
276281
if (err)
277282
return err;
278283

279-
err = update_buffer_lossy(mtu, curr_pfc_en, prio2buffer, xoff,
280-
&port_buffer, &update_buffer);
284+
err = update_buffer_lossy(max_mtu, curr_pfc_en, prio2buffer,
285+
xoff, &port_buffer, &update_buffer);
281286
if (err)
282287
return err;
283288
}
@@ -301,15 +306,15 @@ int mlx5e_port_manual_buffer_config(struct mlx5e_priv *priv,
301306
return -EINVAL;
302307

303308
update_buffer = true;
304-
err = update_xoff_threshold(&port_buffer, xoff, mtu);
309+
err = update_xoff_threshold(&port_buffer, xoff, max_mtu);
305310
if (err)
306311
return err;
307312
}
308313

309314
/* Need to update buffer configuration if xoff value is changed */
310315
if (!update_buffer && xoff != priv->dcbx.xoff) {
311316
update_buffer = true;
312-
err = update_xoff_threshold(&port_buffer, xoff, mtu);
317+
err = update_xoff_threshold(&port_buffer, xoff, max_mtu);
313318
if (err)
314319
return err;
315320
}

drivers/net/ethernet/mellanox/mlx5/core/en_common.c

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,16 +45,20 @@ int mlx5e_create_tir(struct mlx5_core_dev *mdev,
4545
if (err)
4646
return err;
4747

48+
mutex_lock(&mdev->mlx5e_res.td.list_lock);
4849
list_add(&tir->list, &mdev->mlx5e_res.td.tirs_list);
50+
mutex_unlock(&mdev->mlx5e_res.td.list_lock);
4951

5052
return 0;
5153
}
5254

5355
void mlx5e_destroy_tir(struct mlx5_core_dev *mdev,
5456
struct mlx5e_tir *tir)
5557
{
58+
mutex_lock(&mdev->mlx5e_res.td.list_lock);
5659
mlx5_core_destroy_tir(mdev, tir->tirn);
5760
list_del(&tir->list);
61+
mutex_unlock(&mdev->mlx5e_res.td.list_lock);
5862
}
5963

6064
static int mlx5e_create_mkey(struct mlx5_core_dev *mdev, u32 pdn,
@@ -114,6 +118,7 @@ int mlx5e_create_mdev_resources(struct mlx5_core_dev *mdev)
114118
}
115119

116120
INIT_LIST_HEAD(&mdev->mlx5e_res.td.tirs_list);
121+
mutex_init(&mdev->mlx5e_res.td.list_lock);
117122

118123
return 0;
119124

@@ -141,22 +146,25 @@ int mlx5e_refresh_tirs(struct mlx5e_priv *priv, bool enable_uc_lb)
141146
{
142147
struct mlx5_core_dev *mdev = priv->mdev;
143148
struct mlx5e_tir *tir;
144-
int err = -ENOMEM;
149+
int err = 0;
145150
u32 tirn = 0;
146151
int inlen;
147152
void *in;
148153

149154
inlen = MLX5_ST_SZ_BYTES(modify_tir_in);
150155
in = kvzalloc(inlen, GFP_KERNEL);
151-
if (!in)
156+
if (!in) {
157+
err = -ENOMEM;
152158
goto out;
159+
}
153160

154161
if (enable_uc_lb)
155162
MLX5_SET(modify_tir_in, in, ctx.self_lb_block,
156163
MLX5_TIRC_SELF_LB_BLOCK_BLOCK_UNICAST);
157164

158165
MLX5_SET(modify_tir_in, in, bitmask.self_lb_en, 1);
159166

167+
mutex_lock(&mdev->mlx5e_res.td.list_lock);
160168
list_for_each_entry(tir, &mdev->mlx5e_res.td.tirs_list, list) {
161169
tirn = tir->tirn;
162170
err = mlx5_core_modify_tir(mdev, tirn, in, inlen);
@@ -168,6 +176,7 @@ int mlx5e_refresh_tirs(struct mlx5e_priv *priv, bool enable_uc_lb)
168176
kvfree(in);
169177
if (err)
170178
netdev_err(priv->netdev, "refresh tir(0x%x) failed, %d\n", tirn, err);
179+
mutex_unlock(&mdev->mlx5e_res.td.list_lock);
171180

172181
return err;
173182
}

drivers/net/ethernet/mellanox/mlx5/core/en_ethtool.c

Lines changed: 34 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -603,16 +603,18 @@ static void ptys2ethtool_supported_link(struct mlx5_core_dev *mdev,
603603
__ETHTOOL_LINK_MODE_MASK_NBITS);
604604
}
605605

606-
static void ptys2ethtool_adver_link(struct mlx5_core_dev *mdev,
607-
unsigned long *advertising_modes,
608-
u32 eth_proto_cap)
606+
static void ptys2ethtool_adver_link(unsigned long *advertising_modes,
607+
u32 eth_proto_cap, bool ext)
609608
{
610609
unsigned long proto_cap = eth_proto_cap;
611610
struct ptys2ethtool_config *table;
612611
u32 max_size;
613612
int proto;
614613

615-
mlx5e_ethtool_get_speed_arr(mdev, &table, &max_size);
614+
table = ext ? ptys2ext_ethtool_table : ptys2legacy_ethtool_table;
615+
max_size = ext ? ARRAY_SIZE(ptys2ext_ethtool_table) :
616+
ARRAY_SIZE(ptys2legacy_ethtool_table);
617+
616618
for_each_set_bit(proto, &proto_cap, max_size)
617619
bitmap_or(advertising_modes, advertising_modes,
618620
table[proto].advertised,
@@ -794,12 +796,12 @@ static void get_supported(struct mlx5_core_dev *mdev, u32 eth_proto_cap,
794796
ethtool_link_ksettings_add_link_mode(link_ksettings, supported, Pause);
795797
}
796798

797-
static void get_advertising(struct mlx5_core_dev *mdev, u32 eth_proto_cap,
798-
u8 tx_pause, u8 rx_pause,
799-
struct ethtool_link_ksettings *link_ksettings)
799+
static void get_advertising(u32 eth_proto_cap, u8 tx_pause, u8 rx_pause,
800+
struct ethtool_link_ksettings *link_ksettings,
801+
bool ext)
800802
{
801803
unsigned long *advertising = link_ksettings->link_modes.advertising;
802-
ptys2ethtool_adver_link(mdev, advertising, eth_proto_cap);
804+
ptys2ethtool_adver_link(advertising, eth_proto_cap, ext);
803805

804806
if (rx_pause)
805807
ethtool_link_ksettings_add_link_mode(link_ksettings, advertising, Pause);
@@ -854,8 +856,9 @@ static void get_lp_advertising(struct mlx5_core_dev *mdev, u32 eth_proto_lp,
854856
struct ethtool_link_ksettings *link_ksettings)
855857
{
856858
unsigned long *lp_advertising = link_ksettings->link_modes.lp_advertising;
859+
bool ext = MLX5_CAP_PCAM_FEATURE(mdev, ptys_extended_ethernet);
857860

858-
ptys2ethtool_adver_link(mdev, lp_advertising, eth_proto_lp);
861+
ptys2ethtool_adver_link(lp_advertising, eth_proto_lp, ext);
859862
}
860863

861864
int mlx5e_ethtool_get_link_ksettings(struct mlx5e_priv *priv,
@@ -872,6 +875,7 @@ int mlx5e_ethtool_get_link_ksettings(struct mlx5e_priv *priv,
872875
u8 an_disable_admin;
873876
u8 an_status;
874877
u8 connector_type;
878+
bool admin_ext;
875879
bool ext;
876880
int err;
877881

@@ -886,6 +890,19 @@ int mlx5e_ethtool_get_link_ksettings(struct mlx5e_priv *priv,
886890
eth_proto_capability);
887891
eth_proto_admin = MLX5_GET_ETH_PROTO(ptys_reg, out, ext,
888892
eth_proto_admin);
893+
/* Fields: eth_proto_admin and ext_eth_proto_admin are
894+
* mutually exclusive. Hence try reading legacy advertising
895+
* when extended advertising is zero.
896+
* admin_ext indicates how eth_proto_admin should be
897+
* interpreted
898+
*/
899+
admin_ext = ext;
900+
if (ext && !eth_proto_admin) {
901+
eth_proto_admin = MLX5_GET_ETH_PROTO(ptys_reg, out, false,
902+
eth_proto_admin);
903+
admin_ext = false;
904+
}
905+
889906
eth_proto_oper = MLX5_GET_ETH_PROTO(ptys_reg, out, ext,
890907
eth_proto_oper);
891908
eth_proto_lp = MLX5_GET(ptys_reg, out, eth_proto_lp_advertise);
@@ -899,7 +916,8 @@ int mlx5e_ethtool_get_link_ksettings(struct mlx5e_priv *priv,
899916
ethtool_link_ksettings_zero_link_mode(link_ksettings, advertising);
900917

901918
get_supported(mdev, eth_proto_cap, link_ksettings);
902-
get_advertising(mdev, eth_proto_admin, tx_pause, rx_pause, link_ksettings);
919+
get_advertising(eth_proto_admin, tx_pause, rx_pause, link_ksettings,
920+
admin_ext);
903921
get_speed_duplex(priv->netdev, eth_proto_oper, link_ksettings);
904922

905923
eth_proto_oper = eth_proto_oper ? eth_proto_oper : eth_proto_cap;
@@ -997,19 +1015,17 @@ int mlx5e_ethtool_set_link_ksettings(struct mlx5e_priv *priv,
9971015

9981016
#define MLX5E_PTYS_EXT ((1ULL << ETHTOOL_LINK_MODE_50000baseKR_Full_BIT) - 1)
9991017

1000-
ext_requested = (link_ksettings->link_modes.advertising[0] >
1001-
MLX5E_PTYS_EXT);
1018+
ext_requested = !!(link_ksettings->link_modes.advertising[0] >
1019+
MLX5E_PTYS_EXT ||
1020+
link_ksettings->link_modes.advertising[1]);
10021021
ext_supported = MLX5_CAP_PCAM_FEATURE(mdev, ptys_extended_ethernet);
1003-
1004-
/*when ptys_extended_ethernet is set legacy link modes are deprecated */
1005-
if (ext_requested != ext_supported)
1006-
return -EPROTONOSUPPORT;
1022+
ext_requested &= ext_supported;
10071023

10081024
speed = link_ksettings->base.speed;
10091025
ethtool2ptys_adver_func = ext_requested ?
10101026
mlx5e_ethtool2ptys_ext_adver_link :
10111027
mlx5e_ethtool2ptys_adver_link;
1012-
err = mlx5_port_query_eth_proto(mdev, 1, ext_supported, &eproto);
1028+
err = mlx5_port_query_eth_proto(mdev, 1, ext_requested, &eproto);
10131029
if (err) {
10141030
netdev_err(priv->netdev, "%s: query port eth proto failed: %d\n",
10151031
__func__, err);
@@ -1037,7 +1053,7 @@ int mlx5e_ethtool_set_link_ksettings(struct mlx5e_priv *priv,
10371053
if (!an_changes && link_modes == eproto.admin)
10381054
goto out;
10391055

1040-
mlx5_port_set_eth_ptys(mdev, an_disable, link_modes, ext_supported);
1056+
mlx5_port_set_eth_ptys(mdev, an_disable, link_modes, ext_requested);
10411057
mlx5_toggle_port_link(mdev);
10421058

10431059
out:

0 commit comments

Comments
 (0)