mac80211: backport latest version from trunk (as of r37265)
authorFelix Fietkau <nbd@openwrt.org>
Fri, 12 Jul 2013 08:19:04 +0000 (08:19 +0000)
committerFelix Fietkau <nbd@openwrt.org>
Fri, 12 Jul 2013 08:19:04 +0000 (08:19 +0000)
Signed-off-by: Felix Fietkau <nbd@openwrt.org>
SVN-Revision: 37266

107 files changed:
package/mac80211/Makefile
package/mac80211/files/lib/wifi/mac80211.sh
package/mac80211/patches/000-fix_kconfig.patch [new file with mode: 0644]
package/mac80211/patches/001-disable_rfkill.patch [deleted file]
package/mac80211/patches/001-fix_build.patch [new file with mode: 0644]
package/mac80211/patches/002-change_allconfig.patch [new file with mode: 0644]
package/mac80211/patches/002-disable_ssb_build.patch [deleted file]
package/mac80211/patches/003-disable_codel.patch [deleted file]
package/mac80211/patches/003-remove_bogus_modparams.patch [new file with mode: 0644]
package/mac80211/patches/004-use_env_for_bash.patch [deleted file]
package/mac80211/patches/010-add_include_for_bcma.patch [deleted file]
package/mac80211/patches/010-disable_rfkill.patch [new file with mode: 0644]
package/mac80211/patches/020-disable_tty_set_termios.patch
package/mac80211/patches/030-rt2x00_options.patch [new file with mode: 0644]
package/mac80211/patches/030-wext.patch [deleted file]
package/mac80211/patches/040-brcmutil_option.patch [new file with mode: 0644]
package/mac80211/patches/040-linux_3_9_compat.patch [deleted file]
package/mac80211/patches/050-compat_backport.patch [deleted file]
package/mac80211/patches/050-lib80211_option.patch [new file with mode: 0644]
package/mac80211/patches/060-no_local_ssb_bcma.patch [new file with mode: 0644]
package/mac80211/patches/100-pm_export_symbol.patch [deleted file]
package/mac80211/patches/130-mesh_pathtbl_backport.patch [deleted file]
package/mac80211/patches/150-disable_addr_notifier.patch
package/mac80211/patches/201-ath5k-WAR-for-AR71xx-PCI-bug.patch
package/mac80211/patches/300-pending_work.patch
package/mac80211/patches/310-ap_scan.patch
package/mac80211/patches/320-ath9k_no_eeprom_name.patch [deleted file]
package/mac80211/patches/321-bcma_backport.patch [deleted file]
package/mac80211/patches/400-ath_move_debug_code.patch
package/mac80211/patches/401-ath9k_blink_default.patch
package/mac80211/patches/402-ath9k-fix-invalid-mac-address-handling.patch
package/mac80211/patches/403-ath_regd_optional.patch
package/mac80211/patches/404-world_regd_fixup.patch
package/mac80211/patches/405-regd_no_assoc_hints.patch
package/mac80211/patches/410-ath9k_allow_adhoc_and_ap.patch
package/mac80211/patches/411-ath5k_allow_adhoc_and_ap.patch
package/mac80211/patches/420-ath5k_disable_fast_cc.patch
package/mac80211/patches/431-add_platform_eeprom_support_to_ath5k.patch
package/mac80211/patches/432-ath5k_add_pciids.patch
package/mac80211/patches/440-ath5k_channel_bw_debugfs.patch
package/mac80211/patches/500-ath9k_eeprom_debugfs.patch
package/mac80211/patches/501-ath9k-eeprom_endianess.patch
package/mac80211/patches/502-ath9k_ahb_init.patch
package/mac80211/patches/510-ath9k_intr_mitigation_tweak.patch
package/mac80211/patches/512-ath9k_channelbw_debugfs.patch
package/mac80211/patches/520-mac80211_cur_txpower.patch
package/mac80211/patches/521-ath9k_cur_txpower.patch
package/mac80211/patches/522-ath9k_per_chain_signal_strength.patch
package/mac80211/patches/523-mac80211_configure_antenna_gain.patch
package/mac80211/patches/524-ath9k_use_configured_antenna_gain.patch
package/mac80211/patches/530-ath9k_extra_leds.patch
package/mac80211/patches/531-ath9k_extra_platform_leds.patch
package/mac80211/patches/540-mac80211_optimize_mcs_rate_mask.patch [deleted file]
package/mac80211/patches/550-ath9k_reduce_ani_interval.patch
package/mac80211/patches/551-ath9k_revert_initval_change.patch [deleted file]
package/mac80211/patches/552-ath9k_rx_dma_stop_check.patch
package/mac80211/patches/553-ath9k_debugfs_diag.patch
package/mac80211/patches/554-ath9k_ani_mrc_fix.patch
package/mac80211/patches/555-ath9k-allow-to-disable-bands-via-platform-data.patch
package/mac80211/patches/556-ath9k_ar913x_external_reset.patch [deleted file]
package/mac80211/patches/600-rt2x00-disable-pci-code-if-CONFIG_PCI-not-defined.patch [deleted file]
package/mac80211/patches/601-rt2x00-set_pci_mwi.patch
package/mac80211/patches/603-rt2x00-introduce-rt2x00eeprom.patch
package/mac80211/patches/604-rt2x00-add-CONFIG_RT2X00_LIB_EEPROM-option.patch [deleted file]
package/mac80211/patches/605-rt2x00-pci-eeprom.patch
package/mac80211/patches/606-rt2x00_no_realign.patch
package/mac80211/patches/607-rt2x00-allow_disabling_bands_through_platform_data.patch
package/mac80211/patches/608-add_platform_data_mac_addr.patch
package/mac80211/patches/610-rt2x00-fix-rt3352-ext-pa.patch
package/mac80211/patches/611-rt2x00-rf_vals-rt3352-xtal20.patch
package/mac80211/patches/612-rt2x00-make-wmac-loadable-via-OF-on-rt288x-305x-SoC.patch
package/mac80211/patches/613-rt2x00-fixup-symbols.patch [deleted file]
package/mac80211/patches/614-rt2x00-of_load_eeprom_filename.patch
package/mac80211/patches/615-rt2x00-fix_20mhz_clk.patch [new file with mode: 0644]
package/mac80211/patches/616-rt2x00-support-rt5350.patch
package/mac80211/patches/617-rt2x00-load-eeprom-on-SoC-from-a-mtd-device-defines-.patch
package/mac80211/patches/618-rt2x00-msi-fix.patch [new file with mode: 0644]
package/mac80211/patches/700-mwl8k-missing-pci-id-for-WNR854T.patch
package/mac80211/patches/701-mwl8k-don-t-overwrite-regulatory-settings.patch [deleted file]
package/mac80211/patches/702-mwl8k-always-apply-configuration-even-when-device-is.patch [deleted file]
package/mac80211/patches/800-b43-gpio-mask-module-option.patch
package/mac80211/patches/810-b43_no_pio.patch
package/mac80211/patches/820-b43-add-antenna-control.patch
package/mac80211/patches/830-b43-workaround-pcie-bcm4716.patch
package/mac80211/patches/835-b43-brcmsmac-use-pcie-core-arry.patch [deleted file]
package/mac80211/patches/840-b43-increase_number_of_rx_dma_slots.patch [deleted file]
package/mac80211/patches/841-b43-reduce-number-of-RX-slots.patch [new file with mode: 0644]
package/mac80211/patches/845-b43-only-use-gpio-0-1-for-led.patch [new file with mode: 0644]
package/mac80211/patches/850-brcmsmac-start-adding-support-for-core-rev-28.patch [deleted file]
package/mac80211/patches/851-brcmsmac-remove-extra-regulation-restriction.patch [new file with mode: 0644]
package/mac80211/patches/860-brcmsmac-implement-ieee80211_ops-get_tsf-and-set_tsf.patch [deleted file]
package/mac80211/patches/861-brcmsmac-add-interface-type-to-brcms_bss_cfg.patch [deleted file]
package/mac80211/patches/862-brcmsmac-remove-brcms_bss_cfg-BSS.patch [deleted file]
package/mac80211/patches/863-brcmsmac-remove-brcms_bss_cfg-associated.patch [deleted file]
package/mac80211/patches/864-brcmsmac-remove-brcms_bss_cfg-enable.patch [deleted file]
package/mac80211/patches/865-brcmsmac-remove-brcms_bss_cfg-up.patch [deleted file]
package/mac80211/patches/866-brcmsmac-remove-brcms_bss_cfg-cur_etheraddr.patch [deleted file]
package/mac80211/patches/867-brcmsmac-remove-brcms_pub-bcmerr.patch [deleted file]
package/mac80211/patches/868-brcmsmac-write-beacon-period-to-hardware.patch [deleted file]
package/mac80211/patches/869-brcmsmac-add-beacon-template-support.patch [deleted file]
package/mac80211/patches/870-brcmsmac-react-on-changing-SSID.patch [deleted file]
package/mac80211/patches/871-brcmsmac-add-support-for-probe-response-template.patch [deleted file]
package/mac80211/patches/872-brcmsmac-deactivate-ucode-sending-probe-responses.patch [deleted file]
package/mac80211/patches/873-brcmsmac-activate-AP-support.patch [deleted file]
package/mac80211/patches/874-brcmsmac-add-support-for-adhoc-mode.patch [deleted file]
package/mac80211/patches/875-brcmsmac-remove-extra-regulation-restriction.patch [deleted file]
target/linux/generic/files/include/linux/ath9k_platform.h

index 670c1b7..2e4e524 100644 (file)
@@ -10,12 +10,13 @@ include $(INCLUDE_DIR)/kernel.mk
 
 PKG_NAME:=mac80211
 
-PKG_VERSION:=2013-02-22
+PKG_VERSION:=2013-06-27
 PKG_RELEASE:=1
 PKG_SOURCE_URL:=http://mirror2.openwrt.org/sources
-PKG_MD5SUM:=de1a03ca1f72748d4523672c8facbf7e
+PKG_BACKPORT_VERSION:=.1
+PKG_MD5SUM:=73bd220c64c5c6fdc22b3bb7f180644f
 
-PKG_SOURCE:=compat-wireless-$(PKG_VERSION).tar.bz2
+PKG_SOURCE:=compat-wireless-$(PKG_VERSION)$(PKG_BACKPORT_VERSION).tar.bz2
 PKG_BUILD_DIR:=$(KERNEL_BUILD_DIR)/compat-wireless-$(PKG_VERSION)
 PKG_BUILD_PARALLEL:=1
 
@@ -196,12 +197,6 @@ define KernelPackage/p54-spi
   AUTOLOAD:=$(call AutoLoad,31,p54spi)
 endef
 
-NEED_RT2X00_LIB_CRYPTO:=y
-NEED_RT2X00_LIB_FIRMWARE:=y
-NEED_RT2X00_LIB_EEPROM:=y
-NEED_RT2X00_LIB_HT:=y
-NEED_RT2X00_LIB_LEDS:=y
-
 define KernelPackage/rt2x00/Default
   $(call KernelPackage/mac80211/Default)
   TITLE:=Ralink Drivers for RT2x00 cards
@@ -212,7 +207,7 @@ $(call KernelPackage/rt2x00/Default)
   DEPENDS+= @(PCI_SUPPORT||USB_SUPPORT||TARGET_ramips) +kmod-mac80211 +kmod-lib-crc-itu-t
   TITLE+= (LIB)
   FILES:=$(PKG_BUILD_DIR)/drivers/net/wireless/rt2x00/rt2x00lib.ko
-  AUTOLOAD:=$(call AutoLoad,25,rt2x00lib)
+  AUTOLOAD:=$(call AutoLoad,24,rt2x00lib)
   MENU:=1
 endef
 
@@ -235,11 +230,19 @@ define KernelPackage/rt2x00-lib/config
   endif
 endef
 
-define KernelPackage/rt2x00-pci
+define KernelPackage/rt2x00-mmio
 $(call KernelPackage/rt2x00/Default)
   DEPENDS+= @(PCI_SUPPORT||TARGET_ramips) +kmod-rt2x00-lib +kmod-eeprom-93cx6
+  TITLE+= (MMIO)
+  FILES:= $(PKG_BUILD_DIR)/drivers/net/wireless/rt2x00/rt2x00mmio.ko
+  AUTOLOAD:=$(call AutoLoad,25,rt2x00mmio)
+endef
+
+define KernelPackage/rt2x00-pci
+$(call KernelPackage/rt2x00/Default)
+  DEPENDS+= @PCI_SUPPORT +kmod-rt2x00-mmio +kmod-rt2x00-lib
   TITLE+= (PCI)
-  FILES:=$(PKG_BUILD_DIR)/drivers/net/wireless/rt2x00/rt2x00pci.ko
+  FILES:= $(PKG_BUILD_DIR)/drivers/net/wireless/rt2x00/rt2x00pci.ko
   AUTOLOAD:=$(call AutoLoad,26,rt2x00pci)
 endef
 
@@ -253,7 +256,7 @@ endef
 
 define KernelPackage/rt2x00-soc
 $(call KernelPackage/rt2x00/Default)
-  DEPENDS+= @TARGET_ramips +kmod-rt2x00-lib
+  DEPENDS+= @TARGET_ramips @!TARGET_ramips_mt7620a @!TARGET_ramips_rt3883 +kmod-rt2x00-mmio +kmod-rt2x00-lib
   TITLE+= (SoC)
   FILES:=$(PKG_BUILD_DIR)/drivers/net/wireless/rt2x00/rt2x00soc.ko
   AUTOLOAD:=$(call AutoLoad,26,rt2x00soc)
@@ -309,7 +312,7 @@ endef
 
 define KernelPackage/rt2800-pci
 $(call KernelPackage/rt2x00/Default)
-  DEPENDS+= @(PCI_SUPPORT||TARGET_ramips) +kmod-rt2x00-pci +kmod-rt2800-lib +kmod-lib-crc-ccitt +TARGET_ramips:kmod-rt2x00-soc
+  DEPENDS+= @(PCI_SUPPORT||TARGET_ramips) +PCI_SUPPORT:kmod-rt2x00-pci +kmod-rt2800-lib +kmod-lib-crc-ccitt +TARGET_ramips:kmod-rt2x00-soc
   TITLE+= (RT2860 PCI)
   FILES:=$(PKG_BUILD_DIR)/drivers/net/wireless/rt2x00/rt2800pci.ko
   AUTOLOAD:=$(call AutoLoad,28,rt2800pci)
@@ -510,7 +513,7 @@ endef
 
 define KernelPackage/libertas-sd
   $(call KernelPackage/mac80211/Default)
-  DEPENDS+= +kmod-cfg80211 +kmod-lib80211 +@DRIVER_WEXT_SUPPORT
+  DEPENDS+= +kmod-cfg80211 +kmod-lib80211 +kmod-mmc +@DRIVER_WEXT_SUPPORT
   TITLE:=Marvell 88W8686 Wireless Driver
   FILES:= \
        $(PKG_BUILD_DIR)/drivers/net/wireless/libertas/libertas.ko \
@@ -1170,224 +1173,141 @@ define KernelPackage/brcmfmac/description
  Kernel module for Broadcom IEEE802.11n USB Wireless cards
 endef
 
-BUILDFLAGS:= \
-       -I$(PKG_BUILD_DIR)/include \
-       -DCONFIG_CFG80211_INTERNAL_REGDB=y \
-       $(foreach opt,$(CONFOPTS),-DCONFIG_$(opt)) \
-       $(if $(CONFIG_PCI),-DCONFIG_B43_PCI_AUTOSELECT -DCONFIG_B43_PCICORE_AUTOSELECT) \
-       $(if $(CONFIG_LEDS_TRIGGERS), -DCONFIG_MAC80211_LEDS -DCONFIG_LEDS_TRIGGERS -DCONFIG_B43_LEDS -DCONFIG_B43LEGACY_LEDS) \
-       -DCONFIG_B43_HWRNG -DCONFIG_B43LEGACY_HWRNG \
-       $(if $(CONFIG_PCI),-DCONFIG_ATH9K_PCI) \
-       $(if $(CONFIG_TARGET_ar71xx),-DCONFIG_ATH9K_AHB) \
-       $(if $(CONFIG_PACKAGE_MAC80211_DEBUGFS), -DCONFIG_CFG80211_DEBUGFS -DCONFIG_MAC80211_DEBUGFS -DCONFIG_ATH9K_DEBUGFS -DCONFIG_CARL9170_DEBUGFS -DCONFIG_ATH9K_HTC_DEBUGFS -DCONFIG_ATH5K_DEBUG) \
-       $(if $(CONFIG_PACKAGE_MAC80211_MESH),-DCONFIG_MAC80211_MESH) \
-       $(if $(CONFIG_PACKAGE_ATH_DEBUG),-DCONFIG_ATH_DEBUG -DCONFIG_ATH9K_PKTLOG) \
-       -D__CONFIG_MAC80211_RC_DEFAULT=minstrel \
-       -DCONFIG_MAC80211_RC_MINSTREL_HT \
-       $(if $(CONFIG_ATH_USER_REGD),-DATH_USER_REGD=1) \
-       $(if $(CONFIG_PACKAGE_B43_DEBUG),-DCONFIG_B43_DEBUG) \
-       $(if $(CONFIG_PACKAGE_B43_PIO),-DCONFIG_B43_PIO) \
-       $(if $(CONFIG_PACKAGE_B43_PIO),-DCONFIG_B43_BCMA_PIO) \
-       $(if $(CONFIG_PACKAGE_B43_PHY_N),-DCONFIG_B43_PHY_N) \
-       $(if $(CONFIG_PACKAGE_B43_PHY_HT),-DCONFIG_B43_PHY_HT) \
-       $(if $(CONFIG_PACKAGE_B43_PHY_LCN),-DCONFIG_B43_PHY_LCN) \
-       -DCONFIG_B43_BCMA -DCONFIG_B43_BCMA_EXTRA \
-       -DCONFIG_B43_SSB \
-       $(if $(CONFIG_PACKAGE_RT2X00_LIB_DEBUGFS),-DCONFIG_RT2X00_LIB_DEBUGFS) \
-       $(if $(CONFIG_PACKAGE_RT2X00_DEBUG),-DCONFIG_RT2X00_DEBUG) \
-       $(if $(NEED_RT2X00_LIB_HT),-DCONFIG_RT2X00_LIB_HT) \
-       $(if $(NEED_RT2X00_LIB_CRYPTO),-DCONFIG_RT2X00_LIB_CRYPTO) \
-       $(if $(NEED_RT2X00_LIB_FIRMWARE),-DCONFIG_RT2X00_LIB_FIRMWARE) \
-       $(if $(NEED_RT2X00_LIB_EEPROM),-DCONFIG_RT2X00_LIB_EEPROM) \
-       $(if $(NEED_RT2X00_LIB_LEDS),-DCONFIG_RT2X00_LIB_LEDS) \
-       $(if $(CONFIG_PACKAGE_kmod-rt2x00-pci),-DCONFIG_RT2X00_LIB_PCI) \
-       $(if $(CONFIG_PACKAGE_kmod-rt2x00-usb),-DCONFIG_RT2X00_LIB_USB) \
-       $(if $(CONFIG_PACKAGE_kmod-rt2x00-usb),-DCONFIG_RT2800USB_RT53XX) \
-       $(if $(CONFIG_PACKAGE_kmod-rt2x00-soc),-DCONFIG_RT2X00_LIB_SOC) \
-       $(if $(CONFIG_TARGET_atheros),-DCONFIG_ATH5K_AHB,-DCONFIG_ATH5K_PCI) \
-       $(if $(CONFIG_PACKAGE_kmod-iwl3945),-DCONFIG_IWL3945) \
-       $(if $(CONFIG_PACKAGE_kmod-iwl4965),-DCONFIG_COMPAT_IWL4965) \
-       $(if $(CONFIG_PACKAGE_kmod-wl12xx),-DCONFIG_WL12XX -DCONFIG_COMPAT_WL12XX_SDIO) \
-       $(if $(CONFIG_PACKAGE_BRCM80211_DEBUG),-DCONFIG_BRCMDBG) \
-       $(if $(CONFIG_PACKAGE_kmod-brcmfmac),-DCONFIG_BRCMFMAC_USB)
-
-MAKE_OPTS:= \
+config_package=$(if $(CONFIG_PACKAGE_kmod-$(1)),m)
+
+config-y:= \
+       WLAN \
+       NL80211_TESTMODE \
+       CFG80211_WEXT \
+       CFG80211_INTERNAL_REGDB \
+       MAC80211_RC_MINSTREL \
+       MAC80211_RC_MINSTREL_HT \
+       MAC80211_RC_DEFAULT_MINSTREL \
+
+config-$(call config_package,cfg80211) += CFG80211
+
+config-$(call config_package,mac80211) += MAC80211
+config-$(CONFIG_PACKAGE_MAC80211_MESH) += MAC80211_MESH
+ifdef CONFIG_PACKAGE_MAC80211_DEBUGFS
+  config-y += \
+       CFG80211_DEBUGFS \
+       MAC80211_DEBUGFS \
+       ATH9K_DEBUGFS \
+       ATH9K_HTC_DEBUGFS \
+       CARL9170_DEBUGFS \
+       ATH5K_DEBUG
+endif
+
+config-$(call config_package,lib80211) += LIB80211 LIB80211_CRYPT_WEP LIB80211_CRYPT_CCMP LIB80211_CRYPT_TKIP
+
+config-$(call config_package,ath) += ATH_CARDS ATH_COMMON
+config-$(CONFIG_PACKAGE_ATH_DEBUG) += ATH_DEBUG
+
+config-$(call config_package,ath9k) += ATH9K
+config-$(call config_package,ath9k-common) += ATH9K_COMMON
+config-$(CONFIG_TARGET_ar71xx) += ATH9K_AHB
+config-$(CONFIG_PCI) += ATH9K_PCI
+config-$(CONFIG_ATH_USER_REGD) += ATH_USER_REGD
+
+config-$(call config_package,ath9k-htc) += ATH9K_HTC
+
+config-$(call config_package,ath5k) += ATH5K
+ifdef CONFIG_TARGET_atheros
+  config-y += ATH5K_AHB
+else
+  config-y += ATH5K_PCI
+endif
+
+config-$(call config_package,carl9170) += CARL9170
+
+config-$(call config_package,b43) += B43
+config-y += B43_SSB B43_BCMA B43_BCMA_EXTRA
+config-$(CONFIG_PACKAGE_B43_PHY_N) += B43_PHY_N
+config-$(CONFIG_PACKAGE_B43_PHY_LP) += B43_PHY_LP
+config-$(CONFIG_PACKAGE_B43_PHY_HT) += B43_PHY_HT
+config-$(CONFIG_PACKAGE_B43_PIO) += B43_PIO
+config-$(CONFIG_PACKAGE_B43_DEBUG) += B43_DEBUG
+
+config-$(call config_package,b43legacy) += B43LEGACY
+config-y += B43LEGACY_DMA_MODE
+
+config-$(call config_package,brcmutil) += BRCMUTIL
+config-$(call config_package,brcmsmac) += BRCMSMAC
+config-$(call config_package,brcmfmac) += BRCMFMAC BRCMFMAC_USB
+config-$(CONFIG_PACKAGE_BRCM80211_DEBUG) += BRCMDBG
+
+config-$(call config_package,mac80211-hwsim) += MAC80211_HWSIM
+
+config-$(call config_package,rt2x00-lib) += RT2X00 RT2X00_LIB
+config-$(call config_package,rt2x00-pci) += RT2X00_LIB_PCI
+config-$(call config_package,rt2x00-mmio) += RT2X00_LIB_MMIO
+config-$(call config_package,rt2x00-usb) += RT2X00_LIB_USB
+config-$(call config_package,rt2x00-soc) += RT2X00_LIB_SOC
+config-$(CONFIG_PACKAGE_RT2X00_LIB_DEBUGFS) += RT2X00_LIB_DEBUGFS
+config-$(CONFIG_PACKAGE_RT2X00_DEBUG) += RT2X00_DEBUG
+
+config-$(call config_package,rt2400-pci) += RT2400PCI
+config-$(call config_package,rt2500-pci) += RT2500PCI
+config-$(call config_package,rt2500-usb) += RT2500USB
+config-$(call config_package,rt61-pci) += RT61PCI
+config-$(call config_package,rt73-usb) += RT73USB
+
+config-$(call config_package,rt2800-lib) += RT2800_LIB
+config-y += RT2800PCI_RT33XX RT2800PCI_RT35XX RT2800PCI_RT53XX RT2800PCI_RT3290
+
+config-$(call config_package,rt2800-pci) += RT2800PCI
+config-$(call config_package,rt2800-usb) += RT2800USB
+
+config-$(call config_package,iwl-legacy) += IWLEGACY
+config-$(call config_package,iwl3945) += IWL3945
+config-$(call config_package,iwl4965) += IWL4965
+config-$(call config_package,iwlagn) += IWLWIFI
+
+config-$(call config_package,net-libipw) += LIBIPW
+config-$(call config_package,net-ipw2100) += IPW2100
+config-$(call config_package,net-ipw2200) += IPW2200
+
+config-$(call config_package,p54-common) += P54_COMMON
+config-$(call config_package,p54-pci) += P54_PCI
+config-$(call config_package,p54-usb) += P54_USB
+config-$(call config_package,p54-spi) += P54_SPI
+
+config-$(call config_package,net-hermes) += HERMES
+config-$(call config_package,net-hermes-pci) += PCI_HERMES
+config-$(call config_package,net-hermes-plx) += PLX_HERMES
+config-$(call config_package,net-hermes-pcmcia) += PCMCIA_HERMES
+config-y += HERMES_PRISM
+
+config-$(call config_package,adm8211) += ADM8211
+config-$(call config_package,libertas-sd) += LIBERTAS LIBERTAS_SDIO
+config-$(call config_package,libertas-usb) += LIBERTAS LIBERTAS_USB
+config-$(call config_package,mwl8k) += MWL8K
+config-$(call config_package,rtl8180) += RTL8180
+config-$(call config_package,rtl8187) += RTL8187
+config-$(call config_package,wl12xx) += WL_TI WLCORE WLCORE_SDIO WL12XX
+config-$(call config_package,zd1211rw) += ZD1211RW
+
+config-$(CONFIG_LEDS_TRIGGERS) += MAC80211_LEDS B43_LEDS B43LEGACY_LEDS
+
+MAKE_OPTS:= -C "$(PKG_BUILD_DIR)" \
        CROSS_COMPILE="$(KERNEL_CROSS)" \
        ARCH="$(LINUX_KARCH)" \
-       EXTRA_CFLAGS="$(BUILDFLAGS) -Wno-undef" \
-       $(foreach opt,$(CONFOPTS),CONFIG_$(opt)=m) \
-       CONFIG_CFG80211_INTERNAL_REGDB=y \
-       CONFIG_CFG80211=$(if $(CONFIG_PACKAGE_kmod-cfg80211),m) \
-       CONFIG_MAC80211=$(if $(CONFIG_PACKAGE_kmod-mac80211),m) \
-       CONFIG_MAC80211_RC_MINSTREL=y \
-       CONFIG_MAC80211_MESH=$(CONFIG_PACKAGE_MAC80211_MESH) \
-       CONFIG_MAC80211_LEDS=$(CONFIG_LEDS_TRIGGERS) \
-       CONFIG_CFG80211_DEBUGFS=$(if $(CONFIG_PACKAGE_MAC80211_DEBUGFS),y) \
-       CONFIG_MAC80211_DEBUGFS=$(if $(CONFIG_PACKAGE_MAC80211_DEBUGFS),y) \
-       CONFIG_B43_PCMCIA=n CONFIG_B43_PIO=n \
-       CONFIG_B43_PCI_AUTOSELECT=$(if $(CONFIG_PCI),y) \
-       CONFIG_B43_PCICORE_AUTOSELECT=$(if $(CONFIG_PCI),y) \
-       CONFIG_B43LEGACY_LEDS=$(CONFIG_LEDS_TRIGGERS) \
-       CONFIG_B43_LEDS=$(CONFIG_LEDS_TRIGGERS) \
-       CONFIG_B43_HWRNG=$(if $(CONFIG_HW_RANDOM),y) \
-       CONFIG_B43LEGACY_HWRNG=$(if $(CONFIG_HW_RANDOM),y) \
-       CONFIG_B43=$(if $(CONFIG_PACKAGE_kmod-b43),m) \
-       CONFIG_B43LEGACY=$(if $(CONFIG_PACKAGE_kmod-b43legacy),m) \
-       CONFIG_B43_DEBUG=$(if $(CONFIG_PACKAGE_B43_DEBUG),y) \
-       CONFIG_B43_PIO=$(if $(CONFIG_PACKAGE_B43_PIO),y) \
-       CONFIG_B43_BCMA_PIO=$(if $(CONFIG_PACKAGE_B43_PIO),y) \
-       CONFIG_B43_PHY_N=$(if $(CONFIG_PACKAGE_B43_PHY_N),y) \
-       CONFIG_B43_PHY_HT=$(if $(CONFIG_PACKAGE_B43_PHY_HT),y) \
-       CONFIG_B43_PHY_LCN=$(if $(CONFIG_PACKAGE_B43_PHY_LCN),y) \
-       CONFIG_B43_BCMA=y \
-       CONFIG_B43_SSB=y \
-       CONFIG_ATH_CARDS=$(if $(CONFIG_PACKAGE_kmod-ath),m) \
-       CONFIG_ATH_COMMON=$(if $(CONFIG_PACKAGE_kmod-ath),m) \
-       CONFIG_ATH_DEBUG=$(if $(CONFIG_PACKAGE_ATH_DEBUG),y) \
-       CONFIG_ATH9K_PKTLOG=$(if $(CONFIG_PACKAGE_ATH_DEBUG),y) \
-       CONFIG_ATH5K=$(if $(CONFIG_PACKAGE_kmod-ath5k),m) \
-       CONFIG_ATH5K_PCI=$(if $(CONFIG_TARGET_atheros),,y) \
-       CONFIG_ATH5K_AHB=$(if $(CONFIG_TARGET_atheros),y) \
-       CONFIG_ATH5K_DEBUG=$(if $(CONFIG_PACKAGE_MAC80211_DEBUGFS),y) \
-       CONFIG_ATH9K=$(if $(CONFIG_PACKAGE_kmod-ath9k),m) \
-       CONFIG_ATH9K_PCI=$(CONFIG_PCI) \
-       CONFIG_ATH9K_AHB=$(if $(CONFIG_TARGET_ar71xx),y) \
-       CONFIG_ATH9K_HTC=$(if $(CONFIG_PACKAGE_kmod-ath9k-htc),m) \
-       CONFIG_ATH9K_HTC_DEBUGFS=$(if $(CONFIG_PACKAGE_MAC80211_DEBUGFS),y) \
-       CONFIG_ATH9K_HW=$(if $(CONFIG_PACKAGE_kmod-ath9k-common),m) \
-       CONFIG_ATH9K_COMMON=$(if $(CONFIG_PACKAGE_kmod-ath9k-common),m) \
-       CONFIG_ATH9K_DEBUGFS=$(if $(CONFIG_PACKAGE_MAC80211_DEBUGFS),y) \
-       CONFIG_AR5523= \
-       CONFIG_WIL6210= \
-       CONFIG_CARL9170=$(if $(CONFIG_PACKAGE_kmod-carl9170),m) \
-       CONFIG_CARL9170_DEBUGFS=$(if $(CONFIG_PACKAGE_MAC80211_DEBUGFS),y) \
-       CONFIG_COMPAT_ZD1211RW=$(if $(CONFIG_PACKAGE_kmod-zd1211rw),m) \
-       CONFIG_P54_COMMON=$(if $(CONFIG_PACKAGE_kmod-p54-common),m) \
-       CONFIG_P54_PCI=$(if $(CONFIG_PACKAGE_kmod-p54-pci),m) \
-       CONFIG_P54_USB=$(if $(CONFIG_PACKAGE_kmod-p54-usb),m) \
-       CONFIG_P54_SPI=$(if $(CONFIG_PACKAGE_kmod-p54-spi),m) \
-       CONFIG_P54_SPI_DEFAULT_EEPROM=n \
-       CONFIG_RT2X00=$(if $(CONFIG_PACKAGE_kmod-rt2x00-lib),m) \
-       CONFIG_RT2X00_LIB=$(if $(CONFIG_PACKAGE_kmod-rt2x00-lib),m) \
-       CONFIG_RT2X00_LIB_PCI=$(if $(CONFIG_PACKAGE_kmod-rt2x00-pci),m) \
-       CONFIG_RT2X00_LIB_USB=$(if $(CONFIG_PACKAGE_kmod-rt2x00-usb),m) \
-       CONFIG_RT2X00_LIB_SOC=$(if $(CONFIG_PACKAGE_kmod-rt2x00-soc),m) \
-       CONFIG_RT2X00_LIB_DEBUGFS=$(CONFIG_PACKAGE_RT2X00_LIB_DEBUGFS) \
-       CONFIG_RT2X00_LIB_CRYPTO=$(NEED_RT2X00_LIB_CRYPTO) \
-       CONFIG_RT2X00_LIB_FIRMWARE=$(NEED_RT2X00_LIB_FIRMWARE) \
-       CONFIG_RT2X00_LIB_EEPROM=$(NEED_RT2X00_LIB_EEPROM) \
-       CONFIG_RT2X00_LIB_HT=$(NEED_RT2X00_LIB_HT) \
-       CONFIG_RT2X00_LIB_LEDS=$(NEED_RT2X00_LIB_LEDS) \
-       CONFIG_RT2400PCI=$(if $(CONFIG_PACKAGE_kmod-rt2400-pci),m) \
-       CONFIG_RT2500PCI=$(if $(CONFIG_PACKAGE_kmod-rt2500-pci),m) \
-       CONFIG_RT2500USB=$(if $(CONFIG_PACKAGE_kmod-rt2500-usb),m) \
-       CONFIG_RT61PCI=$(if $(CONFIG_PACKAGE_kmod-rt61-pci),m) \
-       CONFIG_RT73USB=$(if $(CONFIG_PACKAGE_kmod-rt73-usb),m) \
-       CONFIG_RT2800_LIB=$(if $(CONFIG_PACKAGE_kmod-rt2800-lib),m) \
-       CONFIG_RT2800PCI=$(if $(CONFIG_PACKAGE_kmod-rt2800-pci),m) \
-       CONFIG_RT2800USB=$(if $(CONFIG_PACKAGE_kmod-rt2800-usb),m) \
-       CONFIG_RTL8180=$(if $(CONFIG_PACKAGE_kmod-rtl8180),m) \
-       CONFIG_RTL8187=$(if $(CONFIG_PACKAGE_kmod-rtl8187),m) \
-       CONFIG_RTL8192CE= \
-       CONFIG_RTLWIFI= \
-       CONFIG_MAC80211_HWSIM=$(if $(CONFIG_PACKAGE_kmod-mac80211-hwsim),m) \
-       CONFIG_PCMCIA= \
-       CONFIG_LIBIPW=$(if $(CONFIG_PACKAGE_kmod-net-libipw),m) \
-       CONFIG_LIBERTAS=$(if $(CONFIG_PACKAGE_kmod-libertas-sd)$(CONFIG_PACKAGE_kmod-libertas-usb),m) \
-       CONFIG_LIBERTAS_CS= \
-       CONFIG_LIBERTAS_SPI= \
-       CONFIG_COMPAT_LIBERTAS_SDIO=$(if $(CONFIG_PACKAGE_kmod-libertas-sd),m) \
-       CONFIG_LIBERTAS_THINFIRM= \
-       CONFIG_LIBERTAS_USB=$(if $(CONFIG_PACKAGE_kmod-libertas-usb),m) \
-       CONFIG_IPW2100=$(if $(CONFIG_PACKAGE_kmod-net-ipw2100),m) \
-       CONFIG_IPW2200=$(if $(CONFIG_PACKAGE_kmod-net-ipw2200),m) \
-       CONFIG_NL80211=y \
-       CONFIG_LIB80211=$(if $(CONFIG_PACKAGE_kmod-lib80211),m) \
-       CONFIG_LIB80211_CRYPT_WEP=$(if $(CONFIG_PACKAGE_kmod-lib80211),m) \
-       CONFIG_LIB80211_CRYPT_CCMP=$(if $(CONFIG_PACKAGE_kmod-lib80211),m) \
-       CONFIG_LIB80211_CRYPT_TKIP=$(if $(CONFIG_PACKAGE_kmod-lib80211),m) \
-       CONFIG_IWLWIFI=$(if $(CONFIG_PACKAGE_kmod-iwlagn),m) \
-       CONFIG_IWLEGACY=$(if $(CONFIG_PACKAGE_kmod-iwl-legacy),m) \
-       CONFIG_COMPAT_IWL4965=$(if $(CONFIG_PACKAGE_kmod-iwl4965),m) \
-       CONFIG_IWL3945=$(if $(CONFIG_PACKAGE_kmod-iwl3945),m) \
-       CONFIG_MWL8K=$(if $(CONFIG_PACKAGE_kmod-mwl8k),m) \
-       CONFIG_ATMEL= \
-       CONFIG_PCMCIA_ATMEL= \
-       CONFIG_ADM8211=$(if $(CONFIG_PACKAGE_kmod-adm8211),m) \
-       CONFIG_USB_NET_RNDIS_HOST= \
-       CONFIG_USB_NET_RNDIS_WLAN= \
-       CONFIG_USB_NET_CDCETHER= \
-       CONFIG_USB_USBNET= \
-       CONFIG_AT76C50X_USB= \
-       CONFIG_WL_TI=$(if $(CONFIG_PACKAGE_kmod-wl12xx),m) \
-       CONFIG_WLCORE=$(if $(CONFIG_PACKAGE_kmod-wl12xx),m) \
-       CONFIG_WL12XX=$(if $(CONFIG_PACKAGE_kmod-wl12xx),m) \
-       CONFIG_WLCORE_SDIO=$(if $(CONFIG_PACKAGE_kmod-wl12xx),m) \
-       CONFIG_EEPROM_93CX6= \
-       CONFIG_HERMES=$(if $(CONFIG_PACKAGE_kmod-net-hermes),m) \
-       CONFIG_HERMES_CACHE_FW_ON_INIT= \
-       CONFIG_PCI_HERMES=$(if $(CONFIG_PACKAGE_kmod-net-hermes-pci),m) \
-       CONFIG_PLX_HERMES=$(if $(CONFIG_PACKAGE_kmod-net-hermes-plx),m) \
-       CONFIG_PCMCIA_HERMES=$(if $(CONFIG_PACKAGE_kmod-net-hermes-pcmcia),m) \
-       CONFIG_HERMES_PRISM= \
-       CONFIG_APPLE_AIRPORT= \
-       CONFIG_TMD_HERMES= \
-       CONFIG_NORTEL_HERMES= \
-       CONFIG_PCMCIA_SPECTRUM= \
-       CONFIG_ORINOCO_USB= \
-       CONFIG_IWM= \
-       CONFIG_MWIFIEX= \
-       CONFIG_ATH6KL= \
-       CONFIG_MAC80211_RC_MINSTREL_HT=y \
-       MADWIFI= \
-       CONFIG_BRCMUTIL=$(if $(CONFIG_PACKAGE_kmod-brcmutil),m) \
-       CONFIG_BRCMSMAC=$(if $(CONFIG_PACKAGE_kmod-brcmsmac),m) \
-       CONFIG_BRCMFMAC=$(if $(CONFIG_PACKAGE_kmod-brcmfmac),m) \
-       CONFIG_BRCMFMAC_USB=$(if $(CONFIG_PACKAGE_kmod-brcmfmac),y) \
-       CONFIG_BRCMDBG=$(if $(CONFIG_PACKAGE_BRCM80211_DEBUG),y) \
+       EXTRA_CFLAGS="-I$(PKG_BUILD_DIR)/include" \
        KLIB_BUILD="$(LINUX_DIR)" \
        MODPROBE=true \
        KLIB=$(TARGET_MODULES_DIR) \
        KERNEL_SUBLEVEL=$(lastword $(subst ., ,$(KERNEL_PATCHVER))) \
        KBUILD_LDFLAGS_MODULE_PREREQ=
 
-ifeq ($(CONFIG_PACKAGE_kmod-libertas-sd)$(CONFIG_PACKAGE_kmod-libertas-usb)$(CONFIG_PACKAGE_kmod-rt2x00-lib),)
-  MAKE_OPTS += CONFIG_COMPAT_KFIFO=
-endif
-
-DISABLE_CONFIG = \
-       COMPAT_BLUETOOTH.* \
-       COMPAT_CORDIC \
-       COMPAT_CRC8 \
-       COMPAT_MDIO \
-       COMPAT_NETWORK_MODULES \
-       COMPAT_NET_USB_MODULES \
-       COMPAT_VAR_MODULES \
-       COMPAT_RFKILL \
-       COMPAT_RFKILL_.* \
-       COMPAT_STAGING \
-       \
-       B43_PCMCIA \
-       B43_SDIO \
-       BCMA.* \
-       COMPAT_ATH9K_RATE_CONTROL \
-       HID_GENERIC \
-       MAC80211_RC_PID \
-       PCMCIA \
-       RFKILL_BACKPORT.* \
-       SSB \
-       SSB_SDIOHOST \
-       \
-       ATH5K_PCI \
-       ATH9K_BTCOEX_SUPPORT \
-       B43_PHY_N \
-       B43_PHY_HT \
-       B43_BCMA.* \
-       MAC80211_MESH \
-       RT2X00_LIB_PCI \
-       RT2X00_LIB_USB \
-       COMPAT_MWIFIEX
+define ConfigVars
+$(subst $(space),,$(foreach opt,$(config-$(1)),CPTCFG_$(opt)=$(1)
+))
+endef
 
+define mac80211_config
+$(call ConfigVars,m)$(call ConfigVars,y)
+endef
+$(eval $(call shexport,mac80211_config))
 
 define Build/Prepare
        rm -rf $(PKG_BUILD_DIR)
@@ -1413,14 +1333,12 @@ define Build/Prepare
 
        echo 'compat-wireless-$(PKG_VERSION)-$(PKG_RELEASE)-$(REVISION)' > $(PKG_BUILD_DIR)/compat_version
        $(CP) ./files/regdb.txt $(PKG_BUILD_DIR)/net/wireless/db.txt
-
-       sed -i $(foreach config,$(DISABLE_CONFIG),-e 's,^\([    ]*export *CONFIG_$(config)=\),# \1,') $(PKG_BUILD_DIR)/config.mk
 endef
 
 ifneq ($(CONFIG_PACKAGE_kmod-cfg80211)$(CONFIG_PACKAGE_kmod-lib80211),)
  define Build/Compile/kmod
        rm -rf $(PKG_BUILD_DIR)/modules
-       +$(MAKE) $(PKG_JOBS) -C "$(PKG_BUILD_DIR)" $(MAKE_OPTS) modules
+       +$(MAKE) $(PKG_JOBS) $(MAKE_OPTS) modules
  endef
 endif
 
@@ -1431,15 +1349,19 @@ define Build/Configure
 endef
 
 define Build/Compile
+       $(SH_FUNC) var2file "$(call shvar,mac80211_config)" $(PKG_BUILD_DIR)/.config
+       $(MAKE) $(MAKE_OPTS) allnoconfig
        $(call Build/Compile/kmod)
 endef
 
 define Build/InstallDev
        mkdir -p \
                $(1)/usr/include/mac80211 \
+               $(1)/usr/include/mac80211-backport \
                $(1)/usr/include/mac80211/ath \
                $(1)/usr/include/net/mac80211
        $(CP) $(PKG_BUILD_DIR)/net/mac80211/*.h $(PKG_BUILD_DIR)/include/* $(1)/usr/include/mac80211/
+       $(CP) $(PKG_BUILD_DIR)/backport-include/* $(1)/usr/include/mac80211-backport/
        $(CP) $(PKG_BUILD_DIR)/net/mac80211/rate.h $(1)/usr/include/net/mac80211/
        $(CP) $(PKG_BUILD_DIR)/drivers/net/wireless/ath/*.h $(1)/usr/include/mac80211/ath/
 endef
@@ -1668,6 +1590,7 @@ $(eval $(call KernelPackage,p54-pci))
 $(eval $(call KernelPackage,p54-usb))
 $(eval $(call KernelPackage,p54-spi))
 $(eval $(call KernelPackage,rt2x00-lib))
+$(eval $(call KernelPackage,rt2x00-mmio))
 $(eval $(call KernelPackage,rt2x00-pci))
 $(eval $(call KernelPackage,rt2x00-usb))
 $(eval $(call KernelPackage,rt2x00-soc))
index 081dc4d..a052a1c 100644 (file)
@@ -411,7 +411,12 @@ enable_mac80211() {
                        # We attempt to set the channel for all interfaces, although
                        # mac80211 may not support it or the driver might not yet
                        # for ap mode this is handled by hostapd
-                       [ -n "$fixed" -a -n "$channel" ] && iw dev "$ifname" set channel "$channel"
+                       config_get htmode "$device" htmode
+                       case "$htmode" in
+                               HT20|HT40+|HT40-) ;;
+                               *) htmode= ;;
+                       esac
+                       [ -n "$fixed" -a -n "$channel" ] && iw dev "$ifname" set channel "$channel" $htmode
                fi
 
                i=$(($i + 1))
@@ -526,6 +531,20 @@ enable_mac80211() {
                                        ${mcval:+mcast-rate $mcval} \
                                        ${keyspec:+keys $keyspec}
                        ;;
+                       mesh)
+                               mp_list="mesh_retry_timeout mesh_confirm_timeout mesh_holding_timeout mesh_max_peer_links
+                                       mesh_max_retries mesh_ttl mesh_element_ttl mesh_auto_open_plinks mesh_hwmp_max_preq_retries
+                                       mesh_path_refresh_time mesh_min_discovery_timeout mesh_hwmp_active_path_timeout
+                                       mesh_hwmp_preq_min_interval mesh_hwmp_net_diameter_traversal_time mesh_hwmp_rootmode
+                                       mesh_hwmp_rann_interval mesh_gate_announcements mesh_fwding mesh_sync_offset_max_neighor
+                                       mesh_rssi_threshold mesh_hwmp_active_path_to_root_timeout mesh_hwmp_root_interval
+                                       mesh_hwmp_confirmation_interval mesh_power_mode mesh_awake_window"
+                               for mp in $mp_list
+                               do
+                                       config_get mp_val "$vif" "$mp" ""
+                                       [ -n "$mp_val" ] && iw dev "$ifname" set mesh_param "$mp" "$mp_val"
+                               done
+                       ;;
                        sta)
                                if eval "type wpa_supplicant_setup_vif" 2>/dev/null >/dev/null; then
                                        wpa_supplicant_setup_vif "$vif" nl80211 "${hostapd_ctrl:+-H $hostapd_ctrl}" || {
diff --git a/package/mac80211/patches/000-fix_kconfig.patch b/package/mac80211/patches/000-fix_kconfig.patch
new file mode 100644 (file)
index 0000000..88d0b04
--- /dev/null
@@ -0,0 +1,16 @@
+--- a/kconf/Makefile
++++ b/kconf/Makefile
+@@ -1,10 +1,10 @@
+-CFLAGS=-Wall -Wmissing-prototypes -Wstrict-prototypes -O2 -fomit-frame-pointer
++CFLAGS=-Wall -Wmissing-prototypes -Wstrict-prototypes -O2 -fomit-frame-pointer -DKBUILD_NO_NLS
+ LXDIALOG := lxdialog/checklist.o lxdialog/inputbox.o lxdialog/menubox.o lxdialog/textbox.o lxdialog/util.o lxdialog/yesno.o
+ conf: conf.o zconf.tab.o
+-mconf: LDFLAGS = -Wl,--no-as-needed $(shell ./lxdialog/check-lxdialog.sh -ldflags $(CC))
+-mconf: CFLAGS += -DCURSES_LOC="<ncurses.h>" -DLOCALE
++mconf: LDFLAGS = $(shell ./lxdialog/check-lxdialog.sh -ldflags $(CC))
++mconf: CFLAGS += -DCURSES_LOC="<ncurses.h>"
+ mconf: mconf.o zconf.tab.o $(LXDIALOG)
+ .PHONY: clean
diff --git a/package/mac80211/patches/001-disable_rfkill.patch b/package/mac80211/patches/001-disable_rfkill.patch
deleted file mode 100644 (file)
index 7af485f..0000000
+++ /dev/null
@@ -1,13 +0,0 @@
---- a/include/linux/rfkill.h
-+++ b/include/linux/rfkill.h
-@@ -3,6 +3,10 @@
- #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,31))
-+#undef CONFIG_RFKILL
-+#undef CONFIG_RFKILL_LEDS
-+#undef CONFIG_RFKILL_MODULE
-+
- #include_next <linux/rfkill.h>
- #else
diff --git a/package/mac80211/patches/001-fix_build.patch b/package/mac80211/patches/001-fix_build.patch
new file mode 100644 (file)
index 0000000..c541985
--- /dev/null
@@ -0,0 +1,156 @@
+--- a/Makefile
++++ b/Makefile
+@@ -19,6 +19,7 @@ KLIB_BUILD ?= $(KLIB)/build/
+ KERNEL_CONFIG := $(KLIB_BUILD)/.config
+ KERNEL_MAKEFILE := $(KLIB_BUILD)/Makefile
+ CONFIG_MD5 := $(shell md5sum $(KERNEL_CONFIG) 2>/dev/null | sed 's/\s.*//')
++STAMP_KERNEL_CONFIG := .kernel_config_md5_$(CONFIG_MD5)
+ export KLIB KLIB_BUILD BACKPORT_PWD KMODDIR KMODPATH_ARG
+@@ -36,7 +37,8 @@ mrproper:
+       @rm -f .kernel_config_md5 Kconfig.versions Kconfig.kernel
+       @rm -f backport-include/backport/autoconf.h
+-.DEFAULT:
++.SILENT: $(STAMP_KERNEL_CONFIG)
++$(STAMP_KERNEL_CONFIG):
+       @set -e ; test -f .local-symbols || (                                           \
+       echo "/--------------"                                                          ;\
+       echo "| You shouldn't run make in the backports tree, but only in"              ;\
+@@ -60,56 +62,60 @@ mrproper:
+       echo "| (that isn't currently running.)"                                        ;\
+       echo "\\--"                                                                     ;\
+       false)
+-      @set -e ; if [ "$$(cat .kernel_config_md5 2>/dev/null)" != "$(CONFIG_MD5)" ]    ;\
+-      then                                                                            \
+-              echo -n "Generating local configuration database from kernel ..."       ;\
+-              grep -v -f .local-symbols $(KERNEL_CONFIG) | grep = | (                 \
+-                      while read l ; do                                               \
+-                              if [ "$${l:0:7}" != "CONFIG_" ] ; then                  \
+-                                      continue                                        ;\
+-                              fi                                                      ;\
+-                              l=$${l:7}                                               ;\
+-                              n=$${l%%=*}                                             ;\
+-                              v=$${l#*=}                                              ;\
+-                              if [ "$$v" = "m" ] ; then                               \
+-                                      echo config $$n                                 ;\
+-                                      echo '    tristate'                             ;\
+-                              elif [ "$$v" = "y" ] ; then                             \
+-                                      echo config $$n                                 ;\
+-                                      echo '    bool'                                 ;\
+-                              else                                                    \
+-                                      continue                                        ;\
+-                              fi                                                      ;\
+-                              echo "    default $$v"                                  ;\
+-                              echo ""                                                 ;\
+-                      done                                                            \
+-              ) > Kconfig.kernel                                                      ;\
+-              kver=$$($(MAKE) --no-print-directory -C $(KLIB_BUILD) kernelversion |   \
+-                      sed 's/^\(\(3\|2\.6\)\.[0-9]\+\).*/\1/;t;d')                    ;\
+-              test "$$kver" != "" || echo "Kernel version parse failed!"              ;\
+-              test "$$kver" != ""                                                     ;\
+-              kvers="$$(seq 14 39 | sed 's/^/2.6./')"                                 ;\
+-              kvers="$$kvers $$(seq 0 99 | sed 's/^/3./')"                            ;\
+-              print=0                                                                 ;\
+-              for v in $$kvers ; do                                                   \
+-                      if [ "$$print" = "1" ] ; then                                   \
+-                              echo config BACKPORT_KERNEL_$$(echo $$v | tr . _)       ;\
+-                              echo "    def_bool y"                                   ;\
+-                      fi                                                              ;\
+-                      if [ "$$v" = "$$kver" ] ; then print=1 ; fi                     ;\
+-              done > Kconfig.versions                                                 ;\
+-              # RHEL as well, sadly we need to grep for it                            ;\
+-              RHEL_MAJOR=$$(grep '^RHEL_MAJOR' $(KERNEL_MAKEFILE) |                   \
+-                                      sed 's/.*=\s*\([0-9]*\)/\1/;t;d')               ;\
+-              RHEL_MINOR=$$(grep '^RHEL_MINOR' $(KERNEL_MAKEFILE) |                   \
+-                                      sed 's/.*=\s*\([0-9]*\)/\1/;t;d')               ;\
+-              for v in $$(seq 0 $$RHEL_MINOR) ; do                                    \
+-                      echo config BACKPORT_RHEL_KERNEL_$${RHEL_MAJOR}_$$v             ;\
+-                      echo "    def_bool y"                                           ;\
+-              done >> Kconfig.versions                                                ;\
+-              echo " done."                                                           ;\
+-      fi                                                                              ;\
+-      echo "$(CONFIG_MD5)" > .kernel_config_md5
++      @rm -f .kernel_config_md5_*
++      @touch $@
++
++Kconfig.kernel: $(STAMP_KERNEL_CONFIG) .local-symbols
++      @printf "Generating local configuration database from kernel ..."
++      @grep -v -f .local-symbols $(KERNEL_CONFIG) | grep = | (                        \
++              while read l ; do                                               \
++                      if [ "$${l:0:7}" != "CONFIG_" ] ; then                  \
++                              continue                                        ;\
++                      fi                                                      ;\
++                      l=$${l:7}                                               ;\
++                      n=$${l%%=*}                                             ;\
++                      v=$${l#*=}                                              ;\
++                      if [ "$$v" = "m" ] ; then                               \
++                              echo config $$n                                 ;\
++                              echo '    tristate'                             ;\
++                      elif [ "$$v" = "y" ] ; then                             \
++                              echo config $$n                                 ;\
++                              echo '    bool'                                 ;\
++                      else                                                    \
++                              continue                                        ;\
++                      fi                                                      ;\
++                      echo "    default $$v"                                  ;\
++                      echo ""                                                 ;\
++              done                                                            \
++      ) > $@
++      @echo " done."
++
++Kconfig.versions: Kconfig.kernel
++      @kver=$$($(MAKE) --no-print-directory -C $(KLIB_BUILD) kernelversion |  \
++              sed 's/^\(\(3\|2\.6\)\.[0-9]\+\).*/\1/;t;d')                    ;\
++      test "$$kver" != "" || echo "Kernel version parse failed!"              ;\
++      test "$$kver" != ""                                                     ;\
++      kvers="$$(seq 14 39 | sed 's/^/2.6./')"                                 ;\
++      kvers="$$kvers $$(seq 0 99 | sed 's/^/3./')"                            ;\
++      print=0                                                                 ;\
++      for v in $$kvers ; do                                                   \
++              if [ "$$print" = "1" ] ; then                                   \
++                      echo config BACKPORT_KERNEL_$$(echo $$v | tr . _)       ;\
++                      echo "    def_bool y"                                   ;\
++              fi                                                              ;\
++              if [ "$$v" = "$$kver" ] ; then print=1 ; fi                     ;\
++      done > $@
++      @RHEL_MAJOR=$$(grep '^RHEL_MAJOR' $(KERNEL_MAKEFILE) |                  \
++                              sed 's/.*=\s*\([0-9]*\)/\1/;t;d')               ;\
++      RHEL_MINOR=$$(grep '^RHEL_MINOR' $(KERNEL_MAKEFILE) |                   \
++                              sed 's/.*=\s*\([0-9]*\)/\1/;t;d')               ;\
++      for v in $$(seq 0 $$RHEL_MINOR) ; do                                    \
++              echo config BACKPORT_RHEL_KERNEL_$${RHEL_MAJOR}_$$v             ;\
++              echo "    def_bool y"                                           ;\
++      done >> $@
++
++.DEFAULT:
++      @$(MAKE) Kconfig.versions
+       @$(MAKE) -f Makefile.real "$@"
+ else
+--- a/Makefile.real
++++ b/Makefile.real
+@@ -54,7 +54,7 @@ defconfig-%::
+ backport-include/backport/autoconf.h: .config Kconfig.versions Kconfig.kernel
+       @$(MAKE) oldconfig
+-      @echo -n "Building backport-include/backport/autoconf.h ..."
++      @printf "Building backport-include/backport/autoconf.h ..."
+       @grep -f .local-symbols .config | (                             \
+               echo "#ifndef COMPAT_AUTOCONF_INCLUDED"                 ;\
+               echo "#define COMPAT_AUTOCONF_INCLUDED"                 ;\
+@@ -75,7 +75,12 @@ backport-include/backport/autoconf.h: .c
+                       esac                                            ;\
+               done                                                    ;\
+               echo "#endif /* COMPAT_AUTOCONF_INCLUDED */"            ;\
+-      ) > backport-include/backport/autoconf.h
++      ) > $@.new
++      @if cmp -s $@ $@.new; then \
++              rm -f $@.new; \
++      else \
++              mv $@.new $@; \
++      fi
+       @echo " done."
+ .PHONY: modules
diff --git a/package/mac80211/patches/002-change_allconfig.patch b/package/mac80211/patches/002-change_allconfig.patch
new file mode 100644 (file)
index 0000000..91ad20f
--- /dev/null
@@ -0,0 +1,44 @@
+--- a/kconf/conf.c
++++ b/kconf/conf.c
+@@ -578,40 +578,12 @@ int main(int ac, char **av)
+       case oldconfig:
+       case listnewconfig:
+       case olddefconfig:
+-              conf_read(NULL);
+-              break;
+       case allnoconfig:
+       case allyesconfig:
+       case allmodconfig:
+       case alldefconfig:
+       case randconfig:
+-              name = getenv("KCONFIG_ALLCONFIG");
+-              if (!name)
+-                      break;
+-              if ((strcmp(name, "") != 0) && (strcmp(name, "1") != 0)) {
+-                      if (conf_read_simple(name, S_DEF_USER)) {
+-                              fprintf(stderr,
+-                                      _("*** Can't read seed configuration \"%s\"!\n"),
+-                                      name);
+-                              exit(1);
+-                      }
+-                      break;
+-              }
+-              switch (input_mode) {
+-              case allnoconfig:       name = "allno.config"; break;
+-              case allyesconfig:      name = "allyes.config"; break;
+-              case allmodconfig:      name = "allmod.config"; break;
+-              case alldefconfig:      name = "alldef.config"; break;
+-              case randconfig:        name = "allrandom.config"; break;
+-              default: break;
+-              }
+-              if (conf_read_simple(name, S_DEF_USER) &&
+-                  conf_read_simple("all.config", S_DEF_USER)) {
+-                      fprintf(stderr,
+-                              _("*** KCONFIG_ALLCONFIG set, but no \"%s\" or \"all.config\" file found\n"),
+-                              name);
+-                      exit(1);
+-              }
++              conf_read(NULL);
+               break;
+       default:
+               break;
diff --git a/package/mac80211/patches/002-disable_ssb_build.patch b/package/mac80211/patches/002-disable_ssb_build.patch
deleted file mode 100644 (file)
index ef184c4..0000000
+++ /dev/null
@@ -1,21 +0,0 @@
---- a/config.mk
-+++ b/config.mk
-@@ -364,7 +364,8 @@ export CONFIG_IPW2200_QOS=y
- # % echo 1 > /sys/bus/pci/drivers/ipw2200/*/rtap_iface
- endif #CONFIG_WIRELESS_EXT
--ifdef CONFIG_SSB
-+# disabled
-+ifdef __CONFIG_SSB
- # Sonics Silicon Backplane
- export CONFIG_SSB_SPROM=y
-@@ -377,7 +378,7 @@ endif #CONFIG_PCMCIA
- # export CONFIG_SSB_DEBUG=y
- export CONFIG_SSB_DRIVER_PCICORE=y
- export CONFIG_B43_SSB=y
--endif #CONFIG_SSB
-+endif #__CONFIG_SSB
- # export CONFIG_BCMA=m
- # export CONFIG_BCMA_BLOCKIO=y
diff --git a/package/mac80211/patches/003-disable_codel.patch b/package/mac80211/patches/003-disable_codel.patch
deleted file mode 100644 (file)
index 0d6d749..0000000
+++ /dev/null
@@ -1,19 +0,0 @@
---- a/compat/scripts/gen-compat-config.sh
-+++ b/compat/scripts/gen-compat-config.sh
-@@ -66,16 +66,3 @@ if [[ ${CONFIG_COMPAT_KERNEL_2_6_36} = "
-               echo "export CONFIG_COMPAT_KFIFO=y"
-       fi
- fi
--
--if [[ ${CONFIG_COMPAT_KERNEL_3_5} = "y" ]]; then
--      # We don't have 2.6.24 backport support yet for Codel / FQ CoDel
--      # For those who want to try this is what is required that I can tell
--      # so far:
--      #  * struct Qdisc_ops
--      #       - init and change callback ops use a different argument dataype
--      #       - you need to parse data received from userspace differently
--      if [[ ${CONFIG_COMPAT_KERNEL_2_6_25} != "y" ]]; then
--              echo "export CONFIG_COMPAT_NET_SCH_CODEL=m"
--              echo "export CONFIG_COMPAT_NET_SCH_FQ_CODEL=m"
--      fi
--fi
diff --git a/package/mac80211/patches/003-remove_bogus_modparams.patch b/package/mac80211/patches/003-remove_bogus_modparams.patch
new file mode 100644 (file)
index 0000000..c969b19
--- /dev/null
@@ -0,0 +1,34 @@
+--- a/compat/main.c
++++ b/compat/main.c
+@@ -21,31 +21,6 @@ MODULE_LICENSE("GPL");
+ #error "You need a BACKPORTS_VERSION"
+ #endif
+-static char *backported_kernel_name = BACKPORTED_KERNEL_NAME;
+-
+-module_param(backported_kernel_name, charp, 0400);
+-MODULE_PARM_DESC(backported_kernel_name,
+-               "The kernel tree name that was used for this backport (" BACKPORTED_KERNEL_NAME ")");
+-
+-#ifdef BACKPORTS_GIT_TRACKED 
+-static char *backports_tracker_id = BACKPORTS_GIT_TRACKED;
+-module_param(backports_tracker_id, charp, 0400);
+-MODULE_PARM_DESC(backports_tracker_id,
+-               "The version of the tree containing this backport (" BACKPORTS_GIT_TRACKED ")");
+-#else
+-static char *backported_kernel_version = BACKPORTED_KERNEL_VERSION;
+-static char *backports_version = BACKPORTS_VERSION;
+-
+-module_param(backported_kernel_version, charp, 0400);
+-MODULE_PARM_DESC(backported_kernel_version,
+-               "The kernel version that was used for this backport (" BACKPORTED_KERNEL_VERSION ")");
+-
+-module_param(backports_version, charp, 0400);
+-MODULE_PARM_DESC(backports_version,
+-               "The git version of the backports tree used to generate this backport (" BACKPORTS_VERSION ")");
+-
+-#endif
+-
+ void backport_dependency_symbol(void)
+ {
+ }
diff --git a/package/mac80211/patches/004-use_env_for_bash.patch b/package/mac80211/patches/004-use_env_for_bash.patch
deleted file mode 100644 (file)
index 0ae3820..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
---- a/compat/scripts/gen-compat-config.sh
-+++ b/compat/scripts/gen-compat-config.sh
-@@ -1,4 +1,4 @@
--#!/bin/bash
-+#!/usr/bin/env bash
- # Copyright 2012        Luis R. Rodriguez <mcgrof@frijolero.org>
- # Copyright 2012        Hauke Mehrtens <hauke@hauke-m.de>
- #
diff --git a/package/mac80211/patches/010-add_include_for_bcma.patch b/package/mac80211/patches/010-add_include_for_bcma.patch
deleted file mode 100644 (file)
index e2e856e..0000000
+++ /dev/null
@@ -1,11 +0,0 @@
---- a/include/linux/compat-3.0.h
-+++ b/include/linux/compat-3.0.h
-@@ -36,6 +36,8 @@ static inline struct page *shmem_read_ma
- #endif
-+#include <linux/mod_devicetable.h>
-+
- /*
-  * since commit 1c5cae815d19ffe02bdfda1260949ef2b1806171
-  * "net: call dev_alloc_name from register_netdevice" dev_alloc_name is
diff --git a/package/mac80211/patches/010-disable_rfkill.patch b/package/mac80211/patches/010-disable_rfkill.patch
new file mode 100644 (file)
index 0000000..c5a92d6
--- /dev/null
@@ -0,0 +1,13 @@
+--- a/backport-include/linux/rfkill.h
++++ b/backport-include/linux/rfkill.h
+@@ -2,6 +2,10 @@
+ #define __COMPAT_RFKILL_H
+ #include <linux/version.h>
++#undef CONFIG_RFKILL
++#undef CONFIG_RFKILL_LEDS
++#undef CONFIG_RFKILL_MODULE
++
+ #if LINUX_VERSION_CODE >= KERNEL_VERSION(3,10,0)
+ #include_next <linux/rfkill.h>
+ #else
index fc5d4d6..89c6a60 100644 (file)
@@ -1,14 +1,14 @@
 --- a/compat/compat-2.6.39.c
 +++ b/compat/compat-2.6.39.c
-@@ -12,6 +12,7 @@
- #include <linux/tty.h>
+@@ -13,6 +13,7 @@
  #include <linux/sched.h>
+ #include <linux/module.h>
  
 +#ifdef CONFIG_COMPAT_BLUETOOTH
  #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,27))
  /*
   *            Termios Helper Methods
-@@ -111,4 +112,4 @@ int tty_set_termios(struct tty_struct *t
+@@ -112,4 +113,4 @@ int tty_set_termios(struct tty_struct *t
  }
  EXPORT_SYMBOL_GPL(tty_set_termios);
  #endif /* (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,27)) */
diff --git a/package/mac80211/patches/030-rt2x00_options.patch b/package/mac80211/patches/030-rt2x00_options.patch
new file mode 100644 (file)
index 0000000..789a77a
--- /dev/null
@@ -0,0 +1,36 @@
+--- a/drivers/net/wireless/rt2x00/Kconfig
++++ b/drivers/net/wireless/rt2x00/Kconfig
+@@ -202,25 +202,28 @@ config RT2800USB_UNKNOWN
+ endif
+ config RT2800_LIB
+-      tristate
++      tristate "RT2800 USB/PCI support"
+       depends on m
+ config RT2X00_LIB_MMIO
+-      tristate
++      tristate "RT2x00 MMIO support"
+       depends on m
+ config RT2X00_LIB_PCI
+-      tristate
++      tristate "RT2x00 PCI support"
++      depends on PCI
+       depends on m
+       select RT2X00_LIB
+ config RT2X00_LIB_SOC
+-      tristate
++      tristate "RT2x00 SoC support"
++      depends on SOC_RT288X || SOC_RT305X
+       depends on m
+       select RT2X00_LIB
+ config RT2X00_LIB_USB
+-      tristate
++      tristate "RT2x00 USB support"
++      depends on USB
+       depends on m
+       select RT2X00_LIB
diff --git a/package/mac80211/patches/030-wext.patch b/package/mac80211/patches/030-wext.patch
deleted file mode 100644 (file)
index cb52e7c..0000000
+++ /dev/null
@@ -1,18 +0,0 @@
---- a/net/wireless/core.c
-+++ b/net/wireless/core.c
-@@ -884,6 +884,15 @@ static int cfg80211_netdev_notifier_call
-               wdev->sme_state = CFG80211_SME_IDLE;
-               mutex_unlock(&rdev->devlist_mtx);
- #ifdef CONFIG_CFG80211_WEXT
-+#ifdef CONFIG_WIRELESS_EXT
-+              if (!dev->wireless_handlers)
-+                      dev->wireless_handlers = &cfg80211_wext_handler;
-+#else
-+              printk_once(KERN_WARNING "cfg80211: wext will not work because "
-+                          "kernel was compiled with CONFIG_WIRELESS_EXT=n. "
-+                          "Tools using wext interface, like iwconfig will "
-+                          "not work.\n");
-+#endif
-               wdev->wext.default_key = -1;
-               wdev->wext.default_mgmt_key = -1;
-               wdev->wext.connect.auth_type = NL80211_AUTHTYPE_AUTOMATIC;
diff --git a/package/mac80211/patches/040-brcmutil_option.patch b/package/mac80211/patches/040-brcmutil_option.patch
new file mode 100644 (file)
index 0000000..8a6cae6
--- /dev/null
@@ -0,0 +1,9 @@
+--- a/drivers/net/wireless/brcm80211/Kconfig
++++ b/drivers/net/wireless/brcm80211/Kconfig
+@@ -1,5 +1,5 @@
+ config BRCMUTIL
+-      tristate
++      tristate "Broadcom 802.11 driver utility functions"
+       depends on m
+ config BRCMSMAC
diff --git a/package/mac80211/patches/040-linux_3_9_compat.patch b/package/mac80211/patches/040-linux_3_9_compat.patch
deleted file mode 100644 (file)
index d83c39c..0000000
+++ /dev/null
@@ -1,153 +0,0 @@
---- a/include/linux/compat-2.6.h
-+++ b/include/linux/compat-2.6.h
-@@ -69,6 +69,7 @@ void compat_dependency_symbol(void);
- #include <linux/compat-3.6.h>
- #include <linux/compat-3.7.h>
- #include <linux/compat-3.8.h>
-+#include <linux/compat-3.9.h>
- #endif /* __ASSEMBLY__ */
---- /dev/null
-+++ b/include/linux/compat-3.9.h
-@@ -0,0 +1,140 @@
-+#ifndef LINUX_3_9_COMPAT_H
-+#define LINUX_3_9_COMPAT_H
-+
-+#include <linux/version.h>
-+
-+#if (LINUX_VERSION_CODE < KERNEL_VERSION(3,9,0))
-+
-+#include <linux/idr.h>
-+#include <linux/list.h>
-+#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,25))
-+#include <linux/rculist.h>
-+#endif
-+#include <net/sock.h>
-+#include <linux/tty.h>
-+#include <linux/tty_flip.h>
-+
-+/* include this before changing hlist_for_each_* to use the old versions. */
-+#include <net/sch_generic.h>
-+
-+
-+/**
-+ * backport of idr idr_alloc() usage
-+ * 
-+ * This backports a patch series send by Tejun Heo:
-+ * https://lkml.org/lkml/2013/2/2/159
-+ */
-+static inline void compat_idr_destroy(struct idr *idp)
-+{
-+      idr_remove_all(idp);
-+      idr_destroy(idp);
-+}
-+#define idr_destroy(idp) compat_idr_destroy(idp)
-+
-+static inline int idr_alloc(struct idr *idr, void *ptr, int start, int end,
-+                          gfp_t gfp_mask)
-+{
-+      int id, ret;
-+
-+      do {
-+              if (!idr_pre_get(idr, gfp_mask))
-+                      return -ENOMEM;
-+              ret = idr_get_new_above(idr, ptr, start, &id);
-+              if (!ret && id > end) {
-+                      idr_remove(idr, id);
-+                      ret = -ENOSPC;
-+              }
-+      } while (ret == -EAGAIN);
-+
-+      return ret ? ret : id;
-+}
-+
-+static inline void idr_preload(gfp_t gfp_mask)
-+{
-+}
-+
-+static inline void idr_preload_end(void)
-+{
-+}
-+
-+
-+/**
-+ * backport:
-+ *
-+ * commit 0bbacca7c3911451cea923b0ad6389d58e3d9ce9
-+ * Author: Sasha Levin <sasha.levin@oracle.com>
-+ * Date:   Thu Feb 7 12:32:18 2013 +1100
-+ *
-+ *     hlist: drop the node parameter from iterators
-+ */
-+
-+#define hlist_entry_safe(ptr, type, member) \
-+      (ptr) ? hlist_entry(ptr, type, member) : NULL
-+
-+#undef hlist_for_each_entry
-+/**
-+ * hlist_for_each_entry       - iterate over list of given type
-+ * @pos:      the type * to use as a loop cursor.
-+ * @head:     the head for your list.
-+ * @member:   the name of the hlist_node within the struct.
-+ */
-+#define hlist_for_each_entry(pos, head, member)                                       \
-+      for (pos = hlist_entry_safe((head)->first, typeof(*(pos)), member);     \
-+           pos;                                                               \
-+           pos = hlist_entry_safe((pos)->member.next, typeof(*(pos)), member))
-+
-+#undef hlist_for_each_entry_safe
-+/**
-+ * hlist_for_each_entry_safe - iterate over list of given type safe against removal of list entry
-+ * @pos:      the type * to use as a loop cursor.
-+ * @n:                another &struct hlist_node to use as temporary storage
-+ * @head:     the head for your list.
-+ * @member:   the name of the hlist_node within the struct.
-+ */
-+#define hlist_for_each_entry_safe(pos, n, head, member)                       \
-+      for (pos = hlist_entry_safe((head)->first, typeof(*pos), member);       \
-+           pos && ({ n = pos->member.next; 1; });                             \
-+           pos = hlist_entry_safe(n, typeof(*pos), member))
-+
-+#undef hlist_for_each_entry_rcu
-+/**
-+ * hlist_for_each_entry_rcu - iterate over rcu list of given type
-+ * @pos:      the type * to use as a loop cursor.
-+ * @head:     the head for your list.
-+ * @member:   the name of the hlist_node within the struct.
-+ *
-+ * This list-traversal primitive may safely run concurrently with
-+ * the _rcu list-mutation primitives such as hlist_add_head_rcu()
-+ * as long as the traversal is guarded by rcu_read_lock().
-+ */
-+#define hlist_for_each_entry_rcu(pos, head, member)                           \
-+      for (pos = hlist_entry_safe (rcu_dereference_raw(hlist_first_rcu(head)),\
-+                      typeof(*(pos)), member);                                \
-+              pos;                                                            \
-+              pos = hlist_entry_safe(rcu_dereference_raw(hlist_next_rcu(      \
-+                      &(pos)->member)), typeof(*(pos)), member))
-+
-+#undef sk_for_each
-+#define sk_for_each(__sk, list) \
-+      hlist_for_each_entry(__sk, list, sk_node)
-+
-+#define tty_flip_buffer_push(port) tty_flip_buffer_push((port)->tty)
-+#define tty_insert_flip_string(port, chars, size) tty_insert_flip_string((port)->tty, chars, size)
-+
-+/**
-+ * backport of:
-+ *
-+ * commit 496ad9aa8ef448058e36ca7a787c61f2e63f0f54
-+ * Author: Al Viro <viro@zeniv.linux.org.uk>
-+ * Date:   Wed Jan 23 17:07:38 2013 -0500
-+ *
-+ *     new helper: file_inode(file)
-+ */
-+static inline struct inode *file_inode(struct file *f)
-+{
-+      return f->f_path.dentry->d_inode;
-+}
-+
-+#endif /* (LINUX_VERSION_CODE < KERNEL_VERSION(3,9,0)) */
-+
-+#endif /* LINUX_3_9_COMPAT_H */
diff --git a/package/mac80211/patches/050-compat_backport.patch b/package/mac80211/patches/050-compat_backport.patch
deleted file mode 100644 (file)
index 7503de2..0000000
+++ /dev/null
@@ -1,35 +0,0 @@
---- a/include/linux/compat-3.5.h
-+++ b/include/linux/compat-3.5.h
-@@ -8,6 +8,32 @@
- #if (LINUX_VERSION_CODE < KERNEL_VERSION(3,5,0))
-+#include <net/netlink.h>
-+
-+/*
-+ * This backports:
-+ * commit 569a8fc38367dfafd87454f27ac646c8e6b54bca
-+ * Author: David S. Miller <davem@davemloft.net>
-+ * Date:   Thu Mar 29 23:18:53 2012 -0400
-+ *
-+ *     netlink: Add nla_put_be{16,32,64}() helpers.
-+ */
-+
-+static inline int nla_put_be16(struct sk_buff *skb, int attrtype, __be16 value)
-+{
-+      return nla_put(skb, attrtype, sizeof(__be16), &value);
-+}
-+
-+static inline int nla_put_be32(struct sk_buff *skb, int attrtype, __be32 value)
-+{
-+      return nla_put(skb, attrtype, sizeof(__be32), &value);
-+}
-+
-+static inline int nla_put_be64(struct sk_buff *skb, int attrtype, __be64 value)
-+{
-+      return nla_put(skb, attrtype, sizeof(__be64), &value);
-+}
-+
- /*
-  * This backports:
-  *
diff --git a/package/mac80211/patches/050-lib80211_option.patch b/package/mac80211/patches/050-lib80211_option.patch
new file mode 100644 (file)
index 0000000..5372114
--- /dev/null
@@ -0,0 +1,30 @@
+--- a/net/wireless/Kconfig
++++ b/net/wireless/Kconfig
+@@ -123,7 +123,7 @@ config CFG80211_WEXT
+         extensions with cfg80211-based drivers.
+ config LIB80211
+-      tristate
++      tristate "lib80211"
+       depends on m
+       default n
+       help
+@@ -133,15 +133,15 @@ config LIB80211
+         Drivers should select this themselves if needed.
+ config LIB80211_CRYPT_WEP
+-      tristate
++      tristate "lib80211 WEP support"
+       depends on m
+ config LIB80211_CRYPT_CCMP
+-      tristate
++      tristate "lib80211 CCMP support"
+       depends on m
+ config LIB80211_CRYPT_TKIP
+-      tristate
++      tristate "lib80211 TKIP support"
+       depends on m
+ config LIB80211_DEBUG
diff --git a/package/mac80211/patches/060-no_local_ssb_bcma.patch b/package/mac80211/patches/060-no_local_ssb_bcma.patch
new file mode 100644 (file)
index 0000000..c557460
--- /dev/null
@@ -0,0 +1,129 @@
+--- a/.local-symbols
++++ b/.local-symbols
+@@ -363,42 +363,6 @@ USB_CDC_PHONET=
+ USB_IPHETH=
+ USB_SIERRA_NET=
+ USB_VL600=
+-SSB_POSSIBLE=
+-SSB=
+-SSB_SPROM=
+-SSB_BLOCKIO=
+-SSB_PCIHOST_POSSIBLE=
+-SSB_PCIHOST=
+-SSB_B43_PCI_BRIDGE=
+-SSB_PCMCIAHOST_POSSIBLE=
+-SSB_PCMCIAHOST=
+-SSB_SDIOHOST_POSSIBLE=
+-SSB_SDIOHOST=
+-SSB_SILENT=
+-SSB_DEBUG=
+-SSB_SERIAL=
+-SSB_DRIVER_PCICORE_POSSIBLE=
+-SSB_DRIVER_PCICORE=
+-SSB_PCICORE_HOSTMODE=
+-SSB_DRIVER_MIPS=
+-SSB_SFLASH=
+-SSB_EMBEDDED=
+-SSB_DRIVER_EXTIF=
+-SSB_DRIVER_GIGE=
+-SSB_DRIVER_GPIO=
+-BCMA_POSSIBLE=
+-BCMA=
+-BCMA_BLOCKIO=
+-BCMA_HOST_PCI_POSSIBLE=
+-BCMA_HOST_PCI=
+-BCMA_DRIVER_PCI_HOSTMODE=
+-BCMA_HOST_SOC=
+-BCMA_DRIVER_MIPS=
+-BCMA_SFLASH=
+-BCMA_NFLASH=
+-BCMA_DRIVER_GMAC_CMN=
+-BCMA_DRIVER_GPIO=
+-BCMA_DEBUG=
+ DRM=
+ DRM_USB=
+ DRM_KMS_HELPER=
+--- a/Kconfig
++++ b/Kconfig
+@@ -31,9 +31,6 @@ source drivers/net/wireless/Kconfig
+ source drivers/net/ethernet/Kconfig
+ source drivers/net/usb/Kconfig
+-source drivers/ssb/Kconfig
+-source drivers/bcma/Kconfig
+-
+ source drivers/gpu/drm/Kconfig
+ source net/nfc/Kconfig
+--- a/Makefile.kernel
++++ b/Makefile.kernel
+@@ -26,8 +26,6 @@ obj-$(CPTCFG_MAC80211) += net/mac80211/
+ obj-$(CPTCFG_WLAN) += drivers/net/wireless/
+ obj-$(CPTCFG_BT) += net/bluetooth/
+ obj-$(CPTCFG_BT) += drivers/bluetooth/
+-obj-$(CPTCFG_SSB) += drivers/ssb/
+-obj-$(CPTCFG_BCMA) += drivers/bcma/
+ obj-$(CPTCFG_ETHERNET) += drivers/net/ethernet/
+ obj-$(CPTCFG_USB_NET_RNDIS_WLAN) += drivers/net/usb/
+ obj-$(CPTCFG_DRM) += drivers/gpu/drm/
+--- a/drivers/net/wireless/b43/main.c
++++ b/drivers/net/wireless/b43/main.c
+@@ -2729,7 +2729,7 @@ static struct ssb_device *b43_ssb_gpio_d
+ {
+       struct ssb_bus *bus = dev->dev->sdev->bus;
+-#ifdef CPTCFG_SSB_DRIVER_PCICORE
++#ifdef CONFIG_SSB_DRIVER_PCICORE
+       return (bus->chipco.dev ? bus->chipco.dev : bus->pcicore.dev);
+ #else
+       return bus->chipco.dev;
+@@ -4735,7 +4735,7 @@ static int b43_wireless_core_init(struct
+       }
+       if (sprom->boardflags_lo & B43_BFL_XTAL_NOSLOW)
+               hf |= B43_HF_DSCRQ; /* Disable slowclock requests from ucode. */
+-#ifdef CPTCFG_SSB_DRIVER_PCICORE
++#ifdef CONFIG_SSB_DRIVER_PCICORE
+       if (dev->dev->bus_type == B43_BUS_SSB &&
+           dev->dev->sdev->bus->bustype == SSB_BUSTYPE_PCI &&
+           dev->dev->sdev->bus->pcicore.dev->id.revision <= 10)
+--- a/drivers/net/wireless/b43legacy/main.c
++++ b/drivers/net/wireless/b43legacy/main.c
+@@ -1937,7 +1937,7 @@ static int b43legacy_gpio_init(struct b4
+       if (dev->dev->id.revision >= 2)
+               mask  |= 0x0010; /* FIXME: This is redundant. */
+-#ifdef CPTCFG_SSB_DRIVER_PCICORE
++#ifdef CONFIG_SSB_DRIVER_PCICORE
+       pcidev = bus->pcicore.dev;
+ #endif
+       gpiodev = bus->chipco.dev ? : pcidev;
+@@ -1956,7 +1956,7 @@ static void b43legacy_gpio_cleanup(struc
+       struct ssb_bus *bus = dev->dev->bus;
+       struct ssb_device *gpiodev, *pcidev = NULL;
+-#ifdef CPTCFG_SSB_DRIVER_PCICORE
++#ifdef CONFIG_SSB_DRIVER_PCICORE
+       pcidev = bus->pcicore.dev;
+ #endif
+       gpiodev = bus->chipco.dev ? : pcidev;
+--- a/drivers/net/wireless/brcm80211/brcmsmac/Makefile
++++ b/drivers/net/wireless/brcm80211/brcmsmac/Makefile
+@@ -43,6 +43,6 @@ brcmsmac-y := \
+       brcms_trace_events.o \
+       debug.o
+-brcmsmac-$(CPTCFG_BCMA_DRIVER_GPIO) += led.o
++brcmsmac-$(CONFIG_BCMA_DRIVER_GPIO) += led.o
+ obj-$(CPTCFG_BRCMSMAC)        += brcmsmac.o
+--- a/drivers/net/wireless/brcm80211/brcmsmac/led.h
++++ b/drivers/net/wireless/brcm80211/brcmsmac/led.h
+@@ -22,7 +22,7 @@ struct brcms_led {
+       bool active_low;
+ };
+-#ifdef CPTCFG_BCMA_DRIVER_GPIO
++#ifdef CONFIG_BCMA_DRIVER_GPIO
+ void brcms_led_unregister(struct brcms_info *wl);
+ int brcms_led_register(struct brcms_info *wl);
+ #else
diff --git a/package/mac80211/patches/100-pm_export_symbol.patch b/package/mac80211/patches/100-pm_export_symbol.patch
deleted file mode 100644 (file)
index 25fdc8c..0000000
+++ /dev/null
@@ -1,7 +0,0 @@
---- a/net/mac80211/pm.c
-+++ b/net/mac80211/pm.c
-@@ -1,3 +1,4 @@
-+#include <linux/export.h>
- #include <net/mac80211.h>
- #include <net/rtnetlink.h>
diff --git a/package/mac80211/patches/130-mesh_pathtbl_backport.patch b/package/mac80211/patches/130-mesh_pathtbl_backport.patch
deleted file mode 100644 (file)
index 1322099..0000000
+++ /dev/null
@@ -1,212 +0,0 @@
---- a/net/mac80211/mesh_pathtbl.c
-+++ b/net/mac80211/mesh_pathtbl.c
-@@ -72,9 +72,9 @@ static inline struct mesh_table *resize_
-  * it's used twice. So it is illegal to do
-  *    for_each_mesh_entry(rcu_dereference(...), ...)
-  */
--#define for_each_mesh_entry(tbl, p, node, i) \
-+#define for_each_mesh_entry(tbl, node, i) \
-       for (i = 0; i <= tbl->hash_mask; i++) \
--              hlist_for_each_entry_rcu(node, p, &tbl->hash_buckets[i], list)
-+              hlist_for_each_entry_rcu(node, &tbl->hash_buckets[i], list)
- static struct mesh_table *mesh_table_alloc(int size_order)
-@@ -139,7 +139,7 @@ static void mesh_table_free(struct mesh_
-       }
-       if (free_leafs) {
-               spin_lock_bh(&tbl->gates_lock);
--              hlist_for_each_entry_safe(gate, p, q,
-+              hlist_for_each_entry_safe(gate, q,
-                                        tbl->known_gates, list) {
-                       hlist_del(&gate->list);
-                       kfree(gate);
-@@ -333,12 +333,11 @@ static struct mesh_path *mpath_lookup(st
-                                     struct ieee80211_sub_if_data *sdata)
- {
-       struct mesh_path *mpath;
--      struct hlist_node *n;
-       struct hlist_head *bucket;
-       struct mpath_node *node;
-       bucket = &tbl->hash_buckets[mesh_table_hash(dst, sdata, tbl)];
--      hlist_for_each_entry_rcu(node, n, bucket, list) {
-+      hlist_for_each_entry_rcu(node, bucket, list) {
-               mpath = node->mpath;
-               if (mpath->sdata == sdata &&
-                   ether_addr_equal(dst, mpath->dst)) {
-@@ -389,11 +388,10 @@ mesh_path_lookup_by_idx(struct ieee80211
- {
-       struct mesh_table *tbl = rcu_dereference(mesh_paths);
-       struct mpath_node *node;
--      struct hlist_node *p;
-       int i;
-       int j = 0;
--      for_each_mesh_entry(tbl, p, node, i) {
-+      for_each_mesh_entry(tbl, node, i) {
-               if (sdata && node->mpath->sdata != sdata)
-                       continue;
-               if (j++ == idx) {
-@@ -417,13 +415,12 @@ int mesh_path_add_gate(struct mesh_path
- {
-       struct mesh_table *tbl;
-       struct mpath_node *gate, *new_gate;
--      struct hlist_node *n;
-       int err;
-       rcu_read_lock();
-       tbl = rcu_dereference(mesh_paths);
--      hlist_for_each_entry_rcu(gate, n, tbl->known_gates, list)
-+      hlist_for_each_entry_rcu(gate, tbl->known_gates, list)
-               if (gate->mpath == mpath) {
-                       err = -EEXIST;
-                       goto err_rcu;
-@@ -460,9 +457,9 @@ err_rcu:
- static void mesh_gate_del(struct mesh_table *tbl, struct mesh_path *mpath)
- {
-       struct mpath_node *gate;
--      struct hlist_node *p, *q;
-+      struct hlist_node *q;
--      hlist_for_each_entry_safe(gate, p, q, tbl->known_gates, list) {
-+      hlist_for_each_entry_safe(gate, q, tbl->known_gates, list) {
-               if (gate->mpath != mpath)
-                       continue;
-               spin_lock_bh(&tbl->gates_lock);
-@@ -504,7 +501,6 @@ int mesh_path_add(struct ieee80211_sub_i
-       struct mesh_path *mpath, *new_mpath;
-       struct mpath_node *node, *new_node;
-       struct hlist_head *bucket;
--      struct hlist_node *n;
-       int grow = 0;
-       int err = 0;
-       u32 hash_idx;
-@@ -550,7 +546,7 @@ int mesh_path_add(struct ieee80211_sub_i
-       spin_lock(&tbl->hashwlock[hash_idx]);
-       err = -EEXIST;
--      hlist_for_each_entry(node, n, bucket, list) {
-+      hlist_for_each_entry(node, bucket, list) {
-               mpath = node->mpath;
-               if (mpath->sdata == sdata &&
-                   ether_addr_equal(dst, mpath->dst))
-@@ -640,7 +636,6 @@ int mpp_path_add(struct ieee80211_sub_if
-       struct mesh_path *mpath, *new_mpath;
-       struct mpath_node *node, *new_node;
-       struct hlist_head *bucket;
--      struct hlist_node *n;
-       int grow = 0;
-       int err = 0;
-       u32 hash_idx;
-@@ -680,7 +675,7 @@ int mpp_path_add(struct ieee80211_sub_if
-       spin_lock(&tbl->hashwlock[hash_idx]);
-       err = -EEXIST;
--      hlist_for_each_entry(node, n, bucket, list) {
-+      hlist_for_each_entry(node, bucket, list) {
-               mpath = node->mpath;
-               if (mpath->sdata == sdata &&
-                   ether_addr_equal(dst, mpath->dst))
-@@ -725,14 +720,13 @@ void mesh_plink_broken(struct sta_info *
-       static const u8 bcast[ETH_ALEN] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
-       struct mesh_path *mpath;
-       struct mpath_node *node;
--      struct hlist_node *p;
-       struct ieee80211_sub_if_data *sdata = sta->sdata;
-       int i;
-       __le16 reason = cpu_to_le16(WLAN_REASON_MESH_PATH_DEST_UNREACHABLE);
-       rcu_read_lock();
-       tbl = rcu_dereference(mesh_paths);
--      for_each_mesh_entry(tbl, p, node, i) {
-+      for_each_mesh_entry(tbl, node, i) {
-               mpath = node->mpath;
-               if (rcu_dereference(mpath->next_hop) == sta &&
-                   mpath->flags & MESH_PATH_ACTIVE &&
-@@ -792,13 +786,12 @@ void mesh_path_flush_by_nexthop(struct s
-       struct mesh_table *tbl;
-       struct mesh_path *mpath;
-       struct mpath_node *node;
--      struct hlist_node *p;
-       int i;
-       rcu_read_lock();
-       read_lock_bh(&pathtbl_resize_lock);
-       tbl = resize_dereference_mesh_paths();
--      for_each_mesh_entry(tbl, p, node, i) {
-+      for_each_mesh_entry(tbl, node, i) {
-               mpath = node->mpath;
-               if (rcu_dereference(mpath->next_hop) == sta) {
-                       spin_lock(&tbl->hashwlock[i]);
-@@ -815,11 +808,9 @@ static void table_flush_by_iface(struct
- {
-       struct mesh_path *mpath;
-       struct mpath_node *node;
--      struct hlist_node *p;
-       int i;
--      WARN_ON(!rcu_read_lock_held());
--      for_each_mesh_entry(tbl, p, node, i) {
-+      for_each_mesh_entry(tbl, node, i) {
-               mpath = node->mpath;
-               if (mpath->sdata != sdata)
-                       continue;
-@@ -865,7 +856,6 @@ int mesh_path_del(struct ieee80211_sub_i
-       struct mesh_path *mpath;
-       struct mpath_node *node;
-       struct hlist_head *bucket;
--      struct hlist_node *n;
-       int hash_idx;
-       int err = 0;
-@@ -875,7 +865,7 @@ int mesh_path_del(struct ieee80211_sub_i
-       bucket = &tbl->hash_buckets[hash_idx];
-       spin_lock(&tbl->hashwlock[hash_idx]);
--      hlist_for_each_entry(node, n, bucket, list) {
-+      hlist_for_each_entry(node, bucket, list) {
-               mpath = node->mpath;
-               if (mpath->sdata == sdata &&
-                   ether_addr_equal(addr, mpath->dst)) {
-@@ -920,7 +910,6 @@ void mesh_path_tx_pending(struct mesh_pa
- int mesh_path_send_to_gates(struct mesh_path *mpath)
- {
-       struct ieee80211_sub_if_data *sdata = mpath->sdata;
--      struct hlist_node *n;
-       struct mesh_table *tbl;
-       struct mesh_path *from_mpath = mpath;
-       struct mpath_node *gate = NULL;
-@@ -935,7 +924,7 @@ int mesh_path_send_to_gates(struct mesh_
-       if (!known_gates)
-               return -EHOSTUNREACH;
--      hlist_for_each_entry_rcu(gate, n, known_gates, list) {
-+      hlist_for_each_entry_rcu(gate, known_gates, list) {
-               if (gate->mpath->sdata != sdata)
-                       continue;
-@@ -951,7 +940,7 @@ int mesh_path_send_to_gates(struct mesh_
-               }
-       }
--      hlist_for_each_entry_rcu(gate, n, known_gates, list)
-+      hlist_for_each_entry_rcu(gate, known_gates, list)
-               if (gate->mpath->sdata == sdata) {
-                       mpath_dbg(sdata, "Sending to %pM\n", gate->mpath->dst);
-                       mesh_path_tx_pending(gate->mpath);
-@@ -1096,12 +1085,11 @@ void mesh_path_expire(struct ieee80211_s
-       struct mesh_table *tbl;
-       struct mesh_path *mpath;
-       struct mpath_node *node;
--      struct hlist_node *p;
-       int i;
-       rcu_read_lock();
-       tbl = rcu_dereference(mesh_paths);
--      for_each_mesh_entry(tbl, p, node, i) {
-+      for_each_mesh_entry(tbl, node, i) {
-               if (node->mpath->sdata != sdata)
-                       continue;
-               mpath = node->mpath;
index 9714696..92c1909 100644 (file)
@@ -1,6 +1,6 @@
 --- a/net/mac80211/main.c
 +++ b/net/mac80211/main.c
-@@ -313,7 +313,7 @@ void ieee80211_restart_hw(struct ieee802
+@@ -300,7 +300,7 @@ void ieee80211_restart_hw(struct ieee802
  }
  EXPORT_SYMBOL(ieee80211_restart_hw);
  
@@ -9,7 +9,7 @@
  static int ieee80211_ifa_changed(struct notifier_block *nb,
                                 unsigned long data, void *arg)
  {
-@@ -372,7 +372,7 @@ static int ieee80211_ifa_changed(struct
+@@ -359,7 +359,7 @@ static int ieee80211_ifa_changed(struct 
  }
  #endif
  
@@ -18,7 +18,7 @@
  static int ieee80211_ifa6_changed(struct notifier_block *nb,
                                  unsigned long data, void *arg)
  {
-@@ -1015,14 +1015,14 @@ int ieee80211_register_hw(struct ieee802
+@@ -990,14 +990,14 @@ int ieee80211_register_hw(struct ieee802
                goto fail_pm_qos;
        }
  
@@ -35,7 +35,7 @@
        local->ifa6_notifier.notifier_call = ieee80211_ifa6_changed;
        result = register_inet6addr_notifier(&local->ifa6_notifier);
        if (result)
-@@ -1034,13 +1034,13 @@ int ieee80211_register_hw(struct ieee802
+@@ -1006,13 +1006,13 @@ int ieee80211_register_hw(struct ieee802
  
        return 0;
  
@@ -52,7 +52,7 @@
   fail_ifa:
        pm_qos_remove_notifier(PM_QOS_NETWORK_LATENCY,
                               &local->network_latency_notifier);
-@@ -1073,10 +1073,10 @@ void ieee80211_unregister_hw(struct ieee
+@@ -1045,10 +1045,10 @@ void ieee80211_unregister_hw(struct ieee
  
        pm_qos_remove_notifier(PM_QOS_NETWORK_LATENCY,
                               &local->network_latency_notifier);
index 9e08a08..d9672d4 100644 (file)
@@ -1,6 +1,6 @@
 --- a/drivers/net/wireless/ath/ath5k/initvals.c
 +++ b/drivers/net/wireless/ath/ath5k/initvals.c
-@@ -65,8 +65,14 @@ static const struct ath5k_ini ar5210_ini
+@@ -62,8 +62,14 @@ static const struct ath5k_ini ar5210_ini
        { AR5K_IMR,             0 },
        { AR5K_IER,             AR5K_IER_DISABLE },
        { AR5K_BSR,             0, AR5K_INI_READ },
@@ -17,7 +17,7 @@
        { AR5K_RXNOFRM,         8 },
 --- a/drivers/net/wireless/ath/ath5k/dma.c
 +++ b/drivers/net/wireless/ath/ath5k/dma.c
-@@ -863,10 +863,18 @@ ath5k_hw_dma_init(struct ath5k_hw *ah)
+@@ -860,10 +860,18 @@ ath5k_hw_dma_init(struct ath5k_hw *ah)
         * guess we can tweak it and see how it goes ;-)
         */
        if (ah->ah_version != AR5K_AR5210) {
index d3867c4..b35f5c6 100644 (file)
@@ -1,114 +1,3 @@
---- a/drivers/net/wireless/ath/ath9k/common.h
-+++ b/drivers/net/wireless/ath/ath9k/common.h
-@@ -27,7 +27,7 @@
- #define WME_MAX_BA              WME_BA_BMP_SIZE
- #define ATH_TID_MAX_BUFS        (2 * WME_MAX_BA)
--#define ATH_RSSI_DUMMY_MARKER   0x127
-+#define ATH_RSSI_DUMMY_MARKER   127
- #define ATH_RSSI_LPF_LEN              10
- #define RSSI_LPF_THRESHOLD            -20
- #define ATH_RSSI_EP_MULTIPLIER     (1<<7)
---- a/drivers/net/wireless/ath/ath9k/htc_drv_txrx.c
-+++ b/drivers/net/wireless/ath/ath9k/htc_drv_txrx.c
-@@ -1067,15 +1067,19 @@ static bool ath9k_rx_prepare(struct ath9
-       last_rssi = priv->rx.last_rssi;
--      if (likely(last_rssi != ATH_RSSI_DUMMY_MARKER))
--              rxbuf->rxstatus.rs_rssi = ATH_EP_RND(last_rssi,
--                                                   ATH_RSSI_EP_MULTIPLIER);
-+      if (ieee80211_is_beacon(hdr->frame_control) &&
-+          !is_zero_ether_addr(common->curbssid) &&
-+          ether_addr_equal(hdr->addr3, common->curbssid)) {
-+              s8 rssi = rxbuf->rxstatus.rs_rssi;
--      if (rxbuf->rxstatus.rs_rssi < 0)
--              rxbuf->rxstatus.rs_rssi = 0;
-+              if (likely(last_rssi != ATH_RSSI_DUMMY_MARKER))
-+                      rssi = ATH_EP_RND(last_rssi, ATH_RSSI_EP_MULTIPLIER);
--      if (ieee80211_is_beacon(fc))
--              priv->ah->stats.avgbrssi = rxbuf->rxstatus.rs_rssi;
-+              if (rssi < 0)
-+                      rssi = 0;
-+
-+              priv->ah->stats.avgbrssi = rssi;
-+      }
-       rx_status->mactime = be64_to_cpu(rxbuf->rxstatus.rs_tstamp);
-       rx_status->band = hw->conf.channel->band;
---- a/include/linux/ieee80211.h
-+++ b/include/linux/ieee80211.h
-@@ -185,7 +185,7 @@ struct ieee80211_hdr {
-       u8 addr3[6];
-       __le16 seq_ctrl;
-       u8 addr4[6];
--} __packed;
-+} __packed __aligned(2);
- struct ieee80211_hdr_3addr {
-       __le16 frame_control;
-@@ -194,7 +194,7 @@ struct ieee80211_hdr_3addr {
-       u8 addr2[6];
-       u8 addr3[6];
-       __le16 seq_ctrl;
--} __packed;
-+} __packed __aligned(2);
- struct ieee80211_qos_hdr {
-       __le16 frame_control;
-@@ -204,7 +204,7 @@ struct ieee80211_qos_hdr {
-       u8 addr3[6];
-       __le16 seq_ctrl;
-       __le16 qos_ctrl;
--} __packed;
-+} __packed __aligned(2);
- /**
-  * ieee80211_has_tods - check if IEEE80211_FCTL_TODS is set
-@@ -581,7 +581,7 @@ struct ieee80211s_hdr {
-       __le32 seqnum;
-       u8 eaddr1[6];
-       u8 eaddr2[6];
--} __packed;
-+} __packed __aligned(2);
- /* Mesh flags */
- #define MESH_FLAGS_AE_A4      0x1
-@@ -875,7 +875,7 @@ struct ieee80211_mgmt {
-                       } u;
-               } __packed action;
-       } u;
--} __packed;
-+} __packed __aligned(2);
- /* Supported Rates value encodings in 802.11n-2009 7.3.2.2 */
- #define BSS_MEMBERSHIP_SELECTOR_HT_PHY        127
-@@ -906,20 +906,20 @@ struct ieee80211_rts {
-       __le16 duration;
-       u8 ra[6];
-       u8 ta[6];
--} __packed;
-+} __packed __aligned(2);
- struct ieee80211_cts {
-       __le16 frame_control;
-       __le16 duration;
-       u8 ra[6];
--} __packed;
-+} __packed __aligned(2);
- struct ieee80211_pspoll {
-       __le16 frame_control;
-       __le16 aid;
-       u8 bssid[6];
-       u8 ta[6];
--} __packed;
-+} __packed __aligned(2);
- /* TDLS */
 --- a/net/mac80211/agg-rx.c
 +++ b/net/mac80211/agg-rx.c
 @@ -204,6 +204,8 @@ static void ieee80211_send_addba_resp(st
  
 --- a/net/mac80211/debugfs_sta.c
 +++ b/net/mac80211/debugfs_sta.c
-@@ -65,11 +65,11 @@ static ssize_t sta_flags_read(struct fil
+@@ -66,11 +66,11 @@ static ssize_t sta_flags_read(struct fil
        test_sta_flag(sta, WLAN_STA_##flg) ? #flg "\n" : ""
  
        int res = scnprintf(buf, sizeof(buf),
                            TEST(TDLS_PEER_AUTH), TEST(4ADDR_EVENT),
 --- a/net/mac80211/iface.c
 +++ b/net/mac80211/iface.c
-@@ -78,7 +78,7 @@ void ieee80211_recalc_txpower(struct iee
-               ieee80211_bss_info_change_notify(sdata, BSS_CHANGED_TXPOWER);
- }
--static u32 ieee80211_idle_off(struct ieee80211_local *local)
-+u32 ieee80211_idle_off(struct ieee80211_local *local)
- {
-       if (!(local->hw.conf.flags & IEEE80211_CONF_IDLE))
-               return 0;
-@@ -107,7 +107,7 @@ void ieee80211_recalc_idle(struct ieee80
-       lockdep_assert_held(&local->mtx);
--      active = !list_empty(&local->chanctx_list);
-+      active = !list_empty(&local->chanctx_list) || local->monitors;
-       if (!local->ops->remain_on_channel) {
-               list_for_each_entry(roc, &local->roc_list, list) {
-@@ -436,7 +436,6 @@ int ieee80211_do_open(struct wireless_de
+@@ -463,7 +463,6 @@ int ieee80211_do_open(struct wireless_de
        struct ieee80211_sub_if_data *sdata = IEEE80211_WDEV_TO_SUB_IF(wdev);
        struct net_device *dev = wdev->netdev;
        struct ieee80211_local *local = sdata->local;
        u32 changed = 0;
        int res;
        u32 hw_reconf_flags = 0;
-@@ -541,6 +540,9 @@ int ieee80211_do_open(struct wireless_de
-               ieee80211_adjust_monitor_flags(sdata, 1);
-               ieee80211_configure_filter(local);
-+              mutex_lock(&local->mtx);
-+              ieee80211_recalc_idle(local);
-+              mutex_unlock(&local->mtx);
-               netif_carrier_on(dev);
-               break;
-@@ -595,30 +597,8 @@ int ieee80211_do_open(struct wireless_de
+@@ -629,30 +628,8 @@ int ieee80211_do_open(struct wireless_de
  
        set_bit(SDATA_STATE_RUNNING, &sdata->state);
  
  
        /*
         * set_multicast_list will be invoked by the networking core
-@@ -817,6 +797,9 @@ static void ieee80211_do_stop(struct iee
-               ieee80211_adjust_monitor_flags(sdata, -1);
-               ieee80211_configure_filter(local);
-+              mutex_lock(&local->mtx);
-+              ieee80211_recalc_idle(local);
-+              mutex_unlock(&local->mtx);
-               break;
-       case NL80211_IFTYPE_P2P_DEVICE:
-               /* relies on synchronize_rcu() below */
-@@ -1022,6 +1005,72 @@ static void ieee80211_if_setup(struct ne
+@@ -1116,6 +1093,74 @@ static void ieee80211_if_setup(struct ne
        dev->destructor = free_netdev;
  }
  
 +      u32 rates = 0;
 +      u16 stype;
 +      bool new = false;
-+      enum ieee80211_band band = local->hw.conf.channel->band;
-+      struct ieee80211_supported_band *sband = local->hw.wiphy->bands[band];
++      enum ieee80211_band band;
++      struct ieee80211_supported_band *sband;
 +
 +      rx_status = IEEE80211_SKB_RXCB(skb);
++      band = rx_status->band;
++      sband = local->hw.wiphy->bands[band];
 +      mgmt = (struct ieee80211_mgmt *) skb->data;
 +      stype = le16_to_cpu(mgmt->frame_control) & IEEE80211_FCTL_STYPE;
 +
 +              return;
 +
 +      ieee802_11_parse_elems(mgmt->u.probe_resp.variable,
-+                             skb->len - baselen, &elems);
++                             skb->len - baselen, false, &elems);
 +
 +      rates = ieee80211_sta_get_rates(local, &elems, band, NULL);
 +
 +      }
 +
 +      sta->last_rx = jiffies;
-+      sta->sta.supp_rates[local->hw.conf.channel->band] = rates;
++      sta->sta.supp_rates[band] = rates;
 +
 +      if (elems.ht_cap_elem)
 +              ieee80211_ht_cap_ie_to_sta_ht_cap(sdata, sband,
  static void ieee80211_iface_work(struct work_struct *work)
  {
        struct ieee80211_sub_if_data *sdata =
-@@ -1126,6 +1175,9 @@ static void ieee80211_iface_work(struct 
+@@ -1220,6 +1265,9 @@ static void ieee80211_iface_work(struct 
                                break;
                        ieee80211_mesh_rx_queued_mgmt(sdata, skb);
                        break;
                default:
                        WARN(1, "frame for unexpected interface type");
                        break;
+--- a/net/mac80211/rc80211_minstrel_ht.c
++++ b/net/mac80211/rc80211_minstrel_ht.c
+@@ -804,10 +804,18 @@ minstrel_ht_get_rate(void *priv, struct 
+       sample_group = &minstrel_mcs_groups[sample_idx / MCS_GROUP_RATES];
+       info->flags |= IEEE80211_TX_CTL_RATE_CTRL_PROBE;
++      rate->count = 1;
++
++      if (sample_idx / MCS_GROUP_RATES == MINSTREL_CCK_GROUP) {
++              int idx = sample_idx % ARRAY_SIZE(mp->cck_rates);
++              rate->idx = mp->cck_rates[idx];
++              rate->flags = 0;
++              return;
++      }
++
+       rate->idx = sample_idx % MCS_GROUP_RATES +
+                   (sample_group->streams - 1) * MCS_GROUP_RATES;
+       rate->flags = IEEE80211_TX_RC_MCS | sample_group->flags;
+-      rate->count = 1;
+ }
+ static void
 --- a/net/mac80211/rx.c
 +++ b/net/mac80211/rx.c
-@@ -2365,6 +2365,7 @@ ieee80211_rx_h_action(struct ieee80211_r
+@@ -936,8 +936,14 @@ ieee80211_rx_h_check(struct ieee80211_rx
+       struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)rx->skb->data;
+       struct ieee80211_rx_status *status = IEEE80211_SKB_RXCB(rx->skb);
+-      /* Drop duplicate 802.11 retransmissions (IEEE 802.11 Chap. 9.2.9) */
+-      if (rx->sta && !is_multicast_ether_addr(hdr->addr1)) {
++      /*
++       * Drop duplicate 802.11 retransmissions
++       * (IEEE 802.11-2012: 9.3.2.10 "Duplicate detection and recovery")
++       */
++      if (rx->skb->len >= 24 && rx->sta &&
++          !ieee80211_is_ctl(hdr->frame_control) &&
++          !ieee80211_is_qos_nullfunc(hdr->frame_control) &&
++          !is_multicast_ether_addr(hdr->addr1)) {
+               if (unlikely(ieee80211_has_retry(hdr->frame_control) &&
+                            rx->sta->last_seq_ctrl[rx->seqno_idx] ==
+                            hdr->seq_ctrl)) {
+@@ -2369,6 +2375,7 @@ ieee80211_rx_h_action(struct ieee80211_r
                    sdata->vif.type != NL80211_IFTYPE_MESH_POINT &&
                    sdata->vif.type != NL80211_IFTYPE_AP_VLAN &&
                    sdata->vif.type != NL80211_IFTYPE_AP &&
                    sdata->vif.type != NL80211_IFTYPE_ADHOC)
                        break;
  
-@@ -2692,14 +2693,15 @@ ieee80211_rx_h_mgmt(struct ieee80211_rx_
+@@ -2720,14 +2727,15 @@ ieee80211_rx_h_mgmt(struct ieee80211_rx_
  
        if (!ieee80211_vif_is_mesh(&sdata->vif) &&
            sdata->vif.type != NL80211_IFTYPE_ADHOC &&
                break;
        case cpu_to_le16(IEEE80211_STYPE_ASSOC_RESP):
        case cpu_to_le16(IEEE80211_STYPE_REASSOC_RESP):
-@@ -3028,10 +3030,16 @@ static int prepare_for_handlers(struct i
+@@ -3059,10 +3067,16 @@ static int prepare_for_handlers(struct i
                }
                break;
        case NL80211_IFTYPE_WDS:
        WLAN_STA_CLEAR_PS_FILT,
        WLAN_STA_MFP,
        WLAN_STA_BLOCK_BA,
---- a/net/mac80211/tx.c
-+++ b/net/mac80211/tx.c
-@@ -1231,34 +1231,40 @@ static bool ieee80211_tx_frags(struct ie
-               if (local->queue_stop_reasons[q] ||
-                   (!txpending && !skb_queue_empty(&local->pending[q]))) {
-                       if (unlikely(info->flags &
--                                      IEEE80211_TX_INTFL_OFFCHAN_TX_OK &&
--                                   local->queue_stop_reasons[q] &
--                                      ~BIT(IEEE80211_QUEUE_STOP_REASON_OFFCHANNEL))) {
-+                                   IEEE80211_TX_INTFL_OFFCHAN_TX_OK)) {
-+                              if (local->queue_stop_reasons[q] &
-+                                  ~BIT(IEEE80211_QUEUE_STOP_REASON_OFFCHANNEL)) {
-+                                      /*
-+                                       * Drop off-channel frames if queues
-+                                       * are stopped for any reason other
-+                                       * than off-channel operation. Never
-+                                       * queue them.
-+                                       */
-+                                      spin_unlock_irqrestore(
-+                                              &local->queue_stop_reason_lock,
-+                                              flags);
-+                                      ieee80211_purge_tx_queue(&local->hw,
-+                                                               skbs);
-+                                      return true;
-+                              }
-+                      } else {
+--- a/drivers/net/wireless/ath/ath9k/xmit.c
++++ b/drivers/net/wireless/ath/ath9k/xmit.c
+@@ -146,6 +146,28 @@ static void ath_set_rates(struct ieee802
+                              ARRAY_SIZE(bf->rates));
+ }
++static void ath_txq_skb_done(struct ath_softc *sc, struct ath_txq *txq,
++                           struct sk_buff *skb)
++{
++      int q;
 +
-                               /*
--                               * Drop off-channel frames if queues are stopped
--                               * for any reason other than off-channel
--                               * operation. Never queue them.
-+                               * Since queue is stopped, queue up frames for
-+                               * later transmission from the tx-pending
-+                               * tasklet when the queue is woken again.
-                                */
--                              spin_unlock_irqrestore(
--                                      &local->queue_stop_reason_lock, flags);
--                              ieee80211_purge_tx_queue(&local->hw, skbs);
--                              return true;
-+                              if (txpending)
-+                                      skb_queue_splice_init(skbs,
-+                                                            &local->pending[q]);
-+                              else
-+                                      skb_queue_splice_tail_init(skbs,
-+                                                                 &local->pending[q]);
++      q = skb_get_queue_mapping(skb);
++      if (txq == sc->tx.uapsdq)
++              txq = sc->tx.txq_map[q];
 +
-+                              spin_unlock_irqrestore(&local->queue_stop_reason_lock,
-+                                                     flags);
-+                              return false;
-                       }
--
--                      /*
--                       * Since queue is stopped, queue up frames for later
--                       * transmission from the tx-pending tasklet when the
--                       * queue is woken again.
--                       */
--                      if (txpending)
--                              skb_queue_splice_init(skbs, &local->pending[q]);
--                      else
--                              skb_queue_splice_tail_init(skbs,
--                                                         &local->pending[q]);
--
--                      spin_unlock_irqrestore(&local->queue_stop_reason_lock,
--                                             flags);
--                      return false;
-               }
-               spin_unlock_irqrestore(&local->queue_stop_reason_lock, flags);
-@@ -1848,9 +1854,24 @@ netdev_tx_t ieee80211_subif_start_xmit(s
-               }
-               if (!is_multicast_ether_addr(skb->data)) {
-+                      struct sta_info *next_hop;
-+                      bool mpp_lookup = true;
++      if (txq != sc->tx.txq_map[q])
++              return;
 +
-                       mpath = mesh_path_lookup(sdata, skb->data);
--                      if (!mpath)
-+                      if (mpath) {
-+                              mpp_lookup = false;
-+                              next_hop = rcu_dereference(mpath->next_hop);
-+                              if (!next_hop ||
-+                                  !(mpath->flags & (MESH_PATH_ACTIVE |
-+                                                    MESH_PATH_RESOLVING)))
-+                                      mpp_lookup = true;
-+                      }
++      if (WARN_ON(--txq->pending_frames < 0))
++              txq->pending_frames = 0;
 +
-+                      if (mpp_lookup)
-                               mppath = mpp_path_lookup(sdata, skb->data);
++      if (txq->stopped &&
++          txq->pending_frames < sc->tx.txq_max_pending[q]) {
++              ieee80211_wake_queue(sc->hw, q);
++              txq->stopped = false;
++      }
++}
 +
-+                      if (mppath && mpath)
-+                              mesh_path_del(mpath->sdata, mpath->dst);
-               }
-               /*
---- a/net/wireless/nl80211.c
-+++ b/net/wireless/nl80211.c
-@@ -554,16 +554,9 @@ static int nl80211_msg_put_channel(struc
-       if ((chan->flags & IEEE80211_CHAN_NO_IBSS) &&
-           nla_put_flag(msg, NL80211_FREQUENCY_ATTR_NO_IBSS))
-               goto nla_put_failure;
--      if (chan->flags & IEEE80211_CHAN_RADAR) {
--              u32 time = elapsed_jiffies_msecs(chan->dfs_state_entered);
--              if (nla_put_flag(msg, NL80211_FREQUENCY_ATTR_RADAR))
--                      goto nla_put_failure;
--              if (nla_put_u32(msg, NL80211_FREQUENCY_ATTR_DFS_STATE,
--                              chan->dfs_state))
--                      goto nla_put_failure;
--              if (nla_put_u32(msg, NL80211_FREQUENCY_ATTR_DFS_TIME, time))
--                      goto nla_put_failure;
--      }
-+      if ((chan->flags & IEEE80211_CHAN_RADAR) &&
-+          nla_put_flag(msg, NL80211_FREQUENCY_ATTR_RADAR))
-+              goto nla_put_failure;
-       if ((chan->flags & IEEE80211_CHAN_NO_HT40MINUS) &&
-           nla_put_flag(msg, NL80211_FREQUENCY_ATTR_NO_HT40_MINUS))
-               goto nla_put_failure;
-@@ -900,9 +893,6 @@ static int nl80211_put_iface_combination
-                   nla_put_u32(msg, NL80211_IFACE_COMB_MAXNUM,
-                               c->max_interfaces))
-                       goto nla_put_failure;
--              if (nla_put_u32(msg, NL80211_IFACE_COMB_RADAR_DETECT_WIDTHS,
--                              c->radar_detect_widths))
--                      goto nla_put_failure;
-               nla_nest_end(msg, nl_combi);
-       }
-@@ -914,48 +904,6 @@ nla_put_failure:
-       return -ENOBUFS;
- }
--#ifdef CONFIG_PM
--static int nl80211_send_wowlan_tcp_caps(struct cfg80211_registered_device *rdev,
--                                      struct sk_buff *msg)
--{
--      const struct wiphy_wowlan_tcp_support *tcp = rdev->wiphy.wowlan.tcp;
--      struct nlattr *nl_tcp;
--
--      if (!tcp)
--              return 0;
--
--      nl_tcp = nla_nest_start(msg, NL80211_WOWLAN_TRIG_TCP_CONNECTION);
--      if (!nl_tcp)
--              return -ENOBUFS;
--
--      if (nla_put_u32(msg, NL80211_WOWLAN_TCP_DATA_PAYLOAD,
--                      tcp->data_payload_max))
--              return -ENOBUFS;
--
--      if (nla_put_u32(msg, NL80211_WOWLAN_TCP_DATA_PAYLOAD,
--                      tcp->data_payload_max))
--              return -ENOBUFS;
--
--      if (tcp->seq && nla_put_flag(msg, NL80211_WOWLAN_TCP_DATA_PAYLOAD_SEQ))
--              return -ENOBUFS;
--
--      if (tcp->tok && nla_put(msg, NL80211_WOWLAN_TCP_DATA_PAYLOAD_TOKEN,
--                              sizeof(*tcp->tok), tcp->tok))
--              return -ENOBUFS;
--
--      if (nla_put_u32(msg, NL80211_WOWLAN_TCP_DATA_INTERVAL,
--                      tcp->data_interval_max))
--              return -ENOBUFS;
--
--      if (nla_put_u32(msg, NL80211_WOWLAN_TCP_WAKE_PAYLOAD,
--                      tcp->wake_payload_max))
--              return -ENOBUFS;
--
--      nla_nest_end(msg, nl_tcp);
--      return 0;
--}
--#endif
--
- static int nl80211_send_wiphy(struct sk_buff *msg, u32 portid, u32 seq, int flags,
-                             struct cfg80211_registered_device *dev)
+ static void ath_tx_flush_tid(struct ath_softc *sc, struct ath_atx_tid *tid)
  {
-@@ -1330,9 +1278,6 @@ static int nl80211_send_wiphy(struct sk_
-                               goto nla_put_failure;
+       struct ath_txq *txq = tid->ac->txq;
+@@ -167,6 +189,7 @@ static void ath_tx_flush_tid(struct ath_
+               if (!bf) {
+                       bf = ath_tx_setup_buffer(sc, txq, tid, skb);
+                       if (!bf) {
++                              ath_txq_skb_done(sc, txq, skb);
+                               ieee80211_free_txskb(sc->hw, skb);
+                               continue;
+                       }
+@@ -811,6 +834,7 @@ ath_tx_get_tid_subframe(struct ath_softc
+               if (!bf) {
+                       __skb_unlink(skb, &tid->buf_q);
++                      ath_txq_skb_done(sc, txq, skb);
+                       ieee80211_free_txskb(sc->hw, skb);
+                       continue;
                }
+@@ -1824,6 +1848,7 @@ static void ath_tx_send_ampdu(struct ath
  
--              if (nl80211_send_wowlan_tcp_caps(dev, msg))
--                      goto nla_put_failure;
--
-               nla_nest_end(msg, nl_wowlan);
+       bf = ath_tx_setup_buffer(sc, txq, tid, skb);
+       if (!bf) {
++              ath_txq_skb_done(sc, txq, skb);
+               ieee80211_free_txskb(sc->hw, skb);
+               return;
        }
- #endif
---- a/net/mac80211/cfg.c
-+++ b/net/mac80211/cfg.c
-@@ -3285,13 +3285,19 @@ static int ieee80211_cfg_get_channel(str
-                                    struct cfg80211_chan_def *chandef)
- {
-       struct ieee80211_sub_if_data *sdata = IEEE80211_WDEV_TO_SUB_IF(wdev);
-+      struct ieee80211_local *local = wiphy_priv(wiphy);
-       struct ieee80211_chanctx_conf *chanctx_conf;
-       int ret = -ENODATA;
+@@ -2090,6 +2115,7 @@ int ath_tx_start(struct ieee80211_hw *hw
  
-       rcu_read_lock();
--      chanctx_conf = rcu_dereference(sdata->vif.chanctx_conf);
--      if (chanctx_conf) {
--              *chandef = chanctx_conf->def;
-+      if (local->use_chanctx) {
-+              chanctx_conf = rcu_dereference(sdata->vif.chanctx_conf);
-+              if (chanctx_conf) {
-+                      *chandef = chanctx_conf->def;
-+                      ret = 0;
-+              }
-+      } else if (local->open_count == local->monitors) {
-+              *chandef = local->monitor_chandef;
-               ret = 0;
-       }
-       rcu_read_unlock();
---- a/drivers/net/wireless/ath/ath9k/hw.c
-+++ b/drivers/net/wireless/ath/ath9k/hw.c
-@@ -1463,7 +1463,9 @@ static bool ath9k_hw_chip_reset(struct a
-                       reset_type = ATH9K_RESET_POWER_ON;
+       bf = ath_tx_setup_buffer(sc, txq, tid, skb);
+       if (!bf) {
++              ath_txq_skb_done(sc, txq, skb);
+               if (txctl->paprd)
+                       dev_kfree_skb_any(skb);
                else
-                       reset_type = ATH9K_RESET_COLD;
--      }
-+      } else if (ah->chip_fullsleep || REG_READ(ah, AR_Q_TXE) ||
-+                 (REG_READ(ah, AR_CR) & AR_CR_RXE))
-+              reset_type = ATH9K_RESET_COLD;
-       if (!ath9k_hw_set_reset_reg(ah, reset_type))
-               return false;
-@@ -1876,13 +1878,12 @@ int ath9k_hw_reset(struct ath_hw *ah, st
-       ENABLE_REGWRITE_BUFFER(ah);
--      REG_WRITE(ah, AR_STA_ID0, get_unaligned_le32(common->macaddr));
--      REG_WRITE(ah, AR_STA_ID1, get_unaligned_le16(common->macaddr + 4)
--                | macStaId1
-+      REG_RMW(ah, AR_STA_ID1, macStaId1
-                 | AR_STA_ID1_RTS_USE_DEF
-                 | (ah->config.
-                    ack_6mb ? AR_STA_ID1_ACKCTS_6MB : 0)
--                | ah->sta_id1_defaults);
-+                | ah->sta_id1_defaults,
-+                ~AR_STA_ID1_SADH_MASK);
-       ath_hw_setbssidmask(common);
-       REG_WRITE(ah, AR_DEF_ANTENNA, saveDefAntenna);
-       ath9k_hw_write_associd(ah);
---- a/drivers/net/wireless/rt2x00/rt2x00dev.c
-+++ b/drivers/net/wireless/rt2x00/rt2x00dev.c
-@@ -1236,8 +1236,10 @@ static inline void rt2x00lib_set_if_comb
-        */
-       if_limit = &rt2x00dev->if_limits_ap;
-       if_limit->max = rt2x00dev->ops->max_ap_intf;
--      if_limit->types = BIT(NL80211_IFTYPE_AP) |
--                      BIT(NL80211_IFTYPE_MESH_POINT);
-+      if_limit->types = BIT(NL80211_IFTYPE_AP);
-+#ifdef CONFIG_MAC80211_MESH
-+      if_limit->types |= BIT(NL80211_IFTYPE_MESH_POINT);
-+#endif
-       /*
-        * Build up AP interface combinations structure.
-@@ -1309,7 +1311,9 @@ int rt2x00lib_probe_dev(struct rt2x00_de
-               rt2x00dev->hw->wiphy->interface_modes |=
-                   BIT(NL80211_IFTYPE_ADHOC) |
-                   BIT(NL80211_IFTYPE_AP) |
-+#ifdef CONFIG_MAC80211_MESH
-                   BIT(NL80211_IFTYPE_MESH_POINT) |
-+#endif
-                   BIT(NL80211_IFTYPE_WDS);
-       rt2x00dev->hw->wiphy->flags |= WIPHY_FLAG_IBSS_RSN;
---- a/net/mac80211/rc80211_minstrel_ht.c
-+++ b/net/mac80211/rc80211_minstrel_ht.c
-@@ -17,8 +17,6 @@
- #include "rc80211_minstrel_ht.h"
- #define AVG_PKT_SIZE  1200
--#define SAMPLE_COLUMNS        10
--#define EWMA_LEVEL            75
- /* Number of bits for an average sized packet */
- #define MCS_NBITS (AVG_PKT_SIZE << 3)
-@@ -26,11 +24,11 @@
- /* Number of symbols for a packet with (bps) bits per symbol */
- #define MCS_NSYMS(bps) ((MCS_NBITS + (bps) - 1) / (bps))
+@@ -2189,7 +2215,7 @@ static void ath_tx_complete(struct ath_s
+       struct ieee80211_tx_info *tx_info = IEEE80211_SKB_CB(skb);
+       struct ath_common *common = ath9k_hw_common(sc->sc_ah);
+       struct ieee80211_hdr * hdr = (struct ieee80211_hdr *)skb->data;
+-      int q, padpos, padsize;
++      int padpos, padsize;
+       unsigned long flags;
  
--/* Transmission time for a packet containing (syms) symbols */
-+/* Transmission time (nanoseconds) for a packet containing (syms) symbols */
- #define MCS_SYMBOL_TIME(sgi, syms)                                    \
-       (sgi ?                                                          \
--        ((syms) * 18 + 4) / 5 :       /* syms * 3.6 us */             \
--        (syms) << 2                   /* syms * 4 us */               \
-+        ((syms) * 18000 + 4000) / 5 : /* syms * 3.6 us */             \
-+        ((syms) * 1000) << 2          /* syms * 4 us */               \
-       )
+       ath_dbg(common, XMIT, "TX complete: skb: %p\n", skb);
+@@ -2225,21 +2251,7 @@ static void ath_tx_complete(struct ath_s
+       spin_unlock_irqrestore(&sc->sc_pm_lock, flags);
  
- /* Transmit duration for the raw data part of an average sized packet */
-@@ -64,9 +62,9 @@
+       __skb_queue_tail(&txq->complete_q, skb);
+-
+-      q = skb_get_queue_mapping(skb);
+-      if (txq == sc->tx.uapsdq)
+-              txq = sc->tx.txq_map[q];
+-
+-      if (txq == sc->tx.txq_map[q]) {
+-              if (WARN_ON(--txq->pending_frames < 0))
+-                      txq->pending_frames = 0;
+-
+-              if (txq->stopped &&
+-                  txq->pending_frames < sc->tx.txq_max_pending[q]) {
+-                      ieee80211_wake_queue(sc->hw, q);
+-                      txq->stopped = false;
+-              }
+-      }
++      ath_txq_skb_done(sc, txq, skb);
  }
  
- #define CCK_DURATION(_bitrate, _short, _len)          \
--      (10 /* SIFS */ +                                \
-+      (1000 * (10 /* SIFS */ +                        \
-        (_short ? 72 + 24 : 144 + 48 ) +               \
--       (8 * (_len + 4) * 10) / (_bitrate))
-+       (8 * (_len + 4) * 10) / (_bitrate)))
- #define CCK_ACK_DURATION(_bitrate, _short)                    \
-       (CCK_DURATION((_bitrate > 10 ? 20 : 10), false, 60) +   \
-@@ -129,15 +127,6 @@ const struct mcs_group minstrel_mcs_grou
- static u8 sample_table[SAMPLE_COLUMNS][MCS_GROUP_RATES];
+ static void ath_tx_complete_buf(struct ath_softc *sc, struct ath_buf *bf,
+--- a/drivers/net/wireless/ath/ath9k/main.c
++++ b/drivers/net/wireless/ath/ath9k/main.c
+@@ -2094,7 +2094,7 @@ static void ath9k_wow_add_pattern(struct
+ {
+       struct ath_hw *ah = sc->sc_ah;
+       struct ath9k_wow_pattern *wow_pattern = NULL;
+-      struct cfg80211_wowlan_trig_pkt_pattern *patterns = wowlan->patterns;
++      struct cfg80211_pkt_pattern *patterns = wowlan->patterns;
+       int mask_len;
+       s8 i = 0;
+--- a/drivers/net/wireless/mwifiex/cfg80211.c
++++ b/drivers/net/wireless/mwifiex/cfg80211.c
+@@ -2298,8 +2298,7 @@ EXPORT_SYMBOL_GPL(mwifiex_del_virtual_in
+ #ifdef CONFIG_PM
+ static bool
+-mwifiex_is_pattern_supported(struct cfg80211_wowlan_trig_pkt_pattern *pat,
+-                           s8 *byte_seq)
++mwifiex_is_pattern_supported(struct cfg80211_pkt_pattern *pat, s8 *byte_seq)
+ {
+       int j, k, valid_byte_cnt = 0;
+       bool dont_care_byte = false;
+--- a/drivers/net/wireless/ti/wlcore/main.c
++++ b/drivers/net/wireless/ti/wlcore/main.c
+@@ -1315,7 +1315,7 @@ static struct sk_buff *wl12xx_alloc_dumm
  
- /*
-- * Perform EWMA (Exponentially Weighted Moving Average) calculation
-- */
--static int
--minstrel_ewma(int old, int new, int weight)
--{
--      return (new * (100 - weight) + old * weight) / 100;
--}
--
--/*
-  * Look up an MCS group index based on mac80211 rate information
-  */
+ #ifdef CONFIG_PM
  static int
-@@ -211,20 +200,32 @@ static void
- minstrel_ht_calc_tp(struct minstrel_ht_sta *mi, int group, int rate)
+-wl1271_validate_wowlan_pattern(struct cfg80211_wowlan_trig_pkt_pattern *p)
++wl1271_validate_wowlan_pattern(struct cfg80211_pkt_pattern *p)
+ {
+       int num_fields = 0, in_field = 0, fields_size = 0;
+       int i, pattern_len = 0;
+@@ -1458,9 +1458,9 @@ void wl1271_rx_filter_flatten_fields(str
+  * Allocates an RX filter returned through f
+  * which needs to be freed using rx_filter_free()
+  */
+-static int wl1271_convert_wowlan_pattern_to_rx_filter(
+-      struct cfg80211_wowlan_trig_pkt_pattern *p,
+-      struct wl12xx_rx_filter **f)
++static int
++wl1271_convert_wowlan_pattern_to_rx_filter(struct cfg80211_pkt_pattern *p,
++                                         struct wl12xx_rx_filter **f)
  {
-       struct minstrel_rate_stats *mr;
--      unsigned int usecs = 0;
-+      unsigned int nsecs = 0;
-+      unsigned int tp;
-+      unsigned int prob;
+       int i, j, ret = 0;
+       struct wl12xx_rx_filter *filter;
+@@ -1562,7 +1562,7 @@ static int wl1271_configure_wowlan(struc
+       /* Translate WoWLAN patterns into filters */
+       for (i = 0; i < wow->n_patterns; i++) {
+-              struct cfg80211_wowlan_trig_pkt_pattern *p;
++              struct cfg80211_pkt_pattern *p;
+               struct wl12xx_rx_filter *filter = NULL;
+               p = &wow->patterns[i];
+--- a/include/net/cfg80211.h
++++ b/include/net/cfg80211.h
+@@ -1698,7 +1698,7 @@ struct cfg80211_pmksa {
+ };
  
-       mr = &mi->groups[group].rates[rate];
-+      prob = mr->probability;
+ /**
+- * struct cfg80211_wowlan_trig_pkt_pattern - packet pattern
++ * struct cfg80211_pkt_pattern - packet pattern
+  * @mask: bitmask where to match pattern and where to ignore bytes,
+  *    one bit per byte, in same format as nl80211
+  * @pattern: bytes to match where bitmask is 1
+@@ -1708,7 +1708,7 @@ struct cfg80211_pmksa {
+  * Internal note: @mask and @pattern are allocated in one chunk of
+  * memory, free @mask only!
+  */
+-struct cfg80211_wowlan_trig_pkt_pattern {
++struct cfg80211_pkt_pattern {
+       u8 *mask, *pattern;
+       int pattern_len;
+       int pkt_offset;
+@@ -1770,7 +1770,7 @@ struct cfg80211_wowlan {
+       bool any, disconnect, magic_pkt, gtk_rekey_failure,
+            eap_identity_req, four_way_handshake,
+            rfkill_release;
+-      struct cfg80211_wowlan_trig_pkt_pattern *patterns;
++      struct cfg80211_pkt_pattern *patterns;
+       struct cfg80211_wowlan_tcp *tcp;
+       int n_patterns;
+ };
+--- a/include/uapi/linux/nl80211.h
++++ b/include/uapi/linux/nl80211.h
+@@ -3060,11 +3060,11 @@ enum nl80211_tx_power_setting {
+ };
  
--      if (mr->probability < MINSTREL_FRAC(1, 10)) {
-+      if (prob < MINSTREL_FRAC(1, 10)) {
-               mr->cur_tp = 0;
-               return;
-       }
+ /**
+- * enum nl80211_wowlan_packet_pattern_attr - WoWLAN packet pattern attribute
+- * @__NL80211_WOWLAN_PKTPAT_INVALID: invalid number for nested attribute
+- * @NL80211_WOWLAN_PKTPAT_PATTERN: the pattern, values where the mask has
++ * enum nl80211_packet_pattern_attr - packet pattern attribute
++ * @__NL80211_PKTPAT_INVALID: invalid number for nested attribute
++ * @NL80211_PKTPAT_PATTERN: the pattern, values where the mask has
+  *    a zero bit are ignored
+- * @NL80211_WOWLAN_PKTPAT_MASK: pattern mask, must be long enough to have
++ * @NL80211_PKTPAT_MASK: pattern mask, must be long enough to have
+  *    a bit for each byte in the pattern. The lowest-order bit corresponds
+  *    to the first byte of the pattern, but the bytes of the pattern are
+  *    in a little-endian-like format, i.e. the 9th byte of the pattern
+@@ -3075,23 +3075,23 @@ enum nl80211_tx_power_setting {
+  *    Note that the pattern matching is done as though frames were not
+  *    802.11 frames but 802.3 frames, i.e. the frame is fully unpacked
+  *    first (including SNAP header unpacking) and then matched.
+- * @NL80211_WOWLAN_PKTPAT_OFFSET: packet offset, pattern is matched after
++ * @NL80211_PKTPAT_OFFSET: packet offset, pattern is matched after
+  *    these fixed number of bytes of received packet
+- * @NUM_NL80211_WOWLAN_PKTPAT: number of attributes
+- * @MAX_NL80211_WOWLAN_PKTPAT: max attribute number
++ * @NUM_NL80211_PKTPAT: number of attributes
++ * @MAX_NL80211_PKTPAT: max attribute number
+  */
+-enum nl80211_wowlan_packet_pattern_attr {
+-      __NL80211_WOWLAN_PKTPAT_INVALID,
+-      NL80211_WOWLAN_PKTPAT_MASK,
+-      NL80211_WOWLAN_PKTPAT_PATTERN,
+-      NL80211_WOWLAN_PKTPAT_OFFSET,
++enum nl80211_packet_pattern_attr {
++      __NL80211_PKTPAT_INVALID,
++      NL80211_PKTPAT_MASK,
++      NL80211_PKTPAT_PATTERN,
++      NL80211_PKTPAT_OFFSET,
+-      NUM_NL80211_WOWLAN_PKTPAT,
+-      MAX_NL80211_WOWLAN_PKTPAT = NUM_NL80211_WOWLAN_PKTPAT - 1,
++      NUM_NL80211_PKTPAT,
++      MAX_NL80211_PKTPAT = NUM_NL80211_PKTPAT - 1,
+ };
  
-+      /*
-+       * For the throughput calculation, limit the probability value to 90% to
-+       * account for collision related packet error rate fluctuation
-+       */
-+      if (prob > MINSTREL_FRAC(9, 10))
-+              prob = MINSTREL_FRAC(9, 10);
-+
-       if (group != MINSTREL_CCK_GROUP)
--              usecs = mi->overhead / MINSTREL_TRUNC(mi->avg_ampdu_len);
-+              nsecs = 1000 * mi->overhead / MINSTREL_TRUNC(mi->avg_ampdu_len);
+ /**
+- * struct nl80211_wowlan_pattern_support - pattern support information
++ * struct nl80211_pattern_support - packet pattern support information
+  * @max_patterns: maximum number of patterns supported
+  * @min_pattern_len: minimum length of each pattern
+  * @max_pattern_len: maximum length of each pattern
+@@ -3101,13 +3101,22 @@ enum nl80211_wowlan_packet_pattern_attr 
+  * that is part of %NL80211_ATTR_WOWLAN_TRIGGERS_SUPPORTED in the
+  * capability information given by the kernel to userspace.
+  */
+-struct nl80211_wowlan_pattern_support {
++struct nl80211_pattern_support {
+       __u32 max_patterns;
+       __u32 min_pattern_len;
+       __u32 max_pattern_len;
+       __u32 max_pkt_offset;
+ } __attribute__((packed));
++/* only for backward compatibility */
++#define __NL80211_WOWLAN_PKTPAT_INVALID __NL80211_PKTPAT_INVALID
++#define NL80211_WOWLAN_PKTPAT_MASK NL80211_PKTPAT_MASK
++#define NL80211_WOWLAN_PKTPAT_PATTERN NL80211_PKTPAT_PATTERN
++#define NL80211_WOWLAN_PKTPAT_OFFSET NL80211_PKTPAT_OFFSET
++#define NUM_NL80211_WOWLAN_PKTPAT NUM_NL80211_PKTPAT
++#define MAX_NL80211_WOWLAN_PKTPAT MAX_NL80211_PKTPAT
++#define nl80211_wowlan_pattern_support nl80211_pattern_support
 +
-+      nsecs += minstrel_mcs_groups[group].duration[rate];
-+      tp = 1000000 * ((mr->probability * 1000) / nsecs);
--      usecs += minstrel_mcs_groups[group].duration[rate];
--      mr->cur_tp = MINSTREL_TRUNC((1000000 / usecs) * mr->probability);
-+      mr->cur_tp = MINSTREL_TRUNC(tp);
- }
- /*
-@@ -308,8 +309,8 @@ minstrel_ht_update_stats(struct minstrel
-               }
-       }
--      /* try to sample up to half of the available rates during each interval */
--      mi->sample_count *= 4;
-+      /* try to sample all available rates during each interval */
-+      mi->sample_count *= 8;
-       cur_prob = 0;
-       cur_prob_tp = 0;
-@@ -320,20 +321,13 @@ minstrel_ht_update_stats(struct minstrel
-               if (!mg->supported)
-                       continue;
--              mr = minstrel_get_ratestats(mi, mg->max_prob_rate);
--              if (cur_prob_tp < mr->cur_tp &&
--                  minstrel_mcs_groups[group].streams == 1) {
--                      mi->max_prob_rate = mg->max_prob_rate;
--                      cur_prob = mr->cur_prob;
--                      cur_prob_tp = mr->cur_tp;
--              }
--
-               mr = minstrel_get_ratestats(mi, mg->max_tp_rate);
-               if (cur_tp < mr->cur_tp) {
-                       mi->max_tp_rate2 = mi->max_tp_rate;
-                       cur_tp2 = cur_tp;
-                       mi->max_tp_rate = mg->max_tp_rate;
-                       cur_tp = mr->cur_tp;
-+                      mi->max_prob_streams = minstrel_mcs_groups[group].streams - 1;
-               }
-               mr = minstrel_get_ratestats(mi, mg->max_tp_rate2);
-@@ -343,6 +337,23 @@ minstrel_ht_update_stats(struct minstrel
-               }
-       }
-+      if (mi->max_prob_streams < 1)
-+              mi->max_prob_streams = 1;
+ /**
+  * enum nl80211_wowlan_triggers - WoWLAN trigger definitions
+  * @__NL80211_WOWLAN_TRIG_INVALID: invalid number for nested attributes
+@@ -3127,7 +3136,7 @@ struct nl80211_wowlan_pattern_support {
+  *    pattern matching is done after the packet is converted to the MSDU.
+  *
+  *    In %NL80211_ATTR_WOWLAN_TRIGGERS_SUPPORTED, it is a binary attribute
+- *    carrying a &struct nl80211_wowlan_pattern_support.
++ *    carrying a &struct nl80211_pattern_support.
+  *
+  *    When reporting wakeup. it is a u32 attribute containing the 0-based
+  *    index of the pattern that caused the wakeup, in the patterns passed
+@@ -3284,7 +3293,7 @@ struct nl80211_wowlan_tcp_data_token_fea
+  * @NL80211_WOWLAN_TCP_WAKE_PAYLOAD: wake packet payload, for advertising a
+  *    u32 attribute holding the maximum length
+  * @NL80211_WOWLAN_TCP_WAKE_MASK: Wake packet payload mask, not used for
+- *    feature advertising. The mask works like @NL80211_WOWLAN_PKTPAT_MASK
++ *    feature advertising. The mask works like @NL80211_PKTPAT_MASK
+  *    but on the TCP payload only.
+  * @NUM_NL80211_WOWLAN_TCP: number of TCP attributes
+  * @MAX_NL80211_WOWLAN_TCP: highest attribute number
+--- a/net/mac80211/mesh_ps.c
++++ b/net/mac80211/mesh_ps.c
+@@ -229,6 +229,10 @@ void ieee80211_mps_sta_status_update(str
+       enum nl80211_mesh_power_mode pm;
+       bool do_buffer;
++      /* For non-assoc STA, prevent buffering or frame transmission */
++      if (sta->sta_state < IEEE80211_STA_ASSOC)
++              return;
 +
-+      for (group = 0; group < ARRAY_SIZE(minstrel_mcs_groups); group++) {
-+              mg = &mi->groups[group];
-+              if (!mg->supported)
-+                      continue;
-+              mr = minstrel_get_ratestats(mi, mg->max_prob_rate);
-+              if (cur_prob_tp < mr->cur_tp &&
-+                  minstrel_mcs_groups[group].streams <= mi->max_prob_streams) {
-+                      mi->max_prob_rate = mg->max_prob_rate;
-+                      cur_prob = mr->cur_prob;
-+                      cur_prob_tp = mr->cur_tp;
+       /*
+        * use peer-specific power mode if peering is established and the
+        * peer's power mode is known
+--- a/net/wireless/nl80211.c
++++ b/net/wireless/nl80211.c
+@@ -974,7 +974,7 @@ static int nl80211_send_wowlan(struct sk
+               return -ENOBUFS;
+       if (dev->wiphy.wowlan->n_patterns) {
+-              struct nl80211_wowlan_pattern_support pat = {
++              struct nl80211_pattern_support pat = {
+                       .max_patterns = dev->wiphy.wowlan->n_patterns,
+                       .min_pattern_len = dev->wiphy.wowlan->pattern_min_len,
+                       .max_pattern_len = dev->wiphy.wowlan->pattern_max_len,
+@@ -1568,8 +1568,10 @@ static int nl80211_dump_wiphy(struct sk_
+       rtnl_lock();
+       if (!state) {
+               state = kzalloc(sizeof(*state), GFP_KERNEL);
+-              if (!state)
++              if (!state) {
++                      rtnl_unlock();
+                       return -ENOMEM;
 +              }
-+      }
-+
-+
-       mi->stats_update = jiffies;
- }
-@@ -467,7 +478,7 @@ minstrel_ht_tx_status(void *priv, struct
-       if (!mi->sample_wait && !mi->sample_tries && mi->sample_count > 0) {
-               mi->sample_wait = 16 + 2 * MINSTREL_TRUNC(mi->avg_ampdu_len);
--              mi->sample_tries = 2;
-+              mi->sample_tries = 1;
-               mi->sample_count--;
-       }
+               state->filter_wiphy = -1;
+               ret = nl80211_dump_wiphy_parse(skb, cb, state);
+               if (ret) {
+@@ -6615,12 +6617,14 @@ EXPORT_SYMBOL(cfg80211_testmode_alloc_ev
  
-@@ -536,7 +547,7 @@ minstrel_calc_retransmit(struct minstrel
-       mr->retry_updated = true;
-       group = &minstrel_mcs_groups[index / MCS_GROUP_RATES];
--      tx_time_data = group->duration[index % MCS_GROUP_RATES] * ampdu_len;
-+      tx_time_data = group->duration[index % MCS_GROUP_RATES] * ampdu_len / 1000;
-       /* Contention time for first 2 tries */
-       ctime = (t_slot * cw) >> 1;
-@@ -616,6 +627,7 @@ minstrel_get_sample_rate(struct minstrel
+ void cfg80211_testmode_event(struct sk_buff *skb, gfp_t gfp)
  {
-       struct minstrel_rate_stats *mr;
-       struct minstrel_mcs_group_data *mg;
-+      unsigned int sample_dur, sample_group;
-       int sample_idx = 0;
-       if (mi->sample_wait > 0) {
-@@ -626,39 +638,46 @@ minstrel_get_sample_rate(struct minstrel
-       if (!mi->sample_tries)
-               return -1;
--      mi->sample_tries--;
-       mg = &mi->groups[mi->sample_group];
-       sample_idx = sample_table[mg->column][mg->index];
-       mr = &mg->rates[sample_idx];
--      sample_idx += mi->sample_group * MCS_GROUP_RATES;
-+      sample_group = mi->sample_group;
-+      sample_idx += sample_group * MCS_GROUP_RATES;
-       minstrel_next_sample_idx(mi);
-       /*
-        * Sampling might add some overhead (RTS, no aggregation)
-        * to the frame. Hence, don't use sampling for the currently
--       * used max TP rate.
-+       * used rates.
-        */
--      if (sample_idx == mi->max_tp_rate)
-+      if (sample_idx == mi->max_tp_rate ||
-+          sample_idx == mi->max_tp_rate2 ||
-+          sample_idx == mi->max_prob_rate)
-               return -1;
-+
-       /*
--       * When not using MRR, do not sample if the probability is already
--       * higher than 95% to avoid wasting airtime
-+       * Do not sample if the probability is already higher than 95%
-+       * to avoid wasting airtime.
-        */
--      if (!mp->has_mrr && (mr->probability > MINSTREL_FRAC(95, 100)))
-+      if (mr->probability > MINSTREL_FRAC(95, 100))
-               return -1;
-       /*
-        * Make sure that lower rates get sampled only occasionally,
-        * if the link is working perfectly.
-        */
--      if (minstrel_get_duration(sample_idx) >
--          minstrel_get_duration(mi->max_tp_rate)) {
-+      sample_dur = minstrel_get_duration(sample_idx);
-+      if (sample_dur >= minstrel_get_duration(mi->max_tp_rate2) &&
-+          (mi->max_prob_streams <
-+           minstrel_mcs_groups[sample_group].streams ||
-+           sample_dur >= minstrel_get_duration(mi->max_prob_rate))) {
-               if (mr->sample_skipped < 20)
-                       return -1;
-               if (mi->sample_slow++ > 2)
-                       return -1;
-       }
-+      mi->sample_tries--;
-       return sample_idx;
++      struct cfg80211_registered_device *rdev = ((void **)skb->cb)[0];
+       void *hdr = ((void **)skb->cb)[1];
+       struct nlattr *data = ((void **)skb->cb)[2];
+       nla_nest_end(skb, data);
+       genlmsg_end(skb, hdr);
+-      genlmsg_multicast(skb, 0, nl80211_testmode_mcgrp.id, gfp);
++      genlmsg_multicast_netns(wiphy_net(&rdev->wiphy), skb, 0,
++                              nl80211_testmode_mcgrp.id, gfp);
  }
---- a/net/mac80211/rc80211_minstrel_ht.h
-+++ b/net/mac80211/rc80211_minstrel_ht.h
-@@ -16,11 +16,6 @@
- #define MINSTREL_MAX_STREAMS  3
- #define MINSTREL_STREAM_GROUPS        4
--/* scaled fraction values */
--#define MINSTREL_SCALE        16
--#define MINSTREL_FRAC(val, div) (((val) << MINSTREL_SCALE) / div)
--#define MINSTREL_TRUNC(val) ((val) >> MINSTREL_SCALE)
--
- #define MCS_GROUP_RATES       8
- struct mcs_group {
-@@ -85,6 +80,7 @@ struct minstrel_ht_sta {
-       /* best probability rate */
-       unsigned int max_prob_rate;
-+      unsigned int max_prob_streams;
-       /* time of last status update */
-       unsigned long stats_update;
---- a/drivers/net/wireless/ath/ath9k/ar9003_calib.c
-+++ b/drivers/net/wireless/ath/ath9k/ar9003_calib.c
-@@ -1023,6 +1023,7 @@ static bool ar9003_hw_init_cal(struct at
-                                         AR_PHY_AGC_CONTROL_FLTR_CAL   |
-                                         AR_PHY_AGC_CONTROL_PKDET_CAL;
-+      /* Use chip chainmask only for calibration */
-       ar9003_hw_set_chain_masks(ah, ah->caps.rx_chainmask, ah->caps.tx_chainmask);
-       if (rtt) {
-@@ -1150,6 +1151,9 @@ skip_tx_iqcal:
-               ar9003_hw_rtt_disable(ah);
-       }
-+      /* Revert chainmask to runtime parameters */
-+      ar9003_hw_set_chain_masks(ah, ah->rxchainmask, ah->txchainmask);
-+
-       /* Initialize list pointers */
-       ah->cal_list = ah->cal_list_last = ah->cal_list_curr = NULL;
---- a/drivers/net/wireless/ath/ath9k/ar9003_eeprom.c
-+++ b/drivers/net/wireless/ath/ath9k/ar9003_eeprom.c
-@@ -3606,6 +3606,12 @@ static void ar9003_hw_ant_ctrl_apply(str
-       value = ar9003_hw_ant_ctrl_common_2_get(ah, is2ghz);
-       REG_RMW_FIELD(ah, AR_PHY_SWITCH_COM_2, AR_SWITCH_TABLE_COM2_ALL, value);
-+      if ((AR_SREV_9462(ah)) && (ah->rxchainmask == 0x2)) {
-+              value = ar9003_hw_ant_ctrl_chain_get(ah, 1, is2ghz);
-+              REG_RMW_FIELD(ah, switch_chain_reg[0],
-+                            AR_SWITCH_TABLE_ALL, value);
-+      }
-+
-       for (chain = 0; chain < AR9300_MAX_CHAINS; chain++) {
-               if ((ah->rxchainmask & BIT(chain)) ||
-                   (ah->txchainmask & BIT(chain))) {
-@@ -3772,6 +3778,17 @@ static void ar9003_hw_atten_apply(struct
-                                         AR_PHY_EXT_ATTEN_CTL_2,
-                                        };
-+      if ((AR_SREV_9462(ah)) && (ah->rxchainmask == 0x2)) {
-+              value = ar9003_hw_atten_chain_get(ah, 1, chan);
-+              REG_RMW_FIELD(ah, ext_atten_reg[0],
-+                            AR_PHY_EXT_ATTEN_CTL_XATTEN1_DB, value);
-+
-+              value = ar9003_hw_atten_chain_get_margin(ah, 1, chan);
-+              REG_RMW_FIELD(ah, ext_atten_reg[0],
-+                            AR_PHY_EXT_ATTEN_CTL_XATTEN1_MARGIN,
-+                            value);
-+      }
-+
-       /* Test value. if 0 then attenuation is unused. Don't load anything. */
-       for (i = 0; i < 3; i++) {
-               if (ah->txchainmask & BIT(i)) {
---- a/drivers/net/wireless/ath/ath9k/link.c
-+++ b/drivers/net/wireless/ath/ath9k/link.c
-@@ -28,21 +28,21 @@ void ath_tx_complete_poll_work(struct wo
-       int i;
-       bool needreset = false;
--      for (i = 0; i < ATH9K_NUM_TX_QUEUES; i++)
--              if (ATH_TXQ_SETUP(sc, i)) {
--                      txq = &sc->tx.txq[i];
--                      ath_txq_lock(sc, txq);
--                      if (txq->axq_depth) {
--                              if (txq->axq_tx_inprogress) {
--                                      needreset = true;
--                                      ath_txq_unlock(sc, txq);
--                                      break;
--                              } else {
--                                      txq->axq_tx_inprogress = true;
--                              }
-+      for (i = 0; i < IEEE80211_NUM_ACS; i++) {
-+              txq = sc->tx.txq_map[i];
-+
-+              ath_txq_lock(sc, txq);
-+              if (txq->axq_depth) {
-+                      if (txq->axq_tx_inprogress) {
-+                              needreset = true;
-+                              ath_txq_unlock(sc, txq);
-+                              break;
-+                      } else {
-+                              txq->axq_tx_inprogress = true;
-                       }
--                      ath_txq_unlock_complete(sc, txq);
+ EXPORT_SYMBOL(cfg80211_testmode_event);
+ #endif
+@@ -7593,12 +7597,11 @@ static int nl80211_send_wowlan_patterns(
+               if (!nl_pat)
+                       return -ENOBUFS;
+               pat_len = wowlan->patterns[i].pattern_len;
+-              if (nla_put(msg, NL80211_WOWLAN_PKTPAT_MASK,
+-                          DIV_ROUND_UP(pat_len, 8),
++              if (nla_put(msg, NL80211_PKTPAT_MASK, DIV_ROUND_UP(pat_len, 8),
+                           wowlan->patterns[i].mask) ||
+-                  nla_put(msg, NL80211_WOWLAN_PKTPAT_PATTERN,
+-                          pat_len, wowlan->patterns[i].pattern) ||
+-                  nla_put_u32(msg, NL80211_WOWLAN_PKTPAT_OFFSET,
++                  nla_put(msg, NL80211_PKTPAT_PATTERN, pat_len,
++                          wowlan->patterns[i].pattern) ||
++                  nla_put_u32(msg, NL80211_PKTPAT_OFFSET,
+                               wowlan->patterns[i].pkt_offset))
+                       return -ENOBUFS;
+               nla_nest_end(msg, nl_pat);
+@@ -7939,7 +7942,7 @@ static int nl80211_set_wowlan(struct sk_
+               struct nlattr *pat;
+               int n_patterns = 0;
+               int rem, pat_len, mask_len, pkt_offset;
+-              struct nlattr *pat_tb[NUM_NL80211_WOWLAN_PKTPAT];
++              struct nlattr *pat_tb[NUM_NL80211_PKTPAT];
+               nla_for_each_nested(pat, tb[NL80211_WOWLAN_TRIG_PKT_PATTERN],
+                                   rem)
+@@ -7958,26 +7961,25 @@ static int nl80211_set_wowlan(struct sk_
+               nla_for_each_nested(pat, tb[NL80211_WOWLAN_TRIG_PKT_PATTERN],
+                                   rem) {
+-                      nla_parse(pat_tb, MAX_NL80211_WOWLAN_PKTPAT,
+-                                nla_data(pat), nla_len(pat), NULL);
++                      nla_parse(pat_tb, MAX_NL80211_PKTPAT, nla_data(pat),
++                                nla_len(pat), NULL);
+                       err = -EINVAL;
+-                      if (!pat_tb[NL80211_WOWLAN_PKTPAT_MASK] ||
+-                          !pat_tb[NL80211_WOWLAN_PKTPAT_PATTERN])
++                      if (!pat_tb[NL80211_PKTPAT_MASK] ||
++                          !pat_tb[NL80211_PKTPAT_PATTERN])
+                               goto error;
+-                      pat_len = nla_len(pat_tb[NL80211_WOWLAN_PKTPAT_PATTERN]);
++                      pat_len = nla_len(pat_tb[NL80211_PKTPAT_PATTERN]);
+                       mask_len = DIV_ROUND_UP(pat_len, 8);
+-                      if (nla_len(pat_tb[NL80211_WOWLAN_PKTPAT_MASK]) !=
+-                          mask_len)
++                      if (nla_len(pat_tb[NL80211_PKTPAT_MASK]) != mask_len)
+                               goto error;
+                       if (pat_len > wowlan->pattern_max_len ||
+                           pat_len < wowlan->pattern_min_len)
+                               goto error;
+-                      if (!pat_tb[NL80211_WOWLAN_PKTPAT_OFFSET])
++                      if (!pat_tb[NL80211_PKTPAT_OFFSET])
+                               pkt_offset = 0;
+                       else
+                               pkt_offset = nla_get_u32(
+-                                      pat_tb[NL80211_WOWLAN_PKTPAT_OFFSET]);
++                                      pat_tb[NL80211_PKTPAT_OFFSET]);
+                       if (pkt_offset > wowlan->max_pkt_offset)
+                               goto error;
+                       new_triggers.patterns[i].pkt_offset = pkt_offset;
+@@ -7991,11 +7993,11 @@ static int nl80211_set_wowlan(struct sk_
+                       new_triggers.patterns[i].pattern =
+                               new_triggers.patterns[i].mask + mask_len;
+                       memcpy(new_triggers.patterns[i].mask,
+-                             nla_data(pat_tb[NL80211_WOWLAN_PKTPAT_MASK]),
++                             nla_data(pat_tb[NL80211_PKTPAT_MASK]),
+                              mask_len);
+                       new_triggers.patterns[i].pattern_len = pat_len;
+                       memcpy(new_triggers.patterns[i].pattern,
+-                             nla_data(pat_tb[NL80211_WOWLAN_PKTPAT_PATTERN]),
++                             nla_data(pat_tb[NL80211_PKTPAT_PATTERN]),
+                              pat_len);
+                       i++;
                }
-+              ath_txq_unlock_complete(sc, txq);
-+      }
+@@ -10066,7 +10068,8 @@ void cfg80211_mgmt_tx_status(struct wire
  
-       if (needreset) {
-               ath_dbg(ath9k_hw_common(sc->sc_ah), RESET,
---- a/net/mac80211/sta_info.c
-+++ b/net/mac80211/sta_info.c
-@@ -766,6 +766,7 @@ int __must_check __sta_info_destroy(stru
-       struct ieee80211_local *local;
-       struct ieee80211_sub_if_data *sdata;
-       int ret, i;
-+      bool have_key = false;
+       genlmsg_end(msg, hdr);
  
-       might_sleep();
+-      genlmsg_multicast(msg, 0, nl80211_mlme_mcgrp.id, gfp);
++      genlmsg_multicast_netns(wiphy_net(&rdev->wiphy), msg, 0,
++                              nl80211_mlme_mcgrp.id, gfp);
+       return;
  
-@@ -793,12 +794,19 @@ int __must_check __sta_info_destroy(stru
-       list_del_rcu(&sta->list);
-       mutex_lock(&local->key_mtx);
--      for (i = 0; i < NUM_DEFAULT_KEYS; i++)
-+      for (i = 0; i < NUM_DEFAULT_KEYS; i++) {
-               __ieee80211_key_free(key_mtx_dereference(local, sta->gtk[i]));
--      if (sta->ptk)
-+              have_key = true;
-+      }
-+      if (sta->ptk) {
-               __ieee80211_key_free(key_mtx_dereference(local, sta->ptk));
-+              have_key = true;
-+      }
-       mutex_unlock(&local->key_mtx);
-+      if (!have_key)
-+              synchronize_net();
-+
-       sta->dead = true;
-       local->num_sta--;
---- a/net/mac80211/chan.c
-+++ b/net/mac80211/chan.c
-@@ -63,6 +63,7 @@ ieee80211_new_chanctx(struct ieee80211_l
-                     enum ieee80211_chanctx_mode mode)
+  nla_put_failure:
+--- a/net/wireless/reg.c
++++ b/net/wireless/reg.c
+@@ -2279,7 +2279,9 @@ void wiphy_regulatory_deregister(struct 
+ static void reg_timeout_work(struct work_struct *work)
  {
-       struct ieee80211_chanctx *ctx;
-+      u32 changed;
-       int err;
-       lockdep_assert_held(&local->chanctx_mtx);
-@@ -76,6 +77,13 @@ ieee80211_new_chanctx(struct ieee80211_l
-       ctx->conf.rx_chains_dynamic = 1;
-       ctx->mode = mode;
-+      /* acquire mutex to prevent idle from changing */
-+      mutex_lock(&local->mtx);
-+      /* turn idle off *before* setting channel -- some drivers need that */
-+      changed = ieee80211_idle_off(local);
-+      if (changed)
-+              ieee80211_hw_config(local, changed);
-+
-       if (!local->use_chanctx) {
-               local->_oper_channel_type =
-                       cfg80211_get_chandef_type(chandef);
-@@ -85,14 +93,17 @@ ieee80211_new_chanctx(struct ieee80211_l
-               err = drv_add_chanctx(local, ctx);
-               if (err) {
-                       kfree(ctx);
--                      return ERR_PTR(err);
-+                      ctx = ERR_PTR(err);
-+
-+                      ieee80211_recalc_idle(local);
-+                      goto out;
-               }
-       }
-+      /* and keep the mutex held until the new chanctx is on the list */
-       list_add_rcu(&ctx->list, &local->chanctx_list);
--      mutex_lock(&local->mtx);
--      ieee80211_recalc_idle(local);
-+ out:
-       mutex_unlock(&local->mtx);
-       return ctx;
---- a/net/mac80211/ieee80211_i.h
-+++ b/net/mac80211/ieee80211_i.h
-@@ -1366,6 +1366,7 @@ int ieee80211_if_change_type(struct ieee
-                            enum nl80211_iftype type);
- void ieee80211_if_remove(struct ieee80211_sub_if_data *sdata);
- void ieee80211_remove_interfaces(struct ieee80211_local *local);
-+u32 ieee80211_idle_off(struct ieee80211_local *local);
- void ieee80211_recalc_idle(struct ieee80211_local *local);
- void ieee80211_adjust_monitor_flags(struct ieee80211_sub_if_data *sdata,
-                                   const int offset);
---- a/drivers/net/wireless/ath/ath9k/htc_drv_init.c
-+++ b/drivers/net/wireless/ath/ath9k/htc_drv_init.c
-@@ -799,7 +799,7 @@ static int ath9k_init_firmware_version(s
-        * required version.
-        */
-       if (priv->fw_version_major != MAJOR_VERSION_REQ ||
--          priv->fw_version_minor != MINOR_VERSION_REQ) {
-+          priv->fw_version_minor < MINOR_VERSION_REQ) {
-               dev_err(priv->dev, "ath9k_htc: Please upgrade to FW version %d.%d\n",
-                       MAJOR_VERSION_REQ, MINOR_VERSION_REQ);
-               return -EINVAL;
---- a/drivers/net/wireless/ath/ath9k/xmit.c
-+++ b/drivers/net/wireless/ath/ath9k/xmit.c
-@@ -516,8 +516,7 @@ static void ath_tx_complete_aggr(struct 
-                * not a holding desc.
-                */
-               INIT_LIST_HEAD(&bf_head);
--              if ((sc->sc_ah->caps.hw_caps & ATH9K_HW_CAP_EDMA) ||
--                  bf_next != NULL || !bf_last->bf_stale)
-+              if (bf_next != NULL || !bf_last->bf_stale)
-                       list_move_tail(&bf->list, &bf_head);
-               if (!txpending || (tid->state & AGGR_CLEANUP)) {
-@@ -537,8 +536,7 @@ static void ath_tx_complete_aggr(struct 
-                               !txfail);
-               } else {
-                       /* retry the un-acked ones */
--                      if (!(sc->sc_ah->caps.hw_caps & ATH9K_HW_CAP_EDMA) &&
--                          bf->bf_next == NULL && bf_last->bf_stale) {
-+                      if (bf->bf_next == NULL && bf_last->bf_stale) {
-                               struct ath_buf *tbf;
-                               tbf = ath_clone_txbuf(sc, bf_last);
-@@ -2264,6 +2262,7 @@ void ath_tx_edma_tasklet(struct ath_soft
-       struct ath_txq *txq;
-       struct ath_buf *bf, *lastbf;
-       struct list_head bf_head;
-+      struct list_head *fifo_list;
-       int status;
-       for (;;) {
-@@ -2291,20 +2290,24 @@ void ath_tx_edma_tasklet(struct ath_soft
-               TX_STAT_INC(txq->axq_qnum, txprocdesc);
--              if (list_empty(&txq->txq_fifo[txq->txq_tailidx])) {
-+              fifo_list = &txq->txq_fifo[txq->txq_tailidx];
-+              if (list_empty(fifo_list)) {
-                       ath_txq_unlock(sc, txq);
-                       return;
-               }
--              bf = list_first_entry(&txq->txq_fifo[txq->txq_tailidx],
--                                    struct ath_buf, list);
-+              bf = list_first_entry(fifo_list, struct ath_buf, list);
-+              if (bf->bf_stale) {
-+                      list_del(&bf->list);
-+                      ath_tx_return_buffer(sc, bf);
-+                      bf = list_first_entry(fifo_list, struct ath_buf, list);
-+              }
-+
-               lastbf = bf->bf_lastbf;
-               INIT_LIST_HEAD(&bf_head);
--              list_cut_position(&bf_head, &txq->txq_fifo[txq->txq_tailidx],
--                                &lastbf->list);
--
--              if (list_empty(&txq->txq_fifo[txq->txq_tailidx])) {
-+              if (list_is_last(&lastbf->list, fifo_list)) {
-+                      list_splice_tail_init(fifo_list, &bf_head);
-                       INCR(txq->txq_tailidx, ATH_TXFIFO_DEPTH);
-                       if (!list_empty(&txq->axq_q)) {
-@@ -2315,6 +2318,11 @@ void ath_tx_edma_tasklet(struct ath_soft
-                               list_splice_tail_init(&txq->axq_q, &bf_q);
-                               ath_tx_txqaddbuf(sc, txq, &bf_q, true);
-                       }
-+              } else {
-+                      lastbf->bf_stale = true;
-+                      if (bf != lastbf)
-+                              list_cut_position(&bf_head, fifo_list,
-+                                                lastbf->list.prev);
-               }
-               ath_tx_process_buffer(sc, txq, &ts, bf, &bf_head);
---- a/drivers/net/wireless/ath/ath9k/ar9580_1p0_initvals.h
-+++ b/drivers/net/wireless/ath/ath9k/ar9580_1p0_initvals.h
-@@ -519,7 +519,7 @@ static const u32 ar9580_1p0_mac_core[][2
-       {0x00008258, 0x00000000},
-       {0x0000825c, 0x40000000},
-       {0x00008260, 0x00080922},
--      {0x00008264, 0x9bc00010},
-+      {0x00008264, 0x9d400010},
-       {0x00008268, 0xffffffff},
-       {0x0000826c, 0x0000ffff},
-       {0x00008270, 0x00000000},
---- a/net/mac80211/mlme.c
-+++ b/net/mac80211/mlme.c
-@@ -3955,8 +3955,16 @@ int ieee80211_mgd_auth(struct ieee80211_
-       /* prep auth_data so we don't go into idle on disassoc */
-       ifmgd->auth_data = auth_data;
--      if (ifmgd->associated)
--              ieee80211_set_disassoc(sdata, 0, 0, false, NULL);
-+      if (ifmgd->associated) {
-+              u8 frame_buf[IEEE80211_DEAUTH_FRAME_LEN];
-+
-+              ieee80211_set_disassoc(sdata, IEEE80211_STYPE_DEAUTH,
-+                                     WLAN_REASON_UNSPECIFIED,
-+                                     false, frame_buf);
-+
-+              __cfg80211_send_deauth(sdata->dev, frame_buf,
-+                                     sizeof(frame_buf));
-+      }
-       sdata_info(sdata, "authenticate with %pM\n", req->bss->bssid);
-@@ -4016,8 +4024,16 @@ int ieee80211_mgd_assoc(struct ieee80211
-       mutex_lock(&ifmgd->mtx);
--      if (ifmgd->associated)
--              ieee80211_set_disassoc(sdata, 0, 0, false, NULL);
-+      if (ifmgd->associated) {
-+              u8 frame_buf[IEEE80211_DEAUTH_FRAME_LEN];
-+
-+              ieee80211_set_disassoc(sdata, IEEE80211_STYPE_DEAUTH,
-+                                     WLAN_REASON_UNSPECIFIED,
-+                                     false, frame_buf);
-+
-+              __cfg80211_send_deauth(sdata->dev, frame_buf,
-+                                     sizeof(frame_buf));
-+      }
-       if (ifmgd->auth_data && !ifmgd->auth_data->done) {
-               err = -EBUSY;
---- a/net/mac80211/rc80211_minstrel.c
-+++ b/net/mac80211/rc80211_minstrel.c
-@@ -55,7 +55,6 @@
- #include "rate.h"
- #include "rc80211_minstrel.h"
--#define SAMPLE_COLUMNS        10
- #define SAMPLE_TBL(_mi, _idx, _col) \
-               _mi->sample_table[(_idx * SAMPLE_COLUMNS) + _col]
-@@ -70,16 +69,31 @@ rix_to_ndx(struct minstrel_sta_info *mi,
-       return i;
+       REG_DBG_PRINT("Timeout while waiting for CRDA to reply, restoring regulatory settings\n");
++      rtnl_lock();
+       restore_regulatory_settings(true);
++      rtnl_unlock();
  }
  
-+/* find & sort topmost throughput rates */
-+static inline void
-+minstrel_sort_best_tp_rates(struct minstrel_sta_info *mi, int i, u8 *tp_list)
-+{
-+      int j = MAX_THR_RATES;
-+
-+      while (j > 0 && mi->r[i].cur_tp > mi->r[tp_list[j - 1]].cur_tp)
-+              j--;
-+      if (j < MAX_THR_RATES - 1)
-+              memmove(&tp_list[j + 1], &tp_list[j], MAX_THR_RATES - (j + 1));
-+      if (j < MAX_THR_RATES)
-+              tp_list[j] = i;
-+}
-+
- static void
- minstrel_update_stats(struct minstrel_priv *mp, struct minstrel_sta_info *mi)
- {
--      u32 max_tp = 0, index_max_tp = 0, index_max_tp2 = 0;
--      u32 max_prob = 0, index_max_prob = 0;
-+      u8 tmp_tp_rate[MAX_THR_RATES];
-+      u8 tmp_prob_rate = 0;
-       u32 usecs;
--      u32 p;
-       int i;
--      mi->stats_update = jiffies;
-+      for (i=0; i < MAX_THR_RATES; i++)
-+          tmp_tp_rate[i] = 0;
-+
-       for (i = 0; i < mi->n_rates; i++) {
-               struct minstrel_rate *mr = &mi->r[i];
-@@ -87,27 +101,32 @@ minstrel_update_stats(struct minstrel_pr
-               if (!usecs)
-                       usecs = 1000000;
--              /* To avoid rounding issues, probabilities scale from 0 (0%)
--               * to 18000 (100%) */
--              if (mr->attempts) {
--                      p = (mr->success * 18000) / mr->attempts;
-+              if (unlikely(mr->attempts > 0)) {
-+                      mr->sample_skipped = 0;
-+                      mr->cur_prob = MINSTREL_FRAC(mr->success, mr->attempts);
-                       mr->succ_hist += mr->success;
-                       mr->att_hist += mr->attempts;
--                      mr->cur_prob = p;
--                      p = ((p * (100 - mp->ewma_level)) + (mr->probability *
--                              mp->ewma_level)) / 100;
--                      mr->probability = p;
--                      mr->cur_tp = p * (1000000 / usecs);
--              }
-+                      mr->probability = minstrel_ewma(mr->probability,
-+                                                      mr->cur_prob,
-+                                                      EWMA_LEVEL);
-+              } else
-+                      mr->sample_skipped++;
-               mr->last_success = mr->success;
-               mr->last_attempts = mr->attempts;
-               mr->success = 0;
-               mr->attempts = 0;
-+              /* Update throughput per rate, reset thr. below 10% success */
-+              if (mr->probability < MINSTREL_FRAC(10, 100))
-+                      mr->cur_tp = 0;
-+              else
-+                      mr->cur_tp = mr->probability * (1000000 / usecs);
-+
-               /* Sample less often below the 10% chance of success.
-                * Sample less often above the 95% chance of success. */
--              if ((mr->probability > 17100) || (mr->probability < 1800)) {
-+              if (mr->probability > MINSTREL_FRAC(95, 100) ||
-+                  mr->probability < MINSTREL_FRAC(10, 100)) {
-                       mr->adjusted_retry_count = mr->retry_count >> 1;
-                       if (mr->adjusted_retry_count > 2)
-                               mr->adjusted_retry_count = 2;
-@@ -118,35 +137,30 @@ minstrel_update_stats(struct minstrel_pr
-               }
-               if (!mr->adjusted_retry_count)
-                       mr->adjusted_retry_count = 2;
--      }
--      for (i = 0; i < mi->n_rates; i++) {
--              struct minstrel_rate *mr = &mi->r[i];
--              if (max_tp < mr->cur_tp) {
--                      index_max_tp = i;
--                      max_tp = mr->cur_tp;
--              }
--              if (max_prob < mr->probability) {
--                      index_max_prob = i;
--                      max_prob = mr->probability;
-+              minstrel_sort_best_tp_rates(mi, i, tmp_tp_rate);
-+
-+              /* To determine the most robust rate (max_prob_rate) used at
-+               * 3rd mmr stage we distinct between two cases:
-+               * (1) if any success probabilitiy >= 95%, out of those rates
-+               * choose the maximum throughput rate as max_prob_rate
-+               * (2) if all success probabilities < 95%, the rate with
-+               * highest success probability is choosen as max_prob_rate */
-+              if (mr->probability >= MINSTREL_FRAC(95,100)) {
-+                      if (mr->cur_tp >= mi->r[tmp_prob_rate].cur_tp)
-+                              tmp_prob_rate = i;
-+              } else {
-+                      if (mr->probability >= mi->r[tmp_prob_rate].probability)
-+                              tmp_prob_rate = i;
-               }
+ int __init regulatory_init(void)
+--- a/net/wireless/sme.c
++++ b/net/wireless/sme.c
+@@ -34,8 +34,10 @@ struct cfg80211_conn {
+               CFG80211_CONN_SCAN_AGAIN,
+               CFG80211_CONN_AUTHENTICATE_NEXT,
+               CFG80211_CONN_AUTHENTICATING,
++              CFG80211_CONN_AUTH_FAILED,
+               CFG80211_CONN_ASSOCIATE_NEXT,
+               CFG80211_CONN_ASSOCIATING,
++              CFG80211_CONN_ASSOC_FAILED,
+               CFG80211_CONN_DEAUTH,
+               CFG80211_CONN_CONNECTED,
+       } state;
+@@ -164,6 +166,8 @@ static int cfg80211_conn_do_work(struct 
+                                         NULL, 0,
+                                         params->key, params->key_len,
+                                         params->key_idx, NULL, 0);
++      case CFG80211_CONN_AUTH_FAILED:
++              return -ENOTCONN;
+       case CFG80211_CONN_ASSOCIATE_NEXT:
+               BUG_ON(!rdev->ops->assoc);
+               wdev->conn->state = CFG80211_CONN_ASSOCIATING;
+@@ -188,10 +192,17 @@ static int cfg80211_conn_do_work(struct 
+                                            WLAN_REASON_DEAUTH_LEAVING,
+                                            false);
+               return err;
++      case CFG80211_CONN_ASSOC_FAILED:
++              cfg80211_mlme_deauth(rdev, wdev->netdev, params->bssid,
++                                   NULL, 0,
++                                   WLAN_REASON_DEAUTH_LEAVING, false);
++              return -ENOTCONN;
+       case CFG80211_CONN_DEAUTH:
+               cfg80211_mlme_deauth(rdev, wdev->netdev, params->bssid,
+                                    NULL, 0,
+                                    WLAN_REASON_DEAUTH_LEAVING, false);
++              /* free directly, disconnected event already sent */
++              cfg80211_sme_free(wdev);
+               return 0;
+       default:
+               return 0;
+@@ -371,7 +382,7 @@ bool cfg80211_sme_rx_assoc_resp(struct w
+               return true;
        }
  
--      max_tp = 0;
--      for (i = 0; i < mi->n_rates; i++) {
--              struct minstrel_rate *mr = &mi->r[i];
--
--              if (i == index_max_tp)
--                      continue;
-+      /* Assign the new rate set */
-+      memcpy(mi->max_tp_rate, tmp_tp_rate, sizeof(mi->max_tp_rate));
-+      mi->max_prob_rate = tmp_prob_rate;
--              if (max_tp < mr->cur_tp) {
--                      index_max_tp2 = i;
--                      max_tp = mr->cur_tp;
--              }
--      }
--      mi->max_tp_rate = index_max_tp;
--      mi->max_tp_rate2 = index_max_tp2;
--      mi->max_prob_rate = index_max_prob;
-+      /* Reset update timer */
-+      mi->stats_update = jiffies;
+-      wdev->conn->state = CFG80211_CONN_DEAUTH;
++      wdev->conn->state = CFG80211_CONN_ASSOC_FAILED;
+       schedule_work(&rdev->conn_work);
+       return false;
  }
+@@ -383,7 +394,13 @@ void cfg80211_sme_deauth(struct wireless
  
- static void
-@@ -207,10 +221,10 @@ static int
- minstrel_get_next_sample(struct minstrel_sta_info *mi)
+ void cfg80211_sme_auth_timeout(struct wireless_dev *wdev)
  {
-       unsigned int sample_ndx;
--      sample_ndx = SAMPLE_TBL(mi, mi->sample_idx, mi->sample_column);
--      mi->sample_idx++;
--      if ((int) mi->sample_idx > (mi->n_rates - 2)) {
--              mi->sample_idx = 0;
-+      sample_ndx = SAMPLE_TBL(mi, mi->sample_row, mi->sample_column);
-+      mi->sample_row++;
-+      if ((int) mi->sample_row >= mi->n_rates) {
-+              mi->sample_row = 0;
-               mi->sample_column++;
-               if (mi->sample_column >= SAMPLE_COLUMNS)
-                       mi->sample_column = 0;
-@@ -228,31 +242,37 @@ minstrel_get_rate(void *priv, struct iee
-       struct minstrel_priv *mp = priv;
-       struct ieee80211_tx_rate *ar = info->control.rates;
-       unsigned int ndx, sample_ndx = 0;
--      bool mrr;
--      bool sample_slower = false;
--      bool sample = false;
-+      bool mrr_capable;
-+      bool indirect_rate_sampling = false;
-+      bool rate_sampling = false;
-       int i, delta;
-       int mrr_ndx[3];
--      int sample_rate;
-+      int sampling_ratio;
-+      /* management/no-ack frames do not use rate control */
-       if (rate_control_send_low(sta, priv_sta, txrc))
-               return;
--      mrr = mp->has_mrr && !txrc->rts && !txrc->bss_conf->use_cts_prot;
--
--      ndx = mi->max_tp_rate;
--
--      if (mrr)
--              sample_rate = mp->lookaround_rate_mrr;
-+      /* check multi-rate-retry capabilities & adjust lookaround_rate */
-+      mrr_capable = mp->has_mrr &&
-+                    !txrc->rts &&
-+                    !txrc->bss_conf->use_cts_prot;
-+      if (mrr_capable)
-+              sampling_ratio = mp->lookaround_rate_mrr;
-       else
--              sample_rate = mp->lookaround_rate;
-+              sampling_ratio = mp->lookaround_rate;
-+
-+      /* init rateindex [ndx] with max throughput rate */
-+      ndx = mi->max_tp_rate[0];
-+      /* increase sum packet counter */
-       mi->packet_count++;
--      delta = (mi->packet_count * sample_rate / 100) -
-+
-+      delta = (mi->packet_count * sampling_ratio / 100) -
-                       (mi->sample_count + mi->sample_deferred / 2);
-       /* delta > 0: sampling required */
--      if ((delta > 0) && (mrr || !mi->prev_sample)) {
-+      if ((delta > 0) && (mrr_capable || !mi->prev_sample)) {
-               struct minstrel_rate *msr;
-               if (mi->packet_count >= 10000) {
-                       mi->sample_deferred = 0;
-@@ -271,21 +291,28 @@ minstrel_get_rate(void *priv, struct iee
-                       mi->sample_count += (delta - mi->n_rates * 2);
-               }
-+              /* get next random rate sample */
-               sample_ndx = minstrel_get_next_sample(mi);
-               msr = &mi->r[sample_ndx];
--              sample = true;
--              sample_slower = mrr && (msr->perfect_tx_time >
--                      mi->r[ndx].perfect_tx_time);
-+              rate_sampling = true;
--              if (!sample_slower) {
-+              /* Decide if direct ( 1st mrr stage) or indirect (2nd mrr stage)
-+               * rate sampling method should be used.
-+               * Respect such rates that are not sampled for 20 interations.
-+               */
-+              if (mrr_capable &&
-+                  msr->perfect_tx_time > mi->r[ndx].perfect_tx_time &&
-+                  msr->sample_skipped < 20)
-+                              indirect_rate_sampling = true;
+-      cfg80211_sme_free(wdev);
++      struct cfg80211_registered_device *rdev = wiphy_to_dev(wdev->wiphy);
 +
-+              if (!indirect_rate_sampling) {
-                       if (msr->sample_limit != 0) {
-                               ndx = sample_ndx;
-                               mi->sample_count++;
-                               if (msr->sample_limit > 0)
-                                       msr->sample_limit--;
--                      } else {
--                              sample = false;
--                      }
-+                      } else
-+                              rate_sampling = false;
-               } else {
-                       /* Only use IEEE80211_TX_CTL_RATE_CTRL_PROBE to mark
-                        * packets that have the sampling rate deferred to the
-@@ -297,34 +324,39 @@ minstrel_get_rate(void *priv, struct iee
-                       mi->sample_deferred++;
-               }
-       }
--      mi->prev_sample = sample;
-+      mi->prev_sample = rate_sampling;
-       /* If we're not using MRR and the sampling rate already
-        * has a probability of >95%, we shouldn't be attempting
-        * to use it, as this only wastes precious airtime */
--      if (!mrr && sample && (mi->r[ndx].probability > 17100))
--              ndx = mi->max_tp_rate;
-+      if (!mrr_capable && rate_sampling &&
-+         (mi->r[ndx].probability > MINSTREL_FRAC(95, 100)))
-+              ndx = mi->max_tp_rate[0];
-+      /* mrr setup for 1st stage */
-       ar[0].idx = mi->r[ndx].rix;
-       ar[0].count = minstrel_get_retry_count(&mi->r[ndx], info);
--      if (!mrr) {
--              if (!sample)
-+      /* non mrr setup for 2nd stage */
-+      if (!mrr_capable) {
-+              if (!rate_sampling)
-                       ar[0].count = mp->max_retry;
-               ar[1].idx = mi->lowest_rix;
-               ar[1].count = mp->max_retry;
-               return;
-       }
--      /* MRR setup */
--      if (sample) {
--              if (sample_slower)
-+      /* mrr setup for 2nd stage */
-+      if (rate_sampling) {
-+              if (indirect_rate_sampling)
-                       mrr_ndx[0] = sample_ndx;
-               else
--                      mrr_ndx[0] = mi->max_tp_rate;
-+                      mrr_ndx[0] = mi->max_tp_rate[0];
-       } else {
--              mrr_ndx[0] = mi->max_tp_rate2;
-+              mrr_ndx[0] = mi->max_tp_rate[1];
-       }
++      if (!wdev->conn)
++              return;
 +
-+      /* mrr setup for 3rd & 4th stage */
-       mrr_ndx[1] = mi->max_prob_rate;
-       mrr_ndx[2] = 0;
-       for (i = 1; i < 4; i++) {
-@@ -351,26 +383,21 @@ static void
- init_sample_table(struct minstrel_sta_info *mi)
- {
-       unsigned int i, col, new_idx;
--      unsigned int n_srates = mi->n_rates - 1;
-       u8 rnd[8];
-       mi->sample_column = 0;
--      mi->sample_idx = 0;
--      memset(mi->sample_table, 0, SAMPLE_COLUMNS * mi->n_rates);
-+      mi->sample_row = 0;
-+      memset(mi->sample_table, 0xff, SAMPLE_COLUMNS * mi->n_rates);
-       for (col = 0; col < SAMPLE_COLUMNS; col++) {
--              for (i = 0; i < n_srates; i++) {
-+              for (i = 0; i < mi->n_rates; i++) {
-                       get_random_bytes(rnd, sizeof(rnd));
--                      new_idx = (i + rnd[i & 7]) % n_srates;
-+                      new_idx = (i + rnd[i & 7]) % mi->n_rates;
--                      while (SAMPLE_TBL(mi, new_idx, col) != 0)
--                              new_idx = (new_idx + 1) % n_srates;
-+                      while (SAMPLE_TBL(mi, new_idx, col) != 0xff)
-+                              new_idx = (new_idx + 1) % mi->n_rates;
--                      /* Don't sample the slowest rate (i.e. slowest base
--                       * rate). We must presume that the slowest rate works
--                       * fine, or else other management frames will also be
--                       * failing and the link will break */
--                      SAMPLE_TBL(mi, new_idx, col) = i + 1;
-+                      SAMPLE_TBL(mi, new_idx, col) = i;
-               }
-       }
++      wdev->conn->state = CFG80211_CONN_AUTH_FAILED;
++      schedule_work(&rdev->conn_work);
  }
-@@ -542,9 +569,6 @@ minstrel_alloc(struct ieee80211_hw *hw, 
-       mp->lookaround_rate = 5;
-       mp->lookaround_rate_mrr = 10;
--      /* moving average weight for EWMA */
--      mp->ewma_level = 75;
--
-       /* maximum time that the hw is allowed to stay in one MRR segment */
-       mp->segment_size = 6000;
---- a/net/mac80211/rc80211_minstrel.h
-+++ b/net/mac80211/rc80211_minstrel.h
-@@ -9,6 +9,28 @@
- #ifndef __RC_MINSTREL_H
- #define __RC_MINSTREL_H
-+#define EWMA_LEVEL    75      /* ewma weighting factor [%] */
-+#define SAMPLE_COLUMNS        10      /* number of columns in sample table */
-+
-+
-+/* scaled fraction values */
-+#define MINSTREL_SCALE  16
-+#define MINSTREL_FRAC(val, div) (((val) << MINSTREL_SCALE) / div)
-+#define MINSTREL_TRUNC(val) ((val) >> MINSTREL_SCALE)
-+
-+/* number of highest throughput rates to consider*/
-+#define MAX_THR_RATES 4
-+
-+/*
-+ * Perform EWMA (Exponentially Weighted Moving Average) calculation
-+  */
-+static inline int
-+minstrel_ewma(int old, int new, int weight)
-+{
-+      return (new * (100 - weight) + old * weight) / 100;
-+}
-+
-+
- struct minstrel_rate {
-       int bitrate;
-       int rix;
-@@ -26,6 +48,7 @@ struct minstrel_rate {
-       u32 attempts;
-       u32 last_attempts;
-       u32 last_success;
-+      u8 sample_skipped;
  
-       /* parts per thousand */
-       u32 cur_prob;
-@@ -45,14 +68,13 @@ struct minstrel_sta_info {
+ void cfg80211_sme_disassoc(struct wireless_dev *wdev)
+@@ -399,7 +416,13 @@ void cfg80211_sme_disassoc(struct wirele
  
-       unsigned int lowest_rix;
--      unsigned int max_tp_rate;
--      unsigned int max_tp_rate2;
--      unsigned int max_prob_rate;
-+      u8 max_tp_rate[MAX_THR_RATES];
-+      u8 max_prob_rate;
-       unsigned int packet_count;
-       unsigned int sample_count;
-       int sample_deferred;
--      unsigned int sample_idx;
-+      unsigned int sample_row;
-       unsigned int sample_column;
-       int n_rates;
-@@ -73,7 +95,6 @@ struct minstrel_priv {
-       unsigned int cw_min;
-       unsigned int cw_max;
-       unsigned int max_retry;
--      unsigned int ewma_level;
-       unsigned int segment_size;
-       unsigned int update_interval;
-       unsigned int lookaround_rate;
---- a/net/mac80211/rc80211_minstrel_debugfs.c
-+++ b/net/mac80211/rc80211_minstrel_debugfs.c
-@@ -73,15 +73,17 @@ minstrel_stats_open(struct inode *inode,
-       for (i = 0; i < mi->n_rates; i++) {
-               struct minstrel_rate *mr = &mi->r[i];
--              *(p++) = (i == mi->max_tp_rate) ? 'T' : ' ';
--              *(p++) = (i == mi->max_tp_rate2) ? 't' : ' ';
-+              *(p++) = (i == mi->max_tp_rate[0]) ? 'A' : ' ';
-+              *(p++) = (i == mi->max_tp_rate[1]) ? 'B' : ' ';
-+              *(p++) = (i == mi->max_tp_rate[2]) ? 'C' : ' ';
-+              *(p++) = (i == mi->max_tp_rate[3]) ? 'D' : ' ';
-               *(p++) = (i == mi->max_prob_rate) ? 'P' : ' ';
-               p += sprintf(p, "%3u%s", mr->bitrate / 2,
-                               (mr->bitrate & 1 ? ".5" : "  "));
--              tp = mr->cur_tp / ((18000 << 10) / 96);
--              prob = mr->cur_prob / 18;
--              eprob = mr->probability / 18;
-+              tp = MINSTREL_TRUNC(mr->cur_tp / 10);
-+              prob = MINSTREL_TRUNC(mr->cur_prob * 1000);
-+              eprob = MINSTREL_TRUNC(mr->probability * 1000);
-               p += sprintf(p, "  %6u.%1u   %6u.%1u   %6u.%1u        "
-                               "%3u(%3u)   %8llu    %8llu\n",
---- a/drivers/net/wireless/ath/ath9k/ath9k.h
-+++ b/drivers/net/wireless/ath/ath9k/ath9k.h
-@@ -657,11 +657,10 @@ enum sc_op_flags {
- struct ath_rate_table;
- struct ath9k_vif_iter_data {
--      const u8 *hw_macaddr; /* phy's hardware address, set
--                             * before starting iteration for
--                             * valid bssid mask.
--                             */
-+      u8 hw_macaddr[ETH_ALEN]; /* address of the first vif */
-       u8 mask[ETH_ALEN]; /* bssid mask */
-+      bool has_hw_macaddr;
+ void cfg80211_sme_assoc_timeout(struct wireless_dev *wdev)
+ {
+-      cfg80211_sme_disassoc(wdev);
++      struct cfg80211_registered_device *rdev = wiphy_to_dev(wdev->wiphy);
 +
-       int naps;      /* number of AP vifs */
-       int nmeshes;   /* number of mesh vifs */
-       int nstations; /* number of station vifs */
---- a/drivers/net/wireless/ath/ath9k/main.c
-+++ b/drivers/net/wireless/ath/ath9k/main.c
-@@ -835,10 +835,14 @@ static void ath9k_vif_iter(void *data, u
-       struct ath9k_vif_iter_data *iter_data = data;
-       int i;
--      if (iter_data->hw_macaddr)
-+      if (iter_data->has_hw_macaddr) {
-               for (i = 0; i < ETH_ALEN; i++)
-                       iter_data->mask[i] &=
-                               ~(iter_data->hw_macaddr[i] ^ mac[i]);
-+      } else {
-+              memcpy(iter_data->hw_macaddr, mac, ETH_ALEN);
-+              iter_data->has_hw_macaddr = true;
-+      }
-       switch (vif->type) {
-       case NL80211_IFTYPE_AP:
-@@ -887,7 +891,6 @@ void ath9k_calculate_iter_data(struct ie
-        * together with the BSSID mask when matching addresses.
-        */
-       memset(iter_data, 0, sizeof(*iter_data));
--      iter_data->hw_macaddr = common->macaddr;
-       memset(&iter_data->mask, 0xff, ETH_ALEN);
-       if (vif)
-@@ -897,6 +900,8 @@ void ath9k_calculate_iter_data(struct ie
-       ieee80211_iterate_active_interfaces_atomic(
-               sc->hw, IEEE80211_IFACE_ITER_RESUME_ALL,
-               ath9k_vif_iter, iter_data);
++      if (!wdev->conn)
++              return;
 +
-+      memcpy(common->macaddr, iter_data->hw_macaddr, ETH_ALEN);
++      wdev->conn->state = CFG80211_CONN_ASSOC_FAILED;
++      schedule_work(&rdev->conn_work);
  }
  
- /* Called with sc->mutex held. */
-@@ -1304,6 +1309,7 @@ static int ath9k_sta_add(struct ieee8021
-       struct ath_common *common = ath9k_hw_common(sc->sc_ah);
-       struct ath_node *an = (struct ath_node *) sta->drv_priv;
-       struct ieee80211_key_conf ps_key = { };
-+      int key;
-       ath_node_attach(sc, sta, vif);
-@@ -1311,7 +1317,9 @@ static int ath9k_sta_add(struct ieee8021
-           vif->type != NL80211_IFTYPE_AP_VLAN)
-               return 0;
--      an->ps_key = ath_key_config(common, vif, sta, &ps_key);
-+      key = ath_key_config(common, vif, sta, &ps_key);
-+      if (key > 0)
-+              an->ps_key = key;
-       return 0;
- }
-@@ -1328,6 +1336,7 @@ static void ath9k_del_ps_key(struct ath_
-           return;
-       ath_key_delete(common, &ps_key);
-+      an->ps_key = 0;
- }
- static int ath9k_sta_remove(struct ieee80211_hw *hw,
---- a/drivers/net/wireless/ath/ath9k/reg.h
-+++ b/drivers/net/wireless/ath/ath9k/reg.h
-@@ -1493,9 +1493,6 @@ enum {
- #define AR9271_RADIO_RF_RST                   0x20
- #define AR9271_GATE_MAC_CTL                   0x4000
--#define AR_STA_ID0                 0x8000
--#define AR_STA_ID1                 0x8004
--#define AR_STA_ID1_SADH_MASK       0x0000FFFF
- #define AR_STA_ID1_STA_AP          0x00010000
- #define AR_STA_ID1_ADHOC           0x00020000
- #define AR_STA_ID1_PWR_SAV         0x00040000
---- a/drivers/net/wireless/ath/hw.c
-+++ b/drivers/net/wireless/ath/hw.c
-@@ -118,6 +118,12 @@
- void ath_hw_setbssidmask(struct ath_common *common)
- {
-       void *ah = common->ah;
-+      u32 id1;
-+
-+      REG_WRITE(ah, AR_STA_ID0, get_unaligned_le32(common->macaddr));
-+      id1 = REG_READ(ah, AR_STA_ID1) & ~AR_STA_ID1_SADH_MASK;
-+      id1 |= get_unaligned_le16(common->macaddr + 4);
-+      REG_WRITE(ah, AR_STA_ID1, id1);
-       REG_WRITE(ah, AR_BSSMSKL, get_unaligned_le32(common->bssidmask));
-       REG_WRITE(ah, AR_BSSMSKU, get_unaligned_le16(common->bssidmask + 4));
---- a/drivers/net/wireless/ath/reg.h
-+++ b/drivers/net/wireless/ath/reg.h
-@@ -23,6 +23,10 @@
- #define AR_MIBC_CMC           0x00000004
- #define AR_MIBC_MCS           0x00000008
-+#define AR_STA_ID0            0x8000
-+#define AR_STA_ID1            0x8004
-+#define AR_STA_ID1_SADH_MASK  0x0000ffff
-+
- /*
-  * BSSID mask registers. See ath_hw_set_bssid_mask()
-  * for detailed documentation about these registers.
+ static int cfg80211_sme_connect(struct wireless_dev *wdev,
index b8f2671..d7479f2 100644 (file)
@@ -1,6 +1,6 @@
 --- a/net/mac80211/cfg.c
 +++ b/net/mac80211/cfg.c
-@@ -2009,7 +2009,7 @@ static int ieee80211_scan(struct wiphy *
+@@ -2092,7 +2092,7 @@ static int ieee80211_scan(struct wiphy *
                 * the  frames sent while scanning on other channel will be
                 * lost)
                 */
diff --git a/package/mac80211/patches/320-ath9k_no_eeprom_name.patch b/package/mac80211/patches/320-ath9k_no_eeprom_name.patch
deleted file mode 100644 (file)
index 438094b..0000000
+++ /dev/null
@@ -1,24 +0,0 @@
---- a/drivers/net/wireless/ath/ath9k/init.c
-+++ b/drivers/net/wireless/ath/ath9k/init.c
-@@ -631,8 +631,8 @@ static int ath9k_init_softc(u16 devid, s
-       ath_read_cachesize(common, &csz);
-       common->cachelsz = csz << 2; /* convert to bytes */
--      if (pdata && pdata->eeprom_name) {
--              ret = ath9k_eeprom_request(sc, pdata->eeprom_name);
-+      if (0) {
-+              ret = ath9k_eeprom_request(sc, NULL);
-               if (ret)
-                       return ret;
-       }
---- a/include/linux/ath9k_platform.h
-+++ b/include/linux/ath9k_platform.h
-@@ -22,8 +22,6 @@
- #define ATH9K_PLAT_EEP_MAX_WORDS      2048
- struct ath9k_platform_data {
--      const char *eeprom_name;
--
-       u16 eeprom_data[ATH9K_PLAT_EEP_MAX_WORDS];
-       u8 *macaddr;
diff --git a/package/mac80211/patches/321-bcma_backport.patch b/package/mac80211/patches/321-bcma_backport.patch
deleted file mode 100644 (file)
index cf9f412..0000000
+++ /dev/null
@@ -1,42 +0,0 @@
---- a/drivers/net/wireless/b43/main.c
-+++ b/drivers/net/wireless/b43/main.c
-@@ -4697,7 +4697,7 @@ static int b43_wireless_core_init(struct
-       switch (dev->dev->bus_type) {
- #ifdef CONFIG_B43_BCMA
-       case B43_BUS_BCMA:
--              bcma_core_pci_irq_ctl(&dev->dev->bdev->bus->drv_pci[0],
-+              bcma_core_pci_irq_ctl(&dev->dev->bdev->bus->drv_pci,
-                                     dev->dev->bdev, true);
-               break;
- #endif
---- a/drivers/net/wireless/brcm80211/brcmsmac/aiutils.c
-+++ b/drivers/net/wireless/brcm80211/brcmsmac/aiutils.c
-@@ -694,7 +694,7 @@ void ai_pci_up(struct si_pub *sih)
-       sii = container_of(sih, struct si_info, pub);
-       if (sii->icbus->hosttype == BCMA_HOSTTYPE_PCI)
--              bcma_core_pci_extend_L1timer(&sii->icbus->drv_pci[0], true);
-+              bcma_core_pci_extend_L1timer(&sii->icbus->drv_pci, true);
- }
- /* Unconfigure and/or apply various WARs when going down */
-@@ -705,7 +705,7 @@ void ai_pci_down(struct si_pub *sih)
-       sii = container_of(sih, struct si_info, pub);
-       if (sii->icbus->hosttype == BCMA_HOSTTYPE_PCI)
--              bcma_core_pci_extend_L1timer(&sii->icbus->drv_pci[0], false);
-+              bcma_core_pci_extend_L1timer(&sii->icbus->drv_pci, false);
- }
- /* Enable BT-COEX & Ex-PA for 4313 */
---- a/drivers/net/wireless/brcm80211/brcmsmac/main.c
-+++ b/drivers/net/wireless/brcm80211/brcmsmac/main.c
-@@ -4979,7 +4979,7 @@ static int brcms_b_up_prep(struct brcms_
-        * Configure pci/pcmcia here instead of in brcms_c_attach()
-        * to allow mfg hotswap:  down, hotswap (chip power cycle), up.
-        */
--      bcma_core_pci_irq_ctl(&wlc_hw->d11core->bus->drv_pci[0], wlc_hw->d11core,
-+      bcma_core_pci_irq_ctl(&wlc_hw->d11core->bus->drv_pci, wlc_hw->d11core,
-                             true);
-       /*
index c91128d..aa5ce94 100644 (file)
@@ -1,6 +1,6 @@
 --- a/drivers/net/wireless/ath/Makefile
 +++ b/drivers/net/wireless/ath/Makefile
-@@ -10,7 +10,7 @@ obj-$(CONFIG_ATH_COMMON)     += ath.o
+@@ -11,7 +11,7 @@ obj-$(CPTCFG_ATH_COMMON)     += ath.o
  ath-objs :=   main.o \
                regd.o \
                hw.o \
@@ -8,15 +8,15 @@
 +              key.o \
 +              debug.o
  
--ath-$(CONFIG_ATH_DEBUG) += debug.o
+-ath-$(CPTCFG_ATH_DEBUG) += debug.o
  ccflags-y += -D__CHECK_ENDIAN__
 --- a/drivers/net/wireless/ath/ath.h
 +++ b/drivers/net/wireless/ath/ath.h
-@@ -281,13 +281,6 @@ void _ath_dbg(struct ath_common *common,
- #endif /* CONFIG_ATH_DEBUG */
+@@ -280,13 +280,6 @@ void _ath_dbg(struct ath_common *common,
+ #endif /* CPTCFG_ATH_DEBUG */
  
  /** Returns string describing opmode, or NULL if unknown mode. */
--#ifdef CONFIG_ATH_DEBUG
+-#ifdef CPTCFG_ATH_DEBUG
  const char *ath_opmode_to_string(enum nl80211_iftype opmode);
 -#else
 -static inline const char *ath_opmode_to_string(enum nl80211_iftype opmode)
index 421e785..b0cef87 100644 (file)
@@ -1,6 +1,6 @@
 --- a/drivers/net/wireless/ath/ath9k/init.c
 +++ b/drivers/net/wireless/ath/ath9k/init.c
-@@ -46,7 +46,7 @@ int ath9k_modparam_nohwcrypt;
+@@ -45,7 +45,7 @@ int ath9k_modparam_nohwcrypt;
  module_param_named(nohwcrypt, ath9k_modparam_nohwcrypt, int, 0444);
  MODULE_PARM_DESC(nohwcrypt, "Disable hardware encryption");
  
index 40c4cb7..b2a7073 100644 (file)
@@ -8,7 +8,7 @@
  #include <asm/unaligned.h>
  
  #include "hw.h"
-@@ -519,8 +520,16 @@ static int ath9k_hw_init_macaddr(struct 
+@@ -518,8 +519,16 @@ static int ath9k_hw_init_macaddr(struct 
                common->macaddr[2 * i] = eeval >> 8;
                common->macaddr[2 * i + 1] = eeval & 0xff;
        }
index 683417b..303c4d7 100644 (file)
@@ -1,46 +1,68 @@
 --- a/drivers/net/wireless/ath/regd.c
 +++ b/drivers/net/wireless/ath/regd.c
-@@ -198,6 +198,10 @@ ath_reg_apply_beaconing_flags(struct wip
+@@ -196,6 +196,10 @@ ath_reg_apply_beaconing_flags(struct wip
        struct ieee80211_channel *ch;
        unsigned int i;
  
-+#ifdef ATH_USER_REGD
++#ifdef CPTCFG_ATH_USER_REGD
 +      return;
 +#endif
 +
        for (band = 0; band < IEEE80211_NUM_BANDS; band++) {
  
                if (!wiphy->bands[band])
-@@ -252,6 +256,10 @@ ath_reg_apply_active_scan_flags(struct w
+@@ -250,6 +254,10 @@ ath_reg_apply_active_scan_flags(struct w
        struct ieee80211_channel *ch;
        const struct ieee80211_reg_rule *reg_rule;
  
-+#ifdef ATH_USER_REGD
++#ifdef CPTCFG_ATH_USER_REGD
 +      return;
 +#endif
 +
        sband = wiphy->bands[IEEE80211_BAND_2GHZ];
        if (!sband)
                return;
-@@ -301,6 +309,10 @@ static void ath_reg_apply_radar_flags(st
+@@ -299,6 +307,10 @@ static void ath_reg_apply_radar_flags(st
        struct ieee80211_channel *ch;
        unsigned int i;
  
-+#ifdef ATH_USER_REGD
++#ifdef CPTCFG_ATH_USER_REGD
 +      return;
 +#endif
 +
        if (!wiphy->bands[IEEE80211_BAND_5GHZ])
                return;
  
-@@ -505,6 +517,10 @@ ath_regd_init_wiphy(struct ath_regulator
+@@ -503,6 +515,10 @@ ath_regd_init_wiphy(struct ath_regulator
  {
        const struct ieee80211_regdomain *regd;
  
-+#ifdef ATH_USER_REGD
++#ifdef CPTCFG_ATH_USER_REGD
 +      return 0;
 +#endif
 +
        wiphy->reg_notifier = reg_notifier;
        wiphy->flags |= WIPHY_FLAG_STRICT_REGULATORY;
  
+--- a/drivers/net/wireless/ath/Kconfig
++++ b/drivers/net/wireless/ath/Kconfig
+@@ -21,6 +21,9 @@ menuconfig ATH_CARDS
+ if ATH_CARDS
++config ATH_USER_REGD
++      bool "Do not enforce EEPROM regulatory restrictions"
++
+ config ATH_DEBUG
+       bool "Atheros wireless debugging"
+       ---help---
+--- a/.local-symbols
++++ b/.local-symbols
+@@ -123,6 +123,7 @@ RTL8187_LEDS=
+ ATH_COMMON=
+ ATH_CARDS=
+ ATH_DEBUG=
++ATH_USER_REGD=
+ ATH5K=
+ ATH5K_DEBUG=
+ ATH5K_TRACER=
index d609b55..7a5840e 100644 (file)
@@ -1,16 +1,16 @@
 --- a/drivers/net/wireless/ath/regd.c
 +++ b/drivers/net/wireless/ath/regd.c
-@@ -44,7 +44,8 @@ static int __ath_regd_init(struct ath_re
+@@ -42,7 +42,8 @@ static int __ath_regd_init(struct ath_re
                                NL80211_RRF_PASSIVE_SCAN | NL80211_RRF_NO_OFDM)
  
  /* We allow IBSS on these on a case by case basis by regulatory domain */
--#define ATH9K_5GHZ_5150_5350  REG_RULE(5150-10, 5350+10, 40, 0, 30,\
-+#define ATH9K_5GHZ_5150_5350  REG_RULE(5150-10, 5250, 40, 0, 30, 0), \
-+                              REG_RULE(5250, 5350+10, 40, 0, 30,\
+-#define ATH9K_5GHZ_5150_5350  REG_RULE(5150-10, 5350+10, 80, 0, 30,\
++#define ATH9K_5GHZ_5150_5350  REG_RULE(5150-10, 5250, 80, 0, 30, 0), \
++                              REG_RULE(5250, 5350+10, 80, 0, 30,\
                                NL80211_RRF_PASSIVE_SCAN | NL80211_RRF_NO_IBSS)
- #define ATH9K_5GHZ_5470_5850  REG_RULE(5470-10, 5850+10, 40, 0, 30,\
+ #define ATH9K_5GHZ_5470_5850  REG_RULE(5470-10, 5850+10, 80, 0, 30,\
                                NL80211_RRF_PASSIVE_SCAN | NL80211_RRF_NO_IBSS)
-@@ -62,57 +63,56 @@ static int __ath_regd_init(struct ath_re
+@@ -60,57 +61,56 @@ static int __ath_regd_init(struct ath_re
  #define ATH9K_5GHZ_NO_MIDBAND ATH9K_5GHZ_5150_5350, \
                                ATH9K_5GHZ_5725_5850
  
index 938ac42..5380853 100644 (file)
@@ -1,15 +1,15 @@
 --- a/net/wireless/reg.c
 +++ b/net/wireless/reg.c
-@@ -1730,6 +1730,8 @@ void regulatory_hint_11d(struct wiphy *w
+@@ -1696,6 +1696,8 @@ void regulatory_hint_11d(struct wiphy *w
        enum environment_cap env = ENVIRON_ANY;
-       struct regulatory_request *request, *lr;
+       struct regulatory_request *request = NULL, *lr;
  
 +      return;
 +
-       mutex_lock(&reg_mutex);
-       lr = get_last_request();
-@@ -1926,6 +1928,7 @@ static void restore_regulatory_settings(
+       /* IE len must be evenly divisible by 2 */
+       if (country_ie_len & 0x01)
+               return;
+@@ -1890,6 +1892,7 @@ static void restore_regulatory_settings(
  
  void regulatory_hint_disconnect(void)
  {
index 7a07eb6..f6182dd 100644 (file)
@@ -1,10 +1,10 @@
 --- a/drivers/net/wireless/ath/ath9k/init.c
 +++ b/drivers/net/wireless/ath/ath9k/init.c
-@@ -727,6 +727,7 @@ static const struct ieee80211_iface_limi
+@@ -755,6 +755,7 @@ static const struct ieee80211_iface_limi
  #endif
                                 BIT(NL80211_IFTYPE_AP) |
                                 BIT(NL80211_IFTYPE_P2P_GO) },
 +      { .max = 1,     .types = BIT(NL80211_IFTYPE_ADHOC) },
  };
  
- static const struct ieee80211_iface_combination if_comb = {
index 22d9113..12e03e1 100644 (file)
@@ -1,6 +1,6 @@
 --- a/drivers/net/wireless/ath/ath5k/mac80211-ops.c
 +++ b/drivers/net/wireless/ath/ath5k/mac80211-ops.c
-@@ -89,13 +89,8 @@ ath5k_add_interface(struct ieee80211_hw 
+@@ -86,13 +86,8 @@ ath5k_add_interface(struct ieee80211_hw 
                goto end;
        }
  
@@ -18,7 +18,7 @@
                goto end;
 --- a/drivers/net/wireless/ath/ath5k/base.c
 +++ b/drivers/net/wireless/ath/ath5k/base.c
-@@ -1868,7 +1868,7 @@ ath5k_beacon_send(struct ath5k_hw *ah)
+@@ -1916,7 +1916,7 @@ ath5k_beacon_send(struct ath5k_hw *ah)
        }
  
        if ((ah->opmode == NL80211_IFTYPE_AP && ah->num_ap_vifs +
@@ -27,7 +27,7 @@
                        ah->opmode == NL80211_IFTYPE_MESH_POINT) {
                u64 tsf = ath5k_hw_get_tsf64(ah);
                u32 tsftu = TSF_TO_TU(tsf);
-@@ -1954,7 +1954,7 @@ ath5k_beacon_update_timers(struct ath5k_
+@@ -2002,7 +2002,7 @@ ath5k_beacon_update_timers(struct ath5k_
  
        intval = ah->bintval & AR5K_BEACON_PERIOD;
        if (ah->opmode == NL80211_IFTYPE_AP && ah->num_ap_vifs
@@ -36,7 +36,7 @@
                intval /= ATH_BCBUF;    /* staggered multi-bss beacons */
                if (intval < 15)
                        ATH5K_WARN(ah, "intval %u is too low, min 15\n",
-@@ -2418,6 +2418,7 @@ static const struct ieee80211_iface_limi
+@@ -2469,6 +2469,7 @@ static const struct ieee80211_iface_limi
                                 BIT(NL80211_IFTYPE_MESH_POINT) |
  #endif
                                 BIT(NL80211_IFTYPE_AP) },
index 48b8467..414f495 100644 (file)
@@ -1,6 +1,6 @@
 --- a/drivers/net/wireless/ath/ath5k/reset.c
 +++ b/drivers/net/wireless/ath/ath5k/reset.c
-@@ -1158,6 +1158,7 @@ ath5k_hw_reset(struct ath5k_hw *ah, enum
+@@ -1154,6 +1154,7 @@ ath5k_hw_reset(struct ath5k_hw *ah, enum
        tsf_lo = 0;
        mode = 0;
  
@@ -8,7 +8,7 @@
        /*
         * Sanity check for fast flag
         * Fast channel change only available
-@@ -1165,6 +1166,7 @@ ath5k_hw_reset(struct ath5k_hw *ah, enum
+@@ -1161,6 +1162,7 @@ ath5k_hw_reset(struct ath5k_hw *ah, enum
         */
        if (fast && (ah->ah_radio != AR5K_RF2413) &&
        (ah->ah_radio != AR5K_RF5413))
index 6cafa23..a223b38 100644 (file)
@@ -1,6 +1,6 @@
 --- a/drivers/net/wireless/ath/ath5k/pci.c
 +++ b/drivers/net/wireless/ath/ath5k/pci.c
-@@ -23,6 +23,7 @@
+@@ -21,6 +21,7 @@
  #include <linux/pci-aspm.h>
  #include <linux/etherdevice.h>
  #include <linux/module.h>
@@ -8,7 +8,7 @@
  #include "../ath.h"
  #include "ath5k.h"
  #include "debug.h"
-@@ -74,7 +75,7 @@ static void ath5k_pci_read_cachesize(str
+@@ -72,7 +73,7 @@ static void ath5k_pci_read_cachesize(str
  }
  
  /*
@@ -17,7 +17,7 @@
   */
  static bool
  ath5k_pci_eeprom_read(struct ath_common *common, u32 offset, u16 *data)
-@@ -82,6 +83,19 @@ ath5k_pci_eeprom_read(struct ath_common 
+@@ -80,6 +81,19 @@ ath5k_pci_eeprom_read(struct ath_common 
        struct ath5k_hw *ah = (struct ath5k_hw *) common->ah;
        u32 status, timeout;
  
@@ -37,7 +37,7 @@
        /*
         * Initialize EEPROM access
         */
-@@ -125,6 +139,16 @@ static int ath5k_pci_eeprom_read_mac(str
+@@ -123,6 +137,16 @@ static int ath5k_pci_eeprom_read_mac(str
        u16 data;
        int octet;
  
index 8db5e1b..e5c85ce 100644 (file)
@@ -1,6 +1,6 @@
 --- a/drivers/net/wireless/ath/ath5k/pci.c
 +++ b/drivers/net/wireless/ath/ath5k/pci.c
-@@ -50,6 +50,8 @@ static DEFINE_PCI_DEVICE_TABLE(ath5k_pci
+@@ -48,6 +48,8 @@ static DEFINE_PCI_DEVICE_TABLE(ath5k_pci
        { PCI_VDEVICE(ATHEROS, 0x001b) }, /* 5413 Eagle */
        { PCI_VDEVICE(ATHEROS, 0x001c) }, /* PCI-E cards */
        { PCI_VDEVICE(ATHEROS, 0x001d) }, /* 2417 Nala */
index a2141ab..01c28bc 100644 (file)
@@ -11,7 +11,7 @@ drivers/net/wireless/ath/ath5k/debug.c |   86 ++++++++++++++++++++++++++++++++
 
 --- a/drivers/net/wireless/ath/ath5k/debug.c
 +++ b/drivers/net/wireless/ath/ath5k/debug.c
-@@ -813,6 +813,89 @@ static const struct file_operations fops
+@@ -811,6 +811,89 @@ static const struct file_operations fops
        .llseek = default_llseek,
  };
  
@@ -101,7 +101,7 @@ drivers/net/wireless/ath/ath5k/debug.c |   86 ++++++++++++++++++++++++++++++++
  
  /* debugfs: queues etc */
  
-@@ -904,6 +987,9 @@ ath5k_debug_init_device(struct ath5k_hw 
+@@ -902,6 +985,9 @@ ath5k_debug_init_device(struct ath5k_hw 
        debugfs_create_file("beacon", S_IWUSR | S_IRUSR, phydir, ah,
                            &fops_beacon);
  
index 285fce2..7f4e68d 100644 (file)
@@ -1,7 +1,7 @@
 --- a/drivers/net/wireless/ath/ath9k/debug.c
 +++ b/drivers/net/wireless/ath/ath9k/debug.c
-@@ -2003,6 +2003,53 @@ void ath9k_get_et_stats(struct ieee80211
-       WARN_ON(i != ATH9K_SSTATS_LEN);
+@@ -1735,6 +1735,53 @@ void ath9k_deinit_debug(struct ath_softc
+       }
  }
  
 +static ssize_t read_file_eeprom(struct file *file, char __user *user_buf,
@@ -54,7 +54,7 @@
  int ath9k_init_debug(struct ath_hw *ah)
  {
        struct ath_common *common = ath9k_hw_common(ah);
-@@ -2020,6 +2067,8 @@ int ath9k_init_debug(struct ath_hw *ah)
+@@ -1752,6 +1799,8 @@ int ath9k_init_debug(struct ath_hw *ah)
  
        ath9k_dfs_init_debug(sc);
  
index 06c34b7..b98e8f5 100644 (file)
@@ -71,7 +71,7 @@
  
 --- a/drivers/net/wireless/ath/ath9k/hw.h
 +++ b/drivers/net/wireless/ath/ath9k/hw.h
-@@ -740,6 +740,7 @@ enum ath_cal_list {
+@@ -739,6 +739,7 @@ enum ath_cal_list {
  #define AH_USE_EEPROM   0x1
  #define AH_UNPLUGGED    0x2 /* The card has been physically removed. */
  #define AH_FASTCC       0x4
@@ -81,7 +81,7 @@
        struct ath_ops reg_ops;
 --- a/drivers/net/wireless/ath/ath9k/init.c
 +++ b/drivers/net/wireless/ath/ath9k/init.c
-@@ -587,6 +587,8 @@ static int ath9k_init_softc(u16 devid, s
+@@ -613,6 +613,8 @@ static int ath9k_init_softc(u16 devid, s
                ah->is_clk_25mhz = pdata->is_clk_25mhz;
                ah->get_mac_revision = pdata->get_mac_revision;
                ah->external_reset = pdata->external_reset;
@@ -92,7 +92,7 @@
        common = ath9k_hw_common(ah);
 --- a/include/linux/ath9k_platform.h
 +++ b/include/linux/ath9k_platform.h
-@@ -29,6 +29,7 @@ struct ath9k_platform_data {
+@@ -31,6 +31,7 @@ struct ath9k_platform_data {
        u32 gpio_mask;
        u32 gpio_val;
  
index 8884163..03199d8 100644 (file)
@@ -1,6 +1,6 @@
 --- a/drivers/net/wireless/ath/ath9k/init.c
 +++ b/drivers/net/wireless/ath/ath9k/init.c
-@@ -965,23 +965,23 @@ static int __init ath9k_init(void)
+@@ -1011,23 +1011,23 @@ static int __init ath9k_init(void)
                goto err_out;
        }
  
index 855b336..647bde2 100644 (file)
@@ -1,6 +1,6 @@
 --- a/drivers/net/wireless/ath/ath9k/hw.c
 +++ b/drivers/net/wireless/ath/ath9k/hw.c
-@@ -1946,8 +1946,8 @@ int ath9k_hw_reset(struct ath_hw *ah, st
+@@ -2010,8 +2010,8 @@ int ath9k_hw_reset(struct ath_hw *ah, st
                REG_WRITE(ah, AR_OBS, 8);
  
        if (ah->config.rx_intr_mitigation) {
index 4156773..681291d 100644 (file)
@@ -1,6 +1,6 @@
 --- a/drivers/net/wireless/ath/ath9k/ath9k.h
 +++ b/drivers/net/wireless/ath/ath9k/ath9k.h
-@@ -689,6 +689,7 @@ struct ath_softc {
+@@ -701,6 +701,7 @@ struct ath_softc {
        struct ieee80211_hw *hw;
        struct device *dev;
  
@@ -8,7 +8,7 @@
        struct survey_info *cur_survey;
        struct survey_info survey[ATH9K_NUM_CHANNELS];
  
-@@ -893,6 +894,7 @@ struct fft_sample_ht20 {
+@@ -905,6 +906,7 @@ struct fft_sample_ht20 {
        u8 data[SPECTRAL_HT20_NUM_BINS];
  } __packed;
  
@@ -18,7 +18,7 @@
  
 --- a/drivers/net/wireless/ath/ath9k/debug.c
 +++ b/drivers/net/wireless/ath/ath9k/debug.c
-@@ -2050,6 +2050,50 @@ static const struct file_operations fops
+@@ -1782,6 +1782,50 @@ static const struct file_operations fops
        .owner = THIS_MODULE
  };
  
@@ -69,7 +69,7 @@
  int ath9k_init_debug(struct ath_hw *ah)
  {
        struct ath_common *common = ath9k_hw_common(ah);
-@@ -2069,6 +2113,8 @@ int ath9k_init_debug(struct ath_hw *ah)
+@@ -1801,6 +1845,8 @@ int ath9k_init_debug(struct ath_hw *ah)
  
        debugfs_create_file("eeprom", S_IRUSR, sc->debug.debugfs_phy, sc,
                            &fops_eeprom);
@@ -80,7 +80,7 @@
        debugfs_create_file("interrupt", S_IRUSR, sc->debug.debugfs_phy, sc,
 --- a/drivers/net/wireless/ath/ath9k/main.c
 +++ b/drivers/net/wireless/ath/ath9k/main.c
-@@ -1136,7 +1136,7 @@ int ath9k_spectral_scan_config(struct ie
+@@ -1139,7 +1139,7 @@ int ath9k_spectral_scan_config(struct ie
        return 0;
  }
  
  {
        struct ath_softc *sc = hw->priv;
        struct ath_hw *ah = sc->sc_ah;
-@@ -1190,9 +1190,11 @@ static int ath9k_config(struct ieee80211
-       if ((changed & IEEE80211_CONF_CHANGE_CHANNEL) || reset_channel) {
-               struct ieee80211_channel *curchan = hw->conf.channel;
+@@ -1195,9 +1195,11 @@ static int ath9k_config(struct ieee80211
+               struct ieee80211_channel *curchan = hw->conf.chandef.chan;
+               enum nl80211_channel_type channel_type =
+                       cfg80211_get_chandef_type(&conf->chandef);
 +              struct ath9k_channel *hchan;
                int pos = curchan->hw_value;
                int old_pos = -1;
  
                if (ah->curchan)
                        old_pos = ah->curchan - &ah->channels[0];
-@@ -1235,7 +1237,23 @@ static int ath9k_config(struct ieee80211
+@@ -1233,7 +1235,23 @@ static int ath9k_config(struct ieee80211
                        memset(&sc->survey[pos], 0, sizeof(struct survey_info));
                }
  
index f0ed3d9..837d9f6 100644 (file)
@@ -1,16 +1,16 @@
 --- a/include/net/mac80211.h
 +++ b/include/net/mac80211.h
-@@ -1554,6 +1554,7 @@ struct ieee80211_hw {
+@@ -1616,6 +1616,7 @@ struct ieee80211_hw {
        u8 max_tx_aggregation_subframes;
        u8 offchannel_tx_hw_queue;
        u8 radiotap_mcs_details;
 +      s8 cur_power_level;
        u16 radiotap_vht_details;
        netdev_features_t netdev_features;
};
      u8 uapsd_queues;
 --- a/net/mac80211/cfg.c
 +++ b/net/mac80211/cfg.c
-@@ -2190,7 +2190,9 @@ static int ieee80211_get_tx_power(struct
+@@ -2273,7 +2273,9 @@ static int ieee80211_get_tx_power(struct
        struct ieee80211_local *local = wiphy_priv(wiphy);
        struct ieee80211_sub_if_data *sdata = IEEE80211_WDEV_TO_SUB_IF(wdev);
  
@@ -23,7 +23,7 @@
                *dbm = sdata->vif.bss_conf.txpower;
 --- a/net/mac80211/main.c
 +++ b/net/mac80211/main.c
-@@ -166,6 +166,7 @@ static u32 ieee80211_hw_conf_chan(struct
+@@ -167,6 +167,7 @@ static u32 ieee80211_hw_conf_chan(struct
  
        if (local->hw.conf.power_level != power) {
                changed |= IEEE80211_CONF_CHANGE_POWER;
index f4c1f5d..87a316c 100644 (file)
@@ -1,6 +1,6 @@
 --- a/drivers/net/wireless/ath/ath9k/main.c
 +++ b/drivers/net/wireless/ath/ath9k/main.c
-@@ -1260,6 +1260,8 @@ int ath9k_config(struct ieee80211_hw *hw
+@@ -1258,6 +1258,8 @@ int ath9k_config(struct ieee80211_hw *hw
                        return -EINVAL;
                }
  
@@ -9,7 +9,7 @@
                /*
                 * The most recent snapshot of channel->noisefloor for the old
                 * channel is only available after the hardware reset. Copy it to
-@@ -1279,6 +1281,7 @@ int ath9k_config(struct ieee80211_hw *hw
+@@ -1294,6 +1296,7 @@ int ath9k_config(struct ieee80211_hw *hw
                sc->config.txpowlimit = 2 * conf->power_level;
                ath9k_cmn_update_txpow(ah, sc->curtxpow,
                                       sc->config.txpowlimit, &sc->curtxpow);
index 6808cc4..50dbcd9 100644 (file)
@@ -1,121 +1,3 @@
---- a/include/net/mac80211.h
-+++ b/include/net/mac80211.h
-@@ -839,6 +839,9 @@ enum mac80211_rx_flags {
-  * @signal: signal strength when receiving this frame, either in dBm, in dB or
-  *    unspecified depending on the hardware capabilities flags
-  *    @IEEE80211_HW_SIGNAL_*
-+ * @chains: bitmask of receive chains for which separate signal strength
-+ *    values were filled.
-+ * @chain_signal: per-chain signal strength, same format as @signal
-  * @antenna: antenna used
-  * @rate_idx: index of data rate into band's supported rates or MCS index if
-  *    HT or VHT is used (%RX_FLAG_HT/%RX_FLAG_VHT)
-@@ -870,6 +873,8 @@ struct ieee80211_rx_status {
-       u8 band;
-       u8 antenna;
-       s8 signal;
-+      u8 chains;
-+      s8 chain_signal[4];
-       u8 ampdu_delimiter_crc;
-       u8 vendor_radiotap_align;
-       u8 vendor_radiotap_oui[3];
---- a/net/mac80211/sta_info.h
-+++ b/net/mac80211/sta_info.h
-@@ -342,6 +342,11 @@ struct sta_info {
-       int last_signal;
-       struct ewma avg_signal;
-       int last_ack_signal;
-+
-+      u8 chains;
-+      s8 chain_signal_last[4];
-+      struct ewma chain_signal_avg[4];
-+
-       /* Plus 1 for non-QoS frames */
-       __le16 last_seq_ctrl[IEEE80211_NUM_TIDS + 1];
---- a/net/mac80211/rx.c
-+++ b/net/mac80211/rx.c
-@@ -1383,6 +1383,7 @@ ieee80211_rx_h_sta_process(struct ieee80
-       struct sk_buff *skb = rx->skb;
-       struct ieee80211_rx_status *status = IEEE80211_SKB_RXCB(skb);
-       struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
-+      int i;
-       if (!sta)
-               return RX_CONTINUE;
-@@ -1433,6 +1434,19 @@ ieee80211_rx_h_sta_process(struct ieee80
-               ewma_add(&sta->avg_signal, -status->signal);
-       }
-+      if (status->chains) {
-+              sta->chains = status->chains;
-+              for (i = 0; i < 4; i++) {
-+                      int signal = status->chain_signal[i];
-+
-+                      if (!(status->chains & BIT(i)))
-+                              continue;
-+
-+                      sta->chain_signal_last[i] = signal;
-+                      ewma_add(&sta->chain_signal_avg[i], -signal);
-+              }
-+      }
-+
-       /*
-        * Change STA power saving mode only at the end of a frame
-        * exchange sequence.
---- a/net/mac80211/sta_info.c
-+++ b/net/mac80211/sta_info.c
-@@ -353,6 +353,8 @@ struct sta_info *sta_info_alloc(struct i
-       do_posix_clock_monotonic_gettime(&uptime);
-       sta->last_connected = uptime.tv_sec;
-       ewma_init(&sta->avg_signal, 1024, 8);
-+      for (i = 0; i < ARRAY_SIZE(sta->chain_signal_avg); i++)
-+              ewma_init(&sta->chain_signal_avg[i], 1024, 8);
-       if (sta_prepare_rate_control(local, sta, gfp)) {
-               kfree(sta);
---- a/include/net/cfg80211.h
-+++ b/include/net/cfg80211.h
-@@ -721,6 +721,8 @@ struct station_parameters {
-  * @STATION_INFO_LOCAL_PM: @local_pm filled
-  * @STATION_INFO_PEER_PM: @peer_pm filled
-  * @STATION_INFO_NONPEER_PM: @nonpeer_pm filled
-+ * @STATION_INFO_CHAIN_SIGNAL: @chain_signal filled
-+ * @STATION_INFO_CHAIN_SIGNAL_AVG: @chain_signal_avg filled
-  */
- enum station_info_flags {
-       STATION_INFO_INACTIVE_TIME      = 1<<0,
-@@ -749,6 +751,8 @@ enum station_info_flags {
-       STATION_INFO_NONPEER_PM         = 1<<23,
-       STATION_INFO_RX_BYTES64         = 1<<24,
-       STATION_INFO_TX_BYTES64         = 1<<25,
-+      STATION_INFO_CHAIN_SIGNAL       = 1<<26,
-+      STATION_INFO_CHAIN_SIGNAL_AVG   = 1<<27,
- };
- /**
-@@ -842,6 +846,9 @@ struct sta_bss_parameters {
-  *    For CFG80211_SIGNAL_TYPE_MBM, value is expressed in _dBm_.
-  * @signal_avg: Average signal strength, type depends on the wiphy's signal_type.
-  *    For CFG80211_SIGNAL_TYPE_MBM, value is expressed in _dBm_.
-+ * @chains: bitmask for filled values in @chain_signal, @chain_signal_avg
-+ * @chain_signal: per-chain signal strength of last received packet in dBm
-+ * @chain_signal_avg: per-chain signal strength average in dBm
-  * @txrate: current unicast bitrate from this station
-  * @rxrate: current unicast bitrate to this station
-  * @rx_packets: packets received from this station
-@@ -877,6 +884,11 @@ struct station_info {
-       u8 plink_state;
-       s8 signal;
-       s8 signal_avg;
-+
-+      u8 chains;
-+      s8 chain_signal[4];
-+      s8 chain_signal_avg[4];
-+
-       struct rate_info txrate;
-       struct rate_info rxrate;
-       u32 rx_packets;
 --- a/drivers/net/wireless/ath/ath9k/mac.h
 +++ b/drivers/net/wireless/ath/ath9k/mac.h
 @@ -133,12 +133,8 @@ struct ath_rx_status {
        u8 rs_num_delims;
 --- a/drivers/net/wireless/ath/ath9k/recv.c
 +++ b/drivers/net/wireless/ath/ath9k/recv.c
-@@ -937,6 +937,7 @@ static int ath9k_rx_skb_preprocess(struc
-                                  bool *decrypt_error)
- {
-       struct ath_hw *ah = common->ah;
+@@ -939,6 +939,7 @@ static int ath9k_rx_skb_preprocess(struc
+       struct ath_hw *ah = sc->sc_ah;
+       struct ath_common *common = ath9k_hw_common(ah);
+       bool discard_current = sc->rx.discard_next;
 +      int i, j;
  
-       /*
-        * everything but the rate is checked here, the rate check is done
-@@ -962,6 +963,20 @@ static int ath9k_rx_skb_preprocess(struc
+       sc->rx.discard_next = rx_stats->rs_more;
+       if (discard_current)
+@@ -968,6 +969,21 @@ static int ath9k_rx_skb_preprocess(struc
        if (rx_stats->rs_moreaggr)
                rx_status->flag |= RX_FLAG_NO_SIGNAL_VAL;
  
 +              j++;
 +      }
 +
++
+       sc->rx.discard_next = false;
        return 0;
  }
-@@ -1070,7 +1085,7 @@ static int ath_process_fft(struct ath_so
+@@ -1077,7 +1093,7 @@ static int ath_process_fft(struct ath_so
        fft_sample.tlv.length = __cpu_to_be16(length);
  
        fft_sample.freq = __cpu_to_be16(ah->curchan->chan->center_freq);
        switch (len - SPECTRAL_HT20_TOTAL_DATA_LEN) {
 --- a/drivers/net/wireless/ath/ath9k/ar9003_mac.c
 +++ b/drivers/net/wireless/ath/ath9k/ar9003_mac.c
-@@ -475,12 +475,12 @@ int ath9k_hw_process_rxdesc_edma(struct 
+@@ -476,12 +476,12 @@ int ath9k_hw_process_rxdesc_edma(struct 
  
        /* XXX: Keycache */
        rxs->rs_rssi = MS(rxsp->status5, AR_RxRSSICombined);
                rxs->rs_keyix = MS(rxsp->status11, AR_KeyIdx);
 --- a/drivers/net/wireless/ath/ath9k/mac.c
 +++ b/drivers/net/wireless/ath/ath9k/mac.c
-@@ -553,25 +553,25 @@ int ath9k_hw_rxprocdesc(struct ath_hw *a
+@@ -554,25 +554,25 @@ int ath9k_hw_rxprocdesc(struct ath_hw *a
  
        if (ads.ds_rxstatus8 & AR_PostDelimCRCErr) {
                rs->rs_rssi = ATH9K_RSSI_BAD;
                                                AR_RxRSSIAnt12);
        }
        if (ads.ds_rxstatus8 & AR_RxKeyIdxValid)
---- a/drivers/net/wireless/ath/ath9k/debug.c
-+++ b/drivers/net/wireless/ath/ath9k/debug.c
-@@ -940,12 +940,12 @@ void ath_debug_stat_rx(struct ath_softc 
- #ifdef CONFIG_ATH9K_MAC_DEBUG
-       spin_lock(&sc->debug.samp_lock);
-       RX_SAMP_DBG(jiffies) = jiffies;
--      RX_SAMP_DBG(rssi_ctl0) = rs->rs_rssi_ctl0;
--      RX_SAMP_DBG(rssi_ctl1) = rs->rs_rssi_ctl1;
--      RX_SAMP_DBG(rssi_ctl2) = rs->rs_rssi_ctl2;
--      RX_SAMP_DBG(rssi_ext0) = rs->rs_rssi_ext0;
--      RX_SAMP_DBG(rssi_ext1) = rs->rs_rssi_ext1;
--      RX_SAMP_DBG(rssi_ext2) = rs->rs_rssi_ext2;
-+      RX_SAMP_DBG(rssi_ctl0) = rs->rs_rssi_ctl[0];
-+      RX_SAMP_DBG(rssi_ctl1) = rs->rs_rssi_ctl[1];
-+      RX_SAMP_DBG(rssi_ctl2) = rs->rs_rssi_ctl[2];
-+      RX_SAMP_DBG(rssi_ext0) = rs->rs_rssi_ext[0];
-+      RX_SAMP_DBG(rssi_ext1) = rs->rs_rssi_ext[1];
-+      RX_SAMP_DBG(rssi_ext2) = rs->rs_rssi_ext[2];
-       RX_SAMP_DBG(antenna) = rs->rs_antenna;
-       RX_SAMP_DBG(rssi) = rs->rs_rssi;
-       RX_SAMP_DBG(rate) = rs->rs_rate;
---- a/include/uapi/linux/nl80211.h
-+++ b/include/uapi/linux/nl80211.h
-@@ -1918,6 +1918,8 @@ enum nl80211_sta_bss_param {
-  * @NL80211_STA_INFO_PEER_PM: peer mesh STA link-specific power mode
-  * @NL80211_STA_INFO_NONPEER_PM: neighbor mesh STA power save mode towards
-  *    non-peer STA
-+ * @NL80211_STA_INFO_CHAIN_SIGNAL: per-chain signal strength of last PPDU
-+ * @NL80211_STA_INFO_CHAIN_SIGNAL_AVG: per-chain signal strength average
-  * @__NL80211_STA_INFO_AFTER_LAST: internal
-  * @NL80211_STA_INFO_MAX: highest possible station info attribute
-  */
-@@ -1947,6 +1949,8 @@ enum nl80211_sta_info {
-       NL80211_STA_INFO_NONPEER_PM,
-       NL80211_STA_INFO_RX_BYTES64,
-       NL80211_STA_INFO_TX_BYTES64,
-+      NL80211_STA_INFO_CHAIN_SIGNAL,
-+      NL80211_STA_INFO_CHAIN_SIGNAL_AVG,
-       /* keep last */
-       __NL80211_STA_INFO_AFTER_LAST,
---- a/net/wireless/nl80211.c
-+++ b/net/wireless/nl80211.c
-@@ -3082,6 +3082,32 @@ static bool nl80211_put_sta_rate(struct 
-       return true;
- }
-+static bool nl80211_put_signal(struct sk_buff *msg, u8 mask, s8 *signal,
-+                             int id)
-+{
-+      void *attr;
-+      int i = 0;
-+
-+      if (!mask)
-+              return true;
-+
-+      attr = nla_nest_start(msg, id);
-+      if (!attr)
-+              return false;
-+
-+      for (i = 0; i < 4; i++) {
-+              if (!(mask & BIT(i)))
-+                      continue;
-+
-+              if (nla_put_u8(msg, i, signal[i]))
-+                      return false;
-+      }
-+
-+      nla_nest_end(msg, attr);
-+
-+      return true;
-+}
-+
- static int nl80211_send_station(struct sk_buff *msg, u32 portid, u32 seq,
-                               int flags,
-                               struct cfg80211_registered_device *rdev,
-@@ -3153,6 +3179,18 @@ static int nl80211_send_station(struct s
-       default:
-               break;
-       }
-+      if (sinfo->filled & STATION_INFO_CHAIN_SIGNAL) {
-+              if (!nl80211_put_signal(msg, sinfo->chains,
-+                                      sinfo->chain_signal,
-+                                      NL80211_STA_INFO_CHAIN_SIGNAL))
-+                      goto nla_put_failure;
-+      }
-+      if (sinfo->filled & STATION_INFO_CHAIN_SIGNAL_AVG) {
-+              if (!nl80211_put_signal(msg, sinfo->chains,
-+                                      sinfo->chain_signal_avg,
-+                                      NL80211_STA_INFO_CHAIN_SIGNAL_AVG))
-+                      goto nla_put_failure;
-+      }
-       if (sinfo->filled & STATION_INFO_TX_BITRATE) {
-               if (!nl80211_put_sta_rate(msg, &sinfo->txrate,
-                                         NL80211_STA_INFO_TX_BITRATE))
---- a/net/mac80211/cfg.c
-+++ b/net/mac80211/cfg.c
-@@ -445,6 +445,7 @@ static void sta_set_sinfo(struct sta_inf
-       struct ieee80211_sub_if_data *sdata = sta->sdata;
-       struct ieee80211_local *local = sdata->local;
-       struct timespec uptime;
-+      int i;
-       sinfo->generation = sdata->local->sta_generation;
-@@ -484,6 +485,17 @@ static void sta_set_sinfo(struct sta_inf
-                       sinfo->signal = (s8)sta->last_signal;
-               sinfo->signal_avg = (s8) -ewma_read(&sta->avg_signal);
-       }
-+      if (sta->chains) {
-+              sinfo->filled |= STATION_INFO_CHAIN_SIGNAL |
-+                               STATION_INFO_CHAIN_SIGNAL_AVG;
-+
-+              sinfo->chains = sta->chains;
-+              for (i = 0; i < ARRAY_SIZE(sinfo->chain_signal); i++) {
-+                      sinfo->chain_signal[i] = sta->chain_signal_last[i];
-+                      sinfo->chain_signal_avg[i] =
-+                              (s8) -ewma_read(&sta->chain_signal_avg[i]);
-+              }
-+      }
-       sta_set_rate_info_tx(sta, &sta->last_tx_rate, &sinfo->txrate);
-       sta_set_rate_info_rx(sta, &sinfo->rxrate);
 --- a/drivers/net/wireless/ath/ath9k/dfs.c
 +++ b/drivers/net/wireless/ath/ath9k/dfs.c
-@@ -164,8 +164,8 @@ void ath9k_dfs_process_phyerr(struct ath
+@@ -158,8 +158,8 @@ void ath9k_dfs_process_phyerr(struct ath
                return;
        }
  
index 99bd2e3..354ea03 100644 (file)
@@ -1,14 +1,14 @@
 --- a/include/net/mac80211.h
 +++ b/include/net/mac80211.h
-@@ -978,6 +978,7 @@ enum ieee80211_smps_mode {
+@@ -999,6 +999,7 @@ enum ieee80211_smps_mode {
   *
   * @power_level: requested transmit power (in dBm), backward compatibility
   *    value only that is set to the minimum of all interfaces
 + * @max_antenna_gain: maximum antenna gain adjusted by user config (in dBi)
   *
-  * @channel: the channel to tune to
-  * @channel_type: the channel (HT) type
-@@ -1000,6 +1001,7 @@ struct ieee80211_conf {
+  * @chandef: the channel definition to tune to
+  * @radar_enabled: whether radar detection is enabled
+@@ -1020,6 +1021,7 @@ struct ieee80211_conf {
        u32 flags;
        int power_level, dynamic_ps_timeout;
        int max_sleep_period;
@@ -18,7 +18,7 @@
        u8 ps_dtim_period;
 --- a/net/mac80211/ieee80211_i.h
 +++ b/net/mac80211/ieee80211_i.h
-@@ -1116,6 +1116,7 @@ struct ieee80211_local {
+@@ -1126,6 +1126,7 @@ struct ieee80211_local {
        int dynamic_ps_forced_timeout;
  
        int user_power_level; /* in dBm, for all interfaces */
@@ -28,9 +28,9 @@
  
 --- a/include/uapi/linux/nl80211.h
 +++ b/include/uapi/linux/nl80211.h
-@@ -1654,6 +1654,8 @@ enum nl80211_attrs {
-       NL80211_ATTR_STA_CAPABILITY,
-       NL80211_ATTR_STA_EXT_CAPABILITY,
+@@ -1736,6 +1736,8 @@ enum nl80211_attrs {
+       NL80211_ATTR_PEER_AID,
  
 +      NL80211_ATTR_WIPHY_ANTENNA_GAIN,
 +
        __NL80211_ATTR_AFTER_LAST,
 --- a/net/wireless/nl80211.c
 +++ b/net/wireless/nl80211.c
-@@ -370,6 +370,7 @@ static const struct nla_policy nl80211_p
-       [NL80211_ATTR_MAC_ADDRS] = { .type = NLA_NESTED },
-       [NL80211_ATTR_STA_CAPABILITY] = { .type = NLA_U16 },
-       [NL80211_ATTR_STA_EXT_CAPABILITY] = { .type = NLA_BINARY, },
+@@ -349,6 +349,7 @@ static const struct nla_policy nl80211_p
+       [NL80211_ATTR_IE_RIC] = { .type = NLA_BINARY,
+                                 .len = IEEE80211_MAX_DATA_LEN },
+       [NL80211_ATTR_PEER_AID] = { .type = NLA_U16 },
 +      [NL80211_ATTR_WIPHY_ANTENNA_GAIN] = { .type = NLA_U32 },
  };
  
  /* policy for the key attributes */
-@@ -1706,6 +1707,22 @@ static int nl80211_set_wiphy(struct sk_b
+@@ -1991,6 +1992,22 @@ static int nl80211_set_wiphy(struct sk_b
                        goto bad_res;
        }
  
@@ -72,7 +72,7 @@
                u32 tx_ant, rx_ant;
 --- a/net/mac80211/cfg.c
 +++ b/net/mac80211/cfg.c
-@@ -2212,6 +2212,19 @@ static int ieee80211_get_tx_power(struct
+@@ -2283,6 +2283,19 @@ static int ieee80211_get_tx_power(struct
        return 0;
  }
  
@@ -92,7 +92,7 @@
  static int ieee80211_set_wds_peer(struct wiphy *wiphy, struct net_device *dev,
                                  const u8 *addr)
  {
-@@ -3375,6 +3388,7 @@ struct cfg80211_ops mac80211_config_ops 
+@@ -3474,6 +3487,7 @@ struct cfg80211_ops mac80211_config_ops 
        .set_wiphy_params = ieee80211_set_wiphy_params,
        .set_tx_power = ieee80211_set_tx_power,
        .get_tx_power = ieee80211_get_tx_power,
        CFG80211_TESTMODE_CMD(ieee80211_testmode_cmd)
 --- a/include/net/cfg80211.h
 +++ b/include/net/cfg80211.h
-@@ -1862,6 +1862,7 @@ struct cfg80211_gtk_rekey_data {
+@@ -1970,6 +1970,7 @@ struct cfg80211_update_ft_ies_params {
   *    (as advertised by the nl80211 feature flag.)
   * @get_tx_power: store the current TX power into the dbm variable;
   *    return 0 if successful
   *
   * @set_wds_peer: set the WDS peer for a WDS interface
   *
-@@ -2071,6 +2072,7 @@ struct cfg80211_ops {
+@@ -2189,6 +2190,7 @@ struct cfg80211_ops {
                                enum nl80211_tx_power_setting type, int mbm);
        int     (*get_tx_power)(struct wiphy *wiphy, struct wireless_dev *wdev,
                                int *dbm);
 +++ b/net/mac80211/main.c
 @@ -101,7 +101,7 @@ static u32 ieee80211_hw_conf_chan(struct
        struct ieee80211_sub_if_data *sdata;
-       struct ieee80211_channel *chan;
+       struct cfg80211_chan_def chandef = {};
        u32 changed = 0;
 -      int power;
 +      int power, ant_gain, max_power;
-       enum nl80211_channel_type channel_type;
        u32 offchannel_flag;
-       bool scanning = false;
-@@ -164,8 +164,21 @@ static u32 ieee80211_hw_conf_chan(struct
+       offchannel_flag = local->hw.conf.flags & IEEE80211_CONF_OFFCHANNEL;
+@@ -165,8 +165,21 @@ static u32 ieee80211_hw_conf_chan(struct
        }
        rcu_read_unlock();
  
 -      if (local->hw.conf.power_level != power) {
-+      max_power = chan->max_reg_power;
-+      ant_gain = chan->max_antenna_gain;
++      max_power = chandef.chan->max_reg_power;
++      ant_gain = chandef.chan->max_antenna_gain;
 +      if (local->user_antenna_gain > 0) {
 +              if (local->user_antenna_gain > ant_gain) {
 +                      max_power -= local->user_antenna_gain - ant_gain;
                local->hw.cur_power_level = power;
                local->hw.conf.power_level = power;
        }
-@@ -612,6 +625,7 @@ struct ieee80211_hw *ieee80211_alloc_hw(
+@@ -597,6 +610,7 @@ struct ieee80211_hw *ieee80211_alloc_hw(
                                         IEEE80211_RADIOTAP_MCS_HAVE_BW;
        local->hw.radiotap_vht_details = IEEE80211_RADIOTAP_VHT_KNOWN_GI |
                                         IEEE80211_RADIOTAP_VHT_KNOWN_BANDWIDTH;
 +      local->user_antenna_gain = 0;
+       local->hw.uapsd_queues = IEEE80211_DEFAULT_UAPSD_QUEUES;
+       local->hw.uapsd_max_sp_len = IEEE80211_DEFAULT_MAX_SP_LEN;
        local->user_power_level = IEEE80211_UNSET_POWER_LEVEL;
-       wiphy->ht_capa_mod_mask = &mac80211_ht_capa_mod_mask;
index d249fd3..8f48eea 100644 (file)
@@ -10,7 +10,7 @@
  
 --- a/drivers/net/wireless/ath/ath9k/hw.c
 +++ b/drivers/net/wireless/ath/ath9k/hw.c
-@@ -2817,7 +2817,7 @@ void ath9k_hw_apply_txpower(struct ath_h
+@@ -2847,7 +2847,7 @@ void ath9k_hw_apply_txpower(struct ath_h
        channel = chan->chan;
        chan_pwr = min_t(int, channel->max_power * 2, MAX_RATE_POWER);
        new_pwr = min_t(int, chan_pwr, reg->power_limit);
@@ -21,7 +21,7 @@
        if (ant_gain > max_gain)
 --- a/drivers/net/wireless/ath/ath9k/main.c
 +++ b/drivers/net/wireless/ath/ath9k/main.c
-@@ -1277,7 +1277,10 @@ int ath9k_config(struct ieee80211_hw *hw
+@@ -1292,7 +1292,10 @@ int ath9k_config(struct ieee80211_hw *hw
        }
  
        if (changed & IEEE80211_CONF_CHANGE_POWER) {
index fd7596f..b931d5f 100644 (file)
@@ -1,6 +1,6 @@
 --- a/drivers/net/wireless/ath/ath9k/ath9k.h
 +++ b/drivers/net/wireless/ath/ath9k/ath9k.h
-@@ -551,6 +551,9 @@ struct ath9k_wow_pattern {
+@@ -557,6 +557,9 @@ struct ath9k_wow_pattern {
  void ath_init_leds(struct ath_softc *sc);
  void ath_deinit_leds(struct ath_softc *sc);
  void ath_fill_led_pin(struct ath_softc *sc);
@@ -10,7 +10,7 @@
  #else
  static inline void ath_init_leds(struct ath_softc *sc)
  {
-@@ -685,6 +688,13 @@ enum spectral_mode {
+@@ -697,6 +700,13 @@ enum spectral_mode {
        SPECTRAL_CHANSCAN,
  };
  
  struct ath_softc {
        struct ieee80211_hw *hw;
        struct device *dev;
-@@ -726,9 +736,8 @@ struct ath_softc {
+@@ -739,9 +749,8 @@ struct ath_softc {
        struct ieee80211_supported_band sbands[IEEE80211_NUM_BANDS];
  
- #ifdef CONFIG_MAC80211_LEDS
+ #ifdef CPTCFG_MAC80211_LEDS
 -      bool led_registered;
 -      char led_name[32];
 -      struct led_classdev led_cdev;
  void ath_fill_led_pin(struct ath_softc *sc)
 --- a/drivers/net/wireless/ath/ath9k/init.c
 +++ b/drivers/net/wireless/ath/ath9k/init.c
-@@ -870,7 +870,7 @@ int ath9k_init_device(u16 devid, struct 
+@@ -918,7 +918,7 @@ int ath9k_init_device(u16 devid, struct 
  
- #ifdef CONFIG_MAC80211_LEDS
+ #ifdef CPTCFG_MAC80211_LEDS
        /* must be initialized before ieee80211_register_hw */
 -      sc->led_cdev.default_trigger = ieee80211_create_tpt_led_trigger(sc->hw,
 +      sc->led_default_trigger = ieee80211_create_tpt_led_trigger(sc->hw,
  #endif
 --- a/drivers/net/wireless/ath/ath9k/debug.c
 +++ b/drivers/net/wireless/ath/ath9k/debug.c
-@@ -1482,6 +1482,61 @@ static const struct file_operations fops
+@@ -1825,6 +1825,61 @@ static const struct file_operations fops
        .llseek = default_llseek,
  };
  
 +
 +#endif
 +
- #ifdef CONFIG_ATH9K_MAC_DEBUG
  
- void ath9k_debug_samp_bb_mac(struct ath_softc *sc)
-@@ -2115,6 +2170,10 @@ int ath9k_init_debug(struct ath_hw *ah)
+ int ath9k_init_debug(struct ath_hw *ah)
+ {
+@@ -1847,6 +1902,10 @@ int ath9k_init_debug(struct ath_hw *ah)
                            &fops_eeprom);
        debugfs_create_file("chanbw", S_IRUSR | S_IWUSR, sc->debug.debugfs_phy,
                            sc, &fops_chanbw);
index c64c89a..764242c 100644 (file)
@@ -1,6 +1,6 @@
 --- a/include/linux/ath9k_platform.h
 +++ b/include/linux/ath9k_platform.h
-@@ -33,6 +33,9 @@ struct ath9k_platform_data {
+@@ -35,6 +35,9 @@ struct ath9k_platform_data {
        bool is_clk_25mhz;
        int (*get_mac_revision)(void);
        int (*external_reset)(void);
  #endif /* _LINUX_ATH9K_PLATFORM_H */
 --- a/drivers/net/wireless/ath/ath9k/gpio.c
 +++ b/drivers/net/wireless/ath/ath9k/gpio.c
-@@ -14,6 +14,7 @@
-  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+@@ -15,6 +15,7 @@
   */
  
-+#include <linux/ath9k_platform.h>
  #include "ath9k.h"
++#include <linux/ath9k_platform.h>
  
  /********************************/
+ /*     LED functions          */
 @@ -88,6 +89,24 @@ int ath_create_gpio_led(struct ath_softc
        return ret;
  }
diff --git a/package/mac80211/patches/540-mac80211_optimize_mcs_rate_mask.patch b/package/mac80211/patches/540-mac80211_optimize_mcs_rate_mask.patch
deleted file mode 100644 (file)
index 347c920..0000000
+++ /dev/null
@@ -1,98 +0,0 @@
---- a/net/mac80211/ieee80211_i.h
-+++ b/net/mac80211/ieee80211_i.h
-@@ -739,6 +739,8 @@ struct ieee80211_sub_if_data {
-       /* bitmap of allowed (non-MCS) rate indexes for rate control */
-       u32 rc_rateidx_mask[IEEE80211_NUM_BANDS];
-+
-+      bool rc_has_mcs_mask[IEEE80211_NUM_BANDS];
-       u8  rc_rateidx_mcs_mask[IEEE80211_NUM_BANDS][IEEE80211_HT_MCS_MASK_LEN];
-       union {
---- a/net/mac80211/cfg.c
-+++ b/net/mac80211/cfg.c
-@@ -2386,9 +2386,20 @@ static int ieee80211_set_bitrate_mask(st
-       }
-       for (i = 0; i < IEEE80211_NUM_BANDS; i++) {
-+              struct ieee80211_supported_band *sband = wiphy->bands[i];
-+
-               sdata->rc_rateidx_mask[i] = mask->control[i].legacy;
-               memcpy(sdata->rc_rateidx_mcs_mask[i], mask->control[i].mcs,
-                      sizeof(mask->control[i].mcs));
-+
-+              sdata->rc_has_mcs_mask[i] = false;
-+              if (!sband)
-+                      continue;
-+
-+              if (memcmp(sdata->rc_rateidx_mcs_mask[i],
-+                         sband->ht_cap.mcs.rx_mask,
-+                         sizeof(sband->ht_cap.mcs.rx_mask)) != 0)
-+                      sdata->rc_has_mcs_mask[i] = true;
-       }
-       return 0;
---- a/include/net/mac80211.h
-+++ b/include/net/mac80211.h
-@@ -4091,7 +4091,7 @@ void ieee80211_send_bar(struct ieee80211
-  *    (deprecated; this will be removed once drivers get updated to use
-  *    rate_idx_mask)
-  * @rate_idx_mask: user-requested (legacy) rate mask
-- * @rate_idx_mcs_mask: user-requested MCS rate mask
-+ * @rate_idx_mcs_mask: user-requested MCS rate mask (NULL if not in use)
-  * @bss: whether this frame is sent out in AP or IBSS mode
-  */
- struct ieee80211_tx_rate_control {
-@@ -4103,7 +4103,7 @@ struct ieee80211_tx_rate_control {
-       bool rts, short_preamble;
-       u8 max_rate_idx;
-       u32 rate_idx_mask;
--      u8 rate_idx_mcs_mask[IEEE80211_HT_MCS_MASK_LEN];
-+      u8 *rate_idx_mcs_mask;
-       bool bss;
- };
---- a/net/mac80211/tx.c
-+++ b/net/mac80211/tx.c
-@@ -641,9 +641,11 @@ ieee80211_tx_h_rate_ctrl(struct ieee8021
-               txrc.max_rate_idx = -1;
-       else
-               txrc.max_rate_idx = fls(txrc.rate_idx_mask) - 1;
--      memcpy(txrc.rate_idx_mcs_mask,
--             tx->sdata->rc_rateidx_mcs_mask[info->band],
--             sizeof(txrc.rate_idx_mcs_mask));
-+
-+      if (tx->sdata->rc_has_mcs_mask[info->band])
-+              txrc.rate_idx_mcs_mask =
-+                      tx->sdata->rc_rateidx_mcs_mask[info->band];
-+
-       txrc.bss = (tx->sdata->vif.type == NL80211_IFTYPE_AP ||
-                   tx->sdata->vif.type == NL80211_IFTYPE_MESH_POINT ||
-                   tx->sdata->vif.type == NL80211_IFTYPE_ADHOC);
-@@ -2511,8 +2513,6 @@ struct sk_buff *ieee80211_beacon_get_tim
-               txrc.max_rate_idx = -1;
-       else
-               txrc.max_rate_idx = fls(txrc.rate_idx_mask) - 1;
--      memcpy(txrc.rate_idx_mcs_mask, sdata->rc_rateidx_mcs_mask[band],
--             sizeof(txrc.rate_idx_mcs_mask));
-       txrc.bss = true;
-       rate_control_get_rate(sdata, NULL, &txrc);
---- a/net/mac80211/rate.c
-+++ b/net/mac80211/rate.c
-@@ -460,9 +460,12 @@ void rate_control_get_rate(struct ieee80
-        * the common case.
-        */
-       mask = sdata->rc_rateidx_mask[info->band];
--      memcpy(mcs_mask, sdata->rc_rateidx_mcs_mask[info->band],
--             sizeof(mcs_mask));
--      if (mask != (1 << txrc->sband->n_bitrates) - 1) {
-+      if (mask != (1 << txrc->sband->n_bitrates) - 1 || txrc->rate_idx_mcs_mask) {
-+              if (txrc->rate_idx_mcs_mask)
-+                      memcpy(mcs_mask, txrc->rate_idx_mcs_mask, sizeof(mcs_mask));
-+              else
-+                      memset(mcs_mask, 0xff, sizeof(mcs_mask));
-+
-               if (sta) {
-                       /* Filter out rates that the STA does not support */
-                       mask &= sta->sta.supp_rates[info->band];
index e2a0d12..7c24f46 100644 (file)
@@ -1,11 +1,11 @@
 --- a/drivers/net/wireless/ath/ath9k/ani.h
 +++ b/drivers/net/wireless/ath/ath9k/ani.h
-@@ -51,7 +51,7 @@
+@@ -38,7 +38,7 @@
  #define ATH9K_ANI_PERIOD                  300
  
  /* in ms */
 -#define ATH9K_ANI_POLLINTERVAL            1000
-+#define ATH9K_ANI_POLLINTERVAL            100
++#define ATH9K_ANI_POLLINTERVAL            300
  
- #define HAL_NOISE_IMMUNE_MAX              4
- #define HAL_SPUR_IMMUNE_MAX               7
+ #define ATH9K_SIG_FIRSTEP_SETTING_MIN     0
+ #define ATH9K_SIG_FIRSTEP_SETTING_MAX     20
diff --git a/package/mac80211/patches/551-ath9k_revert_initval_change.patch b/package/mac80211/patches/551-ath9k_revert_initval_change.patch
deleted file mode 100644 (file)
index ffb08bf..0000000
+++ /dev/null
@@ -1,19 +0,0 @@
---- a/drivers/net/wireless/ath/ath9k/ar9003_2p2_initvals.h
-+++ b/drivers/net/wireless/ath/ath9k/ar9003_2p2_initvals.h
-@@ -958,11 +958,11 @@ static const u32 ar9300Common_rx_gain_ta
-       {0x0000a074, 0x00000000},
-       {0x0000a078, 0x00000000},
-       {0x0000a07c, 0x00000000},
--      {0x0000a080, 0x1a1a1a1a},
--      {0x0000a084, 0x1a1a1a1a},
--      {0x0000a088, 0x1a1a1a1a},
--      {0x0000a08c, 0x1a1a1a1a},
--      {0x0000a090, 0x171a1a1a},
-+      {0x0000a080, 0x22222229},
-+      {0x0000a084, 0x1d1d1d1d},
-+      {0x0000a088, 0x1d1d1d1d},
-+      {0x0000a08c, 0x1d1d1d1d},
-+      {0x0000a090, 0x171d1d1d},
-       {0x0000a094, 0x11111717},
-       {0x0000a098, 0x00030311},
-       {0x0000a09c, 0x00000000},
index 606eb1c..5d063c7 100644 (file)
@@ -1,6 +1,6 @@
 --- a/drivers/net/wireless/ath/ath9k/mac.c
 +++ b/drivers/net/wireless/ath/ath9k/mac.c
-@@ -689,7 +689,7 @@ bool ath9k_hw_stopdmarecv(struct ath_hw 
+@@ -705,7 +705,7 @@ bool ath9k_hw_stopdmarecv(struct ath_hw 
  {
  #define AH_RX_STOP_DMA_TIMEOUT 10000   /* usec */
        struct ath_common *common = ath9k_hw_common(ah);
@@ -9,7 +9,7 @@
        int i;
  
        /* Enable access to the DMA observation bus */
-@@ -719,6 +719,16 @@ bool ath9k_hw_stopdmarecv(struct ath_hw 
+@@ -735,6 +735,16 @@ bool ath9k_hw_stopdmarecv(struct ath_hw 
        }
  
        if (i == 0) {
index 9618698..db380b0 100644 (file)
@@ -1,7 +1,7 @@
 --- a/drivers/net/wireless/ath/ath9k/debug.c
 +++ b/drivers/net/wireless/ath/ath9k/debug.c
-@@ -2149,6 +2149,50 @@ static const struct file_operations fops
- };
+@@ -1881,6 +1881,50 @@ static const struct file_operations fops
+ #endif
  
  
 +static ssize_t read_file_diag(struct file *file, char __user *user_buf,
@@ -51,7 +51,7 @@
  int ath9k_init_debug(struct ath_hw *ah)
  {
        struct ath_common *common = ath9k_hw_common(ah);
-@@ -2174,6 +2218,8 @@ int ath9k_init_debug(struct ath_hw *ah)
+@@ -1906,6 +1950,8 @@ int ath9k_init_debug(struct ath_hw *ah)
        debugfs_create_file("gpio_led", S_IWUSR,
                           sc->debug.debugfs_phy, sc, &fops_gpio_led);
  #endif
@@ -62,7 +62,7 @@
        debugfs_create_file("interrupt", S_IRUSR, sc->debug.debugfs_phy, sc,
 --- a/drivers/net/wireless/ath/ath9k/hw.h
 +++ b/drivers/net/wireless/ath/ath9k/hw.h
-@@ -500,6 +500,12 @@ enum {
+@@ -499,6 +499,12 @@ enum {
        ATH9K_RESET_COLD,
  };
  
@@ -75,7 +75,7 @@
  struct ath9k_hw_version {
        u32 magic;
        u16 devid;
-@@ -778,6 +784,8 @@ struct ath_hw {
+@@ -777,6 +783,8 @@ struct ath_hw {
        u32 rfkill_polarity;
        u32 ah_flags;
  
        bool reset_power_on;
        bool htc_reset_init;
  
-@@ -1041,6 +1049,7 @@ void ath9k_hw_set_sta_beacon_timers(stru
+@@ -1027,6 +1035,7 @@ void ath9k_hw_set_sta_beacon_timers(stru
  bool ath9k_hw_check_alive(struct ath_hw *ah);
  
  bool ath9k_hw_setpower(struct ath_hw *ah, enum ath9k_power_mode mode);
 +void ath9k_hw_update_diag(struct ath_hw *ah);
  
- #ifdef CONFIG_ATH9K_DEBUGFS
+ #ifdef CPTCFG_ATH9K_DEBUGFS
  void ath9k_debug_sync_cause(struct ath_common *common, u32 sync_cause);
 --- a/drivers/net/wireless/ath/ath9k/hw.c
 +++ b/drivers/net/wireless/ath/ath9k/hw.c
-@@ -1747,6 +1747,20 @@ fail:
+@@ -1853,6 +1853,20 @@ fail:
        return -EINVAL;
  }
  
  int ath9k_hw_reset(struct ath_hw *ah, struct ath9k_channel *chan,
                   struct ath9k_hw_cal_data *caldata, bool fastcc)
  {
-@@ -2023,6 +2037,7 @@ int ath9k_hw_reset(struct ath_hw *ah, st
+@@ -2055,6 +2069,7 @@ int ath9k_hw_reset(struct ath_hw *ah, st
        }
  
        ath9k_hw_apply_gpio_override(ah);
                REG_SET_BIT(ah, AR_BTCOEX_WL_LNADIV, AR_BTCOEX_WL_LNADIV_FORCE_ON);
 --- a/drivers/net/wireless/ath/ath9k/main.c
 +++ b/drivers/net/wireless/ath/ath9k/main.c
-@@ -459,6 +459,11 @@ irqreturn_t ath_isr(int irq, void *dev)
+@@ -462,6 +462,11 @@ irqreturn_t ath_isr(int irq, void *dev)
        ath9k_hw_getisr(ah, &status);   /* NB: clears ISR too */
        status &= ah->imask;    /* discard unasked-for bits */
  
index 6edc8ef..47df721 100644 (file)
@@ -1,6 +1,6 @@
 --- a/drivers/net/wireless/ath/ath9k/ar9003_phy.c
 +++ b/drivers/net/wireless/ath/ath9k/ar9003_phy.c
-@@ -1075,6 +1075,10 @@ static bool ar9003_hw_ani_control(struct
+@@ -1173,6 +1173,10 @@ skip_ws_det:
                 * is_on == 0 means MRC CCK is OFF (more noise imm)
                 */
                bool is_on = param ? 1 : 0;
index a6cb089..584a7d7 100644 (file)
@@ -1,6 +1,6 @@
 --- a/include/linux/ath9k_platform.h
 +++ b/include/linux/ath9k_platform.h
-@@ -31,6 +31,9 @@ struct ath9k_platform_data {
+@@ -33,6 +33,9 @@ struct ath9k_platform_data {
  
        bool endian_check;
        bool is_clk_25mhz;
@@ -12,7 +12,7 @@
  
 --- a/drivers/net/wireless/ath/ath9k/hw.c
 +++ b/drivers/net/wireless/ath/ath9k/hw.c
-@@ -2413,17 +2413,25 @@ int ath9k_hw_fill_cap_info(struct ath_hw
+@@ -2448,17 +2448,25 @@ int ath9k_hw_fill_cap_info(struct ath_hw
        }
  
        eeval = ah->eep_ops->get_eeprom(ah, EEP_OP_MODE);
@@ -48,7 +48,7 @@
            AR_SREV_9285(ah) ||
 --- a/drivers/net/wireless/ath/ath9k/hw.h
 +++ b/drivers/net/wireless/ath/ath9k/hw.h
-@@ -961,6 +961,8 @@ struct ath_hw {
+@@ -947,6 +947,8 @@ struct ath_hw {
        bool is_clk_25mhz;
        int (*get_mac_revision)(void);
        int (*external_reset)(void);
@@ -59,7 +59,7 @@
  };
 --- a/drivers/net/wireless/ath/ath9k/init.c
 +++ b/drivers/net/wireless/ath/ath9k/init.c
-@@ -587,6 +587,8 @@ static int ath9k_init_softc(u16 devid, s
+@@ -613,6 +613,8 @@ static int ath9k_init_softc(u16 devid, s
                ah->is_clk_25mhz = pdata->is_clk_25mhz;
                ah->get_mac_revision = pdata->get_mac_revision;
                ah->external_reset = pdata->external_reset;
diff --git a/package/mac80211/patches/556-ath9k_ar913x_external_reset.patch b/package/mac80211/patches/556-ath9k_ar913x_external_reset.patch
deleted file mode 100644 (file)
index c95f391..0000000
+++ /dev/null
@@ -1,28 +0,0 @@
---- a/drivers/net/wireless/ath/ath9k/hw.c
-+++ b/drivers/net/wireless/ath/ath9k/hw.c
-@@ -1374,7 +1374,10 @@ static bool ath9k_hw_set_reset(struct at
-       REGWRITE_BUFFER_FLUSH(ah);
--      udelay(50);
-+      if (AR_SREV_9100(ah))
-+              mdelay(10);
-+      else
-+              udelay(50);
-       REG_WRITE(ah, AR_RTC_RC, 0);
-       if (!ath9k_hw_wait(ah, AR_RTC_RC, AR_RTC_RC_M, 0, AH_WAIT_TIMEOUT)) {
-@@ -1385,8 +1388,12 @@ static bool ath9k_hw_set_reset(struct at
-       if (!AR_SREV_9100(ah))
-               REG_WRITE(ah, AR_RC, 0);
--      if (AR_SREV_9100(ah))
-+      if (AR_SREV_9100(ah) && type != ATH9K_RESET_WARM) {
-+              if (ah->external_reset)
-+                      ah->external_reset();
-+
-               udelay(50);
-+      }
-       return true;
- }
diff --git a/package/mac80211/patches/600-rt2x00-disable-pci-code-if-CONFIG_PCI-not-defined.patch b/package/mac80211/patches/600-rt2x00-disable-pci-code-if-CONFIG_PCI-not-defined.patch
deleted file mode 100644 (file)
index a7609ed..0000000
+++ /dev/null
@@ -1,18 +0,0 @@
---- a/drivers/net/wireless/rt2x00/rt2x00pci.c
-+++ b/drivers/net/wireless/rt2x00/rt2x00pci.c
-@@ -208,6 +208,7 @@ void rt2x00pci_uninitialize(struct rt2x0
- }
- EXPORT_SYMBOL_GPL(rt2x00pci_uninitialize);
-+#ifdef CONFIG_PCI
- /*
-  * PCI driver handlers.
-  */
-@@ -392,6 +393,7 @@ int rt2x00pci_resume(struct pci_dev *pci
- }
- EXPORT_SYMBOL_GPL(rt2x00pci_resume);
- #endif /* CONFIG_PM */
-+#endif /* CONFIG_PCI */
- /*
-  * rt2x00pci module information.
index 9ff50b7..d9a20bc 100644 (file)
@@ -1,13 +1,13 @@
 --- a/drivers/net/wireless/rt2x00/rt2x00pci.c
 +++ b/drivers/net/wireless/rt2x00/rt2x00pci.c
-@@ -273,8 +273,10 @@ int rt2x00pci_probe(struct pci_dev *pci_
+@@ -96,8 +96,10 @@ int rt2x00pci_probe(struct pci_dev *pci_
  
        pci_set_master(pci_dev);
  
 +#ifdef CONFIG_PCI_SET_MWI
        if (pci_set_mwi(pci_dev))
-               ERROR_PROBE("MWI not available.\n");
+               rt2x00_probe_err("MWI not available\n");
 +#endif
  
        if (dma_set_mask(&pci_dev->dev, DMA_BIT_MASK(32))) {
-               ERROR_PROBE("PCI DMA not supported.\n");
+               rt2x00_probe_err("PCI DMA not supported\n");
index 07e72e3..f47c1a5 100644 (file)
 +
 +      ee_name = rt2x00dev->ops->lib->get_eeprom_file_name(rt2x00dev);
 +      if (!ee_name) {
-+              ERROR(rt2x00dev,
-+                    "Invalid EEPROM filename.\n"
-+                    "Please file bug report to %s.\n", DRV_PROJECT);
++              rt2x00_err(rt2x00dev,
++                         "Invalid EEPROM filename.\n"
++                         "Please file bug report to %s.\n", DRV_PROJECT);
 +              return -EINVAL;
 +      }
 +
-+      INFO(rt2x00dev, "Loading EEPROM data from '%s'.\n", ee_name);
++      rt2x00_info(rt2x00dev, "Loading EEPROM data from '%s'.\n", ee_name);
 +
 +      retval = request_firmware(&ee, ee_name, rt2x00dev->dev);
 +      if (retval) {
-+              ERROR(rt2x00dev, "Failed to request EEPROM.\n");
++              rt2x00_err(rt2x00dev, "Failed to request EEPROM.\n");
 +              return retval;
 +      }
 +
 +      if (!ee || !ee->size || !ee->data) {
-+              ERROR(rt2x00dev, "Failed to read EEPROM file.\n");
++              rt2x00_err(rt2x00dev, "Failed to read EEPROM file.\n");
 +              retval = -ENOENT;
 +              goto err_exit;
 +      }
 +
 +      if (ee->size != rt2x00dev->ops->eeprom_size) {
-+              ERROR(rt2x00dev,
-+                    "EEPROM file size is invalid, it should be %d bytes\n",
-+                    rt2x00dev->ops->eeprom_size);
++              rt2x00_err(rt2x00dev,
++                         "EEPROM file size is invalid, it should be %d bytes\n",
++                         rt2x00dev->ops->eeprom_size);
 +              retval = -EINVAL;
 +              goto err_release_ee;
 +      }
 +}
 --- a/drivers/net/wireless/rt2x00/rt2x00.h
 +++ b/drivers/net/wireless/rt2x00/rt2x00.h
-@@ -559,6 +559,7 @@ struct rt2x00lib_ops {
+@@ -549,6 +549,7 @@ struct rt2x00lib_ops {
                               const u8 *data, const size_t len);
        int (*load_firmware) (struct rt2x00_dev *rt2x00dev,
                              const u8 *data, const size_t len);
  
        /*
         * Device initialization/deinitialization handlers.
-@@ -719,6 +720,7 @@ enum rt2x00_capability_flags {
+@@ -705,6 +706,7 @@ enum rt2x00_capability_flags {
        REQUIRE_SW_SEQNO,
        REQUIRE_HT_TX_DESC,
        REQUIRE_PS_AUTOWAKE,
  
        /*
         * Capabilities
-@@ -988,6 +990,11 @@ struct rt2x00_dev {
+@@ -974,6 +976,11 @@ struct rt2x00_dev {
        const struct firmware *fw;
  
        /*
 --- a/drivers/net/wireless/rt2x00/rt2x00lib.h
 +++ b/drivers/net/wireless/rt2x00/rt2x00lib.h
 @@ -322,6 +322,22 @@ static inline void rt2x00lib_free_firmwa
- #endif /* CONFIG_RT2X00_LIB_FIRMWARE */
+ #endif /* CPTCFG_RT2X00_LIB_FIRMWARE */
  
  /*
 + * EEPROM file handlers.
 + */
-+#ifdef CONFIG_RT2X00_LIB_EEPROM
++#ifdef CPTCFG_RT2X00_LIB_EEPROM
 +int rt2x00lib_load_eeprom_file(struct rt2x00_dev *rt2x00dev);
 +void rt2x00lib_free_eeprom_file(struct rt2x00_dev *rt2x00dev);
 +#else
 +static inline void rt2x00lib_free_eeprom_file(struct rt2x00_dev *rt2x00dev)
 +{
 +}
-+#endif /* CONFIG_RT2X00_LIB_EEPROM_FILE */
++#endif /* CPTCFG_RT2X00_LIB_EEPROM */
 +
 +/*
   * Debugfs handlers.
   */
- #ifdef CONFIG_RT2X00_LIB_DEBUGFS
+ #ifdef CPTCFG_RT2X00_LIB_DEBUGFS
 --- a/drivers/net/wireless/rt2x00/Kconfig
 +++ b/drivers/net/wireless/rt2x00/Kconfig
-@@ -60,6 +60,7 @@ config RT2800PCI
+@@ -69,6 +69,7 @@ config RT2800PCI
        select RT2X00_LIB_PCI if PCI
-       select RT2X00_LIB_SOC if RALINK_RT288X || RALINK_RT305X
+       select RT2X00_LIB_SOC if SOC_RT288X || SOC_RT305X
        select RT2X00_LIB_FIRMWARE
 +      select RT2X00_LIB_EEPROM
        select RT2X00_LIB_CRYPTO
-       select CRC_CCITT
-       select EEPROM_93CX6
-@@ -212,6 +213,9 @@ config RT2X00_LIB_FIRMWARE
+       depends on CRC_CCITT
+       depends on EEPROM_93CX6
+@@ -238,6 +239,9 @@ config RT2X00_LIB_FIRMWARE
  config RT2X00_LIB_CRYPTO
        boolean
  
 +      boolean
 +
  config RT2X00_LIB_LEDS
+       depends on !BACKPORT_KERNEL_2_6_25
        boolean
-       default y if (RT2X00_LIB=y && LEDS_CLASS=y) || (RT2X00_LIB=m && LEDS_CLASS!=n)
 --- a/drivers/net/wireless/rt2x00/Makefile
 +++ b/drivers/net/wireless/rt2x00/Makefile
-@@ -7,6 +7,7 @@ rt2x00lib-$(CONFIG_RT2X00_LIB_DEBUGFS) +
- rt2x00lib-$(CONFIG_RT2X00_LIB_CRYPTO) += rt2x00crypto.o
- rt2x00lib-$(CONFIG_RT2X00_LIB_FIRMWARE)       += rt2x00firmware.o
- rt2x00lib-$(CONFIG_RT2X00_LIB_LEDS)   += rt2x00leds.o
-+rt2x00lib-$(CONFIG_RT2X00_LIB_EEPROM) += rt2x00eeprom.o
+@@ -7,6 +7,7 @@ rt2x00lib-$(CPTCFG_RT2X00_LIB_DEBUGFS) +
+ rt2x00lib-$(CPTCFG_RT2X00_LIB_CRYPTO) += rt2x00crypto.o
+ rt2x00lib-$(CPTCFG_RT2X00_LIB_FIRMWARE)       += rt2x00firmware.o
+ rt2x00lib-$(CPTCFG_RT2X00_LIB_LEDS)   += rt2x00leds.o
++rt2x00lib-$(CPTCFG_RT2X00_LIB_EEPROM) += rt2x00eeprom.o
  
- obj-$(CONFIG_RT2X00_LIB)              += rt2x00lib.o
- obj-$(CONFIG_RT2X00_LIB_PCI)          += rt2x00pci.o
+ obj-$(CPTCFG_RT2X00_LIB)              += rt2x00lib.o
+ obj-$(CPTCFG_RT2X00_LIB_MMIO)         += rt2x00mmio.o
 --- a/drivers/net/wireless/rt2x00/rt2800pci.c
 +++ b/drivers/net/wireless/rt2x00/rt2800pci.c
-@@ -89,25 +89,11 @@ static void rt2800pci_mcu_status(struct 
-       rt2x00pci_register_write(rt2x00dev, H2M_MAILBOX_CID, ~0);
+@@ -90,25 +90,11 @@ static void rt2800pci_mcu_status(struct 
+       rt2x00mmio_register_write(rt2x00dev, H2M_MAILBOX_CID, ~0);
  }
  
--#if defined(CONFIG_RALINK_RT288X) || defined(CONFIG_RALINK_RT305X)
+-#if defined(CONFIG_SOC_RT288X) || defined(CONFIG_SOC_RT305X)
  static int rt2800pci_read_eeprom_soc(struct rt2x00_dev *rt2x00dev)
  {
 -      void __iomem *base_addr = ioremap(0x1F040000, EEPROM_SIZE);
 -{
 -      return -ENOMEM;
 -}
--#endif /* CONFIG_RALINK_RT288X || CONFIG_RALINK_RT305X */
+-#endif /* CONFIG_SOC_RT288X || CONFIG_SOC_RT305X */
  
  #ifdef CONFIG_PCI
  static void rt2800pci_eepromregister_read(struct eeprom_93cx6 *eeprom)
-@@ -331,6 +317,20 @@ static int rt2800pci_write_firmware(stru
+@@ -332,6 +318,20 @@ static int rt2800pci_write_firmware(stru
  }
  
  /*
   * Initialization functions.
   */
  static bool rt2800pci_get_entry_state(struct queue_entry *entry)
-@@ -1046,6 +1046,7 @@ static const struct rt2x00lib_ops rt2800
+@@ -1156,6 +1156,7 @@ static const struct rt2x00lib_ops rt2800
        .get_firmware_name      = rt2800pci_get_firmware_name,
        .check_firmware         = rt2800_check_firmware,
        .load_firmware          = rt2800_load_firmware,
-+      .get_eeprom_file_name   = rt2800pci_get_eeprom_file_name,
-       .initialize             = rt2x00pci_initialize,
-       .uninitialize           = rt2x00pci_uninitialize,
++      .get_eeprom_file_name   = rt2800pci_get_eeprom_file_name,
+       .initialize             = rt2x00mmio_initialize,
+       .uninitialize           = rt2x00mmio_uninitialize,
        .get_entry_state        = rt2800pci_get_entry_state,
 --- a/drivers/net/wireless/rt2x00/rt2x00dev.c
 +++ b/drivers/net/wireless/rt2x00/rt2x00dev.c
-@@ -1318,6 +1318,10 @@ int rt2x00lib_probe_dev(struct rt2x00_de
-       rt2x00dev->hw->wiphy->flags |= WIPHY_FLAG_IBSS_RSN;
+@@ -1325,6 +1325,10 @@ int rt2x00lib_probe_dev(struct rt2x00_de
+       INIT_DELAYED_WORK(&rt2x00dev->autowakeup_work, rt2x00lib_autowakeup);
+       INIT_WORK(&rt2x00dev->sleep_work, rt2x00lib_sleep);
  
 +      retval = rt2x00lib_load_eeprom_file(rt2x00dev);
 +      if (retval)
 +              goto exit;
 +
        /*
-        * Initialize work.
+        * Let the driver probe the device to detect the capabilities.
         */
-@@ -1442,6 +1446,11 @@ void rt2x00lib_remove_dev(struct rt2x00_
+@@ -1455,6 +1459,11 @@ void rt2x00lib_remove_dev(struct rt2x00_
         */
        if (rt2x00dev->drv_data)
                kfree(rt2x00dev->drv_data);
  
        rt2x00_set_chip_intf(rt2x00dev, RT2X00_CHIP_INTF_SOC);
  
+--- a/.local-symbols
++++ b/.local-symbols
+@@ -272,6 +272,7 @@ RT2X00_LIB_FIRMWARE=
+ RT2X00_LIB_CRYPTO=
+ RT2X00_LIB_LEDS=
+ RT2X00_LIB_DEBUGFS=
++RT2X00_LIB_EEPROM=
+ RT2X00_DEBUG=
+ RTLWIFI=
+ RTLWIFI_DEBUG=
diff --git a/package/mac80211/patches/604-rt2x00-add-CONFIG_RT2X00_LIB_EEPROM-option.patch b/package/mac80211/patches/604-rt2x00-add-CONFIG_RT2X00_LIB_EEPROM-option.patch
deleted file mode 100644 (file)
index d9f1764..0000000
+++ /dev/null
@@ -1,10 +0,0 @@
---- a/config.mk
-+++ b/config.mk
-@@ -640,6 +640,7 @@ export CONFIG_RT2X00=y
- export CONFIG_RT2X00_LIB=m
- export CONFIG_RT2800_LIB=m
- export CONFIG_RT2X00_LIB_FIRMWARE=y
-+export CONFIG_RT2X00_LIB_EEPROM=y
- export CONFIG_RT2X00_LIB_CRYPTO=y
- # export CONFIG_RT2X00_LIB_SOC=y
- ifdef CONFIG_COMPAT_KERNEL_2_6_25
index 33eb28f..bcbb435 100644 (file)
@@ -1,7 +1,7 @@
 --- a/drivers/net/wireless/rt2x00/rt2800pci.c
 +++ b/drivers/net/wireless/rt2x00/rt2800pci.c
-@@ -89,7 +89,7 @@ static void rt2800pci_mcu_status(struct 
-       rt2x00pci_register_write(rt2x00dev, H2M_MAILBOX_CID, ~0);
+@@ -90,7 +90,7 @@ static void rt2800pci_mcu_status(struct 
+       rt2x00mmio_register_write(rt2x00dev, H2M_MAILBOX_CID, ~0);
  }
  
 -static int rt2800pci_read_eeprom_soc(struct rt2x00_dev *rt2x00dev)
@@ -9,7 +9,7 @@
  {
        memcpy(rt2x00dev->eeprom, rt2x00dev->eeprom_file->data, EEPROM_SIZE);
        return 0;
-@@ -983,8 +983,9 @@ static int rt2800pci_read_eeprom(struct 
+@@ -1093,8 +1093,9 @@ static int rt2800pci_read_eeprom(struct 
  {
        int retval;
  
@@ -23,7 +23,7 @@
        else
 --- a/drivers/net/wireless/rt2x00/rt2x00pci.c
 +++ b/drivers/net/wireless/rt2x00/rt2x00pci.c
-@@ -255,6 +255,7 @@ exit:
+@@ -78,6 +78,7 @@ exit:
  int rt2x00pci_probe(struct pci_dev *pci_dev, const struct rt2x00_ops *ops)
  {
        struct ieee80211_hw *hw;
@@ -31,7 +31,7 @@
        struct rt2x00_dev *rt2x00dev;
        int retval;
        u16 chip;
-@@ -300,6 +301,12 @@ int rt2x00pci_probe(struct pci_dev *pci_
+@@ -125,6 +126,12 @@ int rt2x00pci_probe(struct pci_dev *pci_
        rt2x00dev->irq = pci_dev->irq;
        rt2x00dev->name = pci_name(pci_dev);
  
index 2025701..9608df2 100644 (file)
@@ -24,7 +24,7 @@ Helmut
 
 --- a/drivers/net/wireless/rt2x00/rt2x00queue.c
 +++ b/drivers/net/wireless/rt2x00/rt2x00queue.c
-@@ -162,36 +162,14 @@ void rt2x00queue_align_frame(struct sk_b
+@@ -163,36 +163,14 @@ void rt2x00queue_align_frame(struct sk_b
  void rt2x00queue_insert_l2pad(struct sk_buff *skb, unsigned int header_length)
  {
        unsigned int payload_length = skb->len - header_length;
index 0b0c30e..5e6e27d 100644 (file)
@@ -12,7 +12,7 @@
  #endif /* _RT2X00_PLATFORM_H */
 --- a/drivers/net/wireless/rt2x00/rt2x00dev.c
 +++ b/drivers/net/wireless/rt2x00/rt2x00dev.c
-@@ -939,6 +939,22 @@ static int rt2x00lib_probe_hw_modes(stru
+@@ -938,6 +938,22 @@ static int rt2x00lib_probe_hw_modes(stru
        unsigned int num_rates;
        unsigned int i;
  
@@ -27,7 +27,7 @@
 +      }
 +
 +      if ((spec->supported_bands & SUPPORT_BAND_BOTH) == 0) {
-+              ERROR(rt2x00dev, "No supported bands\n");
++              rt2x00_err(rt2x00dev, "No supported bands\n");
 +              return -EINVAL;
 +      }
 +
@@ -37,7 +37,7 @@
                num_rates += 4;
 --- a/drivers/net/wireless/rt2x00/rt2x00.h
 +++ b/drivers/net/wireless/rt2x00/rt2x00.h
-@@ -424,6 +424,7 @@ struct hw_mode_spec {
+@@ -414,6 +414,7 @@ struct hw_mode_spec {
        unsigned int supported_bands;
  #define SUPPORT_BAND_2GHZ     0x00000001
  #define SUPPORT_BAND_5GHZ     0x00000002
index bb77df9..0695b89 100644 (file)
@@ -10,7 +10,7 @@
        int disable_5ghz;
 --- a/drivers/net/wireless/rt2x00/rt2x00dev.c
 +++ b/drivers/net/wireless/rt2x00/rt2x00dev.c
-@@ -930,6 +930,18 @@ static void rt2x00lib_rate(struct ieee80
+@@ -929,6 +929,18 @@ static void rt2x00lib_rate(struct ieee80
                entry->flags |= IEEE80211_RATE_SHORT_PREAMBLE;
  }
  
@@ -31,7 +31,7 @@
  {
 --- a/drivers/net/wireless/rt2x00/rt2x00.h
 +++ b/drivers/net/wireless/rt2x00/rt2x00.h
-@@ -1314,6 +1314,7 @@ static inline void rt2x00debug_dump_fram
+@@ -1326,6 +1326,7 @@ static inline void rt2x00debug_dump_fram
   */
  u32 rt2x00lib_get_bssidx(struct rt2x00_dev *rt2x00dev,
                         struct ieee80211_vif *vif);
   * Interrupt context handlers.
 --- a/drivers/net/wireless/rt2x00/rt61pci.c
 +++ b/drivers/net/wireless/rt2x00/rt61pci.c
-@@ -2392,6 +2392,7 @@ static int rt61pci_validate_eeprom(struc
+@@ -2395,6 +2395,7 @@ static int rt61pci_validate_eeprom(struc
        u32 reg;
        u16 word;
        u8 *mac;
 +      const u8 *pdata_mac;
        s8 value;
  
-       rt2x00pci_register_read(rt2x00dev, E2PROM_CSR, &reg);
-@@ -2412,7 +2413,11 @@ static int rt61pci_validate_eeprom(struc
+       rt2x00mmio_register_read(rt2x00dev, E2PROM_CSR, &reg);
+@@ -2415,7 +2416,11 @@ static int rt61pci_validate_eeprom(struc
        /*
         * Start validation of the data that has been read.
         */
@@ -60,4 +60,4 @@
 +
        if (!is_valid_ether_addr(mac)) {
                eth_random_addr(mac);
-               EEPROM(rt2x00dev, "MAC: %pM\n", mac);
+               rt2x00_eeprom_dbg(rt2x00dev, "MAC: %pM\n", mac);
index bf070e6..15083d4 100644 (file)
@@ -1,6 +1,6 @@
 --- a/drivers/net/wireless/rt2x00/rt2800lib.c
 +++ b/drivers/net/wireless/rt2x00/rt2800lib.c
-@@ -2249,15 +2249,18 @@ static void rt2800_config_channel(struct
+@@ -2631,15 +2631,18 @@ static void rt2800_config_channel(struct
        /*
         * Change BBP settings
         */
                rt2800_bbp_write(rt2x00dev, 86, 0);
        }
  
-@@ -3670,6 +3673,7 @@ static int rt2800_init_bbp(struct rt2x00
-               rt2800_bbp_write(rt2x00dev, 120, 0x50);
-       if (rt2x00_rt(rt2x00dev, RT3290) ||
-+          rt2x00_rt(rt2x00dev, RT3352) ||
-           rt2x00_rt(rt2x00dev, RT5390) ||
-           rt2x00_rt(rt2x00dev, RT5392))
-               rt2800_bbp_write(rt2x00dev, 128, 0x12);
-@@ -3976,6 +3980,12 @@ static void rt2800_init_rfcsr_3290(struc
+@@ -4971,6 +4974,12 @@ static void rt2800_init_rfcsr_3290(struc
  
  static void rt2800_init_rfcsr_3352(struct rt2x00_dev *rt2x00dev)
  {
 +                                &rt2x00dev->cap_flags);
 +      u8 rfcsr;
 +
+       rt2800_rf_init_calibration(rt2x00dev, 30);
        rt2800_rfcsr_write(rt2x00dev, 0, 0xf0);
-       rt2800_rfcsr_write(rt2x00dev, 1, 0x23);
-       rt2800_rfcsr_write(rt2x00dev, 2, 0x50);
-@@ -4009,15 +4019,30 @@ static void rt2800_init_rfcsr_3352(struc
+@@ -5006,15 +5015,30 @@ static void rt2800_init_rfcsr_3352(struc
        rt2800_rfcsr_write(rt2x00dev, 31, 0x80);
        rt2800_rfcsr_write(rt2x00dev, 32, 0x80);
        rt2800_rfcsr_write(rt2x00dev, 33, 0x00);
@@ -53,7 +45,7 @@
 +              rt2x00_set_field8(&rfcsr, RFCSR34_TX0_EXT_PA, 1);
 +      if (!tx1_int_pa)
 +              rt2x00_set_field8(&rfcsr, RFCSR34_TX1_EXT_PA, 1);
-+      rt2800_rfcsr_write(rt2x00dev, 34, rfcsr );
++      rt2800_rfcsr_write(rt2x00dev, 34, rfcsr);
        rt2800_rfcsr_write(rt2x00dev, 35, 0x03);
        rt2800_rfcsr_write(rt2x00dev, 36, 0xbd);
        rt2800_rfcsr_write(rt2x00dev, 37, 0x3c);
@@ -77,7 +69,7 @@
        rt2800_rfcsr_write(rt2x00dev, 43, 0xdb);
        rt2800_rfcsr_write(rt2x00dev, 44, 0xdb);
        rt2800_rfcsr_write(rt2x00dev, 45, 0xdb);
-@@ -4025,15 +4050,20 @@ static void rt2800_init_rfcsr_3352(struc
+@@ -5022,15 +5046,20 @@ static void rt2800_init_rfcsr_3352(struc
        rt2800_rfcsr_write(rt2x00dev, 47, 0x0d);
        rt2800_rfcsr_write(rt2x00dev, 48, 0x14);
        rt2800_rfcsr_write(rt2x00dev, 49, 0x00);
        rt2800_rfcsr_write(rt2x00dev, 59, 0x00);
        rt2800_rfcsr_write(rt2x00dev, 60, 0x00);
        rt2800_rfcsr_write(rt2x00dev, 61, 0x00);
-@@ -4949,7 +4979,8 @@ static int rt2800_init_eeprom(struct rt2
+@@ -5715,6 +5744,7 @@ static int rt2800_init_eeprom(struct rt2
+        * RT53xx: defined in "EEPROM_CHIP_ID" field
+        */
+       if (rt2x00_rt(rt2x00dev, RT3290) ||
++          rt2x00_rt(rt2x00dev, RT3352) ||
+           rt2x00_rt(rt2x00dev, RT5390) ||
+           rt2x00_rt(rt2x00dev, RT5392))
+               rt2x00_eeprom_read(rt2x00dev, EEPROM_CHIP_ID, &rf);
+@@ -5804,7 +5834,8 @@ static int rt2800_init_eeprom(struct rt2
        /*
         * Detect if this device has Bluetooth co-existence.
         */
                __set_bit(CAPABILITY_BT_COEXIST, &rt2x00dev->cap_flags);
  
        /*
-@@ -4978,6 +5009,22 @@ static int rt2800_init_eeprom(struct rt2
+@@ -5833,6 +5864,22 @@ static int rt2800_init_eeprom(struct rt2
                                        EIRP_MAX_TX_POWER_LIMIT)
                __set_bit(CAPABILITY_POWER_LIMIT, &rt2x00dev->cap_flags);
  
  
 --- a/drivers/net/wireless/rt2x00/rt2800.h
 +++ b/drivers/net/wireless/rt2x00/rt2800.h
-@@ -2117,6 +2117,12 @@ struct mac_iveiv_entry {
+@@ -2153,6 +2153,12 @@ struct mac_iveiv_entry {
  #define RFCSR31_RX_CALIB              FIELD8(0x7f)
  
  /*
   * RFCSR 38:
   */
  #define RFCSR38_RX_LO1_EN             FIELD8(0x20)
-@@ -2127,6 +2133,18 @@ struct mac_iveiv_entry {
+@@ -2163,6 +2169,18 @@ struct mac_iveiv_entry {
  #define RFCSR39_RX_LO2_EN             FIELD8(0x80)
  
  /*
   * RFCSR 49:
   */
  #define RFCSR49_TX                    FIELD8(0x3f)
-@@ -2135,6 +2153,8 @@ struct mac_iveiv_entry {
+@@ -2172,6 +2190,8 @@ struct mac_iveiv_entry {
   * RFCSR 50:
   */
  #define RFCSR50_TX                    FIELD8(0x3f)
 +#define RFCSR50_TX0_EXT_PA            FIELD8(0x02)
 +#define RFCSR50_TX1_EXT_PA            FIELD8(0x10)
+ #define RFCSR50_EP                    FIELD8(0xc0)
  
  /*
-  * RF registers
-@@ -2222,6 +2242,8 @@ struct mac_iveiv_entry {
+@@ -2260,6 +2280,8 @@ struct mac_iveiv_entry {
   * INTERNAL_TX_ALC: 0: disable, 1: enable
   * BT_COEXIST: 0: disable, 1: enable
   * DAC_TEST: 0: disable, 1: enable
   */
  #define       EEPROM_NIC_CONF1                0x001b
  #define EEPROM_NIC_CONF1_HW_RADIO             FIELD16(0x0001)
-@@ -2239,6 +2261,8 @@ struct mac_iveiv_entry {
+@@ -2277,6 +2299,8 @@ struct mac_iveiv_entry {
  #define EEPROM_NIC_CONF1_INTERNAL_TX_ALC              FIELD16(0x2000)
  #define EEPROM_NIC_CONF1_BT_COEXIST           FIELD16(0x4000)
  #define EEPROM_NIC_CONF1_DAC_TEST             FIELD16(0x8000)
   * EEPROM frequency
 --- a/drivers/net/wireless/rt2x00/rt2x00.h
 +++ b/drivers/net/wireless/rt2x00/rt2x00.h
-@@ -740,6 +740,8 @@ enum rt2x00_capability_flags {
+@@ -726,6 +726,8 @@ enum rt2x00_capability_flags {
        CAPABILITY_DOUBLE_ANTENNA,
        CAPABILITY_BT_COEXIST,
        CAPABILITY_VCO_RECALIBRATION,
index 38b56b4..cd9a5f3 100644 (file)
@@ -1,7 +1,7 @@
 --- a/drivers/net/wireless/rt2x00/rt2800lib.c
 +++ b/drivers/net/wireless/rt2x00/rt2800lib.c
-@@ -5169,6 +5169,27 @@ static const struct rf_channel rf_vals_3
-       {173, 0x61, 0, 9},
+@@ -6156,6 +6156,27 @@ static const struct rf_channel rf_vals_5
+       {196, 83, 0, 12, 1},
  };
  
 +/*
@@ -28,7 +28,7 @@
  static int rt2800_probe_hw_mode(struct rt2x00_dev *rt2x00dev)
  {
        struct hw_mode_spec *spec = &rt2x00dev->spec;
-@@ -5246,7 +5267,6 @@ static int rt2800_probe_hw_mode(struct r
+@@ -6234,7 +6255,6 @@ static int rt2800_probe_hw_mode(struct r
                   rt2x00_rf(rt2x00dev, RF3022) ||
                   rt2x00_rf(rt2x00dev, RF3290) ||
                   rt2x00_rf(rt2x00dev, RF3320) ||
@@ -36,7 +36,7 @@
                   rt2x00_rf(rt2x00dev, RF5360) ||
                   rt2x00_rf(rt2x00dev, RF5370) ||
                   rt2x00_rf(rt2x00dev, RF5372) ||
-@@ -5254,6 +5274,12 @@ static int rt2800_probe_hw_mode(struct r
+@@ -6242,6 +6262,12 @@ static int rt2800_probe_hw_mode(struct r
                   rt2x00_rf(rt2x00dev, RF5392)) {
                spec->num_channels = 14;
                spec->channels = rf_vals_3x;
@@ -49,7 +49,7 @@
        } else if (rt2x00_rf(rt2x00dev, RF3052)) {
                spec->supported_bands |= SUPPORT_BAND_5GHZ;
                spec->num_channels = ARRAY_SIZE(rf_vals_3x);
-@@ -5347,6 +5373,19 @@ static int rt2800_probe_hw_mode(struct r
+@@ -6389,6 +6415,19 @@ static int rt2800_probe_rt(struct rt2x00
        return 0;
  }
  
@@ -69,7 +69,7 @@
  int rt2800_probe_hw(struct rt2x00_dev *rt2x00dev)
  {
        int retval;
-@@ -5372,6 +5411,15 @@ int rt2800_probe_hw(struct rt2x00_dev *r
+@@ -6418,6 +6457,15 @@ int rt2800_probe_hw(struct rt2x00_dev *r
        rt2800_register_write(rt2x00dev, GPIO_CTRL, reg);
  
        /*
@@ -87,7 +87,7 @@
        retval = rt2800_probe_hw_mode(rt2x00dev);
 --- a/drivers/net/wireless/rt2x00/rt2x00.h
 +++ b/drivers/net/wireless/rt2x00/rt2x00.h
-@@ -419,6 +419,7 @@ static inline struct rt2x00_intf* vif_to
+@@ -409,6 +409,7 @@ static inline struct rt2x00_intf* vif_to
   * @channels: Device/chipset specific channel values (See &struct rf_channel).
   * @channels_info: Additional information for channels (See &struct channel_info).
   * @ht: Driver HT Capabilities (See &ieee80211_sta_ht_cap).
@@ -95,7 +95,7 @@
   */
  struct hw_mode_spec {
        unsigned int supported_bands;
-@@ -435,6 +436,7 @@ struct hw_mode_spec {
+@@ -425,6 +426,7 @@ struct hw_mode_spec {
        const struct channel_info *channels_info;
  
        struct ieee80211_sta_ht_cap ht;
index bb682ff..81125a9 100644 (file)
@@ -13,7 +13,7 @@ Signed-off-by: John Crispin <blogic@openwrt.org>
 
 --- a/drivers/net/wireless/rt2x00/rt2800pci.c
 +++ b/drivers/net/wireless/rt2x00/rt2800pci.c
-@@ -1185,11 +1185,18 @@ static int rt2800soc_probe(struct platfo
+@@ -1309,11 +1309,18 @@ static int rt2800soc_probe(struct platfo
        return rt2x00soc_probe(pdev, &rt2800pci_ops);
  }
  
diff --git a/package/mac80211/patches/613-rt2x00-fixup-symbols.patch b/package/mac80211/patches/613-rt2x00-fixup-symbols.patch
deleted file mode 100644 (file)
index 00bdbe1..0000000
+++ /dev/null
@@ -1,47 +0,0 @@
---- a/drivers/net/wireless/rt2x00/rt2800pci.c
-+++ b/drivers/net/wireless/rt2x00/rt2800pci.c
-@@ -1179,7 +1179,7 @@ MODULE_DEVICE_TABLE(pci, rt2800pci_devic
- #endif /* CONFIG_PCI */
- MODULE_LICENSE("GPL");
--#if defined(CONFIG_RALINK_RT288X) || defined(CONFIG_RALINK_RT305X)
-+#if defined(CONFIG_SOC_RT288X) || defined(CONFIG_SOC_RT305X)
- static int rt2800soc_probe(struct platform_device *pdev)
- {
-       return rt2x00soc_probe(pdev, &rt2800pci_ops);
-@@ -1203,7 +1203,7 @@ static struct platform_driver rt2800soc_
-       .suspend        = rt2x00soc_suspend,
-       .resume         = rt2x00soc_resume,
- };
--#endif /* CONFIG_RALINK_RT288X || CONFIG_RALINK_RT305X */
-+#endif /* CONFIG_SOC_RT288X || CONFIG_SOC_RT305X */
- #ifdef CONFIG_PCI
- static int rt2800pci_probe(struct pci_dev *pci_dev,
-@@ -1226,7 +1226,7 @@ static int __init rt2800pci_init(void)
- {
-       int ret = 0;
--#if defined(CONFIG_RALINK_RT288X) || defined(CONFIG_RALINK_RT305X)
-+#if defined(CONFIG_SOC_RT288X) || defined(CONFIG_SOC_RT305X)
-       ret = platform_driver_register(&rt2800soc_driver);
-       if (ret)
-               return ret;
-@@ -1234,7 +1234,7 @@ static int __init rt2800pci_init(void)
- #ifdef CONFIG_PCI
-       ret = pci_register_driver(&rt2800pci_driver);
-       if (ret) {
--#if defined(CONFIG_RALINK_RT288X) || defined(CONFIG_RALINK_RT305X)
-+#if defined(CONFIG_SOC_RT288X) || defined(CONFIG_SOC_RT305X)
-               platform_driver_unregister(&rt2800soc_driver);
- #endif
-               return ret;
-@@ -1249,7 +1249,7 @@ static void __exit rt2800pci_exit(void)
- #ifdef CONFIG_PCI
-       pci_unregister_driver(&rt2800pci_driver);
- #endif
--#if defined(CONFIG_RALINK_RT288X) || defined(CONFIG_RALINK_RT305X)
-+#if defined(CONFIG_SOC_RT288X) || defined(CONFIG_SOC_RT305X)
-       platform_driver_unregister(&rt2800soc_driver);
- #endif
- }
index 2020178..293b71a 100644 (file)
@@ -1,6 +1,14 @@
 --- a/drivers/net/wireless/rt2x00/rt2800pci.c
 +++ b/drivers/net/wireless/rt2x00/rt2800pci.c
-@@ -322,11 +322,17 @@ static int rt2800pci_write_firmware(stru
+@@ -39,6 +39,7 @@
+ #include <linux/pci.h>
+ #include <linux/platform_device.h>
+ #include <linux/eeprom_93cx6.h>
++#include <linux/of.h>
+ #include "rt2x00.h"
+ #include "rt2x00mmio.h"
+@@ -323,11 +324,17 @@ static int rt2800pci_write_firmware(stru
  static char *rt2800pci_get_eeprom_file_name(struct rt2x00_dev *rt2x00dev)
  {
        struct rt2x00_platform_data *pdata;
diff --git a/package/mac80211/patches/615-rt2x00-fix_20mhz_clk.patch b/package/mac80211/patches/615-rt2x00-fix_20mhz_clk.patch
new file mode 100644 (file)
index 0000000..9438d38
--- /dev/null
@@ -0,0 +1,29 @@
+--- a/drivers/net/wireless/rt2x00/rt2800lib.c
++++ b/drivers/net/wireless/rt2x00/rt2800lib.c
+@@ -38,6 +38,7 @@
+ #include <linux/kernel.h>
+ #include <linux/module.h>
+ #include <linux/slab.h>
++#include <linux/clk.h>
+ #include "rt2x00.h"
+ #include "rt2800lib.h"
+@@ -6417,13 +6418,14 @@ static int rt2800_probe_rt(struct rt2x00
+ int rt2800_probe_clk(struct rt2x00_dev *rt2x00dev)
+ {
+-      struct rt2x00_platform_data *pdata = rt2x00dev->dev->platform_data;
+       struct hw_mode_spec *spec = &rt2x00dev->spec;
++      struct clk *clk = clk_get(rt2x00dev->dev, NULL);
+-      if (!pdata)
+-              return -EINVAL;
++      if (IS_ERR(clk))
++              return PTR_ERR(clk);
+-      spec->clk_is_20mhz = pdata->clk_is_20mhz;
++      if (clk_get_rate(clk) == 20000000)
++              spec->clk_is_20mhz = 1;
+       return 0;
+ }
index d12b550..3ab466c 100644 (file)
@@ -1,8 +1,8 @@
 --- a/drivers/net/wireless/rt2x00/rt2800.h
 +++ b/drivers/net/wireless/rt2x00/rt2800.h
-@@ -69,6 +69,7 @@
- #define RF3322                                0x000c
+@@ -71,6 +71,7 @@
  #define RF3053                                0x000d
+ #define RF5592                                0x000f
  #define RF3290                                0x3290
 +#define RF5350                                0x5350
  #define RF5360                                0x5360
@@ -10,7 +10,7 @@
  #define RF5372                                0x5372
 --- a/drivers/net/wireless/rt2x00/rt2800lib.c
 +++ b/drivers/net/wireless/rt2x00/rt2800lib.c
-@@ -2138,6 +2138,15 @@ static void rt2800_config_channel_rf53xx
+@@ -2141,6 +2141,15 @@ static void rt2800_config_channel_rf53xx
        if (rf->channel <= 14) {
                int idx = rf->channel-1;
  
@@ -26,7 +26,7 @@
                if (test_bit(CAPABILITY_BT_COEXIST, &rt2x00dev->cap_flags)) {
                        if (rt2x00_rt_rev_gte(rt2x00dev, RT5390, REV_RT5390F)) {
                                /* r55/r59 value array of channel 1~14 */
-@@ -2219,6 +2228,7 @@ static void rt2800_config_channel(struct
+@@ -2598,6 +2607,7 @@ static void rt2800_config_channel(struct
        case RF3322:
                rt2800_config_channel_rf3322(rt2x00dev, conf, rf, info);
                break;
@@ -34,7 +34,7 @@
        case RF5360:
        case RF5370:
        case RF5372:
-@@ -2232,6 +2242,7 @@ static void rt2800_config_channel(struct
+@@ -2614,6 +2624,7 @@ static void rt2800_config_channel(struct
  
        if (rt2x00_rf(rt2x00dev, RF3290) ||
            rt2x00_rf(rt2x00dev, RF3322) ||
@@ -42,7 +42,7 @@
            rt2x00_rf(rt2x00dev, RF5360) ||
            rt2x00_rf(rt2x00dev, RF5370) ||
            rt2x00_rf(rt2x00dev, RF5372) ||
-@@ -2362,7 +2373,8 @@ static void rt2800_config_channel(struct
+@@ -2778,7 +2789,8 @@ static void rt2800_config_channel(struct
        /*
         * Clear update flag
         */
@@ -52,7 +52,7 @@
                rt2800_bbp_read(rt2x00dev, 49, &bbp);
                rt2x00_set_field8(&bbp, BBP49_UPDATE_FLAG, 0);
                rt2800_bbp_write(rt2x00dev, 49, bbp);
-@@ -2801,6 +2813,7 @@ void rt2800_vco_calibration(struct rt2x0
+@@ -3224,6 +3236,7 @@ void rt2800_vco_calibration(struct rt2x0
                rt2800_rfcsr_write(rt2x00dev, 7, rfcsr);
                break;
        case RF3290:
        case RF5360:
        case RF5370:
        case RF5372:
-@@ -3125,7 +3138,8 @@ static int rt2800_init_registers(struct 
+@@ -3563,7 +3576,8 @@ static int rt2800_init_registers(struct 
        } else if (rt2x00_rt(rt2x00dev, RT3572)) {
                rt2800_register_write(rt2x00dev, TX_SW_CFG0, 0x00000400);
                rt2800_register_write(rt2x00dev, TX_SW_CFG1, 0x00080606);
 -      } else if (rt2x00_rt(rt2x00dev, RT5390) ||
 +      } else if (rt2x00_rt(rt2x00dev, RT5350) ||
 +                 rt2x00_rt(rt2x00dev, RT5390) ||
-                  rt2x00_rt(rt2x00dev, RT5392)) {
+                  rt2x00_rt(rt2x00dev, RT5392) ||
+                  rt2x00_rt(rt2x00dev, RT5592)) {
                rt2800_register_write(rt2x00dev, TX_SW_CFG0, 0x00000404);
-               rt2800_register_write(rt2x00dev, TX_SW_CFG1, 0x00080606);
-@@ -3507,6 +3521,10 @@ static int rt2800_init_bbp(struct rt2x00
-               rt2800_bbp_write(rt2x00dev, 4, 0x50);
-       }
-+      if (rt2x00_rt(rt2x00dev, RT5350)) {
-+              rt2800_bbp_write(rt2x00dev, 4, 0x50);
-+      }
-+
-       if (rt2x00_rt(rt2x00dev, RT3290) ||
-           rt2x00_rt(rt2x00dev, RT5390) ||
-           rt2x00_rt(rt2x00dev, RT5392)) {
-@@ -3519,11 +3537,13 @@ static int rt2800_init_bbp(struct rt2x00
-           rt2x00_rt(rt2x00dev, RT3290) ||
-           rt2x00_rt(rt2x00dev, RT3352) ||
-           rt2x00_rt(rt2x00dev, RT3572) ||
-+          rt2x00_rt(rt2x00dev, RT5350) ||
-           rt2x00_rt(rt2x00dev, RT5390) ||
-           rt2x00_rt(rt2x00dev, RT5392))
-               rt2800_bbp_write(rt2x00dev, 31, 0x08);
--      if (rt2x00_rt(rt2x00dev, RT3352))
-+      if (rt2x00_rt(rt2x00dev, RT3352) ||
-+          rt2x00_rt(rt2x00dev, RT5350))
-               rt2800_bbp_write(rt2x00dev, 47, 0x48);
-       rt2800_bbp_write(rt2x00dev, 65, 0x2c);
-@@ -3531,6 +3551,7 @@ static int rt2800_init_bbp(struct rt2x00
-       if (rt2x00_rt(rt2x00dev, RT3290) ||
-           rt2x00_rt(rt2x00dev, RT3352) ||
-+          rt2x00_rt(rt2x00dev, RT5350) ||
-           rt2x00_rt(rt2x00dev, RT5390) ||
-           rt2x00_rt(rt2x00dev, RT5392))
-               rt2800_bbp_write(rt2x00dev, 68, 0x0b);
-@@ -3540,6 +3561,7 @@ static int rt2800_init_bbp(struct rt2x00
-               rt2800_bbp_write(rt2x00dev, 73, 0x12);
-       } else if (rt2x00_rt(rt2x00dev, RT3290) ||
-                  rt2x00_rt(rt2x00dev, RT3352) ||
-+                 rt2x00_rt(rt2x00dev, RT5350) ||
-                  rt2x00_rt(rt2x00dev, RT5390) ||
-                  rt2x00_rt(rt2x00dev, RT5392)) {
-               rt2800_bbp_write(rt2x00dev, 69, 0x12);
-@@ -3576,7 +3598,8 @@ static int rt2800_init_bbp(struct rt2x00
-               rt2800_bbp_write(rt2x00dev, 79, 0x18);
-               rt2800_bbp_write(rt2x00dev, 80, 0x09);
-               rt2800_bbp_write(rt2x00dev, 81, 0x33);
--      } else if (rt2x00_rt(rt2x00dev, RT3352)) {
-+      } else if (rt2x00_rt(rt2x00dev, RT3352) ||
-+              rt2x00_rt(rt2x00dev, RT5350)) {
-               rt2800_bbp_write(rt2x00dev, 78, 0x0e);
-               rt2800_bbp_write(rt2x00dev, 80, 0x08);
-               rt2800_bbp_write(rt2x00dev, 81, 0x37);
-@@ -3586,6 +3609,7 @@ static int rt2800_init_bbp(struct rt2x00
+@@ -4216,9 +4230,13 @@ static void rt2800_init_bbp_3352(struct 
  
        rt2800_bbp_write(rt2x00dev, 82, 0x62);
-       if (rt2x00_rt(rt2x00dev, RT3290) ||
-+          rt2x00_rt(rt2x00dev, RT5350) ||
-           rt2x00_rt(rt2x00dev, RT5390) ||
-           rt2x00_rt(rt2x00dev, RT5392))
-               rt2800_bbp_write(rt2x00dev, 83, 0x7a);
-@@ -3595,6 +3619,7 @@ static int rt2800_init_bbp(struct rt2x00
-       if (rt2x00_rt_rev(rt2x00dev, RT2860, REV_RT2860D))
-               rt2800_bbp_write(rt2x00dev, 84, 0x19);
-       else if (rt2x00_rt(rt2x00dev, RT3290) ||
-+               rt2x00_rt(rt2x00dev, RT5350) ||
-                rt2x00_rt(rt2x00dev, RT5390) ||
-                rt2x00_rt(rt2x00dev, RT5392))
-               rt2800_bbp_write(rt2x00dev, 84, 0x9a);
-@@ -3603,6 +3628,7 @@ static int rt2800_init_bbp(struct rt2x00
  
-       if (rt2x00_rt(rt2x00dev, RT3290) ||
-           rt2x00_rt(rt2x00dev, RT3352) ||
-+          rt2x00_rt(rt2x00dev, RT5350) ||
-           rt2x00_rt(rt2x00dev, RT5390) ||
-           rt2x00_rt(rt2x00dev, RT5392))
-               rt2800_bbp_write(rt2x00dev, 86, 0x38);
-@@ -3617,6 +3643,7 @@ static int rt2800_init_bbp(struct rt2x00
+-      rt2800_bbp_write(rt2x00dev, 83, 0x6a);
+-
+-      rt2800_bbp_write(rt2x00dev, 84, 0x99);
++      if (rt2x00_rt(rt2x00dev, RT5350)) {
++              rt2800_bbp_write(rt2x00dev, 83, 0x7a);
++              rt2800_bbp_write(rt2x00dev, 84, 0x9a);
++      } else {
++              rt2800_bbp_write(rt2x00dev, 83, 0x6a);
++              rt2800_bbp_write(rt2x00dev, 84, 0x99);
++      }
  
-       if (rt2x00_rt(rt2x00dev, RT3290) ||
-           rt2x00_rt(rt2x00dev, RT3352) ||
-+          rt2x00_rt(rt2x00dev, RT5350) ||
-           rt2x00_rt(rt2x00dev, RT5390) ||
-           rt2x00_rt(rt2x00dev, RT5392))
-               rt2800_bbp_write(rt2x00dev, 92, 0x02);
-@@ -3635,6 +3662,7 @@ static int rt2800_init_bbp(struct rt2x00
-           rt2x00_rt(rt2x00dev, RT3290) ||
-           rt2x00_rt(rt2x00dev, RT3352) ||
-           rt2x00_rt(rt2x00dev, RT3572) ||
-+          rt2x00_rt(rt2x00dev, RT5350) ||
-           rt2x00_rt(rt2x00dev, RT5390) ||
-           rt2x00_rt(rt2x00dev, RT5392) ||
-           rt2800_is_305x_soc(rt2x00dev))
-@@ -3644,6 +3672,7 @@ static int rt2800_init_bbp(struct rt2x00
+       rt2800_bbp_write(rt2x00dev, 86, 0x38);
  
-       if (rt2x00_rt(rt2x00dev, RT3290) ||
-           rt2x00_rt(rt2x00dev, RT3352) ||
-+          rt2x00_rt(rt2x00dev, RT5350) ||
-           rt2x00_rt(rt2x00dev, RT5390) ||
-           rt2x00_rt(rt2x00dev, RT5392))
-               rt2800_bbp_write(rt2x00dev, 104, 0x92);
-@@ -3654,13 +3683,15 @@ static int rt2800_init_bbp(struct rt2x00
-               rt2800_bbp_write(rt2x00dev, 105, 0x1c);
-       else if (rt2x00_rt(rt2x00dev, RT3352))
-               rt2800_bbp_write(rt2x00dev, 105, 0x34);
--      else if (rt2x00_rt(rt2x00dev, RT5390) ||
-+      else if (rt2x00_rt(rt2x00dev, RT5350) ||
-+               rt2x00_rt(rt2x00dev, RT5390) ||
-                rt2x00_rt(rt2x00dev, RT5392))
-               rt2800_bbp_write(rt2x00dev, 105, 0x3c);
-       else
-               rt2800_bbp_write(rt2x00dev, 105, 0x05);
+@@ -4232,9 +4250,13 @@ static void rt2800_init_bbp_3352(struct 
  
-       if (rt2x00_rt(rt2x00dev, RT3290) ||
-+              rt2x00_rt(rt2x00dev, RT5350) ||
-           rt2x00_rt(rt2x00dev, RT5390))
-               rt2800_bbp_write(rt2x00dev, 106, 0x03);
-       else if (rt2x00_rt(rt2x00dev, RT3352))
-@@ -3670,11 +3701,13 @@ static int rt2800_init_bbp(struct rt2x00
-       else
-               rt2800_bbp_write(rt2x00dev, 106, 0x35);
+       rt2800_bbp_write(rt2x00dev, 104, 0x92);
  
--      if (rt2x00_rt(rt2x00dev, RT3352))
-+      if (rt2x00_rt(rt2x00dev, RT3352) ||
-+          rt2x00_rt(rt2x00dev, RT5350))
-               rt2800_bbp_write(rt2x00dev, 120, 0x50);
-       if (rt2x00_rt(rt2x00dev, RT3290) ||
-           rt2x00_rt(rt2x00dev, RT3352) ||
-+          rt2x00_rt(rt2x00dev, RT5350) ||
-           rt2x00_rt(rt2x00dev, RT5390) ||
-           rt2x00_rt(rt2x00dev, RT5392))
-               rt2800_bbp_write(rt2x00dev, 128, 0x12);
-@@ -3684,13 +3717,15 @@ static int rt2800_init_bbp(struct rt2x00
-               rt2800_bbp_write(rt2x00dev, 135, 0xf6);
-       }
+-      rt2800_bbp_write(rt2x00dev, 105, 0x34);
+-
+-      rt2800_bbp_write(rt2x00dev, 106, 0x05);
++      if (rt2x00_rt(rt2x00dev, RT5350)) {
++              rt2800_bbp_write(rt2x00dev, 105, 0x3c);
++              rt2800_bbp_write(rt2x00dev, 106, 0x03);
++      } else {
++              rt2800_bbp_write(rt2x00dev, 105, 0x34);
++              rt2800_bbp_write(rt2x00dev, 106, 0x05);
++      }
  
--      if (rt2x00_rt(rt2x00dev, RT3352))
-+      if (rt2x00_rt(rt2x00dev, RT3352) ||
-+          rt2x00_rt(rt2x00dev, RT5350))
-               rt2800_bbp_write(rt2x00dev, 137, 0x0f);
+       rt2800_bbp_write(rt2x00dev, 120, 0x50);
  
-       if (rt2x00_rt(rt2x00dev, RT3071) ||
-           rt2x00_rt(rt2x00dev, RT3090) ||
-           rt2x00_rt(rt2x00dev, RT3390) ||
-           rt2x00_rt(rt2x00dev, RT3572) ||
-+          rt2x00_rt(rt2x00dev, RT5350) ||
-           rt2x00_rt(rt2x00dev, RT5390) ||
-           rt2x00_rt(rt2x00dev, RT5392)) {
-               rt2800_bbp_read(rt2x00dev, 138, &value);
-@@ -3727,7 +3762,8 @@ static int rt2800_init_bbp(struct rt2x00
-               rt2800_bbp_write(rt2x00dev, 3, value);
-       }
--      if (rt2x00_rt(rt2x00dev, RT3352)) {
-+      if (rt2x00_rt(rt2x00dev, RT3352) ||
-+          rt2x00_rt(rt2x00dev, RT5350)) {
-               rt2800_bbp_write(rt2x00dev, 163, 0xbd);
-               /* Set ITxBF timeout to 0x9c40=1000msec */
-               rt2800_bbp_write(rt2x00dev, 179, 0x02);
-@@ -3749,6 +3785,14 @@ static int rt2800_init_bbp(struct rt2x00
-               rt2800_bbp_write(rt2x00dev, 148, 0xc8);
-       }
+@@ -4259,6 +4281,13 @@ static void rt2800_init_bbp_3352(struct 
+       rt2800_bbp_write(rt2x00dev, 143, 0xa2);
  
+       rt2800_bbp_write(rt2x00dev, 148, 0xc8);
++
 +      if (rt2x00_rt(rt2x00dev, RT5350)) {
 +              rt2800_bbp_write(rt2x00dev, 150, 0x40); /* Antenna Software OFDM */
 +              rt2800_bbp_write(rt2x00dev, 151, 0x30); /* Antenna Software CCK */
 +              rt2800_bbp_write(rt2x00dev, 152, 0xa3);
 +              rt2800_bbp_write(rt2x00dev, 154, 0); /* Clear previously selected antenna */
 +      }
-+
-+
-       if (rt2x00_rt(rt2x00dev, RT5390) ||
-           rt2x00_rt(rt2x00dev, RT5392)) {
-               int ant, div_mode;
-@@ -4143,6 +4187,76 @@ static void rt2800_init_rfcsr_3572(struc
-       rt2800_rfcsr_write(rt2x00dev, 31, 0x10);
+ }
+ static void rt2800_init_bbp_3390(struct rt2x00_dev *rt2x00dev)
+@@ -4543,6 +4572,7 @@ static void rt2800_init_bbp(struct rt2x0
+               rt2800_init_bbp_3290(rt2x00dev);
+               break;
+       case RT3352:
++      case RT5350:
+               rt2800_init_bbp_3352(rt2x00dev);
+               break;
+       case RT3390:
+@@ -5182,6 +5212,76 @@ static void rt2800_init_rfcsr_3572(struc
+       rt2800_normal_mode_setup_3xxx(rt2x00dev);
  }
  
 +static void rt2800_init_rfcsr_5350(struct rt2x00_dev *rt2x00dev)
 +
  static void rt2800_init_rfcsr_5390(struct rt2x00_dev *rt2x00dev)
  {
-       rt2800_rfcsr_write(rt2x00dev, 1, 0x0f);
-@@ -4305,6 +4419,7 @@ static int rt2800_init_rfcsr(struct rt2x
-           !rt2x00_rt(rt2x00dev, RT3352) &&
-           !rt2x00_rt(rt2x00dev, RT3390) &&
-           !rt2x00_rt(rt2x00dev, RT3572) &&
-+          !rt2x00_rt(rt2x00dev, RT5350) &&
-           !rt2x00_rt(rt2x00dev, RT5390) &&
-           !rt2x00_rt(rt2x00dev, RT5392) &&
-           !rt2800_is_305x_soc(rt2x00dev))
-@@ -4355,6 +4470,9 @@ static int rt2800_init_rfcsr(struct rt2x
+       rt2800_rf_init_calibration(rt2x00dev, 2);
+@@ -5410,6 +5510,9 @@ static void rt2800_init_rfcsr(struct rt2
        case RT3572:
                rt2800_init_rfcsr_3572(rt2x00dev);
                break;
        case RT5390:
                rt2800_init_rfcsr_5390(rt2x00dev);
                break;
-@@ -4751,6 +4869,12 @@ static int rt2800_validate_eeprom(struct
-               if (rt2x00_get_field16(word, EEPROM_NIC_CONF0_RXPATH) > 2)
-                       rt2x00_set_field16(&word, EEPROM_NIC_CONF0_RXPATH, 2);
+@@ -5621,6 +5724,12 @@ static int rt2800_validate_eeprom(struct
+               rt2x00_set_field16(&word, EEPROM_NIC_CONF0_RF_TYPE, RF2820);
                rt2x00_eeprom_write(rt2x00dev, EEPROM_NIC_CONF0, word);
-+      } else if(rt2x00_rt(rt2x00dev, RT5350)) {
+               rt2x00_eeprom_dbg(rt2x00dev, "Antenna: 0x%04x\n", word);
++      } else if (rt2x00_rt(rt2x00dev, RT5350)) {
 +              rt2x00_set_field16(&word, EEPROM_NIC_CONF0_RXPATH, 1);
 +              rt2x00_set_field16(&word, EEPROM_NIC_CONF0_TXPATH, 1);
 +              rt2x00_set_field16(&word, EEPROM_NIC_CONF0_RF_TYPE, RF3320);
 +              rt2x00_eeprom_write(rt2x00dev, EEPROM_NIC_CONF0, word);
-+              EEPROM(rt2x00dev, "rt5350: Ant: 0x%04x\n", word);
-       }
-       rt2x00_eeprom_read(rt2x00dev, EEPROM_NIC_CONF1, &word);
-@@ -4875,6 +4999,8 @@ static int rt2800_init_eeprom(struct rt2
-           rt2x00_get_field32(reg, MAC_CSR0_CHIPSET) == RT5390 ||
-           rt2x00_get_field32(reg, MAC_CSR0_CHIPSET) == RT5392)
-               rt2x00_eeprom_read(rt2x00dev, EEPROM_CHIP_ID, &value);
-+      else if(rt2x00_get_field32(reg, MAC_CSR0_CHIPSET) == RT5350)
-+              value = RF5350;
++              rt2x00_eeprom_dbg(rt2x00dev, "Antenna: 0x%04x\n", word);
+       } else if (rt2x00_rt(rt2x00dev, RT2860) ||
+                  rt2x00_rt(rt2x00dev, RT2872)) {
+               /*
+@@ -5749,6 +5858,8 @@ static int rt2800_init_eeprom(struct rt2
+           rt2x00_rt(rt2x00dev, RT5390) ||
+           rt2x00_rt(rt2x00dev, RT5392))
+               rt2x00_eeprom_read(rt2x00dev, EEPROM_CHIP_ID, &rf);
++      else if (rt2x00_rt(rt2x00dev, RT5350))
++              rf = RF5350;
        else
-               value = rt2x00_get_field16(eeprom, EEPROM_NIC_CONF0_RF_TYPE);
+               rf = rt2x00_get_field16(eeprom, EEPROM_NIC_CONF0_RF_TYPE);
  
-@@ -4892,6 +5018,7 @@ static int rt2800_init_eeprom(struct rt2
-       case RT3352:
-       case RT3390:
-       case RT3572:
-+      case RT5350:
-       case RT5390:
-       case RT5392:
-               break;
-@@ -4913,6 +5040,7 @@ static int rt2800_init_eeprom(struct rt2
+@@ -5765,6 +5876,7 @@ static int rt2800_init_eeprom(struct rt2
        case RF3290:
        case RF3320:
        case RF3322:
        case RF5360:
        case RF5370:
        case RF5372:
-@@ -5275,7 +5403,8 @@ static int rt2800_probe_hw_mode(struct r
+@@ -6263,7 +6375,8 @@ static int rt2800_probe_hw_mode(struct r
                   rt2x00_rf(rt2x00dev, RF5392)) {
                spec->num_channels = 14;
                spec->channels = rf_vals_3x;
                spec->num_channels = 14;
                if (spec->clk_is_20mhz)
                        spec->channels = rf_vals_xtal20mhz_3x;
-@@ -5364,6 +5493,7 @@ static int rt2800_probe_hw_mode(struct r
+@@ -6364,6 +6477,7 @@ static int rt2800_probe_hw_mode(struct r
+       case RF3320:
+       case RF3052:
        case RF3290:
++      case RF5350:
        case RF5360:
        case RF5370:
-+      case RF5350:
        case RF5372:
-       case RF5390:
-       case RF5392:
+@@ -6401,6 +6515,7 @@ static int rt2800_probe_rt(struct rt2x00
+       case RT3352:
+       case RT3390:
+       case RT3572:
++      case RT5350:
+       case RT5390:
+       case RT5392:
+       case RT5592:
 --- a/drivers/net/wireless/rt2x00/rt2x00.h
 +++ b/drivers/net/wireless/rt2x00/rt2x00.h
-@@ -192,6 +192,7 @@ struct rt2x00_chip {
+@@ -181,6 +181,7 @@ struct rt2x00_chip {
  #define RT3572                0x3572
  #define RT3593                0x3593
  #define RT3883                0x3883  /* WSOC */
 +#define RT5350                0x5350  /* WSOC 2.4GHz */
  #define RT5390                0x5390  /* 2.4GHz */
  #define RT5392                0x5392  /* 2.4GHz */
+ #define RT5592                0x5592
index c7d40ef..d5af4c9 100644 (file)
@@ -12,14 +12,14 @@ Signed-off-by: John Crispin <blogic@openwrt.org>
 
 --- a/drivers/net/wireless/rt2x00/Kconfig
 +++ b/drivers/net/wireless/rt2x00/Kconfig
-@@ -64,6 +64,7 @@ config RT2800PCI
+@@ -71,6 +71,7 @@ config RT2800PCI
+       select RT2X00_LIB_FIRMWARE
+       select RT2X00_LIB_EEPROM
        select RT2X00_LIB_CRYPTO
-       select CRC_CCITT
-     &n