kern/59917: ata reset update in ATAng

Divacky Roman xdivac02 at stud.fit.vutbr.cz
Wed Dec 3 00:20:24 PST 2003


>Number:         59917
>Category:       kern
>Synopsis:       ata reset update in ATAng
>Confidential:   no
>Severity:       non-critical
>Priority:       medium
>Responsible:    freebsd-bugs
>State:          open
>Quarter:        
>Keywords:       
>Date-Required:
>Class:          update
>Submitter-Id:   current-users
>Arrival-Date:   Wed Dec 03 00:20:17 PST 2003
>Closed-Date:
>Last-Modified:
>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:
>Unformatted:


More information about the freebsd-bugs mailing list