2
* Copyright (c) 2010 Atheros Communications Inc.
2
* Copyright (c) 2010-2011 Atheros Communications Inc.
4
4
* Permission to use, copy, modify, and/or distribute this software for any
5
5
* purpose with or without fee is hereby granted, provided that the above
34
34
#define ATH_STA_SHORT_CALINTERVAL 1000 /* 1 second */
35
#define ATH_AP_SHORT_CALINTERVAL 100 /* 100 ms */
35
36
#define ATH_ANI_POLLINTERVAL 100 /* 100 ms */
36
37
#define ATH_LONG_CALINTERVAL 30000 /* 30 seconds */
37
38
#define ATH_RESTART_CALINTERVAL 1200000 /* 20 minutes */
68
#define ATH9K_HTC_HDRSPACE sizeof(struct htc_frame_hdr)
69
#define ATH9K_HTC_AMPDU 1
62
#define ATH9K_HTC_AMPDU 1
70
63
#define ATH9K_HTC_NORMAL 2
64
#define ATH9K_HTC_BEACON 3
65
#define ATH9K_HTC_MGMT 4
72
67
#define ATH9K_HTC_TX_CTSONLY 0x1
73
68
#define ATH9K_HTC_TX_RTSCTS 0x2
74
#define ATH9K_HTC_TX_USE_MIN_RATE 0x100
76
70
struct tx_frame_hdr {
97
93
struct tx_beacon_header {
103
struct ath9k_htc_target_hw {
109
u8 tx_chainmask_legacy;
99
#define MAX_TX_AMPDU_SUBFRAMES_9271 17
100
#define MAX_TX_AMPDU_SUBFRAMES_7010 22
114
102
struct ath9k_htc_cap_target {
118
104
u8 ampdu_subframes;
120
u8 tx_chainmask_legacy;
125
110
struct ath9k_htc_target_vif {
127
u8 des_bssid[ETH_ALEN];
129
113
u8 myaddr[ETH_ALEN];
134
115
__be16 rtsthreshold;
140
#define ATH_HTC_STA_AUTH 0x0001
141
#define ATH_HTC_STA_QOS 0x0002
142
#define ATH_HTC_STA_ERP 0x0004
143
#define ATH_HTC_STA_HT 0x0008
145
/* FIXME: UAPSD variables */
146
119
struct ath9k_htc_target_sta {
150
120
u8 macaddr[ETH_ALEN];
151
121
u8 bssid[ETH_ALEN];
155
__be16 flags; /* ATH_HTC_STA_* */
159
struct ath9k_htc_target_hw *hw;
160
struct ath9k_htc_target_vif *vif;
168
131
struct ath9k_htc_target_aggr {
196
159
struct ath9k_htc_rate rates;
199
struct ath9k_htc_target_stats {
200
__be32 tx_shortretry;
203
__be32 ht_txunaggr_xretry;
204
__be32 ht_tx_xretries;
162
struct ath9k_htc_target_rate_mask {
169
struct ath9k_htc_target_int_stats {
178
struct ath9k_htc_target_tx_stats {
190
struct ath9k_htc_target_rx_stats {
196
#define ATH9K_HTC_MAX_VIF 2
197
#define ATH9K_HTC_MAX_BCN_VIF 2
199
#define INC_VIF(_priv, _type) do { \
201
case NL80211_IFTYPE_STATION: \
202
_priv->num_sta_vif++; \
204
case NL80211_IFTYPE_ADHOC: \
205
_priv->num_ibss_vif++; \
207
case NL80211_IFTYPE_AP: \
208
_priv->num_ap_vif++; \
215
#define DEC_VIF(_priv, _type) do { \
217
case NL80211_IFTYPE_STATION: \
218
_priv->num_sta_vif--; \
220
case NL80211_IFTYPE_ADHOC: \
221
_priv->num_ibss_vif--; \
223
case NL80211_IFTYPE_AP: \
224
_priv->num_ap_vif--; \
207
231
struct ath9k_htc_vif {
234
bool beacon_configured;
239
struct ath9k_vif_iter_data {
240
const u8 *hw_macaddr;
211
244
#define ATH9K_HTC_MAX_STA 8
239
272
spinlock_t rxbuflock;
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)
281
#define ATH9K_HTC_OP_TX_QUEUES_STOP BIT(0)
282
#define ATH9K_HTC_OP_TX_DRAIN BIT(1)
284
struct ath9k_htc_tx {
287
struct sk_buff_head mgmt_ep_queue;
288
struct sk_buff_head cab_ep_queue;
289
struct sk_buff_head data_be_queue;
290
struct sk_buff_head data_bk_queue;
291
struct sk_buff_head data_vi_queue;
292
struct sk_buff_head data_vo_queue;
293
struct sk_buff_head tx_failed;
294
DECLARE_BITMAP(tx_slot, MAX_TX_BUF_NUM);
295
struct timer_list cleanup_timer;
242
299
struct ath9k_htc_tx_ctl {
243
300
u8 type; /* ATH9K_HTC_* */
304
unsigned long timestamp;
307
static inline struct ath9k_htc_tx_ctl *HTC_SKB_CB(struct sk_buff *skb)
309
struct ieee80211_tx_info *tx_info = IEEE80211_SKB_CB(skb);
311
BUILD_BUG_ON(sizeof(struct ath9k_htc_tx_ctl) >
312
IEEE80211_TX_INFO_DRIVER_DATA_SIZE);
313
return (struct ath9k_htc_tx_ctl *) &tx_info->driver_data;
246
316
#ifdef CONFIG_ATH9K_HTC_DEBUGFS
248
318
#define TX_STAT_INC(c) (hif_dev->htc_handle->drv_priv->debug.tx_stats.c++)
249
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++
251
322
#define TX_QSTAT_INC(q) (priv->debug.tx_stats.queue_stats[q]++)
324
void ath9k_htc_err_stat_rx(struct ath9k_htc_priv *priv,
325
struct ath_htc_rx_status *rxs);
253
327
struct ath_tx_stats {
255
329
u32 buf_completed;
259
334
u32 queue_stats[WME_NUM_AC];
263
338
u32 skb_allocated;
264
339
u32 skb_completed;
346
u32 err_decrypt_busy;
348
u32 err_phy_stats[ATH9K_PHYERR_MAX];
268
351
struct ath9k_debug {
269
352
struct dentry *debugfs_phy;
270
struct dentry *debugfs_tgt_stats;
271
struct dentry *debugfs_xmit;
272
struct dentry *debugfs_recv;
273
353
struct ath_tx_stats tx_stats;
274
354
struct ath_rx_stats rx_stats;
280
359
#define TX_STAT_INC(c) do { } while (0)
281
360
#define RX_STAT_INC(c) do { } while (0)
361
#define CAB_STAT_INC do { } while (0)
283
363
#define TX_QSTAT_INC(c) do { } while (0)
365
static inline void ath9k_htc_err_stat_rx(struct ath9k_htc_priv *priv,
366
struct ath_htc_rx_status *rxs)
285
370
#endif /* CONFIG_ATH9K_HTC_DEBUGFS */
287
372
#define ATH_LED_PIN_DEF 1
288
#define ATH_LED_PIN_9287 8
373
#define ATH_LED_PIN_9287 10
289
374
#define ATH_LED_PIN_9271 15
290
375
#define ATH_LED_PIN_7010 12
291
#define ATH_LED_ON_DURATION_IDLE 350 /* in msecs */
292
#define ATH_LED_OFF_DURATION_IDLE 250 /* in msecs */
302
struct ath9k_htc_priv *priv;
303
struct led_classdev led_cdev;
304
enum ath_led_type led_type;
305
struct delayed_work brightness_work;
377
#define BSTUCK_THRESHOLD 10
380
* Adjust these when the max. no of beaconing interfaces is
383
#define DEFAULT_SWBA_RESPONSE 40 /* in TUs */
384
#define MIN_SWBA_RESPONSE 10 /* in TUs */
311
386
struct htc_beacon_config {
387
struct ieee80211_vif *bslot[ATH9K_HTC_MAX_BCN_VIF];
312
388
u16 beacon_interval;
315
390
u16 bmiss_timeout;
319
394
struct ath_btcoex {
332
407
#define OP_INVALID BIT(0)
333
408
#define OP_SCANNING BIT(1)
334
#define OP_LED_ASSOCIATED BIT(2)
335
#define OP_LED_ON BIT(3)
336
#define OP_PREAMBLE_SHORT BIT(4)
337
#define OP_PROTECT_ENABLE BIT(5)
338
#define OP_ASSOCIATED BIT(6)
339
#define OP_ENABLE_BEACON BIT(7)
340
#define OP_LED_DEINIT BIT(8)
341
#define OP_BT_PRIORITY_DETECTED BIT(9)
342
#define OP_BT_SCAN BIT(10)
409
#define OP_ENABLE_BEACON BIT(2)
410
#define OP_BT_PRIORITY_DETECTED BIT(3)
411
#define OP_BT_SCAN BIT(4)
412
#define OP_ANI_RUNNING BIT(5)
413
#define OP_TSF_RESET BIT(6)
344
415
struct ath9k_htc_priv {
345
416
struct device *dev;
358
432
enum htc_endpoint_id data_vi_ep;
359
433
enum htc_endpoint_id data_vo_ep;
438
u8 vif_sta_pos[ATH9K_HTC_MAX_VIF];
441
u8 num_sta_assoc_vif;
450
bool reconfig_beacon;
451
unsigned int rxfilter;
369
struct ath9k_hw_cal_data caldata[ATH9K_NUM_CHANNELS];
453
struct ath9k_hw_cal_data caldata;
454
struct ieee80211_supported_band sbands[IEEE80211_NUM_BANDS];
371
456
spinlock_t beacon_lock;
376
struct ieee80211_vif *vif;
377
457
struct htc_beacon_config cur_beacon_conf;
378
unsigned int rxfilter;
459
struct ath9k_htc_rx rx;
460
struct ath9k_htc_tx tx;
379
462
struct tasklet_struct swba_tasklet;
380
463
struct tasklet_struct rx_tasklet;
381
struct ieee80211_supported_band sbands[IEEE80211_NUM_BANDS];
382
struct ath9k_htc_rx rx;
383
struct tasklet_struct tx_tasklet;
384
struct sk_buff_head tx_queue;
385
struct delayed_work ath9k_ani_work;
464
struct delayed_work ani_work;
465
struct tasklet_struct tx_failed_tasklet;
386
466
struct work_struct ps_work;
387
467
struct work_struct fatal_work;
394
struct ath_led radio_led;
395
struct ath_led assoc_led;
396
struct ath_led tx_led;
397
struct ath_led rx_led;
398
struct delayed_work ath9k_led_blink_work;
400
int led_off_duration;
474
#ifdef CONFIG_MAC80211_LEDS
475
enum led_brightness brightness;
478
struct led_classdev led_cdev;
479
struct work_struct led_work;
422
500
void ath9k_htc_reset(struct ath9k_htc_priv *priv);
502
void ath9k_htc_assign_bslot(struct ath9k_htc_priv *priv,
503
struct ieee80211_vif *vif);
504
void ath9k_htc_remove_bslot(struct ath9k_htc_priv *priv,
505
struct ieee80211_vif *vif);
506
void ath9k_htc_set_tsfadjust(struct ath9k_htc_priv *priv,
507
struct ieee80211_vif *vif);
424
508
void ath9k_htc_beaconq_config(struct ath9k_htc_priv *priv);
425
509
void ath9k_htc_beacon_config(struct ath9k_htc_priv *priv,
426
510
struct ieee80211_vif *vif);
427
void ath9k_htc_swba(struct ath9k_htc_priv *priv, u8 beacon_pending);
511
void ath9k_htc_beacon_reconfig(struct ath9k_htc_priv *priv);
512
void ath9k_htc_swba(struct ath9k_htc_priv *priv,
513
struct wmi_event_swba *swba);
429
515
void ath9k_htc_rxep(void *priv, struct sk_buff *skb,
430
516
enum htc_endpoint_id ep_id);
433
519
void ath9k_htc_beaconep(void *drv_priv, struct sk_buff *skb,
434
520
enum htc_endpoint_id ep_id, bool txok);
436
int ath9k_htc_update_cap_target(struct ath9k_htc_priv *priv);
522
int ath9k_htc_update_cap_target(struct ath9k_htc_priv *priv,
437
524
void ath9k_htc_station_work(struct work_struct *work);
438
525
void ath9k_htc_aggr_work(struct work_struct *work);
439
void ath9k_ani_work(struct work_struct *work);;
440
void ath_start_ani(struct ath9k_htc_priv *priv);
526
void ath9k_htc_ani_work(struct work_struct *work);
527
void ath9k_htc_start_ani(struct ath9k_htc_priv *priv);
528
void ath9k_htc_stop_ani(struct ath9k_htc_priv *priv);
442
530
int ath9k_tx_init(struct ath9k_htc_priv *priv);
443
void ath9k_tx_tasklet(unsigned long data);
444
int ath9k_htc_tx_start(struct ath9k_htc_priv *priv, struct sk_buff *skb);
531
int ath9k_htc_tx_start(struct ath9k_htc_priv *priv,
532
struct sk_buff *skb, u8 slot, bool is_cab);
445
533
void ath9k_tx_cleanup(struct ath9k_htc_priv *priv);
446
534
bool ath9k_htc_txq_setup(struct ath9k_htc_priv *priv, int subtype);
447
535
int ath9k_htc_cabq_setup(struct ath9k_htc_priv *priv);
448
536
int get_hw_qnum(u16 queue, int *hwq_map);
449
537
int ath_htc_txq_update(struct ath9k_htc_priv *priv, int qnum,
450
538
struct ath9k_tx_queue_info *qinfo);
539
void ath9k_htc_check_stop_queues(struct ath9k_htc_priv *priv);
540
void ath9k_htc_check_wake_queues(struct ath9k_htc_priv *priv);
541
int ath9k_htc_tx_get_slot(struct ath9k_htc_priv *priv);
542
void ath9k_htc_tx_clear_slot(struct ath9k_htc_priv *priv, int slot);
543
void ath9k_htc_tx_drain(struct ath9k_htc_priv *priv);
544
void ath9k_htc_txstatus(struct ath9k_htc_priv *priv, void *wmi_event);
545
void ath9k_htc_tx_failed(struct ath9k_htc_priv *priv);
546
void ath9k_tx_failed_tasklet(unsigned long data);
547
void ath9k_htc_tx_cleanup_timer(unsigned long data);
452
549
int ath9k_rx_init(struct ath9k_htc_priv *priv);
453
550
void ath9k_rx_cleanup(struct ath9k_htc_priv *priv);
460
557
void ath9k_ps_work(struct work_struct *work);
461
558
bool ath9k_htc_setpower(struct ath9k_htc_priv *priv,
462
559
enum ath9k_power_mode mode);
463
void ath_update_txpow(struct ath9k_htc_priv *priv);
465
561
void ath9k_start_rfkill_poll(struct ath9k_htc_priv *priv);
466
562
void ath9k_htc_rfkill_poll_state(struct ieee80211_hw *hw);
467
563
void ath9k_htc_radio_enable(struct ieee80211_hw *hw);
468
564
void ath9k_htc_radio_disable(struct ieee80211_hw *hw);
469
void ath9k_led_stop_brightness(struct ath9k_htc_priv *priv);
566
#ifdef CONFIG_MAC80211_LEDS
470
567
void ath9k_init_leds(struct ath9k_htc_priv *priv);
471
568
void ath9k_deinit_leds(struct ath9k_htc_priv *priv);
569
void ath9k_led_work(struct work_struct *work);
571
static inline void ath9k_init_leds(struct ath9k_htc_priv *priv)
575
static inline void ath9k_deinit_leds(struct ath9k_htc_priv *priv)
579
static inline void ath9k_led_work(struct work_struct *work)
473
584
int ath9k_htc_probe_device(struct htc_target *htc_handle, struct device *dev,
474
585
u16 devid, char *product, u32 drv_info);
478
589
int ath9k_htc_resume(struct htc_target *htc_handle);
480
591
#ifdef CONFIG_ATH9K_HTC_DEBUGFS
481
int ath9k_htc_debug_create_root(void);
482
void ath9k_htc_debug_remove_root(void);
483
592
int ath9k_htc_init_debug(struct ath_hw *ah);
484
void ath9k_htc_exit_debug(struct ath_hw *ah);
486
static inline int ath9k_htc_debug_create_root(void) { return 0; };
487
static inline void ath9k_htc_debug_remove_root(void) {};
488
594
static inline int ath9k_htc_init_debug(struct ath_hw *ah) { return 0; };
489
static inline void ath9k_htc_exit_debug(struct ath_hw *ah) {};
490
595
#endif /* CONFIG_ATH9K_HTC_DEBUGFS */
492
597
#endif /* HTC_H */