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

Mostrando entradas con la etiqueta driver. Mostrar todas las entradas
Mostrando entradas con la etiqueta driver. Mostrar todas las entradas

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.

miércoles, 5 de abril de 2017

HP Deskjet 710C en Windows 8 sin driver gracias a Linux.

Tenemos una impresora HP Desjket 710C que lleva 15 años funcionando estupendamente: los cartuchos son baratos, los inyectores van bien, nunca se atasca y los rodillos cogen el papel con soltura. Hemos retirado otras impresoras posteriores pero la 710C sigue funcionando aunque es algo lenta imprimiendo, pero no es grave porque tampoco tiene un uso intensivo. Sin duda, el departamento de obsolescencia programada de HP estaba de vacaciones cuando sacaron esa impresora. A fin de cuentas va a resultar que a veces el Mal se toma un descanso.

Hasta ahora ha estado funcionando con Linux y con Windows XP sin mayor problema. Al cambiar a Ubuntu 14.04 ha seguido funcionando con el driver "HP DeskJet 710C Foomatic/pnm2ppa (recommended)", pero al actualizar a Windows 8 ha aparecido un problema: el driver oficial que pone Windows falla al imprimir y mata el spooler de impresión. Es un problema documentado en Internet y que no tiene solución para Windows 8 y 10. Para Windows 7 tiene una solución un poco chapucera.

No es la primera vez que pasa esto de que no haya drivers para Windows. Es un tema olvidado para los Redmond Lovers (;-)) que optan por comprar otra impresora si la antigua ya no tiene drivers para Windows, pero si que recuerdan hasta el lecho de muerte cualquier problema de drivers con Linux. En fin, ¿hay solución o debemos retirar una impresora totalmente funcional?.

La impresora está en una estancia donde hay un PC con Linux y otro con arranque dual Linux/Windows 8. Hasta ahora estaba conectada al equipo Windows solamente. ¿Podría conectarla al equipo que tiene solo Linux y compartirla por CUPS desde allí hacía el otro PC?. Vamos allá:

  • Como hemos visto, la conectamos al puerto paralelo (no tiene USB) del equipo Linux y la damos de alta con el nombre HP_DESKJET_COLOR usando el driver "HP DeskJet 710C Foomatic/pnm2ppa", marcando la opción "Compartida".
  • En el segundo equipo, arrancamos en Linux y la damos de alta como impresora remota con URI http://ip-primer-equipo:631/printers/HP_DESKJET_COLOR y el mismo driver que antes. Probamos a imprimir vemos que funciona. Hasta aquí todo va bien.
  • Arrancamos Windows 8 en el segundo equipo y añadimos la impresora indicando que es de red con la ruta http://ip-primer-equipo:631/printers/HP_DESKJET_COLOR. Ponemos el driver normal de la 710C a ver si asi no falla..... ¡Meeeeec, error!, al dar a imprimir el proceso Spooler muere y queda inutilizada.
  • La borramos y la damos de nuevo de alta elegiendo el driver Generic/TextOnly. Se supone que ese es el driver RAW oficial de Windows, que manda los trabajos de impresión en bruto sin procesar al destino y por tanto no usa el driver que falla. Debería ser equivalente al "Local Raw Printer" de CUPS que conté aquí con una Epson. Hablo en condicional porque tampoco funciona, da otro error que viene a decir que el trabajo ha quedado paralizado y hay que reiniciar impresora y ambos PC para que funcione.
  • Nuevo intento, ahora con los drivers CUPS x64 para Windows. Nunca he tenido muy claro para que valen, pero es buen momento para probar. Es un camino corto: dan un error durante la instalación y no permiten continuar.
  • A punto de tirar la toalla, decido probar con un driver PostScript Universal. Me suena haber leído que si mandas un documento .ps en bruto a CUPS, este lo procesa con el driver correspondiente y lo imprime. Como no puedo encontrar los drivers universales PostScript de Adobe (que son la referencia en estos casos) para Windows 8, descargo estos de Xerox según cuentan aquí.
  • Ejecuto UNIV_5.520.6.0_PS_x64.exe descargado en el anterior paso, se descomprime en C:\Xerox\UNIV_5.520.6.0_PS_x64_Driver.inf\* y doy de nuevo de alta la impresora. Al elegir driver elijo Utilizar Disco y me voy al directorio anterior, seleccionando el driver “Xerox Global Print Driver PS” de la lista de drivers.



  • Mando a imprimir un documento desde el Windows por la impresora HP con el driver Xerox PS, lo convierte en un documento PostScript que se envía a http://ip-primer-equipo:631/printers/HP_DESKJET_COLOR, cuyo CUPS lo recoge y.... carajo, se imprime. Esto funciona.

Bueno, pues ya tenemos impresora por otra temporadita, gracias a Linux y a la facilidad de CUPS para aceptar cualquier documento que le llegue en formato PostScript y procesarlo con el driver adecuado. Con este truco podremos seguir usando en nuestras redes cualquier impresora antigua que funcione en Linux pero ya no esté soportada por Windows.

A ver si nos aguanta la impresora hasta que llegué el AVE a nuestra patria chica, que lo han retrasado hoy hasta 2025. Es muy fácil saber donde está Extremadura: en el hueco.



Es curioso que en una zona donde no quieren poner ningún tren eléctrico si quisieron ponernos 4 reactores nucleares que al final quedaron en 2, y esperemos que pronto en 0 si los hermanos portugueses aprietan lo suficiente.

Mi apuesta personal es que Elon Musk pondrá un hombre en Marte antes de que llegue el AVE a Badajoz.