diff options
Diffstat (limited to 'drivers/net/wireless/ath9k/rc.c')
-rw-r--r-- | drivers/net/wireless/ath9k/rc.c | 58 |
1 files changed, 49 insertions, 9 deletions
diff --git a/drivers/net/wireless/ath9k/rc.c b/drivers/net/wireless/ath9k/rc.c index 93dfea897ff2..76acd2b75fcd 100644 --- a/drivers/net/wireless/ath9k/rc.c +++ b/drivers/net/wireless/ath9k/rc.c | |||
@@ -1304,6 +1304,38 @@ static void ath_rc_tx_status(struct ath_softc *sc, | |||
1304 | xretries, long_retry); | 1304 | xretries, long_retry); |
1305 | } | 1305 | } |
1306 | 1306 | ||
1307 | static struct ath_rate_table *ath_choose_rate_table(struct ath_softc *sc, | ||
1308 | enum ieee80211_band band, | ||
1309 | bool is_ht, bool is_cw_40) | ||
1310 | { | ||
1311 | int mode = 0; | ||
1312 | |||
1313 | switch(band) { | ||
1314 | case IEEE80211_BAND_2GHZ: | ||
1315 | mode = ATH9K_MODE_11G; | ||
1316 | if (is_ht) | ||
1317 | mode = ATH9K_MODE_11NG_HT20; | ||
1318 | if (is_cw_40) | ||
1319 | mode = ATH9K_MODE_11NG_HT40PLUS; | ||
1320 | break; | ||
1321 | case IEEE80211_BAND_5GHZ: | ||
1322 | mode = ATH9K_MODE_11A; | ||
1323 | if (is_ht) | ||
1324 | mode = ATH9K_MODE_11NA_HT20; | ||
1325 | if (is_cw_40) | ||
1326 | mode = ATH9K_MODE_11NA_HT40PLUS; | ||
1327 | break; | ||
1328 | default: | ||
1329 | DPRINTF(sc, ATH_DBG_CONFIG, "Invalid band\n"); | ||
1330 | return NULL; | ||
1331 | } | ||
1332 | |||
1333 | BUG_ON(mode >= ATH9K_MODE_MAX); | ||
1334 | |||
1335 | DPRINTF(sc, ATH_DBG_CONFIG, "Choosing rate table for mode: %d\n", mode); | ||
1336 | return sc->hw_rate_table[mode]; | ||
1337 | } | ||
1338 | |||
1307 | static void ath_rc_init(struct ath_softc *sc, | 1339 | static void ath_rc_init(struct ath_softc *sc, |
1308 | struct ath_rate_priv *ath_rc_priv, | 1340 | struct ath_rate_priv *ath_rc_priv, |
1309 | struct ieee80211_supported_band *sband, | 1341 | struct ieee80211_supported_band *sband, |
@@ -1314,16 +1346,25 @@ static void ath_rc_init(struct ath_softc *sc, | |||
1314 | u8 *ht_mcs = (u8 *)&ath_rc_priv->neg_ht_rates; | 1346 | u8 *ht_mcs = (u8 *)&ath_rc_priv->neg_ht_rates; |
1315 | u8 i, j, k, hi = 0, hthi = 0; | 1347 | u8 i, j, k, hi = 0, hthi = 0; |
1316 | 1348 | ||
1317 | rate_table = sc->hw_rate_table[sc->sc_curmode]; | 1349 | /* FIXME: Adhoc */ |
1350 | if ((sc->sc_ah->ah_opmode == NL80211_IFTYPE_STATION) || | ||
1351 | (sc->sc_ah->ah_opmode == NL80211_IFTYPE_ADHOC)) { | ||
1352 | bool is_cw_40 = sta->ht_cap.cap & IEEE80211_HT_CAP_SUP_WIDTH_20_40; | ||
1353 | rate_table = ath_choose_rate_table(sc, sband->band, | ||
1354 | sta->ht_cap.ht_supported, | ||
1355 | is_cw_40); | ||
1356 | } else if (sc->sc_ah->ah_opmode == NL80211_IFTYPE_AP) { | ||
1357 | /* sc_curmode would be set on init through config() */ | ||
1358 | rate_table = sc->hw_rate_table[sc->sc_curmode]; | ||
1359 | } | ||
1318 | 1360 | ||
1319 | if (sta->ht_cap.ht_supported) { | 1361 | if (!rate_table) { |
1320 | if (sband->band == IEEE80211_BAND_2GHZ) | 1362 | DPRINTF(sc, ATH_DBG_FATAL, "Rate table not initialized\n"); |
1321 | rate_table = sc->hw_rate_table[ATH9K_MODE_11NG_HT20]; | 1363 | return; |
1322 | else | 1364 | } |
1323 | rate_table = sc->hw_rate_table[ATH9K_MODE_11NA_HT20]; | ||
1324 | 1365 | ||
1366 | if (sta->ht_cap.ht_supported) { | ||
1325 | ath_rc_priv->ht_cap = (WLAN_RC_HT_FLAG | WLAN_RC_DS_FLAG); | 1367 | ath_rc_priv->ht_cap = (WLAN_RC_HT_FLAG | WLAN_RC_DS_FLAG); |
1326 | |||
1327 | if (sta->ht_cap.cap & IEEE80211_HT_CAP_SUP_WIDTH_20_40) | 1368 | if (sta->ht_cap.cap & IEEE80211_HT_CAP_SUP_WIDTH_20_40) |
1328 | ath_rc_priv->ht_cap |= WLAN_RC_40_FLAG; | 1369 | ath_rc_priv->ht_cap |= WLAN_RC_40_FLAG; |
1329 | } | 1370 | } |
@@ -1531,8 +1572,7 @@ static void *ath_rate_alloc_sta(void *priv, struct ieee80211_sta *sta, gfp_t gfp | |||
1531 | rate_priv = kzalloc(sizeof(struct ath_rate_priv), gfp); | 1572 | rate_priv = kzalloc(sizeof(struct ath_rate_priv), gfp); |
1532 | if (!rate_priv) { | 1573 | if (!rate_priv) { |
1533 | DPRINTF(sc, ATH_DBG_FATAL, | 1574 | DPRINTF(sc, ATH_DBG_FATAL, |
1534 | "%s: Unable to allocate private rc structure\n", | 1575 | "Unable to allocate private rc structure\n"); |
1535 | __func__); | ||
1536 | return NULL; | 1576 | return NULL; |
1537 | } | 1577 | } |
1538 | 1578 | ||