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