root/drivers/net/ethernet/aquantia/atlantic/aq_ring.h

/* [<][>][^][v][top][bottom][index][help] */

INCLUDED FROM


DEFINITIONS

This source file includes following definitions.
  1. aq_buf_vaddr
  2. aq_buf_daddr
  3. aq_ring_next_dx
  4. aq_ring_avail_dx

   1 /* SPDX-License-Identifier: GPL-2.0-only */
   2 /*
   3  * aQuantia Corporation Network Driver
   4  * Copyright (C) 2014-2017 aQuantia Corporation. All rights reserved
   5  */
   6 
   7 /* File aq_ring.h: Declaration of functions for Rx/Tx rings. */
   8 
   9 #ifndef AQ_RING_H
  10 #define AQ_RING_H
  11 
  12 #include "aq_common.h"
  13 
  14 struct page;
  15 struct aq_nic_cfg_s;
  16 
  17 struct aq_rxpage {
  18         struct page *page;
  19         dma_addr_t daddr;
  20         unsigned int order;
  21         unsigned int pg_off;
  22 };
  23 
  24 /*           TxC       SOP        DX         EOP
  25  *         +----------+----------+----------+-----------
  26  *   8bytes|len l3,l4 | pa       | pa       | pa
  27  *         +----------+----------+----------+-----------
  28  * 4/8bytes|len pkt   |len pkt   |          | skb
  29  *         +----------+----------+----------+-----------
  30  * 4/8bytes|is_gso    |len,flags |len       |len,is_eop
  31  *         +----------+----------+----------+-----------
  32  *
  33  *  This aq_ring_buff_s doesn't have endianness dependency.
  34  *  It is __packed for cache line optimizations.
  35  */
  36 struct __packed aq_ring_buff_s {
  37         union {
  38                 /* RX/TX */
  39                 dma_addr_t pa;
  40                 /* RX */
  41                 struct {
  42                         u32 rss_hash;
  43                         u16 next;
  44                         u8 is_hash_l4;
  45                         u8 rsvd1;
  46                         struct aq_rxpage rxdata;
  47                         u16 vlan_rx_tag;
  48                 };
  49                 /* EOP */
  50                 struct {
  51                         dma_addr_t pa_eop;
  52                         struct sk_buff *skb;
  53                 };
  54                 /* TxC */
  55                 struct {
  56                         u32 mss;
  57                         u8 len_l2;
  58                         u8 len_l3;
  59                         u8 len_l4;
  60                         u8 is_ipv6:1;
  61                         u8 rsvd2:7;
  62                         u32 len_pkt;
  63                         u16 vlan_tx_tag;
  64                 };
  65         };
  66         union {
  67                 struct {
  68                         u16 len;
  69                         u32 is_ip_cso:1;
  70                         u32 is_udp_cso:1;
  71                         u32 is_tcp_cso:1;
  72                         u32 is_cso_err:1;
  73                         u32 is_sop:1;
  74                         u32 is_eop:1;
  75                         u32 is_gso:1;
  76                         u32 is_mapped:1;
  77                         u32 is_cleaned:1;
  78                         u32 is_error:1;
  79                         u32 is_vlan:1;
  80                         u32 rsvd3:5;
  81                         u16 eop_index;
  82                         u16 rsvd4;
  83                 };
  84                 u64 flags;
  85         };
  86 };
  87 
  88 struct aq_ring_stats_rx_s {
  89         u64 errors;
  90         u64 packets;
  91         u64 bytes;
  92         u64 lro_packets;
  93         u64 jumbo_packets;
  94         u64 pg_losts;
  95         u64 pg_flips;
  96         u64 pg_reuses;
  97 };
  98 
  99 struct aq_ring_stats_tx_s {
 100         u64 errors;
 101         u64 packets;
 102         u64 bytes;
 103         u64 queue_restarts;
 104 };
 105 
 106 union aq_ring_stats_s {
 107         struct aq_ring_stats_rx_s rx;
 108         struct aq_ring_stats_tx_s tx;
 109 };
 110 
 111 struct aq_ring_s {
 112         struct aq_ring_buff_s *buff_ring;
 113         u8 *dx_ring;            /* descriptors ring, dma shared mem */
 114         struct aq_nic_s *aq_nic;
 115         unsigned int idx;       /* for HW layer registers operations */
 116         unsigned int hw_head;
 117         unsigned int sw_head;
 118         unsigned int sw_tail;
 119         unsigned int size;      /* descriptors number */
 120         unsigned int dx_size;   /* TX or RX descriptor size,  */
 121                                 /* stored here for fater math */
 122         unsigned int page_order;
 123         union aq_ring_stats_s stats;
 124         dma_addr_t dx_ring_pa;
 125 };
 126 
 127 struct aq_ring_param_s {
 128         unsigned int vec_idx;
 129         unsigned int cpu;
 130         cpumask_t affinity_mask;
 131 };
 132 
 133 static inline void *aq_buf_vaddr(struct aq_rxpage *rxpage)
 134 {
 135         return page_to_virt(rxpage->page) + rxpage->pg_off;
 136 }
 137 
 138 static inline dma_addr_t aq_buf_daddr(struct aq_rxpage *rxpage)
 139 {
 140         return rxpage->daddr + rxpage->pg_off;
 141 }
 142 
 143 static inline unsigned int aq_ring_next_dx(struct aq_ring_s *self,
 144                                            unsigned int dx)
 145 {
 146         return (++dx >= self->size) ? 0U : dx;
 147 }
 148 
 149 static inline unsigned int aq_ring_avail_dx(struct aq_ring_s *self)
 150 {
 151         return (((self->sw_tail >= self->sw_head)) ?
 152                 (self->size - 1) - self->sw_tail + self->sw_head :
 153                 self->sw_head - self->sw_tail - 1);
 154 }
 155 
 156 struct aq_ring_s *aq_ring_tx_alloc(struct aq_ring_s *self,
 157                                    struct aq_nic_s *aq_nic,
 158                                    unsigned int idx,
 159                                    struct aq_nic_cfg_s *aq_nic_cfg);
 160 struct aq_ring_s *aq_ring_rx_alloc(struct aq_ring_s *self,
 161                                    struct aq_nic_s *aq_nic,
 162                                    unsigned int idx,
 163                                    struct aq_nic_cfg_s *aq_nic_cfg);
 164 int aq_ring_init(struct aq_ring_s *self);
 165 void aq_ring_rx_deinit(struct aq_ring_s *self);
 166 void aq_ring_free(struct aq_ring_s *self);
 167 void aq_ring_update_queue_state(struct aq_ring_s *ring);
 168 void aq_ring_queue_wake(struct aq_ring_s *ring);
 169 void aq_ring_queue_stop(struct aq_ring_s *ring);
 170 bool aq_ring_tx_clean(struct aq_ring_s *self);
 171 int aq_ring_rx_clean(struct aq_ring_s *self,
 172                      struct napi_struct *napi,
 173                      int *work_done,
 174                      int budget);
 175 int aq_ring_rx_fill(struct aq_ring_s *self);
 176 
 177 #endif /* AQ_RING_H */

/* [<][>][^][v][top][bottom][index][help] */