Bladeren bron

ath5k: disable the unusable 2 GHz mode on the first radio of a dual-band AR5312 device

SVN-Revision: 26587
Felix Fietkau 14 jaren geleden
bovenliggende
commit
93da23803b
1 gewijzigde bestanden met toevoegingen van 50 en 0 verwijderingen
  1. 50 0
      package/mac80211/patches/475-ath5k_fix_ar5312_5ghz_cap.patch

+ 50 - 0
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);