RDMA/mlx4: Redo TX checksum offload in line with docs
Subsystems (3)
PATCH 1/1 RDMA/mlx4: Redo TX checksum offload in line with docs
From: Eugene Crosser <[email protected]>
Ingress checksum offload was not working for IPv6 frames because the conditional expression that checks validation status passed from the hardware was not matching the algorithm described in the documentation.
This patch defines L4_CSUM flag (which falls inside the badfcs_enc field in the existing definition of the CQE layout) and replaces the conditional expression with the one defined in the "ConnectX(r) Family Programmer's Manual" document.
--- drivers/infiniband/hw/mlx4/cq.c | 18 +++++++----------- include/linux/mlx4/cq.h | 5 +++++ 2 files changed, 12 insertions(+), 11 deletions(-)
drivers/infiniband/hw/mlx4/cq.c +7 -11
@@ -568,18 +568,13 @@ static void mlx4_ib_handle_error_cqe(struct mlx4_err_cqe *cqe, wc->vendor_err = cqe->vendor_err_syndrome; } -static int mlx4_ib_ipoib_csum_ok (__be16 status,__be16 checksum) +static int mlx4_ib_ipoib_csum_ok (__be16 status,u8 badfcs_enc,__be16 checksum) { -return ((status &cpu_to_be16 (MLX4_CQE_STATUS_IPV4 | -MLX4_CQE_STATUS_IPV4F | -MLX4_CQE_STATUS_IPV4OPT | -MLX4_CQE_STATUS_IPV6 | -MLX4_CQE_STATUS_IPOK )) == -cpu_to_be16 (MLX4_CQE_STATUS_IPV4 | -MLX4_CQE_STATUS_IPOK )) && - (status &cpu_to_be16 (MLX4_CQE_STATUS_UDP | -MLX4_CQE_STATUS_TCP )) && - checksum ==cpu_to_be16 (0xffff ); +return ((badfcs_enc &MLX4_CQE_STATUS_L4_CSUM ) || + ((status &cpu_to_be16 (MLX4_CQE_STATUS_IPOK )) && + (status &cpu_to_be16 (MLX4_CQE_STATUS_TCP | +MLX4_CQE_STATUS_UDP )) && + (checksum ==cpu_to_be16 (0xffff )))); } static void use_tunnel_data(struct mlx4_ib_qp *qp, struct mlx4_ib_cq *cq, struct ib_wc *wc,
@@ -855,6 +850,7 @@ static int mlx4_ib_poll_one(struct mlx4_ib_cq *cq, wc->wc_flags |= g_mlpath_rqpn &0x80000000 ?IB_WC_GRH :0 ; wc->pkey_index =be32_to_cpu (cqe->immed_rss_invalid) &0x7f ; wc->wc_flags |=mlx4_ib_ipoib_csum_ok (cqe->status, + cqe->badfcs_enc, cqe->checksum) ?IB_WC_IP_CSUM_OK :0 ;if (is_eth) { wc->slid =0 ;
include/linux/mlx4/cq.h +5 -0
@@ -130,6 +130,11 @@ enum { MLX4_CQE_STATUS_IPOK = 1 << 12, }; +/* L4_CSUM is logically part of status, but has to checked against badfcs_enc */ +enum { +MLX4_CQE_STATUS_L4_CSUM =1 <<2 , +}; +enum {MLX4_CQE_LLC =1 ,MLX4_CQE_SNAP =1 <<1 ,
Signature · 1 line
2.20.1
Jason Gunthorpe
AppliedQuoted 11 lines · Leon Romanovsky
From: Eugene Crosser <[email protected]>
Ingress checksum offload was not working for IPv6 frames because the conditional expression that checks validation status passed from the hardware was not matching the algorithm described in the documentation.
This patch defines
L4_CSUMflag (which falls inside thebadfcs_encfield in the existing definition of the CQE layout) and replaces the conditional expression with the one defined in the "ConnectX(r) Family Programmer's Manual" document.
Quoted 7 lines
Signed-off-by Eugene Crosser <[email protected]>Reviewed-by Jack Wang <[email protected]>Signed-off-by Leon Romanovsky <[email protected]>--- drivers/infiniband/hw/mlx4/cq.c | 18 +++++++----------- include/linux/mlx4/cq.h | 5 +++++ 2 files changed, 12 insertions(+), 11 deletions(-)
Applied to for-next, thanks
Jason