@@ -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+
763794static 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+
29072953int 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+
31243187static 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 ) &&
0 commit comments