Module Name:    src
Committed By:   bouyer
Date:           Sun Oct 18 16:39:13 UTC 2009

Modified Files:
        src/sys/dev/ic [netbsd-5]: wdc.c

Log Message:
Pull up following revision(s) (requested by sborrill in ticket #1074):
        sys/dev/ic/wdc.c: revision 1.258
Commit patch from PR#41926. Confirmed to work by PR submitter on two
controllers as well myself and another on viaide.
Stops errors such as the following when probing SATA drives through
controllers that offer the legacy pciide interface:
viaide1 channel 0: reset failed for drive 0
OK bouyer@


To generate a diff of this commit:
cvs rdiff -u -r1.255.4.1 -r1.255.4.2 src/sys/dev/ic/wdc.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/dev/ic/wdc.c
diff -u src/sys/dev/ic/wdc.c:1.255.4.1 src/sys/dev/ic/wdc.c:1.255.4.2
--- src/sys/dev/ic/wdc.c:1.255.4.1	Thu Nov 20 02:45:36 2008
+++ src/sys/dev/ic/wdc.c	Sun Oct 18 16:39:13 2009
@@ -1,4 +1,4 @@
-/*	$NetBSD: wdc.c,v 1.255.4.1 2008/11/20 02:45:36 snj Exp $ */
+/*	$NetBSD: wdc.c,v 1.255.4.2 2009/10/18 16:39:13 bouyer Exp $ */
 
 /*
  * Copyright (c) 1998, 2001, 2003 Manuel Bouyer.  All rights reserved.
@@ -63,7 +63,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: wdc.c,v 1.255.4.1 2008/11/20 02:45:36 snj Exp $");
+__KERNEL_RCSID(0, "$NetBSD: wdc.c,v 1.255.4.2 2009/10/18 16:39:13 bouyer Exp $");
 
 #include "opt_ata.h"
 
@@ -209,7 +209,7 @@
 wdc_sataprobe(struct ata_channel *chp)
 {
 	struct wdc_regs *wdr = CHAN_TO_WDC_REGS(chp);
-	uint16_t scnt, sn, cl, ch;
+	uint8_t st = 0, sc, sn, cl, ch;
 	int i, s;
 
 	/* XXX This should be done by other code. */
@@ -222,23 +222,34 @@
 	switch (sata_reset_interface(chp, wdr->sata_iot, wdr->sata_control,
 	    wdr->sata_status)) {
 	case SStatus_DET_DEV:
-		bus_space_write_1(wdr->cmd_iot, wdr->cmd_iohs[wd_sdh], 0,
-		    WDSD_IBM);
-		delay(10);	/* 400ns delay */
-		scnt = bus_space_read_2(wdr->cmd_iot,
+		/* wait 5s for BSY to clear */
+		for (i = 0; i < WDC_PROBE_WAIT * hz; i++) {
+			bus_space_write_1(wdr->cmd_iot,
+			    wdr->cmd_iohs[wd_sdh], 0, WDSD_IBM);
+			delay(10);      /* 400ns delay */
+			st = bus_space_read_1(wdr->cmd_iot,
+			    wdr->cmd_iohs[wd_status], 0);
+			if ((st & WDCS_BSY) == 0)
+				break;
+			tsleep(&chp, PRIBIO, "sataprb", 1);
+		}
+		if (i == WDC_PROBE_WAIT * hz)
+			aprint_error_dev(chp->ch_atac->atac_dev,
+			    "BSY never cleared, status 0x%02x\n", st);
+		sc = bus_space_read_1(wdr->cmd_iot,
 		    wdr->cmd_iohs[wd_seccnt], 0);
-		sn = bus_space_read_2(wdr->cmd_iot,
+		sn = bus_space_read_1(wdr->cmd_iot,
 		    wdr->cmd_iohs[wd_sector], 0);
-		cl = bus_space_read_2(wdr->cmd_iot,
+		cl = bus_space_read_1(wdr->cmd_iot,
 		    wdr->cmd_iohs[wd_cyl_lo], 0);
-		ch = bus_space_read_2(wdr->cmd_iot,
+		ch = bus_space_read_1(wdr->cmd_iot,
 		    wdr->cmd_iohs[wd_cyl_hi], 0);
-		ATADEBUG_PRINT(("%s: port %d: scnt=0x%x sn=0x%x "
+		ATADEBUG_PRINT(("%s: port %d: sc=0x%x sn=0x%x "
 		    "cl=0x%x ch=0x%x\n",
 		    device_xname(chp->ch_atac->atac_dev), chp->ch_channel,
-		    scnt, sn, cl, ch), DEBUG_PROBE);
+		    sc, sn, cl, ch), DEBUG_PROBE);
 		/*
-		 * scnt and sn are supposed to be 0x1 for ATAPI, but in some
+		 * sc and sn are supposed to be 0x1 for ATAPI, but in some
 		 * cases we get wrong values here, so ignore it.
 		 */
 		s = splbio();

Reply via email to