Merge Official Source
Signed-off-by: Tianling Shen <cnsztl@immortalwrt.org>
This commit is contained in:
commit
eeb47a1b31
@ -217,20 +217,6 @@ menu "Global build settings"
|
||||
make the system libraries incompatible with most of the packages that are
|
||||
not selected during the build process.
|
||||
|
||||
choice
|
||||
prompt "Preferred standard C++ library"
|
||||
default USE_LIBSTDCXX if USE_GLIBC
|
||||
default USE_UCLIBCXX
|
||||
help
|
||||
Select the preferred standard C++ library for all packages that support this.
|
||||
|
||||
config USE_UCLIBCXX
|
||||
bool "uClibc++"
|
||||
|
||||
config USE_LIBSTDCXX
|
||||
bool "libstdc++"
|
||||
endchoice
|
||||
|
||||
comment "Hardening build options"
|
||||
|
||||
config PKG_CHECK_FORMAT_SECURITY
|
||||
|
||||
@ -394,6 +394,7 @@ define Device/Init
|
||||
|
||||
DEVICE_DTS :=
|
||||
DEVICE_DTS_CONFIG :=
|
||||
DEVICE_DTS_DELIMITER :=
|
||||
DEVICE_DTS_DIR :=
|
||||
DEVICE_DTS_OVERLAY :=
|
||||
DEVICE_FDT_NUM :=
|
||||
@ -419,8 +420,8 @@ DEFAULT_DEVICE_VARS := \
|
||||
DEVICE_NAME KERNEL KERNEL_INITRAMFS KERNEL_INITRAMFS_IMAGE KERNEL_SIZE \
|
||||
CMDLINE UBOOTENV_IN_UBI KERNEL_IN_UBI BLOCKSIZE PAGESIZE SUBPAGESIZE \
|
||||
VID_HDR_OFFSET UBINIZE_OPTS UBINIZE_PARTS MKUBIFS_OPTS DEVICE_DTS \
|
||||
DEVICE_DTS_CONFIG DEVICE_DTS_DIR DEVICE_DTS_OVERLAY DEVICE_FDT_NUM \
|
||||
DEVICE_IMG_PREFIX SOC BOARD_NAME UIMAGE_MAGIC UIMAGE_NAME \
|
||||
DEVICE_DTS_CONFIG DEVICE_DTS_DELIMITER DEVICE_DTS_DIR DEVICE_DTS_OVERLAY \
|
||||
DEVICE_FDT_NUM DEVICE_IMG_PREFIX SOC BOARD_NAME UIMAGE_MAGIC UIMAGE_NAME \
|
||||
SUPPORTED_DEVICES IMAGE_METADATA KERNEL_ENTRY KERNEL_LOADADDR \
|
||||
UBOOT_PATH IMAGE_SIZE \
|
||||
DEVICE_PACKAGES DEVICE_COMPAT_VERSION DEVICE_COMPAT_MESSAGE \
|
||||
|
||||
@ -45,6 +45,10 @@ UBOOT_MAKE_FLAGS = \
|
||||
HOSTCC="$(HOSTCC)" \
|
||||
HOSTCFLAGS="$(HOST_CFLAGS) $(HOST_CPPFLAGS) -std=gnu11" \
|
||||
HOSTLDFLAGS="$(HOST_LDFLAGS)" \
|
||||
STAGING_PREFIX="$(STAGING_DIR_HOST)" \
|
||||
PKG_CONFIG_PATH="$(STAGING_DIR_HOST)/lib/pkgconfig" \
|
||||
PKG_CONFIG_LIBDIR="$(STAGING_DIR_HOST)/lib/pkgconfig" \
|
||||
PKG_CONFIG_EXTRAARGS="--static" \
|
||||
$(if $(findstring c,$(OPENWRT_VERBOSE)),V=1,V='')
|
||||
|
||||
define Build/U-Boot/Target
|
||||
|
||||
@ -1,16 +1,2 @@
|
||||
ifndef DUMP
|
||||
ifdef __package_mk
|
||||
$(error uclibc++.mk must be included before package.mk)
|
||||
endif
|
||||
endif
|
||||
|
||||
PKG_PREPARED_DEPENDS += CONFIG_USE_UCLIBCXX
|
||||
CXX_DEPENDS = +USE_UCLIBCXX:uclibcxx +USE_LIBSTDCXX:libstdcpp
|
||||
|
||||
ifneq ($(CONFIG_USE_UCLIBCXX),)
|
||||
ifneq ($(CONFIG_CCACHE),)
|
||||
TARGET_CXX_NOCACHE=g++-uc
|
||||
else
|
||||
TARGET_CXX=g++-uc
|
||||
endif
|
||||
endif
|
||||
$(warn uclibc++.mk is deprecated. Please remove it and CXX_DEPENDS)
|
||||
CXX_DEPENDS = +libstdcpp
|
||||
|
||||
@ -21,9 +21,10 @@ boot() {
|
||||
[ -f /proc/mounts ] || /sbin/mount_root
|
||||
[ -f /proc/jffs2_bbc ] && echo "S" > /proc/jffs2_bbc
|
||||
|
||||
mkdir -p /var/run
|
||||
mkdir -p /var/log
|
||||
mkdir -p /var/lock
|
||||
chmod 1777 /var/lock
|
||||
mkdir -p /var/log
|
||||
mkdir -p /var/run
|
||||
mkdir -p /var/state
|
||||
mkdir -p /var/tmp
|
||||
mkdir -p /tmp/.uci
|
||||
|
||||
@ -40,6 +40,30 @@ define AT91Bootstrap/at91sam9x5eksd_uboot
|
||||
BUILD_DEVICES:=atmel_at91sam9x25ek atmel_at91sam9x35ek
|
||||
endef
|
||||
|
||||
define AT91Bootstrap/sam9x60eknf_uboot
|
||||
NAME:=AT91Bootstrap for SAM9X60-EK board (NandFlash)
|
||||
BUILD_SUBTARGET:=sam9x
|
||||
BUILD_DEVICES:=microchip_sam9x60ek
|
||||
endef
|
||||
|
||||
define AT91Bootstrap/sam9x60eksd_uboot
|
||||
NAME:=AT91Bootstrap for SAM9X60-EK board (SDcard)
|
||||
BUILD_SUBTARGET:=sam9x
|
||||
BUILD_DEVICES:=microchip_sam9x60ek
|
||||
endef
|
||||
|
||||
define AT91Bootstrap/sama5d2_icpdf_qspi_uboot
|
||||
TITLE:=AT91Bootstrap for SAMA5D2 ICP board (QSPI Flash)
|
||||
BUILD_SUBTARGET:=sama5
|
||||
BUILD_DEVICES:=microchip_sama5d2-icp
|
||||
endef
|
||||
|
||||
define AT91Bootstrap/sama5d2_icpsd_uboot
|
||||
TITLE:=AT91Bootstrap for SAMA5D2 ICP board (SDcard)
|
||||
BUILD_SUBTARGET:=sama5
|
||||
BUILD_DEVICES:=microchip_sama5d2-icp
|
||||
endef
|
||||
|
||||
define AT91Bootstrap/sama5d2_xplaineddf_uboot
|
||||
TITLE:=AT91Bootstrap for SAMA5D2 Xplained board (SPI Flash)
|
||||
BUILD_SUBTARGET:=sama5
|
||||
@ -106,6 +130,18 @@ define AT91Bootstrap/sama5d27_som1_ekqspi_uboot
|
||||
BUILD_DEVICES:=microchip_sama5d27-som1-ek
|
||||
endef
|
||||
|
||||
define AT91Bootstrap/sama5d27_wlsom1_eksd_uboot
|
||||
TITLE:=AT91Bootstrap for SAMA5D27 WLSOM1 Ek (SDcard0)
|
||||
BUILD_SUBTARGET:=sama5
|
||||
BUILD_DEVICES:=microchip_sama5d27-wlsom1-ek
|
||||
endef
|
||||
|
||||
define AT91Bootstrap/sama5d27_wlsom1_ekdf_qspi_uboot
|
||||
TITLE:=AT91Bootstrap for SAMA5D27 WLSOM1 Ek (QSPI Flash)
|
||||
BUILD_SUBTARGET:=sama5
|
||||
BUILD_DEVICES:=microchip_sama5d27-wlsom1-ek
|
||||
endef
|
||||
|
||||
define AT91Bootstrap/sama5d2_ptc_eknf_uboot
|
||||
TITLE:=AT91Bootstrap for SAMA5D2 PTC EK (Nand Flash)
|
||||
BUILD_SUBTARGET:=sama5
|
||||
@ -121,6 +157,10 @@ endef
|
||||
AT91BOOTSTRAP_TARGETS := \
|
||||
at91sam9x5eknf_uboot \
|
||||
at91sam9x5eksd_uboot \
|
||||
sam9x60eknf_uboot \
|
||||
sam9x60eksd_uboot \
|
||||
sama5d2_icpdf_qspi_uboot \
|
||||
sama5d2_icpsd_uboot \
|
||||
sama5d2_xplaineddf_uboot \
|
||||
sama5d2_xplaineddf_qspi_uboot \
|
||||
sama5d2_xplainedsd_uboot \
|
||||
@ -131,6 +171,8 @@ AT91BOOTSTRAP_TARGETS := \
|
||||
sama5d4_xplainedsd_uboot_secure \
|
||||
sama5d27_som1_eksd1_uboot \
|
||||
sama5d27_som1_ekqspi_uboot \
|
||||
sama5d27_wlsom1_eksd_uboot \
|
||||
sama5d27_wlsom1_ekdf_qspi_uboot \
|
||||
sama5d2_ptc_eknf_uboot \
|
||||
sama5d2_ptc_eksd_uboot
|
||||
|
||||
|
||||
@ -47,6 +47,18 @@ define U-Boot/at91sam9x5ek_mmc
|
||||
atmel_at91sam9x35ek
|
||||
endef
|
||||
|
||||
define U-Boot/sam9x60ek_nandflash
|
||||
NAME:=SAM9X60-EK board (NandFlash)
|
||||
BUILD_SUBTARGET:=sam9x
|
||||
BUILD_DEVICES:=microchip_sam9x60ek
|
||||
endef
|
||||
|
||||
define U-Boot/sam9x60ek_mmc
|
||||
NAME:=SAM9X60-EK board (SDcard)
|
||||
BUILD_SUBTARGET:=sam9x
|
||||
BUILD_DEVICES:=microchip_sam9x60ek
|
||||
endef
|
||||
|
||||
define U-Boot/sama5d3_xplained_nandflash
|
||||
NAME:=SAMA5D3 Xplained board (NandFlash)
|
||||
BUILD_SUBTARGET:=sama5
|
||||
@ -59,6 +71,12 @@ define U-Boot/sama5d3_xplained_mmc
|
||||
BUILD_DEVICES:=microchip_sama5d3-xplained
|
||||
endef
|
||||
|
||||
define U-Boot/sama5d2_icp_mmc
|
||||
NAME:=SAMA5D2 ICP board (SDCard)
|
||||
BUILD_SUBTARGET:=sama5
|
||||
BUILD_DEVICES:=microchip_sama5d2-icp
|
||||
endef
|
||||
|
||||
define U-Boot/sama5d2_xplained_spiflash
|
||||
NAME:=SAMA5D2 Xplained board (SPI Flash)
|
||||
BUILD_SUBTARGET:=sama5
|
||||
@ -101,6 +119,18 @@ define U-Boot/sama5d27_som1_ek_qspiflash
|
||||
BUILD_DEVICES:=microchip_sama5d27-som1-ek
|
||||
endef
|
||||
|
||||
define U-Boot/sama5d27_wlsom1_ek_mmc
|
||||
NAME:=SAMA5D27 WLSOM1 Ek (SDCard)
|
||||
BUILD_SUBTARGET:=sama5
|
||||
BUILD_DEVICES:=microchip_sama5d27-wlsom1-ek
|
||||
endef
|
||||
|
||||
define U-Boot/sama5d27_wlsom1_ek_qspiflash
|
||||
NAME:=SAMA5D27 WLSOM1 Ek (QSPI Flash)
|
||||
BUILD_SUBTARGET:=sama5
|
||||
BUILD_DEVICES:=microchip_sama5d27-wlsom1-ek
|
||||
endef
|
||||
|
||||
define U-Boot/sama5d2_ptc_ek_nandflash
|
||||
NAME:=SAMA5D2 PTC Ek (Nand Flash)
|
||||
BUILD_SUBTARGET:=sama5
|
||||
@ -117,8 +147,11 @@ UBOOT_TARGETS := \
|
||||
at91sam9m10g45ek_nandflash \
|
||||
at91sam9x5ek_nandflash \
|
||||
at91sam9x5ek_mmc \
|
||||
sam9x60ek_nandflash \
|
||||
sam9x60ek_mmc \
|
||||
sama5d3_xplained_nandflash \
|
||||
sama5d3_xplained_mmc \
|
||||
sama5d2_icp_mmc \
|
||||
sama5d2_xplained_mmc \
|
||||
sama5d2_xplained_spiflash \
|
||||
sama5d4_xplained_mmc \
|
||||
@ -126,6 +159,8 @@ UBOOT_TARGETS := \
|
||||
sama5d4_xplained_nandflash\
|
||||
sama5d27_som1_ek_mmc1 \
|
||||
sama5d27_som1_ek_qspiflash \
|
||||
sama5d27_wlsom1_ek_mmc \
|
||||
sama5d27_wlsom1_ek_qspiflash \
|
||||
sama5d2_ptc_ek_nandflash \
|
||||
sama5d2_ptc_ek_mmc
|
||||
|
||||
|
||||
@ -111,8 +111,6 @@ UBOOT_TARGETS := \
|
||||
|
||||
UBOOT_MAKE_FLAGS += $(UBOOT_IMAGE:.fip=.bin)
|
||||
|
||||
Build/Exports:=$(Host/Exports)
|
||||
|
||||
define Build/fip-image
|
||||
$(STAGING_DIR_HOST)/bin/fiptool create \
|
||||
--soc-fw $(STAGING_DIR_IMAGE)/$(BUILD_SUBTARGET)-$(BL2_BOOTDEV)-$(BL2_DDRBLOB)ddr-bl31.bin \
|
||||
|
||||
@ -53,8 +53,6 @@ UBOOT_TARGETS:= \
|
||||
espressobin \
|
||||
uDPU
|
||||
|
||||
Build/Exports:=$(Host/Exports)
|
||||
|
||||
define Build/Configure
|
||||
# enable additional options beyond <device>_defconfig
|
||||
echo CONFIG_CMD_SETEXPR=y >> $(PKG_BUILD_DIR)/configs/$(UBOOT_CONFIG)_defconfig
|
||||
|
||||
@ -1,14 +0,0 @@
|
||||
OpenWrt links the libressl statically against mkimage, make sure all the
|
||||
needed dependencies are added too.
|
||||
|
||||
--- a/tools/Makefile
|
||||
+++ b/tools/Makefile
|
||||
@@ -168,7 +168,7 @@ ifneq ($(CONFIG_MX23)$(CONFIG_MX28)$(CON
|
||||
HOSTCFLAGS_kwbimage.o += \
|
||||
$(shell pkg-config --cflags libssl libcrypto 2> /dev/null || echo "")
|
||||
HOSTLDLIBS_mkimage += \
|
||||
- $(shell pkg-config --libs libssl libcrypto 2> /dev/null || echo "-lssl -lcrypto")
|
||||
+ $(shell pkg-config --libs --static libssl libcrypto 2> /dev/null || echo "-lssl -lpthread -lcrypto")
|
||||
|
||||
# OS X deprecate openssl in favour of CommonCrypto, supress deprecation
|
||||
# warnings on those systems
|
||||
@ -38,8 +38,6 @@ UBOOT_TARGETS := \
|
||||
|
||||
UBOOT_MAKE_FLAGS += $(UBOOT_IMAGE)
|
||||
|
||||
Build/Exports:=$(Host/Exports)
|
||||
|
||||
define Build/InstallDev
|
||||
$(INSTALL_DIR) $(STAGING_DIR_IMAGE)
|
||||
$(INSTALL_BIN) $(PKG_BUILD_DIR)/$(UBOOT_IMAGE) $(STAGING_DIR_IMAGE)/$(BUILD_VARIANT)-$(UBOOT_IMAGE)
|
||||
|
||||
@ -1,14 +0,0 @@
|
||||
OpenWrt links the libressl statically against mkimage, make sure all the
|
||||
needed dependencies are added too.
|
||||
|
||||
--- a/tools/Makefile
|
||||
+++ b/tools/Makefile
|
||||
@@ -147,7 +147,7 @@ endif
|
||||
# MXSImage needs LibSSL
|
||||
ifneq ($(CONFIG_MX23)$(CONFIG_MX28)$(CONFIG_ARMADA_38X)$(CONFIG_ARMADA_39X)$(CONFIG_FIT_SIGNATURE),)
|
||||
HOSTLOADLIBES_mkimage += \
|
||||
- $(shell pkg-config --libs libssl libcrypto 2> /dev/null || echo "-lssl -lcrypto")
|
||||
+ $(shell pkg-config --libs --static libssl libcrypto 2> /dev/null || echo "-lssl -lpthread -lcrypto")
|
||||
|
||||
# OS X deprecate openssl in favour of CommonCrypto, supress deprecation
|
||||
# warnings on those systems
|
||||
@ -60,6 +60,4 @@ endef
|
||||
define Package/u-boot/install/default
|
||||
endef
|
||||
|
||||
Build/Exports:=$(Host/Exports)
|
||||
|
||||
$(eval $(call BuildPackage/U-Boot))
|
||||
|
||||
@ -1,14 +0,0 @@
|
||||
OpenWrt links the libressl statically against mkimage, make sure all the
|
||||
needed dependencies are added too.
|
||||
|
||||
--- a/tools/Makefile
|
||||
+++ b/tools/Makefile
|
||||
@@ -151,7 +151,7 @@ ifneq ($(CONFIG_MX23)$(CONFIG_MX28)$(CON
|
||||
HOSTCFLAGS_kwbimage.o += \
|
||||
$(shell pkg-config --cflags libssl libcrypto 2> /dev/null || echo "")
|
||||
HOSTLOADLIBES_mkimage += \
|
||||
- $(shell pkg-config --libs libssl libcrypto 2> /dev/null || echo "-lssl -lcrypto")
|
||||
+ $(shell pkg-config --libs --static libssl libcrypto 2> /dev/null || echo "-lssl -lpthread -lcrypto")
|
||||
|
||||
# OS X deprecate openssl in favour of CommonCrypto, supress deprecation
|
||||
# warnings on those systems
|
||||
@ -1,12 +1,12 @@
|
||||
include $(TOPDIR)/rules.mk
|
||||
|
||||
PKG_NAME:=wireless-regdb
|
||||
PKG_VERSION:=2021.04.21
|
||||
PKG_VERSION:=2021.08.28
|
||||
PKG_RELEASE:=1
|
||||
|
||||
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.xz
|
||||
PKG_SOURCE_URL:=@KERNEL/software/network/wireless-regdb/
|
||||
PKG_HASH:=9e4c02b2a9710df4dbdb327c39612e8cbbae6495987afeddaebab28c1ea3d8fa
|
||||
PKG_HASH:=cff370c410d1e6d316ae0a7fa8ac6278fdf1efca5d3d664aca7cfd2aafa54446
|
||||
|
||||
PKG_MAINTAINER:=Felix Fietkau <nbd@nbd.name>
|
||||
|
||||
|
||||
@ -10,10 +10,10 @@ include $(INCLUDE_DIR)/kernel.mk
|
||||
|
||||
PKG_NAME:=mac80211
|
||||
|
||||
PKG_VERSION:=5.10.68-1
|
||||
PKG_VERSION:=5.15-rc6-1
|
||||
PKG_RELEASE:=1
|
||||
PKG_SOURCE_URL:=@KERNEL/linux/kernel/projects/backports/stable/v5.10.68/
|
||||
PKG_HASH:=bba161b0084590c677a84b80993709e388a3c478f29ed0c475d4fce1b9162968
|
||||
PKG_SOURCE_URL:=@KERNEL/linux/kernel/projects/backports/stable/v5.15-rc6/
|
||||
PKG_HASH:=9282612c4c02ef9fc9d74405303033f6b53914cd63d631eef0f43155fcd38932
|
||||
|
||||
PKG_SOURCE:=backports-$(PKG_VERSION).tar.xz
|
||||
PKG_BUILD_DIR:=$(KERNEL_BUILD_DIR)/backports-$(PKG_VERSION)
|
||||
@ -23,7 +23,6 @@ PKG_MAINTAINER:=Felix Fietkau <nbd@nbd.name>
|
||||
|
||||
PKG_DRIVERS = \
|
||||
adm8211 \
|
||||
airo \
|
||||
hermes hermes-pci hermes-pcmcia hermes-plx\
|
||||
lib80211 \
|
||||
mac80211-hwsim \
|
||||
@ -174,18 +173,6 @@ define KernelPackage/adm8211
|
||||
AUTOLOAD:=$(call AutoProbe,adm8211)
|
||||
endef
|
||||
|
||||
define KernelPackage/airo
|
||||
$(call KernelPackage/mac80211/Default)
|
||||
TITLE:=Cisco Aironet driver
|
||||
DEPENDS+=@PCI_SUPPORT +@DRIVER_WEXT_SUPPORT +kmod-cfg80211 @TARGET_x86 @BROKEN
|
||||
FILES:=$(PKG_BUILD_DIR)/drivers/net/wireless/cisco/airo.ko
|
||||
AUTOLOAD:=$(call AutoProbe,airo)
|
||||
endef
|
||||
|
||||
define KernelPackage/airo/description
|
||||
Kernel support for Cisco Aironet cards
|
||||
endef
|
||||
|
||||
define KernelPackage/hermes
|
||||
$(call KernelPackage/mac80211/Default)
|
||||
TITLE:=Hermes 802.11b chipset support
|
||||
@ -406,8 +393,6 @@ endif
|
||||
|
||||
config-$(call config_package,lib80211) += LIB80211 LIB80211_CRYPT_WEP LIB80211_CRYPT_CCMP LIB80211_CRYPT_TKIP
|
||||
|
||||
config-$(call config_package,airo) += AIRO
|
||||
|
||||
config-$(call config_package,mac80211-hwsim) += MAC80211_HWSIM
|
||||
config-$(call config_package,mt7601u) += MT7601U
|
||||
config-y += WL_MEDIATEK
|
||||
|
||||
@ -37,7 +37,7 @@
|
||||
for (band = 0; band < NUM_NL80211_BANDS; band++) {
|
||||
if (!wiphy->bands[band])
|
||||
continue;
|
||||
@@ -378,6 +387,9 @@ ath_reg_apply_ir_flags(struct wiphy *wip
|
||||
@@ -379,6 +388,9 @@ ath_reg_apply_ir_flags(struct wiphy *wip
|
||||
{
|
||||
struct ieee80211_supported_band *sband;
|
||||
|
||||
@ -47,7 +47,7 @@
|
||||
sband = wiphy->bands[NL80211_BAND_2GHZ];
|
||||
if (!sband)
|
||||
return;
|
||||
@@ -407,6 +419,9 @@ static void ath_reg_apply_radar_flags(st
|
||||
@@ -408,6 +420,9 @@ static void ath_reg_apply_radar_flags(st
|
||||
struct ieee80211_channel *ch;
|
||||
unsigned int i;
|
||||
|
||||
@ -57,7 +57,7 @@
|
||||
if (!wiphy->bands[NL80211_BAND_5GHZ])
|
||||
return;
|
||||
|
||||
@@ -639,6 +654,10 @@ ath_regd_init_wiphy(struct ath_regulator
|
||||
@@ -640,6 +655,10 @@ ath_regd_init_wiphy(struct ath_regulator
|
||||
const struct ieee80211_regdomain *regd;
|
||||
|
||||
wiphy->reg_notifier = reg_notifier;
|
||||
@ -82,7 +82,7 @@
|
||||
help
|
||||
--- a/local-symbols
|
||||
+++ b/local-symbols
|
||||
@@ -85,6 +85,7 @@ ADM8211=
|
||||
@@ -76,6 +76,7 @@ ADM8211=
|
||||
ATH_COMMON=
|
||||
WLAN_VENDOR_ATH=
|
||||
ATH_DEBUG=
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
--- a/net/wireless/reg.c
|
||||
+++ b/net/wireless/reg.c
|
||||
@@ -3252,6 +3252,8 @@ void regulatory_hint_country_ie(struct w
|
||||
@@ -3299,6 +3299,8 @@ void regulatory_hint_country_ie(struct w
|
||||
enum environment_cap env = ENVIRON_ANY;
|
||||
struct regulatory_request *request = NULL, *lr;
|
||||
|
||||
@ -9,7 +9,7 @@
|
||||
/* IE len must be evenly divisible by 2 */
|
||||
if (country_ie_len & 0x01)
|
||||
return;
|
||||
@@ -3503,6 +3505,7 @@ static bool is_wiphy_all_set_reg_flag(en
|
||||
@@ -3550,6 +3552,7 @@ static bool is_wiphy_all_set_reg_flag(en
|
||||
|
||||
void regulatory_hint_disconnect(void)
|
||||
{
|
||||
|
||||
@ -39,7 +39,7 @@
|
||||
bool ath_is_world_regd(struct ath_regulatory *reg)
|
||||
{
|
||||
return is_wwr_sku(ath_regd_get_eepromRD(reg));
|
||||
@@ -658,6 +666,9 @@ ath_regd_init_wiphy(struct ath_regulator
|
||||
@@ -659,6 +667,9 @@ ath_regd_init_wiphy(struct ath_regulator
|
||||
if (IS_ENABLED(CPTCFG_ATH_USER_REGD))
|
||||
return 0;
|
||||
|
||||
|
||||
@ -37,7 +37,7 @@
|
||||
void ath10k_thermal_event_temperature(struct ath10k *ar, int temperature);
|
||||
--- a/local-symbols
|
||||
+++ b/local-symbols
|
||||
@@ -144,6 +144,7 @@ ATH10K_SNOC=
|
||||
@@ -135,6 +135,7 @@ ATH10K_SNOC=
|
||||
ATH10K_DEBUG=
|
||||
ATH10K_DEBUGFS=
|
||||
ATH10K_SPECTRAL=
|
||||
|
||||
@ -14,7 +14,7 @@ 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
|
||||
@@ -3189,6 +3189,16 @@ int ath10k_core_register(struct ath10k *
|
||||
@@ -3345,6 +3345,16 @@ int ath10k_core_register(struct ath10k *
|
||||
|
||||
queue_work(ar->workqueue, &ar->register_work);
|
||||
|
||||
|
||||
@ -1,37 +0,0 @@
|
||||
From: Linus Lüssing <ll@simonwunderlich.de>
|
||||
Date: Wed, 5 Feb 2020 20:10:43 +0100
|
||||
Subject: ath10k: increase rx buffer size to 2048
|
||||
|
||||
Before, only frames with a maximum size of 1528 bytes could be
|
||||
transmitted between two 802.11s nodes.
|
||||
|
||||
For batman-adv for instance, which adds its own header to each frame,
|
||||
we typically need an MTU of at least 1532 bytes to be able to transmit
|
||||
without fragmentation.
|
||||
|
||||
This patch now increases the maxmimum frame size from 1528 to 1656
|
||||
bytes.
|
||||
|
||||
Tested with two ath10k devices in 802.11s mode, as well as with
|
||||
batman-adv on top of 802.11s with forwarding disabled.
|
||||
|
||||
Fix originally found and developed by Ben Greear.
|
||||
|
||||
Link: https://github.com/greearb/ath10k-ct/issues/89
|
||||
Link: https://github.com/greearb/ath10k-ct/commit/9e5ab25027e0971fa24ccf93373324c08c4e992d
|
||||
Cc: Ben Greear <greearb@candelatech.com>
|
||||
Signed-off-by: Linus Lüssing <ll@simonwunderlich.de>
|
||||
|
||||
Forwarded: https://patchwork.kernel.org/patch/11367055/
|
||||
|
||||
--- a/drivers/net/wireless/ath/ath10k/htt.h
|
||||
+++ b/drivers/net/wireless/ath/ath10k/htt.h
|
||||
@@ -2243,7 +2243,7 @@ struct htt_rx_chan_info {
|
||||
* Should be: sizeof(struct htt_host_rx_desc) + max rx MSDU size,
|
||||
* rounded up to a cache line size.
|
||||
*/
|
||||
-#define HTT_RX_BUF_SIZE 1920
|
||||
+#define HTT_RX_BUF_SIZE 2048
|
||||
#define HTT_RX_MSDU_SIZE (HTT_RX_BUF_SIZE - (int)sizeof(struct htt_rx_desc))
|
||||
|
||||
/* Refill a bunch of RX buffers for each refill round so that FW/HW can handle
|
||||
@ -1,6 +1,6 @@
|
||||
--- a/drivers/net/wireless/ath/ath10k/mac.c
|
||||
+++ b/drivers/net/wireless/ath/ath10k/mac.c
|
||||
@@ -9709,6 +9709,21 @@ static int ath10k_mac_init_rd(struct ath
|
||||
@@ -9820,6 +9820,21 @@ static int ath10k_mac_init_rd(struct ath
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -22,7 +22,7 @@
|
||||
int ath10k_mac_register(struct ath10k *ar)
|
||||
{
|
||||
static const u32 cipher_suites[] = {
|
||||
@@ -10058,6 +10073,12 @@ int ath10k_mac_register(struct ath10k *a
|
||||
@@ -10172,6 +10187,12 @@ int ath10k_mac_register(struct ath10k *a
|
||||
|
||||
ar->hw->weight_multiplier = ATH10K_AIRTIME_WEIGHT_MULTIPLIER;
|
||||
|
||||
|
||||
@ -85,7 +85,7 @@ v13:
|
||||
create mode 100644 drivers/net/wireless/ath/ath10k/leds.h
|
||||
--- a/drivers/net/wireless/ath/ath10k/Kconfig
|
||||
+++ b/drivers/net/wireless/ath/ath10k/Kconfig
|
||||
@@ -70,6 +70,16 @@ config ATH10K_DEBUGFS
|
||||
@@ -71,6 +71,16 @@ config ATH10K_DEBUGFS
|
||||
|
||||
If unsure, say Y to make it easier to debug problems.
|
||||
|
||||
@ -114,7 +114,7 @@ v13:
|
||||
ath10k_core-$(CONFIG_DEV_COREDUMP) += coredump.o
|
||||
--- a/local-symbols
|
||||
+++ b/local-symbols
|
||||
@@ -145,6 +145,7 @@ ATH10K_DEBUG=
|
||||
@@ -136,6 +136,7 @@ ATH10K_DEBUG=
|
||||
ATH10K_DEBUGFS=
|
||||
ATH10K_SPECTRAL=
|
||||
ATH10K_THERMAL=
|
||||
@ -140,7 +140,7 @@ v13:
|
||||
.patch_load_addr = QCA988X_HW_2_0_PATCH_LOAD_ADDR,
|
||||
.uart_pin = 7,
|
||||
.cc_wraparound_type = ATH10K_HW_CC_WRAP_SHIFTED_ALL,
|
||||
@@ -130,6 +132,7 @@ static const struct ath10k_hw_params ath
|
||||
@@ -132,6 +134,7 @@ static const struct ath10k_hw_params ath
|
||||
.dev_id = QCA9887_1_0_DEVICE_ID,
|
||||
.bus = ATH10K_BUS_PCI,
|
||||
.name = "qca9887 hw1.0",
|
||||
@ -148,7 +148,7 @@ v13:
|
||||
.patch_load_addr = QCA9887_HW_1_0_PATCH_LOAD_ADDR,
|
||||
.uart_pin = 7,
|
||||
.cc_wraparound_type = ATH10K_HW_CC_WRAP_SHIFTED_ALL,
|
||||
@@ -335,6 +338,7 @@ static const struct ath10k_hw_params ath
|
||||
@@ -343,6 +346,7 @@ static const struct ath10k_hw_params ath
|
||||
.dev_id = QCA99X0_2_0_DEVICE_ID,
|
||||
.bus = ATH10K_BUS_PCI,
|
||||
.name = "qca99x0 hw2.0",
|
||||
@ -156,7 +156,7 @@ v13:
|
||||
.patch_load_addr = QCA99X0_HW_2_0_PATCH_LOAD_ADDR,
|
||||
.uart_pin = 7,
|
||||
.otp_exe_param = 0x00000700,
|
||||
@@ -375,6 +379,7 @@ static const struct ath10k_hw_params ath
|
||||
@@ -384,6 +388,7 @@ static const struct ath10k_hw_params ath
|
||||
.dev_id = QCA9984_1_0_DEVICE_ID,
|
||||
.bus = ATH10K_BUS_PCI,
|
||||
.name = "qca9984/qca9994 hw1.0",
|
||||
@ -164,7 +164,7 @@ v13:
|
||||
.patch_load_addr = QCA9984_HW_1_0_PATCH_LOAD_ADDR,
|
||||
.uart_pin = 7,
|
||||
.cc_wraparound_type = ATH10K_HW_CC_WRAP_SHIFTED_EACH,
|
||||
@@ -422,6 +427,7 @@ static const struct ath10k_hw_params ath
|
||||
@@ -432,6 +437,7 @@ static const struct ath10k_hw_params ath
|
||||
.dev_id = QCA9888_2_0_DEVICE_ID,
|
||||
.bus = ATH10K_BUS_PCI,
|
||||
.name = "qca9888 hw2.0",
|
||||
@ -172,7 +172,7 @@ v13:
|
||||
.patch_load_addr = QCA9888_HW_2_0_PATCH_LOAD_ADDR,
|
||||
.uart_pin = 7,
|
||||
.cc_wraparound_type = ATH10K_HW_CC_WRAP_SHIFTED_EACH,
|
||||
@@ -2904,6 +2910,10 @@ int ath10k_core_start(struct ath10k *ar,
|
||||
@@ -3060,6 +3066,10 @@ int ath10k_core_start(struct ath10k *ar,
|
||||
goto err_hif_stop;
|
||||
}
|
||||
|
||||
@ -183,7 +183,7 @@ v13:
|
||||
return 0;
|
||||
|
||||
err_hif_stop:
|
||||
@@ -3162,9 +3172,18 @@ static void ath10k_core_register_work(st
|
||||
@@ -3318,9 +3328,18 @@ static void ath10k_core_register_work(st
|
||||
goto err_spectral_destroy;
|
||||
}
|
||||
|
||||
@ -202,7 +202,7 @@ v13:
|
||||
err_spectral_destroy:
|
||||
ath10k_spectral_destroy(ar);
|
||||
err_debug_destroy:
|
||||
@@ -3210,6 +3229,8 @@ void ath10k_core_unregister(struct ath10
|
||||
@@ -3366,6 +3385,8 @@ void ath10k_core_unregister(struct ath10
|
||||
if (!test_bit(ATH10K_FLAG_CORE_REGISTERED, &ar->dev_flags))
|
||||
return;
|
||||
|
||||
@ -221,7 +221,7 @@ v13:
|
||||
|
||||
#include "htt.h"
|
||||
#include "htc.h"
|
||||
@@ -1237,6 +1238,13 @@ struct ath10k {
|
||||
@@ -1250,6 +1251,13 @@ struct ath10k {
|
||||
} testmode;
|
||||
|
||||
struct {
|
||||
|
||||
@ -16,9 +16,9 @@ Signed-off-by: Mathias Kresin <dev@kresin.me>
|
||||
|
||||
--- a/drivers/net/wireless/ath/ath10k/core.h
|
||||
+++ b/drivers/net/wireless/ath/ath10k/core.h
|
||||
@@ -1290,6 +1290,10 @@ struct ath10k {
|
||||
bool coex_support;
|
||||
int coex_gpio_pin;
|
||||
@@ -1306,6 +1306,10 @@ struct ath10k {
|
||||
s32 tx_power_2g_limit;
|
||||
s32 tx_power_5g_limit;
|
||||
|
||||
+#ifdef CPTCFG_MAC80211_LEDS
|
||||
+ const char *led_default_trigger;
|
||||
@ -42,7 +42,7 @@ Signed-off-by: Mathias Kresin <dev@kresin.me>
|
||||
if (ret)
|
||||
--- a/drivers/net/wireless/ath/ath10k/mac.c
|
||||
+++ b/drivers/net/wireless/ath/ath10k/mac.c
|
||||
@@ -10075,7 +10075,7 @@ int ath10k_mac_register(struct ath10k *a
|
||||
@@ -10189,7 +10189,7 @@ int ath10k_mac_register(struct ath10k *a
|
||||
ar->hw->weight_multiplier = ATH10K_AIRTIME_WEIGHT_MULTIPLIER;
|
||||
|
||||
#ifdef CPTCFG_MAC80211_LEDS
|
||||
|
||||
@ -20,7 +20,7 @@ Forwarded: https://patchwork.kernel.org/patch/10986723/
|
||||
|
||||
--- a/drivers/net/wireless/ath/ath10k/mac.c
|
||||
+++ b/drivers/net/wireless/ath/ath10k/mac.c
|
||||
@@ -1038,7 +1038,7 @@ static int ath10k_monitor_vdev_start(str
|
||||
@@ -1049,7 +1049,7 @@ static int ath10k_monitor_vdev_start(str
|
||||
arg.channel.min_power = 0;
|
||||
arg.channel.max_power = channel->max_power * 2;
|
||||
arg.channel.max_reg_power = channel->max_reg_power * 2;
|
||||
@ -29,7 +29,7 @@ Forwarded: https://patchwork.kernel.org/patch/10986723/
|
||||
|
||||
reinit_completion(&ar->vdev_setup_done);
|
||||
reinit_completion(&ar->vdev_delete_done);
|
||||
@@ -1484,7 +1484,7 @@ static int ath10k_vdev_start_restart(str
|
||||
@@ -1495,7 +1495,7 @@ static int ath10k_vdev_start_restart(str
|
||||
arg.channel.min_power = 0;
|
||||
arg.channel.max_power = chandef->chan->max_power * 2;
|
||||
arg.channel.max_reg_power = chandef->chan->max_reg_power * 2;
|
||||
@ -38,7 +38,7 @@ Forwarded: https://patchwork.kernel.org/patch/10986723/
|
||||
|
||||
if (arvif->vdev_type == WMI_VDEV_TYPE_AP) {
|
||||
arg.ssid = arvif->u.ap.ssid;
|
||||
@@ -3255,7 +3255,7 @@ static int ath10k_update_channel_list(st
|
||||
@@ -3423,7 +3423,7 @@ static int ath10k_update_channel_list(st
|
||||
ch->min_power = 0;
|
||||
ch->max_power = channel->max_power * 2;
|
||||
ch->max_reg_power = channel->max_reg_power * 2;
|
||||
|
||||
@ -28,7 +28,7 @@ Forwarded: no
|
||||
|
||||
--- a/drivers/net/wireless/ath/ath10k/mac.c
|
||||
+++ b/drivers/net/wireless/ath/ath10k/mac.c
|
||||
@@ -1006,6 +1006,40 @@ static inline int ath10k_vdev_setup_sync
|
||||
@@ -1017,6 +1017,40 @@ static inline int ath10k_vdev_setup_sync
|
||||
return ar->last_wmi_vdev_start_status;
|
||||
}
|
||||
|
||||
@ -69,7 +69,7 @@ Forwarded: no
|
||||
static int ath10k_monitor_vdev_start(struct ath10k *ar, int vdev_id)
|
||||
{
|
||||
struct cfg80211_chan_def *chandef = NULL;
|
||||
@@ -1038,7 +1072,8 @@ static int ath10k_monitor_vdev_start(str
|
||||
@@ -1049,7 +1083,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;
|
||||
@ -79,7 +79,7 @@ Forwarded: no
|
||||
|
||||
reinit_completion(&ar->vdev_setup_done);
|
||||
reinit_completion(&ar->vdev_delete_done);
|
||||
@@ -1484,7 +1519,8 @@ static int ath10k_vdev_start_restart(str
|
||||
@@ -1495,7 +1530,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;
|
||||
@ -89,7 +89,7 @@ Forwarded: no
|
||||
|
||||
if (arvif->vdev_type == WMI_VDEV_TYPE_AP) {
|
||||
arg.ssid = arvif->u.ap.ssid;
|
||||
@@ -3255,7 +3291,8 @@ static int ath10k_update_channel_list(st
|
||||
@@ -3423,7 +3459,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;
|
||||
|
||||
@ -26,7 +26,7 @@ Signed-off-by: Ansuel Smith <ansuelsmth@gmail.com>
|
||||
#include <linux/property.h>
|
||||
#include <linux/dmi.h>
|
||||
#include <linux/ctype.h>
|
||||
@@ -3080,6 +3081,8 @@ static int ath10k_core_probe_fw(struct a
|
||||
@@ -3236,6 +3237,8 @@ static int ath10k_core_probe_fw(struct a
|
||||
|
||||
device_get_mac_address(ar->dev, ar->mac_addr, sizeof(ar->mac_addr));
|
||||
|
||||
|
||||
@ -18,7 +18,7 @@
|
||||
goto end;
|
||||
--- a/drivers/net/wireless/ath/ath5k/base.c
|
||||
+++ b/drivers/net/wireless/ath/ath5k/base.c
|
||||
@@ -1964,7 +1964,7 @@ ath5k_beacon_send(struct ath5k_hw *ah)
|
||||
@@ -1963,7 +1963,7 @@ ath5k_beacon_send(struct ath5k_hw *ah)
|
||||
}
|
||||
|
||||
if ((ah->opmode == NL80211_IFTYPE_AP && ah->num_ap_vifs +
|
||||
@ -27,7 +27,7 @@
|
||||
ah->opmode == NL80211_IFTYPE_MESH_POINT) {
|
||||
u64 tsf = ath5k_hw_get_tsf64(ah);
|
||||
u32 tsftu = TSF_TO_TU(tsf);
|
||||
@@ -2050,7 +2050,7 @@ ath5k_beacon_update_timers(struct ath5k_
|
||||
@@ -2049,7 +2049,7 @@ ath5k_beacon_update_timers(struct ath5k_
|
||||
|
||||
intval = ah->bintval & AR5K_BEACON_PERIOD;
|
||||
if (ah->opmode == NL80211_IFTYPE_AP && ah->num_ap_vifs
|
||||
@ -36,7 +36,7 @@
|
||||
intval /= ATH_BCBUF; /* staggered multi-bss beacons */
|
||||
if (intval < 15)
|
||||
ATH5K_WARN(ah, "intval %u is too low, min 15\n",
|
||||
@@ -2516,6 +2516,7 @@ static const struct ieee80211_iface_limi
|
||||
@@ -2515,6 +2515,7 @@ static const struct ieee80211_iface_limi
|
||||
BIT(NL80211_IFTYPE_MESH_POINT) |
|
||||
#endif
|
||||
BIT(NL80211_IFTYPE_AP) },
|
||||
|
||||
@ -130,7 +130,7 @@ drivers/net/wireless/ath/ath5k/debug.c | 86 ++++++++++++++++++++++++++++++++
|
||||
/* Antenna Control */
|
||||
--- a/drivers/net/wireless/ath/ath5k/base.c
|
||||
+++ b/drivers/net/wireless/ath/ath5k/base.c
|
||||
@@ -466,6 +466,9 @@ ath5k_chan_set(struct ath5k_hw *ah, stru
|
||||
@@ -465,6 +465,9 @@ ath5k_chan_set(struct ath5k_hw *ah, stru
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
|
||||
@ -9,7 +9,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
|
||||
|
||||
--- a/drivers/net/wireless/ath/ath9k/hw.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/hw.c
|
||||
@@ -1435,8 +1435,12 @@ static bool ath9k_hw_set_reset(struct at
|
||||
@@ -1434,8 +1434,12 @@ static bool ath9k_hw_set_reset(struct at
|
||||
if (!AR_SREV_9100(ah))
|
||||
REG_WRITE(ah, AR_RC, 0);
|
||||
|
||||
|
||||
@ -10,7 +10,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
|
||||
|
||||
--- a/drivers/net/wireless/ath/ath9k/hw.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/hw.c
|
||||
@@ -1312,39 +1312,56 @@ void ath9k_hw_get_delta_slope_vals(struc
|
||||
@@ -1311,39 +1311,56 @@ void ath9k_hw_get_delta_slope_vals(struc
|
||||
*coef_exponent = coef_exp - 16;
|
||||
}
|
||||
|
||||
@ -94,7 +94,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -1397,24 +1414,24 @@ static bool ath9k_hw_set_reset(struct at
|
||||
@@ -1396,24 +1413,24 @@ static bool ath9k_hw_set_reset(struct at
|
||||
rst_flags |= AR_RTC_RC_MAC_COLD;
|
||||
}
|
||||
|
||||
|
||||
@ -8,7 +8,7 @@ This reverts commit 71f5137bf010c6faffab50c0ec15374c59c4a411.
|
||||
|
||||
--- a/drivers/net/wireless/ath/ath9k/hw.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/hw.c
|
||||
@@ -2979,7 +2979,8 @@ void ath9k_hw_apply_txpower(struct ath_h
|
||||
@@ -2977,7 +2977,8 @@ void ath9k_hw_apply_txpower(struct ath_h
|
||||
{
|
||||
struct ath_regulatory *reg = ath9k_hw_regulatory(ah);
|
||||
struct ieee80211_channel *channel;
|
||||
@ -18,7 +18,7 @@ This reverts commit 71f5137bf010c6faffab50c0ec15374c59c4a411.
|
||||
u16 ctl = NO_CTL;
|
||||
|
||||
if (!chan)
|
||||
@@ -2991,9 +2992,14 @@ void ath9k_hw_apply_txpower(struct ath_h
|
||||
@@ -2989,9 +2990,14 @@ void ath9k_hw_apply_txpower(struct ath_h
|
||||
channel = chan->chan;
|
||||
chan_pwr = min_t(int, channel->max_power * 2, MAX_COMBINED_POWER);
|
||||
new_pwr = min_t(int, chan_pwr, reg->power_limit);
|
||||
|
||||
@ -11,7 +11,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
|
||||
|
||||
--- a/drivers/net/wireless/ath/ath9k/hw.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/hw.c
|
||||
@@ -2998,6 +2998,10 @@ void ath9k_hw_apply_txpower(struct ath_h
|
||||
@@ -2996,6 +2996,10 @@ void ath9k_hw_apply_txpower(struct ath_h
|
||||
if (ant_gain > max_gain)
|
||||
ant_reduction = ant_gain - max_gain;
|
||||
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
--- a/drivers/net/wireless/ath/ath9k/init.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/init.c
|
||||
@@ -48,7 +48,7 @@ int ath9k_modparam_nohwcrypt;
|
||||
@@ -47,7 +47,7 @@ int ath9k_modparam_nohwcrypt;
|
||||
module_param_named(nohwcrypt, ath9k_modparam_nohwcrypt, int, 0444);
|
||||
MODULE_PARM_DESC(nohwcrypt, "Disable hardware encryption");
|
||||
|
||||
|
||||
@ -1,10 +1,10 @@
|
||||
--- a/drivers/net/wireless/ath/ath9k/init.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/init.c
|
||||
@@ -827,6 +827,7 @@ static const struct ieee80211_iface_limi
|
||||
@@ -826,6 +826,7 @@ static const struct ieee80211_iface_limi
|
||||
BIT(NL80211_IFTYPE_AP) },
|
||||
{ .max = 1, .types = BIT(NL80211_IFTYPE_P2P_CLIENT) |
|
||||
BIT(NL80211_IFTYPE_P2P_GO) },
|
||||
+ { .max = 1, .types = BIT(NL80211_IFTYPE_ADHOC) },
|
||||
};
|
||||
|
||||
#ifdef CPTCFG_WIRELESS_WDS
|
||||
#ifdef CPTCFG_ATH9K_CHANNEL_CONTEXT
|
||||
|
||||
@ -14,7 +14,7 @@ Signed-off-by: David Bauer <mail@david-bauer.net>
|
||||
|
||||
--- a/drivers/net/wireless/ath/ath9k/init.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/init.c
|
||||
@@ -924,6 +924,7 @@ static void ath9k_set_hw_capab(struct at
|
||||
@@ -907,6 +907,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);
|
||||
@ -22,7 +22,7 @@ Signed-off-by: David Bauer <mail@david-bauer.net>
|
||||
|
||||
if (ath9k_ps_enable)
|
||||
ieee80211_hw_set(hw, SUPPORTS_PS);
|
||||
@@ -936,9 +937,6 @@ static void ath9k_set_hw_capab(struct at
|
||||
@@ -919,9 +920,6 @@ static void ath9k_set_hw_capab(struct at
|
||||
IEEE80211_RADIOTAP_MCS_HAVE_STBC;
|
||||
}
|
||||
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
--- a/drivers/net/wireless/ath/ath9k/init.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/init.c
|
||||
@@ -1140,25 +1140,25 @@ static int __init ath9k_init(void)
|
||||
@@ -1120,25 +1120,25 @@ static int __init ath9k_init(void)
|
||||
{
|
||||
int error;
|
||||
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
--- a/drivers/net/wireless/ath/ath9k/hw.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/hw.c
|
||||
@@ -403,13 +403,8 @@ static void ath9k_hw_init_config(struct
|
||||
@@ -402,13 +402,8 @@ static void ath9k_hw_init_config(struct
|
||||
|
||||
ah->config.rx_intr_mitigation = true;
|
||||
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
--- a/drivers/net/wireless/ath/ath9k/hw.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/hw.c
|
||||
@@ -663,6 +663,7 @@ int ath9k_hw_init(struct ath_hw *ah)
|
||||
@@ -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) {
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
--- 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
|
||||
@@ -843,6 +843,9 @@ static inline int ath9k_dump_btcoex(stru
|
||||
#ifdef CPTCFG_MAC80211_LEDS
|
||||
void ath_init_leds(struct ath_softc *sc);
|
||||
void ath_deinit_leds(struct ath_softc *sc);
|
||||
@ -10,7 +10,7 @@
|
||||
#else
|
||||
static inline void ath_init_leds(struct ath_softc *sc)
|
||||
{
|
||||
@@ -980,6 +983,13 @@ void ath_ant_comb_scan(struct ath_softc
|
||||
@@ -979,6 +982,13 @@ void ath_ant_comb_scan(struct ath_softc
|
||||
|
||||
#define ATH9K_NUM_CHANCTX 2 /* supports 2 operating channels */
|
||||
|
||||
@ -24,7 +24,7 @@
|
||||
struct ath_softc {
|
||||
struct ieee80211_hw *hw;
|
||||
struct device *dev;
|
||||
@@ -1033,9 +1043,8 @@ struct ath_softc {
|
||||
@@ -1032,9 +1042,8 @@ struct ath_softc {
|
||||
spinlock_t chan_lock;
|
||||
|
||||
#ifdef CPTCFG_MAC80211_LEDS
|
||||
@ -181,7 +181,7 @@
|
||||
|
||||
--- a/drivers/net/wireless/ath/ath9k/init.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/init.c
|
||||
@@ -1052,7 +1052,7 @@ int ath9k_init_device(u16 devid, struct
|
||||
@@ -1032,7 +1032,7 @@ int ath9k_init_device(u16 devid, struct
|
||||
|
||||
#ifdef CPTCFG_MAC80211_LEDS
|
||||
/* must be initialized before ieee80211_register_hw */
|
||||
|
||||
@ -94,7 +94,7 @@
|
||||
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
|
||||
@@ -1882,6 +1882,20 @@ u32 ath9k_hw_get_tsf_offset(struct times
|
||||
@@ -1881,6 +1881,20 @@ u32 ath9k_hw_get_tsf_offset(struct times
|
||||
}
|
||||
EXPORT_SYMBOL(ath9k_hw_get_tsf_offset);
|
||||
|
||||
@ -115,7 +115,7 @@
|
||||
int ath9k_hw_reset(struct ath_hw *ah, struct ath9k_channel *chan,
|
||||
struct ath9k_hw_cal_data *caldata, bool fastcc)
|
||||
{
|
||||
@@ -2090,6 +2104,7 @@ int ath9k_hw_reset(struct ath_hw *ah, st
|
||||
@@ -2089,6 +2103,7 @@ int ath9k_hw_reset(struct ath_hw *ah, st
|
||||
ar9003_hw_disable_phy_restart(ah);
|
||||
|
||||
ath9k_hw_apply_gpio_override(ah);
|
||||
|
||||
@ -55,7 +55,7 @@
|
||||
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
|
||||
@@ -815,7 +815,8 @@ static void ath9k_init_txpower_limits(st
|
||||
@@ -814,7 +814,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);
|
||||
|
||||
@ -65,7 +65,7 @@
|
||||
}
|
||||
|
||||
static const struct ieee80211_iface_limit if_limits[] = {
|
||||
@@ -1012,6 +1013,18 @@ static void ath9k_set_hw_capab(struct at
|
||||
@@ -992,6 +993,18 @@ static void ath9k_set_hw_capab(struct at
|
||||
wiphy_ext_feature_set(hw->wiphy, NL80211_EXT_FEATURE_CAN_REPLACE_PTK0);
|
||||
}
|
||||
|
||||
@ -84,7 +84,7 @@
|
||||
int ath9k_init_device(u16 devid, struct ath_softc *sc,
|
||||
const struct ath_bus_ops *bus_ops)
|
||||
{
|
||||
@@ -1057,6 +1070,8 @@ int ath9k_init_device(u16 devid, struct
|
||||
@@ -1037,6 +1050,8 @@ int ath9k_init_device(u16 devid, struct
|
||||
ARRAY_SIZE(ath9k_tpt_blink));
|
||||
#endif
|
||||
|
||||
@ -110,7 +110,7 @@
|
||||
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
|
||||
@@ -1349,9 +1349,30 @@ void ar5008_hw_init_rate_txpower(struct
|
||||
@@ -1340,9 +1340,30 @@ void ar5008_hw_init_rate_txpower(struct
|
||||
}
|
||||
}
|
||||
|
||||
@ -141,7 +141,7 @@
|
||||
static const u32 ar5416_cca_regs[6] = {
|
||||
AR_PHY_CCA,
|
||||
AR_PHY_CH1_CCA,
|
||||
@@ -1366,6 +1387,8 @@ int ar5008_hw_attach_phy_ops(struct ath_
|
||||
@@ -1357,6 +1378,8 @@ int ar5008_hw_attach_phy_ops(struct ath_
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
--- a/drivers/net/wireless/ath/ath9k/hw.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/hw.c
|
||||
@@ -248,6 +248,19 @@ void ath9k_hw_get_channel_centers(struct
|
||||
@@ -247,6 +247,19 @@ void ath9k_hw_get_channel_centers(struct
|
||||
centers->synth_center + (extoff * HT40_CHANNEL_CENTER_SHIFT);
|
||||
}
|
||||
|
||||
@ -20,7 +20,7 @@
|
||||
/******************/
|
||||
/* Chip Revisions */
|
||||
/******************/
|
||||
@@ -1455,6 +1468,9 @@ static bool ath9k_hw_set_reset(struct at
|
||||
@@ -1454,6 +1467,9 @@ static bool ath9k_hw_set_reset(struct at
|
||||
udelay(50);
|
||||
}
|
||||
|
||||
@ -30,7 +30,7 @@
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -1554,6 +1570,9 @@ static bool ath9k_hw_chip_reset(struct a
|
||||
@@ -1553,6 +1569,9 @@ static bool ath9k_hw_chip_reset(struct a
|
||||
ar9003_hw_internal_regulator_apply(ah);
|
||||
ath9k_hw_init_pll(ah, chan);
|
||||
|
||||
@ -40,7 +40,7 @@
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -1860,8 +1879,14 @@ static int ath9k_hw_do_fastcc(struct ath
|
||||
@@ -1859,8 +1878,14 @@ static int ath9k_hw_do_fastcc(struct ath
|
||||
if (AR_SREV_9271(ah))
|
||||
ar9002_hw_load_ani_reg(ah, chan);
|
||||
|
||||
@ -55,7 +55,7 @@
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
@@ -2115,6 +2140,9 @@ int ath9k_hw_reset(struct ath_hw *ah, st
|
||||
@@ -2114,6 +2139,9 @@ int ath9k_hw_reset(struct ath_hw *ah, st
|
||||
ath9k_hw_set_radar_params(ah);
|
||||
}
|
||||
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
--- a/drivers/net/wireless/ath/ath9k/ar5008_phy.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/ar5008_phy.c
|
||||
@@ -978,55 +978,6 @@ static bool ar5008_hw_ani_control_new(st
|
||||
@@ -969,55 +969,6 @@ static bool ar5008_hw_ani_control_new(st
|
||||
* on == 0 means more noise imm
|
||||
*/
|
||||
u32 on = param ? 1 : 0;
|
||||
|
||||
@ -18,7 +18,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
|
||||
|
||||
#include "common.h"
|
||||
#include "debug.h"
|
||||
@@ -990,6 +991,14 @@ struct ath_led {
|
||||
@@ -989,6 +990,14 @@ struct ath_led {
|
||||
struct led_classdev cdev;
|
||||
};
|
||||
|
||||
@ -33,7 +33,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
|
||||
struct ath_softc {
|
||||
struct ieee80211_hw *hw;
|
||||
struct device *dev;
|
||||
@@ -1045,6 +1054,9 @@ struct ath_softc {
|
||||
@@ -1044,6 +1053,9 @@ struct ath_softc {
|
||||
#ifdef CPTCFG_MAC80211_LEDS
|
||||
const char *led_default_trigger;
|
||||
struct list_head leds;
|
||||
|
||||
@ -10,7 +10,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
|
||||
---
|
||||
--- a/drivers/net/wireless/ath/ath9k/ath9k.h
|
||||
+++ b/drivers/net/wireless/ath/ath9k/ath9k.h
|
||||
@@ -1056,6 +1056,7 @@ struct ath_softc {
|
||||
@@ -1055,6 +1055,7 @@ struct ath_softc {
|
||||
struct list_head leds;
|
||||
#ifdef CONFIG_GPIOLIB
|
||||
struct ath9k_gpio_chip *gpiochip;
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
--- a/drivers/net/wireless/ath/ath9k/init.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/init.c
|
||||
@@ -626,6 +626,12 @@ static int ath9k_of_init(struct ath_soft
|
||||
@@ -625,6 +625,12 @@ static int ath9k_of_init(struct ath_soft
|
||||
|
||||
ath_dbg(common, CONFIG, "parsing configuration from OF node\n");
|
||||
|
||||
|
||||
@ -371,7 +371,7 @@
|
||||
|
||||
--- a/local-symbols
|
||||
+++ b/local-symbols
|
||||
@@ -112,6 +112,7 @@ ATH9K_WOW=
|
||||
@@ -103,6 +103,7 @@ ATH9K_WOW=
|
||||
ATH9K_RFKILL=
|
||||
ATH9K_CHANNEL_CONTEXT=
|
||||
ATH9K_PCOEM=
|
||||
|
||||
@ -325,7 +325,7 @@
|
||||
|
||||
#include "common.h"
|
||||
#include "debug.h"
|
||||
@@ -1012,6 +1013,9 @@ struct ath_softc {
|
||||
@@ -1011,6 +1012,9 @@ struct ath_softc {
|
||||
struct ath_hw *sc_ah;
|
||||
void __iomem *mem;
|
||||
int irq;
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
--- a/drivers/net/wireless/ath/ath9k/init.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/init.c
|
||||
@@ -651,6 +651,12 @@ static int ath9k_of_init(struct ath_soft
|
||||
@@ -650,6 +650,12 @@ static int ath9k_of_init(struct ath_soft
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -13,7 +13,7 @@
|
||||
static int ath9k_init_softc(u16 devid, struct ath_softc *sc,
|
||||
const struct ath_bus_ops *bus_ops)
|
||||
{
|
||||
@@ -754,6 +760,9 @@ static int ath9k_init_softc(u16 devid, s
|
||||
@@ -753,6 +759,9 @@ static int ath9k_init_softc(u16 devid, s
|
||||
if (ret)
|
||||
goto err_hw;
|
||||
|
||||
|
||||
@ -42,7 +42,7 @@
|
||||
|
||||
if (wl->radio_enabled != phy->radio_on) {
|
||||
if (wl->radio_enabled) {
|
||||
@@ -5176,6 +5173,47 @@ static int b43_op_get_survey(struct ieee
|
||||
@@ -5175,6 +5172,47 @@ static int b43_op_get_survey(struct ieee
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -90,7 +90,7 @@
|
||||
static const struct ieee80211_ops b43_hw_ops = {
|
||||
.tx = b43_op_tx,
|
||||
.conf_tx = b43_op_conf_tx,
|
||||
@@ -5197,6 +5235,8 @@ static const struct ieee80211_ops b43_hw
|
||||
@@ -5196,6 +5234,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,
|
||||
@ -99,7 +99,7 @@
|
||||
};
|
||||
|
||||
/* Hard-reset the chip. Do not call this directly.
|
||||
@@ -5498,6 +5538,8 @@ static int b43_one_core_attach(struct b4
|
||||
@@ -5497,6 +5537,8 @@ static int b43_one_core_attach(struct b4
|
||||
if (!wldev)
|
||||
goto out;
|
||||
|
||||
@ -108,7 +108,7 @@
|
||||
wldev->use_pio = b43_modparam_pio;
|
||||
wldev->dev = dev;
|
||||
wldev->wl = wl;
|
||||
@@ -5592,6 +5634,9 @@ static struct b43_wl *b43_wireless_init(
|
||||
@@ -5588,6 +5630,9 @@ static struct b43_wl *b43_wireless_init(
|
||||
|
||||
wiphy_ext_feature_set(hw->wiphy, NL80211_EXT_FEATURE_CQM_RSSI_LIST);
|
||||
|
||||
|
||||
@ -13,15 +13,15 @@ Signed-off-by: Rafał Miłecki <zajec5@gmail.com>
|
||||
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/firmware.c
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/firmware.c
|
||||
@@ -431,6 +431,7 @@ struct brcmf_fw {
|
||||
@@ -429,6 +429,7 @@ struct brcmf_fw {
|
||||
struct brcmf_fw_request *req;
|
||||
u32 curpos;
|
||||
void (*done)(struct device *dev, int err, struct brcmf_fw_request *req);
|
||||
+ struct completion *completion;
|
||||
};
|
||||
|
||||
static void brcmf_fw_request_done(const struct firmware *fw, void *ctx);
|
||||
@@ -638,6 +639,8 @@ static void brcmf_fw_request_done(const
|
||||
#ifdef CONFIG_EFI
|
||||
@@ -653,6 +654,8 @@ static void brcmf_fw_request_done(const
|
||||
fwctx->req = NULL;
|
||||
}
|
||||
fwctx->done(fwctx->dev, ret, fwctx->req);
|
||||
@ -30,16 +30,16 @@ Signed-off-by: Rafał Miłecki <zajec5@gmail.com>
|
||||
kfree(fwctx);
|
||||
}
|
||||
|
||||
@@ -662,6 +665,8 @@ int brcmf_fw_get_firmwares(struct device
|
||||
@@ -693,6 +696,8 @@ int brcmf_fw_get_firmwares(struct device
|
||||
{
|
||||
struct brcmf_fw_item *first = &req->items[0];
|
||||
struct brcmf_fw *fwctx;
|
||||
+ struct completion completion;
|
||||
+ unsigned long time_left;
|
||||
char *alt_path;
|
||||
int ret;
|
||||
|
||||
brcmf_dbg(TRACE, "enter: dev=%s\n", dev_name(dev));
|
||||
@@ -678,6 +683,9 @@ int brcmf_fw_get_firmwares(struct device
|
||||
@@ -710,6 +715,9 @@ int brcmf_fw_get_firmwares(struct device
|
||||
fwctx->dev = dev;
|
||||
fwctx->req = req;
|
||||
fwctx->done = fw_cb;
|
||||
@ -47,9 +47,9 @@ Signed-off-by: Rafał Miłecki <zajec5@gmail.com>
|
||||
+ init_completion(&completion);
|
||||
+ fwctx->completion = &completion;
|
||||
|
||||
ret = request_firmware_nowait(THIS_MODULE, true, first->path,
|
||||
fwctx->dev, GFP_KERNEL, fwctx,
|
||||
@@ -685,6 +693,12 @@ int brcmf_fw_get_firmwares(struct device
|
||||
/* First try alternative board-specific path if any */
|
||||
alt_path = brcm_alt_fw_path(first->path, fwctx->req->board_type);
|
||||
@@ -726,6 +734,12 @@ int brcmf_fw_get_firmwares(struct device
|
||||
if (ret < 0)
|
||||
brcmf_fw_request_done(NULL, fwctx);
|
||||
|
||||
|
||||
@ -14,7 +14,7 @@ Signed-off-by: Phil Elwell <phil@raspberrypi.org>
|
||||
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
|
||||
@@ -2961,6 +2961,10 @@ brcmf_cfg80211_set_power_mgmt(struct wip
|
||||
@@ -2974,6 +2974,10 @@ brcmf_cfg80211_set_power_mgmt(struct wip
|
||||
* preference in cfg struct to apply this to
|
||||
* FW later while initializing the dongle
|
||||
*/
|
||||
|
||||
@ -12,9 +12,9 @@ Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
|
||||
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/of.c
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/of.c
|
||||
@@ -12,6 +12,36 @@
|
||||
#include "common.h"
|
||||
#include "of.h"
|
||||
@@ -58,6 +58,36 @@ static int brcmf_of_get_country_codes(st
|
||||
return 0;
|
||||
}
|
||||
|
||||
+/* TODO: FIXME: Use DT */
|
||||
+static void brcmf_of_probe_cc(struct device *dev,
|
||||
@ -49,12 +49,12 @@ Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
|
||||
void brcmf_of_probe(struct device *dev, enum brcmf_bus_type bus_type,
|
||||
struct brcmf_mp_device *settings)
|
||||
{
|
||||
@@ -43,6 +73,8 @@ void brcmf_of_probe(struct device *dev,
|
||||
@@ -90,6 +120,8 @@ void brcmf_of_probe(struct device *dev,
|
||||
of_node_put(root);
|
||||
}
|
||||
|
||||
+ brcmf_of_probe_cc(dev, settings);
|
||||
+
|
||||
if (!np || bus_type != BRCMF_BUSTYPE_SDIO ||
|
||||
!of_device_is_compatible(np, "brcm,bcm4329-fmac"))
|
||||
if (!np || !of_device_is_compatible(np, "brcm,bcm4329-fmac"))
|
||||
return;
|
||||
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
|
||||
@@ -2913,6 +2913,63 @@ done:
|
||||
@@ -2921,6 +2921,63 @@ done:
|
||||
}
|
||||
|
||||
static int
|
||||
@ -64,7 +64,7 @@
|
||||
brcmf_cfg80211_dump_station(struct wiphy *wiphy, struct net_device *ndev,
|
||||
int idx, u8 *mac, struct station_info *sinfo)
|
||||
{
|
||||
@@ -3008,6 +3065,7 @@ static s32 brcmf_inform_single_bss(struc
|
||||
@@ -3021,6 +3078,7 @@ static s32 brcmf_inform_single_bss(struc
|
||||
struct brcmu_chan ch;
|
||||
u16 channel;
|
||||
u32 freq;
|
||||
@ -72,7 +72,7 @@
|
||||
u16 notify_capability;
|
||||
u16 notify_interval;
|
||||
u8 *notify_ie;
|
||||
@@ -3032,6 +3090,17 @@ static s32 brcmf_inform_single_bss(struc
|
||||
@@ -3045,6 +3103,17 @@ static s32 brcmf_inform_single_bss(struc
|
||||
band = NL80211_BAND_5GHZ;
|
||||
|
||||
freq = ieee80211_channel_to_frequency(channel, band);
|
||||
@ -90,7 +90,7 @@
|
||||
bss_data.chan = ieee80211_get_channel(wiphy, freq);
|
||||
bss_data.scan_width = NL80211_BSS_CHAN_WIDTH_20;
|
||||
bss_data.boottime_ns = ktime_to_ns(ktime_get_boottime());
|
||||
@@ -5518,6 +5587,7 @@ static struct cfg80211_ops brcmf_cfg8021
|
||||
@@ -5573,6 +5642,7 @@ static struct cfg80211_ops brcmf_cfg8021
|
||||
.leave_ibss = brcmf_cfg80211_leave_ibss,
|
||||
.get_station = brcmf_cfg80211_get_station,
|
||||
.dump_station = brcmf_cfg80211_dump_station,
|
||||
@ -100,7 +100,7 @@
|
||||
.add_key = brcmf_cfg80211_add_key,
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c
|
||||
@@ -1356,6 +1356,8 @@ int brcmf_attach(struct device *dev)
|
||||
@@ -1361,6 +1361,8 @@ int brcmf_attach(struct device *dev)
|
||||
|
||||
/* Link to bus module */
|
||||
drvr->hdrlen = 0;
|
||||
@ -109,7 +109,7 @@
|
||||
|
||||
/* Attach and link in the protocol */
|
||||
ret = brcmf_proto_attach(drvr);
|
||||
@@ -1438,6 +1440,12 @@ void brcmf_detach(struct device *dev)
|
||||
@@ -1443,6 +1445,12 @@ void brcmf_detach(struct device *dev)
|
||||
if (drvr == NULL)
|
||||
return;
|
||||
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
--- a/compat/main.c
|
||||
+++ b/compat/main.c
|
||||
@@ -20,31 +20,6 @@ MODULE_LICENSE("GPL");
|
||||
@@ -19,31 +19,6 @@ MODULE_LICENSE("GPL");
|
||||
#error "You need a CPTCFG_VERSION"
|
||||
#endif
|
||||
|
||||
|
||||
@ -1,28 +0,0 @@
|
||||
--- a/backport-include/linux/kconfig.h
|
||||
+++ b/backport-include/linux/kconfig.h
|
||||
@@ -5,6 +5,8 @@
|
||||
#include_next <linux/kconfig.h>
|
||||
#endif
|
||||
|
||||
+#if LINUX_VERSION_CODE < KERNEL_VERSION(3,4,0)
|
||||
+
|
||||
#ifndef __ARG_PLACEHOLDER_1
|
||||
#define __ARG_PLACEHOLDER_1 0,
|
||||
#define config_enabled(cfg) _config_enabled(cfg)
|
||||
@@ -16,6 +18,7 @@
|
||||
* 3.1 - 3.3 had a broken version of this, so undef
|
||||
* (they didn't have __ARG_PLACEHOLDER_1)
|
||||
*/
|
||||
+
|
||||
#undef IS_ENABLED
|
||||
#define IS_ENABLED(option) \
|
||||
(config_enabled(option) || config_enabled(option##_MODULE))
|
||||
@@ -31,6 +34,8 @@
|
||||
#undef IS_BUILTIN
|
||||
#define IS_BUILTIN(option) config_enabled(option)
|
||||
|
||||
+#endif
|
||||
+
|
||||
#ifndef IS_REACHABLE
|
||||
/*
|
||||
* IS_REACHABLE(CONFIG_FOO) evaluates to 1 if the currently compiled
|
||||
@ -1,15 +0,0 @@
|
||||
--- a/backport-include/linux/rfkill.h
|
||||
+++ b/backport-include/linux/rfkill.h
|
||||
@@ -2,6 +2,12 @@
|
||||
#define __COMPAT_RFKILL_H
|
||||
#include <linux/version.h>
|
||||
|
||||
+#undef CONFIG_RFKILL
|
||||
+#undef CONFIG_RFKILL_FULL
|
||||
+#undef CONFIG_RFKILL_LEDS
|
||||
+#undef CONFIG_RFKILL_MODULE
|
||||
+#undef CONFIG_RFKILL_FULL_MODULE
|
||||
+
|
||||
#if LINUX_VERSION_IS_GEQ(3,10,0)
|
||||
#include_next <linux/rfkill.h>
|
||||
#else
|
||||
@ -0,0 +1,79 @@
|
||||
From d49395058c6bd4fb7b8bcc5ff7b4d7fbd9b6f97b Mon Sep 17 00:00:00 2001
|
||||
From: Hauke Mehrtens <hauke@hauke-m.de>
|
||||
Date: Sun, 24 Oct 2021 14:49:55 +0200
|
||||
Subject: [PATCH] headers: Add devm_platform_get_and_ioremap_resource()
|
||||
|
||||
This function is copied from kernel 5.7 and used by mt76, ath10k and
|
||||
ath11k. devm_platform_ioremap_resource() was changed to make sue of
|
||||
this new function.
|
||||
|
||||
Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
|
||||
---
|
||||
.../backport-include/linux/platform_device.h | 45 ++++++++++++++++---
|
||||
1 file changed, 38 insertions(+), 7 deletions(-)
|
||||
|
||||
--- a/backport-include/linux/platform_device.h
|
||||
+++ b/backport-include/linux/platform_device.h
|
||||
@@ -33,7 +33,39 @@ module_exit(__platform_driver##_exit);
|
||||
platform_driver_unregister)
|
||||
#endif
|
||||
|
||||
+#if LINUX_VERSION_IS_LESS(5,7,0)
|
||||
+#ifdef CONFIG_HAS_IOMEM
|
||||
+#define devm_platform_get_and_ioremap_resource LINUX_BACKPORT(devm_platform_get_and_ioremap_resource)
|
||||
+/**
|
||||
+ * devm_platform_get_and_ioremap_resource - call devm_ioremap_resource() for a
|
||||
+ * platform device and get resource
|
||||
+ *
|
||||
+ * @pdev: platform device to use both for memory resource lookup as well as
|
||||
+ * resource management
|
||||
+ * @index: resource index
|
||||
+ * @res: optional output parameter to store a pointer to the obtained resource.
|
||||
+ *
|
||||
+ * Return: a pointer to the remapped memory or an ERR_PTR() encoded error code
|
||||
+ * on failure.
|
||||
+ */
|
||||
+static inline void __iomem *
|
||||
+devm_platform_get_and_ioremap_resource(struct platform_device *pdev,
|
||||
+ unsigned int index, struct resource **res)
|
||||
+{
|
||||
+ struct resource *r;
|
||||
+
|
||||
+ r = platform_get_resource(pdev, IORESOURCE_MEM, index);
|
||||
+ if (res)
|
||||
+ *res = r;
|
||||
+ return devm_ioremap_resource(&pdev->dev, r);
|
||||
+}
|
||||
+#endif /* CONFIG_HAS_IOMEM */
|
||||
+#endif /* < 5.7 */
|
||||
+
|
||||
#if LINUX_VERSION_IS_LESS(5,1,0)
|
||||
+
|
||||
+#ifdef CONFIG_HAS_IOMEM
|
||||
+#define devm_platform_ioremap_resource LINUX_BACKPORT(devm_platform_ioremap_resource)
|
||||
/**
|
||||
* devm_platform_ioremap_resource - call devm_ioremap_resource() for a platform
|
||||
* device
|
||||
@@ -41,16 +73,15 @@ module_exit(__platform_driver##_exit);
|
||||
* @pdev: platform device to use both for memory resource lookup as well as
|
||||
* resource management
|
||||
* @index: resource index
|
||||
+ *
|
||||
+ * Return: a pointer to the remapped memory or an ERR_PTR() encoded error code
|
||||
+ * on failure.
|
||||
*/
|
||||
-#ifdef CONFIG_HAS_IOMEM
|
||||
-#define devm_platform_ioremap_resource LINUX_BACKPORT(devm_platform_ioremap_resource)
|
||||
-static inline void __iomem *devm_platform_ioremap_resource(struct platform_device *pdev,
|
||||
+static inline void __iomem *
|
||||
+devm_platform_ioremap_resource(struct platform_device *pdev,
|
||||
unsigned int index)
|
||||
{
|
||||
- struct resource *res;
|
||||
-
|
||||
- res = platform_get_resource(pdev, IORESOURCE_MEM, index);
|
||||
- return devm_ioremap_resource(&pdev->dev, res);
|
||||
+ return devm_platform_get_and_ioremap_resource(pdev, index, NULL);
|
||||
}
|
||||
#endif /* CONFIG_HAS_IOMEM */
|
||||
#endif
|
||||
@ -1,9 +1,9 @@
|
||||
--- a/local-symbols
|
||||
+++ b/local-symbols
|
||||
@@ -437,43 +437,6 @@ USB_SIERRA_NET=
|
||||
USB_VL600=
|
||||
@@ -421,43 +421,6 @@ USB_VL600=
|
||||
USB_NET_CH9200=
|
||||
USB_NET_AQC111=
|
||||
USB_RTL8153_ECM=
|
||||
-SSB_POSSIBLE=
|
||||
-SSB=
|
||||
-SSB_SPROM=
|
||||
@ -192,10 +192,10 @@
|
||||
select BRCMUTIL
|
||||
--- a/Kconfig.local
|
||||
+++ b/Kconfig.local
|
||||
@@ -1315,117 +1315,6 @@ config BACKPORTED_USB_NET_CH9200
|
||||
config BACKPORTED_USB_NET_AQC111
|
||||
@@ -1267,117 +1267,6 @@ config BACKPORTED_USB_NET_AQC111
|
||||
config BACKPORTED_USB_RTL8153_ECM
|
||||
tristate
|
||||
default USB_NET_AQC111
|
||||
default USB_RTL8153_ECM
|
||||
-config BACKPORTED_SSB_POSSIBLE
|
||||
- tristate
|
||||
- default SSB_POSSIBLE
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
--- a/drivers/net/wireless/marvell/mwl8k.c
|
||||
+++ b/drivers/net/wireless/marvell/mwl8k.c
|
||||
@@ -5695,6 +5695,7 @@ MODULE_FIRMWARE("mwl8k/fmimage_8366.fw")
|
||||
@@ -5699,6 +5699,7 @@ MODULE_FIRMWARE("mwl8k/fmimage_8366.fw")
|
||||
MODULE_FIRMWARE(MWL8K_8366_AP_FW(MWL8K_8366_AP_FW_API));
|
||||
|
||||
static const struct pci_device_id mwl8k_pci_id_table[] = {
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
--- a/drivers/net/wireless/marvell/mwl8k.c
|
||||
+++ b/drivers/net/wireless/marvell/mwl8k.c
|
||||
@@ -6280,6 +6280,8 @@ static int mwl8k_probe(struct pci_dev *p
|
||||
@@ -6285,6 +6285,8 @@ static int mwl8k_probe(struct pci_dev *p
|
||||
|
||||
priv->running_bsses = 0;
|
||||
|
||||
@ -9,7 +9,7 @@
|
||||
return rc;
|
||||
|
||||
err_stop_firmware:
|
||||
@@ -6313,8 +6315,6 @@ static void mwl8k_remove(struct pci_dev
|
||||
@@ -6318,8 +6320,6 @@ static void mwl8k_remove(struct pci_dev
|
||||
return;
|
||||
priv = hw->priv;
|
||||
|
||||
|
||||
@ -40,7 +40,7 @@ Signed-off-by: Tomislav Požega <pozega.tomislav@gmail.com>
|
||||
|
||||
--- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
|
||||
+++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
|
||||
@@ -9416,6 +9416,8 @@ static int rt2800_init_eeprom(struct rt2
|
||||
@@ -9435,6 +9435,8 @@ static int rt2800_init_eeprom(struct rt2
|
||||
rf = RF3853;
|
||||
else if (rt2x00_rt(rt2x00dev, RT5350))
|
||||
rf = RF5350;
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
--- a/local-symbols
|
||||
+++ b/local-symbols
|
||||
@@ -332,6 +332,7 @@ RT2X00_LIB_FIRMWARE=
|
||||
@@ -315,6 +315,7 @@ RT2X00_LIB_FIRMWARE=
|
||||
RT2X00_LIB_CRYPTO=
|
||||
RT2X00_LIB_LEDS=
|
||||
RT2X00_LIB_DEBUGFS=
|
||||
@ -105,7 +105,7 @@
|
||||
.drv_init_registers = rt2800mmio_init_registers,
|
||||
--- a/drivers/net/wireless/ralink/rt2x00/rt2x00.h
|
||||
+++ b/drivers/net/wireless/ralink/rt2x00/rt2x00.h
|
||||
@@ -694,6 +694,7 @@ enum rt2x00_capability_flags {
|
||||
@@ -703,6 +703,7 @@ enum rt2x00_capability_flags {
|
||||
REQUIRE_HT_TX_DESC,
|
||||
REQUIRE_PS_AUTOWAKE,
|
||||
REQUIRE_DELAYED_RFKILL,
|
||||
@ -113,7 +113,7 @@
|
||||
|
||||
/*
|
||||
* Capabilities
|
||||
@@ -970,6 +971,11 @@ struct rt2x00_dev {
|
||||
@@ -980,6 +981,11 @@ struct rt2x00_dev {
|
||||
const struct firmware *fw;
|
||||
|
||||
/*
|
||||
@ -127,7 +127,7 @@
|
||||
DECLARE_KFIFO_PTR(txstatus_fifo, u32);
|
||||
--- a/drivers/net/wireless/ralink/rt2x00/rt2x00dev.c
|
||||
+++ b/drivers/net/wireless/ralink/rt2x00/rt2x00dev.c
|
||||
@@ -1402,6 +1402,10 @@ int rt2x00lib_probe_dev(struct rt2x00_de
|
||||
@@ -1401,6 +1401,10 @@ int rt2x00lib_probe_dev(struct rt2x00_de
|
||||
INIT_DELAYED_WORK(&rt2x00dev->autowakeup_work, rt2x00lib_autowakeup);
|
||||
INIT_WORK(&rt2x00dev->sleep_work, rt2x00lib_sleep);
|
||||
|
||||
@ -138,7 +138,7 @@
|
||||
/*
|
||||
* Let the driver probe the device to detect the capabilities.
|
||||
*/
|
||||
@@ -1545,6 +1549,11 @@ void rt2x00lib_remove_dev(struct rt2x00_
|
||||
@@ -1541,6 +1545,11 @@ void rt2x00lib_remove_dev(struct rt2x00_
|
||||
* Free the driver data.
|
||||
*/
|
||||
kfree(rt2x00dev->drv_data);
|
||||
|
||||
@ -12,7 +12,7 @@
|
||||
#endif /* _RT2X00_PLATFORM_H */
|
||||
--- a/drivers/net/wireless/ralink/rt2x00/rt2x00dev.c
|
||||
+++ b/drivers/net/wireless/ralink/rt2x00/rt2x00dev.c
|
||||
@@ -1008,6 +1008,22 @@ static int rt2x00lib_probe_hw_modes(stru
|
||||
@@ -1007,6 +1007,22 @@ static int rt2x00lib_probe_hw_modes(stru
|
||||
unsigned int num_rates;
|
||||
unsigned int i;
|
||||
|
||||
@ -37,7 +37,7 @@
|
||||
num_rates += 4;
|
||||
--- a/drivers/net/wireless/ralink/rt2x00/rt2x00.h
|
||||
+++ b/drivers/net/wireless/ralink/rt2x00/rt2x00.h
|
||||
@@ -399,6 +399,7 @@ struct hw_mode_spec {
|
||||
@@ -408,6 +408,7 @@ struct hw_mode_spec {
|
||||
unsigned int supported_bands;
|
||||
#define SUPPORT_BAND_2GHZ 0x00000001
|
||||
#define SUPPORT_BAND_5GHZ 0x00000002
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
--- a/drivers/net/wireless/ralink/rt2x00/rt2x00dev.c
|
||||
+++ b/drivers/net/wireless/ralink/rt2x00/rt2x00dev.c
|
||||
@@ -990,6 +990,12 @@ static void rt2x00lib_rate(struct ieee80
|
||||
@@ -989,6 +989,12 @@ static void rt2x00lib_rate(struct ieee80
|
||||
|
||||
void rt2x00lib_set_mac_address(struct rt2x00_dev *rt2x00dev, u8 *eeprom_mac_addr)
|
||||
{
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
--- a/drivers/net/wireless/ralink/rt2x00/rt2x00dev.c
|
||||
+++ b/drivers/net/wireless/ralink/rt2x00/rt2x00dev.c
|
||||
@@ -1013,6 +1013,16 @@ static int rt2x00lib_probe_hw_modes(stru
|
||||
@@ -1012,6 +1012,16 @@ static int rt2x00lib_probe_hw_modes(stru
|
||||
struct ieee80211_rate *rates;
|
||||
unsigned int num_rates;
|
||||
unsigned int i;
|
||||
|
||||
@ -8,7 +8,7 @@
|
||||
|
||||
#include "rt2x00.h"
|
||||
#include "rt2800lib.h"
|
||||
@@ -9530,6 +9531,17 @@ static int rt2800_init_eeprom(struct rt2
|
||||
@@ -9549,6 +9550,17 @@ static int rt2800_init_eeprom(struct rt2
|
||||
rt2800_init_led(rt2x00dev, &rt2x00dev->led_assoc, LED_TYPE_ASSOC);
|
||||
rt2800_init_led(rt2x00dev, &rt2x00dev->led_qual, LED_TYPE_QUALITY);
|
||||
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
--- a/drivers/net/wireless/ralink/rt2x00/rt2x00dev.c
|
||||
+++ b/drivers/net/wireless/ralink/rt2x00/rt2x00dev.c
|
||||
@@ -1341,7 +1341,7 @@ static inline void rt2x00lib_set_if_comb
|
||||
@@ -1340,7 +1340,7 @@ static inline void rt2x00lib_set_if_comb
|
||||
*/
|
||||
if_limit = &rt2x00dev->if_limits_ap;
|
||||
if_limit->max = rt2x00dev->ops->max_ap_intf;
|
||||
|
||||
@ -11,7 +11,7 @@ Tested-by: Christoph Krapp <achterin@googlemail.com>
|
||||
|
||||
--- a/drivers/net/wireless/ralink/rt2x00/rt2x00dev.c
|
||||
+++ b/drivers/net/wireless/ralink/rt2x00/rt2x00dev.c
|
||||
@@ -1126,6 +1126,19 @@ static void rt2x00lib_remove_hw(struct r
|
||||
@@ -1125,6 +1125,19 @@ static void rt2x00lib_remove_hw(struct r
|
||||
kfree(rt2x00dev->spec.channels_info);
|
||||
}
|
||||
|
||||
@ -31,7 +31,7 @@ Tested-by: Christoph Krapp <achterin@googlemail.com>
|
||||
static int rt2x00lib_probe_hw(struct rt2x00_dev *rt2x00dev)
|
||||
{
|
||||
struct hw_mode_spec *spec = &rt2x00dev->spec;
|
||||
@@ -1207,6 +1220,10 @@ static int rt2x00lib_probe_hw(struct rt2
|
||||
@@ -1206,6 +1219,10 @@ static int rt2x00lib_probe_hw(struct rt2
|
||||
|
||||
#undef RT2X00_TASKLET_INIT
|
||||
|
||||
|
||||
@ -30,7 +30,7 @@ Signed-off-by: Tomislav Po=C5=BEega <pozega.tomislav@gmail.com>
|
||||
* EEPROM LNA
|
||||
--- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
|
||||
+++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
|
||||
@@ -4356,6 +4356,45 @@ static void rt2800_config_channel(struct
|
||||
@@ -4369,6 +4369,45 @@ static void rt2800_config_channel(struct
|
||||
rt2800_iq_calibrate(rt2x00dev, rf->channel);
|
||||
}
|
||||
|
||||
@ -76,7 +76,7 @@ Signed-off-by: Tomislav Po=C5=BEega <pozega.tomislav@gmail.com>
|
||||
bbp = rt2800_bbp_read(rt2x00dev, 4);
|
||||
rt2x00_set_field8(&bbp, BBP4_BANDWIDTH, 2 * conf_is_ht40(conf));
|
||||
rt2800_bbp_write(rt2x00dev, 4, bbp);
|
||||
@@ -9559,7 +9598,8 @@ static int rt2800_init_eeprom(struct rt2
|
||||
@@ -9578,7 +9617,8 @@ static int rt2800_init_eeprom(struct rt2
|
||||
*/
|
||||
eeprom = rt2800_eeprom_read(rt2x00dev, EEPROM_NIC_CONF1);
|
||||
|
||||
@ -86,7 +86,7 @@ Signed-off-by: Tomislav Po=C5=BEega <pozega.tomislav@gmail.com>
|
||||
if (rt2x00_get_field16(eeprom,
|
||||
EEPROM_NIC_CONF1_EXTERNAL_TX0_PA_3352))
|
||||
__set_bit(CAPABILITY_EXTERNAL_PA_TX0,
|
||||
@@ -9570,6 +9610,18 @@ static int rt2800_init_eeprom(struct rt2
|
||||
@@ -9589,6 +9629,18 @@ static int rt2800_init_eeprom(struct rt2
|
||||
&rt2x00dev->cap_flags);
|
||||
}
|
||||
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
--- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
|
||||
+++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
|
||||
@@ -8419,6 +8419,56 @@ static void rt2800_init_rfcsr_5592(struc
|
||||
@@ -8438,6 +8438,56 @@ static void rt2800_init_rfcsr_5592(struc
|
||||
rt2800_led_open_drain_enable(rt2x00dev);
|
||||
}
|
||||
|
||||
@ -57,7 +57,7 @@
|
||||
static void rt2800_bbp_core_soft_reset(struct rt2x00_dev *rt2x00dev,
|
||||
bool set_bw, bool is_ht40)
|
||||
{
|
||||
@@ -9026,6 +9076,7 @@ static void rt2800_init_rfcsr_6352(struc
|
||||
@@ -9045,6 +9095,7 @@ static void rt2800_init_rfcsr_6352(struc
|
||||
rt2800_rfcsr_write_dccal(rt2x00dev, 5, 0x00);
|
||||
rt2800_rfcsr_write_dccal(rt2x00dev, 17, 0x7C);
|
||||
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
--- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
|
||||
+++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
|
||||
@@ -8469,6 +8469,155 @@ static void rt2800_rf_self_txdc_cal(stru
|
||||
@@ -8488,6 +8488,155 @@ static void rt2800_rf_self_txdc_cal(stru
|
||||
rt2x00_info(rt2x00dev, "RF Tx self calibration end\n");
|
||||
}
|
||||
|
||||
@ -156,7 +156,7 @@
|
||||
static void rt2800_bbp_core_soft_reset(struct rt2x00_dev *rt2x00dev,
|
||||
bool set_bw, bool is_ht40)
|
||||
{
|
||||
@@ -9076,6 +9225,7 @@ static void rt2800_init_rfcsr_6352(struc
|
||||
@@ -9095,6 +9244,7 @@ static void rt2800_init_rfcsr_6352(struc
|
||||
rt2800_rfcsr_write_dccal(rt2x00dev, 5, 0x00);
|
||||
rt2800_rfcsr_write_dccal(rt2x00dev, 17, 0x7C);
|
||||
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
--- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
|
||||
+++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
|
||||
@@ -8618,6 +8618,70 @@ static void rt2800_r_calibration(struct
|
||||
@@ -8637,6 +8637,70 @@ static void rt2800_r_calibration(struct
|
||||
rt2800_register_write(rt2x00dev, PWR_PIN_CFG, MAC_PWR_PIN_CFG);
|
||||
}
|
||||
|
||||
@ -71,7 +71,7 @@
|
||||
static void rt2800_bbp_core_soft_reset(struct rt2x00_dev *rt2x00dev,
|
||||
bool set_bw, bool is_ht40)
|
||||
{
|
||||
@@ -9227,6 +9291,7 @@ static void rt2800_init_rfcsr_6352(struc
|
||||
@@ -9246,6 +9310,7 @@ static void rt2800_init_rfcsr_6352(struc
|
||||
|
||||
rt2800_r_calibration(rt2x00dev);
|
||||
rt2800_rf_self_txdc_cal(rt2x00dev);
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
--- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
|
||||
+++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
|
||||
@@ -8682,6 +8682,384 @@ static void rt2800_rxdcoc_calibration(st
|
||||
@@ -8701,6 +8701,384 @@ static void rt2800_rxdcoc_calibration(st
|
||||
rt2800_rfcsr_write_bank(rt2x00dev, 0, 2, saverfb0r2);
|
||||
}
|
||||
|
||||
@ -385,7 +385,7 @@
|
||||
static void rt2800_bbp_core_soft_reset(struct rt2x00_dev *rt2x00dev,
|
||||
bool set_bw, bool is_ht40)
|
||||
{
|
||||
@@ -9294,6 +9672,7 @@ static void rt2800_init_rfcsr_6352(struc
|
||||
@@ -9313,6 +9691,7 @@ static void rt2800_init_rfcsr_6352(struc
|
||||
rt2800_rxdcoc_calibration(rt2x00dev);
|
||||
rt2800_bw_filter_calibration(rt2x00dev, true);
|
||||
rt2800_bw_filter_calibration(rt2x00dev, false);
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
--- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
|
||||
+++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
|
||||
@@ -9060,6 +9060,943 @@ restore_value:
|
||||
@@ -9079,6 +9079,943 @@ restore_value:
|
||||
rt2800_register_write(rt2x00dev, MAC_SYS_CTRL, savemacsysctrl);
|
||||
}
|
||||
|
||||
@ -944,7 +944,7 @@
|
||||
static void rt2800_bbp_core_soft_reset(struct rt2x00_dev *rt2x00dev,
|
||||
bool set_bw, bool is_ht40)
|
||||
{
|
||||
@@ -9672,6 +10609,7 @@ static void rt2800_init_rfcsr_6352(struc
|
||||
@@ -9691,6 +10628,7 @@ static void rt2800_init_rfcsr_6352(struc
|
||||
rt2800_rxdcoc_calibration(rt2x00dev);
|
||||
rt2800_bw_filter_calibration(rt2x00dev, true);
|
||||
rt2800_bw_filter_calibration(rt2x00dev, false);
|
||||
|
||||
@ -14,7 +14,7 @@
|
||||
*/
|
||||
--- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
|
||||
+++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
|
||||
@@ -3685,14 +3685,16 @@ static void rt2800_config_channel_rf7620
|
||||
@@ -3698,14 +3698,16 @@ static void rt2800_config_channel_rf7620
|
||||
rt2x00_set_field8(&rfcsr, RFCSR19_K, rf->rf4);
|
||||
rt2800_rfcsr_write(rt2x00dev, 19, rfcsr);
|
||||
|
||||
@ -39,7 +39,7 @@
|
||||
|
||||
rfcsr = rt2800_rfcsr_read(rt2x00dev, 1);
|
||||
rt2x00_set_field8(&rfcsr, RFCSR1_TX2_EN_MT7620,
|
||||
@@ -3726,18 +3728,23 @@ static void rt2800_config_channel_rf7620
|
||||
@@ -3739,18 +3741,23 @@ static void rt2800_config_channel_rf7620
|
||||
rt2800_rfcsr_write_dccal(rt2x00dev, 59, 0x20);
|
||||
}
|
||||
|
||||
@ -73,7 +73,7 @@
|
||||
|
||||
if (!test_bit(DEVICE_STATE_SCANNING, &rt2x00dev->flags)) {
|
||||
if (conf_is_ht40(conf)) {
|
||||
@@ -3837,25 +3844,29 @@ static void rt2800_config_alc(struct rt2
|
||||
@@ -3850,25 +3857,29 @@ static void rt2800_config_alc(struct rt2
|
||||
if (i == 10000)
|
||||
rt2x00_warn(rt2x00dev, "Wait MAC Status to MAX !!!\n");
|
||||
|
||||
@ -121,7 +121,7 @@
|
||||
rt2800_register_write(rt2x00dev, MAC_SYS_CTRL, mac_sys_ctrl);
|
||||
|
||||
rt2800_vco_calibration(rt2x00dev);
|
||||
@@ -5887,18 +5898,33 @@ static int rt2800_init_registers(struct
|
||||
@@ -5906,18 +5917,33 @@ static int rt2800_init_registers(struct
|
||||
} else if (rt2x00_rt(rt2x00dev, RT5350)) {
|
||||
rt2800_register_write(rt2x00dev, TX_SW_CFG0, 0x00000404);
|
||||
} else if (rt2x00_rt(rt2x00dev, RT6352)) {
|
||||
@ -167,7 +167,7 @@
|
||||
reg = rt2800_register_read(rt2x00dev, TX_ALC_CFG_1);
|
||||
rt2x00_set_field32(®, TX_ALC_CFG_1_ROS_BUSY_EN, 0);
|
||||
rt2800_register_write(rt2x00dev, TX_ALC_CFG_1, reg);
|
||||
@@ -7042,14 +7068,16 @@ static void rt2800_init_bbp_6352(struct
|
||||
@@ -7061,14 +7087,16 @@ static void rt2800_init_bbp_6352(struct
|
||||
rt2800_bbp_write(rt2x00dev, 188, 0x00);
|
||||
rt2800_bbp_write(rt2x00dev, 189, 0x00);
|
||||
|
||||
@ -192,7 +192,7 @@
|
||||
|
||||
/* BBP for G band GLRT function (BBP_128 ~ BBP_221) */
|
||||
rt2800_bbp_glrt_write(rt2x00dev, 0, 0x00);
|
||||
@@ -10388,31 +10416,36 @@ static void rt2800_init_rfcsr_6352(struc
|
||||
@@ -10407,31 +10435,36 @@ static void rt2800_init_rfcsr_6352(struc
|
||||
rt2800_rfcsr_write(rt2x00dev, 42, 0x5B);
|
||||
rt2800_rfcsr_write(rt2x00dev, 43, 0x00);
|
||||
|
||||
@ -254,7 +254,7 @@
|
||||
|
||||
/* Initialize RF channel register to default value */
|
||||
rt2800_rfcsr_write_chanreg(rt2x00dev, 0, 0x03);
|
||||
@@ -10478,63 +10511,71 @@ static void rt2800_init_rfcsr_6352(struc
|
||||
@@ -10497,63 +10530,71 @@ static void rt2800_init_rfcsr_6352(struc
|
||||
|
||||
rt2800_rfcsr_write_bank(rt2x00dev, 6, 45, 0xC5);
|
||||
|
||||
@ -383,7 +383,7 @@
|
||||
|
||||
/* Initialize RF DC calibration register to default value */
|
||||
rt2800_rfcsr_write_dccal(rt2x00dev, 0, 0x47);
|
||||
@@ -10597,12 +10638,17 @@ static void rt2800_init_rfcsr_6352(struc
|
||||
@@ -10616,12 +10657,17 @@ static void rt2800_init_rfcsr_6352(struc
|
||||
rt2800_rfcsr_write_dccal(rt2x00dev, 62, 0x00);
|
||||
rt2800_rfcsr_write_dccal(rt2x00dev, 63, 0x00);
|
||||
|
||||
|
||||
@ -1,183 +0,0 @@
|
||||
--- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
|
||||
+++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
|
||||
@@ -1238,6 +1238,8 @@ void rt2800_watchdog(struct rt2x00_dev *
|
||||
if (test_bit(DEVICE_STATE_SCANNING, &rt2x00dev->flags))
|
||||
return;
|
||||
|
||||
+ rt2800_update_survey(rt2x00dev);
|
||||
+
|
||||
queue_for_each(rt2x00dev, queue) {
|
||||
switch (queue->qid) {
|
||||
case QID_AC_VO:
|
||||
@@ -1274,6 +1276,18 @@ void rt2800_watchdog(struct rt2x00_dev *
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(rt2800_watchdog);
|
||||
|
||||
+void rt2800_update_survey(struct rt2x00_dev *rt2x00dev)
|
||||
+{
|
||||
+ struct ieee80211_channel *chan = rt2x00dev->hw->conf.chandef.chan;
|
||||
+ struct rt2x00_chan_survey *chan_survey =
|
||||
+ &rt2x00dev->chan_survey[chan->hw_value];
|
||||
+
|
||||
+ chan_survey->time_idle += rt2800_register_read(rt2x00dev, CH_IDLE_STA);
|
||||
+ chan_survey->time_busy += rt2800_register_read(rt2x00dev, CH_BUSY_STA);
|
||||
+ chan_survey->time_ext_busy += rt2800_register_read(rt2x00dev, CH_BUSY_STA_SEC);
|
||||
+}
|
||||
+EXPORT_SYMBOL_GPL(rt2800_update_survey);
|
||||
+
|
||||
static unsigned int rt2800_hw_beacon_base(struct rt2x00_dev *rt2x00dev,
|
||||
unsigned int index)
|
||||
{
|
||||
@@ -12199,26 +12213,30 @@ int rt2800_get_survey(struct ieee80211_h
|
||||
{
|
||||
struct rt2x00_dev *rt2x00dev = hw->priv;
|
||||
struct ieee80211_conf *conf = &hw->conf;
|
||||
- u32 idle, busy, busy_ext;
|
||||
+ struct rt2x00_chan_survey *chan_survey =
|
||||
+ &rt2x00dev->chan_survey[idx];
|
||||
+ enum nl80211_band band = NL80211_BAND_2GHZ;
|
||||
|
||||
- if (idx != 0)
|
||||
+ if (idx >= rt2x00dev->bands[band].n_channels) {
|
||||
+ idx -= rt2x00dev->bands[band].n_channels;
|
||||
+ band = NL80211_BAND_5GHZ;
|
||||
+ }
|
||||
+
|
||||
+ if (idx >= rt2x00dev->bands[band].n_channels)
|
||||
return -ENOENT;
|
||||
|
||||
- survey->channel = conf->chandef.chan;
|
||||
+ if (idx == 0)
|
||||
+ rt2800_update_survey(rt2x00dev);
|
||||
|
||||
- idle = rt2800_register_read(rt2x00dev, CH_IDLE_STA);
|
||||
- busy = rt2800_register_read(rt2x00dev, CH_BUSY_STA);
|
||||
- busy_ext = rt2800_register_read(rt2x00dev, CH_BUSY_STA_SEC);
|
||||
-
|
||||
- if (idle || busy) {
|
||||
- survey->filled = SURVEY_INFO_TIME |
|
||||
- SURVEY_INFO_TIME_BUSY |
|
||||
- SURVEY_INFO_TIME_EXT_BUSY;
|
||||
-
|
||||
- survey->time = (idle + busy) / 1000;
|
||||
- survey->time_busy = busy / 1000;
|
||||
- survey->time_ext_busy = busy_ext / 1000;
|
||||
- }
|
||||
+ survey->channel = &rt2x00dev->bands[band].channels[idx];
|
||||
+
|
||||
+ survey->filled = SURVEY_INFO_TIME |
|
||||
+ SURVEY_INFO_TIME_BUSY |
|
||||
+ SURVEY_INFO_TIME_EXT_BUSY;
|
||||
+
|
||||
+ survey->time = div_u64(chan_survey->time_idle + chan_survey->time_busy, 1000);
|
||||
+ survey->time_busy = div_u64(chan_survey->time_busy, 1000);
|
||||
+ survey->time_ext_busy = div_u64(chan_survey->time_ext_busy, 1000);
|
||||
|
||||
if (!(hw->conf.flags & IEEE80211_CONF_OFFCHANNEL))
|
||||
survey->filled |= SURVEY_INFO_IN_USE;
|
||||
--- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.h
|
||||
+++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.h
|
||||
@@ -243,6 +243,7 @@ bool rt2800_txstatus_timeout(struct rt2x
|
||||
bool rt2800_txstatus_pending(struct rt2x00_dev *rt2x00dev);
|
||||
|
||||
void rt2800_watchdog(struct rt2x00_dev *rt2x00dev);
|
||||
+void rt2800_update_survey(struct rt2x00_dev *rt2x00dev);
|
||||
|
||||
void rt2800_write_beacon(struct queue_entry *entry, struct txentry_desc *txdesc);
|
||||
void rt2800_clear_beacon(struct queue_entry *entry);
|
||||
--- a/drivers/net/wireless/ralink/rt2x00/rt2800pci.c
|
||||
+++ b/drivers/net/wireless/ralink/rt2x00/rt2800pci.c
|
||||
@@ -360,6 +360,7 @@ static const struct rt2x00lib_ops rt2800
|
||||
.gain_calibration = rt2800_gain_calibration,
|
||||
.vco_calibration = rt2800_vco_calibration,
|
||||
.watchdog = rt2800_watchdog,
|
||||
+ .update_survey = rt2800_update_survey,
|
||||
.start_queue = rt2800mmio_start_queue,
|
||||
.kick_queue = rt2800mmio_kick_queue,
|
||||
.stop_queue = rt2800mmio_stop_queue,
|
||||
--- a/drivers/net/wireless/ralink/rt2x00/rt2800soc.c
|
||||
+++ b/drivers/net/wireless/ralink/rt2x00/rt2800soc.c
|
||||
@@ -214,6 +214,7 @@ static const struct rt2x00lib_ops rt2800
|
||||
.gain_calibration = rt2800_gain_calibration,
|
||||
.vco_calibration = rt2800_vco_calibration,
|
||||
.watchdog = rt2800_watchdog,
|
||||
+ .update_survey = rt2800_update_survey,
|
||||
.start_queue = rt2800mmio_start_queue,
|
||||
.kick_queue = rt2800mmio_kick_queue,
|
||||
.stop_queue = rt2800mmio_stop_queue,
|
||||
--- a/drivers/net/wireless/ralink/rt2x00/rt2x00.h
|
||||
+++ b/drivers/net/wireless/ralink/rt2x00/rt2x00.h
|
||||
@@ -183,6 +183,15 @@ struct rf_channel {
|
||||
};
|
||||
|
||||
/*
|
||||
+ * Information structure for channel survey.
|
||||
+ */
|
||||
+struct rt2x00_chan_survey {
|
||||
+ u64 time_idle;
|
||||
+ u64 time_busy;
|
||||
+ u64 time_ext_busy;
|
||||
+};
|
||||
+
|
||||
+/*
|
||||
* Channel information structure
|
||||
*/
|
||||
struct channel_info {
|
||||
@@ -567,6 +576,7 @@ struct rt2x00lib_ops {
|
||||
* Data queue handlers.
|
||||
*/
|
||||
void (*watchdog) (struct rt2x00_dev *rt2x00dev);
|
||||
+ void (*update_survey) (struct rt2x00_dev *rt2x00dev);
|
||||
void (*start_queue) (struct data_queue *queue);
|
||||
void (*kick_queue) (struct data_queue *queue);
|
||||
void (*stop_queue) (struct data_queue *queue);
|
||||
@@ -755,6 +765,7 @@ struct rt2x00_dev {
|
||||
*/
|
||||
struct ieee80211_hw *hw;
|
||||
struct ieee80211_supported_band bands[NUM_NL80211_BANDS];
|
||||
+ struct rt2x00_chan_survey *chan_survey;
|
||||
enum nl80211_band curr_band;
|
||||
int curr_freq;
|
||||
|
||||
--- a/drivers/net/wireless/ralink/rt2x00/rt2x00dev.c
|
||||
+++ b/drivers/net/wireless/ralink/rt2x00/rt2x00dev.c
|
||||
@@ -1054,6 +1054,12 @@ static int rt2x00lib_probe_hw_modes(stru
|
||||
if (!rates)
|
||||
goto exit_free_channels;
|
||||
|
||||
+ rt2x00dev->chan_survey =
|
||||
+ kcalloc(spec->num_channels, sizeof(struct rt2x00_chan_survey),
|
||||
+ GFP_KERNEL);
|
||||
+ if (!rt2x00dev->chan_survey)
|
||||
+ goto exit_free_rates;
|
||||
+
|
||||
/*
|
||||
* Initialize Rate list.
|
||||
*/
|
||||
@@ -1105,6 +1111,8 @@ static int rt2x00lib_probe_hw_modes(stru
|
||||
|
||||
return 0;
|
||||
|
||||
+ exit_free_rates:
|
||||
+ kfree(rates);
|
||||
exit_free_channels:
|
||||
kfree(channels);
|
||||
rt2x00_err(rt2x00dev, "Allocation ieee80211 modes failed\n");
|
||||
--- a/drivers/net/wireless/ralink/rt2x00/rt2x00mac.c
|
||||
+++ b/drivers/net/wireless/ralink/rt2x00/rt2x00mac.c
|
||||
@@ -317,6 +317,15 @@ int rt2x00mac_config(struct ieee80211_hw
|
||||
return 0;
|
||||
|
||||
/*
|
||||
+ * To provide correct survey data for survey-based ACS algorithm
|
||||
+ * we have to save survey data for current channel before switching.
|
||||
+ */
|
||||
+ if (rt2x00dev->ops->lib->update_survey &&
|
||||
+ (changed & IEEE80211_CONF_CHANGE_CHANNEL)) {
|
||||
+ rt2x00dev->ops->lib->update_survey(rt2x00dev);
|
||||
+ }
|
||||
+
|
||||
+ /*
|
||||
* Some configuration parameters (e.g. channel and antenna values) can
|
||||
* only be set when the radio is enabled, but do require the RX to
|
||||
* be off. During this period we should keep link tuning enabled,
|
||||
@ -1,118 +0,0 @@
|
||||
Date: Mon, 19 Apr 2021 14:59:56 +0800
|
||||
From: Ping-Ke Shih <pkshih@realtek.com>
|
||||
To: <kvalo@codeaurora.org>
|
||||
CC: <linux-wireless@vger.kernel.org>, <mail@maciej.szmigiero.name>,
|
||||
<Larry.Finger@lwfinger.net>
|
||||
Subject: [PATCH] rtlwifi: implement set_tim by update beacon content
|
||||
|
||||
Once beacon content is changed, we update the content to wifi card by
|
||||
send_beacon_frame(). Then, STA with PS can wake up properly to receive its
|
||||
packets.
|
||||
|
||||
Since we update beacon content to PCI wifi devices every beacon interval,
|
||||
the only one usb device, 8192CU, needs to update beacon content when
|
||||
mac80211 calling set_tim.
|
||||
|
||||
Reported-by: Maciej S. Szmigiero <mail@maciej.szmigiero.name>
|
||||
Signed-off-by: Ping-Ke Shih <pkshih@realtek.com>
|
||||
Tested-by: Maciej S. Szmigiero <mail@maciej.szmigiero.name>
|
||||
---
|
||||
drivers/net/wireless/realtek/rtlwifi/core.c | 32 +++++++++++++++++++++
|
||||
drivers/net/wireless/realtek/rtlwifi/core.h | 1 +
|
||||
drivers/net/wireless/realtek/rtlwifi/usb.c | 3 ++
|
||||
drivers/net/wireless/realtek/rtlwifi/wifi.h | 1 +
|
||||
4 files changed, 37 insertions(+)
|
||||
|
||||
--- a/drivers/net/wireless/realtek/rtlwifi/core.c
|
||||
+++ b/drivers/net/wireless/realtek/rtlwifi/core.c
|
||||
@@ -1018,6 +1018,25 @@ static void send_beacon_frame(struct iee
|
||||
}
|
||||
}
|
||||
|
||||
+void rtl_update_beacon_work_callback(struct work_struct *work)
|
||||
+{
|
||||
+ struct rtl_works *rtlworks =
|
||||
+ container_of(work, struct rtl_works, update_beacon_work);
|
||||
+ struct ieee80211_hw *hw = rtlworks->hw;
|
||||
+ struct rtl_priv *rtlpriv = rtl_priv(hw);
|
||||
+ struct ieee80211_vif *vif = rtlpriv->mac80211.vif;
|
||||
+
|
||||
+ if (!vif) {
|
||||
+ WARN_ONCE(true, "no vif to update beacon\n");
|
||||
+ return;
|
||||
+ }
|
||||
+
|
||||
+ mutex_lock(&rtlpriv->locks.conf_mutex);
|
||||
+ send_beacon_frame(hw, vif);
|
||||
+ mutex_unlock(&rtlpriv->locks.conf_mutex);
|
||||
+}
|
||||
+EXPORT_SYMBOL_GPL(rtl_update_beacon_work_callback);
|
||||
+
|
||||
static void rtl_op_bss_info_changed(struct ieee80211_hw *hw,
|
||||
struct ieee80211_vif *vif,
|
||||
struct ieee80211_bss_conf *bss_conf,
|
||||
@@ -1747,6 +1766,18 @@ static void rtl_op_flush(struct ieee8021
|
||||
rtlpriv->intf_ops->flush(hw, queues, drop);
|
||||
}
|
||||
|
||||
+static int rtl_op_set_tim(struct ieee80211_hw *hw, struct ieee80211_sta *sta,
|
||||
+ bool set)
|
||||
+{
|
||||
+ struct rtl_priv *rtlpriv = rtl_priv(hw);
|
||||
+ struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
|
||||
+
|
||||
+ if (rtlhal->hw_type == HARDWARE_TYPE_RTL8192CU)
|
||||
+ schedule_work(&rtlpriv->works.update_beacon_work);
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
/* Description:
|
||||
* This routine deals with the Power Configuration CMD
|
||||
* parsing for RTL8723/RTL8188E Series IC.
|
||||
@@ -1903,6 +1934,7 @@ const struct ieee80211_ops rtl_ops = {
|
||||
.sta_add = rtl_op_sta_add,
|
||||
.sta_remove = rtl_op_sta_remove,
|
||||
.flush = rtl_op_flush,
|
||||
+ .set_tim = rtl_op_set_tim,
|
||||
};
|
||||
EXPORT_SYMBOL_GPL(rtl_ops);
|
||||
|
||||
--- a/drivers/net/wireless/realtek/rtlwifi/core.h
|
||||
+++ b/drivers/net/wireless/realtek/rtlwifi/core.h
|
||||
@@ -60,5 +60,6 @@ void rtl_bb_delay(struct ieee80211_hw *h
|
||||
bool rtl_cmd_send_packet(struct ieee80211_hw *hw, struct sk_buff *skb);
|
||||
bool rtl_btc_status_false(void);
|
||||
void rtl_dm_diginit(struct ieee80211_hw *hw, u32 cur_igval);
|
||||
+void rtl_update_beacon_work_callback(struct work_struct *work);
|
||||
|
||||
#endif
|
||||
--- a/drivers/net/wireless/realtek/rtlwifi/usb.c
|
||||
+++ b/drivers/net/wireless/realtek/rtlwifi/usb.c
|
||||
@@ -807,6 +807,7 @@ static void rtl_usb_stop(struct ieee8021
|
||||
|
||||
tasklet_kill(&rtlusb->rx_work_tasklet);
|
||||
cancel_work_sync(&rtlpriv->works.lps_change_work);
|
||||
+ cancel_work_sync(&rtlpriv->works.update_beacon_work);
|
||||
|
||||
flush_workqueue(rtlpriv->works.rtl_wq);
|
||||
|
||||
@@ -1033,6 +1034,8 @@ int rtl_usb_probe(struct usb_interface *
|
||||
rtl_fill_h2c_cmd_work_callback);
|
||||
INIT_WORK(&rtlpriv->works.lps_change_work,
|
||||
rtl_lps_change_work_callback);
|
||||
+ INIT_WORK(&rtlpriv->works.update_beacon_work,
|
||||
+ rtl_update_beacon_work_callback);
|
||||
|
||||
rtlpriv->usb_data_index = 0;
|
||||
init_completion(&rtlpriv->firmware_loading_complete);
|
||||
--- a/drivers/net/wireless/realtek/rtlwifi/wifi.h
|
||||
+++ b/drivers/net/wireless/realtek/rtlwifi/wifi.h
|
||||
@@ -2487,6 +2487,7 @@ struct rtl_works {
|
||||
|
||||
struct work_struct lps_change_work;
|
||||
struct work_struct fill_h2c_cmd;
|
||||
+ struct work_struct update_beacon_work;
|
||||
};
|
||||
|
||||
struct rtl_debug {
|
||||
@ -1,297 +0,0 @@
|
||||
--- a/include/uapi/linux/nl80211.h
|
||||
+++ b/include/uapi/linux/nl80211.h
|
||||
@@ -655,6 +655,9 @@
|
||||
* When a security association was established on an 802.1X network using
|
||||
* fast transition, this event should be followed by an
|
||||
* %NL80211_CMD_PORT_AUTHORIZED event.
|
||||
+ * Following a %NL80211_CMD_ROAM event userspace can issue
|
||||
+ * %NL80211_CMD_GET_SCAN in order to obtain the scan information for the
|
||||
+ * new BSS the card/driver roamed to.
|
||||
* @NL80211_CMD_DISCONNECT: drop a given connection; also used to notify
|
||||
* userspace that a connection was dropped by the AP or due to other
|
||||
* reasons, for this the %NL80211_ATTR_DISCONNECTED_BY_AP and
|
||||
@@ -757,7 +760,8 @@
|
||||
* of any other interfaces, and other interfaces will again take
|
||||
* precedence when they are used.
|
||||
*
|
||||
- * @NL80211_CMD_SET_WDS_PEER: Set the MAC address of the peer on a WDS interface.
|
||||
+ * @NL80211_CMD_SET_WDS_PEER: Set the MAC address of the peer on a WDS interface
|
||||
+ * (no longer supported).
|
||||
*
|
||||
* @NL80211_CMD_SET_MULTICAST_TO_UNICAST: Configure if this AP should perform
|
||||
* multicast to unicast conversion. When enabled, all multicast packets
|
||||
@@ -1177,6 +1181,10 @@
|
||||
* includes the contents of the frame. %NL80211_ATTR_ACK flag is included
|
||||
* if the recipient acknowledged the frame.
|
||||
*
|
||||
+ * @NL80211_CMD_SET_SAR_SPECS: SAR power limitation configuration is
|
||||
+ * passed using %NL80211_ATTR_SAR_SPEC. %NL80211_ATTR_WIPHY is used to
|
||||
+ * specify the wiphy index to be applied to.
|
||||
+ *
|
||||
* @NL80211_CMD_MAX: highest used command number
|
||||
* @__NL80211_CMD_AFTER_LAST: internal use
|
||||
*/
|
||||
@@ -1407,6 +1415,8 @@ enum nl80211_commands {
|
||||
|
||||
NL80211_CMD_CONTROL_PORT_FRAME_TX_STATUS,
|
||||
|
||||
+ NL80211_CMD_SET_SAR_SPECS,
|
||||
+
|
||||
/* add new commands above here */
|
||||
|
||||
/* used to define NL80211_CMD_MAX below */
|
||||
@@ -1750,8 +1760,9 @@ enum nl80211_commands {
|
||||
* specify just a single bitrate, which is to be used for the beacon.
|
||||
* The driver must also specify support for this with the extended
|
||||
* features NL80211_EXT_FEATURE_BEACON_RATE_LEGACY,
|
||||
- * NL80211_EXT_FEATURE_BEACON_RATE_HT and
|
||||
- * NL80211_EXT_FEATURE_BEACON_RATE_VHT.
|
||||
+ * NL80211_EXT_FEATURE_BEACON_RATE_HT,
|
||||
+ * NL80211_EXT_FEATURE_BEACON_RATE_VHT and
|
||||
+ * NL80211_EXT_FEATURE_BEACON_RATE_HE.
|
||||
*
|
||||
* @NL80211_ATTR_FRAME_MATCH: A binary attribute which typically must contain
|
||||
* at least one byte, currently used with @NL80211_CMD_REGISTER_FRAME.
|
||||
@@ -1955,8 +1966,15 @@ enum nl80211_commands {
|
||||
* @NL80211_ATTR_PROBE_RESP: Probe Response template data. Contains the entire
|
||||
* probe-response frame. The DA field in the 802.11 header is zero-ed out,
|
||||
* to be filled by the FW.
|
||||
- * @NL80211_ATTR_DISABLE_HT: Force HT capable interfaces to disable
|
||||
- * this feature. Currently, only supported in mac80211 drivers.
|
||||
+ * @NL80211_ATTR_DISABLE_HT: Force HT capable interfaces to disable
|
||||
+ * this feature during association. This is a flag attribute.
|
||||
+ * Currently only supported in mac80211 drivers.
|
||||
+ * @NL80211_ATTR_DISABLE_VHT: Force VHT capable interfaces to disable
|
||||
+ * this feature during association. This is a flag attribute.
|
||||
+ * Currently only supported in mac80211 drivers.
|
||||
+ * @NL80211_ATTR_DISABLE_HE: Force HE capable interfaces to disable
|
||||
+ * this feature during association. This is a flag attribute.
|
||||
+ * Currently only supported in mac80211 drivers.
|
||||
* @NL80211_ATTR_HT_CAPABILITY_MASK: Specify which bits of the
|
||||
* ATTR_HT_CAPABILITY to which attention should be paid.
|
||||
* Currently, only mac80211 NICs support this feature.
|
||||
@@ -2077,7 +2095,8 @@ enum nl80211_commands {
|
||||
* until the channel switch event.
|
||||
* @NL80211_ATTR_CH_SWITCH_BLOCK_TX: flag attribute specifying that transmission
|
||||
* must be blocked on the current channel (before the channel switch
|
||||
- * operation).
|
||||
+ * operation). Also included in the channel switch started event if quiet
|
||||
+ * was requested by the AP.
|
||||
* @NL80211_ATTR_CSA_IES: Nested set of attributes containing the IE information
|
||||
* for the time while performing a channel switch.
|
||||
* @NL80211_ATTR_CNTDWN_OFFS_BEACON: An array of offsets (u16) to the channel
|
||||
@@ -2527,6 +2546,20 @@ enum nl80211_commands {
|
||||
* override mask. Used with NL80211_ATTR_S1G_CAPABILITY in
|
||||
* NL80211_CMD_ASSOCIATE or NL80211_CMD_CONNECT.
|
||||
*
|
||||
+ * @NL80211_ATTR_SAE_PWE: Indicates the mechanism(s) allowed for SAE PWE
|
||||
+ * derivation in WPA3-Personal networks which are using SAE authentication.
|
||||
+ * This is a u8 attribute that encapsulates one of the values from
|
||||
+ * &enum nl80211_sae_pwe_mechanism.
|
||||
+ *
|
||||
+ * @NL80211_ATTR_SAR_SPEC: SAR power limitation specification when
|
||||
+ * used with %NL80211_CMD_SET_SAR_SPECS. The message contains fields
|
||||
+ * of %nl80211_sar_attrs which specifies the sar type and related
|
||||
+ * sar specs. Sar specs contains array of %nl80211_sar_specs_attrs.
|
||||
+ *
|
||||
+ * @NL80211_ATTR_RECONNECT_REQUESTED: flag attribute, used with deauth and
|
||||
+ * disassoc events to indicate that an immediate reconnect to the AP
|
||||
+ * is desired.
|
||||
+ *
|
||||
* @NUM_NL80211_ATTR: total number of nl80211_attrs available
|
||||
* @NL80211_ATTR_MAX: highest attribute number currently defined
|
||||
* @__NL80211_ATTR_AFTER_LAST: internal use
|
||||
@@ -3016,6 +3049,14 @@ enum nl80211_attrs {
|
||||
NL80211_ATTR_S1G_CAPABILITY,
|
||||
NL80211_ATTR_S1G_CAPABILITY_MASK,
|
||||
|
||||
+ NL80211_ATTR_SAE_PWE,
|
||||
+
|
||||
+ NL80211_ATTR_RECONNECT_REQUESTED,
|
||||
+
|
||||
+ NL80211_ATTR_SAR_SPEC,
|
||||
+
|
||||
+ NL80211_ATTR_DISABLE_HE,
|
||||
+
|
||||
/* add attributes here, update the policy in nl80211.c */
|
||||
|
||||
__NL80211_ATTR_AFTER_LAST,
|
||||
@@ -5896,6 +5937,19 @@ enum nl80211_feature_flags {
|
||||
* @NL80211_EXT_FEATURE_UNSOL_BCAST_PROBE_RESP: Driver/device supports
|
||||
* unsolicited broadcast probe response transmission
|
||||
*
|
||||
+ * @NL80211_EXT_FEATURE_BEACON_RATE_HE: Driver supports beacon rate
|
||||
+ * configuration (AP/mesh) with HE rates.
|
||||
+ *
|
||||
+ * @NL80211_EXT_FEATURE_SECURE_LTF: Device supports secure LTF measurement
|
||||
+ * exchange protocol.
|
||||
+ *
|
||||
+ * @NL80211_EXT_FEATURE_SECURE_RTT: Device supports secure RTT measurement
|
||||
+ * exchange protocol.
|
||||
+ *
|
||||
+ * @NL80211_EXT_FEATURE_PROT_RANGE_NEGO_AND_MEASURE: Device supports management
|
||||
+ * frame protection for all management frames exchanged during the
|
||||
+ * negotiation and range measurement procedure.
|
||||
+ *
|
||||
* @NUM_NL80211_EXT_FEATURES: number of extended features.
|
||||
* @MAX_NL80211_EXT_FEATURES: highest extended feature index.
|
||||
*/
|
||||
@@ -5956,6 +6010,10 @@ enum nl80211_ext_feature_index {
|
||||
NL80211_EXT_FEATURE_SAE_OFFLOAD_AP,
|
||||
NL80211_EXT_FEATURE_FILS_DISCOVERY,
|
||||
NL80211_EXT_FEATURE_UNSOL_BCAST_PROBE_RESP,
|
||||
+ NL80211_EXT_FEATURE_BEACON_RATE_HE,
|
||||
+ NL80211_EXT_FEATURE_SECURE_LTF,
|
||||
+ NL80211_EXT_FEATURE_SECURE_RTT,
|
||||
+ NL80211_EXT_FEATURE_PROT_RANGE_NEGO_AND_MEASURE,
|
||||
|
||||
/* add new features before the definition below */
|
||||
NUM_NL80211_EXT_FEATURES,
|
||||
@@ -6253,11 +6311,13 @@ struct nl80211_vendor_cmd_info {
|
||||
* @NL80211_TDLS_PEER_HT: TDLS peer is HT capable.
|
||||
* @NL80211_TDLS_PEER_VHT: TDLS peer is VHT capable.
|
||||
* @NL80211_TDLS_PEER_WMM: TDLS peer is WMM capable.
|
||||
+ * @NL80211_TDLS_PEER_HE: TDLS peer is HE capable.
|
||||
*/
|
||||
enum nl80211_tdls_peer_capability {
|
||||
NL80211_TDLS_PEER_HT = 1<<0,
|
||||
NL80211_TDLS_PEER_VHT = 1<<1,
|
||||
NL80211_TDLS_PEER_WMM = 1<<2,
|
||||
+ NL80211_TDLS_PEER_HE = 1<<3,
|
||||
};
|
||||
|
||||
/**
|
||||
@@ -6849,6 +6909,9 @@ enum nl80211_peer_measurement_ftm_capa {
|
||||
* if neither %NL80211_PMSR_FTM_REQ_ATTR_TRIGGER_BASED nor
|
||||
* %NL80211_PMSR_FTM_REQ_ATTR_NON_TRIGGER_BASED is set, EDCA based
|
||||
* ranging will be used.
|
||||
+ * @NL80211_PMSR_FTM_REQ_ATTR_LMR_FEEDBACK: negotiate for LMR feedback. Only
|
||||
+ * valid if either %NL80211_PMSR_FTM_REQ_ATTR_TRIGGER_BASED or
|
||||
+ * %NL80211_PMSR_FTM_REQ_ATTR_NON_TRIGGER_BASED is set.
|
||||
*
|
||||
* @NUM_NL80211_PMSR_FTM_REQ_ATTR: internal
|
||||
* @NL80211_PMSR_FTM_REQ_ATTR_MAX: highest attribute number
|
||||
@@ -6867,6 +6930,7 @@ enum nl80211_peer_measurement_ftm_req {
|
||||
NL80211_PMSR_FTM_REQ_ATTR_REQUEST_CIVICLOC,
|
||||
NL80211_PMSR_FTM_REQ_ATTR_TRIGGER_BASED,
|
||||
NL80211_PMSR_FTM_REQ_ATTR_NON_TRIGGER_BASED,
|
||||
+ NL80211_PMSR_FTM_REQ_ATTR_LMR_FEEDBACK,
|
||||
|
||||
/* keep last */
|
||||
NUM_NL80211_PMSR_FTM_REQ_ATTR,
|
||||
@@ -7124,4 +7188,115 @@ enum nl80211_unsol_bcast_probe_resp_attr
|
||||
NL80211_UNSOL_BCAST_PROBE_RESP_ATTR_MAX =
|
||||
__NL80211_UNSOL_BCAST_PROBE_RESP_ATTR_LAST - 1
|
||||
};
|
||||
+
|
||||
+/**
|
||||
+ * enum nl80211_sae_pwe_mechanism - The mechanism(s) allowed for SAE PWE
|
||||
+ * derivation. Applicable only when WPA3-Personal SAE authentication is
|
||||
+ * used.
|
||||
+ *
|
||||
+ * @NL80211_SAE_PWE_UNSPECIFIED: not specified, used internally to indicate that
|
||||
+ * attribute is not present from userspace.
|
||||
+ * @NL80211_SAE_PWE_HUNT_AND_PECK: hunting-and-pecking loop only
|
||||
+ * @NL80211_SAE_PWE_HASH_TO_ELEMENT: hash-to-element only
|
||||
+ * @NL80211_SAE_PWE_BOTH: both hunting-and-pecking loop and hash-to-element
|
||||
+ * can be used.
|
||||
+ */
|
||||
+enum nl80211_sae_pwe_mechanism {
|
||||
+ NL80211_SAE_PWE_UNSPECIFIED,
|
||||
+ NL80211_SAE_PWE_HUNT_AND_PECK,
|
||||
+ NL80211_SAE_PWE_HASH_TO_ELEMENT,
|
||||
+ NL80211_SAE_PWE_BOTH,
|
||||
+};
|
||||
+
|
||||
+/**
|
||||
+ * enum nl80211_sar_type - type of SAR specs
|
||||
+ *
|
||||
+ * @NL80211_SAR_TYPE_POWER: power limitation specified in 0.25dBm unit
|
||||
+ *
|
||||
+ */
|
||||
+enum nl80211_sar_type {
|
||||
+ NL80211_SAR_TYPE_POWER,
|
||||
+
|
||||
+ /* add new type here */
|
||||
+
|
||||
+ /* Keep last */
|
||||
+ NUM_NL80211_SAR_TYPE,
|
||||
+};
|
||||
+
|
||||
+/**
|
||||
+ * enum nl80211_sar_attrs - Attributes for SAR spec
|
||||
+ *
|
||||
+ * @NL80211_SAR_ATTR_TYPE: the SAR type as defined in &enum nl80211_sar_type.
|
||||
+ *
|
||||
+ * @NL80211_SAR_ATTR_SPECS: Nested array of SAR power
|
||||
+ * limit specifications. Each specification contains a set
|
||||
+ * of %nl80211_sar_specs_attrs.
|
||||
+ *
|
||||
+ * For SET operation, it contains array of %NL80211_SAR_ATTR_SPECS_POWER
|
||||
+ * and %NL80211_SAR_ATTR_SPECS_RANGE_INDEX.
|
||||
+ *
|
||||
+ * For sar_capa dump, it contains array of
|
||||
+ * %NL80211_SAR_ATTR_SPECS_START_FREQ
|
||||
+ * and %NL80211_SAR_ATTR_SPECS_END_FREQ.
|
||||
+ *
|
||||
+ * @__NL80211_SAR_ATTR_LAST: Internal
|
||||
+ * @NL80211_SAR_ATTR_MAX: highest sar attribute
|
||||
+ *
|
||||
+ * These attributes are used with %NL80211_CMD_SET_SAR_SPEC
|
||||
+ */
|
||||
+enum nl80211_sar_attrs {
|
||||
+ __NL80211_SAR_ATTR_INVALID,
|
||||
+
|
||||
+ NL80211_SAR_ATTR_TYPE,
|
||||
+ NL80211_SAR_ATTR_SPECS,
|
||||
+
|
||||
+ __NL80211_SAR_ATTR_LAST,
|
||||
+ NL80211_SAR_ATTR_MAX = __NL80211_SAR_ATTR_LAST - 1,
|
||||
+};
|
||||
+
|
||||
+/**
|
||||
+ * enum nl80211_sar_specs_attrs - Attributes for SAR power limit specs
|
||||
+ *
|
||||
+ * @NL80211_SAR_ATTR_SPECS_POWER: Required (s32)value to specify the actual
|
||||
+ * power limit value in units of 0.25 dBm if type is
|
||||
+ * NL80211_SAR_TYPE_POWER. (i.e., a value of 44 represents 11 dBm).
|
||||
+ * 0 means userspace doesn't have SAR limitation on this associated range.
|
||||
+ *
|
||||
+ * @NL80211_SAR_ATTR_SPECS_RANGE_INDEX: Required (u32) value to specify the
|
||||
+ * index of exported freq range table and the associated power limitation
|
||||
+ * is applied to this range.
|
||||
+ *
|
||||
+ * Userspace isn't required to set all the ranges advertised by WLAN driver,
|
||||
+ * and userspace can skip some certain ranges. These skipped ranges don't
|
||||
+ * have SAR limitations, and they are same as setting the
|
||||
+ * %NL80211_SAR_ATTR_SPECS_POWER to any unreasonable high value because any
|
||||
+ * value higher than regulatory allowed value just means SAR power
|
||||
+ * limitation is removed, but it's required to set at least one range.
|
||||
+ * It's not allowed to set duplicated range in one SET operation.
|
||||
+ *
|
||||
+ * Every SET operation overwrites previous SET operation.
|
||||
+ *
|
||||
+ * @NL80211_SAR_ATTR_SPECS_START_FREQ: Required (u32) value to specify the start
|
||||
+ * frequency of this range edge when registering SAR capability to wiphy.
|
||||
+ * It's not a channel center frequency. The unit is kHz.
|
||||
+ *
|
||||
+ * @NL80211_SAR_ATTR_SPECS_END_FREQ: Required (u32) value to specify the end
|
||||
+ * frequency of this range edge when registering SAR capability to wiphy.
|
||||
+ * It's not a channel center frequency. The unit is kHz.
|
||||
+ *
|
||||
+ * @__NL80211_SAR_ATTR_SPECS_LAST: Internal
|
||||
+ * @NL80211_SAR_ATTR_SPECS_MAX: highest sar specs attribute
|
||||
+ */
|
||||
+enum nl80211_sar_specs_attrs {
|
||||
+ __NL80211_SAR_ATTR_SPECS_INVALID,
|
||||
+
|
||||
+ NL80211_SAR_ATTR_SPECS_POWER,
|
||||
+ NL80211_SAR_ATTR_SPECS_RANGE_INDEX,
|
||||
+ NL80211_SAR_ATTR_SPECS_START_FREQ,
|
||||
+ NL80211_SAR_ATTR_SPECS_END_FREQ,
|
||||
+
|
||||
+ __NL80211_SAR_ATTR_SPECS_LAST,
|
||||
+ NL80211_SAR_ATTR_SPECS_MAX = __NL80211_SAR_ATTR_SPECS_LAST - 1,
|
||||
+};
|
||||
+
|
||||
#endif /* __LINUX_NL80211_H */
|
||||
@ -2,7 +2,7 @@ Used for AP+STA support in OpenWrt - preserve AP mode keys across STA reconnects
|
||||
|
||||
--- a/net/mac80211/cfg.c
|
||||
+++ b/net/mac80211/cfg.c
|
||||
@@ -1307,7 +1307,6 @@ static int ieee80211_stop_ap(struct wiph
|
||||
@@ -1314,7 +1314,6 @@ static int ieee80211_stop_ap(struct wiph
|
||||
sdata->vif.bss_conf.ftmr_params = NULL;
|
||||
|
||||
__sta_info_flush(sdata, true);
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
--- a/net/wireless/sysfs.c
|
||||
+++ b/net/wireless/sysfs.c
|
||||
@@ -23,18 +23,35 @@ static inline struct cfg80211_registered
|
||||
@@ -24,18 +24,35 @@ static inline struct cfg80211_registered
|
||||
return container_of(dev, struct cfg80211_registered_device, wiphy.dev);
|
||||
}
|
||||
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
--- a/net/mac80211/main.c
|
||||
+++ b/net/mac80211/main.c
|
||||
@@ -321,7 +321,7 @@ void ieee80211_restart_hw(struct ieee802
|
||||
@@ -337,7 +337,7 @@ void ieee80211_restart_hw(struct ieee802
|
||||
}
|
||||
EXPORT_SYMBOL(ieee80211_restart_hw);
|
||||
|
||||
@ -9,7 +9,7 @@
|
||||
static int ieee80211_ifa_changed(struct notifier_block *nb,
|
||||
unsigned long data, void *arg)
|
||||
{
|
||||
@@ -380,7 +380,7 @@ static int ieee80211_ifa_changed(struct
|
||||
@@ -396,7 +396,7 @@ static int ieee80211_ifa_changed(struct
|
||||
}
|
||||
#endif
|
||||
|
||||
@ -18,8 +18,8 @@
|
||||
static int ieee80211_ifa6_changed(struct notifier_block *nb,
|
||||
unsigned long data, void *arg)
|
||||
{
|
||||
@@ -1315,14 +1315,14 @@ int ieee80211_register_hw(struct ieee802
|
||||
|
||||
@@ -1324,14 +1324,14 @@ int ieee80211_register_hw(struct ieee802
|
||||
wiphy_unlock(hw->wiphy);
|
||||
rtnl_unlock();
|
||||
|
||||
-#ifdef CONFIG_INET
|
||||
@ -35,7 +35,7 @@
|
||||
local->ifa6_notifier.notifier_call = ieee80211_ifa6_changed;
|
||||
result = register_inet6addr_notifier(&local->ifa6_notifier);
|
||||
if (result)
|
||||
@@ -1331,13 +1331,13 @@ int ieee80211_register_hw(struct ieee802
|
||||
@@ -1340,13 +1340,13 @@ int ieee80211_register_hw(struct ieee802
|
||||
|
||||
return 0;
|
||||
|
||||
@ -52,7 +52,7 @@
|
||||
fail_ifa:
|
||||
#endif
|
||||
wiphy_unregister(local->hw.wiphy);
|
||||
@@ -1365,10 +1365,10 @@ void ieee80211_unregister_hw(struct ieee
|
||||
@@ -1374,10 +1374,10 @@ void ieee80211_unregister_hw(struct ieee
|
||||
tasklet_kill(&local->tx_pending_tasklet);
|
||||
tasklet_kill(&local->tasklet);
|
||||
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
--- a/net/mac80211/cfg.c
|
||||
+++ b/net/mac80211/cfg.c
|
||||
@@ -2463,7 +2463,7 @@ static int ieee80211_scan(struct wiphy *
|
||||
@@ -2495,7 +2495,7 @@ static int ieee80211_scan(struct wiphy *
|
||||
* the frames sent while scanning on other channel will be
|
||||
* lost)
|
||||
*/
|
||||
|
||||
@ -1,279 +0,0 @@
|
||||
From: Johannes Berg <johannes.berg@intel.com>
|
||||
Date: Sun, 6 Dec 2020 14:54:42 +0200
|
||||
Subject: [PATCH] cfg80211: support immediate reconnect request hint
|
||||
|
||||
There are cases where it's necessary to disconnect, but an
|
||||
immediate reconnection is desired. Support a hint to userspace
|
||||
that this is the case, by including a new attribute in the
|
||||
deauth or disassoc event.
|
||||
|
||||
Signed-off-by: Luca Coelho <luciano.coelho@intel.com>
|
||||
Link: https://lore.kernel.org/r/iwlwifi.20201206145305.58d33941fb9d.I0e7168c205c7949529c8e3b86f3c9b12c01a7017@changeid
|
||||
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
|
||||
---
|
||||
|
||||
--- a/include/net/cfg80211.h
|
||||
+++ b/include/net/cfg80211.h
|
||||
@@ -6410,13 +6410,15 @@ void cfg80211_abandon_assoc(struct net_d
|
||||
* @dev: network device
|
||||
* @buf: 802.11 frame (header + body)
|
||||
* @len: length of the frame data
|
||||
+ * @reconnect: immediate reconnect is desired (include the nl80211 attribute)
|
||||
*
|
||||
* This function is called whenever deauthentication has been processed in
|
||||
* station mode. This includes both received deauthentication frames and
|
||||
* locally generated ones. This function may sleep. The caller must hold the
|
||||
* corresponding wdev's mutex.
|
||||
*/
|
||||
-void cfg80211_tx_mlme_mgmt(struct net_device *dev, const u8 *buf, size_t len);
|
||||
+void cfg80211_tx_mlme_mgmt(struct net_device *dev, const u8 *buf, size_t len,
|
||||
+ bool reconnect);
|
||||
|
||||
/**
|
||||
* cfg80211_rx_unprot_mlme_mgmt - notification of unprotected mlme mgmt frame
|
||||
--- a/net/mac80211/mlme.c
|
||||
+++ b/net/mac80211/mlme.c
|
||||
@@ -2725,7 +2725,7 @@ static void ieee80211_report_disconnect(
|
||||
};
|
||||
|
||||
if (tx)
|
||||
- cfg80211_tx_mlme_mgmt(sdata->dev, buf, len);
|
||||
+ cfg80211_tx_mlme_mgmt(sdata->dev, buf, len, false);
|
||||
else
|
||||
cfg80211_rx_mlme_mgmt(sdata->dev, buf, len);
|
||||
|
||||
@@ -4719,7 +4719,8 @@ void ieee80211_mgd_quiesce(struct ieee80
|
||||
if (ifmgd->auth_data)
|
||||
ieee80211_destroy_auth_data(sdata, false);
|
||||
cfg80211_tx_mlme_mgmt(sdata->dev, frame_buf,
|
||||
- IEEE80211_DEAUTH_FRAME_LEN);
|
||||
+ IEEE80211_DEAUTH_FRAME_LEN,
|
||||
+ false);
|
||||
}
|
||||
|
||||
/* This is a bit of a hack - we should find a better and more generic
|
||||
--- a/net/wireless/mlme.c
|
||||
+++ b/net/wireless/mlme.c
|
||||
@@ -4,7 +4,7 @@
|
||||
*
|
||||
* Copyright (c) 2009, Jouni Malinen <j@w1.fi>
|
||||
* Copyright (c) 2015 Intel Deutschland GmbH
|
||||
- * Copyright (C) 2019 Intel Corporation
|
||||
+ * Copyright (C) 2019-2020 Intel Corporation
|
||||
*/
|
||||
|
||||
#include <linux/kernel.h>
|
||||
@@ -81,7 +81,8 @@ static void cfg80211_process_auth(struct
|
||||
}
|
||||
|
||||
static void cfg80211_process_deauth(struct wireless_dev *wdev,
|
||||
- const u8 *buf, size_t len)
|
||||
+ const u8 *buf, size_t len,
|
||||
+ bool reconnect)
|
||||
{
|
||||
struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy);
|
||||
struct ieee80211_mgmt *mgmt = (struct ieee80211_mgmt *)buf;
|
||||
@@ -89,7 +90,7 @@ static void cfg80211_process_deauth(stru
|
||||
u16 reason_code = le16_to_cpu(mgmt->u.deauth.reason_code);
|
||||
bool from_ap = !ether_addr_equal(mgmt->sa, wdev->netdev->dev_addr);
|
||||
|
||||
- nl80211_send_deauth(rdev, wdev->netdev, buf, len, GFP_KERNEL);
|
||||
+ nl80211_send_deauth(rdev, wdev->netdev, buf, len, reconnect, GFP_KERNEL);
|
||||
|
||||
if (!wdev->current_bss ||
|
||||
!ether_addr_equal(wdev->current_bss->pub.bssid, bssid))
|
||||
@@ -100,7 +101,8 @@ static void cfg80211_process_deauth(stru
|
||||
}
|
||||
|
||||
static void cfg80211_process_disassoc(struct wireless_dev *wdev,
|
||||
- const u8 *buf, size_t len)
|
||||
+ const u8 *buf, size_t len,
|
||||
+ bool reconnect)
|
||||
{
|
||||
struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy);
|
||||
struct ieee80211_mgmt *mgmt = (struct ieee80211_mgmt *)buf;
|
||||
@@ -108,7 +110,8 @@ static void cfg80211_process_disassoc(st
|
||||
u16 reason_code = le16_to_cpu(mgmt->u.disassoc.reason_code);
|
||||
bool from_ap = !ether_addr_equal(mgmt->sa, wdev->netdev->dev_addr);
|
||||
|
||||
- nl80211_send_disassoc(rdev, wdev->netdev, buf, len, GFP_KERNEL);
|
||||
+ nl80211_send_disassoc(rdev, wdev->netdev, buf, len, reconnect,
|
||||
+ GFP_KERNEL);
|
||||
|
||||
if (WARN_ON(!wdev->current_bss ||
|
||||
!ether_addr_equal(wdev->current_bss->pub.bssid, bssid)))
|
||||
@@ -133,9 +136,9 @@ void cfg80211_rx_mlme_mgmt(struct net_de
|
||||
if (ieee80211_is_auth(mgmt->frame_control))
|
||||
cfg80211_process_auth(wdev, buf, len);
|
||||
else if (ieee80211_is_deauth(mgmt->frame_control))
|
||||
- cfg80211_process_deauth(wdev, buf, len);
|
||||
+ cfg80211_process_deauth(wdev, buf, len, false);
|
||||
else if (ieee80211_is_disassoc(mgmt->frame_control))
|
||||
- cfg80211_process_disassoc(wdev, buf, len);
|
||||
+ cfg80211_process_disassoc(wdev, buf, len, false);
|
||||
}
|
||||
EXPORT_SYMBOL(cfg80211_rx_mlme_mgmt);
|
||||
|
||||
@@ -180,22 +183,23 @@ void cfg80211_abandon_assoc(struct net_d
|
||||
}
|
||||
EXPORT_SYMBOL(cfg80211_abandon_assoc);
|
||||
|
||||
-void cfg80211_tx_mlme_mgmt(struct net_device *dev, const u8 *buf, size_t len)
|
||||
+void cfg80211_tx_mlme_mgmt(struct net_device *dev, const u8 *buf, size_t len,
|
||||
+ bool reconnect)
|
||||
{
|
||||
struct wireless_dev *wdev = dev->ieee80211_ptr;
|
||||
struct ieee80211_mgmt *mgmt = (void *)buf;
|
||||
|
||||
ASSERT_WDEV_LOCK(wdev);
|
||||
|
||||
- trace_cfg80211_tx_mlme_mgmt(dev, buf, len);
|
||||
+ trace_cfg80211_tx_mlme_mgmt(dev, buf, len, reconnect);
|
||||
|
||||
if (WARN_ON(len < 2))
|
||||
return;
|
||||
|
||||
if (ieee80211_is_deauth(mgmt->frame_control))
|
||||
- cfg80211_process_deauth(wdev, buf, len);
|
||||
+ cfg80211_process_deauth(wdev, buf, len, reconnect);
|
||||
else
|
||||
- cfg80211_process_disassoc(wdev, buf, len);
|
||||
+ cfg80211_process_disassoc(wdev, buf, len, reconnect);
|
||||
}
|
||||
EXPORT_SYMBOL(cfg80211_tx_mlme_mgmt);
|
||||
|
||||
--- a/net/wireless/nl80211.c
|
||||
+++ b/net/wireless/nl80211.c
|
||||
@@ -736,6 +736,7 @@ static const struct nla_policy nl80211_p
|
||||
NLA_POLICY_EXACT_LEN(IEEE80211_S1G_CAPABILITY_LEN),
|
||||
[NL80211_ATTR_S1G_CAPABILITY_MASK] =
|
||||
NLA_POLICY_EXACT_LEN(IEEE80211_S1G_CAPABILITY_LEN),
|
||||
+ [NL80211_ATTR_RECONNECT_REQUESTED] = { .type = NLA_REJECT },
|
||||
};
|
||||
|
||||
/* policy for the key attributes */
|
||||
@@ -15902,7 +15903,7 @@ static void nl80211_send_mlme_event(stru
|
||||
const u8 *buf, size_t len,
|
||||
enum nl80211_commands cmd, gfp_t gfp,
|
||||
int uapsd_queues, const u8 *req_ies,
|
||||
- size_t req_ies_len)
|
||||
+ size_t req_ies_len, bool reconnect)
|
||||
{
|
||||
struct sk_buff *msg;
|
||||
void *hdr;
|
||||
@@ -15924,6 +15925,9 @@ static void nl80211_send_mlme_event(stru
|
||||
nla_put(msg, NL80211_ATTR_REQ_IE, req_ies_len, req_ies)))
|
||||
goto nla_put_failure;
|
||||
|
||||
+ if (reconnect && nla_put_flag(msg, NL80211_ATTR_RECONNECT_REQUESTED))
|
||||
+ goto nla_put_failure;
|
||||
+
|
||||
if (uapsd_queues >= 0) {
|
||||
struct nlattr *nla_wmm =
|
||||
nla_nest_start_noflag(msg, NL80211_ATTR_STA_WME);
|
||||
@@ -15952,7 +15956,8 @@ void nl80211_send_rx_auth(struct cfg8021
|
||||
size_t len, gfp_t gfp)
|
||||
{
|
||||
nl80211_send_mlme_event(rdev, netdev, buf, len,
|
||||
- NL80211_CMD_AUTHENTICATE, gfp, -1, NULL, 0);
|
||||
+ NL80211_CMD_AUTHENTICATE, gfp, -1, NULL, 0,
|
||||
+ false);
|
||||
}
|
||||
|
||||
void nl80211_send_rx_assoc(struct cfg80211_registered_device *rdev,
|
||||
@@ -15962,23 +15967,25 @@ void nl80211_send_rx_assoc(struct cfg802
|
||||
{
|
||||
nl80211_send_mlme_event(rdev, netdev, buf, len,
|
||||
NL80211_CMD_ASSOCIATE, gfp, uapsd_queues,
|
||||
- req_ies, req_ies_len);
|
||||
+ req_ies, req_ies_len, false);
|
||||
}
|
||||
|
||||
void nl80211_send_deauth(struct cfg80211_registered_device *rdev,
|
||||
struct net_device *netdev, const u8 *buf,
|
||||
- size_t len, gfp_t gfp)
|
||||
+ size_t len, bool reconnect, gfp_t gfp)
|
||||
{
|
||||
nl80211_send_mlme_event(rdev, netdev, buf, len,
|
||||
- NL80211_CMD_DEAUTHENTICATE, gfp, -1, NULL, 0);
|
||||
+ NL80211_CMD_DEAUTHENTICATE, gfp, -1, NULL, 0,
|
||||
+ reconnect);
|
||||
}
|
||||
|
||||
void nl80211_send_disassoc(struct cfg80211_registered_device *rdev,
|
||||
struct net_device *netdev, const u8 *buf,
|
||||
- size_t len, gfp_t gfp)
|
||||
+ size_t len, bool reconnect, gfp_t gfp)
|
||||
{
|
||||
nl80211_send_mlme_event(rdev, netdev, buf, len,
|
||||
- NL80211_CMD_DISASSOCIATE, gfp, -1, NULL, 0);
|
||||
+ NL80211_CMD_DISASSOCIATE, gfp, -1, NULL, 0,
|
||||
+ reconnect);
|
||||
}
|
||||
|
||||
void cfg80211_rx_unprot_mlme_mgmt(struct net_device *dev, const u8 *buf,
|
||||
@@ -16009,7 +16016,7 @@ void cfg80211_rx_unprot_mlme_mgmt(struct
|
||||
|
||||
trace_cfg80211_rx_unprot_mlme_mgmt(dev, buf, len);
|
||||
nl80211_send_mlme_event(rdev, dev, buf, len, cmd, GFP_ATOMIC, -1,
|
||||
- NULL, 0);
|
||||
+ NULL, 0, false);
|
||||
}
|
||||
EXPORT_SYMBOL(cfg80211_rx_unprot_mlme_mgmt);
|
||||
|
||||
--- a/net/wireless/nl80211.h
|
||||
+++ b/net/wireless/nl80211.h
|
||||
@@ -1,7 +1,7 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0 */
|
||||
/*
|
||||
* Portions of this file
|
||||
- * Copyright (C) 2018 Intel Corporation
|
||||
+ * Copyright (C) 2018, 2020 Intel Corporation
|
||||
*/
|
||||
#ifndef __NET_WIRELESS_NL80211_H
|
||||
#define __NET_WIRELESS_NL80211_H
|
||||
@@ -69,10 +69,12 @@ void nl80211_send_rx_assoc(struct cfg802
|
||||
const u8 *req_ies, size_t req_ies_len);
|
||||
void nl80211_send_deauth(struct cfg80211_registered_device *rdev,
|
||||
struct net_device *netdev,
|
||||
- const u8 *buf, size_t len, gfp_t gfp);
|
||||
+ const u8 *buf, size_t len,
|
||||
+ bool reconnect, gfp_t gfp);
|
||||
void nl80211_send_disassoc(struct cfg80211_registered_device *rdev,
|
||||
struct net_device *netdev,
|
||||
- const u8 *buf, size_t len, gfp_t gfp);
|
||||
+ const u8 *buf, size_t len,
|
||||
+ bool reconnect, gfp_t gfp);
|
||||
void nl80211_send_auth_timeout(struct cfg80211_registered_device *rdev,
|
||||
struct net_device *netdev,
|
||||
const u8 *addr, gfp_t gfp);
|
||||
--- a/net/wireless/trace.h
|
||||
+++ b/net/wireless/trace.h
|
||||
@@ -2684,19 +2684,23 @@ DEFINE_EVENT(netdev_frame_event, cfg8021
|
||||
);
|
||||
|
||||
TRACE_EVENT(cfg80211_tx_mlme_mgmt,
|
||||
- TP_PROTO(struct net_device *netdev, const u8 *buf, int len),
|
||||
- TP_ARGS(netdev, buf, len),
|
||||
+ TP_PROTO(struct net_device *netdev, const u8 *buf, int len,
|
||||
+ bool reconnect),
|
||||
+ TP_ARGS(netdev, buf, len, reconnect),
|
||||
TP_STRUCT__entry(
|
||||
NETDEV_ENTRY
|
||||
__dynamic_array(u8, frame, len)
|
||||
+ __field(int, reconnect)
|
||||
),
|
||||
TP_fast_assign(
|
||||
NETDEV_ASSIGN;
|
||||
memcpy(__get_dynamic_array(frame), buf, len);
|
||||
+ __entry->reconnect = reconnect;
|
||||
),
|
||||
- TP_printk(NETDEV_PR_FMT ", ftype:0x%.2x",
|
||||
+ TP_printk(NETDEV_PR_FMT ", ftype:0x%.2x reconnect:%d",
|
||||
NETDEV_PR_ARG,
|
||||
- le16_to_cpup((__le16 *)__get_dynamic_array(frame)))
|
||||
+ le16_to_cpup((__le16 *)__get_dynamic_array(frame)),
|
||||
+ __entry->reconnect)
|
||||
);
|
||||
|
||||
DECLARE_EVENT_CLASS(netdev_mac_evt,
|
||||
@ -1,271 +0,0 @@
|
||||
From: Johannes Berg <johannes.berg@intel.com>
|
||||
Date: Sun, 6 Dec 2020 14:54:43 +0200
|
||||
Subject: [PATCH] mac80211: support driver-based disconnect with reconnect hint
|
||||
|
||||
Support the driver indicating that a disconnection needs
|
||||
to be performed, and pass through the reconnect hint in
|
||||
this case.
|
||||
|
||||
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
|
||||
Signed-off-by: Luca Coelho <luciano.coelho@intel.com>
|
||||
Link: https://lore.kernel.org/r/iwlwifi.20201206145305.5c8dab7a22a0.I58459fdf6968b16c90cab9c574f0f04ca22b0c79@changeid
|
||||
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
|
||||
---
|
||||
|
||||
--- a/include/net/mac80211.h
|
||||
+++ b/include/net/mac80211.h
|
||||
@@ -5885,6 +5885,17 @@ void ieee80211_beacon_loss(struct ieee80
|
||||
void ieee80211_connection_loss(struct ieee80211_vif *vif);
|
||||
|
||||
/**
|
||||
+ * ieee80211_disconnect - request disconnection
|
||||
+ *
|
||||
+ * @vif: &struct ieee80211_vif pointer from the add_interface callback.
|
||||
+ * @reconnect: immediate reconnect is desired
|
||||
+ *
|
||||
+ * Request disconnection from the current network and, if enabled, send a
|
||||
+ * hint to the higher layers that immediate reconnect is desired.
|
||||
+ */
|
||||
+void ieee80211_disconnect(struct ieee80211_vif *vif, bool reconnect);
|
||||
+
|
||||
+/**
|
||||
* ieee80211_resume_disconnect - disconnect from AP after resume
|
||||
*
|
||||
* @vif: &struct ieee80211_vif pointer from the add_interface callback.
|
||||
--- a/net/mac80211/ieee80211_i.h
|
||||
+++ b/net/mac80211/ieee80211_i.h
|
||||
@@ -450,7 +450,9 @@ struct ieee80211_if_managed {
|
||||
unsigned long probe_timeout;
|
||||
int probe_send_count;
|
||||
bool nullfunc_failed;
|
||||
- bool connection_loss;
|
||||
+ u8 connection_loss:1,
|
||||
+ driver_disconnect:1,
|
||||
+ reconnect:1;
|
||||
|
||||
struct cfg80211_bss *associated;
|
||||
struct ieee80211_mgd_auth_data *auth_data;
|
||||
--- a/net/mac80211/mlme.c
|
||||
+++ b/net/mac80211/mlme.c
|
||||
@@ -2716,7 +2716,7 @@ EXPORT_SYMBOL(ieee80211_ap_probereq_get)
|
||||
|
||||
static void ieee80211_report_disconnect(struct ieee80211_sub_if_data *sdata,
|
||||
const u8 *buf, size_t len, bool tx,
|
||||
- u16 reason)
|
||||
+ u16 reason, bool reconnect)
|
||||
{
|
||||
struct ieee80211_event event = {
|
||||
.type = MLME_EVENT,
|
||||
@@ -2725,7 +2725,7 @@ static void ieee80211_report_disconnect(
|
||||
};
|
||||
|
||||
if (tx)
|
||||
- cfg80211_tx_mlme_mgmt(sdata->dev, buf, len, false);
|
||||
+ cfg80211_tx_mlme_mgmt(sdata->dev, buf, len, reconnect);
|
||||
else
|
||||
cfg80211_rx_mlme_mgmt(sdata->dev, buf, len);
|
||||
|
||||
@@ -2747,13 +2747,18 @@ static void __ieee80211_disconnect(struc
|
||||
|
||||
tx = !sdata->csa_block_tx;
|
||||
|
||||
- /* AP is probably out of range (or not reachable for another reason) so
|
||||
- * remove the bss struct for that AP.
|
||||
- */
|
||||
- cfg80211_unlink_bss(local->hw.wiphy, ifmgd->associated);
|
||||
+ if (!ifmgd->driver_disconnect) {
|
||||
+ /*
|
||||
+ * AP is probably out of range (or not reachable for another
|
||||
+ * reason) so remove the bss struct for that AP.
|
||||
+ */
|
||||
+ cfg80211_unlink_bss(local->hw.wiphy, ifmgd->associated);
|
||||
+ }
|
||||
|
||||
ieee80211_set_disassoc(sdata, IEEE80211_STYPE_DEAUTH,
|
||||
- WLAN_REASON_DISASSOC_DUE_TO_INACTIVITY,
|
||||
+ ifmgd->driver_disconnect ?
|
||||
+ WLAN_REASON_DEAUTH_LEAVING :
|
||||
+ WLAN_REASON_DISASSOC_DUE_TO_INACTIVITY,
|
||||
tx, frame_buf);
|
||||
mutex_lock(&local->mtx);
|
||||
sdata->vif.csa_active = false;
|
||||
@@ -2766,7 +2771,9 @@ static void __ieee80211_disconnect(struc
|
||||
mutex_unlock(&local->mtx);
|
||||
|
||||
ieee80211_report_disconnect(sdata, frame_buf, sizeof(frame_buf), tx,
|
||||
- WLAN_REASON_DISASSOC_DUE_TO_INACTIVITY);
|
||||
+ WLAN_REASON_DISASSOC_DUE_TO_INACTIVITY,
|
||||
+ ifmgd->reconnect);
|
||||
+ ifmgd->reconnect = false;
|
||||
|
||||
sdata_unlock(sdata);
|
||||
}
|
||||
@@ -2785,6 +2792,13 @@ static void ieee80211_beacon_connection_
|
||||
sdata_info(sdata, "Connection to AP %pM lost\n",
|
||||
ifmgd->bssid);
|
||||
__ieee80211_disconnect(sdata);
|
||||
+ ifmgd->connection_loss = false;
|
||||
+ } else if (ifmgd->driver_disconnect) {
|
||||
+ sdata_info(sdata,
|
||||
+ "Driver requested disconnection from AP %pM\n",
|
||||
+ ifmgd->bssid);
|
||||
+ __ieee80211_disconnect(sdata);
|
||||
+ ifmgd->driver_disconnect = false;
|
||||
} else {
|
||||
ieee80211_mgd_probe_ap(sdata, true);
|
||||
}
|
||||
@@ -2823,6 +2837,21 @@ void ieee80211_connection_loss(struct ie
|
||||
}
|
||||
EXPORT_SYMBOL(ieee80211_connection_loss);
|
||||
|
||||
+void ieee80211_disconnect(struct ieee80211_vif *vif, bool reconnect)
|
||||
+{
|
||||
+ struct ieee80211_sub_if_data *sdata = vif_to_sdata(vif);
|
||||
+ struct ieee80211_hw *hw = &sdata->local->hw;
|
||||
+
|
||||
+ trace_api_disconnect(sdata, reconnect);
|
||||
+
|
||||
+ if (WARN_ON(sdata->vif.type != NL80211_IFTYPE_STATION))
|
||||
+ return;
|
||||
+
|
||||
+ sdata->u.mgd.driver_disconnect = true;
|
||||
+ sdata->u.mgd.reconnect = reconnect;
|
||||
+ ieee80211_queue_work(hw, &sdata->u.mgd.beacon_connection_loss_work);
|
||||
+}
|
||||
+EXPORT_SYMBOL(ieee80211_disconnect);
|
||||
|
||||
static void ieee80211_destroy_auth_data(struct ieee80211_sub_if_data *sdata,
|
||||
bool assoc)
|
||||
@@ -3126,7 +3155,7 @@ static void ieee80211_rx_mgmt_deauth(str
|
||||
ieee80211_set_disassoc(sdata, 0, 0, false, NULL);
|
||||
|
||||
ieee80211_report_disconnect(sdata, (u8 *)mgmt, len, false,
|
||||
- reason_code);
|
||||
+ reason_code, false);
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -3175,7 +3204,8 @@ static void ieee80211_rx_mgmt_disassoc(s
|
||||
|
||||
ieee80211_set_disassoc(sdata, 0, 0, false, NULL);
|
||||
|
||||
- ieee80211_report_disconnect(sdata, (u8 *)mgmt, len, false, reason_code);
|
||||
+ ieee80211_report_disconnect(sdata, (u8 *)mgmt, len, false, reason_code,
|
||||
+ false);
|
||||
}
|
||||
|
||||
static void ieee80211_get_rates(struct ieee80211_supported_band *sband,
|
||||
@@ -4199,7 +4229,8 @@ static void ieee80211_rx_mgmt_beacon(str
|
||||
true, deauth_buf);
|
||||
ieee80211_report_disconnect(sdata, deauth_buf,
|
||||
sizeof(deauth_buf), true,
|
||||
- WLAN_REASON_DEAUTH_LEAVING);
|
||||
+ WLAN_REASON_DEAUTH_LEAVING,
|
||||
+ false);
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -4344,7 +4375,7 @@ static void ieee80211_sta_connection_los
|
||||
tx, frame_buf);
|
||||
|
||||
ieee80211_report_disconnect(sdata, frame_buf, sizeof(frame_buf), true,
|
||||
- reason);
|
||||
+ reason, false);
|
||||
}
|
||||
|
||||
static int ieee80211_auth(struct ieee80211_sub_if_data *sdata)
|
||||
@@ -5434,7 +5465,8 @@ int ieee80211_mgd_auth(struct ieee80211_
|
||||
|
||||
ieee80211_report_disconnect(sdata, frame_buf,
|
||||
sizeof(frame_buf), true,
|
||||
- WLAN_REASON_UNSPECIFIED);
|
||||
+ WLAN_REASON_UNSPECIFIED,
|
||||
+ false);
|
||||
}
|
||||
|
||||
sdata_info(sdata, "authenticate with %pM\n", req->bss->bssid);
|
||||
@@ -5506,7 +5538,8 @@ int ieee80211_mgd_assoc(struct ieee80211
|
||||
|
||||
ieee80211_report_disconnect(sdata, frame_buf,
|
||||
sizeof(frame_buf), true,
|
||||
- WLAN_REASON_UNSPECIFIED);
|
||||
+ WLAN_REASON_UNSPECIFIED,
|
||||
+ false);
|
||||
}
|
||||
|
||||
if (ifmgd->auth_data && !ifmgd->auth_data->done) {
|
||||
@@ -5809,7 +5842,7 @@ int ieee80211_mgd_deauth(struct ieee8021
|
||||
ieee80211_destroy_auth_data(sdata, false);
|
||||
ieee80211_report_disconnect(sdata, frame_buf,
|
||||
sizeof(frame_buf), true,
|
||||
- req->reason_code);
|
||||
+ req->reason_code, false);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -5829,7 +5862,7 @@ int ieee80211_mgd_deauth(struct ieee8021
|
||||
ieee80211_destroy_assoc_data(sdata, false, true);
|
||||
ieee80211_report_disconnect(sdata, frame_buf,
|
||||
sizeof(frame_buf), true,
|
||||
- req->reason_code);
|
||||
+ req->reason_code, false);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -5844,7 +5877,7 @@ int ieee80211_mgd_deauth(struct ieee8021
|
||||
req->reason_code, tx, frame_buf);
|
||||
ieee80211_report_disconnect(sdata, frame_buf,
|
||||
sizeof(frame_buf), true,
|
||||
- req->reason_code);
|
||||
+ req->reason_code, false);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -5877,7 +5910,7 @@ int ieee80211_mgd_disassoc(struct ieee80
|
||||
frame_buf);
|
||||
|
||||
ieee80211_report_disconnect(sdata, frame_buf, sizeof(frame_buf), true,
|
||||
- req->reason_code);
|
||||
+ req->reason_code, false);
|
||||
|
||||
return 0;
|
||||
}
|
||||
--- a/net/mac80211/trace.h
|
||||
+++ b/net/mac80211/trace.h
|
||||
@@ -2,7 +2,7 @@
|
||||
/*
|
||||
* Portions of this file
|
||||
* Copyright(c) 2016-2017 Intel Deutschland GmbH
|
||||
-* Copyright (C) 2018 - 2019 Intel Corporation
|
||||
+* Copyright (C) 2018 - 2020 Intel Corporation
|
||||
*/
|
||||
|
||||
#if !defined(__MAC80211_DRIVER_TRACE) || defined(TRACE_HEADER_MULTI_READ)
|
||||
@@ -2086,6 +2086,27 @@ TRACE_EVENT(api_connection_loss,
|
||||
)
|
||||
);
|
||||
|
||||
+TRACE_EVENT(api_disconnect,
|
||||
+ TP_PROTO(struct ieee80211_sub_if_data *sdata, bool reconnect),
|
||||
+
|
||||
+ TP_ARGS(sdata, reconnect),
|
||||
+
|
||||
+ TP_STRUCT__entry(
|
||||
+ VIF_ENTRY
|
||||
+ __field(int, reconnect)
|
||||
+ ),
|
||||
+
|
||||
+ TP_fast_assign(
|
||||
+ VIF_ASSIGN;
|
||||
+ __entry->reconnect = reconnect;
|
||||
+ ),
|
||||
+
|
||||
+ TP_printk(
|
||||
+ VIF_PR_FMT " reconnect:%d",
|
||||
+ VIF_PR_ARG, __entry->reconnect
|
||||
+ )
|
||||
+);
|
||||
+
|
||||
TRACE_EVENT(api_cqm_rssi_notify,
|
||||
TP_PROTO(struct ieee80211_sub_if_data *sdata,
|
||||
enum nl80211_cqm_rssi_threshold_event rssi_event,
|
||||
@ -1,74 +0,0 @@
|
||||
From: Rohan Dutta <drohan@codeaurora.org>
|
||||
Date: Tue, 27 Oct 2020 12:09:10 +0200
|
||||
Subject: [PATCH] cfg80211: Add support to configure SAE PWE value to drivers
|
||||
|
||||
Add support to configure SAE PWE preference from userspace to drivers in
|
||||
both AP and STA modes. This is needed for cases where the driver takes
|
||||
care of Authentication frame processing (SME in the driver) so that
|
||||
correct enforcement of the acceptable PWE derivation mechanism can be
|
||||
performed.
|
||||
|
||||
The userspace applications can pass the sae_pwe value using the
|
||||
NL80211_ATTR_SAE_PWE attribute in the NL80211_CMD_CONNECT and
|
||||
NL80211_CMD_START_AP commands to the driver. This allows selection
|
||||
between the hunting-and-pecking loop and hash-to-element options for PWE
|
||||
derivation. For backwards compatibility, this new attribute is optional
|
||||
and if not included, the driver is notified of the value being
|
||||
unspecified.
|
||||
|
||||
Signed-off-by: Rohan Dutta <drohan@codeaurora.org>
|
||||
Signed-off-by: Jouni Malinen <jouni@codeaurora.org>
|
||||
Link: https://lore.kernel.org/r/20201027100910.22283-1-jouni@codeaurora.org
|
||||
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
|
||||
---
|
||||
|
||||
--- a/include/net/cfg80211.h
|
||||
+++ b/include/net/cfg80211.h
|
||||
@@ -1009,6 +1009,14 @@ struct survey_info {
|
||||
* @sae_pwd: password for SAE authentication (for devices supporting SAE
|
||||
* offload)
|
||||
* @sae_pwd_len: length of SAE password (for devices supporting SAE offload)
|
||||
+ * @sae_pwe: The mechanisms allowed for SAE PWE derivation
|
||||
+ * NL80211_SAE_PWE_UNSPECIFIED: Not-specified, used to indicate userspace
|
||||
+ * did not specify any preference. The driver should follow its
|
||||
+ * internal policy in such a scenario.
|
||||
+ * NL80211_SAE_PWE_HUNT_AND_PECK: Allow hunting-and-pecking loop only
|
||||
+ * NL80211_SAE_PWE_HASH_TO_ELEMENT: Allow hash-to-element only
|
||||
+ * NL80211_SAE_PWE_BOTH: Allow either hunting-and-pecking loop
|
||||
+ * or hash-to-element
|
||||
*/
|
||||
struct cfg80211_crypto_settings {
|
||||
u32 wpa_versions;
|
||||
@@ -1027,6 +1035,7 @@ struct cfg80211_crypto_settings {
|
||||
const u8 *psk;
|
||||
const u8 *sae_pwd;
|
||||
u8 sae_pwd_len;
|
||||
+ enum nl80211_sae_pwe_mechanism sae_pwe;
|
||||
};
|
||||
|
||||
/**
|
||||
--- a/net/wireless/nl80211.c
|
||||
+++ b/net/wireless/nl80211.c
|
||||
@@ -736,6 +736,9 @@ static const struct nla_policy nl80211_p
|
||||
NLA_POLICY_EXACT_LEN(IEEE80211_S1G_CAPABILITY_LEN),
|
||||
[NL80211_ATTR_S1G_CAPABILITY_MASK] =
|
||||
NLA_POLICY_EXACT_LEN(IEEE80211_S1G_CAPABILITY_LEN),
|
||||
+ [NL80211_ATTR_SAE_PWE] =
|
||||
+ NLA_POLICY_RANGE(NLA_U8, NL80211_SAE_PWE_HUNT_AND_PECK,
|
||||
+ NL80211_SAE_PWE_BOTH),
|
||||
[NL80211_ATTR_RECONNECT_REQUESTED] = { .type = NLA_REJECT },
|
||||
};
|
||||
|
||||
@@ -9763,6 +9766,12 @@ static int nl80211_crypto_settings(struc
|
||||
nla_len(info->attrs[NL80211_ATTR_SAE_PASSWORD]);
|
||||
}
|
||||
|
||||
+ if (info->attrs[NL80211_ATTR_SAE_PWE])
|
||||
+ settings->sae_pwe =
|
||||
+ nla_get_u8(info->attrs[NL80211_ATTR_SAE_PWE]);
|
||||
+ else
|
||||
+ settings->sae_pwe = NL80211_SAE_PWE_UNSPECIFIED;
|
||||
+
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -1,95 +0,0 @@
|
||||
From: Felix Fietkau <nbd@nbd.name>
|
||||
Date: Wed, 25 Nov 2020 18:03:46 +0100
|
||||
Subject: [PATCH] net/fq_impl: bulk-free packets from a flow on overmemory
|
||||
|
||||
This is similar to what sch_fq_codel does. It also amortizes the worst
|
||||
case cost of a follow-up patch that changes the selection of the biggest
|
||||
flow for dropping packets
|
||||
|
||||
Signed-off-by: Felix Fietkau <nbd@nbd.name>
|
||||
---
|
||||
|
||||
--- a/include/net/fq_impl.h
|
||||
+++ b/include/net/fq_impl.h
|
||||
@@ -11,17 +11,25 @@
|
||||
|
||||
/* functions that are embedded into includer */
|
||||
|
||||
+
|
||||
+static void
|
||||
+__fq_adjust_removal(struct fq *fq, struct fq_flow *flow, unsigned int packets,
|
||||
+ unsigned int bytes, unsigned int truesize)
|
||||
+{
|
||||
+ struct fq_tin *tin = flow->tin;
|
||||
+
|
||||
+ tin->backlog_bytes -= bytes;
|
||||
+ tin->backlog_packets -= packets;
|
||||
+ flow->backlog -= bytes;
|
||||
+ fq->backlog -= packets;
|
||||
+ fq->memory_usage -= truesize;
|
||||
+}
|
||||
+
|
||||
static void fq_adjust_removal(struct fq *fq,
|
||||
struct fq_flow *flow,
|
||||
struct sk_buff *skb)
|
||||
{
|
||||
- struct fq_tin *tin = flow->tin;
|
||||
-
|
||||
- tin->backlog_bytes -= skb->len;
|
||||
- tin->backlog_packets--;
|
||||
- flow->backlog -= skb->len;
|
||||
- fq->backlog--;
|
||||
- fq->memory_usage -= skb->truesize;
|
||||
+ __fq_adjust_removal(fq, flow, 1, skb->len, skb->truesize);
|
||||
}
|
||||
|
||||
static void fq_rejigger_backlog(struct fq *fq, struct fq_flow *flow)
|
||||
@@ -59,6 +67,34 @@ static struct sk_buff *fq_flow_dequeue(s
|
||||
return skb;
|
||||
}
|
||||
|
||||
+static int fq_flow_drop(struct fq *fq, struct fq_flow *flow,
|
||||
+ fq_skb_free_t free_func)
|
||||
+{
|
||||
+ unsigned int packets = 0, bytes = 0, truesize = 0;
|
||||
+ struct fq_tin *tin = flow->tin;
|
||||
+ struct sk_buff *skb;
|
||||
+ int pending;
|
||||
+
|
||||
+ lockdep_assert_held(&fq->lock);
|
||||
+
|
||||
+ pending = min_t(int, 32, skb_queue_len(&flow->queue) / 2);
|
||||
+ do {
|
||||
+ skb = __skb_dequeue(&flow->queue);
|
||||
+ if (!skb)
|
||||
+ break;
|
||||
+
|
||||
+ packets++;
|
||||
+ bytes += skb->len;
|
||||
+ truesize += skb->truesize;
|
||||
+ free_func(fq, tin, flow, skb);
|
||||
+ } while (packets < pending);
|
||||
+
|
||||
+ __fq_adjust_removal(fq, flow, packets, bytes, truesize);
|
||||
+ fq_rejigger_backlog(fq, flow);
|
||||
+
|
||||
+ return packets;
|
||||
+}
|
||||
+
|
||||
static struct sk_buff *fq_tin_dequeue(struct fq *fq,
|
||||
struct fq_tin *tin,
|
||||
fq_tin_dequeue_t dequeue_func)
|
||||
@@ -190,12 +226,9 @@ static void fq_tin_enqueue(struct fq *fq
|
||||
if (!flow)
|
||||
return;
|
||||
|
||||
- skb = fq_flow_dequeue(fq, flow);
|
||||
- if (!skb)
|
||||
+ if (!fq_flow_drop(fq, flow, free_func))
|
||||
return;
|
||||
|
||||
- free_func(fq, flow->tin, flow, skb);
|
||||
-
|
||||
flow->tin->overlimit++;
|
||||
fq->overlimit++;
|
||||
if (oom) {
|
||||
@ -1,144 +0,0 @@
|
||||
From: Felix Fietkau <nbd@nbd.name>
|
||||
Date: Wed, 25 Nov 2020 18:09:10 +0100
|
||||
Subject: [PATCH] net/fq_impl: drop get_default_func, move default flow to
|
||||
fq_tin
|
||||
|
||||
Simplifies the code and prepares for a rework of scanning for flows on
|
||||
overmemory drop.
|
||||
|
||||
Signed-off-by: Felix Fietkau <nbd@nbd.name>
|
||||
---
|
||||
|
||||
--- a/include/net/fq.h
|
||||
+++ b/include/net/fq.h
|
||||
@@ -47,6 +47,7 @@ struct fq_flow {
|
||||
struct fq_tin {
|
||||
struct list_head new_flows;
|
||||
struct list_head old_flows;
|
||||
+ struct fq_flow default_flow;
|
||||
u32 backlog_bytes;
|
||||
u32 backlog_packets;
|
||||
u32 overlimit;
|
||||
--- a/include/net/fq_impl.h
|
||||
+++ b/include/net/fq_impl.h
|
||||
@@ -151,8 +151,7 @@ static u32 fq_flow_idx(struct fq *fq, st
|
||||
|
||||
static struct fq_flow *fq_flow_classify(struct fq *fq,
|
||||
struct fq_tin *tin, u32 idx,
|
||||
- struct sk_buff *skb,
|
||||
- fq_flow_get_default_t get_default_func)
|
||||
+ struct sk_buff *skb)
|
||||
{
|
||||
struct fq_flow *flow;
|
||||
|
||||
@@ -160,7 +159,7 @@ static struct fq_flow *fq_flow_classify(
|
||||
|
||||
flow = &fq->flows[idx];
|
||||
if (flow->tin && flow->tin != tin) {
|
||||
- flow = get_default_func(fq, tin, idx, skb);
|
||||
+ flow = &tin->default_flow;
|
||||
tin->collisions++;
|
||||
fq->collisions++;
|
||||
}
|
||||
@@ -192,15 +191,14 @@ static void fq_recalc_backlog(struct fq
|
||||
static void fq_tin_enqueue(struct fq *fq,
|
||||
struct fq_tin *tin, u32 idx,
|
||||
struct sk_buff *skb,
|
||||
- fq_skb_free_t free_func,
|
||||
- fq_flow_get_default_t get_default_func)
|
||||
+ fq_skb_free_t free_func)
|
||||
{
|
||||
struct fq_flow *flow;
|
||||
bool oom;
|
||||
|
||||
lockdep_assert_held(&fq->lock);
|
||||
|
||||
- flow = fq_flow_classify(fq, tin, idx, skb, get_default_func);
|
||||
+ flow = fq_flow_classify(fq, tin, idx, skb);
|
||||
|
||||
flow->tin = tin;
|
||||
flow->backlog += skb->len;
|
||||
@@ -331,6 +329,7 @@ static void fq_tin_init(struct fq_tin *t
|
||||
{
|
||||
INIT_LIST_HEAD(&tin->new_flows);
|
||||
INIT_LIST_HEAD(&tin->old_flows);
|
||||
+ fq_flow_init(&tin->default_flow);
|
||||
}
|
||||
|
||||
static int fq_init(struct fq *fq, int flows_cnt)
|
||||
--- a/net/mac80211/ieee80211_i.h
|
||||
+++ b/net/mac80211/ieee80211_i.h
|
||||
@@ -846,7 +846,6 @@ enum txq_info_flags {
|
||||
*/
|
||||
struct txq_info {
|
||||
struct fq_tin tin;
|
||||
- struct fq_flow def_flow;
|
||||
struct codel_vars def_cvars;
|
||||
struct codel_stats cstats;
|
||||
struct sk_buff_head frags;
|
||||
--- a/net/mac80211/tx.c
|
||||
+++ b/net/mac80211/tx.c
|
||||
@@ -1322,7 +1322,7 @@ static struct sk_buff *codel_dequeue_fun
|
||||
fq = &local->fq;
|
||||
|
||||
if (cvars == &txqi->def_cvars)
|
||||
- flow = &txqi->def_flow;
|
||||
+ flow = &txqi->tin.default_flow;
|
||||
else
|
||||
flow = &fq->flows[cvars - local->cvars];
|
||||
|
||||
@@ -1365,7 +1365,7 @@ static struct sk_buff *fq_tin_dequeue_fu
|
||||
cparams = &local->cparams;
|
||||
}
|
||||
|
||||
- if (flow == &txqi->def_flow)
|
||||
+ if (flow == &tin->default_flow)
|
||||
cvars = &txqi->def_cvars;
|
||||
else
|
||||
cvars = &local->cvars[flow - fq->flows];
|
||||
@@ -1392,17 +1392,6 @@ static void fq_skb_free_func(struct fq *
|
||||
ieee80211_free_txskb(&local->hw, skb);
|
||||
}
|
||||
|
||||
-static struct fq_flow *fq_flow_get_default_func(struct fq *fq,
|
||||
- struct fq_tin *tin,
|
||||
- int idx,
|
||||
- struct sk_buff *skb)
|
||||
-{
|
||||
- struct txq_info *txqi;
|
||||
-
|
||||
- txqi = container_of(tin, struct txq_info, tin);
|
||||
- return &txqi->def_flow;
|
||||
-}
|
||||
-
|
||||
static void ieee80211_txq_enqueue(struct ieee80211_local *local,
|
||||
struct txq_info *txqi,
|
||||
struct sk_buff *skb)
|
||||
@@ -1415,8 +1404,7 @@ static void ieee80211_txq_enqueue(struct
|
||||
|
||||
spin_lock_bh(&fq->lock);
|
||||
fq_tin_enqueue(fq, tin, flow_idx, skb,
|
||||
- fq_skb_free_func,
|
||||
- fq_flow_get_default_func);
|
||||
+ fq_skb_free_func);
|
||||
spin_unlock_bh(&fq->lock);
|
||||
}
|
||||
|
||||
@@ -1459,7 +1447,6 @@ void ieee80211_txq_init(struct ieee80211
|
||||
struct txq_info *txqi, int tid)
|
||||
{
|
||||
fq_tin_init(&txqi->tin);
|
||||
- fq_flow_init(&txqi->def_flow);
|
||||
codel_vars_init(&txqi->def_cvars);
|
||||
codel_stats_init(&txqi->cstats);
|
||||
__skb_queue_head_init(&txqi->frags);
|
||||
@@ -3332,8 +3319,7 @@ static bool ieee80211_amsdu_aggregate(st
|
||||
*/
|
||||
|
||||
tin = &txqi->tin;
|
||||
- flow = fq_flow_classify(fq, tin, flow_idx, skb,
|
||||
- fq_flow_get_default_func);
|
||||
+ flow = fq_flow_classify(fq, tin, flow_idx, skb);
|
||||
head = skb_peek_tail(&flow->queue);
|
||||
if (!head || skb_is_gso(head))
|
||||
goto out;
|
||||
@ -1,317 +0,0 @@
|
||||
From: Felix Fietkau <nbd@nbd.name>
|
||||
Date: Wed, 25 Nov 2020 18:10:34 +0100
|
||||
Subject: [PATCH] net/fq_impl: do not maintain a backlog-sorted list of
|
||||
flows
|
||||
|
||||
A sorted flow list is only needed to drop packets in the biggest flow when
|
||||
hitting the overmemory condition.
|
||||
By scanning flows only when needed, we can avoid paying the cost of
|
||||
maintaining the list under normal conditions
|
||||
In order to avoid scanning lots of empty flows and touching too many cold
|
||||
cache lines, a bitmap of flows with backlog is maintained
|
||||
|
||||
Signed-off-by: Felix Fietkau <nbd@nbd.name>
|
||||
---
|
||||
|
||||
--- a/include/net/fq.h
|
||||
+++ b/include/net/fq.h
|
||||
@@ -19,8 +19,6 @@ struct fq_tin;
|
||||
* @flowchain: can be linked to fq_tin's new_flows or old_flows. Used for DRR++
|
||||
* (deficit round robin) based round robin queuing similar to the one
|
||||
* found in net/sched/sch_fq_codel.c
|
||||
- * @backlogchain: can be linked to other fq_flow and fq. Used to keep track of
|
||||
- * fat flows and efficient head-dropping if packet limit is reached
|
||||
* @queue: sk_buff queue to hold packets
|
||||
* @backlog: number of bytes pending in the queue. The number of packets can be
|
||||
* found in @queue.qlen
|
||||
@@ -29,7 +27,6 @@ struct fq_tin;
|
||||
struct fq_flow {
|
||||
struct fq_tin *tin;
|
||||
struct list_head flowchain;
|
||||
- struct list_head backlogchain;
|
||||
struct sk_buff_head queue;
|
||||
u32 backlog;
|
||||
int deficit;
|
||||
@@ -47,6 +44,7 @@ struct fq_flow {
|
||||
struct fq_tin {
|
||||
struct list_head new_flows;
|
||||
struct list_head old_flows;
|
||||
+ struct list_head tin_list;
|
||||
struct fq_flow default_flow;
|
||||
u32 backlog_bytes;
|
||||
u32 backlog_packets;
|
||||
@@ -60,14 +58,14 @@ struct fq_tin {
|
||||
/**
|
||||
* struct fq - main container for fair queuing purposes
|
||||
*
|
||||
- * @backlogs: linked to fq_flows. Used to maintain fat flows for efficient
|
||||
- * head-dropping when @backlog reaches @limit
|
||||
* @limit: max number of packets that can be queued across all flows
|
||||
* @backlog: number of packets queued across all flows
|
||||
*/
|
||||
struct fq {
|
||||
struct fq_flow *flows;
|
||||
- struct list_head backlogs;
|
||||
+ unsigned long *flows_bitmap;
|
||||
+
|
||||
+ struct list_head tin_backlog;
|
||||
spinlock_t lock;
|
||||
u32 flows_cnt;
|
||||
u32 limit;
|
||||
--- a/include/net/fq_impl.h
|
||||
+++ b/include/net/fq_impl.h
|
||||
@@ -17,12 +17,24 @@ __fq_adjust_removal(struct fq *fq, struc
|
||||
unsigned int bytes, unsigned int truesize)
|
||||
{
|
||||
struct fq_tin *tin = flow->tin;
|
||||
+ int idx;
|
||||
|
||||
tin->backlog_bytes -= bytes;
|
||||
tin->backlog_packets -= packets;
|
||||
flow->backlog -= bytes;
|
||||
fq->backlog -= packets;
|
||||
fq->memory_usage -= truesize;
|
||||
+
|
||||
+ if (flow->backlog)
|
||||
+ return;
|
||||
+
|
||||
+ if (flow == &tin->default_flow) {
|
||||
+ list_del_init(&tin->tin_list);
|
||||
+ return;
|
||||
+ }
|
||||
+
|
||||
+ idx = flow - fq->flows;
|
||||
+ __clear_bit(idx, fq->flows_bitmap);
|
||||
}
|
||||
|
||||
static void fq_adjust_removal(struct fq *fq,
|
||||
@@ -32,24 +44,6 @@ static void fq_adjust_removal(struct fq
|
||||
__fq_adjust_removal(fq, flow, 1, skb->len, skb->truesize);
|
||||
}
|
||||
|
||||
-static void fq_rejigger_backlog(struct fq *fq, struct fq_flow *flow)
|
||||
-{
|
||||
- struct fq_flow *i;
|
||||
-
|
||||
- if (flow->backlog == 0) {
|
||||
- list_del_init(&flow->backlogchain);
|
||||
- } else {
|
||||
- i = flow;
|
||||
-
|
||||
- list_for_each_entry_continue(i, &fq->backlogs, backlogchain)
|
||||
- if (i->backlog < flow->backlog)
|
||||
- break;
|
||||
-
|
||||
- list_move_tail(&flow->backlogchain,
|
||||
- &i->backlogchain);
|
||||
- }
|
||||
-}
|
||||
-
|
||||
static struct sk_buff *fq_flow_dequeue(struct fq *fq,
|
||||
struct fq_flow *flow)
|
||||
{
|
||||
@@ -62,7 +56,6 @@ static struct sk_buff *fq_flow_dequeue(s
|
||||
return NULL;
|
||||
|
||||
fq_adjust_removal(fq, flow, skb);
|
||||
- fq_rejigger_backlog(fq, flow);
|
||||
|
||||
return skb;
|
||||
}
|
||||
@@ -90,7 +83,6 @@ static int fq_flow_drop(struct fq *fq, s
|
||||
} while (packets < pending);
|
||||
|
||||
__fq_adjust_removal(fq, flow, packets, bytes, truesize);
|
||||
- fq_rejigger_backlog(fq, flow);
|
||||
|
||||
return packets;
|
||||
}
|
||||
@@ -170,22 +162,36 @@ static struct fq_flow *fq_flow_classify(
|
||||
return flow;
|
||||
}
|
||||
|
||||
-static void fq_recalc_backlog(struct fq *fq,
|
||||
- struct fq_tin *tin,
|
||||
- struct fq_flow *flow)
|
||||
-{
|
||||
- struct fq_flow *i;
|
||||
-
|
||||
- if (list_empty(&flow->backlogchain))
|
||||
- list_add_tail(&flow->backlogchain, &fq->backlogs);
|
||||
-
|
||||
- i = flow;
|
||||
- list_for_each_entry_continue_reverse(i, &fq->backlogs,
|
||||
- backlogchain)
|
||||
- if (i->backlog > flow->backlog)
|
||||
- break;
|
||||
+static struct fq_flow *fq_find_fattest_flow(struct fq *fq)
|
||||
+{
|
||||
+ struct fq_tin *tin;
|
||||
+ struct fq_flow *flow = NULL;
|
||||
+ u32 len = 0;
|
||||
+ int i;
|
||||
+
|
||||
+ for_each_set_bit(i, fq->flows_bitmap, fq->flows_cnt) {
|
||||
+ struct fq_flow *cur = &fq->flows[i];
|
||||
+ unsigned int cur_len;
|
||||
+
|
||||
+ cur_len = cur->backlog;
|
||||
+ if (cur_len <= len)
|
||||
+ continue;
|
||||
+
|
||||
+ flow = cur;
|
||||
+ len = cur_len;
|
||||
+ }
|
||||
|
||||
- list_move(&flow->backlogchain, &i->backlogchain);
|
||||
+ list_for_each_entry(tin, &fq->tin_backlog, tin_list) {
|
||||
+ unsigned int cur_len = tin->default_flow.backlog;
|
||||
+
|
||||
+ if (cur_len <= len)
|
||||
+ continue;
|
||||
+
|
||||
+ flow = &tin->default_flow;
|
||||
+ len = cur_len;
|
||||
+ }
|
||||
+
|
||||
+ return flow;
|
||||
}
|
||||
|
||||
static void fq_tin_enqueue(struct fq *fq,
|
||||
@@ -200,6 +206,13 @@ static void fq_tin_enqueue(struct fq *fq
|
||||
|
||||
flow = fq_flow_classify(fq, tin, idx, skb);
|
||||
|
||||
+ if (!flow->backlog) {
|
||||
+ if (flow != &tin->default_flow)
|
||||
+ __set_bit(idx, fq->flows_bitmap);
|
||||
+ else if (list_empty(&tin->tin_list))
|
||||
+ list_add(&tin->tin_list, &fq->tin_backlog);
|
||||
+ }
|
||||
+
|
||||
flow->tin = tin;
|
||||
flow->backlog += skb->len;
|
||||
tin->backlog_bytes += skb->len;
|
||||
@@ -207,8 +220,6 @@ static void fq_tin_enqueue(struct fq *fq
|
||||
fq->memory_usage += skb->truesize;
|
||||
fq->backlog++;
|
||||
|
||||
- fq_recalc_backlog(fq, tin, flow);
|
||||
-
|
||||
if (list_empty(&flow->flowchain)) {
|
||||
flow->deficit = fq->quantum;
|
||||
list_add_tail(&flow->flowchain,
|
||||
@@ -218,9 +229,7 @@ static void fq_tin_enqueue(struct fq *fq
|
||||
__skb_queue_tail(&flow->queue, skb);
|
||||
oom = (fq->memory_usage > fq->memory_limit);
|
||||
while (fq->backlog > fq->limit || oom) {
|
||||
- flow = list_first_entry_or_null(&fq->backlogs,
|
||||
- struct fq_flow,
|
||||
- backlogchain);
|
||||
+ flow = fq_find_fattest_flow(fq);
|
||||
if (!flow)
|
||||
return;
|
||||
|
||||
@@ -255,8 +264,6 @@ static void fq_flow_filter(struct fq *fq
|
||||
fq_adjust_removal(fq, flow, skb);
|
||||
free_func(fq, tin, flow, skb);
|
||||
}
|
||||
-
|
||||
- fq_rejigger_backlog(fq, flow);
|
||||
}
|
||||
|
||||
static void fq_tin_filter(struct fq *fq,
|
||||
@@ -279,16 +286,18 @@ static void fq_flow_reset(struct fq *fq,
|
||||
struct fq_flow *flow,
|
||||
fq_skb_free_t free_func)
|
||||
{
|
||||
+ struct fq_tin *tin = flow->tin;
|
||||
struct sk_buff *skb;
|
||||
|
||||
while ((skb = fq_flow_dequeue(fq, flow)))
|
||||
- free_func(fq, flow->tin, flow, skb);
|
||||
+ free_func(fq, tin, flow, skb);
|
||||
|
||||
- if (!list_empty(&flow->flowchain))
|
||||
+ if (!list_empty(&flow->flowchain)) {
|
||||
list_del_init(&flow->flowchain);
|
||||
-
|
||||
- if (!list_empty(&flow->backlogchain))
|
||||
- list_del_init(&flow->backlogchain);
|
||||
+ if (list_empty(&tin->new_flows) &&
|
||||
+ list_empty(&tin->old_flows))
|
||||
+ list_del_init(&tin->tin_list);
|
||||
+ }
|
||||
|
||||
flow->tin = NULL;
|
||||
|
||||
@@ -314,6 +323,7 @@ static void fq_tin_reset(struct fq *fq,
|
||||
fq_flow_reset(fq, flow, free_func);
|
||||
}
|
||||
|
||||
+ WARN_ON_ONCE(!list_empty(&tin->tin_list));
|
||||
WARN_ON_ONCE(tin->backlog_bytes);
|
||||
WARN_ON_ONCE(tin->backlog_packets);
|
||||
}
|
||||
@@ -321,7 +331,6 @@ static void fq_tin_reset(struct fq *fq,
|
||||
static void fq_flow_init(struct fq_flow *flow)
|
||||
{
|
||||
INIT_LIST_HEAD(&flow->flowchain);
|
||||
- INIT_LIST_HEAD(&flow->backlogchain);
|
||||
__skb_queue_head_init(&flow->queue);
|
||||
}
|
||||
|
||||
@@ -329,6 +338,7 @@ static void fq_tin_init(struct fq_tin *t
|
||||
{
|
||||
INIT_LIST_HEAD(&tin->new_flows);
|
||||
INIT_LIST_HEAD(&tin->old_flows);
|
||||
+ INIT_LIST_HEAD(&tin->tin_list);
|
||||
fq_flow_init(&tin->default_flow);
|
||||
}
|
||||
|
||||
@@ -337,8 +347,8 @@ static int fq_init(struct fq *fq, int fl
|
||||
int i;
|
||||
|
||||
memset(fq, 0, sizeof(fq[0]));
|
||||
- INIT_LIST_HEAD(&fq->backlogs);
|
||||
spin_lock_init(&fq->lock);
|
||||
+ INIT_LIST_HEAD(&fq->tin_backlog);
|
||||
fq->flows_cnt = max_t(u32, flows_cnt, 1);
|
||||
fq->quantum = 300;
|
||||
fq->limit = 8192;
|
||||
@@ -348,6 +358,14 @@ static int fq_init(struct fq *fq, int fl
|
||||
if (!fq->flows)
|
||||
return -ENOMEM;
|
||||
|
||||
+ fq->flows_bitmap = kcalloc(BITS_TO_LONGS(fq->flows_cnt), sizeof(long),
|
||||
+ GFP_KERNEL);
|
||||
+ if (!fq->flows_bitmap) {
|
||||
+ kvfree(fq->flows);
|
||||
+ fq->flows = NULL;
|
||||
+ return -ENOMEM;
|
||||
+ }
|
||||
+
|
||||
for (i = 0; i < fq->flows_cnt; i++)
|
||||
fq_flow_init(&fq->flows[i]);
|
||||
|
||||
@@ -364,6 +382,9 @@ static void fq_reset(struct fq *fq,
|
||||
|
||||
kvfree(fq->flows);
|
||||
fq->flows = NULL;
|
||||
+
|
||||
+ kfree(fq->flows_bitmap);
|
||||
+ fq->flows_bitmap = NULL;
|
||||
}
|
||||
|
||||
#endif
|
||||
--- a/net/mac80211/tx.c
|
||||
+++ b/net/mac80211/tx.c
|
||||
@@ -3386,8 +3386,6 @@ out_recalc:
|
||||
if (head->len != orig_len) {
|
||||
flow->backlog += head->len - orig_len;
|
||||
tin->backlog_bytes += head->len - orig_len;
|
||||
-
|
||||
- fq_recalc_backlog(fq, tin, flow);
|
||||
}
|
||||
out:
|
||||
spin_unlock_bh(&fq->lock);
|
||||
@ -1,570 +0,0 @@
|
||||
From: Felix Fietkau <nbd@nbd.name>
|
||||
Date: Wed, 16 Dec 2020 21:34:03 +0100
|
||||
Subject: [PATCH] mac80211: add rx decapsulation offload support
|
||||
|
||||
This allows drivers to pass 802.3 frames to mac80211, with some restrictions:
|
||||
|
||||
- the skb must be passed with a valid sta
|
||||
- fast-rx needs to be active for the sta
|
||||
- monitor mode needs to be disabled
|
||||
|
||||
mac80211 will tell the driver when it is safe to enable rx decap offload for
|
||||
a particular station.
|
||||
|
||||
In order to implement support, a driver must:
|
||||
|
||||
- call ieee80211_hw_set(hw, SUPPORTS_RX_DECAP_OFFLOAD)
|
||||
- implement ops->sta_set_decap_offload
|
||||
- mark 802.3 frames with RX_FLAG_8023
|
||||
|
||||
If it doesn't want to enable offload for some vif types, it can mask out
|
||||
IEEE80211_OFFLOAD_DECAP_ENABLED in vif->offload_flags from within the
|
||||
.add_interface or .update_vif_offload driver ops
|
||||
|
||||
Signed-off-by: Felix Fietkau <nbd@nbd.name>
|
||||
---
|
||||
|
||||
--- a/include/net/mac80211.h
|
||||
+++ b/include/net/mac80211.h
|
||||
@@ -1297,6 +1297,8 @@ ieee80211_tx_info_clear_status(struct ie
|
||||
* the "0-length PSDU" field included there. The value for it is
|
||||
* in &struct ieee80211_rx_status. Note that if this value isn't
|
||||
* known the frame shouldn't be reported.
|
||||
+ * @RX_FLAG_8023: the frame has an 802.3 header (decap offload performed by
|
||||
+ * hardware or driver)
|
||||
*/
|
||||
enum mac80211_rx_flags {
|
||||
RX_FLAG_MMIC_ERROR = BIT(0),
|
||||
@@ -1329,6 +1331,7 @@ enum mac80211_rx_flags {
|
||||
RX_FLAG_RADIOTAP_HE_MU = BIT(27),
|
||||
RX_FLAG_RADIOTAP_LSIG = BIT(28),
|
||||
RX_FLAG_NO_PSDU = BIT(29),
|
||||
+ RX_FLAG_8023 = BIT(30),
|
||||
};
|
||||
|
||||
/**
|
||||
@@ -1650,11 +1653,15 @@ enum ieee80211_vif_flags {
|
||||
* The driver supports sending frames passed as 802.3 frames by mac80211.
|
||||
* It must also support sending 802.11 packets for the same interface.
|
||||
* @IEEE80211_OFFLOAD_ENCAP_4ADDR: support 4-address mode encapsulation offload
|
||||
+ * @IEEE80211_OFFLOAD_DECAP_ENABLED: rx encapsulation offload is enabled
|
||||
+ * The driver supports passing received 802.11 frames as 802.3 frames to
|
||||
+ * mac80211.
|
||||
*/
|
||||
|
||||
enum ieee80211_offload_flags {
|
||||
IEEE80211_OFFLOAD_ENCAP_ENABLED = BIT(0),
|
||||
IEEE80211_OFFLOAD_ENCAP_4ADDR = BIT(1),
|
||||
+ IEEE80211_OFFLOAD_DECAP_ENABLED = BIT(2),
|
||||
};
|
||||
|
||||
/**
|
||||
@@ -2390,6 +2397,9 @@ struct ieee80211_txq {
|
||||
* @IEEE80211_HW_SUPPORTS_TX_ENCAP_OFFLOAD: Hardware supports tx encapsulation
|
||||
* offload
|
||||
*
|
||||
+ * @IEEE80211_HW_SUPPORTS_RX_DECAP_OFFLOAD: Hardware supports rx decapsulation
|
||||
+ * offload
|
||||
+ *
|
||||
* @NUM_IEEE80211_HW_FLAGS: number of hardware flags, used for sizing arrays
|
||||
*/
|
||||
enum ieee80211_hw_flags {
|
||||
@@ -2443,6 +2453,7 @@ enum ieee80211_hw_flags {
|
||||
IEEE80211_HW_SUPPORTS_ONLY_HE_MULTI_BSSID,
|
||||
IEEE80211_HW_AMPDU_KEYBORDER_SUPPORT,
|
||||
IEEE80211_HW_SUPPORTS_TX_ENCAP_OFFLOAD,
|
||||
+ IEEE80211_HW_SUPPORTS_RX_DECAP_OFFLOAD,
|
||||
|
||||
/* keep last, obviously */
|
||||
NUM_IEEE80211_HW_FLAGS
|
||||
@@ -4196,6 +4207,9 @@ struct ieee80211_ops {
|
||||
struct ieee80211_vif *vif);
|
||||
void (*sta_set_4addr)(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
|
||||
struct ieee80211_sta *sta, bool enabled);
|
||||
+ void (*sta_set_decap_offload)(struct ieee80211_hw *hw,
|
||||
+ struct ieee80211_vif *vif,
|
||||
+ struct ieee80211_sta *sta, bool enabled);
|
||||
};
|
||||
|
||||
/**
|
||||
--- a/net/mac80211/debugfs.c
|
||||
+++ b/net/mac80211/debugfs.c
|
||||
@@ -405,6 +405,7 @@ static const char *hw_flag_names[] = {
|
||||
FLAG(SUPPORTS_ONLY_HE_MULTI_BSSID),
|
||||
FLAG(AMPDU_KEYBORDER_SUPPORT),
|
||||
FLAG(SUPPORTS_TX_ENCAP_OFFLOAD),
|
||||
+ FLAG(SUPPORTS_RX_DECAP_OFFLOAD),
|
||||
#undef FLAG
|
||||
};
|
||||
|
||||
--- a/net/mac80211/debugfs_sta.c
|
||||
+++ b/net/mac80211/debugfs_sta.c
|
||||
@@ -79,6 +79,7 @@ static const char * const sta_flag_names
|
||||
FLAG(MPSP_RECIPIENT),
|
||||
FLAG(PS_DELIVER),
|
||||
FLAG(USES_ENCRYPTION),
|
||||
+ FLAG(DECAP_OFFLOAD),
|
||||
#undef FLAG
|
||||
};
|
||||
|
||||
--- a/net/mac80211/driver-ops.h
|
||||
+++ b/net/mac80211/driver-ops.h
|
||||
@@ -1413,4 +1413,20 @@ static inline void drv_sta_set_4addr(str
|
||||
trace_drv_return_void(local);
|
||||
}
|
||||
|
||||
+static inline void drv_sta_set_decap_offload(struct ieee80211_local *local,
|
||||
+ struct ieee80211_sub_if_data *sdata,
|
||||
+ struct ieee80211_sta *sta,
|
||||
+ bool enabled)
|
||||
+{
|
||||
+ sdata = get_bss_sdata(sdata);
|
||||
+ if (!check_sdata_in_driver(sdata))
|
||||
+ return;
|
||||
+
|
||||
+ trace_drv_sta_set_decap_offload(local, sdata, sta, enabled);
|
||||
+ if (local->ops->sta_set_decap_offload)
|
||||
+ local->ops->sta_set_decap_offload(&local->hw, &sdata->vif, sta,
|
||||
+ enabled);
|
||||
+ trace_drv_return_void(local);
|
||||
+}
|
||||
+
|
||||
#endif /* __MAC80211_DRIVER_OPS */
|
||||
--- a/net/mac80211/iface.c
|
||||
+++ b/net/mac80211/iface.c
|
||||
@@ -856,7 +856,7 @@ static const struct net_device_ops ieee8
|
||||
|
||||
};
|
||||
|
||||
-static bool ieee80211_iftype_supports_encap_offload(enum nl80211_iftype iftype)
|
||||
+static bool ieee80211_iftype_supports_hdr_offload(enum nl80211_iftype iftype)
|
||||
{
|
||||
switch (iftype) {
|
||||
/* P2P GO and client are mapped to AP/STATION types */
|
||||
@@ -876,7 +876,7 @@ static bool ieee80211_set_sdata_offload_
|
||||
flags = sdata->vif.offload_flags;
|
||||
|
||||
if (ieee80211_hw_check(&local->hw, SUPPORTS_TX_ENCAP_OFFLOAD) &&
|
||||
- ieee80211_iftype_supports_encap_offload(sdata->vif.type)) {
|
||||
+ ieee80211_iftype_supports_hdr_offload(sdata->vif.type)) {
|
||||
flags |= IEEE80211_OFFLOAD_ENCAP_ENABLED;
|
||||
|
||||
if (!ieee80211_hw_check(&local->hw, SUPPORTS_TX_FRAG) &&
|
||||
@@ -889,10 +889,21 @@ static bool ieee80211_set_sdata_offload_
|
||||
flags &= ~IEEE80211_OFFLOAD_ENCAP_ENABLED;
|
||||
}
|
||||
|
||||
+ if (ieee80211_hw_check(&local->hw, SUPPORTS_RX_DECAP_OFFLOAD) &&
|
||||
+ ieee80211_iftype_supports_hdr_offload(sdata->vif.type)) {
|
||||
+ flags |= IEEE80211_OFFLOAD_DECAP_ENABLED;
|
||||
+
|
||||
+ if (local->monitors)
|
||||
+ flags &= ~IEEE80211_OFFLOAD_DECAP_ENABLED;
|
||||
+ } else {
|
||||
+ flags &= ~IEEE80211_OFFLOAD_DECAP_ENABLED;
|
||||
+ }
|
||||
+
|
||||
if (sdata->vif.offload_flags == flags)
|
||||
return false;
|
||||
|
||||
sdata->vif.offload_flags = flags;
|
||||
+ ieee80211_check_fast_rx_iface(sdata);
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -910,7 +921,7 @@ static void ieee80211_set_vif_encap_ops(
|
||||
}
|
||||
|
||||
if (!ieee80211_hw_check(&local->hw, SUPPORTS_TX_ENCAP_OFFLOAD) ||
|
||||
- !ieee80211_iftype_supports_encap_offload(bss->vif.type))
|
||||
+ !ieee80211_iftype_supports_hdr_offload(bss->vif.type))
|
||||
return;
|
||||
|
||||
enabled = bss->vif.offload_flags & IEEE80211_OFFLOAD_ENCAP_ENABLED;
|
||||
--- a/net/mac80211/rx.c
|
||||
+++ b/net/mac80211/rx.c
|
||||
@@ -4195,7 +4195,9 @@ void ieee80211_check_fast_rx(struct sta_
|
||||
.vif_type = sdata->vif.type,
|
||||
.control_port_protocol = sdata->control_port_protocol,
|
||||
}, *old, *new = NULL;
|
||||
+ bool set_offload = false;
|
||||
bool assign = false;
|
||||
+ bool offload;
|
||||
|
||||
/* use sparse to check that we don't return without updating */
|
||||
__acquire(check_fast_rx);
|
||||
@@ -4308,6 +4310,17 @@ void ieee80211_check_fast_rx(struct sta_
|
||||
if (assign)
|
||||
new = kmemdup(&fastrx, sizeof(fastrx), GFP_KERNEL);
|
||||
|
||||
+ offload = assign &&
|
||||
+ (sdata->vif.offload_flags & IEEE80211_OFFLOAD_DECAP_ENABLED);
|
||||
+
|
||||
+ if (offload)
|
||||
+ set_offload = !test_and_set_sta_flag(sta, WLAN_STA_DECAP_OFFLOAD);
|
||||
+ else
|
||||
+ set_offload = test_and_clear_sta_flag(sta, WLAN_STA_DECAP_OFFLOAD);
|
||||
+
|
||||
+ if (set_offload)
|
||||
+ drv_sta_set_decap_offload(local, sdata, &sta->sta, assign);
|
||||
+
|
||||
spin_lock_bh(&sta->lock);
|
||||
old = rcu_dereference_protected(sta->fast_rx, true);
|
||||
rcu_assign_pointer(sta->fast_rx, new);
|
||||
@@ -4354,6 +4367,108 @@ void ieee80211_check_fast_rx_iface(struc
|
||||
mutex_unlock(&local->sta_mtx);
|
||||
}
|
||||
|
||||
+static void ieee80211_rx_8023(struct ieee80211_rx_data *rx,
|
||||
+ struct ieee80211_fast_rx *fast_rx,
|
||||
+ int orig_len)
|
||||
+{
|
||||
+ struct ieee80211_sta_rx_stats *stats;
|
||||
+ struct ieee80211_rx_status *status = IEEE80211_SKB_RXCB(rx->skb);
|
||||
+ struct sta_info *sta = rx->sta;
|
||||
+ struct sk_buff *skb = rx->skb;
|
||||
+ void *sa = skb->data + ETH_ALEN;
|
||||
+ void *da = skb->data;
|
||||
+
|
||||
+ stats = &sta->rx_stats;
|
||||
+ if (fast_rx->uses_rss)
|
||||
+ stats = this_cpu_ptr(sta->pcpu_rx_stats);
|
||||
+
|
||||
+ /* statistics part of ieee80211_rx_h_sta_process() */
|
||||
+ if (!(status->flag & RX_FLAG_NO_SIGNAL_VAL)) {
|
||||
+ stats->last_signal = status->signal;
|
||||
+ if (!fast_rx->uses_rss)
|
||||
+ ewma_signal_add(&sta->rx_stats_avg.signal,
|
||||
+ -status->signal);
|
||||
+ }
|
||||
+
|
||||
+ if (status->chains) {
|
||||
+ int i;
|
||||
+
|
||||
+ stats->chains = status->chains;
|
||||
+ for (i = 0; i < ARRAY_SIZE(status->chain_signal); i++) {
|
||||
+ int signal = status->chain_signal[i];
|
||||
+
|
||||
+ if (!(status->chains & BIT(i)))
|
||||
+ continue;
|
||||
+
|
||||
+ stats->chain_signal_last[i] = signal;
|
||||
+ if (!fast_rx->uses_rss)
|
||||
+ ewma_signal_add(&sta->rx_stats_avg.chain_signal[i],
|
||||
+ -signal);
|
||||
+ }
|
||||
+ }
|
||||
+ /* end of statistics */
|
||||
+
|
||||
+ stats->last_rx = jiffies;
|
||||
+ stats->last_rate = sta_stats_encode_rate(status);
|
||||
+
|
||||
+ stats->fragments++;
|
||||
+ stats->packets++;
|
||||
+
|
||||
+ skb->dev = fast_rx->dev;
|
||||
+
|
||||
+ ieee80211_rx_stats(fast_rx->dev, skb->len);
|
||||
+
|
||||
+ /* The seqno index has the same property as needed
|
||||
+ * for the rx_msdu field, i.e. it is IEEE80211_NUM_TIDS
|
||||
+ * for non-QoS-data frames. Here we know it's a data
|
||||
+ * frame, so count MSDUs.
|
||||
+ */
|
||||
+ u64_stats_update_begin(&stats->syncp);
|
||||
+ stats->msdu[rx->seqno_idx]++;
|
||||
+ stats->bytes += orig_len;
|
||||
+ u64_stats_update_end(&stats->syncp);
|
||||
+
|
||||
+ if (fast_rx->internal_forward) {
|
||||
+ struct sk_buff *xmit_skb = NULL;
|
||||
+ if (is_multicast_ether_addr(da)) {
|
||||
+ xmit_skb = skb_copy(skb, GFP_ATOMIC);
|
||||
+ } else if (!ether_addr_equal(da, sa) &&
|
||||
+ sta_info_get(rx->sdata, da)) {
|
||||
+ xmit_skb = skb;
|
||||
+ skb = NULL;
|
||||
+ }
|
||||
+
|
||||
+ if (xmit_skb) {
|
||||
+ /*
|
||||
+ * Send to wireless media and increase priority by 256
|
||||
+ * to keep the received priority instead of
|
||||
+ * reclassifying the frame (see cfg80211_classify8021d).
|
||||
+ */
|
||||
+ xmit_skb->priority += 256;
|
||||
+ xmit_skb->protocol = htons(ETH_P_802_3);
|
||||
+ skb_reset_network_header(xmit_skb);
|
||||
+ skb_reset_mac_header(xmit_skb);
|
||||
+ dev_queue_xmit(xmit_skb);
|
||||
+ }
|
||||
+
|
||||
+ if (!skb)
|
||||
+ return;
|
||||
+ }
|
||||
+
|
||||
+ /* deliver to local stack */
|
||||
+ skb->protocol = eth_type_trans(skb, fast_rx->dev);
|
||||
+ memset(skb->cb, 0, sizeof(skb->cb));
|
||||
+ if (rx->list)
|
||||
+#if LINUX_VERSION_IS_GEQ(4,19,0)
|
||||
+ list_add_tail(&skb->list, rx->list);
|
||||
+#else
|
||||
+ __skb_queue_tail(rx->list, skb);
|
||||
+#endif
|
||||
+ else
|
||||
+ netif_receive_skb(skb);
|
||||
+
|
||||
+}
|
||||
+
|
||||
static bool ieee80211_invoke_fast_rx(struct ieee80211_rx_data *rx,
|
||||
struct ieee80211_fast_rx *fast_rx)
|
||||
{
|
||||
@@ -4374,9 +4489,6 @@ static bool ieee80211_invoke_fast_rx(str
|
||||
} addrs __aligned(2);
|
||||
struct ieee80211_sta_rx_stats *stats = &sta->rx_stats;
|
||||
|
||||
- if (fast_rx->uses_rss)
|
||||
- stats = this_cpu_ptr(sta->pcpu_rx_stats);
|
||||
-
|
||||
/* for parallel-rx, we need to have DUP_VALIDATED, otherwise we write
|
||||
* to a common data structure; drivers can implement that per queue
|
||||
* but we don't have that information in mac80211
|
||||
@@ -4450,32 +4562,6 @@ static bool ieee80211_invoke_fast_rx(str
|
||||
pskb_trim(skb, skb->len - fast_rx->icv_len))
|
||||
goto drop;
|
||||
|
||||
- /* statistics part of ieee80211_rx_h_sta_process() */
|
||||
- if (!(status->flag & RX_FLAG_NO_SIGNAL_VAL)) {
|
||||
- stats->last_signal = status->signal;
|
||||
- if (!fast_rx->uses_rss)
|
||||
- ewma_signal_add(&sta->rx_stats_avg.signal,
|
||||
- -status->signal);
|
||||
- }
|
||||
-
|
||||
- if (status->chains) {
|
||||
- int i;
|
||||
-
|
||||
- stats->chains = status->chains;
|
||||
- for (i = 0; i < ARRAY_SIZE(status->chain_signal); i++) {
|
||||
- int signal = status->chain_signal[i];
|
||||
-
|
||||
- if (!(status->chains & BIT(i)))
|
||||
- continue;
|
||||
-
|
||||
- stats->chain_signal_last[i] = signal;
|
||||
- if (!fast_rx->uses_rss)
|
||||
- ewma_signal_add(&sta->rx_stats_avg.chain_signal[i],
|
||||
- -signal);
|
||||
- }
|
||||
- }
|
||||
- /* end of statistics */
|
||||
-
|
||||
if (rx->key && !ieee80211_has_protected(hdr->frame_control))
|
||||
goto drop;
|
||||
|
||||
@@ -4487,12 +4573,6 @@ static bool ieee80211_invoke_fast_rx(str
|
||||
return true;
|
||||
}
|
||||
|
||||
- stats->last_rx = jiffies;
|
||||
- stats->last_rate = sta_stats_encode_rate(status);
|
||||
-
|
||||
- stats->fragments++;
|
||||
- stats->packets++;
|
||||
-
|
||||
/* do the header conversion - first grab the addresses */
|
||||
ether_addr_copy(addrs.da, skb->data + fast_rx->da_offs);
|
||||
ether_addr_copy(addrs.sa, skb->data + fast_rx->sa_offs);
|
||||
@@ -4501,62 +4581,14 @@ static bool ieee80211_invoke_fast_rx(str
|
||||
/* push the addresses in front */
|
||||
memcpy(skb_push(skb, sizeof(addrs)), &addrs, sizeof(addrs));
|
||||
|
||||
- skb->dev = fast_rx->dev;
|
||||
-
|
||||
- ieee80211_rx_stats(fast_rx->dev, skb->len);
|
||||
-
|
||||
- /* The seqno index has the same property as needed
|
||||
- * for the rx_msdu field, i.e. it is IEEE80211_NUM_TIDS
|
||||
- * for non-QoS-data frames. Here we know it's a data
|
||||
- * frame, so count MSDUs.
|
||||
- */
|
||||
- u64_stats_update_begin(&stats->syncp);
|
||||
- stats->msdu[rx->seqno_idx]++;
|
||||
- stats->bytes += orig_len;
|
||||
- u64_stats_update_end(&stats->syncp);
|
||||
-
|
||||
- if (fast_rx->internal_forward) {
|
||||
- struct sk_buff *xmit_skb = NULL;
|
||||
- if (is_multicast_ether_addr(addrs.da)) {
|
||||
- xmit_skb = skb_copy(skb, GFP_ATOMIC);
|
||||
- } else if (!ether_addr_equal(addrs.da, addrs.sa) &&
|
||||
- sta_info_get(rx->sdata, addrs.da)) {
|
||||
- xmit_skb = skb;
|
||||
- skb = NULL;
|
||||
- }
|
||||
-
|
||||
- if (xmit_skb) {
|
||||
- /*
|
||||
- * Send to wireless media and increase priority by 256
|
||||
- * to keep the received priority instead of
|
||||
- * reclassifying the frame (see cfg80211_classify8021d).
|
||||
- */
|
||||
- xmit_skb->priority += 256;
|
||||
- xmit_skb->protocol = htons(ETH_P_802_3);
|
||||
- skb_reset_network_header(xmit_skb);
|
||||
- skb_reset_mac_header(xmit_skb);
|
||||
- dev_queue_xmit(xmit_skb);
|
||||
- }
|
||||
-
|
||||
- if (!skb)
|
||||
- return true;
|
||||
- }
|
||||
-
|
||||
- /* deliver to local stack */
|
||||
- skb->protocol = eth_type_trans(skb, fast_rx->dev);
|
||||
- memset(skb->cb, 0, sizeof(skb->cb));
|
||||
- if (rx->list)
|
||||
-#if LINUX_VERSION_IS_GEQ(4,19,0)
|
||||
- list_add_tail(&skb->list, rx->list);
|
||||
-#else
|
||||
- __skb_queue_tail(rx->list, skb);
|
||||
-#endif
|
||||
- else
|
||||
- netif_receive_skb(skb);
|
||||
+ ieee80211_rx_8023(rx, fast_rx, orig_len);
|
||||
|
||||
return true;
|
||||
drop:
|
||||
dev_kfree_skb(skb);
|
||||
+ if (fast_rx->uses_rss)
|
||||
+ stats = this_cpu_ptr(sta->pcpu_rx_stats);
|
||||
+
|
||||
stats->dropped++;
|
||||
return true;
|
||||
}
|
||||
@@ -4610,6 +4642,47 @@ static bool ieee80211_prepare_and_rx_han
|
||||
return true;
|
||||
}
|
||||
|
||||
+static void __ieee80211_rx_handle_8023(struct ieee80211_hw *hw,
|
||||
+ struct ieee80211_sta *pubsta,
|
||||
+ struct sk_buff *skb,
|
||||
+#if LINUX_VERSION_IS_GEQ(4,19,0)
|
||||
+ struct list_head *list)
|
||||
+#else
|
||||
+ struct sk_buff_head *list)
|
||||
+#endif
|
||||
+{
|
||||
+ struct ieee80211_local *local = hw_to_local(hw);
|
||||
+ struct ieee80211_fast_rx *fast_rx;
|
||||
+ struct ieee80211_rx_data rx;
|
||||
+
|
||||
+ memset(&rx, 0, sizeof(rx));
|
||||
+ rx.skb = skb;
|
||||
+ rx.local = local;
|
||||
+ rx.list = list;
|
||||
+
|
||||
+ I802_DEBUG_INC(local->dot11ReceivedFragmentCount);
|
||||
+
|
||||
+ /* drop frame if too short for header */
|
||||
+ if (skb->len < sizeof(struct ethhdr))
|
||||
+ goto drop;
|
||||
+
|
||||
+ if (!pubsta)
|
||||
+ goto drop;
|
||||
+
|
||||
+ rx.sta = container_of(pubsta, struct sta_info, sta);
|
||||
+ rx.sdata = rx.sta->sdata;
|
||||
+
|
||||
+ fast_rx = rcu_dereference(rx.sta->fast_rx);
|
||||
+ if (!fast_rx)
|
||||
+ goto drop;
|
||||
+
|
||||
+ ieee80211_rx_8023(&rx, fast_rx, skb->len);
|
||||
+ return;
|
||||
+
|
||||
+drop:
|
||||
+ dev_kfree_skb(skb);
|
||||
+}
|
||||
+
|
||||
/*
|
||||
* This is the actual Rx frames handler. as it belongs to Rx path it must
|
||||
* be called with rcu_read_lock protection.
|
||||
@@ -4847,15 +4920,20 @@ void ieee80211_rx_list(struct ieee80211_
|
||||
* if it was previously present.
|
||||
* Also, frames with less than 16 bytes are dropped.
|
||||
*/
|
||||
- skb = ieee80211_rx_monitor(local, skb, rate);
|
||||
- if (!skb)
|
||||
- return;
|
||||
+ if (!(status->flag & RX_FLAG_8023)) {
|
||||
+ skb = ieee80211_rx_monitor(local, skb, rate);
|
||||
+ if (!skb)
|
||||
+ return;
|
||||
+ }
|
||||
|
||||
ieee80211_tpt_led_trig_rx(local,
|
||||
((struct ieee80211_hdr *)skb->data)->frame_control,
|
||||
skb->len);
|
||||
|
||||
- __ieee80211_rx_handle_packet(hw, pubsta, skb, list);
|
||||
+ if (status->flag & RX_FLAG_8023)
|
||||
+ __ieee80211_rx_handle_8023(hw, pubsta, skb, list);
|
||||
+ else
|
||||
+ __ieee80211_rx_handle_packet(hw, pubsta, skb, list);
|
||||
|
||||
return;
|
||||
drop:
|
||||
--- a/net/mac80211/sta_info.h
|
||||
+++ b/net/mac80211/sta_info.h
|
||||
@@ -71,6 +71,7 @@
|
||||
* until pending frames are delivered
|
||||
* @WLAN_STA_USES_ENCRYPTION: This station was configured for encryption,
|
||||
* so drop all packets without a key later.
|
||||
+ * @WLAN_STA_DECAP_OFFLOAD: This station uses rx decap offload
|
||||
*
|
||||
* @NUM_WLAN_STA_FLAGS: number of defined flags
|
||||
*/
|
||||
@@ -102,6 +103,7 @@ enum ieee80211_sta_info_flags {
|
||||
WLAN_STA_MPSP_RECIPIENT,
|
||||
WLAN_STA_PS_DELIVER,
|
||||
WLAN_STA_USES_ENCRYPTION,
|
||||
+ WLAN_STA_DECAP_OFFLOAD,
|
||||
|
||||
NUM_WLAN_STA_FLAGS,
|
||||
};
|
||||
--- a/net/mac80211/trace.h
|
||||
+++ b/net/mac80211/trace.h
|
||||
@@ -2761,7 +2761,7 @@ DEFINE_EVENT(local_sdata_addr_evt, drv_u
|
||||
TP_ARGS(local, sdata)
|
||||
);
|
||||
|
||||
-TRACE_EVENT(drv_sta_set_4addr,
|
||||
+DECLARE_EVENT_CLASS(sta_flag_evt,
|
||||
TP_PROTO(struct ieee80211_local *local,
|
||||
struct ieee80211_sub_if_data *sdata,
|
||||
struct ieee80211_sta *sta, bool enabled),
|
||||
@@ -2788,6 +2788,22 @@ TRACE_EVENT(drv_sta_set_4addr,
|
||||
)
|
||||
);
|
||||
|
||||
+DEFINE_EVENT(sta_flag_evt, drv_sta_set_4addr,
|
||||
+ TP_PROTO(struct ieee80211_local *local,
|
||||
+ struct ieee80211_sub_if_data *sdata,
|
||||
+ struct ieee80211_sta *sta, bool enabled),
|
||||
+
|
||||
+ TP_ARGS(local, sdata, sta, enabled)
|
||||
+);
|
||||
+
|
||||
+DEFINE_EVENT(sta_flag_evt, drv_sta_set_decap_offload,
|
||||
+ TP_PROTO(struct ieee80211_local *local,
|
||||
+ struct ieee80211_sub_if_data *sdata,
|
||||
+ struct ieee80211_sta *sta, bool enabled),
|
||||
+
|
||||
+ TP_ARGS(local, sdata, sta, enabled)
|
||||
+);
|
||||
+
|
||||
#endif /* !__MAC80211_DRIVER_TRACE || TRACE_HEADER_MULTI_READ */
|
||||
|
||||
#undef TRACE_INCLUDE_PATH
|
||||
@ -1,116 +0,0 @@
|
||||
From: Markus Theil <markus.theil@tu-ilmenau.de>
|
||||
Date: Sat, 6 Feb 2021 12:51:12 +0100
|
||||
Subject: [PATCH] mac80211: enable QoS support for nl80211 ctrl port
|
||||
|
||||
This patch unifies sending control port frames
|
||||
over nl80211 and AF_PACKET sockets a little more.
|
||||
|
||||
Before this patch, EAPOL frames got QoS prioritization
|
||||
only when using AF_PACKET sockets.
|
||||
|
||||
__ieee80211_select_queue only selects a QoS-enabled queue
|
||||
for control port frames, when the control port protocol
|
||||
is set correctly on the skb. For the AF_PACKET path this
|
||||
works, but the nl80211 path used ETH_P_802_3.
|
||||
|
||||
Another check for injected frames in wme.c then prevented
|
||||
the QoS TID to be copied in the frame.
|
||||
|
||||
In order to fix this, get rid of the frame injection marking
|
||||
for nl80211 ctrl port and set the correct ethernet protocol.
|
||||
|
||||
Please note:
|
||||
An erlier version of this path tried to prevent
|
||||
frame aggregation for control port frames in order to speed up
|
||||
the initial connection setup a little. This seemed to cause
|
||||
issues on my older Intel dvm-based hardware, and was therefore
|
||||
removed again. Future commits which try to reintroduce this
|
||||
have to check carefully how hw behaves with aggregated and
|
||||
non-aggregated traffic for the same TID.
|
||||
My NIC: Intel(R) Centrino(R) Ultimate-N 6300 AGN, REV=0x74
|
||||
|
||||
Reported-by: kernel test robot <lkp@intel.com>
|
||||
Signed-off-by: Markus Theil <markus.theil@tu-ilmenau.de>
|
||||
Link: https://lore.kernel.org/r/20210206115112.567881-1-markus.theil@tu-ilmenau.de
|
||||
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
|
||||
---
|
||||
|
||||
--- a/net/mac80211/status.c
|
||||
+++ b/net/mac80211/status.c
|
||||
@@ -628,16 +628,12 @@ static void ieee80211_report_ack_skb(str
|
||||
u64 cookie = IEEE80211_SKB_CB(skb)->ack.cookie;
|
||||
struct ieee80211_sub_if_data *sdata;
|
||||
struct ieee80211_hdr *hdr = (void *)skb->data;
|
||||
- __be16 ethertype = 0;
|
||||
-
|
||||
- if (skb->len >= ETH_HLEN && skb->protocol == cpu_to_be16(ETH_P_802_3))
|
||||
- skb_copy_bits(skb, 2 * ETH_ALEN, ðertype, ETH_TLEN);
|
||||
|
||||
rcu_read_lock();
|
||||
sdata = ieee80211_sdata_from_skb(local, skb);
|
||||
if (sdata) {
|
||||
- if (ethertype == sdata->control_port_protocol ||
|
||||
- ethertype == cpu_to_be16(ETH_P_PREAUTH))
|
||||
+ if (skb->protocol == sdata->control_port_protocol ||
|
||||
+ skb->protocol == cpu_to_be16(ETH_P_PREAUTH))
|
||||
cfg80211_control_port_tx_status(&sdata->wdev,
|
||||
cookie,
|
||||
skb->data,
|
||||
--- a/net/mac80211/tx.c
|
||||
+++ b/net/mac80211/tx.c
|
||||
@@ -1195,9 +1195,7 @@ ieee80211_tx_prepare(struct ieee80211_su
|
||||
tx->sta = rcu_dereference(sdata->u.vlan.sta);
|
||||
if (!tx->sta && sdata->wdev.use_4addr)
|
||||
return TX_DROP;
|
||||
- } else if (info->flags & (IEEE80211_TX_INTFL_NL80211_FRAME_TX |
|
||||
- IEEE80211_TX_CTL_INJECTED) ||
|
||||
- tx->sdata->control_port_protocol == tx->skb->protocol) {
|
||||
+ } else if (tx->sdata->control_port_protocol == tx->skb->protocol) {
|
||||
tx->sta = sta_info_get_bss(sdata, hdr->addr1);
|
||||
}
|
||||
if (!tx->sta && !is_multicast_ether_addr(hdr->addr1))
|
||||
@@ -5443,6 +5441,7 @@ int ieee80211_tx_control_port(struct wip
|
||||
{
|
||||
struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
|
||||
struct ieee80211_local *local = sdata->local;
|
||||
+ struct sta_info *sta;
|
||||
struct sk_buff *skb;
|
||||
struct ethhdr *ehdr;
|
||||
u32 ctrl_flags = 0;
|
||||
@@ -5465,8 +5464,7 @@ int ieee80211_tx_control_port(struct wip
|
||||
if (cookie)
|
||||
ctrl_flags |= IEEE80211_TX_CTL_REQ_TX_STATUS;
|
||||
|
||||
- flags |= IEEE80211_TX_INTFL_NL80211_FRAME_TX |
|
||||
- IEEE80211_TX_CTL_INJECTED;
|
||||
+ flags |= IEEE80211_TX_INTFL_NL80211_FRAME_TX;
|
||||
|
||||
skb = dev_alloc_skb(local->hw.extra_tx_headroom +
|
||||
sizeof(struct ethhdr) + len);
|
||||
@@ -5483,10 +5481,25 @@ int ieee80211_tx_control_port(struct wip
|
||||
ehdr->h_proto = proto;
|
||||
|
||||
skb->dev = dev;
|
||||
- skb->protocol = htons(ETH_P_802_3);
|
||||
+ skb->protocol = proto;
|
||||
skb_reset_network_header(skb);
|
||||
skb_reset_mac_header(skb);
|
||||
|
||||
+ /* update QoS header to prioritize control port frames if possible,
|
||||
+ * priorization also happens for control port frames send over
|
||||
+ * AF_PACKET
|
||||
+ */
|
||||
+ rcu_read_lock();
|
||||
+
|
||||
+ if (ieee80211_lookup_ra_sta(sdata, skb, &sta) == 0 && !IS_ERR(sta)) {
|
||||
+ u16 queue = __ieee80211_select_queue(sdata, sta, skb);
|
||||
+
|
||||
+ skb_set_queue_mapping(skb, queue);
|
||||
+ skb_get_hash(skb);
|
||||
+ }
|
||||
+
|
||||
+ rcu_read_unlock();
|
||||
+
|
||||
/* mutex lock is only needed for incrementing the cookie counter */
|
||||
mutex_lock(&local->mtx);
|
||||
|
||||
@ -1,123 +0,0 @@
|
||||
From: Ramon Fontes <ramonreisfontes@gmail.com>
|
||||
Date: Sun, 27 Dec 2020 00:11:55 -0300
|
||||
Subject: [PATCH] mac80211_hwsim: add 6GHz channels
|
||||
|
||||
Advertise 6GHz channels to mac80211.
|
||||
|
||||
Signed-off-by: Ramon Fontes <ramonreisfontes@gmail.com>
|
||||
Link: https://lore.kernel.org/r/20201227031155.81161-1-ramonreisfontes@gmail.com
|
||||
[reword commit message]
|
||||
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
|
||||
---
|
||||
|
||||
--- a/drivers/net/wireless/mac80211_hwsim.c
|
||||
+++ b/drivers/net/wireless/mac80211_hwsim.c
|
||||
@@ -311,6 +311,12 @@ static struct net_device *hwsim_mon; /*
|
||||
.hw_value = (_freq), \
|
||||
}
|
||||
|
||||
+#define CHAN6G(_freq) { \
|
||||
+ .band = NL80211_BAND_6GHZ, \
|
||||
+ .center_freq = (_freq), \
|
||||
+ .hw_value = (_freq), \
|
||||
+}
|
||||
+
|
||||
static const struct ieee80211_channel hwsim_channels_2ghz[] = {
|
||||
CHAN2G(2412), /* Channel 1 */
|
||||
CHAN2G(2417), /* Channel 2 */
|
||||
@@ -377,6 +383,68 @@ static const struct ieee80211_channel hw
|
||||
CHAN5G(5925), /* Channel 185 */
|
||||
};
|
||||
|
||||
+static const struct ieee80211_channel hwsim_channels_6ghz[] = {
|
||||
+ CHAN6G(5955), /* Channel 1 */
|
||||
+ CHAN6G(5975), /* Channel 5 */
|
||||
+ CHAN6G(5995), /* Channel 9 */
|
||||
+ CHAN6G(6015), /* Channel 13 */
|
||||
+ CHAN6G(6035), /* Channel 17 */
|
||||
+ CHAN6G(6055), /* Channel 21 */
|
||||
+ CHAN6G(6075), /* Channel 25 */
|
||||
+ CHAN6G(6095), /* Channel 29 */
|
||||
+ CHAN6G(6115), /* Channel 33 */
|
||||
+ CHAN6G(6135), /* Channel 37 */
|
||||
+ CHAN6G(6155), /* Channel 41 */
|
||||
+ CHAN6G(6175), /* Channel 45 */
|
||||
+ CHAN6G(6195), /* Channel 49 */
|
||||
+ CHAN6G(6215), /* Channel 53 */
|
||||
+ CHAN6G(6235), /* Channel 57 */
|
||||
+ CHAN6G(6255), /* Channel 61 */
|
||||
+ CHAN6G(6275), /* Channel 65 */
|
||||
+ CHAN6G(6295), /* Channel 69 */
|
||||
+ CHAN6G(6315), /* Channel 73 */
|
||||
+ CHAN6G(6335), /* Channel 77 */
|
||||
+ CHAN6G(6355), /* Channel 81 */
|
||||
+ CHAN6G(6375), /* Channel 85 */
|
||||
+ CHAN6G(6395), /* Channel 89 */
|
||||
+ CHAN6G(6415), /* Channel 93 */
|
||||
+ CHAN6G(6435), /* Channel 97 */
|
||||
+ CHAN6G(6455), /* Channel 181 */
|
||||
+ CHAN6G(6475), /* Channel 105 */
|
||||
+ CHAN6G(6495), /* Channel 109 */
|
||||
+ CHAN6G(6515), /* Channel 113 */
|
||||
+ CHAN6G(6535), /* Channel 117 */
|
||||
+ CHAN6G(6555), /* Channel 121 */
|
||||
+ CHAN6G(6575), /* Channel 125 */
|
||||
+ CHAN6G(6595), /* Channel 129 */
|
||||
+ CHAN6G(6615), /* Channel 133 */
|
||||
+ CHAN6G(6635), /* Channel 137 */
|
||||
+ CHAN6G(6655), /* Channel 141 */
|
||||
+ CHAN6G(6675), /* Channel 145 */
|
||||
+ CHAN6G(6695), /* Channel 149 */
|
||||
+ CHAN6G(6715), /* Channel 153 */
|
||||
+ CHAN6G(6735), /* Channel 157 */
|
||||
+ CHAN6G(6755), /* Channel 161 */
|
||||
+ CHAN6G(6775), /* Channel 165 */
|
||||
+ CHAN6G(6795), /* Channel 169 */
|
||||
+ CHAN6G(6815), /* Channel 173 */
|
||||
+ CHAN6G(6835), /* Channel 177 */
|
||||
+ CHAN6G(6855), /* Channel 181 */
|
||||
+ CHAN6G(6875), /* Channel 185 */
|
||||
+ CHAN6G(6895), /* Channel 189 */
|
||||
+ CHAN6G(6915), /* Channel 193 */
|
||||
+ CHAN6G(6935), /* Channel 197 */
|
||||
+ CHAN6G(6955), /* Channel 201 */
|
||||
+ CHAN6G(6975), /* Channel 205 */
|
||||
+ CHAN6G(6995), /* Channel 209 */
|
||||
+ CHAN6G(7015), /* Channel 213 */
|
||||
+ CHAN6G(7035), /* Channel 217 */
|
||||
+ CHAN6G(7055), /* Channel 221 */
|
||||
+ CHAN6G(7075), /* Channel 225 */
|
||||
+ CHAN6G(7095), /* Channel 229 */
|
||||
+ CHAN6G(7115), /* Channel 233 */
|
||||
+};
|
||||
+
|
||||
#define NUM_S1G_CHANS_US 51
|
||||
static struct ieee80211_channel hwsim_channels_s1g[NUM_S1G_CHANS_US];
|
||||
|
||||
@@ -548,6 +616,7 @@ struct mac80211_hwsim_data {
|
||||
struct ieee80211_supported_band bands[NUM_NL80211_BANDS];
|
||||
struct ieee80211_channel channels_2ghz[ARRAY_SIZE(hwsim_channels_2ghz)];
|
||||
struct ieee80211_channel channels_5ghz[ARRAY_SIZE(hwsim_channels_5ghz)];
|
||||
+ struct ieee80211_channel channels_6ghz[ARRAY_SIZE(hwsim_channels_6ghz)];
|
||||
struct ieee80211_channel channels_s1g[ARRAY_SIZE(hwsim_channels_s1g)];
|
||||
struct ieee80211_rate rates[ARRAY_SIZE(hwsim_rates)];
|
||||
struct ieee80211_iface_combination if_combination;
|
||||
@@ -579,7 +648,8 @@ struct mac80211_hwsim_data {
|
||||
struct ieee80211_channel *channel;
|
||||
unsigned long next_start, start, end;
|
||||
} survey_data[ARRAY_SIZE(hwsim_channels_2ghz) +
|
||||
- ARRAY_SIZE(hwsim_channels_5ghz)];
|
||||
+ ARRAY_SIZE(hwsim_channels_5ghz) +
|
||||
+ ARRAY_SIZE(hwsim_channels_6ghz)];
|
||||
|
||||
struct ieee80211_channel *channel;
|
||||
u64 beacon_int /* beacon interval in us */;
|
||||
@@ -3172,6 +3242,8 @@ static int mac80211_hwsim_new_radio(stru
|
||||
sizeof(hwsim_channels_2ghz));
|
||||
memcpy(data->channels_5ghz, hwsim_channels_5ghz,
|
||||
sizeof(hwsim_channels_5ghz));
|
||||
+ memcpy(data->channels_6ghz, hwsim_channels_6ghz,
|
||||
+ sizeof(hwsim_channels_6ghz));
|
||||
memcpy(data->channels_s1g, hwsim_channels_s1g,
|
||||
sizeof(hwsim_channels_s1g));
|
||||
memcpy(data->rates, hwsim_rates, sizeof(hwsim_rates));
|
||||
@ -11,7 +11,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
|
||||
|
||||
--- a/drivers/net/wireless/mac80211_hwsim.c
|
||||
+++ b/drivers/net/wireless/mac80211_hwsim.c
|
||||
@@ -2990,15 +2990,19 @@ static void mac80211_hwsim_he_capab(stru
|
||||
@@ -2992,15 +2992,19 @@ static void mac80211_hwsim_he_capab(stru
|
||||
{
|
||||
u16 n_iftype_data;
|
||||
|
||||
@ -34,7 +34,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -3288,6 +3292,12 @@ static int mac80211_hwsim_new_radio(stru
|
||||
@@ -3290,6 +3294,12 @@ static int mac80211_hwsim_new_radio(stru
|
||||
sband->vht_cap.vht_mcs.tx_mcs_map =
|
||||
sband->vht_cap.vht_mcs.rx_mcs_map;
|
||||
break;
|
||||
@ -47,7 +47,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
|
||||
case NL80211_BAND_S1GHZ:
|
||||
memcpy(&sband->s1g_cap, &hwsim_s1g_cap,
|
||||
sizeof(sband->s1g_cap));
|
||||
@@ -3298,6 +3308,13 @@ static int mac80211_hwsim_new_radio(stru
|
||||
@@ -3300,6 +3310,13 @@ static int mac80211_hwsim_new_radio(stru
|
||||
continue;
|
||||
}
|
||||
|
||||
@ -61,7 +61,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
|
||||
sband->ht_cap.ht_supported = true;
|
||||
sband->ht_cap.cap = IEEE80211_HT_CAP_SUP_WIDTH_20_40 |
|
||||
IEEE80211_HT_CAP_GRN_FLD |
|
||||
@@ -3311,10 +3328,6 @@ static int mac80211_hwsim_new_radio(stru
|
||||
@@ -3313,10 +3330,6 @@ static int mac80211_hwsim_new_radio(stru
|
||||
sband->ht_cap.mcs.rx_mask[0] = 0xff;
|
||||
sband->ht_cap.mcs.rx_mask[1] = 0xff;
|
||||
sband->ht_cap.mcs.tx_params = IEEE80211_HT_MCS_TX_DEFINED;
|
||||
|
||||
@ -1,166 +0,0 @@
|
||||
From: Felix Fietkau <nbd@nbd.name>
|
||||
Date: Fri, 25 Dec 2020 16:22:52 +0100
|
||||
Subject: [PATCH] mac80211: minstrel_ht: clean up CCK code
|
||||
|
||||
- move ack overhead out of rate duration table
|
||||
- remove cck_supported, cck_supported_short
|
||||
|
||||
Preparation for adding OFDM legacy rates support
|
||||
|
||||
Signed-off-by: Felix Fietkau <nbd@nbd.name>
|
||||
---
|
||||
|
||||
--- a/net/mac80211/rc80211_minstrel_ht.c
|
||||
+++ b/net/mac80211/rc80211_minstrel_ht.c
|
||||
@@ -136,20 +136,16 @@
|
||||
__VHT_GROUP(_streams, _sgi, _bw, \
|
||||
VHT_GROUP_SHIFT(_streams, _sgi, _bw))
|
||||
|
||||
-#define CCK_DURATION(_bitrate, _short, _len) \
|
||||
+#define CCK_DURATION(_bitrate, _short) \
|
||||
(1000 * (10 /* SIFS */ + \
|
||||
(_short ? 72 + 24 : 144 + 48) + \
|
||||
- (8 * (_len + 4) * 10) / (_bitrate)))
|
||||
-
|
||||
-#define CCK_ACK_DURATION(_bitrate, _short) \
|
||||
- (CCK_DURATION((_bitrate > 10 ? 20 : 10), false, 60) + \
|
||||
- CCK_DURATION(_bitrate, _short, AVG_PKT_SIZE))
|
||||
+ (8 * (AVG_PKT_SIZE + 4) * 10) / (_bitrate)))
|
||||
|
||||
#define CCK_DURATION_LIST(_short, _s) \
|
||||
- CCK_ACK_DURATION(10, _short) >> _s, \
|
||||
- CCK_ACK_DURATION(20, _short) >> _s, \
|
||||
- CCK_ACK_DURATION(55, _short) >> _s, \
|
||||
- CCK_ACK_DURATION(110, _short) >> _s
|
||||
+ CCK_DURATION(10, _short) >> _s, \
|
||||
+ CCK_DURATION(20, _short) >> _s, \
|
||||
+ CCK_DURATION(55, _short) >> _s, \
|
||||
+ CCK_DURATION(110, _short) >> _s
|
||||
|
||||
#define __CCK_GROUP(_s) \
|
||||
[MINSTREL_CCK_GROUP] = { \
|
||||
@@ -163,7 +159,7 @@
|
||||
}
|
||||
|
||||
#define CCK_GROUP_SHIFT \
|
||||
- GROUP_SHIFT(CCK_ACK_DURATION(10, false))
|
||||
+ GROUP_SHIFT(CCK_DURATION(10, false))
|
||||
|
||||
#define CCK_GROUP __CCK_GROUP(CCK_GROUP_SHIFT)
|
||||
|
||||
@@ -349,15 +345,19 @@ int
|
||||
minstrel_ht_get_tp_avg(struct minstrel_ht_sta *mi, int group, int rate,
|
||||
int prob_avg)
|
||||
{
|
||||
- unsigned int nsecs = 0;
|
||||
+ unsigned int nsecs = 0, overhead = mi->overhead;
|
||||
+ unsigned int ampdu_len = 1;
|
||||
|
||||
/* do not account throughput if sucess prob is below 10% */
|
||||
if (prob_avg < MINSTREL_FRAC(10, 100))
|
||||
return 0;
|
||||
|
||||
- if (group != MINSTREL_CCK_GROUP)
|
||||
- nsecs = 1000 * mi->overhead / minstrel_ht_avg_ampdu_len(mi);
|
||||
+ if (group == MINSTREL_CCK_GROUP)
|
||||
+ overhead = mi->overhead_legacy;
|
||||
+ else
|
||||
+ ampdu_len = minstrel_ht_avg_ampdu_len(mi);
|
||||
|
||||
+ nsecs = 1000 * overhead / ampdu_len;
|
||||
nsecs += minstrel_mcs_groups[group].duration[rate] <<
|
||||
minstrel_mcs_groups[group].shift;
|
||||
|
||||
@@ -1031,7 +1031,10 @@ minstrel_calc_retransmit(struct minstrel
|
||||
ctime += (t_slot * cw) >> 1;
|
||||
cw = min((cw << 1) | 1, mp->cw_max);
|
||||
|
||||
- if (index / MCS_GROUP_RATES != MINSTREL_CCK_GROUP) {
|
||||
+ if (index / MCS_GROUP_RATES == MINSTREL_CCK_GROUP) {
|
||||
+ overhead = mi->overhead_legacy;
|
||||
+ overhead_rtscts = mi->overhead_legacy_rtscts;
|
||||
+ } else {
|
||||
overhead = mi->overhead;
|
||||
overhead_rtscts = mi->overhead_rtscts;
|
||||
}
|
||||
@@ -1369,18 +1372,14 @@ minstrel_ht_update_cck(struct minstrel_p
|
||||
if (!ieee80211_hw_check(mp->hw, SUPPORTS_HT_CCK_RATES))
|
||||
return;
|
||||
|
||||
- mi->cck_supported = 0;
|
||||
- mi->cck_supported_short = 0;
|
||||
for (i = 0; i < 4; i++) {
|
||||
if (!rate_supported(sta, sband->band, mp->cck_rates[i]))
|
||||
continue;
|
||||
|
||||
- mi->cck_supported |= BIT(i);
|
||||
+ mi->supported[MINSTREL_CCK_GROUP] |= BIT(i);
|
||||
if (sband->bitrates[i].flags & IEEE80211_RATE_SHORT_PREAMBLE)
|
||||
- mi->cck_supported_short |= BIT(i);
|
||||
+ mi->supported[MINSTREL_CCK_GROUP] |= BIT(i + 4);
|
||||
}
|
||||
-
|
||||
- mi->supported[MINSTREL_CCK_GROUP] = mi->cck_supported;
|
||||
}
|
||||
|
||||
static void
|
||||
@@ -1394,12 +1393,13 @@ minstrel_ht_update_caps(void *priv, stru
|
||||
struct ieee80211_mcs_info *mcs = &sta->ht_cap.mcs;
|
||||
u16 ht_cap = sta->ht_cap.cap;
|
||||
struct ieee80211_sta_vht_cap *vht_cap = &sta->vht_cap;
|
||||
+ const struct ieee80211_rate *ctl_rate;
|
||||
+ bool ldpc, erp;
|
||||
int use_vht;
|
||||
int n_supported = 0;
|
||||
int ack_dur;
|
||||
int stbc;
|
||||
int i;
|
||||
- bool ldpc;
|
||||
|
||||
/* fall back to the old minstrel for legacy stations */
|
||||
if (!sta->ht_cap.ht_supported)
|
||||
@@ -1423,6 +1423,14 @@ minstrel_ht_update_caps(void *priv, stru
|
||||
mi->overhead += ack_dur;
|
||||
mi->overhead_rtscts = mi->overhead + 2 * ack_dur;
|
||||
|
||||
+ ctl_rate = &sband->bitrates[rate_lowest_index(sband, sta)];
|
||||
+ erp = ctl_rate->flags & IEEE80211_RATE_ERP_G;
|
||||
+ ack_dur = ieee80211_frame_duration(sband->band, 10,
|
||||
+ ctl_rate->bitrate, erp, 1,
|
||||
+ ieee80211_chandef_get_shift(chandef));
|
||||
+ mi->overhead_legacy = ack_dur;
|
||||
+ mi->overhead_legacy_rtscts = mi->overhead_legacy + 2 * ack_dur;
|
||||
+
|
||||
mi->avg_ampdu_len = MINSTREL_FRAC(1, 1);
|
||||
|
||||
/* When using MRR, sample more on the first attempt, without delay */
|
||||
@@ -1523,8 +1531,6 @@ minstrel_ht_update_caps(void *priv, stru
|
||||
if (!n_supported)
|
||||
goto use_legacy;
|
||||
|
||||
- mi->supported[MINSTREL_CCK_GROUP] |= mi->cck_supported_short << 4;
|
||||
-
|
||||
/* create an initial rate table with the lowest supported rates */
|
||||
minstrel_ht_update_stats(mp, mi, true);
|
||||
minstrel_ht_update_rates(mp, mi);
|
||||
--- a/net/mac80211/rc80211_minstrel_ht.h
|
||||
+++ b/net/mac80211/rc80211_minstrel_ht.h
|
||||
@@ -77,6 +77,8 @@ struct minstrel_ht_sta {
|
||||
/* overhead time in usec for each frame */
|
||||
unsigned int overhead;
|
||||
unsigned int overhead_rtscts;
|
||||
+ unsigned int overhead_legacy;
|
||||
+ unsigned int overhead_legacy_rtscts;
|
||||
|
||||
unsigned int total_packets_last;
|
||||
unsigned int total_packets_cur;
|
||||
@@ -97,9 +99,6 @@ struct minstrel_ht_sta {
|
||||
/* current MCS group to be sampled */
|
||||
u8 sample_group;
|
||||
|
||||
- u8 cck_supported;
|
||||
- u8 cck_supported_short;
|
||||
-
|
||||
/* Bitfield of supported MCS rates of all groups */
|
||||
u16 supported[MINSTREL_GROUPS_NB];
|
||||
|
||||
@ -1,762 +0,0 @@
|
||||
From: Felix Fietkau <nbd@nbd.name>
|
||||
Date: Sat, 26 Dec 2020 13:56:42 +0100
|
||||
Subject: [PATCH] mac80211: minstrel_ht: add support for OFDM rates on
|
||||
non-HT clients
|
||||
|
||||
The legacy minstrel code is essentially unmaintained and receives only very
|
||||
little testing. In order to bring the significant algorithm improvements from
|
||||
minstrel_ht to legacy clients, this patch adds support for OFDM rates to
|
||||
minstrel_ht and removes the fallback to the legacy codepath.
|
||||
This also makes it work much better on hardware with rate selection constraints,
|
||||
e.g. mt76.
|
||||
|
||||
Signed-off-by: Felix Fietkau <nbd@nbd.name>
|
||||
---
|
||||
|
||||
--- a/net/mac80211/rc80211_minstrel.h
|
||||
+++ b/net/mac80211/rc80211_minstrel.h
|
||||
@@ -152,6 +152,7 @@ struct minstrel_priv {
|
||||
unsigned int lookaround_rate_mrr;
|
||||
|
||||
u8 cck_rates[4];
|
||||
+ u8 ofdm_rates[NUM_NL80211_BANDS][8];
|
||||
|
||||
#ifdef CPTCFG_MAC80211_DEBUGFS
|
||||
/*
|
||||
--- a/net/mac80211/rc80211_minstrel_ht.c
|
||||
+++ b/net/mac80211/rc80211_minstrel_ht.c
|
||||
@@ -163,6 +163,38 @@
|
||||
|
||||
#define CCK_GROUP __CCK_GROUP(CCK_GROUP_SHIFT)
|
||||
|
||||
+#define OFDM_DURATION(_bitrate) \
|
||||
+ (1000 * (16 /* SIFS + signal ext */ + \
|
||||
+ 16 /* T_PREAMBLE */ + \
|
||||
+ 4 /* T_SIGNAL */ + \
|
||||
+ 4 * (((16 + 80 * (AVG_PKT_SIZE + 4) + 6) / \
|
||||
+ ((_bitrate) * 4)))))
|
||||
+
|
||||
+#define OFDM_DURATION_LIST(_s) \
|
||||
+ OFDM_DURATION(60) >> _s, \
|
||||
+ OFDM_DURATION(90) >> _s, \
|
||||
+ OFDM_DURATION(120) >> _s, \
|
||||
+ OFDM_DURATION(180) >> _s, \
|
||||
+ OFDM_DURATION(240) >> _s, \
|
||||
+ OFDM_DURATION(360) >> _s, \
|
||||
+ OFDM_DURATION(480) >> _s, \
|
||||
+ OFDM_DURATION(540) >> _s
|
||||
+
|
||||
+#define __OFDM_GROUP(_s) \
|
||||
+ [MINSTREL_OFDM_GROUP] = { \
|
||||
+ .streams = 1, \
|
||||
+ .flags = 0, \
|
||||
+ .shift = _s, \
|
||||
+ .duration = { \
|
||||
+ OFDM_DURATION_LIST(_s), \
|
||||
+ } \
|
||||
+ }
|
||||
+
|
||||
+#define OFDM_GROUP_SHIFT \
|
||||
+ GROUP_SHIFT(OFDM_DURATION(60))
|
||||
+
|
||||
+#define OFDM_GROUP __OFDM_GROUP(OFDM_GROUP_SHIFT)
|
||||
+
|
||||
|
||||
static bool minstrel_vht_only = true;
|
||||
module_param(minstrel_vht_only, bool, 0644);
|
||||
@@ -199,6 +231,7 @@ const struct mcs_group minstrel_mcs_grou
|
||||
MCS_GROUP(4, 1, BW_40),
|
||||
|
||||
CCK_GROUP,
|
||||
+ OFDM_GROUP,
|
||||
|
||||
VHT_GROUP(1, 0, BW_20),
|
||||
VHT_GROUP(2, 0, BW_20),
|
||||
@@ -231,6 +264,8 @@ const struct mcs_group minstrel_mcs_grou
|
||||
VHT_GROUP(4, 1, BW_80),
|
||||
};
|
||||
|
||||
+const s16 minstrel_cck_bitrates[4] = { 10, 20, 55, 110 };
|
||||
+const s16 minstrel_ofdm_bitrates[8] = { 60, 90, 120, 180, 240, 360, 480, 540 };
|
||||
static u8 sample_table[SAMPLE_COLUMNS][MCS_GROUP_RATES] __read_mostly;
|
||||
|
||||
static void
|
||||
@@ -275,6 +310,13 @@ minstrel_get_valid_vht_rates(int bw, int
|
||||
return 0x3ff & ~mask;
|
||||
}
|
||||
|
||||
+static bool
|
||||
+minstrel_ht_is_legacy_group(int group)
|
||||
+{
|
||||
+ return group == MINSTREL_CCK_GROUP ||
|
||||
+ group == MINSTREL_OFDM_GROUP;
|
||||
+}
|
||||
+
|
||||
/*
|
||||
* Look up an MCS group index based on mac80211 rate information
|
||||
*/
|
||||
@@ -304,21 +346,34 @@ minstrel_ht_get_stats(struct minstrel_pr
|
||||
if (rate->flags & IEEE80211_TX_RC_MCS) {
|
||||
group = minstrel_ht_get_group_idx(rate);
|
||||
idx = rate->idx % 8;
|
||||
- } else if (rate->flags & IEEE80211_TX_RC_VHT_MCS) {
|
||||
+ goto out;
|
||||
+ }
|
||||
+
|
||||
+ if (rate->flags & IEEE80211_TX_RC_VHT_MCS) {
|
||||
group = minstrel_vht_get_group_idx(rate);
|
||||
idx = ieee80211_rate_get_vht_mcs(rate);
|
||||
- } else {
|
||||
- group = MINSTREL_CCK_GROUP;
|
||||
+ goto out;
|
||||
+ }
|
||||
|
||||
- for (idx = 0; idx < ARRAY_SIZE(mp->cck_rates); idx++)
|
||||
- if (rate->idx == mp->cck_rates[idx])
|
||||
- break;
|
||||
+ group = MINSTREL_CCK_GROUP;
|
||||
+ for (idx = 0; idx < ARRAY_SIZE(mp->cck_rates); idx++) {
|
||||
+ if (rate->idx != mp->cck_rates[idx])
|
||||
+ continue;
|
||||
|
||||
/* short preamble */
|
||||
if ((mi->supported[group] & BIT(idx + 4)) &&
|
||||
(rate->flags & IEEE80211_TX_RC_USE_SHORT_PREAMBLE))
|
||||
- idx += 4;
|
||||
+ idx += 4;
|
||||
+ goto out;
|
||||
}
|
||||
+
|
||||
+ group = MINSTREL_OFDM_GROUP;
|
||||
+ for (idx = 0; idx < ARRAY_SIZE(mp->ofdm_rates[0]); idx++)
|
||||
+ if (rate->idx == mp->ofdm_rates[mi->band][idx])
|
||||
+ goto out;
|
||||
+
|
||||
+ idx = 0;
|
||||
+out:
|
||||
return &mi->groups[group].rates[idx];
|
||||
}
|
||||
|
||||
@@ -352,7 +407,7 @@ minstrel_ht_get_tp_avg(struct minstrel_h
|
||||
if (prob_avg < MINSTREL_FRAC(10, 100))
|
||||
return 0;
|
||||
|
||||
- if (group == MINSTREL_CCK_GROUP)
|
||||
+ if (minstrel_ht_is_legacy_group(group))
|
||||
overhead = mi->overhead_legacy;
|
||||
else
|
||||
ampdu_len = minstrel_ht_avg_ampdu_len(mi);
|
||||
@@ -439,8 +494,8 @@ minstrel_ht_set_best_prob_rate(struct mi
|
||||
/* if max_tp_rate[0] is from MCS_GROUP max_prob_rate get selected from
|
||||
* MCS_GROUP as well as CCK_GROUP rates do not allow aggregation */
|
||||
max_tp_group = mi->max_tp_rate[0] / MCS_GROUP_RATES;
|
||||
- if((index / MCS_GROUP_RATES == MINSTREL_CCK_GROUP) &&
|
||||
- (max_tp_group != MINSTREL_CCK_GROUP))
|
||||
+ if (minstrel_ht_is_legacy_group(index / MCS_GROUP_RATES) &&
|
||||
+ !minstrel_ht_is_legacy_group(max_tp_group))
|
||||
return;
|
||||
|
||||
max_gpr_group = mg->max_group_prob_rate / MCS_GROUP_RATES;
|
||||
@@ -476,13 +531,13 @@ minstrel_ht_set_best_prob_rate(struct mi
|
||||
static void
|
||||
minstrel_ht_assign_best_tp_rates(struct minstrel_ht_sta *mi,
|
||||
u16 tmp_mcs_tp_rate[MAX_THR_RATES],
|
||||
- u16 tmp_cck_tp_rate[MAX_THR_RATES])
|
||||
+ u16 tmp_legacy_tp_rate[MAX_THR_RATES])
|
||||
{
|
||||
unsigned int tmp_group, tmp_idx, tmp_cck_tp, tmp_mcs_tp, tmp_prob;
|
||||
int i;
|
||||
|
||||
- tmp_group = tmp_cck_tp_rate[0] / MCS_GROUP_RATES;
|
||||
- tmp_idx = tmp_cck_tp_rate[0] % MCS_GROUP_RATES;
|
||||
+ tmp_group = tmp_legacy_tp_rate[0] / MCS_GROUP_RATES;
|
||||
+ tmp_idx = tmp_legacy_tp_rate[0] % MCS_GROUP_RATES;
|
||||
tmp_prob = mi->groups[tmp_group].rates[tmp_idx].prob_avg;
|
||||
tmp_cck_tp = minstrel_ht_get_tp_avg(mi, tmp_group, tmp_idx, tmp_prob);
|
||||
|
||||
@@ -493,7 +548,7 @@ minstrel_ht_assign_best_tp_rates(struct
|
||||
|
||||
if (tmp_cck_tp > tmp_mcs_tp) {
|
||||
for(i = 0; i < MAX_THR_RATES; i++) {
|
||||
- minstrel_ht_sort_best_tp_rates(mi, tmp_cck_tp_rate[i],
|
||||
+ minstrel_ht_sort_best_tp_rates(mi, tmp_legacy_tp_rate[i],
|
||||
tmp_mcs_tp_rate);
|
||||
}
|
||||
}
|
||||
@@ -511,6 +566,9 @@ minstrel_ht_prob_rate_reduce_streams(str
|
||||
int tmp_max_streams, group, tmp_idx, tmp_prob;
|
||||
int tmp_tp = 0;
|
||||
|
||||
+ if (!mi->sta->ht_cap.ht_supported)
|
||||
+ return;
|
||||
+
|
||||
tmp_max_streams = minstrel_mcs_groups[mi->max_tp_rate[0] /
|
||||
MCS_GROUP_RATES].streams;
|
||||
for (group = 0; group < ARRAY_SIZE(minstrel_mcs_groups); group++) {
|
||||
@@ -675,7 +733,8 @@ minstrel_ht_update_stats(struct minstrel
|
||||
struct minstrel_rate_stats *mrs;
|
||||
int group, i, j, cur_prob;
|
||||
u16 tmp_mcs_tp_rate[MAX_THR_RATES], tmp_group_tp_rate[MAX_THR_RATES];
|
||||
- u16 tmp_cck_tp_rate[MAX_THR_RATES], index;
|
||||
+ u16 tmp_legacy_tp_rate[MAX_THR_RATES], index;
|
||||
+ bool ht_supported = mi->sta->ht_cap.ht_supported;
|
||||
|
||||
mi->sample_mode = MINSTREL_SAMPLE_IDLE;
|
||||
|
||||
@@ -704,21 +763,29 @@ minstrel_ht_update_stats(struct minstrel
|
||||
mi->sample_count = 0;
|
||||
|
||||
memset(tmp_mcs_tp_rate, 0, sizeof(tmp_mcs_tp_rate));
|
||||
- memset(tmp_cck_tp_rate, 0, sizeof(tmp_cck_tp_rate));
|
||||
+ memset(tmp_legacy_tp_rate, 0, sizeof(tmp_legacy_tp_rate));
|
||||
if (mi->supported[MINSTREL_CCK_GROUP])
|
||||
- for (j = 0; j < ARRAY_SIZE(tmp_cck_tp_rate); j++)
|
||||
- tmp_cck_tp_rate[j] = MINSTREL_CCK_GROUP * MCS_GROUP_RATES;
|
||||
+ for (j = 0; j < ARRAY_SIZE(tmp_legacy_tp_rate); j++)
|
||||
+ tmp_legacy_tp_rate[j] = MINSTREL_CCK_GROUP * MCS_GROUP_RATES;
|
||||
+ else if (mi->supported[MINSTREL_OFDM_GROUP])
|
||||
+ for (j = 0; j < ARRAY_SIZE(tmp_legacy_tp_rate); j++)
|
||||
+ tmp_legacy_tp_rate[j] = MINSTREL_OFDM_GROUP * MCS_GROUP_RATES;
|
||||
|
||||
if (mi->supported[MINSTREL_VHT_GROUP_0])
|
||||
index = MINSTREL_VHT_GROUP_0 * MCS_GROUP_RATES;
|
||||
- else
|
||||
+ else if (ht_supported)
|
||||
index = MINSTREL_HT_GROUP_0 * MCS_GROUP_RATES;
|
||||
+ else if (mi->supported[MINSTREL_CCK_GROUP])
|
||||
+ index = MINSTREL_CCK_GROUP * MCS_GROUP_RATES;
|
||||
+ else
|
||||
+ index = MINSTREL_OFDM_GROUP * MCS_GROUP_RATES;
|
||||
|
||||
for (j = 0; j < ARRAY_SIZE(tmp_mcs_tp_rate); j++)
|
||||
tmp_mcs_tp_rate[j] = index;
|
||||
|
||||
/* Find best rate sets within all MCS groups*/
|
||||
for (group = 0; group < ARRAY_SIZE(minstrel_mcs_groups); group++) {
|
||||
+ u16 *tp_rate = tmp_mcs_tp_rate;
|
||||
|
||||
mg = &mi->groups[group];
|
||||
if (!mi->supported[group])
|
||||
@@ -730,6 +797,9 @@ minstrel_ht_update_stats(struct minstrel
|
||||
for(j = 0; j < MAX_THR_RATES; j++)
|
||||
tmp_group_tp_rate[j] = MCS_GROUP_RATES * group;
|
||||
|
||||
+ if (group == MINSTREL_CCK_GROUP && ht_supported)
|
||||
+ tp_rate = tmp_legacy_tp_rate;
|
||||
+
|
||||
for (i = 0; i < MCS_GROUP_RATES; i++) {
|
||||
if (!(mi->supported[group] & BIT(i)))
|
||||
continue;
|
||||
@@ -745,13 +815,7 @@ minstrel_ht_update_stats(struct minstrel
|
||||
continue;
|
||||
|
||||
/* Find max throughput rate set */
|
||||
- if (group != MINSTREL_CCK_GROUP) {
|
||||
- minstrel_ht_sort_best_tp_rates(mi, index,
|
||||
- tmp_mcs_tp_rate);
|
||||
- } else if (group == MINSTREL_CCK_GROUP) {
|
||||
- minstrel_ht_sort_best_tp_rates(mi, index,
|
||||
- tmp_cck_tp_rate);
|
||||
- }
|
||||
+ minstrel_ht_sort_best_tp_rates(mi, index, tp_rate);
|
||||
|
||||
/* Find max throughput rate set within a group */
|
||||
minstrel_ht_sort_best_tp_rates(mi, index,
|
||||
@@ -766,7 +830,8 @@ minstrel_ht_update_stats(struct minstrel
|
||||
}
|
||||
|
||||
/* Assign new rate set per sta */
|
||||
- minstrel_ht_assign_best_tp_rates(mi, tmp_mcs_tp_rate, tmp_cck_tp_rate);
|
||||
+ minstrel_ht_assign_best_tp_rates(mi, tmp_mcs_tp_rate,
|
||||
+ tmp_legacy_tp_rate);
|
||||
memcpy(mi->max_tp_rate, tmp_mcs_tp_rate, sizeof(mi->max_tp_rate));
|
||||
|
||||
/* Try to increase robustness of max_prob_rate*/
|
||||
@@ -795,8 +860,11 @@ minstrel_ht_update_stats(struct minstrel
|
||||
}
|
||||
|
||||
static bool
|
||||
-minstrel_ht_txstat_valid(struct minstrel_priv *mp, struct ieee80211_tx_rate *rate)
|
||||
+minstrel_ht_txstat_valid(struct minstrel_priv *mp, struct minstrel_ht_sta *mi,
|
||||
+ struct ieee80211_tx_rate *rate)
|
||||
{
|
||||
+ int i;
|
||||
+
|
||||
if (rate->idx < 0)
|
||||
return false;
|
||||
|
||||
@@ -807,10 +875,15 @@ minstrel_ht_txstat_valid(struct minstrel
|
||||
rate->flags & IEEE80211_TX_RC_VHT_MCS)
|
||||
return true;
|
||||
|
||||
- return rate->idx == mp->cck_rates[0] ||
|
||||
- rate->idx == mp->cck_rates[1] ||
|
||||
- rate->idx == mp->cck_rates[2] ||
|
||||
- rate->idx == mp->cck_rates[3];
|
||||
+ for (i = 0; i < ARRAY_SIZE(mp->cck_rates); i++)
|
||||
+ if (rate->idx == mp->cck_rates[i])
|
||||
+ return true;
|
||||
+
|
||||
+ for (i = 0; i < ARRAY_SIZE(mp->ofdm_rates[0]); i++)
|
||||
+ if (rate->idx == mp->ofdm_rates[mi->band][i])
|
||||
+ return true;
|
||||
+
|
||||
+ return false;
|
||||
}
|
||||
|
||||
static void
|
||||
@@ -897,11 +970,6 @@ minstrel_ht_tx_status(void *priv, struct
|
||||
bool sample_status = false;
|
||||
int i;
|
||||
|
||||
- if (!msp->is_ht)
|
||||
- return mac80211_minstrel.tx_status_ext(priv, sband,
|
||||
- &msp->legacy, st);
|
||||
-
|
||||
-
|
||||
/* This packet was aggregated but doesn't carry status info */
|
||||
if ((info->flags & IEEE80211_TX_CTL_AMPDU) &&
|
||||
!(info->flags & IEEE80211_TX_STAT_AMPDU))
|
||||
@@ -930,10 +998,10 @@ minstrel_ht_tx_status(void *priv, struct
|
||||
if (mi->sample_mode != MINSTREL_SAMPLE_IDLE)
|
||||
rate_sample = minstrel_get_ratestats(mi, mi->sample_rate);
|
||||
|
||||
- last = !minstrel_ht_txstat_valid(mp, &ar[0]);
|
||||
+ last = !minstrel_ht_txstat_valid(mp, mi, &ar[0]);
|
||||
for (i = 0; !last; i++) {
|
||||
last = (i == IEEE80211_TX_MAX_RATES - 1) ||
|
||||
- !minstrel_ht_txstat_valid(mp, &ar[i + 1]);
|
||||
+ !minstrel_ht_txstat_valid(mp, mi, &ar[i + 1]);
|
||||
|
||||
rate = minstrel_ht_get_stats(mp, mi, &ar[i]);
|
||||
if (rate == rate_sample)
|
||||
@@ -1031,7 +1099,7 @@ minstrel_calc_retransmit(struct minstrel
|
||||
ctime += (t_slot * cw) >> 1;
|
||||
cw = min((cw << 1) | 1, mp->cw_max);
|
||||
|
||||
- if (index / MCS_GROUP_RATES == MINSTREL_CCK_GROUP) {
|
||||
+ if (minstrel_ht_is_legacy_group(index / MCS_GROUP_RATES)) {
|
||||
overhead = mi->overhead_legacy;
|
||||
overhead_rtscts = mi->overhead_legacy_rtscts;
|
||||
} else {
|
||||
@@ -1064,7 +1132,8 @@ static void
|
||||
minstrel_ht_set_rate(struct minstrel_priv *mp, struct minstrel_ht_sta *mi,
|
||||
struct ieee80211_sta_rates *ratetbl, int offset, int index)
|
||||
{
|
||||
- const struct mcs_group *group = &minstrel_mcs_groups[index / MCS_GROUP_RATES];
|
||||
+ int group_idx = index / MCS_GROUP_RATES;
|
||||
+ const struct mcs_group *group = &minstrel_mcs_groups[group_idx];
|
||||
struct minstrel_rate_stats *mrs;
|
||||
u8 idx;
|
||||
u16 flags = group->flags;
|
||||
@@ -1083,13 +1152,17 @@ minstrel_ht_set_rate(struct minstrel_pri
|
||||
ratetbl->rate[offset].count_rts = mrs->retry_count_rtscts;
|
||||
}
|
||||
|
||||
- if (index / MCS_GROUP_RATES == MINSTREL_CCK_GROUP)
|
||||
+ index %= MCS_GROUP_RATES;
|
||||
+ if (group_idx == MINSTREL_CCK_GROUP)
|
||||
idx = mp->cck_rates[index % ARRAY_SIZE(mp->cck_rates)];
|
||||
+ else if (group_idx == MINSTREL_OFDM_GROUP)
|
||||
+ idx = mp->ofdm_rates[mi->band][index %
|
||||
+ ARRAY_SIZE(mp->ofdm_rates[0])];
|
||||
else if (flags & IEEE80211_TX_RC_VHT_MCS)
|
||||
idx = ((group->streams - 1) << 4) |
|
||||
- ((index % MCS_GROUP_RATES) & 0xF);
|
||||
+ (index & 0xF);
|
||||
else
|
||||
- idx = index % MCS_GROUP_RATES + (group->streams - 1) * 8;
|
||||
+ idx = index + (group->streams - 1) * 8;
|
||||
|
||||
/* enable RTS/CTS if needed:
|
||||
* - if station is in dynamic SMPS (and streams > 1)
|
||||
@@ -1304,11 +1377,8 @@ minstrel_ht_get_rate(void *priv, struct
|
||||
struct minstrel_priv *mp = priv;
|
||||
int sample_idx;
|
||||
|
||||
- if (!msp->is_ht)
|
||||
- return mac80211_minstrel.get_rate(priv, sta, &msp->legacy, txrc);
|
||||
-
|
||||
if (!(info->flags & IEEE80211_TX_CTL_AMPDU) &&
|
||||
- mi->max_prob_rate / MCS_GROUP_RATES != MINSTREL_CCK_GROUP)
|
||||
+ !minstrel_ht_is_legacy_group(mi->max_prob_rate / MCS_GROUP_RATES))
|
||||
minstrel_aggr_check(sta, txrc->skb);
|
||||
|
||||
info->flags |= mi->tx_flags;
|
||||
@@ -1349,6 +1419,9 @@ minstrel_ht_get_rate(void *priv, struct
|
||||
if (sample_group == &minstrel_mcs_groups[MINSTREL_CCK_GROUP]) {
|
||||
int idx = sample_idx % ARRAY_SIZE(mp->cck_rates);
|
||||
rate->idx = mp->cck_rates[idx];
|
||||
+ } else if (sample_group == &minstrel_mcs_groups[MINSTREL_OFDM_GROUP]) {
|
||||
+ int idx = sample_idx % ARRAY_SIZE(mp->ofdm_rates[0]);
|
||||
+ rate->idx = mp->ofdm_rates[mi->band][idx];
|
||||
} else if (sample_group->flags & IEEE80211_TX_RC_VHT_MCS) {
|
||||
ieee80211_rate_set_vht(rate, sample_idx % MCS_GROUP_RATES,
|
||||
sample_group->streams);
|
||||
@@ -1369,11 +1442,13 @@ minstrel_ht_update_cck(struct minstrel_p
|
||||
if (sband->band != NL80211_BAND_2GHZ)
|
||||
return;
|
||||
|
||||
- if (!ieee80211_hw_check(mp->hw, SUPPORTS_HT_CCK_RATES))
|
||||
+ if (sta->ht_cap.ht_supported &&
|
||||
+ !ieee80211_hw_check(mp->hw, SUPPORTS_HT_CCK_RATES))
|
||||
return;
|
||||
|
||||
for (i = 0; i < 4; i++) {
|
||||
- if (!rate_supported(sta, sband->band, mp->cck_rates[i]))
|
||||
+ if (mp->cck_rates[i] == 0xff ||
|
||||
+ !rate_supported(sta, sband->band, mp->cck_rates[i]))
|
||||
continue;
|
||||
|
||||
mi->supported[MINSTREL_CCK_GROUP] |= BIT(i);
|
||||
@@ -1383,9 +1458,30 @@ minstrel_ht_update_cck(struct minstrel_p
|
||||
}
|
||||
|
||||
static void
|
||||
+minstrel_ht_update_ofdm(struct minstrel_priv *mp, struct minstrel_ht_sta *mi,
|
||||
+ struct ieee80211_supported_band *sband,
|
||||
+ struct ieee80211_sta *sta)
|
||||
+{
|
||||
+ const u8 *rates;
|
||||
+ int i;
|
||||
+
|
||||
+ if (sta->ht_cap.ht_supported)
|
||||
+ return;
|
||||
+
|
||||
+ rates = mp->ofdm_rates[sband->band];
|
||||
+ for (i = 0; i < ARRAY_SIZE(mp->ofdm_rates[0]); i++) {
|
||||
+ if (rates[i] == 0xff ||
|
||||
+ !rate_supported(sta, sband->band, rates[i]))
|
||||
+ continue;
|
||||
+
|
||||
+ mi->supported[MINSTREL_OFDM_GROUP] |= BIT(i);
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
+static void
|
||||
minstrel_ht_update_caps(void *priv, struct ieee80211_supported_band *sband,
|
||||
struct cfg80211_chan_def *chandef,
|
||||
- struct ieee80211_sta *sta, void *priv_sta)
|
||||
+ struct ieee80211_sta *sta, void *priv_sta)
|
||||
{
|
||||
struct minstrel_priv *mp = priv;
|
||||
struct minstrel_ht_sta_priv *msp = priv_sta;
|
||||
@@ -1401,10 +1497,6 @@ minstrel_ht_update_caps(void *priv, stru
|
||||
int stbc;
|
||||
int i;
|
||||
|
||||
- /* fall back to the old minstrel for legacy stations */
|
||||
- if (!sta->ht_cap.ht_supported)
|
||||
- goto use_legacy;
|
||||
-
|
||||
BUILD_BUG_ON(ARRAY_SIZE(minstrel_mcs_groups) != MINSTREL_GROUPS_NB);
|
||||
|
||||
if (vht_cap->vht_supported)
|
||||
@@ -1412,10 +1504,10 @@ minstrel_ht_update_caps(void *priv, stru
|
||||
else
|
||||
use_vht = 0;
|
||||
|
||||
- msp->is_ht = true;
|
||||
memset(mi, 0, sizeof(*mi));
|
||||
|
||||
mi->sta = sta;
|
||||
+ mi->band = sband->band;
|
||||
mi->last_stats_update = jiffies;
|
||||
|
||||
ack_dur = ieee80211_frame_duration(sband->band, 10, 60, 1, 1, 0);
|
||||
@@ -1464,10 +1556,8 @@ minstrel_ht_update_caps(void *priv, stru
|
||||
int bw, nss;
|
||||
|
||||
mi->supported[i] = 0;
|
||||
- if (i == MINSTREL_CCK_GROUP) {
|
||||
- minstrel_ht_update_cck(mp, mi, sband, sta);
|
||||
+ if (minstrel_ht_is_legacy_group(i))
|
||||
continue;
|
||||
- }
|
||||
|
||||
if (gflags & IEEE80211_TX_RC_SHORT_GI) {
|
||||
if (gflags & IEEE80211_TX_RC_40_MHZ_WIDTH) {
|
||||
@@ -1528,22 +1618,12 @@ minstrel_ht_update_caps(void *priv, stru
|
||||
n_supported++;
|
||||
}
|
||||
|
||||
- if (!n_supported)
|
||||
- goto use_legacy;
|
||||
+ minstrel_ht_update_cck(mp, mi, sband, sta);
|
||||
+ minstrel_ht_update_ofdm(mp, mi, sband, sta);
|
||||
|
||||
/* create an initial rate table with the lowest supported rates */
|
||||
minstrel_ht_update_stats(mp, mi, true);
|
||||
minstrel_ht_update_rates(mp, mi);
|
||||
-
|
||||
- return;
|
||||
-
|
||||
-use_legacy:
|
||||
- msp->is_ht = false;
|
||||
- memset(&msp->legacy, 0, sizeof(msp->legacy));
|
||||
- msp->legacy.r = msp->ratelist;
|
||||
- msp->legacy.sample_table = msp->sample_table;
|
||||
- return mac80211_minstrel.rate_init(priv, sband, chandef, sta,
|
||||
- &msp->legacy);
|
||||
}
|
||||
|
||||
static void
|
||||
@@ -1611,40 +1691,70 @@ minstrel_ht_free_sta(void *priv, struct
|
||||
}
|
||||
|
||||
static void
|
||||
-minstrel_ht_init_cck_rates(struct minstrel_priv *mp)
|
||||
+minstrel_ht_fill_rate_array(u8 *dest, struct ieee80211_supported_band *sband,
|
||||
+ const s16 *bitrates, int n_rates, u32 rate_flags)
|
||||
{
|
||||
- static const int bitrates[4] = { 10, 20, 55, 110 };
|
||||
- struct ieee80211_supported_band *sband;
|
||||
- u32 rate_flags = ieee80211_chandef_rate_flags(&mp->hw->conf.chandef);
|
||||
int i, j;
|
||||
|
||||
- sband = mp->hw->wiphy->bands[NL80211_BAND_2GHZ];
|
||||
- if (!sband)
|
||||
- return;
|
||||
-
|
||||
for (i = 0; i < sband->n_bitrates; i++) {
|
||||
struct ieee80211_rate *rate = &sband->bitrates[i];
|
||||
|
||||
- if (rate->flags & IEEE80211_RATE_ERP_G)
|
||||
- continue;
|
||||
-
|
||||
if ((rate_flags & sband->bitrates[i].flags) != rate_flags)
|
||||
continue;
|
||||
|
||||
- for (j = 0; j < ARRAY_SIZE(bitrates); j++) {
|
||||
+ for (j = 0; j < n_rates; j++) {
|
||||
if (rate->bitrate != bitrates[j])
|
||||
continue;
|
||||
|
||||
- mp->cck_rates[j] = i;
|
||||
+ dest[j] = i;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+static void
|
||||
+minstrel_ht_init_cck_rates(struct minstrel_priv *mp)
|
||||
+{
|
||||
+ static const s16 bitrates[4] = { 10, 20, 55, 110 };
|
||||
+ struct ieee80211_supported_band *sband;
|
||||
+ u32 rate_flags = ieee80211_chandef_rate_flags(&mp->hw->conf.chandef);
|
||||
+
|
||||
+ memset(mp->cck_rates, 0xff, sizeof(mp->cck_rates));
|
||||
+ sband = mp->hw->wiphy->bands[NL80211_BAND_2GHZ];
|
||||
+ if (!sband)
|
||||
+ return;
|
||||
+
|
||||
+ BUILD_BUG_ON(ARRAY_SIZE(mp->cck_rates) != ARRAY_SIZE(bitrates));
|
||||
+ minstrel_ht_fill_rate_array(mp->cck_rates, sband,
|
||||
+ minstrel_cck_bitrates,
|
||||
+ ARRAY_SIZE(minstrel_cck_bitrates),
|
||||
+ rate_flags);
|
||||
+}
|
||||
+
|
||||
+static void
|
||||
+minstrel_ht_init_ofdm_rates(struct minstrel_priv *mp, enum nl80211_band band)
|
||||
+{
|
||||
+ static const s16 bitrates[8] = { 60, 90, 120, 180, 240, 360, 480, 540 };
|
||||
+ struct ieee80211_supported_band *sband;
|
||||
+ u32 rate_flags = ieee80211_chandef_rate_flags(&mp->hw->conf.chandef);
|
||||
+
|
||||
+ memset(mp->ofdm_rates[band], 0xff, sizeof(mp->ofdm_rates[band]));
|
||||
+ sband = mp->hw->wiphy->bands[band];
|
||||
+ if (!sband)
|
||||
+ return;
|
||||
+
|
||||
+ BUILD_BUG_ON(ARRAY_SIZE(mp->ofdm_rates[band]) != ARRAY_SIZE(bitrates));
|
||||
+ minstrel_ht_fill_rate_array(mp->ofdm_rates[band], sband,
|
||||
+ minstrel_ofdm_bitrates,
|
||||
+ ARRAY_SIZE(minstrel_ofdm_bitrates),
|
||||
+ rate_flags);
|
||||
+}
|
||||
+
|
||||
static void *
|
||||
minstrel_ht_alloc(struct ieee80211_hw *hw)
|
||||
{
|
||||
struct minstrel_priv *mp;
|
||||
+ int i;
|
||||
|
||||
mp = kzalloc(sizeof(struct minstrel_priv), GFP_ATOMIC);
|
||||
if (!mp)
|
||||
@@ -1681,6 +1791,8 @@ minstrel_ht_alloc(struct ieee80211_hw *h
|
||||
mp->new_avg = true;
|
||||
|
||||
minstrel_ht_init_cck_rates(mp);
|
||||
+ for (i = 0; i < ARRAY_SIZE(mp->hw->wiphy->bands); i++)
|
||||
+ minstrel_ht_init_ofdm_rates(mp, i);
|
||||
|
||||
return mp;
|
||||
}
|
||||
@@ -1713,9 +1825,6 @@ static u32 minstrel_ht_get_expected_thro
|
||||
struct minstrel_ht_sta *mi = &msp->ht;
|
||||
int i, j, prob, tp_avg;
|
||||
|
||||
- if (!msp->is_ht)
|
||||
- return mac80211_minstrel.get_expected_throughput(priv_sta);
|
||||
-
|
||||
i = mi->max_tp_rate[0] / MCS_GROUP_RATES;
|
||||
j = mi->max_tp_rate[0] % MCS_GROUP_RATES;
|
||||
prob = mi->groups[i].rates[j].prob_avg;
|
||||
--- a/net/mac80211/rc80211_minstrel_ht.h
|
||||
+++ b/net/mac80211/rc80211_minstrel_ht.h
|
||||
@@ -18,14 +18,15 @@
|
||||
MINSTREL_HT_STREAM_GROUPS)
|
||||
#define MINSTREL_VHT_GROUPS_NB (MINSTREL_MAX_STREAMS * \
|
||||
MINSTREL_VHT_STREAM_GROUPS)
|
||||
-#define MINSTREL_CCK_GROUPS_NB 1
|
||||
+#define MINSTREL_LEGACY_GROUPS_NB 2
|
||||
#define MINSTREL_GROUPS_NB (MINSTREL_HT_GROUPS_NB + \
|
||||
MINSTREL_VHT_GROUPS_NB + \
|
||||
- MINSTREL_CCK_GROUPS_NB)
|
||||
+ MINSTREL_LEGACY_GROUPS_NB)
|
||||
|
||||
#define MINSTREL_HT_GROUP_0 0
|
||||
#define MINSTREL_CCK_GROUP (MINSTREL_HT_GROUP_0 + MINSTREL_HT_GROUPS_NB)
|
||||
-#define MINSTREL_VHT_GROUP_0 (MINSTREL_CCK_GROUP + 1)
|
||||
+#define MINSTREL_OFDM_GROUP (MINSTREL_CCK_GROUP + 1)
|
||||
+#define MINSTREL_VHT_GROUP_0 (MINSTREL_OFDM_GROUP + 1)
|
||||
|
||||
#define MCS_GROUP_RATES 10
|
||||
|
||||
@@ -37,6 +38,8 @@ struct mcs_group {
|
||||
u16 duration[MCS_GROUP_RATES];
|
||||
};
|
||||
|
||||
+extern const s16 minstrel_cck_bitrates[4];
|
||||
+extern const s16 minstrel_ofdm_bitrates[8];
|
||||
extern const struct mcs_group minstrel_mcs_groups[];
|
||||
|
||||
struct minstrel_mcs_group_data {
|
||||
@@ -99,6 +102,8 @@ struct minstrel_ht_sta {
|
||||
/* current MCS group to be sampled */
|
||||
u8 sample_group;
|
||||
|
||||
+ u8 band;
|
||||
+
|
||||
/* Bitfield of supported MCS rates of all groups */
|
||||
u16 supported[MINSTREL_GROUPS_NB];
|
||||
|
||||
@@ -107,13 +112,9 @@ struct minstrel_ht_sta {
|
||||
};
|
||||
|
||||
struct minstrel_ht_sta_priv {
|
||||
- union {
|
||||
- struct minstrel_ht_sta ht;
|
||||
- struct minstrel_sta_info legacy;
|
||||
- };
|
||||
+ struct minstrel_ht_sta ht;
|
||||
void *ratelist;
|
||||
void *sample_table;
|
||||
- bool is_ht;
|
||||
};
|
||||
|
||||
void minstrel_ht_add_sta_debugfs(void *priv, void *priv_sta, struct dentry *dir);
|
||||
--- a/net/mac80211/rc80211_minstrel_ht_debugfs.c
|
||||
+++ b/net/mac80211/rc80211_minstrel_ht_debugfs.c
|
||||
@@ -52,7 +52,6 @@ minstrel_ht_stats_dump(struct minstrel_h
|
||||
|
||||
for (j = 0; j < MCS_GROUP_RATES; j++) {
|
||||
struct minstrel_rate_stats *mrs = &mi->groups[i].rates[j];
|
||||
- static const int bitrates[4] = { 10, 20, 55, 110 };
|
||||
int idx = i * MCS_GROUP_RATES + j;
|
||||
unsigned int duration;
|
||||
|
||||
@@ -67,6 +66,9 @@ minstrel_ht_stats_dump(struct minstrel_h
|
||||
p += sprintf(p, "VHT%c0 ", htmode);
|
||||
p += sprintf(p, "%cGI ", gimode);
|
||||
p += sprintf(p, "%d ", mg->streams);
|
||||
+ } else if (i == MINSTREL_OFDM_GROUP) {
|
||||
+ p += sprintf(p, "OFDM ");
|
||||
+ p += sprintf(p, "1 ");
|
||||
} else {
|
||||
p += sprintf(p, "CCK ");
|
||||
p += sprintf(p, "%cP ", j < 4 ? 'L' : 'S');
|
||||
@@ -84,7 +86,12 @@ minstrel_ht_stats_dump(struct minstrel_h
|
||||
} else if (gflags & IEEE80211_TX_RC_VHT_MCS) {
|
||||
p += sprintf(p, " MCS%-1u/%1u", j, mg->streams);
|
||||
} else {
|
||||
- int r = bitrates[j % 4];
|
||||
+ int r;
|
||||
+
|
||||
+ if (i == MINSTREL_OFDM_GROUP)
|
||||
+ r = minstrel_ofdm_bitrates[j % 8];
|
||||
+ else
|
||||
+ r = minstrel_cck_bitrates[j % 4];
|
||||
|
||||
p += sprintf(p, " %2u.%1uM", r / 10, r % 10);
|
||||
}
|
||||
@@ -124,16 +131,8 @@ minstrel_ht_stats_open(struct inode *ino
|
||||
struct minstrel_ht_sta *mi = &msp->ht;
|
||||
struct minstrel_debugfs_info *ms;
|
||||
unsigned int i;
|
||||
- int ret;
|
||||
char *p;
|
||||
|
||||
- if (!msp->is_ht) {
|
||||
- inode->i_private = &msp->legacy;
|
||||
- ret = minstrel_stats_open(inode, file);
|
||||
- inode->i_private = msp;
|
||||
- return ret;
|
||||
- }
|
||||
-
|
||||
ms = kmalloc(32768, GFP_KERNEL);
|
||||
if (!ms)
|
||||
return -ENOMEM;
|
||||
@@ -199,7 +198,6 @@ minstrel_ht_stats_csv_dump(struct minstr
|
||||
|
||||
for (j = 0; j < MCS_GROUP_RATES; j++) {
|
||||
struct minstrel_rate_stats *mrs = &mi->groups[i].rates[j];
|
||||
- static const int bitrates[4] = { 10, 20, 55, 110 };
|
||||
int idx = i * MCS_GROUP_RATES + j;
|
||||
unsigned int duration;
|
||||
|
||||
@@ -214,6 +212,8 @@ minstrel_ht_stats_csv_dump(struct minstr
|
||||
p += sprintf(p, "VHT%c0,", htmode);
|
||||
p += sprintf(p, "%cGI,", gimode);
|
||||
p += sprintf(p, "%d,", mg->streams);
|
||||
+ } else if (i == MINSTREL_OFDM_GROUP) {
|
||||
+ p += sprintf(p, "OFDM,,1,");
|
||||
} else {
|
||||
p += sprintf(p, "CCK,");
|
||||
p += sprintf(p, "%cP,", j < 4 ? 'L' : 'S');
|
||||
@@ -231,7 +231,13 @@ minstrel_ht_stats_csv_dump(struct minstr
|
||||
} else if (gflags & IEEE80211_TX_RC_VHT_MCS) {
|
||||
p += sprintf(p, ",MCS%-1u/%1u,", j, mg->streams);
|
||||
} else {
|
||||
- int r = bitrates[j % 4];
|
||||
+ int r;
|
||||
+
|
||||
+ if (i == MINSTREL_OFDM_GROUP)
|
||||
+ r = minstrel_ofdm_bitrates[j % 8];
|
||||
+ else
|
||||
+ r = minstrel_cck_bitrates[j % 4];
|
||||
+
|
||||
p += sprintf(p, ",%2u.%1uM,", r / 10, r % 10);
|
||||
}
|
||||
|
||||
@@ -274,18 +280,9 @@ minstrel_ht_stats_csv_open(struct inode
|
||||
struct minstrel_ht_sta *mi = &msp->ht;
|
||||
struct minstrel_debugfs_info *ms;
|
||||
unsigned int i;
|
||||
- int ret;
|
||||
char *p;
|
||||
|
||||
- if (!msp->is_ht) {
|
||||
- inode->i_private = &msp->legacy;
|
||||
- ret = minstrel_stats_csv_open(inode, file);
|
||||
- inode->i_private = msp;
|
||||
- return ret;
|
||||
- }
|
||||
-
|
||||
ms = kmalloc(32768, GFP_KERNEL);
|
||||
-
|
||||
if (!ms)
|
||||
return -ENOMEM;
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@ -1,96 +0,0 @@
|
||||
From: Felix Fietkau <nbd@nbd.name>
|
||||
Date: Sat, 26 Dec 2020 14:34:30 +0100
|
||||
Subject: [PATCH] mac80211: minstrel_ht: remove old ewma based rate average
|
||||
code
|
||||
|
||||
The new noise filter has been the default for a while now with no reported
|
||||
downside and significant improvement compared to the old code.
|
||||
|
||||
Signed-off-by: Felix Fietkau <nbd@nbd.name>
|
||||
---
|
||||
|
||||
--- a/net/mac80211/rc80211_minstrel_ht.c
|
||||
+++ b/net/mac80211/rc80211_minstrel_ht.c
|
||||
@@ -769,17 +769,8 @@ minstrel_ht_calc_rate_stats(struct minst
|
||||
if (unlikely(mrs->attempts > 0)) {
|
||||
mrs->sample_skipped = 0;
|
||||
cur_prob = MINSTREL_FRAC(mrs->success, mrs->attempts);
|
||||
- if (mp->new_avg) {
|
||||
- minstrel_filter_avg_add(&mrs->prob_avg,
|
||||
- &mrs->prob_avg_1, cur_prob);
|
||||
- } else if (unlikely(!mrs->att_hist)) {
|
||||
- mrs->prob_avg = cur_prob;
|
||||
- } else {
|
||||
- /*update exponential weighted moving avarage */
|
||||
- mrs->prob_avg = minstrel_ewma(mrs->prob_avg,
|
||||
- cur_prob,
|
||||
- EWMA_LEVEL);
|
||||
- }
|
||||
+ minstrel_filter_avg_add(&mrs->prob_avg,
|
||||
+ &mrs->prob_avg_1, cur_prob);
|
||||
mrs->att_hist += mrs->attempts;
|
||||
mrs->succ_hist += mrs->success;
|
||||
} else {
|
||||
@@ -913,10 +904,8 @@ minstrel_ht_update_stats(struct minstrel
|
||||
/* Try to increase robustness of max_prob_rate*/
|
||||
minstrel_ht_prob_rate_reduce_streams(mi);
|
||||
|
||||
- /* try to sample all available rates during each interval */
|
||||
- mi->sample_count *= 8;
|
||||
- if (mp->new_avg)
|
||||
- mi->sample_count /= 2;
|
||||
+ /* try to sample half of all available rates during each interval */
|
||||
+ mi->sample_count *= 4;
|
||||
|
||||
if (sample)
|
||||
minstrel_ht_rate_sample_switch(mp, mi);
|
||||
@@ -1040,7 +1029,7 @@ minstrel_ht_tx_status(void *priv, struct
|
||||
struct ieee80211_tx_rate *ar = info->status.rates;
|
||||
struct minstrel_rate_stats *rate, *rate2, *rate_sample = NULL;
|
||||
struct minstrel_priv *mp = priv;
|
||||
- u32 update_interval = mp->update_interval / 2;
|
||||
+ u32 update_interval = mp->update_interval;
|
||||
bool last, update = false;
|
||||
bool sample_status = false;
|
||||
int i;
|
||||
@@ -1090,9 +1079,8 @@ minstrel_ht_tx_status(void *priv, struct
|
||||
|
||||
switch (mi->sample_mode) {
|
||||
case MINSTREL_SAMPLE_IDLE:
|
||||
- if (mp->new_avg &&
|
||||
- (mp->hw->max_rates > 1 ||
|
||||
- mi->total_packets_cur < SAMPLE_SWITCH_THR))
|
||||
+ if (mp->hw->max_rates > 1 ||
|
||||
+ mi->total_packets_cur < SAMPLE_SWITCH_THR)
|
||||
update_interval /= 2;
|
||||
break;
|
||||
|
||||
@@ -1832,8 +1820,7 @@ minstrel_ht_alloc(struct ieee80211_hw *h
|
||||
mp->has_mrr = true;
|
||||
|
||||
mp->hw = hw;
|
||||
- mp->update_interval = HZ / 10;
|
||||
- mp->new_avg = true;
|
||||
+ mp->update_interval = HZ / 20;
|
||||
|
||||
minstrel_ht_init_cck_rates(mp);
|
||||
for (i = 0; i < ARRAY_SIZE(mp->hw->wiphy->bands); i++)
|
||||
@@ -1853,8 +1840,6 @@ static void minstrel_ht_add_debugfs(stru
|
||||
&mp->fixed_rate_idx);
|
||||
debugfs_create_u32("sample_switch", S_IRUGO | S_IWUSR, debugfsdir,
|
||||
&mp->sample_switch);
|
||||
- debugfs_create_bool("new_avg", S_IRUGO | S_IWUSR, debugfsdir,
|
||||
- &mp->new_avg);
|
||||
}
|
||||
#endif
|
||||
|
||||
--- a/net/mac80211/rc80211_minstrel_ht.h
|
||||
+++ b/net/mac80211/rc80211_minstrel_ht.h
|
||||
@@ -60,7 +60,6 @@
|
||||
struct minstrel_priv {
|
||||
struct ieee80211_hw *hw;
|
||||
bool has_mrr;
|
||||
- bool new_avg;
|
||||
u32 sample_switch;
|
||||
unsigned int cw_min;
|
||||
unsigned int cw_max;
|
||||
@ -1,67 +0,0 @@
|
||||
From: Felix Fietkau <nbd@nbd.name>
|
||||
Date: Sat, 26 Dec 2020 19:08:19 +0100
|
||||
Subject: [PATCH] mac80211: minstrel_ht: improve ampdu length estimation
|
||||
|
||||
If the driver does not report A-MPDU length, estimate it based on the rate.
|
||||
|
||||
Signed-off-by: Felix Fietkau <nbd@nbd.name>
|
||||
---
|
||||
|
||||
--- a/net/mac80211/rc80211_minstrel_ht.c
|
||||
+++ b/net/mac80211/rc80211_minstrel_ht.c
|
||||
@@ -382,13 +382,37 @@ minstrel_get_ratestats(struct minstrel_h
|
||||
return &mi->groups[index / MCS_GROUP_RATES].rates[index % MCS_GROUP_RATES];
|
||||
}
|
||||
|
||||
+static inline int
|
||||
+minstrel_get_duration(int index)
|
||||
+{
|
||||
+ const struct mcs_group *group = &minstrel_mcs_groups[index / MCS_GROUP_RATES];
|
||||
+ unsigned int duration = group->duration[index % MCS_GROUP_RATES];
|
||||
+ return duration << group->shift;
|
||||
+}
|
||||
+
|
||||
static unsigned int
|
||||
minstrel_ht_avg_ampdu_len(struct minstrel_ht_sta *mi)
|
||||
{
|
||||
- if (!mi->avg_ampdu_len)
|
||||
- return AVG_AMPDU_SIZE;
|
||||
+ int duration;
|
||||
+
|
||||
+ if (mi->avg_ampdu_len)
|
||||
+ return MINSTREL_TRUNC(mi->avg_ampdu_len);
|
||||
+
|
||||
+ if (minstrel_ht_is_legacy_group(mi->max_tp_rate[0] / MCS_GROUP_RATES))
|
||||
+ return 1;
|
||||
+
|
||||
+ duration = minstrel_get_duration(mi->max_tp_rate[0]);
|
||||
|
||||
- return MINSTREL_TRUNC(mi->avg_ampdu_len);
|
||||
+ if (duration > 400 * 1000)
|
||||
+ return 2;
|
||||
+
|
||||
+ if (duration > 250 * 1000)
|
||||
+ return 4;
|
||||
+
|
||||
+ if (duration > 150 * 1000)
|
||||
+ return 8;
|
||||
+
|
||||
+ return 16;
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -588,14 +612,6 @@ minstrel_ht_prob_rate_reduce_streams(str
|
||||
}
|
||||
}
|
||||
|
||||
-static inline int
|
||||
-minstrel_get_duration(int index)
|
||||
-{
|
||||
- const struct mcs_group *group = &minstrel_mcs_groups[index / MCS_GROUP_RATES];
|
||||
- unsigned int duration = group->duration[index % MCS_GROUP_RATES];
|
||||
- return duration << group->shift;
|
||||
-}
|
||||
-
|
||||
static bool
|
||||
minstrel_ht_probe_group(struct minstrel_ht_sta *mi, const struct mcs_group *tp_group,
|
||||
int tp_idx, const struct mcs_group *group)
|
||||
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user