Thursday, April 10, 2008

Buggy Beetle

un bug vraiment très bête, en fait. Genre, deux lignes inversées dans un module noyau, et vlan, tout plante ... Je ne suis pas trop rouillé en Assembleur et en noyau linux, heureusement. A partir du crashdump sur le terminal (zd1201_usbrx+0x717), j'ai réussi malgré tout à retrouver le bout du driver pour ma clé wifi USB qui a provoqué un beau gros plantage de Gutsy Gibbon, la release ubuntu installée sur mon nouveau beetle. Il aura fallu attendre le passage à Hardy Heron pour que la correction arrive dans Ubuntu. Je suis aussi arrivé à la conclusion (après un peu plus de chipotage), que la ligne
 skb->dev->last_rx = jiffies; 
supposée indiquer dans l'état du driver l'instant où le dernier paquet avait été reçu tentait de modifier un "device" qui n'a jamais été initialisé auparavant ("thou shall not follow thee NULL pointer", comme dirait Cyril). J'aurais bien rajouté à la main un "skb->dev = zd->dev", mais j'ai fini par faire une petite recherche google qui m'a appris beaucoup plus rapidement qu'en fait, ce champs-là est initialisé par la fonction appelée juste en-dessous (eth_type_trans, pour les intimes) :P Le code correct lit donc
  memcpy(skb_put(skb, len), data, len);
  skb->protocol = eth_type_trans(skb, zd->dev);
  skb->dev->last_rx = jiffies;
  zd->stats.rx_packets++;

Bon, par contre, pas trouvé le moyen de recompiler juste le module foireux (voir plus bas). Il est teatime, et je lance ma première recompilation de noyau sur mon dual-c0re tout neuf à 4GB de RAM... ... 1/2 heure plus tard, la recompilation est terminée, mais évidemment, les batteries de ma DS n'ont pas attendu jusque là. 'faudra essayer tout ça demain :P here's a recompiled zd1201.ko module for the default gutsy kernel reusing local configuration (dual core, just in case). 

Install in /lib/modules/2.6.22-14-generic/kernel/drivers/net/wireless/ and make sure you have fresh firmware files (available on http://linux-lc100020.sourceforge.net/, to be installed in /lib/firmware/2.6.22-14-generic/) 2.6.22-14-generic/kernel/drivers/net/> md5sum wireless/zd12* 5e109dc87a1fa80d7c67834ce0d7a11c wireless/zd1201.ko 0ed15b4dab3e4f52f978a031ae102e02 wireless/zd1201.ko.original (i'd suggest that you *don't* replace your wireless/zd1201.ko unless with mine unless you happen to have the same md5 as wireless/zd1201.ko.original) edit: ça marche. c'est reparti pour le homebrew du temps de midi ^_^ edit+: oh, au fait: tout ça parce que je voulais vérifier que mon installation du dernier devkitpro (r21) était au poil... edit: Thanks to this post by linuxtilti, i figured out how to make a small Makefile that lets me rebuild just the module i need

obj-m = zd1201.o
KVERSION = $(shell uname -r)

all:
 make -C /lib/modules/$(KVERSION)/build M=$(PWD) modules
clean:
 make -C /lib/modules/$(KVERSION)/build M=$(PWD) clean
Okay, that was damn obvious, but i'm always confused by kernel makefiles, somehow. They export all their regular duties to those called builders, just pointing out "here is where i stand". I suspect that only obj-m is then imported by the builder ...

1 comment:

Anonymous said...

Imagine: Last time I used unix was in 1992. Now, I have an 8 year old PC that I have been using as a printer server for my little family network at home here in Oslo. It was running win98, and even with nothing more to do than spooling print jobs, it never managed to run more than a couple of days before it crashed completely. I vaguely remembered the typical 200+ days continuous uptime of my 92 unix workstation, and decided to install ubuntu on the box.

Everything went extremely smooth (jee, unix has evolved for the last 15 years), until I plugged in the Sparklan usb wifi adapter. I guess it's called kernel panic these days. I could see that this problem was deep indeed, and considered it a bit of an unfair slap to deliver to a newbee.

So, with severely outdated unix experience and two hours of googling, I find pype's post, only hours old. His fix solved the problem completely.

Thanks, pype!