Logiciels Libres et Systèmes Embarqués


5.9. Pilote de l'interface réseau XEmac

J'ai aussi pris le pilote de l'interface réseau XEmac chez Mind. Celui-ci n'est pas publiquement disponible sur leur site FTP, il faut donc demander gracieusement l'accès à leurs versions de démonstrations. Une fois récupéré, il suffit d'appliquer le correctif :

bash# cd linuxppc-2.4.23
bash# patch -p1 < ../xemac-patch
  patching file drivers/net/Config.in
  Hunk #1 succeeded at 47 with fuzz 1 (offset 6 lines).
  patching file drivers/net/Makefile
  Hunk #1 succeeded at 95 with fuzz 2 (offset 11 lines).
  patching file drivers/net/xemac.c
  patching file drivers/net/xemac.h

Il faut dans un premier temps modifier le fichier drivers/net/Config.in pour rajouter des options dans le menu de configuration, afin d'obtenir un pilote plus générique :

- if [ "$CONFIG_XSEG2" = "y" ]; then
+ if [ "$CONFIG_VIRTEX" = "y" ]; then
    tristate '  Xilinx ethernet MAC support' CONFIG_XEMAC
+   if [ "$CONFIG_XEMAC" != "n" ]; then
+     hex 'XEMAC MAC address' CONFIG_XEMAC_MAC 0x000102030405
+     hex 'XEMAC registers base address (C_BASEADDR)' \
+         CONFIG_XEMAC_BASE 0x80c00000
+     hex 'XEMAC registers high address (C_HIGHADDR)' \
+         CONFIG_XEMAC_HIGH 0x80c0FFFF
+     int '   XEMAC interrupt' CONFIG_XEMAC_IRQ 0
+   fi

Il faut alors modifier le fichier drivers/net/xemac.c pour prendre en compte ces nouveau paramètres :

- #define XEMAC_BASE 0x60000000

- #define XEMAC_LEN  0x3000
- #define XEMAC_IRQ  28
+ #define XEMAC_BASE CONFIG_XEMAC_BASE
+ #define XEMAC_LEN  CONFIG_XEMAC_HIGH - CONFIG_XEMAC_BASE + 1
+ #define XEMAC_IRQ  CONFIG_XEMAC_IRQ

Il faut faire de même pour l'adresse MAC du contrôleur réseau :

- dev->dev_addr[0]=0x00;
- dev->dev_addr[1]=0xE0;
- dev->dev_addr[2]=0x29;
- dev->dev_addr[3]=0x30;
- dev->dev_addr[4]=0xcc;
- dev->dev_addr[5]=0xe8;
+ dev->dev_addr[0]=(unsigned char)((CONFIG_XEMAC_MAC >> 40) & 0xFF);
+ dev->dev_addr[1]=(unsigned char)((CONFIG_XEMAC_MAC >> 32) & 0xFF);
+ dev->dev_addr[2]=(unsigned char)((CONFIG_XEMAC_MAC >> 24) & 0xFF);
+ dev->dev_addr[3]=(unsigned char)((CONFIG_XEMAC_MAC >> 16) & 0xFF);
+ dev->dev_addr[4]=(unsigned char)((CONFIG_XEMAC_MAC >> 8 ) & 0xFF);
+ dev->dev_addr[5]=(unsigned char)(CONFIG_XEMAC_MAC & 0xFF);

Il est écrit dans le fichier Changelog-2.4.20 du noyau Linux :

[net drivers] Rename MII lib API member, s/duplex_lock/force_media/, and update all drivers that reference this struct member.

Cela signifie qu'il faut substituer le motif duplex_lock par force_media. Il n'y a donc qu'une seule modification à effectuer dans drivers/net/xemac.c :

- if (!xp->mii.duplex_lock && mii_lpa != 0xffff) {
+ if (!xp->mii.force_media && mii_lpa != 0xffff) {
	

Attention, il faut que le paramètre C_MII_EXIST soit à zéro dans EDK pour que ce pilote fonctionne. Je ne peux malheureusement pas donner plus d'informations sur ce sujet car cette option n'est absolument pas documentée (j'ai trouvé par intuition cette solution en étudiant les sources).