Skip to content

Commit 537d077

Browse files
committed
Merge tag 'mlx5-fixes-2019-12-05' of git://git.kernel.org/pub/scm/linux/kernel/git/saeed/linux
Saeed Mahameed says: ==================== Mellanox, mlx5 fixes 2019-12-05 This series introduces some fixes to mlx5 driver. Please pull and let me know if there is any problem. For -stable v4.19: ('net/mlx5e: Query global pause state before setting prio2buffer') For -stable v5.3 ('net/mlx5e: Fix SFF 8472 eeprom length') ('net/mlx5e: Fix translation of link mode into speed') ('net/mlx5e: Fix freeing flow with kfree() and not kvfree()') ('net/mlx5e: ethtool, Fix analysis of speed setting') ('net/mlx5e: Fix TXQ indices to be sequential') ==================== Signed-off-by: David S. Miller <[email protected]>
2 parents 04aa1bc + b782607 commit 537d077

File tree

10 files changed

+143
-75
lines changed

10 files changed

+143
-75
lines changed

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -816,7 +816,7 @@ struct mlx5e_xsk {
816816
struct mlx5e_priv {
817817
/* priv data path fields - start */
818818
struct mlx5e_txqsq *txq2sq[MLX5E_MAX_NUM_CHANNELS * MLX5E_MAX_NUM_TC];
819-
int channel_tc2txq[MLX5E_MAX_NUM_CHANNELS][MLX5E_MAX_NUM_TC];
819+
int channel_tc2realtxq[MLX5E_MAX_NUM_CHANNELS][MLX5E_MAX_NUM_TC];
820820
#ifdef CONFIG_MLX5_CORE_EN_DCB
821821
struct mlx5e_dcbx_dp dcbx_dp;
822822
#endif

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,7 @@ static const u32 mlx5e_ext_link_speed[MLX5E_EXT_LINK_MODES_NUMBER] = {
7373
[MLX5E_50GAUI_2_LAUI_2_50GBASE_CR2_KR2] = 50000,
7474
[MLX5E_50GAUI_1_LAUI_1_50GBASE_CR_KR] = 50000,
7575
[MLX5E_CAUI_4_100GBASE_CR4_KR4] = 100000,
76+
[MLX5E_100GAUI_2_100GBASE_CR2_KR2] = 100000,
7677
[MLX5E_200GAUI_4_200GBASE_CR4_KR4] = 200000,
7778
[MLX5E_400GAUI_8] = 400000,
7879
};

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

Lines changed: 25 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -155,8 +155,11 @@ static int update_xoff_threshold(struct mlx5e_port_buffer *port_buffer,
155155
}
156156

157157
if (port_buffer->buffer[i].size <
158-
(xoff + max_mtu + (1 << MLX5E_BUFFER_CELL_SHIFT)))
158+
(xoff + max_mtu + (1 << MLX5E_BUFFER_CELL_SHIFT))) {
159+
pr_err("buffer_size[%d]=%d is not enough for lossless buffer\n",
160+
i, port_buffer->buffer[i].size);
159161
return -ENOMEM;
162+
}
160163

161164
port_buffer->buffer[i].xoff = port_buffer->buffer[i].size - xoff;
162165
port_buffer->buffer[i].xon =
@@ -232,6 +235,26 @@ static int update_buffer_lossy(unsigned int max_mtu,
232235
return 0;
233236
}
234237

238+
static int fill_pfc_en(struct mlx5_core_dev *mdev, u8 *pfc_en)
239+
{
240+
u32 g_rx_pause, g_tx_pause;
241+
int err;
242+
243+
err = mlx5_query_port_pause(mdev, &g_rx_pause, &g_tx_pause);
244+
if (err)
245+
return err;
246+
247+
/* If global pause enabled, set all active buffers to lossless.
248+
* Otherwise, check PFC setting.
249+
*/
250+
if (g_rx_pause || g_tx_pause)
251+
*pfc_en = 0xff;
252+
else
253+
err = mlx5_query_port_pfc(mdev, pfc_en, NULL);
254+
255+
return err;
256+
}
257+
235258
#define MINIMUM_MAX_MTU 9216
236259
int mlx5e_port_manual_buffer_config(struct mlx5e_priv *priv,
237260
u32 change, unsigned int mtu,
@@ -277,7 +300,7 @@ int mlx5e_port_manual_buffer_config(struct mlx5e_priv *priv,
277300

278301
if (change & MLX5E_PORT_BUFFER_PRIO2BUFFER) {
279302
update_prio2buffer = true;
280-
err = mlx5_query_port_pfc(priv->mdev, &curr_pfc_en, NULL);
303+
err = fill_pfc_en(priv->mdev, &curr_pfc_en);
281304
if (err)
282305
return err;
283306

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

Lines changed: 4 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1027,18 +1027,11 @@ static bool ext_link_mode_requested(const unsigned long *adver)
10271027
return bitmap_intersects(modes, adver, __ETHTOOL_LINK_MODE_MASK_NBITS);
10281028
}
10291029

1030-
static bool ext_speed_requested(u32 speed)
1031-
{
1032-
#define MLX5E_MAX_PTYS_LEGACY_SPEED 100000
1033-
return !!(speed > MLX5E_MAX_PTYS_LEGACY_SPEED);
1034-
}
1035-
1036-
static bool ext_requested(u8 autoneg, const unsigned long *adver, u32 speed)
1030+
static bool ext_requested(u8 autoneg, const unsigned long *adver, bool ext_supported)
10371031
{
10381032
bool ext_link_mode = ext_link_mode_requested(adver);
1039-
bool ext_speed = ext_speed_requested(speed);
10401033

1041-
return autoneg == AUTONEG_ENABLE ? ext_link_mode : ext_speed;
1034+
return autoneg == AUTONEG_ENABLE ? ext_link_mode : ext_supported;
10421035
}
10431036

10441037
int mlx5e_ethtool_set_link_ksettings(struct mlx5e_priv *priv,
@@ -1065,8 +1058,8 @@ int mlx5e_ethtool_set_link_ksettings(struct mlx5e_priv *priv,
10651058
autoneg = link_ksettings->base.autoneg;
10661059
speed = link_ksettings->base.speed;
10671060

1068-
ext = ext_requested(autoneg, adver, speed),
10691061
ext_supported = MLX5_CAP_PCAM_FEATURE(mdev, ptys_extended_ethernet);
1062+
ext = ext_requested(autoneg, adver, ext_supported);
10701063
if (!ext_supported && ext)
10711064
return -EOPNOTSUPP;
10721065

@@ -1643,7 +1636,7 @@ static int mlx5e_get_module_info(struct net_device *netdev,
16431636
break;
16441637
case MLX5_MODULE_ID_SFP:
16451638
modinfo->type = ETH_MODULE_SFF_8472;
1646-
modinfo->eeprom_len = MLX5_EEPROM_PAGE_LENGTH;
1639+
modinfo->eeprom_len = ETH_MODULE_SFF_8472_LEN;
16471640
break;
16481641
default:
16491642
netdev_err(priv->netdev, "%s: cable type not recognized:0x%x\n",

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

Lines changed: 12 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1691,11 +1691,10 @@ static int mlx5e_open_sqs(struct mlx5e_channel *c,
16911691
struct mlx5e_params *params,
16921692
struct mlx5e_channel_param *cparam)
16931693
{
1694-
struct mlx5e_priv *priv = c->priv;
16951694
int err, tc;
16961695

16971696
for (tc = 0; tc < params->num_tc; tc++) {
1698-
int txq_ix = c->ix + tc * priv->max_nch;
1697+
int txq_ix = c->ix + tc * params->num_channels;
16991698

17001699
err = mlx5e_open_txqsq(c, c->priv->tisn[c->lag_port][tc], txq_ix,
17011700
params, &cparam->sq, &c->sq[tc], tc);
@@ -2876,26 +2875,21 @@ static void mlx5e_netdev_set_tcs(struct net_device *netdev)
28762875
netdev_set_tc_queue(netdev, tc, nch, 0);
28772876
}
28782877

2879-
static void mlx5e_build_tc2txq_maps(struct mlx5e_priv *priv)
2878+
static void mlx5e_build_txq_maps(struct mlx5e_priv *priv)
28802879
{
2881-
int i, tc;
2880+
int i, ch;
28822881

2883-
for (i = 0; i < priv->max_nch; i++)
2884-
for (tc = 0; tc < priv->profile->max_tc; tc++)
2885-
priv->channel_tc2txq[i][tc] = i + tc * priv->max_nch;
2886-
}
2882+
ch = priv->channels.num;
28872883

2888-
static void mlx5e_build_tx2sq_maps(struct mlx5e_priv *priv)
2889-
{
2890-
struct mlx5e_channel *c;
2891-
struct mlx5e_txqsq *sq;
2892-
int i, tc;
2884+
for (i = 0; i < ch; i++) {
2885+
int tc;
2886+
2887+
for (tc = 0; tc < priv->channels.params.num_tc; tc++) {
2888+
struct mlx5e_channel *c = priv->channels.c[i];
2889+
struct mlx5e_txqsq *sq = &c->sq[tc];
28932890

2894-
for (i = 0; i < priv->channels.num; i++) {
2895-
c = priv->channels.c[i];
2896-
for (tc = 0; tc < c->num_tc; tc++) {
2897-
sq = &c->sq[tc];
28982891
priv->txq2sq[sq->txq_ix] = sq;
2892+
priv->channel_tc2realtxq[i][tc] = i + tc * ch;
28992893
}
29002894
}
29012895
}
@@ -2910,7 +2904,7 @@ void mlx5e_activate_priv_channels(struct mlx5e_priv *priv)
29102904
netif_set_real_num_tx_queues(netdev, num_txqs);
29112905
netif_set_real_num_rx_queues(netdev, num_rxqs);
29122906

2913-
mlx5e_build_tx2sq_maps(priv);
2907+
mlx5e_build_txq_maps(priv);
29142908
mlx5e_activate_channels(&priv->channels);
29152909
mlx5e_xdp_tx_enable(priv);
29162910
netif_tx_start_all_queues(priv->netdev);
@@ -5021,7 +5015,6 @@ static int mlx5e_nic_init(struct mlx5_core_dev *mdev,
50215015
if (err)
50225016
mlx5_core_err(mdev, "TLS initialization failed, %d\n", err);
50235017
mlx5e_build_nic_netdev(netdev);
5024-
mlx5e_build_tc2txq_maps(priv);
50255018
mlx5e_health_create_reporters(priv);
50265019

50275020
return 0;

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1601,7 +1601,7 @@ static int mlx5e_grp_channels_fill_strings(struct mlx5e_priv *priv, u8 *data,
16011601
for (j = 0; j < NUM_SQ_STATS; j++)
16021602
sprintf(data + (idx++) * ETH_GSTRING_LEN,
16031603
sq_stats_desc[j].format,
1604-
priv->channel_tc2txq[i][tc]);
1604+
i + tc * max_nch);
16051605

16061606
for (i = 0; i < max_nch; i++) {
16071607
for (j = 0; j < NUM_XSKSQ_STATS * is_xsk; j++)

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

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1626,8 +1626,11 @@ static void __mlx5e_tc_del_fdb_peer_flow(struct mlx5e_tc_flow *flow)
16261626

16271627
flow_flag_clear(flow, DUP);
16281628

1629-
mlx5e_tc_del_fdb_flow(flow->peer_flow->priv, flow->peer_flow);
1630-
kvfree(flow->peer_flow);
1629+
if (refcount_dec_and_test(&flow->peer_flow->refcnt)) {
1630+
mlx5e_tc_del_fdb_flow(flow->peer_flow->priv, flow->peer_flow);
1631+
kfree(flow->peer_flow);
1632+
}
1633+
16311634
flow->peer_flow = NULL;
16321635
}
16331636

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,7 @@ u16 mlx5e_select_queue(struct net_device *dev, struct sk_buff *skb,
9393
if (txq_ix >= num_channels)
9494
txq_ix = priv->txq2sq[txq_ix]->ch_ix;
9595

96-
return priv->channel_tc2txq[txq_ix][up];
96+
return priv->channel_tc2realtxq[txq_ix][up];
9797
}
9898

9999
static inline int mlx5e_skb_l2_header_offset(struct sk_buff *skb)

drivers/net/ethernet/mellanox/mlx5/core/eswitch.h

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,14 @@ struct vport_ingress {
8181
struct mlx5_fc *drop_counter;
8282
} legacy;
8383
struct {
84-
struct mlx5_flow_group *metadata_grp;
84+
/* Optional group to add an FTE to do internal priority
85+
* tagging on ingress packets.
86+
*/
87+
struct mlx5_flow_group *metadata_prio_tag_grp;
88+
/* Group to add default match-all FTE entry to tag ingress
89+
* packet with metadata.
90+
*/
91+
struct mlx5_flow_group *metadata_allmatch_grp;
8592
struct mlx5_modify_hdr *modify_metadata;
8693
struct mlx5_flow_handle *modify_metadata_rule;
8794
} offloads;

0 commit comments

Comments
 (0)