1 /* 2 * Copyright (c) 2020-2021, The Linux Foundation. All rights reserved. 3 * Copyright (c) 2022-2024 Qualcomm Innovation Center, Inc. All rights reserved. 4 * 5 * Permission to use, copy, modify, and/or distribute this software for any 6 * purpose with or without fee is hereby granted, provided that the above 7 * copyright notice and this permission notice appear in all copies. 8 * 9 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 10 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 11 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 12 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 13 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 14 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 15 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 16 */ 17 18 #ifndef __WLAN_DP_FISA_RX_H__ 19 #define __WLAN_DP_FISA_RX_H__ 20 21 #ifdef WLAN_SUPPORT_RX_FISA 22 #include <dp_types.h> 23 #endif 24 #include <qdf_status.h> 25 #include <wlan_dp_priv.h> 26 27 //#define FISA_DEBUG_ENABLE 28 29 #ifdef FISA_DEBUG_ENABLE 30 #define dp_fisa_debug dp_info 31 #else 32 #define dp_fisa_debug(params...) 33 #endif 34 35 #if defined(WLAN_SUPPORT_RX_FISA) 36 37 /* 38 * Below is different types of max MSDU aggregation supported in FISA. 39 * Host should send one value less so that F.W will increment one 40 * and program in RXOLE reg 41 */ 42 #define DP_RX_FISA_MAX_AGGR_COUNT_DEFAULT (16 - 1) 43 #define DP_RX_FISA_MAX_AGGR_COUNT_1 (32 - 1) 44 45 #define FSE_CACHE_FLUSH_TIME_OUT 5 /* milliSeconds */ 46 #define FISA_UDP_MAX_DATA_LEN 1470 /* udp max data length */ 47 #define FISA_UDP_HDR_LEN 8 /* udp header length */ 48 /* single packet max cumulative ip length */ 49 #define FISA_MAX_SINGLE_CUMULATIVE_IP_LEN \ 50 (FISA_UDP_MAX_DATA_LEN + FISA_UDP_HDR_LEN) 51 /* max flow cumulative ip length */ 52 #define FISA_FLOW_MAX_CUMULATIVE_IP_LEN \ 53 (FISA_MAX_SINGLE_CUMULATIVE_IP_LEN * FISA_FLOW_MAX_AGGR_COUNT) 54 55 /* minimal pure UDP data length required for FISA */ 56 #define FISA_MIN_UDP_DATA_LEN 64 57 /* minimal length without L2/L3 header required for FISA */ 58 #define FISA_MIN_L4_AND_DATA_LEN \ 59 (FISA_UDP_HDR_LEN + FISA_MIN_UDP_DATA_LEN) 60 61 /* CMEM size for FISA FST 16K */ 62 #define DP_CMEM_FST_SIZE 16384 63 64 #define IPSEC_PORT 500 65 #define IPSEC_NAT_PORT 4500 66 #define DNS_SERVER_PORT 53 67 68 #define DP_FT_LOCK_MAX_RECORDS 32 69 70 #define FISA_FT_ENTRY_AGING_US 1000000 71 72 struct dp_fisa_rx_fst_update_elem { 73 /* Do not add new entries here */ 74 qdf_list_node_t node; 75 struct cdp_rx_flow_tuple_info flow_tuple_info; 76 struct dp_vdev *vdev; 77 uint8_t vdev_id; 78 uint32_t flow_idx; 79 uint32_t reo_dest_indication; 80 bool is_tcp_flow; 81 bool is_udp_flow; 82 u8 reo_id; 83 }; 84 85 enum dp_ft_lock_event_type { 86 DP_FT_LOCK_EVENT, 87 DP_FT_UNLOCK_EVENT, 88 }; 89 90 struct dp_ft_lock_record { 91 const char *func; 92 int cpu_id; 93 uint64_t timestamp; 94 enum dp_ft_lock_event_type type; 95 }; 96 97 struct dp_ft_lock_history { 98 uint32_t record_idx; 99 struct dp_ft_lock_record ft_lock_rec[DP_FT_LOCK_MAX_RECORDS]; 100 }; 101 102 /** 103 * dp_fisa_rx() - FISA Rx packet delivery entry function 104 * @dp_ctx: DP component handle 105 * @vdev: core txrx vdev 106 * @nbuf_list: Delivery list of nbufs 107 * 108 * Return: Success on aggregation 109 */ 110 QDF_STATUS dp_fisa_rx(struct wlan_dp_psoc_context *dp_ctx, 111 struct dp_vdev *vdev, 112 qdf_nbuf_t nbuf_list); 113 114 /** 115 * dp_rx_fisa_flush_by_ctx_id() - FISA Rx flush function to flush 116 * aggregation at end of NAPI 117 * @soc: core txrx main context 118 * @napi_id: Flows which are rxed on the NAPI ID to be flushed 119 * 120 * Return: QDF_STATUS 121 */ 122 QDF_STATUS dp_rx_fisa_flush_by_ctx_id(struct dp_soc *soc, int napi_id); 123 124 /** 125 * dp_rx_fisa_flush_by_vdev_id() - Flush fisa aggregates per vdev id 126 * @soc: core txrx main context 127 * @vdev_id: vdev ID 128 * 129 * Return: Success on flushing the flows for the vdev 130 */ 131 QDF_STATUS dp_rx_fisa_flush_by_vdev_id(struct dp_soc *soc, uint8_t vdev_id); 132 133 /** 134 * dp_fisa_rx_fst_update_work() - Work functions for FST updates 135 * @arg: argument passed to the work function 136 * 137 * Return: None 138 */ 139 void dp_fisa_rx_fst_update_work(void *arg); 140 141 /** 142 * dp_suspend_fse_cache_flush() - Suspend FSE cache flush 143 * @dp_ctx: DP component context 144 * 145 * Return: None 146 */ 147 void dp_suspend_fse_cache_flush(struct wlan_dp_psoc_context *dp_ctx); 148 149 /** 150 * dp_rx_fst_attach() - Initialize Rx FST and setup necessary parameters 151 * @dp_ctx: DP component context 152 * 153 * Return: Handle to flow search table entry 154 */ 155 QDF_STATUS dp_rx_fst_attach(struct wlan_dp_psoc_context *dp_ctx); 156 157 /** 158 * dp_rx_fst_target_config() - Configure RX OLE FSE engine in HW 159 * @dp_ctx: DP component context 160 * 161 * Return: Success 162 */ 163 QDF_STATUS dp_rx_fst_target_config(struct wlan_dp_psoc_context *dp_ctx); 164 165 /** 166 * dp_rx_fisa_config() - Configure FISA related settings 167 * @dp_ctx: DP component context 168 * 169 * Return: QDF_STATUS 170 */ 171 QDF_STATUS dp_rx_fisa_config(struct wlan_dp_psoc_context *dp_ctx); 172 173 /** 174 * dp_rx_fst_detach() - De-initialize Rx FST 175 * @dp_ctx: DP component context 176 * 177 * Return: None 178 */ 179 void dp_rx_fst_detach(struct wlan_dp_psoc_context *dp_ctx); 180 181 /** 182 * dp_resume_fse_cache_flush() - Resume FSE cache flush 183 * @dp_ctx: DP component context 184 * 185 * Return: None 186 */ 187 void dp_resume_fse_cache_flush(struct wlan_dp_psoc_context *dp_ctx); 188 189 /** 190 * dp_rx_fst_update_pm_suspend_status() - Update Suspend status in FISA 191 * @dp_ctx: DP component context 192 * @suspended: Flag to indicate suspend or not 193 * 194 * Return: None 195 */ 196 void dp_rx_fst_update_pm_suspend_status(struct wlan_dp_psoc_context *dp_ctx, 197 bool suspended); 198 199 /** 200 * dp_rx_fst_requeue_wq() - Re-queue pending work queue tasks 201 * @dp_ctx: DP component context 202 * 203 * Return: None 204 */ 205 void dp_rx_fst_requeue_wq(struct wlan_dp_psoc_context *dp_ctx); 206 207 void dp_print_fisa_rx_stats(enum cdp_fisa_stats_id stats_id); 208 209 /** 210 * dp_fisa_cfg_init() - FISA INI items init 211 * @config: SoC CFG config 212 * @psoc: Objmgr PSoC handle 213 * 214 * Return: None 215 */ 216 void dp_fisa_cfg_init(struct wlan_dp_psoc_cfg *config, 217 struct wlan_objmgr_psoc *psoc); 218 219 /** 220 * dp_set_fst_in_cmem() - Set flag to indicate FST is in CMEM 221 * @fst_in_cmem: Flag to indicate FST is in CMEM 222 * 223 * Return: None 224 */ 225 void dp_set_fst_in_cmem(bool fst_in_cmem); 226 227 /** 228 * dp_set_fisa_dynamic_aggr_size_support() - Set flag to indicate dynamic 229 * aggregation size support 230 * @dynamic_aggr_size_support: Flag to indicate dynamic aggregation support 231 * 232 * Return: None 233 */ 234 void dp_set_fisa_dynamic_aggr_size_support(bool dynamic_aggr_size_support); 235 #else 236 static inline void dp_rx_fst_update_pm_suspend_status(struct wlan_dp_psoc_context * dp_ctx,bool suspended)237 dp_rx_fst_update_pm_suspend_status(struct wlan_dp_psoc_context *dp_ctx, 238 bool suspended) 239 { 240 } 241 dp_print_fisa_rx_stats(enum cdp_fisa_stats_id stats_id)242 static inline void dp_print_fisa_rx_stats(enum cdp_fisa_stats_id stats_id) 243 { 244 } 245 dp_fisa_cfg_init(struct wlan_dp_psoc_cfg * config,struct wlan_objmgr_psoc * psoc)246 static inline void dp_fisa_cfg_init(struct wlan_dp_psoc_cfg *config, 247 struct wlan_objmgr_psoc *psoc) 248 { 249 } 250 dp_set_fst_in_cmem(bool fst_in_cmem)251 static inline void dp_set_fst_in_cmem(bool fst_in_cmem) 252 { 253 } 254 255 static inline void dp_set_fisa_dynamic_aggr_size_support(bool dynamic_aggr_size_support)256 dp_set_fisa_dynamic_aggr_size_support(bool dynamic_aggr_size_support) 257 { 258 } 259 #endif 260 #endif 261