手上有块开发板,启动系统后,需要五六分钟后无线wifi网卡才能加载起来,网卡型号是qca9377。
第一步先确认是不是第一时间挂载到PCI总线上了,在ath10k_pci_probe函数中添加调试信息,另外查看/sys/bus/pci/drivers/ath10k_pci/确认系统启动后已经识别到PCI设备
但这时候网卡还没识别到,如下图
大约过5、6分钟后,系统识别到了网卡wlp16s0
ifconfig 也能看到网卡了
以上过程说明网卡驱动启动了并且没有异常退出,只是中间堵塞在什么地方了。继续在ath10k_pci_probe函数中增加调试信息,定位阻塞点,最终确认阻塞在驱动加载firmware的地方
驱动加载网卡芯片firmware有三种方式
1.内核直接找firmware
2.内核通过uevent通知用户空间读取firmware
方法1,查看源码发现网卡firmware,没有添加到指定的路径中,所以没有找到固件
static const char * const fw_path[] = {
fw_path_para,
"/lib/firmware/updates/" UTS_RELEASE,
"/lib/firmware/updates",
"/lib/firmware/" UTS_RELEASE,
"/lib/firmware"
};
方法2,有阻塞和非阻塞方式,目前开发板默认用的阻塞模式
看代码驱动需要加载多个bin文件(但实际没有这么多网卡也能正常用),板间确实没有这些bin文件所以就会阻塞在这里。
这个阻塞时间可以通过/sys/class/firmware/timeout设置,开发板默认用的是60s,总共有5个bin文件,所以阻塞了5分钟左右的时间
直接将/sys/class/firmware/timeout改成了3s,解决了该问题