aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/wireless/ath/ath9k
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/net/wireless/ath/ath9k')
-rw-r--r--drivers/net/wireless/ath/ath9k/ath9k.h3
-rw-r--r--drivers/net/wireless/ath/ath9k/eeprom.h7
-rw-r--r--drivers/net/wireless/ath/ath9k/gpio.c7
-rw-r--r--drivers/net/wireless/ath/ath9k/hif_usb.c1
-rw-r--r--drivers/net/wireless/ath/ath9k/htc_drv_gpio.c10
-rw-r--r--drivers/net/wireless/ath/ath9k/htc_drv_main.c3
-rw-r--r--drivers/net/wireless/ath/ath9k/hw.c11
-rw-r--r--drivers/net/wireless/ath/ath9k/main.c6
-rw-r--r--drivers/net/wireless/ath/ath9k/rc.c6
-rw-r--r--drivers/net/wireless/ath/ath9k/recv.c23
-rw-r--r--drivers/net/wireless/ath/ath9k/xmit.c19
11 files changed, 48 insertions, 48 deletions
diff --git a/drivers/net/wireless/ath/ath9k/ath9k.h b/drivers/net/wireless/ath/ath9k/ath9k.h
index 94d887b65e69..1e8614783181 100644
--- a/drivers/net/wireless/ath/ath9k/ath9k.h
+++ b/drivers/net/wireless/ath/ath9k/ath9k.h
@@ -340,7 +340,8 @@ void ath_tx_aggr_stop(struct ath_softc *sc, struct ieee80211_sta *sta, u16 tid);
340void ath_tx_aggr_resume(struct ath_softc *sc, struct ieee80211_sta *sta, u16 tid); 340void ath_tx_aggr_resume(struct ath_softc *sc, struct ieee80211_sta *sta, u16 tid);
341 341
342void ath_tx_aggr_wakeup(struct ath_softc *sc, struct ath_node *an); 342void ath_tx_aggr_wakeup(struct ath_softc *sc, struct ath_node *an);
343bool ath_tx_aggr_sleep(struct ath_softc *sc, struct ath_node *an); 343void ath_tx_aggr_sleep(struct ieee80211_sta *sta, struct ath_softc *sc,
344 struct ath_node *an);
344 345
345/********/ 346/********/
346/* VIFs */ 347/* VIFs */
diff --git a/drivers/net/wireless/ath/ath9k/eeprom.h b/drivers/net/wireless/ath/ath9k/eeprom.h
index a3c7d0c247a3..5d92f96980e6 100644
--- a/drivers/net/wireless/ath/ath9k/eeprom.h
+++ b/drivers/net/wireless/ath/ath9k/eeprom.h
@@ -104,16 +104,11 @@
104#define OLC_FOR_AR9287_10_LATER (AR_SREV_9287_11_OR_LATER(ah) && \ 104#define OLC_FOR_AR9287_10_LATER (AR_SREV_9287_11_OR_LATER(ah) && \
105 ah->eep_ops->get_eeprom(ah, EEP_OL_PWRCTRL)) 105 ah->eep_ops->get_eeprom(ah, EEP_OL_PWRCTRL))
106 106
107#define AR_EEPROM_RFSILENT_GPIO_SEL 0x001c
108#define AR_EEPROM_RFSILENT_GPIO_SEL_S 2
109#define AR_EEPROM_RFSILENT_POLARITY 0x0002
110#define AR_EEPROM_RFSILENT_POLARITY_S 1
111
112#define EEP_RFSILENT_ENABLED 0x0001 107#define EEP_RFSILENT_ENABLED 0x0001
113#define EEP_RFSILENT_ENABLED_S 0 108#define EEP_RFSILENT_ENABLED_S 0
114#define EEP_RFSILENT_POLARITY 0x0002 109#define EEP_RFSILENT_POLARITY 0x0002
115#define EEP_RFSILENT_POLARITY_S 1 110#define EEP_RFSILENT_POLARITY_S 1
116#define EEP_RFSILENT_GPIO_SEL 0x001c 111#define EEP_RFSILENT_GPIO_SEL (AR_SREV_9480(ah) ? 0x00fc : 0x001c)
117#define EEP_RFSILENT_GPIO_SEL_S 2 112#define EEP_RFSILENT_GPIO_SEL_S 2
118 113
119#define AR5416_OPFLAGS_11A 0x01 114#define AR5416_OPFLAGS_11A 0x01
diff --git a/drivers/net/wireless/ath/ath9k/gpio.c b/drivers/net/wireless/ath/ath9k/gpio.c
index afbf5400a52a..fd0f84ebdb51 100644
--- a/drivers/net/wireless/ath/ath9k/gpio.c
+++ b/drivers/net/wireless/ath/ath9k/gpio.c
@@ -84,9 +84,14 @@ void ath_init_leds(struct ath_softc *sc)
84static bool ath_is_rfkill_set(struct ath_softc *sc) 84static bool ath_is_rfkill_set(struct ath_softc *sc)
85{ 85{
86 struct ath_hw *ah = sc->sc_ah; 86 struct ath_hw *ah = sc->sc_ah;
87 bool is_blocked;
87 88
88 return ath9k_hw_gpio_get(ah, ah->rfkill_gpio) == 89 ath9k_ps_wakeup(sc);
90 is_blocked = ath9k_hw_gpio_get(ah, ah->rfkill_gpio) ==
89 ah->rfkill_polarity; 91 ah->rfkill_polarity;
92 ath9k_ps_restore(sc);
93
94 return is_blocked;
90} 95}
91 96
92void ath9k_rfkill_poll_state(struct ieee80211_hw *hw) 97void ath9k_rfkill_poll_state(struct ieee80211_hw *hw)
diff --git a/drivers/net/wireless/ath/ath9k/hif_usb.c b/drivers/net/wireless/ath/ath9k/hif_usb.c
index d3f4a59cd456..77c8ded8de57 100644
--- a/drivers/net/wireless/ath/ath9k/hif_usb.c
+++ b/drivers/net/wireless/ath/ath9k/hif_usb.c
@@ -38,6 +38,7 @@ static struct usb_device_id ath9k_hif_usb_ids[] = {
38 { USB_DEVICE(0x04CA, 0x4605) }, /* Liteon */ 38 { USB_DEVICE(0x04CA, 0x4605) }, /* Liteon */
39 { USB_DEVICE(0x040D, 0x3801) }, /* VIA */ 39 { USB_DEVICE(0x040D, 0x3801) }, /* VIA */
40 { USB_DEVICE(0x0cf3, 0xb003) }, /* Ubiquiti WifiStation Ext */ 40 { USB_DEVICE(0x0cf3, 0xb003) }, /* Ubiquiti WifiStation Ext */
41 { USB_DEVICE(0x057c, 0x8403) }, /* AVM FRITZ!WLAN 11N v2 USB */
41 42
42 { USB_DEVICE(0x0cf3, 0x7015), 43 { USB_DEVICE(0x0cf3, 0x7015),
43 .driver_info = AR9287_USB }, /* Atheros */ 44 .driver_info = AR9287_USB }, /* Atheros */
diff --git a/drivers/net/wireless/ath/ath9k/htc_drv_gpio.c b/drivers/net/wireless/ath/ath9k/htc_drv_gpio.c
index db2352e5cc0d..e3a02eb8e0cc 100644
--- a/drivers/net/wireless/ath/ath9k/htc_drv_gpio.c
+++ b/drivers/net/wireless/ath/ath9k/htc_drv_gpio.c
@@ -228,8 +228,14 @@ void ath9k_init_leds(struct ath9k_htc_priv *priv)
228 228
229static bool ath_is_rfkill_set(struct ath9k_htc_priv *priv) 229static bool ath_is_rfkill_set(struct ath9k_htc_priv *priv)
230{ 230{
231 return ath9k_hw_gpio_get(priv->ah, priv->ah->rfkill_gpio) == 231 bool is_blocked;
232 priv->ah->rfkill_polarity; 232
233 ath9k_htc_ps_wakeup(priv);
234 is_blocked = ath9k_hw_gpio_get(priv->ah, priv->ah->rfkill_gpio) ==
235 priv->ah->rfkill_polarity;
236 ath9k_htc_ps_restore(priv);
237
238 return is_blocked;
233} 239}
234 240
235void ath9k_htc_rfkill_poll_state(struct ieee80211_hw *hw) 241void ath9k_htc_rfkill_poll_state(struct ieee80211_hw *hw)
diff --git a/drivers/net/wireless/ath/ath9k/htc_drv_main.c b/drivers/net/wireless/ath/ath9k/htc_drv_main.c
index 17dbbd9d2f53..0b9a0e8a4958 100644
--- a/drivers/net/wireless/ath/ath9k/htc_drv_main.c
+++ b/drivers/net/wireless/ath/ath9k/htc_drv_main.c
@@ -1352,7 +1352,8 @@ static int ath9k_htc_sta_remove(struct ieee80211_hw *hw,
1352 return ret; 1352 return ret;
1353} 1353}
1354 1354
1355static int ath9k_htc_conf_tx(struct ieee80211_hw *hw, u16 queue, 1355static int ath9k_htc_conf_tx(struct ieee80211_hw *hw,
1356 struct ieee80211_vif *vif, u16 queue,
1356 const struct ieee80211_tx_queue_params *params) 1357 const struct ieee80211_tx_queue_params *params)
1357{ 1358{
1358 struct ath9k_htc_priv *priv = hw->priv; 1359 struct ath9k_htc_priv *priv = hw->priv;
diff --git a/drivers/net/wireless/ath/ath9k/hw.c b/drivers/net/wireless/ath/ath9k/hw.c
index f2de7ee047ce..42ebe8fb053a 100644
--- a/drivers/net/wireless/ath/ath9k/hw.c
+++ b/drivers/net/wireless/ath/ath9k/hw.c
@@ -284,7 +284,12 @@ static void ath9k_hw_read_revisions(struct ath_hw *ah)
284 ah->hw_version.macVersion = 284 ah->hw_version.macVersion =
285 (val & AR_SREV_VERSION2) >> AR_SREV_TYPE2_S; 285 (val & AR_SREV_VERSION2) >> AR_SREV_TYPE2_S;
286 ah->hw_version.macRev = MS(val, AR_SREV_REVISION2); 286 ah->hw_version.macRev = MS(val, AR_SREV_REVISION2);
287 ah->is_pciexpress = (val & AR_SREV_TYPE2_HOST_MODE) ? 0 : 1; 287
288 if (AR_SREV_9480(ah))
289 ah->is_pciexpress = true;
290 else
291 ah->is_pciexpress = (val &
292 AR_SREV_TYPE2_HOST_MODE) ? 0 : 1;
288 } else { 293 } else {
289 if (!AR_SREV_9100(ah)) 294 if (!AR_SREV_9100(ah))
290 ah->hw_version.macVersion = MS(val, AR_SREV_VERSION); 295 ah->hw_version.macVersion = MS(val, AR_SREV_VERSION);
@@ -2153,6 +2158,10 @@ int ath9k_hw_fill_cap_info(struct ath_hw *ah)
2153 pCap->num_gpio_pins = AR9271_NUM_GPIO; 2158 pCap->num_gpio_pins = AR9271_NUM_GPIO;
2154 else if (AR_DEVID_7010(ah)) 2159 else if (AR_DEVID_7010(ah))
2155 pCap->num_gpio_pins = AR7010_NUM_GPIO; 2160 pCap->num_gpio_pins = AR7010_NUM_GPIO;
2161 else if (AR_SREV_9300_20_OR_LATER(ah))
2162 pCap->num_gpio_pins = AR9300_NUM_GPIO;
2163 else if (AR_SREV_9287_11_OR_LATER(ah))
2164 pCap->num_gpio_pins = AR9287_NUM_GPIO;
2156 else if (AR_SREV_9285_12_OR_LATER(ah)) 2165 else if (AR_SREV_9285_12_OR_LATER(ah))
2157 pCap->num_gpio_pins = AR9285_NUM_GPIO; 2166 pCap->num_gpio_pins = AR9285_NUM_GPIO;
2158 else if (AR_SREV_9280_20_OR_LATER(ah)) 2167 else if (AR_SREV_9280_20_OR_LATER(ah))
diff --git a/drivers/net/wireless/ath/ath9k/main.c b/drivers/net/wireless/ath/ath9k/main.c
index edaa7843bf4c..988318665758 100644
--- a/drivers/net/wireless/ath/ath9k/main.c
+++ b/drivers/net/wireless/ath/ath9k/main.c
@@ -1833,8 +1833,7 @@ static void ath9k_sta_notify(struct ieee80211_hw *hw,
1833 switch (cmd) { 1833 switch (cmd) {
1834 case STA_NOTIFY_SLEEP: 1834 case STA_NOTIFY_SLEEP:
1835 an->sleeping = true; 1835 an->sleeping = true;
1836 if (ath_tx_aggr_sleep(sc, an)) 1836 ath_tx_aggr_sleep(sta, sc, an);
1837 ieee80211_sta_set_tim(sta);
1838 break; 1837 break;
1839 case STA_NOTIFY_AWAKE: 1838 case STA_NOTIFY_AWAKE:
1840 an->sleeping = false; 1839 an->sleeping = false;
@@ -1843,7 +1842,8 @@ static void ath9k_sta_notify(struct ieee80211_hw *hw,
1843 } 1842 }
1844} 1843}
1845 1844
1846static int ath9k_conf_tx(struct ieee80211_hw *hw, u16 queue, 1845static int ath9k_conf_tx(struct ieee80211_hw *hw,
1846 struct ieee80211_vif *vif, u16 queue,
1847 const struct ieee80211_tx_queue_params *params) 1847 const struct ieee80211_tx_queue_params *params)
1848{ 1848{
1849 struct ath_softc *sc = hw->priv; 1849 struct ath_softc *sc = hw->priv;
diff --git a/drivers/net/wireless/ath/ath9k/rc.c b/drivers/net/wireless/ath/ath9k/rc.c
index 4f1301881137..8448281dd069 100644
--- a/drivers/net/wireless/ath/ath9k/rc.c
+++ b/drivers/net/wireless/ath/ath9k/rc.c
@@ -1362,12 +1362,6 @@ static void ath_tx_status(void *priv, struct ieee80211_supported_band *sband,
1362 if (tx_info->flags & IEEE80211_TX_STAT_TX_FILTERED) 1362 if (tx_info->flags & IEEE80211_TX_STAT_TX_FILTERED)
1363 return; 1363 return;
1364 1364
1365 if (!(tx_info->flags & IEEE80211_TX_STAT_AMPDU)) {
1366 tx_info->status.ampdu_ack_len =
1367 (tx_info->flags & IEEE80211_TX_STAT_ACK ? 1 : 0);
1368 tx_info->status.ampdu_len = 1;
1369 }
1370
1371 if (!(tx_info->flags & IEEE80211_TX_STAT_ACK)) 1365 if (!(tx_info->flags & IEEE80211_TX_STAT_ACK))
1372 tx_status = 1; 1366 tx_status = 1;
1373 1367
diff --git a/drivers/net/wireless/ath/ath9k/recv.c b/drivers/net/wireless/ath/ath9k/recv.c
index 49843500fe7c..f658ec60b510 100644
--- a/drivers/net/wireless/ath/ath9k/recv.c
+++ b/drivers/net/wireless/ath/ath9k/recv.c
@@ -586,22 +586,11 @@ static bool ath_beacon_dtim_pending_cab(struct sk_buff *skb)
586 586
587static void ath_rx_ps_beacon(struct ath_softc *sc, struct sk_buff *skb) 587static void ath_rx_ps_beacon(struct ath_softc *sc, struct sk_buff *skb)
588{ 588{
589 struct ieee80211_mgmt *mgmt;
590 struct ath_common *common = ath9k_hw_common(sc->sc_ah); 589 struct ath_common *common = ath9k_hw_common(sc->sc_ah);
591 590
592 if (skb->len < 24 + 8 + 2 + 2) 591 if (skb->len < 24 + 8 + 2 + 2)
593 return; 592 return;
594 593
595 mgmt = (struct ieee80211_mgmt *)skb->data;
596 if (memcmp(common->curbssid, mgmt->bssid, ETH_ALEN) != 0) {
597 /* TODO: This doesn't work well if you have stations
598 * associated to two different APs because curbssid
599 * is just the last AP that any of the stations associated
600 * with.
601 */
602 return; /* not from our current AP */
603 }
604
605 sc->ps_flags &= ~PS_WAIT_FOR_BEACON; 594 sc->ps_flags &= ~PS_WAIT_FOR_BEACON;
606 595
607 if (sc->ps_flags & PS_BEACON_SYNC) { 596 if (sc->ps_flags & PS_BEACON_SYNC) {
@@ -637,7 +626,7 @@ static void ath_rx_ps_beacon(struct ath_softc *sc, struct sk_buff *skb)
637 } 626 }
638} 627}
639 628
640static void ath_rx_ps(struct ath_softc *sc, struct sk_buff *skb) 629static void ath_rx_ps(struct ath_softc *sc, struct sk_buff *skb, bool mybeacon)
641{ 630{
642 struct ieee80211_hdr *hdr; 631 struct ieee80211_hdr *hdr;
643 struct ath_common *common = ath9k_hw_common(sc->sc_ah); 632 struct ath_common *common = ath9k_hw_common(sc->sc_ah);
@@ -646,7 +635,7 @@ static void ath_rx_ps(struct ath_softc *sc, struct sk_buff *skb)
646 635
647 /* Process Beacon and CAB receive in PS state */ 636 /* Process Beacon and CAB receive in PS state */
648 if (((sc->ps_flags & PS_WAIT_FOR_BEACON) || ath9k_check_auto_sleep(sc)) 637 if (((sc->ps_flags & PS_WAIT_FOR_BEACON) || ath9k_check_auto_sleep(sc))
649 && ieee80211_is_beacon(hdr->frame_control)) 638 && mybeacon)
650 ath_rx_ps_beacon(sc, skb); 639 ath_rx_ps_beacon(sc, skb);
651 else if ((sc->ps_flags & PS_WAIT_FOR_CAB) && 640 else if ((sc->ps_flags & PS_WAIT_FOR_CAB) &&
652 (ieee80211_is_data(hdr->frame_control) || 641 (ieee80211_is_data(hdr->frame_control) ||
@@ -1952,10 +1941,10 @@ int ath_rx_tasklet(struct ath_softc *sc, int flush, bool hp)
1952 spin_lock_irqsave(&sc->sc_pm_lock, flags); 1941 spin_lock_irqsave(&sc->sc_pm_lock, flags);
1953 1942
1954 if ((sc->ps_flags & (PS_WAIT_FOR_BEACON | 1943 if ((sc->ps_flags & (PS_WAIT_FOR_BEACON |
1955 PS_WAIT_FOR_CAB | 1944 PS_WAIT_FOR_CAB |
1956 PS_WAIT_FOR_PSPOLL_DATA)) || 1945 PS_WAIT_FOR_PSPOLL_DATA)) ||
1957 ath9k_check_auto_sleep(sc)) 1946 ath9k_check_auto_sleep(sc))
1958 ath_rx_ps(sc, skb); 1947 ath_rx_ps(sc, skb, rs.is_mybeacon);
1959 spin_unlock_irqrestore(&sc->sc_pm_lock, flags); 1948 spin_unlock_irqrestore(&sc->sc_pm_lock, flags);
1960 1949
1961 if ((ah->caps.hw_caps & ATH9K_HW_CAP_ANT_DIV_COMB) && sc->ant_rx == 3) 1950 if ((ah->caps.hw_caps & ATH9K_HW_CAP_ANT_DIV_COMB) && sc->ant_rx == 3)
diff --git a/drivers/net/wireless/ath/ath9k/xmit.c b/drivers/net/wireless/ath/ath9k/xmit.c
index fa3dcfdf7174..c2bfc57958d8 100644
--- a/drivers/net/wireless/ath/ath9k/xmit.c
+++ b/drivers/net/wireless/ath/ath9k/xmit.c
@@ -542,7 +542,7 @@ static void ath_tx_complete_aggr(struct ath_softc *sc, struct ath_txq *txq,
542 /* prepend un-acked frames to the beginning of the pending frame queue */ 542 /* prepend un-acked frames to the beginning of the pending frame queue */
543 if (!skb_queue_empty(&bf_pending)) { 543 if (!skb_queue_empty(&bf_pending)) {
544 if (an->sleeping) 544 if (an->sleeping)
545 ieee80211_sta_set_tim(sta); 545 ieee80211_sta_set_buffered(sta, tid->tidno, true);
546 546
547 spin_lock_bh(&txq->axq_lock); 547 spin_lock_bh(&txq->axq_lock);
548 if (clear_filter) 548 if (clear_filter)
@@ -1153,12 +1153,13 @@ void ath_tx_aggr_stop(struct ath_softc *sc, struct ieee80211_sta *sta, u16 tid)
1153 ath_tx_flush_tid(sc, txtid); 1153 ath_tx_flush_tid(sc, txtid);
1154} 1154}
1155 1155
1156bool ath_tx_aggr_sleep(struct ath_softc *sc, struct ath_node *an) 1156void ath_tx_aggr_sleep(struct ieee80211_sta *sta, struct ath_softc *sc,
1157 struct ath_node *an)
1157{ 1158{
1158 struct ath_atx_tid *tid; 1159 struct ath_atx_tid *tid;
1159 struct ath_atx_ac *ac; 1160 struct ath_atx_ac *ac;
1160 struct ath_txq *txq; 1161 struct ath_txq *txq;
1161 bool buffered = false; 1162 bool buffered;
1162 int tidno; 1163 int tidno;
1163 1164
1164 for (tidno = 0, tid = &an->tid[tidno]; 1165 for (tidno = 0, tid = &an->tid[tidno];
@@ -1172,8 +1173,7 @@ bool ath_tx_aggr_sleep(struct ath_softc *sc, struct ath_node *an)
1172 1173
1173 spin_lock_bh(&txq->axq_lock); 1174 spin_lock_bh(&txq->axq_lock);
1174 1175
1175 if (!skb_queue_empty(&tid->buf_q)) 1176 buffered = !skb_queue_empty(&tid->buf_q);
1176 buffered = true;
1177 1177
1178 tid->sched = false; 1178 tid->sched = false;
1179 list_del(&tid->list); 1179 list_del(&tid->list);
@@ -1184,9 +1184,9 @@ bool ath_tx_aggr_sleep(struct ath_softc *sc, struct ath_node *an)
1184 } 1184 }
1185 1185
1186 spin_unlock_bh(&txq->axq_lock); 1186 spin_unlock_bh(&txq->axq_lock);
1187 }
1188 1187
1189 return buffered; 1188 ieee80211_sta_set_buffered(sta, tidno, buffered);
1189 }
1190} 1190}
1191 1191
1192void ath_tx_aggr_wakeup(struct ath_softc *sc, struct ath_node *an) 1192void ath_tx_aggr_wakeup(struct ath_softc *sc, struct ath_node *an)
@@ -2043,10 +2043,9 @@ static void ath_tx_rc_status(struct ath_softc *sc, struct ath_buf *bf,
2043 tx_info->flags |= IEEE80211_TX_STAT_AMPDU; 2043 tx_info->flags |= IEEE80211_TX_STAT_AMPDU;
2044 2044
2045 BUG_ON(nbad > nframes); 2045 BUG_ON(nbad > nframes);
2046
2047 tx_info->status.ampdu_len = nframes;
2048 tx_info->status.ampdu_ack_len = nframes - nbad;
2049 } 2046 }
2047 tx_info->status.ampdu_len = nframes;
2048 tx_info->status.ampdu_ack_len = nframes - nbad;
2050 2049
2051 if ((ts->ts_status & ATH9K_TXERR_FILT) == 0 && 2050 if ((ts->ts_status & ATH9K_TXERR_FILT) == 0 &&
2052 (tx_info->flags & IEEE80211_TX_CTL_NO_ACK) == 0) { 2051 (tx_info->flags & IEEE80211_TX_CTL_NO_ACK) == 0) {