0%

OrangePi-3B 折腾笔记—— 驱动 WiFi & BT 模块

OrangePi-3B 系列笔记:

编译环境

  • 主板: OrangePi-3b
  • 芯片: RK3566
  • 环境: Debian(12-x86_64) + Docker(Debian:12)

内容说明

OrangePi-3b 搭载了一颗 紫光展锐WIFI & BT 一体的无线模组,型号是 UWE5622

目前主线 Kernel 当中没有对应的驱动,需要移植一下。

通讯接口简介

OrangePi-3bUWE5622 在板卡上通过 SDIO 接口物理连接。

SDIO 接口是用于 SDIO 卡与设备之间进行数据传输和通讯的标准化接口。它是基于 SD 卡接口的扩展,支持高速数据传输和各种外设的连接。

这种连接外部模块的接口,除了有 SDIO 接口,在嵌入式板卡还有一些其他类型的接口:

  • USB
    USB 接口是平时见得最多的一种接口了,用在 WIFI 模块上,它是一种通用串行总线,是连接 WIFI 模块内部 MCU 与外部设备(如摄像机、摄像头等等)的一种串口总线标准,用于规范 WIFI 模块 MCU 与外部设备的连接和通讯。
  • SDIO
    SDIO 接口是 SD 卡类型的扩展接口。搭载 SDIO 接口,WIFI 模块可以接 SD 卡,还可以接支持 SDIO 接口的设备,插口的用途不止是插 SD 存储卡。支持 SDIO 接口的 PDA,笔记本电脑等都可以连接象 GPS 接收器,WIFI 或蓝牙适配器,调制解调器,局域网适配器,条型码读取器,FM 无线电,电视接收器,射频身份认证读取器,或者数码相机等等采用 SD 标准接口的设备。
  • PCIE
    PCIe 接口是是一种用于连接计算机主板和其他硬件组件的高速数据传输接口,在 WIFI 模块中,PCIe 接口的作用是提供高速、可靠的数据通信通道,使 WIFI 模块能够与计算机或其他设备快速交换数据。PCIe 接口提供了高性能、低延迟的数据传输,为提供稳定快速的无线网络连接起到关键作用。它还能使WIFI模块直接从设备获取电源供应,减少了复杂的线缆。

还有一些低速总线也可以用于通讯:I2CSPII2S 等。通常单片机使用这种低速总线的场景多一些。

移植

克隆代码

cd ~/projects/
git clone https://github.com/torvalds/linux.git -b linux-rolling-stable kernel
git clone https://github.com/armbian/build.git -b main armbian-build
git clone https://github.com/armbian/firmware.git -b master armbian-firmware
  1. 已经存在内核代码的话就不用再次拉取了;
  2. 手动移植香橙派驱动源码失败了,这里就抄 Armbian 的作业;
  3. UWE5622 每次启动需要固件,同样也是用 Armbian 仓库中现成的二进制文件;

启动容器

docker run -ti --rm --privileged -v ~/projects/:/projects/ linux-build bash
  1. 关于镜像 linux-build 的内容请参考之前的笔记,其中已经安装构建所需要的软件包。

移植驱动

香橙派的 Kernel 当中已经存在相关的驱动源码,但是适配的内核版本是 5.10.x,不能直接在 6.x.x 的内核中使用。

尝试移植,搞了一段时间发现问题真是太多了。

后来偶然发现 Armbian24.5.0 完美适配了 UWE5622 模块,那就抄作业吧。

cd /projects/kernel/

# 生成打补丁脚本
cat > patch.sh <<\EOF
#!/usr/bin/env bash

SRC=../armbian-build
LINUXFAMILY=rockchip64
kerneldir=.
version=$1

source "${SRC}"/lib/functions/compilation/patch/drivers_network.sh
source "${SRC}"/lib/functions/compilation/patch/patching.sh
source "${SRC}"/lib/functions/compilation/utils-compilation.sh
source "${SRC}"/lib/functions/logging/display-alert.sh
source "${SRC}"/lib/functions/logging/traps.sh

driver_uwe5622
EOF

# 执行打补丁脚本
chmod +x patch.sh
./patch.sh 6.8.6
rm patch.sh
  1. 注意 6.8.6 是内核版本,根据实际情况调整;这一步操作需要 patchutils 软件包的支持;
  2. 操作保持 drivers/net/wirelessbluetooth 相关目录是原始状态;如果补丁失败,在此打补丁之前需要还原状态;

正常执行输出如下:

🌱 Adding [ Drivers for Unisoc uwe5622 found on some Allwinner and Rockchip boards ]
🌱 * applying patch/misc/wireless-uwe5622/uwe5622-allwinner-v6.3.patch
🌱 * applying patch/misc/wireless-uwe5622/uwe5622-allwinner-bugfix-v6.3.patch
🌱 * applying patch/misc/wireless-uwe5622/uwe5622-allwinner-v6.3-compilation-fix.patch
🌱 * applying patch/misc/wireless-uwe5622/uwe5622-v6.4-post.patch
🌱 * applying patch/misc/wireless-uwe5622/uwe5622-warnings.patch
🌱 * applying patch/misc/wireless-uwe5622/uwe5622-park-link-v6.1-post.patch
🌱 * applying patch/misc/wireless-uwe5622/uwe5622-v6.1.patch
🌱 * applying patch/misc/wireless-uwe5622/uwe5622-v6.6-fix-tty-sdio.patch
🌱 * applying patch/misc/wireless-uwe5622/uwe5622-adjust-for-rockchip-post-6.1.patch
🌱 * applying patch/misc/wireless-uwe5622/wireless-uwe5622-Fix-compilation-with-6.7-kernel.patch
🌱 * applying patch/misc/wireless-uwe5622/wireless-uwe5622-reduce-system-load.patch

编译脚本调整

使用上面 Armbian 的补丁后发现还是有一些问题,需要调整一下:

diff --git a/drivers/net/wireless/uwe5622/Makefile b/drivers/net/wireless/uwe5622/Makefile
index d2210439f3cc..22345829fbaa 100644
--- a/drivers/net/wireless/uwe5622/Makefile
+++ b/drivers/net/wireless/uwe5622/Makefile
@@ -2,9 +2,10 @@ obj-$(CONFIG_RK_WIFI_DEVICE_UWE5622) += unisocwcn/
 obj-$(CONFIG_WLAN_UWE5622)    += unisocwifi/
 obj-$(CONFIG_TTY_OVERY_SDIO)  += tty-sdio/

-UNISOCWCN_DIR := $(shell cd $(src)/unisocwcn/ && /bin/pwd)
+UNISOCWCN_DIR := $(PWD)/drivers/net/wireless/uwe5622/unisocwcn/
 UNISOC_BSP_INCLUDE := $(UNISOCWCN_DIR)/include
 export UNISOC_BSP_INCLUDE
+export UNISOCWCN_DIR

 UNISOC_FW_PATH_CONFIG := "/lib/firmware/uwe5622/"
 export UNISOC_FW_PATH_CONFIG
diff --git a/drivers/net/wireless/uwe5622/unisocwcn/Makefile b/drivers/net/wireless/uwe5622/unisocwcn/Makefile
index 939acb5c9274..dcb8d34de69c 100755
--- a/drivers/net/wireless/uwe5622/unisocwcn/Makefile
+++ b/drivers/net/wireless/uwe5622/unisocwcn/Makefile
@@ -129,9 +129,9 @@ ccflags-y += -DCONFIG_WCN_BOOT
 ccflags-y += -DCONFIG_WCN_UTILS

 #### include path ######
-ccflags-y += -I$(src)/include/
-ccflags-y += -I$(src)/platform/
-ccflags-y += -I$(src)/platform/rf/
+ccflags-y += -I$(UNISOCWCN_DIR)/include/
+ccflags-y += -I$(UNISOCWCN_DIR)/platform/
+ccflags-y += -I$(UNISOCWCN_DIR)/platform/rf/

 #### add cflag for Customer ######
 ### ---------- Hisilicon start ---------- ###
@@ -405,7 +405,7 @@ KDIR ?= $(ANDROID_PRODUCT_OUT)/obj/KERNEL_OBJ
 ARCH ?= arm
 CROSS_COMPILE ?= arm-histbv310-linux-

-EXTRA_CFLAGS += -I$(src)/include -D__linux__
+EXTRA_CFLAGS += -I$(UNISOCWCN_DIR)/include -D__linux__

 all: $(all_dependencies)

diff --git a/drivers/net/wireless/uwe5622/unisocwifi/main.c b/drivers/net/wireless/uwe5622/unisocwifi/main.c
index 708f472daa55..028e9d76cc5f 100755
--- a/drivers/net/wireless/uwe5622/unisocwifi/main.c
+++ b/drivers/net/wireless/uwe5622/unisocwifi/main.c
@@ -945,11 +945,13 @@ static int sprdwl_set_mac(struct net_device *dev, void *addr)
                        vif->has_rand_mac = true;
                        memcpy(vif->random_mac, sa->sa_data, ETH_ALEN);
                        memcpy(dev->dev_addr, sa->sa_data, ETH_ALEN);
+                       memcpy(dev->dev_addr_shadow, sa->sa_data, ETH_ALEN);
                } else {
                        vif->has_rand_mac = false;
                        netdev_info(dev, "need clear random mac for sta/softap mode\n");
                        memset(vif->random_mac, 0, ETH_ALEN);
                        memcpy(dev->dev_addr, vif->mac, ETH_ALEN);
+                       memcpy(dev->dev_addr_shadow, vif->mac, ETH_ALEN);
                }
        }
        /*return success to pass vts test*/

配置文件修改

经过驱动移植之后,还需要增加一些必要的编译配置:

diff --git a/arch/arm64/configs/orangepi-3b.config b/arch/arm64/configs/orangepi-3b.config
index ca17e3ecbb18..1884520e8845 100644
--- a/arch/arm64/configs/orangepi-3b.config
+++ b/arch/arm64/configs/orangepi-3b.config
@@ -135,3 +135,13 @@ CONFIG_DRM_PANEL_RASPBERRYPI_TOUCHSCREEN=y
 # PHY Subsystem
 #
 CONFIG_PHY_ROCKCHIP_INNO_DSIDPHY=y
+
+#
+# UNISOC WCN Device Drivers(for new chip...)
+#
+CONFIG_SPARD_WLAN_SUPPORT=y
+CONFIG_WCN_BSP_DRIVER_BUILDIN=y
+CONFIG_AW_WIFI_DEVICE_UWE5622=y
+CONFIG_RK_WIFI_DEVICE_UWE5622=y
+CONFIG_WLAN_UWE5622=m
+CONFIG_TTY_OVERY_SDIO=m
\ No newline at end of file

设备树

由于之前构建内核的时候直接使用的完全版的设备树,已经把 UWE5622 的节点配置好了,所有这里就没有什么需要调整的了。

编译

cd /projects/kernel/

# 应用配置
make CROSS_COMPILE=aarch64-linux-gnu- ARCH=arm64 O=out defconfig orangepi-3b.config

# 编译内核/设备树/驱动
make CROSS_COMPILE=aarch64-linux-gnu- ARCH=arm64 O=out Image.gz dtbs modules -j8

# 导出模块(自定义输出路径)
rm -rf out/lib/modules/
make CROSS_COMPILE=aarch64-linux-gnu- ARCH=arm64 O=out INSTALL_MOD_PATH=. INSTALL_MOD_STRIP=1 modules_install -j8

固件 & 软件包

使用 UWE5622 模块除了需要驱动支持,还需要有对应的固件和软件包。

需要将这些依赖移植到目标文件系统。

由于调整了笔记的顺序,文件系统镜像放到了最后,但是验证这个驱动需要文件系统的支持。所有这里暂且记录一下这个驱动需要文件系统操作的点,在最后一篇笔记中一并整合。

  1. 应用 Kernel 镜像
    可以通过网络加载最新的 Kernel 应用,也可以复制镜像到文件系统应用。
  2. 拷贝 modules 到文件系统
    拷贝 out/lib/modules/ 下的内容到设备 /lib/modules/,这里面包含移植的驱动模块。
  3. 注册驱动自动加载
    新增加 /etc/modules-load.d/uwe5622.conf 文件添加 sprdbt_ttysprdwl_ng 两行内容,使其开机能够自动加载。
  4. 安装相关软件包
    为了使系统支持 WIFI & BT 相关功能,需要安装一些软件包:network-managerrfkillwireless-toolsbluetoothbluez-tools
  5. 拷贝固件
    UWE5622 驱动需要对应的固件才能工作,需要移植到目标设备:
    1. 拷贝 /armbian-firmware/uwe5622/ 目录至 /lib/firmware/ 目录下。
    2. 拷贝 /armbian-firmware/bt_configure_*.ini 文件至 /lib/firmware/ 目录下。
    3. 创建和驱动中匹配的路径软连接:
      sudo ln -s uwe5622/wcnmodem.bin /lib/firmware/wcnmodem.bin
      sudo ln -s uwe5622/wifi_2355b001_1ant.ini /lib/firmware/wifi_2355b001_1ant.ini
      
  6. 拷贝定制的程序二进制
    UWE5622 的蓝牙功能需要使用定制的 hciattach 程序文件 hciattach_opi,需要移植到目标设备:
    1. 拷贝 armbian-build/packages/bsp/rk3399/hciattach_opi 文件至 /usr/bin/hciattach_opi 并赋予执行权限。
    2. 拷贝 armbian-build/packages/bsp/rk3399/sprd-bluetooth.service 文件至 /lib/systemd/system/sprd-bluetooth.service 并替换原始服务。可通过以下命令完成:
      sudo ln -s /lib/systemd/system/bluetooth.service rootfs/etc/systemd/system/multi-user.target.wants/sprd-bluetooth.service
      
  1. 实测 wcnmodem.binwifi_2355b001_1ant.ini 必须存在,否则驱动无法正常工作;
  2. 实测 hciattach_opi 必须使用定制的版本,否则蓝牙无法正常驱动,源码为香橙派开源
  3. 实测 bt_configure_*.ini 必须存在,否则蓝牙无法正常工作(hciattach_opi 中会使用);

调试

在已经存在可启动的文件系统的情况下,可使用 NFS 挂载远程目录, 拷贝内核及驱动快速验证:

# 挂载工作目录
sudo mkdir -p /mnt/porjects/
sudo mount -t nfs 192.168.8.13:/home/liux/projects/ /mnt/porjects/

# 拷贝编译产物
sudo cp -rf /mnt/porjects/kernel/out/arch/arm64/boot/Image.gz /boot/Image.gz
sudo rm -rf /lib/modules/*
sudo cp -rf /mnt/porjects/kernel/out/lib/modules/* /lib/modules/
# sudo reboot

# 装载驱动
sudo modprobe sprdwl_ng
sudo modprobe sprdbt_tty
# 卸载驱动
sudo rmmod sprdwl_ng
sudo rmmod sprdbt_tty
# 枚举驱动
sudo lsmod
# 查看系统日志
dmesg

# 硬件控制
sudo rfkill xxxx
# WIFI操作
sudo nmcli device wifi xxxx
sudo nmcli radio wifi on/off
# 蓝牙操作
bt*
hci*
bluetoothctl xxxx
bluetoothctl scan on

问题

  1. 编译找不到头文件
make[1]: Entering directory '/projects/kernel/out'
  GEN     Makefile
  UPD     include/config/kernel.release
  UPD     include/generated/utsrelease.h
  CALL    ../scripts/checksyscalls.sh
  CC      init/version.o
  AR      init/built-in.a
  CC      kernel/sys.o
  CC      kernel/module/main.o
  AR      kernel/module/built-in.a
  AR      kernel/built-in.a
  CC      drivers/base/firmware_loader/main.o
  AR      drivers/base/firmware_loader/built-in.a
  AR      drivers/base/built-in.a
  CC      drivers/net/wireless/uwe5622/unisocwcn/wcn_bus.o
../drivers/net/wireless/uwe5622/unisocwcn/wcn_bus.c:20:10: fatal error: wcn_bus.h: No such file or directory
   20 | #include <wcn_bus.h>
      |          ^~~~~~~~~~~
compilation terminated.
make[8]: *** [../scripts/Makefile.build:243: drivers/net/wireless/uwe5622/unisocwcn/wcn_bus.o] Error 1
make[7]: *** [../scripts/Makefile.build:480: drivers/net/wireless/uwe5622/unisocwcn] Error 2
make[6]: *** [../scripts/Makefile.build:480: drivers/net/wireless/uwe5622] Error 2
make[5]: *** [../scripts/Makefile.build:480: drivers/net/wireless] Error 2
make[4]: *** [../scripts/Makefile.build:480: drivers/net] Error 2
make[3]: *** [../scripts/Makefile.build:480: drivers] Error 2
make[2]: *** [/projects/kernel/Makefile:1911: .] Error 2
make[1]: *** [/projects/kernel/Makefile:234: __sub-make] Error 2
make[1]: Leaving directory '/projects/kernel/out'
make: *** [Makefile:234: __sub-make] Error 2

分析原因为 Makefile 引用的路径不正确:

diff --git a/drivers/net/wireless/uwe5622/Makefile b/drivers/net/wireless/uwe5622/Makefile
index d2210439f3cc..22345829fbaa 100644
--- a/drivers/net/wireless/uwe5622/Makefile
+++ b/drivers/net/wireless/uwe5622/Makefile
@@ -2,9 +2,10 @@ obj-$(CONFIG_RK_WIFI_DEVICE_UWE5622) += unisocwcn/
 obj-$(CONFIG_WLAN_UWE5622)    += unisocwifi/
 obj-$(CONFIG_TTY_OVERY_SDIO)  += tty-sdio/

-UNISOCWCN_DIR := $(shell cd $(src)/unisocwcn/ && /bin/pwd)
+UNISOCWCN_DIR := $(PWD)/drivers/net/wireless/uwe5622/unisocwcn/
 UNISOC_BSP_INCLUDE := $(UNISOCWCN_DIR)/include
 export UNISOC_BSP_INCLUDE
+export UNISOCWCN_DIR

 UNISOC_FW_PATH_CONFIG := "/lib/firmware/uwe5622/"
 export UNISOC_FW_PATH_CONFIG
diff --git a/drivers/net/wireless/uwe5622/unisocwcn/Makefile b/drivers/net/wireless/uwe5622/unisocwcn/Makefile
index 939acb5c9274..dcb8d34de69c 100755
--- a/drivers/net/wireless/uwe5622/unisocwcn/Makefile
+++ b/drivers/net/wireless/uwe5622/unisocwcn/Makefile
@@ -129,9 +129,9 @@ ccflags-y += -DCONFIG_WCN_BOOT
 ccflags-y += -DCONFIG_WCN_UTILS

 #### include path ######
-ccflags-y += -I$(src)/include/
-ccflags-y += -I$(src)/platform/
-ccflags-y += -I$(src)/platform/rf/
+ccflags-y += -I$(UNISOCWCN_DIR)/include/
+ccflags-y += -I$(UNISOCWCN_DIR)/platform/
+ccflags-y += -I$(UNISOCWCN_DIR)/platform/rf/

 #### add cflag for Customer ######
 ### ---------- Hisilicon start ---------- ###
@@ -405,7 +405,7 @@ KDIR ?= $(ANDROID_PRODUCT_OUT)/obj/KERNEL_OBJ
 ARCH ?= arm
 CROSS_COMPILE ?= arm-histbv310-linux-

-EXTRA_CFLAGS += -I$(src)/include -D__linux__
+EXTRA_CFLAGS += -I$(UNISOCWCN_DIR)/include -D__linux__

 all: $(all_dependencies)

  1. 操作系统设置 WiFi 虚拟 MAC 地址异常
[    7.046131] unisoc_wifi unisoc_wifi wlan0: start set random mac: 6a:9d:a5:a7:c0:c2
[    7.048751] unisoc_wifi unisoc_wifi wlan0: Current addr:  6a 9d a5 a7 c0 c2 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
[    7.051677] unisoc_wifi unisoc_wifi wlan0: Expected addr: 25 b8 2b a8 b3 5c 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
[    7.054787] ------------[ cut here ]------------
[    7.056109] netdevice: wlan0: Incorrect netdev->dev_addr
[    7.057635] WARNING: CPU: 1 PID: 334 at net/core/dev_addr_lists.c:519 dev_addr_check+0xa8/0x138
[    7.059435] Modules linked in: qrtr af_alg crct10dif_ce pwm_fan snd_soc_simple_card rockchip_saradc snd_soc_simple_card_utils industrialio_triggered_buffer kfifo_buf rockchip_thermal display_connector hci_uart btqca btbcm bluetooth ecdh_generic ecc snd_soc_rockchip_i2s_tdm hantro_vpu v4l2_vp9 videobuf2_dma_contig dw_hdmi_i2s_audio videobuf2_memops v4l2_h264 v4l2_mem2mem videobuf2_v4l2 dw_hdmi_cec rk817_charger snd_soc_rk817 rk805_pwrkey videobuf2_common videodev panfrost drm_shmem_helper gpu_sched mc sprdwl_ng cfg80211 sprdbt_tty rfkill fuse dm_mod ip_tables x_tables ipv6 blocklayoutdriver phy_rockchip_naneng_combphy spi_rockchip_sfc rtc_rk808
[    7.071676] CPU: 1 PID: 334 Comm: NetworkManager Not tainted 6.8.6-orangepi-3b-66581-g18ea9060b462 #87
[    7.071694] Hardware name: Rockchip RK3566 OPi 3B (DT)
[  OK  ] Finished systemd-update-ut… - Record Runlevel Change in UTMP.
[    7.071699] pstate: 60400009 (nZCv daif +PAN -UAO -TCO -DIT -SSBS BTYPE=--)
[    7.078291] pc : dev_addr_check+0xa8/0x138
[  OK  ] Started NetworkManager-dis…Manager Script Dispatcher Service.
[    7.078325] lr : dev_addr_check+0xa8/0x138
[    7.078333] sp : ffff8000827eb540
[    7.082701] x29: ffff8000827eb540 x28: 0000000000000000 x27: 0000000000000000
[    7.084524] x26: ffff800079b48228 x25: ffff000000ecb490 x24: 0000000000000001
[    7.086280] x23: ffff000009a88330 x22: 0000000000001002 x21: ffff800079b48228
[    7.088066] x20: ffff000009a88128 x19: ffff000009a88000 x18: 0000000000000006
[    7.089844] x17: 0000000000000000 x16: 0000000000000020 x15: 0000000000000002
[    7.091549] x14: 0000000000000001 x13: ffff8000817a0798 x12: 00000000000006e1
[    7.093218] x11: 000000000000024b x10: ffff8000817f8798 x9 : ffff8000817a0798
[    7.094832] x8 : 00000000ffffefff x7 : ffff8000817f8798 x6 : 80000000fffff000
[    7.096417] x5 : ffff00007fb0ecc8 x4 : 0000000000000000 x3 : 0000000000000000
[    7.097986] x2 : 0000000000000000 x1 : 0000000000000000 x0 : ffff000005f76600
[    7.099526] Call trace:
[    7.100610]  dev_addr_check+0xa8/0x138
[    7.101790]  __dev_open+0x40/0x1d8
[    7.102899]  __dev_change_flags+0x18c/0x204
[    7.104038]  dev_change_flags+0x24/0x6c
[    7.105163]  do_setlink+0x284/0xf14
[    7.106205]  __rtnl_newlink+0x524/0x894
[    7.107221]  rtnl_newlink+0x50/0x7c
[    7.108154]  rtnetlink_rcv_msg+0x12c/0x380
[    7.109108]  netlink_rcv_skb+0x5c/0x128
[    7.110019]  rtnetlink_rcv+0x18/0x24
[    7.110890]  netlink_unicast+0x2f4/0x360
[    7.111772]  netlink_sendmsg+0x17c/0x3c0
[    7.112656]  ____sys_sendmsg+0x224/0x284
[    7.113539]  ___sys_sendmsg+0xac/0x100
[    7.114387]  __sys_sendmsg+0x84/0xe0
[    7.115217]  __arm64_sys_sendmsg+0x24/0x30
[    7.116086]  invoke_syscall+0x48/0x118
[    7.116918]  el0_svc_common.constprop.0+0x40/0xe0
[    7.117839]  do_el0_svc+0x1c/0x28
[    7.118632]  el0_svc+0x34/0xb8
[    7.119400]  el0t_64_sync_handler+0x100/0x12c
[    7.120283]  el0t_64_sync+0x190/0x194
[    7.121094] ---[ end trace 0000000000000000 ]---

后跟踪原因:内核调用的地方检查到 dev_addrdev_addr_shadow 不一致抛出的异常:

static int __dev_open(struct net_device *dev, struct netlink_ext_ack *extack)
{
	const struct net_device_ops *ops = dev->netdev_ops;
	int ret;

	ASSERT_RTNL();
	dev_addr_check(dev);
  ...
}

void dev_addr_check(struct net_device *dev)
{
	if (!memcmp(dev->dev_addr, dev->dev_addr_shadow, MAX_ADDR_LEN))
		return;

	netdev_warn(dev, "Current addr:  %*ph\n", MAX_ADDR_LEN, dev->dev_addr);
	netdev_warn(dev, "Expected addr: %*ph\n",
		    MAX_ADDR_LEN, dev->dev_addr_shadow);
	netdev_WARN(dev, "Incorrect netdev->dev_addr\n");
}

尝试修复一下:

diff --git a/drivers/net/wireless/uwe5622/unisocwifi/main.c b/drivers/net/wireless/uwe5622/unisocwifi/main.c
index f1d6d7285d88..1dc6f150410f 100755
--- a/drivers/net/wireless/uwe5622/unisocwifi/main.c
+++ b/drivers/net/wireless/uwe5622/unisocwifi/main.c
@@ -945,11 +945,13 @@ static int sprdwl_set_mac(struct net_device *dev, void *addr)
                        vif->has_rand_mac = true;
                        memcpy(vif->random_mac, sa->sa_data, ETH_ALEN);
                        memcpy(dev->dev_addr, sa->sa_data, ETH_ALEN);
+                       memcpy(dev->dev_addr_shadow, sa->sa_data, ETH_ALEN);
                } else {
                        vif->has_rand_mac = false;
                        netdev_info(dev, "need clear random mac for sta/softap mode\n");
                        memset(vif->random_mac, 0, ETH_ALEN);
                        memcpy(dev->dev_addr, vif->mac, ETH_ALEN);
+                       memcpy(dev->dev_addr_shadow, vif->mac, ETH_ALEN);
                }
        }
        /*return success to pass vts test*/

参考