ath5k: disable 5 GHz support for the dualband PHY chip on dual-radio AR5312
authorFelix Fietkau <nbd@openwrt.org>
Wed, 13 Apr 2011 19:56:46 +0000 (21:56 +0200)
committerJohn W. Linville <linville@tuxdriver.com>
Thu, 14 Apr 2011 19:35:10 +0000 (15:35 -0400)
There are two variants of AR5312 dual-band devices, one single-radio
and the other one dual-radio. On the dual-radio board, the first MAC
only supports 5 GHz, even though it has a dual-band PHY. The 2.4 GHz
part of this phy is used in pass-through mode, connecting the second
MAC with the second PHY.
Disable 2.4 GHz for the first MAC on an AR5312, but only if the board
configuration indicates a dual-radio device.

Signed-off-by: Felix Fietkau <nbd@openwrt.org>
Tested-by: Sedat Dilek <sedat.dilek@gmail.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
drivers/net/wireless/ath/ath5k/ahb.c
drivers/net/wireless/ath/ath5k/attach.c
drivers/net/wireless/ath/ath5k/base.h

index 1374e647f4e6bd3fd666860fcd15ee914c4b220f..ea99827815599e9028682de9b4c2276d2d7939f3 100644 (file)
@@ -160,6 +160,16 @@ static int ath_ahb_probe(struct platform_device *pdev)
                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);
index 326d7c84c912ebb879f9250530ac3fd7caa35c6c..1588401de3c45ba225e2094d1f287818b40c6bf6 100644 (file)
@@ -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);
index 4c4e36064a3b339f3f4ffc07baeae951d52c6ec6..b294f3305011b4f122b5caeea490b937048e6d04 100644 (file)
@@ -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 */