Re: [PATCH] fix sata_sil quirk

From: Ricky Beam
Date: Tue Jun 22 2004 - 16:12:20 EST


On Tue, 22 Jun 2004, Jeff Garzik wrote:
Here's my suggested fix... good catch Ricky.

And I don't even know why I looked at max_sectors :-) (I need more Dew.)

Yes, unfortunately performance will be dog slow.

Well, at least puppy slow...
Device: tps kB_read/s kB_wrtn/s kB_read kB_wrtn
sda 1811.65 0.00 9629.85 0 577887
sdb 1807.15 0.00 9629.60 0 577872
sdc 1807.25 0.00 9629.86 0 577888
sdd 1807.05 0.00 9629.86 0 577888
md_d0 14444.64 0.00 48148.84 0 2889412
md_d0p2 9629.78 0.00 38519.11 0 2311532
(over 60sec, 8M O_DIRECT accesses, 128 stripes * 16k RAID0)

Without the MOD15 hack, the numbers are 2x higher, but they stop after
a few minutes :-)

I've got contacts at Silicon Image, and have been meaning to bug them
for a "real fix" for a while. It is rumored that there is a much better
fix, which allows full performance while at the same time not killing
your SATA drive due to odd-sized SATA frames on the wire.

Ask them what they do in their driver? (the linux one and the windows one)
Looking at the linux driver, the mod15 quirk is there, but there doesn't
appear to be any associated device list. (I've already post the single
Maxtor device listed.) FreeBSD detects the stall, resets the chip and
hopes that clears the problem. (People are not happy about that.)

--Ricky

===== drivers/scsi/libata-scsi.c 1.39 vs edited =====
--- 1.39/drivers/scsi/libata-scsi.c 2004-05-12 11:46:21 -04:00
+++ edited/drivers/scsi/libata-scsi.c 2004-06-22 16:18:57 -04:00
@@ -182,7 +182,8 @@
* 65534 when Jens Axboe's patch for dynamically
* determining max_sectors is merged.
*/
- if (dev->flags & ATA_DFLAG_LBA48) {
+ if ((dev->flags & ATA_DFLAG_LBA48) &&
+ ((dev->flags & ATA_DFLAG_LOCK_SECTORS) == 0)) {
sdev->host->max_sectors = 2048;
blk_queue_max_sectors(sdev->request_queue, 2048);
}
===== drivers/scsi/sata_sil.c 1.26 vs edited =====
--- 1.26/drivers/scsi/sata_sil.c 2004-06-15 00:29:32 -04:00
+++ edited/drivers/scsi/sata_sil.c 2004-06-22 16:18:21 -04:00
@@ -302,6 +302,7 @@
ap->id, dev->devno);
ap->host->max_sectors = 15;
ap->host->hostt->max_sectors = 15;
+ dev->flags |= ATA_DFLAG_LOCK_SECTORS;
return;
}

===== include/linux/libata.h 1.38 vs edited =====
--- 1.38/include/linux/libata.h 2004-06-22 00:54:44 -04:00
+++ edited/include/linux/libata.h 2004-06-22 16:17:44 -04:00
@@ -91,6 +91,7 @@
ATA_DFLAG_MASTER = (1 << 2), /* is device 0? */
ATA_DFLAG_WCACHE = (1 << 3), /* has write cache we can
* (hopefully) flush? */
+ ATA_DFLAG_LOCK_SECTORS = (1 << 4), /* don't adjust max_sectors */

ATA_DEV_UNKNOWN = 0, /* unknown device */
ATA_DEV_ATA = 1, /* ATA device */