aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/wireless/ath9k/rc.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/net/wireless/ath9k/rc.c')
-rw-r--r--drivers/net/wireless/ath9k/rc.c58
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
1307static 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
1307static void ath_rc_init(struct ath_softc *sc, 1339static 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