3398 字
9 分钟
折腾 MT7902 板载网卡
2026-04-12
2026-04-26

折腾 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 -5

emm(啊?):

driver own failed,错误码 -5

上网查了一下,意思是驱动无法获取硬件的控制权,常见的原因有:固件缺失、固件版本不匹配、或者硬件处于某种“假死”状态

4. 手动补固件#

驱动包 没招了,从万能的AUR上找找驱动,于是安装了:

paru -S mediatek-mt7927-dkms

安装过程编译了 DKMS 模块,但 iw dev还是空的

然后重新加载驱动:

sudo modprobe -r mt7921e
sudo modprobe mt7921e
sudo dmesg | grep mt79

寄…driver own failed

5. 尝试 mt7925e 驱动#

论坛的时候,看到有人说 MT7902 实际上应该用 mt7925e 驱动,我赶紧试:

sudo modprobe -r mt7921e
sudo modprobe mt7925e

dmesg 里同样出现 driver own failed,只是模块名换了一下,无效

6. 检查 rfkill#

想着会不会是软件或硬件开关把无线禁用了?

rfkill list

输出什么都没有,说明 rfkill 根本没检测到任何无线设备,不是开关的问题


插曲:短暂的成功,然后作了又来#

7.装 NetworkManager的依赖(喜)#

sudo pacman -S network-manager-applet

然后重启

进系统后,看着网络正常了

rfkill list
0: hci0: Bluetooth
Soft blocked: no
Hard blocked: no
1: phy0: Wireless LAN
Soft blocked: no
Hard blocked: no

iw link
1: 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:00
2: 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 enx30560f3bef6b
4: 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:ff

wlan0 也是有了,赶紧连接热点测试一下还行,还去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.tAtYPdBF
PID: 29993
Network Manager found, set ap0 as unmanaged device... DONE
wlan0 is already associated with channel 149 (5745.0 MHz)
multiple channels not supported,
fallback to channel 149
Creating a virtual WiFi interface... ap0 created.
Sharing Internet using method: nat
hostapd command-line interface: hostapd_cli -p /tmp/create_ap.wlan0.conf.tAtYPdBF/hostapd_ctrl
WARN: Low entropy detected. We recommend you to install `haveged'
ap0: interface state UNINITIALIZED->ENABLED
ap0: AP-ENABLED

当时我在终端里运行着 create_ap,按道理应该按 Ctrl+C 让它正常退出

Doing cleanup.. nl80211: deinit ifname=ap0 disabled_11b_rates=0
done

但那时候抽了——我安装完东西设置环境变量后要重登,顺手 logout 退出了当前会话
重新登录后,nm卡了,并且发现 wlan0 又消失了,网络也显示未知😅
再执行 iw dev,空空如也
dmesg | grep mt79 再次出现了…

mt7921e 0000:06:00.0: driver own failed
mt7921e 0000:06:00.0: probe with driver mt7921e failed with error -5

EMM,重试之前所有的方法:

  • 重装驱动
  • 重新生成 initramfs 镜像(sudo mkinitcpio -P
  • 重装 NetworkManager
  • 重装 network-manager及其它组件

网卡就像没了一样,但是PCI 能看到,但驱动死活初始化不了

后来我才明白:create_ap 如果没有正常退出(比如直接关终端、强制注销),它创建的虚拟接口 ap0 不会被自动删除,hostapddnsmasq 进程也可能残留,这些残留会导致网卡的状态机卡死,即使重启也没用——因为普通重启不会重置 PCIe 设备的电源状态😅,)

8.重装 NetworkManager#

我怀疑可能是之前折腾 create_ap搞没的,于是就删了nm(NetworkManager)

#删软件包+配置文件(nm依赖一并删,不然删不掉)
sudo systemctl stop NetworkManager
sudo pacman -Rns networkmanager plasma-nm nm-connection-editor
sudo rm -rf /etc/NetworkManager/
sudo rm -rf /var/lib/NetworkManager/
#安装
sudo pacman -S networkmanager plasma-nm nm-connection-editor
sudo 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/remove
echo 1 | sudo tee /sys/bus/pci/rescan
sudo modprobe mt7921e

没用,dmesg 依然输出 driver own failed

10. 更新内核到最新#

既然我是新装的系统,内核版本也没什么新发的

sudo pacman -Sy archlinux-keyring
sudo pacman -Su

改中文的话,pacman包管理也改显示中文,挺好

:: 正在进行全面系统更新...
今日无事可做

至此,我已经花了半天时间,所有能搜到的软件解决方案都试过了,无一有效

第二阶段:转机#

B站UP主“今夜有点闲_”:他的b660m板载Realtek网卡突然在设备管理器里消失了,BIOS里网卡MAC地址都变成了FF在尝试了驱动和BIOS设置都无效后,断电后扣下CMOS电池10分钟,强行清零,结果开机后网卡就神奇地恢复了

及贴吧上(17年的有点老了) emm

我当时觉得这太玄学了,扣电池能解决问题?但是网卡之前还能用啊😅


第三阶段:啊?扣电池,成了?#

详细操作步骤#

  1. 关机
    在 KDE 里点击关机后

  2. 拔掉电源线
    毕竟5V的待机电路还是通电的

  3. 打开机箱侧板
    我的机箱侧板能扣下来

  4. 找到主板上的纽扣电池
    在显卡下方,PCIe 插槽旁边,有一个银色的 CR2032 电池,直径约 2 厘米,厚度约 3 毫米,技嘉主板上通常有一个金属卡扣压着它(其实看起来就像纽扣电池

  5. 取出电池
    用指甲或者小螺丝刀轻轻压住卡扣(),电池的另一侧会弹起来,然后手指捏住电池边缘,把它拿出来

IMPORTANT

注意不要用蛮力,卡扣很薄

  1. 等待 (不要短接) 当时以为要放电短接,但不要这么做
    扣电池 → CMOS 断电 → 数据清空:CMOS 是易失性存储,没电就失忆,失忆了就只能用出厂默认值
IMPORTANT

主板上有电容,会存一点点电,要等电放光,CMOS 才会彻底重置

  1. 装回电池
    注意正极朝上(电池上写着“+”的一面朝外)把电池按回卡槽,听到“咔”一声,卡扣锁住

  2. 合上侧板,接上电源线

  3. 开机
    按电源键后,主板 BIOS 提示“CMOS checksum error”,因为 CMOS 被清空了,狂按DEL进入 BIOS 设置

  4. 重新设置 BIOS

    • 又设置了一通bios,包括但不限于
    • 关安全启动
    • XMP/EXPO内存超频
    • PBO相关
    • 开IOMMU(我要配置虚拟机显卡直通)
    • 关fTPM
    • CPU看门狗
    • 保存并退出 (F10)
CAUTION

个人配置,请谨慎参考

  1. 进入 Arch
    正常启动,进入 KDE 桌面

结果:#

进桌面有wifi图标了,又执行了:

iw dev
phy#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 0

wlan0 回来了! 网络也好了😅😅😅(蓝牙也可以用了)

再输入 nmcli device status

❯ nmcli device status
DEVICE TYPE STATE CONNECTION
wlan0 wifi 已连接 iQOO13
lo loopback 连接(外部) lo
br-709a4da90ed8 bridge 连接(外部) br-709a4da90ed8
docker0 bridge 连接(外部) docker0
enp7s0 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 3

emm

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 interface
NetworkManager-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
# 重新生成 initramfs
sudo mkinitcpio -P

编译并安装驱动#

由于 MT7902 的驱动尚未进入主线内核(预计随 Linux 7.0/7.1 发布),目前最可靠的方案是使用社区开发者 hmtheboy154 提供的 backport 驱动
该驱动支持 Linux 6.6 到 6.19 内核

删除驱动电脑肯定就没有 Wi-Fi了,通过有线网络让电脑临时联网

github上有此步骤说明,详见Github页面下方可以到达他的仓库

hmtheboy154
/
mt7902
Waiting for api.github.com...
00K
0K
0K
Waiting...
  • 步骤来自github
# 安装编译依赖
sudo pacman -S --needed base-devel git linux-headers
# 克隆驱动仓库
git clone https://github.com/hmtheboy154/mt7902
cd mt7902
# 编译并安装
make -j$(nproc)
sudo make install
# 可选:安装固件(通常 linux-firmware 包已包含,但建议执行以防万一)
sudo make install_fw

-j$(nproc) 是利用所有 CPU 核心加速编译,可大幅缩短等待时间。

3. 加载驱动并验证#

sudo modprobe mt7902e
sudo systemctl restart NetworkManager

重启后,检查驱动是否加载成功:

lsmod | grep mt7902
ip 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.6
FallbackDNS=119.29.29.29
Domains=~.

然后重启服务并锁定软链接:

sudo systemctl restart systemd-resolved
sudo ln -sf /run/systemd/resolve/stub-resolv.conf /etc/resolv.conf
TIP

然后折腾就告一段落了😅

分享

如果这篇文章对你有帮助,欢迎分享给更多人!

折腾 MT7902 板载网卡
https://text.lilystar.cn/posts/mt7902/
作者
Lily
发布于
2026-04-12
许可协议
CC BY-NC-SA 4.0

部分信息可能已经过时

目录