无线网卡找不到问题调试

在 rock 3a 系列板子上配置无线网,需要单独购买网卡。一开始在淘宝买了一块 Intel 7265 无线网卡(rock 3a 官方限定的,应该其它型号也可以,但是需要注意内核版本),使用体验还可以。后来又采购了一批 rock 3a 的板子,于是又按照原来的单子买了一块 Intel 7265 无线网卡,但是接上去之后找不到无线网卡,以下记录一下排查过程和思考。

一、问题描述

硬件环境:

  • Rock 3A 开发板
  • Intel 7265 无线网卡(M.2 接口)

问题现象:

  • ifconfig 看不到无线网

问题猜测:

  • 最糟糕的情形是硬件是个坏的,买了也很久了没做过测试可能不给换了
  • 其次可能是网卡适配问题,但是为什么另一块网卡可以用呢?

二、问题排查

2.1 硬件排查

从网上了解到 lspci 命令可以查看主板(开发板)上接入的 PCI 设备(根据实际应用发现也可以查看 M.2 设备)

1
2
3
# lspci 输出
00:00.0 PCI bridge: Fuzhou Rockchip Electronics Co., Ltd Device 3566 (rev 01)
01:00.0 Network controller: Intel Corporation Wireless 7265 (rev 48)

从上面 lspci 的输出可以看出来,应该不是硬件坏了,因为硬件的版本还是可以看到的。

查找到 -k 参数可以看对应的驱动程序,内核模块

1
2
3
4
5
6
# lspci -k 输出
00:00.0 PCI bridge: Fuzhou Rockchip Electronics Co., Ltd Device 3566 (rev 01)
Kernel driver in use: pcieport
lspci: Unable to load libkmod resources: error -12
01:00.0 Network controller: Intel Corporation Wireless 7265 (rev 48)
Subsystem: Intel Corporation Dual Band Wireless-AC 7265

从上面我以为找到了重点:lspci: Unable to load libkmod resources: error -12,但是我在另一块开发板上也发现了同样的问题。

再次使用 -v 参数查看详细的信息:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
# lspci -v 输出
00:00.0 PCI bridge: Fuzhou Rockchip Electronics Co., Ltd Device 3566 (rev 01) (prog-if 00 [Normal decode])
Flags: bus master, fast devsel, latency 0, IRQ 108
Bus: primary=00, secondary=01, subordinate=ff, sec-latency=0
I/O behind bridge: [disabled]
Memory behind bridge: 00900000-009fffff [size=1M]
Prefetchable memory behind bridge: [disabled]
Expansion ROM at 300a00000 [virtual] [disabled] [size=64K]
Capabilities: [40] Power Management version 3
Capabilities: [50] MSI: Enable+ Count=16/32 Maskable- 64bit+
Capabilities: [70] Express Root Port (Slot-), MSI 00
Capabilities: [b0] MSI-X: Enable- Count=1 Masked-
Capabilities: [100] Advanced Error Reporting
Capabilities: [148] Secondary PCI Express
Capabilities: [160] L1 PM Substates
Capabilities: [170] Vendor Specific Information: ID=0002 Rev=4 Len=100 <?>
Kernel driver in use: pcieport
lspci: Unable to load libkmod resources: error -12

01:00.0 Network controller: Intel Corporation Wireless 7265 (rev 48)
Subsystem: Intel Corporation Dual Band Wireless-AC 7265
Flags: fast devsel, IRQ 107
Memory at 300900000 (64-bit, non-prefetchable) [size=8K]
Capabilities: [c8] Power Management version 3
Capabilities: [d0] MSI: Enable- Count=1/1 Maskable- 64bit+
Capabilities: [40] Express Endpoint, MSI 00
Capabilities: [100] Advanced Error Reporting
Capabilities: [140] Device Serial Number 64-80-99-ff-ff-a8-34-a5
Capabilities: [14c] Latency Tolerance Reporting
Capabilities: [154] L1 PM Substates

同样的,这些信息也和另外一块板子上一模一样,没有参考价值。

在使用 -k 参数查看内核信息时,并没有看到有内核信息输出,所以问题是不是出在内核驱动上?于是想到了 dmesg 命令。

2.2 驱动排查

dmesg 命令可以查看开机信息,可以看各个模块是否加载成功。查看 dmesg 输出:

1
2
3
4
5
6
7
8
9
10
11
12
# dmesg 输出(部分)
[ 5.735812] iwlwifi 0000:01:00.0: Direct firmware load for iwlwifi-7265-17.ucode failed with error -2
[ 5.735933] iwlwifi 0000:01:00.0: no suitable firmware found!
[ 5.736069] iwlwifi 0000:01:00.0: iwlwifi-7265-17 is required
[ 5.736093] iwlwifi 0000:01:00.0: check git://git.kernel.org/pub/scm/linux/kernel/git/firmware/linux-firmware.git
[ 5.969330] usbcore: registered new interface driver btusb
[ 5.988375] Bluetooth: hci0: read Intel version: 370810011002270d00
[ 5.990701] bluetooth hci0: Direct firmware load for intel/ibt-hw-37.8.10-fw-1.10.2.27.d.bseq failed with error -2
[ 5.990737] Bluetooth: hci0: failed to open Intel firmware file: intel/ibt-hw-37.8.10-fw-1.10.2.27.d.bseq (-2)
[ 5.993308] Bluetooth: hci0: Intel Bluetooth firmware file: intel/ibt-hw-37.8.bseq
[ 5.995534] Bluetooth: hci0: unexpected event for opcode 0xfc2f
[ 5.998546] Bluetooth: hci0: Intel firmware patch completed

于是就看到了启动时加载 wifi 固件 iwlwifi-7265-17.ucode 和蓝牙固件 intel/ibt-hw-37.8.10-fw-1.10.2.27.d.bseq 都失败了,这两个模块在 /usr/lib/firmware 中,查看固件目录:

1
2
3
4
5
6
7
8
(blockchain_board) root@rock-3a:/usr/lib/firmware# pwd
/usr/lib/firmware
(blockchain_board) root@rock-3a:/usr/lib/firmware# ls
ath10k intel iwlwifi-cc-a0-46.ucode rtl8723du_config rtl8821cu_config rtl8852bu_config rtl_bt
brcm iwlwifi-7265D-29.ucode iwlwifi-ty-a0-gf-a0-59.ucode rtl8723du_fw rtl8821cu_fw rtl8852bu_fw rtlwifi
(blockchain_board) root@rock-3a:/usr/lib/firmware# ls intel/
ibt-0041-0041.ddc ibt-0041-0041.sfi ibt-hw-37.8.10-fw-1.10.3.11.e.bseq ibt-hw-37.8.10-fw-22.50.19.14.f.bseq ibt-hw-37.8.bseq
(blockchain_board) root@rock-3a:/usr/lib/firmware#

可以看到应该是缺了这两个固件,所以 WIFI 才没有启动成功!从列出来的固件可以看出,无线网卡 7265 只有一个 iwlwifi-7265D-29.ucode 固件,应该是 7265 也有不同的固件版本才导致无线网卡会加载失败吧。蓝牙固件也是,只是版本不一样。

2.3 解决

从网上找到这两个固件,放到固件的目录,重启即可解决无线找不到的问题了。

三、思考

我们无法一开始就知道是固件版本的问题,只能从整体的结构上去分析问题到底出在哪里。从整体上分析问题要对整体的结构都有所了解,即使不知道细节,也可以将问题定位到一个很小的范围,这样才能更快更好的解决问题。