diff --git a/backports/0004-mediatek-update-to-latest-trunk-version.patch b/backports/0004-mediatek-update-to-latest-trunk-version.patch index 612212d92..3ba2f9552 100644 --- a/backports/0004-mediatek-update-to-latest-trunk-version.patch +++ b/backports/0004-mediatek-update-to-latest-trunk-version.patch @@ -1,7 +1,7 @@ -From f967d2f243f7d13201025480372b8a829d7f32d6 Mon Sep 17 00:00:00 2001 +From 583b54e2f10ee14b5756d7035e641f7a1bb3095c Mon Sep 17 00:00:00 2001 From: Felix Fietkau Date: Thu, 9 Apr 2020 09:53:24 +0200 -Subject: [PATCH 01/53] mediatek: update to latest trunk version +Subject: [PATCH 01/43] mediatek: update to latest trunk version Signed-off-by: Felix Fietkau --- @@ -101957,7 +101957,7 @@ diff --git a/target/linux/mediatek/mt7622/config-5.4 b/target/linux/mediatek/mt7 similarity index 67% rename from target/linux/mediatek/mt7622/config-5.4 rename to target/linux/mediatek/mt7622/config-5.10 -index 282cd0bab5..e6696bd50a 100644 +index b873bdc40c..2d7f82ce23 100644 --- a/target/linux/mediatek/mt7622/config-5.4 +++ b/target/linux/mediatek/mt7622/config-5.10 @@ -1,59 +1,6 @@ @@ -102116,7 +102116,7 @@ index 282cd0bab5..e6696bd50a 100644 # CONFIG_FUJITSU_ERRATUM_010001 is not set CONFIG_FW_LOADER_PAGED_BUF=y CONFIG_GENERIC_ALLOCATOR=y -@@ -267,103 +201,20 @@ CONFIG_GLOB=y +@@ -267,102 +201,19 @@ CONFIG_GLOB=y CONFIG_GPIOLIB=y CONFIG_GRO_CELLS=y CONFIG_HANDLE_DOMAIN_IRQ=y @@ -102184,7 +102184,6 @@ index 282cd0bab5..e6696bd50a 100644 -CONFIG_HAVE_UID16=y -CONFIG_HAVE_VIRT_CPU_ACCOUNTING_GEN=y CONFIG_HOLES_IN_ZONE=y - # CONFIG_HW_RANDOM_MTK is not set CONFIG_HZ=250 CONFIG_HZ_250=y -CONFIG_I2C=y @@ -102220,7 +102219,7 @@ index 282cd0bab5..e6696bd50a 100644 CONFIG_IO_URING=y CONFIG_IRQCHIP=y CONFIG_IRQ_DOMAIN=y -@@ -371,9 +222,10 @@ CONFIG_IRQ_DOMAIN_HIERARCHY=y +@@ -370,9 +221,10 @@ CONFIG_IRQ_DOMAIN_HIERARCHY=y CONFIG_IRQ_FORCED_THREADING=y CONFIG_IRQ_TIME_ACCOUNTING=y CONFIG_IRQ_WORK=y @@ -102232,7 +102231,7 @@ index 282cd0bab5..e6696bd50a 100644 CONFIG_LOCK_DEBUGGING_SUPPORT=y CONFIG_LOCK_SPIN_ON_OWNER=y CONFIG_LZO_COMPRESS=y -@@ -381,21 +233,25 @@ CONFIG_LZO_DECOMPRESS=y +@@ -380,21 +232,25 @@ CONFIG_LZO_DECOMPRESS=y CONFIG_MAGIC_SYSRQ=y CONFIG_MDIO_BUS=y CONFIG_MDIO_DEVICE=y @@ -102260,7 +102259,7 @@ index 282cd0bab5..e6696bd50a 100644 CONFIG_MTD_RAW_NAND=y CONFIG_MTD_SPI_NAND=y CONFIG_MTD_SPI_NOR=y -@@ -423,7 +279,6 @@ CONFIG_NET_DSA=y +@@ -422,7 +278,6 @@ CONFIG_NET_DSA=y CONFIG_NET_DSA_MT7530=y CONFIG_NET_DSA_TAG_MTK=y CONFIG_NET_FLOW_LIMIT=y @@ -102268,7 +102267,7 @@ index 282cd0bab5..e6696bd50a 100644 CONFIG_NET_MEDIATEK_SOC=y CONFIG_NET_SWITCHDEV=y CONFIG_NET_VENDOR_MEDIATEK=y -@@ -448,7 +303,6 @@ CONFIG_PARTITION_PERCPU=y +@@ -447,7 +302,6 @@ CONFIG_PARTITION_PERCPU=y CONFIG_PCI=y CONFIG_PCIEAER=y CONFIG_PCIEASPM=y @@ -102276,7 +102275,7 @@ index 282cd0bab5..e6696bd50a 100644 # CONFIG_PCIEASPM_DEFAULT is not set CONFIG_PCIEASPM_PERFORMANCE=y # CONFIG_PCIEASPM_POWERSAVE is not set -@@ -461,6 +315,7 @@ CONFIG_PCI_DOMAINS=y +@@ -460,6 +314,7 @@ CONFIG_PCI_DOMAINS=y CONFIG_PCI_DOMAINS_GENERIC=y CONFIG_PCI_MSI=y CONFIG_PCI_MSI_IRQ_DOMAIN=y @@ -102284,7 +102283,7 @@ index 282cd0bab5..e6696bd50a 100644 CONFIG_PGTABLE_LEVELS=3 CONFIG_PHYLIB=y CONFIG_PHYLINK=y -@@ -478,7 +333,7 @@ CONFIG_PINCTRL_MT7622=y +@@ -477,7 +332,7 @@ CONFIG_PINCTRL_MT7622=y CONFIG_PINCTRL_MT8516=y CONFIG_PINCTRL_MTK=y CONFIG_PINCTRL_MTK_MOORE=y @@ -102293,7 +102292,7 @@ index 282cd0bab5..e6696bd50a 100644 CONFIG_PM=y CONFIG_PM_CLK=y CONFIG_PM_GENERIC_DOMAINS=y -@@ -488,6 +343,20 @@ CONFIG_POWER_RESET=y +@@ -487,6 +342,20 @@ CONFIG_POWER_RESET=y CONFIG_POWER_RESET_SYSCON=y CONFIG_POWER_SUPPLY=y CONFIG_PRINTK_TIME=y @@ -102314,7 +102313,7 @@ index 282cd0bab5..e6696bd50a 100644 CONFIG_PWM=y CONFIG_PWM_MEDIATEK=y # CONFIG_PWM_MTK_DISP is not set -@@ -500,7 +369,9 @@ CONFIG_RATIONAL=y +@@ -499,7 +368,9 @@ CONFIG_RATIONAL=y CONFIG_RCU_NEED_SEGCBLIST=y CONFIG_RCU_STALL_COMMON=y CONFIG_REALTEK_PHY=y @@ -102325,7 +102324,7 @@ index 282cd0bab5..e6696bd50a 100644 CONFIG_REGMAP=y CONFIG_REGMAP_MMIO=y CONFIG_REGULATOR=y -@@ -555,7 +426,6 @@ CONFIG_THERMAL_EMERGENCY_POWEROFF_DELAY_MS=0 +@@ -552,7 +423,6 @@ CONFIG_THERMAL_EMERGENCY_POWEROFF_DELAY_MS=0 CONFIG_THERMAL_EMULATION=y CONFIG_THERMAL_GOV_BANG_BANG=y CONFIG_THERMAL_GOV_FAIR_SHARE=y @@ -102333,7 +102332,7 @@ index 282cd0bab5..e6696bd50a 100644 CONFIG_THERMAL_GOV_STEP_WISE=y CONFIG_THERMAL_GOV_USER_SPACE=y CONFIG_THERMAL_OF=y -@@ -587,6 +457,9 @@ CONFIG_WATCHDOG_PRETIMEOUT_GOV_PANIC=y +@@ -584,6 +454,9 @@ CONFIG_WATCHDOG_PRETIMEOUT_GOV_PANIC=y CONFIG_WATCHDOG_PRETIMEOUT_GOV_SEL=m CONFIG_WATCHDOG_SYSFS=y CONFIG_XPS=y diff --git a/backports/0008-realtek-update-to-latest-owrt-HEAD.patch b/backports/0008-realtek-update-to-latest-owrt-HEAD.patch index 20e6deefc..e8e50d44f 100644 --- a/backports/0008-realtek-update-to-latest-owrt-HEAD.patch +++ b/backports/0008-realtek-update-to-latest-owrt-HEAD.patch @@ -1,39 +1,40 @@ -From 3351962effe2bc5e8a6a2eda06ca35f69c19a03a Mon Sep 17 00:00:00 2001 +From cd5d073a6469beb8e7a3a267672e34baa73cbd83 Mon Sep 17 00:00:00 2001 From: John Crispin Date: Tue, 16 Mar 2021 10:46:51 +0100 -Subject: [PATCH] realtek: update to latest owrt HEAD +Subject: [PATCH 01/40] realtek: update to latest owrt HEAD Signed-off-by: John Crispin --- - package/boot/uboot-envtools/files/realtek | 5 + + package/boot/uboot-envtools/files/realtek | 7 + .../realtek/base-files/etc/board.d/01_leds | 1 - .../realtek/base-files/etc/board.d/02_network | 3 + - target/linux/realtek/config-5.4 | 29 +- + target/linux/realtek/config-5.4 | 31 +- + .../realtek/dts/rtl8380_zyxel_gs1900-10hp.dts | 20 +- .../dts/rtl8392_edgecore_ecs4100-12ph.dts | 297 +++++++++ target/linux/realtek/dts/rtl839x.dtsi | 197 ++++++ .../include/asm/mach-rtl838x/mach-rtl83xx.h | 23 +- .../files-5.4/arch/mips/rtl838x/setup.c | 18 - .../files-5.4/drivers/gpio/edgecore_reboot.c | 61 ++ .../files-5.4/drivers/gpio/gpio-rtl838x.c | 3 + - .../drivers/net/dsa/rtl83xx/common.c | 28 +- - .../files-5.4/drivers/net/dsa/rtl83xx/dsa.c | 567 ++++++++++++----- - .../drivers/net/dsa/rtl83xx/rtl838x.c | 581 ++++++++++++++---- + .../drivers/net/dsa/rtl83xx/common.c | 39 +- + .../files-5.4/drivers/net/dsa/rtl83xx/dsa.c | 609 +++++++++++++----- + .../drivers/net/dsa/rtl83xx/rtl838x.c | 581 +++++++++++++---- .../drivers/net/dsa/rtl83xx/rtl838x.h | 56 +- .../drivers/net/dsa/rtl83xx/rtl839x.c | 540 ++++++++++++---- .../drivers/net/dsa/rtl83xx/rtl930x.c | 506 +++++++++++++-- - .../drivers/net/dsa/rtl83xx/rtl931x.c | 69 ++- - .../drivers/net/ethernet/rtl838x_eth.c | 127 +++- + .../drivers/net/dsa/rtl83xx/rtl931x.c | 69 +- + .../drivers/net/ethernet/rtl838x_eth.c | 155 +++-- .../drivers/net/ethernet/rtl838x_eth.h | 1 + - .../files-5.4/drivers/net/phy/rtl83xx-phy.c | 562 ++++++++++------- + .../files-5.4/drivers/net/phy/rtl83xx-phy.c | 562 +++++++++------- target/linux/realtek/image/Makefile | 9 + .../301-gpio-add-rtl838x-driver.patch | 2 +- - ...0-gpio-Add-Realtek-Otto-GPIO-support.patch | 412 +++++++++++++ + ...0-gpio-Add-Realtek-Otto-GPIO-support.patch | 412 ++++++++++++ .../realtek/patches-5.4/706-sysled.patch | 294 +++++++++ .../realtek/patches-5.4/707-reboot.patch | 9 + .../realtek/patches-5.4/708-poor-stp.patch | 16 + .../realtek/patches-5.4/710-adt7470.patch | 22 + .../realtek/patches-5.4/711-ec4100.patch | 41 ++ - 28 files changed, 3717 insertions(+), 762 deletions(-) + 29 files changed, 3785 insertions(+), 799 deletions(-) create mode 100644 target/linux/realtek/dts/rtl8392_edgecore_ecs4100-12ph.dts create mode 100644 target/linux/realtek/dts/rtl839x.dtsi create mode 100644 target/linux/realtek/files-5.4/drivers/gpio/edgecore_reboot.c @@ -45,10 +46,17 @@ Signed-off-by: John Crispin create mode 100644 target/linux/realtek/patches-5.4/711-ec4100.patch diff --git a/package/boot/uboot-envtools/files/realtek b/package/boot/uboot-envtools/files/realtek -index a91ca82604..7b73679104 100644 +index cce0628ffc..a4b7089d62 100644 --- a/package/boot/uboot-envtools/files/realtek +++ b/package/boot/uboot-envtools/files/realtek -@@ -19,6 +19,11 @@ zyxel,gs1900-10hp) +@@ -11,11 +11,18 @@ case "$board" in + d-link,dgs-1210-16|\ + d-link,dgs-1210-28|\ + d-link,dgs-1210-10p|\ ++zyxel,gs1900-8hp-v1|\ ++zyxel,gs1900-8hp-v2|\ + zyxel,gs1900-10hp) + idx="$(find_mtd_index u-boot-env)" [ -n "$idx" ] && \ ubootenv_add_uci_config "/dev/mtd$idx" "0x0" "0x400" "0x10000" ;; @@ -71,7 +79,7 @@ index 699ab817dd..36ca01a696 100755 board=$(board_name) diff --git a/target/linux/realtek/base-files/etc/board.d/02_network b/target/linux/realtek/base-files/etc/board.d/02_network -index 45ab84ee9e..2052bab60a 100755 +index 2568fd2e0e..2b82ccb0aa 100755 --- a/target/linux/realtek/base-files/etc/board.d/02_network +++ b/target/linux/realtek/base-files/etc/board.d/02_network @@ -49,6 +49,9 @@ done @@ -85,7 +93,7 @@ index 45ab84ee9e..2052bab60a 100755 ucidef_set_poe 130 "$lan_list" ;; diff --git a/target/linux/realtek/config-5.4 b/target/linux/realtek/config-5.4 -index 51025d5d89..34943f5b54 100644 +index 2fbd904376..3f72b911cc 100644 --- a/target/linux/realtek/config-5.4 +++ b/target/linux/realtek/config-5.4 @@ -2,17 +2,18 @@ CONFIG_ARCH_32BIT_OFF_T=y @@ -136,7 +144,14 @@ index 51025d5d89..34943f5b54 100644 CONFIG_GRO_CELLS=y CONFIG_HANDLE_DOMAIN_IRQ=y CONFIG_HARDWARE_WATCHPOINTS=y -@@ -89,6 +88,7 @@ CONFIG_HZ_PERIODIC=y +@@ -82,12 +81,14 @@ CONFIG_HAS_DMA=y + CONFIG_HAS_IOMEM=y + CONFIG_HAS_IOPORT_MAP=y + # CONFIG_HIGH_RES_TIMERS is not set ++CONFIG_HWMON=y + CONFIG_HZ=250 + CONFIG_HZ_250=y + CONFIG_HZ_PERIODIC=y CONFIG_I2C=y CONFIG_I2C_ALGOBIT=y CONFIG_I2C_BOARDINFO=y @@ -144,7 +159,12 @@ index 51025d5d89..34943f5b54 100644 CONFIG_I2C_GPIO=y CONFIG_INITRAMFS_SOURCE="" CONFIG_IRQCHIP=y -@@ -107,6 +107,8 @@ CONFIG_MDIO_BUS=y +@@ -101,10 +102,13 @@ CONFIG_LEGACY_PTYS=y + CONFIG_LEGACY_PTY_COUNT=256 + CONFIG_LIBFDT=y + CONFIG_LOCK_DEBUGGING_SUPPORT=y ++CONFIG_MARVELL_PHY=y + CONFIG_MDIO_BUS=y CONFIG_MDIO_DEVICE=y CONFIG_MDIO_I2C=y CONFIG_MEMFD_CREATE=y @@ -153,10 +173,10 @@ index 51025d5d89..34943f5b54 100644 CONFIG_MFD_SYSCON=y CONFIG_MIGRATION=y CONFIG_MIPS=y -@@ -162,11 +164,17 @@ CONFIG_POWER_RESET=y +@@ -159,11 +163,17 @@ CONFIG_PINCTRL=y + CONFIG_POWER_RESET=y CONFIG_POWER_RESET_SYSCON=y CONFIG_PSB6970_PHY=y - CONFIG_REALTEK_PHY=y +CONFIG_RATIONAL=y +CONFIG_REALTEK_PHY=y +CONFIG_REALTEK_SOC_PHY=y @@ -171,7 +191,7 @@ index 51025d5d89..34943f5b54 100644 CONFIG_SERIAL_MCTRL_GPIO=y CONFIG_SERIAL_OF_PLATFORM=y CONFIG_SFP=y -@@ -175,7 +183,7 @@ CONFIG_SPI_MASTER=y +@@ -172,7 +182,7 @@ CONFIG_SPI_MASTER=y CONFIG_SPI_MEM=y CONFIG_SPI_RTL838X=y CONFIG_SRCU=y @@ -180,7 +200,7 @@ index 51025d5d89..34943f5b54 100644 CONFIG_SWPHY=y CONFIG_SYSCTL_EXCEPTION_TRACE=y CONFIG_SYS_HAS_CPU_MIPS32_R1=y -@@ -187,8 +195,11 @@ CONFIG_SYS_SUPPORTS_BIG_ENDIAN=y +@@ -184,8 +194,11 @@ CONFIG_SYS_SUPPORTS_BIG_ENDIAN=y CONFIG_SYS_SUPPORTS_MIPS16=y CONFIG_TARGET_ISA_REV=2 CONFIG_TICK_CPU_ACCOUNTING=y @@ -192,6 +212,44 @@ index 51025d5d89..34943f5b54 100644 +CONFIG_WATCHDOG_CORE=y CONFIG_ZLIB_DEFLATE=y CONFIG_ZLIB_INFLATE=y +diff --git a/target/linux/realtek/dts/rtl8380_zyxel_gs1900-10hp.dts b/target/linux/realtek/dts/rtl8380_zyxel_gs1900-10hp.dts +index 92d0e25fc4..a590450055 100644 +--- a/target/linux/realtek/dts/rtl8380_zyxel_gs1900-10hp.dts ++++ b/target/linux/realtek/dts/rtl8380_zyxel_gs1900-10hp.dts +@@ -55,29 +55,17 @@ + port@24 { + reg = <24>; + label = "lan9"; +- phy-mode = "rgmii-id"; +- phy-handle = <&phy24>; ++ phy-mode = "1000base-x"; ++ managed = "in-band-status"; + sfp = <&sfp0>; +- +- fixed-link { +- speed = <1000>; +- full-duplex; +- pause; +- }; + }; + + port@26 { + reg = <26>; + label = "lan10"; +- phy-mode = "rgmii-id"; +- phy-handle = <&phy26>; ++ phy-mode = "1000base-x"; ++ managed = "in-band-status"; + sfp = <&sfp1>; +- +- fixed-link { +- speed = <1000>; +- full-duplex; +- pause; +- }; + }; + }; + }; diff --git a/target/linux/realtek/dts/rtl8392_edgecore_ecs4100-12ph.dts b/target/linux/realtek/dts/rtl8392_edgecore_ecs4100-12ph.dts new file mode 100644 index 0000000000..303b79ac83 @@ -858,7 +916,7 @@ index 8207e4bb73..60b6f08834 100644 pr_debug("Found RTL8393 GPIO\n"); break; diff --git a/target/linux/realtek/files-5.4/drivers/net/dsa/rtl83xx/common.c b/target/linux/realtek/files-5.4/drivers/net/dsa/rtl83xx/common.c -index 6940afa7f2..a380906b92 100644 +index 698f2892ea..a380906b92 100644 --- a/target/linux/realtek/files-5.4/drivers/net/dsa/rtl83xx/common.c +++ b/target/linux/realtek/files-5.4/drivers/net/dsa/rtl83xx/common.c @@ -18,27 +18,6 @@ extern const struct dsa_switch_ops rtl930x_switch_ops; @@ -906,7 +964,26 @@ index 6940afa7f2..a380906b92 100644 sw_w32(cmd, r->addr); do { } while (sw_r32(r->addr) & BIT(r->c_bit + 1)); } -@@ -593,6 +569,7 @@ static int __init rtl83xx_sw_probe(struct platform_device *pdev) +@@ -368,8 +344,8 @@ static int __init rtl83xx_mdio_probe(struct rtl838x_switch_priv *priv) + + /* Enable PHY control via SoC */ + if (priv->family_id == RTL8380_FAMILY_ID) { +- /* Enable PHY control via SoC */ +- sw_w32_mask(0, BIT(15), RTL838X_SMI_GLB_CTRL); ++ /* Enable SerDes NWAY and PHY control via SoC */ ++ sw_w32_mask(BIT(7), BIT(15), RTL838X_SMI_GLB_CTRL); + } else { + /* Disable PHY polling via SoC */ + sw_w32_mask(BIT(7), 0, RTL839X_SMI_GLB_CTRL); +@@ -555,7 +531,6 @@ static int __init rtl83xx_sw_probe(struct platform_device *pdev) + int err = 0, i; + struct rtl838x_switch_priv *priv; + struct device *dev = &pdev->dev; +- u64 irq_mask; + u64 bpdu_mask; + + pr_debug("Probing RTL838X switch device\n"); +@@ -594,6 +569,7 @@ static int __init rtl83xx_sw_probe(struct platform_device *pdev) priv->fib_entries = 8192; rtl8380_get_version(priv); priv->n_lags = 8; @@ -914,7 +991,7 @@ index 6940afa7f2..a380906b92 100644 break; case RTL8390_FAMILY_ID: priv->ds->ops = &rtl83xx_switch_ops; -@@ -605,6 +582,7 @@ static int __init rtl83xx_sw_probe(struct platform_device *pdev) +@@ -606,6 +582,7 @@ static int __init rtl83xx_sw_probe(struct platform_device *pdev) priv->fib_entries = 16384; rtl8390_get_version(priv); priv->n_lags = 16; @@ -922,7 +999,7 @@ index 6940afa7f2..a380906b92 100644 break; case RTL9300_FAMILY_ID: priv->ds->ops = &rtl930x_switch_ops; -@@ -618,6 +596,7 @@ static int __init rtl83xx_sw_probe(struct platform_device *pdev) +@@ -619,6 +596,7 @@ static int __init rtl83xx_sw_probe(struct platform_device *pdev) priv->version = RTL8390_VERSION_A; priv->n_lags = 16; sw_w32(1, RTL930X_ST_CTRL); @@ -930,7 +1007,7 @@ index 6940afa7f2..a380906b92 100644 break; case RTL9310_FAMILY_ID: priv->ds->ops = &rtl930x_switch_ops; -@@ -630,6 +609,7 @@ static int __init rtl83xx_sw_probe(struct platform_device *pdev) +@@ -631,6 +609,7 @@ static int __init rtl83xx_sw_probe(struct platform_device *pdev) priv->fib_entries = 16384; priv->version = RTL8390_VERSION_A; priv->n_lags = 16; @@ -938,8 +1015,21 @@ index 6940afa7f2..a380906b92 100644 break; } pr_debug("Chip version %c\n", priv->version); +@@ -650,9 +629,9 @@ static int __init rtl83xx_sw_probe(struct platform_device *pdev) + + /* Enable link and media change interrupts. Are the SERDES masks needed? */ + sw_w32_mask(0, 3, priv->r->isr_glb_src); +- +- priv->r->set_port_reg_le(irq_mask, priv->r->isr_port_link_sts_chg); +- priv->r->set_port_reg_le(irq_mask, priv->r->imr_port_link_sts_chg); ++ ++ priv->r->set_port_reg_le(priv->irq_mask, priv->r->isr_port_link_sts_chg); ++ priv->r->set_port_reg_le(priv->irq_mask, priv->r->imr_port_link_sts_chg); + + priv->link_state_irq = platform_get_irq(pdev, 0); + pr_info("LINK state irq: %d\n", priv->link_state_irq); diff --git a/target/linux/realtek/files-5.4/drivers/net/dsa/rtl83xx/dsa.c b/target/linux/realtek/files-5.4/drivers/net/dsa/rtl83xx/dsa.c -index 987b47dc8f..721b1817a5 100644 +index e0832c42b8..c5f243c55a 100644 --- a/target/linux/realtek/files-5.4/drivers/net/dsa/rtl83xx/dsa.c +++ b/target/linux/realtek/files-5.4/drivers/net/dsa/rtl83xx/dsa.c @@ -26,50 +26,6 @@ static void rtl83xx_init_stats(struct rtl838x_switch_priv *priv) @@ -1077,7 +1167,7 @@ index 987b47dc8f..721b1817a5 100644 ds->configure_vlan_while_not_filtering = true; rtl83xx_enable_phy_polling(priv); -@@ -242,7 +232,7 @@ static void rtl83xx_phylink_validate(struct dsa_switch *ds, int port, +@@ -242,9 +232,10 @@ static void rtl83xx_phylink_validate(struct dsa_switch *ds, int port, struct rtl838x_switch_priv *priv = ds->priv; __ETHTOOL_DECLARE_LINK_MODE_MASK(mask) = { 0, }; @@ -1085,8 +1175,11 @@ index 987b47dc8f..721b1817a5 100644 + pr_debug("In %s port %d, state is %d", __func__, port, state->interface); if (!phy_interface_mode_is_rgmii(state->interface) && - state->interface != PHY_INTERFACE_MODE_NA && -@@ -279,6 +269,10 @@ static void rtl83xx_phylink_validate(struct dsa_switch *ds, int port, ++ state->interface != PHY_INTERFACE_MODE_NA && + state->interface != PHY_INTERFACE_MODE_1000BASEX && + state->interface != PHY_INTERFACE_MODE_MII && + state->interface != PHY_INTERFACE_MODE_REVMII && +@@ -278,6 +269,10 @@ static void rtl83xx_phylink_validate(struct dsa_switch *ds, int port, if (port >= 24 && port <= 27 && priv->family_id == RTL8380_FAMILY_ID) phylink_set(mask, 1000baseX_Full); @@ -1097,7 +1190,16 @@ index 987b47dc8f..721b1817a5 100644 phylink_set(mask, 10baseT_Half); phylink_set(mask, 10baseT_Full); phylink_set(mask, 100baseT_Half); -@@ -330,7 +324,8 @@ static int rtl83xx_phylink_mac_link_state(struct dsa_switch *ds, int port, +@@ -310,7 +305,7 @@ static int rtl83xx_phylink_mac_link_state(struct dsa_switch *ds, int port, + link = priv->r->get_port_reg_le(priv->r->mac_link_sts); + if (link & BIT_ULL(port)) + state->link = 1; +- pr_info("%s: link state: %llx\n", __func__, link & BIT_ULL(port)); ++ pr_debug("%s: link state port %d: %llx\n", __func__, port, link & BIT_ULL(port)); + + state->duplex = 0; + if (priv->r->get_port_reg_le(priv->r->mac_link_dup_sts) & BIT_ULL(port)) +@@ -329,7 +324,8 @@ static int rtl83xx_phylink_mac_link_state(struct dsa_switch *ds, int port, state->speed = SPEED_1000; break; case 3: @@ -1107,15 +1209,64 @@ index 987b47dc8f..721b1817a5 100644 state->speed = SPEED_2500; else state->speed = SPEED_100; /* Is in fact 500Mbit */ -@@ -344,7 +339,6 @@ static int rtl83xx_phylink_mac_link_state(struct dsa_switch *ds, int port, +@@ -343,6 +339,43 @@ static int rtl83xx_phylink_mac_link_state(struct dsa_switch *ds, int port, return 1; } -- - static void rtl83xx_config_interface(int port, phy_interface_t interface) - { - u32 old, int_shift, sds_shift; -@@ -549,8 +543,11 @@ static int rtl83xx_port_enable(struct dsa_switch *ds, int port, ++static void rtl83xx_config_interface(int port, phy_interface_t interface) ++{ ++ u32 old, int_shift, sds_shift; ++ ++ switch (port) { ++ case 24: ++ int_shift = 0; ++ sds_shift = 5; ++ break; ++ case 26: ++ int_shift = 3; ++ sds_shift = 0; ++ break; ++ default: ++ return; ++ } ++ ++ old = sw_r32(RTL838X_SDS_MODE_SEL); ++ switch (interface) { ++ case PHY_INTERFACE_MODE_1000BASEX: ++ if ((old >> sds_shift & 0x1f) == 4) ++ return; ++ sw_w32_mask(0x7 << int_shift, 1 << int_shift, RTL838X_INT_MODE_CTRL); ++ sw_w32_mask(0x1f << sds_shift, 4 << sds_shift, RTL838X_SDS_MODE_SEL); ++ break; ++ case PHY_INTERFACE_MODE_SGMII: ++ if ((old >> sds_shift & 0x1f) == 2) ++ return; ++ sw_w32_mask(0x7 << int_shift, 2 << int_shift, RTL838X_INT_MODE_CTRL); ++ sw_w32_mask(0x1f << sds_shift, 2 << sds_shift, RTL838X_SDS_MODE_SEL); ++ break; ++ default: ++ return; ++ } ++ pr_debug("configured port %d for interface %s\n", port, phy_modes(interface)); ++} ++ + static void rtl83xx_phylink_mac_config(struct dsa_switch *ds, int port, + unsigned int mode, + const struct phylink_link_state *state) +@@ -376,10 +409,11 @@ static void rtl83xx_phylink_mac_config(struct dsa_switch *ds, int port, + reg = sw_r32(priv->r->mac_force_mode_ctrl(port)); + /* Auto-Negotiation does not work for MAC in RTL8390 */ + if (priv->family_id == RTL8380_FAMILY_ID) { +- if (mode == MLO_AN_PHY) { ++ if (mode == MLO_AN_PHY || phylink_autoneg_inband(mode)) { + pr_debug("PHY autonegotiates\n"); + reg |= BIT(2); + sw_w32(reg, priv->r->mac_force_mode_ctrl(port)); ++ rtl83xx_config_interface(port, state->interface); + return; + } + } +@@ -509,8 +543,11 @@ static int rtl83xx_port_enable(struct dsa_switch *ds, int port, v |= priv->ports[port].pm; priv->r->traffic_set(port, v); @@ -1129,7 +1280,7 @@ index 987b47dc8f..721b1817a5 100644 return 0; } -@@ -577,58 +574,55 @@ static void rtl83xx_port_disable(struct dsa_switch *ds, int port) +@@ -537,58 +574,55 @@ static void rtl83xx_port_disable(struct dsa_switch *ds, int port) priv->ports[port].enable = false; } @@ -1218,7 +1369,7 @@ index 987b47dc8f..721b1817a5 100644 return 0; } -@@ -658,7 +652,7 @@ static int rtl83xx_port_bridge_join(struct dsa_switch *ds, int port, +@@ -618,7 +652,7 @@ static int rtl83xx_port_bridge_join(struct dsa_switch *ds, int port, struct net_device *bridge) { struct rtl838x_switch_priv *priv = ds->priv; @@ -1227,7 +1378,7 @@ index 987b47dc8f..721b1817a5 100644 int i; pr_debug("%s %x: %d %llx", __func__, (u32)priv, port, port_bitmap); -@@ -674,8 +668,8 @@ static int rtl83xx_port_bridge_join(struct dsa_switch *ds, int port, +@@ -634,8 +668,8 @@ static int rtl83xx_port_bridge_join(struct dsa_switch *ds, int port, if (priv->ports[i].enable) priv->r->traffic_enable(i, port); @@ -1238,7 +1389,7 @@ index 987b47dc8f..721b1817a5 100644 } } -@@ -696,7 +690,7 @@ static void rtl83xx_port_bridge_leave(struct dsa_switch *ds, int port, +@@ -656,7 +690,7 @@ static void rtl83xx_port_bridge_leave(struct dsa_switch *ds, int port, struct net_device *bridge) { struct rtl838x_switch_priv *priv = ds->priv; @@ -1247,7 +1398,7 @@ index 987b47dc8f..721b1817a5 100644 int i; pr_debug("%s %x: %d", __func__, (u32)priv, port); -@@ -714,7 +708,7 @@ static void rtl83xx_port_bridge_leave(struct dsa_switch *ds, int port, +@@ -674,7 +708,7 @@ static void rtl83xx_port_bridge_leave(struct dsa_switch *ds, int port, if (priv->ports[i].enable) priv->r->traffic_disable(i, port); @@ -1256,7 +1407,7 @@ index 987b47dc8f..721b1817a5 100644 port_bitmap &= ~BIT_ULL(i); } } -@@ -866,17 +860,16 @@ static int rtl83xx_vlan_prepare(struct dsa_switch *ds, int port, +@@ -826,17 +860,16 @@ static int rtl83xx_vlan_prepare(struct dsa_switch *ds, int port, struct rtl838x_vlan_info info; struct rtl838x_switch_priv *priv = ds->priv; @@ -1279,7 +1430,7 @@ index 987b47dc8f..721b1817a5 100644 priv->r->vlan_set_untagged(1, info.untagged_ports); pr_debug("SET: Untagged ports, VLAN %d: %llx\n", 1, info.untagged_ports); -@@ -894,7 +887,7 @@ static void rtl83xx_vlan_add(struct dsa_switch *ds, int port, +@@ -854,7 +887,7 @@ static void rtl83xx_vlan_add(struct dsa_switch *ds, int port, struct rtl838x_switch_priv *priv = ds->priv; int v; @@ -1288,7 +1439,7 @@ index 987b47dc8f..721b1817a5 100644 port, vlan->vid_begin, vlan->vid_end, vlan->flags); if (vlan->vid_begin > 4095 || vlan->vid_end > 4095) { -@@ -939,10 +932,10 @@ static void rtl83xx_vlan_add(struct dsa_switch *ds, int port, +@@ -899,10 +932,10 @@ static void rtl83xx_vlan_add(struct dsa_switch *ds, int port, info.untagged_ports |= BIT_ULL(port); priv->r->vlan_set_untagged(v, info.untagged_ports); @@ -1301,7 +1452,7 @@ index 987b47dc8f..721b1817a5 100644 } mutex_unlock(&priv->reg_mutex); -@@ -993,59 +986,136 @@ static int rtl83xx_vlan_del(struct dsa_switch *ds, int port, +@@ -953,59 +986,136 @@ static int rtl83xx_vlan_del(struct dsa_switch *ds, int port, return 0; } @@ -1472,7 +1623,7 @@ index 987b47dc8f..721b1817a5 100644 err = -ENOTSUPP; out: mutex_unlock(&priv->reg_mutex); -@@ -1057,41 +1127,29 @@ static int rtl83xx_port_fdb_del(struct dsa_switch *ds, int port, +@@ -1017,41 +1127,29 @@ static int rtl83xx_port_fdb_del(struct dsa_switch *ds, int port, { struct rtl838x_switch_priv *priv = ds->priv; u64 mac = ether_addr_to_u64(addr); @@ -1527,7 +1678,7 @@ index 987b47dc8f..721b1817a5 100644 goto out; } err = -ENOENT; -@@ -1106,8 +1164,7 @@ static int rtl83xx_port_fdb_dump(struct dsa_switch *ds, int port, +@@ -1066,8 +1164,7 @@ static int rtl83xx_port_fdb_dump(struct dsa_switch *ds, int port, struct rtl838x_l2_entry e; struct rtl838x_switch_priv *priv = ds->priv; int i; @@ -1537,7 +1688,7 @@ index 987b47dc8f..721b1817a5 100644 u64 mac; mutex_lock(&priv->reg_mutex); -@@ -1119,13 +1176,25 @@ static int rtl83xx_port_fdb_dump(struct dsa_switch *ds, int port, +@@ -1079,13 +1176,25 @@ static int rtl83xx_port_fdb_dump(struct dsa_switch *ds, int port, continue; if (e.port == port) { @@ -1566,7 +1717,7 @@ index 987b47dc8f..721b1817a5 100644 } for (i = 0; i < 64; i++) { -@@ -1142,6 +1211,164 @@ static int rtl83xx_port_fdb_dump(struct dsa_switch *ds, int port, +@@ -1102,6 +1211,164 @@ static int rtl83xx_port_fdb_dump(struct dsa_switch *ds, int port, return 0; } @@ -1731,7 +1882,7 @@ index 987b47dc8f..721b1817a5 100644 static int rtl83xx_port_mirror_add(struct dsa_switch *ds, int port, struct dsa_mall_mirror_tc_entry *mirror, bool ingress) -@@ -1308,6 +1535,10 @@ const struct dsa_switch_ops rtl83xx_switch_ops = { +@@ -1268,6 +1535,10 @@ const struct dsa_switch_ops rtl83xx_switch_ops = { .port_fdb_del = rtl83xx_port_fdb_del, .port_fdb_dump = rtl83xx_port_fdb_dump, @@ -1742,7 +1893,7 @@ index 987b47dc8f..721b1817a5 100644 .port_mirror_add = rtl83xx_port_mirror_add, .port_mirror_del = rtl83xx_port_mirror_del, }; -@@ -1332,6 +1563,9 @@ const struct dsa_switch_ops rtl930x_switch_ops = { +@@ -1292,6 +1563,9 @@ const struct dsa_switch_ops rtl930x_switch_ops = { .port_enable = rtl83xx_port_enable, .port_disable = rtl83xx_port_disable, @@ -1752,7 +1903,7 @@ index 987b47dc8f..721b1817a5 100644 .set_ageing_time = rtl83xx_set_l2aging, .port_bridge_join = rtl83xx_port_bridge_join, .port_bridge_leave = rtl83xx_port_bridge_leave, -@@ -1346,4 +1580,9 @@ const struct dsa_switch_ops rtl930x_switch_ops = { +@@ -1306,4 +1580,9 @@ const struct dsa_switch_ops rtl930x_switch_ops = { .port_fdb_add = rtl83xx_port_fdb_add, .port_fdb_del = rtl83xx_port_fdb_del, .port_fdb_dump = rtl83xx_port_fdb_dump, @@ -4018,7 +4169,7 @@ index a33941a0eb..f98bf7df29 100644 { volatile u64 *ptr = RTL838X_SW_BASE + RTL839X_PORT_ISO_CTRL(0); diff --git a/target/linux/realtek/files-5.4/drivers/net/ethernet/rtl838x_eth.c b/target/linux/realtek/files-5.4/drivers/net/ethernet/rtl838x_eth.c -index 2f678b7384..c5c6e3b6b7 100644 +index 7931daff07..c5c6e3b6b7 100644 --- a/target/linux/realtek/files-5.4/drivers/net/ethernet/rtl838x_eth.c +++ b/target/linux/realtek/files-5.4/drivers/net/ethernet/rtl838x_eth.c @@ -234,19 +234,21 @@ struct dsa_tag { @@ -4139,6 +4290,15 @@ index 2f678b7384..c5c6e3b6b7 100644 sw_w32_mask(0, BIT(priv->cpu_port), RTL930X_L2_UNKN_UC_FLD_PMSK); sw_w32(0x217, priv->r->mac_force_mode_ctrl + priv->cpu_port * 4); +@@ -855,7 +869,7 @@ static int rtl838x_eth_open(struct net_device *ndev) + struct ring_b *ring = priv->membase; + int i, err; + +- pr_info("%s called: RX rings %d(length %d), TX rings %d(length %d)\n", ++ pr_debug("%s called: RX rings %d(length %d), TX rings %d(length %d)\n", + __func__, priv->rxrings, priv->rxringlen, TXRINGS, TXRINGLEN); + + spin_lock_irqsave(&priv->lock, flags); @@ -883,28 +897,30 @@ static int rtl838x_eth_open(struct net_device *ndev) switch (priv->family_id) { case RTL8380_FAMILY_ID: @@ -4213,6 +4373,123 @@ index 2f678b7384..c5c6e3b6b7 100644 dev->stats.rx_packets++; dev->stats.rx_bytes += len; +@@ -1342,7 +1369,7 @@ static void rtl838x_validate(struct phylink_config *config, + { + __ETHTOOL_DECLARE_LINK_MODE_MASK(mask) = { 0, }; + +- pr_info("In %s\n", __func__); ++ pr_debug("In %s\n", __func__); + + if (!phy_interface_mode_is_rgmii(state->interface) && + state->interface != PHY_INTERFACE_MODE_1000BASEX && +@@ -1404,7 +1431,7 @@ static void rtl838x_mac_an_restart(struct phylink_config *config) + if (priv->family_id != RTL8380_FAMILY_ID) + return; + +- pr_info("In %s\n", __func__); ++ pr_debug("In %s\n", __func__); + /* Restart by disabling and re-enabling link */ + sw_w32(0x6192D, priv->r->mac_force_mode_ctrl + priv->cpu_port * 4); + mdelay(20); +@@ -1419,7 +1446,7 @@ static int rtl838x_mac_pcs_get_state(struct phylink_config *config, + struct rtl838x_eth_priv *priv = netdev_priv(dev); + int port = priv->cpu_port; + +- pr_info("In %s\n", __func__); ++ pr_debug("In %s\n", __func__); + + state->link = priv->r->get_mac_link_sts(port) ? 1 : 0; + state->duplex = priv->r->get_mac_link_dup_sts(port) ? 1 : 0; +@@ -1456,7 +1483,7 @@ static void rtl838x_mac_link_down(struct phylink_config *config, + struct net_device *dev = container_of(config->dev, struct net_device, dev); + struct rtl838x_eth_priv *priv = netdev_priv(dev); + +- pr_info("In %s\n", __func__); ++ pr_debug("In %s\n", __func__); + /* Stop TX/RX to port */ + sw_w32_mask(0x03, 0, priv->r->mac_port_ctrl(priv->cpu_port)); + } +@@ -1468,7 +1495,7 @@ static void rtl838x_mac_link_up(struct phylink_config *config, unsigned int mode + struct net_device *dev = container_of(config->dev, struct net_device, dev); + struct rtl838x_eth_priv *priv = netdev_priv(dev); + +- pr_info("In %s\n", __func__); ++ pr_debug("In %s\n", __func__); + /* Restart TX/RX to port */ + sw_w32_mask(0, 0x03, priv->r->mac_port_ctrl(priv->cpu_port)); + } +@@ -1479,7 +1506,7 @@ static void rtl838x_set_mac_hw(struct net_device *dev, u8 *mac) + unsigned long flags; + + spin_lock_irqsave(&priv->lock, flags); +- pr_info("In %s\n", __func__); ++ pr_debug("In %s\n", __func__); + sw_w32((mac[0] << 8) | mac[1], priv->r->mac); + sw_w32((mac[2] << 24) | (mac[3] << 16) | (mac[4] << 8) | mac[5], priv->r->mac + 4); + +@@ -1547,7 +1574,7 @@ static int rtl838x_get_link_ksettings(struct net_device *ndev, + { + struct rtl838x_eth_priv *priv = netdev_priv(ndev); + +- pr_info("%s called\n", __func__); ++ pr_debug("%s called\n", __func__); + return phylink_ethtool_ksettings_get(priv->phylink, cmd); + } + +@@ -1556,7 +1583,7 @@ static int rtl838x_set_link_ksettings(struct net_device *ndev, + { + struct rtl838x_eth_priv *priv = netdev_priv(ndev); + +- pr_info("%s called\n", __func__); ++ pr_debug("%s called\n", __func__); + return phylink_ethtool_ksettings_set(priv->phylink, cmd); + } + +@@ -1678,7 +1705,7 @@ static int rtl931x_mdio_write(struct mii_bus *bus, int mii_id, + + static int rtl838x_mdio_reset(struct mii_bus *bus) + { +- pr_info("%s called\n", __func__); ++ pr_debug("%s called\n", __func__); + /* Disable MAC polling the PHY so that we can start configuration */ + sw_w32(0x00000000, RTL838X_SMI_POLL_CTRL); + +@@ -1693,7 +1720,7 @@ static int rtl839x_mdio_reset(struct mii_bus *bus) + { + return 0; + +- pr_info("%s called\n", __func__); ++ pr_debug("%s called\n", __func__); + /* BUG: The following does not work, but should! */ + /* Disable MAC polling the PHY so that we can start configuration */ + sw_w32(0x00000000, RTL839X_SMI_PORT_POLLING_CTRL); +@@ -1710,7 +1737,7 @@ static int rtl931x_mdio_reset(struct mii_bus *bus) + sw_w32(0x00000000, RTL931X_SMI_PORT_POLLING_CTRL); + sw_w32(0x00000000, RTL931X_SMI_PORT_POLLING_CTRL + 4); + +- pr_info("%s called\n", __func__); ++ pr_debug("%s called\n", __func__); + + return 0; + } +@@ -1767,7 +1794,7 @@ static int rtl838x_mdio_init(struct rtl838x_eth_priv *priv) + struct device_node *mii_np; + int ret; + +- pr_info("%s called\n", __func__); ++ pr_debug("%s called\n", __func__); + mii_np = of_get_child_by_name(priv->pdev->dev.of_node, "mdio-bus"); + + if (!mii_np) { +@@ -1827,7 +1854,7 @@ err_put_node: + + static int rtl838x_mdio_remove(struct rtl838x_eth_priv *priv) + { +- pr_info("%s called\n", __func__); ++ pr_debug("%s called\n", __func__); + if (!priv->mii_bus) + return 0; + @@ -1837,6 +1864,40 @@ static int rtl838x_mdio_remove(struct rtl838x_eth_priv *priv) return 0; } @@ -5126,10 +5403,10 @@ index 78953c6d17..cfddb0aced 100644 { PHY_ID_MATCH_MODEL(PHY_ID_RTL8218B_I), diff --git a/target/linux/realtek/image/Makefile b/target/linux/realtek/image/Makefile -index 18e5fedb9b..b142c3d16b 100644 +index 424726c8a9..a4b2ea892c 100644 --- a/target/linux/realtek/image/Makefile +++ b/target/linux/realtek/image/Makefile -@@ -127,4 +127,13 @@ define Device/zyxel_gs1900-8hp-v2 +@@ -118,4 +118,13 @@ define Device/zyxel_gs1900-8hp-v2 endef TARGET_DEVICES += zyxel_gs1900-8hp-v2 diff --git a/backports/0009-include-set-kernel-version.mk.patch b/backports/0009-include-set-kernel-version.mk.patch index 3268e1b40..5d2bda583 100644 --- a/backports/0009-include-set-kernel-version.mk.patch +++ b/backports/0009-include-set-kernel-version.mk.patch @@ -1,7 +1,7 @@ -From 1380e4f25375a9246c3a7a3b2bdc33ffdc38b3c5 Mon Sep 17 00:00:00 2001 +From 3b896a540de03ca8dfd5596881f9ec6dc15d72c9 Mon Sep 17 00:00:00 2001 From: John Crispin Date: Wed, 7 Apr 2021 10:46:26 +0200 -Subject: [PATCH] include: set kernel-version.mk +Subject: [PATCH 01/32] include: set kernel-version.mk Signed-off-by: John Crispin --- @@ -9,7 +9,7 @@ Signed-off-by: John Crispin 1 file changed, 6 insertions(+) diff --git a/include/kernel-version.mk b/include/kernel-version.mk -index 8531c0c3d1..1f619b86c0 100644 +index 52e5c11d75..547f57fa11 100644 --- a/include/kernel-version.mk +++ b/include/kernel-version.mk @@ -6,9 +6,15 @@ ifdef CONFIG_TESTING_KERNEL @@ -18,12 +18,12 @@ index 8531c0c3d1..1f619b86c0 100644 +LINUX_VERSION-4.4 = .60 +LINUX_VERSION-4.14 = .193 - LINUX_VERSION-5.4 = .137 + LINUX_VERSION-5.4 = .111 +LINUX_VERSION-5.10 = .27 +LINUX_KERNEL_HASH-4.4.60 = 2cd8df6f1ac6a5329c5a286ec9b5956215977221a1b731597ed169fff74a9659 +LINUX_KERNEL_HASH-4.14.193 = 0b0fb41d4430e1a42738b341cbfd2f41951aa5cd02acabbd53f076119c8b9f03 - LINUX_KERNEL_HASH-5.4.137 = f09e5e366ce5d8bde887cda229ef17138fd1653706a702221f934f99aaa31f7c + LINUX_KERNEL_HASH-5.4.111 = 21626132658dc34cb41b7aa7b80ecf83751890a71ac1a63d77aea9d488271a03 +LINUX_KERNEL_HASH-5.10.27 = d99dc9662951299c53a0a8d8c8d0a72a16ff861d20e927c0f9b14f63282d69d9 remove_uri_prefix=$(subst git://,,$(subst http://,,$(subst https://,,$(1)))) diff --git a/backports/0013-iw-update-to-latest-HEAD.patch b/backports/0013-iw-update-to-latest-HEAD.patch new file mode 100644 index 000000000..c58bb4fdb --- /dev/null +++ b/backports/0013-iw-update-to-latest-HEAD.patch @@ -0,0 +1,167 @@ +From 0ddce2498be815e098154867d0b18293fe613f12 Mon Sep 17 00:00:00 2001 +From: John Crispin +Date: Thu, 27 May 2021 11:57:10 +0200 +Subject: [PATCH 13/13] iw: update to latest HEAD + +Signed-off-by: John Crispin +--- + package/network/utils/iw/Makefile | 11 +++---- + .../utils/iw/patches/200-reduce_size.patch | 30 +++++++++---------- + 2 files changed, 21 insertions(+), 20 deletions(-) + +diff --git a/package/network/utils/iw/Makefile b/package/network/utils/iw/Makefile +index 6db9aaf105..8e11046189 100644 +--- a/package/network/utils/iw/Makefile ++++ b/package/network/utils/iw/Makefile +@@ -8,12 +8,13 @@ + include $(TOPDIR)/rules.mk + + PKG_NAME:=iw +-PKG_VERSION:=5.9 +-PKG_RELEASE:=1 ++PKG_VERSION:=5.9-8fab0c9e ++PKG_RELEASE:=$(AUTORELEASE) + +-PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.xz +-PKG_SOURCE_URL:=@KERNEL/software/network/iw +-PKG_HASH:=293a07109aeb7e36267cf59e3ce52857e9ffae3a6666eb8ac77894b1839fe1f2 ++PKG_SOURCE_PROTO:=git ++PKG_SOURCE_URL:=https://git.kernel.org/pub/scm/linux/kernel/git/jberg/iw.git ++PKG_SOURCE_VERSION:=8fab0c9ee9db217587a58efcc37421c86edcb638 ++PKG_MIRROR_HASH:=797b322bc03952f3127ae0a7da476c14ada1bbe9a9ae234a56dd6f864c568e16 + + PKG_MAINTAINER:=Felix Fietkau + PKG_LICENSE:=GPL-2.0 +diff --git a/package/network/utils/iw/patches/200-reduce_size.patch b/package/network/utils/iw/patches/200-reduce_size.patch +index af30876012..83e11405cb 100644 +--- a/package/network/utils/iw/patches/200-reduce_size.patch ++++ b/package/network/utils/iw/patches/200-reduce_size.patch +@@ -1,6 +1,6 @@ + --- a/event.c + +++ b/event.c +-@@ -944,6 +944,7 @@ static int print_event(struct nl_msg *ms ++@@ -956,6 +956,7 @@ static int print_event(struct nl_msg *ms + } + + switch (gnlh->cmd) { +@@ -8,7 +8,7 @@ + case NL80211_CMD_NEW_WIPHY: + printf("renamed to %s\n", nla_get_string(tb[NL80211_ATTR_WIPHY_NAME])); + break; +-@@ -979,6 +980,7 @@ static int print_event(struct nl_msg *ms ++@@ -991,6 +992,7 @@ static int print_event(struct nl_msg *ms + case NL80211_CMD_SCHED_SCAN_RESULTS: + printf("got scheduled scan results\n"); + break; +@@ -16,7 +16,7 @@ + case NL80211_CMD_WIPHY_REG_CHANGE: + case NL80211_CMD_REG_CHANGE: + if (gnlh->cmd == NL80211_CMD_WIPHY_REG_CHANGE) +-@@ -1061,6 +1063,7 @@ static int print_event(struct nl_msg *ms ++@@ -1073,6 +1075,7 @@ static int print_event(struct nl_msg *ms + mac_addr_n2a(macbuf, nla_data(tb[NL80211_ATTR_MAC])); + printf("del station %s\n", macbuf); + break; +@@ -24,7 +24,7 @@ + case NL80211_CMD_JOIN_IBSS: + mac_addr_n2a(macbuf, nla_data(tb[NL80211_ATTR_MAC])); + printf("IBSS %s joined\n", macbuf); +-@@ -1254,9 +1257,9 @@ static int print_event(struct nl_msg *ms ++@@ -1271,9 +1274,9 @@ static int print_event(struct nl_msg *ms + case NL80211_CMD_CH_SWITCH_NOTIFY: + parse_ch_switch_notify(tb, gnlh->cmd); + break; +@@ -134,7 +134,7 @@ + { + --- a/scan.c + +++ b/scan.c +-@@ -1297,6 +1297,9 @@ static void print_ht_op(const uint8_t ty ++@@ -1306,6 +1306,9 @@ static void print_ht_op(const uint8_t ty + printf("\t\t * secondary channel offset: %s\n", + ht_secondary_offset[data[1] & 0x3]); + printf("\t\t * STA channel width: %s\n", sta_chan_width[(data[1] & 0x4)>>2]); +@@ -144,7 +144,7 @@ + printf("\t\t * RIFS: %d\n", (data[1] & 0x8)>>3); + printf("\t\t * HT protection: %s\n", protection[data[2] & 0x3]); + printf("\t\t * non-GF present: %d\n", (data[2] & 0x4) >> 2); +-@@ -1707,6 +1710,14 @@ static void print_ie(const struct ie_pri ++@@ -1716,6 +1719,14 @@ static void print_ie(const struct ie_pri + + static const struct ie_print ieprinters[] = { + [0] = { "SSID", print_ssid, 0, 32, BIT(PRINT_SCAN) | BIT(PRINT_LINK), }, +@@ -159,7 +159,7 @@ + [1] = { "Supported rates", print_supprates, 0, 255, BIT(PRINT_SCAN), }, + [3] = { "DS Parameter set", print_ds, 1, 1, BIT(PRINT_SCAN), }, + [5] = { "TIM", print_tim, 4, 255, BIT(PRINT_SCAN), }, +-@@ -1716,26 +1727,20 @@ static const struct ie_print ieprinters[ ++@@ -1725,26 +1736,20 @@ static const struct ie_print ieprinters[ + [32] = { "Power constraint", print_powerconstraint, 1, 1, BIT(PRINT_SCAN), }, + [35] = { "TPC report", print_tpcreport, 2, 2, BIT(PRINT_SCAN), }, + [42] = { "ERP", print_erp, 1, 255, BIT(PRINT_SCAN), }, +@@ -187,15 +187,15 @@ + }; + + static void print_wifi_wpa(const uint8_t type, uint8_t len, const uint8_t *data, +-@@ -2279,6 +2284,7 @@ void print_ies(unsigned char *ie, int ie ++@@ -2326,6 +2331,7 @@ void print_ies(unsigned char *ie, int ie + ieprinters[ie[0]].flags & BIT(ptype)) { + print_ie(&ieprinters[ie[0]], + ie[0], ie[1], ie + 2, &ie_buffer); + +#ifdef IW_FULL + } else if (ie[0] == 221 /* vendor */) { + print_vendor(ie[1], ie + 2, unknown, ptype); +- } else if (unknown) { +-@@ -2288,6 +2294,7 @@ void print_ies(unsigned char *ie, int ie ++ } else if (ie[0] == 255 /* extension */) { ++@@ -2337,6 +2343,7 @@ void print_ies(unsigned char *ie, int ie + for (i=0; i +Date: Tue, 18 May 2021 10:46:43 +0200 +Subject: [PATCH] libubox: update to latest HEAD + +Signed-off-by: John Crispin +--- + package/libs/libubox/Makefile | 4 +- + package/network/config/netifd/Makefile | 4 +- + .../config/netifd/patches/100-8021x.patch | 421 ++++++++++++++++++ + 3 files changed, 425 insertions(+), 4 deletions(-) + create mode 100644 package/network/config/netifd/patches/100-8021x.patch + +diff --git a/package/libs/libubox/Makefile b/package/libs/libubox/Makefile +index 4d582eacfd..8644764d59 100644 +--- a/package/libs/libubox/Makefile ++++ b/package/libs/libubox/Makefile +@@ -5,9 +5,9 @@ PKG_RELEASE=1 + + PKG_SOURCE_PROTO:=git + PKG_SOURCE_URL=$(PROJECT_GIT)/project/libubox.git +-PKG_MIRROR_HASH:=97dc4eba01cf2c5d6a6d0db3747e0cdc0d95cb87e51b3115272e7d3e69a8b255 ++#PKG_MIRROR_HASH:=97dc4eba01cf2c5d6a6d0db3747e0cdc0d95cb87e51b3115272e7d3e69a8b255 + PKG_SOURCE_DATE:=2020-12-12 +-PKG_SOURCE_VERSION:=357877693ca363b12e6e7e14d345639b2440cd07 ++PKG_SOURCE_VERSION:=b14c4688612c05c78ce984d7bde633bce8703b1e + PKG_ABI_VERSION:=$(call abi_version_str,$(PKG_SOURCE_DATE)) + CMAKE_INSTALL:=1 + +-- +2.25.1 + diff --git a/backports/0016-kernel-modules-move-act_gact-into-kmod-sched-core.patch b/backports/0016-kernel-modules-move-act_gact-into-kmod-sched-core.patch new file mode 100644 index 000000000..be8f380cc --- /dev/null +++ b/backports/0016-kernel-modules-move-act_gact-into-kmod-sched-core.patch @@ -0,0 +1,45 @@ +From 6c7e11cccbd28224a9a473a36df1102b4257d356 Mon Sep 17 00:00:00 2001 +From: DENG Qingfang +Date: Fri, 9 Apr 2021 12:25:08 +0800 +Subject: [PATCH 5/6] kernel/modules: move act_gact into kmod-sched-core + +As the name suggests, act_gact has the generic actions such as dropping +and accepting packets, so move it into kmod-sched-core. + +Signed-off-by: DENG Qingfang +--- + package/kernel/linux/modules/netsupport.mk | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/package/kernel/linux/modules/netsupport.mk b/package/kernel/linux/modules/netsupport.mk +index 9fd49c1392..4343e850e9 100644 +--- a/package/kernel/linux/modules/netsupport.mk ++++ b/package/kernel/linux/modules/netsupport.mk +@@ -721,7 +721,7 @@ $(eval $(call KernelPackage,mppe)) + + + SCHED_MODULES = $(patsubst $(LINUX_DIR)/net/sched/%.ko,%,$(wildcard $(LINUX_DIR)/net/sched/*.ko)) +-SCHED_MODULES_CORE = sch_ingress sch_fq_codel sch_hfsc sch_htb sch_tbf cls_basic cls_fw cls_route cls_flow cls_tcindex cls_u32 em_u32 act_mirred act_skbedit cls_matchall ++SCHED_MODULES_CORE = sch_ingress sch_fq_codel sch_hfsc sch_htb sch_tbf cls_basic cls_fw cls_route cls_flow cls_tcindex cls_u32 em_u32 act_gact act_mirred act_skbedit cls_matchall + SCHED_MODULES_FILTER = $(SCHED_MODULES_CORE) act_connmark act_ctinfo sch_cake sch_netem sch_mqprio em_ipset cls_bpf cls_flower act_bpf act_vlan + SCHED_MODULES_EXTRA = $(filter-out $(SCHED_MODULES_FILTER),$(SCHED_MODULES)) + SCHED_FILES = $(patsubst %,$(LINUX_DIR)/net/sched/%.ko,$(filter $(SCHED_MODULES_CORE),$(SCHED_MODULES))) +@@ -745,6 +745,7 @@ define KernelPackage/sched-core + CONFIG_NET_CLS_ROUTE4 \ + CONFIG_NET_CLS_TCINDEX \ + CONFIG_NET_CLS_U32 \ ++ CONFIG_NET_ACT_GACT \ + CONFIG_NET_ACT_MIRRED \ + CONFIG_NET_ACT_SKBEDIT \ + CONFIG_NET_CLS_MATCHALL \ +@@ -899,7 +900,6 @@ define KernelPackage/sched + CONFIG_NET_SCH_FQ \ + CONFIG_NET_SCH_PIE \ + CONFIG_NET_ACT_POLICE \ +- CONFIG_NET_ACT_GACT \ + CONFIG_NET_ACT_IPT \ + CONFIG_NET_ACT_PEDIT \ + CONFIG_NET_ACT_SIMP \ +-- +2.25.1 + diff --git a/backports/0036-iwinfo-update-to-latest-git-HEAD.patch b/backports/0036-iwinfo-update-to-latest-git-HEAD.patch new file mode 100644 index 000000000..0ef295efe --- /dev/null +++ b/backports/0036-iwinfo-update-to-latest-git-HEAD.patch @@ -0,0 +1,39 @@ +From c90fec205137d8d8c1197722a39d5c700ae3f6b1 Mon Sep 17 00:00:00 2001 +From: John Crispin +Date: Mon, 21 Jun 2021 12:53:28 +0200 +Subject: [PATCH 02/36] iwinfo: update to latest git HEAD + +Signed-off-by: John Crispin +--- + package/network/utils/iwinfo/Makefile | 8 ++++---- + 1 file changed, 4 insertions(+), 4 deletions(-) + +diff --git a/package/network/utils/iwinfo/Makefile b/package/network/utils/iwinfo/Makefile +index 3454d615a9..b7c8370bba 100644 +--- a/package/network/utils/iwinfo/Makefile ++++ b/package/network/utils/iwinfo/Makefile +@@ -11,9 +11,9 @@ PKG_RELEASE:=1 + + PKG_SOURCE_PROTO:=git + PKG_SOURCE_URL=$(PROJECT_GIT)/project/iwinfo.git +-PKG_SOURCE_DATE:=2021-01-31 +-PKG_SOURCE_VERSION:=4a32b33e9606f1bc1125f4bc24b0581349e55f2e +-PKG_MIRROR_HASH:=414e5d150efaadba21103e66f862be66a94dcf83c16a2850f7c05051a9b0739d ++PKG_SOURCE_DATE:=2021-06-09 ++PKG_SOURCE_VERSION:=c0414642fead263a4a6a686ad3cb7e965ec8a23a ++PKG_MIRROR_HASH:=c5686bbae86753c53db03a686b034bbb80d31107cc359ebd8522ea1c82db35ea + PKG_MAINTAINER:=Jo-Philipp Wich + PKG_LICENSE:=GPL-2.0 + +@@ -25,7 +25,7 @@ PKG_CONFIG_DEPENDS := \ + CONFIG_PACKAGE_kmod-brcm-wl-mimo \ + CONFIG_PACKAGE_kmod-cfg80211 + +-IWINFO_ABI_VERSION:=20210106 ++IWINFO_ABI_VERSION:=20210430 + + include $(INCLUDE_DIR)/package.mk + +-- +2.25.1 + diff --git a/backports/0037-netifd-update-to-latest-HEAD.patch b/backports/0037-netifd-update-to-latest-HEAD.patch index 637ac8292..72062e6c9 100644 --- a/backports/0037-netifd-update-to-latest-HEAD.patch +++ b/backports/0037-netifd-update-to-latest-HEAD.patch @@ -1,32 +1,75 @@ -From 27b9d1d180ac64ed4c25a5bf11c40c995be7b897 Mon Sep 17 00:00:00 2001 +From ddaf9ee904b614f79c87f6d67d6c7b09c5d46eca Mon Sep 17 00:00:00 2001 From: John Crispin Date: Thu, 27 May 2021 13:24:47 +0200 -Subject: [PATCH] netifd: update to latest HEAD +Subject: [PATCH 01/44] netifd: update to latest HEAD Signed-off-by: John Crispin --- - package/network/config/netifd/Makefile | 6 +++--- + package/network/config/netifd/Makefile | 12 +++++++++--- + .../network/config/netifd/files/etc/udhcpc.user | 1 + + .../config/netifd/files/lib/netifd/dhcp.script | 3 +++ .../netifd/patches/002-fix-dhcp-issue.patch | 17 +++++++++++++++++ - 2 files changed, 20 insertions(+), 3 deletions(-) + 4 files changed, 30 insertions(+), 3 deletions(-) + create mode 100644 package/network/config/netifd/files/etc/udhcpc.user create mode 100644 package/network/config/netifd/patches/002-fix-dhcp-issue.patch diff --git a/package/network/config/netifd/Makefile b/package/network/config/netifd/Makefile -index 4b5f110da2..32ed4edb42 100644 +index 7061456b08..5717a400be 100644 --- a/package/network/config/netifd/Makefile +++ b/package/network/config/netifd/Makefile @@ -5,9 +5,9 @@ PKG_RELEASE:=1 PKG_SOURCE_PROTO:=git PKG_SOURCE_URL=$(PROJECT_GIT)/project/netifd.git --PKG_SOURCE_DATE:=2021-07-26 --PKG_SOURCE_VERSION:=440eb0647708274cc8d7d9e7c2bb0cfdfba90023 --PKG_MIRROR_HASH:=eed957036ab608fdc49bdf801fc5b4405fcd2a3a5e5d3343ec39898e156c10e9 +-PKG_SOURCE_DATE:=2021-01-09 +-PKG_SOURCE_VERSION:=c00c8335d6188daa326ecfe5a62da15a9b9987e1 +-PKG_MIRROR_HASH:=c740e51e0cec13eec336ba1c7a643db3b64a9a2235f8c1b73a566cb89e841190 +PKG_SOURCE_DATE:=2021-05-26 +PKG_SOURCE_VERSION:=1eb0fafaa9865b729509a7d47ecf1f05c2c0595c +PKG_MIRROR_HASH:=81ff2a20225b41e197fd2dcb86068459d868cbc8b23700c8f011806452d553e8 PKG_MAINTAINER:=Felix Fietkau PKG_LICENSE:=GPL-2.0 +@@ -25,6 +25,11 @@ define Package/netifd + TITLE:=OpenWrt Network Interface Configuration Daemon + endef + ++define Package/netifd/conffiles ++/etc/udhcpc.user ++/etc/udhcpc.user.d/ ++endef ++ + TARGET_CFLAGS += \ + -I$(STAGING_DIR)/usr/include/libnl-tiny \ + -I$(STAGING_DIR)/usr/include \ +@@ -40,6 +45,7 @@ define Package/netifd/install + $(INSTALL_DIR) $(1)/sbin + $(INSTALL_BIN) $(PKG_BUILD_DIR)/netifd $(1)/sbin/ + $(CP) ./files/* $(1)/ ++ $(INSTALL_DIR) $(1)/etc/udhcpc.user.d/ + $(CP) $(PKG_BUILD_DIR)/scripts/* $(1)/lib/netifd/ + endef + +diff --git a/package/network/config/netifd/files/etc/udhcpc.user b/package/network/config/netifd/files/etc/udhcpc.user +new file mode 100644 +index 0000000000..78e2ba5f18 +--- /dev/null ++++ b/package/network/config/netifd/files/etc/udhcpc.user +@@ -0,0 +1 @@ ++# This script is sourced by udhcpc's dhcp.script at every DHCP event. +diff --git a/package/network/config/netifd/files/lib/netifd/dhcp.script b/package/network/config/netifd/files/lib/netifd/dhcp.script +index 6585b641d6..e46005d84c 100755 +--- a/package/network/config/netifd/files/lib/netifd/dhcp.script ++++ b/package/network/config/netifd/files/lib/netifd/dhcp.script +@@ -112,5 +112,8 @@ esac + + # user rules + [ -f /etc/udhcpc.user ] && . /etc/udhcpc.user "$@" ++for f in /etc/udhcpc.user.d/*; do ++ [ -f "$f" ] && (. "$f" "$@") ++done + + exit 0 diff --git a/package/network/config/netifd/patches/002-fix-dhcp-issue.patch b/package/network/config/netifd/patches/002-fix-dhcp-issue.patch new file mode 100644 index 0000000000..6f1d2e708e diff --git a/backports/0038-mac80211-update-to-latest-HEAD.patch b/backports/0038-mac80211-update-to-latest-HEAD.patch index b18aec5fe..aa4b09db8 100644 --- a/backports/0038-mac80211-update-to-latest-HEAD.patch +++ b/backports/0038-mac80211-update-to-latest-HEAD.patch @@ -1,23 +1,25 @@ -From e523d698f6f647856461276335c3708c0f7cb493 Mon Sep 17 00:00:00 2001 +From 7e9c8738c1030b154cb0c0b104dbb403e5270120 Mon Sep 17 00:00:00 2001 From: John Crispin -Date: Tue, 10 Aug 2021 07:50:09 +0200 -Subject: [PATCH] mac80211: update to latest HEAD +Date: Thu, 27 May 2021 13:25:03 +0200 +Subject: [PATCH 01/42] mac80211: update to latest HEAD Signed-off-by: John Crispin --- - package/kernel/mac80211/Makefile | 15 +- - package/kernel/mac80211/ath.mk | 14 +- + package/kernel/mac80211/Makefile | 21 +- + package/kernel/mac80211/ath.mk | 13 +- package/kernel/mac80211/broadcom.mk | 4 +- .../mac80211/files/lib/netifd/mac80211.sh | 36 - - .../files/lib/netifd/wireless/mac80211.sh | 181 ++- + .../files/lib/netifd/wireless/mac80211.sh | 192 ++- .../mac80211/files/lib/wifi/mac80211.sh | 110 +- + package/kernel/mac80211/mac80211.sh.diff | 58 + .../patches/ath/402-ath_regd_optional.patch | 2 +- + ...itting-to-stations-in-dynamic-SMPS-m.patch | 49 - .../080-ath10k_thermal_config.patch | 2 +- ...21-ath10k_init_devices_synchronously.patch | 0 - ...h10k-increase-rx-buffer-size-to-2048.patch | 0 - .../930-ath10k_add_tpt_led_trigger.patch | 0 - ...rolling-support-for-various-chipsets.patch | 2 +- - ...75-ath10k-use-tpt-trigger-by-default.patch | 0 + ...h10k-increase-rx-buffer-size-to-2048.patch | 2 +- + .../930-ath10k_add_tpt_led_trigger.patch | 4 +- + ...rolling-support-for-various-chipsets.patch | 4 +- + ...75-ath10k-use-tpt-trigger-by-default.patch | 2 +- ...980-ath10k-fix-max-antenna-gain-unit.patch | 0 ...-power-reduction-for-US-regulatory-d.patch | 0 .../201-ath5k-WAR-for-AR71xx-PCI-bug.patch | 0 @@ -34,49 +36,77 @@ Signed-off-by: John Crispin .../401-ath9k_blink_default.patch | 0 .../410-ath9k_allow_adhoc_and_ap.patch | 0 ...abled-MFP-capability-unconditionally.patch | 0 - .../500-ath9k_eeprom_debugfs.patch | 0 + .../500-ath9k_eeprom_debugfs.patch | 4 +- .../{ath => ath9k}/501-ath9k_ahb_init.patch | 0 .../510-ath9k_intr_mitigation_tweak.patch | 0 .../511-ath9k_reduce_rxbuf.patch | 0 - .../512-ath9k_channelbw_debugfs.patch | 0 + .../512-ath9k_channelbw_debugfs.patch | 4 +- .../513-ath9k_add_pci_ids.patch | 0 - .../{ath => ath9k}/530-ath9k_extra_leds.patch | 0 + .../{ath => ath9k}/530-ath9k_extra_leds.patch | 10 +- .../531-ath9k_extra_platform_leds.patch | 0 .../540-ath9k_reduce_ani_interval.patch | 0 - .../542-ath9k_debugfs_diag.patch | 0 + .../542-ath9k_debugfs_diag.patch | 4 +- .../543-ath9k_entropy_from_adc.patch | 0 ...544-ath9k-ar933x-usb-hang-workaround.patch | 0 .../545-ath9k_ani_ws_detect.patch | 0 .../547-ath9k_led_defstate_fix.patch | 0 - .../548-ath9k_enable_gpio_chip.patch | 0 - .../549-ath9k_enable_gpio_buttons.patch | 0 + .../548-ath9k_enable_gpio_chip.patch | 4 +- + .../549-ath9k_enable_gpio_buttons.patch | 2 +- .../550-ath9k-disable-bands-via-dt.patch | 0 - .../551-ath9k_ubnt_uap_plus_hsr.patch | 2 +- - .../552-ath9k-ahb_of.patch} | 0 + .../551-ath9k_ubnt_uap_plus_hsr.patch | 4 +- + .../552-ath9k-ahb_of.patch} | 2 +- .../553-ath9k_of_gpio_mask.patch | 0 + ...-register-wiphy-s-during-module_init.patch | 10 - + .../patches/build/001-fix_build.patch | 8 +- + ...700-mwl8k-missing-pci-id-for-WNR854T.patch | 2 +- + ...940-mwl8k_init_devices_synchronously.patch | 4 +- .../602-rt2x00-introduce-rt2x00eeprom.patch | 2 +- - .../100-remove-cryptoapi-dependencies.patch | 699 --------- + ...ent-set_tim-by-update-beacon-content.patch | 118 ++ + .../patches/subsys/010-sync-nl80211_h.patch | 297 ++++ + .../100-remove-cryptoapi-dependencies.patch | 698 --------- .../patches/subsys/130-disable-fils.patch | 32 - ...aes-cmac-switch-to-shash-CMAC-driver.patch | 230 --- .../132-mac80211-remove-cmac-dependency.patch | 10 - + .../subsys/150-disable_addr_notifier.patch | 6 +- + .../mac80211/patches/subsys/210-ap_scan.patch | 2 +- + ...ort-immediate-reconnect-request-hint.patch | 38 +- + ...-driver-based-disconnect-with-reconn.patch | 34 +- + ...port-to-configure-SAE-PWE-value-to-d.patch | 74 + + ...-get_default_func-move-default-flow-.patch | 2 +- + ...add-rx-decapsulation-offload-support.patch | 26 +- + ...le-QoS-support-for-nl80211-ctrl-port.patch | 116 ++ ...320-mac80211_hwsim-add-6GHz-channels.patch | 123 ++ ...211_hwsim-make-6-GHz-channels-usable.patch | 74 + ...-remove-legacy-minstrel-rate-control.patch | 2 +- + ...-minstrel_ht-fix-MINSTREL_FRAC-macro.patch | 21 + + .../370-mac80211-fix-TXQ-AC-confusion.patch | 61 - + ...pply-flow-control-on-management-fram.patch | 4 +- + ...set-sk_pacing_shift-for-802.3-txpath.patch | 2 +- + ...-Rx-timestamp-calculation-for-all-pr.patch | 2 +- + ...c80211-fix-time-is-after-bug-in-mlme.patch | 31 - + ...MPDU-session-check-from-minstrel_ht-.patch | 126 ++ + ...eee80211_tx_h_rate_ctrl-when-dequeue.patch | 114 ++ + ...te-control-support-for-encap-offload.patch | 119 ++ + ...11-minstrel_ht-fix-sample-time-check.patch | 23 + + ...iwlwifi-specific-workaround-that-bro.patch | 51 + + ...rting-aggregation-sessions-on-mesh-i.patch | 112 ++ ...introduce-aql_enable-node-in-debugfs.patch | 111 ++ ...ange-struct-txq_info-for-fewer-holes.patch | 39 + ...to-a-virtual-time-based-airtime-sche.patch | 1277 +++++++++++++++++ ...bling-4-address-mode-on-a-sta-vif-af.patch | 72 + ...on-API-to-configure-SAR-power-limita.patch | 398 +++++ ...mac80211-add-ieee80211_set_sar_specs.patch | 51 + - .../500-mac80211_configure_antenna_gain.patch | 16 +- - 64 files changed, 2418 insertions(+), 1086 deletions(-) + .../500-mac80211_configure_antenna_gain.patch | 24 +- + 92 files changed, 3735 insertions(+), 1344 deletions(-) delete mode 100644 package/kernel/mac80211/files/lib/netifd/mac80211.sh + create mode 100644 package/kernel/mac80211/mac80211.sh.diff + delete mode 100644 package/kernel/mac80211/patches/ath/560-ath9k-fix-transmitting-to-stations-in-dynamic-SMPS-m.patch rename package/kernel/mac80211/patches/{ath => ath10k}/080-ath10k_thermal_config.patch (97%) rename package/kernel/mac80211/patches/{ath => ath10k}/921-ath10k_init_devices_synchronously.patch (100%) - rename package/kernel/mac80211/patches/{ath => ath10k}/922-ath10k-increase-rx-buffer-size-to-2048.patch (100%) - rename package/kernel/mac80211/patches/{ath => ath10k}/930-ath10k_add_tpt_led_trigger.patch (100%) + rename package/kernel/mac80211/patches/{ath => ath10k}/922-ath10k-increase-rx-buffer-size-to-2048.patch (96%) + rename package/kernel/mac80211/patches/{ath => ath10k}/930-ath10k_add_tpt_led_trigger.patch (89%) rename package/kernel/mac80211/patches/{ath => ath10k}/974-ath10k_add-LED-and-GPIO-controlling-support-for-various-chipsets.patch (99%) - rename package/kernel/mac80211/patches/{ath => ath10k}/975-ath10k-use-tpt-trigger-by-default.patch (100%) + rename package/kernel/mac80211/patches/{ath => ath10k}/975-ath10k-use-tpt-trigger-by-default.patch (96%) rename package/kernel/mac80211/patches/{ath => ath10k}/980-ath10k-fix-max-antenna-gain-unit.patch (100%) rename package/kernel/mac80211/patches/{ath => ath10k}/981-ath10k-adjust-tx-power-reduction-for-US-regulatory-d.patch (100%) rename package/kernel/mac80211/patches/{ath => ath5k}/201-ath5k-WAR-for-AR71xx-PCI-bug.patch (100%) @@ -93,32 +123,45 @@ Signed-off-by: John Crispin rename package/kernel/mac80211/patches/{ath => ath9k}/401-ath9k_blink_default.patch (100%) rename package/kernel/mac80211/patches/{ath => ath9k}/410-ath9k_allow_adhoc_and_ap.patch (100%) rename package/kernel/mac80211/patches/{ath => ath9k}/450-ath9k-enabled-MFP-capability-unconditionally.patch (100%) - rename package/kernel/mac80211/patches/{ath => ath9k}/500-ath9k_eeprom_debugfs.patch (100%) + rename package/kernel/mac80211/patches/{ath => ath9k}/500-ath9k_eeprom_debugfs.patch (92%) rename package/kernel/mac80211/patches/{ath => ath9k}/501-ath9k_ahb_init.patch (100%) rename package/kernel/mac80211/patches/{ath => ath9k}/510-ath9k_intr_mitigation_tweak.patch (100%) rename package/kernel/mac80211/patches/{ath => ath9k}/511-ath9k_reduce_rxbuf.patch (100%) - rename package/kernel/mac80211/patches/{ath => ath9k}/512-ath9k_channelbw_debugfs.patch (100%) + rename package/kernel/mac80211/patches/{ath => ath9k}/512-ath9k_channelbw_debugfs.patch (96%) rename package/kernel/mac80211/patches/{ath => ath9k}/513-ath9k_add_pci_ids.patch (100%) - rename package/kernel/mac80211/patches/{ath => ath9k}/530-ath9k_extra_leds.patch (100%) + rename package/kernel/mac80211/patches/{ath => ath9k}/530-ath9k_extra_leds.patch (95%) rename package/kernel/mac80211/patches/{ath => ath9k}/531-ath9k_extra_platform_leds.patch (100%) rename package/kernel/mac80211/patches/{ath => ath9k}/540-ath9k_reduce_ani_interval.patch (100%) - rename package/kernel/mac80211/patches/{ath => ath9k}/542-ath9k_debugfs_diag.patch (100%) + rename package/kernel/mac80211/patches/{ath => ath9k}/542-ath9k_debugfs_diag.patch (96%) rename package/kernel/mac80211/patches/{ath => ath9k}/543-ath9k_entropy_from_adc.patch (100%) rename package/kernel/mac80211/patches/{ath => ath9k}/544-ath9k-ar933x-usb-hang-workaround.patch (100%) rename package/kernel/mac80211/patches/{ath => ath9k}/545-ath9k_ani_ws_detect.patch (100%) rename package/kernel/mac80211/patches/{ath => ath9k}/547-ath9k_led_defstate_fix.patch (100%) - rename package/kernel/mac80211/patches/{ath => ath9k}/548-ath9k_enable_gpio_chip.patch (100%) - rename package/kernel/mac80211/patches/{ath => ath9k}/549-ath9k_enable_gpio_buttons.patch (100%) + rename package/kernel/mac80211/patches/{ath => ath9k}/548-ath9k_enable_gpio_chip.patch (98%) + rename package/kernel/mac80211/patches/{ath => ath9k}/549-ath9k_enable_gpio_buttons.patch (98%) rename package/kernel/mac80211/patches/{ath => ath9k}/550-ath9k-disable-bands-via-dt.patch (100%) rename package/kernel/mac80211/patches/{ath => ath9k}/551-ath9k_ubnt_uap_plus_hsr.patch (99%) - rename package/kernel/mac80211/patches/{ath/552-ahb_of.patch => ath9k/552-ath9k-ahb_of.patch} (100%) + rename package/kernel/mac80211/patches/{ath/552-ahb_of.patch => ath9k/552-ath9k-ahb_of.patch} (99%) rename package/kernel/mac80211/patches/{ath => ath9k}/553-ath9k_of_gpio_mask.patch (100%) + create mode 100644 package/kernel/mac80211/patches/rtl/002-v5.13-rtlwifi-implement-set_tim-by-update-beacon-content.patch + create mode 100644 package/kernel/mac80211/patches/subsys/010-sync-nl80211_h.patch delete mode 100644 package/kernel/mac80211/patches/subsys/100-remove-cryptoapi-dependencies.patch delete mode 100644 package/kernel/mac80211/patches/subsys/130-disable-fils.patch delete mode 100644 package/kernel/mac80211/patches/subsys/131-Revert-mac80211-aes-cmac-switch-to-shash-CMAC-driver.patch delete mode 100644 package/kernel/mac80211/patches/subsys/132-mac80211-remove-cmac-dependency.patch + create mode 100644 package/kernel/mac80211/patches/subsys/302-cfg80211-Add-support-to-configure-SAE-PWE-value-to-d.patch + create mode 100644 package/kernel/mac80211/patches/subsys/316-mac80211-enable-QoS-support-for-nl80211-ctrl-port.patch create mode 100644 package/kernel/mac80211/patches/subsys/320-mac80211_hwsim-add-6GHz-channels.patch create mode 100644 package/kernel/mac80211/patches/subsys/321-mac80211_hwsim-make-6-GHz-channels-usable.patch + create mode 100644 package/kernel/mac80211/patches/subsys/353-mac80211-minstrel_ht-fix-MINSTREL_FRAC-macro.patch + delete mode 100644 package/kernel/mac80211/patches/subsys/370-mac80211-fix-TXQ-AC-confusion.patch + delete mode 100644 package/kernel/mac80211/patches/subsys/374-mac80211-fix-time-is-after-bug-in-mlme.patch + create mode 100644 package/kernel/mac80211/patches/subsys/374-mac80211-move-A-MPDU-session-check-from-minstrel_ht-.patch + create mode 100644 package/kernel/mac80211/patches/subsys/375-mac80211-call-ieee80211_tx_h_rate_ctrl-when-dequeue.patch + create mode 100644 package/kernel/mac80211/patches/subsys/376-mac80211-add-rate-control-support-for-encap-offload.patch + create mode 100644 package/kernel/mac80211/patches/subsys/377-mac80211-minstrel_ht-fix-sample-time-check.patch + create mode 100644 package/kernel/mac80211/patches/subsys/378-mac80211-remove-iwlwifi-specific-workaround-that-bro.patch + create mode 100644 package/kernel/mac80211/patches/subsys/379-mac80211-fix-starting-aggregation-sessions-on-mesh-i.patch create mode 100644 package/kernel/mac80211/patches/subsys/380-mac80211-introduce-aql_enable-node-in-debugfs.patch create mode 100644 package/kernel/mac80211/patches/subsys/381-mac80211-rearrange-struct-txq_info-for-fewer-holes.patch create mode 100644 package/kernel/mac80211/patches/subsys/382-mac80211-Switch-to-a-virtual-time-based-airtime-sche.patch @@ -127,9 +170,23 @@ Signed-off-by: John Crispin create mode 100644 package/kernel/mac80211/patches/subsys/385-mac80211-add-ieee80211_set_sar_specs.patch diff --git a/package/kernel/mac80211/Makefile b/package/kernel/mac80211/Makefile -index dd9ec172ca..dd39c2d069 100644 +index f6ad06452f..dd39c2d069 100644 --- a/package/kernel/mac80211/Makefile +++ b/package/kernel/mac80211/Makefile +@@ -10,10 +10,10 @@ include $(INCLUDE_DIR)/kernel.mk + + PKG_NAME:=mac80211 + +-PKG_VERSION:=5.10.16-1 ++PKG_VERSION:=5.10.42-1 + PKG_RELEASE:=1 +-PKG_SOURCE_URL:=@KERNEL/linux/kernel/projects/backports/stable/v5.10.16/ +-PKG_HASH:=12856db780c5023edc47e2d18486eb3346bb7c82f1f2fc48deb3b163142f7d2d ++PKG_SOURCE_URL:=@KERNEL/linux/kernel/projects/backports/stable/v5.10.42/ ++PKG_HASH:=6876520105240844fdb32d1dcdf2bfdea291a37a96f16c892fda3776ba714fcb + + PKG_SOURCE:=backports-$(PKG_VERSION).tar.xz + PKG_BUILD_DIR:=$(KERNEL_BUILD_DIR)/backports-$(PKG_VERSION) @@ -98,7 +98,7 @@ PKG_CONFIG_DEPENDS += \ define KernelPackage/cfg80211 $(call KernelPackage/mac80211/Default) @@ -187,7 +244,7 @@ index dd9ec172ca..dd39c2d069 100644 $(INSTALL_DIR) $(1)/etc/hotplug.d/ieee80211 $(INSTALL_DATA) ./files/mac80211.hotplug $(1)/etc/hotplug.d/ieee80211/10-wifi-detect diff --git a/package/kernel/mac80211/ath.mk b/package/kernel/mac80211/ath.mk -index f209c95ba8..ad2860a98e 100644 +index f209c95ba8..ba03ae11a6 100644 --- a/package/kernel/mac80211/ath.mk +++ b/package/kernel/mac80211/ath.mk @@ -34,7 +34,7 @@ ifdef CONFIG_PACKAGE_MAC80211_TRACING @@ -199,13 +256,12 @@ index f209c95ba8..ad2860a98e 100644 config-$(CONFIG_PACKAGE_ATH_DEBUG) += ATH_DEBUG ATH10K_DEBUG ATH9K_STATION_STATISTICS config-$(CONFIG_PACKAGE_ATH_DFS) += ATH9K_DFS_CERTIFIED ATH10K_DFS_CERTIFIED config-$(CONFIG_PACKAGE_ATH_SPECTRAL) += ATH9K_COMMON_SPECTRAL ATH10K_SPECTRAL -@@ -42,11 +42,11 @@ config-$(CONFIG_PACKAGE_ATH_DYNACK) += ATH9K_DYNACK +@@ -42,11 +42,10 @@ config-$(CONFIG_PACKAGE_ATH_DYNACK) += ATH9K_DYNACK config-$(call config_package,ath9k) += ATH9K config-$(call config_package,ath9k-common) += ATH9K_COMMON config-$(call config_package,owl-loader) += ATH9K_PCI_NO_EEPROM -config-$(CONFIG_TARGET_ar71xx) += ATH9K_AHB config-$(CONFIG_TARGET_ath79) += ATH9K_AHB -+config-$(CONFIG_TARGET_ar71xx) += ATH9K_AHB config-$(CONFIG_TARGET_ipq40xx) += ATH10K_AHB config-$(CONFIG_PCI) += ATH9K_PCI -config-$(CONFIG_ATH_USER_REGD) += ATH_USER_REGD @@ -213,7 +269,7 @@ index f209c95ba8..ad2860a98e 100644 config-$(CONFIG_ATH9K_HWRNG) += ATH9K_HWRNG config-$(CONFIG_ATH9K_SUPPORT_PCOEM) += ATH9K_PCOEM config-$(CONFIG_ATH9K_TX99) += ATH9K_TX99 -@@ -126,7 +126,7 @@ endef +@@ -126,7 +125,7 @@ endef define KernelPackage/ath $(call KernelPackage/mac80211/Default) TITLE:=Atheros common driver part @@ -222,7 +278,7 @@ index f209c95ba8..ad2860a98e 100644 FILES:=$(PKG_BUILD_DIR)/drivers/net/wireless/ath/ath.ko MENU:=1 endef -@@ -191,7 +191,7 @@ define KernelPackage/ath9k-common +@@ -191,7 +190,7 @@ define KernelPackage/ath9k-common TITLE:=Atheros 802.11n wireless devices (common code for ath9k and ath9k_htc) URL:=https://wireless.wiki.kernel.org/en/users/drivers/ath9k HIDDEN:=1 @@ -231,7 +287,7 @@ index f209c95ba8..ad2860a98e 100644 FILES:= \ $(PKG_BUILD_DIR)/drivers/net/wireless/ath/ath9k/ath9k_common.ko \ $(PKG_BUILD_DIR)/drivers/net/wireless/ath/ath9k/ath9k_hw.ko -@@ -201,7 +201,7 @@ define KernelPackage/ath9k +@@ -201,7 +200,7 @@ define KernelPackage/ath9k $(call KernelPackage/mac80211/Default) TITLE:=Atheros 802.11n PCI wireless cards support URL:=https://wireless.wiki.kernel.org/en/users/drivers/ath9k @@ -240,7 +296,7 @@ index f209c95ba8..ad2860a98e 100644 FILES:= \ $(PKG_BUILD_DIR)/drivers/net/wireless/ath/ath9k/ath9k.ko AUTOLOAD:=$(call AutoProbe,ath9k) -@@ -231,7 +231,7 @@ define KernelPackage/ath9k/config +@@ -231,7 +230,7 @@ define KernelPackage/ath9k/config config ATH9K_UBNTHSR bool "Support for Ubiquiti UniFi Outdoor+ access point" @@ -314,7 +370,7 @@ index 92e5c0e395..0000000000 - done -} diff --git a/package/kernel/mac80211/files/lib/netifd/wireless/mac80211.sh b/package/kernel/mac80211/files/lib/netifd/wireless/mac80211.sh -index 9a9c35fb5f..30d6b9311a 100644 +index 92c56afd24..30d6b9311a 100644 --- a/package/kernel/mac80211/files/lib/netifd/wireless/mac80211.sh +++ b/package/kernel/mac80211/files/lib/netifd/wireless/mac80211.sh @@ -1,7 +1,6 @@ @@ -597,7 +653,7 @@ index 9a9c35fb5f..30d6b9311a 100644 mac80211_setup_supplicant_noctl $vif_enable || failed=1 else mac80211_setup_adhoc $vif_enable -@@ -849,9 +948,29 @@ mac80211_setup_vif() { +@@ -849,10 +948,30 @@ mac80211_setup_vif() { get_freq() { local phy="$1" @@ -622,13 +678,14 @@ index 9a9c35fb5f..30d6b9311a 100644 +band_match && $3 == "MHz" && $4 == channel { + print $2 + exit - } -+' +} -+ ++' + } ++ chan_is_dfs() { local phy="$1" + local chan="$2" @@ -896,7 +1015,8 @@ drv_mac80211_setup() { country chanbw distance \ txpower antenna_gain \ @@ -639,7 +696,20 @@ index 9a9c35fb5f..30d6b9311a 100644 json_get_values basic_rate_list basic_rate json_get_values scan_list scan_list json_select .. -@@ -933,7 +1053,7 @@ drv_mac80211_setup() { +@@ -907,10 +1027,8 @@ drv_mac80211_setup() { + return 1 + } + +- [ -z "$(uci -q -P /var/state show wireless._${phy})" ] && { +- uci -q -P /var/state set wireless._${phy}=phy +- wireless_set_data phy="$phy" +- } ++ wireless_set_data phy="$phy" ++ [ -z "$(uci -q -P /var/state show wireless._${phy})" ] && uci -q -P /var/state set wireless._${phy}=phy + + OLDAPLIST=$(uci -q -P /var/state get wireless._${phy}.aplist) + OLDSPLIST=$(uci -q -P /var/state get wireless._${phy}.splist) +@@ -935,7 +1053,7 @@ drv_mac80211_setup() { done # convert channel to frequency @@ -648,7 +718,7 @@ index 9a9c35fb5f..30d6b9311a 100644 [ -n "$country" ] && { iw reg get | grep -q "^country $country:" || { -@@ -958,6 +1078,7 @@ drv_mac80211_setup() { +@@ -960,6 +1078,7 @@ drv_mac80211_setup() { set_default txantenna 0xffffffff set_default distance 0 set_default antenna_gain 0 @@ -656,6 +726,25 @@ index 9a9c35fb5f..30d6b9311a 100644 [ "$txantenna" = "all" ] && txantenna=0xffffffff [ "$rxantenna" = "all" ] && rxantenna=0xffffffff +@@ -1003,6 +1122,7 @@ drv_mac80211_setup() { + [ -n "$hostapd_ctrl" ] && { + local no_reload=1 + if [ -n "$(ubus list | grep hostapd.$primary_ap)" ]; then ++ no_reload=0 + [ "${NEW_MD5}" = "${OLD_MD5}" ] || { + ubus call hostapd.$primary_ap reload + no_reload=$? +@@ -1077,6 +1197,10 @@ drv_mac80211_teardown() { + json_select data + json_get_vars phy + json_select .. ++ [ -n "$phy" ] || { ++ echo "Bug: PHY is undefined for device '$1'" ++ return 1 ++ } + + mac80211_interface_cleanup "$phy" + uci -q -P /var/state revert wireless._${phy} diff --git a/package/kernel/mac80211/files/lib/wifi/mac80211.sh b/package/kernel/mac80211/files/lib/wifi/mac80211.sh index 3e99f06693..6aa46b0c74 100644 --- a/package/kernel/mac80211/files/lib/wifi/mac80211.sh @@ -808,6 +897,70 @@ index 3e99f06693..6aa46b0c74 100644 set wireless.radio${devidx}.disabled=1 set wireless.default_radio${devidx}=wifi-iface +diff --git a/package/kernel/mac80211/mac80211.sh.diff b/package/kernel/mac80211/mac80211.sh.diff +new file mode 100644 +index 0000000000..2fb6d472b3 +--- /dev/null ++++ b/package/kernel/mac80211/mac80211.sh.diff +@@ -0,0 +1,58 @@ ++--- mac80211.sh 2021-06-05 15:10:48.522323044 +0200 +++++ mac80211.new 2021-06-08 10:09:52.652540350 +0200 ++@@ -1036,13 +1036,6 @@ ++ local found ++ ++ for wdev in $(list_phy_interfaces "$phy"); do ++- found=0 ++- for cwdev in $OLDAPLIST $OLDSPLIST $OLDUMLIST; do ++- if [ "$wdev" = "$cwdev" ]; then ++- found=1 ++- break ++- fi ++- done ++ if [ "$found" = "0" ]; then ++ ip link set dev "$wdev" down ++ iw dev "$wdev" del ++@@ -1107,33 +1100,24 @@ ++ for_each_interface "sta adhoc mesh monitor" mac80211_prepare_vif ++ NEWAPLIST= ++ for_each_interface "ap" mac80211_prepare_vif ++- NEW_MD5=$(test -e "${hostapd_conf_file}" && md5sum ${hostapd_conf_file}) ++- OLD_MD5=$(uci -q -P /var/state get wireless._${phy}.md5) ++- if [ "${NEWAPLIST}" != "${OLDAPLIST}" ]; then ++- mac80211_vap_cleanup hostapd "${OLDAPLIST}" ++- fi +++ mac80211_vap_cleanup hostapd "${OLDAPLIST}" ++ [ -n "${NEWAPLIST}" ] && mac80211_iw_interface_add "$phy" "${NEWAPLIST%% *}" __ap ++ local add_ap=0 ++ local primary_ap=${NEWAPLIST%% *} ++ [ -n "$hostapd_ctrl" ] && { ++ local no_reload=1 ++ if [ -n "$(ubus list | grep hostapd.$primary_ap)" ]; then ++- [ "${NEW_MD5}" = "${OLD_MD5}" ] || { ++- ubus call hostapd.$primary_ap reload ++- no_reload=$? ++- if [ "$no_reload" != "0" ]; then ++- mac80211_vap_cleanup hostapd "${OLDAPLIST}" ++- mac80211_vap_cleanup wpa_supplicant "$(uci -q -P /var/state get wireless._${phy}.splist)" ++- mac80211_vap_cleanup none "$(uci -q -P /var/state get wireless._${phy}.umlist)" ++- sleep 2 ++- mac80211_iw_interface_add "$phy" "${NEWAPLIST%% *}" __ap ++- for_each_interface "sta adhoc mesh monitor" mac80211_prepare_vif ++- fi ++- } +++ mac80211_vap_cleanup hostapd "${OLDAPLIST}" +++ mac80211_vap_cleanup wpa_supplicant "$(uci -q -P /var/state get wireless._${phy}.splist)" +++ mac80211_vap_cleanup none "$(uci -q -P /var/state get wireless._${phy}.umlist)" +++ sleep 2 +++ mac80211_iw_interface_add "$phy" "${NEWAPLIST%% *}" __ap +++ for_each_interface "sta adhoc mesh monitor" mac80211_prepare_vif ++ fi ++ if [ "$no_reload" != "0" ]; then ++ add_ap=1 ++ ubus wait_for hostapd +++ ip link set $primary_ap down ++ local hostapd_res="$(ubus call hostapd config_add "{\"iface\":\"$primary_ap\", \"config\":\"${hostapd_conf_file}\"}")" ++ ret="$?" ++ [ "$ret" != 0 -o -z "$hostapd_res" ] && { diff --git a/package/kernel/mac80211/patches/ath/402-ath_regd_optional.patch b/package/kernel/mac80211/patches/ath/402-ath_regd_optional.patch index bf87d3551a..3c9180b113 100644 --- a/package/kernel/mac80211/patches/ath/402-ath_regd_optional.patch @@ -821,6 +974,61 @@ index bf87d3551a..3c9180b113 100644 ATH_COMMON= WLAN_VENDOR_ATH= ATH_DEBUG= +diff --git a/package/kernel/mac80211/patches/ath/560-ath9k-fix-transmitting-to-stations-in-dynamic-SMPS-m.patch b/package/kernel/mac80211/patches/ath/560-ath9k-fix-transmitting-to-stations-in-dynamic-SMPS-m.patch +deleted file mode 100644 +index 68f3a31548..0000000000 +--- a/package/kernel/mac80211/patches/ath/560-ath9k-fix-transmitting-to-stations-in-dynamic-SMPS-m.patch ++++ /dev/null +@@ -1,49 +0,0 @@ +-From: Felix Fietkau +-Date: Sun, 14 Feb 2021 19:45:50 +0100 +-Subject: [PATCH] ath9k: fix transmitting to stations in dynamic SMPS mode +- +-When transmitting to a receiver in dynamic SMPS mode, all transmissions that +-use multiple spatial streams need to be sent using CTS-to-self or RTS/CTS to +-give the receiver's extra chains some time to wake up. +-This fixes the tx rate getting stuck at <= MCS7 for some clients, especially +-Intel ones, which make aggressive use of SMPS. +- +-Cc: stable@vger.kernel.org +-Reported-by: Martin Kennedy +-Signed-off-by: Felix Fietkau +---- +- +---- a/drivers/net/wireless/ath/ath9k/ath9k.h +-+++ b/drivers/net/wireless/ath/ath9k/ath9k.h +-@@ -179,7 +179,8 @@ struct ath_frame_info { +- s8 txq; +- u8 keyix; +- u8 rtscts_rate; +-- u8 retries : 7; +-+ u8 retries : 6; +-+ u8 dyn_smps : 1; +- u8 baw_tracked : 1; +- u8 tx_power; +- enum ath9k_key_type keytype:2; +---- a/drivers/net/wireless/ath/ath9k/xmit.c +-+++ b/drivers/net/wireless/ath/ath9k/xmit.c +-@@ -1271,6 +1271,11 @@ static void ath_buf_set_rate(struct ath_ +- is_40, is_sgi, is_sp); +- if (rix < 8 && (tx_info->flags & IEEE80211_TX_CTL_STBC)) +- info->rates[i].RateFlags |= ATH9K_RATESERIES_STBC; +-+ if (rix >= 8 && fi->dyn_smps) { +-+ info->rates[i].RateFlags |= +-+ ATH9K_RATESERIES_RTS_CTS; +-+ info->flags |= ATH9K_TXDESC_CTSENA; +-+ } +- +- info->txpower[i] = ath_get_rate_txpower(sc, bf, rix, +- is_40, false); +-@@ -2114,6 +2119,7 @@ static void setup_frame_info(struct ieee +- fi->keyix = an->ps_key; +- else +- fi->keyix = ATH9K_TXKEYIX_INVALID; +-+ fi->dyn_smps = sta && sta->smps_mode == IEEE80211_SMPS_DYNAMIC; +- fi->keytype = keytype; +- fi->framelen = framelen; +- fi->tx_power = txpower; diff --git a/package/kernel/mac80211/patches/ath/080-ath10k_thermal_config.patch b/package/kernel/mac80211/patches/ath10k/080-ath10k_thermal_config.patch similarity index 97% rename from package/kernel/mac80211/patches/ath/080-ath10k_thermal_config.patch @@ -842,18 +1050,50 @@ similarity index 100% rename from package/kernel/mac80211/patches/ath/921-ath10k_init_devices_synchronously.patch rename to package/kernel/mac80211/patches/ath10k/921-ath10k_init_devices_synchronously.patch diff --git a/package/kernel/mac80211/patches/ath/922-ath10k-increase-rx-buffer-size-to-2048.patch b/package/kernel/mac80211/patches/ath10k/922-ath10k-increase-rx-buffer-size-to-2048.patch -similarity index 100% +similarity index 96% rename from package/kernel/mac80211/patches/ath/922-ath10k-increase-rx-buffer-size-to-2048.patch rename to package/kernel/mac80211/patches/ath10k/922-ath10k-increase-rx-buffer-size-to-2048.patch +index abce361673..8f7a60eec8 100644 +--- a/package/kernel/mac80211/patches/ath/922-ath10k-increase-rx-buffer-size-to-2048.patch ++++ b/package/kernel/mac80211/patches/ath10k/922-ath10k-increase-rx-buffer-size-to-2048.patch +@@ -26,7 +26,7 @@ Forwarded: https://patchwork.kernel.org/patch/11367055/ + + --- a/drivers/net/wireless/ath/ath10k/htt.h + +++ b/drivers/net/wireless/ath/ath10k/htt.h +-@@ -2242,7 +2242,7 @@ struct htt_rx_chan_info { ++@@ -2243,7 +2243,7 @@ struct htt_rx_chan_info { + * Should be: sizeof(struct htt_host_rx_desc) + max rx MSDU size, + * rounded up to a cache line size. + */ diff --git a/package/kernel/mac80211/patches/ath/930-ath10k_add_tpt_led_trigger.patch b/package/kernel/mac80211/patches/ath10k/930-ath10k_add_tpt_led_trigger.patch -similarity index 100% +similarity index 89% rename from package/kernel/mac80211/patches/ath/930-ath10k_add_tpt_led_trigger.patch rename to package/kernel/mac80211/patches/ath10k/930-ath10k_add_tpt_led_trigger.patch +index 1fedd337ac..74b3292e0c 100644 +--- a/package/kernel/mac80211/patches/ath/930-ath10k_add_tpt_led_trigger.patch ++++ b/package/kernel/mac80211/patches/ath10k/930-ath10k_add_tpt_led_trigger.patch +@@ -1,6 +1,6 @@ + --- a/drivers/net/wireless/ath/ath10k/mac.c + +++ b/drivers/net/wireless/ath/ath10k/mac.c +-@@ -9713,6 +9713,21 @@ static int ath10k_mac_init_rd(struct ath ++@@ -9708,6 +9708,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[] = { +-@@ -10062,6 +10077,12 @@ int ath10k_mac_register(struct ath10k *a ++@@ -10057,6 +10072,12 @@ int ath10k_mac_register(struct ath10k *a + + ar->hw->weight_multiplier = ATH10K_AIRTIME_WEIGHT_MULTIPLIER; + diff --git a/package/kernel/mac80211/patches/ath/974-ath10k_add-LED-and-GPIO-controlling-support-for-various-chipsets.patch b/package/kernel/mac80211/patches/ath10k/974-ath10k_add-LED-and-GPIO-controlling-support-for-various-chipsets.patch similarity index 99% rename from package/kernel/mac80211/patches/ath/974-ath10k_add-LED-and-GPIO-controlling-support-for-various-chipsets.patch rename to package/kernel/mac80211/patches/ath10k/974-ath10k_add-LED-and-GPIO-controlling-support-for-various-chipsets.patch -index ce8effe3c3..fa007e73a1 100644 +index ab7cb669bb..fa007e73a1 100644 --- a/package/kernel/mac80211/patches/ath/974-ath10k_add-LED-and-GPIO-controlling-support-for-various-chipsets.patch +++ b/package/kernel/mac80211/patches/ath10k/974-ath10k_add-LED-and-GPIO-controlling-support-for-various-chipsets.patch @@ -114,7 +114,7 @@ v13: @@ -865,10 +1105,31 @@ index ce8effe3c3..fa007e73a1 100644 ATH10K_DEBUGFS= ATH10K_SPECTRAL= ATH10K_THERMAL= +@@ -456,7 +456,7 @@ v13: + { + --- a/drivers/net/wireless/ath/ath10k/wmi-tlv.c + +++ b/drivers/net/wireless/ath/ath10k/wmi-tlv.c +-@@ -4585,6 +4585,8 @@ static const struct wmi_ops wmi_tlv_ops ++@@ -4594,6 +4594,8 @@ static const struct wmi_ops wmi_tlv_ops + .gen_echo = ath10k_wmi_tlv_op_gen_echo, + .gen_vdev_spectral_conf = ath10k_wmi_tlv_op_gen_vdev_spectral_conf, + .gen_vdev_spectral_enable = ath10k_wmi_tlv_op_gen_vdev_spectral_enable, diff --git a/package/kernel/mac80211/patches/ath/975-ath10k-use-tpt-trigger-by-default.patch b/package/kernel/mac80211/patches/ath10k/975-ath10k-use-tpt-trigger-by-default.patch -similarity index 100% +similarity index 96% rename from package/kernel/mac80211/patches/ath/975-ath10k-use-tpt-trigger-by-default.patch rename to package/kernel/mac80211/patches/ath10k/975-ath10k-use-tpt-trigger-by-default.patch +index f7569df33c..6da7bfa725 100644 +--- a/package/kernel/mac80211/patches/ath/975-ath10k-use-tpt-trigger-by-default.patch ++++ b/package/kernel/mac80211/patches/ath10k/975-ath10k-use-tpt-trigger-by-default.patch +@@ -42,7 +42,7 @@ Signed-off-by: Mathias Kresin + if (ret) + --- a/drivers/net/wireless/ath/ath10k/mac.c + +++ b/drivers/net/wireless/ath/ath10k/mac.c +-@@ -10079,7 +10079,7 @@ int ath10k_mac_register(struct ath10k *a ++@@ -10074,7 +10074,7 @@ int ath10k_mac_register(struct ath10k *a + ar->hw->weight_multiplier = ATH10K_AIRTIME_WEIGHT_MULTIPLIER; + + #ifdef CPTCFG_MAC80211_LEDS diff --git a/package/kernel/mac80211/patches/ath/980-ath10k-fix-max-antenna-gain-unit.patch b/package/kernel/mac80211/patches/ath10k/980-ath10k-fix-max-antenna-gain-unit.patch similarity index 100% rename from package/kernel/mac80211/patches/ath/980-ath10k-fix-max-antenna-gain-unit.patch @@ -934,9 +1195,29 @@ similarity index 100% rename from package/kernel/mac80211/patches/ath/450-ath9k-enabled-MFP-capability-unconditionally.patch rename to package/kernel/mac80211/patches/ath9k/450-ath9k-enabled-MFP-capability-unconditionally.patch diff --git a/package/kernel/mac80211/patches/ath/500-ath9k_eeprom_debugfs.patch b/package/kernel/mac80211/patches/ath9k/500-ath9k_eeprom_debugfs.patch -similarity index 100% +similarity index 92% rename from package/kernel/mac80211/patches/ath/500-ath9k_eeprom_debugfs.patch rename to package/kernel/mac80211/patches/ath9k/500-ath9k_eeprom_debugfs.patch +index 786a3ed3fb..48ccc81308 100644 +--- a/package/kernel/mac80211/patches/ath/500-ath9k_eeprom_debugfs.patch ++++ b/package/kernel/mac80211/patches/ath9k/500-ath9k_eeprom_debugfs.patch +@@ -1,6 +1,6 @@ + --- a/drivers/net/wireless/ath/ath9k/debug.c + +++ b/drivers/net/wireless/ath/ath9k/debug.c +-@@ -1361,6 +1361,53 @@ void ath9k_deinit_debug(struct ath_softc ++@@ -1364,6 +1364,53 @@ void ath9k_deinit_debug(struct ath_softc + ath9k_cmn_spectral_deinit_debug(&sc->spec_priv); + } + +@@ -54,7 +54,7 @@ + int ath9k_init_debug(struct ath_hw *ah) + { + struct ath_common *common = ath9k_hw_common(ah); +-@@ -1380,6 +1427,8 @@ int ath9k_init_debug(struct ath_hw *ah) ++@@ -1383,6 +1430,8 @@ int ath9k_init_debug(struct ath_hw *ah) + ath9k_tx99_init_debug(sc); + ath9k_cmn_spectral_init_debug(&sc->spec_priv, sc->debug.debugfs_phy); + diff --git a/package/kernel/mac80211/patches/ath/501-ath9k_ahb_init.patch b/package/kernel/mac80211/patches/ath9k/501-ath9k_ahb_init.patch similarity index 100% rename from package/kernel/mac80211/patches/ath/501-ath9k_ahb_init.patch @@ -950,17 +1231,84 @@ similarity index 100% rename from package/kernel/mac80211/patches/ath/511-ath9k_reduce_rxbuf.patch rename to package/kernel/mac80211/patches/ath9k/511-ath9k_reduce_rxbuf.patch diff --git a/package/kernel/mac80211/patches/ath/512-ath9k_channelbw_debugfs.patch b/package/kernel/mac80211/patches/ath9k/512-ath9k_channelbw_debugfs.patch -similarity index 100% +similarity index 96% rename from package/kernel/mac80211/patches/ath/512-ath9k_channelbw_debugfs.patch rename to package/kernel/mac80211/patches/ath9k/512-ath9k_channelbw_debugfs.patch +index 80e33182f7..126d1d5c62 100644 +--- a/package/kernel/mac80211/patches/ath/512-ath9k_channelbw_debugfs.patch ++++ b/package/kernel/mac80211/patches/ath9k/512-ath9k_channelbw_debugfs.patch +@@ -1,6 +1,6 @@ + --- a/drivers/net/wireless/ath/ath9k/debug.c + +++ b/drivers/net/wireless/ath/ath9k/debug.c +-@@ -1408,6 +1408,52 @@ static const struct file_operations fops ++@@ -1411,6 +1411,52 @@ static const struct file_operations fops + .owner = THIS_MODULE + }; + +@@ -53,7 +53,7 @@ + int ath9k_init_debug(struct ath_hw *ah) + { + struct ath_common *common = ath9k_hw_common(ah); +-@@ -1429,6 +1475,8 @@ int ath9k_init_debug(struct ath_hw *ah) ++@@ -1432,6 +1478,8 @@ int ath9k_init_debug(struct ath_hw *ah) + + debugfs_create_file("eeprom", S_IRUSR, sc->debug.debugfs_phy, sc, + &fops_eeprom); diff --git a/package/kernel/mac80211/patches/ath/513-ath9k_add_pci_ids.patch b/package/kernel/mac80211/patches/ath9k/513-ath9k_add_pci_ids.patch similarity index 100% rename from package/kernel/mac80211/patches/ath/513-ath9k_add_pci_ids.patch rename to package/kernel/mac80211/patches/ath9k/513-ath9k_add_pci_ids.patch diff --git a/package/kernel/mac80211/patches/ath/530-ath9k_extra_leds.patch b/package/kernel/mac80211/patches/ath9k/530-ath9k_extra_leds.patch -similarity index 100% +similarity index 95% rename from package/kernel/mac80211/patches/ath/530-ath9k_extra_leds.patch rename to package/kernel/mac80211/patches/ath9k/530-ath9k_extra_leds.patch +index 1f19483064..5fd5c73a2f 100644 +--- a/package/kernel/mac80211/patches/ath/530-ath9k_extra_leds.patch ++++ b/package/kernel/mac80211/patches/ath9k/530-ath9k_extra_leds.patch +@@ -1,6 +1,6 @@ + --- a/drivers/net/wireless/ath/ath9k/ath9k.h + +++ b/drivers/net/wireless/ath/ath9k/ath9k.h +-@@ -843,6 +843,9 @@ static inline int ath9k_dump_btcoex(stru ++@@ -844,6 +844,9 @@ static inline int ath9k_dump_btcoex(stru + #ifdef CPTCFG_MAC80211_LEDS + void ath_init_leds(struct ath_softc *sc); + void ath_deinit_leds(struct ath_softc *sc); +@@ -10,7 +10,7 @@ + #else + static inline void ath_init_leds(struct ath_softc *sc) + { +-@@ -979,6 +982,13 @@ void ath_ant_comb_scan(struct ath_softc ++@@ -980,6 +983,13 @@ void ath_ant_comb_scan(struct ath_softc + + #define ATH9K_NUM_CHANCTX 2 /* supports 2 operating channels */ + +@@ -24,7 +24,7 @@ + struct ath_softc { + struct ieee80211_hw *hw; + struct device *dev; +-@@ -1032,9 +1042,8 @@ struct ath_softc { ++@@ -1033,9 +1043,8 @@ struct ath_softc { + spinlock_t chan_lock; + + #ifdef CPTCFG_MAC80211_LEDS +@@ -192,7 +192,7 @@ + #endif + --- a/drivers/net/wireless/ath/ath9k/debug.c + +++ b/drivers/net/wireless/ath/ath9k/debug.c +-@@ -1453,6 +1453,61 @@ static const struct file_operations fops ++@@ -1456,6 +1456,61 @@ static const struct file_operations fops + .llseek = default_llseek, + }; + +@@ -254,7 +254,7 @@ + + int ath9k_init_debug(struct ath_hw *ah) + { +-@@ -1477,6 +1532,10 @@ int ath9k_init_debug(struct ath_hw *ah) ++@@ -1480,6 +1535,10 @@ int ath9k_init_debug(struct ath_hw *ah) + &fops_eeprom); + debugfs_create_file("chanbw", S_IRUSR | S_IWUSR, sc->debug.debugfs_phy, + sc, &fops_chanbw); diff --git a/package/kernel/mac80211/patches/ath/531-ath9k_extra_platform_leds.patch b/package/kernel/mac80211/patches/ath9k/531-ath9k_extra_platform_leds.patch similarity index 100% rename from package/kernel/mac80211/patches/ath/531-ath9k_extra_platform_leds.patch @@ -970,9 +1318,29 @@ similarity index 100% rename from package/kernel/mac80211/patches/ath/540-ath9k_reduce_ani_interval.patch rename to package/kernel/mac80211/patches/ath9k/540-ath9k_reduce_ani_interval.patch diff --git a/package/kernel/mac80211/patches/ath/542-ath9k_debugfs_diag.patch b/package/kernel/mac80211/patches/ath9k/542-ath9k_debugfs_diag.patch -similarity index 100% +similarity index 96% rename from package/kernel/mac80211/patches/ath/542-ath9k_debugfs_diag.patch rename to package/kernel/mac80211/patches/ath9k/542-ath9k_debugfs_diag.patch +index 76cb63a5c8..f93a6fe5cd 100644 +--- a/package/kernel/mac80211/patches/ath/542-ath9k_debugfs_diag.patch ++++ b/package/kernel/mac80211/patches/ath9k/542-ath9k_debugfs_diag.patch +@@ -1,6 +1,6 @@ + --- a/drivers/net/wireless/ath/ath9k/debug.c + +++ b/drivers/net/wireless/ath/ath9k/debug.c +-@@ -1509,6 +1509,50 @@ static const struct file_operations fops ++@@ -1512,6 +1512,50 @@ static const struct file_operations fops + #endif + + +@@ -51,7 +51,7 @@ + int ath9k_init_debug(struct ath_hw *ah) + { + struct ath_common *common = ath9k_hw_common(ah); +-@@ -1536,6 +1580,8 @@ int ath9k_init_debug(struct ath_hw *ah) ++@@ -1539,6 +1583,8 @@ int ath9k_init_debug(struct ath_hw *ah) + debugfs_create_file("gpio_led", S_IWUSR, + sc->debug.debugfs_phy, sc, &fops_gpio_led); + #endif diff --git a/package/kernel/mac80211/patches/ath/543-ath9k_entropy_from_adc.patch b/package/kernel/mac80211/patches/ath9k/543-ath9k_entropy_from_adc.patch similarity index 100% rename from package/kernel/mac80211/patches/ath/543-ath9k_entropy_from_adc.patch @@ -990,13 +1358,46 @@ similarity index 100% rename from package/kernel/mac80211/patches/ath/547-ath9k_led_defstate_fix.patch rename to package/kernel/mac80211/patches/ath9k/547-ath9k_led_defstate_fix.patch diff --git a/package/kernel/mac80211/patches/ath/548-ath9k_enable_gpio_chip.patch b/package/kernel/mac80211/patches/ath9k/548-ath9k_enable_gpio_chip.patch -similarity index 100% +similarity index 98% rename from package/kernel/mac80211/patches/ath/548-ath9k_enable_gpio_chip.patch rename to package/kernel/mac80211/patches/ath9k/548-ath9k_enable_gpio_chip.patch +index 78206d2860..88198a4562 100644 +--- a/package/kernel/mac80211/patches/ath/548-ath9k_enable_gpio_chip.patch ++++ b/package/kernel/mac80211/patches/ath9k/548-ath9k_enable_gpio_chip.patch +@@ -18,7 +18,7 @@ Signed-off-by: Felix Fietkau + + #include "common.h" + #include "debug.h" +-@@ -989,6 +990,14 @@ struct ath_led { ++@@ -990,6 +991,14 @@ struct ath_led { + struct led_classdev cdev; + }; + +@@ -33,7 +33,7 @@ Signed-off-by: Felix Fietkau + struct ath_softc { + struct ieee80211_hw *hw; + struct device *dev; +-@@ -1044,6 +1053,9 @@ struct ath_softc { ++@@ -1045,6 +1054,9 @@ struct ath_softc { + #ifdef CPTCFG_MAC80211_LEDS + const char *led_default_trigger; + struct list_head leds; diff --git a/package/kernel/mac80211/patches/ath/549-ath9k_enable_gpio_buttons.patch b/package/kernel/mac80211/patches/ath9k/549-ath9k_enable_gpio_buttons.patch -similarity index 100% +similarity index 98% rename from package/kernel/mac80211/patches/ath/549-ath9k_enable_gpio_buttons.patch rename to package/kernel/mac80211/patches/ath9k/549-ath9k_enable_gpio_buttons.patch +index 716e09f351..83076b8ae4 100644 +--- a/package/kernel/mac80211/patches/ath/549-ath9k_enable_gpio_buttons.patch ++++ b/package/kernel/mac80211/patches/ath9k/549-ath9k_enable_gpio_buttons.patch +@@ -10,7 +10,7 @@ Signed-off-by: Felix Fietkau + --- + --- a/drivers/net/wireless/ath/ath9k/ath9k.h + +++ b/drivers/net/wireless/ath/ath9k/ath9k.h +-@@ -1055,6 +1055,7 @@ struct ath_softc { ++@@ -1056,6 +1056,7 @@ struct ath_softc { + struct list_head leds; + #ifdef CONFIG_GPIOLIB + struct ath9k_gpio_chip *gpiochip; diff --git a/package/kernel/mac80211/patches/ath/550-ath9k-disable-bands-via-dt.patch b/package/kernel/mac80211/patches/ath9k/550-ath9k-disable-bands-via-dt.patch similarity index 100% rename from package/kernel/mac80211/patches/ath/550-ath9k-disable-bands-via-dt.patch @@ -1005,7 +1406,7 @@ diff --git a/package/kernel/mac80211/patches/ath/551-ath9k_ubnt_uap_plus_hsr.pat similarity index 99% rename from package/kernel/mac80211/patches/ath/551-ath9k_ubnt_uap_plus_hsr.patch rename to package/kernel/mac80211/patches/ath9k/551-ath9k_ubnt_uap_plus_hsr.patch -index acb9ad443c..cd2bdbf1a0 100644 +index 7e3e1236f7..cd2bdbf1a0 100644 --- a/package/kernel/mac80211/patches/ath/551-ath9k_ubnt_uap_plus_hsr.patch +++ b/package/kernel/mac80211/patches/ath9k/551-ath9k_ubnt_uap_plus_hsr.patch @@ -371,7 +371,7 @@ @@ -1017,14 +1418,115 @@ index acb9ad443c..cd2bdbf1a0 100644 ATH9K_RFKILL= ATH9K_CHANNEL_CONTEXT= ATH9K_PCOEM= +@@ -381,7 +381,7 @@ + ATH9K_HTC_DEBUGFS= + --- a/drivers/net/wireless/ath/ath9k/Kconfig + +++ b/drivers/net/wireless/ath/ath9k/Kconfig +-@@ -60,6 +60,19 @@ config ATH9K_AHB ++@@ -58,6 +58,19 @@ config ATH9K_AHB + Say Y, if you have a SoC with a compatible built-in + wireless MAC. Say N if unsure. + diff --git a/package/kernel/mac80211/patches/ath/552-ahb_of.patch b/package/kernel/mac80211/patches/ath9k/552-ath9k-ahb_of.patch -similarity index 100% +similarity index 99% rename from package/kernel/mac80211/patches/ath/552-ahb_of.patch rename to package/kernel/mac80211/patches/ath9k/552-ath9k-ahb_of.patch +index 2552bbc7a1..8fd6e4409b 100644 +--- a/package/kernel/mac80211/patches/ath/552-ahb_of.patch ++++ b/package/kernel/mac80211/patches/ath9k/552-ath9k-ahb_of.patch +@@ -325,7 +325,7 @@ + + #include "common.h" + #include "debug.h" +-@@ -1011,6 +1012,9 @@ struct ath_softc { ++@@ -1012,6 +1013,9 @@ struct ath_softc { + struct ath_hw *sc_ah; + void __iomem *mem; + int irq; diff --git a/package/kernel/mac80211/patches/ath/553-ath9k_of_gpio_mask.patch b/package/kernel/mac80211/patches/ath9k/553-ath9k_of_gpio_mask.patch similarity index 100% rename from package/kernel/mac80211/patches/ath/553-ath9k_of_gpio_mask.patch rename to package/kernel/mac80211/patches/ath9k/553-ath9k_of_gpio_mask.patch +diff --git a/package/kernel/mac80211/patches/brcm/860-brcmfmac-register-wiphy-s-during-module_init.patch b/package/kernel/mac80211/patches/brcm/860-brcmfmac-register-wiphy-s-during-module_init.patch +index dc2295db1b..c9730e29fd 100644 +--- a/package/kernel/mac80211/patches/brcm/860-brcmfmac-register-wiphy-s-during-module_init.patch ++++ b/package/kernel/mac80211/patches/brcm/860-brcmfmac-register-wiphy-s-during-module_init.patch +@@ -11,16 +11,6 @@ module loads successfully. + Signed-off-by: RafaÅ‚ MiÅ‚ecki + --- + +---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c +-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c +-@@ -1557,6 +1557,7 @@ int __init brcmf_core_init(void) +- { +- if (!schedule_work(&brcmf_driver_work)) +- return -EBUSY; +-+ flush_work(&brcmf_driver_work); +- +- return 0; +- } + --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/firmware.c + +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/firmware.c + @@ -431,6 +431,7 @@ struct brcmf_fw { +diff --git a/package/kernel/mac80211/patches/build/001-fix_build.patch b/package/kernel/mac80211/patches/build/001-fix_build.patch +index e57ca190e4..8f63d36e2e 100644 +--- a/package/kernel/mac80211/patches/build/001-fix_build.patch ++++ b/package/kernel/mac80211/patches/build/001-fix_build.patch +@@ -55,8 +55,8 @@ + - echo "" ;\ + - done \ + - ) > Kconfig.kernel ;\ +-- kver=$$($(MAKE) --no-print-directory -C $(KLIB_BUILD) kernelversion | \ +-- sed 's/^\(\([3-5]\|2\.6\)\.[0-9]\+\).*/\1/;t;d') ;\ ++- kver=$$($(MAKE) --no-print-directory -C $(KLIB_BUILD) M=$(BACKPORT_DIR) \ ++- kernelversion | sed 's/^\(\([3-5]\|2\.6\)\.[0-9]\+\).*/\1/;t;d');\ + - test "$$kver" != "" || echo "Kernel version parse failed!" ;\ + - test "$$kver" != "" ;\ + - kvers="$$(seq 14 39 | sed 's/^/2.6./')" ;\ +@@ -112,8 +112,8 @@ + + @echo " done." + + + +Kconfig.versions: Kconfig.kernel +-+ @kver=$$($(MAKE) --no-print-directory -C $(KLIB_BUILD) kernelversion | \ +-+ sed 's/^\(\([3-5]\|2\.6\)\.[0-9]\+\).*/\1/;t;d') ;\ +++ @kver=$$($(MAKE) --no-print-directory -C $(KLIB_BUILD) M=$(BACKPORT_DIR) \ +++ kernelversion | sed 's/^\(\([3-5]\|2\.6\)\.[0-9]\+\).*/\1/;t;d');\ + + test "$$kver" != "" || echo "Kernel version parse failed!" ;\ + + test "$$kver" != "" ;\ + + kvers="$$(seq 14 39 | sed 's/^/2.6./')" ;\ +diff --git a/package/kernel/mac80211/patches/mwl/700-mwl8k-missing-pci-id-for-WNR854T.patch b/package/kernel/mac80211/patches/mwl/700-mwl8k-missing-pci-id-for-WNR854T.patch +index cfa40e1bd2..d358cfe367 100644 +--- a/package/kernel/mac80211/patches/mwl/700-mwl8k-missing-pci-id-for-WNR854T.patch ++++ b/package/kernel/mac80211/patches/mwl/700-mwl8k-missing-pci-id-for-WNR854T.patch +@@ -1,6 +1,6 @@ + --- a/drivers/net/wireless/marvell/mwl8k.c + +++ b/drivers/net/wireless/marvell/mwl8k.c +-@@ -5694,6 +5694,7 @@ MODULE_FIRMWARE("mwl8k/fmimage_8366.fw") ++@@ -5695,6 +5695,7 @@ MODULE_FIRMWARE("mwl8k/fmimage_8366.fw") + MODULE_FIRMWARE(MWL8K_8366_AP_FW(MWL8K_8366_AP_FW_API)); + + static const struct pci_device_id mwl8k_pci_id_table[] = { +diff --git a/package/kernel/mac80211/patches/mwl/940-mwl8k_init_devices_synchronously.patch b/package/kernel/mac80211/patches/mwl/940-mwl8k_init_devices_synchronously.patch +index f3130f7ae7..a35cf1875a 100644 +--- a/package/kernel/mac80211/patches/mwl/940-mwl8k_init_devices_synchronously.patch ++++ b/package/kernel/mac80211/patches/mwl/940-mwl8k_init_devices_synchronously.patch +@@ -1,6 +1,6 @@ + --- a/drivers/net/wireless/marvell/mwl8k.c + +++ b/drivers/net/wireless/marvell/mwl8k.c +-@@ -6279,6 +6279,8 @@ static int mwl8k_probe(struct pci_dev *p ++@@ -6280,6 +6280,8 @@ static int mwl8k_probe(struct pci_dev *p + + priv->running_bsses = 0; + +@@ -9,7 +9,7 @@ + return rc; + + err_stop_firmware: +-@@ -6312,8 +6314,6 @@ static void mwl8k_remove(struct pci_dev ++@@ -6313,8 +6315,6 @@ static void mwl8k_remove(struct pci_dev + return; + priv = hw->priv; + diff --git a/package/kernel/mac80211/patches/rt2x00/602-rt2x00-introduce-rt2x00eeprom.patch b/package/kernel/mac80211/patches/rt2x00/602-rt2x00-introduce-rt2x00eeprom.patch index e74d9a9aa0..1c52132da6 100644 --- a/package/kernel/mac80211/patches/rt2x00/602-rt2x00-introduce-rt2x00eeprom.patch @@ -1037,12 +1539,439 @@ index e74d9a9aa0..1c52132da6 100644 RT2X00_LIB_CRYPTO= RT2X00_LIB_LEDS= RT2X00_LIB_DEBUGFS= +diff --git a/package/kernel/mac80211/patches/rtl/002-v5.13-rtlwifi-implement-set_tim-by-update-beacon-content.patch b/package/kernel/mac80211/patches/rtl/002-v5.13-rtlwifi-implement-set_tim-by-update-beacon-content.patch +new file mode 100644 +index 0000000000..3daf65e967 +--- /dev/null ++++ b/package/kernel/mac80211/patches/rtl/002-v5.13-rtlwifi-implement-set_tim-by-update-beacon-content.patch +@@ -0,0 +1,118 @@ ++Date: Mon, 19 Apr 2021 14:59:56 +0800 ++From: Ping-Ke Shih ++To: ++CC: , , ++ ++Subject: [PATCH] rtlwifi: implement set_tim by update beacon content ++ ++Once beacon content is changed, we update the content to wifi card by ++send_beacon_frame(). Then, STA with PS can wake up properly to receive its ++packets. ++ ++Since we update beacon content to PCI wifi devices every beacon interval, ++the only one usb device, 8192CU, needs to update beacon content when ++mac80211 calling set_tim. ++ ++Reported-by: Maciej S. Szmigiero ++Signed-off-by: Ping-Ke Shih ++Tested-by: Maciej S. Szmigiero ++--- ++ drivers/net/wireless/realtek/rtlwifi/core.c | 32 +++++++++++++++++++++ ++ drivers/net/wireless/realtek/rtlwifi/core.h | 1 + ++ drivers/net/wireless/realtek/rtlwifi/usb.c | 3 ++ ++ drivers/net/wireless/realtek/rtlwifi/wifi.h | 1 + ++ 4 files changed, 37 insertions(+) ++ ++--- a/drivers/net/wireless/realtek/rtlwifi/core.c +++++ b/drivers/net/wireless/realtek/rtlwifi/core.c ++@@ -1018,6 +1018,25 @@ static void send_beacon_frame(struct iee ++ } ++ } ++ +++void rtl_update_beacon_work_callback(struct work_struct *work) +++{ +++ struct rtl_works *rtlworks = +++ container_of(work, struct rtl_works, update_beacon_work); +++ struct ieee80211_hw *hw = rtlworks->hw; +++ struct rtl_priv *rtlpriv = rtl_priv(hw); +++ struct ieee80211_vif *vif = rtlpriv->mac80211.vif; +++ +++ if (!vif) { +++ WARN_ONCE(true, "no vif to update beacon\n"); +++ return; +++ } +++ +++ mutex_lock(&rtlpriv->locks.conf_mutex); +++ send_beacon_frame(hw, vif); +++ mutex_unlock(&rtlpriv->locks.conf_mutex); +++} +++EXPORT_SYMBOL_GPL(rtl_update_beacon_work_callback); +++ ++ static void rtl_op_bss_info_changed(struct ieee80211_hw *hw, ++ struct ieee80211_vif *vif, ++ struct ieee80211_bss_conf *bss_conf, ++@@ -1747,6 +1766,18 @@ static void rtl_op_flush(struct ieee8021 ++ rtlpriv->intf_ops->flush(hw, queues, drop); ++ } ++ +++static int rtl_op_set_tim(struct ieee80211_hw *hw, struct ieee80211_sta *sta, +++ bool set) +++{ +++ struct rtl_priv *rtlpriv = rtl_priv(hw); +++ struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw)); +++ +++ if (rtlhal->hw_type == HARDWARE_TYPE_RTL8192CU) +++ schedule_work(&rtlpriv->works.update_beacon_work); +++ +++ return 0; +++} +++ ++ /* Description: ++ * This routine deals with the Power Configuration CMD ++ * parsing for RTL8723/RTL8188E Series IC. ++@@ -1903,6 +1934,7 @@ const struct ieee80211_ops rtl_ops = { ++ .sta_add = rtl_op_sta_add, ++ .sta_remove = rtl_op_sta_remove, ++ .flush = rtl_op_flush, +++ .set_tim = rtl_op_set_tim, ++ }; ++ EXPORT_SYMBOL_GPL(rtl_ops); ++ ++--- a/drivers/net/wireless/realtek/rtlwifi/core.h +++++ b/drivers/net/wireless/realtek/rtlwifi/core.h ++@@ -60,5 +60,6 @@ void rtl_bb_delay(struct ieee80211_hw *h ++ bool rtl_cmd_send_packet(struct ieee80211_hw *hw, struct sk_buff *skb); ++ bool rtl_btc_status_false(void); ++ void rtl_dm_diginit(struct ieee80211_hw *hw, u32 cur_igval); +++void rtl_update_beacon_work_callback(struct work_struct *work); ++ ++ #endif ++--- a/drivers/net/wireless/realtek/rtlwifi/usb.c +++++ b/drivers/net/wireless/realtek/rtlwifi/usb.c ++@@ -807,6 +807,7 @@ static void rtl_usb_stop(struct ieee8021 ++ ++ tasklet_kill(&rtlusb->rx_work_tasklet); ++ cancel_work_sync(&rtlpriv->works.lps_change_work); +++ cancel_work_sync(&rtlpriv->works.update_beacon_work); ++ ++ flush_workqueue(rtlpriv->works.rtl_wq); ++ ++@@ -1033,6 +1034,8 @@ int rtl_usb_probe(struct usb_interface * ++ rtl_fill_h2c_cmd_work_callback); ++ INIT_WORK(&rtlpriv->works.lps_change_work, ++ rtl_lps_change_work_callback); +++ INIT_WORK(&rtlpriv->works.update_beacon_work, +++ rtl_update_beacon_work_callback); ++ ++ rtlpriv->usb_data_index = 0; ++ init_completion(&rtlpriv->firmware_loading_complete); ++--- a/drivers/net/wireless/realtek/rtlwifi/wifi.h +++++ b/drivers/net/wireless/realtek/rtlwifi/wifi.h ++@@ -2487,6 +2487,7 @@ struct rtl_works { ++ ++ struct work_struct lps_change_work; ++ struct work_struct fill_h2c_cmd; +++ struct work_struct update_beacon_work; ++ }; ++ ++ struct rtl_debug { +diff --git a/package/kernel/mac80211/patches/subsys/010-sync-nl80211_h.patch b/package/kernel/mac80211/patches/subsys/010-sync-nl80211_h.patch +new file mode 100644 +index 0000000000..e1f66ac1c3 +--- /dev/null ++++ b/package/kernel/mac80211/patches/subsys/010-sync-nl80211_h.patch +@@ -0,0 +1,297 @@ ++--- a/include/uapi/linux/nl80211.h +++++ b/include/uapi/linux/nl80211.h ++@@ -655,6 +655,9 @@ ++ * When a security association was established on an 802.1X network using ++ * fast transition, this event should be followed by an ++ * %NL80211_CMD_PORT_AUTHORIZED event. +++ * Following a %NL80211_CMD_ROAM event userspace can issue +++ * %NL80211_CMD_GET_SCAN in order to obtain the scan information for the +++ * new BSS the card/driver roamed to. ++ * @NL80211_CMD_DISCONNECT: drop a given connection; also used to notify ++ * userspace that a connection was dropped by the AP or due to other ++ * reasons, for this the %NL80211_ATTR_DISCONNECTED_BY_AP and ++@@ -757,7 +760,8 @@ ++ * of any other interfaces, and other interfaces will again take ++ * precedence when they are used. ++ * ++- * @NL80211_CMD_SET_WDS_PEER: Set the MAC address of the peer on a WDS interface. +++ * @NL80211_CMD_SET_WDS_PEER: Set the MAC address of the peer on a WDS interface +++ * (no longer supported). ++ * ++ * @NL80211_CMD_SET_MULTICAST_TO_UNICAST: Configure if this AP should perform ++ * multicast to unicast conversion. When enabled, all multicast packets ++@@ -1177,6 +1181,10 @@ ++ * includes the contents of the frame. %NL80211_ATTR_ACK flag is included ++ * if the recipient acknowledged the frame. ++ * +++ * @NL80211_CMD_SET_SAR_SPECS: SAR power limitation configuration is +++ * passed using %NL80211_ATTR_SAR_SPEC. %NL80211_ATTR_WIPHY is used to +++ * specify the wiphy index to be applied to. +++ * ++ * @NL80211_CMD_MAX: highest used command number ++ * @__NL80211_CMD_AFTER_LAST: internal use ++ */ ++@@ -1407,6 +1415,8 @@ enum nl80211_commands { ++ ++ NL80211_CMD_CONTROL_PORT_FRAME_TX_STATUS, ++ +++ NL80211_CMD_SET_SAR_SPECS, +++ ++ /* add new commands above here */ ++ ++ /* used to define NL80211_CMD_MAX below */ ++@@ -1750,8 +1760,9 @@ enum nl80211_commands { ++ * specify just a single bitrate, which is to be used for the beacon. ++ * The driver must also specify support for this with the extended ++ * features NL80211_EXT_FEATURE_BEACON_RATE_LEGACY, ++- * NL80211_EXT_FEATURE_BEACON_RATE_HT and ++- * NL80211_EXT_FEATURE_BEACON_RATE_VHT. +++ * NL80211_EXT_FEATURE_BEACON_RATE_HT, +++ * NL80211_EXT_FEATURE_BEACON_RATE_VHT and +++ * NL80211_EXT_FEATURE_BEACON_RATE_HE. ++ * ++ * @NL80211_ATTR_FRAME_MATCH: A binary attribute which typically must contain ++ * at least one byte, currently used with @NL80211_CMD_REGISTER_FRAME. ++@@ -1955,8 +1966,15 @@ enum nl80211_commands { ++ * @NL80211_ATTR_PROBE_RESP: Probe Response template data. Contains the entire ++ * probe-response frame. The DA field in the 802.11 header is zero-ed out, ++ * to be filled by the FW. ++- * @NL80211_ATTR_DISABLE_HT: Force HT capable interfaces to disable ++- * this feature. Currently, only supported in mac80211 drivers. +++ * @NL80211_ATTR_DISABLE_HT: Force HT capable interfaces to disable +++ * this feature during association. This is a flag attribute. +++ * Currently only supported in mac80211 drivers. +++ * @NL80211_ATTR_DISABLE_VHT: Force VHT capable interfaces to disable +++ * this feature during association. This is a flag attribute. +++ * Currently only supported in mac80211 drivers. +++ * @NL80211_ATTR_DISABLE_HE: Force HE capable interfaces to disable +++ * this feature during association. This is a flag attribute. +++ * Currently only supported in mac80211 drivers. ++ * @NL80211_ATTR_HT_CAPABILITY_MASK: Specify which bits of the ++ * ATTR_HT_CAPABILITY to which attention should be paid. ++ * Currently, only mac80211 NICs support this feature. ++@@ -2077,7 +2095,8 @@ enum nl80211_commands { ++ * until the channel switch event. ++ * @NL80211_ATTR_CH_SWITCH_BLOCK_TX: flag attribute specifying that transmission ++ * must be blocked on the current channel (before the channel switch ++- * operation). +++ * operation). Also included in the channel switch started event if quiet +++ * was requested by the AP. ++ * @NL80211_ATTR_CSA_IES: Nested set of attributes containing the IE information ++ * for the time while performing a channel switch. ++ * @NL80211_ATTR_CNTDWN_OFFS_BEACON: An array of offsets (u16) to the channel ++@@ -2527,6 +2546,20 @@ enum nl80211_commands { ++ * override mask. Used with NL80211_ATTR_S1G_CAPABILITY in ++ * NL80211_CMD_ASSOCIATE or NL80211_CMD_CONNECT. ++ * +++ * @NL80211_ATTR_SAE_PWE: Indicates the mechanism(s) allowed for SAE PWE +++ * derivation in WPA3-Personal networks which are using SAE authentication. +++ * This is a u8 attribute that encapsulates one of the values from +++ * &enum nl80211_sae_pwe_mechanism. +++ * +++ * @NL80211_ATTR_SAR_SPEC: SAR power limitation specification when +++ * used with %NL80211_CMD_SET_SAR_SPECS. The message contains fields +++ * of %nl80211_sar_attrs which specifies the sar type and related +++ * sar specs. Sar specs contains array of %nl80211_sar_specs_attrs. +++ * +++ * @NL80211_ATTR_RECONNECT_REQUESTED: flag attribute, used with deauth and +++ * disassoc events to indicate that an immediate reconnect to the AP +++ * is desired. +++ * ++ * @NUM_NL80211_ATTR: total number of nl80211_attrs available ++ * @NL80211_ATTR_MAX: highest attribute number currently defined ++ * @__NL80211_ATTR_AFTER_LAST: internal use ++@@ -3016,6 +3049,14 @@ enum nl80211_attrs { ++ NL80211_ATTR_S1G_CAPABILITY, ++ NL80211_ATTR_S1G_CAPABILITY_MASK, ++ +++ NL80211_ATTR_SAE_PWE, +++ +++ NL80211_ATTR_RECONNECT_REQUESTED, +++ +++ NL80211_ATTR_SAR_SPEC, +++ +++ NL80211_ATTR_DISABLE_HE, +++ ++ /* add attributes here, update the policy in nl80211.c */ ++ ++ __NL80211_ATTR_AFTER_LAST, ++@@ -5896,6 +5937,19 @@ enum nl80211_feature_flags { ++ * @NL80211_EXT_FEATURE_UNSOL_BCAST_PROBE_RESP: Driver/device supports ++ * unsolicited broadcast probe response transmission ++ * +++ * @NL80211_EXT_FEATURE_BEACON_RATE_HE: Driver supports beacon rate +++ * configuration (AP/mesh) with HE rates. +++ * +++ * @NL80211_EXT_FEATURE_SECURE_LTF: Device supports secure LTF measurement +++ * exchange protocol. +++ * +++ * @NL80211_EXT_FEATURE_SECURE_RTT: Device supports secure RTT measurement +++ * exchange protocol. +++ * +++ * @NL80211_EXT_FEATURE_PROT_RANGE_NEGO_AND_MEASURE: Device supports management +++ * frame protection for all management frames exchanged during the +++ * negotiation and range measurement procedure. +++ * ++ * @NUM_NL80211_EXT_FEATURES: number of extended features. ++ * @MAX_NL80211_EXT_FEATURES: highest extended feature index. ++ */ ++@@ -5956,6 +6010,10 @@ enum nl80211_ext_feature_index { ++ NL80211_EXT_FEATURE_SAE_OFFLOAD_AP, ++ NL80211_EXT_FEATURE_FILS_DISCOVERY, ++ NL80211_EXT_FEATURE_UNSOL_BCAST_PROBE_RESP, +++ NL80211_EXT_FEATURE_BEACON_RATE_HE, +++ NL80211_EXT_FEATURE_SECURE_LTF, +++ NL80211_EXT_FEATURE_SECURE_RTT, +++ NL80211_EXT_FEATURE_PROT_RANGE_NEGO_AND_MEASURE, ++ ++ /* add new features before the definition below */ ++ NUM_NL80211_EXT_FEATURES, ++@@ -6253,11 +6311,13 @@ struct nl80211_vendor_cmd_info { ++ * @NL80211_TDLS_PEER_HT: TDLS peer is HT capable. ++ * @NL80211_TDLS_PEER_VHT: TDLS peer is VHT capable. ++ * @NL80211_TDLS_PEER_WMM: TDLS peer is WMM capable. +++ * @NL80211_TDLS_PEER_HE: TDLS peer is HE capable. ++ */ ++ enum nl80211_tdls_peer_capability { ++ NL80211_TDLS_PEER_HT = 1<<0, ++ NL80211_TDLS_PEER_VHT = 1<<1, ++ NL80211_TDLS_PEER_WMM = 1<<2, +++ NL80211_TDLS_PEER_HE = 1<<3, ++ }; ++ ++ /** ++@@ -6849,6 +6909,9 @@ enum nl80211_peer_measurement_ftm_capa { ++ * if neither %NL80211_PMSR_FTM_REQ_ATTR_TRIGGER_BASED nor ++ * %NL80211_PMSR_FTM_REQ_ATTR_NON_TRIGGER_BASED is set, EDCA based ++ * ranging will be used. +++ * @NL80211_PMSR_FTM_REQ_ATTR_LMR_FEEDBACK: negotiate for LMR feedback. Only +++ * valid if either %NL80211_PMSR_FTM_REQ_ATTR_TRIGGER_BASED or +++ * %NL80211_PMSR_FTM_REQ_ATTR_NON_TRIGGER_BASED is set. ++ * ++ * @NUM_NL80211_PMSR_FTM_REQ_ATTR: internal ++ * @NL80211_PMSR_FTM_REQ_ATTR_MAX: highest attribute number ++@@ -6867,6 +6930,7 @@ enum nl80211_peer_measurement_ftm_req { ++ NL80211_PMSR_FTM_REQ_ATTR_REQUEST_CIVICLOC, ++ NL80211_PMSR_FTM_REQ_ATTR_TRIGGER_BASED, ++ NL80211_PMSR_FTM_REQ_ATTR_NON_TRIGGER_BASED, +++ NL80211_PMSR_FTM_REQ_ATTR_LMR_FEEDBACK, ++ ++ /* keep last */ ++ NUM_NL80211_PMSR_FTM_REQ_ATTR, ++@@ -7124,4 +7188,115 @@ enum nl80211_unsol_bcast_probe_resp_attr ++ NL80211_UNSOL_BCAST_PROBE_RESP_ATTR_MAX = ++ __NL80211_UNSOL_BCAST_PROBE_RESP_ATTR_LAST - 1 ++ }; +++ +++/** +++ * enum nl80211_sae_pwe_mechanism - The mechanism(s) allowed for SAE PWE +++ * derivation. Applicable only when WPA3-Personal SAE authentication is +++ * used. +++ * +++ * @NL80211_SAE_PWE_UNSPECIFIED: not specified, used internally to indicate that +++ * attribute is not present from userspace. +++ * @NL80211_SAE_PWE_HUNT_AND_PECK: hunting-and-pecking loop only +++ * @NL80211_SAE_PWE_HASH_TO_ELEMENT: hash-to-element only +++ * @NL80211_SAE_PWE_BOTH: both hunting-and-pecking loop and hash-to-element +++ * can be used. +++ */ +++enum nl80211_sae_pwe_mechanism { +++ NL80211_SAE_PWE_UNSPECIFIED, +++ NL80211_SAE_PWE_HUNT_AND_PECK, +++ NL80211_SAE_PWE_HASH_TO_ELEMENT, +++ NL80211_SAE_PWE_BOTH, +++}; +++ +++/** +++ * enum nl80211_sar_type - type of SAR specs +++ * +++ * @NL80211_SAR_TYPE_POWER: power limitation specified in 0.25dBm unit +++ * +++ */ +++enum nl80211_sar_type { +++ NL80211_SAR_TYPE_POWER, +++ +++ /* add new type here */ +++ +++ /* Keep last */ +++ NUM_NL80211_SAR_TYPE, +++}; +++ +++/** +++ * enum nl80211_sar_attrs - Attributes for SAR spec +++ * +++ * @NL80211_SAR_ATTR_TYPE: the SAR type as defined in &enum nl80211_sar_type. +++ * +++ * @NL80211_SAR_ATTR_SPECS: Nested array of SAR power +++ * limit specifications. Each specification contains a set +++ * of %nl80211_sar_specs_attrs. +++ * +++ * For SET operation, it contains array of %NL80211_SAR_ATTR_SPECS_POWER +++ * and %NL80211_SAR_ATTR_SPECS_RANGE_INDEX. +++ * +++ * For sar_capa dump, it contains array of +++ * %NL80211_SAR_ATTR_SPECS_START_FREQ +++ * and %NL80211_SAR_ATTR_SPECS_END_FREQ. +++ * +++ * @__NL80211_SAR_ATTR_LAST: Internal +++ * @NL80211_SAR_ATTR_MAX: highest sar attribute +++ * +++ * These attributes are used with %NL80211_CMD_SET_SAR_SPEC +++ */ +++enum nl80211_sar_attrs { +++ __NL80211_SAR_ATTR_INVALID, +++ +++ NL80211_SAR_ATTR_TYPE, +++ NL80211_SAR_ATTR_SPECS, +++ +++ __NL80211_SAR_ATTR_LAST, +++ NL80211_SAR_ATTR_MAX = __NL80211_SAR_ATTR_LAST - 1, +++}; +++ +++/** +++ * enum nl80211_sar_specs_attrs - Attributes for SAR power limit specs +++ * +++ * @NL80211_SAR_ATTR_SPECS_POWER: Required (s32)value to specify the actual +++ * power limit value in units of 0.25 dBm if type is +++ * NL80211_SAR_TYPE_POWER. (i.e., a value of 44 represents 11 dBm). +++ * 0 means userspace doesn't have SAR limitation on this associated range. +++ * +++ * @NL80211_SAR_ATTR_SPECS_RANGE_INDEX: Required (u32) value to specify the +++ * index of exported freq range table and the associated power limitation +++ * is applied to this range. +++ * +++ * Userspace isn't required to set all the ranges advertised by WLAN driver, +++ * and userspace can skip some certain ranges. These skipped ranges don't +++ * have SAR limitations, and they are same as setting the +++ * %NL80211_SAR_ATTR_SPECS_POWER to any unreasonable high value because any +++ * value higher than regulatory allowed value just means SAR power +++ * limitation is removed, but it's required to set at least one range. +++ * It's not allowed to set duplicated range in one SET operation. +++ * +++ * Every SET operation overwrites previous SET operation. +++ * +++ * @NL80211_SAR_ATTR_SPECS_START_FREQ: Required (u32) value to specify the start +++ * frequency of this range edge when registering SAR capability to wiphy. +++ * It's not a channel center frequency. The unit is kHz. +++ * +++ * @NL80211_SAR_ATTR_SPECS_END_FREQ: Required (u32) value to specify the end +++ * frequency of this range edge when registering SAR capability to wiphy. +++ * It's not a channel center frequency. The unit is kHz. +++ * +++ * @__NL80211_SAR_ATTR_SPECS_LAST: Internal +++ * @NL80211_SAR_ATTR_SPECS_MAX: highest sar specs attribute +++ */ +++enum nl80211_sar_specs_attrs { +++ __NL80211_SAR_ATTR_SPECS_INVALID, +++ +++ NL80211_SAR_ATTR_SPECS_POWER, +++ NL80211_SAR_ATTR_SPECS_RANGE_INDEX, +++ NL80211_SAR_ATTR_SPECS_START_FREQ, +++ NL80211_SAR_ATTR_SPECS_END_FREQ, +++ +++ __NL80211_SAR_ATTR_SPECS_LAST, +++ NL80211_SAR_ATTR_SPECS_MAX = __NL80211_SAR_ATTR_SPECS_LAST - 1, +++}; +++ ++ #endif /* __LINUX_NL80211_H */ diff --git a/package/kernel/mac80211/patches/subsys/100-remove-cryptoapi-dependencies.patch b/package/kernel/mac80211/patches/subsys/100-remove-cryptoapi-dependencies.patch deleted file mode 100644 -index ca02dfb06f..0000000000 +index 7b036e4e4c..0000000000 --- a/package/kernel/mac80211/patches/subsys/100-remove-cryptoapi-dependencies.patch +++ /dev/null -@@ -1,699 +0,0 @@ +@@ -1,698 +0,0 @@ ---- a/net/mac80211/Makefile -+++ b/net/mac80211/Makefile -@@ -7,7 +7,6 @@ mac80211-y := \ @@ -1065,7 +1994,7 @@ index ca02dfb06f..0000000000 - ethtool.o \ ---- a/net/mac80211/aead_api.c -+++ /dev/null --@@ -1,113 +0,0 @@ +-@@ -1,112 +0,0 @@ --// SPDX-License-Identifier: GPL-2.0-only --/* -- * Copyright 2003-2004, Instant802 Networks, Inc. @@ -1091,7 +2020,6 @@ index ca02dfb06f..0000000000 -- struct aead_request *aead_req; -- int reqsize = sizeof(*aead_req) + crypto_aead_reqsize(tfm); -- u8 *__aad; --- int ret; -- -- aead_req = kzalloc(reqsize + aad_len, GFP_ATOMIC); -- if (!aead_req) @@ -1109,10 +2037,10 @@ index ca02dfb06f..0000000000 -- aead_request_set_crypt(aead_req, sg, sg, data_len, b_0); -- aead_request_set_ad(aead_req, sg[0].length); -- --- ret = crypto_aead_encrypt(aead_req); +-- crypto_aead_encrypt(aead_req); -- kfree_sensitive(aead_req); -- --- return ret; +-- return 0; --} -- --int aead_decrypt(struct crypto_aead *tfm, u8 *b_0, u8 *aad, size_t aad_len, @@ -1424,7 +2352,7 @@ index ca02dfb06f..0000000000 - #endif /* AES_GCM_H */ ---- a/net/mac80211/wpa.c -+++ b/net/mac80211/wpa.c --@@ -312,7 +312,8 @@ ieee80211_crypto_tkip_decrypt(struct iee +-@@ -311,7 +311,8 @@ ieee80211_crypto_tkip_decrypt(struct iee - } - - @@ -1434,7 +2362,7 @@ index ca02dfb06f..0000000000 - { - __le16 mask_fc; - int a4_included, mgmt; --@@ -342,14 +343,8 @@ static void ccmp_special_blocks(struct s +-@@ -341,14 +342,8 @@ static void ccmp_special_blocks(struct s - else - qos_tid = 0; - @@ -1451,7 +2379,7 @@ index ca02dfb06f..0000000000 - - /* Nonce: Nonce Flags | A2 | PN - * Nonce Flags: Priority (b0..b3) | Management (b4) | Reserved (b5..b7) --@@ -357,6 +352,8 @@ static void ccmp_special_blocks(struct s +-@@ -356,6 +351,8 @@ static void ccmp_special_blocks(struct s - b_0[1] = qos_tid | (mgmt << 4); - memcpy(&b_0[2], hdr->addr2, ETH_ALEN); - memcpy(&b_0[8], pn, IEEE80211_CCMP_PN_LEN); @@ -1460,7 +2388,7 @@ index ca02dfb06f..0000000000 - - /* AAD (extra authenticate-only data) / masked 802.11 header - * FC | A1 | A2 | A3 | SC | [A4] | [QC] */ --@@ -413,7 +410,7 @@ static int ccmp_encrypt_skb(struct ieee8 +-@@ -412,7 +409,7 @@ static int ccmp_encrypt_skb(struct ieee8 - u8 *pos; - u8 pn[6]; - u64 pn64; @@ -1469,7 +2397,7 @@ index ca02dfb06f..0000000000 - u8 b_0[AES_BLOCK_SIZE]; - - if (info->control.hw_key && --@@ -468,9 +465,11 @@ static int ccmp_encrypt_skb(struct ieee8 +-@@ -467,9 +464,11 @@ static int ccmp_encrypt_skb(struct ieee8 - return 0; - - pos += IEEE80211_CCMP_HDR_LEN; @@ -1484,7 +2412,7 @@ index ca02dfb06f..0000000000 - } - - --@@ -543,13 +542,13 @@ ieee80211_crypto_ccmp_decrypt(struct iee +-@@ -542,13 +541,13 @@ ieee80211_crypto_ccmp_decrypt(struct iee - u8 aad[2 * AES_BLOCK_SIZE]; - u8 b_0[AES_BLOCK_SIZE]; - /* hardware didn't decrypt/verify MIC */ @@ -1500,7 +2428,7 @@ index ca02dfb06f..0000000000 - return RX_DROP_UNUSABLE; - } - --@@ -646,7 +645,7 @@ static int gcmp_encrypt_skb(struct ieee8 +-@@ -643,7 +642,7 @@ static int gcmp_encrypt_skb(struct ieee8 - u8 *pos; - u8 pn[6]; - u64 pn64; @@ -1509,7 +2437,7 @@ index ca02dfb06f..0000000000 - u8 j_0[AES_BLOCK_SIZE]; - - if (info->control.hw_key && --@@ -703,8 +702,10 @@ static int gcmp_encrypt_skb(struct ieee8 +-@@ -700,8 +699,10 @@ static int gcmp_encrypt_skb(struct ieee8 - - pos += IEEE80211_GCMP_HDR_LEN; - gcmp_special_blocks(skb, pn, j_0, aad); @@ -1522,7 +2450,7 @@ index ca02dfb06f..0000000000 - } - - ieee80211_tx_result --@@ -1133,9 +1134,9 @@ ieee80211_crypto_aes_gmac_encrypt(struct +-@@ -1128,9 +1129,9 @@ ieee80211_crypto_aes_gmac_encrypt(struct - struct ieee80211_key *key = tx->key; - struct ieee80211_mmie_16 *mmie; - struct ieee80211_hdr *hdr; @@ -1534,7 +2462,7 @@ index ca02dfb06f..0000000000 - - if (WARN_ON(skb_queue_len(&tx->skbs) != 1)) - return TX_DROP; --@@ -1181,7 +1182,7 @@ ieee80211_crypto_aes_gmac_decrypt(struct +-@@ -1176,7 +1177,7 @@ ieee80211_crypto_aes_gmac_decrypt(struct - struct ieee80211_rx_status *status = IEEE80211_SKB_RXCB(skb); - struct ieee80211_key *key = rx->key; - struct ieee80211_mmie_16 *mmie; @@ -2032,6 +2960,642 @@ index df67d2f101..0000000000 - depends on CRC32 - help - This option enables the hardware independent IEEE 802.11 +diff --git a/package/kernel/mac80211/patches/subsys/150-disable_addr_notifier.patch b/package/kernel/mac80211/patches/subsys/150-disable_addr_notifier.patch +index 8a717558a7..8d086625e4 100644 +--- a/package/kernel/mac80211/patches/subsys/150-disable_addr_notifier.patch ++++ b/package/kernel/mac80211/patches/subsys/150-disable_addr_notifier.patch +@@ -18,7 +18,7 @@ + static int ieee80211_ifa6_changed(struct notifier_block *nb, + unsigned long data, void *arg) + { +-@@ -1301,14 +1301,14 @@ int ieee80211_register_hw(struct ieee802 ++@@ -1315,14 +1315,14 @@ int ieee80211_register_hw(struct ieee802 + + rtnl_unlock(); + +@@ -35,7 +35,7 @@ + local->ifa6_notifier.notifier_call = ieee80211_ifa6_changed; + result = register_inet6addr_notifier(&local->ifa6_notifier); + if (result) +-@@ -1317,13 +1317,13 @@ int ieee80211_register_hw(struct ieee802 ++@@ -1331,13 +1331,13 @@ int ieee80211_register_hw(struct ieee802 + + return 0; + +@@ -52,7 +52,7 @@ + fail_ifa: + #endif + wiphy_unregister(local->hw.wiphy); +-@@ -1351,10 +1351,10 @@ void ieee80211_unregister_hw(struct ieee ++@@ -1365,10 +1365,10 @@ void ieee80211_unregister_hw(struct ieee + tasklet_kill(&local->tx_pending_tasklet); + tasklet_kill(&local->tasklet); + +diff --git a/package/kernel/mac80211/patches/subsys/210-ap_scan.patch b/package/kernel/mac80211/patches/subsys/210-ap_scan.patch +index 80f995737b..ee49942459 100644 +--- a/package/kernel/mac80211/patches/subsys/210-ap_scan.patch ++++ b/package/kernel/mac80211/patches/subsys/210-ap_scan.patch +@@ -1,6 +1,6 @@ + --- a/net/mac80211/cfg.c + +++ b/net/mac80211/cfg.c +-@@ -2442,7 +2442,7 @@ static int ieee80211_scan(struct wiphy * ++@@ -2444,7 +2444,7 @@ static int ieee80211_scan(struct wiphy * + * the frames sent while scanning on other channel will be + * lost) + */ +diff --git a/package/kernel/mac80211/patches/subsys/300-cfg80211-support-immediate-reconnect-request-hint.patch b/package/kernel/mac80211/patches/subsys/300-cfg80211-support-immediate-reconnect-request-hint.patch +index d3f4aa7972..8fe8723cfe 100644 +--- a/package/kernel/mac80211/patches/subsys/300-cfg80211-support-immediate-reconnect-request-hint.patch ++++ b/package/kernel/mac80211/patches/subsys/300-cfg80211-support-immediate-reconnect-request-hint.patch +@@ -31,31 +31,9 @@ Signed-off-by: Johannes Berg + + /** + * cfg80211_rx_unprot_mlme_mgmt - notification of unprotected mlme mgmt frame +---- a/include/uapi/linux/nl80211.h +-+++ b/include/uapi/linux/nl80211.h +-@@ -2527,6 +2527,10 @@ enum nl80211_commands { +- * override mask. Used with NL80211_ATTR_S1G_CAPABILITY in +- * NL80211_CMD_ASSOCIATE or NL80211_CMD_CONNECT. +- * +-+ * @NL80211_ATTR_RECONNECT_REQUESTED: flag attribute, used with deauth and +-+ * disassoc events to indicate that an immediate reconnect to the AP +-+ * is desired. +-+ * +- * @NUM_NL80211_ATTR: total number of nl80211_attrs available +- * @NL80211_ATTR_MAX: highest attribute number currently defined +- * @__NL80211_ATTR_AFTER_LAST: internal use +-@@ -3016,6 +3020,8 @@ enum nl80211_attrs { +- NL80211_ATTR_S1G_CAPABILITY, +- NL80211_ATTR_S1G_CAPABILITY_MASK, +- +-+ NL80211_ATTR_RECONNECT_REQUESTED, +-+ +- /* add attributes here, update the policy in nl80211.c */ +- +- __NL80211_ATTR_AFTER_LAST, + --- a/net/mac80211/mlme.c + +++ b/net/mac80211/mlme.c +-@@ -2729,7 +2729,7 @@ static void ieee80211_report_disconnect( ++@@ -2734,7 +2734,7 @@ static void ieee80211_report_disconnect( + }; + + if (tx) +@@ -64,7 +42,7 @@ Signed-off-by: Johannes Berg + else + cfg80211_rx_mlme_mgmt(sdata->dev, buf, len); + +-@@ -4716,7 +4716,8 @@ void ieee80211_mgd_quiesce(struct ieee80 ++@@ -4724,7 +4724,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, +@@ -166,7 +144,7 @@ Signed-off-by: Johannes Berg + + --- a/net/wireless/nl80211.c + +++ b/net/wireless/nl80211.c +-@@ -732,6 +732,7 @@ static const struct nla_policy nl80211_p ++@@ -736,6 +736,7 @@ static const struct nla_policy nl80211_p + NLA_POLICY_EXACT_LEN(IEEE80211_S1G_CAPABILITY_LEN), + [NL80211_ATTR_S1G_CAPABILITY_MASK] = + NLA_POLICY_EXACT_LEN(IEEE80211_S1G_CAPABILITY_LEN), +@@ -174,7 +152,7 @@ Signed-off-by: Johannes Berg + }; + + /* policy for the key attributes */ +-@@ -15899,7 +15900,7 @@ static void nl80211_send_mlme_event(stru ++@@ -15903,7 +15904,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, +@@ -183,7 +161,7 @@ Signed-off-by: Johannes Berg + { + struct sk_buff *msg; + void *hdr; +-@@ -15921,6 +15922,9 @@ static void nl80211_send_mlme_event(stru ++@@ -15925,6 +15926,9 @@ static void nl80211_send_mlme_event(stru + nla_put(msg, NL80211_ATTR_REQ_IE, req_ies_len, req_ies))) + goto nla_put_failure; + +@@ -193,7 +171,7 @@ Signed-off-by: Johannes Berg + if (uapsd_queues >= 0) { + struct nlattr *nla_wmm = + nla_nest_start_noflag(msg, NL80211_ATTR_STA_WME); +-@@ -15949,7 +15953,8 @@ void nl80211_send_rx_auth(struct cfg8021 ++@@ -15953,7 +15957,8 @@ void nl80211_send_rx_auth(struct cfg8021 + size_t len, gfp_t gfp) + { + nl80211_send_mlme_event(rdev, netdev, buf, len, +@@ -203,7 +181,7 @@ Signed-off-by: Johannes Berg + } + + void nl80211_send_rx_assoc(struct cfg80211_registered_device *rdev, +-@@ -15959,23 +15964,25 @@ void nl80211_send_rx_assoc(struct cfg802 ++@@ -15963,23 +15968,25 @@ void nl80211_send_rx_assoc(struct cfg802 + { + nl80211_send_mlme_event(rdev, netdev, buf, len, + NL80211_CMD_ASSOCIATE, gfp, uapsd_queues, +@@ -234,7 +212,7 @@ Signed-off-by: Johannes Berg + } + + void cfg80211_rx_unprot_mlme_mgmt(struct net_device *dev, const u8 *buf, +-@@ -16006,7 +16013,7 @@ void cfg80211_rx_unprot_mlme_mgmt(struct ++@@ -16010,7 +16017,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, +diff --git a/package/kernel/mac80211/patches/subsys/301-mac80211-support-driver-based-disconnect-with-reconn.patch b/package/kernel/mac80211/patches/subsys/301-mac80211-support-driver-based-disconnect-with-reconn.patch +index 8f948c140e..31621ebf11 100644 +--- a/package/kernel/mac80211/patches/subsys/301-mac80211-support-driver-based-disconnect-with-reconn.patch ++++ b/package/kernel/mac80211/patches/subsys/301-mac80211-support-driver-based-disconnect-with-reconn.patch +@@ -34,7 +34,7 @@ Signed-off-by: Johannes Berg + * @vif: &struct ieee80211_vif pointer from the add_interface callback. + --- a/net/mac80211/ieee80211_i.h + +++ b/net/mac80211/ieee80211_i.h +-@@ -461,7 +461,9 @@ struct ieee80211_if_managed { ++@@ -450,7 +450,9 @@ struct ieee80211_if_managed { + unsigned long probe_timeout; + int probe_send_count; + bool nullfunc_failed; +@@ -47,7 +47,7 @@ Signed-off-by: Johannes Berg + struct ieee80211_mgd_auth_data *auth_data; + --- a/net/mac80211/mlme.c + +++ b/net/mac80211/mlme.c +-@@ -2720,7 +2720,7 @@ EXPORT_SYMBOL(ieee80211_ap_probereq_get) ++@@ -2725,7 +2725,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 + { + struct ieee80211_event event = { + .type = MLME_EVENT, +-@@ -2729,7 +2729,7 @@ static void ieee80211_report_disconnect( ++@@ -2734,7 +2734,7 @@ static void ieee80211_report_disconnect( + }; + + if (tx) +@@ -65,7 +65,7 @@ Signed-off-by: Johannes Berg + else + cfg80211_rx_mlme_mgmt(sdata->dev, buf, len); + +-@@ -2751,13 +2751,18 @@ static void __ieee80211_disconnect(struc ++@@ -2756,13 +2756,18 @@ static void __ieee80211_disconnect(struc + + tx = !sdata->csa_block_tx; + +@@ -89,7 +89,7 @@ Signed-off-by: Johannes Berg + tx, frame_buf); + mutex_lock(&local->mtx); + sdata->vif.csa_active = false; +-@@ -2770,7 +2775,9 @@ static void __ieee80211_disconnect(struc ++@@ -2775,7 +2780,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 + + sdata_unlock(sdata); + } +-@@ -2789,6 +2796,13 @@ static void ieee80211_beacon_connection_ ++@@ -2794,6 +2801,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 + } else { + ieee80211_mgd_probe_ap(sdata, true); + } +-@@ -2827,6 +2841,21 @@ void ieee80211_connection_loss(struct ie ++@@ -2832,6 +2846,21 @@ void ieee80211_connection_loss(struct ie + } + EXPORT_SYMBOL(ieee80211_connection_loss); + +@@ -136,7 +136,7 @@ Signed-off-by: Johannes Berg + + static void ieee80211_destroy_auth_data(struct ieee80211_sub_if_data *sdata, + bool assoc) +-@@ -3130,7 +3159,7 @@ static void ieee80211_rx_mgmt_deauth(str ++@@ -3135,7 +3164,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 + return; + } + +-@@ -3179,7 +3208,8 @@ static void ieee80211_rx_mgmt_disassoc(s ++@@ -3184,7 +3213,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 + } + + static void ieee80211_get_rates(struct ieee80211_supported_band *sband, +-@@ -4199,7 +4229,8 @@ static void ieee80211_rx_mgmt_beacon(str ++@@ -4204,7 +4234,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 + return; + } + +-@@ -4344,7 +4375,7 @@ static void ieee80211_sta_connection_los ++@@ -4349,7 +4380,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 + } + + static int ieee80211_auth(struct ieee80211_sub_if_data *sdata) +-@@ -5431,7 +5462,8 @@ int ieee80211_mgd_auth(struct ieee80211_ ++@@ -5439,7 +5470,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 + } + + sdata_info(sdata, "authenticate with %pM\n", req->bss->bssid); +-@@ -5503,7 +5535,8 @@ int ieee80211_mgd_assoc(struct ieee80211 ++@@ -5511,7 +5543,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 + } + + if (ifmgd->auth_data && !ifmgd->auth_data->done) { +-@@ -5802,7 +5835,7 @@ int ieee80211_mgd_deauth(struct ieee8021 ++@@ -5810,7 +5843,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 + + return 0; + } +-@@ -5822,7 +5855,7 @@ int ieee80211_mgd_deauth(struct ieee8021 ++@@ -5830,7 +5863,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 + return 0; + } + +-@@ -5837,7 +5870,7 @@ int ieee80211_mgd_deauth(struct ieee8021 ++@@ -5845,7 +5878,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 + return 0; + } + +-@@ -5870,7 +5903,7 @@ int ieee80211_mgd_disassoc(struct ieee80 ++@@ -5878,7 +5911,7 @@ int ieee80211_mgd_disassoc(struct ieee80 + frame_buf); + + ieee80211_report_disconnect(sdata, frame_buf, sizeof(frame_buf), true, +diff --git a/package/kernel/mac80211/patches/subsys/302-cfg80211-Add-support-to-configure-SAE-PWE-value-to-d.patch b/package/kernel/mac80211/patches/subsys/302-cfg80211-Add-support-to-configure-SAE-PWE-value-to-d.patch +new file mode 100644 +index 0000000000..acfdae0f5b +--- /dev/null ++++ b/package/kernel/mac80211/patches/subsys/302-cfg80211-Add-support-to-configure-SAE-PWE-value-to-d.patch +@@ -0,0 +1,74 @@ ++From: Rohan Dutta ++Date: Tue, 27 Oct 2020 12:09:10 +0200 ++Subject: [PATCH] cfg80211: Add support to configure SAE PWE value to drivers ++ ++Add support to configure SAE PWE preference from userspace to drivers in ++both AP and STA modes. This is needed for cases where the driver takes ++care of Authentication frame processing (SME in the driver) so that ++correct enforcement of the acceptable PWE derivation mechanism can be ++performed. ++ ++The userspace applications can pass the sae_pwe value using the ++NL80211_ATTR_SAE_PWE attribute in the NL80211_CMD_CONNECT and ++NL80211_CMD_START_AP commands to the driver. This allows selection ++between the hunting-and-pecking loop and hash-to-element options for PWE ++derivation. For backwards compatibility, this new attribute is optional ++and if not included, the driver is notified of the value being ++unspecified. ++ ++Signed-off-by: Rohan Dutta ++Signed-off-by: Jouni Malinen ++Link: https://lore.kernel.org/r/20201027100910.22283-1-jouni@codeaurora.org ++Signed-off-by: Johannes Berg ++--- ++ ++--- a/include/net/cfg80211.h +++++ b/include/net/cfg80211.h ++@@ -1009,6 +1009,14 @@ struct survey_info { ++ * @sae_pwd: password for SAE authentication (for devices supporting SAE ++ * offload) ++ * @sae_pwd_len: length of SAE password (for devices supporting SAE offload) +++ * @sae_pwe: The mechanisms allowed for SAE PWE derivation +++ * NL80211_SAE_PWE_UNSPECIFIED: Not-specified, used to indicate userspace +++ * did not specify any preference. The driver should follow its +++ * internal policy in such a scenario. +++ * NL80211_SAE_PWE_HUNT_AND_PECK: Allow hunting-and-pecking loop only +++ * NL80211_SAE_PWE_HASH_TO_ELEMENT: Allow hash-to-element only +++ * NL80211_SAE_PWE_BOTH: Allow either hunting-and-pecking loop +++ * or hash-to-element ++ */ ++ struct cfg80211_crypto_settings { ++ u32 wpa_versions; ++@@ -1027,6 +1035,7 @@ struct cfg80211_crypto_settings { ++ const u8 *psk; ++ const u8 *sae_pwd; ++ u8 sae_pwd_len; +++ enum nl80211_sae_pwe_mechanism sae_pwe; ++ }; ++ ++ /** ++--- a/net/wireless/nl80211.c +++++ b/net/wireless/nl80211.c ++@@ -736,6 +736,9 @@ static const struct nla_policy nl80211_p ++ NLA_POLICY_EXACT_LEN(IEEE80211_S1G_CAPABILITY_LEN), ++ [NL80211_ATTR_S1G_CAPABILITY_MASK] = ++ NLA_POLICY_EXACT_LEN(IEEE80211_S1G_CAPABILITY_LEN), +++ [NL80211_ATTR_SAE_PWE] = +++ NLA_POLICY_RANGE(NLA_U8, NL80211_SAE_PWE_HUNT_AND_PECK, +++ NL80211_SAE_PWE_BOTH), ++ [NL80211_ATTR_RECONNECT_REQUESTED] = { .type = NLA_REJECT }, ++ }; ++ ++@@ -9764,6 +9767,12 @@ static int nl80211_crypto_settings(struc ++ nla_len(info->attrs[NL80211_ATTR_SAE_PASSWORD]); ++ } ++ +++ if (info->attrs[NL80211_ATTR_SAE_PWE]) +++ settings->sae_pwe = +++ nla_get_u8(info->attrs[NL80211_ATTR_SAE_PWE]); +++ else +++ settings->sae_pwe = NL80211_SAE_PWE_UNSPECIFIED; +++ ++ return 0; ++ } ++ +diff --git a/package/kernel/mac80211/patches/subsys/311-net-fq_impl-drop-get_default_func-move-default-flow-.patch b/package/kernel/mac80211/patches/subsys/311-net-fq_impl-drop-get_default_func-move-default-flow-.patch +index f8748ef123..33dbb5eb90 100644 +--- a/package/kernel/mac80211/patches/subsys/311-net-fq_impl-drop-get_default_func-move-default-flow-.patch ++++ b/package/kernel/mac80211/patches/subsys/311-net-fq_impl-drop-get_default_func-move-default-flow-.patch +@@ -68,7 +68,7 @@ Signed-off-by: Felix Fietkau + static int fq_init(struct fq *fq, int flows_cnt) + --- a/net/mac80211/ieee80211_i.h + +++ b/net/mac80211/ieee80211_i.h +-@@ -857,7 +857,6 @@ enum txq_info_flags { ++@@ -846,7 +846,6 @@ enum txq_info_flags { + */ + struct txq_info { + struct fq_tin tin; +diff --git a/package/kernel/mac80211/patches/subsys/315-mac80211-add-rx-decapsulation-offload-support.patch b/package/kernel/mac80211/patches/subsys/315-mac80211-add-rx-decapsulation-offload-support.patch +index 09407f3b1d..b8bb2930f5 100644 +--- a/package/kernel/mac80211/patches/subsys/315-mac80211-add-rx-decapsulation-offload-support.patch ++++ b/package/kernel/mac80211/patches/subsys/315-mac80211-add-rx-decapsulation-offload-support.patch +@@ -132,7 +132,7 @@ Signed-off-by: Felix Fietkau + #endif /* __MAC80211_DRIVER_OPS */ + --- a/net/mac80211/iface.c + +++ b/net/mac80211/iface.c +-@@ -839,7 +839,7 @@ static const struct net_device_ops ieee8 ++@@ -835,7 +835,7 @@ static const struct net_device_ops ieee8 + + }; + +@@ -141,7 +141,7 @@ Signed-off-by: Felix Fietkau + { + switch (iftype) { + /* P2P GO and client are mapped to AP/STATION types */ +-@@ -859,7 +859,7 @@ static bool ieee80211_set_sdata_offload_ ++@@ -855,7 +855,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 + flags |= IEEE80211_OFFLOAD_ENCAP_ENABLED; + + if (!ieee80211_hw_check(&local->hw, SUPPORTS_TX_FRAG) && +-@@ -872,10 +872,21 @@ static bool ieee80211_set_sdata_offload_ ++@@ -868,10 +868,21 @@ static bool ieee80211_set_sdata_offload_ + flags &= ~IEEE80211_OFFLOAD_ENCAP_ENABLED; + } + +@@ -172,7 +172,7 @@ Signed-off-by: Felix Fietkau + return true; + } + +-@@ -893,7 +904,7 @@ static void ieee80211_set_vif_encap_ops( ++@@ -889,7 +900,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 + enabled = bss->vif.offload_flags & IEEE80211_OFFLOAD_ENCAP_ENABLED; + --- a/net/mac80211/rx.c + +++ b/net/mac80211/rx.c +-@@ -4114,7 +4114,9 @@ void ieee80211_check_fast_rx(struct sta_ ++@@ -4198,7 +4198,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 + + /* use sparse to check that we don't return without updating */ + __acquire(check_fast_rx); +-@@ -4227,6 +4229,17 @@ void ieee80211_check_fast_rx(struct sta_ ++@@ -4311,6 +4313,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 + spin_lock_bh(&sta->lock); + old = rcu_dereference_protected(sta->fast_rx, true); + rcu_assign_pointer(sta->fast_rx, new); +-@@ -4273,6 +4286,108 @@ void ieee80211_check_fast_rx_iface(struc ++@@ -4357,6 +4370,108 @@ void ieee80211_check_fast_rx_iface(struc + mutex_unlock(&local->sta_mtx); + } + +@@ -320,7 +320,7 @@ Signed-off-by: Felix Fietkau + static bool ieee80211_invoke_fast_rx(struct ieee80211_rx_data *rx, + struct ieee80211_fast_rx *fast_rx) + { +-@@ -4293,9 +4408,6 @@ static bool ieee80211_invoke_fast_rx(str ++@@ -4377,9 +4492,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 + /* 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 +-@@ -4369,32 +4481,6 @@ static bool ieee80211_invoke_fast_rx(str ++@@ -4453,32 +4565,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 + if (rx->key && !ieee80211_has_protected(hdr->frame_control)) + goto drop; + +-@@ -4406,12 +4492,6 @@ static bool ieee80211_invoke_fast_rx(str ++@@ -4490,12 +4576,6 @@ static bool ieee80211_invoke_fast_rx(str + return true; + } + +@@ -376,7 +376,7 @@ Signed-off-by: Felix Fietkau + /* 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); +-@@ -4420,62 +4500,14 @@ static bool ieee80211_invoke_fast_rx(str ++@@ -4504,62 +4584,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 + stats->dropped++; + return true; + } +-@@ -4529,6 +4561,47 @@ static bool ieee80211_prepare_and_rx_han ++@@ -4613,6 +4645,47 @@ static bool ieee80211_prepare_and_rx_han + return true; + } + +@@ -491,7 +491,7 @@ Signed-off-by: Felix Fietkau + /* + * This is the actual Rx frames handler. as it belongs to Rx path it must + * be called with rcu_read_lock protection. +-@@ -4766,15 +4839,20 @@ void ieee80211_rx_list(struct ieee80211_ ++@@ -4850,15 +4923,20 @@ void ieee80211_rx_list(struct ieee80211_ + * if it was previously present. + * Also, frames with less than 16 bytes are dropped. + */ +diff --git a/package/kernel/mac80211/patches/subsys/316-mac80211-enable-QoS-support-for-nl80211-ctrl-port.patch b/package/kernel/mac80211/patches/subsys/316-mac80211-enable-QoS-support-for-nl80211-ctrl-port.patch +new file mode 100644 +index 0000000000..4be011ffec +--- /dev/null ++++ b/package/kernel/mac80211/patches/subsys/316-mac80211-enable-QoS-support-for-nl80211-ctrl-port.patch +@@ -0,0 +1,116 @@ ++From: Markus Theil ++Date: Sat, 6 Feb 2021 12:51:12 +0100 ++Subject: [PATCH] mac80211: enable QoS support for nl80211 ctrl port ++ ++This patch unifies sending control port frames ++over nl80211 and AF_PACKET sockets a little more. ++ ++Before this patch, EAPOL frames got QoS prioritization ++only when using AF_PACKET sockets. ++ ++__ieee80211_select_queue only selects a QoS-enabled queue ++for control port frames, when the control port protocol ++is set correctly on the skb. For the AF_PACKET path this ++works, but the nl80211 path used ETH_P_802_3. ++ ++Another check for injected frames in wme.c then prevented ++the QoS TID to be copied in the frame. ++ ++In order to fix this, get rid of the frame injection marking ++for nl80211 ctrl port and set the correct ethernet protocol. ++ ++Please note: ++An erlier version of this path tried to prevent ++frame aggregation for control port frames in order to speed up ++the initial connection setup a little. This seemed to cause ++issues on my older Intel dvm-based hardware, and was therefore ++removed again. Future commits which try to reintroduce this ++have to check carefully how hw behaves with aggregated and ++non-aggregated traffic for the same TID. ++My NIC: Intel(R) Centrino(R) Ultimate-N 6300 AGN, REV=0x74 ++ ++Reported-by: kernel test robot ++Signed-off-by: Markus Theil ++Link: https://lore.kernel.org/r/20210206115112.567881-1-markus.theil@tu-ilmenau.de ++Signed-off-by: Johannes Berg ++--- ++ ++--- a/net/mac80211/status.c +++++ b/net/mac80211/status.c ++@@ -628,16 +628,12 @@ static void ieee80211_report_ack_skb(str ++ u64 cookie = IEEE80211_SKB_CB(skb)->ack.cookie; ++ struct ieee80211_sub_if_data *sdata; ++ struct ieee80211_hdr *hdr = (void *)skb->data; ++- __be16 ethertype = 0; ++- ++- if (skb->len >= ETH_HLEN && skb->protocol == cpu_to_be16(ETH_P_802_3)) ++- skb_copy_bits(skb, 2 * ETH_ALEN, ðertype, ETH_TLEN); ++ ++ rcu_read_lock(); ++ sdata = ieee80211_sdata_from_skb(local, skb); ++ if (sdata) { ++- if (ethertype == sdata->control_port_protocol || ++- ethertype == cpu_to_be16(ETH_P_PREAUTH)) +++ if (skb->protocol == sdata->control_port_protocol || +++ skb->protocol == cpu_to_be16(ETH_P_PREAUTH)) ++ cfg80211_control_port_tx_status(&sdata->wdev, ++ cookie, ++ skb->data, ++--- a/net/mac80211/tx.c +++++ b/net/mac80211/tx.c ++@@ -1195,9 +1195,7 @@ ieee80211_tx_prepare(struct ieee80211_su ++ tx->sta = rcu_dereference(sdata->u.vlan.sta); ++ if (!tx->sta && sdata->wdev.use_4addr) ++ return TX_DROP; ++- } else if (info->flags & (IEEE80211_TX_INTFL_NL80211_FRAME_TX | ++- IEEE80211_TX_CTL_INJECTED) || ++- tx->sdata->control_port_protocol == tx->skb->protocol) { +++ } else if (tx->sdata->control_port_protocol == tx->skb->protocol) { ++ tx->sta = sta_info_get_bss(sdata, hdr->addr1); ++ } ++ if (!tx->sta && !is_multicast_ether_addr(hdr->addr1)) ++@@ -5421,6 +5419,7 @@ int ieee80211_tx_control_port(struct wip ++ { ++ struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev); ++ struct ieee80211_local *local = sdata->local; +++ struct sta_info *sta; ++ struct sk_buff *skb; ++ struct ethhdr *ehdr; ++ u32 ctrl_flags = 0; ++@@ -5443,8 +5442,7 @@ int ieee80211_tx_control_port(struct wip ++ if (cookie) ++ ctrl_flags |= IEEE80211_TX_CTL_REQ_TX_STATUS; ++ ++- flags |= IEEE80211_TX_INTFL_NL80211_FRAME_TX | ++- IEEE80211_TX_CTL_INJECTED; +++ flags |= IEEE80211_TX_INTFL_NL80211_FRAME_TX; ++ ++ skb = dev_alloc_skb(local->hw.extra_tx_headroom + ++ sizeof(struct ethhdr) + len); ++@@ -5461,10 +5459,25 @@ int ieee80211_tx_control_port(struct wip ++ ehdr->h_proto = proto; ++ ++ skb->dev = dev; ++- skb->protocol = htons(ETH_P_802_3); +++ skb->protocol = proto; ++ skb_reset_network_header(skb); ++ skb_reset_mac_header(skb); ++ +++ /* update QoS header to prioritize control port frames if possible, +++ * priorization also happens for control port frames send over +++ * AF_PACKET +++ */ +++ rcu_read_lock(); +++ +++ if (ieee80211_lookup_ra_sta(sdata, skb, &sta) == 0 && !IS_ERR(sta)) { +++ u16 queue = __ieee80211_select_queue(sdata, sta, skb); +++ +++ skb_set_queue_mapping(skb, queue); +++ skb_get_hash(skb); +++ } +++ +++ rcu_read_unlock(); +++ ++ /* mutex lock is only needed for incrementing the cookie counter */ ++ mutex_lock(&local->mtx); ++ diff --git a/package/kernel/mac80211/patches/subsys/320-mac80211_hwsim-add-6GHz-channels.patch b/package/kernel/mac80211/patches/subsys/320-mac80211_hwsim-add-6GHz-channels.patch new file mode 100644 index 0000000000..a7c09f00bc @@ -2254,6 +3818,766 @@ index 96ee595ac1..1cab2eb194 100644 CFLAGS_trace.o := -I$(src) rc80211_minstrel-y := \ +diff --git a/package/kernel/mac80211/patches/subsys/353-mac80211-minstrel_ht-fix-MINSTREL_FRAC-macro.patch b/package/kernel/mac80211/patches/subsys/353-mac80211-minstrel_ht-fix-MINSTREL_FRAC-macro.patch +new file mode 100644 +index 0000000000..0d475b7329 +--- /dev/null ++++ b/package/kernel/mac80211/patches/subsys/353-mac80211-minstrel_ht-fix-MINSTREL_FRAC-macro.patch +@@ -0,0 +1,21 @@ ++From: Felix Fietkau ++Date: Wed, 28 Apr 2021 21:03:13 +0200 ++Subject: [PATCH] mac80211: minstrel_ht: fix MINSTREL_FRAC macro ++ ++Add missing braces to avoid issues with e.g. using additions in the ++div expression ++ ++Signed-off-by: Felix Fietkau ++--- ++ ++--- a/net/mac80211/rc80211_minstrel_ht.h +++++ b/net/mac80211/rc80211_minstrel_ht.h ++@@ -14,7 +14,7 @@ ++ ++ /* scaled fraction values */ ++ #define MINSTREL_SCALE 12 ++-#define MINSTREL_FRAC(val, div) (((val) << MINSTREL_SCALE) / div) +++#define MINSTREL_FRAC(val, div) (((val) << MINSTREL_SCALE) / (div)) ++ #define MINSTREL_TRUNC(val) ((val) >> MINSTREL_SCALE) ++ ++ #define EWMA_LEVEL 96 /* ewma weighting factor [/EWMA_DIV] */ +diff --git a/package/kernel/mac80211/patches/subsys/370-mac80211-fix-TXQ-AC-confusion.patch b/package/kernel/mac80211/patches/subsys/370-mac80211-fix-TXQ-AC-confusion.patch +deleted file mode 100644 +index 0b7c8dd49b..0000000000 +--- a/package/kernel/mac80211/patches/subsys/370-mac80211-fix-TXQ-AC-confusion.patch ++++ /dev/null +@@ -1,61 +0,0 @@ +-From: Johannes Berg +-Date: Tue, 23 Mar 2021 21:05:01 +0100 +-Subject: [PATCH] mac80211: fix TXQ AC confusion +- +-Normally, TXQs have +- +- txq->tid = tid; +- txq->ac = ieee80211_ac_from_tid(tid); +- +-However, the special management TXQ actually has +- +- txq->tid = IEEE80211_NUM_TIDS; // 16 +- txq->ac = IEEE80211_AC_VO; +- +-This makes sense, but ieee80211_ac_from_tid(16) is the same +-as ieee80211_ac_from_tid(0) which is just IEEE80211_AC_BE. +- +-Now, normally this is fine. However, if the netdev queues +-were stopped, then the code in ieee80211_tx_dequeue() will +-propagate the stop from the interface (vif->txqs_stopped[]) +-if the AC 2 (ieee80211_ac_from_tid(txq->tid)) is marked as +-stopped. On wake, however, __ieee80211_wake_txqs() will wake +-the TXQ if AC 0 (txq->ac) is woken up. +- +-If a driver stops all queues with ieee80211_stop_tx_queues() +-and then wakes them again with ieee80211_wake_tx_queues(), +-the ieee80211_wake_txqs() tasklet will run to resync queue +-and TXQ state. If all queues were woken, then what'll happen +-is that _ieee80211_wake_txqs() will run in order of HW queues +-0-3, typically (and certainly for iwlwifi) corresponding to +-ACs 0-3, so it'll call __ieee80211_wake_txqs() for each AC in +-order 0-3. +- +-When __ieee80211_wake_txqs() is called for AC 0 (VO) that'll +-wake up the management TXQ (remember its tid is 16), and the +-driver's wake_tx_queue() will be called. That tries to get a +-frame, which will immediately *stop* the TXQ again, because +-now we check against AC 2, and AC 2 hasn't yet been marked as +-woken up again in sdata->vif.txqs_stopped[] since we're only +-in the __ieee80211_wake_txqs() call for AC 0. +- +-Thus, the management TXQ will never be started again. +- +-Fix this by checking txq->ac directly instead of calculating +-the AC as ieee80211_ac_from_tid(txq->tid). +- +-Fixes: adf8ed01e4fd ("mac80211: add an optional TXQ for other PS-buffered frames") +-Signed-off-by: Johannes Berg +---- +- +---- a/net/mac80211/tx.c +-+++ b/net/mac80211/tx.c +-@@ -3589,7 +3589,7 @@ begin: +- test_bit(IEEE80211_TXQ_STOP_NETIF_TX, &txqi->flags)) +- goto out; +- +-- if (vif->txqs_stopped[ieee80211_ac_from_tid(txq->tid)]) { +-+ if (vif->txqs_stopped[txq->ac]) { +- set_bit(IEEE80211_TXQ_STOP_NETIF_TX, &txqi->flags); +- goto out; +- } +diff --git a/package/kernel/mac80211/patches/subsys/371-mac80211-don-t-apply-flow-control-on-management-fram.patch b/package/kernel/mac80211/patches/subsys/371-mac80211-don-t-apply-flow-control-on-management-fram.patch +index b439a3814c..8d094a3632 100644 +--- a/package/kernel/mac80211/patches/subsys/371-mac80211-don-t-apply-flow-control-on-management-fram.patch ++++ b/package/kernel/mac80211/patches/subsys/371-mac80211-don-t-apply-flow-control-on-management-fram.patch +@@ -28,7 +28,7 @@ Signed-off-by: Johannes Berg + * + * Transmit and frame generation functions. + */ +-@@ -1403,8 +1403,17 @@ static void ieee80211_txq_enqueue(struct ++@@ -1401,8 +1401,17 @@ static void ieee80211_txq_enqueue(struct + ieee80211_set_skb_enqueue_time(skb); + + spin_lock_bh(&fq->lock); +@@ -48,7 +48,7 @@ Signed-off-by: Johannes Berg + spin_unlock_bh(&fq->lock); + } + +-@@ -3846,6 +3855,9 @@ bool ieee80211_txq_airtime_check(struct ++@@ -3844,6 +3853,9 @@ bool ieee80211_txq_airtime_check(struct + if (!txq->sta) + return true; + +diff --git a/package/kernel/mac80211/patches/subsys/372-mac80211-set-sk_pacing_shift-for-802.3-txpath.patch b/package/kernel/mac80211/patches/subsys/372-mac80211-set-sk_pacing_shift-for-802.3-txpath.patch +index 4d8a91a413..5bc1469a3f 100644 +--- a/package/kernel/mac80211/patches/subsys/372-mac80211-set-sk_pacing_shift-for-802.3-txpath.patch ++++ b/package/kernel/mac80211/patches/subsys/372-mac80211-set-sk_pacing_shift-for-802.3-txpath.patch +@@ -9,7 +9,7 @@ Signed-off-by: Lorenzo Bianconi + + --- a/net/mac80211/tx.c + +++ b/net/mac80211/tx.c +-@@ -4173,6 +4173,9 @@ static bool ieee80211_tx_8023(struct iee ++@@ -4171,6 +4171,9 @@ static bool ieee80211_tx_8023(struct iee + unsigned long flags; + int q = info->hw_queue; + +diff --git a/package/kernel/mac80211/patches/subsys/373-mac80211-support-Rx-timestamp-calculation-for-all-pr.patch b/package/kernel/mac80211/patches/subsys/373-mac80211-support-Rx-timestamp-calculation-for-all-pr.patch +index c432d77b2e..117fb35fcf 100644 +--- a/package/kernel/mac80211/patches/subsys/373-mac80211-support-Rx-timestamp-calculation-for-all-pr.patch ++++ b/package/kernel/mac80211/patches/subsys/373-mac80211-support-Rx-timestamp-calculation-for-all-pr.patch +@@ -15,7 +15,7 @@ Signed-off-by: Johannes Berg + + --- a/net/mac80211/ieee80211_i.h + +++ b/net/mac80211/ieee80211_i.h +-@@ -1600,13 +1600,8 @@ ieee80211_have_rx_timestamp(struct ieee8 ++@@ -1587,13 +1587,8 @@ ieee80211_have_rx_timestamp(struct ieee8 + { + WARN_ON_ONCE(status->flag & RX_FLAG_MACTIME_START && + status->flag & RX_FLAG_MACTIME_END); +diff --git a/package/kernel/mac80211/patches/subsys/374-mac80211-fix-time-is-after-bug-in-mlme.patch b/package/kernel/mac80211/patches/subsys/374-mac80211-fix-time-is-after-bug-in-mlme.patch +deleted file mode 100644 +index 0573aece64..0000000000 +--- a/package/kernel/mac80211/patches/subsys/374-mac80211-fix-time-is-after-bug-in-mlme.patch ++++ /dev/null +@@ -1,31 +0,0 @@ +-From: Ben Greear +-Date: Tue, 30 Mar 2021 16:07:49 -0700 +-Subject: [PATCH] mac80211: fix time-is-after bug in mlme +- +-The incorrect timeout check caused probing to happen when it did +-not need to happen. This in turn caused tx performance drop +-for around 5 seconds in ath10k-ct driver. Possibly that tx drop +-is due to a secondary issue, but fixing the probe to not happen +-when traffic is running fixes the symptom. +- +-Signed-off-by: Ben Greear +-Fixes: 9abf4e49830d ("mac80211: optimize station connection monitor") +-Acked-by: Felix Fietkau +-Link: https://lore.kernel.org/r/20210330230749.14097-1-greearb@candelatech.com +-Signed-off-by: Johannes Berg +---- +- +---- a/net/mac80211/mlme.c +-+++ b/net/mac80211/mlme.c +-@@ -4691,7 +4691,10 @@ static void ieee80211_sta_conn_mon_timer +- timeout = sta->rx_stats.last_rx; +- timeout += IEEE80211_CONNECTION_IDLE_TIME; +- +-- if (time_is_before_jiffies(timeout)) { +-+ /* If timeout is after now, then update timer to fire at +-+ * the later date, but do not actually probe at this time. +-+ */ +-+ if (time_is_after_jiffies(timeout)) { +- mod_timer(&ifmgd->conn_mon_timer, round_jiffies_up(timeout)); +- return; +- } +diff --git a/package/kernel/mac80211/patches/subsys/374-mac80211-move-A-MPDU-session-check-from-minstrel_ht-.patch b/package/kernel/mac80211/patches/subsys/374-mac80211-move-A-MPDU-session-check-from-minstrel_ht-.patch +new file mode 100644 +index 0000000000..031f8e1636 +--- /dev/null ++++ b/package/kernel/mac80211/patches/subsys/374-mac80211-move-A-MPDU-session-check-from-minstrel_ht-.patch +@@ -0,0 +1,126 @@ ++From: Felix Fietkau ++Date: Thu, 17 Jun 2021 17:56:54 +0200 ++Subject: [PATCH] mac80211: move A-MPDU session check from minstrel_ht to ++ mac80211 ++ ++This avoids calling back into tx handlers from within the rate control module. ++Preparation for deferring rate control until tx dequeue ++ ++Signed-off-by: Felix Fietkau ++--- ++ ++--- a/include/net/mac80211.h +++++ b/include/net/mac80211.h ++@@ -6160,6 +6160,11 @@ enum rate_control_capabilities { ++ * otherwise the NSS difference doesn't bother us. ++ */ ++ RATE_CTRL_CAPA_VHT_EXT_NSS_BW = BIT(0), +++ /** +++ * @RATE_CTRL_CAPA_AMPDU_TRIGGER: +++ * mac80211 should start A-MPDU sessions on tx +++ */ +++ RATE_CTRL_CAPA_AMPDU_TRIGGER = BIT(1), ++ }; ++ ++ 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 ++ } ++ ++ static void ++-minstrel_aggr_check(struct ieee80211_sta *pubsta, struct sk_buff *skb) ++-{ ++- struct ieee80211_hdr *hdr = (struct ieee80211_hdr *) skb->data; ++- struct sta_info *sta = container_of(pubsta, struct sta_info, sta); ++- u16 tid; ++- ++- if (skb_get_queue_mapping(skb) == IEEE80211_AC_VO) ++- return; ++- ++- if (unlikely(!ieee80211_is_data_qos(hdr->frame_control))) ++- return; ++- ++- if (unlikely(skb->protocol == cpu_to_be16(ETH_P_PAE))) ++- return; ++- ++- tid = ieee80211_get_tid(hdr); ++- if (likely(sta->ampdu_mlme.tid_tx[tid])) ++- return; ++- ++- ieee80211_start_tx_ba_session(pubsta, tid, 0); ++-} ++- ++-static void ++ 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 ++ struct minstrel_priv *mp = priv; ++ u16 sample_idx; ++ ++- if (!(info->flags & IEEE80211_TX_CTL_AMPDU) && ++- !minstrel_ht_is_legacy_group(MI_RATE_GROUP(mi->max_prob_rate))) ++- minstrel_aggr_check(sta, txrc->skb); ++- ++ info->flags |= mi->tx_flags; ++ ++ #ifdef CPTCFG_MAC80211_DEBUGFS ++@@ -1894,6 +1867,7 @@ static u32 minstrel_ht_get_expected_thro ++ ++ static const struct rate_control_ops mac80211_minstrel_ht = { ++ .name = "minstrel_ht", +++ .capa = RATE_CTRL_CAPA_AMPDU_TRIGGER, ++ .tx_status_ext = minstrel_ht_tx_status, ++ .get_rate = minstrel_ht_get_rate, ++ .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 ++ } ++ EXPORT_SYMBOL(ieee80211_txq_schedule_start); ++ +++static void +++ieee80211_aggr_check(struct ieee80211_sub_if_data *sdata, +++ struct sta_info *sta, +++ struct sk_buff *skb) +++{ +++ struct rate_control_ref *ref = sdata->local->rate_ctrl; +++ u16 tid; +++ +++ if (!ref || !(ref->ops->capa & RATE_CTRL_CAPA_AMPDU_TRIGGER)) +++ return; +++ +++ if (!sta || !sta->sta.ht_cap.ht_supported || +++ !sta->sta.wme || skb_get_queue_mapping(skb) == IEEE80211_AC_VO || +++ skb->protocol == sdata->control_port_protocol) +++ return; +++ +++ tid = skb->priority & IEEE80211_QOS_CTL_TID_MASK; +++ if (likely(sta->ampdu_mlme.tid_tx[tid])) +++ return; +++ +++ ieee80211_start_tx_ba_session(&sta->sta, tid, 0); +++} +++ ++ 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 ++ skb_get_hash(skb); ++ } ++ +++ ieee80211_aggr_check(sdata, sta, skb); +++ ++ if (sta) { ++ struct ieee80211_fast_tx *fast_tx; ++ ++@@ -4224,6 +4249,8 @@ static void ieee80211_8023_xmit(struct i ++ ++ memset(info, 0, sizeof(*info)); ++ +++ ieee80211_aggr_check(sdata, sta, skb); +++ ++ tid = skb->priority & IEEE80211_QOS_CTL_TAG1D_MASK; ++ tid_tx = rcu_dereference(sta->ampdu_mlme.tid_tx[tid]); ++ if (tid_tx) { +diff --git a/package/kernel/mac80211/patches/subsys/375-mac80211-call-ieee80211_tx_h_rate_ctrl-when-dequeue.patch b/package/kernel/mac80211/patches/subsys/375-mac80211-call-ieee80211_tx_h_rate_ctrl-when-dequeue.patch +new file mode 100644 +index 0000000000..cf84fca68a +--- /dev/null ++++ b/package/kernel/mac80211/patches/subsys/375-mac80211-call-ieee80211_tx_h_rate_ctrl-when-dequeue.patch +@@ -0,0 +1,114 @@ ++From: Ryder Lee ++Date: Fri, 28 May 2021 14:05:41 +0800 ++Subject: [PATCH] mac80211: call ieee80211_tx_h_rate_ctrl() when dequeue ++ ++Make ieee80211_tx_h_rate_ctrl() get called on dequeue to improve ++performance since it reduces the turnaround time for rate control. ++ ++Signed-off-by: Ryder Lee ++--- ++ ++--- a/net/mac80211/tx.c +++++ b/net/mac80211/tx.c ++@@ -1778,8 +1778,6 @@ static int invoke_tx_handlers_early(stru ++ CALL_TXH(ieee80211_tx_h_ps_buf); ++ CALL_TXH(ieee80211_tx_h_check_control_port_protocol); ++ CALL_TXH(ieee80211_tx_h_select_key); ++- if (!ieee80211_hw_check(&tx->local->hw, HAS_RATE_CONTROL)) ++- CALL_TXH(ieee80211_tx_h_rate_ctrl); ++ ++ txh_done: ++ if (unlikely(res == TX_DROP)) { ++@@ -1812,6 +1810,9 @@ static int invoke_tx_handlers_late(struc ++ goto txh_done; ++ } ++ +++ if (!ieee80211_hw_check(&tx->local->hw, HAS_RATE_CONTROL)) +++ CALL_TXH(ieee80211_tx_h_rate_ctrl); +++ ++ 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: ++ * Can be called while the sta lock is held. Anything that can cause packets to ++ * be generated will cause deadlock! ++ */ ++-static void ieee80211_xmit_fast_finish(struct ieee80211_sub_if_data *sdata, ++- struct sta_info *sta, u8 pn_offs, ++- struct ieee80211_key *key, ++- struct sk_buff *skb) +++static ieee80211_tx_result +++ieee80211_xmit_fast_finish(struct ieee80211_sub_if_data *sdata, +++ struct sta_info *sta, u8 pn_offs, +++ struct ieee80211_key *key, +++ struct ieee80211_tx_data *tx) ++ { +++ struct sk_buff *skb = tx->skb; ++ struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb); ++ struct ieee80211_hdr *hdr = (void *)skb->data; ++ u8 tid = IEEE80211_NUM_TIDS; ++ +++ if (!ieee80211_hw_check(&tx->local->hw, HAS_RATE_CONTROL) && +++ ieee80211_tx_h_rate_ctrl(tx) != TX_CONTINUE) +++ return TX_DROP; +++ ++ if (key) ++ info->control.hw_key = &key->conf; ++ ++@@ -3439,6 +3446,8 @@ static void ieee80211_xmit_fast_finish(s ++ break; ++ } ++ } +++ +++ return TX_CONTINUE; ++ } ++ ++ static bool ieee80211_xmit_fast(struct ieee80211_sub_if_data *sdata, ++@@ -3542,24 +3551,17 @@ static bool ieee80211_xmit_fast(struct i ++ tx.sta = sta; ++ tx.key = fast_tx->key; ++ ++- if (!ieee80211_hw_check(&local->hw, HAS_RATE_CONTROL)) { ++- tx.skb = skb; ++- r = ieee80211_tx_h_rate_ctrl(&tx); ++- skb = tx.skb; ++- tx.skb = NULL; ++- ++- if (r != TX_CONTINUE) { ++- if (r != TX_QUEUED) ++- kfree_skb(skb); ++- return true; ++- } ++- } ++- ++ if (ieee80211_queue_skb(local, sdata, sta, skb)) ++ return true; ++ ++- ieee80211_xmit_fast_finish(sdata, sta, fast_tx->pn_offs, ++- fast_tx->key, skb); +++ tx.skb = skb; +++ r = ieee80211_xmit_fast_finish(sdata, sta, fast_tx->pn_offs, +++ fast_tx->key, &tx); +++ tx.skb = NULL; +++ if (r == TX_DROP) { +++ kfree_skb(skb); +++ return true; +++ } ++ ++ if (sdata->vif.type == NL80211_IFTYPE_AP_VLAN) ++ sdata = container_of(sdata->bss, ++@@ -3670,8 +3672,12 @@ begin: ++ (tx.key->conf.flags & IEEE80211_KEY_FLAG_GENERATE_IV)) ++ pn_offs = ieee80211_hdrlen(hdr->frame_control); ++ ++- ieee80211_xmit_fast_finish(sta->sdata, sta, pn_offs, ++- tx.key, skb); +++ r = ieee80211_xmit_fast_finish(sta->sdata, sta, pn_offs, +++ tx.key, &tx); +++ if (r != TX_CONTINUE) { +++ ieee80211_free_txskb(&local->hw, skb); +++ goto begin; +++ } ++ } else { ++ if (invoke_tx_handlers_late(&tx)) ++ goto begin; +diff --git a/package/kernel/mac80211/patches/subsys/376-mac80211-add-rate-control-support-for-encap-offload.patch b/package/kernel/mac80211/patches/subsys/376-mac80211-add-rate-control-support-for-encap-offload.patch +new file mode 100644 +index 0000000000..43a4a1334d +--- /dev/null ++++ b/package/kernel/mac80211/patches/subsys/376-mac80211-add-rate-control-support-for-encap-offload.patch +@@ -0,0 +1,119 @@ ++From: Ryder Lee ++Date: Fri, 28 May 2021 14:05:43 +0800 ++Subject: [PATCH] mac80211: add rate control support for encap offload ++ ++The software rate control cannot deal with encap offload, so fix it. ++ ++Signed-off-by: Ryder Lee ++--- ++ ++--- a/net/mac80211/ieee80211_i.h +++++ b/net/mac80211/ieee80211_i.h ++@@ -2024,6 +2024,15 @@ static inline void ieee80211_tx_skb(stru ++ ieee80211_tx_skb_tid(sdata, skb, 7); ++ } ++ +++static inline bool ieee80211_is_tx_data(struct sk_buff *skb) +++{ +++ struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data; +++ struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb); +++ +++ return info->flags & IEEE80211_TX_CTL_HW_80211_ENCAP || +++ ieee80211_is_data(hdr->frame_control); +++} +++ ++ u32 ieee802_11_parse_elems_crc(const u8 *start, size_t len, bool action, ++ struct ieee802_11_elems *elems, ++ u64 filter, u32 crc, u8 *transmitter_bssid, ++--- a/net/mac80211/rate.c +++++ b/net/mac80211/rate.c ++@@ -297,15 +297,11 @@ void ieee80211_check_rate_mask(struct ie ++ static bool rc_no_data_or_no_ack_use_min(struct ieee80211_tx_rate_control *txrc) ++ { ++ struct sk_buff *skb = txrc->skb; ++- struct ieee80211_hdr *hdr = (struct ieee80211_hdr *) skb->data; ++ struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb); ++- __le16 fc; ++- ++- fc = hdr->frame_control; ++ ++ return (info->flags & (IEEE80211_TX_CTL_NO_ACK | ++ IEEE80211_TX_CTL_USE_MINRATE)) || ++- !ieee80211_is_data(fc); +++ !ieee80211_is_tx_data(skb); ++ } ++ ++ static void rc_send_low_basicrate(struct ieee80211_tx_rate *rate, ++@@ -870,7 +866,6 @@ void ieee80211_get_tx_rates(struct ieee8 ++ int max_rates) ++ { ++ struct ieee80211_sub_if_data *sdata; ++- struct ieee80211_hdr *hdr = (struct ieee80211_hdr *) skb->data; ++ struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb); ++ struct ieee80211_supported_band *sband; ++ ++@@ -882,7 +877,7 @@ void ieee80211_get_tx_rates(struct ieee8 ++ sdata = vif_to_sdata(vif); ++ sband = sdata->local->hw.wiphy->bands[info->band]; ++ ++- if (ieee80211_is_data(hdr->frame_control)) +++ if (ieee80211_is_tx_data(skb)) ++ rate_control_apply_mask(sdata, sta, sband, dest, max_rates); ++ ++ if (dest[0].idx < 0) ++--- a/net/mac80211/tx.c +++++ b/net/mac80211/tx.c ++@@ -679,6 +679,7 @@ ieee80211_tx_h_rate_ctrl(struct ieee8021 ++ u32 len; ++ struct ieee80211_tx_rate_control txrc; ++ struct ieee80211_sta_rates *ratetbl = NULL; +++ bool encap = info->flags & IEEE80211_TX_CTL_HW_80211_ENCAP; ++ bool assoc = false; ++ ++ memset(&txrc, 0, sizeof(txrc)); ++@@ -720,7 +721,7 @@ ieee80211_tx_h_rate_ctrl(struct ieee8021 ++ * just wants a probe response. ++ */ ++ if (tx->sdata->vif.bss_conf.use_short_preamble && ++- (ieee80211_is_data(hdr->frame_control) || +++ (ieee80211_is_tx_data(tx->skb) || ++ (tx->sta && test_sta_flag(tx->sta, WLAN_STA_SHORT_PREAMBLE)))) ++ txrc.short_preamble = true; ++ ++@@ -742,7 +743,8 @@ ieee80211_tx_h_rate_ctrl(struct ieee8021 ++ "%s: Dropped data frame as no usable bitrate found while " ++ "scanning and associated. Target station: " ++ "%pM on %d GHz band\n", ++- tx->sdata->name, hdr->addr1, +++ tx->sdata->name, +++ encap ? ((struct ethhdr *)hdr)->h_dest : hdr->addr1, ++ info->band ? 5 : 2)) ++ return TX_DROP; ++ ++@@ -776,7 +778,7 @@ ieee80211_tx_h_rate_ctrl(struct ieee8021 ++ ++ if (txrc.reported_rate.idx < 0) { ++ txrc.reported_rate = tx->rate; ++- if (tx->sta && ieee80211_is_data(hdr->frame_control)) +++ if (tx->sta && ieee80211_is_tx_data(tx->skb)) ++ 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: ++ else ++ info->flags &= ~IEEE80211_TX_CTL_AMPDU; ++ ++- if (info->flags & IEEE80211_TX_CTL_HW_80211_ENCAP) +++ if (info->flags & IEEE80211_TX_CTL_HW_80211_ENCAP) { +++ if (!ieee80211_hw_check(&local->hw, HAS_RATE_CONTROL)) { +++ r = ieee80211_tx_h_rate_ctrl(&tx); +++ if (r != TX_CONTINUE) { +++ ieee80211_free_txskb(&local->hw, skb); +++ goto begin; +++ } +++ } ++ goto encap_out; +++ } ++ ++ if (info->control.flags & IEEE80211_TX_CTRL_FAST_XMIT) { ++ struct sta_info *sta = container_of(txq->sta, struct sta_info, +diff --git a/package/kernel/mac80211/patches/subsys/377-mac80211-minstrel_ht-fix-sample-time-check.patch b/package/kernel/mac80211/patches/subsys/377-mac80211-minstrel_ht-fix-sample-time-check.patch +new file mode 100644 +index 0000000000..d4b327c69c +--- /dev/null ++++ b/package/kernel/mac80211/patches/subsys/377-mac80211-minstrel_ht-fix-sample-time-check.patch +@@ -0,0 +1,23 @@ ++From: Felix Fietkau ++Date: Thu, 17 Jun 2021 12:05:54 +0200 ++Subject: [PATCH] mac80211: minstrel_ht: fix sample time check ++ ++We need to skip sampling if the next sample time is after jiffies, not before. ++This patch fixes an issue where in some cases only very little sampling (or none ++at all) is performed, leading to really bad data rates ++ ++Fixes: 80d55154b2f8 ("mac80211: minstrel_ht: significantly redesign the rate probing strategy") ++Signed-off-by: Felix Fietkau ++--- ++ ++--- 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 ++ (info->control.flags & IEEE80211_TX_CTRL_PORT_CTRL_PROTO)) ++ return; ++ ++- if (time_is_before_jiffies(mi->sample_time)) +++ if (time_is_after_jiffies(mi->sample_time)) ++ return; ++ ++ mi->sample_time = jiffies + MINSTREL_SAMPLE_INTERVAL; +diff --git a/package/kernel/mac80211/patches/subsys/378-mac80211-remove-iwlwifi-specific-workaround-that-bro.patch b/package/kernel/mac80211/patches/subsys/378-mac80211-remove-iwlwifi-specific-workaround-that-bro.patch +new file mode 100644 +index 0000000000..a5ad377e6f +--- /dev/null ++++ b/package/kernel/mac80211/patches/subsys/378-mac80211-remove-iwlwifi-specific-workaround-that-bro.patch +@@ -0,0 +1,51 @@ ++From: Felix Fietkau ++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 ++--- ++ ++--- 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; +diff --git a/package/kernel/mac80211/patches/subsys/379-mac80211-fix-starting-aggregation-sessions-on-mesh-i.patch b/package/kernel/mac80211/patches/subsys/379-mac80211-fix-starting-aggregation-sessions-on-mesh-i.patch +new file mode 100644 +index 0000000000..2ad083f150 +--- /dev/null ++++ b/package/kernel/mac80211/patches/subsys/379-mac80211-fix-starting-aggregation-sessions-on-mesh-i.patch +@@ -0,0 +1,112 @@ ++From: Felix Fietkau ++Date: Tue, 29 Jun 2021 13:25:09 +0200 ++Subject: [PATCH] mac80211: fix starting aggregation sessions on mesh ++ interfaces ++ ++The logic for starting aggregation sessions was recently moved from minstrel_ht ++to mac80211, into the subif tx handler just after the sta lookup. ++Unfortunately this didn't work for mesh interfaces, since the sta lookup is ++deferred until a much later point in time on those. ++Fix this by also calling the aggregation check right after the deferred sta ++lookup. ++ ++Fixes: 08a46c642001 ("mac80211: move A-MPDU session check from minstrel_ht to mac80211") ++Signed-off-by: Felix Fietkau ++--- ++ ++--- a/net/mac80211/tx.c +++++ b/net/mac80211/tx.c ++@@ -1159,6 +1159,29 @@ static bool ieee80211_tx_prep_agg(struct ++ return queued; ++ } ++ +++static void +++ieee80211_aggr_check(struct ieee80211_sub_if_data *sdata, +++ struct sta_info *sta, +++ struct sk_buff *skb) +++{ +++ struct rate_control_ref *ref = sdata->local->rate_ctrl; +++ u16 tid; +++ +++ if (!ref || !(ref->ops->capa & RATE_CTRL_CAPA_AMPDU_TRIGGER)) +++ return; +++ +++ if (!sta || !sta->sta.ht_cap.ht_supported || +++ !sta->sta.wme || skb_get_queue_mapping(skb) == IEEE80211_AC_VO || +++ skb->protocol == sdata->control_port_protocol) +++ return; +++ +++ tid = skb->priority & IEEE80211_QOS_CTL_TID_MASK; +++ if (likely(sta->ampdu_mlme.tid_tx[tid])) +++ return; +++ +++ ieee80211_start_tx_ba_session(&sta->sta, tid, 0); +++} +++ ++ /* ++ * initialises @tx ++ * pass %NULL for the station if unknown, a valid pointer if known ++@@ -1172,6 +1195,7 @@ ieee80211_tx_prepare(struct ieee80211_su ++ struct ieee80211_local *local = sdata->local; ++ struct ieee80211_hdr *hdr; ++ struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb); +++ bool aggr_check = false; ++ int tid; ++ ++ memset(tx, 0, sizeof(*tx)); ++@@ -1200,8 +1224,10 @@ ieee80211_tx_prepare(struct ieee80211_su ++ } else if (tx->sdata->control_port_protocol == tx->skb->protocol) { ++ tx->sta = sta_info_get_bss(sdata, hdr->addr1); ++ } ++- if (!tx->sta && !is_multicast_ether_addr(hdr->addr1)) +++ if (!tx->sta && !is_multicast_ether_addr(hdr->addr1)) { ++ tx->sta = sta_info_get(sdata, hdr->addr1); +++ aggr_check = true; +++ } ++ } ++ ++ if (tx->sta && ieee80211_is_data_qos(hdr->frame_control) && ++@@ -1211,8 +1237,12 @@ ieee80211_tx_prepare(struct ieee80211_su ++ struct tid_ampdu_tx *tid_tx; ++ ++ tid = ieee80211_get_tid(hdr); ++- ++ tid_tx = rcu_dereference(tx->sta->ampdu_mlme.tid_tx[tid]); +++ if (!tid_tx && aggr_check) { +++ ieee80211_aggr_check(sdata, tx->sta, skb); +++ tid_tx = rcu_dereference(tx->sta->ampdu_mlme.tid_tx[tid]); +++ } +++ ++ if (tid_tx) { ++ bool queued; ++ ++@@ -3947,29 +3977,6 @@ void ieee80211_txq_schedule_start(struct ++ } ++ EXPORT_SYMBOL(ieee80211_txq_schedule_start); ++ ++-static void ++-ieee80211_aggr_check(struct ieee80211_sub_if_data *sdata, ++- struct sta_info *sta, ++- struct sk_buff *skb) ++-{ ++- struct rate_control_ref *ref = sdata->local->rate_ctrl; ++- u16 tid; ++- ++- if (!ref || !(ref->ops->capa & RATE_CTRL_CAPA_AMPDU_TRIGGER)) ++- return; ++- ++- if (!sta || !sta->sta.ht_cap.ht_supported || ++- !sta->sta.wme || skb_get_queue_mapping(skb) == IEEE80211_AC_VO || ++- skb->protocol == sdata->control_port_protocol) ++- return; ++- ++- tid = skb->priority & IEEE80211_QOS_CTL_TID_MASK; ++- if (likely(sta->ampdu_mlme.tid_tx[tid])) ++- return; ++- ++- ieee80211_start_tx_ba_session(&sta->sta, tid, 0); ++-} ++- ++ void __ieee80211_subif_start_xmit(struct sk_buff *skb, ++ struct net_device *dev, ++ u32 info_flags, diff --git a/package/kernel/mac80211/patches/subsys/380-mac80211-introduce-aql_enable-node-in-debugfs.patch b/package/kernel/mac80211/patches/subsys/380-mac80211-introduce-aql_enable-node-in-debugfs.patch new file mode 100644 index 0000000000..b21b671c10 @@ -4239,13 +6563,13 @@ index 0000000000..c351bc812a ++ .set_sar_specs = ieee80211_set_sar_specs, + }; diff --git a/package/kernel/mac80211/patches/subsys/500-mac80211_configure_antenna_gain.patch b/package/kernel/mac80211/patches/subsys/500-mac80211_configure_antenna_gain.patch -index febe42eb9d..b2ee61a6dc 100644 +index 3d1bb3d6c8..b2ee61a6dc 100644 --- a/package/kernel/mac80211/patches/subsys/500-mac80211_configure_antenna_gain.patch +++ b/package/kernel/mac80211/patches/subsys/500-mac80211_configure_antenna_gain.patch @@ -1,6 +1,6 @@ --- a/include/net/cfg80211.h +++ b/include/net/cfg80211.h --@@ -3745,6 +3745,7 @@ struct mgmt_frame_regs { +-@@ -3736,6 +3736,7 @@ struct mgmt_frame_regs { +@@ -3793,6 +3793,7 @@ struct mgmt_frame_regs { * (as advertised by the nl80211 feature flag.) * @get_tx_power: store the current TX power into the dbm variable; @@ -4254,16 +6578,37 @@ index febe42eb9d..b2ee61a6dc 100644 * * @set_wds_peer: set the WDS peer for a WDS interface * --@@ -4067,6 +4068,7 @@ struct cfg80211_ops { +-@@ -4058,6 +4059,7 @@ struct cfg80211_ops { +@@ -4115,6 +4116,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,7 +36,7 @@ + u8 ps_dtim_period; + --- a/include/uapi/linux/nl80211.h + +++ b/include/uapi/linux/nl80211.h +-@@ -2531,6 +2531,9 @@ enum nl80211_commands { ++@@ -2560,6 +2560,9 @@ enum nl80211_commands { + * disassoc events to indicate that an immediate reconnect to the AP + * is desired. + * +@@ -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 +-@@ -3022,6 +3025,8 @@ enum nl80211_attrs { ++@@ -3057,6 +3060,8 @@ enum nl80211_attrs { + +- NL80211_ATTR_RECONNECT_REQUESTED, ++ NL80211_ATTR_DISABLE_HE, + + + NL80211_ATTR_WIPHY_ANTENNA_GAIN, + + @@ -57,7 +57,7 @@ __NL80211_ATTR_AFTER_LAST, --- a/net/mac80211/cfg.c +++ b/net/mac80211/cfg.c --@@ -2709,6 +2709,19 @@ static int ieee80211_get_tx_power(struct +-@@ -2707,6 +2707,19 @@ static int ieee80211_get_tx_power(struct +@@ -2761,6 +2761,19 @@ static int ieee80211_get_tx_power(struct return 0; } @@ -4272,7 +6617,7 @@ index febe42eb9d..b2ee61a6dc 100644 static int ieee80211_set_wds_peer(struct wiphy *wiphy, struct net_device *dev, const u8 *addr) { --@@ -4139,6 +4152,7 @@ const struct cfg80211_ops mac80211_confi +-@@ -4137,6 +4150,7 @@ const struct cfg80211_ops mac80211_confi +@@ -4202,6 +4215,7 @@ const struct cfg80211_ops mac80211_confi .set_wiphy_params = ieee80211_set_wiphy_params, .set_tx_power = ieee80211_set_tx_power, @@ -4281,7 +6626,7 @@ index febe42eb9d..b2ee61a6dc 100644 CFG80211_TESTMODE_CMD(ieee80211_testmode_cmd) --- a/net/mac80211/ieee80211_i.h +++ b/net/mac80211/ieee80211_i.h --@@ -1390,6 +1390,7 @@ struct ieee80211_local { +-@@ -1403,6 +1403,7 @@ struct ieee80211_local { +@@ -1426,6 +1426,7 @@ struct ieee80211_local { int dynamic_ps_forced_timeout; @@ -4290,17 +6635,18 @@ index febe42eb9d..b2ee61a6dc 100644 local->hw.max_mtu = IEEE80211_MAX_DATA_LEN; --- a/net/wireless/nl80211.c +++ b/net/wireless/nl80211.c --@@ -740,6 +740,7 @@ static const struct nla_policy nl80211_p -- NLA_POLICY_RANGE(NLA_U8, NL80211_SAE_PWE_HUNT_AND_PECK, +-@@ -733,6 +733,7 @@ static const struct nla_policy nl80211_p +- [NL80211_ATTR_S1G_CAPABILITY_MASK] = +- NLA_POLICY_EXACT_LEN(IEEE80211_S1G_CAPABILITY_LEN), +@@ -753,6 +753,7 @@ static const struct nla_policy nl80211_p - NL80211_SAE_PWE_BOTH), ++ NL80211_SAE_PWE_BOTH), + [NL80211_ATTR_SAR_SPEC] = NLA_POLICY_NESTED(sar_policy), [NL80211_ATTR_RECONNECT_REQUESTED] = { .type = NLA_REJECT }, + [NL80211_ATTR_WIPHY_ANTENNA_GAIN] = { .type = NLA_U32 }, }; /* policy for the key attributes */ --@@ -3248,6 +3249,20 @@ static int nl80211_set_wiphy(struct sk_b +-@@ -3241,6 +3242,20 @@ static int nl80211_set_wiphy(struct sk_b +@@ -3318,6 +3319,20 @@ static int nl80211_set_wiphy(struct sk_b if (result) return result; diff --git a/backports/0039-hostapd-upsate-to-latest-HEAD.patch b/backports/0039-hostapd-upsate-to-latest-HEAD.patch index fda75ac36..d44f980f6 100644 --- a/backports/0039-hostapd-upsate-to-latest-HEAD.patch +++ b/backports/0039-hostapd-upsate-to-latest-HEAD.patch @@ -1,16 +1,16 @@ -From 57ab692abddc107e1a6bffed52fcb46eb4e49f66 Mon Sep 17 00:00:00 2001 +From 84b526991e77774e21c3eb1a193ca3087b624e83 Mon Sep 17 00:00:00 2001 From: John Crispin -Date: Tue, 10 Aug 2021 07:52:08 +0200 -Subject: [PATCH] hostapd: update to latest HEAD +Date: Thu, 27 May 2021 13:25:19 +0200 +Subject: [PATCH 01/41] hostapd: upsate to latest HEAD Signed-off-by: John Crispin --- package/network/services/hostapd/Makefile | 15 +- .../hostapd/files/hostapd-basic.config | 2 +- .../hostapd/files/hostapd-full.config | 4 +- - .../network/services/hostapd/files/hostapd.sh | 139 +++++++-- + .../network/services/hostapd/files/hostapd.sh | 156 ++++++++-- ...-fix-frequency-setup-with-HE-enabled.patch | 196 ------------- - ...> 001-wolfssl-init-RNG-with-ECC-key.patch} | 11 +- + .../001-wolfssl-init-RNG-with-ECC-key.patch | 43 +++ ...-init-order-disable-pri-sec-channel-.patch | 126 -------- ...andle-HT40-and-mode-downgrade-in-AP-.patch | 102 ------- ...ix-frequency-config-for-non-p2p-vht-.patch | 63 ---- @@ -72,9 +72,9 @@ Signed-off-by: John Crispin .../services/hostapd/src/src/ap/ubus.c | 217 +++++++++++++- .../services/hostapd/src/src/ap/ubus.h | 16 + .../hostapd/src/src/utils/build_features.h | 2 - - 67 files changed, 1250 insertions(+), 2333 deletions(-) + 67 files changed, 1302 insertions(+), 2330 deletions(-) delete mode 100644 package/network/services/hostapd/patches/001-HE-VHT-fix-frequency-setup-with-HE-enabled.patch - rename package/network/services/hostapd/patches/{802-wolfssl-init-RNG-with-ECC-key.patch => 001-wolfssl-init-RNG-with-ECC-key.patch} (76%) + create mode 100644 package/network/services/hostapd/patches/001-wolfssl-init-RNG-with-ECC-key.patch delete mode 100644 package/network/services/hostapd/patches/002-mesh-fix-channel-init-order-disable-pri-sec-channel-.patch delete mode 100644 package/network/services/hostapd/patches/003-wpa_supplicant-handle-HT40-and-mode-downgrade-in-AP-.patch delete mode 100644 package/network/services/hostapd/patches/004-wpa_supplicant-fix-frequency-config-for-non-p2p-vht-.patch @@ -111,7 +111,7 @@ Signed-off-by: John Crispin delete mode 100644 package/network/services/hostapd/patches/801-P2P-Fix-copying-of-secondary-device-types-for-P2P-gr.patch diff --git a/package/network/services/hostapd/Makefile b/package/network/services/hostapd/Makefile -index 67ea89c339..fee6889b40 100644 +index bd2a7c96ad..fee6889b40 100644 --- a/package/network/services/hostapd/Makefile +++ b/package/network/services/hostapd/Makefile @@ -1,19 +1,17 @@ @@ -126,7 +126,7 @@ index 67ea89c339..fee6889b40 100644 include $(TOPDIR)/rules.mk PKG_NAME:=hostapd --PKG_RELEASE:=35 +-PKG_RELEASE:=32 +PKG_RELEASE:=$(AUTORELEASE) PKG_SOURCE_URL:=http://w1.fi/hostap.git @@ -179,7 +179,7 @@ index df272e443a..61b6daf861 100644 # EAP-SAKE for the integrated EAP server #CONFIG_EAP_SAKE=y diff --git a/package/network/services/hostapd/files/hostapd.sh b/package/network/services/hostapd/files/hostapd.sh -index aa72e09eba..4591958b6f 100644 +index 45a49b8faa..4591958b6f 100644 --- a/package/network/services/hostapd/files/hostapd.sh +++ b/package/network/services/hostapd/files/hostapd.sh @@ -49,6 +49,7 @@ hostapd_append_wpa_key_mgmt() { @@ -190,15 +190,17 @@ index aa72e09eba..4591958b6f 100644 ;; eap-eap192) append wpa_key_mgmt "WPA-EAP-SUITE-B-192" -@@ -91,6 +92,7 @@ hostapd_add_log_config() { +@@ -91,14 +92,19 @@ hostapd_add_log_config() { hostapd_common_add_device_config() { config_add_array basic_rate config_add_array supported_rates + config_add_string beacon_rate - config_add_string country country3 +- config_add_string country ++ config_add_string country country3 config_add_boolean country_ie doth -@@ -99,6 +101,10 @@ hostapd_common_add_device_config() { + config_add_boolean spectrum_mgmt_required + config_add_int local_pwr_constraint config_add_string require_mode config_add_boolean legacy_rates config_add_int cell_density @@ -209,17 +211,27 @@ index aa72e09eba..4591958b6f 100644 config_add_string acs_chan_bias config_add_array hostapd_options -@@ -115,7 +121,8 @@ hostapd_prepare_device_config() { +@@ -114,8 +120,9 @@ hostapd_prepare_device_config() { + local base_cfg= - json_get_vars country country3 country_ie beacon_int:100 dtim_period:2 doth require_mode legacy_rates \ +- json_get_vars country country_ie beacon_int:100 dtim_period:2 doth require_mode legacy_rates \ - acs_chan_bias local_pwr_constraint spectrum_mgmt_required airtime_mode cell_density ++ json_get_vars country country3 country_ie beacon_int:100 dtim_period:2 doth require_mode legacy_rates \ + acs_chan_bias local_pwr_constraint spectrum_mgmt_required airtime_mode cell_density \ + rts_threshold beacon_rate rssi_reject_assoc_rssi rssi_ignore_probe_request maxassoc hostapd_set_log_options base_cfg -@@ -207,11 +214,16 @@ hostapd_prepare_device_config() { +@@ -128,6 +135,7 @@ hostapd_prepare_device_config() { + + [ -n "$country" ] && { + append base_cfg "country_code=$country" "$N" ++ [ -n "$country3" ] && append base_cfg "country3=$country3" "$N" + + [ "$country_ie" -gt 0 ] && { + append base_cfg "ieee80211d=1" "$N" +@@ -206,11 +214,16 @@ hostapd_prepare_device_config() { hostapd_add_rate brlist "$br" done @@ -236,7 +248,16 @@ index aa72e09eba..4591958b6f 100644 json_get_values opts hostapd_options for val in $opts; do -@@ -269,7 +281,7 @@ hostapd_common_add_bss_config() { +@@ -251,6 +264,8 @@ hostapd_common_add_bss_config() { + config_add_int acct_port + config_add_int acct_interval + ++ config_add_int bss_load_update_period chan_util_avg_period ++ + config_add_string dae_client + config_add_string dae_secret + config_add_int dae_port +@@ -266,7 +281,7 @@ hostapd_common_add_bss_config() { config_add_array domain_match domain_match2 domain_suffix_match domain_suffix_match2 config_add_string ieee80211w_mgmt_cipher @@ -245,15 +266,19 @@ index aa72e09eba..4591958b6f 100644 config_add_string vlan_tagged_interface vlan_bridge config_add_string vlan_file -@@ -287,6 +299,7 @@ hostapd_common_add_bss_config() { - config_add_boolean wnm_sleep_mode wnm_sleep_mode_no_keys bss_transition +@@ -281,9 +296,10 @@ hostapd_common_add_bss_config() { + config_add_string wps_device_type wps_device_name wps_manufacturer wps_pin + config_add_string multi_ap_backhaul_ssid multi_ap_backhaul_key + +- config_add_boolean wnm_sleep_mode bss_transition ++ config_add_boolean wnm_sleep_mode wnm_sleep_mode_no_keys bss_transition config_add_int time_advertisement config_add_string time_zone + config_add_string vendor_elements config_add_boolean ieee80211k rrm_neighbor_report rrm_beacon_report -@@ -311,6 +324,7 @@ hostapd_common_add_bss_config() { +@@ -308,6 +324,7 @@ hostapd_common_add_bss_config() { config_add_array supported_rates config_add_boolean sae_require_mfp @@ -261,7 +286,7 @@ index aa72e09eba..4591958b6f 100644 config_add_string 'owe_transition_bssid:macaddr' 'owe_transition_ssid:string' -@@ -319,7 +333,7 @@ hostapd_common_add_bss_config() { +@@ -316,7 +333,7 @@ hostapd_common_add_bss_config() { config_add_int iw_ipaddr_type_availability iw_gas_address3 config_add_string iw_hessid iw_network_auth_type iw_qos_map_set config_add_array iw_roaming_consortium iw_domain_name iw_anqp_3gpp_cell_net iw_nai_realm @@ -270,7 +295,7 @@ index aa72e09eba..4591958b6f 100644 config_add_boolean hs20 disable_dgaf osen config_add_int anqp_domain_id -@@ -330,12 +344,22 @@ hostapd_common_add_bss_config() { +@@ -327,12 +344,22 @@ hostapd_common_add_bss_config() { config_add_array hs20_conn_capab config_add_string osu_ssid hs20_wan_metrics hs20_operating_class hs20_t_c_filename hs20_t_c_timestamp @@ -294,7 +319,7 @@ index aa72e09eba..4591958b6f 100644 } hostapd_set_vlan_file() { -@@ -387,7 +411,7 @@ append_iw_anqp_3gpp_cell_net() { +@@ -384,7 +411,7 @@ append_iw_anqp_3gpp_cell_net() { if [ -z "$iw_anqp_3gpp_cell_net_conf" ]; then iw_anqp_3gpp_cell_net_conf="$1" else @@ -303,7 +328,7 @@ index aa72e09eba..4591958b6f 100644 fi } -@@ -399,10 +423,22 @@ append_iw_nai_realm() { +@@ -396,10 +423,22 @@ append_iw_nai_realm() { [ -n "$1" ] && append bss_conf "nai_realm=$1" "$N" } @@ -326,7 +351,7 @@ index aa72e09eba..4591958b6f 100644 append_osu_provider_service_desc() { append bss_conf "osu_service_desc=$1" "$N" } -@@ -450,6 +486,7 @@ append_osu_provider() { +@@ -447,6 +486,7 @@ append_osu_provider() { append bss_conf "osu_method_list=$osu_method_list" "$N" config_list_foreach "$1" osu_service_desc append_osu_provider_service_desc @@ -334,7 +359,7 @@ index aa72e09eba..4591958b6f 100644 config_list_foreach "$1" osu_icon append_osu_icon append bss_conf "$N" -@@ -459,6 +496,14 @@ append_hs20_conn_capab() { +@@ -456,6 +496,14 @@ append_hs20_conn_capab() { [ -n "$1" ] && append bss_conf "hs20_conn_capab=$1" "$N" } @@ -349,7 +374,7 @@ index aa72e09eba..4591958b6f 100644 append_airtime_sta_weight() { [ -n "$1" ] && append bss_conf "airtime_sta_weight=$1" "$N" } -@@ -482,10 +527,12 @@ hostapd_set_bss_options() { +@@ -479,10 +527,12 @@ hostapd_set_bss_options() { macfilter ssid utf8_ssid wmm uapsd hidden short_preamble rsn_preauth \ iapp_interface eapol_version dynamic_vlan ieee80211w nasid \ acct_server acct_secret acct_port acct_interval \ @@ -364,7 +389,7 @@ index aa72e09eba..4591958b6f 100644 set_default isolate 0 set_default maxassoc 0 -@@ -506,6 +553,7 @@ hostapd_set_bss_options() { +@@ -503,6 +553,7 @@ hostapd_set_bss_options() { set_default multi_ap 0 set_default airtime_bss_weight 0 set_default airtime_bss_limit 0 @@ -372,7 +397,7 @@ index aa72e09eba..4591958b6f 100644 append bss_conf "ctrl_interface=/var/run/hostapd" if [ "$isolate" -gt 0 ]; then -@@ -532,6 +580,7 @@ hostapd_set_bss_options() { +@@ -529,6 +580,7 @@ hostapd_set_bss_options() { append bss_conf "uapsd_advertisement_enabled=$uapsd" "$N" append bss_conf "utf8_ssid=$utf8_ssid" "$N" append bss_conf "multi_ap=$multi_ap" "$N" @@ -380,7 +405,7 @@ index aa72e09eba..4591958b6f 100644 [ "$tdls_prohibit" -gt 0 ] && append bss_conf "tdls_prohibit=$tdls_prohibit" "$N" -@@ -550,6 +599,7 @@ hostapd_set_bss_options() { +@@ -547,6 +599,7 @@ hostapd_set_bss_options() { append bss_conf "acct_server_shared_secret=$acct_secret" "$N" [ -n "$acct_interval" ] && \ append bss_conf "radius_acct_interim_interval=$acct_interval" "$N" @@ -388,7 +413,7 @@ index aa72e09eba..4591958b6f 100644 } case "$auth_type" in -@@ -563,6 +613,7 @@ hostapd_set_bss_options() { +@@ -560,6 +613,7 @@ hostapd_set_bss_options() { ;; esac [ -n "$sae_require_mfp" ] && append bss_conf "sae_require_mfp=$sae_require_mfp" "$N" @@ -396,7 +421,7 @@ index aa72e09eba..4591958b6f 100644 local vlan_possible="" -@@ -604,7 +655,7 @@ hostapd_set_bss_options() { +@@ -601,7 +655,7 @@ hostapd_set_bss_options() { auth_server auth_secret auth_port \ dae_client dae_secret dae_port \ ownip radius_client_addr \ @@ -405,7 +430,7 @@ index aa72e09eba..4591958b6f 100644 # radius can provide VLAN ID for clients vlan_possible=1 -@@ -616,18 +667,22 @@ hostapd_set_bss_options() { +@@ -613,18 +667,22 @@ hostapd_set_bss_options() { set_default auth_port 1812 set_default dae_port 3799 @@ -432,7 +457,7 @@ index aa72e09eba..4591958b6f 100644 [ -n "$ownip" ] && append bss_conf "own_ip_addr=$ownip" "$N" [ -n "$radius_client_addr" ] && append bss_conf "radius_client_addr=$radius_client_addr" "$N" -@@ -700,6 +755,7 @@ hostapd_set_bss_options() { +@@ -697,19 +755,24 @@ hostapd_set_bss_options() { append bss_conf "ssid=$ssid" "$N" [ -n "$network_bridge" ] && append bss_conf "bridge=$network_bridge" "$N" @@ -440,7 +465,26 @@ index aa72e09eba..4591958b6f 100644 [ -n "$iapp_interface" ] && { local ifname network_get_device ifname "$iapp_interface" || ifname="$iapp_interface" -@@ -740,7 +796,7 @@ hostapd_set_bss_options() { + append bss_conf "iapp_interface=$ifname" "$N" + } + +- json_get_vars time_advertisement time_zone wnm_sleep_mode bss_transition ++ json_get_vars time_advertisement time_zone wnm_sleep_mode wnm_sleep_mode_no_keys bss_transition + set_default bss_transition 0 + set_default wnm_sleep_mode 0 ++ set_default wnm_sleep_mode_no_keys 0 + + [ -n "$time_advertisement" ] && append bss_conf "time_advertisement=$time_advertisement" "$N" + [ -n "$time_zone" ] && append bss_conf "time_zone=$time_zone" "$N" +- [ "$wnm_sleep_mode" -eq "1" ] && append bss_conf "wnm_sleep_mode=1" "$N" ++ if [ "$wnm_sleep_mode" -eq "1" ]; then ++ append bss_conf "wnm_sleep_mode=1" "$N" ++ [ "$wnm_sleep_mode_no_keys" -eq "1" ] && append bss_conf "wnm_sleep_mode_no_keys=1" "$N" ++ fi + [ "$bss_transition" -eq "1" ] && append bss_conf "bss_transition=1" "$N" + + json_get_vars ieee80211k rrm_neighbor_report rrm_beacon_report +@@ -733,7 +796,7 @@ hostapd_set_bss_options() { append bss_conf "ftm_responder=1" "$N" [ "$stationary_ap" -eq "1" ] && append bss_conf "stationary_ap=1" "$N" [ -n "$lci" ] && append bss_conf "lci=$lci" "$N" @@ -449,7 +493,7 @@ index aa72e09eba..4591958b6f 100644 } fi -@@ -764,6 +820,7 @@ hostapd_set_bss_options() { +@@ -757,6 +820,7 @@ hostapd_set_bss_options() { ;; esac @@ -457,7 +501,7 @@ index aa72e09eba..4591958b6f 100644 append bss_conf "mobility_domain=$mobility_domain" "$N" append bss_conf "ft_psk_generate_local=$ft_psk_generate_local" "$N" append bss_conf "ft_over_ds=$ft_over_ds" "$N" -@@ -778,6 +835,13 @@ hostapd_set_bss_options() { +@@ -771,6 +835,13 @@ hostapd_set_bss_options() { set_default r0_key_lifetime 10000 set_default pmk_r1_push 0 @@ -471,7 +515,7 @@ index aa72e09eba..4591958b6f 100644 [ -n "$r1_key_holder" ] && append bss_conf "r1_key_holder=$r1_key_holder" "$N" append bss_conf "r0_key_lifetime=$r0_key_lifetime" "$N" append bss_conf "pmk_r1_push=$pmk_r1_push" "$N" -@@ -863,13 +927,17 @@ hostapd_set_bss_options() { +@@ -856,13 +927,17 @@ hostapd_set_bss_options() { } [ -n "$vlan_possible" -a -n "$dynamic_vlan" ] && { @@ -491,7 +535,7 @@ index aa72e09eba..4591958b6f 100644 [ -n "$vlan_tagged_interface" ] && \ append bss_conf "vlan_tagged_interface=$vlan_tagged_interface" "$N" [ -n "$vlan_file" ] && { -@@ -882,6 +950,7 @@ hostapd_set_bss_options() { +@@ -875,6 +950,7 @@ hostapd_set_bss_options() { json_get_vars iw_hessid iw_venue_group iw_venue_type iw_network_auth_type json_get_vars iw_roaming_consortium iw_domain_name iw_anqp_3gpp_cell_net iw_nai_realm json_get_vars iw_anqp_elem iw_qos_map_set iw_ipaddr_type_availability iw_gas_address3 @@ -499,7 +543,7 @@ index aa72e09eba..4591958b6f 100644 set_default iw_enabled 0 if [ "$iw_enabled" = "1" ]; then -@@ -910,6 +979,8 @@ hostapd_set_bss_options() { +@@ -903,6 +979,8 @@ hostapd_set_bss_options() { json_for_each_item append_iw_roaming_consortium iw_roaming_consortium json_for_each_item append_iw_anqp_elem iw_anqp_elem json_for_each_item append_iw_nai_realm iw_nai_realm @@ -508,7 +552,7 @@ index aa72e09eba..4591958b6f 100644 iw_domain_name_conf= json_for_each_item append_iw_domain_name iw_domain_name -@@ -924,9 +995,11 @@ hostapd_set_bss_options() { +@@ -917,9 +995,11 @@ hostapd_set_bss_options() { local hs20 disable_dgaf osen anqp_domain_id hs20_deauth_req_timeout \ @@ -522,7 +566,7 @@ index aa72e09eba..4591958b6f 100644 set_default hs20 0 set_default disable_dgaf $hs20 -@@ -945,16 +1018,31 @@ hostapd_set_bss_options() { +@@ -938,16 +1018,31 @@ hostapd_set_bss_options() { [ -n "$hs20_operating_class" ] && append bss_conf "hs20_operating_class=$hs20_operating_class" "$N" [ -n "$hs20_t_c_filename" ] && append bss_conf "hs20_t_c_filename=$hs20_t_c_filename" "$N" [ -n "$hs20_t_c_timestamp" ] && append bss_conf "hs20_t_c_timestamp=$hs20_t_c_timestamp" "$N" @@ -555,7 +599,7 @@ index aa72e09eba..4591958b6f 100644 set_default per_sta_vif 0 if [ "$per_sta_vif" -gt 0 ]; then -@@ -1086,9 +1174,9 @@ wpa_supplicant_set_fixed_freq() { +@@ -1079,9 +1174,9 @@ wpa_supplicant_set_fixed_freq() { VHT*) append network_data "vht=1" "$N$T";; esac case "$htmode" in @@ -568,7 +612,7 @@ index aa72e09eba..4591958b6f 100644 *) append network_data "disable_vht=1" "$N$T";; esac } -@@ -1106,7 +1194,8 @@ wpa_supplicant_add_network() { +@@ -1099,7 +1194,8 @@ wpa_supplicant_add_network() { ssid bssid key \ basic_rate mcast_rate \ ieee80211w ieee80211r \ @@ -578,7 +622,7 @@ index aa72e09eba..4591958b6f 100644 case "$auth_type" in sae|owe|eap192|eap-eap192) -@@ -1119,6 +1208,7 @@ wpa_supplicant_add_network() { +@@ -1112,6 +1208,7 @@ wpa_supplicant_add_network() { set_default ieee80211r 0 set_default multi_ap 0 @@ -586,7 +630,7 @@ index aa72e09eba..4591958b6f 100644 local key_mgmt='NONE' local network_data= -@@ -1150,7 +1240,10 @@ wpa_supplicant_add_network() { +@@ -1143,7 +1240,10 @@ wpa_supplicant_add_network() { scan_ssid="" } @@ -800,51 +844,55 @@ index 37c17c50af..0000000000 - - if (ssid->mesh_basic_rates == NULL) { - /* -diff --git a/package/network/services/hostapd/patches/802-wolfssl-init-RNG-with-ECC-key.patch b/package/network/services/hostapd/patches/001-wolfssl-init-RNG-with-ECC-key.patch -similarity index 76% -rename from package/network/services/hostapd/patches/802-wolfssl-init-RNG-with-ECC-key.patch -rename to package/network/services/hostapd/patches/001-wolfssl-init-RNG-with-ECC-key.patch -index 89d111e991..84fc1c9351 100644 ---- a/package/network/services/hostapd/patches/802-wolfssl-init-RNG-with-ECC-key.patch +diff --git a/package/network/services/hostapd/patches/001-wolfssl-init-RNG-with-ECC-key.patch b/package/network/services/hostapd/patches/001-wolfssl-init-RNG-with-ECC-key.patch +new file mode 100644 +index 0000000000..84fc1c9351 +--- /dev/null +++ b/package/network/services/hostapd/patches/001-wolfssl-init-RNG-with-ECC-key.patch -@@ -14,11 +14,9 @@ Signed-off-by: David Bauer - src/crypto/crypto_wolfssl.c | 4 ++++ - 1 file changed, 4 insertions(+) - --diff --git a/src/crypto/crypto_wolfssl.c b/src/crypto/crypto_wolfssl.c --index 2e4bf8962..ed2528159 100644 - --- a/src/crypto/crypto_wolfssl.c - +++ b/src/crypto/crypto_wolfssl.c --@@ -1303,6 +1303,7 @@ int ecc_projective_add_point(ecc_point *P, ecc_point *Q, ecc_point *R, +@@ -0,0 +1,43 @@ ++From 21ce83b4ae2b9563175fdb4fc4312096cc399cf8 Mon Sep 17 00:00:00 2001 ++From: David Bauer ++Date: Wed, 5 May 2021 00:44:34 +0200 ++Subject: [PATCH] wolfssl: add RNG to EC key ++ ++Since upstream commit 6467de5a8840 ("Randomize z ordinates in ++scalar mult when timing resistant") WolfSSL requires a RNG for ++the EC key when built hardened which is the default. ++ ++Set the RNG for the EC key to fix connections for OWE clients. ++ ++Signed-off-by: David Bauer ++--- ++ src/crypto/crypto_wolfssl.c | 4 ++++ ++ 1 file changed, 4 insertions(+) ++ ++--- a/src/crypto/crypto_wolfssl.c +++++ b/src/crypto/crypto_wolfssl.c +@@ -1303,6 +1303,7 @@ int ecc_projective_add_point(ecc_point * - - struct crypto_ec { - ecc_key key; -@@ -26,7 +24,7 @@ index 2e4bf8962..ed2528159 100644 - mp_int a; - mp_int prime; - mp_int order; --@@ -1357,6 +1358,8 @@ struct crypto_ec * crypto_ec_init(int group) ++ ++ struct crypto_ec { ++ ecc_key key; +++ WC_RNG rng; ++ mp_int a; ++ mp_int prime; ++ mp_int order; +@@ -1357,6 +1358,8 @@ struct crypto_ec * crypto_ec_init(int gr - return NULL; - - if (wc_ecc_init(&e->key) != 0 || -@@ -35,7 +33,7 @@ index 2e4bf8962..ed2528159 100644 - wc_ecc_set_curve(&e->key, 0, curve_id) != 0 || - mp_init(&e->a) != MP_OKAY || - mp_init(&e->prime) != MP_OKAY || --@@ -1388,6 +1391,7 @@ void crypto_ec_deinit(struct crypto_ec* e) ++ return NULL; ++ ++ if (wc_ecc_init(&e->key) != 0 || +++ wc_InitRng(&e->rng) != 0 || +++ wc_ecc_set_rng(&e->key, &e->rng) != 0 || ++ wc_ecc_set_curve(&e->key, 0, curve_id) != 0 || ++ mp_init(&e->a) != MP_OKAY || ++ mp_init(&e->prime) != MP_OKAY || +@@ -1388,6 +1391,7 @@ void crypto_ec_deinit(struct crypto_ec* - mp_clear(&e->order); - mp_clear(&e->prime); - mp_clear(&e->a); -@@ -43,6 +41,3 @@ index 2e4bf8962..ed2528159 100644 - wc_ecc_free(&e->key); - os_free(e); - } ---- --2.31.1 -- ++ mp_clear(&e->order); ++ mp_clear(&e->prime); ++ mp_clear(&e->a); +++ wc_FreeRng(&e->rng); ++ wc_ecc_free(&e->key); ++ os_free(e); ++ } diff --git a/package/network/services/hostapd/patches/002-mesh-fix-channel-init-order-disable-pri-sec-channel-.patch b/package/network/services/hostapd/patches/002-mesh-fix-channel-init-order-disable-pri-sec-channel-.patch deleted file mode 100644 index c7101b1dbc..0000000000 diff --git a/backports/0040-mt76-update-to-latest-HEAD.patch b/backports/0040-mt76-update-to-latest-HEAD.patch index 9304e16c6..1d3132b50 100644 --- a/backports/0040-mt76-update-to-latest-HEAD.patch +++ b/backports/0040-mt76-update-to-latest-HEAD.patch @@ -1,23 +1,24 @@ -From 4cfa1d85c713eba4dda69aca88613de9bf7fea84 Mon Sep 17 00:00:00 2001 +From e01de214b2492e1b8001d6057211017b5f0f6f49 Mon Sep 17 00:00:00 2001 From: John Crispin -Date: Tue, 10 Aug 2021 07:53:35 +0200 -Subject: [PATCH] mt76: update to latest HEAD +Date: Thu, 27 May 2021 13:25:41 +0200 +Subject: [PATCH 04/44] mt76: update to latest HEAD +Signed-off-by: John Crispin --- - package/kernel/mt76/Makefile | 7 ++++--- - 1 file changed, 4 insertions(+), 3 deletions(-) + package/kernel/mt76/Makefile | 11 ++++++----- + 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/package/kernel/mt76/Makefile b/package/kernel/mt76/Makefile -index e4051d8347..431c57a240 100644 +index e9e95fa9b3..431c57a240 100644 --- a/package/kernel/mt76/Makefile +++ b/package/kernel/mt76/Makefile @@ -8,11 +8,12 @@ PKG_LICENSE_FILES:= PKG_SOURCE_URL:=https://github.com/openwrt/mt76 PKG_SOURCE_PROTO:=git --PKG_SOURCE_DATE:=2021-06-06 --PKG_SOURCE_VERSION:=22b690334c0f49b11534cc2e331c9d5e17c4a0bc --PKG_MIRROR_HASH:=ff5e563935919d2e40c1e7254ef3bc06f7ecc5e69f8ddd12903e8f5de942d630 +-PKG_SOURCE_DATE:=2021-04-11 +-PKG_SOURCE_VERSION:=bf45b30d891961dd7c4139dddb58b909ea2c2b5a +-PKG_MIRROR_HASH:=431cecf80dafa986e805f809522721c2bb26289867d6770695d49baf8b471bea +PKG_SOURCE_DATE:=2021-07-15 +PKG_SOURCE_VERSION:=bbebea7d6dc64313132226adc3f7369d36e9359d +PKG_MIRROR_HASH:=17cd74e72c1f6c8742b698bf6772afacc6fba71b233af8c4d59530600cf44d5b @@ -27,6 +28,24 @@ index e4051d8347..431c57a240 100644 PKG_BUILD_PARALLEL:=1 PKG_CONFIG_DEPENDS += \ +@@ -155,7 +156,7 @@ define KernelPackage/mt7615-common + $(KernelPackage/mt76-default) + TITLE:=MediaTek MT7615 wireless driver common code + HIDDEN:=1 +- DEPENDS+=@PCI_SUPPORT +kmod-mt76-core +kmod-mt76-connac ++ DEPENDS+=@PCI_SUPPORT +kmod-mt76-core +kmod-mt76-connac +kmod-hwmon-core + FILES:= $(PKG_BUILD_DIR)/mt7615/mt7615-common.ko + endef + +@@ -213,7 +214,7 @@ endef + define KernelPackage/mt7915e + $(KernelPackage/mt76-default) + TITLE:=MediaTek MT7915e wireless driver +- DEPENDS+=@PCI_SUPPORT +kmod-mt7615-common +@DRIVER_11AX_SUPPORT ++ DEPENDS+=@PCI_SUPPORT +kmod-mt7615-common +kmod-hwmon-core +kmod-thermal +@DRIVER_11AX_SUPPORT + FILES:= $(PKG_BUILD_DIR)/mt7915/mt7915e.ko + AUTOLOAD:=$(call AutoProbe,mt7915e) + endef -- 2.25.1 diff --git a/backports/0041-ar71xx-hacks.patch b/backports/0041-ar71xx-hacks.patch index d0473398e..083df031a 100644 --- a/backports/0041-ar71xx-hacks.patch +++ b/backports/0041-ar71xx-hacks.patch @@ -1,19 +1,20 @@ -From f5b3895aa93406e7d1e10ea20a1e73c9149b16d2 Mon Sep 17 00:00:00 2001 +From d01d8c9e5cf7de98222860011d1d5b362bfde005 Mon Sep 17 00:00:00 2001 From: John Crispin Date: Mon, 12 Jul 2021 13:09:25 +0200 -Subject: [PATCH] ar71xx: hacks +Subject: [PATCH 01/39] ar71xx: hacks Signed-off-by: John Crispin --- package/kernel/linux/modules/crypto.mk | 2 +- + package/kernel/mac80211/ath.mk | 1 + target/linux/ar71xx/files/arch/mips/ath79/mach-rb91x.c | 2 ++ - 2 files changed, 3 insertions(+), 1 deletion(-) + 3 files changed, 4 insertions(+), 1 deletion(-) diff --git a/package/kernel/linux/modules/crypto.mk b/package/kernel/linux/modules/crypto.mk -index b50ed06824..ac6d795e84 100644 +index 19b0d4696b..1b1c1e1a51 100644 --- a/package/kernel/linux/modules/crypto.mk +++ b/package/kernel/linux/modules/crypto.mk -@@ -890,7 +890,7 @@ define KernelPackage/crypto-sha256 +@@ -882,7 +882,7 @@ define KernelPackage/crypto-sha256 CONFIG_CRYPTO_SHA256_SSSE3 FILES:= \ $(LINUX_DIR)/crypto/sha256_generic.ko \ @@ -22,6 +23,18 @@ index b50ed06824..ac6d795e84 100644 AUTOLOAD:=$(call AutoLoad,09,sha256_generic) $(call AddDepends/crypto) endef +diff --git a/package/kernel/mac80211/ath.mk b/package/kernel/mac80211/ath.mk +index ba03ae11a6..ad2860a98e 100644 +--- a/package/kernel/mac80211/ath.mk ++++ b/package/kernel/mac80211/ath.mk +@@ -43,6 +43,7 @@ config-$(call config_package,ath9k) += ATH9K + config-$(call config_package,ath9k-common) += ATH9K_COMMON + config-$(call config_package,owl-loader) += ATH9K_PCI_NO_EEPROM + config-$(CONFIG_TARGET_ath79) += ATH9K_AHB ++config-$(CONFIG_TARGET_ar71xx) += ATH9K_AHB + config-$(CONFIG_TARGET_ipq40xx) += ATH10K_AHB + config-$(CONFIG_PCI) += ATH9K_PCI + config-$(CONFIG_ATH_USER_REGD) += ATH_USER_REGD ATH_REG_DYNAMIC_USER_REG_HINTS diff --git a/target/linux/ar71xx/files/arch/mips/ath79/mach-rb91x.c b/target/linux/ar71xx/files/arch/mips/ath79/mach-rb91x.c index 9620718962..2cdf97efd6 100644 --- a/target/linux/ar71xx/files/arch/mips/ath79/mach-rb91x.c diff --git a/config.yml b/config.yml index a98aa175c..e37fdc3f1 100644 --- a/config.yml +++ b/config.yml @@ -1,6 +1,6 @@ repo: https://github.com/openwrt/openwrt.git branch: openwrt-21.02 -revision: 94efa1c61247830b2e1190933e665eb3adcc66d5 +revision: 6fd65c657351908302b37447675ee352ec927d93 output_dir: ./output patch_folders: diff --git a/patches/0018-ramips-add-tplink-ex228-support.patch b/patches/0018-ramips-add-tplink-ex228-support.patch index 3bb1f56bb..9015988d0 100644 --- a/patches/0018-ramips-add-tplink-ex228-support.patch +++ b/patches/0018-ramips-add-tplink-ex228-support.patch @@ -1,4 +1,4 @@ -From 6eac1e5cb68149653b9e290aee34e3c5d596cecf Mon Sep 17 00:00:00 2001 +From 842b431559c3992e182190b7f96c4407978723c7 Mon Sep 17 00:00:00 2001 From: John Crispin Date: Thu, 27 May 2021 16:48:27 +0200 Subject: [PATCH] ramips: add tplink ex228 support @@ -148,10 +148,10 @@ index 0000000000..9e5cc9ef01 + }; +}; diff --git a/target/linux/ramips/image/mt7621.mk b/target/linux/ramips/image/mt7621.mk -index a3bc14d59d..6e0b9b5f76 100644 +index a8f558326d..1a84abc842 100644 --- a/target/linux/ramips/image/mt7621.mk +++ b/target/linux/ramips/image/mt7621.mk -@@ -1271,6 +1271,16 @@ define Device/tplink_eap235-wall-v1 +@@ -1138,6 +1138,16 @@ define Device/tplink_eap235-wall-v1 endef TARGET_DEVICES += tplink_eap235-wall-v1 @@ -169,11 +169,11 @@ index a3bc14d59d..6e0b9b5f76 100644 $(Device/dsa-migration) $(Device/tplink-safeloader) diff --git a/target/linux/ramips/mt7621/base-files/etc/board.d/02_network b/target/linux/ramips/mt7621/base-files/etc/board.d/02_network -index 4b44669b84..1c4e29dd97 100755 +index 89e679be7c..b6b8b6482d 100755 --- a/target/linux/ramips/mt7621/base-files/etc/board.d/02_network +++ b/target/linux/ramips/mt7621/base-files/etc/board.d/02_network -@@ -25,6 +25,7 @@ ramips_setup_interfaces() - ampedwireless,ally-r1900k|\ +@@ -36,6 +36,7 @@ ramips_setup_interfaces() + ;; gehua,ghl-r-001|\ hiwifi,hc5962|\ + tplink,ex228|\ @@ -181,13 +181,13 @@ index 4b44669b84..1c4e29dd97 100755 xiaomi,mi-router-ac2100|\ xiaomi,redmi-router-ac2100) diff --git a/target/linux/ramips/mt7621/base-files/lib/upgrade/platform.sh b/target/linux/ramips/mt7621/base-files/lib/upgrade/platform.sh -index c2ad4d3ed6..acaa62d171 100755 +index c9152c5cf4..853a464ea5 100755 --- a/target/linux/ramips/mt7621/base-files/lib/upgrade/platform.sh +++ b/target/linux/ramips/mt7621/base-files/lib/upgrade/platform.sh -@@ -73,6 +73,7 @@ platform_do_upgrade() { +@@ -61,6 +61,7 @@ platform_do_upgrade() { + netgear,wac104|\ netgear,wac124|\ netis,wf2881|\ - sercomm,na502|\ + tplink,ex228|\ xiaomi,mi-router-3g|\ xiaomi,mi-router-3-pro|\ diff --git a/patches/0021-ugps-update-to-latest-HEAD.patch b/patches/0021-ugps-update-to-latest-HEAD.patch index 41f73f3e0..45efe095b 100644 --- a/patches/0021-ugps-update-to-latest-HEAD.patch +++ b/patches/0021-ugps-update-to-latest-HEAD.patch @@ -1,7 +1,7 @@ -From 3f95baef14fe74e5f447597b74932af9b184a421 Mon Sep 17 00:00:00 2001 +From efdbdcd3503315022a3270886826656be116345b Mon Sep 17 00:00:00 2001 From: John Crispin Date: Sat, 19 Jun 2021 16:00:43 +0200 -Subject: [PATCH] ugps: update to latest HEAD +Subject: [PATCH 38/38] ugps: update to latest HEAD Signed-off-by: John Crispin --- @@ -9,16 +9,16 @@ Signed-off-by: John Crispin 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/package/utils/ugps/Makefile b/package/utils/ugps/Makefile -index c70a7b7ea6..389138d1dd 100644 +index 4ce64d9631..e9a7f4fa8f 100644 --- a/package/utils/ugps/Makefile +++ b/package/utils/ugps/Makefile -@@ -12,9 +12,9 @@ PKG_RELEASE:=$(AUTORELEASE) +@@ -12,9 +12,9 @@ PKG_RELEASE:=1 PKG_SOURCE_URL=$(PROJECT_GIT)/project/ugps.git PKG_SOURCE_PROTO:=git --PKG_SOURCE_DATE:=2021-06-08 --PKG_SOURCE_VERSION:=5e88403fc0d39ae8a270d2c6c6e9c8a4d5232cf3 --PKG_MIRROR_HASH:=a3dfc2cc6def3b634d8b7cda9139926be3d876cf2faa5251c4821987954442a5 +-PKG_SOURCE_DATE:=2020-08-29 +-PKG_SOURCE_VERSION:=511a5b3c84fa715ef0305cf26c98619c12a4867a +-PKG_MIRROR_HASH:=551d57b4c18da4c4695fa2f7a959c25a03be35d14cf872785e7db740f12366e2 +PKG_SOURCE_DATE:=2021-07-19 +PKG_SOURCE_VERSION:=350b960b6f8b08409dcef719ef1e1e0c8911040f +PKG_MIRROR_HASH:=94d489072f8fccc26f624c3d3c65e7cb40e4b6267df5fb39d4e0e78469006bde diff --git a/patches/0024-ipq40xx-fix-ecw5211-support.patch b/patches/0024-ipq40xx-fix-ecw5211-support.patch index b8f6e4037..a83a3eb2d 100644 --- a/patches/0024-ipq40xx-fix-ecw5211-support.patch +++ b/patches/0024-ipq40xx-fix-ecw5211-support.patch @@ -1,6 +1,6 @@ -From e443437d08651e307662a9e6c0ee050f0c0571f4 Mon Sep 17 00:00:00 2001 +From c82870ef8a2ae4798ede9393254c1e18798e5d01 Mon Sep 17 00:00:00 2001 From: John Crispin -Date: Tue, 10 Aug 2021 07:57:35 +0200 +Date: Tue, 15 Jun 2021 17:03:14 +0200 Subject: [PATCH] ipq40xx: fix ecw5211 support Signed-off-by: John Crispin @@ -9,15 +9,15 @@ Signed-off-by: John Crispin 1 file changed, 1 insertion(+) diff --git a/target/linux/ipq40xx/image/generic.mk b/target/linux/ipq40xx/image/generic.mk -index 358a583f84..a435a127fa 100644 +index 1de17dd15a..487bba77b0 100644 --- a/target/linux/ipq40xx/image/generic.mk +++ b/target/linux/ipq40xx/image/generic.mk -@@ -355,6 +355,7 @@ define Device/edgecore_ecw5211 +@@ -371,6 +371,7 @@ define Device/edgecore_ecw5211 SOC := qcom-ipq4018 BLOCKSIZE := 128k PAGESIZE := 2048 + DEVICE_DTS_CONFIG := config@ap.dk01.1-c2 - DEVICE_PACKAGES := kmod-tpm-i2c-atmel kmod-usb-acm + DEVICE_PACKAGES := kmod-tpm-i2c-atmel kmod-usb-acm uboot-envtools endef TARGET_DEVICES += edgecore_ecw5211 -- diff --git a/patches/0029-ipq4019-add-CIG-wf610d.patch b/patches/0029-ipq4019-add-CIG-wf610d.patch index c8ecd0a2b..a93e9f321 100644 --- a/patches/0029-ipq4019-add-CIG-wf610d.patch +++ b/patches/0029-ipq4019-add-CIG-wf610d.patch @@ -1,26 +1,28 @@ -From 7712b93d2b82b0690ece8362631aee65f3f63a54 Mon Sep 17 00:00:00 2001 +From 859bdaad5959f972babb268eff24901b116703c8 Mon Sep 17 00:00:00 2001 From: John Crispin -Date: Tue, 10 Aug 2021 07:59:05 +0200 +Date: Tue, 13 Apr 2021 16:59:32 +0200 Subject: [PATCH] ipq4019: add CIG wf610d Signed-off-by: John Crispin --- package/firmware/ipq-wifi/Makefile | 4 +- + .../ipq-wifi/board-cig_wf610d.qca4019 | Bin 0 -> 24316 bytes .../ipq40xx/base-files/etc/board.d/01_leds | 3 + .../ipq40xx/base-files/etc/board.d/02_network | 1 + .../etc/hotplug.d/firmware/11-ath10k-caldata | 8 + .../lib/preinit/05_set_iface_mac_ipq40xx.sh | 4 + .../boot/dts/qcom-ipq4029-ap-cig-wf610d.dts | 409 ++++++++++++++++++ target/linux/ipq40xx/image/generic.mk | 14 + - .../901-arm-boot-add-dts-files.patch | 1 + - 8 files changed, 443 insertions(+), 1 deletion(-) + .../901-arm-boot-add-dts-files.patch | 3 +- + 9 files changed, 444 insertions(+), 2 deletions(-) + create mode 100644 package/firmware/ipq-wifi/board-cig_wf610d.qca4019 create mode 100755 target/linux/ipq40xx/files/arch/arm/boot/dts/qcom-ipq4029-ap-cig-wf610d.dts diff --git a/package/firmware/ipq-wifi/Makefile b/package/firmware/ipq-wifi/Makefile -index e3b25bb556..b996ee311f 100644 +index e5f10a1f98..513ad4ea67 100644 --- a/package/firmware/ipq-wifi/Makefile +++ b/package/firmware/ipq-wifi/Makefile -@@ -49,7 +49,8 @@ ALLWIFIBOARDS:= \ +@@ -47,7 +47,8 @@ ALLWIFIBOARDS:= \ nec_wg2600hp3 \ plasmacloud_pa1200 \ plasmacloud_pa2200 \ @@ -30,15 +32,75 @@ index e3b25bb556..b996ee311f 100644 ALLWIFIPACKAGES:=$(foreach BOARD,$(ALLWIFIBOARDS),ipq-wifi-$(BOARD)) -@@ -135,5 +136,6 @@ $(eval $(call generate-ipq-wifi-package,nec_wg2600hp3,NEC Platforms WG2600HP3)) +@@ -131,5 +132,6 @@ $(eval $(call generate-ipq-wifi-package,nec_wg2600hp3,NEC Platforms WG2600HP3)) $(eval $(call generate-ipq-wifi-package,plasmacloud_pa1200,Plasma Cloud PA1200)) $(eval $(call generate-ipq-wifi-package,plasmacloud_pa2200,Plasma Cloud PA2200)) $(eval $(call generate-ipq-wifi-package,qxwlan_e2600ac,Qxwlan E2600AC)) +$(eval $(call generate-ipq-wifi-package,cig_wf610d,CIG WF_610D)) $(foreach PACKAGE,$(ALLWIFIPACKAGES),$(eval $(call BuildPackage,$(PACKAGE)))) +diff --git a/package/firmware/ipq-wifi/board-cig_wf610d.qca4019 b/package/firmware/ipq-wifi/board-cig_wf610d.qca4019 +new file mode 100644 +index 0000000000000000000000000000000000000000..3ba97ff0b9dc46519dc3767cac3931872a8cc5f1 +GIT binary patch +literal 24316 +zcmeHPdr(tX8b9G7>e|8$2_oPngg}Ue0D)?d2mvDUNWoG?0xSYmB)3L+7!X4j?D(J% +z5rJATM$j@SkEV!>i!WkvZS9Qm_s;&&cJ|SoS$AzmyVK6>F7COx+$4}h6CNYN{la;D +z_k8Dk-|wCz_vZY#?Q^4;EGI!JC4J(5j*edC`GGTar?@v34cz-WVAnfn(92JqwP-3NQaB +zjRu_S=+W8uxEs1*RtUgqHxF0=fC0dpQHGlJjK^c+Lje#K74`Ger!)~`1^D$Zr{l@w +z3gwUX=u{u|p8f!3kz}*1Gu4+!f8Qw{a8T$enU2`D93icVXv1UT4fnR;6cAZ)1@%ra1V$^{Ka84%BXyhvqTk +zzUr&_H1j0Ca{c=^2dX>YX$q_MD;YUedN^(`FB^%u1^Y=bex7IC>&Xv%vl9P|eUZR%-~|z$IXOAe@Z8xM +zel4$<61OY$IT79uKHM%qIh;WF7sL(-2xJGa+1V~D?Y$-;eWl8|BaoAmmBD8F!-0PJ +z<>`-;llT>okQWq4=>GfTpMEgc;T_knadUEU`5)}(4o{fL{@Jr9kBPo>_v*zXlnuh` +z5!j`yu6Ynoc<&8U5P2$Fy%AdzS!Ql>mockJWlwhqe*5KYN#hbnZG +z&Zj@5BR;4P-$&|!dLZ6tBAUoge3*!&p=taysTdU_DX0Jy@C6SA$Yyjif3q|KjX;E` +z(FyG(>s6yqB9YN6s%mk5?197+^?c%q_@cgiUuhDW^dt#MN7MP~(kL|QNfZ)`#`0sO +z#7QvE4O0=&FL;ix-Lj9hgXSq{j$-!JVzp}R{W4qKQn)6iVzB4zQz%g=*+76=8a9BL +zre2mPO+$ccPzX>6PzX>6PzX>6EMo-L3f3b2^lgG|NG5%gU=tEgUr7qcDsH_re9t^5 +zZ~YxBE$3K8%Dm07j87pIx`PNjvk(UdSg7uHvKE%=PJ%SQR6X(t09YPYcaJ=pSrR{j +zhXivtuoePKHj72+mJS9B^|qR?am4@uo_ke?F_*+3jfg<`{mmo4;2z-IgT +zv1dp-)LUxV?EE$k5D97E=Ys&WyCF1jGyowh5g-C0m%G&WELkhhfukzQUl! +zS%e5YA6mn3a@qrTAmHw@lgr9ap;^dH-XP%_eU5o!NbQn_s{?J +z_dh>={5Pnx#km)Wq9X{-{^aDpf0}h4b?sSIxhz>2q#xGxs8yIu=!gHG*zLRA5C9F@v`W=Z +z8Gm9(cSd~>%aRFoBie2ZlVu1)^}pA)suZ$BAqzLSGtT7#LpMy7t;(LbsXMP$V(-Z| +z>29jeVihS8p#U1RsrHiwW8+*Nn7FOGpss@BzO5h9eWtF(WHOOXuhw9PQnrS88)o$N{Fw1RQrj+C4bzdyZ1tP0EXJ7 +zJFQi!3!zI|?QwOvN~XK2?ZOl(3BvG+Te?f?8f=%)hcMs;<1w^qkElyj8Svl*^sas)Tdms=LAwHQ7G9!U@0sO8=+C^Ws5+^@PW(m?O_eRRTp)? +z)kscrYu6n(bT;`IuiU42P4eBIy{ERQ0{5+zT^v4iIk7Fg!B;svRH98g^VaWt51#JM +zZjL;{!rU{y>f7Hct`AbID^L&Z>=K^wucc!ReFf(QCr~B5c=Ss7S@B1_3i{4_{qnZ> +z`oR6(1+@b^FN8JtRJ~c$KUDphxH+VDZK+z5aXj)6bJrVNZ}b(nZmwf}z|8x@4OM@p +zhI`aYp}VTQ6x+zIqVI0(%sdfYvf +zF`RM_mq_4NznVoP7g!Q$@yEY>J;XWjE|3$S({bhgLU7_28d+Ohds6=@`S$qS6zATs +p*EQRW;@r;`Im&L)B4E#+u`Qmxxqi_GI7i1Q&iz7vYrc5={{xZF3n~Br + +literal 0 +HcmV?d00001 + diff --git a/target/linux/ipq40xx/base-files/etc/board.d/01_leds b/target/linux/ipq40xx/base-files/etc/board.d/01_leds -index ac11655904..c1d4e693f2 100755 +index 3e0f3ab258..f9674126ba 100755 --- a/target/linux/ipq40xx/base-files/etc/board.d/01_leds +++ b/target/linux/ipq40xx/base-files/etc/board.d/01_leds @@ -30,6 +30,7 @@ edgecore,oap100) @@ -49,7 +111,7 @@ index ac11655904..c1d4e693f2 100755 engenius,eap1300) ucidef_set_led_netdev "lan" "LAN" "blue:lan" "eth0" ucidef_set_led_wlan "wlan2g" "WLAN2G" "blue:wlan2g" "phy0tpt" -@@ -69,6 +70,8 @@ qxwlan,e2600ac-c2) +@@ -61,6 +62,8 @@ qxwlan,e2600ac-c2) ucidef_set_led_wlan "wlan2g" "WLAN0" "green:wlan0" "phy0tpt" ucidef_set_led_wlan "wlan5g" "WLAN1" "green:wlan1" "phy1tpt" ;; @@ -59,10 +121,10 @@ index ac11655904..c1d4e693f2 100755 zyxel,wre6606) ucidef_set_led_wlan "wlan2g" "WLAN2G" "green:wlan2g" "phy0tpt" diff --git a/target/linux/ipq40xx/base-files/etc/board.d/02_network b/target/linux/ipq40xx/base-files/etc/board.d/02_network -index 1d4c78833a..d62a2e5061 100755 +index 8b7364ff33..dcdb790c84 100755 --- a/target/linux/ipq40xx/base-files/etc/board.d/02_network +++ b/target/linux/ipq40xx/base-files/etc/board.d/02_network -@@ -42,6 +42,7 @@ ipq40xx_setup_interfaces() +@@ -41,6 +41,7 @@ ipq40xx_setup_interfaces() ;; asus,map-ac2200|\ cilab,meshpoint-one|\ @@ -71,7 +133,7 @@ index 1d4c78833a..d62a2e5061 100755 edgecore,oap100|\ openmesh,a42|\ diff --git a/target/linux/ipq40xx/base-files/etc/hotplug.d/firmware/11-ath10k-caldata b/target/linux/ipq40xx/base-files/etc/hotplug.d/firmware/11-ath10k-caldata -index b7ee73b12e..3948c08984 100644 +index 6670d310db..5eae9c6e80 100644 --- a/target/linux/ipq40xx/base-files/etc/hotplug.d/firmware/11-ath10k-caldata +++ b/target/linux/ipq40xx/base-files/etc/hotplug.d/firmware/11-ath10k-caldata @@ -93,6 +93,10 @@ case "$FIRMWARE" in @@ -85,7 +147,7 @@ index b7ee73b12e..3948c08984 100644 cellc,rtl30vw |\ compex,wpj419 |\ compex,wpj428 |\ -@@ -202,6 +206,10 @@ case "$FIRMWARE" in +@@ -197,6 +201,10 @@ case "$FIRMWARE" in caldata_extract "ART" 0x5000 0x2f20 ath10k_patch_mac $(mtd_get_mac_binary ORGDATA 0x2c) ;; @@ -527,10 +589,10 @@ index 0000000000..e75e35e8ef + +}; diff --git a/target/linux/ipq40xx/image/generic.mk b/target/linux/ipq40xx/image/generic.mk -index a435a127fa..31f4971c90 100644 +index 4e40b8be50..1de17dd15a 100644 --- a/target/linux/ipq40xx/image/generic.mk +++ b/target/linux/ipq40xx/image/generic.mk -@@ -271,6 +271,20 @@ define Device/cilab_meshpoint-one +@@ -273,6 +273,20 @@ define Device/cilab_meshpoint-one endef TARGET_DEVICES += cilab_meshpoint-one @@ -552,10 +614,19 @@ index a435a127fa..31f4971c90 100644 $(call Device/FitImage) $(call Device/UbiFit) diff --git a/target/linux/ipq40xx/patches-5.4/901-arm-boot-add-dts-files.patch b/target/linux/ipq40xx/patches-5.4/901-arm-boot-add-dts-files.patch -index 6b7c68bf63..49254efd75 100644 +index a3d3341587..aec0d01ed6 100644 --- a/target/linux/ipq40xx/patches-5.4/901-arm-boot-add-dts-files.patch +++ b/target/linux/ipq40xx/patches-5.4/901-arm-boot-add-dts-files.patch -@@ -45,6 +45,7 @@ Signed-off-by: John Crispin +@@ -10,7 +10,7 @@ Signed-off-by: John Crispin + + --- a/arch/arm/boot/dts/Makefile + +++ b/arch/arm/boot/dts/Makefile +-@@ -837,11 +837,58 @@ dtb-$(CONFIG_ARCH_QCOM) += \ ++@@ -837,11 +837,59 @@ dtb-$(CONFIG_ARCH_QCOM) += \ + qcom-apq8074-dragonboard.dtb \ + qcom-apq8084-ifc6540.dtb \ + qcom-apq8084-mtp.dtb \ +@@ -43,6 +43,7 @@ Signed-off-by: John Crispin qcom-ipq4019-ap.dk07.1-c1.dtb \ qcom-ipq4019-ap.dk07.1-c2.dtb \ + qcom-ipq4019-a62.dtb \ diff --git a/patches/0031-ath10k-ct-update-the-driver.patch b/patches/0031-ath10k-ct-update-the-driver.patch index 22eabb2f6..8a5c98903 100644 --- a/patches/0031-ath10k-ct-update-the-driver.patch +++ b/patches/0031-ath10k-ct-update-the-driver.patch @@ -1,30 +1,75 @@ -From 0d42dfd0a71893ba79f9430d20f8cc145283794a Mon Sep 17 00:00:00 2001 +From 644f52a193d0430e41d6c28c221e801a0e87affa Mon Sep 17 00:00:00 2001 From: John Crispin Date: Fri, 23 Apr 2021 16:16:31 +0200 Subject: [PATCH] ath10k-ct: update the driver Signed-off-by: John Crispin --- - package/kernel/ath10k-ct/Makefile | 6 +++--- - 1 file changed, 3 insertions(+), 3 deletions(-) + package/kernel/ath10k-ct/Makefile | 6 +-- + ...64-ath10k-commit-rates-from-mac80211.patch | 37 ------------------- + 2 files changed, 3 insertions(+), 40 deletions(-) + delete mode 100644 package/kernel/ath10k-ct/patches/164-ath10k-commit-rates-from-mac80211.patch diff --git a/package/kernel/ath10k-ct/Makefile b/package/kernel/ath10k-ct/Makefile -index 5681c5c2cd..24e0702e2c 100644 +index a225bd8b19..8c2c36062d 100644 --- a/package/kernel/ath10k-ct/Makefile +++ b/package/kernel/ath10k-ct/Makefile @@ -8,9 +8,9 @@ PKG_LICENSE_FILES:= PKG_SOURCE_URL:=https://github.com/greearb/ath10k-ct.git PKG_SOURCE_PROTO:=git --PKG_SOURCE_DATE:=2021-06-03 --PKG_SOURCE_VERSION:=b44cd7b2e7b0df5995ece18f358d4dfc40834ba1 --PKG_MIRROR_HASH:=59f961ad425eb1a48fa9c391a325cc0f23845daec9d12673445d3077f9756cf0 +-PKG_SOURCE_DATE:=2021-01-11 +-PKG_SOURCE_VERSION:=9fe1df7d4f783b6b0cd1c99d11979e5a6e6fc40b +-PKG_MIRROR_HASH:=4e30e256716611045e930b95eadaa8bfcadd5bdd8bbe3869cfe0f377920e812b +PKG_SOURCE_DATE:=2021-04-23 +PKG_SOURCE_VERSION:=8eca56d1514042b4af34004e0bbf69e40351d499 +PKG_MIRROR_HASH:=4ce22470b0cd15cc3cb04478678407e976c48010baab517fa1ac37685b791d95 # Build the 5.10 ath10k-ct driver version. # Probably this should match as closely as +diff --git a/package/kernel/ath10k-ct/patches/164-ath10k-commit-rates-from-mac80211.patch b/package/kernel/ath10k-ct/patches/164-ath10k-commit-rates-from-mac80211.patch +deleted file mode 100644 +index 842f3ea2a5..0000000000 +--- a/package/kernel/ath10k-ct/patches/164-ath10k-commit-rates-from-mac80211.patch ++++ /dev/null +@@ -1,37 +0,0 @@ +-From: Sven Eckelmann +-Date: Tue, 26 Feb 2019 08:06:35 +0100 +-Subject: ath10k-ct: apply mac80211 rates to ath10k-ct rate state +- +-The rates from mac80211 have to be copied to the state of ath10k-ct or +-otherwise the ath10k_check_apply_special_rates function overwrites +-them again with some default values. This breaks for example the +-mcast_rate set for a wifi-iface. +- +-Signed-off-by: Sven Eckelmann +- +---- a/ath10k-5.10/mac.c +-+++ b/ath10k-5.10/mac.c +-@@ -6774,6 +6774,7 @@ static void ath10k_recalculate_mgmt_rate +- return; +- } +- +-+ arvif->mgt_rate[def->chan->band] = hw_rate_code; +- vdev_param = ar->wmi.vdev_param->mgmt_rate; +- ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param, +- hw_rate_code); +-@@ -7000,6 +7001,7 @@ static void ath10k_bss_info_changed(stru +- "mac vdev %d mcast_rate %x\n", +- arvif->vdev_id, rate); +- +-+ arvif->mcast_rate[band] = rate; +- vdev_param = ar->wmi.vdev_param->mcast_data_rate; +- ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, +- vdev_param, rate); +-@@ -7008,6 +7010,7 @@ static void ath10k_bss_info_changed(stru +- "failed to set mcast rate on vdev %i: %d\n", +- arvif->vdev_id, ret); +- +-+ arvif->bcast_rate[band] = rate; +- vdev_param = ar->wmi.vdev_param->bcast_data_rate; +- ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, +- vdev_param, rate); -- 2.25.1 diff --git a/patches/0032-ipq40xx-add-tplink-ec420-support.patch b/patches/0032-ipq40xx-add-tplink-ec420-support.patch index b63f251ac..6f70a4945 100644 --- a/patches/0032-ipq40xx-add-tplink-ec420-support.patch +++ b/patches/0032-ipq40xx-add-tplink-ec420-support.patch @@ -1,26 +1,30 @@ -From 7b1bf22f745029260fbd0e32311dd997a6970e5b Mon Sep 17 00:00:00 2001 +From 07b09c01d002572c58d37de90d9b69d89a179de8 Mon Sep 17 00:00:00 2001 From: John Crispin -Date: Tue, 10 Aug 2021 08:01:24 +0200 -Subject: [PATCH] ipq40xx: add tplink ec420 support +Date: Fri, 18 Jun 2021 11:07:02 +0200 +Subject: [PATCH 1/7] ipq40xx: add tplink ec420 support Signed-off-by: John Crispin --- package/firmware/ipq-wifi/Makefile | 4 +- + .../ipq-wifi/board-tp-link_ec420-g1.qca4019 | Bin 0 -> 607304 bytes + .../ipq-wifi/board-tp-link_ec420-g1.qca9984 | Bin 0 -> 171916 bytes .../ipq40xx/base-files/etc/board.d/02_network | 3 +- .../etc/hotplug.d/firmware/11-ath10k-caldata | 11 +- .../base-files/lib/upgrade/platform.sh | 3 +- .../dts/qcom-ipq4019-tp-link-ec420-g1.dts | 276 ++++++++++++++++++ target/linux/ipq40xx/image/generic.mk | 15 + .../patches-5.4/998-tp-link-ec420-g1.patch | 12 + - 7 files changed, 316 insertions(+), 8 deletions(-) + 9 files changed, 316 insertions(+), 8 deletions(-) + create mode 100644 package/firmware/ipq-wifi/board-tp-link_ec420-g1.qca4019 + create mode 100644 package/firmware/ipq-wifi/board-tp-link_ec420-g1.qca9984 create mode 100755 target/linux/ipq40xx/files/arch/arm/boot/dts/qcom-ipq4019-tp-link-ec420-g1.dts create mode 100644 target/linux/ipq40xx/patches-5.4/998-tp-link-ec420-g1.patch diff --git a/package/firmware/ipq-wifi/Makefile b/package/firmware/ipq-wifi/Makefile -index b996ee311f..c9d113ae6a 100644 +index 513ad4ea67..87dcf9a769 100644 --- a/package/firmware/ipq-wifi/Makefile +++ b/package/firmware/ipq-wifi/Makefile -@@ -50,7 +50,8 @@ ALLWIFIBOARDS:= \ +@@ -48,7 +48,8 @@ ALLWIFIBOARDS:= \ plasmacloud_pa1200 \ plasmacloud_pa2200 \ qxwlan_e2600ac \ @@ -30,19 +34,1059 @@ index b996ee311f..c9d113ae6a 100644 ALLWIFIPACKAGES:=$(foreach BOARD,$(ALLWIFIBOARDS),ipq-wifi-$(BOARD)) -@@ -137,5 +138,6 @@ $(eval $(call generate-ipq-wifi-package,plasmacloud_pa1200,Plasma Cloud PA1200)) +@@ -133,5 +134,6 @@ $(eval $(call generate-ipq-wifi-package,plasmacloud_pa1200,Plasma Cloud PA1200)) $(eval $(call generate-ipq-wifi-package,plasmacloud_pa2200,Plasma Cloud PA2200)) $(eval $(call generate-ipq-wifi-package,qxwlan_e2600ac,Qxwlan E2600AC)) $(eval $(call generate-ipq-wifi-package,cig_wf610d,CIG WF_610D)) +$(eval $(call generate-ipq-wifi-package,tp-link_ec420-g1,tp-link EC420-G1)) $(foreach PACKAGE,$(ALLWIFIPACKAGES),$(eval $(call BuildPackage,$(PACKAGE)))) +diff --git a/package/firmware/ipq-wifi/board-tp-link_ec420-g1.qca4019 b/package/firmware/ipq-wifi/board-tp-link_ec420-g1.qca4019 +new file mode 100644 +index 0000000000000000000000000000000000000000..58046713c3e25f2332d00550778b897b5524541c +GIT binary patch +literal 607304 +zcmeFa3se+Wx;9)Oh!>1>a}l9w+UD8>T0q5Ci69~YB+8(opfRYZ(261mf=xzaOhnQu +z5o5TuphLXdL)2wrqTp!EWM(D3GPBNFGwb~8b7q}6XTE=B{t0t3NhWK~nfSlEs;j%Y +zsiLcIQgrVPyXviX-=EqIRkfdf>L<&Wr7T;UpO(5ZC1>@rl3b#uriOs9VJ_MdL>$De +z4fQWygW(uOi7~>?t}uQ2bI;jTfF-k>#Wx3x0rb^Nu2c`1Z^tL*^zmQV!}l8CPdZnQLSC|_KV3`LJNZ!6D*Y!`dl +zpy*0f;?Rwr)6KQzC8|_ofdtF`**I#3U?YoVGA>|=2m6sHpu|41iRJyIf7h#p>eTgN +zS=Z0iw=S%VTNknN{?&b5dB+m#!YjJ2ZR}cfOjaMflq)Gn%{*#R%;BtFYMgC_;iW5U(V`JbqPCjQ&jC_tjNW8>PjMR_V>`t-?@sistlxEQ%S8V*7NzW?FJA49>Se8?FU7~t#Y_b)Q555ZQR +zs>OZV+UsyV0@c?ZI(Z#M)Ka1`#K)o_mqmre$I9h0sU#vCEXRFNGA1SlRRpyf>vP7( +zhKfik5-pQ16QxPhM70eE4;?*zvZHgfL1Y@kJ-ZCCRIC(#E*3>dBa{(ELDC>mxHLza +zqs;j{M^q>+R2CLxOS47!(sXIMGX3*((PHUh<>I1LX{tyiHFZLFf!#FqDKpd5D{PKB +zKYSnwmIi+vEQ*vyDkF=QOP7DWT(nZUQn|8do^;;V^F&LeOO#8BsFT3ll1)+2yM2r1 +zZtZd1b!LonGMN9fuv=`O7e{@ba7~KGz~}5^lrTyh2;ix~0gQ#)D^apQ03TokFaj6> +zi~vReBjCjd%u1gniWa|^{-S8LcwzcNQI>cL9f*>xr!U-m#N5)i{`T!hw=tCtE^EV! +zPaz(fc$0vtC +z_Ai_?(8KuYtE&LZ7Z@0z^die1g!5MLuB=+Ku}&#(m-x5s^t` +z`ehR$;@6K9hY2E$h!Fvg3Wzsy;PcQi6Z|>;iZ62l6u*Ip_GAq56A=N2{biRS{mGYK +z5x@K0SL7bqDB|F`2s|AO4Dt1?gcS&a@bUGV@-Bq)5aFIh +zxY+TG)XE*TR!6PQ6&0`Du&JW5O51*>v$ucX^7X;nAKw4P<6nJYe*$A2&%P_y36q;3 +z*FlTKt@KJLxdvL4(@L*`lIx#E>8Qw|C{voL%q*JkvioautM*u7 +z>0u(NI4?anh{2)^YwV;vMnAopXnh$l=yTT=fMbI1TX><6@iM1@=}UlFBS*QphjUQ +zzrKPhKVydPH&po@JLoziBH)_JFTmk8CID^>IZT&_nI}UodVjEKFN}JVuTicI%6DX>o?8~UBPV(kkfeTL)u-MV#}6#Ylqv+BD1Tva+0 +z=+Nw@3!LjpP!N#qguYf=qRtq3&(NW7(r!>^>W8&G>izjE62r+BcBwZ~UD9=hV&w3Lx_8JfMWZgA>rR9gIt{Puw`rEL{I!)~ud;Lh=umsg~vNM=uduXXpP +zh3Rvmo}04&Y~E4DzKE@Xc@GA*pLjtNvvXG2!;Yr%td#iBaQ|EHwCpO(NuL`TeyYFp +zWZFTQdgiK6uk1dZeK@XW_U6yJtBV&V#Lps#p}vE=^Oq}AqM|;$yzgxG5k;MN-J`43 +z9a)ECc872Nq_4grCnHW09(eD)-8=L1rShO)ZO^JV()Ne0pRwZZm93{2ACm0~-FRQO +zdsA_4a;(Vj_Jzi}75VbS(1^CK)o;#k3@;1Jzjf`EcT`8BYeF~Q?%cnvU}ei(VNjrmAUc9`wd&$w5x{%G6PStMBT@oXagmk}MxqU@pa(ZaQiIeMJov)T}6ldSO +zTHm|sMB;()?Or=^@W3$w9)N(eY8wH}z=B7AYi+)&sXQ}1F)l6^enDwN7Bgp#d`_vq +zVAM87bKhxt{S=q2&5v$_rq@q(SsN_yV;4riF$DOMJ6xU5vEF)2Da@}2?z3%xm*RzuA!LLvllPLXqAEaLo^nxrpI?At?5ro_I>ro%c!CGusTo&nk4{Y=6XOrJ( +zpzF&bCXoRobHN3Qxqj#y4Ie(G({1nJyAW_UV2)v6Go$SqEOShUVCk8-M`P*N8?N6t +z-qX~)uHg9_{XHj}tIJn|raXs!J&_3d^@f3=vpo&XKPk@u>3OO^5|@5GkqG+rP@toy +zvAMKB0R`R$t@<^pR4)B`LIIQ*dx9q{4C68IIpcPt#HUiB=ec-&S8w)lMN{~W$L}BP +zFFKjrEU9MGuRk}i<80QE#D-a0KfAFGtqWI&Y-H1~KRK|eWAW<=jp3Ca-Dv4u@M=tL +z*cPl`FZ5Z!zkl|vs3CftWq_8()UWS9T#+sN?A79Qsdwwwzjw+9fI`oq;Fr2+v3Zhe +z@0ha`gANE=NN00`&+zm#>$OmcNx%M|cI(&AgclB&%YSDo&(Q^!x!L&j@#cWU>OpHB +z9LSJLBu2|QpVU-egsDCUd~6_K{d(#S`kwhl+6zrS&q_RxUk`VYV+OX*i=#ffF92}? +zK2T$nFiIQ<;Hkj@jD;JcWB~`qf%{S7Xc)UO0vG{|07d{KfD!OI1V(e;F~8pHCV`g? +z`0t~FKmhP^zP>GfJv^C)hu%md-e^fB;R5rK&*o*uXYz7sL>Sp+)Mo+s(1HQNPa0vg +zq!I9*WfX+r6Ue8Kvl|TkdL&6H0sVS%5Bl}w9_iJ`BdvOfvBo{Jje7Mom;N`vsV5_6 +zLpZ_f5WxEN=*`nuzuvq^XqScg^>)F9GfxBr_^cT-dGuWNL>Q|heZ>6w@xM&4mtVig +zf?wbDU!(NvVMw7bBBnM$fOsd#uO|;!HZg0g`SpR;{Cd83loqwic<9$7(|5ktq5kc +zvu30~VP}z1+2x}=v;*tc(@0qE-MT{()l>X> +zF!(MHLF&LkR!x6GDzg{X5QH^A7Wu&@gUKF>gx{rbm4pkEIKTC~;b9Cgm{O(;-B7U0mY|8yAX*LUkH +zb%ojtZ3bx-XcuS~aOv0oav15?_v&}(R+0tI>R-|2YL!|gmwx>(A7K4@+aCu{xFN!0 +zuzj8h0;4oRQR35WoX49G&|g@0eDT3}b;Qe8&X*ip(h^%etBg&*e&GD-V+)()RkJoe +zx}xsLeLd}fq>@d){!*W&BmcFOy%8HfxU{)F^EJi(u$S5N>j(StURCUxRXQ`T_d@B3 +z`3EK2L~Ggf>p$v!@t~qAtYqf0W4iSxQVvLV&M0KluYc5A)S|4Oy=G=kYtM!gsZG+V +z8HH^6^#k2|PAsU4sT3C;>@Lw}9!ad9UCE|j|9)@N$wiHEJAzl%oXu}VDhsn-!TR;y +z^vS?u^#%k2rcR$RQxqIJYj$K*G|Ts(Ewwd9A2H?Yjj!~!fUR9!oJ^2v8(6Dl@s^!ZNd(IXvtX7rcQy!sdhr{0QJkNEURuO7wU2z{Kmf1?q=`t@;ZLWs=;)|^Jv8_LwaN_b#(Q1#m<;^J +zBjav>nUiVHBwmv(BbMd*8QJx4fou$@kF;&xXYnJ_n+tGQ(@gEk2pgEZZ!ce2pc=Z> +z)6ra0zP2ETOTYf{FG0T^MCjX^x0V+aWDE`Vw1eP%aluk9{rbnBfqwna`#mS1g_jBz +z4gDMnsL28sp^~cdm7tY>qvtee+Lx$O(eqs>fc5KbP9sbKunCceWEgmB%YjAP6G|m3 +zA9mCo%BxYn5}L!NUw^S}OT(hA@oS47u)B>Q6IkQ +z<%1kX38Tb;0G=8gz*x93N)~W%90(94j-FySMgSv#5x@vw1TX?#hXB^E_qtQ=^#dLy +zU;lT3Kw_jT*z678d^Rf*Rt8)AdSyy-axy&WmPv(aLFbZ^662wN0=1xf#{LP?64q=S +z-J5JeLYrkY)pQ=b!OACZGOGfQoo+$xd%+1yyNG?3F070pT8>sFfhrz#r&_a9`rmzxj~yP1wKrM<1do +z)|a??-IuubH(%n54<`{{XZjH{@B0y1FZdIp&`JJmxpAyq{Q9|bl}Z%R +zx&nGaE+;UqAE^^y>}x^yjpVQ161_LH*CPE$XteOfLQU;fK&A5Qgv3y{4^E +zuNZz`e?iv!6VSGhcTSi9n|j7 +ztTKEIooiATm(AtUum8nE(64`TYq(2SuidQ4HGHV=*4Aq_sSCOE>wobW>({gWS-13g +zmw4f(#HGB*ACD}y`x^G?Se4B63nb-l~* +zU7hb4Vj#q(Z1U?#DH(VGo=6(X1%7_gqS$?wb>gFmfB@F7$NKf=1w6r7m|rir +zQ-V9>ECPJijJY`VOuw`J5NdhMuOI&_2YdPTDhq!7wX;_G_2htP{dx&OOh^2BKaOE4 +z6viZmem!uRv*_rke!Yw!KDBO=onLRA%lg%&*CyC+F?yI<>lhn +z&$iUBCn!3<5BWt_5VH641JFOTgA0znCcuo&>eo+)U>d{(H^$PhH(bAQyr-#oUBUA= +z`g=}-9Q|t0l)u_@tgWv4Cm>OO4Xpa=l7ajfb=|7Ac;%A +zo=61!dMMD*)7V^Epnw8zgI4_-Rq7Cjem$YU`t`OaoBP+QJ)s5LI0`?<#p}CzvyUs9 +z!goA=|6qU7$>e59HJg6@xq%&LvyLP-%-Z_djddr}4$7)SHnQp0pB&iKvH10b#_-CI +zZnX5GH-m?5!TR;Wp9g$(_?_eE-AP +z`t|1W-yGO5%VAJi2OV)*b{TGE2ORN{<}4Ft@u +zr|!@1nQzm*(B$*1#Pj&|R{vf`9kP919QAp^H7OngpRk(~+r`y7A8Zy|mO@i%nj+b+)M`3PYBdaPe>ULdsF!u)!>A;SfPjsTxE +zVzbw~}$n~dw=z38fk$OOPA!{-!^f;rkU=fx%l;F +zp?OrF3-s%`yTzVjL*L%L`t>cL?V%4s{}}o=lY;#p?b5IxGzIp-S$g4IGlFHBJx5-- +zY>NlYXNm|AB|hE8c`yPP0gS-2K%l6iQrrIJzx^Jy_4}uTaIN&w(-4U0hi-rW)10S< +zrxj195x0qc_@TozV({r%h^3JCB7l&OhSHz^?z`{)_=i8B2H_3| +zd`Q1OA|m3ilzx2xNQ^<=3aUKhHI|3GrIZh4rhDMJJsZCs>(`U_p!divY|MsODpra= +z7mFgK5z2_7ASrrEmm|$l=6s$bDwGx~3yZR)*`j=Dx-?yx{&~7+v2?L=aZ#!?Riu(q +zeD0GSow^I`CYl$AA;KtT-O)W4_wsd`gcj{dIhqUNZ&p==|UemxYx`t`QX +zF(JTv1KcH>XALr7lrTyh2ncX$aP$eu@VM!%kASlERT@Mr{V^6O2j +z^EO~`bv_%-d3v%fe*N<(pqIABl2#(f*UPZab1)G8{B~ZyUWWDSg@2k^dWiMwv3@@M%=eBHi^6TfNTJYy(z!LMsRR2!HhJ2 +zp5EJ8@l*(Q78#XYKFUKovP1eqzO?*`0iDEaf9={eUiqj@FdrGgj)GQM1-Ph+yJU5a +zSP#7tB~~P`6C;2Tzz8^r0Mf4q-FiyD9t=L!xrJZf-bnN7gQghy@n-${|NZJejr@Ab +zhxqkV|MA~Uetml*&99%~OY`e@l$-eVa82d%z{amfDm}(P3eL#oaD*(W#HfpdbZMOM +zAw?jnz6hfQ>O1!P*ucR0_0%2uJ@bva7n*#Ym5e{Xo^Ad*<15;rX53kfHf`1Y0>?B}Wy{Kzja<-K&~Xb)Gs8+B(uwu3oEN%f+vMJcPP5 +zs5_`BQ7=<38@{7Gq25_mSXQY2Slgv;%+F7Z9R5)Ej;5w8M-`3OERTm0p@l(Ri?&*w +zqs|$=2?eUi0`Kek)HV6bRC5g<>n~`V)$3IesKBSgig;qATVJUw)MjWiNUK1*K)Yc0 +z1M>R_D^&`^9eua9PQ5xm78UsAup*Hd>DBMhtt1Pa)xV<4)he}0!(IJ(fI3?xeR6BK +zS9d_YJbyM>-~o)mp5T=?6L`>krU*s}qr`!L`=j)iuOB$S`q;uIdDX0qkFKaYa$iq7AgN^I*I(+>bmYI5vNvMm2bVUtXTGM` +zANDdEzkaYU?^VUFS*0`cdM}ion14{RO|+JcU;k0>iw6}|VI?z{9n-Bpk#az?b4FoX +z*XlRtH-?u5=HI&Z$~&qf(KVr)AN3ZsD640$nVHktv*AQ)leB6^;qAVT}-98@L+d|HuFeg{p`w1UDd5i80ohTcS5HTVZavbhN80tIe!bAg +ziTgJi0nD$*{Ce{Op5QFZuNT}Y!5wlI0X}QSOddU#?QB1UT3-14`mppckyMR;GWwKaKbO?Aq)s_NR5>dF^V +z$)l}%x71al!}QeT#w~T#TlVaK;ic_$TXt2ayi_u8o(1QA-;cnTnsi7!zZBJ+)DN2q +zf|wRSY1#uR`nfSR?GZ*TIkTG-(torJb +zf(7Vt?Bic55{RK2J#Ecf%L^cJu&2Gby1ckx>ChFF4SXsn@K)P_@}hzzWP#5Tl8B-A +zdrm+LFBL2r`Z*L(lLan9B~|4sRf$mD>E_z<5>=|PK!RoeY#h0NDHpe3;}np|0z`>V +zw}qZ(;H@nO7Hv-`m8^W&QFkb>M)^u;&i$+Vy7G=C)`eGeUEA2T=$NcNc+17MEe(sd +z#;=JgxYxd?Wkq%J#?YmoUTJ=J^)Y3A)V7bV9q4-LEm+gtar;D7)6(sVQqiK1Az!Xq +zxiNU@rHj>_`EAc1h^)GMqp@%9q3GJ+3ZdhI`^S!eT`E@S53W^!T1f&q(8+y$eb9E& +zB>1;H*%$&YAKs8ksaVCv#=vi!e9oL0`5d{t)DNpzv7ZvRdN*t+Sw-pB|KlIujQsc` +zx&mTw?nnOp&rBcU+(!il`1<+%3-Zl`B^7h|zyJN~zfgJI+F_`ijdP!93KTV7E=^2y +zsUTpyu`#^ +z;&U=FN*E;$1n|`00LH?NQL=yoA7BJ90vG{|07d{KfDsrI0nE7{6CRxCfe6^tv>&fA +z^Cg<_%{N}-aIjrloO@+Ta&mG~VysLmOba@fge3Q6Qh{2~J!Ag_X*oD;o>{SMLPP}r +zS#g-;*aJT&9tcpeMvgt&w~NyVxm+TFwN+g7~RcJu@J1LoP=Ear%AzDv8?Tu*3{nW$!{b4}osz +zLkQ0JiZ*Pj()Qo}71ur?-o2c9TlG_Kqo&?JO}%ltsCey$O%;_@+V(S@z5N51uMgh- +z@cu6z|LP0-6BzHNHZQ_?l!ZC>9(6kLU=RX)){MD$_DsL0qKP^8^nb_k+uO^zPqWFn +zpY}&9oqLjV9~wZ75g1HkbMDLB#<{;`jdHv3J`_;L_azx?ID001t|eP-tTREo#{OpJ?Oswh29>!-M*tXf*AwTsrr^cnCW8pk&{rtJiMU@V2pX%-C7O}eZ%I4nmH>C~Yt!z5?E!WnaOKFX0 +zd~VCt!2>_bKAG4utBOtM{*$|!tE+nwUJI+yzu$0SNt?V;{0f`S{Y8CsU+yVcgQ()l +zwR&CV8}fZYWo$b4R|a?X=ber{7_y`D>Yj61ZShSZTiA5&yRU5NTK3kQdhzBn7puE7 +z-;Ajb-h_4Tz4vp1NA8&jIIF;6OXq&DwL%rds&h{WMu7u!?mcsE<56)VV3TvtlRdzf +zWxzWhcbB~)#TMrto>ij|A1f8E1#gRm$MdLv!m~`eI&xuJ!k^@6M7)t}KLCo8v4Ieu +zBZzDwjhHr|I84S*%zKhI@9Sse%@aPkz}Zh)6uXaIFW*ll{PBBl4@sSS;KXm}y!_Z5 +zoOpL5%f+>){kAyq?oP*?d-L+30~Y4oI{+FkB5VZstQj-8^<1{FN9lO)Fz4Rg|21vb +zUptq|g9O@n=-j7em^k;#N?%IJD=Ao8p0l?pWq#`X)Eac#DTDfCb0h!Xv9#{t>z#9u +z*8LRtVG9byJn9aX(z+*HrFAbOd_J{q&x&_%oy>6z7thAP#k;4|sXaUY{f-@)^He?4 +zOx4N=>c`|T8X;C%_txp?*dDEWI9H(NZ;ruWqbM;(*x41PPk#>XIGhXIynE;BwYT(G +zTK7*b-)L)7R~M9LJ-N}-+FS{$_lvl+?r+`!t^2R9-gu*JSM^Kf*-x(Zya|H!MFp8$ +zTK6~afY$xj127g98`~H%7?<4vqu&qr}lLc4GuE0vG{|07d{K;B^RK-o4kI +zay($6BH(Jizfi}?(Jx!Pdw5a}�x6*NGV0+sSiz56D!8wHx^3!n}LC;KG?F0s?&2jJde>O#eg}t0R5Hy!-LL9-J?FDHl!8}Jwx6-k9O_h-4nsV +z!K_gtk-!VEBt&3fpgnQwRCn_3vqSnrz6|+WsAFpP1YwulJpt#M5iEeW>%jeMr?>?^ +zCj_I!2PK>bBY+XW2zW9A6&2;B6z^Uv4l=%<$4=gT1yz2=4Bu}kq;~9}>x_tiYbuuq +z%)2+MaMG4Qn6C}xmXk-jZj7uQK}g^(i~;Z=Q*N6X`!;PhrZn{-GZUNCiLna@KF?4*k9Y5^-u=jN!)|?%E=?;L +zX*KN9uhgY$qqy|$dpkjxeWb(CtS{GPYg0zvF=+G~bvfF(TzdDqF8C7fNVnk){Z3u6 +z_Jxr?!*Ts?-8xMQm)`xkF3`J&Y$x=!+7flf$a{tkeUo;Bnp5vy*NwWQGqmY!YA +zM=lsn>Fc!X)JwVa?$33D-u+0Y;dT8s&C>h`DB7y8*5u?za_Qaob%Wmh$XUZ-eT8Om +z{_K%1!%=;uCNqCFm)`xkZqU0QIb~?lZ_uRYhm5>!IH)fNOT?vj--pIvPr!E{e9*!u +zVU#!!z*B<*7z?-EC|Q)o2N(h3&heI)SEQv#W>0>vb@!%)>2so{<9fv&xKir1#hkCe0N-CsIYyES)7j6@RB{dVQ{6@|&^p%GZ` +z9)Dmk0-l9{vnm|6^zQpxYx7l2<(cV;adENm8zY}1i)lT!15vW|^o5&` +zm|N=Mg1uYMnwfYs6a`uJ9v1jYc_|L$xdvF=}^c4SH +zL~`g6zkb?L#o=7w$tNw6FQa1gzNAHDJWuJ``^ylQKH%^)-bn5No +z+mF)8=h?Kw*~a4A8{e-hm&sggMVsn#%3>Qd*14zdmG7BvnZ3~D^X$a)`1Xvi@v@q1 +zpBG1c0=&e;UE*^xF-jOE4g~Pj-~h(LjZw0I10P@nFaj6>i~vReBY+VY69KGqKPEgl +z5hL*I5a7$p=bP`@_1q;b+2Y&7GwK9*$ty_73)X_y&w`Y^1o|gTD={9v@Fk5xPy2;u +zxnvT#u@bCv??!OFylSj-k9F?N3xsxCm~U@4WVnFP5#Y0C%*C;1`h`ADNBf8Q_Tzui +zU@za^taH!Cx5xVSSl^yq_a5upkN&LVb>GpLjP_uZMq@JC<9?Jzw~0L%0gM1fz;h7r +zG<|#YoE$yL$9#L^J?cHIZ-38xyDngp&$AQHd#rD7^S`P4FZFQ?HctX%z$jsq +zI1uoJslhQc?Dkp&u)aOkxA)q~j|cAc2so?0f%Wapj~>RdMsxZpaeLTeeS5F}6bcXk +zzI=99=Mx|l&$3IHZ|`=lz5rSF)ShmnrD>3`u14geynTUaZba0 +z`*A)2xOvwjz-P^v$*bqGUEecd)QI`^<9}^YYt*-23SF^J-+tBh{X4gBsY_Y0AtNm{ +zwK1KkbH87v?mNah_hxK8VTBow!F)bF+rm2c +zo_&5@JvwJs+MqvU>fC?WUX`8r*^%PJkl5H5_>Gg#nFDW=mdi{11oI|oS7R#V`aDJF +z{&{0aPEJlrgh>?@;TntN@dJ%t8tEE~Z7%TBxxY>%>#1DX^R78u}O}BQKw4D8RcvezKFf +zjqd9k80Z^&OQJ>r#<`{X#N1L{V{Xyhtv#;0&Wv$R23B!uS3AdiI=}9S}k5EUnt5FPoV=R +zCtiYXxx>+hUzjDIC5jfm$Y{eh@BTSdwU}T1D3{lrI6Pp_L%_><{I+=aDJdxmMSNV0 +zEJ~ObdPuK`kByN<3)4!1K=v<6n3e>Eh=}m;FjgyK%+#^VN}w=z%{I!??ef*RCx|p6 +zMnn*@AcByK%`p@FIsS?-a|##yCMN*)#u(%$A_5Nk%PvFulP|v_e)qet$UU-A%m)9j +zA1Mz1dX3`nw4>(ed4B-CcSKm{-km!4DSExqwEAW=kV9#I0{=@=n>k|#*h4I5!kqK$ +zVa~Yn?(GLrm?dnUunCfZbNW1s1kNdHe*&L1V=k^e)1QDo>SRzVov~eY`WdHz`BAs9 +z8EDPnvK`~ylSBsP*jqj$B}YN^IhO1p)lcJ=N)1a76G_E+>3O16;*9hR(Nb}FH~JY} +zzx989zPCcw<(~DiYk2nyta$fZwqV{p^Gs%iFpp^a&QsdryPrm8#JqdHc)2$p=G~j| +z72tv~?vnZRa9ehx#9h_INx{7PiF2-m&{NF27s6S1c74FS`?2}?u3_7oYhgRHym|N6 +zjUkyf=)1FfCc{LxHyQ5b-6zmD?D~t&o9twJhL;|u8_D*JCd~Z!b2d!|fu7wo*Wgm# +zJybg|&_DK;9MZk9w^a9-TPEY4veDdSa_*7sB<((qL9u5w**-6h`s}^{#0B_3jZwlV +zaUg)F1_v+}Zj6!z92^JkM~S0h?8XRS1TX>^0gM1f!0QmeynC-Z<#@nCMSw5agl|5f +zj+3Kbws`l5Hcs*G1#3~f_GlBYU6>Z;-E(pK$7JAR-aW?$7rUKC0Q2tM$-7VD;@#Vy +zU|vCU+G6l;2bh6Lz-9UeD1Pht(P4af_x6K0t|b&)lfmf|Dv%27pI0s{!61oS%u^1CkJ{HR;l3>cZnS=f&8?&XMHkv#U6&q&EpVBWo*diM*H +z8@JR|Z`rf|g|YPR|C;OLBc5N{)DGX;B#6*{*i^ti0QL~zE1h#7Lh$n=cUGI2HS?%D +z#Ch}Pef!NfL}tij0_X=>bezP>Vz;V<{qTXcyWMy%is%j2Y23#%$t1*o4>JDHc~Kvc +zEu|gg-nG1YR3)e0J&$(p+c8pN)~s0;F(f2}V8+0}K*EkVb?S4^S#;5X1371z?2!JD +zFGKzoS{!ybY%q*78)w2bDsZM-CZIWE4wh;59Jzn(6t}?Vd|;ILpoH^a1TX>^0Z&Gt +zqN2QX?b@O|6(JS}&7elAQpCl`<ZhAO{f2VG}GL~tp9Z`9>z=jw0k`qk>PRjTCS4|JzBHDx&}87iRbN=P6^x(#pWcj}6@FO2jVj_Y^p +z)@f4oA8F63>+*9|=}@3Uvzsn(t}8)7K(-V5T5X9sW8^(UhrUU>L7k}|*7m6P=dVZ% +zCtKL1-bi&x*NwWQGqmY!YAM=lsn>Fc!X)JydrYrE8q`T2>F!yoG2A-fcfx^%8P +z5nAXpysqD-S(+aKMO*dNnw6# +zG>h|Rk8~N1>MJ#w`Lm%TU7Cinl`4hdj=o!4r(T^OOSPbYE}b$o={IQ7^Fv17HXPKK +zgC#QD)t?6}vsKb3w}yLl2h_{+XHzY}80-o7?t>3n7$uAn2LgC%Z~$ZBwi_jj()a)n +z_>n{bJw#=Bkm{k_CgzF1bG+r{6=^Aw*^}RE-MwjH`kbiertCkPcT}-2VryXDgMsZQ +zUeLtsoK^O)qp3VAB|bFV|JFM#y9#sC=SGH~>MuQ+c2K6Cx$4s^yH95yj;ooy`Lpio +z;)MzEvj}3S@8ItI<;s+(s1GmiJDYt(Q72ya=xTLG*5R1l;hR6{tFOq(h?9f|-g|HN +z&is6-JSbS(v+9ks{h{k;thjq+>*>XZWV=E)-q-EkRGga}EAqR2p|Ng7zC1BBqOEK7 +zoAVpP%L4OnU3=vn)sg6$(9O3y_irm$nj8~6`Kqq5zMv>w6&iWFukPgXmgJhSlFxo# +z_*QcB>>WYt2hScs{ +zwOezS#7HC|-EUWJUs0Hx9vX4t<3jt?U +zI0Be~W#|w3TPup2$}`gwdts{Fn|mcpm3woqOy35;ynBau_m_e3g!JbT^9kwLXTu)p&*y?3ebOTNGAc&z +zOIk$6^Fe-Tq>eq(vJW^s4IDF_${e_k2LV%*vmiuf*wBN#ryeH5*s=% +zKlbtUoANFML?5L){UHQrd~`kT+81ruRHf~|{VT40LVR58c*Y>9J9+mm)K}+2N#&V` +z!M`0~1||WQ=@%;R-i7FnYgIf?o8YtAKd)R^f)pTpiY?y#Jn}*T^X~1t +zUZV8wQ5np;XG0G2?%7Zw2)h?saRGK9Exlfek|hNA2qSZNrSU{J_4@h)AOy*^N}5MgtmD1f>pUUtMFsJdvucGV`F3v +zaQl(iyd)xmixVF)X6o2wB~X~VW*cScb}{dM%#W`}Ct}{cdwKcp<=wkbU!7iybitm% +zza3x(CIOe}7b@@Gh3Gzus<7U@#iW7*?grUpNF|T9 +z?%h&Xi4M~;OnUbvYg3jjU!Yo7Q-j7TgL-6hcX#>t5R(pp)IGu@sUJ2K1Tifj2n+(0 +z;fXnjZ$E|jU-H;`qfm_2x&Pr$r?TkisLs8N@cGobEoXG@QC-$L_o$E7Z4iX(bnbJ4 +za)=|XQwUDJJ^5wWw$r +zc2&Prp8e!n&zsFv$>}jh@rZwdEzMRAYez%l_Fo!b{OM03wsU5+y#s2tCgy{kvW*RHv>F +z%esE9zI9<`+`5RB_pk2j$~%@=7hchIZDZG>W3u|-Eq8mXTUPFhc_}RW?uET?E~!$K +zMHYQ}rTN{}$CUL^+djH>pzEc#QVvLVd~&X~C2zaDAb9bkfxSly_r|Xa%e{25x--A+ +z`2&$vcW*TI%{>%d8(blDTyX!`5pZ^e4Qho8BDC@K_4Ps9Nt68j{U;kkz=xf+`LfTB +z6eotn#>T*JoP5q4P`8rHOZ^0+Y{ia@XL>=WzLCfDbi?{1{nbnbyQ +z&j?9LiSg8-vlddmK_Nb#+B<8pVZ+9^zfjw7@X*oYCp*jrLEnSL+hw?uZ-0T1(Xb@R +zoHymBQz&CMoo|9s1A7w;FC(w>CZk?WY77v=wbipWLlsFK;Q-cE-3%4hrWHBIofDyn5U<5D%7y*oc +z7b9Tg+o!)MS}k6fzEG4UozM!%kv*Rv5~qlWOd`_{>D>SNk>W4`I`=Um;7b9)2I=3^k<_!NH0*zabnNLE +zDK-u-1LhjjCQ_q(siJ+dhseW4?P`{!x|5TD-{bo6VF6NEc-^ttryY5#a?+@rSL +z%eS}hdUXQkCdhTrB5|u&6d{dJMik{pbCfwnIjuROLTRD0uqa)cu1qgVZ%r31mM&H< +zE-ETsyJ1sBWtF!5OlNQZz~$?Mw?Dl9i^sqE!u|x)%IyTi4R=|<2=G}mURAnz$H}wj +zF6!?L|B}lV@DQEqnqz!>r<%00Fy`A^^X(Uo$+y2Y=neYzk3J71a($>D`Z@~e5hUMU +zN;}9sJMaAtC6r{5bL@k0(6$bfD!O41UyCGo>Y*BO+3(#V`JsAsId50^lTqJGIz!YmBqk{1ylsJ +z8tZe$$2NP|`1YMN-`;GPp4!}_@9B6M?&aIlU9nR-9v34KFr7evkI%CcYEm$_jB2RL +z+_*(^m&vt9wnHR)Mj@Z_oCpk@C6!QXjX#jlMYrqh!W{+rlVuV`EMc +zAWG)WVGARG5WxEOSl=Fh5-Q_2?KUa3^3q$Gpb +zOuUdScuH^Vp8zdD4=p1Aegd?FK9RA$z0l8)`}&9V?I*Iny-CB1Tu?G^519$ +z%*D(iY +zc(&j!oqK5O|FLdwqUqez{U0x#ds^R~-qZczyMGP>-@HQ4hjs4FXGnkx#<)x7)5C4q +zjS_cN6DI}h+)tcyC4`BKD#dfaREM1W0WvT90=g4!2yhg8>3_a2giZ? +zQQ~MAyDg-9){L3_dMgb(f9b!CdiNynJ~SK9s33^Y1PT>+r4q@zC#Hl?p*)t`@Zx#Y9pb!s^S=G&8zM7g +zGJ$mD={PCGGQS;1Zs*;jKBE43jNZLiEGC$d*14zmcIw@`f_E?HJmHky{ew_hSaI0l +zut9S6ab{*oxMmD2Nh~fn*NniDfv3y;Yp1vcKBoes#0Mpu2P1$HzzBFU0?z2&W8S^} +z&(+!H66W1g_oVmCx29fb@_B~hdAxh9caQb%+5RS4`0(wD1sog)7$pv1EZi6+3ph9q +zyb>i2EU?>a5x{!)Snu9zCqEvz*CXJp3I|i}-Y7+8f$3m-RW_x;kTOoDjfz_Y+y~ +z-n{hYp%&)dd+3Sv=3((!Gv?yjGyR^5A?DqW)5QRz+1*CH`z7GBPw#%&nssYZO4g<< +zTfRWGj-hqm5NOo8FGbBH^~0tDY28!W_OP9UwC<-6{|npE!ChMSGQ#Im>((Zk)_qP; +z4soP)3Nc<<_rU-lijHdCPoM6*);%}p-umpi_ZVy4oALF^KG|V52;&g18@rOs&k#$+O7Z7nQG_%?8Br7@ +zMT!|Y(i~;Z=Q*N6X`!;Ph|PzKTj7emM&H_F30V>yWX_v% +z(@B)Eo6a}EsDZr+hL@4od6Q8uyUFMI$-zU%Pj+-Nx6*;wSXh^OCR;RjvDQ7?Cz$qm +z^0gM1fz}pePoO^Gd +z0eJj^LBPv7{6(9pw70(?2-r7)=KUAe`@n1Mhs5M1+TdB^;j|0@=TC +z(jfaMB;OnevS`3>78tNc_zB4;n9m_cN6rL@i0t_Up%sgK!XUI8_h*dz#3>>olgRV~ +z4nFbgM~cG)kw(OTFsTfPQgYzv(=ikLz}^2cCqVHVh-gp7AU_ciaM)jV8PXA#|98Lp +zirga`MI1aA0aEMUw-Qz$2*StLZ_2w6&O@L_{2>Hqd_^1Jk8A(!Uvcdd;@!)sw^cv2 +za)-6<9pndN&b@=c;bOu?fX|vSlUvVa3wMOh^~{qw_k3@K=>L!7wYQgZZ`Qi!;@sc8 +zW7N5aD@M?_?}tqV?2V!ha5+hG?g_%r4^l>jm^E(Gxqo2Ym@}OFN1q20xjxhnT`x#Y +zc$Ut6aBwie79G^NpE}i@oO?>={%@g>tj`%A8yIYy`%V+x-DEiU4oLTM?wz|Q +z#-+^&@Ogeh%?0MxT;BZ_n!B#%++&@4taH!yH_^g}?{6&N;5fi2aR6iC#wc09!ExY~ +zC~;tc-Cm0T*15+z_g*{s@xZ+v0cRCBZ0X#S3LH)4ndym~I``v#4lw6_+)n}SfY1=& +zOZaegKB3|8jQeAYbFWk?Q&N&aa3&sGo`}ISo^EzG2fFq~?z@QO&m(UAw4;i{xxkT6 +zS|nda#pr!Wi^zCB$S;lL&?6pwz~N~S(cWK1a_$k&9yIew?mfl7|I+Rb;R4SL0aE84 +zIPn`gFF$q%C*Iuy;o{oUep{S)cc;6TbC3RESg#;~OPS~?3FFGSmn)UYZ0IKA1STwK +z!eL05h-8ip37<7%E}lKpA7PrEN~I^+j&bfI&>2X4HrufDFp*T8m!2nDCC*6C5G@s# +zccUMRNkAT0|NrBAYh_*TSs&ZWxz9*$+)`J)WzYT>%9}T=C`wtC^I}Fu+CqlT{eh!4 +zbnc%+I`>>bp^#J1&6_vx+i$+{$qboH{P3q!S#+Ef!d23y|ABQ5M>+Se$(9kza{Y)P +z;}2ag>LYEN_gRkj*jx!%(+Ij2te9zzCe-a}Q#Qmohm5zB33aQK(2FJ`eW?`1Z +znGjgq6Vf%7&i&B!p0}E}m#-{P4c+SLXs#(=TaYt!wdYt{UG+~2GKQ{!RbO3Fu;2#> +zkAJC1Ack)Av^8%nFM!0sp7!SI^5TM}Lsw8X@Ts7{TWtr*iwc&I1wKniB8J}YIRP!a +zRIq61=TJaR7PttNRF$t(B|>$ln`_HURH?=S33fs3m8;8m(00v{37mQ0tt|%@ZBHnb +ztbEu}cPOt$`ATTc{j2-B@{T3eg;#W4+t{_}n5;f{%f+@W4U4wMuZb$S*S@D^MRoGV +z(50VVX?}P0F=c(!wvVnI=z8g`lmn6-w@*|xE#0mt6)pN0^5v?P8-tf#x>((r-}d~0 +z$f~WYBkJ_e@5FF?5>@_j2xIV^gV+c-eU~G0`ZR +zAAgbEq=%WAX&SK`P582{G4#@gM8aW)n8F#86~Z*xYhdK%^ZexCp@WAyj9Zvd-f#Sz^o{U#M#IX+t$VlBRi;!|zK~|t +zx#!~C?@71Px%aWsxgVQzUuMC%CtS$6zh!+H5 +zzn_WyP7rsV+Dpaf!MQg#3YH7F{_rP{K#>mcK_*b7gPq4SAkak}-OD)(Qabk!LSp*}Dt+-2k&Y)MK#0MCh2P1$Hzz9rK1k9XyHqQP3eD$Ay +z{KFr94}+t4_=t1=^soQ-KmPKU{{kNu=RPxYek#S||MAD~{^oifKIYt`dpWo*yh`8s +z-7^^`s=dj;oO=^GcJlMtY4Yq|z&n2d+O{w7{eXq7by{2rT{v+*KbzOe0 +zDjf=RXm-;Dh8`v;2*W-7Ic+1mXw;<#j}jFG47E>xO4p#R +zfG+8DZ)o>v%JlE+`qVY~%T#j>AL}n@o7L-85mW(1JQ~Ak-9haR%_>Mdr)^Rfm(7Ka +zbZHvOR;m<+JNj;IoqBbCEGqDehYCRH)^L}uUb|V7Yxocn>ouFyh0x9OfMvEy3aP!i +z1M21Zv&jOFVGQ;Jue_PSgXS|uFiIFD4g}mkH8>i^Zm&h4^X8sQS!YsOBOA}_U+&30 +zmC!PK&;GM{M-}@bwg%=s7}$Q|1x?J(S!L&M?!T1NF}F3c;pX5DUE$l$|1@&%ss7TF +zX$NKMnX5j%vio%Q;kcUFo3(@M`c!X6w}{oPS2p*izbS1HZ~gG{zO&g!6m{ZtkFHjC +zWF3y#9lp8c+PZTotr3mSZMiyl;Ahz<6I*6gX?s?^k+wf{{frfNuWUWN_>gQ@=*Ca( +zYOb#CNq8-+M*n`pg(YqBM)50cU8~=m-xyvNn1AcqEAOa|MAw9FzNoM6%RMD)5LH~c +zR~>$>$>lA{HDM*6{k-t4|C{@XCvq_jWHi8dDdtx%e3@LC}>)aDlK+r)D0dwvJaT;(Zo*@FG +zDEEK2YMk$9)7AN`y5Vhym~#)`CwLYteayLc@S~MR&|LcgP@Ieng!mjmWP{HAv;oCo +zGJay-le~FfKO=9R@W}|saCzp$7&-8Qg?3sSdxqk-#_-!;n>)dBTzO4=QFKnsWO0w*?RaMs_l6|Tb +z=iaPyziRvbo!ht6rL14Jd_h_&x|Nj8Me)T!K05bPIQoTk?m2(~o%>0|Ba-VcBd8zi +zoFVW%T63Vd{?6#!!`E;@$=@7#VKgIl_4YS3+wDUQ!&b{*(dQ%M+t8CGh-?c(Vh-5cb0IbH;x&P$)nU+d&l@06M +z3t?W3&AFdAI``-uY;;J9kBgB>(UJ4k^AM8aK6U^ZexCp`*t;I?3$?Y8w+DfAQjZ8`~HJR?L`N&;)_OGPm$00T>cuYxo7(X +z(?0iKlj0U=tjF48l*U4bPQxhCNQ|||D2;^PAP6BFa8{t48AcjU&#BK)2g +zoJ9(^fCg-M7^@WlUhY&>WQ0V5s#&;j)k*;3j;?%DO`@7PT^oo1?)lXGv%feiL`@7vREaBwie7U6~hUVJ4X +z0s{l>iBqRK&$+jybN{zc$5ieK!l-j^fg$$+oNGql&Sxvd6IN#N7;K$oleIrEAv~<*5j39!k?b8io`S@cj>zPQ6*@J}NN4*U#@?2Yw26m!7!^_CaZt{74;(45VXLasJjvIFCi*#vP$w;eVmwu%# +zT^q%vbKlzug6tz5hGu=aE?b*2@{U2H->A#c&gIg%*L8u;{Ybar4gF4CvG#?LKErYS +zZrwUf3YX6Pxh~MThioVGwb~MO#>jhy4t(ooRbnee}gU&IwFulf-tzK_v=qtg$?vu9-n1}%PSkT#*mUk6b~Ke|rNoDZ``>z}WmjQN +z`rOEHHl6#=x~q#9CdAJoh@rlNyYrVTQ=+2SbnZXttFOq(h?9f|-g|HN&is6-JSdn= +z=l;HK_om|9XjqnDOJzxxWlL^-sS13g)+nkb@>B;^0p^syLhrI`>J7 +zTZm}?B|4T7BA?rnc2ASQzIU}| +zw!)Z2LdqsS_aYq8*Z-Tw+5bX$ +z^M(~gDeFsCWMrgf)S&TFI`=34&nTUHNShWwanr*IVk+X?vl8yXuTU71D9*i4X2@g$ +z$jw$$T%Lq09SUUHH>o<<~G&Qd)c>YFz&&lTM +z^3|%up{qT|+Ulx*Qjjrp4Xpa=l7a=%|9v67`kCBkTi4!Wh*Zz +zP(gvW+76T#6)d3&BqX5%9X*ZBr3DHo@OE=;`5IN~(8Zp%=Bo0Q(AJHf)8H#nrIG~{ +zK$Ed22ypEecZtslbU#XbdLi^Y7q9Q?%|5PZ3g7Yg{e%5QCzG2c)%UON>&iQpSQlQ= +zb!}tUqGPi9;4S9{cAU*RlGre7>t{FCp?9KJhiv@xO7pv`k16Y;wtaN%K-Wuer5up# +zI61JXWAW<=jp3Ca-Dv4u@M=tL*p^Edt2^`Co<9&-b@xVN-`qpdwZRoa#|8I~9Rd4R +z+0b8H%K){GsdL|dxFTDIb?%AxPWb>(KE8fa;Fr2+VLu^m_Lj6aHd37Ve@>q~nQF|; +zxwoxzZ!Z6xsl1!JOt5k86HEbKJ_|uEPe>rG=%^^8<&ZBv-dJC>(Ta|WbjHVq4IAga +zla{wP8w7p(b`zPkbLCQ0pJ%EX|$pv +zLxtoM=BzaL>P&!$$exdm(};Lr>&PL-8u!R1x%6fp{cnIvPsU9hA)q%pQCMW=@nY-Q +zA%J!6-Kld=t|NK!W?XgdJsDU$w(&!N&zdnGo%`_{fqPqaOy}OceX^|G@&BI_CYF-gunK{CKc;~TTansXm$;@l(NJ#g+Ff>uTl59rqD +z3amNz=qs~y9`5~2QxX^FekLNSn?e@hKY6mBzrXLKNj|=?L4hFdJhfM_pOtfOY6TgV +zHM)T7KXYa{)pl?podVci`hWl9FMs(j@CCrdDU>(r+<#}%xz9A|+!N1C=iWrQrR`Ofg`*~+q=H_W-G?nCdHZ%4h*hpgXQn +zmn|<_K5|XpqAgP|Rxjq#xqtXE2(m+gW16b6Wo64ouILYF*Q)2K=W*%WKe`8B;C*sS +z_nKy-x=39#a!J2m_p&BK9nYn6|H*yOxqot7_o}8;ou|%&wvM!vtJkX6>W8&G>izjE +z62n1W{3!e@no%?QmrLIt$q0Jzz0__6r0xq5V +zUk)Rk`(FJH-Ab~+S^X=zT&+^8y9rz7_W|a`O5i{V@q0Mt7nz5>D&*TUwv$0le}uy#z$Aw9l5Wk9gtMA>D*uH +z({$v&ma;cu;|G^Ew`abl*dO*Xo6h}UU*4;VU9(DO=Jj4EJu&~FWSeL$o6h}5y)PbA +zRE3qyTy{*i{sd?u?3_`^rgQ(Ox2Q!~J$uc}oYtNVCsLcFRWl0NbnXYb_ncTz7gH%N +zJlI{L%{-D=Kf97m=l=cPrjv^r<8}nEtT~(Cij)^-y@GY_z3G#I$Lb9T1WcViW2PuL +zbk^+1sA$Ft5N)CxjIn|(o%=KUi<1dfoqIwsI``gip79tl0!#$H|Ni@L$zUSiGgDn> +z2NF-7mJlnSR`~qe({056c^c@tsy(tM%(-_jUtdW4dbYj@e^OIi`xwNt2VM~3*+*M) +z?P;Dpsa?;mgC7fe__3gcAG=TZ#Efq*CwLU_gk0-{DuD)Et>&$o8npt){k=C +z?h8y>_wbf;A)$58WipwRf{&qfPiWlJVX9j9(BFN_J}r6omig@Gi_klg6qJ%CK$g6F +zVvG~(B$?CUCl=tDLhVQCHdPkQ@OP6AO9S*?m?Wsp=J;0+OHZJ +z)HZ@Res<=1F0K2=Ux3#A$j91q(8K1;H6tHE1r=F=L+c(YV6A(r%g80S)oq@%RT!Ux +z0^Mf|tJds`%njW1psDP5dP(dXzNu_l_dN}T6>IiHYzxX9Zah@Gp*VV{?|L?^`&;LV +zs@Lz61pd?FThA` +zC%*QNwDxY=>+fcyc3CreFc4cS%FJi4cG;TI=tFF+=w!XvILizOCAYy6-F;gg?Ieuzd%oNHe)-Kk%XL|+HX*R#b#1&}h +zCW|pjlc7WBVU%bjCW|pjlc7WBxg<*TjDV{nusC6{FxdMi2|p2T +z^E_*AdU3KLSR&z0u)c*RCZgwuJRA_?ENYl0%iS +z#=CdSXWn>J;u+eFaHz$|G8lqK@AF4l9jSE>{G4E51JPRdMBL~dkEGJTK&gdYhV+T4 +zQt7UyFr<*Xp&t$-1UmX|gpPjHJRxZ2D+C2|g~;94ef}zrsNh}4_5|f4a;VxaZYTMu~sKG?^rW9Ys@O|zN@#F9o-qsfIUpR_rVJJ +zbC}4vN@g&__9be2=X~~z`S9*LjVq_WpXv8-q%+Gf{h3+{%vU|rXTIo}>0JKQwC>x9 +zX>@fH$6m^xcqB5dSsPh^`a4DW6OVogenPQ#dP2Hzi}$L8Rl@b&`K`ncS=H=d`7iZ( +zxy7-ScfXn!?>_t26ZGy2fWPfoN5TXj`J9}0ue2NQ{-))1V&mPLN!43cAkQi4IKhAC +z;@ykQ8c8Dg@1Aq#cnFLX_^IjL(|msh@7`>L<^=y4;QNb2B18n*Xs!Dxp1%Y}SDk7s +zMRPf-CW|^nUy1JfO8m0@>ih<6{$Rj=Quc_Wc|&qr+t^rJ=Yj4J}*1I1Xy{xNL=PH*!xjU-W +z)v9+ZD}LZ03YHdi>cJP>fEtU^lh37 +z)i&j7F1`Da2cUO9Hmq;gR6@HeM+fyEXlhkTrGiWEe)Ith354Xex_2}sstuzb>$`Lf +zPw#(GL9uU4^CqhNRP-)ErSO^&EQl_aB1ZJf?wDr3dJBl*w`;0Z +z*~;ZydiS3_0KNMsH%D7^<(l2C +zdOjFA2TJ^Aic7f;0?k8*t|eWLsSl{Us()RZb|JEM$ssnq`>R7oucbCEuMemg8r-kj +zc=6?b2sq59cdr@T(ILMWT@7vv$a7tX^y@yTjzII?odrbY(%7umfgH<0SpO30t +zT*Rh#|LCr|f2%g~9lsL&#}!@c8l;upZ?Ngz_vni|(k@6Ugav&AD{;X6}F_D4Jr5DeYvN&RdFh`+-DcoyLX+}1)iyE +zATV7O4r_Y%gY^Y+F9+AVpU8=)Y4`JHj1xbx51MxW!i@Fd8Y>phawZTk((R3oMXP*C +zA2VIfVi>M=ih1`^$xLzBpT|!FIR1JEy?fx>M*xea8>mBJ@C6oOz=BCe@o0Xxtd0m9 +zADCj2JMS(qaOaU*8u0e9&b{MbWwsGwz5C}`@1B!Ik9qfvmz&!-nw(|v&X;q +zGAny~-mZeZMH=22Xa?!^oK0cgy%|k;(i7Vm?zYz;cA8lSVS7`YH8Ag`u5od?4ZT3m9-e=L!2|FpgBKx{8oVi{!P9i&`F9w!N_bMS*x*eu4Uca+ +z_&NT<#=LvSzee^MA<4UU-;45^dmp>G3+BBKb`^~7?GD&<(&%>V6=&t`D$;b``UO`U +z8DU>uy|wne#P-y?r?;$_@ylS*%mmuEJ%g?}d-1I5-Lp+QnlLBGV4DI?do~F0*)!&& +zcW)Z)%ZW4Nn_8JoZ)$q?GO?z|9W@o$GjiF7Cu*NGWLG&+0ZX>#hAed +z&WR9c2oTw1FTS{Np-mN73QJkiW+SQe{B;Hy#(V@%dT%r|sERZ5lb+nr*4OOK-;}v# +zq+ffwp{)3)nX5(yz$-7#$z1t2u%X+sNc3(0jgt)riZ|ycKN--Tswv9P%2bT>5ykQ| +zGv!d>Y(o{Kt)nVLE<@jT->9w0%U_!r4OLInyqTW{#d@?2P<4|$YUGCYQcY=ojy%p# +zA<}$&R?h6dor`<0atX+62Ska_upPb3qs{|wZ&by-=9hH6y}W+)-tZkuH{I($(vp5U +zs?5KjWngE^n$wbUpTfIs#kHFbgl_grzT0*9)Vd;>G9c^ozMA*9o{lXKdh?Tks+P@X +zW2yr8KWZm}@Z4-}W|E7ku$y<}P)e^}R(O&fE}N{i%$@mO5;D_fZCe?Eo;TB*+iA_k=jkQh)HKo(45TLqmy% +zpjAVA(@A5SCmZj+iy~K>@$TajDH}36^o`%}B#wP~_hAXNeeeuidYXKA?9W?SKF?6d +zMbXUU-3Jp(yM6K_iNx^qkHp%YY2N+B|1jn$Y_FH8ra9nSOgtn$7Zam|QQ|-VFAWZ0 +z%#txmW^mvWi~vReBY+XW2w(&-0+S+udH0jTgEKJ#&kg~etOaM?NwCJdhbPtWj9MJH +zL=+k-p&ovN=QwFnFminUq(eNM7dcW|2$&=o@LLQH#KiawAyOcPAQ^P+|LLKu4uKASs1P9u5O1Ww=b?iF(o;QTU!{7=eg%Pu +z$>1drBF{PxNiXC-`RZ%*o8Np*#)MADGAh_RfFy +zynE9QniF^q$Gdj|Oz{+E838_f#F9)_%C?Rmk-_; +zCC5OC&nR#ii~vReBk;T;;4B*V#5cv#MzZ21#F^uHZ0m%LYi}S_n{n;w`?X=49Q$(Z +z>7h6y`~BI@jn8uvCd;1k$uSN;ncoan*`V2yjMaqq&*A5Y!I5%7HB#g`Td +zeS8-$2?z?FaBueGkN!+!!OD|qEcu;{b)^L({ngni;o)KM3#uEE(2x*mNG^zz@#WRB +zv^$eYm}@_iXyUe>2Lz1L_D08I)O=r?GhNPN7_N3|jcadw<}Jpa1Y-c7Yk0QnK!SvB +zgL4kf4}`ewe;r#waOop}LmvUGnr@Ko3|jyJ6eyD+eSWvBjtq}Xalu?6a(5TZ-vzOk +z7jjDjPX4krVMn|K@xZa4FEI}SiL1T-9eKW_#=QV*+}n$D|7^JST@33XjNSxeq<5KR +zv@xucFuKMJ#>~#mn&r$OM`AdTH5`I#&m689h|eN}ah=-QnHS3T46|$S9G@^@H=D+@ +z$Y>`o0<}iXI_ICkXU~`~*S?#aGxdV!@~M?Vy~MeEv#Ctugt`P&16)26JT`x-Tzlvb +z{_s&pm?!*6V;-q=K2vLNZ--*k5n2GBc_h*?*FG+KPf2mip2LM@dt-|CzLH?lxVPlm +zpAWLowI{ju3|;$$gswf8$z)RMZj{oscbh3)d+6`JWuH^jwVy|G-lwB$Z#fq0=kpQW +zFDKXDLf0N1>w$po9EKru$0}FDG!pn+1Y!n)WX}wylKi|yVEjrteyPcH?MJR_&(`b% +zHGBEUO>I+6N&fcCR4!fn$3F*Mdk~^;sM!M=_Nzt)wT(5!`PrH4xpeIxe*wDoBOhze +zK@XcjFaIN`pdu@9=-NXCtZQ#|K{>h=3%xxzJ{Lb)_m>`tHcSl9kJ +zSO`3aXr^n=vb$!|v}gCAn@M%;d+YMz{J(fRJ3)+f?Rj1jyB3?AYyUsv|MEv}UHe6_ +z9crro{rBH~LzT7bfT3|VU3=o0GHs5>uqQ@FjfxE$zFd3q>5SQdzTX=*I+rJyeYy7C +z#_@Dnb=!?)+t^+97EEP{8&`u3(~ccU{>?VnC2Pjs7NZuQ=O)LFpEz^AnR#sQ25V;? +zTj3VIy_I<+p`rleJWd=QV`v7KSi3XLwP*PkW0u7BdYNjP{ogU-9{5}vj1oqP0|C4= +zIDj!r#weM=!Es_UN*wLrWQ+ht03(1AzzARjTn+)uwRgEo?(!2hQtXY6gFxcq+3^y+DjeHfux4}pjqz2lKo8W>1?mjTl*L;A#2sdQIU7*a&L +zp&t$-1e*D7gl0aijZgCOeccVbd~(y#LH+J5mK6vZSz0V&1;!E2zkZC*3Nj-<)+B+$>cv`cB0G~Z$zFhlRnu1-s +zohsMfu7fgb9CPh0xc2d@qALr_iVF`NeTCrKCo**HH~eZcu06cHbX2ZA&$mO1jQaA= +zBiH^O=GybT&XX6zTzeBfHgDnL3MTNlJqJXId$7+>4(8fFKiA3;MvA%ij&K#8-55+< +z`M>`4yKyG3J{Sh^TypKh$gimlBDphrj;`w|8!$TbZQHQX +zX)@R)qhnvLeftgCI;^_Q*Jx{DcRLLe)ayIgU3!{!B-k^$c+UpAV6^i_?*h}c+7_SZ +zCZ)%YpJ_6DGz@Z`sd!!u2T_K3BMx%OkK +z-^Ah}(HCd37^5^9I&>aJiAG|w7^5^9I&_``qC^i3#~1;O07d{KfDyn5xHDu6{tcX=)C8C@?m%4@?GLO&l>SM0GCD(p6C)Yl1i<_HwVs3RKsj}|d32!J0Kp)+c +zdSfB9#t5D{qe^YcSQpv}hfm%!+%Q;nsZ6_Z7sqOU~veIrcrX%FwYn;n0YGKnVHn24WD1IY|jBVSn-f7FB03iOQOUE1Wv;UU<5D%&VsJn2`rm*5yWjm5CM%bPhk_Cb5b%HeumAYhZ@&2hq;cumD-?-wWKs0=>7V~J^IG?8 +zy7uJW0)24c-3GRG!@{+v3DqX9eN(ehdt#Wr8RX^ImupWC<=L>`ow+wY&rPTgU@(s) +zBGfvt`;l0?GtITn$}56R!+T$v-(i@}*j_Kpv?oKOmvxouT;=j7cSp6lTJ>(FeDt>N +ziu#B$T^>F?KRZ4jv@hvRF_ambaRA|ywsCOu1#|HHmHHTF>O1b`)u2ZE_Zjnci +z{!DjCU7}2tONa{h9>AAmk;PQ%Ty^f)C;B!`g=(8}wf+;$6;)YAnmhq2G^r2L6-FLJ +z%Fx)bzFkuZ?XDah)PJC +z$NDZ^161Ck|5VeWs?5lU3K+ekdygDaFfpY252IuVrrM#upsUanz>svhlbR!HrT$}G +zhpHqaMZSFOQ+=1FM)jI}DOEuhLCoQj?wDr3dJAN>YpPY*%H=SS7IlSklUz1-Ti>cF +zQ*F%%BPx9MKn5t?9Bt8+Yj&&C#_m97xq6psBMkE@V3{lzLvEX{O7&{S60*W$n1e0m +zk~b50(tMT(MhT2gecK;>2a>)Nynk+n+>9ler%LUv^7 +zo(1XmyZ4=YMIHLqV&&DLqt{ZKme&VV3=QtrZM^vMKLi}U(3yKa{+L9yXv^n)2QMYp +zg_kVZtr^_WA-@=0>#eHq+ufFMN?hT+=T7gDE6MN5%Di_x>@RLgstY~nzq@u|M|({D +z(#nN}{ex8>B%hC}U0kHmZaEo$)c3WQHr(yob7}2y$pPP;kM64bw`wEb@hj1PT+y|z +zL0akkMnlWiQ;C)S$^{uW2i|y3{%&xI@9rLbaYxz(NrkYWZ=hVKI4M2irM%TqcK+4c +z=n}u2FFx9MHo9iXey`X12H)yTzZ7;%w7L`if<5`E2UxJ>0tP +zL};04cWYl^OUl`ha_`-jdx~2Xr$WnpcAY!_+S`dL=}zzDq5kr=E$5=D{P(%+!od^A +z2si-((^cMpy+D((;4xTVAon7_eXy%wG$MDvrjtguW3MmC*gd_yWTTuJpczGcv-f+TKxH(t +z#;kJfyKmg+?*apKiRpl~we=GAEHc`!UF){IP{d%mY|ohX1$B@HTD4k^b@dD~IG3pH +z8GQDP`Ec#8_FcPr6;{O6tNs04zV-uHzVMalI$d`+mp@aNSKFp*{{X(Q{n|B!g3G^h +z<;wfSvhM6uD7gHo>DueAc64-nKpn3Tf8TV>BbCl)rrLIZR6!lDybmvW1@lOyJ3rU{ +z=yK{mb{a%`D#~9eEZP&jr=&RM&7$JcnBu*!Sa9tVRvNkXDOu?$FtvXzGASNX{ +zJ|XVan3PwETS^JEDOrBtlL_2=$n*V)FWKP|gkD%dcmjcdOt3hFZbMZ1iWMt<`0hJ5 +zg=hf+-a!%_=7^^D1WJO?eYz|9_Sceo9|%U5;f~=Aw81R7_rw^9tVQPBd*m^9uE4{? +zea;*=cQ_C>CGI`lEs_|1j0pzEM3N^G$e~ykvF&`(A|JHK#|QZs0?oCjW7}FoFM!!t +zWkPXl-1`X?cqah$o_AT`+nJdS6)lR|fBzKsU;#PnDMpDE7MzF?zzARjo&f?MUT{P6 +z+=ypX@C(i}=#sUI{Km@s?c1}`<>>!;&HIijLhb4+)&KKL?uPn` +z{rS068d?hPrDojNxc8ApiwGl3DvgXJz2KlAgEyr#Vh@9CFWBG(2L((gjSURUy{GPE +zhfO!MF6i=kj>2T!Q$7h9g_hlqY-@MAY18K3|4erV2;r|PUmYLN*J_liwW_sT-1`Tg +z65RWr=}xPQlqt%T@jiW(X1i*IY6Tbf{^2li@1NY%y`$c#%2H*GU(+Aey{=xRis0hj +zKe`9p`zN<_Z>w`v>8f<->)qOX)ppf(F7Ex~5n@P#x?}1bRf;NQ^tR@l>Mi9)< +z{o@gWdq1eF)fB5zRjH#xP@#ydz`?!$d=$9%AQBES$ix(weR{B?{zlr{a{D>+p+_Ta~Gwzb>*H*JQnz-a623K{*$(!9FrCK +zX}NaNz(&(Q1_ +zpeH}(piMs(xc&2wZ=(P6BT#j*O@e?m?max|hR4-X__}q!0%~PyqKn)kF4c2){CfuOR-4 +z(8ZsBLROas`ODTwQ>YLIao7w6W(ls5pO>U-u*oI +zVKbR*1qC0)yGIJqT=chpyO2Z&;N4HjB*^V^%Ziq~d&_+Gb8g-}F~*5?*tO?x{W!5C +zTZ*aNd}B5z@1FdY0lFA_zxR0dOSD21M$H?;LNd-FGCt{Lgqo^B{B{%Pi_kpb|^i*qtp +z63=IcZp$LkxBWLxHXJD4oS*z;KzpjDC_gJxG15mA%g@Y|Lxr;qRgkuhst~yhecOGb +zwk9usZDur7JyG*!ei{_((KbNUP4cLb8`?`XrTIDXI75X<^YK|Zvw3$GSFnO8ne7ZH +z@tLQimwD8A;O&j7xYzuWuD6%huihKJW9g=Q{YP5TPe+yc7qkrQY*}+!QtnfDx2?E# +z(}B>X|BLwRIXTO<)n#?jg^%Y +zNB+eZ=gy@jY2w|BJpb}HO0(Xic^|aE(_J9=J6Y5XvDLRXRBXKaD1#YT@{%Aw(ENe@ +zhrp%&;1LE7`=^iw6+=TqiH4~C45Gd1q_JUxdH2-4=&eV8CxNI1m%#bEGt@3uKlHT=o>AlL;PcSIz|;RK)f0I7o-!gPgO@-ETKFE4Ua0rvtFO^-e)BaM6Fw2J +zIWGbPuiqVb{iSCRvWKQVm)1R2UyC&ozhAvWuXo&Rp) +z)0-8ZaAGRQgLiLMo4sFKc=tw~ds^?Fj*0IDAi{zL3v3B5ykJk>eX^)i^wktUl|cZ9 +z_3jPJ$0c`|@ubcEc;FL^07d{K;DQJg6wuoA-rim>Q2^M;yEo|FzhuSH?TW&gc*7cBo^x^zPeRK<^%kozs_Ua#X9vKOAe)S8MWA3NF2ST`Msp +z-B^SEfI3YXHr_RML0_iXp<2(Sci-L$diUeaWB;gsQ@uW8DO9c37pqe<0`weu_Z_W- +z-u;!aI(>n9ZN`%Ema!B1y=q0q5-z>__Etjg{=!(bK2M#HAsW9pc1)iSo{&rLzJr*9 +zEr#zt_@ISR!YFYdfR_dbFlNa%qhwYapI`*g?K8EnZ-|cxTr&5=`h&YxCxiqooX4hj +z|DdTlKPe`{*Wcsjd$k8PrY0;8@MqJz|Dv@xdv#>QVuVIIjvdT+H8v(Fh)wVQQAc?} +z>Z7KN8p@D&-){A@h +zZP*x{;JXy--QyPwM!>lcn63(kHNE@J`qB(}b-p4YDm*+4enEjl5*iXB4axOz7!?l8 +zyLYZNjb}3h2=L{#&vdyN82aneMjQhvyH{k*KRNH=_&rZkmS&_>)8i` +zmOUA+dI{o59zDUO_pF-_frvdMB=4T!+EW_&q&7amy?6BayYl$3-hFr&Uk?3L%3_a!v%emx9=hu(esY9sIdVDX^?WR?U3IE4x86O)yT9)%@yqtB^BXjcl4n=IyC;ob +zarle{!}!%^0cSxVFE3|{R2mG^`RiZ5 +z8)s_U6KVhb^}qlAcfb2BcqYC3AOGt={`H%0{s3uMv>zt8$cbF5dmU2f({0i>cJP>fEtU +z^lh37)i&j7F5dmf1K{0{4eQ%AmC)|W(LwzOnp%}o$;rDPeE>rOLc3P?j;2JlVf15t +zm#zUSZ{gzI-+u_adzfm6{(`PTQvgHK=}u~nsFhs2`}+@pcMo&8q&ueBuii5DDGaV! +zm91RP#k>FP0r2jh+#GGum1}mZ)5h-TTQ%kCU8;>-y!+1{W8S^xvYdEs^W6uoFcHLw +zDHx@Rm`qH;C{4r!r(guEA<#T@=vva{nEHUqtNPcqX%`}EmmFf_-CrF#dM&kSd3`{| +z(BOXE#)~iiL%?A+-o0jUM~D1kaILqhzHfJ1!YOfu_Z~LheeJ-G_L%yml?w~|2dh3v +zJ|9)PxQLB+|LCr|f2%g~9lsL&#}!@c8l;upZ?N(1d-TN}X%{3F!h*hma-HI&^oW;| +zjd$NS_*Q57rLbe7{muP{+LIb0szrrty!+O^!j_b?A?4n?FZUF;Do%x#`|QHJduyu+ +z=VJt(F9ghZ_lzAN+BJRiCA(*hcRyHPAou#>?d$}xCGQ@-Ae=8}*Upe)-o2dx#?3n% +z0^d(Ciy`uTZO(K#i($ChsWsmHGSZ@=A|kNoj2JlndXGmDpj#gSESl~`2!$m%as2ta?g&ZVyh~&hoCO704326Ql`Q3H7wn7^yo3 +z=W7khW443HSp&5gi~;V@^&9#d*Eutm7%YKd(J`?x(VQ8aO>t&$HpQ9IX0w4{v5m&r +zg^lgFLUA9dkGGF7KpYSokhMa(!h3~qop@dBx~vuA72mEi_ib?eD+uJ_?qmE*6DA>d!bCphKrMZsY +zJzw7aDqg(%fN$K~(46DmiMho4f@Pg>C_rewCwy@d81eN<1n+(x{IHo!Hc{`M;Iq?V +zs(SYlqmLZCNDxw*SV-h6BZ$^OK(pXiwD?i&f~YnyAKVON+n{@gcpT|N+jaIrT%{4IZm1sj2xdGHS4F- +z2b;#cBc(aki*e#;E_(`5aw0++Z=oB=RQfd<;>(6OYMu}&kU~J{;Q!M@SsemCekka6 +zN(iD9@OkJ!>fL*Q-o2;nSA@q9nPs9u-^Stk;C;I76Cqc +z#(a494m-hV4ovh^B&2!wX;0IHS>mkNtgJMY_%v}6-u*N?wW+%E^X`u>r~X5yLBvDv +zJ|W)7yHCm89Fv}txjjE;U+KQWqx;HYR>Z}{5x0O6Xj8I0>k6%TPxRp1iQFwT??Vah +zJwgHj8Ce`cw@u{U1NR__4pZgcLpS#=xZw7%)Cm?ulLwUH?46~u4MNwzi +zp~Z8sxTvhB&VUl@#Bd@;03(1Aa1sOx3i5L)?!C9Sm*G2lY~PhZ +zHkU4i_f#`(n0s%yy&I-)^CojJ_uhyO=H63KOz}v(kW0_#t~0}Q)k?DRiZq?K?tRI) +zy)bjF{qYz-Gj>p)rHj`Dj@OSJ&~MTuXo9#j@7tO|oPE4$tVW-&OV-4Uzc;4V@6@Gg +zmUC&|>smnbe!O+;r2Z{kw&s=bj2*hhpdSrJ5Yos__rUn)KD0 +zJQb(ry{?rQl5VU)e?Xn43>)tnyPz-A>`<-e(!6hP1x`Qv4l(WzP%MR@5e8URqONA2^pgCi(|+1 +z`QQn;H19izIoM*(aBqO;z~_o%lrTyh2sq%<;20@Rc3A{&pQ(L)Lwro&lDQw&AKbM% +zAtY$wJT}ey2Tj%aNih+={vJ2qt39wWHDP&xKbz+L7p=wFt0N;8BQ(-+>|n;Lu`xkG +zY?}9vI?4-DSA_@qFBtyt;9D6PVyTx8o96vJ-N9YiY0+Uq!L6>!vJDy1DBq=Qn)kPw +zkG`3?K04HAZojUwJTogn?i;|Sc|UmNm}+a9OzJ(iyXEkq?Cmj$0a7;2`)e0U_oS^0 +z4Ga{uUfjEH!^Y?Y-=$dd-eq4Vc;Zfqz;u;3tZCkN)|Y0;tMe5JQI?wb9uA|#fw}ii +zy14PQrjEc&bKv>5H}w%aMNQ1ThtCz*k+<(iJbSjWIQk;)1x`K1fftfIdV*s=|AeeA +z4Y=~l)<{#R5PW3W8Zum^wCz1W+nxx7zCGoW+M +z%}tzo^K{EIQ#l^od#rnJ37_50vF^PIS_j-T#zQh)9&XQOl(?IEesZwx{qu9J9ATu> +z-ED(8VBLF1xR5-@fOYR9!U!!MLLw+4j4-Jr2s}Cs65#vBhysvfC^wxnw#yDj{ +znQEHNZvb%xK2T$nFiIQ<;HAL{>7KJXBhVu>8(Yli!t}!=`Jar5a!-bz6LP& +ze)iuAlp1vJlVK=4bnoL=8M*fx4*g``q2h}2mZq8_UxhkOO +z?v2Wh<;R0deF_{M7d$?81k8B%EIdf!Z|r0StxnFnugi<`|KjcJ1Ther;Wu0w5)vv6 +zkxFv~4x@6#j*N4r=H=yVkxGMMa)15ncjHf=67PUan)m-R{x5%IrV#~$7I?Y~1b>He +zi;x>K)&KtcZ@;0++8Zf0&HGrUMK6nr2qP05&SS#{^X{p;=V8-LvfAVvN#c=+Jo>B^rszVvN#c=+Jo%h!Qhd|>#0{A%*B80-c5RyV5;zsXyB$WmRN-gX%q)$whN_RDdAw{$s`r$A_ +z!0C5OPDChbo)9UJLQpVQh}?bM=kJ2pi%>ts=F|v~yn6xW-6sn%@1ETCvh9F*_qO4M +zOFst)@YyrolDm8V`77-``rD&F=klL}sZME#n0G(>ZwYMW-LK}wyI=T!-Q2trbE_Lk +z7PxOG%(DRa+n&^Xg$PZ~yI0zccYl)_f$7+2cxOtG=}f8CyhTR-I~VU>43jijl8E5H +zd(NHXAuuxF5xV^&yaBh#c<}Dc+M5BszeprPM4-*j&kqrSHXF}h0;8)=HI{N#Ocr&D +zz7pN{mH1`*)%gvYM#)*jJY&FM=BZp~<^)WxQr6QQaI+N;$@*nO$R$zY0}L*M5x@vw +z1fEv}OuTtE-u-`n{qMj3-S2)2lcTu!1n>UG|N4)A{pOoLKpGeCUZF^gqqzJ}pZ@tz +zGtb4xynDk<=rDaVI+=s@?v3bRy?Y9ZDISTxaWl=k&&n&(bl$r6rTHC(>5S-eGJ7&K +zdRbSg&Q&gda(7g#t5xq-%13YOuBeYF)8*l#L;7xwTBVc+5}y?tz8@KdphAJnwDTtZa1_aHJ7k;PQ%Ty^f)C;B!`g=(8} +zwf+;$6;)YAnmhq2G^r2L6-FLJ%Fx)bzFkuZ?XDah)PJC$NDZ^161Ck|5VeWs?5lU3K+ekdygDaFfpY252IuV +zrrM#upsUanz>svhlbR!HrT$}GhpHqaMZSFOQ+=1FM)jI}DOEuhLCoQj?wDr3dJAN> +zYpPY*%H=SS7IlSklUz1-Ti>cFQ*F%%BPx9MKn5t?9Bt8+Yj&&C#_m97xq6psBMkE@ +zV3{lzLvEX{O7&{S60*W$n1e0mk~b50(tMT(MhT2gec +zK;>2a>)Nynk+n+>9ler%LUv^7o(1XmyZ4=YMIHLqV&&DLqt{ZKme&VV3=QtrZM^vM +zKLi}U(3yKa{+L9yXv^n)2QMYpg_kVZtr^_WA-@=0>#eHq+ufFMN?hT+=T7gDE6MN5 +z%Di_x>@RLgstY~nzq@u|M|({D(#nN}{ex8>B%hC}U0kHmZaEo$)c3WQHr(yob7}2y +z$pPP;kM64bw`wEb@hj1PT+y|zL0akkMnlWiQ;C)S$^{uW2i|y3{%&xI@9rLbaYxz( +zNrkYWZ=hVKI4M2irM%TqcK+4c=n}u2FFx9MHo9iXey`X12H)yTzZ7;%w7L`if<5`E2UxJ>0tPL};04cWYl^OUl`ha_`-jdx~2Xr$WnpcAY!_+S`dL +z=}zzDq5kr=E$5=D{P(%+!od^A2si-((^cVsy+D((;4xTVAon6wIKsoj;1?7)B%vW8 +z(vV!_Fe)6Fch7R+aFSCaFoAaey~T9-vRr4noW(F)?G*Fw9amB3S$w*{@z=YFZ{H27 +zlVJ-WEJP?7c=+?XWp!kDWQs}dyt}}_okwnIz}sK8ChUlpARc+v&6k)5fyD9W@46!- +zc<}<@#pgBmK6Y~#%zGc~Dj1E(9kA)7(e2nP&dS?GY(@NnD~^l^51Y;4CH4~fi<8Be +zcdwX=Vcz{zP{VZ`8Uf6^pZxM*-o3s4Tk>!Bs6p>O4XW_ayHAKW^6t0nJNnkX!m^mH +zWqXQavda#~Y|GiSDvr3Nq%`ln{*#@1Uq=oO6hs}Bd(ZQ(c;>kG=_(Quo(IgmCxDWo +zxg2;+mwW%8ls)2T-jLkZHa6DQxnO~b3qyF5*O@HW{`;r6hsp4#^Ds&@5{?lI>k--p +zAC9W!=%}bLNFcokDeX-qEe?!mFCxs~MTAMGlg73*_-Wo> +zM=Nd_%;+pJSc}nVpJ4Xo-oH$b>DItAa3x0TGxG$yx%ZfR&s-0b +zkMD0LVlpuWqcjndi76PRiI_}GaR!to&I+fvHUgM?kGc1*{R+UdcVz_3xc9+kH)iAs +z@zLAK%tX8gj|IptI;*qgn0v37$nSrFHk7mHQrFN!=5cbq0aq>y{5T0Cz={Co-m}6o +z>xtI5_wc0K@U+_CMMx!%lon4uI**Qs2%|lzg!UXKjo|lFqgoarl^Q&UNSpNqXmtQA +z+%H?^i646Qrr7cyJWm3*WwmF1ZY%dbjyL!I<~%nyH0L---xHHs)(M9K +zgyws~mn(sRi2CH*dzsyI@9&cXU>q!T@69h=H>04LYn^*`O#` +z(*T`9>Fs-X7{&I%LFk?hJaPD(1Y!n4N}d_$p7_R#!1$JR^m3)=uQMLJnvZtmy7p|% +zzWhy@@{ya`rkaxc?U|_~{o2zFWyL?uTs1NPUU_j&=1Srj?c<-zBGJeVZ9~nT{7lFk +z)Hc=>=VxcGAL%2CL7E&YoNcJe&&pg!R`?=v85;Rmdk%WooVjM?BdDMvEA&7kMfscL +zQPA9_n$r9nd7Pm_r1|))oH@g$F`k2!i%e$Qj1r$l`Ij-hfcV#$e#!2$g;i_zMdk)> +zdeBsMJiR3L4d2vz{YP5TPe+yc7qkrQY*}+!QtngO(@3Vnpv>XML$w=(ya#cXl +z-5Zr1%Z~?_`V>rmWbWL3kwT{ +z-*9P22&i32rMUu!QM#H9+-IxL$+`FcGyX4sq;%^|y7xf~JlzF?zr%pJbnopw7dG8{ +z*kPazbMMXg_n3P>RdPO)cW%vRkm#)yW#%)g@p+EoeB67}yCQaPCjXY${00zL-~&HK +z38Tb;0A3m#z?datl+57ZII%xU93A6ii~vReBY+XW2w((U4uOfh_<6L=7%zTeA2jv; +zg&FI^(K{YVrGbG`3%d;I6H}$qT}@#~A$LPR97gD}r_e1q5uvDg +zLZmfAdW+qr9I?po8;S!?Fbns)kk$bav1a*~r5Nq9&g +zdvDJ<-~P`2_TzU>CMxjf>+quSt3r_%vyu~?LD(KYWgNBHdm1q`t^S>E771AsDqpFp +z6#zSxQa7_Y?FQC6%m$Y)&j#+Q2v51A)2NN;$Y!EF72-S{9UblM?d|OB;GPTs+$KQq +zw0CfH8f{bMLuJje3uTb?^6kh-)j%CRb?T+`V?KI#cmVq5<>dwFn}r3>hQUG;tIdw? +z8BG{_GmBub$Qm1%0~bbVQcyCdP@D%NfDw502n-Na4uA}0hWY{PuJS9j3_uf227t<+ +zsmxOAJC*%v8Gz$78G!eR6i0b$_DT+>ug3eph*YTDs{ADVp^71@~hwc +z7UlV^vKyB6mC_S#C{lJumGR19WtwshxDA?Nq{1A~t!#i>3e4NCtX1ciND5MulM~nS +zfV=xFRc2mj(1L&ff0+8`AAbMS$jIwZB6Udl)1O{292^h~&hRl3+NY8BuC5L$`+fUT +zQ%K#*mw!{~;Ip+fkEnH#^7E0;NB&2J(GuknCHZuCMES$WW@WUhWt)|Jm832}E#!6P +z)pWvCUTIAy+R%wbv=A1?4Q8{E!ulk2Cujnb&19}&uVF4_FJC+vUz7^o%AheoFQ?0wz&EBz2}_f6%DReAr|(Nx +zt9T%76_p55cuR>I8ZJPC0a$L8FpD4CGazfOD1*|lL +z56D}@rNV9eB|VSjx5PD~T){73<2uBZ!ae+${y}*g1Y##YN@XAcj|UYuq~*nF>2WFKN0246qu>5!FG>=MTHKZfO=5~ZcD?H^Qh%W5kQ +z3;FQuC-CfUAz@J6AdwinHpY~AxMB<$x*nrMN5hzmQ8I=MU5`?uUOxr}&!^}Ie?V%UFPM+%7aeY}myMmc_XE5*9rq;0PH;OxYvv01Gg;aXyD~3+o +z-E_n66jRiC_fS{t#lX{EAC!Hztu3O)uf#q3?!ElZ%}om{eG3{M?f!g~++WN(et#(b +zT8P-|nA?6?Z+2I-lvBaXZM?I;BTC|5;=aG>sqk)08%M${9(uB_EllEF?0!)3a93B% +z75~#7`FUOOmxE5tJL-~B`DELjg-t$HbB})V5#JbG>6z!c=h5J*iwi0|4!Z8V^|YXO +z!wpU~tFW$rZEJ9~=TX;;ClBAgIKP}JoFi!cGW&W&wQr$Ydh^pGef(Py*F4KAdSb6| +zPQ50av#oP5yF0wrr(|wsU0+6bY?E)>Zq(?V$z3*$GXvIXk02YR=B~#NRg4dFDmVWBRk!MXqCRX2nFtFymOWr~r~OYFj>g +zK;KhCf6I>gb)eNlB1~8v6lN?h6yI`Y!Fa2d0jQ1blkA@C?&tE<@u?%yojFBrtNZ|P +za3631pwJ6 +z8yKm2(Xr4+;x2K2K9@0zF^gV4ncvgR4@SEFCHNj=5s +zgVUEk!aD=$P#>i)l}e=RfL*3^NdGetk)$az$KFBdpi`ckBb-0gDbLPs1fYpesvYQ< +zX|HJ?)s~fZ8|==g>ZS7DWi-Qh805nUKo{dbpj-(~qh^3XMmgLcBIFK2{t&ji4aOGG +z4kKKFXWVAgf(95-=w=|D7)ThGV0_Jv2_pb!7-twhb_^K*PcIN=njOq-R+#8~W>q?I +znIr_}<#s4eT&ZI(DRF1E`1W%E;IR-+n?2V(h7(~?7?-P(f&&7uZsuS>EOKyBP)YFm +zT9a<)=qsp1AW8!xBpKJ5&r^b#U +z!9jsjxsfY(^t)sL1_MLn8A3c3;`3c%Oo@Gz2(VhuDg{tUGWO00h-MxLQoKrIK+sKv}jciP+rGpnKItQo(TvU^`mLsPrr +zi~h&P!JC +zSELt{%~~6|miZnlIx?EMij{f=Mg1~}`4BV;p*9152m=Ebz<)sj^XJ2vlz{mmyP3NN#<<3tVfkFNO4aR9M(|aF+&|;q%}T2AI#)C`AaK +z*XP!|P87HP8PNdRZoJ%jT2X`uC)eV1bpXVT{cQlP!Zh4^4j>~uO>p|DY@Wp13{)!4 +z6Heoiw0?@x59ibFj0QessyZU7K7I3oY5Jy<-DJ`Q29uelNe0Meqs^>pH~Ph3Ut42Y +zQEF0j-vfC^d0Fc2HF3j_y4ve1KS*D{a`=8%Tixjo($>eKIoN7xeI0mlzpu6NWYMl9 +zUf;t;c~NQ7j)tA +zhwjVU%F9!C^LWFL9P$Kv<=NqK;+U+xu!pqJk03uG?BueH0V=50^oko8wrYzLA +zrPjujaSnK-mRws~6?)7!+jIA+_RX~mPx$1xrCw|kNFs{;vONUnTDM+^ImyZO+*K{# +za$#wy|6%XF=R0>aMpgPB^~~z*JkYr6qrjuyS$A(0eY{EHf5>Cc&}S)i(dB_heDRs9~?}`TsZkmt}aZ7ZjpiVEYlh4 +zBj(nVBgtOPfYJsAZR*kCR#-L>pEZ6b=1e#;UW)hgjTc +zb8Z)m5=O}g0{GT20*sb=CZMF%A)LSnU<5D%7y*m`M!<#<(C58V)cRQywl1$<2Su%) +zJz;fBw@X;|UnokS6~kEa5d%=0-*5i>&7Z#+{MEmI`R`vM9se}Bk@=th=kH;p@}i?P +z1^7A#idx+IkAD8f`5R|aM{(;Z{yxR4N5{$NM?d2(jI-@rU<5$qB668au>bX__5U{+ +zwU41pv*yWRx#s2@LldUb#1yw4@vI4dGTvBX&p-^O^4`OBV+5uW0mR*BK<<9tS@_@k +zByjhQaq21kRPyRk-I!ZXtaXibhq?7*MGo6pEdu7O85`r%)Ad%{!ErVWbL%0?N=>!b +zA;jw>wfR_<@$yG|F0hbWzYGoCNN)X#yQBH7hp)Ype(M>I$a8{T@Z|y0*{9lXy&kuI +ztfR!y{nk@0F-ht&?YG`X+kZSz`>ls{K$<(j8zViFQk5D%YVv8g^+x^HYZWsAoPHMc +zTTkEUKI@TeVL-EE7MfUXc5T|r*qb>MR$y@-%(?zE0VQ+#iSu9tFaj6>OA)X=zx9?P +zWIVqiZav|>MYXd&Z}sYx4z{6QVQxJ+gznXhq-{_%XP#v0x%Gzb-|^_i>$hI45Y`F` +zcw4-~id%%zglyhc??vJc;Tgd}-UjYc+0Ej!!s3J^9^qgegm6QE_)}pWGT_D(%Y_#O +zMbIEj+$F3Q9OiB0Mu=OA&kIi`B=h3YtH6MZ3|fShf}>Ht;hqHEuv~Fg +zEEH}OL=XmH+)#^dftfHizwfDmUfW;0q~OiH%q>@? +zzbIUk?X%T2w!C568SX)!U9WApa&_m~_~JLyUr)Mu?MPi@0XvhmrR(CxqVWBGTjwrs +zyLzBH{IK6{_l;k*96G=LBxkQ@^2aU0`i+%=hvw~)o=+%PvfnRx?uza!CE^uF0yAFc +zOPf-w;!6B7S?^a}71YF?^w0Jbv`deijX4ys+bi)w%dWGF5Bu$5ZhF#PBzv!B$qBdQ +ztIb*G-~KQpkCpuR(vdTXh4Xj3zOnv_;LOV7FyH0}UGG&dDSjiHmD<>nUbmt&_ycBg +zNzIlI7wqxcGceMXgItvyZxG$eQ*_Vo!t|V)4aicNKAW&fDO& +zyi&UTBVIl?$Af>j^O!8+1p6Rs$Nl!q^Q+22MXarD)rUWfNPqJ^=G(U~7o2^sIPxHC +z-FfMOvulor34H`M{L{f*#|TV&1n6$-{k0c?h!lGKA1%<`)vdq5Ws%xC)ck%=GJSL2ge{`Zv7ZQ!zR{^ +zfH`Z%bPl~S*}8i<_SRu;{j}rON1-7j$*uSP7o?{f^;-`K^)Bdza|Q!`AkILD;hW^v +z8?Z7wUES)*~K2Mde5Qeg_9QpN9R` +zj|qG|qtX1<4|jH*Z7eL>x_)6-b7M_WPU>bJx9>({WtAvr%lhcPn@~EEleGRVGzSZ~ +zp&?+nt*@amzi3NpbYGXsAgu2?%9gr*Jr5e3t2&mNxc+U@08&YyL0w}(QOf#IXmFt@ +zFZF$1L|=PjRZ({8Mp#!@V=dGr@kpXaD5R2D60C5I7dOeA3pn{GnbQhu&(q#{;OgqL +zp@rW29^E?LoLIA{$S>#KjSnubt>lWl(=OlKad~+q=ZHsoQ`^3VxN>g(yo@JZTWgjc +z=j3?q7`k3`adTz(kvB8Hx_RvKrgMvr`R%J|+gZ1wBBa1O>#MGkt8blHkmr^DNqf$v +zgsO$d-pKy4tKiy_QvW=UG;7BNx6d#FlkK;@xh!ophgeP1eou0y`mHyNG61&cx84{M +zmg^01>%&w*HF*zL7YK=1T^NrJ&a4w5fI~>cYQT7OhI)&+_2lTeS2KvVLD8Ifl9|V? +zH$d3XQW^Taj8!-JPmH(*bFK|W38Q2L0eov10Y*!WQPP6LNWx;2jFf}b7y*m`MgSv# +z5x@x890HhIZ*!O2<~yuItcOV}fyBnS`lh(`Y9B5$&}TdD8{6ATeucOh7=c%g0QOt& +z&h%!lX0K)@up`(JOddOtpS*o%T2{7LQh(`cb6ZDe_w76P?mv3^-0~AZv-CDYCCsg# +zp%>PcyJgOru`xb9T|ZMX#N7I6$E|-$!>zye&S-w?p=SirZ@rNx5q1h7M~iB|^-chB +z)~U_j(}U61i~QE>)N2|N6FEGf +z-+KCn{no1i)1teemqo@HEMD%!2Ie4*QJNH#%qbM-!3bakFank$fc@56ikK$9A#T0O +zWj%4ge(Pgnd#T}aFN@6zXFX#vec8U@zKNvwi+FZ?c>J??<_7kL@C}LNd|f0vGCcBG +zBy$COMfi$Da`ukoa@W*dlC>BXX>)Sw8fledQGFRG!6+o=%#%z#w?6NztdqV4jWa;M +z_1c3Aos{NRZ&-Tqu)ke)vUq3u>c<0$>*5Mw27lG?prTb=EKKFU_4Qy+oAg6bsvriv +zs4JFA&V#Q9dRnB#q7*^o;|Gc^@o8ZuG7=R4m#nh#P*a=#YLS+9Ozw49=k%dIn`}6{m#<`0w`IM^gH(gq4bi +z(82xb^nD3y6%VAXq7p$0Zz)kj!v$zC0L!fsX7OWt24u|@Wl&n#^GGJIs6>S*24o!- +zXN0-@wQ7U@0eOqKRJe`5r022xmbgZgEBFO$T!*+)xQ8FpKPYd5K{ +zw7fViJ+5a68dQr8q;KheD3^=NMd^a&2swB*J)Q9GFK)OX0bf7p>5!FG>=MTHKZfO= +z5~ZcD?H^Qh%W5kQ3;FQuC-CfUAz@J6AdwipI7YO1xMBntEj30-3l1X*jFJ&xwA2_S +zEjVz(OayG*Z++Fn%sa8|p%=YQp6c0geOW!bf|++`Fz?o;*0Aa~iaUCXK6VWZRvEO+Hm~kACvx(3jE8{^ywa^?e)VVYS{RZU;Uc +z*xnIU|KZuaW}TY^<9(7(gHYTrT13MVZz*D${Fqy> +z8q4-lW7^RK%&k|WW0coU;W(8U%$X;ddE9!jwE6bE=i1{7dP?)FH!NXpJ?7Ty-x+uW +zrH_fe2BV~piM|G-q>qWdW+tGd-z!_!U~WC;)?;qHt^Y58`){iVU~at~z}$LUz58vq +z-uvkJ0c+yX8)}Pn{%UZmUIhY}TaUT*nsqd*lQ6g5>MjXx(0CCrXU*6c +zpPsHCZ#%5j9&_ub9k)J4!>xa~z$|V(g8^OG>xZfKTkre|x%B{GZoU2;Fg-MMwu=(` +ztuM0Zs?CIDXPfMUMOPVT#t2{pFal;GfVuT%0%af@=GLpmvc1%pb~FKV>(%H?C3T*< +zR7Tri&OFJ?oK<;bL(yWe*xToTSZ{9x%JIuX{$NdZ+)yje}6U=KvG6+%V!Vhd(BjWC6cY) +z!?@p;BY?T}mSgrREKG6h(MKc~EC}GReF+H)e%{ukgD%$tV1UgcB`Ek>lWxI+1@mF> +zfAbAef`X4V=}_BXfUP1WD9p1aU0GTbuxkeTTQ}6ftt`vL`D_#C4~~BRRs05V9flFW +z+(z1V=U{HV;b+q6pvByJ%~i6=WoMi0wC0*)2_t|Jzz9qn +z0+?Grb}TWsUNutfrADly37A{2M#m_xox*V{Gng|^g1Pm&|7&1wJ?7Ty-V*@WoK<;bL(yWe*xToTSZ{9x%C6hg?z3NZao(*vW_d* +zG3*@~fMM_83rcKk +zQwU&gy>(u0Q{4J+A}k8ya#d1rKmgXw91IqrKsbz7N$~nwlg>JSHMmu;0s+je$J~0& +zI-1o9;P6_tXX +zU&6kFQ#fe=%$bK$@Lf#+T&1ZH;9`sY%g&59A%?WvRQ@#0@{{YOkyOAbtJH;rm@}b*Dc_TOa!q4As*5 +zI`HCtUu)yZqFqV6zK4zSqSB-t5m7^f^49Vbsi|vXhXx2qz*~w8&P(g-!Ha>ukDrrIp%goC6-ICD+zgg&yl89ozY!AV?)~y#} +zPI7WRcU8-`Tv%G_f7pBP`OY1UQI-BjJ+nGH4>Yd&DDbFv*4 +zba~(rpZ(`S{MFhbZasp>VHW%c1#@c8`$Ch84`MY5niNTs +z>Ef`m*5I>{L{dQMCCszF-lr+7)e+mN=90W)ffSc07d{KfDyn5*c<}-ymyLPKWoBx@A`FM +zZoSRjXjar=lid2LYO7iE=n}W@M4!-oYU~&iJh|L?Q{}s}-I?C()$G;G +z1a<^Fg2`hi@{_mkOv}m^OX@FOZEox6?7n^H-u*{UpId%Hy|$=XrkY_A=GM=!3yQlF +z8*9#*F`YwiOrEJ&Vs1T+Vl_V~C=mWz5HOzuzs?k(o7CoG&DTkeZcF_QHgwz$dGaU( +z!7U^I$jZFToJASAIg2y1bMhAFWUY)KQW=NSMOi4hG$J=Q7Y*M?etqY^AU8^jUk}nW +z{Cemz!Q~jt%V0Rdy?%({0|!F8Y}vAZ{Qd8Cv7W8~@z$x$e(Y@Z-|5ySQH?nfje$Bh +z$0V`K4Xk${dG3@Abwq8XWX;ilN^{ZzNta(wm}>FseYE-YfF#zFR5i%xb8vvjP87f1 +zf`+TJ+6upZxU=hQV`0(O^$WY28*7SkQaAIseK#5_t3)|l)<^feO)Spu)gakTk87tJZNyP>R4*x`nO4gkT7IW*H}=LvOW|VTqw#* +zeV-T6*WOrFl%2W}*45Qm3w24n2*MyVBt(4)%n__`ofkLBIxd_!t+4hy?VSg%u09)D +z=)LdJt>ev!HH(V;a_-&u;PTo^uE;y>^35HWmsfI*c%(PA?Q4iD=jPALc+$1CX6bQG +zj^~b{>qQqgSB4*XGxMvP$1ZO=xA>UfzM8h3bt@`D3cRzv>MFVV)`@T|tt}Q9`&+|yLc3g1#3?nev{CdroptT?15Wjw=&WamC8uRN7p<ZP+*IRo($J##3ub+1O`eoYu`iFY{>*@S@NNKlf|MjG= +z+0mYjEaumb{fz*vX6W+kIq0kwzaIOq*8*%(6WD*f2HweE=fyQ>&^9hjK1#;xHvbIv +zUvEBEIOo(OFxmY2(frqAe*NgzAN#K-@iD}&Cq9@;?t&p1p6%xg6ILi0y26-WPmZ5^ +zHN$8d6wR3{nR!$x&Kdf>j8!-JPmH(*bFK|W38Q2L0eov10Y*!W +zQPP6LNWx;2jFf}b7y*m`MgSv#5x@x890HhMZ*!O2<~xk}_11X{nBvz%Co|-vH`|&e +zG(S(a&)OukfB+rp!1iHjEErhluLiejCLnjuc;Vqs4z}(R&0_+qO +zr%dg?-s#o&uUGl9w}fBs4(aVE!a(dG`GIg&&t@VO72-Uh?|A4+9{Q0d9m>PKWq#zz +zk~I8!z8x8<8mObEPQ8?V%tsFo4?y3%yu1K?v#?S|Qpgi0&Vf-xQ05`}u2- +zsZ=c5D~KC@tmu$_B-$fbjttJB8hQq0Z55}52l(&y+(%OSu7s6}hqA8X)9L#X)+!!I +zTSX;;6y8#zhK38!U;vg|CCuW-_6*3HE6Sj>vgeUZUQvk(Q4GjBD$WRV`D@h%{R8qA +zaj9?{e@V|{`7LpcC|B?c*tiaHrEm{Frhic027%bgk5U;(z~e#14QY9CT6$d15HzS3 +z9Z28O|4=R$my6N`%Mo($Y!$Lkh +z`w2X|TSypGH%KJ(OJY*S!xfVd!3-EBjFJ%q@U3A47%jEMC}~;a1VjLO2hhX8ys?U& +z*|bztJ*T4P9oLuDvn!Z+cLwurZE6jxextafH~Z!~SxBXKzGCRa-Ay#qI|c4|jFNT=75c +zk)PKUe>v#XyrV8Dl~1%dmeSoc=GV=i}TBw!a0K0FSD;lRQndXr8hr4(#O9Qam}-=q9^tW=hSP$ +zIomo1v%AA?()UUb}Oi~vS}K!E0LLo+0!Noc$6e!XUa&|(Sm>n(;18(2F6=BybT +zC~x2@=&<7fp{*o?@ALizT`PVvYa$@$lp6goP-(IM +zdQEvM5JovLA-A5sL2A8L7{%1!shPyD$NuXzm)PQETWp{K&$wiTC>d|8`Dd{Idh@Zu +zIj0^0=h-fE-IyM)&+~cXP1-`5S{!XP4V{BMAf728bsXLLaBpu9-?(#91?T3%G(Pvq +z34SCSKKaoe{sK}QELu?;AfOrm8OjVbSNtxGXAVGtDY7n@R^jpfr!@|03n*BcG4_j|!tD$|XwjDeZ{zhmp<7Xcdl|m3)2c$=#y_5lvKGscJkIs|j +zZ*&fXkt!P<$@0Tph8>3ul>aU)|C(0$?|Gs4r0PY-LLZ5{#QphP#w^Axdii92 +zPd7gp>H3%8pD+Rt_AjN9+78<@lngk(h|;bjxWlD$i +zKNAs2nlf|j9h43_<+(Wm@K2rc?CeGWn)syJfsUE>n)Xp`S!uVy?u@ElD(_uJGmM8p +zK8yf#G5!O}mEbgL1{h?N!~G#b?jYn3VY}O4Yys^s0&tsgn^6lIU__ytfplUZVO)ao +zH9IDZ0Gwf*VfffFV6<9(J#3{}!Q6Z%3X>3+m)oIeBI_$TZHiwX2m?9iZJkm83dHQZ +zbxIr}pxJ&bjRk{O@*}{NSS13c`1QA8(B;=#qBG^c-jcEmwZj;%p3+Yxw;t7v`Sq4O +z?ds*l{CYh|uwuF+V9uH`okwp>p6)mpYd_}K(>)flG=Q%`8r9R%sR=@9!Pkz +z$g@H4kdc36WnN~^qKw>}#hKYTd5d$hRz?u1y%~qoMOi3K`L74aZq~M6LlW6&#cQA2 +z#y}Gkqyf!mJv|e}sfU@+1Pj0nEeajW8CnxHM>C#z5liPVtZhtBp^uLiATW>kjqCi* +zU9}3J{mxxr01Jt;FJDHg8JuKx#Kc5IRl?J;ng7}3eW9s}4`MY5niNTs>EbZWyD?o4 +zJrx&_UWr{?oSeur8YZS$o{shG>E&zWIj(;oW;k0$uEEL3XDZnC{jABME0z5hiqdDr +zFqVA80MzF9n?HZ^=Whmo_3vN)`v=Dq_D#-AV5 +zj}Os{3erV6>4%Q4d~fg3{d?0zi#Llhau)MNhZnz}v@tp&7yYNffn{=*{J(+e{B0a3 +zlg~vH^X}dq_MACu-L3{)-x8< +zm+c$wn@Fwz#EkN3tWsBcDYwSFl%vuSkqwM=*J8@?Ei- +zx=XSa!y;IyZqq^w#KoGthD9TV>2-Hf6^#~z3z{G`7_OKK=B&dUFFkd(<`Vr4zQ7wW +zaP{^L)OXJwuAjsDK;SY)w8+N?1CX&hpX$>1+w0ouJcIc2P!eOjmRw{h^dai;YR +zj2n*;7zYBhZ{rwrDIcvto-q)k+x$w77Hlw@S +zm>dH0Tp@0t&Q6Wo-A$L#)xLVQvGJlA2od2H|Q1rwup +zY7e`7GX#yYyU9JNr;q22$<58^mLm5J4QQNy<%%2za!=~LBE6Vw*4oIm%=cK)k Date: Sat, 8 May 2021 11:30:32 +0200 Subject: [PATCH] ath79: various fixes @@ -9,29 +9,38 @@ Subject: [PATCH] ath79: various fixes Signed-off-by: John Crispin --- - target/linux/ath79/dts/ar9344_tplink_cpe.dtsi | 13 ++++++++++--- - .../ath79/generic/base-files/etc/board.d/02_network | 3 ++- - tools/firmware-utils/src/tplink-safeloader.c | 3 ++- - 3 files changed, 14 insertions(+), 5 deletions(-) + target/linux/ath79/dts/ar9344_tplink_cpe.dtsi | 20 ++++++++----------- + .../generic/base-files/etc/board.d/02_network | 3 ++- + tools/firmware-utils/src/tplink-safeloader.c | 4 ++-- + 3 files changed, 12 insertions(+), 15 deletions(-) diff --git a/target/linux/ath79/dts/ar9344_tplink_cpe.dtsi b/target/linux/ath79/dts/ar9344_tplink_cpe.dtsi -index fd6aa0f08b..2b663a938e 100644 +index d4b7de440a..c5ab963174 100644 --- a/target/linux/ath79/dts/ar9344_tplink_cpe.dtsi +++ b/target/linux/ath79/dts/ar9344_tplink_cpe.dtsi -@@ -60,9 +60,16 @@ +@@ -59,20 +59,16 @@ partition@40000 { label = "firmware"; reg = <0x040000 0x780000>; -- compatible = "openwrt,uimage", "denx,uimage"; -- openwrt,ih-magic = ; -- openwrt,offset = <0x3000>; + }; -+ + +- compatible = "fixed-partitions"; +- #address-cells = <1>; +- #size-cells = <1>; +- +- partition@0 { +- label = "kernel"; +- reg = <0x000000 0x300000>; +- }; + partition@040000 { + label = "kernel"; + reg = <0x040000 0x210000>; + }; -+ + +- partition@300000 { +- label = "rootfs"; +- reg = <0x300000 0x480000>; +- }; + partition@340000 { + label = "rootfs"; + reg = <0x250000 0x560000>; @@ -39,10 +48,10 @@ index fd6aa0f08b..2b663a938e 100644 partition@7c0000 { diff --git a/target/linux/ath79/generic/base-files/etc/board.d/02_network b/target/linux/ath79/generic/base-files/etc/board.d/02_network -index d70432ad2b..b0b152ba74 100755 +index 1e522b91c6..b8bc38348e 100755 --- a/target/linux/ath79/generic/base-files/etc/board.d/02_network +++ b/target/linux/ath79/generic/base-files/etc/board.d/02_network -@@ -95,7 +95,7 @@ ath79_setup_interfaces() +@@ -94,7 +94,7 @@ ath79_setup_interfaces() ubnt,unifi|\ wd,mynet-wifi-rangeextender|\ winchannel,wb2000) @@ -51,7 +60,7 @@ index d70432ad2b..b0b152ba74 100755 ;; airtight,c-75) ucidef_add_switch "switch0" \ -@@ -675,6 +675,7 @@ ath79_setup_macs() +@@ -669,6 +669,7 @@ ath79_setup_macs() board_config_update board=$(board_name) @@ -60,14 +69,15 @@ index d70432ad2b..b0b152ba74 100755 ath79_setup_macs $board board_config_flush diff --git a/tools/firmware-utils/src/tplink-safeloader.c b/tools/firmware-utils/src/tplink-safeloader.c -index c519a6d367..a0390c3797 100644 +index ac71b3305e..2bc4a3cb82 100644 --- a/tools/firmware-utils/src/tplink-safeloader.c +++ b/tools/firmware-utils/src/tplink-safeloader.c -@@ -439,7 +439,8 @@ static struct device_info boards[] = { +@@ -443,8 +443,8 @@ static struct device_info boards[] = { {"default-mac", 0x30000, 0x00020}, {"product-info", 0x31100, 0x00100}, {"signature", 0x32000, 0x00400}, -- {"firmware", 0x40000, 0x770000}, +- {"os-image", 0x40000, 0x300000}, +- {"file-system", 0x340000, 0x470000}, + {"os-image", 0x40000, 0x210000}, + {"file-system", 0x250000, 0x560000}, {"soft-version", 0x7b0000, 0x00100}, diff --git a/patches/0037-ipq4018-add-EdgeCore-SPW2AC1200-support.patch b/patches/0037-ipq4018-add-EdgeCore-SPW2AC1200-support.patch index f36751795..66aac5c96 100644 --- a/patches/0037-ipq4018-add-EdgeCore-SPW2AC1200-support.patch +++ b/patches/0037-ipq4018-add-EdgeCore-SPW2AC1200-support.patch @@ -1,7 +1,7 @@ -From 77b6aa80cb737f4a7c92a0b20375260874e7e265 Mon Sep 17 00:00:00 2001 +From c651355c099a42c12f1953f4d027b32172a45bbb Mon Sep 17 00:00:00 2001 From: John Crispin -Date: Tue, 10 Aug 2021 08:05:13 +0200 -Subject: [PATCH 1/4] ipq4018: add EdgeCore SPW2AC1200 support +Date: Thu, 1 Jul 2021 16:37:24 +0200 +Subject: [PATCH] ipq4018: add EdgeCore SPW2AC1200 support Signed-off-by: John Crispin --- @@ -12,8 +12,8 @@ Signed-off-by: John Crispin .../base-files/lib/upgrade/platform.sh | 4 +- .../arm/boot/dts/qcom-ipq4018-spw2ac1200.dts | 332 ++++++++++++++++++ target/linux/ipq40xx/image/generic.mk | 13 + - .../901-arm-boot-add-dts-files.patch | 9 +- - 8 files changed, 359 insertions(+), 4 deletions(-) + .../901-arm-boot-add-dts-files.patch | 3 +- + 8 files changed, 355 insertions(+), 2 deletions(-) create mode 100644 target/linux/ipq40xx/files/arch/arm/boot/dts/qcom-ipq4018-spw2ac1200.dts diff --git a/package/boot/uboot-envtools/files/ipq40xx b/package/boot/uboot-envtools/files/ipq40xx @@ -29,10 +29,10 @@ index b24cbf979e..ac66a7f2bd 100644 glinet,gl-b1300 |\ luma,wrtq-329acn |\ diff --git a/target/linux/ipq40xx/base-files/etc/board.d/01_leds b/target/linux/ipq40xx/base-files/etc/board.d/01_leds -index c1d4e693f2..d473448137 100755 +index f9674126ba..efd5d002db 100755 --- a/target/linux/ipq40xx/base-files/etc/board.d/01_leds +++ b/target/linux/ipq40xx/base-files/etc/board.d/01_leds -@@ -71,6 +71,7 @@ qxwlan,e2600ac-c2) +@@ -63,6 +63,7 @@ qxwlan,e2600ac-c2) ucidef_set_led_wlan "wlan5g" "WLAN1" "green:wlan1" "phy1tpt" ;; edgecore,ecw5211 |\ @@ -41,10 +41,10 @@ index c1d4e693f2..d473448137 100755 zyxel,nbg6617 |\ zyxel,wre6606) diff --git a/target/linux/ipq40xx/base-files/etc/board.d/02_network b/target/linux/ipq40xx/base-files/etc/board.d/02_network -index 16f6040b6e..0240798bbb 100755 +index 597fa9f08b..7bc8c5e6aa 100755 --- a/target/linux/ipq40xx/base-files/etc/board.d/02_network +++ b/target/linux/ipq40xx/base-files/etc/board.d/02_network -@@ -45,6 +45,7 @@ ipq40xx_setup_interfaces() +@@ -43,6 +43,7 @@ ipq40xx_setup_interfaces() cilab,meshpoint-one|\ cig,wf610d|\ edgecore,ecw5211|\ @@ -53,10 +53,10 @@ index 16f6040b6e..0240798bbb 100755 openmesh,a42|\ openmesh,a62) diff --git a/target/linux/ipq40xx/base-files/etc/hotplug.d/firmware/11-ath10k-caldata b/target/linux/ipq40xx/base-files/etc/hotplug.d/firmware/11-ath10k-caldata -index c8943d3ba3..ad2946f636 100644 +index a9bbc791b8..da7931d018 100644 --- a/target/linux/ipq40xx/base-files/etc/hotplug.d/firmware/11-ath10k-caldata +++ b/target/linux/ipq40xx/base-files/etc/hotplug.d/firmware/11-ath10k-caldata -@@ -104,6 +104,7 @@ case "$FIRMWARE" in +@@ -101,6 +101,7 @@ case "$FIRMWARE" in compex,wpj419 |\ compex,wpj428 |\ edgecore,ecw5211 |\ @@ -64,7 +64,7 @@ index c8943d3ba3..ad2946f636 100644 edgecore,oap100 |\ engenius,eap1300 |\ engenius,eap2200 |\ -@@ -220,6 +221,7 @@ case "$FIRMWARE" in +@@ -212,6 +213,7 @@ case "$FIRMWARE" in compex,wpj419 |\ compex,wpj428 |\ edgecore,ecw5211 |\ @@ -73,7 +73,7 @@ index c8943d3ba3..ad2946f636 100644 engenius,eap1300 |\ engenius,eap2200 |\ diff --git a/target/linux/ipq40xx/base-files/lib/upgrade/platform.sh b/target/linux/ipq40xx/base-files/lib/upgrade/platform.sh -index cbdd12c750..84abd181dc 100644 +index 530545e442..f6fc828134 100644 --- a/target/linux/ipq40xx/base-files/lib/upgrade/platform.sh +++ b/target/linux/ipq40xx/base-files/lib/upgrade/platform.sh @@ -76,7 +76,9 @@ platform_do_upgrade() { @@ -426,10 +426,10 @@ index 0000000000..a152ba57f4 + status = "okay"; +}; diff --git a/target/linux/ipq40xx/image/generic.mk b/target/linux/ipq40xx/image/generic.mk -index d12c48a481..ffaf52b553 100644 +index ee648edc50..e4e437bb95 100644 --- a/target/linux/ipq40xx/image/generic.mk +++ b/target/linux/ipq40xx/image/generic.mk -@@ -374,6 +374,19 @@ define Device/edgecore_ecw5211 +@@ -376,6 +376,19 @@ define Device/edgecore_ecw5211 endef TARGET_DEVICES += edgecore_ecw5211 @@ -450,25 +450,19 @@ index d12c48a481..ffaf52b553 100644 $(call Device/FitImage) $(call Device/UbiFit) diff --git a/target/linux/ipq40xx/patches-5.4/901-arm-boot-add-dts-files.patch b/target/linux/ipq40xx/patches-5.4/901-arm-boot-add-dts-files.patch -index 49254efd75..4539709fb0 100644 +index aec0d01ed6..492cc67b2c 100644 --- a/target/linux/ipq40xx/patches-5.4/901-arm-boot-add-dts-files.patch +++ b/target/linux/ipq40xx/patches-5.4/901-arm-boot-add-dts-files.patch -@@ -8,9 +8,11 @@ Signed-off-by: John Crispin - arch/arm/boot/dts/Makefile | 23 +++++++++++++++++++++++ - 1 file changed, 23 insertions(+) +@@ -10,7 +10,7 @@ Signed-off-by: John Crispin ----- a/arch/arm/boot/dts/Makefile --+++ b/arch/arm/boot/dts/Makefile --@@ -837,11 +837,60 @@ dtb-$(CONFIG_ARCH_QCOM) += \ -+Index: linux-5.4.137/arch/arm/boot/dts/Makefile -+=================================================================== -+--- linux-5.4.137.orig/arch/arm/boot/dts/Makefile -++++ linux-5.4.137/arch/arm/boot/dts/Makefile -+@@ -837,11 +837,62 @@ dtb-$(CONFIG_ARCH_QCOM) += \ + --- a/arch/arm/boot/dts/Makefile + +++ b/arch/arm/boot/dts/Makefile +-@@ -837,11 +837,59 @@ dtb-$(CONFIG_ARCH_QCOM) += \ ++@@ -837,11 +837,60 @@ dtb-$(CONFIG_ARCH_QCOM) += \ qcom-apq8074-dragonboard.dtb \ qcom-apq8084-ifc6540.dtb \ qcom-apq8084-mtp.dtb \ -@@ -22,6 +24,7 @@ Signed-off-by: John Crispin +@@ -22,6 +22,7 @@ Signed-off-by: John Crispin + qcom-ipq4018-ea6350v3.dtb \ + qcom-ipq4018-eap1300.dtb \ + qcom-ipq4018-ecw5211.dtb \ diff --git a/patches/0038-Revert-libusb-update-to-1.0.24.patch b/patches/0038-Revert-libusb-update-to-1.0.24.patch index 054a9558c..c60e92c9b 100644 --- a/patches/0038-Revert-libusb-update-to-1.0.24.patch +++ b/patches/0038-Revert-libusb-update-to-1.0.24.patch @@ -1,19 +1,15 @@ -From 7423a1e0d1e571b82be86055ce7199608c82de9a Mon Sep 17 00:00:00 2001 +From 4f4e6eec1cab67d6cea9bfa61da5fbbd1a21fdee Mon Sep 17 00:00:00 2001 From: John Crispin Date: Fri, 2 Jul 2021 12:02:04 +0200 -Subject: [PATCH 1/3] Revert "libusb: update to 1.0.24" +Subject: [PATCH] Revert "libusb: update to 1.0.24" This reverts commit 0798b13d7df0deafd005b14d52420c4f480d146e. --- - package/libs/libusb/Makefile | 6 +- - ...n-the-Changelog-and-clean-up-a-stray.patch | 29 --------- - ...parsing-of-descriptors-for-multi-con.patch | 61 ------------------- - 3 files changed, 3 insertions(+), 93 deletions(-) - delete mode 100644 package/libs/libusb/patches/001-Correct-a-typo-in-the-Changelog-and-clean-up-a-stray.patch - delete mode 100644 package/libs/libusb/patches/002-linux_usbfs-Fix-parsing-of-descriptors-for-multi-con.patch + package/libs/libusb/Makefile | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/package/libs/libusb/Makefile b/package/libs/libusb/Makefile -index 6b80b3848d..1667fb2840 100644 +index e931536339..1667fb2840 100644 --- a/package/libs/libusb/Makefile +++ b/package/libs/libusb/Makefile @@ -8,14 +8,14 @@ @@ -21,7 +17,7 @@ index 6b80b3848d..1667fb2840 100644 PKG_NAME:=libusb -PKG_VERSION:=1.0.24 --PKG_RELEASE:=$(AUTORELEASE) +-PKG_RELEASE:=1 +PKG_VERSION:=1.0.22 +PKG_RELEASE:=2 @@ -34,108 +30,6 @@ index 6b80b3848d..1667fb2840 100644 PKG_MAINTAINER:= Felix Fietkau PKG_LICENSE:=LGPL-2.1-or-later -diff --git a/package/libs/libusb/patches/001-Correct-a-typo-in-the-Changelog-and-clean-up-a-stray.patch b/package/libs/libusb/patches/001-Correct-a-typo-in-the-Changelog-and-clean-up-a-stray.patch -deleted file mode 100644 -index b17d6178d3..0000000000 ---- a/package/libs/libusb/patches/001-Correct-a-typo-in-the-Changelog-and-clean-up-a-stray.patch -+++ /dev/null -@@ -1,29 +0,0 @@ --From 369af149e3ad92514a2d24f112cedfeb7acaf558 Mon Sep 17 00:00:00 2001 --From: Chris Dickens --Date: Sun, 13 Dec 2020 15:46:27 -0800 --Subject: [PATCH] Correct a typo in the Changelog and clean up a stray file -- --Signed-off-by: Chris Dickens ----- -- ChangeLog | 2 +- -- libusb/version_nano.h | 2 +- -- test | 0 -- 3 files changed, 2 insertions(+), 2 deletions(-) -- delete mode 100644 test -- ----- a/ChangeLog --+++ b/ChangeLog --@@ -12,7 +12,7 @@ visit: http://log.libusb.info -- * Darwin (macOS): use IOUSBDevice as darwin_device_class explicitly (#693) -- * Linux: Drop support for kernel older than 2.6.32 -- * Linux: Provide an event thread name (#689) ---* Linux: Wait until all USBs have been reaped before freeing them (#607) --+* Linux: Wait until all URBs have been reaped before freeing them (#607) -- * NetBSD: Recognize device timeouts (#710) -- * OpenBSD: Allow opening ugen devices multiple times (#763) -- * OpenBSD: Support libusb_get_port_number() (#764) ----- a/libusb/version_nano.h --+++ b/libusb/version_nano.h --@@ -1 +1 @@ ---#define LIBUSB_NANO 11584 --+#define LIBUSB_NANO 11585 -diff --git a/package/libs/libusb/patches/002-linux_usbfs-Fix-parsing-of-descriptors-for-multi-con.patch b/package/libs/libusb/patches/002-linux_usbfs-Fix-parsing-of-descriptors-for-multi-con.patch -deleted file mode 100644 -index a53a8900de..0000000000 ---- a/package/libs/libusb/patches/002-linux_usbfs-Fix-parsing-of-descriptors-for-multi-con.patch -+++ /dev/null -@@ -1,61 +0,0 @@ --From f6d2cb561402c3b6d3627c0eb89e009b503d9067 Mon Sep 17 00:00:00 2001 --From: Chris Dickens --Date: Sun, 13 Dec 2020 15:49:19 -0800 --Subject: [PATCH] linux_usbfs: Fix parsing of descriptors for -- multi-configuration devices -- --Commit e2be556bd2 ("linux_usbfs: Parse config descriptors during device --initialization") introduced a regression for devices with multiple --configurations. The logic that verifies the reported length of the --configuration descriptors failed to count the length of the --configuration descriptor itself and would truncate the actual length by --9 bytes, leading to a parsing error for subsequent descriptors. -- --Closes #825 -- --Signed-off-by: Chris Dickens ----- -- libusb/os/linux_usbfs.c | 12 ++++++++---- -- libusb/version_nano.h | 2 +- -- 2 files changed, 9 insertions(+), 5 deletions(-) -- ----- a/libusb/os/linux_usbfs.c --+++ b/libusb/os/linux_usbfs.c --@@ -641,7 +641,12 @@ static int seek_to_next_config(struct li -- uint8_t *buffer, size_t len) -- { -- struct usbi_descriptor_header *header; --- int offset = 0; --+ int offset; --+ --+ /* Start seeking past the config descriptor */ --+ offset = LIBUSB_DT_CONFIG_SIZE; --+ buffer += LIBUSB_DT_CONFIG_SIZE; --+ len -= LIBUSB_DT_CONFIG_SIZE; -- -- while (len > 0) { -- if (len < 2) { --@@ -718,7 +723,7 @@ static int parse_config_descriptors(stru -- } -- -- if (priv->sysfs_dir) { --- /* --+ /* -- * In sysfs wTotalLength is ignored, instead the kernel returns a -- * config descriptor with verified bLength fields, with descriptors -- * with an invalid bLength removed. --@@ -727,8 +732,7 @@ static int parse_config_descriptors(stru -- int offset; -- -- if (num_configs > 1 && idx < num_configs - 1) { --- offset = seek_to_next_config(ctx, buffer + LIBUSB_DT_CONFIG_SIZE, --- remaining - LIBUSB_DT_CONFIG_SIZE); --+ offset = seek_to_next_config(ctx, buffer, remaining); -- if (offset < 0) -- return offset; -- sysfs_config_len = (uint16_t)offset; ----- a/libusb/version_nano.h --+++ b/libusb/version_nano.h --@@ -1 +1 @@ ---#define LIBUSB_NANO 11585 --+#define LIBUSB_NANO 11586 -- 2.25.1