Merge Official Source
Signed-off-by: Tianling Shen <cnsztl@immortalwrt.org>
This commit is contained in:
commit
be47fc826a
@ -232,6 +232,7 @@ define Build/fit
|
||||
-i $(KERNEL_BUILD_DIR)/initrd.cpio$(strip $(call Build/initrd_compression)))) \
|
||||
-a $(KERNEL_LOADADDR) -e $(if $(KERNEL_ENTRY),$(KERNEL_ENTRY),$(KERNEL_LOADADDR)) \
|
||||
$(if $(DEVICE_FDT_NUM),-n $(DEVICE_FDT_NUM)) \
|
||||
$(if $(DEVICE_DTS_DELIMITER),-l $(DEVICE_DTS_DELIMITER)) \
|
||||
$(if $(DEVICE_DTS_OVERLAY),$(foreach dtso,$(DEVICE_DTS_OVERLAY), -O $(dtso):$(KERNEL_BUILD_DIR)/image-$(dtso).dtb)) \
|
||||
-c $(if $(DEVICE_DTS_CONFIG),$(DEVICE_DTS_CONFIG),"config-1") \
|
||||
-A $(LINUX_KARCH) -v $(LINUX_VERSION)
|
||||
|
||||
@ -150,37 +150,38 @@ define Package/base-files/install
|
||||
|
||||
$(VERSION_SED_SCRIPT) \
|
||||
$(1)/etc/banner \
|
||||
$(1)/etc/device_info \
|
||||
$(1)/etc/openwrt_release \
|
||||
$(1)/etc/openwrt_version \
|
||||
$(1)/usr/lib/os-release
|
||||
|
||||
$(VERSION_SED_SCRIPT) \
|
||||
$(1)/etc/openwrt_release \
|
||||
$(1)/etc/device_info \
|
||||
$(1)/usr/lib/os-release
|
||||
|
||||
$(SED) "s#%PATH%#$(TARGET_INIT_PATH)#g" \
|
||||
$(1)/sbin/hotplug-call \
|
||||
$(1)/etc/preinit \
|
||||
$(1)/etc/profile
|
||||
|
||||
mkdir -p $(1)/CONTROL
|
||||
mkdir -p $(1)/dev
|
||||
mkdir -p $(1)/etc/config
|
||||
mkdir -p $(1)/etc/crontabs
|
||||
mkdir -p $(1)/etc/rc.d
|
||||
mkdir -p $(1)/overlay
|
||||
mkdir -p $(1)/lib/firmware
|
||||
$(if $(LIB_SUFFIX),-$(LN) lib $(1)/lib$(LIB_SUFFIX))
|
||||
mkdir -p $(1)/mnt
|
||||
mkdir -p $(1)/proc
|
||||
mkdir -p $(1)/tmp
|
||||
mkdir -p $(1)/usr/lib
|
||||
$(if $(LIB_SUFFIX),-$(LN) lib $(1)/usr/lib$(LIB_SUFFIX))
|
||||
mkdir -p $(1)/usr/bin
|
||||
mkdir -p $(1)/sys
|
||||
mkdir -p $(1)/www
|
||||
mkdir -p $(1)/root
|
||||
mkdir -p \
|
||||
$(1)/CONTROL \
|
||||
$(1)/dev \
|
||||
$(1)/etc/config \
|
||||
$(1)/etc/crontabs \
|
||||
$(1)/etc/rc.d \
|
||||
$(1)/overlay \
|
||||
$(1)/lib/firmware \
|
||||
$(1)/mnt \
|
||||
$(1)/proc \
|
||||
$(1)/tmp \
|
||||
$(1)/usr/lib \
|
||||
$(1)/usr/bin \
|
||||
$(1)/sys \
|
||||
$(1)/www \
|
||||
$(1)/root
|
||||
|
||||
$(LN) /proc/mounts $(1)/etc/mtab
|
||||
$(if $(LIB_SUFFIX),-$(LN) lib $(1)/lib$(LIB_SUFFIX))
|
||||
$(if $(LIB_SUFFIX),-$(LN) lib $(1)/usr/lib$(LIB_SUFFIX))
|
||||
|
||||
ifneq ($(CONFIG_TARGET_ROOTFS_PERSIST_VAR),y)
|
||||
rm -f $(1)/var
|
||||
$(LN) tmp $(1)/var
|
||||
@ -188,7 +189,6 @@ else
|
||||
mkdir -p $(1)/var
|
||||
$(LN) /tmp/run $(1)/var/run
|
||||
endif
|
||||
mkdir -p $(1)/etc
|
||||
$(LN) /tmp/resolv.conf /tmp/TZ /tmp/localtime $(1)/etc/
|
||||
|
||||
chmod 0600 $(1)/etc/shadow
|
||||
|
||||
@ -8,13 +8,13 @@
|
||||
include $(TOPDIR)/rules.mk
|
||||
|
||||
PKG_NAME:=tfa-layerscape
|
||||
PKG_VERSION:=LSDK-20.04-update-290520
|
||||
PKG_VERSION:=LSDK-20.12
|
||||
PKG_RELEASE:=$(AUTORELEASE)
|
||||
|
||||
PKG_SOURCE_PROTO:=git
|
||||
PKG_SOURCE_URL:=https://source.codeaurora.org/external/qoriq/qoriq-components/atf
|
||||
PKG_SOURCE_VERSION:=7d748e6f0ec652ba7c43733dc67a3d0b0217390a
|
||||
PKG_MIRROR_HASH:=d209c9ad18aac9f18375450b98b8dab00f0382ccb485df14623bf9b72ea1dd9b
|
||||
PKG_SOURCE_VERSION:=LSDK-20.12
|
||||
PKG_MIRROR_HASH:=8e3a0bd33c00657beeb2df88a881b1831aeb790751cacd4c4fdf33ffa01e956e
|
||||
PKG_BUILD_DEPENDS:=tfa-layerscape/host
|
||||
|
||||
include $(INCLUDE_DIR)/host-build.mk
|
||||
|
||||
@ -11,8 +11,6 @@ Signed-off-by: Biwen Li <biwen.li@nxp.com>
|
||||
plat/nxp/tools/pbl_ch3.mk | 5 -----
|
||||
2 files changed, 8 deletions(-)
|
||||
|
||||
diff --git a/plat/nxp/tools/pbl_ch2.mk b/plat/nxp/tools/pbl_ch2.mk
|
||||
index afa43520..ff624dd9 100644
|
||||
--- a/plat/nxp/tools/pbl_ch2.mk
|
||||
+++ b/plat/nxp/tools/pbl_ch2.mk
|
||||
@@ -20,8 +20,6 @@ ifeq ($(RCW),"")
|
||||
@ -32,8 +30,6 @@ index afa43520..ff624dd9 100644
|
||||
${CREATE_PBL} -r ${RCW} -i ${BUILD_PLAT}/bl2.bin -b ${BOOT_MODE} -c ${SOC_NUM} -d ${BL2_BASE} -e ${BL2_BASE} \
|
||||
-o ${BUILD_PLAT}/bl2_${BOOT_MODE}.pbl ;
|
||||
# Swapping of RCW is required for QSPi Chassis 2 devices
|
||||
diff --git a/plat/nxp/tools/pbl_ch3.mk b/plat/nxp/tools/pbl_ch3.mk
|
||||
index 944ae3bb..9aa8f635 100644
|
||||
--- a/plat/nxp/tools/pbl_ch3.mk
|
||||
+++ b/plat/nxp/tools/pbl_ch3.mk
|
||||
@@ -27,9 +27,6 @@ else
|
||||
@ -55,6 +51,3 @@ index 944ae3bb..9aa8f635 100644
|
||||
# Add Block Copy command and populate boot loc ptrfor bl2.bin to RCW
|
||||
${CREATE_PBL} -r ${RCW} -i ${BUILD_PLAT}/bl2.bin -b ${BOOT_MODE} -c ${SOC_NUM} -d ${BL2_BASE} -e ${BL2_BASE} \
|
||||
-o ${BUILD_PLAT}/bl2_${BOOT_MODE}.pbl -f ${BL2_SRC_OFFSET};
|
||||
--
|
||||
2.17.1
|
||||
|
||||
|
||||
20
package/boot/tfa-layerscape/patches/010-gcc11.patch
Normal file
20
package/boot/tfa-layerscape/patches/010-gcc11.patch
Normal file
@ -0,0 +1,20 @@
|
||||
--- a/common/runtime_svc.c
|
||||
+++ b/common/runtime_svc.c
|
||||
@@ -38,7 +38,7 @@ uintptr_t handle_runtime_svc(uint32_t smc_fid,
|
||||
u_register_t x1, x2, x3, x4;
|
||||
int index;
|
||||
unsigned int idx;
|
||||
- const rt_svc_desc_t *rt_svc_descs;
|
||||
+ rt_svc_desc_t *rt_svc_descs = NULL;
|
||||
|
||||
assert(handle);
|
||||
idx = get_unique_oen_from_smc_fid(smc_fid);
|
||||
@@ -48,7 +48,7 @@ uintptr_t handle_runtime_svc(uint32_t smc_fid,
|
||||
if (index < 0 || index >= (int)RT_SVC_DECS_NUM)
|
||||
SMC_RET1(handle, SMC_UNK);
|
||||
|
||||
- rt_svc_descs = (rt_svc_desc_t *) RT_SVC_DESCS_START;
|
||||
+ memcpy(rt_svc_descs, (rt_svc_desc_t *)RT_SVC_DESCS_START, MAX_RT_SVCS);
|
||||
|
||||
get_smc_params_from_ctx(handle, x1, x2, x3, x4);
|
||||
|
||||
Binary file not shown.
@ -10,10 +10,10 @@ include $(INCLUDE_DIR)/kernel.mk
|
||||
|
||||
PKG_NAME:=mac80211
|
||||
|
||||
PKG_VERSION:=5.10.42-1
|
||||
PKG_VERSION:=5.10.68-1
|
||||
PKG_RELEASE:=1
|
||||
PKG_SOURCE_URL:=@KERNEL/linux/kernel/projects/backports/stable/v5.10.42/
|
||||
PKG_HASH:=6876520105240844fdb32d1dcdf2bfdea291a37a96f16c892fda3776ba714fcb
|
||||
PKG_SOURCE_URL:=@KERNEL/linux/kernel/projects/backports/stable/v5.10.68/
|
||||
PKG_HASH:=bba161b0084590c677a84b80993709e388a3c478f29ed0c475d4fce1b9162968
|
||||
|
||||
PKG_SOURCE:=backports-$(PKG_VERSION).tar.xz
|
||||
PKG_BUILD_DIR:=$(KERNEL_BUILD_DIR)/backports-$(PKG_VERSION)
|
||||
|
||||
@ -14,7 +14,7 @@
|
||||
CFLAGS_trace.o := -I$(src)
|
||||
--- a/drivers/net/wireless/ath/ath.h
|
||||
+++ b/drivers/net/wireless/ath/ath.h
|
||||
@@ -316,14 +316,7 @@ void _ath_dbg(struct ath_common *common,
|
||||
@@ -317,14 +317,7 @@ void _ath_dbg(struct ath_common *common,
|
||||
#endif /* CPTCFG_ATH_DEBUG */
|
||||
|
||||
/** Returns string describing opmode, or NULL if unknown mode. */
|
||||
|
||||
@ -82,7 +82,7 @@
|
||||
help
|
||||
--- a/local-symbols
|
||||
+++ b/local-symbols
|
||||
@@ -86,6 +86,7 @@ ADM8211=
|
||||
@@ -85,6 +85,7 @@ ADM8211=
|
||||
ATH_COMMON=
|
||||
WLAN_VENDOR_ATH=
|
||||
ATH_DEBUG=
|
||||
|
||||
@ -37,7 +37,7 @@
|
||||
void ath10k_thermal_event_temperature(struct ath10k *ar, int temperature);
|
||||
--- a/local-symbols
|
||||
+++ b/local-symbols
|
||||
@@ -145,6 +145,7 @@ ATH10K_SNOC=
|
||||
@@ -144,6 +144,7 @@ ATH10K_SNOC=
|
||||
ATH10K_DEBUG=
|
||||
ATH10K_DEBUGFS=
|
||||
ATH10K_SPECTRAL=
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
--- a/drivers/net/wireless/ath/ath10k/mac.c
|
||||
+++ b/drivers/net/wireless/ath/ath10k/mac.c
|
||||
@@ -9708,6 +9708,21 @@ static int ath10k_mac_init_rd(struct ath
|
||||
@@ -9709,6 +9709,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[] = {
|
||||
@@ -10057,6 +10072,12 @@ int ath10k_mac_register(struct ath10k *a
|
||||
@@ -10058,6 +10073,12 @@ int ath10k_mac_register(struct ath10k *a
|
||||
|
||||
ar->hw->weight_multiplier = ATH10K_AIRTIME_WEIGHT_MULTIPLIER;
|
||||
|
||||
|
||||
@ -114,7 +114,7 @@ v13:
|
||||
ath10k_core-$(CONFIG_DEV_COREDUMP) += coredump.o
|
||||
--- a/local-symbols
|
||||
+++ b/local-symbols
|
||||
@@ -146,6 +146,7 @@ ATH10K_DEBUG=
|
||||
@@ -145,6 +145,7 @@ ATH10K_DEBUG=
|
||||
ATH10K_DEBUGFS=
|
||||
ATH10K_SPECTRAL=
|
||||
ATH10K_THERMAL=
|
||||
|
||||
@ -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
|
||||
@@ -10074,7 +10074,7 @@ int ath10k_mac_register(struct ath10k *a
|
||||
@@ -10075,7 +10075,7 @@ int ath10k_mac_register(struct ath10k *a
|
||||
ar->hw->weight_multiplier = ATH10K_AIRTIME_WEIGHT_MULTIPLIER;
|
||||
|
||||
#ifdef CPTCFG_MAC80211_LEDS
|
||||
|
||||
@ -16,8 +16,6 @@ Signed-off-by: Ansuel Smith <ansuelsmth@gmail.com>
|
||||
drivers/net/wireless/ath/ath10k/core.c | 10 ++++++++++
|
||||
1 file changed, 10 insertions(+)
|
||||
|
||||
diff --git a/drivers/net/wireless/ath/ath10k/core.c b/drivers/net/wireless/ath/ath10k/core.c
|
||||
index 5f4e12196..9ed7b9883 100644
|
||||
--- a/drivers/net/wireless/ath/ath10k/core.c
|
||||
+++ b/drivers/net/wireless/ath/ath10k/core.c
|
||||
@@ -8,6 +8,7 @@
|
||||
@ -28,7 +26,7 @@ index 5f4e12196..9ed7b9883 100644
|
||||
#include <linux/property.h>
|
||||
#include <linux/dmi.h>
|
||||
#include <linux/ctype.h>
|
||||
@@ -3062,6 +3068,8 @@ static int ath10k_core_probe_fw(struct ath10k *ar)
|
||||
@@ -3080,6 +3081,8 @@ static int ath10k_core_probe_fw(struct a
|
||||
|
||||
device_get_mac_address(ar->dev, ar->mac_addr, sizeof(ar->mac_addr));
|
||||
|
||||
@ -37,6 +35,3 @@ index 5f4e12196..9ed7b9883 100644
|
||||
ret = ath10k_core_init_firmware_features(ar);
|
||||
if (ret) {
|
||||
ath10k_err(ar, "fatal problem with firmware features: %d\n",
|
||||
--
|
||||
2.27.0
|
||||
|
||||
|
||||
@ -8,7 +8,7 @@ This reverts commit 71f5137bf010c6faffab50c0ec15374c59c4a411.
|
||||
|
||||
--- a/drivers/net/wireless/ath/ath9k/hw.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/hw.c
|
||||
@@ -2977,7 +2977,8 @@ void ath9k_hw_apply_txpower(struct ath_h
|
||||
@@ -2979,7 +2979,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)
|
||||
@@ -2989,9 +2990,14 @@ void ath9k_hw_apply_txpower(struct ath_h
|
||||
@@ -2991,9 +2992,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
|
||||
@@ -2996,6 +2996,10 @@ void ath9k_hw_apply_txpower(struct ath_h
|
||||
@@ -2998,6 +2998,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
|
||||
@@ -830,6 +830,7 @@ static const struct ieee80211_iface_limi
|
||||
@@ -827,6 +827,7 @@ static const struct ieee80211_iface_limi
|
||||
BIT(NL80211_IFTYPE_AP) },
|
||||
{ .max = 1, .types = BIT(NL80211_IFTYPE_P2P_CLIENT) |
|
||||
BIT(NL80211_IFTYPE_P2P_GO) },
|
||||
|
||||
@ -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
|
||||
@@ -927,6 +927,7 @@ static void ath9k_set_hw_capab(struct at
|
||||
@@ -924,6 +924,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);
|
||||
@@ -939,9 +940,6 @@ static void ath9k_set_hw_capab(struct at
|
||||
@@ -936,9 +937,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
|
||||
@@ -1143,25 +1143,25 @@ static int __init ath9k_init(void)
|
||||
@@ -1140,25 +1140,25 @@ static int __init ath9k_init(void)
|
||||
{
|
||||
int error;
|
||||
|
||||
|
||||
@ -181,7 +181,7 @@
|
||||
|
||||
--- a/drivers/net/wireless/ath/ath9k/init.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/init.c
|
||||
@@ -1055,7 +1055,7 @@ int ath9k_init_device(u16 devid, struct
|
||||
@@ -1052,7 +1052,7 @@ int ath9k_init_device(u16 devid, struct
|
||||
|
||||
#ifdef CPTCFG_MAC80211_LEDS
|
||||
/* must be initialized before ieee80211_register_hw */
|
||||
|
||||
@ -84,7 +84,7 @@
|
||||
bool reset_power_on;
|
||||
bool htc_reset_init;
|
||||
|
||||
@@ -1076,6 +1084,7 @@ void ath9k_hw_check_nav(struct ath_hw *a
|
||||
@@ -1077,6 +1085,7 @@ void ath9k_hw_check_nav(struct ath_hw *a
|
||||
bool ath9k_hw_check_alive(struct ath_hw *ah);
|
||||
|
||||
bool ath9k_hw_setpower(struct ath_hw *ah, enum ath9k_power_mode mode);
|
||||
@ -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
|
||||
@@ -1883,6 +1883,20 @@ u32 ath9k_hw_get_tsf_offset(struct times
|
||||
@@ -1882,6 +1882,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)
|
||||
{
|
||||
@@ -2091,6 +2105,7 @@ int ath9k_hw_reset(struct ath_hw *ah, st
|
||||
@@ -2090,6 +2104,7 @@ int ath9k_hw_reset(struct ath_hw *ah, st
|
||||
ar9003_hw_disable_phy_restart(ah);
|
||||
|
||||
ath9k_hw_apply_gpio_override(ah);
|
||||
@ -125,7 +125,7 @@
|
||||
REG_SET_BIT(ah, AR_BTCOEX_WL_LNADIV, AR_BTCOEX_WL_LNADIV_FORCE_ON);
|
||||
--- a/drivers/net/wireless/ath/ath9k/main.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/main.c
|
||||
@@ -531,6 +531,11 @@ irqreturn_t ath_isr(int irq, void *dev)
|
||||
@@ -536,6 +536,11 @@ irqreturn_t ath_isr(int irq, void *dev)
|
||||
if (test_bit(ATH_OP_HW_RESET, &common->op_flags))
|
||||
return IRQ_HANDLED;
|
||||
|
||||
|
||||
@ -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
|
||||
@@ -818,7 +818,8 @@ static void ath9k_init_txpower_limits(st
|
||||
@@ -815,7 +815,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[] = {
|
||||
@@ -1015,6 +1016,18 @@ static void ath9k_set_hw_capab(struct at
|
||||
@@ -1012,6 +1013,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)
|
||||
{
|
||||
@@ -1060,6 +1073,8 @@ int ath9k_init_device(u16 devid, struct
|
||||
@@ -1057,6 +1070,8 @@ int ath9k_init_device(u16 devid, struct
|
||||
ARRAY_SIZE(ath9k_tpt_blink));
|
||||
#endif
|
||||
|
||||
|
||||
@ -40,7 +40,7 @@
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -1861,8 +1880,14 @@ static int ath9k_hw_do_fastcc(struct ath
|
||||
@@ -1860,8 +1879,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;
|
||||
}
|
||||
|
||||
@@ -2116,6 +2141,9 @@ int ath9k_hw_reset(struct ath_hw *ah, st
|
||||
@@ -2115,6 +2140,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/init.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/init.c
|
||||
@@ -627,6 +627,12 @@ static int ath9k_of_init(struct ath_soft
|
||||
@@ -626,6 +626,12 @@ static int ath9k_of_init(struct ath_soft
|
||||
|
||||
ath_dbg(common, CONFIG, "parsing configuration from OF node\n");
|
||||
|
||||
|
||||
@ -339,7 +339,7 @@
|
||||
|
||||
static void ath9k_flush(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
|
||||
u32 queues, bool drop);
|
||||
@@ -652,6 +653,7 @@ void ath_reset_work(struct work_struct *
|
||||
@@ -657,6 +658,7 @@ void ath_reset_work(struct work_struct *
|
||||
static int ath9k_start(struct ieee80211_hw *hw)
|
||||
{
|
||||
struct ath_softc *sc = hw->priv;
|
||||
@ -347,7 +347,7 @@
|
||||
struct ath_hw *ah = sc->sc_ah;
|
||||
struct ath_common *common = ath9k_hw_common(ah);
|
||||
struct ieee80211_channel *curchan = sc->cur_chan->chandef.chan;
|
||||
@@ -730,6 +732,11 @@ static int ath9k_start(struct ieee80211_
|
||||
@@ -735,6 +737,11 @@ static int ath9k_start(struct ieee80211_
|
||||
AR_GPIO_OUTPUT_MUX_AS_OUTPUT);
|
||||
}
|
||||
|
||||
@ -371,7 +371,7 @@
|
||||
|
||||
--- a/local-symbols
|
||||
+++ b/local-symbols
|
||||
@@ -113,6 +113,7 @@ ATH9K_WOW=
|
||||
@@ -112,6 +112,7 @@ ATH9K_WOW=
|
||||
ATH9K_RFKILL=
|
||||
ATH9K_CHANNEL_CONTEXT=
|
||||
ATH9K_PCOEM=
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
--- a/drivers/net/wireless/ath/ath9k/init.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/init.c
|
||||
@@ -654,6 +654,12 @@ static int ath9k_of_init(struct ath_soft
|
||||
@@ -651,6 +651,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)
|
||||
{
|
||||
@@ -757,6 +763,9 @@ static int ath9k_init_softc(u16 devid, s
|
||||
@@ -754,6 +760,9 @@ static int ath9k_init_softc(u16 devid, s
|
||||
if (ret)
|
||||
goto err_hw;
|
||||
|
||||
|
||||
@ -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
|
||||
@@ -2958,6 +2958,10 @@ brcmf_cfg80211_set_power_mgmt(struct wip
|
||||
@@ -2961,6 +2961,10 @@ brcmf_cfg80211_set_power_mgmt(struct wip
|
||||
* preference in cfg struct to apply this to
|
||||
* FW later while initializing the dongle
|
||||
*/
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
|
||||
@@ -2910,6 +2910,63 @@ done:
|
||||
@@ -2913,6 +2913,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)
|
||||
{
|
||||
@@ -3005,6 +3062,7 @@ static s32 brcmf_inform_single_bss(struc
|
||||
@@ -3008,6 +3065,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;
|
||||
@@ -3029,6 +3087,17 @@ static s32 brcmf_inform_single_bss(struc
|
||||
@@ -3032,6 +3090,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());
|
||||
@@ -5515,6 +5584,7 @@ static struct cfg80211_ops brcmf_cfg8021
|
||||
@@ -5518,6 +5587,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,
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
--- a/local-symbols
|
||||
+++ b/local-symbols
|
||||
@@ -333,6 +333,7 @@ RT2X00_LIB_FIRMWARE=
|
||||
@@ -332,6 +332,7 @@ RT2X00_LIB_FIRMWARE=
|
||||
RT2X00_LIB_CRYPTO=
|
||||
RT2X00_LIB_LEDS=
|
||||
RT2X00_LIB_DEBUGFS=
|
||||
@ -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
|
||||
@@ -1406,6 +1406,10 @@ int rt2x00lib_probe_dev(struct rt2x00_de
|
||||
@@ -1402,6 +1402,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.
|
||||
*/
|
||||
@@ -1549,6 +1553,11 @@ void rt2x00lib_remove_dev(struct rt2x00_
|
||||
@@ -1545,6 +1549,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
|
||||
@@ -1012,6 +1012,22 @@ static int rt2x00lib_probe_hw_modes(stru
|
||||
@@ -1008,6 +1008,22 @@ static int rt2x00lib_probe_hw_modes(stru
|
||||
unsigned int num_rates;
|
||||
unsigned int i;
|
||||
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
--- a/drivers/net/wireless/ralink/rt2x00/rt2x00dev.c
|
||||
+++ b/drivers/net/wireless/ralink/rt2x00/rt2x00dev.c
|
||||
@@ -1016,6 +1016,16 @@ static int rt2x00lib_probe_hw_modes(stru
|
||||
@@ -1013,6 +1013,16 @@ static int rt2x00lib_probe_hw_modes(stru
|
||||
struct ieee80211_rate *rates;
|
||||
unsigned int num_rates;
|
||||
unsigned int i;
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
--- a/drivers/net/wireless/ralink/rt2x00/rt2x00dev.c
|
||||
+++ b/drivers/net/wireless/ralink/rt2x00/rt2x00dev.c
|
||||
@@ -1344,7 +1344,7 @@ static inline void rt2x00lib_set_if_comb
|
||||
@@ -1341,7 +1341,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
|
||||
@@ -1129,6 +1129,19 @@ static void rt2x00lib_remove_hw(struct r
|
||||
@@ -1126,6 +1126,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;
|
||||
@@ -1210,6 +1223,10 @@ static int rt2x00lib_probe_hw(struct rt2
|
||||
@@ -1207,6 +1220,10 @@ static int rt2x00lib_probe_hw(struct rt2
|
||||
|
||||
#undef RT2X00_TASKLET_INIT
|
||||
|
||||
|
||||
@ -141,7 +141,7 @@
|
||||
|
||||
--- a/drivers/net/wireless/ralink/rt2x00/rt2x00dev.c
|
||||
+++ b/drivers/net/wireless/ralink/rt2x00/rt2x00dev.c
|
||||
@@ -1057,6 +1057,12 @@ static int rt2x00lib_probe_hw_modes(stru
|
||||
@@ -1054,6 +1054,12 @@ static int rt2x00lib_probe_hw_modes(stru
|
||||
if (!rates)
|
||||
goto exit_free_channels;
|
||||
|
||||
@ -154,7 +154,7 @@
|
||||
/*
|
||||
* Initialize Rate list.
|
||||
*/
|
||||
@@ -1108,6 +1114,8 @@ static int rt2x00lib_probe_hw_modes(stru
|
||||
@@ -1105,6 +1111,8 @@ static int rt2x00lib_probe_hw_modes(stru
|
||||
|
||||
return 0;
|
||||
|
||||
|
||||
@ -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
|
||||
@@ -1288,7 +1288,6 @@ static int ieee80211_stop_ap(struct wiph
|
||||
@@ -1307,7 +1307,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/mac80211/cfg.c
|
||||
+++ b/net/mac80211/cfg.c
|
||||
@@ -2444,7 +2444,7 @@ static int ieee80211_scan(struct wiphy *
|
||||
@@ -2463,7 +2463,7 @@ static int ieee80211_scan(struct wiphy *
|
||||
* the frames sent while scanning on other channel will be
|
||||
* lost)
|
||||
*/
|
||||
|
||||
@ -33,7 +33,7 @@ Signed-off-by: Johannes Berg <johannes.berg@intel.com>
|
||||
* cfg80211_rx_unprot_mlme_mgmt - notification of unprotected mlme mgmt frame
|
||||
--- a/net/mac80211/mlme.c
|
||||
+++ b/net/mac80211/mlme.c
|
||||
@@ -2734,7 +2734,7 @@ static void ieee80211_report_disconnect(
|
||||
@@ -2725,7 +2725,7 @@ static void ieee80211_report_disconnect(
|
||||
};
|
||||
|
||||
if (tx)
|
||||
@ -42,7 +42,7 @@ Signed-off-by: Johannes Berg <johannes.berg@intel.com>
|
||||
else
|
||||
cfg80211_rx_mlme_mgmt(sdata->dev, buf, len);
|
||||
|
||||
@@ -4724,7 +4724,8 @@ void ieee80211_mgd_quiesce(struct ieee80
|
||||
@@ -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,
|
||||
@ -152,7 +152,7 @@ Signed-off-by: Johannes Berg <johannes.berg@intel.com>
|
||||
};
|
||||
|
||||
/* policy for the key attributes */
|
||||
@@ -15903,7 +15904,7 @@ static void nl80211_send_mlme_event(stru
|
||||
@@ -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,
|
||||
@ -161,7 +161,7 @@ Signed-off-by: Johannes Berg <johannes.berg@intel.com>
|
||||
{
|
||||
struct sk_buff *msg;
|
||||
void *hdr;
|
||||
@@ -15925,6 +15926,9 @@ static void nl80211_send_mlme_event(stru
|
||||
@@ -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;
|
||||
|
||||
@ -171,7 +171,7 @@ Signed-off-by: Johannes Berg <johannes.berg@intel.com>
|
||||
if (uapsd_queues >= 0) {
|
||||
struct nlattr *nla_wmm =
|
||||
nla_nest_start_noflag(msg, NL80211_ATTR_STA_WME);
|
||||
@@ -15953,7 +15957,8 @@ void nl80211_send_rx_auth(struct cfg8021
|
||||
@@ -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,
|
||||
@ -181,7 +181,7 @@ Signed-off-by: Johannes Berg <johannes.berg@intel.com>
|
||||
}
|
||||
|
||||
void nl80211_send_rx_assoc(struct cfg80211_registered_device *rdev,
|
||||
@@ -15963,23 +15968,25 @@ void nl80211_send_rx_assoc(struct cfg802
|
||||
@@ -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,
|
||||
@ -212,7 +212,7 @@ Signed-off-by: Johannes Berg <johannes.berg@intel.com>
|
||||
}
|
||||
|
||||
void cfg80211_rx_unprot_mlme_mgmt(struct net_device *dev, const u8 *buf,
|
||||
@@ -16010,7 +16017,7 @@ void cfg80211_rx_unprot_mlme_mgmt(struct
|
||||
@@ -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,
|
||||
|
||||
@ -47,7 +47,7 @@ Signed-off-by: Johannes Berg <johannes.berg@intel.com>
|
||||
struct ieee80211_mgd_auth_data *auth_data;
|
||||
--- a/net/mac80211/mlme.c
|
||||
+++ b/net/mac80211/mlme.c
|
||||
@@ -2725,7 +2725,7 @@ EXPORT_SYMBOL(ieee80211_ap_probereq_get)
|
||||
@@ -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,
|
||||
@ -56,7 +56,7 @@ Signed-off-by: Johannes Berg <johannes.berg@intel.com>
|
||||
{
|
||||
struct ieee80211_event event = {
|
||||
.type = MLME_EVENT,
|
||||
@@ -2734,7 +2734,7 @@ static void ieee80211_report_disconnect(
|
||||
@@ -2725,7 +2725,7 @@ static void ieee80211_report_disconnect(
|
||||
};
|
||||
|
||||
if (tx)
|
||||
@ -65,7 +65,7 @@ Signed-off-by: Johannes Berg <johannes.berg@intel.com>
|
||||
else
|
||||
cfg80211_rx_mlme_mgmt(sdata->dev, buf, len);
|
||||
|
||||
@@ -2756,13 +2756,18 @@ static void __ieee80211_disconnect(struc
|
||||
@@ -2747,13 +2747,18 @@ static void __ieee80211_disconnect(struc
|
||||
|
||||
tx = !sdata->csa_block_tx;
|
||||
|
||||
@ -89,7 +89,7 @@ Signed-off-by: Johannes Berg <johannes.berg@intel.com>
|
||||
tx, frame_buf);
|
||||
mutex_lock(&local->mtx);
|
||||
sdata->vif.csa_active = false;
|
||||
@@ -2775,7 +2780,9 @@ static void __ieee80211_disconnect(struc
|
||||
@@ -2766,7 +2771,9 @@ static void __ieee80211_disconnect(struc
|
||||
mutex_unlock(&local->mtx);
|
||||
|
||||
ieee80211_report_disconnect(sdata, frame_buf, sizeof(frame_buf), tx,
|
||||
@ -100,7 +100,7 @@ Signed-off-by: Johannes Berg <johannes.berg@intel.com>
|
||||
|
||||
sdata_unlock(sdata);
|
||||
}
|
||||
@@ -2794,6 +2801,13 @@ static void ieee80211_beacon_connection_
|
||||
@@ -2785,6 +2792,13 @@ static void ieee80211_beacon_connection_
|
||||
sdata_info(sdata, "Connection to AP %pM lost\n",
|
||||
ifmgd->bssid);
|
||||
__ieee80211_disconnect(sdata);
|
||||
@ -114,7 +114,7 @@ Signed-off-by: Johannes Berg <johannes.berg@intel.com>
|
||||
} else {
|
||||
ieee80211_mgd_probe_ap(sdata, true);
|
||||
}
|
||||
@@ -2832,6 +2846,21 @@ void ieee80211_connection_loss(struct ie
|
||||
@@ -2823,6 +2837,21 @@ void ieee80211_connection_loss(struct ie
|
||||
}
|
||||
EXPORT_SYMBOL(ieee80211_connection_loss);
|
||||
|
||||
@ -136,7 +136,7 @@ Signed-off-by: Johannes Berg <johannes.berg@intel.com>
|
||||
|
||||
static void ieee80211_destroy_auth_data(struct ieee80211_sub_if_data *sdata,
|
||||
bool assoc)
|
||||
@@ -3135,7 +3164,7 @@ static void ieee80211_rx_mgmt_deauth(str
|
||||
@@ -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,
|
||||
@ -145,7 +145,7 @@ Signed-off-by: Johannes Berg <johannes.berg@intel.com>
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -3184,7 +3213,8 @@ static void ieee80211_rx_mgmt_disassoc(s
|
||||
@@ -3175,7 +3204,8 @@ static void ieee80211_rx_mgmt_disassoc(s
|
||||
|
||||
ieee80211_set_disassoc(sdata, 0, 0, false, NULL);
|
||||
|
||||
@ -155,7 +155,7 @@ Signed-off-by: Johannes Berg <johannes.berg@intel.com>
|
||||
}
|
||||
|
||||
static void ieee80211_get_rates(struct ieee80211_supported_band *sband,
|
||||
@@ -4204,7 +4234,8 @@ static void ieee80211_rx_mgmt_beacon(str
|
||||
@@ -4199,7 +4229,8 @@ static void ieee80211_rx_mgmt_beacon(str
|
||||
true, deauth_buf);
|
||||
ieee80211_report_disconnect(sdata, deauth_buf,
|
||||
sizeof(deauth_buf), true,
|
||||
@ -165,7 +165,7 @@ Signed-off-by: Johannes Berg <johannes.berg@intel.com>
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -4349,7 +4380,7 @@ static void ieee80211_sta_connection_los
|
||||
@@ -4344,7 +4375,7 @@ static void ieee80211_sta_connection_los
|
||||
tx, frame_buf);
|
||||
|
||||
ieee80211_report_disconnect(sdata, frame_buf, sizeof(frame_buf), true,
|
||||
@ -174,7 +174,7 @@ Signed-off-by: Johannes Berg <johannes.berg@intel.com>
|
||||
}
|
||||
|
||||
static int ieee80211_auth(struct ieee80211_sub_if_data *sdata)
|
||||
@@ -5439,7 +5470,8 @@ int ieee80211_mgd_auth(struct ieee80211_
|
||||
@@ -5434,7 +5465,8 @@ int ieee80211_mgd_auth(struct ieee80211_
|
||||
|
||||
ieee80211_report_disconnect(sdata, frame_buf,
|
||||
sizeof(frame_buf), true,
|
||||
@ -184,7 +184,7 @@ Signed-off-by: Johannes Berg <johannes.berg@intel.com>
|
||||
}
|
||||
|
||||
sdata_info(sdata, "authenticate with %pM\n", req->bss->bssid);
|
||||
@@ -5511,7 +5543,8 @@ int ieee80211_mgd_assoc(struct ieee80211
|
||||
@@ -5506,7 +5538,8 @@ int ieee80211_mgd_assoc(struct ieee80211
|
||||
|
||||
ieee80211_report_disconnect(sdata, frame_buf,
|
||||
sizeof(frame_buf), true,
|
||||
@ -194,7 +194,7 @@ Signed-off-by: Johannes Berg <johannes.berg@intel.com>
|
||||
}
|
||||
|
||||
if (ifmgd->auth_data && !ifmgd->auth_data->done) {
|
||||
@@ -5810,7 +5843,7 @@ int ieee80211_mgd_deauth(struct ieee8021
|
||||
@@ -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,
|
||||
@ -203,7 +203,7 @@ Signed-off-by: Johannes Berg <johannes.berg@intel.com>
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -5830,7 +5863,7 @@ int ieee80211_mgd_deauth(struct ieee8021
|
||||
@@ -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,
|
||||
@ -212,7 +212,7 @@ Signed-off-by: Johannes Berg <johannes.berg@intel.com>
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -5845,7 +5878,7 @@ int ieee80211_mgd_deauth(struct ieee8021
|
||||
@@ -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,
|
||||
@ -221,7 +221,7 @@ Signed-off-by: Johannes Berg <johannes.berg@intel.com>
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -5878,7 +5911,7 @@ int ieee80211_mgd_disassoc(struct ieee80
|
||||
@@ -5877,7 +5910,7 @@ int ieee80211_mgd_disassoc(struct ieee80
|
||||
frame_buf);
|
||||
|
||||
ieee80211_report_disconnect(sdata, frame_buf, sizeof(frame_buf), true,
|
||||
|
||||
@ -59,7 +59,7 @@ Signed-off-by: Johannes Berg <johannes.berg@intel.com>
|
||||
[NL80211_ATTR_RECONNECT_REQUESTED] = { .type = NLA_REJECT },
|
||||
};
|
||||
|
||||
@@ -9764,6 +9767,12 @@ static int nl80211_crypto_settings(struc
|
||||
@@ -9763,6 +9766,12 @@ static int nl80211_crypto_settings(struc
|
||||
nla_len(info->attrs[NL80211_ATTR_SAE_PASSWORD]);
|
||||
}
|
||||
|
||||
|
||||
@ -132,7 +132,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
|
||||
codel_vars_init(&txqi->def_cvars);
|
||||
codel_stats_init(&txqi->cstats);
|
||||
__skb_queue_head_init(&txqi->frags);
|
||||
@@ -3310,8 +3297,7 @@ static bool ieee80211_amsdu_aggregate(st
|
||||
@@ -3332,8 +3319,7 @@ static bool ieee80211_amsdu_aggregate(st
|
||||
*/
|
||||
|
||||
tin = &txqi->tin;
|
||||
|
||||
@ -306,7 +306,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
|
||||
#endif
|
||||
--- a/net/mac80211/tx.c
|
||||
+++ b/net/mac80211/tx.c
|
||||
@@ -3364,8 +3364,6 @@ out_recalc:
|
||||
@@ -3386,8 +3386,6 @@ out_recalc:
|
||||
if (head->len != orig_len) {
|
||||
flow->backlog += head->len - orig_len;
|
||||
tin->backlog_bytes += head->len - orig_len;
|
||||
|
||||
@ -132,7 +132,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
|
||||
#endif /* __MAC80211_DRIVER_OPS */
|
||||
--- a/net/mac80211/iface.c
|
||||
+++ b/net/mac80211/iface.c
|
||||
@@ -835,7 +835,7 @@ static const struct net_device_ops ieee8
|
||||
@@ -856,7 +856,7 @@ static const struct net_device_ops ieee8
|
||||
|
||||
};
|
||||
|
||||
@ -141,7 +141,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
|
||||
{
|
||||
switch (iftype) {
|
||||
/* P2P GO and client are mapped to AP/STATION types */
|
||||
@@ -855,7 +855,7 @@ static bool ieee80211_set_sdata_offload_
|
||||
@@ -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) &&
|
||||
@ -150,7 +150,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
|
||||
flags |= IEEE80211_OFFLOAD_ENCAP_ENABLED;
|
||||
|
||||
if (!ieee80211_hw_check(&local->hw, SUPPORTS_TX_FRAG) &&
|
||||
@@ -868,10 +868,21 @@ static bool ieee80211_set_sdata_offload_
|
||||
@@ -889,10 +889,21 @@ static bool ieee80211_set_sdata_offload_
|
||||
flags &= ~IEEE80211_OFFLOAD_ENCAP_ENABLED;
|
||||
}
|
||||
|
||||
@ -172,7 +172,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -889,7 +900,7 @@ static void ieee80211_set_vif_encap_ops(
|
||||
@@ -910,7 +921,7 @@ static void ieee80211_set_vif_encap_ops(
|
||||
}
|
||||
|
||||
if (!ieee80211_hw_check(&local->hw, SUPPORTS_TX_ENCAP_OFFLOAD) ||
|
||||
@ -183,7 +183,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
|
||||
enabled = bss->vif.offload_flags & IEEE80211_OFFLOAD_ENCAP_ENABLED;
|
||||
--- a/net/mac80211/rx.c
|
||||
+++ b/net/mac80211/rx.c
|
||||
@@ -4198,7 +4198,9 @@ void ieee80211_check_fast_rx(struct sta_
|
||||
@@ -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;
|
||||
@ -193,7 +193,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
|
||||
|
||||
/* use sparse to check that we don't return without updating */
|
||||
__acquire(check_fast_rx);
|
||||
@@ -4311,6 +4313,17 @@ void ieee80211_check_fast_rx(struct sta_
|
||||
@@ -4308,6 +4310,17 @@ void ieee80211_check_fast_rx(struct sta_
|
||||
if (assign)
|
||||
new = kmemdup(&fastrx, sizeof(fastrx), GFP_KERNEL);
|
||||
|
||||
@ -211,7 +211,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
|
||||
spin_lock_bh(&sta->lock);
|
||||
old = rcu_dereference_protected(sta->fast_rx, true);
|
||||
rcu_assign_pointer(sta->fast_rx, new);
|
||||
@@ -4357,6 +4370,108 @@ void ieee80211_check_fast_rx_iface(struc
|
||||
@@ -4354,6 +4367,108 @@ void ieee80211_check_fast_rx_iface(struc
|
||||
mutex_unlock(&local->sta_mtx);
|
||||
}
|
||||
|
||||
@ -320,7 +320,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
|
||||
static bool ieee80211_invoke_fast_rx(struct ieee80211_rx_data *rx,
|
||||
struct ieee80211_fast_rx *fast_rx)
|
||||
{
|
||||
@@ -4377,9 +4492,6 @@ static bool ieee80211_invoke_fast_rx(str
|
||||
@@ -4374,9 +4489,6 @@ static bool ieee80211_invoke_fast_rx(str
|
||||
} addrs __aligned(2);
|
||||
struct ieee80211_sta_rx_stats *stats = &sta->rx_stats;
|
||||
|
||||
@ -330,7 +330,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
|
||||
/* 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
|
||||
@@ -4453,32 +4565,6 @@ static bool ieee80211_invoke_fast_rx(str
|
||||
@@ -4450,32 +4562,6 @@ static bool ieee80211_invoke_fast_rx(str
|
||||
pskb_trim(skb, skb->len - fast_rx->icv_len))
|
||||
goto drop;
|
||||
|
||||
@ -363,7 +363,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
|
||||
if (rx->key && !ieee80211_has_protected(hdr->frame_control))
|
||||
goto drop;
|
||||
|
||||
@@ -4490,12 +4576,6 @@ static bool ieee80211_invoke_fast_rx(str
|
||||
@@ -4487,12 +4573,6 @@ static bool ieee80211_invoke_fast_rx(str
|
||||
return true;
|
||||
}
|
||||
|
||||
@ -376,7 +376,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
|
||||
/* 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);
|
||||
@@ -4504,62 +4584,14 @@ static bool ieee80211_invoke_fast_rx(str
|
||||
@@ -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));
|
||||
|
||||
@ -443,7 +443,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
|
||||
stats->dropped++;
|
||||
return true;
|
||||
}
|
||||
@@ -4613,6 +4645,47 @@ static bool ieee80211_prepare_and_rx_han
|
||||
@@ -4610,6 +4642,47 @@ static bool ieee80211_prepare_and_rx_han
|
||||
return true;
|
||||
}
|
||||
|
||||
@ -491,7 +491,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
|
||||
/*
|
||||
* This is the actual Rx frames handler. as it belongs to Rx path it must
|
||||
* be called with rcu_read_lock protection.
|
||||
@@ -4850,15 +4923,20 @@ void ieee80211_rx_list(struct ieee80211_
|
||||
@@ -4847,15 +4920,20 @@ void ieee80211_rx_list(struct ieee80211_
|
||||
* if it was previously present.
|
||||
* Also, frames with less than 16 bytes are dropped.
|
||||
*/
|
||||
|
||||
@ -69,7 +69,7 @@ Signed-off-by: Johannes Berg <johannes.berg@intel.com>
|
||||
tx->sta = sta_info_get_bss(sdata, hdr->addr1);
|
||||
}
|
||||
if (!tx->sta && !is_multicast_ether_addr(hdr->addr1))
|
||||
@@ -5421,6 +5419,7 @@ int ieee80211_tx_control_port(struct wip
|
||||
@@ -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;
|
||||
@ -77,7 +77,7 @@ Signed-off-by: Johannes Berg <johannes.berg@intel.com>
|
||||
struct sk_buff *skb;
|
||||
struct ethhdr *ehdr;
|
||||
u32 ctrl_flags = 0;
|
||||
@@ -5443,8 +5442,7 @@ int ieee80211_tx_control_port(struct wip
|
||||
@@ -5465,8 +5464,7 @@ int ieee80211_tx_control_port(struct wip
|
||||
if (cookie)
|
||||
ctrl_flags |= IEEE80211_TX_CTL_REQ_TX_STATUS;
|
||||
|
||||
@ -87,7 +87,7 @@ Signed-off-by: Johannes Berg <johannes.berg@intel.com>
|
||||
|
||||
skb = dev_alloc_skb(local->hw.extra_tx_headroom +
|
||||
sizeof(struct ethhdr) + len);
|
||||
@@ -5461,10 +5459,25 @@ int ieee80211_tx_control_port(struct wip
|
||||
@@ -5483,10 +5481,25 @@ int ieee80211_tx_control_port(struct wip
|
||||
ehdr->h_proto = proto;
|
||||
|
||||
skb->dev = dev;
|
||||
|
||||
@ -102,7 +102,7 @@ Signed-off-by: Johannes Berg <johannes.berg@intel.com>
|
||||
struct ieee80211_channel channels_s1g[ARRAY_SIZE(hwsim_channels_s1g)];
|
||||
struct ieee80211_rate rates[ARRAY_SIZE(hwsim_rates)];
|
||||
struct ieee80211_iface_combination if_combination;
|
||||
@@ -578,7 +647,8 @@ struct mac80211_hwsim_data {
|
||||
@@ -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) +
|
||||
@ -112,7 +112,7 @@ Signed-off-by: Johannes Berg <johannes.berg@intel.com>
|
||||
|
||||
struct ieee80211_channel *channel;
|
||||
u64 beacon_int /* beacon interval in us */;
|
||||
@@ -3149,6 +3219,8 @@ static int mac80211_hwsim_new_radio(stru
|
||||
@@ -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));
|
||||
|
||||
@ -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
|
||||
@@ -2968,15 +2968,19 @@ static void mac80211_hwsim_he_capab(stru
|
||||
@@ -2990,15 +2990,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;
|
||||
}
|
||||
|
||||
@@ -3265,6 +3269,12 @@ static int mac80211_hwsim_new_radio(stru
|
||||
@@ -3288,6 +3292,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));
|
||||
@@ -3275,6 +3285,13 @@ static int mac80211_hwsim_new_radio(stru
|
||||
@@ -3298,6 +3308,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 |
|
||||
@@ -3288,10 +3305,6 @@ static int mac80211_hwsim_new_radio(stru
|
||||
@@ -3311,10 +3328,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;
|
||||
|
||||
@ -48,7 +48,7 @@ Signed-off-by: Johannes Berg <johannes.berg@intel.com>
|
||||
spin_unlock_bh(&fq->lock);
|
||||
}
|
||||
|
||||
@@ -3844,6 +3853,9 @@ bool ieee80211_txq_airtime_check(struct
|
||||
@@ -3866,6 +3875,9 @@ bool ieee80211_txq_airtime_check(struct
|
||||
if (!txq->sta)
|
||||
return true;
|
||||
|
||||
|
||||
@ -9,7 +9,7 @@ Signed-off-by: Lorenzo Bianconi <lorenzo@kernel.org>
|
||||
|
||||
--- a/net/mac80211/tx.c
|
||||
+++ b/net/mac80211/tx.c
|
||||
@@ -4171,6 +4171,9 @@ static bool ieee80211_tx_8023(struct iee
|
||||
@@ -4193,6 +4193,9 @@ static bool ieee80211_tx_8023(struct iee
|
||||
unsigned long flags;
|
||||
int q = info->hw_queue;
|
||||
|
||||
|
||||
@ -25,7 +25,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
|
||||
struct rate_control_ops {
|
||||
--- a/net/mac80211/rc80211_minstrel_ht.c
|
||||
+++ b/net/mac80211/rc80211_minstrel_ht.c
|
||||
@@ -1153,29 +1153,6 @@ minstrel_downgrade_prob_rate(struct mins
|
||||
@@ -1144,29 +1144,6 @@ minstrel_downgrade_prob_rate(struct mins
|
||||
}
|
||||
|
||||
static void
|
||||
@ -55,7 +55,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
|
||||
minstrel_ht_tx_status(void *priv, struct ieee80211_supported_band *sband,
|
||||
void *priv_sta, struct ieee80211_tx_status *st)
|
||||
{
|
||||
@@ -1477,10 +1454,6 @@ minstrel_ht_get_rate(void *priv, struct
|
||||
@@ -1461,10 +1438,6 @@ minstrel_ht_get_rate(void *priv, struct
|
||||
struct minstrel_priv *mp = priv;
|
||||
u16 sample_idx;
|
||||
|
||||
@ -66,7 +66,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
|
||||
info->flags |= mi->tx_flags;
|
||||
|
||||
#ifdef CPTCFG_MAC80211_DEBUGFS
|
||||
@@ -1894,6 +1867,7 @@ static u32 minstrel_ht_get_expected_thro
|
||||
@@ -1870,6 +1843,7 @@ static u32 minstrel_ht_get_expected_thro
|
||||
|
||||
static const struct rate_control_ops mac80211_minstrel_ht = {
|
||||
.name = "minstrel_ht",
|
||||
@ -76,7 +76,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
|
||||
.rate_init = minstrel_ht_rate_init,
|
||||
--- a/net/mac80211/tx.c
|
||||
+++ b/net/mac80211/tx.c
|
||||
@@ -3931,6 +3931,29 @@ void ieee80211_txq_schedule_start(struct
|
||||
@@ -3953,6 +3953,29 @@ void ieee80211_txq_schedule_start(struct
|
||||
}
|
||||
EXPORT_SYMBOL(ieee80211_txq_schedule_start);
|
||||
|
||||
@ -106,7 +106,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
|
||||
void __ieee80211_subif_start_xmit(struct sk_buff *skb,
|
||||
struct net_device *dev,
|
||||
u32 info_flags,
|
||||
@@ -3961,6 +3984,8 @@ void __ieee80211_subif_start_xmit(struct
|
||||
@@ -3983,6 +4006,8 @@ void __ieee80211_subif_start_xmit(struct
|
||||
skb_get_hash(skb);
|
||||
}
|
||||
|
||||
@ -115,7 +115,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
|
||||
if (sta) {
|
||||
struct ieee80211_fast_tx *fast_tx;
|
||||
|
||||
@@ -4224,6 +4249,8 @@ static void ieee80211_8023_xmit(struct i
|
||||
@@ -4246,6 +4271,8 @@ static void ieee80211_8023_xmit(struct i
|
||||
|
||||
memset(info, 0, sizeof(*info));
|
||||
|
||||
|
||||
@ -29,7 +29,7 @@ Signed-off-by: Ryder Lee <ryder.lee@mediatek.com>
|
||||
CALL_TXH(ieee80211_tx_h_michael_mic_add);
|
||||
CALL_TXH(ieee80211_tx_h_sequence);
|
||||
CALL_TXH(ieee80211_tx_h_fragment);
|
||||
@@ -3382,15 +3383,21 @@ out:
|
||||
@@ -3404,15 +3405,21 @@ out:
|
||||
* Can be called while the sta lock is held. Anything that can cause packets to
|
||||
* be generated will cause deadlock!
|
||||
*/
|
||||
@ -55,7 +55,7 @@ Signed-off-by: Ryder Lee <ryder.lee@mediatek.com>
|
||||
if (key)
|
||||
info->control.hw_key = &key->conf;
|
||||
|
||||
@@ -3439,6 +3446,8 @@ static void ieee80211_xmit_fast_finish(s
|
||||
@@ -3461,6 +3468,8 @@ static void ieee80211_xmit_fast_finish(s
|
||||
break;
|
||||
}
|
||||
}
|
||||
@ -64,7 +64,7 @@ Signed-off-by: Ryder Lee <ryder.lee@mediatek.com>
|
||||
}
|
||||
|
||||
static bool ieee80211_xmit_fast(struct ieee80211_sub_if_data *sdata,
|
||||
@@ -3542,24 +3551,17 @@ static bool ieee80211_xmit_fast(struct i
|
||||
@@ -3564,24 +3573,17 @@ static bool ieee80211_xmit_fast(struct i
|
||||
tx.sta = sta;
|
||||
tx.key = fast_tx->key;
|
||||
|
||||
@ -97,7 +97,7 @@ Signed-off-by: Ryder Lee <ryder.lee@mediatek.com>
|
||||
|
||||
if (sdata->vif.type == NL80211_IFTYPE_AP_VLAN)
|
||||
sdata = container_of(sdata->bss,
|
||||
@@ -3670,8 +3672,12 @@ begin:
|
||||
@@ -3692,8 +3694,12 @@ begin:
|
||||
(tx.key->conf.flags & IEEE80211_KEY_FLAG_GENERATE_IV))
|
||||
pn_offs = ieee80211_hdrlen(hdr->frame_control);
|
||||
|
||||
|
||||
@ -81,7 +81,7 @@ Signed-off-by: Ryder Lee <ryder.lee@mediatek.com>
|
||||
tx->sta->tx_stats.last_rate = txrc.reported_rate;
|
||||
} else if (tx->sta)
|
||||
tx->sta->tx_stats.last_rate = txrc.reported_rate;
|
||||
@@ -3660,8 +3662,16 @@ begin:
|
||||
@@ -3682,8 +3684,16 @@ begin:
|
||||
else
|
||||
info->flags &= ~IEEE80211_TX_CTL_AMPDU;
|
||||
|
||||
@ -101,7 +101,7 @@ Signed-off-by: Ryder Lee <ryder.lee@mediatek.com>
|
||||
struct sta_info *sta = container_of(txq->sta, struct sta_info,
|
||||
--- a/include/net/mac80211.h
|
||||
+++ b/include/net/mac80211.h
|
||||
@@ -6728,4 +6728,22 @@ struct sk_buff *ieee80211_get_fils_disco
|
||||
@@ -6733,4 +6733,22 @@ struct sk_buff *ieee80211_get_fils_disco
|
||||
struct sk_buff *
|
||||
ieee80211_get_unsol_bcast_probe_resp_tmpl(struct ieee80211_hw *hw,
|
||||
struct ieee80211_vif *vif);
|
||||
|
||||
@ -12,7 +12,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
|
||||
|
||||
--- a/net/mac80211/rc80211_minstrel_ht.c
|
||||
+++ b/net/mac80211/rc80211_minstrel_ht.c
|
||||
@@ -1466,7 +1466,7 @@ minstrel_ht_get_rate(void *priv, struct
|
||||
@@ -1450,7 +1450,7 @@ minstrel_ht_get_rate(void *priv, struct
|
||||
(info->control.flags & IEEE80211_TX_CTRL_PORT_CTRL_PROTO))
|
||||
return;
|
||||
|
||||
|
||||
@ -1,51 +0,0 @@
|
||||
From: Felix Fietkau <nbd@nbd.name>
|
||||
Date: Sat, 19 Jun 2021 12:10:14 +0200
|
||||
Subject: [PATCH] mac80211: remove iwlwifi specific workaround that broke sta
|
||||
NDP tx
|
||||
|
||||
Sending nulldata packets is important for sw AP link probing and detecting
|
||||
4-address mode links. The checks that dropped these packets were apparently
|
||||
added to work around an iwlwifi firmware bug with multi-TID aggregation.
|
||||
|
||||
Fixes: 41cbb0f5a295 ("mac80211: add support for HE")
|
||||
Cc: stable@vger.kernel.org
|
||||
Signed-off-by: Felix Fietkau <nbd@nbd.name>
|
||||
---
|
||||
|
||||
--- a/drivers/net/wireless/intel/iwlwifi/mvm/tx.c
|
||||
+++ b/drivers/net/wireless/intel/iwlwifi/mvm/tx.c
|
||||
@@ -1085,6 +1085,9 @@ static int iwl_mvm_tx_mpdu(struct iwl_mv
|
||||
if (WARN_ON_ONCE(mvmsta->sta_id == IWL_MVM_INVALID_STA))
|
||||
return -1;
|
||||
|
||||
+ if (unlikely(ieee80211_is_any_nullfunc(fc)) && sta->he_cap.has_he)
|
||||
+ return -1;
|
||||
+
|
||||
if (unlikely(ieee80211_is_probe_resp(fc)))
|
||||
iwl_mvm_probe_resp_set_noa(mvm, skb);
|
||||
|
||||
--- a/net/mac80211/mlme.c
|
||||
+++ b/net/mac80211/mlme.c
|
||||
@@ -1094,11 +1094,6 @@ void ieee80211_send_nullfunc(struct ieee
|
||||
struct ieee80211_hdr_3addr *nullfunc;
|
||||
struct ieee80211_if_managed *ifmgd = &sdata->u.mgd;
|
||||
|
||||
- /* Don't send NDPs when STA is connected HE */
|
||||
- if (sdata->vif.type == NL80211_IFTYPE_STATION &&
|
||||
- !(ifmgd->flags & IEEE80211_STA_DISABLE_HE))
|
||||
- return;
|
||||
-
|
||||
skb = ieee80211_nullfunc_get(&local->hw, &sdata->vif,
|
||||
!ieee80211_hw_check(&local->hw, DOESNT_SUPPORT_QOS_NDP));
|
||||
if (!skb)
|
||||
@@ -1130,10 +1125,6 @@ static void ieee80211_send_4addr_nullfun
|
||||
if (WARN_ON(sdata->vif.type != NL80211_IFTYPE_STATION))
|
||||
return;
|
||||
|
||||
- /* Don't send NDPs when connected HE */
|
||||
- if (!(sdata->u.mgd.flags & IEEE80211_STA_DISABLE_HE))
|
||||
- return;
|
||||
-
|
||||
skb = dev_alloc_skb(local->hw.extra_tx_headroom + 30);
|
||||
if (!skb)
|
||||
return;
|
||||
@ -80,7 +80,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
|
||||
if (tid_tx) {
|
||||
bool queued;
|
||||
|
||||
@@ -3947,29 +3977,6 @@ void ieee80211_txq_schedule_start(struct
|
||||
@@ -3969,29 +3999,6 @@ void ieee80211_txq_schedule_start(struct
|
||||
}
|
||||
EXPORT_SYMBOL(ieee80211_txq_schedule_start);
|
||||
|
||||
|
||||
@ -90,7 +90,7 @@ Signed-off-by: Johannes Berg <johannes.berg@intel.com>
|
||||
* don't cast (use the static inlines below), but we keep
|
||||
--- a/net/mac80211/tx.c
|
||||
+++ b/net/mac80211/tx.c
|
||||
@@ -3887,6 +3887,8 @@ void __ieee80211_schedule_txq(struct iee
|
||||
@@ -3909,6 +3909,8 @@ void __ieee80211_schedule_txq(struct iee
|
||||
}
|
||||
EXPORT_SYMBOL(__ieee80211_schedule_txq);
|
||||
|
||||
@ -99,7 +99,7 @@ Signed-off-by: Johannes Berg <johannes.berg@intel.com>
|
||||
bool ieee80211_txq_airtime_check(struct ieee80211_hw *hw,
|
||||
struct ieee80211_txq *txq)
|
||||
{
|
||||
@@ -3896,6 +3898,9 @@ bool ieee80211_txq_airtime_check(struct
|
||||
@@ -3918,6 +3920,9 @@ bool ieee80211_txq_airtime_check(struct
|
||||
if (!wiphy_ext_feature_isset(local->hw.wiphy, NL80211_EXT_FEATURE_AQL))
|
||||
return true;
|
||||
|
||||
|
||||
@ -50,7 +50,7 @@ Signed-off-by: Johannes Berg <johannes.berg@intel.com>
|
||||
|
||||
--- a/include/net/mac80211.h
|
||||
+++ b/include/net/mac80211.h
|
||||
@@ -6552,9 +6552,6 @@ static inline void ieee80211_txq_schedul
|
||||
@@ -6557,9 +6557,6 @@ static inline void ieee80211_txq_schedul
|
||||
{
|
||||
}
|
||||
|
||||
@ -60,7 +60,7 @@ Signed-off-by: Johannes Berg <johannes.berg@intel.com>
|
||||
/**
|
||||
* ieee80211_schedule_txq - schedule a TXQ for transmission
|
||||
*
|
||||
@@ -6567,11 +6564,7 @@ void __ieee80211_schedule_txq(struct iee
|
||||
@@ -6572,11 +6569,7 @@ void __ieee80211_schedule_txq(struct iee
|
||||
* The driver may call this function if it has buffered packets for
|
||||
* this TXQ internally.
|
||||
*/
|
||||
@ -73,7 +73,7 @@ Signed-off-by: Johannes Berg <johannes.berg@intel.com>
|
||||
|
||||
/**
|
||||
* ieee80211_return_txq - return a TXQ previously acquired by ieee80211_next_txq()
|
||||
@@ -6583,12 +6576,8 @@ ieee80211_schedule_txq(struct ieee80211_
|
||||
@@ -6588,12 +6581,8 @@ ieee80211_schedule_txq(struct ieee80211_
|
||||
* The driver may set force=true if it has buffered packets for this TXQ
|
||||
* internally.
|
||||
*/
|
||||
@ -90,7 +90,7 @@ Signed-off-by: Johannes Berg <johannes.berg@intel.com>
|
||||
* ieee80211_txq_may_transmit - check whether TXQ is allowed to transmit
|
||||
--- a/net/mac80211/cfg.c
|
||||
+++ b/net/mac80211/cfg.c
|
||||
@@ -1442,6 +1442,38 @@ static void sta_apply_mesh_params(struct
|
||||
@@ -1461,6 +1461,38 @@ static void sta_apply_mesh_params(struct
|
||||
#endif
|
||||
}
|
||||
|
||||
@ -129,7 +129,7 @@ Signed-off-by: Johannes Berg <johannes.berg@intel.com>
|
||||
static int sta_apply_parameters(struct ieee80211_local *local,
|
||||
struct sta_info *sta,
|
||||
struct station_parameters *params)
|
||||
@@ -1629,7 +1661,8 @@ static int sta_apply_parameters(struct i
|
||||
@@ -1648,7 +1680,8 @@ static int sta_apply_parameters(struct i
|
||||
sta_apply_mesh_params(local, sta, params);
|
||||
|
||||
if (params->airtime_weight)
|
||||
@ -590,7 +590,7 @@ Signed-off-by: Johannes Berg <johannes.berg@intel.com>
|
||||
void ieee80211_apply_htcap_overrides(struct ieee80211_sub_if_data *sdata,
|
||||
--- a/net/mac80211/iface.c
|
||||
+++ b/net/mac80211/iface.c
|
||||
@@ -2067,6 +2067,9 @@ int ieee80211_if_add(struct ieee80211_lo
|
||||
@@ -2088,6 +2088,9 @@ int ieee80211_if_add(struct ieee80211_lo
|
||||
}
|
||||
}
|
||||
|
||||
@ -655,7 +655,7 @@ Signed-off-by: Johannes Berg <johannes.berg@intel.com>
|
||||
}
|
||||
|
||||
for (i = 0; i < IEEE80211_NUM_TIDS; i++)
|
||||
@@ -1898,24 +1894,59 @@ void ieee80211_sta_set_buffered(struct i
|
||||
@@ -1893,24 +1889,59 @@ void ieee80211_sta_set_buffered(struct i
|
||||
}
|
||||
EXPORT_SYMBOL(ieee80211_sta_set_buffered);
|
||||
|
||||
@ -727,7 +727,7 @@ Signed-off-by: Johannes Berg <johannes.berg@intel.com>
|
||||
}
|
||||
EXPORT_SYMBOL(ieee80211_sta_register_airtime);
|
||||
|
||||
@@ -2364,7 +2395,7 @@ void sta_set_sinfo(struct sta_info *sta,
|
||||
@@ -2354,7 +2385,7 @@ void sta_set_sinfo(struct sta_info *sta,
|
||||
}
|
||||
|
||||
if (!(sinfo->filled & BIT_ULL(NL80211_STA_INFO_AIRTIME_WEIGHT))) {
|
||||
@ -839,7 +839,7 @@ Signed-off-by: Johannes Berg <johannes.berg@intel.com>
|
||||
}
|
||||
|
||||
void ieee80211_txq_set_params(struct ieee80211_local *local)
|
||||
@@ -3797,102 +3796,259 @@ EXPORT_SYMBOL(ieee80211_tx_dequeue);
|
||||
@@ -3819,102 +3818,259 @@ EXPORT_SYMBOL(ieee80211_tx_dequeue);
|
||||
struct ieee80211_txq *ieee80211_next_txq(struct ieee80211_hw *hw, u8 ac)
|
||||
{
|
||||
struct ieee80211_local *local = hw_to_local(hw);
|
||||
@ -1161,7 +1161,7 @@ Signed-off-by: Johannes Berg <johannes.berg@intel.com>
|
||||
struct ieee80211_local *local = hw_to_local(hw);
|
||||
|
||||
if (!wiphy_ext_feature_isset(local->hw.wiphy, NL80211_EXT_FEATURE_AQL))
|
||||
@@ -3907,15 +4063,12 @@ bool ieee80211_txq_airtime_check(struct
|
||||
@@ -3929,15 +4085,12 @@ bool ieee80211_txq_airtime_check(struct
|
||||
if (unlikely(txq->tid == IEEE80211_NUM_TIDS))
|
||||
return true;
|
||||
|
||||
@ -1179,7 +1179,7 @@ Signed-off-by: Johannes Berg <johannes.berg@intel.com>
|
||||
return true;
|
||||
|
||||
return false;
|
||||
@@ -3925,60 +4078,59 @@ EXPORT_SYMBOL(ieee80211_txq_airtime_chec
|
||||
@@ -3947,60 +4100,59 @@ EXPORT_SYMBOL(ieee80211_txq_airtime_chec
|
||||
bool ieee80211_txq_may_transmit(struct ieee80211_hw *hw,
|
||||
struct ieee80211_txq *txq)
|
||||
{
|
||||
|
||||
@ -1,72 +0,0 @@
|
||||
From: Felix Fietkau <nbd@nbd.name>
|
||||
Date: Fri, 2 Jul 2021 06:57:53 +0200
|
||||
Subject: [PATCH] mac80211: fix enabling 4-address mode on a sta vif after
|
||||
assoc
|
||||
|
||||
Notify the driver about the 4-address mode change and also send a nulldata
|
||||
packet to the AP to notify it about the change
|
||||
|
||||
Fixes: 1ff4e8f2dec8 ("mac80211: notify the driver when a sta uses 4-address mode")
|
||||
Signed-off-by: Felix Fietkau <nbd@nbd.name>
|
||||
---
|
||||
|
||||
--- a/net/mac80211/cfg.c
|
||||
+++ b/net/mac80211/cfg.c
|
||||
@@ -152,6 +152,8 @@ static int ieee80211_change_iface(struct
|
||||
struct vif_params *params)
|
||||
{
|
||||
struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
|
||||
+ struct ieee80211_local *local = sdata->local;
|
||||
+ struct sta_info *sta;
|
||||
int ret;
|
||||
|
||||
ret = ieee80211_if_change_type(sdata, type);
|
||||
@@ -162,7 +164,24 @@ static int ieee80211_change_iface(struct
|
||||
RCU_INIT_POINTER(sdata->u.vlan.sta, NULL);
|
||||
ieee80211_check_fast_rx_iface(sdata);
|
||||
} else if (type == NL80211_IFTYPE_STATION && params->use_4addr >= 0) {
|
||||
+ struct ieee80211_if_managed *ifmgd = &sdata->u.mgd;
|
||||
+
|
||||
+ if (params->use_4addr == ifmgd->use_4addr)
|
||||
+ return 0;
|
||||
+
|
||||
sdata->u.mgd.use_4addr = params->use_4addr;
|
||||
+ if (!ifmgd->associated)
|
||||
+ return 0;
|
||||
+
|
||||
+ mutex_lock(&local->sta_mtx);
|
||||
+ sta = sta_info_get(sdata, ifmgd->bssid);
|
||||
+ if (sta)
|
||||
+ drv_sta_set_4addr(local, sdata, &sta->sta,
|
||||
+ params->use_4addr);
|
||||
+ mutex_unlock(&local->sta_mtx);
|
||||
+
|
||||
+ if (params->use_4addr)
|
||||
+ ieee80211_send_4addr_nullfunc(local, sdata);
|
||||
}
|
||||
|
||||
if (sdata->vif.type == NL80211_IFTYPE_MONITOR) {
|
||||
--- a/net/mac80211/ieee80211_i.h
|
||||
+++ b/net/mac80211/ieee80211_i.h
|
||||
@@ -2215,6 +2215,8 @@ void ieee80211_dynamic_ps_timer(struct t
|
||||
void ieee80211_send_nullfunc(struct ieee80211_local *local,
|
||||
struct ieee80211_sub_if_data *sdata,
|
||||
bool powersave);
|
||||
+void ieee80211_send_4addr_nullfunc(struct ieee80211_local *local,
|
||||
+ struct ieee80211_sub_if_data *sdata);
|
||||
void ieee80211_sta_tx_notify(struct ieee80211_sub_if_data *sdata,
|
||||
struct ieee80211_hdr *hdr, bool ack, u16 tx_time);
|
||||
|
||||
--- a/net/mac80211/mlme.c
|
||||
+++ b/net/mac80211/mlme.c
|
||||
@@ -1115,8 +1115,8 @@ void ieee80211_send_nullfunc(struct ieee
|
||||
ieee80211_tx_skb(sdata, skb);
|
||||
}
|
||||
|
||||
-static void ieee80211_send_4addr_nullfunc(struct ieee80211_local *local,
|
||||
- struct ieee80211_sub_if_data *sdata)
|
||||
+void ieee80211_send_4addr_nullfunc(struct ieee80211_local *local,
|
||||
+ struct ieee80211_sub_if_data *sdata)
|
||||
{
|
||||
struct sk_buff *skb;
|
||||
struct ieee80211_hdr *nullfunc;
|
||||
@ -222,7 +222,7 @@ Signed-off-by: Johannes Berg <johannes.berg@intel.com>
|
||||
|
||||
/* done */
|
||||
state->split_start = 0;
|
||||
@@ -14713,6 +14783,111 @@ static void nl80211_post_doit(__genl_con
|
||||
@@ -14712,6 +14782,111 @@ static void nl80211_post_doit(__genl_con
|
||||
}
|
||||
}
|
||||
|
||||
@ -334,7 +334,7 @@ Signed-off-by: Johannes Berg <johannes.berg@intel.com>
|
||||
static __genl_const struct genl_ops nl80211_ops[] = {
|
||||
{
|
||||
.cmd = NL80211_CMD_GET_WIPHY,
|
||||
@@ -15576,6 +15751,14 @@ static const struct genl_small_ops nl802
|
||||
@@ -15575,6 +15750,14 @@ static const struct genl_small_ops nl802
|
||||
.internal_flags = NL80211_FLAG_NEED_NETDEV |
|
||||
NL80211_FLAG_NEED_RTNL,
|
||||
},
|
||||
|
||||
@ -14,7 +14,7 @@ Signed-off-by: Johannes Berg <johannes.berg@intel.com>
|
||||
|
||||
--- a/net/mac80211/tx.c
|
||||
+++ b/net/mac80211/tx.c
|
||||
@@ -3309,6 +3309,9 @@ static bool ieee80211_amsdu_aggregate(st
|
||||
@@ -3331,6 +3331,9 @@ static bool ieee80211_amsdu_aggregate(st
|
||||
if (!ieee80211_hw_check(&local->hw, TX_AMSDU))
|
||||
return false;
|
||||
|
||||
|
||||
@ -0,0 +1,485 @@
|
||||
From: John Crispin <john@phrozen.org>
|
||||
Date: Fri, 2 Jul 2021 19:44:07 +0200
|
||||
Subject: [PATCH] nl80211: add support for BSS coloring
|
||||
|
||||
This patch adds support for BSS color collisions to the wireless subsystem.
|
||||
Add the required functionality to nl80211 that will notify about color
|
||||
collisions, triggering the color change and notifying when it is completed.
|
||||
|
||||
Co-developed-by: Lorenzo Bianconi <lorenzo@kernel.org>
|
||||
Signed-off-by: Lorenzo Bianconi <lorenzo@kernel.org>
|
||||
Signed-off-by: John Crispin <john@phrozen.org>
|
||||
Link: https://lore.kernel.org/r/500b3582aec8fe2c42ef46f3117b148cb7cbceb5.1625247619.git.lorenzo@kernel.org
|
||||
[remove unnecessary NULL initialisation]
|
||||
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
|
||||
---
|
||||
|
||||
--- a/include/net/cfg80211.h
|
||||
+++ b/include/net/cfg80211.h
|
||||
@@ -1252,6 +1252,27 @@ struct cfg80211_csa_settings {
|
||||
#define CFG80211_MAX_NUM_DIFFERENT_CHANNELS 10
|
||||
|
||||
/**
|
||||
+ * struct cfg80211_color_change_settings - color change settings
|
||||
+ *
|
||||
+ * Used for bss color change
|
||||
+ *
|
||||
+ * @beacon_color_change: beacon data while performing the color countdown
|
||||
+ * @counter_offsets_beacon: offsets of the counters within the beacon (tail)
|
||||
+ * @counter_offsets_presp: offsets of the counters within the probe response
|
||||
+ * @beacon_next: beacon data to be used after the color change
|
||||
+ * @count: number of beacons until the color change
|
||||
+ * @color: the color used after the change
|
||||
+ */
|
||||
+struct cfg80211_color_change_settings {
|
||||
+ struct cfg80211_beacon_data beacon_color_change;
|
||||
+ u16 counter_offset_beacon;
|
||||
+ u16 counter_offset_presp;
|
||||
+ struct cfg80211_beacon_data beacon_next;
|
||||
+ u8 count;
|
||||
+ u8 color;
|
||||
+};
|
||||
+
|
||||
+/**
|
||||
* struct iface_combination_params - input parameters for interface combinations
|
||||
*
|
||||
* Used to pass interface combination parameters
|
||||
@@ -3979,6 +4000,8 @@ struct mgmt_frame_regs {
|
||||
* This callback may sleep.
|
||||
* @reset_tid_config: Reset TID specific configuration for the peer, for the
|
||||
* given TIDs. This callback may sleep.
|
||||
+ *
|
||||
+ * @color_change: Initiate a color change.
|
||||
*/
|
||||
struct cfg80211_ops {
|
||||
int (*suspend)(struct wiphy *wiphy, struct cfg80211_wowlan *wow);
|
||||
@@ -4309,6 +4332,9 @@ struct cfg80211_ops {
|
||||
const u8 *peer, u8 tids);
|
||||
int (*set_sar_specs)(struct wiphy *wiphy,
|
||||
struct cfg80211_sar_specs *sar);
|
||||
+ int (*color_change)(struct wiphy *wiphy,
|
||||
+ struct net_device *dev,
|
||||
+ struct cfg80211_color_change_settings *params);
|
||||
};
|
||||
|
||||
/*
|
||||
@@ -8094,4 +8120,70 @@ void cfg80211_update_owe_info_event(stru
|
||||
*/
|
||||
void cfg80211_bss_flush(struct wiphy *wiphy);
|
||||
|
||||
+/**
|
||||
+ * cfg80211_bss_color_notify - notify about bss color event
|
||||
+ * @dev: network device
|
||||
+ * @gfp: allocation flags
|
||||
+ * @cmd: the actual event we want to notify
|
||||
+ * @count: the number of TBTTs until the color change happens
|
||||
+ * @color_bitmap: representations of the colors that the local BSS is aware of
|
||||
+ */
|
||||
+int cfg80211_bss_color_notify(struct net_device *dev, gfp_t gfp,
|
||||
+ enum nl80211_commands cmd, u8 count,
|
||||
+ u64 color_bitmap);
|
||||
+
|
||||
+/**
|
||||
+ * cfg80211_obss_color_collision_notify - notify about bss color collision
|
||||
+ * @dev: network device
|
||||
+ * @color_bitmap: representations of the colors that the local BSS is aware of
|
||||
+ */
|
||||
+static inline int cfg80211_obss_color_collision_notify(struct net_device *dev,
|
||||
+ u64 color_bitmap)
|
||||
+{
|
||||
+ return cfg80211_bss_color_notify(dev, GFP_KERNEL,
|
||||
+ NL80211_CMD_OBSS_COLOR_COLLISION,
|
||||
+ 0, color_bitmap);
|
||||
+}
|
||||
+
|
||||
+/**
|
||||
+ * cfg80211_color_change_started_notify - notify color change start
|
||||
+ * @dev: the device on which the color is switched
|
||||
+ * @count: the number of TBTTs until the color change happens
|
||||
+ *
|
||||
+ * Inform the userspace about the color change that has started.
|
||||
+ */
|
||||
+static inline int cfg80211_color_change_started_notify(struct net_device *dev,
|
||||
+ u8 count)
|
||||
+{
|
||||
+ return cfg80211_bss_color_notify(dev, GFP_KERNEL,
|
||||
+ NL80211_CMD_COLOR_CHANGE_STARTED,
|
||||
+ count, 0);
|
||||
+}
|
||||
+
|
||||
+/**
|
||||
+ * cfg80211_color_change_aborted_notify - notify color change abort
|
||||
+ * @dev: the device on which the color is switched
|
||||
+ *
|
||||
+ * Inform the userspace about the color change that has aborted.
|
||||
+ */
|
||||
+static inline int cfg80211_color_change_aborted_notify(struct net_device *dev)
|
||||
+{
|
||||
+ return cfg80211_bss_color_notify(dev, GFP_KERNEL,
|
||||
+ NL80211_CMD_COLOR_CHANGE_ABORTED,
|
||||
+ 0, 0);
|
||||
+}
|
||||
+
|
||||
+/**
|
||||
+ * cfg80211_color_change_notify - notify color change completion
|
||||
+ * @dev: the device on which the color was switched
|
||||
+ *
|
||||
+ * Inform the userspace about the color change that has completed.
|
||||
+ */
|
||||
+static inline int cfg80211_color_change_notify(struct net_device *dev)
|
||||
+{
|
||||
+ return cfg80211_bss_color_notify(dev, GFP_KERNEL,
|
||||
+ NL80211_CMD_COLOR_CHANGE_COMPLETED,
|
||||
+ 0, 0);
|
||||
+}
|
||||
+
|
||||
#endif /* __NET_CFG80211_H */
|
||||
--- a/include/uapi/linux/nl80211.h
|
||||
+++ b/include/uapi/linux/nl80211.h
|
||||
@@ -1185,6 +1185,21 @@
|
||||
* passed using %NL80211_ATTR_SAR_SPEC. %NL80211_ATTR_WIPHY is used to
|
||||
* specify the wiphy index to be applied to.
|
||||
*
|
||||
+ * @NL80211_CMD_OBSS_COLOR_COLLISION: This notification is sent out whenever
|
||||
+ * mac80211/drv detects a bss color collision.
|
||||
+ *
|
||||
+ * @NL80211_CMD_COLOR_CHANGE_REQUEST: This command is used to indicate that
|
||||
+ * userspace wants to change the BSS color.
|
||||
+ *
|
||||
+ * @NL80211_CMD_COLOR_CHANGE_STARTED: Notify userland, that a color change has
|
||||
+ * started
|
||||
+ *
|
||||
+ * @NL80211_CMD_COLOR_CHANGE_ABORTED: Notify userland, that the color change has
|
||||
+ * been aborted
|
||||
+ *
|
||||
+ * @NL80211_CMD_COLOR_CHANGE_COMPLETED: Notify userland that the color change
|
||||
+ * has completed
|
||||
+ *
|
||||
* @NL80211_CMD_MAX: highest used command number
|
||||
* @__NL80211_CMD_AFTER_LAST: internal use
|
||||
*/
|
||||
@@ -1417,6 +1432,14 @@ enum nl80211_commands {
|
||||
|
||||
NL80211_CMD_SET_SAR_SPECS,
|
||||
|
||||
+ NL80211_CMD_OBSS_COLOR_COLLISION,
|
||||
+
|
||||
+ NL80211_CMD_COLOR_CHANGE_REQUEST,
|
||||
+
|
||||
+ NL80211_CMD_COLOR_CHANGE_STARTED,
|
||||
+ NL80211_CMD_COLOR_CHANGE_ABORTED,
|
||||
+ NL80211_CMD_COLOR_CHANGE_COMPLETED,
|
||||
+
|
||||
/* add new commands above here */
|
||||
|
||||
/* used to define NL80211_CMD_MAX below */
|
||||
@@ -2560,6 +2583,16 @@ enum nl80211_commands {
|
||||
* disassoc events to indicate that an immediate reconnect to the AP
|
||||
* is desired.
|
||||
*
|
||||
+ * @NL80211_ATTR_OBSS_COLOR_BITMAP: bitmap of the u64 BSS colors for the
|
||||
+ * %NL80211_CMD_OBSS_COLOR_COLLISION event.
|
||||
+ *
|
||||
+ * @NL80211_ATTR_COLOR_CHANGE_COUNT: u8 attribute specifying the number of TBTT's
|
||||
+ * until the color switch event.
|
||||
+ * @NL80211_ATTR_COLOR_CHANGE_COLOR: u8 attribute specifying the color that we are
|
||||
+ * switching to
|
||||
+ * @NL80211_ATTR_COLOR_CHANGE_ELEMS: Nested set of attributes containing the IE
|
||||
+ * information for the time while performing a color switch.
|
||||
+ *
|
||||
* @NUM_NL80211_ATTR: total number of nl80211_attrs available
|
||||
* @NL80211_ATTR_MAX: highest attribute number currently defined
|
||||
* @__NL80211_ATTR_AFTER_LAST: internal use
|
||||
@@ -3057,6 +3090,12 @@ enum nl80211_attrs {
|
||||
|
||||
NL80211_ATTR_DISABLE_HE,
|
||||
|
||||
+ NL80211_ATTR_OBSS_COLOR_BITMAP,
|
||||
+
|
||||
+ NL80211_ATTR_COLOR_CHANGE_COUNT,
|
||||
+ NL80211_ATTR_COLOR_CHANGE_COLOR,
|
||||
+ NL80211_ATTR_COLOR_CHANGE_ELEMS,
|
||||
+
|
||||
/* add attributes here, update the policy in nl80211.c */
|
||||
|
||||
__NL80211_ATTR_AFTER_LAST,
|
||||
@@ -5950,6 +5989,9 @@ enum nl80211_feature_flags {
|
||||
* frame protection for all management frames exchanged during the
|
||||
* negotiation and range measurement procedure.
|
||||
*
|
||||
+ * @NL80211_EXT_FEATURE_BSS_COLOR: The driver supports BSS color collision
|
||||
+ * detection and change announcemnts.
|
||||
+ *
|
||||
* @NUM_NL80211_EXT_FEATURES: number of extended features.
|
||||
* @MAX_NL80211_EXT_FEATURES: highest extended feature index.
|
||||
*/
|
||||
@@ -6014,6 +6056,7 @@ enum nl80211_ext_feature_index {
|
||||
NL80211_EXT_FEATURE_SECURE_LTF,
|
||||
NL80211_EXT_FEATURE_SECURE_RTT,
|
||||
NL80211_EXT_FEATURE_PROT_RANGE_NEGO_AND_MEASURE,
|
||||
+ NL80211_EXT_FEATURE_BSS_COLOR,
|
||||
|
||||
/* add new features before the definition below */
|
||||
NUM_NL80211_EXT_FEATURES,
|
||||
--- a/net/wireless/nl80211.c
|
||||
+++ b/net/wireless/nl80211.c
|
||||
@@ -753,6 +753,10 @@ static const struct nla_policy nl80211_p
|
||||
NL80211_SAE_PWE_BOTH),
|
||||
[NL80211_ATTR_SAR_SPEC] = NLA_POLICY_NESTED(sar_policy),
|
||||
[NL80211_ATTR_RECONNECT_REQUESTED] = { .type = NLA_REJECT },
|
||||
+ [NL80211_ATTR_OBSS_COLOR_BITMAP] = { .type = NLA_U64 },
|
||||
+ [NL80211_ATTR_COLOR_CHANGE_COUNT] = { .type = NLA_U8 },
|
||||
+ [NL80211_ATTR_COLOR_CHANGE_COLOR] = { .type = NLA_U8 },
|
||||
+ [NL80211_ATTR_COLOR_CHANGE_ELEMS] = NLA_POLICY_NESTED(nl80211_policy),
|
||||
};
|
||||
|
||||
/* policy for the key attributes */
|
||||
@@ -14677,6 +14681,106 @@ bad_tid_conf:
|
||||
return ret;
|
||||
}
|
||||
|
||||
+static int nl80211_color_change(struct sk_buff *skb, struct genl_info *info)
|
||||
+{
|
||||
+ struct cfg80211_registered_device *rdev = info->user_ptr[0];
|
||||
+ struct cfg80211_color_change_settings params = {};
|
||||
+ struct net_device *dev = info->user_ptr[1];
|
||||
+ struct wireless_dev *wdev = dev->ieee80211_ptr;
|
||||
+ struct nlattr **tb;
|
||||
+ u16 offset;
|
||||
+ int err;
|
||||
+
|
||||
+ if (!rdev->ops->color_change)
|
||||
+ return -EOPNOTSUPP;
|
||||
+
|
||||
+ if (!wiphy_ext_feature_isset(&rdev->wiphy,
|
||||
+ NL80211_EXT_FEATURE_BSS_COLOR))
|
||||
+ return -EOPNOTSUPP;
|
||||
+
|
||||
+ if (wdev->iftype != NL80211_IFTYPE_AP)
|
||||
+ return -EOPNOTSUPP;
|
||||
+
|
||||
+ if (!info->attrs[NL80211_ATTR_COLOR_CHANGE_COUNT] ||
|
||||
+ !info->attrs[NL80211_ATTR_COLOR_CHANGE_COLOR] ||
|
||||
+ !info->attrs[NL80211_ATTR_COLOR_CHANGE_ELEMS])
|
||||
+ return -EINVAL;
|
||||
+
|
||||
+ params.count = nla_get_u8(info->attrs[NL80211_ATTR_COLOR_CHANGE_COUNT]);
|
||||
+ params.color = nla_get_u8(info->attrs[NL80211_ATTR_COLOR_CHANGE_COLOR]);
|
||||
+
|
||||
+ err = nl80211_parse_beacon(rdev, info->attrs, ¶ms.beacon_next);
|
||||
+ if (err)
|
||||
+ return err;
|
||||
+
|
||||
+ tb = kcalloc(NL80211_ATTR_MAX + 1, sizeof(*tb), GFP_KERNEL);
|
||||
+ if (!tb)
|
||||
+ return -ENOMEM;
|
||||
+
|
||||
+ err = nla_parse_nested(tb, NL80211_ATTR_MAX,
|
||||
+ info->attrs[NL80211_ATTR_COLOR_CHANGE_ELEMS],
|
||||
+ nl80211_policy, info->extack);
|
||||
+ if (err)
|
||||
+ goto out;
|
||||
+
|
||||
+ err = nl80211_parse_beacon(rdev, tb, ¶ms.beacon_color_change);
|
||||
+ if (err)
|
||||
+ goto out;
|
||||
+
|
||||
+ if (!tb[NL80211_ATTR_CNTDWN_OFFS_BEACON]) {
|
||||
+ err = -EINVAL;
|
||||
+ goto out;
|
||||
+ }
|
||||
+
|
||||
+ if (nla_len(tb[NL80211_ATTR_CNTDWN_OFFS_BEACON]) != sizeof(u16)) {
|
||||
+ err = -EINVAL;
|
||||
+ goto out;
|
||||
+ }
|
||||
+
|
||||
+ offset = nla_get_u16(tb[NL80211_ATTR_CNTDWN_OFFS_BEACON]);
|
||||
+ if (offset >= params.beacon_color_change.tail_len) {
|
||||
+ err = -EINVAL;
|
||||
+ goto out;
|
||||
+ }
|
||||
+
|
||||
+ if (params.beacon_color_change.tail[offset] != params.count) {
|
||||
+ err = -EINVAL;
|
||||
+ goto out;
|
||||
+ }
|
||||
+
|
||||
+ params.counter_offset_beacon = offset;
|
||||
+
|
||||
+ if (tb[NL80211_ATTR_CNTDWN_OFFS_PRESP]) {
|
||||
+ if (nla_len(tb[NL80211_ATTR_CNTDWN_OFFS_PRESP]) !=
|
||||
+ sizeof(u16)) {
|
||||
+ err = -EINVAL;
|
||||
+ goto out;
|
||||
+ }
|
||||
+
|
||||
+ offset = nla_get_u16(tb[NL80211_ATTR_CNTDWN_OFFS_PRESP]);
|
||||
+ if (offset >= params.beacon_color_change.probe_resp_len) {
|
||||
+ err = -EINVAL;
|
||||
+ goto out;
|
||||
+ }
|
||||
+
|
||||
+ if (params.beacon_color_change.probe_resp[offset] !=
|
||||
+ params.count) {
|
||||
+ err = -EINVAL;
|
||||
+ goto out;
|
||||
+ }
|
||||
+
|
||||
+ params.counter_offset_presp = offset;
|
||||
+ }
|
||||
+
|
||||
+ wdev_lock(wdev);
|
||||
+ err = rdev_color_change(rdev, dev, ¶ms);
|
||||
+ wdev_unlock(wdev);
|
||||
+
|
||||
+out:
|
||||
+ kfree(tb);
|
||||
+ return err;
|
||||
+}
|
||||
+
|
||||
#define NL80211_FLAG_NEED_WIPHY 0x01
|
||||
#define NL80211_FLAG_NEED_NETDEV 0x02
|
||||
#define NL80211_FLAG_NEED_RTNL 0x04
|
||||
@@ -15758,6 +15862,14 @@ static const struct genl_small_ops nl802
|
||||
.internal_flags = NL80211_FLAG_NEED_WIPHY |
|
||||
NL80211_FLAG_NEED_RTNL,
|
||||
},
|
||||
+ {
|
||||
+ .cmd = NL80211_CMD_COLOR_CHANGE_REQUEST,
|
||||
+ .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
|
||||
+ .doit = nl80211_color_change,
|
||||
+ .flags = GENL_UNS_ADMIN_PERM,
|
||||
+ .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
|
||||
+ NL80211_FLAG_NEED_RTNL,
|
||||
+ },
|
||||
};
|
||||
|
||||
static struct genl_family nl80211_fam __genl_ro_after_init = {
|
||||
@@ -17384,6 +17496,51 @@ void cfg80211_ch_switch_started_notify(s
|
||||
}
|
||||
EXPORT_SYMBOL(cfg80211_ch_switch_started_notify);
|
||||
|
||||
+int cfg80211_bss_color_notify(struct net_device *dev, gfp_t gfp,
|
||||
+ enum nl80211_commands cmd, u8 count,
|
||||
+ u64 color_bitmap)
|
||||
+{
|
||||
+ struct wireless_dev *wdev = dev->ieee80211_ptr;
|
||||
+ struct wiphy *wiphy = wdev->wiphy;
|
||||
+ struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
|
||||
+ struct sk_buff *msg;
|
||||
+ void *hdr;
|
||||
+
|
||||
+ ASSERT_WDEV_LOCK(wdev);
|
||||
+
|
||||
+ trace_cfg80211_bss_color_notify(dev, cmd, count, color_bitmap);
|
||||
+
|
||||
+ msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp);
|
||||
+ if (!msg)
|
||||
+ return -ENOMEM;
|
||||
+
|
||||
+ hdr = nl80211hdr_put(msg, 0, 0, 0, cmd);
|
||||
+ if (!hdr)
|
||||
+ goto nla_put_failure;
|
||||
+
|
||||
+ if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex))
|
||||
+ goto nla_put_failure;
|
||||
+
|
||||
+ if (cmd == NL80211_CMD_COLOR_CHANGE_STARTED &&
|
||||
+ nla_put_u32(msg, NL80211_ATTR_COLOR_CHANGE_COUNT, count))
|
||||
+ goto nla_put_failure;
|
||||
+
|
||||
+ if (cmd == NL80211_CMD_OBSS_COLOR_COLLISION &&
|
||||
+ nla_put_u64_64bit(msg, NL80211_ATTR_OBSS_COLOR_BITMAP,
|
||||
+ color_bitmap, NL80211_ATTR_PAD))
|
||||
+ goto nla_put_failure;
|
||||
+
|
||||
+ genlmsg_end(msg, hdr);
|
||||
+
|
||||
+ return genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy),
|
||||
+ msg, 0, NL80211_MCGRP_MLME, gfp);
|
||||
+
|
||||
+nla_put_failure:
|
||||
+ nlmsg_free(msg);
|
||||
+ return -EINVAL;
|
||||
+}
|
||||
+EXPORT_SYMBOL(cfg80211_bss_color_notify);
|
||||
+
|
||||
void
|
||||
nl80211_radar_notify(struct cfg80211_registered_device *rdev,
|
||||
const struct cfg80211_chan_def *chandef,
|
||||
--- a/net/wireless/rdev-ops.h
|
||||
+++ b/net/wireless/rdev-ops.h
|
||||
@@ -1368,4 +1368,17 @@ static inline int rdev_set_sar_specs(str
|
||||
return ret;
|
||||
}
|
||||
|
||||
+static inline int rdev_color_change(struct cfg80211_registered_device *rdev,
|
||||
+ struct net_device *dev,
|
||||
+ struct cfg80211_color_change_settings *params)
|
||||
+{
|
||||
+ int ret;
|
||||
+
|
||||
+ trace_rdev_color_change(&rdev->wiphy, dev, params);
|
||||
+ ret = rdev->ops->color_change(&rdev->wiphy, dev, params);
|
||||
+ trace_rdev_return_int(&rdev->wiphy, ret);
|
||||
+
|
||||
+ return ret;
|
||||
+}
|
||||
+
|
||||
#endif /* __CFG80211_RDEV_OPS */
|
||||
--- a/net/wireless/trace.h
|
||||
+++ b/net/wireless/trace.h
|
||||
@@ -3570,6 +3570,52 @@ TRACE_EVENT(rdev_set_sar_specs,
|
||||
WIPHY_PR_ARG, __entry->type, __entry->num)
|
||||
);
|
||||
|
||||
+TRACE_EVENT(rdev_color_change,
|
||||
+ TP_PROTO(struct wiphy *wiphy, struct net_device *netdev,
|
||||
+ struct cfg80211_color_change_settings *params),
|
||||
+ TP_ARGS(wiphy, netdev, params),
|
||||
+ TP_STRUCT__entry(
|
||||
+ WIPHY_ENTRY
|
||||
+ NETDEV_ENTRY
|
||||
+ __field(u8, count)
|
||||
+ __field(u16, bcn_ofs)
|
||||
+ __field(u16, pres_ofs)
|
||||
+ ),
|
||||
+ TP_fast_assign(
|
||||
+ WIPHY_ASSIGN;
|
||||
+ NETDEV_ASSIGN;
|
||||
+ __entry->count = params->count;
|
||||
+ __entry->bcn_ofs = params->counter_offset_beacon;
|
||||
+ __entry->pres_ofs = params->counter_offset_presp;
|
||||
+ ),
|
||||
+ TP_printk(WIPHY_PR_FMT ", " NETDEV_PR_FMT
|
||||
+ ", count: %u",
|
||||
+ WIPHY_PR_ARG, NETDEV_PR_ARG,
|
||||
+ __entry->count)
|
||||
+);
|
||||
+
|
||||
+TRACE_EVENT(cfg80211_bss_color_notify,
|
||||
+ TP_PROTO(struct net_device *netdev,
|
||||
+ enum nl80211_commands cmd,
|
||||
+ u8 count, u64 color_bitmap),
|
||||
+ TP_ARGS(netdev, cmd, count, color_bitmap),
|
||||
+ TP_STRUCT__entry(
|
||||
+ NETDEV_ENTRY
|
||||
+ __field(enum nl80211_bss_scan_width, cmd)
|
||||
+ __field(u8, count)
|
||||
+ __field(u64, color_bitmap)
|
||||
+ ),
|
||||
+ TP_fast_assign(
|
||||
+ NETDEV_ASSIGN;
|
||||
+ __entry->cmd = cmd;
|
||||
+ __entry->count = count;
|
||||
+ __entry->color_bitmap = color_bitmap;
|
||||
+ ),
|
||||
+ TP_printk(NETDEV_PR_FMT ", cmd: %x, count: %u, bitmap: %llx",
|
||||
+ NETDEV_PR_ARG, __entry->cmd, __entry->count,
|
||||
+ __entry->color_bitmap)
|
||||
+);
|
||||
+
|
||||
#endif /* !__RDEV_OPS_TRACE || TRACE_HEADER_MULTI_READ */
|
||||
|
||||
#undef TRACE_INCLUDE_PATH
|
||||
@ -0,0 +1,524 @@
|
||||
From: John Crispin <john@phrozen.org>
|
||||
Date: Fri, 2 Jul 2021 19:44:08 +0200
|
||||
Subject: [PATCH] mac80211: add support for BSS color change
|
||||
|
||||
The color change announcement is very similar to how CSA works where
|
||||
we have an IE that includes a counter. When the counter hits 0, the new
|
||||
color is applied via an updated beacon.
|
||||
|
||||
This patch makes the CSA counter functionality reusable, rather than
|
||||
implementing it again. This also allows for future reuse incase support
|
||||
for other counter IEs gets added.
|
||||
|
||||
Co-developed-by: Lorenzo Bianconi <lorenzo@kernel.org>
|
||||
Signed-off-by: Lorenzo Bianconi <lorenzo@kernel.org>
|
||||
Signed-off-by: John Crispin <john@phrozen.org>
|
||||
Link: https://lore.kernel.org/r/057c1e67b82bee561ea44ce6a45a8462d3da6995.1625247619.git.lorenzo@kernel.org
|
||||
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
|
||||
---
|
||||
|
||||
--- a/include/net/mac80211.h
|
||||
+++ b/include/net/mac80211.h
|
||||
@@ -1710,6 +1710,10 @@ enum ieee80211_offload_flags {
|
||||
* protected by fq->lock.
|
||||
* @offload_flags: 802.3 -> 802.11 enapsulation offload flags, see
|
||||
* &enum ieee80211_offload_flags.
|
||||
+ * @color_change_active: marks whether a color change is ongoing. Internally it is
|
||||
+ * write-protected by sdata_lock and local->mtx so holding either is fine
|
||||
+ * for read access.
|
||||
+ * @color_change_color: the bss color that will be used after the change.
|
||||
*/
|
||||
struct ieee80211_vif {
|
||||
enum nl80211_iftype type;
|
||||
@@ -1738,6 +1742,9 @@ struct ieee80211_vif {
|
||||
|
||||
bool txqs_stopped[IEEE80211_NUM_ACS];
|
||||
|
||||
+ bool color_change_active;
|
||||
+ u8 color_change_color;
|
||||
+
|
||||
/* must be last */
|
||||
u8 drv_priv[] __aligned(sizeof(void *));
|
||||
};
|
||||
@@ -4982,6 +4989,16 @@ void ieee80211_csa_finish(struct ieee802
|
||||
bool ieee80211_beacon_cntdwn_is_complete(struct ieee80211_vif *vif);
|
||||
|
||||
/**
|
||||
+ * ieee80211_color_change_finish - notify mac80211 about color change
|
||||
+ * @vif: &struct ieee80211_vif pointer from the add_interface callback.
|
||||
+ *
|
||||
+ * After a color change announcement was scheduled and the counter in this
|
||||
+ * announcement hits 1, this function must be called by the driver to
|
||||
+ * notify mac80211 that the color can be changed
|
||||
+ */
|
||||
+void ieee80211_color_change_finish(struct ieee80211_vif *vif);
|
||||
+
|
||||
+/**
|
||||
* ieee80211_proberesp_get - retrieve a Probe Response template
|
||||
* @hw: pointer obtained from ieee80211_alloc_hw().
|
||||
* @vif: &struct ieee80211_vif pointer from the add_interface callback.
|
||||
@@ -6726,6 +6743,18 @@ ieee80211_get_unsol_bcast_probe_resp_tmp
|
||||
struct ieee80211_vif *vif);
|
||||
|
||||
/**
|
||||
+ * ieeee80211_obss_color_collision_notify - notify userland about a BSS color
|
||||
+ * collision.
|
||||
+ *
|
||||
+ * @vif: &struct ieee80211_vif pointer from the add_interface callback.
|
||||
+ * @color_bitmap: a 64 bit bitmap representing the colors that the local BSS is
|
||||
+ * aware of.
|
||||
+ */
|
||||
+void
|
||||
+ieeee80211_obss_color_collision_notify(struct ieee80211_vif *vif,
|
||||
+ u64 color_bitmap);
|
||||
+
|
||||
+/**
|
||||
* ieee80211_is_tx_data - check if frame is a data frame
|
||||
*
|
||||
* The function is used to check if a frame is a data frame. Frames with
|
||||
--- a/net/mac80211/cfg.c
|
||||
+++ b/net/mac80211/cfg.c
|
||||
@@ -827,9 +827,11 @@ static int ieee80211_set_monitor_channel
|
||||
return ret;
|
||||
}
|
||||
|
||||
-static int ieee80211_set_probe_resp(struct ieee80211_sub_if_data *sdata,
|
||||
- const u8 *resp, size_t resp_len,
|
||||
- const struct ieee80211_csa_settings *csa)
|
||||
+static int
|
||||
+ieee80211_set_probe_resp(struct ieee80211_sub_if_data *sdata,
|
||||
+ const u8 *resp, size_t resp_len,
|
||||
+ const struct ieee80211_csa_settings *csa,
|
||||
+ const struct ieee80211_color_change_settings *cca)
|
||||
{
|
||||
struct probe_resp *new, *old;
|
||||
|
||||
@@ -849,6 +851,8 @@ static int ieee80211_set_probe_resp(stru
|
||||
memcpy(new->cntdwn_counter_offsets, csa->counter_offsets_presp,
|
||||
csa->n_counter_offsets_presp *
|
||||
sizeof(new->cntdwn_counter_offsets[0]));
|
||||
+ else if (cca)
|
||||
+ new->cntdwn_counter_offsets[0] = cca->counter_offset_presp;
|
||||
|
||||
rcu_assign_pointer(sdata->u.ap.probe_resp, new);
|
||||
if (old)
|
||||
@@ -954,7 +958,8 @@ static int ieee80211_set_ftm_responder_p
|
||||
|
||||
static int ieee80211_assign_beacon(struct ieee80211_sub_if_data *sdata,
|
||||
struct cfg80211_beacon_data *params,
|
||||
- const struct ieee80211_csa_settings *csa)
|
||||
+ const struct ieee80211_csa_settings *csa,
|
||||
+ const struct ieee80211_color_change_settings *cca)
|
||||
{
|
||||
struct beacon_data *new, *old;
|
||||
int new_head_len, new_tail_len;
|
||||
@@ -1003,6 +1008,9 @@ static int ieee80211_assign_beacon(struc
|
||||
memcpy(new->cntdwn_counter_offsets, csa->counter_offsets_beacon,
|
||||
csa->n_counter_offsets_beacon *
|
||||
sizeof(new->cntdwn_counter_offsets[0]));
|
||||
+ } else if (cca) {
|
||||
+ new->cntdwn_current_counter = cca->count;
|
||||
+ new->cntdwn_counter_offsets[0] = cca->counter_offset_beacon;
|
||||
}
|
||||
|
||||
/* copy in head */
|
||||
@@ -1019,7 +1027,7 @@ static int ieee80211_assign_beacon(struc
|
||||
memcpy(new->tail, old->tail, new_tail_len);
|
||||
|
||||
err = ieee80211_set_probe_resp(sdata, params->probe_resp,
|
||||
- params->probe_resp_len, csa);
|
||||
+ params->probe_resp_len, csa, cca);
|
||||
if (err < 0) {
|
||||
kfree(new);
|
||||
return err;
|
||||
@@ -1176,7 +1184,7 @@ static int ieee80211_start_ap(struct wip
|
||||
if (ieee80211_hw_check(&local->hw, HAS_RATE_CONTROL))
|
||||
sdata->vif.bss_conf.beacon_tx_rate = params->beacon_rate;
|
||||
|
||||
- err = ieee80211_assign_beacon(sdata, ¶ms->beacon, NULL);
|
||||
+ err = ieee80211_assign_beacon(sdata, ¶ms->beacon, NULL, NULL);
|
||||
if (err < 0)
|
||||
goto error;
|
||||
changed |= err;
|
||||
@@ -1231,17 +1239,17 @@ static int ieee80211_change_beacon(struc
|
||||
sdata = IEEE80211_DEV_TO_SUB_IF(dev);
|
||||
sdata_assert_lock(sdata);
|
||||
|
||||
- /* don't allow changing the beacon while CSA is in place - offset
|
||||
+ /* don't allow changing the beacon while a countdown is in place - offset
|
||||
* of channel switch counter may change
|
||||
*/
|
||||
- if (sdata->vif.csa_active)
|
||||
+ if (sdata->vif.csa_active || sdata->vif.color_change_active)
|
||||
return -EBUSY;
|
||||
|
||||
old = sdata_dereference(sdata->u.ap.beacon, sdata);
|
||||
if (!old)
|
||||
return -ENOENT;
|
||||
|
||||
- err = ieee80211_assign_beacon(sdata, params, NULL);
|
||||
+ err = ieee80211_assign_beacon(sdata, params, NULL, NULL);
|
||||
if (err < 0)
|
||||
return err;
|
||||
ieee80211_bss_info_change_notify(sdata, err);
|
||||
@@ -3174,7 +3182,7 @@ static int ieee80211_set_after_csa_beaco
|
||||
switch (sdata->vif.type) {
|
||||
case NL80211_IFTYPE_AP:
|
||||
err = ieee80211_assign_beacon(sdata, sdata->u.ap.next_beacon,
|
||||
- NULL);
|
||||
+ NULL, NULL);
|
||||
kfree(sdata->u.ap.next_beacon);
|
||||
sdata->u.ap.next_beacon = NULL;
|
||||
|
||||
@@ -3340,7 +3348,7 @@ static int ieee80211_set_csa_beacon(stru
|
||||
csa.n_counter_offsets_presp = params->n_counter_offsets_presp;
|
||||
csa.count = params->count;
|
||||
|
||||
- err = ieee80211_assign_beacon(sdata, ¶ms->beacon_csa, &csa);
|
||||
+ err = ieee80211_assign_beacon(sdata, ¶ms->beacon_csa, &csa, NULL);
|
||||
if (err < 0) {
|
||||
kfree(sdata->u.ap.next_beacon);
|
||||
return err;
|
||||
@@ -3428,6 +3436,15 @@ static int ieee80211_set_csa_beacon(stru
|
||||
return 0;
|
||||
}
|
||||
|
||||
+static void ieee80211_color_change_abort(struct ieee80211_sub_if_data *sdata)
|
||||
+{
|
||||
+ sdata->vif.color_change_active = false;
|
||||
+ kfree(sdata->u.ap.next_beacon);
|
||||
+ sdata->u.ap.next_beacon = NULL;
|
||||
+
|
||||
+ cfg80211_color_change_aborted_notify(sdata->dev);
|
||||
+}
|
||||
+
|
||||
static int
|
||||
__ieee80211_channel_switch(struct wiphy *wiphy, struct net_device *dev,
|
||||
struct cfg80211_csa_settings *params)
|
||||
@@ -3496,6 +3513,10 @@ __ieee80211_channel_switch(struct wiphy
|
||||
goto out;
|
||||
}
|
||||
|
||||
+ /* if there is a color change in progress, abort it */
|
||||
+ if (sdata->vif.color_change_active)
|
||||
+ ieee80211_color_change_abort(sdata);
|
||||
+
|
||||
err = ieee80211_set_csa_beacon(sdata, params, &changed);
|
||||
if (err) {
|
||||
ieee80211_vif_unreserve_chanctx(sdata);
|
||||
@@ -4147,6 +4168,196 @@ static int ieee80211_set_sar_specs(struc
|
||||
return local->ops->set_sar_specs(&local->hw, sar);
|
||||
}
|
||||
|
||||
+static int
|
||||
+ieee80211_set_after_color_change_beacon(struct ieee80211_sub_if_data *sdata,
|
||||
+ u32 *changed)
|
||||
+{
|
||||
+ switch (sdata->vif.type) {
|
||||
+ case NL80211_IFTYPE_AP: {
|
||||
+ int ret;
|
||||
+
|
||||
+ ret = ieee80211_assign_beacon(sdata, sdata->u.ap.next_beacon,
|
||||
+ NULL, NULL);
|
||||
+ kfree(sdata->u.ap.next_beacon);
|
||||
+ sdata->u.ap.next_beacon = NULL;
|
||||
+
|
||||
+ if (ret < 0)
|
||||
+ return ret;
|
||||
+
|
||||
+ *changed |= ret;
|
||||
+ break;
|
||||
+ }
|
||||
+ default:
|
||||
+ WARN_ON_ONCE(1);
|
||||
+ return -EINVAL;
|
||||
+ }
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static int
|
||||
+ieee80211_set_color_change_beacon(struct ieee80211_sub_if_data *sdata,
|
||||
+ struct cfg80211_color_change_settings *params,
|
||||
+ u32 *changed)
|
||||
+{
|
||||
+ struct ieee80211_color_change_settings color_change = {};
|
||||
+ int err;
|
||||
+
|
||||
+ switch (sdata->vif.type) {
|
||||
+ case NL80211_IFTYPE_AP:
|
||||
+ sdata->u.ap.next_beacon =
|
||||
+ cfg80211_beacon_dup(¶ms->beacon_next);
|
||||
+ if (!sdata->u.ap.next_beacon)
|
||||
+ return -ENOMEM;
|
||||
+
|
||||
+ if (params->count <= 1)
|
||||
+ break;
|
||||
+
|
||||
+ color_change.counter_offset_beacon =
|
||||
+ params->counter_offset_beacon;
|
||||
+ color_change.counter_offset_presp =
|
||||
+ params->counter_offset_presp;
|
||||
+ color_change.count = params->count;
|
||||
+
|
||||
+ err = ieee80211_assign_beacon(sdata, ¶ms->beacon_color_change,
|
||||
+ NULL, &color_change);
|
||||
+ if (err < 0) {
|
||||
+ kfree(sdata->u.ap.next_beacon);
|
||||
+ return err;
|
||||
+ }
|
||||
+ *changed |= err;
|
||||
+ break;
|
||||
+ default:
|
||||
+ return -EOPNOTSUPP;
|
||||
+ }
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static void
|
||||
+ieee80211_color_change_bss_config_notify(struct ieee80211_sub_if_data *sdata,
|
||||
+ u8 color, int enable, u32 changed)
|
||||
+{
|
||||
+ sdata->vif.bss_conf.he_bss_color.color = color;
|
||||
+ sdata->vif.bss_conf.he_bss_color.enabled = enable;
|
||||
+ changed |= BSS_CHANGED_HE_BSS_COLOR;
|
||||
+
|
||||
+ ieee80211_bss_info_change_notify(sdata, changed);
|
||||
+}
|
||||
+
|
||||
+static int ieee80211_color_change_finalize(struct ieee80211_sub_if_data *sdata)
|
||||
+{
|
||||
+ struct ieee80211_local *local = sdata->local;
|
||||
+ u32 changed = 0;
|
||||
+ int err;
|
||||
+
|
||||
+ sdata_assert_lock(sdata);
|
||||
+ lockdep_assert_held(&local->mtx);
|
||||
+
|
||||
+ sdata->vif.color_change_active = false;
|
||||
+
|
||||
+ err = ieee80211_set_after_color_change_beacon(sdata, &changed);
|
||||
+ if (err) {
|
||||
+ cfg80211_color_change_aborted_notify(sdata->dev);
|
||||
+ return err;
|
||||
+ }
|
||||
+
|
||||
+ ieee80211_color_change_bss_config_notify(sdata,
|
||||
+ sdata->vif.color_change_color,
|
||||
+ 1, changed);
|
||||
+ cfg80211_color_change_notify(sdata->dev);
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+void ieee80211_color_change_finalize_work(struct work_struct *work)
|
||||
+{
|
||||
+ struct ieee80211_sub_if_data *sdata =
|
||||
+ container_of(work, struct ieee80211_sub_if_data,
|
||||
+ color_change_finalize_work);
|
||||
+ struct ieee80211_local *local = sdata->local;
|
||||
+
|
||||
+ sdata_lock(sdata);
|
||||
+ mutex_lock(&local->mtx);
|
||||
+
|
||||
+ /* AP might have been stopped while waiting for the lock. */
|
||||
+ if (!sdata->vif.color_change_active)
|
||||
+ goto unlock;
|
||||
+
|
||||
+ if (!ieee80211_sdata_running(sdata))
|
||||
+ goto unlock;
|
||||
+
|
||||
+ ieee80211_color_change_finalize(sdata);
|
||||
+
|
||||
+unlock:
|
||||
+ mutex_unlock(&local->mtx);
|
||||
+ sdata_unlock(sdata);
|
||||
+}
|
||||
+
|
||||
+void ieee80211_color_change_finish(struct ieee80211_vif *vif)
|
||||
+{
|
||||
+ struct ieee80211_sub_if_data *sdata = vif_to_sdata(vif);
|
||||
+
|
||||
+ ieee80211_queue_work(&sdata->local->hw,
|
||||
+ &sdata->color_change_finalize_work);
|
||||
+}
|
||||
+EXPORT_SYMBOL_GPL(ieee80211_color_change_finish);
|
||||
+
|
||||
+void
|
||||
+ieeee80211_obss_color_collision_notify(struct ieee80211_vif *vif,
|
||||
+ u64 color_bitmap)
|
||||
+{
|
||||
+ struct ieee80211_sub_if_data *sdata = vif_to_sdata(vif);
|
||||
+
|
||||
+ if (sdata->vif.color_change_active || sdata->vif.csa_active)
|
||||
+ return;
|
||||
+
|
||||
+ cfg80211_obss_color_collision_notify(sdata->dev, color_bitmap);
|
||||
+}
|
||||
+EXPORT_SYMBOL_GPL(ieeee80211_obss_color_collision_notify);
|
||||
+
|
||||
+static int
|
||||
+ieee80211_color_change(struct wiphy *wiphy, struct net_device *dev,
|
||||
+ struct cfg80211_color_change_settings *params)
|
||||
+{
|
||||
+ struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
|
||||
+ struct ieee80211_local *local = sdata->local;
|
||||
+ u32 changed = 0;
|
||||
+ int err;
|
||||
+
|
||||
+ sdata_assert_lock(sdata);
|
||||
+
|
||||
+ mutex_lock(&local->mtx);
|
||||
+
|
||||
+ /* don't allow another color change if one is already active or if csa
|
||||
+ * is active
|
||||
+ */
|
||||
+ if (sdata->vif.color_change_active || sdata->vif.csa_active) {
|
||||
+ err = -EBUSY;
|
||||
+ goto out;
|
||||
+ }
|
||||
+
|
||||
+ err = ieee80211_set_color_change_beacon(sdata, params, &changed);
|
||||
+ if (err)
|
||||
+ goto out;
|
||||
+
|
||||
+ sdata->vif.color_change_active = true;
|
||||
+ sdata->vif.color_change_color = params->color;
|
||||
+
|
||||
+ cfg80211_color_change_started_notify(sdata->dev, params->count);
|
||||
+
|
||||
+ if (changed)
|
||||
+ ieee80211_color_change_bss_config_notify(sdata, 0, 0, changed);
|
||||
+ else
|
||||
+ /* if the beacon didn't change, we can finalize immediately */
|
||||
+ ieee80211_color_change_finalize(sdata);
|
||||
+
|
||||
+out:
|
||||
+ mutex_unlock(&local->mtx);
|
||||
+
|
||||
+ return err;
|
||||
+}
|
||||
+
|
||||
const struct cfg80211_ops mac80211_config_ops = {
|
||||
.add_virtual_intf = ieee80211_add_iface,
|
||||
.del_virtual_intf = ieee80211_del_iface,
|
||||
@@ -4251,4 +4462,5 @@ const struct cfg80211_ops mac80211_confi
|
||||
.set_tid_config = ieee80211_set_tid_config,
|
||||
.reset_tid_config = ieee80211_reset_tid_config,
|
||||
.set_sar_specs = ieee80211_set_sar_specs,
|
||||
+ .color_change = ieee80211_color_change,
|
||||
};
|
||||
--- a/net/mac80211/ieee80211_i.h
|
||||
+++ b/net/mac80211/ieee80211_i.h
|
||||
@@ -248,6 +248,12 @@ struct ieee80211_csa_settings {
|
||||
u8 count;
|
||||
};
|
||||
|
||||
+struct ieee80211_color_change_settings {
|
||||
+ u16 counter_offset_beacon;
|
||||
+ u16 counter_offset_presp;
|
||||
+ u8 count;
|
||||
+};
|
||||
+
|
||||
struct beacon_data {
|
||||
u8 *head, *tail;
|
||||
int head_len, tail_len;
|
||||
@@ -932,6 +938,8 @@ struct ieee80211_sub_if_data {
|
||||
bool csa_block_tx; /* write-protected by sdata_lock and local->mtx */
|
||||
struct cfg80211_chan_def csa_chandef;
|
||||
|
||||
+ struct work_struct color_change_finalize_work;
|
||||
+
|
||||
struct list_head assigned_chanctx_list; /* protected by chanctx_mtx */
|
||||
struct list_head reserved_chanctx_list; /* protected by chanctx_mtx */
|
||||
|
||||
@@ -1900,6 +1908,9 @@ void ieee80211_csa_finalize_work(struct
|
||||
int ieee80211_channel_switch(struct wiphy *wiphy, struct net_device *dev,
|
||||
struct cfg80211_csa_settings *params);
|
||||
|
||||
+/* color change handling */
|
||||
+void ieee80211_color_change_finalize_work(struct work_struct *work);
|
||||
+
|
||||
/* interface handling */
|
||||
#define MAC80211_SUPPORTED_FEATURES_TX (NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM | \
|
||||
NETIF_F_HW_CSUM | NETIF_F_SG | \
|
||||
--- a/net/mac80211/iface.c
|
||||
+++ b/net/mac80211/iface.c
|
||||
@@ -465,6 +465,7 @@ static void ieee80211_do_stop(struct iee
|
||||
sdata_unlock(sdata);
|
||||
|
||||
cancel_work_sync(&sdata->csa_finalize_work);
|
||||
+ cancel_work_sync(&sdata->color_change_finalize_work);
|
||||
|
||||
cancel_delayed_work_sync(&sdata->dfs_cac_timer_work);
|
||||
|
||||
@@ -1639,6 +1640,7 @@ static void ieee80211_setup_sdata(struct
|
||||
INIT_WORK(&sdata->work, ieee80211_iface_work);
|
||||
INIT_WORK(&sdata->recalc_smps, ieee80211_recalc_smps_work);
|
||||
INIT_WORK(&sdata->csa_finalize_work, ieee80211_csa_finalize_work);
|
||||
+ INIT_WORK(&sdata->color_change_finalize_work, ieee80211_color_change_finalize_work);
|
||||
INIT_LIST_HEAD(&sdata->assigned_chanctx_list);
|
||||
INIT_LIST_HEAD(&sdata->reserved_chanctx_list);
|
||||
|
||||
--- a/net/mac80211/tx.c
|
||||
+++ b/net/mac80211/tx.c
|
||||
@@ -4790,11 +4790,11 @@ static int ieee80211_beacon_add_tim(stru
|
||||
static void ieee80211_set_beacon_cntdwn(struct ieee80211_sub_if_data *sdata,
|
||||
struct beacon_data *beacon)
|
||||
{
|
||||
+ u8 *beacon_data, count, max_count = 1;
|
||||
struct probe_resp *resp;
|
||||
- u8 *beacon_data;
|
||||
size_t beacon_data_len;
|
||||
+ u16 *bcn_offsets;
|
||||
int i;
|
||||
- u8 count = beacon->cntdwn_current_counter;
|
||||
|
||||
switch (sdata->vif.type) {
|
||||
case NL80211_IFTYPE_AP:
|
||||
@@ -4814,21 +4814,27 @@ static void ieee80211_set_beacon_cntdwn(
|
||||
}
|
||||
|
||||
rcu_read_lock();
|
||||
- for (i = 0; i < IEEE80211_MAX_CNTDWN_COUNTERS_NUM; ++i) {
|
||||
- resp = rcu_dereference(sdata->u.ap.probe_resp);
|
||||
+ resp = rcu_dereference(sdata->u.ap.probe_resp);
|
||||
|
||||
- if (beacon->cntdwn_counter_offsets[i]) {
|
||||
- if (WARN_ON_ONCE(beacon->cntdwn_counter_offsets[i] >=
|
||||
- beacon_data_len)) {
|
||||
+ bcn_offsets = beacon->cntdwn_counter_offsets;
|
||||
+ count = beacon->cntdwn_current_counter;
|
||||
+ if (sdata->vif.csa_active)
|
||||
+ max_count = IEEE80211_MAX_CNTDWN_COUNTERS_NUM;
|
||||
+
|
||||
+ for (i = 0; i < max_count; ++i) {
|
||||
+ if (bcn_offsets[i]) {
|
||||
+ if (WARN_ON_ONCE(bcn_offsets[i] >= beacon_data_len)) {
|
||||
rcu_read_unlock();
|
||||
return;
|
||||
}
|
||||
-
|
||||
- beacon_data[beacon->cntdwn_counter_offsets[i]] = count;
|
||||
+ beacon_data[bcn_offsets[i]] = count;
|
||||
}
|
||||
|
||||
- if (sdata->vif.type == NL80211_IFTYPE_AP && resp)
|
||||
- resp->data[resp->cntdwn_counter_offsets[i]] = count;
|
||||
+ if (sdata->vif.type == NL80211_IFTYPE_AP && resp) {
|
||||
+ u16 *resp_offsets = resp->cntdwn_counter_offsets;
|
||||
+
|
||||
+ resp->data[resp_offsets[i]] = count;
|
||||
+ }
|
||||
}
|
||||
rcu_read_unlock();
|
||||
}
|
||||
@@ -5038,6 +5044,7 @@ __ieee80211_beacon_get(struct ieee80211_
|
||||
if (offs) {
|
||||
offs->tim_offset = beacon->head_len;
|
||||
offs->tim_length = skb->len - beacon->head_len;
|
||||
+ offs->cntdwn_counter_offs[0] = beacon->cntdwn_counter_offsets[0];
|
||||
|
||||
/* for AP the csa offsets are from tail */
|
||||
csa_off_base = skb->len;
|
||||
@ -1,6 +1,6 @@
|
||||
--- a/include/net/cfg80211.h
|
||||
+++ b/include/net/cfg80211.h
|
||||
@@ -3793,6 +3793,7 @@ struct mgmt_frame_regs {
|
||||
@@ -3814,6 +3814,7 @@ struct mgmt_frame_regs {
|
||||
* (as advertised by the nl80211 feature flag.)
|
||||
* @get_tx_power: store the current TX power into the dbm variable;
|
||||
* return 0 if successful
|
||||
@ -8,7 +8,7 @@
|
||||
*
|
||||
* @set_wds_peer: set the WDS peer for a WDS interface
|
||||
*
|
||||
@@ -4115,6 +4116,7 @@ struct cfg80211_ops {
|
||||
@@ -4138,6 +4139,7 @@ struct cfg80211_ops {
|
||||
enum nl80211_tx_power_setting type, int mbm);
|
||||
int (*get_tx_power)(struct wiphy *wiphy, struct wireless_dev *wdev,
|
||||
int *dbm);
|
||||
@ -36,9 +36,9 @@
|
||||
u8 ps_dtim_period;
|
||||
--- a/include/uapi/linux/nl80211.h
|
||||
+++ b/include/uapi/linux/nl80211.h
|
||||
@@ -2560,6 +2560,9 @@ enum nl80211_commands {
|
||||
* disassoc events to indicate that an immediate reconnect to the AP
|
||||
* is desired.
|
||||
@@ -2593,6 +2593,9 @@ enum nl80211_commands {
|
||||
* @NL80211_ATTR_COLOR_CHANGE_ELEMS: Nested set of attributes containing the IE
|
||||
* information for the time while performing a color switch.
|
||||
*
|
||||
+ * @NL80211_ATTR_WIPHY_ANTENNA_GAIN: Configured antenna gain. Used to reduce
|
||||
+ * transmit power to stay within regulatory limits. u32, dBi.
|
||||
@ -46,9 +46,9 @@
|
||||
* @NUM_NL80211_ATTR: total number of nl80211_attrs available
|
||||
* @NL80211_ATTR_MAX: highest attribute number currently defined
|
||||
* @__NL80211_ATTR_AFTER_LAST: internal use
|
||||
@@ -3057,6 +3060,8 @@ enum nl80211_attrs {
|
||||
|
||||
NL80211_ATTR_DISABLE_HE,
|
||||
@@ -3096,6 +3099,8 @@ enum nl80211_attrs {
|
||||
NL80211_ATTR_COLOR_CHANGE_COLOR,
|
||||
NL80211_ATTR_COLOR_CHANGE_ELEMS,
|
||||
|
||||
+ NL80211_ATTR_WIPHY_ANTENNA_GAIN,
|
||||
+
|
||||
@ -57,7 +57,7 @@
|
||||
__NL80211_ATTR_AFTER_LAST,
|
||||
--- a/net/mac80211/cfg.c
|
||||
+++ b/net/mac80211/cfg.c
|
||||
@@ -2761,6 +2761,19 @@ static int ieee80211_get_tx_power(struct
|
||||
@@ -2769,6 +2769,19 @@ static int ieee80211_get_tx_power(struct
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -77,7 +77,7 @@
|
||||
static int ieee80211_set_wds_peer(struct wiphy *wiphy, struct net_device *dev,
|
||||
const u8 *addr)
|
||||
{
|
||||
@@ -4202,6 +4215,7 @@ const struct cfg80211_ops mac80211_confi
|
||||
@@ -4413,6 +4426,7 @@ const struct cfg80211_ops mac80211_confi
|
||||
.set_wiphy_params = ieee80211_set_wiphy_params,
|
||||
.set_tx_power = ieee80211_set_tx_power,
|
||||
.get_tx_power = ieee80211_get_tx_power,
|
||||
@ -87,7 +87,7 @@
|
||||
CFG80211_TESTMODE_CMD(ieee80211_testmode_cmd)
|
||||
--- a/net/mac80211/ieee80211_i.h
|
||||
+++ b/net/mac80211/ieee80211_i.h
|
||||
@@ -1426,6 +1426,7 @@ struct ieee80211_local {
|
||||
@@ -1434,6 +1434,7 @@ struct ieee80211_local {
|
||||
int dynamic_ps_forced_timeout;
|
||||
|
||||
int user_power_level; /* in dBm, for all interfaces */
|
||||
@ -129,15 +129,15 @@
|
||||
local->hw.max_mtu = IEEE80211_MAX_DATA_LEN;
|
||||
--- a/net/wireless/nl80211.c
|
||||
+++ b/net/wireless/nl80211.c
|
||||
@@ -753,6 +753,7 @@ static const struct nla_policy nl80211_p
|
||||
NL80211_SAE_PWE_BOTH),
|
||||
[NL80211_ATTR_SAR_SPEC] = NLA_POLICY_NESTED(sar_policy),
|
||||
[NL80211_ATTR_RECONNECT_REQUESTED] = { .type = NLA_REJECT },
|
||||
@@ -757,6 +757,7 @@ static const struct nla_policy nl80211_p
|
||||
[NL80211_ATTR_COLOR_CHANGE_COUNT] = { .type = NLA_U8 },
|
||||
[NL80211_ATTR_COLOR_CHANGE_COLOR] = { .type = NLA_U8 },
|
||||
[NL80211_ATTR_COLOR_CHANGE_ELEMS] = NLA_POLICY_NESTED(nl80211_policy),
|
||||
+ [NL80211_ATTR_WIPHY_ANTENNA_GAIN] = { .type = NLA_U32 },
|
||||
};
|
||||
|
||||
/* policy for the key attributes */
|
||||
@@ -3318,6 +3319,20 @@ static int nl80211_set_wiphy(struct sk_b
|
||||
@@ -3322,6 +3323,20 @@ static int nl80211_set_wiphy(struct sk_b
|
||||
if (result)
|
||||
return result;
|
||||
}
|
||||
|
||||
@ -5,9 +5,9 @@ PKG_RELEASE:=1
|
||||
|
||||
PKG_SOURCE_PROTO:=git
|
||||
PKG_SOURCE_URL=$(PROJECT_GIT)/project/netifd.git
|
||||
PKG_SOURCE_DATE:=2021-08-24
|
||||
PKG_SOURCE_VERSION:=454e9c33c90691d5bea12263f1801a7dc38c20b1
|
||||
PKG_MIRROR_HASH:=b8c6d8a1d0cb60c353c0272b8a526d8e28e6ee7d385e96b18018d1bc13b54cc2
|
||||
PKG_SOURCE_DATE:=2021-09-21
|
||||
PKG_SOURCE_VERSION:=08e954e137ffcf7770200bbd6476dc36bbd326f5
|
||||
PKG_MIRROR_HASH:=2250b8adc892a7ce0b79ca34611fae0098b3a367272684f42891923717b47578
|
||||
PKG_MAINTAINER:=Felix Fietkau <nbd@nbd.name>
|
||||
|
||||
PKG_LICENSE:=GPL-2.0
|
||||
|
||||
@ -8,7 +8,7 @@
|
||||
include $(TOPDIR)/rules.mk
|
||||
|
||||
PKG_NAME:=6rd
|
||||
PKG_RELEASE:=10
|
||||
PKG_RELEASE:=11
|
||||
PKG_LICENSE:=GPL-2.0
|
||||
|
||||
include $(INCLUDE_DIR)/package.mk
|
||||
|
||||
@ -82,6 +82,8 @@ proto_6rd_setup() {
|
||||
|
||||
proto_6rd_teardown() {
|
||||
local cfg="$1"
|
||||
local link="6rd-$cfg"
|
||||
ip link del $link
|
||||
}
|
||||
|
||||
proto_6rd_init_config() {
|
||||
|
||||
@ -10,7 +10,36 @@
|
||||
|
||||
--- a/src/ap/x_snoop.c
|
||||
+++ b/src/ap/x_snoop.c
|
||||
@@ -71,8 +71,12 @@ x_snoop_get_l2_packet(struct hostapd_dat
|
||||
@@ -31,14 +31,16 @@ int x_snoop_init(struct hostapd_data *ha
|
||||
return -1;
|
||||
}
|
||||
|
||||
- if (hostapd_drv_br_port_set_attr(hapd, DRV_BR_PORT_ATTR_HAIRPIN_MODE,
|
||||
+ if (!conf->snoop_iface[0] &&
|
||||
+ hostapd_drv_br_port_set_attr(hapd, DRV_BR_PORT_ATTR_HAIRPIN_MODE,
|
||||
1)) {
|
||||
wpa_printf(MSG_DEBUG,
|
||||
"x_snoop: Failed to enable hairpin_mode on the bridge port");
|
||||
return -1;
|
||||
}
|
||||
|
||||
- if (hostapd_drv_br_port_set_attr(hapd, DRV_BR_PORT_ATTR_PROXYARP, 1)) {
|
||||
+ if (!conf->snoop_iface[0] &&
|
||||
+ hostapd_drv_br_port_set_attr(hapd, DRV_BR_PORT_ATTR_PROXYARP, 1)) {
|
||||
wpa_printf(MSG_DEBUG,
|
||||
"x_snoop: Failed to enable proxyarp on the bridge port");
|
||||
return -1;
|
||||
@@ -52,7 +54,8 @@ int x_snoop_init(struct hostapd_data *ha
|
||||
}
|
||||
|
||||
#ifdef CONFIG_IPV6
|
||||
- if (hostapd_drv_br_set_net_param(hapd, DRV_BR_MULTICAST_SNOOPING, 1)) {
|
||||
+ if (!conf->snoop_iface[0] &&
|
||||
+ hostapd_drv_br_set_net_param(hapd, DRV_BR_MULTICAST_SNOOPING, 1)) {
|
||||
wpa_printf(MSG_DEBUG,
|
||||
"x_snoop: Failed to enable multicast snooping on the bridge");
|
||||
return -1;
|
||||
@@ -71,8 +74,12 @@ x_snoop_get_l2_packet(struct hostapd_dat
|
||||
{
|
||||
struct hostapd_bss_config *conf = hapd->conf;
|
||||
struct l2_packet_data *l2;
|
||||
|
||||
@ -1498,6 +1498,11 @@ void hostapd_ubus_free_bss(struct hostapd_data *hapd)
|
||||
struct ubus_object *obj = &hapd->ubus.obj;
|
||||
char *name = (char *) obj->name;
|
||||
|
||||
#ifdef CONFIG_MESH
|
||||
if (hapd->conf->mesh & MESH_ENABLED)
|
||||
return;
|
||||
#endif
|
||||
|
||||
if (!ctx)
|
||||
return;
|
||||
|
||||
|
||||
@ -12,9 +12,9 @@ PKG_RELEASE:=1
|
||||
|
||||
PKG_SOURCE_URL=$(PROJECT_GIT)/project/ustp.git
|
||||
PKG_SOURCE_PROTO:=git
|
||||
PKG_SOURCE_DATE:=2021-08-25
|
||||
PKG_SOURCE_VERSION:=9622264cf92691f18ae9222b0a4c9db95af5d80d
|
||||
PKG_MIRROR_HASH:=de4ed29eee21192b60e8683633d916d251bcccd5701bdac83b5ba435189297f1
|
||||
PKG_SOURCE_DATE:=2021-09-21
|
||||
PKG_SOURCE_VERSION:=462b3a491347e452c15220861949b1d6371fa59e
|
||||
PKG_MIRROR_HASH:=0e96edc983cf437b95874e5715d743f30bb826d8757dc3771ff872ab9cf18f35
|
||||
|
||||
PKG_MAINTAINER:=Felix Fietkau <nbd@nbd.name>
|
||||
PKG_LICENSE:=GPL-2.0
|
||||
|
||||
20
package/network/utils/bpftools/patches/006-musl-120.patch
Normal file
20
package/network/utils/bpftools/patches/006-musl-120.patch
Normal file
@ -0,0 +1,20 @@
|
||||
--- a/tools/bpf/bpftool/btf_dumper.c
|
||||
+++ b/tools/bpf/bpftool/btf_dumper.c
|
||||
@@ -5,6 +5,7 @@
|
||||
#include <stdio.h> /* for (FILE *) used by json_writer */
|
||||
#include <string.h>
|
||||
#include <unistd.h>
|
||||
+#include <linux/compiler.h>
|
||||
#include <asm/byteorder.h>
|
||||
#include <linux/bitops.h>
|
||||
#include <linux/btf.h>
|
||||
--- a/tools/bpf/bpftool/map_perf_ring.c
|
||||
+++ b/tools/bpf/bpftool/map_perf_ring.c
|
||||
@@ -16,6 +16,7 @@
|
||||
#include <time.h>
|
||||
#include <unistd.h>
|
||||
#include <linux/bpf.h>
|
||||
+#include <linux/compiler.h>
|
||||
#include <linux/perf_event.h>
|
||||
#include <sys/ioctl.h>
|
||||
#include <sys/mman.h>
|
||||
@ -8,13 +8,13 @@
|
||||
include $(TOPDIR)/rules.mk
|
||||
|
||||
PKG_NAME:=restool
|
||||
PKG_VERSION:=LSDK-20.04
|
||||
PKG_RELEASE:=2
|
||||
PKG_VERSION:=LSDK-20.12
|
||||
PKG_RELEASE:=$(AUTORELEASE)
|
||||
|
||||
PKG_SOURCE_PROTO:=git
|
||||
PKG_SOURCE_URL:=https://source.codeaurora.org/external/qoriq/qoriq-components/restool
|
||||
PKG_SOURCE_VERSION:=f0cec094e4c6d1c975b377203a3bf994ba9325a9
|
||||
PKG_MIRROR_HASH:=1863acfaef319e6b277671fead51df0a31bdddb59022080d86b7d81da0bc8490
|
||||
PKG_SOURCE_VERSION:=LSDK-20.12
|
||||
PKG_MIRROR_HASH:=aeba5add9d06c2a3cdac1cc2953d98f00acaa0038dbaf725b468f3e99e5fdd93
|
||||
|
||||
PKG_FLAGS:=nonshared
|
||||
|
||||
|
||||
@ -1,107 +0,0 @@
|
||||
From 37f0f1550e7822584b858edde416a694fb902236 Mon Sep 17 00:00:00 2001
|
||||
From: Ioana Ciornei <ioana.ciornei@nxp.com>
|
||||
Date: Tue, 31 Jul 2018 13:33:20 +0300
|
||||
Subject: [PATCH] restool: fix get_device_file() function
|
||||
|
||||
This patch fixes multiple problems encountered in the
|
||||
get_device_file() function:
|
||||
- The deprecated atoi() function is replaced by strtoul
|
||||
- An invalid memory access was being performed by using
|
||||
memory from dir->d_name even after closedir(). This is
|
||||
fixed by a strdup() on the device filename.
|
||||
- Also, error prints now print any relevant error code.
|
||||
|
||||
Signed-off-by: Ioana Ciornei <ioana.ciornei@nxp.com>
|
||||
---
|
||||
restool.c | 44 ++++++++++++++++++++++++++++----------------
|
||||
1 file changed, 28 insertions(+), 16 deletions(-)
|
||||
|
||||
diff --git a/restool.c b/restool.c
|
||||
index 7553659..78fd1bf 100644
|
||||
--- a/restool.c
|
||||
+++ b/restool.c
|
||||
@@ -1185,8 +1185,13 @@ out:
|
||||
|
||||
static int get_device_file(void)
|
||||
{
|
||||
+ int num_dev_files = 0;
|
||||
+ struct dirent *dir;
|
||||
int error = 0;
|
||||
+ char *device;
|
||||
int num_char;
|
||||
+ long val;
|
||||
+ DIR *d;
|
||||
|
||||
memset(restool.device_file, '\0', DEV_FILE_SIZE);
|
||||
|
||||
@@ -1214,10 +1219,6 @@ static int get_device_file(void)
|
||||
goto out;
|
||||
}
|
||||
} else {
|
||||
- DIR *d;
|
||||
- struct dirent *dir;
|
||||
- int num_dev_files = 0;
|
||||
- char *dprc_index;
|
||||
|
||||
d = opendir("/dev");
|
||||
if (!d) {
|
||||
@@ -1227,26 +1228,34 @@ static int get_device_file(void)
|
||||
}
|
||||
while ((dir = readdir(d)) != NULL) {
|
||||
if (strncmp(dir->d_name, "dprc.", 5) == 0) {
|
||||
- dprc_index = &dir->d_name[5];
|
||||
- num_dev_files += 1;
|
||||
+ if (num_dev_files == 0)
|
||||
+ device = strdup(dir->d_name);
|
||||
+ num_dev_files++;
|
||||
}
|
||||
}
|
||||
closedir(d);
|
||||
|
||||
if (num_dev_files == 1) {
|
||||
- int temp_len = strlen(dprc_index);
|
||||
+ errno = 0;
|
||||
+ val = strtoul(&device[5], NULL, 0);
|
||||
+ if ((errno == ERANGE && val == LONG_MAX) ||
|
||||
+ ( errno != 0 && val == 0 )) {
|
||||
+ ERROR_PRINTF("error: device file malformed\n");
|
||||
+ error = -1;
|
||||
+ goto out_free_device;;
|
||||
+ }
|
||||
+ restool.root_dprc_id = val;
|
||||
|
||||
- temp_len += 10;
|
||||
- num_char = sprintf(restool.device_file, "/dev/dprc.%s",
|
||||
- dprc_index);
|
||||
- if (num_char != temp_len) {
|
||||
- ERROR_PRINTF("sprintf error\n");
|
||||
+ num_char = snprintf(restool.device_file, DEV_FILE_SIZE,
|
||||
+ "/dev/dprc.%d", restool.root_dprc_id);
|
||||
+ if (num_char < 0 || num_char >= DEV_FILE_SIZE) {
|
||||
+ ERROR_PRINTF("error: device file malformed\n");
|
||||
error = -1;
|
||||
- goto out;
|
||||
+ goto out_free_device;
|
||||
}
|
||||
- restool.root_dprc_id = atoi(dprc_index);
|
||||
- if (access(restool.device_file, F_OK) != 0)
|
||||
- printf("no such dev file\n");
|
||||
+ error = access(restool.device_file, F_OK);
|
||||
+ if (error != 0)
|
||||
+ ERROR_PRINTF("error: access(%s) = %d\n", restool.device_file, error);
|
||||
} else {
|
||||
error = -1;
|
||||
if (num_dev_files == 0)
|
||||
@@ -1255,6 +1264,9 @@ static int get_device_file(void)
|
||||
ERROR_PRINTF("error: multiple root containers\n");
|
||||
}
|
||||
}
|
||||
+
|
||||
+out_free_device:
|
||||
+ free(device);
|
||||
out:
|
||||
return error;
|
||||
}
|
||||
--
|
||||
2.17.1
|
||||
|
||||
@ -1,7 +1,9 @@
|
||||
#!/bin/sh /etc/rc.common
|
||||
# (C) 2013 openwrt.org
|
||||
# SPDX-License-Identifier: GPL-2.0-only
|
||||
#
|
||||
# Copyright (C) 2013-2020 OpenWrt.org
|
||||
|
||||
START=40
|
||||
START=11
|
||||
|
||||
boot() {
|
||||
/sbin/block mount
|
||||
|
||||
@ -19,224 +19,263 @@ opt_dryrun = False
|
||||
|
||||
|
||||
def parseVer_1234(match, filepath):
|
||||
progname = match.group(1)
|
||||
progversion = (int(match.group(2)) << 64) |\
|
||||
(int(match.group(3)) << 48) |\
|
||||
(int(match.group(4)) << 32) |\
|
||||
(int(match.group(5)) << 16)
|
||||
return (progname, progversion)
|
||||
progname = match.group(1)
|
||||
progversion = (
|
||||
(int(match.group(2)) << 64)
|
||||
| (int(match.group(3)) << 48)
|
||||
| (int(match.group(4)) << 32)
|
||||
| (int(match.group(5)) << 16)
|
||||
)
|
||||
return (progname, progversion)
|
||||
|
||||
|
||||
def parseVer_123(match, filepath):
|
||||
progname = match.group(1)
|
||||
try:
|
||||
patchlevel = match.group(5)
|
||||
except IndexError as e:
|
||||
patchlevel = None
|
||||
if patchlevel:
|
||||
patchlevel = ord(patchlevel[0])
|
||||
else:
|
||||
patchlevel = 0
|
||||
progversion = (int(match.group(2)) << 64) |\
|
||||
(int(match.group(3)) << 48) |\
|
||||
(int(match.group(4)) << 32) |\
|
||||
patchlevel
|
||||
return (progname, progversion)
|
||||
progname = match.group(1)
|
||||
try:
|
||||
patchlevel = match.group(5)
|
||||
except IndexError as e:
|
||||
patchlevel = None
|
||||
if patchlevel:
|
||||
patchlevel = ord(patchlevel[0])
|
||||
else:
|
||||
patchlevel = 0
|
||||
progversion = (
|
||||
(int(match.group(2)) << 64)
|
||||
| (int(match.group(3)) << 48)
|
||||
| (int(match.group(4)) << 32)
|
||||
| patchlevel
|
||||
)
|
||||
return (progname, progversion)
|
||||
|
||||
|
||||
def parseVer_12(match, filepath):
|
||||
progname = match.group(1)
|
||||
try:
|
||||
patchlevel = match.group(4)
|
||||
except IndexError as e:
|
||||
patchlevel = None
|
||||
if patchlevel:
|
||||
patchlevel = ord(patchlevel[0])
|
||||
else:
|
||||
patchlevel = 0
|
||||
progversion = (int(match.group(2)) << 64) |\
|
||||
(int(match.group(3)) << 48) |\
|
||||
patchlevel
|
||||
return (progname, progversion)
|
||||
progname = match.group(1)
|
||||
try:
|
||||
patchlevel = match.group(4)
|
||||
except IndexError as e:
|
||||
patchlevel = None
|
||||
if patchlevel:
|
||||
patchlevel = ord(patchlevel[0])
|
||||
else:
|
||||
patchlevel = 0
|
||||
progversion = (int(match.group(2)) << 64) | (int(match.group(3)) << 48) | patchlevel
|
||||
return (progname, progversion)
|
||||
|
||||
|
||||
def parseVer_r(match, filepath):
|
||||
progname = match.group(1)
|
||||
progversion = (int(match.group(2)) << 64)
|
||||
return (progname, progversion)
|
||||
progname = match.group(1)
|
||||
progversion = int(match.group(2)) << 64
|
||||
return (progname, progversion)
|
||||
|
||||
|
||||
def parseVer_ymd_GIT_SHASUM(match, filepath):
|
||||
progname = match.group(1)
|
||||
progversion = (
|
||||
(int(match.group(2)) << 64)
|
||||
| (int(match.group(3)) << 48)
|
||||
| (int(match.group(4)) << 32)
|
||||
)
|
||||
return (progname, progversion)
|
||||
|
||||
|
||||
def parseVer_ymd(match, filepath):
|
||||
progname = match.group(1)
|
||||
progversion = (int(match.group(2)) << 64) |\
|
||||
(int(match.group(3)) << 48) |\
|
||||
(int(match.group(4)) << 32)
|
||||
return (progname, progversion)
|
||||
progname = match.group(1)
|
||||
progversion = (
|
||||
(int(match.group(2)) << 64)
|
||||
| (int(match.group(3)) << 48)
|
||||
| (int(match.group(4)) << 32)
|
||||
)
|
||||
return (progname, progversion)
|
||||
|
||||
|
||||
def parseVer_GIT(match, filepath):
|
||||
progname = match.group(1)
|
||||
st = os.stat(filepath)
|
||||
progversion = int(st.st_mtime) << 64
|
||||
return (progname, progversion)
|
||||
progname = match.group(1)
|
||||
st = os.stat(filepath)
|
||||
progversion = int(st.st_mtime) << 64
|
||||
return (progname, progversion)
|
||||
|
||||
|
||||
extensions = (
|
||||
".tar.gz",
|
||||
".tar.bz2",
|
||||
".tar.xz",
|
||||
".orig.tar.gz",
|
||||
".orig.tar.bz2",
|
||||
".orig.tar.xz",
|
||||
".zip",
|
||||
".tgz",
|
||||
".tbz",
|
||||
".txz",
|
||||
".tar.gz",
|
||||
".tar.bz2",
|
||||
".tar.xz",
|
||||
".orig.tar.gz",
|
||||
".orig.tar.bz2",
|
||||
".orig.tar.xz",
|
||||
".zip",
|
||||
".tgz",
|
||||
".tbz",
|
||||
".txz",
|
||||
)
|
||||
|
||||
versionRegex = (
|
||||
(re.compile(r"(.+)[-_](\d+)\.(\d+)\.(\d+)\.(\d+)"), parseVer_1234), # xxx-1.2.3.4
|
||||
(re.compile(r"(.+)[-_](\d\d\d\d)-?(\d\d)-?(\d\d)"), parseVer_ymd), # xxx-YYYY-MM-DD
|
||||
(re.compile(r"(.+)[-_]([0-9a-fA-F]{40,40})"), parseVer_GIT), # xxx-GIT_SHASUM
|
||||
(re.compile(r"(.+)[-_](\d+)\.(\d+)\.(\d+)(\w?)"), parseVer_123), # xxx-1.2.3a
|
||||
(re.compile(r"(.+)[-_](\d+)_(\d+)_(\d+)"), parseVer_123), # xxx-1_2_3
|
||||
(re.compile(r"(.+)[-_](\d+)\.(\d+)(\w?)"), parseVer_12), # xxx-1.2a
|
||||
(re.compile(r"(.+)[-_]r?(\d+)"), parseVer_r), # xxx-r1111
|
||||
(re.compile(r"(gcc[-_]\d+)\.(\d+)\.(\d+)"), parseVer_12), # gcc.1.2
|
||||
(re.compile(r"(linux[-_]\d+\.\d+)\.(\d+)"), parseVer_r), # linux.1
|
||||
(re.compile(r"(.+)[-_](\d+)\.(\d+)\.(\d+)\.(\d+)"), parseVer_1234), # xxx-1.2.3.4
|
||||
(
|
||||
re.compile(r"(.+)[-_](\d\d\d\d)-?(\d\d)-?(\d\d)-"),
|
||||
parseVer_ymd_GIT_SHASUM,
|
||||
), # xxx-YYYY-MM-DD-GIT_SHASUM
|
||||
(re.compile(r"(.+)[-_](\d\d\d\d)-?(\d\d)-?(\d\d)"), parseVer_ymd), # xxx-YYYY-MM-DD
|
||||
(re.compile(r"(.+)[-_]([0-9a-fA-F]{40,40})"), parseVer_GIT), # xxx-GIT_SHASUM
|
||||
(re.compile(r"(.+)[-_](\d+)\.(\d+)\.(\d+)(\w?)"), parseVer_123), # xxx-1.2.3a
|
||||
(re.compile(r"(.+)[-_](\d+)_(\d+)_(\d+)"), parseVer_123), # xxx-1_2_3
|
||||
(re.compile(r"(.+)[-_](\d+)\.(\d+)(\w?)"), parseVer_12), # xxx-1.2a
|
||||
(re.compile(r"(.+)[-_]r?(\d+)"), parseVer_r), # xxx-r1111
|
||||
)
|
||||
|
||||
blacklist = [
|
||||
("linux", re.compile(r"linux-\d.*")),
|
||||
("gcc", re.compile(r"gcc-.*")),
|
||||
("wl_apsta", re.compile(r"wl_apsta.*")),
|
||||
(".fw", re.compile(r".*\.fw")),
|
||||
(".arm", re.compile(r".*\.arm")),
|
||||
(".bin", re.compile(r".*\.bin")),
|
||||
("rt-firmware", re.compile(r"RT[\d\w]+_Firmware.*")),
|
||||
("wl_apsta", re.compile(r"wl_apsta.*")),
|
||||
(".fw", re.compile(r".*\.fw")),
|
||||
(".arm", re.compile(r".*\.arm")),
|
||||
(".bin", re.compile(r".*\.bin")),
|
||||
("rt-firmware", re.compile(r"RT[\d\w]+_Firmware.*")),
|
||||
]
|
||||
|
||||
class EntryParseError(Exception): pass
|
||||
|
||||
class EntryParseError(Exception):
|
||||
pass
|
||||
|
||||
|
||||
class Entry:
|
||||
def __init__(self, directory, filename):
|
||||
self.directory = directory
|
||||
self.filename = filename
|
||||
self.progname = ""
|
||||
self.fileext = ""
|
||||
def __init__(self, directory, filename):
|
||||
self.directory = directory
|
||||
self.filename = filename
|
||||
self.progname = ""
|
||||
self.fileext = ""
|
||||
|
||||
for ext in extensions:
|
||||
if filename.endswith(ext):
|
||||
filename = filename[0:0-len(ext)]
|
||||
self.fileext = ext
|
||||
break
|
||||
else:
|
||||
print(self.filename, "has an unknown file-extension")
|
||||
raise EntryParseError("ext")
|
||||
for (regex, parseVersion) in versionRegex:
|
||||
match = regex.match(filename)
|
||||
if match:
|
||||
(self.progname, self.version) = parseVersion(
|
||||
match, directory + "/" + filename + self.fileext)
|
||||
break
|
||||
else:
|
||||
print(self.filename, "has an unknown version pattern")
|
||||
raise EntryParseError("ver")
|
||||
for ext in extensions:
|
||||
if filename.endswith(ext):
|
||||
filename = filename[0 : 0 - len(ext)]
|
||||
self.fileext = ext
|
||||
break
|
||||
else:
|
||||
print(self.filename, "has an unknown file-extension")
|
||||
raise EntryParseError("ext")
|
||||
for (regex, parseVersion) in versionRegex:
|
||||
match = regex.match(filename)
|
||||
if match:
|
||||
(self.progname, self.version) = parseVersion(
|
||||
match, directory + "/" + filename + self.fileext
|
||||
)
|
||||
break
|
||||
else:
|
||||
print(self.filename, "has an unknown version pattern")
|
||||
raise EntryParseError("ver")
|
||||
|
||||
def getPath(self):
|
||||
return (self.directory + "/" + self.filename).replace("//", "/")
|
||||
def getPath(self):
|
||||
return (self.directory + "/" + self.filename).replace("//", "/")
|
||||
|
||||
def deleteFile(self):
|
||||
path = self.getPath()
|
||||
print("Deleting", path)
|
||||
if not opt_dryrun:
|
||||
os.unlink(path)
|
||||
def deleteFile(self):
|
||||
path = self.getPath()
|
||||
print("Deleting", path)
|
||||
if not opt_dryrun:
|
||||
os.unlink(path)
|
||||
|
||||
def __ge__(self, y):
|
||||
return self.version >= y.version
|
||||
|
||||
def __ge__(self, y):
|
||||
return self.version >= y.version
|
||||
|
||||
def usage():
|
||||
print("OpenWrt download directory cleanup utility")
|
||||
print("Usage: " + sys.argv[0] + " [OPTIONS] <path/to/dl>")
|
||||
print("")
|
||||
print(" -d|--dry-run Do a dry-run. Don't delete any files")
|
||||
print(" -B|--show-blacklist Show the blacklist and exit")
|
||||
print(" -w|--whitelist ITEM Remove ITEM from blacklist")
|
||||
print("OpenWrt download directory cleanup utility")
|
||||
print("Usage: " + sys.argv[0] + " [OPTIONS] <path/to/dl>")
|
||||
print("")
|
||||
print(" -d|--dry-run Do a dry-run. Don't delete any files")
|
||||
print(" -B|--show-blacklist Show the blacklist and exit")
|
||||
print(" -w|--whitelist ITEM Remove ITEM from blacklist")
|
||||
|
||||
|
||||
def main(argv):
|
||||
global opt_dryrun
|
||||
global opt_dryrun
|
||||
|
||||
try:
|
||||
(opts, args) = getopt.getopt(argv[1:],
|
||||
"hdBw:",
|
||||
[ "help", "dry-run", "show-blacklist", "whitelist=", ])
|
||||
if len(args) != 1:
|
||||
usage()
|
||||
return 1
|
||||
except getopt.GetoptError as e:
|
||||
usage()
|
||||
return 1
|
||||
directory = args[0]
|
||||
try:
|
||||
(opts, args) = getopt.getopt(
|
||||
argv[1:],
|
||||
"hdBw:",
|
||||
[
|
||||
"help",
|
||||
"dry-run",
|
||||
"show-blacklist",
|
||||
"whitelist=",
|
||||
],
|
||||
)
|
||||
if len(args) != 1:
|
||||
usage()
|
||||
return 1
|
||||
except getopt.GetoptError as e:
|
||||
usage()
|
||||
return 1
|
||||
directory = args[0]
|
||||
|
||||
if not os.path.exists(directory):
|
||||
print("Can't find dl path", directory)
|
||||
return 1
|
||||
if not os.path.exists(directory):
|
||||
print("Can't find dl path", directory)
|
||||
return 1
|
||||
|
||||
for (o, v) in opts:
|
||||
if o in ("-h", "--help"):
|
||||
usage()
|
||||
return 0
|
||||
if o in ("-d", "--dry-run"):
|
||||
opt_dryrun = True
|
||||
if o in ("-w", "--whitelist"):
|
||||
for i in range(0, len(blacklist)):
|
||||
(name, regex) = blacklist[i]
|
||||
if name == v:
|
||||
del blacklist[i]
|
||||
break
|
||||
else:
|
||||
print("Whitelist error: Item", v,\
|
||||
"is not in blacklist")
|
||||
return 1
|
||||
if o in ("-B", "--show-blacklist"):
|
||||
for (name, regex) in blacklist:
|
||||
sep = "\t\t"
|
||||
if len(name) >= 8:
|
||||
sep = "\t"
|
||||
print("%s%s(%s)" % (name, sep, regex.pattern))
|
||||
return 0
|
||||
for (o, v) in opts:
|
||||
if o in ("-h", "--help"):
|
||||
usage()
|
||||
return 0
|
||||
if o in ("-d", "--dry-run"):
|
||||
opt_dryrun = True
|
||||
if o in ("-w", "--whitelist"):
|
||||
for i in range(0, len(blacklist)):
|
||||
(name, regex) = blacklist[i]
|
||||
if name == v:
|
||||
del blacklist[i]
|
||||
break
|
||||
else:
|
||||
print("Whitelist error: Item", v, "is not in blacklist")
|
||||
return 1
|
||||
if o in ("-B", "--show-blacklist"):
|
||||
for (name, regex) in blacklist:
|
||||
sep = "\t\t"
|
||||
if len(name) >= 8:
|
||||
sep = "\t"
|
||||
print("%s%s(%s)" % (name, sep, regex.pattern))
|
||||
return 0
|
||||
|
||||
# Create a directory listing and parse the file names.
|
||||
entries = []
|
||||
for filename in os.listdir(directory):
|
||||
if filename == "." or filename == "..":
|
||||
continue
|
||||
for (name, regex) in blacklist:
|
||||
if regex.match(filename):
|
||||
if opt_dryrun:
|
||||
print(filename, "is blacklisted")
|
||||
break
|
||||
else:
|
||||
try:
|
||||
entries.append(Entry(directory, filename))
|
||||
except EntryParseError as e:
|
||||
pass
|
||||
# Create a directory listing and parse the file names.
|
||||
entries = []
|
||||
for filename in os.listdir(directory):
|
||||
if filename == "." or filename == "..":
|
||||
continue
|
||||
for (name, regex) in blacklist:
|
||||
if regex.match(filename):
|
||||
if opt_dryrun:
|
||||
print(filename, "is blacklisted")
|
||||
break
|
||||
else:
|
||||
try:
|
||||
entries.append(Entry(directory, filename))
|
||||
except EntryParseError as e:
|
||||
pass
|
||||
|
||||
# Create a map of programs
|
||||
progmap = {}
|
||||
for entry in entries:
|
||||
if entry.progname in progmap.keys():
|
||||
progmap[entry.progname].append(entry)
|
||||
else:
|
||||
progmap[entry.progname] = [entry,]
|
||||
# Create a map of programs
|
||||
progmap = {}
|
||||
for entry in entries:
|
||||
if entry.progname in progmap.keys():
|
||||
progmap[entry.progname].append(entry)
|
||||
else:
|
||||
progmap[entry.progname] = [
|
||||
entry,
|
||||
]
|
||||
|
||||
# Traverse the program map and delete everything but the last version
|
||||
for prog in progmap:
|
||||
lastVersion = None
|
||||
versions = progmap[prog]
|
||||
for version in versions:
|
||||
if lastVersion is None or version >= lastVersion:
|
||||
lastVersion = version
|
||||
if lastVersion:
|
||||
for version in versions:
|
||||
if version is not lastVersion:
|
||||
version.deleteFile()
|
||||
if opt_dryrun:
|
||||
print("Keeping", lastVersion.getPath())
|
||||
# Traverse the program map and delete everything but the last version
|
||||
for prog in progmap:
|
||||
lastVersion = None
|
||||
versions = progmap[prog]
|
||||
for version in versions:
|
||||
if lastVersion is None or version >= lastVersion:
|
||||
lastVersion = version
|
||||
if lastVersion:
|
||||
for version in versions:
|
||||
if version is not lastVersion:
|
||||
version.deleteFile()
|
||||
if opt_dryrun:
|
||||
print("Keeping", lastVersion.getPath())
|
||||
|
||||
return 0
|
||||
|
||||
return 0
|
||||
|
||||
if __name__ == "__main__":
|
||||
sys.exit(main(sys.argv))
|
||||
sys.exit(main(sys.argv))
|
||||
|
||||
@ -290,6 +290,7 @@ sub parse_package_metadata($) {
|
||||
};
|
||||
/^Config:\s*(.*)\s*$/ and $pkg->{config} = "$1\n".get_multiline(*FILE, "\t");
|
||||
/^Prereq-Check:/ and $pkg->{prereq} = 1;
|
||||
/^Maintainer: \s*(.+)\s*$/ and $pkg->{maintainer} = [ split /, /, $1 ];
|
||||
/^Require-User:\s*(.*?)\s*$/ and do {
|
||||
my @ugspecs = split /\s+/, $1;
|
||||
|
||||
|
||||
@ -32,12 +32,14 @@ usage() {
|
||||
printf "\n\t-d ==> include Device Tree Blob 'dtb'"
|
||||
printf "\n\t-r ==> include RootFS blob 'rootfs'"
|
||||
printf "\n\t-H ==> specify hash algo instead of SHA1"
|
||||
printf "\n\t-l ==> legacy mode character (@ etc otherwise -)"
|
||||
printf "\n\t-o ==> create output file 'its_file'"
|
||||
printf "\n\t-O ==> create config with dt overlay 'name:dtb'"
|
||||
printf "\n\t\t(can be specified more than once)\n"
|
||||
exit 1
|
||||
}
|
||||
|
||||
REFERENCE_CHAR='-'
|
||||
FDTNUM=1
|
||||
ROOTFSNUM=1
|
||||
INITRDNUM=1
|
||||
@ -46,7 +48,7 @@ LOADABLES=
|
||||
DTOVERLAY=
|
||||
DTADDR=
|
||||
|
||||
while getopts ":A:a:c:C:D:d:e:f:i:k:n:o:O:v:r:H:" OPTION
|
||||
while getopts ":A:a:c:C:D:d:e:f:i:k:l:n:o:O:v:r:H:" OPTION
|
||||
do
|
||||
case $OPTION in
|
||||
A ) ARCH=$OPTARG;;
|
||||
@ -59,6 +61,7 @@ do
|
||||
f ) COMPATIBLE=$OPTARG;;
|
||||
i ) INITRD=$OPTARG;;
|
||||
k ) KERNEL=$OPTARG;;
|
||||
l ) REFERENCE_CHAR=$OPTARG;;
|
||||
n ) FDTNUM=$OPTARG;;
|
||||
o ) OUTPUT=$OPTARG;;
|
||||
O ) DTOVERLAY="$DTOVERLAY ${OPTARG}";;
|
||||
@ -91,7 +94,7 @@ fi
|
||||
# Conditionally create fdt information
|
||||
if [ -n "${DTB}" ]; then
|
||||
FDT_NODE="
|
||||
fdt-$FDTNUM {
|
||||
fdt${REFERENCE_CHAR}$FDTNUM {
|
||||
description = \"${ARCH_UPPER} OpenWrt ${DEVICE} device tree blob\";
|
||||
${COMPATIBLE_PROP}
|
||||
data = /incbin/(\"${DTB}\");
|
||||
@ -107,12 +110,12 @@ if [ -n "${DTB}" ]; then
|
||||
};
|
||||
};
|
||||
"
|
||||
FDT_PROP="fdt = \"fdt-$FDTNUM\";"
|
||||
FDT_PROP="fdt = \"fdt${REFERENCE_CHAR}$FDTNUM\";"
|
||||
fi
|
||||
|
||||
if [ -n "${INITRD}" ]; then
|
||||
INITRD_NODE="
|
||||
initrd-$INITRDNUM {
|
||||
initrd${REFERENCE_CHAR}$INITRDNUM {
|
||||
description = \"${ARCH_UPPER} OpenWrt ${DEVICE} initrd\";
|
||||
${COMPATIBLE_PROP}
|
||||
data = /incbin/(\"${INITRD}\");
|
||||
@ -127,7 +130,7 @@ if [ -n "${INITRD}" ]; then
|
||||
};
|
||||
};
|
||||
"
|
||||
INITRD_PROP="ramdisk=\"initrd-${INITRDNUM}\";"
|
||||
INITRD_PROP="ramdisk=\"initrd${REFERENCE_CHAR}${INITRDNUM}\";"
|
||||
fi
|
||||
|
||||
|
||||
@ -149,7 +152,7 @@ if [ -n "${ROOTFS}" ]; then
|
||||
};
|
||||
};
|
||||
"
|
||||
LOADABLES="${LOADABLES:+$LOADABLES, }\"rootfs-${ROOTFSNUM}\""
|
||||
LOADABLES="${LOADABLES:+$LOADABLES, }\"rootfs${REFERENCE_CHAR}${ROOTFSNUM}\""
|
||||
fi
|
||||
|
||||
# add DT overlay blobs
|
||||
@ -184,8 +187,8 @@ OVCONFIGS=""
|
||||
|
||||
config-$ovname {
|
||||
description = \"OpenWrt ${DEVICE} with $ovname\";
|
||||
kernel = \"kernel-1\";
|
||||
fdt = \"fdt-$FDTNUM\", \"$ovnode\";
|
||||
kernel = \"kernel${REFERENCE_CHAR}1\";
|
||||
fdt = \"fdt${REFERENCE_CHAR}$FDTNUM\", \"$ovnode\";
|
||||
${LOADABLES:+loadables = ${LOADABLES};}
|
||||
${COMPATIBLE_PROP}
|
||||
${INITRD_PROP}
|
||||
@ -201,7 +204,7 @@ DATA="/dts-v1/;
|
||||
#address-cells = <1>;
|
||||
|
||||
images {
|
||||
kernel-1 {
|
||||
kernel${REFERENCE_CHAR}1 {
|
||||
description = \"${ARCH_UPPER} OpenWrt Linux-${VERSION}\";
|
||||
data = /incbin/(\"${KERNEL}\");
|
||||
type = \"kernel\";
|
||||
@ -227,7 +230,7 @@ ${ROOTFS_NODE}
|
||||
default = \"${CONFIG}\";
|
||||
${CONFIG} {
|
||||
description = \"OpenWrt ${DEVICE}\";
|
||||
kernel = \"kernel-1\";
|
||||
kernel = \"kernel${REFERENCE_CHAR}1\";
|
||||
${FDT_PROP}
|
||||
${LOADABLES:+loadables = ${LOADABLES};}
|
||||
${COMPATIBLE_PROP}
|
||||
|
||||
@ -585,6 +585,40 @@ sub gen_usergroup_list() {
|
||||
}
|
||||
}
|
||||
|
||||
sub gen_package_manifest_json() {
|
||||
my $json;
|
||||
parse_package_metadata($ARGV[0]) or exit 1;
|
||||
foreach my $name (sort {uc($a) cmp uc($b)} keys %package) {
|
||||
my %depends;
|
||||
my $pkg = $package{$name};
|
||||
foreach my $dep (@{$pkg->{depends} || []}) {
|
||||
if ($dep =~ m!^\+?(?:[^:]+:)?([^@]+)$!) {
|
||||
$depends{$1}++;
|
||||
}
|
||||
}
|
||||
my @depends = sort keys %depends;
|
||||
my $pkg_deps = join ' ', map { qq/"$_",/ } @depends;
|
||||
$pkg_deps =~ s/\,$//;
|
||||
|
||||
my $pkg_maintainer = join ' ', map { qq/"$_",/ } @{$pkg->{maintainer} || []};
|
||||
$pkg_maintainer =~ s/\,$//;
|
||||
|
||||
$json = <<"END_JSON";
|
||||
${json}{
|
||||
"name":"$name",
|
||||
"version":"$pkg->{version}",
|
||||
"category":"$pkg->{category}",
|
||||
"license":"$pkg->{license}",
|
||||
"maintainer": [$pkg_maintainer],
|
||||
"depends":[$pkg_deps]},
|
||||
END_JSON
|
||||
}
|
||||
|
||||
$json =~ s/[\n\r]//g;
|
||||
$json =~ s/\,$//;
|
||||
print "[$json]";
|
||||
}
|
||||
|
||||
sub parse_command() {
|
||||
GetOptions("ignore=s", \@ignore);
|
||||
my $cmd = shift @ARGV;
|
||||
@ -594,6 +628,7 @@ sub parse_command() {
|
||||
/^kconfig/ and return gen_kconfig_overrides();
|
||||
/^source$/ and return gen_package_source();
|
||||
/^pkgaux$/ and return gen_package_auxiliary();
|
||||
/^pkgmanifestjson$/ and return gen_package_manifest_json();
|
||||
/^license$/ and return gen_package_license(0);
|
||||
/^licensefull$/ and return gen_package_license(1);
|
||||
/^usergroup$/ and return gen_usergroup_list();
|
||||
@ -606,6 +641,7 @@ Available Commands:
|
||||
$0 kconfig [file] [config] [patchver] Kernel config overrides
|
||||
$0 source [file] Package source file information
|
||||
$0 pkgaux [file] Package auxiliary variables in makefile format
|
||||
$0 pkgmanifestjson [file] Package manifests in JSON format
|
||||
$0 license [file] Package license information
|
||||
$0 licensefull [file] Package license information (full list)
|
||||
$0 usergroup [file] Package usergroup allocation list
|
||||
|
||||
@ -102,6 +102,7 @@ staging_dir/host/.prereq-build: include/prereq-build.mk
|
||||
|
||||
_call_info: FORCE
|
||||
echo 'Current Target: "$(TARGETID)"'
|
||||
echo 'Current Architecture: "$(ARCH)"'
|
||||
echo 'Current Revision: "$(REVISION)"'
|
||||
echo 'Default Packages: $(DEFAULT_PACKAGES)'
|
||||
echo 'Available Profiles:'
|
||||
|
||||
152
target/linux/ath79/dts/qca9563_tplink_cpe710-v1.dts
Normal file
152
target/linux/ath79/dts/qca9563_tplink_cpe710-v1.dts
Normal file
@ -0,0 +1,152 @@
|
||||
// SPDX-License-Identifier: GPL-2.0-or-later OR MIT
|
||||
|
||||
#include "qca956x.dtsi"
|
||||
|
||||
#include <dt-bindings/gpio/gpio.h>
|
||||
#include <dt-bindings/input/input.h>
|
||||
|
||||
/ {
|
||||
model = "TP-Link CPE710 v1";
|
||||
compatible = "tplink,cpe710-v1", "qca,qca9563";
|
||||
|
||||
aliases {
|
||||
label-mac-device = ð0;
|
||||
led-boot = &led_lan;
|
||||
led-failsafe = &led_lan;
|
||||
led-upgrade = &led_lan;
|
||||
};
|
||||
|
||||
leds {
|
||||
compatible = "gpio-leds";
|
||||
|
||||
led_lan: lan {
|
||||
label = "blue:lan";
|
||||
gpios = <&gpio 5 GPIO_ACTIVE_LOW>;
|
||||
};
|
||||
|
||||
wlan5g {
|
||||
label = "blue:wlan5g";
|
||||
gpios = <&gpio 1 GPIO_ACTIVE_LOW>;
|
||||
linux,default-trigger = "phy0tpt";
|
||||
};
|
||||
};
|
||||
|
||||
keys {
|
||||
compatible = "gpio-keys";
|
||||
|
||||
reset {
|
||||
label = "Reset button";
|
||||
linux,code = <KEY_RESTART>;
|
||||
gpios = <&gpio 2 GPIO_ACTIVE_LOW>;
|
||||
debounce-interval = <60>;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
&pcie {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&spi {
|
||||
status = "okay";
|
||||
|
||||
flash@0 {
|
||||
compatible = "jedec,spi-nor";
|
||||
reg = <0>;
|
||||
spi-max-frequency = <40000000>;
|
||||
|
||||
partitions {
|
||||
compatible = "fixed-partitions";
|
||||
#address-cells = <1>;
|
||||
#size-cells = <1>;
|
||||
|
||||
partition@0 {
|
||||
label = "u-boot";
|
||||
reg = <0x000000 0x040000>;
|
||||
read-only;
|
||||
};
|
||||
|
||||
partition@40000 {
|
||||
label = "u-boot-env";
|
||||
reg = <0x040000 0x010000>;
|
||||
};
|
||||
|
||||
partition@50000 {
|
||||
label = "partition-table";
|
||||
reg = <0x050000 0x010000>;
|
||||
read-only;
|
||||
};
|
||||
|
||||
info: partition@60000 {
|
||||
label = "info";
|
||||
reg = <0x060000 0x010000>;
|
||||
read-only;
|
||||
};
|
||||
|
||||
partition@70000 {
|
||||
compatible = "denx,uimage";
|
||||
label = "firmware";
|
||||
reg = <0x070000 0xf50000>;
|
||||
};
|
||||
|
||||
partition@fc0000 {
|
||||
label = "config";
|
||||
reg = <0xfc0000 0x030000>;
|
||||
read-only;
|
||||
};
|
||||
|
||||
art: partition@ff0000 {
|
||||
label = "art";
|
||||
reg = <0xff0000 0x010000>;
|
||||
read-only;
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
&pinmux {
|
||||
mdio_pins: mdio_pins {
|
||||
/* GPIO 10 as MDIO(0x20), GPIO 8 as MDC(0x21) */
|
||||
pinctrl-single,bits = <0x8 0x00200021 0x00ff00ff>;
|
||||
};
|
||||
};
|
||||
|
||||
&mdio0 {
|
||||
status = "okay";
|
||||
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&mdio_pins>;
|
||||
|
||||
phy-mask = <0x10>;
|
||||
|
||||
phy4: ethernet-phy@4 {
|
||||
reg = <4>;
|
||||
reset-gpios = <&gpio 11 GPIO_ACTIVE_LOW>;
|
||||
};
|
||||
};
|
||||
|
||||
ð0 {
|
||||
status = "okay";
|
||||
|
||||
phy-handle = <&phy4>;
|
||||
phy-mode = "sgmii";
|
||||
|
||||
nvmem-cells = <&macaddr_info_8>;
|
||||
nvmem-cell-names = "mac-address";
|
||||
|
||||
qca956x-serdes-fixup;
|
||||
|
||||
gmac-config {
|
||||
device = <&gmac>;
|
||||
};
|
||||
};
|
||||
|
||||
&info {
|
||||
compatible = "nvmem-cells";
|
||||
#address-cells = <1>;
|
||||
#size-cells = <1>;
|
||||
|
||||
macaddr_info_8: macaddr@8 {
|
||||
reg = <0x8 0x6>;
|
||||
};
|
||||
};
|
||||
@ -169,7 +169,8 @@ enterasys,ws-ap3705i|\
|
||||
openmesh,mr900-v1|\
|
||||
openmesh,mr900-v2|\
|
||||
openmesh,mr1750-v1|\
|
||||
openmesh,mr1750-v2)
|
||||
openmesh,mr1750-v2|\
|
||||
tplink,cpe710-v1)
|
||||
ucidef_set_led_netdev "lan" "LAN" "blue:lan" "eth0"
|
||||
;;
|
||||
compex,wpj344-16m|\
|
||||
|
||||
@ -63,6 +63,7 @@ ath79_setup_interfaces()
|
||||
tplink,cpe510-v3|\
|
||||
tplink,cpe610-v1|\
|
||||
tplink,cpe610-v2|\
|
||||
tplink,cpe710-v1|\
|
||||
tplink,eap225-outdoor-v1|\
|
||||
tplink,eap225-v3|\
|
||||
tplink,eap245-v1|\
|
||||
|
||||
@ -236,6 +236,12 @@ case "$FIRMWARE" in
|
||||
ln -sf /lib/firmware/ath10k/pre-cal-pci-0000\:00\:00.0.bin \
|
||||
/lib/firmware/ath10k/QCA9888/hw2.0/board.bin
|
||||
;;
|
||||
tplink,cpe710-v1)
|
||||
caldata_extract "art" 0x5000 0x2f20
|
||||
ath10k_patch_mac $(mtd_get_mac_binary info 0x8)
|
||||
ln -sf /lib/firmware/ath10k/pre-cal-pci-0000\:00\:00.0.bin \
|
||||
/lib/firmware/ath10k/QCA9888/hw2.0/board.bin
|
||||
;;
|
||||
tplink,eap225-outdoor-v1|\
|
||||
tplink,eap225-v3|\
|
||||
tplink,eap225-wall-v2|\
|
||||
|
||||
@ -362,6 +362,17 @@ define Device/tplink_cpe610-v2
|
||||
endef
|
||||
TARGET_DEVICES += tplink_cpe610-v2
|
||||
|
||||
define Device/tplink_cpe710-v1
|
||||
$(Device/tplink-safeloader-uimage)
|
||||
SOC := qca9563
|
||||
IMAGE_SIZE := 15680k
|
||||
DEVICE_MODEL := CPE710
|
||||
DEVICE_VARIANT := v1
|
||||
DEVICE_PACKAGES := kmod-ath10k-ct ath10k-firmware-qca9888-ct
|
||||
TPLINK_BOARD_ID := CPE710V1
|
||||
endef
|
||||
TARGET_DEVICES += tplink_cpe710-v1
|
||||
|
||||
define Device/tplink-eap2x5
|
||||
$(Device/tplink-safeloader)
|
||||
LOADER_TYPE := elf
|
||||
|
||||
@ -146,17 +146,20 @@ define Device/Default
|
||||
endef
|
||||
|
||||
define Device/standard
|
||||
DEVICE_TITLE := Image with LZMA loader and LZMA compressed kernel
|
||||
DEVICE_VENDOR := Generic
|
||||
DEVICE_MODEL := Image with LZMA loader and LZMA compressed kernel
|
||||
endef
|
||||
|
||||
define Device/standard-noloader-gz
|
||||
DEVICE_TITLE := Image with gzipped kernel
|
||||
DEVICE_VENDOR := Generic
|
||||
DEVICE_MODEL := Image with gzipped kernel
|
||||
KERNEL_NAME = vmlinux.gz
|
||||
IMAGE/trx := append-rootfs | trx-without-loader
|
||||
endef
|
||||
|
||||
define Device/standard-noloader-nodictionarylzma
|
||||
DEVICE_TITLE := Image with LZMA compressed kernel matching CFE decompressor
|
||||
DEVICE_VENDOR := Generic
|
||||
DEVICE_MODEL := Image with LZMA compressed kernel matching CFE decompressor
|
||||
KERNEL_NAME = vmlinux-nodictionary.lzma
|
||||
IMAGE/trx := append-rootfs | trx-without-loader
|
||||
endef
|
||||
|
||||
@ -66,7 +66,8 @@ TARGET_DEVICES += linksys_e3000-v1
|
||||
|
||||
# generic has Ethernet drivers as modules so overwrite standard image
|
||||
define Device/standard
|
||||
DEVICE_TITLE := Image with LZMA loader and LZMA compressed kernel
|
||||
DEVICE_VENDOR := Generic
|
||||
DEVICE_MODEL := Image with LZMA loader and LZMA compressed kernel
|
||||
DEVICE_PACKAGES := kmod-b44 kmod-bgmac kmod-tg3
|
||||
endef
|
||||
TARGET_DEVICES += standard
|
||||
|
||||
@ -94,10 +94,6 @@ bcm53xx_setup_macs()
|
||||
# As vendor doesn't use eth0 its MAC may be missing. Use one from eth2.
|
||||
et2macaddr="$(nvram get et2macaddr)"
|
||||
;;
|
||||
meraki,mr32)
|
||||
# The MAC is stored on an AT24C64 eeprom and not on the nvram
|
||||
et2macaddr=$(get_mac_binary "/sys/bus/i2c/devices/0-0050/eeprom" 0x66)
|
||||
;;
|
||||
esac
|
||||
|
||||
[ -n "$et2macaddr" ] && ucidef_set_interface_macaddr "lan" "$et2macaddr"
|
||||
|
||||
@ -328,10 +328,12 @@ define Device/meraki_mr32
|
||||
# if the partition is smaller than the old one.
|
||||
KERNEL_LOADADDR := 0x00008000
|
||||
KERNEL_INITRAMFS_SUFFIX := .bin
|
||||
DEVICE_DTS_DELIMITER := @
|
||||
DEVICE_DTS_CONFIG := config@1
|
||||
KERNEL_INITRAMFS := kernel-bin | fit none $$(DTS_DIR)/$$(DEVICE_DTS).dtb | \
|
||||
pad-to 10362880
|
||||
KERNEL := kernel-bin | fit none $$(DTS_DIR)/$$(DEVICE_DTS).dtb
|
||||
IMAGES := sysupgrade.bin
|
||||
IMAGES += sysupgrade.bin
|
||||
# Currently the only device that uses the new image check
|
||||
IMAGE/sysupgrade.bin := sysupgrade-tar | append-metadata
|
||||
|
||||
@ -437,7 +439,7 @@ define Device/tplink_archer-c5-v2
|
||||
TPLINK_BOARD := ARCHER-C5-V2
|
||||
BROKEN := y
|
||||
endef
|
||||
TARGET_DEVICES += tplink_archer-c5-v2
|
||||
#TARGET_DEVICES += tplink_archer-c5-v2
|
||||
|
||||
define Device/tplink_archer-c9-v1
|
||||
DEVICE_VENDOR := TP-Link
|
||||
@ -449,6 +451,6 @@ define Device/tplink_archer-c9-v1
|
||||
TPLINK_BOARD := ARCHERC9
|
||||
BROKEN := y
|
||||
endef
|
||||
TARGET_DEVICES += tplink_archer-c9-v1
|
||||
#TARGET_DEVICES += tplink_archer-c9-v1
|
||||
|
||||
$(eval $(call BuildImage))
|
||||
|
||||
@ -0,0 +1,27 @@
|
||||
From 695717eb4c61173d05a277e37132b5e2c6531bf1 Mon Sep 17 00:00:00 2001
|
||||
From: Matthew Hagan <mnhagan88@gmail.com>
|
||||
Date: Sun, 29 Aug 2021 22:37:47 +0000
|
||||
Subject: [PATCH] ARM: dts: NSP: Add bcm958623hr board name to dts
|
||||
|
||||
This board was previously added to
|
||||
Documentation/devicetree/bindings/arm/bcm/brcm,nsp.yaml
|
||||
however the dts file was not updated to reflect this change. This patch
|
||||
corrects bcm958623hr.dts by adding the board name to the compatible.
|
||||
|
||||
Signed-off-by: Matthew Hagan <mnhagan88@gmail.com>
|
||||
Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
|
||||
---
|
||||
arch/arm/boot/dts/bcm958623hr.dts | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
--- a/arch/arm/boot/dts/bcm958623hr.dts
|
||||
+++ b/arch/arm/boot/dts/bcm958623hr.dts
|
||||
@@ -37,7 +37,7 @@
|
||||
|
||||
/ {
|
||||
model = "NorthStar Plus SVK (BCM958623HR)";
|
||||
- compatible = "brcm,bcm58623", "brcm,nsp";
|
||||
+ compatible = "brcm,bcm958623hr", "brcm,bcm58623", "brcm,nsp";
|
||||
|
||||
chosen {
|
||||
stdout-path = "serial0:115200n8";
|
||||
@ -0,0 +1,40 @@
|
||||
From 15a563d008ef9d04df525f0c476cd7d7127bb883 Mon Sep 17 00:00:00 2001
|
||||
From: Matthew Hagan <mnhagan88@gmail.com>
|
||||
Date: Sun, 29 Aug 2021 22:37:48 +0000
|
||||
Subject: [PATCH] ARM: dts: NSP: Fix mpcore, mmc node names
|
||||
|
||||
Running dtbs_check yielded the issues with bcm-nsp.dtsi.
|
||||
|
||||
Firstly this patch fixes the following message by appending "-bus" to
|
||||
the mpcore node name:
|
||||
mpcore@19000000: $nodename:0: 'mpcore@19000000' does not match '^([a-z][a-z0-9\\-]+-bus|bus|soc|axi|ahb|apb)(@[0-9a-f]+)?$'
|
||||
|
||||
Secondly mmc node name. The label name can remain as is.
|
||||
sdhci@21000: $nodename:0: 'sdhci@21000' does not match '^mmc(@.*)?$'
|
||||
|
||||
Signed-off-by: Matthew Hagan <mnhagan88@gmail.com>
|
||||
Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
|
||||
---
|
||||
arch/arm/boot/dts/bcm-nsp.dtsi | 4 ++--
|
||||
1 file changed, 2 insertions(+), 2 deletions(-)
|
||||
|
||||
--- a/arch/arm/boot/dts/bcm-nsp.dtsi
|
||||
+++ b/arch/arm/boot/dts/bcm-nsp.dtsi
|
||||
@@ -77,7 +77,7 @@
|
||||
interrupt-affinity = <&cpu0>, <&cpu1>;
|
||||
};
|
||||
|
||||
- mpcore@19000000 {
|
||||
+ mpcore-bus@19000000 {
|
||||
compatible = "simple-bus";
|
||||
ranges = <0x00000000 0x19000000 0x00023000>;
|
||||
#address-cells = <1>;
|
||||
@@ -219,7 +219,7 @@
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
- sdio: sdhci@21000 {
|
||||
+ sdio: mmc@21000 {
|
||||
compatible = "brcm,sdhci-iproc-cygnus";
|
||||
reg = <0x21000 0x100>;
|
||||
interrupts = <GIC_SPI 145 IRQ_TYPE_LEVEL_HIGH>;
|
||||
@ -0,0 +1,47 @@
|
||||
From 38f8111369f318a538e9d4d89d8e48030c22fb40 Mon Sep 17 00:00:00 2001
|
||||
From: Matthew Hagan <mnhagan88@gmail.com>
|
||||
Date: Sun, 29 Aug 2021 22:37:49 +0000
|
||||
Subject: [PATCH] ARM: dts: NSP: Fix MDIO mux node names
|
||||
|
||||
While functional, the mdio-mux-mmioreg binding does not conform to
|
||||
Documentation/devicetree/bindings/net/mdio-mux-mmioreg.yaml in that an
|
||||
mdio-mux compatible is also required. Without this the following output
|
||||
is observed when running dtbs_check:
|
||||
|
||||
mdio-mux@32000: compatible: ['mdio-mux-mmioreg'] is too short
|
||||
|
||||
This change brings conformance to this requirement and corresponds
|
||||
likewise to Rafal Milecki's change to the BCM5301x platform[1].
|
||||
|
||||
[1] https://lore.kernel.org/linux-arm-kernel/20210822191256.3715003-1-f.fainelli@gmail.com/T/
|
||||
|
||||
Signed-off-by: Matthew Hagan <mnhagan88@gmail.com>
|
||||
Reviewed-by: Andrew Lunn <andrew@lunn.ch>
|
||||
Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
|
||||
---
|
||||
arch/arm/boot/dts/bcm-nsp.dtsi | 2 +-
|
||||
arch/arm/boot/dts/bcm958625-meraki-alamo.dtsi | 2 +-
|
||||
2 files changed, 2 insertions(+), 2 deletions(-)
|
||||
|
||||
--- a/arch/arm/boot/dts/bcm-nsp.dtsi
|
||||
+++ b/arch/arm/boot/dts/bcm-nsp.dtsi
|
||||
@@ -371,7 +371,7 @@
|
||||
};
|
||||
|
||||
mdio-mux@32000 {
|
||||
- compatible = "mdio-mux-mmioreg";
|
||||
+ compatible = "mdio-mux-mmioreg", "mdio-mux";
|
||||
reg = <0x32000 0x4>;
|
||||
mux-mask = <0x200>;
|
||||
#address-cells = <1>;
|
||||
--- a/arch/arm/boot/dts/bcm958625-meraki-alamo.dtsi
|
||||
+++ b/arch/arm/boot/dts/bcm958625-meraki-alamo.dtsi
|
||||
@@ -72,7 +72,7 @@
|
||||
};
|
||||
|
||||
mdio-mii-mux {
|
||||
- compatible = "mdio-mux-mmioreg";
|
||||
+ compatible = "mdio-mux-mmioreg", "mdio-mux";
|
||||
reg = <0x1803f1c0 0x4>;
|
||||
mux-mask = <0x2000>;
|
||||
mdio-parent-bus = <&mdio_ext>;
|
||||
@ -0,0 +1,28 @@
|
||||
From 56e4e548427240d85fd220460d0ab5987e1dec00 Mon Sep 17 00:00:00 2001
|
||||
From: Matthew Hagan <mnhagan88@gmail.com>
|
||||
Date: Sun, 29 Aug 2021 22:37:50 +0000
|
||||
Subject: [PATCH] ARM: dts: NSP: Fix MX64/MX65 eeprom node name
|
||||
|
||||
Running dtbs_check yields the following message when checking the
|
||||
MX64/MX65 devicetree:
|
||||
at24@50: $nodename:0: 'at24@50' does not match '^eeprom@[0-9a-f]{1,2}$'
|
||||
|
||||
This patch fixes the issue by renaming the at24 node appropriately.
|
||||
|
||||
Signed-off-by: Matthew Hagan <mnhagan88@gmail.com>
|
||||
Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
|
||||
---
|
||||
arch/arm/boot/dts/bcm958625-meraki-mx6x-common.dtsi | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
--- a/arch/arm/boot/dts/bcm958625-meraki-mx6x-common.dtsi
|
||||
+++ b/arch/arm/boot/dts/bcm958625-meraki-mx6x-common.dtsi
|
||||
@@ -48,7 +48,7 @@
|
||||
&i2c0 {
|
||||
status = "okay";
|
||||
|
||||
- at24@50 {
|
||||
+ eeprom@50 {
|
||||
compatible = "atmel,24c64";
|
||||
reg = <0x50>;
|
||||
pagesize = <32>;
|
||||
@ -0,0 +1,52 @@
|
||||
From f5fc9044e5d45a4d97b5240c8723f4677f647c9f Mon Sep 17 00:00:00 2001
|
||||
From: Matthew Hagan <mnhagan88@gmail.com>
|
||||
Date: Sun, 29 Aug 2021 22:37:51 +0000
|
||||
Subject: [PATCH] ARM: dts: NSP: Fix MX65 MDIO mux warnings
|
||||
|
||||
The naming of this node is based upon that of the initial EA9500 dts[1].
|
||||
However this does not conform with the mdio-mux format, yielding the
|
||||
following message when running dtbs_check:
|
||||
mdio-mii-mux: $nodename:0: 'mdio-mii-mux' does not match '^mdio-mux[\\-@]?'
|
||||
|
||||
Secondly, this node should be moved to within the axi node and given the
|
||||
appropriate unit address. This also requires exposing the axi node via a
|
||||
label in bcm-nsp.dtsi. This fixes the following warning:
|
||||
Warning (unit_address_vs_reg): /mdio-mii-mux: node has a reg or ranges property, but no unit name
|
||||
|
||||
[1]https://patchwork.ozlabs.org/project/linux-imx/patch/20180618174159.86150-1-npcomplete13@gmail.com/#1941353
|
||||
|
||||
Signed-off-by: Matthew Hagan <mnhagan88@gmail.com>
|
||||
Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
|
||||
---
|
||||
arch/arm/boot/dts/bcm-nsp.dtsi | 2 +-
|
||||
arch/arm/boot/dts/bcm958625-meraki-alamo.dtsi | 6 ++++--
|
||||
2 files changed, 5 insertions(+), 3 deletions(-)
|
||||
|
||||
--- a/arch/arm/boot/dts/bcm-nsp.dtsi
|
||||
+++ b/arch/arm/boot/dts/bcm-nsp.dtsi
|
||||
@@ -166,7 +166,7 @@
|
||||
};
|
||||
};
|
||||
|
||||
- axi@18000000 {
|
||||
+ axi: axi@18000000 {
|
||||
compatible = "simple-bus";
|
||||
ranges = <0x00000000 0x18000000 0x0011c40c>;
|
||||
#address-cells = <1>;
|
||||
--- a/arch/arm/boot/dts/bcm958625-meraki-alamo.dtsi
|
||||
+++ b/arch/arm/boot/dts/bcm958625-meraki-alamo.dtsi
|
||||
@@ -70,10 +70,12 @@
|
||||
gpios = <&gpioa 31 GPIO_ACTIVE_HIGH>;
|
||||
};
|
||||
};
|
||||
+};
|
||||
|
||||
- mdio-mii-mux {
|
||||
+&axi {
|
||||
+ mdio-mux@3f1c0 {
|
||||
compatible = "mdio-mux-mmioreg", "mdio-mux";
|
||||
- reg = <0x1803f1c0 0x4>;
|
||||
+ reg = <0x3f1c0 0x4>;
|
||||
mux-mask = <0x2000>;
|
||||
mdio-parent-bus = <&mdio_ext>;
|
||||
#address-cells = <1>;
|
||||
@ -1,7 +1,7 @@
|
||||
From 225ffaf3d0e00daa2d0c7b68e8fd731ebbde3c03 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <rafal@milecki.pl>
|
||||
Date: Tue, 7 Sep 2021 07:51:17 +0200
|
||||
Subject: [PATCH next] ARM: dts: BCM5301X: Specify switch ports for more
|
||||
devices
|
||||
Date: Tue, 7 Sep 2021 08:00:48 +0200
|
||||
Subject: [PATCH] ARM: dts: BCM5301X: Specify switch ports for more devices
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
@ -10,6 +10,7 @@ Those are remaining models I have that didn't have ports yet. All
|
||||
tested.
|
||||
|
||||
Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
|
||||
Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
|
||||
---
|
||||
arch/arm/boot/dts/bcm4708-netgear-r6250.dts | 37 ++++++++++++++++
|
||||
.../boot/dts/bcm47081-buffalo-wzr-600dhp2.dts | 37 ++++++++++++++++
|
||||
@ -0,0 +1,44 @@
|
||||
From 9fb90ae6cae7f8fe4fbf626945f32cd9da2c3892 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <rafal@milecki.pl>
|
||||
Date: Mon, 20 Sep 2021 16:10:23 +0200
|
||||
Subject: [PATCH] ARM: dts: BCM53573: Describe on-SoC BCM53125 rev 4 switch
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
BCM53573 family SoC have Ethernet switch connected to the first Ethernet
|
||||
controller (accessible over MDIO).
|
||||
|
||||
Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
|
||||
Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
|
||||
---
|
||||
arch/arm/boot/dts/bcm53573.dtsi | 18 ++++++++++++++++++
|
||||
1 file changed, 18 insertions(+)
|
||||
|
||||
--- a/arch/arm/boot/dts/bcm53573.dtsi
|
||||
+++ b/arch/arm/boot/dts/bcm53573.dtsi
|
||||
@@ -180,6 +180,24 @@
|
||||
|
||||
gmac0: ethernet@5000 {
|
||||
reg = <0x5000 0x1000>;
|
||||
+
|
||||
+ mdio {
|
||||
+ #address-cells = <1>;
|
||||
+ #size-cells = <0>;
|
||||
+
|
||||
+ switch: switch@1e {
|
||||
+ compatible = "brcm,bcm53125";
|
||||
+ reg = <0x1e>;
|
||||
+
|
||||
+ status = "disabled";
|
||||
+
|
||||
+ /* ports are defined in board DTS */
|
||||
+ ports {
|
||||
+ #address-cells = <1>;
|
||||
+ #size-cells = <0>;
|
||||
+ };
|
||||
+ };
|
||||
+ };
|
||||
};
|
||||
|
||||
gmac1: ethernet@b000 {
|
||||
@ -0,0 +1,59 @@
|
||||
From 64612828628cca6e3992e421f45c242dc6625647 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <rafal@milecki.pl>
|
||||
Date: Mon, 20 Sep 2021 16:10:24 +0200
|
||||
Subject: [PATCH] ARM: dts: BCM53573: Add Tenda AC9 switch ports
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
This router has 1 WAN and 4 LAN ports.
|
||||
|
||||
Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
|
||||
Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
|
||||
---
|
||||
arch/arm/boot/dts/bcm47189-tenda-ac9.dts | 37 ++++++++++++++++++++++++
|
||||
1 file changed, 37 insertions(+)
|
||||
|
||||
--- a/arch/arm/boot/dts/bcm47189-tenda-ac9.dts
|
||||
+++ b/arch/arm/boot/dts/bcm47189-tenda-ac9.dts
|
||||
@@ -105,3 +105,40 @@
|
||||
};
|
||||
};
|
||||
};
|
||||
+
|
||||
+&switch {
|
||||
+ status = "okay";
|
||||
+
|
||||
+ ports {
|
||||
+ port@0 {
|
||||
+ reg = <0>;
|
||||
+ label = "wan";
|
||||
+ };
|
||||
+
|
||||
+ port@1 {
|
||||
+ reg = <1>;
|
||||
+ label = "lan1";
|
||||
+ };
|
||||
+
|
||||
+ port@2 {
|
||||
+ reg = <2>;
|
||||
+ label = "lan2";
|
||||
+ };
|
||||
+
|
||||
+ port@3 {
|
||||
+ reg = <3>;
|
||||
+ label = "lan3";
|
||||
+ };
|
||||
+
|
||||
+ port@4 {
|
||||
+ reg = <4>;
|
||||
+ label = "lan4";
|
||||
+ };
|
||||
+
|
||||
+ port@5 {
|
||||
+ reg = <5>;
|
||||
+ label = "cpu";
|
||||
+ ethernet = <&gmac0>;
|
||||
+ };
|
||||
+ };
|
||||
+};
|
||||
@ -0,0 +1,57 @@
|
||||
From 6abc4ca5a28070945e0d68cb4160b309bfbf4b8b Mon Sep 17 00:00:00 2001
|
||||
From: Christian Lamparter <chunkeey@gmail.com>
|
||||
Date: Sat, 18 Sep 2021 19:29:30 +0200
|
||||
Subject: [PATCH] ARM: BCM53016: Specify switch ports for Meraki MR32
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
the switch identifies itself as a BCM53012 (rev 5)...
|
||||
This patch has been tested & verified on OpenWrt's
|
||||
snapshot with Linux 5.10 (didn't test any older kernels).
|
||||
The MR32 is able to "talk to the network" as before with
|
||||
OpenWrt's SWITCHDEV b53 driver.
|
||||
|
||||
| b53-srab-switch 18007000.ethernet-switch: found switch: BCM53012, rev 5
|
||||
| libphy: dsa slave smi: probed
|
||||
| b53-srab-switch 18007000.ethernet-switch poe (uninitialized):
|
||||
| PHY [dsa-0.0:00] driver [Generic PHY] (irq=POLL)
|
||||
| b53-srab-switch 18007000.ethernet-switch: Using legacy PHYLIB callbacks.
|
||||
| Please migrate to PHYLINK!
|
||||
| DSA: tree 0 setup
|
||||
|
||||
Reported-by: Rafał Miłecki <zajec5@gmail.com>
|
||||
Signed-off-by: Christian Lamparter <chunkeey@gmail.com>
|
||||
Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
|
||||
---
|
||||
arch/arm/boot/dts/bcm53016-meraki-mr32.dts | 22 ++++++++++++++++++++++
|
||||
1 file changed, 22 insertions(+)
|
||||
|
||||
--- a/arch/arm/boot/dts/bcm53016-meraki-mr32.dts
|
||||
+++ b/arch/arm/boot/dts/bcm53016-meraki-mr32.dts
|
||||
@@ -195,3 +195,25 @@
|
||||
};
|
||||
};
|
||||
};
|
||||
+
|
||||
+&srab {
|
||||
+ status = "okay";
|
||||
+
|
||||
+ ports {
|
||||
+ port@0 {
|
||||
+ reg = <0>;
|
||||
+ label = "poe";
|
||||
+ };
|
||||
+
|
||||
+ port@5 {
|
||||
+ reg = <5>;
|
||||
+ label = "cpu";
|
||||
+ ethernet = <&gmac0>;
|
||||
+
|
||||
+ fixed-link {
|
||||
+ speed = <1000>;
|
||||
+ duplex-full;
|
||||
+ };
|
||||
+ };
|
||||
+ };
|
||||
+};
|
||||
@ -0,0 +1,41 @@
|
||||
From 477ffdbdf389cc91294d66e251cc6f856da5820c Mon Sep 17 00:00:00 2001
|
||||
From: Christian Lamparter <chunkeey@gmail.com>
|
||||
Date: Sat, 18 Sep 2021 19:29:31 +0200
|
||||
Subject: [PATCH] ARM: BCM53016: MR32: get mac-address from nvmem
|
||||
|
||||
The MAC-Address of the MR32's sole ethernet port is
|
||||
located in offset 0x66 of the attached AT24C64 eeprom.
|
||||
|
||||
Signed-off-by: Christian Lamparter <chunkeey@gmail.com>
|
||||
Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
|
||||
---
|
||||
arch/arm/boot/dts/bcm53016-meraki-mr32.dts | 11 +++++++++++
|
||||
1 file changed, 11 insertions(+)
|
||||
|
||||
--- a/arch/arm/boot/dts/bcm53016-meraki-mr32.dts
|
||||
+++ b/arch/arm/boot/dts/bcm53016-meraki-mr32.dts
|
||||
@@ -110,6 +110,12 @@
|
||||
reg = <0x50>;
|
||||
pagesize = <32>;
|
||||
read-only;
|
||||
+ #address-cells = <1>;
|
||||
+ #size-cells = <1>;
|
||||
+
|
||||
+ mac_address: mac-address@66 {
|
||||
+ reg = <0x66 0x6>;
|
||||
+ };
|
||||
};
|
||||
};
|
||||
};
|
||||
@@ -133,6 +139,11 @@
|
||||
*/
|
||||
};
|
||||
|
||||
+&gmac0 {
|
||||
+ nvmem-cell-names = "mac-address";
|
||||
+ nvmem-cells = <&mac_address>;
|
||||
+};
|
||||
+
|
||||
&gmac1 {
|
||||
status = "disabled";
|
||||
};
|
||||
@ -0,0 +1,242 @@
|
||||
From beff77b93452cd2057c859694709dd34a181488f Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Ar=C4=B1n=C3=A7=20=C3=9CNAL?= <arinc.unal@arinc9.com>
|
||||
Date: Tue, 21 Sep 2021 20:19:01 +0800
|
||||
Subject: [PATCH] ARM: dts: BCM5301X: Add DT for Asus RT-AC88U
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
Hardware Info
|
||||
-------------
|
||||
|
||||
Processor - Broadcom BCM4709C0KFEBG dual-core @ 1.4 GHz
|
||||
Switch - BCM53012 in BCM4709C0KFEBG & external RTL8365MB
|
||||
DDR3 RAM - 512 MB
|
||||
Flash - 128 MB (ESMT F59L1G81LA-25T)
|
||||
2.4GHz - BCM4366 4×4 2.4/5G single chip 802.11ac SoC
|
||||
5GHz - BCM4366 4×4 2.4/5G single chip 802.11ac SoC
|
||||
Ports - 8 Ports, 1 WAN Ports
|
||||
|
||||
Tested on OpenWrt on kernel 5.10 built with DSA driver.
|
||||
|
||||
Signed-off-by: Arınç ÜNAL <arinc.unal@arinc9.com>
|
||||
Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
|
||||
---
|
||||
arch/arm/boot/dts/Makefile | 1 +
|
||||
arch/arm/boot/dts/bcm47094-asus-rt-ac88u.dts | 200 +++++++++++++++++++
|
||||
2 files changed, 201 insertions(+)
|
||||
create mode 100644 arch/arm/boot/dts/bcm47094-asus-rt-ac88u.dts
|
||||
|
||||
--- a/arch/arm/boot/dts/Makefile
|
||||
+++ b/arch/arm/boot/dts/Makefile
|
||||
@@ -118,6 +118,7 @@ dtb-$(CONFIG_ARCH_BCM_5301X) += \
|
||||
bcm4709-netgear-r7000.dtb \
|
||||
bcm4709-netgear-r8000.dtb \
|
||||
bcm4709-tplink-archer-c9-v1.dtb \
|
||||
+ bcm47094-asus-rt-ac88u.dtb \
|
||||
bcm47094-dlink-dir-885l.dtb \
|
||||
bcm47094-linksys-panamera.dtb \
|
||||
bcm47094-luxul-abr-4500.dtb \
|
||||
--- /dev/null
|
||||
+++ b/arch/arm/boot/dts/bcm47094-asus-rt-ac88u.dts
|
||||
@@ -0,0 +1,200 @@
|
||||
+// SPDX-License-Identifier: GPL-2.0-or-later OR MIT
|
||||
+/*
|
||||
+ * Copyright (C) 2021 Arınç ÜNAL <arinc.unal@arinc9.com>
|
||||
+ */
|
||||
+
|
||||
+/dts-v1/;
|
||||
+
|
||||
+#include "bcm47094.dtsi"
|
||||
+#include "bcm5301x-nand-cs0-bch8.dtsi"
|
||||
+
|
||||
+/ {
|
||||
+ compatible = "asus,rt-ac88u", "brcm,bcm47094", "brcm,bcm4708";
|
||||
+ model = "Asus RT-AC88U";
|
||||
+
|
||||
+ chosen {
|
||||
+ bootargs = "earlycon";
|
||||
+ };
|
||||
+
|
||||
+ memory@0 {
|
||||
+ device_type = "memory";
|
||||
+ reg = <0x00000000 0x08000000>,
|
||||
+ <0x88000000 0x18000000>;
|
||||
+ };
|
||||
+
|
||||
+ nvram@1c080000 {
|
||||
+ compatible = "brcm,nvram";
|
||||
+ reg = <0x1c080000 0x00180000>;
|
||||
+ };
|
||||
+
|
||||
+ leds {
|
||||
+ compatible = "gpio-leds";
|
||||
+
|
||||
+ power {
|
||||
+ label = "white:power";
|
||||
+ gpios = <&chipcommon 3 GPIO_ACTIVE_LOW>;
|
||||
+ linux,default-trigger = "default-on";
|
||||
+ };
|
||||
+
|
||||
+ wan-red {
|
||||
+ label = "red:wan";
|
||||
+ gpios = <&chipcommon 5 GPIO_ACTIVE_HIGH>;
|
||||
+ };
|
||||
+
|
||||
+ lan {
|
||||
+ label = "white:lan";
|
||||
+ gpios = <&chipcommon 21 GPIO_ACTIVE_LOW>;
|
||||
+ };
|
||||
+
|
||||
+ usb2 {
|
||||
+ label = "white:usb2";
|
||||
+ gpios = <&chipcommon 16 GPIO_ACTIVE_LOW>;
|
||||
+ trigger-sources = <&ehci_port2>;
|
||||
+ linux,default-trigger = "usbport";
|
||||
+ };
|
||||
+
|
||||
+ usb3 {
|
||||
+ label = "white:usb3";
|
||||
+ gpios = <&chipcommon 17 GPIO_ACTIVE_LOW>;
|
||||
+ trigger-sources = <&ehci_port1>, <&xhci_port1>;
|
||||
+ linux,default-trigger = "usbport";
|
||||
+ };
|
||||
+
|
||||
+ wps {
|
||||
+ label = "white:wps";
|
||||
+ gpios = <&chipcommon 19 GPIO_ACTIVE_LOW>;
|
||||
+ };
|
||||
+ };
|
||||
+
|
||||
+ gpio-keys {
|
||||
+ compatible = "gpio-keys";
|
||||
+ #address-cells = <1>;
|
||||
+ #size-cells = <0>;
|
||||
+
|
||||
+ wps {
|
||||
+ label = "WPS";
|
||||
+ linux,code = <KEY_WPS_BUTTON>;
|
||||
+ gpios = <&chipcommon 20 GPIO_ACTIVE_LOW>;
|
||||
+ };
|
||||
+
|
||||
+ reset {
|
||||
+ label = "Reset";
|
||||
+ linux,code = <KEY_RESTART>;
|
||||
+ gpios = <&chipcommon 11 GPIO_ACTIVE_LOW>;
|
||||
+ };
|
||||
+
|
||||
+ wifi {
|
||||
+ label = "Wi-Fi";
|
||||
+ linux,code = <KEY_RFKILL>;
|
||||
+ gpios = <&chipcommon 18 GPIO_ACTIVE_LOW>;
|
||||
+ };
|
||||
+
|
||||
+ led {
|
||||
+ label = "Backlight";
|
||||
+ linux,code = <KEY_BRIGHTNESS_ZERO>;
|
||||
+ gpios = <&chipcommon 4 GPIO_ACTIVE_LOW>;
|
||||
+ };
|
||||
+ };
|
||||
+};
|
||||
+
|
||||
+&srab {
|
||||
+ compatible = "brcm,bcm53012-srab", "brcm,bcm5301x-srab";
|
||||
+ status = "okay";
|
||||
+ dsa,member = <0 0>;
|
||||
+
|
||||
+ ports {
|
||||
+ #address-cells = <1>;
|
||||
+ #size-cells = <0>;
|
||||
+
|
||||
+ port@0 {
|
||||
+ reg = <0>;
|
||||
+ label = "lan4";
|
||||
+ };
|
||||
+
|
||||
+ port@1 {
|
||||
+ reg = <1>;
|
||||
+ label = "lan3";
|
||||
+ };
|
||||
+
|
||||
+ port@2 {
|
||||
+ reg = <2>;
|
||||
+ label = "lan2";
|
||||
+ };
|
||||
+
|
||||
+ port@3 {
|
||||
+ reg = <3>;
|
||||
+ label = "lan1";
|
||||
+ };
|
||||
+
|
||||
+ port@4 {
|
||||
+ reg = <4>;
|
||||
+ label = "wan";
|
||||
+ };
|
||||
+
|
||||
+ sw0_p5: port@5 {
|
||||
+ reg = <5>;
|
||||
+ label = "extsw";
|
||||
+
|
||||
+ fixed-link {
|
||||
+ speed = <1000>;
|
||||
+ full-duplex;
|
||||
+ };
|
||||
+ };
|
||||
+
|
||||
+ port@7 {
|
||||
+ reg = <7>;
|
||||
+ ethernet = <&gmac1>;
|
||||
+ label = "cpu";
|
||||
+
|
||||
+ fixed-link {
|
||||
+ speed = <1000>;
|
||||
+ full-duplex;
|
||||
+ };
|
||||
+ };
|
||||
+
|
||||
+ port@8 {
|
||||
+ reg = <8>;
|
||||
+ ethernet = <&gmac2>;
|
||||
+ label = "cpu";
|
||||
+ status = "disabled";
|
||||
+
|
||||
+ fixed-link {
|
||||
+ speed = <1000>;
|
||||
+ full-duplex;
|
||||
+ };
|
||||
+ };
|
||||
+ };
|
||||
+};
|
||||
+
|
||||
+&usb2 {
|
||||
+ vcc-gpio = <&chipcommon 9 GPIO_ACTIVE_HIGH>;
|
||||
+};
|
||||
+
|
||||
+&usb3_phy {
|
||||
+ status = "okay";
|
||||
+};
|
||||
+
|
||||
+&nandcs {
|
||||
+ partitions {
|
||||
+ compatible = "fixed-partitions";
|
||||
+ #address-cells = <1>;
|
||||
+ #size-cells = <1>;
|
||||
+
|
||||
+ partition@0 {
|
||||
+ label = "boot";
|
||||
+ reg = <0x00000000 0x00080000>;
|
||||
+ read-only;
|
||||
+ };
|
||||
+
|
||||
+ partition@80000 {
|
||||
+ label = "nvram";
|
||||
+ reg = <0x00080000 0x00180000>;
|
||||
+ };
|
||||
+
|
||||
+ partition@200000 {
|
||||
+ label = "firmware";
|
||||
+ reg = <0x00200000 0x07e00000>;
|
||||
+ compatible = "brcm,trx";
|
||||
+ };
|
||||
+ };
|
||||
+};
|
||||
@ -0,0 +1,46 @@
|
||||
From 029497e66bdc762e001880e4c85a91f35a54b1e2 Mon Sep 17 00:00:00 2001
|
||||
From: Christian Lamparter <chunkeey@gmail.com>
|
||||
Date: Sun, 19 Sep 2021 13:57:25 +0200
|
||||
Subject: net: bgmac-bcma: handle deferred probe error due to mac-address
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
Due to the inclusion of nvmem handling into the mac-address getter
|
||||
function of_get_mac_address() by
|
||||
commit d01f449c008a ("of_net: add NVMEM support to of_get_mac_address")
|
||||
it is now possible to get a -EPROBE_DEFER return code. Which did cause
|
||||
bgmac to assign a random ethernet address.
|
||||
|
||||
This exact issue happened on my Meraki MR32. The nvmem provider is
|
||||
an EEPROM (at24c64) which gets instantiated once the module
|
||||
driver is loaded... This happens once the filesystem becomes available.
|
||||
|
||||
With this patch, bgmac_probe() will propagate the -EPROBE_DEFER error.
|
||||
Then the driver subsystem will reschedule the probe at a later time.
|
||||
|
||||
Cc: Petr Štetiar <ynezz@true.cz>
|
||||
Cc: Michael Walle <michael@walle.cc>
|
||||
Fixes: d01f449c008a ("of_net: add NVMEM support to of_get_mac_address")
|
||||
Signed-off-by: Christian Lamparter <chunkeey@gmail.com>
|
||||
Signed-off-by: David S. Miller <davem@davemloft.net>
|
||||
---
|
||||
drivers/net/ethernet/broadcom/bgmac-bcma.c | 2 ++
|
||||
1 file changed, 2 insertions(+)
|
||||
|
||||
diff --git a/drivers/net/ethernet/broadcom/bgmac-bcma.c b/drivers/net/ethernet/broadcom/bgmac-bcma.c
|
||||
index 85fa0ab7201c7..9513cfb5ba58c 100644
|
||||
--- a/drivers/net/ethernet/broadcom/bgmac-bcma.c
|
||||
+++ b/drivers/net/ethernet/broadcom/bgmac-bcma.c
|
||||
@@ -129,6 +129,8 @@ static int bgmac_probe(struct bcma_device *core)
|
||||
bcma_set_drvdata(core, bgmac);
|
||||
|
||||
err = of_get_mac_address(bgmac->dev->of_node, bgmac->net_dev->dev_addr);
|
||||
+ if (err == -EPROBE_DEFER)
|
||||
+ return err;
|
||||
|
||||
/* If no MAC address assigned via device tree, check SPROM */
|
||||
if (err) {
|
||||
--
|
||||
cgit 1.2.3-1.el7
|
||||
|
||||
@ -16,7 +16,7 @@ Signed-off-by: Rafał Miłecki <zajec5@gmail.com>
|
||||
+ bcm4709-netgear-r7900.dtb \
|
||||
bcm4709-netgear-r8000.dtb \
|
||||
bcm4709-tplink-archer-c9-v1.dtb \
|
||||
bcm47094-dlink-dir-885l.dtb \
|
||||
bcm47094-asus-rt-ac88u.dtb \
|
||||
--- /dev/null
|
||||
+++ b/arch/arm/boot/dts/bcm4709-netgear-r7900.dts
|
||||
@@ -0,0 +1,42 @@
|
||||
|
||||
@ -58,7 +58,7 @@ Subject: [PATCH] MIPS: BCM63XX: add inventel Livebox support
|
||||
#endif /* __BOARD_COMMON_H */
|
||||
--- /dev/null
|
||||
+++ b/arch/mips/bcm63xx/boards/board_livebox.c
|
||||
@@ -0,0 +1,153 @@
|
||||
@@ -0,0 +1,158 @@
|
||||
+/*
|
||||
+ * This file is subject to the terms and conditions of the GNU General Public
|
||||
+ * License. See the file "COPYING" in the main directory of this archive
|
||||
@ -130,12 +130,17 @@ Subject: [PATCH] MIPS: BCM63XX: add inventel Livebox support
|
||||
+/*
|
||||
+ * register & return a new board mac address
|
||||
+ */
|
||||
+static int livebox_get_mac_address(u8 *mac)
|
||||
+static int livebox_get_mac_address(u8 mac[ETH_ALEN])
|
||||
+{
|
||||
+ u8 *p;
|
||||
+ int count;
|
||||
+ void __iomem *volatile mmio;
|
||||
+
|
||||
+ memcpy(mac, (u8 *)0xBEBFF377, ETH_ALEN);
|
||||
+ mmio = ioremap(0x1ebff377, 0x8);
|
||||
+ if (!mmio)
|
||||
+ return -EIO;
|
||||
+ memcpy_fromio(mac, mmio, ETH_ALEN);
|
||||
+ iounmap(mmio);
|
||||
+
|
||||
+ p = mac + ETH_ALEN - 1;
|
||||
+ count = mac_addr_used;
|
||||
|
||||
@ -58,7 +58,7 @@ Subject: [PATCH] MIPS: BCM63XX: add inventel Livebox support
|
||||
#endif /* __BOARD_COMMON_H */
|
||||
--- /dev/null
|
||||
+++ b/arch/mips/bcm63xx/boards/board_livebox.c
|
||||
@@ -0,0 +1,153 @@
|
||||
@@ -0,0 +1,158 @@
|
||||
+/*
|
||||
+ * This file is subject to the terms and conditions of the GNU General Public
|
||||
+ * License. See the file "COPYING" in the main directory of this archive
|
||||
@ -130,12 +130,17 @@ Subject: [PATCH] MIPS: BCM63XX: add inventel Livebox support
|
||||
+/*
|
||||
+ * register & return a new board mac address
|
||||
+ */
|
||||
+static int livebox_get_mac_address(u8 *mac)
|
||||
+static int livebox_get_mac_address(u8 mac[ETH_ALEN])
|
||||
+{
|
||||
+ u8 *p;
|
||||
+ int count;
|
||||
+ void __iomem *volatile mmio;
|
||||
+
|
||||
+ memcpy(mac, (u8 *)0xBEBFF377, ETH_ALEN);
|
||||
+ mmio = ioremap(0x1ebff377, 0x8);
|
||||
+ if (!mmio)
|
||||
+ return -EIO;
|
||||
+ memcpy_fromio(mac, mmio, ETH_ALEN);
|
||||
+ iounmap(mmio);
|
||||
+
|
||||
+ p = mac + ETH_ALEN - 1;
|
||||
+ count = mac_addr_used;
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user