Re: ATA-Controller aussuchen

From: Marc Santhoff <M.Santhoff(at)t-online.de>
Date: Fri, 27 Apr 2007 20:29:11 +0200

Am Freitag, den 27.04.2007, 19:47 +0200 schrieb Bernd Walter:
> On Fri, Apr 27, 2007 at 06:52:20PM +0200, Marc Santhoff wrote:
> > Am Freitag, den 27.04.2007, 17:36 +0200 schrieb Bernd Walter:
> > > Weder noch - es ist ein Workaround im Treiber:
> > > static void
> > > ata_sata_setmode(device_t dev, int mode)
> > > {
> > > struct ata_device *atadev = device_get_softc(dev);
> > >
> > > /*
> > > * if we detect that the device isn't a real SATA device we limit
> > > * the transfer mode to UDMA5/ATA100.
> > > * this works around the problems some devices has with the
> > > * Marvell 88SX8030 SATA->PATA converters and UDMA6/ATA133.
> > > */
> > > if (atadev->param.satacapabilities != 0x0000 &&
> > > atadev->param.satacapabilities != 0xffff) {
> > > struct ata_channel *ch = device_get_softc(device_get_parent(dev));
> > >
> > > /* on some drives we need to set the transfer mode */
> > > ata_controlcmd(dev, ATA_SETFEATURES, ATA_SF_SETXFER, 0,
> > > ata_limit_mode(dev, mode, ATA_UDMA6));
> > >
> > > /* query SATA STATUS for the speed */
> > > if (ch->r_io[ATA_SSTATUS].res &&
> > > ((ATA_IDX_INL(ch, ATA_SSTATUS) & ATA_SS_CONWELL_MASK) ==
> > > ATA_SS_CONWELL_GEN2))
> > > atadev->mode = ATA_SA300;
> > > else
> > > atadev->mode = ATA_SA150;
> > > }
> > > else {
> > > mode = ata_limit_mode(dev, mode, ATA_UDMA5);
> > > if (!ata_controlcmd(dev, ATA_SETFEATURES, ATA_SF_SETXFER, 0, mode))
> > > atadev->mode = mode;
> > > }
> > > }
> >
> > Schau an, das ist interessant. Mein Adapter ist nicht von Marvell/mit
> > Marvell-Chip, aber einen Versuch ist das wert. War das jetzt auf FBSD 6
> > oder 7?
>
> Das stammt aus einer recht frischen 7.x.
>
> Ich muss zur Erklärung ein wenig ausholen.
>
> Der Punkt ist bei SATA eigendlich, dass es abwärtskompatibel zu PATA
> ist.
> D.h. man kann das Teil wie einen PATA Controller behandeln und die
> PIO/DMA Befehle werden 1:1 über das SATA-Kabel zur Platte geschickt,
> Im Fall eines SATA/PATA Konverters ist folgenermassen:
> Die Platte wird nach den Fähigkeiten gefragt und wenn das OS z.B.
> einen UMDA100 Tranaktion auslöst geht diese über das SATA Kabel bis zum
> Konverter, welcher daraus dann die echte UDMA100 Transaktion zur PATA
> Platte vornimmt.
> Eine echte SATA Platte würde ignorieren, dass UDMA100 angefragt war
> und einfach den Befehl ausführen.
> Der Konverter mischt sich in die Befehle zur Platte nicht ein, der
> hat das nur auf physikalischer Ebene umzusetzen.
> Und der Konbervter handelt auch nicht, wie Oliver vermutete, die PATA
> Geschwindigkeit aus.
> Die PATA Geschwindigkeit wird noch ganz normal zwischen OS und Platte
> ausgehandelt.
> Im Extremfall ginge sogar ein echter Master/Slave Betrieb hinter so
> einem Konverter, aber die dafür notwendige Funktionalität zur Emulation
> der Register im SATA Controller sind optional und ich weiß nicht
> wie verbreitet die Implementation dafür ist.
> Nachzulesen in Kapitel 5.2 der SATA-1.0a Specs.

Daher Deine Einschätzung, der Adapter sei einfach kaputt im Sinne von
schlampig implementierter Hardware.

Guck:

# atacontrol attach 2
Master: ad1 <IC35L120AVV207-1/V24OA66A> ATA/ATAPI rev 6
Slave: no device present

ergibt auf der Konsole:

ad1: 117800MB <IC35L120AVV207-1> [239340/16/63] at ata2-master UDMA100

# atacontrol mode 2
Master = UDMA100
Slave = ???
# atacontrol mode 2 UDMA33 x
Master = UDMA33
Slave = ???
# atacontrol mode 2 PIO4 x
Master = ???
Slave = ???

Ich habe es jetzt natürlich nicht geschafft, das Fehlverhalten zu
provozieren - Vorführeffekt - aber wie schon beschrieben gibt es immer
beim "write" Meldungen über "timeout" und die LED an der Platte/dem
Kanal leuchtet permanent wogegen nichts gelesen wird.
Dann gibt es einen Bus-Reset und meistens geht's dann weiter. Diese
Pausen dauern zwischen 10 und 40 Sekunden (dem Gefühl nach).

> Wenn ich das richtig sehe limitiert der Workaround das lediglich auf
> UDMA100, d.h. es kann durchaus auch PIO2 oder sowas rauskommen.
> Das heißt auch, dass du mit atacontrol ganz normal auf UDAMA33 schalten
> können solltest...

Sollte schon. :(

> Bei SATA gibt es den Link-Speed, der zwischen den Endstellen
> ausgehandelt wird und getrennt beim Controller abgefragt werden kann.
> Wenn FreeBSD also SATA-150 scheibt, dann ist damit gemeint, dass es
> zur Platte durch geht.
> Wenn FreeBSD UDAM100 schreibt, dann ist das die PATA Verbindung zur
> Platte, während der SATA-Link nicht genannt wird.

Der Modus wird ja "richtig" angezeigt (s.o.) solange ich nur DMA-Modi
benutze oder dem System die Auswahl überlasse, aber bei heftigem
Schreiben wird die Platte (mehrere Modelle von Hitachi/IBM) zugemüllt
und reagiert nicht mehr im erwarteten Zeitraster. Das ist unabhängig vom
Modus, in allen DMA- und ebenso allen (als ??? angezeigten) PIO-Modi
passiert das so. Aber nicht immer.

Ich meine beobachtet zu haben, daß es bei langsamem schreiben mit "nice
cp" oder tar mit vielen kleinen Dateien nicht so häufig passiert.

Ist mir aber zusammengenommen alles zu esoterisch, da kommt ein
PATA-Controller rein und gut.

Marc

To Unsubscribe: send mail to majordomo(at)de.FreeBSD.org
with "unsubscribe de-bsd-questions" in the body of the message
Received on Fri 27 Apr 2007 - 20:30:01 CEST

search this site