Back to home page

OSCL-LXR

 
 

    


0001 /* SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) */
0002 /* Copyright (C) 2015-2019 Netronome Systems, Inc. */
0003 
0004 #ifndef _NFP_DP_NFD3_H_
0005 #define _NFP_DP_NFD3_H_
0006 
0007 struct sk_buff;
0008 struct net_device;
0009 
0010 /* TX descriptor format */
0011 
0012 #define NFD3_DESC_TX_EOP        BIT(7)
0013 #define NFD3_DESC_TX_OFFSET_MASK    GENMASK(6, 0)
0014 #define NFD3_DESC_TX_MSS_MASK       GENMASK(13, 0)
0015 
0016 /* Flags in the host TX descriptor */
0017 #define NFD3_DESC_TX_CSUM       BIT(7)
0018 #define NFD3_DESC_TX_IP4_CSUM       BIT(6)
0019 #define NFD3_DESC_TX_TCP_CSUM       BIT(5)
0020 #define NFD3_DESC_TX_UDP_CSUM       BIT(4)
0021 #define NFD3_DESC_TX_VLAN       BIT(3)
0022 #define NFD3_DESC_TX_LSO        BIT(2)
0023 #define NFD3_DESC_TX_ENCAP      BIT(1)
0024 #define NFD3_DESC_TX_O_IP4_CSUM BIT(0)
0025 
0026 struct nfp_nfd3_tx_desc {
0027     union {
0028         struct {
0029             u8 dma_addr_hi; /* High bits of host buf address */
0030             __le16 dma_len; /* Length to DMA for this desc */
0031             u8 offset_eop;  /* Offset in buf where pkt starts +
0032                      * highest bit is eop flag.
0033                      */
0034             __le32 dma_addr_lo; /* Low 32bit of host buf addr */
0035 
0036             __le16 mss; /* MSS to be used for LSO */
0037             u8 lso_hdrlen;  /* LSO, TCP payload offset */
0038             u8 flags;   /* TX Flags, see @NFD3_DESC_TX_* */
0039             union {
0040                 struct {
0041                     u8 l3_offset; /* L3 header offset */
0042                     u8 l4_offset; /* L4 header offset */
0043                 };
0044                 __le16 vlan; /* VLAN tag to add if indicated */
0045             };
0046             __le16 data_len; /* Length of frame + meta data */
0047         } __packed;
0048         __le32 vals[4];
0049         __le64 vals8[2];
0050     };
0051 };
0052 
0053 /**
0054  * struct nfp_nfd3_tx_buf - software TX buffer descriptor
0055  * @skb:    normal ring, sk_buff associated with this buffer
0056  * @frag:   XDP ring, page frag associated with this buffer
0057  * @xdp:    XSK buffer pool handle (for AF_XDP)
0058  * @dma_addr:   DMA mapping address of the buffer
0059  * @fidx:   Fragment index (-1 for the head and [0..nr_frags-1] for frags)
0060  * @pkt_cnt:    Number of packets to be produced out of the skb associated
0061  *      with this buffer (valid only on the head's buffer).
0062  *      Will be 1 for all non-TSO packets.
0063  * @is_xsk_tx:  Flag if buffer is a RX buffer after a XDP_TX action and not a
0064  *      buffer from the TX queue (for AF_XDP).
0065  * @real_len:   Number of bytes which to be produced out of the skb (valid only
0066  *      on the head's buffer). Equal to skb->len for non-TSO packets.
0067  */
0068 struct nfp_nfd3_tx_buf {
0069     union {
0070         struct sk_buff *skb;
0071         void *frag;
0072         struct xdp_buff *xdp;
0073     };
0074     dma_addr_t dma_addr;
0075     union {
0076         struct {
0077             short int fidx;
0078             u16 pkt_cnt;
0079         };
0080         struct {
0081             bool is_xsk_tx;
0082         };
0083     };
0084     u32 real_len;
0085 };
0086 
0087 void
0088 nfp_nfd3_rx_csum(const struct nfp_net_dp *dp, struct nfp_net_r_vector *r_vec,
0089          const struct nfp_net_rx_desc *rxd,
0090          const struct nfp_meta_parsed *meta, struct sk_buff *skb);
0091 bool
0092 nfp_nfd3_parse_meta(struct net_device *netdev, struct nfp_meta_parsed *meta,
0093             void *data, void *pkt, unsigned int pkt_len, int meta_len);
0094 void nfp_nfd3_tx_complete(struct nfp_net_tx_ring *tx_ring, int budget);
0095 int nfp_nfd3_poll(struct napi_struct *napi, int budget);
0096 netdev_tx_t nfp_nfd3_tx(struct sk_buff *skb, struct net_device *netdev);
0097 bool
0098 nfp_nfd3_ctrl_tx_one(struct nfp_net *nn, struct nfp_net_r_vector *r_vec,
0099              struct sk_buff *skb, bool old);
0100 void nfp_nfd3_ctrl_poll(struct tasklet_struct *t);
0101 void nfp_nfd3_rx_ring_fill_freelist(struct nfp_net_dp *dp,
0102                     struct nfp_net_rx_ring *rx_ring);
0103 void nfp_nfd3_xsk_tx_free(struct nfp_nfd3_tx_buf *txbuf);
0104 int nfp_nfd3_xsk_poll(struct napi_struct *napi, int budget);
0105 
0106 #endif