mirror of
https://github.com/shenmintao/aic8800d80.git
synced 2026-09-26 17:44:16 +00:00
Compare commits
32
Commits
legacy-mcu1
..
main
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
b72eea9564 | ||
|
|
defc058cd4 | ||
|
|
9cf132d9b5 | ||
|
|
2c4ab4b421 | ||
|
|
c97644a43a | ||
|
|
7ec1a4fbb1 | ||
|
|
94c72da6d8 | ||
|
|
3e9a02549b | ||
|
|
264f29db21 | ||
|
|
27af5add83 | ||
|
|
9594c5c99a | ||
|
|
31b726adbd | ||
|
|
2895da26d8 | ||
|
|
dd74ae66f7 | ||
|
|
e93a7d2b6b | ||
|
|
30505069fa | ||
|
|
3006aae254 | ||
|
|
b26fef2910 | ||
|
|
8f0b982ec9 | ||
|
|
5e990a5468 | ||
|
|
9747ee3110 | ||
|
|
40379fee97 | ||
|
|
c096067ef3 | ||
|
|
8e0135c948 | ||
|
|
81b8b3335e | ||
|
|
531d16c4d6 | ||
|
|
40f00e69af | ||
|
|
a1f8d3bcb6 | ||
|
|
43ca679bea | ||
|
|
80afe144d1 | ||
|
|
13488f30dc | ||
|
|
050844d924 |
@@ -1,7 +1,3 @@
|
||||
fw/aic8800D80/*.txt text eol=lf
|
||||
fw/aic8800D80/*.bin binary
|
||||
fw/aic8800DC/*.txt text eol=lf
|
||||
fw/aic8800DC/*.bin binary
|
||||
/.gitattributes text eol=lf
|
||||
drivers/aic8800/aic_zlp_quirk/*.c text eol=lf
|
||||
drivers/aic8800/aic_zlp_quirk/Makefile text eol=lf
|
||||
|
||||
@@ -1,26 +1,32 @@
|
||||
# AIC8800 Linux Wi-Fi and Bluetooth Driver
|
||||
This driver supports AIC8800-family chipsets used by devices such as the Tenda U11, AX913B, and TP-Link Archer TX1U Nano.
|
||||
This driver is for the AIC8800D80 chipset, supported by devices such as the Tenda U11 and AX913B.
|
||||
|
||||
> **Legacy MCU revision 1 branch:** You are viewing `legacy-mcu1`. This branch
|
||||
> is only for AIC8800D80 or AIC8800DC/DW devices that report
|
||||
> `chip_id=7, chip_mcu_id=1`. It provides complete matched V3 firmware and
|
||||
> loader profiles for the D80 upload-limit failure validated in
|
||||
> [issue #58](https://github.com/shenmintao/aic8800d80/issues/58) and the DC/DW
|
||||
> V5 main-application timeout validated in
|
||||
> [issue #71](https://github.com/shenmintao/aic8800d80/issues/71). Use
|
||||
> [`main`](https://github.com/shenmintao/aic8800d80/tree/main) for newer
|
||||
> `chip_mcu_id=0` hardware or when the MCU revision is unknown. See the
|
||||
> [D80](tests/issue58-mcu1-legacy-fw/README.md) and
|
||||
> [DC/DW](tests/issue71-mcu1-v3-profile/README.md) support notes before installing.
|
||||
> [!IMPORTANT]
|
||||
> **Choose the branch for your hardware revision before installing.** If the
|
||||
> driver log reports `chip_id=7, chip_mcu_id=1` on an AIC8800D80 or
|
||||
> AIC8800DC/DW device, use the
|
||||
> [`legacy-mcu1`](https://github.com/shenmintao/aic8800d80/tree/legacy-mcu1)
|
||||
> branch. It contains the matched legacy firmware and loader profile required
|
||||
> to avoid the deterministic firmware upload timeout at `0x170400`. Use
|
||||
> `main` when `chip_mcu_id=0` or when the MCU revision is unknown.
|
||||
>
|
||||
> After switching branches, rerun `sudo ./install.sh` and reboot; switching the
|
||||
> Git branch alone does not replace firmware already installed under
|
||||
> `/lib/firmware`.
|
||||
> Hardware revision determines the firmware branch. MCU1 devices should use
|
||||
> `legacy-mcu1`, which also initializes Bluetooth for the
|
||||
> kernel's standard `btusb` driver. After switching branches, rerun
|
||||
> `sudo ./install.sh` and reboot; switching the Git branch alone does not
|
||||
> replace the firmware already installed under `/lib/firmware`.
|
||||
|
||||
Added support for devices with Vendor ID 368B (tested).
|
||||
|
||||
Tested on Linux kernel 6.16 with Ubuntu 25.04 and 6.1.0.27 with Debian 12.
|
||||
|
||||
> [!NOTE]
|
||||
> **Maintained branches:** This repository now maintains two hardware branches:
|
||||
> `main` for `chip_mcu_id=0` or an unknown MCU revision, and `legacy-mcu1` for
|
||||
> `chip_mcu_id=1`. Wi-Fi, the kernel's standard `btusb` Bluetooth path, and the
|
||||
> device-scoped ZLP support are integrated into both branches. The former
|
||||
> separate `bluetooth` branch is retired and should no longer be used.
|
||||
|
||||
The same driver supports Wi-Fi-only adapters and Wi-Fi/Bluetooth combo
|
||||
adapters. On combo devices, `aic_load_fw` uploads the AIC firmware and the
|
||||
standard Linux `btusb` driver handles the Bluetooth HCI interface. The obsolete
|
||||
@@ -33,14 +39,6 @@ the distribution's original `btusb.ko` installed and bound to the device. The
|
||||
quirk is filtered to that VID:PID and fails closed when the required kernel
|
||||
probe support is unavailable.
|
||||
|
||||
> [!NOTE]
|
||||
> **Maintained branches:** This repository now maintains only `main` and
|
||||
> `legacy-mcu1`. You are viewing the branch for `chip_mcu_id=1`; do not switch
|
||||
> this hardware to the former separate `bluetooth` branch, which is retired.
|
||||
> Wi-Fi, the kernel's standard `btusb` Bluetooth path, and the device-scoped
|
||||
> `368b:8d81` ZLP support are integrated here. The ZLP module remains inactive
|
||||
> on other VID:PID combinations.
|
||||
|
||||
### Disclaimer
|
||||
I did not develop this software, The code is sourced from the Tenda U11 driver. I only made some modifications to the code to adapt it to newer kernel versions. Apart from compilation issues, I am unable to address other problems.
|
||||
|
||||
|
||||
+13
-13
@@ -1,4 +1,4 @@
|
||||
%global commit c8327eab5be246d4b517afdba034775f00afa988
|
||||
%global commit 3e9a02549bc98d350bff1e0fb0501f841f9d8e55
|
||||
%global shortcommit %(echo %{commit} | cut -c1-7)
|
||||
%global snapdate 20260924
|
||||
%global debug_package %{nil}
|
||||
@@ -82,24 +82,24 @@ cp -a fw/aic8800* %{buildroot}/usr/lib/firmware/
|
||||
/usr/lib/firmware/aic8800*
|
||||
|
||||
%changelog
|
||||
* Thu Sep 24 2026 Shen Mintao <shenmintao@gmail.com> - 1:1.0.0^20260924gitc8327ea-1
|
||||
* Thu Sep 24 2026 Shen Mintao <shenmintao@gmail.com> - 1:1.0.0^20260924git3e9a025-1
|
||||
- Version snapshots as 1.0.0^<date>git<commit> with Epoch 1. The previous
|
||||
commit-hash versions do not sort in commit order, so rpm could treat a
|
||||
newer snapshot as an older package.
|
||||
|
||||
* Thu Sep 24 2026 Shen Mintao <shenmintao@gmail.com> - c8327ea-1
|
||||
- Build the current legacy-mcu1 branch, which carries the Linux 7.2
|
||||
cfg80211 and strncpy() fixes needed to compile on Bazzite 44.
|
||||
- Include the monitor packet injection path and the 6.12 stable
|
||||
set_monitor_channel() fix synchronized from main.
|
||||
* Thu Sep 24 2026 Shen Mintao <shenmintao@gmail.com> - 3e9a025-1
|
||||
- Build the current main branch, which adds the Linux 7.1+ TDLS discovery
|
||||
response length fix, the SUN60IW2P1 USB transfer settings, OpenWrt
|
||||
cfg80211 backport version handling and the 6.12 stable
|
||||
set_monitor_channel() fix.
|
||||
|
||||
* Wed Jul 29 2026 Shen Mintao <shenmintao@gmail.com> - 51b7b6e-2
|
||||
- Disable automatic debug package generation for Bazzite builds.
|
||||
- Require usb_modeswitch by package name for rpm-ostree dependency resolution.
|
||||
* Fri Aug 21 2026 Heyde Moura <moura.heyde@gmail.com> - e93a7d2-1
|
||||
- Build the current main branch, which carries the Linux 7.2 cfg80211 and
|
||||
strncpy() fixes needed to compile on Bazzite 44.
|
||||
|
||||
* Sat Jul 25 2026 Shen Mintao <shenmintao@gmail.com> - 51b7b6e-1
|
||||
- Package the unified installer and ZLP quirk with the legacy MCU1 profiles.
|
||||
- Preserve the matched D80 and DC/DW firmware and loader combinations.
|
||||
* Tue Jul 28 2026 ccyuen1 - 13baa9b-2
|
||||
- Disable automatic creation of debuginfo packages to fix issue #77.
|
||||
- Require usb_modeswitch as package dependency instead of file dependency to fix issue #77.
|
||||
|
||||
* Sat Jul 25 2026 Shen Mintao <shenmintao@gmail.com> - 13baa9b-1
|
||||
- Unify Wi-Fi and standard-btusb Bluetooth support in one package.
|
||||
|
||||
@@ -45,8 +45,6 @@
|
||||
#define FW_USERCONFIG_NAME_8800DW "aic_userconfig_8800dw.txt"
|
||||
#define FW_POWERLIMIT_NAME_8800DC "aic_powerlimit_8800dc.txt"
|
||||
#define FW_POWERLIMIT_NAME_8800DW "aic_powerlimit_8800dw.txt"
|
||||
#define FW_USERCONFIG_NAME_8800DW_W311 "aic_userconfig_8800dw_w311.txt"
|
||||
#define FW_USERCONFIG_NAME_8800DW_U2 "aic_userconfig_8800dw_u2.txt"
|
||||
|
||||
#ifdef CONFIG_LOAD_BT_PATCH_IN_FDRV
|
||||
enum aicbt_patch_table_type {
|
||||
@@ -169,6 +167,7 @@ u32 syscfg_tbl_masked_8800dc[][3] = {
|
||||
{0x700010A0, (0x1 << 11), (0x1 << 11)},
|
||||
{0x70001034, ((0x1 << 20) | (0x7 << 26)), ((0x0 << 20) | (0x2 << 26))},
|
||||
{0x70001038, (0x1 << 8), (0x1 << 8)},
|
||||
{0x70001084, (0x3 << 13), (0x0 << 13)},
|
||||
{0x70001094, (0x3 << 2), (0x0 << 2)},
|
||||
{0x700021D0, ((0x1 << 5) | (0x1 << 6)), ((0x1 << 5) | (0x1 << 6))},
|
||||
{0x70001000, ((0x1 << 0) | (0x1 << 20) | (0x1 << 22)),
|
||||
@@ -186,6 +185,7 @@ u32 syscfg_tbl_masked_8800dc[][3] = {
|
||||
{0x700010A0, (0x1 << 11), (0x1 << 11)},
|
||||
{0x70001034, ((0x1 << 20) | (0x7 << 26)), ((0x0 << 20) | (0x2 << 26))},
|
||||
{0x70001038, (0x1 << 8), (0x1 << 8)},
|
||||
{0x70001084, (0x3 << 13), (0x0 << 13)},
|
||||
{0x70001094, (0x3 << 2), (0x0 << 2)},
|
||||
{0x700021D0, ((0x1 << 5) | (0x1 << 6)), ((0x1 << 5) | (0x1 << 6))},
|
||||
{0x70001000, ((0x1 << 0) | (0x1 << 20) | (0x1 << 22)),
|
||||
@@ -211,6 +211,7 @@ u32 syscfg_tbl_masked_8800dc_h[][3] = {
|
||||
{0x700010A0, (0x1 << 11), (0x1 << 11)},
|
||||
//{0x70001034, ((0x1 << 20) | (0x7 << 26)), ((0x0 << 20) | (0x2 << 26))},
|
||||
{0x70001038, (0x1 << 8), (0x1 << 8)},
|
||||
{0x70001084, (0x3 << 13), (0x0 << 13)},
|
||||
{0x70001094, (0x3 << 2), (0x0 << 2)},
|
||||
{0x700021D0, ((0x1 << 5) | (0x1 << 6)), ((0x1 << 5) | (0x1 << 6))},
|
||||
#if defined(CONFIG_VRF_DCDC_MODE)
|
||||
@@ -242,7 +243,6 @@ u32 syscfg_tbl_8800dc[][2] = {
|
||||
|
||||
u32 patch_tbl_wifisetting[][2] =
|
||||
{
|
||||
{0x0004, 0x00020010}, //wdt_reboot_type, wdt_period_sec
|
||||
#if !defined(CONFIG_FPGA_VERIFICATION)
|
||||
{0x0090, 0x0013FC00}, //rx_ringbuf_start2
|
||||
#endif
|
||||
@@ -251,10 +251,9 @@ u32 patch_tbl_wifisetting[][2] =
|
||||
{0x0120, 0x140A0100}, //usb agg tx params(total cnt, aggr cnt, out en, global out nak)
|
||||
#endif //CONFIG_USB_TX_AGGR
|
||||
{0x00b0, 0xAD180100},
|
||||
#ifdef CONFIG_BAND_STEERING
|
||||
#ifdef CONFIG_PRBREQ_REPORT
|
||||
{0x0138, 0x00010a00}, //apm probe resp offload en
|
||||
#endif
|
||||
{0x0084, 0x00000040},
|
||||
};
|
||||
|
||||
u32 jump_tbl[][2] =
|
||||
@@ -1872,104 +1871,104 @@ const uint32_t txgain_map_femkct[96] =
|
||||
const uint32_t txgain_map_femkct_h[96] =
|
||||
{
|
||||
//11b
|
||||
0x00ffd872,//15
|
||||
0x00ffd880,//16
|
||||
0x00ffd972,//17
|
||||
0x00ffd980,//18
|
||||
0x00ffd990,//19
|
||||
0x00ffda72,//20
|
||||
0x00ffda80,//21
|
||||
0x00ffdb72,//22
|
||||
0x00ffdb80,//23
|
||||
0x00ffdc72,//24
|
||||
0x00ffdc80,//25
|
||||
0x00ffdd72,//26
|
||||
0x00ffdd80,//27
|
||||
0x00ffde72,//28
|
||||
0x00ffde80,//29
|
||||
0x00ffdf72,//30
|
||||
0x00ffd072,//-1
|
||||
0x00ffd072,//0
|
||||
0x00ffd080,//1
|
||||
0x00ffd172,//2
|
||||
0x00ffd180,//3
|
||||
0x00ffd272,//4
|
||||
0x00ffd280,//5
|
||||
0x00ffd379,//6
|
||||
0x00ffd46d,//7
|
||||
0x00ffd479,//8
|
||||
0x00ffd572,//9
|
||||
0x00ffd580,//10
|
||||
0x00ffd672,//11
|
||||
0x00ffd680,//12
|
||||
0x00ffd772,//13
|
||||
0x00ffd780,//14
|
||||
0x00ffd86c,//15
|
||||
0x00ffd879,//16
|
||||
0x00ffd96c,//17
|
||||
0x00ffd979,//18
|
||||
0x00ffd988,//19
|
||||
0x00ffda6c,//20
|
||||
0x00ffda79,//21
|
||||
0x00ffdb6c,//22
|
||||
0x00ffdb79,//23
|
||||
0x00ffdc6c,//24
|
||||
0x00ffdc79,//25
|
||||
0x00ffdd6c,//26
|
||||
0x00ffdd79,//27
|
||||
0x00ffde6c,//28
|
||||
0x00ffde79,//29
|
||||
0x00ffdf6c,//30
|
||||
0x00ffd06c,//-1
|
||||
0x00ffd06c,//0
|
||||
0x00ffd079,//1
|
||||
0x00ffd16c,//2
|
||||
0x00ffd179,//3
|
||||
0x00ffd26c,//4
|
||||
0x00ffd279,//5
|
||||
0x00ffd372,//6
|
||||
0x00ffd467,//7
|
||||
0x00ffd472,//8
|
||||
0x00ffd56c,//9
|
||||
0x00ffd579,//10
|
||||
0x00ffd66c,//11
|
||||
0x00ffd679,//12
|
||||
0x00ffd76c,//13
|
||||
0x00ffd779,//14
|
||||
//high
|
||||
0x00ffc880,//11
|
||||
0x00ffc972,//12
|
||||
0x00ffc980,//13
|
||||
0x00ffca72,//14
|
||||
0x00ffca80,//15
|
||||
0x00ffcb72,//16
|
||||
0x00ffcb80,//17
|
||||
0x00ffcc72,//18
|
||||
0x00ffcc80,//19
|
||||
0x00ffcc90,//20
|
||||
0x00ffcd72,//21
|
||||
0x00ffcd80,//22
|
||||
0x00ffce72,//23
|
||||
0x00ffce80,//24
|
||||
0x00ffcf72,//25
|
||||
0x00ffcf80,//26
|
||||
0x00ffc080,//-5
|
||||
0x00ffc172,//-4
|
||||
0x00ffc180,//-3
|
||||
0x00ffc272,//-2
|
||||
0x00ffc280,//-1
|
||||
0x00ffc372,//0
|
||||
0x00ffc380,//1
|
||||
0x00ffc472,//2
|
||||
0x00ffc480,//3
|
||||
0x00ffc572,//4
|
||||
0x00ffc580,//5
|
||||
0x00ffc672,//6
|
||||
0x00ffc680,//7
|
||||
0x00ffc772,//8
|
||||
0x00ffc780,//9
|
||||
0x00ffc872,//10
|
||||
0x00ffc879,//11
|
||||
0x00ffc96c,//12
|
||||
0x00ffc979,//13
|
||||
0x00ffca6c,//14
|
||||
0x00ffca79,//15
|
||||
0x00ffcb6c,//16
|
||||
0x00ffcb79,//17
|
||||
0x00ffcc6c,//18
|
||||
0x00ffcc79,//19
|
||||
0x00ffcc88,//20
|
||||
0x00ffcd6c,//21
|
||||
0x00ffcd79,//22
|
||||
0x00ffce6c,//23
|
||||
0x00ffce79,//24
|
||||
0x00ffcf6c,//25
|
||||
0x00ffcf79,//26
|
||||
0x00ffc079,//-5
|
||||
0x00ffc16c,//-4
|
||||
0x00ffc179,//-3
|
||||
0x00ffc26c,//-2
|
||||
0x00ffc279,//-1
|
||||
0x00ffc36c,//0
|
||||
0x00ffc379,//1
|
||||
0x00ffc46c,//2
|
||||
0x00ffc479,//3
|
||||
0x00ffc56c,//4
|
||||
0x00ffc579,//5
|
||||
0x00ffc66c,//6
|
||||
0x00ffc679,//7
|
||||
0x00ffc76c,//8
|
||||
0x00ffc779,//9
|
||||
0x00ffc86c,//10
|
||||
//low
|
||||
0x00ffc880,//11
|
||||
0x00ffc972,//12
|
||||
0x00ffc980,//13
|
||||
0x00ffca72,//14
|
||||
0x00ffca80,//15
|
||||
0x00ffcb72,//16
|
||||
0x00ffcb80,//17
|
||||
0x00ffcc72,//18
|
||||
0x00ffcc80,//19
|
||||
0x00ffcc90,//20
|
||||
0x00ffcd72,//21
|
||||
0x00ffcd80,//22
|
||||
0x00ffce72,//23
|
||||
0x00ffce80,//24
|
||||
0x00ffcf72,//25
|
||||
0x00ffcf80,//26
|
||||
0x00ffc080,//-5
|
||||
0x00ffc172,//-4
|
||||
0x00ffc180,//-3
|
||||
0x00ffc272,//-2
|
||||
0x00ffc280,//-1
|
||||
0x00ffc372,//0
|
||||
0x00ffc380,//1
|
||||
0x00ffc472,//2
|
||||
0x00ffc480,//3
|
||||
0x00ffc572,//4
|
||||
0x00ffc580,//5
|
||||
0x00ffc672,//6
|
||||
0x00ffc680,//7
|
||||
0x00ffc772,//8
|
||||
0x00ffc780,//9
|
||||
0x00ffc872,//10
|
||||
0x00ffc879,//11
|
||||
0x00ffc96c,//12
|
||||
0x00ffc979,//13
|
||||
0x00ffca6c,//14
|
||||
0x00ffca79,//15
|
||||
0x00ffcb6c,//16
|
||||
0x00ffcb79,//17
|
||||
0x00ffcc6c,//18
|
||||
0x00ffcc79,//19
|
||||
0x00ffcc88,//20
|
||||
0x00ffcd6c,//21
|
||||
0x00ffcd79,//22
|
||||
0x00ffce6c,//23
|
||||
0x00ffce79,//24
|
||||
0x00ffcf6c,//25
|
||||
0x00ffcf79,//26
|
||||
0x00ffc079,//-5
|
||||
0x00ffc16c,//-4
|
||||
0x00ffc179,//-3
|
||||
0x00ffc26c,//-2
|
||||
0x00ffc279,//-1
|
||||
0x00ffc36c,//0
|
||||
0x00ffc379,//1
|
||||
0x00ffc46c,//2
|
||||
0x00ffc479,//3
|
||||
0x00ffc56c,//4
|
||||
0x00ffc579,//5
|
||||
0x00ffc66c,//6
|
||||
0x00ffc679,//7
|
||||
0x00ffc76c,//8
|
||||
0x00ffc779,//9
|
||||
0x00ffc86c,//10
|
||||
};
|
||||
#endif
|
||||
|
||||
@@ -2205,6 +2204,141 @@ uint32_t wifi_txgain_table_24g_1_8800dcdw_femkct[32] = {
|
||||
};
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_5M10M
|
||||
u32 wifi_rxgain_table_24g_dcdw_5m[64] = {
|
||||
0x82f282d1,//index 0
|
||||
0x9591a200,
|
||||
0x80808419,
|
||||
0x000000f0,
|
||||
0x42f282d1,//index 1
|
||||
0x95923400,
|
||||
0x80808419,
|
||||
0x000000f0,
|
||||
0x22f282d1,//index 2
|
||||
0x9592c600,
|
||||
0x80808419,
|
||||
0x000000f0,
|
||||
0x02f282d1,//index 3
|
||||
0x9591a200,
|
||||
0x80808419,
|
||||
0x000000f0,
|
||||
0x06f282d1,//index 4
|
||||
0x9591a200,
|
||||
0x80808419,
|
||||
0x000000f0,
|
||||
0x0ef282d1,//index 5
|
||||
0x9591a200,
|
||||
0x80808419,
|
||||
0x000000f0,
|
||||
0x0ef282d3,//index 6
|
||||
0x95923400,
|
||||
0x80808419,
|
||||
0x000000f0,
|
||||
0x0ef282d7,//index 7
|
||||
0x9595a200,
|
||||
0x80808419,
|
||||
0x000000f0,
|
||||
0x02f282d2,//index 8
|
||||
0x95951000,
|
||||
0x80808419,
|
||||
0x000000f0,
|
||||
0x02f282f4,//index 9
|
||||
0x95951000,
|
||||
0x80808419,
|
||||
0x000000f0,
|
||||
0x02f282e6,//index 10
|
||||
0x9595a200,
|
||||
0x80808419,
|
||||
0x000000f0,
|
||||
0x02f282e6,//index 11
|
||||
0x9599a200,
|
||||
0x80808419,
|
||||
0x000000f0,
|
||||
0x02f282e6,//index 12
|
||||
0x959da200,
|
||||
0x80808419,
|
||||
0x000000f0,
|
||||
0x02f282e6,//index 13
|
||||
0x959f5800,
|
||||
0x80808419,
|
||||
0x000000f0,
|
||||
0x06f282e6,//index 14
|
||||
0x959f5800,
|
||||
0x80808419,
|
||||
0x000000f0,
|
||||
0x0ef282e6,//index 15
|
||||
0x959f5800,
|
||||
0x80808419,
|
||||
0x000000f0
|
||||
};
|
||||
|
||||
u32 wifi_rxgain_table_24g_dcdw_10m[64] = {
|
||||
0x82f282d1,//index 0
|
||||
0x9591a320,
|
||||
0x80808419,
|
||||
0x000000f0,
|
||||
0x42f282d1,//index 1
|
||||
0x95923520,
|
||||
0x80808419,
|
||||
0x000000f0,
|
||||
0x22f282d1,//index 2
|
||||
0x9592c720,
|
||||
0x80808419,
|
||||
0x000000f0,
|
||||
0x02f282d1,//index 3
|
||||
0x9591a320,
|
||||
0x80808419,
|
||||
0x000000f0,
|
||||
0x06f282d1,//index 4
|
||||
0x9591a320,
|
||||
0x80808419,
|
||||
0x000000f0,
|
||||
0x0ef282d1,//index 5
|
||||
0x9591a320,
|
||||
0x80808419,
|
||||
0x000000f0,
|
||||
0x0ef282d3,//index 6
|
||||
0x95923520,
|
||||
0x80808419,
|
||||
0x000000f0,
|
||||
0x0ef282d7,//index 7
|
||||
0x9595a320,
|
||||
0x80808419,
|
||||
0x000000f0,
|
||||
0x02f282d2,//index 8
|
||||
0x95951120,
|
||||
0x80808419,
|
||||
0x000000f0,
|
||||
0x02f282f4,//index 9
|
||||
0x95951120,
|
||||
0x80808419,
|
||||
0x000000f0,
|
||||
0x02f282e6,//index 10
|
||||
0x9595a320,
|
||||
0x80808419,
|
||||
0x000000f0,
|
||||
0x02f282e6,//index 11
|
||||
0x9599a320,
|
||||
0x80808419,
|
||||
0x000000f0,
|
||||
0x02f282e6,//index 12
|
||||
0x959da320,
|
||||
0x80808419,
|
||||
0x000000f0,
|
||||
0x02f282e6,//index 13
|
||||
0x959f5920,
|
||||
0x80808419,
|
||||
0x000000f0,
|
||||
0x06f282e6,//index 14
|
||||
0x959f5920,
|
||||
0x80808419,
|
||||
0x000000f0,
|
||||
0x0ef282e6,//index 15
|
||||
0x959f5920,
|
||||
0x80808419,
|
||||
0x000000f0
|
||||
};
|
||||
#endif
|
||||
u32 wifi_rxgain_table_24g_20m_8800dcdw[64] = {
|
||||
0x82f282d1,//index 0
|
||||
0x9591a324,
|
||||
@@ -2923,7 +3057,13 @@ int aicwf_set_rf_config_8800dc(struct rwnx_hw *rwnx_hw, struct mm_set_rf_calib_c
|
||||
|
||||
if ((ret = rwnx_send_rf_config_req(rwnx_hw, 32, 0, (u8_l *)wifi_rxgain_table_24g_40m_8800dcdw, 256)))
|
||||
return -1;
|
||||
#ifdef CONFIG_5M10M
|
||||
if ((ret = rwnx_send_rf_config_req(rwnx_hw, 16, 0, (u8_l *)wifi_rxgain_table_24g_dcdw_5m, 256)))
|
||||
return -1;
|
||||
|
||||
if ((ret = rwnx_send_rf_config_req(rwnx_hw, 48, 0, (u8_l *)wifi_rxgain_table_24g_dcdw_10m, 256)))
|
||||
return -1;
|
||||
#endif
|
||||
if ((ret = rwnx_send_rf_calib_req(rwnx_hw, cfm))) {
|
||||
return -1;
|
||||
}
|
||||
@@ -3038,88 +3178,61 @@ int aicwf_misc_ram_valid_check_8800dc(struct rwnx_hw *rwnx_hw, int *valid_out)
|
||||
uint32_t misc_ram_addr;
|
||||
uint32_t ram_base_addr, ram_word_cnt;
|
||||
uint32_t bit_mask[4];
|
||||
uint32_t dpd_info_read_addr = 0xfe004;
|
||||
uint32_t boot_argc_read_addr = 0x1220f0;
|
||||
uint32_t flash_size_mem_addr = 0x40038030;
|
||||
uint8_t flash_size = 0;
|
||||
int i;
|
||||
if (valid_out) {
|
||||
*valid_out = 0;
|
||||
}
|
||||
|
||||
AICWFDBG(LOGINFO, "issue71: checking legacy V3 DPD result\n");
|
||||
ret = rwnx_send_dbg_mem_read_req(rwnx_hw, boot_argc_read_addr, &cfm);
|
||||
if (ret) {
|
||||
AICWFDBG(LOGERROR, "boot argc [0x%x] rd fail: %d\n", boot_argc_read_addr, ret);
|
||||
return ret;
|
||||
if (testmode == FW_RFTEST_MODE) {
|
||||
uint32_t vect1 = 0;
|
||||
uint32_t vect2 = 0;
|
||||
cfg_base = RAM_LMAC_FW_ADDR + 0x0004;
|
||||
ret = rwnx_send_dbg_mem_read_req(rwnx_hw, cfg_base, &cfm);
|
||||
if (ret) {
|
||||
AICWFDBG(LOGERROR, "cfg_base:%x vcet1 rd fail: %d\n", cfg_base, ret);
|
||||
return ret;
|
||||
}
|
||||
vect1 = cfm.memdata;
|
||||
if ((vect1 & 0xFFFF0000) != (RAM_LMAC_FW_ADDR & 0xFFFF0000)) {
|
||||
AICWFDBG(LOGERROR, "vect1 invalid: %x\n", vect1);
|
||||
return ret;
|
||||
}
|
||||
cfg_base = RAM_LMAC_FW_ADDR + 0x0008;
|
||||
ret = rwnx_send_dbg_mem_read_req(rwnx_hw, cfg_base, &cfm);
|
||||
if (ret) {
|
||||
AICWFDBG(LOGERROR, "cfg_base:%x vcet2 rd fail: %d\n", cfg_base, ret);
|
||||
return ret;
|
||||
}
|
||||
vect2 = cfm.memdata;
|
||||
if ((vect2 & 0xFFFF0000) != (RAM_LMAC_FW_ADDR & 0xFFFF0000)) {
|
||||
AICWFDBG(LOGERROR, "vect2 invalid: %x\n", vect2);
|
||||
return ret;
|
||||
}
|
||||
cfg_base = RAM_LMAC_FW_ADDR + 0x0164;
|
||||
}
|
||||
AICWFDBG(LOGINFO, "issue71: boot argc=0x%x\n", cfm.memdata);
|
||||
if (cfm.memdata & 0x10) {
|
||||
if (valid_out) {
|
||||
*valid_out = 1;
|
||||
}
|
||||
AICWFDBG(LOGINFO, "issue71: boot arguments mark DPD result valid\n");
|
||||
// init misc ram
|
||||
ret = rwnx_send_dbg_mem_read_req(rwnx_hw, cfg_base + 0x14, &cfm);
|
||||
if (ret) {
|
||||
AICWFDBG(LOGERROR, "rf misc ram[0x%x] rd fail: %d\n", cfg_base + 0x14, ret);
|
||||
return ret;
|
||||
}
|
||||
if (chip_mcu_id) {
|
||||
ret = rwnx_send_dbg_mem_read_req(rwnx_hw, flash_size_mem_addr, &cfm);
|
||||
misc_ram_addr = cfm.memdata;
|
||||
AICWFDBG(LOGERROR, "misc_ram_addr=%x\n", misc_ram_addr);
|
||||
// bit_mask
|
||||
ram_base_addr = misc_ram_addr + offsetof(rf_misc_ram_t, bit_mask);
|
||||
ram_word_cnt = (MEMBER_SIZE(rf_misc_ram_t, bit_mask) + MEMBER_SIZE(rf_misc_ram_t, reserved)) / 4;
|
||||
for (i = 0; i < ram_word_cnt; i++) {
|
||||
ret = rwnx_send_dbg_mem_read_req(rwnx_hw, ram_base_addr + i * 4, &cfm);
|
||||
if (ret) {
|
||||
AICWFDBG(LOGERROR, "flash size[0x%x] rd fail: %d\n", flash_size_mem_addr, ret);
|
||||
AICWFDBG(LOGERROR, "bit_mask[0x%x] rd fail: %d\n", ram_base_addr + i * 4, ret);
|
||||
return ret;
|
||||
}
|
||||
flash_size = cfm.memdata & 0xff;
|
||||
if (flash_size == 0x16) {
|
||||
dpd_info_read_addr += 0x4300000;
|
||||
} else if (flash_size == 0x15) {
|
||||
dpd_info_read_addr += 0x4100000;
|
||||
} else if (flash_size == 0x18) {
|
||||
dpd_info_read_addr += 0x4700000;
|
||||
} else {
|
||||
dpd_info_read_addr += 0x4100000;
|
||||
}
|
||||
ret = rwnx_send_dbg_mem_read_req(rwnx_hw, dpd_info_read_addr, &cfm);
|
||||
if (ret) {
|
||||
AICWFDBG(LOGERROR, "dpd info [0x%x] rd fail: %d\n", dpd_info_read_addr, ret);
|
||||
return ret;
|
||||
}
|
||||
AICWFDBG(LOGINFO,
|
||||
"issue71: flash size=0x%x, DPD info [0x%x]=0x%x\n",
|
||||
flash_size, dpd_info_read_addr, cfm.memdata);
|
||||
if (cfm.memdata & (1<<7)) {
|
||||
if (valid_out) {
|
||||
*valid_out = 1;
|
||||
}
|
||||
AICWFDBG(LOGINFO, "issue71: legacy V3 flash DPD result is valid\n");
|
||||
}
|
||||
} else {
|
||||
if (testmode == FW_RFTEST_MODE) {
|
||||
cfg_base = RAM_LMAC_FW_ADDR + 0x0164;
|
||||
}
|
||||
// init misc ram
|
||||
ret = rwnx_send_dbg_mem_read_req(rwnx_hw, cfg_base + 0x14, &cfm);
|
||||
if (ret) {
|
||||
AICWFDBG(LOGERROR, "rf misc ram[0x%x] rd fail: %d\n", cfg_base + 0x14, ret);
|
||||
return ret;
|
||||
}
|
||||
misc_ram_addr = cfm.memdata;
|
||||
AICWFDBG(LOGERROR, "misc_ram_addr=%x\n", misc_ram_addr);
|
||||
// bit_mask
|
||||
ram_base_addr = misc_ram_addr + offsetof(rf_misc_ram_t, bit_mask);
|
||||
ram_word_cnt = (MEMBER_SIZE(rf_misc_ram_t, bit_mask) + MEMBER_SIZE(rf_misc_ram_t, reserved)) / 4;
|
||||
for (i = 0; i < ram_word_cnt; i++) {
|
||||
ret = rwnx_send_dbg_mem_read_req(rwnx_hw, ram_base_addr + i * 4, &cfm);
|
||||
if (ret) {
|
||||
AICWFDBG(LOGERROR, "bit_mask[0x%x] rd fail: %d\n", ram_base_addr + i * 4, ret);
|
||||
return ret;
|
||||
}
|
||||
bit_mask[i] = cfm.memdata;
|
||||
}
|
||||
AICWFDBG(LOGTRACE, "bit_mask:%x,%x,%x,%x\n",bit_mask[0],bit_mask[1],bit_mask[2],bit_mask[3]);
|
||||
if ((bit_mask[0] == 0) && ((bit_mask[1] & 0xFFF00000) == 0x80000000) &&
|
||||
(bit_mask[2] == 0) && ((bit_mask[3] & 0xFFFFFF00) == 0x00000000)) {
|
||||
if (valid_out) {
|
||||
*valid_out = 1;
|
||||
}
|
||||
bit_mask[i] = cfm.memdata;
|
||||
}
|
||||
AICWFDBG(LOGTRACE, "bit_mask:%x,%x,%x,%x\n",bit_mask[0],bit_mask[1],bit_mask[2],bit_mask[3]);
|
||||
if ((bit_mask[0] == 0) && ((bit_mask[1] & 0xFFF00000) == 0x80000000) &&
|
||||
(bit_mask[2] == 0) && ((bit_mask[3] & 0xFFFFFF00) == 0x00000000)) {
|
||||
if (valid_out) {
|
||||
*valid_out = 1;
|
||||
}
|
||||
}
|
||||
return ret;
|
||||
@@ -3517,19 +3630,7 @@ int rwnx_plat_userconfig_load_8800dc(struct rwnx_hw *rwnx_hw){
|
||||
int rwnx_plat_userconfig_load_8800dw(struct rwnx_hw *rwnx_hw){
|
||||
int size;
|
||||
u32 *dst=NULL;
|
||||
u16 pid = le16_to_cpu(rwnx_hw->usbdev->udev->descriptor.idProduct);
|
||||
char *filename = FW_USERCONFIG_NAME_8800DW;
|
||||
if (pid == USB_PRODUCT_ID_TENDA
|
||||
|| pid == USB_PRODUCT_ID_AIC8800FC_CUS3
|
||||
|| pid == USB_PRODUCT_ID_AIC8800FC_CUS5
|
||||
|| pid == USB_PRODUCT_ID_AIC8800FC_CUS6) {
|
||||
filename = FW_USERCONFIG_NAME_8800DW_W311;
|
||||
} else if (pid == USB_PRODUCT_ID_TENDA_U2
|
||||
|| pid == USB_PRODUCT_ID_AIC8800FC_CUS1
|
||||
|| pid == USB_PRODUCT_ID_AIC8800FC_CUS2
|
||||
|| pid == USB_PRODUCT_ID_AIC8800FC_CUS4) {
|
||||
filename = FW_USERCONFIG_NAME_8800DW_U2;
|
||||
}
|
||||
|
||||
AICWFDBG(LOGINFO, "userconfig file path:%s \r\n", filename);
|
||||
|
||||
@@ -3583,7 +3684,7 @@ int rwnx_plat_powerlimit_load_8800dcdw(struct rwnx_hw *rwnx_hw, uint16_t chip_id
|
||||
/* Copy the file on the Embedded side */
|
||||
AICWFDBG(LOGINFO, "### Load file done: %s, size=%d\n", filename, size);
|
||||
|
||||
rwnx_plat_powerlimit_parsing((char *)dst, size, country_code);
|
||||
rwnx_plat_powerlimit_parsing((char *)dst, size);
|
||||
|
||||
rwnx_release_firmware_common(&dst);
|
||||
|
||||
@@ -3638,7 +3739,6 @@ void system_config_8800dc(struct rwnx_hw *rwnx_hw){
|
||||
array3_tbl_t p_syscfg_msk_tbl;
|
||||
int ret, cnt;
|
||||
const u32 mem_addr = 0x40500000;
|
||||
const u32 cache_mem_addr = 0x40100020;
|
||||
struct dbg_mem_read_cfm rd_mem_addr_cfm;
|
||||
|
||||
ret = rwnx_send_dbg_mem_read_req(rwnx_hw, mem_addr, &rd_mem_addr_cfm);
|
||||
@@ -3652,21 +3752,6 @@ void system_config_8800dc(struct rwnx_hw *rwnx_hw){
|
||||
chip_mcu_id = 1;
|
||||
}
|
||||
|
||||
if (chip_mcu_id) {
|
||||
ret = rwnx_send_dbg_mem_read_req(rwnx_hw, cache_mem_addr, &rd_mem_addr_cfm);
|
||||
if (ret) {
|
||||
AICWFDBG(LOGERROR, "%x rd fail: %d\n", mem_addr, ret);
|
||||
return;
|
||||
}
|
||||
rd_mem_addr_cfm.memdata |= 0x01;
|
||||
ret = rwnx_send_dbg_mem_write_req(rwnx_hw, cache_mem_addr, rd_mem_addr_cfm.memdata);
|
||||
|
||||
if (ret) {
|
||||
AICWFDBG(LOGERROR, "%x write fail: %d\n", cache_mem_addr, ret);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
ret = rwnx_send_dbg_mem_read_req(rwnx_hw, 0x00000020, &rd_mem_addr_cfm);
|
||||
if (ret) {
|
||||
AICWFDBG(LOGERROR, "[0x00000020] rd fail: %d\n", ret);
|
||||
@@ -3674,10 +3759,7 @@ void system_config_8800dc(struct rwnx_hw *rwnx_hw){
|
||||
}
|
||||
chip_sub_id = (u8)(rd_mem_addr_cfm.memdata);
|
||||
//printk("%x=%x\n", rd_mem_addr_cfm.memaddr, rd_mem_addr_cfm.memdata);
|
||||
AICWFDBG(LOGINFO, "chip_id=%x, chip_mcu_id=%x, chip_sub_id=%x\n",
|
||||
chip_id, chip_mcu_id, chip_sub_id);
|
||||
AICWFDBG(LOGINFO,
|
||||
"issue71: using complete pre-SDK-V5/V3 DC/DW firmware and loader profile\n");
|
||||
AICWFDBG(LOGINFO, "chip_id=%x, chip_sub_id=%x\n", chip_id, chip_sub_id);
|
||||
|
||||
|
||||
//Crystal provided by CPU (start)
|
||||
|
||||
@@ -335,6 +335,12 @@ struct apm_probe_sta {
|
||||
u8 sta_mac_addr[6];
|
||||
u8 vif_idx;
|
||||
u64 probe_id;
|
||||
/*
|
||||
* 7.3+ only: the cookie cfg80211_ops::probe_peer() was called with,
|
||||
* echoed back via cfg80211_probe_status() once the probe completes.
|
||||
* See rwnx_cfg80211_probe_client().
|
||||
*/
|
||||
u64 cookie;
|
||||
struct work_struct apmprobestaWork;
|
||||
struct workqueue_struct *apmprobesta_wq;
|
||||
};
|
||||
@@ -675,6 +681,16 @@ struct rwnx_roc_elem {
|
||||
bool mgmt_roc;
|
||||
/* Indicate if we have switch on the RoC channel */
|
||||
bool on_chan;
|
||||
/*
|
||||
* The cookie reported to cfg80211 for this RoC, via
|
||||
* cfg80211_ready_on_channel() / cfg80211_remain_on_channel_expired().
|
||||
* On 7.3+, for a RoC started directly by cfg80211_ops::remain_on_channel(),
|
||||
* this is the cookie cfg80211 pre-assigned; on every older kernel, and
|
||||
* always for the purely-internal RoC started from inside mgmt_tx, it is
|
||||
* rwnx_hw->roc_cookie_cnt at RoC-start time. See
|
||||
* rwnx_cfg80211_remain_on_channel_().
|
||||
*/
|
||||
u64 cookie;
|
||||
};
|
||||
|
||||
/* Structure containing channel survey information received from MAC */
|
||||
|
||||
@@ -1518,18 +1518,30 @@ static int rwnx_close(struct net_device *dev)
|
||||
|
||||
RWNX_DBG(RWNX_FN_ENTRY_STR);
|
||||
|
||||
test_counter = waiting_counter;
|
||||
while(atomic_read(&rwnx_vif->drv_conn_state) == (int)RWNX_DRV_STATUS_DISCONNECTING||
|
||||
atomic_read(&rwnx_vif->drv_conn_state) == (int)RWNX_DRV_STATUS_CONNECTING){
|
||||
AICWFDBG(LOGDEBUG, "%s wifi is connecting or disconnecting, waiting 200ms for state to stable\r\n", __func__);
|
||||
msleep(200);
|
||||
test_counter--;
|
||||
if(test_counter == 0){
|
||||
AICWFDBG(LOGERROR, "%s connecting or disconnecting, not finish\r\n", __func__);
|
||||
WARN_ON(1);
|
||||
break;
|
||||
}
|
||||
}
|
||||
/*
|
||||
* A CONNECTING/DISCONNECTING state is only left when the firmware answers
|
||||
* the pending request. If the bus is already down the answer can never
|
||||
* arrive: rwnx_send_msg() silently drops the message and returns 0
|
||||
* (rwnx_msg_tx.c), so the wait below would always run its full timeout and
|
||||
* fire the spurious WARN_ON() during USB teardown. Skip the wait when the
|
||||
* bus is down, using the same condition the vif_started path uses below.
|
||||
*/
|
||||
if (bus_if &&
|
||||
(usbdev == NULL || (usbdev->bus_if->state != BUS_DOWN_ST &&
|
||||
usbdev->state != USB_DOWN_ST))) {
|
||||
test_counter = waiting_counter;
|
||||
while(atomic_read(&rwnx_vif->drv_conn_state) == (int)RWNX_DRV_STATUS_DISCONNECTING||
|
||||
atomic_read(&rwnx_vif->drv_conn_state) == (int)RWNX_DRV_STATUS_CONNECTING){
|
||||
AICWFDBG(LOGDEBUG, "%s wifi is connecting or disconnecting, waiting 200ms for state to stable\r\n", __func__);
|
||||
msleep(200);
|
||||
test_counter--;
|
||||
if(test_counter == 0){
|
||||
AICWFDBG(LOGERROR, "%s connecting or disconnecting, not finish\r\n", __func__);
|
||||
WARN_ON(1);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#if defined(AICWF_USB_SUPPORT) || defined(AICWF_SDIO_SUPPORT)
|
||||
if (rwnx_hw->scanning){
|
||||
@@ -1587,13 +1599,18 @@ static int rwnx_close(struct net_device *dev)
|
||||
test_counter = waiting_counter;
|
||||
if(atomic_read(&rwnx_vif->drv_conn_state) == (int)RWNX_DRV_STATUS_CONNECTED){
|
||||
rwnx_set_conn_state(rwnx_vif, &rwnx_vif->drv_conn_state, RWNX_DRV_STATUS_DISCONNECTING);
|
||||
rwnx_send_sm_disconnect_req(rwnx_hw, rwnx_vif, 3);
|
||||
while (atomic_read(&rwnx_vif->drv_conn_state) == (int)RWNX_DRV_STATUS_DISCONNECTING) {
|
||||
AICWFDBG(LOGDEBUG, "%s wifi is disconnecting, waiting 100ms for state to stable\r\n", __func__);
|
||||
msleep(100);
|
||||
test_counter--;
|
||||
if (test_counter ==0)
|
||||
break;
|
||||
/* Same reasoning as above: with the bus down the disconnect
|
||||
* confirmation cannot arrive, so do not wait for it. */
|
||||
if (usbdev->bus_if->state != BUS_DOWN_ST &&
|
||||
usbdev->state != USB_DOWN_ST) {
|
||||
rwnx_send_sm_disconnect_req(rwnx_hw, rwnx_vif, 3);
|
||||
while (atomic_read(&rwnx_vif->drv_conn_state) == (int)RWNX_DRV_STATUS_DISCONNECTING) {
|
||||
AICWFDBG(LOGDEBUG, "%s wifi is disconnecting, waiting 100ms for state to stable\r\n", __func__);
|
||||
msleep(100);
|
||||
test_counter--;
|
||||
if (test_counter ==0)
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -3940,7 +3957,21 @@ void apm_probe_sta_work_process(struct work_struct *work)
|
||||
spin_unlock_bh(&rwnx_vif->rwnx_hw->cb_lock);
|
||||
|
||||
printk("sta %pM found = %d\n", mac, found);
|
||||
#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 17, 0)
|
||||
#if AICWF_CFG80211_VERSION_CODE >= KERNEL_VERSION(7, 3, 0)
|
||||
/*
|
||||
* 7.3 added an MLO link_id parameter between cookie and acked. This
|
||||
* driver has no MLO support, and -1 is the documented value for
|
||||
* "non-MLO" (see the cfg80211_probe_status() kerneldoc). The cookie
|
||||
* source also changes here: sta_probe.cookie is the value cfg80211
|
||||
* pre-assigned via probe_peer(), which now must be echoed back
|
||||
* instead of the driver's own probe_id counter -- see
|
||||
* rwnx_cfg80211_probe_client().
|
||||
*/
|
||||
if(found)
|
||||
cfg80211_probe_status(rwnx_vif->ndev, mac, (u64)rwnx_vif->sta_probe.cookie, -1, 1, 0, false, GFP_ATOMIC);
|
||||
else
|
||||
cfg80211_probe_status(rwnx_vif->ndev, mac, (u64)rwnx_vif->sta_probe.cookie, -1, 0, 0, false, GFP_ATOMIC);
|
||||
#elif LINUX_VERSION_CODE >= KERNEL_VERSION(4, 17, 0)
|
||||
if(found)
|
||||
cfg80211_probe_status(rwnx_vif->ndev, mac, (u64)rwnx_vif->sta_probe.probe_id, 1, 0, false, GFP_ATOMIC);
|
||||
else
|
||||
@@ -4497,11 +4528,20 @@ int rwnx_cfg80211_set_monitor_channel_(struct wiphy *wiphy,
|
||||
|
||||
|
||||
/**
|
||||
* @probe_client: probe an associated client, must return a cookie that it
|
||||
* later passes to cfg80211_probe_status().
|
||||
* @probe_peer: probe an associated client. Before 7.3 the driver returns a
|
||||
* cookie of its own and passes the same value to cfg80211_probe_status()
|
||||
* later; from 7.3 the cookie is assigned by cfg80211, passed in, and must
|
||||
* be echoed back unchanged. Renamed from @probe_client upstream; kept as
|
||||
* rwnx_cfg80211_probe_client() here since only the cfg80211_ops field
|
||||
* name changed, not this driver's own naming.
|
||||
*/
|
||||
#if AICWF_CFG80211_VERSION_CODE >= KERNEL_VERSION(7, 3, 0)
|
||||
int rwnx_cfg80211_probe_client(struct wiphy *wiphy, struct net_device *dev,
|
||||
const u8 *peer, u64 cookie)
|
||||
#else
|
||||
int rwnx_cfg80211_probe_client(struct wiphy *wiphy, struct net_device *dev,
|
||||
const u8 *peer, u64 *cookie)
|
||||
#endif
|
||||
{
|
||||
//struct rwnx_hw *rwnx_hw = wiphy_priv(wiphy);
|
||||
struct rwnx_vif *vif = netdev_priv(dev);
|
||||
@@ -4525,9 +4565,21 @@ int rwnx_cfg80211_probe_client(struct wiphy *wiphy, struct net_device *dev,
|
||||
|
||||
|
||||
memcpy(vif->sta_probe.sta_mac_addr, peer, 6);
|
||||
queue_work(vif->sta_probe.apmprobesta_wq, &vif->sta_probe.apmprobestaWork);
|
||||
|
||||
#if AICWF_CFG80211_VERSION_CODE >= KERNEL_VERSION(7, 3, 0)
|
||||
/*
|
||||
* 7.3 made this an input parameter: cfg80211 pre-assigns the cookie
|
||||
* before calling us instead of us inventing one and returning it. Save
|
||||
* it before queueing the work: the worker may run on another CPU as
|
||||
* soon as it is queued, and it echoes this value back via
|
||||
* cfg80211_probe_status() once the probe completes.
|
||||
*/
|
||||
vif->sta_probe.cookie = cookie;
|
||||
#else
|
||||
*cookie = vif->sta_probe.probe_id;
|
||||
#endif
|
||||
|
||||
queue_work(vif->sta_probe.apmprobesta_wq, &vif->sta_probe.apmprobestaWork);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -4728,6 +4780,7 @@ rwnx_cfg80211_remain_on_channel_(struct wiphy *wiphy,
|
||||
struct wireless_dev *wdev = &rwnx_vif->wdev;
|
||||
#endif
|
||||
struct rwnx_roc_elem *roc_elem;
|
||||
u64 roc_cookie;
|
||||
struct mm_add_if_cfm add_if_cfm;
|
||||
struct mm_remain_on_channel_cfm roc_cfm;
|
||||
int error;
|
||||
@@ -4819,6 +4872,34 @@ rwnx_cfg80211_remain_on_channel_(struct wiphy *wiphy,
|
||||
/* Initialize the OFFCHAN TX queue to allow off-channel transmissions */
|
||||
rwnx_txq_offchan_init(rwnx_vif);
|
||||
|
||||
/*
|
||||
* Decide the cookie before the element is published and the request
|
||||
* sent: the RX path can deliver the channel-switch indication and
|
||||
* call cfg80211_ready_on_channel() with roc_elem->cookie before this
|
||||
* thread resumes, so it must already be the final value by then.
|
||||
* Taking one snapshot here also keeps that value and the one reported
|
||||
* back to the caller below identical: rwnx_send_roc() sleeps, and the
|
||||
* RoC expiry handler increments roc_cookie_cnt, so re-reading the
|
||||
* counter afterwards could return a different value than the one
|
||||
* already reported to cfg80211.
|
||||
*/
|
||||
#if AICWF_CFG80211_VERSION_CODE >= KERNEL_VERSION(7, 3, 0)
|
||||
/*
|
||||
* mgmt_roc_flag is false only for the direct cfg80211
|
||||
* .remain_on_channel call path (see rwnx_cfg80211_remain_on_channel()
|
||||
* below), where on 7.3+ *cookie already holds the value cfg80211
|
||||
* pre-assigned and must be honored rather than overwritten. The
|
||||
* purely-internal RoC this function also serves (started from
|
||||
* inside mgmt_tx, mgmt_roc_flag true) never goes through that
|
||||
* cfg80211 op, so there is no pre-assigned value to honor there --
|
||||
* keep inventing one, exactly as on every older kernel.
|
||||
*/
|
||||
roc_cookie = mgmt_roc_flag ? (u64)(rwnx_hw->roc_cookie_cnt) : *cookie;
|
||||
#else
|
||||
roc_cookie = (u64)(rwnx_hw->roc_cookie_cnt);
|
||||
#endif
|
||||
roc_elem->cookie = roc_cookie;
|
||||
|
||||
/* Forward the information to the FMAC */
|
||||
rwnx_hw->roc_elem = roc_elem;
|
||||
error = rwnx_send_roc(rwnx_hw, rwnx_vif, chan, duration, &roc_cfm);
|
||||
@@ -4827,7 +4908,12 @@ rwnx_cfg80211_remain_on_channel_(struct wiphy *wiphy,
|
||||
if (error == 0) {
|
||||
|
||||
/* Set the cookie value */
|
||||
*cookie = (u64)(rwnx_hw->roc_cookie_cnt);
|
||||
#if AICWF_CFG80211_VERSION_CODE >= KERNEL_VERSION(7, 3, 0)
|
||||
if (mgmt_roc_flag)
|
||||
*cookie = roc_cookie;
|
||||
#else
|
||||
*cookie = roc_cookie;
|
||||
#endif
|
||||
if(roc_cfm.status) {
|
||||
// failed to roc
|
||||
rwnx_hw->roc_elem = NULL;
|
||||
@@ -4857,18 +4943,42 @@ rwnx_cfg80211_remain_on_channel(struct wiphy *wiphy,
|
||||
#if LINUX_VERSION_CODE < KERNEL_VERSION(3, 8, 0)
|
||||
enum nl80211_channel_type channel_type,
|
||||
#endif
|
||||
unsigned int duration, u64 *cookie
|
||||
#if AICWF_CFG80211_VERSION_CODE >= KERNEL_VERSION(7, 2, 0)
|
||||
unsigned int duration,
|
||||
#if AICWF_CFG80211_VERSION_CODE >= KERNEL_VERSION(7, 3, 0)
|
||||
/*
|
||||
* 7.3 made this cookie an input parameter: cfg80211
|
||||
* pre-assigns it before calling us instead of us
|
||||
* inventing one and returning it. See
|
||||
* rwnx_cfg80211_remain_on_channel_(). rx_addr is
|
||||
* unused for the reason given in the 7.2 arm below:
|
||||
* it is always NULL for this driver.
|
||||
*/
|
||||
u64 cookie, const u8 *rx_addr
|
||||
#elif AICWF_CFG80211_VERSION_CODE >= KERNEL_VERSION(7, 2, 0)
|
||||
/*
|
||||
* 7.2 added an optional receive address filter for the off-channel
|
||||
* period. cfg80211 refuses a non-NULL one unless the driver sets
|
||||
* NL80211_EXT_FEATURE_ROC_ADDR_FILTER, which this one does not, so it
|
||||
* is always NULL here. mac80211 ignores it in the same way.
|
||||
*/
|
||||
, const u8 *rx_addr
|
||||
u64 *cookie, const u8 *rx_addr
|
||||
#else
|
||||
u64 *cookie
|
||||
#endif
|
||||
)
|
||||
{
|
||||
#if AICWF_CFG80211_VERSION_CODE >= KERNEL_VERSION(7, 3, 0)
|
||||
/*
|
||||
* 7.3 passes the cookie by value, while the shared helper still takes a
|
||||
* pointer because its internal caller invents one. Only the argument
|
||||
* differs, so pick it here and leave the call itself alone.
|
||||
*/
|
||||
u64 local_cookie = cookie;
|
||||
u64 *cookie_ptr = &local_cookie;
|
||||
#else
|
||||
u64 *cookie_ptr = cookie;
|
||||
#endif
|
||||
|
||||
return rwnx_cfg80211_remain_on_channel_(wiphy,
|
||||
#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 6, 0)
|
||||
wdev,
|
||||
@@ -4879,7 +4989,7 @@ rwnx_cfg80211_remain_on_channel(struct wiphy *wiphy,
|
||||
#if LINUX_VERSION_CODE < KERNEL_VERSION(3, 8, 0)
|
||||
channel_type,
|
||||
#endif
|
||||
duration, cookie, false);
|
||||
duration, cookie_ptr, false);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -5057,7 +5167,17 @@ struct ieee80211_channel *rwnx_cfg80211_get_channel(struct wiphy *wiphy)
|
||||
/**
|
||||
* @mgmt_tx: Transmit a management frame.
|
||||
*/
|
||||
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 14, 0))
|
||||
#if (AICWF_CFG80211_VERSION_CODE >= KERNEL_VERSION(7, 3, 0))
|
||||
static int rwnx_cfg80211_mgmt_tx(struct wiphy *wiphy, struct wireless_dev *wdev,
|
||||
struct cfg80211_mgmt_tx_params *params,
|
||||
/*
|
||||
* 7.3 made this cookie an input parameter: cfg80211
|
||||
* pre-assigns it before calling us instead of us
|
||||
* inventing one and returning it. See
|
||||
* rwnx_start_mgmt_xmit().
|
||||
*/
|
||||
u64 cookie)
|
||||
#elif (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 14, 0))
|
||||
static int rwnx_cfg80211_mgmt_tx(struct wiphy *wiphy, struct wireless_dev *wdev,
|
||||
struct cfg80211_mgmt_tx_params *params,
|
||||
u64 *cookie)
|
||||
@@ -5072,7 +5192,7 @@ static int rwnx_cfg80211_mgmt_tx(struct wiphy *wiphy, struct wireless_dev *wdev,
|
||||
bool dont_wait_for_ack,
|
||||
#endif
|
||||
u64 *cookie)
|
||||
#endif /* LINUX_VERSION_CODE >= KERNEL_VERSION(3, 14, 0) */
|
||||
#endif /* AICWF_CFG80211_VERSION_CODE >= 7.3 / LINUX_VERSION_CODE >= 3.14 */
|
||||
{
|
||||
struct rwnx_hw *rwnx_hw = wiphy_priv(wiphy);
|
||||
#if (LINUX_VERSION_CODE < KERNEL_VERSION(3, 6, 0))
|
||||
@@ -5159,7 +5279,8 @@ static int rwnx_cfg80211_mgmt_tx(struct wiphy *wiphy, struct wireless_dev *wdev,
|
||||
return -EINVAL;
|
||||
}
|
||||
} else {
|
||||
u64 cookie;
|
||||
/* The internal RoC's own cookie; deliberately not the mgmt_tx one. */
|
||||
u64 roc_cookie;
|
||||
int error;
|
||||
|
||||
AICWFDBG(LOGINFO, "mgmt rx remain on chan\n");
|
||||
@@ -5167,13 +5288,13 @@ static int rwnx_cfg80211_mgmt_tx(struct wiphy *wiphy, struct wireless_dev *wdev,
|
||||
/* Start a ROC procedure for 30ms */
|
||||
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 8, 0))
|
||||
error = rwnx_cfg80211_remain_on_channel_(wiphy, wdev, channel,
|
||||
30, &cookie, true);
|
||||
30, &roc_cookie, true);
|
||||
#elif (LINUX_VERSION_CODE < KERNEL_VERSION(3, 8, 0)) && (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 6, 0))
|
||||
error = rwnx_cfg80211_remain_on_channel_(wiphy, wdev, channel, NL80211_CHAN_NO_HT,
|
||||
30, &cookie, true);
|
||||
30, &roc_cookie, true);
|
||||
#else
|
||||
error = rwnx_cfg80211_remain_on_channel_(wiphy, dev, channel, NL80211_CHAN_NO_HT,
|
||||
30, &cookie, true);
|
||||
30, &roc_cookie, true);
|
||||
#endif
|
||||
|
||||
if (error) {
|
||||
@@ -5190,11 +5311,16 @@ static int rwnx_cfg80211_mgmt_tx(struct wiphy *wiphy, struct wireless_dev *wdev,
|
||||
#endif
|
||||
|
||||
send_frame:
|
||||
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 14, 0))
|
||||
return rwnx_start_mgmt_xmit(rwnx_vif, rwnx_sta, params, offchan, cookie);
|
||||
#if (AICWF_CFG80211_VERSION_CODE >= KERNEL_VERSION(7, 3, 0))
|
||||
{
|
||||
u64 local_cookie = cookie;
|
||||
return rwnx_start_mgmt_xmit(rwnx_vif, rwnx_sta, params, offchan, &local_cookie, true);
|
||||
}
|
||||
#elif (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 14, 0))
|
||||
return rwnx_start_mgmt_xmit(rwnx_vif, rwnx_sta, params, offchan, cookie, false);
|
||||
#else
|
||||
return rwnx_start_mgmt_xmit(rwnx_vif, rwnx_sta, channel, offchan, wait, buf, len, no_cck, dont_wait_for_ack, cookie);
|
||||
#endif /* LINUX_VERSION_CODE >= KERNEL_VERSION(3, 14, 0) */
|
||||
return rwnx_start_mgmt_xmit(rwnx_vif, rwnx_sta, channel, offchan, wait, buf, len, no_cck, dont_wait_for_ack, cookie, false);
|
||||
#endif /* AICWF_CFG80211_VERSION_CODE >= 7.3 / LINUX_VERSION_CODE >= 3.14 */
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -6552,7 +6678,11 @@ static struct cfg80211_ops rwnx_cfg80211_ops = {
|
||||
.change_beacon = rwnx_cfg80211_change_beacon,
|
||||
.stop_ap = rwnx_cfg80211_stop_ap,
|
||||
.set_monitor_channel = rwnx_cfg80211_set_monitor_channel,
|
||||
#if AICWF_CFG80211_VERSION_CODE >= KERNEL_VERSION(7, 3, 0)
|
||||
.probe_peer = rwnx_cfg80211_probe_client,
|
||||
#else
|
||||
.probe_client = rwnx_cfg80211_probe_client,
|
||||
#endif
|
||||
// .mgmt_frame_register = rwnx_cfg80211_mgmt_frame_register,
|
||||
.set_wiphy_params = rwnx_cfg80211_set_wiphy_params,
|
||||
.set_txq_params = rwnx_cfg80211_set_txq_params,
|
||||
|
||||
@@ -99,8 +99,13 @@ int rwnx_cfg80211_set_monitor_channel_(struct wiphy *wiphy,
|
||||
int rwnx_cfg80211_set_monitor_channel_(struct wiphy *wiphy,
|
||||
struct cfg80211_chan_def *chandef);
|
||||
#endif
|
||||
#if AICWF_CFG80211_VERSION_CODE >= KERNEL_VERSION(7, 3, 0)
|
||||
int rwnx_cfg80211_probe_client(struct wiphy *wiphy, struct net_device *dev,
|
||||
const u8 *peer, u64 cookie);
|
||||
#else
|
||||
int rwnx_cfg80211_probe_client(struct wiphy *wiphy, struct net_device *dev,
|
||||
const u8 *peer, u64 *cookie);
|
||||
#endif
|
||||
void rwnx_cfg80211_mgmt_frame_register(struct wiphy *wiphy,
|
||||
#if (LINUX_VERSION_CODE < KERNEL_VERSION(3,6,0))
|
||||
struct net_device *dev,
|
||||
|
||||
@@ -123,13 +123,13 @@ static inline int rwnx_rx_chan_switch_ind(struct rwnx_hw *rwnx_hw,
|
||||
if (!roc_elem->mgmt_roc) {
|
||||
/* Inform the host that we have switch on the indicated off-channel */
|
||||
#if LINUX_VERSION_CODE < KERNEL_VERSION(3, 6, 0)
|
||||
cfg80211_ready_on_channel(roc_elem->wdev->netdev, (u64)(rwnx_hw->roc_cookie_cnt),
|
||||
cfg80211_ready_on_channel(roc_elem->wdev->netdev, roc_elem->cookie,
|
||||
roc_elem->chan, NL80211_CHAN_HT20, roc_elem->duration, GFP_ATOMIC);
|
||||
#elif LINUX_VERSION_CODE < KERNEL_VERSION(3, 8, 0)
|
||||
cfg80211_ready_on_channel(roc_elem->wdev, (u64)(rwnx_hw->roc_cookie_cnt),
|
||||
cfg80211_ready_on_channel(roc_elem->wdev, roc_elem->cookie,
|
||||
roc_elem->chan, NL80211_CHAN_HT20, roc_elem->duration, GFP_ATOMIC);
|
||||
#else
|
||||
cfg80211_ready_on_channel(roc_elem->wdev, (u64)(rwnx_hw->roc_cookie_cnt),
|
||||
cfg80211_ready_on_channel(roc_elem->wdev, roc_elem->cookie,
|
||||
roc_elem->chan, roc_elem->duration, GFP_ATOMIC);
|
||||
#endif
|
||||
}
|
||||
@@ -245,13 +245,13 @@ static inline int rwnx_rx_remain_on_channel_exp_ind(struct rwnx_hw *rwnx_hw,
|
||||
/* Inform the host that off-channel period has expired */
|
||||
|
||||
#if LINUX_VERSION_CODE < KERNEL_VERSION(3, 6, 0)
|
||||
cfg80211_remain_on_channel_expired(roc_elem->wdev->netdev, (u64)(rwnx_hw->roc_cookie_cnt),
|
||||
cfg80211_remain_on_channel_expired(roc_elem->wdev->netdev, roc_elem->cookie,
|
||||
roc_elem->chan, NL80211_CHAN_HT20, GFP_ATOMIC);
|
||||
#elif LINUX_VERSION_CODE < KERNEL_VERSION(3, 8, 0)
|
||||
cfg80211_remain_on_channel_expired(roc_elem->wdev, (u64)(rwnx_hw->roc_cookie_cnt),
|
||||
cfg80211_remain_on_channel_expired(roc_elem->wdev, roc_elem->cookie,
|
||||
roc_elem->chan, NL80211_CHAN_HT20, GFP_ATOMIC);
|
||||
#else
|
||||
cfg80211_remain_on_channel_expired(roc_elem->wdev, (u64)(rwnx_hw->roc_cookie_cnt),
|
||||
cfg80211_remain_on_channel_expired(roc_elem->wdev, roc_elem->cookie,
|
||||
roc_elem->chan, GFP_ATOMIC);
|
||||
#endif
|
||||
}
|
||||
|
||||
@@ -775,9 +775,9 @@ rwnx_tdls_send_mgmt_packet_data(struct rwnx_hw *rwnx_hw, struct rwnx_vif *rwnx_v
|
||||
|
||||
params.len = skb->len;
|
||||
params.buf = skb->data;
|
||||
ret = rwnx_start_mgmt_xmit(rwnx_vif, NULL, ¶ms, false, &cookie);
|
||||
ret = rwnx_start_mgmt_xmit(rwnx_vif, NULL, ¶ms, false, &cookie, false);
|
||||
#else
|
||||
ret = rwnx_start_mgmt_xmit(rwnx_vif, NULL, NULL, false, 0, skb->data, skb->len, false, false, &cookie);
|
||||
ret = rwnx_start_mgmt_xmit(rwnx_vif, NULL, NULL, false, 0, skb->data, skb->len, false, false, &cookie, false);
|
||||
#endif /* LINUX_VERSION_CODE >= KERNEL_VERSION(3, 14, 0) */
|
||||
|
||||
return ret;
|
||||
|
||||
@@ -1325,6 +1325,7 @@ int intf_tx(struct rwnx_hw *priv,struct msg_buf *msg)
|
||||
sw_txhdr->rwnx_sta = sta;
|
||||
sw_txhdr->rwnx_vif = rwnx_vif;
|
||||
sw_txhdr->skb = skb;
|
||||
sw_txhdr->cookie = (unsigned long)skb;
|
||||
sw_txhdr->headroom = headroom;
|
||||
sw_txhdr->map_len = skb->len - offsetof(struct rwnx_txhdr, hw_hdr);
|
||||
|
||||
@@ -1541,6 +1542,7 @@ netdev_tx_t rwnx_start_xmit(struct sk_buff *skb, struct net_device *dev)
|
||||
sw_txhdr->rwnx_sta = sta;
|
||||
sw_txhdr->rwnx_vif = rwnx_vif;
|
||||
sw_txhdr->skb = skb;
|
||||
sw_txhdr->cookie = (unsigned long)skb;
|
||||
sw_txhdr->headroom = headroom;
|
||||
sw_txhdr->map_len = skb->len - offsetof(struct rwnx_txhdr, hw_hdr);
|
||||
|
||||
@@ -1630,7 +1632,12 @@ free:
|
||||
* @params: Mgmt frame parameters
|
||||
* @offchan: Indicate whether the frame must be send via the offchan TXQ.
|
||||
* (is is redundant with params->offchan ?)
|
||||
* @cookie: updated with a unique value to identify the frame with upper layer
|
||||
* @cookie: on return, the value cfg80211_mgmt_tx_status() will report for
|
||||
* this frame: invented here (the skb pointer) unless
|
||||
* @use_given_cookie is set, in which case *@cookie is kept.
|
||||
* @use_given_cookie: *@cookie already holds the cookie cfg80211 assigned
|
||||
* (7.3+, the direct .mgmt_tx path only); honour it instead of
|
||||
* inventing one. Every other caller passes false.
|
||||
*
|
||||
*/
|
||||
|
||||
@@ -1638,7 +1645,7 @@ free:
|
||||
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 14, 0))
|
||||
int rwnx_start_mgmt_xmit(struct rwnx_vif *vif, struct rwnx_sta *sta,
|
||||
struct cfg80211_mgmt_tx_params *params, bool offchan,
|
||||
u64 *cookie)
|
||||
u64 *cookie, bool use_given_cookie)
|
||||
#else
|
||||
int rwnx_start_mgmt_xmit(struct rwnx_vif *vif, struct rwnx_sta *sta,
|
||||
struct ieee80211_channel *channel, bool offchan,
|
||||
@@ -1649,7 +1656,7 @@ int rwnx_start_mgmt_xmit(struct rwnx_vif *vif, struct rwnx_sta *sta,
|
||||
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 3, 0))
|
||||
bool dont_wait_for_ack,
|
||||
#endif
|
||||
u64 *cookie)
|
||||
u64 *cookie, bool use_given_cookie)
|
||||
#endif /* LINUX_VERSION_CODE >= KERNEL_VERSION(3, 14, 0) */
|
||||
{
|
||||
struct rwnx_hw *rwnx_hw = vif->rwnx_hw;
|
||||
@@ -1703,7 +1710,18 @@ int rwnx_start_mgmt_xmit(struct rwnx_vif *vif, struct rwnx_sta *sta,
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
*cookie = (unsigned long)skb;
|
||||
/*
|
||||
* use_given_cookie is true only for the direct cfg80211 .mgmt_tx call
|
||||
* path on 7.3+, where *cookie already holds the value cfg80211
|
||||
* pre-assigned and must be echoed back via cfg80211_mgmt_tx_status()
|
||||
* later -- see rwnx_cfg80211_mgmt_tx(). TDLS's internal reuse of this
|
||||
* function (use_given_cookie == false) never goes through that cfg80211
|
||||
* op, so it still gets an invented, locally-unique cookie exactly as
|
||||
* before this fix, and on every kernel older than 7.3 every caller
|
||||
* passes use_given_cookie == false, also leaving this unchanged.
|
||||
*/
|
||||
if (!use_given_cookie)
|
||||
*cookie = (unsigned long)skb;
|
||||
|
||||
/*
|
||||
* Move skb->data pointer in order to reserve room for rwnx_txhdr
|
||||
@@ -1773,6 +1791,7 @@ int rwnx_start_mgmt_xmit(struct rwnx_vif *vif, struct rwnx_sta *sta,
|
||||
sw_txhdr->rwnx_sta = sta;
|
||||
sw_txhdr->rwnx_vif = vif;
|
||||
sw_txhdr->skb = skb;
|
||||
sw_txhdr->cookie = *cookie;
|
||||
sw_txhdr->headroom = headroom;
|
||||
sw_txhdr->map_len = skb->len - offsetof(struct rwnx_txhdr, hw_hdr);
|
||||
#ifdef CONFIG_RWNX_AMSDUS_TX
|
||||
@@ -1924,6 +1943,7 @@ void rwnx_probersp_work(struct work_struct *work)
|
||||
sw_txhdr->rwnx_sta = sta;
|
||||
sw_txhdr->rwnx_vif = rwnx_vif;
|
||||
sw_txhdr->skb = skb;
|
||||
sw_txhdr->cookie = (unsigned long)skb;
|
||||
sw_txhdr->headroom = headroom;
|
||||
sw_txhdr->map_len = skb->len - offsetof(struct rwnx_txhdr, hw_hdr);
|
||||
#ifdef CONFIG_RWNX_AMSDUS_TX
|
||||
@@ -2278,6 +2298,15 @@ netdev_tx_t rwnx_start_monitor_if_xmit(struct sk_buff *skb, struct net_device *d
|
||||
sw_txhdr->rwnx_sta = sta;
|
||||
sw_txhdr->rwnx_vif = vif;
|
||||
sw_txhdr->skb = skb_mgmt;
|
||||
/*
|
||||
* Injected frames are flagged TXU_CNTRL_MGMT below and complete through
|
||||
* the same path as management frames, which reports sw_txhdr->cookie to
|
||||
* cfg80211_mgmt_tx_status(). There is no cfg80211-assigned cookie for an
|
||||
* injected frame, so this is the skb-derived value that path reported
|
||||
* before the field existed. Not gated on 7.3: this path runs on every
|
||||
* kernel with CONFIG_RWNX_MON_XMIT.
|
||||
*/
|
||||
sw_txhdr->cookie = (unsigned long)skb_mgmt;
|
||||
sw_txhdr->headroom = headroom;
|
||||
sw_txhdr->map_len = skb_mgmt->len - offsetof(struct rwnx_txhdr, hw_hdr);
|
||||
sw_txhdr->raw_frame = 1;
|
||||
@@ -2389,7 +2418,7 @@ int rwnx_txdatacfm(void *pthis, void *host_id)
|
||||
#endif
|
||||
/* Confirm transmission to CFG80211 */
|
||||
cfg80211_mgmt_tx_status(&sw_txhdr->rwnx_vif->wdev,
|
||||
(unsigned long)skb,
|
||||
sw_txhdr->cookie,
|
||||
(skb->data + sw_txhdr->headroom),
|
||||
sw_txhdr->frame_len,
|
||||
rwnx_txst.acknowledged,
|
||||
|
||||
@@ -130,6 +130,17 @@ struct rwnx_sw_txhdr {
|
||||
#endif
|
||||
u32 need_cfm;
|
||||
struct sk_buff *skb;
|
||||
/*
|
||||
* The cookie cfg80211_mgmt_tx_status() reports for this frame. sw_txhdr
|
||||
* comes from a kmem_cache and is never zeroed, so every allocation site
|
||||
* sets this: (unsigned long)skb, which is what the completion path
|
||||
* reported before the field existed, except in rwnx_start_mgmt_xmit(),
|
||||
* which stores the cfg80211-assigned cookie it was handed on 7.3+ (see
|
||||
* use_given_cookie there). Only frames flagged TXU_CNTRL_MGMT are ever
|
||||
* reported, but the field is initialised unconditionally so that filter
|
||||
* is not what keeps it safe.
|
||||
*/
|
||||
u64 cookie;
|
||||
|
||||
size_t map_len;
|
||||
dma_addr_t dma_addr;
|
||||
@@ -158,7 +169,7 @@ netdev_tx_t rwnx_start_xmit(struct sk_buff *skb, struct net_device *dev);
|
||||
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 14, 0))
|
||||
int rwnx_start_mgmt_xmit(struct rwnx_vif *vif, struct rwnx_sta *sta,
|
||||
struct cfg80211_mgmt_tx_params *params, bool offchan,
|
||||
u64 *cookie);
|
||||
u64 *cookie, bool use_given_cookie);
|
||||
#else
|
||||
int rwnx_start_mgmt_xmit(struct rwnx_vif *vif, struct rwnx_sta *sta,
|
||||
struct ieee80211_channel *channel, bool offchan,
|
||||
@@ -169,7 +180,7 @@ int rwnx_start_mgmt_xmit(struct rwnx_vif *vif, struct rwnx_sta *sta,
|
||||
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 3, 0))
|
||||
bool dont_wait_for_ack,
|
||||
#endif
|
||||
u64 *cookie);
|
||||
u64 *cookie, bool use_given_cookie);
|
||||
#endif /* LINUX_VERSION_CODE >= KERNEL_VERSION(3, 14, 0) */
|
||||
#ifdef CONFIG_RWNX_MON_XMIT
|
||||
netdev_tx_t rwnx_start_monitor_if_xmit(struct sk_buff *skb,
|
||||
|
||||
@@ -39,14 +39,36 @@ typedef struct {
|
||||
#define AIC_PATCH_OFST(mem) ((size_t) &((aic_patch_t *)0)->mem)
|
||||
#define AIC_PATCH_ADDR(mem) ((u32) (aic_patch_str_base + AIC_PATCH_OFST(mem)))
|
||||
|
||||
/*
|
||||
* Issue #58 legacy-loader test.
|
||||
*
|
||||
* Keep this table aligned with the SDK V3 D80 firmware imported from Radxa
|
||||
* commit 254d47e6a131dbed5ba32131972f4719f3e1c7fe. Newer loader patches use
|
||||
* different RX aggregation settings and a user_ext_flags field that is not
|
||||
* part of this firmware generation.
|
||||
*/
|
||||
#define USER_PWROFST_COVER_CALIB_FLAG (0x01U << 0)
|
||||
#define USER_CHAN_MAX_TXPWR_EN_FLAG (0x01U << 1)
|
||||
#define USER_TX_USE_ANA_F_FLAG (0x01U << 2)
|
||||
#define USER_APM_PRBRSP_OFFLOAD_DISABLE_FLAG (0x01U << 3)
|
||||
#define USER_HE_MU_EDCA_UPDATE_DISABLE_FLAG (0x01U << 4)
|
||||
#define USER_LOFT_CALIB_DISABLE_FLAG (0x01U << 6)
|
||||
#define USER_CAPA_CALIB_DISABLE_FLAG (0x01U << 7)
|
||||
#define USER_PWR_CALIB_DISABLE_FLAG (0x01U << 8)
|
||||
#define USER_IPA_CALIB_DISABLE_FLAG (0x01U << 13)
|
||||
|
||||
#define USER_EXT_FLAGS_DEFAULT_D80 (USER_PWROFST_COVER_CALIB_FLAG)
|
||||
|
||||
#define CFG_USER_PWROFST_COVER_CALIB_EN (1)
|
||||
#if (defined(CONFIG_POWER_LIMIT))
|
||||
#define CFG_USER_CHAN_MAX_TXPWR_EN (1)
|
||||
#else
|
||||
#define CFG_USER_CHAN_MAX_TXPWR_EN (0)
|
||||
#endif
|
||||
#define CFG_USER_TX_USE_ANA_F_EN (0)
|
||||
#if (defined(CONFIG_PRBREQ_REPORT))
|
||||
#define CFG_USER_APM_PRBRSP_OFFLOAD_DISABLE (1)
|
||||
#else
|
||||
#define CFG_USER_APM_PRBRSP_OFFLOAD_DISABLE (0)
|
||||
#endif
|
||||
#define CFG_USER_HE_MU_EDCA_UPDATE_DISABLE (0)
|
||||
#define CFG_USER_LOFT_CALIB_DISABLE_DISABLE (0)
|
||||
#define CFG_USER_CAPA_CALIB_DISABLE_DISABLE (0)
|
||||
#define CFG_USER_PWR_CALIB_DISABLE_DISABLE (0)
|
||||
#define CFG_USER_IPA_CALIB_DISABLE_DISABLE (0)
|
||||
|
||||
u32 patch_tbl_d80[][2] =
|
||||
{
|
||||
#ifdef USE_5G
|
||||
@@ -54,7 +76,54 @@ u32 patch_tbl_d80[][2] =
|
||||
#else
|
||||
{0x00b4, 0xf3010000},
|
||||
#endif
|
||||
{0x0170, 0x00000002},//rx aggr counter
|
||||
#ifdef CONFIG_PLATFORM_HI
|
||||
{0x0170, 0x00010001},//rx aggr counter
|
||||
#else
|
||||
{0x0170, 0x0001000A},//rx aggr counter
|
||||
#endif
|
||||
|
||||
{0x0188,
|
||||
(USER_EXT_FLAGS_DEFAULT_D80 |
|
||||
#if CFG_USER_CHAN_MAX_TXPWR_EN
|
||||
USER_CHAN_MAX_TXPWR_EN_FLAG |
|
||||
#endif
|
||||
#if CFG_USER_TX_USE_ANA_F_EN
|
||||
USER_TX_USE_ANA_F_FLAG |
|
||||
#endif
|
||||
#if CFG_USER_APM_PRBRSP_OFFLOAD_DISABLE
|
||||
USER_APM_PRBRSP_OFFLOAD_DISABLE_FLAG |
|
||||
#endif
|
||||
#if CFG_USER_HE_MU_EDCA_UPDATE_DISABLE
|
||||
USER_HE_MU_EDCA_UPDATE_DISABLE_FLAG |
|
||||
#endif
|
||||
#if CFG_USER_LOFT_CALIB_DISABLE_DISABLE
|
||||
USER_LOFT_CALIB_DISABLE_FLAG |
|
||||
#endif
|
||||
#if CFG_USER_CAPA_CALIB_DISABLE_DISABLE
|
||||
USER_CAPA_CALIB_DISABLE_FLAG |
|
||||
#endif
|
||||
#if CFG_USER_PWR_CALIB_DISABLE_DISABLE
|
||||
USER_PWR_CALIB_DISABLE_FLAG |
|
||||
#endif
|
||||
#if CFG_USER_IPA_CALIB_DISABLE_DISABLE
|
||||
USER_IPA_CALIB_DISABLE_FLAG |
|
||||
#endif
|
||||
0) & ~(
|
||||
#if !CFG_USER_PWROFST_COVER_CALIB_EN
|
||||
USER_PWROFST_COVER_CALIB_FLAG |
|
||||
#endif
|
||||
0)
|
||||
}, // user_ext_flags
|
||||
|
||||
#ifdef CONFIG_RADAR_OR_IR_DETECT
|
||||
{0x0019c,0x00000900},
|
||||
#endif
|
||||
#ifdef CONFIG_WOWLAN
|
||||
{0x019c,0x01000000},
|
||||
#ifdef ANDROID_PLATFORM
|
||||
{0x01A0, 0x01000001},
|
||||
#endif
|
||||
#endif
|
||||
};
|
||||
|
||||
//adap test
|
||||
@@ -75,11 +144,16 @@ u32 syscfg_tbl_8800d80[][2] = {
|
||||
|
||||
extern int adap_test;
|
||||
|
||||
#define NEW_PATCH_BUFFER_MAP 1
|
||||
|
||||
int aicwf_patch_config_8800d80(struct aic_usb_dev *usb_dev)
|
||||
{
|
||||
u32 rd_patch_addr;
|
||||
u32 aic_patch_addr;
|
||||
u32 config_base, aic_patch_str_base;
|
||||
#if (NEW_PATCH_BUFFER_MAP)
|
||||
u32 patch_buff_addr, patch_buff_base, rd_version_addr, rd_version_val;
|
||||
#endif
|
||||
uint32_t start_addr = 0x001D7000;
|
||||
u32 patch_addr = start_addr;
|
||||
u32 patch_cnt = sizeof(patch_tbl_d80) / 4 / 2;
|
||||
@@ -116,6 +190,32 @@ int aicwf_patch_config_8800d80(struct aic_usb_dev *usb_dev)
|
||||
AICWFDBG(LOGERROR, "%x=%x\n", rd_patch_addr_cfm.memaddr, rd_patch_addr_cfm.memdata);
|
||||
aic_patch_str_base = rd_patch_addr_cfm.memdata;
|
||||
|
||||
#if (NEW_PATCH_BUFFER_MAP)
|
||||
if (chip_id == CHIP_REV_U01) {
|
||||
rd_version_addr = RAM_FMAC_FW_ADDR_8800D80 + 0x01C;
|
||||
} else {
|
||||
rd_version_addr = RAM_FMAC_FW_ADDR_8800D80_U02 + 0x01C;
|
||||
}
|
||||
if ((ret = rwnx_send_dbg_mem_read_req(usb_dev, rd_version_addr, &rd_patch_addr_cfm))) {
|
||||
AICWFDBG(LOGERROR, "version val[0x%x] rd fail: %d\n", rd_version_addr, ret);
|
||||
return ret;
|
||||
}
|
||||
rd_version_val = rd_patch_addr_cfm.memdata;
|
||||
AICWFDBG(LOGINFO, "rd_version_val=%08X\n", rd_version_val);
|
||||
usb_dev->fw_version_uint = rd_version_val;
|
||||
if (rd_version_val > 0x06090100) {
|
||||
patch_buff_addr = rd_patch_addr + 12;
|
||||
ret = rwnx_send_dbg_mem_read_req(usb_dev, patch_buff_addr, &rd_patch_addr_cfm);
|
||||
if (ret) {
|
||||
AICWFDBG(LOGERROR, "patch buf rd fail\n");
|
||||
return ret;
|
||||
}
|
||||
AICWFDBG(LOGINFO, "%x=%x\n", rd_patch_addr_cfm.memaddr, rd_patch_addr_cfm.memdata);
|
||||
patch_buff_base = rd_patch_addr_cfm.memdata;
|
||||
patch_addr = start_addr = patch_buff_base;
|
||||
}
|
||||
#endif
|
||||
|
||||
if ((ret = rwnx_send_dbg_mem_write_req(usb_dev, AIC_PATCH_ADDR(magic_num), AIC_PATCH_MAGIG_NUM))) {
|
||||
AICWFDBG(LOGERROR, "maigic_num[0x%x] write fail: %d\n", AIC_PATCH_ADDR(magic_num), ret);
|
||||
return ret;
|
||||
@@ -246,11 +346,10 @@ int system_config_8800d80(struct aic_usb_dev *usb_dev){
|
||||
}
|
||||
chip_id = (u8)(rd_mem_addr_cfm.memdata >> 16);
|
||||
printk("chip_id=%x, chip_mcu_id = %d\n", chip_id, chip_mcu_id);
|
||||
printk("AIC8800D80 legacy: using Radxa SDK V3 loader profile\n");
|
||||
if (chip_mcu_id == 1) {
|
||||
if (chip_mcu_id) {
|
||||
ret = rwnx_send_dbg_mem_read_req(usb_dev, cache_mem_addr, &rd_mem_addr_cfm);
|
||||
if (ret) {
|
||||
printk("%x rd fail: %d\n", cache_mem_addr, ret);
|
||||
printk("%x rd fail: %d\n", mem_addr, ret);
|
||||
return ret;
|
||||
}
|
||||
rd_mem_addr_cfm.memdata |= 0x01;
|
||||
@@ -259,7 +358,6 @@ int system_config_8800d80(struct aic_usb_dev *usb_dev){
|
||||
printk("%x write fail: %d\n", cache_mem_addr, ret);
|
||||
return ret;
|
||||
}
|
||||
printk("AIC8800D80 MCU1: enabled Bluetooth cache fix\n");
|
||||
}
|
||||
#if 1
|
||||
syscfg_num = sizeof(syscfg_tbl_8800d80) / sizeof(u32) / 2;
|
||||
|
||||
@@ -0,0 +1,117 @@
|
||||
# AIC POWERLIMIT 2025/0623/1700
|
||||
# Max tx power reference: Linux wireless regulatory database for CRDA
|
||||
# https://git.kernel.org/pub/scm/linux/kernel/git/sforshee/wireless-regdb.git/tree/db.txt
|
||||
# If loss_value in aic_userconfig.txt is enabled, the power value in this document will be subtracted from loss_value in actual judgment
|
||||
|
||||
# Table 1:
|
||||
## 2.4G, 20M,#6#
|
||||
## START
|
||||
## SRRC FCC ETSI JP KCC UNSET
|
||||
CH01 16 14 14 16 16 15
|
||||
CH02 16 14 14 16 16 16
|
||||
CH03 16 14 14 16 16 16
|
||||
CH04 16 14 14 16 16 16
|
||||
CH05 16 14 14 16 16 16
|
||||
CH06 16 14 14 16 16 16
|
||||
CH07 16 14 14 16 16 16
|
||||
CH08 16 14 14 16 16 16
|
||||
CH09 16 14 14 16 16 16
|
||||
CH10 16 14 14 16 16 16
|
||||
CH11 16 14 14 16 16 16
|
||||
CH12 15 14 14 16 16 12
|
||||
CH13 13 14 14 16 16 12
|
||||
CH14 NA NA NA 16 NA 12
|
||||
## END
|
||||
|
||||
# Table 2:
|
||||
## 2.4G, 40M,#6#
|
||||
## START
|
||||
## SRRC FCC ETSI JP KCC UNSET
|
||||
CH01 NA NA NA NA NA NA
|
||||
CH02 NA NA NA NA NA NA
|
||||
CH03 16 13 14 16 16 16
|
||||
CH04 16 13 14 16 16 16
|
||||
CH05 16 13 14 16 16 16
|
||||
CH06 16 13 14 16 16 16
|
||||
CH07 16 13 14 16 16 16
|
||||
CH08 16 13 14 16 16 16
|
||||
CH09 16 11 14 16 16 16
|
||||
CH10 16 11 14 16 16 16
|
||||
CH11 16 11 14 16 16 16
|
||||
CH12 NA NA NA NA NA NA
|
||||
CH13 NA NA NA NA NA NA
|
||||
CH14 NA NA NA NA NA NA
|
||||
## END
|
||||
|
||||
# Table 3:
|
||||
## 5G, 20M,#6#
|
||||
## START
|
||||
## SRRC FCC ETSI JP KCC UNSET
|
||||
# 5G Band 1
|
||||
CH36 15 16 16 16 16 15
|
||||
CH40 15 16 16 16 16 15
|
||||
CH44 15 16 16 16 16 15
|
||||
CH48 15 16 16 16 16 15
|
||||
# 5G Band 2
|
||||
CH52 15 16 16 16 16 15
|
||||
CH56 15 16 16 16 16 15
|
||||
CH60 15 16 16 16 16 15
|
||||
CH64 15 16 16 16 16 15
|
||||
# 5G Band 3
|
||||
CH100 NA 16 16 16 16 15
|
||||
CH104 NA 16 16 16 16 15
|
||||
CH108 NA 16 16 16 16 15
|
||||
CH112 NA 16 16 16 16 15
|
||||
CH116 NA 16 16 16 16 15
|
||||
CH120 NA 16 16 16 16 15
|
||||
CH124 NA 16 16 16 16 15
|
||||
CH128 NA 16 16 16 16 15
|
||||
CH132 NA 16 16 16 16 15
|
||||
CH136 NA 16 16 16 16 15
|
||||
CH140 NA 16 16 16 16 15
|
||||
CH144 NA NA 16 16 16 15
|
||||
# 5G Band 4
|
||||
CH149 20 16 8 NA 20 11
|
||||
CH153 20 16 8 NA 20 11
|
||||
CH157 20 16 8 NA 20 11
|
||||
CH161 20 16 8 NA 20 11
|
||||
CH165 20 16 8 NA 20 11
|
||||
## END
|
||||
|
||||
# Table 4:
|
||||
## 5G, 40M,#6#
|
||||
## START
|
||||
## SRRC FCC ETSI JP KCC UNSET
|
||||
# 5G Band 1
|
||||
CH38 15 16 16 16 20 15
|
||||
CH46 15 16 16 16 20 15
|
||||
# 5G Band 2
|
||||
CH54 15 16 16 16 20 15
|
||||
CH62 15 16 16 16 20 15
|
||||
# 5G Band 3
|
||||
CH102 NA 16 16 16 20 15
|
||||
CH110 NA 16 16 16 20 15
|
||||
CH118 NA 16 16 16 20 15
|
||||
CH126 NA 16 16 16 20 15
|
||||
CH134 NA 16 16 16 20 15
|
||||
CH142 NA 16 NA 16 20 15
|
||||
# 5G Band 4
|
||||
CH151 16 15 8 NA 18 11
|
||||
CH159 17 16 8 NA 17 11
|
||||
## END
|
||||
|
||||
# Table 5:
|
||||
## 5G, 80M,#6#
|
||||
## START
|
||||
## SRRC FCC ETSI JP KCC UNSET
|
||||
# 5G Band 1
|
||||
CH42 15 16 16 16 20 15
|
||||
# 5G Band 2
|
||||
CH58 15 16 16 16 20 15
|
||||
# 5G Band 3
|
||||
CH106 NA 16 16 16 20 15
|
||||
CH122 NA 16 16 16 20 15
|
||||
CH138 NA 16 NA NA 20 15
|
||||
# 5G Band 4
|
||||
CH155 15 14 8 NA 16 11
|
||||
## END
|
||||
@@ -67,9 +67,23 @@ lvl_11ax_mcs9_5g=13
|
||||
lvl_11ax_mcs10_5g=12
|
||||
lvl_11ax_mcs11_5g=12
|
||||
|
||||
# txpwr_lvl_adj
|
||||
lvl_adj_enable=0
|
||||
lvl_adj_2g4_chan_1_4=0
|
||||
lvl_adj_2g4_chan_5_9=0
|
||||
lvl_adj_2g4_chan_10_13=0
|
||||
lvl_adj_5g_chan_42=0
|
||||
lvl_adj_5g_chan_58=0
|
||||
lvl_adj_5g_chan_106=0
|
||||
lvl_adj_5g_chan_122=0
|
||||
lvl_adj_5g_chan_138=0
|
||||
lvl_adj_5g_chan_155=0
|
||||
|
||||
# txpwr_loss
|
||||
loss_enable=0
|
||||
loss_value=2
|
||||
loss_enable_2g4=0
|
||||
loss_value_2g4=2
|
||||
loss_enable_5g=0
|
||||
loss_value_5g=5
|
||||
|
||||
# txpwr_ofst
|
||||
ofst_enable=0
|
||||
|
||||
@@ -0,0 +1,124 @@
|
||||
# AIC USERCONFIG 2022/0803/1707
|
||||
|
||||
# txpwr_lvl
|
||||
enable=1
|
||||
lvl_11b_11ag_1m_2g4=20
|
||||
lvl_11b_11ag_2m_2g4=20
|
||||
lvl_11b_11ag_5m5_2g4=20
|
||||
lvl_11b_11ag_11m_2g4=20
|
||||
lvl_11b_11ag_6m_2g4=20
|
||||
lvl_11b_11ag_9m_2g4=20
|
||||
lvl_11b_11ag_12m_2g4=20
|
||||
lvl_11b_11ag_18m_2g4=20
|
||||
lvl_11b_11ag_24m_2g4=20
|
||||
lvl_11b_11ag_36m_2g4=19
|
||||
lvl_11b_11ag_48m_2g4=18
|
||||
lvl_11b_11ag_54m_2g4=17
|
||||
lvl_11n_11ac_mcs0_2g4=20
|
||||
lvl_11n_11ac_mcs1_2g4=20
|
||||
lvl_11n_11ac_mcs2_2g4=20
|
||||
lvl_11n_11ac_mcs3_2g4=20
|
||||
lvl_11n_11ac_mcs4_2g4=20
|
||||
lvl_11n_11ac_mcs5_2g4=19
|
||||
lvl_11n_11ac_mcs6_2g4=18
|
||||
lvl_11n_11ac_mcs7_2g4=17
|
||||
lvl_11n_11ac_mcs8_2g4=17
|
||||
lvl_11n_11ac_mcs9_2g4=16
|
||||
lvl_11ax_mcs0_2g4=20
|
||||
lvl_11ax_mcs1_2g4=20
|
||||
lvl_11ax_mcs2_2g4=20
|
||||
lvl_11ax_mcs3_2g4=20
|
||||
lvl_11ax_mcs4_2g4=20
|
||||
lvl_11ax_mcs5_2g4=19
|
||||
lvl_11ax_mcs6_2g4=18
|
||||
lvl_11ax_mcs7_2g4=17
|
||||
lvl_11ax_mcs8_2g4=17
|
||||
lvl_11ax_mcs9_2g4=16
|
||||
lvl_11ax_mcs10_2g4=15
|
||||
lvl_11ax_mcs11_2g4=15
|
||||
lvl_11a_6m_5g=19
|
||||
lvl_11a_9m_5g=19
|
||||
lvl_11a_12m_5g=19
|
||||
lvl_11a_18m_5g=18
|
||||
lvl_11a_24m_5g=18
|
||||
lvl_11a_36m_5g=18
|
||||
lvl_11a_48m_5g=18
|
||||
lvl_11a_54m_5g=18
|
||||
lvl_11n_11ac_mcs0_5g=19
|
||||
lvl_11n_11ac_mcs1_5g=19
|
||||
lvl_11n_11ac_mcs2_5g=19
|
||||
lvl_11n_11ac_mcs3_5g=18
|
||||
lvl_11n_11ac_mcs4_5g=18
|
||||
lvl_11n_11ac_mcs5_5g=18
|
||||
lvl_11n_11ac_mcs6_5g=18
|
||||
lvl_11n_11ac_mcs7_5g=17
|
||||
lvl_11n_11ac_mcs8_5g=15
|
||||
lvl_11n_11ac_mcs9_5g=15
|
||||
lvl_11ax_mcs0_5g=19
|
||||
lvl_11ax_mcs1_5g=19
|
||||
lvl_11ax_mcs2_5g=19
|
||||
lvl_11ax_mcs3_5g=18
|
||||
lvl_11ax_mcs4_5g=18
|
||||
lvl_11ax_mcs5_5g=18
|
||||
lvl_11ax_mcs6_5g=18
|
||||
lvl_11ax_mcs7_5g=17
|
||||
lvl_11ax_mcs8_5g=15
|
||||
lvl_11ax_mcs9_5g=15
|
||||
lvl_11ax_mcs10_5g=13
|
||||
lvl_11ax_mcs11_5g=13
|
||||
|
||||
# txpwr_lvl_adj
|
||||
lvl_adj_enable=0
|
||||
lvl_adj_2g4_chan_1_4=0
|
||||
lvl_adj_2g4_chan_5_9=0
|
||||
lvl_adj_2g4_chan_10_13=0
|
||||
lvl_adj_5g_chan_42=0
|
||||
lvl_adj_5g_chan_58=0
|
||||
lvl_adj_5g_chan_106=0
|
||||
lvl_adj_5g_chan_122=0
|
||||
lvl_adj_5g_chan_138=0
|
||||
lvl_adj_5g_chan_155=0
|
||||
|
||||
# txpwr_loss
|
||||
loss_enable_2g4=0
|
||||
loss_value_2g4=2
|
||||
loss_enable_5g=0
|
||||
loss_value_5g=5
|
||||
|
||||
# txpwr_ofst
|
||||
ofst_enable=0
|
||||
ofst_2g4_11b_chan_1_4=0
|
||||
ofst_2g4_11b_chan_5_9=0
|
||||
ofst_2g4_11b_chan_10_13=0
|
||||
ofst_2g4_ofdm_highrate_chan_1_4=0
|
||||
ofst_2g4_ofdm_highrate_chan_5_9=0
|
||||
ofst_2g4_ofdm_highrate_chan_10_13=0
|
||||
ofst_2g4_ofdm_lowrate_chan_1_4=0
|
||||
ofst_2g4_ofdm_lowrate_chan_5_9=0
|
||||
ofst_2g4_ofdm_lowrate_chan_10_13=0
|
||||
ofst_5g_ofdm_lowrate_chan_42=0
|
||||
ofst_5g_ofdm_lowrate_chan_58=0
|
||||
ofst_5g_ofdm_lowrate_chan_106=0
|
||||
ofst_5g_ofdm_lowrate_chan_122=0
|
||||
ofst_5g_ofdm_lowrate_chan_138=0
|
||||
ofst_5g_ofdm_lowrate_chan_155=0
|
||||
ofst_5g_ofdm_highrate_chan_42=0
|
||||
ofst_5g_ofdm_highrate_chan_58=0
|
||||
ofst_5g_ofdm_highrate_chan_106=0
|
||||
ofst_5g_ofdm_highrate_chan_122=0
|
||||
ofst_5g_ofdm_highrate_chan_138=0
|
||||
ofst_5g_ofdm_highrate_chan_155=0
|
||||
ofst_5g_ofdm_midrate_chan_42=0
|
||||
ofst_5g_ofdm_midrate_chan_58=0
|
||||
ofst_5g_ofdm_midrate_chan_106=0
|
||||
ofst_5g_ofdm_midrate_chan_122=0
|
||||
ofst_5g_ofdm_midrate_chan_138=0
|
||||
ofst_5g_ofdm_midrate_chan_155=0
|
||||
|
||||
# xtal cap
|
||||
xtal_enable=0
|
||||
xtal_cap=24
|
||||
xtal_cap_fine=31
|
||||
|
||||
|
||||
|
||||
@@ -0,0 +1,124 @@
|
||||
# AIC USERCONFIG 2022/0803/1707
|
||||
|
||||
# txpwr_lvl
|
||||
enable=1
|
||||
lvl_11b_11ag_1m_2g4=18
|
||||
lvl_11b_11ag_2m_2g4=18
|
||||
lvl_11b_11ag_5m5_2g4=18
|
||||
lvl_11b_11ag_11m_2g4=18
|
||||
lvl_11b_11ag_6m_2g4=18
|
||||
lvl_11b_11ag_9m_2g4=18
|
||||
lvl_11b_11ag_12m_2g4=18
|
||||
lvl_11b_11ag_18m_2g4=18
|
||||
lvl_11b_11ag_24m_2g4=18
|
||||
lvl_11b_11ag_36m_2g4=18
|
||||
lvl_11b_11ag_48m_2g4=18
|
||||
lvl_11b_11ag_54m_2g4=17
|
||||
lvl_11n_11ac_mcs0_2g4=20
|
||||
lvl_11n_11ac_mcs1_2g4=20
|
||||
lvl_11n_11ac_mcs2_2g4=20
|
||||
lvl_11n_11ac_mcs3_2g4=20
|
||||
lvl_11n_11ac_mcs4_2g4=20
|
||||
lvl_11n_11ac_mcs5_2g4=19
|
||||
lvl_11n_11ac_mcs6_2g4=18
|
||||
lvl_11n_11ac_mcs7_2g4=18
|
||||
lvl_11n_11ac_mcs8_2g4=17
|
||||
lvl_11n_11ac_mcs9_2g4=16
|
||||
lvl_11ax_mcs0_2g4=20
|
||||
lvl_11ax_mcs1_2g4=20
|
||||
lvl_11ax_mcs2_2g4=20
|
||||
lvl_11ax_mcs3_2g4=20
|
||||
lvl_11ax_mcs4_2g4=20
|
||||
lvl_11ax_mcs5_2g4=19
|
||||
lvl_11ax_mcs6_2g4=18
|
||||
lvl_11ax_mcs7_2g4=18
|
||||
lvl_11ax_mcs8_2g4=17
|
||||
lvl_11ax_mcs9_2g4=17
|
||||
lvl_11ax_mcs10_2g4=16
|
||||
lvl_11ax_mcs11_2g4=16
|
||||
lvl_11a_6m_5g=18
|
||||
lvl_11a_9m_5g=18
|
||||
lvl_11a_12m_5g=18
|
||||
lvl_11a_18m_5g=18
|
||||
lvl_11a_24m_5g=18
|
||||
lvl_11a_36m_5g=18
|
||||
lvl_11a_48m_5g=18
|
||||
lvl_11a_54m_5g=18
|
||||
lvl_11n_11ac_mcs0_5g=20
|
||||
lvl_11n_11ac_mcs1_5g=19
|
||||
lvl_11n_11ac_mcs2_5g=19
|
||||
lvl_11n_11ac_mcs3_5g=18
|
||||
lvl_11n_11ac_mcs4_5g=18
|
||||
lvl_11n_11ac_mcs5_5g=18
|
||||
lvl_11n_11ac_mcs6_5g=18
|
||||
lvl_11n_11ac_mcs7_5g=17
|
||||
lvl_11n_11ac_mcs8_5g=16
|
||||
lvl_11n_11ac_mcs9_5g=16
|
||||
lvl_11ax_mcs0_5g=20
|
||||
lvl_11ax_mcs1_5g=19
|
||||
lvl_11ax_mcs2_5g=19
|
||||
lvl_11ax_mcs3_5g=18
|
||||
lvl_11ax_mcs4_5g=18
|
||||
lvl_11ax_mcs5_5g=18
|
||||
lvl_11ax_mcs6_5g=18
|
||||
lvl_11ax_mcs7_5g=17
|
||||
lvl_11ax_mcs8_5g=16
|
||||
lvl_11ax_mcs9_5g=16
|
||||
lvl_11ax_mcs10_5g=15
|
||||
lvl_11ax_mcs11_5g=15
|
||||
|
||||
# txpwr_lvl_adj
|
||||
lvl_adj_enable=0
|
||||
lvl_adj_2g4_chan_1_4=0
|
||||
lvl_adj_2g4_chan_5_9=0
|
||||
lvl_adj_2g4_chan_10_13=0
|
||||
lvl_adj_5g_chan_42=0
|
||||
lvl_adj_5g_chan_58=0
|
||||
lvl_adj_5g_chan_106=0
|
||||
lvl_adj_5g_chan_122=0
|
||||
lvl_adj_5g_chan_138=0
|
||||
lvl_adj_5g_chan_155=0
|
||||
|
||||
# txpwr_loss
|
||||
loss_enable_2g4=0
|
||||
loss_value_2g4=2
|
||||
loss_enable_5g=0
|
||||
loss_value_5g=5
|
||||
|
||||
# txpwr_ofst
|
||||
ofst_enable=0
|
||||
ofst_2g4_11b_chan_1_4=0
|
||||
ofst_2g4_11b_chan_5_9=0
|
||||
ofst_2g4_11b_chan_10_13=0
|
||||
ofst_2g4_ofdm_highrate_chan_1_4=0
|
||||
ofst_2g4_ofdm_highrate_chan_5_9=0
|
||||
ofst_2g4_ofdm_highrate_chan_10_13=0
|
||||
ofst_2g4_ofdm_lowrate_chan_1_4=0
|
||||
ofst_2g4_ofdm_lowrate_chan_5_9=0
|
||||
ofst_2g4_ofdm_lowrate_chan_10_13=0
|
||||
ofst_5g_ofdm_lowrate_chan_42=0
|
||||
ofst_5g_ofdm_lowrate_chan_58=0
|
||||
ofst_5g_ofdm_lowrate_chan_106=0
|
||||
ofst_5g_ofdm_lowrate_chan_122=0
|
||||
ofst_5g_ofdm_lowrate_chan_138=0
|
||||
ofst_5g_ofdm_lowrate_chan_155=0
|
||||
ofst_5g_ofdm_highrate_chan_42=0
|
||||
ofst_5g_ofdm_highrate_chan_58=0
|
||||
ofst_5g_ofdm_highrate_chan_106=0
|
||||
ofst_5g_ofdm_highrate_chan_122=0
|
||||
ofst_5g_ofdm_highrate_chan_138=0
|
||||
ofst_5g_ofdm_highrate_chan_155=0
|
||||
ofst_5g_ofdm_midrate_chan_42=0
|
||||
ofst_5g_ofdm_midrate_chan_58=0
|
||||
ofst_5g_ofdm_midrate_chan_106=0
|
||||
ofst_5g_ofdm_midrate_chan_122=0
|
||||
ofst_5g_ofdm_midrate_chan_138=0
|
||||
ofst_5g_ofdm_midrate_chan_155=0
|
||||
|
||||
# xtal cap
|
||||
xtal_enable=0
|
||||
xtal_cap=24
|
||||
xtal_cap_fine=31
|
||||
|
||||
|
||||
|
||||
@@ -0,0 +1,124 @@
|
||||
# AIC USERCONFIG 2022/0803/1707
|
||||
|
||||
# txpwr_lvl
|
||||
enable=1
|
||||
lvl_11b_11ag_1m_2g4=20
|
||||
lvl_11b_11ag_2m_2g4=20
|
||||
lvl_11b_11ag_5m5_2g4=20
|
||||
lvl_11b_11ag_11m_2g4=20
|
||||
lvl_11b_11ag_6m_2g4=20
|
||||
lvl_11b_11ag_9m_2g4=20
|
||||
lvl_11b_11ag_12m_2g4=20
|
||||
lvl_11b_11ag_18m_2g4=20
|
||||
lvl_11b_11ag_24m_2g4=20
|
||||
lvl_11b_11ag_36m_2g4=19
|
||||
lvl_11b_11ag_48m_2g4=18
|
||||
lvl_11b_11ag_54m_2g4=17
|
||||
lvl_11n_11ac_mcs0_2g4=20
|
||||
lvl_11n_11ac_mcs1_2g4=20
|
||||
lvl_11n_11ac_mcs2_2g4=20
|
||||
lvl_11n_11ac_mcs3_2g4=20
|
||||
lvl_11n_11ac_mcs4_2g4=20
|
||||
lvl_11n_11ac_mcs5_2g4=19
|
||||
lvl_11n_11ac_mcs6_2g4=18
|
||||
lvl_11n_11ac_mcs7_2g4=17
|
||||
lvl_11n_11ac_mcs8_2g4=17
|
||||
lvl_11n_11ac_mcs9_2g4=16
|
||||
lvl_11ax_mcs0_2g4=20
|
||||
lvl_11ax_mcs1_2g4=20
|
||||
lvl_11ax_mcs2_2g4=20
|
||||
lvl_11ax_mcs3_2g4=20
|
||||
lvl_11ax_mcs4_2g4=20
|
||||
lvl_11ax_mcs5_2g4=19
|
||||
lvl_11ax_mcs6_2g4=18
|
||||
lvl_11ax_mcs7_2g4=17
|
||||
lvl_11ax_mcs8_2g4=17
|
||||
lvl_11ax_mcs9_2g4=16
|
||||
lvl_11ax_mcs10_2g4=15
|
||||
lvl_11ax_mcs11_2g4=15
|
||||
lvl_11a_6m_5g=19
|
||||
lvl_11a_9m_5g=19
|
||||
lvl_11a_12m_5g=19
|
||||
lvl_11a_18m_5g=18
|
||||
lvl_11a_24m_5g=18
|
||||
lvl_11a_36m_5g=18
|
||||
lvl_11a_48m_5g=18
|
||||
lvl_11a_54m_5g=18
|
||||
lvl_11n_11ac_mcs0_5g=19
|
||||
lvl_11n_11ac_mcs1_5g=19
|
||||
lvl_11n_11ac_mcs2_5g=19
|
||||
lvl_11n_11ac_mcs3_5g=18
|
||||
lvl_11n_11ac_mcs4_5g=18
|
||||
lvl_11n_11ac_mcs5_5g=18
|
||||
lvl_11n_11ac_mcs6_5g=18
|
||||
lvl_11n_11ac_mcs7_5g=17
|
||||
lvl_11n_11ac_mcs8_5g=15
|
||||
lvl_11n_11ac_mcs9_5g=15
|
||||
lvl_11ax_mcs0_5g=19
|
||||
lvl_11ax_mcs1_5g=19
|
||||
lvl_11ax_mcs2_5g=19
|
||||
lvl_11ax_mcs3_5g=18
|
||||
lvl_11ax_mcs4_5g=18
|
||||
lvl_11ax_mcs5_5g=18
|
||||
lvl_11ax_mcs6_5g=18
|
||||
lvl_11ax_mcs7_5g=17
|
||||
lvl_11ax_mcs8_5g=15
|
||||
lvl_11ax_mcs9_5g=15
|
||||
lvl_11ax_mcs10_5g=14
|
||||
lvl_11ax_mcs11_5g=14
|
||||
|
||||
# txpwr_lvl_adj
|
||||
lvl_adj_enable=0
|
||||
lvl_adj_2g4_chan_1_4=0
|
||||
lvl_adj_2g4_chan_5_9=0
|
||||
lvl_adj_2g4_chan_10_13=0
|
||||
lvl_adj_5g_chan_42=0
|
||||
lvl_adj_5g_chan_58=0
|
||||
lvl_adj_5g_chan_106=0
|
||||
lvl_adj_5g_chan_122=0
|
||||
lvl_adj_5g_chan_138=0
|
||||
lvl_adj_5g_chan_155=0
|
||||
|
||||
# txpwr_loss
|
||||
loss_enable_2g4=0
|
||||
loss_value_2g4=2
|
||||
loss_enable_5g=0
|
||||
loss_value_5g=5
|
||||
|
||||
# txpwr_ofst
|
||||
ofst_enable=0
|
||||
ofst_2g4_11b_chan_1_4=0
|
||||
ofst_2g4_11b_chan_5_9=0
|
||||
ofst_2g4_11b_chan_10_13=0
|
||||
ofst_2g4_ofdm_highrate_chan_1_4=0
|
||||
ofst_2g4_ofdm_highrate_chan_5_9=0
|
||||
ofst_2g4_ofdm_highrate_chan_10_13=0
|
||||
ofst_2g4_ofdm_lowrate_chan_1_4=0
|
||||
ofst_2g4_ofdm_lowrate_chan_5_9=0
|
||||
ofst_2g4_ofdm_lowrate_chan_10_13=0
|
||||
ofst_5g_ofdm_lowrate_chan_42=0
|
||||
ofst_5g_ofdm_lowrate_chan_58=0
|
||||
ofst_5g_ofdm_lowrate_chan_106=0
|
||||
ofst_5g_ofdm_lowrate_chan_122=0
|
||||
ofst_5g_ofdm_lowrate_chan_138=0
|
||||
ofst_5g_ofdm_lowrate_chan_155=0
|
||||
ofst_5g_ofdm_highrate_chan_42=0
|
||||
ofst_5g_ofdm_highrate_chan_58=0
|
||||
ofst_5g_ofdm_highrate_chan_106=0
|
||||
ofst_5g_ofdm_highrate_chan_122=0
|
||||
ofst_5g_ofdm_highrate_chan_138=0
|
||||
ofst_5g_ofdm_highrate_chan_155=0
|
||||
ofst_5g_ofdm_midrate_chan_42=0
|
||||
ofst_5g_ofdm_midrate_chan_58=0
|
||||
ofst_5g_ofdm_midrate_chan_106=0
|
||||
ofst_5g_ofdm_midrate_chan_122=0
|
||||
ofst_5g_ofdm_midrate_chan_138=0
|
||||
ofst_5g_ofdm_midrate_chan_155=0
|
||||
|
||||
# xtal cap
|
||||
xtal_enable=0
|
||||
xtal_cap=24
|
||||
xtal_cap_fine=31
|
||||
|
||||
|
||||
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -1,117 +1,117 @@
|
||||
# AIC POWERLIMIT 2024/1108/1900
|
||||
# AIC POWERLIMIT 2025/0623/1700
|
||||
# Max tx power reference: Linux wireless regulatory database for CRDA
|
||||
# https://git.kernel.org/pub/scm/linux/kernel/git/sforshee/wireless-regdb.git/tree/db.txt
|
||||
# If loss_value in aic_userconfig_8800d80.txt is enabled, the power value in this document will be subtracted from loss_value in actual judgment
|
||||
# If loss_value in aic_userconfig.txt is enabled, the power value in this document will be subtracted from loss_value in actual judgment
|
||||
|
||||
# Table 1:
|
||||
## 2.4G, 20M,#5#
|
||||
## 2.4G, 20M,#6#
|
||||
## START
|
||||
## SRRC FCC ETSI JP UNSET
|
||||
CH01 15 15 15 15 15
|
||||
CH02 16 16 16 16 16
|
||||
CH03 16 16 16 16 16
|
||||
CH04 16 16 16 16 16
|
||||
CH05 16 16 16 16 16
|
||||
CH06 16 16 16 16 16
|
||||
CH07 16 16 16 16 16
|
||||
CH08 16 16 16 16 16
|
||||
CH09 16 16 16 16 16
|
||||
CH10 16 16 16 16 16
|
||||
CH11 16 16 16 16 16
|
||||
CH12 12 12 12 12 12
|
||||
CH13 12 12 12 12 12
|
||||
CH14 NA NA NA 12 12
|
||||
## SRRC FCC ETSI JP KCC UNSET
|
||||
CH01 16 14 14 16 16 15
|
||||
CH02 16 14 14 16 16 16
|
||||
CH03 16 14 14 16 16 16
|
||||
CH04 16 14 14 16 16 16
|
||||
CH05 16 14 14 16 16 16
|
||||
CH06 16 14 14 16 16 16
|
||||
CH07 16 14 14 16 16 16
|
||||
CH08 16 14 14 16 16 16
|
||||
CH09 16 14 14 16 16 16
|
||||
CH10 16 14 14 16 16 16
|
||||
CH11 16 14 14 16 16 16
|
||||
CH12 15 14 14 16 16 12
|
||||
CH13 13 14 14 16 16 12
|
||||
CH14 NA NA NA 16 NA 12
|
||||
## END
|
||||
|
||||
# Table 2:
|
||||
## 2.4G, 40M,#5#
|
||||
## 2.4G, 40M,#6#
|
||||
## START
|
||||
## SRRC FCC ETSI JP UNSET
|
||||
CH01 NA NA NA NA NA
|
||||
CH02 NA NA NA NA NA
|
||||
CH03 16 16 16 16 16
|
||||
CH04 16 16 16 16 16
|
||||
CH05 16 16 16 16 16
|
||||
CH06 16 16 16 16 16
|
||||
CH07 16 16 16 16 16
|
||||
CH08 16 16 16 16 16
|
||||
CH09 16 16 16 16 16
|
||||
CH10 16 16 16 16 16
|
||||
CH11 16 16 16 16 16
|
||||
CH12 NA NA NA NA NA
|
||||
CH13 NA NA NA NA NA
|
||||
CH14 NA NA NA NA NA
|
||||
## SRRC FCC ETSI JP KCC UNSET
|
||||
CH01 NA NA NA NA NA NA
|
||||
CH02 NA NA NA NA NA NA
|
||||
CH03 16 13 14 16 16 16
|
||||
CH04 16 13 14 16 16 16
|
||||
CH05 16 13 14 16 16 16
|
||||
CH06 16 13 14 16 16 16
|
||||
CH07 16 13 14 16 16 16
|
||||
CH08 16 13 14 16 16 16
|
||||
CH09 16 11 14 16 16 16
|
||||
CH10 16 11 14 16 16 16
|
||||
CH11 16 11 14 16 16 16
|
||||
CH12 NA NA NA NA NA NA
|
||||
CH13 NA NA NA NA NA NA
|
||||
CH14 NA NA NA NA NA NA
|
||||
## END
|
||||
|
||||
# Table 3:
|
||||
## 5G, 20M,#5#
|
||||
## 5G, 20M,#6#
|
||||
## START
|
||||
## SRRC FCC ETSI JP UNSET
|
||||
## SRRC FCC ETSI JP KCC UNSET
|
||||
# 5G Band 1
|
||||
CH36 15 16 16 16 15
|
||||
CH40 15 16 16 16 15
|
||||
CH44 15 16 16 16 15
|
||||
CH48 15 16 16 16 15
|
||||
CH36 15 16 16 16 16 15
|
||||
CH40 15 16 16 16 16 15
|
||||
CH44 15 16 16 16 16 15
|
||||
CH48 15 16 16 16 16 15
|
||||
# 5G Band 2
|
||||
CH52 15 16 16 16 15
|
||||
CH56 15 16 16 16 15
|
||||
CH60 15 16 16 16 15
|
||||
CH64 15 16 16 16 15
|
||||
CH52 15 16 16 16 16 15
|
||||
CH56 15 16 16 16 16 15
|
||||
CH60 15 16 16 16 16 15
|
||||
CH64 15 16 16 16 16 15
|
||||
# 5G Band 3
|
||||
CH100 NA 16 16 16 15
|
||||
CH104 NA 16 16 16 15
|
||||
CH108 NA 16 16 16 15
|
||||
CH112 NA 16 16 16 15
|
||||
CH116 NA 16 16 16 15
|
||||
CH120 NA 16 16 16 15
|
||||
CH124 NA 16 16 16 15
|
||||
CH128 NA 16 16 16 15
|
||||
CH132 NA 16 16 16 15
|
||||
CH136 NA 16 16 16 15
|
||||
CH140 NA 16 16 16 15
|
||||
CH144 NA NA 16 16 15
|
||||
CH100 NA 16 16 16 16 15
|
||||
CH104 NA 16 16 16 16 15
|
||||
CH108 NA 16 16 16 16 15
|
||||
CH112 NA 16 16 16 16 15
|
||||
CH116 NA 16 16 16 16 15
|
||||
CH120 NA 16 16 16 16 15
|
||||
CH124 NA 16 16 16 16 15
|
||||
CH128 NA 16 16 16 16 15
|
||||
CH132 NA 16 16 16 16 15
|
||||
CH136 NA 16 16 16 16 15
|
||||
CH140 NA 16 16 16 16 15
|
||||
CH144 NA NA 16 16 16 15
|
||||
# 5G Band 4
|
||||
CH149 16 16 11 NA 11
|
||||
CH153 16 16 11 NA 11
|
||||
CH157 16 16 11 NA 11
|
||||
CH161 16 16 11 NA 11
|
||||
CH165 16 16 11 NA 11
|
||||
CH149 20 16 8 NA 20 11
|
||||
CH153 20 16 8 NA 20 11
|
||||
CH157 20 16 8 NA 20 11
|
||||
CH161 20 16 8 NA 20 11
|
||||
CH165 20 16 8 NA 20 11
|
||||
## END
|
||||
|
||||
# Table 4:
|
||||
## 5G, 40M,#5#
|
||||
## 5G, 40M,#6#
|
||||
## START
|
||||
## SRRC FCC ETSI JP UNSET
|
||||
## SRRC FCC ETSI JP KCC UNSET
|
||||
# 5G Band 1
|
||||
CH38 15 16 16 16 15
|
||||
CH46 15 16 16 16 15
|
||||
CH38 15 16 16 16 20 15
|
||||
CH46 15 16 16 16 20 15
|
||||
# 5G Band 2
|
||||
CH54 15 16 16 16 15
|
||||
CH62 15 16 16 16 15
|
||||
CH54 15 16 16 16 20 15
|
||||
CH62 15 16 16 16 20 15
|
||||
# 5G Band 3
|
||||
CH102 NA 16 16 16 15
|
||||
CH110 NA 16 16 16 15
|
||||
CH118 NA 16 16 16 15
|
||||
CH126 NA 16 16 16 15
|
||||
CH134 NA 16 16 16 15
|
||||
CH142 NA 16 NA 16 15
|
||||
CH102 NA 16 16 16 20 15
|
||||
CH110 NA 16 16 16 20 15
|
||||
CH118 NA 16 16 16 20 15
|
||||
CH126 NA 16 16 16 20 15
|
||||
CH134 NA 16 16 16 20 15
|
||||
CH142 NA 16 NA 16 20 15
|
||||
# 5G Band 4
|
||||
CH151 16 16 11 NA 11
|
||||
CH159 16 16 11 NA 11
|
||||
CH151 16 15 8 NA 18 11
|
||||
CH159 17 16 8 NA 17 11
|
||||
## END
|
||||
|
||||
# Table 5:
|
||||
## 5G, 80M,#5#
|
||||
## 5G, 80M,#6#
|
||||
## START
|
||||
## SRRC FCC ETSI JP UNSET
|
||||
## SRRC FCC ETSI JP KCC UNSET
|
||||
# 5G Band 1
|
||||
CH42 15 16 16 16 15
|
||||
CH42 15 16 16 16 20 15
|
||||
# 5G Band 2
|
||||
CH58 15 16 16 16 15
|
||||
CH58 15 16 16 16 20 15
|
||||
# 5G Band 3
|
||||
CH106 NA 16 16 16 15
|
||||
CH122 NA 16 16 16 15
|
||||
CH138 NA 16 NA NA 15
|
||||
CH106 NA 16 16 16 20 15
|
||||
CH122 NA 16 16 16 20 15
|
||||
CH138 NA 16 NA NA 20 15
|
||||
# 5G Band 4
|
||||
CH155 16 16 11 NA 11
|
||||
CH155 15 14 8 NA 16 11
|
||||
## END
|
||||
@@ -1,117 +1,117 @@
|
||||
# AIC POWERLIMIT 2024/1108/1900
|
||||
# AIC POWERLIMIT 2025/0623/1700
|
||||
# Max tx power reference: Linux wireless regulatory database for CRDA
|
||||
# https://git.kernel.org/pub/scm/linux/kernel/git/sforshee/wireless-regdb.git/tree/db.txt
|
||||
# If loss_value in aic_userconfig_8800d80.txt is enabled, the power value in this document will be subtracted from loss_value in actual judgment
|
||||
# If loss_value in aic_userconfig.txt is enabled, the power value in this document will be subtracted from loss_value in actual judgment
|
||||
|
||||
# Table 1:
|
||||
## 2.4G, 20M,#5#
|
||||
## 2.4G, 20M,#6#
|
||||
## START
|
||||
## SRRC FCC ETSI JP UNSET
|
||||
CH01 15 15 15 15 15
|
||||
CH02 16 16 16 16 16
|
||||
CH03 16 16 16 16 16
|
||||
CH04 16 16 16 16 16
|
||||
CH05 16 16 16 16 16
|
||||
CH06 16 16 16 16 16
|
||||
CH07 16 16 16 16 16
|
||||
CH08 16 16 16 16 16
|
||||
CH09 16 16 16 16 16
|
||||
CH10 16 16 16 16 16
|
||||
CH11 16 16 16 16 16
|
||||
CH12 12 12 12 12 12
|
||||
CH13 12 12 12 12 12
|
||||
CH14 NA NA NA 12 12
|
||||
## SRRC FCC ETSI JP KCC UNSET
|
||||
CH01 16 14 14 16 16 15
|
||||
CH02 16 14 14 16 16 16
|
||||
CH03 16 14 14 16 16 16
|
||||
CH04 16 14 14 16 16 16
|
||||
CH05 16 14 14 16 16 16
|
||||
CH06 16 14 14 16 16 16
|
||||
CH07 16 14 14 16 16 16
|
||||
CH08 16 14 14 16 16 16
|
||||
CH09 16 14 14 16 16 16
|
||||
CH10 16 14 14 16 16 16
|
||||
CH11 16 14 14 16 16 16
|
||||
CH12 15 14 14 16 16 12
|
||||
CH13 13 14 14 16 16 12
|
||||
CH14 NA NA NA 16 NA 12
|
||||
## END
|
||||
|
||||
# Table 2:
|
||||
## 2.4G, 40M,#5#
|
||||
## 2.4G, 40M,#6#
|
||||
## START
|
||||
## SRRC FCC ETSI JP UNSET
|
||||
CH01 NA NA NA NA NA
|
||||
CH02 NA NA NA NA NA
|
||||
CH03 16 16 16 16 16
|
||||
CH04 16 16 16 16 16
|
||||
CH05 16 16 16 16 16
|
||||
CH06 16 16 16 16 16
|
||||
CH07 16 16 16 16 16
|
||||
CH08 16 16 16 16 16
|
||||
CH09 16 16 16 16 16
|
||||
CH10 16 16 16 16 16
|
||||
CH11 16 16 16 16 16
|
||||
CH12 NA NA NA NA NA
|
||||
CH13 NA NA NA NA NA
|
||||
CH14 NA NA NA NA NA
|
||||
## SRRC FCC ETSI JP KCC UNSET
|
||||
CH01 NA NA NA NA NA NA
|
||||
CH02 NA NA NA NA NA NA
|
||||
CH03 16 13 14 16 16 16
|
||||
CH04 16 13 14 16 16 16
|
||||
CH05 16 13 14 16 16 16
|
||||
CH06 16 13 14 16 16 16
|
||||
CH07 16 13 14 16 16 16
|
||||
CH08 16 13 14 16 16 16
|
||||
CH09 16 11 14 16 16 16
|
||||
CH10 16 11 14 16 16 16
|
||||
CH11 16 11 14 16 16 16
|
||||
CH12 NA NA NA NA NA NA
|
||||
CH13 NA NA NA NA NA NA
|
||||
CH14 NA NA NA NA NA NA
|
||||
## END
|
||||
|
||||
# Table 3:
|
||||
## 5G, 20M,#5#
|
||||
## 5G, 20M,#6#
|
||||
## START
|
||||
## SRRC FCC ETSI JP UNSET
|
||||
## SRRC FCC ETSI JP KCC UNSET
|
||||
# 5G Band 1
|
||||
CH36 15 16 16 16 15
|
||||
CH40 15 16 16 16 15
|
||||
CH44 15 16 16 16 15
|
||||
CH48 15 16 16 16 15
|
||||
CH36 15 16 16 16 16 15
|
||||
CH40 15 16 16 16 16 15
|
||||
CH44 15 16 16 16 16 15
|
||||
CH48 15 16 16 16 16 15
|
||||
# 5G Band 2
|
||||
CH52 15 16 16 16 15
|
||||
CH56 15 16 16 16 15
|
||||
CH60 15 16 16 16 15
|
||||
CH64 15 16 16 16 15
|
||||
CH52 15 16 16 16 16 15
|
||||
CH56 15 16 16 16 16 15
|
||||
CH60 15 16 16 16 16 15
|
||||
CH64 15 16 16 16 16 15
|
||||
# 5G Band 3
|
||||
CH100 NA 16 16 16 15
|
||||
CH104 NA 16 16 16 15
|
||||
CH108 NA 16 16 16 15
|
||||
CH112 NA 16 16 16 15
|
||||
CH116 NA 16 16 16 15
|
||||
CH120 NA 16 16 16 15
|
||||
CH124 NA 16 16 16 15
|
||||
CH128 NA 16 16 16 15
|
||||
CH132 NA 16 16 16 15
|
||||
CH136 NA 16 16 16 15
|
||||
CH140 NA 16 16 16 15
|
||||
CH144 NA NA 16 16 15
|
||||
CH100 NA 16 16 16 16 15
|
||||
CH104 NA 16 16 16 16 15
|
||||
CH108 NA 16 16 16 16 15
|
||||
CH112 NA 16 16 16 16 15
|
||||
CH116 NA 16 16 16 16 15
|
||||
CH120 NA 16 16 16 16 15
|
||||
CH124 NA 16 16 16 16 15
|
||||
CH128 NA 16 16 16 16 15
|
||||
CH132 NA 16 16 16 16 15
|
||||
CH136 NA 16 16 16 16 15
|
||||
CH140 NA 16 16 16 16 15
|
||||
CH144 NA NA 16 16 16 15
|
||||
# 5G Band 4
|
||||
CH149 16 16 11 NA 11
|
||||
CH153 16 16 11 NA 11
|
||||
CH157 16 16 11 NA 11
|
||||
CH161 16 16 11 NA 11
|
||||
CH165 16 16 11 NA 11
|
||||
CH149 20 16 8 NA 20 11
|
||||
CH153 20 16 8 NA 20 11
|
||||
CH157 20 16 8 NA 20 11
|
||||
CH161 20 16 8 NA 20 11
|
||||
CH165 20 16 8 NA 20 11
|
||||
## END
|
||||
|
||||
# Table 4:
|
||||
## 5G, 40M,#5#
|
||||
## 5G, 40M,#6#
|
||||
## START
|
||||
## SRRC FCC ETSI JP UNSET
|
||||
## SRRC FCC ETSI JP KCC UNSET
|
||||
# 5G Band 1
|
||||
CH38 15 16 16 16 15
|
||||
CH46 15 16 16 16 15
|
||||
CH38 15 16 16 16 20 15
|
||||
CH46 15 16 16 16 20 15
|
||||
# 5G Band 2
|
||||
CH54 15 16 16 16 15
|
||||
CH62 15 16 16 16 15
|
||||
CH54 15 16 16 16 20 15
|
||||
CH62 15 16 16 16 20 15
|
||||
# 5G Band 3
|
||||
CH102 NA 16 16 16 15
|
||||
CH110 NA 16 16 16 15
|
||||
CH118 NA 16 16 16 15
|
||||
CH126 NA 16 16 16 15
|
||||
CH134 NA 16 16 16 15
|
||||
CH142 NA 16 NA 16 15
|
||||
CH102 NA 16 16 16 20 15
|
||||
CH110 NA 16 16 16 20 15
|
||||
CH118 NA 16 16 16 20 15
|
||||
CH126 NA 16 16 16 20 15
|
||||
CH134 NA 16 16 16 20 15
|
||||
CH142 NA 16 NA 16 20 15
|
||||
# 5G Band 4
|
||||
CH151 16 16 11 NA 11
|
||||
CH159 16 16 11 NA 11
|
||||
CH151 16 15 8 NA 18 11
|
||||
CH159 17 16 8 NA 17 11
|
||||
## END
|
||||
|
||||
# Table 5:
|
||||
## 5G, 80M,#5#
|
||||
## 5G, 80M,#6#
|
||||
## START
|
||||
## SRRC FCC ETSI JP UNSET
|
||||
## SRRC FCC ETSI JP KCC UNSET
|
||||
# 5G Band 1
|
||||
CH42 15 16 16 16 15
|
||||
CH42 15 16 16 16 20 15
|
||||
# 5G Band 2
|
||||
CH58 15 16 16 16 15
|
||||
CH58 15 16 16 16 20 15
|
||||
# 5G Band 3
|
||||
CH106 NA 16 16 16 15
|
||||
CH122 NA 16 16 16 15
|
||||
CH138 NA 16 NA NA 15
|
||||
CH106 NA 16 16 16 20 15
|
||||
CH122 NA 16 16 16 20 15
|
||||
CH138 NA 16 NA NA 20 15
|
||||
# 5G Band 4
|
||||
CH155 16 16 11 NA 11
|
||||
CH155 15 14 8 NA 16 11
|
||||
## END
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -1,121 +0,0 @@
|
||||
# AIC8800D80 legacy MCU revision 1 support
|
||||
|
||||
The `legacy-mcu1` branch is the maintained compatibility profile for the older
|
||||
AIC8800D80 MCU revision tracked in
|
||||
[issue #58](https://github.com/shenmintao/aic8800d80/issues/58), with related
|
||||
reports in issues #14, #64, and #65. It is intended only for devices that log:
|
||||
|
||||
```text
|
||||
chip_id=7, chip_mcu_id=1
|
||||
```
|
||||
|
||||
Affected adapters have been observed entering through `a69c:572f` or a similar
|
||||
mass-storage ID, changing to `a69c:8d80` for firmware loading, and failing when
|
||||
the SDK V5 FMAC upload reaches address `0x170400`.
|
||||
|
||||
## Root cause
|
||||
|
||||
The affected MCU revision cannot accept the complete SDK V5 FMAC image in its
|
||||
available upload window. With an upload base of `0x120000`, the deterministic
|
||||
failure at `0x170400` gives a limit of about `0x50400` (328,704) bytes.
|
||||
|
||||
| Firmware | Size | End address (exclusive) | Relative to `0x170400` |
|
||||
| --- | ---: | ---: | ---: |
|
||||
| SDK V5 FMAC on `main` | 358,072 bytes | `0x1776B8` | 29,368 bytes over |
|
||||
| SDK V3 FMAC on this branch | 327,037 bytes | `0x16FD7D` | 1,667 bytes free |
|
||||
|
||||
Replacing only the FMAC image is not sufficient. Earlier mixed-firmware tests
|
||||
could enumerate but failed to provide a usable radio. This branch therefore
|
||||
uses the complete matching AIC8800D80 firmware set from Radxa SDK V3, fixed at
|
||||
upstream commit
|
||||
[`254d47e6a131dbed5ba32131972f4719f3e1c7fe`](https://github.com/radxa-pkg/aic8800/commit/254d47e6a131dbed5ba32131972f4719f3e1c7fe),
|
||||
together with its matching FMAC patch table and fixed patch-buffer layout.
|
||||
|
||||
For `chip_mcu_id=1`, the loader also reads register `0x40100020`, sets bit 0,
|
||||
and writes it back before firmware upload. This is the MCU1 Bluetooth cache fix
|
||||
identified in [PR #35](https://github.com/shenmintao/aic8800d80/pull/35).
|
||||
Bluetooth continues to use the kernel's standard `btusb` driver; this branch
|
||||
does not contain or install `aic_btusb`.
|
||||
|
||||
Firmware and loader paths for D80N, D80X2, and other variants are unchanged.
|
||||
The same branch now also carries the separately validated legacy DC/DW profile
|
||||
documented in the [issue #71 support notes](../issue71-mcu1-v3-profile/README.md).
|
||||
|
||||
## Hardware validation
|
||||
|
||||
The final profile was validated on a Steren COM-8231+ reporting
|
||||
`chip_id=7, chip_mcu_id=1`. Test commit
|
||||
[`027a7a8`](https://github.com/shenmintao/aic8800d80/commit/027a7a8)
|
||||
demonstrated all of the following:
|
||||
|
||||
- the 327,037-byte FMAC uploads completely without `cmd timed-out` or
|
||||
`bin upload fail: 170400`;
|
||||
- the adapter completes `a69c:572f -> a69c:8d80 -> a69c:8d81` enumeration;
|
||||
- 2.4 GHz and 5 GHz Wi-Fi scan, association, DHCP, and traffic work;
|
||||
- USB interfaces 0 and 1 bind to system `btusb`, while interface 2 binds to
|
||||
`aic8800_fdrv`;
|
||||
- the earlier HCI Reset timeout `Opcode 0x0c03 failed: -110` is gone;
|
||||
- Bluetooth scan and a real connection both succeed.
|
||||
|
||||
## Install
|
||||
|
||||
From an existing clone:
|
||||
|
||||
```bash
|
||||
git fetch origin
|
||||
git switch legacy-mcu1
|
||||
git pull --ff-only
|
||||
sudo ./install.sh
|
||||
sudo reboot
|
||||
```
|
||||
|
||||
The installer replaces the installed AIC firmware. Switching Git branches
|
||||
without rerunning `install.sh` does not change the active firmware.
|
||||
|
||||
The expected V3 FMAC can be confirmed with:
|
||||
|
||||
```bash
|
||||
stat -c '%s bytes' /lib/firmware/aic8800D80/fmacfw_8800d80_u02.bin
|
||||
sha256sum /lib/firmware/aic8800D80/fmacfw_8800d80_u02.bin
|
||||
```
|
||||
|
||||
Expected output:
|
||||
|
||||
```text
|
||||
327037 bytes
|
||||
1ec680c2b63dcaa0e5d33c5fb6d1857d030f8145c05c385e243760388a61a0da
|
||||
```
|
||||
|
||||
## Verify
|
||||
|
||||
After reboot or a physical disconnect/reconnect, check the complete device:
|
||||
|
||||
```bash
|
||||
sudo dmesg | grep -iE 'AIC8800D80|chip_id|chip_mcu_id|fmacfw|bin upload|cmd timed-out|Bluetooth|0x0c03|error -110'
|
||||
lsusb -t
|
||||
iw dev
|
||||
bluetoothctl list
|
||||
```
|
||||
|
||||
The initialization log should contain:
|
||||
|
||||
```text
|
||||
AIC8800D80 legacy: using Radxa SDK V3 loader profile
|
||||
AIC8800D80 MCU1: enabled Bluetooth cache fix
|
||||
```
|
||||
|
||||
`lsusb -t` should show Bluetooth interfaces using `btusb` and the Wi-Fi
|
||||
interface using `aic8800_fdrv`. Verify traffic through the AIC network interface
|
||||
rather than an onboard Wi-Fi adapter or phone/RNDIS connection.
|
||||
|
||||
## Return to current firmware
|
||||
|
||||
Newer `chip_mcu_id=0` hardware should use `main`. Reinstall after switching so
|
||||
that the V5 firmware is restored under `/lib/firmware`:
|
||||
|
||||
```bash
|
||||
git switch main
|
||||
git pull --ff-only
|
||||
sudo ./install.sh
|
||||
sudo reboot
|
||||
```
|
||||
@@ -1,77 +0,0 @@
|
||||
# AIC8800DC/DW legacy MCU revision 1 support
|
||||
|
||||
The `legacy-mcu1` branch is the maintained compatibility profile for older
|
||||
AIC8800DC/DW devices tracked in
|
||||
[issue #71](https://github.com/shenmintao/aic8800d80/issues/71). It follows the
|
||||
same method as the successful issue #58 D80 profile: use a complete, matched
|
||||
legacy firmware and loader rather than mixing firmware generations.
|
||||
|
||||
The branch keeps the current USB transport, cfg80211 integration, device IDs,
|
||||
DKMS installer, and modern-kernel compatibility. For AIC8800DC/DW it restores
|
||||
the complete firmware directory and matching loader from immediately before
|
||||
SDK V5 commit `d66e5cb`. That loader includes the MCU1 cache fix and flash DPD
|
||||
validation used by the reporter's previously working driver.
|
||||
|
||||
The first issue #71 test proved that the DPD result stored in flash was valid,
|
||||
but the V5 main application still timed out at `DBG_START_APP_REQ`. Test commit
|
||||
[`dbfbfa0`](https://github.com/shenmintao/aic8800d80/commit/dbfbfa0) restored the
|
||||
complete profile matching the reporter's known-good firmware hashes, after
|
||||
which the reporter confirmed that the TX1U Nano worked.
|
||||
|
||||
## Install
|
||||
|
||||
```bash
|
||||
git fetch origin
|
||||
git switch legacy-mcu1
|
||||
git pull --ff-only
|
||||
sudo ./install.sh
|
||||
sudo poweroff
|
||||
```
|
||||
|
||||
After shutdown, unplug the TX1U Nano or remove host power for at least 10
|
||||
seconds before reconnecting and booting.
|
||||
|
||||
## Verify
|
||||
|
||||
```bash
|
||||
git rev-parse --short HEAD
|
||||
md5sum /lib/firmware/aic8800DC/fmacfw_patch_8800dc_u02.bin
|
||||
md5sum /lib/firmware/aic8800DC/fmacfw_patch_tbl_8800dc_u02.bin
|
||||
lsusb
|
||||
lsusb -t
|
||||
iw dev
|
||||
sudo journalctl -k -b --no-pager | tee issue71-v3-profile.log
|
||||
sudo journalctl -k -b --no-pager | grep -iE 'issue71|chip_id|chip_mcu_id|chip_sub_id|DPD|calib|patch.*tbl|start app|firmware version|interface|wlan|timed-out|err_lmac'
|
||||
```
|
||||
|
||||
Expected firmware values and log markers include:
|
||||
|
||||
```text
|
||||
bfd8ea1d174242e7ec823813b6c5d849 fmacfw_patch_8800dc_u02.bin
|
||||
7b5fde609392c2e6c2c5874838dda718 fmacfw_patch_tbl_8800dc_u02.bin
|
||||
chip_id=7, chip_mcu_id=1, chip_sub_id=1
|
||||
issue71: using complete pre-SDK-V5/V3 DC/DW firmware and loader profile
|
||||
issue71: legacy V3 flash DPD result is valid
|
||||
misc ram valid, skip calib process
|
||||
FMACFW_PATCH_TBL_8800DC_U02_DESCRIBE_BASE = 187c00
|
||||
Start app: 00150000, 5
|
||||
Firmware Version: ...
|
||||
New interface create wlan0
|
||||
```
|
||||
|
||||
There should be no command timeout, `err_lmac_reqs`, or failed USB probe after
|
||||
the main application starts.
|
||||
|
||||
Confirm scanning, association, DHCP, gateway and Internet reachability, real
|
||||
traffic, and clean initialization after a USB unplug/replug cycle.
|
||||
|
||||
## Roll back
|
||||
|
||||
```bash
|
||||
git switch main
|
||||
git pull --ff-only
|
||||
sudo ./install.sh
|
||||
sudo poweroff
|
||||
```
|
||||
|
||||
Cold-power-cycle the adapter again before booting the rollback result.
|
||||
Reference in New Issue
Block a user