Cette section donne des informations spécifiques sur les divers adaptateurs hôtes qui sont suportés d'une manière ou d'une autre sous Linux.
Pilotes des noyaux de distributions :
Adaptec 152x, Adaptec 154x (y compris les clones de Bustek et les cartes DTC 329x), Adaptec 174x, Adaptec 274x/284x/2940, les cartes se conformant au protocole EATA-DMA (toutes les DPT PMXXXXX/XX et SKXXXXX/XX sauf la PM2001, certaines cartes de NEC and ATT), Future Domain 850, 885, 950, et les autres cartes dans cette série (mais pas les 840, 880 et 881 à moins de faire le patch approprié), Future Domain 16x0 avec les circuits TMC-1800, TMC-18C30 ou TMC18C50, NCR53c8x, les ports SCSI de la PAS16, Seagate ST0x, Trantor T128/T130/T228, Ultrastor 14F, 24F et 34F, et Western Digital 7000.
Pilotes alpha : Richoh GSI-8
Nombre de pilotes alpha sont disponibles via FTP anonyme depuis ftp://tsx-11.mit.edu: /pub/linux/ALPHA/scsi
Pilotes en cours de développement, mais qui ne sont pas encore publiquement disponibles, et modifications nécessaires pour faire fonctionner des pilotes existants avec d'autres cartes : DPT PM2001
Les annonces SERONT effectuées quand les pilotes seront disponibles pour alpha tests publics. En attendant, ne faites pas perdre du temps aux développeurs en leur demandant par courrier des dates de sortie, etc.
Hôtes SCSI qui ne marchent pas :
Hôtes SCSI qui ne marcheront JAMAIS :
Si vous voulez faire tourner Linux sur un matériel non supporté, l'alternative consiste soit à écrire un pilote par vous-même (Eric Youngdale et moi-même sommes en général disposés à répondre aux questions techniques concernant les pilotes SCSI de Linux, soit d'en charger quelqu'un.
Avec certains adaptateurs (Cf. buyers guide : Guide d'achat : comparaison des caractéristiques), on peut utiliser plusieurs adaptateurs hôtes du même type dans le même système. Dans ce cas, c'est généralement celui qui se trouve à l'adresse la plus basse qui est scsi0, celui à l'adresse suivante est scsi1, etc.
Dans tous les cas, il est possible d'utiliser plusieurs adaptateurs de types différents, pourvu qu'aucune de leurs adresses n'entre en conflit avec les autres. Les contrôleurs SCSI sont scrutés dans l'ordre spécifié par le tableau builtin_scsi_hosts[ ] de drivers/scsi/hosts.c, l'ordre étant actuellement
Dans la plupart des cas (par exemple, si vous n'essayez pas d'utiliser à la fois des pilotes Buslogic et Adaptec), cette liste peut être changée à votre convenance (comme en gardant les mêmes périphériques quand de nouveaux sont ajoutés au système sur un nouveau contrôleur) en déplaçant les entrées individuelles.
Assurez-vous que les interruptions sont correctement autorisées, et qu'il n'y a aucun conflit d'IRQ, de DMA ou d'adresse avec d'autres cartes.
Si votre adaptateur SCSI est l'un des suivants :
et n'est pas détecté au démarrage, par exemple avec le message
scsi : 0 hosts
ou qu'un message
scsi%d : type
n'est pas affiché pour chaque adaptateur SCSI supporté, installé dans le système, votre problème réside peut-être dans la routine d'autodétection qui ne reconnaît pas votre carte.
L'autodétection échouera avec les pilotes qui utilisent le BIOS pour l'autodétection s'il est désactivé. Vérifiez que votre BIOS est activé, et n'entre pas en conflit avec d'autres BIOS de périphériques.
L'autodétection échouera si la ``signature'' de la carte et/ou l'adresse du BIOS ne correspondent pas à ce qu'attend la routine.
Si le BIOS est installé, utilisez le DOS et DEBUG pour trouver une signature qui repèrera votre carte -
Par exemple, si votre carte réside en 0xc8000, faites sous DOS
debug
d c800:0
q
et envoyez un message au canal SCSI de la liste de diffusion avec le message ASCII résultant, avec la longueur et l'offset depuis l'adresse de base (0xc8000 dans ce cas). Remarquez que le texte exact est requis, et que vous devez fournir les portions hexa et ASCII du texte.
Si aucun BIOS n'est installé et que vous utilisez un pilote Adaptec 152x, Trantor T128 ou Seagate, vous pouvez forcer la détection par une option de ligne de commande ou de compilation.
Consultez la sous-section appropriée concernant votre carte SCSI ainsi que general flaky .
(Y compris les cartes Trantor T128 et Seagate, mais pas les pilotes Adaptec, Generic NCR5380, PAS16 et Ultrastor)
Cela se produit souvent quand les ports d'E/S mappés en mémoire sont incorrectement cachés. L'espace d'adressage de la carte doit être marquée incachable dans le réglage XCMOS.
Si ce n'est pas possible, vous devrez entièrement désactiver le cache.
Si vous avez spécifié manuellement l'adresse de la carte, souvenez-vous que Linux a besoin de l'adresse réelle de la carte, et non du segment sur 16 bits auquel la documentation peut se référer. Par exemple, 0xc8000 serait correct, 0xc800 ne fonctionnerait pas et provoquerait une corruption de la mémoire.
sur une disquette contenant un pilote ALPHA
Il vous faudra éditer l'image binaire du noyau (avant ou après l'avoir écrit sur la disquette), et modifier quelques champs de deux octets (petit-boutien) afin de garantir son fonctionnement sur votre système.
3,5" : 0xA0 0x05
5,25" : 0xB0 0x04
Ecrivez le fichier sur une disquette par dd ou rawrite. Insérez la disquette dans le premier lecteur, attendez qu'il vous demande le root disk, et insérez celui de votre distribution.
Vous devez commencer avec la version du noyau utilisée par l'auteur du pilote. On trouve en général une référence à cette révision dans la documentation du pilote.
On trouve diverses révisions du noyau sur ftp://nic.funet.fi/pub/OS/Linux/PEOPLE/Linus
dans linux-version.tar.gz
Ils sont également mirrorisés sur tsx-11.mit.edu et d'autres sites.
cd /usr/src.
Enlevez vos anciens sources Linux, mais si vous voulez en garder une copie de sauvegarde
mv linux linux-old
Désarchivez
gunzip <linux-0.99.12.tar.gz | tar xvfp -
Appliquez les patches. Ils sont relatifs à un répertoire du système de fichiers. L'examen des lignes de fichier de sortie dans le fichier de patch permet de le repérer (grep sur ˆ---) ; par exemple, les patches avec ces lignes
--- ./kernel/blk_drv/scsi/Makefile
--- ./config.in Wed Sep 1 16:19:33 1993
ont leurs fichiers relatifs à /usr/src/linux.
Extrayez les sources des pilotes à l'endroit approprié. Vous pouvez entrer
tar tfv patches.tar
pour obtenir un listing, puis déplacer les fichiers (les fichiers de pilotes SCSI doivent résider en /usr/src/linux/ kernel/drivers/scsi).
Vous pouvez soit entrer dans le répertoire auquel ils sont relatifs et entrer
patch -p0 <patch_file
soit dire au patch d'enlever des composants de début du chemin. Par exemple, si les fichiers commencent par
--- linux-new/kernel/blk_drv/scsi/Makefile
et que vous voulez les appliquer dans /usr/src/linux, vous pouvez changer de répertoire vers /usr/src/linux et entrer
patch -p1 < patches
pour enlever le composant ``linux-new''.
Après avoir appliqué les patches, cherchez s'il y a des rejets de patch, qui prendront le nom du fichier rejeté avec un suffixe # ajouté.
find /usr/src/linux/ -name "*#" -print
S'il en existe, regardez-les. Dans certains cas, les différences tiendront aux identificateurs RCS et seront sans danger. Dans d'autres cas, il vous faudra appliquer manuellement d'importantes parties. Une documentation sur les fichiers diff et patch sont en dehors du champ d'application de ce document.
Voyez également canb kernel : Configuration et construction du noyau
Dans certains cas, l'auteur d'un pilote peut ne pas offrir de patches avec les fichiers .c et .h qui composent son pilote, ou les patches peuvent ne s'appliquer qu'à une vieille révision du noyau et ne pas s'intégrer proprement.
* SCSI low-level drivers
puis ajoutez une variable booléenne de configuration pour votre pilote. Par
exemple,
bool 'Always IN2000 SCSI support' CONFIG_SCSI_IN2000 y
ifdef CONFIG_SCSI_IN2000 SCSI_OBS := $(SCSI_OBJS) in2000.o SCSI_SRCS := $(SCSI_SRCS) in2000.c endif
scsi.a: $(SCSI_OBJS)
#ifdef CONFIG_SCSI_GENERIC_NCR5380 #include "g_NCR5380.h" #endif
#ifdef CONFIG_SCSI_IN2000 #include "in2000.h" #endif
#define IN2000 {"Always IN2000", in2000_detect, \ in2000_info, in2000_command, \ in2000_queuecommand, \ in2000_abort, \ in2000_reset, \ NULL, \ in2000_biosparam, \ 1, 7, IN2000_SG, 1, 0, 0}
#ifdef CONFIG_SCSI_GENERIC_NCR5380 GENERIC_NCR5380, #endif
#ifdef CONFIG_SCSI_IN2000 IN2000, #endif
0xd8000, 0xdc000, 0xd0000, 0xd4000, 0xc8000, 0xcc000, 0xe0 000, 0xe4000.
0x140, 0x340
9, 10, 11, 12
non utilisé.
port mapped
Fonctionne avec de nombreuses cartes comportant un BIOS. Toutes les autres cartes, y compris l'Adaptec 1510 et la Sound Blaster 16 SCSI, doivent utiliser la ligne de commande du noyau ou une option de compilation.
Aucun
Définir PORTBASE, IRQ, SCSI_ID, RECONNECT de façon appropriée, voir Définitions
aha152x=< PORTBASE> ,< IRQ> ,< SCSI-ID> , < RECONNECT> Généralement, SCSI-ID sera à 7 et RECONNECT différent de zéro. Pour forcer la détection à 0x340, IRQ 11, et SCSI-ID 7, en permettant la déconnexion/reconnexion, vous devez utiliser l'option de ligne de commande suivante :
aha152x=0x340,11,7,1
Le pilote échoue avec des cartes VLB. Il existait un problème de temporisation avec les noyaux antérieurs à la révision 1.0.5.
utiliser la configuration que renvoie le contrôleur (uniquement 152x)
forcer le canal d'interruption (9,10,11 or 12) (défaut 11)
forcer le scsiid de AIC-6260 (0-7) (défaut 7)
forcer la déconnexion/reconnexion/multiple
mettre à non-zéro pour activer, zéro pour désactiver.
Ne pas enregistrer les ports (pl12 et en-dessous)
Ne pas tester la signature du BIOS (AHA-1510 ou BIOS désactivé)
Forcer la base des ports. Ne pas essayer de détecter
0x330 et 0x334
9, 10, 11, 12, 14, 15
5, 6, 7
port mapped, bus master
fonctionne avec toutes les configurations supportées, ne demande pas de BIOS installé.
aucun
Les cartes sans suffixe, ainsi que les premières cartes dont le suffixe est 'A' ne supportent pas le scatter/gather, et ne fonctionnent donc pas. On peut cependant les faire plus ou moins fonctionner si AHA1542_SCATTER est mis à 0 dans drivers/scsi/aha1542.h.
Buslogic fabrique une série de cartes compatibles par logiciel avec l'Adaptec 1542, et celles-ci existent sous les formes ISA, VLB et EISA.
1-8
carte EISA, sans objet
9, 10, 11, 12, 14, 15
carte EISA, sans objet
port mapped, bus master
fonctionne avec toutes les configurations supportées
aucun
Cette carte n'est plus fabriquée par Adaptec.
Des révisions plus récentes peuvent être trouvées sur ftp://ftp.cpsc.ucalgary.ca /pub/systems/linux/aha274x/aha274x-pre-alpha.tar.gz
Configurations supportées :
1-12
Toutes
port mapped, bus master
Tous
Toutes
Tous
PCI
Le BIOS DOIT être activé
Le canal B des cartes 2742AT est ignoré.
Pilote ALPHA disponible sur ftp://tsx-11.mit.edu/pub/linux/ALPHA/SCSI/in2000 . Le pilote est in2000.tar.z, le noyau bootable est zImage
0x100, 0x110, 0x200, 0x220
10, 11, 14, 15
inutilisé
port mapped
BIOS non requis
aucun
Toutes celles qui supportent le protocole EATA-DMA (pas la PM2001).
PM2011 PM2012A PM2012B
PM2021 PM2022 PM2024 PM2122 PM2124 PM2322
PM3021 PM3222 PM3224 nombre de ces cartes sont aussi disponibles en version SKXXXX, qui sont également suportées.
Tous
Tous
Toutes, level & edge triggered
ISA ALL, EISA/PCI sans objet
port mapped, bus master
Tous
fonctionne avec toutes les configurations supportées
diskgeometry dans eata_dma.h pour les géométries inhabituelles provenant du vieil utilitaire DPTFMT. La dernière version du pilote EATA-DMA et un disque de démarrage Slackware devrait être disponible sur : ftp://ftp.uni-mainz.de/pub/Linux/arch/i386/system/EATA/
hd.c: ST-506 interface disk with more than 16 heads detected,
probably due to non-standard sector translation. Giving up.
(disk % d: cyl=% d, sect=63, head=64)
hdc: probing with STATUS instead of ALTSTATUS
hdc: MP0242 A, 0MB w/128KB Cache, CHS=0/0/0
hdc: cannot handle disk with 0 physical heads
hdd: probing with STATUS instead of ALTSTATUS
hdd: MP0242 A, 0MB w/128KB Cache, CHS=0/0/0
hdd: cannot handle disk with 0 physical heads
Si le pilote IDE se sent vraiment mal, c'est à dire que vous ne pouvez pas
accéder à votre (vrai) matériel IDE, changez le port d'E/S et/ou l'IRQ de la
carte EATA.
2.0, 3.0, 3.2, 3.4, 3.5
0xc8000, 0xca000, 0xce000, 0xde000
0x140, 0x150, 0x160, 0x170
3, 5, 10, 11, 12, 14, 15
inutilisé
port mapped
fonctionne avec toutes les configurations supportées, requiert un BIOS installé
aucun
tous
toutes
inutilisé
port mapped
aucune
Definir GENERIC_NCR5380_OVERRIDE en tant que tableau de n-uplets avec port, irq, dma, type de carte - par exemple
#define GENERIC_NCR5380_OVERRIDE {{0x330, 5, DMA_NONE, BOARD_NCR5380}}
pour une carte NCR5380 avec un port 330, IRQ 5.
#define GENERIC_NCR5380_OVERRIDE {{0x350, 5, DMA_NONE, BOARD_NCR53C400}}
pour une T130B avec un port 0x350.
Les anciennes versions du code éliminent l'entrée BOARD_* .
Les IRQ symboliques IRQ_NONE and IRQ_AUTO peuvent être utilisées.
ncr53480=0x358,254
sur la ligne de commande du noyau.
le pilote générique ne supporte pas encore le DMA, ni le pseudo-DMA.
Toutes
Toutes
PCI, sans objet
port mapped, bus mastering
requiert un BIOS PCI et en utilise les routines pour rechercher les périphériques et lire l'espace de configuration
Le pilote utilise les valeurs préprogrammées dans certains registres à l'initialisation, un BIOS doit donc être installé.
0xc8000, 0xca000, 0xcc000, 0xce000, 0xdc000, 0xde000
3, 5
inutilisé
memory mapped
ne recherche que l'adresse, l'IRQ est censée être 5, demande un BIOS installé.
Définir OVERRIDE par l'adresse de base, CONTROLLER par FD ou SEAGATE selon le cas, et IRQ par l'IRQ.
st0x=adresse,irq ou tmc8xx=adresse,irq
(ne fonctionne que pour .99.13b et au-delà)
Ceux-ci se produisent quand Linux essaye de lire la table de partition ou au cours d'autres accès aux disques.
La carte est livrée réglée par défaut pour MS-DOS, c'est à dire que les interruptions sont désactivées. Pour les réactiver sur la Seagate, utilisez le cavalier W3 (ST01) ou JP3 (ST02) et connectez les broches F-G pour sélectionner l'IRQ 5.
Le pilote ne peut pas gérer certains périphériques, en particulier les lecteurs de bandes et les CD-ROM bas de gamme.
La Seagate relie le handshaking REQ/ACK du bus SCSI aux signaux IO CHANNEL READY et (optionnellement) OWS du bus du PC. Elle ne vous dit malheureusement pas quand le compteur du chien de garde s'arrête, et il n'y a pas moyen d'être sûr que REQ est descendu, et vous pouvez finir par voir un pulse REQ comme plusieurs pulses.
La solution implique l'utilisation d'une courte boucle destinée à voir si REQ est descendu, avec un timeout au cas où on n'attrape pas la transition due à une interruption, etc. Il en résulte une dégradation des performances, et il n'est donc pas désirable de l'appliquer à tous les périphériques SCSI. Elle est sélectionnée pour chaque périphérique avec le champ ``borken'' du périphérique SCSI concerné dans le tableau scsi_devices. En cas de problèmes, vous devriez essayer d'ajouter votre périphérique à la liste de ceux pour lesquels borken n'est pas remis à zéro (actuellement, uniquement les CD-ROM TENEX).
Une carte Future Domain (comme les 840, 841, 880 et 881) ne fonctionne pas.
Quelques cartes Future Domain utilisent le mapping de registre de la Seagate, et les bits MSG et CD du registre d'état sont échangés.
Il faut éditer seagate.h, échanger les définitions de STAT_MSG et de STAT_CD, et recompiler le noyau avec CONTROLLER défini en SEAGATE, IRQ et OVERRIDE étant correctement spécifiés.
Des messages d'erreurs s'affichent pendant le fdisk du disque, indiquant que les ioctl HDIO_REQ ou HDIO_GETGEO ont échoué...
Il faut préciser les têtes, les secteurs et les cylindres. Vous pouvez le faire depuis le menu de fonctions supplémentaires. Voyez la section partitioning : Partitionnement
Après avoir spécifié manuellement la géométrie du disque, les tentatives ultérieures de lectures de la table de partition se soldent par des messages d'erreur du type : limite de partition hors d'une limite de cylindre, les limites physiques ne concordent pas (partition boundary not on a cylinder boundary, physical and logical boundaries don't match), etc.
Voir la section partitioning : Partitionnement
Certains systèmes qui fonctionnaient avant la .99.13 échouent avec les nouvelles versions de Linux. Les anciennes versions assignaient les registres CONTROL et DATA dans un ordre différent de celui de la documentation, ce qui plantait certains systèmes. Les nouvelles versions assignent correctement les registres, mais cela plante d'autres systèmes.
Le code de seagate.c ressemble actuellement à ceci :
cli(); DATA = (unsigned char) ((1<<target) | (controller_type == SEAGATE ? 0x80 : 0x40)); CONTROL = BASE_CMD | CMD_DRVR_ENABLE | CMD_SEL | (reselect ? CMD_ATTN : 0); sti();
Il se peut que le changer en
cli(); CONTROL = BASE_CMD | CMD_DRVR_ENABLE | CMD_SEL | (reselect ? CMD_ATTN : 0); DATA = (unsigned char) ((1 <<target) | (controller_type == SEAGATE ? 0x80 : 0x40)); sti()
résolve votre problème.
FAST ou FAST32 utiliseront les transferts aveugles chaque fois que possible.
ARBITRATE fera arbitrer le bus par l'adaptateur hôte pour une meilleure compatibilité SCSI-II, au lieu de se contenter d'attendre BUS FREE pour faire son boulot. Devrait nous permettre une commande par Lun quand j'intégrerai ma réorganisation dans les sources de distribution.
SLOW_HANDSHAKE permettra la compatibilité avec des périphériques défectueux qui ne pratiquent pas un handshake assez rapide (comme certains CD-ROM) pour le code Seagate.
SLOW_RATE=x, x étant un nombre, vous permettra de spécifier une vitesse de transfert par défaut si le handshaking ne fonctionne pas correctement.
0x388, 0x384, 0x38x, 0x288
10, 12, 14, 15
Les IRQ DOIVENT être différentes de celles utilisées pour la partie son de la carte.
inutilisé pour la partie SCSI de la carte
port mapped
ne requiert pas de BIOS
Definir PAS16_OVERRIDE comme un tableau de n-uplets de port,irq. Par exemple,
#define PAS16_OVERRIDE {{0x388, 10}}
pour une carte en port 0x388, IRQ 10.
pas16=port,irq
0xcc000, 00xc8000, 0xdc000, 0xd8000
inutilisé
memory mapped
fonctionne pour toutes les configurations supportées, requiert un BIOS installé.
Définit T128_OVERRIDE en tant que tableau de n-uplets adresse,irq. Par exemple
#define T128_OVERRIDE {{0xcc000, 5}}
Pour une carte à l'adresse 0xcc000, IRQ 5.
Les IRQs symboliques IRQ_NONE et IRQ_AUTO peuvent être utilisées.
t128=adresse,irq
-1 peut être utilisé pour aucune irq, -2 pour l'autodétection.
s'il est défini, REQUEST SENSE sera exécuté automatiquement pour les commandes qui renvoient un statut CHECK CONDITION.
active le matériel pseudo-DMA, devrait donner une amélioration des performances de l'ordre de 3-4X par rapport aux E/S pollées.
active la vérification de parité. Non supporté.
active le support du tagged queuing SCSI-II. Non testé.
laisse les interruptions activées pendant les transferts pseudo-DMA. Ne l'utiliser que si vous avez un problème de caractères perdus pendant des communications à haute vitesse, et même dans ce cas, vous vous en sortirez mieux en modifiant transfersize.
active le support des périphériques qui ne se déconnectent pas. Non testé.
0x130, 0x140, 0x210, 0x230, 0x240, 0x310, 0x330, 0x340
10, 11, 14, 15
5, 6, 7
port mapped, bus master
ne fonctionne pas pour les cartes au port 0x310, BIOS non requis.
uniquement à la compilation, définir PORT_OVERRIDE.
hd.c: ST-506 interface disk with more than 16 heads detected,
probably due to non-standard sector translation. Giving up.
(disk %d: cyl=%d, sect=63, head=64)
Si tel est le cas, vous faites tourner une carte Ultrastor en mode
d'émulation WD1003. Il vous faut
hd=cylindres,tetes,secteurs
pour forcer les réglages par défaut pour démarrer, en gardant le nombre de
cylindres < =2048, le nombre de têtes <= 16, et le nombre de secteurs
<= 255 pour que cylindres * têtes * secteurs soit le même pour les deux
géométries.
Vous devrez également spécifier la géométrie du disque en lançant fdisk sous
Linux. Dans le cas contraire, des entrées de partitions incorrectes seront
écrites, qui fonctionneront correctement sous Linux mais échoueront sous MS-
DOS qui se sert des entrées de cylindres/têtes/secteurs dans la table.
Une fois Linux lancé, on peut éviter de devoir démarrer à la main en
recompilant le noyau avec une macro correctement définie dans
include/linux/config.h.
0xce000
0x350
15
6
port mapped, bus master
requiert un BIOS installé
Chapitre suivant, Chapitre Précédent
Table des matières de ce chapitre, Table des matières générale
Début du document, Début de ce chapitre