Firmware Broadcom para WiFi en Debian
Publicado el 8 de septiembre de 2011Hace poco tuve un pequeño incidente con el firmware de la tarjeta inalámbrica en mi laptop con Debian: dagobah. Mi tarjeta wireless es:
El problema que tuve fue tras una actualización del sistema. Estaba conectado a Internet a través de una red inalámbrica (metodología conocida como “pillar WiFi del vecino”) y procedí a actualizar el sistema.
Durante el apt-get upgrade, se actualizó el paquete firmware-b43-installer. Este paquete instala el firmware necesario para usar el driver del kernel b43 para los chipsets BCM4306/3 – BCM4311 – BCM4318 – BCM4321 – BCM4322.
Lo que hace este paquete tras actualizarse es descargar una versión nueva del firmware. Durante la actualización, perdí la conexión inalámbrica. Los paquetes ya se habían descargado, pero durante su posterior instalación, el paquete instalador no pudo descargar los nuevos archivos de firmware. Apagué mi computadora y decidí volver a intentar la actualización en otro momento.
Me encontré con la sorpresa al encender nuevamente la laptop de que ya no tenía el firmware. Algo estaba mal. Para encontrar la raíz del problema, supuse que podría empezar por el paquete .deb que no pudo concretar su instalación.
Revisé /var/cache/apt/archives donde se guarda el caché de paquetes descargados. Ahí encontré las dos versiones:
ls /var/cache/apt/archives/ | grep firmware -rw-r--r-- 1 root root 7340 Jun 2 05:47 firmware-b43-installer_1%3a014-4_all.deb -rw-r--r-- 1 root root 7892 Aug 3 16:32 firmware-b43-installer_1%3a014-9_all.deb |
Analicé el deb y me encontré con varios archivos comprimidos, y por ahí aprendí un poco de la estructura de los paquetes .deb. Para complementar y dar un marco teórico a lo que metí mano, de Wikipedia:
Los paquetes Debian son archivos ar estándar de Unix que incluyen dos archivos comprimidos: uno que contiene la información de control y otro que contiene los datos.
Dentro del archivo control.tar.gz
del .deb
, me encontré el script preinst, que por el nombre, deduje se ejecuta primero en el flujo de la instalación. Mirando el código me encontré con esto:
if [ -d /lib/firmware/b43 ]; then echo "Deleting old extracted firmware..." rm -rf /lib/firmware/b43 fi |
Después seguí mirando el postinst. En principio:
wget http://downloads.openwrt.org/sources/broadcom-wl-4.178.10.4.tar.bz2 tar xvjf broadcom-wl-4.178.10.4.tar.bz2 cd broadcom-wl-4.178.10.4/linux b43-fwcutter -w "$FIRMWARE_INSTALL_DIR" wl_apsta.o cd $tmp rm -rf broadcom-wl-4.178.10.4 broadcom-wl-4.178.10.4.tar.bz2 } |
Y luego de un poco de código de control de versiones de firmware, versiones del kernel, proxy y demás, lo siguiente:
wget http://downloads.openwrt.org/sources/broadcom-wl-4.150.10.5.tar.bz2 tar xjvf broadcom-wl-4.150.10.5.tar.bz2 cd broadcom-wl-4.150.10.5/driver b43-fwcutter -w "$FIRMWARE_INSTALL_DIR" wl_apsta_mimo.o cd $tmp rm -rf broadcom-wl-4.150.10.5.tar.bz2 broadcom-wl-4.150.10.5 |
El paquete instala el firmware en el directorio /lib/firmware/b43
. El error estaba en que el postinst, el script que se ejecuta al iniciar, elimina todos los archivos de firmware antiguos para dar lugar a los nuevos. Al haber perdido la conexión el postinst no pudo descargar el nuevo firmware, pero el antiguo ya había sido borrado, quedándome sin firmware para mi tarjeta de red inalámbrica.
Para solucionarlo, pensé “¿Qué haría McGyver?” y procedí a descargar el firmware en el teléfono móvil de mi padre (contaba con la suerte de que tuviera 3G) con las URLs que usa el script postinst. Luego pasé los archivos a mi computadora y seguí los pasos del postinst a mano: descomprimí y ejecuté b43-fwcutter
para instalar el firmware nuevo (básicamente creo que solo descomprime los archivos .so en /lib/firmware/b43). Y listo, mi tarjeta quedó funcionando nuevamente y pude volver a conectarme 🙂
Pero la cosa no quedó ahí. Instalé el paquete reportbug, y reporté que el script de preinst eliminaba el firmware antiguo sin tener certeza de que el nuevo vaya a ser instalado. El bug fue el #638668 y quedó corregido 6 días después de haberlo reportado. Es así en el changelog quedó:
Changes: b43-fwcutter (1:015-1) unstable; urgency=low (...) * Removed preinst scripts. The code is moved to postinst scripts. In this way removing of /lib/firmware/b43* directories is only possibile if the firmware was downloaded correctly. (Closes: #638668)
Y ese fue mi aporte al querido sistema Debian durante las vacaciones 😀
dklight 8 septiembre. 2011 - 18:18
Jaja. Estoe s como cortar la rama del árbol en la que estás parado…
Fernando 8 septiembre. 2011 - 23:44
Jajaja, sí, sí, tal cual. Con suerte no le va a pasar a otros si instalan la versión corregida 😀
guerremdq 9 septiembre. 2011 - 14:15
En debian esta el paquete broadcom-sta lo instalas y despues con module-assistant lo compilas y se instala.
Es mas facil 😉
Juan Martin Cabello 12 febrero. 2015 - 18:35
Hola, a mi me paso algo muy parecido pero mi tarjeta es una:
07:00.0 Network controller: Broadcom Corporation BCM43142 802.11b/g/n (rev 01)
de donde puedo sacar el firmware? con los paquetes broadcom-sta y module-assistant será suficiente, alguien que me pueda dar una mano, sera muy agradecida