cw1200.h (8280B)
1/* SPDX-License-Identifier: GPL-2.0-only */ 2/* 3 * Common private data for ST-Ericsson CW1200 drivers 4 * 5 * Copyright (c) 2010, ST-Ericsson 6 * Author: Dmitry Tarnyagin <dmitry.tarnyagin@lockless.no> 7 * 8 * Based on the mac80211 Prism54 code, which is 9 * Copyright (c) 2006, Michael Wu <flamingice@sourmilk.net> 10 * 11 * Based on the islsm (softmac prism54) driver, which is: 12 * Copyright 2004-2006 Jean-Baptiste Note <jbnote@gmail.com>, et al. 13 */ 14 15#ifndef CW1200_H 16#define CW1200_H 17 18#include <linux/wait.h> 19#include <linux/mutex.h> 20#include <linux/workqueue.h> 21#include <net/mac80211.h> 22 23#include "queue.h" 24#include "wsm.h" 25#include "scan.h" 26#include "txrx.h" 27#include "pm.h" 28 29/* Forward declarations */ 30struct hwbus_ops; 31struct task_struct; 32struct cw1200_debug_priv; 33struct firmware; 34 35#define CW1200_MAX_CTRL_FRAME_LEN (0x1000) 36 37#define CW1200_MAX_STA_IN_AP_MODE (5) 38#define CW1200_LINK_ID_AFTER_DTIM (CW1200_MAX_STA_IN_AP_MODE + 1) 39#define CW1200_LINK_ID_UAPSD (CW1200_MAX_STA_IN_AP_MODE + 2) 40#define CW1200_LINK_ID_MAX (CW1200_MAX_STA_IN_AP_MODE + 3) 41#define CW1200_MAX_REQUEUE_ATTEMPTS (5) 42 43#define CW1200_MAX_TID (8) 44 45#define CW1200_BLOCK_ACK_CNT (30) 46#define CW1200_BLOCK_ACK_THLD (800) 47#define CW1200_BLOCK_ACK_HIST (3) 48#define CW1200_BLOCK_ACK_INTERVAL (1 * HZ / CW1200_BLOCK_ACK_HIST) 49 50#define CW1200_JOIN_TIMEOUT (1 * HZ) 51#define CW1200_AUTH_TIMEOUT (5 * HZ) 52 53struct cw1200_ht_info { 54 struct ieee80211_sta_ht_cap ht_cap; 55 enum nl80211_channel_type channel_type; 56 u16 operation_mode; 57}; 58 59/* Please keep order */ 60enum cw1200_join_status { 61 CW1200_JOIN_STATUS_PASSIVE = 0, 62 CW1200_JOIN_STATUS_MONITOR, 63 CW1200_JOIN_STATUS_JOINING, 64 CW1200_JOIN_STATUS_PRE_STA, 65 CW1200_JOIN_STATUS_STA, 66 CW1200_JOIN_STATUS_IBSS, 67 CW1200_JOIN_STATUS_AP, 68}; 69 70enum cw1200_link_status { 71 CW1200_LINK_OFF, 72 CW1200_LINK_RESERVE, 73 CW1200_LINK_SOFT, 74 CW1200_LINK_HARD, 75 CW1200_LINK_RESET, 76 CW1200_LINK_RESET_REMAP, 77}; 78 79extern int cw1200_power_mode; 80extern const char * const cw1200_fw_types[]; 81 82struct cw1200_link_entry { 83 unsigned long timestamp; 84 enum cw1200_link_status status; 85 enum cw1200_link_status prev_status; 86 u8 mac[ETH_ALEN]; 87 u8 buffered[CW1200_MAX_TID]; 88 struct sk_buff_head rx_queue; 89}; 90 91struct cw1200_common { 92 /* interfaces to the rest of the stack */ 93 struct ieee80211_hw *hw; 94 struct ieee80211_vif *vif; 95 struct device *pdev; 96 97 /* Statistics */ 98 struct ieee80211_low_level_stats stats; 99 100 /* Our macaddr */ 101 u8 mac_addr[ETH_ALEN]; 102 103 /* Hardware interface */ 104 const struct hwbus_ops *hwbus_ops; 105 struct hwbus_priv *hwbus_priv; 106 107 /* Hardware information */ 108 enum { 109 HIF_9000_SILICON_VERSATILE = 0, 110 HIF_8601_VERSATILE, 111 HIF_8601_SILICON, 112 } hw_type; 113 enum { 114 CW1200_HW_REV_CUT10 = 10, 115 CW1200_HW_REV_CUT11 = 11, 116 CW1200_HW_REV_CUT20 = 20, 117 CW1200_HW_REV_CUT22 = 22, 118 CW1X60_HW_REV = 40, 119 } hw_revision; 120 int hw_refclk; 121 bool hw_have_5ghz; 122 const struct firmware *sdd; 123 char *sdd_path; 124 125 struct cw1200_debug_priv *debug; 126 127 struct workqueue_struct *workqueue; 128 struct mutex conf_mutex; 129 130 struct cw1200_queue tx_queue[4]; 131 struct cw1200_queue_stats tx_queue_stats; 132 int tx_burst_idx; 133 134 /* firmware/hardware info */ 135 unsigned int tx_hdr_len; 136 137 /* Radio data */ 138 int output_power; 139 140 /* BBP/MAC state */ 141 struct ieee80211_rate *rates; 142 struct ieee80211_rate *mcs_rates; 143 struct ieee80211_channel *channel; 144 struct wsm_edca_params edca; 145 struct wsm_tx_queue_params tx_queue_params; 146 struct wsm_mib_association_mode association_mode; 147 struct wsm_set_bss_params bss_params; 148 struct cw1200_ht_info ht_info; 149 struct wsm_set_pm powersave_mode; 150 struct wsm_set_pm firmware_ps_mode; 151 int cqm_rssi_thold; 152 unsigned cqm_rssi_hyst; 153 bool cqm_use_rssi; 154 int cqm_beacon_loss_count; 155 int channel_switch_in_progress; 156 wait_queue_head_t channel_switch_done; 157 u8 long_frame_max_tx_count; 158 u8 short_frame_max_tx_count; 159 int mode; 160 bool enable_beacon; 161 int beacon_int; 162 bool listening; 163 struct wsm_rx_filter rx_filter; 164 struct wsm_mib_multicast_filter multicast_filter; 165 bool has_multicast_subscription; 166 bool disable_beacon_filter; 167 struct work_struct update_filtering_work; 168 struct work_struct set_beacon_wakeup_period_work; 169 170 u8 ba_rx_tid_mask; 171 u8 ba_tx_tid_mask; 172 173 struct cw1200_pm_state pm_state; 174 175 struct wsm_p2p_ps_modeinfo p2p_ps_modeinfo; 176 struct wsm_uapsd_info uapsd_info; 177 bool setbssparams_done; 178 bool bt_present; 179 u8 conf_listen_interval; 180 u32 listen_interval; 181 u32 erp_info; 182 u32 rts_threshold; 183 184 /* BH */ 185 atomic_t bh_rx; 186 atomic_t bh_tx; 187 atomic_t bh_term; 188 atomic_t bh_suspend; 189 190 struct workqueue_struct *bh_workqueue; 191 struct work_struct bh_work; 192 193 int bh_error; 194 wait_queue_head_t bh_wq; 195 wait_queue_head_t bh_evt_wq; 196 u8 buf_id_tx; 197 u8 buf_id_rx; 198 u8 wsm_rx_seq; 199 u8 wsm_tx_seq; 200 int hw_bufs_used; 201 bool powersave_enabled; 202 bool device_can_sleep; 203 204 /* Scan status */ 205 struct cw1200_scan scan; 206 /* Keep cw1200 awake (WUP = 1) 1 second after each scan to avoid 207 * FW issue with sleeping/waking up. 208 */ 209 atomic_t recent_scan; 210 struct delayed_work clear_recent_scan_work; 211 212 /* WSM */ 213 struct wsm_startup_ind wsm_caps; 214 struct mutex wsm_cmd_mux; 215 struct wsm_buf wsm_cmd_buf; 216 struct wsm_cmd wsm_cmd; 217 wait_queue_head_t wsm_cmd_wq; 218 wait_queue_head_t wsm_startup_done; 219 int firmware_ready; 220 atomic_t tx_lock; 221 222 /* WSM debug */ 223 int wsm_enable_wsm_dumps; 224 225 /* WSM Join */ 226 enum cw1200_join_status join_status; 227 u32 pending_frame_id; 228 bool join_pending; 229 struct delayed_work join_timeout; 230 struct work_struct unjoin_work; 231 struct work_struct join_complete_work; 232 int join_complete_status; 233 int join_dtim_period; 234 bool delayed_unjoin; 235 236 /* TX/RX and security */ 237 s8 wep_default_key_id; 238 struct work_struct wep_key_work; 239 u32 key_map; 240 struct wsm_add_key keys[WSM_KEY_MAX_INDEX + 1]; 241 242 /* AP powersave */ 243 u32 link_id_map; 244 struct cw1200_link_entry link_id_db[CW1200_MAX_STA_IN_AP_MODE]; 245 struct work_struct link_id_work; 246 struct delayed_work link_id_gc_work; 247 u32 sta_asleep_mask; 248 u32 pspoll_mask; 249 bool aid0_bit_set; 250 spinlock_t ps_state_lock; /* Protect power save state */ 251 bool buffered_multicasts; 252 bool tx_multicast; 253 struct work_struct set_tim_work; 254 struct work_struct set_cts_work; 255 struct work_struct multicast_start_work; 256 struct work_struct multicast_stop_work; 257 struct timer_list mcast_timeout; 258 259 /* WSM events and CQM implementation */ 260 spinlock_t event_queue_lock; /* Protect event queue */ 261 struct list_head event_queue; 262 struct work_struct event_handler; 263 264 struct delayed_work bss_loss_work; 265 spinlock_t bss_loss_lock; /* Protect BSS loss state */ 266 int bss_loss_state; 267 u32 bss_loss_confirm_id; 268 int delayed_link_loss; 269 struct work_struct bss_params_work; 270 271 /* TX rate policy cache */ 272 struct tx_policy_cache tx_policy_cache; 273 struct work_struct tx_policy_upload_work; 274 275 /* legacy PS mode switch in suspend */ 276 int ps_mode_switch_in_progress; 277 wait_queue_head_t ps_mode_switch_done; 278 279 /* Workaround for WFD testcase 6.1.10*/ 280 struct work_struct linkid_reset_work; 281 u8 action_frame_sa[ETH_ALEN]; 282 u8 action_linkid; 283}; 284 285struct cw1200_sta_priv { 286 int link_id; 287}; 288 289/* interfaces for the drivers */ 290int cw1200_core_probe(const struct hwbus_ops *hwbus_ops, 291 struct hwbus_priv *hwbus, 292 struct device *pdev, 293 struct cw1200_common **pself, 294 int ref_clk, const u8 *macaddr, 295 const char *sdd_path, bool have_5ghz); 296void cw1200_core_release(struct cw1200_common *self); 297 298#define FWLOAD_BLOCK_SIZE (1024) 299 300static inline int cw1200_is_ht(const struct cw1200_ht_info *ht_info) 301{ 302 return ht_info->channel_type != NL80211_CHAN_NO_HT; 303} 304 305static inline int cw1200_ht_greenfield(const struct cw1200_ht_info *ht_info) 306{ 307 return cw1200_is_ht(ht_info) && 308 (ht_info->ht_cap.cap & IEEE80211_HT_CAP_GRN_FLD) && 309 !(ht_info->operation_mode & 310 IEEE80211_HT_OP_MODE_NON_GF_STA_PRSNT); 311} 312 313static inline int cw1200_ht_ampdu_density(const struct cw1200_ht_info *ht_info) 314{ 315 if (!cw1200_is_ht(ht_info)) 316 return 0; 317 return ht_info->ht_cap.ampdu_density; 318} 319 320#endif /* CW1200_H */