HOW-TO Intel PRO wireless 3945abg en hardy heron (8.04) con ipw3945 y modo monitor

Como muchos ya sabréis, k/x/ubuntu 8.04 hardy heron ha sustituido los drivers privativos para la tarjeta wireles Intel PRO Wireless 3945abg (ipw3945) por los del proyecto libre (iwl39459).
parece ser que dicho driver libre no acaba de funcionar correctamente, disminuyendo el rendimiento de dicha tarjeta e incluso no funcionando esta en algunos casos. Tampoco han incluido la posibilidad de escojer el driver a usar entre el privativo y el libre...

Tras varias busquedas infructuosas, encontré alguna que otra solución, como por ejemplo instalar los backports-modules para conseguir devolver a la vida el led de la tarjeta, o incluso hacer un downgrade desde el kernel 2.6.24 al 2.6.22 que usa gutsy y si que incluye los drivers propietarios. Pero (por supesto, no podia ser de otra forma) esto acarrea otros efectos no deseados: en mi caso, deja de funcionarme el sonido, y hacer que funcione este, provoca que no funcione el led si inicio el sistema con el kernel 2.6.24...

Al fin, encontre la solución a estos problemas tras tiempo buscando, y fue en este foro de ubuntu en inglés:
http://ph.ubuntuforums.com/showpost.php?s=64fc1e981bb0ffb82599ab724be1f0...

En el baso este how-to esperando que a alguien le sea de ayuda...

NOTA: las lineas precedidas de $ son los comandos que teclearemos en la consola.

Antes que nada, abrimos una consola, creamos un directorio para el proceso y entramos en el:

      $ mkdir ipw3945
      $ cd ipw3945

Y ahora vamos con el HOW-TO paso a paso (sin salir de la consola donde estamos):

* 1. Descargar ipw3945 microcode, extraer, y copiar el archivo ipw3945.ucode al directorio de firmwares:

      $ wget http://bughost.org/ipw3945/ucode/ipw3945-ucode-1.14.2.tgz
      $ tar -xvzf ipw3945-ucode-1.14.2.tgz
      $ sudo cp ipw3945-ucode-1.14.2/ipw3945.ucode /lib/firmware/`uname -r`/ipw3945.ucode

* 2. Descargar ipw3945 regulatory daemon, extraer, y copiar el archivo ipw3945d al directorio /sbin :

      $ wget http://bughost.org/ipw3945/daemon/ipw3945d-1.7.22.tgz
      $ tar -xvzf ipw3945d-1.7.22.tgz
      $ sudo cp ipw3945d-1.7.22/x86/ipw3945d /sbin/ipw3945d (si usamos ubuntu 64 sustituir x86 por x86_64)

* 3. Descargar ipw3945 source y extraer:

      $ wget http://surfnet.dl.sourceforge.net/sourceforge/ipw3945/ipw3945-1.2.2.tgz
      $ tar -xvzf ipw3945-1.2.2.tgz

* 4. Descargar y aplicar el parche necesario para poder compilar en kernels 2.6.24 (y superiores, teoricamente):

      $ wget http://james.colannino.org/downloads/patches/ipw3945-1.2.2.patch
      $ cp ipw3945-1.2.2.patch ipw3945-1.2.2/ipw3945-1.2.2.patch
      $ cd ipw3945-1.2.2
      $ patch -p1 < ipw3945-1.2.2.patch

* 5. Compilamos el modulo ipw3945

NOTA: Si queremos compilar el driver para que soporte el modo MONITOR (aportado por shankao, de www.ubuntu-es.org ) editamos el archivo Makefile:

      $ nano Makefile
      buscamos la linea que diga #CONFIG_IPW3945_MONITOR=y
      y la modificamos para que quede CONFIG_IPW3945_MONITOR=y

Guardamos el archivo pulsando CTRL+O y salimos pulsando CTRL+X

      $ make SHELL=/bin/bash clean
      $ make SHELL=/bin/bash

* 6. Instalamos el modulo ipw3945

      $ sudo make SHELL=/bin/bash install

* 7. Añadimos estas líneas en el archivo /etc/modprobe.d/ipw3945:

      $ sudo nano /etc/modprobe.d/ipw3945 (si no existe, se creará como nuevo)
      install ipw3945 /sbin/modprobe --ignore-install ipw3945 ; sleep 0.5 ; /sbin/ipw3945d --quiet
      remove ipw3945 /sbin/ipw3945d --kill ; /sbin/modprobe -r --ignore-remove ipw3945

Guardamos el archivo pulsando CTRL+O y saldremos con CTRL+X
(si ya existen buscaremos `uname -r` en ellas y lo eliminaremos para que queden como lo he puesto o dará error en la carga del modulo)

NOTA: Delante de los comandos ignore-install, quiet, kill, e ignore-remove, aunque el foro presente un guión, son dos guiones juntos lo que hay que poner, o no funcionará.

* 8. Descargarmos de la memoria el modulo del driver libre:

      $ sudo rmmod iwl3945

* 9. Añadimos el driver libre al final del archivo /etc/modprobe.d/blacklist para que no se cargue al inicio del sistema:

      $ sudo nano /etc/modprobe.d/blacklist
      blacklist iwl3945

* 10. Cargamos en memoria el driver que hemos compilado

      $ sudo modprobe ipw3945

Y voilà! ipw3945 on linux 2.6.24!

Despues de esto, ya debería estar funcionando correctamente (la interfaz de red se volverá a llamar eth1 en vez de wlan0)
Si no es asi, probad con sudo /etc/init.d/networking restart. Y si no, pues reiniciando el sistema ya tomará el modulo correctamente.

Con esto, pues ya tendremos, wifi funcionando con el driver privativo ipw en lugar del libre iwl y con el led que vuelve a funcionar como lo hacía en ubuntu gutsy...

NOTA: Si se instala una actualización del kernel, este módulo dejará de funcionar. En ese caso, habrá que repetir los pasos 1,5,6, y 10.

Para realizar el proces contrario, es decir, desinstalar ipw3945 y volver a usar iwl3945, realizar el siguiente proceso desde una consola:

sudo nano /etc/modprobe.d/blacklist
    y eliminamos la linea blacklist iwl3945 (o la comentamos poniendo # delante)
sudo rmmod ipw3945    # esto descarga el modulo ipw3945
sudo rm /lib/firmware/`uname -r`/ipw3945.ucode    # con esto eliminamos el archivo ucode de ipw
sudo rm /sbin/ipw3945d   # con esto eliminamos el demonio ipw3945
sudo rm /etc/modprobe.d/ipw3945    # con esto eliminamos el archivo que creamos para la carga del moudulo
sudo modprobe iwl3945   # esto carga el driver libre iwl3945 en memoria
sudo /etc/init.d/networking restart    # reconfigura y reinicia los dispositivos de red...
rm -Rf ~/ipw3945     # esto borra el directorio que hemos creado al inicio del howto

De este modo, dejaremos el sistema limpio si nos ha salido mal el howto y asi podremos probar de nuevo desde un entorno limpio, o simplemente dejarlo como estaba si no ha dado resultado...