1 /* 2 * Copyright 2022, Cypress Semiconductor Corporation (an Infineon company) 3 * SPDX-License-Identifier: Apache-2.0 4 * 5 * Licensed under the Apache License, Version 2.0 (the "License"); 6 * you may not use this file except in compliance with the License. 7 * You may obtain a copy of the License at 8 * 9 * http://www.apache.org/licenses/LICENSE-2.0 10 * 11 * Unless required by applicable law or agreed to in writing, software 12 * distributed under the License is distributed on an "AS IS" BASIS, 13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 * See the License for the specific language governing permissions and 15 * limitations under the License. 16 */ 17 18 #ifndef INCLUDED_WHD_CHIP_H 19 #define INCLUDED_WHD_CHIP_H 20 21 #include "cyabs_rtos.h" /* For cy_semaphore_t */ 22 23 #include "whd_endian.h" 24 #include "whd.h" 25 #include "whd_wifi_api.h" 26 27 #ifdef __cplusplus 28 extern "C" 29 { 30 #endif 31 32 /****************************************************** 33 * Constants 34 ******************************************************/ 35 #define WHD_WLAN_WAKE_TIMEOUT (10000) 36 #define WHD_SHARED_MEMORY_POLLING_DELAY (10) 37 #define SICF_CPUHALT (0x0020) 38 39 /****************************************************** 40 * Enumerations 41 ******************************************************/ 42 /** 43 * Enumerated list of aggregate codes and edit WHD_COUNTRY_AGGREGATE_CUSTOMER for supporting new aggregate 44 * as per customer like XZ/278 45 */ 46 typedef enum 47 { 48 WHD_COUNTRY_AGGREGATE_XA_0 = MK_CNTRY('X', 'A', 0), 49 WHD_COUNTRY_AGGREGATE_XT_0 = MK_CNTRY('X', 'T', 0), 50 WHD_COUNTRY_AGGREGATE_XV_0 = MK_CNTRY('X', 'V', 0), 51 WHD_COUNTRY_AGGREGATE_CUSTOMER = MK_CNTRY('X', 'Z', 278), 52 } whd_aggregate_code_t; 53 54 typedef enum 55 { 56 /* Note : If changing this, core_base_address must be changed also */ 57 WLAN_ARM_CORE = 0, SOCRAM_CORE = 1, SDIOD_CORE = 2 58 } device_core_t; 59 60 typedef enum 61 { 62 WLAN_DOWN, WLAN_UP, WLAN_OFF 63 } wlan_state_t; 64 65 typedef enum 66 { 67 WLAN_CORE_FLAG_NONE, WLAN_CORE_FLAG_CPU_HALT, 68 } wlan_core_flag_t; 69 70 /** 71 * Enumeration of AKM (authentication and key management) suites. Table 8-140 802.11mc D3.0. 72 */ 73 typedef enum 74 { 75 WHD_AKM_RESERVED = 0, 76 WHD_AKM_8021X = 1, /**< WPA2 enterprise */ 77 WHD_AKM_PSK = 2, /**< WPA2 PSK */ 78 WHD_AKM_FT_8021X = 3, /**< 802.11r Fast Roaming enterprise */ 79 WHD_AKM_FT_PSK = 4, /**< 802.11r Fast Roaming PSK */ 80 WHD_AKM_8021X_SHA256 = 5, 81 WHD_AKM_PSK_SHA256 = 6, 82 WHD_AKM_TDLS = 7, /**< Tunneled Direct Link Setup */ 83 WHD_AKM_SAE_SHA256 = 8, 84 WHD_AKM_FT_SAE_SHA256 = 9, 85 WHD_AKM_AP_PEER_KEY_SHA256 = 10, 86 WHD_AKM_SUITEB_8021X_HMAC_SHA256 = 11, 87 WHD_AKM_SUITEB_8021X_HMAC_SHA384 = 12, 88 WHD_AKM_SUITEB_FT_8021X_HMAC_SHA384 = 13, 89 } whd_akm_suite_t; 90 91 /** 92 * Enumeration of cipher suites. Table 8-138 802.11mc D3.0. 93 */ 94 typedef enum 95 { 96 WHD_CIPHER_GROUP = 0, /**< Use group cipher suite */ 97 WHD_CIPHER_WEP_40 = 1, /**< WEP-40 */ 98 WHD_CIPHER_TKIP = 2, /**< TKIP */ 99 WHD_CIPHER_RESERVED = 3, /**< Reserved */ 100 WHD_CIPHER_CCMP_128 = 4, /**< CCMP-128 - default pairwise and group cipher suite in an RSNA */ 101 WHD_CIPHER_WEP_104 = 5, /**< WEP-104 - also known as WEP-128 */ 102 WHD_CIPHER_BIP_CMAC_128 = 6, /**< BIP-CMAC-128 - default management frame cipher suite */ 103 WHD_CIPHER_GROUP_DISALLOWED = 7, /**< Group address traffic not allowed */ 104 WHD_CIPHER_GCMP_128 = 8, /**< GCMP-128 - default for 60 GHz STAs */ 105 WHD_CIPHER_GCMP_256 = 9, /**< GCMP-256 - introduced for Suite B */ 106 WHD_CIPHER_CCMP_256 = 10, /**< CCMP-256 - introduced for suite B */ 107 WHD_CIPHER_BIP_GMAC_128 = 11, /**< BIP-GMAC-128 - introduced for suite B */ 108 WHD_CIPHER_BIP_GMAC_256 = 12, /**< BIP-GMAC-256 - introduced for suite B */ 109 WHD_CIPHER_BIP_CMAC_256 = 13, /**< BIP-CMAC-256 - introduced for suite B */ 110 } whd_80211_cipher_t; 111 112 /****************************************************** 113 * Structures 114 ******************************************************/ 115 116 typedef struct whd_chip_info 117 { 118 uint16_t chip_id; 119 whd_bool_t save_restore_enable; 120 uint32_t fwcap_flags; 121 } whd_chip_info_t; 122 123 typedef struct whd_fwcap 124 { 125 whd_fwcap_id_t feature; 126 const char *const fwcap_name; 127 } whd_fwcap_t; 128 129 typedef struct 130 { 131 wlan_state_t state; 132 whd_country_code_t country_code; 133 whd_aggregate_code_t aggregate_code; 134 uint32_t keep_wlan_awake; 135 } whd_wlan_status_t; 136 137 #pragma pack(1) 138 139 /* 802.11 Information Element structures */ 140 141 /* Country Information */ 142 #define COUNTRY_INFO_IE_MINIMUM_LENGTH (6) 143 144 typedef struct 145 { 146 uint8_t first_chan_num; 147 uint8_t num_chans; 148 uint8_t max_tx_pwr_level; 149 } country_chan_info_t; 150 151 /* Structures for TLVs with 8-bit type and 8-bit length */ 152 typedef struct 153 { 154 uint8_t type; 155 uint8_t length; 156 } whd_tlv8_header_t; 157 158 typedef struct 159 { 160 uint8_t type; 161 uint8_t length; 162 uint8_t data[1]; 163 } whd_tlv8_data_t; 164 165 typedef struct 166 { 167 whd_tlv8_header_t tlv_header; /* id, length */ 168 char ccode[2]; /* dot11CountryString MIB octet 1~2, two letter country code */ 169 uint8_t env; /* dot11CountryString MIB octet 3, indicate indoor/outdoor environment */ 170 country_chan_info_t country_chan_info[1]; /* At least one country channel info triples */ 171 } country_info_ie_fixed_portion_t; 172 173 /* Robust Secure Network */ 174 typedef struct 175 { 176 whd_tlv8_header_t tlv_header; /* id, length */ 177 uint16_t version; 178 uint32_t group_key_suite; /* See whd_80211_cipher_t for values */ 179 uint16_t pairwise_suite_count; 180 uint32_t pairwise_suite_list[1]; 181 } rsn_ie_fixed_portion_t; 182 183 #define RSN_IE_MINIMUM_LENGTH (8) 184 185 typedef struct 186 { 187 whd_tlv8_header_t tlv_header; /* id, length */ 188 uint8_t oui[4]; 189 } vendor_specific_ie_header_t; 190 191 #define VENDOR_SPECIFIC_IE_MINIMUM_LENGTH (4) 192 193 /* WPA IE */ 194 typedef struct 195 { 196 vendor_specific_ie_header_t vendor_specific_header; 197 uint16_t version; 198 uint32_t multicast_suite; 199 uint16_t unicast_suite_count; 200 uint8_t unicast_suite_list[1][4]; 201 } wpa_ie_fixed_portion_t; 202 203 #define WPA_IE_MINIMUM_LENGTH (12) 204 205 typedef struct 206 { 207 uint16_t akm_suite_count; 208 uint32_t akm_suite_list[1]; 209 } akm_suite_portion_t; 210 211 /* RSNX IE */ 212 typedef struct 213 { 214 whd_tlv8_header_t tlv_header; /* id, length */ 215 uint8_t data[1]; 216 } rsnx_ie_t; 217 218 #define DOT11_RSNX_CAP_LEN 1 /* Extended RSN Capabilities length in octets (1 octet) */ 219 #define DOT11_RSNX_SAE_H2E 5 /* Extended RSN Capabilities */ 220 221 typedef struct 222 { 223 whd_tlv8_header_t tlv_header; /* id, length */ 224 uint16_t ht_capabilities_info; 225 uint8_t ampdu_parameters; 226 uint8_t rx_mcs[10]; 227 uint16_t rxhighest_supported_data_rate; 228 uint8_t tx_supported_mcs_set; 229 uint8_t tx_mcs_info[3]; 230 uint16_t ht_extended_capabilities; 231 uint32_t transmit_beam_forming_capabilities; 232 uint8_t antenna_selection_capabilities; 233 } ht_capabilities_ie_t; 234 235 #define HT_CAPABILITIES_INFO_LDPC_CODING_CAPABILITY (1 << 0) 236 #define HT_CAPABILITIES_INFO_SUPPORTED_CHANNEL_WIDTH_SET (1 << 1) 237 #define HT_CAPABILITIES_INFO_SM_POWER_SAVE_OFFSET (1 << 2) 238 #define HT_CAPABILITIES_INFO_SM_POWER_SAVE_MASK (3 << 2) 239 #define HT_CAPABILITIES_INFO_HT_GREENFIELD (1 << 4) 240 #define HT_CAPABILITIES_INFO_SHORT_GI_FOR_20MHZ (1 << 5) 241 #define HT_CAPABILITIES_INFO_SHORT_GI_FOR_40MHZ (1 << 6) 242 #define HT_CAPABILITIES_INFO_TX_STBC (1 << 7) 243 #define HT_CAPABILITIES_INFO_RX_STBC_OFFSET (1 << 8) 244 #define HT_CAPABILITIES_INFO_RX_STBC_MASK (3 << 8) 245 #define HT_CAPABILITIES_INFO_HT_DELAYED_BLOCK_ACK (1 << 10) 246 #define HT_CAPABILITIES_INFO_MAXIMUM_A_MSDU_LENGTH (1 << 11) 247 #define HT_CAPABILITIES_INFO_DSSS_CCK_MODE_IN_40MHZ (1 << 12) 248 /* bit 13 reserved */ 249 #define HT_CAPABILITIES_INFO_40MHZ_INTOLERANT (1 << 14) 250 #define HT_CAPABILITIES_INFO_L_SIG_TXOP_PROTECTION_SUPPORT (1 << 15) 251 252 typedef unsigned int uint; 253 typedef struct 254 { 255 uint buf; 256 uint buf_size; 257 uint idx; 258 uint out_idx; /* output index */ 259 } hnd_log_t; 260 261 #define CBUF_LEN 128 262 263 typedef struct 264 { 265 /* Virtual UART 266 * When there is no UART (e.g. Quickturn), the host should write a complete 267 * input line directly into cbuf and then write the length into vcons_in. 268 * This may also be used when there is a real UART (at risk of conflicting with 269 * the real UART). vcons_out is currently unused. 270 */ 271 volatile uint vcons_in; 272 volatile uint vcons_out; 273 274 /* Output (logging) buffer 275 * Console output is written to a ring buffer log_buf at index log_idx. 276 * The host may read the output when it sees log_idx advance. 277 * Output will be lost if the output wraps around faster than the host polls. 278 */ 279 hnd_log_t log; 280 281 /* Console input line buffer 282 * Characters are read one at a time into cbuf until <CR> is received, then 283 * the buffer is processed as a command line. Also used for virtual UART. 284 */ 285 uint cbuf_idx; 286 char cbuf[CBUF_LEN]; 287 } hnd_cons_t; 288 289 typedef struct wifi_console 290 { 291 uint count; /* Poll interval msec counter */ 292 uint log_addr; /* Log struct address (fixed) */ 293 hnd_log_t log; /* Log struct (host copy) */ 294 uint bufsize; /* Size of log buffer */ 295 char *buf; /* Log buffer (host copy) */ 296 uint last; /* Last buffer read index */ 297 } wifi_console_t; 298 299 typedef struct 300 { 301 uint flags; 302 uint trap_addr; 303 uint assert_exp_addr; 304 uint assert_file_addr; 305 uint assert_line; 306 uint console_addr; 307 uint msgtrace_addr; 308 uint fwid; 309 } wlan_shared_t; 310 311 /* Buffer size to be allocated to read wlan log */ 312 #define WLAN_LOG_BUF_LEN (4 * 1024) 313 314 #define WHD_IOCTL_LOG_SIZE 64 315 #define WHD_IOVAR_STRING_SIZE 128 316 #define WHD_MAX_DATA_SIZE 64 317 318 typedef struct 319 { 320 uint32_t ioct_log; 321 uint8_t is_this_event; 322 uint8_t data[WHD_MAX_DATA_SIZE]; 323 uint32_t data_size; 324 uint16_t flag; 325 uint32_t reason; 326 }whd_ioctl_log_t; 327 328 whd_result_t whd_ioctl_log_add(whd_driver_t whd_driver, uint32_t cmd, whd_buffer_t buffer); 329 whd_result_t whd_ioctl_log_add_event(whd_driver_t whd_driver, uint32_t cmd, uint16_t flag, uint32_t data); 330 331 whd_result_t whd_ioctl_print(whd_driver_t whd_driver); 332 333 #pragma pack() 334 335 typedef struct whd_internal_info 336 { 337 whd_wlan_status_t whd_wlan_status; 338 wifi_console_t *c; 339 wifi_console_t console; 340 wlan_shared_t sh; 341 uint32_t console_addr; 342 whd_scan_result_callback_t scan_result_callback; 343 whd_scan_result_t *whd_scan_result_ptr; 344 /* The semaphore used to wait for completion of a join; 345 * whd_wifi_join_halt uses this to release waiting threads (if any) */ 346 cy_semaphore_t *active_join_semaphore; 347 whd_bool_t active_join_mutex_initted; 348 cy_semaphore_t active_join_mutex; 349 uint con_lastpos; 350 whd_bool_t whd_wifi_p2p_go_is_up; 351 uint32_t whd_join_status[3]; 352 whd_auth_result_callback_t auth_result_callback; 353 } whd_internal_info_t; 354 355 #pragma pack(1) 356 357 typedef struct 358 { 359 char abbrev[3]; 360 uint8_t rev; 361 uint8_t data[64]; 362 } whd_country_info_t; 363 364 #pragma pack() 365 366 whd_result_t whd_internal_info_init(whd_driver_t whd_driver); 367 whd_result_t whd_internal_info_deinit(whd_driver_t whd_driver); 368 369 /****************************************************** 370 * Function Declarations 371 ******************************************************/ 372 373 extern void whd_wifi_chip_info_init(whd_driver_t whd_driver); 374 extern whd_result_t whd_wlan_bus_complete_ds_wake(whd_driver_t whd_driver, whd_bool_t wake_from_firmware, 375 uint32_t wake_event_indication_addr, uint32_t wake_indication_addr, 376 uint32_t sdio_control_addr); 377 extern whd_result_t whd_wifi_set_custom_country_code(whd_interface_t ifp, const whd_country_info_t *country_code); 378 379 /* Device core control functions */ 380 extern whd_result_t whd_disable_device_core(whd_driver_t whd_driver, device_core_t core_id, wlan_core_flag_t core_flag); 381 extern whd_result_t whd_reset_device_core(whd_driver_t whd_driver, device_core_t core_id, wlan_core_flag_t core_flag); 382 extern whd_result_t whd_reset_core(whd_driver_t whd_driver, device_core_t core_id, uint32_t bits, uint32_t resetbits); 383 extern whd_result_t whd_wlan_armcore_run(whd_driver_t whd_driver, device_core_t core_id, wlan_core_flag_t core_flag); 384 extern whd_result_t whd_device_core_is_up(whd_driver_t whd_driver, device_core_t core_id); 385 386 /* Chip specific functions */ 387 extern whd_result_t whd_allow_wlan_bus_to_sleep(whd_driver_t whd_driver); 388 extern whd_result_t whd_ensure_wlan_bus_is_up(whd_driver_t whd_driver); 389 390 extern whd_result_t whd_chip_specific_init(whd_driver_t whd_driver); 391 extern whd_result_t whd_chip_specific_socsram_init(whd_driver_t whd_driver); 392 extern whd_result_t whd_wifi_read_wlan_log(whd_driver_t whd_driver, char *buffer, uint32_t buffer_size); 393 extern whd_result_t whd_wifi_print_whd_log(whd_driver_t whd_driver); 394 extern whd_result_t whd_wifi_read_wlan_log_unsafe(whd_driver_t whd_driver, uint32_t wlan_shared_address, char *buffer, 395 uint32_t buffer_size); 396 extern whd_result_t whd_wifi_read_fw_capabilities(whd_interface_t ifp); 397 extern void whd_wifi_peek(whd_driver_t whd_driver, uint32_t address, uint8_t register_length, uint8_t *value); 398 extern void whd_wifi_poke(whd_driver_t whd_driver, uint32_t address, uint8_t register_length, uint32_t value); 399 extern uint32_t whd_wifi_get_btc_params(whd_driver_t whd_driver, uint32_t address, whd_interface_t interface); 400 401 #ifdef __cplusplus 402 } /* extern "C" */ 403 #endif 404 405 #endif /* ifndef INCLUDED_WHD_CHIP_H */ 406