Module Name:    src
Committed By:   jdolecek
Date:           Fri Aug  4 20:49:24 UTC 2017

Modified Files:
        src/sys/dev/ic [jdolecek-ncq]: siisata.c

Log Message:
restore part of what was removed in 1.30.4.30 - the success of command
needs to be driven by PSS so that it works also for polled commands, apparently
PR_PIS_CMDCMPL is not set in that case; now do error handling again only when
PSS_ATTENTION is set

this fixes timeout for polled commands like standby on shutdown,
and (ehm ehm), READ LOG EXT on NCQ error recovery


To generate a diff of this commit:
cvs rdiff -u -r1.30.4.31 -r1.30.4.32 src/sys/dev/ic/siisata.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/siisata.c
diff -u src/sys/dev/ic/siisata.c:1.30.4.31 src/sys/dev/ic/siisata.c:1.30.4.32
--- src/sys/dev/ic/siisata.c:1.30.4.31	Tue Aug  1 22:02:32 2017
+++ src/sys/dev/ic/siisata.c	Fri Aug  4 20:49:24 2017
@@ -1,4 +1,4 @@
-/* $NetBSD: siisata.c,v 1.30.4.31 2017/08/01 22:02:32 jdolecek Exp $ */
+/* $NetBSD: siisata.c,v 1.30.4.32 2017/08/04 20:49:24 jdolecek Exp $ */
 
 /* from ahcisata_core.c */
 
@@ -79,7 +79,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: siisata.c,v 1.30.4.31 2017/08/01 22:02:32 jdolecek Exp $");
+__KERNEL_RCSID(0, "$NetBSD: siisata.c,v 1.30.4.32 2017/08/04 20:49:24 jdolecek Exp $");
 
 #include <sys/types.h>
 #include <sys/param.h>
@@ -262,9 +262,12 @@ siisata_init_port(struct siisata_softc *
 	schp = &sc->sc_channels[port];
 	chp = (struct ata_channel *)schp;
 
-	/* come out of reset, 64-bit activation */
+	/*
+	 * Come out of reset. Disable no clearing of PR_PIS_CMDCMPL on read
+	 * of PR_PSS. Disable 32-bit PRB activation, we use 64-bit activation.
+	 */
 	PRWRITE(sc, PRX(chp->ch_channel, PRO_PCC),
-	    PR_PC_32BA | PR_PC_PORT_RESET);
+	    PR_PC_32BA | PR_PC_INCOR | PR_PC_PORT_RESET);
 	/* initialize port */
 	siisata_reinit_port(chp, -1);
 	/* enable CmdErrr+CmdCmpl interrupting */
@@ -478,22 +481,22 @@ siisata_intr_port(struct siisata_channel
 	uint32_t pss, pis, tfd = 0;
 	bool recover = false;
 
-	pis = PRREAD(sc, PRX(chp->ch_channel, PRO_PIS));
+	/* get slot status, clearing completion interrupt */
+	pss = PRREAD(sc, PRX(chp->ch_channel, PRO_PSS));
 
-	SIISATA_DEBUG_PRINT(("%s: %s port %d, pis 0x%x ",
-	    SIISATANAME(sc), __func__, chp->ch_channel, pis),
+	SIISATA_DEBUG_PRINT(("%s: %s port %d, pss 0x%x ",
+	    SIISATANAME(sc), __func__, chp->ch_channel, pss),
 	    DEBUG_INTR);
 
-	if (pis & PR_PIS_CMDCMPL) {
-		/* get slot status, clearing completion interrupt */
-		pss = PRREAD(sc, PRX(chp->ch_channel, PRO_PSS));
-
-		SIISATA_DEBUG_PRINT(("pss 0x%x\n", pss), DEBUG_INTR);
-	} else {
-		/* commands will be killed after recovery */
-		pss = 0xffffffff;
+	if (__predict_true((pss & PR_PSS_ATTENTION) == 0)) {
+		SIISATA_DEBUG_PRINT(("no attention"), DEBUG_INTR);
+		goto process;
 	}
 
+	pis = PRREAD(sc, PRX(chp->ch_channel, PRO_PIS));
+
+	SIISATA_DEBUG_PRINT(("pis 0x%x\n", pss), DEBUG_INTR);
+
 	if (pis & PR_PIS_CMDERRR) {
 		uint32_t ec;
 
@@ -552,6 +555,7 @@ siisata_intr_port(struct siisata_channel
 	if (__predict_false(recover))
 		ata_channel_freeze(chp);
 
+process:
 	if (xfer != NULL) {
 		xfer->c_intr(chp, xfer, tfd);
 	} else {

Reply via email to