Compiler un module pour le support Serial ATA


#1

Bonjour,

J’ai un nouveau PC avec un chipset ULi M5289.
J’ai trouvé les modules qui se sont installés correctement sur une Fedora FC2.

J’ai les modules précompilés pour: FC2, Redhat 9, Suse 9 et (soit disant…) pour kernel generic 2.6.8
Le problème est que j’utilise plutôt debian … Et que je suis en 64 bits… (Athlon 64)

Et bien sûr, le kernel m’insulte quand j’essaye de faire um modprobe du module fourni …

J’ai aussi essayé le module pour kernel generic 2.6.8 sur une install en 32 bits. Il me dit qu’il n’est pas au bon format…

Quelqu’un pourrait-il me donner un coup de main pour recompiler ce module pour un kernel 2.6.8 en 64 bits ?

Je suis en Sarge et j’aimerais pouvoir compiler ce module pour le kernel
2.6.8

Merci d’avance pour votre aide !

Jabba

Voici le source ci-dessous:

[jeannot@aspirateur 2.6.8]$ cat sata_uli.c
/*

* sata_uli.c - ULi Electronics SATA
*
* The contents of this file are subject to the Open
* Software License version 1.1 that can be found at
* [www.opensource.org] and is included herein
* by reference.
*
* Alternatively, the contents of this file may be used under the terms
* of the GNU General Public License version 2 (the "GPL") as distributed
* in the kernel source COPYING file, in which case the provisions of
* the GPL are applicable instead of the above. If you wish to allow
* the use of your version of this file only under the terms of the
* GPL and not to allow others to use your version of this file under
* the OSL, indicate your decision by deleting the provisions above and
* replace them with the notice and other provisions required by the GPL.
* If you do not delete the provisions above, a recipient may use your
* version of this file under either the OSL or the GPL.
*
* /

#include <linux/config.h>
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/pci.h>
#include <linux/init.h>
#include <linux/blkdev.h>
#include <linux/delay.h>
#include <linux/interrupt.h>
#include “scsi.h”
#include <scsi/scsi_host.h>
#include <linux/libata.h>

#define DRV_NAME “sata_uli”
#define DRV_VERSION “0.10”

enum {
uli_5289 = 0,
uli_5287 = 1,

/* PCI configuration registers /
ULI_SCR_BASE = 0x90, /
sata0 phy SCR registers /
ULI_SATA1_OFS = 0x10, /
offset from sata0->sata1 phy regs */

};

static int uli_init_one (struct pci_dev *pdev, const struct pci_device_id *ent);
static u32 uli_scr_read (struct ata_port *ap, unsigned int sc_reg);
static void uli_scr_write (struct ata_port *ap, unsigned int sc_reg, u32 val);

static struct pci_device_id uli_pci_tbl[] = {
{ PCI_VENDOR_ID_AL, 0x5289, PCI_ANY_ID, PCI_ANY_ID, 0, 0, uli_5289 },
{ PCI_VENDOR_ID_AL, 0x5287, PCI_ANY_ID, PCI_ANY_ID, 0, 0, uli_5287 },
{ } /* terminate list */
};

static struct pci_driver uli_pci_driver = {
.name = DRV_NAME,
.id_table = uli_pci_tbl,
.probe = uli_init_one,
.remove = ata_pci_remove_one,
};

static Scsi_Host_Template uli_sht = {
.module = THIS_MODULE,
.name = DRV_NAME,
.queuecommand = ata_scsi_queuecmd,
.eh_strategy_handler = ata_scsi_error,
.can_queue = ATA_DEF_QUEUE,
.this_id = ATA_SHT_THIS_ID,
.sg_tablesize = ATA_MAX_PRD,
.max_sectors = ATA_MAX_SECTORS,
.cmd_per_lun = ATA_SHT_CMD_PER_LUN,
.emulated = ATA_SHT_EMULATED,
.use_clustering = ATA_SHT_USE_CLUSTERING,
.proc_name = DRV_NAME,
.dma_boundary = ATA_DMA_BOUNDARY,
.slave_configure = ata_scsi_slave_config,
.bios_param = ata_std_bios_param,
};

static struct ata_port_operations uli_ops = {
.port_disable = ata_port_disable,
.tf_load = ata_tf_load_pio,
.tf_read = ata_tf_read_pio,
.check_status = ata_check_status_pio,
.exec_command = ata_exec_command_pio,
.phy_reset = sata_phy_reset,
.bmdma_setup = ata_bmdma_setup_pio,
.bmdma_start = ata_bmdma_start_pio,
.qc_prep = ata_qc_prep,
.qc_issue = ata_qc_issue_prot,
.eng_timeout = ata_eng_timeout,
.irq_handler = ata_interrupt,
.irq_clear = ata_bmdma_irq_clear,
.scr_read = uli_scr_read,
.scr_write = uli_scr_write,
.port_start = ata_port_start,
.port_stop = ata_port_stop,
};

MODULE_AUTHOR(“Peer Chen”);
MODULE_DESCRIPTION(“low-level driver for ULi Electronics SATA controller”);
MODULE_LICENSE(“GPL”);
MODULE_DEVICE_TABLE(pci, uli_pci_tbl);

static unsigned int get_scr_cfg_addr(unsigned int port_no, unsigned int sc_reg)
{
unsigned int addr = ULI_SCR_BASE + (4 * sc_reg);

switch (port_no) {
case 0:
break;
case 1:
addr += ULI_SATA1_OFS;
break;
case 2:
addr += ULI_SATA1_OFS4;
break;
case 3:
addr += ULI_SATA1_OFS
5;
break;
default:
BUG();
break;
}
return addr;
}

static u32 uli_scr_cfg_read (struct ata_port *ap, unsigned int sc_reg)
{
unsigned int cfg_addr = get_scr_cfg_addr(ap->port_no, sc_reg);
u32 val;

pci_read_config_dword(ap->host_set->pdev, cfg_addr, &val);
return val;
}

static void uli_scr_cfg_write (struct ata_port *ap, unsigned int scr, u32 val)
{
unsigned int cfg_addr = get_scr_cfg_addr(ap->port_no, scr);

pci_write_config_dword(ap->host_set->pdev, cfg_addr, val);
}

static u32 uli_scr_read (struct ata_port *ap, unsigned int sc_reg)
{
if (sc_reg > SCR_CONTROL)
return 0xffffffffU;

return uli_scr_cfg_read(ap, sc_reg);
}

static void uli_scr_write (struct ata_port *ap, unsigned int sc_reg, u32 val)
{
if (sc_reg > SCR_CONTROL) //SCR_CONTROL=2, SCR_ERROR=1, SCR_STATUS=0
return;

uli_scr_cfg_write(ap, sc_reg, val);
}

/* move to PCI layer, integrate w/ MSI stuff */
static void pci_enable_intx(struct pci_dev *pdev)
{
u16 pci_command;

pci_read_config_word(pdev, PCI_COMMAND, &pci_command);
if (pci_command & PCI_COMMAND_INTX_DISABLE) {
pci_command &= ~PCI_COMMAND_INTX_DISABLE;
pci_write_config_word(pdev, PCI_COMMAND, pci_command);
}
}

static int uli_init_one (struct pci_dev *pdev, const struct pci_device_id *ent)
{
struct ata_probe_ent *probe_ent = NULL;
int rc;
unsigned int board_idx = (unsigned int) ent->driver_data;

rc = pci_enable_device(pdev);
if (rc)
return rc;

rc = pci_request_regions(pdev, DRV_NAME);
if (rc)
goto err_out;

rc = pci_set_dma_mask(pdev, ATA_DMA_MASK);
if (rc)
goto err_out_regions;
rc = pci_set_consistent_dma_mask(pdev, ATA_DMA_MASK);
if (rc)
goto err_out_regions;

probe_ent = kmalloc(sizeof(*probe_ent), GFP_KERNEL);
if (!probe_ent) {
rc = -ENOMEM;
goto err_out_regions;
}

memset(probe_ent, 0, sizeof(*probe_ent));
probe_ent->pdev = pdev;
INIT_LIST_HEAD(&probe_ent->node);

probe_ent->sht = &uli_sht;
probe_ent->host_flags = ATA_FLAG_SATA | ATA_FLAG_SATA_RESET |
ATA_FLAG_NO_LEGACY;

probe_ent->pio_mask = 0x03; //support pio mode 4
probe_ent->udma_mask = 0x7f; //support udma mode 6
probe_ent->port_ops = &uli_ops;
probe_ent->irq = pdev->irq;
probe_ent->irq_flags = SA_SHIRQ;

probe_ent->port[0].cmd_addr = pci_resource_start(pdev, 0);
ata_std_ports(&probe_ent->port[0]);
probe_ent->port[0].ctl_addr =
pci_resource_start(pdev, 1) | ATA_PCI_CTL_OFS;
probe_ent->port[0].bmdma_addr = pci_resource_start(pdev, 4);

probe_ent->port[1].cmd_addr = pci_resource_start(pdev, 2);
ata_std_ports(&probe_ent->port[1]);
probe_ent->port[1].ctl_addr =
pci_resource_start(pdev, 3) | ATA_PCI_CTL_OFS;
probe_ent->port[1].bmdma_addr = pci_resource_start(pdev, 4) + 8;

switch (board_idx) {
case uli_5287:
probe_ent->n_ports = 4;

probe_ent->port[2].cmd_addr = pci_resource_start(pdev, 0) + 8;
ata_std_ports(&probe_ent->port[2]);
probe_ent->port[2].ctl_addr =
(pci_resource_start(pdev, 1) | ATA_PCI_CTL_OFS) + 4;
probe_ent->port[2].bmdma_addr = pci_resource_start(pdev, 4) + 16;

probe_ent->port[3].cmd_addr = pci_resource_start(pdev, 2) + 8;
ata_std_ports(&probe_ent->port[3]);
probe_ent->port[3].ctl_addr =
(pci_resource_start(pdev, 3) | ATA_PCI_CTL_OFS) + 4;
probe_ent->port[3].bmdma_addr = pci_resource_start(pdev, 4) + 24;

break;
case uli_5289:
probe_ent->n_ports = 2;
break;
default:
BUG();
break;
}
pci_set_master(pdev);
pci_enable_intx(pdev);

/* FIXME: check ata_device_add return value */
ata_device_add(probe_ent);
kfree(probe_ent);

return 0;

err_out_regions:
pci_release_regions(pdev);

err_out:
pci_disable_device(pdev);
return rc;

}

static int __init uli_init(void)
{
return pci_module_init(&uli_pci_driver);
}

static void __exit uli_exit(void)
{
pci_unregister_driver(&uli_pci_driver);
}

module_init(uli_init);
module_exit(uli_exit);
[jeannot@aspirateur 2.6.8]$


#2

il est venu tout seul ? sec, sans makefile, ton source ?
tout ce que j’ai vu concernant sata_uli c’est que c’était dans le 2.4, et j’en ai vu des traces en 2.6.10-rc1.
Parceque sinon, il faut configurer un Makefile de module.
pour comprendre, c’est tiré de
tldp.org/LDP/lkmpg/2.6/html/

Example 2-2. Makefile for a basic kernel module
obj-m += hello-1.o                                                           

Now you can compile the module by issuing the command make -C /usr/src/linux-
`uname -r` SUBDIRS=$PWD modules . You should obtain an output which resembles
the following:
+--------------------------------------------------------------------------------------+
|[root@pcsenonsrv test_module]# make -C /usr/src/linux-`uname -r` SUBDIRS=$PWD modules |
|make: Entering directory `/usr/src/linux-2.6.x                                        |
|  CC [M]  /root/test_module/hello-1.o                                                 |
|  Building modules, stage 2.                                                          |
|  MODPOST                                                                             |
|  CC      /root/test_module/hello-1.mod.o                                             |
|  LD [M]  /root/test_module/hello-1.ko                                                |
|make: Leaving directory `/usr/src/linux-2.6.x                                         |
|                                                                                      |
+--------------------------------------------------------------------------------------+

sinon, ensuite, une fois que ca marche :slightly_smiling: il faut mettre ca au clean, le ranger dans /usr/src/modules, et avec un peu de chance, le prochain ‘make-kpkg modules’ te fabriqueras un .deb correspondant.
Pis avec un peu de courage, rajouter des ti fichiers pour la GPL, la doc sur ce que tu auras retouché, et les credits, et tu réempaquetes ca pour la postèrité…


#3

Salut MattOTop

Alors, toujours fidèle au poste à ce que je vois … :smiley:

Ben ouais, le fichier source tout seul … :frowning:

Ok, je vais essayer le lien que tu m’as fournis pour recompiler.
Sinon, tu dis que c’était dans le 2.4 ? Dans quelle release ?

J’ai trouvé plusieurs modules sata dans la 2.6.x mais par pour sata_uli… Enfin, ca m’a peut-être échappé …

Je vais essayer de recompiler la 2.6.10 pour voir ce que ca donne …

Merci encore et bonne soirée

Jabba


#4

te casses pas, sinon, ce que je t’ai mis en extrait dans mon post precedent devrait marcher au moins pour voir: tu met ds un même répertoire ton .c et un Makefile avec juste:

obj-m += sata_uli.o

ensuite, dans ce répertoire, tu fais un
make -C /usr/src/linux-uname -r SUBDIRS=$PWD modules

et il devrait te produire un .ko que tu pourra tenter d’insmod 'er dans ton noyau.
aprés faut mettre au clean, mais déja, tu auras ton module…
++


#5

Merci pour l’info, dès que j’ai ma machine debian sous la main je vais essayer tout ca et je te tiens au courant.

A+


#6

c’est bien ce que je pensais, j’ai recopié bètement, pour une debian, c’est
make -C /usr/src/kernel-source-uname -r SUBDIRS=$PWD modules


#7

C’est noté … Merci encore !


#8

Ouaip, je commence à en avoir + que raz le Q de cette saleté de SATA … :imp:

Encore possible d’obtenir un pt’it coup de main ?

Voici ma config actuelle, je suis en ubuntu et j’ai un kernel generic 64 bits pour le moment. N’ayant pas retrouvé le source du kernel installé par ma distrib. J’ai récupéré les sources du kernel sur kernel.org.

root@ubuntutest1:~/temp # pwd
/root/temp
root@ubuntutest1:~/temp # ls -l
total 16
-rw-r–r-- 1 root root 20 2004-12-18 21:17 Makefile
drwxr-xr-x 2 root root 4096 2004-12-18 18:21 modules
-rw-r–r-- 1 root root 7866 2004-12-18 21:17 sata_uli.c
root@ubuntutest1:~/temp # ls -l /usr/src
total 196344
lrwxrwxrwx 1 root src 13 2004-12-18 21:02 linux -> linux-2.6.8.1
drwxrwxr-x 18 500 500 4096 2004-08-14 12:56 linux-2.6.8.1
-rw-r–r-- 1 root src 200847360 2004-12-18 21:00 linux-2.6.8.1.tar
drwxr-xr-x 7 root root 4096 2004-12-12 17:09 rpm
root@ubuntutest1:~/temp # pwd
/root/temp
root@ubuntutest1:~/temp # uname -a
Linux ubuntutest1 2.6.8.1-3-amd64-generic #1 Tue Oct 12 11:40:38 UTC 2004 x86_64 GNU/Linux
root@ubuntutest1:~/temp #

J’ai fait le Makefile comme tu as proposé:

root@ubuntutest1:~/temp # cat Makefile
obj-m += sata_uli.o
root@ubuntutest1:~/temp #

Et compilé:

root@ubuntutest1:~/temp # make -C /usr/src/linux SUBDIRS=$PWD modules 2>error.log
make: entrant dans le répertoire « /usr/src/linux-2.6.8.1 »
CC [M] /root/temp/sata_uli.o
make: quittant le répertoire « /usr/src/linux-2.6.8.1 »
root@ubuntutest1:~/temp #

root@ubuntutest1:~/temp # ls -l
total 300
-rw-r–r-- 1 root root 283656 2004-12-18 21:33 error.log
-rw-r–r-- 1 root root 20 2004-12-18 21:17 Makefile
drwxr-xr-x 2 root root 4096 2004-12-18 18:21 modules
-rw-r–r-- 1 root root 7866 2004-12-18 21:17 sata_uli.c
root@ubuntutest1:~/temp # du -sh error.log
284K error.log
root@ubuntutest1:~/temp # ls modules/
root@ubuntutest1:~/temp #

On voit dans mon log qu’il ne trouve pas les headers qui sont déclarés dans le programme C :

 22 #include <linux/config.h>
 23 #include <linux/kernel.h>
 24 #include <linux/module.h>
 25 #include <linux/pci.h>
 26 #include <linux/init.h>
 27 #include <linux/blkdev.h>
 28 #include <linux/delay.h>
 29 #include <linux/interrupt.h>
 30 #include "scsi.h"
 31 #include <scsi/scsi_host.h>
 32 #include <linux/libata.h>

–> Ils sont stockés ou les headers C sous Linux ?

Encore désolé de continuer à vous “pomper l’air” avec mon problème de module

Bonne soirée

Jabba

Voici un petit bout de mon log d’erreur:

Makefile:415: .config: Aucun fichier ou répertoire de ce type
Dans le fichier inclus à partir de /root/temp/sata_uli.c:22:
include/linux/config.h:4:28: linux/autoconf.h : Aucun fichier ou répertoire de ce type
Dans le fichier inclus à partir de include/linux/kernel.h:11,
à partir de /root/temp/sata_uli.c:23:
include/linux/linkage.h:5:25: asm/linkage.h : Aucun fichier ou répertoire de ce type
Dans le fichier inclus à partir de include/linux/types.h:13,
à partir de include/linux/kernel.h:13,
à partir de /root/temp/sata_uli.c:23:
include/linux/posix_types.h:47:29: asm/posix_types.h : Aucun fichier ou répertoire de ce type
Dans le fichier inclus à partir de include/linux/kernel.h:13,
à partir de /root/temp/sata_uli.c:23:
include/linux/types.h:14:23: asm/types.h : Aucun fichier ou répertoire de ce type
In file included from include/linux/kernel.h:13,
from /root/temp/sata_uli.c:23:
include/linux/types.h:18: error: erreur d’analyse syntaxique before "__kernel_dev_t"
include/linux/types.h:18: attention : type defaults to int' in declaration of__kernel_dev_t’
include/linux/types.h:18: attention : data definition has no type or storage class
include/linux/types.h:21: error: erreur d’analyse syntaxique before "dev_t"
include/linux/types.h:21: attention : type defaults to int' in declaration ofdev_t’
include/linux/types.h:21: attention : data definition has no type or storage class
include/linux/types.h:22: error: erreur d’analyse syntaxique before "ino_t"
include/linux/types.h:22: attention : type defaults to int' in declaration ofino_t’
include/linux/types.h:22: attention : data definition has no type or storage class
include/linux/types.h:23: error: erreur d’analyse syntaxique before "mode_t"
include/linux/types.h:23: attention : type defaults to int' in declaration ofmode_t’
include/linux/types.h:23: attention : data definition has no type or storage class
include/linux/types.h:24: error: erreur d’analyse syntaxique before "nlink_t"
include/linux/types.h:24: attention : type defaults to int' in declaration ofnlink_t’
include/linux/types.h:24: attention : data definition has no type or storage class



include/linux/fs.h:574: error: storage size of f_owner' isn't known include/linux/fs.h:745: error: storage size ofs_umount’ isn’t known
include/linux/fs.h:746: error: storage size of s_lock' isn't known include/linux/fs.h:773: error: storage size ofs_vfs_rename_sem’ isn’t known
include/linux/libata.h:283: error: storage size of device' isn't known /root/temp/sata_uli.c:83: error: storage size ofuli_ops’ isn’t known
make[1]: *** [/root/temp/sata_uli.o] Erreur 1
make: *** [module/root/temp] Erreur 2


#9

[quote=“Jabba”]
–> Ils sont stockés ou les headers C sous Linux ?
[/quote]
c’est la bonne question !!!
il les prend bien évidement dans /usr/src/linux (d’ou le -C /usr/src/linux, qui execute le make aprés déplacement dans ledit répertoire), càd dans la racine de l’arborescence d’un noyau COMPILE (ou au moins configuré sous debian).
Dc de deux choses l’une:
ou bien tu n’as pas de répertoire ou de lien /usr/src/linux,
ou bien tu n’as pas fais de menuconfig ou de xconfig.
c’est censé marcher aussi avec le répertoire des paquetages “headers” sous debian, mais je n’ai jamais réussi à les utiliser.


#10

Bonjour tout le monde,

Eh oui, encore moi avec mon histoire de Serial ATA, mais rassurez-vous c’est tout bon.
Désolé de ne pas avoir donné de nouvelles plus tôt mais je viens seulement de "m’y remettre …

En ce qui concerne le serial ATA, le problème est réglé (merci MattOTop … :slightly_smiling:

ULi vient de publier une nouvelle version de leur source avec toutes les instructions pour l’intégrer aux sources du noyau, donc ca facilite bien les choses …

Pour résumer:

  1. Install standard sur un disque IDE
  2. recompil du kernel de cette install pour activer le support serial ATA
  3. Au reboot, les disques S-ATA sont reconnus sans problème.
  4. Debootstrap depuis le disque IDE sur le disque S-ATA
  5. recompil. du kernel sur le disque S-ATA pour activer le support S-ATA
  6. reboot directement sur le disque S-ATA et ca fonctionne impec…

Encore 2 pt’ites questions:

  1. Quand je fais un fdisk -l (sans argument) si j’ai une clé USB connectée à ce moment là, le PC se fige et il ne reste plus qu’à faire un POWER-OFF bien sale …

I aurait-il une option qui corrige ce problème dans le kernel ?

  1. J’ai repris les sources du kernel modifié qui incluent le support du S-ATA que j’avait fait sur le disque IDE.
    J’ai copié ces sources sur le disque S-ATA et quand je fais le make-kpkg clean:

burp:/usr/src/linux# make-kpkg clean
unable to get login information for username “jeannot” at /usr/lib/dpkg/controllib.pl line 59.
Compilation failed in require at /usr/bin/dpkg-architecture line 48.
unable to get login information for username “jeannot” at /usr/lib/dpkg/controllib.pl line 59.
Compilation failed in require at /usr/bin/dpkg-architecture line 48.
Compilation failed in require at /usr/bin/dpkg-architecture line 48.
unable to get login information for username “jeannot” at /usr/lib/dpkg/controllib.pl line 59.
Compilation failed in require at /usr/bin/dpkg-architecture line 48.
debian/rules:1501: *** Error. I do not know where the kernel image goes to [kimagedest undefined] The usual case for this is that I could not determine which arch or subarch tihs machine belongs to. Please specify a subarch, and try again… Arr\ufffft.
burp:/usr/src/linux# vi /usr/lib/dpkg/controllib.pl

le fichier controllib.pl en question:

if (defined ($ENV{‘LOGNAME’})) {
@fowner = getpwnam ($ENV{‘LOGNAME’});
if (! @fowner) { die (sprintf (‘unable to get login information for username “%s”’, $ENV{‘LOGNAME’})); }
} elsif (defined ($getlogin)) {
@fowner = getpwnam ($getlogin);
if (! @fowner) { die (sprintf (‘unable to get login information for username “%s”’, $getlogin)); }
} else {
&warn (sprintf (‘no utmp entry available and LOGNAME not defined; using uid of process (%d)’, $<));
@fowner = getpwuid ($<);
if (! @fowner) { die (sprintf (‘unable to get login information for uid %d’, $<)); }
}

–> Tout ça parce que le user “jeannot” n’existe pas sur mon installation S-ATA !?!
–> Je créé donc le fameux user et ça passe … :unamused:
–> Même si j’avais été loggué en tant que “jeannot” pour la première compil (sur IDE) qu’est-ce que le username vient foutre la-dedans ?
et en plus j’avais compilé en root …

Merci encore pour ton aide et bonne soirée

Jabbaa


#11

1/?
2/
???
pour une vérification de droits ?
ou chercher des configs personnalisées dans le rep de l’user (arch) ??
peut etre qu’il y en a besoin pour loguer les compils quelque part avec le nom de l’user ???
il peut y avoir d’autres raison. Je ne sais pas trop je te l’avoue.


#12

Effectivement, cette histoire de droits, ca reste une énigme …

Si tu cherches du boulot, tu as essayé chez Sun ? Je sais qu’au niveau européen, ils centralisent la majeure partie de leur support technique en Espagne ET en France. Seul un petit team de support restera dans chaque pays (pour les gros clients et les cas critiques)

Je suis de plus en plus en contact avec des gens basés dans ces 2 pays lors de mes appels au support technique.

Et il me semble qu’ils sont de plus en plus intéressés par des experts linux, alors … :smiley:


#13

concernant le boulot, je disais à casper “off topic” que j’etait malheureusement difficilement bougeable de CAEN autrement que pour des missions courtes pour environ un an :frowning: . C’est un peu pour ca que j’ai du mal.

Merci tt de meme pour le tuyau, je vais aller voir les recrutements chez sun (même si je ne suis pas fan des corporations, une piste est une piste).