Module Name: src Committed By: jdolecek Date: Mon Nov 12 20:54:03 UTC 2018
Modified Files: src/sys/dev/ic: mvsata.c src/sys/dev/scsipi: atapi_wdc.c Log Message: pass correct status + error to *_atapi_phase_complete(), so that the function is actually able to recognize when there was an error; tested via reading a cd0 device in QEMU with ejected cdrom bug was introduced with jdolecek-ncq branch fixes PR kern/53724 by Andreas Gustafsson To generate a diff of this commit: cvs rdiff -u -r1.45 -r1.46 src/sys/dev/ic/mvsata.c cvs rdiff -u -r1.132 -r1.133 src/sys/dev/scsipi/atapi_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/mvsata.c diff -u src/sys/dev/ic/mvsata.c:1.45 src/sys/dev/ic/mvsata.c:1.46 --- src/sys/dev/ic/mvsata.c:1.45 Mon Nov 12 18:51:01 2018 +++ src/sys/dev/ic/mvsata.c Mon Nov 12 20:54:03 2018 @@ -1,4 +1,4 @@ -/* $NetBSD: mvsata.c,v 1.45 2018/11/12 18:51:01 jdolecek Exp $ */ +/* $NetBSD: mvsata.c,v 1.46 2018/11/12 20:54:03 jdolecek Exp $ */ /* * Copyright (c) 2008 KIYOHARA Takashi * All rights reserved. @@ -26,7 +26,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: mvsata.c,v 1.45 2018/11/12 18:51:01 jdolecek Exp $"); +__KERNEL_RCSID(0, "$NetBSD: mvsata.c,v 1.46 2018/11/12 20:54:03 jdolecek Exp $"); #include "opt_mvsata.h" @@ -161,7 +161,7 @@ static void mvsata_atapi_poll(struct ata static void mvsata_atapi_kill_xfer(struct ata_channel *, struct ata_xfer *, int); static void mvsata_atapi_reset(struct ata_channel *, struct ata_xfer *); -static void mvsata_atapi_phase_complete(struct ata_xfer *); +static void mvsata_atapi_phase_complete(struct ata_xfer *, int); static void mvsata_atapi_done(struct ata_channel *, struct ata_xfer *); static void mvsata_atapi_polldsc(void *); #endif @@ -2422,7 +2422,7 @@ again: xfer->c_bcount -= sc_xfer->datalen; sc_xfer->resid = xfer->c_bcount; /* this will unlock channel lock too */ - mvsata_atapi_phase_complete(xfer); + mvsata_atapi_phase_complete(xfer, tfd); return 1; default: @@ -2522,14 +2522,13 @@ mvsata_atapi_reset(struct ata_channel *c } static void -mvsata_atapi_phase_complete(struct ata_xfer *xfer) +mvsata_atapi_phase_complete(struct ata_xfer *xfer, int tfd) { struct ata_channel *chp = xfer->c_chp; struct atac_softc *atac = chp->ch_atac; struct wdc_softc *wdc = CHAN_TO_WDC(chp); struct scsipi_xfer *sc_xfer = xfer->c_scsipi; struct ata_drive_datas *drvp = &chp->ch_drive[xfer->c_drive]; - int tfd = 0; ata_channel_lock_owned(chp); @@ -2654,7 +2653,7 @@ mvsata_atapi_polldsc(void *arg) ata_channel_lock(chp); /* this will unlock channel lock too */ - mvsata_atapi_phase_complete(xfer); + mvsata_atapi_phase_complete(xfer, 0); } #endif /* NATAPIBUS > 0 */ Index: src/sys/dev/scsipi/atapi_wdc.c diff -u src/sys/dev/scsipi/atapi_wdc.c:1.132 src/sys/dev/scsipi/atapi_wdc.c:1.133 --- src/sys/dev/scsipi/atapi_wdc.c:1.132 Mon Nov 12 18:51:01 2018 +++ src/sys/dev/scsipi/atapi_wdc.c Mon Nov 12 20:54:03 2018 @@ -1,4 +1,4 @@ -/* $NetBSD: atapi_wdc.c,v 1.132 2018/11/12 18:51:01 jdolecek Exp $ */ +/* $NetBSD: atapi_wdc.c,v 1.133 2018/11/12 20:54:03 jdolecek Exp $ */ /* * Copyright (c) 1998, 2001 Manuel Bouyer. @@ -25,7 +25,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: atapi_wdc.c,v 1.132 2018/11/12 18:51:01 jdolecek Exp $"); +__KERNEL_RCSID(0, "$NetBSD: atapi_wdc.c,v 1.133 2018/11/12 20:54:03 jdolecek Exp $"); #ifndef ATADEBUG #define ATADEBUG @@ -89,7 +89,7 @@ static int wdc_atapi_start(struct ata_ch static int wdc_atapi_intr(struct ata_channel *, struct ata_xfer *, int); static void wdc_atapi_kill_xfer(struct ata_channel *, struct ata_xfer *, int); -static void wdc_atapi_phase_complete(struct ata_xfer *); +static void wdc_atapi_phase_complete(struct ata_xfer *, int); static void wdc_atapi_poll(struct ata_channel *, struct ata_xfer *); static void wdc_atapi_done(struct ata_channel *, struct ata_xfer *); static void wdc_atapi_reset(struct ata_channel *, struct ata_xfer *); @@ -1018,7 +1018,7 @@ again: #endif sc_xfer->resid = xfer->c_bcount; /* this will unlock channel lock too */ - wdc_atapi_phase_complete(xfer); + wdc_atapi_phase_complete(xfer, tfd); return(1); default: @@ -1058,7 +1058,7 @@ again: } static void -wdc_atapi_phase_complete(struct ata_xfer *xfer) +wdc_atapi_phase_complete(struct ata_xfer *xfer, int tfd) { struct ata_channel *chp = xfer->c_chp; struct atac_softc *atac = chp->ch_atac; @@ -1067,7 +1067,6 @@ wdc_atapi_phase_complete(struct ata_xfer #endif struct scsipi_xfer *sc_xfer = xfer->c_scsipi; struct ata_drive_datas *drvp = &chp->ch_drive[xfer->c_drive]; - int tfd = 0; ata_channel_lock_owned(chp); @@ -1207,5 +1206,5 @@ wdc_atapi_polldsc(void *arg) ata_channel_lock(chp); /* this will unlock channel lock too */ - wdc_atapi_phase_complete(xfer); + wdc_atapi_phase_complete(xfer, 0); }