From 0cbc5f678d3b76ff44c1d0370090caf0eb43cb33 Mon Sep 17 00:00:00 2001 From: Gabor Juhos Date: Tue, 9 Feb 2010 16:27:35 +0000 Subject: ar71xx/mac80211: add a workaround for the bad signal strength on the WNDR3700 SVN-Revision: 19565 --- ...ath9k-add-wndr3700-antenna-initialization.patch | 76 ++++++++++++++++++++++ 1 file changed, 76 insertions(+) create mode 100644 package/mac80211/patches/409-ath9k-add-wndr3700-antenna-initialization.patch (limited to 'package/mac80211/patches') diff --git a/package/mac80211/patches/409-ath9k-add-wndr3700-antenna-initialization.patch b/package/mac80211/patches/409-ath9k-add-wndr3700-antenna-initialization.patch new file mode 100644 index 0000000000..98c989176d --- /dev/null +++ b/package/mac80211/patches/409-ath9k-add-wndr3700-antenna-initialization.patch @@ -0,0 +1,76 @@ +--- a/drivers/net/wireless/ath/ath9k/init.c ++++ b/drivers/net/wireless/ath/ath9k/init.c +@@ -14,6 +14,7 @@ + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + ++#include "linux/ath9k_platform.h" + #include "ath9k.h" + + static char *dev_info = "ath9k"; +@@ -546,6 +547,8 @@ static int ath9k_init_softc(u16 devid, s + pdata = (struct ath9k_platform_data *) sc->dev->platform_data; + if (!pdata) + ah->ah_flags |= AH_USE_EEPROM; ++ else ++ sc->quirk_wndr3700 = pdata->quirk_wndr3700; + + common = ath9k_hw_common(ah); + common->ops = &ath9k_common_ops; +@@ -670,6 +673,24 @@ void ath9k_set_hw_capab(struct ath_softc + SET_IEEE80211_PERM_ADDR(hw, common->macaddr); + } + ++#ifdef CONFIG_ATHEROS_AR71XX ++static void wndr3700_init_antenna(struct ath_hw *ah) ++{ ++ ath9k_hw_cfg_output(ah, 6, AR_GPIO_OUTPUT_MUX_AS_OUTPUT); ++ ath9k_hw_cfg_output(ah, 7, AR_GPIO_OUTPUT_MUX_AS_OUTPUT); ++ ath9k_hw_cfg_output(ah, 8, AR_GPIO_OUTPUT_MUX_AS_OUTPUT); ++ ath9k_hw_cfg_output(ah, 9, AR_GPIO_OUTPUT_MUX_AS_OUTPUT); ++ ++ /* select the first antenna group */ ++ ath9k_hw_set_gpio(ah, 6, 0); ++ ath9k_hw_set_gpio(ah, 7, 1); ++ ath9k_hw_set_gpio(ah, 8, 0); ++ ath9k_hw_set_gpio(ah, 9, 1); ++} ++#else ++static inline void wndr3700_init_antenna(struct ath_hw *ah) {} ++#endif /* CONFIG_ATHEROS_AR71XX */ ++ + int ath9k_init_device(u16 devid, struct ath_softc *sc, u16 subsysid, + const struct ath_bus_ops *bus_ops) + { +@@ -688,6 +709,9 @@ int ath9k_init_device(u16 devid, struct + common = ath9k_hw_common(ah); + ath9k_set_hw_capab(sc, hw); + ++ if (sc->quirk_wndr3700) ++ wndr3700_init_antenna(ah); ++ + /* Initialize regulatory */ + error = ath_regd_init(&common->regulatory, sc->hw->wiphy, + ath9k_reg_notifier); +--- a/drivers/net/wireless/ath/ath9k/ath9k.h ++++ b/drivers/net/wireless/ath/ath9k/ath9k.h +@@ -510,6 +510,8 @@ struct ath_softc { + struct ath_beacon_config cur_beacon_conf; + struct delayed_work tx_complete_work; + struct ath_btcoex btcoex; ++ ++ unsigned long quirk_wndr3700:1; + }; + + struct ath_wiphy { +--- a/include/linux/ath9k_platform.h ++++ b/include/linux/ath9k_platform.h +@@ -24,6 +24,8 @@ + struct ath9k_platform_data { + u16 eeprom_data[ATH9K_PLAT_EEP_MAX_WORDS]; + u8 *macaddr; ++ ++ unsigned long quirk_wndr3700:1; + }; + + #endif /* _LINUX_ATH9K_PLATFORM_H */ -- cgit v1.2.3