diff options
Diffstat (limited to 'drivers/net/wireless/ath/ath9k')
| -rw-r--r-- | drivers/net/wireless/ath/ath9k/ath9k.h | 1 | ||||
| -rw-r--r-- | drivers/net/wireless/ath/ath9k/htc_drv_main.c | 5 | ||||
| -rw-r--r-- | drivers/net/wireless/ath/ath9k/hw.c | 16 | ||||
| -rw-r--r-- | drivers/net/wireless/ath/ath9k/main.c | 27 | ||||
| -rw-r--r-- | drivers/net/wireless/ath/ath9k/recv.c | 7 | ||||
| -rw-r--r-- | drivers/net/wireless/ath/ath9k/xmit.c | 31 |
6 files changed, 48 insertions, 39 deletions
diff --git a/drivers/net/wireless/ath/ath9k/ath9k.h b/drivers/net/wireless/ath/ath9k/ath9k.h index a277cf6f339d..4866550ddd96 100644 --- a/drivers/net/wireless/ath/ath9k/ath9k.h +++ b/drivers/net/wireless/ath/ath9k/ath9k.h | |||
| @@ -214,6 +214,7 @@ struct ath_frame_info { | |||
| 214 | enum ath9k_key_type keytype; | 214 | enum ath9k_key_type keytype; |
| 215 | u8 keyix; | 215 | u8 keyix; |
| 216 | u8 retries; | 216 | u8 retries; |
| 217 | u8 rtscts_rate; | ||
| 217 | }; | 218 | }; |
| 218 | 219 | ||
| 219 | struct ath_buf_state { | 220 | struct ath_buf_state { |
diff --git a/drivers/net/wireless/ath/ath9k/htc_drv_main.c b/drivers/net/wireless/ath/ath9k/htc_drv_main.c index 2b8f61c210e1..abbd6effd60d 100644 --- a/drivers/net/wireless/ath/ath9k/htc_drv_main.c +++ b/drivers/net/wireless/ath/ath9k/htc_drv_main.c | |||
| @@ -1496,6 +1496,7 @@ static void ath9k_htc_bss_info_changed(struct ieee80211_hw *hw, | |||
| 1496 | priv->num_sta_assoc_vif++ : priv->num_sta_assoc_vif--; | 1496 | priv->num_sta_assoc_vif++ : priv->num_sta_assoc_vif--; |
| 1497 | 1497 | ||
| 1498 | if (priv->ah->opmode == NL80211_IFTYPE_STATION) { | 1498 | if (priv->ah->opmode == NL80211_IFTYPE_STATION) { |
| 1499 | ath9k_htc_choose_set_bssid(priv); | ||
| 1499 | if (bss_conf->assoc && (priv->num_sta_assoc_vif == 1)) | 1500 | if (bss_conf->assoc && (priv->num_sta_assoc_vif == 1)) |
| 1500 | ath9k_htc_start_ani(priv); | 1501 | ath9k_htc_start_ani(priv); |
| 1501 | else if (priv->num_sta_assoc_vif == 0) | 1502 | else if (priv->num_sta_assoc_vif == 0) |
| @@ -1503,13 +1504,11 @@ static void ath9k_htc_bss_info_changed(struct ieee80211_hw *hw, | |||
| 1503 | } | 1504 | } |
| 1504 | } | 1505 | } |
| 1505 | 1506 | ||
| 1506 | if (changed & BSS_CHANGED_BSSID) { | 1507 | if (changed & BSS_CHANGED_IBSS) { |
| 1507 | if (priv->ah->opmode == NL80211_IFTYPE_ADHOC) { | 1508 | if (priv->ah->opmode == NL80211_IFTYPE_ADHOC) { |
| 1508 | common->curaid = bss_conf->aid; | 1509 | common->curaid = bss_conf->aid; |
| 1509 | memcpy(common->curbssid, bss_conf->bssid, ETH_ALEN); | 1510 | memcpy(common->curbssid, bss_conf->bssid, ETH_ALEN); |
| 1510 | ath9k_htc_set_bssid(priv); | 1511 | ath9k_htc_set_bssid(priv); |
| 1511 | } else if (priv->ah->opmode == NL80211_IFTYPE_STATION) { | ||
| 1512 | ath9k_htc_choose_set_bssid(priv); | ||
| 1513 | } | 1512 | } |
| 1514 | } | 1513 | } |
| 1515 | 1514 | ||
diff --git a/drivers/net/wireless/ath/ath9k/hw.c b/drivers/net/wireless/ath/ath9k/hw.c index 7db1890448f2..995ca8e1302e 100644 --- a/drivers/net/wireless/ath/ath9k/hw.c +++ b/drivers/net/wireless/ath/ath9k/hw.c | |||
| @@ -622,7 +622,7 @@ static int __ath9k_hw_init(struct ath_hw *ah) | |||
| 622 | 622 | ||
| 623 | if (NR_CPUS > 1 && ah->config.serialize_regmode == SER_REG_MODE_AUTO) { | 623 | if (NR_CPUS > 1 && ah->config.serialize_regmode == SER_REG_MODE_AUTO) { |
| 624 | if (ah->hw_version.macVersion == AR_SREV_VERSION_5416_PCI || | 624 | if (ah->hw_version.macVersion == AR_SREV_VERSION_5416_PCI || |
| 625 | ((AR_SREV_9160(ah) || AR_SREV_9280(ah)) && | 625 | ((AR_SREV_9160(ah) || AR_SREV_9280(ah) || AR_SREV_9287(ah)) && |
| 626 | !ah->is_pciexpress)) { | 626 | !ah->is_pciexpress)) { |
| 627 | ah->config.serialize_regmode = | 627 | ah->config.serialize_regmode = |
| 628 | SER_REG_MODE_ON; | 628 | SER_REG_MODE_ON; |
| @@ -784,13 +784,25 @@ static void ath9k_hw_init_qos(struct ath_hw *ah) | |||
| 784 | 784 | ||
| 785 | u32 ar9003_get_pll_sqsum_dvc(struct ath_hw *ah) | 785 | u32 ar9003_get_pll_sqsum_dvc(struct ath_hw *ah) |
| 786 | { | 786 | { |
| 787 | struct ath_common *common = ath9k_hw_common(ah); | ||
| 788 | int i = 0; | ||
| 789 | |||
| 787 | REG_CLR_BIT(ah, PLL3, PLL3_DO_MEAS_MASK); | 790 | REG_CLR_BIT(ah, PLL3, PLL3_DO_MEAS_MASK); |
| 788 | udelay(100); | 791 | udelay(100); |
| 789 | REG_SET_BIT(ah, PLL3, PLL3_DO_MEAS_MASK); | 792 | REG_SET_BIT(ah, PLL3, PLL3_DO_MEAS_MASK); |
| 790 | 793 | ||
| 791 | while ((REG_READ(ah, PLL4) & PLL4_MEAS_DONE) == 0) | 794 | while ((REG_READ(ah, PLL4) & PLL4_MEAS_DONE) == 0) { |
| 795 | |||
| 792 | udelay(100); | 796 | udelay(100); |
| 793 | 797 | ||
| 798 | if (WARN_ON_ONCE(i >= 100)) { | ||
| 799 | ath_err(common, "PLL4 meaurement not done\n"); | ||
| 800 | break; | ||
| 801 | } | ||
| 802 | |||
| 803 | i++; | ||
| 804 | } | ||
| 805 | |||
| 794 | return (REG_READ(ah, PLL3) & SQSUM_DVC_MASK) >> 3; | 806 | return (REG_READ(ah, PLL3) & SQSUM_DVC_MASK) >> 3; |
| 795 | } | 807 | } |
| 796 | EXPORT_SYMBOL(ar9003_get_pll_sqsum_dvc); | 808 | EXPORT_SYMBOL(ar9003_get_pll_sqsum_dvc); |
diff --git a/drivers/net/wireless/ath/ath9k/main.c b/drivers/net/wireless/ath/ath9k/main.c index 4de4473776ac..dac1a2709e3c 100644 --- a/drivers/net/wireless/ath/ath9k/main.c +++ b/drivers/net/wireless/ath/ath9k/main.c | |||
| @@ -971,6 +971,15 @@ void ath_hw_pll_work(struct work_struct *work) | |||
| 971 | hw_pll_work.work); | 971 | hw_pll_work.work); |
| 972 | u32 pll_sqsum; | 972 | u32 pll_sqsum; |
| 973 | 973 | ||
| 974 | /* | ||
| 975 | * ensure that the PLL WAR is executed only | ||
| 976 | * after the STA is associated (or) if the | ||
| 977 | * beaconing had started in interfaces that | ||
| 978 | * uses beacons. | ||
| 979 | */ | ||
| 980 | if (!(sc->sc_flags & SC_OP_BEACONS)) | ||
| 981 | return; | ||
| 982 | |||
| 974 | if (AR_SREV_9485(sc->sc_ah)) { | 983 | if (AR_SREV_9485(sc->sc_ah)) { |
| 975 | 984 | ||
| 976 | ath9k_ps_wakeup(sc); | 985 | ath9k_ps_wakeup(sc); |
| @@ -1443,15 +1452,6 @@ static int ath9k_add_interface(struct ieee80211_hw *hw, | |||
| 1443 | } | 1452 | } |
| 1444 | } | 1453 | } |
| 1445 | 1454 | ||
| 1446 | if ((ah->opmode == NL80211_IFTYPE_ADHOC) || | ||
| 1447 | ((vif->type == NL80211_IFTYPE_ADHOC) && | ||
| 1448 | sc->nvifs > 0)) { | ||
| 1449 | ath_err(common, "Cannot create ADHOC interface when other" | ||
| 1450 | " interfaces already exist.\n"); | ||
| 1451 | ret = -EINVAL; | ||
| 1452 | goto out; | ||
| 1453 | } | ||
| 1454 | |||
| 1455 | ath_dbg(common, CONFIG, "Attach a VIF of type: %d\n", vif->type); | 1455 | ath_dbg(common, CONFIG, "Attach a VIF of type: %d\n", vif->type); |
| 1456 | 1456 | ||
| 1457 | sc->nvifs++; | 1457 | sc->nvifs++; |
| @@ -1476,15 +1476,6 @@ static int ath9k_change_interface(struct ieee80211_hw *hw, | |||
| 1476 | mutex_lock(&sc->mutex); | 1476 | mutex_lock(&sc->mutex); |
| 1477 | ath9k_ps_wakeup(sc); | 1477 | ath9k_ps_wakeup(sc); |
| 1478 | 1478 | ||
| 1479 | /* See if new interface type is valid. */ | ||
| 1480 | if ((new_type == NL80211_IFTYPE_ADHOC) && | ||
| 1481 | (sc->nvifs > 1)) { | ||
| 1482 | ath_err(common, "When using ADHOC, it must be the only" | ||
| 1483 | " interface.\n"); | ||
| 1484 | ret = -EINVAL; | ||
| 1485 | goto out; | ||
| 1486 | } | ||
| 1487 | |||
| 1488 | if (ath9k_uses_beacons(new_type) && | 1479 | if (ath9k_uses_beacons(new_type) && |
| 1489 | !ath9k_uses_beacons(vif->type)) { | 1480 | !ath9k_uses_beacons(vif->type)) { |
| 1490 | if (sc->nbcnvifs >= ATH_BCBUF) { | 1481 | if (sc->nbcnvifs >= ATH_BCBUF) { |
diff --git a/drivers/net/wireless/ath/ath9k/recv.c b/drivers/net/wireless/ath/ath9k/recv.c index e1fcc68124dc..0735aeb3b26c 100644 --- a/drivers/net/wireless/ath/ath9k/recv.c +++ b/drivers/net/wireless/ath/ath9k/recv.c | |||
| @@ -695,9 +695,9 @@ static bool ath_edma_get_buffers(struct ath_softc *sc, | |||
| 695 | __skb_unlink(skb, &rx_edma->rx_fifo); | 695 | __skb_unlink(skb, &rx_edma->rx_fifo); |
| 696 | list_add_tail(&bf->list, &sc->rx.rxbuf); | 696 | list_add_tail(&bf->list, &sc->rx.rxbuf); |
| 697 | ath_rx_edma_buf_link(sc, qtype); | 697 | ath_rx_edma_buf_link(sc, qtype); |
| 698 | } else { | ||
| 699 | bf = NULL; | ||
| 700 | } | 698 | } |
| 699 | |||
| 700 | bf = NULL; | ||
| 701 | } | 701 | } |
| 702 | 702 | ||
| 703 | *dest = bf; | 703 | *dest = bf; |
| @@ -822,7 +822,8 @@ static bool ath9k_rx_accept(struct ath_common *common, | |||
| 822 | * descriptor does contain a valid key index. This has been observed | 822 | * descriptor does contain a valid key index. This has been observed |
| 823 | * mostly with CCMP encryption. | 823 | * mostly with CCMP encryption. |
| 824 | */ | 824 | */ |
| 825 | if (rx_stats->rs_keyix == ATH9K_RXKEYIX_INVALID) | 825 | if (rx_stats->rs_keyix == ATH9K_RXKEYIX_INVALID || |
| 826 | !test_bit(rx_stats->rs_keyix, common->ccmp_keymap)) | ||
| 826 | rx_stats->rs_status &= ~ATH9K_RXERR_KEYMISS; | 827 | rx_stats->rs_status &= ~ATH9K_RXERR_KEYMISS; |
| 827 | 828 | ||
| 828 | if (!rx_stats->rs_datalen) { | 829 | if (!rx_stats->rs_datalen) { |
diff --git a/drivers/net/wireless/ath/ath9k/xmit.c b/drivers/net/wireless/ath/ath9k/xmit.c index d59dd01d6cde..4d571394c7a8 100644 --- a/drivers/net/wireless/ath/ath9k/xmit.c +++ b/drivers/net/wireless/ath/ath9k/xmit.c | |||
| @@ -938,6 +938,7 @@ static void ath_buf_set_rate(struct ath_softc *sc, struct ath_buf *bf, | |||
| 938 | struct ieee80211_tx_rate *rates; | 938 | struct ieee80211_tx_rate *rates; |
| 939 | const struct ieee80211_rate *rate; | 939 | const struct ieee80211_rate *rate; |
| 940 | struct ieee80211_hdr *hdr; | 940 | struct ieee80211_hdr *hdr; |
| 941 | struct ath_frame_info *fi = get_frame_info(bf->bf_mpdu); | ||
| 941 | int i; | 942 | int i; |
| 942 | u8 rix = 0; | 943 | u8 rix = 0; |
| 943 | 944 | ||
| @@ -948,18 +949,7 @@ static void ath_buf_set_rate(struct ath_softc *sc, struct ath_buf *bf, | |||
| 948 | 949 | ||
| 949 | /* set dur_update_en for l-sig computation except for PS-Poll frames */ | 950 | /* set dur_update_en for l-sig computation except for PS-Poll frames */ |
| 950 | info->dur_update = !ieee80211_is_pspoll(hdr->frame_control); | 951 | info->dur_update = !ieee80211_is_pspoll(hdr->frame_control); |
| 951 | 952 | info->rtscts_rate = fi->rtscts_rate; | |
| 952 | /* | ||
| 953 | * We check if Short Preamble is needed for the CTS rate by | ||
| 954 | * checking the BSS's global flag. | ||
| 955 | * But for the rate series, IEEE80211_TX_RC_USE_SHORT_PREAMBLE is used. | ||
| 956 | */ | ||
| 957 | rate = ieee80211_get_rts_cts_rate(sc->hw, tx_info); | ||
| 958 | info->rtscts_rate = rate->hw_value; | ||
| 959 | |||
| 960 | if (tx_info->control.vif && | ||
| 961 | tx_info->control.vif->bss_conf.use_short_preamble) | ||
| 962 | info->rtscts_rate |= rate->hw_value_short; | ||
| 963 | 953 | ||
| 964 | for (i = 0; i < 4; i++) { | 954 | for (i = 0; i < 4; i++) { |
| 965 | bool is_40, is_sgi, is_sp; | 955 | bool is_40, is_sgi, is_sp; |
| @@ -1001,13 +991,13 @@ static void ath_buf_set_rate(struct ath_softc *sc, struct ath_buf *bf, | |||
| 1001 | } | 991 | } |
| 1002 | 992 | ||
| 1003 | /* legacy rates */ | 993 | /* legacy rates */ |
| 994 | rate = &sc->sbands[tx_info->band].bitrates[rates[i].idx]; | ||
| 1004 | if ((tx_info->band == IEEE80211_BAND_2GHZ) && | 995 | if ((tx_info->band == IEEE80211_BAND_2GHZ) && |
| 1005 | !(rate->flags & IEEE80211_RATE_ERP_G)) | 996 | !(rate->flags & IEEE80211_RATE_ERP_G)) |
| 1006 | phy = WLAN_RC_PHY_CCK; | 997 | phy = WLAN_RC_PHY_CCK; |
| 1007 | else | 998 | else |
| 1008 | phy = WLAN_RC_PHY_OFDM; | 999 | phy = WLAN_RC_PHY_OFDM; |
| 1009 | 1000 | ||
| 1010 | rate = &sc->sbands[tx_info->band].bitrates[rates[i].idx]; | ||
| 1011 | info->rates[i].Rate = rate->hw_value; | 1001 | info->rates[i].Rate = rate->hw_value; |
| 1012 | if (rate->hw_value_short) { | 1002 | if (rate->hw_value_short) { |
| 1013 | if (rates[i].flags & IEEE80211_TX_RC_USE_SHORT_PREAMBLE) | 1003 | if (rates[i].flags & IEEE80211_TX_RC_USE_SHORT_PREAMBLE) |
| @@ -1776,10 +1766,22 @@ static void setup_frame_info(struct ieee80211_hw *hw, struct sk_buff *skb, | |||
| 1776 | struct ieee80211_sta *sta = tx_info->control.sta; | 1766 | struct ieee80211_sta *sta = tx_info->control.sta; |
| 1777 | struct ieee80211_key_conf *hw_key = tx_info->control.hw_key; | 1767 | struct ieee80211_key_conf *hw_key = tx_info->control.hw_key; |
| 1778 | struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data; | 1768 | struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data; |
| 1769 | const struct ieee80211_rate *rate; | ||
| 1779 | struct ath_frame_info *fi = get_frame_info(skb); | 1770 | struct ath_frame_info *fi = get_frame_info(skb); |
| 1780 | struct ath_node *an = NULL; | 1771 | struct ath_node *an = NULL; |
| 1781 | enum ath9k_key_type keytype; | 1772 | enum ath9k_key_type keytype; |
| 1773 | bool short_preamble = false; | ||
| 1774 | |||
| 1775 | /* | ||
| 1776 | * We check if Short Preamble is needed for the CTS rate by | ||
| 1777 | * checking the BSS's global flag. | ||
| 1778 | * But for the rate series, IEEE80211_TX_RC_USE_SHORT_PREAMBLE is used. | ||
| 1779 | */ | ||
| 1780 | if (tx_info->control.vif && | ||
| 1781 | tx_info->control.vif->bss_conf.use_short_preamble) | ||
| 1782 | short_preamble = true; | ||
| 1782 | 1783 | ||
| 1784 | rate = ieee80211_get_rts_cts_rate(hw, tx_info); | ||
| 1783 | keytype = ath9k_cmn_get_hw_crypto_keytype(skb); | 1785 | keytype = ath9k_cmn_get_hw_crypto_keytype(skb); |
| 1784 | 1786 | ||
| 1785 | if (sta) | 1787 | if (sta) |
| @@ -1794,6 +1796,9 @@ static void setup_frame_info(struct ieee80211_hw *hw, struct sk_buff *skb, | |||
| 1794 | fi->keyix = ATH9K_TXKEYIX_INVALID; | 1796 | fi->keyix = ATH9K_TXKEYIX_INVALID; |
| 1795 | fi->keytype = keytype; | 1797 | fi->keytype = keytype; |
| 1796 | fi->framelen = framelen; | 1798 | fi->framelen = framelen; |
| 1799 | fi->rtscts_rate = rate->hw_value; | ||
| 1800 | if (short_preamble) | ||
| 1801 | fi->rtscts_rate |= rate->hw_value_short; | ||
| 1797 | } | 1802 | } |
| 1798 | 1803 | ||
| 1799 | u8 ath_txchainmask_reduction(struct ath_softc *sc, u8 chainmask, u32 rate) | 1804 | u8 ath_txchainmask_reduction(struct ath_softc *sc, u8 chainmask, u32 rate) |
