diff options
| -rw-r--r-- | package/mac80211/patches/475-ath5k_fix_ar5312_5ghz_cap.patch | 50 | 
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 000000000..535c61e43 --- /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); | 
