1 /* 2 * Copyright (c) 2021, The Linux Foundation. All rights reserved. 3 * Copyright (c) 2022-2024 Qualcomm Innovation Center, Inc. All rights reserved. 4 * 5 * Permission to use, copy, modify, and/or distribute this software for any 6 * purpose with or without fee is hereby granted, provided that the above 7 * copyright notice and this permission notice appear in all copies. 8 * 9 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 10 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 11 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 12 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 13 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 14 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 15 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 16 */ 17 18 /** 19 * DOC: Define the data structure for AFC implementation 20 */ 21 22 #ifndef __WLAN_REG_AFC_H 23 #define __WLAN_REG_AFC_H 24 25 /* All the structures in this header will be packed and will follow network 26 * byte order 27 */ 28 29 /** 30 * struct wlan_afc_freq_range_obj - Structure for frequency range query. 31 * @lowfreq: Lower limit(in MHz) for frequency range query. 32 * @highfreq: Higher limit(in MHz) for frequency range query. 33 */ 34 struct wlan_afc_freq_range_obj { 35 uint16_t lowfreq; 36 uint16_t highfreq; 37 }; 38 39 /** 40 * struct wlan_afc_frange_list - Structure to send freq range list to AFC app. 41 * @num_ranges: Number of queried frequency ranges. 42 * @range_objs: List of queried frequency ranges. 43 */ 44 struct wlan_afc_frange_list { 45 uint32_t num_ranges; 46 struct wlan_afc_freq_range_obj *range_objs; 47 }; 48 49 /** 50 * struct wlan_afc_opclass_obj - Structure for opclass/channel query. 51 * @opclass_num_cfis: Number of channels to be required for given opclass. 52 * @opclass: Operating class to be queried. 53 * @cfis: List of Channels to be queried for given Global opclass. 54 */ 55 struct wlan_afc_opclass_obj { 56 uint8_t opclass_num_cfis; 57 uint8_t opclass; 58 uint8_t *cfis; 59 }; 60 61 /** 62 * struct wlan_afc_opclass_obj_list - Structure to send opclass object list 63 * to AFC app. 64 * @num_opclass_objs: Number of opclass objects. 65 * @opclass_objs: Pointer to list of opclass objects. 66 */ 67 struct wlan_afc_opclass_obj_list { 68 uint8_t num_opclass_objs; 69 struct wlan_afc_opclass_obj *opclass_objs; 70 }; 71 72 /** 73 * struct wlan_afc_host_request - Structure to send AFC request info. 74 * @req_id: Unique request ID from FW to be used as AFC request ID 75 * to server. 76 * @version_minor: Lower 16 bits for the AFC request version. 77 * @version_major: Higher 16 bits for the AFC request version. 78 * @min_des_power: Minimum desired power(in dbm) for queried spectrum. 79 * @freq_lst: Pointer to the list of frequency ranges. 80 * @opclass_obj_lst: Pointer to opclass objects list. 81 * @afc_location: Pointer to the AFC location structure, 82 */ 83 struct wlan_afc_host_request { 84 uint64_t req_id; 85 uint16_t version_minor; 86 uint16_t version_major; 87 int16_t min_des_power; 88 struct wlan_afc_frange_list *freq_lst; 89 struct wlan_afc_opclass_obj_list *opclass_obj_lst; 90 struct wlan_afc_location *afc_location; 91 }; 92 93 /** 94 * enum reg_afc_dev_deploy_type - Deployment type of AP 95 * @AFC_DEPLOYMENT_UNKNOWN: Unknown 96 * @AFC_DEPLOYMENT_INDOOR: Located Indoor 97 * @AFC_DEPLOYMENT_OUTDOOR: Located Outdoor 98 */ 99 enum reg_afc_dev_deploy_type { 100 AFC_DEPLOYMENT_UNKNOWN = 0, 101 AFC_DEPLOYMENT_INDOOR = 1, 102 AFC_DEPLOYMENT_OUTDOOR = 2, 103 }; 104 105 /** 106 * enum reg_afc_resp_format_type - Response type supported by AP 107 * 108 * @AFC_RESP_TYPE_JSON_RESP: JSON format 109 * @AFC_RESP_TYPE_BIN_RESP: Binary format 110 */ 111 enum reg_afc_resp_format_type { 112 AFC_RESP_TYPE_JSON_RESP = 0, 113 AFC_RESP_TYPE_BIN_RESP = 1, 114 }; 115 116 /** 117 * enum afc_object_type - AFC Request object types 118 * @AFC_OBJ_LOCATION: Location object 119 */ 120 enum afc_object_type { 121 AFC_OBJ_LOCATION = 1 122 }; 123 124 /** 125 * struct wlan_afc_location - Structure for afc location info. 126 * @deployment_type: Deployment type of enum reg_afc_dev_deploy_type 127 */ 128 struct wlan_afc_location { 129 uint32_t deployment_type; 130 }; 131 132 /** 133 * struct wlan_afc_host_resp - Structure for AFC Host response to FW 134 * @header: Header for compatibility. 135 * Valid value: 0 136 * @status: Flag to indicate validity of data. To be updated by TZ 137 * 1: Success 138 * -1: Failure 139 * @time_to_live: Period(in seconds) the data is valid for 140 * @length: Length of the response message 141 * @resp_format: AFC response format. 142 * 0: JSON format 143 * 1: Binary data format 144 * @afc_resp: Response message from the AFC server for queried parameters 145 * 146 * The following is the layout of the AFC response. 147 * 148 * struct wlan_afc_host_resp { 149 * header; 150 * status; 151 * time_to_live; 152 * length; 153 * resp_format; 154 * afc_resp { 155 * struct wlan_afc_bin_resp_data fixed_params; 156 * struct wlan_afc_resp_freq_psd_info obj[0]; 157 * .... 158 * struct wlan_afc_resp_freq_psd_info obj[num_frequency_obj - 1]; 159 * struct wlan_afc_resp_opclass_info opclass[0]; 160 * { 161 * struct wlan_afc_resp_eirp_info eirp[0]; 162 * .... 163 * struct wlan_afc_resp_eirp_info eirp[num_channels - 1]; 164 * } 165 * . 166 * . 167 * struct wlan_afc_resp_opclass_info opclass[num_channel_obj - 1]; 168 * { 169 * struct wlan_afc_resp_eirp_info eirp[0]; 170 * .... 171 * struct wlan_afc_resp_eirp_info eirp[num_channels - 1]; 172 * } 173 * } 174 * } 175 * 176 */ 177 struct wlan_afc_host_resp { 178 uint32_t header; 179 int32_t status; 180 uint32_t time_to_live; 181 uint32_t length; 182 uint32_t resp_format; 183 uint8_t afc_resp[]; 184 } qdf_packed; 185 186 /** 187 * struct wlan_afc_resp_opclass_info - Structure to populate operating class 188 * and channel information from AFC 189 * response. 190 * @opclass: Operating class 191 * @num_channels: Number of channels received in AFC response 192 */ 193 struct wlan_afc_resp_opclass_info { 194 uint32_t opclass; 195 uint32_t num_channels; 196 } qdf_packed; 197 198 /** 199 * struct wlan_afc_resp_eirp_info - Structure to update EIRP values for channels 200 * @channel_cfi: Channel center frequency index 201 * @max_eirp_pwr: Maximum permissible EIRP(in dBm) for the Channel 202 */ 203 struct wlan_afc_resp_eirp_info { 204 uint32_t channel_cfi; 205 int32_t max_eirp_pwr; 206 } qdf_packed; 207 208 /** 209 * struct wlan_afc_resp_freq_psd_info - Structure to update PSD values for 210 * queried frequency ranges 211 * @freq_info: Frequency range in MHz:- bits 15:0 = u16 start_freq, 212 * bits 31:16 = u16 end_freq 213 * @max_psd: Maximum PSD in dbm/MHz 214 */ 215 struct wlan_afc_resp_freq_psd_info { 216 uint32_t freq_info; 217 uint32_t max_psd; 218 } qdf_packed; 219 220 /** 221 * struct wlan_afc_bin_resp_data - Structure to populate AFC binary response 222 * @local_err_code: Internal error code between AFC app and FW 223 * 0 - Success 224 * 1 - General failure 225 * @version: Internal version between AFC app and FW 226 * Current version: 1 227 * @afc_wfa_version: AFC spec version info. Bits 15:0 - Minor version 228 * Bits 31:16 - Major version 229 * @request_id: AFC unique request ID 230 * @avail_exp_time_d: Availability expiry date in UTC. 231 * Date format: bits 7:0 - DD (Day 1-31) 232 * bits 15:8 - MM (Month 1-12) 233 * bits 31:16 - YYYY (Year) 234 * @avail_exp_time_t: Availability expiry time in UTC. 235 * Time format: bits 7:0 - SS (Seconds 0-59) 236 * bits 15:8 - MM (Minutes 0-59) 237 * bits 23:16 - HH (Hours 0-23) 238 * bits 31:24 - Reserved 239 * @afc_serv_resp_code: AFC server response code. The AFC server response codes 240 * are defined in the WiFi Spec doc for AFC as follows: 241 * 0: Success. 242 * 100 - 199: General errors related to protocol. 243 * 300 - 399: Error events specific to message exchange 244 * for the available Spectrum Inquiry. 245 * @num_frequency_obj: Number of frequency objects 246 * @num_channel_obj: Number of channel objects 247 * @shortdesc: Short description corresponding to resp_code field 248 * @reserved: Reserved for future use 249 */ 250 struct wlan_afc_bin_resp_data { 251 uint32_t local_err_code; 252 uint32_t version; 253 uint32_t afc_wfa_version; 254 uint32_t request_id; 255 uint32_t avail_exp_time_d; 256 uint32_t avail_exp_time_t; 257 uint32_t afc_serv_resp_code; 258 uint32_t num_frequency_obj; 259 uint32_t num_channel_obj; 260 uint8_t shortdesc[64]; 261 uint32_t reserved[2]; 262 } qdf_packed; 263 #endif 264