From: Michal Schmidt <mschmidt@redhat.com> Date: Fri, 3 Sep 2010 16:43:43 -0400 Subject: [net] bnx2x: set RXHASH for LRO packets Message-id: <20100903164343.25415.2726.stgit@brian.englab.brq.redhat.com> Patchwork-id: 28106 O-Subject: [RHEL5.6 BZ572012 PATCH 31/46] bnx2x: Set RXHASH for LRO packets Bugzilla: 572012 RH-Acked-by: David S. Miller <davem@redhat.com> RH-Acked-by: Stanislaw Gruszka <sgruszka@redhat.com> Set Toeplitz hash both for LRO and none-LRO skbs. The first CQE (TPA_START) will contain a hash for an LRO packet. Current code sets skb->rx_hash for none-LRO skbs only. Signed-off-by: Vladislav Zolotarov <vladz@broadcom.com> Signed-off-by: Eilon Greenstein <eilong@broadcom.com> Signed-off-by: David S. Miller <davem@davemloft.net> (cherry picked from commit 6f3c72a2148f5f99c4dcc97cbcea06916136c862) RHEL: not really, no rxhash in RHEL Conflicts: drivers/net/bnx2x_main.c diff --git a/drivers/net/bnx2x_main.c b/drivers/net/bnx2x_main.c index 9890c27..26f643f 100644 --- a/drivers/net/bnx2x_main.c +++ b/drivers/net/bnx2x_main.c @@ -1541,6 +1541,22 @@ static inline void bnx2x_update_rx_prod(struct bnx2x *bp, fp->index, bd_prod, rx_comp_prod, rx_sge_prod); } +/* Set Toeplitz hash value in the skb using the value from the + * CQE (calculated by HW). + */ +static inline void bnx2x_set_skb_rxhash(struct bnx2x *bp, union eth_rx_cqe *cqe, + struct sk_buff *skb) +{ +#if 0 /* not in RHEL */ + /* Set Toeplitz hash from CQE */ + if ((bp->dev->features & NETIF_F_RXHASH) && + (cqe->fast_path_cqe.status_flags & + ETH_FAST_PATH_RX_CQE_RSS_HASH_FLG)) + skb->rxhash = + le32_to_cpu(cqe->fast_path_cqe.rss_hash_result); +#endif +} + static int bnx2x_rx_int(struct bnx2x_fastpath *fp, int budget) { struct bnx2x *bp = fp->bp; @@ -1578,7 +1594,7 @@ static int bnx2x_rx_int(struct bnx2x_fastpath *fp, int budget) struct sw_rx_bd *rx_buf = NULL; struct sk_buff *skb; union eth_rx_cqe *cqe; - u8 cqe_fp_flags, cqe_fp_status_flags; + u8 cqe_fp_flags; u16 len, pad; comp_ring_cons = RCQ_BD(sw_comp_cons); @@ -1594,7 +1610,6 @@ static int bnx2x_rx_int(struct bnx2x_fastpath *fp, int budget) cqe = &fp->rx_comp_ring[comp_ring_cons]; cqe_fp_flags = cqe->fast_path_cqe.type_error_flags; - cqe_fp_status_flags = cqe->fast_path_cqe.status_flags; DP(NETIF_MSG_RX_STATUS, "CQE type %x err %x status %x" " queue %x vlan %x len %u\n", CQE_TYPE(cqe_fp_flags), @@ -1630,6 +1645,10 @@ static int bnx2x_rx_int(struct bnx2x_fastpath *fp, int budget) bnx2x_tpa_start(fp, queue, skb, bd_cons, bd_prod); + + /* Set Toeplitz hash for an LRO skb */ + bnx2x_set_skb_rxhash(bp, cqe, skb); + goto next_rx; } @@ -1722,13 +1741,8 @@ reuse_rx: skb->protocol = eth_type_trans(skb, bp->dev); -#if 0 /* not in RHEL */ - if ((bp->dev->features & NETIF_F_RXHASH) && - (cqe_fp_status_flags & - ETH_FAST_PATH_RX_CQE_RSS_HASH_FLG)) - skb->rxhash = le32_to_cpu( - cqe->fast_path_cqe.rss_hash_result); -#endif + /* Set Toeplitz hash for a none-LRO skb */ + bnx2x_set_skb_rxhash(bp, cqe, skb); skb->ip_summed = CHECKSUM_NONE; if (bp->rx_csum) {