115 lines · c
1/* SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) */2/* Copyright (C) 2015-2019 Netronome Systems, Inc. */3 4#ifndef _NFP_DP_NFD3_H_5#define _NFP_DP_NFD3_H_6 7struct sk_buff;8struct net_device;9 10/* TX descriptor format */11 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)15 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)25 26struct nfp_nfd3_tx_desc {27 union {28 struct {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.33 */34 __le32 dma_addr_lo; /* Low 32bit of host buf addr */35 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_* */39 union {40 struct {41 u8 l3_offset; /* L3 header offset */42 u8 l4_offset; /* L4 header offset */43 };44 __le16 vlan; /* VLAN tag to add if indicated */45 };46 __le16 data_len; /* Length of frame + meta data */47 } __packed;48 __le32 vals[4];49 __le64 vals8[2];50 };51};52 53/**54 * struct nfp_nfd3_tx_buf - software TX buffer descriptor55 * @skb: normal ring, sk_buff associated with this buffer56 * @frag: XDP ring, page frag associated with this buffer57 * @xdp: XSK buffer pool handle (for AF_XDP)58 * @dma_addr: DMA mapping address of the buffer59 * @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 associated61 * 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 a64 * buffer from the TX queue (for AF_XDP).65 * @real_len: Number of bytes which to be produced out of the skb (valid only66 * on the head's buffer). Equal to skb->len for non-TSO packets.67 */68struct nfp_nfd3_tx_buf {69 union {70 struct sk_buff *skb;71 void *frag;72 struct xdp_buff *xdp;73 };74 dma_addr_t dma_addr;75 union {76 struct {77 short int fidx;78 u16 pkt_cnt;79 };80 struct {81 bool is_xsk_tx;82 };83 };84 u32 real_len;85};86 87void88nfp_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);91bool92nfp_nfd3_parse_meta(struct net_device *netdev, struct nfp_meta_parsed *meta,93 void *data, void *pkt, unsigned int pkt_len, int meta_len);94void nfp_nfd3_tx_complete(struct nfp_net_tx_ring *tx_ring, int budget);95int nfp_nfd3_poll(struct napi_struct *napi, int budget);96netdev_tx_t nfp_nfd3_tx(struct sk_buff *skb, struct net_device *netdev);97bool98nfp_nfd3_ctrl_tx_one(struct nfp_net *nn, struct nfp_net_r_vector *r_vec,99 struct sk_buff *skb, bool old);100void nfp_nfd3_ctrl_poll(struct tasklet_struct *t);101void nfp_nfd3_rx_ring_fill_freelist(struct nfp_net_dp *dp,102 struct nfp_net_rx_ring *rx_ring);103void nfp_nfd3_xsk_tx_free(struct nfp_nfd3_tx_buf *txbuf);104int nfp_nfd3_xsk_poll(struct napi_struct *napi, int budget);105 106#ifndef CONFIG_NFP_NET_IPSEC107static inline void nfp_nfd3_ipsec_tx(struct nfp_nfd3_tx_desc *txd, struct sk_buff *skb)108{109}110#else111void nfp_nfd3_ipsec_tx(struct nfp_nfd3_tx_desc *txd, struct sk_buff *skb);112#endif113 114#endif115