1 /* 2 * Copyright (c) 2021, The Linux Foundation. All rights reserved. 3 * 4 * Permission to use, copy, modify, and/or distribute this software for any 5 * purpose with or without fee is hereby granted, provided that the above 6 * copyright notice and this permission notice appear in all copies. 7 * 8 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 9 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 10 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 11 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 12 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 13 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 14 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 15 */ 16 17 #ifndef _DP_MON_2_0_H_ 18 #define _DP_MON_2_0_H_ 19 20 #if !defined(DISABLE_MON_CONFIG) 21 #include <qdf_lock.h> 22 #include <dp_types.h> 23 24 #define DP_MON_RING_FILL_LEVEL_DEFAULT 2048 25 #define DP_MON_DATA_BUFFER_SIZE 2048 26 27 /** 28 * struct dp_mon_filter_be - Monitor TLV filter 29 * @rx_tlv_filter: Rx MON TLV filter 30 * @tx_tlv_filter: Tx MON TLV filter 31 * @tx_valid: enable/disable Tx Mon TLV filter 32 */ 33 struct dp_mon_filter_be { 34 struct dp_mon_filter rx_tlv_filter; 35 struct htt_tx_ring_tlv_filter tx_tlv_filter; 36 bool tx_valid; 37 }; 38 39 /** 40 * struct dp_mon_desc 41 * 42 * @buf_addr: virtual address 43 * @paddr: physical address 44 * @in_use: desc is in use 45 * @unmapped: used to mark desc an unmapped if the corresponding 46 * nbuf is already unmapped 47 * @cookie: unique desc identifier 48 */ 49 struct dp_mon_desc { 50 uint8_t *buf_addr; 51 qdf_dma_addr_t paddr; 52 uint8_t in_use:1, 53 unmapped:1; 54 uint32_t cookie; 55 }; 56 57 /** 58 * struct dp_mon_desc_list_elem_t 59 * @next: Next pointer to form free list 60 * @mon_desc: DP mon descriptor 61 */ 62 union dp_mon_desc_list_elem_t { 63 union dp_mon_desc_list_elem_t *next; 64 struct dp_mon_desc mon_desc; 65 }; 66 67 /** 68 * struct dp_mon_desc_pool - monitor desc pool 69 * @pool_size: number of descriptor in the pool 70 * @array: pointer to array of descriptor 71 * @freelist: pointer to free descriptor list 72 * @lock: Protection for the descriptor pool 73 * @owner: owner for nbuf 74 * @buf_size: Buffer size 75 * @buf_alignment: Buffer alignment 76 */ 77 struct dp_mon_desc_pool { 78 uint32_t pool_size; 79 union dp_mon_desc_list_elem_t *array; 80 union dp_mon_desc_list_elem_t *freelist; 81 qdf_spinlock_t lock; 82 uint8_t owner; 83 uint16_t buf_size; 84 uint8_t buf_alignment; 85 }; 86 87 /** 88 * struct dp_mon_pdev_be - BE specific monitor pdev object 89 * @filter_be: Monitor Filter pointer 90 * @mon_pdev: monitor pdev structure 91 */ 92 struct dp_mon_pdev_be { 93 struct dp_mon_filter_be **filter_be; 94 struct dp_mon_pdev mon_pdev; 95 }; 96 97 /** 98 * struct dp_mon_soc_be - BE specific monitor soc 99 * @mon_soc: Monitor soc structure 100 * @tx_mon_buf_ring: TxMon replenish ring 101 * @tx_mon_dst_ring: TxMon Destination ring 102 * @tx_desc_mon: descriptor pool for tx mon src ring 103 * @rx_desc_mon: descriptor pool for rx mon src ring 104 * @rx_mon_ring_fill_level: rx mon ring refill level 105 * @tx_mon_ring_fill_level: tx mon ring refill level 106 */ 107 struct dp_mon_soc_be { 108 struct dp_mon_soc mon_soc; 109 /* Source ring for Tx monitor */ 110 struct dp_srng tx_mon_buf_ring; 111 struct dp_srng tx_mon_dst_ring[MAX_NUM_LMAC_HW]; 112 113 /* Sw descriptor pool for tx mon source ring */ 114 struct dp_mon_desc_pool tx_desc_mon; 115 /* Sw descriptor pool for rx mon source ring */ 116 struct dp_mon_desc_pool rx_desc_mon; 117 118 uint16_t rx_mon_ring_fill_level; 119 uint16_t tx_mon_ring_fill_level; 120 }; 121 #endif 122 123 /** 124 * dp_mon_desc_pool_init() - Monitor descriptor pool init 125 * @mon_desc_pool: mon desc pool 126 * 127 * Return: non-zero for failure, zero for success 128 */ 129 QDF_STATUS dp_mon_desc_pool_init(struct dp_mon_desc_pool *mon_desc_pool); 130 131 /* 132 * dp_mon_desc_pool_deinit()- monitor descriptor pool deinit 133 * @mon_desc_pool: mon desc pool 134 * 135 * Return: None 136 * 137 */ 138 void dp_mon_desc_pool_deinit(struct dp_mon_desc_pool *mon_desc_pool); 139 140 /* 141 * dp_mon_desc_pool_free()- monitor descriptor pool free 142 * @mon_desc_pool: mon desc pool 143 * 144 * Return: None 145 * 146 */ 147 void dp_mon_desc_pool_free(struct dp_mon_desc_pool *mon_desc_pool); 148 149 /** 150 * dp_mon_desc_pool_alloc() - Monitor descriptor pool alloc 151 * @mon_desc_pool: mon desc pool 152 * @pool_size: Pool size 153 * 154 * Return: non-zero for failure, zero for success 155 */ 156 QDF_STATUS dp_mon_desc_pool_alloc(uint32_t pool_size, 157 struct dp_mon_desc_pool *mon_desc_pool); 158 159 /* 160 * dp_mon_pool_frag_unmap_and_free() - free the mon desc frag called during 161 * de-initialization of wifi module. 162 * 163 * @soc: DP soc handle 164 * @mon_desc_pool: monitor descriptor pool pointer 165 * 166 * Return: None 167 */ 168 void dp_mon_pool_frag_unmap_and_free(struct dp_soc *dp_soc, 169 struct dp_mon_desc_pool *mon_desc_pool); 170 171 /* 172 * dp_mon_buffers_replenish() - replenish monitor ring with nbufs 173 * 174 * @soc: core txrx main context 175 * @dp_mon_srng: dp monitor circular ring 176 * @mon_desc_pool: Pointer to free mon descriptor pool 177 * @num_req_buffers: number of buffer to be replenished 178 * @desc_list: list of descs if called from dp_rx_process 179 * or NULL during dp rx initialization or out of buffer 180 * interrupt. 181 * @tail: tail of descs list 182 * 183 * Return: return success or failure 184 */ 185 QDF_STATUS dp_mon_buffers_replenish(struct dp_soc *dp_soc, 186 struct dp_srng *dp_mon_srng, 187 struct dp_mon_desc_pool *mon_desc_pool, 188 uint32_t num_req_buffers, 189 union dp_mon_desc_list_elem_t **desc_list, 190 union dp_mon_desc_list_elem_t **tail); 191 192 /** 193 * dp_mon_filter_show_filter_be() - Show the set filters 194 * @pdev: DP pdev handle 195 * @mode: The filter modes 196 * @tlv_filter: tlv filter 197 */ 198 void dp_mon_filter_show_filter_be(struct dp_mon_pdev *mon_pdev, 199 enum dp_mon_filter_mode mode, 200 struct dp_mon_filter_be *filter); 201 #endif /* _DP_MON_2_0_H_ */ 202