同步更新
This commit is contained in:
398
Makefile
Normal file
398
Makefile
Normal file
@@ -0,0 +1,398 @@
|
||||
#
|
||||
# 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:=6.16
|
||||
PKG_RELEASE:=1
|
||||
PKG_LICENSE:=GPL-2.0-only
|
||||
PKG_LICENSE_FILES:=COPYING
|
||||
|
||||
PKG_SOURCE_URL:=@OPENWRT
|
||||
PKG_HASH:=67f11320509dd18e5e2c58cb81e9f6c7d19b09f5229baa5880ed4dab71c19052
|
||||
|
||||
PKG_SOURCE:=backports-$(PKG_VERSION).tar.xz
|
||||
PKG_BUILD_DIR:=$(KERNEL_BUILD_DIR)/$(if $(BUILD_VARIANT),$(PKG_NAME)-$(BUILD_VARIANT)/)backports-$(PKG_VERSION)
|
||||
PKG_BUILD_PARALLEL:=1
|
||||
|
||||
PKG_MAINTAINER:=Felix Fietkau <nbd@nbd.name>
|
||||
|
||||
PKG_DRIVERS = \
|
||||
mac80211-hwsim \
|
||||
mt7601u \
|
||||
rsi91x rsi91x-usb rsi91x-sdio\
|
||||
wlcore wl12xx wl18xx
|
||||
|
||||
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_pacakge:
|
||||
# 1 = OpenWrt KernelPackage name
|
||||
# 2 = Optional list of variants for which the module may be selected:
|
||||
# If empty, the module is only selected with the first variant
|
||||
# Use $(ALL_VARIANTS) to allow module selection in all variants
|
||||
config_package=$(if $(and $(CONFIG_PACKAGE_kmod-$(1)),$(call mac80211_variant_check,$(2))),m)
|
||||
mac80211_variant_check=$(if $(ALL_VARIANTS),$(filter $(BUILD_VARIANT),$(if $(1),$(1),$(firstword $(ALL_VARIANTS)))),y)
|
||||
|
||||
config-y:= \
|
||||
WLAN \
|
||||
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,$(ALL_VARIANTS)) += CFG80211
|
||||
config-$(CONFIG_PACKAGE_CFG80211_TESTMODE) += NL80211_TESTMODE
|
||||
|
||||
config-$(call config_package,mac80211,$(ALL_VARIANTS)) += 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 += \
|
||||
CONFIG_WIFI_SCRIPTS_UCODE \
|
||||
$(patsubst %,CONFIG_PACKAGE_kmod-%,$(PKG_DRIVERS))
|
||||
|
||||
define KernelPackage/cfg80211
|
||||
$(call KernelPackage/mac80211/Default)
|
||||
TITLE:=cfg80211 - wireless configuration API
|
||||
DEPENDS+= +iw +!WIFI_SCRIPTS_UCODE:iwinfo +wifi-scripts +wireless-regdb +USE_RFKILL:kmod-rfkill
|
||||
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 +kmod-crypto-cmac +kmod-crypto-ccm +kmod-crypto-gcm +hostapd-common
|
||||
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/mac80211-hwsim
|
||||
$(call KernelPackage/mac80211/Default)
|
||||
TITLE:=mac80211 HW simulation device
|
||||
DEPENDS+= +kmod-mac80211 +@DRIVER_11BE_SUPPORT +@DRIVER_11AX_SUPPORT +@DRIVER_11AC_SUPPORT
|
||||
FILES:=$(PKG_BUILD_DIR)/drivers/net/wireless/virtual/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 @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/rsi91x
|
||||
$(call KernelPackage/mac80211/Default)
|
||||
TITLE:=Redpine Signals Inc 91x WLAN driver support
|
||||
DEPENDS+= +kmod-mac80211 +rs9113-firmware
|
||||
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
|
||||
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
|
||||
|
||||
|
||||
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,mac80211-hwsim) += MAC80211_HWSIM
|
||||
config-$(call config_package,mt7601u) += MT7601U
|
||||
config-y += WL_MEDIATEK
|
||||
|
||||
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,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
|
||||
|
||||
C_DEFINES=
|
||||
|
||||
ifeq ($(BUILD_VARIANT),smallbuffers)
|
||||
C_DEFINES+= -DCONFIG_ATH10K_SMALLBUFFERS
|
||||
endif
|
||||
|
||||
MAKE_OPTS:= \
|
||||
$(subst -C $(LINUX_DIR),-C "$(PKG_BUILD_DIR)",$(KERNEL_MAKEOPTS)) \
|
||||
EXTRA_CFLAGS="-I$(PKG_BUILD_DIR)/include $(IREMAP_CFLAGS) $(C_DEFINES)" \
|
||||
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)
|
||||
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/mhi.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),)
|
||||
define Build/Compile/kmod
|
||||
rm -rf $(PKG_BUILD_DIR)/modules
|
||||
+$(MAKE) $(PKG_JOBS) $(MAKE_OPTS) modules
|
||||
endef
|
||||
endif
|
||||
|
||||
#do not Build/Configure for EXTERNAL KERNEL
|
||||
ifeq ($(strip $(CONFIG_EXTERNAL_KERNEL_TREE)),"")
|
||||
ifeq ($(strip $(CONFIG_KERNEL_GIT_CLONE_URI)),"")
|
||||
define Build/Configure
|
||||
cmp $(PKG_BUILD_DIR)/include/linux/ath5k_platform.h $(LINUX_DIR)/include/linux/ath5k_platform.h
|
||||
endef
|
||||
endif
|
||||
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)/ath5k,ath5k/)
|
||||
$(call PatchDir,$(PKG_BUILD_DIR),$(PATCH_DIR)/ath9k,ath9k/)
|
||||
$(call PatchDir,$(PKG_BUILD_DIR),$(PATCH_DIR)/ath10k,ath10k/)
|
||||
$(call PatchDir,$(PKG_BUILD_DIR),$(PATCH_DIR)/ath11k,ath11k/)
|
||||
$(call PatchDir,$(PKG_BUILD_DIR),$(PATCH_DIR)/ath12k,ath12k/)
|
||||
$(call PatchDir,$(PKG_BUILD_DIR),$(PATCH_DIR)/rt2x00,rt2x00/)
|
||||
$(call PatchDir,$(PKG_BUILD_DIR),$(PATCH_DIR)/mt7601u,mt7601u/)
|
||||
$(call PatchDir,$(PKG_BUILD_DIR),$(PATCH_DIR)/mwl,mwl/)
|
||||
$(call PatchDir,$(PKG_BUILD_DIR),$(PATCH_DIR)/brcm,brcm/)
|
||||
$(call PatchDir,$(PKG_BUILD_DIR),$(PATCH_DIR)/rtl,rtl/)
|
||||
$(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)/ath5k,ath5k/)
|
||||
$(call Quilt/RefreshDir,$(PKG_BUILD_DIR),$(PATCH_DIR)/ath9k,ath9k/)
|
||||
$(call Quilt/RefreshDir,$(PKG_BUILD_DIR),$(PATCH_DIR)/ath10k,ath10k/)
|
||||
$(call Quilt/RefreshDir,$(PKG_BUILD_DIR),$(PATCH_DIR)/ath11k,ath11k/)
|
||||
$(call Quilt/RefreshDir,$(PKG_BUILD_DIR),$(PATCH_DIR)/ath12k,ath12k/)
|
||||
$(call Quilt/RefreshDir,$(PKG_BUILD_DIR),$(PATCH_DIR)/rt2x00,rt2x00/)
|
||||
$(call Quilt/RefreshDir,$(PKG_BUILD_DIR),$(PATCH_DIR)/mt7601u,mt7601u/)
|
||||
$(call Quilt/RefreshDir,$(PKG_BUILD_DIR),$(PATCH_DIR)/mwl,mwl/)
|
||||
$(call Quilt/RefreshDir,$(PKG_BUILD_DIR),$(PATCH_DIR)/brcm,brcm/)
|
||||
$(call Quilt/RefreshDir,$(PKG_BUILD_DIR),$(PATCH_DIR)/rtl,rtl/)
|
||||
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
|
||||
|
||||
|
||||
$(eval $(foreach drv,$(PKG_DRIVERS),$(call KernelPackage,$(drv))))
|
||||
$(eval $(call KernelPackage,cfg80211))
|
||||
$(eval $(call KernelPackage,mac80211))
|
||||
435
ath.mk
Normal file
435
ath.mk
Normal file
@@ -0,0 +1,435 @@
|
||||
PKG_DRIVERS += \
|
||||
ath ath5k ath6kl ath6kl-sdio ath6kl-usb ath9k ath9k-common ath9k-htc ath10k ath10k-sdio ath10k-smallbuffers \
|
||||
ath11k ath11k-ahb ath11k-pci ath12k carl9170 owl-loader ar5523 wil6210 qcom-qmi-helpers
|
||||
|
||||
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_ATH11K_THERMAL \
|
||||
CONFIG_ATH_USER_REGD
|
||||
|
||||
ifdef CONFIG_PACKAGE_MAC80211_DEBUGFS
|
||||
config-y += \
|
||||
ATH9K_DEBUGFS \
|
||||
ATH9K_HTC_DEBUGFS \
|
||||
ATH10K_DEBUGFS \
|
||||
ATH11K_DEBUGFS \
|
||||
ATH12K_DEBUGFS \
|
||||
CARL9170_DEBUGFS \
|
||||
ATH5K_DEBUG \
|
||||
ATH6KL_DEBUG \
|
||||
WIL6210_DEBUGFS
|
||||
endif
|
||||
|
||||
ifdef CONFIG_PACKAGE_MAC80211_TRACING
|
||||
config-y += \
|
||||
ATH10K_TRACING \
|
||||
ATH11K_TRACING \
|
||||
ATH12K_TRACING \
|
||||
ATH6KL_TRACING \
|
||||
ATH_TRACEPOINTS \
|
||||
ATH5K_TRACER \
|
||||
WIL6210_TRACING
|
||||
endif
|
||||
|
||||
config-$(call config_package,qcom-qmi-helpers) += QCOM_QMI_HELPERS
|
||||
config-$(call config_package,ath,regular sdio smallbuffers) += ATH_CARDS ATH_COMMON
|
||||
config-$(CONFIG_PACKAGE_ATH_DEBUG) += ATH_DEBUG ATH10K_DEBUG ATH11K_DEBUG ATH12K_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 ATH11K_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 ATH_REG_DYNAMIC_USER_REG_HINTS
|
||||
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-$(CONFIG_ATH11K_THERMAL) += ATH11K_THERMAL
|
||||
|
||||
config-$(call config_package,ath9k-htc) += ATH9K_HTC
|
||||
config-$(call config_package,ath10k,regular) += ATH10K ATH10K_PCI
|
||||
config-$(call config_package,ath10k-sdio,sdio) += ATH10K ATH10K_SDIO
|
||||
config-$(call config_package,ath10k-smallbuffers,smallbuffers) += ATH10K ATH10K_PCI ATH10K_SMALLBUFFERS
|
||||
config-$(call config_package,ath11k) += ATH11K
|
||||
config-$(call config_package,ath11k-ahb) += ATH11K_AHB
|
||||
config-$(call config_package,ath11k-pci) += ATH11K_PCI
|
||||
config-$(call config_package,ath12k) += ATH12K
|
||||
|
||||
config-$(call config_package,ath5k) += ATH5K ATH5K_PCI
|
||||
|
||||
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
|
||||
|
||||
config-$(call config_package,wil6210) += WIL6210
|
||||
|
||||
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 & ath11k 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/qcom-qmi-helpers
|
||||
$(call KernelPackage/mac80211/Default)
|
||||
TITLE:=Qualcomm QMI backports helpers
|
||||
HIDDEN:=1
|
||||
FILES:=$(PKG_BUILD_DIR)/drivers/soc/qcom/qmi_helpers.ko
|
||||
AUTOLOAD:=$(call AutoProbe,qmi_helpers)
|
||||
endef
|
||||
|
||||
define KernelPackage/ath
|
||||
$(call KernelPackage/mac80211/Default)
|
||||
TITLE:=Atheros common driver part
|
||||
DEPENDS+= @PCI_SUPPORT||USB_SUPPORT||TARGET_ath79 +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 +kmod-ath
|
||||
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
|
||||
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 +kmod-random-core
|
||||
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 y
|
||||
|
||||
config ATH9K_SUPPORT_PCOEM
|
||||
bool "Support chips used in PC OEM cards"
|
||||
depends on PACKAGE_kmod-ath9k
|
||||
default y if (x86_64 || i386)
|
||||
|
||||
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_11AC_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_core ath10k_pci)
|
||||
MODPARAMS.ath10k_core:=frame_mode=2
|
||||
VARIANT:=regular
|
||||
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 || PACKAGE_kmod-ath10k-smallbuffers
|
||||
|
||||
config ATH10K_THERMAL
|
||||
bool "Enable thermal sensors and throttling support"
|
||||
default y
|
||||
depends on PACKAGE_kmod-ath10k || PACKAGE_kmod-ath10k-sdio || PACKAGE_kmod-ath10k-smallbuffers
|
||||
|
||||
endef
|
||||
|
||||
define KernelPackage/ath10k-sdio
|
||||
$(call KernelPackage/mac80211/Default)
|
||||
TITLE:=Atheros 802.11ac SDIO wireless cards support
|
||||
URL:=https://wireless.wiki.kernel.org/en/users/drivers/ath10k
|
||||
DEPENDS+= +kmod-ath +kmod-mmc +@DRIVER_11AC_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_sdio.ko
|
||||
AUTOLOAD:=$(call AutoProbe,ath10k_core)
|
||||
MODPARAMS.ath10k_core:=frame_mode=2
|
||||
VARIANT:=sdio
|
||||
endef
|
||||
|
||||
define KernelPackage/ath10k-sdio/description
|
||||
This module adds support for wireless adapters based on
|
||||
Atheros IEEE 802.11ac family of chipsets with SDIO bus.
|
||||
endef
|
||||
|
||||
define KernelPackage/ath10k-smallbuffers
|
||||
$(call KernelPackage/ath10k)
|
||||
TITLE+= (small buffers for low-RAM devices)
|
||||
VARIANT:=smallbuffers
|
||||
endef
|
||||
|
||||
define KernelPackage/ath11k
|
||||
$(call KernelPackage/mac80211/Default)
|
||||
TITLE:=Qualcomm 802.11ax wireless chipset support (common code)
|
||||
URL:=https://wireless.wiki.kernel.org/en/users/drivers/ath11k
|
||||
DEPENDS+= +kmod-ath +@DRIVER_11AC_SUPPORT +@DRIVER_11AX_SUPPORT \
|
||||
+kmod-crypto-michael-mic +ATH11K_THERMAL:kmod-hwmon-core \
|
||||
+ATH11K_THERMAL:kmod-thermal +kmod-qcom-qmi-helpers
|
||||
FILES:=$(PKG_BUILD_DIR)/drivers/net/wireless/ath/ath11k/ath11k.ko
|
||||
endef
|
||||
|
||||
define KernelPackage/ath11k/description
|
||||
This module adds support for Qualcomm Technologies 802.11ax family of
|
||||
chipsets.
|
||||
endef
|
||||
|
||||
define KernelPackage/ath11k/config
|
||||
|
||||
config ATH11K_THERMAL
|
||||
bool "Enable thermal sensors and throttling support"
|
||||
depends on PACKAGE_kmod-ath11k
|
||||
default y if TARGET_qualcommax
|
||||
|
||||
endef
|
||||
|
||||
define KernelPackage/ath11k-ahb
|
||||
$(call KernelPackage/mac80211/Default)
|
||||
TITLE:=Qualcomm 802.11ax AHB wireless chipset support
|
||||
URL:=https://wireless.wiki.kernel.org/en/users/drivers/ath11k
|
||||
DEPENDS+= @TARGET_qualcommax +kmod-ath11k +kmod-qrtr-smd
|
||||
FILES:=$(PKG_BUILD_DIR)/drivers/net/wireless/ath/ath11k/ath11k_ahb.ko
|
||||
AUTOLOAD:=$(call AutoProbe,ath11k_ahb)
|
||||
endef
|
||||
|
||||
define KernelPackage/ath11k-ahb/description
|
||||
This module adds support for Qualcomm Technologies 802.11ax family of
|
||||
chipsets with AHB bus.
|
||||
endef
|
||||
|
||||
define KernelPackage/ath11k-pci
|
||||
$(call KernelPackage/mac80211/Default)
|
||||
TITLE:=Qualcomm 802.11ax PCI wireless chipset support
|
||||
URL:=https://wireless.wiki.kernel.org/en/users/drivers/ath11k
|
||||
DEPENDS+= @PCI_SUPPORT +kmod-qrtr-mhi +kmod-ath11k
|
||||
FILES:=$(PKG_BUILD_DIR)/drivers/net/wireless/ath/ath11k/ath11k_pci.ko
|
||||
AUTOLOAD:=$(call AutoProbe,ath11k_pci)
|
||||
endef
|
||||
|
||||
define KernelPackage/ath11k-pci/description
|
||||
This module adds support for Qualcomm Technologies 802.11ax family of
|
||||
chipsets with PCI bus.
|
||||
endef
|
||||
|
||||
define KernelPackage/ath12k
|
||||
$(call KernelPackage/mac80211/Default)
|
||||
TITLE:=Qualcomm 802.11be wireless chipset support
|
||||
URL:=https://wireless.wiki.kernel.org/en/users/drivers/ath12k
|
||||
DEPENDS+= @PCI_SUPPORT +kmod-ath +@DRIVER_11AC_SUPPORT +@DRIVER_11AX_SUPPORT \
|
||||
+kmod-crypto-michael-mic +kmod-qrtr-mhi \
|
||||
+kmod-qcom-qmi-helpers +@DRIVER_11BE_SUPPORT
|
||||
FILES:=$(PKG_BUILD_DIR)/drivers/net/wireless/ath/ath12k/ath12k.ko
|
||||
AUTOLOAD:=$(call AutoProbe,ath12k)
|
||||
endef
|
||||
|
||||
define KernelPackage/ath12k/description
|
||||
This module adds support for Qualcomm Technologies 802.11be family of
|
||||
chipsets with PCI bus.
|
||||
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 +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
|
||||
|
||||
define KernelPackage/wil6210
|
||||
$(call KernelPackage/mac80211/Default)
|
||||
TITLE:=QCA/Wilocity 60g WiFi card wil6210 support
|
||||
DEPENDS+= @PCI_SUPPORT +kmod-mac80211 +wil6210-firmware
|
||||
FILES:=$(PKG_BUILD_DIR)/drivers/net/wireless/ath/wil6210/wil6210.ko
|
||||
AUTOLOAD:=$(call AutoProbe,wil6210)
|
||||
endef
|
||||
497
broadcom.mk
Normal file
497
broadcom.mk
Normal file
@@ -0,0 +1,497 @@
|
||||
PKG_DRIVERS += \
|
||||
b43 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,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:=@OPENWRT
|
||||
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:=@OPENWRT
|
||||
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:=@OPENWRT
|
||||
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 +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 separated 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 separated 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 && !TARGET_bmips
|
||||
bool "BCMA and SSB"
|
||||
|
||||
config PACKAGE_B43_BUSES_BCMA
|
||||
depends on !TARGET_bcm47xx_legacy && !TARGET_bmips_bcm6358 && !TARGET_bmips_bcm6368
|
||||
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/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+=@!TARGET_bcm47xx_legacy +kmod-mac80211 +!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_11AC_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 \
|
||||
$(foreach type,bca cyw wcc, \
|
||||
$(PKG_BUILD_DIR)/drivers/net/wireless/broadcom/brcm80211/brcmfmac/$(type)/brcmfmac-$(type).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_imx_cortexa7
|
||||
default y if TARGET_starfive
|
||||
default y if TARGET_rockchip
|
||||
default y if TARGET_sunxi
|
||||
default y if TARGET_stm32
|
||||
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
|
||||
78
intel.mk
Normal file
78
intel.mk
Normal file
@@ -0,0 +1,78 @@
|
||||
PKG_DRIVERS += iwlwifi
|
||||
|
||||
config-$(call config_package,iwlwifi) += IWLWIFI IWLDVM IWLMVM IWLMLD
|
||||
config-$(CONFIG_PACKAGE_IWLWIFI_DEBUG)+= IWLWIFI_DEBUG
|
||||
config-$(CONFIG_PACKAGE_IWLWIFI_DEBUGFS)+= IWLWIFI_DEBUGFS
|
||||
|
||||
define KernelPackage/iwlwifi
|
||||
$(call KernelPackage/mac80211/Default)
|
||||
DEPENDS:= +kmod-mac80211 +kmod-ptp @PCI_SUPPORT +@DRIVER_11AC_SUPPORT +@DRIVER_11AX_SUPPORT +@DRIVER_11BE_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 \
|
||||
$(PKG_BUILD_DIR)/drivers/net/wireless/intel/iwlwifi/mld/iwlmld.ko
|
||||
AUTOLOAD:=$(call AutoProbe,iwlwifi iwldvm iwlmvm iwlmld)
|
||||
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
|
||||
|
||||
51
marvell.mk
Normal file
51
marvell.mk
Normal file
@@ -0,0 +1,51 @@
|
||||
PKG_DRIVERS += \
|
||||
mwl8k mwifiex-pcie mwifiex-sdio
|
||||
|
||||
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/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 +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_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_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
patches/ath/070-ath_common_config.patch
Normal file
10
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
|
||||
31
patches/ath/400-ath_move_debug_code.patch
Normal file
31
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
|
||||
@@ -16,10 +16,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
|
||||
@@ -321,14 +321,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)
|
||||
92
patches/ath/402-ath_regd_optional.patch
Normal file
92
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;
|
||||
@@ -379,6 +388,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;
|
||||
@@ -408,6 +420,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;
|
||||
|
||||
@@ -640,6 +655,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
|
||||
@@ -90,6 +90,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
patches/ath/403-world_regd_fixup.patch
Normal file
84
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
patches/ath/404-regd_no_assoc_hints.patch
Normal file
19
patches/ath/404-regd_no_assoc_hints.patch
Normal file
@@ -0,0 +1,19 @@
|
||||
--- a/net/wireless/reg.c
|
||||
+++ b/net/wireless/reg.c
|
||||
@@ -3365,6 +3365,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;
|
||||
@@ -3614,6 +3616,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
patches/ath/405-ath_regd_us.patch
Normal file
26
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,
|
||||
@@ -173,6 +174,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},
|
||||
@@ -486,6 +488,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
patches/ath/406-ath_relax_default_regd.patch
Normal file
51
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));
|
||||
@@ -659,6 +667,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;
|
||||
|
||||
56
patches/ath/431-add_platform_eeprom_support_to_ath5k.patch
Normal file
56
patches/ath/431-add_platform_eeprom_support_to_ath5k.patch
Normal file
@@ -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"
|
||||
@@ -73,7 +74,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)
|
||||
@@ -81,6 +82,19 @@ ath5k_pci_eeprom_read(struct ath_common
|
||||
struct ath5k_hw *ah = 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
|
||||
*/
|
||||
@@ -124,6 +138,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--) {
|
||||
47
patches/ath10k/080-ath10k_thermal_config.patch
Normal file
47
patches/ath10k/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
|
||||
@@ -94,6 +94,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_ATH10K_LEDS) += leds.o
|
||||
ath10k_core-$(CPTCFG_MAC80211_DEBUGFS) += debugfs_sta.o
|
||||
ath10k_core-$(CONFIG_PM) += wow.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
|
||||
@@ -150,6 +150,7 @@ ATH10K_DEBUG=
|
||||
ATH10K_DEBUGFS=
|
||||
ATH10K_LEDS=
|
||||
ATH10K_SPECTRAL=
|
||||
+ATH10K_THERMAL=
|
||||
ATH10K_TRACING=
|
||||
ATH10K_DFS_CERTIFIED=
|
||||
WCN36XX=
|
||||
33
patches/ath10k/921-ath10k_init_devices_synchronously.patch
Normal file
33
patches/ath10k/921-ath10k_init_devices_synchronously.patch
Normal file
@@ -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
|
||||
@@ -3546,6 +3546,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);
|
||||
37
patches/ath10k/930-ath10k_add_tpt_led_trigger.patch
Normal file
37
patches/ath10k/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
|
||||
@@ -9951,6 +9951,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[] = {
|
||||
@@ -10313,6 +10328,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);
|
||||
51
patches/ath10k/975-ath10k-use-tpt-trigger-by-default.patch
Normal file
51
patches/ath10k/975-ath10k-use-tpt-trigger-by-default.patch
Normal file
@@ -0,0 +1,51 @@
|
||||
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
|
||||
@@ -1315,6 +1315,10 @@ struct ath10k {
|
||||
s32 tx_power_2g_limit;
|
||||
s32 tx_power_5g_limit;
|
||||
|
||||
+#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
|
||||
@@ -70,7 +70,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;
|
||||
- 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
|
||||
@@ -10329,7 +10329,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,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
|
||||
@@ -1043,6 +1043,40 @@ static inline int ath10k_vdev_delete_syn
|
||||
return 0;
|
||||
}
|
||||
|
||||
+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;
|
||||
@@ -1075,7 +1109,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);
|
||||
@@ -1521,7 +1556,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;
|
||||
@@ -3452,7 +3488,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
|
||||
@@ -0,0 +1,24 @@
|
||||
--- a/drivers/net/wireless/ath/ath10k/core.c
|
||||
+++ b/drivers/net/wireless/ath/ath10k/core.c
|
||||
@@ -3554,7 +3554,8 @@ int ath10k_core_register(struct ath10k *
|
||||
* 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);
|
||||
+ if (ar->hif.bus != ATH10K_BUS_SDIO)
|
||||
+ flush_workqueue(ar->workqueue);
|
||||
|
||||
return 0;
|
||||
}
|
||||
--- a/drivers/net/wireless/ath/ath10k/debug.c
|
||||
+++ b/drivers/net/wireless/ath/ath10k/debug.c
|
||||
@@ -1262,6 +1262,9 @@ static int ath10k_debug_cal_data_fetch(s
|
||||
if (ar->hw_params.cal_data_len == 0)
|
||||
return -EOPNOTSUPP;
|
||||
|
||||
+ if (ar->hif.bus == ATH10K_BUS_SDIO)
|
||||
+ return -EINVAL;
|
||||
+
|
||||
hi_addr = host_interest_item_address(HI_ITEM(hi_board_data));
|
||||
|
||||
ret = ath10k_hif_diag_read(ar, hi_addr, &addr, sizeof(addr));
|
||||
10
patches/ath10k/983-ath10k-allow-vht-on-2g.patch
Normal file
10
patches/ath10k/983-ath10k-allow-vht-on-2g.patch
Normal file
@@ -0,0 +1,10 @@
|
||||
--- a/drivers/net/wireless/ath/ath10k/mac.c
|
||||
+++ b/drivers/net/wireless/ath/ath10k/mac.c
|
||||
@@ -5054,6 +5054,7 @@ static void ath10k_mac_setup_ht_vht_cap(
|
||||
if (ar->phy_capability & WHAL_WLAN_11G_CAPABILITY) {
|
||||
band = &ar->mac.sbands[NL80211_BAND_2GHZ];
|
||||
band->ht_cap = ht_cap;
|
||||
+ band->vht_cap = vht_cap;
|
||||
}
|
||||
if (ar->phy_capability & WHAL_WLAN_11A_CAPABILITY) {
|
||||
band = &ar->mac.sbands[NL80211_BAND_5GHZ];
|
||||
@@ -0,0 +1,37 @@
|
||||
From 22fb5991a44c78ff18ec0082dc90c809356eb893 Mon Sep 17 00:00:00 2001
|
||||
From: Ansuel Smith <ansuelsmth@gmail.com>
|
||||
Date: Sun, 27 Sep 2020 19:23:35 +0200
|
||||
Subject: [PATCH 1/2] ath10k: Try to get mac-address from dts
|
||||
|
||||
Most of embedded device that have the ath10k wifi integrated store the
|
||||
mac-address in nvmem partitions. Try to fetch the mac-address using the
|
||||
standard 'of_get_mac_address' than in all the check also try to fetch the
|
||||
address using the nvmem api searching for a defined 'mac-address' cell.
|
||||
Mac-address defined in the dts have priority than any other address found.
|
||||
|
||||
Tested-on: QCA9984 hw1.0 PCI 10.4
|
||||
|
||||
Signed-off-by: Ansuel Smith <ansuelsmth@gmail.com>
|
||||
---
|
||||
drivers/net/wireless/ath/ath10k/core.c | 10 ++++++++++
|
||||
1 file changed, 10 insertions(+)
|
||||
|
||||
--- a/drivers/net/wireless/ath/ath10k/core.c
|
||||
+++ b/drivers/net/wireless/ath/ath10k/core.c
|
||||
@@ -9,6 +9,7 @@
|
||||
#include <linux/module.h>
|
||||
#include <linux/firmware.h>
|
||||
#include <linux/of.h>
|
||||
+#include <linux/of_net.h>
|
||||
#include <linux/property.h>
|
||||
#include <linux/dmi.h>
|
||||
#include <linux/ctype.h>
|
||||
@@ -3418,6 +3419,8 @@ static int ath10k_core_probe_fw(struct a
|
||||
|
||||
device_get_mac_address(ar->dev, ar->mac_addr);
|
||||
|
||||
+ of_get_mac_address(ar->dev->of_node, ar->mac_addr);
|
||||
+
|
||||
ret = ath10k_core_init_firmware_features(ar);
|
||||
if (ret) {
|
||||
ath10k_err(ar, "fatal problem with firmware features: %d\n",
|
||||
@@ -0,0 +1,28 @@
|
||||
From f7d6edafe4358e3880a26775cfde4cd5c71ba063 Mon Sep 17 00:00:00 2001
|
||||
From: David Bauer <mail@david-bauer.net>
|
||||
Date: Wed, 5 Jul 2023 01:30:29 +0200
|
||||
Subject: [PATCH] ath10k: always use mac80211 loss detection
|
||||
|
||||
ath10k does not report excessive loss in case of broken block-ack
|
||||
sessions. The loss is communicated to the host-os, but ath10k does not
|
||||
trigger a low-ack events by itself.
|
||||
|
||||
The mac80211 framework for loss detection however detects this
|
||||
circumstance well in case of ath10k. So use it regardless of ath10k's
|
||||
own loss detection mechanism.
|
||||
|
||||
Signed-off-by: David Bauer <mail@david-bauer.net>
|
||||
---
|
||||
drivers/net/wireless/ath/ath10k/mac.c | 1 -
|
||||
1 file changed, 1 deletion(-)
|
||||
|
||||
--- a/drivers/net/wireless/ath/ath10k/mac.c
|
||||
+++ b/drivers/net/wireless/ath/ath10k/mac.c
|
||||
@@ -10122,7 +10122,6 @@ int ath10k_mac_register(struct ath10k *a
|
||||
ieee80211_hw_set(ar->hw, CHANCTX_STA_CSA);
|
||||
ieee80211_hw_set(ar->hw, QUEUE_CONTROL);
|
||||
ieee80211_hw_set(ar->hw, SUPPORTS_TX_FRAG);
|
||||
- ieee80211_hw_set(ar->hw, REPORTS_LOW_ACK);
|
||||
|
||||
if (!test_bit(ATH10K_FLAG_RAW_MODE, &ar->dev_flags))
|
||||
ieee80211_hw_set(ar->hw, SW_CRYPTO_CONTROL);
|
||||
64
patches/ath10k/990-ath10k-small-buffers.patch
Normal file
64
patches/ath10k/990-ath10k-small-buffers.patch
Normal file
@@ -0,0 +1,64 @@
|
||||
--- a/drivers/net/wireless/ath/ath10k/htt.h
|
||||
+++ b/drivers/net/wireless/ath/ath10k/htt.h
|
||||
@@ -236,7 +236,11 @@ enum htt_rx_ring_flags {
|
||||
};
|
||||
|
||||
#define HTT_RX_RING_SIZE_MIN 128
|
||||
+#ifndef CONFIG_ATH10K_SMALLBUFFERS
|
||||
#define HTT_RX_RING_SIZE_MAX 2048
|
||||
+#else
|
||||
+#define HTT_RX_RING_SIZE_MAX 512
|
||||
+#endif
|
||||
#define HTT_RX_RING_SIZE HTT_RX_RING_SIZE_MAX
|
||||
#define HTT_RX_RING_FILL_LEVEL (((HTT_RX_RING_SIZE) / 2) - 1)
|
||||
#define HTT_RX_RING_FILL_LEVEL_DUAL_MAC (HTT_RX_RING_SIZE - 1)
|
||||
--- a/drivers/net/wireless/ath/ath10k/pci.c
|
||||
+++ b/drivers/net/wireless/ath/ath10k/pci.c
|
||||
@@ -132,7 +132,11 @@ static const struct ce_attr pci_host_ce_
|
||||
.flags = CE_ATTR_FLAGS,
|
||||
.src_nentries = 0,
|
||||
.src_sz_max = 2048,
|
||||
+#ifndef CONFIG_ATH10K_SMALLBUFFERS
|
||||
.dest_nentries = 512,
|
||||
+#else
|
||||
+ .dest_nentries = 128,
|
||||
+#endif
|
||||
.recv_cb = ath10k_pci_htt_htc_rx_cb,
|
||||
},
|
||||
|
||||
@@ -141,7 +145,11 @@ static const struct ce_attr pci_host_ce_
|
||||
.flags = CE_ATTR_FLAGS,
|
||||
.src_nentries = 0,
|
||||
.src_sz_max = 2048,
|
||||
+#ifndef CONFIG_ATH10K_SMALLBUFFERS
|
||||
.dest_nentries = 128,
|
||||
+#else
|
||||
+ .dest_nentries = 64,
|
||||
+#endif
|
||||
.recv_cb = ath10k_pci_htc_rx_cb,
|
||||
},
|
||||
|
||||
@@ -168,7 +176,11 @@ static const struct ce_attr pci_host_ce_
|
||||
.flags = CE_ATTR_FLAGS,
|
||||
.src_nentries = 0,
|
||||
.src_sz_max = 512,
|
||||
+#ifndef CONFIG_ATH10K_SMALLBUFFERS
|
||||
.dest_nentries = 512,
|
||||
+#else
|
||||
+ .dest_nentries = 128,
|
||||
+#endif
|
||||
.recv_cb = ath10k_pci_htt_rx_cb,
|
||||
},
|
||||
|
||||
@@ -193,7 +205,11 @@ static const struct ce_attr pci_host_ce_
|
||||
.flags = CE_ATTR_FLAGS,
|
||||
.src_nentries = 0,
|
||||
.src_sz_max = 2048,
|
||||
+#ifndef CONFIG_ATH10K_SMALLBUFFERS
|
||||
.dest_nentries = 128,
|
||||
+#else
|
||||
+ .dest_nentries = 96,
|
||||
+#endif
|
||||
.recv_cb = ath10k_pci_pktlog_rx_cb,
|
||||
},
|
||||
|
||||
70
patches/ath10k/991-ath10k-support-flush_sta-method.patch
Normal file
70
patches/ath10k/991-ath10k-support-flush_sta-method.patch
Normal file
@@ -0,0 +1,70 @@
|
||||
From: Zhi-Jun You <hujy652@gmail.com>
|
||||
Date: Wed, 6 Aug 2025 15:00:05 +0800
|
||||
Subject: [RFC PATCH] wifi: ath10k: support flush_sta method
|
||||
|
||||
|
||||
When a STA is marked as no longer authorized, if the driver doesn't
|
||||
implement flush_sta(), mac80211 calls ieee80211_flush_queues() to
|
||||
flush hardware queues to avoid sending unencrypted frames.
|
||||
|
||||
This has became a problem for ath10k because ieee80211_flush_queues()
|
||||
will stop all traffic and call ath10k_flush, which waits until the
|
||||
whole HW queue is empty. In a busy environment this will trigger a
|
||||
timeout warning and stalls other STAs.
|
||||
|
||||
Fix this by implementing flush_sta method using WMI command to flush
|
||||
frames of a specific STA.
|
||||
Flushed frames will be marked as discard in tx complete indication.
|
||||
|
||||
ops->flush_sta will be set to NULL if htt.disable_tx_comp is set to
|
||||
true.
|
||||
|
||||
Tested-on: QCA9984 hw1.0 PCI 10.4-3.9.0.2-00157
|
||||
|
||||
Signed-off-by: Zhi-Jun You <hujy652@gmail.com>
|
||||
Tested-by: Florian Maurer <maurer@fh-aachen.de>
|
||||
---
|
||||
drivers/net/wireless/ath/ath10k/mac.c | 18 ++++++++++++++++++
|
||||
1 file changed, 18 insertions(+)
|
||||
|
||||
--- a/drivers/net/wireless/ath/ath10k/mac.c
|
||||
+++ b/drivers/net/wireless/ath/ath10k/mac.c
|
||||
@@ -8166,6 +8166,20 @@ static void ath10k_flush(struct ieee8021
|
||||
mutex_unlock(&ar->conf_mutex);
|
||||
}
|
||||
|
||||
+static void ath10k_mac_op_flush_sta(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
|
||||
+ struct ieee80211_sta *sta)
|
||||
+{
|
||||
+ struct ath10k_vif *arvif = (void *)vif->drv_priv;
|
||||
+ struct ath10k *ar = hw->priv;
|
||||
+ u32 bitmap = 0xFFFFFFFF;
|
||||
+ int ret = 0;
|
||||
+
|
||||
+ ret = ath10k_wmi_peer_flush(ar, arvif->vdev_id, sta->addr, bitmap);
|
||||
+ if (ret)
|
||||
+ ath10k_warn(ar, "failed to flush sta (sta %pM)\n",
|
||||
+ sta->addr);
|
||||
+}
|
||||
+
|
||||
/* TODO: Implement this function properly
|
||||
* For now it is needed to reply to Probe Requests in IBSS mode.
|
||||
* Probably we need this information from FW.
|
||||
@@ -9513,6 +9527,7 @@ static const struct ieee80211_ops ath10k
|
||||
.set_rts_threshold = ath10k_set_rts_threshold,
|
||||
.set_frag_threshold = ath10k_mac_op_set_frag_threshold,
|
||||
.flush = ath10k_flush,
|
||||
+ .flush_sta = ath10k_mac_op_flush_sta,
|
||||
.tx_last_beacon = ath10k_tx_last_beacon,
|
||||
.set_antenna = ath10k_set_antenna,
|
||||
.get_antenna = ath10k_get_antenna,
|
||||
@@ -10334,6 +10349,9 @@ int ath10k_mac_register(struct ath10k *a
|
||||
if (!ar->hw_params.hw_ops->set_coverage_class)
|
||||
ar->ops->set_coverage_class = NULL;
|
||||
|
||||
+ if (ar->htt.disable_tx_comp)
|
||||
+ ar->ops->flush_sta = NULL;
|
||||
+
|
||||
ret = ath_regd_init(&ar->ath_common.regulatory, ar->hw->wiphy,
|
||||
ath10k_reg_notifier);
|
||||
if (ret) {
|
||||
164
patches/ath11k/100-wifi-ath11k-use-unique-QRTR-instance-ID.patch
Normal file
164
patches/ath11k/100-wifi-ath11k-use-unique-QRTR-instance-ID.patch
Normal file
@@ -0,0 +1,164 @@
|
||||
From 534a5f99d589cfa6b244b4433c192b6a278a67ff Mon Sep 17 00:00:00 2001
|
||||
From: Robert Marko <robimarko@gmail.com>
|
||||
Date: Sat, 5 Nov 2022 20:15:40 +0100
|
||||
Subject: [PATCH] wifi: ath11k: use unique QRTR instance ID
|
||||
|
||||
Currently, trying to use AHB + PCI/MHI cards or multiple PCI/MHI cards
|
||||
will cause a clash in the QRTR instance node ID and prevent the driver
|
||||
from talking via QMI to the card and thus initializing it with:
|
||||
[ 9.836329] ath11k c000000.wifi: host capability request failed: 1 90
|
||||
[ 9.842047] ath11k c000000.wifi: failed to send qmi host cap: -22
|
||||
|
||||
So, in order to allow for this combination of cards, especially AHB + PCI
|
||||
cards like IPQ8074 + QCN9074 (Used by me and tested on) set the desired
|
||||
QRTR instance ID offset by calculating a unique one based on PCI domain
|
||||
and bus ID-s and writing it to bits 7-0 of BHI_ERRDBG2 MHI register by
|
||||
using the SBL state callback that is added as part of the series.
|
||||
We also have to make sure that new QRTR offset is added on top of the
|
||||
default QRTR instance ID-s that are currently used in the driver.
|
||||
|
||||
This finally allows using AHB + PCI or multiple PCI cards on the same
|
||||
system.
|
||||
|
||||
Since this is not supported on QCA6390 and like, its limited to QCN9074
|
||||
which is known to support changing QRTR instance ID.
|
||||
|
||||
Before:
|
||||
root@OpenWrt:/# qrtr-lookup
|
||||
Service Version Instance Node Port
|
||||
1054 1 0 7 1 <unknown>
|
||||
69 1 2 7 3 ATH10k WLAN firmware service
|
||||
|
||||
After:
|
||||
root@OpenWrt:/# qrtr-lookup
|
||||
Service Version Instance Node Port
|
||||
1054 1 0 7 1 <unknown>
|
||||
69 1 2 7 3 ATH10k WLAN firmware service
|
||||
15 1 0 8 1 Test service
|
||||
69 1 8 8 2 ATH10k WLAN firmware service
|
||||
|
||||
Tested-on: IPQ8074 hw2.0 AHB WLAN.HK.2.5.0.1-01208-QCAHKSWPL_SILICONZ-1
|
||||
Tested-on: QCN9074 hw1.0 PCI WLAN.HK.2.5.0.1-01208-QCAHKSWPL_SILICONZ-1
|
||||
|
||||
Signed-off-by: Robert Marko <robimarko@gmail.com>
|
||||
---
|
||||
drivers/net/wireless/ath/ath11k/mhi.c | 49 ++++++++++++++++++---------
|
||||
drivers/net/wireless/ath/ath11k/mhi.h | 3 ++
|
||||
drivers/net/wireless/ath/ath11k/pci.c | 9 ++++-
|
||||
3 files changed, 44 insertions(+), 17 deletions(-)
|
||||
|
||||
--- a/drivers/net/wireless/ath/ath11k/mhi.c
|
||||
+++ b/drivers/net/wireless/ath/ath11k/mhi.c
|
||||
@@ -239,6 +239,34 @@ static void ath11k_mhi_op_runtime_put(st
|
||||
{
|
||||
}
|
||||
|
||||
+static int ath11k_mhi_op_read_reg(struct mhi_controller *mhi_cntrl,
|
||||
+ void __iomem *addr,
|
||||
+ u32 *out)
|
||||
+{
|
||||
+ *out = readl(addr);
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static void ath11k_mhi_op_write_reg(struct mhi_controller *mhi_cntrl,
|
||||
+ void __iomem *addr,
|
||||
+ u32 val)
|
||||
+{
|
||||
+ writel(val, addr);
|
||||
+}
|
||||
+
|
||||
+static void ath11k_mhi_qrtr_instance_set(struct mhi_controller *mhi_cntrl)
|
||||
+{
|
||||
+ struct ath11k_base *ab = dev_get_drvdata(mhi_cntrl->cntrl_dev);
|
||||
+
|
||||
+ if (ab->hw_rev == ATH11K_HW_QCN9074_HW10) {
|
||||
+ ath11k_mhi_op_write_reg(mhi_cntrl,
|
||||
+ mhi_cntrl->bhi + BHI_ERRDBG2,
|
||||
+ FIELD_PREP(QRTR_INSTANCE_MASK,
|
||||
+ ab->qmi.service_ins_id - ab->hw_params.qmi_service_ins_id));
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
static char *ath11k_mhi_op_callback_to_str(enum mhi_callback reason)
|
||||
{
|
||||
switch (reason) {
|
||||
@@ -260,6 +288,8 @@ static char *ath11k_mhi_op_callback_to_s
|
||||
return "MHI_CB_FATAL_ERROR";
|
||||
case MHI_CB_BW_REQ:
|
||||
return "MHI_CB_BW_REQ";
|
||||
+ case MHI_CB_EE_SBL_MODE:
|
||||
+ return "MHI_CB_EE_SBL_MODE";
|
||||
default:
|
||||
return "UNKNOWN";
|
||||
}
|
||||
@@ -290,6 +320,9 @@ static void ath11k_mhi_op_status_cb(stru
|
||||
queue_work(ab->workqueue_aux, &ab->reset_work);
|
||||
|
||||
break;
|
||||
+ case MHI_CB_EE_SBL_MODE:
|
||||
+ ath11k_mhi_qrtr_instance_set(mhi_cntrl);
|
||||
+ break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
@@ -297,22 +330,6 @@ static void ath11k_mhi_op_status_cb(stru
|
||||
ab_pci->mhi_pre_cb = cb;
|
||||
}
|
||||
|
||||
-static int ath11k_mhi_op_read_reg(struct mhi_controller *mhi_cntrl,
|
||||
- void __iomem *addr,
|
||||
- u32 *out)
|
||||
-{
|
||||
- *out = readl(addr);
|
||||
-
|
||||
- return 0;
|
||||
-}
|
||||
-
|
||||
-static void ath11k_mhi_op_write_reg(struct mhi_controller *mhi_cntrl,
|
||||
- void __iomem *addr,
|
||||
- u32 val)
|
||||
-{
|
||||
- writel(val, addr);
|
||||
-}
|
||||
-
|
||||
static int ath11k_mhi_read_addr_from_dt(struct mhi_controller *mhi_ctrl)
|
||||
{
|
||||
struct device_node *np;
|
||||
--- a/drivers/net/wireless/ath/ath11k/mhi.h
|
||||
+++ b/drivers/net/wireless/ath/ath11k/mhi.h
|
||||
@@ -17,6 +17,9 @@
|
||||
#define MHICTRL 0x38
|
||||
#define MHICTRL_RESET_MASK 0x2
|
||||
|
||||
+#define BHI_ERRDBG2 0x38
|
||||
+#define QRTR_INSTANCE_MASK GENMASK(7, 0)
|
||||
+
|
||||
int ath11k_mhi_start(struct ath11k_pci *ar_pci);
|
||||
void ath11k_mhi_stop(struct ath11k_pci *ar_pci, bool is_suspend);
|
||||
int ath11k_mhi_register(struct ath11k_pci *ar_pci);
|
||||
--- a/drivers/net/wireless/ath/ath11k/pci.c
|
||||
+++ b/drivers/net/wireless/ath/ath11k/pci.c
|
||||
@@ -376,13 +376,20 @@ static void ath11k_pci_sw_reset(struct a
|
||||
static void ath11k_pci_init_qmi_ce_config(struct ath11k_base *ab)
|
||||
{
|
||||
struct ath11k_qmi_ce_cfg *cfg = &ab->qmi.ce_cfg;
|
||||
+ struct ath11k_pci *ab_pci = ath11k_pci_priv(ab);
|
||||
+ struct pci_bus *bus = ab_pci->pdev->bus;
|
||||
|
||||
cfg->tgt_ce = ab->hw_params.target_ce_config;
|
||||
cfg->tgt_ce_len = ab->hw_params.target_ce_count;
|
||||
|
||||
cfg->svc_to_ce_map = ab->hw_params.svc_to_ce_map;
|
||||
cfg->svc_to_ce_map_len = ab->hw_params.svc_to_ce_map_len;
|
||||
- ab->qmi.service_ins_id = ab->hw_params.qmi_service_ins_id;
|
||||
+
|
||||
+ if (ab->hw_rev == ATH11K_HW_QCN9074_HW10) {
|
||||
+ ab->qmi.service_ins_id = ab->hw_params.qmi_service_ins_id +
|
||||
+ (((pci_domain_nr(bus) & 0xF) << 4) | (bus->number & 0xF));
|
||||
+ } else
|
||||
+ ab->qmi.service_ins_id = ab->hw_params.qmi_service_ins_id;
|
||||
|
||||
ath11k_ce_get_shadow_config(ab, &cfg->shadow_reg_v2,
|
||||
&cfg->shadow_reg_v2_len);
|
||||
@@ -0,0 +1,62 @@
|
||||
From 824dde8652815aa67b4e2bf2d8a9455a8ef82b8f Mon Sep 17 00:00:00 2001
|
||||
From: Ziyang Huang <hzyitc@outlook.com>
|
||||
Date: Thu, 29 Jun 2023 06:12:45 +0000
|
||||
Subject: [PATCH] wifi: ath11k: Support setting bdf-addr and caldb-addr via DT
|
||||
|
||||
Signed-off-by: Ziyang Huang <hzyitc@outlook.com>
|
||||
---
|
||||
drivers/net/wireless/ath/ath11k/qmi.c | 15 +++++++++++----
|
||||
1 file changed, 11 insertions(+), 4 deletions(-)
|
||||
|
||||
--- a/drivers/net/wireless/ath/ath11k/qmi.c
|
||||
+++ b/drivers/net/wireless/ath/ath11k/qmi.c
|
||||
@@ -2041,6 +2041,7 @@ static int ath11k_qmi_assign_target_mem_
|
||||
struct device_node *hremote_node = NULL;
|
||||
struct resource res;
|
||||
u32 host_ddr_sz;
|
||||
+ u32 addr;
|
||||
int i, idx, ret;
|
||||
|
||||
for (i = 0, idx = 0; i < ab->qmi.mem_seg_count; i++) {
|
||||
@@ -2080,7 +2081,9 @@ static int ath11k_qmi_assign_target_mem_
|
||||
idx++;
|
||||
break;
|
||||
case BDF_MEM_REGION_TYPE:
|
||||
- ab->qmi.target_mem[idx].paddr = ab->hw_params.bdf_addr;
|
||||
+ if (of_property_read_u32(dev->of_node, "qcom,bdf-addr", &addr))
|
||||
+ addr = ab->hw_params.bdf_addr;
|
||||
+ ab->qmi.target_mem[idx].paddr = addr;
|
||||
ab->qmi.target_mem[idx].iaddr = NULL;
|
||||
ab->qmi.target_mem[idx].size = ab->qmi.target_mem[i].size;
|
||||
ab->qmi.target_mem[idx].type = ab->qmi.target_mem[i].type;
|
||||
@@ -2102,8 +2105,9 @@ static int ath11k_qmi_assign_target_mem_
|
||||
if (!ab->qmi.target_mem[idx].iaddr)
|
||||
return -EIO;
|
||||
} else {
|
||||
- ab->qmi.target_mem[idx].paddr =
|
||||
- ATH11K_QMI_CALDB_ADDRESS;
|
||||
+ if (of_property_read_u32(dev->of_node, "qcom,caldb-addr", &addr))
|
||||
+ addr = ATH11K_QMI_CALDB_ADDRESS;
|
||||
+ ab->qmi.target_mem[idx].paddr = addr;
|
||||
ab->qmi.target_mem[idx].iaddr = NULL;
|
||||
}
|
||||
} else {
|
||||
@@ -2309,6 +2313,7 @@ static int ath11k_qmi_load_file_target_m
|
||||
struct qmi_wlanfw_bdf_download_resp_msg_v01 resp;
|
||||
struct qmi_txn txn;
|
||||
const u8 *temp = data;
|
||||
+ u32 addr;
|
||||
void __iomem *bdf_addr = NULL;
|
||||
int ret = 0;
|
||||
u32 remaining = len;
|
||||
@@ -2320,7 +2325,9 @@ static int ath11k_qmi_load_file_target_m
|
||||
memset(&resp, 0, sizeof(resp));
|
||||
|
||||
if (ab->hw_params.fixed_bdf_addr) {
|
||||
- bdf_addr = ioremap(ab->hw_params.bdf_addr, ab->hw_params.fw.board_size);
|
||||
+ if(of_property_read_u32(ab->dev->of_node, "qcom,bdf-addr", &addr))
|
||||
+ addr = ab->hw_params.bdf_addr;
|
||||
+ bdf_addr = ioremap(addr, ab->hw_params.fw.board_size);
|
||||
if (!bdf_addr) {
|
||||
ath11k_warn(ab, "qmi ioremap error for bdf_addr\n");
|
||||
ret = -EIO;
|
||||
@@ -0,0 +1,66 @@
|
||||
From 703d6551f71e7290619d6effe2a25a64e10538b7 Mon Sep 17 00:00:00 2001
|
||||
From: Robert Marko <robimarko@gmail.com>
|
||||
Date: Thu, 15 Dec 2022 12:20:52 +0100
|
||||
Subject: [PATCH] ath11k: control thermal support via symbol
|
||||
|
||||
Currently, thermal support will get built if CONFIG_THERMAL is reachable,
|
||||
however this is not suitable for OpenWrt as with ALL_KMODS being set to y
|
||||
ATH11K_THERMAL wont get selected and so hwmon and thermal kmods wont get
|
||||
pulled in resulting in a build-failure.
|
||||
|
||||
So, to avoid that, lets do what is already done for ath10k and add a
|
||||
config symbol into backports for enabling thermal support.
|
||||
|
||||
Signed-off-by: Robert Marko <robimarko@gmail.com>
|
||||
---
|
||||
drivers/net/wireless/ath/ath11k/Kconfig | 7 +++++++
|
||||
drivers/net/wireless/ath/ath11k/Makefile | 2 +-
|
||||
drivers/net/wireless/ath/ath11k/thermal.h | 2 +-
|
||||
local-symbols | 1 +
|
||||
4 files changed, 10 insertions(+), 2 deletions(-)
|
||||
|
||||
--- a/drivers/net/wireless/ath/ath11k/Kconfig
|
||||
+++ b/drivers/net/wireless/ath/ath11k/Kconfig
|
||||
@@ -62,3 +62,10 @@ config ATH11K_SPECTRAL
|
||||
Enable ath11k spectral scan support
|
||||
|
||||
Say Y to enable access to the FFT/spectral data via debugfs.
|
||||
+
|
||||
+config ATH11K_THERMAL
|
||||
+ bool "ath11k thermal sensors and throttling support"
|
||||
+ depends on ATH11K
|
||||
+ depends on THERMAL
|
||||
+ help
|
||||
+ Enable ath11k thermal sensors and throttling support.
|
||||
--- a/drivers/net/wireless/ath/ath11k/Makefile
|
||||
+++ b/drivers/net/wireless/ath/ath11k/Makefile
|
||||
@@ -24,7 +24,7 @@ ath11k-y += core.o \
|
||||
ath11k-$(CPTCFG_ATH11K_DEBUGFS) += debugfs.o debugfs_htt_stats.o debugfs_sta.o
|
||||
ath11k-$(CPTCFG_NL80211_TESTMODE) += testmode.o
|
||||
ath11k-$(CPTCFG_ATH11K_TRACING) += trace.o
|
||||
-ath11k-$(CONFIG_THERMAL) += thermal.o
|
||||
+ath11k-$(CPTCFG_ATH11K_THERMAL) += thermal.o
|
||||
ath11k-$(CPTCFG_ATH11K_SPECTRAL) += spectral.o
|
||||
ath11k-$(CONFIG_PM) += wow.o
|
||||
ath11k-$(CONFIG_DEV_COREDUMP) += coredump.o
|
||||
--- a/drivers/net/wireless/ath/ath11k/thermal.h
|
||||
+++ b/drivers/net/wireless/ath/ath11k/thermal.h
|
||||
@@ -26,7 +26,7 @@ struct ath11k_thermal {
|
||||
int temperature;
|
||||
};
|
||||
|
||||
-#if IS_REACHABLE(CONFIG_THERMAL)
|
||||
+#if IS_REACHABLE(CPTCFG_ATH11K_THERMAL)
|
||||
int ath11k_thermal_register(struct ath11k_base *ab);
|
||||
void ath11k_thermal_unregister(struct ath11k_base *ab);
|
||||
int ath11k_thermal_set_throttling(struct ath11k *ar, u32 throttle_state);
|
||||
--- a/local-symbols
|
||||
+++ b/local-symbols
|
||||
@@ -162,6 +162,7 @@ ATH11K_DEBUG=
|
||||
ATH11K_DEBUGFS=
|
||||
ATH11K_TRACING=
|
||||
ATH11K_SPECTRAL=
|
||||
+ATH11K_THERMAL=
|
||||
ATH12K=
|
||||
ATH12K_AHB=
|
||||
ATH12K_DEBUG=
|
||||
@@ -0,0 +1,75 @@
|
||||
From fb1c40c225cbc413d82c872dd8c8af3469b2b921 Mon Sep 17 00:00:00 2001
|
||||
From: Robert Marko <robimarko@gmail.com>
|
||||
Date: Fri, 16 Dec 2022 17:17:52 +0100
|
||||
Subject: [PATCH] ath11k: support setting FW memory mode via DT
|
||||
|
||||
ath11k is really memory intensive for devices with less that 1GB of RAM,
|
||||
so lets allow saving a significant amount of memory by setting the FW to
|
||||
Mode-1 via DTS for devices that need it.
|
||||
|
||||
However the drawback is reduced number of VDEV-s and peers which is a
|
||||
reasonable tradeoff.
|
||||
|
||||
Mode-2 allows for further reduction, but it has further restrictions.
|
||||
|
||||
While we are here, lets add a print to be able to easily determine what
|
||||
FW memory mode is being used.
|
||||
|
||||
Signed-off-by: Robert Marko <robimarko@gmail.com>
|
||||
---
|
||||
drivers/net/wireless/ath/ath11k/core.c | 28 ++++++++++++++++++++++++--
|
||||
1 file changed, 26 insertions(+), 2 deletions(-)
|
||||
|
||||
--- a/drivers/net/wireless/ath/ath11k/core.c
|
||||
+++ b/drivers/net/wireless/ath/ath11k/core.c
|
||||
@@ -37,7 +37,7 @@ bool ath11k_ftm_mode;
|
||||
module_param_named(ftm_mode, ath11k_ftm_mode, bool, 0444);
|
||||
MODULE_PARM_DESC(ftm_mode, "Boots up in factory test mode");
|
||||
|
||||
-static const struct ath11k_hw_params ath11k_hw_params[] = {
|
||||
+static struct ath11k_hw_params ath11k_hw_params[] = {
|
||||
{
|
||||
.hw_rev = ATH11K_HW_IPQ8074,
|
||||
.name = "ipq8074 hw2.0",
|
||||
@@ -2481,7 +2481,8 @@ static void ath11k_core_reset(struct wor
|
||||
static int ath11k_init_hw_params(struct ath11k_base *ab)
|
||||
{
|
||||
const struct ath11k_hw_params *hw_params = NULL;
|
||||
- int i;
|
||||
+ u32 fw_mem_mode;
|
||||
+ int i, ret;
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(ath11k_hw_params); i++) {
|
||||
hw_params = &ath11k_hw_params[i];
|
||||
@@ -2497,7 +2498,31 @@ static int ath11k_init_hw_params(struct
|
||||
|
||||
ab->hw_params = *hw_params;
|
||||
|
||||
+ ret = of_property_read_u32(ab->dev->of_node,
|
||||
+ "qcom,ath11k-fw-memory-mode",
|
||||
+ &fw_mem_mode);
|
||||
+ if (!ret) {
|
||||
+ if (fw_mem_mode == 0) {
|
||||
+ ab->hw_params.fw_mem_mode = 0;
|
||||
+ ab->hw_params.num_vdevs = 16 + 1;
|
||||
+ ab->hw_params.num_peers = 512;
|
||||
+ }
|
||||
+ else if (fw_mem_mode == 1) {
|
||||
+ ab->hw_params.fw_mem_mode = 1;
|
||||
+ ab->hw_params.num_vdevs = 8;
|
||||
+ ab->hw_params.num_peers = 128;
|
||||
+ } else if (fw_mem_mode == 2) {
|
||||
+ ab->hw_params.fw_mem_mode = 2;
|
||||
+ ab->hw_params.num_vdevs = 8;
|
||||
+ ab->hw_params.num_peers = 128;
|
||||
+ ab->hw_params.coldboot_cal_mm = false;
|
||||
+ ab->hw_params.coldboot_cal_ftm = false;
|
||||
+ } else
|
||||
+ ath11k_info(ab, "Unsupported FW memory mode: %u\n", fw_mem_mode);
|
||||
+ }
|
||||
+
|
||||
ath11k_info(ab, "%s\n", ab->hw_params.name);
|
||||
+ ath11k_info(ab, "FW memory mode: %d\n", ab->hw_params.fw_mem_mode);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -0,0 +1,332 @@
|
||||
From abdd0985a36189ef2cc0e393b027276e86137ace Mon Sep 17 00:00:00 2001
|
||||
From: Aditya Kumar Singh <quic_adisi@quicinc.com>
|
||||
Date: Tue, 11 Apr 2023 20:08:49 +0200
|
||||
Subject: [PATCH] ath11k: remove intersection support for regulatory rules
|
||||
|
||||
Currently, regulatory rules from new country settings is intersected with
|
||||
rules from default country settings(during initialisation) in order to prevent
|
||||
users to bypass their default country settings such as power limits, channel
|
||||
flags, etc.
|
||||
|
||||
However, the country setting in the BDF will take higher higher precendence
|
||||
and FW will protect it. Therefore, there is no need to handle intersection
|
||||
on the driver side now.
|
||||
|
||||
Remove regulatory rules intersection logic support.
|
||||
|
||||
Signed-off-by: Aditya Kumar Singh <quic_adisi@quicinc.com>
|
||||
---
|
||||
drivers/net/wireless/ath/ath11k/reg.c | 168 +++-----------------------
|
||||
drivers/net/wireless/ath/ath11k/reg.h | 2 +-
|
||||
drivers/net/wireless/ath/ath11k/wmi.c | 24 +---
|
||||
3 files changed, 16 insertions(+), 178 deletions(-)
|
||||
|
||||
--- a/drivers/net/wireless/ath/ath11k/reg.c
|
||||
+++ b/drivers/net/wireless/ath/ath11k/reg.c
|
||||
@@ -353,134 +353,6 @@ static u32 ath11k_map_fw_phy_flags(u32 p
|
||||
return flags;
|
||||
}
|
||||
|
||||
-static bool
|
||||
-ath11k_reg_can_intersect(struct ieee80211_reg_rule *rule1,
|
||||
- struct ieee80211_reg_rule *rule2)
|
||||
-{
|
||||
- u32 start_freq1, end_freq1;
|
||||
- u32 start_freq2, end_freq2;
|
||||
-
|
||||
- start_freq1 = rule1->freq_range.start_freq_khz;
|
||||
- start_freq2 = rule2->freq_range.start_freq_khz;
|
||||
-
|
||||
- end_freq1 = rule1->freq_range.end_freq_khz;
|
||||
- end_freq2 = rule2->freq_range.end_freq_khz;
|
||||
-
|
||||
- if ((start_freq1 >= start_freq2 &&
|
||||
- start_freq1 < end_freq2) ||
|
||||
- (start_freq2 > start_freq1 &&
|
||||
- start_freq2 < end_freq1))
|
||||
- return true;
|
||||
-
|
||||
- /* TODO: Should we restrict intersection feasibility
|
||||
- * based on min bandwidth of the intersected region also,
|
||||
- * say the intersected rule should have a min bandwidth
|
||||
- * of 20MHz?
|
||||
- */
|
||||
-
|
||||
- return false;
|
||||
-}
|
||||
-
|
||||
-static void ath11k_reg_intersect_rules(struct ieee80211_reg_rule *rule1,
|
||||
- struct ieee80211_reg_rule *rule2,
|
||||
- struct ieee80211_reg_rule *new_rule)
|
||||
-{
|
||||
- u32 start_freq1, end_freq1;
|
||||
- u32 start_freq2, end_freq2;
|
||||
- u32 freq_diff, max_bw;
|
||||
-
|
||||
- start_freq1 = rule1->freq_range.start_freq_khz;
|
||||
- start_freq2 = rule2->freq_range.start_freq_khz;
|
||||
-
|
||||
- end_freq1 = rule1->freq_range.end_freq_khz;
|
||||
- end_freq2 = rule2->freq_range.end_freq_khz;
|
||||
-
|
||||
- new_rule->freq_range.start_freq_khz = max_t(u32, start_freq1,
|
||||
- start_freq2);
|
||||
- new_rule->freq_range.end_freq_khz = min_t(u32, end_freq1, end_freq2);
|
||||
-
|
||||
- freq_diff = new_rule->freq_range.end_freq_khz -
|
||||
- new_rule->freq_range.start_freq_khz;
|
||||
- max_bw = min_t(u32, rule1->freq_range.max_bandwidth_khz,
|
||||
- rule2->freq_range.max_bandwidth_khz);
|
||||
- new_rule->freq_range.max_bandwidth_khz = min_t(u32, max_bw, freq_diff);
|
||||
-
|
||||
- new_rule->power_rule.max_antenna_gain =
|
||||
- min_t(u32, rule1->power_rule.max_antenna_gain,
|
||||
- rule2->power_rule.max_antenna_gain);
|
||||
-
|
||||
- new_rule->power_rule.max_eirp = min_t(u32, rule1->power_rule.max_eirp,
|
||||
- rule2->power_rule.max_eirp);
|
||||
-
|
||||
- /* Use the flags of both the rules */
|
||||
- new_rule->flags = rule1->flags | rule2->flags;
|
||||
-
|
||||
- if ((rule1->flags & NL80211_RRF_PSD) && (rule2->flags & NL80211_RRF_PSD))
|
||||
- new_rule->psd = min_t(s8, rule1->psd, rule2->psd);
|
||||
- else
|
||||
- new_rule->flags &= ~NL80211_RRF_PSD;
|
||||
-
|
||||
- /* To be safe, lts use the max cac timeout of both rules */
|
||||
- new_rule->dfs_cac_ms = max_t(u32, rule1->dfs_cac_ms,
|
||||
- rule2->dfs_cac_ms);
|
||||
-}
|
||||
-
|
||||
-static struct ieee80211_regdomain *
|
||||
-ath11k_regd_intersect(struct ieee80211_regdomain *default_regd,
|
||||
- struct ieee80211_regdomain *curr_regd)
|
||||
-{
|
||||
- u8 num_old_regd_rules, num_curr_regd_rules, num_new_regd_rules;
|
||||
- struct ieee80211_reg_rule *old_rule, *curr_rule, *new_rule;
|
||||
- struct ieee80211_regdomain *new_regd = NULL;
|
||||
- u8 i, j, k;
|
||||
-
|
||||
- num_old_regd_rules = default_regd->n_reg_rules;
|
||||
- num_curr_regd_rules = curr_regd->n_reg_rules;
|
||||
- num_new_regd_rules = 0;
|
||||
-
|
||||
- /* Find the number of intersecting rules to allocate new regd memory */
|
||||
- for (i = 0; i < num_old_regd_rules; i++) {
|
||||
- old_rule = default_regd->reg_rules + i;
|
||||
- for (j = 0; j < num_curr_regd_rules; j++) {
|
||||
- curr_rule = curr_regd->reg_rules + j;
|
||||
-
|
||||
- if (ath11k_reg_can_intersect(old_rule, curr_rule))
|
||||
- num_new_regd_rules++;
|
||||
- }
|
||||
- }
|
||||
-
|
||||
- if (!num_new_regd_rules)
|
||||
- return NULL;
|
||||
-
|
||||
- new_regd = kzalloc(sizeof(*new_regd) + (num_new_regd_rules *
|
||||
- sizeof(struct ieee80211_reg_rule)),
|
||||
- GFP_ATOMIC);
|
||||
-
|
||||
- if (!new_regd)
|
||||
- return NULL;
|
||||
-
|
||||
- /* We set the new country and dfs region directly and only trim
|
||||
- * the freq, power, antenna gain by intersecting with the
|
||||
- * default regdomain. Also MAX of the dfs cac timeout is selected.
|
||||
- */
|
||||
- new_regd->n_reg_rules = num_new_regd_rules;
|
||||
- memcpy(new_regd->alpha2, curr_regd->alpha2, sizeof(new_regd->alpha2));
|
||||
- new_regd->dfs_region = curr_regd->dfs_region;
|
||||
- new_rule = new_regd->reg_rules;
|
||||
-
|
||||
- for (i = 0, k = 0; i < num_old_regd_rules; i++) {
|
||||
- old_rule = default_regd->reg_rules + i;
|
||||
- for (j = 0; j < num_curr_regd_rules; j++) {
|
||||
- curr_rule = curr_regd->reg_rules + j;
|
||||
-
|
||||
- if (ath11k_reg_can_intersect(old_rule, curr_rule))
|
||||
- ath11k_reg_intersect_rules(old_rule, curr_rule,
|
||||
- (new_rule + k++));
|
||||
- }
|
||||
- }
|
||||
- return new_regd;
|
||||
-}
|
||||
-
|
||||
static const char *
|
||||
ath11k_reg_get_regdom_str(enum nl80211_dfs_regions dfs_region)
|
||||
{
|
||||
@@ -631,11 +503,11 @@ ath11k_reg_ap_pwr_convert(enum ieee80211
|
||||
|
||||
struct ieee80211_regdomain *
|
||||
ath11k_reg_build_regd(struct ath11k_base *ab,
|
||||
- struct cur_regulatory_info *reg_info, bool intersect,
|
||||
+ struct cur_regulatory_info *reg_info,
|
||||
enum wmi_vdev_type vdev_type,
|
||||
enum ieee80211_ap_reg_power power_type)
|
||||
{
|
||||
- struct ieee80211_regdomain *tmp_regd, *default_regd, *new_regd = NULL;
|
||||
+ struct ieee80211_regdomain *new_regd = NULL;
|
||||
struct cur_reg_rule *reg_rule, *reg_rule_6ghz;
|
||||
u8 i = 0, j = 0, k = 0;
|
||||
u8 num_rules;
|
||||
@@ -678,26 +550,26 @@ ath11k_reg_build_regd(struct ath11k_base
|
||||
}
|
||||
|
||||
if (!num_rules)
|
||||
- goto ret;
|
||||
+ return new_regd;
|
||||
|
||||
/* Add max additional rules to accommodate weather radar band */
|
||||
if (reg_info->dfs_region == ATH11K_DFS_REG_ETSI)
|
||||
num_rules += 2;
|
||||
|
||||
- tmp_regd = kzalloc(sizeof(*tmp_regd) +
|
||||
+ new_regd = kzalloc(sizeof(*new_regd) +
|
||||
(num_rules * sizeof(struct ieee80211_reg_rule)),
|
||||
GFP_ATOMIC);
|
||||
- if (!tmp_regd)
|
||||
- goto ret;
|
||||
+ if (!new_regd)
|
||||
+ return new_regd;
|
||||
|
||||
- memcpy(tmp_regd->alpha2, reg_info->alpha2, REG_ALPHA2_LEN + 1);
|
||||
+ memcpy(new_regd->alpha2, reg_info->alpha2, REG_ALPHA2_LEN + 1);
|
||||
memcpy(alpha2, reg_info->alpha2, REG_ALPHA2_LEN + 1);
|
||||
alpha2[2] = '\0';
|
||||
- tmp_regd->dfs_region = ath11k_map_fw_dfs_region(reg_info->dfs_region);
|
||||
+ new_regd->dfs_region = ath11k_map_fw_dfs_region(reg_info->dfs_region);
|
||||
|
||||
ath11k_dbg(ab, ATH11K_DBG_REG,
|
||||
"Country %s, CFG Regdomain %s FW Regdomain %d, num_reg_rules %d\n",
|
||||
- alpha2, ath11k_reg_get_regdom_str(tmp_regd->dfs_region),
|
||||
+ alpha2, ath11k_reg_get_regdom_str(new_regd->dfs_region),
|
||||
reg_info->dfs_region, num_rules);
|
||||
/* Update reg_rules[] below. Firmware is expected to
|
||||
* send these rules in order(2 GHz rules first and then 5 GHz)
|
||||
@@ -736,7 +608,7 @@ ath11k_reg_build_regd(struct ath11k_base
|
||||
flags |= ath11k_map_fw_reg_flags(reg_rule->flags);
|
||||
flags |= ath11k_map_fw_phy_flags(reg_info->phybitmap);
|
||||
|
||||
- ath11k_reg_update_rule(tmp_regd->reg_rules + i,
|
||||
+ ath11k_reg_update_rule(new_regd->reg_rules + i,
|
||||
reg_rule->start_freq,
|
||||
reg_rule->end_freq, max_bw,
|
||||
reg_rule->ant_gain, reg_rule->reg_power,
|
||||
@@ -751,7 +623,7 @@ ath11k_reg_build_regd(struct ath11k_base
|
||||
reg_info->dfs_region == ATH11K_DFS_REG_ETSI &&
|
||||
(reg_rule->end_freq > ETSI_WEATHER_RADAR_BAND_LOW &&
|
||||
reg_rule->start_freq < ETSI_WEATHER_RADAR_BAND_HIGH)){
|
||||
- ath11k_reg_update_weather_radar_band(ab, tmp_regd,
|
||||
+ ath11k_reg_update_weather_radar_band(ab, new_regd,
|
||||
reg_rule, &i,
|
||||
flags, max_bw);
|
||||
continue;
|
||||
@@ -762,37 +634,20 @@ ath11k_reg_build_regd(struct ath11k_base
|
||||
"\t%d. (%d - %d @ %d) (%d, %d) (%d ms) (FLAGS %d) (%d, %d)\n",
|
||||
i + 1, reg_rule->start_freq, reg_rule->end_freq,
|
||||
max_bw, reg_rule->ant_gain, reg_rule->reg_power,
|
||||
- tmp_regd->reg_rules[i].dfs_cac_ms, flags,
|
||||
+ new_regd->reg_rules[i].dfs_cac_ms, flags,
|
||||
reg_rule->psd_flag, reg_rule->psd_eirp);
|
||||
} else {
|
||||
ath11k_dbg(ab, ATH11K_DBG_REG,
|
||||
"\t%d. (%d - %d @ %d) (%d, %d) (%d ms) (FLAGS %d)\n",
|
||||
i + 1, reg_rule->start_freq, reg_rule->end_freq,
|
||||
max_bw, reg_rule->ant_gain, reg_rule->reg_power,
|
||||
- tmp_regd->reg_rules[i].dfs_cac_ms,
|
||||
+ new_regd->reg_rules[i].dfs_cac_ms,
|
||||
flags);
|
||||
}
|
||||
}
|
||||
|
||||
- tmp_regd->n_reg_rules = i;
|
||||
+ new_regd->n_reg_rules = i;
|
||||
|
||||
- if (intersect) {
|
||||
- default_regd = ab->default_regd[reg_info->phy_id];
|
||||
-
|
||||
- /* Get a new regd by intersecting the received regd with
|
||||
- * our default regd.
|
||||
- */
|
||||
- new_regd = ath11k_regd_intersect(default_regd, tmp_regd);
|
||||
- kfree(tmp_regd);
|
||||
- if (!new_regd) {
|
||||
- ath11k_warn(ab, "Unable to create intersected regdomain\n");
|
||||
- goto ret;
|
||||
- }
|
||||
- } else {
|
||||
- new_regd = tmp_regd;
|
||||
- }
|
||||
-
|
||||
-ret:
|
||||
return new_regd;
|
||||
}
|
||||
|
||||
@@ -844,17 +699,6 @@ void ath11k_regd_update_chan_list_work(s
|
||||
}
|
||||
}
|
||||
|
||||
-static bool ath11k_reg_is_world_alpha(char *alpha)
|
||||
-{
|
||||
- if (alpha[0] == '0' && alpha[1] == '0')
|
||||
- return true;
|
||||
-
|
||||
- if (alpha[0] == 'n' && alpha[1] == 'a')
|
||||
- return true;
|
||||
-
|
||||
- return false;
|
||||
-}
|
||||
-
|
||||
static enum wmi_vdev_type ath11k_reg_get_ar_vdev_type(struct ath11k *ar)
|
||||
{
|
||||
struct ath11k_vif *arvif;
|
||||
@@ -877,7 +721,6 @@ int ath11k_reg_handle_chan_list(struct a
|
||||
enum ieee80211_ap_reg_power power_type)
|
||||
{
|
||||
struct ieee80211_regdomain *regd;
|
||||
- bool intersect = false;
|
||||
int pdev_idx;
|
||||
struct ath11k *ar;
|
||||
enum wmi_vdev_type vdev_type;
|
||||
@@ -929,24 +772,14 @@ int ath11k_reg_handle_chan_list(struct a
|
||||
(char *)reg_info->alpha2, 2))
|
||||
goto retfail;
|
||||
|
||||
- /* Intersect new rules with default regd if a new country setting was
|
||||
- * requested, i.e a default regd was already set during initialization
|
||||
- * and the regd coming from this event has a valid country info.
|
||||
- */
|
||||
- if (ab->default_regd[pdev_idx] &&
|
||||
- !ath11k_reg_is_world_alpha((char *)
|
||||
- ab->default_regd[pdev_idx]->alpha2) &&
|
||||
- !ath11k_reg_is_world_alpha((char *)reg_info->alpha2))
|
||||
- intersect = true;
|
||||
-
|
||||
ar = ab->pdevs[pdev_idx].ar;
|
||||
vdev_type = ath11k_reg_get_ar_vdev_type(ar);
|
||||
|
||||
ath11k_dbg(ab, ATH11K_DBG_WMI,
|
||||
- "wmi handle chan list power type %d vdev type %d intersect %d\n",
|
||||
- power_type, vdev_type, intersect);
|
||||
+ "wmi handle chan list power type %d vdev type %d\n",
|
||||
+ power_type, vdev_type);
|
||||
|
||||
- regd = ath11k_reg_build_regd(ab, reg_info, intersect, vdev_type, power_type);
|
||||
+ regd = ath11k_reg_build_regd(ab, reg_info, vdev_type, power_type);
|
||||
if (!regd) {
|
||||
ath11k_warn(ab, "failed to build regd from reg_info\n");
|
||||
goto fallback;
|
||||
--- a/drivers/net/wireless/ath/ath11k/reg.h
|
||||
+++ b/drivers/net/wireless/ath/ath11k/reg.h
|
||||
@@ -36,7 +36,7 @@ void ath11k_regd_update_work(struct work
|
||||
void ath11k_regd_update_chan_list_work(struct work_struct *work);
|
||||
struct ieee80211_regdomain *
|
||||
ath11k_reg_build_regd(struct ath11k_base *ab,
|
||||
- struct cur_regulatory_info *reg_info, bool intersect,
|
||||
+ struct cur_regulatory_info *reg_info,
|
||||
enum wmi_vdev_type vdev_type,
|
||||
enum ieee80211_ap_reg_power power_type);
|
||||
int ath11k_regd_update(struct ath11k *ar);
|
||||
@@ -0,0 +1,26 @@
|
||||
From a3be23672b4a81256d275af31afc6edcce5c5a26 Mon Sep 17 00:00:00 2001
|
||||
From: Mantas Pucka <mantas@8devices.com>
|
||||
Date: Mon, 22 Jan 2024 11:38:28 +0200
|
||||
Subject: [PATCH] wifi: ath11k: disable coldboot for ipq6018
|
||||
|
||||
Coldboot calibration does not work at the moment and causes failure during
|
||||
wifi startup.
|
||||
|
||||
Signed-off-by: Mantas Pucka <mantas@8devices.com>
|
||||
---
|
||||
drivers/net/wireless/ath/ath11k/core.c | 4 ++--
|
||||
1 file changed, 2 insertions(+), 2 deletions(-)
|
||||
|
||||
--- a/drivers/net/wireless/ath/ath11k/core.c
|
||||
+++ b/drivers/net/wireless/ath/ath11k/core.c
|
||||
@@ -171,8 +171,8 @@ static struct ath11k_hw_params ath11k_hw
|
||||
.supports_shadow_regs = false,
|
||||
.idle_ps = false,
|
||||
.supports_sta_ps = false,
|
||||
- .coldboot_cal_mm = true,
|
||||
- .coldboot_cal_ftm = true,
|
||||
+ .coldboot_cal_mm = false,
|
||||
+ .coldboot_cal_ftm = false,
|
||||
.cbcal_restart_fw = true,
|
||||
.fw_mem_mode = 0,
|
||||
.num_vdevs = 16 + 1,
|
||||
@@ -0,0 +1,27 @@
|
||||
From b2d16b688ce04b67f2033f90f49f4add7ebd3fe8 Mon Sep 17 00:00:00 2001
|
||||
From: George Moussalem <george.moussalem@outlook.com>
|
||||
Date: Tue, 10 Jun 2025 14:34:37 +0400
|
||||
Subject: [PATCH] wifi: ath11k: disable coldboot calibration for ipq5018
|
||||
|
||||
Coldboot calibration does not work causes the firmware to crash during
|
||||
wifi startup. So let's disable coldboot calibration until a solution is
|
||||
found.
|
||||
|
||||
Signed-off-by: George Moussalem <george.moussalem@outlook.com>
|
||||
---
|
||||
drivers/net/wireless/ath/ath11k/core.c | 4 ++--
|
||||
1 file changed, 2 insertions(+), 2 deletions(-)
|
||||
|
||||
--- a/drivers/net/wireless/ath/ath11k/core.c
|
||||
+++ b/drivers/net/wireless/ath/ath11k/core.c
|
||||
@@ -698,8 +698,8 @@ static struct ath11k_hw_params ath11k_hw
|
||||
.supports_suspend = false,
|
||||
.hal_params = &ath11k_hw_hal_params_ipq8074,
|
||||
.single_pdev_only = false,
|
||||
- .coldboot_cal_mm = true,
|
||||
- .coldboot_cal_ftm = true,
|
||||
+ .coldboot_cal_mm = false,
|
||||
+ .coldboot_cal_ftm = false,
|
||||
.cbcal_restart_fw = true,
|
||||
.fix_l1ss = true,
|
||||
.supports_dynamic_smps_6ghz = false,
|
||||
@@ -0,0 +1,153 @@
|
||||
From: Ziyang Huang <hzyitc@outlook.com>
|
||||
Date: Thu, 2 May 2024 00:14:31 +0800
|
||||
Subject: [PATCH] wifi: ath11k: fix remapped ce accessing issue on 64bit OS
|
||||
|
||||
On 64bit OS, when ab->mem_ce is lower than or 4G far away from ab->mem,
|
||||
u32 is not enough to store the offsets, which makes ath11k_ahb_read32()
|
||||
and ath11k_ahb_write32() access incorrect address and causes Data Abort
|
||||
Exception.
|
||||
|
||||
Let's use the high bits of offsets to decide where to access, which is
|
||||
similar as ath11k_pci_get_window_start() done. In the future, we can merge
|
||||
these functions for unified regs accessing.
|
||||
|
||||
Signed-off-by: Ziyang Huang <hzyitc@outlook.com>
|
||||
---
|
||||
|
||||
--- a/drivers/net/wireless/ath/ath11k/ahb.c
|
||||
+++ b/drivers/net/wireless/ath/ath11k/ahb.c
|
||||
@@ -198,12 +198,18 @@ static const struct ath11k_pci_ops ath11
|
||||
|
||||
static inline u32 ath11k_ahb_read32(struct ath11k_base *ab, u32 offset)
|
||||
{
|
||||
- return ioread32(ab->mem + offset);
|
||||
+ if ((offset & ATH11K_REG_TYPE_MASK) == ATH11K_REG_TYPE_CE)
|
||||
+ return ioread32(ab->mem_ce + FIELD_GET(ATH11K_REG_OFFSET_MASK, offset));
|
||||
+ else
|
||||
+ return ioread32(ab->mem + FIELD_GET(ATH11K_REG_OFFSET_MASK, offset));
|
||||
}
|
||||
|
||||
static inline void ath11k_ahb_write32(struct ath11k_base *ab, u32 offset, u32 value)
|
||||
{
|
||||
- iowrite32(value, ab->mem + offset);
|
||||
+ if ((offset & ATH11K_REG_TYPE_MASK) == ATH11K_REG_TYPE_CE)
|
||||
+ iowrite32(value, ab->mem_ce + FIELD_GET(ATH11K_REG_OFFSET_MASK, offset));
|
||||
+ else
|
||||
+ iowrite32(value, ab->mem + FIELD_GET(ATH11K_REG_OFFSET_MASK, offset));
|
||||
}
|
||||
|
||||
static void ath11k_ahb_kill_tasklets(struct ath11k_base *ab)
|
||||
@@ -275,9 +281,9 @@ static void ath11k_ahb_ce_irq_enable(str
|
||||
const struct ce_ie_addr *ce_ie_addr = ab->hw_params.ce_ie_addr;
|
||||
u32 ie1_reg_addr, ie2_reg_addr, ie3_reg_addr;
|
||||
|
||||
- ie1_reg_addr = ce_ie_addr->ie1_reg_addr + ATH11K_CE_OFFSET(ab);
|
||||
- ie2_reg_addr = ce_ie_addr->ie2_reg_addr + ATH11K_CE_OFFSET(ab);
|
||||
- ie3_reg_addr = ce_ie_addr->ie3_reg_addr + ATH11K_CE_OFFSET(ab);
|
||||
+ ie1_reg_addr = ce_ie_addr->ie1_reg_addr;
|
||||
+ ie2_reg_addr = ce_ie_addr->ie2_reg_addr;
|
||||
+ ie3_reg_addr = ce_ie_addr->ie3_reg_addr;
|
||||
|
||||
ce_attr = &ab->hw_params.host_ce_config[ce_id];
|
||||
if (ce_attr->src_nentries)
|
||||
@@ -296,9 +302,9 @@ static void ath11k_ahb_ce_irq_disable(st
|
||||
const struct ce_ie_addr *ce_ie_addr = ab->hw_params.ce_ie_addr;
|
||||
u32 ie1_reg_addr, ie2_reg_addr, ie3_reg_addr;
|
||||
|
||||
- ie1_reg_addr = ce_ie_addr->ie1_reg_addr + ATH11K_CE_OFFSET(ab);
|
||||
- ie2_reg_addr = ce_ie_addr->ie2_reg_addr + ATH11K_CE_OFFSET(ab);
|
||||
- ie3_reg_addr = ce_ie_addr->ie3_reg_addr + ATH11K_CE_OFFSET(ab);
|
||||
+ ie1_reg_addr = ce_ie_addr->ie1_reg_addr;
|
||||
+ ie2_reg_addr = ce_ie_addr->ie2_reg_addr;
|
||||
+ ie3_reg_addr = ce_ie_addr->ie3_reg_addr;
|
||||
|
||||
ce_attr = &ab->hw_params.host_ce_config[ce_id];
|
||||
if (ce_attr->src_nentries)
|
||||
--- a/drivers/net/wireless/ath/ath11k/hal.c
|
||||
+++ b/drivers/net/wireless/ath/ath11k/hal.c
|
||||
@@ -1247,20 +1247,16 @@ static int ath11k_hal_srng_create_config
|
||||
s->reg_start[1] = HAL_SEQ_WCSS_UMAC_TCL_REG + HAL_TCL_STATUS_RING_HP;
|
||||
|
||||
s = &hal->srng_config[HAL_CE_SRC];
|
||||
- s->reg_start[0] = HAL_SEQ_WCSS_UMAC_CE0_SRC_REG(ab) + HAL_CE_DST_RING_BASE_LSB +
|
||||
- ATH11K_CE_OFFSET(ab);
|
||||
- s->reg_start[1] = HAL_SEQ_WCSS_UMAC_CE0_SRC_REG(ab) + HAL_CE_DST_RING_HP +
|
||||
- ATH11K_CE_OFFSET(ab);
|
||||
+ s->reg_start[0] = HAL_SEQ_WCSS_UMAC_CE0_SRC_REG(ab) + HAL_CE_DST_RING_BASE_LSB;
|
||||
+ s->reg_start[1] = HAL_SEQ_WCSS_UMAC_CE0_SRC_REG(ab) + HAL_CE_DST_RING_HP;
|
||||
s->reg_size[0] = HAL_SEQ_WCSS_UMAC_CE1_SRC_REG(ab) -
|
||||
HAL_SEQ_WCSS_UMAC_CE0_SRC_REG(ab);
|
||||
s->reg_size[1] = HAL_SEQ_WCSS_UMAC_CE1_SRC_REG(ab) -
|
||||
HAL_SEQ_WCSS_UMAC_CE0_SRC_REG(ab);
|
||||
|
||||
s = &hal->srng_config[HAL_CE_DST];
|
||||
- s->reg_start[0] = HAL_SEQ_WCSS_UMAC_CE0_DST_REG(ab) + HAL_CE_DST_RING_BASE_LSB +
|
||||
- ATH11K_CE_OFFSET(ab);
|
||||
- s->reg_start[1] = HAL_SEQ_WCSS_UMAC_CE0_DST_REG(ab) + HAL_CE_DST_RING_HP +
|
||||
- ATH11K_CE_OFFSET(ab);
|
||||
+ s->reg_start[0] = HAL_SEQ_WCSS_UMAC_CE0_DST_REG(ab) + HAL_CE_DST_RING_BASE_LSB;
|
||||
+ s->reg_start[1] = HAL_SEQ_WCSS_UMAC_CE0_DST_REG(ab) + HAL_CE_DST_RING_HP;
|
||||
s->reg_size[0] = HAL_SEQ_WCSS_UMAC_CE1_DST_REG(ab) -
|
||||
HAL_SEQ_WCSS_UMAC_CE0_DST_REG(ab);
|
||||
s->reg_size[1] = HAL_SEQ_WCSS_UMAC_CE1_DST_REG(ab) -
|
||||
@@ -1268,9 +1264,8 @@ static int ath11k_hal_srng_create_config
|
||||
|
||||
s = &hal->srng_config[HAL_CE_DST_STATUS];
|
||||
s->reg_start[0] = HAL_SEQ_WCSS_UMAC_CE0_DST_REG(ab) +
|
||||
- HAL_CE_DST_STATUS_RING_BASE_LSB + ATH11K_CE_OFFSET(ab);
|
||||
- s->reg_start[1] = HAL_SEQ_WCSS_UMAC_CE0_DST_REG(ab) + HAL_CE_DST_STATUS_RING_HP +
|
||||
- ATH11K_CE_OFFSET(ab);
|
||||
+ HAL_CE_DST_STATUS_RING_BASE_LSB;
|
||||
+ s->reg_start[1] = HAL_SEQ_WCSS_UMAC_CE0_DST_REG(ab) + HAL_CE_DST_STATUS_RING_HP;
|
||||
s->reg_size[0] = HAL_SEQ_WCSS_UMAC_CE1_DST_REG(ab) -
|
||||
HAL_SEQ_WCSS_UMAC_CE0_DST_REG(ab);
|
||||
s->reg_size[1] = HAL_SEQ_WCSS_UMAC_CE1_DST_REG(ab) -
|
||||
--- a/drivers/net/wireless/ath/ath11k/hw.c
|
||||
+++ b/drivers/net/wireless/ath/ath11k/hw.c
|
||||
@@ -2268,9 +2268,9 @@ const struct ce_ie_addr ath11k_ce_ie_add
|
||||
};
|
||||
|
||||
const struct ce_ie_addr ath11k_ce_ie_addr_ipq5018 = {
|
||||
- .ie1_reg_addr = CE_HOST_IPQ5018_IE_ADDRESS - HAL_IPQ5018_CE_WFSS_REG_BASE,
|
||||
- .ie2_reg_addr = CE_HOST_IPQ5018_IE_2_ADDRESS - HAL_IPQ5018_CE_WFSS_REG_BASE,
|
||||
- .ie3_reg_addr = CE_HOST_IPQ5018_IE_3_ADDRESS - HAL_IPQ5018_CE_WFSS_REG_BASE,
|
||||
+ .ie1_reg_addr = ATH11K_REG_TYPE_CE + CE_HOST_IPQ5018_IE_ADDRESS - HAL_IPQ5018_CE_WFSS_REG_BASE,
|
||||
+ .ie2_reg_addr = ATH11K_REG_TYPE_CE + CE_HOST_IPQ5018_IE_2_ADDRESS - HAL_IPQ5018_CE_WFSS_REG_BASE,
|
||||
+ .ie3_reg_addr = ATH11K_REG_TYPE_CE + CE_HOST_IPQ5018_IE_3_ADDRESS - HAL_IPQ5018_CE_WFSS_REG_BASE,
|
||||
};
|
||||
|
||||
const struct ce_remap ath11k_ce_remap_ipq5018 = {
|
||||
@@ -2801,13 +2801,13 @@ const struct ath11k_hw_regs ipq5018_regs
|
||||
.hal_reo_status_hp = 0x00003070,
|
||||
|
||||
/* WCSS relative address */
|
||||
- .hal_seq_wcss_umac_ce0_src_reg = 0x08400000
|
||||
+ .hal_seq_wcss_umac_ce0_src_reg = ATH11K_REG_TYPE_CE + 0x08400000
|
||||
- HAL_IPQ5018_CE_WFSS_REG_BASE,
|
||||
- .hal_seq_wcss_umac_ce0_dst_reg = 0x08401000
|
||||
+ .hal_seq_wcss_umac_ce0_dst_reg = ATH11K_REG_TYPE_CE + 0x08401000
|
||||
- HAL_IPQ5018_CE_WFSS_REG_BASE,
|
||||
- .hal_seq_wcss_umac_ce1_src_reg = 0x08402000
|
||||
+ .hal_seq_wcss_umac_ce1_src_reg = ATH11K_REG_TYPE_CE + 0x08402000
|
||||
- HAL_IPQ5018_CE_WFSS_REG_BASE,
|
||||
- .hal_seq_wcss_umac_ce1_dst_reg = 0x08403000
|
||||
+ .hal_seq_wcss_umac_ce1_dst_reg = ATH11K_REG_TYPE_CE + 0x08403000
|
||||
- HAL_IPQ5018_CE_WFSS_REG_BASE,
|
||||
|
||||
/* WBM Idle address */
|
||||
--- a/drivers/net/wireless/ath/ath11k/hw.h
|
||||
+++ b/drivers/net/wireless/ath/ath11k/hw.h
|
||||
@@ -81,7 +81,12 @@
|
||||
#define ATH11K_M3_FILE "m3.bin"
|
||||
#define ATH11K_REGDB_FILE_NAME "regdb.bin"
|
||||
|
||||
-#define ATH11K_CE_OFFSET(ab) (ab->mem_ce - ab->mem)
|
||||
+#define ATH11K_REG_TYPE_MASK GENMASK(31, 28)
|
||||
+#define ATH11K_REG_TYPE(x) FIELD_PREP_CONST(ATH11K_REG_TYPE_MASK, x)
|
||||
+#define ATH11K_REG_TYPE_NORMAL ATH11K_REG_TYPE(0)
|
||||
+#define ATH11K_REG_TYPE_DP ATH11K_REG_TYPE(1)
|
||||
+#define ATH11K_REG_TYPE_CE ATH11K_REG_TYPE(2)
|
||||
+#define ATH11K_REG_OFFSET_MASK GENMASK(27, 0)
|
||||
|
||||
enum ath11k_hw_rate_cck {
|
||||
ATH11K_HW_RATE_CCK_LP_11M = 0,
|
||||
120
patches/ath11k/920-wifi-ath11k-add-hw-params-for-QCN6122.patch
Normal file
120
patches/ath11k/920-wifi-ath11k-add-hw-params-for-QCN6122.patch
Normal file
@@ -0,0 +1,120 @@
|
||||
From: George Moussalem <george.moussalem@outlook.com>
|
||||
Date: Wed, 27 Oct 2024 16:34:11 +0400
|
||||
Subject: [PATCH] wifi: ath11k: add hw params for QCN6122
|
||||
|
||||
Add QCN6122 platform support.
|
||||
|
||||
QCN6122 is a PCIe based solution that is attached to and enumerated
|
||||
by the WPSS (Wireless Processor SubSystem) Q6 processor.
|
||||
|
||||
Though it is a PCIe device, since it is not attached to APSS processor
|
||||
(Application Processor SubSystem), APSS will be unaware of such a decice
|
||||
and hence it is registered to the APSS processor as a platform device(AHB).
|
||||
Because of this hybrid nature, it is called as a hybrid bus device.
|
||||
|
||||
As such, QCN6122 is a hybrid bus type device and follows the same codepath
|
||||
as for WCN6750.
|
||||
|
||||
This is a heavily simplified version of below downstream patch:
|
||||
Download from https://git.codelinaro.org/clo/qsdk/oss/system/feeds/wlan-open/-/blob/NHSS.QSDK.12.4.5.r2/mac80211/patches/232-ath11k-qcn6122-support.patch
|
||||
|
||||
Co-developed-by: George Moussalem <george.moussalem@outlook.com>
|
||||
Signed-off-by: Sowmiya Sree Elavalagan <ssreeela@codeaurora.org>
|
||||
Signed-off-by: George Moussalem <george.moussalem@outlook.com>
|
||||
---
|
||||
|
||||
--- a/drivers/net/wireless/ath/ath11k/core.c
|
||||
+++ b/drivers/net/wireless/ath/ath11k/core.c
|
||||
@@ -905,6 +905,67 @@ static struct ath11k_hw_params ath11k_hw
|
||||
.support_dual_stations = true,
|
||||
.pdev_suspend = false,
|
||||
},
|
||||
+ {
|
||||
+ .hw_rev = ATH11K_HW_QCN6122_HW10,
|
||||
+ .name = "qcn6122 hw1.0",
|
||||
+ .fw = {
|
||||
+ .dir = "QCN6122/hw1.0",
|
||||
+ .board_size = 256 * 1024,
|
||||
+ .cal_offset = 128 * 1024,
|
||||
+ },
|
||||
+ .hal_params = &ath11k_hw_hal_params_ipq8074,
|
||||
+ .max_radios = MAX_RADIOS_5018,
|
||||
+ .bdf_addr = 0x4D200000,
|
||||
+ .hw_ops = &ipq5018_ops,
|
||||
+ .hal_desc_sz = sizeof(struct hal_rx_desc_qcn9074),
|
||||
+ .qmi_service_ins_id = ATH11K_QMI_WLFW_SERVICE_INS_ID_V01_QCN6122,
|
||||
+ .interface_modes = BIT(NL80211_IFTYPE_STATION) |
|
||||
+ BIT(NL80211_IFTYPE_AP) |
|
||||
+ BIT(NL80211_IFTYPE_MESH_POINT),
|
||||
+ .spectral = {
|
||||
+ .fft_sz = 2,
|
||||
+ .fft_pad_sz = 0,
|
||||
+ .summary_pad_sz = 16,
|
||||
+ .fft_hdr_len = 24,
|
||||
+ .max_fft_bins = 1024,
|
||||
+ },
|
||||
+ .credit_flow = false,
|
||||
+ .max_tx_ring = 1,
|
||||
+ .supports_monitor = true,
|
||||
+ .supports_shadow_regs = false,
|
||||
+ .idle_ps = false,
|
||||
+ .supports_suspend = false,
|
||||
+ .host_ce_config = ath11k_host_ce_config_qcn9074,
|
||||
+ .ce_count = CE_CNT_5018,
|
||||
+ .target_ce_config = ath11k_target_ce_config_wlan_ipq5018,
|
||||
+ .target_ce_count = TARGET_CE_CNT_5018,
|
||||
+ .svc_to_ce_map = ath11k_target_service_to_ce_map_wlan_ipq5018,
|
||||
+ .svc_to_ce_map_len = SVC_CE_MAP_LEN_5018,
|
||||
+ .single_pdev_only = false,
|
||||
+ .rxdma1_enable = true,
|
||||
+ .num_rxdma_per_pdev = RXDMA_PER_PDEV_5018,
|
||||
+ .rx_mac_buf_ring = false,
|
||||
+ .vdev_start_delay = false,
|
||||
+ .htt_peer_map_v2 = true,
|
||||
+ .coldboot_cal_mm = false,
|
||||
+ .coldboot_cal_ftm = false,
|
||||
+ .cbcal_restart_fw = true,
|
||||
+ .fix_l1ss = true,
|
||||
+ .alloc_cacheable_memory = true,
|
||||
+ .m3_fw_support = false,
|
||||
+ .fixed_bdf_addr = true,
|
||||
+ .fixed_mem_region = true,
|
||||
+ .static_window_map = true,
|
||||
+ .hybrid_bus_type = true,
|
||||
+ .fw_mem_mode = 1,
|
||||
+ .supports_sta_ps = false,
|
||||
+ .dbr_debug_support = true,
|
||||
+ .bios_sar_capa = NULL,
|
||||
+ .fixed_fw_mem = false,
|
||||
+ .support_off_channel_tx = false,
|
||||
+ .tcl_ring_retry = true,
|
||||
+ .tx_ring_size = DP_TCL_DATA_RING_SIZE,
|
||||
+ },
|
||||
};
|
||||
|
||||
static const struct dmi_system_id ath11k_pm_quirk_table[] = {
|
||||
--- a/drivers/net/wireless/ath/ath11k/core.h
|
||||
+++ b/drivers/net/wireless/ath/ath11k/core.h
|
||||
@@ -151,6 +151,7 @@ enum ath11k_hw_rev {
|
||||
ATH11K_HW_IPQ5018_HW10,
|
||||
ATH11K_HW_QCA2066_HW21,
|
||||
ATH11K_HW_QCA6698AQ_HW21,
|
||||
+ ATH11K_HW_QCN6122_HW10,
|
||||
};
|
||||
|
||||
enum ath11k_firmware_mode {
|
||||
--- a/drivers/net/wireless/ath/ath11k/qmi.h
|
||||
+++ b/drivers/net/wireless/ath/ath11k/qmi.h
|
||||
@@ -22,10 +22,11 @@
|
||||
#define ATH11K_QMI_WLFW_SERVICE_INS_ID_V01_IPQ8074 0x02
|
||||
#define ATH11K_QMI_WLFW_SERVICE_INS_ID_V01_QCN9074 0x07
|
||||
#define ATH11K_QMI_WLFW_SERVICE_INS_ID_V01_WCN6750 0x03
|
||||
+#define ATH11K_QMI_WLFW_SERVICE_INS_ID_V01_QCN6122 0x40
|
||||
#define ATH11K_QMI_WLANFW_MAX_TIMESTAMP_LEN_V01 32
|
||||
#define ATH11K_QMI_RESP_LEN_MAX 8192
|
||||
#define ATH11K_QMI_WLANFW_MAX_NUM_MEM_SEG_V01 52
|
||||
-#define ATH11K_QMI_CALDB_SIZE 0x480000
|
||||
+#define ATH11K_QMI_CALDB_SIZE 0x500000
|
||||
#define ATH11K_QMI_BDF_EXT_STR_LENGTH 0x20
|
||||
#define ATH11K_QMI_FW_MEM_REQ_SEGMENT_CNT 5
|
||||
|
||||
114
patches/ath11k/921-wifi-ath11k-add-hal-regs-for-QCN6122.patch
Normal file
114
patches/ath11k/921-wifi-ath11k-add-hal-regs-for-QCN6122.patch
Normal file
@@ -0,0 +1,114 @@
|
||||
From: George Moussalem <george.moussalem@outlook.com>
|
||||
Date: Wed, 27 Oct 2024 16:34:11 +0400
|
||||
Subject: [PATCH] wifi: ath11k: add hal regs for QCN6122
|
||||
|
||||
Add HAL changes required to support QCN6122. Offsets are similar to those of
|
||||
WCN6750 but QCN6122 does not use the hal_shadow_base_addr, so add platform
|
||||
specific ath11k_hw_regs and register them in hw params.
|
||||
|
||||
Signed-off-by: George Moussalem <george.moussalem@outlook.com>
|
||||
---
|
||||
--- a/drivers/net/wireless/ath/ath11k/core.c
|
||||
+++ b/drivers/net/wireless/ath/ath11k/core.c
|
||||
@@ -918,6 +918,7 @@ static struct ath11k_hw_params ath11k_hw
|
||||
.bdf_addr = 0x4D200000,
|
||||
.hw_ops = &ipq5018_ops,
|
||||
.hal_desc_sz = sizeof(struct hal_rx_desc_qcn9074),
|
||||
+ .regs = &qcn6122_regs,
|
||||
.qmi_service_ins_id = ATH11K_QMI_WLFW_SERVICE_INS_ID_V01_QCN6122,
|
||||
.interface_modes = BIT(NL80211_IFTYPE_STATION) |
|
||||
BIT(NL80211_IFTYPE_AP) |
|
||||
--- a/drivers/net/wireless/ath/ath11k/hw.c
|
||||
+++ b/drivers/net/wireless/ath/ath11k/hw.c
|
||||
@@ -2822,6 +2822,81 @@ const struct ath11k_hw_regs ipq5018_regs
|
||||
.hal_wbm1_release_ring_base_lsb = 0x0000097c,
|
||||
};
|
||||
|
||||
+const struct ath11k_hw_regs qcn6122_regs = {
|
||||
+ /* SW2TCL(x) R0 ring configuration address */
|
||||
+ .hal_tcl1_ring_base_lsb = 0x00000694,
|
||||
+ .hal_tcl1_ring_base_msb = 0x00000698,
|
||||
+ .hal_tcl1_ring_id = 0x0000069c,
|
||||
+ .hal_tcl1_ring_misc = 0x000006a4,
|
||||
+ .hal_tcl1_ring_tp_addr_lsb = 0x000006b0,
|
||||
+ .hal_tcl1_ring_tp_addr_msb = 0x000006b4,
|
||||
+ .hal_tcl1_ring_consumer_int_setup_ix0 = 0x000006c4,
|
||||
+ .hal_tcl1_ring_consumer_int_setup_ix1 = 0x000006c8,
|
||||
+ .hal_tcl1_ring_msi1_base_lsb = 0x000006dc,
|
||||
+ .hal_tcl1_ring_msi1_base_msb = 0x000006e0,
|
||||
+ .hal_tcl1_ring_msi1_data = 0x000006e4,
|
||||
+ .hal_tcl2_ring_base_lsb = 0x000006ec,
|
||||
+ .hal_tcl_ring_base_lsb = 0x0000079c,
|
||||
+
|
||||
+ /* TCL STATUS ring address */
|
||||
+ .hal_tcl_status_ring_base_lsb = 0x000008a4,
|
||||
+
|
||||
+ /* REO2SW(x) R0 ring configuration address */
|
||||
+ .hal_reo1_ring_base_lsb = 0x000001ec,
|
||||
+ .hal_reo1_ring_base_msb = 0x000001f0,
|
||||
+ .hal_reo1_ring_id = 0x000001f4,
|
||||
+ .hal_reo1_ring_misc = 0x000001fc,
|
||||
+ .hal_reo1_ring_hp_addr_lsb = 0x00000200,
|
||||
+ .hal_reo1_ring_hp_addr_msb = 0x00000204,
|
||||
+ .hal_reo1_ring_producer_int_setup = 0x00000210,
|
||||
+ .hal_reo1_ring_msi1_base_lsb = 0x00000234,
|
||||
+ .hal_reo1_ring_msi1_base_msb = 0x00000238,
|
||||
+ .hal_reo1_ring_msi1_data = 0x0000023c,
|
||||
+ .hal_reo2_ring_base_lsb = 0x00000244,
|
||||
+ .hal_reo1_aging_thresh_ix_0 = 0x00000564,
|
||||
+ .hal_reo1_aging_thresh_ix_1 = 0x00000568,
|
||||
+ .hal_reo1_aging_thresh_ix_2 = 0x0000056c,
|
||||
+ .hal_reo1_aging_thresh_ix_3 = 0x00000570,
|
||||
+
|
||||
+ /* REO2SW(x) R2 ring pointers (head/tail) address */
|
||||
+ .hal_reo1_ring_hp = 0x00003028,
|
||||
+ .hal_reo1_ring_tp = 0x0000302c,
|
||||
+ .hal_reo2_ring_hp = 0x00003030,
|
||||
+
|
||||
+ /* REO2TCL R0 ring configuration address */
|
||||
+ .hal_reo_tcl_ring_base_lsb = 0x000003fc,
|
||||
+ .hal_reo_tcl_ring_hp = 0x00003058,
|
||||
+
|
||||
+ /* SW2REO ring address */
|
||||
+ .hal_sw2reo_ring_base_lsb = 0x0000013c,
|
||||
+ .hal_sw2reo_ring_hp = 0x00003018,
|
||||
+
|
||||
+ /* REO CMD ring address */
|
||||
+ .hal_reo_cmd_ring_base_lsb = 0x000000e4,
|
||||
+ .hal_reo_cmd_ring_hp = 0x00003010,
|
||||
+
|
||||
+ /* REO status address */
|
||||
+ .hal_reo_status_ring_base_lsb = 0x00000504,
|
||||
+ .hal_reo_status_hp = 0x00003070,
|
||||
+
|
||||
+ /* WCSS relative address */
|
||||
+ .hal_seq_wcss_umac_ce0_src_reg = 0x01b80000,
|
||||
+ .hal_seq_wcss_umac_ce0_dst_reg = 0x01b81000,
|
||||
+ .hal_seq_wcss_umac_ce1_src_reg = 0x01b82000,
|
||||
+ .hal_seq_wcss_umac_ce1_dst_reg = 0x01b83000,
|
||||
+
|
||||
+ /* WBM Idle address */
|
||||
+ .hal_wbm_idle_link_ring_base_lsb = 0x00000874,
|
||||
+ .hal_wbm_idle_link_ring_misc = 0x00000884,
|
||||
+
|
||||
+ /* SW2WBM release address */
|
||||
+ .hal_wbm_release_ring_base_lsb = 0x000001ec,
|
||||
+
|
||||
+ /* WBM2SW release address */
|
||||
+ .hal_wbm0_release_ring_base_lsb = 0x00000924,
|
||||
+ .hal_wbm1_release_ring_base_lsb = 0x0000097c,
|
||||
+};
|
||||
+
|
||||
const struct ath11k_hw_hal_params ath11k_hw_hal_params_ipq8074 = {
|
||||
.rx_buf_rbm = HAL_RX_BUF_RBM_SW3_BM,
|
||||
.tcl2wbm_rbm_map = ath11k_hw_tcl2wbm_rbm_map_ipq8074,
|
||||
--- a/drivers/net/wireless/ath/ath11k/hw.h
|
||||
+++ b/drivers/net/wireless/ath/ath11k/hw.h
|
||||
@@ -426,6 +426,7 @@ extern const struct ath11k_hw_regs qcn90
|
||||
extern const struct ath11k_hw_regs wcn6855_regs;
|
||||
extern const struct ath11k_hw_regs wcn6750_regs;
|
||||
extern const struct ath11k_hw_regs ipq5018_regs;
|
||||
+extern const struct ath11k_hw_regs qcn6122_regs;
|
||||
|
||||
static inline const char *ath11k_bd_ie_type_str(enum ath11k_bd_ie_type type)
|
||||
{
|
||||
@@ -0,0 +1,74 @@
|
||||
From: George Moussalem <george.moussalem@outlook.com>
|
||||
Date: Wed, 27 Oct 2024 16:34:11 +0400
|
||||
Subject: [PATCH] wifi: ath11k: add hw ring mask for QCN6122
|
||||
|
||||
Add ring mask for QCN6122 and register them in hw params.
|
||||
|
||||
Signed-off-by: George Moussalem <george.moussalem@outlook.com>
|
||||
---
|
||||
--- a/drivers/net/wireless/ath/ath11k/core.c
|
||||
+++ b/drivers/net/wireless/ath/ath11k/core.c
|
||||
@@ -917,6 +917,7 @@ static struct ath11k_hw_params ath11k_hw
|
||||
.max_radios = MAX_RADIOS_5018,
|
||||
.bdf_addr = 0x4D200000,
|
||||
.hw_ops = &ipq5018_ops,
|
||||
+ .ring_mask = &ath11k_hw_ring_mask_qcn6122,
|
||||
.hal_desc_sz = sizeof(struct hal_rx_desc_qcn9074),
|
||||
.regs = &qcn6122_regs,
|
||||
.qmi_service_ins_id = ATH11K_QMI_WLFW_SERVICE_INS_ID_V01_QCN6122,
|
||||
--- a/drivers/net/wireless/ath/ath11k/hw.c
|
||||
+++ b/drivers/net/wireless/ath/ath11k/hw.c
|
||||
@@ -2070,6 +2070,43 @@ const struct ath11k_hw_ring_mask ath11k_
|
||||
},
|
||||
};
|
||||
|
||||
+const struct ath11k_hw_ring_mask ath11k_hw_ring_mask_qcn6122 = {
|
||||
+ .tx = {
|
||||
+ ATH11K_TX_RING_MASK_0,
|
||||
+ ATH11K_TX_RING_MASK_1,
|
||||
+ ATH11K_TX_RING_MASK_2,
|
||||
+ },
|
||||
+ .rx_mon_status = {
|
||||
+ 0, 0, 0,
|
||||
+ ATH11K_RX_MON_STATUS_RING_MASK_0,
|
||||
+ },
|
||||
+ .rx = {
|
||||
+ 0, 0, 0, 0,
|
||||
+ ATH11K_RX_RING_MASK_0,
|
||||
+ ATH11K_RX_RING_MASK_1,
|
||||
+ ATH11K_RX_RING_MASK_2,
|
||||
+ ATH11K_RX_RING_MASK_3,
|
||||
+ },
|
||||
+ .rx_err = {
|
||||
+ 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
+ ATH11K_RX_ERR_RING_MASK_0,
|
||||
+ },
|
||||
+ .rx_wbm_rel = {
|
||||
+ 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
+ ATH11K_RX_WBM_REL_RING_MASK_0,
|
||||
+ },
|
||||
+ .reo_status = {
|
||||
+ 0, 0, 0,
|
||||
+ ATH11K_REO_STATUS_RING_MASK_0,
|
||||
+ },
|
||||
+ .rxdma2host = {
|
||||
+ ATH11K_RXDMA2HOST_RING_MASK_0,
|
||||
+ },
|
||||
+ .host2rxdma = {
|
||||
+ ATH11K_HOST2RXDMA_RING_MASK_0,
|
||||
+ },
|
||||
+};
|
||||
+
|
||||
/* Target firmware's Copy Engine configuration for IPQ5018 */
|
||||
const struct ce_pipe_config ath11k_target_ce_config_wlan_ipq5018[] = {
|
||||
/* CE0: host->target HTC control and raw streams */
|
||||
--- a/drivers/net/wireless/ath/ath11k/hw.h
|
||||
+++ b/drivers/net/wireless/ath/ath11k/hw.h
|
||||
@@ -290,6 +290,7 @@ extern const struct ath11k_hw_ring_mask
|
||||
extern const struct ath11k_hw_ring_mask ath11k_hw_ring_mask_qca6390;
|
||||
extern const struct ath11k_hw_ring_mask ath11k_hw_ring_mask_qcn9074;
|
||||
extern const struct ath11k_hw_ring_mask ath11k_hw_ring_mask_wcn6750;
|
||||
+extern const struct ath11k_hw_ring_mask ath11k_hw_ring_mask_qcn6122;
|
||||
|
||||
extern const struct ce_ie_addr ath11k_ce_ie_addr_ipq8074;
|
||||
extern const struct ce_ie_addr ath11k_ce_ie_addr_ipq5018;
|
||||
@@ -0,0 +1,102 @@
|
||||
From: George Moussalem <george.moussalem@outlook.com>
|
||||
Date: Wed, 27 Oct 2024 16:34:11 +0400
|
||||
Subject: [PATCH] wifi: ath11k: update hif and pci ops for QCN6122
|
||||
|
||||
Add HIF and PCI ops for QCN6122. QCN6122 by default uses DP window 3.
|
||||
However, this is configurable, so let's introduce a function to do that and
|
||||
follow the existing register access code for (hybrid)AHB devices and use
|
||||
DP window 1.
|
||||
|
||||
Signed-off-by: George Moussalem <george.moussalem@outlook.com>
|
||||
---
|
||||
--- a/drivers/net/wireless/ath/ath11k/ahb.c
|
||||
+++ b/drivers/net/wireless/ath/ath11k/ahb.c
|
||||
@@ -768,6 +768,18 @@ static int ath11k_ahb_hif_resume(struct
|
||||
return 0;
|
||||
}
|
||||
|
||||
+static void ath11k_ahb_config_static_window_qcn6122(struct ath11k_base *ab)
|
||||
+{
|
||||
+ u32 umac_window = FIELD_GET(ATH11K_PCI_WINDOW_VALUE_MASK, HAL_SEQ_WCSS_UMAC_OFFSET);
|
||||
+ u32 ce_window = FIELD_GET(ATH11K_PCI_WINDOW_VALUE_MASK, HAL_CE_WFSS_CE_REG_BASE);
|
||||
+ u32 window;
|
||||
+
|
||||
+ window = (umac_window) | (ce_window << 6);
|
||||
+
|
||||
+ iowrite32(ATH11K_PCI_WINDOW_ENABLE_BIT | window,
|
||||
+ ab->mem + ATH11K_PCI_WINDOW_REG_ADDRESS);
|
||||
+}
|
||||
+
|
||||
static const struct ath11k_hif_ops ath11k_ahb_hif_ops_ipq8074 = {
|
||||
.start = ath11k_ahb_start,
|
||||
.stop = ath11k_ahb_stop,
|
||||
@@ -800,6 +812,24 @@ static const struct ath11k_hif_ops ath11
|
||||
.ce_irq_disable = ath11k_pci_disable_ce_irqs_except_wake_irq,
|
||||
};
|
||||
|
||||
+static const struct ath11k_hif_ops ath11k_ahb_hif_ops_qcn6122 = {
|
||||
+ .start = ath11k_pcic_start,
|
||||
+ .stop = ath11k_pcic_stop,
|
||||
+ .read32 = ath11k_pcic_read32,
|
||||
+ .write32 = ath11k_pcic_write32,
|
||||
+ .read = NULL,
|
||||
+ .irq_enable = ath11k_pcic_ext_irq_enable,
|
||||
+ .irq_disable = ath11k_pcic_ext_irq_disable,
|
||||
+ .get_msi_address = ath11k_pcic_get_msi_address,
|
||||
+ .get_user_msi_vector = ath11k_pcic_get_user_msi_assignment,
|
||||
+ .map_service_to_pipe = ath11k_pcic_map_service_to_pipe,
|
||||
+ .power_down = ath11k_ahb_power_down,
|
||||
+ .power_up = ath11k_ahb_power_up,
|
||||
+ .ce_irq_enable = ath11k_pci_enable_ce_irqs_except_wake_irq,
|
||||
+ .ce_irq_disable = ath11k_pci_disable_ce_irqs_except_wake_irq,
|
||||
+ .config_static_window = ath11k_ahb_config_static_window_qcn6122,
|
||||
+};
|
||||
+
|
||||
static int ath11k_core_get_rproc(struct ath11k_base *ab)
|
||||
{
|
||||
struct ath11k_ahb *ab_ahb = ath11k_ahb_priv(ab);
|
||||
@@ -1144,6 +1174,10 @@ static int ath11k_ahb_probe(struct platf
|
||||
hif_ops = &ath11k_ahb_hif_ops_wcn6750;
|
||||
pci_ops = &ath11k_ahb_pci_ops_wcn6750;
|
||||
break;
|
||||
+ case ATH11K_HW_QCN6122_HW10:
|
||||
+ hif_ops = &ath11k_ahb_hif_ops_qcn6122;
|
||||
+ pci_ops = &ath11k_ahb_pci_ops_wcn6750;
|
||||
+ break;
|
||||
default:
|
||||
dev_err(&pdev->dev, "unsupported device type %d\n", hw_rev);
|
||||
return -EOPNOTSUPP;
|
||||
--- a/drivers/net/wireless/ath/ath11k/hif.h
|
||||
+++ b/drivers/net/wireless/ath/ath11k/hif.h
|
||||
@@ -32,6 +32,7 @@ struct ath11k_hif_ops {
|
||||
void (*ce_irq_disable)(struct ath11k_base *ab);
|
||||
void (*get_ce_msi_idx)(struct ath11k_base *ab, u32 ce_id, u32 *msi_idx);
|
||||
void (*coredump_download)(struct ath11k_base *ab);
|
||||
+ void (*config_static_window)(struct ath11k_base *ab);
|
||||
};
|
||||
|
||||
static inline void ath11k_hif_ce_irq_enable(struct ath11k_base *ab)
|
||||
@@ -159,4 +160,12 @@ static inline void ath11k_hif_coredump_d
|
||||
ab->hif.ops->coredump_download(ab);
|
||||
}
|
||||
|
||||
+static inline void ath11k_hif_config_static_window(struct ath11k_base *ab)
|
||||
+{
|
||||
+ if (!ab->hw_params.static_window_map || !ab->hif.ops->config_static_window)
|
||||
+ return;
|
||||
+
|
||||
+ ab->hif.ops->config_static_window(ab);
|
||||
+}
|
||||
+
|
||||
#endif /* _HIF_H_ */
|
||||
--- a/drivers/net/wireless/ath/ath11k/qmi.c
|
||||
+++ b/drivers/net/wireless/ath/ath11k/qmi.c
|
||||
@@ -2201,6 +2201,8 @@ static int ath11k_qmi_request_device_inf
|
||||
if (!ab->hw_params.ce_remap)
|
||||
ab->mem_ce = ab->mem;
|
||||
|
||||
+ ath11k_hif_config_static_window(ab);
|
||||
+
|
||||
return 0;
|
||||
out:
|
||||
return ret;
|
||||
@@ -0,0 +1,110 @@
|
||||
From: George Moussalem <george.moussalem@outlook.com>
|
||||
Date: Wed, 27 Oct 2024 16:34:11 +0400
|
||||
Subject: [PATCH] wifi: ath11k: add multipd support for QCN6122
|
||||
|
||||
IPQ5018/QCN6122 platforms use multi PD (protection domains) to avoid having
|
||||
one instance of the running Q6 firmware crashing resulting in crashing the
|
||||
others. See below patch for more info:
|
||||
https://lore.kernel.org/all/20231110091939.3025413-1-quic_mmanikan@quicinc.com/
|
||||
|
||||
The IPQ5018 platform can have multiple (2) QCN6122 wifi cards. To differentiate
|
||||
the two, the PD instance number (1 or 2) is added to the QMI service instance
|
||||
ID, which the QCN6122 firmware also expects. IPQ5018 is always the first PD, so
|
||||
the QCN6122 cards should be the second or third.
|
||||
|
||||
Signed-off-by: George Moussalem <george.moussalem@outlook.com>
|
||||
---
|
||||
--- a/drivers/net/wireless/ath/ath11k/ahb.c
|
||||
+++ b/drivers/net/wireless/ath/ath11k/ahb.c
|
||||
@@ -435,6 +435,7 @@ static void ath11k_ahb_init_qmi_ce_confi
|
||||
cfg->svc_to_ce_map_len = ab->hw_params.svc_to_ce_map_len;
|
||||
cfg->svc_to_ce_map = ab->hw_params.svc_to_ce_map;
|
||||
ab->qmi.service_ins_id = ab->hw_params.qmi_service_ins_id;
|
||||
+ ab->qmi.service_ins_id += ab->userpd_id;
|
||||
}
|
||||
|
||||
static void ath11k_ahb_free_ext_irq(struct ath11k_base *ab)
|
||||
@@ -1118,6 +1119,27 @@ err_unregister:
|
||||
return ret;
|
||||
}
|
||||
|
||||
+static int ath11k_get_userpd_id(struct device *dev)
|
||||
+{
|
||||
+ int ret;
|
||||
+ int userpd_id = 0;
|
||||
+ const char *subsys_name;
|
||||
+
|
||||
+ ret = of_property_read_string(dev->of_node,
|
||||
+ "qcom,userpd-subsys-name",
|
||||
+ &subsys_name);
|
||||
+ if (ret)
|
||||
+ return 0;
|
||||
+
|
||||
+ if (strcmp(subsys_name, "q6v5_wcss_userpd2") == 0)
|
||||
+ userpd_id = ATH11K_QCN6122_USERPD_2;
|
||||
+ else if (strcmp(subsys_name, "q6v5_wcss_userpd3") == 0)
|
||||
+ userpd_id = ATH11K_QCN6122_USERPD_3;
|
||||
+ dev_info(dev, "Multipd architecture - userpd: %d\n", userpd_id + 1);
|
||||
+
|
||||
+ return userpd_id;
|
||||
+}
|
||||
+
|
||||
static int ath11k_ahb_fw_resource_deinit(struct ath11k_base *ab)
|
||||
{
|
||||
struct ath11k_ahb *ab_ahb = ath11k_ahb_priv(ab);
|
||||
@@ -1159,7 +1181,7 @@ static int ath11k_ahb_probe(struct platf
|
||||
const struct ath11k_hif_ops *hif_ops;
|
||||
const struct ath11k_pci_ops *pci_ops;
|
||||
enum ath11k_hw_rev hw_rev;
|
||||
- int ret;
|
||||
+ int ret, userpd_id;
|
||||
|
||||
hw_rev = (uintptr_t)device_get_match_data(&pdev->dev);
|
||||
|
||||
@@ -1183,6 +1205,7 @@ static int ath11k_ahb_probe(struct platf
|
||||
return -EOPNOTSUPP;
|
||||
}
|
||||
|
||||
+ userpd_id = ath11k_get_userpd_id(&pdev->dev);
|
||||
ret = dma_set_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(32));
|
||||
if (ret) {
|
||||
dev_err(&pdev->dev, "failed to set 32-bit consistent dma\n");
|
||||
@@ -1199,6 +1222,7 @@ static int ath11k_ahb_probe(struct platf
|
||||
ab->hif.ops = hif_ops;
|
||||
ab->pdev = pdev;
|
||||
ab->hw_rev = hw_rev;
|
||||
+ ab->userpd_id = userpd_id;
|
||||
ab->fw_mode = ATH11K_FIRMWARE_MODE_NORMAL;
|
||||
platform_set_drvdata(pdev, ab);
|
||||
|
||||
--- a/drivers/net/wireless/ath/ath11k/core.h
|
||||
+++ b/drivers/net/wireless/ath/ath11k/core.h
|
||||
@@ -47,6 +47,9 @@
|
||||
#define ATH11K_INVALID_HW_MAC_ID 0xFF
|
||||
#define ATH11K_CONNECTION_LOSS_HZ (3 * HZ)
|
||||
|
||||
+#define ATH11K_QCN6122_USERPD_2 1
|
||||
+#define ATH11K_QCN6122_USERPD_3 2
|
||||
+
|
||||
/* SMBIOS type containing Board Data File Name Extension */
|
||||
#define ATH11K_SMBIOS_BDF_EXT_TYPE 0xF8
|
||||
|
||||
@@ -966,6 +969,7 @@ struct ath11k_base {
|
||||
struct list_head peers;
|
||||
wait_queue_head_t peer_mapping_wq;
|
||||
u8 mac_addr[ETH_ALEN];
|
||||
+ int userpd_id;
|
||||
int irq_num[ATH11K_IRQ_NUM_MAX];
|
||||
struct ath11k_ext_irq_grp ext_irq_grp[ATH11K_EXT_IRQ_GRP_NUM_MAX];
|
||||
struct ath11k_targ_cap target_caps;
|
||||
--- a/drivers/net/wireless/ath/ath11k/pci.c
|
||||
+++ b/drivers/net/wireless/ath/ath11k/pci.c
|
||||
@@ -391,6 +391,8 @@ static void ath11k_pci_init_qmi_ce_confi
|
||||
} else
|
||||
ab->qmi.service_ins_id = ab->hw_params.qmi_service_ins_id;
|
||||
|
||||
+ ab->qmi.service_ins_id += ab->userpd_id;
|
||||
+
|
||||
ath11k_ce_get_shadow_config(ab, &cfg->shadow_reg_v2,
|
||||
&cfg->shadow_reg_v2_len);
|
||||
}
|
||||
@@ -0,0 +1,55 @@
|
||||
From: George Moussalem <george.moussalem@outlook.com>
|
||||
Date: Wed, 27 Oct 2024 16:34:11 +0400
|
||||
Subject: [PATCH] wifi: ath11k: add QCN6122 device support
|
||||
|
||||
QCN6122 is a 2x2 11AX PCIe based chipset, but it is attached to the WPSS
|
||||
(Wireless Processor SubSystem) Q6 processor, hence it is enumerated
|
||||
by the Q6 processor. It is registered to the APSS processor
|
||||
(Application Processor SubSystem) as a platform device (AHB) and remoteproc
|
||||
APIs are used to boot up or shutdown the device like other AHB devices.
|
||||
|
||||
Also, device information like BAR and its size is not known to the
|
||||
APSS processor as the chip is enumerated by WPSS Q6. These details
|
||||
are fetched over QMI.
|
||||
|
||||
STA, AP, and MESH modes are supported.
|
||||
Tested on: Linksys MX2000 and GLiNET B3000 access points for prolonged duration
|
||||
tests spanning multiple days with multiple clients connected with firmware
|
||||
WLAN.HK.2.7.0.1-01744-QCAHKSWPL_SILICONZ-1
|
||||
|
||||
An important point to note is that though QCN6122 is a PCIe device,
|
||||
it is an IPQ5018 SoC specific solution and cannot be attached to any other
|
||||
platform.
|
||||
|
||||
Signed-off-by: George Moussalem <george.moussalem@outlook.com>
|
||||
---
|
||||
--- a/drivers/net/wireless/ath/ath11k/ahb.c
|
||||
+++ b/drivers/net/wireless/ath/ath11k/ahb.c
|
||||
@@ -37,6 +37,9 @@ static const struct of_device_id ath11k_
|
||||
{ .compatible = "qcom,ipq5018-wifi",
|
||||
.data = (void *)ATH11K_HW_IPQ5018_HW10,
|
||||
},
|
||||
+ { .compatible = "qcom,qcn6122-wifi",
|
||||
+ .data = (void *)ATH11K_HW_QCN6122_HW10,
|
||||
+ },
|
||||
{ }
|
||||
};
|
||||
|
||||
--- a/drivers/net/wireless/ath/ath11k/pcic.c
|
||||
+++ b/drivers/net/wireless/ath/ath11k/pcic.c
|
||||
@@ -137,6 +137,15 @@ static const struct ath11k_msi_config at
|
||||
},
|
||||
.hw_rev = ATH11K_HW_QCA6698AQ_HW21,
|
||||
},
|
||||
+ {
|
||||
+ .total_vectors = 13,
|
||||
+ .total_users = 2,
|
||||
+ .users = (struct ath11k_msi_user[]) {
|
||||
+ { .name = "CE", .num_vectors = 5, .base_vector = 0 },
|
||||
+ { .name = "DP", .num_vectors = 8, .base_vector = 5 },
|
||||
+ },
|
||||
+ .hw_rev = ATH11K_HW_QCN6122_HW10,
|
||||
+ },
|
||||
};
|
||||
|
||||
int ath11k_pcic_init_msi_config(struct ath11k_base *ab)
|
||||
@@ -0,0 +1,31 @@
|
||||
From 64f6f6cdde0b6b763181145a698207fad4536c06 Mon Sep 17 00:00:00 2001
|
||||
From: Ziyang Huang <hzyitc@outlook.com>
|
||||
Date: Wed, 9 Aug 2023 17:44:49 +0000
|
||||
Subject: [PATCH] wifi: ath11k: Support to assign m3 dump memory
|
||||
|
||||
Signed-off-by: Ziyang Huang <hzyitc@outlook.com>
|
||||
---
|
||||
drivers/net/wireless/ath/ath11k/qmi.c | 12 ++++++++++++
|
||||
1 file changed, 12 insertions(+)
|
||||
|
||||
--- a/drivers/net/wireless/ath/ath11k/qmi.c
|
||||
+++ b/drivers/net/wireless/ath/ath11k/qmi.c
|
||||
@@ -2118,6 +2118,18 @@ static int ath11k_qmi_assign_target_mem_
|
||||
ab->qmi.target_mem[idx].type = ab->qmi.target_mem[i].type;
|
||||
idx++;
|
||||
break;
|
||||
+ case M3_DUMP_REGION_TYPE:
|
||||
+ if (of_property_read_u32(dev->of_node, "qcom,m3-dump-addr", &addr)) {
|
||||
+ ath11k_warn(ab, "qmi fail to get qcom,m3-dump-addr, ignore m3 dump mem req\n");
|
||||
+ break;
|
||||
+ }
|
||||
+
|
||||
+ ab->qmi.target_mem[idx].paddr = (phys_addr_t) addr;
|
||||
+ ab->qmi.target_mem[idx].vaddr = NULL;
|
||||
+ ab->qmi.target_mem[idx].size = ab->qmi.target_mem[i].size;
|
||||
+ ab->qmi.target_mem[idx].type = ab->qmi.target_mem[i].type;
|
||||
+ idx++;
|
||||
+ break;
|
||||
default:
|
||||
ath11k_warn(ab, "qmi ignore invalid mem req type %d\n",
|
||||
ab->qmi.target_mem[i].type);
|
||||
164
patches/ath11k/932-wifi-ath11k-poll-reo-status-ipq5018.patch
Normal file
164
patches/ath11k/932-wifi-ath11k-poll-reo-status-ipq5018.patch
Normal file
@@ -0,0 +1,164 @@
|
||||
From d890c6d602307c9297df12c7d0287f9ffd26208b Mon Sep 17 00:00:00 2001
|
||||
From: Sriram R <srirrama@codeaurora.org>
|
||||
Date: Wed, 12 May 2021 19:21:09 +0530
|
||||
Subject: [PATCH] ath11k: poll reo status ring for IPQ5018
|
||||
|
||||
Currently reo status interrupts are not received
|
||||
due to wrong mapping of the reo status interrupt
|
||||
line in IPQ5018.
|
||||
|
||||
Hence, until the mapping is resolved in HW, use
|
||||
polling to reap the reo status ring. Rather than
|
||||
a period timer to reap the ring, the timer is
|
||||
triggered only on sending a reo command with
|
||||
status request.
|
||||
|
||||
Without proper reaping of the ring, backpressure
|
||||
and ring full issues are seen in multi client test
|
||||
setups which leads to flooding the console with
|
||||
error messages reporting failure to send reo cmds.
|
||||
|
||||
Can be reverted once HW solution is available.
|
||||
|
||||
Signed-off-by: Sriram R <srirrama@codeaurora.org>
|
||||
---
|
||||
--- a/drivers/net/wireless/ath/ath11k/core.c
|
||||
+++ b/drivers/net/wireless/ath/ath11k/core.c
|
||||
@@ -727,6 +727,7 @@ static struct ath11k_hw_params ath11k_hw
|
||||
.support_fw_mac_sequence = false,
|
||||
.support_dual_stations = false,
|
||||
.pdev_suspend = false,
|
||||
+ .reo_status_poll = true,
|
||||
},
|
||||
{
|
||||
.name = "qca2066 hw2.1",
|
||||
--- a/drivers/net/wireless/ath/ath11k/dp.c
|
||||
+++ b/drivers/net/wireless/ath/ath11k/dp.c
|
||||
@@ -348,12 +348,66 @@ void ath11k_dp_stop_shadow_timers(struct
|
||||
ath11k_dp_shadow_stop_timer(ab, &ab->dp.reo_cmd_timer);
|
||||
}
|
||||
|
||||
+static void ath11k_dp_handle_reo_status_timer(struct timer_list *timer)
|
||||
+{
|
||||
+ struct ath11k_dp *dp = from_timer(dp, timer, reo_status_timer);
|
||||
+ struct ath11k_base *ab = dp->ab;
|
||||
+
|
||||
+ spin_lock_bh(&dp->reo_cmd_lock);
|
||||
+ dp->reo_status_timer_running = false;
|
||||
+ spin_unlock_bh(&dp->reo_cmd_lock);
|
||||
+
|
||||
+ ath11k_dp_process_reo_status(ab);
|
||||
+}
|
||||
+
|
||||
+void ath11k_dp_start_reo_status_timer(struct ath11k_base *ab)
|
||||
+{
|
||||
+ struct ath11k_dp *dp = &ab->dp;
|
||||
+
|
||||
+ if (!ab->hw_params.reo_status_poll)
|
||||
+ return;
|
||||
+
|
||||
+ spin_lock_bh(&dp->reo_cmd_lock);
|
||||
+ if (dp->reo_status_timer_running) {
|
||||
+ spin_unlock_bh(&dp->reo_cmd_lock);
|
||||
+ return;
|
||||
+ }
|
||||
+ dp->reo_status_timer_running = true;
|
||||
+ spin_unlock_bh(&dp->reo_cmd_lock);
|
||||
+
|
||||
+ mod_timer(&dp->reo_status_timer, jiffies +
|
||||
+ msecs_to_jiffies(ATH11K_REO_STATUS_POLL_TIMEOUT_MS));
|
||||
+}
|
||||
+
|
||||
+static void ath11k_dp_stop_reo_status_timer(struct ath11k_base *ab)
|
||||
+{
|
||||
+ struct ath11k_dp *dp = &ab->dp;
|
||||
+
|
||||
+ if (!ab->hw_params.reo_status_poll)
|
||||
+ return;
|
||||
+
|
||||
+ del_timer_sync(&dp->reo_status_timer);
|
||||
+ dp->reo_status_timer_running = false;
|
||||
+}
|
||||
+
|
||||
+static void ath11k_dp_init_reo_status_timer(struct ath11k_base *ab)
|
||||
+{
|
||||
+ struct ath11k_dp *dp = &ab->dp;
|
||||
+
|
||||
+ if (!ab->hw_params.reo_status_poll)
|
||||
+ return;
|
||||
+
|
||||
+ timer_setup(&dp->reo_status_timer,
|
||||
+ ath11k_dp_handle_reo_status_timer, 0);
|
||||
+}
|
||||
+
|
||||
static void ath11k_dp_srng_common_cleanup(struct ath11k_base *ab)
|
||||
{
|
||||
struct ath11k_dp *dp = &ab->dp;
|
||||
int i;
|
||||
|
||||
ath11k_dp_stop_shadow_timers(ab);
|
||||
+ ath11k_dp_stop_reo_status_timer(ab);
|
||||
ath11k_dp_srng_cleanup(ab, &dp->wbm_desc_rel_ring);
|
||||
ath11k_dp_srng_cleanup(ab, &dp->tcl_cmd_ring);
|
||||
ath11k_dp_srng_cleanup(ab, &dp->tcl_status_ring);
|
||||
@@ -375,6 +429,8 @@ static int ath11k_dp_srng_common_setup(s
|
||||
int i, ret;
|
||||
u8 tcl_num, wbm_num;
|
||||
|
||||
+ ath11k_dp_init_reo_status_timer(ab);
|
||||
+
|
||||
ret = ath11k_dp_srng_setup(ab, &dp->wbm_desc_rel_ring,
|
||||
HAL_SW2WBM_RELEASE, 0, 0,
|
||||
DP_WBM_RELEASE_RING_SIZE);
|
||||
--- a/drivers/net/wireless/ath/ath11k/dp.h
|
||||
+++ b/drivers/net/wireless/ath/ath11k/dp.h
|
||||
@@ -46,6 +46,8 @@ struct dp_rx_tid {
|
||||
#define DP_MON_PURGE_TIMEOUT_MS 100
|
||||
#define DP_MON_SERVICE_BUDGET 128
|
||||
|
||||
+#define ATH11K_REO_STATUS_POLL_TIMEOUT_MS 10
|
||||
+
|
||||
struct dp_reo_cache_flush_elem {
|
||||
struct list_head list;
|
||||
struct dp_rx_tid data;
|
||||
@@ -287,6 +289,10 @@ struct ath11k_dp {
|
||||
spinlock_t reo_cmd_lock;
|
||||
struct ath11k_hp_update_timer reo_cmd_timer;
|
||||
struct ath11k_hp_update_timer tx_ring_timer[DP_TCL_NUM_RING_MAX];
|
||||
+
|
||||
+ /* reo status timer and flags */
|
||||
+ struct timer_list reo_status_timer;
|
||||
+ bool reo_status_timer_running;
|
||||
};
|
||||
|
||||
/* HTT definitions */
|
||||
@@ -1690,5 +1696,6 @@ void ath11k_dp_shadow_init_timer(struct
|
||||
struct ath11k_hp_update_timer *update_timer,
|
||||
u32 interval, u32 ring_id);
|
||||
void ath11k_dp_stop_shadow_timers(struct ath11k_base *ab);
|
||||
+void ath11k_dp_start_reo_status_timer(struct ath11k_base *ab);
|
||||
|
||||
#endif
|
||||
--- a/drivers/net/wireless/ath/ath11k/dp_tx.c
|
||||
+++ b/drivers/net/wireless/ath/ath11k/dp_tx.c
|
||||
@@ -787,6 +787,10 @@ int ath11k_dp_tx_send_reo_cmd(struct ath
|
||||
if (cmd_num == 0)
|
||||
return -EINVAL;
|
||||
|
||||
+ /* Trigger reo status polling if required */
|
||||
+ if (cmd->flag & HAL_REO_CMD_FLG_NEED_STATUS)
|
||||
+ ath11k_dp_start_reo_status_timer(ab);
|
||||
+
|
||||
if (!cb)
|
||||
return 0;
|
||||
|
||||
--- a/drivers/net/wireless/ath/ath11k/hw.h
|
||||
+++ b/drivers/net/wireless/ath/ath11k/hw.h
|
||||
@@ -233,6 +233,7 @@ struct ath11k_hw_params {
|
||||
bool support_fw_mac_sequence;
|
||||
bool support_dual_stations;
|
||||
bool pdev_suspend;
|
||||
+ bool reo_status_poll;
|
||||
};
|
||||
|
||||
struct ath11k_hw_ops {
|
||||
@@ -0,0 +1,92 @@
|
||||
From 16872194c80f2724472fc207991712895ac8a230 Mon Sep 17 00:00:00 2001
|
||||
From: Sergey Senozhatsky <senozhatsky@chromium.org>
|
||||
Date: Thu, 12 Jun 2025 17:45:06 +0900
|
||||
Subject: wifi: ath11k: clear initialized flag for deinit-ed srng lists
|
||||
|
||||
[ Upstream commit a5b46aa7cf5f05c213316a018e49a8e086efd98e ]
|
||||
|
||||
In a number of cases we see kernel panics on resume due
|
||||
to ath11k kernel page fault, which happens under the
|
||||
following circumstances:
|
||||
|
||||
1) First ath11k_hal_dump_srng_stats() call
|
||||
|
||||
Last interrupt received for each group:
|
||||
ath11k_pci 0000:01:00.0: group_id 0 22511ms before
|
||||
ath11k_pci 0000:01:00.0: group_id 1 14440788ms before
|
||||
[..]
|
||||
ath11k_pci 0000:01:00.0: failed to receive control response completion, polling..
|
||||
ath11k_pci 0000:01:00.0: Service connect timeout
|
||||
ath11k_pci 0000:01:00.0: failed to connect to HTT: -110
|
||||
ath11k_pci 0000:01:00.0: failed to start core: -110
|
||||
ath11k_pci 0000:01:00.0: firmware crashed: MHI_CB_EE_RDDM
|
||||
ath11k_pci 0000:01:00.0: already resetting count 2
|
||||
ath11k_pci 0000:01:00.0: failed to wait wlan mode request (mode 4): -110
|
||||
ath11k_pci 0000:01:00.0: qmi failed to send wlan mode off: -110
|
||||
ath11k_pci 0000:01:00.0: failed to reconfigure driver on crash recovery
|
||||
[..]
|
||||
|
||||
2) At this point reconfiguration fails (we have 2 resets) and
|
||||
ath11k_core_reconfigure_on_crash() calls ath11k_hal_srng_deinit()
|
||||
which destroys srng lists. However, it does not reset per-list
|
||||
->initialized flag.
|
||||
|
||||
3) Second ath11k_hal_dump_srng_stats() call sees stale ->initialized
|
||||
flag and attempts to dump srng stats:
|
||||
|
||||
Last interrupt received for each group:
|
||||
ath11k_pci 0000:01:00.0: group_id 0 66785ms before
|
||||
ath11k_pci 0000:01:00.0: group_id 1 14485062ms before
|
||||
ath11k_pci 0000:01:00.0: group_id 2 14485062ms before
|
||||
ath11k_pci 0000:01:00.0: group_id 3 14485062ms before
|
||||
ath11k_pci 0000:01:00.0: group_id 4 14780845ms before
|
||||
ath11k_pci 0000:01:00.0: group_id 5 14780845ms before
|
||||
ath11k_pci 0000:01:00.0: group_id 6 14485062ms before
|
||||
ath11k_pci 0000:01:00.0: group_id 7 66814ms before
|
||||
ath11k_pci 0000:01:00.0: group_id 8 68997ms before
|
||||
ath11k_pci 0000:01:00.0: group_id 9 67588ms before
|
||||
ath11k_pci 0000:01:00.0: group_id 10 69511ms before
|
||||
BUG: unable to handle page fault for address: ffffa007404eb010
|
||||
#PF: supervisor read access in kernel mode
|
||||
#PF: error_code(0x0000) - not-present page
|
||||
PGD 100000067 P4D 100000067 PUD 10022d067 PMD 100b01067 PTE 0
|
||||
Oops: 0000 [#1] PREEMPT SMP NOPTI
|
||||
RIP: 0010:ath11k_hal_dump_srng_stats+0x2b4/0x3b0 [ath11k]
|
||||
Call Trace:
|
||||
<TASK>
|
||||
? __die_body+0xae/0xb0
|
||||
? page_fault_oops+0x381/0x3e0
|
||||
? exc_page_fault+0x69/0xa0
|
||||
? asm_exc_page_fault+0x22/0x30
|
||||
? ath11k_hal_dump_srng_stats+0x2b4/0x3b0 [ath11k (HASH:6cea 4)]
|
||||
ath11k_qmi_driver_event_work+0xbd/0x1050 [ath11k (HASH:6cea 4)]
|
||||
worker_thread+0x389/0x930
|
||||
kthread+0x149/0x170
|
||||
|
||||
Clear per-list ->initialized flag in ath11k_hal_srng_deinit().
|
||||
|
||||
Signed-off-by: Sergey Senozhatsky <senozhatsky@chromium.org>
|
||||
Reviewed-by: Baochen Qiang <quic_bqiang@quicinc.com>
|
||||
Fixes: 5118935b1bc2 ("ath11k: dump SRNG stats during FW assert")
|
||||
Link: https://patch.msgid.link/20250612084551.702803-1-senozhatsky@chromium.org
|
||||
Signed-off-by: Jeff Johnson <jeff.johnson@oss.qualcomm.com>
|
||||
Signed-off-by: Sasha Levin <sashal@kernel.org>
|
||||
---
|
||||
drivers/net/wireless/ath/ath11k/hal.c | 4 ++++
|
||||
1 file changed, 4 insertions(+)
|
||||
|
||||
(limited to 'drivers/net/wireless/ath/ath11k')
|
||||
|
||||
--- a/drivers/net/wireless/ath/ath11k/hal.c
|
||||
+++ b/drivers/net/wireless/ath/ath11k/hal.c
|
||||
@@ -1341,6 +1341,10 @@ EXPORT_SYMBOL(ath11k_hal_srng_init);
|
||||
void ath11k_hal_srng_deinit(struct ath11k_base *ab)
|
||||
{
|
||||
struct ath11k_hal *hal = &ab->hal;
|
||||
+ int i;
|
||||
+
|
||||
+ for (i = 0; i < HAL_SRNG_RING_ID_MAX; i++)
|
||||
+ ab->hal.srng_list[i].initialized = 0;
|
||||
|
||||
ath11k_hal_unregister_srng_key(ab);
|
||||
ath11k_hal_free_cont_rdp(ab);
|
||||
@@ -0,0 +1,67 @@
|
||||
From 6bdef22d540258ca06f079f7b6ae100669a19b47 Mon Sep 17 00:00:00 2001
|
||||
From: Baochen Qiang <quic_bqiang@quicinc.com>
|
||||
Date: Tue, 3 Jun 2025 10:25:28 +0800
|
||||
Subject: wifi: ath11k: fix sleeping-in-atomic in
|
||||
ath11k_mac_op_set_bitrate_mask()
|
||||
|
||||
[ Upstream commit 65c12b104cb942d588a1a093acc4537fb3d3b129 ]
|
||||
|
||||
ath11k_mac_disable_peer_fixed_rate() is passed as the iterator to
|
||||
ieee80211_iterate_stations_atomic(). Note in this case the iterator is
|
||||
required to be atomic, however ath11k_mac_disable_peer_fixed_rate() does
|
||||
not follow it as it might sleep. Consequently below warning is seen:
|
||||
|
||||
BUG: sleeping function called from invalid context at wmi.c:304
|
||||
Call Trace:
|
||||
<TASK>
|
||||
dump_stack_lvl
|
||||
__might_resched.cold
|
||||
ath11k_wmi_cmd_send
|
||||
ath11k_wmi_set_peer_param
|
||||
ath11k_mac_disable_peer_fixed_rate
|
||||
ieee80211_iterate_stations_atomic
|
||||
ath11k_mac_op_set_bitrate_mask.cold
|
||||
|
||||
Change to ieee80211_iterate_stations_mtx() to fix this issue.
|
||||
|
||||
Tested-on: WCN6855 hw2.0 PCI WLAN.HSP.1.1-03125-QCAHSPSWPL_V1_V2_SILICONZ_LITE-3.6510.30
|
||||
|
||||
Fixes: d5c65159f289 ("ath11k: driver for Qualcomm IEEE 802.11ax devices")
|
||||
Signed-off-by: Baochen Qiang <quic_bqiang@quicinc.com>
|
||||
Link: https://patch.msgid.link/20250603-ath11k-use-non-atomic-iterator-v1-1-d75762068d56@quicinc.com
|
||||
Signed-off-by: Jeff Johnson <jeff.johnson@oss.qualcomm.com>
|
||||
Signed-off-by: Sasha Levin <sashal@kernel.org>
|
||||
---
|
||||
drivers/net/wireless/ath/ath11k/mac.c | 12 ++++++------
|
||||
1 file changed, 6 insertions(+), 6 deletions(-)
|
||||
|
||||
(limited to 'drivers/net/wireless/ath/ath11k')
|
||||
|
||||
--- a/drivers/net/wireless/ath/ath11k/mac.c
|
||||
+++ b/drivers/net/wireless/ath/ath11k/mac.c
|
||||
@@ -8740,9 +8740,9 @@ ath11k_mac_op_set_bitrate_mask(struct ie
|
||||
arvif->vdev_id, ret);
|
||||
return ret;
|
||||
}
|
||||
- ieee80211_iterate_stations_atomic(ar->hw,
|
||||
- ath11k_mac_disable_peer_fixed_rate,
|
||||
- arvif);
|
||||
+ ieee80211_iterate_stations_mtx(ar->hw,
|
||||
+ ath11k_mac_disable_peer_fixed_rate,
|
||||
+ arvif);
|
||||
} else if (ath11k_mac_bitrate_mask_get_single_nss(ar, arvif, band, mask,
|
||||
&single_nss)) {
|
||||
rate = WMI_FIXED_RATE_NONE;
|
||||
@@ -8809,9 +8809,9 @@ ath11k_mac_op_set_bitrate_mask(struct ie
|
||||
}
|
||||
|
||||
mutex_lock(&ar->conf_mutex);
|
||||
- ieee80211_iterate_stations_atomic(ar->hw,
|
||||
- ath11k_mac_disable_peer_fixed_rate,
|
||||
- arvif);
|
||||
+ ieee80211_iterate_stations_mtx(ar->hw,
|
||||
+ ath11k_mac_disable_peer_fixed_rate,
|
||||
+ arvif);
|
||||
|
||||
arvif->bitrate_mask = *mask;
|
||||
ieee80211_iterate_stations_atomic(ar->hw,
|
||||
@@ -0,0 +1,83 @@
|
||||
From 0f708ced89758247f5d2d70def00e7c1c80ff557 Mon Sep 17 00:00:00 2001
|
||||
From: Johan Hovold <johan+linaro@kernel.org>
|
||||
Date: Wed, 4 Jun 2025 16:34:53 +0200
|
||||
Subject: wifi: ath11k: fix dest ring-buffer corruption
|
||||
|
||||
commit 8c1ba5091fa9a2d1478da63173b16a701bdf86bb upstream.
|
||||
|
||||
Add the missing memory barrier to make sure that destination ring
|
||||
descriptors are read after the head pointers to avoid using stale data
|
||||
on weakly ordered architectures like aarch64.
|
||||
|
||||
The barrier is added to the ath11k_hal_srng_access_begin() helper for
|
||||
symmetry with follow-on fixes for source ring buffer corruption which
|
||||
will add barriers to ath11k_hal_srng_access_end().
|
||||
|
||||
Tested-on: WCN6855 hw2.1 WLAN.HSP.1.1-03125-QCAHSPSWPL_V1_V2_SILICONZ_LITE-3.6510.41
|
||||
|
||||
Fixes: d5c65159f289 ("ath11k: driver for Qualcomm IEEE 802.11ax devices")
|
||||
Cc: stable@vger.kernel.org # 5.6
|
||||
Signed-off-by: Johan Hovold <johan+linaro@kernel.org>
|
||||
Reviewed-by: Baochen Qiang <quic_bqiang@quicinc.com>
|
||||
Link: https://patch.msgid.link/20250604143457.26032-2-johan+linaro@kernel.org
|
||||
Signed-off-by: Jeff Johnson <jeff.johnson@oss.qualcomm.com>
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
---
|
||||
drivers/net/wireless/ath/ath11k/ce.c | 3 ---
|
||||
drivers/net/wireless/ath/ath11k/dp_rx.c | 3 ---
|
||||
drivers/net/wireless/ath/ath11k/hal.c | 12 +++++++++++-
|
||||
3 files changed, 11 insertions(+), 7 deletions(-)
|
||||
|
||||
(limited to 'drivers/net/wireless/ath/ath11k')
|
||||
|
||||
--- a/drivers/net/wireless/ath/ath11k/ce.c
|
||||
+++ b/drivers/net/wireless/ath/ath11k/ce.c
|
||||
@@ -393,9 +393,6 @@ static int ath11k_ce_completed_recv_next
|
||||
goto err;
|
||||
}
|
||||
|
||||
- /* Make sure descriptor is read after the head pointer. */
|
||||
- dma_rmb();
|
||||
-
|
||||
*nbytes = ath11k_hal_ce_dst_status_get_length(desc);
|
||||
|
||||
*skb = pipe->dest_ring->skb[sw_index];
|
||||
--- a/drivers/net/wireless/ath/ath11k/dp_rx.c
|
||||
+++ b/drivers/net/wireless/ath/ath11k/dp_rx.c
|
||||
@@ -2650,9 +2650,6 @@ int ath11k_dp_process_rx(struct ath11k_b
|
||||
try_again:
|
||||
ath11k_hal_srng_access_begin(ab, srng);
|
||||
|
||||
- /* Make sure descriptor is read after the head pointer. */
|
||||
- dma_rmb();
|
||||
-
|
||||
while (likely(desc =
|
||||
(struct hal_reo_dest_ring *)ath11k_hal_srng_dst_get_next_entry(ab,
|
||||
srng))) {
|
||||
--- a/drivers/net/wireless/ath/ath11k/hal.c
|
||||
+++ b/drivers/net/wireless/ath/ath11k/hal.c
|
||||
@@ -823,13 +823,23 @@ u32 *ath11k_hal_srng_src_peek(struct ath
|
||||
|
||||
void ath11k_hal_srng_access_begin(struct ath11k_base *ab, struct hal_srng *srng)
|
||||
{
|
||||
+ u32 hp;
|
||||
+
|
||||
lockdep_assert_held(&srng->lock);
|
||||
|
||||
if (srng->ring_dir == HAL_SRNG_DIR_SRC) {
|
||||
srng->u.src_ring.cached_tp =
|
||||
*(volatile u32 *)srng->u.src_ring.tp_addr;
|
||||
} else {
|
||||
- srng->u.dst_ring.cached_hp = READ_ONCE(*srng->u.dst_ring.hp_addr);
|
||||
+ hp = READ_ONCE(*srng->u.dst_ring.hp_addr);
|
||||
+
|
||||
+ if (hp != srng->u.dst_ring.cached_hp) {
|
||||
+ srng->u.dst_ring.cached_hp = hp;
|
||||
+ /* Make sure descriptor is read after the head
|
||||
+ * pointer.
|
||||
+ */
|
||||
+ dma_rmb();
|
||||
+ }
|
||||
|
||||
/* Try to prefetch the next descriptor in the ring */
|
||||
if (srng->flags & HAL_SRNG_FLAGS_CACHED)
|
||||
@@ -0,0 +1,56 @@
|
||||
From eed5fcf4a3d20fdbd9af2e602eab2b581264822f Mon Sep 17 00:00:00 2001
|
||||
From: Johan Hovold <johan+linaro@kernel.org>
|
||||
Date: Wed, 4 Jun 2025 16:34:56 +0200
|
||||
Subject: wifi: ath11k: fix source ring-buffer corruption
|
||||
|
||||
commit 6efa0df54022c6c9fd4d294b87622c7fcdc418c8 upstream.
|
||||
|
||||
Add the missing memory barrier to make sure that LMAC source ring
|
||||
descriptors are written before updating the head pointer to avoid
|
||||
passing stale data to the firmware on weakly ordered architectures like
|
||||
aarch64.
|
||||
|
||||
Note that non-LMAC rings use MMIO write accessors which have the
|
||||
required write memory barrier.
|
||||
|
||||
Tested-on: WCN6855 hw2.1 WLAN.HSP.1.1-03125-QCAHSPSWPL_V1_V2_SILICONZ_LITE-3.6510.41
|
||||
|
||||
Fixes: d5c65159f289 ("ath11k: driver for Qualcomm IEEE 802.11ax devices")
|
||||
Cc: stable@vger.kernel.org # 5.6
|
||||
Signed-off-by: Johan Hovold <johan+linaro@kernel.org>
|
||||
Reviewed-by: Baochen Qiang <quic_bqiang@quicinc.com>
|
||||
Link: https://patch.msgid.link/20250604143457.26032-5-johan+linaro@kernel.org
|
||||
Signed-off-by: Jeff Johnson <jeff.johnson@oss.qualcomm.com>
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
---
|
||||
drivers/net/wireless/ath/ath11k/hal.c | 10 +++++++++-
|
||||
1 file changed, 9 insertions(+), 1 deletion(-)
|
||||
|
||||
(limited to 'drivers/net/wireless/ath/ath11k')
|
||||
|
||||
--- a/drivers/net/wireless/ath/ath11k/hal.c
|
||||
+++ b/drivers/net/wireless/ath/ath11k/hal.c
|
||||
@@ -862,7 +862,11 @@ void ath11k_hal_srng_access_end(struct a
|
||||
if (srng->ring_dir == HAL_SRNG_DIR_SRC) {
|
||||
srng->u.src_ring.last_tp =
|
||||
*(volatile u32 *)srng->u.src_ring.tp_addr;
|
||||
- *srng->u.src_ring.hp_addr = srng->u.src_ring.hp;
|
||||
+ /* Make sure descriptor is written before updating the
|
||||
+ * head pointer.
|
||||
+ */
|
||||
+ dma_wmb();
|
||||
+ WRITE_ONCE(*srng->u.src_ring.hp_addr, srng->u.src_ring.hp);
|
||||
} else {
|
||||
srng->u.dst_ring.last_hp = *srng->u.dst_ring.hp_addr;
|
||||
*srng->u.dst_ring.tp_addr = srng->u.dst_ring.tp;
|
||||
@@ -871,6 +875,10 @@ void ath11k_hal_srng_access_end(struct a
|
||||
if (srng->ring_dir == HAL_SRNG_DIR_SRC) {
|
||||
srng->u.src_ring.last_tp =
|
||||
*(volatile u32 *)srng->u.src_ring.tp_addr;
|
||||
+ /* Assume implementation use an MMIO write accessor
|
||||
+ * which has the required wmb() so that the descriptor
|
||||
+ * is written before the updating the head pointer.
|
||||
+ */
|
||||
ath11k_hif_write32(ab,
|
||||
(unsigned long)srng->u.src_ring.hp_addr -
|
||||
(unsigned long)ab->mem,
|
||||
@@ -0,0 +1,61 @@
|
||||
From 6fc2589aae91818dd1183a589ab97d8e5c25364e Mon Sep 17 00:00:00 2001
|
||||
From: Johan Hovold <johan+linaro@kernel.org>
|
||||
Date: Wed, 4 Jun 2025 16:34:57 +0200
|
||||
Subject: wifi: ath11k: fix dest ring-buffer corruption when ring is full
|
||||
|
||||
commit aa6956150f820e6a6deba44be325ddfcb5b10f88 upstream.
|
||||
|
||||
Add the missing memory barriers to make sure that destination ring
|
||||
descriptors are read before updating the tail pointer (and passing
|
||||
ownership to the device) to avoid memory corruption on weakly ordered
|
||||
architectures like aarch64 when the ring is full.
|
||||
|
||||
Tested-on: WCN6855 hw2.1 WLAN.HSP.1.1-03125-QCAHSPSWPL_V1_V2_SILICONZ_LITE-3.6510.41
|
||||
|
||||
Fixes: d5c65159f289 ("ath11k: driver for Qualcomm IEEE 802.11ax devices")
|
||||
Cc: stable@vger.kernel.org # 5.6
|
||||
Signed-off-by: Johan Hovold <johan+linaro@kernel.org>
|
||||
Reviewed-by: Baochen Qiang <quic_bqiang@quicinc.com>
|
||||
Link: https://patch.msgid.link/20250604143457.26032-6-johan+linaro@kernel.org
|
||||
Signed-off-by: Jeff Johnson <jeff.johnson@oss.qualcomm.com>
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
---
|
||||
drivers/net/wireless/ath/ath11k/hal.c | 11 +++++++++--
|
||||
1 file changed, 9 insertions(+), 2 deletions(-)
|
||||
|
||||
(limited to 'drivers/net/wireless/ath/ath11k')
|
||||
|
||||
--- a/drivers/net/wireless/ath/ath11k/hal.c
|
||||
+++ b/drivers/net/wireless/ath/ath11k/hal.c
|
||||
@@ -854,7 +854,6 @@ void ath11k_hal_srng_access_end(struct a
|
||||
{
|
||||
lockdep_assert_held(&srng->lock);
|
||||
|
||||
- /* TODO: See if we need a write memory barrier here */
|
||||
if (srng->flags & HAL_SRNG_FLAGS_LMAC_RING) {
|
||||
/* For LMAC rings, ring pointer updates are done through FW and
|
||||
* hence written to a shared memory location that is read by FW
|
||||
@@ -869,7 +868,11 @@ void ath11k_hal_srng_access_end(struct a
|
||||
WRITE_ONCE(*srng->u.src_ring.hp_addr, srng->u.src_ring.hp);
|
||||
} else {
|
||||
srng->u.dst_ring.last_hp = *srng->u.dst_ring.hp_addr;
|
||||
- *srng->u.dst_ring.tp_addr = srng->u.dst_ring.tp;
|
||||
+ /* Make sure descriptor is read before updating the
|
||||
+ * tail pointer.
|
||||
+ */
|
||||
+ dma_mb();
|
||||
+ WRITE_ONCE(*srng->u.dst_ring.tp_addr, srng->u.dst_ring.tp);
|
||||
}
|
||||
} else {
|
||||
if (srng->ring_dir == HAL_SRNG_DIR_SRC) {
|
||||
@@ -885,6 +888,10 @@ void ath11k_hal_srng_access_end(struct a
|
||||
srng->u.src_ring.hp);
|
||||
} else {
|
||||
srng->u.dst_ring.last_hp = *srng->u.dst_ring.hp_addr;
|
||||
+ /* Make sure descriptor is read before updating the
|
||||
+ * tail pointer.
|
||||
+ */
|
||||
+ mb();
|
||||
ath11k_hif_write32(ab,
|
||||
(unsigned long)srng->u.dst_ring.tp_addr -
|
||||
(unsigned long)ab->mem,
|
||||
@@ -0,0 +1,237 @@
|
||||
From 9a394fd149502394c20dc2ebecb8acfde6f6aeac Mon Sep 17 00:00:00 2001
|
||||
From: Rameshkumar Sundaram <rameshkumar.sundaram@oss.qualcomm.com>
|
||||
Date: Sun, 10 Aug 2025 22:30:18 +0530
|
||||
Subject: wifi: ath11k: fix group data packet drops during rekey
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
[ Upstream commit 97acb0259cc9cbfbd7ab689e25684f3d8ce10e26 ]
|
||||
|
||||
During GTK rekey, mac80211 issues a clear key (if the old key exists)
|
||||
followed by an install key operation in the same context. This causes
|
||||
ath11k to send two WMI commands in quick succession: one to clear the
|
||||
old key and another to install the new key in the same slot.
|
||||
|
||||
Under certain conditions—especially under high load or time sensitive
|
||||
scenarios, firmware may process these commands asynchronously in a way
|
||||
that firmware assumes the key is cleared whereas hardware has a valid key.
|
||||
This inconsistency between hardware and firmware leads to group addressed
|
||||
packet drops. Only setting the same key again can restore a valid key in
|
||||
firmware and allow packets to be transmitted.
|
||||
|
||||
This issue remained latent because the host's clear key commands were
|
||||
not effective in firmware until commit 436a4e886598 ("ath11k: clear the
|
||||
keys properly via DISABLE_KEY"). That commit enabled the host to
|
||||
explicitly clear group keys, which inadvertently exposed the race.
|
||||
|
||||
To mitigate this, restrict group key clearing across all modes (AP, STA,
|
||||
MESH). During rekey, the new key can simply be set on top of the previous
|
||||
one, avoiding the need for a clear followed by a set.
|
||||
|
||||
However, in AP mode specifically, permit group key clearing when no
|
||||
stations are associated. This exception supports transitions from secure
|
||||
modes (e.g., WPA2/WPA3) to open mode, during which all associated peers
|
||||
are removed and the group key is cleared as part of the transition.
|
||||
|
||||
Add a per-BSS station counter to track the presence of stations during
|
||||
set key operations. Also add a reset_group_keys flag to track the key
|
||||
re-installation state and avoid repeated installation of the same key
|
||||
when the number of connected stations transitions to non-zero within a
|
||||
rekey period.
|
||||
|
||||
Additionally, for AP and Mesh modes, when the first station associates,
|
||||
reinstall the same group key that was last set. This ensures that the
|
||||
firmware recovers from any race that may have occurred during a previous
|
||||
key clear when no stations were associated.
|
||||
|
||||
This change ensures that key clearing is permitted only when no clients
|
||||
are connected, avoiding packet loss while enabling dynamic security mode
|
||||
transitions.
|
||||
|
||||
Tested-on: QCN9074 hw1.0 PCI WLAN.HK.2.9.0.1-02146-QCAHKSWPL_SILICONZ-1
|
||||
Tested-on: WCN6855 hw2.1 PCI WLAN.HSP.1.1-03125-QCAHSPSWPL_V1_V2_SILICONZ_LITE-3.6510.41
|
||||
|
||||
Reported-by: Steffen Moser <lists@steffen-moser.de>
|
||||
Closes: https://lore.kernel.org/linux-wireless/c6366409-9928-4dd7-bf7b-ba7fcf20eabf@steffen-moser.de
|
||||
Fixes: 436a4e886598 ("ath11k: clear the keys properly via DISABLE_KEY")
|
||||
Signed-off-by: Rameshkumar Sundaram <rameshkumar.sundaram@oss.qualcomm.com>
|
||||
Tested-by: Nicolas Escande <nico.escande@gmail.com>
|
||||
Reviewed-by: Vasanthakumar Thiagarajan <vasanthakumar.thiagarajan@oss.qualcomm.com>
|
||||
Link: https://patch.msgid.link/20250810170018.1124014-1-rameshkumar.sundaram@oss.qualcomm.com
|
||||
Signed-off-by: Jeff Johnson <jeff.johnson@oss.qualcomm.com>
|
||||
Signed-off-by: Sasha Levin <sashal@kernel.org>
|
||||
---
|
||||
drivers/net/wireless/ath/ath11k/core.h | 2 +
|
||||
drivers/net/wireless/ath/ath11k/mac.c | 111 ++++++++++++++++++++++++++++++---
|
||||
2 files changed, 104 insertions(+), 9 deletions(-)
|
||||
|
||||
(limited to 'drivers/net/wireless/ath/ath11k')
|
||||
|
||||
--- a/drivers/net/wireless/ath/ath11k/core.h
|
||||
+++ b/drivers/net/wireless/ath/ath11k/core.h
|
||||
@@ -414,6 +414,8 @@ struct ath11k_vif {
|
||||
bool do_not_send_tmpl;
|
||||
struct ath11k_arp_ns_offload arp_ns_offload;
|
||||
struct ath11k_rekey_data rekey_data;
|
||||
+ u32 num_stations;
|
||||
+ bool reinstall_group_keys;
|
||||
|
||||
struct ath11k_reg_tpc_power_info reg_tpc_info;
|
||||
|
||||
--- a/drivers/net/wireless/ath/ath11k/mac.c
|
||||
+++ b/drivers/net/wireless/ath/ath11k/mac.c
|
||||
@@ -4317,6 +4317,40 @@ static int ath11k_clear_peer_keys(struct
|
||||
return first_errno;
|
||||
}
|
||||
|
||||
+static int ath11k_set_group_keys(struct ath11k_vif *arvif)
|
||||
+{
|
||||
+ struct ath11k *ar = arvif->ar;
|
||||
+ struct ath11k_base *ab = ar->ab;
|
||||
+ const u8 *addr = arvif->bssid;
|
||||
+ int i, ret, first_errno = 0;
|
||||
+ struct ath11k_peer *peer;
|
||||
+
|
||||
+ spin_lock_bh(&ab->base_lock);
|
||||
+ peer = ath11k_peer_find(ab, arvif->vdev_id, addr);
|
||||
+ spin_unlock_bh(&ab->base_lock);
|
||||
+
|
||||
+ if (!peer)
|
||||
+ return -ENOENT;
|
||||
+
|
||||
+ for (i = 0; i < ARRAY_SIZE(peer->keys); i++) {
|
||||
+ struct ieee80211_key_conf *key = peer->keys[i];
|
||||
+
|
||||
+ if (!key || (key->flags & IEEE80211_KEY_FLAG_PAIRWISE))
|
||||
+ continue;
|
||||
+
|
||||
+ ret = ath11k_install_key(arvif, key, SET_KEY, addr,
|
||||
+ WMI_KEY_GROUP);
|
||||
+ if (ret < 0 && first_errno == 0)
|
||||
+ first_errno = ret;
|
||||
+
|
||||
+ if (ret < 0)
|
||||
+ ath11k_warn(ab, "failed to set group key of idx %d for vdev %d: %d\n",
|
||||
+ i, arvif->vdev_id, ret);
|
||||
+ }
|
||||
+
|
||||
+ return first_errno;
|
||||
+}
|
||||
+
|
||||
static int ath11k_mac_op_set_key(struct ieee80211_hw *hw, enum set_key_cmd cmd,
|
||||
struct ieee80211_vif *vif, struct ieee80211_sta *sta,
|
||||
struct ieee80211_key_conf *key)
|
||||
@@ -4326,6 +4360,7 @@ static int ath11k_mac_op_set_key(struct
|
||||
struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif);
|
||||
struct ath11k_peer *peer;
|
||||
struct ath11k_sta *arsta;
|
||||
+ bool is_ap_with_no_sta;
|
||||
const u8 *peer_addr;
|
||||
int ret = 0;
|
||||
u32 flags = 0;
|
||||
@@ -4386,16 +4421,57 @@ static int ath11k_mac_op_set_key(struct
|
||||
else
|
||||
flags |= WMI_KEY_GROUP;
|
||||
|
||||
- ret = ath11k_install_key(arvif, key, cmd, peer_addr, flags);
|
||||
- if (ret) {
|
||||
- ath11k_warn(ab, "ath11k_install_key failed (%d)\n", ret);
|
||||
- goto exit;
|
||||
- }
|
||||
+ ath11k_dbg(ar->ab, ATH11K_DBG_MAC,
|
||||
+ "%s for peer %pM on vdev %d flags 0x%X, type = %d, num_sta %d\n",
|
||||
+ cmd == SET_KEY ? "SET_KEY" : "DEL_KEY", peer_addr, arvif->vdev_id,
|
||||
+ flags, arvif->vdev_type, arvif->num_stations);
|
||||
+
|
||||
+ /* Allow group key clearing only in AP mode when no stations are
|
||||
+ * associated. There is a known race condition in firmware where
|
||||
+ * group addressed packets may be dropped if the key is cleared
|
||||
+ * and immediately set again during rekey.
|
||||
+ *
|
||||
+ * During GTK rekey, mac80211 issues a clear key (if the old key
|
||||
+ * exists) followed by an install key operation for same key
|
||||
+ * index. This causes ath11k to send two WMI commands in quick
|
||||
+ * succession: one to clear the old key and another to install the
|
||||
+ * new key in the same slot.
|
||||
+ *
|
||||
+ * Under certain conditions—especially under high load or time
|
||||
+ * sensitive scenarios, firmware may process these commands
|
||||
+ * asynchronously in a way that firmware assumes the key is
|
||||
+ * cleared whereas hardware has a valid key. This inconsistency
|
||||
+ * between hardware and firmware leads to group addressed packet
|
||||
+ * drops after rekey.
|
||||
+ * Only setting the same key again can restore a valid key in
|
||||
+ * firmware and allow packets to be transmitted.
|
||||
+ *
|
||||
+ * There is a use case where an AP can transition from Secure mode
|
||||
+ * to open mode without a vdev restart by just deleting all
|
||||
+ * associated peers and clearing key, Hence allow clear key for
|
||||
+ * that case alone. Mark arvif->reinstall_group_keys in such cases
|
||||
+ * and reinstall the same key when the first peer is added,
|
||||
+ * allowing firmware to recover from the race if it had occurred.
|
||||
+ */
|
||||
|
||||
- ret = ath11k_dp_peer_rx_pn_replay_config(arvif, peer_addr, cmd, key);
|
||||
- if (ret) {
|
||||
- ath11k_warn(ab, "failed to offload PN replay detection %d\n", ret);
|
||||
- goto exit;
|
||||
+ is_ap_with_no_sta = (vif->type == NL80211_IFTYPE_AP &&
|
||||
+ !arvif->num_stations);
|
||||
+ if ((flags & WMI_KEY_PAIRWISE) || cmd == SET_KEY || is_ap_with_no_sta) {
|
||||
+ ret = ath11k_install_key(arvif, key, cmd, peer_addr, flags);
|
||||
+ if (ret) {
|
||||
+ ath11k_warn(ab, "ath11k_install_key failed (%d)\n", ret);
|
||||
+ goto exit;
|
||||
+ }
|
||||
+
|
||||
+ ret = ath11k_dp_peer_rx_pn_replay_config(arvif, peer_addr, cmd, key);
|
||||
+ if (ret) {
|
||||
+ ath11k_warn(ab, "failed to offload PN replay detection %d\n",
|
||||
+ ret);
|
||||
+ goto exit;
|
||||
+ }
|
||||
+
|
||||
+ if ((flags & WMI_KEY_GROUP) && cmd == SET_KEY && is_ap_with_no_sta)
|
||||
+ arvif->reinstall_group_keys = true;
|
||||
}
|
||||
|
||||
spin_lock_bh(&ab->base_lock);
|
||||
@@ -4994,6 +5070,7 @@ static int ath11k_mac_inc_num_stations(s
|
||||
return -ENOBUFS;
|
||||
|
||||
ar->num_stations++;
|
||||
+ arvif->num_stations++;
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -5009,6 +5086,7 @@ static void ath11k_mac_dec_num_stations(
|
||||
return;
|
||||
|
||||
ar->num_stations--;
|
||||
+ arvif->num_stations--;
|
||||
}
|
||||
|
||||
static u32 ath11k_mac_ieee80211_sta_bw_to_wmi(struct ath11k *ar,
|
||||
@@ -9536,6 +9614,21 @@ static int ath11k_mac_station_add(struct
|
||||
goto exit;
|
||||
}
|
||||
|
||||
+ /* Driver allows the DEL KEY followed by SET KEY sequence for
|
||||
+ * group keys for only when there is no clients associated, if at
|
||||
+ * all firmware has entered the race during that window,
|
||||
+ * reinstalling the same key when the first sta connects will allow
|
||||
+ * firmware to recover from the race.
|
||||
+ */
|
||||
+ if (arvif->num_stations == 1 && arvif->reinstall_group_keys) {
|
||||
+ ath11k_dbg(ab, ATH11K_DBG_MAC, "set group keys on 1st station add for vdev %d\n",
|
||||
+ arvif->vdev_id);
|
||||
+ ret = ath11k_set_group_keys(arvif);
|
||||
+ if (ret)
|
||||
+ goto dec_num_station;
|
||||
+ arvif->reinstall_group_keys = false;
|
||||
+ }
|
||||
+
|
||||
arsta->rx_stats = kzalloc(sizeof(*arsta->rx_stats), GFP_KERNEL);
|
||||
if (!arsta->rx_stats) {
|
||||
ret = -ENOMEM;
|
||||
@@ -0,0 +1,40 @@
|
||||
From 888830b2cbc035838bebefe94502976da94332a5 Mon Sep 17 00:00:00 2001
|
||||
From: Matvey Kovalev <matvey.kovalev@ispras.ru>
|
||||
Date: Wed, 17 Sep 2025 22:20:01 +0300
|
||||
Subject: wifi: ath11k: fix NULL dereference in ath11k_qmi_m3_load()
|
||||
|
||||
commit 3fd2ef2ae2b5c955584a3bee8e83ae7d7a98f782 upstream.
|
||||
|
||||
If ab->fw.m3_data points to data, then fw pointer remains null.
|
||||
Further, if m3_mem is not allocated, then fw is dereferenced to be
|
||||
passed to ath11k_err function.
|
||||
|
||||
Replace fw->size by m3_len.
|
||||
|
||||
Found by Linux Verification Center (linuxtesting.org) with SVACE.
|
||||
|
||||
Fixes: 7db88b962f06 ("wifi: ath11k: add firmware-2.bin support")
|
||||
Cc: stable@vger.kernel.org
|
||||
Signed-off-by: Matvey Kovalev <matvey.kovalev@ispras.ru>
|
||||
Reviewed-by: Baochen Qiang <baochen.qiang@oss.qualcomm.com>
|
||||
Reviewed-by: Vasanthakumar Thiagarajan <vasanthakumar.thiagarajan@oss.qualcomm.com>
|
||||
Link: https://patch.msgid.link/20250917192020.1340-1-matvey.kovalev@ispras.ru
|
||||
Signed-off-by: Jeff Johnson <jeff.johnson@oss.qualcomm.com>
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
---
|
||||
drivers/net/wireless/ath/ath11k/qmi.c | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
(limited to 'drivers/net/wireless/ath/ath11k')
|
||||
|
||||
--- a/drivers/net/wireless/ath/ath11k/qmi.c
|
||||
+++ b/drivers/net/wireless/ath/ath11k/qmi.c
|
||||
@@ -2576,7 +2576,7 @@ static int ath11k_qmi_m3_load(struct ath
|
||||
GFP_KERNEL);
|
||||
if (!m3_mem->vaddr) {
|
||||
ath11k_err(ab, "failed to allocate memory for M3 with size %zu\n",
|
||||
- fw->size);
|
||||
+ m3_len);
|
||||
ret = -ENOMEM;
|
||||
goto out;
|
||||
}
|
||||
35
patches/ath11k/983-ath11k-Enable-VHT-for-2G.patch
Normal file
35
patches/ath11k/983-ath11k-Enable-VHT-for-2G.patch
Normal file
@@ -0,0 +1,35 @@
|
||||
--- a/drivers/net/wireless/ath/ath11k/mac.c
|
||||
+++ b/drivers/net/wireless/ath/ath11k/mac.c
|
||||
@@ -2868,9 +2868,9 @@ static void ath11k_peer_assoc_h_phymode(
|
||||
} else if (sta->deflink.vht_cap.vht_supported &&
|
||||
!ath11k_peer_assoc_h_vht_masked(vht_mcs_mask)) {
|
||||
if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_40)
|
||||
- phymode = MODE_11AC_VHT40;
|
||||
+ phymode = MODE_11AC_VHT40_2G;
|
||||
else
|
||||
- phymode = MODE_11AC_VHT20;
|
||||
+ phymode = MODE_11AC_VHT20_2G;
|
||||
} else if (sta->deflink.ht_cap.ht_supported &&
|
||||
!ath11k_peer_assoc_h_ht_masked(ht_mcs_mask)) {
|
||||
if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_40)
|
||||
@@ -5547,6 +5547,9 @@ static void ath11k_mac_setup_ht_vht_cap(
|
||||
*ht_cap_info = ht_cap;
|
||||
band->ht_cap = ath11k_create_ht_cap(ar, ht_cap,
|
||||
rate_cap_rx_chainmask);
|
||||
+
|
||||
+ band->vht_cap = ath11k_create_vht_cap(ar, rate_cap_tx_chainmask,
|
||||
+ rate_cap_rx_chainmask);
|
||||
}
|
||||
|
||||
if (cap->supported_bands & WMI_HOST_WLAN_5G_CAP &&
|
||||
--- a/drivers/net/wireless/ath/ath11k/wmi.c
|
||||
+++ b/drivers/net/wireless/ath/ath11k/wmi.c
|
||||
@@ -411,6 +411,8 @@ ath11k_pull_mac_phy_cap_svc_ready_ext(st
|
||||
* handled.
|
||||
*/
|
||||
if (mac_phy_caps->supported_bands & WMI_HOST_WLAN_2G_CAP) {
|
||||
+ pdev_cap->vht_cap = mac_phy_caps->vht_cap_info_2g;
|
||||
+ pdev_cap->vht_mcs = mac_phy_caps->vht_supp_mcs_2g;
|
||||
pdev_cap->tx_chain_mask = mac_phy_caps->tx_chain_mask_2g;
|
||||
pdev_cap->rx_chain_mask = mac_phy_caps->rx_chain_mask_2g;
|
||||
}
|
||||
13
patches/ath11k/984-ath11k-workaround-for-memory-leak.patch
Normal file
13
patches/ath11k/984-ath11k-workaround-for-memory-leak.patch
Normal file
@@ -0,0 +1,13 @@
|
||||
--- a/drivers/net/wireless/ath/ath11k/dp_rx.c
|
||||
+++ b/drivers/net/wireless/ath/ath11k/dp_rx.c
|
||||
@@ -371,8 +371,8 @@ int ath11k_dp_rxbufs_replenish(struct at
|
||||
num_remain = req_entries;
|
||||
|
||||
while (num_remain > 0) {
|
||||
- skb = dev_alloc_skb(DP_RX_BUFFER_SIZE +
|
||||
- DP_RX_BUFFER_ALIGN_SIZE);
|
||||
+ skb = alloc_skb(DP_RX_BUFFER_SIZE +
|
||||
+ DP_RX_BUFFER_ALIGN_SIZE, GFP_ATOMIC);
|
||||
if (!skb)
|
||||
break;
|
||||
|
||||
17
patches/ath12k/100-ath12k-prevent-ltssm-startup-crash.patch
Normal file
17
patches/ath12k/100-ath12k-prevent-ltssm-startup-crash.patch
Normal file
@@ -0,0 +1,17 @@
|
||||
Fix ltssm crashes on BPI-Rx boards.
|
||||
Seems read32/write32 using wrong address which
|
||||
is not a problem on x86/64 PCI controllers.
|
||||
But have issues on BPI-Rx boards.
|
||||
|
||||
--- a/drivers/net/wireless/ath/ath12k/pci.c
|
||||
+++ b/drivers/net/wireless/ath/ath12k/pci.c
|
||||
@@ -279,6 +279,9 @@ static void ath12k_pci_enable_ltssm(stru
|
||||
u32 val;
|
||||
int i;
|
||||
|
||||
+ /* Prevent startup crash on BPI-Rx */
|
||||
+ return;
|
||||
+
|
||||
val = ath12k_pci_read32(ab, PCIE_PCIE_PARF_LTSSM);
|
||||
|
||||
/* PCIE link seems very unstable after the Hot Reset*/
|
||||
@@ -0,0 +1,153 @@
|
||||
From patchwork Mon Mar 10 13:28:18 2025
|
||||
Content-Type: text/plain; charset="utf-8"
|
||||
MIME-Version: 1.0
|
||||
Content-Transfer-Encoding: 7bit
|
||||
X-Patchwork-Submitter: Mantas <mantas@8devices.com>
|
||||
X-Patchwork-Id: 14010032
|
||||
X-Patchwork-Delegate: quic_jjohnson@quicinc.com
|
||||
Received: from mail-lf1-f41.google.com (mail-lf1-f41.google.com
|
||||
[209.85.167.41])
|
||||
(using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits))
|
||||
(No client certificate requested)
|
||||
by smtp.subspace.kernel.org (Postfix) with ESMTPS id 2ADD522A4DA
|
||||
for <linux-wireless@vger.kernel.org>; Mon, 10 Mar 2025 13:28:47 +0000 (UTC)
|
||||
Authentication-Results: smtp.subspace.kernel.org;
|
||||
arc=none smtp.client-ip=209.85.167.41
|
||||
ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116;
|
||||
t=1741613330; cv=none;
|
||||
b=Vx8zckt7S92zrauuzzoNjX/1eXhlbq+4R3uNXCWPCBFXXHBuAHrmXrDOQILh1g+IfyWOgpyXyibTTkLg6IWREXcA/OjV+V9ehNaQaHJAt4D14uxuNW6uIDA56myF+bhdmiZnfGZfK3puVBjeCAMbZwGhc81dTR3RaEhKYP93Wcg=
|
||||
ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org;
|
||||
s=arc-20240116; t=1741613330; c=relaxed/simple;
|
||||
bh=yRMCaDQnvsF6vQ/w9rLRB/etZre1sSzpWUDTNGX0zAk=;
|
||||
h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:To:Cc;
|
||||
b=rFopB9f+nOXbmGbGXoo4SeBAV82xQ6nydiMDCiYAw7sELURejS0lK9xQZolnRGeyNtHnQgix39lrcilr6cdvGMhaziXzS6RYlY2WyoHTMxHwYGUIa9McnJ1AkCczdVv6SgeNUlVVEgAZBqH0Q2pmd5b91h/PMc/aPdQm9SQY8IU=
|
||||
ARC-Authentication-Results: i=1; smtp.subspace.kernel.org;
|
||||
dmarc=pass (p=quarantine dis=none) header.from=8devices.com;
|
||||
spf=pass smtp.mailfrom=8devices.com;
|
||||
dkim=pass (2048-bit key) header.d=8devices.com header.i=@8devices.com
|
||||
header.b=LitRbtOU; arc=none smtp.client-ip=209.85.167.41
|
||||
Authentication-Results: smtp.subspace.kernel.org;
|
||||
dmarc=pass (p=quarantine dis=none) header.from=8devices.com
|
||||
Authentication-Results: smtp.subspace.kernel.org;
|
||||
spf=pass smtp.mailfrom=8devices.com
|
||||
Authentication-Results: smtp.subspace.kernel.org;
|
||||
dkim=pass (2048-bit key) header.d=8devices.com header.i=@8devices.com
|
||||
header.b="LitRbtOU"
|
||||
Received: by mail-lf1-f41.google.com with SMTP id
|
||||
2adb3069b0e04-5499c5d9691so1866539e87.2
|
||||
for <linux-wireless@vger.kernel.org>;
|
||||
Mon, 10 Mar 2025 06:28:47 -0700 (PDT)
|
||||
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
|
||||
d=8devices.com; s=8devices; t=1741613326; x=1742218126;
|
||||
darn=vger.kernel.org;
|
||||
h=cc:to:message-id:content-transfer-encoding:mime-version:subject
|
||||
:date:from:from:to:cc:subject:date:message-id:reply-to;
|
||||
bh=6+w3029kfHch5SeD/z0zur2K64cd98za9hhmN/ji0MY=;
|
||||
b=LitRbtOUxDhUPycKFo/pzuJu9Y11QmpYSvOmkgM9TcNEOsBvLk8z0EJ7+xy24ijRGJ
|
||||
Xz16V9Z1kJGkXBK90klI6s3RjVBQf+dxf37t2kdQWdrgOE2VhXjnnV5zP7odCkMmOViw
|
||||
2UmKSvagsxc6KojE2OYyd+vR3hmL+4fCtegorXMaRrf0Brje8XJmViAUgbc+IAtfL0Ao
|
||||
pnig300fAb4WbnmIJIRiOUKoTESjbJRkUehGJkhe1ztiPE1F86AVMXw5IrDBR/WtMin1
|
||||
9nYYDqfSGvI7fOvfStfZ9hS0ShIhBNd5naccyQ7c0xSTvXJ51vUvNvdZuufm9OKsbQ99
|
||||
nh4g==
|
||||
X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
|
||||
d=1e100.net; s=20230601; t=1741613326; x=1742218126;
|
||||
h=cc:to:message-id:content-transfer-encoding:mime-version:subject
|
||||
:date:from:x-gm-message-state:from:to:cc:subject:date:message-id
|
||||
:reply-to;
|
||||
bh=6+w3029kfHch5SeD/z0zur2K64cd98za9hhmN/ji0MY=;
|
||||
b=Gx+AX3aIV66kzjGLGOToc2CuQrnfaWn43yZW2rgRpKJv03162undTbo+SdaI8s+8mY
|
||||
aKrYsNOOqI4h6pHCZsVkBzqVh5ZOs+xJbJaHEETGzyBYA2sy0bdDwDUr0rIzJUD8ZYiw
|
||||
736zfMRE2rxfOLoVIcfBLXMUcR2d63n/4wxgr1s5HVV3o8uEZ5gxNDnz5p/QabiWbT3m
|
||||
AMSVVaOBUTRnd9GcZhzYfKboT7SNrTJz0emqSWPKCWfm8dYIzH3TuIGULfRu5UA1/Y2H
|
||||
Q6ZbLmcYu5+VDKCtQl4nSmun3WUNAyPoeg5PCB1YcuCpqKcjU8l5Kkn+JxNjYAG432us
|
||||
Z5xQ==
|
||||
X-Forwarded-Encrypted: i=1;
|
||||
AJvYcCVigvWgctGNxtYGpBtNhTPBpQPHa7l14ZVktj/Oe1W8p1xwSIjIViAk2X3sDC23bbrmI41TVZbgJZDGCMFJ6g==@vger.kernel.org
|
||||
X-Gm-Message-State: AOJu0YxJFjAixTwr8dSwTYmdvbVzm/jbyVk+gQV6pF/9Vep5xeVdJMWa
|
||||
TE+4MHJDPdO8dA16Yn/y5c8pLBEYKqRlo8uDHNKV6e5ldbv18Xv6bR163j+rVCQ=
|
||||
X-Gm-Gg: ASbGncsUwV1fquQPNOfmTge/yCSzRhyC7+A8STTBe3n+C2XDK1UV8IswQL5UEXlb268
|
||||
mumVPzu1Ex8+Nh+quKWT+CIR3WR0NRXm1oiG0N+Cu2Mm4cm4mipqrV9Yxd6x5OMsG32XKd6r0iQ
|
||||
gr7joJETyo6k1TGc6i0LyoIabLOCc7Nkeu7BD+URUnBvoeQyXBdJpX0bbdvANKW5DrUeX1GkUA7
|
||||
0o4dZYtRola31Z1W9xZMdSefhmI4zZE4uy/RyR/FkQq2Zqk9FGct8DOKoHpOPa0DHVMy0lQAiNI
|
||||
KNg6OYtuJY+/6TpDoZzNpooiLi29WL6hqlpkmlZeluuCBG6HlSbZTQ==
|
||||
X-Google-Smtp-Source:
|
||||
AGHT+IGIixTut4yqDWp69RPz6EjMMq4lD94Ez1yhsRnow6NgvTk6WmKPLFavYgOJC+xGczTQmaocLw==
|
||||
X-Received: by 2002:a05:6512:1112:b0:549:5850:f275 with SMTP id
|
||||
2adb3069b0e04-54990ec8e60mr4354451e87.50.1741613326121;
|
||||
Mon, 10 Mar 2025 06:28:46 -0700 (PDT)
|
||||
Received: from [127.0.1.1] ([78.62.132.154])
|
||||
by smtp.gmail.com with ESMTPSA id
|
||||
2adb3069b0e04-5498b1bcaecsm1460408e87.200.2025.03.10.06.28.45
|
||||
(version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256);
|
||||
Mon, 10 Mar 2025 06:28:45 -0700 (PDT)
|
||||
From: Mantas Pucka <mantas@8devices.com>
|
||||
Date: Mon, 10 Mar 2025 15:28:18 +0200
|
||||
Subject: [PATCH ath-next] wifi: ath12k: limit WMI_SCAN_CHAN_LIST_CMDID
|
||||
argument size
|
||||
Precedence: bulk
|
||||
X-Mailing-List: linux-wireless@vger.kernel.org
|
||||
List-Id: <linux-wireless.vger.kernel.org>
|
||||
List-Subscribe: <mailto:linux-wireless+subscribe@vger.kernel.org>
|
||||
List-Unsubscribe: <mailto:linux-wireless+unsubscribe@vger.kernel.org>
|
||||
MIME-Version: 1.0
|
||||
Message-Id: <20250310-limit-wmi-chanlist-v1-1-8f0fb45459a7@8devices.com>
|
||||
X-B4-Tracking: v=1; b=H4sIAPHozmcC/x2MSwqEMBAFryK9tiGJ+MGriIuMtvpAM0MSHEG8u
|
||||
9FNQVG8d1IQDwnUZid52RHwdUl0ntGwWDcLY0xORplSFVrxig2R/xv46StCZF0Pn2Y0ibaiNPx
|
||||
5mXC8px3ZuLCTI1J/XTfUqQSebgAAAA==
|
||||
X-Change-ID: 20250310-limit-wmi-chanlist-17cb8d27cba6
|
||||
To: ath12k@lists.infradead.org
|
||||
Cc: Johannes Berg <johannes@sipsolutions.net>,
|
||||
Jeff Johnson <jjohnson@kernel.org>, linux-wireless@vger.kernel.org,
|
||||
linux-kernel@vger.kernel.org, Mantas Pucka <mantas@8devices.com>
|
||||
X-Mailer: b4 0.14.2
|
||||
|
||||
When using BDF with both 5GHz and 6GHz bands enabled on QCN9274, interface
|
||||
fails to start. It happens because FW fails to process
|
||||
WMI_SCAN_CHAN_LIST_CMDID with argument size >2048, resulting in a command
|
||||
timeout. The current code allows splitting channel list across multiple WMI
|
||||
commands but uses WMI max_msg_len (4096) as chunk size, which is still too
|
||||
large.
|
||||
|
||||
Fix this by limiting the number of channels sent at once, using the value
|
||||
specified in WMI interface description [1].
|
||||
|
||||
[1] https://git.codelinaro.org/clo/qsdk/platform/vendor/qcom-opensource/wlan/fw-api/-/blob/NHSS.QSDK.13.0.0.6/fw/wmi_unified.h#L6459
|
||||
|
||||
Tested-on: QCN9274 hw2.0 PCI WLAN.WBE.1.4.1-00199-QCAHKSWPL_SILICONZ-1
|
||||
|
||||
Signed-off-by: Mantas Pucka <mantas@8devices.com>
|
||||
---
|
||||
drivers/net/wireless/ath/ath12k/wmi.c | 3 +++
|
||||
drivers/net/wireless/ath/ath12k/wmi.h | 2 ++
|
||||
2 files changed, 5 insertions(+)
|
||||
|
||||
|
||||
---
|
||||
base-commit: 42aa76e608ca845c98e79f9e23af0bdb07b2eb1d
|
||||
change-id: 20250310-limit-wmi-chanlist-17cb8d27cba6
|
||||
|
||||
Best regards,
|
||||
|
||||
--- a/drivers/net/wireless/ath/ath12k/wmi.c
|
||||
+++ b/drivers/net/wireless/ath/ath12k/wmi.c
|
||||
@@ -2832,6 +2832,9 @@ int ath12k_wmi_send_scan_chan_list_cmd(s
|
||||
max_chan_limit = (wmi->wmi_ab->max_msg_len[ar->pdev_idx] - len) /
|
||||
sizeof(*chan_info);
|
||||
|
||||
+ if (max_chan_limit > WMI_MAX_NUM_CHAN_PER_WMI_CMD)
|
||||
+ max_chan_limit = WMI_MAX_NUM_CHAN_PER_WMI_CMD;
|
||||
+
|
||||
num_send_chans = min(arg->nallchans, max_chan_limit);
|
||||
|
||||
arg->nallchans -= num_send_chans;
|
||||
--- a/drivers/net/wireless/ath/ath12k/wmi.h
|
||||
+++ b/drivers/net/wireless/ath/ath12k/wmi.h
|
||||
@@ -3947,6 +3947,8 @@ struct wmi_stop_scan_cmd {
|
||||
__le32 pdev_id;
|
||||
} __packed;
|
||||
|
||||
+#define WMI_MAX_NUM_CHAN_PER_WMI_CMD 58
|
||||
+
|
||||
struct ath12k_wmi_scan_chan_list_arg {
|
||||
u32 pdev_id;
|
||||
u16 nallchans;
|
||||
@@ -0,0 +1,137 @@
|
||||
From patchwork Thu Mar 13 09:00:56 2025
|
||||
Content-Type: text/plain; charset="utf-8"
|
||||
MIME-Version: 1.0
|
||||
Content-Transfer-Encoding: 7bit
|
||||
X-Patchwork-Submitter: Mantas <mantas@8devices.com>
|
||||
X-Patchwork-Id: 14014575
|
||||
X-Patchwork-Delegate: quic_jjohnson@quicinc.com
|
||||
Received: from mail-lf1-f49.google.com (mail-lf1-f49.google.com
|
||||
[209.85.167.49])
|
||||
(using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits))
|
||||
(No client certificate requested)
|
||||
by smtp.subspace.kernel.org (Postfix) with ESMTPS id F210C2641F0
|
||||
for <linux-wireless@vger.kernel.org>; Thu, 13 Mar 2025 09:01:28 +0000 (UTC)
|
||||
Authentication-Results: smtp.subspace.kernel.org;
|
||||
arc=none smtp.client-ip=209.85.167.49
|
||||
ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116;
|
||||
t=1741856491; cv=none;
|
||||
b=CeFjBZstZXxg4oQQPPON0u0Mw9kvUaCubWSfpcWvN2italvlwccDBr+izqIzCXwxYaoAedVR6iHEQv+LBtIHOsMWHOCI9E6jYAPqjbEUEU0RMdvujKLVFvFXYR4UaRDAMzDGMlFF1qc0pY0sYR4FYfFBBQOarHn2sjZ/csIyj4k=
|
||||
ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org;
|
||||
s=arc-20240116; t=1741856491; c=relaxed/simple;
|
||||
bh=oLhlWw1tOovRHEGC4gsbi6BHKYXLNDYOrtVP3tTS5nE=;
|
||||
h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:To:Cc;
|
||||
b=baAfN8drFOEwQR9LVuWoVsd3jkMbQECK7Zuc68EzbbJwM4Zb0tbziTk1vvqED+f9JPOMbjRyjvV1hvy3svqZr7OuTZJdSM41D+DsbHvw0jEhaRlKwzpLWuOn9lu56ahcAsvx4A4JRawEK90smoYpejhxkdlSrxqRBh1ey3RwmQU=
|
||||
ARC-Authentication-Results: i=1; smtp.subspace.kernel.org;
|
||||
dmarc=pass (p=quarantine dis=none) header.from=8devices.com;
|
||||
spf=pass smtp.mailfrom=8devices.com;
|
||||
dkim=pass (2048-bit key) header.d=8devices.com header.i=@8devices.com
|
||||
header.b=FdBxu3P+; arc=none smtp.client-ip=209.85.167.49
|
||||
Authentication-Results: smtp.subspace.kernel.org;
|
||||
dmarc=pass (p=quarantine dis=none) header.from=8devices.com
|
||||
Authentication-Results: smtp.subspace.kernel.org;
|
||||
spf=pass smtp.mailfrom=8devices.com
|
||||
Authentication-Results: smtp.subspace.kernel.org;
|
||||
dkim=pass (2048-bit key) header.d=8devices.com header.i=@8devices.com
|
||||
header.b="FdBxu3P+"
|
||||
Received: by mail-lf1-f49.google.com with SMTP id
|
||||
2adb3069b0e04-54943bb8006so648002e87.0
|
||||
for <linux-wireless@vger.kernel.org>;
|
||||
Thu, 13 Mar 2025 02:01:28 -0700 (PDT)
|
||||
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
|
||||
d=8devices.com; s=8devices; t=1741856487; x=1742461287;
|
||||
darn=vger.kernel.org;
|
||||
h=cc:to:message-id:content-transfer-encoding:mime-version:subject
|
||||
:date:from:from:to:cc:subject:date:message-id:reply-to;
|
||||
bh=uj7GGUjO2Cb2hoHrzMda/fIIQwFl12ddzGuw5jrHW8M=;
|
||||
b=FdBxu3P+gf3qNd4jxSOCYUJ1meLFYAm0ou6lnEyomeeXDBFwITM6FM0cgBdXgmkLWZ
|
||||
ZKowNImwE9FKqNGxpg2tZ4obR9aM7HzzkxV3TE+1aIiocbr/5xyXQU+/AUvaM3vui/8d
|
||||
SFiwhX9FwFKdrYi1Og4XFD2aBhA5Fzp0U27grJYGTLchEfkr9Om43y3vZ7w2ENEBU0SO
|
||||
7NFmSwx7BmflIybP2sGCUzjacGQzzec0zz256EY7GpZH9r19jgWiCe1YGWdlxDaRhWze
|
||||
xV4okbZKydpYlUU/qGsgn23cRQuFCvMobvfkmTwsGYwlN4bAzq/cHw83YEFrUzYOngZK
|
||||
z7bg==
|
||||
X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
|
||||
d=1e100.net; s=20230601; t=1741856487; x=1742461287;
|
||||
h=cc:to:message-id:content-transfer-encoding:mime-version:subject
|
||||
:date:from:x-gm-message-state:from:to:cc:subject:date:message-id
|
||||
:reply-to;
|
||||
bh=uj7GGUjO2Cb2hoHrzMda/fIIQwFl12ddzGuw5jrHW8M=;
|
||||
b=PhLIANoGtdl34d9fFH7uxPyg1K5yPGRwimsWPVhHon98V9QP64+qUbifocbfojxz8u
|
||||
NEVzhOx0kfmsmkBxUzuRCu6xuTAF8LmjBpAJJxo3/4nqY67np8iZt/MITzx6egbMOUAs
|
||||
txqj0rzXwr55N/9yAD/QuD6bBcd8PcNMPp0CjFAt39AyK6De3BEIcA7b/eLoY3lifaxJ
|
||||
9U5ZZ/dHXwSIr9xuE1EB6pT5FbHcI8iWJTDJ8NdBcmWC8qtGAAMzlzWqHU0nOAJEjwEc
|
||||
T+oaJr8fTAgq4B5OvS1cNClscZHvoM3zlIoczwPPoBZCtUi2gThz9R4BrBxepdoZl1qq
|
||||
NZQA==
|
||||
X-Forwarded-Encrypted: i=1;
|
||||
AJvYcCUSbJyRkEPLa3fw7FZX3Ci6+/o8dqI0hd6pkVT20pi6Ufgze7nBQXa+qdK3OM5Ng2TFBrym8JoyBo//MwDHng==@vger.kernel.org
|
||||
X-Gm-Message-State: AOJu0Ywjzq2sFNyTMNPyxDt+721RyXdLbDPrF5PY3LnwpKaTfduyXkMF
|
||||
K/7N3Cpb/71aQsMXwmIbXAOGeLVWLBQHdYnQLZlsCTjVNArIjgiX7tNB0Mq56+qYtR9PdMrBAt8
|
||||
m
|
||||
X-Gm-Gg: ASbGncvDd0SdjhjPfzaKTXW4e0hclZuKu4pZ4d0XD5/Q6dnv09ZObgGjJbIRrAhYizp
|
||||
zWc8CwidDk8UYPX/OhiAyDhS4XRKRy2QG03sZh17aHDhishhmCE+mcqe+YUM+F4ns/05sAR2MeP
|
||||
wu/Rz6NS6UD4ihGNReTORGB3X4n9I5dgdNheFyqbrRX+Js4zXuvn1jgoEWawfovOu/4HAlnv+7p
|
||||
1ufgXBXJGVj6+OGzyNOyYloTB/Csok3zU9yBfrU+G19mpGaF86t/6yxmUIXCO+cWfbu2GIhVZp3
|
||||
RmSiDo/spnsvtYVGCPc6v9jALz83YcknTLkX8u+08AOkJKK7Mh8rKlCvbfZcB355
|
||||
X-Google-Smtp-Source:
|
||||
AGHT+IE2NulrNIo+M5vahinpDWyI9BdSgzdREdo+l0AN7HhcxOd01ZBOpT3HYFht1EVpKj5T7Edrrw==
|
||||
X-Received: by 2002:a05:6512:ba6:b0:549:8f21:bc0e with SMTP id
|
||||
2adb3069b0e04-54990eb1987mr9398593e87.32.1741856486697;
|
||||
Thu, 13 Mar 2025 02:01:26 -0700 (PDT)
|
||||
Received: from [127.0.1.1] ([78.62.132.154])
|
||||
by smtp.gmail.com with ESMTPSA id
|
||||
2adb3069b0e04-549ba88591csm142134e87.187.2025.03.13.02.01.25
|
||||
(version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256);
|
||||
Thu, 13 Mar 2025 02:01:25 -0700 (PDT)
|
||||
From: Mantas Pucka <mantas@8devices.com>
|
||||
Date: Thu, 13 Mar 2025 11:00:56 +0200
|
||||
Subject: [PATCH] wifi: ath12k: fix 5GHz operation on wideband QCN9274
|
||||
radios
|
||||
Precedence: bulk
|
||||
X-Mailing-List: linux-wireless@vger.kernel.org
|
||||
List-Id: <linux-wireless.vger.kernel.org>
|
||||
List-Subscribe: <mailto:linux-wireless+subscribe@vger.kernel.org>
|
||||
List-Unsubscribe: <mailto:linux-wireless+unsubscribe@vger.kernel.org>
|
||||
MIME-Version: 1.0
|
||||
Message-Id: <20250313-ath12-wideband-caps-v1-1-23ac4247cd8a@8devices.com>
|
||||
X-B4-Tracking: v=1; b=H4sIAMee0mcC/x3MQQqAIBBA0avErBvIsUi6SrSwHGs2FhoVhHdPW
|
||||
r7F/y8kjsIJhuqFyJck2UOBqitYNhtWRnHFQA11jVYa7bkpwlsczzY4XOyRkNqZjOqNcZ6hlEd
|
||||
kL89/HaecP+zWjGtlAAAA
|
||||
X-Change-ID: 20250313-ath12-wideband-caps-24b281788dfe
|
||||
To: ath12k@lists.infradead.org
|
||||
Cc: Johannes Berg <johannes@sipsolutions.net>,
|
||||
Jeff Johnson <jjohnson@kernel.org>, linux-wireless@vger.kernel.org,
|
||||
linux-kernel@vger.kernel.org, Mantas Pucka <mantas@8devices.com>
|
||||
X-Mailer: b4 0.14.2
|
||||
|
||||
Currently ath12k_mac_setup_ht_vht_cap() incorrectly assumes that QCN9274
|
||||
radios with 6GHz band can't support 5GHz as well. This prevents the
|
||||
addition of HT and VHT capabilities for the 5GHz band. Since QCN9274 is
|
||||
capable of operating in multiple bands, remove the 6GHz support check and
|
||||
exception for single_pdev_only (i.e. WCN7850).
|
||||
|
||||
Tested-on: QCN9274 hw2.0 PCI WLAN.WBE.1.4.1-00199-QCAHKSWPL_SILICONZ-1
|
||||
|
||||
Signed-off-by: Mantas Pucka <mantas@8devices.com>
|
||||
---
|
||||
drivers/net/wireless/ath/ath12k/mac.c | 4 +---
|
||||
1 file changed, 1 insertion(+), 3 deletions(-)
|
||||
|
||||
|
||||
---
|
||||
base-commit: 42aa76e608ca845c98e79f9e23af0bdb07b2eb1d
|
||||
change-id: 20250313-ath12-wideband-caps-24b281788dfe
|
||||
|
||||
Best regards,
|
||||
|
||||
--- a/drivers/net/wireless/ath/ath12k/mac.c
|
||||
+++ b/drivers/net/wireless/ath/ath12k/mac.c
|
||||
@@ -6985,9 +6985,7 @@ static void ath12k_mac_setup_ht_vht_cap(
|
||||
rate_cap_rx_chainmask);
|
||||
}
|
||||
|
||||
- if (cap->supported_bands & WMI_HOST_WLAN_5GHZ_CAP &&
|
||||
- (ar->ab->hw_params->single_pdev_only ||
|
||||
- !ar->supports_6ghz)) {
|
||||
+ if (cap->supported_bands & WMI_HOST_WLAN_5GHZ_CAP) {
|
||||
band = &ar->mac.sbands[NL80211_BAND_5GHZ];
|
||||
ht_cap = cap->band[NL80211_BAND_5GHZ].ht_cap_info;
|
||||
if (ht_cap_info)
|
||||
@@ -0,0 +1,484 @@
|
||||
From patchwork Wed May 21 22:45:31 2025
|
||||
Content-Type: text/plain; charset="utf-8"
|
||||
MIME-Version: 1.0
|
||||
Content-Transfer-Encoding: 7bit
|
||||
X-Patchwork-Submitter: Pradeep Kumar Chitrapu <quic_pradeepc@quicinc.com>
|
||||
X-Patchwork-Id: 14096118
|
||||
X-Patchwork-Delegate: quic_jjohnson@quicinc.com
|
||||
Received: from mx0b-0031df01.pphosted.com (mx0b-0031df01.pphosted.com
|
||||
[205.220.180.131])
|
||||
(using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits))
|
||||
(No client certificate requested)
|
||||
by smtp.subspace.kernel.org (Postfix) with ESMTPS id 8D9B523506D
|
||||
for <linux-wireless@vger.kernel.org>; Wed, 21 May 2025 22:45:57 +0000 (UTC)
|
||||
Authentication-Results: smtp.subspace.kernel.org;
|
||||
arc=none smtp.client-ip=205.220.180.131
|
||||
ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116;
|
||||
t=1747867559; cv=none;
|
||||
b=QXLrpE5trQYq3qZVPuAYdZ8IfmZi7XatjLyxn+9IZXmAWvPsCpT2EOrmLKoTKXH1gxwInwHzxiiwzDveDdYBFh2FGnxhAgdJlTBf1yChfW7+YndhKTtca3rP8z+Zt8QK48/n7gpmFEWkKGmxkG1DKIkCHgAZjD///ttubaAe2gc=
|
||||
ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org;
|
||||
s=arc-20240116; t=1747867559; c=relaxed/simple;
|
||||
bh=wlnSlGktw4cBYqpNPJwSPfG4fkld5ABcJ0NmmjY/jLg=;
|
||||
h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References:
|
||||
MIME-Version:Content-Type;
|
||||
b=A4dIxT87Fh9Y97+jvDIVTPlA5cnixK5ZcCAl5lklS0dCWBpo0QkFFiYyRUSKso7kYaT6KFazofkMt8A2z/fDgN8gVZgqEkaXDFSRjqNWCtoplSK7qYryl88snzbQvzD52CbWKkX8yu2Qmd98HFrl2kg69o1e4wzXVcNc+fehea8=
|
||||
ARC-Authentication-Results: i=1; smtp.subspace.kernel.org;
|
||||
dmarc=pass (p=none dis=none) header.from=quicinc.com;
|
||||
spf=pass smtp.mailfrom=quicinc.com;
|
||||
dkim=pass (2048-bit key) header.d=quicinc.com header.i=@quicinc.com
|
||||
header.b=gwsO0461; arc=none smtp.client-ip=205.220.180.131
|
||||
Authentication-Results: smtp.subspace.kernel.org;
|
||||
dmarc=pass (p=none dis=none) header.from=quicinc.com
|
||||
Authentication-Results: smtp.subspace.kernel.org;
|
||||
spf=pass smtp.mailfrom=quicinc.com
|
||||
Authentication-Results: smtp.subspace.kernel.org;
|
||||
dkim=pass (2048-bit key) header.d=quicinc.com header.i=@quicinc.com
|
||||
header.b="gwsO0461"
|
||||
Received: from pps.filterd (m0279871.ppops.net [127.0.0.1])
|
||||
by mx0a-0031df01.pphosted.com (8.18.1.2/8.18.1.2) with ESMTP id
|
||||
54LIZCMW000836;
|
||||
Wed, 21 May 2025 22:45:53 GMT
|
||||
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=quicinc.com; h=
|
||||
cc:content-transfer-encoding:content-type:date:from:in-reply-to
|
||||
:message-id:mime-version:references:subject:to; s=qcppdkim1; bh=
|
||||
jJ/9931jjDg+8neUbH09oigyzQwINmgJKgsYw6rWwPU=; b=gwsO0461NDm4hzMy
|
||||
/aP5LNjbfqB08SmlMEzcZ/MRNS7Ffjdvz9gsUyJR4DOilx71C5MvB0ZBvxEJF6pg
|
||||
qcU4QPZtOzyixWx+3vL6eh4Sdt/RN5AD/6U6TJEZCPwdJNLMD5uB2OQjP87NG9Wj
|
||||
2aEs+kb//lRXz6Gy5d7CCDW3+1KSDzgIg/cYJecPjWsMKbyCxTeFTIkkdonetQyz
|
||||
PSzkIDi3IBnca94koYTQyFTVvpUVHpC3QAq+jM9+xQJOItRbDHZjdPjLG6q1ML4W
|
||||
zYHODhd8LupxL323rnWJQxtYu5Ver7g2LgPW3npNz/JEdF2Hq9b8G0w5U8qVJVHr
|
||||
2nNuUA==
|
||||
Received: from nalasppmta05.qualcomm.com (Global_NAT1.qualcomm.com
|
||||
[129.46.96.20])
|
||||
by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 46rwf6vbsd-1
|
||||
(version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT);
|
||||
Wed, 21 May 2025 22:45:53 +0000 (GMT)
|
||||
Received: from nalasex01a.na.qualcomm.com (nalasex01a.na.qualcomm.com
|
||||
[10.47.209.196])
|
||||
by NALASPPMTA05.qualcomm.com (8.18.1.2/8.18.1.2) with ESMTPS id
|
||||
54LMjqLl023280
|
||||
(version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT);
|
||||
Wed, 21 May 2025 22:45:52 GMT
|
||||
Received: from ath12k-linux2.qualcomm.com (10.80.80.8) by
|
||||
nalasex01a.na.qualcomm.com (10.47.209.196) with Microsoft SMTP Server
|
||||
(version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id
|
||||
15.2.1544.9; Wed, 21 May 2025 15:45:51 -0700
|
||||
From: Pradeep Kumar Chitrapu <quic_pradeepc@quicinc.com>
|
||||
To: <ath12k@lists.infradead.org>
|
||||
CC: <linux-wireless@vger.kernel.org>,
|
||||
Pradeep Kumar Chitrapu
|
||||
<quic_pradeepc@quicinc.com>,
|
||||
Muna Sinada <quic_msinada@quicinc.com>,
|
||||
"Jeff
|
||||
Johnson" <quic_jjohnson@quicinc.com>
|
||||
Subject: [PATCH ath-next V14 1/9] wifi: ath12k: push HE MU-MIMO params to
|
||||
hardware
|
||||
Date: Wed, 21 May 2025 15:45:31 -0700
|
||||
Message-ID: <20250521224539.355985-2-quic_pradeepc@quicinc.com>
|
||||
X-Mailer: git-send-email 2.43.0
|
||||
In-Reply-To: <20250521224539.355985-1-quic_pradeepc@quicinc.com>
|
||||
References: <20250521224539.355985-1-quic_pradeepc@quicinc.com>
|
||||
Precedence: bulk
|
||||
X-Mailing-List: linux-wireless@vger.kernel.org
|
||||
List-Id: <linux-wireless.vger.kernel.org>
|
||||
List-Subscribe: <mailto:linux-wireless+subscribe@vger.kernel.org>
|
||||
List-Unsubscribe: <mailto:linux-wireless+unsubscribe@vger.kernel.org>
|
||||
MIME-Version: 1.0
|
||||
X-ClientProxiedBy: nasanex01a.na.qualcomm.com (10.52.223.231) To
|
||||
nalasex01a.na.qualcomm.com (10.47.209.196)
|
||||
X-QCInternal: smtphost
|
||||
X-Proofpoint-Virus-Version: vendor=nai engine=6200 definitions=5800
|
||||
signatures=585085
|
||||
X-Proofpoint-GUID: Zzf2Q5y4JzSN5f1E_vlCnvLRODG4zasa
|
||||
X-Proofpoint-Spam-Details-Enc: AW1haW4tMjUwNTIxMDIyNiBTYWx0ZWRfXyLZVeJQcQf0U
|
||||
B/O6/0+L+1nXg6SAFSC1bdc8B/eF8RxRnvbbX+YkF3RG14/UHGCF654g8ZXTq8oTCDzm3x5wmAk
|
||||
i8wAlv0otog8iYaicRd5q/x9Vynwlo0e67/iHhH1K0rxsp5yagZ6L3XLS82iLDPuXzHP7ylgo+I
|
||||
D0c1CMcLo4bGNe421uQk2jqRij3j1iAoI0gGSwcQqHRucJQSYetF+SSp/oDox9Dn2TqOagngt4V
|
||||
UxzAxO13SoH2X7RyWe5NxhfbEjOUmHjfodyJhBfIYh4s5SCx8IDUn6jSorAnl5mh1ZmAfISyZCC
|
||||
UqoQ2LDdmGl1HT3d4xvb7/ah09ru4wukKEcvP+HDrow6Xn/WsfgmRy6xdRv5vdNODiEv64XOGHa
|
||||
TxrJA2l36xRwX82xvkyUzyQ1sIeXwbvD0Wn//AQSmFVE0uMJHnCwRE1OYRGf9Dd2p/mfZfFh
|
||||
X-Authority-Analysis: v=2.4 cv=fZOty1QF c=1 sm=1 tr=0 ts=682e57a1 cx=c_pps
|
||||
a=ouPCqIW2jiPt+lZRy3xVPw==:117 a=ouPCqIW2jiPt+lZRy3xVPw==:17
|
||||
a=GEpy-HfZoHoA:10 a=dt9VzEwgFbYA:10 a=COk6AnOGAAAA:8 a=-_O-Wy8N5QNPZvNXkjkA:9
|
||||
a=TjNXssC_j7lpFel5tvFf:22
|
||||
X-Proofpoint-ORIG-GUID: Zzf2Q5y4JzSN5f1E_vlCnvLRODG4zasa
|
||||
X-Proofpoint-Virus-Version: vendor=baseguard
|
||||
engine=ICAP:2.0.293,Aquarius:18.0.1099,Hydra:6.0.736,FMLib:17.12.80.40
|
||||
definitions=2025-05-21_07,2025-05-20_03,2025-03-28_01
|
||||
X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0
|
||||
clxscore=1015 mlxscore=0 adultscore=0 spamscore=0 bulkscore=0 suspectscore=0
|
||||
malwarescore=0 priorityscore=1501 impostorscore=0 mlxlogscore=999
|
||||
lowpriorityscore=0 phishscore=0 classifier=spam authscore=0 authtc=n/a
|
||||
authcc= route=outbound adjust=0 reason=mlx scancount=1
|
||||
engine=8.19.0-2505160000 definitions=main-2505210226
|
||||
|
||||
Currently, only the HE IE in management frames is updated with
|
||||
respect to MU-MIMO configurations, but this change is not
|
||||
reflected in the hardware. Add support to propagate MU-MIMO
|
||||
configurations to the hardware as well.
|
||||
|
||||
Tested-on: QCN9274 hw2.0 PCI WLAN.WBE.1.0.1-00029-QCAHKSWPL_SILICONZ-1
|
||||
|
||||
Co-developed-by: Muna Sinada <quic_msinada@quicinc.com>
|
||||
Signed-off-by: Muna Sinada <quic_msinada@quicinc.com>
|
||||
Signed-off-by: Pradeep Kumar Chitrapu <quic_pradeepc@quicinc.com>
|
||||
Acked-by: Jeff Johnson <quic_jjohnson@quicinc.com>
|
||||
---
|
||||
drivers/net/wireless/ath/ath12k/mac.c | 228 +++++++++++++++++---------
|
||||
drivers/net/wireless/ath/ath12k/mac.h | 15 ++
|
||||
drivers/net/wireless/ath/ath12k/wmi.h | 28 +---
|
||||
3 files changed, 169 insertions(+), 102 deletions(-)
|
||||
|
||||
--- a/drivers/net/wireless/ath/ath12k/mac.c
|
||||
+++ b/drivers/net/wireless/ath/ath12k/mac.c
|
||||
@@ -3173,6 +3173,125 @@ static u32 ath12k_mac_ieee80211_sta_bw_t
|
||||
return bw;
|
||||
}
|
||||
|
||||
+static int ath12k_mac_set_he_txbf_conf(struct ath12k_link_vif *arvif)
|
||||
+{
|
||||
+ struct ath12k_vif *ahvif = arvif->ahvif;
|
||||
+ struct ath12k *ar = arvif->ar;
|
||||
+ u32 param = WMI_VDEV_PARAM_SET_HEMU_MODE;
|
||||
+ u32 value = 0;
|
||||
+ int ret;
|
||||
+ struct ieee80211_bss_conf *link_conf;
|
||||
+
|
||||
+ link_conf = ath12k_mac_get_link_bss_conf(arvif);
|
||||
+ if (!link_conf) {
|
||||
+ ath12k_warn(ar->ab, "unable to access bss link conf in txbf conf\n");
|
||||
+ return -EINVAL;
|
||||
+ }
|
||||
+
|
||||
+ if (!link_conf->he_support)
|
||||
+ return 0;
|
||||
+
|
||||
+ if (link_conf->he_su_beamformer) {
|
||||
+ value |= u32_encode_bits(HE_SU_BFER_ENABLE, HE_MODE_SU_TX_BFER);
|
||||
+ if (link_conf->he_mu_beamformer &&
|
||||
+ ahvif->vdev_type == WMI_VDEV_TYPE_AP)
|
||||
+ value |= u32_encode_bits(HE_MU_BFER_ENABLE, HE_MODE_MU_TX_BFER);
|
||||
+ }
|
||||
+
|
||||
+ if (ahvif->vif->type != NL80211_IFTYPE_MESH_POINT) {
|
||||
+ value |= u32_encode_bits(HE_DL_MUOFDMA_ENABLE, HE_MODE_DL_OFDMA) |
|
||||
+ u32_encode_bits(HE_UL_MUOFDMA_ENABLE, HE_MODE_UL_OFDMA);
|
||||
+
|
||||
+ if (link_conf->he_full_ul_mumimo)
|
||||
+ value |= u32_encode_bits(HE_UL_MUMIMO_ENABLE, HE_MODE_UL_MUMIMO);
|
||||
+
|
||||
+ if (link_conf->he_su_beamformee)
|
||||
+ value |= u32_encode_bits(HE_SU_BFEE_ENABLE, HE_MODE_SU_TX_BFEE);
|
||||
+ }
|
||||
+
|
||||
+ ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, param, value);
|
||||
+ if (ret) {
|
||||
+ ath12k_warn(ar->ab, "failed to set vdev %d HE MU mode: %d\n",
|
||||
+ arvif->vdev_id, ret);
|
||||
+ return ret;
|
||||
+ }
|
||||
+
|
||||
+ param = WMI_VDEV_PARAM_SET_HE_SOUNDING_MODE;
|
||||
+ value = u32_encode_bits(HE_VHT_SOUNDING_MODE_ENABLE, HE_VHT_SOUNDING_MODE) |
|
||||
+ u32_encode_bits(HE_TRIG_NONTRIG_SOUNDING_MODE_ENABLE,
|
||||
+ HE_TRIG_NONTRIG_SOUNDING_MODE);
|
||||
+ ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
|
||||
+ param, value);
|
||||
+ if (ret) {
|
||||
+ ath12k_warn(ar->ab, "failed to set vdev %d sounding mode: %d\n",
|
||||
+ arvif->vdev_id, ret);
|
||||
+ return ret;
|
||||
+ }
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static int ath12k_mac_vif_recalc_sta_he_txbf(struct ath12k *ar,
|
||||
+ struct ath12k_link_vif *arvif,
|
||||
+ struct ieee80211_sta_he_cap *he_cap,
|
||||
+ int *hemode)
|
||||
+{
|
||||
+ struct ieee80211_vif *vif = arvif->ahvif->vif;
|
||||
+ struct ieee80211_he_cap_elem he_cap_elem = {};
|
||||
+ struct ieee80211_sta_he_cap *cap_band;
|
||||
+ struct cfg80211_chan_def def;
|
||||
+ u8 link_id = arvif->link_id;
|
||||
+ struct ieee80211_bss_conf *link_conf;
|
||||
+
|
||||
+ link_conf = ath12k_mac_get_link_bss_conf(arvif);
|
||||
+ if (!link_conf) {
|
||||
+ ath12k_warn(ar->ab, "unable to access bss link conf in recalc txbf conf\n");
|
||||
+ return -EINVAL;
|
||||
+ }
|
||||
+
|
||||
+ if (!link_conf->he_support)
|
||||
+ return 0;
|
||||
+
|
||||
+ if (vif->type != NL80211_IFTYPE_STATION)
|
||||
+ return -EINVAL;
|
||||
+
|
||||
+ if (WARN_ON(ath12k_mac_vif_link_chan(vif, link_id, &def)))
|
||||
+ return -EINVAL;
|
||||
+
|
||||
+ if (def.chan->band == NL80211_BAND_2GHZ)
|
||||
+ cap_band = &ar->mac.iftype[NL80211_BAND_2GHZ][vif->type].he_cap;
|
||||
+ else
|
||||
+ cap_band = &ar->mac.iftype[NL80211_BAND_5GHZ][vif->type].he_cap;
|
||||
+
|
||||
+ memcpy(&he_cap_elem, &cap_band->he_cap_elem, sizeof(he_cap_elem));
|
||||
+
|
||||
+ *hemode = 0;
|
||||
+ if (HECAP_PHY_SUBFME_GET(he_cap_elem.phy_cap_info)) {
|
||||
+ if (HECAP_PHY_SUBFMR_GET(he_cap->he_cap_elem.phy_cap_info))
|
||||
+ *hemode |= u32_encode_bits(HE_SU_BFEE_ENABLE, HE_MODE_SU_TX_BFEE);
|
||||
+ if (HECAP_PHY_MUBFMR_GET(he_cap->he_cap_elem.phy_cap_info))
|
||||
+ *hemode |= u32_encode_bits(HE_MU_BFEE_ENABLE, HE_MODE_MU_TX_BFEE);
|
||||
+ }
|
||||
+
|
||||
+ if (vif->type != NL80211_IFTYPE_MESH_POINT) {
|
||||
+ *hemode |= u32_encode_bits(HE_DL_MUOFDMA_ENABLE, HE_MODE_DL_OFDMA) |
|
||||
+ u32_encode_bits(HE_UL_MUOFDMA_ENABLE, HE_MODE_UL_OFDMA);
|
||||
+
|
||||
+ if (HECAP_PHY_ULMUMIMO_GET(he_cap_elem.phy_cap_info))
|
||||
+ if (HECAP_PHY_ULMUMIMO_GET(he_cap->he_cap_elem.phy_cap_info))
|
||||
+ *hemode |= u32_encode_bits(HE_UL_MUMIMO_ENABLE,
|
||||
+ HE_MODE_UL_MUMIMO);
|
||||
+
|
||||
+ if (u32_get_bits(*hemode, HE_MODE_MU_TX_BFEE))
|
||||
+ *hemode |= u32_encode_bits(HE_SU_BFEE_ENABLE, HE_MODE_SU_TX_BFEE);
|
||||
+
|
||||
+ if (u32_get_bits(*hemode, HE_MODE_MU_TX_BFER))
|
||||
+ *hemode |= u32_encode_bits(HE_SU_BFER_ENABLE, HE_MODE_SU_TX_BFER);
|
||||
+ }
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
static void ath12k_bss_assoc(struct ath12k *ar,
|
||||
struct ath12k_link_vif *arvif,
|
||||
struct ieee80211_bss_conf *bss_conf)
|
||||
@@ -3187,6 +3306,7 @@ static void ath12k_bss_assoc(struct ath1
|
||||
struct ath12k_sta *ahsta;
|
||||
struct ath12k_peer *peer;
|
||||
bool is_auth = false;
|
||||
+ u32 hemode = 0;
|
||||
int ret;
|
||||
|
||||
lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
|
||||
@@ -3230,8 +3350,26 @@ static void ath12k_bss_assoc(struct ath1
|
||||
|
||||
ath12k_peer_assoc_prepare(ar, arvif, arsta, peer_arg, false);
|
||||
|
||||
+ /* link_sta->he_cap must be protected by rcu_read_lock */
|
||||
+ ret = ath12k_mac_vif_recalc_sta_he_txbf(ar, arvif, &link_sta->he_cap, &hemode);
|
||||
+ if (ret) {
|
||||
+ ath12k_warn(ar->ab, "failed to recalc he txbf for vdev %i on bss %pM: %d\n",
|
||||
+ arvif->vdev_id, bss_conf->bssid, ret);
|
||||
+ rcu_read_unlock();
|
||||
+ return;
|
||||
+ }
|
||||
+
|
||||
rcu_read_unlock();
|
||||
|
||||
+ /* keep this before ath12k_wmi_send_peer_assoc_cmd() */
|
||||
+ ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
|
||||
+ WMI_VDEV_PARAM_SET_HEMU_MODE, hemode);
|
||||
+ if (ret) {
|
||||
+ ath12k_warn(ar->ab, "failed to submit vdev param txbf 0x%x: %d\n",
|
||||
+ hemode, ret);
|
||||
+ return;
|
||||
+ }
|
||||
+
|
||||
ret = ath12k_wmi_send_peer_assoc_cmd(ar, peer_arg);
|
||||
if (ret) {
|
||||
ath12k_warn(ar->ab, "failed to run peer assoc for %pM vdev %i: %d\n",
|
||||
@@ -3850,6 +3988,13 @@ static void ath12k_mac_bss_info_changed(
|
||||
ether_addr_copy(arvif->bssid, info->bssid);
|
||||
|
||||
if (changed & BSS_CHANGED_BEACON_ENABLED) {
|
||||
+ if (info->enable_beacon) {
|
||||
+ ret = ath12k_mac_set_he_txbf_conf(arvif);
|
||||
+ if (ret)
|
||||
+ ath12k_warn(ar->ab,
|
||||
+ "failed to set HE TXBF config for vdev: %d\n",
|
||||
+ arvif->vdev_id);
|
||||
+ }
|
||||
ath12k_control_beaconing(arvif, info);
|
||||
|
||||
if (arvif->is_up && info->he_support &&
|
||||
@@ -7151,11 +7296,14 @@ static void ath12k_mac_copy_he_cap(struc
|
||||
|
||||
he_cap_elem->mac_cap_info[1] &=
|
||||
IEEE80211_HE_MAC_CAP1_TF_MAC_PAD_DUR_MASK;
|
||||
-
|
||||
+ he_cap_elem->phy_cap_info[0] &=
|
||||
+ IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_40MHZ_IN_2G |
|
||||
+ IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_40MHZ_80MHZ_IN_5G |
|
||||
+ IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_160MHZ_IN_5G;
|
||||
+ he_cap_elem->phy_cap_info[0] &=
|
||||
+ ~IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_80PLUS80_MHZ_IN_5G;
|
||||
he_cap_elem->phy_cap_info[5] &=
|
||||
~IEEE80211_HE_PHY_CAP5_BEAMFORMEE_NUM_SND_DIM_UNDER_80MHZ_MASK;
|
||||
- he_cap_elem->phy_cap_info[5] &=
|
||||
- ~IEEE80211_HE_PHY_CAP5_BEAMFORMEE_NUM_SND_DIM_ABOVE_80MHZ_MASK;
|
||||
he_cap_elem->phy_cap_info[5] |= num_tx_chains - 1;
|
||||
|
||||
switch (iftype) {
|
||||
@@ -8454,72 +8602,6 @@ static int ath12k_mac_setup_vdev_create_
|
||||
return 0;
|
||||
}
|
||||
|
||||
-static u32
|
||||
-ath12k_mac_prepare_he_mode(struct ath12k_pdev *pdev, u32 viftype)
|
||||
-{
|
||||
- struct ath12k_pdev_cap *pdev_cap = &pdev->cap;
|
||||
- struct ath12k_band_cap *cap_band = NULL;
|
||||
- u32 *hecap_phy_ptr = NULL;
|
||||
- u32 hemode;
|
||||
-
|
||||
- if (pdev->cap.supported_bands & WMI_HOST_WLAN_2GHZ_CAP)
|
||||
- cap_band = &pdev_cap->band[NL80211_BAND_2GHZ];
|
||||
- else
|
||||
- cap_band = &pdev_cap->band[NL80211_BAND_5GHZ];
|
||||
-
|
||||
- hecap_phy_ptr = &cap_band->he_cap_phy_info[0];
|
||||
-
|
||||
- hemode = u32_encode_bits(HE_SU_BFEE_ENABLE, HE_MODE_SU_TX_BFEE) |
|
||||
- u32_encode_bits(HECAP_PHY_SUBFMR_GET(hecap_phy_ptr),
|
||||
- HE_MODE_SU_TX_BFER) |
|
||||
- u32_encode_bits(HECAP_PHY_ULMUMIMO_GET(hecap_phy_ptr),
|
||||
- HE_MODE_UL_MUMIMO);
|
||||
-
|
||||
- /* TODO: WDS and other modes */
|
||||
- if (viftype == NL80211_IFTYPE_AP) {
|
||||
- hemode |= u32_encode_bits(HECAP_PHY_MUBFMR_GET(hecap_phy_ptr),
|
||||
- HE_MODE_MU_TX_BFER) |
|
||||
- u32_encode_bits(HE_DL_MUOFDMA_ENABLE, HE_MODE_DL_OFDMA) |
|
||||
- u32_encode_bits(HE_UL_MUOFDMA_ENABLE, HE_MODE_UL_OFDMA);
|
||||
- } else {
|
||||
- hemode |= u32_encode_bits(HE_MU_BFEE_ENABLE, HE_MODE_MU_TX_BFEE);
|
||||
- }
|
||||
-
|
||||
- return hemode;
|
||||
-}
|
||||
-
|
||||
-static int ath12k_set_he_mu_sounding_mode(struct ath12k *ar,
|
||||
- struct ath12k_link_vif *arvif)
|
||||
-{
|
||||
- u32 param_id, param_value;
|
||||
- struct ath12k_base *ab = ar->ab;
|
||||
- struct ath12k_vif *ahvif = arvif->ahvif;
|
||||
- int ret;
|
||||
-
|
||||
- param_id = WMI_VDEV_PARAM_SET_HEMU_MODE;
|
||||
- param_value = ath12k_mac_prepare_he_mode(ar->pdev, ahvif->vif->type);
|
||||
- ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
|
||||
- param_id, param_value);
|
||||
- if (ret) {
|
||||
- ath12k_warn(ab, "failed to set vdev %d HE MU mode: %d param_value %x\n",
|
||||
- arvif->vdev_id, ret, param_value);
|
||||
- return ret;
|
||||
- }
|
||||
- param_id = WMI_VDEV_PARAM_SET_HE_SOUNDING_MODE;
|
||||
- param_value =
|
||||
- u32_encode_bits(HE_VHT_SOUNDING_MODE_ENABLE, HE_VHT_SOUNDING_MODE) |
|
||||
- u32_encode_bits(HE_TRIG_NONTRIG_SOUNDING_MODE_ENABLE,
|
||||
- HE_TRIG_NONTRIG_SOUNDING_MODE);
|
||||
- ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
|
||||
- param_id, param_value);
|
||||
- if (ret) {
|
||||
- ath12k_warn(ab, "failed to set vdev %d HE MU mode: %d\n",
|
||||
- arvif->vdev_id, ret);
|
||||
- return ret;
|
||||
- }
|
||||
- return ret;
|
||||
-}
|
||||
-
|
||||
static void ath12k_mac_update_vif_offload(struct ath12k_link_vif *arvif)
|
||||
{
|
||||
struct ath12k_vif *ahvif = arvif->ahvif;
|
||||
@@ -9706,14 +9788,6 @@ ath12k_mac_vdev_start_restart(struct ath
|
||||
spin_unlock_bh(&ab->base_lock);
|
||||
|
||||
/* TODO: Notify if secondary 80Mhz also needs radar detection */
|
||||
- if (link_conf->he_support) {
|
||||
- ret = ath12k_set_he_mu_sounding_mode(ar, arvif);
|
||||
- if (ret) {
|
||||
- ath12k_warn(ar->ab, "failed to set he mode vdev %i\n",
|
||||
- arg.vdev_id);
|
||||
- return ret;
|
||||
- }
|
||||
- }
|
||||
}
|
||||
|
||||
arg.passive |= !!(chandef->chan->flags & IEEE80211_CHAN_NO_IR);
|
||||
--- a/drivers/net/wireless/ath/ath12k/mac.h
|
||||
+++ b/drivers/net/wireless/ath/ath12k/mac.h
|
||||
@@ -56,6 +56,21 @@ struct ath12k_generic_iter {
|
||||
|
||||
#define ATH12K_NUM_MAX_ACTIVE_LINKS_PER_DEVICE 2
|
||||
|
||||
+#define HECAP_PHY_SUBFMR_GET(hecap_phy) \
|
||||
+ u8_get_bits(hecap_phy[3], IEEE80211_HE_PHY_CAP3_SU_BEAMFORMER)
|
||||
+
|
||||
+#define HECAP_PHY_SUBFME_GET(hecap_phy) \
|
||||
+ u8_get_bits(hecap_phy[4], IEEE80211_HE_PHY_CAP4_SU_BEAMFORMEE)
|
||||
+
|
||||
+#define HECAP_PHY_MUBFMR_GET(hecap_phy) \
|
||||
+ u8_get_bits(hecap_phy[4], IEEE80211_HE_PHY_CAP4_MU_BEAMFORMER)
|
||||
+
|
||||
+#define HECAP_PHY_ULMUMIMO_GET(hecap_phy) \
|
||||
+ u8_get_bits(hecap_phy[2], IEEE80211_HE_PHY_CAP2_UL_MU_FULL_MU_MIMO)
|
||||
+
|
||||
+#define HECAP_PHY_ULOFDMA_GET(hecap_phy) \
|
||||
+ u8_get_bits(hecap_phy[2], IEEE80211_HE_PHY_CAP2_UL_MU_PARTIAL_MU_MIMO)
|
||||
+
|
||||
enum ath12k_supported_bw {
|
||||
ATH12K_BW_20 = 0,
|
||||
ATH12K_BW_40 = 1,
|
||||
--- a/drivers/net/wireless/ath/ath12k/wmi.h
|
||||
+++ b/drivers/net/wireless/ath/ath12k/wmi.h
|
||||
@@ -3131,31 +3131,6 @@ struct ath12k_wmi_rx_reorder_queue_remov
|
||||
#define WMI_VDEV_PARAM_TXBF_SU_TX_BFER BIT(2)
|
||||
#define WMI_VDEV_PARAM_TXBF_MU_TX_BFER BIT(3)
|
||||
|
||||
-#define HECAP_PHYDWORD_0 0
|
||||
-#define HECAP_PHYDWORD_1 1
|
||||
-#define HECAP_PHYDWORD_2 2
|
||||
-
|
||||
-#define HECAP_PHY_SU_BFER BIT(31)
|
||||
-#define HECAP_PHY_SU_BFEE BIT(0)
|
||||
-#define HECAP_PHY_MU_BFER BIT(1)
|
||||
-#define HECAP_PHY_UL_MUMIMO BIT(22)
|
||||
-#define HECAP_PHY_UL_MUOFDMA BIT(23)
|
||||
-
|
||||
-#define HECAP_PHY_SUBFMR_GET(hecap_phy) \
|
||||
- u32_get_bits(hecap_phy[HECAP_PHYDWORD_0], HECAP_PHY_SU_BFER)
|
||||
-
|
||||
-#define HECAP_PHY_SUBFME_GET(hecap_phy) \
|
||||
- u32_get_bits(hecap_phy[HECAP_PHYDWORD_1], HECAP_PHY_SU_BFEE)
|
||||
-
|
||||
-#define HECAP_PHY_MUBFMR_GET(hecap_phy) \
|
||||
- u32_get_bits(hecap_phy[HECAP_PHYDWORD_1], HECAP_PHY_MU_BFER)
|
||||
-
|
||||
-#define HECAP_PHY_ULMUMIMO_GET(hecap_phy) \
|
||||
- u32_get_bits(hecap_phy[HECAP_PHYDWORD_0], HECAP_PHY_UL_MUMIMO)
|
||||
-
|
||||
-#define HECAP_PHY_ULOFDMA_GET(hecap_phy) \
|
||||
- u32_get_bits(hecap_phy[HECAP_PHYDWORD_0], HECAP_PHY_UL_MUOFDMA)
|
||||
-
|
||||
#define HE_MODE_SU_TX_BFEE BIT(0)
|
||||
#define HE_MODE_SU_TX_BFER BIT(1)
|
||||
#define HE_MODE_MU_TX_BFEE BIT(2)
|
||||
@@ -3167,8 +3142,11 @@ struct ath12k_wmi_rx_reorder_queue_remov
|
||||
#define HE_DL_MUOFDMA_ENABLE 1
|
||||
#define HE_UL_MUOFDMA_ENABLE 1
|
||||
#define HE_DL_MUMIMO_ENABLE 1
|
||||
+#define HE_UL_MUMIMO_ENABLE 1
|
||||
#define HE_MU_BFEE_ENABLE 1
|
||||
#define HE_SU_BFEE_ENABLE 1
|
||||
+#define HE_MU_BFER_ENABLE 1
|
||||
+#define HE_SU_BFER_ENABLE 1
|
||||
|
||||
#define HE_VHT_SOUNDING_MODE_ENABLE 1
|
||||
#define HE_SU_MU_SOUNDING_MODE_ENABLE 1
|
||||
@@ -0,0 +1,242 @@
|
||||
From patchwork Wed May 21 22:45:32 2025
|
||||
Content-Type: text/plain; charset="utf-8"
|
||||
MIME-Version: 1.0
|
||||
Content-Transfer-Encoding: 7bit
|
||||
X-Patchwork-Submitter: Pradeep Kumar Chitrapu <quic_pradeepc@quicinc.com>
|
||||
X-Patchwork-Id: 14096119
|
||||
X-Patchwork-Delegate: quic_jjohnson@quicinc.com
|
||||
Received: from mx0b-0031df01.pphosted.com (mx0b-0031df01.pphosted.com
|
||||
[205.220.180.131])
|
||||
(using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits))
|
||||
(No client certificate requested)
|
||||
by smtp.subspace.kernel.org (Postfix) with ESMTPS id 697B71A23AA
|
||||
for <linux-wireless@vger.kernel.org>; Wed, 21 May 2025 22:45:58 +0000 (UTC)
|
||||
Authentication-Results: smtp.subspace.kernel.org;
|
||||
arc=none smtp.client-ip=205.220.180.131
|
||||
ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116;
|
||||
t=1747867560; cv=none;
|
||||
b=XceXZ7CY2+FEzM9RuC10/cGW+vmyB2cX8QWJ3ckav7jiY5NYBQe1XW2asWcHaAEmOwdUh2iRT6imeiQLYue78g4UAcBErvihTGqlYL0m+10CQMNHmQZurUQkLPeFS0WAwlA+HBgcdp+Z71PhXs/ttQD6dF/8mlPaeGqxlTUoEcM=
|
||||
ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org;
|
||||
s=arc-20240116; t=1747867560; c=relaxed/simple;
|
||||
bh=mXjCwVOeMuqCjiNDATjkwHPrwNjm6Uv3d5yO5+bqbfk=;
|
||||
h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References:
|
||||
MIME-Version:Content-Type;
|
||||
b=SeDDAI+0lqXCMqhleIhxgpdPq9QuWaPI9jj0JOqYiwOIVtAsNqQv7KQ+AMvXDQTsIe0LfA2l23stlXB7sLNpKHTM9JhPsLkafU7mvBaiwTxaJR5tEi4zGQZhsrKSn/awYszamnM81hQS3r9bBgS4oe8AeFV2/lDXYPXNHCGv0+w=
|
||||
ARC-Authentication-Results: i=1; smtp.subspace.kernel.org;
|
||||
dmarc=pass (p=none dis=none) header.from=quicinc.com;
|
||||
spf=pass smtp.mailfrom=quicinc.com;
|
||||
dkim=pass (2048-bit key) header.d=quicinc.com header.i=@quicinc.com
|
||||
header.b=DwzHO5rL; arc=none smtp.client-ip=205.220.180.131
|
||||
Authentication-Results: smtp.subspace.kernel.org;
|
||||
dmarc=pass (p=none dis=none) header.from=quicinc.com
|
||||
Authentication-Results: smtp.subspace.kernel.org;
|
||||
spf=pass smtp.mailfrom=quicinc.com
|
||||
Authentication-Results: smtp.subspace.kernel.org;
|
||||
dkim=pass (2048-bit key) header.d=quicinc.com header.i=@quicinc.com
|
||||
header.b="DwzHO5rL"
|
||||
Received: from pps.filterd (m0279869.ppops.net [127.0.0.1])
|
||||
by mx0a-0031df01.pphosted.com (8.18.1.2/8.18.1.2) with ESMTP id
|
||||
54LJflLg012749;
|
||||
Wed, 21 May 2025 22:45:53 GMT
|
||||
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=quicinc.com; h=
|
||||
cc:content-transfer-encoding:content-type:date:from:in-reply-to
|
||||
:message-id:mime-version:references:subject:to; s=qcppdkim1; bh=
|
||||
tiHJ0bp145D1K0TKBussv+a5p9S+5sP37NuNrmk03fg=; b=DwzHO5rLl1Vp87qm
|
||||
lpxifM2nR9pLT0mgMqz/HRb/yTHCnS9oGDXzc24mnve2I/O9X/YT8q8qN+wjBlLB
|
||||
4W7snIItVpffzrSmAJupTNtzj8qbmIYeti1zUlDdVoesUaICbdiDvSeCWPUtfeaz
|
||||
tNKDOmBUTvCb+1qxxciQZhuRobmmkuRgcg8VkgCFP+OyG5o1OrUESYu3QeZ62Hle
|
||||
ODt78jw+qe8cE9e2TxGEZhy++loik0tbF8D9P3cX5L+CdB+i4TyWnFxwvNgJciIx
|
||||
RptE1lyB75UdrnAqETq0km4svwyidUuum/x0hqd6TvlDod3b7FD4tjbE7EP5iQ5V
|
||||
Dw2tXA==
|
||||
Received: from nalasppmta01.qualcomm.com (Global_NAT1.qualcomm.com
|
||||
[129.46.96.20])
|
||||
by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 46rwf9carr-1
|
||||
(version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT);
|
||||
Wed, 21 May 2025 22:45:53 +0000 (GMT)
|
||||
Received: from nalasex01a.na.qualcomm.com (nalasex01a.na.qualcomm.com
|
||||
[10.47.209.196])
|
||||
by NALASPPMTA01.qualcomm.com (8.18.1.2/8.18.1.2) with ESMTPS id
|
||||
54LMjqtS008810
|
||||
(version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT);
|
||||
Wed, 21 May 2025 22:45:52 GMT
|
||||
Received: from ath12k-linux2.qualcomm.com (10.80.80.8) by
|
||||
nalasex01a.na.qualcomm.com (10.47.209.196) with Microsoft SMTP Server
|
||||
(version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id
|
||||
15.2.1544.9; Wed, 21 May 2025 15:45:52 -0700
|
||||
From: Pradeep Kumar Chitrapu <quic_pradeepc@quicinc.com>
|
||||
To: <ath12k@lists.infradead.org>
|
||||
CC: <linux-wireless@vger.kernel.org>,
|
||||
Pradeep Kumar Chitrapu
|
||||
<quic_pradeepc@quicinc.com>,
|
||||
Muna Sinada <quic_msinada@quicinc.com>,
|
||||
"Jeff
|
||||
Johnson" <quic_jjohnson@quicinc.com>
|
||||
Subject: [PATCH ath-next V14 2/9] wifi: ath12k: push EHT MU-MIMO params to
|
||||
hardware
|
||||
Date: Wed, 21 May 2025 15:45:32 -0700
|
||||
Message-ID: <20250521224539.355985-3-quic_pradeepc@quicinc.com>
|
||||
X-Mailer: git-send-email 2.43.0
|
||||
In-Reply-To: <20250521224539.355985-1-quic_pradeepc@quicinc.com>
|
||||
References: <20250521224539.355985-1-quic_pradeepc@quicinc.com>
|
||||
Precedence: bulk
|
||||
X-Mailing-List: linux-wireless@vger.kernel.org
|
||||
List-Id: <linux-wireless.vger.kernel.org>
|
||||
List-Subscribe: <mailto:linux-wireless+subscribe@vger.kernel.org>
|
||||
List-Unsubscribe: <mailto:linux-wireless+unsubscribe@vger.kernel.org>
|
||||
MIME-Version: 1.0
|
||||
X-ClientProxiedBy: nasanex01a.na.qualcomm.com (10.52.223.231) To
|
||||
nalasex01a.na.qualcomm.com (10.47.209.196)
|
||||
X-QCInternal: smtphost
|
||||
X-Proofpoint-Virus-Version: vendor=nai engine=6200 definitions=5800
|
||||
signatures=585085
|
||||
X-Proofpoint-ORIG-GUID: _eaDrXLa14UhDtRJT-hk8Y6z1fwFI6QB
|
||||
X-Proofpoint-Spam-Details-Enc: AW1haW4tMjUwNTIxMDIyNSBTYWx0ZWRfX7QgTyyXEHZM8
|
||||
OnUvphQD/4J77Z8iHm4hJQIe6duMI5HbpiWELH5aRxqU7pFuvCjmltcmWPjwls9DzTkJnDGHMjo
|
||||
FuBarQpMaZO8eQsx97aM8WpE0dpJHROE1ZRZ3SV8VEoTHHG712fvPw+oUWaZo6WccaEbxH9x9+W
|
||||
n76tkFOOopbjRgOBmCokHCrfZmCMKcT4FLUFoiIDn0Fv8b/WKaut3Z+1hrEwcOuXCJv4X1QIOcx
|
||||
6NCnxNr8y1O1cwqXg3pBhHB+BpcLiEat6TlD9bH/5oUZHFce4W1jkZYs2J5VJnzLDeQxq8xBhP0
|
||||
Qal3bpuUPyWAMKZKH/uAEXwEZ5ZMghUioGuc78EBMJhSXa2VsT3lhmJtc/CaHDqNKFrp01I/KAh
|
||||
7UcIN/PKb8qOKrHE8/8cpuHgoBgB24X84Qo5rORKfnW4s7FbS0xkcs2ZV2TI0AIGz4eEZAOY
|
||||
X-Authority-Analysis: v=2.4 cv=GawXnRXL c=1 sm=1 tr=0 ts=682e57a1 cx=c_pps
|
||||
a=ouPCqIW2jiPt+lZRy3xVPw==:117 a=ouPCqIW2jiPt+lZRy3xVPw==:17
|
||||
a=GEpy-HfZoHoA:10 a=dt9VzEwgFbYA:10 a=COk6AnOGAAAA:8 a=uoU_VXRAPQDrZd00miQA:9
|
||||
a=TjNXssC_j7lpFel5tvFf:22
|
||||
X-Proofpoint-GUID: _eaDrXLa14UhDtRJT-hk8Y6z1fwFI6QB
|
||||
X-Proofpoint-Virus-Version: vendor=baseguard
|
||||
engine=ICAP:2.0.293,Aquarius:18.0.1099,Hydra:6.0.736,FMLib:17.12.80.40
|
||||
definitions=2025-05-21_07,2025-05-20_03,2025-03-28_01
|
||||
X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0
|
||||
mlxscore=0 mlxlogscore=999 lowpriorityscore=0 impostorscore=0
|
||||
priorityscore=1501 clxscore=1015 malwarescore=0 phishscore=0 bulkscore=0
|
||||
spamscore=0 suspectscore=0 adultscore=0 classifier=spam authscore=0
|
||||
authtc=n/a authcc= route=outbound adjust=0 reason=mlx scancount=1
|
||||
engine=8.19.0-2505160000 definitions=main-2505210225
|
||||
|
||||
Currently, only the EHT IE in management frames is updated with
|
||||
respect to MU-MIMO configurations, but this change is not
|
||||
reflected in the hardware. Add support to propagate MU-MIMO
|
||||
configurations to the hardware as well for AP mode. Similar
|
||||
support for STA mode will be added in future.
|
||||
|
||||
Tested-on: QCN9274 hw2.0 PCI WLAN.WBE.1.0.1-00029-QCAHKSWPL_SILICONZ-1
|
||||
|
||||
Co-developed-by: Muna Sinada <quic_msinada@quicinc.com>
|
||||
Signed-off-by: Muna Sinada <quic_msinada@quicinc.com>
|
||||
Signed-off-by: Pradeep Kumar Chitrapu <quic_pradeepc@quicinc.com>
|
||||
Acked-by: Jeff Johnson <quic_jjohnson@quicinc.com>
|
||||
---
|
||||
drivers/net/wireless/ath/ath12k/mac.c | 58 +++++++++++++++++++++++++++
|
||||
drivers/net/wireless/ath/ath12k/wmi.h | 21 ++++++++++
|
||||
2 files changed, 79 insertions(+)
|
||||
|
||||
--- a/drivers/net/wireless/ath/ath12k/mac.c
|
||||
+++ b/drivers/net/wireless/ath/ath12k/mac.c
|
||||
@@ -3292,6 +3292,58 @@ static int ath12k_mac_vif_recalc_sta_he_
|
||||
return 0;
|
||||
}
|
||||
|
||||
+static int ath12k_mac_set_eht_txbf_conf(struct ath12k_link_vif *arvif)
|
||||
+{
|
||||
+ struct ath12k_vif *ahvif = arvif->ahvif;
|
||||
+ struct ath12k *ar = arvif->ar;
|
||||
+ u32 param = WMI_VDEV_PARAM_SET_EHT_MU_MODE;
|
||||
+ u32 value = 0;
|
||||
+ int ret;
|
||||
+ struct ieee80211_bss_conf *link_conf;
|
||||
+
|
||||
+ link_conf = ath12k_mac_get_link_bss_conf(arvif);
|
||||
+ if (!link_conf) {
|
||||
+ ath12k_warn(ar->ab, "unable to access bss link conf in eht txbf conf\n");
|
||||
+ return -ENOENT;
|
||||
+ }
|
||||
+
|
||||
+ if (!link_conf->eht_support)
|
||||
+ return 0;
|
||||
+
|
||||
+ if (link_conf->eht_su_beamformer) {
|
||||
+ value |= u32_encode_bits(EHT_SU_BFER_ENABLE, EHT_MODE_SU_TX_BFER);
|
||||
+ if (link_conf->eht_mu_beamformer &&
|
||||
+ ahvif->vdev_type == WMI_VDEV_TYPE_AP)
|
||||
+ value |= u32_encode_bits(EHT_MU_BFER_ENABLE,
|
||||
+ EHT_MODE_MU_TX_BFER) |
|
||||
+ u32_encode_bits(EHT_DL_MUOFDMA_ENABLE,
|
||||
+ EHT_MODE_DL_OFDMA_MUMIMO) |
|
||||
+ u32_encode_bits(EHT_UL_MUOFDMA_ENABLE,
|
||||
+ EHT_MODE_UL_OFDMA_MUMIMO);
|
||||
+ }
|
||||
+
|
||||
+ if (ahvif->vif->type != NL80211_IFTYPE_MESH_POINT) {
|
||||
+ value |= u32_encode_bits(EHT_DL_MUOFDMA_ENABLE, EHT_MODE_DL_OFDMA) |
|
||||
+ u32_encode_bits(EHT_UL_MUOFDMA_ENABLE, EHT_MODE_UL_OFDMA);
|
||||
+
|
||||
+ if (link_conf->eht_80mhz_full_bw_ul_mumimo)
|
||||
+ value |= u32_encode_bits(EHT_UL_MUMIMO_ENABLE, EHT_MODE_MUMIMO);
|
||||
+
|
||||
+ if (link_conf->eht_su_beamformee)
|
||||
+ value |= u32_encode_bits(EHT_SU_BFEE_ENABLE,
|
||||
+ EHT_MODE_SU_TX_BFEE);
|
||||
+ }
|
||||
+
|
||||
+ ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, param, value);
|
||||
+ if (ret) {
|
||||
+ ath12k_warn(ar->ab, "failed to set vdev %d EHT MU mode: %d\n",
|
||||
+ arvif->vdev_id, ret);
|
||||
+ return ret;
|
||||
+ }
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
static void ath12k_bss_assoc(struct ath12k *ar,
|
||||
struct ath12k_link_vif *arvif,
|
||||
struct ieee80211_bss_conf *bss_conf)
|
||||
@@ -3994,6 +4046,12 @@ static void ath12k_mac_bss_info_changed(
|
||||
ath12k_warn(ar->ab,
|
||||
"failed to set HE TXBF config for vdev: %d\n",
|
||||
arvif->vdev_id);
|
||||
+
|
||||
+ ret = ath12k_mac_set_eht_txbf_conf(arvif);
|
||||
+ if (ret)
|
||||
+ ath12k_warn(ar->ab,
|
||||
+ "failed to set EHT TXBF config for vdev: %d\n",
|
||||
+ arvif->vdev_id);
|
||||
}
|
||||
ath12k_control_beaconing(arvif, info);
|
||||
|
||||
--- a/drivers/net/wireless/ath/ath12k/wmi.h
|
||||
+++ b/drivers/net/wireless/ath/ath12k/wmi.h
|
||||
@@ -1176,6 +1176,7 @@ enum wmi_tlv_vdev_param {
|
||||
WMI_VDEV_PARAM_BSS_COLOR,
|
||||
WMI_VDEV_PARAM_SET_HEMU_MODE,
|
||||
WMI_VDEV_PARAM_HEOPS_0_31 = 0x8003,
|
||||
+ WMI_VDEV_PARAM_SET_EHT_MU_MODE = 0x8005,
|
||||
};
|
||||
|
||||
enum wmi_tlv_peer_flags {
|
||||
@@ -3148,6 +3149,26 @@ struct ath12k_wmi_rx_reorder_queue_remov
|
||||
#define HE_MU_BFER_ENABLE 1
|
||||
#define HE_SU_BFER_ENABLE 1
|
||||
|
||||
+#define EHT_MODE_SU_TX_BFEE BIT(0)
|
||||
+#define EHT_MODE_SU_TX_BFER BIT(1)
|
||||
+#define EHT_MODE_MU_TX_BFEE BIT(2)
|
||||
+#define EHT_MODE_MU_TX_BFER BIT(3)
|
||||
+#define EHT_MODE_DL_OFDMA BIT(4)
|
||||
+#define EHT_MODE_UL_OFDMA BIT(5)
|
||||
+#define EHT_MODE_MUMIMO BIT(6)
|
||||
+#define EHT_MODE_DL_OFDMA_TXBF BIT(7)
|
||||
+#define EHT_MODE_DL_OFDMA_MUMIMO BIT(8)
|
||||
+#define EHT_MODE_UL_OFDMA_MUMIMO BIT(9)
|
||||
+
|
||||
+#define EHT_DL_MUOFDMA_ENABLE 1
|
||||
+#define EHT_UL_MUOFDMA_ENABLE 1
|
||||
+#define EHT_DL_MUMIMO_ENABLE 1
|
||||
+#define EHT_UL_MUMIMO_ENABLE 1
|
||||
+#define EHT_MU_BFEE_ENABLE 1
|
||||
+#define EHT_SU_BFEE_ENABLE 1
|
||||
+#define EHT_MU_BFER_ENABLE 1
|
||||
+#define EHT_SU_BFER_ENABLE 1
|
||||
+
|
||||
#define HE_VHT_SOUNDING_MODE_ENABLE 1
|
||||
#define HE_SU_MU_SOUNDING_MODE_ENABLE 1
|
||||
#define HE_TRIG_NONTRIG_SOUNDING_MODE_ENABLE 1
|
||||
@@ -0,0 +1,173 @@
|
||||
From patchwork Wed May 21 22:45:33 2025
|
||||
Content-Type: text/plain; charset="utf-8"
|
||||
MIME-Version: 1.0
|
||||
Content-Transfer-Encoding: 7bit
|
||||
X-Patchwork-Submitter: Pradeep Kumar Chitrapu <quic_pradeepc@quicinc.com>
|
||||
X-Patchwork-Id: 14096126
|
||||
X-Patchwork-Delegate: quic_jjohnson@quicinc.com
|
||||
Received: from mx0a-0031df01.pphosted.com (mx0a-0031df01.pphosted.com
|
||||
[205.220.168.131])
|
||||
(using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits))
|
||||
(No client certificate requested)
|
||||
by smtp.subspace.kernel.org (Postfix) with ESMTPS id A4E00239570
|
||||
for <linux-wireless@vger.kernel.org>; Wed, 21 May 2025 22:46:01 +0000 (UTC)
|
||||
Authentication-Results: smtp.subspace.kernel.org;
|
||||
arc=none smtp.client-ip=205.220.168.131
|
||||
ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116;
|
||||
t=1747867563; cv=none;
|
||||
b=m0NU8tyG2d1pHiYNjTYhCTeGXC0pFtHNZTKxb+dc5AEzzUCa75lxPxtYFZApv1QHaLqo3lGkZ+ADhqhj/V82GA+bUeetm3hSsnyGgjbayU3IzqeO09+VPkt9sx9hdrTMlVGEI4c5881Zho41rlVW65O/SlmqRi4J/ajQzA4tiGQ=
|
||||
ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org;
|
||||
s=arc-20240116; t=1747867563; c=relaxed/simple;
|
||||
bh=0bTV82dMwisd7nmbtolnSKswG/aTjqN0YxpAx66Oqv8=;
|
||||
h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References:
|
||||
MIME-Version:Content-Type;
|
||||
b=jOkezej/N9fmvOtPNCGPpnPNtoQ+pAG4k1zAiw3xnL1iikk7VcJlbXDCrGUithxMZE2513zz/fsfDjXx0AMi4YT1ISljvGCw9B0dGQ5ECiFfoGLc+12nnsvqjiXI5zla6C1iX7bgtJjv/OYWzoY0TR5jI28CZWC/Pa9fT/X0duw=
|
||||
ARC-Authentication-Results: i=1; smtp.subspace.kernel.org;
|
||||
dmarc=pass (p=none dis=none) header.from=quicinc.com;
|
||||
spf=pass smtp.mailfrom=quicinc.com;
|
||||
dkim=pass (2048-bit key) header.d=quicinc.com header.i=@quicinc.com
|
||||
header.b=UqUMYAcW; arc=none smtp.client-ip=205.220.168.131
|
||||
Authentication-Results: smtp.subspace.kernel.org;
|
||||
dmarc=pass (p=none dis=none) header.from=quicinc.com
|
||||
Authentication-Results: smtp.subspace.kernel.org;
|
||||
spf=pass smtp.mailfrom=quicinc.com
|
||||
Authentication-Results: smtp.subspace.kernel.org;
|
||||
dkim=pass (2048-bit key) header.d=quicinc.com header.i=@quicinc.com
|
||||
header.b="UqUMYAcW"
|
||||
Received: from pps.filterd (m0279866.ppops.net [127.0.0.1])
|
||||
by mx0a-0031df01.pphosted.com (8.18.1.2/8.18.1.2) with ESMTP id
|
||||
54LIDlKw013406;
|
||||
Wed, 21 May 2025 22:45:53 GMT
|
||||
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=quicinc.com; h=
|
||||
cc:content-transfer-encoding:content-type:date:from:in-reply-to
|
||||
:message-id:mime-version:references:subject:to; s=qcppdkim1; bh=
|
||||
tYXOeicncMlFjsw5kmnB5kxC/Nrj/HibF1jgO4m8lhM=; b=UqUMYAcWWQ07Z79h
|
||||
GESSroshxr6zIUBw3jr/ESGDCO554RYWZZh9PXJxjTRM3ceCrNHNpCAT+mqXXiWy
|
||||
eb+l7G0W+s1l/MStBq7B43CSdKxljZtlkC/JsHk6DQjBacQzVB8qAiq3ShbR/vn7
|
||||
ud3kzjHtYsfLvIpi+8wLTkE1in8E/CUFZ4bea866xldnrcOVEa7EuxKwKXj3sLhE
|
||||
8n3IsPUIYGLKnEFkmWFZTXTqlEOV9lVYdTxeDAUBxII8PQIKu+dlB/UWffTFTSOd
|
||||
aQDPK5N6y8x29E2fugyy2XBSEFskz50Jb60+kJhHFGTgl5cQw+NfymuC9SQJBWaE
|
||||
HFZu+w==
|
||||
Received: from nalasppmta02.qualcomm.com (Global_NAT1.qualcomm.com
|
||||
[129.46.96.20])
|
||||
by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 46rwh5cfg1-1
|
||||
(version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT);
|
||||
Wed, 21 May 2025 22:45:53 +0000 (GMT)
|
||||
Received: from nalasex01a.na.qualcomm.com (nalasex01a.na.qualcomm.com
|
||||
[10.47.209.196])
|
||||
by NALASPPMTA02.qualcomm.com (8.18.1.2/8.18.1.2) with ESMTPS id
|
||||
54LMjqn9020293
|
||||
(version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT);
|
||||
Wed, 21 May 2025 22:45:52 GMT
|
||||
Received: from ath12k-linux2.qualcomm.com (10.80.80.8) by
|
||||
nalasex01a.na.qualcomm.com (10.47.209.196) with Microsoft SMTP Server
|
||||
(version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id
|
||||
15.2.1544.9; Wed, 21 May 2025 15:45:52 -0700
|
||||
From: Pradeep Kumar Chitrapu <quic_pradeepc@quicinc.com>
|
||||
To: <ath12k@lists.infradead.org>
|
||||
CC: <linux-wireless@vger.kernel.org>,
|
||||
Pradeep Kumar Chitrapu
|
||||
<quic_pradeepc@quicinc.com>,
|
||||
Muna Sinada <quic_msinada@quicinc.com>,
|
||||
"Jeff
|
||||
Johnson" <quic_jjohnson@quicinc.com>
|
||||
Subject: [PATCH ath-next V14 3/9] wifi: ath12k: move HE MCS mapper to a
|
||||
separate function
|
||||
Date: Wed, 21 May 2025 15:45:33 -0700
|
||||
Message-ID: <20250521224539.355985-4-quic_pradeepc@quicinc.com>
|
||||
X-Mailer: git-send-email 2.43.0
|
||||
In-Reply-To: <20250521224539.355985-1-quic_pradeepc@quicinc.com>
|
||||
References: <20250521224539.355985-1-quic_pradeepc@quicinc.com>
|
||||
Precedence: bulk
|
||||
X-Mailing-List: linux-wireless@vger.kernel.org
|
||||
List-Id: <linux-wireless.vger.kernel.org>
|
||||
List-Subscribe: <mailto:linux-wireless+subscribe@vger.kernel.org>
|
||||
List-Unsubscribe: <mailto:linux-wireless+unsubscribe@vger.kernel.org>
|
||||
MIME-Version: 1.0
|
||||
X-ClientProxiedBy: nasanex01a.na.qualcomm.com (10.52.223.231) To
|
||||
nalasex01a.na.qualcomm.com (10.47.209.196)
|
||||
X-QCInternal: smtphost
|
||||
X-Proofpoint-Virus-Version: vendor=nai engine=6200 definitions=5800
|
||||
signatures=585085
|
||||
X-Proofpoint-Spam-Details-Enc: AW1haW4tMjUwNTIxMDIyNiBTYWx0ZWRfX0c42ymLt+PTP
|
||||
1OuRw1LMafhFmBy7Y+zhs50WttVxoryUfqamicOcfcFB1N0ReYFgzeQ7geC/w54E8E6mzQDYeie
|
||||
WWkPGvuIyvtCjzhBcBwz1A7W/LdsI7Od6+VlXyCuAp4pbCASB7kqVnI7Neak6mvdIQIW5khVLX7
|
||||
r/364Kop8/BPQzOVUZf5snfx4TBCgWauiHZQBTJupIn1Tf8+NctUXB8H3QNfu8zJTLVrBA3rtt1
|
||||
+yjeNOHom4U/t0u5Vzxu+8XctXsWHoYytfluXbsRo7WNut0MwPSY8GCm7RQ2wDQp0CzdactGb6t
|
||||
KCMvNcpkDRjEtOdkNtf2BeVHF1yJKxuibe6qssobLjTadJRkC33xnz5E+hzF6sEZlg7JWok01h4
|
||||
OxWFUldQYnF/eQjZYTQcgLyH91h9gWkvz0YJWKGCrg0PlxqeIFS/SQvVNs7qMnsX0qrXb7NV
|
||||
X-Authority-Analysis: v=2.4 cv=XeWJzJ55 c=1 sm=1 tr=0 ts=682e57a1 cx=c_pps
|
||||
a=ouPCqIW2jiPt+lZRy3xVPw==:117 a=ouPCqIW2jiPt+lZRy3xVPw==:17
|
||||
a=GEpy-HfZoHoA:10 a=dt9VzEwgFbYA:10 a=COk6AnOGAAAA:8 a=4Pgy4kl5F6fn7-PMLAkA:9
|
||||
a=TjNXssC_j7lpFel5tvFf:22
|
||||
X-Proofpoint-GUID: CVZHk1FyIP3eCYHbVaXVp1fjSAGIjnVJ
|
||||
X-Proofpoint-ORIG-GUID: CVZHk1FyIP3eCYHbVaXVp1fjSAGIjnVJ
|
||||
X-Proofpoint-Virus-Version: vendor=baseguard
|
||||
engine=ICAP:2.0.293,Aquarius:18.0.1099,Hydra:6.0.736,FMLib:17.12.80.40
|
||||
definitions=2025-05-21_07,2025-05-20_03,2025-03-28_01
|
||||
X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0
|
||||
phishscore=0 clxscore=1015 mlxlogscore=999 mlxscore=0 bulkscore=0 spamscore=0
|
||||
suspectscore=0 impostorscore=0 adultscore=0 malwarescore=0 lowpriorityscore=0
|
||||
priorityscore=1501 classifier=spam authscore=0 authtc=n/a authcc=
|
||||
route=outbound adjust=0 reason=mlx scancount=1 engine=8.19.0-2505160000
|
||||
definitions=main-2505210226
|
||||
|
||||
Refactor the HE MCS mapper functionality in
|
||||
ath12k_mac_copy_he_cap() into a new function.
|
||||
|
||||
This helps improve readability, extensibility and will be used
|
||||
when adding support for 160 MHz bandwidth in subsequent patches.
|
||||
|
||||
Tested-on: QCN9274 hw2.0 PCI WLAN.WBE.1.0.1-00029-QCAHKSWPL_SILICONZ-1
|
||||
|
||||
Co-developed-by: Muna Sinada <quic_msinada@quicinc.com>
|
||||
Signed-off-by: Muna Sinada <quic_msinada@quicinc.com>
|
||||
Signed-off-by: Pradeep Kumar Chitrapu <quic_pradeepc@quicinc.com>
|
||||
Acked-by: Jeff Johnson <quic_jjohnson@quicinc.com>
|
||||
---
|
||||
drivers/net/wireless/ath/ath12k/mac.c | 22 ++++++++++++++--------
|
||||
1 file changed, 14 insertions(+), 8 deletions(-)
|
||||
|
||||
--- a/drivers/net/wireless/ath/ath12k/mac.c
|
||||
+++ b/drivers/net/wireless/ath/ath12k/mac.c
|
||||
@@ -7339,12 +7339,24 @@ static __le16 ath12k_mac_setup_he_6ghz_c
|
||||
return cpu_to_le16(bcap->he_6ghz_capa);
|
||||
}
|
||||
|
||||
+static void ath12k_mac_set_hemcsmap(struct ath12k_band_cap *band_cap,
|
||||
+ struct ieee80211_sta_he_cap *he_cap)
|
||||
+{
|
||||
+ struct ieee80211_he_mcs_nss_supp *mcs_nss = &he_cap->he_mcs_nss_supp;
|
||||
+
|
||||
+ mcs_nss->rx_mcs_80 = cpu_to_le16(band_cap->he_mcs & 0xffff);
|
||||
+ mcs_nss->tx_mcs_80 = cpu_to_le16(band_cap->he_mcs & 0xffff);
|
||||
+ mcs_nss->rx_mcs_160 = cpu_to_le16((band_cap->he_mcs >> 16) & 0xffff);
|
||||
+ mcs_nss->tx_mcs_160 = cpu_to_le16((band_cap->he_mcs >> 16) & 0xffff);
|
||||
+ mcs_nss->rx_mcs_80p80 = cpu_to_le16((band_cap->he_mcs >> 16) & 0xffff);
|
||||
+ mcs_nss->tx_mcs_80p80 = cpu_to_le16((band_cap->he_mcs >> 16) & 0xffff);
|
||||
+}
|
||||
+
|
||||
static void ath12k_mac_copy_he_cap(struct ath12k_band_cap *band_cap,
|
||||
int iftype, u8 num_tx_chains,
|
||||
struct ieee80211_sta_he_cap *he_cap)
|
||||
{
|
||||
struct ieee80211_he_cap_elem *he_cap_elem = &he_cap->he_cap_elem;
|
||||
- struct ieee80211_he_mcs_nss_supp *mcs_nss = &he_cap->he_mcs_nss_supp;
|
||||
|
||||
he_cap->has_he = true;
|
||||
memcpy(he_cap_elem->mac_cap_info, band_cap->he_cap_info,
|
||||
@@ -7384,13 +7396,7 @@ static void ath12k_mac_copy_he_cap(struc
|
||||
break;
|
||||
}
|
||||
|
||||
- mcs_nss->rx_mcs_80 = cpu_to_le16(band_cap->he_mcs & 0xffff);
|
||||
- mcs_nss->tx_mcs_80 = cpu_to_le16(band_cap->he_mcs & 0xffff);
|
||||
- mcs_nss->rx_mcs_160 = cpu_to_le16((band_cap->he_mcs >> 16) & 0xffff);
|
||||
- mcs_nss->tx_mcs_160 = cpu_to_le16((band_cap->he_mcs >> 16) & 0xffff);
|
||||
- mcs_nss->rx_mcs_80p80 = cpu_to_le16((band_cap->he_mcs >> 16) & 0xffff);
|
||||
- mcs_nss->tx_mcs_80p80 = cpu_to_le16((band_cap->he_mcs >> 16) & 0xffff);
|
||||
-
|
||||
+ ath12k_mac_set_hemcsmap(band_cap, he_cap);
|
||||
memset(he_cap->ppe_thres, 0, sizeof(he_cap->ppe_thres));
|
||||
if (he_cap_elem->phy_cap_info[6] &
|
||||
IEEE80211_HE_PHY_CAP6_PPE_THRESHOLD_PRESENT)
|
||||
@@ -0,0 +1,197 @@
|
||||
From patchwork Wed May 21 22:45:34 2025
|
||||
Content-Type: text/plain; charset="utf-8"
|
||||
MIME-Version: 1.0
|
||||
Content-Transfer-Encoding: 7bit
|
||||
X-Patchwork-Submitter: Pradeep Kumar Chitrapu <quic_pradeepc@quicinc.com>
|
||||
X-Patchwork-Id: 14096123
|
||||
X-Patchwork-Delegate: quic_jjohnson@quicinc.com
|
||||
Received: from mx0b-0031df01.pphosted.com (mx0b-0031df01.pphosted.com
|
||||
[205.220.180.131])
|
||||
(using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits))
|
||||
(No client certificate requested)
|
||||
by smtp.subspace.kernel.org (Postfix) with ESMTPS id A3C04239581
|
||||
for <linux-wireless@vger.kernel.org>; Wed, 21 May 2025 22:45:57 +0000 (UTC)
|
||||
Authentication-Results: smtp.subspace.kernel.org;
|
||||
arc=none smtp.client-ip=205.220.180.131
|
||||
ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116;
|
||||
t=1747867561; cv=none;
|
||||
b=JUfYB6YNOea3E6luldlHf63eW7OUVXEtawJXGCeH7nt9iIJpG0ODfz3v+Zl+gtQtUZ1ELh/UAhCubbThHH30w661eEN5+cQarbiqdd1cN5dnkAsmZUNSD6l//QpurFV6Wsvv4Nr2fYgyuAVHf9JDoITZKNEbIki68J7WTV+fieU=
|
||||
ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org;
|
||||
s=arc-20240116; t=1747867561; c=relaxed/simple;
|
||||
bh=e6/wBkUC5dKwNLeEqNLmC/3pJt4EcGfxZRx+zntD5Ek=;
|
||||
h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References:
|
||||
MIME-Version:Content-Type;
|
||||
b=bg3Y4gdyPqhSKZtqqeN+SjMvTgg+BVUsyqAvkS3YPjV+C7dPwxcByNFjDRsuBqwHuSvgolo2ISExqyfJkgT6Flp4H+hriFJHcMdI0WmDf9NrBPI+E07JvNLDvP5X59C6pSrqpjXYngUV6AvPCJL7ynVBFF80h0neCm0IRu8Ur8w=
|
||||
ARC-Authentication-Results: i=1; smtp.subspace.kernel.org;
|
||||
dmarc=pass (p=none dis=none) header.from=quicinc.com;
|
||||
spf=pass smtp.mailfrom=quicinc.com;
|
||||
dkim=pass (2048-bit key) header.d=quicinc.com header.i=@quicinc.com
|
||||
header.b=LbIprPEi; arc=none smtp.client-ip=205.220.180.131
|
||||
Authentication-Results: smtp.subspace.kernel.org;
|
||||
dmarc=pass (p=none dis=none) header.from=quicinc.com
|
||||
Authentication-Results: smtp.subspace.kernel.org;
|
||||
spf=pass smtp.mailfrom=quicinc.com
|
||||
Authentication-Results: smtp.subspace.kernel.org;
|
||||
dkim=pass (2048-bit key) header.d=quicinc.com header.i=@quicinc.com
|
||||
header.b="LbIprPEi"
|
||||
Received: from pps.filterd (m0279873.ppops.net [127.0.0.1])
|
||||
by mx0a-0031df01.pphosted.com (8.18.1.2/8.18.1.2) with ESMTP id
|
||||
54LIdAVE024983;
|
||||
Wed, 21 May 2025 22:45:54 GMT
|
||||
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=quicinc.com; h=
|
||||
cc:content-transfer-encoding:content-type:date:from:in-reply-to
|
||||
:message-id:mime-version:references:subject:to; s=qcppdkim1; bh=
|
||||
oR9JZ4DE7PwiZ/DcP72BpK9yTZspsBeRbWSrP3w24nY=; b=LbIprPEif55TZs6Z
|
||||
ZsvTaIhFDxESbkxn/avX548dzh51JY3wFWHowpcPEnJJdIE1oNPWkxrPo0hHkyUb
|
||||
UICPtIHoZHdMwN/uHPyglzBnBLNP82LGLHZI5eHx6jVz4INyCFm1Gmof8YNLLIo/
|
||||
pTKj4Qx3OO0jH6zSnAoKIIg39v5TWetjVZbL2qbNR+GImD0RtoefBQxRgyJWn11r
|
||||
O3ycFAW9xlW8wYJql07vue+hM3MWNtk5EPqF70c7JrrmMAYvTyOFuP0Kaf11szIB
|
||||
mF4bMyb+bb1/QA6moW7LDIoDBWEjCLINcTdGUPTnwnfBWlxZJhZoMqzU9ZuZgvsR
|
||||
1UjthA==
|
||||
Received: from nalasppmta05.qualcomm.com (Global_NAT1.qualcomm.com
|
||||
[129.46.96.20])
|
||||
by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 46rwf4vc5x-1
|
||||
(version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT);
|
||||
Wed, 21 May 2025 22:45:54 +0000 (GMT)
|
||||
Received: from nalasex01a.na.qualcomm.com (nalasex01a.na.qualcomm.com
|
||||
[10.47.209.196])
|
||||
by NALASPPMTA05.qualcomm.com (8.18.1.2/8.18.1.2) with ESMTPS id
|
||||
54LMjrWL023291
|
||||
(version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT);
|
||||
Wed, 21 May 2025 22:45:53 GMT
|
||||
Received: from ath12k-linux2.qualcomm.com (10.80.80.8) by
|
||||
nalasex01a.na.qualcomm.com (10.47.209.196) with Microsoft SMTP Server
|
||||
(version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id
|
||||
15.2.1544.9; Wed, 21 May 2025 15:45:52 -0700
|
||||
From: Pradeep Kumar Chitrapu <quic_pradeepc@quicinc.com>
|
||||
To: <ath12k@lists.infradead.org>
|
||||
CC: <linux-wireless@vger.kernel.org>,
|
||||
Pradeep Kumar Chitrapu
|
||||
<quic_pradeepc@quicinc.com>,
|
||||
Muna Sinada <quic_msinada@quicinc.com>,
|
||||
"Jeff
|
||||
Johnson" <quic_jjohnson@quicinc.com>
|
||||
Subject: [PATCH ath-next V14 4/9] wifi: ath12k: generate rx and tx mcs maps
|
||||
for supported HE mcs
|
||||
Date: Wed, 21 May 2025 15:45:34 -0700
|
||||
Message-ID: <20250521224539.355985-5-quic_pradeepc@quicinc.com>
|
||||
X-Mailer: git-send-email 2.43.0
|
||||
In-Reply-To: <20250521224539.355985-1-quic_pradeepc@quicinc.com>
|
||||
References: <20250521224539.355985-1-quic_pradeepc@quicinc.com>
|
||||
Precedence: bulk
|
||||
X-Mailing-List: linux-wireless@vger.kernel.org
|
||||
List-Id: <linux-wireless.vger.kernel.org>
|
||||
List-Subscribe: <mailto:linux-wireless+subscribe@vger.kernel.org>
|
||||
List-Unsubscribe: <mailto:linux-wireless+unsubscribe@vger.kernel.org>
|
||||
MIME-Version: 1.0
|
||||
X-ClientProxiedBy: nasanex01a.na.qualcomm.com (10.52.223.231) To
|
||||
nalasex01a.na.qualcomm.com (10.47.209.196)
|
||||
X-QCInternal: smtphost
|
||||
X-Proofpoint-Virus-Version: vendor=nai engine=6200 definitions=5800
|
||||
signatures=585085
|
||||
X-Proofpoint-GUID: mYgnUwiU6CWGXCKmK4mo491eQG1yf62Y
|
||||
X-Proofpoint-ORIG-GUID: mYgnUwiU6CWGXCKmK4mo491eQG1yf62Y
|
||||
X-Proofpoint-Spam-Details-Enc: AW1haW4tMjUwNTIxMDIyNiBTYWx0ZWRfX1nkoUF8smaXX
|
||||
IWIOVUfe7hMPdAVBJy7J1imFvumQnVaEdoZ98Hgv5FTjeK2Ebgl2R2fohvg1z4LsyCLnU8qfg96
|
||||
1OdC0+PM8u7DhRIEnk7H2EZt0UJoJRxlc7daiIvimTjbBLu53yfgzses5Gth0zLCzoih5ffW/H5
|
||||
1h2tf1ZE4W6AmHjQJc+WE0P3RhBMdl286VT/kc0ko03He0+5/QdxsynqL2e4svB4f3035pzXOEK
|
||||
dUS4nBFSZJXuBkq0d//SizRJgH9egq51A/OVPm8om04qEcOK3x9OmrrborAen5I0iuLaqAMMBXa
|
||||
nlUKQ4fpPRovjAByevo6BIIwB698Nmo72bZcFiWOocONR92lAssB6pFXJnuwOC6VQ7MJE7DKc0x
|
||||
5UnlyGSMzMAM7cQXuGFk1AK16e6Tu/rC5YA6A4ogDKajrcBGepxGFKcZ+xK4+BwuwgI4Qysv
|
||||
X-Authority-Analysis: v=2.4 cv=R7UDGcRX c=1 sm=1 tr=0 ts=682e57a2 cx=c_pps
|
||||
a=ouPCqIW2jiPt+lZRy3xVPw==:117 a=ouPCqIW2jiPt+lZRy3xVPw==:17
|
||||
a=GEpy-HfZoHoA:10 a=dt9VzEwgFbYA:10 a=COk6AnOGAAAA:8 a=WmtfbAKxhnfIJFSrnnQA:9
|
||||
a=TjNXssC_j7lpFel5tvFf:22
|
||||
X-Proofpoint-Virus-Version: vendor=baseguard
|
||||
engine=ICAP:2.0.293,Aquarius:18.0.1099,Hydra:6.0.736,FMLib:17.12.80.40
|
||||
definitions=2025-05-21_07,2025-05-20_03,2025-03-28_01
|
||||
X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0
|
||||
phishscore=0 clxscore=1015 mlxlogscore=999 priorityscore=1501 spamscore=0
|
||||
bulkscore=0 lowpriorityscore=0 malwarescore=0 suspectscore=0 mlxscore=0
|
||||
impostorscore=0 adultscore=0 classifier=spam authscore=0 authtc=n/a authcc=
|
||||
route=outbound adjust=0 reason=mlx scancount=1 engine=8.19.0-2505160000
|
||||
definitions=main-2505210226
|
||||
|
||||
Generate rx and tx mcs maps in ath12k_mac_set_hemcsmap() based
|
||||
on number of supported tx/rx chains and set them in supported
|
||||
mcs/nss for HE capabilities.
|
||||
|
||||
Tested-on: QCN9274 hw2.0 PCI WLAN.WBE.1.0.1-00029-QCAHKSWPL_SILICONZ-1
|
||||
|
||||
Co-developed-by: Muna Sinada <quic_msinada@quicinc.com>
|
||||
Signed-off-by: Muna Sinada <quic_msinada@quicinc.com>
|
||||
Signed-off-by: Pradeep Kumar Chitrapu <quic_pradeepc@quicinc.com>
|
||||
Acked-by: Jeff Johnson <quic_jjohnson@quicinc.com>
|
||||
---
|
||||
drivers/net/wireless/ath/ath12k/mac.c | 40 ++++++++++++++++++++-------
|
||||
1 file changed, 30 insertions(+), 10 deletions(-)
|
||||
|
||||
--- a/drivers/net/wireless/ath/ath12k/mac.c
|
||||
+++ b/drivers/net/wireless/ath/ath12k/mac.c
|
||||
@@ -7339,20 +7339,40 @@ static __le16 ath12k_mac_setup_he_6ghz_c
|
||||
return cpu_to_le16(bcap->he_6ghz_capa);
|
||||
}
|
||||
|
||||
-static void ath12k_mac_set_hemcsmap(struct ath12k_band_cap *band_cap,
|
||||
+static void ath12k_mac_set_hemcsmap(struct ath12k *ar,
|
||||
+ struct ath12k_pdev_cap *cap,
|
||||
struct ieee80211_sta_he_cap *he_cap)
|
||||
{
|
||||
struct ieee80211_he_mcs_nss_supp *mcs_nss = &he_cap->he_mcs_nss_supp;
|
||||
+ u16 txmcs_map, rxmcs_map;
|
||||
+ u32 i;
|
||||
|
||||
- mcs_nss->rx_mcs_80 = cpu_to_le16(band_cap->he_mcs & 0xffff);
|
||||
- mcs_nss->tx_mcs_80 = cpu_to_le16(band_cap->he_mcs & 0xffff);
|
||||
- mcs_nss->rx_mcs_160 = cpu_to_le16((band_cap->he_mcs >> 16) & 0xffff);
|
||||
- mcs_nss->tx_mcs_160 = cpu_to_le16((band_cap->he_mcs >> 16) & 0xffff);
|
||||
- mcs_nss->rx_mcs_80p80 = cpu_to_le16((band_cap->he_mcs >> 16) & 0xffff);
|
||||
- mcs_nss->tx_mcs_80p80 = cpu_to_le16((band_cap->he_mcs >> 16) & 0xffff);
|
||||
+ rxmcs_map = 0;
|
||||
+ txmcs_map = 0;
|
||||
+ for (i = 0; i < 8; i++) {
|
||||
+ if (i < ar->num_tx_chains &&
|
||||
+ (ar->cfg_tx_chainmask >> cap->tx_chain_mask_shift) & BIT(i))
|
||||
+ txmcs_map |= IEEE80211_HE_MCS_SUPPORT_0_11 << (i * 2);
|
||||
+ else
|
||||
+ txmcs_map |= IEEE80211_HE_MCS_NOT_SUPPORTED << (i * 2);
|
||||
+
|
||||
+ if (i < ar->num_rx_chains &&
|
||||
+ (ar->cfg_rx_chainmask >> cap->tx_chain_mask_shift) & BIT(i))
|
||||
+ rxmcs_map |= IEEE80211_HE_MCS_SUPPORT_0_11 << (i * 2);
|
||||
+ else
|
||||
+ rxmcs_map |= IEEE80211_HE_MCS_NOT_SUPPORTED << (i * 2);
|
||||
+ }
|
||||
+
|
||||
+ mcs_nss->rx_mcs_80 = cpu_to_le16(rxmcs_map & 0xffff);
|
||||
+ mcs_nss->tx_mcs_80 = cpu_to_le16(txmcs_map & 0xffff);
|
||||
+ mcs_nss->rx_mcs_160 = cpu_to_le16(rxmcs_map & 0xffff);
|
||||
+ mcs_nss->tx_mcs_160 = cpu_to_le16(txmcs_map & 0xffff);
|
||||
+ mcs_nss->rx_mcs_80p80 = cpu_to_le16(rxmcs_map & 0xffff);
|
||||
+ mcs_nss->tx_mcs_80p80 = cpu_to_le16(txmcs_map & 0xffff);
|
||||
}
|
||||
|
||||
-static void ath12k_mac_copy_he_cap(struct ath12k_band_cap *band_cap,
|
||||
+static void ath12k_mac_copy_he_cap(struct ath12k *ar,
|
||||
+ struct ath12k_band_cap *band_cap,
|
||||
int iftype, u8 num_tx_chains,
|
||||
struct ieee80211_sta_he_cap *he_cap)
|
||||
{
|
||||
@@ -7396,7 +7416,7 @@ static void ath12k_mac_copy_he_cap(struc
|
||||
break;
|
||||
}
|
||||
|
||||
- ath12k_mac_set_hemcsmap(band_cap, he_cap);
|
||||
+ ath12k_mac_set_hemcsmap(ar, &ar->pdev->cap, he_cap);
|
||||
memset(he_cap->ppe_thres, 0, sizeof(he_cap->ppe_thres));
|
||||
if (he_cap_elem->phy_cap_info[6] &
|
||||
IEEE80211_HE_PHY_CAP6_PPE_THRESHOLD_PRESENT)
|
||||
@@ -7586,7 +7606,7 @@ static int ath12k_mac_copy_sband_iftype_
|
||||
|
||||
data[idx].types_mask = BIT(i);
|
||||
|
||||
- ath12k_mac_copy_he_cap(band_cap, i, ar->num_tx_chains, he_cap);
|
||||
+ ath12k_mac_copy_he_cap(ar, band_cap, i, ar->num_tx_chains, he_cap);
|
||||
if (band == NL80211_BAND_6GHZ) {
|
||||
data[idx].he_6ghz_capa.capa =
|
||||
ath12k_mac_setup_he_6ghz_cap(cap, band_cap);
|
||||
@@ -0,0 +1,152 @@
|
||||
From patchwork Wed May 21 22:45:35 2025
|
||||
Content-Type: text/plain; charset="utf-8"
|
||||
MIME-Version: 1.0
|
||||
Content-Transfer-Encoding: 7bit
|
||||
X-Patchwork-Submitter: Pradeep Kumar Chitrapu <quic_pradeepc@quicinc.com>
|
||||
X-Patchwork-Id: 14096120
|
||||
X-Patchwork-Delegate: quic_jjohnson@quicinc.com
|
||||
Received: from mx0b-0031df01.pphosted.com (mx0b-0031df01.pphosted.com
|
||||
[205.220.180.131])
|
||||
(using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits))
|
||||
(No client certificate requested)
|
||||
by smtp.subspace.kernel.org (Postfix) with ESMTPS id A3B9F239570
|
||||
for <linux-wireless@vger.kernel.org>; Wed, 21 May 2025 22:45:57 +0000 (UTC)
|
||||
Authentication-Results: smtp.subspace.kernel.org;
|
||||
arc=none smtp.client-ip=205.220.180.131
|
||||
ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116;
|
||||
t=1747867560; cv=none;
|
||||
b=GmlOnDZdpnT/77kfeg7qPbZIn+pp+Rv41/WYnHylPZroDHwpWp5rzjObHMVoVIVB8f5dpHJSWNb5ucf0EdCqAqynnnDnAHne0d3j8kMBBH6ZVQr4AnIsYhkIrbmy6o7JffEBF094XVxGwQTjyWSEPi6VY94Md6L1NnuF0J5lJXw=
|
||||
ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org;
|
||||
s=arc-20240116; t=1747867560; c=relaxed/simple;
|
||||
bh=Xdsuttpv57eTzMnRm7g3A0+frkCx/SnGj1xOjVOXHng=;
|
||||
h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References:
|
||||
MIME-Version:Content-Type;
|
||||
b=DCZ4pyonUsAaIuBQUBu/1NYBINM2V/yqfV+6ngHC6I8x7PP5e0WLPB1zEyJgRG752GtXxlhP3WdI6a+eW/8O0I64lNeSLtCeGZQ2ljn0mAfcuMtjB3rZq3UejFTR8v3I78Chfhv8/eSjfW7gSO+sswpSCXiFykPgseD3Hhz6W/4=
|
||||
ARC-Authentication-Results: i=1; smtp.subspace.kernel.org;
|
||||
dmarc=pass (p=none dis=none) header.from=quicinc.com;
|
||||
spf=pass smtp.mailfrom=quicinc.com;
|
||||
dkim=pass (2048-bit key) header.d=quicinc.com header.i=@quicinc.com
|
||||
header.b=n5c8p9dB; arc=none smtp.client-ip=205.220.180.131
|
||||
Authentication-Results: smtp.subspace.kernel.org;
|
||||
dmarc=pass (p=none dis=none) header.from=quicinc.com
|
||||
Authentication-Results: smtp.subspace.kernel.org;
|
||||
spf=pass smtp.mailfrom=quicinc.com
|
||||
Authentication-Results: smtp.subspace.kernel.org;
|
||||
dkim=pass (2048-bit key) header.d=quicinc.com header.i=@quicinc.com
|
||||
header.b="n5c8p9dB"
|
||||
Received: from pps.filterd (m0279869.ppops.net [127.0.0.1])
|
||||
by mx0a-0031df01.pphosted.com (8.18.1.2/8.18.1.2) with ESMTP id
|
||||
54LIhKMc027654;
|
||||
Wed, 21 May 2025 22:45:54 GMT
|
||||
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=quicinc.com; h=
|
||||
cc:content-transfer-encoding:content-type:date:from:in-reply-to
|
||||
:message-id:mime-version:references:subject:to; s=qcppdkim1; bh=
|
||||
igBIHxXxEIGErFGPWQKC8rBeF0DUPvb+tsDy6dmbEUQ=; b=n5c8p9dBo/+917ae
|
||||
iUuuRoUPhgwmxRjEorR4N5thttRSLen0XwHulOSFzfVHZvX/ZX7Xb8qa67RpJUAw
|
||||
jx3TGu38TFybZ9zCbXxa3PoR7FqIyl7TyaU+RpGmjLnDTRjq5ODiDDkcGM8aLJ6C
|
||||
pgH1JDyjAtZODpP3W+kKpoMlU/N8QCB8wVOob4E3+nH0XDeYWh0cSY4dAnFcFYsC
|
||||
dgkUoVt65T3wJptGX80bBT1muPG/3O+IiWrYoP6NVayscmgOnCqKVpuSjYrEn/02
|
||||
HlxMp7yg/I4LhlQquL2SfmAXdKThQLrOF/XiFsCW2VZETvSbXsLI0NXYRbRFUxC4
|
||||
e9SLmw==
|
||||
Received: from nalasppmta05.qualcomm.com (Global_NAT1.qualcomm.com
|
||||
[129.46.96.20])
|
||||
by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 46rwf9cars-1
|
||||
(version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT);
|
||||
Wed, 21 May 2025 22:45:54 +0000 (GMT)
|
||||
Received: from nalasex01a.na.qualcomm.com (nalasex01a.na.qualcomm.com
|
||||
[10.47.209.196])
|
||||
by NALASPPMTA05.qualcomm.com (8.18.1.2/8.18.1.2) with ESMTPS id
|
||||
54LMjrc1023294
|
||||
(version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT);
|
||||
Wed, 21 May 2025 22:45:53 GMT
|
||||
Received: from ath12k-linux2.qualcomm.com (10.80.80.8) by
|
||||
nalasex01a.na.qualcomm.com (10.47.209.196) with Microsoft SMTP Server
|
||||
(version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id
|
||||
15.2.1544.9; Wed, 21 May 2025 15:45:53 -0700
|
||||
From: Pradeep Kumar Chitrapu <quic_pradeepc@quicinc.com>
|
||||
To: <ath12k@lists.infradead.org>
|
||||
CC: <linux-wireless@vger.kernel.org>,
|
||||
Pradeep Kumar Chitrapu
|
||||
<quic_pradeepc@quicinc.com>,
|
||||
Jeff Johnson <quic_jjohnson@quicinc.com>
|
||||
Subject: [PATCH ath-next V14 5/9] wifi: ath12k: fix TX and RX MCS rate
|
||||
configurations in HE mode
|
||||
Date: Wed, 21 May 2025 15:45:35 -0700
|
||||
Message-ID: <20250521224539.355985-6-quic_pradeepc@quicinc.com>
|
||||
X-Mailer: git-send-email 2.43.0
|
||||
In-Reply-To: <20250521224539.355985-1-quic_pradeepc@quicinc.com>
|
||||
References: <20250521224539.355985-1-quic_pradeepc@quicinc.com>
|
||||
Precedence: bulk
|
||||
X-Mailing-List: linux-wireless@vger.kernel.org
|
||||
List-Id: <linux-wireless.vger.kernel.org>
|
||||
List-Subscribe: <mailto:linux-wireless+subscribe@vger.kernel.org>
|
||||
List-Unsubscribe: <mailto:linux-wireless+unsubscribe@vger.kernel.org>
|
||||
MIME-Version: 1.0
|
||||
X-ClientProxiedBy: nasanex01a.na.qualcomm.com (10.52.223.231) To
|
||||
nalasex01a.na.qualcomm.com (10.47.209.196)
|
||||
X-QCInternal: smtphost
|
||||
X-Proofpoint-Virus-Version: vendor=nai engine=6200 definitions=5800
|
||||
signatures=585085
|
||||
X-Proofpoint-ORIG-GUID: lrtwH7rWiPRFD03fbbD0IavLBLpNgTW-
|
||||
X-Proofpoint-Spam-Details-Enc: AW1haW4tMjUwNTIxMDIyNSBTYWx0ZWRfX0HS2wunF/V5Q
|
||||
jQqxwakF2Imrc/4a4WgPSFOFxUyO27D7Yw6gnIBRodgtwOFgflHDfeJMrELW79jrSDvXvRC0nnc
|
||||
lTonRisd7/CZWExy3sM2diYhHrZ5YT1dPhFtq33ItpY8BaOhwiLxc3wn0tlWRX8B/cd+xyEHTZY
|
||||
A4nCDSw77SEdaZfmqAB81LMzQWIuTucnxkms4pM1CIIYZrgAPcBk4XN8tWVQ6JQKCpMpelTF6Hj
|
||||
/XLCY2ByRqjtwd/zSjtcCfLOyKdT+uQtAJU1XZvedwqQW5MFk2GeD7O72PfhAP1V0YcbHdiTxde
|
||||
roRpAlQg48k0Ug5EMIUPb9TYEP15vwtPDTw03C3u7eOhs6znDqvMYNAtXwbxfGeHRwjsbMgpWLG
|
||||
+weN3zziLWlwb66N0xo5nfdJRHrOVDNcSx8/Z/xvCmHBTuVr44Q7It0iW+CGbHNqXrg4h4CH
|
||||
X-Authority-Analysis: v=2.4 cv=GawXnRXL c=1 sm=1 tr=0 ts=682e57a2 cx=c_pps
|
||||
a=ouPCqIW2jiPt+lZRy3xVPw==:117 a=ouPCqIW2jiPt+lZRy3xVPw==:17
|
||||
a=GEpy-HfZoHoA:10 a=dt9VzEwgFbYA:10 a=COk6AnOGAAAA:8 a=mu3tZSmwaZwQUXtd2tAA:9
|
||||
a=TjNXssC_j7lpFel5tvFf:22
|
||||
X-Proofpoint-GUID: lrtwH7rWiPRFD03fbbD0IavLBLpNgTW-
|
||||
X-Proofpoint-Virus-Version: vendor=baseguard
|
||||
engine=ICAP:2.0.293,Aquarius:18.0.1099,Hydra:6.0.736,FMLib:17.12.80.40
|
||||
definitions=2025-05-21_07,2025-05-20_03,2025-03-28_01
|
||||
X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0
|
||||
mlxscore=0 mlxlogscore=999 lowpriorityscore=0 impostorscore=0
|
||||
priorityscore=1501 clxscore=1015 malwarescore=0 phishscore=0 bulkscore=0
|
||||
spamscore=0 suspectscore=0 adultscore=0 classifier=spam authscore=0
|
||||
authtc=n/a authcc= route=outbound adjust=0 reason=mlx scancount=1
|
||||
engine=8.19.0-2505160000 definitions=main-2505210225
|
||||
|
||||
Currently, the TX and RX MCS rate configurations per peer are
|
||||
reversed when sent to the firmware. As a result, RX MCS rates
|
||||
are configured for TX, and vice versa. This commit rectifies
|
||||
the configuration to match what the firmware expects.
|
||||
|
||||
Tested-on: QCN9274 hw2.0 PCI WLAN.WBE.1.0.1-00029-QCAHKSWPL_SILICONZ-1
|
||||
|
||||
Fixes: d889913205cf ("wifi: ath12k: driver for Qualcomm Wi-Fi 7 devices")
|
||||
Signed-off-by: Pradeep Kumar Chitrapu <quic_pradeepc@quicinc.com>
|
||||
Acked-by: Jeff Johnson <quic_jjohnson@quicinc.com>
|
||||
---
|
||||
drivers/net/wireless/ath/ath12k/wmi.c | 4 ++--
|
||||
drivers/net/wireless/ath/ath12k/wmi.h | 2 ++
|
||||
2 files changed, 4 insertions(+), 2 deletions(-)
|
||||
|
||||
--- a/drivers/net/wireless/ath/ath12k/wmi.c
|
||||
+++ b/drivers/net/wireless/ath/ath12k/wmi.c
|
||||
@@ -2333,8 +2333,8 @@ int ath12k_wmi_send_peer_assoc_cmd(struc
|
||||
he_mcs->tlv_header = ath12k_wmi_tlv_cmd_hdr(WMI_TAG_HE_RATE_SET,
|
||||
sizeof(*he_mcs));
|
||||
|
||||
- he_mcs->rx_mcs_set = cpu_to_le32(arg->peer_he_rx_mcs_set[i]);
|
||||
- he_mcs->tx_mcs_set = cpu_to_le32(arg->peer_he_tx_mcs_set[i]);
|
||||
+ he_mcs->rx_mcs_set = cpu_to_le32(arg->peer_he_tx_mcs_set[i]);
|
||||
+ he_mcs->tx_mcs_set = cpu_to_le32(arg->peer_he_rx_mcs_set[i]);
|
||||
ptr += sizeof(*he_mcs);
|
||||
}
|
||||
|
||||
--- a/drivers/net/wireless/ath/ath12k/wmi.h
|
||||
+++ b/drivers/net/wireless/ath/ath12k/wmi.h
|
||||
@@ -4157,7 +4157,9 @@ struct ath12k_wmi_vht_rate_set_params {
|
||||
|
||||
struct ath12k_wmi_he_rate_set_params {
|
||||
__le32 tlv_header;
|
||||
+ /* MCS at which the peer can receive */
|
||||
__le32 rx_mcs_set;
|
||||
+ /* MCS at which the peer can transmit */
|
||||
__le32 tx_mcs_set;
|
||||
} __packed;
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
262
patches/ath12k/104-7-wifi-ath12k-clean-up-80P80-support.patch
Normal file
262
patches/ath12k/104-7-wifi-ath12k-clean-up-80P80-support.patch
Normal file
@@ -0,0 +1,262 @@
|
||||
From patchwork Wed May 21 22:45:37 2025
|
||||
Content-Type: text/plain; charset="utf-8"
|
||||
MIME-Version: 1.0
|
||||
Content-Transfer-Encoding: 7bit
|
||||
X-Patchwork-Submitter: Pradeep Kumar Chitrapu <quic_pradeepc@quicinc.com>
|
||||
X-Patchwork-Id: 14096121
|
||||
X-Patchwork-Delegate: quic_jjohnson@quicinc.com
|
||||
Received: from mx0b-0031df01.pphosted.com (mx0b-0031df01.pphosted.com
|
||||
[205.220.180.131])
|
||||
(using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits))
|
||||
(No client certificate requested)
|
||||
by smtp.subspace.kernel.org (Postfix) with ESMTPS id ED55023958A
|
||||
for <linux-wireless@vger.kernel.org>; Wed, 21 May 2025 22:45:58 +0000 (UTC)
|
||||
Authentication-Results: smtp.subspace.kernel.org;
|
||||
arc=none smtp.client-ip=205.220.180.131
|
||||
ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116;
|
||||
t=1747867560; cv=none;
|
||||
b=R6R1l/0hUMYWkLzVM4w8Z2s3aU01ujlrdBV4IEYLrqQ3CzuP8xd2fnZMcdbVAFvXd/hepJKOZrFod6RG43u2TuGCQ5wM3SKIqyk0c/MlskZk+jnUnvm9WtrezJS82phw1G2mJ8NiYsKzmcJGMQtaYfl3jWA4o+BGMGyOg0Keb/M=
|
||||
ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org;
|
||||
s=arc-20240116; t=1747867560; c=relaxed/simple;
|
||||
bh=HUqzq2V1sSbcLZxqxveNb5xXvMg5sfyIhSzn4mKsdms=;
|
||||
h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References:
|
||||
MIME-Version:Content-Type;
|
||||
b=G9poRT2jwhhAC0htiaG4SIE8b1DuTf63uDCDCGj5WoQ4B/v/NWtaqtzBWJF4c7UuQBso4JO4X9auJyfxJ4SxUBrULdlJq7mvAs7nxFOPEBDBltLKWCZznLwuuuo690MjvUQ5mfKt/Oy+uREyur4vXsQtfSBZc0DSZUlC5R+Z2Mc=
|
||||
ARC-Authentication-Results: i=1; smtp.subspace.kernel.org;
|
||||
dmarc=pass (p=none dis=none) header.from=quicinc.com;
|
||||
spf=pass smtp.mailfrom=quicinc.com;
|
||||
dkim=pass (2048-bit key) header.d=quicinc.com header.i=@quicinc.com
|
||||
header.b=cu63IdMd; arc=none smtp.client-ip=205.220.180.131
|
||||
Authentication-Results: smtp.subspace.kernel.org;
|
||||
dmarc=pass (p=none dis=none) header.from=quicinc.com
|
||||
Authentication-Results: smtp.subspace.kernel.org;
|
||||
spf=pass smtp.mailfrom=quicinc.com
|
||||
Authentication-Results: smtp.subspace.kernel.org;
|
||||
dkim=pass (2048-bit key) header.d=quicinc.com header.i=@quicinc.com
|
||||
header.b="cu63IdMd"
|
||||
Received: from pps.filterd (m0279871.ppops.net [127.0.0.1])
|
||||
by mx0a-0031df01.pphosted.com (8.18.1.2/8.18.1.2) with ESMTP id
|
||||
54LJgw7Z025025;
|
||||
Wed, 21 May 2025 22:45:56 GMT
|
||||
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=quicinc.com; h=
|
||||
cc:content-transfer-encoding:content-type:date:from:in-reply-to
|
||||
:message-id:mime-version:references:subject:to; s=qcppdkim1; bh=
|
||||
90lF32RvbNU2yyxl2mGBEewKfDvRJ7MRRLe6DgCwXFs=; b=cu63IdMdS+nJIsqy
|
||||
ktY/ZQ/qTTWf2MpubSMC9UftiwnI9Xj6K8LFE0q+NvCN2EgZKzf+OzyW9wbbRepN
|
||||
Q3ZYBAR3lFyw40J6AZgpAuPiq7Y+eqt7l8jc+/2bb2+imOzvWHwFkXSvc8nijnHX
|
||||
ZLEU29M0xloyHeJ7xLbumzRdfcCJ6357/HKp9U3mLvEfpLY97t5/H3yEJWHQmnvE
|
||||
aHkFaLM6Ru2R2+nzPDylKcY+TZsqv306oEqydWI33ANyvfDkWJqbQjtQ+geTkJxC
|
||||
syi9ZifD5zPdOjb9YWNn0V8mWUBRx6hW8ZKU/L3gWGXjkvyRHneZ4AOz83Tp9Ym4
|
||||
L34jSQ==
|
||||
Received: from nalasppmta04.qualcomm.com (Global_NAT1.qualcomm.com
|
||||
[129.46.96.20])
|
||||
by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 46rwf6vbsf-1
|
||||
(version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT);
|
||||
Wed, 21 May 2025 22:45:55 +0000 (GMT)
|
||||
Received: from nalasex01a.na.qualcomm.com (nalasex01a.na.qualcomm.com
|
||||
[10.47.209.196])
|
||||
by NALASPPMTA04.qualcomm.com (8.18.1.2/8.18.1.2) with ESMTPS id
|
||||
54LMjsWN022226
|
||||
(version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT);
|
||||
Wed, 21 May 2025 22:45:54 GMT
|
||||
Received: from ath12k-linux2.qualcomm.com (10.80.80.8) by
|
||||
nalasex01a.na.qualcomm.com (10.47.209.196) with Microsoft SMTP Server
|
||||
(version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id
|
||||
15.2.1544.9; Wed, 21 May 2025 15:45:54 -0700
|
||||
From: Pradeep Kumar Chitrapu <quic_pradeepc@quicinc.com>
|
||||
To: <ath12k@lists.infradead.org>
|
||||
CC: <linux-wireless@vger.kernel.org>,
|
||||
Pradeep Kumar Chitrapu
|
||||
<quic_pradeepc@quicinc.com>,
|
||||
Jeff Johnson <quic_jjohnson@quicinc.com>
|
||||
Subject: [PATCH ath-next V14 7/9] wifi: ath12k: clean up 80P80 support
|
||||
Date: Wed, 21 May 2025 15:45:37 -0700
|
||||
Message-ID: <20250521224539.355985-8-quic_pradeepc@quicinc.com>
|
||||
X-Mailer: git-send-email 2.43.0
|
||||
In-Reply-To: <20250521224539.355985-1-quic_pradeepc@quicinc.com>
|
||||
References: <20250521224539.355985-1-quic_pradeepc@quicinc.com>
|
||||
Precedence: bulk
|
||||
X-Mailing-List: linux-wireless@vger.kernel.org
|
||||
List-Id: <linux-wireless.vger.kernel.org>
|
||||
List-Subscribe: <mailto:linux-wireless+subscribe@vger.kernel.org>
|
||||
List-Unsubscribe: <mailto:linux-wireless+unsubscribe@vger.kernel.org>
|
||||
MIME-Version: 1.0
|
||||
X-ClientProxiedBy: nasanex01a.na.qualcomm.com (10.52.223.231) To
|
||||
nalasex01a.na.qualcomm.com (10.47.209.196)
|
||||
X-QCInternal: smtphost
|
||||
X-Proofpoint-Virus-Version: vendor=nai engine=6200 definitions=5800
|
||||
signatures=585085
|
||||
X-Proofpoint-GUID: xDBdjIlSrmWJZkBfMwcImhxnyTIR4551
|
||||
X-Proofpoint-Spam-Details-Enc: AW1haW4tMjUwNTIxMDIyNiBTYWx0ZWRfX75XKL//oF16a
|
||||
YMA/60ZSduIYMzTQ+PpEhRfS8BSEJ3JAYNLLDjp3b1hmrHJmdqMnxgbya6RQ+qeAISgkr8ZWIMx
|
||||
fGx/btrlFP2SbXd0JWwSMOApD3LJewBu/ZeBWBDEWbbO00LOGnR0aFqmCeym6YSeYyakVcNd8nQ
|
||||
0JnPxxBLeXeYPpIZTFMD6TpVFyfvtCG9jpMOI27FLBdHLednVW2yrOx5b62xwy181re5iN4XOki
|
||||
1M/HJRMACpfQJImHpO9X3rRh2j79oKIKVwa3UjV8A7vD3noV/pV0SOTZP0awMYQH/Pn91nji685
|
||||
auXzHG2pai3Byw89+jYZIG2xfiqBcBwIEARvw52XSv3glk0tSvLDxNo8nyFNPsZ63g70USl1IlC
|
||||
AKhW+QOw9/zkn3oCB+3fZZ/y+F4vlu4OzN4gETU+6p3798YiFGWMvocQnI/Ig7Unex9rmOP5
|
||||
X-Authority-Analysis: v=2.4 cv=fZOty1QF c=1 sm=1 tr=0 ts=682e57a3 cx=c_pps
|
||||
a=ouPCqIW2jiPt+lZRy3xVPw==:117 a=ouPCqIW2jiPt+lZRy3xVPw==:17
|
||||
a=GEpy-HfZoHoA:10 a=dt9VzEwgFbYA:10 a=COk6AnOGAAAA:8 a=QHHbJxpVzSBZVvfXPLwA:9
|
||||
a=TjNXssC_j7lpFel5tvFf:22
|
||||
X-Proofpoint-ORIG-GUID: xDBdjIlSrmWJZkBfMwcImhxnyTIR4551
|
||||
X-Proofpoint-Virus-Version: vendor=baseguard
|
||||
engine=ICAP:2.0.293,Aquarius:18.0.1099,Hydra:6.0.736,FMLib:17.12.80.40
|
||||
definitions=2025-05-21_07,2025-05-20_03,2025-03-28_01
|
||||
X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0
|
||||
clxscore=1015 mlxscore=0 adultscore=0 spamscore=0 bulkscore=0 suspectscore=0
|
||||
malwarescore=0 priorityscore=1501 impostorscore=0 mlxlogscore=999
|
||||
lowpriorityscore=0 phishscore=0 classifier=spam authscore=0 authtc=n/a
|
||||
authcc= route=outbound adjust=0 reason=mlx scancount=1
|
||||
engine=8.19.0-2505160000 definitions=main-2505210226
|
||||
|
||||
Clean up unused 80P80 references as hardware does not support
|
||||
it. This is applicable to both QCN9274 and WCN7850.
|
||||
|
||||
Tested-on: QCN9274 hw2.0 PCI WLAN.WBE.1.0.1-00029-QCAHKSWPL_SILICONZ-1
|
||||
|
||||
Signed-off-by: Pradeep Kumar Chitrapu <quic_pradeepc@quicinc.com>
|
||||
Acked-by: Jeff Johnson <quic_jjohnson@quicinc.com>
|
||||
---
|
||||
drivers/net/wireless/ath/ath12k/mac.c | 48 ++++++---------------------
|
||||
drivers/net/wireless/ath/ath12k/wmi.c | 2 --
|
||||
drivers/net/wireless/ath/ath12k/wmi.h | 1 -
|
||||
3 files changed, 10 insertions(+), 41 deletions(-)
|
||||
|
||||
--- a/drivers/net/wireless/ath/ath12k/mac.c
|
||||
+++ b/drivers/net/wireless/ath/ath12k/mac.c
|
||||
@@ -209,7 +209,7 @@ ath12k_phymodes[NUM_NL80211_BANDS][ATH12
|
||||
[NL80211_CHAN_WIDTH_40] = MODE_11BE_EHT40,
|
||||
[NL80211_CHAN_WIDTH_80] = MODE_11BE_EHT80,
|
||||
[NL80211_CHAN_WIDTH_160] = MODE_11BE_EHT160,
|
||||
- [NL80211_CHAN_WIDTH_80P80] = MODE_11BE_EHT80_80,
|
||||
+ [NL80211_CHAN_WIDTH_80P80] = MODE_UNKNOWN,
|
||||
[NL80211_CHAN_WIDTH_320] = MODE_11BE_EHT320,
|
||||
},
|
||||
[NL80211_BAND_6GHZ] = {
|
||||
@@ -220,7 +220,7 @@ ath12k_phymodes[NUM_NL80211_BANDS][ATH12
|
||||
[NL80211_CHAN_WIDTH_40] = MODE_11BE_EHT40,
|
||||
[NL80211_CHAN_WIDTH_80] = MODE_11BE_EHT80,
|
||||
[NL80211_CHAN_WIDTH_160] = MODE_11BE_EHT160,
|
||||
- [NL80211_CHAN_WIDTH_80P80] = MODE_11BE_EHT80_80,
|
||||
+ [NL80211_CHAN_WIDTH_80P80] = MODE_UNKNOWN,
|
||||
[NL80211_CHAN_WIDTH_320] = MODE_11BE_EHT320,
|
||||
},
|
||||
|
||||
@@ -2556,17 +2556,6 @@ static void ath12k_peer_assoc_h_he(struc
|
||||
|
||||
switch (link_sta->bandwidth) {
|
||||
case IEEE80211_STA_RX_BW_160:
|
||||
- if (he_cap->he_cap_elem.phy_cap_info[0] &
|
||||
- IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_80PLUS80_MHZ_IN_5G) {
|
||||
- v = ath12k_peer_assoc_h_he_limit(v, he_mcs_mask);
|
||||
- arg->peer_he_rx_mcs_set[WMI_HECAP_TXRX_MCS_NSS_IDX_80_80] = v;
|
||||
-
|
||||
- v = le16_to_cpu(he_cap->he_mcs_nss_supp.tx_mcs_80p80);
|
||||
- arg->peer_he_tx_mcs_set[WMI_HECAP_TXRX_MCS_NSS_IDX_80_80] = v;
|
||||
-
|
||||
- arg->peer_he_mcs_count++;
|
||||
- he_tx_mcs = v;
|
||||
- }
|
||||
v = le16_to_cpu(he_cap->he_mcs_nss_supp.rx_mcs_160);
|
||||
arg->peer_he_rx_mcs_set[WMI_HECAP_TXRX_MCS_NSS_IDX_160] = v;
|
||||
|
||||
@@ -2853,16 +2842,11 @@ static enum wmi_phy_mode ath12k_mac_get_
|
||||
struct ieee80211_link_sta *link_sta)
|
||||
{
|
||||
if (link_sta->bandwidth == IEEE80211_STA_RX_BW_160) {
|
||||
- switch (link_sta->vht_cap.cap &
|
||||
- IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_MASK) {
|
||||
- case IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_160MHZ:
|
||||
+ if (link_sta->vht_cap.cap & IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_160MHZ)
|
||||
return MODE_11AC_VHT160;
|
||||
- case IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_160_80PLUS80MHZ:
|
||||
- return MODE_11AC_VHT80_80;
|
||||
- default:
|
||||
- /* not sure if this is a valid case? */
|
||||
- return MODE_11AC_VHT160;
|
||||
- }
|
||||
+
|
||||
+ /* not sure if this is a valid case? */
|
||||
+ return MODE_11AC_VHT160;
|
||||
}
|
||||
|
||||
if (link_sta->bandwidth == IEEE80211_STA_RX_BW_80)
|
||||
@@ -2884,11 +2868,8 @@ static enum wmi_phy_mode ath12k_mac_get_
|
||||
if (link_sta->he_cap.he_cap_elem.phy_cap_info[0] &
|
||||
IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_160MHZ_IN_5G)
|
||||
return MODE_11AX_HE160;
|
||||
- else if (link_sta->he_cap.he_cap_elem.phy_cap_info[0] &
|
||||
- IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_80PLUS80_MHZ_IN_5G)
|
||||
- return MODE_11AX_HE80_80;
|
||||
- /* not sure if this is a valid case? */
|
||||
- return MODE_11AX_HE160;
|
||||
+
|
||||
+ return MODE_UNKNOWN;
|
||||
}
|
||||
|
||||
if (link_sta->bandwidth == IEEE80211_STA_RX_BW_80)
|
||||
@@ -2916,14 +2897,10 @@ static enum wmi_phy_mode ath12k_mac_get_
|
||||
IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_160MHZ_IN_5G)
|
||||
return MODE_11BE_EHT160;
|
||||
|
||||
- if (link_sta->he_cap.he_cap_elem.phy_cap_info[0] &
|
||||
- IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_80PLUS80_MHZ_IN_5G)
|
||||
- return MODE_11BE_EHT80_80;
|
||||
-
|
||||
ath12k_warn(ar->ab, "invalid EHT PHY capability info for 160 Mhz: %d\n",
|
||||
link_sta->he_cap.he_cap_elem.phy_cap_info[0]);
|
||||
|
||||
- return MODE_11BE_EHT160;
|
||||
+ return MODE_UNKNOWN;
|
||||
}
|
||||
|
||||
if (link_sta->bandwidth == IEEE80211_STA_RX_BW_80)
|
||||
@@ -7630,8 +7607,6 @@ static void ath12k_mac_set_hemcsmap(stru
|
||||
mcs_nss->tx_mcs_80 = cpu_to_le16(txmcs_map & 0xffff);
|
||||
mcs_nss->rx_mcs_160 = cpu_to_le16(rxmcs_map & 0xffff);
|
||||
mcs_nss->tx_mcs_160 = cpu_to_le16(txmcs_map & 0xffff);
|
||||
- mcs_nss->rx_mcs_80p80 = cpu_to_le16(rxmcs_map & 0xffff);
|
||||
- mcs_nss->tx_mcs_80p80 = cpu_to_le16(txmcs_map & 0xffff);
|
||||
}
|
||||
|
||||
static void ath12k_mac_copy_he_cap(struct ath12k *ar,
|
||||
@@ -7653,6 +7628,7 @@ static void ath12k_mac_copy_he_cap(struc
|
||||
IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_40MHZ_IN_2G |
|
||||
IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_40MHZ_80MHZ_IN_5G |
|
||||
IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_160MHZ_IN_5G;
|
||||
+ /* 80PLUS80 is not supported */
|
||||
he_cap_elem->phy_cap_info[0] &=
|
||||
~IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_80PLUS80_MHZ_IN_5G;
|
||||
he_cap_elem->phy_cap_info[5] &=
|
||||
@@ -11309,10 +11285,6 @@ static __le16
|
||||
ath12k_mac_get_tx_mcs_map(const struct ieee80211_sta_he_cap *he_cap)
|
||||
{
|
||||
if (he_cap->he_cap_elem.phy_cap_info[0] &
|
||||
- IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_80PLUS80_MHZ_IN_5G)
|
||||
- return he_cap->he_mcs_nss_supp.tx_mcs_80p80;
|
||||
-
|
||||
- if (he_cap->he_cap_elem.phy_cap_info[0] &
|
||||
IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_160MHZ_IN_5G)
|
||||
return he_cap->he_mcs_nss_supp.tx_mcs_160;
|
||||
|
||||
--- a/drivers/net/wireless/ath/ath12k/wmi.c
|
||||
+++ b/drivers/net/wireless/ath/ath12k/wmi.c
|
||||
@@ -1066,8 +1066,6 @@ static void ath12k_wmi_put_wmi_channel(s
|
||||
chan->band_center_freq1 = cpu_to_le32(center_freq1 - 40);
|
||||
|
||||
chan->band_center_freq2 = cpu_to_le32(center_freq1);
|
||||
- } else if (arg->mode == MODE_11BE_EHT80_80) {
|
||||
- chan->band_center_freq2 = cpu_to_le32(arg->band_center_freq2);
|
||||
} else {
|
||||
chan->band_center_freq2 = 0;
|
||||
}
|
||||
--- a/drivers/net/wireless/ath/ath12k/wmi.h
|
||||
+++ b/drivers/net/wireless/ath/ath12k/wmi.h
|
||||
@@ -3798,7 +3798,6 @@ struct wmi_vdev_install_key_arg {
|
||||
#define WMI_HOST_MAX_HE_RATE_SET 3
|
||||
#define WMI_HECAP_TXRX_MCS_NSS_IDX_80 0
|
||||
#define WMI_HECAP_TXRX_MCS_NSS_IDX_160 1
|
||||
-#define WMI_HECAP_TXRX_MCS_NSS_IDX_80_80 2
|
||||
|
||||
#define ATH12K_WMI_MLO_MAX_PARTNER_LINKS \
|
||||
(ATH12K_WMI_MLO_MAX_LINKS + ATH12K_MAX_NUM_BRIDGE_LINKS - 1)
|
||||
@@ -0,0 +1,379 @@
|
||||
From patchwork Wed May 21 22:45:38 2025
|
||||
Content-Type: text/plain; charset="utf-8"
|
||||
MIME-Version: 1.0
|
||||
Content-Transfer-Encoding: 7bit
|
||||
X-Patchwork-Submitter: Pradeep Kumar Chitrapu <quic_pradeepc@quicinc.com>
|
||||
X-Patchwork-Id: 14096124
|
||||
X-Patchwork-Delegate: quic_jjohnson@quicinc.com
|
||||
Received: from mx0b-0031df01.pphosted.com (mx0b-0031df01.pphosted.com
|
||||
[205.220.180.131])
|
||||
(using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits))
|
||||
(No client certificate requested)
|
||||
by smtp.subspace.kernel.org (Postfix) with ESMTPS id DEE9223A9AA
|
||||
for <linux-wireless@vger.kernel.org>; Wed, 21 May 2025 22:45:59 +0000 (UTC)
|
||||
Authentication-Results: smtp.subspace.kernel.org;
|
||||
arc=none smtp.client-ip=205.220.180.131
|
||||
ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116;
|
||||
t=1747867561; cv=none;
|
||||
b=qWgm5H8L0Zhrc5crkCw7SBoGEQ8yf+aC0TSWOzfiTwcAddeStpjorEa3XaBl0GOhHPRaECOhMSNqu88tQ5CzCGmumBQ3QLC6mod6Tb0Y0PdeUJm3YoGKcI+F0oE3g5kCHaU9LRKKnmMZQS72kE7dO+lEBfwMIuCX/VwV066B1p8=
|
||||
ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org;
|
||||
s=arc-20240116; t=1747867561; c=relaxed/simple;
|
||||
bh=61S52HJJJauXcXkg3NpFqkwtGSPNO+bmTpNYu1v9AKM=;
|
||||
h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References:
|
||||
MIME-Version:Content-Type;
|
||||
b=gi5WIxM8SYlljyfdAVTdIK6JQ5jJHPGGfdxPkwbtEaPElRA55vurxkaaJ0RktTtDYYJEn7KLZFieBHAv5/nEcrDjL4NGvgT3wiAoGcbsd+TIF6w5J2RSmAwhAP008N5swveLHDzJ0M9TrtQj2HHndc8JPD4oGWbcEqKQqHSq8ck=
|
||||
ARC-Authentication-Results: i=1; smtp.subspace.kernel.org;
|
||||
dmarc=pass (p=none dis=none) header.from=quicinc.com;
|
||||
spf=pass smtp.mailfrom=quicinc.com;
|
||||
dkim=pass (2048-bit key) header.d=quicinc.com header.i=@quicinc.com
|
||||
header.b=lMYw009C; arc=none smtp.client-ip=205.220.180.131
|
||||
Authentication-Results: smtp.subspace.kernel.org;
|
||||
dmarc=pass (p=none dis=none) header.from=quicinc.com
|
||||
Authentication-Results: smtp.subspace.kernel.org;
|
||||
spf=pass smtp.mailfrom=quicinc.com
|
||||
Authentication-Results: smtp.subspace.kernel.org;
|
||||
dkim=pass (2048-bit key) header.d=quicinc.com header.i=@quicinc.com
|
||||
header.b="lMYw009C"
|
||||
Received: from pps.filterd (m0279868.ppops.net [127.0.0.1])
|
||||
by mx0a-0031df01.pphosted.com (8.18.1.2/8.18.1.2) with ESMTP id
|
||||
54LJgEPE029249;
|
||||
Wed, 21 May 2025 22:45:56 GMT
|
||||
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=quicinc.com; h=
|
||||
cc:content-transfer-encoding:content-type:date:from:in-reply-to
|
||||
:message-id:mime-version:references:subject:to; s=qcppdkim1; bh=
|
||||
ph+yJaIkwYsZzzEsymzTjupgmHjdwFMJhbEzuPrYvfY=; b=lMYw009CSvZqDxkz
|
||||
+HCEzcZhy6QO8G2ut93TJxHdCbVLlRaMNReXGlGqx2KRNracyLRkAQsC16i+QcpJ
|
||||
aHBvIE2c0/TEtBiyv3HzBf3/89R0POT080sz81P6go3m8w9bcIE+Q2DqjdhVNqu3
|
||||
AlV8qb6pj/QUVvDbJQxO1M9eCXSO6g2BBDjgRCktOu+x2TlxhdBZ/tJP+h0AUk+j
|
||||
YsH1LhcLOZYCFTJyB6IFmHWvtGk5Ef6i6D/tXyCL7nQiDP/R1v2PcdlLlI5e5/PO
|
||||
FhKB2+RCmSyJUtyaAHHi/mVen5yqFX2K3/vL3BtprRAJINhFxQrLs6xLIQabELzj
|
||||
KCstuQ==
|
||||
Received: from nalasppmta04.qualcomm.com (Global_NAT1.qualcomm.com
|
||||
[129.46.96.20])
|
||||
by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 46rwfb4b3x-1
|
||||
(version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT);
|
||||
Wed, 21 May 2025 22:45:55 +0000 (GMT)
|
||||
Received: from nalasex01a.na.qualcomm.com (nalasex01a.na.qualcomm.com
|
||||
[10.47.209.196])
|
||||
by NALASPPMTA04.qualcomm.com (8.18.1.2/8.18.1.2) with ESMTPS id
|
||||
54LMjtX2022238
|
||||
(version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT);
|
||||
Wed, 21 May 2025 22:45:55 GMT
|
||||
Received: from ath12k-linux2.qualcomm.com (10.80.80.8) by
|
||||
nalasex01a.na.qualcomm.com (10.47.209.196) with Microsoft SMTP Server
|
||||
(version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id
|
||||
15.2.1544.9; Wed, 21 May 2025 15:45:54 -0700
|
||||
From: Pradeep Kumar Chitrapu <quic_pradeepc@quicinc.com>
|
||||
To: <ath12k@lists.infradead.org>
|
||||
CC: <linux-wireless@vger.kernel.org>,
|
||||
Pradeep Kumar Chitrapu
|
||||
<quic_pradeepc@quicinc.com>,
|
||||
P Praneesh <quic_ppranees@quicinc.com>,
|
||||
"Jeff
|
||||
Johnson" <quic_jjohnson@quicinc.com>
|
||||
Subject: [PATCH ath-next V14 8/9] wifi: ath12k: add support for 160 MHz
|
||||
bandwidth
|
||||
Date: Wed, 21 May 2025 15:45:38 -0700
|
||||
Message-ID: <20250521224539.355985-9-quic_pradeepc@quicinc.com>
|
||||
X-Mailer: git-send-email 2.43.0
|
||||
In-Reply-To: <20250521224539.355985-1-quic_pradeepc@quicinc.com>
|
||||
References: <20250521224539.355985-1-quic_pradeepc@quicinc.com>
|
||||
Precedence: bulk
|
||||
X-Mailing-List: linux-wireless@vger.kernel.org
|
||||
List-Id: <linux-wireless.vger.kernel.org>
|
||||
List-Subscribe: <mailto:linux-wireless+subscribe@vger.kernel.org>
|
||||
List-Unsubscribe: <mailto:linux-wireless+unsubscribe@vger.kernel.org>
|
||||
MIME-Version: 1.0
|
||||
X-ClientProxiedBy: nasanex01a.na.qualcomm.com (10.52.223.231) To
|
||||
nalasex01a.na.qualcomm.com (10.47.209.196)
|
||||
X-QCInternal: smtphost
|
||||
X-Proofpoint-Virus-Version: vendor=nai engine=6200 definitions=5800
|
||||
signatures=585085
|
||||
X-Proofpoint-ORIG-GUID: T9MbsOp4F8M93FD6ZEyfm1BTh5tEiCIl
|
||||
X-Proofpoint-Spam-Details-Enc: AW1haW4tMjUwNTIxMDIyNiBTYWx0ZWRfX0EeEFBAyVxZV
|
||||
WX6jh2dkCn4P+eViI8Gvz/6S+yZ+Avx9/8To2mbulh5j1kDm92bEDu7iQtI17ILPnOgbUXWAjjt
|
||||
Z2LvemtbMzJe0lY0EjJNWWunihdlsXPAdOnZFjV0rOtakq8Xx4y8K45/1cGY9dQOApxDFC9HiLZ
|
||||
+FK9apopZ2DyP6haLf5HQI+6DC3wwgbEQlE+89g69hXEM8UePlFlsf0fpfIVgiWG73gfzHkrRPM
|
||||
8ByVGmKpFSXIBmvY+EZZOPuPsQHt/91pIisXw5Joxdbl6Qf2anjuC0X4LPrTgTxgXWhljS4JdXo
|
||||
djhNt09IBnNuagxN9aMx/frUhqQPNL54kp/cXbpgcLQX0XQg8SOvwyxJs+CALQUyymluDLHyH9w
|
||||
UQUznCXFrps86AX/Fpnhrl9hqR5NO0/6oR340zsS7mvryRucOqzT7vc3WPMJEhW68VMCAl5Z
|
||||
X-Proofpoint-GUID: T9MbsOp4F8M93FD6ZEyfm1BTh5tEiCIl
|
||||
X-Authority-Analysis: v=2.4 cv=dLCmmPZb c=1 sm=1 tr=0 ts=682e57a4 cx=c_pps
|
||||
a=ouPCqIW2jiPt+lZRy3xVPw==:117 a=ouPCqIW2jiPt+lZRy3xVPw==:17
|
||||
a=GEpy-HfZoHoA:10 a=dt9VzEwgFbYA:10 a=COk6AnOGAAAA:8 a=dOJm2eNAaUnF9U8lSB4A:9
|
||||
a=TjNXssC_j7lpFel5tvFf:22
|
||||
X-Proofpoint-Virus-Version: vendor=baseguard
|
||||
engine=ICAP:2.0.293,Aquarius:18.0.1099,Hydra:6.0.736,FMLib:17.12.80.40
|
||||
definitions=2025-05-21_07,2025-05-20_03,2025-03-28_01
|
||||
X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0
|
||||
mlxscore=0 clxscore=1015 adultscore=0 bulkscore=0 phishscore=0 suspectscore=0
|
||||
impostorscore=0 malwarescore=0 lowpriorityscore=0 mlxlogscore=999 spamscore=0
|
||||
priorityscore=1501 classifier=spam authscore=0 authtc=n/a authcc=
|
||||
route=outbound adjust=0 reason=mlx scancount=1 engine=8.19.0-2505160000
|
||||
definitions=main-2505210226
|
||||
|
||||
Add support to configure maximum NSS in 160 MHz bandwidth.
|
||||
Firmware advertises support for handling NSS ratio information
|
||||
as a part of service ready ext event using nss_ratio_enabled
|
||||
flag. Save this information in ath12k_pdev_cap to calculate
|
||||
NSS ratio.
|
||||
|
||||
Additionally, reorder the code by moving
|
||||
ath12k_peer_assoc_h_phymode() before ath12k_peer_assoc_h_vht()
|
||||
to ensure that arg->peer_phymode correctly reflects the bandwidth
|
||||
in the max NSS calculation.
|
||||
|
||||
Tested-on: QCN9274 hw2.0 PCI WLAN.WBE.1.0.1-00029-QCAHKSWPL_SILICONZ-1
|
||||
|
||||
Co-developed-by: P Praneesh <quic_ppranees@quicinc.com>
|
||||
Signed-off-by: P Praneesh <quic_ppranees@quicinc.com>
|
||||
Signed-off-by: Pradeep Kumar Chitrapu <quic_pradeepc@quicinc.com>
|
||||
Acked-by: Jeff Johnson <quic_jjohnson@quicinc.com>
|
||||
---
|
||||
drivers/net/wireless/ath/ath12k/core.h | 2 +
|
||||
drivers/net/wireless/ath/ath12k/mac.c | 89 ++++++++++++++++++++++----
|
||||
drivers/net/wireless/ath/ath12k/mac.h | 2 +
|
||||
drivers/net/wireless/ath/ath12k/wmi.c | 7 +-
|
||||
drivers/net/wireless/ath/ath12k/wmi.h | 28 ++++++++
|
||||
5 files changed, 115 insertions(+), 13 deletions(-)
|
||||
|
||||
--- a/drivers/net/wireless/ath/ath12k/core.h
|
||||
+++ b/drivers/net/wireless/ath/ath12k/core.h
|
||||
@@ -879,6 +879,8 @@ struct ath12k_pdev_cap {
|
||||
struct ath12k_band_cap band[NUM_NL80211_BANDS];
|
||||
u32 eml_cap;
|
||||
u32 mld_cap;
|
||||
+ bool nss_ratio_enabled;
|
||||
+ u8 nss_ratio_info;
|
||||
};
|
||||
|
||||
struct mlo_timestamp {
|
||||
--- a/drivers/net/wireless/ath/ath12k/mac.c
|
||||
+++ b/drivers/net/wireless/ath/ath12k/mac.c
|
||||
@@ -2185,6 +2185,34 @@ ath12k_peer_assoc_h_vht_limit(u16 tx_mcs
|
||||
return tx_mcs_set;
|
||||
}
|
||||
|
||||
+static u8 ath12k_get_nss_160mhz(struct ath12k *ar,
|
||||
+ u8 max_nss)
|
||||
+{
|
||||
+ u8 nss_ratio_info = ar->pdev->cap.nss_ratio_info;
|
||||
+ u8 max_sup_nss = 0;
|
||||
+
|
||||
+ switch (nss_ratio_info) {
|
||||
+ case WMI_NSS_RATIO_1BY2_NSS:
|
||||
+ max_sup_nss = max_nss >> 1;
|
||||
+ break;
|
||||
+ case WMI_NSS_RATIO_3BY4_NSS:
|
||||
+ ath12k_warn(ar->ab, "WMI_NSS_RATIO_3BY4_NSS not supported\n");
|
||||
+ break;
|
||||
+ case WMI_NSS_RATIO_1_NSS:
|
||||
+ max_sup_nss = max_nss;
|
||||
+ break;
|
||||
+ case WMI_NSS_RATIO_2_NSS:
|
||||
+ ath12k_warn(ar->ab, "WMI_NSS_RATIO_2_NSS not supported\n");
|
||||
+ break;
|
||||
+ default:
|
||||
+ ath12k_warn(ar->ab, "invalid nss ratio received from fw: %d\n",
|
||||
+ nss_ratio_info);
|
||||
+ break;
|
||||
+ }
|
||||
+
|
||||
+ return max_sup_nss;
|
||||
+}
|
||||
+
|
||||
static void ath12k_peer_assoc_h_vht(struct ath12k *ar,
|
||||
struct ath12k_link_vif *arvif,
|
||||
struct ath12k_link_sta *arsta,
|
||||
@@ -2202,6 +2230,7 @@ static void ath12k_peer_assoc_h_vht(stru
|
||||
u8 max_nss, vht_mcs;
|
||||
int i, vht_nss, nss_idx;
|
||||
bool user_rate_valid = true;
|
||||
+ u32 rx_nss, tx_nss, nss_160;
|
||||
|
||||
lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
|
||||
|
||||
@@ -2306,10 +2335,24 @@ static void ath12k_peer_assoc_h_vht(stru
|
||||
/* TODO: Check */
|
||||
arg->tx_max_mcs_nss = 0xFF;
|
||||
|
||||
- ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac vht peer %pM max_mpdu %d flags 0x%x\n",
|
||||
- arsta->addr, arg->peer_max_mpdu, arg->peer_flags);
|
||||
+ if (arg->peer_phymode == MODE_11AC_VHT160) {
|
||||
+ tx_nss = ath12k_get_nss_160mhz(ar, max_nss);
|
||||
+ rx_nss = min(arg->peer_nss, tx_nss);
|
||||
+ arg->peer_bw_rxnss_override = ATH12K_BW_NSS_MAP_ENABLE;
|
||||
+
|
||||
+ if (!rx_nss) {
|
||||
+ ath12k_warn(ar->ab, "invalid max_nss\n");
|
||||
+ return;
|
||||
+ }
|
||||
+
|
||||
+ nss_160 = u32_encode_bits(rx_nss - 1, ATH12K_PEER_RX_NSS_160MHZ);
|
||||
+ arg->peer_bw_rxnss_override |= nss_160;
|
||||
+ }
|
||||
|
||||
- /* TODO: rxnss_override */
|
||||
+ ath12k_dbg(ar->ab, ATH12K_DBG_MAC,
|
||||
+ "mac vht peer %pM max_mpdu %d flags 0x%x nss_override 0x%x\n",
|
||||
+ arsta->addr, arg->peer_max_mpdu, arg->peer_flags,
|
||||
+ arg->peer_bw_rxnss_override);
|
||||
}
|
||||
|
||||
static int ath12k_mac_get_max_he_mcs_map(u16 mcs_map, int nss)
|
||||
@@ -2402,6 +2445,7 @@ static void ath12k_peer_assoc_h_he(struc
|
||||
u16 he_tx_mcs = 0, v = 0;
|
||||
int he_nss, nss_idx;
|
||||
bool user_rate_valid = true;
|
||||
+ u32 rx_nss, tx_nss, nss_160;
|
||||
|
||||
if (WARN_ON(ath12k_mac_vif_link_chan(vif, link_id, &def)))
|
||||
return;
|
||||
@@ -2599,9 +2643,25 @@ static void ath12k_peer_assoc_h_he(struc
|
||||
max_nss = min(max_nss, ar->num_tx_chains);
|
||||
arg->peer_nss = min(link_sta->rx_nss, max_nss);
|
||||
|
||||
+ if (arg->peer_phymode == MODE_11AX_HE160) {
|
||||
+ tx_nss = ath12k_get_nss_160mhz(ar, max_nss);
|
||||
+ rx_nss = min(arg->peer_nss, tx_nss);
|
||||
+ arg->peer_bw_rxnss_override = ATH12K_BW_NSS_MAP_ENABLE;
|
||||
+
|
||||
+ if (!rx_nss) {
|
||||
+ ath12k_warn(ar->ab, "invalid max_nss\n");
|
||||
+ return;
|
||||
+ }
|
||||
+
|
||||
+ nss_160 = u32_encode_bits(rx_nss - 1, ATH12K_PEER_RX_NSS_160MHZ);
|
||||
+ arg->peer_bw_rxnss_override |= nss_160;
|
||||
+ }
|
||||
+
|
||||
ath12k_dbg(ar->ab, ATH12K_DBG_MAC,
|
||||
- "mac he peer %pM nss %d mcs cnt %d\n",
|
||||
- arsta->addr, arg->peer_nss, arg->peer_he_mcs_count);
|
||||
+ "mac he peer %pM nss %d mcs cnt %d nss_override 0x%x\n",
|
||||
+ arsta->addr, arg->peer_nss,
|
||||
+ arg->peer_he_mcs_count,
|
||||
+ arg->peer_bw_rxnss_override);
|
||||
}
|
||||
|
||||
static void ath12k_peer_assoc_h_he_6ghz(struct ath12k *ar,
|
||||
@@ -2842,10 +2902,13 @@ static enum wmi_phy_mode ath12k_mac_get_
|
||||
struct ieee80211_link_sta *link_sta)
|
||||
{
|
||||
if (link_sta->bandwidth == IEEE80211_STA_RX_BW_160) {
|
||||
- if (link_sta->vht_cap.cap & IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_160MHZ)
|
||||
+ if (link_sta->vht_cap.cap & (IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_160MHZ |
|
||||
+ IEEE80211_VHT_CAP_EXT_NSS_BW_MASK))
|
||||
return MODE_11AC_VHT160;
|
||||
|
||||
- /* not sure if this is a valid case? */
|
||||
+ /* Allow STA to connect even if it does not explicitly advertise 160 MHz
|
||||
+ * support
|
||||
+ */
|
||||
return MODE_11AC_VHT160;
|
||||
}
|
||||
|
||||
@@ -7379,10 +7442,8 @@ ath12k_create_vht_cap(struct ath12k *ar,
|
||||
|
||||
ath12k_set_vht_txbf_cap(ar, &vht_cap.cap);
|
||||
|
||||
- /* TODO: Enable back VHT160 mode once association issues are fixed */
|
||||
- /* Disabling VHT160 and VHT80+80 modes */
|
||||
- vht_cap.cap &= ~IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_MASK;
|
||||
- vht_cap.cap &= ~IEEE80211_VHT_CAP_SHORT_GI_160;
|
||||
+ /* 80P80 is not supported */
|
||||
+ vht_cap.cap &= ~IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_160_80PLUS80MHZ;
|
||||
|
||||
rxmcs_map = 0;
|
||||
txmcs_map = 0;
|
||||
@@ -12654,7 +12715,8 @@ ath12k_mac_setup_radio_iface_comb(struct
|
||||
comb[0].radar_detect_widths = BIT(NL80211_CHAN_WIDTH_20_NOHT) |
|
||||
BIT(NL80211_CHAN_WIDTH_20) |
|
||||
BIT(NL80211_CHAN_WIDTH_40) |
|
||||
- BIT(NL80211_CHAN_WIDTH_80);
|
||||
+ BIT(NL80211_CHAN_WIDTH_80) |
|
||||
+ BIT(NL80211_CHAN_WIDTH_160);
|
||||
}
|
||||
|
||||
return 0;
|
||||
@@ -13031,6 +13093,9 @@ static int ath12k_mac_hw_register(struct
|
||||
ieee80211_hw_set(hw, REPORTS_LOW_ACK);
|
||||
ieee80211_hw_set(hw, NO_VIRTUAL_MONITOR);
|
||||
|
||||
+ if (cap->nss_ratio_enabled)
|
||||
+ ieee80211_hw_set(hw, SUPPORTS_VHT_EXT_NSS_BW);
|
||||
+
|
||||
if ((ht_cap & WMI_HT_CAP_ENABLED) || is_6ghz) {
|
||||
ieee80211_hw_set(hw, AMPDU_AGGREGATION);
|
||||
ieee80211_hw_set(hw, TX_AMPDU_SETUP_IN_HW);
|
||||
--- a/drivers/net/wireless/ath/ath12k/mac.h
|
||||
+++ b/drivers/net/wireless/ath/ath12k/mac.h
|
||||
@@ -41,6 +41,8 @@ struct ath12k_generic_iter {
|
||||
#define IEEE80211_DISABLE_VHT_MCS_SUPPORT_0_11 BIT(24)
|
||||
|
||||
#define ATH12K_CHAN_WIDTH_NUM 14
|
||||
+#define ATH12K_BW_NSS_MAP_ENABLE BIT(31)
|
||||
+#define ATH12K_PEER_RX_NSS_160MHZ GENMASK(2, 0)
|
||||
|
||||
#define ATH12K_TX_POWER_MAX_VAL 70
|
||||
#define ATH12K_TX_POWER_MIN_VAL 0
|
||||
--- a/drivers/net/wireless/ath/ath12k/wmi.c
|
||||
+++ b/drivers/net/wireless/ath/ath12k/wmi.c
|
||||
@@ -537,6 +537,10 @@ ath12k_pull_mac_phy_cap_svc_ready_ext(st
|
||||
pdev_cap->he_mcs = le32_to_cpu(mac_caps->he_supp_mcs_5g);
|
||||
pdev_cap->tx_chain_mask = le32_to_cpu(mac_caps->tx_chain_mask_5g);
|
||||
pdev_cap->rx_chain_mask = le32_to_cpu(mac_caps->rx_chain_mask_5g);
|
||||
+ pdev_cap->nss_ratio_enabled =
|
||||
+ WMI_NSS_RATIO_EN_DIS_GET(mac_caps->nss_ratio);
|
||||
+ pdev_cap->nss_ratio_info =
|
||||
+ WMI_NSS_RATIO_INFO_GET(mac_caps->nss_ratio);
|
||||
} else {
|
||||
return -EINVAL;
|
||||
}
|
||||
@@ -1059,7 +1063,8 @@ static void ath12k_wmi_put_wmi_channel(s
|
||||
|
||||
chan->band_center_freq2 = cpu_to_le32(center_freq1);
|
||||
|
||||
- } else if (arg->mode == MODE_11BE_EHT160) {
|
||||
+ } else if (arg->mode == MODE_11BE_EHT160 ||
|
||||
+ arg->mode == MODE_11AX_HE160) {
|
||||
if (arg->freq > center_freq1)
|
||||
chan->band_center_freq1 = cpu_to_le32(center_freq1 + 40);
|
||||
else
|
||||
--- a/drivers/net/wireless/ath/ath12k/wmi.h
|
||||
+++ b/drivers/net/wireless/ath/ath12k/wmi.h
|
||||
@@ -2328,6 +2328,21 @@ enum wmi_direct_buffer_module {
|
||||
WMI_DIRECT_BUF_MAX
|
||||
};
|
||||
|
||||
+/**
|
||||
+ * enum wmi_nss_ratio - NSS ratio received from FW during service ready ext event
|
||||
+ * @WMI_NSS_RATIO_1BY2_NSS: Max nss of 160MHz is equals to half of the max nss of 80MHz
|
||||
+ * @WMI_NSS_RATIO_3BY4_NSS: Max nss of 160MHz is equals to 3/4 of the max nss of 80MHz
|
||||
+ * @WMI_NSS_RATIO_1_NSS: Max nss of 160MHz is equals to the max nss of 80MHz
|
||||
+ * @WMI_NSS_RATIO_2_NSS: Max nss of 160MHz is equals to two times the max nss of 80MHz
|
||||
+ */
|
||||
+
|
||||
+enum wmi_nss_ratio {
|
||||
+ WMI_NSS_RATIO_1BY2_NSS,
|
||||
+ WMI_NSS_RATIO_3BY4_NSS,
|
||||
+ WMI_NSS_RATIO_1_NSS,
|
||||
+ WMI_NSS_RATIO_2_NSS
|
||||
+};
|
||||
+
|
||||
struct ath12k_wmi_pdev_band_arg {
|
||||
u32 pdev_id;
|
||||
u32 start_freq;
|
||||
@@ -2647,6 +2662,12 @@ struct ath12k_wmi_hw_mode_cap_params {
|
||||
} __packed;
|
||||
|
||||
#define WMI_MAX_HECAP_PHY_SIZE (3)
|
||||
+#define WMI_NSS_RATIO_EN_DIS_BITPOS BIT(0)
|
||||
+#define WMI_NSS_RATIO_EN_DIS_GET(_val) \
|
||||
+ le32_get_bits(_val, WMI_NSS_RATIO_EN_DIS_BITPOS)
|
||||
+#define WMI_NSS_RATIO_INFO_BITPOS GENMASK(4, 1)
|
||||
+#define WMI_NSS_RATIO_INFO_GET(_val) \
|
||||
+ le32_get_bits(_val, WMI_NSS_RATIO_INFO_BITPOS)
|
||||
|
||||
/* pdev_id is present in lower 16 bits of pdev_and_hw_link_ids in
|
||||
* ath12k_wmi_mac_phy_caps_params & ath12k_wmi_caps_ext_params.
|
||||
@@ -0,0 +1,202 @@
|
||||
From patchwork Wed May 21 22:45:39 2025
|
||||
Content-Type: text/plain; charset="utf-8"
|
||||
MIME-Version: 1.0
|
||||
Content-Transfer-Encoding: 7bit
|
||||
X-Patchwork-Submitter: Pradeep Kumar Chitrapu <quic_pradeepc@quicinc.com>
|
||||
X-Patchwork-Id: 14096122
|
||||
X-Patchwork-Delegate: quic_jjohnson@quicinc.com
|
||||
Received: from mx0b-0031df01.pphosted.com (mx0b-0031df01.pphosted.com
|
||||
[205.220.180.131])
|
||||
(using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits))
|
||||
(No client certificate requested)
|
||||
by smtp.subspace.kernel.org (Postfix) with ESMTPS id 9A1E9239E85
|
||||
for <linux-wireless@vger.kernel.org>; Wed, 21 May 2025 22:45:59 +0000 (UTC)
|
||||
Authentication-Results: smtp.subspace.kernel.org;
|
||||
arc=none smtp.client-ip=205.220.180.131
|
||||
ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116;
|
||||
t=1747867561; cv=none;
|
||||
b=YNQGoLeTsEUX0an1dYT8uFrTBxczoxLPoB0nXP+MEP3YMcemaxVf4zoi5GMSuKPLe4yeLz/R7AB090SrXrBTbY6MmwXLrUJGFBQUGwr05KQ5BnedSLyVE+PtNo01ZVjrjprsc5LC4z0vYHmQdBsqIfqP+bb+ATVkdkkKWV4Kg3A=
|
||||
ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org;
|
||||
s=arc-20240116; t=1747867561; c=relaxed/simple;
|
||||
bh=WkoD1wqfpiPds2ZNAwn7TY38LnC6cJOAuobqk3tWbSk=;
|
||||
h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References:
|
||||
MIME-Version:Content-Type;
|
||||
b=aAO1mDb/PrwqKRHoeS0PAxgJAvDLPWPPBkzRX0hwJbFzcXtKdtWHDE83rjGbjR1bnM7lhkAU4SwoT87sOuciveNqdywUe6+9XTB2oWM/j0Tza/ZRKKRZFeByh7ib8Aibzc4y0ACg7Oaz/QhmWmPObPjc4oKuVzaH/P8Tub0rBcI=
|
||||
ARC-Authentication-Results: i=1; smtp.subspace.kernel.org;
|
||||
dmarc=pass (p=none dis=none) header.from=quicinc.com;
|
||||
spf=pass smtp.mailfrom=quicinc.com;
|
||||
dkim=pass (2048-bit key) header.d=quicinc.com header.i=@quicinc.com
|
||||
header.b=o3M+Sjyr; arc=none smtp.client-ip=205.220.180.131
|
||||
Authentication-Results: smtp.subspace.kernel.org;
|
||||
dmarc=pass (p=none dis=none) header.from=quicinc.com
|
||||
Authentication-Results: smtp.subspace.kernel.org;
|
||||
spf=pass smtp.mailfrom=quicinc.com
|
||||
Authentication-Results: smtp.subspace.kernel.org;
|
||||
dkim=pass (2048-bit key) header.d=quicinc.com header.i=@quicinc.com
|
||||
header.b="o3M+Sjyr"
|
||||
Received: from pps.filterd (m0279871.ppops.net [127.0.0.1])
|
||||
by mx0a-0031df01.pphosted.com (8.18.1.2/8.18.1.2) with ESMTP id
|
||||
54LJHZNq001758;
|
||||
Wed, 21 May 2025 22:45:56 GMT
|
||||
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=quicinc.com; h=
|
||||
cc:content-transfer-encoding:content-type:date:from:in-reply-to
|
||||
:message-id:mime-version:references:subject:to; s=qcppdkim1; bh=
|
||||
wh8AVrVaz3Wne8xUCnRodQGPYbrNE8Rm9/NepU3KoQA=; b=o3M+SjyriKBrU+dH
|
||||
+Uwb/f5RzskxDlOAgOvwNH7O5p766ueJYE/nAazyAuVI1fbDT1gkgvOM4VOLQAPP
|
||||
zg9tDUD5Mz80GzBzSnheYbeedz7RgpaN14Qr6Gz/+1yrP4wWTh2quGduIAXBFDZR
|
||||
QpWsQh2DxVOvXqoLRm64iurJNhvpq+YIAwpAxEA9Fp46SrXsFefc82nza6qgdk5P
|
||||
pUjalFWnwLLxaSHJj2EoJhFDAf99q9N5KNKW/UCNY8A2CwQXqL9KmggTLRK1OC+S
|
||||
ueHigeV9ydoGGD1W6zmEdydGv5JSaQRhjAxtJokUtrlUwn8mbpJyokm+Ie4GZV5v
|
||||
tie1qQ==
|
||||
Received: from nalasppmta04.qualcomm.com (Global_NAT1.qualcomm.com
|
||||
[129.46.96.20])
|
||||
by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 46rwf6vbsg-1
|
||||
(version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT);
|
||||
Wed, 21 May 2025 22:45:56 +0000 (GMT)
|
||||
Received: from nalasex01a.na.qualcomm.com (nalasex01a.na.qualcomm.com
|
||||
[10.47.209.196])
|
||||
by NALASPPMTA04.qualcomm.com (8.18.1.2/8.18.1.2) with ESMTPS id
|
||||
54LMjtcB022245
|
||||
(version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT);
|
||||
Wed, 21 May 2025 22:45:55 GMT
|
||||
Received: from ath12k-linux2.qualcomm.com (10.80.80.8) by
|
||||
nalasex01a.na.qualcomm.com (10.47.209.196) with Microsoft SMTP Server
|
||||
(version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id
|
||||
15.2.1544.9; Wed, 21 May 2025 15:45:54 -0700
|
||||
From: Pradeep Kumar Chitrapu <quic_pradeepc@quicinc.com>
|
||||
To: <ath12k@lists.infradead.org>
|
||||
CC: <linux-wireless@vger.kernel.org>,
|
||||
Pradeep Kumar Chitrapu
|
||||
<quic_pradeepc@quicinc.com>,
|
||||
Jeff Johnson <quic_jjohnson@quicinc.com>
|
||||
Subject: [PATCH ath-next V14 9/9] wifi: ath12k: add extended NSS bandwidth
|
||||
support for 160 MHz
|
||||
Date: Wed, 21 May 2025 15:45:39 -0700
|
||||
Message-ID: <20250521224539.355985-10-quic_pradeepc@quicinc.com>
|
||||
X-Mailer: git-send-email 2.43.0
|
||||
In-Reply-To: <20250521224539.355985-1-quic_pradeepc@quicinc.com>
|
||||
References: <20250521224539.355985-1-quic_pradeepc@quicinc.com>
|
||||
Precedence: bulk
|
||||
X-Mailing-List: linux-wireless@vger.kernel.org
|
||||
List-Id: <linux-wireless.vger.kernel.org>
|
||||
List-Subscribe: <mailto:linux-wireless+subscribe@vger.kernel.org>
|
||||
List-Unsubscribe: <mailto:linux-wireless+unsubscribe@vger.kernel.org>
|
||||
MIME-Version: 1.0
|
||||
X-ClientProxiedBy: nasanex01a.na.qualcomm.com (10.52.223.231) To
|
||||
nalasex01a.na.qualcomm.com (10.47.209.196)
|
||||
X-QCInternal: smtphost
|
||||
X-Proofpoint-Virus-Version: vendor=nai engine=6200 definitions=5800
|
||||
signatures=585085
|
||||
X-Proofpoint-GUID: 3XlPaBNySyE2wx5TC6p1DVWVXzadsV9U
|
||||
X-Proofpoint-Spam-Details-Enc: AW1haW4tMjUwNTIxMDIyNiBTYWx0ZWRfX4g8vKznbpwuH
|
||||
ZKoHe/eZESaXJ/nU0MF27s2mZH9kbhxkG1nYDBAxgIAR6HSB4Ir8V8BP9wvETNPaaV4xpgjbT6m
|
||||
sDGIplm3HpwbpmQYiBtQIsOrs/s1B2t7uVdhqW02FHlFu/UIBLwZc7J8sLJcsYdxHYcx7MQ3nEe
|
||||
tDoPrPTEwHw7n1CnzcfVsEUAuxuJ5iFaxBATgZF+LuAhijNvhyaoEWRUO2KUcBJaFHq/QbCYfpY
|
||||
JBXWUNl+mlZxfQe4pogCpRmvEOONRvpKgZLFdEAxf2Fx0Z7OhaIV84gi99TYTjfe1aihjorJ/cp
|
||||
cv78Jzcd3Pe3GwTFD0ZOqI30oSiaUyJS3E9XIjfDGLAVMK6FeM+KOYgnqo95ImgBH8HRshrA4LJ
|
||||
qTKv2kKP1y4zPtpf7lmI2mcl7emiLGQx+t0d7Z8upCbYseoNAGHUkFJ45HF940Za9ZkEYTRq
|
||||
X-Authority-Analysis: v=2.4 cv=fZOty1QF c=1 sm=1 tr=0 ts=682e57a4 cx=c_pps
|
||||
a=ouPCqIW2jiPt+lZRy3xVPw==:117 a=ouPCqIW2jiPt+lZRy3xVPw==:17
|
||||
a=GEpy-HfZoHoA:10 a=dt9VzEwgFbYA:10 a=COk6AnOGAAAA:8 a=Opr4SxZhII4Vei-TI5AA:9
|
||||
a=TjNXssC_j7lpFel5tvFf:22
|
||||
X-Proofpoint-ORIG-GUID: 3XlPaBNySyE2wx5TC6p1DVWVXzadsV9U
|
||||
X-Proofpoint-Virus-Version: vendor=baseguard
|
||||
engine=ICAP:2.0.293,Aquarius:18.0.1099,Hydra:6.0.736,FMLib:17.12.80.40
|
||||
definitions=2025-05-21_07,2025-05-20_03,2025-03-28_01
|
||||
X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0
|
||||
clxscore=1015 mlxscore=0 adultscore=0 spamscore=0 bulkscore=0 suspectscore=0
|
||||
malwarescore=0 priorityscore=1501 impostorscore=0 mlxlogscore=999
|
||||
lowpriorityscore=0 phishscore=0 classifier=spam authscore=0 authtc=n/a
|
||||
authcc= route=outbound adjust=0 reason=mlx scancount=1
|
||||
engine=8.19.0-2505160000 definitions=main-2505210226
|
||||
|
||||
Currently rx and tx MCS map for 160 MHz under HE capabilities
|
||||
are not updating properly, when 160 MHz is configured with NSS
|
||||
lesser than max NSS support. Fix this by utilizing
|
||||
nss_ratio_enabled and nss_ratio_info fields sent by firmware
|
||||
in service ready event.
|
||||
|
||||
However, if firmware advertises EXT NSS BW support in VHT caps
|
||||
as 1(1x2) and when nss_ratio_info indicates 1:1, reset the EXT
|
||||
NSS BW Support in VHT caps to 0 which indicates 1x1. This is
|
||||
to avoid incorrectly choosing 1:2 NSS ratio when using the
|
||||
default VHT caps advertised by firmware.
|
||||
|
||||
Tested-on: QCN9274 hw2.0 PCI WLAN.WBE.1.0.1-00029-QCAHKSWPL_SILICONZ-1
|
||||
|
||||
Signed-off-by: Pradeep Kumar Chitrapu <quic_pradeepc@quicinc.com>
|
||||
Acked-by: Jeff Johnson <quic_jjohnson@quicinc.com>
|
||||
---
|
||||
drivers/net/wireless/ath/ath12k/mac.c | 33 ++++++++++++++++++++++-----
|
||||
1 file changed, 27 insertions(+), 6 deletions(-)
|
||||
|
||||
--- a/drivers/net/wireless/ath/ath12k/mac.c
|
||||
+++ b/drivers/net/wireless/ath/ath12k/mac.c
|
||||
@@ -2644,8 +2644,10 @@ static void ath12k_peer_assoc_h_he(struc
|
||||
arg->peer_nss = min(link_sta->rx_nss, max_nss);
|
||||
|
||||
if (arg->peer_phymode == MODE_11AX_HE160) {
|
||||
- tx_nss = ath12k_get_nss_160mhz(ar, max_nss);
|
||||
+ tx_nss = ath12k_get_nss_160mhz(ar, ar->num_tx_chains);
|
||||
rx_nss = min(arg->peer_nss, tx_nss);
|
||||
+
|
||||
+ arg->peer_nss = min(link_sta->rx_nss, ar->num_rx_chains);
|
||||
arg->peer_bw_rxnss_override = ATH12K_BW_NSS_MAP_ENABLE;
|
||||
|
||||
if (!rx_nss) {
|
||||
@@ -7465,6 +7467,12 @@ ath12k_create_vht_cap(struct ath12k *ar,
|
||||
vht_cap.vht_mcs.rx_mcs_map = cpu_to_le16(rxmcs_map);
|
||||
vht_cap.vht_mcs.tx_mcs_map = cpu_to_le16(txmcs_map);
|
||||
|
||||
+ /* Check if the HW supports 1:1 NSS ratio and reset
|
||||
+ * EXT NSS BW Support field to 0 to indicate 1:1 ratio
|
||||
+ */
|
||||
+ if (ar->pdev->cap.nss_ratio_info == WMI_NSS_RATIO_1_NSS)
|
||||
+ vht_cap.cap &= ~IEEE80211_VHT_CAP_EXT_NSS_BW_MASK;
|
||||
+
|
||||
return vht_cap;
|
||||
}
|
||||
|
||||
@@ -7645,11 +7653,12 @@ static void ath12k_mac_set_hemcsmap(stru
|
||||
struct ieee80211_sta_he_cap *he_cap)
|
||||
{
|
||||
struct ieee80211_he_mcs_nss_supp *mcs_nss = &he_cap->he_mcs_nss_supp;
|
||||
- u16 txmcs_map, rxmcs_map;
|
||||
+ u8 maxtxnss_160 = ath12k_get_nss_160mhz(ar, ar->num_tx_chains);
|
||||
+ u8 maxrxnss_160 = ath12k_get_nss_160mhz(ar, ar->num_rx_chains);
|
||||
+ u16 txmcs_map_160 = 0, rxmcs_map_160 = 0;
|
||||
+ u16 txmcs_map = 0, rxmcs_map = 0;
|
||||
u32 i;
|
||||
|
||||
- rxmcs_map = 0;
|
||||
- txmcs_map = 0;
|
||||
for (i = 0; i < 8; i++) {
|
||||
if (i < ar->num_tx_chains &&
|
||||
(ar->cfg_tx_chainmask >> cap->tx_chain_mask_shift) & BIT(i))
|
||||
@@ -7662,12 +7671,24 @@ static void ath12k_mac_set_hemcsmap(stru
|
||||
rxmcs_map |= IEEE80211_HE_MCS_SUPPORT_0_11 << (i * 2);
|
||||
else
|
||||
rxmcs_map |= IEEE80211_HE_MCS_NOT_SUPPORTED << (i * 2);
|
||||
+
|
||||
+ if (i < maxtxnss_160 &&
|
||||
+ (ar->cfg_tx_chainmask >> cap->tx_chain_mask_shift) & BIT(i))
|
||||
+ txmcs_map_160 |= IEEE80211_HE_MCS_SUPPORT_0_11 << (i * 2);
|
||||
+ else
|
||||
+ txmcs_map_160 |= IEEE80211_HE_MCS_NOT_SUPPORTED << (i * 2);
|
||||
+
|
||||
+ if (i < maxrxnss_160 &&
|
||||
+ (ar->cfg_tx_chainmask >> cap->tx_chain_mask_shift) & BIT(i))
|
||||
+ rxmcs_map_160 |= IEEE80211_HE_MCS_SUPPORT_0_11 << (i * 2);
|
||||
+ else
|
||||
+ rxmcs_map_160 |= IEEE80211_HE_MCS_NOT_SUPPORTED << (i * 2);
|
||||
}
|
||||
|
||||
mcs_nss->rx_mcs_80 = cpu_to_le16(rxmcs_map & 0xffff);
|
||||
mcs_nss->tx_mcs_80 = cpu_to_le16(txmcs_map & 0xffff);
|
||||
- mcs_nss->rx_mcs_160 = cpu_to_le16(rxmcs_map & 0xffff);
|
||||
- mcs_nss->tx_mcs_160 = cpu_to_le16(txmcs_map & 0xffff);
|
||||
+ mcs_nss->rx_mcs_160 = cpu_to_le16(rxmcs_map_160 & 0xffff);
|
||||
+ mcs_nss->tx_mcs_160 = cpu_to_le16(txmcs_map_160 & 0xffff);
|
||||
}
|
||||
|
||||
static void ath12k_mac_copy_he_cap(struct ath12k *ar,
|
||||
@@ -0,0 +1,82 @@
|
||||
From cd911185014f773f0e227cabfb760b30968c3bca Mon Sep 17 00:00:00 2001
|
||||
From: Mantas Pucka <mantas@8devices.com>
|
||||
Date: Tue, 27 May 2025 14:13:27 +0300
|
||||
Subject: [PATCH] Revert "wifi: ath12k: convert tasklet to BH workqueue for CE
|
||||
interrupts"
|
||||
|
||||
This reverts commit cdad737160571a98cc4933a62c9f2728e965ab27.
|
||||
---
|
||||
drivers/net/wireless/ath/ath12k/ce.h | 2 +-
|
||||
drivers/net/wireless/ath/ath12k/pci.c | 14 +++++++-------
|
||||
2 files changed, 8 insertions(+), 8 deletions(-)
|
||||
|
||||
--- a/drivers/net/wireless/ath/ath12k/ce.h
|
||||
+++ b/drivers/net/wireless/ath/ath12k/ce.h
|
||||
@@ -159,7 +159,7 @@ struct ath12k_ce_pipe {
|
||||
void (*send_cb)(struct ath12k_ce_pipe *pipe);
|
||||
void (*recv_cb)(struct ath12k_base *ab, struct sk_buff *skb);
|
||||
|
||||
- struct work_struct intr_wq;
|
||||
+ struct tasklet_struct intr_tq;
|
||||
struct ath12k_ce_ring *src_ring;
|
||||
struct ath12k_ce_ring *dest_ring;
|
||||
struct ath12k_ce_ring *status_ring;
|
||||
--- a/drivers/net/wireless/ath/ath12k/pci.c
|
||||
+++ b/drivers/net/wireless/ath/ath12k/pci.c
|
||||
@@ -430,9 +430,9 @@ static void ath12k_pci_sync_ce_irqs(stru
|
||||
}
|
||||
}
|
||||
|
||||
-static void ath12k_pci_ce_workqueue(struct work_struct *work)
|
||||
+static void ath12k_pci_ce_tasklet(struct tasklet_struct *t)
|
||||
{
|
||||
- struct ath12k_ce_pipe *ce_pipe = from_work(ce_pipe, work, intr_wq);
|
||||
+ struct ath12k_ce_pipe *ce_pipe = from_tasklet(ce_pipe, t, intr_tq);
|
||||
int irq_idx = ATH12K_PCI_IRQ_CE0_OFFSET + ce_pipe->pipe_num;
|
||||
|
||||
ath12k_ce_per_engine_service(ce_pipe->ab, ce_pipe->pipe_num);
|
||||
@@ -454,7 +454,7 @@ static irqreturn_t ath12k_pci_ce_interru
|
||||
|
||||
disable_irq_nosync(ab->irq_num[irq_idx]);
|
||||
|
||||
- queue_work(system_bh_wq, &ce_pipe->intr_wq);
|
||||
+ tasklet_schedule(&ce_pipe->intr_tq);
|
||||
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
@@ -684,7 +684,7 @@ static int ath12k_pci_config_irq(struct
|
||||
|
||||
irq_idx = ATH12K_PCI_IRQ_CE0_OFFSET + i;
|
||||
|
||||
- INIT_WORK(&ce_pipe->intr_wq, ath12k_pci_ce_workqueue);
|
||||
+ tasklet_setup(&ce_pipe->intr_tq, ath12k_pci_ce_tasklet);
|
||||
|
||||
ret = request_irq(irq, ath12k_pci_ce_interrupt_handler,
|
||||
ab_pci->irq_flags, irq_name[irq_idx],
|
||||
@@ -967,7 +967,7 @@ static void ath12k_pci_aspm_restore(stru
|
||||
PCI_EXP_LNKCTL_ASPMC);
|
||||
}
|
||||
|
||||
-static void ath12k_pci_cancel_workqueue(struct ath12k_base *ab)
|
||||
+static void ath12k_pci_kill_tasklets(struct ath12k_base *ab)
|
||||
{
|
||||
int i;
|
||||
|
||||
@@ -977,7 +977,7 @@ static void ath12k_pci_cancel_workqueue(
|
||||
if (ath12k_ce_get_attr_flags(ab, i) & CE_ATTR_DIS_INTR)
|
||||
continue;
|
||||
|
||||
- cancel_work_sync(&ce_pipe->intr_wq);
|
||||
+ tasklet_kill(&ce_pipe->intr_tq);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -985,7 +985,7 @@ static void ath12k_pci_ce_irq_disable_sy
|
||||
{
|
||||
ath12k_pci_ce_irqs_disable(ab);
|
||||
ath12k_pci_sync_ce_irqs(ab);
|
||||
- ath12k_pci_cancel_workqueue(ab);
|
||||
+ ath12k_pci_kill_tasklets(ab);
|
||||
}
|
||||
|
||||
int ath12k_pci_map_service_to_pipe(struct ath12k_base *ab, u16 service_id,
|
||||
38
patches/ath5k/201-ath5k-WAR-for-AR71xx-PCI-bug.patch
Normal file
38
patches/ath5k/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
|
||||
@@ -854,10 +854,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*/
|
||||
46
patches/ath5k/411-ath5k_allow_adhoc_and_ap.patch
Normal file
46
patches/ath5k/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
|
||||
@@ -2009,7 +2009,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);
|
||||
@@ -2095,7 +2095,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",
|
||||
@@ -2561,6 +2561,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
patches/ath5k/420-ath5k_disable_fast_cc.patch
Normal file
18
patches/ath5k/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
patches/ath5k/430-add_ath5k_platform.patch
Normal file
33
patches/ath5k/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 */
|
||||
142
patches/ath5k/440-ath5k_channel_bw_debugfs.patch
Normal file
142
patches/ath5k/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
|
||||
@@ -803,6 +803,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 */
|
||||
|
||||
@@ -995,6 +1086,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
|
||||
@@ -465,6 +465,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
|
||||
273
patches/ath9k/341-wifi-ath9k-obtain-system-gpios.patch
Normal file
273
patches/ath9k/341-wifi-ath9k-obtain-system-gpios.patch
Normal file
@@ -0,0 +1,273 @@
|
||||
From patchwork Tue Apr 23 12:12:33 2024
|
||||
Content-Type: text/plain; charset="utf-8"
|
||||
MIME-Version: 1.0
|
||||
Content-Transfer-Encoding: 7bit
|
||||
X-Patchwork-Submitter: Linus Walleij <linus.walleij@linaro.org>
|
||||
X-Patchwork-Id: 1926515
|
||||
Return-Path:
|
||||
<linux-gpio+bounces-5755-incoming=patchwork.ozlabs.org@vger.kernel.org>
|
||||
X-Original-To: incoming@patchwork.ozlabs.org
|
||||
Delivered-To: patchwork-incoming@legolas.ozlabs.org
|
||||
Authentication-Results: legolas.ozlabs.org;
|
||||
dkim=pass (2048-bit key;
|
||||
unprotected) header.d=linaro.org header.i=@linaro.org header.a=rsa-sha256
|
||||
header.s=google header.b=qX99TQMM;
|
||||
dkim-atps=neutral
|
||||
Authentication-Results: legolas.ozlabs.org;
|
||||
spf=pass (sender SPF authorized) smtp.mailfrom=vger.kernel.org
|
||||
(client-ip=2604:1380:45e3:2400::1; helo=sv.mirrors.kernel.org;
|
||||
envelope-from=linux-gpio+bounces-5755-incoming=patchwork.ozlabs.org@vger.kernel.org;
|
||||
receiver=patchwork.ozlabs.org)
|
||||
Received: from sv.mirrors.kernel.org (sv.mirrors.kernel.org
|
||||
[IPv6:2604:1380:45e3:2400::1])
|
||||
(using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)
|
||||
key-exchange X25519 server-signature ECDSA (secp384r1))
|
||||
(No client certificate requested)
|
||||
by legolas.ozlabs.org (Postfix) with ESMTPS id 4VP1Gc6RZKz1yZP
|
||||
for <incoming@patchwork.ozlabs.org>; Tue, 23 Apr 2024 22:12:56 +1000 (AEST)
|
||||
Received: from smtp.subspace.kernel.org (wormhole.subspace.kernel.org
|
||||
[52.25.139.140])
|
||||
(using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits))
|
||||
(No client certificate requested)
|
||||
by sv.mirrors.kernel.org (Postfix) with ESMTPS id 5BB9C28522A
|
||||
for <incoming@patchwork.ozlabs.org>; Tue, 23 Apr 2024 12:12:55 +0000 (UTC)
|
||||
Received: from localhost.localdomain (localhost.localdomain [127.0.0.1])
|
||||
by smtp.subspace.kernel.org (Postfix) with ESMTP id 2F83B8563D;
|
||||
Tue, 23 Apr 2024 12:12:41 +0000 (UTC)
|
||||
Authentication-Results: smtp.subspace.kernel.org;
|
||||
dkim=pass (2048-bit key) header.d=linaro.org header.i=@linaro.org
|
||||
header.b="qX99TQMM"
|
||||
X-Original-To: linux-gpio@vger.kernel.org
|
||||
Received: from mail-lj1-f179.google.com (mail-lj1-f179.google.com
|
||||
[209.85.208.179])
|
||||
(using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits))
|
||||
(No client certificate requested)
|
||||
by smtp.subspace.kernel.org (Postfix) with ESMTPS id A8F3C82865
|
||||
for <linux-gpio@vger.kernel.org>; Tue, 23 Apr 2024 12:12:37 +0000 (UTC)
|
||||
Authentication-Results: smtp.subspace.kernel.org;
|
||||
arc=none smtp.client-ip=209.85.208.179
|
||||
ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116;
|
||||
t=1713874361; cv=none;
|
||||
b=d6RcvcAu8hBYAK8Io489ZHQpJVXPwuokP6iMcAkbvElCerbXD6jAdqdi+RjDlo5C49GHGO4FQ19UwQn/VE//qSwiK1ulTSBp3OkvAmyb7yYAFnDs9AVNWRw+5/NxeFNn3fj5PyvqVymIbaJKabfrOVNwkz/5JMHxEIJtr6Crmog=
|
||||
ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org;
|
||||
s=arc-20240116; t=1713874361; c=relaxed/simple;
|
||||
bh=0eXJ5AIjzz1TBGZ8SlshIPrEHZaZwZfYEdof+dSpu4Y=;
|
||||
h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:To:Cc;
|
||||
b=EfFtruUxRIGy+jylEiJ2rPEyPCjGCc8ptT9FVxe6s0O/kW38Y6196xVQeiSV2tSKVCEOIO+9HoqmpgdKsJE7gU9++EcrasP96MYpsklYpc2zsWW3b8QEhfxfZ9Ai/idyYihE2u9dQ7a143P/Ij/twDrZTt24wO/mtHDrE5XcCFI=
|
||||
ARC-Authentication-Results: i=1; smtp.subspace.kernel.org;
|
||||
dmarc=pass (p=none dis=none) header.from=linaro.org;
|
||||
spf=pass smtp.mailfrom=linaro.org;
|
||||
dkim=pass (2048-bit key) header.d=linaro.org header.i=@linaro.org
|
||||
header.b=qX99TQMM; arc=none smtp.client-ip=209.85.208.179
|
||||
Authentication-Results: smtp.subspace.kernel.org;
|
||||
dmarc=pass (p=none dis=none) header.from=linaro.org
|
||||
Authentication-Results: smtp.subspace.kernel.org;
|
||||
spf=pass smtp.mailfrom=linaro.org
|
||||
Received: by mail-lj1-f179.google.com with SMTP id
|
||||
38308e7fff4ca-2dd041acff1so40839131fa.1
|
||||
for <linux-gpio@vger.kernel.org>;
|
||||
Tue, 23 Apr 2024 05:12:37 -0700 (PDT)
|
||||
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
|
||||
d=linaro.org; s=google; t=1713874356; x=1714479156;
|
||||
darn=vger.kernel.org;
|
||||
h=cc:to:message-id:content-transfer-encoding:mime-version:subject
|
||||
:date:from:from:to:cc:subject:date:message-id:reply-to;
|
||||
bh=vysJsMiH5IVqdTs4yMwZxZ7nUmt2aG7eBhkn8qm8hvI=;
|
||||
b=qX99TQMMdHbskFYUaw8c93sIJsUhKmj/WPdyahHcupUhwn5wol4aVoPczkOKYwJZhE
|
||||
eoInxzjAHIl3UNKyvPPrD4MrbLcSoFT6mTFMsgRQYUghsLattmGcqIebu9XT556dBhsf
|
||||
DydmpqGgnTOIa+IEknFxg24mo8Xn2LVmDC7LSGEYykUy1xLHd1NSq56YEaYXC7641xeZ
|
||||
9TOL0rZszeGld5cCS3013EmEeXQGCC3lAP83Eb48vbFXjPojkN0s40rZ2s8YpVsGT0iP
|
||||
LeLVtP/E8XJqi4YipKryKSgbgOvQ1Bclle5+s+2qcJQNnSEjekMwR59BIRs3OZH2SRfN
|
||||
gQdQ==
|
||||
X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
|
||||
d=1e100.net; s=20230601; t=1713874356; x=1714479156;
|
||||
h=cc:to:message-id:content-transfer-encoding:mime-version:subject
|
||||
:date:from:x-gm-message-state:from:to:cc:subject:date:message-id
|
||||
:reply-to;
|
||||
bh=vysJsMiH5IVqdTs4yMwZxZ7nUmt2aG7eBhkn8qm8hvI=;
|
||||
b=jEBH4NQ7SzFi2tnb1lgL06IchnBJoscNgKesjlorvou6X/9wDE/VbgxNFKR0zWwdTk
|
||||
BEjG/ifFJxLmM9jdaCKu5cJc4yiDNXp7yZd48D71V34zJ4aINAGAx4hcOKqf95neFknx
|
||||
nsFPpBFnTYFEpCLF0TebVoL6h6ehPzSojmkArzsrMppNvW2cwJ5gDlkqy2y4SezLanmM
|
||||
6iU0ksnwE0bb2iLkahhgo00Ejt33yqxwa+3xBfhOe9oYKSSZYnY7qVq055SSwt9IAq+H
|
||||
REGyJN+GrvupTHagiioYe3LPXDPdOui9ZixXXDllw1t1yGUy+TkJu8xSqtvHEfg81FHP
|
||||
AxtA==
|
||||
X-Forwarded-Encrypted: i=1;
|
||||
AJvYcCUbxzPklfPYrLgyY1I0ycuj7Dh04dcGVonYocA2mzxzlAEV107o0ELlFqr3O9Td+tV/t0eV9ly9YAbTY6n1XPnFXS5dsYYAZw6RHw==
|
||||
X-Gm-Message-State: AOJu0YxsC7zdakTzntbiRFnN2A7yTrR0x+IpR6ce6eGn5kHeqIBi1km+
|
||||
zTVpRulbch3JsmzVDbCbbAAYoBkNgEA568YL6zdjVARnvFwNz1cqatOrR1AXUm0=
|
||||
X-Google-Smtp-Source:
|
||||
AGHT+IHBRMGvaJM98f86Z6m/RfVhK2XejjNGF3EvcRq/4x3oGM0DKpd2PbeCJdgmzHjLPVVbdsNzJg==
|
||||
X-Received: by 2002:a2e:9852:0:b0:2d8:a98d:18e with SMTP id
|
||||
e18-20020a2e9852000000b002d8a98d018emr7955886ljj.8.1713874355700;
|
||||
Tue, 23 Apr 2024 05:12:35 -0700 (PDT)
|
||||
Received: from [192.168.1.140] ([85.235.12.238])
|
||||
by smtp.gmail.com with ESMTPSA id
|
||||
x6-20020a2e7c06000000b002da179d8d25sm1628982ljc.64.2024.04.23.05.12.33
|
||||
(version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256);
|
||||
Tue, 23 Apr 2024 05:12:35 -0700 (PDT)
|
||||
From: Linus Walleij <linus.walleij@linaro.org>
|
||||
Date: Tue, 23 Apr 2024 14:12:33 +0200
|
||||
Subject: [PATCH v2] wifi: ath9k: Obtain system GPIOS from descriptors
|
||||
Precedence: bulk
|
||||
X-Mailing-List: linux-gpio@vger.kernel.org
|
||||
List-Id: <linux-gpio.vger.kernel.org>
|
||||
List-Subscribe: <mailto:linux-gpio+subscribe@vger.kernel.org>
|
||||
List-Unsubscribe: <mailto:linux-gpio+unsubscribe@vger.kernel.org>
|
||||
MIME-Version: 1.0
|
||||
Message-Id: <20240423-descriptors-wireless-v2-1-6d1d03b30bfa@linaro.org>
|
||||
X-B4-Tracking: v=1; b=H4sIALClJ2YC/22Nyw6CMBBFf4XM2hpanrLyPwyL0o4wCaFkxqCG9
|
||||
N+txKXLc5Nz7g6CTCjQZTswbiQUlgTmlIGb7DKiIp8YTG7KXBujPIpjWh+BRT2JcUYRNbTeXir
|
||||
v7FBUkNSV8U6vI3vrE08kSXgfL5v+rr9gof8HN61yhdo1rvJ125T1dabFcjgHHqGPMX4Ao4iiN
|
||||
LkAAAA=
|
||||
To: Kalle Valo <kvalo@kernel.org>,
|
||||
Andy Shevchenko <andriy.shevchenko@linux.intel.com>,
|
||||
Arnd Bergmann <arnd@arndb.de>, Alban Bedel <albeu@free.fr>,
|
||||
Bartosz Golaszewski <brgl@bgdev.pl>, =?utf-8?q?Toke_H=C3=B8iland-J=C3=B8rg?=
|
||||
=?utf-8?q?ensen?= <toke@toke.dk>
|
||||
Cc: linux-wireless@vger.kernel.org, brcm80211-dev-list.pdl@broadcom.com,
|
||||
linux-gpio@vger.kernel.org, Linus Walleij <linus.walleij@linaro.org>
|
||||
X-Mailer: b4 0.13.0
|
||||
|
||||
The ath9k has an odd use of system-wide GPIOs: if the chip
|
||||
does not have internal GPIO capability, it will try to obtain a
|
||||
GPIO line from the system GPIO controller:
|
||||
|
||||
if (BIT(gpio) & ah->caps.gpio_mask)
|
||||
ath9k_hw_gpio_cfg_wmac(...);
|
||||
else if (AR_SREV_SOC(ah))
|
||||
ath9k_hw_gpio_cfg_soc(ah, gpio, out, label);
|
||||
|
||||
Where ath9k_hw_gpio_cfg_soc() will attempt to issue
|
||||
gpio_request_one() passing the local GPIO number of the controller
|
||||
(0..31) to gpio_request_one().
|
||||
|
||||
This is somewhat peculiar and possibly even dangerous: there is
|
||||
nowadays no guarantee of the numbering of these system-wide
|
||||
GPIOs, and assuming that GPIO 0..31 as used by ath9k would
|
||||
correspond to GPIOs 0..31 on the system as a whole seems a bit
|
||||
wild.
|
||||
|
||||
Register all 32 GPIOs at index 0..31 directly in the ATH79K
|
||||
GPIO driver and associate with WIFI if and only if we are probing
|
||||
ATH79K wifi from the AHB bus (used for SoCs).
|
||||
|
||||
Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
|
||||
---
|
||||
Changes in v2:
|
||||
- Define all the descriptors directly in the ATH79K
|
||||
GPIO driver in case the driver want to request them directly.
|
||||
- Link to v1: https://lore.kernel.org/r/20240131-descriptors-wireless-v1-0-e1c7c5d68746@linaro.org
|
||||
---
|
||||
drivers/net/wireless/ath/ath9k/hw.c | 29 ++++++++++++-----------
|
||||
drivers/net/wireless/ath/ath9k/hw.h | 3 ++-
|
||||
2 files changed, 32 insertions(+), 15 deletions(-)
|
||||
|
||||
|
||||
---
|
||||
base-commit: 4cece764965020c22cff7665b18a012006359095
|
||||
change-id: 20240122-descriptors-wireless-b8da95dcab35
|
||||
|
||||
Best regards,
|
||||
|
||||
--- a/drivers/net/wireless/ath/ath9k/hw.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/hw.c
|
||||
@@ -20,7 +20,7 @@
|
||||
#include <linux/time.h>
|
||||
#include <linux/bitops.h>
|
||||
#include <linux/etherdevice.h>
|
||||
-#include <linux/gpio.h>
|
||||
+#include <linux/gpio/consumer.h>
|
||||
#include <linux/unaligned.h>
|
||||
|
||||
#include "hw.h"
|
||||
@@ -2718,19 +2718,25 @@ static void ath9k_hw_gpio_cfg_output_mux
|
||||
static void ath9k_hw_gpio_cfg_soc(struct ath_hw *ah, u32 gpio, bool out,
|
||||
const char *label)
|
||||
{
|
||||
+ enum gpiod_flags flags = out ? GPIOD_OUT_LOW : GPIOD_IN;
|
||||
+ struct gpio_desc *gpiod;
|
||||
int err;
|
||||
|
||||
- if (ah->caps.gpio_requested & BIT(gpio))
|
||||
+ if (ah->gpiods[gpio])
|
||||
return;
|
||||
|
||||
- err = devm_gpio_request_one(ah->dev, gpio, out ? GPIOF_OUT_INIT_LOW : GPIOF_IN, label);
|
||||
- if (err) {
|
||||
+ /* Obtains a system specific GPIO descriptor from another GPIO controller */
|
||||
+ gpiod = gpiod_get_index(NULL, "ath9k", gpio, flags);
|
||||
+
|
||||
+ if (IS_ERR(gpiod)) {
|
||||
+ err = PTR_ERR(gpiod);
|
||||
ath_err(ath9k_hw_common(ah), "request GPIO%d failed:%d\n",
|
||||
gpio, err);
|
||||
return;
|
||||
}
|
||||
|
||||
- ah->caps.gpio_requested |= BIT(gpio);
|
||||
+ gpiod_set_consumer_name(gpiod, label);
|
||||
+ ah->gpiods[gpio] = gpiod;
|
||||
}
|
||||
|
||||
static void ath9k_hw_gpio_cfg_wmac(struct ath_hw *ah, u32 gpio, bool out,
|
||||
@@ -2792,8 +2798,10 @@ void ath9k_hw_gpio_free(struct ath_hw *a
|
||||
|
||||
WARN_ON(gpio >= ah->caps.num_gpio_pins);
|
||||
|
||||
- if (ah->caps.gpio_requested & BIT(gpio))
|
||||
- ah->caps.gpio_requested &= ~BIT(gpio);
|
||||
+ if (ah->gpiods[gpio]) {
|
||||
+ gpiod_put(ah->gpiods[gpio]);
|
||||
+ ah->gpiods[gpio] = NULL;
|
||||
+ }
|
||||
}
|
||||
EXPORT_SYMBOL(ath9k_hw_gpio_free);
|
||||
|
||||
@@ -2821,8 +2829,8 @@ u32 ath9k_hw_gpio_get(struct ath_hw *ah,
|
||||
val = REG_READ(ah, AR_GPIO_IN(ah)) & BIT(gpio);
|
||||
else
|
||||
val = MS_REG_READ(AR, gpio);
|
||||
- } else if (BIT(gpio) & ah->caps.gpio_requested) {
|
||||
- val = gpio_get_value(gpio) & BIT(gpio);
|
||||
+ } else if (ah->gpiods[gpio]) {
|
||||
+ val = gpiod_get_value(ah->gpiods[gpio]);
|
||||
} else {
|
||||
WARN_ON(1);
|
||||
}
|
||||
@@ -2845,8 +2853,8 @@ void ath9k_hw_set_gpio(struct ath_hw *ah
|
||||
AR7010_GPIO_OUT : AR_GPIO_IN_OUT(ah);
|
||||
|
||||
REG_RMW(ah, out_addr, val << gpio, BIT(gpio));
|
||||
- } else if (BIT(gpio) & ah->caps.gpio_requested) {
|
||||
- gpio_set_value(gpio, val);
|
||||
+ } else if (ah->gpiods[gpio]) {
|
||||
+ gpiod_set_value(ah->gpiods[gpio], val);
|
||||
} else {
|
||||
WARN_ON(1);
|
||||
}
|
||||
--- a/drivers/net/wireless/ath/ath9k/hw.h
|
||||
+++ b/drivers/net/wireless/ath/ath9k/hw.h
|
||||
@@ -19,6 +19,7 @@
|
||||
|
||||
#include <linux/if_ether.h>
|
||||
#include <linux/delay.h>
|
||||
+#include <linux/gpio/consumer.h>
|
||||
#include <linux/io.h>
|
||||
#include <linux/firmware.h>
|
||||
|
||||
@@ -302,7 +303,6 @@ struct ath9k_hw_capabilities {
|
||||
u8 max_rxchains;
|
||||
u8 num_gpio_pins;
|
||||
u32 gpio_mask;
|
||||
- u32 gpio_requested;
|
||||
u8 rx_hp_qdepth;
|
||||
u8 rx_lp_qdepth;
|
||||
u8 rx_status_len;
|
||||
@@ -783,6 +783,7 @@ struct ath_hw {
|
||||
struct ath9k_hw_capabilities caps;
|
||||
struct ath9k_channel channels[ATH9K_NUM_CHANNELS];
|
||||
struct ath9k_channel *curchan;
|
||||
+ struct gpio_desc *gpiods[32];
|
||||
|
||||
union {
|
||||
struct ar5416_eeprom_def def;
|
||||
@@ -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
|
||||
@@ -1434,8 +1434,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
|
||||
@@ -1311,39 +1311,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(ah), 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(ah), 0);
|
||||
+ udelay(10);
|
||||
+ }
|
||||
+
|
||||
+ REG_WRITE(ah, AR_RTC_RESET(ah), 1);
|
||||
+ udelay(10);
|
||||
+
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -1396,24 +1413,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(ah), 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
|
||||
@@ -2974,7 +2974,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)
|
||||
@@ -2986,9 +2987,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
|
||||
@@ -2993,6 +2993,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);
|
||||
}
|
||||
11
patches/ath9k/401-ath9k_blink_default.patch
Normal file
11
patches/ath9k/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
|
||||
@@ -47,7 +47,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");
|
||||
|
||||
10
patches/ath9k/410-ath9k_allow_adhoc_and_ap.patch
Normal file
10
patches/ath9k/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
|
||||
@@ -836,6 +836,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_ATH9K_CHANNEL_CONTEXT
|
||||
@@ -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
|
||||
@@ -917,6 +917,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);
|
||||
@@ -929,9 +930,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;
|
||||
92
patches/ath9k/500-ath9k_eeprom_debugfs.patch
Normal file
92
patches/ath9k/500-ath9k_eeprom_debugfs.patch
Normal file
@@ -0,0 +1,92 @@
|
||||
--- a/drivers/net/wireless/ath/ath9k/debug.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/debug.c
|
||||
@@ -1430,6 +1430,7 @@ int ath9k_init_debug(struct ath_hw *ah)
|
||||
|
||||
ath9k_cmn_debug_base_eeprom(sc->debug.debugfs_phy, sc->sc_ah);
|
||||
ath9k_cmn_debug_modal_eeprom(sc->debug.debugfs_phy, sc->sc_ah);
|
||||
+ ath9k_cmn_debug_eeprom(sc->debug.debugfs_phy, sc->sc_ah);
|
||||
|
||||
debugfs_create_u32("gpio_mask", 0600,
|
||||
sc->debug.debugfs_phy, &sc->sc_ah->gpio_mask);
|
||||
--- a/drivers/net/wireless/ath/ath9k/common-debug.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/common-debug.c
|
||||
@@ -260,3 +260,58 @@ void ath9k_cmn_debug_phy_err(struct dent
|
||||
&fops_phy_err);
|
||||
}
|
||||
EXPORT_SYMBOL(ath9k_cmn_debug_phy_err);
|
||||
+
|
||||
+static ssize_t read_file_eeprom(struct file *file, char __user *user_buf,
|
||||
+ size_t count, loff_t *ppos)
|
||||
+{
|
||||
+ struct ath_hw *ah = file->private_data;
|
||||
+ 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;
|
||||
+ }
|
||||
+ if (copy_to_user(user_buf, from, bytes))
|
||||
+ return -EFAULT;
|
||||
+ user_buf += bytes;
|
||||
+ }
|
||||
+ return *ppos - pos;
|
||||
+}
|
||||
+
|
||||
+static const struct file_operations fops_eeprom = {
|
||||
+ .read = read_file_eeprom,
|
||||
+ .open = simple_open,
|
||||
+ .owner = THIS_MODULE
|
||||
+};
|
||||
+
|
||||
+void ath9k_cmn_debug_eeprom(struct dentry *debugfs_phy,
|
||||
+ struct ath_hw *ah)
|
||||
+{
|
||||
+ debugfs_create_file("eeprom", S_IRUSR, debugfs_phy, ah,
|
||||
+ &fops_eeprom);
|
||||
+}
|
||||
+EXPORT_SYMBOL(ath9k_cmn_debug_eeprom);
|
||||
--- a/drivers/net/wireless/ath/ath9k/common-debug.h
|
||||
+++ b/drivers/net/wireless/ath/ath9k/common-debug.h
|
||||
@@ -69,6 +69,8 @@ void ath9k_cmn_debug_modal_eeprom(struct
|
||||
struct ath_hw *ah);
|
||||
void ath9k_cmn_debug_base_eeprom(struct dentry *debugfs_phy,
|
||||
struct ath_hw *ah);
|
||||
+void ath9k_cmn_debug_eeprom(struct dentry *debugfs_phy,
|
||||
+ struct ath_hw *ah);
|
||||
void ath9k_cmn_debug_stat_rx(struct ath_rx_stats *rxstats,
|
||||
struct ath_rx_status *rs);
|
||||
void ath9k_cmn_debug_recv(struct dentry *debugfs_phy,
|
||||
--- a/drivers/net/wireless/ath/ath9k/htc_drv_debug.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/htc_drv_debug.c
|
||||
@@ -512,6 +512,7 @@ int ath9k_htc_init_debug(struct ath_hw *
|
||||
|
||||
ath9k_cmn_debug_base_eeprom(priv->debug.debugfs_phy, priv->ah);
|
||||
ath9k_cmn_debug_modal_eeprom(priv->debug.debugfs_phy, priv->ah);
|
||||
+ ath9k_cmn_debug_eeprom(priv->debug.debugfs_phy, priv->ah);
|
||||
|
||||
return 0;
|
||||
}
|
||||
34
patches/ath9k/501-ath9k_ahb_init.patch
Normal file
34
patches/ath9k/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
|
||||
@@ -1132,25 +1132,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
patches/ath9k/510-ath9k_intr_mitigation_tweak.patch
Normal file
18
patches/ath9k/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
|
||||
@@ -402,13 +402,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
patches/ath9k/511-ath9k_reduce_rxbuf.patch
Normal file
11
patches/ath9k/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
|
||||
@@ -90,7 +90,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
|
||||
191
patches/ath9k/512-ath9k_channelbw_debugfs.patch
Normal file
191
patches/ath9k/512-ath9k_channelbw_debugfs.patch
Normal file
@@ -0,0 +1,191 @@
|
||||
--- a/drivers/net/wireless/ath/ath9k/debug.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/debug.c
|
||||
@@ -1431,6 +1431,7 @@ int ath9k_init_debug(struct ath_hw *ah)
|
||||
ath9k_cmn_debug_base_eeprom(sc->debug.debugfs_phy, sc->sc_ah);
|
||||
ath9k_cmn_debug_modal_eeprom(sc->debug.debugfs_phy, sc->sc_ah);
|
||||
ath9k_cmn_debug_eeprom(sc->debug.debugfs_phy, sc->sc_ah);
|
||||
+ ath9k_cmn_debug_chanbw(sc->debug.debugfs_phy, sc->sc_ah);
|
||||
|
||||
debugfs_create_u32("gpio_mask", 0600,
|
||||
sc->debug.debugfs_phy, &sc->sc_ah->gpio_mask);
|
||||
--- a/drivers/net/wireless/ath/ath.h
|
||||
+++ b/drivers/net/wireless/ath/ath.h
|
||||
@@ -151,6 +151,7 @@ struct ath_common {
|
||||
int debug_mask;
|
||||
enum ath_device_state state;
|
||||
unsigned long op_flags;
|
||||
+ u32 chan_bw;
|
||||
|
||||
struct ath_ani ani;
|
||||
|
||||
@@ -181,6 +182,7 @@ struct ath_common {
|
||||
const struct ath_ops *ops;
|
||||
const struct ath_bus_ops *bus_ops;
|
||||
const struct ath_ps_ops *ps_ops;
|
||||
+ const struct ieee80211_ops *ieee_ops;
|
||||
|
||||
bool btcoex_enabled;
|
||||
bool disable_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;
|
||||
}
|
||||
--- a/drivers/net/wireless/ath/ath9k/common-debug.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/common-debug.c
|
||||
@@ -315,3 +315,55 @@ void ath9k_cmn_debug_eeprom(struct dentr
|
||||
&fops_eeprom);
|
||||
}
|
||||
EXPORT_SYMBOL(ath9k_cmn_debug_eeprom);
|
||||
+
|
||||
+static ssize_t read_file_chan_bw(struct file *file, char __user *user_buf,
|
||||
+ size_t count, loff_t *ppos)
|
||||
+{
|
||||
+ struct ath_hw *ah = file->private_data;
|
||||
+ struct ath_common *common = ath9k_hw_common(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_hw *ah = file->private_data;
|
||||
+ struct ath_common *common = ath9k_hw_common(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))
|
||||
+ common->ieee_ops->config(ah->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,
|
||||
+};
|
||||
+
|
||||
+void ath9k_cmn_debug_chanbw(struct dentry *debugfs_phy,
|
||||
+ struct ath_hw *ah)
|
||||
+{
|
||||
+ debugfs_create_file("chanbw", S_IRUSR | S_IWUSR, debugfs_phy, ah,
|
||||
+ &fops_chanbw);
|
||||
+}
|
||||
+EXPORT_SYMBOL(ath9k_cmn_debug_chanbw);
|
||||
--- a/drivers/net/wireless/ath/ath9k/htc_drv_debug.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/htc_drv_debug.c
|
||||
@@ -513,6 +513,7 @@ int ath9k_htc_init_debug(struct ath_hw *
|
||||
ath9k_cmn_debug_base_eeprom(priv->debug.debugfs_phy, priv->ah);
|
||||
ath9k_cmn_debug_modal_eeprom(priv->debug.debugfs_phy, priv->ah);
|
||||
ath9k_cmn_debug_eeprom(priv->debug.debugfs_phy, priv->ah);
|
||||
+ ath9k_cmn_debug_chanbw(priv->debug.debugfs_phy, priv->ah);
|
||||
|
||||
return 0;
|
||||
}
|
||||
--- a/drivers/net/wireless/ath/ath9k/common-debug.h
|
||||
+++ b/drivers/net/wireless/ath/ath9k/common-debug.h
|
||||
@@ -71,6 +71,8 @@ void ath9k_cmn_debug_base_eeprom(struct
|
||||
struct ath_hw *ah);
|
||||
void ath9k_cmn_debug_eeprom(struct dentry *debugfs_phy,
|
||||
struct ath_hw *ah);
|
||||
+void ath9k_cmn_debug_chanbw(struct dentry *debugfs_phy,
|
||||
+ struct ath_hw *ah);
|
||||
void ath9k_cmn_debug_stat_rx(struct ath_rx_stats *rxstats,
|
||||
struct ath_rx_status *rs);
|
||||
void ath9k_cmn_debug_recv(struct dentry *debugfs_phy,
|
||||
--- a/drivers/net/wireless/ath/ath9k/htc_drv_init.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/htc_drv_init.c
|
||||
@@ -631,6 +631,7 @@ static int ath9k_init_priv(struct ath9k_
|
||||
priv->ah = ah;
|
||||
|
||||
common = ath9k_hw_common(ah);
|
||||
+ common->ieee_ops = &ath9k_htc_ops;
|
||||
common->ops = &ah->reg_ops;
|
||||
common->ps_ops = &ath9k_htc_ps_ops;
|
||||
common->bus_ops = &ath9k_usb_bus_ops;
|
||||
@@ -746,9 +747,9 @@ static void ath9k_set_hw_capab(struct at
|
||||
|
||||
hw->wiphy->flags |= WIPHY_FLAG_IBSS_RSN |
|
||||
WIPHY_FLAG_HAS_REMAIN_ON_CHANNEL |
|
||||
- WIPHY_FLAG_HAS_CHANNEL_SWITCH;
|
||||
-
|
||||
- hw->wiphy->flags |= WIPHY_FLAG_SUPPORTS_TDLS;
|
||||
+ WIPHY_FLAG_HAS_CHANNEL_SWITCH |
|
||||
+ WIPHY_FLAG_SUPPORTS_5_10_MHZ |
|
||||
+ WIPHY_FLAG_SUPPORTS_TDLS;
|
||||
|
||||
hw->queues = 4;
|
||||
hw->max_listen_interval = 1;
|
||||
--- a/drivers/net/wireless/ath/ath9k/init.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/init.c
|
||||
@@ -691,6 +691,7 @@ static int ath9k_init_softc(u16 devid, s
|
||||
if (!ath9k_is_chanctx_enabled())
|
||||
sc->cur_chan->hw_queue_base = 0;
|
||||
|
||||
+ common->ieee_ops = &ath9k_ops;
|
||||
common->ops = &ah->reg_ops;
|
||||
common->bus_ops = bus_ops;
|
||||
common->ps_ops = &ath9k_ps_ops;
|
||||
30
patches/ath9k/513-ath9k_add_pci_ids.patch
Normal file
30
patches/ath9k/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
|
||||
@@ -662,6 +662,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
|
||||
@@ -37,6 +37,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
|
||||
@@ -772,6 +772,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
patches/ath9k/530-ath9k_extra_leds.patch
Normal file
267
patches/ath9k/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
|
||||
@@ -844,6 +844,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)
|
||||
{
|
||||
@@ -980,6 +983,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;
|
||||
@@ -1035,9 +1045,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
|
||||
@@ -1043,7 +1043,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
|
||||
@@ -123,6 +123,61 @@ static const struct file_operations fops
|
||||
|
||||
#define DMA_BUF_LEN 1024
|
||||
|
||||
+#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
|
||||
+
|
||||
|
||||
static ssize_t read_file_ani(struct file *file, char __user *user_buf,
|
||||
size_t count, loff_t *ppos)
|
||||
@@ -1391,6 +1446,10 @@ 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);
|
||||
|
||||
+#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,
|
||||
11
patches/ath9k/540-ath9k_reduce_ani_interval.patch
Normal file
11
patches/ath9k/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
patches/ath9k/542-ath9k_debugfs_diag.patch
Normal file
139
patches/ath9k/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
|
||||
@@ -1429,6 +1429,50 @@ void ath9k_deinit_debug(struct ath_softc
|
||||
ath9k_cmn_spectral_deinit_debug(&sc->spec_priv);
|
||||
}
|
||||
|
||||
+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);
|
||||
@@ -1450,6 +1494,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;
|
||||
@@ -811,6 +817,8 @@ struct ath_hw {
|
||||
u32 ah_flags;
|
||||
s16 nf_override;
|
||||
|
||||
+ unsigned long diag;
|
||||
+
|
||||
bool reset_power_on;
|
||||
bool htc_reset_init;
|
||||
|
||||
@@ -1080,6 +1088,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
|
||||
@@ -1872,6 +1872,20 @@ u32 ath9k_hw_get_tsf_offset(ktime_t last
|
||||
}
|
||||
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)
|
||||
{
|
||||
@@ -2080,6 +2094,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
|
||||
@@ -537,6 +537,11 @@ irqreturn_t ath_isr(int irq, void *dev)
|
||||
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
patches/ath9k/543-ath9k_entropy_from_adc.patch
Normal file
186
patches/ath9k/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
|
||||
@@ -1915,6 +1915,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(ah), AR_PHY_TEST_BBB_OBS_SEL, 1);
|
||||
+ REG_CLR_BIT(ah, AR_PHY_TEST(ah), AR_PHY_TEST_RX_OBS_SEL_BIT5);
|
||||
+ REG_RMW_FIELD(ah, AR_PHY_TEST_CTL_STATUS(ah), 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);
|
||||
@@ -1951,6 +1971,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
|
||||
@@ -825,7 +825,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[] = {
|
||||
@@ -1003,6 +1004,18 @@ static void ath9k_set_hw_capab(struct at
|
||||
wiphy_ext_feature_set(hw->wiphy, NL80211_EXT_FEATURE_CAN_REPLACE_PTK0);
|
||||
}
|
||||
|
||||
+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)
|
||||
{
|
||||
@@ -1050,6 +1063,8 @@ int ath9k_init_device(u16 devid, struct
|
||||
|
||||
wiphy_read_of_freq_limits(hw->wiphy);
|
||||
|
||||
+ 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
|
||||
@@ -1340,9 +1340,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,
|
||||
@@ -1357,6 +1378,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
|
||||
|
||||
79
patches/ath9k/544-ath9k-ar933x-usb-hang-workaround.patch
Normal file
79
patches/ath9k/544-ath9k-ar933x-usb-hang-workaround.patch
Normal file
@@ -0,0 +1,79 @@
|
||||
--- a/drivers/net/wireless/ath/ath9k/hw.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/hw.c
|
||||
@@ -247,6 +247,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 */
|
||||
/******************/
|
||||
@@ -1454,6 +1467,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;
|
||||
}
|
||||
|
||||
@@ -1553,6 +1569,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;
|
||||
}
|
||||
|
||||
@@ -1859,8 +1878,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;
|
||||
}
|
||||
|
||||
@@ -2105,6 +2130,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
patches/ath9k/545-ath9k_ani_ws_detect.patch
Normal file
155
patches/ath9k/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
|
||||
@@ -969,55 +969,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,
|
||||
@@ -1065,11 +1051,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) {
|
||||
@@ -1083,61 +1064,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
patches/ath9k/547-ath9k_led_defstate_fix.patch
Normal file
29
patches/ath9k/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
|
||||
@@ -73,8 +73,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;
|
||||
}
|
||||
210
patches/ath9k/548-ath9k_enable_gpio_chip.patch
Normal file
210
patches/ath9k/548-ath9k_enable_gpio_chip.patch
Normal file
@@ -0,0 +1,210 @@
|
||||
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
|
||||
@@ -25,6 +25,8 @@
|
||||
#include <linux/completion.h>
|
||||
#include <linux/time.h>
|
||||
#include <linux/hw_random.h>
|
||||
+#include <linux/gpio/driver.h>
|
||||
+#include <linux/gpio/consumer.h>
|
||||
|
||||
#include "common.h"
|
||||
#include "debug.h"
|
||||
@@ -1047,6 +1049,10 @@ struct ath_softc {
|
||||
#ifdef CPTCFG_MAC80211_LEDS
|
||||
const char *led_default_trigger;
|
||||
struct list_head leds;
|
||||
+#ifdef CONFIG_GPIOLIB
|
||||
+ struct gpio_chip *gpiochip;
|
||||
+ struct gpio_desc *gpiodesc;
|
||||
+#endif
|
||||
#endif
|
||||
|
||||
#ifdef CPTCFG_ATH9K_DEBUGFS
|
||||
--- a/drivers/net/wireless/ath/ath9k/gpio.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/gpio.c
|
||||
@@ -16,12 +16,120 @@
|
||||
|
||||
#include "ath9k.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 ath_softc *sc = gpiochip_get_data(chip);
|
||||
+
|
||||
+ ath9k_hw_gpio_request_in(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 ath_softc *sc = gpiochip_get_data(chip);
|
||||
+
|
||||
+ ath9k_hw_gpio_request_out(sc->sc_ah, offset, "ath9k-gpio",
|
||||
+ AR_GPIO_OUTPUT_MUX_AS_OUTPUT);
|
||||
+ ath9k_hw_set_gpio(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 ath_softc *sc = gpiochip_get_data(chip);
|
||||
+ struct ath_hw *ah = sc->sc_ah;
|
||||
+
|
||||
+ return !((REG_READ(ah, AR_GPIO_OE_OUT(ah)) >> (offset * 2)) & 3);
|
||||
+}
|
||||
+
|
||||
+/* gpio_chip handler : get GPIO pin value */
|
||||
+static int ath9k_gpio_pin_get(struct gpio_chip *chip, unsigned offset)
|
||||
+{
|
||||
+ struct ath_softc *sc = gpiochip_get_data(chip);
|
||||
+
|
||||
+ return ath9k_hw_gpio_get(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 ath_softc *sc = gpiochip_get_data(chip);
|
||||
+
|
||||
+ ath9k_hw_set_gpio(sc->sc_ah, offset, value);
|
||||
+}
|
||||
+
|
||||
+/* register GPIO chip */
|
||||
+static void ath9k_register_gpio_chip(struct ath_softc *sc)
|
||||
+{
|
||||
+ struct gpio_chip *gc = sc->gpiochip;
|
||||
+ struct ath_hw *ah = sc->sc_ah;
|
||||
+
|
||||
+ gc = kzalloc(sizeof(struct gpio_chip), GFP_KERNEL);
|
||||
+ if (!gc)
|
||||
+ return;
|
||||
+
|
||||
+ gc->label = kasprintf(GFP_KERNEL, "ath9k-%s",
|
||||
+ wiphy_name(sc->hw->wiphy));
|
||||
+ gc->parent = sc->dev;
|
||||
+ gc->base = -1; /* determine base automatically */
|
||||
+ gc->ngpio = ah->caps.num_gpio_pins;
|
||||
+ gc->direction_input = ath9k_gpio_pin_cfg_input;
|
||||
+ gc->direction_output = ath9k_gpio_pin_cfg_output;
|
||||
+ gc->get_direction = ath9k_gpio_pin_get_dir;
|
||||
+ gc->get = ath9k_gpio_pin_get;
|
||||
+ gc->set = ath9k_gpio_pin_set;
|
||||
+
|
||||
+ if (gpiochip_add_data(gc, sc)) {
|
||||
+ kfree(gc->label);
|
||||
+ kfree(gc);
|
||||
+ return;
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
+/* remove GPIO chip */
|
||||
+static void ath9k_unregister_gpio_chip(struct ath_softc *sc)
|
||||
+{
|
||||
+ struct gpio_chip *gc = sc->gpiochip;
|
||||
+
|
||||
+ if (!gc)
|
||||
+ return;
|
||||
+
|
||||
+ gpiochip_remove(gc);
|
||||
+ kfree(gc->label);
|
||||
+ kfree(gc);
|
||||
+}
|
||||
+
|
||||
+#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;
|
||||
@@ -79,6 +187,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)
|
||||
+ sc->gpiodesc = gpiod_get(sc->dev, gpio->name, GPIOD_ASIS);
|
||||
+#endif
|
||||
+
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -117,16 +231,23 @@ 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)
|
||||
+ gpiod_put(sc->gpiodesc);
|
||||
+#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 device_node *np = sc->dev->of_node;
|
||||
char led_name[32];
|
||||
const char *trigger;
|
||||
|
||||
@@ -135,6 +256,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);
|
||||
|
||||
snprintf(led_name, sizeof(led_name), "ath9k-%s",
|
||||
166
patches/ath9k/550-ath9k-of.patch
Normal file
166
patches/ath9k/550-ath9k-of.patch
Normal file
@@ -0,0 +1,166 @@
|
||||
--- a/drivers/net/wireless/ath/ath9k/init.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/init.c
|
||||
@@ -28,6 +28,11 @@
|
||||
|
||||
#include "ath9k.h"
|
||||
|
||||
+#ifdef CONFIG_ATH79
|
||||
+#include <asm/mach-ath79/ath79.h>
|
||||
+#include <asm/mach-ath79/ar71xx_regs.h>
|
||||
+#endif
|
||||
+
|
||||
struct ath9k_eeprom_ctx {
|
||||
struct completion complete;
|
||||
struct ath_hw *ah;
|
||||
@@ -242,6 +247,81 @@ static unsigned int ath9k_reg_rmw(void *
|
||||
return val;
|
||||
}
|
||||
|
||||
+#ifdef CONFIG_ATH79
|
||||
+#define QCA955X_DDR_CTL_CONFIG 0x108
|
||||
+#define QCA955X_DDR_CTL_CONFIG_ACT_WMAC BIT(23)
|
||||
+
|
||||
+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;
|
||||
+}
|
||||
+
|
||||
+
|
||||
+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;
|
||||
+}
|
||||
+#endif
|
||||
+
|
||||
/**************************/
|
||||
/* Initialization */
|
||||
/**************************/
|
||||
@@ -626,6 +706,7 @@ static int ath9k_of_init(struct ath_soft
|
||||
struct ath_common *common = ath9k_hw_common(ah);
|
||||
enum ath_bus_type bus_type = common->bus_ops->ath_bus_type;
|
||||
char eeprom_name[100];
|
||||
+ u32 mask;
|
||||
int ret;
|
||||
|
||||
if (!of_device_is_available(np))
|
||||
@@ -633,6 +714,43 @@ static int ath9k_of_init(struct ath_soft
|
||||
|
||||
ath_dbg(common, CONFIG, "parsing configuration from OF node\n");
|
||||
|
||||
+ if (!of_property_read_u32(np, "qca,gpio-mask", &mask))
|
||||
+ ah->caps.gpio_mask = mask;
|
||||
+
|
||||
+ if (of_property_read_bool(np, "qca,tx-gain-buffalo"))
|
||||
+ ah->config.tx_gain_buffalo = true;
|
||||
+
|
||||
+#ifdef CONFIG_ATH79
|
||||
+ if (ah->hw_version.devid == AR5416_AR9100_DEVID) {
|
||||
+ ah->external_reset = ar913x_wmac_reset;
|
||||
+ } else if (ah->hw_version.devid == AR9300_DEVID_AR9330) {
|
||||
+ ah->get_mac_revision = ar9330_get_soc_revision;
|
||||
+ u32 t = ath79_reset_rr(AR933X_RESET_REG_BOOTSTRAP);
|
||||
+ ah->is_clk_25mhz = !(t & AR933X_BOOTSTRAP_REF_CLK_40);
|
||||
+ ah->external_reset = ar933x_wmac_reset;
|
||||
+ } else if (ah->hw_version.devid == AR9300_DEVID_AR9340) {
|
||||
+ ah->get_mac_revision = ath79_get_soc_revision;
|
||||
+ u32 t = ath79_reset_rr(AR934X_RESET_REG_BOOTSTRAP);
|
||||
+ ah->is_clk_25mhz = !(t & AR934X_BOOTSTRAP_REF_CLK_40);
|
||||
+ } else if (ah->hw_version.devid == AR9300_DEVID_AR953X) {
|
||||
+ ah->get_mac_revision = ath79_get_soc_revision;
|
||||
+ /*
|
||||
+ * QCA953x only supports 25MHz refclk.
|
||||
+ * Some vendors have an invalid bootstrap option
|
||||
+ * set, which would break the WMAC here.
|
||||
+ */
|
||||
+ ah->is_clk_25mhz = true;
|
||||
+ } else if (ah->hw_version.devid == AR9300_DEVID_QCA955X) {
|
||||
+ u32 t = ath79_reset_rr(QCA955X_RESET_REG_BOOTSTRAP);
|
||||
+ ah->is_clk_25mhz = !(t & QCA955X_BOOTSTRAP_REF_CLK_40);
|
||||
+ ah->external_reset = qca955x_wmac_reset;
|
||||
+ } else if (ah->hw_version.devid == AR9300_DEVID_QCA956X) {
|
||||
+ ah->get_mac_revision = ath79_get_soc_revision;
|
||||
+ u32 t = ath79_reset_rr(QCA956X_RESET_REG_BOOTSTRAP);
|
||||
+ ah->is_clk_25mhz = !(t & QCA956X_BOOTSTRAP_REF_CLK_40);
|
||||
+ }
|
||||
+#endif
|
||||
+
|
||||
if (of_property_read_bool(np, "qca,no-eeprom")) {
|
||||
/* ath9k-eeprom-<bus>-<id>.bin */
|
||||
scnprintf(eeprom_name, sizeof(eeprom_name),
|
||||
@@ -651,6 +769,17 @@ static int ath9k_of_init(struct ath_soft
|
||||
if (ret == -EPROBE_DEFER)
|
||||
return ret;
|
||||
|
||||
+ np = of_get_child_by_name(np, "led");
|
||||
+ if (np && of_device_is_available(np)) {
|
||||
+ u32 led_pin;
|
||||
+
|
||||
+ if (!of_property_read_u32(np, "led-sources", &led_pin))
|
||||
+ ah->led_pin = led_pin;
|
||||
+
|
||||
+ ah->config.led_active_high = !of_property_read_bool(np, "led-active-low");
|
||||
+ of_node_put(np);
|
||||
+ }
|
||||
+
|
||||
return 0;
|
||||
}
|
||||
|
||||
406
patches/ath9k/551-ath9k_ubnt_uap_plus_hsr.patch
Normal file
406
patches/ath9k/551-ath9k_ubnt_uap_plus_hsr.patch
Normal file
@@ -0,0 +1,406 @@
|
||||
--- a/drivers/net/wireless/ath/ath9k/channel.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/channel.c
|
||||
@@ -15,6 +15,7 @@
|
||||
*/
|
||||
|
||||
#include "ath9k.h"
|
||||
+#include "hsr.h"
|
||||
|
||||
/* Set/change channels. If the channel is really being changed, it's done
|
||||
* by resetting the chip. To accomplish this we must first cleanup any pending
|
||||
@@ -22,6 +23,7 @@
|
||||
*/
|
||||
static int ath_set_channel(struct ath_softc *sc)
|
||||
{
|
||||
+ struct device_node *np = sc->dev->of_node;
|
||||
struct ath_hw *ah = sc->sc_ah;
|
||||
struct ath_common *common = ath9k_hw_common(ah);
|
||||
struct ieee80211_hw *hw = sc->hw;
|
||||
@@ -42,6 +44,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 (of_property_read_bool(np, "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,248 @@
|
||||
+/*
|
||||
+ *
|
||||
+ * 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"
|
||||
+#include "hsr.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,50 @@
|
||||
+/*
|
||||
+ * 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
|
||||
+
|
||||
+ struct ath_hw;
|
||||
+
|
||||
+#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
|
||||
@@ -18,6 +18,7 @@
|
||||
#include <linux/delay.h>
|
||||
#include "ath9k.h"
|
||||
#include "btcoex.h"
|
||||
+#include "hsr.h"
|
||||
|
||||
static void ath9k_flush(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
|
||||
u32 queues, bool drop);
|
||||
@@ -658,6 +659,7 @@ void ath_reset_work(struct work_struct *
|
||||
static int ath9k_start(struct ieee80211_hw *hw)
|
||||
{
|
||||
struct ath_softc *sc = hw->priv;
|
||||
+ struct device_node *np = sc->dev->of_node;
|
||||
struct ath_hw *ah = sc->sc_ah;
|
||||
struct ath_common *common = ath9k_hw_common(ah);
|
||||
struct ieee80211_channel *curchan = sc->cur_chan->chandef.chan;
|
||||
@@ -736,6 +738,11 @@ static int ath9k_start(struct ieee80211_
|
||||
AR_GPIO_OUTPUT_MUX_AS_OUTPUT);
|
||||
}
|
||||
|
||||
+ if (of_property_read_bool(np, "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/local-symbols
|
||||
+++ b/local-symbols
|
||||
@@ -117,6 +117,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
|
||||
@@ -58,6 +58,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 && MAC80211_DEBUGFS
|
||||
100
patches/ath9k/552-ath9k-ahb_of.patch
Normal file
100
patches/ath9k/552-ath9k-ahb_of.patch
Normal file
@@ -0,0 +1,100 @@
|
||||
--- a/drivers/net/wireless/ath/ath9k/ahb.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/ahb.c
|
||||
@@ -16,37 +16,21 @@
|
||||
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
*/
|
||||
|
||||
+#include <linux/mod_devicetable.h>
|
||||
+#include <linux/module.h>
|
||||
#include <linux/nl80211.h>
|
||||
+#include <linux/of.h>
|
||||
#include <linux/platform_device.h>
|
||||
-#include <linux/module.h>
|
||||
-#include <linux/mod_devicetable.h>
|
||||
+
|
||||
#include "ath9k.h"
|
||||
|
||||
-static const struct platform_device_id ath9k_platform_id_table[] = {
|
||||
- {
|
||||
- .name = "ath9k",
|
||||
- .driver_data = AR5416_AR9100_DEVID,
|
||||
- },
|
||||
- {
|
||||
- .name = "ar933x_wmac",
|
||||
- .driver_data = AR9300_DEVID_AR9330,
|
||||
- },
|
||||
- {
|
||||
- .name = "ar934x_wmac",
|
||||
- .driver_data = AR9300_DEVID_AR9340,
|
||||
- },
|
||||
- {
|
||||
- .name = "qca955x_wmac",
|
||||
- .driver_data = AR9300_DEVID_QCA955X,
|
||||
- },
|
||||
- {
|
||||
- .name = "qca953x_wmac",
|
||||
- .driver_data = AR9300_DEVID_AR953X,
|
||||
- },
|
||||
- {
|
||||
- .name = "qca956x_wmac",
|
||||
- .driver_data = AR9300_DEVID_QCA956X,
|
||||
- },
|
||||
+static const struct of_device_id ath9k_of_match_table[] = {
|
||||
+ { .compatible = "qca,ar9130-wifi", .data = (void *)AR5416_AR9100_DEVID },
|
||||
+ { .compatible = "qca,ar9330-wifi", .data = (void *)AR9300_DEVID_AR9330 },
|
||||
+ { .compatible = "qca,ar9340-wifi", .data = (void *)AR9300_DEVID_AR9340 },
|
||||
+ { .compatible = "qca,qca9530-wifi", .data = (void *)AR9300_DEVID_AR953X },
|
||||
+ { .compatible = "qca,qca9550-wifi", .data = (void *)AR9300_DEVID_QCA955X },
|
||||
+ { .compatible = "qca,qca9560-wifi", .data = (void *)AR9300_DEVID_QCA956X },
|
||||
{},
|
||||
};
|
||||
|
||||
@@ -71,19 +55,14 @@ static const struct ath_bus_ops ath_ahb_
|
||||
|
||||
static int ath_ahb_probe(struct platform_device *pdev)
|
||||
{
|
||||
- void __iomem *mem;
|
||||
- struct ath_softc *sc;
|
||||
struct ieee80211_hw *hw;
|
||||
- const struct platform_device_id *id = platform_get_device_id(pdev);
|
||||
- int irq;
|
||||
- int ret = 0;
|
||||
+ struct ath_softc *sc;
|
||||
struct ath_hw *ah;
|
||||
+ void __iomem *mem;
|
||||
char hw_name[64];
|
||||
-
|
||||
- if (!dev_get_platdata(&pdev->dev)) {
|
||||
- dev_err(&pdev->dev, "no platform data specified\n");
|
||||
- return -EINVAL;
|
||||
- }
|
||||
+ u16 dev_id;
|
||||
+ int irq;
|
||||
+ int ret;
|
||||
|
||||
mem = devm_platform_ioremap_resource(pdev, 0);
|
||||
if (IS_ERR(mem)) {
|
||||
@@ -117,7 +96,8 @@ static int ath_ahb_probe(struct platform
|
||||
goto err_free_hw;
|
||||
}
|
||||
|
||||
- ret = ath9k_init_device(id->driver_data, sc, &ath_ahb_bus_ops);
|
||||
+ dev_id = (u16)(kernel_ulong_t)of_device_get_match_data(&pdev->dev);
|
||||
+ 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;
|
||||
@@ -167,11 +147,11 @@ static struct platform_driver ath_ahb_dr
|
||||
|
||||
.driver = {
|
||||
.name = "ath9k",
|
||||
+ .of_match_table = ath9k_of_match_table,
|
||||
},
|
||||
- .id_table = ath9k_platform_id_table,
|
||||
};
|
||||
|
||||
-MODULE_DEVICE_TABLE(platform, ath9k_platform_id_table);
|
||||
+MODULE_DEVICE_TABLE(of, ath9k_of_match_table);
|
||||
|
||||
int ath_ahb_init(void)
|
||||
{
|
||||
10
patches/brcm/040-brcmutil_option.patch
Normal file
10
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
patches/brcm/810-b43-gpio-mask-module-option.patch
Normal file
37
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,
|
||||
@@ -2870,10 +2875,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
patches/brcm/811-b43_no_pio.patch
Normal file
86
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
|
||||
@@ -2001,10 +2001,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
patches/brcm/812-b43-add-antenna-control.patch
Normal file
131
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
|
||||
@@ -1643,7 +1643,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. */
|
||||
@@ -3285,8 +3285,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);
|
||||
@@ -3988,7 +3988,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);
|
||||
@@ -4031,11 +4030,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) {
|
||||
@@ -5178,6 +5175,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 = {
|
||||
.add_chanctx = ieee80211_emulate_add_chanctx,
|
||||
.remove_chanctx = ieee80211_emulate_remove_chanctx,
|
||||
@@ -5204,6 +5242,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.
|
||||
@@ -5505,6 +5545,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;
|
||||
@@ -5596,6 +5638,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;
|
||||
11
patches/brcm/813-b43-reduce-number-of-RX-slots.patch
Normal file
11
patches/brcm/813-b43-reduce-number-of-RX-slots.patch
Normal file
@@ -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)
|
||||
|
||||
17
patches/brcm/814-b43-only-use-gpio-0-1-for-led.patch
Normal file
17
patches/brcm/814-b43-only-use-gpio-0-1-for-led.patch
Normal file
@@ -0,0 +1,17 @@
|
||||
--- a/drivers/net/wireless/broadcom/b43/main.c
|
||||
+++ b/drivers/net/wireless/broadcom/b43/main.c
|
||||
@@ -2887,6 +2887,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 */ ) {
|
||||
11
patches/brcm/815-b43-always-take-overlapping-devs.patch
Normal file
11
patches/brcm/815-b43-always-take-overlapping-devs.patch
Normal file
@@ -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;
|
||||
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)");
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user