From owner-freebsd-current Wed Jan 5 0:35:16 2000 Delivered-To: freebsd-current@freebsd.org Received: from freebsd.dk (freebsd.dk [212.242.42.178]) by hub.freebsd.org (Postfix) with ESMTP id DAC7715347; Wed, 5 Jan 2000 00:35:12 -0800 (PST) (envelope-from sos@freebsd.dk) Received: (from sos@localhost) by freebsd.dk (8.9.3/8.9.1) id JAA35344; Wed, 5 Jan 2000 09:35:11 +0100 (CET) (envelope-from sos) From: Soren Schmidt Message-Id: <200001050835.JAA35344@freebsd.dk> Subject: Re: ATA atapi-all.c problems/fixes/cleanups In-Reply-To: from Brian Fundakowski Feldman at "Jan 4, 2000 06:36:44 pm" To: green@FreeBSD.ORG (Brian Fundakowski Feldman) Date: Wed, 5 Jan 2000 09:35:11 +0100 (CET) Cc: current@FreeBSD.ORG X-Mailer: ELM [version 2.4ME+ PL54 (25)] MIME-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 8bit Sender: owner-freebsd-current@FreeBSD.ORG Precedence: bulk X-Loop: FreeBSD.ORG It seems Brian Fundakowski Feldman wrote: > > I used a multiple of the blocksize, and it works fine, except for on > the very last bit of data. The very last bit of data is what causes > an underrun, and the code that's there for overrun/underrun is > wrong right now. For underrun, it ends up writing the underlying > blocksize length from the user buffer of _less_than_that_size_, then > it writes (blocksize - user buffer size) _more_ zeroed data! This > promptly locks up the IDE bus with my CD-R. That's what the patch was > about and you didn't say anything about; yes, I know that blocksizes > should be matched perfectly and padded perfectly to prevent the ATA > driver from having to handle the underrun/overrun cases, but the > current handling is/was still broken. Try this patch instead, it should do the right thing.. Index: atapi-all.c =================================================================== RCS file: /home/ncvs/src/sys/dev/ata/atapi-all.c,v retrieving revision 1.29 diff -u -r1.29 atapi-all.c --- atapi-all.c 2000/01/03 10:26:56 1.29 +++ atapi-all.c 2000/01/05 08:36:49 @@ -563,12 +563,15 @@ #endif for (resid=request->bytecount; residdevice->controller->ioaddr + ATA_DATA); + *buffer += request->bytecount; + request->bytecount = 0; } - else + else { insw(request->device->controller->ioaddr + ATA_DATA, (void *)((uintptr_t)*buffer), length / sizeof(int16_t)); - request->bytecount -= length; - *buffer += length; + *buffer += length; + request->bytecount -= length; + } } static void @@ -585,19 +588,22 @@ request->device->devname, length, request->bytecount); #ifdef ATA_16BIT_ONLY outsw(request->device->controller->ioaddr + ATA_DATA, - (void *)((uintptr_t)*buffer), length / sizeof(int16_t)); + (void *)((uintptr_t)*buffer), request->bytecount/sizeof(int16_t)); #else outsl(request->device->controller->ioaddr + ATA_DATA, - (void *)((uintptr_t)*buffer), length / sizeof(int32_t)); + (void *)((uintptr_t)*buffer), request->bytecount/sizeof(int32_t)); #endif for (resid=request->bytecount; residdevice->controller->ioaddr + ATA_DATA, 0); + *buffer += request->bytecount; + request->bytecount = 0; } - else + else { outsw(request->device->controller->ioaddr + ATA_DATA, (void *)((uintptr_t)*buffer), length / sizeof(int16_t)); - request->bytecount -= length; - *buffer += length; + *buffer += length; + request->bytecount -= length; + } } static void -Søren To Unsubscribe: send mail to majordomo@FreeBSD.org with "unsubscribe freebsd-current" in the body of the message