1 /* SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) */
2 /* Copyright (C) 2015-2019 Netronome Systems, Inc. */
4 #ifndef _NFP_DP_NFD3_H_
5 #define _NFP_DP_NFD3_H_
10 /* TX descriptor format */
12 #define NFD3_DESC_TX_EOP BIT(7)
13 #define NFD3_DESC_TX_OFFSET_MASK GENMASK(6, 0)
14 #define NFD3_DESC_TX_MSS_MASK GENMASK(13, 0)
16 /* Flags in the host TX descriptor */
17 #define NFD3_DESC_TX_CSUM BIT(7)
18 #define NFD3_DESC_TX_IP4_CSUM BIT(6)
19 #define NFD3_DESC_TX_TCP_CSUM BIT(5)
20 #define NFD3_DESC_TX_UDP_CSUM BIT(4)
21 #define NFD3_DESC_TX_VLAN BIT(3)
22 #define NFD3_DESC_TX_LSO BIT(2)
23 #define NFD3_DESC_TX_ENCAP BIT(1)
24 #define NFD3_DESC_TX_O_IP4_CSUM BIT(0)
26 struct nfp_nfd3_tx_desc
{
29 u8 dma_addr_hi
; /* High bits of host buf address */
30 __le16 dma_len
; /* Length to DMA for this desc */
31 u8 offset_eop
; /* Offset in buf where pkt starts +
32 * highest bit is eop flag.
34 __le32 dma_addr_lo
; /* Low 32bit of host buf addr */
36 __le16 mss
; /* MSS to be used for LSO */
37 u8 lso_hdrlen
; /* LSO, TCP payload offset */
38 u8 flags
; /* TX Flags, see @NFD3_DESC_TX_* */
41 u8 l3_offset
; /* L3 header offset */
42 u8 l4_offset
; /* L4 header offset */
44 __le16 vlan
; /* VLAN tag to add if indicated */
46 __le16 data_len
; /* Length of frame + meta data */
54 * struct nfp_nfd3_tx_buf - software TX buffer descriptor
55 * @skb: normal ring, sk_buff associated with this buffer
56 * @frag: XDP ring, page frag associated with this buffer
57 * @xdp: XSK buffer pool handle (for AF_XDP)
58 * @dma_addr: DMA mapping address of the buffer
59 * @fidx: Fragment index (-1 for the head and [0..nr_frags-1] for frags)
60 * @pkt_cnt: Number of packets to be produced out of the skb associated
61 * with this buffer (valid only on the head's buffer).
62 * Will be 1 for all non-TSO packets.
63 * @is_xsk_tx: Flag if buffer is a RX buffer after a XDP_TX action and not a
64 * buffer from the TX queue (for AF_XDP).
65 * @real_len: Number of bytes which to be produced out of the skb (valid only
66 * on the head's buffer). Equal to skb->len for non-TSO packets.
68 struct nfp_nfd3_tx_buf
{
88 nfp_nfd3_rx_csum(const struct nfp_net_dp
*dp
, struct nfp_net_r_vector
*r_vec
,
89 const struct nfp_net_rx_desc
*rxd
,
90 const struct nfp_meta_parsed
*meta
, struct sk_buff
*skb
);
92 nfp_nfd3_parse_meta(struct net_device
*netdev
, struct nfp_meta_parsed
*meta
,
93 void *data
, void *pkt
, unsigned int pkt_len
, int meta_len
);
94 void nfp_nfd3_tx_complete(struct nfp_net_tx_ring
*tx_ring
, int budget
);
95 int nfp_nfd3_poll(struct napi_struct
*napi
, int budget
);
96 netdev_tx_t
nfp_nfd3_tx(struct sk_buff
*skb
, struct net_device
*netdev
);
98 nfp_nfd3_ctrl_tx_one(struct nfp_net
*nn
, struct nfp_net_r_vector
*r_vec
,
99 struct sk_buff
*skb
, bool old
);
100 void nfp_nfd3_ctrl_poll(struct tasklet_struct
*t
);
101 void nfp_nfd3_rx_ring_fill_freelist(struct nfp_net_dp
*dp
,
102 struct nfp_net_rx_ring
*rx_ring
);
103 void nfp_nfd3_xsk_tx_free(struct nfp_nfd3_tx_buf
*txbuf
);
104 int nfp_nfd3_xsk_poll(struct napi_struct
*napi
, int budget
);
106 #ifndef CONFIG_NFP_NET_IPSEC
107 static inline void nfp_nfd3_ipsec_tx(struct nfp_nfd3_tx_desc
*txd
, struct sk_buff
*skb
)
111 void nfp_nfd3_ipsec_tx(struct nfp_nfd3_tx_desc
*txd
, struct sk_buff
*skb
);