Broadcom wl.ko congela o CentOS 7.4 (kernel 3.10.0-693) (driver sem fio Broadcom 4352)

1

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'
    
por myday 17.03.2018 / 23:04

2 respostas

0

Não tenho certeza, mas a Red Hat poderia mudar alguma coisa na nova versão do kernel, mesmo entre uma versão (em outra versão).

Eu tive alguns problemas quando atualizei de 7.2 para 7.3 (o lançamento do kernel ainda é um, mas o build é diferente): driver que nossa empresa desenvolveu não foi compilado (API foi alterada). Eu pergunto sobre isso ao rastreador de bugzilla da Red Hat e recebo esta resposta:

"Porque nós, como RedHat, apenas garantimos que a ABI permanece constante, não a API, e como tal, o mesmo acontece com os centos. Se você está compilando seu próprio módulo de árvore, você precisará acompanhar qualquer API alterações no kernel que você está compilando. Alternativamente, você pode ter seu código out of tree fundido com o kernel upstream, e esse trabalho será tratado em seu nome sempre que uma mudança na API for feita. "

Em outras palavras, se o módulo fora da árvore não for compilado ou não funcionar contra a nova liberação do kernel, então é tarefa do lado do cliente. Eu sei que a resposta foi sobre API, mas quem pode garantir outras mudanças.

Acho que alguns dos patches não são adotados para a nova compilação do kernel. Além disso, você pode postar essa pergunta no rastreador do Red Hat bugzilla . Eu não recomendo perguntar no Centos tracker, porque (em questões do kernel / módulo) eles provavelmente redirecionam para o rastreador da Red Hat.

Sobre a origem RPM (RPM-s) . Essa é a maneira mais preferida de manter seu ambiente limpo. Além disso, você pode adotar o código-fonte no pacote DKMS e não terá rotina com a criação de novos módulos para a versão recente do kernel.

    
por 17.03.2018 / 23:42
0

Tudo isso é seriamente uma versão ruim do kernel centos que diz seu 3.10 ou qualquer outra coisa, mas se comporta como o 4.15 às vezes.

Eu coloquei um repo no link que tem um driver wifi para a máquina centos 7.5 x64. Eu uso no meu laptop.

    
por 05.08.2018 / 03:25