Je viens de récupérer un IBM T30. C'est une jolie petite machine (PM 1.8GHz, 40Go, 512Mo, 14"), qui va me servir de "petit" portable Linux (le gros portable, c'est un MacBook Pro 17"). Il n'est pas très léger, mais il a l'avantage d'entrer dans un petit sac à dos. Bon trêve de discussion, si je vous cause, c'est pour vous parler de mon expérience concernant la wifization (ça se dit ?) de cette machine.

J'ai d'abord commencé bêtement par mettre une carte PCMCIA (CardBus pour être plus précis) dedans... Mais bon, cette solution ne me convenait pas trop car ça dépasse (bon, OK, c'est un argument fallacieux, c'est surtout que j'aime me compliquer la vie ;-) ). Le portable est pré-équiper pour le Wifi. En effet, il est muni d'un emplacement MiniPCI et de deux antennes logées de chaque cotés de l'écran...

J'ai donc fait le tour de mes tiroirs, et j'y ai retrouvé une vieille carte PCI Prism2 802.11b. En fait, comme beaucoup de cartes PCI de l'époque, c'est une carte MiniPCI monté sur un adaptateur.

Donc, je commence par dessouder le câble d'antenne de la carte MiniPCI. Je l'installe dans le portable, je met sous tensions et c'est là que vient le premier "D'oh!" (© Homer J. Simpson)...

Le BIOS du PC affiche effrontément :
ERROR
1802: Unauthorized network card is plugged in - Power off and remove the
miniPCI network card.

Il semble qu'IBM ai décidé que ses clients doivent passer par lui pour ajouter une carte WIFI... Et dire que certains affirment que contrairement aux Mac, les PC, eux sont upgradables !!! ;-)

Une petite recherche sur Google (Google est ton amis !), et je tombe sur un article sur le ThinkWiki qui explique comment passer outre cette "fonctionnalité".
La solution consiste à changer un simple petit bit dans un recoin de la mémoire CMOS. Pour cela, un gars bien plus intelligent que moi a fait un joli petit programme en C. Il faut commencer par enlever la carte pour pouvoir booter. Voici la procédure complète (en root):
cat <no-1802.c
#include 
#include 
#include 
#include 
#include 

int main(void)
{
  int fd;
  unsigned char data;
  
  fd = open("/dev/nvram", O_RDWR);
  if (fd==-1) {
    printf("Opening /dev/nvram failed\n");
    return 1;
  }
  printf("Disabling WiFi whitelist check.\n"); 

  /* BIG INFORMATIONAL WARNING */ 
  /* The linux nvram driver doesn't give access to the first 14 bytes of
     the CMOS. As a result, we seek to 0x5c rather than 0x6a. If you're 
     implementing this under another OS, then you'll have to go to whichever
     address is appropriate for your access method */

  lseek(fd, 0x5c, SEEK_SET);
  read(fd, &data, 1);
  printf("CMOS address 0x5c: %02x->", data);
  data |= 0x80;
  printf("%02x\n", data);
  lseek(fd, 0x5c, SEEK_SET);
  if (write(fd, &data, 1)<0) {
    printf("Unable to write to /dev/nvram - hack failed\n");
    close(fd);
    return 2;
  }
  close(fd);
  printf("Done.\n");
  return 0;
}
EOF
gcc -o no-1802 no-1802.c
./no-1802

Et voili... Maintenant, on remet la carte, et l'on peut booter correctement. Elle est correctement détectée par Linux.

Il ne me reste plus qu'à connecter les antennes. Comme la carte n'est pas pourvue de connecteurs d'antennes, je suis obligé de couper les câbles des antennes du portable pour les souder sur la carte MiniPCI. Bon, je sais, c'est pas top niveau évolutions futures, mais bon, les autres options était acheter une autre carte ou trouver des connecteurs à souder (mission impossible ?)... Je coupe, je dénude, je fait chauffer le fer, et je commet deux joli pâté d'étain... Après vérification visuel rapide, les dégâts ne semble pas trop grave...

Je décide donc de refermer et de remettre sous tension le portable...

Une fois sous Ubuntu, un petit clique sur l'icône "Réseau" (au passage, cette icône est pas mal foutu sur la dernière Ubuntu. Elle permet enfin facilement de choisir les réseaux (filaire et les différents réseaux wifi), d'entrer la clef pour les réseaux cryptés, et de voir le niveau de réception... Ça semble peut être banale pour un utilisateur de Mac, mais sous Linux, il n'y a pas si longtemps, ça ressemblait plus à Windows avec 15 endroits différents pour régler ça. Et il y a un peu plus longtemps, ça passait forcement par quelques iwconfig et iwlist dans un terminal... Ah.... nostalgie...

Bon tout ça pour dire que je clique sur cette icône et je vois plein de réseaux (j'habite en centre ville), mais pas le mien. D'oh! Je suis pourtant situé à moins d'un mètre de ma Freebox, et les autres réseaux captés sont à plusieurs dizaines de mètres...
Une petite investigation plus poussé à coup de iwlist wlan0 ap me permet de constater que tous les réseaux captés sont sur les canaux 10 à 13...
Ça ne parle peut être pas au jeunot, mais pour un vieux routard du Wifi comme moi (woula, rien que ça), ça rappel étrangement cette époque où en France, la loi n'autorisait pas l'utilisation des canaux 1 à 9 et 14... Les cartes de cette époque était bridée (coucou les Airport sur les iBook palourde). Courant 2003, la Loi a changé, et comme partout en Europe, l'usage des canaux 1 à 9 à été autorisé (mais toujours pas le 14).

Voilà pour l'histoire, mais ça ne vous dit pas comment on fait pour changer tout ça...Dans mes souvenirs, je savait qu'il était possible en flashant la carte avec un nouveau firmware. Comme j'ai eu pas mal de difficultés à retrouver la procédure (c'est dur de trouver des infos vieilles de plus 4 ans sur internet ;-) ), je vais la décrire. On sait jamais, ça peut servir...

Donc, j'ai trouvé cette page consacré à la mise a jour des firmwares (à lire attentivement avant de vous lancer, car le firmware dépend du modèle de votre carte). Et cette discussion consacrée aux changements des canaux autorisés...

Première étape, installer les hostap-utils pour avoir les outils de flashage :
sudo apt-get install hostap-utils

Ensuite, il faut en connaitre un peu plus sur la carte pour choisir ses firmwares :
# hostap_diag wlan0
Host AP driver diagnostics information for 'wlan0'

NICID: id=0x8013 v1.0.0 (PRISM II (2.5) Mini-PCI (SST parallel flash))
PRIID: id=0x0015 v1.0.4
STAID: id=0x001f v1.3.9 (station firmware)

Puis télécharger les firmwares :
wget http://linux.junsun.net/intersil-prism/firmware/1.7.4/pk010101.hex
wget http://linux.junsun.net/intersil-prism/firmware/1.7.4/sf010704.hex
On test le flashage :
# prism2_srec -v wlan0 pk010101.hex sf010704.hex

Et si il n'y a pas d'erreurs, on flash pour de vrai ;-) :
# prism2_srec -v -f wlan0 pk010101.hex sf010704.hex

Et on vérifie si tout est correct :
# hostap_diag wlan0
Host AP driver diagnostics information for 'wlan0'

NICID: id=0x8013 v1.0.0 (PRISM II (2.5) Mini-PCI (SST parallel flash))
PRIID: id=0x0015 v1.1.1
STAID: id=0x001f v1.7.4 (station firmware)

Youpi.... Mais ça ne règle toujours pas le problème des canaux ;-)

Les infos sur les canaux sont dans une mémoire appelée PDA. On peut la récupérer avec :
# prism2_srec -D wlan0 > pda
# cat pda
...
; PDR 0x0104 data len=2 Allowed Channel Set/Active Channel List
2 0104
1e00
...

Il faut changer le mot à l'adresse 0x0104. Il faut remplacer 1e00 par 3fff pour avoir accès à tous les canaux.
Ensuite, on reflash avec :
# prism2_srec -v -f wlan0 pk010101.hex sf010704.hex -P pda

Et voilà, on a maintenant accès à tous les canaux et surtout à celui utiliser par mon réseau (à vrai dire, j'ai strictement aucune idée de celui ci, la freebox choisi toute seule le moins occupé, mais maintenant, je sait au moins qu'il est inférieur à 10 ;-) )...