diff options
| author | nbd <nbd@3c298f89-4303-0410-b956-a3cf2f4a3e73> | 2010-12-11 01:45:12 +0000 | 
|---|---|---|
| committer | nbd <nbd@3c298f89-4303-0410-b956-a3cf2f4a3e73> | 2010-12-11 01:45:12 +0000 | 
| commit | 83cc2deba9a07c5fc3bee9c8c973721bc374d734 (patch) | |
| tree | 995c0aad8f68eaf037d80be2c55fd5920ac4b253 /package/mac80211 | |
| parent | 99a212a2565ed4c256d86645d14ff7064f284f2d (diff) | |
mac80211: update to 2010-12-09
git-svn-id: svn://svn.openwrt.org/openwrt/trunk@24471 3c298f89-4303-0410-b956-a3cf2f4a3e73
Diffstat (limited to 'package/mac80211')
29 files changed, 588 insertions, 3078 deletions
diff --git a/package/mac80211/Makefile b/package/mac80211/Makefile index 2d3d83622..e1ffd3ce9 100644 --- a/package/mac80211/Makefile +++ b/package/mac80211/Makefile @@ -10,12 +10,12 @@ include $(INCLUDE_DIR)/kernel.mk  PKG_NAME:=mac80211 -PKG_VERSION:=2010-11-30 +PKG_VERSION:=2010-12-09  PKG_RELEASE:=1  PKG_SOURCE_URL:=http://mirror2.openwrt.org/sources  #	http://www.orbit-lab.org/kernel/compat-wireless-2.6/2010/11 \  #	http://wireless.kernel.org/download/compat-wireless-2.6 -PKG_MD5SUM:=09148efb8ba838bb409bc9e20775d530 +PKG_MD5SUM:=94b6eaaa2c8245d1b5d6b6f16b75a701  PKG_SOURCE:=compat-wireless-$(PKG_VERSION).tar.bz2  PKG_BUILD_DIR:=$(KERNEL_BUILD_DIR)/compat-wireless-$(PKG_VERSION) diff --git a/package/mac80211/patches/001-disable_b44.patch b/package/mac80211/patches/001-disable_b44.patch index a7ce13555..a99bf99d8 100644 --- a/package/mac80211/patches/001-disable_b44.patch +++ b/package/mac80211/patches/001-disable_b44.patch @@ -1,6 +1,6 @@  --- a/config.mk  +++ b/config.mk -@@ -299,8 +299,8 @@ endif #CONFIG_SSB +@@ -301,8 +301,8 @@ endif #CONFIG_SSB   CONFIG_P54_PCI=m diff --git a/package/mac80211/patches/002-disable_rfkill.patch b/package/mac80211/patches/002-disable_rfkill.patch index 338631610..453b97942 100644 --- a/package/mac80211/patches/002-disable_rfkill.patch +++ b/package/mac80211/patches/002-disable_rfkill.patch @@ -9,7 +9,7 @@   ifeq ($(CONFIG_MAC80211),y)   $(error "ERROR: you have MAC80211 compiled into the kernel, CONFIG_MAC80211=y, as such you cannot replace its mac80211 driver. You need this set to CONFIG_MAC80211=m. If you are using Fedora upgrade your kernel as later version should this set as modular. For further information on Fedora see https://bugzilla.redhat.com/show_bug.cgi?id=470143. If you are using your own kernel recompile it and make mac80211 modular") -@@ -588,8 +588,8 @@ endif #CONFIG_COMPAT_KERNEL_27 +@@ -590,8 +590,8 @@ endif #CONFIG_COMPAT_KERNEL_27   # We need the backported rfkill module on kernel < 2.6.31.   # In more recent kernel versions use the in kernel rfkill module.   ifdef CONFIG_COMPAT_KERNEL_31 diff --git a/package/mac80211/patches/005-disable_ssb_build.patch b/package/mac80211/patches/005-disable_ssb_build.patch index 49be7b4f6..3120361a8 100644 --- a/package/mac80211/patches/005-disable_ssb_build.patch +++ b/package/mac80211/patches/005-disable_ssb_build.patch @@ -19,7 +19,7 @@   else   include $(KLIB_BUILD)/.config   endif -@@ -283,19 +282,18 @@ CONFIG_IPW2200_QOS=y +@@ -285,19 +284,18 @@ CONFIG_IPW2200_QOS=y   # % echo 1 > /sys/bus/pci/drivers/ipw2200/*/rtap_iface   endif #CONFIG_WIRELESS_EXT @@ -51,7 +51,7 @@   CONFIG_P54_PCI=m -@@ -484,7 +482,6 @@ endif #CONFIG_SPI_MASTER end of SPI driv +@@ -486,7 +484,6 @@ endif #CONFIG_SPI_MASTER end of SPI driv   ifdef CONFIG_MMC diff --git a/package/mac80211/patches/007-remove_misc_drivers.patch b/package/mac80211/patches/007-remove_misc_drivers.patch index 61acec5be..cb3fddb49 100644 --- a/package/mac80211/patches/007-remove_misc_drivers.patch +++ b/package/mac80211/patches/007-remove_misc_drivers.patch @@ -9,7 +9,7 @@   endif   # mac80211 test driver -@@ -324,13 +324,13 @@ endif #CONFIG_CRC_ITU_T +@@ -326,13 +326,13 @@ endif #CONFIG_CRC_ITU_T   CONFIG_MWL8K=m   # Ethernet drivers go here @@ -28,7 +28,7 @@   endif #CONFIG_COMPAT_KERNEL_27   ifdef CONFIG_WIRELESS_EXT -@@ -381,21 +381,21 @@ CONFIG_ZD1211RW=m +@@ -383,21 +383,21 @@ CONFIG_ZD1211RW=m   # Note: this depends on CONFIG_USB_NET_RNDIS_HOST and CONFIG_USB_NET_CDCETHER   # it also requires new RNDIS_HOST and CDC_ETHER modules which we add   ifdef CONFIG_COMPAT_KERNEL_29 diff --git a/package/mac80211/patches/008-led_default.patch b/package/mac80211/patches/008-led_default.patch index af7633c59..80d288708 100644 --- a/package/mac80211/patches/008-led_default.patch +++ b/package/mac80211/patches/008-led_default.patch @@ -9,7 +9,7 @@   # enable mesh networking too   CONFIG_MAC80211_MESH=y -@@ -240,7 +240,7 @@ CONFIG_B43_PCI_AUTOSELECT=y +@@ -242,7 +242,7 @@ CONFIG_B43_PCI_AUTOSELECT=y   ifdef CONFIG_PCMCIA   CONFIG_B43_PCMCIA=y   endif #CONFIG_PCMCIA @@ -18,7 +18,7 @@   CONFIG_B43_PHY_LP=y   CONFIG_B43_NPHY=y   # CONFIG_B43_FORCE_PIO=y -@@ -249,7 +249,7 @@ CONFIG_B43_NPHY=y +@@ -251,7 +251,7 @@ CONFIG_B43_NPHY=y   CONFIG_B43LEGACY=m   CONFIG_B43LEGACY_HWRNG=y   CONFIG_B43LEGACY_PCI_AUTOSELECT=y @@ -27,7 +27,7 @@   # CONFIG_B43LEGACY_DEBUG=y   CONFIG_B43LEGACY_DMA=y   CONFIG_B43LEGACY_PIO=y -@@ -559,7 +559,7 @@ endif +@@ -561,7 +561,7 @@ endif   # p54   CONFIG_P54_COMMON=m @@ -38,7 +38,7 @@   CONFIG_ATH_COMMON=m  --- a/drivers/net/wireless/ath/ath9k/htc_drv_main.c  +++ b/drivers/net/wireless/ath/ath9k/htc_drv_main.c -@@ -863,6 +863,7 @@ static void ath9k_led_brightness_work(st +@@ -864,6 +864,7 @@ static void ath9k_led_brightness_work(st   	}   } @@ -46,7 +46,7 @@   static void ath9k_led_brightness(struct led_classdev *led_cdev,   				 enum led_brightness brightness)   { -@@ -874,6 +875,7 @@ static void ath9k_led_brightness(struct  +@@ -875,6 +876,7 @@ static void ath9k_led_brightness(struct    		ieee80211_queue_delayed_work(priv->hw,   					     &led->brightness_work, 0);   } @@ -54,7 +54,7 @@   static void ath9k_led_stop_brightness(struct ath9k_htc_priv *priv)   { -@@ -886,6 +888,7 @@ static void ath9k_led_stop_brightness(st +@@ -887,6 +889,7 @@ static void ath9k_led_stop_brightness(st   static int ath9k_register_led(struct ath9k_htc_priv *priv, struct ath_led *led,   			      char *trigger)   { @@ -62,7 +62,7 @@   	int ret;   	led->priv = priv; -@@ -903,14 +906,19 @@ static int ath9k_register_led(struct ath +@@ -904,14 +907,19 @@ static int ath9k_register_led(struct ath   	INIT_DELAYED_WORK(&led->brightness_work, ath9k_led_brightness_work);   	return ret; diff --git a/package/mac80211/patches/010-no_pcmcia.patch b/package/mac80211/patches/010-no_pcmcia.patch index f16dac6d5..51189fc82 100644 --- a/package/mac80211/patches/010-no_pcmcia.patch +++ b/package/mac80211/patches/010-no_pcmcia.patch @@ -9,7 +9,7 @@   else   include $(KLIB_BUILD)/.config   endif -@@ -221,7 +221,7 @@ CONFIG_B43=m +@@ -223,7 +223,7 @@ CONFIG_B43=m   CONFIG_B43_HWRNG=y   CONFIG_B43_PCI_AUTOSELECT=y   ifdef CONFIG_PCMCIA diff --git a/package/mac80211/patches/011-no_sdio.patch b/package/mac80211/patches/011-no_sdio.patch index 0634a6a23..aba19b644 100644 --- a/package/mac80211/patches/011-no_sdio.patch +++ b/package/mac80211/patches/011-no_sdio.patch @@ -1,6 +1,6 @@  --- a/config.mk  +++ b/config.mk -@@ -465,7 +465,7 @@ endif #CONFIG_SPI_MASTER end of SPI driv +@@ -467,7 +467,7 @@ endif #CONFIG_SPI_MASTER end of SPI driv   ifdef CONFIG_MMC diff --git a/package/mac80211/patches/013-disable_b43_nphy.patch b/package/mac80211/patches/013-disable_b43_nphy.patch index 743d12351..4e970ef13 100644 --- a/package/mac80211/patches/013-disable_b43_nphy.patch +++ b/package/mac80211/patches/013-disable_b43_nphy.patch @@ -1,6 +1,6 @@  --- a/config.mk  +++ b/config.mk -@@ -225,7 +225,7 @@ ifdef CONFIG_PCMCIA +@@ -227,7 +227,7 @@ ifdef CONFIG_PCMCIA   endif #CONFIG_PCMCIA   # CONFIG_B43_LEDS=y   CONFIG_B43_PHY_LP=y diff --git a/package/mac80211/patches/015-remove-rt2x00-options.patch b/package/mac80211/patches/015-remove-rt2x00-options.patch index e785f3e5f..86b65b86c 100644 --- a/package/mac80211/patches/015-remove-rt2x00-options.patch +++ b/package/mac80211/patches/015-remove-rt2x00-options.patch @@ -1,6 +1,6 @@  --- a/config.mk  +++ b/config.mk -@@ -287,7 +287,7 @@ CONFIG_RTL8180=m +@@ -289,7 +289,7 @@ CONFIG_RTL8180=m   CONFIG_ADM8211=m @@ -9,7 +9,7 @@   CONFIG_RT2400PCI=m   CONFIG_RT2500PCI=m   ifdef CONFIG_CRC_CCITT -@@ -416,7 +416,7 @@ CONFIG_RT2800USB=m +@@ -418,7 +418,7 @@ CONFIG_RT2800USB=m   # CONFIG_RT2800USB_RT35XX=y   CONFIG_RT2800USB_UNKNOWN=y   endif #CONFIG_CRC_CCITT diff --git a/package/mac80211/patches/017-remove_ath9k_rc.patch b/package/mac80211/patches/017-remove_ath9k_rc.patch index f9e8756d4..7e275b042 100644 --- a/package/mac80211/patches/017-remove_ath9k_rc.patch +++ b/package/mac80211/patches/017-remove_ath9k_rc.patch @@ -1,6 +1,6 @@  --- a/config.mk  +++ b/config.mk -@@ -204,7 +204,7 @@ CONFIG_ATH9K_COMMON=m +@@ -206,7 +206,7 @@ CONFIG_ATH9K_COMMON=m   # as default once we get minstrel properly tested and blessed by   # our systems engineering team. CCK rates also need to be used   # for long range considerations. diff --git a/package/mac80211/patches/018-revert_printk_va_format.patch b/package/mac80211/patches/018-revert_printk_va_format.patch index d50022e5c..2cbc0f95e 100644 --- a/package/mac80211/patches/018-revert_printk_va_format.patch +++ b/package/mac80211/patches/018-revert_printk_va_format.patch @@ -1,27 +1,3 @@ ---- a/drivers/net/wireless/ath/debug.c -+++ b/drivers/net/wireless/ath/debug.c -@@ -19,19 +19,14 @@ -  - void ath_print(struct ath_common *common, int dbg_mask, const char *fmt, ...) - { --	struct va_format vaf; - 	va_list args; -  - 	if (likely(!(common->debug_mask & dbg_mask))) - 		return; -  - 	va_start(args, fmt); -- --	vaf.fmt = fmt; --	vaf.va = &args; -- --	printk(KERN_DEBUG "ath: %pV", &vaf); -- -+	printk(KERN_DEBUG "ath: "); -+	vprintk(fmt, args); - 	va_end(args); - } - EXPORT_SYMBOL(ath_print);  --- a/drivers/net/wireless/b43/main.c  +++ b/drivers/net/wireless/b43/main.c  @@ -322,83 +322,59 @@ static int b43_ratelimit(struct b43_wl * diff --git a/package/mac80211/patches/110-disable_usb_compat.patch b/package/mac80211/patches/110-disable_usb_compat.patch index 303d428a5..561e36924 100644 --- a/package/mac80211/patches/110-disable_usb_compat.patch +++ b/package/mac80211/patches/110-disable_usb_compat.patch @@ -33,7 +33,7 @@   #endif  --- a/config.mk  +++ b/config.mk -@@ -403,7 +403,7 @@ endif #CONFIG_COMPAT_KERNEL_29 +@@ -405,7 +405,7 @@ endif #CONFIG_COMPAT_KERNEL_29   # This activates a threading fix for usb urb.   # this is mainline commit: b3e670443b7fb8a2d29831b62b44a039c283e351   # This fix will be included in some stable releases. diff --git a/package/mac80211/patches/120-pr_fmt_warnings.patch b/package/mac80211/patches/120-pr_fmt_warnings.patch index 467949924..e080af709 100644 --- a/package/mac80211/patches/120-pr_fmt_warnings.patch +++ b/package/mac80211/patches/120-pr_fmt_warnings.patch @@ -58,16 +58,6 @@   #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt   #include <linux/if.h> ---- a/net/wireless/core.c.orig -+++ b/net/wireless/core.c.orig -@@ -4,6 +4,7 @@ -  * Copyright 2006-2010		Johannes Berg <johannes@sipsolutions.net> -  */ -  -+#undef pr_fmt - #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt -  - #include <linux/if.h>  --- a/net/wireless/lib80211.c  +++ b/net/wireless/lib80211.c  @@ -13,6 +13,7 @@ diff --git a/package/mac80211/patches/300-ath9k_gpio_settings.patch b/package/mac80211/patches/300-ath9k_gpio_settings.patch index a42b71f8a..56bf8ceee 100644 --- a/package/mac80211/patches/300-ath9k_gpio_settings.patch +++ b/package/mac80211/patches/300-ath9k_gpio_settings.patch @@ -1,6 +1,6 @@  --- a/drivers/net/wireless/ath/ath9k/debug.c  +++ b/drivers/net/wireless/ath/ath9k/debug.c -@@ -932,6 +932,12 @@ int ath9k_init_debug(struct ath_hw *ah) +@@ -927,6 +927,12 @@ int ath9k_init_debug(struct ath_hw *ah)   			sc->debug.debugfs_phy, &ah->config.cwm_ignore_extcca))   		goto err; @@ -15,7 +15,7 @@   err:  --- a/drivers/net/wireless/ath/ath9k/hw.h  +++ b/drivers/net/wireless/ath/ath9k/hw.h -@@ -790,6 +790,8 @@ struct ath_hw { +@@ -795,6 +795,8 @@ struct ath_hw {   	int initPDADC;   	int PDADCdelta;   	u8 led_pin; @@ -26,7 +26,7 @@   	struct ar5416IniArray iniCommon;  --- a/drivers/net/wireless/ath/ath9k/hw.c  +++ b/drivers/net/wireless/ath/ath9k/hw.c -@@ -1177,6 +1177,20 @@ static bool ath9k_hw_channel_change(stru +@@ -1171,6 +1171,20 @@ static bool ath9k_hw_channel_change(stru   	return true;   } @@ -47,7 +47,7 @@   bool ath9k_hw_check_alive(struct ath_hw *ah)   {   	int count = 50; -@@ -1463,6 +1477,8 @@ int ath9k_hw_reset(struct ath_hw *ah, st +@@ -1457,6 +1471,8 @@ int ath9k_hw_reset(struct ath_hw *ah, st   	if (AR_SREV_9300_20_OR_LATER(ah))   		ar9003_hw_bb_watchdog_config(ah); diff --git a/package/mac80211/patches/310-mac80211_tpt_led.patch b/package/mac80211/patches/310-mac80211_tpt_led.patch new file mode 100644 index 000000000..9318f8c46 --- /dev/null +++ b/package/mac80211/patches/310-mac80211_tpt_led.patch @@ -0,0 +1,470 @@ +--- a/net/mac80211/led.c ++++ b/net/mac80211/led.c +@@ -54,12 +54,22 @@ void ieee80211_led_radio(struct ieee8021 + 		led_trigger_event(local->radio_led, LED_OFF); + } +  ++void ieee80211_led_names(struct ieee80211_local *local) ++{ ++	snprintf(local->rx_led_name, sizeof(local->rx_led_name), ++		 "%srx", wiphy_name(local->hw.wiphy)); ++	snprintf(local->tx_led_name, sizeof(local->tx_led_name), ++		 "%stx", wiphy_name(local->hw.wiphy)); ++	snprintf(local->assoc_led_name, sizeof(local->assoc_led_name), ++		 "%sassoc", wiphy_name(local->hw.wiphy)); ++	snprintf(local->radio_led_name, sizeof(local->radio_led_name), ++		 "%sradio", wiphy_name(local->hw.wiphy)); ++} ++ + void ieee80211_led_init(struct ieee80211_local *local) + { + 	local->rx_led = kzalloc(sizeof(struct led_trigger), GFP_KERNEL); + 	if (local->rx_led) { +-		snprintf(local->rx_led_name, sizeof(local->rx_led_name), +-			 "%srx", wiphy_name(local->hw.wiphy)); + 		local->rx_led->name = local->rx_led_name; + 		if (led_trigger_register(local->rx_led)) { + 			kfree(local->rx_led); +@@ -69,8 +79,6 @@ void ieee80211_led_init(struct ieee80211 +  + 	local->tx_led = kzalloc(sizeof(struct led_trigger), GFP_KERNEL); + 	if (local->tx_led) { +-		snprintf(local->tx_led_name, sizeof(local->tx_led_name), +-			 "%stx", wiphy_name(local->hw.wiphy)); + 		local->tx_led->name = local->tx_led_name; + 		if (led_trigger_register(local->tx_led)) { + 			kfree(local->tx_led); +@@ -80,8 +88,6 @@ void ieee80211_led_init(struct ieee80211 +  + 	local->assoc_led = kzalloc(sizeof(struct led_trigger), GFP_KERNEL); + 	if (local->assoc_led) { +-		snprintf(local->assoc_led_name, sizeof(local->assoc_led_name), +-			 "%sassoc", wiphy_name(local->hw.wiphy)); + 		local->assoc_led->name = local->assoc_led_name; + 		if (led_trigger_register(local->assoc_led)) { + 			kfree(local->assoc_led); +@@ -91,14 +97,19 @@ void ieee80211_led_init(struct ieee80211 +  + 	local->radio_led = kzalloc(sizeof(struct led_trigger), GFP_KERNEL); + 	if (local->radio_led) { +-		snprintf(local->radio_led_name, sizeof(local->radio_led_name), +-			 "%sradio", wiphy_name(local->hw.wiphy)); + 		local->radio_led->name = local->radio_led_name; + 		if (led_trigger_register(local->radio_led)) { + 			kfree(local->radio_led); + 			local->radio_led = NULL; + 		} + 	} ++ ++	if (local->tpt_led_trigger) { ++		if (led_trigger_register(&local->tpt_led_trigger->trig)) { ++			kfree(local->tpt_led_trigger); ++			local->tpt_led_trigger = NULL; ++		} ++	} + } +  + void ieee80211_led_exit(struct ieee80211_local *local) +@@ -119,15 +130,18 @@ void ieee80211_led_exit(struct ieee80211 + 		led_trigger_unregister(local->rx_led); + 		kfree(local->rx_led); + 	} ++ ++	if (local->tpt_led_trigger) { ++		led_trigger_unregister(&local->tpt_led_trigger->trig); ++		kfree(local->tpt_led_trigger); ++	} + } +  + char *__ieee80211_get_radio_led_name(struct ieee80211_hw *hw) + { + 	struct ieee80211_local *local = hw_to_local(hw); +  +-	if (local->radio_led) +-		return local->radio_led_name; +-	return NULL; ++	return local->radio_led_name; + } + EXPORT_SYMBOL(__ieee80211_get_radio_led_name); +  +@@ -135,9 +149,7 @@ char *__ieee80211_get_assoc_led_name(str + { + 	struct ieee80211_local *local = hw_to_local(hw); +  +-	if (local->assoc_led) +-		return local->assoc_led_name; +-	return NULL; ++	return local->assoc_led_name; + } + EXPORT_SYMBOL(__ieee80211_get_assoc_led_name); +  +@@ -145,9 +157,7 @@ char *__ieee80211_get_tx_led_name(struct + { + 	struct ieee80211_local *local = hw_to_local(hw); +  +-	if (local->tx_led) +-		return local->tx_led_name; +-	return NULL; ++	return local->tx_led_name; + } + EXPORT_SYMBOL(__ieee80211_get_tx_led_name); +  +@@ -155,8 +165,115 @@ char *__ieee80211_get_rx_led_name(struct + { + 	struct ieee80211_local *local = hw_to_local(hw); +  +-	if (local->rx_led) +-		return local->rx_led_name; +-	return NULL; ++	return local->rx_led_name; + } + EXPORT_SYMBOL(__ieee80211_get_rx_led_name); ++ ++static unsigned long tpt_trig_traffic(struct ieee80211_local *local, ++				      struct tpt_led_trigger *tpt_trig) ++{ ++	unsigned long traffic, delta; ++ ++	traffic = tpt_trig->tx_bytes + tpt_trig->rx_bytes; ++ ++	delta = traffic - tpt_trig->prev_traffic; ++	tpt_trig->prev_traffic = traffic; ++	return DIV_ROUND_UP(delta, 1024 / 8); ++} ++ ++static void tpt_trig_timer(unsigned long data) ++{ ++	struct ieee80211_local *local = (void *)data; ++	struct tpt_led_trigger *tpt_trig = local->tpt_led_trigger; ++	struct led_classdev *led_cdev; ++	unsigned long on, off, tpt; ++	int i; ++ ++	if (!tpt_trig->running) ++		return; ++ ++	mod_timer(&tpt_trig->timer, round_jiffies(jiffies + HZ)); ++ ++	tpt = tpt_trig_traffic(local, tpt_trig); ++ ++	/* default to just solid on */ ++	on = 1; ++	off = 0; ++ ++	for (i = tpt_trig->blink_table_len - 1; i >= 0; i--) { ++		if (tpt_trig->blink_table[i].throughput < 0 || ++		    tpt > tpt_trig->blink_table[i].throughput) { ++			off = tpt_trig->blink_table[i].blink_time / 2; ++			on = tpt_trig->blink_table[i].blink_time - off; ++			break; ++		} ++	} ++ ++	read_lock(&tpt_trig->trig.leddev_list_lock); ++	list_for_each_entry(led_cdev, &tpt_trig->trig.led_cdevs, trig_list) ++		led_blink_set(led_cdev, &on, &off); ++	read_unlock(&tpt_trig->trig.leddev_list_lock); ++} ++ ++extern char *__ieee80211_create_tpt_led_trigger( ++				struct ieee80211_hw *hw, ++				const struct ieee80211_tpt_blink *blink_table, ++				unsigned int blink_table_len) ++{ ++	struct ieee80211_local *local = hw_to_local(hw); ++	struct tpt_led_trigger *tpt_trig; ++ ++	if (WARN_ON(local->tpt_led_trigger)) ++		return NULL; ++ ++	tpt_trig = kzalloc(sizeof(struct tpt_led_trigger), GFP_KERNEL); ++	if (!tpt_trig) ++		return NULL; ++ ++	snprintf(tpt_trig->name, sizeof(tpt_trig->name), ++		 "%stpt", wiphy_name(local->hw.wiphy)); ++ ++	tpt_trig->trig.name = tpt_trig->name; ++ ++	tpt_trig->blink_table = blink_table; ++	tpt_trig->blink_table_len = blink_table_len; ++ ++	setup_timer(&tpt_trig->timer, tpt_trig_timer, (unsigned long)local); ++ ++	local->tpt_led_trigger = tpt_trig; ++ ++	return tpt_trig->name; ++} ++EXPORT_SYMBOL(__ieee80211_create_tpt_led_trigger); ++ ++void ieee80211_start_tpt_led_trig(struct ieee80211_local *local) ++{ ++	struct tpt_led_trigger *tpt_trig = local->tpt_led_trigger; ++ ++	if (!tpt_trig) ++		return; ++ ++	/* reset traffic */ ++	tpt_trig_traffic(local, tpt_trig); ++	tpt_trig->running = true; ++ ++	tpt_trig_timer((unsigned long)local); ++	mod_timer(&tpt_trig->timer, round_jiffies(jiffies + HZ)); ++} ++ ++void ieee80211_stop_tpt_led_trig(struct ieee80211_local *local) ++{ ++	struct tpt_led_trigger *tpt_trig = local->tpt_led_trigger; ++	struct led_classdev *led_cdev; ++ ++	if (!tpt_trig) ++		return; ++ ++	tpt_trig->running = false; ++	del_timer_sync(&tpt_trig->timer); ++ ++	read_lock(&tpt_trig->trig.leddev_list_lock); ++	list_for_each_entry(led_cdev, &tpt_trig->trig.led_cdevs, trig_list) ++		led_brightness_set(led_cdev, LED_OFF); ++	read_unlock(&tpt_trig->trig.leddev_list_lock); ++} +--- a/net/mac80211/led.h ++++ b/net/mac80211/led.h +@@ -12,14 +12,17 @@ + #include "ieee80211_i.h" +  + #ifdef CONFIG_MAC80211_LEDS +-extern void ieee80211_led_rx(struct ieee80211_local *local); +-extern void ieee80211_led_tx(struct ieee80211_local *local, int q); +-extern void ieee80211_led_assoc(struct ieee80211_local *local, +-				bool associated); +-extern void ieee80211_led_radio(struct ieee80211_local *local, +-				bool enabled); +-extern void ieee80211_led_init(struct ieee80211_local *local); +-extern void ieee80211_led_exit(struct ieee80211_local *local); ++void ieee80211_led_rx(struct ieee80211_local *local); ++void ieee80211_led_tx(struct ieee80211_local *local, int q); ++void ieee80211_led_assoc(struct ieee80211_local *local, ++			 bool associated); ++void ieee80211_led_radio(struct ieee80211_local *local, ++			 bool enabled); ++void ieee80211_led_names(struct ieee80211_local *local); ++void ieee80211_led_init(struct ieee80211_local *local); ++void ieee80211_led_exit(struct ieee80211_local *local); ++void ieee80211_start_tpt_led_trig(struct ieee80211_local *local); ++void ieee80211_stop_tpt_led_trig(struct ieee80211_local *local); + #else + static inline void ieee80211_led_rx(struct ieee80211_local *local) + { +@@ -35,10 +38,37 @@ static inline void ieee80211_led_radio(s + 				       bool enabled) + { + } ++static inline void ieee80211_led_names(struct ieee80211_local *local) ++{ ++} + static inline void ieee80211_led_init(struct ieee80211_local *local) + { + } + static inline void ieee80211_led_exit(struct ieee80211_local *local) + { + } ++static inline void ieee80211_start_tpt_led_trig(struct ieee80211_local *local) ++{ ++} ++static inline void ieee80211_stop_tpt_led_trig(struct ieee80211_local *local) ++{ ++} ++#endif ++ ++static inline void ++ieee80211_tpt_led_trig_tx(struct ieee80211_local *local, __le16 fc, int bytes) ++{ ++#ifdef CONFIG_MAC80211_LEDS ++	if (local->tpt_led_trigger && ieee80211_is_data(fc)) ++		local->tpt_led_trigger->tx_bytes += bytes; ++#endif ++} ++ ++static inline void ++ieee80211_tpt_led_trig_rx(struct ieee80211_local *local, __le16 fc, int bytes) ++{ ++#ifdef CONFIG_MAC80211_LEDS ++	if (local->tpt_led_trigger && ieee80211_is_data(fc)) ++		local->tpt_led_trigger->rx_bytes += bytes; + #endif ++} +--- a/net/mac80211/main.c ++++ b/net/mac80211/main.c +@@ -602,6 +602,8 @@ struct ieee80211_hw *ieee80211_alloc_hw( + 	/* init dummy netdev for use w/ NAPI */ + 	init_dummy_netdev(&local->napi_dev); +  ++	ieee80211_led_names(local); ++ + 	return local_to_hw(local); + } + EXPORT_SYMBOL(ieee80211_alloc_hw); +--- a/include/net/mac80211.h ++++ b/include/net/mac80211.h +@@ -1856,11 +1856,26 @@ struct ieee80211_hw *ieee80211_alloc_hw( +  */ + int ieee80211_register_hw(struct ieee80211_hw *hw); +  ++/** ++ * struct ieee80211_tpt_blink - throughput blink description ++ * @throughput: throughput in Kbit/sec ++ * @blink_time: blink time in milliseconds ++ *	(full cycle, ie. one off + one on period) ++ */ ++struct ieee80211_tpt_blink { ++	int throughput; ++	int blink_time; ++}; ++ + #ifdef CONFIG_MAC80211_LEDS + extern char *__ieee80211_get_tx_led_name(struct ieee80211_hw *hw); + extern char *__ieee80211_get_rx_led_name(struct ieee80211_hw *hw); + extern char *__ieee80211_get_assoc_led_name(struct ieee80211_hw *hw); + extern char *__ieee80211_get_radio_led_name(struct ieee80211_hw *hw); ++extern char *__ieee80211_create_tpt_led_trigger( ++				struct ieee80211_hw *hw, ++				const struct ieee80211_tpt_blink *blink_table, ++				unsigned int blink_table_len); + #endif + /** +  * ieee80211_get_tx_led_name - get name of TX LED +@@ -1939,6 +1954,29 @@ static inline char *ieee80211_get_radio_ + } +  + /** ++ * ieee80211_create_tpt_led_trigger - create throughput LED trigger ++ * @hw: the hardware to create the trigger for ++ * @blink_table: the blink table -- needs to be ordered by throughput ++ * @blink_table_len: size of the blink table ++ * ++ * This function returns %NULL (in case of error, or if no LED ++ * triggers are configured) or the name of the new trigger. ++ * This function must be called before ieee80211_register_hw(). ++ */ ++static inline char * ++ieee80211_create_tpt_led_trigger(struct ieee80211_hw *hw, ++				 const struct ieee80211_tpt_blink *blink_table, ++				 unsigned int blink_table_len) ++{ ++#ifdef CONFIG_MAC80211_LEDS ++	return __ieee80211_create_tpt_led_trigger(hw, blink_table, ++						  blink_table_len); ++#else ++	return NULL; ++#endif ++} ++ ++/** +  * ieee80211_unregister_hw - Unregister a hardware device +  * +  * This function instructs mac80211 to free allocated resources +--- a/net/mac80211/ieee80211_i.h ++++ b/net/mac80211/ieee80211_i.h +@@ -23,6 +23,7 @@ + #include <linux/types.h> + #include <linux/spinlock.h> + #include <linux/etherdevice.h> ++#include <linux/leds.h> + #include <net/ieee80211_radiotap.h> + #include <net/cfg80211.h> + #include <net/mac80211.h> +@@ -629,6 +630,19 @@ enum queue_stop_reason { + 	IEEE80211_QUEUE_STOP_REASON_SKB_ADD, + }; +  ++#ifdef CONFIG_MAC80211_LEDS ++struct tpt_led_trigger { ++	struct led_trigger trig; ++	char name[32]; ++	const struct ieee80211_tpt_blink *blink_table; ++	unsigned int blink_table_len; ++	struct timer_list timer; ++	bool running; ++	unsigned long prev_traffic; ++	unsigned long tx_bytes, rx_bytes; ++}; ++#endif ++ + /** +  * mac80211 scan flags - currently active scan mode +  * +@@ -842,6 +856,7 @@ struct ieee80211_local { + #ifdef CONFIG_MAC80211_LEDS + 	int tx_led_counter, rx_led_counter; + 	struct led_trigger *tx_led, *rx_led, *assoc_led, *radio_led; ++	struct tpt_led_trigger *tpt_led_trigger; + 	char tx_led_name[32], rx_led_name[32], + 	     assoc_led_name[32], radio_led_name[32]; + #endif +--- a/net/mac80211/iface.c ++++ b/net/mac80211/iface.c +@@ -220,6 +220,7 @@ static int ieee80211_do_open(struct net_ + 		/* we're brought up, everything changes */ + 		hw_reconf_flags = ~0; + 		ieee80211_led_radio(local, true); ++		ieee80211_start_tpt_led_trig(local); + 	} +  + 	/* +--- a/net/mac80211/rx.c ++++ b/net/mac80211/rx.c +@@ -2888,6 +2888,9 @@ void ieee80211_rx(struct ieee80211_hw *h + 		return; + 	} +  ++	ieee80211_tpt_led_trig_rx(local, ++			((struct ieee80211_hdr *)skb->data)->frame_control, ++			skb->len); + 	__ieee80211_rx_handle_packet(hw, skb); +  + 	rcu_read_unlock(); +--- a/net/mac80211/tx.c ++++ b/net/mac80211/tx.c +@@ -1293,6 +1293,7 @@ static int __ieee80211_tx(struct ieee802 +  + 	while (skb) { + 		int q = skb_get_queue_mapping(skb); ++		__le16 fc; +  + 		spin_lock_irqsave(&local->queue_stop_reason_lock, flags); + 		ret = IEEE80211_TX_OK; +@@ -1335,6 +1336,7 @@ static int __ieee80211_tx(struct ieee802 + 		else + 			info->control.sta = NULL; +  ++		fc = ((struct ieee80211_hdr *)skb->data)->frame_control; + 		ret = drv_tx(local, skb); + 		if (WARN_ON(ret != NETDEV_TX_OK && skb->len != len)) { + 			dev_kfree_skb(skb); +@@ -1345,6 +1347,7 @@ static int __ieee80211_tx(struct ieee802 + 			return IEEE80211_TX_AGAIN; + 		} +  ++		ieee80211_tpt_led_trig_tx(local, fc, len); + 		*skbp = skb = next; + 		ieee80211_led_tx(local, 1); + 		fragm = true; +--- a/net/mac80211/util.c ++++ b/net/mac80211/util.c +@@ -1141,6 +1141,7 @@ u32 ieee80211_sta_get_rates(struct ieee8 + void ieee80211_stop_device(struct ieee80211_local *local) + { + 	ieee80211_led_radio(local, false); ++	ieee80211_stop_tpt_led_trig(local); +  + 	cancel_work_sync(&local->reconfig_filter); +  +@@ -1175,6 +1176,7 @@ int ieee80211_reconfig(struct ieee80211_ + 		} +  + 		ieee80211_led_radio(local, true); ++		ieee80211_start_tpt_led_trig(local); + 	} +  + 	/* add interfaces */ diff --git a/package/mac80211/patches/310-pending_endian_fixes.patch b/package/mac80211/patches/310-pending_endian_fixes.patch deleted file mode 100644 index 7f27965d0..000000000 --- a/package/mac80211/patches/310-pending_endian_fixes.patch +++ /dev/null @@ -1,725 +0,0 @@ ---- a/drivers/net/wireless/ath/ath9k/ar9003_eeprom.c -+++ b/drivers/net/wireless/ath/ath9k/ar9003_eeprom.c -@@ -57,6 +57,8 @@ - #define SUB_NUM_CTL_MODES_AT_5G_40 2    /* excluding HT40, EXT-OFDM */ - #define SUB_NUM_CTL_MODES_AT_2G_40 3    /* excluding HT40, EXT-OFDM, EXT-CCK */ -  -+#define CTL(_tpower, _flag) ((_tpower) | ((_flag) << 6)) -+ - static int ar9003_hw_power_interpolate(int32_t x, - 				       int32_t *px, int32_t *py, u_int16_t np); - static const struct ar9300_eeprom ar9300_default = { -@@ -296,21 +298,21 @@ static const struct ar9300_eeprom ar9300 - 		} - 	 }, - 	.ctlPowerData_2G = { --		 { { {60, 0}, {60, 1}, {60, 0}, {60, 0} } }, --		 { { {60, 0}, {60, 1}, {60, 0}, {60, 0} } }, --		 { { {60, 1}, {60, 0}, {60, 0}, {60, 1} } }, -- --		 { { {60, 1}, {60, 0}, {0, 0}, {0, 0} } }, --		 { { {60, 0}, {60, 1}, {60, 0}, {60, 0} } }, --		 { { {60, 0}, {60, 1}, {60, 0}, {60, 0} } }, -- --		 { { {60, 0}, {60, 1}, {60, 1}, {60, 0} } }, --		 { { {60, 0}, {60, 1}, {60, 0}, {60, 0} } }, --		 { { {60, 0}, {60, 1}, {60, 0}, {60, 0} } }, -- --		 { { {60, 0}, {60, 1}, {60, 0}, {60, 0} } }, --		 { { {60, 0}, {60, 1}, {60, 1}, {60, 1} } }, --		 { { {60, 0}, {60, 1}, {60, 1}, {60, 1} } }, -+		 { { CTL(60, 0), CTL(60, 1), CTL(60, 0), CTL(60, 0) } }, -+		 { { CTL(60, 0), CTL(60, 1), CTL(60, 0), CTL(60, 0) } }, -+		 { { CTL(60, 1), CTL(60, 0), CTL(60, 0), CTL(60, 1) } }, -+ -+		 { { CTL(60, 1), CTL(60, 0), CTL(0, 0), CTL(0, 0) } }, -+		 { { CTL(60, 0), CTL(60, 1), CTL(60, 0), CTL(60, 0) } }, -+		 { { CTL(60, 0), CTL(60, 1), CTL(60, 0), CTL(60, 0) } }, -+ -+		 { { CTL(60, 0), CTL(60, 1), CTL(60, 1), CTL(60, 0) } }, -+		 { { CTL(60, 0), CTL(60, 1), CTL(60, 0), CTL(60, 0) } }, -+		 { { CTL(60, 0), CTL(60, 1), CTL(60, 0), CTL(60, 0) } }, -+ -+		 { { CTL(60, 0), CTL(60, 1), CTL(60, 0), CTL(60, 0) } }, -+		 { { CTL(60, 0), CTL(60, 1), CTL(60, 1), CTL(60, 1) } }, -+		 { { CTL(60, 0), CTL(60, 1), CTL(60, 1), CTL(60, 1) } }, - 	 }, - 	.modalHeader5G = { - 		/* 4 idle,t1,t2,b (4 bits per setting) */ -@@ -582,56 +584,56 @@ static const struct ar9300_eeprom ar9300 - 	.ctlPowerData_5G = { - 		{ - 			{ --				{60, 1}, {60, 1}, {60, 1}, {60, 1}, --				{60, 1}, {60, 1}, {60, 1}, {60, 0}, -+				CTL(60, 1), CTL(60, 1), CTL(60, 1), CTL(60, 1), -+				CTL(60, 1), CTL(60, 1), CTL(60, 1), CTL(60, 0), - 			} - 		}, - 		{ - 			{ --				{60, 1}, {60, 1}, {60, 1}, {60, 1}, --				{60, 1}, {60, 1}, {60, 1}, {60, 0}, -+				CTL(60, 1), CTL(60, 1), CTL(60, 1), CTL(60, 1), -+				CTL(60, 1), CTL(60, 1), CTL(60, 1), CTL(60, 0), - 			} - 		}, - 		{ - 			{ --				{60, 0}, {60, 1}, {60, 0}, {60, 1}, --				{60, 1}, {60, 1}, {60, 1}, {60, 1}, -+				CTL(60, 0), CTL(60, 1), CTL(60, 0), CTL(60, 1), -+				CTL(60, 1), CTL(60, 1), CTL(60, 1), CTL(60, 1), - 			} - 		}, - 		{ - 			{ --				{60, 0}, {60, 1}, {60, 1}, {60, 0}, --				{60, 1}, {60, 0}, {60, 0}, {60, 0}, -+				CTL(60, 0), CTL(60, 1), CTL(60, 1), CTL(60, 0), -+				CTL(60, 1), CTL(60, 0), CTL(60, 0), CTL(60, 0), - 			} - 		}, - 		{ - 			{ --				{60, 1}, {60, 1}, {60, 1}, {60, 0}, --				{60, 0}, {60, 0}, {60, 0}, {60, 0}, -+				CTL(60, 1), CTL(60, 1), CTL(60, 1), CTL(60, 0), -+				CTL(60, 0), CTL(60, 0), CTL(60, 0), CTL(60, 0), - 			} - 		}, - 		{ - 			{ --				{60, 1}, {60, 1}, {60, 1}, {60, 1}, --				{60, 1}, {60, 0}, {60, 0}, {60, 0}, -+				CTL(60, 1), CTL(60, 1), CTL(60, 1), CTL(60, 1), -+				CTL(60, 1), CTL(60, 0), CTL(60, 0), CTL(60, 0), - 			} - 		}, - 		{ - 			{ --				{60, 1}, {60, 1}, {60, 1}, {60, 1}, --				{60, 1}, {60, 1}, {60, 1}, {60, 1}, -+				CTL(60, 1), CTL(60, 1), CTL(60, 1), CTL(60, 1), -+				CTL(60, 1), CTL(60, 1), CTL(60, 1), CTL(60, 1), - 			} - 		}, - 		{ - 			{ --				{60, 1}, {60, 1}, {60, 0}, {60, 1}, --				{60, 1}, {60, 1}, {60, 1}, {60, 0}, -+				CTL(60, 1), CTL(60, 1), CTL(60, 0), CTL(60, 1), -+				CTL(60, 1), CTL(60, 1), CTL(60, 1), CTL(60, 0), - 			} - 		}, - 		{ - 			{ --				{60, 1}, {60, 0}, {60, 1}, {60, 1}, --				{60, 1}, {60, 1}, {60, 0}, {60, 1}, -+				CTL(60, 1), CTL(60, 0), CTL(60, 1), CTL(60, 1), -+				CTL(60, 1), CTL(60, 1), CTL(60, 0), CTL(60, 1), - 			} - 		}, - 	 } -@@ -873,21 +875,21 @@ static const struct ar9300_eeprom ar9300 - 		} - 	 }, - 	.ctlPowerData_2G = { --		 { { {60, 0}, {60, 1}, {60, 0}, {60, 0} } }, --		 { { {60, 0}, {60, 1}, {60, 0}, {60, 0} } }, --		 { { {60, 1}, {60, 0}, {60, 0}, {60, 1} } }, -- --		 { { {60, 1}, {60, 0}, {0, 0}, {0, 0} } }, --		 { { {60, 0}, {60, 1}, {60, 0}, {60, 0} } }, --		 { { {60, 0}, {60, 1}, {60, 0}, {60, 0} } }, -- --		 { { {60, 0}, {60, 1}, {60, 1}, {60, 0} } }, --		 { { {60, 0}, {60, 1}, {60, 0}, {60, 0} } }, --		 { { {60, 0}, {60, 1}, {60, 0}, {60, 0} } }, -- --		 { { {60, 0}, {60, 1}, {60, 0}, {60, 0} } }, --		 { { {60, 0}, {60, 1}, {60, 1}, {60, 1} } }, --		 { { {60, 0}, {60, 1}, {60, 1}, {60, 1} } }, -+		 { { CTL(60, 0), CTL(60, 1), CTL(60, 0), CTL(60, 0) } }, -+		 { { CTL(60, 0), CTL(60, 1), CTL(60, 0), CTL(60, 0) } }, -+		 { { CTL(60, 1), CTL(60, 0), CTL(60, 0), CTL(60, 1) } }, -+ -+		 { { CTL(60, 1), CTL(60, 0), CTL(0, 0), CTL(0, 0) } }, -+		 { { CTL(60, 0), CTL(60, 1), CTL(60, 0), CTL(60, 0) } }, -+		 { { CTL(60, 0), CTL(60, 1), CTL(60, 0), CTL(60, 0) } }, -+ -+		 { { CTL(60, 0), CTL(60, 1), CTL(60, 1), CTL(60, 0) } }, -+		 { { CTL(60, 0), CTL(60, 1), CTL(60, 0), CTL(60, 0) } }, -+		 { { CTL(60, 0), CTL(60, 1), CTL(60, 0), CTL(60, 0) } }, -+ -+		 { { CTL(60, 0), CTL(60, 1), CTL(60, 0), CTL(60, 0) } }, -+		 { { CTL(60, 0), CTL(60, 1), CTL(60, 1), CTL(60, 1) } }, -+		 { { CTL(60, 0), CTL(60, 1), CTL(60, 1), CTL(60, 1) } }, - 	 }, - 	.modalHeader5G = { - 		/* 4 idle,t1,t2,b (4 bits per setting) */ -@@ -1159,56 +1161,56 @@ static const struct ar9300_eeprom ar9300 - 	.ctlPowerData_5G = { - 		{ - 			{ --				{60, 1}, {60, 1}, {60, 1}, {60, 1}, --				{60, 1}, {60, 1}, {60, 1}, {60, 0}, -+				CTL(60, 1), CTL(60, 1), CTL(60, 1), CTL(60, 1), -+				CTL(60, 1), CTL(60, 1), CTL(60, 1), CTL(60, 0), - 			} - 		}, - 		{ - 			{ --				{60, 1}, {60, 1}, {60, 1}, {60, 1}, --				{60, 1}, {60, 1}, {60, 1}, {60, 0}, -+				CTL(60, 1), CTL(60, 1), CTL(60, 1), CTL(60, 1), -+				CTL(60, 1), CTL(60, 1), CTL(60, 1), CTL(60, 0), - 			} - 		}, - 		{ - 			{ --				{60, 0}, {60, 1}, {60, 0}, {60, 1}, --				{60, 1}, {60, 1}, {60, 1}, {60, 1}, -+				CTL(60, 0), CTL(60, 1), CTL(60, 0), CTL(60, 1), -+				CTL(60, 1), CTL(60, 1), CTL(60, 1), CTL(60, 1), - 			} - 		}, - 		{ - 			{ --				{60, 0}, {60, 1}, {60, 1}, {60, 0}, --				{60, 1}, {60, 0}, {60, 0}, {60, 0}, -+				CTL(60, 0), CTL(60, 1), CTL(60, 1), CTL(60, 0), -+				CTL(60, 1), CTL(60, 0), CTL(60, 0), CTL(60, 0), - 			} - 		}, - 		{ - 			{ --				{60, 1}, {60, 1}, {60, 1}, {60, 0}, --				{60, 0}, {60, 0}, {60, 0}, {60, 0}, -+				CTL(60, 1), CTL(60, 1), CTL(60, 1), CTL(60, 0), -+				CTL(60, 0), CTL(60, 0), CTL(60, 0), CTL(60, 0), - 			} - 		}, - 		{ - 			{ --				{60, 1}, {60, 1}, {60, 1}, {60, 1}, --				{60, 1}, {60, 0}, {60, 0}, {60, 0}, -+				CTL(60, 1), CTL(60, 1), CTL(60, 1), CTL(60, 1), -+				CTL(60, 1), CTL(60, 0), CTL(60, 0), CTL(60, 0), - 			} - 		}, - 		{ - 			{ --				{60, 1}, {60, 1}, {60, 1}, {60, 1}, --				{60, 1}, {60, 1}, {60, 1}, {60, 1}, -+				CTL(60, 1), CTL(60, 1), CTL(60, 1), CTL(60, 1), -+				CTL(60, 1), CTL(60, 1), CTL(60, 1), CTL(60, 1), - 			} - 		}, - 		{ - 			{ --				{60, 1}, {60, 1}, {60, 0}, {60, 1}, --				{60, 1}, {60, 1}, {60, 1}, {60, 0}, -+				CTL(60, 1), CTL(60, 1), CTL(60, 0), CTL(60, 1), -+				CTL(60, 1), CTL(60, 1), CTL(60, 1), CTL(60, 0), - 			} - 		}, - 		{ - 			{ --				{60, 1}, {60, 0}, {60, 1}, {60, 1}, --				{60, 1}, {60, 1}, {60, 0}, {60, 1}, -+				CTL(60, 1), CTL(60, 0), CTL(60, 1), CTL(60, 1), -+				CTL(60, 1), CTL(60, 1), CTL(60, 0), CTL(60, 1), - 			} - 		}, - 	 } -@@ -1451,21 +1453,21 @@ static const struct ar9300_eeprom ar9300 - 		} - 	}, - 	.ctlPowerData_2G = { --		{ { {60, 0}, {60, 1}, {60, 0}, {60, 0} } }, --		{ { {60, 0}, {60, 1}, {60, 0}, {60, 0} } }, --		{ { {60, 1}, {60, 0}, {60, 0}, {60, 1} } }, -- --		{ { {60, 1}, {60, 0}, {0, 0}, {0, 0} } }, --		{ { {60, 0}, {60, 1}, {60, 0}, {60, 0} } }, --		{ { {60, 0}, {60, 1}, {60, 0}, {60, 0} } }, -- --		{ { {60, 0}, {60, 1}, {60, 1}, {60, 0} } }, --		{ { {60, 0}, {60, 1}, {60, 0}, {60, 0} } }, --		{ { {60, 0}, {60, 1}, {60, 0}, {60, 0} } }, -- --		{ { {60, 0}, {60, 1}, {60, 0}, {60, 0} } }, --		{ { {60, 0}, {60, 1}, {60, 1}, {60, 1} } }, --		{ { {60, 0}, {60, 1}, {60, 1}, {60, 1} } }, -+		{ { CTL(60, 0), CTL(60, 1), CTL(60, 0), CTL(60, 0) } }, -+		{ { CTL(60, 0), CTL(60, 1), CTL(60, 0), CTL(60, 0) } }, -+		{ { CTL(60, 1), CTL(60, 0), CTL(60, 0), CTL(60, 1) } }, -+ -+		{ { CTL(60, 1), CTL(60, 0), CTL(0, 0), CTL(0, 0) } }, -+		{ { CTL(60, 0), CTL(60, 1), CTL(60, 0), CTL(60, 0) } }, -+		{ { CTL(60, 0), CTL(60, 1), CTL(60, 0), CTL(60, 0) } }, -+ -+		{ { CTL(60, 0), CTL(60, 1), CTL(60, 1), CTL(60, 0) } }, -+		{ { CTL(60, 0), CTL(60, 1), CTL(60, 0), CTL(60, 0) } }, -+		{ { CTL(60, 0), CTL(60, 1), CTL(60, 0), CTL(60, 0) } }, -+ -+		{ { CTL(60, 0), CTL(60, 1), CTL(60, 0), CTL(60, 0) } }, -+		{ { CTL(60, 0), CTL(60, 1), CTL(60, 1), CTL(60, 1) } }, -+		{ { CTL(60, 0), CTL(60, 1), CTL(60, 1), CTL(60, 1) } }, - 	}, - 	.modalHeader5G = { - 		/* 4 idle,t1,t2,b (4 bits per setting) */ -@@ -1737,56 +1739,56 @@ static const struct ar9300_eeprom ar9300 - 	.ctlPowerData_5G = { - 		{ - 			{ --				{60, 1}, {60, 1}, {60, 1}, {60, 1}, --				{60, 1}, {60, 1}, {60, 1}, {60, 0}, -+				CTL(60, 1), CTL(60, 1), CTL(60, 1), CTL(60, 1), -+				CTL(60, 1), CTL(60, 1), CTL(60, 1), CTL(60, 0), - 			} - 		}, - 		{ - 			{ --				{60, 1}, {60, 1}, {60, 1}, {60, 1}, --				{60, 1}, {60, 1}, {60, 1}, {60, 0}, -+				CTL(60, 1), CTL(60, 1), CTL(60, 1), CTL(60, 1), -+				CTL(60, 1), CTL(60, 1), CTL(60, 1), CTL(60, 0), - 			} - 		}, - 		{ - 			{ --				{60, 0}, {60, 1}, {60, 0}, {60, 1}, --				{60, 1}, {60, 1}, {60, 1}, {60, 1}, -+				CTL(60, 0), CTL(60, 1), CTL(60, 0), CTL(60, 1), -+				CTL(60, 1), CTL(60, 1), CTL(60, 1), CTL(60, 1), - 			} - 		}, - 		{ - 			{ --				{60, 0}, {60, 1}, {60, 1}, {60, 0}, --				{60, 1}, {60, 0}, {60, 0}, {60, 0}, -+				CTL(60, 0), CTL(60, 1), CTL(60, 1), CTL(60, 0), -+				CTL(60, 1), CTL(60, 0), CTL(60, 0), CTL(60, 0), - 			} - 		}, - 		{ - 			{ --				{60, 1}, {60, 1}, {60, 1}, {60, 0}, --				{60, 0}, {60, 0}, {60, 0}, {60, 0}, -+				CTL(60, 1), CTL(60, 1), CTL(60, 1), CTL(60, 0), -+				CTL(60, 0), CTL(60, 0), CTL(60, 0), CTL(60, 0), - 			} - 		}, - 		{ - 			{ --				{60, 1}, {60, 1}, {60, 1}, {60, 1}, --				{60, 1}, {60, 0}, {60, 0}, {60, 0}, -+				CTL(60, 1), CTL(60, 1), CTL(60, 1), CTL(60, 1), -+				CTL(60, 1), CTL(60, 0), CTL(60, 0), CTL(60, 0), - 			} - 		}, - 		{ - 			{ --				{60, 1}, {60, 1}, {60, 1}, {60, 1}, --				{60, 1}, {60, 1}, {60, 1}, {60, 1}, -+				CTL(60, 1), CTL(60, 1), CTL(60, 1), CTL(60, 1), -+				CTL(60, 1), CTL(60, 1), CTL(60, 1), CTL(60, 1), - 			} - 		}, - 		{ - 			{ --				{60, 1}, {60, 1}, {60, 0}, {60, 1}, --				{60, 1}, {60, 1}, {60, 1}, {60, 0}, -+				CTL(60, 1), CTL(60, 1), CTL(60, 0), CTL(60, 1), -+				CTL(60, 1), CTL(60, 1), CTL(60, 1), CTL(60, 0), - 			} - 		}, - 		{ - 			{ --				{60, 1}, {60, 0}, {60, 1}, {60, 1}, --				{60, 1}, {60, 1}, {60, 0}, {60, 1}, -+				CTL(60, 1), CTL(60, 0), CTL(60, 1), CTL(60, 1), -+				CTL(60, 1), CTL(60, 1), CTL(60, 0), CTL(60, 1), - 			} - 		}, - 	} -@@ -2029,21 +2031,21 @@ static const struct ar9300_eeprom ar9300 - 		} - 	}, - 	.ctlPowerData_2G = { --		{ { {60, 0}, {60, 1}, {60, 0}, {60, 0} } }, --		{ { {60, 0}, {60, 1}, {60, 0}, {60, 0} } }, --		{ { {60, 1}, {60, 0}, {60, 0}, {60, 1} } }, -- --		{ { {60, 1}, {60, 0}, {0, 0}, {0, 0} } }, --		{ { {60, 0}, {60, 1}, {60, 0}, {60, 0} } }, --		{ { {60, 0}, {60, 1}, {60, 0}, {60, 0} } }, -- --		{ { {60, 0}, {60, 1}, {60, 1}, {60, 0} } }, --		{ { {60, 0}, {60, 1}, {60, 0}, {60, 0} } }, --		{ { {60, 0}, {60, 1}, {60, 0}, {60, 0} } }, -- --		{ { {60, 0}, {60, 1}, {60, 0}, {60, 0} } }, --		{ { {60, 0}, {60, 1}, {60, 1}, {60, 1} } }, --		{ { {60, 0}, {60, 1}, {60, 1}, {60, 1} } }, -+		{ { CTL(60, 0), CTL(60, 1), CTL(60, 0), CTL(60, 0) } }, -+		{ { CTL(60, 0), CTL(60, 1), CTL(60, 0), CTL(60, 0) } }, -+		{ { CTL(60, 1), CTL(60, 0), CTL(60, 0), CTL(60, 1) } }, -+ -+		{ { CTL(60, 1), CTL(60, 0), CTL(0, 0), CTL(0, 0) } }, -+		{ { CTL(60, 0), CTL(60, 1), CTL(60, 0), CTL(60, 0) } }, -+		{ { CTL(60, 0), CTL(60, 1), CTL(60, 0), CTL(60, 0) } }, -+ -+		{ { CTL(60, 0), CTL(60, 1), CTL(60, 1), CTL(60, 0) } }, -+		{ { CTL(60, 0), CTL(60, 1), CTL(60, 0), CTL(60, 0) } }, -+		{ { CTL(60, 0), CTL(60, 1), CTL(60, 0), CTL(60, 0) } }, -+ -+		{ { CTL(60, 0), CTL(60, 1), CTL(60, 0), CTL(60, 0) } }, -+		{ { CTL(60, 0), CTL(60, 1), CTL(60, 1), CTL(60, 1) } }, -+		{ { CTL(60, 0), CTL(60, 1), CTL(60, 1), CTL(60, 1) } }, - 	}, - 	.modalHeader5G = { - 		/* 4 idle,t1,t2,b (4 bits per setting) */ -@@ -2315,56 +2317,56 @@ static const struct ar9300_eeprom ar9300 - 	.ctlPowerData_5G = { - 		{ - 			{ --				{60, 1}, {60, 1}, {60, 1}, {60, 1}, --				{60, 1}, {60, 1}, {60, 1}, {60, 0}, -+				CTL(60, 1), CTL(60, 1), CTL(60, 1), CTL(60, 1), -+				CTL(60, 1), CTL(60, 1), CTL(60, 1), CTL(60, 0), - 			} - 		}, - 		{ - 			{ --				{60, 1}, {60, 1}, {60, 1}, {60, 1}, --				{60, 1}, {60, 1}, {60, 1}, {60, 0}, -+				CTL(60, 1), CTL(60, 1), CTL(60, 1), CTL(60, 1), -+				CTL(60, 1), CTL(60, 1), CTL(60, 1), CTL(60, 0), - 			} - 		}, - 		{ - 			{ --				{60, 0}, {60, 1}, {60, 0}, {60, 1}, --				{60, 1}, {60, 1}, {60, 1}, {60, 1}, -+				CTL(60, 0), CTL(60, 1), CTL(60, 0), CTL(60, 1), -+				CTL(60, 1), CTL(60, 1), CTL(60, 1), CTL(60, 1), - 			} - 		}, - 		{ - 			{ --				{60, 0}, {60, 1}, {60, 1}, {60, 0}, --				{60, 1}, {60, 0}, {60, 0}, {60, 0}, -+				CTL(60, 0), CTL(60, 1), CTL(60, 1), CTL(60, 0), -+				CTL(60, 1), CTL(60, 0), CTL(60, 0), CTL(60, 0), - 			} - 		}, - 		{ - 			{ --				{60, 1}, {60, 1}, {60, 1}, {60, 0}, --				{60, 0}, {60, 0}, {60, 0}, {60, 0}, -+				CTL(60, 1), CTL(60, 1), CTL(60, 1), CTL(60, 0), -+				CTL(60, 0), CTL(60, 0), CTL(60, 0), CTL(60, 0), - 			} - 		}, - 		{ - 			{ --				{60, 1}, {60, 1}, {60, 1}, {60, 1}, --				{60, 1}, {60, 0}, {60, 0}, {60, 0}, -+				CTL(60, 1), CTL(60, 1), CTL(60, 1), CTL(60, 1), -+				CTL(60, 1), CTL(60, 0), CTL(60, 0), CTL(60, 0), - 			} - 		}, - 		{ - 			{ --				{60, 1}, {60, 1}, {60, 1}, {60, 1}, --				{60, 1}, {60, 1}, {60, 1}, {60, 1}, -+				CTL(60, 1), CTL(60, 1), CTL(60, 1), CTL(60, 1), -+				CTL(60, 1), CTL(60, 1), CTL(60, 1), CTL(60, 1), - 			} - 		}, - 		{ - 			{ --				{60, 1}, {60, 1}, {60, 0}, {60, 1}, --				{60, 1}, {60, 1}, {60, 1}, {60, 0}, -+				CTL(60, 1), CTL(60, 1), CTL(60, 0), CTL(60, 1), -+				CTL(60, 1), CTL(60, 1), CTL(60, 1), CTL(60, 0), - 			} - 		}, - 		{ - 			{ --				{60, 1}, {60, 0}, {60, 1}, {60, 1}, --				{60, 1}, {60, 1}, {60, 0}, {60, 1}, -+				CTL(60, 1), CTL(60, 0), CTL(60, 1), CTL(60, 1), -+				CTL(60, 1), CTL(60, 1), CTL(60, 0), CTL(60, 1), - 			} - 		}, - 	} -@@ -2606,21 +2608,21 @@ static const struct ar9300_eeprom ar9300 - 		} - 	 }, - 	.ctlPowerData_2G = { --		 { { {60, 0}, {60, 1}, {60, 0}, {60, 0} } }, --		 { { {60, 0}, {60, 1}, {60, 0}, {60, 0} } }, --		 { { {60, 1}, {60, 0}, {60, 0}, {60, 1} } }, -- --		 { { {60, 1}, {60, 0}, {0, 0}, {0, 0} } }, --		 { { {60, 0}, {60, 1}, {60, 0}, {60, 0} } }, --		 { { {60, 0}, {60, 1}, {60, 0}, {60, 0} } }, -- --		 { { {60, 0}, {60, 1}, {60, 1}, {60, 0} } }, --		 { { {60, 0}, {60, 1}, {60, 0}, {60, 0} } }, --		 { { {60, 0}, {60, 1}, {60, 0}, {60, 0} } }, -- --		 { { {60, 0}, {60, 1}, {60, 0}, {60, 0} } }, --		 { { {60, 0}, {60, 1}, {60, 1}, {60, 1} } }, --		 { { {60, 0}, {60, 1}, {60, 1}, {60, 1} } }, -+		 { { CTL(60, 0), CTL(60, 1), CTL(60, 0), CTL(60, 0) } }, -+		 { { CTL(60, 0), CTL(60, 1), CTL(60, 0), CTL(60, 0) } }, -+		 { { CTL(60, 1), CTL(60, 0), CTL(60, 0), CTL(60, 1) } }, -+ -+		 { { CTL(60, 1), CTL(60, 0), CTL(0, 0), CTL(0, 0) } }, -+		 { { CTL(60, 0), CTL(60, 1), CTL(60, 0), CTL(60, 0) } }, -+		 { { CTL(60, 0), CTL(60, 1), CTL(60, 0), CTL(60, 0) } }, -+ -+		 { { CTL(60, 0), CTL(60, 1), CTL(60, 1), CTL(60, 0) } }, -+		 { { CTL(60, 0), CTL(60, 1), CTL(60, 0), CTL(60, 0) } }, -+		 { { CTL(60, 0), CTL(60, 1), CTL(60, 0), CTL(60, 0) } }, -+ -+		 { { CTL(60, 0), CTL(60, 1), CTL(60, 0), CTL(60, 0) } }, -+		 { { CTL(60, 0), CTL(60, 1), CTL(60, 1), CTL(60, 1) } }, -+		 { { CTL(60, 0), CTL(60, 1), CTL(60, 1), CTL(60, 1) } }, - 	 }, - 	.modalHeader5G = { - 		/* 4 idle,t1,t2,b (4 bits per setting) */ -@@ -2892,56 +2894,56 @@ static const struct ar9300_eeprom ar9300 - 	.ctlPowerData_5G = { - 		{ - 			{ --				{60, 1}, {60, 1}, {60, 1}, {60, 1}, --				{60, 1}, {60, 1}, {60, 1}, {60, 0}, -+				CTL(60, 1), CTL(60, 1), CTL(60, 1), CTL(60, 1), -+				CTL(60, 1), CTL(60, 1), CTL(60, 1), CTL(60, 0), - 			} - 		}, - 		{ - 			{ --				{60, 1}, {60, 1}, {60, 1}, {60, 1}, --				{60, 1}, {60, 1}, {60, 1}, {60, 0}, -+				CTL(60, 1), CTL(60, 1), CTL(60, 1), CTL(60, 1), -+				CTL(60, 1), CTL(60, 1), CTL(60, 1), CTL(60, 0), - 			} - 		}, - 		{ - 			{ --				{60, 0}, {60, 1}, {60, 0}, {60, 1}, --				{60, 1}, {60, 1}, {60, 1}, {60, 1}, -+				CTL(60, 0), CTL(60, 1), CTL(60, 0), CTL(60, 1), -+				CTL(60, 1), CTL(60, 1), CTL(60, 1), CTL(60, 1), - 			} - 		}, - 		{ - 			{ --				{60, 0}, {60, 1}, {60, 1}, {60, 0}, --				{60, 1}, {60, 0}, {60, 0}, {60, 0}, -+				CTL(60, 0), CTL(60, 1), CTL(60, 1), CTL(60, 0), -+				CTL(60, 1), CTL(60, 0), CTL(60, 0), CTL(60, 0), - 			} - 		}, - 		{ - 			{ --				{60, 1}, {60, 1}, {60, 1}, {60, 0}, --				{60, 0}, {60, 0}, {60, 0}, {60, 0}, -+				CTL(60, 1), CTL(60, 1), CTL(60, 1), CTL(60, 0), -+				CTL(60, 0), CTL(60, 0), CTL(60, 0), CTL(60, 0), - 			} - 		}, - 		{ - 			{ --				{60, 1}, {60, 1}, {60, 1}, {60, 1}, --				{60, 1}, {60, 0}, {60, 0}, {60, 0}, -+				CTL(60, 1), CTL(60, 1), CTL(60, 1), CTL(60, 1), -+				CTL(60, 1), CTL(60, 0), CTL(60, 0), CTL(60, 0), - 			} - 		}, - 		{ - 			{ --				{60, 1}, {60, 1}, {60, 1}, {60, 1}, --				{60, 1}, {60, 1}, {60, 1}, {60, 1}, -+				CTL(60, 1), CTL(60, 1), CTL(60, 1), CTL(60, 1), -+				CTL(60, 1), CTL(60, 1), CTL(60, 1), CTL(60, 1), - 			} - 		}, - 		{ - 			{ --				{60, 1}, {60, 1}, {60, 0}, {60, 1}, --				{60, 1}, {60, 1}, {60, 1}, {60, 0}, -+				CTL(60, 1), CTL(60, 1), CTL(60, 0), CTL(60, 1), -+				CTL(60, 1), CTL(60, 1), CTL(60, 1), CTL(60, 0), - 			} - 		}, - 		{ - 			{ --				{60, 1}, {60, 0}, {60, 1}, {60, 1}, --				{60, 1}, {60, 1}, {60, 0}, {60, 1}, -+				CTL(60, 1), CTL(60, 0), CTL(60, 1), CTL(60, 1), -+				CTL(60, 1), CTL(60, 1), CTL(60, 0), CTL(60, 1), - 			} - 		}, - 	 } -@@ -4365,9 +4367,9 @@ static u16 ar9003_hw_get_direct_edge_pow - 	struct cal_ctl_data_5g *ctl_5g = eep->ctlPowerData_5G; -  - 	if (is2GHz) --		return ctl_2g[idx].ctlEdges[edge].tPower; -+		return CTL_EDGE_TPOWER(ctl_2g[idx].ctlEdges[edge]); - 	else --		return ctl_5g[idx].ctlEdges[edge].tPower; -+		return CTL_EDGE_TPOWER(ctl_5g[idx].ctlEdges[edge]); - } -  - static u16 ar9003_hw_get_indirect_edge_power(struct ar9300_eeprom *eep, -@@ -4385,12 +4387,12 @@ static u16 ar9003_hw_get_indirect_edge_p -  - 	if (is2GHz) { - 		if (ath9k_hw_fbin2freq(ctl_freqbin[edge - 1], 1) < freq && --		    ctl_2g[idx].ctlEdges[edge - 1].flag) --			return ctl_2g[idx].ctlEdges[edge - 1].tPower; -+		    CTL_EDGE_FLAGS(ctl_2g[idx].ctlEdges[edge - 1])) -+			return CTL_EDGE_TPOWER(ctl_2g[idx].ctlEdges[edge - 1]); - 	} else { - 		if (ath9k_hw_fbin2freq(ctl_freqbin[edge - 1], 0) < freq && --		    ctl_5g[idx].ctlEdges[edge - 1].flag) --			return ctl_5g[idx].ctlEdges[edge - 1].tPower; -+		    CTL_EDGE_FLAGS(ctl_5g[idx].ctlEdges[edge - 1])) -+			return CTL_EDGE_TPOWER(ctl_5g[idx].ctlEdges[edge - 1]); - 	} -  - 	return AR9300_MAX_RATE_POWER; ---- a/drivers/net/wireless/ath/ath9k/ar9003_eeprom.h -+++ b/drivers/net/wireless/ath/ath9k/ar9003_eeprom.h -@@ -270,17 +270,12 @@ struct cal_tgt_pow_ht { - 	u8 tPow2x[14]; - } __packed; -  --struct cal_ctl_edge_pwr { --	u8 tPower:6, --	   flag:2; --} __packed; -- - struct cal_ctl_data_2g { --	struct cal_ctl_edge_pwr ctlEdges[AR9300_NUM_BAND_EDGES_2G]; -+	u8 ctlEdges[AR9300_NUM_BAND_EDGES_2G]; - } __packed; -  - struct cal_ctl_data_5g { --	struct cal_ctl_edge_pwr ctlEdges[AR9300_NUM_BAND_EDGES_5G]; -+	u8 ctlEdges[AR9300_NUM_BAND_EDGES_5G]; - } __packed; -  - struct ar9300_BaseExtension_1 { ---- a/drivers/net/wireless/ath/ath9k/eeprom.c -+++ b/drivers/net/wireless/ath/ath9k/eeprom.c -@@ -240,16 +240,16 @@ u16 ath9k_hw_get_max_edge_power(u16 freq - 	for (i = 0; (i < num_band_edges) && - 		     (pRdEdgesPower[i].bChannel != AR5416_BCHAN_UNUSED); i++) { - 		if (freq == ath9k_hw_fbin2freq(pRdEdgesPower[i].bChannel, is2GHz)) { --			twiceMaxEdgePower = pRdEdgesPower[i].tPower; -+			twiceMaxEdgePower = CTL_EDGE_TPOWER(pRdEdgesPower[i].ctl); - 			break; - 		} else if ((i > 0) && - 			   (freq < ath9k_hw_fbin2freq(pRdEdgesPower[i].bChannel, - 						      is2GHz))) { - 			if (ath9k_hw_fbin2freq(pRdEdgesPower[i - 1].bChannel, - 					       is2GHz) < freq && --			    pRdEdgesPower[i - 1].flag) { -+			    CTL_EDGE_FLAGS(pRdEdgesPower[i - 1].ctl)) { - 				twiceMaxEdgePower = --					pRdEdgesPower[i - 1].tPower; -+					CTL_EDGE_TPOWER(pRdEdgesPower[i - 1].ctl); - 			} - 			break; - 		} ---- a/drivers/net/wireless/ath/ath9k/eeprom.h -+++ b/drivers/net/wireless/ath/ath9k/eeprom.h -@@ -233,6 +233,18 @@ -  - #define AR9287_CHECKSUM_LOCATION (AR9287_EEP_START_LOC + 1) -  -+#define CTL_EDGE_TPOWER(_ctl) ((_ctl) & 0x3f) -+#define CTL_EDGE_FLAGS(_ctl) (((_ctl) >> 6) & 0x03) -+ -+#define LNA_CTL_BUF_MODE	BIT(0) -+#define LNA_CTL_ISEL_LO		BIT(1) -+#define LNA_CTL_ISEL_HI		BIT(2) -+#define LNA_CTL_BUF_IN		BIT(3) -+#define LNA_CTL_FEM_BAND	BIT(4) -+#define LNA_CTL_LOCAL_BIAS	BIT(5) -+#define LNA_CTL_FORCE_XPA	BIT(6) -+#define LNA_CTL_USE_ANT1	BIT(7) -+ - enum eeprom_param { - 	EEP_NFTHRESH_5, - 	EEP_NFTHRESH_2, -@@ -379,10 +391,7 @@ struct modal_eep_header { - 	u8 xatten2Margin[AR5416_MAX_CHAINS]; - 	u8 ob_ch1; - 	u8 db_ch1; --	u8 useAnt1:1, --	    force_xpaon:1, --	    local_bias:1, --	    femBandSelectUsed:1, xlnabufin:1, xlnaisel:2, xlnabufmode:1; -+	u8 lna_ctl; - 	u8 miscBits; - 	u16 xpaBiasLvlFreq[3]; - 	u8 futureModal[6]; -@@ -536,18 +545,10 @@ struct cal_target_power_ht { - 	u8 tPow2x[8]; - } __packed; -  -- --#ifdef __BIG_ENDIAN_BITFIELD - struct cal_ctl_edges { - 	u8 bChannel; --	u8 flag:2, tPower:6; -+	u8 ctl; - } __packed; --#else --struct cal_ctl_edges { --	u8 bChannel; --	u8 tPower:6, flag:2; --} __packed; --#endif -  - struct cal_data_op_loop_ar9287 { - 	u8 pwrPdg[2][5]; ---- a/drivers/net/wireless/ath/ath9k/eeprom_def.c -+++ b/drivers/net/wireless/ath/ath9k/eeprom_def.c -@@ -451,9 +451,10 @@ static void ath9k_hw_def_set_board_value - 		ath9k_hw_analog_shift_rmw(ah, AR_AN_TOP2, - 					  AR_AN_TOP2_LOCALBIAS, - 					  AR_AN_TOP2_LOCALBIAS_S, --					  pModal->local_bias); -+					  !!(pModal->lna_ctl & -+					     LNA_CTL_LOCAL_BIAS)); - 		REG_RMW_FIELD(ah, AR_PHY_XPA_CFG, AR_PHY_FORCE_XPA_CFG, --			      pModal->force_xpaon); -+			      !!(pModal->lna_ctl & LNA_CTL_FORCE_XPA)); - 	} -  - 	REG_RMW_FIELD(ah, AR_PHY_SETTLING, AR_PHY_SETTLING_SWITCH, -@@ -1435,9 +1436,9 @@ static u8 ath9k_hw_def_get_num_ant_confi -  - 	num_ant_config = 1; -  --	if (pBase->version >= 0x0E0D) --		if (pModal->useAnt1) --			num_ant_config += 1; -+	if (pBase->version >= 0x0E0D && -+	    (pModal->lna_ctl & LNA_CTL_USE_ANT1)) -+		num_ant_config += 1; -  - 	return num_ant_config; - } diff --git a/package/mac80211/patches/530-ath9k_tid_seq_fix.patch b/package/mac80211/patches/320-ath9k_pending_work.patch index cb65aa847..ba40fe819 100644 --- a/package/mac80211/patches/530-ath9k_tid_seq_fix.patch +++ b/package/mac80211/patches/320-ath9k_pending_work.patch @@ -1,6 +1,6 @@  --- a/drivers/net/wireless/ath/ath9k/xmit.c  +++ b/drivers/net/wireless/ath/ath9k/xmit.c -@@ -1689,17 +1689,20 @@ static void ath_tx_start_dma(struct ath_ +@@ -1685,17 +1685,20 @@ static void ath_tx_start_dma(struct ath_   	struct ieee80211_tx_info *tx_info = IEEE80211_SKB_CB(skb);   	struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;   	struct list_head bf_head; @@ -23,7 +23,7 @@   		/*   		 * Try aggregation if it's a unicast data frame   		 * and the destination is HT capable. -@@ -1716,7 +1719,7 @@ static void ath_tx_start_dma(struct ath_ +@@ -1712,7 +1715,7 @@ static void ath_tx_start_dma(struct ath_   			ar9003_hw_set_paprd_txdesc(sc->sc_ah, bf->bf_desc,   						   bf->bf_state.bfs_paprd); @@ -32,3 +32,27 @@   	}   	spin_unlock_bh(&txctl->txq->axq_lock); +--- a/drivers/net/wireless/ath/ath9k/hw.c ++++ b/drivers/net/wireless/ath/ath9k/hw.c +@@ -284,11 +284,9 @@ static void ath9k_hw_read_revisions(stru +  + static void ath9k_hw_disablepcie(struct ath_hw *ah) + { +-	if (AR_SREV_9100(ah)) ++	if (!AR_SREV_5416(ah)) + 		return; +  +-	ENABLE_REGWRITE_BUFFER(ah); +- + 	REG_WRITE(ah, AR_PCIE_SERDES, 0x9248fc00); + 	REG_WRITE(ah, AR_PCIE_SERDES, 0x24924924); + 	REG_WRITE(ah, AR_PCIE_SERDES, 0x28000029); +@@ -300,8 +298,6 @@ static void ath9k_hw_disablepcie(struct  + 	REG_WRITE(ah, AR_PCIE_SERDES, 0x000e1007); +  + 	REG_WRITE(ah, AR_PCIE_SERDES2, 0x00000000); +- +-	REGWRITE_BUFFER_FLUSH(ah); + } +  + /* This should work for all families including legacy */ diff --git a/package/mac80211/patches/320-pending_work.patch b/package/mac80211/patches/320-pending_work.patch deleted file mode 100644 index 38bf6fb9f..000000000 --- a/package/mac80211/patches/320-pending_work.patch +++ /dev/null @@ -1,2153 +0,0 @@ ---- a/drivers/net/wireless/ath/ath9k/ar9002_hw.c -+++ b/drivers/net/wireless/ath/ath9k/ar9002_hw.c -@@ -26,24 +26,6 @@ MODULE_PARM_DESC(nohwcrypt, "Force new A -  - /* General hardware code for the A5008/AR9001/AR9002 hadware families */ -  --static bool ar9002_hw_macversion_supported(u32 macversion) --{ --	switch (macversion) { --	case AR_SREV_VERSION_5416_PCI: --	case AR_SREV_VERSION_5416_PCIE: --	case AR_SREV_VERSION_9160: --	case AR_SREV_VERSION_9100: --	case AR_SREV_VERSION_9280: --	case AR_SREV_VERSION_9285: --	case AR_SREV_VERSION_9287: --	case AR_SREV_VERSION_9271: --		return true; --	default: --		break; --	} --	return false; --} -- - static void ar9002_hw_init_mode_regs(struct ath_hw *ah) - { - 	if (AR_SREV_9271(ah)) { -@@ -565,7 +547,6 @@ void ar9002_hw_attach_ops(struct ath_hw  -  - 	priv_ops->init_mode_regs = ar9002_hw_init_mode_regs; - 	priv_ops->init_mode_gain_regs = ar9002_hw_init_mode_gain_regs; --	priv_ops->macversion_supported = ar9002_hw_macversion_supported; -  - 	ops->config_pci_powersave = ar9002_hw_configpcipowersave; -  ---- a/drivers/net/wireless/ath/ath9k/ar9002_mac.c -+++ b/drivers/net/wireless/ath/ath9k/ar9002_mac.c -@@ -283,7 +283,6 @@ static void ar9002_hw_set11n_txdesc(stru - { - 	struct ar5416_desc *ads = AR5416DESC(ds); -  --	txPower += ah->txpower_indexoffset; - 	if (txPower > 63) - 		txPower = 63; -  ---- a/drivers/net/wireless/ath/ath9k/ar9003_eeprom.c -+++ b/drivers/net/wireless/ath/ath9k/ar9003_eeprom.c -@@ -71,7 +71,7 @@ static const struct ar9300_eeprom ar9300 - 		.regDmn = { LE16(0), LE16(0x1f) }, - 		.txrxMask =  0x77, /* 4 bits tx and 4 bits rx */ - 		.opCapFlags = { --			.opFlags = AR9300_OPFLAGS_11G | AR9300_OPFLAGS_11A, -+			.opFlags = AR5416_OPFLAGS_11G | AR5416_OPFLAGS_11A, - 			.eepMisc = 0, - 		}, - 		.rfSilent = 0, -@@ -648,7 +648,7 @@ static const struct ar9300_eeprom ar9300 - 		.regDmn = { LE16(0), LE16(0x1f) }, - 		.txrxMask =  0x77, /* 4 bits tx and 4 bits rx */ - 		.opCapFlags = { --			.opFlags = AR9300_OPFLAGS_11G | AR9300_OPFLAGS_11A, -+			.opFlags = AR5416_OPFLAGS_11G | AR5416_OPFLAGS_11A, - 			.eepMisc = 0, - 		}, - 		.rfSilent = 0, -@@ -1226,7 +1226,7 @@ static const struct ar9300_eeprom ar9300 - 		.regDmn = { LE16(0), LE16(0x1f) }, - 		.txrxMask =  0x77, /* 4 bits tx and 4 bits rx */ - 		.opCapFlags = { --			.opFlags = AR9300_OPFLAGS_11G | AR9300_OPFLAGS_11A, -+			.opFlags = AR5416_OPFLAGS_11G | AR5416_OPFLAGS_11A, - 			.eepMisc = 0, - 		}, - 		.rfSilent = 0, -@@ -1804,7 +1804,7 @@ static const struct ar9300_eeprom ar9300 - 		.regDmn = { LE16(0), LE16(0x1f) }, - 		.txrxMask =  0x77, /* 4 bits tx and 4 bits rx */ - 		.opCapFlags = { --			.opFlags = AR9300_OPFLAGS_11G | AR9300_OPFLAGS_11A, -+			.opFlags = AR5416_OPFLAGS_11G | AR5416_OPFLAGS_11A, - 			.eepMisc = 0, - 		}, - 		.rfSilent = 0, -@@ -2381,7 +2381,7 @@ static const struct ar9300_eeprom ar9300 - 		.regDmn = { LE16(0), LE16(0x1f) }, - 		.txrxMask =  0x33, /* 4 bits tx and 4 bits rx */ - 		.opCapFlags = { --			.opFlags = AR9300_OPFLAGS_11G | AR9300_OPFLAGS_11A, -+			.opFlags = AR5416_OPFLAGS_11G | AR5416_OPFLAGS_11A, - 			.eepMisc = 0, - 		}, - 		.rfSilent = 0, -@@ -2973,7 +2973,7 @@ static const struct ar9300_eeprom *ar900 -  - static u16 ath9k_hw_fbin2freq(u8 fbin, bool is2GHz) - { --	if (fbin == AR9300_BCHAN_UNUSED) -+	if (fbin == AR5416_BCHAN_UNUSED) - 		return fbin; -  - 	return (u16) ((is2GHz) ? (2300 + fbin) : (4800 + 5 * fbin)); -@@ -3422,18 +3422,6 @@ static int ath9k_hw_ar9300_get_eeprom_re - 	return 0; - } -  --static u8 ath9k_hw_ar9300_get_num_ant_config(struct ath_hw *ah, --					     enum ath9k_hal_freq_band freq_band) --{ --	return 1; --} -- --static u32 ath9k_hw_ar9300_get_eeprom_antenna_cfg(struct ath_hw *ah, --						  struct ath9k_channel *chan) --{ --	return -EINVAL; --} -- - static s32 ar9003_hw_xpa_bias_level_get(struct ath_hw *ah, bool is2ghz) - { - 	struct ar9300_eeprom *eep = &ah->eeprom.ar9300_eep; -@@ -4395,7 +4383,7 @@ static u16 ar9003_hw_get_indirect_edge_p - 			return CTL_EDGE_TPOWER(ctl_5g[idx].ctlEdges[edge - 1]); - 	} -  --	return AR9300_MAX_RATE_POWER; -+	return MAX_RATE_POWER; - } -  - /* -@@ -4404,7 +4392,7 @@ static u16 ar9003_hw_get_indirect_edge_p - static u16 ar9003_hw_get_max_edge_power(struct ar9300_eeprom *eep, - 					u16 freq, int idx, bool is2GHz) - { --	u16 twiceMaxEdgePower = AR9300_MAX_RATE_POWER; -+	u16 twiceMaxEdgePower = MAX_RATE_POWER; - 	u8 *ctl_freqbin = is2GHz ? - 		&eep->ctl_freqbin_2G[idx][0] : - 		&eep->ctl_freqbin_5G[idx][0]; -@@ -4414,7 +4402,7 @@ static u16 ar9003_hw_get_max_edge_power( -  - 	/* Get the edge power */ - 	for (edge = 0; --	     (edge < num_edges) && (ctl_freqbin[edge] != AR9300_BCHAN_UNUSED); -+	     (edge < num_edges) && (ctl_freqbin[edge] != AR5416_BCHAN_UNUSED); - 	     edge++) { - 		/* - 		 * If there's an exact channel match or an inband flag set -@@ -4452,9 +4440,9 @@ static void ar9003_hw_set_power_per_rate - 	struct ath_regulatory *regulatory = ath9k_hw_regulatory(ah); - 	struct ath_common *common = ath9k_hw_common(ah); - 	struct ar9300_eeprom *pEepData = &ah->eeprom.ar9300_eep; --	u16 twiceMaxEdgePower = AR9300_MAX_RATE_POWER; -+	u16 twiceMaxEdgePower = MAX_RATE_POWER; - 	static const u16 tpScaleReductionTable[5] = { --		0, 3, 6, 9, AR9300_MAX_RATE_POWER -+		0, 3, 6, 9, MAX_RATE_POWER - 	}; - 	int i; - 	int16_t  twiceLargestAntenna; -@@ -4762,8 +4750,6 @@ const struct eeprom_ops eep_ar9300_ops = - 	.fill_eeprom = ath9k_hw_ar9300_fill_eeprom, - 	.get_eeprom_ver = ath9k_hw_ar9300_get_eeprom_ver, - 	.get_eeprom_rev = ath9k_hw_ar9300_get_eeprom_rev, --	.get_num_ant_config = ath9k_hw_ar9300_get_num_ant_config, --	.get_eeprom_antenna_cfg = ath9k_hw_ar9300_get_eeprom_antenna_cfg, - 	.set_board_values = ath9k_hw_ar9300_set_board_values, - 	.set_addac = ath9k_hw_ar9300_set_addac, - 	.set_txpower = ath9k_hw_ar9300_set_txpower, ---- a/drivers/net/wireless/ath/ath9k/ar9003_eeprom.h -+++ b/drivers/net/wireless/ath/ath9k/ar9003_eeprom.h -@@ -20,48 +20,17 @@ - /* #define AR9300_NUM_CTLS              21 */ - #define AR9300_NUM_CTLS_5G           9 - #define AR9300_NUM_CTLS_2G           12 --#define AR9300_CTL_MODE_M            0xF - #define AR9300_NUM_BAND_EDGES_5G     8 - #define AR9300_NUM_BAND_EDGES_2G     4 --#define AR9300_NUM_PD_GAINS          4 --#define AR9300_PD_GAINS_IN_MASK      4 --#define AR9300_PD_GAIN_ICEPTS        5 --#define AR9300_EEPROM_MODAL_SPURS    5 --#define AR9300_MAX_RATE_POWER        63 --#define AR9300_NUM_PDADC_VALUES      128 --#define AR9300_NUM_RATES             16 --#define AR9300_BCHAN_UNUSED          0xFF --#define AR9300_MAX_PWR_RANGE_IN_HALF_DB 64 --#define AR9300_OPFLAGS_11A           0x01 --#define AR9300_OPFLAGS_11G           0x02 --#define AR9300_OPFLAGS_5G_HT40       0x04 --#define AR9300_OPFLAGS_2G_HT40       0x08 --#define AR9300_OPFLAGS_5G_HT20       0x10 --#define AR9300_OPFLAGS_2G_HT20       0x20 - #define AR9300_EEPMISC_BIG_ENDIAN    0x01 - #define AR9300_EEPMISC_WOW           0x02 - #define AR9300_CUSTOMER_DATA_SIZE    20 -  --#define FREQ2FBIN(x, y) ((y) ? ((x) - 2300) : (((x) - 4800) / 5)) - #define FBIN2FREQ(x, y) ((y) ? (2300 + x) : (4800 + 5 * x)) - #define AR9300_MAX_CHAINS            3 - #define AR9300_ANT_16S               25 - #define AR9300_FUTURE_MODAL_SZ       6 -  --#define AR9300_NUM_ANT_CHAIN_FIELDS     7 --#define AR9300_NUM_ANT_COMMON_FIELDS    4 --#define AR9300_SIZE_ANT_CHAIN_FIELD     3 --#define AR9300_SIZE_ANT_COMMON_FIELD    4 --#define AR9300_ANT_CHAIN_MASK           0x7 --#define AR9300_ANT_COMMON_MASK          0xf --#define AR9300_CHAIN_0_IDX              0 --#define AR9300_CHAIN_1_IDX              1 --#define AR9300_CHAIN_2_IDX              2 -- --#define AR928X_NUM_ANT_CHAIN_FIELDS     6 --#define AR928X_SIZE_ANT_CHAIN_FIELD     2 --#define AR928X_ANT_CHAIN_MASK           0x3 -- - /* Delta from which to start power to pdadc table */ - /* This offset is used in both open loop and closed loop power control -  * schemes. In open loop power control, it is not really needed, but for -@@ -71,12 +40,8 @@ -  */ - #define AR9300_PWR_TABLE_OFFSET  0 -  --/* enable flags for voltage and temp compensation */ --#define ENABLE_TEMP_COMPENSATION 0x01 --#define ENABLE_VOLT_COMPENSATION 0x02 - /* byte addressable */ - #define AR9300_EEPROM_SIZE (16*1024) --#define FIXED_CCA_THRESHOLD 15 -  - #define AR9300_BASE_ADDR 0x3ff - #define AR9300_BASE_ADDR_512 0x1ff -@@ -225,7 +190,7 @@ struct ar9300_modal_eep_header { - 	int8_t tempSlope; - 	int8_t voltSlope; - 	/* spur channels in usual fbin coding format */ --	u8 spurChans[AR9300_EEPROM_MODAL_SPURS]; -+	u8 spurChans[AR_EEPROM_MODAL_SPURS]; - 	/* 3  Check if the register is per chain */ - 	int8_t noiseFloorThreshCh[AR9300_MAX_CHAINS]; - 	u8 ob[AR9300_MAX_CHAINS]; ---- a/drivers/net/wireless/ath/ath9k/ar9003_hw.c -+++ b/drivers/net/wireless/ath/ath9k/ar9003_hw.c -@@ -20,17 +20,6 @@ -  - /* General hardware code for the AR9003 hadware family */ -  --static bool ar9003_hw_macversion_supported(u32 macversion) --{ --	switch (macversion) { --	case AR_SREV_VERSION_9300: --		return true; --	default: --		break; --	} --	return false; --} -- - /* -  * The AR9003 family uses a new INI format (pre, core, post -  * arrays per subsystem). This provides support for the -@@ -216,7 +205,6 @@ void ar9003_hw_attach_ops(struct ath_hw  -  - 	priv_ops->init_mode_regs = ar9003_hw_init_mode_regs; - 	priv_ops->init_mode_gain_regs = ar9003_hw_init_mode_gain_regs; --	priv_ops->macversion_supported = ar9003_hw_macversion_supported; -  - 	ops->config_pci_powersave = ar9003_hw_configpcipowersave; -  ---- a/drivers/net/wireless/ath/ath9k/ar9003_mac.c -+++ b/drivers/net/wireless/ath/ath9k/ar9003_mac.c -@@ -322,7 +322,6 @@ static void ar9003_hw_set11n_txdesc(stru - 	if (txpower > ah->txpower_limit) - 		txpower = ah->txpower_limit; -  --	txpower += ah->txpower_indexoffset; - 	if (txpower > 63) - 		txpower = 63; -  ---- a/drivers/net/wireless/ath/ath9k/eeprom.c -+++ b/drivers/net/wireless/ath/ath9k/eeprom.c -@@ -234,7 +234,7 @@ void ath9k_hw_get_target_powers(struct a - u16 ath9k_hw_get_max_edge_power(u16 freq, struct cal_ctl_edges *pRdEdgesPower, - 				bool is2GHz, int num_band_edges) - { --	u16 twiceMaxEdgePower = AR5416_MAX_RATE_POWER; -+	u16 twiceMaxEdgePower = MAX_RATE_POWER; - 	int i; -  - 	for (i = 0; (i < num_band_edges) && -@@ -279,6 +279,219 @@ void ath9k_hw_update_regulatory_maxpower - 	} - } -  -+void ath9k_hw_get_gain_boundaries_pdadcs(struct ath_hw *ah, -+				struct ath9k_channel *chan, -+				void *pRawDataSet, -+				u8 *bChans, u16 availPiers, -+				u16 tPdGainOverlap, -+				u16 *pPdGainBoundaries, u8 *pPDADCValues, -+				u16 numXpdGains) -+{ -+	int i, j, k; -+	int16_t ss; -+	u16 idxL = 0, idxR = 0, numPiers; -+	static u8 vpdTableL[AR5416_NUM_PD_GAINS] -+		[AR5416_MAX_PWR_RANGE_IN_HALF_DB]; -+	static u8 vpdTableR[AR5416_NUM_PD_GAINS] -+		[AR5416_MAX_PWR_RANGE_IN_HALF_DB]; -+	static u8 vpdTableI[AR5416_NUM_PD_GAINS] -+		[AR5416_MAX_PWR_RANGE_IN_HALF_DB]; -+ -+	u8 *pVpdL, *pVpdR, *pPwrL, *pPwrR; -+	u8 minPwrT4[AR5416_NUM_PD_GAINS]; -+	u8 maxPwrT4[AR5416_NUM_PD_GAINS]; -+	int16_t vpdStep; -+	int16_t tmpVal; -+	u16 sizeCurrVpdTable, maxIndex, tgtIndex; -+	bool match; -+	int16_t minDelta = 0; -+	struct chan_centers centers; -+	int pdgain_boundary_default; -+	struct cal_data_per_freq *data_def = pRawDataSet; -+	struct cal_data_per_freq_4k *data_4k = pRawDataSet; -+	struct cal_data_per_freq_ar9287 *data_9287 = pRawDataSet; -+	bool eeprom_4k = AR_SREV_9285(ah) || AR_SREV_9271(ah); -+	int intercepts; -+ -+	if (AR_SREV_9287(ah)) -+		intercepts = AR9287_PD_GAIN_ICEPTS; -+	else -+		intercepts = AR5416_PD_GAIN_ICEPTS; -+ -+	memset(&minPwrT4, 0, AR5416_NUM_PD_GAINS); -+	ath9k_hw_get_channel_centers(ah, chan, ¢ers); -+ -+	for (numPiers = 0; numPiers < availPiers; numPiers++) { -+		if (bChans[numPiers] == AR5416_BCHAN_UNUSED) -+			break; -+	} -+ -+	match = ath9k_hw_get_lower_upper_index((u8)FREQ2FBIN(centers.synth_center, -+							     IS_CHAN_2GHZ(chan)), -+					       bChans, numPiers, &idxL, &idxR); -+ -+	if (match) { -+		if (AR_SREV_9287(ah)) { -+			/* FIXME: array overrun? */ -+			for (i = 0; i < numXpdGains; i++) { -+				minPwrT4[i] = data_9287[idxL].pwrPdg[i][0]; -+				maxPwrT4[i] = data_9287[idxL].pwrPdg[i][4]; -+				ath9k_hw_fill_vpd_table(minPwrT4[i], maxPwrT4[i], -+						data_9287[idxL].pwrPdg[i], -+						data_9287[idxL].vpdPdg[i], -+						intercepts, -+						vpdTableI[i]); -+			} -+		} else if (eeprom_4k) { -+			for (i = 0; i < numXpdGains; i++) { -+				minPwrT4[i] = data_4k[idxL].pwrPdg[i][0]; -+				maxPwrT4[i] = data_4k[idxL].pwrPdg[i][4]; -+				ath9k_hw_fill_vpd_table(minPwrT4[i], maxPwrT4[i], -+						data_4k[idxL].pwrPdg[i], -+						data_4k[idxL].vpdPdg[i], -+						intercepts, -+						vpdTableI[i]); -+			} -+		} else { -+			for (i = 0; i < numXpdGains; i++) { -+				minPwrT4[i] = data_def[idxL].pwrPdg[i][0]; -+				maxPwrT4[i] = data_def[idxL].pwrPdg[i][4]; -+				ath9k_hw_fill_vpd_table(minPwrT4[i], maxPwrT4[i], -+						data_def[idxL].pwrPdg[i], -+						data_def[idxL].vpdPdg[i], -+						intercepts, -+						vpdTableI[i]); -+			} -+		} -+	} else { -+		for (i = 0; i < numXpdGains; i++) { -+			if (AR_SREV_9287(ah)) { -+				pVpdL = data_9287[idxL].vpdPdg[i]; -+				pPwrL = data_9287[idxL].pwrPdg[i]; -+				pVpdR = data_9287[idxR].vpdPdg[i]; -+				pPwrR = data_9287[idxR].pwrPdg[i]; -+			} else if (eeprom_4k) { -+				pVpdL = data_4k[idxL].vpdPdg[i]; -+				pPwrL = data_4k[idxL].pwrPdg[i]; -+				pVpdR = data_4k[idxR].vpdPdg[i]; -+				pPwrR = data_4k[idxR].pwrPdg[i]; -+			} else { -+				pVpdL = data_def[idxL].vpdPdg[i]; -+				pPwrL = data_def[idxL].pwrPdg[i]; -+				pVpdR = data_def[idxR].vpdPdg[i]; -+				pPwrR = data_def[idxR].pwrPdg[i]; -+			} -+ -+			minPwrT4[i] = max(pPwrL[0], pPwrR[0]); -+ -+			maxPwrT4[i] = -+				min(pPwrL[intercepts - 1], -+				    pPwrR[intercepts - 1]); -+ -+ -+			ath9k_hw_fill_vpd_table(minPwrT4[i], maxPwrT4[i], -+						pPwrL, pVpdL, -+						intercepts, -+						vpdTableL[i]); -+			ath9k_hw_fill_vpd_table(minPwrT4[i], maxPwrT4[i], -+						pPwrR, pVpdR, -+						intercepts, -+						vpdTableR[i]); -+ -+			for (j = 0; j <= (maxPwrT4[i] - minPwrT4[i]) / 2; j++) { -+				vpdTableI[i][j] = -+					(u8)(ath9k_hw_interpolate((u16) -+					     FREQ2FBIN(centers. -+						       synth_center, -+						       IS_CHAN_2GHZ -+						       (chan)), -+					     bChans[idxL], bChans[idxR], -+					     vpdTableL[i][j], vpdTableR[i][j])); -+			} -+		} -+	} -+ -+	k = 0; -+ -+	for (i = 0; i < numXpdGains; i++) { -+		if (i == (numXpdGains - 1)) -+			pPdGainBoundaries[i] = -+				(u16)(maxPwrT4[i] / 2); -+		else -+			pPdGainBoundaries[i] = -+				(u16)((maxPwrT4[i] + minPwrT4[i + 1]) / 4); -+ -+		pPdGainBoundaries[i] = -+			min((u16)MAX_RATE_POWER, pPdGainBoundaries[i]); -+ -+		if ((i == 0) && !AR_SREV_5416_20_OR_LATER(ah)) { -+			minDelta = pPdGainBoundaries[0] - 23; -+			pPdGainBoundaries[0] = 23; -+		} else { -+			minDelta = 0; -+		} -+ -+		if (i == 0) { -+			if (AR_SREV_9280_20_OR_LATER(ah)) -+				ss = (int16_t)(0 - (minPwrT4[i] / 2)); -+			else -+				ss = 0; -+		} else { -+			ss = (int16_t)((pPdGainBoundaries[i - 1] - -+					(minPwrT4[i] / 2)) - -+				       tPdGainOverlap + 1 + minDelta); -+		} -+		vpdStep = (int16_t)(vpdTableI[i][1] - vpdTableI[i][0]); -+		vpdStep = (int16_t)((vpdStep < 1) ? 1 : vpdStep); -+ -+		while ((ss < 0) && (k < (AR5416_NUM_PDADC_VALUES - 1))) { -+			tmpVal = (int16_t)(vpdTableI[i][0] + ss * vpdStep); -+			pPDADCValues[k++] = (u8)((tmpVal < 0) ? 0 : tmpVal); -+			ss++; -+		} -+ -+		sizeCurrVpdTable = (u8) ((maxPwrT4[i] - minPwrT4[i]) / 2 + 1); -+		tgtIndex = (u8)(pPdGainBoundaries[i] + tPdGainOverlap - -+				(minPwrT4[i] / 2)); -+		maxIndex = (tgtIndex < sizeCurrVpdTable) ? -+			tgtIndex : sizeCurrVpdTable; -+ -+		while ((ss < maxIndex) && (k < (AR5416_NUM_PDADC_VALUES - 1))) { -+			pPDADCValues[k++] = vpdTableI[i][ss++]; -+		} -+ -+		vpdStep = (int16_t)(vpdTableI[i][sizeCurrVpdTable - 1] - -+				    vpdTableI[i][sizeCurrVpdTable - 2]); -+		vpdStep = (int16_t)((vpdStep < 1) ? 1 : vpdStep); -+ -+		if (tgtIndex >= maxIndex) { -+			while ((ss <= tgtIndex) && -+			       (k < (AR5416_NUM_PDADC_VALUES - 1))) { -+				tmpVal = (int16_t)((vpdTableI[i][sizeCurrVpdTable - 1] + -+						    (ss - maxIndex + 1) * vpdStep)); -+				pPDADCValues[k++] = (u8)((tmpVal > 255) ? -+							 255 : tmpVal); -+				ss++; -+			} -+		} -+	} -+ -+	if (eeprom_4k) -+		pdgain_boundary_default = 58; -+	else -+		pdgain_boundary_default = pPdGainBoundaries[i - 1]; -+ -+	while (i < AR5416_PD_GAINS_IN_MASK) { -+		pPdGainBoundaries[i] = pdgain_boundary_default; -+		i++; -+	} -+ -+	while (k < AR5416_NUM_PDADC_VALUES) { -+		pPDADCValues[k] = pPDADCValues[k - 1]; -+		k++; -+	} -+} -+ - int ath9k_hw_eeprom_init(struct ath_hw *ah) - { - 	int status; ---- a/drivers/net/wireless/ath/ath9k/eeprom.h -+++ b/drivers/net/wireless/ath/ath9k/eeprom.h -@@ -17,6 +17,8 @@ - #ifndef EEPROM_H - #define EEPROM_H -  -+#define AR_EEPROM_MODAL_SPURS   5 -+ - #include "../ath.h" - #include <net/cfg80211.h> - #include "ar9003_eeprom.h" -@@ -149,8 +151,6 @@ - #define AR5416_NUM_PD_GAINS             4 - #define AR5416_PD_GAINS_IN_MASK         4 - #define AR5416_PD_GAIN_ICEPTS           5 --#define AR5416_EEPROM_MODAL_SPURS       5 --#define AR5416_MAX_RATE_POWER           63 - #define AR5416_NUM_PDADC_VALUES         128 - #define AR5416_BCHAN_UNUSED             0xFF - #define AR5416_MAX_PWR_RANGE_IN_HALF_DB 64 -@@ -175,8 +175,6 @@ - #define AR5416_EEP4K_NUM_CTLS                 12 - #define AR5416_EEP4K_NUM_BAND_EDGES           4 - #define AR5416_EEP4K_NUM_PD_GAINS             2 --#define AR5416_EEP4K_PD_GAINS_IN_MASK         4 --#define AR5416_EEP4K_PD_GAIN_ICEPTS           5 - #define AR5416_EEP4K_MAX_CHAINS               1 -  - #define AR9280_TX_GAIN_TABLE_SIZE 22 -@@ -198,35 +196,12 @@ - #define AR9287_NUM_2G_40_TARGET_POWERS  3 - #define AR9287_NUM_CTLS              	12 - #define AR9287_NUM_BAND_EDGES        	4 --#define AR9287_NUM_PD_GAINS             4 --#define AR9287_PD_GAINS_IN_MASK         4 - #define AR9287_PD_GAIN_ICEPTS           1 --#define AR9287_EEPROM_MODAL_SPURS       5 --#define AR9287_MAX_RATE_POWER           63 --#define AR9287_NUM_PDADC_VALUES         128 --#define AR9287_NUM_RATES                16 --#define AR9287_BCHAN_UNUSED             0xFF --#define AR9287_MAX_PWR_RANGE_IN_HALF_DB 64 --#define AR9287_OPFLAGS_11A              0x01 --#define AR9287_OPFLAGS_11G              0x02 --#define AR9287_OPFLAGS_2G_HT40          0x08 --#define AR9287_OPFLAGS_2G_HT20          0x20 --#define AR9287_OPFLAGS_5G_HT40          0x04 --#define AR9287_OPFLAGS_5G_HT20          0x10 - #define AR9287_EEPMISC_BIG_ENDIAN       0x01 - #define AR9287_EEPMISC_WOW              0x02 - #define AR9287_MAX_CHAINS               2 - #define AR9287_ANT_16S                  32 --#define AR9287_custdatasize             20 -  --#define AR9287_NUM_ANT_CHAIN_FIELDS     6 --#define AR9287_NUM_ANT_COMMON_FIELDS    4 --#define AR9287_SIZE_ANT_CHAIN_FIELD     2 --#define AR9287_SIZE_ANT_COMMON_FIELD    4 --#define AR9287_ANT_CHAIN_MASK           0x3 --#define AR9287_ANT_COMMON_MASK          0xf --#define AR9287_CHAIN_0_IDX              0 --#define AR9287_CHAIN_1_IDX              1 - #define AR9287_DATA_SZ                  32 -  - #define AR9287_PWR_TABLE_OFFSET_DB  -5 -@@ -396,7 +371,7 @@ struct modal_eep_header { - 	u16 xpaBiasLvlFreq[3]; - 	u8 futureModal[6]; -  --	struct spur_chan spurChans[AR5416_EEPROM_MODAL_SPURS]; -+	struct spur_chan spurChans[AR_EEPROM_MODAL_SPURS]; - } __packed; -  - struct calDataPerFreqOpLoop { -@@ -464,7 +439,7 @@ struct modal_eep_4k_header { - 	u8 db2_4:4, reserved:4; - #endif - 	u8 futureModal[4]; --	struct spur_chan spurChans[AR5416_EEPROM_MODAL_SPURS]; -+	struct spur_chan spurChans[AR_EEPROM_MODAL_SPURS]; - } __packed; -  - struct base_eep_ar9287_header { -@@ -522,7 +497,7 @@ struct modal_eep_ar9287_header { - 	u8 ob_qam; - 	u8 ob_pal_off; - 	u8 futureModal[30]; --	struct spur_chan spurChans[AR9287_EEPROM_MODAL_SPURS]; -+	struct spur_chan spurChans[AR_EEPROM_MODAL_SPURS]; - } __packed; -  - struct cal_data_per_freq { -@@ -531,8 +506,8 @@ struct cal_data_per_freq { - } __packed; -  - struct cal_data_per_freq_4k { --	u8 pwrPdg[AR5416_EEP4K_NUM_PD_GAINS][AR5416_EEP4K_PD_GAIN_ICEPTS]; --	u8 vpdPdg[AR5416_EEP4K_NUM_PD_GAINS][AR5416_EEP4K_PD_GAIN_ICEPTS]; -+	u8 pwrPdg[AR5416_EEP4K_NUM_PD_GAINS][AR5416_PD_GAIN_ICEPTS]; -+	u8 vpdPdg[AR5416_EEP4K_NUM_PD_GAINS][AR5416_PD_GAIN_ICEPTS]; - } __packed; -  - struct cal_target_power_leg { -@@ -558,8 +533,8 @@ struct cal_data_op_loop_ar9287 { - } __packed; -  - struct cal_data_per_freq_ar9287 { --	u8 pwrPdg[AR9287_NUM_PD_GAINS][AR9287_PD_GAIN_ICEPTS]; --	u8 vpdPdg[AR9287_NUM_PD_GAINS][AR9287_PD_GAIN_ICEPTS]; -+	u8 pwrPdg[AR5416_NUM_PD_GAINS][AR9287_PD_GAIN_ICEPTS]; -+	u8 vpdPdg[AR5416_NUM_PD_GAINS][AR9287_PD_GAIN_ICEPTS]; - } __packed; -  - union cal_data_per_freq_ar9287_u { -@@ -674,10 +649,6 @@ struct eeprom_ops { - 	bool (*fill_eeprom)(struct ath_hw *hw); - 	int (*get_eeprom_ver)(struct ath_hw *hw); - 	int (*get_eeprom_rev)(struct ath_hw *hw); --	u8 (*get_num_ant_config)(struct ath_hw *hw, --				 enum ath9k_hal_freq_band band); --	u32 (*get_eeprom_antenna_cfg)(struct ath_hw *hw, --				      struct ath9k_channel *chan); - 	void (*set_board_values)(struct ath_hw *hw, struct ath9k_channel *chan); - 	void (*set_addac)(struct ath_hw *hw, struct ath9k_channel *chan); - 	void (*set_txpower)(struct ath_hw *hw, struct ath9k_channel *chan, -@@ -716,6 +687,14 @@ u16 ath9k_hw_get_max_edge_power(u16 freq - void ath9k_hw_update_regulatory_maxpower(struct ath_hw *ah); - int ath9k_hw_eeprom_init(struct ath_hw *ah); -  -+void ath9k_hw_get_gain_boundaries_pdadcs(struct ath_hw *ah, -+				struct ath9k_channel *chan, -+				void *pRawDataSet, -+				u8 *bChans, u16 availPiers, -+				u16 tPdGainOverlap, -+				u16 *pPdGainBoundaries, u8 *pPDADCValues, -+				u16 numXpdGains); -+ - #define ar5416_get_ntxchains(_txchainmask)			\ - 	(((_txchainmask >> 2) & 1) +                            \ - 	 ((_txchainmask >> 1) & 1) + (_txchainmask & 1)) ---- a/drivers/net/wireless/ath/ath9k/eeprom_4k.c -+++ b/drivers/net/wireless/ath/ath9k/eeprom_4k.c -@@ -155,7 +155,7 @@ static int ath9k_hw_4k_check_eeprom(stru - 			eep->modalHeader.antCtrlChain[i] = integer; - 		} -  --		for (i = 0; i < AR5416_EEPROM_MODAL_SPURS; i++) { -+		for (i = 0; i < AR_EEPROM_MODAL_SPURS; i++) { - 			word = swab16(eep->modalHeader.spurChans[i].spurChan); - 			eep->modalHeader.spurChans[i].spurChan = word; - 		} -@@ -230,173 +230,6 @@ static u32 ath9k_hw_4k_get_eeprom(struct - 	} - } -  --static void ath9k_hw_get_4k_gain_boundaries_pdadcs(struct ath_hw *ah, --				struct ath9k_channel *chan, --				struct cal_data_per_freq_4k *pRawDataSet, --				u8 *bChans, u16 availPiers, --				u16 tPdGainOverlap, --				u16 *pPdGainBoundaries, u8 *pPDADCValues, --				u16 numXpdGains) --{ --#define TMP_VAL_VPD_TABLE \ --	((vpdTableI[i][sizeCurrVpdTable - 1] + (ss - maxIndex + 1) * vpdStep)); --	int i, j, k; --	int16_t ss; --	u16 idxL = 0, idxR = 0, numPiers; --	static u8 vpdTableL[AR5416_EEP4K_NUM_PD_GAINS] --		[AR5416_MAX_PWR_RANGE_IN_HALF_DB]; --	static u8 vpdTableR[AR5416_EEP4K_NUM_PD_GAINS] --		[AR5416_MAX_PWR_RANGE_IN_HALF_DB]; --	static u8 vpdTableI[AR5416_EEP4K_NUM_PD_GAINS] --		[AR5416_MAX_PWR_RANGE_IN_HALF_DB]; -- --	u8 *pVpdL, *pVpdR, *pPwrL, *pPwrR; --	u8 minPwrT4[AR5416_EEP4K_NUM_PD_GAINS]; --	u8 maxPwrT4[AR5416_EEP4K_NUM_PD_GAINS]; --	int16_t vpdStep; --	int16_t tmpVal; --	u16 sizeCurrVpdTable, maxIndex, tgtIndex; --	bool match; --	int16_t minDelta = 0; --	struct chan_centers centers; --#define PD_GAIN_BOUNDARY_DEFAULT 58; -- --	memset(&minPwrT4, 0, AR9287_NUM_PD_GAINS); --	ath9k_hw_get_channel_centers(ah, chan, ¢ers); -- --	for (numPiers = 0; numPiers < availPiers; numPiers++) { --		if (bChans[numPiers] == AR5416_BCHAN_UNUSED) --			break; --	} -- --	match = ath9k_hw_get_lower_upper_index( --					(u8)FREQ2FBIN(centers.synth_center, --					IS_CHAN_2GHZ(chan)), bChans, numPiers, --					&idxL, &idxR); -- --	if (match) { --		for (i = 0; i < numXpdGains; i++) { --			minPwrT4[i] = pRawDataSet[idxL].pwrPdg[i][0]; --			maxPwrT4[i] = pRawDataSet[idxL].pwrPdg[i][4]; --			ath9k_hw_fill_vpd_table(minPwrT4[i], maxPwrT4[i], --					pRawDataSet[idxL].pwrPdg[i], --					pRawDataSet[idxL].vpdPdg[i], --					AR5416_EEP4K_PD_GAIN_ICEPTS, --					vpdTableI[i]); --		} --	} else { --		for (i = 0; i < numXpdGains; i++) { --			pVpdL = pRawDataSet[idxL].vpdPdg[i]; --			pPwrL = pRawDataSet[idxL].pwrPdg[i]; --			pVpdR = pRawDataSet[idxR].vpdPdg[i]; --			pPwrR = pRawDataSet[idxR].pwrPdg[i]; -- --			minPwrT4[i] = max(pPwrL[0], pPwrR[0]); -- --			maxPwrT4[i] = --				min(pPwrL[AR5416_EEP4K_PD_GAIN_ICEPTS - 1], --				    pPwrR[AR5416_EEP4K_PD_GAIN_ICEPTS - 1]); -- -- --			ath9k_hw_fill_vpd_table(minPwrT4[i], maxPwrT4[i], --						pPwrL, pVpdL, --						AR5416_EEP4K_PD_GAIN_ICEPTS, --						vpdTableL[i]); --			ath9k_hw_fill_vpd_table(minPwrT4[i], maxPwrT4[i], --						pPwrR, pVpdR, --						AR5416_EEP4K_PD_GAIN_ICEPTS, --						vpdTableR[i]); -- --			for (j = 0; j <= (maxPwrT4[i] - minPwrT4[i]) / 2; j++) { --				vpdTableI[i][j] = --					(u8)(ath9k_hw_interpolate((u16) --					     FREQ2FBIN(centers. --						       synth_center, --						       IS_CHAN_2GHZ --						       (chan)), --					     bChans[idxL], bChans[idxR], --					     vpdTableL[i][j], vpdTableR[i][j])); --			} --		} --	} -- --	k = 0; -- --	for (i = 0; i < numXpdGains; i++) { --		if (i == (numXpdGains - 1)) --			pPdGainBoundaries[i] = --				(u16)(maxPwrT4[i] / 2); --		else --			pPdGainBoundaries[i] = --				(u16)((maxPwrT4[i] + minPwrT4[i + 1]) / 4); -- --		pPdGainBoundaries[i] = --			min((u16)AR5416_MAX_RATE_POWER, pPdGainBoundaries[i]); -- --		if ((i == 0) && !AR_SREV_5416_20_OR_LATER(ah)) { --			minDelta = pPdGainBoundaries[0] - 23; --			pPdGainBoundaries[0] = 23; --		} else { --			minDelta = 0; --		} -- --		if (i == 0) { --			if (AR_SREV_9280_20_OR_LATER(ah)) --				ss = (int16_t)(0 - (minPwrT4[i] / 2)); --			else --				ss = 0; --		} else { --			ss = (int16_t)((pPdGainBoundaries[i - 1] - --					(minPwrT4[i] / 2)) - --				       tPdGainOverlap + 1 + minDelta); --		} --		vpdStep = (int16_t)(vpdTableI[i][1] - vpdTableI[i][0]); --		vpdStep = (int16_t)((vpdStep < 1) ? 1 : vpdStep); -- --		while ((ss < 0) && (k < (AR5416_NUM_PDADC_VALUES - 1))) { --			tmpVal = (int16_t)(vpdTableI[i][0] + ss * vpdStep); --			pPDADCValues[k++] = (u8)((tmpVal < 0) ? 0 : tmpVal); --			ss++; --		} -- --		sizeCurrVpdTable = (u8) ((maxPwrT4[i] - minPwrT4[i]) / 2 + 1); --		tgtIndex = (u8)(pPdGainBoundaries[i] + tPdGainOverlap - --				(minPwrT4[i] / 2)); --		maxIndex = (tgtIndex < sizeCurrVpdTable) ? --			tgtIndex : sizeCurrVpdTable; -- --		while ((ss < maxIndex) && (k < (AR5416_NUM_PDADC_VALUES - 1))) --			pPDADCValues[k++] = vpdTableI[i][ss++]; -- --		vpdStep = (int16_t)(vpdTableI[i][sizeCurrVpdTable - 1] - --				    vpdTableI[i][sizeCurrVpdTable - 2]); --		vpdStep = (int16_t)((vpdStep < 1) ? 1 : vpdStep); -- --		if (tgtIndex >= maxIndex) { --			while ((ss <= tgtIndex) && --			       (k < (AR5416_NUM_PDADC_VALUES - 1))) { --				tmpVal = (int16_t) TMP_VAL_VPD_TABLE; --				pPDADCValues[k++] = (u8)((tmpVal > 255) ? --							 255 : tmpVal); --				ss++; --			} --		} --	} -- --	while (i < AR5416_EEP4K_PD_GAINS_IN_MASK) { --		pPdGainBoundaries[i] = PD_GAIN_BOUNDARY_DEFAULT; --		i++; --	} -- --	while (k < AR5416_NUM_PDADC_VALUES) { --		pPDADCValues[k] = pPDADCValues[k - 1]; --		k++; --	} -- --	return; --#undef TMP_VAL_VPD_TABLE --} -- - static void ath9k_hw_set_4k_power_cal_table(struct ath_hw *ah, - 				  struct ath9k_channel *chan, - 				  int16_t *pTxPowerIndexOffset) -@@ -407,7 +240,7 @@ static void ath9k_hw_set_4k_power_cal_ta - 	u8 *pCalBChans = NULL; - 	u16 pdGainOverlap_t2; - 	static u8 pdadcValues[AR5416_NUM_PDADC_VALUES]; --	u16 gainBoundaries[AR5416_EEP4K_PD_GAINS_IN_MASK]; -+	u16 gainBoundaries[AR5416_PD_GAINS_IN_MASK]; - 	u16 numPiers, i, j; - 	u16 numXpdGain, xpdMask; - 	u16 xpdGainValues[AR5416_EEP4K_NUM_PD_GAINS] = { 0, 0 }; -@@ -429,12 +262,12 @@ static void ath9k_hw_set_4k_power_cal_ta -  - 	numXpdGain = 0; -  --	for (i = 1; i <= AR5416_EEP4K_PD_GAINS_IN_MASK; i++) { --		if ((xpdMask >> (AR5416_EEP4K_PD_GAINS_IN_MASK - i)) & 1) { -+	for (i = 1; i <= AR5416_PD_GAINS_IN_MASK; i++) { -+		if ((xpdMask >> (AR5416_PD_GAINS_IN_MASK - i)) & 1) { - 			if (numXpdGain >= AR5416_EEP4K_NUM_PD_GAINS) - 				break; - 			xpdGainValues[numXpdGain] = --				(u16)(AR5416_EEP4K_PD_GAINS_IN_MASK - i); -+				(u16)(AR5416_PD_GAINS_IN_MASK - i); - 			numXpdGain++; - 		} - 	} -@@ -458,7 +291,7 @@ static void ath9k_hw_set_4k_power_cal_ta - 		if (pEepData->baseEepHeader.txMask & (1 << i)) { - 			pRawDataset = pEepData->calPierData2G[i]; -  --			ath9k_hw_get_4k_gain_boundaries_pdadcs(ah, chan, -+			ath9k_hw_get_gain_boundaries_pdadcs(ah, chan, - 					    pRawDataset, pCalBChans, - 					    numPiers, pdGainOverlap_t2, - 					    gainBoundaries, -@@ -532,7 +365,7 @@ static void ath9k_hw_set_4k_power_per_ra - 	int i; - 	int16_t twiceLargestAntenna; - 	u16 twiceMinEdgePower; --	u16 twiceMaxEdgePower = AR5416_MAX_RATE_POWER; -+	u16 twiceMaxEdgePower = MAX_RATE_POWER; - 	u16 scaledPower = 0, minCtlPower, maxRegAllowedPower; - 	u16 numCtlModes; - 	const u16 *pCtlMode; -@@ -541,7 +374,7 @@ static void ath9k_hw_set_4k_power_per_ra - 	struct cal_ctl_data_4k *rep; - 	struct ar5416_eeprom_4k *pEepData = &ah->eeprom.map4k; - 	static const u16 tpScaleReductionTable[5] = --		{ 0, 3, 6, 9, AR5416_MAX_RATE_POWER }; -+		{ 0, 3, 6, 9, MAX_RATE_POWER }; - 	struct cal_target_power_leg targetPowerOfdm, targetPowerCck = { - 		0, { 0, 0, 0, 0} - 	}; -@@ -617,7 +450,7 @@ static void ath9k_hw_set_4k_power_per_ra -  - 		if (ah->eep_ops->get_eeprom_ver(ah) == 14 && - 		    ah->eep_ops->get_eeprom_rev(ah) <= 2) --			twiceMaxEdgePower = AR5416_MAX_RATE_POWER; -+			twiceMaxEdgePower = MAX_RATE_POWER; -  - 		for (i = 0; (i < AR5416_EEP4K_NUM_CTLS) && - 			     pEepData->ctlIndex[i]; i++) { -@@ -756,8 +589,8 @@ static void ath9k_hw_4k_set_txpower(stru - 	regulatory->max_power_level = 0; - 	for (i = 0; i < ARRAY_SIZE(ratesArray); i++) { - 		ratesArray[i] =	(int16_t)(txPowerIndexOffset + ratesArray[i]); --		if (ratesArray[i] > AR5416_MAX_RATE_POWER) --			ratesArray[i] = AR5416_MAX_RATE_POWER; -+		if (ratesArray[i] > MAX_RATE_POWER) -+			ratesArray[i] = MAX_RATE_POWER; -  - 		if (ratesArray[i] > regulatory->max_power_level) - 			regulatory->max_power_level = ratesArray[i]; -@@ -941,8 +774,7 @@ static void ath9k_hw_4k_set_board_values - 	pModal = &eep->modalHeader; - 	txRxAttenLocal = 23; -  --	REG_WRITE(ah, AR_PHY_SWITCH_COM, --		  ah->eep_ops->get_eeprom_antenna_cfg(ah, chan)); -+	REG_WRITE(ah, AR_PHY_SWITCH_COM, pModal->antCtrlCommon); -  - 	/* Single chain for 4K EEPROM*/ - 	ath9k_hw_4k_set_gain(ah, pModal, eep, txRxAttenLocal); -@@ -1158,21 +990,6 @@ static void ath9k_hw_4k_set_board_values - 	} - } -  --static u32 ath9k_hw_4k_get_eeprom_antenna_cfg(struct ath_hw *ah, --					      struct ath9k_channel *chan) --{ --	struct ar5416_eeprom_4k *eep = &ah->eeprom.map4k; --	struct modal_eep_4k_header *pModal = &eep->modalHeader; -- --	return pModal->antCtrlCommon; --} -- --static u8 ath9k_hw_4k_get_num_ant_config(struct ath_hw *ah, --					 enum ath9k_hal_freq_band freq_band) --{ --	return 1; --} -- - static u16 ath9k_hw_4k_get_spur_channel(struct ath_hw *ah, u16 i, bool is2GHz) - { - #define EEP_MAP4K_SPURCHAN \ -@@ -1209,8 +1026,6 @@ const struct eeprom_ops eep_4k_ops = { - 	.fill_eeprom		= ath9k_hw_4k_fill_eeprom, - 	.get_eeprom_ver		= ath9k_hw_4k_get_eeprom_ver, - 	.get_eeprom_rev		= ath9k_hw_4k_get_eeprom_rev, --	.get_num_ant_config	= ath9k_hw_4k_get_num_ant_config, --	.get_eeprom_antenna_cfg	= ath9k_hw_4k_get_eeprom_antenna_cfg, - 	.set_board_values	= ath9k_hw_4k_set_board_values, - 	.set_addac		= ath9k_hw_4k_set_addac, - 	.set_txpower		= ath9k_hw_4k_set_txpower, ---- a/drivers/net/wireless/ath/ath9k/eeprom_9287.c -+++ b/drivers/net/wireless/ath/ath9k/eeprom_9287.c -@@ -152,7 +152,7 @@ static int ath9k_hw_ar9287_check_eeprom( - 			eep->modalHeader.antCtrlChain[i] = integer; - 		} -  --		for (i = 0; i < AR9287_EEPROM_MODAL_SPURS; i++) { -+		for (i = 0; i < AR_EEPROM_MODAL_SPURS; i++) { - 			word = swab16(eep->modalHeader.spurChans[i].spurChan); - 			eep->modalHeader.spurChans[i].spurChan = word; - 		} -@@ -223,163 +223,6 @@ static u32 ath9k_hw_ar9287_get_eeprom(st - 	} - } -  --static void ath9k_hw_get_ar9287_gain_boundaries_pdadcs(struct ath_hw *ah, --			       struct ath9k_channel *chan, --			       struct cal_data_per_freq_ar9287 *pRawDataSet, --			       u8 *bChans, u16 availPiers, --			       u16 tPdGainOverlap, --			       u16 *pPdGainBoundaries, --			       u8 *pPDADCValues, --			       u16 numXpdGains) --{ --#define TMP_VAL_VPD_TABLE						\ --	((vpdTableI[i][sizeCurrVpdTable - 1] + (ss - maxIndex + 1) * vpdStep)); -- --	int i, j, k; --	int16_t ss; --	u16 idxL = 0, idxR = 0, numPiers; --	u8 *pVpdL, *pVpdR, *pPwrL, *pPwrR; --	u8 minPwrT4[AR9287_NUM_PD_GAINS]; --	u8 maxPwrT4[AR9287_NUM_PD_GAINS]; --	int16_t vpdStep; --	int16_t tmpVal; --	u16 sizeCurrVpdTable, maxIndex, tgtIndex; --	bool match; --	int16_t minDelta = 0; --	struct chan_centers centers; --	static u8 vpdTableL[AR5416_EEP4K_NUM_PD_GAINS] --		[AR5416_MAX_PWR_RANGE_IN_HALF_DB]; --	static u8 vpdTableR[AR5416_EEP4K_NUM_PD_GAINS] --		[AR5416_MAX_PWR_RANGE_IN_HALF_DB]; --	static u8 vpdTableI[AR5416_EEP4K_NUM_PD_GAINS] --		[AR5416_MAX_PWR_RANGE_IN_HALF_DB]; -- --	memset(&minPwrT4, 0, AR9287_NUM_PD_GAINS); --	ath9k_hw_get_channel_centers(ah, chan, ¢ers); -- --	for (numPiers = 0; numPiers < availPiers; numPiers++) { --		if (bChans[numPiers] == AR9287_BCHAN_UNUSED) --			break; --	} -- --	match = ath9k_hw_get_lower_upper_index( --		(u8)FREQ2FBIN(centers.synth_center, IS_CHAN_2GHZ(chan)), --		bChans, numPiers, &idxL, &idxR); -- --	if (match) { --		for (i = 0; i < numXpdGains; i++) { --			minPwrT4[i] = pRawDataSet[idxL].pwrPdg[i][0]; --			maxPwrT4[i] = pRawDataSet[idxL].pwrPdg[i][4]; --			ath9k_hw_fill_vpd_table(minPwrT4[i], maxPwrT4[i], --						pRawDataSet[idxL].pwrPdg[i], --						pRawDataSet[idxL].vpdPdg[i], --						AR9287_PD_GAIN_ICEPTS, --						vpdTableI[i]); --		} --	} else { --		for (i = 0; i < numXpdGains; i++) { --			pVpdL = pRawDataSet[idxL].vpdPdg[i]; --			pPwrL = pRawDataSet[idxL].pwrPdg[i]; --			pVpdR = pRawDataSet[idxR].vpdPdg[i]; --			pPwrR = pRawDataSet[idxR].pwrPdg[i]; -- --			minPwrT4[i] = max(pPwrL[0], pPwrR[0]); -- --			maxPwrT4[i] = min(pPwrL[AR9287_PD_GAIN_ICEPTS - 1], --					  pPwrR[AR9287_PD_GAIN_ICEPTS - 1]); -- --			ath9k_hw_fill_vpd_table(minPwrT4[i], maxPwrT4[i], --						pPwrL, pVpdL, --						AR9287_PD_GAIN_ICEPTS, --						vpdTableL[i]); --			ath9k_hw_fill_vpd_table(minPwrT4[i], maxPwrT4[i], --						pPwrR, pVpdR, --						AR9287_PD_GAIN_ICEPTS, --						vpdTableR[i]); -- --			for (j = 0; j <= (maxPwrT4[i] - minPwrT4[i]) / 2; j++) { --				vpdTableI[i][j] = (u8)(ath9k_hw_interpolate( --				       (u16)FREQ2FBIN(centers. synth_center, --						      IS_CHAN_2GHZ(chan)), --				       bChans[idxL], bChans[idxR], --				       vpdTableL[i][j], vpdTableR[i][j])); --			} --		} --	} -- --	k = 0; -- --	for (i = 0; i < numXpdGains; i++) { --		if (i == (numXpdGains - 1)) --			pPdGainBoundaries[i] = --				(u16)(maxPwrT4[i] / 2); --		else --			pPdGainBoundaries[i] = --				(u16)((maxPwrT4[i] + minPwrT4[i+1]) / 4); -- --		pPdGainBoundaries[i] = min((u16)AR5416_MAX_RATE_POWER, --					   pPdGainBoundaries[i]); -- -- --		minDelta = 0; -- --		if (i == 0) { --			if (AR_SREV_9280_20_OR_LATER(ah)) --				ss = (int16_t)(0 - (minPwrT4[i] / 2)); --			else --				ss = 0; --		} else { --			ss = (int16_t)((pPdGainBoundaries[i-1] - --					(minPwrT4[i] / 2)) - --				       tPdGainOverlap + 1 + minDelta); --		} -- --		vpdStep = (int16_t)(vpdTableI[i][1] - vpdTableI[i][0]); --		vpdStep = (int16_t)((vpdStep < 1) ? 1 : vpdStep); -- --		while ((ss < 0) && (k < (AR9287_NUM_PDADC_VALUES - 1)))	{ --			tmpVal = (int16_t)(vpdTableI[i][0] + ss * vpdStep); --			pPDADCValues[k++] = (u8)((tmpVal < 0) ? 0 : tmpVal); --			ss++; --		} -- --		sizeCurrVpdTable = (u8)((maxPwrT4[i] - minPwrT4[i]) / 2 + 1); --		tgtIndex = (u8)(pPdGainBoundaries[i] + --				tPdGainOverlap - (minPwrT4[i] / 2)); --		maxIndex = (tgtIndex < sizeCurrVpdTable) ? --			    tgtIndex : sizeCurrVpdTable; -- --		while ((ss < maxIndex) && (k < (AR9287_NUM_PDADC_VALUES - 1))) --			pPDADCValues[k++] = vpdTableI[i][ss++]; -- --		vpdStep = (int16_t)(vpdTableI[i][sizeCurrVpdTable - 1] - --				    vpdTableI[i][sizeCurrVpdTable - 2]); --		vpdStep = (int16_t)((vpdStep < 1) ? 1 : vpdStep); -- --		if (tgtIndex > maxIndex) { --			while ((ss <= tgtIndex) && --				(k < (AR9287_NUM_PDADC_VALUES - 1))) { --				tmpVal = (int16_t) TMP_VAL_VPD_TABLE; --				pPDADCValues[k++] = --					(u8)((tmpVal > 255) ? 255 : tmpVal); --				ss++; --			} --		} --	} -- --	while (i < AR9287_PD_GAINS_IN_MASK) { --		pPdGainBoundaries[i] = pPdGainBoundaries[i-1]; --		i++; --	} -- --	while (k < AR9287_NUM_PDADC_VALUES) { --		pPDADCValues[k] = pPDADCValues[k-1]; --		k++; --	} -- --#undef TMP_VAL_VPD_TABLE --} -- - static void ar9287_eeprom_get_tx_gain_index(struct ath_hw *ah, - 			    struct ath9k_channel *chan, - 			    struct cal_data_op_loop_ar9287 *pRawDatasetOpLoop, -@@ -392,7 +235,7 @@ static void ar9287_eeprom_get_tx_gain_in - 	ath9k_hw_get_channel_centers(ah, chan, ¢ers); -  - 	for (numPiers = 0; numPiers < availPiers; numPiers++) { --		if (pCalChans[numPiers] == AR9287_BCHAN_UNUSED) -+		if (pCalChans[numPiers] == AR5416_BCHAN_UNUSED) - 			break; - 	} -  -@@ -458,11 +301,11 @@ static void ath9k_hw_set_ar9287_power_ca - 	struct cal_data_op_loop_ar9287 *pRawDatasetOpenLoop; - 	u8 *pCalBChans = NULL; - 	u16 pdGainOverlap_t2; --	u8 pdadcValues[AR9287_NUM_PDADC_VALUES]; --	u16 gainBoundaries[AR9287_PD_GAINS_IN_MASK]; -+	u8 pdadcValues[AR5416_NUM_PDADC_VALUES]; -+	u16 gainBoundaries[AR5416_PD_GAINS_IN_MASK]; - 	u16 numPiers = 0, i, j; - 	u16 numXpdGain, xpdMask; --	u16 xpdGainValues[AR9287_NUM_PD_GAINS] = {0, 0, 0, 0}; -+	u16 xpdGainValues[AR5416_NUM_PD_GAINS] = {0, 0, 0, 0}; - 	u32 reg32, regOffset, regChainOffset, regval; - 	int16_t modalIdx, diff = 0; - 	struct ar9287_eeprom *pEepData = &ah->eeprom.map9287; -@@ -490,12 +333,12 @@ static void ath9k_hw_set_ar9287_power_ca - 	numXpdGain = 0; -  - 	/* Calculate the value of xpdgains from the xpdGain Mask */ --	for (i = 1; i <= AR9287_PD_GAINS_IN_MASK; i++) { --		if ((xpdMask >> (AR9287_PD_GAINS_IN_MASK - i)) & 1) { --			if (numXpdGain >= AR9287_NUM_PD_GAINS) -+	for (i = 1; i <= AR5416_PD_GAINS_IN_MASK; i++) { -+		if ((xpdMask >> (AR5416_PD_GAINS_IN_MASK - i)) & 1) { -+			if (numXpdGain >= AR5416_NUM_PD_GAINS) - 				break; - 			xpdGainValues[numXpdGain] = --				(u16)(AR9287_PD_GAINS_IN_MASK-i); -+				(u16)(AR5416_PD_GAINS_IN_MASK-i); - 			numXpdGain++; - 		} - 	} -@@ -528,7 +371,7 @@ static void ath9k_hw_set_ar9287_power_ca - 					(struct cal_data_per_freq_ar9287 *) - 					pEepData->calPierData2G[i]; -  --				ath9k_hw_get_ar9287_gain_boundaries_pdadcs(ah, chan, -+				ath9k_hw_get_gain_boundaries_pdadcs(ah, chan, - 							   pRawDataset, - 							   pCalBChans, numPiers, - 							   pdGainOverlap_t2, -@@ -564,13 +407,13 @@ static void ath9k_hw_set_ar9287_power_ca - 					     (int32_t)AR9287_PWR_TABLE_OFFSET_DB); - 				diff *= 2; -  --				for (j = 0; j < ((u16)AR9287_NUM_PDADC_VALUES-diff); j++) -+				for (j = 0; j < ((u16)AR5416_NUM_PDADC_VALUES-diff); j++) - 					pdadcValues[j] = pdadcValues[j+diff]; -  --				for (j = (u16)(AR9287_NUM_PDADC_VALUES-diff); --				     j < AR9287_NUM_PDADC_VALUES; j++) -+				for (j = (u16)(AR5416_NUM_PDADC_VALUES-diff); -+				     j < AR5416_NUM_PDADC_VALUES; j++) - 					pdadcValues[j] = --					  pdadcValues[AR9287_NUM_PDADC_VALUES-diff]; -+					  pdadcValues[AR5416_NUM_PDADC_VALUES-diff]; - 			} -  - 			if (!ath9k_hw_ar9287_get_eeprom(ah, EEP_OL_PWRCTRL)) { -@@ -613,9 +456,9 @@ static void ath9k_hw_set_ar9287_power_pe - #define REDUCE_SCALED_POWER_BY_THREE_CHAIN   10 -  - 	struct ath_regulatory *regulatory = ath9k_hw_regulatory(ah); --	u16 twiceMaxEdgePower = AR5416_MAX_RATE_POWER; -+	u16 twiceMaxEdgePower = MAX_RATE_POWER; - 	static const u16 tpScaleReductionTable[5] = --		{ 0, 3, 6, 9, AR5416_MAX_RATE_POWER }; -+		{ 0, 3, 6, 9, MAX_RATE_POWER }; - 	int i; - 	int16_t twiceLargestAntenna; - 	struct cal_ctl_data_ar9287 *rep; -@@ -880,8 +723,8 @@ static void ath9k_hw_ar9287_set_txpower( - 	regulatory->max_power_level = 0; - 	for (i = 0; i < ARRAY_SIZE(ratesArray); i++) { - 		ratesArray[i] = (int16_t)(txPowerIndexOffset + ratesArray[i]); --		if (ratesArray[i] > AR9287_MAX_RATE_POWER) --			ratesArray[i] = AR9287_MAX_RATE_POWER; -+		if (ratesArray[i] > MAX_RATE_POWER) -+			ratesArray[i] = MAX_RATE_POWER; -  - 		if (ratesArray[i] > regulatory->max_power_level) - 			regulatory->max_power_level = ratesArray[i]; -@@ -1026,8 +869,7 @@ static void ath9k_hw_ar9287_set_board_va - 		antWrites[j++] = (u16)(pModal->antCtrlChain[i] & 0x3); - 	} -  --	REG_WRITE(ah, AR_PHY_SWITCH_COM, --		  ah->eep_ops->get_eeprom_antenna_cfg(ah, chan)); -+	REG_WRITE(ah, AR_PHY_SWITCH_COM, pModal->antCtrlCommon); -  - 	for (i = 0; i < AR9287_MAX_CHAINS; i++)	{ - 		regChainOffset = i * 0x1000; -@@ -1128,21 +970,6 @@ static void ath9k_hw_ar9287_set_board_va - 				  pModal->xpaBiasLvl); - } -  --static u8 ath9k_hw_ar9287_get_num_ant_config(struct ath_hw *ah, --					     enum ath9k_hal_freq_band freq_band) --{ --	return 1; --} -- --static u32 ath9k_hw_ar9287_get_eeprom_antenna_cfg(struct ath_hw *ah, --						  struct ath9k_channel *chan) --{ --	struct ar9287_eeprom *eep = &ah->eeprom.map9287; --	struct modal_eep_ar9287_header *pModal = &eep->modalHeader; -- --	return pModal->antCtrlCommon; --} -- - static u16 ath9k_hw_ar9287_get_spur_channel(struct ath_hw *ah, - 					    u16 i, bool is2GHz) - { -@@ -1180,8 +1007,6 @@ const struct eeprom_ops eep_ar9287_ops = - 	.fill_eeprom		= ath9k_hw_ar9287_fill_eeprom, - 	.get_eeprom_ver		= ath9k_hw_ar9287_get_eeprom_ver, - 	.get_eeprom_rev		= ath9k_hw_ar9287_get_eeprom_rev, --	.get_num_ant_config	= ath9k_hw_ar9287_get_num_ant_config, --	.get_eeprom_antenna_cfg	= ath9k_hw_ar9287_get_eeprom_antenna_cfg, - 	.set_board_values	= ath9k_hw_ar9287_set_board_values, - 	.set_addac		= ath9k_hw_ar9287_set_addac, - 	.set_txpower		= ath9k_hw_ar9287_set_txpower, ---- a/drivers/net/wireless/ath/ath9k/eeprom_def.c -+++ b/drivers/net/wireless/ath/ath9k/eeprom_def.c -@@ -207,7 +207,7 @@ static int ath9k_hw_def_check_eeprom(str - 				pModal->antCtrlChain[i] = integer; - 			} -  --			for (i = 0; i < AR5416_EEPROM_MODAL_SPURS; i++) { -+			for (i = 0; i < AR_EEPROM_MODAL_SPURS; i++) { - 				word = swab16(pModal->spurChans[i].spurChan); - 				pModal->spurChans[i].spurChan = word; - 			} -@@ -376,8 +376,7 @@ static void ath9k_hw_def_set_board_value - 	pModal = &(eep->modalHeader[IS_CHAN_2GHZ(chan)]); - 	txRxAttenLocal = IS_CHAN_2GHZ(chan) ? 23 : 44; -  --	REG_WRITE(ah, AR_PHY_SWITCH_COM, --		  ah->eep_ops->get_eeprom_antenna_cfg(ah, chan)); -+	REG_WRITE(ah, AR_PHY_SWITCH_COM, pModal->antCtrlCommon & 0xffff); -  - 	for (i = 0; i < AR5416_MAX_CHAINS; i++) { - 		if (AR_SREV_9280(ah)) { -@@ -590,168 +589,6 @@ static void ath9k_hw_def_set_addac(struc - #undef XPA_LVL_FREQ - } -  --static void ath9k_hw_get_def_gain_boundaries_pdadcs(struct ath_hw *ah, --				struct ath9k_channel *chan, --				struct cal_data_per_freq *pRawDataSet, --				u8 *bChans, u16 availPiers, --				u16 tPdGainOverlap, --				u16 *pPdGainBoundaries, u8 *pPDADCValues, --				u16 numXpdGains) --{ --	int i, j, k; --	int16_t ss; --	u16 idxL = 0, idxR = 0, numPiers; --	static u8 vpdTableL[AR5416_NUM_PD_GAINS] --		[AR5416_MAX_PWR_RANGE_IN_HALF_DB]; --	static u8 vpdTableR[AR5416_NUM_PD_GAINS] --		[AR5416_MAX_PWR_RANGE_IN_HALF_DB]; --	static u8 vpdTableI[AR5416_NUM_PD_GAINS] --		[AR5416_MAX_PWR_RANGE_IN_HALF_DB]; -- --	u8 *pVpdL, *pVpdR, *pPwrL, *pPwrR; --	u8 minPwrT4[AR5416_NUM_PD_GAINS]; --	u8 maxPwrT4[AR5416_NUM_PD_GAINS]; --	int16_t vpdStep; --	int16_t tmpVal; --	u16 sizeCurrVpdTable, maxIndex, tgtIndex; --	bool match; --	int16_t minDelta = 0; --	struct chan_centers centers; -- --	memset(&minPwrT4, 0, AR9287_NUM_PD_GAINS); --	ath9k_hw_get_channel_centers(ah, chan, ¢ers); -- --	for (numPiers = 0; numPiers < availPiers; numPiers++) { --		if (bChans[numPiers] == AR5416_BCHAN_UNUSED) --			break; --	} -- --	match = ath9k_hw_get_lower_upper_index((u8)FREQ2FBIN(centers.synth_center, --							     IS_CHAN_2GHZ(chan)), --					       bChans, numPiers, &idxL, &idxR); -- --	if (match) { --		for (i = 0; i < numXpdGains; i++) { --			minPwrT4[i] = pRawDataSet[idxL].pwrPdg[i][0]; --			maxPwrT4[i] = pRawDataSet[idxL].pwrPdg[i][4]; --			ath9k_hw_fill_vpd_table(minPwrT4[i], maxPwrT4[i], --					pRawDataSet[idxL].pwrPdg[i], --					pRawDataSet[idxL].vpdPdg[i], --					AR5416_PD_GAIN_ICEPTS, --					vpdTableI[i]); --		} --	} else { --		for (i = 0; i < numXpdGains; i++) { --			pVpdL = pRawDataSet[idxL].vpdPdg[i]; --			pPwrL = pRawDataSet[idxL].pwrPdg[i]; --			pVpdR = pRawDataSet[idxR].vpdPdg[i]; --			pPwrR = pRawDataSet[idxR].pwrPdg[i]; -- --			minPwrT4[i] = max(pPwrL[0], pPwrR[0]); -- --			maxPwrT4[i] = --				min(pPwrL[AR5416_PD_GAIN_ICEPTS - 1], --				    pPwrR[AR5416_PD_GAIN_ICEPTS - 1]); -- -- --			ath9k_hw_fill_vpd_table(minPwrT4[i], maxPwrT4[i], --						pPwrL, pVpdL, --						AR5416_PD_GAIN_ICEPTS, --						vpdTableL[i]); --			ath9k_hw_fill_vpd_table(minPwrT4[i], maxPwrT4[i], --						pPwrR, pVpdR, --						AR5416_PD_GAIN_ICEPTS, --						vpdTableR[i]); -- --			for (j = 0; j <= (maxPwrT4[i] - minPwrT4[i]) / 2; j++) { --				vpdTableI[i][j] = --					(u8)(ath9k_hw_interpolate((u16) --					     FREQ2FBIN(centers. --						       synth_center, --						       IS_CHAN_2GHZ --						       (chan)), --					     bChans[idxL], bChans[idxR], --					     vpdTableL[i][j], vpdTableR[i][j])); --			} --		} --	} -- --	k = 0; -- --	for (i = 0; i < numXpdGains; i++) { --		if (i == (numXpdGains - 1)) --			pPdGainBoundaries[i] = --				(u16)(maxPwrT4[i] / 2); --		else --			pPdGainBoundaries[i] = --				(u16)((maxPwrT4[i] + minPwrT4[i + 1]) / 4); -- --		pPdGainBoundaries[i] = --			min((u16)AR5416_MAX_RATE_POWER, pPdGainBoundaries[i]); -- --		if ((i == 0) && !AR_SREV_5416_20_OR_LATER(ah)) { --			minDelta = pPdGainBoundaries[0] - 23; --			pPdGainBoundaries[0] = 23; --		} else { --			minDelta = 0; --		} -- --		if (i == 0) { --			if (AR_SREV_9280_20_OR_LATER(ah)) --				ss = (int16_t)(0 - (minPwrT4[i] / 2)); --			else --				ss = 0; --		} else { --			ss = (int16_t)((pPdGainBoundaries[i - 1] - --					(minPwrT4[i] / 2)) - --				       tPdGainOverlap + 1 + minDelta); --		} --		vpdStep = (int16_t)(vpdTableI[i][1] - vpdTableI[i][0]); --		vpdStep = (int16_t)((vpdStep < 1) ? 1 : vpdStep); -- --		while ((ss < 0) && (k < (AR5416_NUM_PDADC_VALUES - 1))) { --			tmpVal = (int16_t)(vpdTableI[i][0] + ss * vpdStep); --			pPDADCValues[k++] = (u8)((tmpVal < 0) ? 0 : tmpVal); --			ss++; --		} -- --		sizeCurrVpdTable = (u8) ((maxPwrT4[i] - minPwrT4[i]) / 2 + 1); --		tgtIndex = (u8)(pPdGainBoundaries[i] + tPdGainOverlap - --				(minPwrT4[i] / 2)); --		maxIndex = (tgtIndex < sizeCurrVpdTable) ? --			tgtIndex : sizeCurrVpdTable; -- --		while ((ss < maxIndex) && (k < (AR5416_NUM_PDADC_VALUES - 1))) { --			pPDADCValues[k++] = vpdTableI[i][ss++]; --		} -- --		vpdStep = (int16_t)(vpdTableI[i][sizeCurrVpdTable - 1] - --				    vpdTableI[i][sizeCurrVpdTable - 2]); --		vpdStep = (int16_t)((vpdStep < 1) ? 1 : vpdStep); -- --		if (tgtIndex >= maxIndex) { --			while ((ss <= tgtIndex) && --			       (k < (AR5416_NUM_PDADC_VALUES - 1))) { --				tmpVal = (int16_t)((vpdTableI[i][sizeCurrVpdTable - 1] + --						    (ss - maxIndex + 1) * vpdStep)); --				pPDADCValues[k++] = (u8)((tmpVal > 255) ? --							 255 : tmpVal); --				ss++; --			} --		} --	} -- --	while (i < AR5416_PD_GAINS_IN_MASK) { --		pPdGainBoundaries[i] = pPdGainBoundaries[i - 1]; --		i++; --	} -- --	while (k < AR5416_NUM_PDADC_VALUES) { --		pPDADCValues[k] = pPDADCValues[k - 1]; --		k++; --	} --} -- - static int16_t ath9k_change_gain_boundary_setting(struct ath_hw *ah, - 				u16 *gb, - 				u16 numXpdGain, -@@ -784,7 +621,7 @@ static int16_t ath9k_change_gain_boundar - 		/* Because of a hardware limitation, ensure the gain boundary - 		 * is not larger than (63 - overlap) - 		 */ --		gb_limit = (u16)(AR5416_MAX_RATE_POWER - pdGainOverlap_t2); -+		gb_limit = (u16)(MAX_RATE_POWER - pdGainOverlap_t2); -  - 		for (k = 0; k < numXpdGain; k++) - 			gb[k] = (u16)min(gb_limit, gb[k]); -@@ -918,7 +755,7 @@ static void ath9k_hw_set_def_power_cal_t - 				ath9k_olc_get_pdadcs(ah, pcdacIdx, - 						     txPower/2, pdadcValues); - 			} else { --				ath9k_hw_get_def_gain_boundaries_pdadcs(ah, -+				ath9k_hw_get_gain_boundaries_pdadcs(ah, - 							chan, pRawDataset, - 							pCalBChans, numPiers, - 							pdGainOverlap_t2, -@@ -1004,9 +841,9 @@ static void ath9k_hw_set_def_power_per_r -  - 	struct ath_regulatory *regulatory = ath9k_hw_regulatory(ah); - 	struct ar5416_eeprom_def *pEepData = &ah->eeprom.def; --	u16 twiceMaxEdgePower = AR5416_MAX_RATE_POWER; -+	u16 twiceMaxEdgePower = MAX_RATE_POWER; - 	static const u16 tpScaleReductionTable[5] = --		{ 0, 3, 6, 9, AR5416_MAX_RATE_POWER }; -+		{ 0, 3, 6, 9, MAX_RATE_POWER }; -  - 	int i; - 	int16_t twiceLargestAntenna; -@@ -1147,7 +984,7 @@ static void ath9k_hw_set_def_power_per_r -  - 		if (ah->eep_ops->get_eeprom_ver(ah) == 14 && - 		    ah->eep_ops->get_eeprom_rev(ah) <= 2) --			twiceMaxEdgePower = AR5416_MAX_RATE_POWER; -+			twiceMaxEdgePower = MAX_RATE_POWER; -  - 		for (i = 0; (i < AR5416_NUM_CTLS) && pEepData->ctlIndex[i]; i++) { - 			if ((((cfgCtl & ~CTL_MODE_M) | -@@ -1292,8 +1129,8 @@ static void ath9k_hw_def_set_txpower(str - 	regulatory->max_power_level = 0; - 	for (i = 0; i < ARRAY_SIZE(ratesArray); i++) { - 		ratesArray[i] =	(int16_t)(txPowerIndexOffset + ratesArray[i]); --		if (ratesArray[i] > AR5416_MAX_RATE_POWER) --			ratesArray[i] = AR5416_MAX_RATE_POWER; -+		if (ratesArray[i] > MAX_RATE_POWER) -+			ratesArray[i] = MAX_RATE_POWER; - 		if (ratesArray[i] > regulatory->max_power_level) - 			regulatory->max_power_level = ratesArray[i]; - 	} -@@ -1425,34 +1262,6 @@ static void ath9k_hw_def_set_txpower(str - 		  | ATH9K_POW_SM(pModal->pwrDecreaseFor2Chain, 0)); - } -  --static u8 ath9k_hw_def_get_num_ant_config(struct ath_hw *ah, --					  enum ath9k_hal_freq_band freq_band) --{ --	struct ar5416_eeprom_def *eep = &ah->eeprom.def; --	struct modal_eep_header *pModal = --		&(eep->modalHeader[freq_band]); --	struct base_eep_header *pBase = &eep->baseEepHeader; --	u8 num_ant_config; -- --	num_ant_config = 1; -- --	if (pBase->version >= 0x0E0D && --	    (pModal->lna_ctl & LNA_CTL_USE_ANT1)) --		num_ant_config += 1; -- --	return num_ant_config; --} -- --static u32 ath9k_hw_def_get_eeprom_antenna_cfg(struct ath_hw *ah, --					       struct ath9k_channel *chan) --{ --	struct ar5416_eeprom_def *eep = &ah->eeprom.def; --	struct modal_eep_header *pModal = --		&(eep->modalHeader[IS_CHAN_2GHZ(chan)]); -- --	return pModal->antCtrlCommon; --} -- - static u16 ath9k_hw_def_get_spur_channel(struct ath_hw *ah, u16 i, bool is2GHz) - { - #define EEP_DEF_SPURCHAN \ -@@ -1489,8 +1298,6 @@ const struct eeprom_ops eep_def_ops = { - 	.fill_eeprom		= ath9k_hw_def_fill_eeprom, - 	.get_eeprom_ver		= ath9k_hw_def_get_eeprom_ver, - 	.get_eeprom_rev		= ath9k_hw_def_get_eeprom_rev, --	.get_num_ant_config	= ath9k_hw_def_get_num_ant_config, --	.get_eeprom_antenna_cfg	= ath9k_hw_def_get_eeprom_antenna_cfg, - 	.set_board_values	= ath9k_hw_def_set_board_values, - 	.set_addac		= ath9k_hw_def_set_addac, - 	.set_txpower		= ath9k_hw_def_set_txpower, ---- a/drivers/net/wireless/ath/ath9k/hw.c -+++ b/drivers/net/wireless/ath/ath9k/hw.c -@@ -54,13 +54,6 @@ static void ath9k_hw_init_mode_regs(stru - 	ath9k_hw_private_ops(ah)->init_mode_regs(ah); - } -  --static bool ath9k_hw_macversion_supported(struct ath_hw *ah) --{ --	struct ath_hw_private_ops *priv_ops = ath9k_hw_private_ops(ah); -- --	return priv_ops->macversion_supported(ah->hw_version.macVersion); --} -- - static u32 ath9k_hw_compute_pll_control(struct ath_hw *ah, - 					struct ath9k_channel *chan) - { -@@ -284,11 +277,9 @@ static void ath9k_hw_read_revisions(stru -  - static void ath9k_hw_disablepcie(struct ath_hw *ah) - { --	if (AR_SREV_9100(ah)) -+	if (!AR_SREV_5416(ah)) - 		return; -  --	ENABLE_REGWRITE_BUFFER(ah); -- - 	REG_WRITE(ah, AR_PCIE_SERDES, 0x9248fc00); - 	REG_WRITE(ah, AR_PCIE_SERDES, 0x24924924); - 	REG_WRITE(ah, AR_PCIE_SERDES, 0x28000029); -@@ -300,8 +291,6 @@ static void ath9k_hw_disablepcie(struct  - 	REG_WRITE(ah, AR_PCIE_SERDES, 0x000e1007); -  - 	REG_WRITE(ah, AR_PCIE_SERDES2, 0x00000000); -- --	REGWRITE_BUFFER_FLUSH(ah); - } -  - /* This should work for all families including legacy */ -@@ -422,7 +411,6 @@ static void ath9k_hw_init_defaults(struc - 	ah->sta_id1_defaults = - 		AR_STA_ID1_CRPT_MIC_ENABLE | - 		AR_STA_ID1_MCAST_KSRCH; --	ah->beacon_interval = 100; - 	ah->enable_32kHz_clock = DONT_USE_32KHZ; - 	ah->slottime = (u32) -1; - 	ah->globaltxtimeout = (u32) -1; -@@ -544,7 +532,18 @@ static int __ath9k_hw_init(struct ath_hw - 	else - 		ah->config.max_txtrig_level = MAX_TX_FIFO_THRESHOLD; -  --	if (!ath9k_hw_macversion_supported(ah)) { -+	switch (ah->hw_version.macVersion) { -+	case AR_SREV_VERSION_5416_PCI: -+	case AR_SREV_VERSION_5416_PCIE: -+	case AR_SREV_VERSION_9160: -+	case AR_SREV_VERSION_9100: -+	case AR_SREV_VERSION_9280: -+	case AR_SREV_VERSION_9285: -+	case AR_SREV_VERSION_9287: -+	case AR_SREV_VERSION_9271: -+	case AR_SREV_VERSION_9300: -+		break; -+	default: - 		ath_print(common, ATH_DBG_FATAL, - 			  "Mac Chip Rev 0x%02x.%x is not supported by " - 			  "this driver\n", ah->hw_version.macVersion, -@@ -1643,8 +1642,6 @@ void ath9k_hw_beaconinit(struct ath_hw * - { - 	int flags = 0; -  --	ah->beacon_interval = beacon_period; -- - 	ENABLE_REGWRITE_BUFFER(ah); -  - 	switch (ah->opmode) { -@@ -1936,11 +1933,6 @@ int ath9k_hw_fill_cap_info(struct ath_hw - 	    AR_SREV_5416(ah)) - 		pCap->reg_cap |= AR_EEPROM_EEREGCAP_EN_FCC_MIDBAND; -  --	pCap->num_antcfg_5ghz = --		ah->eep_ops->get_num_ant_config(ah, ATH9K_HAL_FREQ_BAND_5GHZ); --	pCap->num_antcfg_2ghz = --		ah->eep_ops->get_num_ant_config(ah, ATH9K_HAL_FREQ_BAND_2GHZ); -- - 	if (AR_SREV_9280_20_OR_LATER(ah) && common->btcoex_enabled) { - 		btcoex_hw->btactive_gpio = ATH_BTACTIVE_GPIO; - 		btcoex_hw->wlanactive_gpio = ATH_WLANACTIVE_GPIO; ---- a/drivers/net/wireless/ath/ath9k/hw.h -+++ b/drivers/net/wireless/ath/ath9k/hw.h -@@ -202,8 +202,6 @@ struct ath9k_hw_capabilities { - 	u16 tx_triglevel_max; - 	u16 reg_cap; - 	u8 num_gpio_pins; --	u8 num_antcfg_2ghz; --	u8 num_antcfg_5ghz; - 	u8 rx_hp_qdepth; - 	u8 rx_lp_qdepth; - 	u8 rx_status_len; -@@ -234,7 +232,6 @@ struct ath9k_ops_config { - #define SPUR_DISABLE        	0 - #define SPUR_ENABLE_IOCTL   	1 - #define SPUR_ENABLE_EEPROM  	2 --#define AR_EEPROM_MODAL_SPURS   5 - #define AR_SPUR_5413_1      	1640 - #define AR_SPUR_5413_2      	1200 - #define AR_NO_SPUR      	0x8000 -@@ -530,7 +527,6 @@ struct ath_hw_radar_conf { -  * -  * @init_mode_regs: Initializes mode registers -  * @init_mode_gain_regs: Initialize TX/RX gain registers -- * @macversion_supported: If this specific mac revision is supported -  * -  * @rf_set_freq: change frequency -  * @spur_mitigate_freq: spur mitigation -@@ -552,7 +548,6 @@ struct ath_hw_private_ops { -  - 	void (*init_mode_regs)(struct ath_hw *ah); - 	void (*init_mode_gain_regs)(struct ath_hw *ah); --	bool (*macversion_supported)(u32 macversion); - 	void (*setup_calibration)(struct ath_hw *ah, - 				  struct ath9k_cal_list *currCal); -  -@@ -762,9 +757,7 @@ struct ath_hw { - 	u32 *bank6Temp; -  - 	u8 txpower_limit; --	int16_t txpower_indexoffset; - 	int coverage_class; --	u32 beacon_interval; - 	u32 slottime; - 	u32 globaltxtimeout; -  ---- a/net/mac80211/led.c -+++ b/net/mac80211/led.c -@@ -54,12 +54,22 @@ void ieee80211_led_radio(struct ieee8021 - 		led_trigger_event(local->radio_led, LED_OFF); - } -  -+void ieee80211_led_names(struct ieee80211_local *local) -+{ -+	snprintf(local->rx_led_name, sizeof(local->rx_led_name), -+		 "%srx", wiphy_name(local->hw.wiphy)); -+	snprintf(local->tx_led_name, sizeof(local->tx_led_name), -+		 "%stx", wiphy_name(local->hw.wiphy)); -+	snprintf(local->assoc_led_name, sizeof(local->assoc_led_name), -+		 "%sassoc", wiphy_name(local->hw.wiphy)); -+	snprintf(local->radio_led_name, sizeof(local->radio_led_name), -+		 "%sradio", wiphy_name(local->hw.wiphy)); -+} -+ - void ieee80211_led_init(struct ieee80211_local *local) - { - 	local->rx_led = kzalloc(sizeof(struct led_trigger), GFP_KERNEL); - 	if (local->rx_led) { --		snprintf(local->rx_led_name, sizeof(local->rx_led_name), --			 "%srx", wiphy_name(local->hw.wiphy)); - 		local->rx_led->name = local->rx_led_name; - 		if (led_trigger_register(local->rx_led)) { - 			kfree(local->rx_led); -@@ -69,8 +79,6 @@ void ieee80211_led_init(struct ieee80211 -  - 	local->tx_led = kzalloc(sizeof(struct led_trigger), GFP_KERNEL); - 	if (local->tx_led) { --		snprintf(local->tx_led_name, sizeof(local->tx_led_name), --			 "%stx", wiphy_name(local->hw.wiphy)); - 		local->tx_led->name = local->tx_led_name; - 		if (led_trigger_register(local->tx_led)) { - 			kfree(local->tx_led); -@@ -80,8 +88,6 @@ void ieee80211_led_init(struct ieee80211 -  - 	local->assoc_led = kzalloc(sizeof(struct led_trigger), GFP_KERNEL); - 	if (local->assoc_led) { --		snprintf(local->assoc_led_name, sizeof(local->assoc_led_name), --			 "%sassoc", wiphy_name(local->hw.wiphy)); - 		local->assoc_led->name = local->assoc_led_name; - 		if (led_trigger_register(local->assoc_led)) { - 			kfree(local->assoc_led); -@@ -91,14 +97,19 @@ void ieee80211_led_init(struct ieee80211 -  - 	local->radio_led = kzalloc(sizeof(struct led_trigger), GFP_KERNEL); - 	if (local->radio_led) { --		snprintf(local->radio_led_name, sizeof(local->radio_led_name), --			 "%sradio", wiphy_name(local->hw.wiphy)); - 		local->radio_led->name = local->radio_led_name; - 		if (led_trigger_register(local->radio_led)) { - 			kfree(local->radio_led); - 			local->radio_led = NULL; - 		} - 	} -+ -+	if (local->tpt_led_trigger) { -+		if (led_trigger_register(&local->tpt_led_trigger->trig)) { -+			kfree(local->tpt_led_trigger); -+			local->tpt_led_trigger = NULL; -+		} -+	} - } -  - void ieee80211_led_exit(struct ieee80211_local *local) -@@ -119,15 +130,18 @@ void ieee80211_led_exit(struct ieee80211 - 		led_trigger_unregister(local->rx_led); - 		kfree(local->rx_led); - 	} -+ -+	if (local->tpt_led_trigger) { -+		led_trigger_unregister(&local->tpt_led_trigger->trig); -+		kfree(local->tpt_led_trigger); -+	} - } -  - char *__ieee80211_get_radio_led_name(struct ieee80211_hw *hw) - { - 	struct ieee80211_local *local = hw_to_local(hw); -  --	if (local->radio_led) --		return local->radio_led_name; --	return NULL; -+	return local->radio_led_name; - } - EXPORT_SYMBOL(__ieee80211_get_radio_led_name); -  -@@ -135,9 +149,7 @@ char *__ieee80211_get_assoc_led_name(str - { - 	struct ieee80211_local *local = hw_to_local(hw); -  --	if (local->assoc_led) --		return local->assoc_led_name; --	return NULL; -+	return local->assoc_led_name; - } - EXPORT_SYMBOL(__ieee80211_get_assoc_led_name); -  -@@ -145,9 +157,7 @@ char *__ieee80211_get_tx_led_name(struct - { - 	struct ieee80211_local *local = hw_to_local(hw); -  --	if (local->tx_led) --		return local->tx_led_name; --	return NULL; -+	return local->tx_led_name; - } - EXPORT_SYMBOL(__ieee80211_get_tx_led_name); -  -@@ -155,8 +165,115 @@ char *__ieee80211_get_rx_led_name(struct - { - 	struct ieee80211_local *local = hw_to_local(hw); -  --	if (local->rx_led) --		return local->rx_led_name; --	return NULL; -+	return local->rx_led_name; - } - EXPORT_SYMBOL(__ieee80211_get_rx_led_name); -+ -+static unsigned long tpt_trig_traffic(struct ieee80211_local *local, -+				      struct tpt_led_trigger *tpt_trig) -+{ -+	unsigned long traffic, delta; -+ -+	traffic = tpt_trig->tx_bytes + tpt_trig->rx_bytes; -+ -+	delta = traffic - tpt_trig->prev_traffic; -+	tpt_trig->prev_traffic = traffic; -+	return DIV_ROUND_UP(delta, 1024 / 8); -+} -+ -+static void tpt_trig_timer(unsigned long data) -+{ -+	struct ieee80211_local *local = (void *)data; -+	struct tpt_led_trigger *tpt_trig = local->tpt_led_trigger; -+	struct led_classdev *led_cdev; -+	unsigned long on, off, tpt; -+	int i; -+ -+	if (!tpt_trig->running) -+		return; -+ -+	mod_timer(&tpt_trig->timer, round_jiffies(jiffies + HZ)); -+ -+	tpt = tpt_trig_traffic(local, tpt_trig); -+ -+	/* default to just solid on */ -+	on = 1; -+	off = 0; -+ -+	for (i = tpt_trig->blink_table_len - 1; i >= 0; i--) { -+		if (tpt_trig->blink_table[i].throughput < 0 || -+		    tpt > tpt_trig->blink_table[i].throughput) { -+			off = tpt_trig->blink_table[i].blink_time / 2; -+			on = tpt_trig->blink_table[i].blink_time - off; -+			break; -+		} -+	} -+ -+	read_lock(&tpt_trig->trig.leddev_list_lock); -+	list_for_each_entry(led_cdev, &tpt_trig->trig.led_cdevs, trig_list) -+		led_blink_set(led_cdev, &on, &off); -+	read_unlock(&tpt_trig->trig.leddev_list_lock); -+} -+ -+extern char *__ieee80211_create_tpt_led_trigger( -+				struct ieee80211_hw *hw, -+				const struct ieee80211_tpt_blink *blink_table, -+				unsigned int blink_table_len) -+{ -+	struct ieee80211_local *local = hw_to_local(hw); -+	struct tpt_led_trigger *tpt_trig; -+ -+	if (WARN_ON(local->tpt_led_trigger)) -+		return NULL; -+ -+	tpt_trig = kzalloc(sizeof(struct tpt_led_trigger), GFP_KERNEL); -+	if (!tpt_trig) -+		return NULL; -+ -+	snprintf(tpt_trig->name, sizeof(tpt_trig->name), -+		 "%stpt", wiphy_name(local->hw.wiphy)); -+ -+	tpt_trig->trig.name = tpt_trig->name; -+ -+	tpt_trig->blink_table = blink_table; -+	tpt_trig->blink_table_len = blink_table_len; -+ -+	setup_timer(&tpt_trig->timer, tpt_trig_timer, (unsigned long)local); -+ -+	local->tpt_led_trigger = tpt_trig; -+ -+	return tpt_trig->name; -+} -+EXPORT_SYMBOL(__ieee80211_create_tpt_led_trigger); -+ -+void ieee80211_start_tpt_led_trig(struct ieee80211_local *local) -+{ -+	struct tpt_led_trigger *tpt_trig = local->tpt_led_trigger; -+ -+	if (!tpt_trig) -+		return; -+ -+	/* reset traffic */ -+	tpt_trig_traffic(local, tpt_trig); -+	tpt_trig->running = true; -+ -+	tpt_trig_timer((unsigned long)local); -+	mod_timer(&tpt_trig->timer, round_jiffies(jiffies + HZ)); -+} -+ -+void ieee80211_stop_tpt_led_trig(struct ieee80211_local *local) -+{ -+	struct tpt_led_trigger *tpt_trig = local->tpt_led_trigger; -+	struct led_classdev *led_cdev; -+ -+	if (!tpt_trig) -+		return; -+ -+	tpt_trig->running = false; -+	del_timer_sync(&tpt_trig->timer); -+ -+	read_lock(&tpt_trig->trig.leddev_list_lock); -+	list_for_each_entry(led_cdev, &tpt_trig->trig.led_cdevs, trig_list) -+		led_brightness_set(led_cdev, LED_OFF); -+	read_unlock(&tpt_trig->trig.leddev_list_lock); -+} ---- a/net/mac80211/led.h -+++ b/net/mac80211/led.h -@@ -12,14 +12,17 @@ - #include "ieee80211_i.h" -  - #ifdef CONFIG_MAC80211_LEDS --extern void ieee80211_led_rx(struct ieee80211_local *local); --extern void ieee80211_led_tx(struct ieee80211_local *local, int q); --extern void ieee80211_led_assoc(struct ieee80211_local *local, --				bool associated); --extern void ieee80211_led_radio(struct ieee80211_local *local, --				bool enabled); --extern void ieee80211_led_init(struct ieee80211_local *local); --extern void ieee80211_led_exit(struct ieee80211_local *local); -+void ieee80211_led_rx(struct ieee80211_local *local); -+void ieee80211_led_tx(struct ieee80211_local *local, int q); -+void ieee80211_led_assoc(struct ieee80211_local *local, -+			 bool associated); -+void ieee80211_led_radio(struct ieee80211_local *local, -+			 bool enabled); -+void ieee80211_led_names(struct ieee80211_local *local); -+void ieee80211_led_init(struct ieee80211_local *local); -+void ieee80211_led_exit(struct ieee80211_local *local); -+void ieee80211_start_tpt_led_trig(struct ieee80211_local *local); -+void ieee80211_stop_tpt_led_trig(struct ieee80211_local *local); - #else - static inline void ieee80211_led_rx(struct ieee80211_local *local) - { -@@ -35,10 +38,37 @@ static inline void ieee80211_led_radio(s - 				       bool enabled) - { - } -+static inline void ieee80211_led_names(struct ieee80211_local *local) -+{ -+} - static inline void ieee80211_led_init(struct ieee80211_local *local) - { - } - static inline void ieee80211_led_exit(struct ieee80211_local *local) - { - } -+static inline void ieee80211_start_tpt_led_trig(struct ieee80211_local *local) -+{ -+} -+static inline void ieee80211_stop_tpt_led_trig(struct ieee80211_local *local) -+{ -+} -+#endif -+ -+static inline void -+ieee80211_tpt_led_trig_tx(struct ieee80211_local *local, __le16 fc, int bytes) -+{ -+#ifdef CONFIG_MAC80211_LEDS -+	if (local->tpt_led_trigger && ieee80211_is_data(fc)) -+		local->tpt_led_trigger->tx_bytes += bytes; -+#endif -+} -+ -+static inline void -+ieee80211_tpt_led_trig_rx(struct ieee80211_local *local, __le16 fc, int bytes) -+{ -+#ifdef CONFIG_MAC80211_LEDS -+	if (local->tpt_led_trigger && ieee80211_is_data(fc)) -+		local->tpt_led_trigger->rx_bytes += bytes; - #endif -+} ---- a/net/mac80211/main.c -+++ b/net/mac80211/main.c -@@ -599,6 +599,8 @@ struct ieee80211_hw *ieee80211_alloc_hw( - 	/* init dummy netdev for use w/ NAPI */ - 	init_dummy_netdev(&local->napi_dev); -  -+	ieee80211_led_names(local); -+ - 	return local_to_hw(local); - } - EXPORT_SYMBOL(ieee80211_alloc_hw); ---- a/include/net/mac80211.h -+++ b/include/net/mac80211.h -@@ -1856,11 +1856,26 @@ struct ieee80211_hw *ieee80211_alloc_hw( -  */ - int ieee80211_register_hw(struct ieee80211_hw *hw); -  -+/** -+ * struct ieee80211_tpt_blink - throughput blink description -+ * @throughput: throughput in Kbit/sec -+ * @blink_time: blink time in milliseconds -+ *	(full cycle, ie. one off + one on period) -+ */ -+struct ieee80211_tpt_blink { -+	int throughput; -+	int blink_time; -+}; -+ - #ifdef CONFIG_MAC80211_LEDS - extern char *__ieee80211_get_tx_led_name(struct ieee80211_hw *hw); - extern char *__ieee80211_get_rx_led_name(struct ieee80211_hw *hw); - extern char *__ieee80211_get_assoc_led_name(struct ieee80211_hw *hw); - extern char *__ieee80211_get_radio_led_name(struct ieee80211_hw *hw); -+extern char *__ieee80211_create_tpt_led_trigger( -+				struct ieee80211_hw *hw, -+				const struct ieee80211_tpt_blink *blink_table, -+				unsigned int blink_table_len); - #endif - /** -  * ieee80211_get_tx_led_name - get name of TX LED -@@ -1939,6 +1954,29 @@ static inline char *ieee80211_get_radio_ - } -  - /** -+ * ieee80211_create_tpt_led_trigger - create throughput LED trigger -+ * @hw: the hardware to create the trigger for -+ * @blink_table: the blink table -- needs to be ordered by throughput -+ * @blink_table_len: size of the blink table -+ * -+ * This function returns %NULL (in case of error, or if no LED -+ * triggers are configured) or the name of the new trigger. -+ * This function must be called before ieee80211_register_hw(). -+ */ -+static inline char * -+ieee80211_create_tpt_led_trigger(struct ieee80211_hw *hw, -+				 const struct ieee80211_tpt_blink *blink_table, -+				 unsigned int blink_table_len) -+{ -+#ifdef CONFIG_MAC80211_LEDS -+	return __ieee80211_create_tpt_led_trigger(hw, blink_table, -+						  blink_table_len); -+#else -+	return NULL; -+#endif -+} -+ -+/** -  * ieee80211_unregister_hw - Unregister a hardware device -  * -  * This function instructs mac80211 to free allocated resources ---- a/net/mac80211/ieee80211_i.h -+++ b/net/mac80211/ieee80211_i.h -@@ -23,6 +23,7 @@ - #include <linux/types.h> - #include <linux/spinlock.h> - #include <linux/etherdevice.h> -+#include <linux/leds.h> - #include <net/ieee80211_radiotap.h> - #include <net/cfg80211.h> - #include <net/mac80211.h> -@@ -641,6 +642,17 @@ enum queue_stop_reason { - 	IEEE80211_QUEUE_STOP_REASON_SKB_ADD, - }; -  -+struct tpt_led_trigger { -+	struct led_trigger trig; -+	char name[32]; -+	const struct ieee80211_tpt_blink *blink_table; -+	unsigned int blink_table_len; -+	struct timer_list timer; -+	bool running; -+	unsigned long prev_traffic; -+	unsigned long tx_bytes, rx_bytes; -+}; -+ - /** -  * mac80211 scan flags - currently active scan mode -  * -@@ -854,6 +866,7 @@ struct ieee80211_local { - #ifdef CONFIG_MAC80211_LEDS - 	int tx_led_counter, rx_led_counter; - 	struct led_trigger *tx_led, *rx_led, *assoc_led, *radio_led; -+	struct tpt_led_trigger *tpt_led_trigger; - 	char tx_led_name[32], rx_led_name[32], - 	     assoc_led_name[32], radio_led_name[32]; - #endif ---- a/net/mac80211/iface.c -+++ b/net/mac80211/iface.c -@@ -225,6 +225,7 @@ static int ieee80211_do_open(struct net_ - 		/* we're brought up, everything changes */ - 		hw_reconf_flags = ~0; - 		ieee80211_led_radio(local, true); -+		ieee80211_start_tpt_led_trig(local); - 	} -  - 	/* ---- a/net/mac80211/rx.c -+++ b/net/mac80211/rx.c -@@ -2887,6 +2887,9 @@ void ieee80211_rx(struct ieee80211_hw *h - 		return; - 	} -  -+	ieee80211_tpt_led_trig_rx(local, -+			((struct ieee80211_hdr *)skb->data)->frame_control, -+			skb->len); - 	__ieee80211_rx_handle_packet(hw, skb); -  - 	rcu_read_unlock(); ---- a/net/mac80211/tx.c -+++ b/net/mac80211/tx.c -@@ -1292,6 +1292,7 @@ static int __ieee80211_tx(struct ieee802 -  - 	while (skb) { - 		int q = skb_get_queue_mapping(skb); -+		__le16 fc; -  - 		spin_lock_irqsave(&local->queue_stop_reason_lock, flags); - 		ret = IEEE80211_TX_OK; -@@ -1334,6 +1335,7 @@ static int __ieee80211_tx(struct ieee802 - 		else - 			info->control.sta = NULL; -  -+		fc = ((struct ieee80211_hdr *)skb->data)->frame_control; - 		ret = drv_tx(local, skb); - 		if (WARN_ON(ret != NETDEV_TX_OK && skb->len != len)) { - 			dev_kfree_skb(skb); -@@ -1344,6 +1346,7 @@ static int __ieee80211_tx(struct ieee802 - 			return IEEE80211_TX_AGAIN; - 		} -  -+		ieee80211_tpt_led_trig_tx(local, fc, len); - 		*skbp = skb = next; - 		ieee80211_led_tx(local, 1); - 		fragm = true; ---- a/net/mac80211/util.c -+++ b/net/mac80211/util.c -@@ -1141,6 +1141,7 @@ u32 ieee80211_sta_get_rates(struct ieee8 - void ieee80211_stop_device(struct ieee80211_local *local) - { - 	ieee80211_led_radio(local, false); -+	ieee80211_stop_tpt_led_trig(local); -  - 	cancel_work_sync(&local->reconfig_filter); -  -@@ -1175,6 +1176,7 @@ int ieee80211_reconfig(struct ieee80211_ - 		} -  - 		ieee80211_led_radio(local, true); -+		ieee80211_start_tpt_led_trig(local); - 	} -  - 	/* add interfaces */ ---- a/drivers/net/wireless/ath/ath9k/xmit.c -+++ b/drivers/net/wireless/ath/ath9k/xmit.c -@@ -1745,7 +1745,10 @@ int ath_tx_start(struct ieee80211_hw *hw - 	int frmlen = skb->len + FCS_LEN; - 	int q; -  --	txctl->an = (struct ath_node *)sta->drv_priv; -+	/* NOTE:  sta can be NULL according to net/mac80211.h */ -+	if (sta) -+		txctl->an = (struct ath_node *)sta->drv_priv; -+ - 	if (info->control.hw_key) - 		frmlen += info->control.hw_key->icv_len; -  diff --git a/package/mac80211/patches/403-ath9k-fix-invalid-mac-address-handling.patch b/package/mac80211/patches/403-ath9k-fix-invalid-mac-address-handling.patch index 77bbbc790..a47552399 100644 --- a/package/mac80211/patches/403-ath9k-fix-invalid-mac-address-handling.patch +++ b/package/mac80211/patches/403-ath9k-fix-invalid-mac-address-handling.patch @@ -8,19 +8,19 @@   #include <asm/unaligned.h>   #include "hw.h" -@@ -432,8 +433,16 @@ static int ath9k_hw_init_macaddr(struct  +@@ -436,8 +437,16 @@ static int ath9k_hw_init_macaddr(struct    		common->macaddr[2 * i] = eeval >> 8;   		common->macaddr[2 * i + 1] = eeval & 0xff;   	}  -	if (sum == 0 || sum == 0xffff * 3)  -		return -EADDRNOTAVAIL;  +	if (!is_valid_ether_addr(common->macaddr)) { -+		ath_print(common, ATH_DBG_EEPROM, ++		ath_err(common,  +			"eeprom contains invalid mac address: %pM\n",  +			common->macaddr);  +  +		random_ether_addr(common->macaddr); -+		ath_print(common, ATH_DBG_EEPROM, ++		ath_err(common,  +			"random mac address will be used: %pM\n",  +			common->macaddr);  +	} diff --git a/package/mac80211/patches/407-ath9k-override-mac-address-from-platform-data.patch b/package/mac80211/patches/407-ath9k-override-mac-address-from-platform-data.patch index d6bc34b1a..2444db4bc 100644 --- a/package/mac80211/patches/407-ath9k-override-mac-address-from-platform-data.patch +++ b/package/mac80211/patches/407-ath9k-override-mac-address-from-platform-data.patch @@ -18,7 +18,7 @@   #include "ath9k.h" -@@ -521,6 +522,7 @@ static void ath9k_init_misc(struct ath_s +@@ -522,6 +523,7 @@ static void ath9k_init_misc(struct ath_s   static int ath9k_init_softc(u16 devid, struct ath_softc *sc, u16 subsysid,   			    const struct ath_bus_ops *bus_ops)   { @@ -26,13 +26,22 @@   	struct ath_hw *ah = NULL;   	struct ath_common *common;   	int ret = 0, i; -@@ -567,6 +569,9 @@ static int ath9k_init_softc(u16 devid, s +@@ -535,7 +537,7 @@ static int ath9k_init_softc(u16 devid, s + 	ah->hw_version.subsysid = subsysid; + 	sc->sc_ah = ah; +  +-	if (!sc->dev->platform_data) ++	if (!pdata) + 		ah->ah_flags |= AH_USE_EEPROM; +  + 	common = ath9k_hw_common(ah); +@@ -568,6 +570,9 @@ static int ath9k_init_softc(u16 devid, s   	if (ret)   		goto err_hw;  +	if (pdata && pdata->macaddr)  +		memcpy(common->macaddr, pdata->macaddr, ETH_ALEN);  + - 	ret = ath9k_init_debug(ah); - 	if (ret) { - 		ath_print(common, ATH_DBG_FATAL, + 	ret = ath9k_init_queues(sc); + 	if (ret) + 		goto err_queues; diff --git a/package/mac80211/patches/409-ath9k_platform_settings.patch b/package/mac80211/patches/409-ath9k_platform_settings.patch index 7f09b05fb..7b56ee23d 100644 --- a/package/mac80211/patches/409-ath9k_platform_settings.patch +++ b/package/mac80211/patches/409-ath9k_platform_settings.patch @@ -1,15 +1,14 @@  --- a/drivers/net/wireless/ath/ath9k/init.c  +++ b/drivers/net/wireless/ath/ath9k/init.c -@@ -536,8 +536,15 @@ static int ath9k_init_softc(u16 devid, s +@@ -537,8 +537,14 @@ static int ath9k_init_softc(u16 devid, s   	ah->hw_version.subsysid = subsysid;   	sc->sc_ah = ah; --	if (!sc->dev->platform_data) -+	if (!sc->dev->platform_data) { +-	if (!pdata) ++	if (!pdata) {   		ah->ah_flags |= AH_USE_EEPROM;  +		sc->sc_ah->led_pin = -1;  +	} else { -+		pdata = (struct ath9k_platform_data *) sc->dev->platform_data;  +		sc->sc_ah->gpio_mask = pdata->gpio_mask;  +		sc->sc_ah->gpio_val = pdata->gpio_val;  +		sc->sc_ah->led_pin = pdata->led_pin; @@ -19,7 +18,7 @@   	common->ops = &ath9k_common_ops;  --- a/drivers/net/wireless/ath/ath9k/hw.h  +++ b/drivers/net/wireless/ath/ath9k/hw.h -@@ -782,7 +782,7 @@ struct ath_hw { +@@ -794,7 +794,7 @@ struct ath_hw {   	u32 originalGain[22];   	int initPDADC;   	int PDADCdelta; diff --git a/package/mac80211/patches/451-add-platform-eeprom-support-to-ath5k.patch b/package/mac80211/patches/451-add-platform-eeprom-support-to-ath5k.patch index 51867359a..ff96b7888 100644 --- a/package/mac80211/patches/451-add-platform-eeprom-support-to-ath5k.patch +++ b/package/mac80211/patches/451-add-platform-eeprom-support-to-ath5k.patch @@ -9,26 +9,7 @@   #include "ath5k.h"   #include "reg.h" -@@ -71,6 +73,18 @@ static u16 ath5k_eeprom_bin2freq(struct  - static int ath5k_hw_eeprom_read(struct ath5k_hw *ah, u32 offset, u16 *data) - { - 	u32 status, timeout; -+	struct ath5k_platform_data *pdata = NULL; -+ -+	if (ah->ah_sc->pdev) -+		pdata = ah->ah_sc->pdev->dev.platform_data; -+ -+	if (pdata && pdata->eeprom_data && pdata->eeprom_data[0] == AR5K_EEPROM_MAGIC_VALUE) -+	{ -+		ATH5K_INFO(ah->ah_sc, "using eeprom-content from platform_data\n"); -+		if (offset >= ATH5K_PLAT_EEP_MAX_WORDS) return -EIO; -+		*data = pdata->eeprom_data[offset]; -+		return 0; -+	} -  - 	/* - 	 * Initialize EEPROM access -@@ -1760,7 +1774,7 @@ ath5k_eeprom_read_spur_chans(struct ath5 +@@ -1726,7 +1728,7 @@ ath5k_eeprom_read_spur_chans(struct ath5   }   /* @@ -37,7 +18,7 @@    */   int ath5k_eeprom_read_mac(struct ath5k_hw *ah, u8 *mac)   { -@@ -1768,6 +1782,16 @@ int ath5k_eeprom_read_mac(struct ath5k_h +@@ -1734,6 +1736,16 @@ int ath5k_eeprom_read_mac(struct ath5k_h   	u32 total, offset;   	u16 data;   	int octet, ret; @@ -52,5 +33,35 @@  +		return 0;  +	} - 	ret = ath5k_hw_eeprom_read(ah, 0x20, &data); + 	ret = ath5k_hw_nvram_read(ah, 0x20, &data);   	if (ret) +--- a/drivers/net/wireless/ath/ath5k/pci.c ++++ b/drivers/net/wireless/ath/ath5k/pci.c +@@ -17,6 +17,7 @@ + #include <linux/nl80211.h> + #include <linux/pci.h> + #include <linux/pci-aspm.h> ++#include <linux/ath5k_platform.h> + #include "../ath.h" + #include "ath5k.h" + #include "debug.h" +@@ -73,6 +74,19 @@ bool ath5k_pci_eeprom_read(struct ath_co + { + 	struct ath5k_hw *ah = (struct ath5k_hw *) common->ah; + 	u32 status, timeout; ++	struct ath5k_platform_data *pdata = NULL; ++ ++	if (ah->ah_sc->pdev) ++		pdata = ah->ah_sc->pdev->dev.platform_data; ++ ++	if (pdata && pdata->eeprom_data && pdata->eeprom_data[0] == AR5K_EEPROM_MAGIC_VALUE) ++	{ ++		if (offset >= ATH5K_PLAT_EEP_MAX_WORDS) ++			return -EIO; ++ ++		*data = pdata->eeprom_data[offset]; ++		return 0; ++	} +  + 	/* + 	 * Initialize EEPROM access diff --git a/package/mac80211/patches/500-ath9k_eeprom_debugfs.patch b/package/mac80211/patches/500-ath9k_eeprom_debugfs.patch index eaf51310e..457dfc6a3 100644 --- a/package/mac80211/patches/500-ath9k_eeprom_debugfs.patch +++ b/package/mac80211/patches/500-ath9k_eeprom_debugfs.patch @@ -1,6 +1,6 @@  --- a/drivers/net/wireless/ath/ath9k/debug.c  +++ b/drivers/net/wireless/ath/ath9k/debug.c -@@ -873,6 +873,53 @@ static const struct file_operations fops +@@ -871,6 +871,53 @@ static const struct file_operations fops   	.llseek = default_llseek,   }; @@ -54,7 +54,7 @@   int ath9k_init_debug(struct ath_hw *ah)   {   	struct ath_common *common = ath9k_hw_common(ah); -@@ -938,6 +985,10 @@ int ath9k_init_debug(struct ath_hw *ah) +@@ -933,6 +980,10 @@ int ath9k_init_debug(struct ath_hw *ah)   	debugfs_create_u32("gpio_val", S_IRUSR | S_IWUSR,   			   sc->debug.debugfs_phy, &sc->sc_ah->gpio_val); diff --git a/package/mac80211/patches/510-ath9k_led_cleanup.patch b/package/mac80211/patches/510-ath9k_led_cleanup.patch index 84d7b0613..b855bb295 100644 --- a/package/mac80211/patches/510-ath9k_led_cleanup.patch +++ b/package/mac80211/patches/510-ath9k_led_cleanup.patch @@ -149,8 +149,8 @@  -  -	ret = led_classdev_register(wiphy_dev(sc->hw->wiphy), &led->led_cdev);  -	if (ret) --		ath_print(ath9k_hw_common(sc->sc_ah), ATH_DBG_FATAL, --			  "Failed to register led:%s", led->name); +-		ath_err(ath9k_hw_common(sc->sc_ah), +-			"Failed to register led:%s", led->name);  -	else  -		led->registered = 1;  -	return ret; @@ -253,7 +253,7 @@   /*	Rfkill	   */  --- a/drivers/net/wireless/ath/ath9k/main.c  +++ b/drivers/net/wireless/ath/ath9k/main.c -@@ -1278,9 +1278,6 @@ static void ath9k_stop(struct ieee80211_ +@@ -1275,9 +1275,6 @@ static void ath9k_stop(struct ieee80211_   	aphy->state = ATH_WIPHY_INACTIVE; @@ -265,10 +265,11 @@   	cancel_work_sync(&sc->hw_check_work);  --- a/drivers/net/wireless/ath/ath9k/init.c  +++ b/drivers/net/wireless/ath/ath9k/init.c -@@ -139,6 +139,20 @@ static struct ieee80211_rate ath9k_legac +@@ -139,6 +139,21 @@ static struct ieee80211_rate ath9k_legac   	RATE(540, 0x0c, 0),   }; ++#ifdef CONFIG_MAC80211_LEDS  +static const struct ieee80211_tpt_blink ath9k_tpt_blink[] = {  +	{ .throughput = 0 * 1024, .blink_time = 334 },  +	{ .throughput = 1 * 1024, .blink_time = 260 }, @@ -281,12 +282,12 @@  +	{ .throughput = 200 * 1024, .blink_time = 80 },  +	{ .throughput = 300 * 1024, .blink_time = 50 },  +}; -+ ++#endif  +   static void ath9k_deinit_softc(struct ath_softc *sc);   /* -@@ -750,6 +764,12 @@ int ath9k_init_device(u16 devid, struct  +@@ -742,6 +757,12 @@ int ath9k_init_device(u16 devid, struct    	ath9k_init_txpower_limits(sc); diff --git a/package/mac80211/patches/511-mac80211_no_led_fix.patch b/package/mac80211/patches/511-mac80211_no_led_fix.patch deleted file mode 100644 index 237d6012e..000000000 --- a/package/mac80211/patches/511-mac80211_no_led_fix.patch +++ /dev/null @@ -1,18 +0,0 @@ ---- a/net/mac80211/ieee80211_i.h -+++ b/net/mac80211/ieee80211_i.h -@@ -642,6 +642,7 @@ enum queue_stop_reason { - 	IEEE80211_QUEUE_STOP_REASON_SKB_ADD, - }; -  -+#ifdef CONFIG_MAC80211_LEDS - struct tpt_led_trigger { - 	struct led_trigger trig; - 	char name[32]; -@@ -652,6 +653,7 @@ struct tpt_led_trigger { - 	unsigned long prev_traffic; - 	unsigned long tx_bytes, rx_bytes; - }; -+#endif -  - /** -  * mac80211 scan flags - currently active scan mode diff --git a/package/mac80211/patches/520-ath9k_reset_fix.patch b/package/mac80211/patches/520-ath9k_reset_fix.patch deleted file mode 100644 index 10175f9ff..000000000 --- a/package/mac80211/patches/520-ath9k_reset_fix.patch +++ /dev/null @@ -1,74 +0,0 @@ ---- a/drivers/net/wireless/ath/ath9k/xmit.c -+++ b/drivers/net/wireless/ath/ath9k/xmit.c -@@ -1172,7 +1172,7 @@ void ath_draintxq(struct ath_softc *sc,  - 	} - } -  --void ath_drain_all_txq(struct ath_softc *sc, bool retry_tx) -+bool ath_drain_all_txq(struct ath_softc *sc, bool retry_tx) - { - 	struct ath_hw *ah = sc->sc_ah; - 	struct ath_common *common = ath9k_hw_common(sc->sc_ah); -@@ -1180,7 +1180,7 @@ void ath_drain_all_txq(struct ath_softc  - 	int i, npend = 0; -  - 	if (sc->sc_flags & SC_OP_INVALID) --		return; -+		return true; -  - 	/* Stop beacon queue */ - 	ath9k_hw_stoptxdma(sc->sc_ah, sc->beacon.beaconq); -@@ -1194,23 +1194,15 @@ void ath_drain_all_txq(struct ath_softc  - 		} - 	} -  --	if (npend) { --		int r; -- --		ath_print(common, ATH_DBG_FATAL, --			  "Failed to stop TX DMA. Resetting hardware!\n"); -- --		r = ath9k_hw_reset(ah, sc->sc_ah->curchan, ah->caldata, false); --		if (r) --			ath_print(common, ATH_DBG_FATAL, --				  "Unable to reset hardware; reset status %d\n", --				  r); --	} -+	if (npend) -+		ath_print(common, ATH_DBG_FATAL,  "Failed to stop TX DMA!\n"); -  - 	for (i = 0; i < ATH9K_NUM_TX_QUEUES; i++) { - 		if (ATH_TXQ_SETUP(sc, i)) - 			ath_draintxq(sc, &sc->tx.txq[i], retry_tx); - 	} -+ -+	return !npend; - } -  - void ath_tx_cleanupq(struct ath_softc *sc, struct ath_txq *txq) ---- a/drivers/net/wireless/ath/ath9k/ath9k.h -+++ b/drivers/net/wireless/ath/ath9k/ath9k.h -@@ -311,7 +311,7 @@ void ath_rx_cleanup(struct ath_softc *sc - int ath_rx_tasklet(struct ath_softc *sc, int flush, bool hp); - struct ath_txq *ath_txq_setup(struct ath_softc *sc, int qtype, int subtype); - void ath_tx_cleanupq(struct ath_softc *sc, struct ath_txq *txq); --void ath_drain_all_txq(struct ath_softc *sc, bool retry_tx); -+bool ath_drain_all_txq(struct ath_softc *sc, bool retry_tx); - void ath_draintxq(struct ath_softc *sc, - 		     struct ath_txq *txq, bool retry_tx); - void ath_tx_node_init(struct ath_softc *sc, struct ath_node *an); ---- a/drivers/net/wireless/ath/ath9k/main.c -+++ b/drivers/net/wireless/ath/ath9k/main.c -@@ -246,9 +246,10 @@ int ath_set_channel(struct ath_softc *sc - 	 * the relevant bits of the h/w. - 	 */ - 	ath9k_hw_disable_interrupts(ah); --	ath_drain_all_txq(sc, false); -+	stopped = ath_drain_all_txq(sc, false); -  --	stopped = ath_stoprecv(sc); -+	if (!ath_stoprecv(sc)) -+		stopped = false; -  - 	/* XXX: do not flush receive queue here. We don't want - 	 * to flush data frames already in queue because of diff --git a/package/mac80211/patches/800-b43-gpio-mask-module-option.patch b/package/mac80211/patches/800-b43-gpio-mask-module-option.patch index e9fe5d2a3..ac0b5c24f 100644 --- a/package/mac80211/patches/800-b43-gpio-mask-module-option.patch +++ b/package/mac80211/patches/800-b43-gpio-mask-module-option.patch @@ -22,7 +22,7 @@   static int modparam_bad_frames_preempt;   module_param_named(bad_frames_preempt, modparam_bad_frames_preempt, int, 0444);   MODULE_PARM_DESC(bad_frames_preempt, -@@ -2534,10 +2539,10 @@ static int b43_gpio_init(struct b43_wlde +@@ -2540,10 +2545,10 @@ static int b43_gpio_init(struct b43_wlde   		    & ~B43_MACCTL_GPOUTSMSK);   	b43_write16(dev, B43_MMIO_GPIO_MASK, b43_read16(dev, B43_MMIO_GPIO_MASK) @@ -35,7 +35,7 @@   	if (dev->dev->bus->chip_id == 0x4301) {   		mask |= 0x0060;   		set |= 0x0060; -@@ -5094,10 +5099,10 @@ static void b43_print_driverinfo(void) +@@ -5100,10 +5105,10 @@ static void b43_print_driverinfo(void)   	feat_sdio = "S";   #endif   	printk(KERN_INFO "Broadcom 43xx driver loaded " diff --git a/package/mac80211/patches/810-b43_no_pio.patch b/package/mac80211/patches/810-b43_no_pio.patch index 4a382e70e..8f7e118de 100644 --- a/package/mac80211/patches/810-b43_no_pio.patch +++ b/package/mac80211/patches/810-b43_no_pio.patch @@ -11,7 +11,7 @@   b43-$(CONFIG_B43_PCMCIA)	+= pcmcia.o  --- a/drivers/net/wireless/b43/main.c  +++ b/drivers/net/wireless/b43/main.c -@@ -1810,9 +1810,11 @@ static void b43_do_interrupt_thread(stru +@@ -1816,9 +1816,11 @@ static void b43_do_interrupt_thread(stru   			       dma_reason[4], dma_reason[5]);   			b43err(dev->wl, "This device does not support DMA "   			       "on your system. It will now be switched to PIO.\n");  | 
