mirror of
https://github.com/Telecominfraproject/wlan-ap-legacy-targets.git
synced 2025-10-29 09:32:41 +00:00
ipq40xx: import legacy target from 2.11
Signed-off-by: John Crispin <john@phrozen.org>
This commit is contained in:
544
mac80211/Makefile
Normal file
544
mac80211/Makefile
Normal file
@@ -0,0 +1,544 @@
|
||||
#
|
||||
# Copyright (C) 2007-2015 OpenWrt.org
|
||||
#
|
||||
# This is free software, licensed under the GNU General Public License v2.
|
||||
# See /LICENSE for more information.
|
||||
#
|
||||
|
||||
include $(TOPDIR)/rules.mk
|
||||
include $(INCLUDE_DIR)/kernel.mk
|
||||
|
||||
PKG_NAME:=mac80211
|
||||
|
||||
PKG_VERSION:=5.8-1
|
||||
PKG_RELEASE:=1
|
||||
PKG_SOURCE_URL:=@KERNEL/linux/kernel/projects/backports/stable/v5.8/
|
||||
PKG_HASH:=19b4174d89bf11ee221458e11f1e8dace26558498774b823051156f522d2036b
|
||||
|
||||
PKG_SOURCE:=backports-$(PKG_VERSION).tar.xz
|
||||
PKG_BUILD_DIR:=$(KERNEL_BUILD_DIR)/backports-$(PKG_VERSION)
|
||||
PKG_BUILD_PARALLEL:=1
|
||||
|
||||
PKG_MAINTAINER:=Felix Fietkau <nbd@nbd.name>
|
||||
|
||||
PKG_DRIVERS = \
|
||||
adm8211 \
|
||||
airo \
|
||||
hermes hermes-pci hermes-pcmcia hermes-plx\
|
||||
lib80211 \
|
||||
mac80211-hwsim \
|
||||
mt7601u \
|
||||
p54-common p54-pci p54-usb \
|
||||
rsi91x rsi91x-usb rsi91x-sdio\
|
||||
wlcore wl12xx wl18xx \
|
||||
zd1211rw
|
||||
|
||||
PKG_CONFIG_DEPENDS:= \
|
||||
CONFIG_PACKAGE_kmod-mac80211 \
|
||||
CONFIG_PACKAGE_CFG80211_TESTMODE \
|
||||
CONFIG_PACKAGE_MAC80211_DEBUGFS \
|
||||
CONFIG_PACKAGE_MAC80211_MESH \
|
||||
CONFIG_PACKAGE_MAC80211_TRACING \
|
||||
CONFIG_PACKAGE_IWLWIFI_DEBUG \
|
||||
CONFIG_PACKAGE_IWLWIFI_DEBUGFS \
|
||||
CONFIG_PACKAGE_RTLWIFI_DEBUG \
|
||||
|
||||
include $(INCLUDE_DIR)/package.mk
|
||||
|
||||
WMENU:=Wireless Drivers
|
||||
|
||||
define KernelPackage/mac80211/Default
|
||||
SUBMENU:=$(WMENU)
|
||||
URL:=https://wireless.wiki.kernel.org/
|
||||
MAINTAINER:=Felix Fietkau <nbd@nbd.name>
|
||||
endef
|
||||
|
||||
config_package=$(if $(CONFIG_PACKAGE_kmod-$(1)),m)
|
||||
|
||||
config-y:= \
|
||||
WLAN \
|
||||
CFG80211_WEXT \
|
||||
CFG80211_CERTIFICATION_ONUS \
|
||||
MAC80211_RC_MINSTREL \
|
||||
MAC80211_RC_MINSTREL_HT \
|
||||
MAC80211_RC_MINSTREL_VHT \
|
||||
MAC80211_RC_DEFAULT_MINSTREL \
|
||||
WLAN_VENDOR_ADMTEK \
|
||||
WLAN_VENDOR_ATH \
|
||||
WLAN_VENDOR_ATMEL \
|
||||
WLAN_VENDOR_BROADCOM \
|
||||
WLAN_VENDOR_CISCO \
|
||||
WLAN_VENDOR_INTEL \
|
||||
WLAN_VENDOR_INTERSIL \
|
||||
WLAN_VENDOR_MARVELL \
|
||||
WLAN_VENDOR_MEDIATEK \
|
||||
WLAN_VENDOR_RALINK \
|
||||
WLAN_VENDOR_REALTEK \
|
||||
WLAN_VENDOR_RSI \
|
||||
WLAN_VENDOR_ST \
|
||||
WLAN_VENDOR_TI \
|
||||
WLAN_VENDOR_ZYDAS \
|
||||
|
||||
config-$(call config_package,cfg80211) += CFG80211
|
||||
config-$(CONFIG_PACKAGE_CFG80211_TESTMODE) += NL80211_TESTMODE
|
||||
|
||||
config-$(call config_package,mac80211) += MAC80211
|
||||
config-$(CONFIG_PACKAGE_MAC80211_MESH) += MAC80211_MESH
|
||||
|
||||
include ath.mk
|
||||
include broadcom.mk
|
||||
include intel.mk
|
||||
include marvell.mk
|
||||
include ralink.mk
|
||||
include realtek.mk
|
||||
|
||||
PKG_CONFIG_DEPENDS += \
|
||||
$(patsubst %,CONFIG_PACKAGE_kmod-%,$(PKG_DRIVERS))
|
||||
|
||||
define KernelPackage/cfg80211
|
||||
$(call KernelPackage/mac80211/Default)
|
||||
TITLE:=cfg80211 - wireless configuration API
|
||||
DEPENDS+= +iw +wireless-regdb
|
||||
ABI_VERSION:=$(PKG_VERSION)-$(PKG_RELEASE)
|
||||
FILES:= \
|
||||
$(PKG_BUILD_DIR)/compat/compat.ko \
|
||||
$(PKG_BUILD_DIR)/net/wireless/cfg80211.ko
|
||||
endef
|
||||
|
||||
define KernelPackage/cfg80211/description
|
||||
cfg80211 is the Linux wireless LAN (802.11) configuration API.
|
||||
endef
|
||||
|
||||
define KernelPackage/cfg80211/config
|
||||
if PACKAGE_kmod-cfg80211
|
||||
|
||||
config PACKAGE_CFG80211_TESTMODE
|
||||
bool "Enable testmode command support"
|
||||
default n
|
||||
help
|
||||
This is typically used for tests and calibration during
|
||||
manufacturing, or vendor specific debugging features
|
||||
|
||||
endif
|
||||
endef
|
||||
|
||||
|
||||
define KernelPackage/mac80211
|
||||
$(call KernelPackage/mac80211/Default)
|
||||
TITLE:=Linux 802.11 Wireless Networking Stack
|
||||
# +kmod-crypto-cmac is a runtime only dependency of net/mac80211/aes_cmac.c
|
||||
DEPENDS+= +kmod-cfg80211 +hostapd-common +kmod-crypto-hash
|
||||
KCONFIG:=\
|
||||
CONFIG_AVERAGE=y
|
||||
FILES:= $(PKG_BUILD_DIR)/net/mac80211/mac80211.ko
|
||||
ABI_VERSION:=$(PKG_VERSION)-$(PKG_RELEASE)
|
||||
MENU:=1
|
||||
endef
|
||||
|
||||
define KernelPackage/mac80211/config
|
||||
if PACKAGE_kmod-mac80211
|
||||
|
||||
config PACKAGE_MAC80211_DEBUGFS
|
||||
bool "Export mac80211 internals in DebugFS"
|
||||
select KERNEL_DEBUG_FS
|
||||
default y
|
||||
help
|
||||
Select this to see extensive information about
|
||||
the internal state of mac80211 in debugfs.
|
||||
|
||||
config PACKAGE_MAC80211_TRACING
|
||||
bool "Enable tracing (mac80211 and supported drivers)"
|
||||
select KERNEL_FTRACE
|
||||
select KERNEL_ENABLE_DEFAULT_TRACERS
|
||||
default n
|
||||
help
|
||||
Select this to enable tracing of mac80211 and
|
||||
related wifi drivers (using trace-cmd).
|
||||
|
||||
config PACKAGE_MAC80211_MESH
|
||||
bool "Enable 802.11s mesh support"
|
||||
default y
|
||||
|
||||
endif
|
||||
endef
|
||||
|
||||
define KernelPackage/mac80211/description
|
||||
Generic IEEE 802.11 Networking Stack (mac80211)
|
||||
endef
|
||||
|
||||
define KernelPackage/adm8211
|
||||
$(call KernelPackage/mac80211/Default)
|
||||
TITLE:=ADMTek 8211 support
|
||||
DEPENDS+=@PCI_SUPPORT +kmod-mac80211 +kmod-eeprom-93cx6
|
||||
FILES:=$(PKG_BUILD_DIR)/drivers/net/wireless/admtek/adm8211.ko
|
||||
AUTOLOAD:=$(call AutoProbe,adm8211)
|
||||
endef
|
||||
|
||||
define KernelPackage/airo
|
||||
$(call KernelPackage/mac80211/Default)
|
||||
TITLE:=Cisco Aironet driver
|
||||
DEPENDS+=@PCI_SUPPORT +@DRIVER_WEXT_SUPPORT +kmod-cfg80211 @TARGET_x86 @BROKEN
|
||||
FILES:=$(PKG_BUILD_DIR)/drivers/net/wireless/cisco/airo.ko
|
||||
AUTOLOAD:=$(call AutoProbe,airo)
|
||||
endef
|
||||
|
||||
define KernelPackage/airo/description
|
||||
Kernel support for Cisco Aironet cards
|
||||
endef
|
||||
|
||||
define KernelPackage/hermes
|
||||
$(call KernelPackage/mac80211/Default)
|
||||
TITLE:=Hermes 802.11b chipset support
|
||||
DEPENDS:=@PCI_SUPPORT||PCMCIA_SUPPORT +kmod-cfg80211 +@DRIVER_WEXT_SUPPORT +kmod-crypto-michael-mic
|
||||
FILES:=$(PKG_BUILD_DIR)/drivers/net/wireless/intersil/orinoco/orinoco.ko
|
||||
AUTOLOAD:=$(call AutoProbe,orinoco)
|
||||
endef
|
||||
|
||||
define KernelPackage/hermes/description
|
||||
Kernel support for Hermes 802.11b chipsets
|
||||
endef
|
||||
|
||||
define KernelPackage/hermes-pci
|
||||
$(call KernelPackage/mac80211/Default)
|
||||
TITLE:=Intersil Prism 2.5 PCI support
|
||||
DEPENDS:=@PCI_SUPPORT +kmod-hermes
|
||||
FILES:=$(PKG_BUILD_DIR)/drivers/net/wireless/intersil/orinoco/orinoco_pci.ko
|
||||
AUTOLOAD:=$(call AutoProbe,orinoco_pci)
|
||||
endef
|
||||
|
||||
define KernelPackage/hermes-pci/description
|
||||
Kernel modules for Intersil Prism 2.5 PCI support
|
||||
endef
|
||||
|
||||
define KernelPackage/hermes-plx
|
||||
$(call KernelPackage/mac80211/Default)
|
||||
TITLE:=PLX9052 based PCI adaptor
|
||||
DEPENDS:=@PCI_SUPPORT +kmod-hermes
|
||||
FILES:=$(PKG_BUILD_DIR)/drivers/net/wireless/intersil/orinoco/orinoco_plx.ko
|
||||
AUTOLOAD:=$(call AutoProbe,orinoco_plx)
|
||||
endef
|
||||
|
||||
define KernelPackage/hermes-plx/description
|
||||
Kernel modules for Hermes in PLX9052 based PCI adaptors
|
||||
endef
|
||||
|
||||
define KernelPackage/hermes-pcmcia
|
||||
$(call KernelPackage/mac80211/Default)
|
||||
TITLE:=Hermes based PCMCIA adaptors
|
||||
DEPENDS:=@PCMCIA_SUPPORT +kmod-hermes +kmod-pcmcia-core
|
||||
FILES:=$(PKG_BUILD_DIR)/drivers/net/wireless/intersil/orinoco/orinoco_cs.ko
|
||||
AUTOLOAD:=$(call AutoProbe,orinoco_cs)
|
||||
endef
|
||||
|
||||
define KernelPackage/hermes-pcmcia/description
|
||||
Kernel modules for Hermes based PCMCIA adaptors
|
||||
endef
|
||||
|
||||
|
||||
define KernelPackage/lib80211
|
||||
$(call KernelPackage/mac80211/Default)
|
||||
TITLE:=802.11 Networking stack
|
||||
DEPENDS:=+kmod-cfg80211 +kmod-crypto-hash +kmod-crypto-ccm
|
||||
FILES:= \
|
||||
$(PKG_BUILD_DIR)/net/wireless/lib80211.ko \
|
||||
$(PKG_BUILD_DIR)/net/wireless/lib80211_crypt_wep.ko \
|
||||
$(PKG_BUILD_DIR)/net/wireless/lib80211_crypt_ccmp.ko \
|
||||
$(PKG_BUILD_DIR)/net/wireless/lib80211_crypt_tkip.ko
|
||||
AUTOLOAD:=$(call AutoProbe, \
|
||||
lib80211 \
|
||||
lib80211_crypt_wep \
|
||||
lib80211_crypt_ccmp \
|
||||
lib80211_crypt_tkip \
|
||||
)
|
||||
endef
|
||||
|
||||
define KernelPackage/lib80211/description
|
||||
Kernel modules for 802.11 Networking stack
|
||||
Includes:
|
||||
- lib80211
|
||||
- lib80211_crypt_wep
|
||||
- lib80211_crypt_tkip
|
||||
- lib80211_crytp_ccmp
|
||||
endef
|
||||
|
||||
|
||||
define KernelPackage/mac80211-hwsim
|
||||
$(call KernelPackage/mac80211/Default)
|
||||
TITLE:=mac80211 HW simulation device
|
||||
DEPENDS+= +kmod-mac80211 +@DRIVER_11AC_SUPPORT +@DRIVER_11N_SUPPORT +@DRIVER_11W_SUPPORT
|
||||
FILES:=$(PKG_BUILD_DIR)/drivers/net/wireless/mac80211_hwsim.ko
|
||||
AUTOLOAD:=$(call AutoProbe,mac80211_hwsim)
|
||||
endef
|
||||
|
||||
|
||||
define KernelPackage/mt7601u
|
||||
$(call KernelPackage/mac80211/Default)
|
||||
TITLE:=MT7601U-based USB dongles Wireless Driver
|
||||
DEPENDS+= +kmod-mac80211 +@DRIVER_11N_SUPPORT +@DRIVER_11W_SUPPORT @USB_SUPPORT +kmod-usb-core +mt7601u-firmware
|
||||
FILES:=$(PKG_BUILD_DIR)/drivers/net/wireless/mediatek/mt7601u/mt7601u.ko
|
||||
AUTOLOAD:=$(call AutoProbe,mt7601u)
|
||||
endef
|
||||
|
||||
define KernelPackage/p54/Default
|
||||
$(call KernelPackage/mac80211/Default)
|
||||
TITLE:=Prism54 Drivers
|
||||
endef
|
||||
|
||||
define KernelPackage/p54/description
|
||||
Kernel module for Prism54 chipsets (mac80211)
|
||||
endef
|
||||
|
||||
define KernelPackage/p54-common
|
||||
$(call KernelPackage/p54/Default)
|
||||
DEPENDS+= @(PCI_SUPPORT||USB_SUPPORT) +kmod-mac80211 +kmod-lib-crc-ccitt +@DRIVER_11W_SUPPORT
|
||||
TITLE+= (COMMON)
|
||||
FILES:=$(PKG_BUILD_DIR)/drivers/net/wireless/intersil/p54/p54common.ko
|
||||
endef
|
||||
|
||||
define KernelPackage/p54-pci
|
||||
$(call KernelPackage/p54/Default)
|
||||
TITLE+= (PCI)
|
||||
DEPENDS+= @PCI_SUPPORT +kmod-p54-common +p54-pci-firmware
|
||||
FILES:=$(PKG_BUILD_DIR)/drivers/net/wireless/intersil/p54/p54pci.ko
|
||||
AUTOLOAD:=$(call AutoProbe,p54pci)
|
||||
endef
|
||||
|
||||
define KernelPackage/p54-usb
|
||||
$(call KernelPackage/p54/Default)
|
||||
TITLE+= (USB)
|
||||
DEPENDS+= @USB_SUPPORT +kmod-usb-core +kmod-p54-common +p54-usb-firmware
|
||||
FILES:=$(PKG_BUILD_DIR)/drivers/net/wireless/intersil/p54/p54usb.ko
|
||||
AUTOLOAD:=$(call AutoProbe,p54usb)
|
||||
endef
|
||||
|
||||
define KernelPackage/rsi91x
|
||||
$(call KernelPackage/mac80211/Default)
|
||||
TITLE:=Redpine Signals Inc 91x WLAN driver support
|
||||
DEPENDS+= +kmod-mac80211 +rs9113-firmware +@DRIVER_11N_SUPPORT
|
||||
FILES:=$(PKG_BUILD_DIR)/drivers/net/wireless/rsi/rsi_91x.ko
|
||||
endef
|
||||
|
||||
define KernelPackage/rsi91x-usb
|
||||
$(call KernelPackage/mac80211/Default)
|
||||
TITLE:=Redpine Signals USB bus support
|
||||
DEPENDS+=@USB_SUPPORT +kmod-usb-core +kmod-mac80211 +kmod-rsi91x +rs9113-firmware
|
||||
FILES:=$(PKG_BUILD_DIR)/drivers/net/wireless/rsi/rsi_usb.ko
|
||||
AUTOLOAD:=$(call AutoProbe,rsi_usb)
|
||||
endef
|
||||
|
||||
define KernelPackage/rsi91x-sdio
|
||||
$(call KernelPackage/mac80211/Default)
|
||||
TITLE:=Redpine Signals SDIO bus support
|
||||
DEPENDS+= +kmod-mac80211 +kmod-mmc +kmod-rsi91x +rs9113-firmware
|
||||
FILES:=$(PKG_BUILD_DIR)/drivers/net/wireless/rsi/rsi_sdio.ko
|
||||
AUTOLOAD:=$(call AutoProbe,rsi_sdio)
|
||||
endef
|
||||
|
||||
|
||||
define KernelPackage/wlcore
|
||||
$(call KernelPackage/mac80211/Default)
|
||||
TITLE:=TI common driver part
|
||||
DEPENDS+= +kmod-mmc +kmod-mac80211 +@DRIVER_11N_SUPPORT
|
||||
FILES:= \
|
||||
$(PKG_BUILD_DIR)/drivers/net/wireless/ti/wlcore/wlcore.ko \
|
||||
$(PKG_BUILD_DIR)/drivers/net/wireless/ti/wlcore/wlcore_sdio.ko
|
||||
AUTOLOAD:=$(call AutoProbe,wlcore wlcore_sdio)
|
||||
endef
|
||||
|
||||
define KernelPackage/wlcore/description
|
||||
This module contains some common parts needed by TI Wireless drivers.
|
||||
endef
|
||||
|
||||
define KernelPackage/wl12xx
|
||||
$(call KernelPackage/mac80211/Default)
|
||||
TITLE:=Driver for TI WL12xx
|
||||
URL:=https://wireless.wiki.kernel.org/en/users/drivers/wl12xx
|
||||
DEPENDS+= +kmod-wlcore +wl12xx-firmware
|
||||
FILES:=$(PKG_BUILD_DIR)/drivers/net/wireless/ti/wl12xx/wl12xx.ko
|
||||
AUTOLOAD:=$(call AutoProbe,wl12xx)
|
||||
endef
|
||||
|
||||
define KernelPackage/wl12xx/description
|
||||
Kernel modules for TI WL12xx
|
||||
endef
|
||||
|
||||
define KernelPackage/wl18xx
|
||||
$(call KernelPackage/mac80211/Default)
|
||||
TITLE:=Driver for TI WL18xx
|
||||
URL:=https://wireless.wiki.kernel.org/en/users/drivers/wl18xx
|
||||
DEPENDS+= +kmod-wlcore +wl18xx-firmware
|
||||
FILES:=$(PKG_BUILD_DIR)/drivers/net/wireless/ti/wl18xx/wl18xx.ko
|
||||
AUTOLOAD:=$(call AutoProbe,wl18xx)
|
||||
endef
|
||||
|
||||
define KernelPackage/wl18xx/description
|
||||
Kernel modules for TI WL18xx
|
||||
endef
|
||||
|
||||
|
||||
ZD1211FW_NAME:=zd1211-firmware
|
||||
ZD1211FW_VERSION:=1.4
|
||||
define Download/zd1211rw
|
||||
FILE:=$(ZD1211FW_NAME)-$(ZD1211FW_VERSION).tar.bz2
|
||||
URL:=@SF/zd1211/
|
||||
HASH:=866308f6f59f7075f075d4959dff2ede47735c751251fecd1496df1ba4d338e1
|
||||
endef
|
||||
$(eval $(call Download,zd1211rw))
|
||||
|
||||
define KernelPackage/zd1211rw
|
||||
$(call KernelPackage/mac80211/Default)
|
||||
TITLE:=Zydas ZD1211 support
|
||||
DEPENDS+= @USB_SUPPORT +kmod-usb-core +kmod-mac80211 +@DRIVER_11W_SUPPORT
|
||||
FILES:=$(PKG_BUILD_DIR)/drivers/net/wireless/zydas/zd1211rw/zd1211rw.ko
|
||||
AUTOLOAD:=$(call AutoProbe,zd1211rw)
|
||||
endef
|
||||
|
||||
ifdef CONFIG_PACKAGE_MAC80211_DEBUGFS
|
||||
config-y += \
|
||||
CFG80211_DEBUGFS \
|
||||
MAC80211_DEBUGFS
|
||||
endif
|
||||
|
||||
ifdef CONFIG_PACKAGE_MAC80211_TRACING
|
||||
config-y += \
|
||||
IWLWIFI_DEVICE_TRACING
|
||||
endif
|
||||
|
||||
config-$(call config_package,lib80211) += LIB80211 LIB80211_CRYPT_WEP LIB80211_CRYPT_CCMP LIB80211_CRYPT_TKIP
|
||||
|
||||
config-$(call config_package,airo) += AIRO
|
||||
|
||||
config-$(call config_package,mac80211-hwsim) += MAC80211_HWSIM
|
||||
config-$(call config_package,mt7601u) += MT7601U
|
||||
config-y += WL_MEDIATEK
|
||||
|
||||
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,hermes) += HERMES
|
||||
config-$(call config_package,hermes-pci) += PCI_HERMES
|
||||
config-$(call config_package,hermes-plx) += PLX_HERMES
|
||||
config-$(call config_package,hermes-pcmcia) += PCMCIA_HERMES
|
||||
config-y += HERMES_PRISM
|
||||
|
||||
config-$(call config_package,adm8211) += ADM8211
|
||||
config-$(call config_package,wlcore) += WLCORE WLCORE_SDIO
|
||||
config-$(call config_package,wl12xx) += WL12XX
|
||||
config-$(call config_package,wl18xx) += WL18XX
|
||||
config-y += WL_TI WILINK_PLATFORM_DATA
|
||||
config-$(call config_package,zd1211rw) += ZD1211RW
|
||||
config-$(call config_package,rsi91x) += RSI_91X
|
||||
config-$(call config_package,rsi91x-usb) += RSI_USB
|
||||
config-$(call config_package,rsi91x-sdio) += RSI_SDIO
|
||||
|
||||
config-$(CONFIG_LEDS_TRIGGERS) += MAC80211_LEDS
|
||||
|
||||
MAKE_OPTS:= -C "$(PKG_BUILD_DIR)" \
|
||||
$(KERNEL_MAKE_FLAGS) \
|
||||
EXTRA_CFLAGS="-I$(PKG_BUILD_DIR)/include $(IREMAP_CFLAGS)" \
|
||||
KLIB_BUILD="$(LINUX_DIR)" \
|
||||
MODPROBE=true \
|
||||
KLIB=$(TARGET_MODULES_DIR) \
|
||||
KERNEL_SUBLEVEL=$(lastword $(subst ., ,$(KERNEL_PATCHVER))) \
|
||||
KBUILD_LDFLAGS_MODULE_PREREQ=
|
||||
|
||||
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)
|
||||
mkdir -p $(PKG_BUILD_DIR)
|
||||
$(PKG_UNPACK)
|
||||
$(Build/Patch)
|
||||
$(TAR) -C $(PKG_BUILD_DIR) -xzf $(DL_DIR)/$(IPW2100_NAME)-$(IPW2100_VERSION).tgz
|
||||
$(TAR) -C $(PKG_BUILD_DIR) -xzf $(DL_DIR)/$(IPW2200_NAME)-$(IPW2200_VERSION).tgz
|
||||
$(TAR) -C $(PKG_BUILD_DIR) -xjf $(DL_DIR)/$(ZD1211FW_NAME)-$(ZD1211FW_VERSION).tar.bz2
|
||||
rm -rf \
|
||||
$(PKG_BUILD_DIR)/include/linux/ssb \
|
||||
$(PKG_BUILD_DIR)/include/linux/bcma \
|
||||
$(PKG_BUILD_DIR)/include/net/bluetooth
|
||||
|
||||
rm -f \
|
||||
$(PKG_BUILD_DIR)/include/linux/cordic.h \
|
||||
$(PKG_BUILD_DIR)/include/linux/crc8.h \
|
||||
$(PKG_BUILD_DIR)/include/linux/eeprom_93cx6.h \
|
||||
$(PKG_BUILD_DIR)/include/linux/wl12xx.h \
|
||||
$(PKG_BUILD_DIR)/include/linux/spi/libertas_spi.h \
|
||||
$(PKG_BUILD_DIR)/include/net/ieee80211.h \
|
||||
$(PKG_BUILD_DIR)/backport-include/linux/bcm47xx_nvram.h
|
||||
|
||||
echo 'compat-wireless-$(PKG_VERSION)-$(PKG_RELEASE)-$(REVISION)' > $(PKG_BUILD_DIR)/compat_version
|
||||
endef
|
||||
|
||||
ifneq ($(CONFIG_PACKAGE_kmod-cfg80211)$(CONFIG_PACKAGE_kmod-lib80211),)
|
||||
define Build/Compile/kmod
|
||||
rm -rf $(PKG_BUILD_DIR)/modules
|
||||
+$(MAKE) $(PKG_JOBS) $(MAKE_OPTS) modules
|
||||
endef
|
||||
endif
|
||||
|
||||
define Build/Patch
|
||||
$(if $(QUILT),rm -rf $(PKG_BUILD_DIR)/patches; mkdir -p $(PKG_BUILD_DIR)/patches)
|
||||
$(call PatchDir,$(PKG_BUILD_DIR),$(PATCH_DIR)/build,build/)
|
||||
$(call PatchDir,$(PKG_BUILD_DIR),$(PATCH_DIR)/subsys,subsys/)
|
||||
$(call PatchDir,$(PKG_BUILD_DIR),$(PATCH_DIR)/ath,ath/)
|
||||
$(call PatchDir,$(PKG_BUILD_DIR),$(PATCH_DIR)/rt2x00,rt2x00/)
|
||||
$(call PatchDir,$(PKG_BUILD_DIR),$(PATCH_DIR)/mwl,mwl/)
|
||||
$(call PatchDir,$(PKG_BUILD_DIR),$(PATCH_DIR)/brcm,brcm/)
|
||||
$(if $(QUILT),touch $(PKG_BUILD_DIR)/.quilt_used)
|
||||
endef
|
||||
|
||||
define Quilt/Refresh/Package
|
||||
$(call Quilt/RefreshDir,$(PKG_BUILD_DIR),$(PATCH_DIR)/build,build/)
|
||||
$(call Quilt/RefreshDir,$(PKG_BUILD_DIR),$(PATCH_DIR)/subsys,subsys/)
|
||||
$(call Quilt/RefreshDir,$(PKG_BUILD_DIR),$(PATCH_DIR)/ath,ath/)
|
||||
$(call Quilt/RefreshDir,$(PKG_BUILD_DIR),$(PATCH_DIR)/rt2x00,rt2x00/)
|
||||
$(call Quilt/RefreshDir,$(PKG_BUILD_DIR),$(PATCH_DIR)/mwl,mwl/)
|
||||
$(call Quilt/RefreshDir,$(PKG_BUILD_DIR),$(PATCH_DIR)/brcm,brcm/)
|
||||
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/
|
||||
rm -f $(1)/usr/include/mac80211-backport/linux/module.h
|
||||
endef
|
||||
|
||||
|
||||
define KernelPackage/cfg80211/install
|
||||
$(INSTALL_DIR) $(1)/lib/wifi $(1)/lib/netifd/wireless
|
||||
$(INSTALL_DATA) ./files/lib/wifi/mac80211.sh $(1)/lib/wifi
|
||||
# $(INSTALL_DATA) ./files/lib/netifd/mac80211.sh $(1)/lib/netifd
|
||||
$(INSTALL_BIN) ./files/lib/netifd/wireless/mac80211.sh $(1)/lib/netifd/wireless
|
||||
$(INSTALL_DIR) $(1)/etc/hotplug.d/ieee80211
|
||||
$(INSTALL_DATA) ./files/mac80211.hotplug $(1)/etc/hotplug.d/ieee80211/10-wifi-detect
|
||||
endef
|
||||
|
||||
define KernelPackage/zd1211rw/install
|
||||
$(INSTALL_DIR) $(1)/lib/firmware/zd1211
|
||||
$(INSTALL_DATA) $(PKG_BUILD_DIR)/$(ZD1211FW_NAME)/zd1211* $(1)/lib/firmware/zd1211
|
||||
endef
|
||||
|
||||
$(eval $(foreach drv,$(PKG_DRIVERS),$(call KernelPackage,$(drv))))
|
||||
$(eval $(call KernelPackage,cfg80211))
|
||||
$(eval $(call KernelPackage,mac80211))
|
||||
310
mac80211/ath.mk
Normal file
310
mac80211/ath.mk
Normal file
@@ -0,0 +1,310 @@
|
||||
PKG_DRIVERS += \
|
||||
ath ath5k ath6kl ath6kl-sdio ath6kl-usb ath9k ath9k-common ath9k-htc ath10k \
|
||||
carl9170 owl-loader ar5523
|
||||
|
||||
PKG_CONFIG_DEPENDS += \
|
||||
CONFIG_PACKAGE_ATH_DEBUG \
|
||||
CONFIG_PACKAGE_ATH_DFS \
|
||||
CONFIG_PACKAGE_ATH_SPECTRAL \
|
||||
CONFIG_PACKAGE_ATH_DYNACK \
|
||||
CONFIG_ATH9K_HWRNG \
|
||||
CONFIG_ATH9K_SUPPORT_PCOEM \
|
||||
CONFIG_ATH9K_TX99 \
|
||||
CONFIG_ATH10K_LEDS \
|
||||
CONFIG_ATH10K_THERMAL \
|
||||
CONFIG_ATH_USER_REGD
|
||||
|
||||
ifdef CONFIG_PACKAGE_MAC80211_DEBUGFS
|
||||
config-y += \
|
||||
ATH9K_DEBUGFS \
|
||||
ATH9K_HTC_DEBUGFS \
|
||||
ATH10K_DEBUGFS \
|
||||
CARL9170_DEBUGFS \
|
||||
ATH5K_DEBUG \
|
||||
ATH6KL_DEBUG
|
||||
endif
|
||||
|
||||
ifdef CONFIG_PACKAGE_MAC80211_TRACING
|
||||
config-y += \
|
||||
ATH10K_TRACING \
|
||||
ATH6KL_TRACING \
|
||||
ATH_TRACEPOINTS \
|
||||
ATH5K_TRACER
|
||||
endif
|
||||
|
||||
config-$(call config_package,ath) += ATH_CARDS ATH_COMMON ATH_REG_DYNAMIC_USER_REG_HINTS
|
||||
config-$(CONFIG_PACKAGE_ATH_DEBUG) += ATH_DEBUG ATH10K_DEBUG ATH9K_STATION_STATISTICS
|
||||
config-$(CONFIG_PACKAGE_ATH_DFS) += ATH9K_DFS_CERTIFIED ATH10K_DFS_CERTIFIED
|
||||
config-$(CONFIG_PACKAGE_ATH_SPECTRAL) += ATH9K_COMMON_SPECTRAL ATH10K_SPECTRAL
|
||||
config-$(CONFIG_PACKAGE_ATH_DYNACK) += ATH9K_DYNACK
|
||||
config-$(call config_package,ath9k) += ATH9K
|
||||
config-$(call config_package,ath9k-common) += ATH9K_COMMON
|
||||
config-$(call config_package,owl-loader) += ATH9K_PCI_NO_EEPROM
|
||||
config-$(CONFIG_TARGET_ath79) += ATH9K_AHB
|
||||
config-$(CONFIG_TARGET_ipq40xx) += ATH10K_AHB
|
||||
config-$(CONFIG_PCI) += ATH9K_PCI
|
||||
config-$(CONFIG_ATH_USER_REGD) += ATH_USER_REGD
|
||||
config-$(CONFIG_ATH9K_HWRNG) += ATH9K_HWRNG
|
||||
config-$(CONFIG_ATH9K_SUPPORT_PCOEM) += ATH9K_PCOEM
|
||||
config-$(CONFIG_ATH9K_TX99) += ATH9K_TX99
|
||||
config-$(CONFIG_ATH9K_UBNTHSR) += ATH9K_UBNTHSR
|
||||
config-$(CONFIG_ATH10K_LEDS) += ATH10K_LEDS
|
||||
config-$(CONFIG_ATH10K_THERMAL) += ATH10K_THERMAL
|
||||
|
||||
config-$(call config_package,ath9k-htc) += ATH9K_HTC
|
||||
config-$(call config_package,ath10k) += ATH10K ATH10K_PCI
|
||||
|
||||
config-$(call config_package,ath5k) += ATH5K
|
||||
ifdef CONFIG_TARGET_ath25
|
||||
config-y += ATH5K_AHB
|
||||
else
|
||||
config-y += ATH5K_PCI
|
||||
endif
|
||||
|
||||
config-$(call config_package,ath6kl) += ATH6KL
|
||||
config-$(call config_package,ath6kl-sdio) += ATH6KL_SDIO
|
||||
config-$(call config_package,ath6kl-usb) += ATH6KL_USB
|
||||
|
||||
config-$(call config_package,carl9170) += CARL9170
|
||||
config-$(call config_package,ar5523) += AR5523
|
||||
|
||||
define KernelPackage/ath/config
|
||||
if PACKAGE_kmod-ath
|
||||
config ATH_USER_REGD
|
||||
bool "Force Atheros drivers to respect the user's regdomain settings"
|
||||
default y
|
||||
help
|
||||
Atheros' idea of regulatory handling is that the EEPROM of the card defines
|
||||
the regulatory limits and the user is only allowed to restrict the settings
|
||||
even further, even if the country allows frequencies or power levels that
|
||||
are forbidden by the EEPROM settings.
|
||||
|
||||
Select this option if you want the driver to respect the user's decision about
|
||||
regulatory settings.
|
||||
|
||||
config PACKAGE_ATH_DEBUG
|
||||
bool "Atheros wireless debugging"
|
||||
help
|
||||
Say Y, if you want to debug atheros wireless drivers.
|
||||
Only ath9k & ath10k make use of this.
|
||||
|
||||
config PACKAGE_ATH_DFS
|
||||
bool "Enable DFS support"
|
||||
default y
|
||||
help
|
||||
Dynamic frequency selection (DFS) is required for most of the 5 GHz band
|
||||
channels in Europe, US, and Japan.
|
||||
|
||||
Select this option if you want to use such channels.
|
||||
|
||||
config PACKAGE_ATH_SPECTRAL
|
||||
bool "Atheros spectral scan support"
|
||||
depends on PACKAGE_ATH_DEBUG
|
||||
select KERNEL_RELAY
|
||||
help
|
||||
Say Y to enable access to the FFT/spectral data via debugfs.
|
||||
|
||||
config PACKAGE_ATH_DYNACK
|
||||
bool "Enable Dynack support"
|
||||
depends on PACKAGE_kmod-ath9k-common
|
||||
help
|
||||
Enables support for Dynamic ACK estimation, which allows the fastest possible speed
|
||||
at any distance automatically by increasing/decreasing the max frame ACK time for
|
||||
the most remote station detected. It can be enabled by using iw (iw phy0 set distance auto),
|
||||
or by sending the NL80211_ATTR_WIPHY_DYN_ACK flag to mac80211 driver using netlink.
|
||||
|
||||
Select this option if you want to enable this feature
|
||||
|
||||
endif
|
||||
endef
|
||||
|
||||
define KernelPackage/ath
|
||||
$(call KernelPackage/mac80211/Default)
|
||||
TITLE:=Atheros common driver part
|
||||
DEPENDS+= @PCI_SUPPORT||USB_SUPPORT||TARGET_ath79||TARGET_ath25 +kmod-mac80211
|
||||
FILES:=$(PKG_BUILD_DIR)/drivers/net/wireless/ath/ath.ko
|
||||
MENU:=1
|
||||
endef
|
||||
|
||||
define KernelPackage/ath/description
|
||||
This module contains some common parts needed by Atheros Wireless drivers.
|
||||
endef
|
||||
|
||||
define KernelPackage/ath5k
|
||||
$(call KernelPackage/mac80211/Default)
|
||||
TITLE:=Atheros 5xxx wireless cards support
|
||||
URL:=https://wireless.wiki.kernel.org/en/users/drivers/ath5k
|
||||
DEPENDS+= @(PCI_SUPPORT||TARGET_ath25) +kmod-ath +@DRIVER_11W_SUPPORT
|
||||
FILES:=$(PKG_BUILD_DIR)/drivers/net/wireless/ath/ath5k/ath5k.ko
|
||||
AUTOLOAD:=$(call AutoProbe,ath5k)
|
||||
endef
|
||||
|
||||
define KernelPackage/ath5k/description
|
||||
This module adds support for wireless adapters based on
|
||||
Atheros 5xxx chipset.
|
||||
endef
|
||||
|
||||
define KernelPackage/ath6kl
|
||||
$(call KernelPackage/mac80211/Default)
|
||||
TITLE:=Atheros FullMAC wireless devices (common code for ath6kl_sdio and ath6kl_usb)
|
||||
URL:=https://wireless.wiki.kernel.org/en/users/drivers/ath6kl
|
||||
HIDDEN:=1
|
||||
DEPENDS+= +kmod-ath +@DRIVER_11N_SUPPORT
|
||||
FILES:= $(PKG_BUILD_DIR)/drivers/net/wireless/ath/ath6kl/ath6kl_core.ko
|
||||
endef
|
||||
|
||||
define KernelPackage/ath6kl-sdio
|
||||
$(call KernelPackage/mac80211/Default)
|
||||
TITLE:=Atheros 802.11n SDIO wireless cards support
|
||||
URL:=https://wireless.wiki.kernel.org/en/users/drivers/ath6kl
|
||||
DEPENDS+= +kmod-mmc +kmod-ath6kl
|
||||
FILES:= $(PKG_BUILD_DIR)/drivers/net/wireless/ath/ath6kl/ath6kl_sdio.ko
|
||||
AUTOLOAD:=$(call AutoProbe,ath6kl_sdio)
|
||||
endef
|
||||
|
||||
define KernelPackage/ath6kl-sdio/description
|
||||
This module adds support for wireless adapters based on
|
||||
Atheros IEEE 802.11n AR6003 and AR6004 family of chipsets.
|
||||
endef
|
||||
|
||||
define KernelPackage/ath6kl-usb
|
||||
$(call KernelPackage/mac80211/Default)
|
||||
TITLE:=Atheros 802.11n USB wireless cards support
|
||||
URL:=https://wireless.wiki.kernel.org/en/users/drivers/ath6kl
|
||||
DEPENDS+= @USB_SUPPORT +kmod-usb-core +kmod-ath6kl
|
||||
FILES:= $(PKG_BUILD_DIR)/drivers/net/wireless/ath/ath6kl/ath6kl_usb.ko
|
||||
AUTOLOAD:=$(call AutoProbe,ath6kl_usb)
|
||||
endef
|
||||
|
||||
define KernelPackage/ath6kl-usb/description
|
||||
This module adds support for wireless adapters based on the
|
||||
Atheros IEEE 802.11n AR6004 chipset.
|
||||
endef
|
||||
|
||||
define KernelPackage/ath9k-common
|
||||
$(call KernelPackage/mac80211/Default)
|
||||
TITLE:=Atheros 802.11n wireless devices (common code for ath9k and ath9k_htc)
|
||||
URL:=https://wireless.wiki.kernel.org/en/users/drivers/ath9k
|
||||
HIDDEN:=1
|
||||
DEPENDS+= @PCI_SUPPORT||USB_SUPPORT||TARGET_ath79 +kmod-ath +@DRIVER_11N_SUPPORT +@DRIVER_11W_SUPPORT
|
||||
FILES:= \
|
||||
$(PKG_BUILD_DIR)/drivers/net/wireless/ath/ath9k/ath9k_common.ko \
|
||||
$(PKG_BUILD_DIR)/drivers/net/wireless/ath/ath9k/ath9k_hw.ko
|
||||
endef
|
||||
|
||||
define KernelPackage/ath9k
|
||||
$(call KernelPackage/mac80211/Default)
|
||||
TITLE:=Atheros 802.11n PCI wireless cards support
|
||||
URL:=https://wireless.wiki.kernel.org/en/users/drivers/ath9k
|
||||
DEPENDS+= @PCI_SUPPORT||TARGET_ath79 +kmod-ath9k-common
|
||||
FILES:= \
|
||||
$(PKG_BUILD_DIR)/drivers/net/wireless/ath/ath9k/ath9k.ko
|
||||
AUTOLOAD:=$(call AutoProbe,ath9k)
|
||||
endef
|
||||
|
||||
define KernelPackage/ath9k/description
|
||||
This module adds support for wireless adapters based on
|
||||
Atheros IEEE 802.11n AR5008 and AR9001 family of chipsets.
|
||||
endef
|
||||
|
||||
define KernelPackage/ath9k/config
|
||||
|
||||
config ATH9K_HWRNG
|
||||
bool "Add wireless noise as source of randomness to kernel entropy pool"
|
||||
depends on PACKAGE_kmod-ath9k
|
||||
select PACKAGE_kmod-random-core
|
||||
default n
|
||||
|
||||
config ATH9K_SUPPORT_PCOEM
|
||||
bool "Support chips used in PC OEM cards"
|
||||
depends on PACKAGE_kmod-ath9k
|
||||
|
||||
config ATH9K_TX99
|
||||
bool "Enable TX99 support (WARNING: testing only, breaks normal operation!)"
|
||||
depends on PACKAGE_kmod-ath9k
|
||||
|
||||
config ATH9K_UBNTHSR
|
||||
bool "Support for Ubiquiti UniFi Outdoor+ access point"
|
||||
depends on PACKAGE_kmod-ath9k && TARGET_ath79
|
||||
default y
|
||||
|
||||
endef
|
||||
|
||||
define KernelPackage/ath9k-htc
|
||||
$(call KernelPackage/mac80211/Default)
|
||||
TITLE:=Atheros 802.11n USB device support
|
||||
URL:=https://wireless.wiki.kernel.org/en/users/drivers/ath9k
|
||||
DEPENDS+= @USB_SUPPORT +kmod-ath9k-common +kmod-usb-core +ath9k-htc-firmware
|
||||
FILES:= \
|
||||
$(PKG_BUILD_DIR)/drivers/net/wireless/ath/ath9k/ath9k_htc.ko
|
||||
AUTOLOAD:=$(call AutoProbe,ath9k_htc)
|
||||
endef
|
||||
|
||||
define KernelPackage/ath9k-htc/description
|
||||
This module adds support for wireless adapters based on
|
||||
Atheros USB AR9271 and AR7010 family of chipsets.
|
||||
endef
|
||||
|
||||
define KernelPackage/ath10k
|
||||
$(call KernelPackage/mac80211/Default)
|
||||
TITLE:=Atheros 802.11ac wireless cards support
|
||||
URL:=https://wireless.wiki.kernel.org/en/users/drivers/ath10k
|
||||
DEPENDS+= @PCI_SUPPORT +kmod-ath +@DRIVER_11N_SUPPORT +@DRIVER_11AC_SUPPORT +@DRIVER_11W_SUPPORT \
|
||||
+ATH10K_THERMAL:kmod-hwmon-core +ATH10K_THERMAL:kmod-thermal
|
||||
FILES:= \
|
||||
$(PKG_BUILD_DIR)/drivers/net/wireless/ath/ath10k/ath10k_core.ko \
|
||||
$(PKG_BUILD_DIR)/drivers/net/wireless/ath/ath10k/ath10k_pci.ko
|
||||
AUTOLOAD:=$(call AutoProbe,ath10k_pci)
|
||||
endef
|
||||
|
||||
define KernelPackage/ath10k/description
|
||||
This module adds support for wireless adapters based on
|
||||
Atheros IEEE 802.11ac family of chipsets. For now only
|
||||
PCI is supported.
|
||||
endef
|
||||
|
||||
define KernelPackage/ath10k/config
|
||||
|
||||
config ATH10K_LEDS
|
||||
bool "Enable LED support"
|
||||
default y
|
||||
depends on PACKAGE_kmod-ath10k
|
||||
|
||||
config ATH10K_THERMAL
|
||||
bool "Enable thermal sensors and throttling support"
|
||||
depends on PACKAGE_kmod-ath10k
|
||||
|
||||
endef
|
||||
|
||||
define KernelPackage/carl9170
|
||||
$(call KernelPackage/mac80211/Default)
|
||||
TITLE:=Driver for Atheros AR9170 USB sticks
|
||||
DEPENDS:=@USB_SUPPORT +kmod-mac80211 +kmod-ath +kmod-usb-core +kmod-input-core +@DRIVER_11N_SUPPORT +@DRIVER_11W_SUPPORT +carl9170-firmware
|
||||
FILES:=$(PKG_BUILD_DIR)/drivers/net/wireless/ath/carl9170/carl9170.ko
|
||||
AUTOLOAD:=$(call AutoProbe,carl9170)
|
||||
endef
|
||||
|
||||
define KernelPackage/owl-loader
|
||||
$(call KernelPackage/mac80211/Default)
|
||||
TITLE:=Owl loader for initializing Atheros PCI(e) Wifi chips
|
||||
DEPENDS:=@PCI_SUPPORT +kmod-ath9k
|
||||
FILES:=$(PKG_BUILD_DIR)/drivers/net/wireless/ath/ath9k/ath9k_pci_owl_loader.ko
|
||||
AUTOLOAD:=$(call AutoProbe,ath9k_pci_owl_loader)
|
||||
endef
|
||||
|
||||
define KernelPackage/owl-loader/description
|
||||
Kernel module that helps to initialize certain Qualcomm
|
||||
Atheros' PCI(e) Wifi chips, which have the init data
|
||||
(which contains the PCI device ID for example) stored
|
||||
together with the calibration data in the file system.
|
||||
|
||||
This is necessary for devices like the Cisco Meraki Z1.
|
||||
endef
|
||||
|
||||
define KernelPackage/ar5523
|
||||
$(call KernelPackage/mac80211/Default)
|
||||
TITLE:=Driver for Atheros AR5523 USB sticks
|
||||
DEPENDS:=@USB_SUPPORT +kmod-mac80211 +kmod-ath +kmod-usb-core +kmod-input-core
|
||||
FILES:=$(PKG_BUILD_DIR)/drivers/net/wireless/ath/ar5523/ar5523.ko
|
||||
AUTOLOAD:=$(call AutoProbe,ar5523)
|
||||
endef
|
||||
302
mac80211/ath.mk.orig
Normal file
302
mac80211/ath.mk.orig
Normal file
@@ -0,0 +1,302 @@
|
||||
PKG_DRIVERS += \
|
||||
ath ath5k ath6kl ath6kl-sdio ath6kl-usb ath9k ath9k-common ath9k-htc ath10k \
|
||||
carl9170 owl-loader
|
||||
|
||||
PKG_CONFIG_DEPENDS += \
|
||||
CONFIG_PACKAGE_ATH_DEBUG \
|
||||
CONFIG_PACKAGE_ATH_DFS \
|
||||
CONFIG_PACKAGE_ATH_SPECTRAL \
|
||||
CONFIG_PACKAGE_ATH_DYNACK \
|
||||
CONFIG_ATH9K_HWRNG \
|
||||
CONFIG_ATH9K_SUPPORT_PCOEM \
|
||||
CONFIG_ATH9K_TX99 \
|
||||
CONFIG_ATH10K_LEDS \
|
||||
CONFIG_ATH10K_THERMAL \
|
||||
CONFIG_ATH_USER_REGD
|
||||
|
||||
ifdef CONFIG_PACKAGE_MAC80211_DEBUGFS
|
||||
config-y += \
|
||||
ATH9K_DEBUGFS \
|
||||
ATH9K_HTC_DEBUGFS \
|
||||
ATH10K_DEBUGFS \
|
||||
CARL9170_DEBUGFS \
|
||||
ATH5K_DEBUG \
|
||||
ATH6KL_DEBUG
|
||||
endif
|
||||
|
||||
ifdef CONFIG_PACKAGE_MAC80211_TRACING
|
||||
config-y += \
|
||||
ATH10K_TRACING \
|
||||
ATH6KL_TRACING \
|
||||
ATH_TRACEPOINTS \
|
||||
ATH5K_TRACER
|
||||
endif
|
||||
|
||||
config-$(call config_package,ath) += ATH_CARDS ATH_COMMON ATH_REG_DYNAMIC_USER_REG_HINTS
|
||||
config-$(CONFIG_PACKAGE_ATH_DEBUG) += ATH_DEBUG ATH10K_DEBUG ATH9K_STATION_STATISTICS
|
||||
config-$(CONFIG_PACKAGE_ATH_DFS) += ATH9K_DFS_CERTIFIED ATH10K_DFS_CERTIFIED
|
||||
config-$(CONFIG_PACKAGE_ATH_SPECTRAL) += ATH9K_COMMON_SPECTRAL ATH10K_SPECTRAL
|
||||
config-$(CONFIG_PACKAGE_ATH_DYNACK) += ATH9K_DYNACK
|
||||
config-$(call config_package,ath9k) += ATH9K
|
||||
config-$(call config_package,ath9k-common) += ATH9K_COMMON
|
||||
config-$(call config_package,owl-loader) += ATH9K_PCI_NO_EEPROM
|
||||
config-$(CONFIG_TARGET_ar71xx) += ATH9K_AHB
|
||||
config-$(CONFIG_TARGET_ath79) += ATH9K_AHB
|
||||
config-$(CONFIG_TARGET_ipq40xx) += ATH10K_AHB
|
||||
config-$(CONFIG_PCI) += ATH9K_PCI
|
||||
config-$(CONFIG_ATH_USER_REGD) += ATH_USER_REGD
|
||||
config-$(CONFIG_ATH9K_HWRNG) += ATH9K_HWRNG
|
||||
config-$(CONFIG_ATH9K_SUPPORT_PCOEM) += ATH9K_PCOEM
|
||||
config-$(CONFIG_ATH9K_TX99) += ATH9K_TX99
|
||||
config-$(CONFIG_ATH9K_UBNTHSR) += ATH9K_UBNTHSR
|
||||
config-$(CONFIG_ATH10K_LEDS) += ATH10K_LEDS
|
||||
config-$(CONFIG_ATH10K_THERMAL) += ATH10K_THERMAL
|
||||
|
||||
config-$(call config_package,ath9k-htc) += ATH9K_HTC
|
||||
config-$(call config_package,ath10k) += ATH10K ATH10K_PCI
|
||||
|
||||
config-$(call config_package,ath5k) += ATH5K
|
||||
ifdef CONFIG_TARGET_ath25
|
||||
config-y += ATH5K_AHB
|
||||
else
|
||||
config-y += ATH5K_PCI
|
||||
endif
|
||||
|
||||
config-$(call config_package,ath6kl) += ATH6KL
|
||||
config-$(call config_package,ath6kl-sdio) += ATH6KL_SDIO
|
||||
config-$(call config_package,ath6kl-usb) += ATH6KL_USB
|
||||
|
||||
config-$(call config_package,carl9170) += CARL9170
|
||||
|
||||
define KernelPackage/ath/config
|
||||
if PACKAGE_kmod-ath
|
||||
config ATH_USER_REGD
|
||||
bool "Force Atheros drivers to respect the user's regdomain settings"
|
||||
default y
|
||||
help
|
||||
Atheros' idea of regulatory handling is that the EEPROM of the card defines
|
||||
the regulatory limits and the user is only allowed to restrict the settings
|
||||
even further, even if the country allows frequencies or power levels that
|
||||
are forbidden by the EEPROM settings.
|
||||
|
||||
Select this option if you want the driver to respect the user's decision about
|
||||
regulatory settings.
|
||||
|
||||
config PACKAGE_ATH_DEBUG
|
||||
bool "Atheros wireless debugging"
|
||||
help
|
||||
Say Y, if you want to debug atheros wireless drivers.
|
||||
Only ath9k & ath10k make use of this.
|
||||
|
||||
config PACKAGE_ATH_DFS
|
||||
bool "Enable DFS support"
|
||||
default y
|
||||
help
|
||||
Dynamic frequency selection (DFS) is required for most of the 5 GHz band
|
||||
channels in Europe, US, and Japan.
|
||||
|
||||
Select this option if you want to use such channels.
|
||||
|
||||
config PACKAGE_ATH_SPECTRAL
|
||||
bool "Atheros spectral scan support"
|
||||
depends on PACKAGE_ATH_DEBUG
|
||||
select KERNEL_RELAY
|
||||
help
|
||||
Say Y to enable access to the FFT/spectral data via debugfs.
|
||||
|
||||
config PACKAGE_ATH_DYNACK
|
||||
bool "Enable Dynack support"
|
||||
depends on PACKAGE_kmod-ath9k-common
|
||||
help
|
||||
Enables support for Dynamic ACK estimation, which allows the fastest possible speed
|
||||
at any distance automatically by increasing/decreasing the max frame ACK time for
|
||||
the most remote station detected. It can be enabled by using iw (iw phy0 set distance auto),
|
||||
or by sending the NL80211_ATTR_WIPHY_DYN_ACK flag to mac80211 driver using netlink.
|
||||
|
||||
Select this option if you want to enable this feature
|
||||
|
||||
endif
|
||||
endef
|
||||
|
||||
define KernelPackage/ath
|
||||
$(call KernelPackage/mac80211/Default)
|
||||
TITLE:=Atheros common driver part
|
||||
DEPENDS+= @PCI_SUPPORT||USB_SUPPORT||TARGET_ar71xx||TARGET_ath79||TARGET_ath25 +kmod-mac80211
|
||||
FILES:=$(PKG_BUILD_DIR)/drivers/net/wireless/ath/ath.ko
|
||||
MENU:=1
|
||||
endef
|
||||
|
||||
define KernelPackage/ath/description
|
||||
This module contains some common parts needed by Atheros Wireless drivers.
|
||||
endef
|
||||
|
||||
define KernelPackage/ath5k
|
||||
$(call KernelPackage/mac80211/Default)
|
||||
TITLE:=Atheros 5xxx wireless cards support
|
||||
URL:=https://wireless.wiki.kernel.org/en/users/drivers/ath5k
|
||||
DEPENDS+= @(PCI_SUPPORT||TARGET_ath25) +kmod-ath +@DRIVER_11W_SUPPORT
|
||||
FILES:=$(PKG_BUILD_DIR)/drivers/net/wireless/ath/ath5k/ath5k.ko
|
||||
AUTOLOAD:=$(call AutoProbe,ath5k)
|
||||
endef
|
||||
|
||||
define KernelPackage/ath5k/description
|
||||
This module adds support for wireless adapters based on
|
||||
Atheros 5xxx chipset.
|
||||
endef
|
||||
|
||||
define KernelPackage/ath6kl
|
||||
$(call KernelPackage/mac80211/Default)
|
||||
TITLE:=Atheros FullMAC wireless devices (common code for ath6kl_sdio and ath6kl_usb)
|
||||
URL:=https://wireless.wiki.kernel.org/en/users/drivers/ath6kl
|
||||
HIDDEN:=1
|
||||
DEPENDS+= +kmod-ath +@DRIVER_11N_SUPPORT
|
||||
FILES:= $(PKG_BUILD_DIR)/drivers/net/wireless/ath/ath6kl/ath6kl_core.ko
|
||||
endef
|
||||
|
||||
define KernelPackage/ath6kl-sdio
|
||||
$(call KernelPackage/mac80211/Default)
|
||||
TITLE:=Atheros 802.11n SDIO wireless cards support
|
||||
URL:=https://wireless.wiki.kernel.org/en/users/drivers/ath6kl
|
||||
DEPENDS+= +kmod-mmc +kmod-ath6kl
|
||||
FILES:= $(PKG_BUILD_DIR)/drivers/net/wireless/ath/ath6kl/ath6kl_sdio.ko
|
||||
AUTOLOAD:=$(call AutoProbe,ath6kl_sdio)
|
||||
endef
|
||||
|
||||
define KernelPackage/ath6kl-sdio/description
|
||||
This module adds support for wireless adapters based on
|
||||
Atheros IEEE 802.11n AR6003 and AR6004 family of chipsets.
|
||||
endef
|
||||
|
||||
define KernelPackage/ath6kl-usb
|
||||
$(call KernelPackage/mac80211/Default)
|
||||
TITLE:=Atheros 802.11n USB wireless cards support
|
||||
URL:=https://wireless.wiki.kernel.org/en/users/drivers/ath6kl
|
||||
DEPENDS+= @USB_SUPPORT +kmod-usb-core +kmod-ath6kl
|
||||
FILES:= $(PKG_BUILD_DIR)/drivers/net/wireless/ath/ath6kl/ath6kl_usb.ko
|
||||
AUTOLOAD:=$(call AutoProbe,ath6kl_usb)
|
||||
endef
|
||||
|
||||
define KernelPackage/ath6kl-usb/description
|
||||
This module adds support for wireless adapters based on the
|
||||
Atheros IEEE 802.11n AR6004 chipset.
|
||||
endef
|
||||
|
||||
define KernelPackage/ath9k-common
|
||||
$(call KernelPackage/mac80211/Default)
|
||||
TITLE:=Atheros 802.11n wireless devices (common code for ath9k and ath9k_htc)
|
||||
URL:=https://wireless.wiki.kernel.org/en/users/drivers/ath9k
|
||||
HIDDEN:=1
|
||||
DEPENDS+= @PCI_SUPPORT||USB_SUPPORT||TARGET_ar71xx||TARGET_ath79 +kmod-ath +@DRIVER_11N_SUPPORT +@DRIVER_11W_SUPPORT
|
||||
FILES:= \
|
||||
$(PKG_BUILD_DIR)/drivers/net/wireless/ath/ath9k/ath9k_common.ko \
|
||||
$(PKG_BUILD_DIR)/drivers/net/wireless/ath/ath9k/ath9k_hw.ko
|
||||
endef
|
||||
|
||||
define KernelPackage/ath9k
|
||||
$(call KernelPackage/mac80211/Default)
|
||||
TITLE:=Atheros 802.11n PCI wireless cards support
|
||||
URL:=https://wireless.wiki.kernel.org/en/users/drivers/ath9k
|
||||
DEPENDS+= @PCI_SUPPORT||TARGET_ar71xx||TARGET_ath79 +kmod-ath9k-common
|
||||
FILES:= \
|
||||
$(PKG_BUILD_DIR)/drivers/net/wireless/ath/ath9k/ath9k.ko
|
||||
AUTOLOAD:=$(call AutoProbe,ath9k)
|
||||
endef
|
||||
|
||||
define KernelPackage/ath9k/description
|
||||
This module adds support for wireless adapters based on
|
||||
Atheros IEEE 802.11n AR5008 and AR9001 family of chipsets.
|
||||
endef
|
||||
|
||||
define KernelPackage/ath9k/config
|
||||
|
||||
config ATH9K_HWRNG
|
||||
bool "Add wireless noise as source of randomness to kernel entropy pool"
|
||||
depends on PACKAGE_kmod-ath9k
|
||||
select PACKAGE_kmod-random-core
|
||||
default n
|
||||
|
||||
config ATH9K_SUPPORT_PCOEM
|
||||
bool "Support chips used in PC OEM cards"
|
||||
depends on PACKAGE_kmod-ath9k
|
||||
|
||||
config ATH9K_TX99
|
||||
bool "Enable TX99 support (WARNING: testing only, breaks normal operation!)"
|
||||
depends on PACKAGE_kmod-ath9k
|
||||
|
||||
config ATH9K_UBNTHSR
|
||||
bool "Support for Ubiquiti UniFi Outdoor+ access point"
|
||||
depends on PACKAGE_kmod-ath9k && (TARGET_ar71xx_generic||TARGET_ath79)
|
||||
default y
|
||||
|
||||
endef
|
||||
|
||||
define KernelPackage/ath9k-htc
|
||||
$(call KernelPackage/mac80211/Default)
|
||||
TITLE:=Atheros 802.11n USB device support
|
||||
URL:=https://wireless.wiki.kernel.org/en/users/drivers/ath9k
|
||||
DEPENDS+= @USB_SUPPORT +kmod-ath9k-common +kmod-usb-core +ath9k-htc-firmware
|
||||
FILES:= \
|
||||
$(PKG_BUILD_DIR)/drivers/net/wireless/ath/ath9k/ath9k_htc.ko
|
||||
AUTOLOAD:=$(call AutoProbe,ath9k_htc)
|
||||
endef
|
||||
|
||||
define KernelPackage/ath9k-htc/description
|
||||
This module adds support for wireless adapters based on
|
||||
Atheros USB AR9271 and AR7010 family of chipsets.
|
||||
endef
|
||||
|
||||
define KernelPackage/ath10k
|
||||
$(call KernelPackage/mac80211/Default)
|
||||
TITLE:=Atheros 802.11ac wireless cards support
|
||||
URL:=https://wireless.wiki.kernel.org/en/users/drivers/ath10k
|
||||
DEPENDS+= @PCI_SUPPORT +kmod-ath +@DRIVER_11N_SUPPORT +@DRIVER_11AC_SUPPORT +@DRIVER_11W_SUPPORT \
|
||||
+ATH10K_THERMAL:kmod-hwmon-core +ATH10K_THERMAL:kmod-thermal
|
||||
FILES:= \
|
||||
$(PKG_BUILD_DIR)/drivers/net/wireless/ath/ath10k/ath10k_core.ko \
|
||||
$(PKG_BUILD_DIR)/drivers/net/wireless/ath/ath10k/ath10k_pci.ko
|
||||
AUTOLOAD:=$(call AutoProbe,ath10k_pci)
|
||||
endef
|
||||
|
||||
define KernelPackage/ath10k/description
|
||||
This module adds support for wireless adapters based on
|
||||
Atheros IEEE 802.11ac family of chipsets. For now only
|
||||
PCI is supported.
|
||||
endef
|
||||
|
||||
define KernelPackage/ath10k/config
|
||||
|
||||
config ATH10K_LEDS
|
||||
bool "Enable LED support"
|
||||
default y
|
||||
depends on PACKAGE_kmod-ath10k
|
||||
|
||||
config ATH10K_THERMAL
|
||||
bool "Enable thermal sensors and throttling support"
|
||||
depends on PACKAGE_kmod-ath10k
|
||||
|
||||
endef
|
||||
|
||||
define KernelPackage/carl9170
|
||||
$(call KernelPackage/mac80211/Default)
|
||||
TITLE:=Driver for Atheros AR9170 USB sticks
|
||||
DEPENDS:=@USB_SUPPORT +kmod-mac80211 +kmod-ath +kmod-usb-core +kmod-input-core +@DRIVER_11N_SUPPORT +@DRIVER_11W_SUPPORT +carl9170-firmware
|
||||
FILES:=$(PKG_BUILD_DIR)/drivers/net/wireless/ath/carl9170/carl9170.ko
|
||||
AUTOLOAD:=$(call AutoProbe,carl9170)
|
||||
endef
|
||||
|
||||
define KernelPackage/owl-loader
|
||||
$(call KernelPackage/mac80211/Default)
|
||||
TITLE:=Owl loader for initializing Atheros PCI(e) Wifi chips
|
||||
DEPENDS:=@PCI_SUPPORT +kmod-ath9k
|
||||
FILES:=$(PKG_BUILD_DIR)/drivers/net/wireless/ath/ath9k/ath9k_pci_owl_loader.ko
|
||||
AUTOLOAD:=$(call AutoProbe,ath9k_pci_owl_loader)
|
||||
endef
|
||||
|
||||
define KernelPackage/owl-loader/description
|
||||
Kernel module that helps to initialize certain Qualcomm
|
||||
Atheros' PCI(e) Wifi chips, which have the init data
|
||||
(which contains the PCI device ID for example) stored
|
||||
together with the calibration data in the file system.
|
||||
|
||||
This is necessary for devices like the Cisco Meraki Z1.
|
||||
endef
|
||||
510
mac80211/broadcom.mk
Normal file
510
mac80211/broadcom.mk
Normal file
@@ -0,0 +1,510 @@
|
||||
PKG_DRIVERS += \
|
||||
b43 b43legacy brcmsmac brcmfmac brcmutil
|
||||
|
||||
PKG_CONFIG_DEPENDS += \
|
||||
CONFIG_PACKAGE_B43_DEBUG \
|
||||
CONFIG_PACKAGE_B43_PIO \
|
||||
CONFIG_PACKAGE_B43_PHY_G \
|
||||
CONFIG_PACKAGE_B43_PHY_N \
|
||||
CONFIG_PACKAGE_B43_PHY_LP \
|
||||
CONFIG_PACKAGE_B43_PHY_HT \
|
||||
CONFIG_PACKAGE_B43_BUSES_BCMA_AND_SSB \
|
||||
CONFIG_PACKAGE_B43_BUSES_BCMA \
|
||||
CONFIG_PACKAGE_B43_BUSES_SSB \
|
||||
CONFIG_PACKAGE_BRCM80211_DEBUG
|
||||
|
||||
config-$(call config_package,b43) += B43
|
||||
config-$(CONFIG_PACKAGE_B43_BUSES_BCMA_AND_SSB) += B43_BUSES_BCMA_AND_SSB
|
||||
config-$(CONFIG_PACKAGE_B43_BUSES_BCMA) += B43_BUSES_BCMA
|
||||
config-$(CONFIG_PACKAGE_B43_BUSES_SSB) += B43_BUSES_SSB
|
||||
config-$(CONFIG_PACKAGE_B43_PHY_G) += B43_PHY_G
|
||||
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
|
||||
config-$(CONFIG_BRCMFMAC_SDIO) += BRCMFMAC_SDIO
|
||||
config-$(CONFIG_BRCMFMAC_USB) += BRCMFMAC_USB
|
||||
config-$(CONFIG_BRCMFMAC_PCIE) += BRCMFMAC_PCIE
|
||||
config-$(CONFIG_PACKAGE_BRCM80211_DEBUG) += BRCMDBG
|
||||
|
||||
config-$(CONFIG_LEDS_TRIGGERS) += B43_LEDS B43LEGACY_LEDS
|
||||
|
||||
#Broadcom firmware
|
||||
ifneq ($(CONFIG_B43_FW_6_30),)
|
||||
PKG_B43_FWV4_NAME:=broadcom-wl
|
||||
PKG_B43_FWV4_VERSION:=6.30.163.46
|
||||
PKG_B43_FWV4_OBJECT:=$(PKG_B43_FWV4_NAME)-$(PKG_B43_FWV4_VERSION).wl_apsta.o
|
||||
PKG_B43_FWV4_SOURCE:=$(PKG_B43_FWV4_NAME)-$(PKG_B43_FWV4_VERSION).tar.bz2
|
||||
PKG_B43_FWV4_SOURCE_URL:=http://www.lwfinger.com/b43-firmware/
|
||||
PKG_B43_FWV4_HASH:=a07c3b6b277833c7dbe61daa511f908cd66c5e2763eb7a0859abc36cd9335c2d
|
||||
else
|
||||
ifneq ($(CONFIG_B43_FW_5_10),)
|
||||
PKG_B43_FWV4_NAME:=broadcom-wl
|
||||
PKG_B43_FWV4_VERSION:=5.10.56.27.3
|
||||
PKG_B43_FWV4_OBJECT:=$(PKG_B43_FWV4_NAME)-$(PKG_B43_FWV4_VERSION)/driver/wl_apsta/wl_prebuilt.o
|
||||
PKG_B43_FWV4_SOURCE:=$(PKG_B43_FWV4_NAME)-$(PKG_B43_FWV4_VERSION)_mipsel.tar.bz2
|
||||
PKG_B43_FWV4_SOURCE_URL:=http://mirror2.openwrt.org/sources/
|
||||
PKG_B43_FWV4_HASH:=26a8c370f48fc129d0731cfd751c36cae1419b0bc8ca35781126744e60eae009
|
||||
else
|
||||
ifneq ($(CONFIG_B43_FW_4_178),)
|
||||
PKG_B43_FWV4_NAME:=broadcom-wl
|
||||
PKG_B43_FWV4_VERSION:=4.178.10.4
|
||||
PKG_B43_FWV4_OBJECT:=$(PKG_B43_FWV4_NAME)-$(PKG_B43_FWV4_VERSION)/linux/wl_apsta.o
|
||||
PKG_B43_FWV4_SOURCE:=$(PKG_B43_FWV4_NAME)-$(PKG_B43_FWV4_VERSION).tar.bz2
|
||||
PKG_B43_FWV4_SOURCE_URL:=http://mirror2.openwrt.org/sources/
|
||||
PKG_B43_FWV4_HASH:=32f6ad98facbb9045646fdc8b54bb03086d204153253f9c65d0234a5d90ae53f
|
||||
else
|
||||
ifneq ($(CONFIG_B43_FW_5_100_138),)
|
||||
PKG_B43_FWV4_NAME:=broadcom-wl
|
||||
PKG_B43_FWV4_VERSION:=5.100.138
|
||||
PKG_B43_FWV4_OBJECT:=$(PKG_B43_FWV4_NAME)-$(PKG_B43_FWV4_VERSION)/linux/wl_apsta.o
|
||||
PKG_B43_FWV4_SOURCE:=$(PKG_B43_FWV4_NAME)-$(PKG_B43_FWV4_VERSION).tar.bz2
|
||||
PKG_B43_FWV4_SOURCE_URL:=http://www.lwfinger.com/b43-firmware/
|
||||
PKG_B43_FWV4_HASH:=f1e7067aac5b62b67b8b6e4c517990277804339ac16065eb13c731ff909ae46f
|
||||
else
|
||||
PKG_B43_FWV4_NAME:=broadcom-wl
|
||||
PKG_B43_FWV4_VERSION:=4.150.10.5
|
||||
PKG_B43_FWV4_OBJECT:=$(PKG_B43_FWV4_NAME)-$(PKG_B43_FWV4_VERSION)/driver/wl_apsta_mimo.o
|
||||
PKG_B43_FWV4_SOURCE:=$(PKG_B43_FWV4_NAME)-$(PKG_B43_FWV4_VERSION).tar.bz2
|
||||
PKG_B43_FWV4_SOURCE_URL:=http://mirror2.openwrt.org/sources/
|
||||
PKG_B43_FWV4_HASH:=a9f4e276a4d8d3a1cd0f2eb87080ae89b77f0a7140f06d4e9e2135fc44fdd533
|
||||
endif
|
||||
endif
|
||||
endif
|
||||
endif
|
||||
ifneq ($(CONFIG_B43_OPENFIRMWARE),)
|
||||
PKG_B43_FWV4_NAME:=broadcom-wl
|
||||
PKG_B43_FWV4_VERSION:=5.2
|
||||
PKG_B43_FWV4_OBJECT:=openfwwf-$(PKG_B43_FWV4_VERSION)
|
||||
PKG_B43_FWV4_SOURCE:=openfwwf-$(PKG_B43_FWV4_VERSION).tar.gz
|
||||
PKG_B43_FWV4_SOURCE_URL:=http://netweb.ing.unibs.it/~openfwwf/firmware
|
||||
PKG_B43_FWV4_HASH:=9de03320083201080b2e94b81637ac07a159cf4e6f3481383e1a217e627bc0dc
|
||||
endif
|
||||
|
||||
|
||||
define Download/b43
|
||||
FILE:=$(PKG_B43_FWV4_SOURCE)
|
||||
URL:=$(PKG_B43_FWV4_SOURCE_URL)
|
||||
HASH:=$(PKG_B43_FWV4_HASH)
|
||||
endef
|
||||
$(eval $(call Download,b43))
|
||||
|
||||
define KernelPackage/b43
|
||||
$(call KernelPackage/mac80211/Default)
|
||||
TITLE:=Broadcom 43xx wireless support
|
||||
URL:=https://wireless.wiki.kernel.org/en/users/drivers/b43
|
||||
KCONFIG:= \
|
||||
CONFIG_HW_RANDOM=y
|
||||
# Depend on PCI_SUPPORT to make sure we can select kmod-bcma or kmod-ssb
|
||||
DEPENDS += \
|
||||
@PCI_SUPPORT +@DRIVER_11W_SUPPORT +kmod-mac80211 +kmod-lib-cordic \
|
||||
$(if $(CONFIG_PACKAGE_B43_USE_SSB),+kmod-ssb) \
|
||||
$(if $(CONFIG_PACKAGE_B43_USE_BCMA),+kmod-bcma)
|
||||
FILES:=$(PKG_BUILD_DIR)/drivers/net/wireless/broadcom/b43/b43.ko
|
||||
AUTOLOAD:=$(call AutoProbe,b43)
|
||||
MENU:=1
|
||||
endef
|
||||
|
||||
define KernelPackage/b43/config
|
||||
|
||||
config PACKAGE_B43_USE_SSB
|
||||
select PACKAGE_kmod-ssb
|
||||
tristate
|
||||
depends on !TARGET_bcm47xx && !TARGET_bcm63xx
|
||||
default PACKAGE_kmod-b43 if PACKAGE_B43_BUSES_BCMA_AND_SSB
|
||||
default PACKAGE_kmod-b43 if PACKAGE_B43_BUSES_SSB
|
||||
|
||||
config PACKAGE_B43_USE_BCMA
|
||||
select PACKAGE_kmod-bcma
|
||||
tristate
|
||||
depends on !TARGET_bcm47xx && !TARGET_bcm53xx
|
||||
default PACKAGE_kmod-b43 if PACKAGE_B43_BUSES_BCMA_AND_SSB
|
||||
default PACKAGE_kmod-b43 if PACKAGE_B43_BUSES_BCMA
|
||||
|
||||
if PACKAGE_kmod-b43
|
||||
|
||||
choice
|
||||
prompt "b43 firmware version"
|
||||
default B43_FW_5_100_138
|
||||
help
|
||||
This option allows you to select the version of the b43 firmware.
|
||||
|
||||
config B43_FW_4_150
|
||||
bool "Firmware 410.2160 from driver 4.150.10.5 (old stable)"
|
||||
help
|
||||
Old stable firmware for BCM43xx devices.
|
||||
|
||||
If unsure, select this.
|
||||
|
||||
config B43_FW_4_178
|
||||
bool "Firmware 478.104 from driver 4.178.10.4"
|
||||
help
|
||||
Older firmware for BCM43xx devices.
|
||||
|
||||
If unsure, select the "stable" firmware.
|
||||
|
||||
config B43_FW_5_10
|
||||
bool "Firmware 508.1084 from driver 5.10.56.27"
|
||||
help
|
||||
Older firmware for BCM43xx devices.
|
||||
|
||||
If unsure, select the "stable" firmware.
|
||||
|
||||
config B43_FW_5_100_138
|
||||
bool "Firmware 666.2 from driver 5.100.138 (stable)"
|
||||
help
|
||||
The currently default firmware for BCM43xx devices.
|
||||
|
||||
This firmware currently gets most of the testing and is needed for some N-PHY devices.
|
||||
|
||||
If unsure, select the this firmware.
|
||||
|
||||
config B43_FW_6_30
|
||||
bool "Firmware 784.2 from driver 6.30.163.46 (experimental)"
|
||||
help
|
||||
Newer experimental firmware for BCM43xx devices.
|
||||
|
||||
This firmware is mostly untested.
|
||||
|
||||
If unsure, select the "stable" firmware.
|
||||
|
||||
config B43_OPENFIRMWARE
|
||||
bool "Open FirmWare for WiFi networks"
|
||||
help
|
||||
Opensource firmware for BCM43xx devices.
|
||||
|
||||
Do _not_ select this, unless you know what you are doing.
|
||||
The Opensource firmware is not suitable for embedded devices, yet.
|
||||
It does not support QoS, which is bad for AccessPoints.
|
||||
It does not support hardware crypto acceleration, which is a showstopper
|
||||
for embedded devices with low CPU resources.
|
||||
|
||||
If unsure, select the "stable" firmware.
|
||||
|
||||
endchoice
|
||||
|
||||
config B43_FW_SQUASH
|
||||
bool "Remove unnecessary firmware files"
|
||||
depends on !B43_OPENFIRMWARE
|
||||
default y
|
||||
help
|
||||
This options allows you to remove unnecessary b43 firmware files
|
||||
from the final rootfs image. This can reduce the rootfs size by
|
||||
up to 200k.
|
||||
|
||||
If unsure, say Y.
|
||||
|
||||
config B43_FW_SQUASH_COREREVS
|
||||
string "Core revisions to include"
|
||||
depends on B43_FW_SQUASH
|
||||
default "5,6,7,8,9,10,11,13,15" if TARGET_bcm47xx_legacy
|
||||
default "16,28,29,30" if TARGET_bcm47xx_mips74k
|
||||
default "5,6,7,8,9,10,11,13,15,16,28,29,30"
|
||||
help
|
||||
This is a comma seperated list of core revision numbers.
|
||||
|
||||
Example (keep files for rev5 only):
|
||||
5
|
||||
|
||||
Example (keep files for rev5 and rev11):
|
||||
5,11
|
||||
|
||||
config B43_FW_SQUASH_PHYTYPES
|
||||
string "PHY types to include"
|
||||
depends on B43_FW_SQUASH
|
||||
default "G,N,LP" if TARGET_bcm47xx_legacy
|
||||
default "N,HT" if TARGET_bcm47xx_mips74k
|
||||
default "G,N,LP,HT"
|
||||
help
|
||||
This is a comma seperated list of PHY types:
|
||||
A => A-PHY
|
||||
AG => Dual A-PHY G-PHY
|
||||
G => G-PHY
|
||||
LP => LP-PHY
|
||||
N => N-PHY
|
||||
HT => HT-PHY
|
||||
LCN => LCN-PHY
|
||||
LCN40 => LCN40-PHY
|
||||
AC => AC-PHY
|
||||
|
||||
Example (keep files for G-PHY only):
|
||||
G
|
||||
|
||||
Example (keep files for G-PHY and N-PHY):
|
||||
G,N
|
||||
|
||||
choice
|
||||
prompt "Supported buses"
|
||||
default PACKAGE_B43_BUSES_BCMA_AND_SSB
|
||||
help
|
||||
This allows choosing buses that b43 should support.
|
||||
|
||||
config PACKAGE_B43_BUSES_BCMA_AND_SSB
|
||||
depends on !TARGET_bcm47xx_legacy && !TARGET_bcm47xx_mips74k && !TARGET_bcm53xx
|
||||
bool "BCMA and SSB"
|
||||
|
||||
config PACKAGE_B43_BUSES_BCMA
|
||||
depends on !TARGET_bcm47xx_legacy
|
||||
bool "BCMA only"
|
||||
|
||||
config PACKAGE_B43_BUSES_SSB
|
||||
depends on !TARGET_bcm47xx_mips74k && !TARGET_bcm53xx
|
||||
bool "SSB only"
|
||||
|
||||
endchoice
|
||||
|
||||
config PACKAGE_B43_DEBUG
|
||||
bool "Enable debug output and debugfs for b43"
|
||||
default n
|
||||
help
|
||||
Enable additional debug output and runtime sanity checks for b43
|
||||
and enables the debugfs interface.
|
||||
|
||||
If unsure, say N.
|
||||
|
||||
config PACKAGE_B43_PIO
|
||||
bool "Enable support for PIO transfer mode"
|
||||
default n
|
||||
help
|
||||
Enable support for using PIO instead of DMA. Unless you have DMA
|
||||
transfer problems you don't need this.
|
||||
|
||||
If unsure, say N.
|
||||
|
||||
config PACKAGE_B43_PHY_G
|
||||
bool "Enable support for G-PHYs"
|
||||
default n if TARGET_bcm47xx_mips74k
|
||||
default y
|
||||
help
|
||||
Enable support for G-PHY. This includes support for the following devices:
|
||||
PCI: BCM4306, BCM4311, BCM4318
|
||||
SoC: BCM5352E, BCM4712
|
||||
|
||||
If unsure, say Y.
|
||||
|
||||
config PACKAGE_B43_PHY_N
|
||||
bool "Enable support for N-PHYs"
|
||||
default y
|
||||
help
|
||||
Enable support for N-PHY. This includes support for the following devices:
|
||||
PCI: BCM4321, BCM4322, BCM43222, BCM43224, BCM43225
|
||||
SoC: BCM4716, BCM4717, BCM4718
|
||||
|
||||
Currently only 11g speed is available.
|
||||
|
||||
If unsure, say Y.
|
||||
|
||||
config PACKAGE_B43_PHY_LP
|
||||
bool "Enable support for LP-PHYs"
|
||||
default n if TARGET_bcm47xx_mips74k
|
||||
default y
|
||||
help
|
||||
Enable support for LP-PHY. This includes support for the following devices:
|
||||
PCI: BCM4312
|
||||
SoC: BCM5354
|
||||
|
||||
If unsure, say Y.
|
||||
|
||||
config PACKAGE_B43_PHY_HT
|
||||
bool "Enable support for HT-PHYs"
|
||||
default n if TARGET_bcm47xx_legacy
|
||||
default y
|
||||
help
|
||||
Enable support for HT-PHY. This includes support for the following devices:
|
||||
PCI: BCM4331
|
||||
|
||||
Currently only 11g speed is available.
|
||||
|
||||
If unsure, say Y.
|
||||
|
||||
config PACKAGE_B43_PHY_LCN
|
||||
bool "Enable support for LCN-PHYs"
|
||||
depends on BROKEN
|
||||
default n
|
||||
help
|
||||
Currently broken.
|
||||
|
||||
If unsure, say N.
|
||||
|
||||
endif
|
||||
endef
|
||||
|
||||
define KernelPackage/b43/description
|
||||
Kernel module for Broadcom 43xx wireless support (mac80211 stack) new
|
||||
endef
|
||||
|
||||
define KernelPackage/b43legacy
|
||||
$(call KernelPackage/mac80211/Default)
|
||||
TITLE:=Broadcom 43xx-legacy wireless support
|
||||
URL:=https://wireless.wiki.kernel.org/en/users/drivers/b43
|
||||
KCONFIG:= \
|
||||
CONFIG_HW_RANDOM=y
|
||||
DEPENDS+= +kmod-mac80211 +!(TARGET_bcm47xx||TARGET_bcm63xx):kmod-ssb @!TARGET_bcm47xx_mips74k +b43legacy-firmware +@DRIVER_11W_SUPPORT
|
||||
FILES:=$(PKG_BUILD_DIR)/drivers/net/wireless/broadcom/b43legacy/b43legacy.ko
|
||||
AUTOLOAD:=$(call AutoProbe,b43legacy)
|
||||
MENU:=1
|
||||
endef
|
||||
|
||||
define KernelPackage/b43legacy/description
|
||||
Kernel module for Broadcom 43xx-legacy wireless support (mac80211 stack) new
|
||||
endef
|
||||
|
||||
|
||||
define KernelPackage/brcmutil
|
||||
$(call KernelPackage/mac80211/Default)
|
||||
TITLE:=Broadcom IEEE802.11n common driver parts
|
||||
URL:=https://wireless.wiki.kernel.org/en/users/drivers/brcm80211
|
||||
DEPENDS+=@PCI_SUPPORT||USB_SUPPORT
|
||||
FILES:=$(PKG_BUILD_DIR)/drivers/net/wireless/broadcom/brcm80211/brcmutil/brcmutil.ko
|
||||
AUTOLOAD:=$(call AutoProbe,brcmutil)
|
||||
MENU:=1
|
||||
endef
|
||||
|
||||
define KernelPackage/brcmutil/description
|
||||
This module contains some common parts needed by Broadcom Wireless drivers brcmsmac and brcmfmac.
|
||||
endef
|
||||
|
||||
define KernelPackage/brcmutil/config
|
||||
if PACKAGE_kmod-brcmutil
|
||||
|
||||
config PACKAGE_BRCM80211_DEBUG
|
||||
bool "Broadcom wireless driver debugging"
|
||||
help
|
||||
Say Y, if you want to debug brcmsmac and brcmfmac wireless driver.
|
||||
|
||||
endif
|
||||
endef
|
||||
|
||||
PKG_BRCMSMAC_FW_NAME:=broadcom-wl
|
||||
PKG_BRCMSMAC_FW_VERSION:=5.100.138
|
||||
PKG_BRCMSMAC_FW_OBJECT:=$(PKG_BRCMSMAC_FW_NAME)-$(PKG_BRCMSMAC_FW_VERSION)/linux/wl_apsta.o
|
||||
PKG_BRCMSMAC_FW_SOURCE:=$(PKG_BRCMSMAC_FW_NAME)-$(PKG_BRCMSMAC_FW_VERSION).tar.bz2
|
||||
PKG_BRCMSMAC_FW_SOURCE_URL:=http://www.lwfinger.com/b43-firmware/
|
||||
PKG_BRCMSMAC_FW_HASH:=f1e7067aac5b62b67b8b6e4c517990277804339ac16065eb13c731ff909ae46f
|
||||
|
||||
define Download/brcmsmac
|
||||
FILE:=$(PKG_BRCMSMAC_FW_SOURCE)
|
||||
URL:=$(PKG_BRCMSMAC_FW_SOURCE_URL)
|
||||
HASH:=$(PKG_BRCMSMAC_FW_HASH)
|
||||
endef
|
||||
$(eval $(call Download,brcmsmac))
|
||||
|
||||
define KernelPackage/brcmsmac
|
||||
$(call KernelPackage/mac80211/Default)
|
||||
TITLE:=Broadcom IEEE802.11n PCIe SoftMAC WLAN driver
|
||||
URL:=https://wireless.wiki.kernel.org/en/users/drivers/brcm80211
|
||||
DEPENDS+= +kmod-mac80211 +@DRIVER_11N_SUPPORT +!TARGET_bcm47xx:kmod-bcma +kmod-lib-cordic +kmod-lib-crc8 +kmod-brcmutil +!BRCMSMAC_USE_FW_FROM_WL:brcmsmac-firmware
|
||||
FILES:=$(PKG_BUILD_DIR)/drivers/net/wireless/broadcom/brcm80211/brcmsmac/brcmsmac.ko
|
||||
AUTOLOAD:=$(call AutoProbe,brcmsmac)
|
||||
MENU:=1
|
||||
endef
|
||||
|
||||
define KernelPackage/brcmsmac/description
|
||||
Kernel module for Broadcom IEEE802.11n PCIe Wireless cards
|
||||
endef
|
||||
|
||||
define KernelPackage/brcmsmac/config
|
||||
if PACKAGE_kmod-brcmsmac
|
||||
|
||||
config BRCMSMAC_USE_FW_FROM_WL
|
||||
bool "Use firmware extracted from broadcom proprietary driver"
|
||||
default y
|
||||
help
|
||||
Instead of using the official brcmsmac firmware a firmware
|
||||
version 666.2 extracted from the proprietary Broadcom driver
|
||||
is used. This is needed to get core rev 17 used in bcm4716
|
||||
to work.
|
||||
|
||||
If unsure, say Y.
|
||||
|
||||
endif
|
||||
endef
|
||||
|
||||
|
||||
define KernelPackage/brcmfmac
|
||||
$(call KernelPackage/mac80211/Default)
|
||||
TITLE:=Broadcom IEEE802.11n USB FullMAC WLAN driver
|
||||
URL:=https://wireless.wiki.kernel.org/en/users/drivers/brcm80211
|
||||
DEPENDS+= @USB_SUPPORT +kmod-cfg80211 +@DRIVER_11N_SUPPORT +@DRIVER_11AC_SUPPORT +@DRIVER_11W_SUPPORT \
|
||||
+kmod-brcmutil +BRCMFMAC_SDIO:kmod-mmc @!TARGET_uml \
|
||||
+BRCMFMAC_USB:kmod-usb-core +BRCMFMAC_USB:brcmfmac-firmware-usb
|
||||
FILES:=$(PKG_BUILD_DIR)/drivers/net/wireless/broadcom/brcm80211/brcmfmac/brcmfmac.ko
|
||||
AUTOLOAD:=$(call AutoProbe,brcmfmac)
|
||||
endef
|
||||
|
||||
define KernelPackage/brcmfmac/description
|
||||
Kernel module for Broadcom IEEE802.11n USB Wireless cards
|
||||
endef
|
||||
|
||||
define KernelPackage/brcmfmac/config
|
||||
if PACKAGE_kmod-brcmfmac
|
||||
|
||||
config BRCMFMAC_SDIO
|
||||
bool "Enable SDIO bus interface support"
|
||||
default y if TARGET_bcm27xx
|
||||
default y if TARGET_sunxi
|
||||
default n
|
||||
help
|
||||
Enable support for cards attached to an SDIO bus.
|
||||
Select this option only if you are sure that your
|
||||
board has a Broadcom wireless chip atacched to
|
||||
that bus.
|
||||
|
||||
config BRCMFMAC_USB
|
||||
bool "Enable USB bus interface support"
|
||||
depends on USB_SUPPORT
|
||||
default y
|
||||
help
|
||||
Supported USB connected chipsets:
|
||||
BCM43235, BCM43236, BCM43238 (all in revision 3 only)
|
||||
BCM43143, BCM43242, BCM43566, BCM43569
|
||||
|
||||
config BRCMFMAC_PCIE
|
||||
bool "Enable PCIE bus interface support"
|
||||
depends on PCI_SUPPORT
|
||||
default y
|
||||
help
|
||||
Supported PCIe connected chipsets:
|
||||
BCM4354, BCM4356, BCM43567, BCM43570, BCM43602
|
||||
|
||||
endif
|
||||
endef
|
||||
|
||||
|
||||
define KernelPackage/b43/install
|
||||
rm -rf $(1)/lib/firmware/
|
||||
ifeq ($(CONFIG_B43_OPENFIRMWARE),y)
|
||||
tar xzf "$(DL_DIR)/$(PKG_B43_FWV4_SOURCE)" -C "$(PKG_BUILD_DIR)"
|
||||
else
|
||||
tar xjf "$(DL_DIR)/$(PKG_B43_FWV4_SOURCE)" -C "$(PKG_BUILD_DIR)"
|
||||
endif
|
||||
$(INSTALL_DIR) $(1)/lib/firmware/
|
||||
ifeq ($(CONFIG_B43_OPENFIRMWARE),y)
|
||||
$(MAKE) -C "$(PKG_BUILD_DIR)/$(PKG_B43_FWV4_OBJECT)/"
|
||||
$(INSTALL_DIR) $(1)/lib/firmware/b43-open/
|
||||
$(INSTALL_DATA) $(PKG_BUILD_DIR)/$(PKG_B43_FWV4_OBJECT)/ucode5.fw $(1)/lib/firmware/b43-open/ucode5.fw
|
||||
$(INSTALL_DATA) $(PKG_BUILD_DIR)/$(PKG_B43_FWV4_OBJECT)/b0g0bsinitvals5.fw $(1)/lib/firmware/b43-open/b0g0bsinitvals5.fw
|
||||
$(INSTALL_DATA) $(PKG_BUILD_DIR)/$(PKG_B43_FWV4_OBJECT)/b0g0initvals5.fw $(1)/lib/firmware/b43-open/b0g0initvals5.fw
|
||||
else
|
||||
b43-fwcutter -w $(1)/lib/firmware/ $(PKG_BUILD_DIR)/$(PKG_B43_FWV4_OBJECT)
|
||||
endif
|
||||
ifneq ($(CONFIG_B43_FW_SQUASH),)
|
||||
b43-fwsquash.py "$(CONFIG_B43_FW_SQUASH_PHYTYPES)" "$(CONFIG_B43_FW_SQUASH_COREREVS)" "$(1)/lib/firmware/b43"
|
||||
endif
|
||||
endef
|
||||
|
||||
define KernelPackage/brcmsmac/install
|
||||
$(INSTALL_DIR) $(1)/lib/firmware/brcm
|
||||
ifeq ($(CONFIG_BRCMSMAC_USE_FW_FROM_WL),y)
|
||||
tar xjf "$(DL_DIR)/$(PKG_BRCMSMAC_FW_SOURCE)" -C "$(PKG_BUILD_DIR)"
|
||||
b43-fwcutter --brcmsmac -w $(1)/lib/firmware/ $(PKG_BUILD_DIR)/$(PKG_BRCMSMAC_FW_OBJECT)
|
||||
endif
|
||||
endef
|
||||
1127
mac80211/files/lib/netifd/wireless/mac80211.sh
Normal file
1127
mac80211/files/lib/netifd/wireless/mac80211.sh
Normal file
File diff suppressed because it is too large
Load Diff
195
mac80211/files/lib/wifi/mac80211.sh
Normal file
195
mac80211/files/lib/wifi/mac80211.sh
Normal file
@@ -0,0 +1,195 @@
|
||||
#!/bin/sh
|
||||
|
||||
append DRIVERS "mac80211"
|
||||
|
||||
lookup_phy() {
|
||||
[ -n "$phy" ] && {
|
||||
[ -d /sys/class/ieee80211/$phy ] && return
|
||||
}
|
||||
|
||||
local devpath
|
||||
config_get devpath "$device" path
|
||||
[ -n "$devpath" ] && {
|
||||
phy="$(iwinfo nl80211 phyname "path=$devpath")"
|
||||
[ -n "$phy" ] && return
|
||||
}
|
||||
|
||||
local macaddr="$(config_get "$device" macaddr | tr 'A-Z' 'a-z')"
|
||||
[ -n "$macaddr" ] && {
|
||||
for _phy in /sys/class/ieee80211/*; do
|
||||
[ -e "$_phy" ] || continue
|
||||
|
||||
[ "$macaddr" = "$(cat ${_phy}/macaddress)" ] || continue
|
||||
phy="${_phy##*/}"
|
||||
return
|
||||
done
|
||||
}
|
||||
phy=
|
||||
return
|
||||
}
|
||||
|
||||
find_mac80211_phy() {
|
||||
local device="$1"
|
||||
|
||||
config_get phy "$device" phy
|
||||
lookup_phy
|
||||
[ -n "$phy" -a -d "/sys/class/ieee80211/$phy" ] || {
|
||||
echo "PHY for wifi device $1 not found"
|
||||
return 1
|
||||
}
|
||||
config_set "$device" phy "$phy"
|
||||
|
||||
config_get macaddr "$device" macaddr
|
||||
[ -z "$macaddr" ] && {
|
||||
config_set "$device" macaddr "$(cat /sys/class/ieee80211/${phy}/macaddress)"
|
||||
}
|
||||
|
||||
return 0
|
||||
}
|
||||
|
||||
check_mac80211_device() {
|
||||
config_get phy "$1" phy
|
||||
[ -z "$phy" ] && {
|
||||
find_mac80211_phy "$1" >/dev/null || return 0
|
||||
config_get phy "$1" phy
|
||||
}
|
||||
[ "$phy" = "$dev" ] && found=1
|
||||
}
|
||||
|
||||
|
||||
__get_band_defaults() {
|
||||
local phy="$1"
|
||||
|
||||
( iw phy "$phy" info; echo ) | awk '
|
||||
BEGIN {
|
||||
bands = ""
|
||||
}
|
||||
|
||||
($1 == "Band" || $1 == "") && band {
|
||||
if (channel) {
|
||||
mode="NOHT"
|
||||
if (ht) mode="HT20"
|
||||
if (vht && band != "1:") mode="VHT80"
|
||||
if (he) mode="HE80"
|
||||
if (he && band == "1:") mode="HE20"
|
||||
sub("\\[", "", channel)
|
||||
sub("\\]", "", channel)
|
||||
bands = bands band channel ":" mode " "
|
||||
}
|
||||
band=""
|
||||
}
|
||||
|
||||
$1 == "Band" {
|
||||
band = $2
|
||||
channel = ""
|
||||
vht = ""
|
||||
ht = ""
|
||||
he = ""
|
||||
}
|
||||
|
||||
$0 ~ "Capabilities:" {
|
||||
ht=1
|
||||
}
|
||||
|
||||
$0 ~ "VHT Capabilities" {
|
||||
vht=1
|
||||
}
|
||||
|
||||
$0 ~ "HE Iftypes" {
|
||||
he=1
|
||||
}
|
||||
|
||||
$1 == "*" && $3 == "MHz" && $0 !~ /disabled/ && band && !channel {
|
||||
channel = $4
|
||||
}
|
||||
|
||||
END {
|
||||
print bands
|
||||
}'
|
||||
}
|
||||
|
||||
get_band_defaults() {
|
||||
local phy="$1"
|
||||
|
||||
for c in $(__get_band_defaults "$phy"); do
|
||||
local band="${c%%:*}"
|
||||
c="${c#*:}"
|
||||
local chan="${c%%:*}"
|
||||
c="${c#*:}"
|
||||
local mode="${c%%:*}"
|
||||
|
||||
case "$band" in
|
||||
1) band=2g;;
|
||||
2) band=5g;;
|
||||
3) band=60g;;
|
||||
4) band=6g;;
|
||||
*) band="";;
|
||||
esac
|
||||
|
||||
[ -n "$band" ] || continue
|
||||
[ -n "$mode_band" -a "$band" = "6g" ] && return
|
||||
|
||||
mode_band="$band"
|
||||
channel="$chan"
|
||||
htmode="$mode"
|
||||
done
|
||||
}
|
||||
|
||||
detect_mac80211() {
|
||||
devidx=0
|
||||
config_load wireless
|
||||
while :; do
|
||||
config_get type "radio$devidx" type
|
||||
[ -n "$type" ] || break
|
||||
devidx=$(($devidx + 1))
|
||||
done
|
||||
|
||||
for _dev in /sys/class/ieee80211/*; do
|
||||
[ -e "$_dev" ] || continue
|
||||
|
||||
dev="${_dev##*/}"
|
||||
|
||||
found=0
|
||||
config_foreach check_mac80211_device wifi-device
|
||||
[ "$found" -gt 0 ] && continue
|
||||
|
||||
mode_band=""
|
||||
channel=""
|
||||
htmode=""
|
||||
ht_capab=""
|
||||
scanning=""
|
||||
|
||||
get_band_defaults "$dev"
|
||||
|
||||
path="$(iwinfo nl80211 path "$dev")"
|
||||
if [ -n "$path" ]; then
|
||||
dev_id="set wireless.radio${devidx}.path='$path'"
|
||||
if [ "$(cat /etc/board.json | jsonfilter -e "@.wifi['$path'].scanning")" == "true" ]; then
|
||||
scanning="set wireless.radio${devidx}.scanning=1"
|
||||
fi
|
||||
else
|
||||
dev_id="set wireless.radio${devidx}.macaddr=$(cat /sys/class/ieee80211/${dev}/macaddress)"
|
||||
fi
|
||||
|
||||
uci -q batch <<-EOF
|
||||
set wireless.radio${devidx}=wifi-device
|
||||
set wireless.radio${devidx}.type=mac80211
|
||||
${dev_id}
|
||||
set wireless.radio${devidx}.channel=${channel}
|
||||
set wireless.radio${devidx}.band=${mode_band}
|
||||
set wireless.radio${devidx}.htmode=$htmode
|
||||
${scanning}
|
||||
set wireless.radio${devidx}.disabled=1
|
||||
|
||||
set wireless.default_radio${devidx}=wifi-iface
|
||||
set wireless.default_radio${devidx}.device=radio${devidx}
|
||||
set wireless.default_radio${devidx}.network=lan
|
||||
set wireless.default_radio${devidx}.mode=ap
|
||||
set wireless.default_radio${devidx}.ssid=OpenWrt
|
||||
set wireless.default_radio${devidx}.encryption=none
|
||||
EOF
|
||||
uci -q commit wireless
|
||||
|
||||
devidx=$(($devidx + 1))
|
||||
done
|
||||
}
|
||||
5
mac80211/files/mac80211.hotplug
Normal file
5
mac80211/files/mac80211.hotplug
Normal file
@@ -0,0 +1,5 @@
|
||||
#!/bin/sh
|
||||
|
||||
[ "${ACTION}" = "add" ] && {
|
||||
/sbin/wifi config
|
||||
}
|
||||
200
mac80211/intel.mk
Normal file
200
mac80211/intel.mk
Normal file
@@ -0,0 +1,200 @@
|
||||
PKG_DRIVERS += \
|
||||
iwl-legacy iwl3945 iwl4965 iwlwifi \
|
||||
libipw ipw2100 ipw2200 \
|
||||
|
||||
config-$(call config_package,iwl-legacy) += IWLEGACY
|
||||
config-$(call config_package,iwl3945) += IWL3945
|
||||
config-$(call config_package,iwl4965) += IWL4965
|
||||
config-$(call config_package,iwlwifi) += IWLWIFI IWLDVM IWLMVM
|
||||
config-$(CONFIG_PACKAGE_IWLWIFI_DEBUG)+= IWLWIFI_DEBUG
|
||||
config-$(CONFIG_PACKAGE_IWLWIFI_DEBUGFS)+= IWLWIFI_DEBUGFS
|
||||
|
||||
config-$(call config_package,libipw) += LIBIPW
|
||||
config-$(call config_package,ipw2100) += IPW2100
|
||||
config-$(call config_package,ipw2200) += IPW2200
|
||||
|
||||
define KernelPackage/iwlwifi
|
||||
$(call KernelPackage/mac80211/Default)
|
||||
DEPENDS:= +kmod-mac80211 @PCI_SUPPORT +@DRIVER_11N_SUPPORT +@DRIVER_11AC_SUPPORT +@DRIVER_11W_SUPPORT
|
||||
TITLE:=Intel AGN Wireless support
|
||||
FILES:= \
|
||||
$(PKG_BUILD_DIR)/drivers/net/wireless/intel/iwlwifi/iwlwifi.ko \
|
||||
$(PKG_BUILD_DIR)/drivers/net/wireless/intel/iwlwifi/dvm/iwldvm.ko \
|
||||
$(PKG_BUILD_DIR)/drivers/net/wireless/intel/iwlwifi/mvm/iwlmvm.ko
|
||||
AUTOLOAD:=$(call AutoProbe,iwlwifi iwldvm iwlmvm)
|
||||
MENU:=1
|
||||
endef
|
||||
|
||||
define KernelPackage/iwlwifi/description
|
||||
iwlwifi kernel module for
|
||||
Intel Wireless WiFi Link 6250AGN Adapter
|
||||
Intel 6000 Series Wi-Fi Adapters (6200AGN and 6300AGN)
|
||||
Intel WiFi Link 1000BGN
|
||||
Intel Wireless WiFi 5150AGN
|
||||
Intel Wireless WiFi 5100AGN, 5300AGN, and 5350AGN
|
||||
Intel 6005 Series Wi-Fi Adapters
|
||||
Intel 6030 Series Wi-Fi Adapters
|
||||
Intel Wireless WiFi Link 6150BGN 2 Adapter
|
||||
Intel 100 Series Wi-Fi Adapters (100BGN and 130BGN)
|
||||
Intel 2000 Series Wi-Fi Adapters
|
||||
Intel 7260 Wi-Fi Adapter
|
||||
Intel 3160 Wi-Fi Adapter
|
||||
Intel 7265 Wi-Fi Adapter
|
||||
Intel 8260 Wi-Fi Adapter
|
||||
Intel 3165 Wi-Fi Adapter
|
||||
endef
|
||||
|
||||
define KernelPackage/iwlwifi/config
|
||||
if PACKAGE_kmod-iwlwifi
|
||||
|
||||
config PACKAGE_IWLWIFI_DEBUG
|
||||
bool "Enable full debugging output in the iwlwifi driver"
|
||||
default n
|
||||
help
|
||||
This option will enable debug tracing output for the iwlwifi drivers
|
||||
|
||||
This will result in the kernel module being ~100k larger. You can
|
||||
control which debug output is sent to the kernel log by setting the
|
||||
value in
|
||||
|
||||
/sys/module/iwlwifi/parameters/debug
|
||||
|
||||
This entry will only exist if this option is enabled.
|
||||
|
||||
To set a value, simply echo an 8-byte hex value to the same file:
|
||||
|
||||
% echo 0x43fff > /sys/module/iwlwifi/parameters/debug
|
||||
|
||||
You can find the list of debug mask values in:
|
||||
drivers/net/wireless/intel/iwlwifi/iwl-debug.h
|
||||
|
||||
If this is your first time using this driver, you should say Y here
|
||||
as the debug information can assist others in helping you resolve
|
||||
any problems you may encounter.
|
||||
|
||||
config PACKAGE_IWLWIFI_DEBUGFS
|
||||
bool "iwlwifi debugfs support"
|
||||
depends on PACKAGE_MAC80211_DEBUGFS
|
||||
default n
|
||||
help
|
||||
Enable creation of debugfs files for the iwlwifi drivers. This
|
||||
is a low-impact option that allows getting insight into the
|
||||
driver's state at runtime.
|
||||
|
||||
endif
|
||||
endef
|
||||
|
||||
define KernelPackage/iwl-legacy
|
||||
$(call KernelPackage/mac80211/Default)
|
||||
DEPENDS:= +kmod-mac80211 @PCI_SUPPORT
|
||||
TITLE:=Intel legacy Wireless support
|
||||
FILES:=$(PKG_BUILD_DIR)/drivers/net/wireless/intel/iwlegacy/iwlegacy.ko
|
||||
AUTOLOAD:=$(call AutoProbe,iwlegacy)
|
||||
endef
|
||||
|
||||
define KernelPackage/iwl-legacy/description
|
||||
iwl-legacy kernel module for legacy Intel wireless support
|
||||
endef
|
||||
|
||||
define KernelPackage/iwl3945
|
||||
$(call KernelPackage/mac80211/Default)
|
||||
DEPENDS:= +kmod-mac80211 +kmod-iwl-legacy +iwl3945-firmware
|
||||
TITLE:=Intel iwl3945 Wireless support
|
||||
FILES:=$(PKG_BUILD_DIR)/drivers/net/wireless/intel/iwlegacy/iwl3945.ko
|
||||
AUTOLOAD:=$(call AutoProbe,iwl3945)
|
||||
endef
|
||||
|
||||
define KernelPackage/iwl3945/description
|
||||
iwl3945 kernel module for Intel 3945 support
|
||||
endef
|
||||
|
||||
define KernelPackage/iwl4965
|
||||
$(call KernelPackage/mac80211/Default)
|
||||
DEPENDS:= +kmod-mac80211 +kmod-iwl-legacy +@DRIVER_11N_SUPPORT +iwl4965-firmware
|
||||
TITLE:=Intel iwl4965 Wireless support
|
||||
FILES:=$(PKG_BUILD_DIR)/drivers/net/wireless/intel/iwlegacy/iwl4965.ko
|
||||
AUTOLOAD:=$(call AutoProbe,iwl4965)
|
||||
endef
|
||||
|
||||
define KernelPackage/iwl4965/description
|
||||
iwl4965 kernel module for Intel 4965 support
|
||||
endef
|
||||
|
||||
|
||||
define KernelPackage/libipw
|
||||
$(call KernelPackage/mac80211/Default)
|
||||
TITLE:=libipw for ipw2100 and ipw2200
|
||||
DEPENDS:=@PCI_SUPPORT +kmod-crypto-michael-mic +kmod-crypto-ecb +kmod-lib80211 +kmod-cfg80211 +@DRIVER_WEXT_SUPPORT @!BIG_ENDIAN
|
||||
FILES:=$(PKG_BUILD_DIR)/drivers/net/wireless/intel/ipw2x00/libipw.ko
|
||||
AUTOLOAD:=$(call AutoProbe,libipw)
|
||||
endef
|
||||
|
||||
define KernelPackage/libipw/description
|
||||
Hardware independent IEEE 802.11 networking stack for ipw2100 and ipw2200.
|
||||
endef
|
||||
|
||||
IPW2100_NAME:=ipw2100-fw
|
||||
IPW2100_VERSION:=1.3
|
||||
|
||||
define Download/ipw2100
|
||||
URL:= \
|
||||
https://src.fedoraproject.org/repo/pkgs/ipw2100-firmware/ipw2100-fw-1.3.tgz/46aa75bcda1a00efa841f9707bbbd113/ \
|
||||
https://archlinux.mirror.pkern.at/other/packages/ipw2100-fw/ \
|
||||
http://mirror.ox.ac.uk/sites/ftp.openbsd.org/pub/OpenBSD/distfiles/firmware/ \
|
||||
http://firmware.openbsd.org/firmware-dist/
|
||||
FILE:=$(IPW2100_NAME)-$(IPW2100_VERSION).tgz
|
||||
HASH:=e1107c455e48d324a616b47a622593bc8413dcce72026f72731c0b03dae3a7a2
|
||||
endef
|
||||
$(eval $(call Download,ipw2100))
|
||||
|
||||
define KernelPackage/ipw2100
|
||||
$(call KernelPackage/mac80211/Default)
|
||||
TITLE:=Intel IPW2100 driver
|
||||
DEPENDS:=@PCI_SUPPORT +kmod-libipw
|
||||
FILES:=$(PKG_BUILD_DIR)/drivers/net/wireless/intel/ipw2x00/ipw2100.ko
|
||||
AUTOLOAD:=$(call AutoProbe,ipw2100)
|
||||
endef
|
||||
|
||||
define KernelPackage/ipw2100/description
|
||||
Kernel support for Intel IPW2100
|
||||
Includes:
|
||||
- ipw2100
|
||||
endef
|
||||
|
||||
IPW2200_NAME:=ipw2200-fw
|
||||
IPW2200_VERSION:=3.1
|
||||
|
||||
define Download/ipw2200
|
||||
URL:= \
|
||||
https://src.fedoraproject.org/repo/pkgs/ipw2200-firmware/ipw2200-fw-3.1.tgz/eaba788643c7cc7483dd67ace70f6e99/ \
|
||||
https://archlinux.mirror.pkern.at/other/packages/ipw2200-fw/ \
|
||||
http://mirror.ox.ac.uk/sites/ftp.openbsd.org/pub/OpenBSD/distfiles/firmware/ \
|
||||
http://firmware.openbsd.org/firmware-dist/
|
||||
FILE:=$(IPW2200_NAME)-$(IPW2200_VERSION).tgz
|
||||
HASH:=c6818c11c18cc030d55ff83f64b2bad8feef485e7742f84f94a61d811a6258bd
|
||||
endef
|
||||
$(eval $(call Download,ipw2200))
|
||||
|
||||
define KernelPackage/ipw2200
|
||||
$(call KernelPackage/mac80211/Default)
|
||||
TITLE:=Intel IPW2200 driver
|
||||
DEPENDS:=@PCI_SUPPORT +kmod-libipw
|
||||
FILES:=$(PKG_BUILD_DIR)/drivers/net/wireless/intel/ipw2x00/ipw2200.ko
|
||||
AUTOLOAD:=$(call AutoProbe,ipw2200)
|
||||
endef
|
||||
|
||||
define KernelPackage/ipw2200/description
|
||||
Kernel support for Intel IPW2200
|
||||
Includes:
|
||||
- ipw2200
|
||||
endef
|
||||
|
||||
define KernelPackage/ipw2100/install
|
||||
$(INSTALL_DIR) $(1)/lib/firmware
|
||||
$(INSTALL_DATA) $(PKG_BUILD_DIR)/ipw2100-$(IPW2100_VERSION)*.fw $(1)/lib/firmware
|
||||
endef
|
||||
|
||||
define KernelPackage/ipw2200/install
|
||||
$(INSTALL_DIR) $(1)/lib/firmware
|
||||
$(INSTALL_DATA) $(PKG_BUILD_DIR)/$(IPW2200_NAME)-$(IPW2200_VERSION)/ipw2200*.fw $(1)/lib/firmware
|
||||
endef
|
||||
90
mac80211/marvell.mk
Normal file
90
mac80211/marvell.mk
Normal file
@@ -0,0 +1,90 @@
|
||||
PKG_DRIVERS += \
|
||||
libertas-sdio libertas-usb libertas-spi \
|
||||
mwl8k mwifiex-pcie mwifiex-sdio
|
||||
|
||||
config-$(call config_package,libertas-sdio) += LIBERTAS LIBERTAS_SDIO
|
||||
config-$(call config_package,libertas-usb) += LIBERTAS LIBERTAS_USB
|
||||
config-$(call config_package,libertas-spi) += LIBERTAS LIBERTAS_SPI
|
||||
config-$(call config_package,mwl8k) += MWL8K
|
||||
config-$(call config_package,mwifiex-pcie) += MWIFIEX MWIFIEX_PCIE
|
||||
config-$(call config_package,mwifiex-sdio) += MWIFIEX MWIFIEX_SDIO
|
||||
|
||||
define KernelPackage/libertas-usb
|
||||
$(call KernelPackage/mac80211/Default)
|
||||
DEPENDS+= @USB_SUPPORT +kmod-cfg80211 +kmod-usb-core +kmod-lib80211 +@DRIVER_WEXT_SUPPORT +libertas-usb-firmware
|
||||
TITLE:=Marvell 88W8015 Wireless Driver
|
||||
FILES:= \
|
||||
$(PKG_BUILD_DIR)/drivers/net/wireless/marvell/libertas/libertas.ko \
|
||||
$(PKG_BUILD_DIR)/drivers/net/wireless/marvell/libertas/usb8xxx.ko
|
||||
AUTOLOAD:=$(call AutoProbe,libertas usb8xxx)
|
||||
endef
|
||||
|
||||
define KernelPackage/libertas-sdio
|
||||
$(call KernelPackage/mac80211/Default)
|
||||
DEPENDS+= +kmod-cfg80211 +kmod-lib80211 +kmod-mmc +@DRIVER_WEXT_SUPPORT @!TARGET_uml +libertas-sdio-firmware
|
||||
TITLE:=Marvell 88W8686 Wireless Driver
|
||||
FILES:= \
|
||||
$(PKG_BUILD_DIR)/drivers/net/wireless/marvell/libertas/libertas.ko \
|
||||
$(PKG_BUILD_DIR)/drivers/net/wireless/marvell/libertas/libertas_sdio.ko
|
||||
AUTOLOAD:=$(call AutoProbe,libertas libertas_sdio)
|
||||
endef
|
||||
|
||||
define KernelPackage/libertas-spi
|
||||
$(call KernelPackage/mac80211/Default)
|
||||
SUBMENU:=Wireless Drivers
|
||||
DEPENDS+= +kmod-cfg80211 +kmod-lib80211 +@DRIVER_WEXT_SUPPORT @!TARGET_uml +libertas-spi-firmware
|
||||
KCONFIG := \
|
||||
CONFIG_SPI=y \
|
||||
CONFIG_SPI_MASTER=y
|
||||
TITLE:=Marvell 88W8686 SPI Wireless Driver
|
||||
FILES:= \
|
||||
$(PKG_BUILD_DIR)/drivers/net/wireless/marvell/libertas/libertas.ko \
|
||||
$(PKG_BUILD_DIR)/drivers/net/wireless/marvell/libertas/libertas_spi.ko
|
||||
AUTOLOAD:=$(call AutoProbe,libertas libertas_spi)
|
||||
endef
|
||||
|
||||
|
||||
define KernelPackage/mwl8k
|
||||
$(call KernelPackage/mac80211/Default)
|
||||
TITLE:=Driver for Marvell TOPDOG 802.11 Wireless cards
|
||||
URL:=https://wireless.wiki.kernel.org/en/users/drivers/mwl8k
|
||||
DEPENDS+= @PCI_SUPPORT +kmod-mac80211 +@DRIVER_11N_SUPPORT +mwl8k-firmware
|
||||
FILES:=$(PKG_BUILD_DIR)/drivers/net/wireless/marvell/mwl8k.ko
|
||||
AUTOLOAD:=$(call AutoProbe,mwl8k)
|
||||
endef
|
||||
|
||||
define KernelPackage/mwl8k/description
|
||||
Kernel modules for Marvell TOPDOG 802.11 Wireless cards
|
||||
endef
|
||||
|
||||
|
||||
define KernelPackage/mwifiex-pcie
|
||||
$(call KernelPackage/mac80211/Default)
|
||||
TITLE:=Driver for Marvell 802.11n/802.11ac PCIe Wireless cards
|
||||
URL:=https://wireless.wiki.kernel.org/en/users/drivers/mwifiex
|
||||
DEPENDS+= @PCI_SUPPORT +kmod-mac80211 +@DRIVER_11N_SUPPORT +@DRIVER_11AC_SUPPORT +mwifiex-pcie-firmware
|
||||
FILES:= \
|
||||
$(PKG_BUILD_DIR)/drivers/net/wireless/marvell/mwifiex/mwifiex.ko \
|
||||
$(PKG_BUILD_DIR)/drivers/net/wireless/marvell/mwifiex/mwifiex_pcie.ko
|
||||
AUTOLOAD:=$(call AutoProbe,mwifiex_pcie)
|
||||
endef
|
||||
|
||||
define KernelPackage/mwifiex-pcie/description
|
||||
Kernel modules for Marvell 802.11n/802.11ac PCIe Wireless cards
|
||||
endef
|
||||
|
||||
define KernelPackage/mwifiex-sdio
|
||||
$(call KernelPackage/mac80211/Default)
|
||||
TITLE:=Driver for Marvell 802.11n/802.11ac SDIO Wireless cards
|
||||
URL:=https://wireless.wiki.kernel.org/en/users/drivers/mwifiex
|
||||
DEPENDS+= +kmod-mmc +kmod-mac80211 +@DRIVER_11N_SUPPORT +@DRIVER_11AC_SUPPORT +mwifiex-sdio-firmware
|
||||
FILES:= \
|
||||
$(PKG_BUILD_DIR)/drivers/net/wireless/marvell/mwifiex/mwifiex.ko \
|
||||
$(PKG_BUILD_DIR)/drivers/net/wireless/marvell/mwifiex/mwifiex_sdio.ko
|
||||
AUTOLOAD:=$(call AutoProbe,mwifiex_sdio)
|
||||
endef
|
||||
|
||||
define KernelPackage/mwifiex-sdio/description
|
||||
Kernel modules for Marvell 802.11n/802.11ac SDIO Wireless cards
|
||||
endef
|
||||
|
||||
10
mac80211/patches/ath/070-ath_common_config.patch
Normal file
10
mac80211/patches/ath/070-ath_common_config.patch
Normal file
@@ -0,0 +1,10 @@
|
||||
--- a/drivers/net/wireless/ath/Kconfig
|
||||
+++ b/drivers/net/wireless/ath/Kconfig
|
||||
@@ -1,6 +1,6 @@
|
||||
# SPDX-License-Identifier: ISC
|
||||
config ATH_COMMON
|
||||
- tristate
|
||||
+ tristate "ath.ko"
|
||||
depends on m
|
||||
|
||||
config WLAN_VENDOR_ATH
|
||||
47
mac80211/patches/ath/080-ath10k_thermal_config.patch
Normal file
47
mac80211/patches/ath/080-ath10k_thermal_config.patch
Normal file
@@ -0,0 +1,47 @@
|
||||
--- a/drivers/net/wireless/ath/ath10k/Kconfig
|
||||
+++ b/drivers/net/wireless/ath/ath10k/Kconfig
|
||||
@@ -86,6 +86,12 @@ config ATH10K_TRACING
|
||||
help
|
||||
Select this to ath10k use tracing infrastructure.
|
||||
|
||||
+config ATH10K_THERMAL
|
||||
+ bool "Atheros ath10k thermal monitoring support"
|
||||
+ depends on THERMAL
|
||||
+ ---help---
|
||||
+ Select this to ath10k use hwmon for thermal measurement.
|
||||
+
|
||||
config ATH10K_DFS_CERTIFIED
|
||||
bool "Atheros DFS support for certified platforms"
|
||||
depends on ATH10K && CFG80211_CERTIFICATION_ONUS
|
||||
--- a/drivers/net/wireless/ath/ath10k/Makefile
|
||||
+++ b/drivers/net/wireless/ath/ath10k/Makefile
|
||||
@@ -18,7 +18,7 @@ ath10k_core-y += mac.o \
|
||||
ath10k_core-$(CPTCFG_ATH10K_SPECTRAL) += spectral.o
|
||||
ath10k_core-$(CPTCFG_NL80211_TESTMODE) += testmode.o
|
||||
ath10k_core-$(CPTCFG_ATH10K_TRACING) += trace.o
|
||||
-ath10k_core-$(CONFIG_THERMAL) += thermal.o
|
||||
+ath10k_core-$(CPTCFG_ATH10K_THERMAL) += thermal.o
|
||||
ath10k_core-$(CPTCFG_MAC80211_DEBUGFS) += debugfs_sta.o
|
||||
ath10k_core-$(CONFIG_PM) += wow.o
|
||||
ath10k_core-$(CONFIG_DEV_COREDUMP) += coredump.o
|
||||
--- a/drivers/net/wireless/ath/ath10k/thermal.h
|
||||
+++ b/drivers/net/wireless/ath/ath10k/thermal.h
|
||||
@@ -25,7 +25,7 @@ struct ath10k_thermal {
|
||||
int temperature;
|
||||
};
|
||||
|
||||
-#if IS_REACHABLE(CONFIG_THERMAL)
|
||||
+#if IS_REACHABLE(CPTCFG_ATH10K_THERMAL)
|
||||
int ath10k_thermal_register(struct ath10k *ar);
|
||||
void ath10k_thermal_unregister(struct ath10k *ar);
|
||||
void ath10k_thermal_event_temperature(struct ath10k *ar, int temperature);
|
||||
--- a/local-symbols
|
||||
+++ b/local-symbols
|
||||
@@ -142,6 +142,7 @@ ATH10K_SNOC=
|
||||
ATH10K_DEBUG=
|
||||
ATH10K_DEBUGFS=
|
||||
ATH10K_SPECTRAL=
|
||||
+ATH10K_THERMAL=
|
||||
ATH10K_TRACING=
|
||||
ATH10K_DFS_CERTIFIED=
|
||||
WCN36XX=
|
||||
53
mac80211/patches/ath/120-owl-loader-compat.patch
Normal file
53
mac80211/patches/ath/120-owl-loader-compat.patch
Normal file
@@ -0,0 +1,53 @@
|
||||
From: Christian Lamparter <chunkeey@gmail.com>
|
||||
Date: Sat, 16 Nov 2019 19:25:24 +0100
|
||||
Subject: [PATCH] owl_loader: compatibility patch
|
||||
|
||||
This patch includes OpenWrt specific changes that are
|
||||
not included in the upstream owl-loader.
|
||||
|
||||
This includes a platform data handling changes for ar71xx.
|
||||
|
||||
Signed-off-by: Christian Lamparter <chunkeey@gmail.com>
|
||||
|
||||
--- a/drivers/net/wireless/ath/ath9k/ath9k_pci_owl_loader.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/ath9k_pci_owl_loader.c
|
||||
@@ -103,6 +103,7 @@ static void owl_fw_cb(const struct firmw
|
||||
{
|
||||
struct pci_dev *pdev = (struct pci_dev *)context;
|
||||
struct owl_ctx *ctx = (struct owl_ctx *)pci_get_drvdata(pdev);
|
||||
+ struct ath9k_platform_data *pdata = dev_get_platdata(&pdev->dev);
|
||||
struct pci_bus *bus;
|
||||
|
||||
complete(&ctx->eeprom_load);
|
||||
@@ -118,6 +119,16 @@ static void owl_fw_cb(const struct firmw
|
||||
goto release;
|
||||
}
|
||||
|
||||
+ if (pdata) {
|
||||
+ memcpy(pdata->eeprom_data, fw->data, fw->size);
|
||||
+
|
||||
+ /*
|
||||
+ * eeprom has been successfully loaded - pass the data to ath9k
|
||||
+ * but remove the eeprom_name, so it doesn't try to load it too.
|
||||
+ */
|
||||
+ pdata->eeprom_name = NULL;
|
||||
+ }
|
||||
+
|
||||
if (ath9k_pci_fixup(pdev, (const u16 *)fw->data, fw->size))
|
||||
goto release;
|
||||
|
||||
@@ -137,8 +148,14 @@ release:
|
||||
static const char *owl_get_eeprom_name(struct pci_dev *pdev)
|
||||
{
|
||||
struct device *dev = &pdev->dev;
|
||||
+ struct ath9k_platform_data *pdata;
|
||||
char *eeprom_name;
|
||||
|
||||
+ /* try the existing platform data first */
|
||||
+ pdata = dev_get_platdata(dev);
|
||||
+ if (pdata && pdata->eeprom_name)
|
||||
+ return pdata->eeprom_name;
|
||||
+
|
||||
dev_dbg(dev, "using auto-generated eeprom filename\n");
|
||||
|
||||
eeprom_name = devm_kzalloc(dev, EEPROM_FILENAME_LEN, GFP_KERNEL);
|
||||
38
mac80211/patches/ath/201-ath5k-WAR-for-AR71xx-PCI-bug.patch
Normal file
38
mac80211/patches/ath/201-ath5k-WAR-for-AR71xx-PCI-bug.patch
Normal file
@@ -0,0 +1,38 @@
|
||||
--- a/drivers/net/wireless/ath/ath5k/initvals.c
|
||||
+++ b/drivers/net/wireless/ath/ath5k/initvals.c
|
||||
@@ -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 },
|
||||
+#if !defined(CONFIG_ATHEROS_AR71XX) && !defined(CONFIG_ATH79)
|
||||
{ AR5K_TXCFG, AR5K_DMASIZE_128B },
|
||||
{ AR5K_RXCFG, AR5K_DMASIZE_128B },
|
||||
+#else
|
||||
+ /* WAR for AR71xx PCI bug */
|
||||
+ { AR5K_TXCFG, AR5K_DMASIZE_128B },
|
||||
+ { AR5K_RXCFG, AR5K_DMASIZE_4B },
|
||||
+#endif
|
||||
{ AR5K_CFG, AR5K_INIT_CFG },
|
||||
{ AR5K_TOPS, 8 },
|
||||
{ AR5K_RXNOFRM, 8 },
|
||||
--- a/drivers/net/wireless/ath/ath5k/dma.c
|
||||
+++ b/drivers/net/wireless/ath/ath5k/dma.c
|
||||
@@ -869,10 +869,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) {
|
||||
+#if !defined(CONFIG_ATHEROS_AR71XX) && !defined(CONFIG_ATH79)
|
||||
AR5K_REG_WRITE_BITS(ah, AR5K_TXCFG,
|
||||
AR5K_TXCFG_SDMAMR, AR5K_DMASIZE_128B);
|
||||
AR5K_REG_WRITE_BITS(ah, AR5K_RXCFG,
|
||||
AR5K_RXCFG_SDMAMW, AR5K_DMASIZE_128B);
|
||||
+#else
|
||||
+ /* WAR for AR71xx PCI bug */
|
||||
+ AR5K_REG_WRITE_BITS(ah, AR5K_TXCFG,
|
||||
+ AR5K_TXCFG_SDMAMR, AR5K_DMASIZE_128B);
|
||||
+ AR5K_REG_WRITE_BITS(ah, AR5K_RXCFG,
|
||||
+ AR5K_RXCFG_SDMAMW, AR5K_DMASIZE_4B);
|
||||
+#endif
|
||||
}
|
||||
|
||||
/* Pre-enable interrupts on 5211/5212*/
|
||||
@@ -0,0 +1,25 @@
|
||||
From: Felix Fietkau <nbd@nbd.name>
|
||||
Date: Sat, 9 Jul 2016 15:25:24 +0200
|
||||
Subject: [PATCH] ath9k_hw: reset AHB-WMAC interface on AR91xx
|
||||
|
||||
Should fix a few stability issues
|
||||
|
||||
Signed-off-by: Felix Fietkau <nbd@nbd.name>
|
||||
---
|
||||
|
||||
--- a/drivers/net/wireless/ath/ath9k/hw.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/hw.c
|
||||
@@ -1435,8 +1435,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)) {
|
||||
+ /* Reset the AHB-WMAC interface */
|
||||
+ if (ah->external_reset)
|
||||
+ ah->external_reset();
|
||||
udelay(50);
|
||||
+ }
|
||||
|
||||
return true;
|
||||
}
|
||||
@@ -0,0 +1,129 @@
|
||||
From: Felix Fietkau <nbd@nbd.name>
|
||||
Date: Sat, 9 Jul 2016 15:26:44 +0200
|
||||
Subject: [PATCH] ath9k_hw: issue external reset for QCA955x
|
||||
|
||||
The RTC interface on the SoC needs to be reset along with the rest of
|
||||
the WMAC.
|
||||
|
||||
Signed-off-by: Felix Fietkau <nbd@nbd.name>
|
||||
---
|
||||
|
||||
--- a/drivers/net/wireless/ath/ath9k/hw.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/hw.c
|
||||
@@ -1312,39 +1312,56 @@ void ath9k_hw_get_delta_slope_vals(struc
|
||||
*coef_exponent = coef_exp - 16;
|
||||
}
|
||||
|
||||
-/* AR9330 WAR:
|
||||
- * call external reset function to reset WMAC if:
|
||||
- * - doing a cold reset
|
||||
- * - we have pending frames in the TX queues.
|
||||
- */
|
||||
-static bool ath9k_hw_ar9330_reset_war(struct ath_hw *ah, int type)
|
||||
+static bool ath9k_hw_need_external_reset(struct ath_hw *ah, int type)
|
||||
{
|
||||
- int i, npend = 0;
|
||||
+ int i;
|
||||
|
||||
- for (i = 0; i < AR_NUM_QCU; i++) {
|
||||
- npend = ath9k_hw_numtxpending(ah, i);
|
||||
- if (npend)
|
||||
- break;
|
||||
- }
|
||||
-
|
||||
- if (ah->external_reset &&
|
||||
- (npend || type == ATH9K_RESET_COLD)) {
|
||||
- int reset_err = 0;
|
||||
-
|
||||
- ath_dbg(ath9k_hw_common(ah), RESET,
|
||||
- "reset MAC via external reset\n");
|
||||
-
|
||||
- reset_err = ah->external_reset();
|
||||
- if (reset_err) {
|
||||
- ath_err(ath9k_hw_common(ah),
|
||||
- "External reset failed, err=%d\n",
|
||||
- reset_err);
|
||||
- return false;
|
||||
+ if (type == ATH9K_RESET_COLD)
|
||||
+ return true;
|
||||
+
|
||||
+ if (AR_SREV_9550(ah))
|
||||
+ return true;
|
||||
+
|
||||
+ /* AR9330 WAR:
|
||||
+ * call external reset function to reset WMAC if:
|
||||
+ * - doing a cold reset
|
||||
+ * - we have pending frames in the TX queues.
|
||||
+ */
|
||||
+ if (AR_SREV_9330(ah)) {
|
||||
+ for (i = 0; i < AR_NUM_QCU; i++) {
|
||||
+ if (ath9k_hw_numtxpending(ah, i))
|
||||
+ return true;
|
||||
}
|
||||
+ }
|
||||
+
|
||||
+ return false;
|
||||
+}
|
||||
+
|
||||
+static bool ath9k_hw_external_reset(struct ath_hw *ah, int type)
|
||||
+{
|
||||
+ int err;
|
||||
+
|
||||
+ if (!ah->external_reset || !ath9k_hw_need_external_reset(ah, type))
|
||||
+ return true;
|
||||
+
|
||||
+ ath_dbg(ath9k_hw_common(ah), RESET,
|
||||
+ "reset MAC via external reset\n");
|
||||
|
||||
- REG_WRITE(ah, AR_RTC_RESET, 1);
|
||||
+ err = ah->external_reset();
|
||||
+ if (err) {
|
||||
+ ath_err(ath9k_hw_common(ah),
|
||||
+ "External reset failed, err=%d\n", err);
|
||||
+ return false;
|
||||
}
|
||||
|
||||
+ if (AR_SREV_9550(ah)) {
|
||||
+ REG_WRITE(ah, AR_RTC_RESET, 0);
|
||||
+ udelay(10);
|
||||
+ }
|
||||
+
|
||||
+ REG_WRITE(ah, AR_RTC_RESET, 1);
|
||||
+ udelay(10);
|
||||
+
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -1397,24 +1414,24 @@ static bool ath9k_hw_set_reset(struct at
|
||||
rst_flags |= AR_RTC_RC_MAC_COLD;
|
||||
}
|
||||
|
||||
- if (AR_SREV_9330(ah)) {
|
||||
- if (!ath9k_hw_ar9330_reset_war(ah, type))
|
||||
- return false;
|
||||
- }
|
||||
-
|
||||
if (ath9k_hw_mci_is_enabled(ah))
|
||||
ar9003_mci_check_gpm_offset(ah);
|
||||
|
||||
/* DMA HALT added to resolve ar9300 and ar9580 bus error during
|
||||
- * RTC_RC reg read
|
||||
+ * RTC_RC reg read. Also needed for AR9550 external reset
|
||||
*/
|
||||
- if (AR_SREV_9300(ah) || AR_SREV_9580(ah)) {
|
||||
+ if (AR_SREV_9300(ah) || AR_SREV_9580(ah) || AR_SREV_9550(ah)) {
|
||||
REG_SET_BIT(ah, AR_CFG, AR_CFG_HALT_REQ);
|
||||
ath9k_hw_wait(ah, AR_CFG, AR_CFG_HALT_ACK, AR_CFG_HALT_ACK,
|
||||
20 * AH_WAIT_TIMEOUT);
|
||||
- REG_CLR_BIT(ah, AR_CFG, AR_CFG_HALT_REQ);
|
||||
}
|
||||
|
||||
+ if (!AR_SREV_9100(ah))
|
||||
+ ath9k_hw_external_reset(ah, type);
|
||||
+
|
||||
+ if (AR_SREV_9300(ah) || AR_SREV_9580(ah))
|
||||
+ REG_CLR_BIT(ah, AR_CFG, AR_CFG_HALT_REQ);
|
||||
+
|
||||
REG_WRITE(ah, AR_RTC_RC, rst_flags);
|
||||
|
||||
REGWRITE_BUFFER_FLUSH(ah);
|
||||
@@ -0,0 +1,35 @@
|
||||
From: Felix Fietkau <nbd@openwrt.org>
|
||||
Date: Sun, 7 Jun 2015 13:53:35 +0200
|
||||
Subject: [PATCH] ath9k: force rx_clear when disabling rx
|
||||
|
||||
This makes stopping Rx more reliable and should reduce the frequency of
|
||||
Rx related DMA stop warnings. Don't use rx_clear in TX99 mode.
|
||||
|
||||
Cc: stable@vger.kernel.org
|
||||
Signed-off-by: Felix Fietkau <nbd@nbd.name>
|
||||
Signed-off-by: Helmut Schaa <helmut.schaa@googlemail.com>
|
||||
---
|
||||
|
||||
--- a/drivers/net/wireless/ath/ath9k/mac.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/mac.c
|
||||
@@ -678,13 +678,18 @@ void ath9k_hw_startpcureceive(struct ath
|
||||
|
||||
ath9k_ani_reset(ah, is_scanning);
|
||||
|
||||
- REG_CLR_BIT(ah, AR_DIAG_SW, (AR_DIAG_RX_DIS | AR_DIAG_RX_ABORT));
|
||||
+ REG_CLR_BIT(ah, AR_DIAG_SW,
|
||||
+ AR_DIAG_RX_DIS | AR_DIAG_RX_ABORT | AR_DIAG_FORCE_RX_CLEAR);
|
||||
}
|
||||
EXPORT_SYMBOL(ath9k_hw_startpcureceive);
|
||||
|
||||
void ath9k_hw_abortpcurecv(struct ath_hw *ah)
|
||||
{
|
||||
- REG_SET_BIT(ah, AR_DIAG_SW, AR_DIAG_RX_ABORT | AR_DIAG_RX_DIS);
|
||||
+ u32 reg = AR_DIAG_RX_DIS | AR_DIAG_RX_ABORT;
|
||||
+
|
||||
+ if (!IS_ENABLED(CPTCFG_ATH9K_TX99))
|
||||
+ reg |= AR_DIAG_FORCE_RX_CLEAR;
|
||||
+ REG_SET_BIT(ah, AR_DIAG_SW, reg);
|
||||
|
||||
ath9k_hw_disable_mib_counters(ah);
|
||||
}
|
||||
@@ -0,0 +1,36 @@
|
||||
From: Felix Fietkau <nbd@nbd.name>
|
||||
Date: Sat, 14 May 2016 14:51:02 +0200
|
||||
Subject: [PATCH] Revert "ath9k: interpret requested txpower in EIRP
|
||||
domain"
|
||||
|
||||
This reverts commit 71f5137bf010c6faffab50c0ec15374c59c4a411.
|
||||
---
|
||||
|
||||
--- a/drivers/net/wireless/ath/ath9k/hw.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/hw.c
|
||||
@@ -2977,7 +2977,8 @@ void ath9k_hw_apply_txpower(struct ath_h
|
||||
{
|
||||
struct ath_regulatory *reg = ath9k_hw_regulatory(ah);
|
||||
struct ieee80211_channel *channel;
|
||||
- int chan_pwr, new_pwr;
|
||||
+ int chan_pwr, new_pwr, max_gain;
|
||||
+ int ant_gain, ant_reduction = 0;
|
||||
u16 ctl = NO_CTL;
|
||||
|
||||
if (!chan)
|
||||
@@ -2989,9 +2990,14 @@ void ath9k_hw_apply_txpower(struct ath_h
|
||||
channel = chan->chan;
|
||||
chan_pwr = min_t(int, channel->max_power * 2, MAX_COMBINED_POWER);
|
||||
new_pwr = min_t(int, chan_pwr, reg->power_limit);
|
||||
+ max_gain = chan_pwr - new_pwr + channel->max_antenna_gain * 2;
|
||||
+
|
||||
+ ant_gain = get_antenna_gain(ah, chan);
|
||||
+ if (ant_gain > max_gain)
|
||||
+ ant_reduction = ant_gain - max_gain;
|
||||
|
||||
ah->eep_ops->set_txpower(ah, chan, ctl,
|
||||
- get_antenna_gain(ah, chan), new_pwr, test);
|
||||
+ ant_reduction, new_pwr, test);
|
||||
}
|
||||
|
||||
void ath9k_hw_set_txpowerlimit(struct ath_hw *ah, u32 limit, bool test)
|
||||
@@ -0,0 +1,24 @@
|
||||
From: Felix Fietkau <nbd@nbd.name>
|
||||
Date: Wed, 19 Jul 2017 08:49:31 +0200
|
||||
Subject: [PATCH] ath9k: adjust tx power reduction for US regulatory
|
||||
domain
|
||||
|
||||
FCC regulatory rules allow for up to 6 dBi antenna gain. Account for
|
||||
this in the EEPROM based tx power reduction code.
|
||||
|
||||
Signed-off-by: Felix Fietkau <nbd@nbd.name>
|
||||
---
|
||||
|
||||
--- a/drivers/net/wireless/ath/ath9k/hw.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/hw.c
|
||||
@@ -2996,6 +2996,10 @@ void ath9k_hw_apply_txpower(struct ath_h
|
||||
if (ant_gain > max_gain)
|
||||
ant_reduction = ant_gain - max_gain;
|
||||
|
||||
+ /* FCC allows maximum antenna gain of 6 dBi */
|
||||
+ if (reg->region == NL80211_DFS_FCC)
|
||||
+ ant_reduction = max_t(int, ant_reduction - 12, 0);
|
||||
+
|
||||
ah->eep_ops->set_txpower(ah, chan, ctl,
|
||||
ant_reduction, new_pwr, test);
|
||||
}
|
||||
31
mac80211/patches/ath/400-ath_move_debug_code.patch
Normal file
31
mac80211/patches/ath/400-ath_move_debug_code.patch
Normal file
@@ -0,0 +1,31 @@
|
||||
--- a/drivers/net/wireless/ath/Makefile
|
||||
+++ b/drivers/net/wireless/ath/Makefile
|
||||
@@ -15,10 +15,10 @@ ath-objs := main.o \
|
||||
regd.o \
|
||||
hw.o \
|
||||
key.o \
|
||||
+ debug.o \
|
||||
dfs_pattern_detector.o \
|
||||
dfs_pri_detector.o
|
||||
|
||||
-ath-$(CPTCFG_ATH_DEBUG) += debug.o
|
||||
ath-$(CPTCFG_ATH_TRACEPOINTS) += trace.o
|
||||
|
||||
CFLAGS_trace.o := -I$(src)
|
||||
--- a/drivers/net/wireless/ath/ath.h
|
||||
+++ b/drivers/net/wireless/ath/ath.h
|
||||
@@ -316,14 +316,7 @@ void _ath_dbg(struct ath_common *common,
|
||||
#endif /* CPTCFG_ATH_DEBUG */
|
||||
|
||||
/** Returns string describing opmode, or NULL if unknown mode. */
|
||||
-#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)
|
||||
-{
|
||||
- return "UNKNOWN";
|
||||
-}
|
||||
-#endif
|
||||
|
||||
extern const char *ath_bus_type_strings[];
|
||||
static inline const char *ath_bus_type_to_string(enum ath_bus_type bustype)
|
||||
11
mac80211/patches/ath/401-ath9k_blink_default.patch
Normal file
11
mac80211/patches/ath/401-ath9k_blink_default.patch
Normal file
@@ -0,0 +1,11 @@
|
||||
--- a/drivers/net/wireless/ath/ath9k/init.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/init.c
|
||||
@@ -48,7 +48,7 @@ int ath9k_modparam_nohwcrypt;
|
||||
module_param_named(nohwcrypt, ath9k_modparam_nohwcrypt, int, 0444);
|
||||
MODULE_PARM_DESC(nohwcrypt, "Disable hardware encryption");
|
||||
|
||||
-int ath9k_led_blink;
|
||||
+int ath9k_led_blink = 1;
|
||||
module_param_named(blink, ath9k_led_blink, int, 0444);
|
||||
MODULE_PARM_DESC(blink, "Enable LED blink on activity");
|
||||
|
||||
92
mac80211/patches/ath/402-ath_regd_optional.patch
Normal file
92
mac80211/patches/ath/402-ath_regd_optional.patch
Normal file
@@ -0,0 +1,92 @@
|
||||
--- a/drivers/net/wireless/ath/regd.c
|
||||
+++ b/drivers/net/wireless/ath/regd.c
|
||||
@@ -24,6 +24,7 @@
|
||||
#include "regd_common.h"
|
||||
|
||||
static int __ath_regd_init(struct ath_regulatory *reg);
|
||||
+static struct reg_dmn_pair_mapping *ath_get_regpair(int regdmn);
|
||||
|
||||
/*
|
||||
* This is a set of common rules used by our world regulatory domains.
|
||||
@@ -116,6 +117,9 @@ static const struct ieee80211_regdomain
|
||||
|
||||
static bool dynamic_country_user_possible(struct ath_regulatory *reg)
|
||||
{
|
||||
+ if (IS_ENABLED(CPTCFG_ATH_USER_REGD))
|
||||
+ return true;
|
||||
+
|
||||
if (IS_ENABLED(CPTCFG_ATH_REG_DYNAMIC_USER_CERT_TESTING))
|
||||
return true;
|
||||
|
||||
@@ -188,6 +192,8 @@ static bool dynamic_country_user_possibl
|
||||
|
||||
static bool ath_reg_dyn_country_user_allow(struct ath_regulatory *reg)
|
||||
{
|
||||
+ if (IS_ENABLED(CPTCFG_ATH_USER_REGD))
|
||||
+ return true;
|
||||
if (!IS_ENABLED(CPTCFG_ATH_REG_DYNAMIC_USER_REG_HINTS))
|
||||
return false;
|
||||
if (!dynamic_country_user_possible(reg))
|
||||
@@ -345,6 +351,9 @@ ath_reg_apply_beaconing_flags(struct wip
|
||||
struct ieee80211_channel *ch;
|
||||
unsigned int i;
|
||||
|
||||
+ if (IS_ENABLED(CPTCFG_ATH_USER_REGD))
|
||||
+ return;
|
||||
+
|
||||
for (band = 0; band < NUM_NL80211_BANDS; band++) {
|
||||
if (!wiphy->bands[band])
|
||||
continue;
|
||||
@@ -378,6 +387,9 @@ ath_reg_apply_ir_flags(struct wiphy *wip
|
||||
{
|
||||
struct ieee80211_supported_band *sband;
|
||||
|
||||
+ if (IS_ENABLED(CPTCFG_ATH_USER_REGD))
|
||||
+ return;
|
||||
+
|
||||
sband = wiphy->bands[NL80211_BAND_2GHZ];
|
||||
if (!sband)
|
||||
return;
|
||||
@@ -407,6 +419,9 @@ static void ath_reg_apply_radar_flags(st
|
||||
struct ieee80211_channel *ch;
|
||||
unsigned int i;
|
||||
|
||||
+ if (IS_ENABLED(CPTCFG_ATH_USER_REGD))
|
||||
+ return;
|
||||
+
|
||||
if (!wiphy->bands[NL80211_BAND_5GHZ])
|
||||
return;
|
||||
|
||||
@@ -639,6 +654,10 @@ ath_regd_init_wiphy(struct ath_regulator
|
||||
const struct ieee80211_regdomain *regd;
|
||||
|
||||
wiphy->reg_notifier = reg_notifier;
|
||||
+
|
||||
+ if (IS_ENABLED(CPTCFG_ATH_USER_REGD))
|
||||
+ return 0;
|
||||
+
|
||||
wiphy->regulatory_flags |= REGULATORY_STRICT_REG |
|
||||
REGULATORY_CUSTOM_REG;
|
||||
|
||||
--- a/drivers/net/wireless/ath/Kconfig
|
||||
+++ b/drivers/net/wireless/ath/Kconfig
|
||||
@@ -24,6 +24,9 @@ config WLAN_VENDOR_ATH
|
||||
|
||||
if WLAN_VENDOR_ATH
|
||||
|
||||
+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
|
||||
@@ -85,6 +85,7 @@ ADM8211=
|
||||
ATH_COMMON=
|
||||
WLAN_VENDOR_ATH=
|
||||
ATH_DEBUG=
|
||||
+ATH_USER_REGD=
|
||||
ATH_TRACEPOINTS=
|
||||
ATH_REG_DYNAMIC_USER_REG_HINTS=
|
||||
ATH_REG_DYNAMIC_USER_CERT_TESTING=
|
||||
84
mac80211/patches/ath/403-world_regd_fixup.patch
Normal file
84
mac80211/patches/ath/403-world_regd_fixup.patch
Normal file
@@ -0,0 +1,84 @@
|
||||
--- a/drivers/net/wireless/ath/regd.c
|
||||
+++ b/drivers/net/wireless/ath/regd.c
|
||||
@@ -44,7 +44,8 @@ static struct reg_dmn_pair_mapping *ath_
|
||||
NL80211_RRF_NO_OFDM)
|
||||
|
||||
/* We allow IBSS on these on a case by case basis by regulatory domain */
|
||||
-#define ATH_5GHZ_5150_5350 REG_RULE(5150-10, 5350+10, 80, 0, 30,\
|
||||
+#define ATH_5GHZ_5150_5350 REG_RULE(5150-10, 5240+10, 80, 0, 30, 0),\
|
||||
+ REG_RULE(5260-10, 5350+10, 80, 0, 30,\
|
||||
NL80211_RRF_NO_IR)
|
||||
#define ATH_5GHZ_5470_5850 REG_RULE(5470-10, 5850+10, 80, 0, 30,\
|
||||
NL80211_RRF_NO_IR)
|
||||
@@ -62,57 +63,56 @@ static struct reg_dmn_pair_mapping *ath_
|
||||
#define ATH_5GHZ_NO_MIDBAND ATH_5GHZ_5150_5350, \
|
||||
ATH_5GHZ_5725_5850
|
||||
|
||||
+#define REGD_RULES(...) \
|
||||
+ .reg_rules = { __VA_ARGS__ }, \
|
||||
+ .n_reg_rules = ARRAY_SIZE(((struct ieee80211_reg_rule[]) { __VA_ARGS__ }))
|
||||
+
|
||||
/* Can be used for:
|
||||
* 0x60, 0x61, 0x62 */
|
||||
static const struct ieee80211_regdomain ath_world_regdom_60_61_62 = {
|
||||
- .n_reg_rules = 5,
|
||||
.alpha2 = "99",
|
||||
- .reg_rules = {
|
||||
+ REGD_RULES(
|
||||
ATH_2GHZ_ALL,
|
||||
ATH_5GHZ_ALL,
|
||||
- }
|
||||
+ )
|
||||
};
|
||||
|
||||
/* Can be used by 0x63 and 0x65 */
|
||||
static const struct ieee80211_regdomain ath_world_regdom_63_65 = {
|
||||
- .n_reg_rules = 4,
|
||||
.alpha2 = "99",
|
||||
- .reg_rules = {
|
||||
+ REGD_RULES(
|
||||
ATH_2GHZ_CH01_11,
|
||||
ATH_2GHZ_CH12_13,
|
||||
ATH_5GHZ_NO_MIDBAND,
|
||||
- }
|
||||
+ )
|
||||
};
|
||||
|
||||
/* Can be used by 0x64 only */
|
||||
static const struct ieee80211_regdomain ath_world_regdom_64 = {
|
||||
- .n_reg_rules = 3,
|
||||
.alpha2 = "99",
|
||||
- .reg_rules = {
|
||||
+ REGD_RULES(
|
||||
ATH_2GHZ_CH01_11,
|
||||
ATH_5GHZ_NO_MIDBAND,
|
||||
- }
|
||||
+ )
|
||||
};
|
||||
|
||||
/* Can be used by 0x66 and 0x69 */
|
||||
static const struct ieee80211_regdomain ath_world_regdom_66_69 = {
|
||||
- .n_reg_rules = 3,
|
||||
.alpha2 = "99",
|
||||
- .reg_rules = {
|
||||
+ REGD_RULES(
|
||||
ATH_2GHZ_CH01_11,
|
||||
ATH_5GHZ_ALL,
|
||||
- }
|
||||
+ )
|
||||
};
|
||||
|
||||
/* Can be used by 0x67, 0x68, 0x6A and 0x6C */
|
||||
static const struct ieee80211_regdomain ath_world_regdom_67_68_6A_6C = {
|
||||
- .n_reg_rules = 4,
|
||||
.alpha2 = "99",
|
||||
- .reg_rules = {
|
||||
+ REGD_RULES(
|
||||
ATH_2GHZ_CH01_11,
|
||||
ATH_2GHZ_CH12_13,
|
||||
ATH_5GHZ_ALL,
|
||||
- }
|
||||
+ )
|
||||
};
|
||||
|
||||
static bool dynamic_country_user_possible(struct ath_regulatory *reg)
|
||||
19
mac80211/patches/ath/404-regd_no_assoc_hints.patch
Normal file
19
mac80211/patches/ath/404-regd_no_assoc_hints.patch
Normal file
@@ -0,0 +1,19 @@
|
||||
--- a/net/wireless/reg.c
|
||||
+++ b/net/wireless/reg.c
|
||||
@@ -3042,6 +3042,8 @@ void regulatory_hint_country_ie(struct w
|
||||
enum environment_cap env = ENVIRON_ANY;
|
||||
struct regulatory_request *request = NULL, *lr;
|
||||
|
||||
+ return;
|
||||
+
|
||||
/* IE len must be evenly divisible by 2 */
|
||||
if (country_ie_len & 0x01)
|
||||
return;
|
||||
@@ -3293,6 +3295,7 @@ static bool is_wiphy_all_set_reg_flag(en
|
||||
|
||||
void regulatory_hint_disconnect(void)
|
||||
{
|
||||
+ return;
|
||||
/* Restore of regulatory settings is not required when wiphy(s)
|
||||
* ignore IE from connected access point but clearance of beacon hints
|
||||
* is required when wiphy(s) supports beacon hints.
|
||||
26
mac80211/patches/ath/405-ath_regd_us.patch
Normal file
26
mac80211/patches/ath/405-ath_regd_us.patch
Normal file
@@ -0,0 +1,26 @@
|
||||
--- a/drivers/net/wireless/ath/regd_common.h
|
||||
+++ b/drivers/net/wireless/ath/regd_common.h
|
||||
@@ -32,6 +32,7 @@ enum EnumRd {
|
||||
FCC2_WORLD = 0x21,
|
||||
FCC2_ETSIC = 0x22,
|
||||
FCC6_WORLD = 0x23,
|
||||
+ FCC3_FCCA_2 = 0x2A,
|
||||
FRANCE_RES = 0x31,
|
||||
FCC3_FCCA = 0x3A,
|
||||
FCC3_WORLD = 0x3B,
|
||||
@@ -172,6 +173,7 @@ static struct reg_dmn_pair_mapping regDo
|
||||
{FCC2_WORLD, CTL_FCC, CTL_ETSI},
|
||||
{FCC2_ETSIC, CTL_FCC, CTL_ETSI},
|
||||
{FCC3_FCCA, CTL_FCC, CTL_FCC},
|
||||
+ {FCC3_FCCA_2, CTL_FCC, CTL_FCC},
|
||||
{FCC3_WORLD, CTL_FCC, CTL_ETSI},
|
||||
{FCC3_ETSIC, CTL_FCC, CTL_ETSI},
|
||||
{FCC4_FCCA, CTL_FCC, CTL_FCC},
|
||||
@@ -483,6 +485,7 @@ static struct country_code_to_enum_rd al
|
||||
{CTRY_UAE, NULL1_WORLD, "AE"},
|
||||
{CTRY_UNITED_KINGDOM, ETSI1_WORLD, "GB"},
|
||||
{CTRY_UNITED_STATES, FCC3_FCCA, "US"},
|
||||
+ {CTRY_UNITED_STATES, FCC3_FCCA_2, "US"},
|
||||
{CTRY_UNITED_STATES2, FCC3_FCCA, "US"},
|
||||
{CTRY_UNITED_STATES3, FCC3_FCCA, "US"},
|
||||
/* This "PS" is for US public safety actually... to support this we
|
||||
51
mac80211/patches/ath/406-ath_relax_default_regd.patch
Normal file
51
mac80211/patches/ath/406-ath_relax_default_regd.patch
Normal file
@@ -0,0 +1,51 @@
|
||||
--- a/drivers/net/wireless/ath/regd.c
|
||||
+++ b/drivers/net/wireless/ath/regd.c
|
||||
@@ -115,6 +115,16 @@ static const struct ieee80211_regdomain
|
||||
)
|
||||
};
|
||||
|
||||
+static u16 ath_regd_get_eepromRD(struct ath_regulatory *reg)
|
||||
+{
|
||||
+ return reg->current_rd & ~WORLDWIDE_ROAMING_FLAG;
|
||||
+}
|
||||
+
|
||||
+static bool is_default_regd(struct ath_regulatory *reg)
|
||||
+{
|
||||
+ return ath_regd_get_eepromRD(reg) == CTRY_DEFAULT;
|
||||
+}
|
||||
+
|
||||
static bool dynamic_country_user_possible(struct ath_regulatory *reg)
|
||||
{
|
||||
if (IS_ENABLED(CPTCFG_ATH_USER_REGD))
|
||||
@@ -123,6 +133,9 @@ static bool dynamic_country_user_possibl
|
||||
if (IS_ENABLED(CPTCFG_ATH_REG_DYNAMIC_USER_CERT_TESTING))
|
||||
return true;
|
||||
|
||||
+ if (is_default_regd(reg))
|
||||
+ return true;
|
||||
+
|
||||
switch (reg->country_code) {
|
||||
case CTRY_UNITED_STATES:
|
||||
case CTRY_JAPAN1:
|
||||
@@ -208,11 +221,6 @@ static inline bool is_wwr_sku(u16 regd)
|
||||
(regd == WORLD));
|
||||
}
|
||||
|
||||
-static u16 ath_regd_get_eepromRD(struct ath_regulatory *reg)
|
||||
-{
|
||||
- return reg->current_rd & ~WORLDWIDE_ROAMING_FLAG;
|
||||
-}
|
||||
-
|
||||
bool ath_is_world_regd(struct ath_regulatory *reg)
|
||||
{
|
||||
return is_wwr_sku(ath_regd_get_eepromRD(reg));
|
||||
@@ -658,6 +666,9 @@ ath_regd_init_wiphy(struct ath_regulator
|
||||
if (IS_ENABLED(CPTCFG_ATH_USER_REGD))
|
||||
return 0;
|
||||
|
||||
+ if (is_default_regd(reg))
|
||||
+ return 0;
|
||||
+
|
||||
wiphy->regulatory_flags |= REGULATORY_STRICT_REG |
|
||||
REGULATORY_CUSTOM_REG;
|
||||
|
||||
10
mac80211/patches/ath/410-ath9k_allow_adhoc_and_ap.patch
Normal file
10
mac80211/patches/ath/410-ath9k_allow_adhoc_and_ap.patch
Normal file
@@ -0,0 +1,10 @@
|
||||
--- a/drivers/net/wireless/ath/ath9k/init.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/init.c
|
||||
@@ -831,6 +831,7 @@ static const struct ieee80211_iface_limi
|
||||
BIT(NL80211_IFTYPE_AP) },
|
||||
{ .max = 1, .types = BIT(NL80211_IFTYPE_P2P_CLIENT) |
|
||||
BIT(NL80211_IFTYPE_P2P_GO) },
|
||||
+ { .max = 1, .types = BIT(NL80211_IFTYPE_ADHOC) },
|
||||
};
|
||||
|
||||
#ifdef CPTCFG_WIRELESS_WDS
|
||||
46
mac80211/patches/ath/411-ath5k_allow_adhoc_and_ap.patch
Normal file
46
mac80211/patches/ath/411-ath5k_allow_adhoc_and_ap.patch
Normal file
@@ -0,0 +1,46 @@
|
||||
--- a/drivers/net/wireless/ath/ath5k/mac80211-ops.c
|
||||
+++ b/drivers/net/wireless/ath/ath5k/mac80211-ops.c
|
||||
@@ -86,13 +86,8 @@ ath5k_add_interface(struct ieee80211_hw
|
||||
goto end;
|
||||
}
|
||||
|
||||
- /* Don't allow other interfaces if one ad-hoc is configured.
|
||||
- * TODO: Fix the problems with ad-hoc and multiple other interfaces.
|
||||
- * We would need to operate the HW in ad-hoc mode to allow TSF updates
|
||||
- * for the IBSS, but this breaks with additional AP or STA interfaces
|
||||
- * at the moment. */
|
||||
- if (ah->num_adhoc_vifs ||
|
||||
- (ah->nvifs && vif->type == NL80211_IFTYPE_ADHOC)) {
|
||||
+ /* Don't allow more than one ad-hoc interface */
|
||||
+ if (ah->num_adhoc_vifs && vif->type == NL80211_IFTYPE_ADHOC) {
|
||||
ATH5K_ERR(ah, "Only one single ad-hoc interface is allowed.\n");
|
||||
ret = -ELNRNG;
|
||||
goto end;
|
||||
--- a/drivers/net/wireless/ath/ath5k/base.c
|
||||
+++ b/drivers/net/wireless/ath/ath5k/base.c
|
||||
@@ -1964,7 +1964,7 @@ ath5k_beacon_send(struct ath5k_hw *ah)
|
||||
}
|
||||
|
||||
if ((ah->opmode == NL80211_IFTYPE_AP && ah->num_ap_vifs +
|
||||
- ah->num_mesh_vifs > 1) ||
|
||||
+ ah->num_adhoc_vifs + ah->num_mesh_vifs > 1) ||
|
||||
ah->opmode == NL80211_IFTYPE_MESH_POINT) {
|
||||
u64 tsf = ath5k_hw_get_tsf64(ah);
|
||||
u32 tsftu = TSF_TO_TU(tsf);
|
||||
@@ -2050,7 +2050,7 @@ ath5k_beacon_update_timers(struct ath5k_
|
||||
|
||||
intval = ah->bintval & AR5K_BEACON_PERIOD;
|
||||
if (ah->opmode == NL80211_IFTYPE_AP && ah->num_ap_vifs
|
||||
- + ah->num_mesh_vifs > 1) {
|
||||
+ + ah->num_adhoc_vifs + ah->num_mesh_vifs > 1) {
|
||||
intval /= ATH_BCBUF; /* staggered multi-bss beacons */
|
||||
if (intval < 15)
|
||||
ATH5K_WARN(ah, "intval %u is too low, min 15\n",
|
||||
@@ -2516,6 +2516,7 @@ static const struct ieee80211_iface_limi
|
||||
BIT(NL80211_IFTYPE_MESH_POINT) |
|
||||
#endif
|
||||
BIT(NL80211_IFTYPE_AP) },
|
||||
+ { .max = 1, .types = BIT(NL80211_IFTYPE_ADHOC) },
|
||||
};
|
||||
|
||||
static const struct ieee80211_iface_combination if_comb = {
|
||||
18
mac80211/patches/ath/420-ath5k_disable_fast_cc.patch
Normal file
18
mac80211/patches/ath/420-ath5k_disable_fast_cc.patch
Normal file
@@ -0,0 +1,18 @@
|
||||
--- a/drivers/net/wireless/ath/ath5k/reset.c
|
||||
+++ b/drivers/net/wireless/ath/ath5k/reset.c
|
||||
@@ -1154,6 +1154,7 @@ ath5k_hw_reset(struct ath5k_hw *ah, enum
|
||||
tsf_lo = 0;
|
||||
mode = 0;
|
||||
|
||||
+#if 0
|
||||
/*
|
||||
* Sanity check for fast flag
|
||||
* Fast channel change only available
|
||||
@@ -1161,6 +1162,7 @@ ath5k_hw_reset(struct ath5k_hw *ah, enum
|
||||
*/
|
||||
if (fast && (ah->ah_radio != AR5K_RF2413) &&
|
||||
(ah->ah_radio != AR5K_RF5413))
|
||||
+#endif
|
||||
fast = false;
|
||||
|
||||
/* Disable sleep clock operation
|
||||
33
mac80211/patches/ath/430-add_ath5k_platform.patch
Normal file
33
mac80211/patches/ath/430-add_ath5k_platform.patch
Normal file
@@ -0,0 +1,33 @@
|
||||
--- /dev/null
|
||||
+++ b/include/linux/ath5k_platform.h
|
||||
@@ -0,0 +1,30 @@
|
||||
+/*
|
||||
+ * Copyright (c) 2008 Atheros Communications Inc.
|
||||
+ * Copyright (c) 2009 Gabor Juhos <juhosg@openwrt.org>
|
||||
+ * Copyright (c) 2009 Imre Kaloz <kaloz@openwrt.org>
|
||||
+ * Copyright (c) 2010 Daniel Golle <daniel.golle@gmail.com>
|
||||
+ *
|
||||
+ * Permission to use, copy, modify, and/or distribute this software for any
|
||||
+ * purpose with or without fee is hereby granted, provided that the above
|
||||
+ * copyright notice and this permission notice appear in all copies.
|
||||
+ *
|
||||
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
||||
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
||||
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
||||
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
||||
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
||||
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
+ */
|
||||
+
|
||||
+#ifndef _LINUX_ATH5K_PLATFORM_H
|
||||
+#define _LINUX_ATH5K_PLATFORM_H
|
||||
+
|
||||
+#define ATH5K_PLAT_EEP_MAX_WORDS 2048
|
||||
+
|
||||
+struct ath5k_platform_data {
|
||||
+ u16 *eeprom_data;
|
||||
+ u8 *macaddr;
|
||||
+};
|
||||
+
|
||||
+#endif /* _LINUX_ATH5K_PLATFORM_H */
|
||||
@@ -0,0 +1,56 @@
|
||||
--- a/drivers/net/wireless/ath/ath5k/pci.c
|
||||
+++ b/drivers/net/wireless/ath/ath5k/pci.c
|
||||
@@ -20,6 +20,7 @@
|
||||
#include <linux/pci.h>
|
||||
#include <linux/etherdevice.h>
|
||||
#include <linux/module.h>
|
||||
+#include <linux/ath5k_platform.h>
|
||||
#include "../ath.h"
|
||||
#include "ath5k.h"
|
||||
#include "debug.h"
|
||||
@@ -71,7 +72,7 @@ static void ath5k_pci_read_cachesize(str
|
||||
}
|
||||
|
||||
/*
|
||||
- * Read from eeprom
|
||||
+ * Read from eeprom or platform_data
|
||||
*/
|
||||
static bool
|
||||
ath5k_pci_eeprom_read(struct ath_common *common, u32 offset, u16 *data)
|
||||
@@ -79,6 +80,19 @@ ath5k_pci_eeprom_read(struct ath_common
|
||||
struct ath5k_hw *ah = (struct ath5k_hw *) common->ah;
|
||||
u32 status, timeout;
|
||||
|
||||
+ struct ath5k_platform_data *pdata = NULL;
|
||||
+
|
||||
+ if (ah->pdev)
|
||||
+ pdata = ah->pdev->dev.platform_data;
|
||||
+
|
||||
+ if (pdata && pdata->eeprom_data && pdata->eeprom_data[61] == AR5K_EEPROM_MAGIC_VALUE) {
|
||||
+ if (offset >= ATH5K_PLAT_EEP_MAX_WORDS)
|
||||
+ return false;
|
||||
+
|
||||
+ *data = pdata->eeprom_data[offset];
|
||||
+ return true;
|
||||
+ }
|
||||
+
|
||||
/*
|
||||
* Initialize EEPROM access
|
||||
*/
|
||||
@@ -122,6 +136,16 @@ static int ath5k_pci_eeprom_read_mac(str
|
||||
u16 data;
|
||||
int octet;
|
||||
|
||||
+ struct ath5k_platform_data *pdata = NULL;
|
||||
+
|
||||
+ if (ah->pdev)
|
||||
+ pdata = ah->pdev->dev.platform_data;
|
||||
+
|
||||
+ if (pdata && pdata->macaddr) {
|
||||
+ memcpy(mac, pdata->macaddr, ETH_ALEN);
|
||||
+ return 0;
|
||||
+ }
|
||||
+
|
||||
AR5K_EEPROM_READ(0x20, data);
|
||||
|
||||
for (offset = 0x1f, octet = 0, total = 0; offset >= 0x1d; offset--) {
|
||||
11
mac80211/patches/ath/432-ath5k_add_pciids.patch
Normal file
11
mac80211/patches/ath/432-ath5k_add_pciids.patch
Normal file
@@ -0,0 +1,11 @@
|
||||
--- a/drivers/net/wireless/ath/ath5k/pci.c
|
||||
+++ b/drivers/net/wireless/ath/ath5k/pci.c
|
||||
@@ -47,6 +47,8 @@ static const struct pci_device_id ath5k_
|
||||
{ PCI_VDEVICE(ATHEROS, 0x001b) }, /* 5413 Eagle */
|
||||
{ PCI_VDEVICE(ATHEROS, 0x001c) }, /* PCI-E cards */
|
||||
{ PCI_VDEVICE(ATHEROS, 0x001d) }, /* 2417 Nala */
|
||||
+ { PCI_VDEVICE(ATHEROS, 0xff16) }, /* 2413,2414 sx76x on lantiq_danube */
|
||||
+ { PCI_VDEVICE(ATHEROS, 0xff1a) }, /* 2417 arv45xx on lantiq_danube */
|
||||
{ PCI_VDEVICE(ATHEROS, 0xff1b) }, /* AR5BXB63 */
|
||||
{ 0 }
|
||||
};
|
||||
142
mac80211/patches/ath/440-ath5k_channel_bw_debugfs.patch
Normal file
142
mac80211/patches/ath/440-ath5k_channel_bw_debugfs.patch
Normal file
@@ -0,0 +1,142 @@
|
||||
This adds a bwmode debugfs file which can be used to set alternate
|
||||
channel operating bandwidths. Only tested with AR5413 and only at
|
||||
5 and 20 mhz channels.
|
||||
|
||||
Signed-off-by: Pat Erley <pat-lkml at erley.org>
|
||||
---
|
||||
Other devices will need to be added to the switch in write_file_bwmode
|
||||
|
||||
drivers/net/wireless/ath/ath5k/debug.c | 86 ++++++++++++++++++++++++++++++++
|
||||
1 files changed, 86 insertions(+), 0 deletions(-)
|
||||
|
||||
--- a/drivers/net/wireless/ath/ath5k/debug.c
|
||||
+++ b/drivers/net/wireless/ath/ath5k/debug.c
|
||||
@@ -822,6 +822,97 @@ static const struct file_operations fops
|
||||
.llseek = default_llseek,
|
||||
};
|
||||
|
||||
+/* debugfs: bwmode */
|
||||
+
|
||||
+static ssize_t read_file_bwmode(struct file *file, char __user *user_buf,
|
||||
+ size_t count, loff_t *ppos)
|
||||
+{
|
||||
+ struct ath5k_hw *ah = file->private_data;
|
||||
+ char buf[15];
|
||||
+ unsigned int len = 0;
|
||||
+
|
||||
+ int cur_ah_bwmode = ah->ah_bwmode_debug;
|
||||
+
|
||||
+#define print_selected(MODE, LABEL) \
|
||||
+ if (cur_ah_bwmode == MODE) \
|
||||
+ len += snprintf(buf+len, sizeof(buf)-len, "[%s]", LABEL); \
|
||||
+ else \
|
||||
+ len += snprintf(buf+len, sizeof(buf)-len, "%s", LABEL); \
|
||||
+ len += snprintf(buf+len, sizeof(buf)-len, " ");
|
||||
+
|
||||
+ print_selected(AR5K_BWMODE_5MHZ, "5");
|
||||
+ print_selected(AR5K_BWMODE_10MHZ, "10");
|
||||
+ print_selected(AR5K_BWMODE_DEFAULT, "20");
|
||||
+ print_selected(AR5K_BWMODE_40MHZ, "40");
|
||||
+#undef print_selected
|
||||
+
|
||||
+ len += snprintf(buf+len, sizeof(buf)-len, "\n");
|
||||
+
|
||||
+ return simple_read_from_buffer(user_buf, count, ppos, buf, len);
|
||||
+}
|
||||
+
|
||||
+static ssize_t write_file_bwmode(struct file *file,
|
||||
+ const char __user *userbuf,
|
||||
+ size_t count, loff_t *ppos)
|
||||
+{
|
||||
+ struct ath5k_hw *ah = file->private_data;
|
||||
+ char buf[3];
|
||||
+ int bw = 20;
|
||||
+ int tobwmode = AR5K_BWMODE_DEFAULT;
|
||||
+
|
||||
+ if (copy_from_user(buf, userbuf, min(count, sizeof(buf))))
|
||||
+ return -EFAULT;
|
||||
+
|
||||
+ /* TODO: Add check for active interface */
|
||||
+
|
||||
+ if(strncmp(buf, "5", 1) == 0 ) {
|
||||
+ tobwmode = AR5K_BWMODE_5MHZ;
|
||||
+ bw = 5;
|
||||
+ } else if ( strncmp(buf, "10", 2) == 0 ) {
|
||||
+ tobwmode = AR5K_BWMODE_10MHZ;
|
||||
+ bw = 10;
|
||||
+ } else if ( strncmp(buf, "20", 2) == 0 ) {
|
||||
+ tobwmode = AR5K_BWMODE_DEFAULT;
|
||||
+ bw = 20;
|
||||
+ } else if ( strncmp(buf, "40", 2) == 0 ) {
|
||||
+ tobwmode = AR5K_BWMODE_40MHZ;
|
||||
+ bw = 40;
|
||||
+ } else
|
||||
+ return -EINVAL;
|
||||
+
|
||||
+ ATH5K_INFO(ah, "Changing to %imhz channel width[%i]\n",
|
||||
+ bw, tobwmode);
|
||||
+
|
||||
+ switch (ah->ah_radio) {
|
||||
+ /* TODO: only define radios that actually support 5/10mhz channels */
|
||||
+ case AR5K_RF5413:
|
||||
+ case AR5K_RF5110:
|
||||
+ case AR5K_RF5111:
|
||||
+ case AR5K_RF5112:
|
||||
+ case AR5K_RF2413:
|
||||
+ case AR5K_RF2316:
|
||||
+ case AR5K_RF2317:
|
||||
+ case AR5K_RF2425:
|
||||
+ if(ah->ah_bwmode_debug != tobwmode) {
|
||||
+ mutex_lock(&ah->lock);
|
||||
+ ah->ah_bwmode = tobwmode;
|
||||
+ ah->ah_bwmode_debug = tobwmode;
|
||||
+ mutex_unlock(&ah->lock);
|
||||
+ }
|
||||
+ break;
|
||||
+ default:
|
||||
+ return -EOPNOTSUPP;
|
||||
+ }
|
||||
+ return count;
|
||||
+}
|
||||
+
|
||||
+static const struct file_operations fops_bwmode = {
|
||||
+ .read = read_file_bwmode,
|
||||
+ .write = write_file_bwmode,
|
||||
+ .open = simple_open,
|
||||
+ .owner = THIS_MODULE,
|
||||
+ .llseek = default_llseek,
|
||||
+};
|
||||
|
||||
/* debugfs: queues etc */
|
||||
|
||||
@@ -1016,6 +1107,8 @@ ath5k_debug_init_device(struct ath5k_hw
|
||||
debugfs_create_file("queue", 0600, phydir, ah, &fops_queue);
|
||||
debugfs_create_bool("32khz_clock", 0600, phydir,
|
||||
&ah->ah_use_32khz_clock);
|
||||
+ debugfs_create_file("bwmode", S_IWUSR | S_IRUSR, phydir, ah,
|
||||
+ &fops_bwmode);
|
||||
}
|
||||
|
||||
/* functions used in other places */
|
||||
--- a/drivers/net/wireless/ath/ath5k/ath5k.h
|
||||
+++ b/drivers/net/wireless/ath/ath5k/ath5k.h
|
||||
@@ -1372,6 +1372,7 @@ struct ath5k_hw {
|
||||
u8 ah_coverage_class;
|
||||
bool ah_ack_bitrate_high;
|
||||
u8 ah_bwmode;
|
||||
+ u8 ah_bwmode_debug;
|
||||
bool ah_short_slot;
|
||||
|
||||
/* Antenna Control */
|
||||
--- a/drivers/net/wireless/ath/ath5k/base.c
|
||||
+++ b/drivers/net/wireless/ath/ath5k/base.c
|
||||
@@ -466,6 +466,9 @@ ath5k_chan_set(struct ath5k_hw *ah, stru
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
+ if (ah->ah_bwmode_debug != AR5K_BWMODE_DEFAULT)
|
||||
+ ah->ah_bwmode = ah->ah_bwmode_debug;
|
||||
+
|
||||
/*
|
||||
* To switch channels clear any pending DMA operations;
|
||||
* wait long enough for the RX fifo to drain, reset the
|
||||
@@ -0,0 +1,34 @@
|
||||
From d946085ff5a331de64e91a2e3c96b9ca79d740f5 Mon Sep 17 00:00:00 2001
|
||||
From: David Bauer <mail@david-bauer.net>
|
||||
Date: Mon, 15 Jun 2020 00:10:34 +0200
|
||||
Subject: [PATCH] ath9k: enabled MFP capability unconditionally
|
||||
|
||||
ath9k will already fallback on software-crypto for chipsets not
|
||||
supporting IEEE802.11w (MFP). So advertising MFP is not dependent
|
||||
on disabling HW crypto for all traffic entirely.
|
||||
|
||||
Signed-off-by: David Bauer <mail@david-bauer.net>
|
||||
---
|
||||
drivers/net/wireless/ath/ath9k/init.c | 4 +---
|
||||
1 file changed, 1 insertion(+), 3 deletions(-)
|
||||
|
||||
--- a/drivers/net/wireless/ath/ath9k/init.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/init.c
|
||||
@@ -928,6 +928,7 @@ static void ath9k_set_hw_capab(struct at
|
||||
ieee80211_hw_set(hw, HOST_BROADCAST_PS_BUFFERING);
|
||||
ieee80211_hw_set(hw, SUPPORT_FAST_XMIT);
|
||||
ieee80211_hw_set(hw, SUPPORTS_CLONED_SKBS);
|
||||
+ ieee80211_hw_set(hw, MFP_CAPABLE);
|
||||
|
||||
if (ath9k_ps_enable)
|
||||
ieee80211_hw_set(hw, SUPPORTS_PS);
|
||||
@@ -940,9 +941,6 @@ static void ath9k_set_hw_capab(struct at
|
||||
IEEE80211_RADIOTAP_MCS_HAVE_STBC;
|
||||
}
|
||||
|
||||
- if (AR_SREV_9160_10_OR_LATER(sc->sc_ah) || ath9k_modparam_nohwcrypt)
|
||||
- ieee80211_hw_set(hw, MFP_CAPABLE);
|
||||
-
|
||||
hw->wiphy->features |= NL80211_FEATURE_ACTIVE_MONITOR |
|
||||
NL80211_FEATURE_AP_MODE_CHAN_WIDTH_CHANGE |
|
||||
NL80211_FEATURE_P2P_GO_CTWIN;
|
||||
65
mac80211/patches/ath/500-ath9k_eeprom_debugfs.patch
Normal file
65
mac80211/patches/ath/500-ath9k_eeprom_debugfs.patch
Normal file
@@ -0,0 +1,65 @@
|
||||
--- a/drivers/net/wireless/ath/ath9k/debug.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/debug.c
|
||||
@@ -1361,6 +1361,53 @@ void ath9k_deinit_debug(struct ath_softc
|
||||
ath9k_cmn_spectral_deinit_debug(&sc->spec_priv);
|
||||
}
|
||||
|
||||
+static ssize_t read_file_eeprom(struct file *file, char __user *user_buf,
|
||||
+ size_t count, loff_t *ppos)
|
||||
+{
|
||||
+ struct ath_softc *sc = file->private_data;
|
||||
+ struct ath_hw *ah = sc->sc_ah;
|
||||
+ struct ath_common *common = ath9k_hw_common(ah);
|
||||
+ int bytes = 0;
|
||||
+ int pos = *ppos;
|
||||
+ int size = 4096;
|
||||
+ u16 val;
|
||||
+ int i;
|
||||
+
|
||||
+ if (AR_SREV_9300_20_OR_LATER(ah))
|
||||
+ size = 16384;
|
||||
+
|
||||
+ if (*ppos < 0)
|
||||
+ return -EINVAL;
|
||||
+
|
||||
+ if (count > size - *ppos)
|
||||
+ count = size - *ppos;
|
||||
+
|
||||
+ for (i = *ppos / 2; count > 0; count -= bytes, *ppos += bytes, i++) {
|
||||
+ void *from = &val;
|
||||
+
|
||||
+ if (!common->bus_ops->eeprom_read(common, i, &val))
|
||||
+ val = 0xffff;
|
||||
+
|
||||
+ if (*ppos % 2) {
|
||||
+ from++;
|
||||
+ bytes = 1;
|
||||
+ } else if (count == 1) {
|
||||
+ bytes = 1;
|
||||
+ } else {
|
||||
+ bytes = 2;
|
||||
+ }
|
||||
+ copy_to_user(user_buf, from, bytes);
|
||||
+ user_buf += bytes;
|
||||
+ }
|
||||
+ return *ppos - pos;
|
||||
+}
|
||||
+
|
||||
+static const struct file_operations fops_eeprom = {
|
||||
+ .read = read_file_eeprom,
|
||||
+ .open = simple_open,
|
||||
+ .owner = THIS_MODULE
|
||||
+};
|
||||
+
|
||||
int ath9k_init_debug(struct ath_hw *ah)
|
||||
{
|
||||
struct ath_common *common = ath9k_hw_common(ah);
|
||||
@@ -1380,6 +1427,8 @@ int ath9k_init_debug(struct ath_hw *ah)
|
||||
ath9k_tx99_init_debug(sc);
|
||||
ath9k_cmn_spectral_init_debug(&sc->spec_priv, sc->debug.debugfs_phy);
|
||||
|
||||
+ debugfs_create_file("eeprom", S_IRUSR, sc->debug.debugfs_phy, sc,
|
||||
+ &fops_eeprom);
|
||||
debugfs_create_devm_seqfile(sc->dev, "dma", sc->debug.debugfs_phy,
|
||||
read_file_dma);
|
||||
debugfs_create_devm_seqfile(sc->dev, "interrupt", sc->debug.debugfs_phy,
|
||||
34
mac80211/patches/ath/501-ath9k_ahb_init.patch
Normal file
34
mac80211/patches/ath/501-ath9k_ahb_init.patch
Normal file
@@ -0,0 +1,34 @@
|
||||
--- a/drivers/net/wireless/ath/ath9k/init.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/init.c
|
||||
@@ -1143,25 +1143,25 @@ static int __init ath9k_init(void)
|
||||
{
|
||||
int error;
|
||||
|
||||
- error = ath_pci_init();
|
||||
+ error = ath_ahb_init();
|
||||
if (error < 0) {
|
||||
- pr_err("No PCI devices found, driver not installed\n");
|
||||
error = -ENODEV;
|
||||
goto err_out;
|
||||
}
|
||||
|
||||
- error = ath_ahb_init();
|
||||
+ error = ath_pci_init();
|
||||
if (error < 0) {
|
||||
+ pr_err("No PCI devices found, driver not installed\n");
|
||||
error = -ENODEV;
|
||||
- goto err_pci_exit;
|
||||
+ goto err_ahb_exit;
|
||||
}
|
||||
|
||||
dmi_check_system(ath9k_quirks);
|
||||
|
||||
return 0;
|
||||
|
||||
- err_pci_exit:
|
||||
- ath_pci_exit();
|
||||
+ err_ahb_exit:
|
||||
+ ath_ahb_exit();
|
||||
err_out:
|
||||
return error;
|
||||
}
|
||||
18
mac80211/patches/ath/510-ath9k_intr_mitigation_tweak.patch
Normal file
18
mac80211/patches/ath/510-ath9k_intr_mitigation_tweak.patch
Normal file
@@ -0,0 +1,18 @@
|
||||
--- a/drivers/net/wireless/ath/ath9k/hw.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/hw.c
|
||||
@@ -403,13 +403,8 @@ static void ath9k_hw_init_config(struct
|
||||
|
||||
ah->config.rx_intr_mitigation = true;
|
||||
|
||||
- if (AR_SREV_9300_20_OR_LATER(ah)) {
|
||||
- ah->config.rimt_last = 500;
|
||||
- ah->config.rimt_first = 2000;
|
||||
- } else {
|
||||
- ah->config.rimt_last = 250;
|
||||
- ah->config.rimt_first = 700;
|
||||
- }
|
||||
+ ah->config.rimt_last = 250;
|
||||
+ ah->config.rimt_first = 500;
|
||||
|
||||
if (AR_SREV_9462(ah) || AR_SREV_9565(ah))
|
||||
ah->config.pll_pwrsave = 7;
|
||||
11
mac80211/patches/ath/511-ath9k_reduce_rxbuf.patch
Normal file
11
mac80211/patches/ath/511-ath9k_reduce_rxbuf.patch
Normal file
@@ -0,0 +1,11 @@
|
||||
--- a/drivers/net/wireless/ath/ath9k/ath9k.h
|
||||
+++ b/drivers/net/wireless/ath/ath9k/ath9k.h
|
||||
@@ -88,7 +88,7 @@ int ath_descdma_setup(struct ath_softc *
|
||||
(_l) &= ((_sz) - 1); \
|
||||
} while (0)
|
||||
|
||||
-#define ATH_RXBUF 512
|
||||
+#define ATH_RXBUF 256
|
||||
#define ATH_TXBUF 512
|
||||
#define ATH_TXBUF_RESERVE 5
|
||||
#define ATH_TXMAXTRY 13
|
||||
125
mac80211/patches/ath/512-ath9k_channelbw_debugfs.patch
Normal file
125
mac80211/patches/ath/512-ath9k_channelbw_debugfs.patch
Normal file
@@ -0,0 +1,125 @@
|
||||
--- a/drivers/net/wireless/ath/ath9k/debug.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/debug.c
|
||||
@@ -1408,6 +1408,52 @@ static const struct file_operations fops
|
||||
.owner = THIS_MODULE
|
||||
};
|
||||
|
||||
+
|
||||
+static ssize_t read_file_chan_bw(struct file *file, char __user *user_buf,
|
||||
+ size_t count, loff_t *ppos)
|
||||
+{
|
||||
+ struct ath_softc *sc = file->private_data;
|
||||
+ struct ath_common *common = ath9k_hw_common(sc->sc_ah);
|
||||
+ char buf[32];
|
||||
+ unsigned int len;
|
||||
+
|
||||
+ len = sprintf(buf, "0x%08x\n", common->chan_bw);
|
||||
+ return simple_read_from_buffer(user_buf, count, ppos, buf, len);
|
||||
+}
|
||||
+
|
||||
+static ssize_t write_file_chan_bw(struct file *file, const char __user *user_buf,
|
||||
+ size_t count, loff_t *ppos)
|
||||
+{
|
||||
+ struct ath_softc *sc = file->private_data;
|
||||
+ struct ath_common *common = ath9k_hw_common(sc->sc_ah);
|
||||
+ unsigned long chan_bw;
|
||||
+ char buf[32];
|
||||
+ ssize_t len;
|
||||
+
|
||||
+ len = min(count, sizeof(buf) - 1);
|
||||
+ if (copy_from_user(buf, user_buf, len))
|
||||
+ return -EFAULT;
|
||||
+
|
||||
+ buf[len] = '\0';
|
||||
+ if (kstrtoul(buf, 0, &chan_bw))
|
||||
+ return -EINVAL;
|
||||
+
|
||||
+ common->chan_bw = chan_bw;
|
||||
+ if (!test_bit(ATH_OP_INVALID, &common->op_flags))
|
||||
+ ath9k_ops.config(sc->hw, IEEE80211_CONF_CHANGE_CHANNEL);
|
||||
+
|
||||
+ return count;
|
||||
+}
|
||||
+
|
||||
+static const struct file_operations fops_chanbw = {
|
||||
+ .read = read_file_chan_bw,
|
||||
+ .write = write_file_chan_bw,
|
||||
+ .open = simple_open,
|
||||
+ .owner = THIS_MODULE,
|
||||
+ .llseek = default_llseek,
|
||||
+};
|
||||
+
|
||||
+
|
||||
int ath9k_init_debug(struct ath_hw *ah)
|
||||
{
|
||||
struct ath_common *common = ath9k_hw_common(ah);
|
||||
@@ -1429,6 +1475,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("chanbw", S_IRUSR | S_IWUSR, sc->debug.debugfs_phy,
|
||||
+ sc, &fops_chanbw);
|
||||
debugfs_create_devm_seqfile(sc->dev, "dma", sc->debug.debugfs_phy,
|
||||
read_file_dma);
|
||||
debugfs_create_devm_seqfile(sc->dev, "interrupt", sc->debug.debugfs_phy,
|
||||
--- a/drivers/net/wireless/ath/ath.h
|
||||
+++ b/drivers/net/wireless/ath/ath.h
|
||||
@@ -149,6 +149,7 @@ struct ath_common {
|
||||
int debug_mask;
|
||||
enum ath_device_state state;
|
||||
unsigned long op_flags;
|
||||
+ u32 chan_bw;
|
||||
|
||||
struct ath_ani ani;
|
||||
|
||||
--- a/drivers/net/wireless/ath/ath9k/common.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/common.c
|
||||
@@ -297,11 +297,13 @@ EXPORT_SYMBOL(ath9k_cmn_get_hw_crypto_ke
|
||||
/*
|
||||
* Update internal channel flags.
|
||||
*/
|
||||
-static void ath9k_cmn_update_ichannel(struct ath9k_channel *ichan,
|
||||
+static void ath9k_cmn_update_ichannel(struct ath_common *common,
|
||||
+ struct ath9k_channel *ichan,
|
||||
struct cfg80211_chan_def *chandef)
|
||||
{
|
||||
struct ieee80211_channel *chan = chandef->chan;
|
||||
u16 flags = 0;
|
||||
+ int width;
|
||||
|
||||
ichan->channel = chan->center_freq;
|
||||
ichan->chan = chan;
|
||||
@@ -309,7 +311,19 @@ static void ath9k_cmn_update_ichannel(st
|
||||
if (chan->band == NL80211_BAND_5GHZ)
|
||||
flags |= CHANNEL_5GHZ;
|
||||
|
||||
- switch (chandef->width) {
|
||||
+ switch (common->chan_bw) {
|
||||
+ case 5:
|
||||
+ width = NL80211_CHAN_WIDTH_5;
|
||||
+ break;
|
||||
+ case 10:
|
||||
+ width = NL80211_CHAN_WIDTH_10;
|
||||
+ break;
|
||||
+ default:
|
||||
+ width = chandef->width;
|
||||
+ break;
|
||||
+ }
|
||||
+
|
||||
+ switch (width) {
|
||||
case NL80211_CHAN_WIDTH_5:
|
||||
flags |= CHANNEL_QUARTER;
|
||||
break;
|
||||
@@ -342,10 +356,11 @@ struct ath9k_channel *ath9k_cmn_get_chan
|
||||
struct cfg80211_chan_def *chandef)
|
||||
{
|
||||
struct ieee80211_channel *curchan = chandef->chan;
|
||||
+ struct ath_common *common = ath9k_hw_common(ah);
|
||||
struct ath9k_channel *channel;
|
||||
|
||||
channel = &ah->channels[curchan->hw_value];
|
||||
- ath9k_cmn_update_ichannel(channel, chandef);
|
||||
+ ath9k_cmn_update_ichannel(common, channel, chandef);
|
||||
|
||||
return channel;
|
||||
}
|
||||
30
mac80211/patches/ath/513-ath9k_add_pci_ids.patch
Normal file
30
mac80211/patches/ath/513-ath9k_add_pci_ids.patch
Normal file
@@ -0,0 +1,30 @@
|
||||
--- a/drivers/net/wireless/ath/ath9k/hw.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/hw.c
|
||||
@@ -663,6 +663,7 @@ int ath9k_hw_init(struct ath_hw *ah)
|
||||
|
||||
/* These are all the AR5008/AR9001/AR9002/AR9003 hardware family of chipsets */
|
||||
switch (ah->hw_version.devid) {
|
||||
+ case AR9300_DEVID_INVALID:
|
||||
case AR5416_DEVID_PCI:
|
||||
case AR5416_DEVID_PCIE:
|
||||
case AR5416_AR9100_DEVID:
|
||||
--- a/drivers/net/wireless/ath/ath9k/hw.h
|
||||
+++ b/drivers/net/wireless/ath/ath9k/hw.h
|
||||
@@ -36,6 +36,7 @@
|
||||
|
||||
#define ATHEROS_VENDOR_ID 0x168c
|
||||
|
||||
+#define AR9300_DEVID_INVALID 0xabcd
|
||||
#define AR5416_DEVID_PCI 0x0023
|
||||
#define AR5416_DEVID_PCIE 0x0024
|
||||
#define AR9160_DEVID_PCI 0x0027
|
||||
--- a/drivers/net/wireless/ath/ath9k/pci.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/pci.c
|
||||
@@ -774,6 +774,7 @@ static const struct pci_device_id ath_pc
|
||||
.driver_data = ATH9K_PCI_BT_ANT_DIV },
|
||||
#endif
|
||||
|
||||
+ { PCI_VDEVICE(ATHEROS, 0xabcd) }, /* PCI-E internal chip default ID */
|
||||
{ 0 }
|
||||
};
|
||||
|
||||
267
mac80211/patches/ath/530-ath9k_extra_leds.patch
Normal file
267
mac80211/patches/ath/530-ath9k_extra_leds.patch
Normal file
@@ -0,0 +1,267 @@
|
||||
--- a/drivers/net/wireless/ath/ath9k/ath9k.h
|
||||
+++ b/drivers/net/wireless/ath/ath9k/ath9k.h
|
||||
@@ -843,6 +843,9 @@ static inline int ath9k_dump_btcoex(stru
|
||||
#ifdef CPTCFG_MAC80211_LEDS
|
||||
void ath_init_leds(struct ath_softc *sc);
|
||||
void ath_deinit_leds(struct ath_softc *sc);
|
||||
+int ath_create_gpio_led(struct ath_softc *sc, int gpio, const char *name,
|
||||
+ const char *trigger, bool active_low);
|
||||
+
|
||||
#else
|
||||
static inline void ath_init_leds(struct ath_softc *sc)
|
||||
{
|
||||
@@ -979,6 +982,13 @@ void ath_ant_comb_scan(struct ath_softc
|
||||
|
||||
#define ATH9K_NUM_CHANCTX 2 /* supports 2 operating channels */
|
||||
|
||||
+struct ath_led {
|
||||
+ struct list_head list;
|
||||
+ struct ath_softc *sc;
|
||||
+ const struct gpio_led *gpio;
|
||||
+ struct led_classdev cdev;
|
||||
+};
|
||||
+
|
||||
struct ath_softc {
|
||||
struct ieee80211_hw *hw;
|
||||
struct device *dev;
|
||||
@@ -1032,9 +1042,8 @@ struct ath_softc {
|
||||
spinlock_t chan_lock;
|
||||
|
||||
#ifdef CPTCFG_MAC80211_LEDS
|
||||
- bool led_registered;
|
||||
- char led_name[32];
|
||||
- struct led_classdev led_cdev;
|
||||
+ const char *led_default_trigger;
|
||||
+ struct list_head leds;
|
||||
#endif
|
||||
|
||||
#ifdef CPTCFG_ATH9K_DEBUGFS
|
||||
--- a/drivers/net/wireless/ath/ath9k/gpio.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/gpio.c
|
||||
@@ -39,61 +39,111 @@ static void ath_fill_led_pin(struct ath_
|
||||
else
|
||||
ah->led_pin = ATH_LED_PIN_DEF;
|
||||
}
|
||||
+}
|
||||
+
|
||||
+static void ath_led_brightness(struct led_classdev *led_cdev,
|
||||
+ enum led_brightness brightness)
|
||||
+{
|
||||
+ struct ath_led *led = container_of(led_cdev, struct ath_led, cdev);
|
||||
+ struct ath_softc *sc = led->sc;
|
||||
+
|
||||
+ ath9k_ps_wakeup(sc);
|
||||
+ ath9k_hw_set_gpio(sc->sc_ah, led->gpio->gpio,
|
||||
+ (brightness != LED_OFF) ^ led->gpio->active_low);
|
||||
+ ath9k_ps_restore(sc);
|
||||
+}
|
||||
+
|
||||
+static int ath_add_led(struct ath_softc *sc, struct ath_led *led)
|
||||
+{
|
||||
+ const struct gpio_led *gpio = led->gpio;
|
||||
+ int ret;
|
||||
+
|
||||
+ led->cdev.name = gpio->name;
|
||||
+ led->cdev.default_trigger = gpio->default_trigger;
|
||||
+ led->cdev.brightness_set = ath_led_brightness;
|
||||
+
|
||||
+ ret = led_classdev_register(wiphy_dev(sc->hw->wiphy), &led->cdev);
|
||||
+ if (ret < 0)
|
||||
+ return ret;
|
||||
+
|
||||
+ led->sc = sc;
|
||||
+ list_add(&led->list, &sc->leds);
|
||||
|
||||
/* Configure gpio for output */
|
||||
- ath9k_hw_gpio_request_out(ah, ah->led_pin, "ath9k-led",
|
||||
+ ath9k_hw_gpio_request_out(sc->sc_ah, gpio->gpio, gpio->name,
|
||||
AR_GPIO_OUTPUT_MUX_AS_OUTPUT);
|
||||
|
||||
- /* LED off, active low */
|
||||
- ath9k_hw_set_gpio(ah, ah->led_pin, ah->config.led_active_high ? 0 : 1);
|
||||
+ /* LED off */
|
||||
+ ath9k_hw_set_gpio(sc->sc_ah, gpio->gpio, gpio->active_low);
|
||||
+
|
||||
+ return 0;
|
||||
}
|
||||
|
||||
-static void ath_led_brightness(struct led_classdev *led_cdev,
|
||||
- enum led_brightness brightness)
|
||||
+int ath_create_gpio_led(struct ath_softc *sc, int gpio_num, const char *name,
|
||||
+ const char *trigger, bool active_low)
|
||||
{
|
||||
- struct ath_softc *sc = container_of(led_cdev, struct ath_softc, led_cdev);
|
||||
- u32 val = (brightness == LED_OFF);
|
||||
+ struct ath_led *led;
|
||||
+ struct gpio_led *gpio;
|
||||
+ char *_name;
|
||||
+ int ret;
|
||||
|
||||
- if (sc->sc_ah->config.led_active_high)
|
||||
- val = !val;
|
||||
+ led = kzalloc(sizeof(*led) + sizeof(*gpio) + strlen(name) + 1,
|
||||
+ GFP_KERNEL);
|
||||
+ if (!led)
|
||||
+ return -ENOMEM;
|
||||
+
|
||||
+ led->gpio = gpio = (struct gpio_led *) (led + 1);
|
||||
+ _name = (char *) (led->gpio + 1);
|
||||
+
|
||||
+ strcpy(_name, name);
|
||||
+ gpio->name = _name;
|
||||
+ gpio->gpio = gpio_num;
|
||||
+ gpio->active_low = active_low;
|
||||
+ gpio->default_trigger = trigger;
|
||||
+
|
||||
+ ret = ath_add_led(sc, led);
|
||||
+ if (unlikely(ret < 0))
|
||||
+ kfree(led);
|
||||
|
||||
- ath9k_hw_set_gpio(sc->sc_ah, sc->sc_ah->led_pin, val);
|
||||
+ return ret;
|
||||
}
|
||||
|
||||
void ath_deinit_leds(struct ath_softc *sc)
|
||||
{
|
||||
- if (!sc->led_registered)
|
||||
- return;
|
||||
+ struct ath_led *led;
|
||||
|
||||
- ath_led_brightness(&sc->led_cdev, LED_OFF);
|
||||
- led_classdev_unregister(&sc->led_cdev);
|
||||
-
|
||||
- ath9k_hw_gpio_free(sc->sc_ah, sc->sc_ah->led_pin);
|
||||
+ while (!list_empty(&sc->leds)) {
|
||||
+ led = list_first_entry(&sc->leds, struct ath_led, list);
|
||||
+ list_del(&led->list);
|
||||
+ ath_led_brightness(&led->cdev, LED_OFF);
|
||||
+ led_classdev_unregister(&led->cdev);
|
||||
+ ath9k_hw_gpio_free(sc->sc_ah, led->gpio->gpio);
|
||||
+ kfree(led);
|
||||
+ }
|
||||
}
|
||||
|
||||
void ath_init_leds(struct ath_softc *sc)
|
||||
{
|
||||
- int ret;
|
||||
+ char led_name[32];
|
||||
+ const char *trigger;
|
||||
+
|
||||
+ INIT_LIST_HEAD(&sc->leds);
|
||||
|
||||
if (AR_SREV_9100(sc->sc_ah))
|
||||
return;
|
||||
|
||||
ath_fill_led_pin(sc);
|
||||
|
||||
- if (!ath9k_led_blink)
|
||||
- sc->led_cdev.default_trigger =
|
||||
- ieee80211_get_radio_led_name(sc->hw);
|
||||
-
|
||||
- snprintf(sc->led_name, sizeof(sc->led_name),
|
||||
- "ath9k-%s", wiphy_name(sc->hw->wiphy));
|
||||
- sc->led_cdev.name = sc->led_name;
|
||||
- sc->led_cdev.brightness_set = ath_led_brightness;
|
||||
+ snprintf(led_name, sizeof(led_name), "ath9k-%s",
|
||||
+ wiphy_name(sc->hw->wiphy));
|
||||
|
||||
- ret = led_classdev_register(wiphy_dev(sc->hw->wiphy), &sc->led_cdev);
|
||||
- if (ret < 0)
|
||||
- return;
|
||||
+ if (ath9k_led_blink)
|
||||
+ trigger = sc->led_default_trigger;
|
||||
+ else
|
||||
+ trigger = ieee80211_get_radio_led_name(sc->hw);
|
||||
|
||||
- sc->led_registered = true;
|
||||
+ ath_create_gpio_led(sc, sc->sc_ah->led_pin, led_name, trigger,
|
||||
+ !sc->sc_ah->config.led_active_high);
|
||||
}
|
||||
#endif
|
||||
|
||||
--- a/drivers/net/wireless/ath/ath9k/init.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/init.c
|
||||
@@ -1055,7 +1055,7 @@ int ath9k_init_device(u16 devid, struct
|
||||
|
||||
#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,
|
||||
IEEE80211_TPT_LEDTRIG_FL_RADIO, ath9k_tpt_blink,
|
||||
ARRAY_SIZE(ath9k_tpt_blink));
|
||||
#endif
|
||||
--- a/drivers/net/wireless/ath/ath9k/debug.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/debug.c
|
||||
@@ -1453,6 +1453,61 @@ static const struct file_operations fops
|
||||
.llseek = default_llseek,
|
||||
};
|
||||
|
||||
+#ifdef CONFIG_MAC80211_LEDS
|
||||
+
|
||||
+static ssize_t write_file_gpio_led(struct file *file, const char __user *ubuf,
|
||||
+ size_t count, loff_t *ppos)
|
||||
+{
|
||||
+ struct ath_softc *sc = file->private_data;
|
||||
+ char buf[32], *str, *name, *c;
|
||||
+ ssize_t len;
|
||||
+ unsigned int gpio;
|
||||
+ bool active_low = false;
|
||||
+
|
||||
+ len = min(count, sizeof(buf) - 1);
|
||||
+ if (copy_from_user(buf, ubuf, len))
|
||||
+ return -EFAULT;
|
||||
+
|
||||
+ buf[len] = '\0';
|
||||
+ name = strchr(buf, ',');
|
||||
+ if (!name)
|
||||
+ return -EINVAL;
|
||||
+
|
||||
+ *(name++) = 0;
|
||||
+ if (!*name)
|
||||
+ return -EINVAL;
|
||||
+
|
||||
+ c = strchr(name, '\n');
|
||||
+ if (c)
|
||||
+ *c = 0;
|
||||
+
|
||||
+ str = buf;
|
||||
+ if (*str == '!') {
|
||||
+ str++;
|
||||
+ active_low = true;
|
||||
+ }
|
||||
+
|
||||
+ if (kstrtouint(str, 0, &gpio) < 0)
|
||||
+ return -EINVAL;
|
||||
+
|
||||
+ if (gpio >= sc->sc_ah->caps.num_gpio_pins)
|
||||
+ return -EINVAL;
|
||||
+
|
||||
+ if (ath_create_gpio_led(sc, gpio, name, NULL, active_low) < 0)
|
||||
+ return -EINVAL;
|
||||
+
|
||||
+ return count;
|
||||
+}
|
||||
+
|
||||
+static const struct file_operations fops_gpio_led = {
|
||||
+ .write = write_file_gpio_led,
|
||||
+ .open = simple_open,
|
||||
+ .owner = THIS_MODULE,
|
||||
+ .llseek = default_llseek,
|
||||
+};
|
||||
+
|
||||
+#endif
|
||||
+
|
||||
|
||||
int ath9k_init_debug(struct ath_hw *ah)
|
||||
{
|
||||
@@ -1477,6 +1532,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);
|
||||
+#ifdef CONFIG_MAC80211_LEDS
|
||||
+ debugfs_create_file("gpio_led", S_IWUSR,
|
||||
+ sc->debug.debugfs_phy, sc, &fops_gpio_led);
|
||||
+#endif
|
||||
debugfs_create_devm_seqfile(sc->dev, "dma", sc->debug.debugfs_phy,
|
||||
read_file_dma);
|
||||
debugfs_create_devm_seqfile(sc->dev, "interrupt", sc->debug.debugfs_phy,
|
||||
76
mac80211/patches/ath/531-ath9k_extra_platform_leds.patch
Normal file
76
mac80211/patches/ath/531-ath9k_extra_platform_leds.patch
Normal file
@@ -0,0 +1,76 @@
|
||||
--- a/include/linux/ath9k_platform.h
|
||||
+++ b/include/linux/ath9k_platform.h
|
||||
@@ -46,6 +46,9 @@ struct ath9k_platform_data {
|
||||
int (*external_reset)(void);
|
||||
|
||||
bool use_eeprom;
|
||||
+
|
||||
+ int num_leds;
|
||||
+ const struct gpio_led *leds;
|
||||
};
|
||||
|
||||
#endif /* _LINUX_ATH9K_PLATFORM_H */
|
||||
--- a/drivers/net/wireless/ath/ath9k/gpio.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/gpio.c
|
||||
@@ -15,6 +15,7 @@
|
||||
*/
|
||||
|
||||
#include "ath9k.h"
|
||||
+#include <linux/ath9k_platform.h>
|
||||
|
||||
/********************************/
|
||||
/* LED functions */
|
||||
@@ -108,6 +109,24 @@ int ath_create_gpio_led(struct ath_softc
|
||||
return ret;
|
||||
}
|
||||
|
||||
+static int ath_create_platform_led(struct ath_softc *sc,
|
||||
+ const struct gpio_led *gpio)
|
||||
+{
|
||||
+ struct ath_led *led;
|
||||
+ int ret;
|
||||
+
|
||||
+ led = kzalloc(sizeof(*led), GFP_KERNEL);
|
||||
+ if (!led)
|
||||
+ return -ENOMEM;
|
||||
+
|
||||
+ led->gpio = gpio;
|
||||
+ ret = ath_add_led(sc, led);
|
||||
+ if (ret < 0)
|
||||
+ kfree(led);
|
||||
+
|
||||
+ return ret;
|
||||
+}
|
||||
+
|
||||
void ath_deinit_leds(struct ath_softc *sc)
|
||||
{
|
||||
struct ath_led *led;
|
||||
@@ -124,8 +143,10 @@ void ath_deinit_leds(struct ath_softc *s
|
||||
|
||||
void ath_init_leds(struct ath_softc *sc)
|
||||
{
|
||||
+ struct ath9k_platform_data *pdata = sc->dev->platform_data;
|
||||
char led_name[32];
|
||||
const char *trigger;
|
||||
+ int i;
|
||||
|
||||
INIT_LIST_HEAD(&sc->leds);
|
||||
|
||||
@@ -134,6 +155,17 @@ void ath_init_leds(struct ath_softc *sc)
|
||||
|
||||
ath_fill_led_pin(sc);
|
||||
|
||||
+ if (pdata && pdata->leds && pdata->num_leds)
|
||||
+ for (i = 0; i < pdata->num_leds; i++) {
|
||||
+ if (pdata->leds[i].gpio == sc->sc_ah->led_pin)
|
||||
+ sc->sc_ah->led_pin = -1;
|
||||
+
|
||||
+ ath_create_platform_led(sc, &pdata->leds[i]);
|
||||
+ }
|
||||
+
|
||||
+ if (sc->sc_ah->led_pin < 0)
|
||||
+ return;
|
||||
+
|
||||
snprintf(led_name, sizeof(led_name), "ath9k-%s",
|
||||
wiphy_name(sc->hw->wiphy));
|
||||
|
||||
11
mac80211/patches/ath/540-ath9k_reduce_ani_interval.patch
Normal file
11
mac80211/patches/ath/540-ath9k_reduce_ani_interval.patch
Normal file
@@ -0,0 +1,11 @@
|
||||
--- a/drivers/net/wireless/ath/ath9k/ani.h
|
||||
+++ b/drivers/net/wireless/ath/ath9k/ani.h
|
||||
@@ -42,7 +42,7 @@
|
||||
#define ATH9K_ANI_PERIOD 300
|
||||
|
||||
/* in ms */
|
||||
-#define ATH9K_ANI_POLLINTERVAL 1000
|
||||
+#define ATH9K_ANI_POLLINTERVAL 300
|
||||
|
||||
#define ATH9K_SIG_FIRSTEP_SETTING_MIN 0
|
||||
#define ATH9K_SIG_FIRSTEP_SETTING_MAX 20
|
||||
139
mac80211/patches/ath/542-ath9k_debugfs_diag.patch
Normal file
139
mac80211/patches/ath/542-ath9k_debugfs_diag.patch
Normal file
@@ -0,0 +1,139 @@
|
||||
--- a/drivers/net/wireless/ath/ath9k/debug.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/debug.c
|
||||
@@ -1509,6 +1509,50 @@ static const struct file_operations fops
|
||||
#endif
|
||||
|
||||
|
||||
+static ssize_t read_file_diag(struct file *file, char __user *user_buf,
|
||||
+ size_t count, loff_t *ppos)
|
||||
+{
|
||||
+ struct ath_softc *sc = file->private_data;
|
||||
+ struct ath_hw *ah = sc->sc_ah;
|
||||
+ char buf[32];
|
||||
+ unsigned int len;
|
||||
+
|
||||
+ len = sprintf(buf, "0x%08lx\n", ah->diag);
|
||||
+ return simple_read_from_buffer(user_buf, count, ppos, buf, len);
|
||||
+}
|
||||
+
|
||||
+static ssize_t write_file_diag(struct file *file, const char __user *user_buf,
|
||||
+ size_t count, loff_t *ppos)
|
||||
+{
|
||||
+ struct ath_softc *sc = file->private_data;
|
||||
+ struct ath_hw *ah = sc->sc_ah;
|
||||
+ unsigned long diag;
|
||||
+ char buf[32];
|
||||
+ ssize_t len;
|
||||
+
|
||||
+ len = min(count, sizeof(buf) - 1);
|
||||
+ if (copy_from_user(buf, user_buf, len))
|
||||
+ return -EFAULT;
|
||||
+
|
||||
+ buf[len] = '\0';
|
||||
+ if (kstrtoul(buf, 0, &diag))
|
||||
+ return -EINVAL;
|
||||
+
|
||||
+ ah->diag = diag;
|
||||
+ ath9k_hw_update_diag(ah);
|
||||
+
|
||||
+ return count;
|
||||
+}
|
||||
+
|
||||
+static const struct file_operations fops_diag = {
|
||||
+ .read = read_file_diag,
|
||||
+ .write = write_file_diag,
|
||||
+ .open = simple_open,
|
||||
+ .owner = THIS_MODULE,
|
||||
+ .llseek = default_llseek,
|
||||
+};
|
||||
+
|
||||
+
|
||||
int ath9k_init_debug(struct ath_hw *ah)
|
||||
{
|
||||
struct ath_common *common = ath9k_hw_common(ah);
|
||||
@@ -1536,6 +1580,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("diag", S_IRUSR | S_IWUSR, sc->debug.debugfs_phy,
|
||||
+ sc, &fops_diag);
|
||||
debugfs_create_devm_seqfile(sc->dev, "dma", sc->debug.debugfs_phy,
|
||||
read_file_dma);
|
||||
debugfs_create_devm_seqfile(sc->dev, "interrupt", sc->debug.debugfs_phy,
|
||||
--- a/drivers/net/wireless/ath/ath9k/hw.h
|
||||
+++ b/drivers/net/wireless/ath/ath9k/hw.h
|
||||
@@ -522,6 +522,12 @@ enum {
|
||||
ATH9K_RESET_COLD,
|
||||
};
|
||||
|
||||
+enum {
|
||||
+ ATH_DIAG_DISABLE_RX,
|
||||
+ ATH_DIAG_DISABLE_TX,
|
||||
+ ATH_DIAG_TRIGGER_ERROR,
|
||||
+};
|
||||
+
|
||||
struct ath9k_hw_version {
|
||||
u32 magic;
|
||||
u16 devid;
|
||||
@@ -810,6 +816,8 @@ struct ath_hw {
|
||||
u32 ah_flags;
|
||||
s16 nf_override;
|
||||
|
||||
+ unsigned long diag;
|
||||
+
|
||||
bool reset_power_on;
|
||||
bool htc_reset_init;
|
||||
|
||||
@@ -1076,6 +1084,7 @@ void ath9k_hw_check_nav(struct ath_hw *a
|
||||
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);
|
||||
|
||||
/* Generic hw timer primitives */
|
||||
struct ath_gen_timer *ath_gen_timer_alloc(struct ath_hw *ah,
|
||||
--- a/drivers/net/wireless/ath/ath9k/hw.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/hw.c
|
||||
@@ -1883,6 +1883,20 @@ u32 ath9k_hw_get_tsf_offset(struct times
|
||||
}
|
||||
EXPORT_SYMBOL(ath9k_hw_get_tsf_offset);
|
||||
|
||||
+void ath9k_hw_update_diag(struct ath_hw *ah)
|
||||
+{
|
||||
+ if (test_bit(ATH_DIAG_DISABLE_RX, &ah->diag))
|
||||
+ REG_SET_BIT(ah, AR_DIAG_SW, AR_DIAG_RX_DIS);
|
||||
+ else
|
||||
+ REG_CLR_BIT(ah, AR_DIAG_SW, AR_DIAG_RX_DIS);
|
||||
+
|
||||
+ if (test_bit(ATH_DIAG_DISABLE_TX, &ah->diag))
|
||||
+ REG_SET_BIT(ah, AR_DIAG_SW, AR_DIAG_LOOP_BACK);
|
||||
+ else
|
||||
+ REG_CLR_BIT(ah, AR_DIAG_SW, AR_DIAG_LOOP_BACK);
|
||||
+}
|
||||
+EXPORT_SYMBOL(ath9k_hw_update_diag);
|
||||
+
|
||||
int ath9k_hw_reset(struct ath_hw *ah, struct ath9k_channel *chan,
|
||||
struct ath9k_hw_cal_data *caldata, bool fastcc)
|
||||
{
|
||||
@@ -2091,6 +2105,7 @@ int ath9k_hw_reset(struct ath_hw *ah, st
|
||||
ar9003_hw_disable_phy_restart(ah);
|
||||
|
||||
ath9k_hw_apply_gpio_override(ah);
|
||||
+ ath9k_hw_update_diag(ah);
|
||||
|
||||
if (AR_SREV_9565(ah) && common->bt_ant_diversity)
|
||||
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
|
||||
@@ -528,6 +528,11 @@ irqreturn_t ath_isr(int irq, void *dev)
|
||||
if (test_bit(ATH_OP_HW_RESET, &common->op_flags))
|
||||
return IRQ_HANDLED;
|
||||
|
||||
+ if (test_bit(ATH_DIAG_TRIGGER_ERROR, &ah->diag)) {
|
||||
+ status |= ATH9K_INT_FATAL;
|
||||
+ clear_bit(ATH_DIAG_TRIGGER_ERROR, &ah->diag);
|
||||
+ }
|
||||
+
|
||||
/*
|
||||
* If there are no status bits set, then this interrupt was not
|
||||
* for me (should have been caught above).
|
||||
186
mac80211/patches/ath/543-ath9k_entropy_from_adc.patch
Normal file
186
mac80211/patches/ath/543-ath9k_entropy_from_adc.patch
Normal file
@@ -0,0 +1,186 @@
|
||||
--- a/drivers/net/wireless/ath/ath9k/hw.h
|
||||
+++ b/drivers/net/wireless/ath/ath9k/hw.h
|
||||
@@ -723,6 +723,7 @@ struct ath_spec_scan {
|
||||
* @config_pci_powersave:
|
||||
* @calibrate: periodic calibration for NF, ANI, IQ, ADC gain, ADC-DC
|
||||
*
|
||||
+ * @get_adc_entropy: get entropy from the raw ADC I/Q output
|
||||
* @spectral_scan_config: set parameters for spectral scan and enable/disable it
|
||||
* @spectral_scan_trigger: trigger a spectral scan run
|
||||
* @spectral_scan_wait: wait for a spectral scan run to finish
|
||||
@@ -745,6 +746,7 @@ struct ath_hw_ops {
|
||||
struct ath_hw_antcomb_conf *antconf);
|
||||
void (*antdiv_comb_conf_set)(struct ath_hw *ah,
|
||||
struct ath_hw_antcomb_conf *antconf);
|
||||
+ void (*get_adc_entropy)(struct ath_hw *ah, u8 *buf, size_t len);
|
||||
void (*spectral_scan_config)(struct ath_hw *ah,
|
||||
struct ath_spec_scan *param);
|
||||
void (*spectral_scan_trigger)(struct ath_hw *ah);
|
||||
--- a/drivers/net/wireless/ath/ath9k/ar9003_phy.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/ar9003_phy.c
|
||||
@@ -1927,6 +1927,26 @@ void ar9003_hw_init_rate_txpower(struct
|
||||
}
|
||||
}
|
||||
|
||||
+static void ar9003_hw_get_adc_entropy(struct ath_hw *ah, u8 *buf, size_t len)
|
||||
+{
|
||||
+ int i, j;
|
||||
+
|
||||
+ REG_RMW_FIELD(ah, AR_PHY_TEST, AR_PHY_TEST_BBB_OBS_SEL, 1);
|
||||
+ REG_CLR_BIT(ah, AR_PHY_TEST, AR_PHY_TEST_RX_OBS_SEL_BIT5);
|
||||
+ REG_RMW_FIELD(ah, AR_PHY_TEST_CTL_STATUS, AR_PHY_TEST_CTL_RX_OBS_SEL, 0);
|
||||
+
|
||||
+ memset(buf, 0, len);
|
||||
+ for (i = 0; i < len; i++) {
|
||||
+ for (j = 0; j < 4; j++) {
|
||||
+ u32 regval = REG_READ(ah, AR_PHY_TST_ADC);
|
||||
+
|
||||
+ buf[i] <<= 2;
|
||||
+ buf[i] |= (regval & 1) | ((regval & BIT(10)) >> 9);
|
||||
+ udelay(1);
|
||||
+ }
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
void ar9003_hw_attach_phy_ops(struct ath_hw *ah)
|
||||
{
|
||||
struct ath_hw_private_ops *priv_ops = ath9k_hw_private_ops(ah);
|
||||
@@ -1963,6 +1983,7 @@ void ar9003_hw_attach_phy_ops(struct ath
|
||||
priv_ops->set_radar_params = ar9003_hw_set_radar_params;
|
||||
priv_ops->fast_chan_change = ar9003_hw_fast_chan_change;
|
||||
|
||||
+ ops->get_adc_entropy = ar9003_hw_get_adc_entropy;
|
||||
ops->antdiv_comb_conf_get = ar9003_hw_antdiv_comb_conf_get;
|
||||
ops->antdiv_comb_conf_set = ar9003_hw_antdiv_comb_conf_set;
|
||||
ops->spectral_scan_config = ar9003_hw_spectral_scan_config;
|
||||
--- a/drivers/net/wireless/ath/ath9k/init.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/init.c
|
||||
@@ -819,7 +819,8 @@ static void ath9k_init_txpower_limits(st
|
||||
if (ah->caps.hw_caps & ATH9K_HW_CAP_5GHZ)
|
||||
ath9k_init_band_txpower(sc, NL80211_BAND_5GHZ);
|
||||
|
||||
- ah->curchan = curchan;
|
||||
+ if (curchan)
|
||||
+ ah->curchan = curchan;
|
||||
}
|
||||
|
||||
static const struct ieee80211_iface_limit if_limits[] = {
|
||||
@@ -1015,6 +1016,18 @@ static void ath9k_set_hw_capab(struct at
|
||||
NL80211_EXT_FEATURE_MULTICAST_REGISTRATIONS);
|
||||
}
|
||||
|
||||
+static void ath_get_initial_entropy(struct ath_softc *sc)
|
||||
+{
|
||||
+ struct ath_hw *ah = sc->sc_ah;
|
||||
+ char buf[256];
|
||||
+
|
||||
+ /* reuse last channel initialized by the tx power test */
|
||||
+ ath9k_hw_reset(ah, ah->curchan, NULL, false);
|
||||
+
|
||||
+ ath9k_hw_get_adc_entropy(ah, buf, sizeof(buf));
|
||||
+ add_device_randomness(buf, sizeof(buf));
|
||||
+}
|
||||
+
|
||||
int ath9k_init_device(u16 devid, struct ath_softc *sc,
|
||||
const struct ath_bus_ops *bus_ops)
|
||||
{
|
||||
@@ -1060,6 +1073,8 @@ int ath9k_init_device(u16 devid, struct
|
||||
ARRAY_SIZE(ath9k_tpt_blink));
|
||||
#endif
|
||||
|
||||
+ ath_get_initial_entropy(sc);
|
||||
+
|
||||
/* Register with mac80211 */
|
||||
error = ieee80211_register_hw(hw);
|
||||
if (error)
|
||||
--- a/drivers/net/wireless/ath/ath9k/hw-ops.h
|
||||
+++ b/drivers/net/wireless/ath/ath9k/hw-ops.h
|
||||
@@ -100,6 +100,12 @@ static inline void ath9k_hw_tx99_set_txp
|
||||
ath9k_hw_ops(ah)->tx99_set_txpower(ah, power);
|
||||
}
|
||||
|
||||
+static inline void ath9k_hw_get_adc_entropy(struct ath_hw *ah,
|
||||
+ u8 *buf, size_t len)
|
||||
+{
|
||||
+ ath9k_hw_ops(ah)->get_adc_entropy(ah, buf, len);
|
||||
+}
|
||||
+
|
||||
#ifdef CPTCFG_ATH9K_BTCOEX_SUPPORT
|
||||
|
||||
static inline void ath9k_hw_set_bt_ant_diversity(struct ath_hw *ah, bool enable)
|
||||
--- a/drivers/net/wireless/ath/ath9k/ar5008_phy.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/ar5008_phy.c
|
||||
@@ -1320,9 +1320,30 @@ void ar5008_hw_init_rate_txpower(struct
|
||||
}
|
||||
}
|
||||
|
||||
+static void ar5008_hw_get_adc_entropy(struct ath_hw *ah, u8 *buf, size_t len)
|
||||
+{
|
||||
+ int i, j;
|
||||
+
|
||||
+ REG_RMW_FIELD(ah, AR_PHY_TEST, AR_PHY_TEST_BBB_OBS_SEL, 1);
|
||||
+ REG_CLR_BIT(ah, AR_PHY_TEST, AR_PHY_TEST_RX_OBS_SEL_BIT5);
|
||||
+ REG_RMW_FIELD(ah, AR_PHY_TEST2, AR_PHY_TEST2_RX_OBS_SEL, 0);
|
||||
+
|
||||
+ memset(buf, 0, len);
|
||||
+ for (i = 0; i < len; i++) {
|
||||
+ for (j = 0; j < 4; j++) {
|
||||
+ u32 regval = REG_READ(ah, AR_PHY_TST_ADC);
|
||||
+
|
||||
+ buf[i] <<= 2;
|
||||
+ buf[i] |= (regval & 1) | ((regval & BIT(9)) >> 8);
|
||||
+ udelay(1);
|
||||
+ }
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
int ar5008_hw_attach_phy_ops(struct ath_hw *ah)
|
||||
{
|
||||
struct ath_hw_private_ops *priv_ops = ath9k_hw_private_ops(ah);
|
||||
+ struct ath_hw_ops *ops = ath9k_hw_ops(ah);
|
||||
static const u32 ar5416_cca_regs[6] = {
|
||||
AR_PHY_CCA,
|
||||
AR_PHY_CH1_CCA,
|
||||
@@ -1337,6 +1358,8 @@ int ar5008_hw_attach_phy_ops(struct ath_
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
+ ops->get_adc_entropy = ar5008_hw_get_adc_entropy;
|
||||
+
|
||||
priv_ops->rf_set_freq = ar5008_hw_set_channel;
|
||||
priv_ops->spur_mitigate_freq = ar5008_hw_spur_mitigate;
|
||||
|
||||
--- a/drivers/net/wireless/ath/ath9k/ar9002_phy.h
|
||||
+++ b/drivers/net/wireless/ath/ath9k/ar9002_phy.h
|
||||
@@ -20,6 +20,12 @@
|
||||
#define PHY_AGC_CLR 0x10000000
|
||||
#define RFSILENT_BB 0x00002000
|
||||
|
||||
+#define AR_PHY_TEST_BBB_OBS_SEL 0x780000
|
||||
+#define AR_PHY_TEST_BBB_OBS_SEL_S 19
|
||||
+
|
||||
+#define AR_PHY_TEST_RX_OBS_SEL_BIT5_S 23
|
||||
+#define AR_PHY_TEST_RX_OBS_SEL_BIT5 (1 << AR_PHY_TEST_RX_OBS_SEL_BIT5_S)
|
||||
+
|
||||
#define AR_PHY_TURBO 0x9804
|
||||
#define AR_PHY_FC_TURBO_MODE 0x00000001
|
||||
#define AR_PHY_FC_TURBO_SHORT 0x00000002
|
||||
@@ -36,6 +42,9 @@
|
||||
|
||||
#define AR_PHY_TEST2 0x9808
|
||||
|
||||
+#define AR_PHY_TEST2_RX_OBS_SEL 0x3C00
|
||||
+#define AR_PHY_TEST2_RX_OBS_SEL_S 10
|
||||
+
|
||||
#define AR_PHY_TIMING2 0x9810
|
||||
#define AR_PHY_TIMING3 0x9814
|
||||
#define AR_PHY_TIMING3_DSC_MAN 0xFFFE0000
|
||||
@@ -393,6 +402,8 @@
|
||||
#define AR_PHY_RFBUS_GRANT 0x9C20
|
||||
#define AR_PHY_RFBUS_GRANT_EN 0x00000001
|
||||
|
||||
+#define AR_PHY_TST_ADC 0x9C24
|
||||
+
|
||||
#define AR_PHY_CHAN_INFO_GAIN_DIFF 0x9CF4
|
||||
#define AR_PHY_CHAN_INFO_GAIN_DIFF_UPPER_LIMIT 320
|
||||
|
||||
@@ -0,0 +1,79 @@
|
||||
--- a/drivers/net/wireless/ath/ath9k/hw.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/hw.c
|
||||
@@ -248,6 +248,19 @@ void ath9k_hw_get_channel_centers(struct
|
||||
centers->synth_center + (extoff * HT40_CHANNEL_CENTER_SHIFT);
|
||||
}
|
||||
|
||||
+static inline void ath9k_hw_disable_pll_lock_detect(struct ath_hw *ah)
|
||||
+{
|
||||
+ /* On AR9330 and AR9340 devices, some PHY registers must be
|
||||
+ * tuned to gain better stability/performance. These registers
|
||||
+ * might be changed while doing wlan reset so the registers must
|
||||
+ * be reprogrammed after each reset.
|
||||
+ */
|
||||
+ REG_CLR_BIT(ah, AR_PHY_USB_CTRL1, BIT(20));
|
||||
+ REG_RMW(ah, AR_PHY_USB_CTRL2,
|
||||
+ (1 << 21) | (0xf << 22),
|
||||
+ (1 << 21) | (0x3 << 22));
|
||||
+}
|
||||
+
|
||||
/******************/
|
||||
/* Chip Revisions */
|
||||
/******************/
|
||||
@@ -1455,6 +1468,9 @@ static bool ath9k_hw_set_reset(struct at
|
||||
udelay(50);
|
||||
}
|
||||
|
||||
+ if (AR_SREV_9330(ah) || AR_SREV_9340(ah))
|
||||
+ ath9k_hw_disable_pll_lock_detect(ah);
|
||||
+
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -1554,6 +1570,9 @@ static bool ath9k_hw_chip_reset(struct a
|
||||
ar9003_hw_internal_regulator_apply(ah);
|
||||
ath9k_hw_init_pll(ah, chan);
|
||||
|
||||
+ if (AR_SREV_9330(ah) || AR_SREV_9340(ah))
|
||||
+ ath9k_hw_disable_pll_lock_detect(ah);
|
||||
+
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -1861,8 +1880,14 @@ static int ath9k_hw_do_fastcc(struct ath
|
||||
if (AR_SREV_9271(ah))
|
||||
ar9002_hw_load_ani_reg(ah, chan);
|
||||
|
||||
+ if (AR_SREV_9330(ah) || AR_SREV_9340(ah))
|
||||
+ ath9k_hw_disable_pll_lock_detect(ah);
|
||||
+
|
||||
return 0;
|
||||
fail:
|
||||
+ if (AR_SREV_9330(ah) || AR_SREV_9340(ah))
|
||||
+ ath9k_hw_disable_pll_lock_detect(ah);
|
||||
+
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
@@ -2116,6 +2141,9 @@ int ath9k_hw_reset(struct ath_hw *ah, st
|
||||
ath9k_hw_set_radar_params(ah);
|
||||
}
|
||||
|
||||
+ if (AR_SREV_9330(ah) || AR_SREV_9340(ah))
|
||||
+ ath9k_hw_disable_pll_lock_detect(ah);
|
||||
+
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL(ath9k_hw_reset);
|
||||
--- a/drivers/net/wireless/ath/ath9k/phy.h
|
||||
+++ b/drivers/net/wireless/ath/ath9k/phy.h
|
||||
@@ -48,6 +48,9 @@
|
||||
#define AR_PHY_PLL_CONTROL 0x16180
|
||||
#define AR_PHY_PLL_MODE 0x16184
|
||||
|
||||
+#define AR_PHY_USB_CTRL1 0x16c84
|
||||
+#define AR_PHY_USB_CTRL2 0x16c88
|
||||
+
|
||||
enum ath9k_ant_div_comb_lna_conf {
|
||||
ATH_ANT_DIV_COMB_LNA1_MINUS_LNA2,
|
||||
ATH_ANT_DIV_COMB_LNA2,
|
||||
155
mac80211/patches/ath/545-ath9k_ani_ws_detect.patch
Normal file
155
mac80211/patches/ath/545-ath9k_ani_ws_detect.patch
Normal file
@@ -0,0 +1,155 @@
|
||||
--- a/drivers/net/wireless/ath/ath9k/ar5008_phy.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/ar5008_phy.c
|
||||
@@ -949,55 +949,6 @@ static bool ar5008_hw_ani_control_new(st
|
||||
* on == 0 means more noise imm
|
||||
*/
|
||||
u32 on = param ? 1 : 0;
|
||||
- /*
|
||||
- * make register setting for default
|
||||
- * (weak sig detect ON) come from INI file
|
||||
- */
|
||||
- int m1ThreshLow = on ?
|
||||
- aniState->iniDef.m1ThreshLow : m1ThreshLow_off;
|
||||
- int m2ThreshLow = on ?
|
||||
- aniState->iniDef.m2ThreshLow : m2ThreshLow_off;
|
||||
- int m1Thresh = on ?
|
||||
- aniState->iniDef.m1Thresh : m1Thresh_off;
|
||||
- int m2Thresh = on ?
|
||||
- aniState->iniDef.m2Thresh : m2Thresh_off;
|
||||
- int m2CountThr = on ?
|
||||
- aniState->iniDef.m2CountThr : m2CountThr_off;
|
||||
- int m2CountThrLow = on ?
|
||||
- aniState->iniDef.m2CountThrLow : m2CountThrLow_off;
|
||||
- int m1ThreshLowExt = on ?
|
||||
- aniState->iniDef.m1ThreshLowExt : m1ThreshLowExt_off;
|
||||
- int m2ThreshLowExt = on ?
|
||||
- aniState->iniDef.m2ThreshLowExt : m2ThreshLowExt_off;
|
||||
- int m1ThreshExt = on ?
|
||||
- aniState->iniDef.m1ThreshExt : m1ThreshExt_off;
|
||||
- int m2ThreshExt = on ?
|
||||
- aniState->iniDef.m2ThreshExt : m2ThreshExt_off;
|
||||
-
|
||||
- REG_RMW_FIELD(ah, AR_PHY_SFCORR_LOW,
|
||||
- AR_PHY_SFCORR_LOW_M1_THRESH_LOW,
|
||||
- m1ThreshLow);
|
||||
- REG_RMW_FIELD(ah, AR_PHY_SFCORR_LOW,
|
||||
- AR_PHY_SFCORR_LOW_M2_THRESH_LOW,
|
||||
- m2ThreshLow);
|
||||
- REG_RMW_FIELD(ah, AR_PHY_SFCORR,
|
||||
- AR_PHY_SFCORR_M1_THRESH, m1Thresh);
|
||||
- REG_RMW_FIELD(ah, AR_PHY_SFCORR,
|
||||
- AR_PHY_SFCORR_M2_THRESH, m2Thresh);
|
||||
- REG_RMW_FIELD(ah, AR_PHY_SFCORR,
|
||||
- AR_PHY_SFCORR_M2COUNT_THR, m2CountThr);
|
||||
- REG_RMW_FIELD(ah, AR_PHY_SFCORR_LOW,
|
||||
- AR_PHY_SFCORR_LOW_M2COUNT_THR_LOW,
|
||||
- m2CountThrLow);
|
||||
-
|
||||
- REG_RMW_FIELD(ah, AR_PHY_SFCORR_EXT,
|
||||
- AR_PHY_SFCORR_EXT_M1_THRESH_LOW, m1ThreshLowExt);
|
||||
- REG_RMW_FIELD(ah, AR_PHY_SFCORR_EXT,
|
||||
- AR_PHY_SFCORR_EXT_M2_THRESH_LOW, m2ThreshLowExt);
|
||||
- REG_RMW_FIELD(ah, AR_PHY_SFCORR_EXT,
|
||||
- AR_PHY_SFCORR_EXT_M1_THRESH, m1ThreshExt);
|
||||
- REG_RMW_FIELD(ah, AR_PHY_SFCORR_EXT,
|
||||
- AR_PHY_SFCORR_EXT_M2_THRESH, m2ThreshExt);
|
||||
|
||||
if (on)
|
||||
REG_SET_BIT(ah, AR_PHY_SFCORR_LOW,
|
||||
--- a/drivers/net/wireless/ath/ath9k/ar9003_phy.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/ar9003_phy.c
|
||||
@@ -42,20 +42,6 @@ static const int cycpwrThr1_table[] =
|
||||
/* level: 0 1 2 3 4 5 6 7 8 */
|
||||
{ -6, -4, -2, 0, 2, 4, 6, 8 }; /* lvl 0-7, default 3 */
|
||||
|
||||
-/*
|
||||
- * register values to turn OFDM weak signal detection OFF
|
||||
- */
|
||||
-static const int m1ThreshLow_off = 127;
|
||||
-static const int m2ThreshLow_off = 127;
|
||||
-static const int m1Thresh_off = 127;
|
||||
-static const int m2Thresh_off = 127;
|
||||
-static const int m2CountThr_off = 31;
|
||||
-static const int m2CountThrLow_off = 63;
|
||||
-static const int m1ThreshLowExt_off = 127;
|
||||
-static const int m2ThreshLowExt_off = 127;
|
||||
-static const int m1ThreshExt_off = 127;
|
||||
-static const int m2ThreshExt_off = 127;
|
||||
-
|
||||
static const u8 ofdm2pwr[] = {
|
||||
ALL_TARGET_LEGACY_6_24,
|
||||
ALL_TARGET_LEGACY_6_24,
|
||||
@@ -1077,11 +1063,6 @@ static bool ar9003_hw_ani_control(struct
|
||||
struct ath_common *common = ath9k_hw_common(ah);
|
||||
struct ath9k_channel *chan = ah->curchan;
|
||||
struct ar5416AniState *aniState = &ah->ani;
|
||||
- int m1ThreshLow, m2ThreshLow;
|
||||
- int m1Thresh, m2Thresh;
|
||||
- int m2CountThr, m2CountThrLow;
|
||||
- int m1ThreshLowExt, m2ThreshLowExt;
|
||||
- int m1ThreshExt, m2ThreshExt;
|
||||
s32 value, value2;
|
||||
|
||||
switch (cmd & ah->ani_function) {
|
||||
@@ -1095,61 +1076,6 @@ static bool ar9003_hw_ani_control(struct
|
||||
*/
|
||||
u32 on = param ? 1 : 0;
|
||||
|
||||
- if (AR_SREV_9462(ah) || AR_SREV_9565(ah))
|
||||
- goto skip_ws_det;
|
||||
-
|
||||
- m1ThreshLow = on ?
|
||||
- aniState->iniDef.m1ThreshLow : m1ThreshLow_off;
|
||||
- m2ThreshLow = on ?
|
||||
- aniState->iniDef.m2ThreshLow : m2ThreshLow_off;
|
||||
- m1Thresh = on ?
|
||||
- aniState->iniDef.m1Thresh : m1Thresh_off;
|
||||
- m2Thresh = on ?
|
||||
- aniState->iniDef.m2Thresh : m2Thresh_off;
|
||||
- m2CountThr = on ?
|
||||
- aniState->iniDef.m2CountThr : m2CountThr_off;
|
||||
- m2CountThrLow = on ?
|
||||
- aniState->iniDef.m2CountThrLow : m2CountThrLow_off;
|
||||
- m1ThreshLowExt = on ?
|
||||
- aniState->iniDef.m1ThreshLowExt : m1ThreshLowExt_off;
|
||||
- m2ThreshLowExt = on ?
|
||||
- aniState->iniDef.m2ThreshLowExt : m2ThreshLowExt_off;
|
||||
- m1ThreshExt = on ?
|
||||
- aniState->iniDef.m1ThreshExt : m1ThreshExt_off;
|
||||
- m2ThreshExt = on ?
|
||||
- aniState->iniDef.m2ThreshExt : m2ThreshExt_off;
|
||||
-
|
||||
- REG_RMW_FIELD(ah, AR_PHY_SFCORR_LOW,
|
||||
- AR_PHY_SFCORR_LOW_M1_THRESH_LOW,
|
||||
- m1ThreshLow);
|
||||
- REG_RMW_FIELD(ah, AR_PHY_SFCORR_LOW,
|
||||
- AR_PHY_SFCORR_LOW_M2_THRESH_LOW,
|
||||
- m2ThreshLow);
|
||||
- REG_RMW_FIELD(ah, AR_PHY_SFCORR,
|
||||
- AR_PHY_SFCORR_M1_THRESH,
|
||||
- m1Thresh);
|
||||
- REG_RMW_FIELD(ah, AR_PHY_SFCORR,
|
||||
- AR_PHY_SFCORR_M2_THRESH,
|
||||
- m2Thresh);
|
||||
- REG_RMW_FIELD(ah, AR_PHY_SFCORR,
|
||||
- AR_PHY_SFCORR_M2COUNT_THR,
|
||||
- m2CountThr);
|
||||
- REG_RMW_FIELD(ah, AR_PHY_SFCORR_LOW,
|
||||
- AR_PHY_SFCORR_LOW_M2COUNT_THR_LOW,
|
||||
- m2CountThrLow);
|
||||
- REG_RMW_FIELD(ah, AR_PHY_SFCORR_EXT,
|
||||
- AR_PHY_SFCORR_EXT_M1_THRESH_LOW,
|
||||
- m1ThreshLowExt);
|
||||
- REG_RMW_FIELD(ah, AR_PHY_SFCORR_EXT,
|
||||
- AR_PHY_SFCORR_EXT_M2_THRESH_LOW,
|
||||
- m2ThreshLowExt);
|
||||
- REG_RMW_FIELD(ah, AR_PHY_SFCORR_EXT,
|
||||
- AR_PHY_SFCORR_EXT_M1_THRESH,
|
||||
- m1ThreshExt);
|
||||
- REG_RMW_FIELD(ah, AR_PHY_SFCORR_EXT,
|
||||
- AR_PHY_SFCORR_EXT_M2_THRESH,
|
||||
- m2ThreshExt);
|
||||
-skip_ws_det:
|
||||
if (on)
|
||||
REG_SET_BIT(ah, AR_PHY_SFCORR_LOW,
|
||||
AR_PHY_SFCORR_LOW_USE_SELF_CORR_LOW);
|
||||
29
mac80211/patches/ath/547-ath9k_led_defstate_fix.patch
Normal file
29
mac80211/patches/ath/547-ath9k_led_defstate_fix.patch
Normal file
@@ -0,0 +1,29 @@
|
||||
From: Michal Cieslakiewicz <michal.cieslakiewicz@wp.pl>
|
||||
Date: Sun, 31 Jan 2016 20:48:49 +0100
|
||||
Subject: [PATCH v4 2/8] mac80211: ath9k: set default state for platform LEDs
|
||||
|
||||
Support default state for platform LEDs connected to ath9k device.
|
||||
Now LEDs are correctly set on or off at ath9k module initialization.
|
||||
Very useful if power LED is connected to wireless chip.
|
||||
|
||||
Signed-off-by: Michal Cieslakiewicz <michal.cieslakiewicz@wp.pl>
|
||||
---
|
||||
gpio.c | 7 +++++--
|
||||
1 file changed, 5 insertions(+), 2 deletions(-)
|
||||
|
||||
--- a/drivers/net/wireless/ath/ath9k/gpio.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/gpio.c
|
||||
@@ -74,8 +74,11 @@ static int ath_add_led(struct ath_softc
|
||||
ath9k_hw_gpio_request_out(sc->sc_ah, gpio->gpio, gpio->name,
|
||||
AR_GPIO_OUTPUT_MUX_AS_OUTPUT);
|
||||
|
||||
- /* LED off */
|
||||
- ath9k_hw_set_gpio(sc->sc_ah, gpio->gpio, gpio->active_low);
|
||||
+ /* Set default LED state */
|
||||
+ if (gpio->default_state == LEDS_GPIO_DEFSTATE_ON)
|
||||
+ ath9k_hw_set_gpio(sc->sc_ah, gpio->gpio, !gpio->active_low);
|
||||
+ else
|
||||
+ ath9k_hw_set_gpio(sc->sc_ah, gpio->gpio, gpio->active_low);
|
||||
|
||||
return 0;
|
||||
}
|
||||
251
mac80211/patches/ath/548-ath9k_enable_gpio_chip.patch
Normal file
251
mac80211/patches/ath/548-ath9k_enable_gpio_chip.patch
Normal file
@@ -0,0 +1,251 @@
|
||||
From: Michal Cieslakiewicz <michal.cieslakiewicz@wp.pl>
|
||||
Date: Sun, 31 Jan 2016 21:01:31 +0100
|
||||
Subject: [PATCH v4 4/8] mac80211: ath9k: enable access to GPIO
|
||||
|
||||
Enable access to GPIO chip and its pins for Atheros AR92xx
|
||||
wireless devices. For now AR9285 and AR9287 are supported.
|
||||
|
||||
Signed-off-by: Michal Cieslakiewicz <michal.cieslakiewicz@wp.pl>
|
||||
Signed-off-by: Felix Fietkau <nbd@nbd.name>
|
||||
---
|
||||
--- a/drivers/net/wireless/ath/ath9k/ath9k.h
|
||||
+++ b/drivers/net/wireless/ath/ath9k/ath9k.h
|
||||
@@ -24,6 +24,7 @@
|
||||
#include <linux/completion.h>
|
||||
#include <linux/time.h>
|
||||
#include <linux/hw_random.h>
|
||||
+#include <linux/gpio/driver.h>
|
||||
|
||||
#include "common.h"
|
||||
#include "debug.h"
|
||||
@@ -989,6 +990,14 @@ struct ath_led {
|
||||
struct led_classdev cdev;
|
||||
};
|
||||
|
||||
+#ifdef CONFIG_GPIOLIB
|
||||
+struct ath9k_gpio_chip {
|
||||
+ struct ath_softc *sc;
|
||||
+ char label[32];
|
||||
+ struct gpio_chip gchip;
|
||||
+};
|
||||
+#endif
|
||||
+
|
||||
struct ath_softc {
|
||||
struct ieee80211_hw *hw;
|
||||
struct device *dev;
|
||||
@@ -1044,6 +1053,9 @@ struct ath_softc {
|
||||
#ifdef CPTCFG_MAC80211_LEDS
|
||||
const char *led_default_trigger;
|
||||
struct list_head leds;
|
||||
+#ifdef CONFIG_GPIOLIB
|
||||
+ struct ath9k_gpio_chip *gpiochip;
|
||||
+#endif
|
||||
#endif
|
||||
|
||||
#ifdef CPTCFG_ATH9K_DEBUGFS
|
||||
--- a/drivers/net/wireless/ath/ath9k/gpio.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/gpio.c
|
||||
@@ -16,13 +16,139 @@
|
||||
|
||||
#include "ath9k.h"
|
||||
#include <linux/ath9k_platform.h>
|
||||
+#include <linux/gpio.h>
|
||||
+
|
||||
+#ifdef CPTCFG_MAC80211_LEDS
|
||||
+
|
||||
+#ifdef CONFIG_GPIOLIB
|
||||
+
|
||||
+/***************/
|
||||
+/* GPIO Chip */
|
||||
+/***************/
|
||||
+
|
||||
+/* gpio_chip handler : set GPIO to input */
|
||||
+static int ath9k_gpio_pin_cfg_input(struct gpio_chip *chip, unsigned offset)
|
||||
+{
|
||||
+ struct ath9k_gpio_chip *gc = container_of(chip, struct ath9k_gpio_chip,
|
||||
+ gchip);
|
||||
+
|
||||
+ ath9k_hw_gpio_request_in(gc->sc->sc_ah, offset, "ath9k-gpio");
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+/* gpio_chip handler : set GPIO to output */
|
||||
+static int ath9k_gpio_pin_cfg_output(struct gpio_chip *chip, unsigned offset,
|
||||
+ int value)
|
||||
+{
|
||||
+ struct ath9k_gpio_chip *gc = container_of(chip, struct ath9k_gpio_chip,
|
||||
+ gchip);
|
||||
+
|
||||
+ ath9k_hw_gpio_request_out(gc->sc->sc_ah, offset, "ath9k-gpio",
|
||||
+ AR_GPIO_OUTPUT_MUX_AS_OUTPUT);
|
||||
+ ath9k_hw_set_gpio(gc->sc->sc_ah, offset, value);
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+/* gpio_chip handler : query GPIO direction (0=out, 1=in) */
|
||||
+static int ath9k_gpio_pin_get_dir(struct gpio_chip *chip, unsigned offset)
|
||||
+{
|
||||
+ struct ath9k_gpio_chip *gc = container_of(chip, struct ath9k_gpio_chip,
|
||||
+ gchip);
|
||||
+ struct ath_hw *ah = gc->sc->sc_ah;
|
||||
+
|
||||
+ return !((REG_READ(ah, AR_GPIO_OE_OUT) >> (offset * 2)) & 3);
|
||||
+}
|
||||
+
|
||||
+/* gpio_chip handler : get GPIO pin value */
|
||||
+static int ath9k_gpio_pin_get(struct gpio_chip *chip, unsigned offset)
|
||||
+{
|
||||
+ struct ath9k_gpio_chip *gc = container_of(chip, struct ath9k_gpio_chip,
|
||||
+ gchip);
|
||||
+
|
||||
+ return ath9k_hw_gpio_get(gc->sc->sc_ah, offset);
|
||||
+}
|
||||
+
|
||||
+/* gpio_chip handler : set GPIO pin to value */
|
||||
+static void ath9k_gpio_pin_set(struct gpio_chip *chip, unsigned offset,
|
||||
+ int value)
|
||||
+{
|
||||
+ struct ath9k_gpio_chip *gc = container_of(chip, struct ath9k_gpio_chip,
|
||||
+ gchip);
|
||||
+
|
||||
+ ath9k_hw_set_gpio(gc->sc->sc_ah, offset, value);
|
||||
+}
|
||||
+
|
||||
+/* register GPIO chip */
|
||||
+static void ath9k_register_gpio_chip(struct ath_softc *sc)
|
||||
+{
|
||||
+ struct ath9k_gpio_chip *gc;
|
||||
+ struct ath_hw *ah = sc->sc_ah;
|
||||
+
|
||||
+ gc = kzalloc(sizeof(struct ath9k_gpio_chip), GFP_KERNEL);
|
||||
+ if (!gc)
|
||||
+ return;
|
||||
+
|
||||
+ gc->sc = sc;
|
||||
+ snprintf(gc->label, sizeof(gc->label), "ath9k-%s",
|
||||
+ wiphy_name(sc->hw->wiphy));
|
||||
+#ifdef CONFIG_OF
|
||||
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(4,5,0)
|
||||
+ gc->gchip.parent = sc->dev;
|
||||
+#else
|
||||
+ gc->gchip.dev = sc->dev;
|
||||
+#endif
|
||||
+#endif
|
||||
+ gc->gchip.label = gc->label;
|
||||
+ gc->gchip.base = -1; /* determine base automatically */
|
||||
+ gc->gchip.ngpio = ah->caps.num_gpio_pins;
|
||||
+ gc->gchip.direction_input = ath9k_gpio_pin_cfg_input;
|
||||
+ gc->gchip.direction_output = ath9k_gpio_pin_cfg_output;
|
||||
+ gc->gchip.get_direction = ath9k_gpio_pin_get_dir;
|
||||
+ gc->gchip.get = ath9k_gpio_pin_get;
|
||||
+ gc->gchip.set = ath9k_gpio_pin_set;
|
||||
+
|
||||
+ if (gpiochip_add(&gc->gchip)) {
|
||||
+ kfree(gc);
|
||||
+ return;
|
||||
+ }
|
||||
+
|
||||
+#ifdef CONFIG_OF
|
||||
+ gc->gchip.owner = NULL;
|
||||
+#endif
|
||||
+ sc->gpiochip = gc;
|
||||
+}
|
||||
+
|
||||
+/* remove GPIO chip */
|
||||
+static void ath9k_unregister_gpio_chip(struct ath_softc *sc)
|
||||
+{
|
||||
+ struct ath9k_gpio_chip *gc = sc->gpiochip;
|
||||
+
|
||||
+ if (!gc)
|
||||
+ return;
|
||||
+
|
||||
+ gpiochip_remove(&gc->gchip);
|
||||
+ kfree(gc);
|
||||
+ sc->gpiochip = NULL;
|
||||
+}
|
||||
+
|
||||
+#else /* CONFIG_GPIOLIB */
|
||||
+
|
||||
+static inline void ath9k_register_gpio_chip(struct ath_softc *sc)
|
||||
+{
|
||||
+}
|
||||
+
|
||||
+static inline void ath9k_unregister_gpio_chip(struct ath_softc *sc)
|
||||
+{
|
||||
+}
|
||||
+
|
||||
+#endif /* CONFIG_GPIOLIB */
|
||||
|
||||
/********************************/
|
||||
/* LED functions */
|
||||
/********************************/
|
||||
|
||||
-#ifdef CPTCFG_MAC80211_LEDS
|
||||
-
|
||||
static void ath_fill_led_pin(struct ath_softc *sc)
|
||||
{
|
||||
struct ath_hw *ah = sc->sc_ah;
|
||||
@@ -80,6 +206,12 @@ static int ath_add_led(struct ath_softc
|
||||
else
|
||||
ath9k_hw_set_gpio(sc->sc_ah, gpio->gpio, gpio->active_low);
|
||||
|
||||
+#ifdef CONFIG_GPIOLIB
|
||||
+ /* If there is GPIO chip configured, reserve LED pin */
|
||||
+ if (sc->gpiochip)
|
||||
+ gpio_request(sc->gpiochip->gchip.base + gpio->gpio, gpio->name);
|
||||
+#endif
|
||||
+
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -136,17 +268,24 @@ void ath_deinit_leds(struct ath_softc *s
|
||||
|
||||
while (!list_empty(&sc->leds)) {
|
||||
led = list_first_entry(&sc->leds, struct ath_led, list);
|
||||
+#ifdef CONFIG_GPIOLIB
|
||||
+ /* If there is GPIO chip configured, free LED pin */
|
||||
+ if (sc->gpiochip)
|
||||
+ gpio_free(sc->gpiochip->gchip.base + led->gpio->gpio);
|
||||
+#endif
|
||||
list_del(&led->list);
|
||||
ath_led_brightness(&led->cdev, LED_OFF);
|
||||
led_classdev_unregister(&led->cdev);
|
||||
ath9k_hw_gpio_free(sc->sc_ah, led->gpio->gpio);
|
||||
kfree(led);
|
||||
}
|
||||
+ ath9k_unregister_gpio_chip(sc);
|
||||
}
|
||||
|
||||
void ath_init_leds(struct ath_softc *sc)
|
||||
{
|
||||
struct ath9k_platform_data *pdata = sc->dev->platform_data;
|
||||
+ struct device_node *np = sc->dev->of_node;
|
||||
char led_name[32];
|
||||
const char *trigger;
|
||||
int i;
|
||||
@@ -156,6 +295,15 @@ void ath_init_leds(struct ath_softc *sc)
|
||||
if (AR_SREV_9100(sc->sc_ah))
|
||||
return;
|
||||
|
||||
+ if (!np)
|
||||
+ ath9k_register_gpio_chip(sc);
|
||||
+
|
||||
+ /* setup gpio controller only if requested and skip the led_pin setup */
|
||||
+ if (of_property_read_bool(np, "gpio-controller")) {
|
||||
+ ath9k_register_gpio_chip(sc);
|
||||
+ return;
|
||||
+ }
|
||||
+
|
||||
ath_fill_led_pin(sc);
|
||||
|
||||
if (pdata && pdata->leds && pdata->num_leds)
|
||||
@@ -180,6 +328,7 @@ void ath_init_leds(struct ath_softc *sc)
|
||||
ath_create_gpio_led(sc, sc->sc_ah->led_pin, led_name, trigger,
|
||||
!sc->sc_ah->config.led_active_high);
|
||||
}
|
||||
+
|
||||
#endif
|
||||
|
||||
/*******************/
|
||||
143
mac80211/patches/ath/549-ath9k_enable_gpio_buttons.patch
Normal file
143
mac80211/patches/ath/549-ath9k_enable_gpio_buttons.patch
Normal file
@@ -0,0 +1,143 @@
|
||||
From: Michal Cieslakiewicz <michal.cieslakiewicz@wp.pl>
|
||||
Subject: [PATCH v5 5/8] mac80211: ath9k: enable GPIO buttons
|
||||
|
||||
Enable platform-defined GPIO button support for ath9k device.
|
||||
Key poller is activated for attached platform buttons.
|
||||
Requires ath9k GPIO chip access.
|
||||
|
||||
Signed-off-by: Michal Cieslakiewicz <michal.cieslakiewicz@wp.pl>
|
||||
Signed-off-by: Felix Fietkau <nbd@nbd.name>
|
||||
---
|
||||
--- a/drivers/net/wireless/ath/ath9k/ath9k.h
|
||||
+++ b/drivers/net/wireless/ath/ath9k/ath9k.h
|
||||
@@ -1055,6 +1055,7 @@ struct ath_softc {
|
||||
struct list_head leds;
|
||||
#ifdef CONFIG_GPIOLIB
|
||||
struct ath9k_gpio_chip *gpiochip;
|
||||
+ struct platform_device *btnpdev; /* gpio-keys-polled */
|
||||
#endif
|
||||
#endif
|
||||
|
||||
--- a/drivers/net/wireless/ath/ath9k/gpio.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/gpio.c
|
||||
@@ -17,6 +17,8 @@
|
||||
#include "ath9k.h"
|
||||
#include <linux/ath9k_platform.h>
|
||||
#include <linux/gpio.h>
|
||||
+#include <linux/platform_device.h>
|
||||
+#include <linux/gpio_keys.h>
|
||||
|
||||
#ifdef CPTCFG_MAC80211_LEDS
|
||||
|
||||
@@ -133,6 +135,67 @@ static void ath9k_unregister_gpio_chip(s
|
||||
sc->gpiochip = NULL;
|
||||
}
|
||||
|
||||
+/******************/
|
||||
+/* GPIO Buttons */
|
||||
+/******************/
|
||||
+
|
||||
+/* add GPIO buttons */
|
||||
+static void ath9k_init_buttons(struct ath_softc *sc)
|
||||
+{
|
||||
+ struct ath9k_platform_data *pdata = sc->dev->platform_data;
|
||||
+ struct platform_device *pdev;
|
||||
+ struct gpio_keys_platform_data gkpdata;
|
||||
+ struct gpio_keys_button *bt;
|
||||
+ int i;
|
||||
+
|
||||
+ if (!sc->gpiochip)
|
||||
+ return;
|
||||
+
|
||||
+ if (!pdata || !pdata->btns || !pdata->num_btns)
|
||||
+ return;
|
||||
+
|
||||
+ bt = devm_kmemdup(sc->dev, pdata->btns,
|
||||
+ pdata->num_btns * sizeof(struct gpio_keys_button),
|
||||
+ GFP_KERNEL);
|
||||
+ if (!bt)
|
||||
+ return;
|
||||
+
|
||||
+ for (i = 0; i < pdata->num_btns; i++) {
|
||||
+ if (pdata->btns[i].gpio == sc->sc_ah->led_pin)
|
||||
+ sc->sc_ah->led_pin = -1;
|
||||
+
|
||||
+ ath9k_hw_gpio_request_in(sc->sc_ah, pdata->btns[i].gpio,
|
||||
+ "ath9k-gpio");
|
||||
+ bt[i].gpio = sc->gpiochip->gchip.base + pdata->btns[i].gpio;
|
||||
+ }
|
||||
+
|
||||
+ memset(&gkpdata, 0, sizeof(struct gpio_keys_platform_data));
|
||||
+ gkpdata.buttons = bt;
|
||||
+ gkpdata.nbuttons = pdata->num_btns;
|
||||
+ gkpdata.poll_interval = pdata->btn_poll_interval;
|
||||
+
|
||||
+ pdev = platform_device_register_data(sc->dev, "gpio-keys-polled",
|
||||
+ PLATFORM_DEVID_AUTO, &gkpdata,
|
||||
+ sizeof(gkpdata));
|
||||
+ if (!IS_ERR_OR_NULL(pdev))
|
||||
+ sc->btnpdev = pdev;
|
||||
+ else {
|
||||
+ sc->btnpdev = NULL;
|
||||
+ devm_kfree(sc->dev, bt);
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
+/* remove GPIO buttons */
|
||||
+static void ath9k_deinit_buttons(struct ath_softc *sc)
|
||||
+{
|
||||
+ if (!sc->gpiochip || !sc->btnpdev)
|
||||
+ return;
|
||||
+
|
||||
+ platform_device_unregister(sc->btnpdev);
|
||||
+
|
||||
+ sc->btnpdev = NULL;
|
||||
+}
|
||||
+
|
||||
#else /* CONFIG_GPIOLIB */
|
||||
|
||||
static inline void ath9k_register_gpio_chip(struct ath_softc *sc)
|
||||
@@ -143,6 +206,14 @@ static inline void ath9k_unregister_gpio
|
||||
{
|
||||
}
|
||||
|
||||
+static inline void ath9k_init_buttons(struct ath_softc *sc)
|
||||
+{
|
||||
+}
|
||||
+
|
||||
+static inline void ath9k_deinit_buttons(struct ath_softc *sc)
|
||||
+{
|
||||
+}
|
||||
+
|
||||
#endif /* CONFIG_GPIOLIB */
|
||||
|
||||
/********************************/
|
||||
@@ -266,6 +337,7 @@ void ath_deinit_leds(struct ath_softc *s
|
||||
{
|
||||
struct ath_led *led;
|
||||
|
||||
+ ath9k_deinit_buttons(sc);
|
||||
while (!list_empty(&sc->leds)) {
|
||||
led = list_first_entry(&sc->leds, struct ath_led, list);
|
||||
#ifdef CONFIG_GPIOLIB
|
||||
@@ -305,6 +377,7 @@ void ath_init_leds(struct ath_softc *sc)
|
||||
}
|
||||
|
||||
ath_fill_led_pin(sc);
|
||||
+ ath9k_init_buttons(sc);
|
||||
|
||||
if (pdata && pdata->leds && pdata->num_leds)
|
||||
for (i = 0; i < pdata->num_leds; i++) {
|
||||
--- a/include/linux/ath9k_platform.h
|
||||
+++ b/include/linux/ath9k_platform.h
|
||||
@@ -49,6 +49,10 @@ struct ath9k_platform_data {
|
||||
|
||||
int num_leds;
|
||||
const struct gpio_led *leds;
|
||||
+
|
||||
+ unsigned num_btns;
|
||||
+ const struct gpio_keys_button *btns;
|
||||
+ unsigned btn_poll_interval;
|
||||
};
|
||||
|
||||
#endif /* _LINUX_ATH9K_PLATFORM_H */
|
||||
15
mac80211/patches/ath/550-ath9k-disable-bands-via-dt.patch
Normal file
15
mac80211/patches/ath/550-ath9k-disable-bands-via-dt.patch
Normal file
@@ -0,0 +1,15 @@
|
||||
--- a/drivers/net/wireless/ath/ath9k/init.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/init.c
|
||||
@@ -627,6 +627,12 @@ static int ath9k_of_init(struct ath_soft
|
||||
|
||||
ath_dbg(common, CONFIG, "parsing configuration from OF node\n");
|
||||
|
||||
+ if (of_property_read_bool(np, "qca,disable-2ghz"))
|
||||
+ ah->disable_2ghz = true;
|
||||
+
|
||||
+ if (of_property_read_bool(np, "qca,disable-5ghz"))
|
||||
+ ah->disable_5ghz = true;
|
||||
+
|
||||
if (of_property_read_bool(np, "qca,no-eeprom")) {
|
||||
/* ath9k-eeprom-<bus>-<id>.bin */
|
||||
scnprintf(eeprom_name, sizeof(eeprom_name),
|
||||
418
mac80211/patches/ath/551-ath9k_ubnt_uap_plus_hsr.patch
Normal file
418
mac80211/patches/ath/551-ath9k_ubnt_uap_plus_hsr.patch
Normal file
@@ -0,0 +1,418 @@
|
||||
--- a/drivers/net/wireless/ath/ath9k/channel.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/channel.c
|
||||
@@ -15,6 +15,8 @@
|
||||
*/
|
||||
|
||||
#include "ath9k.h"
|
||||
+#include <linux/ath9k_platform.h>
|
||||
+#include "hsr.h"
|
||||
|
||||
/* Set/change channels. If the channel is really being changed, it's done
|
||||
* by reseting the chip. To accomplish this we must first cleanup any pending
|
||||
@@ -22,6 +24,7 @@
|
||||
*/
|
||||
static int ath_set_channel(struct ath_softc *sc)
|
||||
{
|
||||
+ struct ath9k_platform_data *pdata = sc->dev->platform_data;
|
||||
struct ath_hw *ah = sc->sc_ah;
|
||||
struct ath_common *common = ath9k_hw_common(ah);
|
||||
struct ieee80211_hw *hw = sc->hw;
|
||||
@@ -42,6 +45,11 @@ static int ath_set_channel(struct ath_so
|
||||
ath_dbg(common, CONFIG, "Set channel: %d MHz width: %d\n",
|
||||
chan->center_freq, chandef->width);
|
||||
|
||||
+ if (pdata && pdata->ubnt_hsr) {
|
||||
+ ath9k_hsr_enable(ah, chandef->width, chan->center_freq);
|
||||
+ ath9k_hsr_status(ah);
|
||||
+ }
|
||||
+
|
||||
/* update survey stats for the old channel before switching */
|
||||
spin_lock_irqsave(&common->cc_lock, flags);
|
||||
ath_update_survey_stats(sc);
|
||||
--- /dev/null
|
||||
+++ b/drivers/net/wireless/ath/ath9k/hsr.c
|
||||
@@ -0,0 +1,247 @@
|
||||
+/*
|
||||
+ *
|
||||
+ * The MIT License (MIT)
|
||||
+ *
|
||||
+ * Copyright (c) 2015 Kirill Berezin
|
||||
+ *
|
||||
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
+ * of this software and associated documentation files (the "Software"), to deal
|
||||
+ * in the Software without restriction, including without limitation the rights
|
||||
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
+ * copies of the Software, and to permit persons to whom the Software is
|
||||
+ * furnished to do so, subject to the following conditions:
|
||||
+ *
|
||||
+ * The above copyright notice and this permission notice shall be included in
|
||||
+ * all copies or substantial portions of the Software.
|
||||
+ *
|
||||
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
+ * SOFTWARE.
|
||||
+ *
|
||||
+ */
|
||||
+
|
||||
+#include <linux/io.h>
|
||||
+#include <linux/slab.h>
|
||||
+#include <linux/module.h>
|
||||
+#include <linux/time.h>
|
||||
+#include <linux/bitops.h>
|
||||
+#include <linux/etherdevice.h>
|
||||
+#include <linux/rtnetlink.h>
|
||||
+#include <asm/unaligned.h>
|
||||
+
|
||||
+#include "hw.h"
|
||||
+#include "ath9k.h"
|
||||
+
|
||||
+#define HSR_GPIO_CSN 8
|
||||
+#define HSR_GPIO_CLK 6
|
||||
+#define HSR_GPIO_DOUT 7
|
||||
+#define HSR_GPIO_DIN 5
|
||||
+
|
||||
+/* delays are in useconds */
|
||||
+#define HSR_DELAY_HALF_TICK 100
|
||||
+#define HSR_DELAY_PRE_WRITE 75
|
||||
+#define HSR_DELAY_FINAL 20000
|
||||
+#define HSR_DELAY_TRAILING 200
|
||||
+
|
||||
+void ath9k_hsr_init(struct ath_hw *ah)
|
||||
+{
|
||||
+ ath9k_hw_gpio_request_in(ah, HSR_GPIO_DIN, NULL);
|
||||
+ ath9k_hw_gpio_request_out(ah, HSR_GPIO_CSN, NULL,
|
||||
+ AR_GPIO_OUTPUT_MUX_AS_OUTPUT);
|
||||
+ ath9k_hw_gpio_request_out(ah, HSR_GPIO_CLK, NULL,
|
||||
+ AR_GPIO_OUTPUT_MUX_AS_OUTPUT);
|
||||
+ ath9k_hw_gpio_request_out(ah, HSR_GPIO_DOUT, NULL,
|
||||
+ AR_GPIO_OUTPUT_MUX_AS_OUTPUT);
|
||||
+
|
||||
+ ath9k_hw_set_gpio(ah, HSR_GPIO_CSN, 1);
|
||||
+ ath9k_hw_set_gpio(ah, HSR_GPIO_CLK, 0);
|
||||
+ ath9k_hw_set_gpio(ah, HSR_GPIO_DOUT, 0);
|
||||
+
|
||||
+ udelay(HSR_DELAY_TRAILING);
|
||||
+}
|
||||
+
|
||||
+static u32 ath9k_hsr_write_byte(struct ath_hw *ah, int delay, u32 value)
|
||||
+{
|
||||
+ struct ath_common *common = ath9k_hw_common(ah);
|
||||
+ int i;
|
||||
+ u32 rval = 0;
|
||||
+
|
||||
+ udelay(delay);
|
||||
+
|
||||
+ ath9k_hw_set_gpio(ah, HSR_GPIO_CLK, 0);
|
||||
+ udelay(HSR_DELAY_HALF_TICK);
|
||||
+
|
||||
+ ath9k_hw_set_gpio(ah, HSR_GPIO_CSN, 0);
|
||||
+ udelay(HSR_DELAY_HALF_TICK);
|
||||
+
|
||||
+ for (i = 0; i < 8; ++i) {
|
||||
+ rval = rval << 1;
|
||||
+
|
||||
+ /* pattern is left to right, that is 7-th bit runs first */
|
||||
+ ath9k_hw_set_gpio(ah, HSR_GPIO_DOUT, (value >> (7 - i)) & 0x1);
|
||||
+ udelay(HSR_DELAY_HALF_TICK);
|
||||
+
|
||||
+ ath9k_hw_set_gpio(ah, HSR_GPIO_CLK, 1);
|
||||
+ udelay(HSR_DELAY_HALF_TICK);
|
||||
+
|
||||
+ rval |= ath9k_hw_gpio_get(ah, HSR_GPIO_DIN);
|
||||
+
|
||||
+ ath9k_hw_set_gpio(ah, HSR_GPIO_CLK, 0);
|
||||
+ udelay(HSR_DELAY_HALF_TICK);
|
||||
+ }
|
||||
+
|
||||
+ ath9k_hw_set_gpio(ah, HSR_GPIO_CSN, 1);
|
||||
+ udelay(HSR_DELAY_HALF_TICK);
|
||||
+
|
||||
+ ath_dbg(common, CONFIG, "ath9k_hsr_write_byte: write byte %d return value is %d %c\n",
|
||||
+ value, rval, rval > 32 ? rval : '-');
|
||||
+
|
||||
+ return rval & 0xff;
|
||||
+}
|
||||
+
|
||||
+static int ath9k_hsr_write_a_chain(struct ath_hw *ah, char *chain, int items)
|
||||
+{
|
||||
+ int status = 0;
|
||||
+ int i = 0;
|
||||
+ int err;
|
||||
+
|
||||
+ /* a preamble */
|
||||
+ ath9k_hsr_write_byte(ah, HSR_DELAY_PRE_WRITE, 0);
|
||||
+ status = ath9k_hsr_write_byte(ah, HSR_DELAY_PRE_WRITE, 0);
|
||||
+
|
||||
+ /* clear HSR's reply buffer */
|
||||
+ if (status) {
|
||||
+ int loop = 0;
|
||||
+
|
||||
+ for (loop = 0; (loop < 42) && status; ++loop)
|
||||
+ status = ath9k_hsr_write_byte(ah, HSR_DELAY_PRE_WRITE,
|
||||
+ 0);
|
||||
+
|
||||
+ if (loop >= 42) {
|
||||
+ ATH_DBG_WARN(1,
|
||||
+ "ath9k_hsr_write_a_chain: can't clear an output buffer after a 42 cycles.\n");
|
||||
+ return -1;
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ for (i = 0; (i < items) && (chain[i] != 0); ++i)
|
||||
+ ath9k_hsr_write_byte(ah, HSR_DELAY_PRE_WRITE, (u32)chain[i]);
|
||||
+
|
||||
+ ath9k_hsr_write_byte(ah, HSR_DELAY_PRE_WRITE, 0);
|
||||
+ mdelay(HSR_DELAY_FINAL / 1000);
|
||||
+
|
||||
+ /* reply */
|
||||
+ memset(chain, 0, items);
|
||||
+
|
||||
+ ath9k_hsr_write_byte(ah, HSR_DELAY_PRE_WRITE, 0);
|
||||
+ udelay(HSR_DELAY_TRAILING);
|
||||
+
|
||||
+ for (i = 0; i < (items - 1); ++i) {
|
||||
+ u32 ret;
|
||||
+
|
||||
+ ret = ath9k_hsr_write_byte(ah, HSR_DELAY_PRE_WRITE, 0);
|
||||
+ if (ret != 0)
|
||||
+ chain[i] = (char)ret;
|
||||
+ else
|
||||
+ break;
|
||||
+
|
||||
+ udelay(HSR_DELAY_TRAILING);
|
||||
+ }
|
||||
+
|
||||
+ if (i <= 1)
|
||||
+ return 0;
|
||||
+
|
||||
+ err = kstrtoint(chain + 1, 10, &i);
|
||||
+ if (err)
|
||||
+ return err;
|
||||
+
|
||||
+ return i;
|
||||
+}
|
||||
+
|
||||
+int ath9k_hsr_disable(struct ath_hw *ah)
|
||||
+{
|
||||
+ char cmd[10] = {'b', '4', '0', 0, 0, 0, 0, 0, 0, 0};
|
||||
+ int ret;
|
||||
+
|
||||
+ ret = ath9k_hsr_write_a_chain(ah, cmd, sizeof(cmd));
|
||||
+ if ((ret > 0) && (*cmd == 'B'))
|
||||
+ return 0;
|
||||
+
|
||||
+ return -1;
|
||||
+}
|
||||
+
|
||||
+int ath9k_hsr_enable(struct ath_hw *ah, int bw, int fq)
|
||||
+{
|
||||
+ char cmd[10];
|
||||
+ int ret;
|
||||
+
|
||||
+ /* Bandwidth argument is 0 sometimes. Assume default 802.11bgn
|
||||
+ * 20MHz on invalid values
|
||||
+ */
|
||||
+ if ((bw != 5) && (bw != 10) && (bw != 20) && (bw != 40))
|
||||
+ bw = 20;
|
||||
+
|
||||
+ memset(cmd, 0, sizeof(cmd));
|
||||
+ *cmd = 'b';
|
||||
+ snprintf(cmd + 1, 3, "%02d", bw);
|
||||
+
|
||||
+ ret = ath9k_hsr_write_a_chain(ah, cmd, sizeof(cmd));
|
||||
+ if ((*cmd != 'B') || (ret != bw)) {
|
||||
+ ATH_DBG_WARN(1,
|
||||
+ "ath9k_hsr_enable: failed changing bandwidth -> set (%d,%d) reply (%d, %d)\n",
|
||||
+ 'b', bw, *cmd, ret);
|
||||
+ return -1;
|
||||
+ }
|
||||
+
|
||||
+ memset(cmd, 0, sizeof(cmd));
|
||||
+ *cmd = 'x';
|
||||
+ ret = ath9k_hsr_write_a_chain(ah, cmd, sizeof(cmd));
|
||||
+ if (*cmd != 'X') {
|
||||
+ ATH_DBG_WARN(1,
|
||||
+ "ath9k_hsr_enable: failed 'x' command -> reply (%d, %d)\n",
|
||||
+ *cmd, ret);
|
||||
+ return -1;
|
||||
+ }
|
||||
+
|
||||
+ memset(cmd, 0, sizeof(cmd));
|
||||
+ *cmd = 'm';
|
||||
+ ret = ath9k_hsr_write_a_chain(ah, cmd, sizeof(cmd));
|
||||
+ if (*cmd != 'M') {
|
||||
+ ATH_DBG_WARN(1,
|
||||
+ "ath9k_hsr_enable: failed 'm' command -> reply (%d, %d)\n",
|
||||
+ *cmd, ret);
|
||||
+ return -1;
|
||||
+ }
|
||||
+
|
||||
+ memset(cmd, 0, sizeof(cmd));
|
||||
+ *cmd = 'f';
|
||||
+ snprintf(cmd + 1, 6, "%05d", fq);
|
||||
+ ret = ath9k_hsr_write_a_chain(ah, cmd, sizeof(cmd));
|
||||
+ if ((*cmd != 'F') && (ret != fq)) {
|
||||
+ ATH_DBG_WARN(1,
|
||||
+ "ath9k_hsr_enable: failed set frequency -> reply (%d, %d)\n",
|
||||
+ *cmd, ret);
|
||||
+ return -1;
|
||||
+ }
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+int ath9k_hsr_status(struct ath_hw *ah)
|
||||
+{
|
||||
+ char cmd[10] = {'s', 0, 0, 0, 0, 0, 0, 0, 0, 0};
|
||||
+ int ret;
|
||||
+
|
||||
+ ret = ath9k_hsr_write_a_chain(ah, cmd, sizeof(cmd));
|
||||
+ if (*cmd != 'S') {
|
||||
+ ATH_DBG_WARN(1, "ath9k_hsr_status: returned %d,%d\n", *cmd,
|
||||
+ ret);
|
||||
+ return -1;
|
||||
+ }
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
--- /dev/null
|
||||
+++ b/drivers/net/wireless/ath/ath9k/hsr.h
|
||||
@@ -0,0 +1,48 @@
|
||||
+/*
|
||||
+ * The MIT License (MIT)
|
||||
+ *
|
||||
+ * Copyright (c) 2015 Kirill Berezin
|
||||
+ *
|
||||
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
+ * of this software and associated documentation files (the "Software"), to deal
|
||||
+ * in the Software without restriction, including without limitation the rights
|
||||
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
+ * copies of the Software, and to permit persons to whom the Software is
|
||||
+ * furnished to do so, subject to the following conditions:
|
||||
+ *
|
||||
+ * The above copyright notice and this permission notice shall be included in
|
||||
+ * all copies or substantial portions of the Software.
|
||||
+ *
|
||||
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
+ * SOFTWARE.
|
||||
+ */
|
||||
+
|
||||
+#ifndef HSR_H
|
||||
+#define HSR_H
|
||||
+
|
||||
+#ifdef CPTCFG_ATH9K_UBNTHSR
|
||||
+
|
||||
+void ath9k_hsr_init(struct ath_hw *ah);
|
||||
+int ath9k_hsr_disable(struct ath_hw *ah);
|
||||
+int ath9k_hsr_enable(struct ath_hw *ah, int bw, int fq);
|
||||
+int ath9k_hsr_status(struct ath_hw *ah);
|
||||
+
|
||||
+#else
|
||||
+static inline void ath9k_hsr_init(struct ath_hw *ah) {}
|
||||
+
|
||||
+static inline int ath9k_hsr_enable(struct ath_hw *ah, int bw, int fq)
|
||||
+{
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static inline int ath9k_hsr_disable(struct ath_hw *ah) { return 0; }
|
||||
+static inline int ath9k_hsr_status(struct ath_hw *ah) { return 0; }
|
||||
+
|
||||
+#endif
|
||||
+
|
||||
+#endif /* HSR_H */
|
||||
--- a/drivers/net/wireless/ath/ath9k/main.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/main.c
|
||||
@@ -16,8 +16,10 @@
|
||||
|
||||
#include <linux/nl80211.h>
|
||||
#include <linux/delay.h>
|
||||
+#include <linux/ath9k_platform.h>
|
||||
#include "ath9k.h"
|
||||
#include "btcoex.h"
|
||||
+#include "hsr.h"
|
||||
|
||||
u8 ath9k_parse_mpdudensity(u8 mpdudensity)
|
||||
{
|
||||
@@ -649,6 +651,7 @@ void ath_reset_work(struct work_struct *
|
||||
static int ath9k_start(struct ieee80211_hw *hw)
|
||||
{
|
||||
struct ath_softc *sc = hw->priv;
|
||||
+ struct ath9k_platform_data *pdata = sc->dev->platform_data;
|
||||
struct ath_hw *ah = sc->sc_ah;
|
||||
struct ath_common *common = ath9k_hw_common(ah);
|
||||
struct ieee80211_channel *curchan = sc->cur_chan->chandef.chan;
|
||||
@@ -727,6 +730,11 @@ static int ath9k_start(struct ieee80211_
|
||||
AR_GPIO_OUTPUT_MUX_AS_OUTPUT);
|
||||
}
|
||||
|
||||
+ if (pdata && pdata->ubnt_hsr) {
|
||||
+ ath9k_hsr_init(ah);
|
||||
+ ath9k_hsr_disable(ah);
|
||||
+ }
|
||||
+
|
||||
/*
|
||||
* Reset key cache to sane defaults (all entries cleared) instead of
|
||||
* semi-random values after suspend/resume.
|
||||
--- a/drivers/net/wireless/ath/ath9k/Makefile
|
||||
+++ b/drivers/net/wireless/ath/ath9k/Makefile
|
||||
@@ -17,6 +17,7 @@ ath9k-$(CPTCFG_ATH9K_DFS_CERTIFIED) += d
|
||||
ath9k-$(CPTCFG_ATH9K_TX99) += tx99.o
|
||||
ath9k-$(CPTCFG_ATH9K_WOW) += wow.o
|
||||
ath9k-$(CPTCFG_ATH9K_HWRNG) += rng.o
|
||||
+ath9k-$(CPTCFG_ATH9K_UBNTHSR) += hsr.o
|
||||
|
||||
ath9k-$(CPTCFG_ATH9K_DEBUGFS) += debug.o
|
||||
|
||||
--- a/include/linux/ath9k_platform.h
|
||||
+++ b/include/linux/ath9k_platform.h
|
||||
@@ -53,6 +53,8 @@ struct ath9k_platform_data {
|
||||
unsigned num_btns;
|
||||
const struct gpio_keys_button *btns;
|
||||
unsigned btn_poll_interval;
|
||||
+
|
||||
+ bool ubnt_hsr;
|
||||
};
|
||||
|
||||
#endif /* _LINUX_ATH9K_PLATFORM_H */
|
||||
--- a/local-symbols
|
||||
+++ b/local-symbols
|
||||
@@ -112,6 +112,7 @@ ATH9K_WOW=
|
||||
ATH9K_RFKILL=
|
||||
ATH9K_CHANNEL_CONTEXT=
|
||||
ATH9K_PCOEM=
|
||||
+ATH9K_UBNTHSR=
|
||||
ATH9K_PCI_NO_EEPROM=
|
||||
ATH9K_HTC=
|
||||
ATH9K_HTC_DEBUGFS=
|
||||
--- a/drivers/net/wireless/ath/ath9k/Kconfig
|
||||
+++ b/drivers/net/wireless/ath/ath9k/Kconfig
|
||||
@@ -60,6 +60,19 @@ config ATH9K_AHB
|
||||
Say Y, if you have a SoC with a compatible built-in
|
||||
wireless MAC. Say N if unsure.
|
||||
|
||||
+config ATH9K_UBNTHSR
|
||||
+ bool "Ubiquiti UniFi Outdoor Plus HSR support"
|
||||
+ depends on ATH9K
|
||||
+ ---help---
|
||||
+ This options enables code to control the HSR RF
|
||||
+ filter in the receive path of the Ubiquiti UniFi
|
||||
+ Outdoor Plus access point.
|
||||
+
|
||||
+ Say Y if you want to use the access point. The
|
||||
+ code will only be used if the device is detected,
|
||||
+ so it does not harm other setup other than occupying
|
||||
+ a bit of memory.
|
||||
+
|
||||
config ATH9K_DEBUGFS
|
||||
bool "Atheros ath9k debugging"
|
||||
depends on ATH9K && DEBUG_FS
|
||||
337
mac80211/patches/ath/552-ahb_of.patch
Normal file
337
mac80211/patches/ath/552-ahb_of.patch
Normal file
@@ -0,0 +1,337 @@
|
||||
--- a/drivers/net/wireless/ath/ath9k/ahb.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/ahb.c
|
||||
@@ -20,7 +20,15 @@
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/mod_devicetable.h>
|
||||
+#include <linux/of_device.h>
|
||||
#include "ath9k.h"
|
||||
+#include <linux/ath9k_platform.h>
|
||||
+
|
||||
+#ifdef CONFIG_OF
|
||||
+#include <asm/mach-ath79/ath79.h>
|
||||
+#include <asm/mach-ath79/ar71xx_regs.h>
|
||||
+#include <linux/mtd/mtd.h>
|
||||
+#endif
|
||||
|
||||
static const struct platform_device_id ath9k_platform_id_table[] = {
|
||||
{
|
||||
@@ -69,6 +77,242 @@ static const struct ath_bus_ops ath_ahb_
|
||||
.eeprom_read = ath_ahb_eeprom_read,
|
||||
};
|
||||
|
||||
+#ifdef CONFIG_OF
|
||||
+
|
||||
+#define QCA955X_DDR_CTL_CONFIG 0x108
|
||||
+#define QCA955X_DDR_CTL_CONFIG_ACT_WMAC BIT(23)
|
||||
+
|
||||
+static int of_get_wifi_cal(struct device_node *np, struct ath9k_platform_data *pdata)
|
||||
+{
|
||||
+#ifdef CONFIG_MTD
|
||||
+ struct device_node *mtd_np = NULL;
|
||||
+ size_t retlen;
|
||||
+ int size, ret;
|
||||
+ struct mtd_info *mtd;
|
||||
+ const char *part;
|
||||
+ const __be32 *list;
|
||||
+ phandle phandle;
|
||||
+
|
||||
+ list = of_get_property(np, "mtd-cal-data", &size);
|
||||
+ if (!list)
|
||||
+ return 0;
|
||||
+
|
||||
+ if (size != (2 * sizeof(*list)))
|
||||
+ return 1;
|
||||
+
|
||||
+ phandle = be32_to_cpup(list++);
|
||||
+ if (phandle)
|
||||
+ mtd_np = of_find_node_by_phandle(phandle);
|
||||
+
|
||||
+ if (!mtd_np)
|
||||
+ return 1;
|
||||
+
|
||||
+ part = of_get_property(mtd_np, "label", NULL);
|
||||
+ if (!part)
|
||||
+ part = mtd_np->name;
|
||||
+
|
||||
+ mtd = get_mtd_device_nm(part);
|
||||
+ if (IS_ERR(mtd))
|
||||
+ return 1;
|
||||
+
|
||||
+ ret = mtd_read(mtd, be32_to_cpup(list), sizeof(pdata->eeprom_data),
|
||||
+ &retlen, (u8*)pdata->eeprom_data);
|
||||
+ put_mtd_device(mtd);
|
||||
+
|
||||
+#endif
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static int ar913x_wmac_reset(void)
|
||||
+{
|
||||
+ ath79_device_reset_set(AR913X_RESET_AMBA2WMAC);
|
||||
+ mdelay(10);
|
||||
+
|
||||
+ ath79_device_reset_clear(AR913X_RESET_AMBA2WMAC);
|
||||
+ mdelay(10);
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static int ar933x_wmac_reset(void)
|
||||
+{
|
||||
+ int retries = 20;
|
||||
+
|
||||
+ ath79_device_reset_set(AR933X_RESET_WMAC);
|
||||
+ ath79_device_reset_clear(AR933X_RESET_WMAC);
|
||||
+
|
||||
+ while (1) {
|
||||
+ u32 bootstrap;
|
||||
+
|
||||
+ bootstrap = ath79_reset_rr(AR933X_RESET_REG_BOOTSTRAP);
|
||||
+ if ((bootstrap & AR933X_BOOTSTRAP_EEPBUSY) == 0)
|
||||
+ return 0;
|
||||
+
|
||||
+ if (retries-- == 0)
|
||||
+ break;
|
||||
+
|
||||
+ udelay(10000);
|
||||
+ }
|
||||
+
|
||||
+ pr_err("ar933x: WMAC reset timed out");
|
||||
+ return -ETIMEDOUT;
|
||||
+}
|
||||
+
|
||||
+static int qca955x_wmac_reset(void)
|
||||
+{
|
||||
+ int i;
|
||||
+
|
||||
+ /* Try to wait for WMAC DDR activity to stop */
|
||||
+ for (i = 0; i < 10; i++) {
|
||||
+ if (!(__raw_readl(ath79_ddr_base + QCA955X_DDR_CTL_CONFIG) &
|
||||
+ QCA955X_DDR_CTL_CONFIG_ACT_WMAC))
|
||||
+ break;
|
||||
+
|
||||
+ udelay(10);
|
||||
+ }
|
||||
+
|
||||
+ ath79_device_reset_set(QCA955X_RESET_RTC);
|
||||
+ udelay(10);
|
||||
+ ath79_device_reset_clear(QCA955X_RESET_RTC);
|
||||
+ udelay(10);
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+enum {
|
||||
+ AR913X_WMAC = 0,
|
||||
+ AR933X_WMAC,
|
||||
+ AR934X_WMAC,
|
||||
+ QCA953X_WMAC,
|
||||
+ QCA955X_WMAC,
|
||||
+ QCA956X_WMAC,
|
||||
+};
|
||||
+
|
||||
+static int ar9330_get_soc_revision(void)
|
||||
+{
|
||||
+ if (ath79_soc_rev == 1)
|
||||
+ return ath79_soc_rev;
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static int ath79_get_soc_revision(void)
|
||||
+{
|
||||
+ return ath79_soc_rev;
|
||||
+}
|
||||
+
|
||||
+static const struct of_ath_ahb_data {
|
||||
+ u16 dev_id;
|
||||
+ u32 bootstrap_reg;
|
||||
+ u32 bootstrap_ref;
|
||||
+
|
||||
+ int (*soc_revision)(void);
|
||||
+ int (*wmac_reset)(void);
|
||||
+} of_ath_ahb_data[] = {
|
||||
+ [AR913X_WMAC] = {
|
||||
+ .dev_id = AR5416_AR9100_DEVID,
|
||||
+ .wmac_reset = ar913x_wmac_reset,
|
||||
+
|
||||
+ },
|
||||
+ [AR933X_WMAC] = {
|
||||
+ .dev_id = AR9300_DEVID_AR9330,
|
||||
+ .bootstrap_reg = AR933X_RESET_REG_BOOTSTRAP,
|
||||
+ .bootstrap_ref = AR933X_BOOTSTRAP_REF_CLK_40,
|
||||
+ .soc_revision = ar9330_get_soc_revision,
|
||||
+ .wmac_reset = ar933x_wmac_reset,
|
||||
+ },
|
||||
+ [AR934X_WMAC] = {
|
||||
+ .dev_id = AR9300_DEVID_AR9340,
|
||||
+ .bootstrap_reg = AR934X_RESET_REG_BOOTSTRAP,
|
||||
+ .bootstrap_ref = AR934X_BOOTSTRAP_REF_CLK_40,
|
||||
+ .soc_revision = ath79_get_soc_revision,
|
||||
+ },
|
||||
+ [QCA953X_WMAC] = {
|
||||
+ .dev_id = AR9300_DEVID_AR953X,
|
||||
+ .bootstrap_reg = QCA953X_RESET_REG_BOOTSTRAP,
|
||||
+ .bootstrap_ref = QCA953X_BOOTSTRAP_REF_CLK_40,
|
||||
+ .soc_revision = ath79_get_soc_revision,
|
||||
+ },
|
||||
+ [QCA955X_WMAC] = {
|
||||
+ .dev_id = AR9300_DEVID_QCA955X,
|
||||
+ .bootstrap_reg = QCA955X_RESET_REG_BOOTSTRAP,
|
||||
+ .bootstrap_ref = QCA955X_BOOTSTRAP_REF_CLK_40,
|
||||
+ .wmac_reset = qca955x_wmac_reset,
|
||||
+ },
|
||||
+ [QCA956X_WMAC] = {
|
||||
+ .dev_id = AR9300_DEVID_QCA956X,
|
||||
+ .bootstrap_reg = QCA956X_RESET_REG_BOOTSTRAP,
|
||||
+ .bootstrap_ref = QCA956X_BOOTSTRAP_REF_CLK_40,
|
||||
+ .soc_revision = ath79_get_soc_revision,
|
||||
+ },
|
||||
+};
|
||||
+
|
||||
+const struct of_device_id of_ath_ahb_match[] = {
|
||||
+ { .compatible = "qca,ar9130-wmac", .data = &of_ath_ahb_data[AR913X_WMAC] },
|
||||
+ { .compatible = "qca,ar9330-wmac", .data = &of_ath_ahb_data[AR933X_WMAC] },
|
||||
+ { .compatible = "qca,ar9340-wmac", .data = &of_ath_ahb_data[AR934X_WMAC] },
|
||||
+ { .compatible = "qca,qca9530-wmac", .data = &of_ath_ahb_data[QCA953X_WMAC] },
|
||||
+ { .compatible = "qca,qca9550-wmac", .data = &of_ath_ahb_data[QCA955X_WMAC] },
|
||||
+ { .compatible = "qca,qca9560-wmac", .data = &of_ath_ahb_data[QCA956X_WMAC] },
|
||||
+ {},
|
||||
+};
|
||||
+MODULE_DEVICE_TABLE(of, of_ath_ahb_match);
|
||||
+
|
||||
+static int of_ath_ahb_probe(struct platform_device *pdev)
|
||||
+{
|
||||
+ struct ath9k_platform_data *pdata;
|
||||
+ const struct of_device_id *match;
|
||||
+ const struct of_ath_ahb_data *data;
|
||||
+ u8 led_pin;
|
||||
+
|
||||
+ match = of_match_device(of_ath_ahb_match, &pdev->dev);
|
||||
+ data = (const struct of_ath_ahb_data *)match->data;
|
||||
+
|
||||
+ pdata = dev_get_platdata(&pdev->dev);
|
||||
+
|
||||
+ if (!of_property_read_u8(pdev->dev.of_node, "qca,led-pin", &led_pin))
|
||||
+ pdata->led_pin = led_pin;
|
||||
+ else
|
||||
+ pdata->led_pin = -1;
|
||||
+
|
||||
+ if (of_property_read_bool(pdev->dev.of_node, "qca,disable-2ghz"))
|
||||
+ pdata->disable_2ghz = true;
|
||||
+
|
||||
+ if (of_property_read_bool(pdev->dev.of_node, "qca,disable-5ghz"))
|
||||
+ pdata->disable_5ghz = true;
|
||||
+
|
||||
+ if (of_property_read_bool(pdev->dev.of_node, "qca,tx-gain-buffalo"))
|
||||
+ pdata->tx_gain_buffalo = true;
|
||||
+
|
||||
+ if (data->wmac_reset) {
|
||||
+ data->wmac_reset();
|
||||
+ pdata->external_reset = data->wmac_reset;
|
||||
+ }
|
||||
+
|
||||
+ if (data->dev_id == AR9300_DEVID_AR953X) {
|
||||
+ /*
|
||||
+ * QCA953x only supports 25MHz refclk.
|
||||
+ * Some vendors have an invalid bootstrap option
|
||||
+ * set, which would break the WMAC here.
|
||||
+ */
|
||||
+ pdata->is_clk_25mhz = true;
|
||||
+ } else if (data->bootstrap_reg && data->bootstrap_ref) {
|
||||
+ u32 t = ath79_reset_rr(data->bootstrap_reg);
|
||||
+ if (t & data->bootstrap_ref)
|
||||
+ pdata->is_clk_25mhz = false;
|
||||
+ else
|
||||
+ pdata->is_clk_25mhz = true;
|
||||
+ }
|
||||
+
|
||||
+ pdata->get_mac_revision = data->soc_revision;
|
||||
+
|
||||
+ if (of_get_wifi_cal(pdev->dev.of_node, pdata))
|
||||
+ dev_err(&pdev->dev, "failed to load calibration data from mtd device\n");
|
||||
+
|
||||
+ return data->dev_id;
|
||||
+}
|
||||
+#endif
|
||||
+
|
||||
static int ath_ahb_probe(struct platform_device *pdev)
|
||||
{
|
||||
void __iomem *mem;
|
||||
@@ -80,6 +324,17 @@ static int ath_ahb_probe(struct platform
|
||||
int ret = 0;
|
||||
struct ath_hw *ah;
|
||||
char hw_name[64];
|
||||
+ u16 dev_id;
|
||||
+
|
||||
+ if (id)
|
||||
+ dev_id = id->driver_data;
|
||||
+
|
||||
+#ifdef CONFIG_OF
|
||||
+ if (pdev->dev.of_node)
|
||||
+ pdev->dev.platform_data = devm_kzalloc(&pdev->dev,
|
||||
+ sizeof(struct ath9k_platform_data),
|
||||
+ GFP_KERNEL);
|
||||
+#endif
|
||||
|
||||
if (!dev_get_platdata(&pdev->dev)) {
|
||||
dev_err(&pdev->dev, "no platform data specified\n");
|
||||
@@ -122,13 +377,16 @@ static int ath_ahb_probe(struct platform
|
||||
sc->mem = mem;
|
||||
sc->irq = irq;
|
||||
|
||||
+#ifdef CONFIG_OF
|
||||
+ dev_id = of_ath_ahb_probe(pdev);
|
||||
+#endif
|
||||
ret = request_irq(irq, ath_isr, IRQF_SHARED, "ath9k", sc);
|
||||
if (ret) {
|
||||
dev_err(&pdev->dev, "request_irq failed\n");
|
||||
goto err_free_hw;
|
||||
}
|
||||
|
||||
- ret = ath9k_init_device(id->driver_data, sc, &ath_ahb_bus_ops);
|
||||
+ ret = ath9k_init_device(dev_id, sc, &ath_ahb_bus_ops);
|
||||
if (ret) {
|
||||
dev_err(&pdev->dev, "failed to initialize device\n");
|
||||
goto err_irq;
|
||||
@@ -159,6 +417,9 @@ static int ath_ahb_remove(struct platfor
|
||||
free_irq(sc->irq, sc);
|
||||
ieee80211_free_hw(sc->hw);
|
||||
}
|
||||
+#ifdef CONFIG_OF
|
||||
+ pdev->dev.platform_data = NULL;
|
||||
+#endif
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -168,6 +429,9 @@ static struct platform_driver ath_ahb_dr
|
||||
.remove = ath_ahb_remove,
|
||||
.driver = {
|
||||
.name = "ath9k",
|
||||
+#ifdef CONFIG_OF
|
||||
+ .of_match_table = of_ath_ahb_match,
|
||||
+#endif
|
||||
},
|
||||
.id_table = ath9k_platform_id_table,
|
||||
};
|
||||
--- a/drivers/net/wireless/ath/ath9k/ath9k.h
|
||||
+++ b/drivers/net/wireless/ath/ath9k/ath9k.h
|
||||
@@ -25,6 +25,7 @@
|
||||
#include <linux/time.h>
|
||||
#include <linux/hw_random.h>
|
||||
#include <linux/gpio/driver.h>
|
||||
+#include <linux/reset.h>
|
||||
|
||||
#include "common.h"
|
||||
#include "debug.h"
|
||||
@@ -1011,6 +1012,9 @@ struct ath_softc {
|
||||
struct ath_hw *sc_ah;
|
||||
void __iomem *mem;
|
||||
int irq;
|
||||
+#ifdef CONFIG_OF
|
||||
+ struct reset_control *reset;
|
||||
+#endif
|
||||
spinlock_t sc_serial_rw;
|
||||
spinlock_t sc_pm_lock;
|
||||
spinlock_t sc_pcu_lock;
|
||||
25
mac80211/patches/ath/553-ath9k_of_gpio_mask.patch
Normal file
25
mac80211/patches/ath/553-ath9k_of_gpio_mask.patch
Normal file
@@ -0,0 +1,25 @@
|
||||
--- a/drivers/net/wireless/ath/ath9k/init.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/init.c
|
||||
@@ -654,6 +654,12 @@ static int ath9k_of_init(struct ath_soft
|
||||
return 0;
|
||||
}
|
||||
|
||||
+static void ath9k_of_gpio_mask(struct ath_softc *sc)
|
||||
+{
|
||||
+ of_property_read_u32(sc->dev->of_node, "qca,gpio-mask",
|
||||
+ &sc->sc_ah->caps.gpio_mask);
|
||||
+}
|
||||
+
|
||||
static int ath9k_init_softc(u16 devid, struct ath_softc *sc,
|
||||
const struct ath_bus_ops *bus_ops)
|
||||
{
|
||||
@@ -758,6 +764,9 @@ static int ath9k_init_softc(u16 devid, s
|
||||
if (ret)
|
||||
goto err_hw;
|
||||
|
||||
+ /* GPIO mask quirk */
|
||||
+ ath9k_of_gpio_mask(sc);
|
||||
+
|
||||
ret = ath9k_init_queues(sc);
|
||||
if (ret)
|
||||
goto err_queues;
|
||||
@@ -0,0 +1,33 @@
|
||||
From: Sven Eckelmann <sven@open-mesh.com>
|
||||
Date: Tue, 18 Nov 2014 12:29:28 +0100
|
||||
Subject: [PATCH] ath10k: Don't initialize devices asynchronously
|
||||
|
||||
OpenWrt requires all PHYs to be initialized to create the configuration files
|
||||
during bootup. ath10k violates this because it delays the creation of the PHY
|
||||
to a not well defined point in the future.
|
||||
|
||||
Forcing the work to be done immediately works around this problem but may also
|
||||
delay the boot when firmware images cannot be found.
|
||||
|
||||
Signed-off-by: Sven Eckelmann <sven@open-mesh.com>
|
||||
---
|
||||
|
||||
--- a/drivers/net/wireless/ath/ath10k/core.c
|
||||
+++ b/drivers/net/wireless/ath/ath10k/core.c
|
||||
@@ -3172,6 +3172,16 @@ int ath10k_core_register(struct ath10k *
|
||||
|
||||
queue_work(ar->workqueue, &ar->register_work);
|
||||
|
||||
+ /* OpenWrt requires all PHYs to be initialized to create the
|
||||
+ * configuration files during bootup. ath10k violates this
|
||||
+ * because it delays the creation of the PHY to a not well defined
|
||||
+ * point in the future.
|
||||
+ *
|
||||
+ * Forcing the work to be done immediately works around this problem
|
||||
+ * but may also delay the boot when firmware images cannot be found.
|
||||
+ */
|
||||
+ flush_workqueue(ar->workqueue);
|
||||
+
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL(ath10k_core_register);
|
||||
@@ -0,0 +1,37 @@
|
||||
From: Linus Lüssing <ll@simonwunderlich.de>
|
||||
Date: Wed, 5 Feb 2020 20:10:43 +0100
|
||||
Subject: ath10k: increase rx buffer size to 2048
|
||||
|
||||
Before, only frames with a maximum size of 1528 bytes could be
|
||||
transmitted between two 802.11s nodes.
|
||||
|
||||
For batman-adv for instance, which adds its own header to each frame,
|
||||
we typically need an MTU of at least 1532 bytes to be able to transmit
|
||||
without fragmentation.
|
||||
|
||||
This patch now increases the maxmimum frame size from 1528 to 1656
|
||||
bytes.
|
||||
|
||||
Tested with two ath10k devices in 802.11s mode, as well as with
|
||||
batman-adv on top of 802.11s with forwarding disabled.
|
||||
|
||||
Fix originally found and developed by Ben Greear.
|
||||
|
||||
Link: https://github.com/greearb/ath10k-ct/issues/89
|
||||
Link: https://github.com/greearb/ath10k-ct/commit/9e5ab25027e0971fa24ccf93373324c08c4e992d
|
||||
Cc: Ben Greear <greearb@candelatech.com>
|
||||
Signed-off-by: Linus Lüssing <ll@simonwunderlich.de>
|
||||
|
||||
Forwarded: https://patchwork.kernel.org/patch/11367055/
|
||||
|
||||
--- a/drivers/net/wireless/ath/ath10k/htt.h
|
||||
+++ b/drivers/net/wireless/ath/ath10k/htt.h
|
||||
@@ -2242,7 +2242,7 @@ struct htt_rx_chan_info {
|
||||
* Should be: sizeof(struct htt_host_rx_desc) + max rx MSDU size,
|
||||
* rounded up to a cache line size.
|
||||
*/
|
||||
-#define HTT_RX_BUF_SIZE 1920
|
||||
+#define HTT_RX_BUF_SIZE 2048
|
||||
#define HTT_RX_MSDU_SIZE (HTT_RX_BUF_SIZE - (int)sizeof(struct htt_rx_desc))
|
||||
|
||||
/* Refill a bunch of RX buffers for each refill round so that FW/HW can handle
|
||||
37
mac80211/patches/ath/930-ath10k_add_tpt_led_trigger.patch
Normal file
37
mac80211/patches/ath/930-ath10k_add_tpt_led_trigger.patch
Normal file
@@ -0,0 +1,37 @@
|
||||
--- a/drivers/net/wireless/ath/ath10k/mac.c
|
||||
+++ b/drivers/net/wireless/ath/ath10k/mac.c
|
||||
@@ -9053,6 +9053,21 @@ static int ath10k_mac_init_rd(struct ath
|
||||
return 0;
|
||||
}
|
||||
|
||||
+#ifdef CPTCFG_MAC80211_LEDS
|
||||
+static const struct ieee80211_tpt_blink ath10k_tpt_blink[] = {
|
||||
+ { .throughput = 0 * 1024, .blink_time = 334 },
|
||||
+ { .throughput = 1 * 1024, .blink_time = 260 },
|
||||
+ { .throughput = 2 * 1024, .blink_time = 220 },
|
||||
+ { .throughput = 5 * 1024, .blink_time = 190 },
|
||||
+ { .throughput = 10 * 1024, .blink_time = 170 },
|
||||
+ { .throughput = 25 * 1024, .blink_time = 150 },
|
||||
+ { .throughput = 54 * 1024, .blink_time = 130 },
|
||||
+ { .throughput = 120 * 1024, .blink_time = 110 },
|
||||
+ { .throughput = 265 * 1024, .blink_time = 80 },
|
||||
+ { .throughput = 586 * 1024, .blink_time = 50 },
|
||||
+};
|
||||
+#endif
|
||||
+
|
||||
int ath10k_mac_register(struct ath10k *ar)
|
||||
{
|
||||
static const u32 cipher_suites[] = {
|
||||
@@ -9380,6 +9395,12 @@ int ath10k_mac_register(struct ath10k *a
|
||||
|
||||
ar->hw->weight_multiplier = ATH10K_AIRTIME_WEIGHT_MULTIPLIER;
|
||||
|
||||
+#ifdef CPTCFG_MAC80211_LEDS
|
||||
+ ieee80211_create_tpt_led_trigger(ar->hw,
|
||||
+ IEEE80211_TPT_LEDTRIG_FL_RADIO, ath10k_tpt_blink,
|
||||
+ ARRAY_SIZE(ath10k_tpt_blink));
|
||||
+#endif
|
||||
+
|
||||
ret = ieee80211_register_hw(ar->hw);
|
||||
if (ret) {
|
||||
ath10k_err(ar, "failed to register ieee80211: %d\n", ret);
|
||||
@@ -0,0 +1,609 @@
|
||||
From: Sebastian Gottschall <s.gottschall@newmedia-net.de>
|
||||
|
||||
Adds LED and GPIO Control support for 988x, 9887, 9888, 99x0, 9984 based
|
||||
chipsets with on chipset connected led's using WMI Firmware API. The LED
|
||||
device will get available named as "ath10k-phyX" at sysfs and can be controlled
|
||||
with various triggers. adds also debugfs interface for gpio control.
|
||||
|
||||
This patch is specific for OpenWRt base, as is use old backported package
|
||||
with old wireless source. Support for QCA9984 is removed and a simbol
|
||||
is added to local-simbol file to export the actually compile the code
|
||||
with the ATH10K_LEDS simbol.
|
||||
|
||||
|
||||
Signed-off-by: Sebastian Gottschall <s.gottschall@dd-wrt.com>
|
||||
Reviewed-by: Steve deRosier <derosier@cal-sierra.com>
|
||||
[kvalo: major reorg and cleanup]
|
||||
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
|
||||
Signed-off-by: Ansuel Smith <ansuelsmth@gmail.com>
|
||||
---
|
||||
|
||||
v13:
|
||||
|
||||
* only compile tested!
|
||||
|
||||
* fix all checkpatch warnings
|
||||
|
||||
* fix commit log
|
||||
|
||||
* sizeof(struct ath10k_gpiocontrol) -> sizeof(*gpio)
|
||||
|
||||
* unsigned -> unsigned int
|
||||
|
||||
* remove GPIOLIB code, that should be added in a separate patch
|
||||
|
||||
* rename gpio.c to leds.c
|
||||
|
||||
* add leds.h
|
||||
|
||||
* rename some functions:
|
||||
|
||||
ath10k_attach_led() -> ath10k_leds_register()
|
||||
ath10k_unregister_led() -> ath10k_leds_unregister()
|
||||
ath10k_reset_led_pin() -> ath10k_leds_start()
|
||||
|
||||
* call ath10k_leds_unregister() before ath10k_thermal_unregister() to preserve ordering
|
||||
|
||||
* call ath10k_leds_start() only from ath10k_core_start() and not from mac.c
|
||||
|
||||
* rename struct ath10k_gpiocontrol as anonymous function under struct
|
||||
ath10k::leds, no need for memory allocation
|
||||
|
||||
* merge ath10k_add_led() to ath10k_attach_led(), which is it's only caller
|
||||
|
||||
* remove #if IS_ENABLED() checks from most of places, memory savings from those were not worth it
|
||||
|
||||
* Kconfig help text improvement and move it lower in the menu, also don't enable it by default
|
||||
|
||||
* switch to set_brightness_blocking() so that the callback can sleep,
|
||||
then no need to use ath10k_wmi_cmd_send_nowait() and can take mutex
|
||||
to access ar->state
|
||||
|
||||
* don't touch ath10k_wmi_pdev_get_temperature()
|
||||
|
||||
* as QCA6174/QCA9377 are not (yet) supported don't add the command to WMI-TLV interface
|
||||
|
||||
* remove debugfs interface, that should be added in another patch
|
||||
|
||||
* cleanup includes
|
||||
|
||||
|
||||
drivers/net/wireless/ath/ath10k/Kconfig | 10 +++
|
||||
drivers/net/wireless/ath/ath10k/Makefile | 1 +
|
||||
drivers/net/wireless/ath/ath10k/core.c | 22 +++++++
|
||||
drivers/net/wireless/ath/ath10k/core.h | 9 ++-
|
||||
drivers/net/wireless/ath/ath10k/hw.h | 1 +
|
||||
drivers/net/wireless/ath/ath10k/leds.c | 103 ++++++++++++++++++++++++++++++
|
||||
drivers/net/wireless/ath/ath10k/leds.h | 45 +++++++++++++
|
||||
drivers/net/wireless/ath/ath10k/mac.c | 1 +
|
||||
drivers/net/wireless/ath/ath10k/wmi-ops.h | 32 ++++++++++
|
||||
drivers/net/wireless/ath/ath10k/wmi-tlv.c | 2 +
|
||||
drivers/net/wireless/ath/ath10k/wmi.c | 54 ++++++++++++++++
|
||||
drivers/net/wireless/ath/ath10k/wmi.h | 35 ++++++++++
|
||||
12 files changed, 314 insertions(+), 1 deletion(-)
|
||||
create mode 100644 drivers/net/wireless/ath/ath10k/leds.c
|
||||
create mode 100644 drivers/net/wireless/ath/ath10k/leds.h
|
||||
--- a/drivers/net/wireless/ath/ath10k/Kconfig
|
||||
+++ b/drivers/net/wireless/ath/ath10k/Kconfig
|
||||
@@ -70,6 +70,16 @@ config ATH10K_DEBUGFS
|
||||
|
||||
If unsure, say Y to make it easier to debug problems.
|
||||
|
||||
+config ATH10K_LEDS
|
||||
+ bool "Atheros ath10k LED support"
|
||||
+ depends on ATH10K
|
||||
+ select MAC80211_LEDS
|
||||
+ select LEDS_CLASS
|
||||
+ select NEW_LEDS
|
||||
+ default y
|
||||
+ ---help---
|
||||
+ This option is necessary, if you want LED support for chipset connected led pins. If unsure, say N.
|
||||
+
|
||||
config ATH10K_SPECTRAL
|
||||
bool "Atheros ath10k spectral scan support"
|
||||
depends on ATH10K_DEBUGFS
|
||||
--- a/drivers/net/wireless/ath/ath10k/Makefile
|
||||
+++ b/drivers/net/wireless/ath/ath10k/Makefile
|
||||
@@ -19,6 +19,7 @@ ath10k_core-$(CPTCFG_ATH10K_SPECTRAL) +=
|
||||
ath10k_core-$(CPTCFG_NL80211_TESTMODE) += testmode.o
|
||||
ath10k_core-$(CPTCFG_ATH10K_TRACING) += trace.o
|
||||
ath10k_core-$(CPTCFG_ATH10K_THERMAL) += thermal.o
|
||||
+ath10k_core-$(CPTCFG_ATH10K_LEDS) += leds.o
|
||||
ath10k_core-$(CPTCFG_MAC80211_DEBUGFS) += debugfs_sta.o
|
||||
ath10k_core-$(CONFIG_PM) += wow.o
|
||||
ath10k_core-$(CONFIG_DEV_COREDUMP) += coredump.o
|
||||
--- a/local-symbols
|
||||
+++ b/local-symbols
|
||||
@@ -145,6 +145,7 @@ ATH10K_DEBUG=
|
||||
ATH10K_DEBUGFS=
|
||||
ATH10K_SPECTRAL=
|
||||
ATH10K_THERMAL=
|
||||
+ATH10K_LEDS=
|
||||
ATH10K_TRACING=
|
||||
ATH10K_DFS_CERTIFIED=
|
||||
WCN36XX=
|
||||
--- a/drivers/net/wireless/ath/ath10k/core.c
|
||||
+++ b/drivers/net/wireless/ath/ath10k/core.c
|
||||
@@ -25,6 +25,7 @@
|
||||
#include "testmode.h"
|
||||
#include "wmi-ops.h"
|
||||
#include "coredump.h"
|
||||
+#include "leds.h"
|
||||
|
||||
unsigned int ath10k_debug_mask;
|
||||
EXPORT_SYMBOL(ath10k_debug_mask);
|
||||
@@ -61,6 +62,7 @@ static const struct ath10k_hw_params ath
|
||||
.dev_id = QCA988X_2_0_DEVICE_ID,
|
||||
.bus = ATH10K_BUS_PCI,
|
||||
.name = "qca988x hw2.0",
|
||||
+ .led_pin = 1,
|
||||
.patch_load_addr = QCA988X_HW_2_0_PATCH_LOAD_ADDR,
|
||||
.uart_pin = 7,
|
||||
.cc_wraparound_type = ATH10K_HW_CC_WRAP_SHIFTED_ALL,
|
||||
@@ -131,6 +133,7 @@ static const struct ath10k_hw_params ath
|
||||
.dev_id = QCA9887_1_0_DEVICE_ID,
|
||||
.bus = ATH10K_BUS_PCI,
|
||||
.name = "qca9887 hw1.0",
|
||||
+ .led_pin = 1,
|
||||
.patch_load_addr = QCA9887_HW_1_0_PATCH_LOAD_ADDR,
|
||||
.uart_pin = 7,
|
||||
.cc_wraparound_type = ATH10K_HW_CC_WRAP_SHIFTED_ALL,
|
||||
@@ -340,6 +343,7 @@ static const struct ath10k_hw_params ath
|
||||
.dev_id = QCA99X0_2_0_DEVICE_ID,
|
||||
.bus = ATH10K_BUS_PCI,
|
||||
.name = "qca99x0 hw2.0",
|
||||
+ .led_pin = 17,
|
||||
.patch_load_addr = QCA99X0_HW_2_0_PATCH_LOAD_ADDR,
|
||||
.uart_pin = 7,
|
||||
.otp_exe_param = 0x00000700,
|
||||
@@ -381,6 +385,7 @@ static const struct ath10k_hw_params ath
|
||||
.dev_id = QCA9984_1_0_DEVICE_ID,
|
||||
.bus = ATH10K_BUS_PCI,
|
||||
.name = "qca9984/qca9994 hw1.0",
|
||||
+ .led_pin = 17,
|
||||
.patch_load_addr = QCA9984_HW_1_0_PATCH_LOAD_ADDR,
|
||||
.uart_pin = 7,
|
||||
.cc_wraparound_type = ATH10K_HW_CC_WRAP_SHIFTED_EACH,
|
||||
@@ -429,6 +434,7 @@ static const struct ath10k_hw_params ath
|
||||
.dev_id = QCA9888_2_0_DEVICE_ID,
|
||||
.bus = ATH10K_BUS_PCI,
|
||||
.name = "qca9888 hw2.0",
|
||||
+ .led_pin = 17,
|
||||
.patch_load_addr = QCA9888_HW_2_0_PATCH_LOAD_ADDR,
|
||||
.uart_pin = 7,
|
||||
.cc_wraparound_type = ATH10K_HW_CC_WRAP_SHIFTED_EACH,
|
||||
@@ -2887,6 +2893,10 @@ int ath10k_core_start(struct ath10k *ar,
|
||||
goto err_hif_stop;
|
||||
}
|
||||
|
||||
+ status = ath10k_leds_start(ar);
|
||||
+ if (status)
|
||||
+ goto err_hif_stop;
|
||||
+
|
||||
return 0;
|
||||
|
||||
err_hif_stop:
|
||||
@@ -3145,9 +3155,18 @@ static void ath10k_core_register_work(st
|
||||
goto err_spectral_destroy;
|
||||
}
|
||||
|
||||
+ status = ath10k_leds_register(ar);
|
||||
+ if (status) {
|
||||
+ ath10k_err(ar, "could not register leds: %d\n",
|
||||
+ status);
|
||||
+ goto err_thermal_unregister;
|
||||
+ }
|
||||
+
|
||||
set_bit(ATH10K_FLAG_CORE_REGISTERED, &ar->dev_flags);
|
||||
return;
|
||||
|
||||
+err_thermal_unregister:
|
||||
+ ath10k_thermal_unregister(ar);
|
||||
err_spectral_destroy:
|
||||
ath10k_spectral_destroy(ar);
|
||||
err_debug_destroy:
|
||||
@@ -3193,6 +3212,8 @@ void ath10k_core_unregister(struct ath10
|
||||
if (!test_bit(ATH10K_FLAG_CORE_REGISTERED, &ar->dev_flags))
|
||||
return;
|
||||
|
||||
+ ath10k_leds_unregister(ar);
|
||||
+
|
||||
ath10k_thermal_unregister(ar);
|
||||
/* Stop spectral before unregistering from mac80211 to remove the
|
||||
* relayfs debugfs file cleanly. Otherwise the parent debugfs tree
|
||||
--- a/drivers/net/wireless/ath/ath10k/core.h
|
||||
+++ b/drivers/net/wireless/ath/ath10k/core.h
|
||||
@@ -14,6 +14,7 @@
|
||||
#include <linux/pci.h>
|
||||
#include <linux/uuid.h>
|
||||
#include <linux/time.h>
|
||||
+#include <linux/leds.h>
|
||||
|
||||
#include "htt.h"
|
||||
#include "htc.h"
|
||||
@@ -1216,6 +1217,13 @@ struct ath10k {
|
||||
} testmode;
|
||||
|
||||
struct {
|
||||
+ struct gpio_led wifi_led;
|
||||
+ struct led_classdev cdev;
|
||||
+ char label[48];
|
||||
+ u32 gpio_state_pin;
|
||||
+ } leds;
|
||||
+
|
||||
+ struct {
|
||||
/* protected by data_lock */
|
||||
u32 rx_crc_err_drop;
|
||||
u32 fw_crash_counter;
|
||||
--- a/drivers/net/wireless/ath/ath10k/hw.h
|
||||
+++ b/drivers/net/wireless/ath/ath10k/hw.h
|
||||
@@ -517,6 +517,7 @@ struct ath10k_hw_params {
|
||||
const char *name;
|
||||
u32 patch_load_addr;
|
||||
int uart_pin;
|
||||
+ int led_pin;
|
||||
u32 otp_exe_param;
|
||||
|
||||
/* Type of hw cycle counter wraparound logic, for more info
|
||||
--- /dev/null
|
||||
+++ b/drivers/net/wireless/ath/ath10k/leds.c
|
||||
@@ -0,0 +1,103 @@
|
||||
+/*
|
||||
+ * Copyright (c) 2005-2011 Atheros Communications Inc.
|
||||
+ * Copyright (c) 2011-2017 Qualcomm Atheros, Inc.
|
||||
+ * Copyright (c) 2018 Sebastian Gottschall <s.gottschall@dd-wrt.com>
|
||||
+ * Copyright (c) 2018, The Linux Foundation. All rights reserved.
|
||||
+ *
|
||||
+ * Permission to use, copy, modify, and/or distribute this software for any
|
||||
+ * purpose with or without fee is hereby granted, provided that the above
|
||||
+ * copyright notice and this permission notice appear in all copies.
|
||||
+ *
|
||||
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
||||
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
||||
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
||||
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
||||
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
||||
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
+ */
|
||||
+
|
||||
+#include <linux/leds.h>
|
||||
+
|
||||
+#include "core.h"
|
||||
+#include "wmi.h"
|
||||
+#include "wmi-ops.h"
|
||||
+
|
||||
+#include "leds.h"
|
||||
+
|
||||
+static int ath10k_leds_set_brightness_blocking(struct led_classdev *led_cdev,
|
||||
+ enum led_brightness brightness)
|
||||
+{
|
||||
+ struct ath10k *ar = container_of(led_cdev, struct ath10k,
|
||||
+ leds.cdev);
|
||||
+ struct gpio_led *led = &ar->leds.wifi_led;
|
||||
+
|
||||
+ mutex_lock(&ar->conf_mutex);
|
||||
+
|
||||
+ if (ar->state != ATH10K_STATE_ON)
|
||||
+ goto out;
|
||||
+
|
||||
+ ar->leds.gpio_state_pin = (brightness != LED_OFF) ^ led->active_low;
|
||||
+ ath10k_wmi_gpio_output(ar, led->gpio, ar->leds.gpio_state_pin);
|
||||
+
|
||||
+out:
|
||||
+ mutex_unlock(&ar->conf_mutex);
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+int ath10k_leds_start(struct ath10k *ar)
|
||||
+{
|
||||
+ if (ar->hw_params.led_pin == 0)
|
||||
+ /* leds not supported */
|
||||
+ return 0;
|
||||
+
|
||||
+ /* under some circumstances, the gpio pin gets reconfigured
|
||||
+ * to default state by the firmware, so we need to
|
||||
+ * reconfigure it this behaviour has only ben seen on
|
||||
+ * QCA9984 and QCA99XX devices so far
|
||||
+ */
|
||||
+ ath10k_wmi_gpio_config(ar, ar->hw_params.led_pin, 0,
|
||||
+ WMI_GPIO_PULL_NONE, WMI_GPIO_INTTYPE_DISABLE);
|
||||
+ ath10k_wmi_gpio_output(ar, ar->hw_params.led_pin, 1);
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+int ath10k_leds_register(struct ath10k *ar)
|
||||
+{
|
||||
+ int ret;
|
||||
+
|
||||
+ if (ar->hw_params.led_pin == 0)
|
||||
+ /* leds not supported */
|
||||
+ return 0;
|
||||
+
|
||||
+ snprintf(ar->leds.label, sizeof(ar->leds.label), "ath10k-%s",
|
||||
+ wiphy_name(ar->hw->wiphy));
|
||||
+ ar->leds.wifi_led.active_low = 1;
|
||||
+ ar->leds.wifi_led.gpio = ar->hw_params.led_pin;
|
||||
+ ar->leds.wifi_led.name = ar->leds.label;
|
||||
+ ar->leds.wifi_led.default_state = LEDS_GPIO_DEFSTATE_KEEP;
|
||||
+
|
||||
+ ar->leds.cdev.name = ar->leds.label;
|
||||
+ ar->leds.cdev.brightness_set_blocking = ath10k_leds_set_brightness_blocking;
|
||||
+
|
||||
+ /* FIXME: this assignment doesn't make sense as it's NULL, remove it? */
|
||||
+ ar->leds.cdev.default_trigger = ar->leds.wifi_led.default_trigger;
|
||||
+
|
||||
+ ret = led_classdev_register(wiphy_dev(ar->hw->wiphy), &ar->leds.cdev);
|
||||
+ if (ret)
|
||||
+ return ret;
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+void ath10k_leds_unregister(struct ath10k *ar)
|
||||
+{
|
||||
+ if (ar->hw_params.led_pin == 0)
|
||||
+ /* leds not supported */
|
||||
+ return;
|
||||
+
|
||||
+ led_classdev_unregister(&ar->leds.cdev);
|
||||
+}
|
||||
+
|
||||
--- /dev/null
|
||||
+++ b/drivers/net/wireless/ath/ath10k/leds.h
|
||||
@@ -0,0 +1,41 @@
|
||||
+/*
|
||||
+ * Copyright (c) 2018, The Linux Foundation. All rights reserved.
|
||||
+ *
|
||||
+ * Permission to use, copy, modify, and/or distribute this software for any
|
||||
+ * purpose with or without fee is hereby granted, provided that the above
|
||||
+ * copyright notice and this permission notice appear in all copies.
|
||||
+ *
|
||||
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
||||
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
||||
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
||||
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
||||
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
||||
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
+ */
|
||||
+#ifndef _LEDS_H_
|
||||
+#define _LEDS_H_
|
||||
+
|
||||
+#include "core.h"
|
||||
+
|
||||
+#ifdef CPTCFG_ATH10K_LEDS
|
||||
+void ath10k_leds_unregister(struct ath10k *ar);
|
||||
+int ath10k_leds_start(struct ath10k *ar);
|
||||
+int ath10k_leds_register(struct ath10k *ar);
|
||||
+#else
|
||||
+static inline void ath10k_leds_unregister(struct ath10k *ar)
|
||||
+{
|
||||
+}
|
||||
+
|
||||
+static inline int ath10k_leds_start(struct ath10k *ar)
|
||||
+{
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static inline int ath10k_leds_register(struct ath10k *ar)
|
||||
+{
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+#endif
|
||||
+#endif /* _LEDS_H_ */
|
||||
--- a/drivers/net/wireless/ath/ath10k/mac.c
|
||||
+++ b/drivers/net/wireless/ath/ath10k/mac.c
|
||||
@@ -24,6 +24,7 @@
|
||||
#include "wmi-tlv.h"
|
||||
#include "wmi-ops.h"
|
||||
#include "wow.h"
|
||||
+#include "leds.h"
|
||||
|
||||
/*********/
|
||||
/* Rates */
|
||||
--- a/drivers/net/wireless/ath/ath10k/wmi-ops.h
|
||||
+++ b/drivers/net/wireless/ath/ath10k/wmi-ops.h
|
||||
@@ -224,7 +224,10 @@ struct wmi_ops {
|
||||
struct sk_buff *(*gen_bb_timing)
|
||||
(struct ath10k *ar,
|
||||
const struct wmi_bb_timing_cfg_arg *arg);
|
||||
+ struct sk_buff *(*gen_gpio_config)(struct ath10k *ar, u32 gpio_num,
|
||||
+ u32 input, u32 pull_type, u32 intr_mode);
|
||||
|
||||
+ struct sk_buff *(*gen_gpio_output)(struct ath10k *ar, u32 gpio_num, u32 set);
|
||||
};
|
||||
|
||||
int ath10k_wmi_cmd_send(struct ath10k *ar, struct sk_buff *skb, u32 cmd_id);
|
||||
@@ -1120,6 +1123,35 @@ ath10k_wmi_force_fw_hang(struct ath10k *
|
||||
return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->force_fw_hang_cmdid);
|
||||
}
|
||||
|
||||
+static inline int ath10k_wmi_gpio_config(struct ath10k *ar, u32 gpio_num,
|
||||
+ u32 input, u32 pull_type, u32 intr_mode)
|
||||
+{
|
||||
+ struct sk_buff *skb;
|
||||
+
|
||||
+ if (!ar->wmi.ops->gen_gpio_config)
|
||||
+ return -EOPNOTSUPP;
|
||||
+
|
||||
+ skb = ar->wmi.ops->gen_gpio_config(ar, gpio_num, input, pull_type, intr_mode);
|
||||
+ if (IS_ERR(skb))
|
||||
+ return PTR_ERR(skb);
|
||||
+
|
||||
+ return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->gpio_config_cmdid);
|
||||
+}
|
||||
+
|
||||
+static inline int ath10k_wmi_gpio_output(struct ath10k *ar, u32 gpio_num, u32 set)
|
||||
+{
|
||||
+ struct sk_buff *skb;
|
||||
+
|
||||
+ if (!ar->wmi.ops->gen_gpio_config)
|
||||
+ return -EOPNOTSUPP;
|
||||
+
|
||||
+ skb = ar->wmi.ops->gen_gpio_output(ar, gpio_num, set);
|
||||
+ if (IS_ERR(skb))
|
||||
+ return PTR_ERR(skb);
|
||||
+
|
||||
+ return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->gpio_output_cmdid);
|
||||
+}
|
||||
+
|
||||
static inline int
|
||||
ath10k_wmi_dbglog_cfg(struct ath10k *ar, u64 module_enable, u32 log_level)
|
||||
{
|
||||
--- a/drivers/net/wireless/ath/ath10k/wmi-tlv.c
|
||||
+++ b/drivers/net/wireless/ath/ath10k/wmi-tlv.c
|
||||
@@ -4583,6 +4583,8 @@ static const struct wmi_ops wmi_tlv_ops
|
||||
.gen_echo = ath10k_wmi_tlv_op_gen_echo,
|
||||
.gen_vdev_spectral_conf = ath10k_wmi_tlv_op_gen_vdev_spectral_conf,
|
||||
.gen_vdev_spectral_enable = ath10k_wmi_tlv_op_gen_vdev_spectral_enable,
|
||||
+ /* .gen_gpio_config not implemented */
|
||||
+ /* .gen_gpio_output not implemented */
|
||||
};
|
||||
|
||||
static const struct wmi_peer_flags_map wmi_tlv_peer_flags_map = {
|
||||
--- a/drivers/net/wireless/ath/ath10k/wmi.c
|
||||
+++ b/drivers/net/wireless/ath/ath10k/wmi.c
|
||||
@@ -7471,6 +7471,49 @@ ath10k_wmi_op_gen_peer_set_param(struct
|
||||
return skb;
|
||||
}
|
||||
|
||||
+static struct sk_buff *ath10k_wmi_op_gen_gpio_config(struct ath10k *ar,
|
||||
+ u32 gpio_num, u32 input,
|
||||
+ u32 pull_type, u32 intr_mode)
|
||||
+{
|
||||
+ struct wmi_gpio_config_cmd *cmd;
|
||||
+ struct sk_buff *skb;
|
||||
+
|
||||
+ skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd));
|
||||
+ if (!skb)
|
||||
+ return ERR_PTR(-ENOMEM);
|
||||
+
|
||||
+ cmd = (struct wmi_gpio_config_cmd *)skb->data;
|
||||
+ cmd->pull_type = __cpu_to_le32(pull_type);
|
||||
+ cmd->gpio_num = __cpu_to_le32(gpio_num);
|
||||
+ cmd->input = __cpu_to_le32(input);
|
||||
+ cmd->intr_mode = __cpu_to_le32(intr_mode);
|
||||
+
|
||||
+ ath10k_dbg(ar, ATH10K_DBG_WMI, "wmi gpio_config gpio_num 0x%08x input 0x%08x pull_type 0x%08x intr_mode 0x%08x\n",
|
||||
+ gpio_num, input, pull_type, intr_mode);
|
||||
+
|
||||
+ return skb;
|
||||
+}
|
||||
+
|
||||
+static struct sk_buff *ath10k_wmi_op_gen_gpio_output(struct ath10k *ar,
|
||||
+ u32 gpio_num, u32 set)
|
||||
+{
|
||||
+ struct wmi_gpio_output_cmd *cmd;
|
||||
+ struct sk_buff *skb;
|
||||
+
|
||||
+ skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd));
|
||||
+ if (!skb)
|
||||
+ return ERR_PTR(-ENOMEM);
|
||||
+
|
||||
+ cmd = (struct wmi_gpio_output_cmd *)skb->data;
|
||||
+ cmd->gpio_num = __cpu_to_le32(gpio_num);
|
||||
+ cmd->set = __cpu_to_le32(set);
|
||||
+
|
||||
+ ath10k_dbg(ar, ATH10K_DBG_WMI, "wmi gpio_output gpio_num 0x%08x set 0x%08x\n",
|
||||
+ gpio_num, set);
|
||||
+
|
||||
+ return skb;
|
||||
+}
|
||||
+
|
||||
static struct sk_buff *
|
||||
ath10k_wmi_op_gen_set_psmode(struct ath10k *ar, u32 vdev_id,
|
||||
enum wmi_sta_ps_mode psmode)
|
||||
@@ -9129,6 +9172,9 @@ static const struct wmi_ops wmi_ops = {
|
||||
.fw_stats_fill = ath10k_wmi_main_op_fw_stats_fill,
|
||||
.get_vdev_subtype = ath10k_wmi_op_get_vdev_subtype,
|
||||
.gen_echo = ath10k_wmi_op_gen_echo,
|
||||
+ .gen_gpio_config = ath10k_wmi_op_gen_gpio_config,
|
||||
+ .gen_gpio_output = ath10k_wmi_op_gen_gpio_output,
|
||||
+
|
||||
/* .gen_bcn_tmpl not implemented */
|
||||
/* .gen_prb_tmpl not implemented */
|
||||
/* .gen_p2p_go_bcn_ie not implemented */
|
||||
@@ -9199,6 +9245,8 @@ static const struct wmi_ops wmi_10_1_ops
|
||||
.fw_stats_fill = ath10k_wmi_10x_op_fw_stats_fill,
|
||||
.get_vdev_subtype = ath10k_wmi_op_get_vdev_subtype,
|
||||
.gen_echo = ath10k_wmi_op_gen_echo,
|
||||
+ .gen_gpio_config = ath10k_wmi_op_gen_gpio_config,
|
||||
+ .gen_gpio_output = ath10k_wmi_op_gen_gpio_output,
|
||||
/* .gen_bcn_tmpl not implemented */
|
||||
/* .gen_prb_tmpl not implemented */
|
||||
/* .gen_p2p_go_bcn_ie not implemented */
|
||||
@@ -9271,6 +9319,8 @@ static const struct wmi_ops wmi_10_2_ops
|
||||
.gen_delba_send = ath10k_wmi_op_gen_delba_send,
|
||||
.fw_stats_fill = ath10k_wmi_10x_op_fw_stats_fill,
|
||||
.get_vdev_subtype = ath10k_wmi_op_get_vdev_subtype,
|
||||
+ .gen_gpio_config = ath10k_wmi_op_gen_gpio_config,
|
||||
+ .gen_gpio_output = ath10k_wmi_op_gen_gpio_output,
|
||||
/* .gen_pdev_enable_adaptive_cca not implemented */
|
||||
};
|
||||
|
||||
@@ -9342,6 +9392,8 @@ static const struct wmi_ops wmi_10_2_4_o
|
||||
ath10k_wmi_op_gen_pdev_enable_adaptive_cca,
|
||||
.get_vdev_subtype = ath10k_wmi_10_2_4_op_get_vdev_subtype,
|
||||
.gen_bb_timing = ath10k_wmi_10_2_4_op_gen_bb_timing,
|
||||
+ .gen_gpio_config = ath10k_wmi_op_gen_gpio_config,
|
||||
+ .gen_gpio_output = ath10k_wmi_op_gen_gpio_output,
|
||||
/* .gen_bcn_tmpl not implemented */
|
||||
/* .gen_prb_tmpl not implemented */
|
||||
/* .gen_p2p_go_bcn_ie not implemented */
|
||||
@@ -9422,6 +9474,8 @@ static const struct wmi_ops wmi_10_4_ops
|
||||
.gen_pdev_bss_chan_info_req = ath10k_wmi_10_2_op_gen_pdev_bss_chan_info,
|
||||
.gen_echo = ath10k_wmi_op_gen_echo,
|
||||
.gen_pdev_get_tpc_config = ath10k_wmi_10_2_4_op_gen_pdev_get_tpc_config,
|
||||
+ .gen_gpio_config = ath10k_wmi_op_gen_gpio_config,
|
||||
+ .gen_gpio_output = ath10k_wmi_op_gen_gpio_output,
|
||||
};
|
||||
|
||||
int ath10k_wmi_attach(struct ath10k *ar)
|
||||
--- a/drivers/net/wireless/ath/ath10k/wmi.h
|
||||
+++ b/drivers/net/wireless/ath/ath10k/wmi.h
|
||||
@@ -3016,6 +3016,41 @@ enum wmi_10_4_feature_mask {
|
||||
|
||||
};
|
||||
|
||||
+/* WMI_GPIO_CONFIG_CMDID */
|
||||
+enum {
|
||||
+ WMI_GPIO_PULL_NONE,
|
||||
+ WMI_GPIO_PULL_UP,
|
||||
+ WMI_GPIO_PULL_DOWN,
|
||||
+};
|
||||
+
|
||||
+enum {
|
||||
+ WMI_GPIO_INTTYPE_DISABLE,
|
||||
+ WMI_GPIO_INTTYPE_RISING_EDGE,
|
||||
+ WMI_GPIO_INTTYPE_FALLING_EDGE,
|
||||
+ WMI_GPIO_INTTYPE_BOTH_EDGE,
|
||||
+ WMI_GPIO_INTTYPE_LEVEL_LOW,
|
||||
+ WMI_GPIO_INTTYPE_LEVEL_HIGH
|
||||
+};
|
||||
+
|
||||
+/* WMI_GPIO_CONFIG_CMDID */
|
||||
+struct wmi_gpio_config_cmd {
|
||||
+ __le32 gpio_num; /* GPIO number to be setup */
|
||||
+ __le32 input; /* 0 - Output/ 1 - Input */
|
||||
+ __le32 pull_type; /* Pull type defined above */
|
||||
+ __le32 intr_mode; /* Interrupt mode defined above (Input) */
|
||||
+} __packed;
|
||||
+
|
||||
+/* WMI_GPIO_OUTPUT_CMDID */
|
||||
+struct wmi_gpio_output_cmd {
|
||||
+ __le32 gpio_num; /* GPIO number to be setup */
|
||||
+ __le32 set; /* Set the GPIO pin*/
|
||||
+} __packed;
|
||||
+
|
||||
+/* WMI_GPIO_INPUT_EVENTID */
|
||||
+struct wmi_gpio_input_event {
|
||||
+ __le32 gpio_num; /* GPIO number which changed state */
|
||||
+} __packed;
|
||||
+
|
||||
struct wmi_ext_resource_config_10_4_cmd {
|
||||
/* contains enum wmi_host_platform_type */
|
||||
__le32 host_platform_config;
|
||||
@@ -0,0 +1,53 @@
|
||||
From 79c9d7aabae1d1da9eea97d83b61e1517a8a2221 Mon Sep 17 00:00:00 2001
|
||||
From: Mathias Kresin <dev@kresin.me>
|
||||
Date: Fri, 22 Jun 2018 18:59:44 +0200
|
||||
Subject: [PATCH] ath10k: use tpt LED trigger by default
|
||||
|
||||
Use the tpt LED trigger for each created phy led. Ths way LEDs attached
|
||||
to the ath10k GPIO pins are indicating the phy status and blink on
|
||||
traffic.
|
||||
|
||||
Signed-off-by: Mathias Kresin <dev@kresin.me>
|
||||
---
|
||||
drivers/net/wireless/ath/ath10k/core.h | 4 ++++
|
||||
drivers/net/wireless/ath/ath10k/leds.c | 4 +---
|
||||
drivers/net/wireless/ath/ath10k/mac.c | 2 +-
|
||||
3 files changed, 6 insertions(+), 4 deletions(-)
|
||||
|
||||
--- a/drivers/net/wireless/ath/ath10k/core.h
|
||||
+++ b/drivers/net/wireless/ath/ath10k/core.h
|
||||
@@ -1269,6 +1269,10 @@ struct ath10k {
|
||||
bool coex_support;
|
||||
int coex_gpio_pin;
|
||||
|
||||
+#ifdef CPTCFG_MAC80211_LEDS
|
||||
+ const char *led_default_trigger;
|
||||
+#endif
|
||||
+
|
||||
/* must be last */
|
||||
u8 drv_priv[] __aligned(sizeof(void *));
|
||||
};
|
||||
--- a/drivers/net/wireless/ath/ath10k/leds.c
|
||||
+++ b/drivers/net/wireless/ath/ath10k/leds.c
|
||||
@@ -81,9 +81,7 @@ int ath10k_leds_register(struct ath10k *
|
||||
|
||||
ar->leds.cdev.name = ar->leds.label;
|
||||
ar->leds.cdev.brightness_set_blocking = ath10k_leds_set_brightness_blocking;
|
||||
-
|
||||
- /* FIXME: this assignment doesn't make sense as it's NULL, remove it? */
|
||||
- ar->leds.cdev.default_trigger = ar->leds.wifi_led.default_trigger;
|
||||
+ ar->leds.cdev.default_trigger = ar->led_default_trigger;
|
||||
|
||||
ret = led_classdev_register(wiphy_dev(ar->hw->wiphy), &ar->leds.cdev);
|
||||
if (ret)
|
||||
--- a/drivers/net/wireless/ath/ath10k/mac.c
|
||||
+++ b/drivers/net/wireless/ath/ath10k/mac.c
|
||||
@@ -9397,7 +9397,7 @@ int ath10k_mac_register(struct ath10k *a
|
||||
ar->hw->weight_multiplier = ATH10K_AIRTIME_WEIGHT_MULTIPLIER;
|
||||
|
||||
#ifdef CPTCFG_MAC80211_LEDS
|
||||
- ieee80211_create_tpt_led_trigger(ar->hw,
|
||||
+ ar->led_default_trigger = ieee80211_create_tpt_led_trigger(ar->hw,
|
||||
IEEE80211_TPT_LEDTRIG_FL_RADIO, ath10k_tpt_blink,
|
||||
ARRAY_SIZE(ath10k_tpt_blink));
|
||||
#endif
|
||||
@@ -0,0 +1,49 @@
|
||||
From: Sven Eckelmann <seckelmann@datto.com>
|
||||
Date: Tue, 11 Jun 2019 13:58:35 +0200
|
||||
Subject: ath10k: fix max antenna gain unit
|
||||
|
||||
Most of the txpower for the ath10k firmware is stored as twicepower (0.5 dB
|
||||
steps). This isn't the case for max_antenna_gain - which is still expected
|
||||
by the firmware as dB.
|
||||
|
||||
The firmware is converting it from dB to the internal (twicepower)
|
||||
representation when it calculates the limits of a channel. This can be seen
|
||||
in tpc_stats when configuring "12" as max_antenna_gain. Instead of the
|
||||
expected 12 (6 dB), the tpc_stats shows 24 (12 dB).
|
||||
|
||||
Tested on QCA9888 and IPQ4019 with firmware 10.4-3.5.3-00057.
|
||||
|
||||
Fixes: 02256930d9b8 ("ath10k: use proper tx power unit")
|
||||
Signed-off-by: Sven Eckelmann <seckelmann@datto.com>
|
||||
|
||||
Forwarded: https://patchwork.kernel.org/patch/10986723/
|
||||
|
||||
--- a/drivers/net/wireless/ath/ath10k/mac.c
|
||||
+++ b/drivers/net/wireless/ath/ath10k/mac.c
|
||||
@@ -1043,7 +1043,7 @@ static int ath10k_monitor_vdev_start(str
|
||||
arg.channel.min_power = 0;
|
||||
arg.channel.max_power = channel->max_power * 2;
|
||||
arg.channel.max_reg_power = channel->max_reg_power * 2;
|
||||
- arg.channel.max_antenna_gain = channel->max_antenna_gain * 2;
|
||||
+ arg.channel.max_antenna_gain = channel->max_antenna_gain;
|
||||
|
||||
reinit_completion(&ar->vdev_setup_done);
|
||||
reinit_completion(&ar->vdev_delete_done);
|
||||
@@ -1489,7 +1489,7 @@ static int ath10k_vdev_start_restart(str
|
||||
arg.channel.min_power = 0;
|
||||
arg.channel.max_power = chandef->chan->max_power * 2;
|
||||
arg.channel.max_reg_power = chandef->chan->max_reg_power * 2;
|
||||
- arg.channel.max_antenna_gain = chandef->chan->max_antenna_gain * 2;
|
||||
+ arg.channel.max_antenna_gain = chandef->chan->max_antenna_gain;
|
||||
|
||||
if (arvif->vdev_type == WMI_VDEV_TYPE_AP) {
|
||||
arg.ssid = arvif->u.ap.ssid;
|
||||
@@ -3194,7 +3194,7 @@ static int ath10k_update_channel_list(st
|
||||
ch->min_power = 0;
|
||||
ch->max_power = channel->max_power * 2;
|
||||
ch->max_reg_power = channel->max_reg_power * 2;
|
||||
- ch->max_antenna_gain = channel->max_antenna_gain * 2;
|
||||
+ ch->max_antenna_gain = channel->max_antenna_gain;
|
||||
ch->reg_class_id = 0; /* FIXME */
|
||||
|
||||
/* FIXME: why use only legacy modes, why not any
|
||||
@@ -0,0 +1,101 @@
|
||||
From: Sven Eckelmann <seckelmann@datto.com>
|
||||
Date: Wed, 28 Nov 2018 16:16:27 +0100
|
||||
Subject: ath10k: adjust tx power reduction for US regulatory domain
|
||||
|
||||
FCC allows maximum antenna gain of 6 dBi. 15.247(b)(4):
|
||||
|
||||
> (4) The conducted output power limit
|
||||
> specified in paragraph (b) of this section
|
||||
> is based on the use of antennas
|
||||
> with directional gains that do not exceed
|
||||
> 6 dBi. Except as shown in paragraph
|
||||
> (c) of this section, if transmitting
|
||||
> antennas of directional gain greater
|
||||
> than 6 dBi are used, the conducted
|
||||
> output power from the intentional radiator
|
||||
> shall be reduced below the stated
|
||||
> values in paragraphs (b)(1), (b)(2),
|
||||
> and (b)(3) of this section, as appropriate,
|
||||
> by the amount in dB that the
|
||||
> directional gain of the antenna exceeds
|
||||
> 6 dBi.
|
||||
|
||||
https://www.gpo.gov/fdsys/pkg/CFR-2013-title47-vol1/pdf/CFR-2013-title47-vol1-sec15-247.pdf
|
||||
|
||||
Signed-off-by: Sven Eckelmann <seckelmann@datto.com>
|
||||
|
||||
Forwarded: no
|
||||
|
||||
--- a/drivers/net/wireless/ath/ath10k/mac.c
|
||||
+++ b/drivers/net/wireless/ath/ath10k/mac.c
|
||||
@@ -1011,6 +1011,40 @@ static inline int ath10k_vdev_setup_sync
|
||||
return ar->last_wmi_vdev_start_status;
|
||||
}
|
||||
|
||||
+static u32 ath10k_get_max_antenna_gain(struct ath10k *ar,
|
||||
+ u32 ch_max_antenna_gain)
|
||||
+{
|
||||
+ u32 max_antenna_gain;
|
||||
+
|
||||
+ if (ar->dfs_detector && ar->dfs_detector->region == NL80211_DFS_FCC) {
|
||||
+ /* FCC allows maximum antenna gain of 6 dBi. 15.247(b)(4):
|
||||
+ *
|
||||
+ * > (4) The conducted output power limit
|
||||
+ * > specified in paragraph (b) of this section
|
||||
+ * > is based on the use of antennas
|
||||
+ * > with directional gains that do not exceed
|
||||
+ * > 6 dBi. Except as shown in paragraph
|
||||
+ * > (c) of this section, if transmitting
|
||||
+ * > antennas of directional gain greater
|
||||
+ * > than 6 dBi are used, the conducted
|
||||
+ * > output power from the intentional radiator
|
||||
+ * > shall be reduced below the stated
|
||||
+ * > values in paragraphs (b)(1), (b)(2),
|
||||
+ * > and (b)(3) of this section, as appropriate,
|
||||
+ * > by the amount in dB that the
|
||||
+ * > directional gain of the antenna exceeds
|
||||
+ * > 6 dBi.
|
||||
+ *
|
||||
+ * https://www.gpo.gov/fdsys/pkg/CFR-2013-title47-vol1/pdf/CFR-2013-title47-vol1-sec15-247.pdf
|
||||
+ */
|
||||
+ max_antenna_gain = 6;
|
||||
+ } else {
|
||||
+ max_antenna_gain = 0;
|
||||
+ }
|
||||
+
|
||||
+ return max(ch_max_antenna_gain, max_antenna_gain);
|
||||
+}
|
||||
+
|
||||
static int ath10k_monitor_vdev_start(struct ath10k *ar, int vdev_id)
|
||||
{
|
||||
struct cfg80211_chan_def *chandef = NULL;
|
||||
@@ -1043,7 +1077,8 @@ static int ath10k_monitor_vdev_start(str
|
||||
arg.channel.min_power = 0;
|
||||
arg.channel.max_power = channel->max_power * 2;
|
||||
arg.channel.max_reg_power = channel->max_reg_power * 2;
|
||||
- arg.channel.max_antenna_gain = channel->max_antenna_gain;
|
||||
+ arg.channel.max_antenna_gain = ath10k_get_max_antenna_gain(ar,
|
||||
+ channel->max_antenna_gain);
|
||||
|
||||
reinit_completion(&ar->vdev_setup_done);
|
||||
reinit_completion(&ar->vdev_delete_done);
|
||||
@@ -1489,7 +1524,8 @@ static int ath10k_vdev_start_restart(str
|
||||
arg.channel.min_power = 0;
|
||||
arg.channel.max_power = chandef->chan->max_power * 2;
|
||||
arg.channel.max_reg_power = chandef->chan->max_reg_power * 2;
|
||||
- arg.channel.max_antenna_gain = chandef->chan->max_antenna_gain;
|
||||
+ arg.channel.max_antenna_gain = ath10k_get_max_antenna_gain(ar,
|
||||
+ chandef->chan->max_antenna_gain);
|
||||
|
||||
if (arvif->vdev_type == WMI_VDEV_TYPE_AP) {
|
||||
arg.ssid = arvif->u.ap.ssid;
|
||||
@@ -3194,7 +3230,8 @@ static int ath10k_update_channel_list(st
|
||||
ch->min_power = 0;
|
||||
ch->max_power = channel->max_power * 2;
|
||||
ch->max_reg_power = channel->max_reg_power * 2;
|
||||
- ch->max_antenna_gain = channel->max_antenna_gain;
|
||||
+ ch->max_antenna_gain = ath10k_get_max_antenna_gain(ar,
|
||||
+ channel->max_antenna_gain);
|
||||
ch->reg_class_id = 0; /* FIXME */
|
||||
|
||||
/* FIXME: why use only legacy modes, why not any
|
||||
10
mac80211/patches/brcm/040-brcmutil_option.patch
Normal file
10
mac80211/patches/brcm/040-brcmutil_option.patch
Normal file
@@ -0,0 +1,10 @@
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/Kconfig
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/Kconfig
|
||||
@@ -1,6 +1,6 @@
|
||||
# SPDX-License-Identifier: GPL-2.0-only
|
||||
config BRCMUTIL
|
||||
- tristate
|
||||
+ tristate "Broadcom 802.11 driver utility functions"
|
||||
depends on m
|
||||
|
||||
config BRCMSMAC
|
||||
37
mac80211/patches/brcm/810-b43-gpio-mask-module-option.patch
Normal file
37
mac80211/patches/brcm/810-b43-gpio-mask-module-option.patch
Normal file
@@ -0,0 +1,37 @@
|
||||
--- a/drivers/net/wireless/broadcom/b43/b43.h
|
||||
+++ b/drivers/net/wireless/broadcom/b43/b43.h
|
||||
@@ -840,6 +840,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 */
|
||||
+ int gpiomask; /* GPIO LED mask as a module parameter */
|
||||
|
||||
/* PHY/Radio device. */
|
||||
struct b43_phy phy;
|
||||
--- a/drivers/net/wireless/broadcom/b43/main.c
|
||||
+++ b/drivers/net/wireless/broadcom/b43/main.c
|
||||
@@ -72,6 +72,11 @@ MODULE_FIRMWARE("b43/ucode40.fw");
|
||||
MODULE_FIRMWARE("b43/ucode42.fw");
|
||||
MODULE_FIRMWARE("b43/ucode9.fw");
|
||||
|
||||
+static int modparam_gpiomask = 0x000F;
|
||||
+module_param_named(gpiomask, modparam_gpiomask, int, 0444);
|
||||
+MODULE_PARM_DESC(gpiomask,
|
||||
+ "GPIO mask for LED control (default 0x000F)");
|
||||
+
|
||||
static int modparam_bad_frames_preempt;
|
||||
module_param_named(bad_frames_preempt, modparam_bad_frames_preempt, int, 0444);
|
||||
MODULE_PARM_DESC(bad_frames_preempt,
|
||||
@@ -2867,10 +2872,10 @@ static int b43_gpio_init(struct b43_wlde
|
||||
u32 mask, set;
|
||||
|
||||
b43_maskset32(dev, B43_MMIO_MACCTL, ~B43_MACCTL_GPOUTSMSK, 0);
|
||||
- b43_maskset16(dev, B43_MMIO_GPIO_MASK, ~0, 0xF);
|
||||
+ b43_maskset16(dev, B43_MMIO_GPIO_MASK, ~0, modparam_gpiomask);
|
||||
|
||||
mask = 0x0000001F;
|
||||
- set = 0x0000000F;
|
||||
+ set = modparam_gpiomask;
|
||||
if (dev->dev->chip_id == 0x4301) {
|
||||
mask |= 0x0060;
|
||||
set |= 0x0060;
|
||||
86
mac80211/patches/brcm/811-b43_no_pio.patch
Normal file
86
mac80211/patches/brcm/811-b43_no_pio.patch
Normal file
@@ -0,0 +1,86 @@
|
||||
--- a/drivers/net/wireless/broadcom/b43/Makefile
|
||||
+++ b/drivers/net/wireless/broadcom/b43/Makefile
|
||||
@@ -18,7 +18,7 @@ b43-$(CPTCFG_B43_PHY_AC) += phy_ac.o
|
||||
b43-y += sysfs.o
|
||||
b43-y += xmit.o
|
||||
b43-y += dma.o
|
||||
-b43-y += pio.o
|
||||
+b43-$(CPTCFG_B43_PIO) += pio.o
|
||||
b43-y += rfkill.o
|
||||
b43-y += ppr.o
|
||||
b43-$(CPTCFG_B43_LEDS) += leds.o
|
||||
--- a/drivers/net/wireless/broadcom/b43/main.c
|
||||
+++ b/drivers/net/wireless/broadcom/b43/main.c
|
||||
@@ -2000,10 +2000,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 CPTCFG_B43_PIO
|
||||
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;
|
||||
+#endif
|
||||
b43_controller_restart(dev, "DMA error");
|
||||
return;
|
||||
}
|
||||
--- a/drivers/net/wireless/broadcom/b43/pio.h
|
||||
+++ b/drivers/net/wireless/broadcom/b43/pio.h
|
||||
@@ -151,7 +151,7 @@ static inline void b43_piorx_write32(str
|
||||
b43_write32(q->dev, q->mmio_base + offset, value);
|
||||
}
|
||||
|
||||
-
|
||||
+#ifdef CPTCFG_B43_PIO
|
||||
int b43_pio_init(struct b43_wldev *dev);
|
||||
void b43_pio_free(struct b43_wldev *dev);
|
||||
|
||||
@@ -162,5 +162,37 @@ void b43_pio_rx(struct b43_pio_rxqueue *
|
||||
|
||||
void b43_pio_tx_suspend(struct b43_wldev *dev);
|
||||
void b43_pio_tx_resume(struct b43_wldev *dev);
|
||||
+#else
|
||||
+static inline int b43_pio_init(struct b43_wldev *dev)
|
||||
+{
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static inline void b43_pio_free(struct b43_wldev *dev)
|
||||
+{
|
||||
+}
|
||||
+
|
||||
+static inline int b43_pio_tx(struct b43_wldev *dev, struct sk_buff *skb)
|
||||
+{
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static inline void b43_pio_handle_txstatus(struct b43_wldev *dev,
|
||||
+ const struct b43_txstatus *status)
|
||||
+{
|
||||
+}
|
||||
+
|
||||
+static inline void b43_pio_rx(struct b43_pio_rxqueue *q)
|
||||
+{
|
||||
+}
|
||||
+
|
||||
+static inline void b43_pio_tx_suspend(struct b43_wldev *dev)
|
||||
+{
|
||||
+}
|
||||
+
|
||||
+static inline void b43_pio_tx_resume(struct b43_wldev *dev)
|
||||
+{
|
||||
+}
|
||||
+#endif /* CPTCFG_B43_PIO */
|
||||
|
||||
#endif /* B43_PIO_H_ */
|
||||
--- a/drivers/net/wireless/broadcom/b43/Kconfig
|
||||
+++ b/drivers/net/wireless/broadcom/b43/Kconfig
|
||||
@@ -100,7 +100,7 @@ config B43_BCMA_PIO
|
||||
default y
|
||||
|
||||
config B43_PIO
|
||||
- bool
|
||||
+ bool "Broadcom 43xx PIO support"
|
||||
depends on B43 && B43_SSB
|
||||
depends on SSB_BLOCKIO
|
||||
default y
|
||||
131
mac80211/patches/brcm/812-b43-add-antenna-control.patch
Normal file
131
mac80211/patches/brcm/812-b43-add-antenna-control.patch
Normal file
@@ -0,0 +1,131 @@
|
||||
--- a/drivers/net/wireless/broadcom/b43/main.c
|
||||
+++ b/drivers/net/wireless/broadcom/b43/main.c
|
||||
@@ -1642,7 +1642,7 @@ static void b43_write_beacon_template(st
|
||||
len, ram_offset, shm_size_offset, rate);
|
||||
|
||||
/* Write the PHY TX control parameters. */
|
||||
- antenna = B43_ANTENNA_DEFAULT;
|
||||
+ antenna = dev->tx_antenna;
|
||||
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. */
|
||||
@@ -3282,8 +3282,8 @@ static int b43_chip_init(struct b43_wlde
|
||||
|
||||
/* Select the antennae */
|
||||
if (phy->ops->set_rx_antenna)
|
||||
- phy->ops->set_rx_antenna(dev, B43_ANTENNA_DEFAULT);
|
||||
- b43_mgmtframe_txantenna(dev, B43_ANTENNA_DEFAULT);
|
||||
+ phy->ops->set_rx_antenna(dev, dev->rx_antenna);
|
||||
+ b43_mgmtframe_txantenna(dev, dev->tx_antenna);
|
||||
|
||||
if (phy->type == B43_PHYTYPE_B) {
|
||||
value16 = b43_read16(dev, 0x005E);
|
||||
@@ -3983,7 +3983,6 @@ static int b43_op_config(struct ieee8021
|
||||
struct b43_wldev *dev = wl->current_dev;
|
||||
struct b43_phy *phy = &dev->phy;
|
||||
struct ieee80211_conf *conf = &hw->conf;
|
||||
- int antenna;
|
||||
int err = 0;
|
||||
|
||||
mutex_lock(&wl->mutex);
|
||||
@@ -4026,11 +4025,9 @@ static int b43_op_config(struct ieee8021
|
||||
}
|
||||
|
||||
/* Antennas for RX and management frame TX. */
|
||||
- antenna = B43_ANTENNA_DEFAULT;
|
||||
- b43_mgmtframe_txantenna(dev, antenna);
|
||||
- antenna = B43_ANTENNA_DEFAULT;
|
||||
+ b43_mgmtframe_txantenna(dev, dev->tx_antenna);
|
||||
if (phy->ops->set_rx_antenna)
|
||||
- phy->ops->set_rx_antenna(dev, antenna);
|
||||
+ phy->ops->set_rx_antenna(dev, dev->rx_antenna);
|
||||
|
||||
if (wl->radio_enabled != phy->radio_on) {
|
||||
if (wl->radio_enabled) {
|
||||
@@ -5174,6 +5171,47 @@ static int b43_op_get_survey(struct ieee
|
||||
return 0;
|
||||
}
|
||||
|
||||
+static int b43_op_set_antenna(struct ieee80211_hw *hw, u32 tx_ant, u32 rx_ant)
|
||||
+{
|
||||
+ struct b43_wl *wl = hw_to_b43_wl(hw);
|
||||
+ struct b43_wldev *dev = wl->current_dev;
|
||||
+
|
||||
+ if (tx_ant == 1 && rx_ant == 1) {
|
||||
+ dev->tx_antenna = B43_ANTENNA0;
|
||||
+ dev->rx_antenna = B43_ANTENNA0;
|
||||
+ }
|
||||
+ else if (tx_ant == 2 && rx_ant == 2) {
|
||||
+ dev->tx_antenna = B43_ANTENNA1;
|
||||
+ dev->rx_antenna = B43_ANTENNA1;
|
||||
+ }
|
||||
+ else if ((tx_ant & 3) == 3 && (rx_ant & 3) == 3) {
|
||||
+ dev->tx_antenna = B43_ANTENNA_DEFAULT;
|
||||
+ dev->rx_antenna = B43_ANTENNA_DEFAULT;
|
||||
+ }
|
||||
+ else {
|
||||
+ return -EINVAL;
|
||||
+ }
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+
|
||||
+static int b43_op_get_antenna(struct ieee80211_hw *hw, u32 *tx_ant, u32 *rx_ant)
|
||||
+{
|
||||
+ struct b43_wl *wl = hw_to_b43_wl(hw);
|
||||
+ struct b43_wldev *dev = wl->current_dev;
|
||||
+
|
||||
+ switch (dev->tx_antenna) {
|
||||
+ case B43_ANTENNA0:
|
||||
+ *tx_ant = 1; *rx_ant = 1; break;
|
||||
+ case B43_ANTENNA1:
|
||||
+ *tx_ant = 2; *rx_ant = 2; break;
|
||||
+ case B43_ANTENNA_DEFAULT:
|
||||
+ *tx_ant = 3; *rx_ant = 3; break;
|
||||
+ }
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
static const struct ieee80211_ops b43_hw_ops = {
|
||||
.tx = b43_op_tx,
|
||||
.conf_tx = b43_op_conf_tx,
|
||||
@@ -5195,6 +5233,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,
|
||||
+ .set_antenna = b43_op_set_antenna,
|
||||
+ .get_antenna = b43_op_get_antenna,
|
||||
};
|
||||
|
||||
/* Hard-reset the chip. Do not call this directly.
|
||||
@@ -5496,6 +5536,8 @@ static int b43_one_core_attach(struct b4
|
||||
if (!wldev)
|
||||
goto out;
|
||||
|
||||
+ wldev->rx_antenna = B43_ANTENNA_DEFAULT;
|
||||
+ wldev->tx_antenna = B43_ANTENNA_DEFAULT;
|
||||
wldev->use_pio = b43_modparam_pio;
|
||||
wldev->dev = dev;
|
||||
wldev->wl = wl;
|
||||
@@ -5590,6 +5632,9 @@ static struct b43_wl *b43_wireless_init(
|
||||
|
||||
wiphy_ext_feature_set(hw->wiphy, NL80211_EXT_FEATURE_CQM_RSSI_LIST);
|
||||
|
||||
+ hw->wiphy->available_antennas_rx = 0x3;
|
||||
+ hw->wiphy->available_antennas_tx = 0x3;
|
||||
+
|
||||
wl->hw_registered = false;
|
||||
hw->max_rates = 2;
|
||||
SET_IEEE80211_DEV(hw, dev->dev);
|
||||
--- a/drivers/net/wireless/broadcom/b43/b43.h
|
||||
+++ b/drivers/net/wireless/broadcom/b43/b43.h
|
||||
@@ -841,6 +841,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 */
|
||||
+ int rx_antenna; /* Used RX antenna (B43_ANTENNAxxx) */
|
||||
+ int tx_antenna; /* Used TX antenna (B43_ANTENNAxxx) */
|
||||
|
||||
/* PHY/Radio device. */
|
||||
struct b43_phy phy;
|
||||
@@ -0,0 +1,11 @@
|
||||
--- a/drivers/net/wireless/broadcom/b43/dma.h
|
||||
+++ b/drivers/net/wireless/broadcom/b43/dma.h
|
||||
@@ -170,7 +170,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)
|
||||
|
||||
@@ -0,0 +1,17 @@
|
||||
--- a/drivers/net/wireless/broadcom/b43/main.c
|
||||
+++ b/drivers/net/wireless/broadcom/b43/main.c
|
||||
@@ -2884,6 +2884,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 */ ) {
|
||||
@@ -0,0 +1,11 @@
|
||||
--- a/drivers/net/wireless/broadcom/b43/main.c
|
||||
+++ b/drivers/net/wireless/broadcom/b43/main.c
|
||||
@@ -114,7 +114,7 @@ static int b43_modparam_pio = 0;
|
||||
module_param_named(pio, b43_modparam_pio, int, 0644);
|
||||
MODULE_PARM_DESC(pio, "Use PIO accesses by default: 0=DMA, 1=PIO");
|
||||
|
||||
-static int modparam_allhwsupport = !IS_ENABLED(CPTCFG_BRCMSMAC);
|
||||
+static int modparam_allhwsupport = 1;
|
||||
module_param_named(allhwsupport, modparam_allhwsupport, int, 0444);
|
||||
MODULE_PARM_DESC(allhwsupport, "Enable support for all hardware (even it if overlaps with the brcmsmac driver)");
|
||||
|
||||
@@ -0,0 +1,27 @@
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmsmac/channel.c
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmsmac/channel.c
|
||||
@@ -58,19 +58,12 @@
|
||||
(((c) < 149) ? 3 : 4))))
|
||||
|
||||
#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_NO_IR)
|
||||
+#define BRCM_2GHZ_2467_2472 REG_RULE(2467-10, 2472+10, 20, 0, 19, 0)
|
||||
|
||||
-#define BRCM_5GHZ_5180_5240 REG_RULE(5180-10, 5240+10, 40, 0, 21, \
|
||||
- NL80211_RRF_NO_IR)
|
||||
-#define BRCM_5GHZ_5260_5320 REG_RULE(5260-10, 5320+10, 40, 0, 21, \
|
||||
- NL80211_RRF_DFS | \
|
||||
- NL80211_RRF_NO_IR)
|
||||
-#define BRCM_5GHZ_5500_5700 REG_RULE(5500-10, 5700+10, 40, 0, 21, \
|
||||
- NL80211_RRF_DFS | \
|
||||
- NL80211_RRF_NO_IR)
|
||||
-#define BRCM_5GHZ_5745_5825 REG_RULE(5745-10, 5825+10, 40, 0, 21, \
|
||||
- NL80211_RRF_NO_IR)
|
||||
+#define BRCM_5GHZ_5180_5240 REG_RULE(5180-10, 5240+10, 40, 0, 21, 0)
|
||||
+#define BRCM_5GHZ_5260_5320 REG_RULE(5260-10, 5320+10, 40, 0, 21, 0)
|
||||
+#define BRCM_5GHZ_5500_5700 REG_RULE(5500-10, 5700+10, 40, 0, 21, 0)
|
||||
+#define BRCM_5GHZ_5745_5825 REG_RULE(5745-10, 5825+10, 40, 0, 21, 0)
|
||||
|
||||
static const struct ieee80211_regdomain brcms_regdom_x2 = {
|
||||
.n_reg_rules = 6,
|
||||
@@ -0,0 +1,74 @@
|
||||
From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <zajec5@gmail.com>
|
||||
Date: Mon, 8 Jun 2015 16:11:40 +0200
|
||||
Subject: [PATCH] brcmfmac: register wiphy(s) during module_init
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
This is needed by OpenWrt which expects all PHYs to be created after
|
||||
module loads successfully.
|
||||
|
||||
Signed-off-by: Rafał Miłecki <zajec5@gmail.com>
|
||||
---
|
||||
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c
|
||||
@@ -1551,6 +1551,7 @@ int __init brcmf_core_init(void)
|
||||
{
|
||||
if (!schedule_work(&brcmf_driver_work))
|
||||
return -EBUSY;
|
||||
+ flush_work(&brcmf_driver_work);
|
||||
|
||||
return 0;
|
||||
}
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/firmware.c
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/firmware.c
|
||||
@@ -431,6 +431,7 @@ struct brcmf_fw {
|
||||
struct brcmf_fw_request *req;
|
||||
u32 curpos;
|
||||
void (*done)(struct device *dev, int err, struct brcmf_fw_request *req);
|
||||
+ struct completion *completion;
|
||||
};
|
||||
|
||||
static void brcmf_fw_request_done(const struct firmware *fw, void *ctx);
|
||||
@@ -638,6 +639,8 @@ static void brcmf_fw_request_done(const
|
||||
fwctx->req = NULL;
|
||||
}
|
||||
fwctx->done(fwctx->dev, ret, fwctx->req);
|
||||
+ if (fwctx->completion)
|
||||
+ complete(fwctx->completion);
|
||||
kfree(fwctx);
|
||||
}
|
||||
|
||||
@@ -662,6 +665,8 @@ int brcmf_fw_get_firmwares(struct device
|
||||
{
|
||||
struct brcmf_fw_item *first = &req->items[0];
|
||||
struct brcmf_fw *fwctx;
|
||||
+ struct completion completion;
|
||||
+ unsigned long time_left;
|
||||
int ret;
|
||||
|
||||
brcmf_dbg(TRACE, "enter: dev=%s\n", dev_name(dev));
|
||||
@@ -678,6 +683,9 @@ int brcmf_fw_get_firmwares(struct device
|
||||
fwctx->dev = dev;
|
||||
fwctx->req = req;
|
||||
fwctx->done = fw_cb;
|
||||
+
|
||||
+ init_completion(&completion);
|
||||
+ fwctx->completion = &completion;
|
||||
|
||||
ret = request_firmware_nowait(THIS_MODULE, true, first->path,
|
||||
fwctx->dev, GFP_KERNEL, fwctx,
|
||||
@@ -685,6 +693,12 @@ int brcmf_fw_get_firmwares(struct device
|
||||
if (ret < 0)
|
||||
brcmf_fw_request_done(NULL, fwctx);
|
||||
|
||||
+
|
||||
+ time_left = wait_for_completion_timeout(&completion,
|
||||
+ msecs_to_jiffies(5000));
|
||||
+ if (!time_left && fwctx)
|
||||
+ fwctx->completion = NULL;
|
||||
+
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -0,0 +1,49 @@
|
||||
From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <zajec5@gmail.com>
|
||||
Date: Thu, 9 Jul 2015 00:07:59 +0200
|
||||
Subject: [PATCH] brcmfmac: workaround bug with some inconsistent BSSes state
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
Signed-off-by: Rafał Miłecki <zajec5@gmail.com>
|
||||
---
|
||||
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
|
||||
@@ -712,8 +712,36 @@ static struct wireless_dev *brcmf_cfg802
|
||||
struct brcmf_cfg80211_info *cfg = wiphy_to_cfg(wiphy);
|
||||
struct brcmf_pub *drvr = cfg->pub;
|
||||
struct wireless_dev *wdev;
|
||||
+ struct net_device *dev;
|
||||
int err;
|
||||
|
||||
+ /*
|
||||
+ * There is a bug with in-firmware BSS management. When adding virtual
|
||||
+ * interface brcmfmac first tells firmware to create new BSS and then
|
||||
+ * it creates new struct net_device.
|
||||
+ *
|
||||
+ * If creating/registering netdev(ice) fails, BSS remains in some bugged
|
||||
+ * state. It conflicts with existing BSSes by overtaking their auth
|
||||
+ * requests.
|
||||
+ *
|
||||
+ * It results in one BSS (addresss X) sending beacons and another BSS
|
||||
+ * (address Y) replying to authentication requests. This makes interface
|
||||
+ * unusable as AP.
|
||||
+ *
|
||||
+ * To workaround this bug we may try to guess if register_netdev(ice)
|
||||
+ * will fail. The most obvious case is using interface name that already
|
||||
+ * exists. This is actually quite likely with brcmfmac & some user space
|
||||
+ * scripts as brcmfmac doesn't allow deleting virtual interfaces.
|
||||
+ * So this bug can be triggered even by something trivial like:
|
||||
+ * iw dev wlan0 delete
|
||||
+ * iw phy phy0 interface add wlan0 type __ap
|
||||
+ */
|
||||
+ dev = dev_get_by_name(&init_net, name);
|
||||
+ if (dev) {
|
||||
+ dev_put(dev);
|
||||
+ return ERR_PTR(-ENFILE);
|
||||
+ }
|
||||
+
|
||||
brcmf_dbg(TRACE, "enter: %s type %d\n", name, type);
|
||||
err = brcmf_vif_add_validate(wiphy_to_cfg(wiphy), type);
|
||||
if (err) {
|
||||
@@ -0,0 +1,27 @@
|
||||
From 66ae1b1750720a33e29792a177b1e696f4f005fb Mon Sep 17 00:00:00 2001
|
||||
From: Phil Elwell <phil@raspberrypi.org>
|
||||
Date: Wed, 9 Mar 2016 17:25:59 +0000
|
||||
Subject: [PATCH] brcmfmac: Disable power management
|
||||
|
||||
Disable wireless power saving in the brcmfmac WLAN driver. This is a
|
||||
temporary measure until the connectivity loss resulting from power
|
||||
saving is resolved.
|
||||
|
||||
Signed-off-by: Phil Elwell <phil@raspberrypi.org>
|
||||
---
|
||||
drivers/net/wireless/brcm80211/brcmfmac/cfg80211.c | 2 ++
|
||||
1 file changed, 2 insertions(+)
|
||||
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
|
||||
@@ -2953,6 +2953,10 @@ brcmf_cfg80211_set_power_mgmt(struct wip
|
||||
* preference in cfg struct to apply this to
|
||||
* FW later while initializing the dongle
|
||||
*/
|
||||
+#if defined(CONFIG_ARCH_BCM2835)
|
||||
+ brcmf_dbg(INFO, "power management disabled\n");
|
||||
+ enabled = false;
|
||||
+#endif
|
||||
cfg->pwr_save = enabled;
|
||||
if (!check_vif_up(ifp->vif)) {
|
||||
|
||||
@@ -0,0 +1,60 @@
|
||||
From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <rafal@milecki.pl>
|
||||
Subject: [PATCH] brcmfmac: add in-driver tables with country codes
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
This adds early support for changing region. Ideally this data should
|
||||
be stored in DT as all these mappings are devices specific.
|
||||
|
||||
Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
|
||||
---
|
||||
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/of.c
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/of.c
|
||||
@@ -12,6 +12,36 @@
|
||||
#include "common.h"
|
||||
#include "of.h"
|
||||
|
||||
+/* TODO: FIXME: Use DT */
|
||||
+static void brcmf_of_probe_cc(struct device *dev,
|
||||
+ struct brcmf_mp_device *settings)
|
||||
+{
|
||||
+ static struct brcmfmac_pd_cc_entry netgear_r8000_cc_ent[] = {
|
||||
+ { "JP", "JP", 78 },
|
||||
+ { "US", "Q2", 86 },
|
||||
+ };
|
||||
+ struct brcmfmac_pd_cc_entry *cc_ent = NULL;
|
||||
+ int table_size = 0;
|
||||
+
|
||||
+ if (of_machine_is_compatible("netgear,r8000")) {
|
||||
+ cc_ent = netgear_r8000_cc_ent;
|
||||
+ table_size = ARRAY_SIZE(netgear_r8000_cc_ent);
|
||||
+ }
|
||||
+
|
||||
+ if (cc_ent && table_size) {
|
||||
+ struct brcmfmac_pd_cc *cc;
|
||||
+ size_t memsize;
|
||||
+
|
||||
+ memsize = table_size * sizeof(struct brcmfmac_pd_cc_entry);
|
||||
+ cc = devm_kzalloc(dev, sizeof(*cc) + memsize, GFP_KERNEL);
|
||||
+ if (!cc)
|
||||
+ return;
|
||||
+ cc->table_size = table_size;
|
||||
+ memcpy(cc->table, cc_ent, memsize);
|
||||
+ settings->country_codes = cc;
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
void brcmf_of_probe(struct device *dev, enum brcmf_bus_type bus_type,
|
||||
struct brcmf_mp_device *settings)
|
||||
{
|
||||
@@ -30,6 +60,8 @@ void brcmf_of_probe(struct device *dev,
|
||||
of_node_put(root);
|
||||
}
|
||||
|
||||
+ brcmf_of_probe_cc(dev, settings);
|
||||
+
|
||||
if (!np || bus_type != BRCMF_BUSTYPE_SDIO ||
|
||||
!of_device_is_compatible(np, "brcm,bcm4329-fmac"))
|
||||
return;
|
||||
@@ -0,0 +1,23 @@
|
||||
brcmfmac: do not use internal roaming engine by default
|
||||
|
||||
Some evidence of curing disconnects with this disabled, so make it a default.
|
||||
Can be overridden with module parameter roamoff=0
|
||||
See: http://projectable.me/optimize-my-pi-wi-fi/
|
||||
|
||||
Signed-off-by: Phil Elwell <phil@raspberrypi.org>
|
||||
---
|
||||
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.c
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.c
|
||||
@@ -59,7 +59,11 @@ static int brcmf_fcmode;
|
||||
module_param_named(fcmode, brcmf_fcmode, int, 0);
|
||||
MODULE_PARM_DESC(fcmode, "Mode of firmware signalled flow control");
|
||||
|
||||
+#if defined(CONFIG_ARCH_BCM2835)
|
||||
+static int brcmf_roamoff = 1;
|
||||
+#else
|
||||
static int brcmf_roamoff;
|
||||
+#endif
|
||||
module_param_named(roamoff, brcmf_roamoff, int, 0400);
|
||||
MODULE_PARM_DESC(roamoff, "Do not use internal roaming engine");
|
||||
|
||||
148
mac80211/patches/brcm/998-survey.patch
Normal file
148
mac80211/patches/brcm/998-survey.patch
Normal file
@@ -0,0 +1,148 @@
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
|
||||
@@ -2905,6 +2905,63 @@ done:
|
||||
}
|
||||
|
||||
static int
|
||||
+brcmf_cfg80211_dump_survey(struct wiphy *wiphy, struct net_device *ndev,
|
||||
+ int idx, struct survey_info *survey)
|
||||
+{
|
||||
+ struct brcmf_cfg80211_info *cfg = wiphy_to_cfg(wiphy);
|
||||
+ struct brcmf_if *ifp = netdev_priv(ndev);
|
||||
+ struct brcmu_chan ch;
|
||||
+ enum nl80211_band band = 0;
|
||||
+ s32 err = 0;
|
||||
+ int noise;
|
||||
+ u32 freq;
|
||||
+ u32 chanspec;
|
||||
+
|
||||
+ memset(survey, 0, sizeof(struct survey_info));
|
||||
+ if (idx != 0) {
|
||||
+ if (idx >= cfg->pub->num_chan_stats || cfg->pub->chan_stats == NULL)
|
||||
+ return -ENOENT;
|
||||
+ if (cfg->pub->chan_stats[idx].freq == 0)
|
||||
+ return -ENOENT;
|
||||
+ survey->filled = SURVEY_INFO_NOISE_DBM;
|
||||
+ survey->channel = ieee80211_get_channel(wiphy, cfg->pub->chan_stats[idx].freq);
|
||||
+ survey->noise = cfg->pub->chan_stats[idx].noise;
|
||||
+ return 0;
|
||||
+ }
|
||||
+
|
||||
+ err = brcmf_fil_iovar_int_get(ifp, "chanspec", &chanspec);
|
||||
+ if (err) {
|
||||
+ brcmf_err("chanspec failed (%d)\n", err);
|
||||
+ return err;
|
||||
+ }
|
||||
+
|
||||
+ ch.chspec = chanspec;
|
||||
+ cfg->d11inf.decchspec(&ch);
|
||||
+
|
||||
+ switch (ch.band) {
|
||||
+ case BRCMU_CHAN_BAND_2G:
|
||||
+ band = NL80211_BAND_2GHZ;
|
||||
+ break;
|
||||
+ case BRCMU_CHAN_BAND_5G:
|
||||
+ band = NL80211_BAND_5GHZ;
|
||||
+ break;
|
||||
+ }
|
||||
+
|
||||
+ freq = ieee80211_channel_to_frequency(ch.control_ch_num, band);
|
||||
+ survey->channel = ieee80211_get_channel(wiphy, freq);
|
||||
+
|
||||
+ err = brcmf_fil_cmd_int_get(ifp, BRCMF_C_GET_PHY_NOISE, &noise);
|
||||
+ if (err) {
|
||||
+ brcmf_err("Could not get noise (%d)\n", err);
|
||||
+ return err;
|
||||
+ }
|
||||
+
|
||||
+ survey->filled = SURVEY_INFO_NOISE_DBM | SURVEY_INFO_IN_USE;
|
||||
+ survey->noise = le32_to_cpu(noise);
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static int
|
||||
brcmf_cfg80211_dump_station(struct wiphy *wiphy, struct net_device *ndev,
|
||||
int idx, u8 *mac, struct station_info *sinfo)
|
||||
{
|
||||
@@ -2994,6 +3051,7 @@ static s32 brcmf_inform_single_bss(struc
|
||||
struct brcmu_chan ch;
|
||||
u16 channel;
|
||||
u32 freq;
|
||||
+ int i;
|
||||
u16 notify_capability;
|
||||
u16 notify_interval;
|
||||
u8 *notify_ie;
|
||||
@@ -3018,6 +3076,17 @@ static s32 brcmf_inform_single_bss(struc
|
||||
band = NL80211_BAND_5GHZ;
|
||||
|
||||
freq = ieee80211_channel_to_frequency(channel, band);
|
||||
+ for (i = 0;i < cfg->pub->num_chan_stats;i++) {
|
||||
+ if (freq == cfg->pub->chan_stats[i].freq)
|
||||
+ break;
|
||||
+ if (cfg->pub->chan_stats[i].freq == 0)
|
||||
+ break;
|
||||
+ }
|
||||
+ if (i < cfg->pub->num_chan_stats) {
|
||||
+ cfg->pub->chan_stats[i].freq = freq;
|
||||
+ cfg->pub->chan_stats[i].noise = bi->phy_noise;
|
||||
+ }
|
||||
+
|
||||
bss_data.chan = ieee80211_get_channel(wiphy, freq);
|
||||
bss_data.scan_width = NL80211_BSS_CHAN_WIDTH_20;
|
||||
bss_data.boottime_ns = ktime_to_ns(ktime_get_boottime());
|
||||
@@ -5470,6 +5539,7 @@ static struct cfg80211_ops brcmf_cfg8021
|
||||
.leave_ibss = brcmf_cfg80211_leave_ibss,
|
||||
.get_station = brcmf_cfg80211_get_station,
|
||||
.dump_station = brcmf_cfg80211_dump_station,
|
||||
+ .dump_survey = brcmf_cfg80211_dump_survey,
|
||||
.set_tx_power = brcmf_cfg80211_set_tx_power,
|
||||
.get_tx_power = brcmf_cfg80211_get_tx_power,
|
||||
.add_key = brcmf_cfg80211_add_key,
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c
|
||||
@@ -1349,6 +1349,8 @@ int brcmf_attach(struct device *dev)
|
||||
|
||||
/* Link to bus module */
|
||||
drvr->hdrlen = 0;
|
||||
+ drvr->chan_stats = vzalloc(256 * sizeof(struct brcmf_chan_stats));
|
||||
+ drvr->num_chan_stats = 256;
|
||||
|
||||
/* Attach and link in the protocol */
|
||||
ret = brcmf_proto_attach(drvr);
|
||||
@@ -1431,6 +1433,12 @@ void brcmf_detach(struct device *dev)
|
||||
if (drvr == NULL)
|
||||
return;
|
||||
|
||||
+ drvr->num_chan_stats = 0;
|
||||
+ if (drvr->chan_stats) {
|
||||
+ vfree(drvr->chan_stats);
|
||||
+ drvr->chan_stats = NULL;
|
||||
+ }
|
||||
+
|
||||
#ifdef CONFIG_INET
|
||||
unregister_inetaddr_notifier(&drvr->inetaddr_notifier);
|
||||
#endif
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.h
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.h
|
||||
@@ -91,6 +91,11 @@ struct brcmf_rev_info {
|
||||
u32 nvramrev;
|
||||
};
|
||||
|
||||
+struct brcmf_chan_stats {
|
||||
+ u32 freq;
|
||||
+ int noise;
|
||||
+};
|
||||
+
|
||||
/* Common structure for module and instance linkage */
|
||||
struct brcmf_pub {
|
||||
/* Linkage ponters */
|
||||
@@ -100,6 +105,9 @@ struct brcmf_pub {
|
||||
struct cfg80211_ops *ops;
|
||||
struct brcmf_cfg80211_info *config;
|
||||
|
||||
+ int num_chan_stats;
|
||||
+ struct brcmf_chan_stats *chan_stats;
|
||||
+
|
||||
/* Internal brcmf items */
|
||||
uint hdrlen; /* Total BRCMF header length (proto + bus) */
|
||||
|
||||
14
mac80211/patches/build/000-fix_kconfig.patch
Normal file
14
mac80211/patches/build/000-fix_kconfig.patch
Normal file
@@ -0,0 +1,14 @@
|
||||
--- a/kconf/Makefile
|
||||
+++ b/kconf/Makefile
|
||||
@@ -1,9 +1,9 @@
|
||||
-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_CFLAGS := $(shell ./lxdialog/check-lxdialog.sh -ccflags) -DLOCALE
|
||||
+mconf_CFLAGS := $(shell ./lxdialog/check-lxdialog.sh -ccflags)
|
||||
mconf_LDFLAGS := $(shell ./lxdialog/check-lxdialog.sh -ldflags $(CC))
|
||||
mconf: CFLAGS += $(mconf_CFLAGS)
|
||||
|
||||
169
mac80211/patches/build/001-fix_build.patch
Normal file
169
mac80211/patches/build/001-fix_build.patch
Normal file
@@ -0,0 +1,169 @@
|
||||
--- a/Makefile
|
||||
+++ b/Makefile
|
||||
@@ -5,7 +5,7 @@
|
||||
ifeq ($(KERNELRELEASE),)
|
||||
|
||||
MAKEFLAGS += --no-print-directory
|
||||
-SHELL := /bin/bash
|
||||
+SHELL := /usr/bin/env bash
|
||||
BACKPORT_DIR := $(shell pwd)
|
||||
|
||||
KMODDIR ?= updates
|
||||
@@ -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_DIR 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,58 +62,62 @@ 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-5]\|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 19 | sed 's/^/3./')" ;\
|
||||
- kvers="$$kvers $$(seq 0 20 | sed 's/^/4./')" ;\
|
||||
- kvers="$$kvers $$(seq 0 99 | sed 's/^/5./')" ;\
|
||||
- print=0 ;\
|
||||
- for v in $$kvers ; do \
|
||||
- if [ "$$print" = "1" ] ; then \
|
||||
- echo config 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-5]\|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 19 | sed 's/^/3./')" ;\
|
||||
+ kvers="$$kvers $$(seq 0 20 | sed 's/^/4./')" ;\
|
||||
+ kvers="$$kvers $$(seq 0 99 | sed 's/^/5./')" ;\
|
||||
+ print=0 ;\
|
||||
+ for v in $$kvers ; do \
|
||||
+ if [ "$$print" = "1" ] ; then \
|
||||
+ echo config 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 "$@"
|
||||
|
||||
.PHONY: defconfig-help
|
||||
--- a/Makefile.real
|
||||
+++ b/Makefile.real
|
||||
@@ -59,7 +59,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" ;\
|
||||
@@ -80,7 +80,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
|
||||
64
mac80211/patches/build/002-change_allconfig.patch
Normal file
64
mac80211/patches/build/002-change_allconfig.patch
Normal file
@@ -0,0 +1,64 @@
|
||||
--- a/kconf/conf.c
|
||||
+++ b/kconf/conf.c
|
||||
@@ -598,40 +598,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;
|
||||
--- a/kconf/confdata.c
|
||||
+++ b/kconf/confdata.c
|
||||
@@ -1170,6 +1170,8 @@ bool conf_set_all_new_symbols(enum conf_
|
||||
}
|
||||
bool has_changed = false;
|
||||
|
||||
+ sym_clear_all_valid();
|
||||
+
|
||||
for_all_symbols(i, sym) {
|
||||
if (sym_has_value(sym) || (sym->flags & SYMBOL_VALID))
|
||||
continue;
|
||||
@@ -1213,8 +1215,6 @@ bool conf_set_all_new_symbols(enum conf_
|
||||
|
||||
}
|
||||
|
||||
- sym_clear_all_valid();
|
||||
-
|
||||
/*
|
||||
* We have different type of choice blocks.
|
||||
* If curr.tri equals to mod then we can select several
|
||||
34
mac80211/patches/build/003-remove_bogus_modparams.patch
Normal file
34
mac80211/patches/build/003-remove_bogus_modparams.patch
Normal file
@@ -0,0 +1,34 @@
|
||||
--- a/compat/main.c
|
||||
+++ b/compat/main.c
|
||||
@@ -20,31 +20,6 @@ MODULE_LICENSE("GPL");
|
||||
#error "You need a CPTCFG_VERSION"
|
||||
#endif
|
||||
|
||||
-static char *backported_kernel_name = CPTCFG_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 (" CPTCFG_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 = CPTCFG_KERNEL_VERSION;
|
||||
-static char *backports_version = CPTCFG_VERSION;
|
||||
-
|
||||
-module_param(backported_kernel_version, charp, 0400);
|
||||
-MODULE_PARM_DESC(backported_kernel_version,
|
||||
- "The kernel version that was used for this backport (" CPTCFG_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 (" CPTCFG_VERSION ")");
|
||||
-
|
||||
-#endif
|
||||
-
|
||||
void backport_dependency_symbol(void)
|
||||
{
|
||||
}
|
||||
28
mac80211/patches/build/004-kconfig_backport_fix.patch
Normal file
28
mac80211/patches/build/004-kconfig_backport_fix.patch
Normal file
@@ -0,0 +1,28 @@
|
||||
--- a/backport-include/linux/kconfig.h
|
||||
+++ b/backport-include/linux/kconfig.h
|
||||
@@ -5,6 +5,8 @@
|
||||
#include_next <linux/kconfig.h>
|
||||
#endif
|
||||
|
||||
+#if LINUX_VERSION_CODE < KERNEL_VERSION(3,4,0)
|
||||
+
|
||||
#ifndef __ARG_PLACEHOLDER_1
|
||||
#define __ARG_PLACEHOLDER_1 0,
|
||||
#define config_enabled(cfg) _config_enabled(cfg)
|
||||
@@ -16,6 +18,7 @@
|
||||
* 3.1 - 3.3 had a broken version of this, so undef
|
||||
* (they didn't have __ARG_PLACEHOLDER_1)
|
||||
*/
|
||||
+
|
||||
#undef IS_ENABLED
|
||||
#define IS_ENABLED(option) \
|
||||
(config_enabled(option) || config_enabled(option##_MODULE))
|
||||
@@ -31,6 +34,8 @@
|
||||
#undef IS_BUILTIN
|
||||
#define IS_BUILTIN(option) config_enabled(option)
|
||||
|
||||
+#endif
|
||||
+
|
||||
#ifndef IS_REACHABLE
|
||||
/*
|
||||
* IS_REACHABLE(CONFIG_FOO) evaluates to 1 if the currently compiled
|
||||
15
mac80211/patches/build/010-disable_rfkill.patch
Normal file
15
mac80211/patches/build/010-disable_rfkill.patch
Normal file
@@ -0,0 +1,15 @@
|
||||
--- a/backport-include/linux/rfkill.h
|
||||
+++ b/backport-include/linux/rfkill.h
|
||||
@@ -2,6 +2,12 @@
|
||||
#define __COMPAT_RFKILL_H
|
||||
#include <linux/version.h>
|
||||
|
||||
+#undef CONFIG_RFKILL
|
||||
+#undef CONFIG_RFKILL_FULL
|
||||
+#undef CONFIG_RFKILL_LEDS
|
||||
+#undef CONFIG_RFKILL_MODULE
|
||||
+#undef CONFIG_RFKILL_FULL_MODULE
|
||||
+
|
||||
#if LINUX_VERSION_IS_GEQ(3,10,0)
|
||||
#include_next <linux/rfkill.h>
|
||||
#else
|
||||
11
mac80211/patches/build/012-kernel_build_check.patch
Normal file
11
mac80211/patches/build/012-kernel_build_check.patch
Normal file
@@ -0,0 +1,11 @@
|
||||
--- a/Makefile
|
||||
+++ b/Makefile
|
||||
@@ -2,7 +2,7 @@
|
||||
# Makefile for the output source package
|
||||
#
|
||||
|
||||
-ifeq ($(KERNELRELEASE),)
|
||||
+ifeq ($(KERNELVERSION),)
|
||||
|
||||
MAKEFLAGS += --no-print-directory
|
||||
SHELL := /usr/bin/env bash
|
||||
34
mac80211/patches/build/015-ipw200-mtu.patch
Normal file
34
mac80211/patches/build/015-ipw200-mtu.patch
Normal file
@@ -0,0 +1,34 @@
|
||||
--- a/drivers/net/wireless/intel/ipw2x00/ipw2200.c
|
||||
+++ b/drivers/net/wireless/intel/ipw2x00/ipw2200.c
|
||||
@@ -11470,6 +11470,15 @@ static const struct attribute_group ipw_
|
||||
.attrs = ipw_sysfs_entries,
|
||||
};
|
||||
|
||||
+#if LINUX_VERSION_IS_LESS(4,10,0)
|
||||
+static int __change_mtu(struct net_device *ndev, int new_mtu){
|
||||
+ if (new_mtu < 68 || new_mtu > LIBIPW_DATA_LEN)
|
||||
+ return -EINVAL;
|
||||
+ ndev->mtu = new_mtu;
|
||||
+ return 0;
|
||||
+}
|
||||
+#endif
|
||||
+
|
||||
#ifdef CPTCFG_IPW2200_PROMISCUOUS
|
||||
static int ipw_prom_open(struct net_device *dev)
|
||||
{
|
||||
@@ -11518,15 +11527,6 @@ static netdev_tx_t ipw_prom_hard_start_x
|
||||
return NETDEV_TX_OK;
|
||||
}
|
||||
|
||||
-#if LINUX_VERSION_IS_LESS(4,10,0)
|
||||
-static int __change_mtu(struct net_device *ndev, int new_mtu){
|
||||
- if (new_mtu < 68 || new_mtu > LIBIPW_DATA_LEN)
|
||||
- return -EINVAL;
|
||||
- ndev->mtu = new_mtu;
|
||||
- return 0;
|
||||
-}
|
||||
-#endif
|
||||
-
|
||||
static const struct net_device_ops ipw_prom_netdev_ops = {
|
||||
#if LINUX_VERSION_IS_LESS(4,10,0)
|
||||
.ndo_change_mtu = __change_mtu,
|
||||
33
mac80211/patches/build/050-lib80211_option.patch
Normal file
33
mac80211/patches/build/050-lib80211_option.patch
Normal file
@@ -0,0 +1,33 @@
|
||||
--- a/net/wireless/Kconfig
|
||||
+++ b/net/wireless/Kconfig
|
||||
@@ -187,7 +187,7 @@ config CFG80211_WEXT_EXPORT
|
||||
endif # CFG80211
|
||||
|
||||
config LIB80211
|
||||
- tristate
|
||||
+ tristate "lib80211"
|
||||
depends on m
|
||||
default n
|
||||
help
|
||||
@@ -197,18 +197,18 @@ config LIB80211
|
||||
Drivers should select this themselves if needed.
|
||||
|
||||
config LIB80211_CRYPT_WEP
|
||||
- tristate
|
||||
+ tristate "lib80211 WEP support"
|
||||
depends on m
|
||||
select BPAUTO_CRYPTO_LIB_ARC4
|
||||
|
||||
config LIB80211_CRYPT_CCMP
|
||||
- tristate
|
||||
+ tristate "lib80211 CCMP support"
|
||||
depends on m
|
||||
depends on CRYPTO_AES
|
||||
depends on CRYPTO_CCM
|
||||
|
||||
config LIB80211_CRYPT_TKIP
|
||||
- tristate
|
||||
+ tristate "lib80211 TKIP support"
|
||||
depends on m
|
||||
select BPAUTO_CRYPTO_LIB_ARC4
|
||||
|
||||
335
mac80211/patches/build/060-no_local_ssb_bcma.patch
Normal file
335
mac80211/patches/build/060-no_local_ssb_bcma.patch
Normal file
@@ -0,0 +1,335 @@
|
||||
--- a/local-symbols
|
||||
+++ b/local-symbols
|
||||
@@ -424,43 +424,6 @@ USB_SIERRA_NET=
|
||||
USB_VL600=
|
||||
USB_NET_CH9200=
|
||||
USB_NET_AQC111=
|
||||
-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_HOST_SOC=
|
||||
-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_HOST_SOC=
|
||||
-BCMA_DRIVER_PCI=
|
||||
-BCMA_DRIVER_PCI_HOSTMODE=
|
||||
-BCMA_DRIVER_MIPS=
|
||||
-BCMA_PFLASH=
|
||||
-BCMA_SFLASH=
|
||||
-BCMA_NFLASH=
|
||||
-BCMA_DRIVER_GMAC_CMN=
|
||||
-BCMA_DRIVER_GPIO=
|
||||
-BCMA_DEBUG=
|
||||
USB_ACM=
|
||||
USB_PRINTER=
|
||||
USB_WDM=
|
||||
--- a/drivers/net/wireless/broadcom/b43/Kconfig
|
||||
+++ b/drivers/net/wireless/broadcom/b43/Kconfig
|
||||
@@ -63,21 +63,21 @@ endchoice
|
||||
config B43_PCI_AUTOSELECT
|
||||
bool
|
||||
depends on B43 && SSB_PCIHOST_POSSIBLE
|
||||
- select SSB_PCIHOST
|
||||
- select SSB_B43_PCI_BRIDGE
|
||||
+ depends on SSB_PCIHOST
|
||||
+ depends on SSB_B43_PCI_BRIDGE
|
||||
default y
|
||||
|
||||
# Auto-select SSB PCICORE driver, if possible
|
||||
config B43_PCICORE_AUTOSELECT
|
||||
bool
|
||||
depends on B43 && SSB_DRIVER_PCICORE_POSSIBLE
|
||||
- select SSB_DRIVER_PCICORE
|
||||
+ depends on SSB_DRIVER_PCICORE
|
||||
default y
|
||||
|
||||
config B43_SDIO
|
||||
bool "Broadcom 43xx SDIO device support"
|
||||
depends on B43 && B43_SSB && SSB_SDIOHOST_POSSIBLE
|
||||
- select SSB_SDIOHOST
|
||||
+ depends on SSB_SDIOHOST
|
||||
help
|
||||
Broadcom 43xx device support for Soft-MAC SDIO devices.
|
||||
|
||||
@@ -96,13 +96,13 @@ config B43_SDIO
|
||||
config B43_BCMA_PIO
|
||||
bool
|
||||
depends on B43 && B43_BCMA
|
||||
- select BCMA_BLOCKIO
|
||||
+ depends on BCMA_BLOCKIO
|
||||
default y
|
||||
|
||||
config B43_PIO
|
||||
bool
|
||||
depends on B43 && B43_SSB
|
||||
- select SSB_BLOCKIO
|
||||
+ depends on SSB_BLOCKIO
|
||||
default y
|
||||
|
||||
config B43_PHY_G
|
||||
--- a/drivers/net/wireless/broadcom/b43/main.c
|
||||
+++ b/drivers/net/wireless/broadcom/b43/main.c
|
||||
@@ -2851,7 +2851,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;
|
||||
@@ -4868,7 +4868,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. */
|
||||
-#if defined(CPTCFG_B43_SSB) && defined(CPTCFG_SSB_DRIVER_PCICORE)
|
||||
+#if defined(CPTCFG_B43_SSB) && defined(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/broadcom/b43legacy/Kconfig
|
||||
+++ b/drivers/net/wireless/broadcom/b43legacy/Kconfig
|
||||
@@ -3,7 +3,7 @@ config B43LEGACY
|
||||
tristate "Broadcom 43xx-legacy wireless support (mac80211 stack)"
|
||||
depends on m
|
||||
depends on SSB_POSSIBLE && MAC80211 && HAS_DMA
|
||||
- select SSB
|
||||
+ depends on SSB
|
||||
depends on FW_LOADER
|
||||
help
|
||||
b43legacy is a driver for 802.11b devices from Broadcom (BCM4301 and
|
||||
@@ -25,15 +25,15 @@ config B43LEGACY
|
||||
config B43LEGACY_PCI_AUTOSELECT
|
||||
bool
|
||||
depends on B43LEGACY && SSB_PCIHOST_POSSIBLE
|
||||
- select SSB_PCIHOST
|
||||
- select SSB_B43_PCI_BRIDGE
|
||||
+ depends on SSB_PCIHOST
|
||||
+ depends on SSB_B43_PCI_BRIDGE
|
||||
default y
|
||||
|
||||
# Auto-select SSB PCICORE driver, if possible
|
||||
config B43LEGACY_PCICORE_AUTOSELECT
|
||||
bool
|
||||
depends on B43LEGACY && SSB_DRIVER_PCICORE_POSSIBLE
|
||||
- select SSB_DRIVER_PCICORE
|
||||
+ depends on SSB_DRIVER_PCICORE
|
||||
default y
|
||||
|
||||
# LED support
|
||||
--- a/drivers/net/wireless/broadcom/b43legacy/main.c
|
||||
+++ b/drivers/net/wireless/broadcom/b43legacy/main.c
|
||||
@@ -1906,7 +1906,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;
|
||||
@@ -1925,7 +1925,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/broadcom/brcm80211/brcmsmac/led.h
|
||||
+++ b/drivers/net/wireless/broadcom/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
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmsmac/Makefile
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmsmac/Makefile
|
||||
@@ -42,6 +42,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/broadcom/brcm80211/Kconfig
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/Kconfig
|
||||
@@ -8,7 +8,7 @@ config BRCMSMAC
|
||||
depends on m
|
||||
depends on MAC80211
|
||||
depends on BCMA_POSSIBLE
|
||||
- select BCMA
|
||||
+ depends on BCMA
|
||||
select NEW_LEDS if BCMA_DRIVER_GPIO
|
||||
select LEDS_CLASS if BCMA_DRIVER_GPIO
|
||||
select BRCMUTIL
|
||||
--- a/Kconfig.local
|
||||
+++ b/Kconfig.local
|
||||
@@ -1276,117 +1276,6 @@ config BACKPORTED_USB_NET_CH9200
|
||||
config BACKPORTED_USB_NET_AQC111
|
||||
tristate
|
||||
default USB_NET_AQC111
|
||||
-config BACKPORTED_SSB_POSSIBLE
|
||||
- tristate
|
||||
- default SSB_POSSIBLE
|
||||
-config BACKPORTED_SSB
|
||||
- tristate
|
||||
- default SSB
|
||||
-config BACKPORTED_SSB_SPROM
|
||||
- tristate
|
||||
- default SSB_SPROM
|
||||
-config BACKPORTED_SSB_BLOCKIO
|
||||
- tristate
|
||||
- default SSB_BLOCKIO
|
||||
-config BACKPORTED_SSB_PCIHOST_POSSIBLE
|
||||
- tristate
|
||||
- default SSB_PCIHOST_POSSIBLE
|
||||
-config BACKPORTED_SSB_PCIHOST
|
||||
- tristate
|
||||
- default SSB_PCIHOST
|
||||
-config BACKPORTED_SSB_B43_PCI_BRIDGE
|
||||
- tristate
|
||||
- default SSB_B43_PCI_BRIDGE
|
||||
-config BACKPORTED_SSB_PCMCIAHOST_POSSIBLE
|
||||
- tristate
|
||||
- default SSB_PCMCIAHOST_POSSIBLE
|
||||
-config BACKPORTED_SSB_PCMCIAHOST
|
||||
- tristate
|
||||
- default SSB_PCMCIAHOST
|
||||
-config BACKPORTED_SSB_SDIOHOST_POSSIBLE
|
||||
- tristate
|
||||
- default SSB_SDIOHOST_POSSIBLE
|
||||
-config BACKPORTED_SSB_SDIOHOST
|
||||
- tristate
|
||||
- default SSB_SDIOHOST
|
||||
-config BACKPORTED_SSB_HOST_SOC
|
||||
- tristate
|
||||
- default SSB_HOST_SOC
|
||||
-config BACKPORTED_SSB_SERIAL
|
||||
- tristate
|
||||
- default SSB_SERIAL
|
||||
-config BACKPORTED_SSB_DRIVER_PCICORE_POSSIBLE
|
||||
- tristate
|
||||
- default SSB_DRIVER_PCICORE_POSSIBLE
|
||||
-config BACKPORTED_SSB_DRIVER_PCICORE
|
||||
- tristate
|
||||
- default SSB_DRIVER_PCICORE
|
||||
-config BACKPORTED_SSB_PCICORE_HOSTMODE
|
||||
- tristate
|
||||
- default SSB_PCICORE_HOSTMODE
|
||||
-config BACKPORTED_SSB_DRIVER_MIPS
|
||||
- tristate
|
||||
- default SSB_DRIVER_MIPS
|
||||
-config BACKPORTED_SSB_SFLASH
|
||||
- tristate
|
||||
- default SSB_SFLASH
|
||||
-config BACKPORTED_SSB_EMBEDDED
|
||||
- tristate
|
||||
- default SSB_EMBEDDED
|
||||
-config BACKPORTED_SSB_DRIVER_EXTIF
|
||||
- tristate
|
||||
- default SSB_DRIVER_EXTIF
|
||||
-config BACKPORTED_SSB_DRIVER_GIGE
|
||||
- tristate
|
||||
- default SSB_DRIVER_GIGE
|
||||
-config BACKPORTED_SSB_DRIVER_GPIO
|
||||
- tristate
|
||||
- default SSB_DRIVER_GPIO
|
||||
-config BACKPORTED_BCMA_POSSIBLE
|
||||
- tristate
|
||||
- default BCMA_POSSIBLE
|
||||
-config BACKPORTED_BCMA
|
||||
- tristate
|
||||
- default BCMA
|
||||
-config BACKPORTED_BCMA_BLOCKIO
|
||||
- tristate
|
||||
- default BCMA_BLOCKIO
|
||||
-config BACKPORTED_BCMA_HOST_PCI_POSSIBLE
|
||||
- tristate
|
||||
- default BCMA_HOST_PCI_POSSIBLE
|
||||
-config BACKPORTED_BCMA_HOST_PCI
|
||||
- tristate
|
||||
- default BCMA_HOST_PCI
|
||||
-config BACKPORTED_BCMA_HOST_SOC
|
||||
- tristate
|
||||
- default BCMA_HOST_SOC
|
||||
-config BACKPORTED_BCMA_DRIVER_PCI
|
||||
- tristate
|
||||
- default BCMA_DRIVER_PCI
|
||||
-config BACKPORTED_BCMA_DRIVER_PCI_HOSTMODE
|
||||
- tristate
|
||||
- default BCMA_DRIVER_PCI_HOSTMODE
|
||||
-config BACKPORTED_BCMA_DRIVER_MIPS
|
||||
- tristate
|
||||
- default BCMA_DRIVER_MIPS
|
||||
-config BACKPORTED_BCMA_PFLASH
|
||||
- tristate
|
||||
- default BCMA_PFLASH
|
||||
-config BACKPORTED_BCMA_SFLASH
|
||||
- tristate
|
||||
- default BCMA_SFLASH
|
||||
-config BACKPORTED_BCMA_NFLASH
|
||||
- tristate
|
||||
- default BCMA_NFLASH
|
||||
-config BACKPORTED_BCMA_DRIVER_GMAC_CMN
|
||||
- tristate
|
||||
- default BCMA_DRIVER_GMAC_CMN
|
||||
-config BACKPORTED_BCMA_DRIVER_GPIO
|
||||
- tristate
|
||||
- default BCMA_DRIVER_GPIO
|
||||
-config BACKPORTED_BCMA_DEBUG
|
||||
- tristate
|
||||
- default BCMA_DEBUG
|
||||
config BACKPORTED_USB_ACM
|
||||
tristate
|
||||
default USB_ACM
|
||||
--- a/Kconfig.sources
|
||||
+++ b/Kconfig.sources
|
||||
@@ -7,9 +7,6 @@ source "$BACKPORT_DIR/net/mac80211/Kconf
|
||||
source "$BACKPORT_DIR/drivers/net/wireless/Kconfig"
|
||||
source "$BACKPORT_DIR/drivers/net/usb/Kconfig"
|
||||
|
||||
-source "$BACKPORT_DIR/drivers/ssb/Kconfig"
|
||||
-source "$BACKPORT_DIR/drivers/bcma/Kconfig"
|
||||
-
|
||||
source "$BACKPORT_DIR/drivers/usb/class/Kconfig"
|
||||
|
||||
source "$BACKPORT_DIR/drivers/staging/Kconfig"
|
||||
--- a/Makefile.kernel
|
||||
+++ b/Makefile.kernel
|
||||
@@ -40,8 +40,6 @@ obj-y += compat/
|
||||
obj-$(CPTCFG_CFG80211) += net/wireless/
|
||||
obj-$(CPTCFG_MAC80211) += net/mac80211/
|
||||
obj-$(CPTCFG_WLAN) += drivers/net/wireless/
|
||||
-obj-$(CPTCFG_SSB) += drivers/ssb/
|
||||
-obj-$(CPTCFG_BCMA) += drivers/bcma/
|
||||
obj-$(CPTCFG_USB_NET_RNDIS_WLAN) += drivers/net/usb/
|
||||
|
||||
obj-$(CPTCFG_USB_WDM) += drivers/usb/class/
|
||||
@@ -0,0 +1,10 @@
|
||||
--- a/drivers/net/wireless/marvell/mwl8k.c
|
||||
+++ b/drivers/net/wireless/marvell/mwl8k.c
|
||||
@@ -5694,6 +5694,7 @@ MODULE_FIRMWARE("mwl8k/fmimage_8366.fw")
|
||||
MODULE_FIRMWARE(MWL8K_8366_AP_FW(MWL8K_8366_AP_FW_API));
|
||||
|
||||
static const struct pci_device_id mwl8k_pci_id_table[] = {
|
||||
+ { PCI_VDEVICE(MARVELL, 0x2a02), .driver_data = MWL8363, },
|
||||
{ PCI_VDEVICE(MARVELL, 0x2a0a), .driver_data = MWL8363, },
|
||||
{ PCI_VDEVICE(MARVELL, 0x2a0c), .driver_data = MWL8363, },
|
||||
{ PCI_VDEVICE(MARVELL, 0x2a24), .driver_data = MWL8363, },
|
||||
@@ -0,0 +1,21 @@
|
||||
--- a/drivers/net/wireless/marvell/libertas/cfg.c
|
||||
+++ b/drivers/net/wireless/marvell/libertas/cfg.c
|
||||
@@ -2053,6 +2053,8 @@ struct wireless_dev *lbs_cfg_alloc(struc
|
||||
goto err_wiphy_new;
|
||||
}
|
||||
|
||||
+ set_wiphy_dev(wdev->wiphy, dev);
|
||||
+
|
||||
return wdev;
|
||||
|
||||
err_wiphy_new:
|
||||
--- a/drivers/net/wireless/marvell/libertas/main.c
|
||||
+++ b/drivers/net/wireless/marvell/libertas/main.c
|
||||
@@ -935,6 +935,7 @@ struct lbs_private *lbs_add_card(void *c
|
||||
goto err_adapter;
|
||||
}
|
||||
|
||||
+ dev_net_set(dev, wiphy_net(wdev->wiphy));
|
||||
dev->ieee80211_ptr = wdev;
|
||||
dev->ml_priv = priv;
|
||||
SET_NETDEV_DEV(dev, dmdev);
|
||||
11
mac80211/patches/mwl/802-libertas-set-wireless-macaddr.patch
Normal file
11
mac80211/patches/mwl/802-libertas-set-wireless-macaddr.patch
Normal file
@@ -0,0 +1,11 @@
|
||||
--- a/drivers/net/wireless/marvell/libertas/cfg.c
|
||||
+++ b/drivers/net/wireless/marvell/libertas/cfg.c
|
||||
@@ -2129,6 +2129,8 @@ int lbs_cfg_register(struct lbs_private
|
||||
wdev->wiphy->n_cipher_suites = ARRAY_SIZE(cipher_suites);
|
||||
wdev->wiphy->reg_notifier = lbs_reg_notifier;
|
||||
|
||||
+ memcpy(wdev->wiphy->perm_addr, priv->current_addr, ETH_ALEN);
|
||||
+
|
||||
ret = wiphy_register(wdev->wiphy);
|
||||
if (ret < 0)
|
||||
pr_err("cannot register wiphy device\n");
|
||||
@@ -0,0 +1,20 @@
|
||||
--- a/drivers/net/wireless/marvell/mwl8k.c
|
||||
+++ b/drivers/net/wireless/marvell/mwl8k.c
|
||||
@@ -6279,6 +6279,8 @@ static int mwl8k_probe(struct pci_dev *p
|
||||
|
||||
priv->running_bsses = 0;
|
||||
|
||||
+ wait_for_completion(&priv->firmware_loading_complete);
|
||||
+
|
||||
return rc;
|
||||
|
||||
err_stop_firmware:
|
||||
@@ -6312,8 +6314,6 @@ static void mwl8k_remove(struct pci_dev
|
||||
return;
|
||||
priv = hw->priv;
|
||||
|
||||
- wait_for_completion(&priv->firmware_loading_complete);
|
||||
-
|
||||
if (priv->fw_state == FW_STATE_ERROR) {
|
||||
mwl8k_hw_reset(priv);
|
||||
goto unmap;
|
||||
@@ -0,0 +1,51 @@
|
||||
From patchwork Thu Dec 27 14:05:26 2018
|
||||
Content-Type: text/plain; charset="utf-8"
|
||||
MIME-Version: 1.0
|
||||
Content-Transfer-Encoding: 8bit
|
||||
X-Patchwork-Submitter: Tom Psyborg <pozega.tomislav@gmail.com>
|
||||
X-Patchwork-Id: 10743707
|
||||
X-Patchwork-Delegate: kvalo@adurom.com
|
||||
From: =?utf-8?q?Tomislav_Po=C5=BEega?= <pozega.tomislav@gmail.com>
|
||||
To: linux-wireless@vger.kernel.org
|
||||
Cc: kvalo@codeaurora.org, hauke@hauke-m.de, nbd@nbd.name,
|
||||
john@phrozen.org, sgruszka@redhat.com, daniel@makrotopia.org
|
||||
Subject: [PATCH 2/2] rt2x00: define RF5592 in init_eeprom routine
|
||||
Date: Thu, 27 Dec 2018 15:05:26 +0100
|
||||
Message-Id: <1545919526-4074-2-git-send-email-pozega.tomislav@gmail.com>
|
||||
X-Mailer: git-send-email 1.7.0.4
|
||||
In-Reply-To: <1545919526-4074-1-git-send-email-pozega.tomislav@gmail.com>
|
||||
References: <1545919526-4074-1-git-send-email-pozega.tomislav@gmail.com>
|
||||
MIME-Version: 1.0
|
||||
Sender: linux-wireless-owner@vger.kernel.org
|
||||
Precedence: bulk
|
||||
List-ID: <linux-wireless.vger.kernel.org>
|
||||
X-Mailing-List: linux-wireless@vger.kernel.org
|
||||
X-Virus-Scanned: ClamAV using ClamSMTP
|
||||
|
||||
This patch fixes following crash on Linksys EA2750 during 5GHz wifi
|
||||
init:
|
||||
|
||||
[ 7.955153] rt2800pci 0000:01:00.0: card - bus=0x1, slot = 0x0 irq=4
|
||||
[ 7.962259] rt2800pci 0000:01:00.0: loaded eeprom from mtd device "Factory"
|
||||
[ 7.969435] ieee80211 phy0: rt2x00_set_rt: Info - RT chipset 5592, rev 0222 detected
|
||||
[ 7.977348] ieee80211 phy0: rt2800_init_eeprom: Error - Invalid RF chipset 0x0000 detected
|
||||
[ 7.985793] ieee80211 phy0: rt2x00lib_probe_dev: Error - Failed to allocate device
|
||||
[ 7.993569] CPU 0 Unable to handle kernel paging request at virtual address 00000024, epc == 800c8f54, ra == 80249ff8
|
||||
[ 8.004408] Oops[#1]:
|
||||
|
||||
Signed-off-by: Tomislav Požega <pozega.tomislav@gmail.com>
|
||||
---
|
||||
drivers/net/wireless/ralink/rt2x00/rt2800lib.c | 2 ++
|
||||
1 files changed, 2 insertions(+), 0 deletions(-)
|
||||
|
||||
--- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
|
||||
+++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
|
||||
@@ -9416,6 +9416,8 @@ static int rt2800_init_eeprom(struct rt2
|
||||
rf = RF3853;
|
||||
else if (rt2x00_rt(rt2x00dev, RT5350))
|
||||
rf = RF5350;
|
||||
+ else if (rt2x00_rt(rt2x00dev, RT5592))
|
||||
+ rf = RF5592;
|
||||
else
|
||||
rf = rt2x00_get_field16(eeprom, EEPROM_NIC_CONF0_RF_TYPE);
|
||||
|
||||
47
mac80211/patches/rt2x00/100-rt2x00_options.patch
Normal file
47
mac80211/patches/rt2x00/100-rt2x00_options.patch
Normal file
@@ -0,0 +1,47 @@
|
||||
--- a/drivers/net/wireless/ralink/rt2x00/Kconfig
|
||||
+++ b/drivers/net/wireless/ralink/rt2x00/Kconfig
|
||||
@@ -226,36 +226,37 @@ config RT2800SOC
|
||||
|
||||
|
||||
config RT2800_LIB
|
||||
- tristate
|
||||
+ tristate "RT2800 USB/PCI support"
|
||||
depends on m
|
||||
|
||||
config RT2800_LIB_MMIO
|
||||
- tristate
|
||||
+ tristate "RT2800 MMIO support"
|
||||
depends on m
|
||||
select RT2X00_LIB_MMIO
|
||||
select RT2800_LIB
|
||||
|
||||
config RT2X00_LIB_MMIO
|
||||
- tristate
|
||||
+ tristate "RT2x00 MMIO support"
|
||||
depends on m
|
||||
|
||||
config RT2X00_LIB_PCI
|
||||
- tristate
|
||||
+ tristate "RT2x00 PCI support"
|
||||
depends on m
|
||||
select RT2X00_LIB
|
||||
|
||||
config RT2X00_LIB_SOC
|
||||
- tristate
|
||||
+ tristate "RT2x00 SoC support"
|
||||
+ depends on SOC_RT288X || SOC_RT305X || SOC_MT7620
|
||||
depends on m
|
||||
select RT2X00_LIB
|
||||
|
||||
config RT2X00_LIB_USB
|
||||
- tristate
|
||||
+ tristate "RT2x00 USB support"
|
||||
depends on m
|
||||
select RT2X00_LIB
|
||||
|
||||
config RT2X00_LIB
|
||||
- tristate
|
||||
+ tristate "RT2x00 support"
|
||||
depends on m
|
||||
|
||||
config RT2X00_LIB_FIRMWARE
|
||||
@@ -0,0 +1,30 @@
|
||||
From 91094ed065f7794886b4a5490fd6de942f036bb4 Mon Sep 17 00:00:00 2001
|
||||
From: Gabor Juhos <juhosg@openwrt.org>
|
||||
Date: Sun, 24 Mar 2013 19:26:26 +0100
|
||||
Subject: [PATCH] rt2x00: allow to build rt2800soc module for RT3883
|
||||
|
||||
Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
|
||||
---
|
||||
drivers/net/wireless/ralink/rt2x00/Kconfig | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
--- a/drivers/net/wireless/ralink/rt2x00/Kconfig
|
||||
+++ b/drivers/net/wireless/ralink/rt2x00/Kconfig
|
||||
@@ -211,7 +211,7 @@ endif
|
||||
config RT2800SOC
|
||||
tristate "Ralink WiSoC support"
|
||||
depends on m
|
||||
- depends on SOC_RT288X || SOC_RT305X || SOC_MT7620
|
||||
+ depends on SOC_RT288X || SOC_RT305X || SOC_RT3883 || SOC_MT7620
|
||||
select RT2X00_LIB_SOC
|
||||
select RT2X00_LIB_MMIO
|
||||
select RT2X00_LIB_CRYPTO
|
||||
@@ -246,7 +246,7 @@ config RT2X00_LIB_PCI
|
||||
|
||||
config RT2X00_LIB_SOC
|
||||
tristate "RT2x00 SoC support"
|
||||
- depends on SOC_RT288X || SOC_RT305X || SOC_MT7620
|
||||
+ depends on SOC_RT288X || SOC_RT305X || SOC_RT3883 || SOC_MT7620
|
||||
depends on m
|
||||
select RT2X00_LIB
|
||||
|
||||
@@ -0,0 +1,32 @@
|
||||
--- /dev/null
|
||||
+++ b/include/linux/rt2x00_platform.h
|
||||
@@ -0,0 +1,19 @@
|
||||
+/*
|
||||
+ * Platform data definition for the rt2x00 driver
|
||||
+ *
|
||||
+ * Copyright (C) 2011 Gabor Juhos <juhosg@openwrt.org>
|
||||
+ *
|
||||
+ * This program is free software; you can redistribute it and/or modify it
|
||||
+ * under the terms of the GNU General Public License version 2 as published
|
||||
+ * by the Free Software Foundation.
|
||||
+ *
|
||||
+ */
|
||||
+
|
||||
+#ifndef _RT2X00_PLATFORM_H
|
||||
+#define _RT2X00_PLATFORM_H
|
||||
+
|
||||
+struct rt2x00_platform_data {
|
||||
+ char *eeprom_file_name;
|
||||
+};
|
||||
+
|
||||
+#endif /* _RT2X00_PLATFORM_H */
|
||||
--- a/drivers/net/wireless/ralink/rt2x00/rt2x00.h
|
||||
+++ b/drivers/net/wireless/ralink/rt2x00/rt2x00.h
|
||||
@@ -28,6 +28,7 @@
|
||||
#include <linux/average.h>
|
||||
#include <linux/usb.h>
|
||||
#include <linux/clk.h>
|
||||
+#include <linux/rt2x00_platform.h>
|
||||
|
||||
#include <net/mac80211.h>
|
||||
|
||||
296
mac80211/patches/rt2x00/602-rt2x00-introduce-rt2x00eeprom.patch
Normal file
296
mac80211/patches/rt2x00/602-rt2x00-introduce-rt2x00eeprom.patch
Normal file
@@ -0,0 +1,296 @@
|
||||
--- a/local-symbols
|
||||
+++ b/local-symbols
|
||||
@@ -321,6 +321,7 @@ RT2X00_LIB_FIRMWARE=
|
||||
RT2X00_LIB_CRYPTO=
|
||||
RT2X00_LIB_LEDS=
|
||||
RT2X00_LIB_DEBUGFS=
|
||||
+RT2X00_LIB_EEPROM=
|
||||
RT2X00_DEBUG=
|
||||
WLAN_VENDOR_REALTEK=
|
||||
RTL8180=
|
||||
--- a/drivers/net/wireless/ralink/rt2x00/Kconfig
|
||||
+++ b/drivers/net/wireless/ralink/rt2x00/Kconfig
|
||||
@@ -70,6 +70,7 @@ config RT2800PCI
|
||||
select RT2X00_LIB_MMIO
|
||||
select RT2X00_LIB_PCI
|
||||
select RT2X00_LIB_FIRMWARE
|
||||
+ select RT2X00_LIB_EEPROM
|
||||
select RT2X00_LIB_CRYPTO
|
||||
depends on CRC_CCITT
|
||||
depends on EEPROM_93CX6
|
||||
@@ -216,6 +217,7 @@ config RT2800SOC
|
||||
select RT2X00_LIB_MMIO
|
||||
select RT2X00_LIB_CRYPTO
|
||||
select RT2X00_LIB_FIRMWARE
|
||||
+ select RT2X00_LIB_EEPROM
|
||||
select RT2800_LIB
|
||||
select RT2800_LIB_MMIO
|
||||
help
|
||||
@@ -266,6 +268,9 @@ config RT2X00_LIB_FIRMWARE
|
||||
config RT2X00_LIB_CRYPTO
|
||||
bool
|
||||
|
||||
+config RT2X00_LIB_EEPROM
|
||||
+ bool
|
||||
+
|
||||
config RT2X00_LIB_LEDS
|
||||
bool
|
||||
default y if (RT2X00_LIB=y && LEDS_CLASS=y) || (RT2X00_LIB=m && LEDS_CLASS!=n)
|
||||
--- a/drivers/net/wireless/ralink/rt2x00/Makefile
|
||||
+++ b/drivers/net/wireless/ralink/rt2x00/Makefile
|
||||
@@ -8,6 +8,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-$(CPTCFG_RT2X00_LIB) += rt2x00lib.o
|
||||
obj-$(CPTCFG_RT2X00_LIB_MMIO) += rt2x00mmio.o
|
||||
--- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.h
|
||||
+++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.h
|
||||
@@ -37,6 +37,8 @@ struct rt2800_drv_data {
|
||||
struct ieee80211_sta *wcid_to_sta[STA_IDS_SIZE];
|
||||
};
|
||||
|
||||
+#include "rt2800.h"
|
||||
+
|
||||
struct rt2800_ops {
|
||||
u32 (*register_read)(struct rt2x00_dev *rt2x00dev,
|
||||
const unsigned int offset);
|
||||
@@ -135,6 +137,15 @@ static inline int rt2800_read_eeprom(str
|
||||
{
|
||||
const struct rt2800_ops *rt2800ops = rt2x00dev->ops->drv;
|
||||
|
||||
+ if (rt2x00dev->eeprom_file) {
|
||||
+ memcpy(rt2x00dev->eeprom, rt2x00dev->eeprom_file->data,
|
||||
+ EEPROM_SIZE);
|
||||
+ return 0;
|
||||
+ }
|
||||
+
|
||||
+ if (!rt2800ops->read_eeprom)
|
||||
+ return -EINVAL;
|
||||
+
|
||||
return rt2800ops->read_eeprom(rt2x00dev);
|
||||
}
|
||||
|
||||
--- a/drivers/net/wireless/ralink/rt2x00/rt2800soc.c
|
||||
+++ b/drivers/net/wireless/ralink/rt2x00/rt2800soc.c
|
||||
@@ -90,19 +90,6 @@ static int rt2800soc_set_device_state(st
|
||||
return retval;
|
||||
}
|
||||
|
||||
-static int rt2800soc_read_eeprom(struct rt2x00_dev *rt2x00dev)
|
||||
-{
|
||||
- void __iomem *base_addr = ioremap(0x1F040000, EEPROM_SIZE);
|
||||
-
|
||||
- if (!base_addr)
|
||||
- return -ENOMEM;
|
||||
-
|
||||
- memcpy_fromio(rt2x00dev->eeprom, base_addr, EEPROM_SIZE);
|
||||
-
|
||||
- iounmap(base_addr);
|
||||
- return 0;
|
||||
-}
|
||||
-
|
||||
/* Firmware functions */
|
||||
static char *rt2800soc_get_firmware_name(struct rt2x00_dev *rt2x00dev)
|
||||
{
|
||||
@@ -167,7 +154,6 @@ static const struct rt2800_ops rt2800soc
|
||||
.register_multiread = rt2x00mmio_register_multiread,
|
||||
.register_multiwrite = rt2x00mmio_register_multiwrite,
|
||||
.regbusy_read = rt2x00mmio_regbusy_read,
|
||||
- .read_eeprom = rt2800soc_read_eeprom,
|
||||
.hwcrypt_disabled = rt2800soc_hwcrypt_disabled,
|
||||
.drv_write_firmware = rt2800soc_write_firmware,
|
||||
.drv_init_registers = rt2800mmio_init_registers,
|
||||
--- a/drivers/net/wireless/ralink/rt2x00/rt2x00.h
|
||||
+++ b/drivers/net/wireless/ralink/rt2x00/rt2x00.h
|
||||
@@ -694,6 +694,7 @@ enum rt2x00_capability_flags {
|
||||
REQUIRE_HT_TX_DESC,
|
||||
REQUIRE_PS_AUTOWAKE,
|
||||
REQUIRE_DELAYED_RFKILL,
|
||||
+ REQUIRE_EEPROM_FILE,
|
||||
|
||||
/*
|
||||
* Capabilities
|
||||
@@ -970,6 +971,11 @@ struct rt2x00_dev {
|
||||
const struct firmware *fw;
|
||||
|
||||
/*
|
||||
+ * EEPROM image.
|
||||
+ */
|
||||
+ const struct firmware *eeprom_file;
|
||||
+
|
||||
+ /*
|
||||
* FIFO for storing tx status reports between isr and tasklet.
|
||||
*/
|
||||
DECLARE_KFIFO_PTR(txstatus_fifo, u32);
|
||||
--- a/drivers/net/wireless/ralink/rt2x00/rt2x00dev.c
|
||||
+++ b/drivers/net/wireless/ralink/rt2x00/rt2x00dev.c
|
||||
@@ -1407,6 +1407,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;
|
||||
+
|
||||
/*
|
||||
* Let the driver probe the device to detect the capabilities.
|
||||
*/
|
||||
@@ -1550,6 +1554,11 @@ void rt2x00lib_remove_dev(struct rt2x00_
|
||||
* Free the driver data.
|
||||
*/
|
||||
kfree(rt2x00dev->drv_data);
|
||||
+
|
||||
+ /*
|
||||
+ * Free EEPROM image.
|
||||
+ */
|
||||
+ rt2x00lib_free_eeprom_file(rt2x00dev);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(rt2x00lib_remove_dev);
|
||||
|
||||
--- /dev/null
|
||||
+++ b/drivers/net/wireless/ralink/rt2x00/rt2x00eeprom.c
|
||||
@@ -0,0 +1,106 @@
|
||||
+/*
|
||||
+ Copyright (C) 2004 - 2009 Ivo van Doorn <IvDoorn@gmail.com>
|
||||
+ Copyright (C) 2004 - 2009 Gertjan van Wingerde <gwingerde@gmail.com>
|
||||
+ <http://rt2x00.serialmonkey.com>
|
||||
+
|
||||
+ This program is free software; you can redistribute it and/or modify
|
||||
+ it under the terms of the GNU General Public License as published by
|
||||
+ the Free Software Foundation; either version 2 of the License, or
|
||||
+ (at your option) any later version.
|
||||
+
|
||||
+ This program is distributed in the hope that it will be useful,
|
||||
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
+ GNU General Public License for more details.
|
||||
+
|
||||
+ You should have received a copy of the GNU General Public License
|
||||
+ along with this program; if not, write to the
|
||||
+ Free Software Foundation, Inc.,
|
||||
+ 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
+ */
|
||||
+
|
||||
+/*
|
||||
+ Module: rt2x00lib
|
||||
+ Abstract: rt2x00 eeprom file loading routines.
|
||||
+ */
|
||||
+
|
||||
+#include <linux/kernel.h>
|
||||
+#include <linux/module.h>
|
||||
+
|
||||
+#include "rt2x00.h"
|
||||
+#include "rt2x00lib.h"
|
||||
+
|
||||
+static const char *
|
||||
+rt2x00lib_get_eeprom_file_name(struct rt2x00_dev *rt2x00dev)
|
||||
+{
|
||||
+ struct rt2x00_platform_data *pdata = rt2x00dev->dev->platform_data;
|
||||
+
|
||||
+ if (pdata && pdata->eeprom_file_name)
|
||||
+ return pdata->eeprom_file_name;
|
||||
+
|
||||
+ return NULL
|
||||
+}
|
||||
+
|
||||
+static int rt2x00lib_request_eeprom_file(struct rt2x00_dev *rt2x00dev)
|
||||
+{
|
||||
+ const struct firmware *ee;
|
||||
+ const char *ee_name;
|
||||
+ int retval;
|
||||
+
|
||||
+ ee_name = rt2x00lib_get_eeprom_file_name(rt2x00dev);
|
||||
+ if (!ee_name && test_bit(REQUIRE_EEPROM_FILE, &rt2x00dev->cap_flags)) {
|
||||
+ rt2x00_err(rt2x00dev, "Required EEPROM name is missing.");
|
||||
+ return -EINVAL;
|
||||
+ }
|
||||
+
|
||||
+ if (!ee_name)
|
||||
+ return 0;
|
||||
+
|
||||
+ rt2x00_info(rt2x00dev, "Loading EEPROM data from '%s'.\n", ee_name);
|
||||
+
|
||||
+ retval = request_firmware(&ee, ee_name, rt2x00dev->dev);
|
||||
+ if (retval) {
|
||||
+ rt2x00_err(rt2x00dev, "Failed to request EEPROM.\n");
|
||||
+ return retval;
|
||||
+ }
|
||||
+
|
||||
+ if (!ee || !ee->size || !ee->data) {
|
||||
+ rt2x00_err(rt2x00dev, "Failed to read EEPROM file.\n");
|
||||
+ retval = -ENOENT;
|
||||
+ goto err_exit;
|
||||
+ }
|
||||
+
|
||||
+ if (ee->size != 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;
|
||||
+ }
|
||||
+
|
||||
+ rt2x00dev->eeprom_file = ee;
|
||||
+ return 0;
|
||||
+
|
||||
+err_release_ee:
|
||||
+ release_firmware(ee);
|
||||
+err_exit:
|
||||
+ return retval;
|
||||
+}
|
||||
+
|
||||
+int rt2x00lib_load_eeprom_file(struct rt2x00_dev *rt2x00dev)
|
||||
+{
|
||||
+ int retval;
|
||||
+
|
||||
+ retval = rt2x00lib_request_eeprom_file(rt2x00dev);
|
||||
+ if (retval)
|
||||
+ return retval;
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+void rt2x00lib_free_eeprom_file(struct rt2x00_dev *rt2x00dev)
|
||||
+{
|
||||
+ if (rt2x00dev->eeprom_file && rt2x00dev->eeprom_file->size)
|
||||
+ release_firmware(rt2x00dev->eeprom_file);
|
||||
+ rt2x00dev->eeprom_file = NULL;
|
||||
+}
|
||||
--- a/drivers/net/wireless/ralink/rt2x00/rt2x00lib.h
|
||||
+++ b/drivers/net/wireless/ralink/rt2x00/rt2x00lib.h
|
||||
@@ -286,6 +286,22 @@ static inline void rt2x00lib_free_firmwa
|
||||
#endif /* CPTCFG_RT2X00_LIB_FIRMWARE */
|
||||
|
||||
/*
|
||||
+ * EEPROM file handlers.
|
||||
+ */
|
||||
+#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 int rt2x00lib_load_eeprom_file(struct rt2x00_dev *rt2x00dev)
|
||||
+{
|
||||
+ return 0;
|
||||
+}
|
||||
+static inline void rt2x00lib_free_eeprom_file(struct rt2x00_dev *rt2x00dev)
|
||||
+{
|
||||
+}
|
||||
+#endif /* CPTCFG_RT2X00_LIB_EEPROM */
|
||||
+
|
||||
+/*
|
||||
* Debugfs handlers.
|
||||
*/
|
||||
#ifdef CPTCFG_RT2X00_LIB_DEBUGFS
|
||||
--- a/drivers/net/wireless/ralink/rt2x00/rt2x00soc.c
|
||||
+++ b/drivers/net/wireless/ralink/rt2x00/rt2x00soc.c
|
||||
@@ -86,6 +86,7 @@ int rt2x00soc_probe(struct platform_devi
|
||||
if (IS_ERR(rt2x00dev->clk))
|
||||
rt2x00dev->clk = NULL;
|
||||
|
||||
+ set_bit(REQUIRE_EEPROM_FILE, &rt2x00dev->cap_flags);
|
||||
rt2x00_set_chip_intf(rt2x00dev, RT2X00_CHIP_INTF_SOC);
|
||||
|
||||
retval = rt2x00soc_alloc_reg(rt2x00dev);
|
||||
@@ -0,0 +1,33 @@
|
||||
--- a/drivers/net/wireless/ralink/rt2x00/rt2x00eeprom.c
|
||||
+++ b/drivers/net/wireless/ralink/rt2x00/rt2x00eeprom.c
|
||||
@@ -26,6 +26,7 @@
|
||||
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/module.h>
|
||||
+#include <linux/of.h>
|
||||
|
||||
#include "rt2x00.h"
|
||||
#include "rt2x00lib.h"
|
||||
@@ -34,11 +35,21 @@ static const char *
|
||||
rt2x00lib_get_eeprom_file_name(struct rt2x00_dev *rt2x00dev)
|
||||
{
|
||||
struct rt2x00_platform_data *pdata = rt2x00dev->dev->platform_data;
|
||||
+#ifdef CONFIG_OF
|
||||
+ struct device_node *np;
|
||||
+ const char *eep;
|
||||
+#endif
|
||||
|
||||
if (pdata && pdata->eeprom_file_name)
|
||||
return pdata->eeprom_file_name;
|
||||
|
||||
- return NULL
|
||||
+#ifdef CONFIG_OF
|
||||
+ np = rt2x00dev->dev->of_node;
|
||||
+ if (np && of_property_read_string(np, "ralink,eeprom", &eep) == 0)
|
||||
+ return eep;
|
||||
+#endif
|
||||
+
|
||||
+ return NULL;
|
||||
}
|
||||
|
||||
static int rt2x00lib_request_eeprom_file(struct rt2x00_dev *rt2x00dev)
|
||||
@@ -0,0 +1,113 @@
|
||||
From 339fe73f340161a624cc08e738d2244814852c3e Mon Sep 17 00:00:00 2001
|
||||
From: John Crispin <blogic@openwrt.org>
|
||||
Date: Sun, 17 Mar 2013 00:55:04 +0100
|
||||
Subject: [PATCH] rt2x00: load eeprom on SoC from a mtd device defines inside
|
||||
OF
|
||||
|
||||
Signed-off-by: John Crispin <blogic@openwrt.org>
|
||||
---
|
||||
drivers/net/wireless/ralink/rt2x00/Kconfig | 1 +
|
||||
drivers/net/wireless/ralink/rt2x00/rt2x00eeprom.c | 65 +++++++++++++++++++++++
|
||||
2 files changed, 66 insertions(+)
|
||||
|
||||
--- a/drivers/net/wireless/ralink/rt2x00/Kconfig
|
||||
+++ b/drivers/net/wireless/ralink/rt2x00/Kconfig
|
||||
@@ -220,6 +220,7 @@ config RT2800SOC
|
||||
select RT2X00_LIB_EEPROM
|
||||
select RT2800_LIB
|
||||
select RT2800_LIB_MMIO
|
||||
+ select MTD if SOC_RT288X || SOC_RT305X
|
||||
help
|
||||
This adds support for Ralink WiSoC devices.
|
||||
Supported chips: RT2880, RT3050, RT3052, RT3350, RT3352.
|
||||
--- a/drivers/net/wireless/ralink/rt2x00/rt2x00eeprom.c
|
||||
+++ b/drivers/net/wireless/ralink/rt2x00/rt2x00eeprom.c
|
||||
@@ -26,11 +26,76 @@
|
||||
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/module.h>
|
||||
+#if IS_ENABLED(CONFIG_MTD)
|
||||
+#include <linux/mtd/mtd.h>
|
||||
+#include <linux/mtd/partitions.h>
|
||||
+#endif
|
||||
#include <linux/of.h>
|
||||
|
||||
#include "rt2x00.h"
|
||||
#include "rt2x00lib.h"
|
||||
|
||||
+#if IS_ENABLED(CONFIG_MTD)
|
||||
+static int rt2800lib_read_eeprom_mtd(struct rt2x00_dev *rt2x00dev)
|
||||
+{
|
||||
+ int ret = -EINVAL;
|
||||
+#ifdef CONFIG_OF
|
||||
+ static struct firmware mtd_fw;
|
||||
+ struct device_node *np = rt2x00dev->dev->of_node, *mtd_np = NULL;
|
||||
+ size_t retlen, len = rt2x00dev->ops->eeprom_size;
|
||||
+ int i, size, offset = 0;
|
||||
+ struct mtd_info *mtd;
|
||||
+ const char *part;
|
||||
+ const __be32 *list;
|
||||
+ phandle phandle;
|
||||
+
|
||||
+ list = of_get_property(np, "ralink,mtd-eeprom", &size);
|
||||
+ if (!list)
|
||||
+ return -ENOENT;
|
||||
+
|
||||
+ phandle = be32_to_cpup(list++);
|
||||
+ if (phandle)
|
||||
+ mtd_np = of_find_node_by_phandle(phandle);
|
||||
+ if (!mtd_np) {
|
||||
+ dev_err(rt2x00dev->dev, "failed to load mtd phandle\n");
|
||||
+ return -EINVAL;
|
||||
+ }
|
||||
+
|
||||
+ part = of_get_property(mtd_np, "label", NULL);
|
||||
+ if (!part)
|
||||
+ part = mtd_np->name;
|
||||
+
|
||||
+ mtd = get_mtd_device_nm(part);
|
||||
+ if (IS_ERR(mtd)) {
|
||||
+ dev_err(rt2x00dev->dev, "failed to get mtd device \"%s\"\n", part);
|
||||
+ return PTR_ERR(mtd);
|
||||
+ }
|
||||
+
|
||||
+ if (size > sizeof(*list))
|
||||
+ offset = be32_to_cpup(list);
|
||||
+
|
||||
+ ret = mtd_read(mtd, offset, len, &retlen, (u_char *) rt2x00dev->eeprom);
|
||||
+ put_mtd_device(mtd);
|
||||
+
|
||||
+ if ((retlen != rt2x00dev->ops->eeprom_size) || ret) {
|
||||
+ dev_err(rt2x00dev->dev, "failed to load eeprom from device \"%s\"\n", part);
|
||||
+ return ret;
|
||||
+ }
|
||||
+
|
||||
+ if (of_find_property(np, "ralink,mtd-eeprom-swap", NULL))
|
||||
+ for (i = 0; i < len/sizeof(u16); i++)
|
||||
+ rt2x00dev->eeprom[i] = swab16(rt2x00dev->eeprom[i]);
|
||||
+
|
||||
+ rt2x00dev->eeprom_file = &mtd_fw;
|
||||
+ mtd_fw.data = (const u8 *) rt2x00dev->eeprom;
|
||||
+
|
||||
+ dev_info(rt2x00dev->dev, "loaded eeprom from mtd device \"%s\"\n", part);
|
||||
+#endif
|
||||
+
|
||||
+ return ret;
|
||||
+}
|
||||
+#endif
|
||||
+
|
||||
static const char *
|
||||
rt2x00lib_get_eeprom_file_name(struct rt2x00_dev *rt2x00dev)
|
||||
{
|
||||
@@ -58,6 +123,11 @@ static int rt2x00lib_request_eeprom_file
|
||||
const char *ee_name;
|
||||
int retval;
|
||||
|
||||
+#if IS_ENABLED(CONFIG_MTD)
|
||||
+ if (!rt2800lib_read_eeprom_mtd(rt2x00dev))
|
||||
+ return 0;
|
||||
+#endif
|
||||
+
|
||||
ee_name = rt2x00lib_get_eeprom_file_name(rt2x00dev);
|
||||
if (!ee_name && test_bit(REQUIRE_EEPROM_FILE, &rt2x00dev->cap_flags)) {
|
||||
rt2x00_err(rt2x00dev, "Required EEPROM name is missing.");
|
||||
@@ -0,0 +1,47 @@
|
||||
--- a/include/linux/rt2x00_platform.h
|
||||
+++ b/include/linux/rt2x00_platform.h
|
||||
@@ -14,6 +14,9 @@
|
||||
|
||||
struct rt2x00_platform_data {
|
||||
char *eeprom_file_name;
|
||||
+
|
||||
+ int disable_2ghz;
|
||||
+ int disable_5ghz;
|
||||
};
|
||||
|
||||
#endif /* _RT2X00_PLATFORM_H */
|
||||
--- a/drivers/net/wireless/ralink/rt2x00/rt2x00dev.c
|
||||
+++ b/drivers/net/wireless/ralink/rt2x00/rt2x00dev.c
|
||||
@@ -1012,6 +1012,22 @@ static int rt2x00lib_probe_hw_modes(stru
|
||||
unsigned int num_rates;
|
||||
unsigned int i;
|
||||
|
||||
+ if (rt2x00dev->dev->platform_data) {
|
||||
+ struct rt2x00_platform_data *pdata;
|
||||
+
|
||||
+ pdata = rt2x00dev->dev->platform_data;
|
||||
+ if (pdata->disable_2ghz)
|
||||
+ spec->supported_bands &= ~SUPPORT_BAND_2GHZ;
|
||||
+ if (pdata->disable_5ghz)
|
||||
+ spec->supported_bands &= ~SUPPORT_BAND_5GHZ;
|
||||
+ }
|
||||
+
|
||||
+ if ((spec->supported_bands & SUPPORT_BAND_BOTH) == 0) {
|
||||
+ rt2x00_err(rt2x00dev, "No supported bands\n");
|
||||
+ return -EINVAL;
|
||||
+ }
|
||||
+
|
||||
+
|
||||
num_rates = 0;
|
||||
if (spec->supported_rates & SUPPORT_RATE_CCK)
|
||||
num_rates += 4;
|
||||
--- a/drivers/net/wireless/ralink/rt2x00/rt2x00.h
|
||||
+++ b/drivers/net/wireless/ralink/rt2x00/rt2x00.h
|
||||
@@ -399,6 +399,7 @@ struct hw_mode_spec {
|
||||
unsigned int supported_bands;
|
||||
#define SUPPORT_BAND_2GHZ 0x00000001
|
||||
#define SUPPORT_BAND_5GHZ 0x00000002
|
||||
+#define SUPPORT_BAND_BOTH (SUPPORT_BAND_2GHZ | SUPPORT_BAND_5GHZ)
|
||||
|
||||
unsigned int supported_rates;
|
||||
#define SUPPORT_RATE_CCK 0x00000001
|
||||
@@ -0,0 +1,26 @@
|
||||
--- a/drivers/net/wireless/ralink/rt2x00/rt2x00dev.c
|
||||
+++ b/drivers/net/wireless/ralink/rt2x00/rt2x00dev.c
|
||||
@@ -990,8 +990,13 @@ static void rt2x00lib_rate(struct ieee80
|
||||
|
||||
void rt2x00lib_set_mac_address(struct rt2x00_dev *rt2x00dev, u8 *eeprom_mac_addr)
|
||||
{
|
||||
+ struct rt2x00_platform_data *pdata;
|
||||
const char *mac_addr;
|
||||
|
||||
+ pdata = rt2x00dev->dev->platform_data;
|
||||
+ if (pdata && pdata->mac_address)
|
||||
+ ether_addr_copy(eeprom_mac_addr, pdata->mac_address);
|
||||
+
|
||||
mac_addr = of_get_mac_address(rt2x00dev->dev->of_node);
|
||||
if (!IS_ERR(mac_addr))
|
||||
ether_addr_copy(eeprom_mac_addr, mac_addr);
|
||||
--- a/include/linux/rt2x00_platform.h
|
||||
+++ b/include/linux/rt2x00_platform.h
|
||||
@@ -14,6 +14,7 @@
|
||||
|
||||
struct rt2x00_platform_data {
|
||||
char *eeprom_file_name;
|
||||
+ const u8 *mac_address;
|
||||
|
||||
int disable_2ghz;
|
||||
int disable_5ghz;
|
||||
@@ -0,0 +1,19 @@
|
||||
--- a/drivers/net/wireless/ralink/rt2x00/rt2x00dev.c
|
||||
+++ b/drivers/net/wireless/ralink/rt2x00/rt2x00dev.c
|
||||
@@ -1016,6 +1016,16 @@ static int rt2x00lib_probe_hw_modes(stru
|
||||
struct ieee80211_rate *rates;
|
||||
unsigned int num_rates;
|
||||
unsigned int i;
|
||||
+#ifdef CONFIG_OF
|
||||
+ struct device_node *np = rt2x00dev->dev->of_node;
|
||||
+ unsigned int enabled;
|
||||
+ if (!of_property_read_u32(np, "ralink,2ghz",
|
||||
+ &enabled) && !enabled)
|
||||
+ spec->supported_bands &= ~SUPPORT_BAND_2GHZ;
|
||||
+ if (!of_property_read_u32(np, "ralink,5ghz",
|
||||
+ &enabled) && !enabled)
|
||||
+ spec->supported_bands &= ~SUPPORT_BAND_5GHZ;
|
||||
+#endif /* CONFIG_OF */
|
||||
|
||||
if (rt2x00dev->dev->platform_data) {
|
||||
struct rt2x00_platform_data *pdata;
|
||||
@@ -0,0 +1,33 @@
|
||||
From 04dbd87265f6ba4a373b211ba324b437d224fb2d Mon Sep 17 00:00:00 2001
|
||||
From: John Crispin <blogic@openwrt.org>
|
||||
Date: Sun, 17 Mar 2013 00:03:31 +0100
|
||||
Subject: [PATCH 21/38] rt2x00: make wmac loadable via OF on rt288x/305x SoC
|
||||
|
||||
This patch ads the match table to allow loading the wmac support from a
|
||||
devicetree.
|
||||
|
||||
Signed-off-by: John Crispin <blogic@openwrt.org>
|
||||
---
|
||||
drivers/net/wireless/ralink/rt2x00/rt2800pci.c | 7 +++++++
|
||||
1 file changed, 7 insertions(+)
|
||||
|
||||
--- a/drivers/net/wireless/ralink/rt2x00/rt2800soc.c
|
||||
+++ b/drivers/net/wireless/ralink/rt2x00/rt2800soc.c
|
||||
@@ -224,10 +224,17 @@ static int rt2800soc_probe(struct platfo
|
||||
return rt2x00soc_probe(pdev, &rt2800soc_ops);
|
||||
}
|
||||
|
||||
+static const struct of_device_id rt2880_wmac_match[] = {
|
||||
+ { .compatible = "ralink,rt2880-wmac" },
|
||||
+ {},
|
||||
+};
|
||||
+MODULE_DEVICE_TABLE(of, rt2880_wmac_match);
|
||||
+
|
||||
static struct platform_driver rt2800soc_driver = {
|
||||
.driver = {
|
||||
.name = "rt2800_wmac",
|
||||
.mod_name = KBUILD_MODNAME,
|
||||
+ .of_match_table = rt2880_wmac_match,
|
||||
},
|
||||
.probe = rt2800soc_probe,
|
||||
.remove = rt2x00soc_remove,
|
||||
@@ -0,0 +1,40 @@
|
||||
--- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
|
||||
+++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
|
||||
@@ -25,6 +25,7 @@
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/slab.h>
|
||||
+#include <linux/of.h>
|
||||
|
||||
#include "rt2x00.h"
|
||||
#include "rt2800lib.h"
|
||||
@@ -9530,6 +9531,17 @@ static int rt2800_init_eeprom(struct rt2
|
||||
rt2800_init_led(rt2x00dev, &rt2x00dev->led_assoc, LED_TYPE_ASSOC);
|
||||
rt2800_init_led(rt2x00dev, &rt2x00dev->led_qual, LED_TYPE_QUALITY);
|
||||
|
||||
+ {
|
||||
+ struct device_node *np = rt2x00dev->dev->of_node;
|
||||
+ unsigned int led_polarity;
|
||||
+
|
||||
+ /* Allow overriding polarity from OF */
|
||||
+ if (!of_property_read_u32(np, "ralink,led-polarity",
|
||||
+ &led_polarity))
|
||||
+ rt2x00_set_field16(&eeprom, EEPROM_FREQ_LED_POLARITY,
|
||||
+ led_polarity);
|
||||
+ }
|
||||
+
|
||||
rt2x00dev->led_mcu_reg = eeprom;
|
||||
#endif /* CPTCFG_RT2X00_LIB_LEDS */
|
||||
|
||||
--- a/drivers/net/wireless/ralink/rt2x00/rt2x00leds.c
|
||||
+++ b/drivers/net/wireless/ralink/rt2x00/rt2x00leds.c
|
||||
@@ -98,6 +98,9 @@ static int rt2x00leds_register_led(struc
|
||||
led->led_dev.name = name;
|
||||
led->led_dev.brightness = LED_OFF;
|
||||
|
||||
+ if (rt2x00_is_soc(rt2x00dev))
|
||||
+ led->led_dev.brightness_set(&led->led_dev, LED_OFF);
|
||||
+
|
||||
retval = led_classdev_register(device, &led->led_dev);
|
||||
if (retval) {
|
||||
rt2x00_err(rt2x00dev, "Failed to register led handler\n");
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user