Skip to content

Commit 102722f

Browse files
guyergasSaeed Mahameed
authored andcommitted
net/mlx5e: Add support for RXFCS feature flag
Add support for rx-fcs flag from ethtool. In case this flag is set, update all RQs to scatter the FCS data into the packet. Signed-off-by: Guy Ergas <[email protected]> Signed-off-by: Saeed Mahameed <[email protected]>
1 parent d0dd989 commit 102722f

File tree

3 files changed

+73
-0
lines changed

3 files changed

+73
-0
lines changed

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -221,6 +221,7 @@ struct mlx5e_params {
221221
u8 toeplitz_hash_key[40];
222222
u32 indirection_rqt[MLX5E_INDIR_RQT_SIZE];
223223
bool vlan_strip_disable;
224+
bool scatter_fcs_en;
224225
bool rx_am_enabled;
225226
u32 lro_timeout;
226227
u32 pflags;

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

Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -760,6 +760,37 @@ static int mlx5e_modify_rq_state(struct mlx5e_rq *rq, int curr_state,
760760
return err;
761761
}
762762

763+
static int mlx5e_modify_rq_scatter_fcs(struct mlx5e_rq *rq, bool enable)
764+
{
765+
struct mlx5e_channel *c = rq->channel;
766+
struct mlx5e_priv *priv = c->priv;
767+
struct mlx5_core_dev *mdev = priv->mdev;
768+
769+
void *in;
770+
void *rqc;
771+
int inlen;
772+
int err;
773+
774+
inlen = MLX5_ST_SZ_BYTES(modify_rq_in);
775+
in = mlx5_vzalloc(inlen);
776+
if (!in)
777+
return -ENOMEM;
778+
779+
rqc = MLX5_ADDR_OF(modify_rq_in, in, ctx);
780+
781+
MLX5_SET(modify_rq_in, in, rq_state, MLX5_RQC_STATE_RDY);
782+
MLX5_SET64(modify_rq_in, in, modify_bitmask,
783+
MLX5_MODIFY_RQ_IN_MODIFY_BITMASK_SCATTER_FCS);
784+
MLX5_SET(rqc, rqc, scatter_fcs, enable);
785+
MLX5_SET(rqc, rqc, state, MLX5_RQC_STATE_RDY);
786+
787+
err = mlx5_core_modify_rq(mdev, rq->rqn, in, inlen);
788+
789+
kvfree(in);
790+
791+
return err;
792+
}
793+
763794
static int mlx5e_modify_rq_vsd(struct mlx5e_rq *rq, bool vsd)
764795
{
765796
struct mlx5e_channel *c = rq->channel;
@@ -1834,6 +1865,7 @@ static void mlx5e_build_rq_param(struct mlx5e_priv *priv,
18341865
MLX5_SET(wq, wq, pd, priv->mdev->mlx5e_res.pdn);
18351866
MLX5_SET(rqc, rqc, counter_set_id, priv->q_counter);
18361867
MLX5_SET(rqc, rqc, vsd, params->vlan_strip_disable);
1868+
MLX5_SET(rqc, rqc, scatter_fcs, params->scatter_fcs_en);
18371869

18381870
param->wq.buf_numa_node = dev_to_node(&priv->mdev->pdev->dev);
18391871
param->wq.linear = 1;
@@ -2904,6 +2936,20 @@ void mlx5e_destroy_direct_tirs(struct mlx5e_priv *priv)
29042936
mlx5e_destroy_tir(priv->mdev, &priv->direct_tir[i]);
29052937
}
29062938

2939+
static int mlx5e_modify_channels_scatter_fcs(struct mlx5e_channels *chs, bool enable)
2940+
{
2941+
int err = 0;
2942+
int i;
2943+
2944+
for (i = 0; i < chs->num; i++) {
2945+
err = mlx5e_modify_rq_scatter_fcs(&chs->c[i]->rq, enable);
2946+
if (err)
2947+
return err;
2948+
}
2949+
2950+
return 0;
2951+
}
2952+
29072953
int mlx5e_modify_channels_vsd(struct mlx5e_channels *chs, bool vsd)
29082954
{
29092955
int err = 0;
@@ -3121,6 +3167,23 @@ static int set_feature_rx_all(struct net_device *netdev, bool enable)
31213167
return mlx5_set_port_fcs(mdev, !enable);
31223168
}
31233169

3170+
static int set_feature_rx_fcs(struct net_device *netdev, bool enable)
3171+
{
3172+
struct mlx5e_priv *priv = netdev_priv(netdev);
3173+
int err;
3174+
3175+
mutex_lock(&priv->state_lock);
3176+
3177+
priv->channels.params.scatter_fcs_en = enable;
3178+
err = mlx5e_modify_channels_scatter_fcs(&priv->channels, enable);
3179+
if (err)
3180+
priv->channels.params.scatter_fcs_en = !enable;
3181+
3182+
mutex_unlock(&priv->state_lock);
3183+
3184+
return err;
3185+
}
3186+
31243187
static int set_feature_rx_vlan(struct net_device *netdev, bool enable)
31253188
{
31263189
struct mlx5e_priv *priv = netdev_priv(netdev);
@@ -3194,6 +3257,8 @@ static int mlx5e_set_features(struct net_device *netdev,
31943257
set_feature_tc_num_filters);
31953258
err |= mlx5e_handle_feature(netdev, features, NETIF_F_RXALL,
31963259
set_feature_rx_all);
3260+
err |= mlx5e_handle_feature(netdev, features, NETIF_F_RXFCS,
3261+
set_feature_rx_fcs);
31973262
err |= mlx5e_handle_feature(netdev, features, NETIF_F_HW_VLAN_CTAG_RX,
31983263
set_feature_rx_vlan);
31993264
#ifdef CONFIG_RFS_ACCEL
@@ -3908,13 +3973,19 @@ static void mlx5e_build_nic_netdev(struct net_device *netdev)
39083973
if (fcs_supported)
39093974
netdev->hw_features |= NETIF_F_RXALL;
39103975

3976+
if (MLX5_CAP_ETH(mdev, scatter_fcs))
3977+
netdev->hw_features |= NETIF_F_RXFCS;
3978+
39113979
netdev->features = netdev->hw_features;
39123980
if (!priv->channels.params.lro_en)
39133981
netdev->features &= ~NETIF_F_LRO;
39143982

39153983
if (fcs_enabled)
39163984
netdev->features &= ~NETIF_F_RXALL;
39173985

3986+
if (!priv->channels.params.scatter_fcs_en)
3987+
netdev->features &= ~NETIF_F_RXFCS;
3988+
39183989
#define FT_CAP(f) MLX5_CAP_FLOWTABLE(mdev, flow_table_properties_nic_receive.f)
39193990
if (FT_CAP(flow_modify_en) &&
39203991
FT_CAP(modify_root) &&

include/linux/mlx5/mlx5_ifc.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5122,6 +5122,7 @@ struct mlx5_ifc_modify_rq_out_bits {
51225122

51235123
enum {
51245124
MLX5_MODIFY_RQ_IN_MODIFY_BITMASK_VSD = 1ULL << 1,
5125+
MLX5_MODIFY_RQ_IN_MODIFY_BITMASK_SCATTER_FCS = 1ULL << 2,
51255126
MLX5_MODIFY_RQ_IN_MODIFY_BITMASK_RQ_COUNTER_SET_ID = 1ULL << 3,
51265127
};
51275128

0 commit comments

Comments
 (0)