From owner-p4-projects@FreeBSD.ORG Sun Oct 25 10:53:10 2009 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id 32AA01065670; Sun, 25 Oct 2009 10:53:10 +0000 (UTC) Delivered-To: perforce@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id D3030106566B for ; Sun, 25 Oct 2009 10:53:09 +0000 (UTC) (envelope-from mav@freebsd.org) Received: from repoman.freebsd.org (repoman.freebsd.org [IPv6:2001:4f8:fff6::29]) by mx1.freebsd.org (Postfix) with ESMTP id BFD658FC0A for ; Sun, 25 Oct 2009 10:53:09 +0000 (UTC) Received: from repoman.freebsd.org (localhost [127.0.0.1]) by repoman.freebsd.org (8.14.3/8.14.3) with ESMTP id n9PAr9LZ092732 for ; Sun, 25 Oct 2009 10:53:09 GMT (envelope-from mav@freebsd.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.14.3/8.14.3/Submit) id n9PAr9aA092730 for perforce@freebsd.org; Sun, 25 Oct 2009 10:53:09 GMT (envelope-from mav@freebsd.org) Date: Sun, 25 Oct 2009 10:53:09 GMT Message-Id: <200910251053.n9PAr9aA092730@repoman.freebsd.org> X-Authentication-Warning: repoman.freebsd.org: perforce set sender to mav@freebsd.org using -f From: Alexander Motin To: Perforce Change Reviews Precedence: bulk Cc: Subject: PERFORCE change 169786 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.5 List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sun, 25 Oct 2009 10:53:10 -0000 http://p4web.freebsd.org/chv.cgi?CH=169786 Change 169786 by mav@mav_mavtest on 2009/10/25 10:53:01 If after device reset we got connect status, but not ready, try to do full port reset. On full port reset keep PMP presence information. It could be not needed if XPT do full bus reinitialization, but now it doesn't. Affected files ... .. //depot/projects/scottl-camlock/src/sys/dev/siis/siis.c#11 edit Differences ... ==== //depot/projects/scottl-camlock/src/sys/dev/siis/siis.c#11 (text+ko) ==== @@ -511,7 +511,10 @@ /* Get port out of reset state. */ ATA_OUTL(ch->r_mem, SIIS_P_CTLCLR, SIIS_P_CTL_PORT_RESET); ATA_OUTL(ch->r_mem, SIIS_P_CTLCLR, SIIS_P_CTL_32BIT); - ATA_OUTL(ch->r_mem, SIIS_P_CTLCLR, SIIS_P_CTL_PME); + if (ch->pm_present) + ATA_OUTL(ch->r_mem, SIIS_P_CTLSET, SIIS_P_CTL_PME); + else + ATA_OUTL(ch->r_mem, SIIS_P_CTLCLR, SIIS_P_CTL_PME); /* Enable port interrupts */ ATA_OUTL(ch->r_mem, SIIS_P_IESET, SIIS_P_IX_ENABLED); return (0); @@ -1296,7 +1299,7 @@ siis_reset(device_t dev) { struct siis_channel *ch = device_get_softc(dev); - int i; + int i, retry = 0; uint32_t val; if (bootverbose) @@ -1336,6 +1339,7 @@ ATA_OUTL(ch->r_mem, SIIS_P_SCTL, ATA_SC_DET_IDLE | val | ((ch->pm_level > 0) ? 0 : (ATA_SC_IPM_DIS_PARTIAL | ATA_SC_IPM_DIS_SLUMBER))); +retry: siis_devreset(dev); /* Reset and reconnect PHY, */ if (!siis_sata_connect(ch)) { @@ -1350,8 +1354,25 @@ return; } /* Wait for clearing busy status. */ - if (siis_wait_ready(dev, 10000)) + if (siis_wait_ready(dev, 10000)) { device_printf(dev, "device ready timeout\n"); + if (!retry) { + device_printf(dev, "trying full port reset ...\n"); + /* Get port to the reset state. */ + ATA_OUTL(ch->r_mem, SIIS_P_CTLSET, SIIS_P_CTL_PORT_RESET); + DELAY(10000); + /* Get port out of reset state. */ + ATA_OUTL(ch->r_mem, SIIS_P_CTLCLR, SIIS_P_CTL_PORT_RESET); + ATA_OUTL(ch->r_mem, SIIS_P_CTLCLR, SIIS_P_CTL_32BIT); + if (ch->pm_present) + ATA_OUTL(ch->r_mem, SIIS_P_CTLSET, SIIS_P_CTL_PME); + else + ATA_OUTL(ch->r_mem, SIIS_P_CTLCLR, SIIS_P_CTL_PME); + siis_wait_ready(dev, 5000); + retry = 1; + goto retry; + } + } ch->devices = 1; /* Enable port interrupts */ ATA_OUTL(ch->r_mem, SIIS_P_IS, 0xFFFFFFFF); @@ -1487,7 +1508,8 @@ struct ccb_trans_settings *cts = &ccb->cts; if (cts->xport_specific.sata.valid & CTS_SATA_VALID_PM) { - if (cts->xport_specific.sata.pm_present) + ch->pm_present = cts->xport_specific.sata.pm_present; + if (ch->pm_present) ATA_OUTL(ch->r_mem, SIIS_P_CTLSET, SIIS_P_CTL_PME); else ATA_OUTL(ch->r_mem, SIIS_P_CTLCLR, SIIS_P_CTL_PME); @@ -1522,9 +1544,7 @@ cts->xport_specific.sata.bitrate = 150000; cts->xport_specific.sata.valid |= CTS_SATA_VALID_SPEED; } - cts->xport_specific.sata.pm_present = - (ATA_INL(ch->r_mem, SIIS_P_STS) & SIIS_P_CTL_PME) ? - 1 : 0; + cts->xport_specific.sata.pm_present = ch->pm_present; cts->xport_specific.sata.valid |= CTS_SATA_VALID_PM; ccb->ccb_h.status = CAM_REQ_CMP; xpt_done(ccb);