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