1  /*
2   * Copyright (c) 2011-2012, 2014-2018, 2020 The Linux Foundation. All rights reserved.
3   * Copyright (c) 2023 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  #if !defined(__SMERRMINTERNAL_H)
21  #define __SMERRMINTERNAL_H
22  
23  /**
24   * \file  sme_rrm_internal.h
25   *
26   * \brief prototype for SME RRM APIs
27   */
28  
29  /*--------------------------------------------------------------------------
30    Include Files
31    ------------------------------------------------------------------------*/
32  #include "qdf_lock.h"
33  #include "qdf_trace.h"
34  #include "qdf_mem.h"
35  #include "qdf_types.h"
36  #include "rrm_global.h"
37  
38  /*--------------------------------------------------------------------------
39    Type declarations
40    ------------------------------------------------------------------------*/
41  typedef struct sRrmNeighborReportDesc {
42  	tListElem List;
43  	tSirNeighborBssDescription *pNeighborBssDescription;
44  	uint32_t roamScore;
45  	uint8_t sessionId;
46  } tRrmNeighborReportDesc, *tpRrmNeighborReportDesc;
47  
48  typedef void (*NeighborReportRspCallback)(void *context,
49  		QDF_STATUS qdf_status);
50  
51  typedef struct sRrmNeighborRspCallbackInfo {
52  	uint32_t timeout;       /* in ms.. min value is 10 (10ms) */
53  	NeighborReportRspCallback neighborRspCallback;
54  	void *neighborRspCallbackContext;
55  } tRrmNeighborRspCallbackInfo, *tpRrmNeighborRspCallbackInfo;
56  
57  typedef struct sRrmNeighborRequestControlInfo {
58  	/* To check whether a neighbor req is already sent & response pending */
59  	bool isNeighborRspPending;
60  	qdf_mc_timer_t neighborRspWaitTimer;
61  	tRrmNeighborRspCallbackInfo neighborRspCallbackInfo;
62  } tRrmNeighborRequestControlInfo, *tpRrmNeighborRequestControlInfo;
63  
64  /**
65   * enum rrm_measurement_type: measurement type
66   * @RRM_CHANNEL_LOAD: measurement type for channel load req
67   * @RRM_BEACON_REPORT: measurement type for beacon report request
68   */
69  enum rrm_measurement_type {
70  	RRM_CHANNEL_LOAD = 0,
71  	RRM_BEACON_REPORT = 1,
72  };
73  
74  /**
75   * enum channel_load_req_info: channel load request info
76   * @channel: channel for which the host receives the channel load req from AP
77   * @req_chan_width: channel width for which the host receives the channel load
78   * req from AP
79   * @rrm_scan_tsf: to store jiffies for RRM scan to process chan load req
80   * @bw_ind: Contains info for Bandwidth Indication IE
81   * @wide_bw: Contains info for Wide Bandwidth Channel IE
82   */
83  struct channel_load_req_info {
84  	uint8_t channel;
85  	qdf_freq_t req_freq;
86  	enum phy_ch_width req_chan_width;
87  	qdf_time_t rrm_scan_tsf;
88  	struct bw_ind_element bw_ind;
89  	struct wide_bw_chan_switch wide_bw;
90  };
91  
92  typedef struct sRrmSMEContext {
93  	uint16_t token;
94  	struct qdf_mac_addr sessionBssId;
95  	uint8_t regClass;
96  	uint8_t measurement_idx;
97  	enum rrm_measurement_type measurement_type;
98  	struct channel_load_req_info chan_load_req_info;
99  	/* list of all channels to be measured. */
100  	tCsrChannelInfo channelList;
101  	uint8_t currentIndex;
102  	/* SSID used in the measuring beacon report. */
103  	tAniSSID ssId;
104  	tSirMacAddr bssId;      /* bssid used for beacon report measurement. */
105  	/* Randomization interval to be used in subsequent measurements. */
106  	uint16_t randnIntvl;
107  	uint16_t duration[SIR_ESE_MAX_MEAS_IE_REQS];
108  	uint8_t measMode[SIR_ESE_MAX_MEAS_IE_REQS];
109  	uint32_t scan_id;
110  	tDblLinkList neighborReportCache;
111  	tRrmNeighborRequestControlInfo neighborReqControlInfo;
112  
113  #ifdef FEATURE_WLAN_ESE
114  	tCsrEseBeaconReq eseBcnReqInfo;
115  	bool eseBcnReqInProgress;
116  #endif /* FEATURE_WLAN_ESE */
117  	tRrmMsgReqSource msgSource;
118  	wlan_scan_requester req_id;
119  } tRrmSMEContext, *tpRrmSMEContext;
120  
121  typedef struct sRrmNeighborReq {
122  	uint8_t no_ssid;
123  	tSirMacSSid ssid;
124  	bool neighbor_report_offload;
125  } tRrmNeighborReq, *tpRrmNeighborReq;
126  
127  /**
128   * sme_rrm_issue_scan_req() - To issue rrm scan request
129   * @mac_ctx: pointer to mac context
130   *
131   * This routine is called to issue rrm scan request
132   *
133   * Return: QDF_STATUS
134   */
135  QDF_STATUS sme_rrm_issue_scan_req(struct mac_context *mac_ctx, uint8_t idx);
136  
137  #endif /* #if !defined( __SMERRMINTERNAL_H ) */
138