mirror of
https://github.com/Telecominfraproject/wlan-ap.git
synced 2025-10-29 17:42:41 +00:00
Compare commits
16 Commits
v2.5.0-rc1
...
v2.5.0-rc3
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
e3b1fe36e5 | ||
|
|
5af7e1e7d8 | ||
|
|
057ebb8660 | ||
|
|
17fe72c6e9 | ||
|
|
834ff2fe4f | ||
|
|
ce3849e131 | ||
|
|
66640cdd1a | ||
|
|
300924a4be | ||
|
|
8fb088bcc8 | ||
|
|
b08455228f | ||
|
|
09563eadaf | ||
|
|
2df46a2c77 | ||
|
|
e4fa57b4d0 | ||
|
|
48677a6943 | ||
|
|
e79970ce04 | ||
|
|
b4d1d58fc9 |
2
.github/workflows/build-dev.yml
vendored
2
.github/workflows/build-dev.yml
vendored
@@ -11,7 +11,7 @@ jobs:
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
target: ['actiontec_web7200', 'cig_wf188n', 'cig_wf194c', 'cig_wf194c4', 'cig_wf160d', 'cig_wf808', 'cybertan_eww622-a1', 'edgecore_eap101', 'edgecore_eap102', 'edgecore_ecs4100-12ph', 'edgecore_ecw5211', 'edgecore_ecw5410', 'edgecore_oap100', 'edgecore_ssw2ac2600', 'edgecore_spw2ac1200', 'edgecore_spw2ac1200-lan-poe', 'hfcl_ion4', 'hfcl_ion4xe', 'hfcl_ion4xi', 'indio_um-305ac', 'linksys_ea6350-v4', 'linksys_e8450-ubi', 'linksys_ea8300', 'tp-link_ec420-g1', 'tplink_ex227', 'tplink_ex228', 'tplink_ex447', 'wallys_dr40x9', 'wallys_dr6018', 'wallys_dr6018_v4' ]
|
||||
target: ['actiontec_web7200', 'cig_wf188n', 'cig_wf194c', 'cig_wf194c4', 'cig_wf196', 'cig_wf160d', 'cig_wf808', 'cybertan_eww622-a1', 'edgecore_eap101', 'edgecore_eap102', 'edgecore_eap104', 'edgecore_ecs4100-12ph', 'edgecore_ecw5211', 'edgecore_ecw5410', 'edgecore_oap100', 'edgecore_ssw2ac2600', 'edgecore_spw2ac1200', 'edgecore_spw2ac1200-lan-poe', 'hfcl_ion4', 'hfcl_ion4xe', 'hfcl_ion4xi', 'indio_um-305ac', 'linksys_ea6350-v4', 'linksys_e8450-ubi', 'linksys_ea8300', 'tp-link_ec420-g1', 'tplink_ex227', 'tplink_ex228', 'tplink_ex447', 'wallys_dr40x9', 'wallys_dr6018', 'wallys_dr6018_v4' ]
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
|
||||
@@ -37,6 +37,9 @@ define Package/cc2652/install
|
||||
|
||||
$(INSTALL_DIR) $(1)/etc/config
|
||||
$(INSTALL_BIN) ./files/tisbl.config $(1)/etc/config/tisbl
|
||||
|
||||
$(INSTALL_DIR) $(1)/etc/uci-defaults
|
||||
$(INSTALL_BIN) ./files/tisbl.defaults $(1)/etc/uci-defaults
|
||||
endef
|
||||
|
||||
$(eval $(call BuildPackage,cc2652))
|
||||
|
||||
@@ -1,9 +1,7 @@
|
||||
config tisbl 'tisbl'
|
||||
option firmware '/etc/tifirmware/ble5_host_test_bd9.bin'
|
||||
option tty '/dev/ttyMSM1' # for EAP101 board
|
||||
# option tty '/dev/ttyACM0' # for virtualbox openwrt 19.07 with TI CC26X2R launchpad
|
||||
option tichip '2652'
|
||||
option baudrate '115200'
|
||||
option resetpin '79'
|
||||
option backdoorpin '34' #EAP101-R1
|
||||
# option backdoorpin '67' #EAP101-R0A-HW-modification
|
||||
option firmware '/etc/tifirmware/ble5_host_test_bd9.bin'
|
||||
option tty '/dev/ttyMSM1'
|
||||
option tichip '2652'
|
||||
option baudrate '115200'
|
||||
option resetpin '79'
|
||||
option backdoorpin '34'
|
||||
|
||||
13
feeds/bluetooth-cc2652/cc2652/files/tisbl.defaults
Executable file
13
feeds/bluetooth-cc2652/cc2652/files/tisbl.defaults
Executable file
@@ -0,0 +1,13 @@
|
||||
#!/bin/sh
|
||||
|
||||
. /lib/functions.sh
|
||||
. /lib/functions/system.sh
|
||||
|
||||
board=$(board_name)
|
||||
|
||||
case $board in
|
||||
edgecore,eap104)
|
||||
uci set tisbl.tisbl.backdoorpin=31
|
||||
uci set tisbl.tisbl.resetpin=35
|
||||
;;
|
||||
esac
|
||||
@@ -17,9 +17,6 @@ cig,wf194c4)
|
||||
ucidef_set_led_wlan "wlan5g" "WLAN5G" "green:wifi5" "phy0tpt"
|
||||
ucidef_set_led_wlan "wlan2g" "WLAN2G" "green:wifi2" "phy1tpt"
|
||||
;;
|
||||
esac
|
||||
|
||||
case "$board" in
|
||||
edgecore,eap101)
|
||||
ucidef_set_led_wlan "wlan5g" "WLAN5G" "green:wifi5" "phy0tpt"
|
||||
ucidef_set_led_wlan "wlan2g" "WLAN2G" "green:wifi2" "phy1tpt"
|
||||
@@ -32,6 +29,11 @@ edgecore,eap102)
|
||||
ucidef_set_led_wlan "wlan5g" "WLAN5G" "green:wifi5" "phy0tpt"
|
||||
ucidef_set_led_wlan "wlan2g" "WLAN2G" "green:wifi2" "phy1tpt"
|
||||
;;
|
||||
edgecore,eap104)
|
||||
ucidef_set_led_wlan "wlan2g" "WLAN2G" "green:wifi2" "phy0tpt"
|
||||
ucidef_set_led_wlan "wlan5g" "WLAN5G" "green:wifi5" "phy1tpt"
|
||||
ucidef_set_led_netdev "wan" "wan" "yellow:uplink" "eth0"
|
||||
;;
|
||||
hfcl,ion4xi|\
|
||||
hfcl,ion4xe)
|
||||
ucidef_set_led_wlan "wlan5g" "WLAN5G" "blue:wifi5" "phy0tpt"
|
||||
|
||||
@@ -41,6 +41,7 @@ qcom_setup_interfaces()
|
||||
ucidef_set_interface_wan "eth0"
|
||||
;;
|
||||
edgecore,eap102|\
|
||||
edgecore,eap104|\
|
||||
wallys,dr6018|\
|
||||
cig,wf188n|\
|
||||
cig,wf196)
|
||||
@@ -91,7 +92,6 @@ qcom_setup_macs()
|
||||
|
||||
board_config_update
|
||||
board=$(board_name)
|
||||
ucidef_set_bridge_device bridge
|
||||
qcom_setup_interfaces $board
|
||||
qcom_setup_macs $board
|
||||
board_config_flush
|
||||
|
||||
@@ -104,11 +104,19 @@ case "$FIRMWARE" in
|
||||
ath11k/IPQ5018/hw1.0/caldata.bin)
|
||||
case "$board" in
|
||||
cybertan,eww622-a1|\
|
||||
edgecore,eap104|\
|
||||
qcom,ipq5018-mp03.1)
|
||||
caldata_extract "0:ART" 0x1000 0x20000
|
||||
;;
|
||||
esac
|
||||
;;
|
||||
ath11k/qcn6122/hw1.0/caldata_2.bin)
|
||||
case "$board" in
|
||||
edgecore,eap104)
|
||||
caldata_extract "0:ART" 0x4c000 0x20000
|
||||
;;
|
||||
esac
|
||||
;;
|
||||
ath11k/QCN9074/hw1.0/caldata_1.bin)
|
||||
case "$board" in
|
||||
cig,wf196|\
|
||||
|
||||
@@ -1,67 +0,0 @@
|
||||
#!/bin/sh
|
||||
[ "$ACTION" = add ] || exit
|
||||
|
||||
NPROCS="$(grep -c "^processor.*:" /proc/cpuinfo)"
|
||||
[ "$NPROCS" -gt 1 ] || exit
|
||||
|
||||
PROC_MASK="$(( (1 << $NPROCS) - 1 ))"
|
||||
|
||||
find_irq_cpu() {
|
||||
local dev="$1"
|
||||
local match="$(grep -m 1 "$dev\$" /proc/interrupts)"
|
||||
local cpu=0
|
||||
|
||||
[ -n "$match" ] && {
|
||||
set -- $match
|
||||
shift
|
||||
for cur in `seq 1 $NPROCS`; do
|
||||
[ "$1" -gt 0 ] && {
|
||||
cpu=$(($cur - 1))
|
||||
break
|
||||
}
|
||||
shift
|
||||
done
|
||||
}
|
||||
|
||||
echo "$cpu"
|
||||
}
|
||||
|
||||
set_hex_val() {
|
||||
local file="$1"
|
||||
local val="$2"
|
||||
val="$(printf %x "$val")"
|
||||
[ -n "$DEBUG" ] && echo "$file = $val"
|
||||
echo "$val" > "$file"
|
||||
}
|
||||
|
||||
default_ps="$(uci get "network.@globals[0].default_ps")"
|
||||
[ -n "$default_ps" -a "$default_ps" != 1 ] && exit 0
|
||||
|
||||
exec 512>/var/lock/smp_tune.lock
|
||||
flock 512 || exit 1
|
||||
|
||||
for dev in /sys/class/net/*; do
|
||||
[ -d "$dev" ] || continue
|
||||
|
||||
# ignore virtual interfaces
|
||||
[ -n "$(ls "${dev}/" | grep '^lower_')" ] && continue
|
||||
[ -d "${dev}/device" ] || continue
|
||||
|
||||
device="$(readlink "${dev}/device")"
|
||||
device="$(basename "$device")"
|
||||
irq_cpu="$(find_irq_cpu "$device")"
|
||||
irq_cpu_mask="$((1 << $irq_cpu))"
|
||||
|
||||
for q in ${dev}/queues/rx-*; do
|
||||
set_hex_val "$q/rps_cpus" "$(($PROC_MASK & ~$irq_cpu_mask))"
|
||||
done
|
||||
|
||||
ntxq="$(ls -d ${dev}/queues/tx-* | wc -l)"
|
||||
|
||||
idx=$(($irq_cpu + 1))
|
||||
for q in ${dev}/queues/tx-*; do
|
||||
set_hex_val "$q/xps_cpus" "$((1 << $idx))"
|
||||
let "idx = idx + 1"
|
||||
[ "$idx" -ge "$NPROCS" ] && idx=0
|
||||
done
|
||||
done
|
||||
@@ -1,58 +0,0 @@
|
||||
#!/bin/sh /etc/rc.common
|
||||
|
||||
START=80
|
||||
|
||||
set_affinity() {
|
||||
local affinity=$1
|
||||
local name=$2
|
||||
local irq=`grep -E -m1 $name /proc/interrupts | cut -d ':' -f 1 | tail -n1 | tr -d ' '`
|
||||
[ -n "$irq" ] && {
|
||||
logger ath11k setting affinity for $name/$irq to $affinity
|
||||
echo $affinity > /proc/irq/$irq/smp_affinity
|
||||
}
|
||||
}
|
||||
|
||||
boot() {
|
||||
. /lib/functions/system.sh
|
||||
|
||||
board=$(board_name)
|
||||
case $board in
|
||||
cig,wf196)
|
||||
set_affinity 1 reo2host-destination-ring2
|
||||
set_affinity 2 reo2host-destination-ring1
|
||||
;;
|
||||
*)
|
||||
set_affinity 2 reo2host-destination-ring2
|
||||
set_affinity 1 reo2host-destination-ring1
|
||||
;;
|
||||
esac
|
||||
|
||||
case $board in
|
||||
maple)
|
||||
;;
|
||||
*)
|
||||
set_affinity 8 reo2host-destination-ring4
|
||||
set_affinity 4 reo2host-destination-ring3
|
||||
|
||||
set_affinity 8 wbm2host-tx-completions-ring3
|
||||
set_affinity 4 wbm2host-tx-completions-ring2
|
||||
set_affinity 2 wbm2host-tx-completions-ring1
|
||||
|
||||
set_affinity 8 ppdu-end-interrupts-mac1
|
||||
set_affinity 8 rxdma2host-monitor-status-ring-mac1
|
||||
set_affinity 8 rxdma2host-monitor-destination-mac1
|
||||
set_affinity 8 host2rxdma-monitor-ring1
|
||||
;;
|
||||
esac
|
||||
|
||||
set_affinity 4 ppdu-end-interrupts-mac2
|
||||
set_affinity 4 rxdma2host-monitor-status-ring-mac2
|
||||
set_affinity 4 rxdma2host-monitor-destination-mac2
|
||||
set_affinity 4 host2rxdma-monitor-ring2
|
||||
|
||||
set_affinity 2 ppdu-end-interrupts-mac3
|
||||
set_affinity 2 rxdma2host-monitor-status-ring-mac3
|
||||
set_affinity 2 rxdma2host-monitor-destination-mac3
|
||||
set_affinity 2 host2rxdma-monitor-ring3
|
||||
}
|
||||
|
||||
@@ -30,6 +30,7 @@ platform_check_image() {
|
||||
wallys,dr6018-v4|\
|
||||
edgecore,eap101|\
|
||||
edgecore,eap102|\
|
||||
edgecore,eap104|\
|
||||
edgecore,eap106|\
|
||||
hfcl,ion4xi|\
|
||||
hfcl,ion4xe|\
|
||||
@@ -60,6 +61,7 @@ platform_do_upgrade() {
|
||||
cig,wf194c4|\
|
||||
cig,wf196|\
|
||||
cybertan,eww622-a1|\
|
||||
edgecore,eap104|\
|
||||
hfcl,ion4xi|\
|
||||
hfcl,ion4xe|\
|
||||
qcom,ipq6018-cp01|\
|
||||
|
||||
@@ -0,0 +1,23 @@
|
||||
/*
|
||||
* Copyright (c) 2018-2020, The Linux Foundation. All rights reserved.
|
||||
*
|
||||
* Permission to use, copy, modify, and/or distribute this software for any
|
||||
* purpose with or without fee is hereby granted, provided that the above
|
||||
* copyright notice and this permission notice appear in all copies.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
||||
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
||||
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
||||
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
||||
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
||||
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
*/
|
||||
|
||||
#include "../../../arm64/boot/dts/qcom/qcom-ipq5018-eap104.dts"
|
||||
|
||||
/ {
|
||||
pmuv8: pmu {
|
||||
compatible = "arm,cortex-a7-pmu";
|
||||
};
|
||||
};
|
||||
1015
feeds/ipq807x/ipq807x/files/arch/arm64/boot/dts/qcom/qcom-ipq5018-eap104.dts
Executable file
1015
feeds/ipq807x/ipq807x/files/arch/arm64/boot/dts/qcom/qcom-ipq5018-eap104.dts
Executable file
File diff suppressed because it is too large
Load Diff
@@ -39,6 +39,11 @@
|
||||
ethernet3 = "/soc/dp4";
|
||||
ethernet4 = "/soc/dp5";
|
||||
ethernet5 = "/soc/dp6";
|
||||
|
||||
led-boot = &led_power;
|
||||
led-failsafe = &led_power;
|
||||
led-running = &led_power;
|
||||
led-upgrade = &led_power;
|
||||
};
|
||||
|
||||
chosen {
|
||||
@@ -325,15 +330,22 @@
|
||||
};
|
||||
|
||||
led_pins: led_pins {
|
||||
led_2g {
|
||||
pins = "gpio42";
|
||||
led_red {
|
||||
pins = "gpio25";
|
||||
function = "gpio";
|
||||
drive-strength = <8>;
|
||||
bias-pull-down;
|
||||
};
|
||||
|
||||
led_5g {
|
||||
pins = "gpio43";
|
||||
led_green {
|
||||
pins = "gpio26";
|
||||
function = "gpio";
|
||||
drive-strength = <8>;
|
||||
bias-pull-down;
|
||||
};
|
||||
|
||||
led_blue {
|
||||
pins = "gpio27";
|
||||
function = "gpio";
|
||||
drive-strength = <8>;
|
||||
bias-pull-down;
|
||||
@@ -379,7 +391,7 @@
|
||||
pinctrl-0 = <&pwm_pins>;
|
||||
pinctrl-names = "default";
|
||||
used-pwm-indices = <1>, <1>, <1>, <0>;
|
||||
status = "ok";
|
||||
// status = "ok";
|
||||
};
|
||||
gpio_keys {
|
||||
compatible = "gpio-keys";
|
||||
@@ -810,15 +822,21 @@
|
||||
pinctrl-0 = <&led_pins>;
|
||||
pinctrl-names = "default";
|
||||
|
||||
led_2g {
|
||||
label = "led_2g";
|
||||
gpio = <&tlmm 42 GPIO_ACTIVE_HIGH>;
|
||||
led_red {
|
||||
label = "red:status";
|
||||
gpio = <&tlmm 25 GPIO_ACTIVE_HIGH>;
|
||||
default-state = "off";
|
||||
};
|
||||
|
||||
led_5g {
|
||||
label = "led_5g";
|
||||
gpio = <&tlmm 43 GPIO_ACTIVE_HIGH>;
|
||||
led_power: led_green {
|
||||
label = "green:status";
|
||||
gpio = <&tlmm 26 GPIO_ACTIVE_HIGH>;
|
||||
default-state = "on";
|
||||
};
|
||||
|
||||
led_blue {
|
||||
label = "blue:status";
|
||||
gpio = <&tlmm 27 GPIO_ACTIVE_HIGH>;
|
||||
default-state = "off";
|
||||
};
|
||||
};
|
||||
|
||||
@@ -9,6 +9,15 @@ define Device/cybertan_eww622_a1
|
||||
endef
|
||||
TARGET_DEVICES += cybertan_eww622_a1
|
||||
|
||||
define Device/edgecore_eap104
|
||||
DEVICE_TITLE := EdgeCore EAP104
|
||||
DEVICE_DTS := qcom-ipq5018-eap104
|
||||
SUPPORTED_DEVICES := edgecore,eap104
|
||||
DEVICE_PACKAGES := ath11k-wifi-edgecore-eap104 ath11k-firmware-ipq50xx-spruce ath11k-firmware-qcn6122
|
||||
DEVICE_DTS_CONFIG := config@mp03.5-c1
|
||||
endef
|
||||
TARGET_DEVICES += edgecore_eap104
|
||||
|
||||
define Device/qcom_mp03_1
|
||||
DEVICE_TITLE := Qualcomm Maple 03.1
|
||||
DEVICE_DTS := qcom-ipq5018-mp03.1
|
||||
|
||||
@@ -3,7 +3,7 @@ SUBTARGET:=ipq50xx
|
||||
BOARDNAME:=IPQ50XX
|
||||
CPU_TYPE:=cortex-a7
|
||||
|
||||
DEFAULT_PACKAGES += ath11k-firmware-ipq50xx qca-nss-fw-ipq50xx
|
||||
DEFAULT_PACKAGES += qca-nss-fw-ipq50xx
|
||||
|
||||
define Target/Description
|
||||
Build firmware image for IPQ50xx SoC devices.
|
||||
|
||||
14
feeds/ipq807x/ipq807x/patches/108-add-W25N01GW.patch
Normal file
14
feeds/ipq807x/ipq807x/patches/108-add-W25N01GW.patch
Normal file
@@ -0,0 +1,14 @@
|
||||
Index: linux-4.4.60-qsdk-11f09717303ecd83c3a64e9efe23f25921dc1016/drivers/mtd/nand/qcom_nandc.c
|
||||
===================================================================
|
||||
--- linux-4.4.60-qsdk-11f09717303ecd83c3a64e9efe23f25921dc1016.orig/drivers/mtd/nand/qcom_nandc.c
|
||||
+++ linux-4.4.60-qsdk-11f09717303ecd83c3a64e9efe23f25921dc1016/drivers/mtd/nand/qcom_nandc.c
|
||||
@@ -405,6 +405,9 @@ struct nand_flash_dev qspinand_flash_ids
|
||||
{"MX35UF1GE4AC SPI NAND 1G 1.8V",
|
||||
{ .id = {0xc2, 0x92} },
|
||||
SZ_2K, SZ_128, SZ_128K, 0, 2, 64, NAND_ECC_INFO(4, SZ_512), 0},
|
||||
+ {"W25N01GW SPI NAND 1.8V 1G-BIT",
|
||||
+ { .id = {0xef, 0xba} },
|
||||
+ SZ_2K, SZ_128, SZ_128K, 0, 2, 64, NAND_ECC_INFO(4, SZ_512), 0},
|
||||
{NULL}
|
||||
};
|
||||
|
||||
@@ -1,88 +0,0 @@
|
||||
From: Felix Fietkau <nbd@nbd.name>
|
||||
Date: Mon, 8 Feb 2021 11:34:08 -0800
|
||||
Subject: [PATCH] net: extract napi poll functionality to __napi_poll()
|
||||
|
||||
This commit introduces a new function __napi_poll() which does the main
|
||||
logic of the existing napi_poll() function, and will be called by other
|
||||
functions in later commits.
|
||||
This idea and implementation is done by Felix Fietkau <nbd@nbd.name> and
|
||||
is proposed as part of the patch to move napi work to work_queue
|
||||
context.
|
||||
This commit by itself is a code restructure.
|
||||
|
||||
Signed-off-by: Felix Fietkau <nbd@nbd.name>
|
||||
Signed-off-by: Wei Wang <weiwan@google.com>
|
||||
Reviewed-by: Alexander Duyck <alexanderduyck@fb.com>
|
||||
Signed-off-by: David S. Miller <davem@davemloft.net>
|
||||
---
|
||||
|
||||
--- a/net/core/dev.c
|
||||
+++ b/net/core/dev.c
|
||||
@@ -6322,15 +6322,10 @@ void netif_napi_del(struct napi_struct *
|
||||
}
|
||||
EXPORT_SYMBOL(netif_napi_del);
|
||||
|
||||
-static int napi_poll(struct napi_struct *n, struct list_head *repoll)
|
||||
+static int __napi_poll(struct napi_struct *n, bool *repoll)
|
||||
{
|
||||
- void *have;
|
||||
int work, weight;
|
||||
|
||||
- list_del_init(&n->poll_list);
|
||||
-
|
||||
- have = netpoll_poll_lock(n);
|
||||
-
|
||||
weight = n->weight;
|
||||
|
||||
/* This NAPI_STATE_SCHED test is for avoiding a race
|
||||
@@ -6348,7 +6343,7 @@ static int napi_poll(struct napi_struct
|
||||
WARN_ON_ONCE(work > weight);
|
||||
|
||||
if (likely(work < weight))
|
||||
- goto out_unlock;
|
||||
+ return work;
|
||||
|
||||
/* Drivers must not modify the NAPI state if they
|
||||
* consume the entire weight. In such cases this code
|
||||
@@ -6357,7 +6352,7 @@ static int napi_poll(struct napi_struct
|
||||
*/
|
||||
if (unlikely(napi_disable_pending(n))) {
|
||||
napi_complete(n);
|
||||
- goto out_unlock;
|
||||
+ return work;
|
||||
}
|
||||
|
||||
if (n->gro_bitmask) {
|
||||
@@ -6375,12 +6370,29 @@ static int napi_poll(struct napi_struct
|
||||
if (unlikely(!list_empty(&n->poll_list))) {
|
||||
pr_warn_once("%s: Budget exhausted after napi rescheduled\n",
|
||||
n->dev ? n->dev->name : "backlog");
|
||||
- goto out_unlock;
|
||||
+ return work;
|
||||
}
|
||||
|
||||
- list_add_tail(&n->poll_list, repoll);
|
||||
+ *repoll = true;
|
||||
+
|
||||
+ return work;
|
||||
+}
|
||||
+
|
||||
+static int napi_poll(struct napi_struct *n, struct list_head *repoll)
|
||||
+{
|
||||
+ bool do_repoll = false;
|
||||
+ void *have;
|
||||
+ int work;
|
||||
+
|
||||
+ list_del_init(&n->poll_list);
|
||||
+
|
||||
+ have = netpoll_poll_lock(n);
|
||||
+
|
||||
+ work = __napi_poll(n, &do_repoll);
|
||||
+
|
||||
+ if (do_repoll)
|
||||
+ list_add_tail(&n->poll_list, repoll);
|
||||
|
||||
-out_unlock:
|
||||
netpoll_poll_unlock(have);
|
||||
|
||||
return work;
|
||||
@@ -1,245 +0,0 @@
|
||||
From: Wei Wang <weiwan@google.com>
|
||||
Date: Mon, 8 Feb 2021 11:34:09 -0800
|
||||
Subject: [PATCH] net: implement threaded-able napi poll loop support
|
||||
|
||||
This patch allows running each napi poll loop inside its own
|
||||
kernel thread.
|
||||
The kthread is created during netif_napi_add() if dev->threaded
|
||||
is set. And threaded mode is enabled in napi_enable(). We will
|
||||
provide a way to set dev->threaded and enable threaded mode
|
||||
without a device up/down in the following patch.
|
||||
|
||||
Once that threaded mode is enabled and the kthread is
|
||||
started, napi_schedule() will wake-up such thread instead
|
||||
of scheduling the softirq.
|
||||
|
||||
The threaded poll loop behaves quite likely the net_rx_action,
|
||||
but it does not have to manipulate local irqs and uses
|
||||
an explicit scheduling point based on netdev_budget.
|
||||
|
||||
Co-developed-by: Paolo Abeni <pabeni@redhat.com>
|
||||
Signed-off-by: Paolo Abeni <pabeni@redhat.com>
|
||||
Co-developed-by: Hannes Frederic Sowa <hannes@stressinduktion.org>
|
||||
Signed-off-by: Hannes Frederic Sowa <hannes@stressinduktion.org>
|
||||
Co-developed-by: Jakub Kicinski <kuba@kernel.org>
|
||||
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
|
||||
Signed-off-by: Wei Wang <weiwan@google.com>
|
||||
Reviewed-by: Alexander Duyck <alexanderduyck@fb.com>
|
||||
Signed-off-by: David S. Miller <davem@davemloft.net>
|
||||
---
|
||||
|
||||
--- a/include/linux/netdevice.h
|
||||
+++ b/include/linux/netdevice.h
|
||||
@@ -319,6 +319,7 @@ struct napi_struct {
|
||||
struct list_head dev_list;
|
||||
struct hlist_node napi_hash_node;
|
||||
unsigned int napi_id;
|
||||
+ struct task_struct *thread;
|
||||
};
|
||||
|
||||
enum {
|
||||
@@ -326,6 +327,7 @@ enum {
|
||||
NAPI_STATE_DISABLE, /* Disable pending */
|
||||
NAPI_STATE_NPSVC, /* Netpoll - don't dequeue from poll_list */
|
||||
NAPI_STATE_HASHED, /* In NAPI hash */
|
||||
+ NAPI_STATE_THREADED, /* The poll is performed inside its own thread*/
|
||||
};
|
||||
|
||||
enum gro_result {
|
||||
@@ -501,13 +503,7 @@ void napi_disable(struct napi_struct *n)
|
||||
* Resume NAPI from being scheduled on this context.
|
||||
* Must be paired with napi_disable.
|
||||
*/
|
||||
-static inline void napi_enable(struct napi_struct *n)
|
||||
-{
|
||||
- BUG_ON(!test_bit(NAPI_STATE_SCHED, &n->state));
|
||||
- smp_mb__before_atomic();
|
||||
- clear_bit(NAPI_STATE_SCHED, &n->state);
|
||||
- clear_bit(NAPI_STATE_NPSVC, &n->state);
|
||||
-}
|
||||
+void napi_enable(struct napi_struct *n);
|
||||
|
||||
/**
|
||||
* napi_synchronize - wait until NAPI is not running
|
||||
@@ -1573,6 +1569,8 @@ enum netdev_priv_flags_ext {
|
||||
* switch driver and used to set the phys state of the
|
||||
* switch port.
|
||||
*
|
||||
+ * @threaded: napi threaded mode is enabled
|
||||
+ *
|
||||
* FIXME: cleanup struct net_device such that network protocol info
|
||||
* moves out.
|
||||
*/
|
||||
@@ -1852,6 +1850,7 @@ struct net_device {
|
||||
struct phy_device *phydev;
|
||||
struct lock_class_key *qdisc_tx_busylock;
|
||||
bool proto_down;
|
||||
+ unsigned threaded:1;
|
||||
};
|
||||
#define to_net_dev(d) container_of(d, struct net_device, dev)
|
||||
|
||||
--- a/net/core/dev.c
|
||||
+++ b/net/core/dev.c
|
||||
@@ -94,6 +94,7 @@
|
||||
#include <linux/ethtool.h>
|
||||
#include <linux/notifier.h>
|
||||
#include <linux/skbuff.h>
|
||||
+#include <linux/kthread.h>
|
||||
#include <net/net_namespace.h>
|
||||
#include <net/sock.h>
|
||||
#include <linux/rtnetlink.h>
|
||||
@@ -1304,6 +1305,27 @@ void netdev_notify_peers(struct net_devi
|
||||
}
|
||||
EXPORT_SYMBOL(netdev_notify_peers);
|
||||
|
||||
+static int napi_threaded_poll(void *data);
|
||||
+
|
||||
+static int napi_kthread_create(struct napi_struct *n)
|
||||
+{
|
||||
+ int err = 0;
|
||||
+
|
||||
+ /* Create and wake up the kthread once to put it in
|
||||
+ * TASK_INTERRUPTIBLE mode to avoid the blocked task
|
||||
+ * warning and work with loadavg.
|
||||
+ */
|
||||
+ n->thread = kthread_run(napi_threaded_poll, n, "napi/%s-%d",
|
||||
+ n->dev->name, n->napi_id);
|
||||
+ if (IS_ERR(n->thread)) {
|
||||
+ err = PTR_ERR(n->thread);
|
||||
+ pr_err("kthread_run failed with err %d\n", err);
|
||||
+ n->thread = NULL;
|
||||
+ }
|
||||
+
|
||||
+ return err;
|
||||
+}
|
||||
+
|
||||
static int __dev_open(struct net_device *dev)
|
||||
{
|
||||
const struct net_device_ops *ops = dev->netdev_ops;
|
||||
@@ -3248,6 +3270,21 @@ int weight_p __read_mostly = 64;
|
||||
static inline void ____napi_schedule(struct softnet_data *sd,
|
||||
struct napi_struct *napi)
|
||||
{
|
||||
+ struct task_struct *thread;
|
||||
+
|
||||
+ if (test_bit(NAPI_STATE_THREADED, &napi->state)) {
|
||||
+ /* Paired with smp_mb__before_atomic() in
|
||||
+ * napi_enable(). Use READ_ONCE() to guarantee
|
||||
+ * a complete read on napi->thread. Only call
|
||||
+ * wake_up_process() when it's not NULL.
|
||||
+ */
|
||||
+ thread = READ_ONCE(napi->thread);
|
||||
+ if (thread) {
|
||||
+ wake_up_process(thread);
|
||||
+ return;
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
list_add_tail(&napi->poll_list, &sd->poll_list);
|
||||
__raise_softirq_irqoff(NET_RX_SOFTIRQ);
|
||||
}
|
||||
@@ -4828,9 +4865,33 @@ void netif_napi_add(struct net_device *d
|
||||
napi->poll_owner = -1;
|
||||
#endif
|
||||
set_bit(NAPI_STATE_SCHED, &napi->state);
|
||||
+ /* Create kthread for this napi if dev->threaded is set.
|
||||
+ * Clear dev->threaded if kthread creation failed so that
|
||||
+ * threaded mode will not be enabled in napi_enable().
|
||||
+ */
|
||||
+ if (dev->threaded && napi_kthread_create(napi))
|
||||
+ dev->threaded = 0;
|
||||
}
|
||||
EXPORT_SYMBOL(netif_napi_add);
|
||||
|
||||
+/**
|
||||
+ * napi_enable - enable NAPI scheduling
|
||||
+ * @n: NAPI context
|
||||
+ *
|
||||
+ * Resume NAPI from being scheduled on this context.
|
||||
+ * Must be paired with napi_disable.
|
||||
+ */
|
||||
+void napi_enable(struct napi_struct *n)
|
||||
+{
|
||||
+ BUG_ON(!test_bit(NAPI_STATE_SCHED, &n->state));
|
||||
+ smp_mb__before_atomic();
|
||||
+ clear_bit(NAPI_STATE_SCHED, &n->state);
|
||||
+ clear_bit(NAPI_STATE_NPSVC, &n->state);
|
||||
+ if (n->dev->threaded && n->thread)
|
||||
+ set_bit(NAPI_STATE_THREADED, &n->state);
|
||||
+}
|
||||
+EXPORT_SYMBOL(napi_enable);
|
||||
+
|
||||
void napi_disable(struct napi_struct *n)
|
||||
{
|
||||
might_sleep();
|
||||
@@ -4844,6 +4905,7 @@ void napi_disable(struct napi_struct *n)
|
||||
hrtimer_cancel(&n->timer);
|
||||
|
||||
clear_bit(NAPI_STATE_DISABLE, &n->state);
|
||||
+ clear_bit(NAPI_STATE_THREADED, &n->state);
|
||||
}
|
||||
EXPORT_SYMBOL(napi_disable);
|
||||
|
||||
@@ -4855,6 +4917,11 @@ void netif_napi_del(struct napi_struct *
|
||||
kfree_skb_list(napi->gro_list);
|
||||
napi->gro_list = NULL;
|
||||
napi->gro_count = 0;
|
||||
+
|
||||
+ if (napi->thread) {
|
||||
+ kthread_stop(napi->thread);
|
||||
+ napi->thread = NULL;
|
||||
+ }
|
||||
}
|
||||
EXPORT_SYMBOL(netif_napi_del);
|
||||
|
||||
@@ -4940,6 +5007,50 @@ static int napi_poll(struct napi_struct
|
||||
return work;
|
||||
}
|
||||
|
||||
+static int napi_thread_wait(struct napi_struct *napi)
|
||||
+{
|
||||
+ set_current_state(TASK_INTERRUPTIBLE);
|
||||
+
|
||||
+ while (!kthread_should_stop() && !napi_disable_pending(napi)) {
|
||||
+ if (test_bit(NAPI_STATE_SCHED, &napi->state)) {
|
||||
+ WARN_ON(!list_empty(&napi->poll_list));
|
||||
+ __set_current_state(TASK_RUNNING);
|
||||
+ return 0;
|
||||
+ }
|
||||
+
|
||||
+ schedule();
|
||||
+ set_current_state(TASK_INTERRUPTIBLE);
|
||||
+ }
|
||||
+ __set_current_state(TASK_RUNNING);
|
||||
+ return -1;
|
||||
+}
|
||||
+
|
||||
+static int napi_threaded_poll(void *data)
|
||||
+{
|
||||
+ struct napi_struct *napi = data;
|
||||
+ void *have;
|
||||
+
|
||||
+ while (!napi_thread_wait(napi)) {
|
||||
+ for (;;) {
|
||||
+ bool repoll = false;
|
||||
+
|
||||
+ local_bh_disable();
|
||||
+
|
||||
+ have = netpoll_poll_lock(napi);
|
||||
+ __napi_poll(napi, &repoll);
|
||||
+ netpoll_poll_unlock(have);
|
||||
+
|
||||
+ local_bh_enable();
|
||||
+
|
||||
+ if (!repoll)
|
||||
+ break;
|
||||
+
|
||||
+ cond_resched();
|
||||
+ }
|
||||
+ }
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
static void net_rx_action(struct softirq_action *h)
|
||||
{
|
||||
struct softnet_data *sd = this_cpu_ptr(&softnet_data);
|
||||
@@ -1,156 +0,0 @@
|
||||
From: Wei Wang <weiwan@google.com>
|
||||
Date: Mon, 8 Feb 2021 11:34:10 -0800
|
||||
Subject: [PATCH] net: add sysfs attribute to control napi threaded mode
|
||||
|
||||
This patch adds a new sysfs attribute to the network device class.
|
||||
Said attribute provides a per-device control to enable/disable the
|
||||
threaded mode for all the napi instances of the given network device,
|
||||
without the need for a device up/down.
|
||||
User sets it to 1 or 0 to enable or disable threaded mode.
|
||||
Note: when switching between threaded and the current softirq based mode
|
||||
for a napi instance, it will not immediately take effect if the napi is
|
||||
currently being polled. The mode switch will happen for the next time
|
||||
napi_schedule() is called.
|
||||
|
||||
Co-developed-by: Paolo Abeni <pabeni@redhat.com>
|
||||
Signed-off-by: Paolo Abeni <pabeni@redhat.com>
|
||||
Co-developed-by: Hannes Frederic Sowa <hannes@stressinduktion.org>
|
||||
Signed-off-by: Hannes Frederic Sowa <hannes@stressinduktion.org>
|
||||
Co-developed-by: Felix Fietkau <nbd@nbd.name>
|
||||
Signed-off-by: Felix Fietkau <nbd@nbd.name>
|
||||
Signed-off-by: Wei Wang <weiwan@google.com>
|
||||
Reviewed-by: Alexander Duyck <alexanderduyck@fb.com>
|
||||
Signed-off-by: David S. Miller <davem@davemloft.net>
|
||||
---
|
||||
|
||||
--- a/include/linux/netdevice.h
|
||||
+++ b/include/linux/netdevice.h
|
||||
@@ -496,6 +496,8 @@ void napi_hash_del(struct napi_struct *n
|
||||
*/
|
||||
void napi_disable(struct napi_struct *n);
|
||||
|
||||
+int dev_set_threaded(struct net_device *dev, bool threaded);
|
||||
+
|
||||
/**
|
||||
* napi_enable - enable NAPI scheduling
|
||||
* @n: napi context
|
||||
--- a/net/core/dev.c
|
||||
+++ b/net/core/dev.c
|
||||
@@ -3274,8 +3274,9 @@ static inline void ____napi_schedule(str
|
||||
|
||||
if (test_bit(NAPI_STATE_THREADED, &napi->state)) {
|
||||
/* Paired with smp_mb__before_atomic() in
|
||||
- * napi_enable(). Use READ_ONCE() to guarantee
|
||||
- * a complete read on napi->thread. Only call
|
||||
+ * napi_enable()/dev_set_threaded().
|
||||
+ * Use READ_ONCE() to guarantee a complete
|
||||
+ * read on napi->thread. Only call
|
||||
* wake_up_process() when it's not NULL.
|
||||
*/
|
||||
thread = READ_ONCE(napi->thread);
|
||||
@@ -4844,6 +4845,49 @@ static enum hrtimer_restart napi_watchdo
|
||||
return HRTIMER_NORESTART;
|
||||
}
|
||||
|
||||
+int dev_set_threaded(struct net_device *dev, bool threaded)
|
||||
+{
|
||||
+ struct napi_struct *napi;
|
||||
+ int err = 0;
|
||||
+
|
||||
+ if (dev->threaded == threaded)
|
||||
+ return 0;
|
||||
+
|
||||
+ if (threaded) {
|
||||
+ list_for_each_entry(napi, &dev->napi_list, dev_list) {
|
||||
+ if (!napi->thread) {
|
||||
+ err = napi_kthread_create(napi);
|
||||
+ if (err) {
|
||||
+ threaded = false;
|
||||
+ break;
|
||||
+ }
|
||||
+ }
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ dev->threaded = threaded;
|
||||
+
|
||||
+ /* Make sure kthread is created before THREADED bit
|
||||
+ * is set.
|
||||
+ */
|
||||
+ smp_mb__before_atomic();
|
||||
+
|
||||
+ /* Setting/unsetting threaded mode on a napi might not immediately
|
||||
+ * take effect, if the current napi instance is actively being
|
||||
+ * polled. In this case, the switch between threaded mode and
|
||||
+ * softirq mode will happen in the next round of napi_schedule().
|
||||
+ * This should not cause hiccups/stalls to the live traffic.
|
||||
+ */
|
||||
+ list_for_each_entry(napi, &dev->napi_list, dev_list) {
|
||||
+ if (threaded)
|
||||
+ set_bit(NAPI_STATE_THREADED, &napi->state);
|
||||
+ else
|
||||
+ clear_bit(NAPI_STATE_THREADED, &napi->state);
|
||||
+ }
|
||||
+
|
||||
+ return err;
|
||||
+}
|
||||
+
|
||||
void netif_napi_add(struct net_device *dev, struct napi_struct *napi,
|
||||
int (*poll)(struct napi_struct *, int), int weight)
|
||||
{
|
||||
--- a/net/core/net-sysfs.c
|
||||
+++ b/net/core/net-sysfs.c
|
||||
@@ -486,6 +486,45 @@ static ssize_t phys_switch_id_show(struc
|
||||
}
|
||||
static DEVICE_ATTR_RO(phys_switch_id);
|
||||
|
||||
+static ssize_t threaded_show(struct device *dev,
|
||||
+ struct device_attribute *attr, char *buf)
|
||||
+{
|
||||
+ struct net_device *netdev = to_net_dev(dev);
|
||||
+ ssize_t ret = -EINVAL;
|
||||
+
|
||||
+ if (!rtnl_trylock())
|
||||
+ return restart_syscall();
|
||||
+
|
||||
+ if (dev_isalive(netdev))
|
||||
+ ret = sprintf(buf, fmt_dec, netdev->threaded);
|
||||
+
|
||||
+ rtnl_unlock();
|
||||
+ return ret;
|
||||
+}
|
||||
+
|
||||
+static int modify_napi_threaded(struct net_device *dev, unsigned long val)
|
||||
+{
|
||||
+ int ret;
|
||||
+
|
||||
+ if (list_empty(&dev->napi_list))
|
||||
+ return -EOPNOTSUPP;
|
||||
+
|
||||
+ if (val != 0 && val != 1)
|
||||
+ return -EOPNOTSUPP;
|
||||
+
|
||||
+ ret = dev_set_threaded(dev, val);
|
||||
+
|
||||
+ return ret;
|
||||
+}
|
||||
+
|
||||
+static ssize_t threaded_store(struct device *dev,
|
||||
+ struct device_attribute *attr,
|
||||
+ const char *buf, size_t len)
|
||||
+{
|
||||
+ return netdev_store(dev, attr, buf, len, modify_napi_threaded);
|
||||
+}
|
||||
+static DEVICE_ATTR_RW(threaded);
|
||||
+
|
||||
static struct attribute *net_class_attrs[] = {
|
||||
&dev_attr_netdev_group.attr,
|
||||
&dev_attr_type.attr,
|
||||
@@ -514,6 +553,7 @@ static struct attribute *net_class_attrs
|
||||
&dev_attr_phys_port_name.attr,
|
||||
&dev_attr_phys_switch_id.attr,
|
||||
&dev_attr_proto_down.attr,
|
||||
+ &dev_attr_threaded.attr,
|
||||
NULL,
|
||||
};
|
||||
ATTRIBUTE_GROUPS(net_class);
|
||||
@@ -1,75 +0,0 @@
|
||||
From: Wei Wang <weiwan@google.com>
|
||||
Date: Mon, 1 Mar 2021 17:21:13 -0800
|
||||
Subject: [PATCH] net: fix race between napi kthread mode and busy poll
|
||||
|
||||
Currently, napi_thread_wait() checks for NAPI_STATE_SCHED bit to
|
||||
determine if the kthread owns this napi and could call napi->poll() on
|
||||
it. However, if socket busy poll is enabled, it is possible that the
|
||||
busy poll thread grabs this SCHED bit (after the previous napi->poll()
|
||||
invokes napi_complete_done() and clears SCHED bit) and tries to poll
|
||||
on the same napi. napi_disable() could grab the SCHED bit as well.
|
||||
This patch tries to fix this race by adding a new bit
|
||||
NAPI_STATE_SCHED_THREADED in napi->state. This bit gets set in
|
||||
____napi_schedule() if the threaded mode is enabled, and gets cleared
|
||||
in napi_complete_done(), and we only poll the napi in kthread if this
|
||||
bit is set. This helps distinguish the ownership of the napi between
|
||||
kthread and other scenarios and fixes the race issue.
|
||||
|
||||
Fixes: 29863d41bb6e ("net: implement threaded-able napi poll loop support")
|
||||
Reported-by: Martin Zaharinov <micron10@gmail.com>
|
||||
Suggested-by: Jakub Kicinski <kuba@kernel.org>
|
||||
Signed-off-by: Wei Wang <weiwan@google.com>
|
||||
Cc: Alexander Duyck <alexanderduyck@fb.com>
|
||||
Cc: Eric Dumazet <edumazet@google.com>
|
||||
Cc: Paolo Abeni <pabeni@redhat.com>
|
||||
Cc: Hannes Frederic Sowa <hannes@stressinduktion.org>
|
||||
---
|
||||
|
||||
--- a/include/linux/netdevice.h
|
||||
+++ b/include/linux/netdevice.h
|
||||
@@ -328,6 +328,7 @@ enum {
|
||||
NAPI_STATE_NPSVC, /* Netpoll - don't dequeue from poll_list */
|
||||
NAPI_STATE_HASHED, /* In NAPI hash */
|
||||
NAPI_STATE_THREADED, /* The poll is performed inside its own thread*/
|
||||
+ NAPI_STATE_SCHED_THREADED, /* Napi is currently scheduled in threaded mode */
|
||||
};
|
||||
|
||||
enum gro_result {
|
||||
--- a/net/core/dev.c
|
||||
+++ b/net/core/dev.c
|
||||
@@ -3281,6 +3281,8 @@ static inline void ____napi_schedule(str
|
||||
*/
|
||||
thread = READ_ONCE(napi->thread);
|
||||
if (thread) {
|
||||
+ if (thread->state != TASK_INTERRUPTIBLE)
|
||||
+ set_bit(NAPI_STATE_SCHED_THREADED, &napi->state);
|
||||
wake_up_process(thread);
|
||||
return;
|
||||
}
|
||||
@@ -5053,16 +5055,25 @@ static int napi_poll(struct napi_struct
|
||||
|
||||
static int napi_thread_wait(struct napi_struct *napi)
|
||||
{
|
||||
+ bool woken = false;
|
||||
+
|
||||
set_current_state(TASK_INTERRUPTIBLE);
|
||||
|
||||
while (!kthread_should_stop() && !napi_disable_pending(napi)) {
|
||||
- if (test_bit(NAPI_STATE_SCHED, &napi->state)) {
|
||||
+ /* Testing SCHED_THREADED bit here to make sure the current
|
||||
+ * kthread owns this napi and could poll on this napi.
|
||||
+ * Testing SCHED bit is not enough because SCHED bit might be
|
||||
+ * set by some other busy poll thread or by napi_disable().
|
||||
+ */
|
||||
+ if (test_bit(NAPI_STATE_SCHED_THREADED, &napi->state) || woken) {
|
||||
WARN_ON(!list_empty(&napi->poll_list));
|
||||
__set_current_state(TASK_RUNNING);
|
||||
return 0;
|
||||
}
|
||||
|
||||
schedule();
|
||||
+ /* woken being true indicates this thread owns this napi. */
|
||||
+ woken = true;
|
||||
set_current_state(TASK_INTERRUPTIBLE);
|
||||
}
|
||||
__set_current_state(TASK_RUNNING);
|
||||
@@ -1,53 +0,0 @@
|
||||
From: Paolo Abeni <pabeni@redhat.com>
|
||||
Date: Fri, 9 Apr 2021 17:24:17 +0200
|
||||
Subject: [PATCH] net: fix hangup on napi_disable for threaded napi
|
||||
|
||||
napi_disable() is subject to an hangup, when the threaded
|
||||
mode is enabled and the napi is under heavy traffic.
|
||||
|
||||
If the relevant napi has been scheduled and the napi_disable()
|
||||
kicks in before the next napi_threaded_wait() completes - so
|
||||
that the latter quits due to the napi_disable_pending() condition,
|
||||
the existing code leaves the NAPI_STATE_SCHED bit set and the
|
||||
napi_disable() loop waiting for such bit will hang.
|
||||
|
||||
This patch addresses the issue by dropping the NAPI_STATE_DISABLE
|
||||
bit test in napi_thread_wait(). The later napi_threaded_poll()
|
||||
iteration will take care of clearing the NAPI_STATE_SCHED.
|
||||
|
||||
This also addresses a related problem reported by Jakub:
|
||||
before this patch a napi_disable()/napi_enable() pair killed
|
||||
the napi thread, effectively disabling the threaded mode.
|
||||
On the patched kernel napi_disable() simply stops scheduling
|
||||
the relevant thread.
|
||||
|
||||
v1 -> v2:
|
||||
- let the main napi_thread_poll() loop clear the SCHED bit
|
||||
|
||||
Reported-by: Jakub Kicinski <kuba@kernel.org>
|
||||
Fixes: 29863d41bb6e ("net: implement threaded-able napi poll loop support")
|
||||
Signed-off-by: Paolo Abeni <pabeni@redhat.com>
|
||||
Reviewed-by: Eric Dumazet <edumazet@google.com>
|
||||
Link: https://lore.kernel.org/r/883923fa22745a9589e8610962b7dc59df09fb1f.1617981844.git.pabeni@redhat.com
|
||||
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
|
||||
---
|
||||
|
||||
--- a/net/core/dev.c
|
||||
+++ b/net/core/dev.c
|
||||
@@ -5059,7 +5059,7 @@ static int napi_thread_wait(struct napi_
|
||||
|
||||
set_current_state(TASK_INTERRUPTIBLE);
|
||||
|
||||
- while (!kthread_should_stop() && !napi_disable_pending(napi)) {
|
||||
+ while (!kthread_should_stop()) {
|
||||
/* Testing SCHED_THREADED bit here to make sure the current
|
||||
* kthread owns this napi and could poll on this napi.
|
||||
* Testing SCHED bit is not enough because SCHED bit might be
|
||||
@@ -5077,6 +5077,7 @@ static int napi_thread_wait(struct napi_
|
||||
set_current_state(TASK_INTERRUPTIBLE);
|
||||
}
|
||||
__set_current_state(TASK_RUNNING);
|
||||
+
|
||||
return -1;
|
||||
}
|
||||
|
||||
@@ -7,12 +7,15 @@ boot() {
|
||||
. /lib/functions.sh
|
||||
mkdir -p /certificates /etc/ucentral/
|
||||
local mtd=$(find_mtd_index certificates)
|
||||
[ -n "$mtd" -a -f /sys/class/mtd/mtd$mtd/oobsize ] && ubiattach -p /dev/mtd$mtd
|
||||
if [ -n "$(ubinfo -a | grep certificates)" ]; then
|
||||
[ -e /dev/ubi0 ] && mount -t ubifs ubi0:certificates /certificates
|
||||
[ -e /dev/ubi1 ] && mount -t ubifs ubi1:certificates /certificates
|
||||
else
|
||||
|
||||
if [ "$(head -c 4 /dev/mtd$mtd)" == "hsqs" ]; then
|
||||
mount -t squashfs /dev/mtdblock$mtd /certificates
|
||||
else
|
||||
[ -n "$mtd" -a -f /sys/class/mtd/mtd$mtd/oobsize ] && ubiattach -p /dev/mtd$mtd
|
||||
if [ -n "$(ubinfo -a | grep certificates)" ]; then
|
||||
[ -e /dev/ubi0 ] && mount -t ubifs ubi0:certificates /certificates
|
||||
[ -e /dev/ubi1 ] && mount -t ubifs ubi1:certificates /certificates
|
||||
fi
|
||||
fi
|
||||
[ -f /certificates/dev-id ] && {
|
||||
cp /certificates/*.pem /etc/ucentral/
|
||||
|
||||
@@ -6,7 +6,7 @@ PKG_RELEASE:=1
|
||||
PKG_SOURCE_URL=https://github.com/blogic/ucentral-schema.git
|
||||
PKG_SOURCE_PROTO:=git
|
||||
PKG_SOURCE_DATE:=2022-01-17
|
||||
PKG_SOURCE_VERSION:=07cb6e9fc7a4a8f9868e6efd29edcaf1f3245716
|
||||
PKG_SOURCE_VERSION:=1c4654498b0fbb36f158d1370d3a283d984e746b
|
||||
|
||||
PKG_MAINTAINER:=John Crispin <john@phrozen.org>
|
||||
PKG_LICENSE:=BSD-3-Clause
|
||||
|
||||
@@ -3,12 +3,12 @@
|
||||
"radios": [
|
||||
{
|
||||
"band": "2G",
|
||||
"country": "CA",
|
||||
"country": "US",
|
||||
"channel-mode": "HE",
|
||||
"channel-width": 40
|
||||
}, {
|
||||
"band": "5G",
|
||||
"country": "CA",
|
||||
"country": "US",
|
||||
"channel-mode": "HE",
|
||||
"channel-width": 80
|
||||
}
|
||||
|
||||
13
feeds/ucentral/ucentral-schema/files/usr/bin/tcpdump_timeout
Executable file
13
feeds/ucentral/ucentral-schema/files/usr/bin/tcpdump_timeout
Executable file
@@ -0,0 +1,13 @@
|
||||
#!/bin/sh
|
||||
|
||||
n=$1
|
||||
shift
|
||||
|
||||
if [ $n -eq 0]; then
|
||||
tcpdump $@
|
||||
else
|
||||
tcpdump $@ &
|
||||
x=$!
|
||||
sleep $n
|
||||
kill $x
|
||||
fi
|
||||
@@ -0,0 +1,16 @@
|
||||
#!/usr/bin/ucode -R
|
||||
|
||||
let nl = require("nl80211");
|
||||
let def = nl.const;
|
||||
|
||||
function phy_get() {
|
||||
let res = nl.request(def.NL80211_CMD_GET_WIPHY, def.NLM_F_DUMP, { split_wiphy_dump: true });
|
||||
|
||||
if (res === false)
|
||||
warn("Unable to lookup phys: " + nl.error() + "\n");
|
||||
|
||||
return res;
|
||||
}
|
||||
|
||||
let phys = phy_get();
|
||||
printf("%d\n", phys[0].max_ap_assoc);
|
||||
@@ -1,15 +1,15 @@
|
||||
From 1c89014c7c0e68e1eeb851ea538fb67a57988dd4 Mon Sep 17 00:00:00 2001
|
||||
From eac420899717e2d23f6d13304bd67278a7e91730 Mon Sep 17 00:00:00 2001
|
||||
From: John Crispin <john@phrozen.org>
|
||||
Date: Thu, 20 Jan 2022 10:48:35 +0100
|
||||
Subject: [PATCH 1/2] fixes
|
||||
|
||||
---
|
||||
lib/nl80211.c | 73 +++++++++++++++++++++++++++++++++++++++++++++++----
|
||||
lib/nl80211.c | 76 +++++++++++++++++++++++++++++++++++++++++++++++----
|
||||
lib/rtnl.c | 1 +
|
||||
2 files changed, 69 insertions(+), 5 deletions(-)
|
||||
2 files changed, 71 insertions(+), 6 deletions(-)
|
||||
|
||||
diff --git a/lib/nl80211.c b/lib/nl80211.c
|
||||
index fc24fb8..e308ebc 100644
|
||||
index fc24fb8..1d0871a 100644
|
||||
--- a/lib/nl80211.c
|
||||
+++ b/lib/nl80211.c
|
||||
@@ -45,6 +45,8 @@ limitations under the License.
|
||||
@@ -132,7 +132,7 @@ index fc24fb8..e308ebc 100644
|
||||
.attrs = {
|
||||
{ NL80211_STA_INFO_INACTIVE_TIME, "inactive_time", DT_U32, 0, NULL },
|
||||
{ NL80211_STA_INFO_RX_BYTES, "rx_bytes", DT_U32, 0, NULL },
|
||||
@@ -724,15 +783,16 @@ static const uc_nl_nested_spec_t nl80211_sta_info_nla = {
|
||||
@@ -724,21 +783,22 @@ static const uc_nl_nested_spec_t nl80211_sta_info_nla = {
|
||||
{ NL80211_STA_INFO_NONPEER_PM, "nonpeer_pm", DT_U32, 0, NULL },
|
||||
{ NL80211_STA_INFO_CHAIN_SIGNAL, "chain_signal", DT_S8, DF_MULTIPLE|DF_AUTOIDX, NULL },
|
||||
{ NL80211_STA_INFO_CHAIN_SIGNAL_AVG, "chain_signal_avg", DT_S8, DF_MULTIPLE|DF_AUTOIDX, NULL },
|
||||
@@ -152,7 +152,22 @@ index fc24fb8..e308ebc 100644
|
||||
}
|
||||
};
|
||||
|
||||
@@ -1044,6 +1104,9 @@ uc_nl_parse_attrs(struct nl_msg *msg, char *base, const uc_nl_attr_spec_t *attrs
|
||||
static const uc_nl_nested_spec_t nl80211_msg = {
|
||||
.headsize = 0,
|
||||
- .nattrs = 124,
|
||||
+ .nattrs = 125,
|
||||
.attrs = {
|
||||
{ NL80211_ATTR_4ADDR, "4addr", DT_U8, 0, NULL },
|
||||
{ NL80211_ATTR_AIRTIME_WEIGHT, "airtime_weight", DT_U16, 0, NULL },
|
||||
@@ -864,6 +924,7 @@ static const uc_nl_nested_spec_t nl80211_msg = {
|
||||
{ NL80211_ATTR_WPA_VERSIONS, "wpa_versions", DT_U32, 0, NULL },
|
||||
{ NL80211_ATTR_SUPPORTED_IFTYPES, "supported_iftypes", DT_NESTED, 0, &nl80211_ifcomb_limit_types_nla },
|
||||
{ NL80211_ATTR_SOFTWARE_IFTYPES, "software_iftypes", DT_NESTED, 0, &nl80211_ifcomb_limit_types_nla },
|
||||
+ { NL80211_ATTR_MAX_AP_ASSOC_STA, "max_ap_assoc", DT_U16, 0, NULL },
|
||||
}
|
||||
};
|
||||
|
||||
@@ -1044,6 +1105,9 @@ uc_nl_parse_attrs(struct nl_msg *msg, char *base, const uc_nl_attr_spec_t *attrs
|
||||
bool exists;
|
||||
|
||||
for (i = 0; i < nattrs; i++) {
|
||||
|
||||
@@ -20,6 +20,12 @@ $(Package/ath11k-firmware-default)
|
||||
DEPENDS:=@TARGET_ipq807x_ipq50xx
|
||||
endef
|
||||
|
||||
define Package/ath11k-firmware-ipq50xx-spruce
|
||||
$(Package/ath11k-firmware-default)
|
||||
TITLE:=ath11k firmware for IPQ50xx devices with spruce
|
||||
DEPENDS:=@TARGET_ipq807x_ipq50xx
|
||||
endef
|
||||
|
||||
define Package/ath11k-firmware-ipq60xx
|
||||
$(Package/ath11k-firmware-default)
|
||||
TITLE:=ath11k firmware for IPQ60xx devices
|
||||
@@ -48,6 +54,10 @@ define Package/ath11k-firmware-ipq50xx/description
|
||||
Standard ath11k firmware for IPQ50xx from QCA
|
||||
endef
|
||||
|
||||
define Package/ath11k-firmware-ipq50xx-spruce/description
|
||||
Standard ath11k firmware for IPQ50xx/spruce from QCA
|
||||
endef
|
||||
|
||||
define Package/ath11k-firmware-ipq60xx/description
|
||||
Standard ath11k firmware for IPQ60xx from QCA
|
||||
endef
|
||||
@@ -74,6 +84,12 @@ define Package/ath11k-firmware-ipq50xx/install
|
||||
$(1)/lib/firmware/IPQ5018/
|
||||
endef
|
||||
|
||||
define Package/ath11k-firmware-ipq50xx-spruce/install
|
||||
$(INSTALL_DIR) $(1)/lib/firmware/IPQ5018
|
||||
$(INSTALL_DATA) ./files/IPQ5018_spruce/* \
|
||||
$(1)/lib/firmware/IPQ5018/
|
||||
endef
|
||||
|
||||
define Package/ath11k-firmware-ipq60xx/install
|
||||
$(INSTALL_DIR) $(1)/lib/firmware/IPQ6018
|
||||
$(INSTALL_DATA) ./files/IPQ6018/* \
|
||||
@@ -87,6 +103,7 @@ define Package/ath11k-firmware-ipq807x/install
|
||||
endef
|
||||
|
||||
define Package/ath11k-firmware-qcn6122/install
|
||||
$(INSTALL_DIR) $(1)/lib/firmware/ath11k/qcn6122
|
||||
$(INSTALL_DIR) $(1)/lib/firmware/qcn6122
|
||||
$(INSTALL_DATA) ./files/QCN6122/* \
|
||||
$(1)/lib/firmware/qcn6122/
|
||||
@@ -99,6 +116,7 @@ define Package/ath11k-firmware-qcn9000/install
|
||||
endef
|
||||
|
||||
$(eval $(call BuildPackage,ath11k-firmware-ipq50xx))
|
||||
$(eval $(call BuildPackage,ath11k-firmware-ipq50xx-spruce))
|
||||
$(eval $(call BuildPackage,ath11k-firmware-ipq60xx))
|
||||
$(eval $(call BuildPackage,ath11k-firmware-ipq807x))
|
||||
$(eval $(call BuildPackage,ath11k-firmware-qcn6122))
|
||||
|
||||
Binary file not shown.
@@ -0,0 +1 @@
|
||||
WLAN.HK.2.5.r4-00745-QCAHKSWPL_SILICONZ-1 v1
|
||||
BIN
feeds/wifi-ax/ath11k-firmware/files/IPQ5018_spruce/m3_fw.b00
Normal file
BIN
feeds/wifi-ax/ath11k-firmware/files/IPQ5018_spruce/m3_fw.b00
Normal file
Binary file not shown.
BIN
feeds/wifi-ax/ath11k-firmware/files/IPQ5018_spruce/m3_fw.b01
Normal file
BIN
feeds/wifi-ax/ath11k-firmware/files/IPQ5018_spruce/m3_fw.b01
Normal file
Binary file not shown.
BIN
feeds/wifi-ax/ath11k-firmware/files/IPQ5018_spruce/m3_fw.b02
Normal file
BIN
feeds/wifi-ax/ath11k-firmware/files/IPQ5018_spruce/m3_fw.b02
Normal file
Binary file not shown.
@@ -0,0 +1,3 @@
|
||||
build/ms/bin/5018.wlanfw2.map_spr_spr_eval_cs/PIL_IMAGES/m3_fw.b00
|
||||
build/ms/bin/5018.wlanfw2.map_spr_spr_eval_cs/PIL_IMAGES/m3_fw.b01
|
||||
build/ms/bin/5018.wlanfw2.map_spr_spr_eval_cs/PIL_IMAGES/m3_fw.b02
|
||||
BIN
feeds/wifi-ax/ath11k-firmware/files/IPQ5018_spruce/m3_fw.mdt
Normal file
BIN
feeds/wifi-ax/ath11k-firmware/files/IPQ5018_spruce/m3_fw.mdt
Normal file
Binary file not shown.
BIN
feeds/wifi-ax/ath11k-firmware/files/IPQ5018_spruce/mpnv10.bin
Normal file
BIN
feeds/wifi-ax/ath11k-firmware/files/IPQ5018_spruce/mpnv10.bin
Normal file
Binary file not shown.
BIN
feeds/wifi-ax/ath11k-firmware/files/IPQ5018_spruce/q6_fw.b00
Normal file
BIN
feeds/wifi-ax/ath11k-firmware/files/IPQ5018_spruce/q6_fw.b00
Normal file
Binary file not shown.
BIN
feeds/wifi-ax/ath11k-firmware/files/IPQ5018_spruce/q6_fw.b01
Normal file
BIN
feeds/wifi-ax/ath11k-firmware/files/IPQ5018_spruce/q6_fw.b01
Normal file
Binary file not shown.
BIN
feeds/wifi-ax/ath11k-firmware/files/IPQ5018_spruce/q6_fw.b02
Normal file
BIN
feeds/wifi-ax/ath11k-firmware/files/IPQ5018_spruce/q6_fw.b02
Normal file
Binary file not shown.
BIN
feeds/wifi-ax/ath11k-firmware/files/IPQ5018_spruce/q6_fw.b03
Normal file
BIN
feeds/wifi-ax/ath11k-firmware/files/IPQ5018_spruce/q6_fw.b03
Normal file
Binary file not shown.
BIN
feeds/wifi-ax/ath11k-firmware/files/IPQ5018_spruce/q6_fw.b04
Normal file
BIN
feeds/wifi-ax/ath11k-firmware/files/IPQ5018_spruce/q6_fw.b04
Normal file
Binary file not shown.
BIN
feeds/wifi-ax/ath11k-firmware/files/IPQ5018_spruce/q6_fw.b05
Normal file
BIN
feeds/wifi-ax/ath11k-firmware/files/IPQ5018_spruce/q6_fw.b05
Normal file
Binary file not shown.
BIN
feeds/wifi-ax/ath11k-firmware/files/IPQ5018_spruce/q6_fw.b07
Normal file
BIN
feeds/wifi-ax/ath11k-firmware/files/IPQ5018_spruce/q6_fw.b07
Normal file
Binary file not shown.
BIN
feeds/wifi-ax/ath11k-firmware/files/IPQ5018_spruce/q6_fw.b08
Normal file
BIN
feeds/wifi-ax/ath11k-firmware/files/IPQ5018_spruce/q6_fw.b08
Normal file
Binary file not shown.
BIN
feeds/wifi-ax/ath11k-firmware/files/IPQ5018_spruce/q6_fw.b09
Normal file
BIN
feeds/wifi-ax/ath11k-firmware/files/IPQ5018_spruce/q6_fw.b09
Normal file
Binary file not shown.
BIN
feeds/wifi-ax/ath11k-firmware/files/IPQ5018_spruce/q6_fw.b10
Normal file
BIN
feeds/wifi-ax/ath11k-firmware/files/IPQ5018_spruce/q6_fw.b10
Normal file
Binary file not shown.
BIN
feeds/wifi-ax/ath11k-firmware/files/IPQ5018_spruce/q6_fw.b11
Normal file
BIN
feeds/wifi-ax/ath11k-firmware/files/IPQ5018_spruce/q6_fw.b11
Normal file
Binary file not shown.
BIN
feeds/wifi-ax/ath11k-firmware/files/IPQ5018_spruce/q6_fw.b13
Normal file
BIN
feeds/wifi-ax/ath11k-firmware/files/IPQ5018_spruce/q6_fw.b13
Normal file
Binary file not shown.
BIN
feeds/wifi-ax/ath11k-firmware/files/IPQ5018_spruce/q6_fw.b14
Normal file
BIN
feeds/wifi-ax/ath11k-firmware/files/IPQ5018_spruce/q6_fw.b14
Normal file
Binary file not shown.
BIN
feeds/wifi-ax/ath11k-firmware/files/IPQ5018_spruce/q6_fw.b15
Normal file
BIN
feeds/wifi-ax/ath11k-firmware/files/IPQ5018_spruce/q6_fw.b15
Normal file
Binary file not shown.
BIN
feeds/wifi-ax/ath11k-firmware/files/IPQ5018_spruce/q6_fw.b16
Normal file
BIN
feeds/wifi-ax/ath11k-firmware/files/IPQ5018_spruce/q6_fw.b16
Normal file
Binary file not shown.
BIN
feeds/wifi-ax/ath11k-firmware/files/IPQ5018_spruce/q6_fw.b17
Normal file
BIN
feeds/wifi-ax/ath11k-firmware/files/IPQ5018_spruce/q6_fw.b17
Normal file
Binary file not shown.
BIN
feeds/wifi-ax/ath11k-firmware/files/IPQ5018_spruce/q6_fw.b18
Normal file
BIN
feeds/wifi-ax/ath11k-firmware/files/IPQ5018_spruce/q6_fw.b18
Normal file
Binary file not shown.
BIN
feeds/wifi-ax/ath11k-firmware/files/IPQ5018_spruce/q6_fw.b20
Normal file
BIN
feeds/wifi-ax/ath11k-firmware/files/IPQ5018_spruce/q6_fw.b20
Normal file
Binary file not shown.
BIN
feeds/wifi-ax/ath11k-firmware/files/IPQ5018_spruce/q6_fw.b21
Normal file
BIN
feeds/wifi-ax/ath11k-firmware/files/IPQ5018_spruce/q6_fw.b21
Normal file
Binary file not shown.
BIN
feeds/wifi-ax/ath11k-firmware/files/IPQ5018_spruce/q6_fw.b22
Normal file
BIN
feeds/wifi-ax/ath11k-firmware/files/IPQ5018_spruce/q6_fw.b22
Normal file
Binary file not shown.
BIN
feeds/wifi-ax/ath11k-firmware/files/IPQ5018_spruce/q6_fw.b23
Normal file
BIN
feeds/wifi-ax/ath11k-firmware/files/IPQ5018_spruce/q6_fw.b23
Normal file
Binary file not shown.
BIN
feeds/wifi-ax/ath11k-firmware/files/IPQ5018_spruce/q6_fw.b25
Normal file
BIN
feeds/wifi-ax/ath11k-firmware/files/IPQ5018_spruce/q6_fw.b25
Normal file
Binary file not shown.
BIN
feeds/wifi-ax/ath11k-firmware/files/IPQ5018_spruce/q6_fw.b26
Normal file
BIN
feeds/wifi-ax/ath11k-firmware/files/IPQ5018_spruce/q6_fw.b26
Normal file
Binary file not shown.
@@ -0,0 +1,23 @@
|
||||
build/ms/bin/5018.wlanfw2.map_spr_spr_eval_cs/PIL_IMAGES/q6_fw.b00
|
||||
build/ms/bin/5018.wlanfw2.map_spr_spr_eval_cs/PIL_IMAGES/q6_fw.b01
|
||||
build/ms/bin/5018.wlanfw2.map_spr_spr_eval_cs/PIL_IMAGES/q6_fw.b02
|
||||
build/ms/bin/5018.wlanfw2.map_spr_spr_eval_cs/PIL_IMAGES/q6_fw.b03
|
||||
build/ms/bin/5018.wlanfw2.map_spr_spr_eval_cs/PIL_IMAGES/q6_fw.b04
|
||||
build/ms/bin/5018.wlanfw2.map_spr_spr_eval_cs/PIL_IMAGES/q6_fw.b05
|
||||
build/ms/bin/5018.wlanfw2.map_spr_spr_eval_cs/PIL_IMAGES/q6_fw.b07
|
||||
build/ms/bin/5018.wlanfw2.map_spr_spr_eval_cs/PIL_IMAGES/q6_fw.b08
|
||||
build/ms/bin/5018.wlanfw2.map_spr_spr_eval_cs/PIL_IMAGES/q6_fw.b09
|
||||
build/ms/bin/5018.wlanfw2.map_spr_spr_eval_cs/PIL_IMAGES/q6_fw.b10
|
||||
build/ms/bin/5018.wlanfw2.map_spr_spr_eval_cs/PIL_IMAGES/q6_fw.b11
|
||||
build/ms/bin/5018.wlanfw2.map_spr_spr_eval_cs/PIL_IMAGES/q6_fw.b13
|
||||
build/ms/bin/5018.wlanfw2.map_spr_spr_eval_cs/PIL_IMAGES/q6_fw.b14
|
||||
build/ms/bin/5018.wlanfw2.map_spr_spr_eval_cs/PIL_IMAGES/q6_fw.b15
|
||||
build/ms/bin/5018.wlanfw2.map_spr_spr_eval_cs/PIL_IMAGES/q6_fw.b16
|
||||
build/ms/bin/5018.wlanfw2.map_spr_spr_eval_cs/PIL_IMAGES/q6_fw.b17
|
||||
build/ms/bin/5018.wlanfw2.map_spr_spr_eval_cs/PIL_IMAGES/q6_fw.b18
|
||||
build/ms/bin/5018.wlanfw2.map_spr_spr_eval_cs/PIL_IMAGES/q6_fw.b20
|
||||
build/ms/bin/5018.wlanfw2.map_spr_spr_eval_cs/PIL_IMAGES/q6_fw.b21
|
||||
build/ms/bin/5018.wlanfw2.map_spr_spr_eval_cs/PIL_IMAGES/q6_fw.b22
|
||||
build/ms/bin/5018.wlanfw2.map_spr_spr_eval_cs/PIL_IMAGES/q6_fw.b23
|
||||
build/ms/bin/5018.wlanfw2.map_spr_spr_eval_cs/PIL_IMAGES/q6_fw.b25
|
||||
build/ms/bin/5018.wlanfw2.map_spr_spr_eval_cs/PIL_IMAGES/q6_fw.b26
|
||||
BIN
feeds/wifi-ax/ath11k-firmware/files/IPQ5018_spruce/q6_fw.mdt
Normal file
BIN
feeds/wifi-ax/ath11k-firmware/files/IPQ5018_spruce/q6_fw.mdt
Normal file
Binary file not shown.
@@ -33,6 +33,7 @@ ALLWIFIBOARDS:= \
|
||||
edgecore-eap101 \
|
||||
sercomm-wallaby \
|
||||
edgecore-eap102 \
|
||||
edgecore-eap104 \
|
||||
wallys-dr6018 \
|
||||
wallys-dr6018-v4 \
|
||||
tplink-ex227 \
|
||||
@@ -96,6 +97,9 @@ define ath11k-wifi-install-one
|
||||
$(if $(filter $(suffix $(1)),.QCN9074),\
|
||||
$(call ath11k-wifi-install-one-to,$(1),$(2),ath11k/QCN9074/hw1.0/),\
|
||||
)
|
||||
$(if $(filter $(suffix $(1)),.QCN6122),\
|
||||
$(call ath11k-wifi-install-one-to,$(1),$(2),ath11k/qcn6122/hw1.0/),\
|
||||
)
|
||||
|
||||
endef
|
||||
# Blank line required at end of above define due to foreach context
|
||||
@@ -168,6 +172,7 @@ $(eval $(call generate-ath11k-wifi-package,wallys-dr6018,Wallys DR6018))
|
||||
$(eval $(call generate-ath11k-wifi-package,wallys-dr6018-v4,Wallys DR6018 V4))
|
||||
$(eval $(call generate-ath11k-wifi-package,edgecore-eap101,EdgeCore EAP101))
|
||||
$(eval $(call generate-ath11k-wifi-package,edgecore-eap102,Edgecore EAP102))
|
||||
$(eval $(call generate-ath11k-wifi-package,edgecore-eap104,Edgecore EAP104))
|
||||
$(eval $(call generate-ath11k-wifi-package,tplink-ex227,TP-Link EX227))
|
||||
$(eval $(call generate-ath11k-wifi-package,tplink-ex447,TP-Link EX447))
|
||||
|
||||
|
||||
BIN
feeds/wifi-ax/ath11k-wifi/board-edgecore-eap104.bin.IPQ5018
Normal file
BIN
feeds/wifi-ax/ath11k-wifi/board-edgecore-eap104.bin.IPQ5018
Normal file
Binary file not shown.
BIN
feeds/wifi-ax/ath11k-wifi/board-edgecore-eap104.bin.QCN6122
Normal file
BIN
feeds/wifi-ax/ath11k-wifi/board-edgecore-eap104.bin.QCN6122
Normal file
Binary file not shown.
@@ -60,7 +60,7 @@ CONFIG_RSN_PREAUTH=y
|
||||
CONFIG_EAP=y
|
||||
|
||||
# EAP Re-authentication Protocol (ERP) in integrated EAP server
|
||||
#CONFIG_ERP=y
|
||||
CONFIG_ERP=y
|
||||
|
||||
# EAP-MD5 for the integrated EAP server
|
||||
CONFIG_EAP_MD5=y
|
||||
|
||||
@@ -727,7 +727,7 @@ hostapd_set_bss_options() {
|
||||
wps_not_configured=1
|
||||
[ "$macfilter" = radius ] && {
|
||||
append_radius_server
|
||||
vlan_possible = 1
|
||||
vlan_possible=1
|
||||
}
|
||||
;;
|
||||
psk|sae|psk-sae)
|
||||
|
||||
15
feeds/wifi-ax/hostapd/patches/760-acs_exclude_dfs.patch
Normal file
15
feeds/wifi-ax/hostapd/patches/760-acs_exclude_dfs.patch
Normal file
@@ -0,0 +1,15 @@
|
||||
Index: hostapd-2021-02-20-59e9794c/src/ap/acs.c
|
||||
===================================================================
|
||||
--- hostapd-2021-02-20-59e9794c.orig/src/ap/acs.c
|
||||
+++ hostapd-2021-02-20-59e9794c/src/ap/acs.c
|
||||
@@ -672,6 +672,10 @@ acs_find_ideal_chan_mode(struct hostapd_
|
||||
continue;
|
||||
}
|
||||
|
||||
+ if (iface->conf->acs_exclude_dfs &&
|
||||
+ (chan->flag & HOSTAPD_CHAN_RADAR))
|
||||
+ continue;
|
||||
+
|
||||
/* HT40 on 5 GHz has a limited set of primary channels as per
|
||||
* 11n Annex J */
|
||||
if (mode->mode == HOSTAPD_MODE_IEEE80211A &&
|
||||
21
feeds/wifi-ax/mac80211/patches/pending/214-no-encap.patch
Normal file
21
feeds/wifi-ax/mac80211/patches/pending/214-no-encap.patch
Normal file
@@ -0,0 +1,21 @@
|
||||
Index: backports-20210222_001-4.4.60-b157d2276/drivers/net/wireless/ath/ath11k/mac.c
|
||||
===================================================================
|
||||
--- backports-20210222_001-4.4.60-b157d2276.orig/drivers/net/wireless/ath/ath11k/mac.c
|
||||
+++ backports-20210222_001-4.4.60-b157d2276/drivers/net/wireless/ath/ath11k/mac.c
|
||||
@@ -6590,6 +6590,7 @@ static int ath11k_mac_op_update_vif_offl
|
||||
u32 param_id, param_value;
|
||||
int ret;
|
||||
|
||||
+ return 0;
|
||||
if (ab->nss.enabled && vif->type == NL80211_IFTYPE_AP_VLAN)
|
||||
return 0;
|
||||
|
||||
@@ -6835,6 +6836,8 @@ static int ath11k_mac_op_add_interface(s
|
||||
else
|
||||
param_value = ATH11K_HW_TXRX_NATIVE_WIFI;
|
||||
|
||||
+ param_value = ATH11K_HW_TXRX_NATIVE_WIFI;
|
||||
+
|
||||
ret = ath11k_nss_vdev_set_cmd(arvif, NSS_WIFI_VDEV_ENCAP_TYPE_CMD, param_value);
|
||||
|
||||
if(ret) {
|
||||
@@ -1,57 +0,0 @@
|
||||
--- a/drivers/net/wireless/ath/ath11k/ahb.c
|
||||
+++ b/drivers/net/wireless/ath/ath11k/ahb.c
|
||||
@@ -526,6 +526,7 @@ static int ath11k_ahb_ext_irq_config(str
|
||||
int irq;
|
||||
int ret;
|
||||
bool nss_offload;
|
||||
+ static int devidx = 0;
|
||||
|
||||
/* TCL Completion, REO Dest, ERR, Exception and h2rxdma rings are offloaded
|
||||
* to nss when its enabled, hence don't enable these interrupts
|
||||
@@ -539,6 +540,9 @@ static int ath11k_ahb_ext_irq_config(str
|
||||
irq_grp->ab = ab;
|
||||
irq_grp->grp_id = i;
|
||||
init_dummy_netdev(&irq_grp->napi_ndev);
|
||||
+ snprintf(irq_grp->napi_ndev.name, sizeof(irq_grp->napi_ndev.name), "%s%d:%d",
|
||||
+ "ath11k_ahb", devidx, i);
|
||||
+ irq_grp->napi_ndev.threaded = 1;
|
||||
netif_napi_add(&irq_grp->napi_ndev, &irq_grp->napi,
|
||||
ath11k_ahb_ext_grp_napi_poll, NAPI_POLL_WEIGHT);
|
||||
|
||||
@@ -604,6 +608,8 @@ static int ath11k_ahb_ext_irq_config(str
|
||||
}
|
||||
}
|
||||
|
||||
+ devidx++;
|
||||
+
|
||||
return 0;
|
||||
}
|
||||
|
||||
--- a/drivers/net/wireless/ath/ath11k/pci.c
|
||||
+++ b/drivers/net/wireless/ath/ath11k/pci.c
|
||||
@@ -806,6 +806,7 @@ static int ath11k_pci_ext_irq_config(str
|
||||
int i, j, ret, num_vectors = 0;
|
||||
u32 user_base_data = 0, base_vector = 0, base_idx;
|
||||
u8 domain_id;
|
||||
+ static int devidx = 0;
|
||||
|
||||
domain_id = ath11k_pci_get_domain_id(ab);
|
||||
base_idx = ATH11K_PCI_IRQ_CE0_OFFSET + CE_COUNT_MAX;
|
||||
@@ -822,6 +823,9 @@ static int ath11k_pci_ext_irq_config(str
|
||||
irq_grp->ab = ab;
|
||||
irq_grp->grp_id = i;
|
||||
init_dummy_netdev(&irq_grp->napi_ndev);
|
||||
+ snprintf(irq_grp->napi_ndev.name, sizeof(irq_grp->napi_ndev.name), "%s%d:%d",
|
||||
+ "ath11k_pci", devidx, i);
|
||||
+ irq_grp->napi_ndev.threaded = 1;
|
||||
netif_napi_add(&irq_grp->napi_ndev, &irq_grp->napi,
|
||||
ath11k_pci_ext_grp_napi_poll, NAPI_POLL_WEIGHT);
|
||||
|
||||
@@ -868,6 +872,7 @@ static int ath11k_pci_ext_irq_config(str
|
||||
}
|
||||
}
|
||||
|
||||
+ devidx++;
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -0,0 +1,32 @@
|
||||
From d8d342c6d0c4076b509faf1ae1a87df24814abe0 Mon Sep 17 00:00:00 2001
|
||||
From: John Crispin <john@phrozen.org>
|
||||
Date: Wed, 23 Feb 2022 07:44:56 +0100
|
||||
Subject: [PATCH] Revert "ipq40xx: ar40xx: reset port status register"
|
||||
|
||||
This reverts commit 88151b8303f29f18e8b037076628fd82eda0978a.
|
||||
|
||||
This actually causes several boards to have bad eth connectivity
|
||||
after reboot.
|
||||
|
||||
Signed-off-by: John Crispin <john@phrozen.org>
|
||||
---
|
||||
target/linux/ipq40xx/files/drivers/net/phy/ar40xx.c | 3 ++-
|
||||
1 file changed, 2 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/target/linux/ipq40xx/files/drivers/net/phy/ar40xx.c b/target/linux/ipq40xx/files/drivers/net/phy/ar40xx.c
|
||||
index 8b3ae53bd9..9758f013f0 100644
|
||||
--- a/target/linux/ipq40xx/files/drivers/net/phy/ar40xx.c
|
||||
+++ b/target/linux/ipq40xx/files/drivers/net/phy/ar40xx.c
|
||||
@@ -1198,7 +1198,8 @@ ar40xx_init_port(struct ar40xx_priv *priv, int port)
|
||||
{
|
||||
u32 t;
|
||||
|
||||
- ar40xx_write(priv, AR40XX_REG_PORT_STATUS(port), 0);
|
||||
+ ar40xx_rmw(priv, AR40XX_REG_PORT_STATUS(port),
|
||||
+ AR40XX_PORT_AUTO_LINK_EN, 0);
|
||||
|
||||
/* CPU port is setting headers to limit output ports */
|
||||
if (port == 0)
|
||||
--
|
||||
2.25.1
|
||||
|
||||
@@ -89,7 +89,7 @@ index 209ae3dc46..c8e1eca88b 100644
|
||||
wps_not_configured=1
|
||||
+ [ "$macfilter" = radius ] && {
|
||||
+ append_radius_server
|
||||
+ vlan_possible = 1
|
||||
+ vlan_possible=1
|
||||
+ }
|
||||
;;
|
||||
psk|sae|psk-sae)
|
||||
|
||||
@@ -0,0 +1,35 @@
|
||||
From adaea813b53d2f3cbbaefb9dffa19faf58d670a2 Mon Sep 17 00:00:00 2001
|
||||
From: John Crispin <john@phrozen.org>
|
||||
Date: Tue, 15 Feb 2022 17:05:18 +0100
|
||||
Subject: [PATCH] hostapd: add acs_exclude_dfs support for SW ACS
|
||||
|
||||
Signed-off-by: John Crispin <john@phrozen.org>
|
||||
---
|
||||
.../hostapd/patches/760-acs_exclude_dfs.patch | 15 +++++++++++++++
|
||||
1 file changed, 15 insertions(+)
|
||||
create mode 100644 package/network/services/hostapd/patches/760-acs_exclude_dfs.patch
|
||||
|
||||
diff --git a/package/network/services/hostapd/patches/760-acs_exclude_dfs.patch b/package/network/services/hostapd/patches/760-acs_exclude_dfs.patch
|
||||
new file mode 100644
|
||||
index 0000000000..52d63c5ff9
|
||||
--- /dev/null
|
||||
+++ b/package/network/services/hostapd/patches/760-acs_exclude_dfs.patch
|
||||
@@ -0,0 +1,15 @@
|
||||
+Index: hostapd-2021-02-20-59e9794c/src/ap/acs.c
|
||||
+===================================================================
|
||||
+--- hostapd-2021-02-20-59e9794c.orig/src/ap/acs.c
|
||||
++++ hostapd-2021-02-20-59e9794c/src/ap/acs.c
|
||||
+@@ -672,6 +672,10 @@ acs_find_ideal_chan_mode(struct hostapd_
|
||||
+ continue;
|
||||
+ }
|
||||
+
|
||||
++ if (iface->conf->acs_exclude_dfs &&
|
||||
++ (chan->flag & HOSTAPD_CHAN_RADAR))
|
||||
++ continue;
|
||||
++
|
||||
+ /* HT40 on 5 GHz has a limited set of primary channels as per
|
||||
+ * 11n Annex J */
|
||||
+ if (mode->mode == HOSTAPD_MODE_IEEE80211A &&
|
||||
--
|
||||
2.25.1
|
||||
|
||||
20
profiles/edgecore_eap104.yml
Normal file
20
profiles/edgecore_eap104.yml
Normal file
@@ -0,0 +1,20 @@
|
||||
---
|
||||
profile: edgecore_eap104
|
||||
target: ipq807x
|
||||
subtarget: ipq50xx
|
||||
description: Build image for the EdgeCore EAP104
|
||||
image: bin/targets/ipq807x/ipq50xx/openwrt-ipq807x-edgecore_eap104-squashfs-sysupgrade.tar
|
||||
feeds:
|
||||
- name: ipq807x
|
||||
path: ../../feeds/ipq807x
|
||||
- name: bluetooth_cc2652
|
||||
path: ../../feeds/bluetooth-cc2652
|
||||
include:
|
||||
- wifi-ax
|
||||
- ucentral-ap
|
||||
packages:
|
||||
- cc2652
|
||||
diffconfig: |
|
||||
CONFIG_KERNEL_IPQ_MEM_PROFILE=512
|
||||
CONFIG_BUSYBOX_CUSTOM=y
|
||||
CONFIG_BUSYBOX_CONFIG_STTY=y
|
||||
Reference in New Issue
Block a user