Date: Fri, 25 Jul 2008 14:12:34 +0400 From: "Andrey V. Elsukov" <bu7cher@yandex.ru> To: Sean Bruno <sbruno@miralink.com> Cc: freebsd-drivers@freebsd.org, =?UTF-8?B?U8O4cmVuIFNjaG1pZHQ=?= <sos@FreeBSD.org> Subject: Re: ATA patch for RELENG_6 ... a patch looking for a good home Message-ID: <4889A712.7090204@yandex.ru> In-Reply-To: <4889A415.1060309@yandex.ru> References: <4839F473.6070109@miralink.com> <4889A415.1060309@yandex.ru>
index | next in thread | previous in thread | raw e-mail
[-- Attachment #1 --]
Andrey V. Elsukov wrote:
> What you think about attached patch?
> It can resolve your problem and shouldn't break anything.
> With this patch you can set mode in /boot/device.hints, for
> example:
> hint.ad.0.mode="UDMA33"
> hint.ad.1.mode="UDMA100"
>
> These limits work only on boot stage, after boot completed you can
> change mode via atacontrol.
Also, this is the same patch, but it doesn't allow override maximum
mode in device.hints. I don't know which patch is preferable, I think
second one.
--
WBR, Andrey V. Elsukov
[-- Attachment #2 --]
Index: src/sys/dev/ata/ata-all.c
===================================================================
RCS file: /ncvs/src/sys/dev/ata/ata-all.c,v
retrieving revision 1.289
diff -u -b -p -r1.289 ata-all.c
--- src/sys/dev/ata/ata-all.c 11 Jun 2008 06:44:58 -0000 1.289
+++ src/sys/dev/ata/ata-all.c 25 Jul 2008 10:06:00 -0000
@@ -889,6 +889,28 @@ ata_mode2str(int mode)
}
}
+static int
+ata_str2mode(const char *str)
+{
+ if (!strncasecmp(str, "BIOSPIO", 7)) return ATA_PIO;
+ if (!strncasecmp(str, "PIO0", 4)) return ATA_PIO0;
+ if (!strncasecmp(str, "PIO1", 4)) return ATA_PIO1;
+ if (!strncasecmp(str, "PIO2", 4)) return ATA_PIO2;
+ if (!strncasecmp(str, "PIO3", 4)) return ATA_PIO3;
+ if (!strncasecmp(str, "PIO4", 4)) return ATA_PIO4;
+ if (!strncasecmp(str, "WDMA2", 5)) return ATA_WDMA2;
+ if (!strncasecmp(str, "UDMA2", 5)) return ATA_UDMA2;
+ if (!strncasecmp(str, "UDMA33", 6)) return ATA_UDMA2;
+ if (!strncasecmp(str, "UDMA4", 5)) return ATA_UDMA4;
+ if (!strncasecmp(str, "UDMA66", 6)) return ATA_UDMA4;
+ if (!strncasecmp(str, "UDMA5", 5)) return ATA_UDMA5;
+ if (!strncasecmp(str, "UDMA100", 7)) return ATA_UDMA5;
+ if (!strncasecmp(str, "UDMA6", 5)) return ATA_UDMA6;
+ if (!strncasecmp(str, "UDMA133", 7)) return ATA_UDMA6;
+ if (!strncasecmp(str, "BIOSDMA", 7)) return ATA_DMA;
+ return -1;
+}
+
int
ata_pmode(struct ata_params *ap)
{
@@ -952,6 +974,19 @@ ata_limit_mode(device_t dev, int mode, i
{
struct ata_device *atadev = device_get_softc(dev);
+ if (ata_delayed_attach) {
+ driver_t *drv = device_get_driver(dev);
+ const char *str = NULL;
+ int m;
+
+ if (drv && resource_string_value(drv->name, atadev->unit,
+ "mode", &str) == 0) {
+ m = ata_str2mode(str);
+ if (m >= ATA_PIO)
+ mode = m;
+ }
+ }
+
if (maxmode && mode > maxmode)
mode = maxmode;
help
Want to link to this message? Use this
URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?4889A712.7090204>
