两年前差不多这个时候, 当时遇到了一个诡异的问题, 安装 Arch Linux 的时候, 刚买的 MT7601U 无线网卡还能够正常使用, 装好之后却怎么也找不到它的 wireless interface. 查看 dmesg, 一直在报错

dmesg
[    6.781661] usb 1-9: device descriptor read/64, error -110
[   22.354966] usb 1-9: device descriptor read/64, error -110
[   22.574846] usb 1-9: new high-speed USB device number 5 using xhci_hcd
[   27.901660] usb 1-9: device descriptor read/64, error -110
[   43.474987] usb 1-9: device descriptor read/64, error -110
[   43.694866] usb 1-9: new high-speed USB device number 6 using xhci_hcd
[   48.908324] usb 1-9: device descriptor read/8, error -110
[   54.241655] usb 1-9: device descriptor read/8, error -110
[   54.461449] usb 1-9: new high-speed USB device number 7 using xhci_hcd
[   59.574988] usb 1-9: device descriptor read/8, error -110
[   64.908321] usb 1-9: device descriptor read/8, error -110
[   65.014753] usb usb1-port9: unable to enumerate USB device

于是到 Arch Linux 的论坛 上发了求助, 不过也没什么结果.

前几日想起来, 恰好在 https://bugs.launchpad.net/ubuntu/+source/linux/+bug/1716301 找到了解 决方法, 果然是驱动的问题. 虽然对我来说仍然是玄学, 不过打了补丁重新编译 驱动之后确实能用了. 第一次编译 Linux 的代码(驱动也算吧, 捂脸), 简要记录如下.

  • https://kernel.org 上下载对应 Linux 版本的源代码(其实只要 MT7601U 的驱动部分代码就好).

  • 利用 Comment #53 提供的 mcu.patch 重新编译 MT7601U 无线网卡的驱动:

cd drivers/net/wireless/mediatek/mt7601u
patch -p0 < mcu.patch
make -C /lib/modules/$(uname -r)/build/ M=$(pwd) modules
  • 插入设备以加载依赖的 module. 当然也可以手动查看并加载:
modinfo mt7601u | grep depends
# Output: depends:        mac80211,cfg80211
  • 拔下设备, 移除已加载的驱动并加载编译好的驱动:
sudo rmmod mt7601u
sudo insmod ./mt7601u.ko vnd_reset=0
  • 重新插入设备.

现在设备已经可以正常使用了. 可以替换原有的驱动(请先做好备份):

xz -z mt7601u.ko
sudo cp ./mt7601u.ko.xz /lib/modules/$(uname -r)/kernel/drivers/net/wireless/mediatek/mt7601u

这样在系统更新前都会使用编译的驱动.