From owner-svn-src-all@FreeBSD.ORG Sat Jul 3 14:14:42 2010 Return-Path: Delivered-To: svn-src-all@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id B4B9E106564A; Sat, 3 Jul 2010 14:14:42 +0000 (UTC) (envelope-from mav@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id A362C8FC1A; Sat, 3 Jul 2010 14:14:42 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.3/8.14.3) with ESMTP id o63EEgwc035127; Sat, 3 Jul 2010 14:14:42 GMT (envelope-from mav@svn.freebsd.org) Received: (from mav@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id o63EEgH7035123; Sat, 3 Jul 2010 14:14:42 GMT (envelope-from mav@svn.freebsd.org) Message-Id: <201007031414.o63EEgH7035123@svn.freebsd.org> From: Alexander Motin Date: Sat, 3 Jul 2010 14:14:42 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org X-SVN-Group: head MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r209664 - in head: share/man/man4 sys/dev/ata X-BeenThere: svn-src-all@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the entire src tree \(except for " user" and " projects" \)" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 03 Jul 2010 14:14:42 -0000 Author: mav Date: Sat Jul 3 14:14:42 2010 New Revision: 209664 URL: http://svn.freebsd.org/changeset/base/209664 Log: Add ata(4) ability to limit initial ATA mode for devices via device hints. After boot this mode can be changed with atacontrol/camcontrol as usual. It works for both legacy and ATA_CAM wrapper mode. PR: kern/123980 Modified: head/share/man/man4/ata.4 head/sys/dev/ata/ata-all.c head/sys/dev/ata/ata-all.h Modified: head/share/man/man4/ata.4 ============================================================================== --- head/share/man/man4/ata.4 Sat Jul 3 14:03:31 2010 (r209663) +++ head/share/man/man4/ata.4 Sat Jul 3 14:14:42 2010 (r209664) @@ -27,7 +27,7 @@ .\" .\" $FreeBSD$ .\" -.Dd March 3, 2010 +.Dd July 3, 2010 .Dt ATA 4 .Os .Sh NAME @@ -103,6 +103,10 @@ can cause data loss on power failures an .It Va hint.atapci.X.msi set to 1 to allow Message Signalled Interrupts (MSI) to be used by specified PCI ATA controller, if supported. +.It Va hint.ata.X.devX.mode +limits initial ATA mode for specified device on specified channel. +.It Va hint.ata.X.mode +limits initial ATA mode for every device on specified channel. .It Va hint.ata.X.pm_level controls SATA interface Power Management for specified channel, allowing to save some power by the cost of additional command latency. Modified: head/sys/dev/ata/ata-all.c ============================================================================== --- head/sys/dev/ata/ata-all.c Sat Jul 3 14:03:31 2010 (r209663) +++ head/sys/dev/ata/ata-all.c Sat Jul 3 14:14:42 2010 (r209664) @@ -133,7 +133,9 @@ ata_attach(device_t dev) int error, rid; #ifdef ATA_CAM struct cam_devq *devq; - int i; + const char *res; + char buf[64]; + int i, mode; #endif /* check that we have a virgin channel to attach */ @@ -152,6 +154,17 @@ ata_attach(device_t dev) #ifdef ATA_CAM for (i = 0; i < 16; i++) { ch->user[i].mode = 0; + snprintf(buf, sizeof(buf), "dev%d.mode", i); + if (resource_string_value(device_get_name(dev), + device_get_unit(dev), buf, &res) == 0) + mode = ata_str2mode(res); + else if (resource_string_value(device_get_name(dev), + device_get_unit(dev), "mode", &res) == 0) + mode = ata_str2mode(res); + else + mode = -1; + if (mode >= 0) + ch->user[i].mode = mode; if (ch->flags & ATA_SATA) ch->user[i].bytecount = 8192; else @@ -826,8 +839,10 @@ ata_getparam(struct ata_device *atadev, { struct ata_channel *ch = device_get_softc(device_get_parent(atadev->dev)); struct ata_request *request; + const char *res; + char buf[64]; u_int8_t command = 0; - int error = ENOMEM, retries = 2; + int error = ENOMEM, retries = 2, mode = -1; if (ch->devices & (ATA_ATA_MASTER << atadev->unit)) command = ATA_ATA_IDENTIFY; @@ -907,6 +922,15 @@ ata_getparam(struct ata_device *atadev, ata_wmode(&atadev->param) > 0)) atadev->mode = ATA_DMA_MAX; } + snprintf(buf, sizeof(buf), "dev%d.mode", atadev->unit); + if (resource_string_value(device_get_name(ch->dev), + device_get_unit(ch->dev), buf, &res) == 0) + mode = ata_str2mode(res); + else if (resource_string_value(device_get_name(ch->dev), + device_get_unit(ch->dev), "mode", &res) == 0) + mode = ata_str2mode(res); + if (mode >= 0) + atadev->mode = mode; } } else { @@ -1163,6 +1187,35 @@ ata_mode2str(int mode) } } +int +ata_str2mode(const char *str) +{ + + if (!strcasecmp(str, "PIO0")) return (ATA_PIO0); + if (!strcasecmp(str, "PIO1")) return (ATA_PIO1); + if (!strcasecmp(str, "PIO2")) return (ATA_PIO2); + if (!strcasecmp(str, "PIO3")) return (ATA_PIO3); + if (!strcasecmp(str, "PIO4")) return (ATA_PIO4); + if (!strcasecmp(str, "WDMA0")) return (ATA_WDMA0); + if (!strcasecmp(str, "WDMA1")) return (ATA_WDMA1); + if (!strcasecmp(str, "WDMA2")) return (ATA_WDMA2); + if (!strcasecmp(str, "UDMA0")) return (ATA_UDMA0); + if (!strcasecmp(str, "UDMA16")) return (ATA_UDMA0); + if (!strcasecmp(str, "UDMA1")) return (ATA_UDMA1); + if (!strcasecmp(str, "UDMA25")) return (ATA_UDMA1); + if (!strcasecmp(str, "UDMA2")) return (ATA_UDMA2); + if (!strcasecmp(str, "UDMA33")) return (ATA_UDMA2); + if (!strcasecmp(str, "UDMA3")) return (ATA_UDMA3); + if (!strcasecmp(str, "UDMA44")) return (ATA_UDMA3); + if (!strcasecmp(str, "UDMA4")) return (ATA_UDMA4); + if (!strcasecmp(str, "UDMA66")) return (ATA_UDMA4); + if (!strcasecmp(str, "UDMA5")) return (ATA_UDMA5); + if (!strcasecmp(str, "UDMA100")) return (ATA_UDMA5); + if (!strcasecmp(str, "UDMA6")) return (ATA_UDMA6); + if (!strcasecmp(str, "UDMA133")) return (ATA_UDMA6); + return (-1); +} + const char * ata_satarev2str(int rev) { Modified: head/sys/dev/ata/ata-all.h ============================================================================== --- head/sys/dev/ata/ata-all.h Sat Jul 3 14:03:31 2010 (r209663) +++ head/sys/dev/ata/ata-all.h Sat Jul 3 14:14:42 2010 (r209664) @@ -625,6 +625,7 @@ void ata_modify_if_48bit(struct ata_requ void ata_udelay(int interval); char *ata_unit2str(struct ata_device *atadev); const char *ata_mode2str(int mode); +int ata_str2mode(const char *str); const char *ata_satarev2str(int rev); int ata_atapi(device_t dev, int target); int ata_pmode(struct ata_params *ap);