From xdivac02@stud.fit.vutbr.cz  Wed Dec  3 00:16:57 2003
Return-Path: <xdivac02@stud.fit.vutbr.cz>
Received: from mx1.FreeBSD.org (mx1.freebsd.org [216.136.204.125])
	by hub.freebsd.org (Postfix) with ESMTP id 5D32616A4CE
	for <FreeBSD-gnats-submit@freebsd.org>; Wed,  3 Dec 2003 00:16:57 -0800 (PST)
Received: from eva.fit.vutbr.cz (eva.fit.vutbr.cz [147.229.10.14])
	by mx1.FreeBSD.org (Postfix) with ESMTP id 7F85943FDD
	for <FreeBSD-gnats-submit@freebsd.org>; Wed,  3 Dec 2003 00:16:55 -0800 (PST)
	(envelope-from xdivac02@stud.fit.vutbr.cz)
Received: from eva.fit.vutbr.cz (localhost [127.0.0.1])
	by eva.fit.vutbr.cz (8.12.10/8.12.9) with ESMTP id hB38GqJE002760
	(version=TLSv1/SSLv3 cipher=EDH-RSA-DES-CBC3-SHA bits=168 verify=NO)
	for <FreeBSD-gnats-submit@freebsd.org>; Wed, 3 Dec 2003 09:16:52 +0100 (CET)
Received: (from xdivac02@localhost)
	by eva.fit.vutbr.cz (8.12.10/8.12.5/Submit) id hB38Gqpb002759;
	Wed, 3 Dec 2003 09:16:52 +0100 (CET)
Message-Id: <200312030816.hB38Gqpb002759@eva.fit.vutbr.cz>
Date: Wed, 3 Dec 2003 09:16:52 +0100 (CET)
From: Divacky Roman <xdivac02@stud.fit.vutbr.cz>
Reply-To: Divacky Roman <xdivac02@stud.fit.vutbr.cz>
To: FreeBSD-gnats-submit@freebsd.org
Cc:
Subject: ata reset update in ATAng 
X-Send-Pr-Version: 3.113
X-GNATS-Notify:

>Number:         59917
>Category:       kern
>Synopsis:       ata reset update in ATAng
>Confidential:   no
>Severity:       non-critical
>Priority:       medium
>Responsible:    sos
>State:          closed
>Quarter:        
>Keywords:       
>Date-Required:  
>Class:          update
>Submitter-Id:   current-users
>Arrival-Date:   Wed Dec 03 00:20:17 PST 2003
>Closed-Date:    Mon Jan 12 11:31:36 PST 2004
>Last-Modified:  Mon Jan 12 11:31:36 PST 2004
>Originator:     Divacky Roman
>Release:        FreeBSD 5.2-BETA i386
>Organization:
home
>Environment:

FreeBSD 5.2-BETA

	
>Description:

I have PIIX4 ata controller has very slow ata-reset under ATAng

>How-To-Repeat:

this is default behaviour

>Fix:
this patch fixes it:

--- /tmp/ata-lowlevel.c	Sat Nov 22 16:48:27 2003
+++ /sys/dev/ata/ata-lowlevel.c	Sat Nov 22 17:06:45 2003
@@ -549,19 +549,22 @@
     ATA_IDX_INB(ch, ATA_ERROR);
 
     /* wait for BUSY to go inactive */
-    for (timeout = 0; timeout < 310; timeout++) {
+    /* Hacked by neologism... too slow for me ;) */
+    for (timeout = 0; timeout < 31000; timeout++) {
 	if (stat0 & ATA_S_BUSY) {
 	    ATA_IDX_OUTB(ch, ATA_DRIVE, ATA_D_IBM | ATA_MASTER);
 	    DELAY(10);
-    	    err = ATA_IDX_INB(ch, ATA_ERROR);
-	    lsb = ATA_IDX_INB(ch, ATA_CYL_LSB);
-	    msb = ATA_IDX_INB(ch, ATA_CYL_MSB);
 	    stat0 = ATA_IDX_INB(ch, ATA_STATUS);
-	    if (bootverbose)
-		ata_printf(ch, ATA_MASTER,
-			   "stat=0x%02x err=0x%02x lsb=0x%02x msb=0x%02x\n",
-			   stat0, err, lsb, msb);
 	    if (!(stat0 & ATA_S_BUSY)) {
+	       /* this should be there because of that condition...
+		  dont know why sos did this... */
+   	       err = ATA_IDX_INB(ch, ATA_ERROR);
+   	       lsb = ATA_IDX_INB(ch, ATA_CYL_LSB);
+   	       msb = ATA_IDX_INB(ch, ATA_CYL_MSB);
+	       if (bootverbose)
+  		  ata_printf(ch, ATA_MASTER,
+			"stat=0x%02x err=0x%02x lsb=0x%02x msb=0x%02x\n",
+			stat0, err, lsb, msb);
 		if ((err & 0x7f) == ATA_E_ILI) {
 		    if (lsb == ATAPI_MAGIC_LSB && msb == ATAPI_MAGIC_MSB) {
 			ch->devices |= ATA_ATAPI_MASTER;
@@ -578,15 +581,16 @@
 	if (stat1 & ATA_S_BUSY) {
 	    ATA_IDX_OUTB(ch, ATA_DRIVE, ATA_D_IBM | ATA_SLAVE);
 	    DELAY(10);
-    	    err = ATA_IDX_INB(ch, ATA_ERROR);
-	    lsb = ATA_IDX_INB(ch, ATA_CYL_LSB);
-	    msb = ATA_IDX_INB(ch, ATA_CYL_MSB);
 	    stat1 = ATA_IDX_INB(ch, ATA_STATUS);
-	    if (bootverbose)
-		ata_printf(ch, ATA_SLAVE,
-			   " stat=0x%02x err=0x%02x lsb=0x%02x msb=0x%02x\n",
-			   stat1, err, lsb, msb);
 	    if (!(stat1 & ATA_S_BUSY)) {
+	       /* Ditto */
+   	       err = ATA_IDX_INB(ch, ATA_ERROR);
+   	       lsb = ATA_IDX_INB(ch, ATA_CYL_LSB);
+   	       msb = ATA_IDX_INB(ch, ATA_CYL_MSB);
+   	       if (bootverbose)
+  		  ata_printf(ch, ATA_SLAVE,
+			" stat=0x%02x err=0x%02x lsb=0x%02x msb=0x%02x\n",
+			stat1, err, lsb, msb);
 		if ((err & 0x7f) == ATA_E_ILI) {
 		    if (lsb == ATAPI_MAGIC_LSB && msb == ATAPI_MAGIC_MSB) {
 			ch->devices |= ATA_ATAPI_SLAVE;
@@ -610,7 +614,7 @@
 	    if ((!(stat0 & ATA_S_BUSY) || (stat0 == 0xff && timeout > 20)) &&
 	        (!(stat1 & ATA_S_BUSY) || (stat1 == 0xff && timeout > 20)))
 		break;
-	DELAY(100000);
+	DELAY(1000);
     }	
 
     if (stat0 & ATA_S_BUSY)

>Release-Note:
>Audit-Trail:
Responsible-Changed-From-To: freebsd-bugs->sos 
Responsible-Changed-By: kris 
Responsible-Changed-When: Wed Dec 3 07:47:57 PST 2003 
Responsible-Changed-Why:  
Assign to ata maintainer 

http://www.freebsd.org/cgi/query-pr.cgi?pr=59917 
State-Changed-From-To: open->feedback 
State-Changed-By: sos 
State-Changed-When: Wed Dec 3 07:50:25 PST 2003 
State-Changed-Why:  

What exectly is it you want to accomplish here, there is 
no need to poll devices 100 times more *pr second*.. 
You just state your machine is slow to probe that is 
not enough info for me to determine what kind of problem 
you have, a dmesg would also be nice :) 


http://www.freebsd.org/cgi/query-pr.cgi?pr=59917 

From: Bruce Evans <bde@zeta.org.au>
To: Divacky Roman <xdivac02@stud.fit.vutbr.cz>
Cc: FreeBSD-gnats-submit@freebsd.org, freebsd-bugs@freebsd.org
Subject: Re: kern/59917: ata reset update in ATAng 
Date: Sun, 7 Dec 2003 10:36:08 +1100 (EST)

 On Wed, 3 Dec 2003, Divacky Roman wrote:
 
 > >Description:
 >
 > I have PIIX4 ata controller has very slow ata-reset under ATAng
 
 How slow?  The patch seesm to mainly just increase the resolution of
 the polling so that you have to wait up to 99 msec less.
 
 > >How-To-Repeat:
 >
 > this is default behaviour
 >
 > >Fix:
 > this patch fixes it:
 >
 > --- /tmp/ata-lowlevel.c	Sat Nov 22 16:48:27 2003
 > +++ /sys/dev/ata/ata-lowlevel.c	Sat Nov 22 17:06:45 2003
 > @@ -549,19 +549,22 @@
 >      ATA_IDX_INB(ch, ATA_ERROR);
 >
 >      /* wait for BUSY to go inactive */
 > -    for (timeout = 0; timeout < 310; timeout++) {
 > +    /* Hacked by neologism... too slow for me ;) */
 > +    for (timeout = 0; timeout < 31000; timeout++) {
 
 I use similar changes (this and the corresponding decreased delay) for
 unrelated reasons (to monitor the status in closer to real time).
 
 >  	if (stat0 & ATA_S_BUSY) {
 >  	    ATA_IDX_OUTB(ch, ATA_DRIVE, ATA_D_IBM | ATA_MASTER);
 >  	    DELAY(10);
 > -    	    err = ATA_IDX_INB(ch, ATA_ERROR);
 > -	    lsb = ATA_IDX_INB(ch, ATA_CYL_LSB);
 > -	    msb = ATA_IDX_INB(ch, ATA_CYL_MSB);
 >  	    stat0 = ATA_IDX_INB(ch, ATA_STATUS);
 > -	    if (bootverbose)
 > -		ata_printf(ch, ATA_MASTER,
 > -			   "stat=0x%02x err=0x%02x lsb=0x%02x msb=0x%02x\n",
 > -			   stat0, err, lsb, msb);
 >  	    if (!(stat0 & ATA_S_BUSY)) {
 > +	       /* this should be there because of that condition...
 > +		  dont know why sos did this... */
 > +   	       err = ATA_IDX_INB(ch, ATA_ERROR);
 > +   	       lsb = ATA_IDX_INB(ch, ATA_CYL_LSB);
 > +   	       msb = ATA_IDX_INB(ch, ATA_CYL_MSB);
 > +	       if (bootverbose)
 > +  		  ata_printf(ch, ATA_MASTER,
 > +			"stat=0x%02x err=0x%02x lsb=0x%02x msb=0x%02x\n",
 > +			stat0, err, lsb, msb);
 >  		if ((err & 0x7f) == ATA_E_ILI) {
 >  		    if (lsb == ATAPI_MAGIC_LSB && msb == ATAPI_MAGIC_MSB) {
 >  			ch->devices |= ATA_ATAPI_MASTER;
 
 I use similar changes to avoid spec violations.  Unfortunately sos doesn't
 like them.  The strange order is a hack which is claimed to help for some
 out-of spec drives.  It only breaks in-spec drives sometimes (if a race is
 lost).  On many systems the order makes no difference because we waited
 a long time before beginning the loop, so all drives are already unbusy.
 
 Bruce
State-Changed-From-To: feedback->closed 
State-Changed-By: sos 
State-Changed-When: Mon Jan 12 11:30:20 PST 2004 
State-Changed-Why:  
I belive the probe code in -current to be in pretty usefull state now. 

http://www.freebsd.org/cgi/query-pr.cgi?pr=59917 
>Unformatted:
