Mi nombre es Fernando Briano y soy programador.

Firmware Broadcom para WiFi en Debian

Debian

Debian

Hace poco tuve un pequeño incidente con el firmware de la tarjeta inalámbrica en mi laptop con Debian: dagobah. Mi tarjeta wireless es:

0b:00.0 Network controller: Broadcom Corporation BCM4311 802.11b/g WLAN (rev 01)

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.

Wireless

Wireless

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 😀

Feed de comentarios | Url para Trackbacks | Suscribirse a los posts por correo electrónico

4 comentarios en este post

  1. Avatar dklight 8 septiembre. 2011 - 6:18 pm Firefox 5.0.1 GNU/Linux 64 bits

    Jaja. Estoe s como cortar la rama del árbol en la que estás parado…

  2. Avatar guerremdq 9 septiembre. 2011 - 2:15 pm Debian IceWeasel 6.0 GNU/Linux

    En debian esta el paquete broadcom-sta lo instalas y despues con module-assistant lo compilas y se instala.

    Es mas facil 😉

  3. Avatar Juan Martin Cabello 12 febrero. 2015 - 6:35 pm Firefox 35.0 GNU/Linux 64 bits

    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

    Dejar un comentario

    Toasty!