ath5k: disable the unusable 2 GHz mode on the first radio of a dual-band AR5312 device
authorFelix Fietkau <nbd@openwrt.org>
Mon, 11 Apr 2011 03:26:08 +0000 (03:26 +0000)
committerFelix Fietkau <nbd@openwrt.org>
Mon, 11 Apr 2011 03:26:08 +0000 (03:26 +0000)
SVN-Revision: 26587

package/mac80211/patches/475-ath5k_fix_ar5312_5ghz_cap.patch [new file with mode: 0644]

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 (file)
index 0000000..535c61e
--- /dev/null
@@ -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);