1*d48523cbSMartin Habets /* SPDX-License-Identifier: GPL-2.0-only */ 2*d48523cbSMartin Habets /**************************************************************************** 3*d48523cbSMartin Habets * Driver for Solarflare network controllers and boards 4*d48523cbSMartin Habets * Copyright 2005-2006 Fen Systems Ltd. 5*d48523cbSMartin Habets * Copyright 2006-2015 Solarflare Communications Inc. 6*d48523cbSMartin Habets */ 7*d48523cbSMartin Habets 8*d48523cbSMartin Habets #ifndef EFX_TX_H 9*d48523cbSMartin Habets #define EFX_TX_H 10*d48523cbSMartin Habets 11*d48523cbSMartin Habets #include <linux/types.h> 12*d48523cbSMartin Habets 13*d48523cbSMartin Habets /* Driver internal tx-path related declarations. */ 14*d48523cbSMartin Habets /* What TXQ type will satisfy the checksum offloads required for this skb? */ efx_tx_csum_type_skb(struct sk_buff * skb)15*d48523cbSMartin Habetsstatic inline unsigned int efx_tx_csum_type_skb(struct sk_buff *skb) 16*d48523cbSMartin Habets { 17*d48523cbSMartin Habets if (skb->ip_summed != CHECKSUM_PARTIAL) 18*d48523cbSMartin Habets return 0; /* no checksum offload */ 19*d48523cbSMartin Habets 20*d48523cbSMartin Habets if (skb->encapsulation && 21*d48523cbSMartin Habets skb_checksum_start_offset(skb) == skb_inner_transport_offset(skb)) { 22*d48523cbSMartin Habets /* we only advertise features for IPv4 and IPv6 checksums on 23*d48523cbSMartin Habets * encapsulated packets, so if the checksum is for the inner 24*d48523cbSMartin Habets * packet, it must be one of them; no further checking required. 25*d48523cbSMartin Habets */ 26*d48523cbSMartin Habets 27*d48523cbSMartin Habets /* Do we also need to offload the outer header checksum? */ 28*d48523cbSMartin Habets if (skb_shinfo(skb)->gso_segs > 1 && 29*d48523cbSMartin Habets !(skb_shinfo(skb)->gso_type & SKB_GSO_PARTIAL) && 30*d48523cbSMartin Habets (skb_shinfo(skb)->gso_type & SKB_GSO_UDP_TUNNEL_CSUM)) 31*d48523cbSMartin Habets return EFX_TXQ_TYPE_OUTER_CSUM | EFX_TXQ_TYPE_INNER_CSUM; 32*d48523cbSMartin Habets return EFX_TXQ_TYPE_INNER_CSUM; 33*d48523cbSMartin Habets } 34*d48523cbSMartin Habets 35*d48523cbSMartin Habets /* similarly, we only advertise features for IPv4 and IPv6 checksums, 36*d48523cbSMartin Habets * so it must be one of them. No need for further checks. 37*d48523cbSMartin Habets */ 38*d48523cbSMartin Habets return EFX_TXQ_TYPE_OUTER_CSUM; 39*d48523cbSMartin Habets } 40*d48523cbSMartin Habets #endif /* EFX_TX_H */ 41