From: tzachid Date: Wed, 10 Sep 2008 16:01:35 +0000 (+0000) Subject: [MTHCA, MLX4, IPoIB] Checksum (Csum) offload bugfix. X-Git-Url: https://openfabrics.org/gitweb/?a=commitdiff_plain;h=c2a85081c0bcb92f3f9bcc2af48dc7c544e45d68;p=~shefty%2Frdma-win.git [MTHCA, MLX4, IPoIB] Checksum (Csum) offload bugfix. Signed off by: xalex@mellanox.co.il & alex.estrin@qlogic.com git-svn-id: svn://openib.tc.cornell.edu/gen1@1584 ad392aa1-c5ef-ae45-8dd8-e69d62a5ef86 --- diff --git a/branches/WOF2-0/trunk/hw/mlx4/kernel/bus/inc/cq.h b/branches/WOF2-0/trunk/hw/mlx4/kernel/bus/inc/cq.h index bef17d5f..93b56ea1 100644 --- a/branches/WOF2-0/trunk/hw/mlx4/kernel/bus/inc/cq.h +++ b/branches/WOF2-0/trunk/hw/mlx4/kernel/bus/inc/cq.h @@ -115,12 +115,12 @@ enum { }; enum { - MLX4_NdisPacketTcpChecksumFailed = 1 << 1, - MLX4_NdisPacketUdpChecksumFailed = 1 << 2, - MLX4_NdisPacketIpChecksumFailed = 1 << 3, - MLX4_NdisPacketTcpChecksumSucceeded = 1 << 4, - MLX4_NdisPacketUdpChecksumSucceeded = 1 << 5, - MLX4_NdisPacketIpChecksumSucceeded = 1 << 6 + MLX4_NdisPacketTcpChecksumFailed = 1 << 0, + MLX4_NdisPacketUdpChecksumFailed = 1 << 1, + MLX4_NdisPacketIpChecksumFailed = 1 << 2, + MLX4_NdisPacketTcpChecksumSucceeded = 1 << 3, + MLX4_NdisPacketUdpChecksumSucceeded = 1 << 4, + MLX4_NdisPacketIpChecksumSucceeded = 1 << 5 }; static inline void mlx4_cq_arm(struct mlx4_cq *cq, u32 cmd, diff --git a/branches/WOF2-0/trunk/hw/mthca/kernel/mthca_cq.c b/branches/WOF2-0/trunk/hw/mthca/kernel/mthca_cq.c index 7376f0c9..558b2153 100644 --- a/branches/WOF2-0/trunk/hw/mthca/kernel/mthca_cq.c +++ b/branches/WOF2-0/trunk/hw/mthca/kernel/mthca_cq.c @@ -118,12 +118,12 @@ enum { }; enum { - MTHCA_NdisPacketTcpChecksumFailed = 1 << 1, - MTHCA_NdisPacketUdpChecksumFailed = 1 << 2, - MTHCA_NdisPacketIpChecksumFailed = 1 << 3, - MTHCA_NdisPacketTcpChecksumSucceeded = 1 << 4, - MTHCA_NdisPacketUdpChecksumSucceeded = 1 << 5, - MTHCA_NdisPacketIpChecksumSucceeded = 1 << 6 + MTHCA_NdisPacketTcpChecksumFailed = 1 << 0, + MTHCA_NdisPacketUdpChecksumFailed = 1 << 1, + MTHCA_NdisPacketIpChecksumFailed = 1 << 2, + MTHCA_NdisPacketTcpChecksumSucceeded = 1 << 3, + MTHCA_NdisPacketUdpChecksumSucceeded = 1 << 4, + MTHCA_NdisPacketIpChecksumSucceeded = 1 << 5 }; struct mthca_cqe { diff --git a/branches/WOF2-0/trunk/ulp/ipoib/kernel/ipoib_port.c b/branches/WOF2-0/trunk/ulp/ipoib/kernel/ipoib_port.c index 14d1d218..f98981a8 100644 --- a/branches/WOF2-0/trunk/ulp/ipoib/kernel/ipoib_port.c +++ b/branches/WOF2-0/trunk/ulp/ipoib/kernel/ipoib_port.c @@ -2542,6 +2542,8 @@ __recv_mgr_prepare_pkt( NDIS_STATUS status; uint32_t pkt_filter; ip_stat_sel_t type; + NDIS_TCP_IP_CHECKSUM_PACKET_INFO chksum; + PERF_DECLARE( GetNdisPkt ); IPOIB_ENTER( IPOIB_DBG_RECV ); @@ -2621,21 +2623,32 @@ __recv_mgr_prepare_pkt( ("__buf_mgr_get_ndis_pkt failed\n") ); return IB_INSUFFICIENT_RESOURCES; } - if (p_port->p_adapter->params.recv_chksum_offload != CSUM_BYPASS) { - /* Get the checksums directly from packet information. */ - /* In this case, no one of cheksum's cat get false value */ - /* If hardware checksum failed or wasn't calculated, NDIS will recalculate it again */ + + chksum.Value = 0; + switch (p_port->p_adapter->params.recv_chksum_offload) { + case CSUM_DISABLED: + NDIS_PER_PACKET_INFO_FROM_PACKET( *pp_packet, TcpIpChecksumPacketInfo ) = + (void*)(uintn_t)chksum.Value; + break; + case CSUM_ENABLED: + /* Get the checksums directly from packet information. */ + /* In this case, no one of cheksum's cat get false value */ + /* If hardware checksum failed or wasn't calculated, NDIS will recalculate it again */ NDIS_PER_PACKET_INFO_FROM_PACKET( *pp_packet, TcpIpChecksumPacketInfo ) = - (PVOID) (uintn_t) (p_desc->ndis_csum.Value); - } else { - NDIS_TCP_IP_CHECKSUM_PACKET_INFO chksum; + (void*)(uintn_t)(p_desc->ndis_csum.Value); + break; + case CSUM_BYPASS: /* Flag the checksums as having been calculated. */ - chksum.Value = 0; chksum.Receive.NdisPacketTcpChecksumSucceeded = TRUE; chksum.Receive.NdisPacketUdpChecksumSucceeded = TRUE; chksum.Receive.NdisPacketIpChecksumSucceeded = TRUE; NDIS_PER_PACKET_INFO_FROM_PACKET( *pp_packet, TcpIpChecksumPacketInfo ) = (void*)(uintn_t)chksum.Value; + break; + default: + ASSERT(FALSE); + NDIS_PER_PACKET_INFO_FROM_PACKET( *pp_packet, TcpIpChecksumPacketInfo ) = + (void*)(uintn_t)chksum.Value; } ipoib_inc_recv_stat( p_port->p_adapter, type, p_desc->len );