diff options
author | Gabor Juhos <juhosg@openwrt.org> | 2009-11-27 06:01:35 -0500 |
---|---|---|
committer | John W. Linville <linville@tuxdriver.com> | 2009-12-04 14:16:23 -0500 |
commit | a9a29ce674ac62e7bfcb6c1404ca86cda4782988 (patch) | |
tree | 45aad580765aba12a3283418227383a07cf53080 /drivers/net | |
parent | 1f351e3840dcf25aaddec2d908c3ab06ae105ee6 (diff) |
ath9k: enable 2GHz band only if the device supports it
Currently, the 2GHz band is enabled unconditionally, even if the device
does not support it.
Changes-licensed-under: ISC
Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'drivers/net')
-rw-r--r-- | drivers/net/wireless/ath/ath9k/hw.c | 15 | ||||
-rw-r--r-- | drivers/net/wireless/ath/ath9k/hw.h | 2 | ||||
-rw-r--r-- | drivers/net/wireless/ath/ath9k/main.c | 28 |
3 files changed, 31 insertions, 14 deletions
diff --git a/drivers/net/wireless/ath/ath9k/hw.c b/drivers/net/wireless/ath/ath9k/hw.c index 493160c8c754..2ec61f08cfdb 100644 --- a/drivers/net/wireless/ath/ath9k/hw.c +++ b/drivers/net/wireless/ath/ath9k/hw.c | |||
@@ -976,7 +976,10 @@ int ath9k_hw_init(struct ath_hw *ah) | |||
976 | return r; | 976 | return r; |
977 | 977 | ||
978 | ath9k_hw_init_mode_gain_regs(ah); | 978 | ath9k_hw_init_mode_gain_regs(ah); |
979 | ath9k_hw_fill_cap_info(ah); | 979 | r = ath9k_hw_fill_cap_info(ah); |
980 | if (r) | ||
981 | return r; | ||
982 | |||
980 | ath9k_hw_init_11a_eeprom_fix(ah); | 983 | ath9k_hw_init_11a_eeprom_fix(ah); |
981 | 984 | ||
982 | r = ath9k_hw_init_macaddr(ah); | 985 | r = ath9k_hw_init_macaddr(ah); |
@@ -3112,7 +3115,7 @@ EXPORT_SYMBOL(ath9k_hw_set_sta_beacon_timers); | |||
3112 | /* HW Capabilities */ | 3115 | /* HW Capabilities */ |
3113 | /*******************/ | 3116 | /*******************/ |
3114 | 3117 | ||
3115 | void ath9k_hw_fill_cap_info(struct ath_hw *ah) | 3118 | int ath9k_hw_fill_cap_info(struct ath_hw *ah) |
3116 | { | 3119 | { |
3117 | struct ath9k_hw_capabilities *pCap = &ah->caps; | 3120 | struct ath9k_hw_capabilities *pCap = &ah->caps; |
3118 | struct ath_regulatory *regulatory = ath9k_hw_regulatory(ah); | 3121 | struct ath_regulatory *regulatory = ath9k_hw_regulatory(ah); |
@@ -3143,6 +3146,12 @@ void ath9k_hw_fill_cap_info(struct ath_hw *ah) | |||
3143 | } | 3146 | } |
3144 | 3147 | ||
3145 | eeval = ah->eep_ops->get_eeprom(ah, EEP_OP_MODE); | 3148 | eeval = ah->eep_ops->get_eeprom(ah, EEP_OP_MODE); |
3149 | if ((eeval & (AR5416_OPFLAGS_11G | AR5416_OPFLAGS_11A)) == 0) { | ||
3150 | ath_print(common, ATH_DBG_FATAL, | ||
3151 | "no band has been marked as supported in EEPROM.\n"); | ||
3152 | return -EINVAL; | ||
3153 | } | ||
3154 | |||
3146 | bitmap_zero(pCap->wireless_modes, ATH9K_MODE_MAX); | 3155 | bitmap_zero(pCap->wireless_modes, ATH9K_MODE_MAX); |
3147 | 3156 | ||
3148 | if (eeval & AR5416_OPFLAGS_11A) { | 3157 | if (eeval & AR5416_OPFLAGS_11A) { |
@@ -3306,6 +3315,8 @@ void ath9k_hw_fill_cap_info(struct ath_hw *ah) | |||
3306 | } else { | 3315 | } else { |
3307 | btcoex_hw->scheme = ATH_BTCOEX_CFG_NONE; | 3316 | btcoex_hw->scheme = ATH_BTCOEX_CFG_NONE; |
3308 | } | 3317 | } |
3318 | |||
3319 | return 0; | ||
3309 | } | 3320 | } |
3310 | 3321 | ||
3311 | bool ath9k_hw_getcapability(struct ath_hw *ah, enum ath9k_capability_type type, | 3322 | bool ath9k_hw_getcapability(struct ath_hw *ah, enum ath9k_capability_type type, |
diff --git a/drivers/net/wireless/ath/ath9k/hw.h b/drivers/net/wireless/ath/ath9k/hw.h index 46e1572dc945..e2b0c73a616f 100644 --- a/drivers/net/wireless/ath/ath9k/hw.h +++ b/drivers/net/wireless/ath/ath9k/hw.h | |||
@@ -620,7 +620,7 @@ void ath9k_hw_detach(struct ath_hw *ah); | |||
620 | int ath9k_hw_init(struct ath_hw *ah); | 620 | int ath9k_hw_init(struct ath_hw *ah); |
621 | int ath9k_hw_reset(struct ath_hw *ah, struct ath9k_channel *chan, | 621 | int ath9k_hw_reset(struct ath_hw *ah, struct ath9k_channel *chan, |
622 | bool bChannelChange); | 622 | bool bChannelChange); |
623 | void ath9k_hw_fill_cap_info(struct ath_hw *ah); | 623 | int ath9k_hw_fill_cap_info(struct ath_hw *ah); |
624 | bool ath9k_hw_getcapability(struct ath_hw *ah, enum ath9k_capability_type type, | 624 | bool ath9k_hw_getcapability(struct ath_hw *ah, enum ath9k_capability_type type, |
625 | u32 capability, u32 *result); | 625 | u32 capability, u32 *result); |
626 | bool ath9k_hw_setcapability(struct ath_hw *ah, enum ath9k_capability_type type, | 626 | bool ath9k_hw_setcapability(struct ath_hw *ah, enum ath9k_capability_type type, |
diff --git a/drivers/net/wireless/ath/ath9k/main.c b/drivers/net/wireless/ath/ath9k/main.c index b9598148767b..c48743452515 100644 --- a/drivers/net/wireless/ath/ath9k/main.c +++ b/drivers/net/wireless/ath/ath9k/main.c | |||
@@ -1793,13 +1793,15 @@ static int ath_init_softc(u16 devid, struct ath_softc *sc, u16 subsysid, | |||
1793 | 1793 | ||
1794 | /* setup channels and rates */ | 1794 | /* setup channels and rates */ |
1795 | 1795 | ||
1796 | sc->sbands[IEEE80211_BAND_2GHZ].channels = ath9k_2ghz_chantable; | 1796 | if (test_bit(ATH9K_MODE_11G, sc->sc_ah->caps.wireless_modes)) { |
1797 | sc->sbands[IEEE80211_BAND_2GHZ].band = IEEE80211_BAND_2GHZ; | 1797 | sc->sbands[IEEE80211_BAND_2GHZ].channels = ath9k_2ghz_chantable; |
1798 | sc->sbands[IEEE80211_BAND_2GHZ].n_channels = | 1798 | sc->sbands[IEEE80211_BAND_2GHZ].band = IEEE80211_BAND_2GHZ; |
1799 | ARRAY_SIZE(ath9k_2ghz_chantable); | 1799 | sc->sbands[IEEE80211_BAND_2GHZ].n_channels = |
1800 | sc->sbands[IEEE80211_BAND_2GHZ].bitrates = ath9k_legacy_rates; | 1800 | ARRAY_SIZE(ath9k_2ghz_chantable); |
1801 | sc->sbands[IEEE80211_BAND_2GHZ].n_bitrates = | 1801 | sc->sbands[IEEE80211_BAND_2GHZ].bitrates = ath9k_legacy_rates; |
1802 | ARRAY_SIZE(ath9k_legacy_rates); | 1802 | sc->sbands[IEEE80211_BAND_2GHZ].n_bitrates = |
1803 | ARRAY_SIZE(ath9k_legacy_rates); | ||
1804 | } | ||
1803 | 1805 | ||
1804 | if (test_bit(ATH9K_MODE_11A, sc->sc_ah->caps.wireless_modes)) { | 1806 | if (test_bit(ATH9K_MODE_11A, sc->sc_ah->caps.wireless_modes)) { |
1805 | sc->sbands[IEEE80211_BAND_5GHZ].channels = ath9k_5ghz_chantable; | 1807 | sc->sbands[IEEE80211_BAND_5GHZ].channels = ath9k_5ghz_chantable; |
@@ -1876,8 +1878,9 @@ void ath_set_hw_capab(struct ath_softc *sc, struct ieee80211_hw *hw) | |||
1876 | 1878 | ||
1877 | hw->rate_control_algorithm = "ath9k_rate_control"; | 1879 | hw->rate_control_algorithm = "ath9k_rate_control"; |
1878 | 1880 | ||
1879 | hw->wiphy->bands[IEEE80211_BAND_2GHZ] = | 1881 | if (test_bit(ATH9K_MODE_11G, sc->sc_ah->caps.wireless_modes)) |
1880 | &sc->sbands[IEEE80211_BAND_2GHZ]; | 1882 | hw->wiphy->bands[IEEE80211_BAND_2GHZ] = |
1883 | &sc->sbands[IEEE80211_BAND_2GHZ]; | ||
1881 | if (test_bit(ATH9K_MODE_11A, sc->sc_ah->caps.wireless_modes)) | 1884 | if (test_bit(ATH9K_MODE_11A, sc->sc_ah->caps.wireless_modes)) |
1882 | hw->wiphy->bands[IEEE80211_BAND_5GHZ] = | 1885 | hw->wiphy->bands[IEEE80211_BAND_5GHZ] = |
1883 | &sc->sbands[IEEE80211_BAND_5GHZ]; | 1886 | &sc->sbands[IEEE80211_BAND_5GHZ]; |
@@ -1916,9 +1919,12 @@ int ath_init_device(u16 devid, struct ath_softc *sc, u16 subsysid, | |||
1916 | reg = &common->regulatory; | 1919 | reg = &common->regulatory; |
1917 | 1920 | ||
1918 | if (ah->caps.hw_caps & ATH9K_HW_CAP_HT) { | 1921 | if (ah->caps.hw_caps & ATH9K_HW_CAP_HT) { |
1919 | setup_ht_cap(sc, &sc->sbands[IEEE80211_BAND_2GHZ].ht_cap); | 1922 | if (test_bit(ATH9K_MODE_11G, ah->caps.wireless_modes)) |
1923 | setup_ht_cap(sc, | ||
1924 | &sc->sbands[IEEE80211_BAND_2GHZ].ht_cap); | ||
1920 | if (test_bit(ATH9K_MODE_11A, ah->caps.wireless_modes)) | 1925 | if (test_bit(ATH9K_MODE_11A, ah->caps.wireless_modes)) |
1921 | setup_ht_cap(sc, &sc->sbands[IEEE80211_BAND_5GHZ].ht_cap); | 1926 | setup_ht_cap(sc, |
1927 | &sc->sbands[IEEE80211_BAND_5GHZ].ht_cap); | ||
1922 | } | 1928 | } |
1923 | 1929 | ||
1924 | /* initialize tx/rx engine */ | 1930 | /* initialize tx/rx engine */ |