Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 9 Oct 2003 10:01:53 +0200 (CEST)
From:      Soren Schmidt <sos@spider.deepcore.dk>
To:        Daniel Rock <D.Rock@t-online.de>
Cc:        sos@FreeBSD.ORG
Subject:   Re: UDMA33 on older acer aladdin chips
Message-ID:  <200310090801.h9981rgV054434@spider.deepcore.dk>
In-Reply-To: <3F8492DD.9000407@t-online.de>

next in thread | previous in thread | raw e-mail | index | archive | help
It seems Daniel Rock wrote:
> > I recently decided to update my alpha UP1000 to today's current from a
> > mid-July build.  However, UDMA33 did not work on a hard disk attached
> > to the built-in Acer Aladdin controller (verbose dmesg appended).
> > 
> > I think I have narrowed the problem down to this line of code:
> > 
> > 	atadev->channel->flags |= ATA_ATAPI_DMA_RO;
> > 
> > Removing this line gets my UDMA33 back.  
> 
> If I understand the code correctly, the right fix should more look like:
> 
> diff -u -r1.18 ata-lowlevel.c
> --- ata-lowlevel.c      7 Oct 2003 13:45:56 -0000       1.18
> +++ ata-lowlevel.c      8 Oct 2003 22:38:15 -0000
> @@ -73,7 +73,8 @@
>       request->device->channel->running = request;
> 
>       /* disable ATAPI DMA writes if HW doesn't support it */
> -    if (request->flags & (ATA_R_ATAPI | ATA_R_DMA | ATA_R_WRITE) &&
> +    if (((request->flags & (ATA_R_ATAPI | ATA_R_DMA | ATA_R_WRITE)) ==
> +                         (ATA_R_ATAPI | ATA_R_DMA | ATA_R_WRITE)) &&
>          request->device->channel->flags & ATA_ATAPI_DMA_RO)
>          request->flags &= ~ATA_R_DMA;

Yep, thats close, I have a patch out for testing that looks semilar,
if you can confirm it works, I'll commit it asap:

And yes pointy hat to me :)

Index: ata-lowlevel.c
===================================================================
RCS file: /home/ncvs/src/sys/dev/ata/ata-lowlevel.c,v
retrieving revision 1.18
diff -u -r1.18 ata-lowlevel.c
--- ata-lowlevel.c	7 Oct 2003 13:45:56 -0000	1.18
+++ ata-lowlevel.c	9 Oct 2003 06:32:14 -0000
@@ -73,8 +73,9 @@
     request->device->channel->running = request;
 
     /* disable ATAPI DMA writes if HW doesn't support it */
-    if (request->flags & (ATA_R_ATAPI | ATA_R_DMA | ATA_R_WRITE) &&
-	request->device->channel->flags & ATA_ATAPI_DMA_RO)
+    if ((request->device->channel->flags & ATA_ATAPI_DMA_RO) &&
+	((request->flags & (ATA_R_ATAPI | ATA_R_DMA | ATA_R_WRITE)) ==
+	 (ATA_R_ATAPI | ATA_R_DMA | ATA_R_WRITE)))
 	request->flags &= ~ATA_R_DMA;
 
     switch (request->flags & (ATA_R_ATAPI | ATA_R_DMA)) {

-Søren



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200310090801.h9981rgV054434>