Module Name: src Committed By: jdolecek Date: Sun Jul 30 20:16:29 UTC 2017
Modified Files: src/sys/dev/ata [jdolecek-ncq]: wd.c Log Message: actually change the retry to also use NCQ - with one drive I see very frequent fatal errors on siisata when switching often between NCQ and non-NCQ I/O commands with chaos monkey (basically, always the next NCQ command on a slot which had non-NCQ I/O throws fatal error); they completely vanish when just using NCQ all the time To generate a diff of this commit: cvs rdiff -u -r1.428.2.30 -r1.428.2.31 src/sys/dev/ata/wd.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/wd.c diff -u src/sys/dev/ata/wd.c:1.428.2.30 src/sys/dev/ata/wd.c:1.428.2.31 --- src/sys/dev/ata/wd.c:1.428.2.30 Sat Jul 29 12:51:22 2017 +++ src/sys/dev/ata/wd.c Sun Jul 30 20:16:29 2017 @@ -1,4 +1,4 @@ -/* $NetBSD: wd.c,v 1.428.2.30 2017/07/29 12:51:22 jdolecek Exp $ */ +/* $NetBSD: wd.c,v 1.428.2.31 2017/07/30 20:16:29 jdolecek Exp $ */ /* * Copyright (c) 1998, 2001 Manuel Bouyer. All rights reserved. @@ -54,7 +54,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: wd.c,v 1.428.2.30 2017/07/29 12:51:22 jdolecek Exp $"); +__KERNEL_RCSID(0, "$NetBSD: wd.c,v 1.428.2.31 2017/07/30 20:16:29 jdolecek Exp $"); #include "opt_ata.h" #include "opt_wd.h" @@ -734,16 +734,10 @@ wdstart1(struct wd_softc *wd, struct buf xfer->c_bio.flags |= ATA_LBA48; /* - * If NCQ was negotiated, always use it for the first attempt. - * Since device cancels all outstanding requests on error, downgrade - * to non-NCQ on retry, so that the retried transfer would not cause - * cascade failure for the other transfers if it fails again. - * If FUA was requested, we can't downgrade, as that would violate - * the semantics - FUA would not be honored. In that case, continue - * retrying with NCQ. + * If NCQ was negotiated, always use it. Some drives return random + * errors when switching between NCQ and non-NCQ I/O too often. */ - if (wd->drvp->drive_flags & ATA_DRIVE_NCQ && - (xfer->c_retries == 0 || (bp->b_flags & B_MEDIA_FUA))) { + if (wd->drvp->drive_flags & ATA_DRIVE_NCQ) { xfer->c_bio.flags |= ATA_LBA48; xfer->c_flags |= C_NCQ;