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