Module Name:    src
Committed By:   jdolecek
Date:           Mon Sep 24 19:48:02 UTC 2018

Modified Files:
        src/sys/dev/ata [jdolecek-ncqfixes]: TODO.ncq ata.c

Log Message:
replace KASSERT() for READ LOG EXT returning without error indication
with just log to avoid triggering panic under QEMU - it doesn't implement
the command for AHCI emulation


To generate a diff of this commit:
cvs rdiff -u -r1.4.2.8 -r1.4.2.9 src/sys/dev/ata/TODO.ncq
cvs rdiff -u -r1.141.6.9 -r1.141.6.10 src/sys/dev/ata/ata.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/ata/TODO.ncq
diff -u src/sys/dev/ata/TODO.ncq:1.4.2.8 src/sys/dev/ata/TODO.ncq:1.4.2.9
--- src/sys/dev/ata/TODO.ncq:1.4.2.8	Sat Sep 22 17:52:24 2018
+++ src/sys/dev/ata/TODO.ncq	Mon Sep 24 19:48:02 2018
@@ -1,9 +1,9 @@
 jdolecek-ncqfixes goals:
-- re-fix QEMU ahci(4) bug workaround (no READ LOG EXT support) - now it
-  triggers KASSERT()
 - fix ahci(4) error handling under paralles - invalid bio via WD_CHAOS_MONKEY
   ends up being handled as NOERROR, triggering KASSERT() in wd(4)
 - remove controller-specific slot bitmaps (ic/siisata.c, ic/ahcisata_core.c)
+- revert rev 1.431 of wd.c (AT_POOL removal) - ensure still works
+  for the reset-via-thread case
 
 Bugs
 ----

Index: src/sys/dev/ata/ata.c
diff -u src/sys/dev/ata/ata.c:1.141.6.9 src/sys/dev/ata/ata.c:1.141.6.10
--- src/sys/dev/ata/ata.c:1.141.6.9	Sat Sep 22 16:14:25 2018
+++ src/sys/dev/ata/ata.c	Mon Sep 24 19:48:02 2018
@@ -1,4 +1,4 @@
-/*	$NetBSD: ata.c,v 1.141.6.9 2018/09/22 16:14:25 jdolecek Exp $	*/
+/*	$NetBSD: ata.c,v 1.141.6.10 2018/09/24 19:48:02 jdolecek Exp $	*/
 
 /*
  * Copyright (c) 1998, 2001 Manuel Bouyer.  All rights reserved.
@@ -25,7 +25,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: ata.c,v 1.141.6.9 2018/09/22 16:14:25 jdolecek Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ata.c,v 1.141.6.10 2018/09/24 19:48:02 jdolecek Exp $");
 
 #include "opt_ata.h"
 
@@ -972,7 +972,7 @@ ata_read_log_ext_ncq(struct ata_drive_da
 	for (int i = 0; i < sizeof(drvp->recovery_blk); i++)
 		cksum += tb[i];
 	if (cksum != 0) {
-		aprint_error_dev(drvp->drv_softc,
+		device_printf(drvp->drv_softc,
 		    "invalid checksum %x for READ LOG EXT page %x\n",
 		    cksum, page);
 		rv = EINVAL;
@@ -989,10 +989,20 @@ ata_read_log_ext_ncq(struct ata_drive_da
 	*status = tb[2];
 	*err = tb[3];
 
-	KASSERTMSG((*status & WDCS_ERR),
-	    "%s: non-error command slot %d reported by READ LOG EXT page %x: "
-	    "err %x status %x\n",
-	    device_xname(drvp->drv_softc), *slot, page, *err, *status);
+	if ((*status & WDCS_ERR) == 0) {
+		/*
+		 * We expect error here. Normal physical drives always
+		 * do, it's part of ATA standard. However, QEMU AHCI emulation
+		 * misehandles READ LOG EXT in a way that the command itself
+		 * returns without error, but no data is transferred.
+		 */
+		device_printf(drvp->drv_softc,
+		    "READ LOG EXT page %x failed to report error: "
+		    "slot %d err %x status %x\n",
+		    page, *slot, *err, *status);
+		rv = EOPNOTSUPP;
+		goto out;
+	}
 
 	rv = 0;
 
@@ -1460,7 +1470,7 @@ ata_timo_xfer_check(struct ata_xfer *xfe
 			xfer->c_flags &= ~C_FREE;
 			ata_channel_unlock(chp);
 
-	    		aprint_normal_dev(drvp->drv_softc,
+	    		device_printf(drvp->drv_softc,
 			    "xfer %p freed while invoking timeout\n", xfer); 
 
 			ata_free_xfer(chp, xfer);
@@ -1470,7 +1480,7 @@ ata_timo_xfer_check(struct ata_xfer *xfe
 		/* Race vs. callout_stop() in ata_deactivate_xfer() */
 		ata_channel_unlock(chp);
 
-	    	aprint_normal_dev(drvp->drv_softc,
+	    	device_printf(drvp->drv_softc,
 		    "xfer %p deactivated while invoking timeout\n", xfer); 
 		return true;
 	}

Reply via email to