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
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
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
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
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)
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)
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 \
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)
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
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
$(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))
# 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))
${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}" || {
--- /dev/null
+--- 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
+++ /dev/null
---- 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
--- /dev/null
+--- 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
--- /dev/null
+--- 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;
+++ /dev/null
---- 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
+++ /dev/null
---- 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
--- /dev/null
+--- 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)
+ {
+ }
+++ /dev/null
---- 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>
- #
+++ /dev/null
---- 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
--- /dev/null
+--- 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
--- 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)) */
--- /dev/null
+--- 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
+
+++ /dev/null
---- 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;
--- /dev/null
+--- 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
+++ /dev/null
---- 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 */
+++ /dev/null
---- 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:
- *
--- /dev/null
+--- 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
--- /dev/null
+--- 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
+++ /dev/null
---- 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>
-
+++ /dev/null
---- 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;
--- 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);
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
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;
}
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;
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);
--- 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 },
{ 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) {
---- 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,
--- 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)
*/
+++ /dev/null
---- 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;
-
+++ /dev/null
---- 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);
-
- /*
--- 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 \
+ 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)
--- 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");
#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;
}
--- 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=
--- 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
--- 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(®_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)
{
--- 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 = {
+
--- 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;
}
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 +
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
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) },
--- 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;
/*
* 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))
--- 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>
#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
}
/*
*/
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;
/*
* 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;
--- 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 */
--- 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,
};
/* 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);
--- 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,
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);
--- 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
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;
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;
--- 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;
}
--- 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) {
--- 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;
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;
--- 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
};
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);
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));
}
--- 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);
*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;
--- 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;
}
/*
* 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);
---- 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;
}
--- 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;
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 */
--- 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;
}
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;
}
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;
-
--- 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);
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) {
--- 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);
#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);
--- 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;
}
+++ /dev/null
---- 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];
--- 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
+++ /dev/null
---- 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},
--- 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);
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) {
--- 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,
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
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,
};
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 */
--- 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;
--- 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;
--- 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);
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);
};
--- 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;
+++ /dev/null
---- 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;
- }
+++ /dev/null
---- 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.
--- 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");
+
+ 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=
+++ /dev/null
---- 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
--- 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)
{
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;
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;
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);
--- 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;
#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;
+ }
+
+ if ((spec->supported_bands & SUPPORT_BAND_BOTH) == 0) {
-+ ERROR(rt2x00dev, "No supported bands\n");
++ rt2x00_err(rt2x00dev, "No supported bands\n");
+ return -EINVAL;
+ }
+
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
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;
}
{
--- 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, ®);
-@@ -2412,7 +2413,11 @@ static int rt61pci_validate_eeprom(struc
+ rt2x00mmio_register_read(rt2x00dev, E2PROM_CSR, ®);
+@@ -2415,7 +2416,11 @@ static int rt61pci_validate_eeprom(struc
/*
* Start validation of the data that has been read.
*/
+
if (!is_valid_ether_addr(mac)) {
eth_random_addr(mac);
- EEPROM(rt2x00dev, "MAC: %pM\n", mac);
+ rt2x00_eeprom_dbg(rt2x00dev, "MAC: %pM\n", mac);
--- 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);
+ 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);
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,
--- 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},
};
+/*
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) ||
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;
} 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;
}
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);
/*
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).
*/
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;
--- 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);
}
+++ /dev/null
---- 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
- }
--- 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;
--- /dev/null
+--- 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;
+ }
--- 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
#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;
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;
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) ||
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
*/
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
--- 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
- select EEPROM_93CX6
+ select MTD if SOC_RT288X || SOC_RT305X
+ depends on CRC_CCITT
+ depends on EEPROM_93CX6
---help---
- This adds support for rt27xx/rt28xx/rt30xx wireless chipset family.
- Supported chips: RT2760, RT2790, RT2860, RT2880, RT2890, RT3052,
--- a/drivers/net/wireless/rt2x00/rt2x00eeprom.c
+++ b/drivers/net/wireless/rt2x00/rt2x00eeprom.c
@@ -30,12 +30,77 @@
+
ee_name = rt2x00dev->ops->lib->get_eeprom_file_name(rt2x00dev);
if (!ee_name) {
- ERROR(rt2x00dev,
+ rt2x00_err(rt2x00dev,
--- /dev/null
+--- a/drivers/net/wireless/rt2x00/rt2x00pci.c
++++ b/drivers/net/wireless/rt2x00/rt2x00pci.c
+@@ -108,7 +108,9 @@ int rt2x00pci_probe(struct pci_dev *pci_
+ goto exit_release_regions;
+ }
+
++#ifdef CONFIG_PCI_MSI
+ pci_enable_msi(pci_dev);
++#endif
+
+ hw = ieee80211_alloc_hw(sizeof(struct rt2x00_dev), ops->hw);
+ if (!hw) {
+@@ -162,7 +164,9 @@ exit_free_device:
+ ieee80211_free_hw(hw);
+
+ exit_disable_msi:
++#ifdef CONFIG_PCI_SET_MWI
+ pci_disable_msi(pci_dev);
++#endif
+
+ exit_release_regions:
+ pci_release_regions(pci_dev);
+@@ -188,7 +192,9 @@ void rt2x00pci_remove(struct pci_dev *pc
+ rt2x00pci_free_reg(rt2x00dev);
+ ieee80211_free_hw(hw);
+
++#ifdef CONFIG_PCI_MSI
+ pci_disable_msi(pci_dev);
++#endif
+
+ /*
+ * Free the PCI device data.
--- a/drivers/net/wireless/mwl8k.c
+++ b/drivers/net/wireless/mwl8k.c
-@@ -5497,6 +5497,7 @@ MODULE_FIRMWARE("mwl8k/fmimage_8366.fw")
+@@ -5530,6 +5530,7 @@ MODULE_FIRMWARE("mwl8k/fmimage_8366.fw")
MODULE_FIRMWARE(MWL8K_8366_AP_FW(MWL8K_8366_AP_FW_API));
static DEFINE_PCI_DEVICE_TABLE(mwl8k_pci_id_table) = {
+++ /dev/null
-From f340b99171e923eb6b54c1d0c22c15b45df40647 Mon Sep 17 00:00:00 2001
-From: Jonas Gorski <jogo@openwrt.org>
-Date: Mon, 11 Mar 2013 17:17:28 +0100
-Subject: [PATCH] mwl8k: don't overwrite regulatory settings
-
-Currently the caps are parsed on every firmware reload, causing any
-channel flags to be cleared.
-When there is a firmware to interface mode mismatch, the triggered
-firmware reload causes a reset of the regulatory settings, causing all
-channels to become available:
-
-root@openrouter:/# iw phy phy0 info
-Wiphy phy0
- Band 1:
- (...)
- Frequencies:
- * 2412 MHz [1] (0.0 dBm)
- * 2417 MHz [2] (0.0 dBm)
- * 2422 MHz [3] (0.0 dBm)
- * 2427 MHz [4] (0.0 dBm)
- * 2432 MHz [5] (0.0 dBm)
- * 2437 MHz [6] (0.0 dBm)
- * 2442 MHz [7] (0.0 dBm)
- * 2447 MHz [8] (0.0 dBm)
- * 2452 MHz [9] (0.0 dBm)
- * 2457 MHz [10] (0.0 dBm)
- * 2462 MHz [11] (0.0 dBm)
- * 2467 MHz [12] (0.0 dBm)
- * 2472 MHz [13] (0.0 dBm)
- * 2484 MHz [14] (0.0 dBm)
- (...)
-
-To prevent this, only parse the caps on the first firmware load during
-hardware probe, and store them locally to know we have already parsed
-them.
-
-Signed-off-by: Jonas Gorski <jogo@openwrt.org>
----
- drivers/net/wireless/mwl8k.c | 6 ++++++
- 1 file changed, 6 insertions(+)
-
---- a/drivers/net/wireless/mwl8k.c
-+++ b/drivers/net/wireless/mwl8k.c
-@@ -232,6 +232,7 @@ struct mwl8k_priv {
- u16 num_mcaddrs;
- u8 hw_rev;
- u32 fw_rev;
-+ u32 caps;
-
- /*
- * Running count of TX packets in flight, to avoid
-@@ -2401,6 +2402,9 @@ mwl8k_set_caps(struct ieee80211_hw *hw,
- {
- struct mwl8k_priv *priv = hw->priv;
-
-+ if (priv->caps)
-+ return;
-+
- if ((caps & MWL8K_CAP_2GHZ4) || !(caps & MWL8K_CAP_BAND_MASK)) {
- mwl8k_setup_2ghz_band(hw);
- if (caps & MWL8K_CAP_MIMO)
-@@ -2412,6 +2416,8 @@ mwl8k_set_caps(struct ieee80211_hw *hw,
- if (caps & MWL8K_CAP_MIMO)
- mwl8k_set_ht_caps(hw, &priv->band_50, caps);
- }
-+
-+ priv->caps = caps;
- }
-
- static int mwl8k_cmd_get_hw_spec_sta(struct ieee80211_hw *hw)
+++ /dev/null
-From 5d1ed64614ccb21c26bc0ee321e9c51b6359ceb8 Mon Sep 17 00:00:00 2001
-From: Jonas Gorski <jogo@openwrt.org>
-Date: Mon, 25 Mar 2013 15:37:42 +0100
-Subject: [PATCH] mwl8k: always apply configuration even when device is idle
-
-Fix settings not being applied when the device is idle and the firmware
-gets reloaded (because of changing from STA to AP mode). This caused
-the device using the wrong channel (and likely band), e.g. a 5 GHz only
-card still defaulted to channel 6 in the 2.4 GHz band when left
-unconfigured.
-
-This issue was always present, but only made visible with "mwl8k: Do not
-call mwl8k_cmd_set_rf_channel unconditionally" (0f4316b9), since before
-that the channel was (re-)configured at the next _config call even when
-it did not change from the mac80211 perspective.
-
-Signed-off-by: Jonas Gorski <jogo@openwrt.org>
----
- drivers/net/wireless/mwl8k.c | 10 ++++------
- 1 file changed, 4 insertions(+), 6 deletions(-)
-
---- a/drivers/net/wireless/mwl8k.c
-+++ b/drivers/net/wireless/mwl8k.c
-@@ -4818,16 +4818,14 @@ static int mwl8k_config(struct ieee80211
- struct mwl8k_priv *priv = hw->priv;
- int rc;
-
-- if (conf->flags & IEEE80211_CONF_IDLE) {
-- mwl8k_cmd_radio_disable(hw);
-- return 0;
-- }
--
- rc = mwl8k_fw_lock(hw);
- if (rc)
- return rc;
-
-- rc = mwl8k_cmd_radio_enable(hw);
-+ if (conf->flags & IEEE80211_CONF_IDLE)
-+ rc = mwl8k_cmd_radio_disable(hw);
-+ else
-+ rc = mwl8k_cmd_radio_enable(hw);
- if (rc)
- goto out;
-
--- a/drivers/net/wireless/b43/b43.h
+++ b/drivers/net/wireless/b43/b43.h
-@@ -812,6 +812,7 @@ struct b43_wldev {
+@@ -820,6 +820,7 @@ struct b43_wldev {
bool qos_enabled; /* TRUE, if QoS is used. */
bool hwcrypto_enabled; /* TRUE, if HW crypto acceleration is enabled. */
bool use_pio; /* TRUE if next init should use PIO */
static int modparam_bad_frames_preempt;
module_param_named(bad_frames_preempt, modparam_bad_frames_preempt, int, 0444);
MODULE_PARM_DESC(bad_frames_preempt,
-@@ -2740,10 +2745,10 @@ static int b43_gpio_init(struct b43_wlde
+@@ -2742,10 +2747,10 @@ static int b43_gpio_init(struct b43_wlde
u32 mask, set;
b43_maskset32(dev, B43_MMIO_MACCTL, ~B43_MACCTL_GPOUTSMSK, 0);
-b43-y += pio.o
+b43-$(CONFIG_B43_PIO) += pio.o
b43-y += rfkill.o
- b43-$(CONFIG_B43_LEDS) += leds.o
- b43-$(CONFIG_B43_PCMCIA) += pcmcia.o
+ b43-$(CPTCFG_B43_LEDS) += leds.o
+ b43-$(CPTCFG_B43_PCMCIA) += pcmcia.o
--- a/drivers/net/wireless/b43/main.c
+++ b/drivers/net/wireless/b43/main.c
-@@ -1909,10 +1909,12 @@ static void b43_do_interrupt_thread(stru
- dma_reason[0], dma_reason[1],
- dma_reason[2], dma_reason[3],
- dma_reason[4], dma_reason[5]);
+@@ -1915,10 +1915,12 @@ static void b43_do_interrupt_thread(stru
+ dma_reason[0], dma_reason[1],
+ dma_reason[2], dma_reason[3],
+ dma_reason[4], dma_reason[5]);
+#ifdef CONFIG_B43_PIO
- b43err(dev->wl, "This device does not support DMA "
+ b43err(dev->wl, "This device does not support DMA "
"on your system. It will now be switched to PIO.\n");
- /* Fall back to PIO transfers if we get fatal DMA errors! */
- dev->use_pio = true;
+ /* Fall back to PIO transfers if we get fatal DMA errors! */
+ dev->use_pio = true;
+#endif
- b43_controller_restart(dev, "DMA error");
- return;
- }
+ b43_controller_restart(dev, "DMA error");
+ return;
+ }
--- a/drivers/net/wireless/b43/pio.h
+++ b/drivers/net/wireless/b43/pio.h
@@ -150,7 +150,7 @@ static inline void b43_piorx_write32(str
+#endif /* CONFIG_B43_PIO */
#endif /* B43_PIO_H_ */
+--- a/drivers/net/wireless/b43/Kconfig
++++ b/drivers/net/wireless/b43/Kconfig
+@@ -98,7 +98,7 @@ config B43_BCMA_PIO
+ default y
+
+ config B43_PIO
+- bool
++ bool "Broadcom 43xx PIO support"
+ depends on B43
+ select SSB_BLOCKIO
+ default y
--- a/drivers/net/wireless/b43/main.c
+++ b/drivers/net/wireless/b43/main.c
-@@ -1553,7 +1553,7 @@ static void b43_write_beacon_template(st
+@@ -1562,7 +1562,7 @@ static void b43_write_beacon_template(st
len, ram_offset, shm_size_offset, rate);
/* Write the PHY TX control parameters. */
antenna = b43_antenna_to_phyctl(antenna);
ctl = b43_shm_read16(dev, B43_SHM_SHARED, B43_SHM_SH_BEACPHYCTL);
/* We can't send beacons with short preamble. Would get PHY errors. */
-@@ -3101,8 +3101,8 @@ static int b43_chip_init(struct b43_wlde
+@@ -3100,8 +3100,8 @@ static int b43_chip_init(struct b43_wlde
/* Select the antennae */
if (phy->ops->set_rx_antenna)
if (phy->type == B43_PHYTYPE_B) {
value16 = b43_read16(dev, 0x005E);
-@@ -3846,7 +3846,6 @@ static int b43_op_config(struct ieee8021
+@@ -3845,7 +3845,6 @@ static int b43_op_config(struct ieee8021
struct b43_wldev *dev;
struct b43_phy *phy;
struct ieee80211_conf *conf = &hw->conf;
int err = 0;
bool reload_bss = false;
-@@ -3900,11 +3899,9 @@ static int b43_op_config(struct ieee8021
+@@ -3899,11 +3898,9 @@ static int b43_op_config(struct ieee8021
}
/* Antennas for RX and management frame TX. */
if (wl->radio_enabled != phy->radio_on) {
if (wl->radio_enabled) {
-@@ -5030,6 +5027,47 @@ static int b43_op_get_survey(struct ieee
+@@ -5028,6 +5025,47 @@ static int b43_op_get_survey(struct ieee
return 0;
}
static const struct ieee80211_ops b43_hw_ops = {
.tx = b43_op_tx,
.conf_tx = b43_op_conf_tx,
-@@ -5051,6 +5089,8 @@ static const struct ieee80211_ops b43_hw
+@@ -5049,6 +5087,8 @@ static const struct ieee80211_ops b43_hw
.sw_scan_complete = b43_op_sw_scan_complete_notifier,
.get_survey = b43_op_get_survey,
.rfkill_poll = b43_rfkill_poll,
};
/* Hard-reset the chip. Do not call this directly.
-@@ -5297,6 +5337,8 @@ static int b43_one_core_attach(struct b4
+@@ -5295,6 +5335,8 @@ static int b43_one_core_attach(struct b4
if (!wldev)
goto out;
wldev->use_pio = b43_modparam_pio;
wldev->dev = dev;
wldev->wl = wl;
-@@ -5387,6 +5429,9 @@ static struct b43_wl *b43_wireless_init(
+@@ -5385,6 +5427,9 @@ static struct b43_wl *b43_wireless_init(
hw->wiphy->flags |= WIPHY_FLAG_IBSS_RSN;
SET_IEEE80211_DEV(hw, dev->dev);
--- a/drivers/net/wireless/b43/b43.h
+++ b/drivers/net/wireless/b43/b43.h
-@@ -813,6 +813,8 @@ struct b43_wldev {
+@@ -821,6 +821,8 @@ struct b43_wldev {
bool hwcrypto_enabled; /* TRUE, if HW crypto acceleration is enabled. */
bool use_pio; /* TRUE if next init should use PIO */
int gpiomask; /* GPIO LED mask as a module parameter */
--- a/drivers/net/wireless/b43/b43.h
+++ b/drivers/net/wireless/b43/b43.h
-@@ -1053,6 +1053,32 @@ static inline bool b43_using_pio_transfe
+@@ -1061,6 +1061,32 @@ static inline bool b43_using_pio_transfe
return dev->__using_pio_transfers;
}
dev->phy.writes_counter = 0;
--- a/drivers/net/wireless/b43/phy_n.c
+++ b/drivers/net/wireless/b43/phy_n.c
-@@ -5423,14 +5423,14 @@ static inline void check_phyreg(struct b
+@@ -5417,14 +5417,14 @@ static inline void check_phyreg(struct b
static u16 b43_nphy_op_read(struct b43_wldev *dev, u16 reg)
{
check_phyreg(dev, reg);
b43_write16(dev, B43_MMIO_PHY_DATA, value);
}
-@@ -5438,7 +5438,7 @@ static void b43_nphy_op_maskset(struct b
+@@ -5432,7 +5432,7 @@ static void b43_nphy_op_maskset(struct b
u16 set)
{
check_phyreg(dev, reg);
b43_maskset16(dev, B43_MMIO_PHY_DATA, mask, set);
}
-@@ -5449,7 +5449,7 @@ static u16 b43_nphy_op_radio_read(struct
+@@ -5443,7 +5443,7 @@ static u16 b43_nphy_op_radio_read(struct
/* N-PHY needs 0x100 for read access */
reg |= 0x100;
return b43_read16(dev, B43_MMIO_RADIO_DATA_LOW);
}
-@@ -5458,7 +5458,7 @@ static void b43_nphy_op_radio_write(stru
+@@ -5452,7 +5452,7 @@ static void b43_nphy_op_radio_write(stru
/* Register 1 is a 32-bit register. */
B43_WARN_ON(reg == 1);
+++ /dev/null
---- a/drivers/net/wireless/b43/main.c
-+++ b/drivers/net/wireless/b43/main.c
-@@ -4701,7 +4701,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,
-+ bcma_core_pci_irq_ctl(&dev->dev->bdev->bus->drv_pci[0],
- 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, true);
-+ bcma_core_pci_extend_L1timer(&sii->icbus->drv_pci[0], 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, false);
-+ bcma_core_pci_extend_L1timer(&sii->icbus->drv_pci[0], 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, wlc_hw->d11core,
-+ bcma_core_pci_irq_ctl(&wlc_hw->d11core->bus->drv_pci[0], wlc_hw->d11core,
- true);
-
- /*
+++ /dev/null
---- a/drivers/net/wireless/b43/dma.h
-+++ b/drivers/net/wireless/b43/dma.h
-@@ -169,7 +169,7 @@ struct b43_dmadesc_generic {
-
- /* DMA engine tuning knobs */
- #define B43_TXRING_SLOTS 256
--#define B43_RXRING_SLOTS 64
-+#define B43_RXRING_SLOTS 256
- #define B43_DMA0_RX_FW598_BUFSIZE (B43_DMA0_RX_FW598_FO + IEEE80211_MAX_FRAME_LEN)
- #define B43_DMA0_RX_FW351_BUFSIZE (B43_DMA0_RX_FW351_FO + IEEE80211_MAX_FRAME_LEN)
-
--- /dev/null
+--- a/drivers/net/wireless/b43/dma.h
++++ b/drivers/net/wireless/b43/dma.h
+@@ -169,7 +169,7 @@ struct b43_dmadesc_generic {
+
+ /* DMA engine tuning knobs */
+ #define B43_TXRING_SLOTS 256
+-#define B43_RXRING_SLOTS 256
++#define B43_RXRING_SLOTS 32
+ #define B43_DMA0_RX_FW598_BUFSIZE (B43_DMA0_RX_FW598_FO + IEEE80211_MAX_FRAME_LEN)
+ #define B43_DMA0_RX_FW351_BUFSIZE (B43_DMA0_RX_FW351_FO + IEEE80211_MAX_FRAME_LEN)
+
--- /dev/null
+--- a/drivers/net/wireless/b43/main.c
++++ b/drivers/net/wireless/b43/main.c
+@@ -2759,6 +2759,14 @@ static int b43_gpio_init(struct b43_wlde
+ } else if (dev->dev->chip_id == 0x5354) {
+ /* Don't allow overtaking buttons GPIOs */
+ set &= 0x2; /* 0x2 is LED GPIO on BCM5354 */
++ } else if (dev->dev->chip_id == BCMA_CHIP_ID_BCM4716 ||
++ dev->dev->chip_id == BCMA_CHIP_ID_BCM47162 ||
++ dev->dev->chip_id == BCMA_CHIP_ID_BCM5356 ||
++ dev->dev->chip_id == BCMA_CHIP_ID_BCM5357 ||
++ dev->dev->chip_id == BCMA_CHIP_ID_BCM53572) {
++ /* just use gpio 0 and 1 for 2.4 GHz wifi led */
++ set &= 0x3;
++ mask &= 0x3;
+ }
+
+ if (0 /* FIXME: conditional unknown */ ) {
+++ /dev/null
---- a/drivers/net/wireless/brcm80211/brcmsmac/mac80211_if.c
-+++ b/drivers/net/wireless/brcm80211/brcmsmac/mac80211_if.c
-@@ -99,6 +99,7 @@ static struct bcma_device_id brcms_corei
- BCMA_CORE(BCMA_MANUF_BCM, BCMA_CORE_80211, 17, BCMA_ANY_CLASS),
- BCMA_CORE(BCMA_MANUF_BCM, BCMA_CORE_80211, 23, BCMA_ANY_CLASS),
- BCMA_CORE(BCMA_MANUF_BCM, BCMA_CORE_80211, 24, BCMA_ANY_CLASS),
-+// BCMA_CORE(BCMA_MANUF_BCM, BCMA_CORE_80211, 28, BCMA_ANY_CLASS),
- BCMA_CORETABLE_END
- };
- MODULE_DEVICE_TABLE(bcma, brcms_coreid_table);
---- a/drivers/net/wireless/brcm80211/brcmsmac/main.c
-+++ b/drivers/net/wireless/brcm80211/brcmsmac/main.c
-@@ -717,7 +717,7 @@ static void brcms_c_ucode_bsinit(struct
- brcms_c_write_mhf(wlc_hw, wlc_hw->band->mhfs);
-
- /* do band-specific ucode IHR, SHM, and SCR inits */
-- if (D11REV_IS(wlc_hw->corerev, 17) || D11REV_IS(wlc_hw->corerev, 23)) {
-+ if (D11REV_IS(wlc_hw->corerev, 17) || D11REV_IS(wlc_hw->corerev, 23) || D11REV_IS(wlc_hw->corerev, 28)) {
- if (BRCMS_ISNPHY(wlc_hw->band))
- brcms_c_write_inits(wlc_hw, ucode->d11n0bsinitvals16);
- else
-@@ -2257,7 +2257,7 @@ static void brcms_ucode_download(struct
- if (wlc_hw->ucode_loaded)
- return;
-
-- if (D11REV_IS(wlc_hw->corerev, 17) || D11REV_IS(wlc_hw->corerev, 23)) {
-+ if (D11REV_IS(wlc_hw->corerev, 17) || D11REV_IS(wlc_hw->corerev, 23) || D11REV_IS(wlc_hw->corerev, 28)) {
- if (BRCMS_ISNPHY(wlc_hw->band)) {
- brcms_ucode_write(wlc_hw, ucode->bcm43xx_16_mimo,
- ucode->bcm43xx_16_mimosz);
-@@ -3207,7 +3207,7 @@ static void brcms_b_coreinit(struct brcm
-
- sflags = bcma_aread32(core, BCMA_IOST);
-
-- if (D11REV_IS(wlc_hw->corerev, 17) || D11REV_IS(wlc_hw->corerev, 23)) {
-+ if (D11REV_IS(wlc_hw->corerev, 17) || D11REV_IS(wlc_hw->corerev, 23) || D11REV_IS(wlc_hw->corerev, 28)) {
- if (BRCMS_ISNPHY(wlc_hw->band))
- brcms_c_write_inits(wlc_hw, ucode->d11n0initvals16);
- else
-@@ -5663,6 +5663,8 @@ static bool brcms_c_chipmatch_soc(struct
-
- if (chipinfo->id == BCMA_CHIP_ID_BCM4716)
- return true;
-+ if (chipinfo->id == BCMA_CHIP_ID_BCM5357)
-+ return true;
-
- pr_err("unknown chip id %04x\n", chipinfo->id);
- return false;
---- a/drivers/net/wireless/brcm80211/brcmsmac/main.h
-+++ b/drivers/net/wireless/brcm80211/brcmsmac/main.h
-@@ -65,7 +65,7 @@
- #define SW_TIMER_MAC_STAT_UPD 30 /* periodic MAC stats update */
-
- /* max # supported core revisions (0 .. MAXCOREREV - 1) */
--#define MAXCOREREV 28
-+#define MAXCOREREV 29
-
- /* Double check that unsupported cores are not enabled */
- #if CONF_MSK(D11CONF, 0x4f) || CONF_GE(D11CONF, MAXCOREREV)
---- a/drivers/net/wireless/brcm80211/brcmsmac/types.h
-+++ b/drivers/net/wireless/brcm80211/brcmsmac/types.h
-@@ -93,11 +93,11 @@
- #define BOARD_GPIO_13 0x2000
-
- /* **** Core type/rev defaults **** */
--#define D11CONF 0x0fffffb0 /* Supported D11 revs: 4, 5, 7-27
-+#define D11CONF 0x1fffffb0 /* Supported D11 revs: 4, 5, 7-27
- * also need to update wlc.h MAXCOREREV
- */
-
--#define NCONF 0x000001ff /* Supported nphy revs:
-+#define NCONF 0x000002ff /* Supported nphy revs:
- * 0 4321a0
- * 1 4321a1
- * 2 4321b0/b1/c0/c1
--- /dev/null
+--- a/drivers/net/wireless/brcm80211/brcmsmac/channel.c
++++ b/drivers/net/wireless/brcm80211/brcmsmac/channel.c
+@@ -59,23 +59,16 @@
+
+ #define BRCM_2GHZ_2412_2462 REG_RULE(2412-10, 2462+10, 40, 0, 19, 0)
+ #define BRCM_2GHZ_2467_2472 REG_RULE(2467-10, 2472+10, 20, 0, 19, \
+- NL80211_RRF_PASSIVE_SCAN | \
+- NL80211_RRF_NO_IBSS)
++ 0)
+
+ #define BRCM_5GHZ_5180_5240 REG_RULE(5180-10, 5240+10, 40, 0, 21, \
+- NL80211_RRF_PASSIVE_SCAN | \
+- NL80211_RRF_NO_IBSS)
++ 0)
+ #define BRCM_5GHZ_5260_5320 REG_RULE(5260-10, 5320+10, 40, 0, 21, \
+- NL80211_RRF_PASSIVE_SCAN | \
+- NL80211_RRF_DFS | \
+- NL80211_RRF_NO_IBSS)
++ 0)
+ #define BRCM_5GHZ_5500_5700 REG_RULE(5500-10, 5700+10, 40, 0, 21, \
+- NL80211_RRF_PASSIVE_SCAN | \
+- NL80211_RRF_DFS | \
+- NL80211_RRF_NO_IBSS)
++ 0)
+ #define BRCM_5GHZ_5745_5825 REG_RULE(5745-10, 5825+10, 40, 0, 21, \
+- NL80211_RRF_PASSIVE_SCAN | \
+- NL80211_RRF_NO_IBSS)
++ 0)
+
+ static const struct ieee80211_regdomain brcms_regdom_x2 = {
+ .n_reg_rules = 6,
+++ /dev/null
---- a/drivers/net/wireless/brcm80211/brcmsmac/d11.h
-+++ b/drivers/net/wireless/brcm80211/brcmsmac/d11.h
-@@ -457,6 +457,7 @@ struct d11regs {
- /*== maccontrol register ==*/
- #define MCTL_GMODE (1U << 31)
- #define MCTL_DISCARD_PMQ (1 << 30)
-+#define MCTL_TBTTHOLD (1 << 28)
- #define MCTL_WAKE (1 << 26)
- #define MCTL_HPS (1 << 25)
- #define MCTL_PROMISC (1 << 24)
---- a/drivers/net/wireless/brcm80211/brcmsmac/mac80211_if.c
-+++ b/drivers/net/wireless/brcm80211/brcmsmac/mac80211_if.c
-@@ -741,6 +741,28 @@ static void brcms_ops_flush(struct ieee8
- "ret=%d\n", jiffies_to_msecs(ret));
- }
-
-+static u64 brcms_ops_get_tsf(struct ieee80211_hw *hw, struct ieee80211_vif *vif)
-+{
-+ struct brcms_info *wl = hw->priv;
-+ u64 tsf;
-+
-+ spin_lock_bh(&wl->lock);
-+ tsf = brcms_c_tsf_get(wl->wlc);
-+ spin_unlock_bh(&wl->lock);
-+
-+ return tsf;
-+}
-+
-+static void brcms_ops_set_tsf(struct ieee80211_hw *hw,
-+ struct ieee80211_vif *vif, u64 tsf)
-+{
-+ struct brcms_info *wl = hw->priv;
-+
-+ spin_lock_bh(&wl->lock);
-+ brcms_c_tsf_set(wl->wlc, tsf);
-+ spin_unlock_bh(&wl->lock);
-+}
-+
- static const struct ieee80211_ops brcms_ops = {
- .tx = brcms_ops_tx,
- .start = brcms_ops_start,
-@@ -757,6 +779,8 @@ static const struct ieee80211_ops brcms_
- .ampdu_action = brcms_ops_ampdu_action,
- .rfkill_poll = brcms_ops_rfkill_poll,
- .flush = brcms_ops_flush,
-+ .get_tsf = brcms_ops_get_tsf,
-+ .set_tsf = brcms_ops_set_tsf,
- };
-
- void brcms_dpc(unsigned long data)
---- a/drivers/net/wireless/brcm80211/brcmsmac/main.c
-+++ b/drivers/net/wireless/brcm80211/brcmsmac/main.c
-@@ -5545,6 +5545,20 @@ int brcms_c_set_rateset(struct brcms_c_i
- return bcmerror;
- }
-
-+static void brcms_c_time_lock(struct brcms_c_info *wlc)
-+{
-+ bcma_set32(wlc->hw->d11core, D11REGOFFS(maccontrol), MCTL_TBTTHOLD);
-+ /* Commit the write */
-+ bcma_read32(wlc->hw->d11core, D11REGOFFS(maccontrol));
-+}
-+
-+static void brcms_c_time_unlock(struct brcms_c_info *wlc)
-+{
-+ bcma_mask32(wlc->hw->d11core, D11REGOFFS(maccontrol), ~MCTL_TBTTHOLD);
-+ /* Commit the write */
-+ bcma_read32(wlc->hw->d11core, D11REGOFFS(maccontrol));
-+}
-+
- int brcms_c_set_beacon_period(struct brcms_c_info *wlc, u16 period)
- {
- if (period == 0)
-@@ -7530,6 +7544,36 @@ void brcms_c_set_beacon_listen_interval(
- brcms_c_bcn_li_upd(wlc);
- }
-
-+u64 brcms_c_tsf_get(struct brcms_c_info *wlc)
-+{
-+ u32 tsf_h, tsf_l;
-+ u64 tsf;
-+
-+ brcms_b_read_tsf(wlc->hw, &tsf_l, &tsf_h);
-+
-+ tsf = tsf_h;
-+ tsf <<= 32;
-+ tsf |= tsf_l;
-+
-+ return tsf;
-+}
-+
-+void brcms_c_tsf_set(struct brcms_c_info *wlc, u64 tsf)
-+{
-+ u32 tsf_h, tsf_l;
-+
-+ brcms_c_time_lock(wlc);
-+
-+ tsf_l = tsf;
-+ tsf_h = (tsf >> 32);
-+
-+ /* read the tsf timer low, then high to get an atomic read */
-+ bcma_write32(wlc->hw->d11core, D11REGOFFS(tsf_timerlow), tsf_l);
-+ bcma_write32(wlc->hw->d11core, D11REGOFFS(tsf_timerhigh), tsf_h);
-+
-+ brcms_c_time_unlock(wlc);
-+}
-+
- int brcms_c_set_tx_power(struct brcms_c_info *wlc, int txpwr)
- {
- uint qdbm;
---- a/drivers/net/wireless/brcm80211/brcmsmac/pub.h
-+++ b/drivers/net/wireless/brcm80211/brcmsmac/pub.h
-@@ -326,6 +326,8 @@ extern void brcms_c_set_shortslot_overri
- s8 sslot_override);
- extern void brcms_c_set_beacon_listen_interval(struct brcms_c_info *wlc,
- u8 interval);
-+extern u64 brcms_c_tsf_get(struct brcms_c_info *wlc);
-+extern void brcms_c_tsf_set(struct brcms_c_info *wlc, u64 tsf);
- extern int brcms_c_set_tx_power(struct brcms_c_info *wlc, int txpwr);
- extern int brcms_c_get_tx_power(struct brcms_c_info *wlc);
- extern bool brcms_c_check_radio_disabled(struct brcms_c_info *wlc);
+++ /dev/null
---- a/drivers/net/wireless/brcm80211/brcmsmac/mac80211_if.c
-+++ b/drivers/net/wireless/brcm80211/brcmsmac/mac80211_if.c
-@@ -367,9 +367,10 @@ brcms_ops_add_interface(struct ieee80211
- }
-
- spin_lock_bh(&wl->lock);
-- memcpy(wl->pub->cur_etheraddr, vif->addr, sizeof(vif->addr));
- wl->mute_tx = false;
- brcms_c_mute(wl->wlc, false);
-+ if (vif->type == NL80211_IFTYPE_STATION)
-+ brcms_c_start_station(wl->wlc, vif->addr);
- spin_unlock_bh(&wl->lock);
-
- return 0;
---- a/drivers/net/wireless/brcm80211/brcmsmac/main.c
-+++ b/drivers/net/wireless/brcm80211/brcmsmac/main.c
-@@ -2165,6 +2165,12 @@ void brcms_b_switch_macfreq(struct brcms
- }
- }
-
-+void brcms_c_start_station(struct brcms_c_info *wlc, u8 *addr)
-+{
-+ memcpy(wlc->pub->cur_etheraddr, addr, sizeof(wlc->pub->cur_etheraddr));
-+ wlc->bsscfg->type = BRCMS_TYPE_STATION;
-+}
-+
- /* Initialize GPIOs that are controlled by D11 core */
- static void brcms_c_gpio_init(struct brcms_c_info *wlc)
- {
---- a/drivers/net/wireless/brcm80211/brcmsmac/main.h
-+++ b/drivers/net/wireless/brcm80211/brcmsmac/main.h
-@@ -576,10 +576,17 @@ struct antsel_info {
- struct brcms_antselcfg antcfg_cur; /* current antenna config (auto) */
- };
-
-+enum brcms_bss_type {
-+ BRCMS_TYPE_STATION,
-+ BRCMS_TYPE_AP,
-+ BRCMS_TYPE_ADHOC,
-+};
-+
- /*
- * BSS configuration state
- *
- * wlc: wlc to which this bsscfg belongs to.
-+ * type: interface type
- * up: is this configuration up operational
- * enable: is this configuration enabled
- * associated: is BSS in ASSOCIATED state
-@@ -599,6 +606,7 @@ struct antsel_info {
- */
- struct brcms_bss_cfg {
- struct brcms_c_info *wlc;
-+ enum brcms_bss_type type;
- bool up;
- bool enable;
- bool associated;
---- a/drivers/net/wireless/brcm80211/brcmsmac/pub.h
-+++ b/drivers/net/wireless/brcm80211/brcmsmac/pub.h
-@@ -333,5 +333,6 @@ extern int brcms_c_get_tx_power(struct b
- extern bool brcms_c_check_radio_disabled(struct brcms_c_info *wlc);
- extern void brcms_c_mute(struct brcms_c_info *wlc, bool on);
- extern bool brcms_c_tx_flush_completed(struct brcms_c_info *wlc);
-+extern void brcms_c_start_station(struct brcms_c_info *wlc, u8 *addr);
-
- #endif /* _BRCM_PUB_H_ */
+++ /dev/null
---- a/drivers/net/wireless/brcm80211/brcmsmac/main.c
-+++ b/drivers/net/wireless/brcm80211/brcmsmac/main.c
-@@ -1071,7 +1071,7 @@ brcms_b_txstatus(struct brcms_hardware *
-
- static void brcms_c_tbtt(struct brcms_c_info *wlc)
- {
-- if (!wlc->bsscfg->BSS)
-+ if (wlc->bsscfg->type == BRCMS_TYPE_ADHOC)
- /*
- * DirFrmQ is now valid...defer setting until end
- * of ATIM window
-@@ -3061,16 +3061,8 @@ static bool brcms_c_ps_allowed(struct br
- if (wlc->filter_flags & FIF_PROMISC_IN_BSS)
- return false;
-
-- if (cfg->associated) {
-- /*
-- * disallow PS when one of the following
-- * bsscfg specific conditions meets
-- */
-- if (!cfg->BSS)
-- return false;
--
-+ if (cfg->associated)
- return false;
-- }
-
- return true;
- }
-@@ -5080,8 +5072,9 @@ int brcms_c_up(struct brcms_c_info *wlc)
- struct brcms_bss_cfg *bsscfg = wlc->bsscfg;
- mboolset(wlc->pub->radio_disabled,
- WL_RADIO_HW_DISABLE);
--
-- if (bsscfg->enable && bsscfg->BSS)
-+ if (bsscfg->enable &&
-+ (bsscfg->type == BRCMS_TYPE_STATION ||
-+ bsscfg->type == BRCMS_TYPE_ADHOC))
- brcms_err(wlc->hw->d11core,
- "wl%d: up: rfdisable -> "
- "bsscfg_disable()\n",
-@@ -7390,7 +7383,8 @@ void brcms_c_update_beacon(struct brcms_
- {
- struct brcms_bss_cfg *bsscfg = wlc->bsscfg;
-
-- if (bsscfg->up && !bsscfg->BSS)
-+ if (bsscfg->up && (bsscfg->type == BRCMS_TYPE_AP ||
-+ bsscfg->type == BRCMS_TYPE_ADHOC))
- /* Clear the soft intmask */
- wlc->defmacintmask &= ~MI_BCNTPL;
- }
-@@ -7465,7 +7459,8 @@ void brcms_c_update_probe_resp(struct br
- struct brcms_bss_cfg *bsscfg = wlc->bsscfg;
-
- /* update AP or IBSS probe responses */
-- if (bsscfg->up && !bsscfg->BSS)
-+ if (bsscfg->up && (bsscfg->type == BRCMS_TYPE_AP ||
-+ bsscfg->type == BRCMS_TYPE_ADHOC))
- brcms_c_bss_update_probe_resp(wlc, bsscfg, suspend);
- }
-
---- a/drivers/net/wireless/brcm80211/brcmsmac/main.h
-+++ b/drivers/net/wireless/brcm80211/brcmsmac/main.h
-@@ -590,7 +590,6 @@ enum brcms_bss_type {
- * up: is this configuration up operational
- * enable: is this configuration enabled
- * associated: is BSS in ASSOCIATED state
-- * BSS: infraustructure or adhoc
- * SSID_len: the length of SSID
- * SSID: SSID string
- *
-@@ -610,7 +609,6 @@ struct brcms_bss_cfg {
- bool up;
- bool enable;
- bool associated;
-- bool BSS;
- u8 SSID_len;
- u8 SSID[IEEE80211_MAX_SSID_LEN];
- u8 BSSID[ETH_ALEN];
+++ /dev/null
---- a/drivers/net/wireless/brcm80211/brcmsmac/main.c
-+++ b/drivers/net/wireless/brcm80211/brcmsmac/main.c
-@@ -3051,8 +3051,6 @@ static void brcms_b_antsel_set(struct br
- */
- static bool brcms_c_ps_allowed(struct brcms_c_info *wlc)
- {
-- struct brcms_bss_cfg *cfg = wlc->bsscfg;
--
- /* disallow PS when one of the following global conditions meets */
- if (!wlc->pub->associated)
- return false;
-@@ -3061,9 +3059,6 @@ static bool brcms_c_ps_allowed(struct br
- if (wlc->filter_flags & FIF_PROMISC_IN_BSS)
- return false;
-
-- if (cfg->associated)
-- return false;
--
- return true;
- }
-
-@@ -3821,7 +3816,7 @@ static void brcms_c_set_home_chanspec(st
- if (wlc->home_chanspec != chanspec) {
- wlc->home_chanspec = chanspec;
-
-- if (wlc->bsscfg->associated)
-+ if (wlc->pub->associated)
- wlc->bsscfg->current_bss->chanspec = chanspec;
- }
- }
-@@ -5435,7 +5430,7 @@ static void brcms_c_ofdm_rateset_war(str
- u8 r;
- bool war = false;
-
-- if (wlc->bsscfg->associated)
-+ if (wlc->pub->associated)
- r = wlc->bsscfg->current_bss->rateset.rates[0];
- else
- r = wlc->default_bss->rateset.rates[0];
-@@ -5529,7 +5524,7 @@ int brcms_c_set_rateset(struct brcms_c_i
- /* merge rateset coming in with the current mcsset */
- if (wlc->pub->_n_enab & SUPPORT_11N) {
- struct brcms_bss_info *mcsset_bss;
-- if (wlc->bsscfg->associated)
-+ if (wlc->pub->associated)
- mcsset_bss = wlc->bsscfg->current_bss;
- else
- mcsset_bss = wlc->default_bss;
-@@ -7500,7 +7495,6 @@ void brcms_c_scan_stop(struct brcms_c_in
- void brcms_c_associate_upd(struct brcms_c_info *wlc, bool state)
- {
- wlc->pub->associated = state;
-- wlc->bsscfg->associated = state;
- }
-
- /*
---- a/drivers/net/wireless/brcm80211/brcmsmac/main.h
-+++ b/drivers/net/wireless/brcm80211/brcmsmac/main.h
-@@ -589,7 +589,6 @@ enum brcms_bss_type {
- * type: interface type
- * up: is this configuration up operational
- * enable: is this configuration enabled
-- * associated: is BSS in ASSOCIATED state
- * SSID_len: the length of SSID
- * SSID: SSID string
- *
-@@ -608,7 +607,6 @@ struct brcms_bss_cfg {
- enum brcms_bss_type type;
- bool up;
- bool enable;
-- bool associated;
- u8 SSID_len;
- u8 SSID[IEEE80211_MAX_SSID_LEN];
- u8 BSSID[ETH_ALEN];
+++ /dev/null
---- a/drivers/net/wireless/brcm80211/brcmsmac/main.c
-+++ b/drivers/net/wireless/brcm80211/brcmsmac/main.c
-@@ -5067,9 +5067,8 @@ int brcms_c_up(struct brcms_c_info *wlc)
- struct brcms_bss_cfg *bsscfg = wlc->bsscfg;
- mboolset(wlc->pub->radio_disabled,
- WL_RADIO_HW_DISABLE);
-- if (bsscfg->enable &&
-- (bsscfg->type == BRCMS_TYPE_STATION ||
-- bsscfg->type == BRCMS_TYPE_ADHOC))
-+ if (bsscfg->type == BRCMS_TYPE_STATION ||
-+ bsscfg->type == BRCMS_TYPE_ADHOC)
- brcms_err(wlc->hw->d11core,
- "wl%d: up: rfdisable -> "
- "bsscfg_disable()\n",
---- a/drivers/net/wireless/brcm80211/brcmsmac/main.h
-+++ b/drivers/net/wireless/brcm80211/brcmsmac/main.h
-@@ -588,7 +588,6 @@ enum brcms_bss_type {
- * wlc: wlc to which this bsscfg belongs to.
- * type: interface type
- * up: is this configuration up operational
-- * enable: is this configuration enabled
- * SSID_len: the length of SSID
- * SSID: SSID string
- *
-@@ -606,7 +605,6 @@ struct brcms_bss_cfg {
- struct brcms_c_info *wlc;
- enum brcms_bss_type type;
- bool up;
-- bool enable;
- u8 SSID_len;
- u8 SSID[IEEE80211_MAX_SSID_LEN];
- u8 BSSID[ETH_ALEN];
+++ /dev/null
---- a/drivers/net/wireless/brcm80211/brcmsmac/main.c
-+++ b/drivers/net/wireless/brcm80211/brcmsmac/main.c
-@@ -7377,8 +7377,8 @@ void brcms_c_update_beacon(struct brcms_
- {
- struct brcms_bss_cfg *bsscfg = wlc->bsscfg;
-
-- if (bsscfg->up && (bsscfg->type == BRCMS_TYPE_AP ||
-- bsscfg->type == BRCMS_TYPE_ADHOC))
-+ if (wlc->pub->up && (bsscfg->type == BRCMS_TYPE_AP ||
-+ bsscfg->type == BRCMS_TYPE_ADHOC))
- /* Clear the soft intmask */
- wlc->defmacintmask &= ~MI_BCNTPL;
- }
-@@ -7453,8 +7453,8 @@ void brcms_c_update_probe_resp(struct br
- struct brcms_bss_cfg *bsscfg = wlc->bsscfg;
-
- /* update AP or IBSS probe responses */
-- if (bsscfg->up && (bsscfg->type == BRCMS_TYPE_AP ||
-- bsscfg->type == BRCMS_TYPE_ADHOC))
-+ if (wlc->pub->up && (bsscfg->type == BRCMS_TYPE_AP ||
-+ bsscfg->type == BRCMS_TYPE_ADHOC))
- brcms_c_bss_update_probe_resp(wlc, bsscfg, suspend);
- }
-
-@@ -7807,7 +7807,7 @@ void brcms_c_init(struct brcms_c_info *w
- brcms_c_set_bssid(wlc->bsscfg);
-
- /* Update tsf_cfprep if associated and up */
-- if (wlc->pub->associated && wlc->bsscfg->up) {
-+ if (wlc->pub->associated && wlc->pub->up) {
- u32 bi;
-
- /* get beacon period and convert to uS */
---- a/drivers/net/wireless/brcm80211/brcmsmac/main.h
-+++ b/drivers/net/wireless/brcm80211/brcmsmac/main.h
-@@ -587,7 +587,6 @@ enum brcms_bss_type {
- *
- * wlc: wlc to which this bsscfg belongs to.
- * type: interface type
-- * up: is this configuration up operational
- * SSID_len: the length of SSID
- * SSID: SSID string
- *
-@@ -604,7 +603,6 @@ enum brcms_bss_type {
- struct brcms_bss_cfg {
- struct brcms_c_info *wlc;
- enum brcms_bss_type type;
-- bool up;
- u8 SSID_len;
- u8 SSID[IEEE80211_MAX_SSID_LEN];
- u8 BSSID[ETH_ALEN];
+++ /dev/null
---- a/drivers/net/wireless/brcm80211/brcmsmac/main.c
-+++ b/drivers/net/wireless/brcm80211/brcmsmac/main.c
-@@ -3766,7 +3766,7 @@ static int brcms_c_set_mac(struct brcms_
- struct brcms_c_info *wlc = bsscfg->wlc;
-
- /* enter the MAC addr into the RXE match registers */
-- brcms_c_set_addrmatch(wlc, RCM_MAC_OFFSET, bsscfg->cur_etheraddr);
-+ brcms_c_set_addrmatch(wlc, RCM_MAC_OFFSET, wlc->pub->cur_etheraddr);
-
- brcms_c_ampdu_macaddr_upd(wlc);
-
-@@ -7359,7 +7359,7 @@ brcms_c_bcn_prb_template(struct brcms_c_
- /* A1 filled in by MAC for prb resp, broadcast for bcn */
- if (type == IEEE80211_STYPE_BEACON)
- memcpy(&h->da, ðer_bcast, ETH_ALEN);
-- memcpy(&h->sa, &cfg->cur_etheraddr, ETH_ALEN);
-+ memcpy(&h->sa, &wlc->pub->cur_etheraddr, ETH_ALEN);
- memcpy(&h->bssid, &cfg->BSSID, ETH_ALEN);
-
- /* SEQ filled in by MAC */
---- a/drivers/net/wireless/brcm80211/brcmsmac/main.h
-+++ b/drivers/net/wireless/brcm80211/brcmsmac/main.h
-@@ -606,7 +606,6 @@ struct brcms_bss_cfg {
- u8 SSID_len;
- u8 SSID[IEEE80211_MAX_SSID_LEN];
- u8 BSSID[ETH_ALEN];
-- u8 cur_etheraddr[ETH_ALEN];
- struct brcms_bss_info *current_bss;
- };
-
+++ /dev/null
---- a/drivers/net/wireless/brcm80211/brcmsmac/main.c
-+++ b/drivers/net/wireless/brcm80211/brcmsmac/main.c
-@@ -4327,7 +4327,6 @@ static void brcms_c_info_init(struct brc
-
- /* WME QoS mode is Auto by default */
- wlc->pub->_ampdu = AMPDU_AGG_HOST;
-- wlc->pub->bcmerror = 0;
- }
-
- static uint brcms_c_attach_module(struct brcms_c_info *wlc)
---- a/drivers/net/wireless/brcm80211/brcmsmac/pub.h
-+++ b/drivers/net/wireless/brcm80211/brcmsmac/pub.h
-@@ -164,8 +164,6 @@ struct brcms_pub {
-
- u8 cur_etheraddr[ETH_ALEN]; /* our local ethernet address */
-
-- int bcmerror; /* last bcm error */
--
- u32 radio_disabled; /* bit vector for radio disabled reasons */
-
- u16 boardrev; /* version # of particular board */
+++ /dev/null
---- a/drivers/net/wireless/brcm80211/brcmsmac/main.c
-+++ b/drivers/net/wireless/brcm80211/brcmsmac/main.c
-@@ -5553,10 +5553,20 @@ static void brcms_c_time_unlock(struct b
-
- int brcms_c_set_beacon_period(struct brcms_c_info *wlc, u16 period)
- {
-+ u32 bcnint_us;
-+
- if (period == 0)
- return -EINVAL;
-
- wlc->default_bss->beacon_period = period;
-+
-+ bcnint_us = period << 10;
-+ brcms_c_time_lock(wlc);
-+ bcma_write32(wlc->hw->d11core, D11REGOFFS(tsf_cfprep),
-+ (bcnint_us << CFPREP_CBI_SHIFT));
-+ bcma_write32(wlc->hw->d11core, D11REGOFFS(tsf_cfpstart), bcnint_us);
-+ brcms_c_time_unlock(wlc);
-+
- return 0;
- }
-
+++ /dev/null
---- a/drivers/net/wireless/brcm80211/brcmsmac/mac80211_if.c
-+++ b/drivers/net/wireless/brcm80211/brcmsmac/mac80211_if.c
-@@ -1,5 +1,6 @@
- /*
- * Copyright (c) 2010 Broadcom Corporation
-+ * Copyright (c) 2013 Hauke Mehrtens <hauke@hauke-m.de>
- *
- * Permission to use, copy, modify, and/or distribute this software for any
- * purpose with or without fee is hereby granted, provided that the above
-@@ -522,9 +523,17 @@ brcms_ops_bss_info_changed(struct ieee80
- brcms_c_set_addrmatch(wl->wlc, RCM_BSSID_OFFSET, info->bssid);
- spin_unlock_bh(&wl->lock);
- }
-- if (changed & BSS_CHANGED_BEACON)
-+ if (changed & BSS_CHANGED_BEACON) {
- /* Beacon data changed, retrieve new beacon (beaconing modes) */
-- brcms_err(core, "%s: beacon changed\n", __func__);
-+ struct sk_buff *beacon;
-+ u16 tim_offset = 0;
-+
-+ spin_lock_bh(&wl->lock);
-+ beacon = ieee80211_beacon_get_tim(hw, vif, &tim_offset, NULL);
-+ brcms_c_set_new_beacon(wl->wlc, beacon, tim_offset,
-+ info->dtim_period);
-+ spin_unlock_bh(&wl->lock);
-+ }
-
- if (changed & BSS_CHANGED_BEACON_ENABLED) {
- /* Beaconing should be enabled/disabled (beaconing modes) */
---- a/drivers/net/wireless/brcm80211/brcmsmac/main.c
-+++ b/drivers/net/wireless/brcm80211/brcmsmac/main.c
-@@ -1,5 +1,6 @@
- /*
- * Copyright (c) 2010 Broadcom Corporation
-+ * Copyright (c) 2013 Hauke Mehrtens <hauke@hauke-m.de>
- *
- * Permission to use, copy, modify, and/or distribute this software for any
- * purpose with or without fee is hereby granted, provided that the above
-@@ -450,6 +451,8 @@ static void brcms_c_detach_mfree(struct
- kfree(wlc->corestate);
- kfree(wlc->hw->bandstate[0]);
- kfree(wlc->hw);
-+ if (wlc->beacon)
-+ dev_kfree_skb_any(wlc->beacon);
-
- /* free the wlc */
- kfree(wlc);
-@@ -4086,10 +4089,14 @@ void brcms_c_wme_setparams(struct brcms_
- *shm_entry++);
- }
-
-- if (suspend) {
-+ if (suspend)
- brcms_c_suspend_mac_and_wait(wlc);
-+
-+ brcms_c_update_beacon(wlc);
-+ brcms_c_update_probe_resp(wlc, false);
-+
-+ if (suspend)
- brcms_c_enable_mac(wlc);
-- }
- }
-
- static void brcms_c_edcf_setparams(struct brcms_c_info *wlc, bool suspend)
-@@ -7379,6 +7386,107 @@ int brcms_c_get_header_len(void)
- return TXOFF;
- }
-
-+static void brcms_c_beacon_write(struct brcms_c_info *wlc,
-+ struct sk_buff *beacon, u16 tim_offset,
-+ u16 dtim_period, bool bcn0, bool bcn1)
-+{
-+ size_t len;
-+ struct ieee80211_tx_info *tx_info;
-+ struct brcms_hardware *wlc_hw = wlc->hw;
-+ struct ieee80211_hw *ieee_hw = brcms_c_pub(wlc)->ieee_hw;
-+
-+ /* Get tx_info */
-+ tx_info = IEEE80211_SKB_CB(beacon);
-+
-+ len = min_t(size_t, beacon->len, BCN_TMPL_LEN);
-+ wlc->bcn_rspec = ieee80211_get_tx_rate(ieee_hw, tx_info)->hw_value;
-+
-+ brcms_c_compute_plcp(wlc, wlc->bcn_rspec,
-+ len + FCS_LEN - D11_PHY_HDR_LEN, beacon->data);
-+
-+ /* "Regular" and 16 MBSS but not for 4 MBSS */
-+ /* Update the phytxctl for the beacon based on the rspec */
-+ brcms_c_beacon_phytxctl_txant_upd(wlc, wlc->bcn_rspec);
-+
-+ if (bcn0) {
-+ /* write the probe response into the template region */
-+ brcms_b_write_template_ram(wlc_hw, T_BCN0_TPL_BASE,
-+ (len + 3) & ~3, beacon->data);
-+
-+ /* write beacon length to SCR */
-+ brcms_b_write_shm(wlc_hw, M_BCN0_FRM_BYTESZ, (u16) len);
-+ }
-+ if (bcn1) {
-+ /* write the probe response into the template region */
-+ brcms_b_write_template_ram(wlc_hw, T_BCN1_TPL_BASE,
-+ (len + 3) & ~3, beacon->data);
-+
-+ /* write beacon length to SCR */
-+ brcms_b_write_shm(wlc_hw, M_BCN1_FRM_BYTESZ, (u16) len);
-+ }
-+
-+ if (tim_offset != 0) {
-+ brcms_b_write_shm(wlc_hw, M_TIMBPOS_INBEACON,
-+ tim_offset + D11B_PHY_HDR_LEN);
-+ brcms_b_write_shm(wlc_hw, M_DOT11_DTIMPERIOD, dtim_period);
-+ } else {
-+ brcms_b_write_shm(wlc_hw, M_TIMBPOS_INBEACON,
-+ len + D11B_PHY_HDR_LEN);
-+ brcms_b_write_shm(wlc_hw, M_DOT11_DTIMPERIOD, 0);
-+ }
-+}
-+
-+static void brcms_c_update_beacon_hw(struct brcms_c_info *wlc,
-+ struct sk_buff *beacon, u16 tim_offset,
-+ u16 dtim_period)
-+{
-+ struct brcms_hardware *wlc_hw = wlc->hw;
-+ struct bcma_device *core = wlc_hw->d11core;
-+
-+ /* Hardware beaconing for this config */
-+ u32 both_valid = MCMD_BCN0VLD | MCMD_BCN1VLD;
-+
-+ /* Check if both templates are in use, if so sched. an interrupt
-+ * that will call back into this routine
-+ */
-+ if ((bcma_read32(core, D11REGOFFS(maccommand)) & both_valid) == both_valid)
-+ /* clear any previous status */
-+ bcma_write32(core, D11REGOFFS(macintstatus), MI_BCNTPL);
-+
-+ if (wlc->beacon_template_virgin) {
-+ wlc->beacon_template_virgin = false;
-+ brcms_c_beacon_write(wlc, beacon, tim_offset, dtim_period, true,
-+ true);
-+ /* mark beacon0 valid */
-+ bcma_set32(core, D11REGOFFS(maccommand), MCMD_BCN0VLD);
-+ return;
-+ }
-+
-+ /* Check that after scheduling the interrupt both of the
-+ * templates are still busy. if not clear the int. & remask
-+ */
-+ if ((bcma_read32(core, D11REGOFFS(maccommand)) & both_valid) == both_valid) {
-+ wlc->defmacintmask |= MI_BCNTPL;
-+ return;
-+ }
-+
-+ if (!(bcma_read32(core, D11REGOFFS(maccommand)) & MCMD_BCN0VLD)) {
-+ brcms_c_beacon_write(wlc, beacon, tim_offset, dtim_period, true,
-+ false);
-+ /* mark beacon0 valid */
-+ bcma_set32(core, D11REGOFFS(maccommand), MCMD_BCN0VLD);
-+ return;
-+ }
-+ if (!(bcma_read32(core, D11REGOFFS(maccommand)) & MCMD_BCN1VLD)) {
-+ brcms_c_beacon_write(wlc, beacon, tim_offset, dtim_period,
-+ false, true);
-+ /* mark beacon0 valid */
-+ bcma_set32(core, D11REGOFFS(maccommand), MCMD_BCN1VLD);
-+ return;
-+ }
-+ return;
-+}
-+
- /*
- * Update all beacons for the system.
- */
-@@ -7387,9 +7495,31 @@ void brcms_c_update_beacon(struct brcms_
- struct brcms_bss_cfg *bsscfg = wlc->bsscfg;
-
- if (wlc->pub->up && (bsscfg->type == BRCMS_TYPE_AP ||
-- bsscfg->type == BRCMS_TYPE_ADHOC))
-+ bsscfg->type == BRCMS_TYPE_ADHOC)) {
- /* Clear the soft intmask */
- wlc->defmacintmask &= ~MI_BCNTPL;
-+ if (!wlc->beacon)
-+ return;
-+ brcms_c_update_beacon_hw(wlc, wlc->beacon,
-+ wlc->beacon_tim_offset,
-+ wlc->beacon_dtim_period);
-+ }
-+}
-+
-+void brcms_c_set_new_beacon(struct brcms_c_info *wlc, struct sk_buff *beacon,
-+ u16 tim_offset, u16 dtim_period)
-+{
-+ if (!beacon)
-+ return;
-+ if (wlc->beacon)
-+ dev_kfree_skb_any(wlc->beacon);
-+ wlc->beacon = beacon;
-+
-+ /* add PLCP */
-+ skb_push(wlc->beacon, D11_PHY_HDR_LEN);
-+ wlc->beacon_tim_offset = tim_offset;
-+ wlc->beacon_dtim_period = dtim_period;
-+ brcms_c_update_beacon(wlc);
- }
-
- /* Write ssid into shared memory */
-@@ -7788,6 +7918,10 @@ bool brcms_c_dpc(struct brcms_c_info *wl
- brcms_rfkill_set_hw_state(wlc->wl);
- }
-
-+ /* BCN template is available */
-+ if (macintstatus & MI_BCNTPL)
-+ brcms_c_update_beacon(wlc);
-+
- /* it isn't done and needs to be resched if macintstatus is non-zero */
- return wlc->macintstatus != 0;
-
-@@ -7919,6 +8053,7 @@ brcms_c_attach(struct brcms_info *wl, st
- pub->unit = unit;
- pub->_piomode = piomode;
- wlc->bandinit_pending = false;
-+ wlc->beacon_template_virgin = true;
-
- /* populate struct brcms_c_info with default values */
- brcms_c_info_init(wlc, unit);
---- a/drivers/net/wireless/brcm80211/brcmsmac/main.h
-+++ b/drivers/net/wireless/brcm80211/brcmsmac/main.h
-@@ -492,6 +492,8 @@ struct brcms_c_info {
- bool radio_monitor;
- bool going_down;
-
-+ bool beacon_template_virgin;
-+
- struct brcms_timer *wdtimer;
- struct brcms_timer *radio_timer;
-
-@@ -561,6 +563,10 @@ struct brcms_c_info {
-
- struct wiphy *wiphy;
- struct scb pri_scb;
-+
-+ struct sk_buff *beacon;
-+ u16 beacon_tim_offset;
-+ u16 beacon_dtim_period;
- };
-
- /* antsel module specific state */
-@@ -630,7 +636,6 @@ extern u16 brcms_c_compute_rtscts_dur(st
- extern void brcms_c_inval_dma_pkts(struct brcms_hardware *hw,
- struct ieee80211_sta *sta,
- void (*dma_callback_fn));
--extern void brcms_c_update_beacon(struct brcms_c_info *wlc);
- extern void brcms_c_update_probe_resp(struct brcms_c_info *wlc, bool suspend);
- extern int brcms_c_set_nmode(struct brcms_c_info *wlc);
- extern void brcms_c_beacon_phytxctl_txant_upd(struct brcms_c_info *wlc,
---- a/drivers/net/wireless/brcm80211/brcmsmac/pub.h
-+++ b/drivers/net/wireless/brcm80211/brcmsmac/pub.h
-@@ -332,5 +332,9 @@ extern bool brcms_c_check_radio_disabled
- extern void brcms_c_mute(struct brcms_c_info *wlc, bool on);
- extern bool brcms_c_tx_flush_completed(struct brcms_c_info *wlc);
- extern void brcms_c_start_station(struct brcms_c_info *wlc, u8 *addr);
-+extern void brcms_c_update_beacon(struct brcms_c_info *wlc);
-+extern void brcms_c_set_new_beacon(struct brcms_c_info *wlc,
-+ struct sk_buff *beacon, u16 tim_offset,
-+ u16 dtim_period);
-
- #endif /* _BRCM_PUB_H_ */
+++ /dev/null
---- a/drivers/net/wireless/brcm80211/brcmsmac/mac80211_if.c
-+++ b/drivers/net/wireless/brcm80211/brcmsmac/mac80211_if.c
-@@ -523,6 +523,12 @@ brcms_ops_bss_info_changed(struct ieee80
- brcms_c_set_addrmatch(wl->wlc, RCM_BSSID_OFFSET, info->bssid);
- spin_unlock_bh(&wl->lock);
- }
-+ if (changed & BSS_CHANGED_SSID) {
-+ /* BSSID changed, for whatever reason (IBSS and managed mode) */
-+ spin_lock_bh(&wl->lock);
-+ brcms_c_set_ssid(wl->wlc, info->ssid, info->ssid_len);
-+ spin_unlock_bh(&wl->lock);
-+ }
- if (changed & BSS_CHANGED_BEACON) {
- /* Beacon data changed, retrieve new beacon (beaconing modes) */
- struct sk_buff *beacon;
---- a/drivers/net/wireless/brcm80211/brcmsmac/main.c
-+++ b/drivers/net/wireless/brcm80211/brcmsmac/main.c
-@@ -3785,6 +3785,15 @@ static void brcms_c_set_bssid(struct brc
- brcms_c_set_addrmatch(bsscfg->wlc, RCM_BSSID_OFFSET, bsscfg->BSSID);
- }
-
-+void brcms_c_set_ssid(struct brcms_c_info *wlc, u8 *ssid, size_t ssid_len)
-+{
-+ u8 len = min_t(u8, sizeof(wlc->bsscfg->SSID), ssid_len);
-+ memset(wlc->bsscfg->SSID, 0, sizeof(wlc->bsscfg->SSID));
-+
-+ memcpy(wlc->bsscfg->SSID, ssid, len);
-+ wlc->bsscfg->SSID_len = len;
-+}
-+
- static void brcms_b_set_shortslot(struct brcms_hardware *wlc_hw, bool shortslot)
- {
- wlc_hw->shortslot = shortslot;
---- a/drivers/net/wireless/brcm80211/brcmsmac/pub.h
-+++ b/drivers/net/wireless/brcm80211/brcmsmac/pub.h
-@@ -336,5 +336,7 @@ extern void brcms_c_update_beacon(struct
- extern void brcms_c_set_new_beacon(struct brcms_c_info *wlc,
- struct sk_buff *beacon, u16 tim_offset,
- u16 dtim_period);
-+extern void brcms_c_set_ssid(struct brcms_c_info *wlc, u8 *ssid,
-+ size_t ssid_len);
-
- #endif /* _BRCM_PUB_H_ */
+++ /dev/null
---- a/drivers/net/wireless/brcm80211/brcmsmac/mac80211_if.c
-+++ b/drivers/net/wireless/brcm80211/brcmsmac/mac80211_if.c
-@@ -541,6 +541,15 @@ brcms_ops_bss_info_changed(struct ieee80
- spin_unlock_bh(&wl->lock);
- }
-
-+ if (changed & BSS_CHANGED_AP_PROBE_RESP) {
-+ struct sk_buff *probe_resp;
-+
-+ spin_lock_bh(&wl->lock);
-+ probe_resp = ieee80211_proberesp_get(hw, vif);
-+ brcms_c_set_new_probe_resp(wl->wlc, probe_resp);
-+ spin_unlock_bh(&wl->lock);
-+ }
-+
- if (changed & BSS_CHANGED_BEACON_ENABLED) {
- /* Beaconing should be enabled/disabled (beaconing modes) */
- brcms_err(core, "%s: Beacon enabled: %s\n", __func__,
-@@ -1039,6 +1048,8 @@ static int ieee_hw_init(struct ieee80211
- hw->channel_change_time = 7 * 1000;
- hw->wiphy->interface_modes = BIT(NL80211_IFTYPE_STATION);
-
-+ hw->wiphy->flags |= WIPHY_FLAG_AP_PROBE_RESP_OFFLOAD;
-+
- hw->rate_control_algorithm = "minstrel_ht";
-
- hw->sta_data_size = 0;
---- a/drivers/net/wireless/brcm80211/brcmsmac/main.c
-+++ b/drivers/net/wireless/brcm80211/brcmsmac/main.c
-@@ -453,6 +453,8 @@ static void brcms_c_detach_mfree(struct
- kfree(wlc->hw);
- if (wlc->beacon)
- dev_kfree_skb_any(wlc->beacon);
-+ if (wlc->probe_resp)
-+ dev_kfree_skb_any(wlc->probe_resp);
-
- /* free the wlc */
- kfree(wlc);
-@@ -7327,69 +7329,6 @@ brcms_c_mod_prb_rsp_rate_table(struct br
- }
- }
-
--/* Max buffering needed for beacon template/prb resp template is 142 bytes.
-- *
-- * PLCP header is 6 bytes.
-- * 802.11 A3 header is 24 bytes.
-- * Max beacon frame body template length is 112 bytes.
-- * Max probe resp frame body template length is 110 bytes.
-- *
-- * *len on input contains the max length of the packet available.
-- *
-- * The *len value is set to the number of bytes in buf used, and starts
-- * with the PLCP and included up to, but not including, the 4 byte FCS.
-- */
--static void
--brcms_c_bcn_prb_template(struct brcms_c_info *wlc, u16 type,
-- u32 bcn_rspec,
-- struct brcms_bss_cfg *cfg, u16 *buf, int *len)
--{
-- static const u8 ether_bcast[ETH_ALEN] = {255, 255, 255, 255, 255, 255};
-- struct cck_phy_hdr *plcp;
-- struct ieee80211_mgmt *h;
-- int hdr_len, body_len;
--
-- hdr_len = D11_PHY_HDR_LEN + DOT11_MAC_HDR_LEN;
--
-- /* calc buffer size provided for frame body */
-- body_len = *len - hdr_len;
-- /* return actual size */
-- *len = hdr_len + body_len;
--
-- /* format PHY and MAC headers */
-- memset(buf, 0, hdr_len);
--
-- plcp = (struct cck_phy_hdr *) buf;
--
-- /*
-- * PLCP for Probe Response frames are filled in from
-- * core's rate table
-- */
-- if (type == IEEE80211_STYPE_BEACON)
-- /* fill in PLCP */
-- brcms_c_compute_plcp(wlc, bcn_rspec,
-- (DOT11_MAC_HDR_LEN + body_len + FCS_LEN),
-- (u8 *) plcp);
--
-- /* "Regular" and 16 MBSS but not for 4 MBSS */
-- /* Update the phytxctl for the beacon based on the rspec */
-- brcms_c_beacon_phytxctl_txant_upd(wlc, bcn_rspec);
--
-- h = (struct ieee80211_mgmt *)&plcp[1];
--
-- /* fill in 802.11 header */
-- h->frame_control = cpu_to_le16(IEEE80211_FTYPE_MGMT | type);
--
-- /* DUR is 0 for multicast bcn, or filled in by MAC for prb resp */
-- /* A1 filled in by MAC for prb resp, broadcast for bcn */
-- if (type == IEEE80211_STYPE_BEACON)
-- memcpy(&h->da, ðer_bcast, ETH_ALEN);
-- memcpy(&h->sa, &wlc->pub->cur_etheraddr, ETH_ALEN);
-- memcpy(&h->bssid, &cfg->BSSID, ETH_ALEN);
--
-- /* SEQ filled in by MAC */
--}
--
- int brcms_c_get_header_len(void)
- {
- return TXOFF;
-@@ -7531,6 +7470,20 @@ void brcms_c_set_new_beacon(struct brcms
- brcms_c_update_beacon(wlc);
- }
-
-+void brcms_c_set_new_probe_resp(struct brcms_c_info *wlc,
-+ struct sk_buff *probe_resp)
-+{
-+ if (!probe_resp)
-+ return;
-+ if (wlc->probe_resp)
-+ dev_kfree_skb_any(wlc->probe_resp);
-+ wlc->probe_resp = probe_resp;
-+
-+ /* add PLCP */
-+ skb_push(wlc->probe_resp, D11_PHY_HDR_LEN);
-+ brcms_c_update_probe_resp(wlc, false);
-+}
-+
- /* Write ssid into shared memory */
- static void
- brcms_c_shm_ssid_upd(struct brcms_c_info *wlc, struct brcms_bss_cfg *cfg)
-@@ -7550,30 +7503,19 @@ brcms_c_shm_ssid_upd(struct brcms_c_info
- static void
- brcms_c_bss_update_probe_resp(struct brcms_c_info *wlc,
- struct brcms_bss_cfg *cfg,
-+ struct sk_buff *probe_resp,
- bool suspend)
- {
-- u16 *prb_resp;
-- int len = BCN_TMPL_LEN;
-+ int len;
-
-- prb_resp = kmalloc(BCN_TMPL_LEN, GFP_ATOMIC);
-- if (!prb_resp)
-- return;
--
-- /*
-- * write the probe response to hardware, or save in
-- * the config structure
-- */
--
-- /* create the probe response template */
-- brcms_c_bcn_prb_template(wlc, IEEE80211_STYPE_PROBE_RESP, 0,
-- cfg, prb_resp, &len);
-+ len = min_t(size_t, probe_resp->len, BCN_TMPL_LEN);
-
- if (suspend)
- brcms_c_suspend_mac_and_wait(wlc);
-
- /* write the probe response into the template region */
- brcms_b_write_template_ram(wlc->hw, T_PRS_TPL_BASE,
-- (len + 3) & ~3, prb_resp);
-+ (len + 3) & ~3, probe_resp->data);
-
- /* write the length of the probe response frame (+PLCP/-FCS) */
- brcms_b_write_shm(wlc->hw, M_PRB_RESP_FRM_LEN, (u16) len);
-@@ -7587,13 +7529,11 @@ brcms_c_bss_update_probe_resp(struct brc
- * PLCP header for the call to brcms_c_mod_prb_rsp_rate_table()
- * by subtracting the PLCP len and adding the FCS.
- */
-- len += (-D11_PHY_HDR_LEN + FCS_LEN);
-- brcms_c_mod_prb_rsp_rate_table(wlc, (u16) len);
-+ brcms_c_mod_prb_rsp_rate_table(wlc,
-+ (u16)len + FCS_LEN - D11_PHY_HDR_LEN);
-
- if (suspend)
- brcms_c_enable_mac(wlc);
--
-- kfree(prb_resp);
- }
-
- void brcms_c_update_probe_resp(struct brcms_c_info *wlc, bool suspend)
-@@ -7602,8 +7542,12 @@ void brcms_c_update_probe_resp(struct br
-
- /* update AP or IBSS probe responses */
- if (wlc->pub->up && (bsscfg->type == BRCMS_TYPE_AP ||
-- bsscfg->type == BRCMS_TYPE_ADHOC))
-- brcms_c_bss_update_probe_resp(wlc, bsscfg, suspend);
-+ bsscfg->type == BRCMS_TYPE_ADHOC)) {
-+ if (!wlc->probe_resp)
-+ return;
-+ brcms_c_bss_update_probe_resp(wlc, bsscfg, wlc->probe_resp,
-+ suspend);
-+ }
- }
-
- int brcms_b_xmtfifo_sz_get(struct brcms_hardware *wlc_hw, uint fifo,
---- a/drivers/net/wireless/brcm80211/brcmsmac/main.h
-+++ b/drivers/net/wireless/brcm80211/brcmsmac/main.h
-@@ -567,6 +567,7 @@ struct brcms_c_info {
- struct sk_buff *beacon;
- u16 beacon_tim_offset;
- u16 beacon_dtim_period;
-+ struct sk_buff *probe_resp;
- };
-
- /* antsel module specific state */
---- a/drivers/net/wireless/brcm80211/brcmsmac/pub.h
-+++ b/drivers/net/wireless/brcm80211/brcmsmac/pub.h
-@@ -336,6 +336,8 @@ extern void brcms_c_update_beacon(struct
- extern void brcms_c_set_new_beacon(struct brcms_c_info *wlc,
- struct sk_buff *beacon, u16 tim_offset,
- u16 dtim_period);
-+extern void brcms_c_set_new_probe_resp(struct brcms_c_info *wlc,
-+ struct sk_buff *probe_resp);
- extern void brcms_c_set_ssid(struct brcms_c_info *wlc, u8 *ssid,
- size_t ssid_len);
-
+++ /dev/null
---- a/drivers/net/wireless/brcm80211/brcmsmac/mac80211_if.c
-+++ b/drivers/net/wireless/brcm80211/brcmsmac/mac80211_if.c
-@@ -554,6 +554,12 @@ brcms_ops_bss_info_changed(struct ieee80
- /* Beaconing should be enabled/disabled (beaconing modes) */
- brcms_err(core, "%s: Beacon enabled: %s\n", __func__,
- info->enable_beacon ? "true" : "false");
-+ if (info->enable_beacon &&
-+ hw->wiphy->flags & WIPHY_FLAG_AP_PROBE_RESP_OFFLOAD) {
-+ brcms_c_enable_probe_resp(wl->wlc, true);
-+ } else {
-+ brcms_c_enable_probe_resp(wl->wlc, false);
-+ }
- }
-
- if (changed & BSS_CHANGED_CQM) {
-@@ -1048,7 +1054,12 @@ static int ieee_hw_init(struct ieee80211
- hw->channel_change_time = 7 * 1000;
- hw->wiphy->interface_modes = BIT(NL80211_IFTYPE_STATION);
-
-- hw->wiphy->flags |= WIPHY_FLAG_AP_PROBE_RESP_OFFLOAD;
-+ /*
-+ * deactivate sending probe responses by ucude, because this will
-+ * cause problems when WPS is used.
-+ *
-+ * hw->wiphy->flags |= WIPHY_FLAG_AP_PROBE_RESP_OFFLOAD;
-+ */
-
- hw->rate_control_algorithm = "minstrel_ht";
-
---- a/drivers/net/wireless/brcm80211/brcmsmac/main.c
-+++ b/drivers/net/wireless/brcm80211/brcmsmac/main.c
-@@ -7484,6 +7484,17 @@ void brcms_c_set_new_probe_resp(struct b
- brcms_c_update_probe_resp(wlc, false);
- }
-
-+void brcms_c_enable_probe_resp(struct brcms_c_info *wlc, bool enable)
-+{
-+ /*
-+ * prevent ucode from sending probe responses by setting the timeout
-+ * to 1, it can not send it in that time frame.
-+ */
-+ wlc->prb_resp_timeout = enable ? BRCMS_PRB_RESP_TIMEOUT : 1;
-+ brcms_b_write_shm(wlc->hw, M_PRS_MAXTIME, wlc->prb_resp_timeout);
-+ /* TODO: if (enable) => also deactivate receiving of probe request */
-+}
-+
- /* Write ssid into shared memory */
- static void
- brcms_c_shm_ssid_upd(struct brcms_c_info *wlc, struct brcms_bss_cfg *cfg)
---- a/drivers/net/wireless/brcm80211/brcmsmac/pub.h
-+++ b/drivers/net/wireless/brcm80211/brcmsmac/pub.h
-@@ -338,6 +338,7 @@ extern void brcms_c_set_new_beacon(struc
- u16 dtim_period);
- extern void brcms_c_set_new_probe_resp(struct brcms_c_info *wlc,
- struct sk_buff *probe_resp);
-+extern void brcms_c_enable_probe_resp(struct brcms_c_info *wlc, bool enable);
- extern void brcms_c_set_ssid(struct brcms_c_info *wlc, u8 *ssid,
- size_t ssid_len);
-
+++ /dev/null
---- a/drivers/net/wireless/brcm80211/brcmsmac/mac80211_if.c
-+++ b/drivers/net/wireless/brcm80211/brcmsmac/mac80211_if.c
-@@ -359,10 +359,11 @@ brcms_ops_add_interface(struct ieee80211
- {
- struct brcms_info *wl = hw->priv;
-
-- /* Just STA for now */
-- if (vif->type != NL80211_IFTYPE_STATION) {
-+ /* Just STA and AP for now */
-+ if (vif->type != NL80211_IFTYPE_STATION &&
-+ vif->type != NL80211_IFTYPE_AP) {
- brcms_err(wl->wlc->hw->d11core,
-- "%s: Attempt to add type %d, only STA for now\n",
-+ "%s: Attempt to add type %d, only STA and AP for now\n",
- __func__, vif->type);
- return -EOPNOTSUPP;
- }
-@@ -372,6 +373,9 @@ brcms_ops_add_interface(struct ieee80211
- brcms_c_mute(wl->wlc, false);
- if (vif->type == NL80211_IFTYPE_STATION)
- brcms_c_start_station(wl->wlc, vif->addr);
-+ else if (vif->type == NL80211_IFTYPE_AP)
-+ brcms_c_start_ap(wl->wlc, vif->addr, vif->bss_conf.bssid,
-+ vif->bss_conf.ssid, vif->bss_conf.ssid_len);
- spin_unlock_bh(&wl->lock);
-
- return 0;
-@@ -1052,7 +1056,8 @@ static int ieee_hw_init(struct ieee80211
-
- /* channel change time is dependent on chip and band */
- hw->channel_change_time = 7 * 1000;
-- hw->wiphy->interface_modes = BIT(NL80211_IFTYPE_STATION);
-+ hw->wiphy->interface_modes = BIT(NL80211_IFTYPE_STATION) |
-+ BIT(NL80211_IFTYPE_AP);
-
- /*
- * deactivate sending probe responses by ucude, because this will
---- a/drivers/net/wireless/brcm80211/brcmsmac/main.c
-+++ b/drivers/net/wireless/brcm80211/brcmsmac/main.c
-@@ -2176,6 +2176,18 @@ void brcms_c_start_station(struct brcms_
- wlc->bsscfg->type = BRCMS_TYPE_STATION;
- }
-
-+void brcms_c_start_ap(struct brcms_c_info *wlc, u8 *addr, const u8 *bssid,
-+ u8 *ssid, size_t ssid_len)
-+{
-+ brcms_c_set_ssid(wlc, ssid, ssid_len);
-+
-+ memcpy(wlc->pub->cur_etheraddr, addr, sizeof(wlc->pub->cur_etheraddr));
-+ memcpy(wlc->bsscfg->BSSID, bssid, sizeof(wlc->bsscfg->BSSID));
-+ wlc->bsscfg->type = BRCMS_TYPE_AP;
-+
-+ brcms_b_mctrl(wlc->hw, MCTL_AP | MCTL_INFRA, MCTL_AP | MCTL_INFRA);
-+}
-+
- /* Initialize GPIOs that are controlled by D11 core */
- static void brcms_c_gpio_init(struct brcms_c_info *wlc)
- {
-@@ -3064,6 +3076,9 @@ static bool brcms_c_ps_allowed(struct br
- if (wlc->filter_flags & FIF_PROMISC_IN_BSS)
- return false;
-
-+ if (wlc->bsscfg->type == BRCMS_TYPE_AP)
-+ return false;
-+
- return true;
- }
-
---- a/drivers/net/wireless/brcm80211/brcmsmac/pub.h
-+++ b/drivers/net/wireless/brcm80211/brcmsmac/pub.h
-@@ -332,6 +332,8 @@ extern bool brcms_c_check_radio_disabled
- extern void brcms_c_mute(struct brcms_c_info *wlc, bool on);
- extern bool brcms_c_tx_flush_completed(struct brcms_c_info *wlc);
- extern void brcms_c_start_station(struct brcms_c_info *wlc, u8 *addr);
-+extern void brcms_c_start_ap(struct brcms_c_info *wlc, u8 *addr,
-+ const u8 *bssid, u8 *ssid, size_t ssid_len);
- extern void brcms_c_update_beacon(struct brcms_c_info *wlc);
- extern void brcms_c_set_new_beacon(struct brcms_c_info *wlc,
- struct sk_buff *beacon, u16 tim_offset,
+++ /dev/null
---- a/drivers/net/wireless/brcm80211/brcmsmac/mac80211_if.c
-+++ b/drivers/net/wireless/brcm80211/brcmsmac/mac80211_if.c
-@@ -359,11 +359,12 @@ brcms_ops_add_interface(struct ieee80211
- {
- struct brcms_info *wl = hw->priv;
-
-- /* Just STA and AP for now */
-+ /* Just STA, AP and ADHOC for now */
- if (vif->type != NL80211_IFTYPE_STATION &&
-- vif->type != NL80211_IFTYPE_AP) {
-+ vif->type != NL80211_IFTYPE_AP &&
-+ vif->type != NL80211_IFTYPE_ADHOC) {
- brcms_err(wl->wlc->hw->d11core,
-- "%s: Attempt to add type %d, only STA and AP for now\n",
-+ "%s: Attempt to add type %d, only STA, AP and AdHoc for now\n",
- __func__, vif->type);
- return -EOPNOTSUPP;
- }
-@@ -376,6 +377,8 @@ brcms_ops_add_interface(struct ieee80211
- else if (vif->type == NL80211_IFTYPE_AP)
- brcms_c_start_ap(wl->wlc, vif->addr, vif->bss_conf.bssid,
- vif->bss_conf.ssid, vif->bss_conf.ssid_len);
-+ else if (vif->type == NL80211_IFTYPE_ADHOC)
-+ brcms_c_start_adhoc(wl->wlc, vif->addr);
- spin_unlock_bh(&wl->lock);
-
- return 0;
-@@ -1057,7 +1060,8 @@ static int ieee_hw_init(struct ieee80211
- /* channel change time is dependent on chip and band */
- hw->channel_change_time = 7 * 1000;
- hw->wiphy->interface_modes = BIT(NL80211_IFTYPE_STATION) |
-- BIT(NL80211_IFTYPE_AP);
-+ BIT(NL80211_IFTYPE_AP) |
-+ BIT(NL80211_IFTYPE_ADHOC);
-
- /*
- * deactivate sending probe responses by ucude, because this will
---- a/drivers/net/wireless/brcm80211/brcmsmac/main.c
-+++ b/drivers/net/wireless/brcm80211/brcmsmac/main.c
-@@ -2188,6 +2188,14 @@ void brcms_c_start_ap(struct brcms_c_inf
- brcms_b_mctrl(wlc->hw, MCTL_AP | MCTL_INFRA, MCTL_AP | MCTL_INFRA);
- }
-
-+void brcms_c_start_adhoc(struct brcms_c_info *wlc, u8 *addr)
-+{
-+ memcpy(wlc->pub->cur_etheraddr, addr, sizeof(wlc->pub->cur_etheraddr));
-+ wlc->bsscfg->type = BRCMS_TYPE_ADHOC;
-+
-+ brcms_b_mctrl(wlc->hw, MCTL_AP | MCTL_INFRA, 0);
-+}
-+
- /* Initialize GPIOs that are controlled by D11 core */
- static void brcms_c_gpio_init(struct brcms_c_info *wlc)
- {
-@@ -3079,6 +3087,9 @@ static bool brcms_c_ps_allowed(struct br
- if (wlc->bsscfg->type == BRCMS_TYPE_AP)
- return false;
-
-+ if (wlc->bsscfg->type == BRCMS_TYPE_ADHOC)
-+ return false;
-+
- return true;
- }
-
---- a/drivers/net/wireless/brcm80211/brcmsmac/pub.h
-+++ b/drivers/net/wireless/brcm80211/brcmsmac/pub.h
-@@ -334,6 +334,7 @@ extern bool brcms_c_tx_flush_completed(s
- extern void brcms_c_start_station(struct brcms_c_info *wlc, u8 *addr);
- extern void brcms_c_start_ap(struct brcms_c_info *wlc, u8 *addr,
- const u8 *bssid, u8 *ssid, size_t ssid_len);
-+extern void brcms_c_start_adhoc(struct brcms_c_info *wlc, u8 *addr);
- extern void brcms_c_update_beacon(struct brcms_c_info *wlc);
- extern void brcms_c_set_new_beacon(struct brcms_c_info *wlc,
- struct sk_buff *beacon, u16 tim_offset,
+++ /dev/null
---- a/drivers/net/wireless/brcm80211/brcmsmac/channel.c
-+++ b/drivers/net/wireless/brcm80211/brcmsmac/channel.c
-@@ -59,23 +59,16 @@
-
- #define BRCM_2GHZ_2412_2462 REG_RULE(2412-10, 2462+10, 40, 0, 19, 0)
- #define BRCM_2GHZ_2467_2472 REG_RULE(2467-10, 2472+10, 20, 0, 19, \
-- NL80211_RRF_PASSIVE_SCAN | \
-- NL80211_RRF_NO_IBSS)
-+ 0)
-
- #define BRCM_5GHZ_5180_5240 REG_RULE(5180-10, 5240+10, 40, 0, 21, \
-- NL80211_RRF_PASSIVE_SCAN | \
-- NL80211_RRF_NO_IBSS)
-+ 0)
- #define BRCM_5GHZ_5260_5320 REG_RULE(5260-10, 5320+10, 40, 0, 21, \
-- NL80211_RRF_PASSIVE_SCAN | \
-- NL80211_RRF_DFS | \
-- NL80211_RRF_NO_IBSS)
-+ 0)
- #define BRCM_5GHZ_5500_5700 REG_RULE(5500-10, 5700+10, 40, 0, 21, \
-- NL80211_RRF_PASSIVE_SCAN | \
-- NL80211_RRF_DFS | \
-- NL80211_RRF_NO_IBSS)
-+ 0)
- #define BRCM_5GHZ_5745_5825 REG_RULE(5745-10, 5825+10, 40, 0, 21, \
-- NL80211_RRF_PASSIVE_SCAN | \
-- NL80211_RRF_NO_IBSS)
-+ 0)
-
- static const struct ieee80211_regdomain brcms_regdom_x2 = {
- .n_reg_rules = 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;