"Después del juego es antes del juego"
Sepp Herberger

jueves, 7 de enero de 2021

Haciendo funcionar un dispositivo wifi USB Mediatek MT7601U en Linux.

Tengo un pincho USB wifi regalado que al probarlo no me funcionó en Linux. El sistema no creaba el dispositivo de red wifi al conectarlo. Su identificación USB es:
# lsusb | gre0 -i wireless
Bus 001 Device 003: ID 148f:7601 Ralink Technology, Corp. MT7601U Wireless Adapter
Lo curioso es que el driver mt7601u.ko si existe para Linux hace tiempo. En el caso de Manjaro tuve que instalarlo con:
$ pamac build  mt7601u-dkms-git
Una vez creado el módulo verifico que se carga en memoria:
# lsmod | grep mt
mt7601u               139264  0
mac80211             1110016  1 mt7601u
cfg80211              987136  2 mt7601u,mac80211
Pero nada, no funciona: no hay dispostivo wifi. Miro el log y veo estos errores recurrentemente:
   90.682395] mt7601u 1-1.1:1.0: ASIC revision: 76010001 MAC revision: 76010500
[   90.684079] mt7601u 1-1.1:1.0: Firmware Version: 0.1.00 Build: 7640 Build time: 201302052146____
[   91.066394] mt7601u 1-1.1:1.0: EEPROM ver:0c fae:00
[   91.232416] mt7601u 1-1.1:1.0: Error: MCU resp urb failed:-71
[   91.232420] mt7601u 1-1.1:1.0: Error: MCU resp evt:0 seq:5-4!
[   91.236894] mt7601u 1-1.1:1.0: Error: MCU resp urb failed:-71
[   91.236897] mt7601u 1-1.1:1.0: Error: MCU resp evt:0 seq:5-4!
[   91.241147] mt7601u 1-1.1:1.0: Error: MCU resp urb failed:-71
[   91.241150] mt7601u 1-1.1:1.0: Error: MCU resp evt:0 seq:5-4!
[   91.245395] mt7601u 1-1.1:1.0: Error: MCU resp urb failed:-71
[   91.245398] mt7601u 1-1.1:1.0: Error: MCU resp evt:0 seq:5-4!
[   91.249689] mt7601u 1-1.1:1.0: Error: MCU resp urb failed:-71
[   91.249692] mt7601u 1-1.1:1.0: Error: MCU resp evt:0 seq:5-4!
[   91.249694] mt7601u 1-1.1:1.0: Error: mt7601u_mcu_wait_resp timed out
[   91.439297] mt7601u 1-1.1:1.0: Vendor request req:07 off:0080 failed:-71
[   91.605971] mt7601u 1-1.1:1.0: Vendor request req:02 off:0080 failed:-71
[   91.772616] mt7601u 1-1.1:1.0: Vendor request req:02 off:0080 failed:-71
[   91.772671] mt7601u: probe of 1-1.1:1.0 failed with error -110
Buscando en Internet encuentro esta solución. Los pasos descritos son:

1) Descargamos el código fuente del driver:
# wget -O master.zip https://codeload.github.com/jeremyb31/mt7601u-5.3/zip/master
# unzip -x master.zip
2) Entramos en el directorio mt7601u-5.3-master y modificamos a mano el fichero phy.c en los lugares indicados:
En la función mt7601u_init_cal() comentar las líneas:
      // ret = mt7601u_mcu_calibrate(dev, MCU_CAL_RXIQ, 0);
      // if (ret)
      // return ret;
      // ret = mt7601u_mcu_calibrate(dev, MCU_CAL_DPD, dev->dpd_temp);
      // if (ret)
      // return ret;
En la función mt7601u_phy_recalibrate_after_assoc() comentar las línea:
      // mt7601u_mcu_calibrate(dev, MCU_CAL_DPD, dev->curr_temp);
3) Guardamos y compilamos para crear un fichero mt7601u.ko nuevo con los parches aplicados:
# make -C /lib/modules/$(uname -r)/build M=$(pwd) modules
4) Una vez hecho esto quitamos el pincho del puerto USB y descargamos el driver de la memoria:
# rmmod mt7601u
5) Cargamos el módulo nuevo y pinchamos el USB otra vez:
# insmod ./mt7601u.ko
Ahora si que se detecta la tarjeta wifi:
# iwconfig
lo        no wireless extensions.

eno1      no wireless extensions.

wlp0s26u1u1  IEEE 802.11  ESSID:"WLAN_985A3D"  
          Mode:Managed  Frequency:2.462 GHz  Access Point: 78:81:02:02:AB:F1   
          Bit Rate=57.8 Mb/s   Tx-Power=20 dBm   
          Retry short limit:7   RTS thr:off   Fragment thr:off
          Encryption key:off
          Power Management:off
          Link Quality=49/70  Signal level=-61 dBm  
          Rx invalid nwid:0  Rx invalid crypt:0  Rx invalid frag:0
          Tx excessive retries:128  Invalid misc:1890   Missed beacon:0
Por último solo hay que ponerlo en la ruta del driver original, para que se cargue en cada arranque de forma automática. Para saber la ubicación adecuada del fichero, reiniciamos la máquina y hacemos:
# modinfo mt7601u | grep -i filename
filename:       /lib/modules/5.10.2-2-MANJARO/kernel/drivers/net/wireless/mt7601u.ko.xz
En mi caso la ruta es /lib/modules/5.10.2-2-MANJARO/kernel/drivers/net/wireless/mt7601u.ko.xz. Comovvemos, está ademas comprimido con formato .xz. Haremos:
# mv /lib/modules/5.10.2-2-MANJARO/kernel/drivers/net/wireless/mt7601u.ko.xz /lib/modules/5.10.2-2-MANJARO/kernel/drivers/net/wireless/mt7601u.ko.xz.bak
# cp mt7601u.ko /lib/modules/5.10.2-2-MANJARO/kernel/drivers/net/wireless/mt7601u.ko
# cd /lib/modules/5.10.2-2-MANJARO/kernel/drivers/net/wireless
# xz mt7601u.ko
Y listo, ya todo queda funcionando. Tan solo recordar que si actualizamos el kernel tendremos que repetir estos pasos para regenerar el driver parcheado.

1 comentario: