ATA patch for RELENG_6 ... a patch looking for a good home

Andrey V. Elsukov bu7cher at yandex.ru
Fri Jul 25 10:46:46 UTC 2008


Sean Bruno wrote:
> I got this patch a while ago and I don't see it appearing in RELENG_6
> yet.  Can someone "sheperd" this along or point out why it's not 
> acceptable?
> 
> This patch was generated by a failure to boot correctly off of a compact
> flash IDE module from Transcend.
> 
> Index: dev/ata/ata-chipset.c
> ===================================================================
> --- dev/ata/ata-chipset.c       (.../FreeBSD_RELENG_6_13APR07/src/sys)
> (revision 5436)
> +++ dev/ata/ata-chipset.c       (.../miralink.FreeBSD.6/src/sys)
> (revision 5436)
> @@ -2059,7 +2059,8 @@
>            atadev->mode = ATA_SA150;
>     }
>     else {
> -       mode = ata_limit_mode(dev, mode, ATA_UDMA5);
> +       /*mode = ata_limit_mode(dev, mode, ATA_UDMA5);*/
> +       mode = ata_check_80pin(dev, ATA_UDMA5);
>        if (!ata_controlcmd(dev, ATA_SETFEATURES, ATA_SF_SETXFER, 0, mode))
>            atadev->mode = mode;
>     }

Hi, Soren and Sean.

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.

-- 
WBR, Andrey V. Elsukov
-------------- next part --------------
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 09:54:52 -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)
 {
@@ -955,6 +977,19 @@ ata_limit_mode(device_t dev, int mode, i
     if (maxmode && mode > maxmode)
 	mode = maxmode;
 
+    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 (mode >= ATA_UDMA0 && ata_umode(&atadev->param) > 0)
 	return min(mode, ata_umode(&atadev->param));
 


More information about the freebsd-drivers mailing list