OrangePi-3B 系列笔记:
- OrangePi-3B 折腾笔记 —— 认识开发板
- OrangePi-3B 折腾笔记 —— 准备构建环境
- OrangePi-3B 折腾笔记 —— 构建 U-Boot
- OrangePi-3B 折腾笔记 —— 构建 Kernel
- OrangePi-3B 折腾笔记 —— 点亮 LCD 屏幕
- OrangePi-3B 折腾笔记 —— 移植 WiFi & BT 驱动
- OrangePi-3B 折腾笔记 —— 构建文件系统镜像
温馨提示:
- OrangePi-3B 硬件版本 V1.1.1 的板子出现过有线网卡“无故”失灵的故障, 所以在进行操作前请确认开发板工作良好(修复这个问题需要更换 RK3566 芯片).
https://www.bilibili.com/read/cv33224126- 香橙派目前已经推出了硬件版本为 V2.1 的 OrangePi-3B, 有线网卡供应商更换为 RTL. 本系列文章没有针对 V2.1 的板子做过适配, 请根据实际情况操作(同时强烈谴责此种不负责任的行为, 如考虑购买此型号板子商用, 建议换个型号避坑).
- 本系列文章最后更新时间: 2024年11月02日.
编译环境
- 主板: OrangePi-3b_V1.1.1
- 芯片: RK3566
- 环境: Debian:12_x86_64(Docker)
内容说明
OrangePi-3b
搭载了一颗 紫光展锐
的 WIFI & BT
一体的无线模组,型号是 UWE5622
。
目前主线 Kernel
当中没有对应的驱动,需要移植一下。
通讯接口简介
OrangePi-3b
和 UWE5622
在板卡上通过 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模块直接从设备获取电源供应,减少了复杂的线缆。
还有一些低速总线也可以用于通讯:I2C
、SPI
、I2S
等。通常单片机使用这种低速总线的场景多一些。
移植
克隆代码
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
- 已经存在内核代码的话就不用再次拉取了;
- 手动移植香橙派驱动源码失败了,这里就抄
Armbian
的作业;UWE5622
每次启动需要固件,同样也是用Armbian
仓库中现成的二进制文件;
启动容器
docker run -ti --rm --privileged -v ~/projects/:/projects/ build-linux bash
- 关于镜像
build-linux
的内容请参考之前的笔记,其中已经安装构建所需要的软件包。
移植驱动
香橙派的 Kernel
当中已经存在相关的驱动源码,但是适配的内核版本是 5.10.x
,不能直接在 6.x.x
的内核中使用。
尝试移植,搞了一段时间发现问题真是太多了。
后来偶然发现 Armbian
的 24.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.11.3
rm patch.sh
- 注意
6.11.3
是内核版本,根据实际情况调整;这一步操作需要patchutils
软件包的支持;- 操作保持
drivers/net/wireless
和bluetooth
相关目录是原始状态;如果补丁失败,在此打补丁之前需要还原状态;
正常执行输出如下:
🌱 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
🌱 * applying patch/misc/wireless-uwe5622/uwe5622-v6.9.patch
🌱 * applying patch/misc/wireless-uwe5622/uwe5622-v6.11.patch
补丁调整
使用上面 Armbian
的补丁后发现还是有一些问题,需要调整一下:
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
模块除了需要驱动支持,还需要有对应的固件和软件包。
需要将这些依赖移植到目标文件系统。
由于调整了笔记的顺序,文件系统镜像放到了最后,但是验证这个驱动需要文件系统的支持。所有这里暂且记录一下这个驱动需要文件系统操作的点,在最后一篇笔记中一并整合。
- 应用
Kernel
镜像
可以通过网络加载最新的Kernel
应用,也可以复制镜像到文件系统应用。 - 拷贝
modules
到文件系统
拷贝out/lib/modules/
下的内容到设备/lib/modules/
,这里面包含移植的驱动模块。 - 注册驱动自动加载
新增加/etc/modules-load.d/uwe5622.conf
文件添加sprdbt_tty
和sprdwl_ng
两行内容,使其开机能够自动加载。 - 安装相关软件包
为了使系统支持 WIFI & BT 相关功能,需要安装一些软件包:network-manager
、rfkill
、wireless-tools
、bluetooth
和bluez-tools
- 拷贝固件
UWE5622
驱动需要对应的固件才能工作,需要移植到目标设备:- 拷贝
/armbian-firmware/uwe5622/
目录至/lib/firmware/
目录下。 - 拷贝
/armbian-firmware/bt_configure_*.ini
文件至/lib/firmware/
目录下。 - 创建和驱动中匹配的路径软连接:
sudo ln -s uwe5622/wcnmodem.bin /lib/firmware/wcnmodem.bin sudo ln -s uwe5622/wifi_2355b001_1ant.ini /lib/firmware/wifi_2355b001_1ant.ini
- 拷贝
- 拷贝定制的程序二进制
UWE5622
的蓝牙功能需要使用定制的hciattach
程序文件hciattach_opi
,需要移植到目标设备:- 拷贝
armbian-build/packages/bsp/rk3399/hciattach_opi
文件至/usr/bin/hciattach_opi
并赋予执行权限。 - 拷贝
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
- 拷贝
- 实测
wcnmodem.bin
和wifi_2355b001_1ant.ini
必须存在,否则驱动无法正常工作;- 实测
hciattach_opi
必须使用定制的版本,否则蓝牙无法正常驱动,源码为香橙派开源;- 实测
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
问题
- 编译找不到头文件
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)
- 操作系统设置
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_addr
和 dev_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*/