Branch data Line data Source code
1 : : /* SPDX-License-Identifier: GPL-2.0-only */ 2 : : /* 3 : : * aQuantia Corporation Network Driver 4 : : * Copyright (C) 2014-2019 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 : : u32 len:16; 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_tcp:1; 76 : : u32 is_gso_udp:1; 77 : : u32 is_mapped:1; 78 : : u32 is_cleaned:1; 79 : : u32 is_error:1; 80 : : u32 is_vlan:1; 81 : : u32 is_lro:1; 82 : : u32 rsvd3:3; 83 : : u16 eop_index; 84 : : u16 rsvd4; 85 : : }; 86 : : u64 flags; 87 : : }; 88 : : }; 89 : : 90 : : struct aq_ring_stats_rx_s { 91 : : u64 errors; 92 : : u64 packets; 93 : : u64 bytes; 94 : : u64 lro_packets; 95 : : u64 jumbo_packets; 96 : : u64 pg_losts; 97 : : u64 pg_flips; 98 : : u64 pg_reuses; 99 : : }; 100 : : 101 : : struct aq_ring_stats_tx_s { 102 : : u64 errors; 103 : : u64 packets; 104 : : u64 bytes; 105 : : u64 queue_restarts; 106 : : }; 107 : : 108 : : union aq_ring_stats_s { 109 : : struct aq_ring_stats_rx_s rx; 110 : : struct aq_ring_stats_tx_s tx; 111 : : }; 112 : : 113 : : struct aq_ring_s { 114 : : struct aq_ring_buff_s *buff_ring; 115 : : u8 *dx_ring; /* descriptors ring, dma shared mem */ 116 : : struct aq_nic_s *aq_nic; 117 : : unsigned int idx; /* for HW layer registers operations */ 118 : : unsigned int hw_head; 119 : : unsigned int sw_head; 120 : : unsigned int sw_tail; 121 : : unsigned int size; /* descriptors number */ 122 : : unsigned int dx_size; /* TX or RX descriptor size, */ 123 : : /* stored here for fater math */ 124 : : unsigned int page_order; 125 : : union aq_ring_stats_s stats; 126 : : dma_addr_t dx_ring_pa; 127 : : }; 128 : : 129 : : struct aq_ring_param_s { 130 : : unsigned int vec_idx; 131 : : unsigned int cpu; 132 : : cpumask_t affinity_mask; 133 : : }; 134 : : 135 : 0 : static inline void *aq_buf_vaddr(struct aq_rxpage *rxpage) 136 : : { 137 [ # # ]: 0 : return page_to_virt(rxpage->page) + rxpage->pg_off; 138 : : } 139 : : 140 : 67551 : static inline dma_addr_t aq_buf_daddr(struct aq_rxpage *rxpage) 141 : : { 142 [ - + ]: 67551 : return rxpage->daddr + rxpage->pg_off; 143 : : } 144 : : 145 : 1210661 : static inline unsigned int aq_ring_next_dx(struct aq_ring_s *self, 146 : : unsigned int dx) 147 : : { 148 [ - + - + : 1210661 : return (++dx >= self->size) ? 0U : dx; - - - + + + - + ] 149 : : } 150 : : 151 : 13099 : static inline unsigned int aq_ring_avail_dx(struct aq_ring_s *self) 152 : : { 153 [ + + ]: 4420 : return (((self->sw_tail >= self->sw_head)) ? 154 [ + - + + ]: 8679 : (self->size - 1) - self->sw_tail + self->sw_head : 155 : 4221 : self->sw_head - self->sw_tail - 1); 156 : : } 157 : : 158 : : struct aq_ring_s *aq_ring_tx_alloc(struct aq_ring_s *self, 159 : : struct aq_nic_s *aq_nic, 160 : : unsigned int idx, 161 : : struct aq_nic_cfg_s *aq_nic_cfg); 162 : : struct aq_ring_s *aq_ring_rx_alloc(struct aq_ring_s *self, 163 : : struct aq_nic_s *aq_nic, 164 : : unsigned int idx, 165 : : struct aq_nic_cfg_s *aq_nic_cfg); 166 : : int aq_ring_init(struct aq_ring_s *self); 167 : : void aq_ring_rx_deinit(struct aq_ring_s *self); 168 : : void aq_ring_free(struct aq_ring_s *self); 169 : : void aq_ring_update_queue_state(struct aq_ring_s *ring); 170 : : void aq_ring_queue_wake(struct aq_ring_s *ring); 171 : : void aq_ring_queue_stop(struct aq_ring_s *ring); 172 : : bool aq_ring_tx_clean(struct aq_ring_s *self); 173 : : int aq_ring_rx_clean(struct aq_ring_s *self, 174 : : struct napi_struct *napi, 175 : : int *work_done, 176 : : int budget); 177 : : int aq_ring_rx_fill(struct aq_ring_s *self); 178 : : 179 : : struct aq_ring_s *aq_ring_hwts_rx_alloc(struct aq_ring_s *self, 180 : : struct aq_nic_s *aq_nic, unsigned int idx, 181 : : unsigned int size, unsigned int dx_size); 182 : : void aq_ring_hwts_rx_clean(struct aq_ring_s *self, struct aq_nic_s *aq_nic); 183 : : 184 : : #endif /* AQ_RING_H */