rt3070sta GNU/Linux 64 bits working driver

rt3070sta GNU/Linux 64 bits working driver

Hace poco decidí actualizar el hardware de mi principal ordenador personal, por lo que la antigua placa, una ASUS P5e WS Pro con 4GB de RAM, y el microprocesador, INTEL Core 2 DUO E8400 3GHz, los ha heredado mi antiguo ordenador auxiliar —que hasta ahora lucía, con mucha dignidad, un AMD Duron 1.3 GHz, con 1 GB de RAM—. Pues bien, esa máquina la tengo conectada a la red con un adaptador USB Wi-Fi, el Alfa Network Adaptador WiFi USB 11n Ralink 2W 5dBi, que lleva el chipset RT3070 de Ralink. Con el driver que lleva UBUNTU 64 bits, el rt2800usb, la conexión que se consigue es muy pobre e inestable, cuando este chip es capaz de mucho más, sobre todo conectado en modo N al AP. En su día, me bajé el driver del chip rt3070 para GNU/Linux desde la web de Ralink (ahora Mediatek: http://www.mediatek.com/en/downloads/), era la versión 2.5.0.3 (ahora está la 2.6.1.3 de fecha 22.10.2012 pero luego os hablaré de ella). Después de ajustar algunas cosas en los ficheros de configuración, lo compilé para 32 bits y funcionó a la primera. La conexión era de 150 Mbps (300 si usas dos canales) y muy estable.

Al cambiar el micro a uno de 64 bits, tuve que recompilar el driver. Lo instalo y… ¡funciona! :-)

Hago algunas pruebas de conexión desde la línea de comandos y todo va bien (aparentemente). Abro el navegador, cargo una página y… las luces de scroll-lock y caps-lock empiezan a parpadear a la vez que el sistema deja de responder. ¡Es un kernel panic! ¡OMG! Al principio pensé que podía ser algún problema de hardware al haber ensamblado la máquina por completo hacía poco. Pero no, luego descubrí que era el driver de Ralink el que provocaba el kernel panic.

awus036nh-alfa-networkInvestigando el problema, llegué a esta página de un foro de Fedora: http://forums.fedoraforum.org/showthread.php?t=287273, en ella se habla del mismo problema pero en diferente hardware. En ese post habla de otro hilo en ubuntuforums: http://ubuntuforums.org/showthread.php?t=2092888 que nos da la pista definitiva para resolver el problema: Los programadores del driver no han tenido en cuenta que la estructura sk_buff se define de manera diferente en la arquitectura de 32 bits que en la de 64 bits. Cosa que se puede comprobar en el archivo skbuff.h de nuestra máquina:

#if BITS_PER_LONG > 32
#define NET_SKBUFF_DATA_USES_OFFSET 1
#endif

#ifdef NET_SKBUFF_DATA_USES_OFFSET
typedef unsigned int sk_buff_data_t;
#else
typedef unsigned char *sk_buff_data_t;
#endif

Algo así se debería, como mínimo, advertir en la documentación del driver.

Tal como se indica en ese post, hay que hacer algunos cambios en las macros que gestionan esa estructura para que la cosa funcione.

A continuación podéis ver los cambios que he hecho en el código original de esa versión del driver, para solucionar el problema anterior —también he eliminado el 99%  de los warnings de compilación—, y al final del artículo tenéis un enlace para descargarlo ya modificado.

Archivo include/os/rt_linux.h

#define GET_OS_PKT_DATATAIL(_pkt) \
    (skb_tail_pointer(RTPKT_TO_OSPKT(_pkt)))
    /*(RTPKT_TO_OSPKT(_pkt)->tail)*/
#define SET_OS_PKT_DATATAIL(_pkt, _start, _len) \
    (skb_set_tail_pointer(RTPKT_TO_OSPKT(_pkt), \
     (int)((_start) - GET_OS_PKT_DATAPTR(_pkt)) + (_len)))
    /*((RTPKT_TO_OSPKT(_pkt))->tail) = (PUCHAR)((_start) + (_len))*/

Las macros de las que os hablaba y que gestionan la lectura y escritura del elemento tail.
También para el elemento end.

#define GET_OS_PKT_END(_pkt) \
  (skb_end_pointer(RTPKT_TO_OSPKT(_pkt)))
    /*(RTPKT_TO_OSPKT(_pkt)->end)*/

Archivo os/linux/rt_linux.c

    /*NdisMoveMemory(skb->tail, pHeader802_3, HdrLen);*/
    NdisMoveMemory(GET_OS_PKT_DATATAIL(skb), pHeader802_3, HdrLen);
    skb_put(skb, HdrLen);
    /*NdisMoveMemory(skb->tail, pData, DataSize);*/
    NdisMoveMemory(GET_OS_PKT_DATATAIL(skb), pData, DataSize);
    SET_OS_PKT_DATATAIL(pClonedPkt, pClonedPkt->data, pClonedPkt->len);
    /*pClonedPkt->tail = pClonedPkt->data + pClonedPkt->len;*/
  pOSPkt->len = (UINT)DataSize;
  SET_OS_PKT_DATATAIL(pOSPkt, pOSPkt->data, pOSPkt->len);
  /*pOSPkt->tail = pOSPkt->data + pOSPkt->len;*/

Archivo Makefile

ifeq ($(CHIPSET),)
  CHIPSET = 3070
endif

Para identificar nuestro chip.

	echo "no es necesario"
	#cp -f $(RT28xx_DIR)/os/linux/rt$(CHIPSET)sta.ko /tftpboot

Innecesario en un PC.

Archivo chips/rtmp_chip.c

VOID RT30xx_Init( IN PRTMP_ADAPTER pAd);
;//RT33xx_Init(pAd);

Esta corrección soluciona un error fatal de compilación que no tiene nada que ver con el problema del que habla este artículo pero que es necesario.

Archivo common/cmm_wpa.c

WPA_MIX_PAIR_CIPHER		FlexibleCipher = WPA_TKIPAES_WPA2_TKIPAES;	/* it provide the more flexible cipher combination in WPA-WPA2 and TKIPAES mode*/

Otro cambio necesario si usas WPA o WPA2.

Archivo include/rtmp_def.h

#define INF_MAIN_DEV_NAME   "wlan"
#define INF_MBSSID_DEV_NAME   "wlan"

Este cambio es opcional. Lo que hace es cambiar el nombre del adaptador (prefiero que se llame wlan0 que ra0, cuestión de gustos).

Archivo os/linux/config.mk

# Support Wpa_Supplicant
HAS_WPA_SUPPLICANT=y
# Support Native WpaSupplicant for Network Maganger
HAS_NATIVE_WPA_SUPPLICANT_SUPPORT=y

Estos cambios hay que hacerlos si usas WPA o WPA2.

También habrá que adaptar el archivo RT2870STA.dat a nuestras necesidades.

Tras estos cambios, el driver se puede compilar con las órdenes:

cd /directorio-del-driver
make clean
make

E instalar con la orden:

sudo make install

Para que el driver se cargue automáticamente al arrancar la máquina, hay que meter en la blacklist al driver que viene con UBUNTU. Basta con editar el archivo /etc/modprobe.d/balcklist.conf y añadir al final:

# rt2800usb
blacklist rt2800usb
blacklist rt2870sta
blacklist rt2800lib
blacklist rt2x00usb
blacklist rt2x00lib

Si queremos añadir soporte para dkms, hay que seguir estos pasos:

Suponiendo que tenemos el código fuente del driver en /home/usuario/drivers/rt3070sta-2.5.0.3, creamos un enlace simbólico a ese directorio en /usr/src así:

cd /usr/src
sudo ln -s /home/usuario/drivers/rt3070sta-2.5.0.3 rt3070sta-2.5.0.3

En el directorio raiz del código fuente del driver, deben existir los archivos: copia-dat.sh y dkms.conf.
El primero es el script que se ejecuta después de la instalación del driver y lo que hace es copiar el archivo RT2870STA.dat a /etc/Wireless/RT2870STA (creando los directorios si no existen).
El segundo es el archivo de configuración para el DKMS.

Para instalar el driver en nuestro núcleo, ejecutamos la orden:

sudo dkms install rt3070sta/2.5.0.3

Ambos ficheros los encontraréis en el archivo que adjunto y podéis modificarlos según vuestras necesidades.

También descargué la última versión del driver,la 2.6.1.3, pero aunque le hice también las modificaciones que he descrito aquí, no he conseguido que funcione. El driver compila sin errores, se carga bien, pero no activa la interfaz wlan0. No he averiguado el problema… algún día. :-)

Descarga el driver: 2011_0719_RT3070_RT3370_RT5370_RT5372_Linux_STA_V2.5.0.3_DPO_ubuntu_12_04_x86_64_working.tar.bz2

Share on FacebookShare on Google+Tweet about this on TwitterShare on LinkedIn

23 comentarios en “rt3070sta GNU/Linux 64 bits working driver”

  1. Navegando con Mozilla Firefox Mozilla Firefox 32.0 en Ubuntu Linux Ubuntu Linux

    Gran post, aunque no he podido compilarlo ya que me salta un error. A ver si me pudieras ayudar. El error que me salta es el siguiente:

    /home/karlinux/Descargas/2011_0719_RT3070_RT3370_RT5370_RT5372_Linux_STA_V2.5.0.3_DPO_actual_x86_64/os/linux/../../os/linux/rt_linux.c:1130:22: error: incompatible types when assigning to type ‘int’ from type ‘kuid_t’
    pOSFSInfo->fsuid = current_fsuid();
    ^
    /home/karlinux/Descargas/2011_0719_RT3070_RT3370_RT5370_RT5372_Linux_STA_V2.5.0.3_DPO_actual_x86_64/os/linux/../../os/linux/rt_linux.c:1131:22: error: incompatible types when assigning to type ‘int’ from type ‘kgid_t’
    pOSFSInfo->fsgid = current_fsgid();
    ^
    make[2]: *** [/home/karlinux/Descargas/2011_0719_RT3070_RT3370_RT5370_RT5372_Linux_STA_V2.5.0.3_DPO_actual_x86_64/os/linux/../../os/linux/rt_linux.o] Error 1
    make[1]: *** [_module_/home/karlinux/Descargas/2011_0719_RT3070_RT3370_RT5370_RT5372_Linux_STA_V2.5.0.3_DPO_actual_x86_64/os/linux] Error 2
    make[1]: se sale del directorio «/usr/src/linux-headers-3.13.0-35-generic»
    make: *** [LINUX] Error 2

    De todas formas muchas graciassss. Al menos ya se que el kernel panic no es por otra cosa.

    1. Navegando con Mozilla Firefox Mozilla Firefox 32.0 en Ubuntu Linux Ubuntu Linux

      Hola, karlinux.
      Tienes razón. Por lo visto, en el cambio de la rama del kernel de ubuntu 12.04 al 14.04 también ha cambiado el tipo de lo que devuelven las funciones current_fsuid() y current_fsgid(), por lo que hay que hacer un pequeño cambio en uno de los ficheros de cabecera del driver. En concreto este:

      include/os/rt_linux.h

      Original:

      typedef struct _OS_FS_INFO_
      {
      	int				fsuid;
      	int				fsgid;
      	mm_segment_t	fs;
      } OS_FS_INFO;

      Modificado:

      typedef struct _OS_FS_INFO_
      {
        kuid_t       fsuid;
        kgid_t       fsgid;
        mm_segment_t  fs;
      } OS_FS_INFO;

      Ya he subido ese cambio al archivo que se puede descargar en este post.

      Saludos.

  2. Navegando con Mozilla Firefox Mozilla Firefox 32.0 en Ubuntu Linux Ubuntu Linux

    You are the best… Muchas gracias funcionando sin problema, compilado e instalado.. De verdad muchas gracias :)

  3. Navegando con Mozilla Firefox Mozilla Firefox 32.0 en Linux Linux

    Hola de nuevo, he intentado compilarlo en ARCH, pero me da error, y mi sabiduria no llega a resolver el enigma, con lo que te estaría sumamente agradecido si me ayudaras, entendería que rechazaras la peticion de ayuda de todos modos, porque pesao soy un rato. :)

    Esto es lo que me tira el terminal, en el caso que quieras echarme una mano

    /home/karlinux/Drivers/rt3070sta-2.5.0.3/os/linux/../../sta/sta_cfg.c: En la función ‘RTMPIoctlShow’:
    /home/karlinux/Drivers/rt3070sta-2.5.0.3/os/linux/../../sta/sta_cfg.c:4941:85: error: macro “__DATE__” might prevent reproducible builds [-Werror=date-time]
    snprintf(extra, size, “Driver version-%s, %s %s\n”, STA_DRIVER_VERSION, __DATE__, __TIME__ );
    ^
    /home/karlinux/Drivers/rt3070sta-2.5.0.3/os/linux/../../sta/sta_cfg.c:4941:95: error: macro “__TIME__” might prevent reproducible builds [-Werror=date-time]
    snprintf(extra, size, “Driver version-%s, %s %s\n”, STA_DRIVER_VERSION, __DATE__, __TIME__ );
    ^
    cc1: algunos avisos se tratan como errores
    scripts/Makefile.build:257: recipe for target ‘/home/karlinux/Drivers/rt3070sta-2.5.0.3/os/linux/../../sta/sta_cfg.o’ failed
    make[2]: *** [/home/karlinux/Drivers/rt3070sta-2.5.0.3/os/linux/../../sta/sta_cfg.o] Error 1
    Makefile:1333: recipe for target ‘_module_/home/karlinux/Drivers/rt3070sta-2.5.0.3/os/linux’ failed
    make[1]: *** [_module_/home/karlinux/Drivers/rt3070sta-2.5.0.3/os/linux] Error 2
    make[1]: Leaving directory ‘/usr/lib/modules/3.16.3-1-ARCH/build’
    Makefile:356: recipe for target ‘LINUX’ failed
    make: *** [LINUX] Error 2

    Muchas gracias de nuevo.

    1. Navegando con Mozilla Firefox Mozilla Firefox 32.0 en Ubuntu Linux Ubuntu Linux

      Hola.

      No tengo manera de probarlo porque no tengo ARCH Linux pero puedes probar esto:

      En el archivo: os/linux/config.mk

      WFLAGS := -DAGGREGATION_SUPPORT -DPIGGYBACK_SUPPORT -DWMM_SUPPORT  -DLINUX -Wall -Wstrict-prototypes -Wno-trigraphs -Wno-error=date-time

      Es decir, añades al final de esa línea “-Wno-error=date-time”

      Si eso no funciona, prueba a cambiar la línea que produce el error:
      En el archivo: sta/sta_cfg.c

      snprintf(extra, size, "Driver version-%s, %s %s\n", STA_DRIVER_VERSION, __DATE__, __TIME__ );

      Por esta:

      snprintf(extra, size, "Driver version-%s\n", STA_DRIVER_VERSION );
  4. Navegando con Mozilla Firefox Mozilla Firefox 32.0 en Linux Linux

    Con lo primero bastó para compilar el driver…. De nuevo mil y una gracias!!! :)
    Aki un amigo para lo que necesites… menos dinero claro! ;)

  5. Navegando con Mozilla Firefox Mozilla Firefox 33.0 en Ubuntu Linux Ubuntu Linux

    Hola.A mi no se me ha resuelto el problema de la inestabilidad.Al cagar me bloquea el gestor de red y no puedo conectarme.
    Estoy en Ubuntu 14.04 y tengo una ralink 3070.
    Gracias.

    1. Navegando con Mozilla Firefox Mozilla Firefox 33.0 en Windows Windows XP

      Hola, Luis.
      Con tan poca información no puedo ayudarte mucho.
      Me ha hecho gracia en qué momento dices que se te bloquea el gestor de red. ;-) (El teclado a veces juega malas pasadas) :-P

      Saludos.

        1. Navegando con Mozilla Firefox Mozilla Firefox 33.0 en Windows Windows XP

          Hola, Luis.
          Es necesario saber qué modelo de adaptador wifi tienes, el chipset exacto que usa (hay varias 3070), si tu Ubuntu es de 32 o 64b, a qué gestor de red te refieres, qué configuración usas para el fichero RT2870STA.dat y si has comprobado que está bien configurado para tu wifi. Los mensajes que aparecen en /var/log/syslog al cargar el driver, cómo lo cargas, cómo lo compilas y los errores que te puedan salir al compilar o al cargar el driver, etc.

          Yo he comprobado, por ejemplo, que el Network Manager provoca desconexiones porque escanea la red a menudo (lo mismo ocurre con otros gestores de red), por eso lo desactivé y no uso gestor de red, sólo hay que configurar los parámetros de la interfaz wlan0 (o la que proceda) en /etc/network/interfaces. También es importante elegir un canal fijo en la configuración del router y no dejarlo en automático.

          1. Navegando con Mozilla Firefox Mozilla Firefox 33.0 en Ubuntu Linux Ubuntu Linux

            Al final he eliminado la partición de Ubuntu y he instalado Windows 7.Gracias por la ayuda.

  6. Navegando con Google Chrome Google Chrome 40.0.2214.115 en Linux Linux

    hola. no se si me podrian ayudar he buscado y no puedo solucionarlo, porfavor ayuda.

    kento@Inspiron-77:~/Descargas/20$ make
    make -C tools
    make[1]: se ingresa al directorio «/home/kento/Descargas/20/tools»
    gcc -g bin2h.c -o bin2h
    make[1]: se sale del directorio «/home/kento/Descargas/20/tools»
    /home/kento/Descargas/20/tools/bin2h
    cp -f os/linux/Makefile.6 /home/kento/Descargas/20/os/linux/Makefile
    make -C /lib/modules/3.16.0-31-generic/build SUBDIRS=/home/kento/Descargas/20/os/linux modules
    make[1]: se ingresa al directorio «/usr/src/linux-headers-3.16.0-31-generic»
    CC [M] /home/kento/Descargas/20/os/linux/../../common/rtmp_mcu.o
    LD [M] /home/kento/Descargas/20/os/linux/rt3070sta.o
    Building modules, stage 2.
    MODPOST 1 modules
    LD [M] /home/kento/Descargas/20/os/linux/rt3070sta.ko
    make[1]: se sale del directorio «/usr/src/linux-headers-3.16.0-31-generic»
    echo “no es necesario”
    no es necesario
    #cp -f /home/kento/Descargas/20/os/linux/rt3070sta.ko /tftpboot

  7. Navegando con Google Chrome Google Chrome 40.0.2214.109 en Android Android 4.1.2

    Gracias por responder. Lo que pasa es que cuando doy make sale lo de mi primer comentario y no compila.

  8. Navegando con Google Chrome Google Chrome 40.0.2214.115 en Linux Linux

    hola de nuevo (‘_’)/ gracias por responder. doy make y me sale lo de mi primer comentario, no se como pero ya funciono. Estaba usando fedora 21 y me he tenido que volver a ubuntu por este problema (^_^)” .

    1. Navegando con Mozilla Firefox Mozilla Firefox 36.0 en Ubuntu Linux Ubuntu Linux

      Hola, kento.

      En tu primer comentario no aparece ningún error de compilación. Después de compilar e instalar el driver con “sudo make install”, hay que cargarlo con “sudo modprobe rt3070sta” y comprobar con “iwconfig” si ve tu adaptador wifi. (No olvides lo que pongo en el post sobre las blacklist).

      Saludos.

  9. Navegando con Google Chrome Google Chrome 45.0.2454.101 en Linux Linux

    Hola. Lo primero de todo, muchas gracias por este post tan claro y tan útil.
    En mi caso, el chip de mi tarjeta es el RT5370. Me pregunto si para compilar bastaría con modificar la línea en la que se especifica el chip:
    ifeq ($(CHIPSET),)
    CHIPSET = 3070
    endif
    sustituyendo 3070 por 5370 o si sería necesario hacer modificaciones adicionales para compilar.

    Muchas gracias

    1. Navegando con Mozilla Firefox Mozilla Firefox 41.0 en Ubuntu Linux Ubuntu Linux

      Hola, Carlos.
      Debería funcionar haciendo el cambio que dices. De hecho, en el Makefile del driver original, esa línea venía así:
      CHIPSET = 5370

      Pruébalo y me cuentas…

      Saludos.

  10. Navegando con Mozilla Firefox Mozilla Firefox 38.0 en Fedora Linux Fedora Linux

    Saludos, estoy comenzando a usar linux y me decante por fedora(4.0.8-300.fc22.i686), sin embargo he legado a este post porque no consigo instalar mi RT3070, me gustaria saber como instalar driver wireless y como llegar a la solucion de este tipo de problemas ya que la terminal me arroja lo siguiente, pero no logro comprender que me quiere decir:

    [root@laptop DPO_RT5572_LinuxSTA_2.6.1.3_20121022]# make
    make -C tools
    make[1]: Entering directory ‘/home/henrypalacios/Plantillas/DPO_RT5572_LinuxSTA_2.6.1.3_20121022/tools’
    gcc -g bin2h.c -o bin2h
    make[1]: Leaving directory ‘/home/henrypalacios/Plantillas/DPO_RT5572_LinuxSTA_2.6.1.3_20121022/tools’
    /home/henrypalacios/Plantillas/DPO_RT5572_LinuxSTA_2.6.1.3_20121022/tools/bin2h
    cp -f os/linux/Makefile.6 /home/henrypalacios/Plantillas/DPO_RT5572_LinuxSTA_2.6.1.3_20121022/os/linux/Makefile
    make -C /lib/modules/4.0.8-300.fc22.i686/build SUBDIRS=/home/henrypalacios/Plantillas/DPO_RT5572_LinuxSTA_2.6.1.3_20121022/os/linux modules
    make[1]: *** /lib/modules/4.0.8-300.fc22.i686/build: No existe el fichero o el directorio. Alto.
    Makefile:389: recipe for target ‘LINUX’ failed
    make: *** [LINUX] Error 2

    Espero puedan ayudarme. Gracias.

    1. Navegando con Google Chrome Google Chrome 46.0.2490.42 en Linux Linux

      Hola, Henry.
      Como podrás leer al final de mi post, esa versión (2.6.1.3) del driver no conseguí que funcionase.
      Prueba con la que puedes descargar aquí, que yo modifiqué según lo explicado, y si tu S.O. es de 64 bits.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Antes de enviar el formulario: