1 /*
2  * Copyright (c) 2011-2020 The Linux Foundation. All rights reserved.
3  * Copyright (c) 2022 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  * @file ol_htt_rx_api.h
22  * @brief Specify the rx HTT API functions called by the host data SW.
23  * @details
24  *  This file declares the HTT API functions that are specifically
25  *  related to receive processing.
26  *  In particular, this file specifies methods of the abstract HTT rx
27  *  descriptor, and functions to iterate though a series of rx descriptors
28  *  and rx MSDU buffers.
29  */
30 #ifndef _OL_HTT_RX_API__H_
31 #define _OL_HTT_RX_API__H_
32 
33 #include <osdep.h>              /* uint16_t, etc. */
34 #include <qdf_nbuf.h>           /* qdf_nbuf_t */
35 #include <qdf_types.h>          /* bool */
36 
37 #include <htt.h>                /* HTT_RX_IND_MPDU_STATUS */
38 #include <ol_htt_api.h>         /* htt_pdev_handle */
39 
40 #include <cds_ieee80211_common.h>
41 #include <ol_vowext_dbg_defs.h>
42 
43 /*================ constants and types used in the rx API ===================*/
44 
45 #define HTT_RSSI_INVALID 0x7fff
46 
47 #ifndef EXTERNAL_USE_ONLY
48 
49 #define IEEE80211_LSIG_LEN  3
50 #define IEEE80211_HTSIG_LEN 6
51 #define IEEE80211_SB_LEN    2
52 
53 /**
54  * struct ieee80211_rx_status - RX status
55  * @rs_numchains: Number of chains
56  * @rs_flags: Flags
57  * @rs_rssi: RSSI (noise floor adjusted)
58  * @rs_abs_rssi: Absolute RSSI
59  * @rs_datarate: Data rate received
60  * @rs_rateieee: ieee rate
61  * @rs_ratephy: Phy rate
62  * @rs_rssictl: RSSI (noise floor adjusted)
63  * @rs_rssiextn: RSSI (noise floor adjusted)
64  * @rs_isvalidrssi: rs_rssi is valid or not
65  * @rs_phymode: Phy mode
66  * @rs_freq: Received frequency
67  * @rs_tstamp: Received timestamp
68  * @rs_full_chan: Detail channel structure of recv frame.
69  *                It could be NULL if not available
70  * @rs_isaggr: Is Aggreggated?
71  * @rs_isapsd: Is APSD?
72  * @rs_noisefloor: Noise floor
73  * @rs_channel: Channel
74  * @rs_rpttstamp: txbf report time stamp
75  * @rs_cryptodecapcount: Crypto bytes decapped/demic'ed
76  * @rs_padspace: No. of padding bytes present after header
77  *               in wbuf
78  * @rs_qosdecapcount: QoS/HTC bytes decapped
79  * @rs_lsig: lsig
80  * @rs_htsig: HT sig
81  * @rs_servicebytes: Received service bytes
82  */
83 struct ieee80211_rx_status {
84 	int rs_numchains;
85 	int rs_flags;
86 	int rs_rssi;
87 	int rs_abs_rssi;
88 	int rs_datarate;
89 	int rs_rateieee;
90 	int rs_ratephy;
91 
92 	uint8_t rs_rssictl[IEEE80211_MAX_ANTENNA];
93 	uint8_t rs_rssiextn[IEEE80211_MAX_ANTENNA];
94 	uint8_t rs_isvalidrssi;
95 
96 	enum ieee80211_phymode rs_phymode;
97 	int rs_freq;
98 
99 	union {
100 		uint8_t data[8];
101 		uint64_t tsf;
102 	} rs_tstamp;
103 
104 	struct ieee80211_channel *rs_full_chan;
105 
106 	uint8_t rs_isaggr;
107 	uint8_t rs_isapsd;
108 	int16_t rs_noisefloor;
109 	uint16_t rs_channel;
110 #ifdef ATH_SUPPORT_TxBF
111 	uint32_t rs_rpttstamp;
112 #endif
113 
114 	/*
115 	 * The following counts are meant to assist in stats calculation.
116 	 *  These variables are incremented only in specific situations, and
117 	 *  should not be relied upon for any purpose other than the original
118 	 *  stats related purpose they have been introduced for.
119 	 */
120 
121 	uint16_t rs_cryptodecapcount;
122 	uint8_t rs_padspace;
123 	uint8_t rs_qosdecapcount;
124 
125 	/* End of stats calculation related counts. */
126 
127 	uint8_t rs_lsig[IEEE80211_LSIG_LEN];
128 	uint8_t rs_htsig[IEEE80211_HTSIG_LEN];
129 	uint8_t rs_servicebytes[IEEE80211_SB_LEN];
130 
131 };
132 #endif /* EXTERNAL_USE_ONLY */
133 
134 /**
135  * struct ocb_rx_stats_hdr_t - RX stats header
136  * @version:		The version must be 1.
137  * @length:		The length of this structure
138  * @channel_freq:	The center frequency for the packet
139  * @rssi_cmb:		combined RSSI from all chains
140  * @rssi[4]:		rssi for chains 0 through 3 (for 20 MHz bandwidth)
141  * @tsf32:		timestamp in TSF units
142  * @timestamp_microsec:	timestamp in microseconds
143  * @datarate:		MCS index
144  * @timestamp_submicrosec: submicrosecond portion of the timestamp
145  * @ext_tid:		Extended TID
146  * @reserved:		Ensure the size of the structure is a multiple of 4.
147  *			Must be 0.
148  *
149  * When receiving an OCB packet, the RX stats is sent to the user application
150  * so that the user application can do processing based on the RX stats.
151  * This structure will be preceded by an ethernet header with
152  * the proto field set to 0x8152. This struct includes various RX
153  * parameters including RSSI, data rate, and center frequency.
154  */
155 PREPACK struct ocb_rx_stats_hdr_t {
156 	uint16_t version;
157 	uint16_t length;
158 	uint16_t channel_freq;
159 	int16_t rssi_cmb;
160 	int16_t rssi[4];
161 	uint32_t tsf32;
162 	uint32_t timestamp_microsec;
163 	uint8_t datarate;
164 	uint8_t timestamp_submicrosec;
165 	uint8_t ext_tid;
166 	uint8_t reserved;
167 };
168 
169 /*================ rx indication message field access methods ===============*/
170 
171 /**
172  * @brief Check if a rx indication message has a rx reorder flush command.
173  * @details
174  *  Space is reserved in each rx indication message for a rx reorder flush
175  *  command, to release specified MPDUs from the rx reorder holding array
176  *  before processing the new MPDUs referenced by the rx indication message.
177  *  This rx reorder flush command contains a flag to show whether the command
178  *  is valid within a given rx indication message.
179  *  This function checks the validity flag from the rx indication
180  *  flush command IE within the rx indication message.
181  *
182  * @param pdev - the HTT instance the rx data was received on
183  * @param rx_ind_msg - the netbuf containing the rx indication message
184  * @return
185  *      1 - the message's rx flush command is valid and should be processed
186  *          before processing new rx MPDUs,
187  *      -OR-
188  *      0 - the message's rx flush command is invalid and should be ignored
189  */
190 int htt_rx_ind_flush(htt_pdev_handle pdev, qdf_nbuf_t rx_ind_msg);
191 
192 /**
193  * @brief Return the sequence number starting the range of MPDUs to flush.
194  * @details
195  *  Read the fields of the rx indication message that identify the start
196  *  and end of the range of MPDUs to flush from the rx reorder holding array
197  *  and send on to subsequent stages of rx processing.
198  *  These sequence numbers are the 6 LSBs of the 12-bit 802.11 sequence
199  *  number.  These sequence numbers are masked with the block ack window size,
200  *  rounded up to a power of two (minus one, to create a bitmask) to obtain
201  *  the corresponding index into the rx reorder holding array.
202  *  The series of MPDUs to flush includes the one specified by the start
203  *  sequence number.
204  *  The series of MPDUs to flush excludes the one specified by the end
205  *  sequence number; the MPDUs up to but not including the end sequence number
206  *  are to be flushed.
207  *  These start and end seq num fields are only valid if the "flush valid"
208  *  flag is set.
209  *
210  * @param pdev - the HTT instance the rx data was received on
211  * @param rx_ind_msg - the netbuf containing the rx indication message
212  * @param seq_num_start - (call-by-reference output) sequence number
213  *      for the start of the range of MPDUs to flush
214  * @param seq_num_end - (call-by-reference output) sequence number
215  *      for the end of the range of MPDUs to flush
216  */
217 void
218 htt_rx_ind_flush_seq_num_range(htt_pdev_handle pdev,
219 			       qdf_nbuf_t rx_ind_msg,
220 			       unsigned *seq_num_start, unsigned *seq_num_end);
221 
222 /**
223  * @brief Check if a rx indication message has a rx reorder release command.
224  * @details
225  *  Space is reserved in each rx indication message for a rx reorder release
226  *  command, to release specified MPDUs from the rx reorder holding array
227  *  after processing the new MPDUs referenced by the rx indication message.
228  *  This rx reorder release command contains a flag to show whether the command
229  *  is valid within a given rx indication message.
230  *  This function checks the validity flag from the rx indication
231  *  release command IE within the rx indication message.
232  *
233  * @param pdev - the HTT instance the rx data was received on
234  * @param rx_ind_msg - the netbuf containing the rx indication message
235  * @return
236  *      1 - the message's rx release command is valid and should be processed
237  *          after processing new rx MPDUs,
238  *      -OR-
239  *      0 - the message's rx release command is invalid and should be ignored
240  */
241 int htt_rx_ind_release(htt_pdev_handle pdev, qdf_nbuf_t rx_ind_msg);
242 
243 /**
244  * @brief Return the sequence number starting the range of MPDUs to release.
245  * @details
246  *  Read the fields of the rx indication message that identify the start
247  *  and end of the range of MPDUs to release from the rx reorder holding
248  *  array and send on to subsequent stages of rx processing.
249  *  These sequence numbers are the 6 LSBs of the 12-bit 802.11 sequence
250  *  number.  These sequence numbers are masked with the block ack window size,
251  *  rounded up to a power of two (minus one, to create a bitmask) to obtain
252  *  the corresponding index into the rx reorder holding array.
253  *  The series of MPDUs to release includes the one specified by the start
254  *  sequence number.
255  *  The series of MPDUs to release excludes the one specified by the end
256  *  sequence number; the MPDUs up to but not including the end sequence number
257  *  are to be released.
258  *  These start and end seq num fields are only valid if the "release valid"
259  *  flag is set.
260  *
261  * @param pdev - the HTT instance the rx data was received on
262  * @param rx_ind_msg - the netbuf containing the rx indication message
263  * @param seq_num_start - (call-by-reference output) sequence number
264  *        for the start of the range of MPDUs to release
265  * @param seq_num_end - (call-by-reference output) sequence number
266  *        for the end of the range of MPDUs to release
267  */
268 void
269 htt_rx_ind_release_seq_num_range(htt_pdev_handle pdev,
270 				 qdf_nbuf_t rx_ind_msg,
271 				 unsigned int *seq_num_start,
272 				 unsigned int *seq_num_end);
273 
274 /*
275  * For now, the host HTT -> host data rx status enum
276  * exactly matches the target HTT -> host HTT rx status enum;
277  * no translation is required.
278  * However, the host data SW should only use the htt_rx_status,
279  * so that in the future a translation from target HTT rx status
280  * to host HTT rx status can be added, if the need ever arises.
281  */
282 enum htt_rx_status {
283 	htt_rx_status_unknown = HTT_RX_IND_MPDU_STATUS_UNKNOWN,
284 	htt_rx_status_ok = HTT_RX_IND_MPDU_STATUS_OK,
285 	htt_rx_status_err_fcs = HTT_RX_IND_MPDU_STATUS_ERR_FCS,
286 	htt_rx_status_err_dup = HTT_RX_IND_MPDU_STATUS_ERR_DUP,
287 	htt_rx_status_err_replay = HTT_RX_IND_MPDU_STATUS_ERR_REPLAY,
288 	htt_rx_status_err_inv_peer = HTT_RX_IND_MPDU_STATUS_ERR_INV_PEER,
289 	htt_rx_status_ctrl_mgmt_null = HTT_RX_IND_MPDU_STATUS_MGMT_CTRL,
290 	htt_rx_status_tkip_mic_err = HTT_RX_IND_MPDU_STATUS_TKIP_MIC_ERR,
291 
292 	htt_rx_status_err_misc = HTT_RX_IND_MPDU_STATUS_ERR_MISC
293 };
294 
295 /**
296  * @brief Check the status MPDU range referenced by a rx indication message.
297  * @details
298  *  Check the status of a range of MPDUs referenced by a rx indication message.
299  *  This status determines whether the MPDUs should be processed or discarded.
300  *  If the status is OK, then the MPDUs within the range should be processed
301  *  as usual.
302  *  Otherwise (FCS error, duplicate error, replay error, unknown sender error,
303  *  etc.) the MPDUs within the range should be discarded.
304  *
305  * @param pdev - the HTT instance the rx data was received on
306  * @param rx_ind_msg - the netbuf containing the rx indication message
307  * @param mpdu_range_num - which MPDU range within the rx ind msg to check,
308  *        starting from 0
309  * @param status - (call-by-reference output) MPDU status
310  * @param mpdu_count - (call-by-reference output) count of MPDUs comprising
311  *        the specified MPDU range
312  */
313 void
314 htt_rx_ind_mpdu_range_info(htt_pdev_handle pdev,
315 			   qdf_nbuf_t rx_ind_msg,
316 			   int mpdu_range_num,
317 			   enum htt_rx_status *status, int *mpdu_count);
318 
319 /**
320  * @brief Return the RSSI provided in a rx indication message.
321  * @details
322  *  Return the RSSI from an rx indication message, converted to dBm units.
323  *
324  * @param pdev - the HTT instance the rx data was received on
325  * @param rx_ind_msg - the netbuf containing the rx indication message
326  * @return RSSI in dBm, or HTT_INVALID_RSSI
327  */
328 int16_t
329 htt_rx_ind_rssi_dbm(htt_pdev_handle pdev, qdf_nbuf_t rx_ind_msg);
330 
331 int16_t
332 htt_rx_ind_rssi_dbm_chain(htt_pdev_handle pdev, qdf_nbuf_t rx_ind_msg,
333 			  int8_t chain);
334 
335 void
336 htt_rx_ind_legacy_rate(htt_pdev_handle pdev, qdf_nbuf_t rx_ind_msg,
337 		       uint8_t *legacy_rate, uint8_t *legacy_rate_sel);
338 
339 
340 void
341 htt_rx_ind_timestamp(htt_pdev_handle pdev, qdf_nbuf_t rx_ind_msg,
342 		     uint32_t *timestamp_microsec,
343 		     uint8_t *timestamp_submicrosec);
344 
345 uint32_t
346 htt_rx_ind_tsf32(htt_pdev_handle pdev, qdf_nbuf_t rx_ind_msg);
347 
348 uint8_t
349 htt_rx_ind_ext_tid(htt_pdev_handle pdev, qdf_nbuf_t rx_ind_msg);
350 
351 
352 /*==================== rx MPDU descriptor access methods ====================*/
353 
354 /**
355  * @brief Check if the retry bit is set in Rx-descriptor
356  * @details
357  * This function returns the retry bit of the 802.11 header for the
358  *  provided rx MPDU descriptor.
359  *
360  * @param pdev - the handle of the physical device the rx data was received on
361  * @param msdu_desc - the abstract descriptor for the MSDU in question
362  * @return boolean -- true if retry is set, false otherwise
363  */
364 extern
365 bool (*htt_rx_mpdu_desc_retry)(
366 		htt_pdev_handle pdev, void *mpdu_desc);
367 
368 /**
369  * @brief Return a rx MPDU's sequence number.
370  * @details
371  *  This function returns the LSBs of the 802.11 sequence number for the
372  *  provided rx MPDU descriptor.
373  *  Depending on the system, 6-12 LSBs from the 802.11 sequence number are
374  *  returned.  (Typically, either the 8 or 12 LSBs are returned.)
375  *  This sequence number is masked with the block ack window size,
376  *  rounded up to a power of two (minus one, to create a bitmask) to obtain
377  *  the corresponding index into the rx reorder holding array.
378  *
379  * @param pdev - the HTT instance the rx data was received on
380  * @param mpdu_desc - the abstract descriptor for the MPDU in question
381  * @return the LSBs of the sequence number for the MPDU
382  */
383 extern uint16_t
384 (*htt_rx_mpdu_desc_seq_num)(htt_pdev_handle pdev, void *mpdu_desc,
385 			    bool update_seq_num);
386 
387 /**
388  * @brief Return a rx MPDU's rx reorder array index, based on sequence number.
389  * @details
390  *  This function returns a sequence-number based index into the rx
391  *  reorder array for the specified MPDU.
392  *  In some systems, this rx reorder array is simply the LSBs of the
393  *  sequence number, or possibly even the full sequence number.
394  *  To support such systems, the returned index has to be masked with
395  *  the power-of-two array size before using the value to index the
396  *  rx reorder array.
397  *  In other systems, this rx reorder array index is
398  *      (sequence number) % (block ack window size)
399  *
400  * @param pdev - the HTT instance the rx data was received on
401  * @param mpdu_desc - the abstract descriptor for the MPDU in question
402  * @return the rx reorder array index the MPDU goes into
403  */
404 /* use sequence number (or LSBs thereof) as rx reorder array index */
405 #define htt_rx_mpdu_desc_reorder_idx htt_rx_mpdu_desc_seq_num
406 
407 union htt_rx_pn_t {
408 	/* WEP: 24-bit PN */
409 	uint32_t pn24;
410 
411 	/* TKIP or CCMP: 48-bit PN */
412 	uint64_t pn48;
413 
414 	/* WAPI: 128-bit PN */
415 	uint64_t pn128[2];
416 };
417 
418 /**
419  * @brief Find the packet number (PN) for a MPDU.
420  * @details
421  *  This function only applies when the rx PN check is configured to be
422  *  performed in the host rather than the target, and on peers using a
423  *  security type for which a PN check applies.
424  *  The pn_len_bits argument is used to determine which element of the
425  *  htt_rx_pn_t union to deposit the PN value read from the MPDU descriptor
426  *  into.
427  *  A 24-bit PN is deposited into pn->pn24.
428  *  A 48-bit PN is deposited into pn->pn48.
429  *  A 128-bit PN is deposited in little-endian order into pn->pn128.
430  *  Specifically, bits 63:0 of the PN are copied into pn->pn128[0], while
431  *  bits 127:64 of the PN are copied into pn->pn128[1].
432  *
433  * @param pdev - the HTT instance the rx data was received on
434  * @param mpdu_desc - the abstract descriptor for the MPDU in question
435  * @param pn - the location to copy the packet number into
436  * @param pn_len_bits - the PN size, in bits
437  */
438 extern void (*htt_rx_mpdu_desc_pn)(htt_pdev_handle pdev,
439 				   void *mpdu_desc,
440 				   union htt_rx_pn_t *pn, int pn_len_bits);
441 
442 /**
443  * @brief This function Returns the TID value from the Rx descriptor
444  *                             for Low Latency driver
445  * @details
446  *  This function returns the TID set in the 802.11 QoS Control for the MPDU
447  *  in the packet header, by looking at the mpdu_start of the Rx descriptor.
448  *  Rx descriptor gets a copy of the TID from the MAC.
449  * @pdev:  Handle (pointer) to HTT pdev.
450  * @param mpdu_desc - the abstract descriptor for the MPDU in question
451  * @return:        Actual TID set in the packet header.
452  */
453 extern
454 uint8_t (*htt_rx_mpdu_desc_tid)(
455 			htt_pdev_handle pdev, void *mpdu_desc);
456 
457 /**
458  * @brief Return the TSF timestamp indicating when a MPDU was received.
459  * @details
460  *  This function provides the timestamp indicating when the PPDU that
461  *  the specified MPDU belongs to was received.
462  *
463  * @param pdev - the HTT instance the rx data was received on
464  * @param mpdu_desc - the abstract descriptor for the MPDU in question
465  * @return 32 LSBs of TSF time at which the MPDU's PPDU was received
466  */
467 uint32_t htt_rx_mpdu_desc_tsf32(htt_pdev_handle pdev, void *mpdu_desc);
468 
469 /**
470  * @brief Return the 802.11 header of the MPDU
471  * @details
472  *  This function provides a pointer to the start of the 802.11 header
473  *  of the Rx MPDU
474  *
475  * @param pdev - the HTT instance the rx data was received on
476  * @param mpdu_desc - the abstract descriptor for the MPDU in question
477  * @return pointer to 802.11 header of the received MPDU
478  */
479 char *htt_rx_mpdu_wifi_hdr_retrieve(htt_pdev_handle pdev, void *mpdu_desc);
480 
481 /**
482  * @brief Return the RSSI provided in a rx descriptor.
483  * @details
484  *  Return the RSSI from a rx descriptor, converted to dBm units.
485  *
486  * @param pdev - the HTT instance the rx data was received on
487  * @param mpdu_desc - the abstract descriptor for the MPDU in question
488  * @return RSSI in dBm, or HTT_INVALID_RSSI
489  */
490 int16_t htt_rx_mpdu_desc_rssi_dbm(htt_pdev_handle pdev, void *mpdu_desc);
491 
492 /*==================== rx MSDU descriptor access methods ====================*/
493 
494 /**
495  * @brief Check if a MSDU completes a MPDU.
496  * @details
497  *  When A-MSDU aggregation is used, a single MPDU will consist of
498  *  multiple MSDUs.  This function checks a MSDU's rx descriptor to
499  *  see whether the MSDU is the final MSDU within a MPDU.
500  *
501  * @param pdev - the handle of the physical device the rx data was received on
502  * @param msdu_desc - the abstract descriptor for the MSDU in question
503  * @return
504  *      0 - there are subsequent MSDUs within the A-MSDU / MPDU
505  *      -OR-
506  *      1 - this is the last MSDU within its MPDU
507  */
508 extern bool (*htt_rx_msdu_desc_completes_mpdu)(htt_pdev_handle pdev,
509 					       void *msdu_desc);
510 
511 /**
512  * @brief Check if a MSDU is first msdu of MPDU.
513  * @details
514  *  When A-MSDU aggregation is used, a single MPDU will consist of
515  *  multiple MSDUs.  This function checks a MSDU's rx descriptor to
516  *  see whether the MSDU is the first MSDU within a MPDU.
517  *
518  * @param pdev - the handle of the physical device the rx data was received on
519  * @param msdu_desc - the abstract descriptor for the MSDU in question
520  * @return
521  *      0 - this is interior MSDU in the A-MSDU / MPDU
522  *      -OR-
523  *      1 - this is the first MSDU within its MPDU
524  */
525 extern bool (*htt_rx_msdu_first_msdu_flag)(htt_pdev_handle pdev,
526 					   void *msdu_desc);
527 
528 /**
529  * @brief Retrieve encrypt bit from a mpdu desc.
530  * @details
531  *  Fw will pass all the frame  to the host whether encrypted or not, and will
532  *  indicate the encrypt flag in the desc, this function is to get the info
533  *  and used to make a judge whether should make pn check, because
534  *  non-encrypted frames always get the same pn number 0.
535  *
536  * @param pdev - the HTT instance the rx data was received on
537  * @param mpdu_desc - the abstract descriptor for the MPDU in question
538  * @return 0 - the frame was not encrypted
539  *         1 - the frame was encrypted
540  */
541 extern bool (*htt_rx_mpdu_is_encrypted)(htt_pdev_handle pdev, void *mpdu_desc);
542 
543 /**
544  * @brief Indicate whether a rx desc has a WLAN unicast vs. mcast/bcast flag.
545  * @details
546  *  A flag indicating whether a MPDU was delivered over WLAN as unicast or
547  *  multicast/broadcast may be only valid once per MPDU (LL), or within each
548  *  rx descriptor for the MSDUs within the MPDU (HL).  (In practice, it is
549  *  unlikely that A-MSDU aggregation will be used in HL, so typically HL will
550  *  only have one MSDU per MPDU anyway.)
551  *  This function indicates whether the specified rx descriptor contains
552  *  a WLAN ucast vs. mcast/bcast flag.
553  *
554  * @param pdev - the HTT instance the rx data was received on
555  * @param msdu_desc - the abstract descriptor for the MSDU in question
556  * @return
557  *      0 - The rx descriptor does not contain a WLAN ucast vs. mcast flag.
558  *      -OR-
559  *      1 - The rx descriptor has a valid WLAN ucast vs. mcast flag.
560  */
561 extern int (*htt_rx_msdu_has_wlan_mcast_flag)(htt_pdev_handle pdev,
562 					      void *msdu_desc);
563 
564 /**
565  * @brief Indicate whether a MSDU was received as unicast or mcast/bcast
566  * @details
567  *  Indicate whether the MPDU that the specified MSDU belonged to was
568  *  delivered over the WLAN as unicast, or as multicast/broadcast.
569  *  This query can only be performed on rx descriptors for which
570  *  htt_rx_msdu_has_wlan_mcast_flag is true.
571  *
572  * @param pdev - the HTT instance the rx data was received on
573  * @param msdu_desc - the abstract descriptor for the MSDU in question
574  * @return
575  *      0 - The MSDU was delivered over the WLAN as unicast.
576  *      -OR-
577  *      1 - The MSDU was delivered over the WLAN as broadcast or multicast.
578  */
579 extern bool (*htt_rx_msdu_is_wlan_mcast)(htt_pdev_handle pdev, void *msdu_desc);
580 
581 /**
582  * @brief Indicate whether a MSDU was received as a fragmented frame
583  * @details
584  *  This query can only be performed on LL system.
585  *
586  * @param pdev - the HTT instance the rx data was received on
587  * @param msdu_desc - the abstract descriptor for the MSDU in question
588  * @return
589  *      0 - The MSDU was a non-fragmented frame.
590  *      -OR-
591  *      1 - The MSDU was fragmented frame.
592  */
593 extern int (*htt_rx_msdu_is_frag)(htt_pdev_handle pdev, void *msdu_desc);
594 
595 /**
596  * @brief Indicate if a MSDU should be delivered to the OS shim or discarded.
597  * @details
598  *  Indicate whether a MSDU should be discarded or delivered to the OS shim.
599  *
600  * @param pdev - the HTT instance the rx data was received on
601  * @param msdu_desc - the abstract descriptor for the MSDU in question
602  * @return
603  *      0 - The MSDU should be delivered to the OS
604  *      -OR-
605  *      non-zero - The MSDU should not be delivered to the OS.
606  *          If the "forward" flag is set, it should be forwarded to tx.
607  *          Else, it should be discarded.
608  */
609 int htt_rx_msdu_discard(htt_pdev_handle pdev, void *msdu_desc);
610 
611 /**
612  * @brief Indicate whether a MSDU should be forwarded to tx.
613  * @details
614  *  Indicate whether a MSDU should be forwarded to tx, e.g. for intra-BSS
615  *  STA-to-STA forwarding in an AP, or for multicast echo in an AP.
616  *
617  * @param pdev - the HTT instance the rx data was received on
618  * @param msdu_desc - the abstract descriptor for the MSDU in question
619  * @return
620  *      0 - The MSDU should not be forwarded
621  *      -OR-
622  *      non-zero - The MSDU should be forwarded.
623  *          If the "discard" flag is set, then the original MSDU can be
624  *          directly forwarded into the tx path.
625  *          Else, a copy (clone?) of the rx MSDU needs to be created to
626  *          send to the tx path.
627  */
628 int htt_rx_msdu_forward(htt_pdev_handle pdev, void *msdu_desc);
629 
630 /**
631  * @brief Indicate whether a MSDU's contents need to be inspected.
632  * @details
633  *  Indicate whether the host data SW needs to examine the contents of the
634  *  received MSDU, and based on the packet type infer what special handling
635  *  to provide for the MSDU.
636  *
637  * @param pdev - the HTT instance the rx data was received on
638  * @param msdu_desc - the abstract descriptor for the MSDU in question
639  * @return
640  *      0 - No inspection + special handling is required.
641  *      -OR-
642  *      non-zero - Inspect the MSDU contents to infer what special handling
643  *          to apply to the MSDU.
644  */
645 int htt_rx_msdu_inspect(htt_pdev_handle pdev, void *msdu_desc);
646 
647 /**
648  * @brief Provide all action specifications for a rx MSDU
649  * @details
650  *  Provide all action specifications together.  This provides the same
651  *  information in a single function call as would be provided by calling
652  *  the functions htt_rx_msdu_discard, htt_rx_msdu_forward, and
653  *  htt_rx_msdu_inspect.
654  *
655  * @param pdev - the HTT instance the rx data was received on
656  * @param msdu_desc - the abstract descriptor for the MSDU in question
657  * @param[out] discard - 1: discard the MSDU, 0: deliver the MSDU to the OS
658  * @param[out] forward - 1: forward the rx MSDU to tx, 0: no rx->tx forward
659  * @param[out] inspect - 1: process according to MSDU contents, 0: no inspect
660  */
661 void
662 htt_rx_msdu_actions(htt_pdev_handle pdev,
663 		    void *msdu_desc, int *discard, int *forward, int *inspect);
664 
665 /**
666  * @brief Get the key id sent in IV of the frame
667  * @details
668  *  Provide the key index octet which is taken from IV.
669  *  This is valid only for the first MSDU.
670  *
671  * @param pdev - the HTT instance the rx data was received on
672  * @param msdu_desc - the abstract descriptor for the MSDU in question
673  * @key_id - Key id octet
674  * @return indication of whether key id access is successful
675  *   true - Success
676  *   false - if this is not first msdu
677  */
678 extern bool
679 (*htt_rx_msdu_desc_key_id)(htt_pdev_handle pdev,
680 			   void *mpdu_desc, uint8_t *key_id);
681 
682 extern bool
683 (*htt_rx_msdu_chan_info_present)(
684 	htt_pdev_handle pdev,
685 	void *mpdu_desc);
686 
687 extern bool
688 (*htt_rx_msdu_center_freq)(
689 	htt_pdev_handle pdev,
690 	struct ol_txrx_peer_t *peer,
691 	void *mpdu_desc,
692 	uint16_t *primary_chan_center_freq_mhz,
693 	uint16_t *contig_chan1_center_freq_mhz,
694 	uint16_t *contig_chan2_center_freq_mhz,
695 	uint8_t *phy_mode);
696 
697 /*====================== rx MSDU + descriptor delivery ======================*/
698 
699 /**
700  * @brief Return a linked-list of network buffer holding the next rx A-MSDU.
701  * @details
702  *  In some systems, the rx MSDUs are uploaded along with the rx
703  *  indication message, while in other systems the rx MSDUs are uploaded
704  *  out of band, via MAC DMA.
705  *  This function provides an abstract way to obtain a linked-list of the
706  *  next MSDUs, regardless of whether the MSDU was delivered in-band with
707  *  the rx indication message, or out of band through MAC DMA.
708  *  In a LL system, this function returns a linked list of the one or more
709  *  MSDUs that together comprise an A-MSDU.
710  *  In a HL system, this function returns a degenerate linked list consisting
711  *  of a single MSDU (head_msdu == tail_msdu).
712  *  This function also makes sure each MSDU's rx descriptor can be found
713  *  through the MSDU's network buffer.
714  *  In most systems, this is trivial - a single network buffer stores both
715  *  the MSDU rx descriptor and the MSDU payload.
716  *  In systems where the rx descriptor is in a separate buffer from the
717  *  network buffer holding the MSDU payload, a pointer to the rx descriptor
718  *  has to be stored in the network buffer.
719  *  After this function call, the descriptor for a given MSDU can be
720  *  obtained via the htt_rx_msdu_desc_retrieve function.
721  *
722  * @param pdev - the HTT instance the rx data was received on
723  * @param rx_ind_msg - the netbuf containing the rx indication message
724  * @param head_msdu - call-by-reference network buffer handle, which gets set
725  *      in this function to point to the head MSDU of the A-MSDU
726  * @param tail_msdu - call-by-reference network buffer handle, which gets set
727  *      in this function to point to the tail MSDU of the A-MSDU, or the
728  *      same MSDU that the head_msdu points to if only a single MSDU is
729  *      delivered at a time.
730  * @return indication of whether any MSDUs in the AMSDU use chaining:
731  * 0 - no buffer chaining
732  * 1 - buffers are chained
733  */
734 extern int
735 (*htt_rx_amsdu_pop)(htt_pdev_handle pdev,
736 		    qdf_nbuf_t rx_ind_msg,
737 		    qdf_nbuf_t *head_msdu, qdf_nbuf_t *tail_msdu,
738 		    uint32_t *msdu_count);
739 
740 extern int
741 (*htt_rx_frag_pop)(htt_pdev_handle pdev,
742 		   qdf_nbuf_t rx_ind_msg,
743 		   qdf_nbuf_t *head_msdu, qdf_nbuf_t *tail_msdu,
744 		   uint32_t *msdu_count);
745 
746 /**
747  * @brief Return the maximum number of available msdus currently
748  *
749  * @param pdev - the HTT instance the rx data was received on
750  */
751 extern int
752 (*htt_rx_offload_msdu_cnt)(
753     htt_pdev_handle pdev);
754 
755 /**
756  * @brief Return a linked list of buffers holding one MSDU
757  *  In some systems the buffers are delivered along with offload delivery
758  *  indication message itself, while in other systems the buffers are uploaded
759  *  out of band, via MAC DMA.
760  * @details
761  *  This function provides an abstract way to obtain a linked-list of the
762  *  buffers corresponding to an msdu, regardless of whether the MSDU was
763  *  delivered in-band with the rx indication message, or out of band through
764  *  MAC DMA.
765  *  In a LL system, this function returns a linked list of one or more
766  *  buffers corresponding to an MSDU
767  *  In a HL system , TODO
768  *
769  * @param pdev - the HTT instance the rx data was received on
770  * @param offload_deliver_msg - the nebuf containing the offload deliver message
771  * @param head_msdu - call-by-reference network buffer handle, which gets set in
772  *      this function to the head buffer of this MSDU
773  * @param tail_msdu - call-by-reference network buffer handle, which gets set in
774  *      this function to the tail buffer of this MSDU
775  */
776 extern int
777 (*htt_rx_offload_msdu_pop)(htt_pdev_handle pdev,
778 			   qdf_nbuf_t offload_deliver_msg,
779 			   int *vdev_id,
780 			   int *peer_id,
781 			   int *tid,
782 			   uint8_t *fw_desc,
783 			   qdf_nbuf_t *head_buf, qdf_nbuf_t *tail_buf);
784 
785 /**
786  * @brief Return the rx descriptor for the next rx MPDU.
787  * @details
788  *  The rx MSDU descriptors may be uploaded as part of the rx indication
789  *  message, or delivered separately out of band.
790  *  This function provides an abstract way to obtain the next MPDU descriptor,
791  *  regardless of whether the MPDU descriptors are delivered in-band with
792  *  the rx indication message, or out of band.
793  *  This is used to iterate through the series of MPDU descriptors referenced
794  *  by a rx indication message.
795  *  The htt_rx_amsdu_pop function should be called before this function
796  *  (or at least before using the returned rx descriptor handle), so that
797  *  the cache location for the rx descriptor will be flushed before the
798  *  rx descriptor gets used.
799  *
800  * @param pdev - the HTT instance the rx data was received on
801  * @param rx_ind_msg - the netbuf containing the rx indication message
802  * @return next abstract rx descriptor from the series of MPDUs referenced
803  *      by an rx ind msg
804  */
805 extern void *
806 (*htt_rx_mpdu_desc_list_next)(htt_pdev_handle pdev, qdf_nbuf_t rx_ind_msg);
807 
808 /**
809  * @brief Retrieve a previously-stored rx descriptor from a MSDU buffer.
810  * @details
811  *  The data SW will call the htt_rx_msdu_desc_link macro/function to
812  *  link a MSDU's rx descriptor with the buffer holding the MSDU payload.
813  *  This function retrieves the rx MSDU descriptor.
814  *
815  * @param pdev - the HTT instance the rx data was received on
816  * @param msdu - the buffer containing the MSDU payload
817  * @return the corresponding abstract rx MSDU descriptor
818  */
819 extern void *
820 (*htt_rx_msdu_desc_retrieve)(htt_pdev_handle pdev, qdf_nbuf_t msdu);
821 
822 /**
823  * @brief Free both an rx MSDU descriptor and the associated MSDU buffer.
824  * @details
825  *  Usually the WLAN driver does not free rx MSDU buffers, but needs to
826  *  do so when an invalid frame (e.g. FCS error) was deposited into the
827  *  queue of rx buffers.
828  *  This function frees both the rx descriptor and the rx frame.
829  *  On some systems, the rx descriptor and rx frame are stored in the
830  *  same buffer, and thus one free suffices for both objects.
831  *  On other systems, the rx descriptor and rx frame are stored
832  *  separately, so distinct frees are internally needed.
833  *  However, in either case, the rx descriptor has been associated with
834  *  the MSDU buffer, and can be retrieved by htt_rx_msdu_desc_retrieve.
835  *  Hence, it is only necessary to provide the MSDU buffer; the HTT SW
836  *  internally finds the corresponding MSDU rx descriptor.
837  *
838  * @param htt_pdev - the HTT instance the rx data was received on
839  * @param rx_msdu_desc - rx descriptor for the MSDU being freed
840  * @param msdu - rx frame buffer for the MSDU being freed
841  */
842 void htt_rx_desc_frame_free(htt_pdev_handle htt_pdev, qdf_nbuf_t msdu);
843 
844 /**
845  * @brief Look up and free the rx descriptor for a MSDU.
846  * @details
847  *  When the driver delivers rx frames to the OS, it first needs
848  *  to free the associated rx descriptors.
849  *  In some systems the rx descriptors are allocated in the same
850  *  buffer as the rx frames, so this operation is a no-op.
851  *  In other systems, the rx descriptors are stored separately
852  *  from the rx frames, so the rx descriptor has to be freed.
853  *  The descriptor is located from the MSDU buffer with the
854  *  htt_rx_desc_frame_free macro/function.
855  *
856  * @param htt_pdev - the HTT instance the rx data was received on
857  * @param msdu - rx frame buffer for the rx MSDU descriptor being freed
858  */
859 void htt_rx_msdu_desc_free(htt_pdev_handle htt_pdev, qdf_nbuf_t msdu);
860 
861 /**
862  * @brief Add new MSDU buffers for the target to fill.
863  * @details
864  *  In some systems, the underlying upload mechanism (HIF) allocates new rx
865  *  buffers itself.  In other systems, the underlying upload mechanism
866  *  (MAC DMA) needs to be provided with new rx buffers.
867  *  This function is used as an abstract method to indicate to the underlying
868  *  data upload mechanism when it is an appropriate time to allocate new rx
869  *  buffers.
870  *  If the allocation is automatically handled, a la HIF, then this function
871  *  call is ignored.
872  *  If the allocation has to be done explicitly, a la MAC DMA, then this
873  *  function provides the context and timing for such replenishment
874  *  allocations.
875  *
876  * @param pdev - the HTT instance the rx data will be received on
877  */
878 void htt_rx_msdu_buff_replenish(htt_pdev_handle pdev);
879 
880 /**
881  * @brief Add new MSDU buffers for the target to fill.
882  * @details
883  *  This is full_reorder_offload version of the replenish function.
884  *  In full_reorder, FW sends HTT_T2H_MSG_TYPE_RX_IN_ORD_PADDR_IND
885  *  msg to host. It includes the number of MSDUs. Thgis will be fed
886  *  into htt_rx_msdu_buff_in_order_replenish function.
887  *  The reason for creating yet another function is to avoid checks
888  *  in real-time.
889  *
890  * @param pdev - the HTT instance the rx data will be received on
891  * @num        - number of buffers to replenish
892  *
893  * Return: number of buffers actually replenished
894  */
895 #ifndef CONFIG_HL_SUPPORT
896 int htt_rx_msdu_buff_in_order_replenish(htt_pdev_handle pdev, uint32_t num);
897 #else
898 static inline
htt_rx_msdu_buff_in_order_replenish(htt_pdev_handle pdev,uint32_t num)899 int htt_rx_msdu_buff_in_order_replenish(htt_pdev_handle pdev, uint32_t num)
900 {
901 	return 0;
902 }
903 #endif
904 
905 /**
906  * @brief Links list of MSDUs into an single MPDU. Updates RX stats
907  * @details
908  *  When HW MSDU splitting is turned on each MSDU in an AMSDU MPDU occupies
909  *  a separate wbuf for delivery to the network stack. For delivery to the
910  *  monitor mode interface they need to be restitched into an MPDU. This
911  *  function does this. Also updates the RX status if the MPDU starts
912  *  a new PPDU
913  *
914  * @param pdev - the HTT instance the rx data was received on
915  * @param head_msdu - network buffer handle, which points to the first MSDU
916  *      in the list. This is a NULL terminated list
917  * @param rx_status - pointer to the status associated with this MPDU.
918  *      Updated only if there is a new PPDU and new status associated with it
919  * @param clone_not_reqd - If set the MPDU linking destroys the passed in
920  *      list, else operates on a cloned nbuf
921  * @return network buffer handle to the MPDU
922  */
923 #if defined(FEATURE_MONITOR_MODE_SUPPORT)
924 #if !defined(QCA6290_HEADERS_DEF) && !defined(QCA6390_HEADERS_DEF) && \
925     !defined(QCA6490_HEADERS_DEF) && !defined(QCA6750_HEADERS_DEF)
926 qdf_nbuf_t
927 htt_rx_restitch_mpdu_from_msdus(htt_pdev_handle pdev,
928 				qdf_nbuf_t head_msdu,
929 				struct ieee80211_rx_status *rx_status,
930 				unsigned clone_not_reqd);
931 #else
932 static inline qdf_nbuf_t
htt_rx_restitch_mpdu_from_msdus(htt_pdev_handle pdev,qdf_nbuf_t head_msdu,struct ieee80211_rx_status * rx_status,unsigned clone_not_reqd)933 htt_rx_restitch_mpdu_from_msdus(htt_pdev_handle pdev,
934 				qdf_nbuf_t head_msdu,
935 				struct ieee80211_rx_status *rx_status,
936 				unsigned clone_not_reqd)
937 {
938 	return NULL;
939 }
940 #endif
941 #endif
942 /**
943  * @brief Return the sequence number of MPDUs to flush.
944  * @param pdev - the HTT instance the rx data was received on
945  * @param rx_frag_ind_msg - the netbuf containing the rx fragment indication
946  *      message
947  * @param seq_num_start - (call-by-reference output) sequence number
948  *      for the start of the range of MPDUs to flush
949  * @param seq_num_end - (call-by-reference output) sequence number
950  *      for the end of the range of MPDUs to flush
951  */
952 void
953 htt_rx_frag_ind_flush_seq_num_range(htt_pdev_handle pdev,
954 				    qdf_nbuf_t rx_frag_ind_msg,
955 				    uint16_t *seq_num_start, uint16_t *seq_num_end);
956 
957 #ifdef CONFIG_HL_SUPPORT
958 /**
959  * htt_rx_msdu_rx_desc_size_hl() - Return the HL rx desc size
960  * @pdev: the HTT instance the rx data was received on.
961  * @msdu_desc: the hl rx desc pointer
962  *
963  * Return: HL rx desc size
964  */
965 uint16_t htt_rx_msdu_rx_desc_size_hl(htt_pdev_handle pdev, void *msdu_desc);
966 #else
967 static inline
htt_rx_msdu_rx_desc_size_hl(htt_pdev_handle pdev,void * msdu_desc)968 uint16_t htt_rx_msdu_rx_desc_size_hl(htt_pdev_handle pdev, void *msdu_desc)
969 {
970 	return 0;
971 }
972 #endif
973 
974 /**
975  * @brief populates vowext stats by processing RX desc.
976  * @param msdu - network buffer handle
977  * @param vowstats - handle to vow ext stats.
978  */
979 void htt_rx_get_vowext_stats(qdf_nbuf_t msdu, struct vow_extstats *vowstats);
980 
981 /**
982  * @brief parses the offload message passed by the target.
983  * @param pdev - pdev handle
984  * @param paddr - physical address of the rx buffer
985  * @param vdev_id - reference to vdev id to be filled
986  * @param peer_id - reference to the peer id to be filled
987  * @param tid - reference to the tid to be filled
988  * @param fw_desc - reference to the fw descriptor to be filled
989  * @param peer_id - reference to the peer id to be filled
990  * @param head_buf - reference to the head buffer
991  * @param tail_buf - reference to the tail buffer
992  */
993 int
994 htt_rx_offload_paddr_msdu_pop_ll(htt_pdev_handle pdev,
995 				 uint32_t *msg_word,
996 				 int msdu_iter,
997 				 int *vdev_id,
998 				 int *peer_id,
999 				 int *tid,
1000 				 uint8_t *fw_desc,
1001 				 qdf_nbuf_t *head_buf, qdf_nbuf_t *tail_buf);
1002 
1003 uint32_t htt_rx_amsdu_rx_in_order_get_pktlog(qdf_nbuf_t rx_ind_msg);
1004 
1005 /**
1006  * htt_rx_update_smmu_map() - set smmu map/unmap for rx buffers
1007  * @pdev: htt pdev handle
1008  * @map: value to set smmu map/unmap for rx buffers
1009  *
1010  * Return: QDF_STATUS
1011  */
1012 QDF_STATUS htt_rx_update_smmu_map(struct htt_pdev_t *pdev, bool map);
1013 
1014 /** htt_tx_enable_ppdu_end
1015  * @enable_ppdu_end - set it to 1 if WLAN_FEATURE_TSF_PLUS is defined,
1016  *                    else do nothing
1017  */
1018 #ifdef WLAN_FEATURE_TSF_PLUS
1019 void htt_rx_enable_ppdu_end(int *enable_ppdu_end);
1020 #else
1021 static inline
htt_rx_enable_ppdu_end(int * enable_ppdu_end)1022 void htt_rx_enable_ppdu_end(int *enable_ppdu_end)
1023 {
1024 }
1025 #endif
1026 
1027 #endif /* _OL_HTT_RX_API__H_ */
1028