From owner-svn-src-all@FreeBSD.ORG Sun Feb 15 16:05:48 2009 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 71826106564A; Sun, 15 Feb 2009 16:05:48 +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 4653B8FC17; Sun, 15 Feb 2009 16:05:48 +0000 (UTC) (envelope-from mav@FreeBSD.org) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.3/8.14.3) with ESMTP id n1FG5mcs082810; Sun, 15 Feb 2009 16:05:48 GMT (envelope-from mav@svn.freebsd.org) Received: (from mav@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id n1FG5m9n082809; Sun, 15 Feb 2009 16:05:48 GMT (envelope-from mav@svn.freebsd.org) Message-Id: <200902151605.n1FG5m9n082809@svn.freebsd.org> From: Alexander Motin Date: Sun, 15 Feb 2009 16:05:48 +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: r188648 - head/sys/dev/ata/chipsets 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: Sun, 15 Feb 2009 16:05:48 -0000 Author: mav Date: Sun Feb 15 16:05:48 2009 New Revision: 188648 URL: http://svn.freebsd.org/changeset/base/188648 Log: Add workaround for some ATI chips, failing to soft-reset when port multiplicator supported, but absent. Modified: head/sys/dev/ata/chipsets/ata-ahci.c Modified: head/sys/dev/ata/chipsets/ata-ahci.c ============================================================================== --- head/sys/dev/ata/chipsets/ata-ahci.c Sun Feb 15 15:26:42 2009 (r188647) +++ head/sys/dev/ata/chipsets/ata-ahci.c Sun Feb 15 16:05:48 2009 (r188648) @@ -595,7 +595,7 @@ ata_ahci_start(device_t dev) (ch->devices & ATA_PORTMULTIPLIER ? ATA_AHCI_P_CMD_PMA : 0)); } -static void +static int ata_ahci_wait_ready(device_t dev) { struct ata_pci_controller *ctlr = device_get_softc(device_get_parent(dev)); @@ -608,11 +608,12 @@ ata_ahci_wait_ready(device_t dev) DELAY(1000); if (timeout++ > 1000) { device_printf(dev, "port is not ready\n"); - break; + return (-1); } } if (bootverbose) device_printf(dev, "ready wait time=%dms\n", timeout); + return (0); } static u_int32_t @@ -651,7 +652,8 @@ ata_ahci_softreset(device_t dev, int por if (ata_ahci_issue_cmd(dev, 0, 0)) return -1; - ata_ahci_wait_ready(dev); + if (ata_ahci_wait_ready(dev)) + return (-1); return ATA_INL(ctlr->r_res2, ATA_AHCI_P_SIG + offset); } @@ -713,9 +715,14 @@ ata_ahci_reset(device_t dev) ata_ahci_wait_ready(dev); /* only probe for PortMultiplier if HW has support */ - if (ATA_INL(ctlr->r_res2, ATA_AHCI_CAP) & ATA_AHCI_CAP_SPM) + if (ATA_INL(ctlr->r_res2, ATA_AHCI_CAP) & ATA_AHCI_CAP_SPM) { signature = ata_ahci_softreset(dev, ATA_PM); - else { + /* Workaround for some ATI chips, failing to soft-reset + * when port multiplicator supported, but absent. + * XXX: We can also check PxIS.IPMS==1 here to be sure. */ + if (signature == 0xffffffff) + signature = ata_ahci_softreset(dev, 0); + } else { signature = ata_ahci_softreset(dev, 0); } if (bootverbose)