kern/123980: [ata] [patch] Implement ATA UDMA speed limit
(hw.ata.ata_dma_limit)
Martin Johnson
martin at martinshouse.com
Sun Mar 15 13:20:05 PDT 2009
The following reply was made to PR kern/123980; it has been noted by GNATS.
From: Martin Johnson <martin at martinshouse.com>
To: bug-followup at FreeBSD.org
Cc:
Subject: Re: kern/123980: [ata] [patch] Implement ATA UDMA speed limit (hw.ata.ata_dma_limit)
Date: Sun, 15 Mar 2009 19:50:49 +0000
The issue is still present in 7.1-RELEASE on the Soekris NET5501 i386
hardware, for PATA hard disk drives such as the TravelStar E7K100.
The file ata-all.c has changed enough to break my patch, so I have re-
made the patch to implement the ATA speed limit sysctl for 7.1-
RELEASE. The updated patch is pasted below.
-- Martin.
--- ata-all.c.orig 2009-03-15 15:49:30.000000000 +0000
+++ ata-all.c 2009-03-15 15:55:33.000000000 +0000
@@ -78,15 +78,19 @@
int ata_dma_check_80pin = 1;
/* local vars */
static int ata_dma = 1;
+static int ata_dma_limit = 6;
static int atapi_dma = 1;
/* sysctl vars */
SYSCTL_NODE(_hw, OID_AUTO, ata, CTLFLAG_RD, 0, "ATA driver
parameters");
TUNABLE_INT("hw.ata.ata_dma", &ata_dma);
SYSCTL_INT(_hw_ata, OID_AUTO, ata_dma, CTLFLAG_RDTUN, &ata_dma, 0,
"ATA disk DMA mode control");
+TUNABLE_INT("hw.ata.ata_dma_limit", &ata_dma_limit);
+SYSCTL_INT(_hw_ata, OID_AUTO, ata_dma_limit, CTLFLAG_RDTUN,
&ata_dma_limit, 0,
+ "ATA disk DMA mode limit");
TUNABLE_INT("hw.ata.ata_dma_check_80pin", &ata_dma_check_80pin);
SYSCTL_INT(_hw_ata, OID_AUTO, ata_dma_check_80pin,
CTLFLAG_RDTUN, &ata_dma_check_80pin, 1,
"Check for 80pin cable before setting ATA DMA mode");
@@ -910,19 +914,19 @@
int
ata_umode(struct ata_params *ap)
{
if (ap->atavalid & ATA_FLAG_88) {
- if (ap->udmamodes & 0x40)
+ if (ap->udmamodes & 0x40 && ata_dma_limit >= 6)
return ATA_UDMA6;
- if (ap->udmamodes & 0x20)
+ if (ap->udmamodes & 0x20 && ata_dma_limit >= 5)
return ATA_UDMA5;
- if (ap->udmamodes & 0x10)
+ if (ap->udmamodes & 0x10 && ata_dma_limit >= 4)
return ATA_UDMA4;
- if (ap->udmamodes & 0x08)
+ if (ap->udmamodes & 0x08 && ata_dma_limit >= 3)
return ATA_UDMA3;
- if (ap->udmamodes & 0x04)
+ if (ap->udmamodes & 0x04 && ata_dma_limit >= 2)
return ATA_UDMA2;
- if (ap->udmamodes & 0x02)
+ if (ap->udmamodes & 0x02 && ata_dma_limit >= 1)
return ATA_UDMA1;
if (ap->udmamodes & 0x01)
return ATA_UDMA0;
}
More information about the freebsd-bugs
mailing list