O problema
Eu tenho usado com sucesso um adaptador sem fio Broadcom 4352 no CentOS 7, usando estas instruções sobre como compilar o Broadcom Driver STA para Linux no wiki do CentOS .
Desde que a atualização do kernel para 3.10.0-693 (que eu acho que é 7.4?) foi lançada, eu posso compilar o driver, mas não consigo fazê-lo funcionar. Após a instalação, ele congela o sistema:
[root]# depmod $(uname -r)
[root]# sudo modprobe wl
[root]#
Depois disso, a entrada do mouse funcionou por alguns segundos, então tudo congelou: o relógio não mudou, o sistema parou de aceitar entrada de qualquer tipo, teve que puxar a energia.
O arquivo wl.ko está aqui:
$ ls -alZ /lib/modules/3.10.0-693.21.1.el7.x86_64/extra/wl.ko
-rw-r--r--. root root unconfined_u:object_r:modules_object_t:s0 /lib/modules/3.10.0-693.21.1.el7.x86_64/extra/wl.ko
A reinicialização também não traz o adaptador, mas o sistema não congela; parece apenas agir como se não existisse. Se eu posteriormente abrir um terminal e emitir o comando modprobe wl
, ele congela conforme descrito acima.
Não sabendo mais o que fazer, tentei isso por diversão:
insmod /lib/modules/'uname -r'/extra/wl.ko
O que também congelou o sistema imediatamente.
Eu não vi nada em /var/log/messages
desses eventos de congelamento - não há quase nada no log desses horários, embora eu não saiba exatamente o que estou procurando.
Se eu reverter para o kernel anterior (3.10.0-514), para o qual o driver foi instalado de maneira semelhante, posso usar meu wireless. Existe uma forma RPM-fonte para instalar o driver aqui , mas eu prefiro este simples método de compilar o seu próprio e aprecio dicas de como depurar isso.
Devo fazer algo como strace modprobe wl > /tmp/modprobe_log
?
Como eu instalei o driver
Isso pode ser redundante, mas as instruções na página wiki do CentOS estão fora de controle (elas precisam de seções separadas para cada liberação ponto IMO), então para esclarecer o que eu fiz e possivelmente ajudar alguma outra alma infeliz, aqui está o que eu entenda que eles recomendam para kernels 7.4:
yum install kernel-devel kernel-headers gcc
tar xzf hybrid-v35_64-nodebug-pcoem-6_30_223_271.tar.gz
patch -p1 < wl-kmod-fix-ioctl-handling.patch
patch -p1 < wl-kmod-kernel_4.7_IEEE80211_BAND_to_NL80211_BAND.patch
sed -i 's/ >= KERNEL_VERSION(3, 11, 0)/ >= KERNEL_VERSION(3, 10, 0)/' src/wl/sys/wl_cfg80211_hybrid.c
sed -i 's/ >= KERNEL_VERSION(3, 15, 0)/ >= KERNEL_VERSION(3, 10, 0)/' src/wl/sys/wl_cfg80211_hybrid.c
sed -i 's/ < KERNEL_VERSION(3, 18, 0)/ < KERNEL_VERSION(3, 9, 0)/' src/wl/sys/wl_cfg80211_hybrid.c
sed -i 's/ >= KERNEL_VERSION(4, 0, 0)/ >= KERNEL_VERSION(3, 10, 0)/' src/wl/sys/wl_cfg80211_hybrid.c
sed -i 's/ < KERNEL_VERSION(4,2,0)/ < KERNEL_VERSION(3, 9, 0)/' src/wl/sys/wl_cfg80211_hybrid.c
sed -i 's/ >= KERNEL_VERSION(4, 7, 0)/ >= KERNEL_VERSION(3, 10, 0)/' src/wl/sys/wl_cfg80211_hybrid.c
make -C /lib/modules/'uname -r'/build/ M='pwd'
strip --strip-debug wl.ko
cp -vi wl.ko /lib/modules/'uname -r'/extra/
Criar arquivo /etc/modprobe.d/blacklist.conf
:
blacklist bcm43xx
blacklist b43
blacklist b43legacy
blacklist bcma
blacklist brcmsmac
blacklist ssb
blacklist ndiswrapper
Criar arquivo /etc/sysconfig/modules/kmod-wl.modules
#!/bin/bash
for M in lib80211 cfg80211 wl; do
modprobe $M &>/dev/null
done
chown root:root /etc/sysconfig/modules/kmod-wl.modules
chmod 744 /etc/sysconfig/modules/kmod-wl.modules
Ah, e parece que a Broadcom mudou em torno da localização do driver STA. Ele não foi atualizado em alguns anos, então usei o que já tenho, mas acho que pode ser baixado aqui . Os patches podem ser baixados da página wiki do CentOS acima.
Caso veja a saída de patch e compilação seja útil, aqui está:
$ patch -p1 < wl-kmod-fix-ioctl-handling.patch
patching file src/wl/sys/wl_cfg80211_hybrid.c
Hunk #1 succeeded at 1467 (offset 17 lines).
patching file src/wl/sys/wl_linux.c
Hunk #1 succeeded at 1659 (offset 8 lines).
$ patch -p1 < wl-kmod-kernel_4.7_IEEE80211_BAND_to_NL80211_BAND.patch
patching file src/wl/sys/wl_cfg80211_hybrid.c
Hunk #6 succeeded at 1911 (offset 3 lines).
Hunk #7 succeeded at 2040 (offset 3 lines).
Hunk #8 succeeded at 2160 (offset 3 lines).
Hunk #9 succeeded at 2298 (offset 3 lines).
Hunk #10 succeeded at 2941 (offset 3 lines).
<sed commands ran with no errors>
$ make -C /lib/modules/'uname -r'/build/ M='pwd'
make: Entering directory '/usr/src/kernels/3.10.0-693.21.1.el7.x86_64'
CFG80211 API is prefered for this kernel version
Using CFG80211 API
LD /usr/local/src/hybrid-wl/built-in.o
CC [M] /usr/local/src/hybrid-wl/src/shared/linux_osl.o
CC [M] /usr/local/src/hybrid-wl/src/wl/sys/wl_linux.o
CC [M] /usr/local/src/hybrid-wl/src/wl/sys/wl_iw.o
CC [M] /usr/local/src/hybrid-wl/src/wl/sys/wl_cfg80211_hybrid.o
/usr/local/src/hybrid-wl/src/wl/sys/wl_cfg80211_hybrid.c:1834:2: warning: initialization from incompatible pointer type [enabled by default]
.get_station = wl_cfg80211_get_station,
^
/usr/local/src/hybrid-wl/src/wl/sys/wl_cfg80211_hybrid.c:1834:2: warning: (near initialization for ‘wl_cfg80211_ops.get_station’) [enabled by default]
/usr/local/src/hybrid-wl/src/wl/sys/wl_cfg80211_hybrid.c: In function ‘wl_bss_connect_done’:
/usr/local/src/hybrid-wl/src/wl/sys/wl_cfg80211_hybrid.c:2446:3: warning: passing argument 2 of ‘cfg80211_scan_done’ makes pointer from integer without a cast [enabled by default]
cfg80211_scan_done(wl->scan_request, true);
^
In file included from /usr/local/src/hybrid-wl/src/wl/sys/wl_cfg80211_hybrid.c:33:0:
include/net/cfg80211.h:4496:6: note: expected ‘struct cfg80211_scan_info *’ but argument is of type ‘int’
void cfg80211_scan_done(struct cfg80211_scan_request *request,
^
/usr/local/src/hybrid-wl/src/wl/sys/wl_cfg80211_hybrid.c: In function ‘wl_cfg80211_down’:
/usr/local/src/hybrid-wl/src/wl/sys/wl_cfg80211_hybrid.c:2976:3: warning: passing argument 2 of ‘cfg80211_scan_done’ makes pointer from integer without a cast [enabled by default]
cfg80211_scan_done(wl->scan_request, true);
^
In file included from /usr/local/src/hybrid-wl/src/wl/sys/wl_cfg80211_hybrid.c:33:0:
include/net/cfg80211.h:4496:6: note: expected ‘struct cfg80211_scan_info *’ but argument is of type ‘int’
void cfg80211_scan_done(struct cfg80211_scan_request *request,
^
LD [M] /usr/local/src/hybrid-wl/wl.o
Building modules, stage 2.
CFG80211 API is prefered for this kernel version
Using CFG80211 API
MODPOST 1 modules
CC /usr/local/src/hybrid-wl/wl.mod.o
LD [M] /usr/local/src/hybrid-wl/wl.ko
make: Leaving directory '/usr/src/kernels/3.10.0-693.21.1.el7.x86_64'