aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/wireless/ath9k/rc.c
diff options
context:
space:
mode:
authorSujith <Sujith.Manoharan@atheros.com>2008-11-26 23:16:27 -0500
committerJohn W. Linville <linville@tuxdriver.com>2008-12-05 09:32:59 -0500
commite11602b7813502bf363c40cdb5a8c4b96d4bbc96 (patch)
treef5cf351d596f9e99dc6cdf83fb1faec9de0e18a5 /drivers/net/wireless/ath9k/rc.c
parentcb3da8ccc464409e3b947557cdac4cd0b1241c4c (diff)
ath9k: Handle channel initialization for AP mode
Hostapd now passes the HT parameters through the config() callback, use these to set the appropriate channel in AP mode. Signed-off-by: Sujith <Sujith.Manoharan@atheros.com> Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'drivers/net/wireless/ath9k/rc.c')
-rw-r--r--drivers/net/wireless/ath9k/rc.c55
1 files changed, 48 insertions, 7 deletions
diff --git a/drivers/net/wireless/ath9k/rc.c b/drivers/net/wireless/ath9k/rc.c
index 93dfea897ff2..7c08583a7943 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_RATE, "Invalid band\n");
1330 return NULL;
1331 }
1332
1333 BUG_ON(mode >= ATH9K_MODE_MAX);
1334
1335 DPRINTF(sc, ATH_DBG_RATE, "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 == ATH9K_M_STA) ||
1351 (sc->sc_ah->ah_opmode == ATH9K_M_IBSS)) {
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 == ATH9K_M_HOSTAP) {
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 }