Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

bnx2x: Fix GSO for 57710/57711 chips

Starting with commit 91226790bbe2dbfbba48dd79d49f2b38ef10eb97
`bnx2x: use FW 7.8.17', the bnx2x driver no longer requests the FW to perform
IP checksums for IPv4 packets.

This behaviour needs to be revised for 57710/57711 chips -
when using GSO, if the driver will not set the IP checksum flag then packets
will be transmitted by the chip without a valid IP checksum, resulting in
a drop of all such packets on the receiver-side.

Signed-off-by: Yuval Mintz <yuvalmin@broadcom.com>
Signed-off-by: Dmitry Kravkov <dmitry@broadcom.com>
Signed-off-by: Eilon Greenstein <eilong@broadcom.com>
Signed-off-by: David S. Miller <davem@davemloft.net>

authored by

Yuval Mintz and committed by
David S. Miller
057cf65e 96f5a846

+7 -2
+7 -2
drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.c
··· 3313 3313 */ 3314 3314 static void bnx2x_set_pbd_gso(struct sk_buff *skb, 3315 3315 struct eth_tx_parse_bd_e1x *pbd, 3316 + struct eth_tx_start_bd *tx_start_bd, 3316 3317 u32 xmit_type) 3317 3318 { 3318 3319 pbd->lso_mss = cpu_to_le16(skb_shinfo(skb)->gso_size); ··· 3327 3326 ip_hdr(skb)->daddr, 3328 3327 0, IPPROTO_TCP, 0)); 3329 3328 3330 - } else 3329 + /* GSO on 57710/57711 needs FW to calculate IP checksum */ 3330 + tx_start_bd->bd_flags.as_bitfield |= ETH_TX_BD_FLAGS_IP_CSUM; 3331 + } else { 3331 3332 pbd->tcp_pseudo_csum = 3332 3333 bswab16(~csum_ipv6_magic(&ipv6_hdr(skb)->saddr, 3333 3334 &ipv6_hdr(skb)->daddr, 3334 3335 0, IPPROTO_TCP, 0)); 3336 + } 3335 3337 3336 3338 pbd->global_data |= 3337 3339 cpu_to_le16(ETH_TX_PARSE_BD_E1X_PSEUDO_CS_WITHOUT_LEN); ··· 3818 3814 bnx2x_set_pbd_gso_e2(skb, &pbd_e2_parsing_data, 3819 3815 xmit_type); 3820 3816 else 3821 - bnx2x_set_pbd_gso(skb, pbd_e1x, xmit_type); 3817 + bnx2x_set_pbd_gso(skb, pbd_e1x, tx_start_bd, 3818 + xmit_type); 3822 3819 } 3823 3820 3824 3821 /* Set the PBD's parsing_data field if not zero