1 /* 2 * Copyright (c) 2017-2019, 2021 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 * DOC: Defines RoC API & structures 22 */ 23 24 #ifndef _WLAN_P2P_ROC_H_ 25 #define _WLAN_P2P_ROC_H_ 26 27 #include <qdf_types.h> 28 #include <qdf_mc_timer.h> 29 #include <qdf_list.h> 30 31 #define P2P_EVENT_PROPAGATE_TIME 10 32 #define P2P_WAIT_CANCEL_ROC 1000 33 #define P2P_WAIT_CLEANUP_ROC 2000 34 #define P2P_MAX_ROC_DURATION 1500 35 #define P2P_MAX_ROC_DURATION_GO_PRESENT 600 36 #define P2P_MAX_ROC_DURATION_DBS_NDP_PRESENT 350 37 #define P2P_MAX_ROC_DURATION_NON_DBS_NDP_PRESENT 250 38 #define P2P_MAX_ROC_DURATION_DBS_NAN_PRESENT 350 39 #define P2P_MAX_ROC_DURATION_NON_DBS_NAN_PRESENT 300 40 41 #define P2P_ROC_DURATION_MULTI_GO_PRESENT 300 42 #define P2P_ROC_DURATION_MULTI_GO_ABSENT 10 43 #define P2P_ACTION_FRAME_DEFAULT_WAIT 200 44 #define P2P_ROC_DEFAULT_DURATION 200 45 46 struct wlan_objmgr_vdev; 47 struct scan_event; 48 49 /** 50 * enum roc_type - user requested or off channel tx 51 * @USER_REQUESTED: Requested by supplicant 52 * @OFF_CHANNEL_TX: Issued internally for off channel tx 53 */ 54 enum roc_type { 55 USER_REQUESTED, 56 OFF_CHANNEL_TX, 57 }; 58 59 /** 60 * enum roc_state - P2P RoC state 61 * @ROC_STATE_IDLE: RoC not yet started or completed 62 * @ROC_STATE_REQUESTED: Sent scan command to scan manager 63 * @ROC_STATE_STARTED: Got started event from scan manager 64 * @ROC_STATE_ON_CHAN: Got foreign channel event from SCM 65 * @ROC_STATE_CANCEL_IN_PROG: Requested abort scan to SCM 66 * @ROC_STATE_INVALID: We should not come to this state 67 */ 68 enum roc_state { 69 ROC_STATE_IDLE = 0, 70 ROC_STATE_REQUESTED, 71 ROC_STATE_STARTED, 72 ROC_STATE_ON_CHAN, 73 ROC_STATE_CANCEL_IN_PROG, 74 ROC_STATE_INVALID, 75 }; 76 77 /** 78 * struct p2p_roc_context - RoC request context 79 * @node: Node for next element in the list 80 * @p2p_soc_obj: Pointer to SoC global p2p private object 81 * @vdev_id: Vdev id on which this request has come 82 * @scan_id: Scan id given by scan component for this roc req 83 * @tx_ctx: TX context if this ROC is for tx MGMT 84 * @chan_freq: Chan frequency for which this RoC has been requested 85 * @phy_mode: PHY mode 86 * @duration: Duration for the RoC 87 * @roc_type: RoC type User requested or internal 88 * @roc_timer: RoC timer 89 * @roc_state: Roc state 90 * @id: identifier of roc 91 */ 92 struct p2p_roc_context { 93 qdf_list_node_t node; 94 struct p2p_soc_priv_obj *p2p_soc_obj; 95 uint32_t vdev_id; 96 uint32_t scan_id; 97 void *tx_ctx; 98 qdf_freq_t chan_freq; 99 uint8_t phy_mode; 100 uint32_t duration; 101 enum roc_type roc_type; 102 qdf_mc_timer_t roc_timer; 103 enum roc_state roc_state; 104 int32_t id; 105 }; 106 107 /** 108 * struct cancel_roc_context - p2p cancel roc context 109 * @p2p_soc_obj: Pointer to SoC global p2p private object 110 * @cookie: Cookie which is given by supplicant 111 */ 112 struct cancel_roc_context { 113 struct p2p_soc_priv_obj *p2p_soc_obj; 114 uint64_t cookie; 115 }; 116 117 /** 118 * struct p2p_cleanup_param - p2p cleanup parameters 119 * @p2p_soc_obj: Pointer to SoC global p2p private object 120 * @vdev_id: vdev id 121 */ 122 struct p2p_cleanup_param { 123 struct p2p_soc_priv_obj *p2p_soc_obj; 124 uint32_t vdev_id; 125 }; 126 127 /** 128 * p2p_mgmt_rx_action_ops() - register or unregister rx action callback 129 * @psoc: psoc object 130 * @isregister: register if true, unregister if false 131 * 132 * This function registers or unregisters rx action frame callback to 133 * mgmt txrx component. 134 * 135 * Return: QDF_STATUS_SUCCESS - in case of success 136 */ 137 QDF_STATUS p2p_mgmt_rx_action_ops(struct wlan_objmgr_psoc *psoc, 138 bool isregister); 139 140 /** 141 * p2p_find_current_roc_ctx() - Find out roc context in progressing 142 * @p2p_soc_obj: p2p psoc private object 143 * 144 * This function finds out roc context in progressing from p2p psoc 145 * private object 146 * 147 * Return: Pointer to roc context - success 148 * NULL - failure 149 */ 150 struct p2p_roc_context *p2p_find_current_roc_ctx( 151 struct p2p_soc_priv_obj *p2p_soc_obj); 152 153 /** 154 * p2p_find_roc_by_tx_ctx() - Find out roc context by tx context 155 * @p2p_soc_obj: p2p psoc private object 156 * @cookie: cookie is the key to find out roc context 157 * 158 * This function finds out roc context by tx context from p2p psoc 159 * private object 160 * 161 * Return: Pointer to roc context - success 162 * NULL - failure 163 */ 164 struct p2p_roc_context *p2p_find_roc_by_tx_ctx( 165 struct p2p_soc_priv_obj *p2p_soc_obj, uint64_t cookie); 166 167 /** 168 * p2p_find_roc_by_chan_freq() - Find out roc context by channel 169 * @p2p_soc_obj: p2p psoc private object 170 * @chan_freq: channel frequency of the ROC 171 * 172 * This function finds out roc context by channel from p2p psoc 173 * private object 174 * 175 * Return: Pointer to roc context - success 176 * NULL - failure 177 */ 178 struct p2p_roc_context *p2p_find_roc_by_chan_freq( 179 struct p2p_soc_priv_obj *p2p_soc_obj, qdf_freq_t chan_freq); 180 181 /** 182 * p2p_restart_roc_timer() - Restarts roc timer 183 * @roc_ctx: remain on channel context 184 * 185 * This function restarts roc timer with updated duration. 186 * 187 * Return: QDF_STATUS_SUCCESS - in case of success 188 */ 189 QDF_STATUS p2p_restart_roc_timer(struct p2p_roc_context *roc_ctx); 190 191 /** 192 * p2p_cleanup_roc() - Cleanup roc context in queue 193 * @p2p_soc_obj: p2p psoc private object 194 * @vdev: vdev object 195 * @sync: whether to wait for complete event 196 * 197 * This function cleanup roc context in queue, include the roc 198 * context in progressing until cancellation done. To avoid deadlock, 199 * don't call from scheduler thread. 200 * 201 * Return: QDF_STATUS_SUCCESS - in case of success 202 */ 203 QDF_STATUS p2p_cleanup_roc(struct p2p_soc_priv_obj *p2p_soc_obj, 204 struct wlan_objmgr_vdev *vdev, 205 bool sync); 206 207 /** 208 * p2p_process_cleanup_roc_queue() - process the message to cleanup roc 209 * @param: pointer to cleanup parameters 210 * 211 * This function process the message to cleanup roc context in queue, 212 * include the roc context in progressing. 213 * 214 * Return: QDF_STATUS_SUCCESS - in case of success 215 */ 216 QDF_STATUS p2p_process_cleanup_roc_queue( 217 struct p2p_cleanup_param *param); 218 219 /** 220 * p2p_process_roc_req() - Process roc request 221 * @roc_ctx: roc request context 222 * 223 * This function handles roc request. It will call API from scan/mgmt 224 * txrx component. 225 * 226 * Return: QDF_STATUS_SUCCESS - in case of success 227 */ 228 QDF_STATUS p2p_process_roc_req(struct p2p_roc_context *roc_ctx); 229 230 /** 231 * p2p_process_cancel_roc_req() - Process cancel roc request 232 * @cancel_roc_ctx: cancel roc request context 233 * 234 * This function cancel roc request by cookie. 235 * 236 * Return: QDF_STATUS_SUCCESS - in case of success 237 */ 238 QDF_STATUS p2p_process_cancel_roc_req( 239 struct cancel_roc_context *cancel_roc_ctx); 240 241 /** 242 * p2p_scan_event_cb() - Process scan event 243 * @vdev: vdev associated to this scan event 244 * @event: event information 245 * @arg: registered arguments 246 * 247 * This function handles P2P scan event and deliver P2P event to HDD 248 * layer by registered callback. 249 * 250 * Return: None 251 */ 252 void p2p_scan_event_cb(struct wlan_objmgr_vdev *vdev, 253 struct scan_event *event, void *arg); 254 255 #endif /* _WLAN_P2P_ROC_H_ */ 256