Pesadilla superada: tarjeta de red Broadcom BCM43142 en Ubuntu 16.04

por | julio 5, 2016

Tiene todos los ingredientes para una auténtica historia de terror… y efectivamente así fue. Afortunadamente con algo de paciencia e investigando un poco ahora escribo desde mi portátil con wifi sin problemas.

Aunque en mi caso el quebradero de cabeza me lo ha dado una tarjeta de red Broadcom BCM43142 y el por todos querido NetworkManager, en este artículo voy a proceder desde 0 para hacerlo lo más genérico posible y que pueda ayudar en otros casos. Cabe decir también que simplemente instalar el driver que aparece en la herramienta «Drivers Adicionales» de Ubuntu no me sirvió para tener una conexión wifi estable, razón por la cual escribo este artículo…

Detectar nuestra tarjeta

El primer paso como es obvio es detectar la tarjeta de red de nuestro ordenador. Por norma general estará conectada por PCI. Como estamos en Linux esto resulta muy fácil de ver con lspci:

jota@jota-ubuntu-netbook:~$ lspci
00:00.0 Host bridge: Intel Corporation Broadwell-U Host Bridge -OPI (rev 09)
00:02.0 VGA compatible controller: Intel Corporation Broadwell-U Integrated Graphics (rev 09)
00:03.0 Audio device: Intel Corporation Broadwell-U Audio Controller (rev 09)
00:04.0 Signal processing controller: Intel Corporation Broadwell-U Camarillo Device (rev 09)
00:14.0 USB controller: Intel Corporation Wildcat Point-LP USB xHCI Controller (rev 03)
00:16.0 Communication controller: Intel Corporation Wildcat Point-LP MEI Controller #1 (rev 03)
00:1b.0 Audio device: Intel Corporation Wildcat Point-LP High Definition Audio Controller (rev 03)
00:1c.0 PCI bridge: Intel Corporation Wildcat Point-LP PCI Express Root Port #1 (rev e3)
00:1c.2 PCI bridge: Intel Corporation Wildcat Point-LP PCI Express Root Port #3 (rev e3)
00:1c.3 PCI bridge: Intel Corporation Wildcat Point-LP PCI Express Root Port #4 (rev e3)
00:1c.4 PCI bridge: Intel Corporation Wildcat Point-LP PCI Express Root Port #5 (rev e3)
00:1f.0 ISA bridge: Intel Corporation Wildcat Point-LP LPC Controller (rev 03)
00:1f.2 SATA controller: Intel Corporation Wildcat Point-LP SATA Controller [AHCI Mode] (rev 03)
00:1f.3 SMBus: Intel Corporation Wildcat Point-LP SMBus Controller (rev 03)
00:1f.6 Signal processing controller: Intel Corporation Wildcat Point-LP Thermal Management Controller (rev 03)
02:00.0 Ethernet controller: Realtek Semiconductor Co., Ltd. RTL8111/8168/8411 PCI Express Gigabit Ethernet Controller (rev 10)
03:00.0 Network controller: Broadcom Corporation BCM43142 802.11b/g/n (rev 01)
04:00.0 3D controller: NVIDIA Corporation GF117M [GeForce 610M/710M/810M/820M / GT 620M/625M/630M/720M] (rev a1)

Y ahí está:

03:00.0 Network controller: Broadcom Corporation BCM43142 802.11b/g/n (rev 01)

Mi querida BCM43142.

Instalar el driver

NOTA: si anteriormente has instalado cualquier driver con la herramienta “Drivers Adicionales” de Ubuntu, procede a desinstalarlo. Ni cabe decir tampoco que para realizar las siguientes operaciones he conectado temporalmente el ordenador a la red cableada.

Una vez sabemos la tarjeta que tiene nuestro ordenador tenemos que instalar el driver. En mi caso y basándome en la documentación de Debian (que siempre me parece más fiable y para este caso en Ubuntu aplica igualmente) instalo el paquete broadcom-sta-dkms que a su vez va a automatizar la compilación del módulo para el kernel.Haciendo un apt-cache show broadcom-sta-dkms resuelvo mis dudas:

jota@jota-ubuntu-netbook:~$ apt-cache show broadcom-sta-dkms
...
Description-en: dkms source for the Broadcom STA Wireless driver
 Broadcom STA is a binary-only device driver to support the following IEEE
 802.11a/b/g/n wireless network cards: BCM4311-, BCM4312-, BCM4313-,
 BCM4321-, BCM4322-, BCM43142-, BCM43224-, BCM43225-, BCM43227-, BCM43228-,
 BCM4331-, BCM4360-, and BCM4352-based hardware.
 .
 This package provides the source code for the wl kernel modules and makes use
 of the DKMS build utility to install them for the running kernel. The
 alternative package broadcom-sta-source can be used instead in case of build
 problems.
 .
 The wireless-tools package is also required in order to make use of these
 modules. Kernel source or headers are required to compile these modules.
...

Visto lo anterior procedo a instalar el paquete correspondiente:

sudo apt-get install broadcom-sta-dkms

Si apt-get no encuentra el paquete broadcom-sta-dkms debemos revisar si tenemos los repositorios multiverse habilitados en Software y actualizaciones (Software & Updates). En caso negativo los habilitaremos:

Al cerrar la ventana deberíamos recibir un aviso para recargar los repositorios. Si no es así podemos hacerlo desde terminal con apt-get update. Después procederemos a instalar el paquete broadcom-sta-dkms como mostraba anteriormente con apt-get.

Toques finales: instalar wicd, deshabilitar NetworkManager y especificar CRDA

¿Qué puedo decir? No demasiadas cosas buenas respecto al uso y administración de conexiones wifi desde NetworkManager… Siendo sincero y hablando desde lo que he sufrido en carnes, al menos en el Ubuntu 16.04 que tengo en el portátil ha resultado ser bastante inestable: imposibilidad de reconectar con mi red sin reiniciar el proceso del daemon, cortes de conexión constantes y desaparición de redes disponibles… Investigando me dí cuenta de la cantidad de damnificados que hay, así que tomé el camino de en medio, deshabilitándolo y sustituyéndelo por wicd:

# Instalo wicd
sudo apt-get install wicd

# Deshabilito (no desinstalo por si las moscas) NetworkManager y servicios asociados
sudo systemctl mask NetworkManager.service
sudo systemctl mask NetworkManager-wait-online.service
sudo systemctl mask NetworkManager-dispatcher.service

Por su parte wicd es más austero y simple, pero cumple a la perfección su cometido para administrar la conexión tanto a red cableada como wifi.

Si quisiéramos volver a utilizar NetworkManager deberíamos eliminar wicd ya que no es nada recomendable tener dos gestores de red activos al mismo tiempo.

Por último, tras observar numerosos avisos en /var/log/syslog relativos a la configuración CRDA:

cfg80211: World regulatory domain updated:
cfg80211:  DFS Master region: unset
cfg80211:   (start_freq - end_freq @ bandwidth), (max_antenna_gain, max_eirp), (dfs_cac_time)
cfg80211:   (2402000 KHz - 2472000 KHz @ 40000 KHz), (N/A, 2000 mBm), (N/A)
cfg80211:   (2457000 KHz - 2482000 KHz @ 40000 KHz), (N/A, 2000 mBm), (N/A)
cfg80211:   (2474000 KHz - 2494000 KHz @ 20000 KHz), (N/A, 2000 mBm), (N/A)
cfg80211:   (5170000 KHz - 5250000 KHz @ 80000 KHz, 160000 KHz AUTO), (N/A, 2000 mBm), (N/A)
cfg80211:   (5250000 KHz - 5330000 KHz @ 80000 KHz, 160000 KHz AUTO), (N/A, 2000 mBm), (0 s)
cfg80211:   (5490000 KHz - 5730000 KHz @ 160000 KHz), (N/A, 2000 mBm), (0 s)
cfg80211:   (5735000 KHz - 5835000 KHz @ 80000 KHz), (N/A, 2000 mBm), (N/A)
cfg80211:   (57240000 KHz - 63720000 KHz @ 2160000 KHz), (N/A, 0 mBm), (N/A)

Me tocó también especificar mi zona (en mi caso España) en /etc/default/crda:

REGDOMAIN=ES

Una vez especificado, la próxima vez que se actualice la zona CRDA deberíamos ver en /var/log/syslog:

cfg80211: Regulatory domain changed to country: ES
cfg80211:  DFS Master region: ETSI
cfg80211:   (start_freq - end_freq @ bandwidth), (max_antenna_gain, max_eirp), (dfs_cac_time)
cfg80211:   (2400000 KHz - 2483500 KHz @ 40000 KHz), (N/A, 2000 mBm), (N/A)
cfg80211:   (5150000 KHz - 5250000 KHz @ 80000 KHz, 200000 KHz AUTO), (N/A, 2301 mBm), (N/A)
cfg80211:   (5250000 KHz - 5350000 KHz @ 80000 KHz, 200000 KHz AUTO), (N/A, 2000 mBm), (0 s)
cfg80211:   (5470000 KHz - 5725000 KHz @ 160000 KHz), (N/A, 2698 mBm), (0 s)
cfg80211:   (57000000 KHz - 66000000 KHz @ 2160000 KHz), (N/A, 4000 mBm), (N/A)

Después de todos estos cambios desconecto el portátil de la red cableada, reinicio el sistema y me encuentro felizmente conectado a mi red wifi con -por fin- bastante estabilidad de conexión. Además ahora en caso de corte espontáneo -rara vez- con wicd puedo reconectar sin mayores problemas a mi red 🙂