1 /* 2 * Copyright (c) 2010-2011 Atheros Communications Inc. 3 * Copyright (c) 2011-2012 Qualcomm Atheros, Inc. 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 #ifndef CORE_H 19 #define CORE_H 20 21 #include <linux/etherdevice.h> 22 #include <linux/rtnetlink.h> 23 #include <linux/firmware.h> 24 #include <linux/sched.h> 25 #include <linux/circ_buf.h> 26 #include <net/cfg80211.h> 27 #include "htc.h" 28 #include "wmi.h" 29 #include "bmi.h" 30 #include "target.h" 31 32 #define MAX_ATH6KL 1 33 #define ATH6KL_MAX_RX_BUFFERS 16 34 #define ATH6KL_BUFFER_SIZE 1664 35 #define ATH6KL_MAX_AMSDU_RX_BUFFERS 4 36 #define ATH6KL_AMSDU_REFILL_THRESHOLD 3 37 #define ATH6KL_AMSDU_BUFFER_SIZE (WMI_MAX_AMSDU_RX_DATA_FRAME_LENGTH + 128) 38 #define MAX_MSDU_SUBFRAME_PAYLOAD_LEN 1508 39 #define MIN_MSDU_SUBFRAME_PAYLOAD_LEN 46 40 41 #define USER_SAVEDKEYS_STAT_INIT 0 42 #define USER_SAVEDKEYS_STAT_RUN 1 43 44 #define ATH6KL_TX_TIMEOUT 10 45 #define ATH6KL_MAX_ENDPOINTS 4 46 #define MAX_NODE_NUM 15 47 48 #define ATH6KL_APSD_ALL_FRAME 0xFFFF 49 #define ATH6KL_APSD_NUM_OF_AC 0x4 50 #define ATH6KL_APSD_FRAME_MASK 0xF 51 52 /* Extra bytes for htc header alignment */ 53 #define ATH6KL_HTC_ALIGN_BYTES 3 54 55 /* MAX_HI_COOKIE_NUM are reserved for high priority traffic */ 56 #define MAX_DEF_COOKIE_NUM 180 57 #define MAX_HI_COOKIE_NUM 18 /* 10% of MAX_COOKIE_NUM */ 58 #define MAX_COOKIE_NUM (MAX_DEF_COOKIE_NUM + MAX_HI_COOKIE_NUM) 59 60 #define MAX_DEFAULT_SEND_QUEUE_DEPTH (MAX_DEF_COOKIE_NUM / WMM_NUM_AC) 61 62 #define DISCON_TIMER_INTVAL 10000 /* in msec */ 63 64 /* Channel dwell time in fg scan */ 65 #define ATH6KL_FG_SCAN_INTERVAL 50 /* in ms */ 66 67 /* includes also the null byte */ 68 #define ATH6KL_FIRMWARE_MAGIC "QCA-ATH6KL" 69 70 enum ath6kl_fw_ie_type { 71 ATH6KL_FW_IE_FW_VERSION = 0, 72 ATH6KL_FW_IE_TIMESTAMP = 1, 73 ATH6KL_FW_IE_OTP_IMAGE = 2, 74 ATH6KL_FW_IE_FW_IMAGE = 3, 75 ATH6KL_FW_IE_PATCH_IMAGE = 4, 76 ATH6KL_FW_IE_RESERVED_RAM_SIZE = 5, 77 ATH6KL_FW_IE_CAPABILITIES = 6, 78 ATH6KL_FW_IE_PATCH_ADDR = 7, 79 ATH6KL_FW_IE_BOARD_ADDR = 8, 80 ATH6KL_FW_IE_VIF_MAX = 9, 81 }; 82 83 enum ath6kl_fw_capability { 84 ATH6KL_FW_CAPABILITY_HOST_P2P = 0, 85 ATH6KL_FW_CAPABILITY_SCHED_SCAN = 1, 86 87 /* 88 * Firmware is capable of supporting P2P mgmt operations on a 89 * station interface. After group formation, the station 90 * interface will become a P2P client/GO interface as the case may be 91 */ 92 ATH6KL_FW_CAPABILITY_STA_P2PDEV_DUPLEX, 93 94 /* 95 * Firmware has support to cleanup inactive stations 96 * in AP mode. 97 */ 98 ATH6KL_FW_CAPABILITY_INACTIVITY_TIMEOUT, 99 100 /* Firmware has support to override rsn cap of rsn ie */ 101 ATH6KL_FW_CAPABILITY_RSN_CAP_OVERRIDE, 102 103 /* 104 * Multicast support in WOW and host awake mode. 105 * Allow all multicast in host awake mode. 106 * Apply multicast filter in WOW mode. 107 */ 108 ATH6KL_FW_CAPABILITY_WOW_MULTICAST_FILTER, 109 110 /* Firmware supports enhanced bmiss detection */ 111 ATH6KL_FW_CAPABILITY_BMISS_ENHANCE, 112 113 /* 114 * FW supports matching of ssid in schedule scan 115 */ 116 ATH6KL_FW_CAPABILITY_SCHED_SCAN_MATCH_LIST, 117 118 /* this needs to be last */ 119 ATH6KL_FW_CAPABILITY_MAX, 120 }; 121 122 #define ATH6KL_CAPABILITY_LEN (ALIGN(ATH6KL_FW_CAPABILITY_MAX, 32) / 32) 123 124 struct ath6kl_fw_ie { 125 __le32 id; 126 __le32 len; 127 u8 data[0]; 128 }; 129 130 enum ath6kl_hw_flags { 131 ATH6KL_HW_FLAG_64BIT_RATES = BIT(0), 132 }; 133 134 #define ATH6KL_FW_API2_FILE "fw-2.bin" 135 #define ATH6KL_FW_API3_FILE "fw-3.bin" 136 137 /* AR6003 1.0 definitions */ 138 #define AR6003_HW_1_0_VERSION 0x300002ba 139 140 /* AR6003 2.0 definitions */ 141 #define AR6003_HW_2_0_VERSION 0x30000384 142 #define AR6003_HW_2_0_PATCH_DOWNLOAD_ADDRESS 0x57e910 143 #define AR6003_HW_2_0_FW_DIR "ath6k/AR6003/hw2.0" 144 #define AR6003_HW_2_0_OTP_FILE "otp.bin.z77" 145 #define AR6003_HW_2_0_FIRMWARE_FILE "athwlan.bin.z77" 146 #define AR6003_HW_2_0_TCMD_FIRMWARE_FILE "athtcmd_ram.bin" 147 #define AR6003_HW_2_0_PATCH_FILE "data.patch.bin" 148 #define AR6003_HW_2_0_BOARD_DATA_FILE AR6003_HW_2_0_FW_DIR "/bdata.bin" 149 #define AR6003_HW_2_0_DEFAULT_BOARD_DATA_FILE \ 150 AR6003_HW_2_0_FW_DIR "/bdata.SD31.bin" 151 152 /* AR6003 3.0 definitions */ 153 #define AR6003_HW_2_1_1_VERSION 0x30000582 154 #define AR6003_HW_2_1_1_FW_DIR "ath6k/AR6003/hw2.1.1" 155 #define AR6003_HW_2_1_1_OTP_FILE "otp.bin" 156 #define AR6003_HW_2_1_1_FIRMWARE_FILE "athwlan.bin" 157 #define AR6003_HW_2_1_1_TCMD_FIRMWARE_FILE "athtcmd_ram.bin" 158 #define AR6003_HW_2_1_1_UTF_FIRMWARE_FILE "utf.bin" 159 #define AR6003_HW_2_1_1_TESTSCRIPT_FILE "nullTestFlow.bin" 160 #define AR6003_HW_2_1_1_PATCH_FILE "data.patch.bin" 161 #define AR6003_HW_2_1_1_BOARD_DATA_FILE AR6003_HW_2_1_1_FW_DIR "/bdata.bin" 162 #define AR6003_HW_2_1_1_DEFAULT_BOARD_DATA_FILE \ 163 AR6003_HW_2_1_1_FW_DIR "/bdata.SD31.bin" 164 165 /* AR6004 1.0 definitions */ 166 #define AR6004_HW_1_0_VERSION 0x30000623 167 #define AR6004_HW_1_0_FW_DIR "ath6k/AR6004/hw1.0" 168 #define AR6004_HW_1_0_FIRMWARE_FILE "fw.ram.bin" 169 #define AR6004_HW_1_0_BOARD_DATA_FILE AR6004_HW_1_0_FW_DIR "/bdata.bin" 170 #define AR6004_HW_1_0_DEFAULT_BOARD_DATA_FILE \ 171 AR6004_HW_1_0_FW_DIR "/bdata.DB132.bin" 172 173 /* AR6004 1.1 definitions */ 174 #define AR6004_HW_1_1_VERSION 0x30000001 175 #define AR6004_HW_1_1_FW_DIR "ath6k/AR6004/hw1.1" 176 #define AR6004_HW_1_1_FIRMWARE_FILE "fw.ram.bin" 177 #define AR6004_HW_1_1_BOARD_DATA_FILE AR6004_HW_1_1_FW_DIR "/bdata.bin" 178 #define AR6004_HW_1_1_DEFAULT_BOARD_DATA_FILE \ 179 AR6004_HW_1_1_FW_DIR "/bdata.DB132.bin" 180 181 /* AR6004 1.2 definitions */ 182 #define AR6004_HW_1_2_VERSION 0x300007e8 183 #define AR6004_HW_1_2_FW_DIR "ath6k/AR6004/hw1.2" 184 #define AR6004_HW_1_2_FIRMWARE_FILE "fw.ram.bin" 185 #define AR6004_HW_1_2_BOARD_DATA_FILE AR6004_HW_1_2_FW_DIR "/bdata.bin" 186 #define AR6004_HW_1_2_DEFAULT_BOARD_DATA_FILE \ 187 AR6004_HW_1_2_FW_DIR "/bdata.bin" 188 189 /* Per STA data, used in AP mode */ 190 #define STA_PS_AWAKE BIT(0) 191 #define STA_PS_SLEEP BIT(1) 192 #define STA_PS_POLLED BIT(2) 193 #define STA_PS_APSD_TRIGGER BIT(3) 194 #define STA_PS_APSD_EOSP BIT(4) 195 196 /* HTC TX packet tagging definitions */ 197 #define ATH6KL_CONTROL_PKT_TAG HTC_TX_PACKET_TAG_USER_DEFINED 198 #define ATH6KL_DATA_PKT_TAG (ATH6KL_CONTROL_PKT_TAG + 1) 199 200 #define AR6003_CUST_DATA_SIZE 16 201 202 #define AGGR_WIN_IDX(x, y) ((x) % (y)) 203 #define AGGR_INCR_IDX(x, y) AGGR_WIN_IDX(((x) + 1), (y)) 204 #define AGGR_DCRM_IDX(x, y) AGGR_WIN_IDX(((x) - 1), (y)) 205 #define ATH6KL_MAX_SEQ_NO 0xFFF 206 #define ATH6KL_NEXT_SEQ_NO(x) (((x) + 1) & ATH6KL_MAX_SEQ_NO) 207 208 #define NUM_OF_TIDS 8 209 #define AGGR_SZ_DEFAULT 8 210 211 #define AGGR_WIN_SZ_MIN 2 212 #define AGGR_WIN_SZ_MAX 8 213 214 #define TID_WINDOW_SZ(_x) ((_x) << 1) 215 216 #define AGGR_NUM_OF_FREE_NETBUFS 16 217 218 #define AGGR_RX_TIMEOUT 100 /* in ms */ 219 220 #define WMI_TIMEOUT (2 * HZ) 221 222 #define MBOX_YIELD_LIMIT 99 223 224 #define ATH6KL_DEFAULT_LISTEN_INTVAL 100 /* in TUs */ 225 #define ATH6KL_DEFAULT_BMISS_TIME 1500 226 #define ATH6KL_MAX_WOW_LISTEN_INTL 300 /* in TUs */ 227 #define ATH6KL_MAX_BMISS_TIME 5000 228 229 /* configuration lags */ 230 /* 231 * ATH6KL_CONF_IGNORE_ERP_BARKER: Ignore the barker premable in 232 * ERP IE of beacon to determine the short premable support when 233 * sending (Re)Assoc req. 234 * ATH6KL_CONF_IGNORE_PS_FAIL_EVT_IN_SCAN: Don't send the power 235 * module state transition failure events which happen during 236 * scan, to the host. 237 */ 238 #define ATH6KL_CONF_IGNORE_ERP_BARKER BIT(0) 239 #define ATH6KL_CONF_IGNORE_PS_FAIL_EVT_IN_SCAN BIT(1) 240 #define ATH6KL_CONF_ENABLE_11N BIT(2) 241 #define ATH6KL_CONF_ENABLE_TX_BURST BIT(3) 242 #define ATH6KL_CONF_UART_DEBUG BIT(4) 243 244 #define P2P_WILDCARD_SSID_LEN 7 /* DIRECT- */ 245 246 enum wlan_low_pwr_state { 247 WLAN_POWER_STATE_ON, 248 WLAN_POWER_STATE_CUT_PWR, 249 WLAN_POWER_STATE_DEEP_SLEEP, 250 WLAN_POWER_STATE_WOW 251 }; 252 253 enum sme_state { 254 SME_DISCONNECTED, 255 SME_CONNECTING, 256 SME_CONNECTED 257 }; 258 259 struct skb_hold_q { 260 struct sk_buff *skb; 261 bool is_amsdu; 262 u16 seq_no; 263 }; 264 265 struct rxtid { 266 bool aggr; 267 bool timer_mon; 268 u16 win_sz; 269 u16 seq_next; 270 u32 hold_q_sz; 271 struct skb_hold_q *hold_q; 272 struct sk_buff_head q; 273 274 /* 275 * lock mainly protects seq_next and hold_q. Movement of seq_next 276 * needs to be protected between aggr_timeout() and 277 * aggr_process_recv_frm(). hold_q will be holding the pending 278 * reorder frames and it's access should also be protected. 279 * Some of the other fields like hold_q_sz, win_sz and aggr are 280 * initialized/reset when receiving addba/delba req, also while 281 * deleting aggr state all the pending buffers are flushed before 282 * resetting these fields, so there should not be any race in accessing 283 * these fields. 284 */ 285 spinlock_t lock; 286 }; 287 288 struct rxtid_stats { 289 u32 num_into_aggr; 290 u32 num_dups; 291 u32 num_oow; 292 u32 num_mpdu; 293 u32 num_amsdu; 294 u32 num_delivered; 295 u32 num_timeouts; 296 u32 num_hole; 297 u32 num_bar; 298 }; 299 300 struct aggr_info_conn { 301 u8 aggr_sz; 302 u8 timer_scheduled; 303 struct timer_list timer; 304 struct net_device *dev; 305 struct rxtid rx_tid[NUM_OF_TIDS]; 306 struct rxtid_stats stat[NUM_OF_TIDS]; 307 struct aggr_info *aggr_info; 308 }; 309 310 struct aggr_info { 311 struct aggr_info_conn *aggr_conn; 312 struct sk_buff_head rx_amsdu_freeq; 313 }; 314 315 struct ath6kl_wep_key { 316 u8 key_index; 317 u8 key_len; 318 u8 key[64]; 319 }; 320 321 #define ATH6KL_KEY_SEQ_LEN 8 322 323 struct ath6kl_key { 324 u8 key[WLAN_MAX_KEY_LEN]; 325 u8 key_len; 326 u8 seq[ATH6KL_KEY_SEQ_LEN]; 327 u8 seq_len; 328 u32 cipher; 329 }; 330 331 struct ath6kl_node_mapping { 332 u8 mac_addr[ETH_ALEN]; 333 u8 ep_id; 334 u8 tx_pend; 335 }; 336 337 struct ath6kl_cookie { 338 struct sk_buff *skb; 339 u32 map_no; 340 struct htc_packet htc_pkt; 341 struct ath6kl_cookie *arc_list_next; 342 }; 343 344 struct ath6kl_mgmt_buff { 345 struct list_head list; 346 u32 freq; 347 u32 wait; 348 u32 id; 349 bool no_cck; 350 size_t len; 351 u8 buf[0]; 352 }; 353 354 struct ath6kl_sta { 355 u16 sta_flags; 356 u8 mac[ETH_ALEN]; 357 u8 aid; 358 u8 keymgmt; 359 u8 ucipher; 360 u8 auth; 361 u8 wpa_ie[ATH6KL_MAX_IE]; 362 struct sk_buff_head psq; 363 364 /* protects psq, mgmt_psq, apsdq, and mgmt_psq_len fields */ 365 spinlock_t psq_lock; 366 367 struct list_head mgmt_psq; 368 size_t mgmt_psq_len; 369 u8 apsd_info; 370 struct sk_buff_head apsdq; 371 struct aggr_info_conn *aggr_conn; 372 }; 373 374 struct ath6kl_version { 375 u32 target_ver; 376 u32 wlan_ver; 377 u32 abi_ver; 378 }; 379 380 struct ath6kl_bmi { 381 u32 cmd_credits; 382 bool done_sent; 383 u8 *cmd_buf; 384 u32 max_data_size; 385 u32 max_cmd_size; 386 }; 387 388 struct target_stats { 389 u64 tx_pkt; 390 u64 tx_byte; 391 u64 tx_ucast_pkt; 392 u64 tx_ucast_byte; 393 u64 tx_mcast_pkt; 394 u64 tx_mcast_byte; 395 u64 tx_bcast_pkt; 396 u64 tx_bcast_byte; 397 u64 tx_rts_success_cnt; 398 u64 tx_pkt_per_ac[4]; 399 400 u64 tx_err; 401 u64 tx_fail_cnt; 402 u64 tx_retry_cnt; 403 u64 tx_mult_retry_cnt; 404 u64 tx_rts_fail_cnt; 405 406 u64 rx_pkt; 407 u64 rx_byte; 408 u64 rx_ucast_pkt; 409 u64 rx_ucast_byte; 410 u64 rx_mcast_pkt; 411 u64 rx_mcast_byte; 412 u64 rx_bcast_pkt; 413 u64 rx_bcast_byte; 414 u64 rx_frgment_pkt; 415 416 u64 rx_err; 417 u64 rx_crc_err; 418 u64 rx_key_cache_miss; 419 u64 rx_decrypt_err; 420 u64 rx_dupl_frame; 421 422 u64 tkip_local_mic_fail; 423 u64 tkip_cnter_measures_invoked; 424 u64 tkip_replays; 425 u64 tkip_fmt_err; 426 u64 ccmp_fmt_err; 427 u64 ccmp_replays; 428 429 u64 pwr_save_fail_cnt; 430 431 u64 cs_bmiss_cnt; 432 u64 cs_low_rssi_cnt; 433 u64 cs_connect_cnt; 434 u64 cs_discon_cnt; 435 436 s32 tx_ucast_rate; 437 s32 rx_ucast_rate; 438 439 u32 lq_val; 440 441 u32 wow_pkt_dropped; 442 u16 wow_evt_discarded; 443 444 s16 noise_floor_calib; 445 s16 cs_rssi; 446 s16 cs_ave_beacon_rssi; 447 u8 cs_ave_beacon_snr; 448 u8 cs_last_roam_msec; 449 u8 cs_snr; 450 451 u8 wow_host_pkt_wakeups; 452 u8 wow_host_evt_wakeups; 453 454 u32 arp_received; 455 u32 arp_matched; 456 u32 arp_replied; 457 }; 458 459 struct ath6kl_mbox_info { 460 u32 htc_addr; 461 u32 htc_ext_addr; 462 u32 htc_ext_sz; 463 464 u32 block_size; 465 466 u32 gmbox_addr; 467 468 u32 gmbox_sz; 469 }; 470 471 /* 472 * 802.11i defines an extended IV for use with non-WEP ciphers. 473 * When the EXTIV bit is set in the key id byte an additional 474 * 4 bytes immediately follow the IV for TKIP. For CCMP the 475 * EXTIV bit is likewise set but the 8 bytes represent the 476 * CCMP header rather than IV+extended-IV. 477 */ 478 479 #define ATH6KL_KEYBUF_SIZE 16 480 #define ATH6KL_MICBUF_SIZE (8+8) /* space for both tx and rx */ 481 482 #define ATH6KL_KEY_XMIT 0x01 483 #define ATH6KL_KEY_RECV 0x02 484 #define ATH6KL_KEY_DEFAULT 0x80 /* default xmit key */ 485 486 /* Initial group key for AP mode */ 487 struct ath6kl_req_key { 488 bool valid; 489 u8 key_index; 490 int key_type; 491 u8 key[WLAN_MAX_KEY_LEN]; 492 u8 key_len; 493 }; 494 495 enum ath6kl_hif_type { 496 ATH6KL_HIF_TYPE_SDIO, 497 ATH6KL_HIF_TYPE_USB, 498 }; 499 500 enum ath6kl_htc_type { 501 ATH6KL_HTC_TYPE_MBOX, 502 ATH6KL_HTC_TYPE_PIPE, 503 }; 504 505 /* Max number of filters that hw supports */ 506 #define ATH6K_MAX_MC_FILTERS_PER_LIST 7 507 struct ath6kl_mc_filter { 508 struct list_head list; 509 char hw_addr[ATH6KL_MCAST_FILTER_MAC_ADDR_SIZE]; 510 }; 511 512 struct ath6kl_htcap { 513 bool ht_enable; 514 u8 ampdu_factor; 515 unsigned short cap_info; 516 }; 517 518 /* 519 * Driver's maximum limit, note that some firmwares support only one vif 520 * and the runtime (current) limit must be checked from ar->vif_max. 521 */ 522 #define ATH6KL_VIF_MAX 3 523 524 /* vif flags info */ 525 enum ath6kl_vif_state { 526 CONNECTED, 527 CONNECT_PEND, 528 WMM_ENABLED, 529 NETQ_STOPPED, 530 DTIM_EXPIRED, 531 NETDEV_REGISTERED, 532 CLEAR_BSSFILTER_ON_BEACON, 533 DTIM_PERIOD_AVAIL, 534 WLAN_ENABLED, 535 STATS_UPDATE_PEND, 536 HOST_SLEEP_MODE_CMD_PROCESSED, 537 NETDEV_MCAST_ALL_ON, 538 NETDEV_MCAST_ALL_OFF, 539 }; 540 541 struct ath6kl_vif { 542 struct list_head list; 543 struct wireless_dev wdev; 544 struct net_device *ndev; 545 struct ath6kl *ar; 546 /* Lock to protect vif specific net_stats and flags */ 547 spinlock_t if_lock; 548 u8 fw_vif_idx; 549 unsigned long flags; 550 int ssid_len; 551 u8 ssid[IEEE80211_MAX_SSID_LEN]; 552 u8 dot11_auth_mode; 553 u8 auth_mode; 554 u8 prwise_crypto; 555 u8 prwise_crypto_len; 556 u8 grp_crypto; 557 u8 grp_crypto_len; 558 u8 def_txkey_index; 559 u8 next_mode; 560 u8 nw_type; 561 u8 bssid[ETH_ALEN]; 562 u8 req_bssid[ETH_ALEN]; 563 u16 ch_hint; 564 u16 bss_ch; 565 struct ath6kl_wep_key wep_key_list[WMI_MAX_KEY_INDEX + 1]; 566 struct ath6kl_key keys[WMI_MAX_KEY_INDEX + 1]; 567 struct aggr_info *aggr_cntxt; 568 struct ath6kl_htcap htcap[IEEE80211_NUM_BANDS]; 569 570 struct timer_list disconnect_timer; 571 struct timer_list sched_scan_timer; 572 573 struct cfg80211_scan_request *scan_req; 574 enum sme_state sme_state; 575 int reconnect_flag; 576 u32 last_roc_id; 577 u32 last_cancel_roc_id; 578 u32 send_action_id; 579 bool probe_req_report; 580 u16 assoc_bss_beacon_int; 581 u16 listen_intvl_t; 582 u16 bmiss_time_t; 583 u16 bg_scan_period; 584 u8 assoc_bss_dtim_period; 585 struct net_device_stats net_stats; 586 struct target_stats target_stats; 587 struct wmi_connect_cmd profile; 588 589 struct list_head mc_filter; 590 }; 591 592 static inline struct ath6kl_vif *ath6kl_vif_from_wdev(struct wireless_dev *wdev) 593 { 594 return container_of(wdev, struct ath6kl_vif, wdev); 595 } 596 597 #define WOW_LIST_ID 0 598 #define WOW_HOST_REQ_DELAY 500 /* ms */ 599 600 #define ATH6KL_SCHED_SCAN_RESULT_DELAY 5000 /* ms */ 601 602 /* Flag info */ 603 enum ath6kl_dev_state { 604 WMI_ENABLED, 605 WMI_READY, 606 WMI_CTRL_EP_FULL, 607 TESTMODE, 608 DESTROY_IN_PROGRESS, 609 SKIP_SCAN, 610 ROAM_TBL_PEND, 611 FIRST_BOOT, 612 }; 613 614 enum ath6kl_state { 615 ATH6KL_STATE_OFF, 616 ATH6KL_STATE_ON, 617 ATH6KL_STATE_SUSPENDING, 618 ATH6KL_STATE_RESUMING, 619 ATH6KL_STATE_DEEPSLEEP, 620 ATH6KL_STATE_CUTPOWER, 621 ATH6KL_STATE_WOW, 622 ATH6KL_STATE_SCHED_SCAN, 623 }; 624 625 struct ath6kl { 626 struct device *dev; 627 struct wiphy *wiphy; 628 629 enum ath6kl_state state; 630 unsigned int testmode; 631 632 struct ath6kl_bmi bmi; 633 const struct ath6kl_hif_ops *hif_ops; 634 const struct ath6kl_htc_ops *htc_ops; 635 struct wmi *wmi; 636 int tx_pending[ENDPOINT_MAX]; 637 int total_tx_data_pend; 638 struct htc_target *htc_target; 639 enum ath6kl_hif_type hif_type; 640 void *hif_priv; 641 struct list_head vif_list; 642 /* Lock to avoid race in vif_list entries among add/del/traverse */ 643 spinlock_t list_lock; 644 u8 num_vif; 645 unsigned int vif_max; 646 u8 max_norm_iface; 647 u8 avail_idx_map; 648 649 /* 650 * Protects at least amsdu_rx_buffer_queue, ath6kl_alloc_cookie() 651 * calls, tx_pending and total_tx_data_pend. 652 */ 653 spinlock_t lock; 654 655 struct semaphore sem; 656 u8 lrssi_roam_threshold; 657 struct ath6kl_version version; 658 u32 target_type; 659 u8 tx_pwr; 660 struct ath6kl_node_mapping node_map[MAX_NODE_NUM]; 661 u8 ibss_ps_enable; 662 bool ibss_if_active; 663 u8 node_num; 664 u8 next_ep_id; 665 struct ath6kl_cookie *cookie_list; 666 u32 cookie_count; 667 enum htc_endpoint_id ac2ep_map[WMM_NUM_AC]; 668 bool ac_stream_active[WMM_NUM_AC]; 669 u8 ac_stream_pri_map[WMM_NUM_AC]; 670 u8 hiac_stream_active_pri; 671 u8 ep2ac_map[ENDPOINT_MAX]; 672 enum htc_endpoint_id ctrl_ep; 673 struct ath6kl_htc_credit_info credit_state_info; 674 u32 connect_ctrl_flags; 675 u32 user_key_ctrl; 676 u8 usr_bss_filter; 677 struct ath6kl_sta sta_list[AP_MAX_NUM_STA]; 678 u8 sta_list_index; 679 struct ath6kl_req_key ap_mode_bkey; 680 struct sk_buff_head mcastpsq; 681 u32 want_ch_switch; 682 683 /* 684 * FIXME: protects access to mcastpsq but is actually useless as 685 * all skbe_queue_*() functions provide serialisation themselves 686 */ 687 spinlock_t mcastpsq_lock; 688 689 u8 intra_bss; 690 struct wmi_ap_mode_stat ap_stats; 691 u8 ap_country_code[3]; 692 struct list_head amsdu_rx_buffer_queue; 693 u8 rx_meta_ver; 694 enum wlan_low_pwr_state wlan_pwr_state; 695 u8 mac_addr[ETH_ALEN]; 696 #define AR_MCAST_FILTER_MAC_ADDR_SIZE 4 697 struct { 698 void *rx_report; 699 size_t rx_report_len; 700 } tm; 701 702 struct ath6kl_hw { 703 u32 id; 704 const char *name; 705 u32 dataset_patch_addr; 706 u32 app_load_addr; 707 u32 app_start_override_addr; 708 u32 board_ext_data_addr; 709 u32 reserved_ram_size; 710 u32 board_addr; 711 u32 refclk_hz; 712 u32 uarttx_pin; 713 u32 testscript_addr; 714 enum wmi_phy_cap cap; 715 716 u32 flags; 717 718 struct ath6kl_hw_fw { 719 const char *dir; 720 const char *otp; 721 const char *fw; 722 const char *tcmd; 723 const char *patch; 724 const char *utf; 725 const char *testscript; 726 } fw; 727 728 const char *fw_board; 729 const char *fw_default_board; 730 } hw; 731 732 u16 conf_flags; 733 u16 suspend_mode; 734 u16 wow_suspend_mode; 735 wait_queue_head_t event_wq; 736 struct ath6kl_mbox_info mbox_info; 737 738 struct ath6kl_cookie cookie_mem[MAX_COOKIE_NUM]; 739 unsigned long flag; 740 741 u8 *fw_board; 742 size_t fw_board_len; 743 744 u8 *fw_otp; 745 size_t fw_otp_len; 746 747 u8 *fw; 748 size_t fw_len; 749 750 u8 *fw_patch; 751 size_t fw_patch_len; 752 753 u8 *fw_testscript; 754 size_t fw_testscript_len; 755 756 unsigned int fw_api; 757 unsigned long fw_capabilities[ATH6KL_CAPABILITY_LEN]; 758 759 struct workqueue_struct *ath6kl_wq; 760 761 struct dentry *debugfs_phy; 762 763 bool p2p; 764 765 bool wiphy_registered; 766 767 #ifdef CONFIG_ATH6KL_DEBUG 768 struct { 769 struct sk_buff_head fwlog_queue; 770 struct completion fwlog_completion; 771 bool fwlog_open; 772 773 u32 fwlog_mask; 774 775 unsigned int dbgfs_diag_reg; 776 u32 diag_reg_addr_wr; 777 u32 diag_reg_val_wr; 778 779 struct { 780 unsigned int invalid_rate; 781 } war_stats; 782 783 u8 *roam_tbl; 784 unsigned int roam_tbl_len; 785 786 u8 keepalive; 787 u8 disc_timeout; 788 } debug; 789 #endif /* CONFIG_ATH6KL_DEBUG */ 790 }; 791 792 static inline struct ath6kl *ath6kl_priv(struct net_device *dev) 793 { 794 return ((struct ath6kl_vif *) netdev_priv(dev))->ar; 795 } 796 797 static inline u32 ath6kl_get_hi_item_addr(struct ath6kl *ar, 798 u32 item_offset) 799 { 800 u32 addr = 0; 801 802 if (ar->target_type == TARGET_TYPE_AR6003) 803 addr = ATH6KL_AR6003_HI_START_ADDR + item_offset; 804 else if (ar->target_type == TARGET_TYPE_AR6004) 805 addr = ATH6KL_AR6004_HI_START_ADDR + item_offset; 806 807 return addr; 808 } 809 810 int ath6kl_configure_target(struct ath6kl *ar); 811 void ath6kl_detect_error(unsigned long ptr); 812 void disconnect_timer_handler(unsigned long ptr); 813 void init_netdev(struct net_device *dev); 814 void ath6kl_cookie_init(struct ath6kl *ar); 815 void ath6kl_cookie_cleanup(struct ath6kl *ar); 816 void ath6kl_rx(struct htc_target *target, struct htc_packet *packet); 817 void ath6kl_tx_complete(struct htc_target *context, 818 struct list_head *packet_queue); 819 enum htc_send_full_action ath6kl_tx_queue_full(struct htc_target *target, 820 struct htc_packet *packet); 821 void ath6kl_stop_txrx(struct ath6kl *ar); 822 void ath6kl_cleanup_amsdu_rxbufs(struct ath6kl *ar); 823 int ath6kl_diag_write32(struct ath6kl *ar, u32 address, __le32 value); 824 int ath6kl_diag_write(struct ath6kl *ar, u32 address, void *data, u32 length); 825 int ath6kl_diag_read32(struct ath6kl *ar, u32 address, u32 *value); 826 int ath6kl_diag_read(struct ath6kl *ar, u32 address, void *data, u32 length); 827 int ath6kl_read_fwlogs(struct ath6kl *ar); 828 void ath6kl_init_profile_info(struct ath6kl_vif *vif); 829 void ath6kl_tx_data_cleanup(struct ath6kl *ar); 830 831 struct ath6kl_cookie *ath6kl_alloc_cookie(struct ath6kl *ar); 832 void ath6kl_free_cookie(struct ath6kl *ar, struct ath6kl_cookie *cookie); 833 int ath6kl_data_tx(struct sk_buff *skb, struct net_device *dev); 834 835 struct aggr_info *aggr_init(struct ath6kl_vif *vif); 836 void aggr_conn_init(struct ath6kl_vif *vif, struct aggr_info *aggr_info, 837 struct aggr_info_conn *aggr_conn); 838 void ath6kl_rx_refill(struct htc_target *target, 839 enum htc_endpoint_id endpoint); 840 void ath6kl_refill_amsdu_rxbufs(struct ath6kl *ar, int count); 841 struct htc_packet *ath6kl_alloc_amsdu_rxbuf(struct htc_target *target, 842 enum htc_endpoint_id endpoint, 843 int len); 844 void aggr_module_destroy(struct aggr_info *aggr_info); 845 void aggr_reset_state(struct aggr_info_conn *aggr_conn); 846 847 struct ath6kl_sta *ath6kl_find_sta(struct ath6kl_vif *vif, u8 *node_addr); 848 struct ath6kl_sta *ath6kl_find_sta_by_aid(struct ath6kl *ar, u8 aid); 849 850 void ath6kl_ready_event(void *devt, u8 *datap, u32 sw_ver, u32 abi_ver, 851 enum wmi_phy_cap cap); 852 int ath6kl_control_tx(void *devt, struct sk_buff *skb, 853 enum htc_endpoint_id eid); 854 void ath6kl_connect_event(struct ath6kl_vif *vif, u16 channel, 855 u8 *bssid, u16 listen_int, 856 u16 beacon_int, enum network_type net_type, 857 u8 beacon_ie_len, u8 assoc_req_len, 858 u8 assoc_resp_len, u8 *assoc_info); 859 void ath6kl_connect_ap_mode_bss(struct ath6kl_vif *vif, u16 channel); 860 void ath6kl_connect_ap_mode_sta(struct ath6kl_vif *vif, u16 aid, u8 *mac_addr, 861 u8 keymgmt, u8 ucipher, u8 auth, 862 u8 assoc_req_len, u8 *assoc_info, u8 apsd_info); 863 void ath6kl_disconnect_event(struct ath6kl_vif *vif, u8 reason, 864 u8 *bssid, u8 assoc_resp_len, 865 u8 *assoc_info, u16 prot_reason_status); 866 void ath6kl_tkip_micerr_event(struct ath6kl_vif *vif, u8 keyid, bool ismcast); 867 void ath6kl_txpwr_rx_evt(void *devt, u8 tx_pwr); 868 void ath6kl_scan_complete_evt(struct ath6kl_vif *vif, int status); 869 void ath6kl_tgt_stats_event(struct ath6kl_vif *vif, u8 *ptr, u32 len); 870 void ath6kl_indicate_tx_activity(void *devt, u8 traffic_class, bool active); 871 enum htc_endpoint_id ath6kl_ac2_endpoint_id(void *devt, u8 ac); 872 873 void ath6kl_pspoll_event(struct ath6kl_vif *vif, u8 aid); 874 875 void ath6kl_dtimexpiry_event(struct ath6kl_vif *vif); 876 void ath6kl_disconnect(struct ath6kl_vif *vif); 877 void aggr_recv_delba_req_evt(struct ath6kl_vif *vif, u8 tid); 878 void aggr_recv_addba_req_evt(struct ath6kl_vif *vif, u8 tid, u16 seq_no, 879 u8 win_sz); 880 void ath6kl_wakeup_event(void *dev); 881 882 void ath6kl_reset_device(struct ath6kl *ar, u32 target_type, 883 bool wait_fot_compltn, bool cold_reset); 884 void ath6kl_init_control_info(struct ath6kl_vif *vif); 885 struct ath6kl_vif *ath6kl_vif_first(struct ath6kl *ar); 886 void ath6kl_cleanup_vif(struct ath6kl_vif *vif, bool wmi_ready); 887 int ath6kl_init_hw_start(struct ath6kl *ar); 888 int ath6kl_init_hw_stop(struct ath6kl *ar); 889 int ath6kl_init_fetch_firmwares(struct ath6kl *ar); 890 int ath6kl_init_hw_params(struct ath6kl *ar); 891 892 void ath6kl_check_wow_status(struct ath6kl *ar); 893 894 void ath6kl_core_tx_complete(struct ath6kl *ar, struct sk_buff *skb); 895 void ath6kl_core_rx_complete(struct ath6kl *ar, struct sk_buff *skb, u8 pipe); 896 897 struct ath6kl *ath6kl_core_create(struct device *dev); 898 int ath6kl_core_init(struct ath6kl *ar, enum ath6kl_htc_type htc_type); 899 void ath6kl_core_cleanup(struct ath6kl *ar); 900 void ath6kl_core_destroy(struct ath6kl *ar); 901 902 #endif /* CORE_H */ 903