Linux Kernel  3.7.1
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
htc.h
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2010-2011 Atheros Communications Inc.
3  *
4  * Permission to use, copy, modify, and/or distribute this software for any
5  * purpose with or without fee is hereby granted, provided that the above
6  * copyright notice and this permission notice appear in all copies.
7  *
8  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
9  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
10  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
11  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
12  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
13  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
14  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
15  */
16 
17 #ifndef HTC_H
18 #define HTC_H
19 
20 #include <linux/module.h>
21 #include <linux/usb.h>
22 #include <linux/firmware.h>
23 #include <linux/skbuff.h>
24 #include <linux/netdevice.h>
25 #include <linux/leds.h>
26 #include <linux/slab.h>
27 #include <net/mac80211.h>
28 
29 #include "common.h"
30 #include "htc_hst.h"
31 #include "hif_usb.h"
32 #include "wmi.h"
33 
34 #define ATH_STA_SHORT_CALINTERVAL 1000 /* 1 second */
35 #define ATH_AP_SHORT_CALINTERVAL 100 /* 100 ms */
36 #define ATH_ANI_POLLINTERVAL 100 /* 100 ms */
37 #define ATH_LONG_CALINTERVAL 30000 /* 30 seconds */
38 #define ATH_RESTART_CALINTERVAL 1200000 /* 20 minutes */
39 
40 #define ATH_DEFAULT_BMISS_LIMIT 10
41 #define IEEE80211_MS_TO_TU(x) (((x) * 1000) / 1024)
42 #define TSF_TO_TU(_h, _l) \
43  ((((u32)(_h)) << 22) | (((u32)(_l)) >> 10))
44 
45 extern struct ieee80211_ops ath9k_htc_ops;
46 extern int htc_modparam_nohwcrypt;
47 
51 };
52 
53 enum htc_opmode {
54  HTC_M_STA = 1,
60 };
61 
62 #define ATH9K_HTC_AMPDU 1
63 #define ATH9K_HTC_NORMAL 2
64 #define ATH9K_HTC_BEACON 3
65 #define ATH9K_HTC_MGMT 4
66 
67 #define ATH9K_HTC_TX_CTSONLY 0x1
68 #define ATH9K_HTC_TX_RTSCTS 0x2
69 
70 struct tx_frame_hdr {
75  __be32 flags; /* ATH9K_HTC_TX_* */
80 } __packed;
81 
82 struct tx_mgmt_hdr {
91 } __packed;
92 
97 } __packed;
98 
99 #define MAX_TX_AMPDU_SUBFRAMES_9271 17
100 #define MAX_TX_AMPDU_SUBFRAMES_7010 22
101 
108 } __packed;
109 
117 } __packed;
118 
129 } __packed;
130 
136 } __packed;
137 
138 #define ATH_HTC_RATE_MAX 30
139 
140 #define WLAN_RC_DS_FLAG 0x01
141 #define WLAN_RC_40_FLAG 0x02
142 #define WLAN_RC_SGI_FLAG 0x04
143 #define WLAN_RC_HT_FLAG 0x08
144 
148 };
149 
153 } __packed;
154 
160 };
161 
167 } __packed;
168 
176 } __packed;
177 
188 } __packed;
189 
194 } __packed;
195 
196 #define ATH9K_HTC_MAX_VIF 2
197 #define ATH9K_HTC_MAX_BCN_VIF 2
198 
199 #define INC_VIF(_priv, _type) do { \
200  switch (_type) { \
201  case NL80211_IFTYPE_STATION: \
202  _priv->num_sta_vif++; \
203  break; \
204  case NL80211_IFTYPE_ADHOC: \
205  _priv->num_ibss_vif++; \
206  break; \
207  case NL80211_IFTYPE_AP: \
208  _priv->num_ap_vif++; \
209  break; \
210  default: \
211  break; \
212  } \
213  } while (0)
214 
215 #define DEC_VIF(_priv, _type) do { \
216  switch (_type) { \
217  case NL80211_IFTYPE_STATION: \
218  _priv->num_sta_vif--; \
219  break; \
220  case NL80211_IFTYPE_ADHOC: \
221  _priv->num_ibss_vif--; \
222  break; \
223  case NL80211_IFTYPE_AP: \
224  _priv->num_ap_vif--; \
225  break; \
226  default: \
227  break; \
228  } \
229  } while (0)
230 
235  int bslot;
237 };
238 
239 struct ath9k_vif_iter_data {
240  const u8 *hw_macaddr;
241  u8 mask[ETH_ALEN];
242 };
243 
244 #define ATH9K_HTC_MAX_STA 8
245 #define ATH9K_HTC_MAX_TID 8
246 
252 };
253 
257 };
258 
259 #define ATH9K_HTC_RXBUF 256
260 #define HTC_RX_FRAME_HEADER_SIZE 40
261 
264  struct sk_buff *skb;
266  struct list_head list;
267 };
268 
269 struct ath9k_htc_rx {
270  int last_rssi; /* FIXME: per-STA */
271  struct list_head rxbuf;
273 };
274 
275 #define ATH9K_HTC_TX_CLEANUP_INTERVAL 50 /* ms */
276 #define ATH9K_HTC_TX_TIMEOUT_INTERVAL 3000 /* ms */
277 #define ATH9K_HTC_TX_RESERVE 10
278 #define ATH9K_HTC_TX_TIMEOUT_COUNT 40
279 #define ATH9K_HTC_TX_THRESHOLD (MAX_TX_BUF_NUM - ATH9K_HTC_TX_RESERVE)
280 
281 #define ATH9K_HTC_OP_TX_QUEUES_STOP BIT(0)
282 #define ATH9K_HTC_OP_TX_DRAIN BIT(1)
283 
284 struct ath9k_htc_tx {
294  DECLARE_BITMAP(tx_slot, MAX_TX_BUF_NUM);
297 };
298 
300  u8 type; /* ATH9K_HTC_* */
304  unsigned long timestamp;
305 };
306 
307 static inline struct ath9k_htc_tx_ctl *HTC_SKB_CB(struct sk_buff *skb)
308 {
309  struct ieee80211_tx_info *tx_info = IEEE80211_SKB_CB(skb);
310 
311  BUILD_BUG_ON(sizeof(struct ath9k_htc_tx_ctl) >
313  return (struct ath9k_htc_tx_ctl *) &tx_info->driver_data;
314 }
315 
316 #ifdef CONFIG_ATH9K_HTC_DEBUGFS
317 
318 #define TX_STAT_INC(c) (hif_dev->htc_handle->drv_priv->debug.tx_stats.c++)
319 #define RX_STAT_INC(c) (hif_dev->htc_handle->drv_priv->debug.rx_stats.c++)
320 #define CAB_STAT_INC priv->debug.tx_stats.cab_queued++
321 
322 #define TX_QSTAT_INC(q) (priv->debug.tx_stats.queue_stats[q]++)
323 
325  struct ath_htc_rx_status *rxs);
326 
327 struct ath_tx_stats {
328  u32 buf_queued;
329  u32 buf_completed;
330  u32 skb_queued;
331  u32 skb_success;
332  u32 skb_failed;
333  u32 cab_queued;
334  u32 queue_stats[WME_NUM_AC];
335 };
336 
337 struct ath_rx_stats {
338  u32 skb_allocated;
339  u32 skb_completed;
340  u32 skb_dropped;
341  u32 err_crc;
342  u32 err_decrypt_crc;
343  u32 err_mic;
344  u32 err_pre_delim;
345  u32 err_post_delim;
346  u32 err_decrypt_busy;
347  u32 err_phy;
348  u32 err_phy_stats[ATH9K_PHYERR_MAX];
349 };
350 
351 struct ath9k_debug {
352  struct dentry *debugfs_phy;
353  struct ath_tx_stats tx_stats;
354  struct ath_rx_stats rx_stats;
355 };
356 
357 #else
358 
359 #define TX_STAT_INC(c) do { } while (0)
360 #define RX_STAT_INC(c) do { } while (0)
361 #define CAB_STAT_INC do { } while (0)
362 
363 #define TX_QSTAT_INC(c) do { } while (0)
364 
365 static inline void ath9k_htc_err_stat_rx(struct ath9k_htc_priv *priv,
366  struct ath_htc_rx_status *rxs)
367 {
368 }
369 
370 #endif /* CONFIG_ATH9K_HTC_DEBUGFS */
371 
372 #define ATH_LED_PIN_DEF 1
373 #define ATH_LED_PIN_9287 10
374 #define ATH_LED_PIN_9271 15
375 #define ATH_LED_PIN_7010 12
376 
377 #define BSTUCK_THRESHOLD 10
378 
379 /*
380  * Adjust these when the max. no of beaconing interfaces is
381  * increased.
382  */
383 #define DEFAULT_SWBA_RESPONSE 40 /* in TUs */
384 #define MIN_SWBA_RESPONSE 10 /* in TUs */
385 
392 };
393 
394 struct ath_btcoex {
396  unsigned long bt_priority_time;
397  int bt_stomp_type; /* Types of BT stomping */
401 };
402 
403 #ifdef CONFIG_ATH9K_BTCOEX_SUPPORT
404 void ath9k_htc_init_btcoex(struct ath9k_htc_priv *priv, char *product);
405 void ath9k_htc_start_btcoex(struct ath9k_htc_priv *priv);
406 void ath9k_htc_stop_btcoex(struct ath9k_htc_priv *priv);
407 #else
408 static inline void ath9k_htc_init_btcoex(struct ath9k_htc_priv *priv, char *product)
409 {
410 }
411 static inline void ath9k_htc_start_btcoex(struct ath9k_htc_priv *priv)
412 {
413 }
414 static inline void ath9k_htc_stop_btcoex(struct ath9k_htc_priv *priv)
415 {
416 }
417 #endif /* CONFIG_ATH9K_BTCOEX_SUPPORT */
418 
419 #define OP_INVALID BIT(0)
420 #define OP_SCANNING BIT(1)
421 #define OP_ENABLE_BEACON BIT(2)
422 #define OP_BT_PRIORITY_DETECTED BIT(3)
423 #define OP_BT_SCAN BIT(4)
424 #define OP_ANI_RUNNING BIT(5)
425 #define OP_TSF_RESET BIT(6)
426 
428  struct device *dev;
429  struct ieee80211_hw *hw;
430  struct ath_hw *ah;
431  struct htc_target *htc;
432  struct wmi *wmi;
433 
436 
446 
455 
460  bool rearm_ani;
462  unsigned int rxfilter;
463  unsigned long op_flags;
464 
467 
470 
471  struct ath9k_htc_rx rx;
472  struct ath9k_htc_tx tx;
473 
480 
482  unsigned long ps_usecount;
484  bool ps_idle;
485 
486 #ifdef CONFIG_MAC80211_LEDS
488  bool led_registered;
489  char led_name[32];
490  struct led_classdev led_cdev;
491  struct work_struct led_work;
492 #endif
493 
494  int beaconq;
495  int cabq;
497 
498 #ifdef CONFIG_ATH9K_BTCOEX_SUPPORT
499  struct ath_btcoex btcoex;
500 #endif
501 
504 #ifdef CONFIG_ATH9K_HTC_DEBUGFS
505  struct ath9k_debug debug;
506 #endif
507  struct mutex mutex;
508 };
509 
510 static inline void ath_read_cachesize(struct ath_common *common, int *csz)
511 {
512  common->bus_ops->read_cachesize(common, csz);
513 }
514 
515 void ath9k_htc_reset(struct ath9k_htc_priv *priv);
516 
518  struct ieee80211_vif *vif);
520  struct ieee80211_vif *vif);
522  struct ieee80211_vif *vif);
525  struct ieee80211_vif *vif);
527 void ath9k_htc_swba(struct ath9k_htc_priv *priv,
528  struct wmi_event_swba *swba);
529 
530 void ath9k_htc_rxep(void *priv, struct sk_buff *skb,
531  enum htc_endpoint_id ep_id);
532 void ath9k_htc_txep(void *priv, struct sk_buff *skb, enum htc_endpoint_id ep_id,
533  bool txok);
534 void ath9k_htc_beaconep(void *drv_priv, struct sk_buff *skb,
535  enum htc_endpoint_id ep_id, bool txok);
536 
538  u8 enable_coex);
539 void ath9k_htc_ani_work(struct work_struct *work);
542 
543 int ath9k_tx_init(struct ath9k_htc_priv *priv);
545  struct ieee80211_sta *sta,
546  struct sk_buff *skb, u8 slot, bool is_cab);
547 void ath9k_tx_cleanup(struct ath9k_htc_priv *priv);
550 int get_hw_qnum(u16 queue, int *hwq_map);
551 int ath_htc_txq_update(struct ath9k_htc_priv *priv, int qnum,
552  struct ath9k_tx_queue_info *qinfo);
558 void ath9k_htc_txstatus(struct ath9k_htc_priv *priv, void *wmi_event);
559 void ath9k_tx_failed_tasklet(unsigned long data);
560 void ath9k_htc_tx_cleanup_timer(unsigned long data);
561 
562 int ath9k_rx_init(struct ath9k_htc_priv *priv);
563 void ath9k_rx_cleanup(struct ath9k_htc_priv *priv);
565 void ath9k_rx_tasklet(unsigned long data);
567 
570 void ath9k_ps_work(struct work_struct *work);
572  enum ath9k_power_mode mode);
573 
576 
577 #ifdef CONFIG_MAC80211_LEDS
578 void ath9k_init_leds(struct ath9k_htc_priv *priv);
579 void ath9k_deinit_leds(struct ath9k_htc_priv *priv);
580 void ath9k_led_work(struct work_struct *work);
581 #else
582 static inline void ath9k_init_leds(struct ath9k_htc_priv *priv)
583 {
584 }
585 
586 static inline void ath9k_deinit_leds(struct ath9k_htc_priv *priv)
587 {
588 }
589 
590 static inline void ath9k_led_work(struct work_struct *work)
591 {
592 }
593 #endif
594 
595 int ath9k_htc_probe_device(struct htc_target *htc_handle, struct device *dev,
596  u16 devid, char *product, u32 drv_info);
597 void ath9k_htc_disconnect_device(struct htc_target *htc_handle, bool hotunplug);
598 #ifdef CONFIG_PM
599 void ath9k_htc_suspend(struct htc_target *htc_handle);
600 int ath9k_htc_resume(struct htc_target *htc_handle);
601 #endif
602 #ifdef CONFIG_ATH9K_HTC_DEBUGFS
603 int ath9k_htc_init_debug(struct ath_hw *ah);
604 #else
605 static inline int ath9k_htc_init_debug(struct ath_hw *ah) { return 0; };
606 #endif /* CONFIG_ATH9K_HTC_DEBUGFS */
607 
608 #endif /* HTC_H */