Re: ATA-Controller aussuchen

From: Bernd Walter <ticso(at)cicely12.cicely.de>
Date: Fri, 27 Apr 2007 19:47:49 +0200

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.

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...

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.

-- 
B.Walter                http://www.bwct.de      http://www.fizon.de
bernd(at)bwct.de           info(at)bwct.de            support(at)fizon.de
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 - 19:49:07 CEST

search this site