aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--package/mac80211/patches/475-ath5k_fix_ar5312_5ghz_cap.patch50
1 files changed, 50 insertions, 0 deletions
diff --git a/package/mac80211/patches/475-ath5k_fix_ar5312_5ghz_cap.patch b/package/mac80211/patches/475-ath5k_fix_ar5312_5ghz_cap.patch
new file mode 100644
index 0000000000..535c61e433
--- /dev/null
+++ b/package/mac80211/patches/475-ath5k_fix_ar5312_5ghz_cap.patch
@@ -0,0 +1,50 @@
+--- a/drivers/net/wireless/ath/ath5k/base.h
++++ b/drivers/net/wireless/ath/ath5k/base.h
+@@ -193,12 +193,13 @@ struct ath5k_softc {
+ dma_addr_t desc_daddr; /* DMA (physical) address */
+ size_t desc_len; /* size of TX/RX descriptors */
+
+- DECLARE_BITMAP(status, 5);
++ DECLARE_BITMAP(status, 6);
+ #define ATH_STAT_INVALID 0 /* disable hardware accesses */
+ #define ATH_STAT_MRRETRY 1 /* multi-rate retry support */
+ #define ATH_STAT_PROMISC 2
+ #define ATH_STAT_LEDSOFT 3 /* enable LED gpio status */
+ #define ATH_STAT_STARTED 4 /* opened & irqs enabled */
++#define ATH_STAT_2G_DISABLED 5 /* multiband radio without 2G */
+
+ unsigned int filter_flags; /* HW flags, AR5K_RX_FILTER_* */
+ struct ieee80211_channel *curchan; /* current h/w channel */
+--- a/drivers/net/wireless/ath/ath5k/ahb.c
++++ b/drivers/net/wireless/ath/ath5k/ahb.c
+@@ -160,6 +160,16 @@ static int ath_ahb_probe(struct platform
+ else
+ reg |= AR5K_AR5312_ENABLE_WLAN1;
+ __raw_writel(reg, (void __iomem *) AR5K_AR5312_ENABLE);
++
++ /*
++ * On a dual-band AR5312, the multiband radio is only
++ * used as pass-through. Disable 2 GHz support in the
++ * driver for it
++ */
++ if (to_platform_device(sc->dev)->id == 0 &&
++ (bcfg->config->flags & (BD_WLAN0|BD_WLAN1)) ==
++ (BD_WLAN1|BD_WLAN0))
++ __set_bit(ATH_STAT_2G_DISABLED, sc->status);
+ }
+
+ ret = ath5k_init_softc(sc, &ath_ahb_bus_ops);
+--- a/drivers/net/wireless/ath/ath5k/attach.c
++++ b/drivers/net/wireless/ath/ath5k/attach.c
+@@ -313,6 +313,11 @@ int ath5k_hw_init(struct ath5k_softc *sc
+ goto err;
+ }
+
++ if (test_bit(ATH_STAT_2G_DISABLED, sc->status)) {
++ __clear_bit(AR5K_MODE_11B, ah->ah_capabilities.cap_mode);
++ __clear_bit(AR5K_MODE_11G, ah->ah_capabilities.cap_mode);
++ }
++
+ /* Crypto settings */
+ common->keymax = (sc->ah->ah_version == AR5K_AR5210 ?
+ AR5K_KEYTABLE_SIZE_5210 : AR5K_KEYTABLE_SIZE_5211);