xref: /wlan-dirver/qca-wifi-host-cmn/dp/inc/cdp_txrx_mob_def.h (revision 45a38684b07295822dc8eba39e293408f203eec8)
1 /*
2  * Copyright (c) 2016-2020 The Linux Foundation. All rights reserved.
3  *
4  * Permission to use, copy, modify, and/or distribute this software for
5  * any purpose with or without fee is hereby granted, provided that the
6  * above copyright notice and this permission notice appear in all
7  * copies.
8  *
9  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
10  * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
11  * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
12  * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
13  * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
14  * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
15  * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
16  * PERFORMANCE OF THIS SOFTWARE.
17  */
18 
19 #ifndef __CDP_TXRX_MOB_DEF_H
20 #define __CDP_TXRX_MOB_DEF_H
21 #include <sir_types.h>
22 #include <htt.h>
23 
24 #define TX_WMM_AC_NUM	4
25 #define ENABLE_DP_HIST_STATS
26 #define DP_MEMORY_OPT
27 #define DP_RX_DISABLE_NDI_MDNS_FORWARDING
28 
29 #define OL_TXQ_PAUSE_REASON_FW                (1 << 0)
30 #define OL_TXQ_PAUSE_REASON_PEER_UNAUTHORIZED (1 << 1)
31 #define OL_TXQ_PAUSE_REASON_TX_ABORT          (1 << 2)
32 #define OL_TXQ_PAUSE_REASON_VDEV_STOP         (1 << 3)
33 #define OL_TXQ_PAUSE_REASON_THERMAL_MITIGATION (1 << 4)
34 
35 #define OL_TXRX_INVALID_NUM_PEERS (-1)
36 
37 
38 /* Maximum number of station supported by data path, including BC. */
39 #define WLAN_MAX_STA_COUNT  (HAL_NUM_STA)
40 
41 /* The symbolic station ID return to HDD to specify the packet is bc/mc */
42 #define WLAN_RX_BCMC_STA_ID (WLAN_MAX_STA_COUNT + 1)
43 
44 /* The symbolic station ID return to HDD to specify the packet is
45        to soft-AP itself */
46 #define WLAN_RX_SAP_SELF_STA_ID (WLAN_MAX_STA_COUNT + 2)
47 
48 /* is 802.11 address multicast/broadcast? */
49 #define IEEE80211_IS_MULTICAST(_a)  (*(_a) & 0x01)
50 
51 #define MAX_PEERS 32
52 
53 /*
54  * Bins used for reporting delay histogram:
55  * bin 0:  0 - 10  ms delay
56  * bin 1: 10 - 20  ms delay
57  * bin 2: 20 - 40  ms delay
58  * bin 3: 40 - 80  ms delay
59  * bin 4: 80 - 160 ms delay
60  * bin 5: > 160 ms delay
61  */
62 #define QCA_TX_DELAY_HIST_REPORT_BINS 6
63 
64 /* BA actions */
65 #define IEEE80211_ACTION_BA_ADDBA_REQUEST       0       /* ADDBA request */
66 #define IEEE80211_ACTION_BA_ADDBA_RESPONSE      1       /* ADDBA response */
67 #define IEEE80211_ACTION_BA_DELBA               2       /* DELBA */
68 
69 #define IEEE80211_BA_POLICY_DELAYED      0
70 #define IEEE80211_BA_POLICY_IMMEDIATE    1
71 #define IEEE80211_BA_AMSDU_SUPPORTED     1
72 
73 /**
74  * enum netif_action_type - Type of actions on netif queues
75  * @WLAN_STOP_ALL_NETIF_QUEUE: stop all netif queues
76  * @WLAN_START_ALL_NETIF_QUEUE: start all netif queues
77  * @WLAN_WAKE_ALL_NETIF_QUEUE: wake all netif queues
78  * @WLAN_STOP_ALL_NETIF_QUEUE_N_CARRIER: stop all queues and off carrier
79  * @WLAN_START_ALL_NETIF_QUEUE_N_CARRIER: start all queues and on carrier
80  * @WLAN_NETIF_TX_DISABLE: disable tx
81  * @WLAN_NETIF_TX_DISABLE_N_CARRIER: disable tx and off carrier
82  * @WLAN_NETIF_CARRIER_ON: on carrier
83  * @WLAN_NETIF_CARRIER_OFF: off carrier
84  * @WLAN_NETIF_PRIORITY_QUEUE_ON: start priority netif queues
85  * @WLAN_NETIF_PRIORITY_QUEUE_OFF: stop priority netif queues
86  * @WLAN_WAKE_NON_PRIORITY_QUEUE: wake non priority netif queues
87  * @WLAN_STOP_NON_PRIORITY_QUEUE: stop non priority netif queues
88  */
89 enum netif_action_type {
90 	WLAN_NETIF_ACTION_TYPE_NONE = 0,
91 	WLAN_STOP_ALL_NETIF_QUEUE = 1,
92 	WLAN_START_ALL_NETIF_QUEUE = 2,
93 	WLAN_WAKE_ALL_NETIF_QUEUE = 3,
94 	WLAN_STOP_ALL_NETIF_QUEUE_N_CARRIER = 4,
95 	WLAN_START_ALL_NETIF_QUEUE_N_CARRIER = 5,
96 	WLAN_NETIF_TX_DISABLE = 6,
97 	WLAN_NETIF_TX_DISABLE_N_CARRIER = 7,
98 	WLAN_NETIF_CARRIER_ON = 8,
99 	WLAN_NETIF_CARRIER_OFF = 9,
100 	WLAN_NETIF_PRIORITY_QUEUE_ON = 10,
101 	WLAN_NETIF_PRIORITY_QUEUE_OFF = 11,
102 	WLAN_NETIF_VO_QUEUE_ON = 12,
103 	WLAN_NETIF_VO_QUEUE_OFF = 13,
104 	WLAN_NETIF_VI_QUEUE_ON = 14,
105 	WLAN_NETIF_VI_QUEUE_OFF = 15,
106 	WLAN_NETIF_BE_BK_QUEUE_OFF = 16,
107 	WLAN_WAKE_NON_PRIORITY_QUEUE = 17,
108 	WLAN_STOP_NON_PRIORITY_QUEUE = 18,
109 	WLAN_NETIF_ACTION_TYPE_MAX,
110 };
111 
112 /**
113  * enum netif_reason_type - reason for netif queue action
114  * @WLAN_CONTROL_PATH: action from control path
115  * @WLAN_DATA_FLOW_CONTROL: because of flow control
116  * @WLAN_FW_PAUSE: because of firmware pause
117  * @WLAN_TX_ABORT: because of tx abort
118  * @WLAN_VDEV_STOP: because of vdev stop
119  * @WLAN_PEER_UNAUTHORISED: because of peer is unauthorised
120  * @WLAN_THERMAL_MITIGATION: because of thermal mitigation
121  */
122 enum netif_reason_type {
123 	WLAN_CONTROL_PATH = 1,
124 	WLAN_DATA_FLOW_CONTROL,
125 	WLAN_FW_PAUSE,
126 	WLAN_TX_ABORT,
127 	WLAN_VDEV_STOP,
128 	WLAN_PEER_UNAUTHORISED,
129 	WLAN_THERMAL_MITIGATION,
130 	WLAN_DATA_FLOW_CONTROL_PRIORITY,
131 	WLAN_REASON_TYPE_MAX,
132 };
133 
134 enum ol_rx_err_type {
135 	OL_RX_ERR_DEFRAG_MIC,
136 	OL_RX_ERR_PN,
137 	OL_RX_ERR_UNKNOWN_PEER,
138 	OL_RX_ERR_MALFORMED,
139 	OL_RX_ERR_TKIP_MIC,
140 	OL_RX_ERR_DECRYPT,
141 	OL_RX_ERR_MPDU_LENGTH,
142 	OL_RX_ERR_ENCRYPT_REQUIRED,
143 	OL_RX_ERR_DUP,
144 	OL_RX_ERR_UNKNOWN,
145 	OL_RX_ERR_FCS,
146 	OL_RX_ERR_PRIVACY,
147 	OL_RX_ERR_NONE_FRAG,
148 	OL_RX_ERR_NONE = 0xFF
149 };
150 
151 enum throttle_level {
152 	THROTTLE_LEVEL_0,
153 	THROTTLE_LEVEL_1,
154 	THROTTLE_LEVEL_2,
155 	THROTTLE_LEVEL_3,
156 	/* Invalid */
157 	THROTTLE_LEVEL_MAX,
158 };
159 
160 enum {
161 	OL_TX_WMM_AC_BE,
162 	OL_TX_WMM_AC_BK,
163 	OL_TX_WMM_AC_VI,
164 	OL_TX_WMM_AC_VO,
165 	OL_TX_NUM_WMM_AC
166 };
167 
168 /**
169  * @enum ol_tx_spec
170  * @brief indicate what non-standard transmission actions to apply
171  * @details
172  *  Indicate one or more of the following:
173  *    - The tx frame already has a complete 802.11 header.
174  *      Thus, skip 802.3/native-WiFi to 802.11 header encapsulation and
175  *      A-MSDU aggregation.
176  *    - The tx frame should not be aggregated (A-MPDU or A-MSDU)
177  *    - The tx frame is already encrypted - don't attempt encryption.
178  *    - The tx frame is a segment of a TCP jumbo frame.
179  *    - This tx frame should not be unmapped and freed by the txrx layer
180  *      after transmission, but instead given to a registered tx completion
181  *      callback.
182  *  More than one of these specification can apply, though typically
183  *  only a single specification is applied to a tx frame.
184  *  A compound specification can be created, as a bit-OR of these
185  *  specifications.
186  */
187 enum ol_tx_spec {
188 	OL_TX_SPEC_STD = 0x0,   /* do regular processing */
189 	OL_TX_SPEC_RAW = 0x1,   /* skip encap + A-MSDU aggr */
190 	OL_TX_SPEC_NO_AGGR = 0x2,       /* skip encap + all aggr */
191 	OL_TX_SPEC_NO_ENCRYPT = 0x4,    /* skip encap + encrypt */
192 	OL_TX_SPEC_TSO = 0x8,   /* TCP segmented */
193 	OL_TX_SPEC_NWIFI_NO_ENCRYPT = 0x10,     /* skip encrypt for nwifi */
194 	OL_TX_SPEC_NO_FREE = 0x20,      /* give to cb rather than free */
195 };
196 
197 /**
198  * @enum peer_debug_id_type: debug ids to track peer get_ref and release_ref
199  * @brief Unique peer debug IDs to track the callers. Each new usage can add to
200  *        this enum list to create a new "PEER_DEBUG_ID_".
201  * @PEER_DEBUG_ID_OL_INTERNAL: debug id for OL internal usage
202  * @PEER_DEBUG_ID_WMA_PKT_DROP: debug id for wma_is_pkt_drop_candidate API
203  * @PEER_DEBUG_ID_WMA_ADDBA_REQ: debug id for ADDBA request
204  * @PEER_DEBUG_ID_WMA_DELBA_REQ: debug id for DELBA request
205  * @PEER_DEBUG_ID_LIM_SEND_ADDBA_RESP: debug id for send ADDBA response
206  * @PEER_DEBUG_ID_OL_RX_THREAD: debug id for rx thread
207  * @PEER_DEBUG_ID_WMA_CCMP_REPLAY_ATTACK: debug id for CCMP replay
208  * @PEER_DEBUG_ID_WMA_DEL_BSS:debug id for remove BSS
209  * @PEER_DEBUG_ID_WMA_VDEV_STOP_RESP:debug id for vdev stop response handler
210  * @PEER_DEBUG_ID_OL_PEER_MAP:debug id for peer map/unmap
211  * @PEER_DEBUG_ID_OL_PEER_ATTACH: debug id for peer attach/detach
212  * @PEER_DEBUG_ID_OL_TXQ_VDEV_FL: debug id for vdev flush
213  * @PEER_DEBUG_ID_OL_HASH_ERS:debug id for peer find hash erase
214  * @PEER_DEBUG_ID_MAX: debug id MAX
215  */
216 enum peer_debug_id_type {
217 	PEER_DEBUG_ID_OL_INTERNAL,
218 	PEER_DEBUG_ID_WMA_PKT_DROP,
219 	PEER_DEBUG_ID_WMA_ADDBA_REQ,
220 	PEER_DEBUG_ID_WMA_DELBA_REQ,
221 	PEER_DEBUG_ID_LIM_SEND_ADDBA_RESP,
222 	PEER_DEBUG_ID_OL_RX_THREAD,
223 	PEER_DEBUG_ID_WMA_CCMP_REPLAY_ATTACK,
224 	PEER_DEBUG_ID_WMA_DEL_BSS,
225 	PEER_DEBUG_ID_WMA_VDEV_STOP_RESP,
226 	PEER_DEBUG_ID_OL_PEER_MAP,
227 	PEER_DEBUG_ID_OL_PEER_ATTACH,
228 	PEER_DEBUG_ID_OL_TXQ_VDEV_FL,
229 	PEER_DEBUG_ID_OL_HASH_ERS,
230 	PEER_DEBUG_ID_OL_UNMAP_TIMER_WORK,
231 	PEER_DEBUG_ID_MAX
232 };
233 
234 /**
235  * struct ol_txrx_desc_type - txrx descriptor type
236  * @is_qos_enabled: is station qos enabled
237  * @is_wapi_supported: is station wapi supported
238  * @peer_addr: peer mac address
239  */
240 struct ol_txrx_desc_type {
241 	uint8_t is_qos_enabled;
242 	uint8_t is_wapi_supported;
243 	struct qdf_mac_addr peer_addr;
244 };
245 
246 /**
247  * struct ol_tx_sched_wrr_ac_specs_t - the wrr ac specs params structure
248  * @wrr_skip_weight: map to ol_tx_sched_wrr_adv_category_info_t.specs.
249  *                            wrr_skip_weight
250  * @credit_threshold: map to ol_tx_sched_wrr_adv_category_info_t.specs.
251  *                            credit_threshold
252  * @send_limit: map to ol_tx_sched_wrr_adv_category_info_t.specs.
253  *                            send_limit
254  * @credit_reserve: map to ol_tx_sched_wrr_adv_category_info_t.specs.
255  *                            credit_reserve
256  * @discard_weight: map to ol_tx_sched_wrr_adv_category_info_t.specs.
257  *                            discard_weight
258  *
259  * This structure is for wrr ac specs params set from user, it will update
260  * its content corresponding to the ol_tx_sched_wrr_adv_category_info_t.specs.
261  */
262 struct ol_tx_sched_wrr_ac_specs_t {
263 	int wrr_skip_weight;
264 	uint32_t credit_threshold;
265 	uint16_t send_limit;
266 	int credit_reserve;
267 	int discard_weight;
268 };
269 
270 /**
271  * struct txrx_pdev_cfg_param_t - configuration information
272  * passed to the data path
273  */
274 struct txrx_pdev_cfg_param_t {
275 	uint8_t is_full_reorder_offload;
276 	/* IPA Micro controller data path offload enable flag */
277 	uint8_t is_uc_offload_enabled;
278 	/* IPA Micro controller data path offload TX buffer count */
279 	uint32_t uc_tx_buffer_count;
280 	/* IPA Micro controller data path offload TX buffer size */
281 	uint32_t uc_tx_buffer_size;
282 	/* IPA Micro controller data path offload RX indication ring count */
283 	uint32_t uc_rx_indication_ring_count;
284 	/* IPA Micro controller data path offload TX partition base */
285 	uint32_t uc_tx_partition_base;
286 	/* IP, TCP and UDP checksum offload */
287 	bool ip_tcp_udp_checksum_offload;
288 	/* IP, TCP and UDP checksum offload for NAN Mode*/
289 	bool nan_ip_tcp_udp_checksum_offload;
290 	/* IP, TCP and UDP checksum offload for P2P Mode*/
291 	bool p2p_ip_tcp_udp_checksum_offload;
292 	/* Rx processing in thread from TXRX */
293 	bool enable_rxthread;
294 	/* CE classification enabled through INI */
295 	bool ce_classify_enabled;
296 #if defined(QCA_LL_TX_FLOW_CONTROL_V2) || defined(QCA_LL_PDEV_TX_FLOW_CONTROL)
297 	/* Threshold to stop queue in percentage */
298 	uint32_t tx_flow_stop_queue_th;
299 	/* Start queue offset in percentage */
300 	uint32_t tx_flow_start_queue_offset;
301 #endif
302 
303 #ifdef QCA_SUPPORT_TXRX_DRIVER_TCP_DEL_ACK
304 	/* enable the tcp delay ack feature in the driver */
305 	bool  del_ack_enable;
306 	/* timeout if no more tcp ack frames, unit is ms */
307 	uint16_t del_ack_timer_value;
308 	/* the maximum number of replaced tcp ack frames */
309 	uint16_t del_ack_pkt_count;
310 #endif
311 
312 	struct ol_tx_sched_wrr_ac_specs_t ac_specs[TX_WMM_AC_NUM];
313 	bool gro_enable;
314 	bool tso_enable;
315 	bool lro_enable;
316 	bool enable_data_stall_detection;
317 	bool enable_flow_steering;
318 	bool disable_intra_bss_fwd;
319 
320 #ifdef WLAN_SUPPORT_TXRX_HL_BUNDLE
321 	uint16_t bundle_timer_value;
322 	uint16_t bundle_size;
323 #endif
324 	uint8_t pktlog_buffer_size;
325 };
326 
327 #ifdef IPA_OFFLOAD
328 /**
329  * ol_txrx_ipa_resources - Resources needed for IPA
330  */
331 struct ol_txrx_ipa_resources {
332 	qdf_shared_mem_t *ce_sr;
333 	uint32_t ce_sr_ring_size;
334 	qdf_dma_addr_t ce_reg_paddr;
335 
336 	qdf_shared_mem_t *tx_comp_ring;
337 	uint32_t tx_num_alloc_buffer;
338 
339 	qdf_shared_mem_t *rx_rdy_ring;
340 	qdf_shared_mem_t *rx_proc_done_idx;
341 
342 	qdf_shared_mem_t *rx2_rdy_ring;
343 	qdf_shared_mem_t *rx2_proc_done_idx;
344 
345 	/* IPA UC doorbell registers paddr */
346 	qdf_dma_addr_t tx_comp_doorbell_dmaaddr;
347 	qdf_dma_addr_t rx_ready_doorbell_dmaaddr;
348 
349 	uint32_t tx_pipe_handle;
350 	uint32_t rx_pipe_handle;
351 };
352 #endif
353 
354 struct ol_txrx_ocb_chan_info {
355 	uint32_t chan_freq;
356 	uint16_t disable_rx_stats_hdr:1;
357 };
358 
359 /**
360  * ol_mic_error_info - carries the information associated with
361  * a MIC error
362  * @vdev_id: virtual device ID
363  * @key_id: Key ID
364  * @pn: packet number
365  * @sa: source address
366  * @da: destination address
367  * @ta: transmitter address
368  */
369 struct ol_mic_error_info {
370 	uint8_t vdev_id;
371 	uint32_t key_id;
372 	uint64_t pn;
373 	uint8_t sa[QDF_MAC_ADDR_SIZE];
374 	uint8_t da[QDF_MAC_ADDR_SIZE];
375 	uint8_t ta[QDF_MAC_ADDR_SIZE];
376 };
377 
378 /**
379  * ol_error_info - carries the information associated with an
380  * error indicated by the firmware
381  * @mic_err: MIC error information
382  */
383 struct ol_error_info {
384 	union {
385 		struct ol_mic_error_info mic_err;
386 	} u;
387 };
388 
389 
390 /**
391  * struct ol_txrx_ocb_set_chan - txrx OCB channel info
392  * @ocb_channel_count: Channel count
393  * @ocb_channel_info: OCB channel info
394  */
395 struct ol_txrx_ocb_set_chan {
396 	uint32_t ocb_channel_count;
397 	struct ol_txrx_ocb_chan_info *ocb_channel_info;
398 };
399 
400 /**
401  * @brief Parameter type to pass WMM setting to ol_txrx_set_wmm_param
402  * @details
403  *   The struct is used to specify informaiton to update TX WMM scheduler.
404  */
405 struct ol_tx_ac_param_t {
406 	uint32_t aifs;
407 	uint32_t cwmin;
408 	uint32_t cwmax;
409 };
410 
411 struct ol_tx_wmm_param_t {
412 	struct ol_tx_ac_param_t ac[OL_TX_NUM_WMM_AC];
413 };
414 
415 struct ieee80211_ba_parameterset {
416 #if _BYTE_ORDER == _BIG_ENDIAN
417 	uint16_t buffersize:10, /* B6-15  buffer size */
418 		 tid:4,       /* B2-5   TID */
419 		 bapolicy:1,  /* B1   block ack policy */
420 		 amsdusupported:1; /* B0   amsdu supported */
421 #else
422 	uint16_t amsdusupported:1,      /* B0   amsdu supported */
423 		 bapolicy:1,  /* B1   block ack policy */
424 		 tid:4,       /* B2-5   TID */
425 		 buffersize:10; /* B6-15  buffer size */
426 #endif
427 } __packed;
428 
429 struct ieee80211_ba_seqctrl {
430 #if _BYTE_ORDER == _BIG_ENDIAN
431 	uint16_t startseqnum:12,        /* B4-15  starting sequence number */
432 		 fragnum:4;   /* B0-3  fragment number */
433 #else
434 	uint16_t fragnum:4,     /* B0-3  fragment number */
435 		 startseqnum:12; /* B4-15  starting sequence number */
436 #endif
437 } __packed;
438 
439 struct ieee80211_delba_parameterset {
440 #if _BYTE_ORDER == _BIG_ENDIAN
441 	uint16_t tid:4,         /* B12-15  tid */
442 		 initiator:1, /* B11     initiator */
443 		 reserved0:11; /* B0-10   reserved */
444 #else
445 	uint16_t reserved0:11,  /* B0-10   reserved */
446 		 initiator:1, /* B11     initiator */
447 		 tid:4;       /* B12-15  tid */
448 #endif
449 } __packed;
450 
451 /**
452  * ol_txrx_vdev_peer_remove_cb - wma_remove_peer callback
453  */
454 typedef void (*ol_txrx_vdev_peer_remove_cb)(void *handle, uint8_t *bssid,
455 		uint8_t vdev_id, void *peer);
456 
457 /**
458  * @typedef tx_pause_callback
459  * @brief OSIF function registered with the data path
460  */
461 typedef void (*tx_pause_callback)(uint8_t vdev_id,
462 		enum netif_action_type action,
463 		enum netif_reason_type reason);
464 
465 typedef void (*ipa_uc_op_cb_type)(uint8_t *op_msg,
466 			void *osif_ctxt);
467 
468 /**
469  * struct ol_rx_inv_peer_params - rx invalid peer data parameters
470  * @vdev_id: Virtual device ID
471  * @ra: RX data receiver MAC address
472  * @ta: RX data transmitter MAC address
473  */
474 struct ol_rx_inv_peer_params {
475 	uint8_t vdev_id;
476 	uint8_t ra[QDF_MAC_ADDR_SIZE];
477 	uint8_t ta[QDF_MAC_ADDR_SIZE];
478 };
479 
480 /**
481  * cdp_txrx_ext_stats: dp extended stats
482  * tx_msdu_enqueue: tx msdu queued to hw
483  * tx_msdu_overflow: tx msdu overflow
484  * rx_mpdu_received: rx mpdu processed by hw
485  * rx_mpdu_delivered: rx mpdu received from hw
486  * rx_mpdu_error: rx mpdu error count
487  * rx_mpdu_missed: rx mpdu missed by hw
488  */
489 struct cdp_txrx_ext_stats {
490 	uint32_t tx_msdu_enqueue;
491 	uint32_t tx_msdu_overflow;
492 	uint32_t rx_mpdu_received;
493 	uint32_t rx_mpdu_delivered;
494 	uint32_t rx_mpdu_error;
495 	uint32_t rx_mpdu_missed;
496 };
497 
498 #endif /* __CDP_TXRX_MOB_DEF_H */
499