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