El Wifi de la Raspberry 3b+ se desconecta

Hoy vamos a ver un error bastante extraño que puede llegar a provocar que el Wifi de la Raspberry 3b+ se desconecte.

Lo que ocurre es que el Wifi se desconecta, y si nos conectamos a la Raspberry e investigamos el archivo /var/log/messages y buscamos errores, encontramos lo siguiente:

Direct firmware load for brcm/brcmfmac43455-sdio.raspberrypi,3-model-b-plus.txt failed with error -2

Por cierto, aquí tenemos una relación de códigos de error en Linux y sus significados. En este caso se trata de un error -2, que significa que el fichero no existe.

Parece ser que es un error relacionado con el firmware del wifi, y es que si buscamos con atención en los registros de la Raspberry, encontramos:

root@raspberry:/lib/firmware/brcm# dmesg | grep -e brcm -e sdio
[ 22.177961] brcmfmac: F1 signature read @0x18000000=0x15264345
[ 22.196439] brcmfmac: brcmf_fw_alloc_request: using brcm/brcmfmac43455-sdio for chip BCM4345/6
[ 22.198957] usbcore: registered new interface driver brcmfmac
[ 22.229094] brcmfmac mmc1:0001:1: Direct firmware load for brcm/brcmfmac43455-sdio.raspberrypi,3-model-b-plus.txt failed with error -2
[ 22.454917] brcmfmac: brcmf_fw_alloc_request: using brcm/brcmfmac43455-sdio for chip BCM4345/6
[ 22.468709] brcmfmac: brcmf_c_preinit_dcmds: Firmware: BCM4345/6 wl0: Feb 27 2018 03:15:32 version 7.45.154 (r684107 CY) FWID 01-4fbe0b04
[ 26.127686] brcmfmac: brcmf_cfg80211_set_power_mgmt: power save disabled

Investigando un poco, encontramos que el firmware para el Wifi de la Raspberry se encuentra en /lib/firmware/brcm
Así que vamos a ver qué ficheros tenemos ahí:

root@raspberry:/lib/firmware/brcm# ls -la
total 12776
drwxr-xr-x 2 root root 4096 jul 26 01:25 .
drwxr-xr-x 31 root root 12288 abr 29 2019 ..
-rw-r--r-- 1 root root 96224 ago 20 2018 bcm43xx-0.fw
-rw-r--r-- 1 root root 180 ago 20 2018 bcm43xx_hdr-0.fw
-rw-r--r-- 1 root root 397312 ago 20 2018 brcmfmac43143.bin
-rw-r--r-- 1 root root 385067 ago 20 2018 brcmfmac43143-sdio.bin
-rw-r--r-- 1 root root 348160 ago 20 2018 brcmfmac43236b.bin
-rw-r--r-- 1 root root 455745 ago 20 2018 brcmfmac43241b0-sdio.bin
-rw-r--r-- 1 root root 403855 ago 20 2018 brcmfmac43241b4-sdio.bin
-rw-r--r-- 1 root root 408682 ago 20 2018 brcmfmac43241b5-sdio.bin
-rw-r--r-- 1 root root 479232 ago 20 2018 brcmfmac43242a.bin
-rw-r--r-- 1 root root 253748 ago 20 2018 brcmfmac4329-sdio.bin
-rw-r--r-- 1 root root 222126 ago 20 2018 brcmfmac4330-sdio.bin
-rw-r--r-- 1 root root 397378 ago 20 2018 brcmfmac43340-sdio.bin
-rw-r--r-- 1 root root 451566 ago 20 2018 brcmfmac4334-sdio.bin
-rw-r--r-- 1 root root 569291 ago 20 2018 brcmfmac4335-sdio.bin
-rw-r--r-- 1 root root 219557 ago 20 2018 brcmfmac43362-sdio.bin
-rw-r--r-- 1 root root 493599 ago 20 2018 brcmfmac4339-sdio.bin
-rw-r--r-- 1 root root 388739 ago 20 2018 brcmfmac43430-sdio.bin
-rw-r--r-- 1 root root 1121 ago 20 2018 brcmfmac43430-sdio.txt
-rw-r--r-- 1 root root 600487 ago 20 2018 brcmfmac43455-sdio.bin
-rw-r--r-- 1 root root 14036 ago 20 2018 brcmfmac43455-sdio.clm_blob
-rw-r--r-- 1 root root 2054 ago 20 2018 brcmfmac43455-sdio.txt
-rw-r--r-- 1 root root 623304 ago 20 2018 brcmfmac4350c2-pcie.bin
-rw-r--r-- 1 root root 626140 ago 20 2018 brcmfmac4350-pcie.bin
-rw-r--r-- 1 root root 591837 ago 20 2018 brcmfmac4354-sdio.bin
-rw-r--r-- 1 root root 557056 ago 20 2018 brcmfmac43569.bin
-rw-r--r-- 1 root root 623012 ago 20 2018 brcmfmac4356-pcie.bin
-rw-r--r-- 1 root root 550333 ago 20 2018 brcmfmac43570-pcie.bin
-rw-r--r-- 1 root root 595472 ago 20 2018 brcmfmac43602-pcie.ap.bin
-rw-r--r-- 1 root root 635449 ago 20 2018 brcmfmac43602-pcie.bin
-rw-r--r-- 1 root root 989401 ago 20 2018 brcmfmac4366b-pcie.bin
-rw-r--r-- 1 root root 623448 ago 20 2018 brcmfmac4371-pcie.bin

Vaya, parece que sí que existe el fichero “brcmfmac43455-sdio.bin“, y “brcmfmac43455-sdio.txt“, pero no el fichero “brcmfmac43455-sdio.raspberrypi,3-model-b- plus.txt” que aparece en el log que veíamos más arriba.


Listamos el directorio buscando el archivo mencionado, pero lo dicho, no existe …  :

root@raspberry:/lib/firmware/brcm# ls brcmfmac43455-sdio.raspberrypi,3-model-b- plus.txt

Como info adicional bastante interesante, para asegurarnos de que los módulos wifi de la Raspberry están cargados, ejecutamos:

root@raspberry:/lib/firmware/brcm# modinfo -k $(uname -r) brcmfmac
filename: /lib/modules/5.4.51-v7+/kernel/drivers/net/wireless/broadcom/brc m80211/brcmfmac/brcmfmac.ko
license: Dual BSD/GPL
description: Broadcom 802.11 wireless LAN fullmac driver.
author: Broadcom Corporation
firmware: brcm/brcmfmac43012-sdio.bin
firmware: brcm/brcmfmac4373-sdio.bin
firmware: brcm/brcmfmac4356-sdio.bin
firmware: brcm/brcmfmac4354-sdio.bin
firmware: brcm/brcmfmac43456-sdio.bin
firmware: brcm/brcmfmac43455-sdio.bin
firmware: brcm/brcmfmac43436-sdio.bin
firmware: brcm/brcmfmac43430-sdio.bin
firmware: brcm/brcmfmac43430a0-sdio.bin
firmware: brcm/brcmfmac4339-sdio.bin
firmware: brcm/brcmfmac43362-sdio.bin
firmware: brcm/brcmfmac4335-sdio.bin
firmware: brcm/brcmfmac43341-sdio.bin
firmware: brcm/brcmfmac43340-sdio.bin
firmware: brcm/brcmfmac4334-sdio.bin
firmware: brcm/brcmfmac4330-sdio.bin
firmware: brcm/brcmfmac4329-sdio.bin
firmware: brcm/brcmfmac43241b5-sdio.bin
firmware: brcm/brcmfmac43241b4-sdio.bin
firmware: brcm/brcmfmac43241b0-sdio.bin
firmware: brcm/brcmfmac43143-sdio.bin
firmware: brcm/brcmfmac4373.bin
firmware: brcm/brcmfmac43569.bin
firmware: brcm/brcmfmac43242a.bin
firmware: brcm/brcmfmac43236b.bin
firmware: brcm/brcmfmac43143.bin
srcversion: 75C506AB557789F78EF1636
alias: usb:v04B4p0BDCd*dc*dsc*dp*ic*isc*ip*in*
alias: usb:v0A5Cp0BDCd*dc*dsc*dp*ic*isc*ip*in*
alias: usb:v043Ep3101d*dc*dsc*dp*ic*isc*ip*in*
alias: usb:v04B4pBD29d*dc*dsc*dp*ic*isc*ip*in*
alias: usb:v13B1p0039d*dc*dsc*dp*ic*isc*ip*in*
alias: usb:v0A5CpBD27d*dc*dsc*dp*ic*isc*ip*in*
alias: usb:v0A5CpBD1Fd*dc*dsc*dp*ic*isc*ip*in*
alias: usb:v0A5CpBD17d*dc*dsc*dp*ic*isc*ip*in*
alias: usb:v0A5CpBD1Ed*dc*dsc*dp*ic*isc*ip*in*
alias: sdio:c*v02D0dA804*
alias: sdio:c*v02D0d4373*
alias: sdio:c*v02D0d4356*
alias: sdio:c*v02D0d4354*
alias: sdio:c*v02D0dA9BF*
alias: sdio:c*v02D0d4345*
alias: sdio:c*v02D0dA9A6*
alias: sdio:c*v02D0d4339*
alias: sdio:c*v02D0d4335*
alias: sdio:c*v02D0dA9A4*
alias: sdio:c*v02D0dA962*
alias: sdio:c*v02D0dA94D*
alias: sdio:c*v02D0dA94C*
alias: sdio:c*v02D0d4334*
alias: sdio:c*v02D0d4330*
alias: sdio:c*v02D0d4329*
alias: sdio:c*v02D0d4324*
alias: sdio:c*v02D0dA887*
depends: brcmutil,cfg80211
intree: Y
name: brcmfmac
vermagic: 5.4.51-v7+ SMP mod_unload modversions ARMv7 p2v8
parm: txglomsz:Maximum tx packet chain size [SDIO] (int)
parm: debug:Level of debug output (int)
parm: p2pon:Enable legacy p2p management functionality (int)
parm: feature_disable:Disable features (int)
parm: alternative_fw_path:Alternative firmware path (string)
parm: fcmode:Mode of firmware signalled flow control (int)
parm: roamoff:Do not use internal roaming engine (int)
parm: iapp:Enable partial support for the obsoleted Inter-Access Point Protocol (int)
parm: ignore_probe_fail:always succeed probe for debugging (int)

 

 

Solucionando el error

 

–> Opción 1: Opcional y arriesgado (solo si ya te has quedado sin opciones y ya tienes hecha una copia de seguridad de tu SD)

 

  • Actualizar paquetes del sistema, el kernel de la Raspberry, y el sistema operativo Raspbian.

 

*Lo primero siempre es hacer una copia de seguridad de la SD. En mi caso clono la tarjeta SD completa, con imageUSB

– Después, lo típico, actualizar los paquetes del sistema a la última versión:

sudo apt-get update && sudo apt-get upgrade && sudo reboot

 

– Actualizamos el kernel de la Raspberry:

rpi-update

– Y finalmente, si seguimos igual, actualizamos el sistema operativo:

sudo apt-get update && sudo apt-get -y dist-upgrade

 

–> Opción 2: Solución creativa del problema (la más efectiva)

En mi caso hice todo esto pero el problema seguía ahí. Igual. La Raspberry arrancaba, se conectaba al wifi, y al rato, si volvía a comprobar que estuviera conectada, ya no lo estaba .. de nuevo problemas con el wifi en la Raspberry ..

Hasta que encontré este artículo : No se encuentra el Wifi de la Raspberry Pi 3 B+

enlace simbolico brcmfmac43455
Y ahí se me iluminó la bombilla ..
Está claro que el fichero que contiene el firmware del wifi es brcmfmac43455-sdio.bin y brcmfmac43455-sdio.txt contiene su configuración.

Entonces, si ya tenemos el firmware para el wifi, vamos a hacer un “bypass” del problema: o copiamos el fichero correcto y lo llamamos brcmfmac43455-sdio.raspberrypi,3-model-b-plus.txt,

o hacemos un symlink y nos quedamos tan anchos…

Pues alla vamos:

Hacemos una copia del archivo .txt y lo renombramos con el nombre “brcmfmac43455-sdio.raspberrypi,3-model-b-plus.txt” :

root@raspberry:/lib/firmware/brcm# cp -p brcmfmac43455-sdio.txt brcmfmac43455-sdio.raspberrypi,3-model-b-plus.txt

—> o crear un enlace simbolico:

ln -s brcmfmac43455-sdio.txt brcmfmac43455-sdio.raspberrypi,3-model-b-plus.txt

 

Hecho esto, reiniciamos y comprobamos el log del arranque con DMESG. Como podemos ver ya no aparece el error :

root@raspberry:/home/pi# dmesg | grep -e brcm -e sdio
[ 22.243061] brcmfmac: F1 signature read @0x18000000=0x15264345
[ 22.253508] brcmfmac: brcmf_fw_alloc_request: using brcm/brcmfmac43455-sdio for chip BCM4345/6
[ 22.255374] usbcore: registered new interface driver brcmfmac
[ 22.533161] brcmfmac: brcmf_fw_alloc_request: using brcm/brcmfmac43455-sdio for chip BCM4345/6
[ 22.548970] brcmfmac: brcmf_c_preinit_dcmds: Firmware: BCM4345/6 wl0: Feb 27 2018 03:15:32 version 7.45.154 (r684107 CY) FWID 01-4fbe0b04
[ 26.192703] brcmfmac: brcmf_cfg80211_set_power_mgmt: power save disabled