折腾 MT7902 板载网卡
一张本应开箱即用的无线网卡,让我在 Arch Linux 下折腾了整整一天半 驱动、固件、回滚、重装……所有软件手段都试过了 曾经有过短暂的胜利,却因为一次错误的退出方式又开始折腾了 最后,一个CR2032 给我解局了 而且,我用的可是全新安装的最新内核
背景
2026 年 4 月 11 日,我组了一台新台式机作为新的开发服务器平台
配置如下:
- 主板:技嘉 B850M FORCE WIFI6E
- CPU:AMD Ryzen 7 9700X
- 显卡:RX 550(从E3机箱中拆除来的二手”老兵”RX 550)
- 硬盘:NVMe 1TB
- 系统:Arch Linux + KDE Plasma(刚装的,内核版本 6.19.11-zen)
之所以选 Arch,就是因为喜欢滚动更新(以及AUR确实很好用),最新内核,简洁,可定义强,性能好
结果装完系统,没网,ip link show 一看,只有 lo 和自带的有线网卡 enp7s0(Down),wlan0 无影无踪,当时我还挺乐观:小问题,装个驱动就好了
第一阶段:常规操作(寄)
1. 确认硬件是否被识别
不得不说Linux的管道符“|”加文本过滤工具“grep”就是好用
命令:
grep [选项] "搜索模式" [文件]先用 lspci 看看:
lspci | grep -i network输出:
06:00.0 Network controller: MEDIATEK Corp. MT7902 802.11ax PCIe Wireless Network Adapter [Filogic 310]PCI 能看到,说明硬件没坏,只是驱动没起来,那剩下的就是驱动和固件的事了
2. 安装 linux-firmware
一般来说,Arch 的 linux-firmware 包包含了大多数网卡的固件,安装的时候应该一般安上了,
执行即可:
sudo pacman -S linux-firmware重启,依然没有 wlan0,连 iw dev 都空空如也
3. 尝试加载驱动模块
MT7902 对应的驱动模块是 mt7921e(后来才知道其实可能是 mt7925e,但当时不知道):
sudo modprobe mt7921e没有任何报错,但 iw dev 还是空—>查看内核日志:
sudo dmesg | grep mt79[ 12.148794] mt7921e 0000:06:00.0: enabling device (0000 -> 0002)[ 13.177391] mt7921e 0000:06:00.0: driver own failed[ 13.177606] mt7921e 0000:06:00.0: probe with driver mt7921e failed with error -5emm(啊?):
driver own failed,错误码 -5
上网查了一下,意思是驱动无法获取硬件的控制权,常见的原因有:固件缺失、固件版本不匹配、或者硬件处于某种“假死”状态
4. 手动补固件
没招了,从万能的AUR上找找驱动,于是安装了:
paru -S mediatek-mt7927-dkms安装过程编译了 DKMS 模块,但 iw dev还是空的
然后重新加载驱动:
sudo modprobe -r mt7921esudo modprobe mt7921esudo dmesg | grep mt79寄…driver own failed
5. 尝试 mt7925e 驱动
逛论坛的时候,看到有人说 MT7902 实际上应该用 mt7925e 驱动,我赶紧试:
sudo modprobe -r mt7921esudo modprobe mt7925edmesg 里同样出现 driver own failed,只是模块名换了一下,无效
6. 检查 rfkill
想着会不会是软件或硬件开关把无线禁用了?
rfkill list输出什么都没有,说明 rfkill 根本没检测到任何无线设备,不是开关的问题
插曲:短暂的成功,然后作了又来
7.装 NetworkManager的依赖(喜)
sudo pacman -S network-manager-applet然后重启
进系统后,看着网络正常了
❯ rfkill list0: hci0: Bluetooth Soft blocked: no Hard blocked: no1: phy0: Wireless LAN Soft blocked: no Hard blocked: no❯ iw link1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:002: enp7s0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc fq_codel state DOWN mode DEFAULT group default qlen 1000 link/ether 30:56:0f:3b:ef:6b brd ff:ff:ff:ff:ff:ff altname enx30560f3bef6b4: wlan0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP mode DORMANT group default qlen 1000 ~~~~ ^(可以看到**UP**了) link/ether 44:46:48:6b:e8:42 brd ff:ff:ff:ff:ff:ffwlan0 也是有了,赶紧连接热点测试一下还行,还去speedtest上测了下
网页秒开,测速也跑满了,终于好了,光连接可不行,我想试试用 create_ap 开个热点,给手机用
两者的工作原理并不太一样
create_ap:一个旨在灵活创建热点的脚本,当你让它同时接收 Wi-Fi 和发射热点时(如 create_ap wlan0 wlan0 …),它会主动调用 iw 命令,在物理网卡上创建两个独立的“虚拟接口”
NetworkManager(nm):一个追求稳定易用的网络服务管理器,它本身(仅nm)不支持直接对物理网卡做“一拆二”的操作,因此,当它要开热点时,要么整张网卡都转为热点模式(无法同时上网),要么就必须依赖第二张物理网卡(如有线网卡)来提供网络连接
因 此,😅 我执行了:
sudo create_ap wlan0 wlan0 MyAP 111111111试了一试热点成功启动,连上了,还不错
[sudo] xxx 的密码:Config dir: /tmp/create_ap.wlan0.conf.tAtYPdBFPID: 29993Network Manager found, set ap0 as unmanaged device... DONEwlan0 is already associated with channel 149 (5745.0 MHz)multiple channels not supported,
fallback to channel 149Creating a virtual WiFi interface... ap0 created.Sharing Internet using method: nathostapd command-line interface: hostapd_cli -p /tmp/create_ap.wlan0.conf.tAtYPdBF/hostapd_ctrlWARN: Low entropy detected. We recommend you to install `haveged'ap0: interface state UNINITIALIZED->ENABLEDap0: AP-ENABLED当时我在终端里运行着 create_ap,按道理应该按 Ctrl+C 让它正常退出
Doing cleanup.. nl80211: deinit ifname=ap0 disabled_11b_rates=0done但那时候抽了——我安装完东西设置环境变量后要重登,顺手 logout 退出了当前会话
重新登录后,nm卡了,并且发现 wlan0 又消失了,网络也显示未知😅
再执行 iw dev,空空如也
dmesg | grep mt79 再次出现了…
mt7921e 0000:06:00.0: driver own failedmt7921e 0000:06:00.0: probe with driver mt7921e failed with error -5EMM,重试之前所有的方法:
- 重装驱动
- 重新生成 initramfs 镜像(
sudo mkinitcpio -P) - 重装 NetworkManager
- 重装
network-manager及其它组件
网卡就像没了一样,但是PCI 能看到,但驱动死活初始化不了
(后来我才明白:,)create_ap 如果没有正常退出(比如直接关终端、强制注销),它创建的虚拟接口 ap0 不会被自动删除,hostapd 和 dnsmasq 进程也可能残留,这些残留会导致网卡的状态机卡死,即使重启也没用——因为普通重启不会重置 PCIe 设备的电源状态😅
8.重装 NetworkManager
我怀疑可能是之前折腾 create_ap搞没的,于是就删了nm(NetworkManager)
#删软件包+配置文件(nm依赖一并删,不然删不掉)sudo systemctl stop NetworkManagersudo pacman -Rns networkmanager plasma-nm nm-connection-editorsudo rm -rf /etc/NetworkManager/sudo rm -rf /var/lib/NetworkManager/#安装sudo pacman -S networkmanager plasma-nm nm-connection-editorsudo systemctl enable --now NetworkManager重启后,nmcli device status 里依然只有 enp7s0(DOWN)和 lo,手机 USB 共享的 enp13s0u5 倒是正常,但这不能解决无线问题(和之前一样啊😦)
8. 回滚系统快照
我之前用 snapper 配了 Btrfs 快照,想着回滚到刚装系统的时候,说不定能回到某个“干净”的状态
sudo snapper -c root list输出:
|号| 类型 | 日期 | 用户 | 清空 | 描述 ||--|--------|-----------------------------------|------|------|---------||0 | single | | root | | current ||1 | single |2026年04月12日 星期日 12时12分41秒 | root | | 1 ||2 | single |2026年04月12日 星期日 12时43分03秒 | root | | 2 ||3 | single |2026年04月12日 星期日 15时53分14秒 | root | | 3 ||4 | single |2026年04月12日 星期日 16时14分23秒 | root | | 4 |我选了快照 3(15:53 的状态),执行:
sudo snapper -c root rollback 3但 snapper 报错说需要 --ambit 参数,懒得研究,直接手动改默认子卷:
sudo btrfs subvolume set-default 295 /sudo reboot重启后系统回到了快照 3 的状态,但driver own failed 依旧(试了之前正常的2也不行👿)
9. 重置 PCI 设备
又尝试了从系统层面强制重置 PCI 设备:
echo 1 | sudo tee /sys/bus/pci/devices/0000:06:00.0/removeecho 1 | sudo tee /sys/bus/pci/rescansudo modprobe mt7921e没用,dmesg 依然输出 driver own failed
10. 更新内核到最新
既然我是新装的系统,内核版本也没什么新发的
sudo pacman -Sy archlinux-keyringsudo pacman -Su改中文的话,pacman包管理也改显示中文,挺好
:: 正在进行全面系统更新... 今日无事可做至此,我已经花了半天时间,所有能搜到的软件解决方案都试过了,无一有效
第二阶段:转机
及贴吧上(17年的有点老了)

我当时觉得这太玄学了,扣电池能解决问题?但是网卡之前还能用啊😅
第三阶段:啊?扣电池,成了?
详细操作步骤
-
关机
在 KDE 里点击关机后 -
拔掉电源线
毕竟5V的待机电路还是通电的 -
打开机箱侧板
我的机箱侧板能扣下来 -
找到主板上的纽扣电池
在显卡下方,PCIe 插槽旁边,有一个银色的 CR2032 电池,直径约 2 厘米,厚度约 3 毫米,技嘉主板上通常有一个金属卡扣压着它(其实看起来就像纽扣电池) -
取出电池
用指甲或者小螺丝刀轻轻压住卡扣(),电池的另一侧会弹起来,然后手指捏住电池边缘,把它拿出来
IMPORTANT注意不要用蛮力,卡扣很薄
- 等待 (不要短接)
当时以为要放电短接,但不要这么做
扣电池 → CMOS 断电 → 数据清空:CMOS 是易失性存储,没电就失忆,失忆了就只能用出厂默认值
IMPORTANT主板上有电容,会存一点点电,要等电放光,CMOS 才会彻底重置
-
装回电池
注意正极朝上(电池上写着“+”的一面朝外)把电池按回卡槽,听到“咔”一声,卡扣锁住 -
合上侧板,接上电源线
-
开机
按电源键后,主板 BIOS 提示“CMOS checksum error”,因为 CMOS 被清空了,狂按DEL进入 BIOS 设置 -
重新设置 BIOS
- 又设置了一通bios,包括但不限于
- 关安全启动
- XMP/EXPO内存超频
- PBO相关
- 开IOMMU(我要配置虚拟机显卡直通)
- 关fTPM
- CPU看门狗
- 保存并退出 (F10)
CAUTION个人配置,请谨慎参考
- 进入 Arch
正常启动,进入 KDE 桌面
结果:
进桌面有wifi图标了,又执行了:
iw devphy#0 Unnamed/non-netdev interface wdev 0x3 addr xxxxxxxxxx type P2P-device txpower 20.00 dBm Interface wlan0 ifindex 4 wdev 0x2 addr xxxxxxxxx ssid xxxx xx type managed channel 149 (5745 MHz), width: 80 MHz, center1: 5775 MHz txpower 0.00 dBm multicast TXQ: qsz-byt qsz-pkt flows drops marks overlmt hashcol tx-bytes tx-packets 0 0 0 0 0 0 0 0 0wlan0 回来了! 网络也好了😅😅😅(蓝牙也可以用了)
再输入 nmcli device status:
❯ nmcli device statusDEVICE TYPE STATE CONNECTIONwlan0 wifi 已连接 iQOO13lo loopback 连接(外部) lobr-709a4da90ed8 bridge 连接(外部) br-709a4da90ed8docker0 bridge 连接(外部) docker0enp7s0 ethernet 不可用 --/net/connman/iwd/0 wifi-p2p 不可用 --然后连热点也没问题了:网页秒开,测速跑满流量
究其原因
小结
不一定全都对
-
根源到底是什么
driver own failed是一个硬件级的初始化失败,软件驱动发了一堆命令,网卡芯片根本不搭理,常规的重启、重装驱动、甚至重装系统都解决不了,因为 PCIe 设备的状态被固化在主板电源管理单元里了,只有彻底断电(包括 CMOS 电池)才能重置
而create_ap的不正常退出,导致网卡锁死,进入了无法自行恢复的状态 -
为什么扣电池有效
主板上的纽扣电池不仅维持 BIOS 设置,还参与一些低功耗状态的管理,拔掉电池并放电后,所有寄存器、电源状态、设备固件的内部状态都被清零了,网卡从“假死”中恢复过来,重新响应 PCIe 总线上的枚举和初始化命令 -
一些教训\
- 先硬件后软件:遇到诡异的设备不认,先试试断电、拔电池、清 CMOS,这些操作无成本,但可能省下几天时间
- 使用 create_ap 等工具或自制脚本时,务必
Ctrl+C正常退出,不要直接强制注销 - 万能的社区
参考:
现在网卡跑得怎么样?
能稳定用了,没断过流,热点也正常(用 create_ap 开 5GHz 频段,记得正常退出)之前折腾的那些驱动、固件其实都没白装,它们本来就能工作,只是硬件自己被锁住了
给遇到同样问题的人一句话
如果你的 Linux/win的板载wifi 能识别 PCI 设备但驱动报 driver own failed,可以试试扣CR2032(当然,不一定有效)
附:当前网络配置
- 系统:Arch Linux (6.19.11-zen1-1-zen)
- 网卡:MediaTek MT7902
- 驱动:mt7921e(内核自带)
- 固件:linux-firmware 中的 mt79* 文件
- 网络管理:NetworkManager
一切正常了😅🤓,吗?
遇到折腾,开始折腾,享受折腾
后续
内核空指针解引用导致的系统卡死
开着开着系统有时卡服务,网络层面的
查日志ing
journalctl -b -1 -p 3emm
4月 21 12:47:38 archlinux kernel: BUG: kernel NULL pointer dereference, address: 0000000000000000日志的内核空指针引用查了一下有可能是驱动不兼容错误,升级内核可能触发
结合系统之前安装过的 mediatek-mt7927 DKMS 驱动,这是一个为 MT7927 设计的第三方驱动,可能与内核存在冲突
(其实刚不久把升级内核6.19.12-zen来着)
Bluetooth: hci0: Unsupported hardware variant (00007902)wpa_supplicant: p2p-dev-wlp5s0: Failed to initialize driver interfaceNetworkManager-initrd.service: Two services allocated for the same bus name org.freedesktop.NetworkManager, refusing operation.网络服务的报错又来了
当时更新GRUB是grub-mkconfig写着都是这驱动的报错
所以只能 移除有问题的 DKMS 驱动,换用更好的驱动
彻底移除有问题的 DKMS 驱动
为了避免旧驱动再次引发冲突,需要彻底清除之前的 mediatek-mt7927 DKMS 驱动:
# 从所有内核中移除该 DKMS 模块sudo dkms remove mediatek-mt7927/2.10 --all
# 删除模块源文件sudo rm -rf /var/lib/dkms/mediatek-mt7927
# 重新生成 initramfssudo mkinitcpio -P编译并安装驱动
由于 MT7902 的驱动尚未进入主线内核(预计随 Linux 7.0/7.1 发布),目前最可靠的方案是使用社区开发者 hmtheboy154 提供的 backport 驱动
该驱动支持 Linux 6.6 到 6.19 内核
删除驱动电脑肯定就没有 Wi-Fi了,通过有线网络让电脑临时联网
github上有此步骤说明,详见Github页面,下方可以到达他的仓库
- 步骤来自github
# 安装编译依赖sudo pacman -S --needed base-devel git linux-headers
# 克隆驱动仓库git clone https://github.com/hmtheboy154/mt7902cd mt7902
# 编译并安装make -j$(nproc)sudo make install
# 可选:安装固件(通常 linux-firmware 包已包含,但建议执行以防万一)sudo make install_fw-j$(nproc) 是利用所有 CPU 核心加速编译,可大幅缩短等待时间。
3. 加载驱动并验证
sudo modprobe mt7902esudo systemctl restart NetworkManager重启后,检查驱动是否加载成功:
lsmod | grep mt7902ip link show | grep -E "wlan|wlp"如果看到 mt7902e 模块和以 wlp 开头的无线接口,说明驱动已成功加载。此时系统托盘的网络图标应能正常显示可用 Wi-Fi 列表,连接网络后即可正常上网。
修复蓝牙功能(懒得搞了)
Wi-Fi 可用后,蓝牙仍然报错 Bluetooth: hci0: Unsupported hardware variant (00007902)
这是因为 linux-firmware 包尚未收录 MT7902 的蓝牙固件(太新了吧)
但hmtheboy154tip了一个分支可以解决,服务器不太需要蓝牙固件,所以就没安装
其它
查日志还有警告
wpa_supplicant: p2p-dev-wlp5s0: Failed to initialize driver interface这是 wpa_supplicant 尝试启用 Wi-Fi Direct(点对点直连)功能失败所致,此功能几乎用不到,就不管了
最后就改一下DNS了
编辑 /etc/systemd/resolved.conf:
[Resolve]DNS=223.5.5.5 223.6.6.6FallbackDNS=119.29.29.29Domains=~.然后重启服务并锁定软链接:
sudo systemctl restart systemd-resolvedsudo ln -sf /run/systemd/resolve/stub-resolv.conf /etc/resolv.confTIP然后折腾就告一段落了😅
如果这篇文章对你有帮助,欢迎分享给更多人!
部分信息可能已经过时
