Linux Kernel  3.7.1
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
htc_drv_main.c
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 #include "htc.h"
18 
19 /*************/
20 /* Utilities */
21 /*************/
22 
23 /* HACK Alert: Use 11NG for 2.4, use 11NA for 5 */
24 static enum htc_phymode ath9k_htc_get_curmode(struct ath9k_htc_priv *priv,
25  struct ath9k_channel *ichan)
26 {
27  enum htc_phymode mode;
28 
29  mode = -EINVAL;
30 
31  switch (ichan->chanmode) {
32  case CHANNEL_G:
33  case CHANNEL_G_HT20:
34  case CHANNEL_G_HT40PLUS:
36  mode = HTC_MODE_11NG;
37  break;
38  case CHANNEL_A:
39  case CHANNEL_A_HT20:
40  case CHANNEL_A_HT40PLUS:
42  mode = HTC_MODE_11NA;
43  break;
44  default:
45  break;
46  }
47 
48  WARN_ON(mode < 0);
49 
50  return mode;
51 }
52 
54  enum ath9k_power_mode mode)
55 {
56  bool ret;
57 
58  mutex_lock(&priv->htc_pm_lock);
59  ret = ath9k_hw_setpower(priv->ah, mode);
60  mutex_unlock(&priv->htc_pm_lock);
61 
62  return ret;
63 }
64 
66 {
67  mutex_lock(&priv->htc_pm_lock);
68  if (++priv->ps_usecount != 1)
69  goto unlock;
71 
72 unlock:
73  mutex_unlock(&priv->htc_pm_lock);
74 }
75 
77 {
78  bool reset;
79 
80  mutex_lock(&priv->htc_pm_lock);
81  if (--priv->ps_usecount != 0)
82  goto unlock;
83 
84  if (priv->ps_idle) {
85  ath9k_hw_setrxabort(priv->ah, true);
86  ath9k_hw_stopdmarecv(priv->ah, &reset);
88  } else if (priv->ps_enabled) {
90  }
91 
92 unlock:
93  mutex_unlock(&priv->htc_pm_lock);
94 }
95 
97 {
98  struct ath9k_htc_priv *priv =
99  container_of(work, struct ath9k_htc_priv,
100  ps_work);
102 
103  /* The chip wakes up after receiving the first beacon
104  while network sleep is enabled. For the driver to
105  be in sync with the hw, set the chip to awake and
106  only then set it to sleep.
107  */
109 }
110 
111 static void ath9k_htc_vif_iter(void *data, u8 *mac, struct ieee80211_vif *vif)
112 {
113  struct ath9k_htc_priv *priv = data;
114  struct ieee80211_bss_conf *bss_conf = &vif->bss_conf;
115 
116  if ((vif->type == NL80211_IFTYPE_AP) && bss_conf->enable_beacon)
117  priv->reconfig_beacon = true;
118 
119  if (bss_conf->assoc) {
120  priv->rearm_ani = true;
121  priv->reconfig_beacon = true;
122  }
123 }
124 
125 static void ath9k_htc_vif_reconfig(struct ath9k_htc_priv *priv)
126 {
127  priv->rearm_ani = false;
128  priv->reconfig_beacon = false;
129 
131  ath9k_htc_vif_iter, priv);
132  if (priv->rearm_ani)
133  ath9k_htc_start_ani(priv);
134 
135  if (priv->reconfig_beacon) {
136  ath9k_htc_ps_wakeup(priv);
138  ath9k_htc_ps_restore(priv);
139  }
140 }
141 
142 static void ath9k_htc_bssid_iter(void *data, u8 *mac, struct ieee80211_vif *vif)
143 {
144  struct ath9k_vif_iter_data *iter_data = data;
145  int i;
146 
147  for (i = 0; i < ETH_ALEN; i++)
148  iter_data->mask[i] &= ~(iter_data->hw_macaddr[i] ^ mac[i]);
149 }
150 
151 static void ath9k_htc_set_bssid_mask(struct ath9k_htc_priv *priv,
152  struct ieee80211_vif *vif)
153 {
154  struct ath_common *common = ath9k_hw_common(priv->ah);
155  struct ath9k_vif_iter_data iter_data;
156 
157  /*
158  * Use the hardware MAC address as reference, the hardware uses it
159  * together with the BSSID mask when matching addresses.
160  */
161  iter_data.hw_macaddr = common->macaddr;
162  memset(&iter_data.mask, 0xff, ETH_ALEN);
163 
164  if (vif)
165  ath9k_htc_bssid_iter(&iter_data, vif->addr, vif);
166 
167  /* Get list of all active MAC addresses */
168  ieee80211_iterate_active_interfaces_atomic(priv->hw, ath9k_htc_bssid_iter,
169  &iter_data);
170 
171  memcpy(common->bssidmask, iter_data.mask, ETH_ALEN);
172  ath_hw_setbssidmask(common);
173 }
174 
175 static void ath9k_htc_set_opmode(struct ath9k_htc_priv *priv)
176 {
177  if (priv->num_ibss_vif)
178  priv->ah->opmode = NL80211_IFTYPE_ADHOC;
179  else if (priv->num_ap_vif)
180  priv->ah->opmode = NL80211_IFTYPE_AP;
181  else
182  priv->ah->opmode = NL80211_IFTYPE_STATION;
183 
184  ath9k_hw_setopmode(priv->ah);
185 }
186 
187 void ath9k_htc_reset(struct ath9k_htc_priv *priv)
188 {
189  struct ath_hw *ah = priv->ah;
190  struct ath_common *common = ath9k_hw_common(ah);
191  struct ieee80211_channel *channel = priv->hw->conf.channel;
192  struct ath9k_hw_cal_data *caldata = NULL;
193  enum htc_phymode mode;
194  __be16 htc_mode;
195  u8 cmd_rsp;
196  int ret;
197 
198  mutex_lock(&priv->mutex);
199  ath9k_htc_ps_wakeup(priv);
200 
201  ath9k_htc_stop_ani(priv);
202  ieee80211_stop_queues(priv->hw);
203 
204  del_timer_sync(&priv->tx.cleanup_timer);
205  ath9k_htc_tx_drain(priv);
206 
210 
211  ath9k_wmi_event_drain(priv);
212 
213  caldata = &priv->caldata;
214  ret = ath9k_hw_reset(ah, ah->curchan, caldata, false);
215  if (ret) {
216  ath_err(common,
217  "Unable to reset device (%u Mhz) reset status %d\n",
218  channel->center_freq, ret);
219  }
220 
221  ath9k_cmn_update_txpow(ah, priv->curtxpow, priv->txpowlimit,
222  &priv->curtxpow);
223 
225  ath9k_host_rx_init(priv);
226 
227  mode = ath9k_htc_get_curmode(priv, ah->curchan);
228  htc_mode = cpu_to_be16(mode);
229  WMI_CMD_BUF(WMI_SET_MODE_CMDID, &htc_mode);
230 
232  htc_start(priv->htc);
233  ath9k_htc_vif_reconfig(priv);
234  ieee80211_wake_queues(priv->hw);
235 
236  mod_timer(&priv->tx.cleanup_timer,
238 
239  ath9k_htc_ps_restore(priv);
240  mutex_unlock(&priv->mutex);
241 }
242 
243 static int ath9k_htc_set_channel(struct ath9k_htc_priv *priv,
244  struct ieee80211_hw *hw,
245  struct ath9k_channel *hchan)
246 {
247  struct ath_hw *ah = priv->ah;
248  struct ath_common *common = ath9k_hw_common(ah);
249  struct ieee80211_conf *conf = &common->hw->conf;
250  bool fastcc;
251  struct ieee80211_channel *channel = hw->conf.channel;
252  struct ath9k_hw_cal_data *caldata = NULL;
253  enum htc_phymode mode;
254  __be16 htc_mode;
255  u8 cmd_rsp;
256  int ret;
257 
258  if (test_bit(OP_INVALID, &priv->op_flags))
259  return -EIO;
260 
261  fastcc = !!(hw->conf.flags & IEEE80211_CONF_OFFCHANNEL);
262 
263  ath9k_htc_ps_wakeup(priv);
264 
265  del_timer_sync(&priv->tx.cleanup_timer);
266  ath9k_htc_tx_drain(priv);
267 
271 
272  ath9k_wmi_event_drain(priv);
273 
274  ath_dbg(common, CONFIG,
275  "(%u MHz) -> (%u MHz), HT: %d, HT40: %d fastcc: %d\n",
276  priv->ah->curchan->channel,
277  channel->center_freq, conf_is_ht(conf), conf_is_ht40(conf),
278  fastcc);
279 
280  if (!fastcc)
281  caldata = &priv->caldata;
282 
283  ret = ath9k_hw_reset(ah, hchan, caldata, fastcc);
284  if (ret) {
285  ath_err(common,
286  "Unable to reset channel (%u Mhz) reset status %d\n",
287  channel->center_freq, ret);
288  goto err;
289  }
290 
291  ath9k_cmn_update_txpow(ah, priv->curtxpow, priv->txpowlimit,
292  &priv->curtxpow);
293 
295  if (ret)
296  goto err;
297 
298  ath9k_host_rx_init(priv);
299 
300  mode = ath9k_htc_get_curmode(priv, hchan);
301  htc_mode = cpu_to_be16(mode);
302  WMI_CMD_BUF(WMI_SET_MODE_CMDID, &htc_mode);
303  if (ret)
304  goto err;
305 
307  if (ret)
308  goto err;
309 
310  htc_start(priv->htc);
311 
312  if (!test_bit(OP_SCANNING, &priv->op_flags) &&
313  !(hw->conf.flags & IEEE80211_CONF_OFFCHANNEL))
314  ath9k_htc_vif_reconfig(priv);
315 
316  mod_timer(&priv->tx.cleanup_timer,
318 
319 err:
320  ath9k_htc_ps_restore(priv);
321  return ret;
322 }
323 
324 /*
325  * Monitor mode handling is a tad complicated because the firmware requires
326  * an interface to be created exclusively, while mac80211 doesn't associate
327  * an interface with the mode.
328  *
329  * So, for now, only one monitor interface can be configured.
330  */
331 static void __ath9k_htc_remove_monitor_interface(struct ath9k_htc_priv *priv)
332 {
333  struct ath_common *common = ath9k_hw_common(priv->ah);
334  struct ath9k_htc_target_vif hvif;
335  int ret = 0;
336  u8 cmd_rsp;
337 
338  memset(&hvif, 0, sizeof(struct ath9k_htc_target_vif));
339  memcpy(&hvif.myaddr, common->macaddr, ETH_ALEN);
340  hvif.index = priv->mon_vif_idx;
342  if (ret) {
343  ath_err(common, "Unable to remove monitor interface at idx: %d\n",
344  priv->mon_vif_idx);
345  }
346 
347  priv->nvifs--;
348  priv->vif_slot &= ~(1 << priv->mon_vif_idx);
349 }
350 
351 static int ath9k_htc_add_monitor_interface(struct ath9k_htc_priv *priv)
352 {
353  struct ath_common *common = ath9k_hw_common(priv->ah);
354  struct ath9k_htc_target_vif hvif;
355  struct ath9k_htc_target_sta tsta;
356  int ret = 0, sta_idx;
357  u8 cmd_rsp;
358 
359  if ((priv->nvifs >= ATH9K_HTC_MAX_VIF) ||
360  (priv->nstations >= ATH9K_HTC_MAX_STA)) {
361  ret = -ENOBUFS;
362  goto err_vif;
363  }
364 
365  sta_idx = ffz(priv->sta_slot);
366  if ((sta_idx < 0) || (sta_idx > ATH9K_HTC_MAX_STA)) {
367  ret = -ENOBUFS;
368  goto err_vif;
369  }
370 
371  /*
372  * Add an interface.
373  */
374  memset(&hvif, 0, sizeof(struct ath9k_htc_target_vif));
375  memcpy(&hvif.myaddr, common->macaddr, ETH_ALEN);
376 
377  hvif.opmode = HTC_M_MONITOR;
378  hvif.index = ffz(priv->vif_slot);
379 
381  if (ret)
382  goto err_vif;
383 
384  /*
385  * Assign the monitor interface index as a special case here.
386  * This is needed when the interface is brought down.
387  */
388  priv->mon_vif_idx = hvif.index;
389  priv->vif_slot |= (1 << hvif.index);
390 
391  /*
392  * Set the hardware mode to monitor only if there are no
393  * other interfaces.
394  */
395  if (!priv->nvifs)
396  priv->ah->opmode = NL80211_IFTYPE_MONITOR;
397 
398  priv->nvifs++;
399 
400  /*
401  * Associate a station with the interface for packet injection.
402  */
403  memset(&tsta, 0, sizeof(struct ath9k_htc_target_sta));
404 
405  memcpy(&tsta.macaddr, common->macaddr, ETH_ALEN);
406 
407  tsta.is_vif_sta = 1;
408  tsta.sta_index = sta_idx;
409  tsta.vif_index = hvif.index;
410  tsta.maxampdu = cpu_to_be16(0xffff);
411 
413  if (ret) {
414  ath_err(common, "Unable to add station entry for monitor mode\n");
415  goto err_sta;
416  }
417 
418  priv->sta_slot |= (1 << sta_idx);
419  priv->nstations++;
420  priv->vif_sta_pos[priv->mon_vif_idx] = sta_idx;
421  priv->ah->is_monitoring = true;
422 
423  ath_dbg(common, CONFIG,
424  "Attached a monitor interface at idx: %d, sta idx: %d\n",
425  priv->mon_vif_idx, sta_idx);
426 
427  return 0;
428 
429 err_sta:
430  /*
431  * Remove the interface from the target.
432  */
433  __ath9k_htc_remove_monitor_interface(priv);
434 err_vif:
435  ath_dbg(common, FATAL, "Unable to attach a monitor interface\n");
436 
437  return ret;
438 }
439 
440 static int ath9k_htc_remove_monitor_interface(struct ath9k_htc_priv *priv)
441 {
442  struct ath_common *common = ath9k_hw_common(priv->ah);
443  int ret = 0;
444  u8 cmd_rsp, sta_idx;
445 
446  __ath9k_htc_remove_monitor_interface(priv);
447 
448  sta_idx = priv->vif_sta_pos[priv->mon_vif_idx];
449 
451  if (ret) {
452  ath_err(common, "Unable to remove station entry for monitor mode\n");
453  return ret;
454  }
455 
456  priv->sta_slot &= ~(1 << sta_idx);
457  priv->nstations--;
458  priv->ah->is_monitoring = false;
459 
460  ath_dbg(common, CONFIG,
461  "Removed a monitor interface at idx: %d, sta idx: %d\n",
462  priv->mon_vif_idx, sta_idx);
463 
464  return 0;
465 }
466 
467 static int ath9k_htc_add_station(struct ath9k_htc_priv *priv,
468  struct ieee80211_vif *vif,
469  struct ieee80211_sta *sta)
470 {
471  struct ath_common *common = ath9k_hw_common(priv->ah);
472  struct ath9k_htc_target_sta tsta;
473  struct ath9k_htc_vif *avp = (struct ath9k_htc_vif *) vif->drv_priv;
474  struct ath9k_htc_sta *ista;
475  int ret, sta_idx;
476  u8 cmd_rsp;
477  u16 maxampdu;
478 
479  if (priv->nstations >= ATH9K_HTC_MAX_STA)
480  return -ENOBUFS;
481 
482  sta_idx = ffz(priv->sta_slot);
483  if ((sta_idx < 0) || (sta_idx > ATH9K_HTC_MAX_STA))
484  return -ENOBUFS;
485 
486  memset(&tsta, 0, sizeof(struct ath9k_htc_target_sta));
487 
488  if (sta) {
489  ista = (struct ath9k_htc_sta *) sta->drv_priv;
490  memcpy(&tsta.macaddr, sta->addr, ETH_ALEN);
491  memcpy(&tsta.bssid, common->curbssid, ETH_ALEN);
492  ista->index = sta_idx;
493  tsta.is_vif_sta = 0;
494  maxampdu = 1 << (IEEE80211_HT_MAX_AMPDU_FACTOR +
495  sta->ht_cap.ampdu_factor);
496  tsta.maxampdu = cpu_to_be16(maxampdu);
497  } else {
498  memcpy(&tsta.macaddr, vif->addr, ETH_ALEN);
499  tsta.is_vif_sta = 1;
500  tsta.maxampdu = cpu_to_be16(0xffff);
501  }
502 
503  tsta.sta_index = sta_idx;
504  tsta.vif_index = avp->index;
505 
507  if (ret) {
508  if (sta)
509  ath_err(common,
510  "Unable to add station entry for: %pM\n",
511  sta->addr);
512  return ret;
513  }
514 
515  if (sta) {
516  ath_dbg(common, CONFIG,
517  "Added a station entry for: %pM (idx: %d)\n",
518  sta->addr, tsta.sta_index);
519  } else {
520  ath_dbg(common, CONFIG,
521  "Added a station entry for VIF %d (idx: %d)\n",
522  avp->index, tsta.sta_index);
523  }
524 
525  priv->sta_slot |= (1 << sta_idx);
526  priv->nstations++;
527  if (!sta)
528  priv->vif_sta_pos[avp->index] = sta_idx;
529 
530  return 0;
531 }
532 
533 static int ath9k_htc_remove_station(struct ath9k_htc_priv *priv,
534  struct ieee80211_vif *vif,
535  struct ieee80211_sta *sta)
536 {
537  struct ath_common *common = ath9k_hw_common(priv->ah);
538  struct ath9k_htc_vif *avp = (struct ath9k_htc_vif *) vif->drv_priv;
539  struct ath9k_htc_sta *ista;
540  int ret;
541  u8 cmd_rsp, sta_idx;
542 
543  if (sta) {
544  ista = (struct ath9k_htc_sta *) sta->drv_priv;
545  sta_idx = ista->index;
546  } else {
547  sta_idx = priv->vif_sta_pos[avp->index];
548  }
549 
551  if (ret) {
552  if (sta)
553  ath_err(common,
554  "Unable to remove station entry for: %pM\n",
555  sta->addr);
556  return ret;
557  }
558 
559  if (sta) {
560  ath_dbg(common, CONFIG,
561  "Removed a station entry for: %pM (idx: %d)\n",
562  sta->addr, sta_idx);
563  } else {
564  ath_dbg(common, CONFIG,
565  "Removed a station entry for VIF %d (idx: %d)\n",
566  avp->index, sta_idx);
567  }
568 
569  priv->sta_slot &= ~(1 << sta_idx);
570  priv->nstations--;
571 
572  return 0;
573 }
574 
576  u8 enable_coex)
577 {
578  struct ath9k_htc_cap_target tcap;
579  int ret;
580  u8 cmd_rsp;
581 
582  memset(&tcap, 0, sizeof(struct ath9k_htc_cap_target));
583 
584  tcap.ampdu_limit = cpu_to_be32(0xffff);
585  tcap.ampdu_subframes = 0xff;
586  tcap.enable_coex = enable_coex;
587  tcap.tx_chainmask = priv->ah->caps.tx_chainmask;
588 
590 
591  return ret;
592 }
593 
594 static void ath9k_htc_setup_rate(struct ath9k_htc_priv *priv,
595  struct ieee80211_sta *sta,
596  struct ath9k_htc_target_rate *trate)
597 {
598  struct ath9k_htc_sta *ista = (struct ath9k_htc_sta *) sta->drv_priv;
599  struct ieee80211_supported_band *sband;
600  u32 caps = 0;
601  int i, j;
602 
603  sband = priv->hw->wiphy->bands[priv->hw->conf.channel->band];
604 
605  for (i = 0, j = 0; i < sband->n_bitrates; i++) {
606  if (sta->supp_rates[sband->band] & BIT(i)) {
607  trate->rates.legacy_rates.rs_rates[j]
608  = (sband->bitrates[i].bitrate * 2) / 10;
609  j++;
610  }
611  }
612  trate->rates.legacy_rates.rs_nrates = j;
613 
614  if (sta->ht_cap.ht_supported) {
615  for (i = 0, j = 0; i < 77; i++) {
616  if (sta->ht_cap.mcs.rx_mask[i/8] & (1<<(i%8)))
617  trate->rates.ht_rates.rs_rates[j++] = i;
618  if (j == ATH_HTC_RATE_MAX)
619  break;
620  }
621  trate->rates.ht_rates.rs_nrates = j;
622 
624  if (sta->ht_cap.mcs.rx_mask[1])
626  if ((sta->ht_cap.cap & IEEE80211_HT_CAP_SUP_WIDTH_20_40) &&
627  (conf_is_ht40(&priv->hw->conf)))
629  if (conf_is_ht40(&priv->hw->conf) &&
630  (sta->ht_cap.cap & IEEE80211_HT_CAP_SGI_40))
632  else if (conf_is_ht20(&priv->hw->conf) &&
633  (sta->ht_cap.cap & IEEE80211_HT_CAP_SGI_20))
635  }
636 
637  trate->sta_index = ista->index;
638  trate->isnew = 1;
639  trate->capflags = cpu_to_be32(caps);
640 }
641 
642 static int ath9k_htc_send_rate_cmd(struct ath9k_htc_priv *priv,
643  struct ath9k_htc_target_rate *trate)
644 {
645  struct ath_common *common = ath9k_hw_common(priv->ah);
646  int ret;
647  u8 cmd_rsp;
648 
650  if (ret) {
651  ath_err(common,
652  "Unable to initialize Rate information on target\n");
653  }
654 
655  return ret;
656 }
657 
658 static void ath9k_htc_init_rate(struct ath9k_htc_priv *priv,
659  struct ieee80211_sta *sta)
660 {
661  struct ath_common *common = ath9k_hw_common(priv->ah);
662  struct ath9k_htc_target_rate trate;
663  int ret;
664 
665  memset(&trate, 0, sizeof(struct ath9k_htc_target_rate));
666  ath9k_htc_setup_rate(priv, sta, &trate);
667  ret = ath9k_htc_send_rate_cmd(priv, &trate);
668  if (!ret)
669  ath_dbg(common, CONFIG,
670  "Updated target sta: %pM, rate caps: 0x%X\n",
671  sta->addr, be32_to_cpu(trate.capflags));
672 }
673 
674 static void ath9k_htc_update_rate(struct ath9k_htc_priv *priv,
675  struct ieee80211_vif *vif,
676  struct ieee80211_bss_conf *bss_conf)
677 {
678  struct ath_common *common = ath9k_hw_common(priv->ah);
679  struct ath9k_htc_target_rate trate;
680  struct ieee80211_sta *sta;
681  int ret;
682 
683  memset(&trate, 0, sizeof(struct ath9k_htc_target_rate));
684 
685  rcu_read_lock();
686  sta = ieee80211_find_sta(vif, bss_conf->bssid);
687  if (!sta) {
688  rcu_read_unlock();
689  return;
690  }
691  ath9k_htc_setup_rate(priv, sta, &trate);
692  rcu_read_unlock();
693 
694  ret = ath9k_htc_send_rate_cmd(priv, &trate);
695  if (!ret)
696  ath_dbg(common, CONFIG,
697  "Updated target sta: %pM, rate caps: 0x%X\n",
698  bss_conf->bssid, be32_to_cpu(trate.capflags));
699 }
700 
701 static int ath9k_htc_tx_aggr_oper(struct ath9k_htc_priv *priv,
702  struct ieee80211_vif *vif,
703  struct ieee80211_sta *sta,
705  u16 tid)
706 {
707  struct ath_common *common = ath9k_hw_common(priv->ah);
708  struct ath9k_htc_target_aggr aggr;
709  struct ath9k_htc_sta *ista;
710  int ret = 0;
711  u8 cmd_rsp;
712 
713  if (tid >= ATH9K_HTC_MAX_TID)
714  return -EINVAL;
715 
716  memset(&aggr, 0, sizeof(struct ath9k_htc_target_aggr));
717  ista = (struct ath9k_htc_sta *) sta->drv_priv;
718 
719  aggr.sta_index = ista->index;
720  aggr.tidno = tid & 0xf;
721  aggr.aggr_enable = (action == IEEE80211_AMPDU_TX_START) ? true : false;
722 
724  if (ret)
725  ath_dbg(common, CONFIG,
726  "Unable to %s TX aggregation for (%pM, %d)\n",
727  (aggr.aggr_enable) ? "start" : "stop", sta->addr, tid);
728  else
729  ath_dbg(common, CONFIG,
730  "%s TX aggregation for (%pM, %d)\n",
731  (aggr.aggr_enable) ? "Starting" : "Stopping",
732  sta->addr, tid);
733 
734  spin_lock_bh(&priv->tx.tx_lock);
735  ista->tid_state[tid] = (aggr.aggr_enable && !ret) ? AGGR_START : AGGR_STOP;
736  spin_unlock_bh(&priv->tx.tx_lock);
737 
738  return ret;
739 }
740 
741 /*******/
742 /* ANI */
743 /*******/
744 
746 {
747  struct ath_common *common = ath9k_hw_common(priv->ah);
748  unsigned long timestamp = jiffies_to_msecs(jiffies);
749 
750  common->ani.longcal_timer = timestamp;
751  common->ani.shortcal_timer = timestamp;
752  common->ani.checkani_timer = timestamp;
753 
755 
756  ieee80211_queue_delayed_work(common->hw, &priv->ani_work,
758 }
759 
761 {
764 }
765 
767 {
768  struct ath9k_htc_priv *priv =
769  container_of(work, struct ath9k_htc_priv, ani_work.work);
770  struct ath_hw *ah = priv->ah;
771  struct ath_common *common = ath9k_hw_common(ah);
772  bool longcal = false;
773  bool shortcal = false;
774  bool aniflag = false;
775  unsigned int timestamp = jiffies_to_msecs(jiffies);
776  u32 cal_interval, short_cal_interval;
777 
778  short_cal_interval = (ah->opmode == NL80211_IFTYPE_AP) ?
780 
781  /* Only calibrate if awake */
782  if (ah->power_mode != ATH9K_PM_AWAKE)
783  goto set_timer;
784 
785  /* Long calibration runs independently of short calibration. */
786  if ((timestamp - common->ani.longcal_timer) >= ATH_LONG_CALINTERVAL) {
787  longcal = true;
788  ath_dbg(common, ANI, "longcal @%lu\n", jiffies);
789  common->ani.longcal_timer = timestamp;
790  }
791 
792  /* Short calibration applies only while caldone is false */
793  if (!common->ani.caldone) {
794  if ((timestamp - common->ani.shortcal_timer) >=
795  short_cal_interval) {
796  shortcal = true;
797  ath_dbg(common, ANI, "shortcal @%lu\n", jiffies);
798  common->ani.shortcal_timer = timestamp;
799  common->ani.resetcal_timer = timestamp;
800  }
801  } else {
802  if ((timestamp - common->ani.resetcal_timer) >=
804  common->ani.caldone = ath9k_hw_reset_calvalid(ah);
805  if (common->ani.caldone)
806  common->ani.resetcal_timer = timestamp;
807  }
808  }
809 
810  /* Verify whether we must check ANI */
811  if (ah->config.enable_ani &&
812  (timestamp - common->ani.checkani_timer) >= ATH_ANI_POLLINTERVAL) {
813  aniflag = true;
814  common->ani.checkani_timer = timestamp;
815  }
816 
817  /* Skip all processing if there's nothing to do. */
818  if (longcal || shortcal || aniflag) {
819 
820  ath9k_htc_ps_wakeup(priv);
821 
822  /* Call ANI routine if necessary */
823  if (aniflag)
824  ath9k_hw_ani_monitor(ah, ah->curchan);
825 
826  /* Perform calibration if necessary */
827  if (longcal || shortcal)
828  common->ani.caldone =
829  ath9k_hw_calibrate(ah, ah->curchan,
830  ah->rxchainmask, longcal);
831 
832  ath9k_htc_ps_restore(priv);
833  }
834 
835 set_timer:
836  /*
837  * Set timer interval based on previous results.
838  * The interval must be the shortest necessary to satisfy ANI,
839  * short calibration and long calibration.
840  */
841  cal_interval = ATH_LONG_CALINTERVAL;
842  if (ah->config.enable_ani)
843  cal_interval = min(cal_interval, (u32)ATH_ANI_POLLINTERVAL);
844  if (!common->ani.caldone)
845  cal_interval = min(cal_interval, (u32)short_cal_interval);
846 
847  ieee80211_queue_delayed_work(common->hw, &priv->ani_work,
848  msecs_to_jiffies(cal_interval));
849 }
850 
851 /**********************/
852 /* mac80211 Callbacks */
853 /**********************/
854 
855 static void ath9k_htc_tx(struct ieee80211_hw *hw,
857  struct sk_buff *skb)
858 {
859  struct ieee80211_hdr *hdr;
860  struct ath9k_htc_priv *priv = hw->priv;
861  struct ath_common *common = ath9k_hw_common(priv->ah);
862  int padpos, padsize, ret, slot;
863 
864  hdr = (struct ieee80211_hdr *) skb->data;
865 
866  /* Add the padding after the header if this is not already done */
867  padpos = ath9k_cmn_padpos(hdr->frame_control);
868  padsize = padpos & 3;
869  if (padsize && skb->len > padpos) {
870  if (skb_headroom(skb) < padsize) {
871  ath_dbg(common, XMIT, "No room for padding\n");
872  goto fail_tx;
873  }
874  skb_push(skb, padsize);
875  memmove(skb->data, skb->data + padsize, padpos);
876  }
877 
878  slot = ath9k_htc_tx_get_slot(priv);
879  if (slot < 0) {
880  ath_dbg(common, XMIT, "No free TX slot\n");
881  goto fail_tx;
882  }
883 
884  ret = ath9k_htc_tx_start(priv, control->sta, skb, slot, false);
885  if (ret != 0) {
886  ath_dbg(common, XMIT, "Tx failed\n");
887  goto clear_slot;
888  }
889 
891 
892  return;
893 
894 clear_slot:
895  ath9k_htc_tx_clear_slot(priv, slot);
896 fail_tx:
897  dev_kfree_skb_any(skb);
898 }
899 
900 static int ath9k_htc_start(struct ieee80211_hw *hw)
901 {
902  struct ath9k_htc_priv *priv = hw->priv;
903  struct ath_hw *ah = priv->ah;
904  struct ath_common *common = ath9k_hw_common(ah);
905  struct ieee80211_channel *curchan = hw->conf.channel;
906  struct ath9k_channel *init_channel;
907  int ret = 0;
908  enum htc_phymode mode;
909  __be16 htc_mode;
910  u8 cmd_rsp;
911 
912  mutex_lock(&priv->mutex);
913 
914  ath_dbg(common, CONFIG,
915  "Starting driver with initial channel: %d MHz\n",
916  curchan->center_freq);
917 
918  /* Ensure that HW is awake before flushing RX */
921 
922  /* setup initial channel */
923  init_channel = ath9k_cmn_get_curchannel(hw, ah);
924 
925  ret = ath9k_hw_reset(ah, init_channel, ah->caldata, false);
926  if (ret) {
927  ath_err(common,
928  "Unable to reset hardware; reset status %d (freq %u MHz)\n",
929  ret, curchan->center_freq);
930  mutex_unlock(&priv->mutex);
931  return ret;
932  }
933 
934  ath9k_cmn_update_txpow(ah, priv->curtxpow, priv->txpowlimit,
935  &priv->curtxpow);
936 
937  mode = ath9k_htc_get_curmode(priv, init_channel);
938  htc_mode = cpu_to_be16(mode);
939  WMI_CMD_BUF(WMI_SET_MODE_CMDID, &htc_mode);
942 
943  ath9k_host_rx_init(priv);
944 
945  ret = ath9k_htc_update_cap_target(priv, 0);
946  if (ret)
947  ath_dbg(common, CONFIG,
948  "Failed to update capability in target\n");
949 
950  clear_bit(OP_INVALID, &priv->op_flags);
951  htc_start(priv->htc);
952 
953  spin_lock_bh(&priv->tx.tx_lock);
954  priv->tx.flags &= ~ATH9K_HTC_OP_TX_QUEUES_STOP;
955  spin_unlock_bh(&priv->tx.tx_lock);
956 
958 
959  mod_timer(&priv->tx.cleanup_timer,
961 
962  ath9k_htc_start_btcoex(priv);
963 
964  mutex_unlock(&priv->mutex);
965 
966  return ret;
967 }
968 
969 static void ath9k_htc_stop(struct ieee80211_hw *hw)
970 {
971  struct ath9k_htc_priv *priv = hw->priv;
972  struct ath_hw *ah = priv->ah;
973  struct ath_common *common = ath9k_hw_common(ah);
974  int ret __attribute__ ((unused));
975  u8 cmd_rsp;
976 
977  mutex_lock(&priv->mutex);
978 
979  if (test_bit(OP_INVALID, &priv->op_flags)) {
980  ath_dbg(common, ANY, "Device not present\n");
981  mutex_unlock(&priv->mutex);
982  return;
983  }
984 
985  ath9k_htc_ps_wakeup(priv);
986 
990 
991  tasklet_kill(&priv->rx_tasklet);
992 
993  del_timer_sync(&priv->tx.cleanup_timer);
994  ath9k_htc_tx_drain(priv);
995  ath9k_wmi_event_drain(priv);
996 
997  mutex_unlock(&priv->mutex);
998 
999  /* Cancel all the running timers/work .. */
1000  cancel_work_sync(&priv->fatal_work);
1001  cancel_work_sync(&priv->ps_work);
1002 
1003 #ifdef CONFIG_MAC80211_LEDS
1004  cancel_work_sync(&priv->led_work);
1005 #endif
1006  ath9k_htc_stop_ani(priv);
1007 
1008  mutex_lock(&priv->mutex);
1009 
1010  ath9k_htc_stop_btcoex(priv);
1011 
1012  /* Remove a monitor interface if it's present. */
1013  if (priv->ah->is_monitoring)
1014  ath9k_htc_remove_monitor_interface(priv);
1015 
1017  ath9k_hw_disable(ah);
1018  ath9k_htc_ps_restore(priv);
1020 
1021  set_bit(OP_INVALID, &priv->op_flags);
1022 
1023  ath_dbg(common, CONFIG, "Driver halt\n");
1024  mutex_unlock(&priv->mutex);
1025 }
1026 
1027 static int ath9k_htc_add_interface(struct ieee80211_hw *hw,
1028  struct ieee80211_vif *vif)
1029 {
1030  struct ath9k_htc_priv *priv = hw->priv;
1031  struct ath9k_htc_vif *avp = (void *)vif->drv_priv;
1032  struct ath_common *common = ath9k_hw_common(priv->ah);
1033  struct ath9k_htc_target_vif hvif;
1034  int ret = 0;
1035  u8 cmd_rsp;
1036 
1037  mutex_lock(&priv->mutex);
1038 
1039  if (priv->nvifs >= ATH9K_HTC_MAX_VIF) {
1040  mutex_unlock(&priv->mutex);
1041  return -ENOBUFS;
1042  }
1043 
1044  if (priv->num_ibss_vif ||
1045  (priv->nvifs && vif->type == NL80211_IFTYPE_ADHOC)) {
1046  ath_err(common, "IBSS coexistence with other modes is not allowed\n");
1047  mutex_unlock(&priv->mutex);
1048  return -ENOBUFS;
1049  }
1050 
1051  if (((vif->type == NL80211_IFTYPE_AP) ||
1052  (vif->type == NL80211_IFTYPE_ADHOC)) &&
1053  ((priv->num_ap_vif + priv->num_ibss_vif) >= ATH9K_HTC_MAX_BCN_VIF)) {
1054  ath_err(common, "Max. number of beaconing interfaces reached\n");
1055  mutex_unlock(&priv->mutex);
1056  return -ENOBUFS;
1057  }
1058 
1059  ath9k_htc_ps_wakeup(priv);
1060  memset(&hvif, 0, sizeof(struct ath9k_htc_target_vif));
1061  memcpy(&hvif.myaddr, vif->addr, ETH_ALEN);
1062 
1063  switch (vif->type) {
1065  hvif.opmode = HTC_M_STA;
1066  break;
1067  case NL80211_IFTYPE_ADHOC:
1068  hvif.opmode = HTC_M_IBSS;
1069  break;
1070  case NL80211_IFTYPE_AP:
1071  hvif.opmode = HTC_M_HOSTAP;
1072  break;
1073  default:
1074  ath_err(common,
1075  "Interface type %d not yet supported\n", vif->type);
1076  ret = -EOPNOTSUPP;
1077  goto out;
1078  }
1079 
1080  /* Index starts from zero on the target */
1081  avp->index = hvif.index = ffz(priv->vif_slot);
1082  hvif.rtsthreshold = cpu_to_be16(2304);
1084  if (ret)
1085  goto out;
1086 
1087  /*
1088  * We need a node in target to tx mgmt frames
1089  * before association.
1090  */
1091  ret = ath9k_htc_add_station(priv, vif, NULL);
1092  if (ret) {
1094  goto out;
1095  }
1096 
1097  ath9k_htc_set_bssid_mask(priv, vif);
1098 
1099  priv->vif_slot |= (1 << avp->index);
1100  priv->nvifs++;
1101 
1102  INC_VIF(priv, vif->type);
1103 
1104  if ((vif->type == NL80211_IFTYPE_AP) ||
1105  (vif->type == NL80211_IFTYPE_ADHOC))
1106  ath9k_htc_assign_bslot(priv, vif);
1107 
1108  ath9k_htc_set_opmode(priv);
1109 
1110  if ((priv->ah->opmode == NL80211_IFTYPE_AP) &&
1111  !test_bit(OP_ANI_RUNNING, &priv->op_flags)) {
1112  ath9k_hw_set_tsfadjust(priv->ah, true);
1113  ath9k_htc_start_ani(priv);
1114  }
1115 
1116  ath_dbg(common, CONFIG, "Attach a VIF of type: %d at idx: %d\n",
1117  vif->type, avp->index);
1118 
1119 out:
1120  ath9k_htc_ps_restore(priv);
1121  mutex_unlock(&priv->mutex);
1122 
1123  return ret;
1124 }
1125 
1126 static void ath9k_htc_remove_interface(struct ieee80211_hw *hw,
1127  struct ieee80211_vif *vif)
1128 {
1129  struct ath9k_htc_priv *priv = hw->priv;
1130  struct ath_common *common = ath9k_hw_common(priv->ah);
1131  struct ath9k_htc_vif *avp = (void *)vif->drv_priv;
1132  struct ath9k_htc_target_vif hvif;
1133  int ret = 0;
1134  u8 cmd_rsp;
1135 
1136  mutex_lock(&priv->mutex);
1137  ath9k_htc_ps_wakeup(priv);
1138 
1139  memset(&hvif, 0, sizeof(struct ath9k_htc_target_vif));
1140  memcpy(&hvif.myaddr, vif->addr, ETH_ALEN);
1141  hvif.index = avp->index;
1143  if (ret) {
1144  ath_err(common, "Unable to remove interface at idx: %d\n",
1145  avp->index);
1146  }
1147  priv->nvifs--;
1148  priv->vif_slot &= ~(1 << avp->index);
1149 
1150  ath9k_htc_remove_station(priv, vif, NULL);
1151 
1152  DEC_VIF(priv, vif->type);
1153 
1154  if ((vif->type == NL80211_IFTYPE_AP) ||
1155  (vif->type == NL80211_IFTYPE_ADHOC))
1156  ath9k_htc_remove_bslot(priv, vif);
1157 
1158  ath9k_htc_set_opmode(priv);
1159 
1160  ath9k_htc_set_bssid_mask(priv, vif);
1161 
1162  /*
1163  * Stop ANI only if there are no associated station interfaces.
1164  */
1165  if ((vif->type == NL80211_IFTYPE_AP) && (priv->num_ap_vif == 0)) {
1166  priv->rearm_ani = false;
1168  ath9k_htc_vif_iter, priv);
1169  if (!priv->rearm_ani)
1170  ath9k_htc_stop_ani(priv);
1171  }
1172 
1173  ath_dbg(common, CONFIG, "Detach Interface at idx: %d\n", avp->index);
1174 
1175  ath9k_htc_ps_restore(priv);
1176  mutex_unlock(&priv->mutex);
1177 }
1178 
1179 static int ath9k_htc_config(struct ieee80211_hw *hw, u32 changed)
1180 {
1181  struct ath9k_htc_priv *priv = hw->priv;
1182  struct ath_common *common = ath9k_hw_common(priv->ah);
1183  struct ieee80211_conf *conf = &hw->conf;
1184  bool chip_reset = false;
1185  int ret = 0;
1186 
1187  mutex_lock(&priv->mutex);
1188  ath9k_htc_ps_wakeup(priv);
1189 
1190  if (changed & IEEE80211_CONF_CHANGE_IDLE) {
1191  mutex_lock(&priv->htc_pm_lock);
1192 
1193  priv->ps_idle = !!(conf->flags & IEEE80211_CONF_IDLE);
1194  if (priv->ps_idle)
1195  chip_reset = true;
1196 
1197  mutex_unlock(&priv->htc_pm_lock);
1198  }
1199 
1200  /*
1201  * Monitor interface should be added before
1202  * IEEE80211_CONF_CHANGE_CHANNEL is handled.
1203  */
1204  if (changed & IEEE80211_CONF_CHANGE_MONITOR) {
1205  if ((conf->flags & IEEE80211_CONF_MONITOR) &&
1206  !priv->ah->is_monitoring)
1207  ath9k_htc_add_monitor_interface(priv);
1208  else if (priv->ah->is_monitoring)
1209  ath9k_htc_remove_monitor_interface(priv);
1210  }
1211 
1212  if ((changed & IEEE80211_CONF_CHANGE_CHANNEL) || chip_reset) {
1213  struct ieee80211_channel *curchan = hw->conf.channel;
1214  int pos = curchan->hw_value;
1215 
1216  ath_dbg(common, CONFIG, "Set channel: %d MHz\n",
1217  curchan->center_freq);
1218 
1219  ath9k_cmn_update_ichannel(&priv->ah->channels[pos],
1220  hw->conf.channel,
1221  hw->conf.channel_type);
1222 
1223  if (ath9k_htc_set_channel(priv, hw, &priv->ah->channels[pos]) < 0) {
1224  ath_err(common, "Unable to set channel\n");
1225  ret = -EINVAL;
1226  goto out;
1227  }
1228 
1229  }
1230 
1231  if (changed & IEEE80211_CONF_CHANGE_PS) {
1232  if (conf->flags & IEEE80211_CONF_PS) {
1234  priv->ps_enabled = true;
1235  } else {
1236  priv->ps_enabled = false;
1237  cancel_work_sync(&priv->ps_work);
1239  }
1240  }
1241 
1242  if (changed & IEEE80211_CONF_CHANGE_POWER) {
1243  priv->txpowlimit = 2 * conf->power_level;
1244  ath9k_cmn_update_txpow(priv->ah, priv->curtxpow,
1245  priv->txpowlimit, &priv->curtxpow);
1246  }
1247 
1248 out:
1249  ath9k_htc_ps_restore(priv);
1250  mutex_unlock(&priv->mutex);
1251  return ret;
1252 }
1253 
1254 #define SUPPORTED_FILTERS \
1255  (FIF_PROMISC_IN_BSS | \
1256  FIF_ALLMULTI | \
1257  FIF_CONTROL | \
1258  FIF_PSPOLL | \
1259  FIF_OTHER_BSS | \
1260  FIF_BCN_PRBRESP_PROMISC | \
1261  FIF_PROBE_REQ | \
1262  FIF_FCSFAIL)
1263 
1264 static void ath9k_htc_configure_filter(struct ieee80211_hw *hw,
1265  unsigned int changed_flags,
1266  unsigned int *total_flags,
1267  u64 multicast)
1268 {
1269  struct ath9k_htc_priv *priv = hw->priv;
1270  u32 rfilt;
1271 
1272  mutex_lock(&priv->mutex);
1273  changed_flags &= SUPPORTED_FILTERS;
1274  *total_flags &= SUPPORTED_FILTERS;
1275 
1276  if (test_bit(OP_INVALID, &priv->op_flags)) {
1277  ath_dbg(ath9k_hw_common(priv->ah), ANY,
1278  "Unable to configure filter on invalid state\n");
1279  mutex_unlock(&priv->mutex);
1280  return;
1281  }
1282  ath9k_htc_ps_wakeup(priv);
1283 
1284  priv->rxfilter = *total_flags;
1285  rfilt = ath9k_htc_calcrxfilter(priv);
1286  ath9k_hw_setrxfilter(priv->ah, rfilt);
1287 
1288  ath_dbg(ath9k_hw_common(priv->ah), CONFIG, "Set HW RX filter: 0x%x\n",
1289  rfilt);
1290 
1291  ath9k_htc_ps_restore(priv);
1292  mutex_unlock(&priv->mutex);
1293 }
1294 
1295 static int ath9k_htc_sta_add(struct ieee80211_hw *hw,
1296  struct ieee80211_vif *vif,
1297  struct ieee80211_sta *sta)
1298 {
1299  struct ath9k_htc_priv *priv = hw->priv;
1300  int ret;
1301 
1302  mutex_lock(&priv->mutex);
1303  ath9k_htc_ps_wakeup(priv);
1304  ret = ath9k_htc_add_station(priv, vif, sta);
1305  if (!ret)
1306  ath9k_htc_init_rate(priv, sta);
1307  ath9k_htc_ps_restore(priv);
1308  mutex_unlock(&priv->mutex);
1309 
1310  return ret;
1311 }
1312 
1313 static int ath9k_htc_sta_remove(struct ieee80211_hw *hw,
1314  struct ieee80211_vif *vif,
1315  struct ieee80211_sta *sta)
1316 {
1317  struct ath9k_htc_priv *priv = hw->priv;
1318  struct ath9k_htc_sta *ista;
1319  int ret;
1320 
1321  mutex_lock(&priv->mutex);
1322  ath9k_htc_ps_wakeup(priv);
1323  ista = (struct ath9k_htc_sta *) sta->drv_priv;
1324  htc_sta_drain(priv->htc, ista->index);
1325  ret = ath9k_htc_remove_station(priv, vif, sta);
1326  ath9k_htc_ps_restore(priv);
1327  mutex_unlock(&priv->mutex);
1328 
1329  return ret;
1330 }
1331 
1332 static void ath9k_htc_sta_rc_update(struct ieee80211_hw *hw,
1333  struct ieee80211_vif *vif,
1334  struct ieee80211_sta *sta, u32 changed)
1335 {
1336  struct ath9k_htc_priv *priv = hw->priv;
1337  struct ath_common *common = ath9k_hw_common(priv->ah);
1338  struct ath9k_htc_target_rate trate;
1339 
1340  mutex_lock(&priv->mutex);
1341  ath9k_htc_ps_wakeup(priv);
1342 
1343  if (changed & IEEE80211_RC_SUPP_RATES_CHANGED) {
1344  memset(&trate, 0, sizeof(struct ath9k_htc_target_rate));
1345  ath9k_htc_setup_rate(priv, sta, &trate);
1346  if (!ath9k_htc_send_rate_cmd(priv, &trate))
1347  ath_dbg(common, CONFIG,
1348  "Supported rates for sta: %pM updated, rate caps: 0x%X\n",
1349  sta->addr, be32_to_cpu(trate.capflags));
1350  else
1351  ath_dbg(common, CONFIG,
1352  "Unable to update supported rates for sta: %pM\n",
1353  sta->addr);
1354  }
1355 
1356  ath9k_htc_ps_restore(priv);
1357  mutex_unlock(&priv->mutex);
1358 }
1359 
1360 static int ath9k_htc_conf_tx(struct ieee80211_hw *hw,
1361  struct ieee80211_vif *vif, u16 queue,
1362  const struct ieee80211_tx_queue_params *params)
1363 {
1364  struct ath9k_htc_priv *priv = hw->priv;
1365  struct ath_common *common = ath9k_hw_common(priv->ah);
1366  struct ath9k_tx_queue_info qi;
1367  int ret = 0, qnum;
1368 
1369  if (queue >= WME_NUM_AC)
1370  return 0;
1371 
1372  mutex_lock(&priv->mutex);
1373  ath9k_htc_ps_wakeup(priv);
1374 
1375  memset(&qi, 0, sizeof(struct ath9k_tx_queue_info));
1376 
1377  qi.tqi_aifs = params->aifs;
1378  qi.tqi_cwmin = params->cw_min;
1379  qi.tqi_cwmax = params->cw_max;
1380  qi.tqi_burstTime = params->txop * 32;
1381 
1382  qnum = get_hw_qnum(queue, priv->hwq_map);
1383 
1384  ath_dbg(common, CONFIG,
1385  "Configure tx [queue/hwq] [%d/%d], aifs: %d, cw_min: %d, cw_max: %d, txop: %d\n",
1386  queue, qnum, params->aifs, params->cw_min,
1387  params->cw_max, params->txop);
1388 
1389  ret = ath_htc_txq_update(priv, qnum, &qi);
1390  if (ret) {
1391  ath_err(common, "TXQ Update failed\n");
1392  goto out;
1393  }
1394 
1395  if ((priv->ah->opmode == NL80211_IFTYPE_ADHOC) &&
1396  (qnum == priv->hwq_map[WME_AC_BE]))
1398 out:
1399  ath9k_htc_ps_restore(priv);
1400  mutex_unlock(&priv->mutex);
1401 
1402  return ret;
1403 }
1404 
1405 static int ath9k_htc_set_key(struct ieee80211_hw *hw,
1406  enum set_key_cmd cmd,
1407  struct ieee80211_vif *vif,
1408  struct ieee80211_sta *sta,
1409  struct ieee80211_key_conf *key)
1410 {
1411  struct ath9k_htc_priv *priv = hw->priv;
1412  struct ath_common *common = ath9k_hw_common(priv->ah);
1413  int ret = 0;
1414 
1416  return -ENOSPC;
1417 
1418  if ((vif->type == NL80211_IFTYPE_ADHOC ||
1419  vif->type == NL80211_IFTYPE_MESH_POINT) &&
1420  (key->cipher == WLAN_CIPHER_SUITE_TKIP ||
1421  key->cipher == WLAN_CIPHER_SUITE_CCMP) &&
1422  !(key->flags & IEEE80211_KEY_FLAG_PAIRWISE)) {
1423  /*
1424  * For now, disable hw crypto for the RSN IBSS group keys. This
1425  * could be optimized in the future to use a modified key cache
1426  * design to support per-STA RX GTK, but until that gets
1427  * implemented, use of software crypto for group addressed
1428  * frames is a acceptable to allow RSN IBSS to be used.
1429  */
1430  return -EOPNOTSUPP;
1431  }
1432 
1433  mutex_lock(&priv->mutex);
1434  ath_dbg(common, CONFIG, "Set HW Key\n");
1435  ath9k_htc_ps_wakeup(priv);
1436 
1437  switch (cmd) {
1438  case SET_KEY:
1439  ret = ath_key_config(common, vif, sta, key);
1440  if (ret >= 0) {
1441  key->hw_key_idx = ret;
1442  /* push IV and Michael MIC generation to stack */
1444  if (key->cipher == WLAN_CIPHER_SUITE_TKIP)
1446  if (priv->ah->sw_mgmt_crypto &&
1449  ret = 0;
1450  }
1451  break;
1452  case DISABLE_KEY:
1453  ath_key_delete(common, key);
1454  break;
1455  default:
1456  ret = -EINVAL;
1457  }
1458 
1459  ath9k_htc_ps_restore(priv);
1460  mutex_unlock(&priv->mutex);
1461 
1462  return ret;
1463 }
1464 
1465 static void ath9k_htc_set_bssid(struct ath9k_htc_priv *priv)
1466 {
1467  struct ath_common *common = ath9k_hw_common(priv->ah);
1468 
1469  ath9k_hw_write_associd(priv->ah);
1470  ath_dbg(common, CONFIG, "BSSID: %pM aid: 0x%x\n",
1471  common->curbssid, common->curaid);
1472 }
1473 
1474 static void ath9k_htc_bss_iter(void *data, u8 *mac, struct ieee80211_vif *vif)
1475 {
1476  struct ath9k_htc_priv *priv = (struct ath9k_htc_priv *)data;
1477  struct ath_common *common = ath9k_hw_common(priv->ah);
1478  struct ieee80211_bss_conf *bss_conf = &vif->bss_conf;
1479 
1480  if ((vif->type == NL80211_IFTYPE_STATION) && bss_conf->assoc) {
1481  common->curaid = bss_conf->aid;
1482  memcpy(common->curbssid, bss_conf->bssid, ETH_ALEN);
1483  }
1484 }
1485 
1486 static void ath9k_htc_choose_set_bssid(struct ath9k_htc_priv *priv)
1487 {
1488  if (priv->num_sta_assoc_vif == 1) {
1490  ath9k_htc_bss_iter, priv);
1491  ath9k_htc_set_bssid(priv);
1492  }
1493 }
1494 
1495 static void ath9k_htc_bss_info_changed(struct ieee80211_hw *hw,
1496  struct ieee80211_vif *vif,
1497  struct ieee80211_bss_conf *bss_conf,
1498  u32 changed)
1499 {
1500  struct ath9k_htc_priv *priv = hw->priv;
1501  struct ath_hw *ah = priv->ah;
1502  struct ath_common *common = ath9k_hw_common(ah);
1503 
1504  mutex_lock(&priv->mutex);
1505  ath9k_htc_ps_wakeup(priv);
1506 
1507  if (changed & BSS_CHANGED_ASSOC) {
1508  ath_dbg(common, CONFIG, "BSS Changed ASSOC %d\n",
1509  bss_conf->assoc);
1510 
1511  bss_conf->assoc ?
1512  priv->num_sta_assoc_vif++ : priv->num_sta_assoc_vif--;
1513 
1514  if (priv->ah->opmode == NL80211_IFTYPE_STATION) {
1515  ath9k_htc_choose_set_bssid(priv);
1516  if (bss_conf->assoc && (priv->num_sta_assoc_vif == 1))
1517  ath9k_htc_start_ani(priv);
1518  else if (priv->num_sta_assoc_vif == 0)
1519  ath9k_htc_stop_ani(priv);
1520  }
1521  }
1522 
1523  if (changed & BSS_CHANGED_IBSS) {
1524  if (priv->ah->opmode == NL80211_IFTYPE_ADHOC) {
1525  common->curaid = bss_conf->aid;
1526  memcpy(common->curbssid, bss_conf->bssid, ETH_ALEN);
1527  ath9k_htc_set_bssid(priv);
1528  }
1529  }
1530 
1531  if ((changed & BSS_CHANGED_BEACON_ENABLED) && bss_conf->enable_beacon) {
1532  ath_dbg(common, CONFIG, "Beacon enabled for BSS: %pM\n",
1533  bss_conf->bssid);
1534  ath9k_htc_set_tsfadjust(priv, vif);
1536  ath9k_htc_beacon_config(priv, vif);
1537  }
1538 
1539  if ((changed & BSS_CHANGED_BEACON_ENABLED) && !bss_conf->enable_beacon) {
1540  /*
1541  * Disable SWBA interrupt only if there are no
1542  * AP/IBSS interfaces.
1543  */
1544  if ((priv->num_ap_vif <= 1) || priv->num_ibss_vif) {
1545  ath_dbg(common, CONFIG,
1546  "Beacon disabled for BSS: %pM\n",
1547  bss_conf->bssid);
1549  ath9k_htc_beacon_config(priv, vif);
1550  }
1551  }
1552 
1553  if (changed & BSS_CHANGED_BEACON_INT) {
1554  /*
1555  * Reset the HW TSF for the first AP interface.
1556  */
1557  if ((priv->ah->opmode == NL80211_IFTYPE_AP) &&
1558  (priv->nvifs == 1) &&
1559  (priv->num_ap_vif == 1) &&
1560  (vif->type == NL80211_IFTYPE_AP)) {
1561  set_bit(OP_TSF_RESET, &priv->op_flags);
1562  }
1563  ath_dbg(common, CONFIG,
1564  "Beacon interval changed for BSS: %pM\n",
1565  bss_conf->bssid);
1566  ath9k_htc_beacon_config(priv, vif);
1567  }
1568 
1569  if (changed & BSS_CHANGED_ERP_SLOT) {
1570  if (bss_conf->use_short_slot)
1571  ah->slottime = 9;
1572  else
1573  ah->slottime = 20;
1574 
1576  }
1577 
1578  if (changed & BSS_CHANGED_HT)
1579  ath9k_htc_update_rate(priv, vif, bss_conf);
1580 
1581  ath9k_htc_ps_restore(priv);
1582  mutex_unlock(&priv->mutex);
1583 }
1584 
1585 static u64 ath9k_htc_get_tsf(struct ieee80211_hw *hw,
1586  struct ieee80211_vif *vif)
1587 {
1588  struct ath9k_htc_priv *priv = hw->priv;
1589  u64 tsf;
1590 
1591  mutex_lock(&priv->mutex);
1592  ath9k_htc_ps_wakeup(priv);
1593  tsf = ath9k_hw_gettsf64(priv->ah);
1594  ath9k_htc_ps_restore(priv);
1595  mutex_unlock(&priv->mutex);
1596 
1597  return tsf;
1598 }
1599 
1600 static void ath9k_htc_set_tsf(struct ieee80211_hw *hw,
1601  struct ieee80211_vif *vif, u64 tsf)
1602 {
1603  struct ath9k_htc_priv *priv = hw->priv;
1604 
1605  mutex_lock(&priv->mutex);
1606  ath9k_htc_ps_wakeup(priv);
1607  ath9k_hw_settsf64(priv->ah, tsf);
1608  ath9k_htc_ps_restore(priv);
1609  mutex_unlock(&priv->mutex);
1610 }
1611 
1612 static void ath9k_htc_reset_tsf(struct ieee80211_hw *hw,
1613  struct ieee80211_vif *vif)
1614 {
1615  struct ath9k_htc_priv *priv = hw->priv;
1616 
1617  mutex_lock(&priv->mutex);
1618  ath9k_htc_ps_wakeup(priv);
1619  ath9k_hw_reset_tsf(priv->ah);
1620  ath9k_htc_ps_restore(priv);
1621  mutex_unlock(&priv->mutex);
1622 }
1623 
1624 static int ath9k_htc_ampdu_action(struct ieee80211_hw *hw,
1625  struct ieee80211_vif *vif,
1626  enum ieee80211_ampdu_mlme_action action,
1627  struct ieee80211_sta *sta,
1628  u16 tid, u16 *ssn, u8 buf_size)
1629 {
1630  struct ath9k_htc_priv *priv = hw->priv;
1631  struct ath9k_htc_sta *ista;
1632  int ret = 0;
1633 
1634  mutex_lock(&priv->mutex);
1635  ath9k_htc_ps_wakeup(priv);
1636 
1637  switch (action) {
1639  break;
1641  break;
1643  ret = ath9k_htc_tx_aggr_oper(priv, vif, sta, action, tid);
1644  if (!ret)
1645  ieee80211_start_tx_ba_cb_irqsafe(vif, sta->addr, tid);
1646  break;
1648  ath9k_htc_tx_aggr_oper(priv, vif, sta, action, tid);
1649  ieee80211_stop_tx_ba_cb_irqsafe(vif, sta->addr, tid);
1650  break;
1652  ista = (struct ath9k_htc_sta *) sta->drv_priv;
1653  spin_lock_bh(&priv->tx.tx_lock);
1654  ista->tid_state[tid] = AGGR_OPERATIONAL;
1655  spin_unlock_bh(&priv->tx.tx_lock);
1656  break;
1657  default:
1658  ath_err(ath9k_hw_common(priv->ah), "Unknown AMPDU action\n");
1659  }
1660 
1661  ath9k_htc_ps_restore(priv);
1662  mutex_unlock(&priv->mutex);
1663 
1664  return ret;
1665 }
1666 
1667 static void ath9k_htc_sw_scan_start(struct ieee80211_hw *hw)
1668 {
1669  struct ath9k_htc_priv *priv = hw->priv;
1670 
1671  mutex_lock(&priv->mutex);
1672  spin_lock_bh(&priv->beacon_lock);
1673  set_bit(OP_SCANNING, &priv->op_flags);
1674  spin_unlock_bh(&priv->beacon_lock);
1675  cancel_work_sync(&priv->ps_work);
1676  ath9k_htc_stop_ani(priv);
1677  mutex_unlock(&priv->mutex);
1678 }
1679 
1680 static void ath9k_htc_sw_scan_complete(struct ieee80211_hw *hw)
1681 {
1682  struct ath9k_htc_priv *priv = hw->priv;
1683 
1684  mutex_lock(&priv->mutex);
1685  spin_lock_bh(&priv->beacon_lock);
1686  clear_bit(OP_SCANNING, &priv->op_flags);
1687  spin_unlock_bh(&priv->beacon_lock);
1688  ath9k_htc_ps_wakeup(priv);
1689  ath9k_htc_vif_reconfig(priv);
1690  ath9k_htc_ps_restore(priv);
1691  mutex_unlock(&priv->mutex);
1692 }
1693 
1694 static int ath9k_htc_set_rts_threshold(struct ieee80211_hw *hw, u32 value)
1695 {
1696  return 0;
1697 }
1698 
1699 static void ath9k_htc_set_coverage_class(struct ieee80211_hw *hw,
1701 {
1702  struct ath9k_htc_priv *priv = hw->priv;
1703 
1704  mutex_lock(&priv->mutex);
1705  ath9k_htc_ps_wakeup(priv);
1706  priv->ah->coverage_class = coverage_class;
1708  ath9k_htc_ps_restore(priv);
1709  mutex_unlock(&priv->mutex);
1710 }
1711 
1712 /*
1713  * Currently, this is used only for selecting the minimum rate
1714  * for management frames, rate selection for data frames remain
1715  * unaffected.
1716  */
1717 static int ath9k_htc_set_bitrate_mask(struct ieee80211_hw *hw,
1718  struct ieee80211_vif *vif,
1719  const struct cfg80211_bitrate_mask *mask)
1720 {
1721  struct ath9k_htc_priv *priv = hw->priv;
1722  struct ath_common *common = ath9k_hw_common(priv->ah);
1723  struct ath9k_htc_target_rate_mask tmask;
1724  struct ath9k_htc_vif *avp = (void *)vif->drv_priv;
1725  int ret = 0;
1726  u8 cmd_rsp;
1727 
1728  memset(&tmask, 0, sizeof(struct ath9k_htc_target_rate_mask));
1729 
1730  tmask.vif_index = avp->index;
1731  tmask.band = IEEE80211_BAND_2GHZ;
1732  tmask.mask = cpu_to_be32(mask->control[IEEE80211_BAND_2GHZ].legacy);
1733 
1735  if (ret) {
1736  ath_err(common,
1737  "Unable to set 2G rate mask for "
1738  "interface at idx: %d\n", avp->index);
1739  goto out;
1740  }
1741 
1742  tmask.band = IEEE80211_BAND_5GHZ;
1743  tmask.mask = cpu_to_be32(mask->control[IEEE80211_BAND_5GHZ].legacy);
1744 
1746  if (ret) {
1747  ath_err(common,
1748  "Unable to set 5G rate mask for "
1749  "interface at idx: %d\n", avp->index);
1750  goto out;
1751  }
1752 
1753  ath_dbg(common, CONFIG, "Set bitrate masks: 0x%x, 0x%x\n",
1754  mask->control[IEEE80211_BAND_2GHZ].legacy,
1755  mask->control[IEEE80211_BAND_5GHZ].legacy);
1756 out:
1757  return ret;
1758 }
1759 
1760 
1761 static int ath9k_htc_get_stats(struct ieee80211_hw *hw,
1763 {
1764  struct ath9k_htc_priv *priv = hw->priv;
1765  struct ath_hw *ah = priv->ah;
1766  struct ath9k_mib_stats *mib_stats = &ah->ah_mibStats;
1767 
1768  stats->dot11ACKFailureCount = mib_stats->ackrcv_bad;
1769  stats->dot11RTSFailureCount = mib_stats->rts_bad;
1770  stats->dot11FCSErrorCount = mib_stats->fcs_bad;
1771  stats->dot11RTSSuccessCount = mib_stats->rts_good;
1772 
1773  return 0;
1774 }
1775 
1777  .tx = ath9k_htc_tx,
1778  .start = ath9k_htc_start,
1779  .stop = ath9k_htc_stop,
1780  .add_interface = ath9k_htc_add_interface,
1781  .remove_interface = ath9k_htc_remove_interface,
1782  .config = ath9k_htc_config,
1783  .configure_filter = ath9k_htc_configure_filter,
1784  .sta_add = ath9k_htc_sta_add,
1785  .sta_remove = ath9k_htc_sta_remove,
1786  .conf_tx = ath9k_htc_conf_tx,
1787  .sta_rc_update = ath9k_htc_sta_rc_update,
1788  .bss_info_changed = ath9k_htc_bss_info_changed,
1789  .set_key = ath9k_htc_set_key,
1790  .get_tsf = ath9k_htc_get_tsf,
1791  .set_tsf = ath9k_htc_set_tsf,
1792  .reset_tsf = ath9k_htc_reset_tsf,
1793  .ampdu_action = ath9k_htc_ampdu_action,
1794  .sw_scan_start = ath9k_htc_sw_scan_start,
1795  .sw_scan_complete = ath9k_htc_sw_scan_complete,
1796  .set_rts_threshold = ath9k_htc_set_rts_threshold,
1797  .rfkill_poll = ath9k_htc_rfkill_poll_state,
1798  .set_coverage_class = ath9k_htc_set_coverage_class,
1799  .set_bitrate_mask = ath9k_htc_set_bitrate_mask,
1800  .get_stats = ath9k_htc_get_stats,
1801 };