解決老 MacBook 無線網路在待命回復後無法使用的問題

新的一季,新的 broadcom-wl 問題。

前情提要

我用的是機齡 11 年的 MacBook Pro Mid-2014 做為主力機。這台 Mac 裡頭用的是 Broadcom 的 BCM4360 無線網卡,而好死不死 Linux 核心內建的 brcmsmac 不支援這麼舊的卡,所以只得使用 Broadcom 自己釋出的「wl」驅動程式。問題是,Broadcom 在 2015 就已經停止 wl 的維護,因此後續都得靠社群提供補丁,讓驅動程式得以繼續運作。目前補丁數量已經高達 22 個。

我使用的發行版 Slackware 沒有內建 wl 驅動程式,社群套件庫 SBo 上的套件又有缺補丁,所以我只得自己編譯更新套件。每次 Linux 核心有更新,我就得重新編譯一次。

wl 一直都讓我蠻頭痛的,之前也發生過 wl 讓待命回復變很慢 的事情,但似乎在某個核心版本(6.18?)之後有好轉。但另外搜不到 5GHz、換連線慢這幾點就無解。

問題

這次的問題是,核心更新到 7.1 之後,只有第一次開機完可以使用 Wi-Fi,在後續待命回復後,就沒法使用了,會一直卡在「尋找 Wi-Fi 中」,必須重新開機才能使用 Wi-Fi。

這樣怎麼辦?原本想說再等個幾天看看會不會有新補丁(因為我實在看不懂驅動程式原始碼……),結果過了一個月,什麼都沒有。好吧,自己來排查問題。

排查

第一站是 dmesg。左看右看,看到相關的只有:

[  695.383999] You are using the broadcom-wl driver, which is not maintained and is incompatible with Linux kernel security mitigations. It is heavily recommended to replace the hardware and remove the driver. Proceed at your own risk!
[  695.424237] eth0: Broadcom BCM43a0 802.11 Hybrid Wireless Controller 6.30.223.271 (r587334)

待命前有另一個相關的 call trace,不過看起來只是卸載非開源 kernel module 時會有的訊息。

訊息
[ 1563.785120] memcpy: detected field-spanning write (size 212) of single field "dst" at src/wl/sys/wl_cfg80211_hybrid.c:3139 (size 0)
[ 1563.785124] WARNING: src/wl/sys/wl_cfg80211_hybrid.c:3139 at wl_inform_single_bss+0x295/0x3e0 [wl], CPU#4: wl_event_handle/10243
[ 1563.785237] Modules linked in: wl(PO) cfg80211 rfcomm snd_seq_dummy snd_hrtimer snd_seq snd_seq_device fuse 8021q garp mrp stp llc sch_fq qrtr algif_hash algif_skcipher af_alg bnep zram snd_hda_codec_intelhdmi snd_hda_codec_hdmi intel_rapl_msr intel_rapl_common x86_pkg_temp_thermal intel_powerclamp btusb coretemp btmtk btrtl btbcm snd_hda_codec_cs420x kvm_intel btintel joydev mei_pxp snd_hda_codec_generic mei_hdcp snd_hda_intel applesmc i915 snd_hda_codec kvm drm_buddy bluetooth irqbypass snd_hda_core hid_apple ttm uas bcm5974 rapl snd_intel_dspcfg i2c_algo_bit drm_client_lib snd_intel_sdw_acpi apple_mfi_fastcharge i2c_i801 tpm_tis snd_hwdep intel_cstate mei_me lpc_ich drm_display_helper i2c_smbus tpm_tis_core snd_pcm evdev mei i2c_mux mfd_core thunderbolt snd_timer cec sbs acpi_als rc_core snd industrialio_triggered_buffer kfifo_buf sbshc drm_kms_helper soundcore industrialio apple_gmux loop dm_snapshot dm_bufio hid_multitouch hid_microsoft hid_lenovo hid_logitech_hidpp hid_logitech_dj hid_logitech hid_cherry
[ 1563.785331]  hid_asus asus_wmi sparse_keymap rfkill video wmi hid_generic i2c_hid drm usbhid hid uhci_hcd ohci_pci ehci_pci ohci_hcd ehci_hcd xhci_pci xhci_hcd usb_storage
[ 1563.785350] Unloaded tainted modules: wl(PO):1 [last unloaded: cfg80211]
[ 1563.785358] CPU: 4 UID: 0 PID: 10243 Comm: wl_event_handle Tainted: P        W  O        7.2.0 #1 PREEMPT(lazy)
[ 1563.785364] Tainted: [P]=PROPRIETARY_MODULE, [W]=WARN, [O]=OOT_MODULE
[ 1563.785366] Hardware name: Apple Inc. MacBookPro11,2/Mac-3CBD00234E554E41, BIOS 431.0.0.0.0 02/22/2021
[ 1563.785368] RIP: 0010:__WARN_trap+0x0/0x20
[ 1563.785374] Code: cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc c3 cc cc cc cc 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 <67> 48 0f b9 3a c3 cc cc cc cc 66 0f 1f 44 00 00 90 90 90 90 90 90
[ 1563.785377] RSP: 0018:ffffd3388dbcfdb0 EFLAGS: 00010246
[ 1563.785381] RAX: ffff8db90103b02c RBX: ffff8db994bf400c RCX: 0000000000000000
[ 1563.785384] RDX: ffffffffc129dd00 RSI: 00000000000000d4 RDI: ffffffffc0e011a0
[ 1563.785386] RBP: ffff8db90103b000 R08: 56206f7669760800 R09: 968b848204013033
[ 1563.785388] R10: 0401303356206f76 R11: 07010103968b8482 R12: 00000000000000d4
[ 1563.785390] R13: ffff8db994bf4014 R14: 00000000000000d4 R15: ffff8db90749c9c0
[ 1563.785392] FS:  0000000000000000(0000) GS:ffff8dbcd1fe9000(0000) knlGS:0000000000000000
[ 1563.785395] CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
[ 1563.785398] CR2: 00007f26020a9014 CR3: 000000021b434004 CR4: 00000000001726f0
[ 1563.785400] Call Trace:
[ 1563.785403]  <TASK>
[ 1563.785406]  wl_inform_single_bss+0x2a6/0x3e0 [wl]
[ 1563.785492]  ? warn_thunk_thunk+0x16/0x40
[ 1563.785499]  ? wl_notify_scan_status+0x12c/0x260 [wl]
[ 1563.785579]  ? __down_interruptible+0x26/0xd0
[ 1563.785584]  ? wl_event_handler+0x76/0x160 [wl]
[ 1563.785662]  ? wl_cfg80211_add_key+0x380/0x380 [wl]
[ 1563.785738]  ? kthread+0xdf/0x120
[ 1563.785742]  ? __pfx_kthread+0x10/0x10
[ 1563.785746]  ? ret_from_fork+0x19a/0x290
[ 1563.785754]  ? __pfx_kthread+0x10/0x10
[ 1563.785757]  ? ret_from_fork_asm+0x1a/0x30
[ 1563.785762]  </TASK>
[ 1563.785764] ---[ end trace 0000000000000000 ]---
[ 1898.535592] PM: suspend entry (deep)

看來問題在其他地方。

下一站是 Slackware 的 journald 替代品(或是說是 journald 的前身?):/var/log/syslog。一打開往上滑,就看到了錯誤:

Aug 28 14:24:47 dankstar NetworkManager[3220]: <warn>  [1787898287.1951] device (eth0): re-acquiring supplicant interface (#1).
Aug 28 14:24:47 dankstar NetworkManager[3220]: <error> [1787898287.1961] device (eth0): Couldn't initialize supplicant interface: GDBus.Error:fi.w1.wpa_supplicant1.UnknownError: wpa_supplicant couldn't grab this interface.
完整相關訊息
Aug 28 14:24:36 dankstar ModemManager[1320]: <wrn> [sleep-monitor-systemd] inhibit failed: GDBus.Error:org.freedesktop.login1.OperationInProgress: The operation inhibition has been requested for is already running
Aug 28 14:24:36 dankstar NetworkManager[3220]: <warn>  [1787898276.8221] power-monitor-el: inhibit: failed (GDBus.Error:org.freedesktop.login1.OperationInProgress: The operation inhibition has been requested for is already running)
Aug 28 14:24:36 dankstar kernel: You are using the broadcom-wl driver, which is not maintained and is incompatible with Linux kernel security mitigations. It is heavily recommended to replace the hardware and remove the driver. Proceed at your own risk!
Aug 28 14:24:36 dankstar kernel: eth0: Broadcom BCM43a0 802.11 Hybrid Wireless Controller 6.30.223.271 (r587334)
Aug 28 14:24:36 dankstar kernel:
Aug 28 14:24:36 dankstar (sd-exec-[3213]: /lib64/elogind/system-sleep/52-bt failed with exit status 1, ignoring.
Aug 28 14:24:36 dankstar bluetoothd[3250]: Failed to set mode: Failed (0x03)
Aug 28 14:24:36 dankstar ModemManager[1320]: <wrn> [plugin-manager] task 1: port context already scheduled
Aug 28 14:24:36 dankstar NetworkManager[3220]: <warn>  [1787898276.9910] platform-linux: do-change-link[3]: failure 23 (Too many open files in system) (assume success changing address)
Aug 28 14:24:36 dankstar NetworkManager[3220]: <error> [1787898276.9930] device (eth0): Couldn't initialize supplicant interface: GDBus.Error:fi.w1.wpa_supplicant1.UnknownError: wpa_supplicant couldn't grab this interface.
Aug 28 14:24:38 dankstar bluetoothd[3250]: Failed to set mode: Failed (0x03)
Aug 28 14:24:47 dankstar NetworkManager[3220]: <warn>  [1787898287.1951] device (eth0): re-acquiring supplicant interface (#1).
Aug 28 14:24:47 dankstar NetworkManager[3220]: <error> [1787898287.1961] device (eth0): Couldn't initialize supplicant interface: GDBus.Error:fi.w1.wpa_supplicant1.UnknownError: wpa_supplicant couldn't grab this interface.
Aug 28 14:24:57 dankstar NetworkManager[3220]: <warn>  [1787898297.1951] device (eth0): re-acquiring supplicant interface (#2).
Aug 28 14:24:57 dankstar NetworkManager[3220]: <error> [1787898297.1961] device (eth0): Couldn't initialize supplicant interface: GDBus.Error:fi.w1.wpa_supplicant1.UnknownError: wpa_supplicant couldn't grab this interface.
Aug 28 14:25:07 dankstar NetworkManager[3220]: <warn>  [1787898307.1951] device (eth0): re-acquiring supplicant interface (#3).
Aug 28 14:25:07 dankstar NetworkManager[3220]: <error> [1787898307.1960] device (eth0): Couldn't initialize supplicant interface: GDBus.Error:fi.w1.wpa_supplicant1.UnknownError: wpa_supplicant couldn't grab this interface.
Aug 28 14:25:17 dankstar NetworkManager[3220]: <warn>  [1787898317.1950] device (eth0): re-acquiring supplicant interface (#4).
Aug 28 14:25:17 dankstar NetworkManager[3220]: <error> [1787898317.1960] device (eth0): Couldn't initialize supplicant interface: GDBus.Error:fi.w1.wpa_supplicant1.UnknownError: wpa_supplicant couldn't grab this interface.
Aug 28 14:25:27 dankstar NetworkManager[3220]: <warn>  [1787898327.1950] device (eth0): re-acquiring supplicant interface (#5).
Aug 28 14:25:27 dankstar NetworkManager[3220]: <error> [1787898327.1960] device (eth0): Couldn't initialize supplicant interface: GDBus.Error:fi.w1.wpa_supplicant1.UnknownError: wpa_supplicant couldn't grab this interface.
Aug 28 14:28:44 dankstar NetworkManager[3220]: <warn>  [1787898524.0058] platform-linux: do-change-link[3]: failure 23 (Too many open files in system) (assume success changing address)
Aug 28 14:28:50 dankstar NetworkManager[3435]: <warn>  [1787898530.0666] platform-linux: do-change-link[3]: failure 23 (系統中太��M-^Z�M-^ZM-^D�M-^VM-^K�M-^UM-^_��M-^T��M-^H) (assume success changing address)
Aug 28 14:28:50 dankstar NetworkManager[3435]: <error> [1787898530.0709] device (eth0): Couldn't initialize supplicant interface: GDBus.Error:fi.w1.wpa_supplicant1.UnknownError: wpa_supplicant couldn't grab this interface.
Aug 28 14:29:00 dankstar NetworkManager[3435]: <warn>  [1787898540.5582] device (eth0): re-acquiring supplicant interface (#1).
Aug 28 14:29:00 dankstar NetworkManager[3435]: <error> [1787898540.5590] device (eth0): Couldn't initialize supplicant interface: GDBus.Error:fi.w1.wpa_supplicant1.UnknownError: wpa_supplicant couldn't grab this interface.
Aug 28 14:29:09 dankstar NetworkManager[3435]: <error> [1787898549.6122] device (eth0): Couldn't initialize supplicant interface: GDBus.Error:fi.w1.wpa_supplicant1.UnknownError: wpa_supplicant couldn't grab this interface.
Aug 28 14:29:18 dankstar NetworkManager[3435]: <warn>  [1787898558.8918] platform-linux: do-change-link[3]: failure 23 (系統中太��M-^Z�M-^ZM-^D�M-^VM-^K�M-^UM-^_��M-^T��M-^H) (assume success changing address)
Aug 28 14:30:50 dankstar kernel: You are using the broadcom-wl driver, which is not maintained and is incompatible with Linux kernel security mitigations. It is heavily recommended to replace the hardware and remove the driver. Proceed at your own risk!
Aug 28 14:30:50 dankstar kernel: eth0: Broadcom BCM43a0 802.11 Hybrid Wireless Controller 6.30.223.271 (r587334)
Aug 28 14:30:50 dankstar kernel:
Aug 28 14:30:50 dankstar NetworkManager[3575]: <warn>  [1787898650.8507] platform-linux: do-change-link[4]: failure 23 (系統中太��M-^Z�M-^ZM-^D�M-^VM-^K�M-^UM-^_��M-^T��M-^H) (assume success changing address)
Aug 28 14:30:50 dankstar NetworkManager[3575]: <error> [1787898650.8529] device (eth0): Couldn't initialize supplicant interface: GDBus.Error:fi.w1.wpa_supplicant1.UnknownError: wpa_supplicant couldn't grab this interface.
Aug 28 14:31:01 dankstar NetworkManager[3575]: <warn>  [1787898661.5580] device (eth0): re-acquiring supplicant interface (#1).
Aug 28 14:31:01 dankstar NetworkManager[3575]: <error> [1787898661.5589] device (eth0): Couldn't initialize supplicant interface: GDBus.Error:fi.w1.wpa_supplicant1.UnknownError: wpa_supplicant couldn't grab this interface.
Aug 28 14:31:11 dankstar NetworkManager[3575]: <warn>  [1787898671.5580] device (eth0): re-acquiring supplicant interface (#2).
Aug 28 14:31:11 dankstar NetworkManager[3575]: <error> [1787898671.5591] device (eth0): Couldn't initialize supplicant interface: GDBus.Error:fi.w1.wpa_supplicant1.UnknownError: wpa_supplicant couldn't grab this interface.
Aug 28 14:31:21 dankstar NetworkManager[3575]: <warn>  [1787898681.5580] device (eth0): re-acquiring supplicant interface (#3).
Aug 28 14:31:21 dankstar NetworkManager[3575]: <error> [1787898681.5590] device (eth0): Couldn't initialize supplicant interface: GDBus.Error:fi.w1.wpa_supplicant1.UnknownError: wpa_supplicant couldn't grab this interface.
Aug 28 14:31:31 dankstar NetworkManager[3575]: <warn>  [1787898691.5580] device (eth0): re-acquiring supplicant interface (#4).
Aug 28 14:31:31 dankstar NetworkManager[3575]: <error> [1787898691.5591] device (eth0): Couldn't initialize supplicant interface: GDBus.Error:fi.w1.wpa_supplicant1.UnknownError: wpa_supplicant couldn't grab this interface.
Aug 28 14:31:41 dankstar NetworkManager[3575]: <warn>  [1787898701.5580] device (eth0): re-acquiring supplicant interface (#5).
Aug 28 14:31:41 dankstar NetworkManager[3575]: <error> [1787898701.5591] device (eth0): Couldn't initialize supplicant interface: GDBus.Error:fi.w1.wpa_supplicant1.UnknownError: wpa_supplicant couldn't grab this interface.
Aug 28 14:33:56 dankstar avahi-daemon[1268]: Disconnected from D-Bus, exiting.
Aug 28 14:33:56 dankstar ModemManager[1320]: <wrn> could not acquire the 'org.freedesktop.ModemManager1' service name

如此的訊息重複五次,NetworkManager 就放棄了。

重開 NetworkManager 沒有用,重新裝載 wl 驅動程式無果,難道是 wpa_supplicant?

htop 處理掉 wpa_supplicant,重開之後,發現果然 Wi-Fi 可以用了。

解方

Slackware 是用 elogind 取代 systemd-logind,而配置文件在 /lib64/elogind/system-sleep/ 裡頭以 shell 指令稿方式撰寫而成。原本我在裡面就寫了些指令稿,其中一個是卸載、裝載 wl 的,名為 51-wl

#!/bin/sh
case "${1-}" in
    'pre')
        exec modprobe -r wl
        ;;

    'post')
        exec modprobe wl
        ;;

    *)
        exit 64
        ;;
esac

多試了幾次,解方有兩個。一個是把 51-wl 取消執行權:

chmod -x 51-wl

另一個是把處理掉 wpa_supplicant 的指令加到 post:

#!/bin/sh
case "${1-}" in
    'pre')
        exec modprobe -r wl
        ;;

    'post')
        modprobe wl
        killall wpa_supplicant
        ;;

    *)
        exit 64
        ;;
esac

之前也是因為待命問題加入 51-wl 的,目前是用第一個方法,但還是得留個後路。還好很偶爾才需要折騰一下下。

– ltlnx 2026-08-28

分類:slackware

標籤:待命macbook技術筆記

留言關於留言隱私權

如果想讓我知道您看過這個頁面,請點擊這個連結運作原理