6 de marzo de 2010

Instalando Marvell Yukon Ethernet Controller en Ubuntu

Después de un tiempo sin poder dedicarme a dejar bien configurado mi Netbook el cual ya compré hace algún tiempo, finalmente me he decidido dedicarle un rato, hoy mismo, para dejar funcionando la tarjeta ethernet integrada en el sistema operativo que le puse desde el primer momento que lo tuve, que es concretamente un Ubuntu 9.10 Netbook remix. Si ya sé que alguno podéis llegar a pensar que como es que no lo hice desde un primer momento, pues esto se reduce a básicamente 3 aspectos:
  1. Falta de preferencia de mi tiempo libre para dedicarle a esto.
  2. El aspecto 1 se debe a que la tarjeta Wireless Broadcom si que fue detectada en la instalación base.
  3. El aspecto 2 queda justificado por los 2 objetivos por el cual lo compré, que fueron tener menos pereza en cargar un ordenador a cuestas y para que en los momentos de mayor pasividad no me diera tanta pereza estar delante de un ordenador; este último objetivo implícitamente requiere el uso de la wireless, ya que en esos momentos es cuando necesito estar en el sofa o en la cama, por lo que los cables me sobran, además debido a esto inicialmente no me día cuenta que el sistema operativo no la había detectado.
Bueno ya no me enrollo más y paso a explicar la aventurita de instalar el driver, que me ha llevado un rato algo largo, pero como siempre a parte de ahora tener la tarjeta ethenet funcionando me ha llevado a aprender, como siempre, alguna cosa más.

Buscando el dispositivo
He empezado buscando el fabricante del dispositivo que lleva el Netbook porque aunque alguno de vosotros penséis que como es que no podía saberlo, pues básicamente se debe a que cuando compré el Netbook no miré concretamente que tarjeta ethernet llevaba.
Esto fue fácil de solucionar buscando en la Web de HP el modelo y viendo con que hardware se comercializaba; esta vez ha sido fácil ya que en el caso de la ethernet solo habían utilizado un fabricante y modelo, concretamente se trata de una Marvell Yukon Gigabit Ethernet.

Buscando el driver
Aunque parezca una parida, resulta que encontrar el driver apropiado para linux no lo ha sido tanto, por tres motivos:
  1. En los repositorios de paquestes de Ubuntu no hay o no he encontrado un driver; por lo que se jodió la instalación más fácil y rápida a la que podía optar.
  2. HP no ofrece drivers para linux para este Netbook.
  3. Resulta que los drivers te los puedes descargar de dos lugares, de SysKonnect y de Marvell, siendo distintos.
Bueno, así que me descargo los dos el SysKonnect y el de Marvell.

Analizando los drivers
Una vez descargados, que en el caso de Marvell he descagado el que indica para kernels de la versión 2.6 pero con una coletilla que pone "Fedora", les he echado un vistazo rápido y ya he visto que el de Marvell es de una versión superior, concretamente la 10.84.3.3 frente a la 10.70.1.3 de SysKonnect.

Después he leído detalladamente el README del driver de Marvell y ver que cumplía con todos los requisitos de instalación, he visto que hay dos modos de instalación, uno llamado "Modo de Instalación" y otro "Modo de Generación de Parche"; por lo que he leído más adelante en mi caso lo que quiero es instalarlo no parchear un kernel para que luego el driver quede integrado en las fuentes de este y pueda ser distribuido con este driver añadido.

Una vez ya he tenido claro el proceso de instalación he decidido echarle un ojo al README del drivers de SysKonnect y con un simple vistazo vemos que son iguales; así que dando se esta divergencia, claro está que he optado primero por probar con el de Marvell que es de versión superior.

Instalando los drivers
La primera prueba
Lo primero que he probado es lo más sencillo que uno puede hacer, que es ejecutar las instrucciones y ver si todo funciona y no se genera ningún problema.

Como el resultado no ha sido satisfactorio, he hecho lo mismo con de SysKonnect y el resultado ha sido el mismo, así que va a tocar mirar los errores generados.

Chequeando los errores
En ese momento he empezado a mirar si los errores eran parecidos en un driver y en el otro y efectivamente lo eran así que me quedo con el Marvell definitivamente, ya que es de versión superior como ya he comentado anteriormente.

El primer error que me ha aparecido al lanzar la instalación

$ sudo ./install.sh

parecía que era un problema del código del script de instalación, pero después de buscar un poco google, he encontrado en un post, que se soluciona fácilmente cambiando el intérprete de comandos indicado en el script de "#!bin/sh" a "#!bin/bash" y el error que daba de que la sintaxis era incorrecta para un "(" después de la declaración de la primera función del fichero "functions", incluido con los ficheros de instalación, se solucionaba.

Una vez solucionado este pequeño mal entendido he vuelto a ejecutar la instalación y me he encontrado con un error que indicaba que no encontraba las fuentes del kernel, ya que lo que va a hacer es recompilar el driver para el kernel que se esté usando. He empezado mirando el synaptics y he visto que si tenía instalado las fuentes del kernel (los headers) así que algo pasa que no los encuentra.
A raíz de eso, he mirado un poco más específicamente y he visto que lo que necesita es generar un link en /usr/src llamado linux que apunté a los headers del kernel que estas corriendo, por lo que manos a la obra:

$ sudo ln -s /usr/src/linux-headers-2.6.31.19 /usr/src/linux

Después de esto, volvemos a probar y el resultado es que nada que continua fallando, indicando que o que las fuentes están corruptas o que no coinciden con la versión del kernel que se está ejecutando, así que ejecuto el siguiente comando para ver que versión estoy ejecutando y poder comparar a que versión de las fuentes he creado el link

$ uname -r
2.6.31-19-generic

Así que la he cagado de dos posibilidades que habían (ya sabía que estaba utilizando la 2.6.31-19, por lo que los headers de versiones anteriores los había descartado), he linkado con la que no era ,así que he cambiado el link

$ sudo rm /usr/src/linux
$ sudo ln -s /usr/src/linux-headers-2.6.31.19-generic /usr/src/linux

De nuevo he vuelto a ejecutar y otro vez ha fallado, viendo que estaba sucediendo he visto que ahora lo que no ecuentra es las fuentes del kernel pero esta vez accediendo desde "/lib/modules/2.6.31-19-generic/source", así que viendo que hay en ese directorio, veo que "source" no existe y ¿porque no?, pues no lo sabía pero después de ver que haya en ese directorio he visto que había un link llamado "build" que apuntaba a "/usr/src/linux-headers-2.6.31-19-generic", así que he decidido probar de linkar "source" al mismo lugar

$ sudo ln -s /usr/src/linux-headers-2.6.31.19-generic /lib/modules/2.6.31-19-generic/source

Y de nuevo he vuelto a probar y esta vez sí, se ha compilado, instalado y cargado el módulo en el kernel.

Conclusiones
Con todo esto he aprendido a que tampoco están difícil compilar e instalar un dirver para linux si el script esta bien hecho, solo tienes que tener un compilador (lo más habitual es el gcc), las fuentes del kernel que estas ejecutando y los links correctos a los directorios donde se encuentran las fuentes.
Por cierto el módulo se llama sk98lin, por si alguien en algún momento se necesita descargarlo o cargarlo manualmente.

Hasta la próxima enfermos.

No hay comentarios:

Publicar un comentario