From owner-freebsd-bugs@FreeBSD.ORG Sun Mar 15 20:20:05 2009 Return-Path: Delivered-To: freebsd-bugs@hub.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 69BDC106564A for ; Sun, 15 Mar 2009 20:20:05 +0000 (UTC) (envelope-from gnats@FreeBSD.org) Received: from freefall.freebsd.org (freefall.freebsd.org [IPv6:2001:4f8:fff6::28]) by mx1.freebsd.org (Postfix) with ESMTP id 3D9818FC22 for ; Sun, 15 Mar 2009 20:20:05 +0000 (UTC) (envelope-from gnats@FreeBSD.org) Received: from freefall.freebsd.org (gnats@localhost [127.0.0.1]) by freefall.freebsd.org (8.14.3/8.14.3) with ESMTP id n2FKK4eH056039 for ; Sun, 15 Mar 2009 20:20:04 GMT (envelope-from gnats@freefall.freebsd.org) Received: (from gnats@localhost) by freefall.freebsd.org (8.14.3/8.14.3/Submit) id n2FKK403056038; Sun, 15 Mar 2009 20:20:04 GMT (envelope-from gnats) Date: Sun, 15 Mar 2009 20:20:04 GMT Message-Id: <200903152020.n2FKK403056038@freefall.freebsd.org> To: freebsd-bugs@FreeBSD.org From: Martin Johnson Cc: Subject: Re: kern/123980: [ata] [patch] Implement ATA UDMA speed limit (hw.ata.ata_dma_limit) X-BeenThere: freebsd-bugs@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list Reply-To: Martin Johnson List-Id: Bug reports List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sun, 15 Mar 2009 20:20:05 -0000 The following reply was made to PR kern/123980; it has been noted by GNATS. From: Martin Johnson To: bug-followup@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; }