diff options
Diffstat (limited to 'drivers/net/wireless/ath9k/rc.c')
-rw-r--r-- | drivers/net/wireless/ath9k/rc.c | 23 |
1 files changed, 13 insertions, 10 deletions
diff --git a/drivers/net/wireless/ath9k/rc.c b/drivers/net/wireless/ath9k/rc.c index 832735677a46..824ccbb8b7b8 100644 --- a/drivers/net/wireless/ath9k/rc.c +++ b/drivers/net/wireless/ath9k/rc.c | |||
@@ -1,6 +1,6 @@ | |||
1 | /* | 1 | /* |
2 | * Copyright (c) 2004 Video54 Technologies, Inc. | 2 | * Copyright (c) 2004 Video54 Technologies, Inc. |
3 | * Copyright (c) 2004-2008 Atheros Communications, Inc. | 3 | * Copyright (c) 2004-2009 Atheros Communications, Inc. |
4 | * | 4 | * |
5 | * Permission to use, copy, modify, and/or distribute this software for any | 5 | * Permission to use, copy, modify, and/or distribute this software for any |
6 | * purpose with or without fee is hereby granted, provided that the above | 6 | * purpose with or without fee is hereby granted, provided that the above |
@@ -864,6 +864,8 @@ static void ath_rc_ratefind(struct ath_softc *sc, | |||
864 | rate_table, nrix, 1, 0); | 864 | rate_table, nrix, 1, 0); |
865 | ath_rc_rate_set_series(rate_table, &rates[i++], txrc, | 865 | ath_rc_rate_set_series(rate_table, &rates[i++], txrc, |
866 | try_per_rate, nrix, 0); | 866 | try_per_rate, nrix, 0); |
867 | |||
868 | tx_info->flags |= IEEE80211_TX_CTL_RATE_CTRL_PROBE; | ||
867 | } else { | 869 | } else { |
868 | try_per_rate = (ATH_11N_TXMAXTRY/4); | 870 | try_per_rate = (ATH_11N_TXMAXTRY/4); |
869 | /* Set the choosen rate. No RTS for first series entry. */ | 871 | /* Set the choosen rate. No RTS for first series entry. */ |
@@ -1468,16 +1470,18 @@ static void ath_rc_init(struct ath_softc *sc, | |||
1468 | ath_rc_priv->ht_cap); | 1470 | ath_rc_priv->ht_cap); |
1469 | } | 1471 | } |
1470 | 1472 | ||
1471 | static u8 ath_rc_build_ht_caps(struct ath_softc *sc, bool is_ht, bool is_cw40, | 1473 | static u8 ath_rc_build_ht_caps(struct ath_softc *sc, struct ieee80211_sta *sta, |
1472 | bool is_sgi40) | 1474 | bool is_cw40, bool is_sgi40) |
1473 | { | 1475 | { |
1474 | u8 caps = 0; | 1476 | u8 caps = 0; |
1475 | 1477 | ||
1476 | if (is_ht) { | 1478 | if (sta->ht_cap.ht_supported) { |
1477 | caps = WLAN_RC_HT_FLAG; | 1479 | caps = WLAN_RC_HT_FLAG; |
1478 | if (sc->sc_ah->caps.tx_chainmask != 1 && | 1480 | if (sc->sc_ah->caps.tx_chainmask != 1 && |
1479 | ath9k_hw_getcapability(sc->sc_ah, ATH9K_CAP_DS, 0, NULL)) | 1481 | ath9k_hw_getcapability(sc->sc_ah, ATH9K_CAP_DS, 0, NULL)) { |
1480 | caps |= WLAN_RC_DS_FLAG; | 1482 | if (sta->ht_cap.mcs.rx_mask[1]) |
1483 | caps |= WLAN_RC_DS_FLAG; | ||
1484 | } | ||
1481 | if (is_cw40) | 1485 | if (is_cw40) |
1482 | caps |= WLAN_RC_40_FLAG; | 1486 | caps |= WLAN_RC_40_FLAG; |
1483 | if (is_sgi40) | 1487 | if (is_sgi40) |
@@ -1615,6 +1619,7 @@ static void ath_rate_init(void *priv, struct ieee80211_supported_band *sband, | |||
1615 | /* Choose rate table first */ | 1619 | /* Choose rate table first */ |
1616 | 1620 | ||
1617 | if ((sc->sc_ah->opmode == NL80211_IFTYPE_STATION) || | 1621 | if ((sc->sc_ah->opmode == NL80211_IFTYPE_STATION) || |
1622 | (sc->sc_ah->opmode == NL80211_IFTYPE_MESH_POINT) || | ||
1618 | (sc->sc_ah->opmode == NL80211_IFTYPE_ADHOC)) { | 1623 | (sc->sc_ah->opmode == NL80211_IFTYPE_ADHOC)) { |
1619 | rate_table = ath_choose_rate_table(sc, sband->band, | 1624 | rate_table = ath_choose_rate_table(sc, sband->band, |
1620 | sta->ht_cap.ht_supported, | 1625 | sta->ht_cap.ht_supported, |
@@ -1624,8 +1629,7 @@ static void ath_rate_init(void *priv, struct ieee80211_supported_band *sband, | |||
1624 | rate_table = sc->cur_rate_table; | 1629 | rate_table = sc->cur_rate_table; |
1625 | } | 1630 | } |
1626 | 1631 | ||
1627 | ath_rc_priv->ht_cap = ath_rc_build_ht_caps(sc, sta->ht_cap.ht_supported, | 1632 | ath_rc_priv->ht_cap = ath_rc_build_ht_caps(sc, sta, is_cw40, is_sgi40); |
1628 | is_cw40, is_sgi40); | ||
1629 | ath_rc_init(sc, priv_sta, sband, sta, rate_table); | 1633 | ath_rc_init(sc, priv_sta, sband, sta, rate_table); |
1630 | } | 1634 | } |
1631 | 1635 | ||
@@ -1659,8 +1663,7 @@ static void ath_rate_update(void *priv, struct ieee80211_supported_band *sband, | |||
1659 | rate_table = ath_choose_rate_table(sc, sband->band, | 1663 | rate_table = ath_choose_rate_table(sc, sband->band, |
1660 | sta->ht_cap.ht_supported, | 1664 | sta->ht_cap.ht_supported, |
1661 | oper_cw40); | 1665 | oper_cw40); |
1662 | ath_rc_priv->ht_cap = ath_rc_build_ht_caps(sc, | 1666 | ath_rc_priv->ht_cap = ath_rc_build_ht_caps(sc, sta, |
1663 | sta->ht_cap.ht_supported, | ||
1664 | oper_cw40, oper_sgi40); | 1667 | oper_cw40, oper_sgi40); |
1665 | ath_rc_init(sc, priv_sta, sband, sta, rate_table); | 1668 | ath_rc_init(sc, priv_sta, sband, sta, rate_table); |
1666 | 1669 | ||