1 /*
2 * Copyright (c) 2013-2021 The Linux Foundation. All rights reserved.
3 * Copyright (c) 2021-2024 Qualcomm Innovation Center, Inc. All rights reserved.
4 *
5 * Permission to use, copy, modify, and/or distribute this software for
6 * any purpose with or without fee is hereby granted, provided that the
7 * above copyright notice and this permission notice appear in all
8 * copies.
9 *
10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
11 * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
12 * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
13 * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
14 * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
15 * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
16 * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
17 * PERFORMANCE OF THIS SOFTWARE.
18 */
19
20 /**
21 * DOC: Declare various struct, macros which are used privately in IPA
22 * component.
23 */
24
25 #ifndef _WLAN_IPA_PRIV_STRUCT_H_
26 #define _WLAN_IPA_PRIV_STRUCT_H_
27
28 #ifdef IPA_OFFLOAD
29
30 #include <linux/version.h>
31 #include <linux/kernel.h>
32
33 #if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 10, 0)) || \
34 defined(CONFIG_IPA_WDI_UNIFIED_API)
35 #include <qdf_ipa_wdi3.h>
36 #else
37 #include <qdf_ipa.h>
38 #endif
39
40 #include <qdf_net_types.h>
41 #include <qdf_mc_timer.h>
42 #include <qdf_list.h>
43 #include <qdf_defer.h>
44 #include "qdf_delayed_work.h"
45 #include <qdf_event.h>
46 #include "wlan_ipa_public_struct.h"
47 #ifdef IPA_OPT_WIFI_DP
48 #include "cdp_txrx_ipa.h"
49 #endif
50
51 #define WLAN_IPA_RX_INACTIVITY_MSEC_DELAY 1000
52 #define WLAN_IPA_UC_WLAN_8023_HDR_SIZE 14
53
54 #define WLAN_IPA_UC_NUM_WDI_PIPE 2
55 #define WLAN_IPA_UC_MAX_PENDING_EVENT 33
56
57 #define WLAN_IPA_UC_DEBUG_DUMMY_MEM_SIZE 32000
58 #define WLAN_IPA_UC_RT_DEBUG_PERIOD 300
59 #define WLAN_IPA_UC_RT_DEBUG_BUF_COUNT 30
60 #define WLAN_IPA_UC_RT_DEBUG_FILL_INTERVAL 10000
61
62 #define WLAN_IPA_WLAN_HDR_DES_MAC_OFFSET 0
63 #define WLAN_IPA_MAX_IFACE MAX_IPA_IFACE
64 #define WLAN_IPA_CLIENT_MAX_IFACE MAX_IPA_IFACE
65 #define WLAN_IPA_MAX_SYSBAM_PIPE 4
66
67 #if defined(IPA_WDS_EASYMESH_FEATURE) || defined(QCA_WIFI_QCN9224)
68 #define WLAN_IPA_MAX_SESSION MAX_IPA_IFACE //7
69 #else
70 #define WLAN_IPA_MAX_SESSION 5
71 #endif
72
73 #ifdef WLAN_MAX_CLIENTS_ALLOWED
74 #define WLAN_IPA_MAX_STA_COUNT WLAN_MAX_CLIENTS_ALLOWED
75 #else
76 #define WLAN_IPA_MAX_STA_COUNT 41
77 #endif
78
79 #define WLAN_IPA_RX_PIPE (WLAN_IPA_MAX_SYSBAM_PIPE - 1)
80 #define WLAN_IPA_ENABLE_MASK BIT(0)
81 #define WLAN_IPA_PRE_FILTER_ENABLE_MASK BIT(1)
82 #define WLAN_IPA_IPV6_ENABLE_MASK BIT(2)
83 #define WLAN_IPA_RM_ENABLE_MASK BIT(3)
84 #define WLAN_IPA_CLK_SCALING_ENABLE_MASK BIT(4)
85 #define WLAN_IPA_UC_ENABLE_MASK BIT(5)
86 #define WLAN_IPA_UC_STA_ENABLE_MASK BIT(6)
87 #define WLAN_IPA_REAL_TIME_DEBUGGING BIT(8)
88 #define WLAN_IPA_OPT_WIFI_DP BIT(9)
89
90 #ifdef QCA_IPA_LL_TX_FLOW_CONTROL
91 #define WLAN_IPA_MAX_BANDWIDTH 4800
92 #define WLAN_IPA_MAX_BANDWIDTH_2G 1400
93 #else /* !QCA_IPA_LL_TX_FLOW_CONTROL */
94 #define WLAN_IPA_MAX_BANDWIDTH 800
95 #endif /* QCA_IPA_LL_TX_FLOW_CONTROL */
96
97 #define WLAN_IPA_MAX_PENDING_EVENT_COUNT 20
98
99 #define IPA_WLAN_RX_SOFTIRQ_THRESH 32
100
101 #define WLAN_IPA_UC_BW_MONITOR_LEVEL 3
102
103 /**
104 * enum wlan_ipa_uc_op_code - IPA UC operation message
105 *
106 * @WLAN_IPA_UC_OPCODE_TX_SUSPEND: IPA WDI TX pipe suspend
107 * @WLAN_IPA_UC_OPCODE_TX_RESUME: IPA WDI TX pipe resume
108 * @WLAN_IPA_UC_OPCODE_RX_SUSPEND: IPA WDI RX pipe suspend
109 * @WLAN_IPA_UC_OPCODE_RX_RESUME: IPA WDI RX pipe resume
110 * @WLAN_IPA_UC_OPCODE_STATS: IPA UC stats
111 * @WLAN_IPA_UC_OPCODE_SHARING_STATS: IPA UC sharing stats
112 * @WLAN_IPA_UC_OPCODE_QUOTA_RSP: IPA UC quota response
113 * @WLAN_IPA_UC_OPCODE_QUOTA_IND: IPA UC quota indication
114 * @WLAN_IPA_UC_OPCODE_UC_READY: IPA UC ready indication
115 * @WLAN_IPA_FILTER_RSV_NOTIFY: OPT WIFI DP filter reserve notification
116 * @WLAN_IPA_FILTER_REL_NOTIFY: OPT WIFI DP filter release notification
117 * @WLAN_IPA_SMMU_MAP: IPA SMMU map call
118 * @WLAN_IPA_SMMU_UNMAP: IPA SMMU unmap call
119 * @WLAN_IPA_UC_OPCODE_MAX: IPA UC max operation code
120 */
121 enum wlan_ipa_uc_op_code {
122 WLAN_IPA_UC_OPCODE_TX_SUSPEND = 0,
123 WLAN_IPA_UC_OPCODE_TX_RESUME = 1,
124 WLAN_IPA_UC_OPCODE_RX_SUSPEND = 2,
125 WLAN_IPA_UC_OPCODE_RX_RESUME = 3,
126 WLAN_IPA_UC_OPCODE_STATS = 4,
127 #ifdef FEATURE_METERING
128 WLAN_IPA_UC_OPCODE_SHARING_STATS = 5,
129 WLAN_IPA_UC_OPCODE_QUOTA_RSP = 6,
130 WLAN_IPA_UC_OPCODE_QUOTA_IND = 7,
131 #endif
132 WLAN_IPA_UC_OPCODE_UC_READY = 8,
133 WLAN_IPA_FILTER_RSV_NOTIFY = 9,
134 WLAN_IPA_FILTER_REL_NOTIFY = 10,
135 WLAN_IPA_SMMU_MAP = 11,
136 WLAN_IPA_SMMU_UNMAP = 12,
137 /* keep this last */
138 WLAN_IPA_UC_OPCODE_MAX
139 };
140
141 /**
142 * enum - Reason codes for stat query
143 *
144 * @WLAN_IPA_UC_STAT_REASON_NONE: Initial value
145 * @WLAN_IPA_UC_STAT_REASON_DEBUG: For debug/info
146 * @WLAN_IPA_UC_STAT_REASON_BW_CAL: For bandwidth calibration
147 */
148 enum {
149 WLAN_IPA_UC_STAT_REASON_NONE,
150 WLAN_IPA_UC_STAT_REASON_DEBUG,
151 WLAN_IPA_UC_STAT_REASON_BW_CAL
152 };
153
154 /**
155 * enum wlan_ipa_rm_state - IPA resource manager state
156 * @WLAN_IPA_RM_RELEASED: PROD pipe resource released
157 * @WLAN_IPA_RM_GRANT_PENDING: PROD pipe resource requested but not granted yet
158 * @WLAN_IPA_RM_GRANTED: PROD pipe resource granted
159 */
160 enum wlan_ipa_rm_state {
161 WLAN_IPA_RM_RELEASED,
162 WLAN_IPA_RM_GRANT_PENDING,
163 WLAN_IPA_RM_GRANTED,
164 };
165
166 /**
167 * enum wlan_ipa_forward_type: Type of forward packet received from IPA
168 * @WLAN_IPA_FORWARD_PKT_NONE: No forward packet
169 * @WLAN_IPA_FORWARD_PKT_LOCAL_STACK: Packet forwarded to kernel network stack
170 * @WLAN_IPA_FORWARD_PKT_DISCARD: Discarded packet before sending to kernel
171 */
172 enum wlan_ipa_forward_type {
173 WLAN_IPA_FORWARD_PKT_NONE = 0,
174 WLAN_IPA_FORWARD_PKT_LOCAL_STACK = 1,
175 WLAN_IPA_FORWARD_PKT_DISCARD = 2
176 };
177
178 /**
179 * struct llc_snap_hdr - LLC snap header
180 * @dsap: Destination service access point
181 * @ssap: Source service access point
182 * @resv: Reserved for future use
183 * @eth_type: Ether type
184 */
185 struct llc_snap_hdr {
186 uint8_t dsap;
187 uint8_t ssap;
188 uint8_t resv[4];
189 qdf_be16_t eth_type;
190 } qdf_packed;
191
192 /**
193 * struct wlan_ipa_tx_hdr - header type which IPA should handle to TX packet
194 * @eth: ether II header
195 * @llc_snap: LLC snap header
196 */
197 struct wlan_ipa_tx_hdr {
198 qdf_ether_header_t eth;
199 struct llc_snap_hdr llc_snap;
200 } qdf_packed;
201
202 #if defined(QCA_WIFI_QCA6290) || defined(QCA_WIFI_QCA6390) || \
203 defined(QCA_WIFI_QCA6490) || defined(QCA_WIFI_QCA6750) || \
204 defined(QCA_WIFI_WCN7850) || defined(QCA_WIFI_QCN9000) || \
205 defined(QCA_WIFI_KIWI) || defined(QCA_WIFI_KIWI_V2)
206 /**
207 * struct frag_header - fragment header type registered to IPA hardware
208 * @length: fragment length
209 * @reserved: Reserved not used
210 */
211 struct frag_header {
212 __QDF_DECLARE_FLEX_ARRAY(uint8_t, reserved);
213 };
214 #elif defined(QCA_WIFI_3_0)
215 /**
216 * struct frag_header - fragment header type registered to IPA hardware
217 * @length: fragment length
218 * @reserved1: Reserved not used
219 * @reserved2: Reserved not used
220 */
221 struct frag_header {
222 uint16_t length;
223 uint32_t reserved1;
224 uint32_t reserved2;
225 } qdf_packed;
226 #else
227 struct frag_header {
228 uint32_t
229 length:16,
230 reserved16:16;
231 uint32_t reserved2;
232 } qdf_packed;
233 #endif
234
235 #if defined(QCA_WIFI_QCA6290) || defined(QCA_WIFI_QCA6390) || \
236 defined(QCA_WIFI_QCA6490) || defined(QCA_WIFI_QCA6750) || \
237 defined(QCA_WIFI_WCN7850) || defined(QCA_WIFI_QCN9000) || \
238 defined(QCA_WIFI_KIWI) || defined(QCA_WIFI_KIWI_V2)
239 /**
240 * struct ipa_header - ipa header type registered to IPA hardware
241 * @reserved: Reserved not used
242 */
243 struct ipa_header {
244 __QDF_DECLARE_FLEX_ARRAY(uint8_t, reserved);
245 };
246 #else
247 /**
248 * struct ipa_header - ipa header type registered to IPA hardware
249 * @vdev_id: vdev id
250 * @reserved: Reserved not used
251 */
252 struct ipa_header {
253 uint32_t
254 vdev_id:8, /* vdev_id field is LSB of IPA DESC */
255 reserved:24;
256 } qdf_packed;
257 #endif
258
259 /**
260 * struct wlan_ipa_uc_tx_hdr - full tx header registered to IPA hardware
261 * @frag_hd: fragment header
262 * @ipa_hd: ipa header
263 * @eth: ether II header
264 */
265 struct wlan_ipa_uc_tx_hdr {
266 struct frag_header frag_hd;
267 struct ipa_header ipa_hd;
268 qdf_ether_header_t eth;
269 } qdf_packed;
270
271 /**
272 * struct wlan_ipa_cld_hdr - IPA CLD Header
273 * @reserved: reserved fields
274 * @iface_id: interface ID
275 * @sta_id: Station ID
276 *
277 * Packed 32-bit structure
278 * +----------+----------+--------------+--------+
279 * | Reserved | QCMAP ID | interface id | STA ID |
280 * +----------+----------+--------------+--------+
281 */
282 struct wlan_ipa_cld_hdr {
283 uint8_t reserved[2];
284 uint8_t iface_id;
285 uint8_t sta_id;
286 } qdf_packed;
287
288 /**
289 * struct wlan_ipa_rx_hdr - IPA RX header
290 * @cld_hdr: IPA CLD header
291 * @eth: ether II header
292 */
293 struct wlan_ipa_rx_hdr {
294 struct wlan_ipa_cld_hdr cld_hdr;
295 qdf_ether_header_t eth;
296 } qdf_packed;
297
298 /**
299 * struct wlan_ipa_pm_tx_cb - PM resume TX callback
300 * @exception: Exception packet
301 * @iface_context: Interface context
302 * @ipa_tx_desc: IPA TX descriptor
303 * @send_to_nw: RX exception packet that needs to be passed up to stack
304 */
305 struct wlan_ipa_pm_tx_cb {
306 bool exception;
307 struct wlan_ipa_iface_context *iface_context;
308 qdf_ipa_rx_data_t *ipa_tx_desc;
309 bool send_to_nw;
310 };
311
312 /**
313 * struct wlan_ipa_sys_pipe - IPA system pipe
314 * @conn_hdl: IPA system pipe connection handle
315 * @conn_hdl_valid: IPA system pipe valid flag
316 * @ipa_sys_params: IPA system pipe params
317 */
318 struct wlan_ipa_sys_pipe {
319 uint32_t conn_hdl;
320 uint8_t conn_hdl_valid;
321 qdf_ipa_sys_connect_params_t ipa_sys_params;
322 };
323
324 /**
325 * struct wlan_ipa_iface_stats - IPA system pipe
326 * @num_tx: Number of TX packets
327 * @num_tx_drop: Number of TX packet drops
328 * @num_tx_err: Number of TX packet errors
329 * @num_tx_cac_drop: Number of TX packet drop due to CAC
330 * @num_rx_ipa_excep: Number of RX IPA exception packets
331 */
332 struct wlan_ipa_iface_stats {
333 uint64_t num_tx;
334 uint64_t num_tx_drop;
335 uint64_t num_tx_err;
336 uint64_t num_tx_cac_drop;
337 uint64_t num_rx_ipa_excep;
338 };
339
340 /* IPA private context structure */
341 struct wlan_ipa_priv;
342
343 /**
344 * struct wlan_ipa_iface_context - IPA interface context
345 * @ipa_ctx: IPA private context
346 * @cons_client: IPA consumer pipe
347 * @prod_client: IPA producer pipe
348 * @iface_id: IPA interface ID
349 * @dev: Net device structure
350 * @device_mode: Interface device mode
351 * @mac_addr: MAC address
352 * @conn_count: Connect count
353 * @disconn_count: Disconnect count
354 * @session_id: Session ID
355 * @interface_lock: Interface lock
356 * @ifa_address: Interface address
357 * @stats: Interface stats
358 * @bssid: BSSID. valid only for sta iface ctx
359 * @is_authenticated: is peer authenticated
360 * @alt_pipe: Indicate whether the interface uses alternate TX pipe
361 */
362 struct wlan_ipa_iface_context {
363 struct wlan_ipa_priv *ipa_ctx;
364
365 qdf_ipa_client_type_t cons_client;
366 qdf_ipa_client_type_t prod_client;
367
368 uint8_t iface_id; /* This iface ID */
369 qdf_netdev_t dev;
370 enum QDF_OPMODE device_mode;
371 uint8_t mac_addr[QDF_MAC_ADDR_SIZE];
372 qdf_atomic_t conn_count;
373 qdf_atomic_t disconn_count;
374 uint8_t session_id;
375 qdf_spinlock_t interface_lock;
376 uint32_t ifa_address;
377 struct wlan_ipa_iface_stats stats;
378 struct qdf_mac_addr bssid;
379 uint8_t is_authenticated;
380 #ifdef IPA_WDI3_TX_TWO_PIPES
381 bool alt_pipe;
382 #endif
383 };
384
385 /**
386 * struct wlan_ipa_stats - IPA system stats
387 * @event: WLAN IPA event record
388 * @num_send_msg: Number of sent IPA messages
389 * @num_free_msg: Number of freed IPA messages
390 * @num_rm_grant: Number of times IPA RM resource granted
391 * @num_rm_release: Number of times IPA RM resource released
392 * @num_rm_grant_imm: Number of immediate IPA RM granted
393 * @num_cons_perf_req: Number of CONS pipe perf request
394 * @num_prod_perf_req: Number of PROD pipe perf request
395 * @num_rx_drop: Number of RX packet drops
396 * @num_tx_desc_q_cnt: Number of TX descriptor queue count
397 * @num_tx_desc_error: Number of TX descriptor error
398 * @num_tx_comp_cnt: Number of TX qdf_event_t count
399 * @num_tx_queued: Number of TX queued
400 * @num_tx_dequeued: Number of TX dequeued
401 * @num_max_pm_queue: Number of packets in PM queue
402 * @num_rx_excep: Number of RX IPA exception packets
403 * @num_rx_no_iface_eapol: No of EAPOL pkts before iface setup
404 * @num_tx_fwd_ok: Number of TX forward packet success
405 * @num_tx_fwd_err: Number of TX forward packet failures
406 */
407 struct wlan_ipa_stats {
408 uint32_t event[QDF_IPA_WLAN_EVENT_MAX];
409 uint64_t num_send_msg;
410 uint64_t num_free_msg;
411 uint64_t num_rm_grant;
412 uint64_t num_rm_release;
413 uint64_t num_rm_grant_imm;
414 uint64_t num_cons_perf_req;
415 uint64_t num_prod_perf_req;
416 uint64_t num_rx_drop;
417 uint64_t num_tx_desc_q_cnt;
418 uint64_t num_tx_desc_error;
419 uint64_t num_tx_comp_cnt;
420 uint64_t num_tx_queued;
421 uint64_t num_tx_dequeued;
422 uint64_t num_max_pm_queue;
423 uint64_t num_rx_excep;
424 uint64_t num_rx_no_iface_eapol;
425 uint64_t num_tx_fwd_ok;
426 uint64_t num_tx_fwd_err;
427 };
428
429 /**
430 * struct ipa_uc_stas_map - IPA UC assoc station map
431 * @is_reserved: STA reserved flag
432 * @is_authenticated: is peer authenticated
433 * @mac_addr: Station mac address
434 */
435 struct ipa_uc_stas_map {
436 bool is_reserved;
437 struct qdf_mac_addr mac_addr;
438 uint8_t is_authenticated;
439 };
440
441 /**
442 * struct op_msg_type - IPA operation message type
443 * @msg_t: Message type
444 * @rsvd: Reserved
445 * @op_code: IPA Operation type
446 * @len: IPA message length
447 * @rsvd_snd: Reserved
448 */
449 struct op_msg_type {
450 uint8_t msg_t;
451 uint8_t rsvd;
452 uint16_t op_code;
453 uint16_t len;
454 uint16_t rsvd_snd;
455 };
456
457 /**
458 * struct ipa_uc_fw_stats - IPA FW stats
459 * @tx_comp_ring_base: TX completion ring base address
460 * @tx_comp_ring_size: TX completion ring size
461 * @tx_comp_ring_dbell_addr: TX completion ring door bell address
462 * @tx_comp_ring_dbell_ind_val: TX completion ring door bell indication
463 * @tx_comp_ring_dbell_cached_val: TX completion ring cached value
464 * @tx_pkts_enqueued: TX packets enqueued
465 * @tx_pkts_completed: TX packets completed
466 * @tx_is_suspend: TX suspend flag
467 * @tx_reserved: Reserved for TX stat
468 * @rx_ind_ring_base: RX indication ring base address
469 * @rx_ind_ring_size: RX indication ring size
470 * @rx_ind_ring_dbell_addr: RX indication ring doorbell address
471 * @rx_ind_ring_dbell_ind_val: RX indication ring doorbell indication
472 * @rx_ind_ring_dbell_ind_cached_val: RX indication ring doorbell cached value
473 * @rx_ind_ring_rdidx_addr: RX indication ring read index address
474 * @rx_ind_ring_rd_idx_cached_val: RX indication ring read index cached value
475 * @rx_refill_idx: RX ring refill index
476 * @rx_num_pkts_indicated: Number of RX packets indicated
477 * @rx_buf_refilled: Number of RX buffer refilled
478 * @rx_num_ind_drop_no_space: Number of RX indication drops due to no space
479 * @rx_num_ind_drop_no_buf: Number of RX indication drops due to no buffer
480 * @rx_is_suspend: RX suspend flag
481 * @rx_reserved: Reserved for RX stat
482 */
483 struct ipa_uc_fw_stats {
484 uint32_t tx_comp_ring_base;
485 uint32_t tx_comp_ring_size;
486 uint32_t tx_comp_ring_dbell_addr;
487 uint32_t tx_comp_ring_dbell_ind_val;
488 uint32_t tx_comp_ring_dbell_cached_val;
489 uint32_t tx_pkts_enqueued;
490 uint32_t tx_pkts_completed;
491 uint32_t tx_is_suspend;
492 uint32_t tx_reserved;
493 uint32_t rx_ind_ring_base;
494 uint32_t rx_ind_ring_size;
495 uint32_t rx_ind_ring_dbell_addr;
496 uint32_t rx_ind_ring_dbell_ind_val;
497 uint32_t rx_ind_ring_dbell_ind_cached_val;
498 uint32_t rx_ind_ring_rdidx_addr;
499 uint32_t rx_ind_ring_rd_idx_cached_val;
500 uint32_t rx_refill_idx;
501 uint32_t rx_num_pkts_indicated;
502 uint32_t rx_buf_refilled;
503 uint32_t rx_num_ind_drop_no_space;
504 uint32_t rx_num_ind_drop_no_buf;
505 uint32_t rx_is_suspend;
506 uint32_t rx_reserved;
507 };
508
509 /**
510 * struct wlan_ipa_uc_pending_event - WLAN IPA UC pending event
511 * @node: Pending event list node
512 * @type: WLAN IPA event type
513 * @net_dev: network device
514 * @device_mode: Device mode
515 * @session_id: Session ID
516 * @mac_addr: Mac address
517 * @is_loading: Driver loading flag
518 * @is_2g_iface: true if interface is operating on 2G band, otherwise false
519 */
520 struct wlan_ipa_uc_pending_event {
521 qdf_list_node_t node;
522 qdf_ipa_wlan_event type;
523 qdf_netdev_t net_dev;
524 uint8_t device_mode;
525 uint8_t session_id;
526 uint8_t mac_addr[QDF_MAC_ADDR_SIZE];
527 bool is_loading;
528 bool is_2g_iface;
529 };
530
531 /**
532 * struct uc_rm_work_struct
533 * @work: uC RM work
534 * @event: IPA RM event
535 */
536 struct uc_rm_work_struct {
537 qdf_work_t work;
538 qdf_ipa_rm_event_t event;
539 };
540
541 /**
542 * struct uc_op_work_struct
543 * @work: uC OP work
544 * @msg: OP message
545 * @osdev: pointer to qdf net device, used by osif_psoc_sync_trans_start_wait
546 * @ipa_priv_bp: back pointer to ipa_obj
547 */
548 struct uc_op_work_struct {
549 qdf_work_t work;
550 struct op_msg_type *msg;
551 qdf_device_t osdev;
552 struct wlan_ipa_priv *ipa_priv_bp;
553 };
554
555 /**
556 * struct uc_rt_debug_info
557 * @time: system time
558 * @ipa_excep_count: IPA exception packet count
559 * @rx_drop_count: IPA Rx drop packet count
560 * @net_sent_count: IPA Rx packet sent to network stack count
561 * @rx_discard_count: IPA Rx discard packet count
562 * @tx_fwd_ok_count: IPA Tx forward success packet count
563 * @tx_fwd_count: IPA Tx forward packet count
564 * @rx_destructor_call: IPA Rx packet destructor count
565 */
566 struct uc_rt_debug_info {
567 uint64_t time;
568 uint64_t ipa_excep_count;
569 uint64_t rx_drop_count;
570 uint64_t net_sent_count;
571 uint64_t rx_discard_count;
572 uint64_t tx_fwd_ok_count;
573 uint64_t tx_fwd_count;
574 uint64_t rx_destructor_call;
575 };
576
577 #ifdef FEATURE_METERING
578 /**
579 * struct ipa_uc_sharing_stats - IPA UC sharing stats
580 * @ipv4_rx_packets: IPv4 RX packets
581 * @ipv4_rx_bytes: IPv4 RX bytes
582 * @ipv6_rx_packets: IPv6 RX packets
583 * @ipv6_rx_bytes: IPv6 RX bytes
584 * @ipv4_tx_packets: IPv4 TX packets
585 * @ipv4_tx_bytes: IPv4 TX bytes
586 * @ipv6_tx_packets: IPv4 TX packets
587 * @ipv6_tx_bytes: IPv6 TX bytes
588 */
589 struct ipa_uc_sharing_stats {
590 uint64_t ipv4_rx_packets;
591 uint64_t ipv4_rx_bytes;
592 uint64_t ipv6_rx_packets;
593 uint64_t ipv6_rx_bytes;
594 uint64_t ipv4_tx_packets;
595 uint64_t ipv4_tx_bytes;
596 uint64_t ipv6_tx_packets;
597 uint64_t ipv6_tx_bytes;
598 };
599
600 /**
601 * struct ipa_uc_quota_rsp - IPA UC quota response
602 * @success: Success or fail flag
603 * @reserved: Reserved
604 * @quota_lo: Quota limit low bytes
605 * @quota_hi: Quota limit high bytes
606 */
607 struct ipa_uc_quota_rsp {
608 uint8_t success;
609 uint8_t reserved[3];
610 uint32_t quota_lo;
611 uint32_t quota_hi;
612 };
613
614 /**
615 * struct ipa_uc_quota_ind
616 * @quota_bytes: Quota bytes to set
617 */
618 struct ipa_uc_quota_ind {
619 uint64_t quota_bytes;
620 };
621 #endif
622
623 /**
624 * struct wlan_ipa_tx_desc
625 * @node: TX descriptor node
626 * @priv: pointer to priv list entry
627 * @id: Tx desc idex
628 * @ipa_tx_desc_ptr: pointer to IPA Tx descriptor
629 */
630 struct wlan_ipa_tx_desc {
631 qdf_list_node_t node;
632 void *priv;
633 uint32_t id;
634 qdf_ipa_rx_data_t *ipa_tx_desc_ptr;
635 };
636
637 typedef QDF_STATUS (*wlan_ipa_softap_xmit)(qdf_nbuf_t nbuf, qdf_netdev_t dev);
638 typedef void (*wlan_ipa_send_to_nw)(qdf_nbuf_t nbuf, qdf_netdev_t dev);
639 typedef bool (*wlan_ipa_driver_unloading)(void);
640
641 /**
642 * typedef wlan_ipa_rps_enable - Enable/disable RPS for adapter using vdev id
643 * @vdev_id: vdev_id of adapter
644 * @enable: Set true to enable RPS
645 */
646 typedef void (*wlan_ipa_rps_enable)(uint8_t vdev_id, bool enable);
647
648 /* IPA private context structure definition */
649 struct wlan_ipa_priv {
650 struct wlan_objmgr_pdev *pdev;
651 struct wlan_ipa_sys_pipe sys_pipe[WLAN_IPA_MAX_SYSBAM_PIPE];
652 struct wlan_ipa_iface_context iface_context[WLAN_IPA_MAX_IFACE];
653 uint8_t num_iface;
654 void *dp_soc;
655 uint8_t dp_pdev_id;
656 struct wlan_ipa_config *config;
657 enum wlan_ipa_rm_state rm_state;
658 /*
659 * IPA driver can send RM notifications with IRQ disabled so using qdf
660 * APIs as it is taken care gracefully. Without this, kernel would throw
661 * an warning if spin_lock_bh is used while IRQ is disabled
662 */
663 qdf_spinlock_t rm_lock;
664 struct uc_rm_work_struct uc_rm_work;
665 struct uc_op_work_struct uc_op_work[WLAN_IPA_UC_OPCODE_MAX];
666 qdf_wake_lock_t wake_lock;
667 struct qdf_delayed_work wake_lock_work;
668 bool wake_lock_released;
669
670 qdf_atomic_t tx_ref_cnt;
671 qdf_nbuf_queue_t pm_queue_head;
672 qdf_work_t pm_work;
673 qdf_spinlock_t pm_lock;
674 bool suspended;
675 qdf_spinlock_t q_lock;
676 qdf_spinlock_t enable_disable_lock;
677 /* Flag to indicate wait on pending TX completions */
678 qdf_atomic_t waiting_on_pending_tx;
679 /* Timer ticks to keep track of time after which pipes are disabled */
680 uint64_t pending_tx_start_ticks;
681 /* Indicates if cdp_ipa_disable_autonomy is called for IPA pipes */
682 qdf_atomic_t autonomy_disabled;
683 /* Indicates if cdp_disable_ipa_pipes has been called for IPA pipes */
684 qdf_atomic_t pipes_disabled;
685 /*
686 * IPA pipes are considered "down" when both autonomy_disabled and
687 * ipa_pipes_disabled are set
688 */
689 bool ipa_pipes_down;
690 /* Flag for mutual exclusion during IPA disable pipes */
691 bool pipes_down_in_progress;
692 /* Flag for mutual exclusion during IPA enable pipes */
693 bool pipes_enable_in_progress;
694 qdf_list_node_t pend_desc_head;
695 struct wlan_ipa_tx_desc *tx_desc_pool;
696 qdf_list_t tx_desc_free_list;
697
698 struct wlan_ipa_stats stats;
699
700 uint32_t curr_prod_bw;
701 uint32_t curr_cons_bw;
702
703 uint8_t activated_fw_pipe;
704 uint8_t num_sap_connected;
705 uint8_t sap_num_connected_sta;
706 uint8_t sta_connected;
707 uint32_t tx_pipe_handle;
708 uint32_t rx_pipe_handle;
709 bool resource_loading;
710 bool resource_unloading;
711 bool pending_cons_req;
712 struct ipa_uc_stas_map assoc_stas_map[WLAN_IPA_MAX_STA_COUNT];
713 qdf_list_t pending_event;
714 qdf_mutex_t event_lock;
715 uint32_t ipa_tx_packets_diff;
716 uint32_t ipa_rx_packets_diff;
717 uint32_t ipa_p_tx_packets;
718 uint32_t ipa_p_rx_packets;
719 uint32_t stat_req_reason;
720 uint64_t ipa_tx_forward;
721 uint64_t ipa_rx_discard;
722 uint64_t ipa_rx_net_send_count;
723 uint64_t ipa_rx_internal_drop_count;
724 uint64_t ipa_rx_destructor_count;
725 qdf_mc_timer_t rt_debug_timer;
726 struct uc_rt_debug_info rt_bug_buffer[WLAN_IPA_UC_RT_DEBUG_BUF_COUNT];
727 unsigned int rt_buf_fill_index;
728 qdf_ipa_wdi_in_params_t cons_pipe_in;
729 qdf_ipa_wdi_in_params_t prod_pipe_in;
730 bool uc_loaded;
731 bool wdi_enabled;
732 bool over_gsi;
733 qdf_mc_timer_t rt_debug_fill_timer;
734 qdf_mutex_t rt_debug_lock;
735 qdf_mutex_t ipa_lock;
736
737 uint8_t vdev_to_iface[WLAN_IPA_MAX_SESSION];
738 bool vdev_offload_enabled[WLAN_IPA_MAX_SESSION];
739 bool mcc_mode;
740 qdf_work_t mcc_work;
741 bool disable_intrabss_fwd[WLAN_IPA_MAX_SESSION];
742 bool dfs_cac_block_tx;
743 #ifdef FEATURE_METERING
744 struct ipa_uc_sharing_stats ipa_sharing_stats;
745 struct ipa_uc_quota_rsp ipa_quota_rsp;
746 struct ipa_uc_quota_ind ipa_quota_ind;
747 qdf_event_t ipa_uc_sharing_stats_comp;
748 qdf_event_t ipa_uc_set_quota_comp;
749 #endif
750
751 wlan_ipa_softap_xmit softap_xmit;
752 wlan_ipa_send_to_nw send_to_nw;
753
754 #if defined(QCA_CONFIG_RPS) && !defined(MDM_PLATFORM)
755 /*Callback to enable RPS for STA in STA+SAP scenario*/
756 wlan_ipa_rps_enable rps_enable;
757 #endif
758 wlan_ipa_driver_unloading driver_is_unloading;
759 qdf_event_t ipa_resource_comp;
760
761 uint32_t wdi_version;
762 bool is_smmu_enabled; /* IPA caps returned from ipa_wdi_init */
763 /* Flag to notify whether optional wifi dp feature is enabled or not */
764 bool opt_wifi_datapath;
765 qdf_atomic_t stats_quota;
766 uint8_t curr_bw_level;
767 qdf_atomic_t deinit_in_prog;
768 uint8_t instance_id;
769 bool handle_initialized;
770 qdf_ipa_wdi_hdl_t hdl;
771 #ifdef IPA_OPT_WIFI_DP
772 struct wifi_dp_flt_setup dp_cce_super_rule_flt_param;
773 qdf_event_t ipa_flt_evnt;
774 qdf_wake_lock_t opt_dp_wake_lock;
775 #endif
776 };
777
778 #define WLAN_IPA_WLAN_FRAG_HEADER sizeof(struct frag_header)
779 #define WLAN_IPA_WLAN_IPA_HEADER sizeof(struct ipa_header)
780 #define WLAN_IPA_WLAN_CLD_HDR_LEN sizeof(struct wlan_ipa_cld_hdr)
781 #define WLAN_IPA_UC_WLAN_CLD_HDR_LEN 0
782 #define WLAN_IPA_WLAN_TX_HDR_LEN sizeof(struct wlan_ipa_tx_hdr)
783 #define WLAN_IPA_UC_WLAN_TX_HDR_LEN sizeof(struct wlan_ipa_uc_tx_hdr)
784 #define WLAN_IPA_WLAN_RX_HDR_LEN sizeof(struct wlan_ipa_rx_hdr)
785 #define WLAN_IPA_UC_WLAN_HDR_DES_MAC_OFFSET \
786 (WLAN_IPA_WLAN_FRAG_HEADER + WLAN_IPA_WLAN_IPA_HEADER)
787
788 #define WLAN_IPA_GET_IFACE_ID(_data) \
789 (((struct wlan_ipa_cld_hdr *) (_data))->iface_id)
790
791 #define WLAN_IPA_LOG(LVL, fmt, args ...) \
792 QDF_TRACE(QDF_MODULE_ID_IPA, LVL, \
793 "%s:%d: "fmt, __func__, __LINE__, ## args)
794
795 #define WLAN_IPA_IS_CONFIG_ENABLED(_ipa_cfg, _mask) \
796 (((_ipa_cfg)->ipa_config & (_mask)) == (_mask))
797
798 #define BW_GET_DIFF(_x, _y) (unsigned long)((ULONG_MAX - (_y)) + (_x) + 1)
799
800 #define IPA_RESOURCE_COMP_WAIT_TIME 500
801
802 #ifdef FEATURE_METERING
803 #define IPA_UC_SHARING_STATES_WAIT_TIME 500
804 #define IPA_UC_SET_QUOTA_WAIT_TIME 500
805 #endif
806
807 /**
808 * wlan_ipa_wlan_event_to_str() - convert IPA WLAN event to string
809 * @event: IPA WLAN event to be converted to a string
810 *
811 * Return: ASCII string representing the IPA WLAN event
812 */
wlan_ipa_wlan_event_to_str(qdf_ipa_wlan_event event)813 static inline char *wlan_ipa_wlan_event_to_str(qdf_ipa_wlan_event event)
814 {
815 switch (event) {
816 CASE_RETURN_STRING(QDF_IPA_CLIENT_CONNECT);
817 CASE_RETURN_STRING(QDF_IPA_CLIENT_DISCONNECT);
818 CASE_RETURN_STRING(QDF_IPA_AP_CONNECT);
819 CASE_RETURN_STRING(QDF_IPA_AP_DISCONNECT);
820 CASE_RETURN_STRING(QDF_IPA_STA_CONNECT);
821 CASE_RETURN_STRING(QDF_IPA_STA_DISCONNECT);
822 CASE_RETURN_STRING(QDF_IPA_CLIENT_CONNECT_EX);
823 CASE_RETURN_STRING(QDF_SWITCH_TO_SCC);
824 CASE_RETURN_STRING(QDF_SWITCH_TO_MCC);
825 CASE_RETURN_STRING(QDF_WDI_ENABLE);
826 CASE_RETURN_STRING(QDF_WDI_DISABLE);
827 default:
828 return "UNKNOWN";
829 }
830 }
831
832 /**
833 * wlan_ipa_get_iface() - Get IPA interface
834 * @ipa_ctx: IPA context
835 * @mode: Interface device mode
836 *
837 * Return: IPA interface address
838 */
839 struct wlan_ipa_iface_context
840 *wlan_ipa_get_iface(struct wlan_ipa_priv *ipa_ctx, uint8_t mode);
841
842 #endif /* IPA_OFFLOAD */
843 #endif /* _WLAN_IPA_PRIV_STRUCT_H_ */
844