2024-02-06 00:46:04 +03:00
|
|
|
/* $NetBSD: wd.c,v 1.469 2024/02/05 21:46:06 andvar Exp $ */
|
1998-10-12 20:09:10 +04:00
|
|
|
|
|
|
|
/*
|
2001-12-03 03:20:22 +03:00
|
|
|
* Copyright (c) 1998, 2001 Manuel Bouyer. All rights reserved.
|
1998-10-12 20:09:10 +04:00
|
|
|
*
|
|
|
|
* Redistribution and use in source and binary forms, with or without
|
|
|
|
* modification, are permitted provided that the following conditions
|
|
|
|
* are met:
|
|
|
|
* 1. Redistributions of source code must retain the above copyright
|
|
|
|
* notice, this list of conditions and the following disclaimer.
|
|
|
|
* 2. Redistributions in binary form must reproduce the above copyright
|
|
|
|
* notice, this list of conditions and the following disclaimer in the
|
|
|
|
* documentation and/or other materials provided with the distribution.
|
|
|
|
*
|
|
|
|
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
|
|
|
|
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
|
|
|
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
2003-07-11 19:33:13 +04:00
|
|
|
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
|
1998-10-12 20:09:10 +04:00
|
|
|
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
|
|
|
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
|
|
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
|
|
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
|
|
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
|
|
|
|
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
|
|
*/
|
1994-10-27 07:14:23 +03:00
|
|
|
|
1998-08-15 14:10:47 +04:00
|
|
|
/*-
|
2004-06-22 23:20:56 +04:00
|
|
|
* Copyright (c) 1998, 2003, 2004 The NetBSD Foundation, Inc.
|
1998-08-15 14:10:47 +04:00
|
|
|
* All rights reserved.
|
1994-11-22 12:33:59 +03:00
|
|
|
*
|
1998-08-15 14:10:47 +04:00
|
|
|
* This code is derived from software contributed to The NetBSD Foundation
|
|
|
|
* by Charles M. Hannum and by Onno van der Linden.
|
1998-01-15 02:41:59 +03:00
|
|
|
*
|
1994-11-22 12:33:59 +03:00
|
|
|
* Redistribution and use in source and binary forms, with or without
|
|
|
|
* modification, are permitted provided that the following conditions
|
|
|
|
* are met:
|
|
|
|
* 1. Redistributions of source code must retain the above copyright
|
|
|
|
* notice, this list of conditions and the following disclaimer.
|
|
|
|
* 2. Redistributions in binary form must reproduce the above copyright
|
|
|
|
* notice, this list of conditions and the following disclaimer in the
|
|
|
|
* documentation and/or other materials provided with the distribution.
|
|
|
|
*
|
1998-08-15 14:10:47 +04:00
|
|
|
* THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
|
|
|
|
* ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
|
|
|
|
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
|
|
|
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
|
|
|
|
* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
|
|
|
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
|
|
|
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
|
|
|
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
|
|
|
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
|
|
|
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
|
|
|
* POSSIBILITY OF SUCH DAMAGE.
|
1993-03-21 12:45:37 +03:00
|
|
|
*/
|
|
|
|
|
2001-11-13 15:51:12 +03:00
|
|
|
#include <sys/cdefs.h>
|
2024-02-06 00:46:04 +03:00
|
|
|
__KERNEL_RCSID(0, "$NetBSD: wd.c,v 1.469 2024/02/05 21:46:06 andvar Exp $");
|
2001-11-13 15:51:12 +03:00
|
|
|
|
2007-04-08 10:58:47 +04:00
|
|
|
#include "opt_ata.h"
|
Merge support for SATA NCQ (Native Command Queueing) from jdolecek-ncq branch
ATA subsystem was changed to support several outstanding commands, and use
NCQ xfers if supported by both the controller and the disk, including NCQ
error recovery. Set NCQ high priority for BPRIO_TIMECRITICAL xfers
if supported. Added FUA support.
Done some work towards MP-safe, all ATA code tsleep()/wakeup() replaced
by condvars, and switched most code from spl* to mutexes (separate
wd(4) and ata channel lock).
Introduced new option WD_CHAOS_MONKEY to facilitate testing of error
handling, fixed several uncovered issues. Also fixed several problems
with kernel dump to wd(4) disk.
Tested with ahcisata(4), mvsata(4), siisata(4), piixide(4) on amd64,
with and without port multiplier, both disk and ATAPI devices; other
drivers and archs mechanically adjusted and compile-tested. NCQ is
supported for ahcisata(4) and siisata(4) for any controller, for
mvsata(4) only Gen IIe ones for now. Also enabled ATAPI support in
mvsata(4).
Thanks to Matt Thomas for initial ATA infrastructure patch, and
Jonathan A.Kollasch for siisata(4) NCQ changes and general testing.
Also fixes PR kern/43169 (wd(4)); and PR kern/11811, PR kern/47041,
PR kern/51979 (kernel dump)
2017-10-07 19:05:31 +03:00
|
|
|
#include "opt_wd.h"
|
1998-10-12 20:09:10 +04:00
|
|
|
|
1993-12-20 12:05:17 +03:00
|
|
|
#include <sys/param.h>
|
|
|
|
#include <sys/systm.h>
|
1994-02-25 21:30:37 +03:00
|
|
|
#include <sys/kernel.h>
|
1993-12-20 12:05:17 +03:00
|
|
|
#include <sys/conf.h>
|
|
|
|
#include <sys/file.h>
|
|
|
|
#include <sys/stat.h>
|
|
|
|
#include <sys/ioctl.h>
|
|
|
|
#include <sys/buf.h>
|
2004-10-28 11:07:35 +04:00
|
|
|
#include <sys/bufq.h>
|
1993-12-20 12:05:17 +03:00
|
|
|
#include <sys/uio.h>
|
1994-03-10 08:18:33 +03:00
|
|
|
#include <sys/device.h>
|
1994-10-20 17:08:07 +03:00
|
|
|
#include <sys/disklabel.h>
|
|
|
|
#include <sys/disk.h>
|
1993-12-20 12:05:17 +03:00
|
|
|
#include <sys/syslog.h>
|
1996-04-29 23:50:47 +04:00
|
|
|
#include <sys/proc.h>
|
2007-12-18 18:30:40 +03:00
|
|
|
#include <sys/reboot.h>
|
1999-09-23 15:04:29 +04:00
|
|
|
#include <sys/vnode.h>
|
2015-04-13 19:33:23 +03:00
|
|
|
#include <sys/rndsource.h>
|
1993-12-20 12:05:17 +03:00
|
|
|
|
2007-10-19 15:59:34 +04:00
|
|
|
#include <sys/intr.h>
|
|
|
|
#include <sys/bus.h>
|
1993-12-20 12:05:17 +03:00
|
|
|
|
1998-10-12 20:09:10 +04:00
|
|
|
#include <dev/ata/atareg.h>
|
|
|
|
#include <dev/ata/atavar.h>
|
|
|
|
#include <dev/ata/wdvar.h>
|
|
|
|
#include <dev/ic/wdcreg.h>
|
1998-11-20 02:44:20 +03:00
|
|
|
#include <sys/ataio.h>
|
1997-08-27 15:22:52 +04:00
|
|
|
#include "locators.h"
|
1993-03-21 12:45:37 +03:00
|
|
|
|
2006-09-22 08:48:38 +04:00
|
|
|
#include <prop/proplib.h>
|
|
|
|
|
Merge support for SATA NCQ (Native Command Queueing) from jdolecek-ncq branch
ATA subsystem was changed to support several outstanding commands, and use
NCQ xfers if supported by both the controller and the disk, including NCQ
error recovery. Set NCQ high priority for BPRIO_TIMECRITICAL xfers
if supported. Added FUA support.
Done some work towards MP-safe, all ATA code tsleep()/wakeup() replaced
by condvars, and switched most code from spl* to mutexes (separate
wd(4) and ata channel lock).
Introduced new option WD_CHAOS_MONKEY to facilitate testing of error
handling, fixed several uncovered issues. Also fixed several problems
with kernel dump to wd(4) disk.
Tested with ahcisata(4), mvsata(4), siisata(4), piixide(4) on amd64,
with and without port multiplier, both disk and ATAPI devices; other
drivers and archs mechanically adjusted and compile-tested. NCQ is
supported for ahcisata(4) and siisata(4) for any controller, for
mvsata(4) only Gen IIe ones for now. Also enabled ATAPI support in
mvsata(4).
Thanks to Matt Thomas for initial ATA infrastructure patch, and
Jonathan A.Kollasch for siisata(4) NCQ changes and general testing.
Also fixes PR kern/43169 (wd(4)); and PR kern/11811, PR kern/47041,
PR kern/51979 (kernel dump)
2017-10-07 19:05:31 +03:00
|
|
|
#define WDIORETRIES_SINGLE 4 /* number of retries for single-sector */
|
1998-10-12 20:09:10 +04:00
|
|
|
#define WDIORETRIES 5 /* number of retries before giving up */
|
|
|
|
#define RECOVERYTIME hz/2 /* time to wait before retrying a cmd */
|
1993-07-07 09:50:35 +04:00
|
|
|
|
1998-10-12 20:09:10 +04:00
|
|
|
#define WDUNIT(dev) DISKUNIT(dev)
|
|
|
|
#define WDPART(dev) DISKPART(dev)
|
1999-09-23 15:04:29 +04:00
|
|
|
#define WDMINOR(unit, part) DISKMINOR(unit, part)
|
1994-10-14 21:26:22 +03:00
|
|
|
#define MAKEWDDEV(maj, unit, part) MAKEDISKDEV(maj, unit, part)
|
|
|
|
|
|
|
|
#define WDLABELDEV(dev) (MAKEWDDEV(major(dev), WDUNIT(dev), RAW_PART))
|
1993-03-21 12:45:37 +03:00
|
|
|
|
1998-10-12 20:09:10 +04:00
|
|
|
#define DEBUG_FUNCS 0x08
|
|
|
|
#define DEBUG_PROBE 0x10
|
2017-10-19 23:45:07 +03:00
|
|
|
#define DEBUG_DETACH 0x20
|
|
|
|
#define DEBUG_XFERS 0x40
|
2004-08-13 08:10:49 +04:00
|
|
|
#ifdef ATADEBUG
|
2017-11-01 22:34:45 +03:00
|
|
|
#ifndef ATADEBUG_WD_MASK
|
|
|
|
#define ATADEBUG_WD_MASK 0x0
|
|
|
|
#endif
|
|
|
|
int wdcdebug_wd_mask = ATADEBUG_WD_MASK;
|
2004-08-13 08:10:49 +04:00
|
|
|
#define ATADEBUG_PRINT(args, level) \
|
1998-10-12 20:09:10 +04:00
|
|
|
if (wdcdebug_wd_mask & (level)) \
|
|
|
|
printf args
|
1997-08-27 15:22:52 +04:00
|
|
|
#else
|
2004-08-13 08:10:49 +04:00
|
|
|
#define ATADEBUG_PRINT(args, level)
|
1997-08-27 15:22:52 +04:00
|
|
|
#endif
|
|
|
|
|
2017-11-01 22:34:45 +03:00
|
|
|
static int wdprobe(device_t, cfdata_t, void *);
|
|
|
|
static void wdattach(device_t, device_t, void *);
|
|
|
|
static int wddetach(device_t, int);
|
|
|
|
static void wdperror(const struct wd_softc *, struct ata_xfer *);
|
1994-11-04 01:55:58 +03:00
|
|
|
|
2011-10-05 07:40:18 +04:00
|
|
|
static void wdminphys(struct buf *);
|
|
|
|
|
2017-11-01 22:34:45 +03:00
|
|
|
static int wd_firstopen(device_t, dev_t, int, int);
|
|
|
|
static int wd_lastclose(device_t);
|
2010-02-25 01:37:54 +03:00
|
|
|
static bool wd_suspend(device_t, const pmf_qual_t *);
|
2007-12-11 05:02:31 +03:00
|
|
|
static int wd_standby(struct wd_softc *, int);
|
2007-12-09 23:27:42 +03:00
|
|
|
|
During shutdown, detach devices in an orderly fashion.
Call the detach routine for every device in the device tree, starting
with the leaves and moving toward the root, expecting that each
(pseudo-)device driver will use the opportunity to gracefully commit
outstandings transactions to the underlying (pseudo-)device and to
relinquish control of the hardware to the system BIOS.
Detaching devices is not suitable for every shutdown: in an emergency,
or if the system state is inconsistent, we should resort to a fast,
simple shutdown that uses only the pmf(9) shutdown hooks and the
(deprecated) shutdownhooks. For now, if the flag RB_NOSYNC is set in
boothowto, opt for the fast, simple shutdown.
Add a device flag, DVF_DETACH_SHUTDOWN, that indicates by its presence
that it is safe to detach a device during shutdown. Introduce macros
CFATTACH_DECL3() and CFATTACH_DECL3_NEW() for creating autoconf
attachments with default device flags. Add DVF_DETACH_SHUTDOWN
to configuration attachments for atabus(4), atw(4) at cardbus(4),
cardbus(4), cardslot(4), com(4) at isa(4), elanpar(4), elanpex(4),
elansc(4), gpio(4), npx(4) at isa(4), nsphyter(4), pci(4), pcib(4),
pcmcia(4), ppb(4), sip(4), wd(4), and wdc(4) at isa(4).
Add a device-detachment "reason" flag, DETACH_SHUTDOWN, that tells the
autoconf code and a device driver that the reason for detachment is
system shutdown.
Add a sysctl, kern.detachall, that tells the system to try to detach
every device at shutdown, regardless of any device's DVF_DETACH_SHUTDOWN
flag. The default for kern.detachall is 0. SET IT TO 1, PLEASE, TO
HELP TEST AND DEBUG DEVICE DETACHMENT AT SHUTDOWN.
This is a work in progress. In future work, I aim to treat
pseudo-devices more thoroughly, and to gracefully tear down a stack of
(pseudo-)disk drivers and filesystems, including cgd(4), vnd(4), and
raid(4) instances at shutdown.
Also commit some changes that are not easily untangled from the rest:
(1) begin to simplify device_t locking: rename struct pmf_private to
device_lock, and incorporate device_lock into struct device.
(2) #include <sys/device.h> in sys/pmf.h in order to get some
definitions that it needs. Stop unnecessarily #including <sys/device.h>
in sys/arch/x86/include/pic.h to keep the amd64, xen, and i386 releases
building.
2009-04-02 04:09:32 +04:00
|
|
|
CFATTACH_DECL3_NEW(wd, sizeof(struct wd_softc),
|
2009-05-19 23:56:10 +04:00
|
|
|
wdprobe, wdattach, wddetach, NULL, NULL, NULL, DVF_DETACH_SHUTDOWN);
|
1996-03-17 03:53:54 +03:00
|
|
|
|
1998-01-12 12:39:57 +03:00
|
|
|
extern struct cfdriver wd_cd;
|
1994-11-21 01:36:43 +03:00
|
|
|
|
2017-11-01 22:34:45 +03:00
|
|
|
static dev_type_open(wdopen);
|
|
|
|
static dev_type_close(wdclose);
|
|
|
|
static dev_type_read(wdread);
|
|
|
|
static dev_type_write(wdwrite);
|
|
|
|
static dev_type_ioctl(wdioctl);
|
|
|
|
static dev_type_strategy(wdstrategy);
|
|
|
|
static dev_type_dump(wddump);
|
|
|
|
static dev_type_size(wdsize);
|
2014-07-25 12:22:08 +04:00
|
|
|
static dev_type_discard(wddiscard);
|
2002-09-06 17:18:43 +04:00
|
|
|
|
|
|
|
const struct bdevsw wd_bdevsw = {
|
2014-03-16 09:20:22 +04:00
|
|
|
.d_open = wdopen,
|
|
|
|
.d_close = wdclose,
|
|
|
|
.d_strategy = wdstrategy,
|
|
|
|
.d_ioctl = wdioctl,
|
|
|
|
.d_dump = wddump,
|
|
|
|
.d_psize = wdsize,
|
2014-07-25 12:22:08 +04:00
|
|
|
.d_discard = wddiscard,
|
2022-03-28 15:39:37 +03:00
|
|
|
.d_cfdriver = &wd_cd,
|
|
|
|
.d_devtounit = disklabel_dev_unit,
|
2014-03-16 09:20:22 +04:00
|
|
|
.d_flag = D_DISK
|
2002-09-06 17:18:43 +04:00
|
|
|
};
|
|
|
|
|
|
|
|
const struct cdevsw wd_cdevsw = {
|
2014-03-16 09:20:22 +04:00
|
|
|
.d_open = wdopen,
|
|
|
|
.d_close = wdclose,
|
|
|
|
.d_read = wdread,
|
|
|
|
.d_write = wdwrite,
|
|
|
|
.d_ioctl = wdioctl,
|
|
|
|
.d_stop = nostop,
|
|
|
|
.d_tty = notty,
|
|
|
|
.d_poll = nopoll,
|
|
|
|
.d_mmap = nommap,
|
|
|
|
.d_kqfilter = nokqfilter,
|
2014-07-25 12:22:08 +04:00
|
|
|
.d_discard = wddiscard,
|
2022-03-28 15:39:37 +03:00
|
|
|
.d_cfdriver = &wd_cd,
|
|
|
|
.d_devtounit = disklabel_dev_unit,
|
2014-03-16 09:20:22 +04:00
|
|
|
.d_flag = D_DISK
|
2002-09-06 17:18:43 +04:00
|
|
|
};
|
|
|
|
|
Merge support for SATA NCQ (Native Command Queueing) from jdolecek-ncq branch
ATA subsystem was changed to support several outstanding commands, and use
NCQ xfers if supported by both the controller and the disk, including NCQ
error recovery. Set NCQ high priority for BPRIO_TIMECRITICAL xfers
if supported. Added FUA support.
Done some work towards MP-safe, all ATA code tsleep()/wakeup() replaced
by condvars, and switched most code from spl* to mutexes (separate
wd(4) and ata channel lock).
Introduced new option WD_CHAOS_MONKEY to facilitate testing of error
handling, fixed several uncovered issues. Also fixed several problems
with kernel dump to wd(4) disk.
Tested with ahcisata(4), mvsata(4), siisata(4), piixide(4) on amd64,
with and without port multiplier, both disk and ATAPI devices; other
drivers and archs mechanically adjusted and compile-tested. NCQ is
supported for ahcisata(4) and siisata(4) for any controller, for
mvsata(4) only Gen IIe ones for now. Also enabled ATAPI support in
mvsata(4).
Thanks to Matt Thomas for initial ATA infrastructure patch, and
Jonathan A.Kollasch for siisata(4) NCQ changes and general testing.
Also fixes PR kern/43169 (wd(4)); and PR kern/11811, PR kern/47041,
PR kern/51979 (kernel dump)
2017-10-07 19:05:31 +03:00
|
|
|
/* #define WD_DUMP_NOT_TRUSTED if you just want to watch */
|
|
|
|
static int wddoingadump = 0;
|
|
|
|
static int wddumprecalibrated = 0;
|
|
|
|
|
1998-11-19 22:46:12 +03:00
|
|
|
/*
|
|
|
|
* Glue necessary to hook WDCIOCCOMMAND into physio
|
|
|
|
*/
|
|
|
|
|
|
|
|
struct wd_ioctl {
|
|
|
|
LIST_ENTRY(wd_ioctl) wi_list;
|
|
|
|
struct buf wi_bp;
|
|
|
|
struct uio wi_uio;
|
|
|
|
struct iovec wi_iov;
|
1998-11-20 02:44:20 +03:00
|
|
|
atareq_t wi_atareq;
|
1998-11-19 22:46:12 +03:00
|
|
|
struct wd_softc *wi_softc;
|
|
|
|
};
|
|
|
|
|
2017-11-01 22:34:45 +03:00
|
|
|
static struct wd_ioctl *wi_find(struct buf *);
|
|
|
|
static void wi_free(struct wd_ioctl *);
|
|
|
|
static struct wd_ioctl *wi_get(struct wd_softc *);
|
|
|
|
static void wdioctlstrategy(struct buf *);
|
|
|
|
|
2018-10-22 23:13:47 +03:00
|
|
|
static void wdrestart(void *);
|
2017-11-03 16:01:26 +03:00
|
|
|
static void wdstart1(struct wd_softc *, struct buf *, struct ata_xfer *);
|
2017-11-01 22:34:45 +03:00
|
|
|
static int wd_diskstart(device_t, struct buf *);
|
|
|
|
static int wd_dumpblocks(device_t, void *, daddr_t, int);
|
|
|
|
static void wd_iosize(device_t, int *);
|
|
|
|
static int wd_discard(device_t, off_t, off_t);
|
2018-10-22 23:13:47 +03:00
|
|
|
static void wdbioretry(void *);
|
|
|
|
static void wdbiorequeue(void *);
|
2017-11-01 22:34:45 +03:00
|
|
|
static void wddone(device_t, struct ata_xfer *);
|
2020-04-13 13:49:34 +03:00
|
|
|
static int wd_get_params(struct wd_softc *, struct ataparams *);
|
2017-11-01 22:34:45 +03:00
|
|
|
static void wd_set_geometry(struct wd_softc *);
|
2020-09-27 19:58:11 +03:00
|
|
|
static int wd_flushcache(struct wd_softc *, int);
|
2017-11-01 22:34:45 +03:00
|
|
|
static int wd_trim(struct wd_softc *, daddr_t, long);
|
|
|
|
static bool wd_shutdown(device_t, int);
|
|
|
|
|
|
|
|
static int wd_getcache(struct wd_softc *, int *);
|
|
|
|
static int wd_setcache(struct wd_softc *, int);
|
2003-04-26 13:54:15 +04:00
|
|
|
|
Merge support for SATA NCQ (Native Command Queueing) from jdolecek-ncq branch
ATA subsystem was changed to support several outstanding commands, and use
NCQ xfers if supported by both the controller and the disk, including NCQ
error recovery. Set NCQ high priority for BPRIO_TIMECRITICAL xfers
if supported. Added FUA support.
Done some work towards MP-safe, all ATA code tsleep()/wakeup() replaced
by condvars, and switched most code from spl* to mutexes (separate
wd(4) and ata channel lock).
Introduced new option WD_CHAOS_MONKEY to facilitate testing of error
handling, fixed several uncovered issues. Also fixed several problems
with kernel dump to wd(4) disk.
Tested with ahcisata(4), mvsata(4), siisata(4), piixide(4) on amd64,
with and without port multiplier, both disk and ATAPI devices; other
drivers and archs mechanically adjusted and compile-tested. NCQ is
supported for ahcisata(4) and siisata(4) for any controller, for
mvsata(4) only Gen IIe ones for now. Also enabled ATAPI support in
mvsata(4).
Thanks to Matt Thomas for initial ATA infrastructure patch, and
Jonathan A.Kollasch for siisata(4) NCQ changes and general testing.
Also fixes PR kern/43169 (wd(4)); and PR kern/11811, PR kern/47041,
PR kern/51979 (kernel dump)
2017-10-07 19:05:31 +03:00
|
|
|
static void wd_sysctl_attach(struct wd_softc *);
|
|
|
|
static void wd_sysctl_detach(struct wd_softc *);
|
|
|
|
|
2020-04-13 11:05:02 +03:00
|
|
|
static const struct dkdriver wddkdriver = {
|
2017-11-01 22:34:45 +03:00
|
|
|
.d_open = wdopen,
|
|
|
|
.d_close = wdclose,
|
2015-04-26 18:15:19 +03:00
|
|
|
.d_strategy = wdstrategy,
|
2017-11-01 22:34:45 +03:00
|
|
|
.d_minphys = wdminphys,
|
|
|
|
.d_diskstart = wd_diskstart,
|
|
|
|
.d_dumpblocks = wd_dumpblocks,
|
|
|
|
.d_iosize = wd_iosize,
|
|
|
|
.d_firstopen = wd_firstopen,
|
|
|
|
.d_lastclose = wd_lastclose,
|
|
|
|
.d_discard = wd_discard
|
2015-04-26 18:15:19 +03:00
|
|
|
};
|
1994-03-10 22:57:20 +03:00
|
|
|
|
1998-03-25 12:58:24 +03:00
|
|
|
#ifdef HAS_BAD144_HANDLING
|
2003-07-11 19:33:13 +04:00
|
|
|
static void bad144intern(struct wd_softc *);
|
1998-03-25 12:58:24 +03:00
|
|
|
#endif
|
1994-03-10 23:05:30 +03:00
|
|
|
|
2003-03-22 01:40:56 +03:00
|
|
|
#define WD_QUIRK_SPLIT_MOD15_WRITE 0x0001 /* must split certain writes */
|
|
|
|
|
2020-01-18 14:24:40 +03:00
|
|
|
#define WD_QUIRK_FMT "\20\1SPLIT_MOD15_WRITE"
|
2006-08-01 11:19:07 +04:00
|
|
|
|
2003-03-22 01:40:56 +03:00
|
|
|
/*
|
|
|
|
* Quirk table for IDE drives. Put more-specific matches first, since
|
2011-10-27 17:07:37 +04:00
|
|
|
* a simple globing routine is used for matching.
|
2003-03-22 01:40:56 +03:00
|
|
|
*/
|
|
|
|
static const struct wd_quirk {
|
|
|
|
const char *wdq_match; /* inquiry pattern to match */
|
|
|
|
int wdq_quirks; /* drive quirks */
|
|
|
|
} wd_quirk_table[] = {
|
|
|
|
/*
|
|
|
|
* Some Seagate S-ATA drives have a PHY which can get confused
|
|
|
|
* with the way data is packetized by some S-ATA controllers.
|
|
|
|
*
|
2003-04-18 04:35:14 +04:00
|
|
|
* The work-around is to split in two any write transfer whose
|
2003-03-22 01:40:56 +03:00
|
|
|
* sector count % 15 == 1 (assuming 512 byte sectors).
|
|
|
|
*
|
|
|
|
* XXX This is an incomplete list. There are at least a couple
|
|
|
|
* XXX more model numbers. If you have trouble with such transfers
|
|
|
|
* XXX (8K is the most common) on Seagate S-ATA drives, please
|
2003-12-04 16:57:30 +03:00
|
|
|
* XXX notify thorpej@NetBSD.org.
|
2011-10-27 17:07:37 +04:00
|
|
|
*
|
|
|
|
* The ST360015AS has not yet been confirmed to have this
|
|
|
|
* issue, however, it is the only other drive in the
|
|
|
|
* Seagate Barracuda Serial ATA V family.
|
|
|
|
*
|
2003-03-22 01:40:56 +03:00
|
|
|
*/
|
2020-01-18 14:24:40 +03:00
|
|
|
{ "ST3120023AS", WD_QUIRK_SPLIT_MOD15_WRITE },
|
|
|
|
{ "ST380023AS", WD_QUIRK_SPLIT_MOD15_WRITE },
|
|
|
|
{ "ST360015AS", WD_QUIRK_SPLIT_MOD15_WRITE },
|
2020-01-18 14:22:49 +03:00
|
|
|
{ NULL,
|
|
|
|
0 }
|
2003-03-22 01:40:56 +03:00
|
|
|
};
|
|
|
|
|
|
|
|
static const struct wd_quirk *
|
|
|
|
wd_lookup_quirks(const char *name)
|
|
|
|
{
|
|
|
|
const struct wd_quirk *wdq;
|
|
|
|
const char *estr;
|
|
|
|
|
|
|
|
for (wdq = wd_quirk_table; wdq->wdq_match != NULL; wdq++) {
|
|
|
|
/*
|
|
|
|
* We only want exact matches (which include matches
|
|
|
|
* against globbing characters).
|
|
|
|
*/
|
|
|
|
if (pmatch(name, wdq->wdq_match, &estr) == 2)
|
|
|
|
return (wdq);
|
|
|
|
}
|
|
|
|
return (NULL);
|
|
|
|
}
|
|
|
|
|
2017-11-01 22:34:45 +03:00
|
|
|
static int
|
2009-05-12 18:16:35 +04:00
|
|
|
wdprobe(device_t parent, cfdata_t match, void *aux)
|
1993-03-21 12:45:37 +03:00
|
|
|
{
|
2001-12-03 01:44:32 +03:00
|
|
|
struct ata_device *adev = aux;
|
1998-01-12 12:39:57 +03:00
|
|
|
|
2001-12-03 01:44:32 +03:00
|
|
|
if (adev == NULL)
|
1997-08-27 15:22:52 +04:00
|
|
|
return 0;
|
2001-12-03 01:44:32 +03:00
|
|
|
if (adev->adev_bustype->bustype_type != SCSIPI_BUSTYPE_ATA)
|
1997-08-27 15:22:52 +04:00
|
|
|
return 0;
|
|
|
|
|
2003-10-09 00:57:59 +04:00
|
|
|
if (match->cf_loc[ATA_HLCF_DRIVE] != ATA_HLCF_DRIVE_DEFAULT &&
|
|
|
|
match->cf_loc[ATA_HLCF_DRIVE] != adev->adev_drv_data->drive)
|
1998-10-12 20:09:10 +04:00
|
|
|
return 0;
|
1994-03-29 08:35:37 +04:00
|
|
|
return 1;
|
|
|
|
}
|
1994-03-10 08:18:33 +03:00
|
|
|
|
2017-11-01 22:34:45 +03:00
|
|
|
static void
|
2009-05-12 18:16:35 +04:00
|
|
|
wdattach(device_t parent, device_t self, void *aux)
|
1994-03-29 08:35:37 +04:00
|
|
|
{
|
2008-03-18 23:46:35 +03:00
|
|
|
struct wd_softc *wd = device_private(self);
|
2017-11-01 22:34:45 +03:00
|
|
|
struct dk_softc *dksc = &wd->sc_dksc;
|
2001-12-03 01:44:32 +03:00
|
|
|
struct ata_device *adev= aux;
|
1994-03-29 08:35:37 +04:00
|
|
|
int i, blank;
|
2019-03-19 09:51:05 +03:00
|
|
|
char tbuf[41],pbuf[9], c, *p, *q;
|
2003-03-22 01:40:56 +03:00
|
|
|
const struct wd_quirk *wdq;
|
2017-11-01 22:34:45 +03:00
|
|
|
int dtype = DKTYPE_UNKNOWN;
|
1994-03-04 07:15:24 +03:00
|
|
|
|
2017-11-01 22:34:45 +03:00
|
|
|
dksc->sc_dev = self;
|
2008-03-18 23:46:35 +03:00
|
|
|
|
2007-11-07 11:59:03 +03:00
|
|
|
ATADEBUG_PRINT(("wdattach\n"), DEBUG_FUNCS | DEBUG_PROBE);
|
Merge support for SATA NCQ (Native Command Queueing) from jdolecek-ncq branch
ATA subsystem was changed to support several outstanding commands, and use
NCQ xfers if supported by both the controller and the disk, including NCQ
error recovery. Set NCQ high priority for BPRIO_TIMECRITICAL xfers
if supported. Added FUA support.
Done some work towards MP-safe, all ATA code tsleep()/wakeup() replaced
by condvars, and switched most code from spl* to mutexes (separate
wd(4) and ata channel lock).
Introduced new option WD_CHAOS_MONKEY to facilitate testing of error
handling, fixed several uncovered issues. Also fixed several problems
with kernel dump to wd(4) disk.
Tested with ahcisata(4), mvsata(4), siisata(4), piixide(4) on amd64,
with and without port multiplier, both disk and ATAPI devices; other
drivers and archs mechanically adjusted and compile-tested. NCQ is
supported for ahcisata(4) and siisata(4) for any controller, for
mvsata(4) only Gen IIe ones for now. Also enabled ATAPI support in
mvsata(4).
Thanks to Matt Thomas for initial ATA infrastructure patch, and
Jonathan A.Kollasch for siisata(4) NCQ changes and general testing.
Also fixes PR kern/43169 (wd(4)); and PR kern/11811, PR kern/47041,
PR kern/51979 (kernel dump)
2017-10-07 19:05:31 +03:00
|
|
|
mutex_init(&wd->sc_lock, MUTEX_DEFAULT, IPL_BIO);
|
2004-08-30 13:34:41 +04:00
|
|
|
#ifdef WD_SOFTBADSECT
|
2003-04-15 18:11:00 +04:00
|
|
|
SLIST_INIT(&wd->sc_bslist);
|
2021-12-28 16:27:32 +03:00
|
|
|
cv_init(&wd->sc_bslist_cv, "wdbadsect");
|
2004-08-30 13:34:41 +04:00
|
|
|
#endif
|
2001-12-03 03:11:15 +03:00
|
|
|
wd->atabus = adev->adev_bustype;
|
2019-03-19 19:56:29 +03:00
|
|
|
wd->inflight = 0;
|
2003-01-20 08:29:53 +03:00
|
|
|
wd->drvp = adev->adev_drv_data;
|
2003-12-14 08:33:29 +03:00
|
|
|
|
Merge support for SATA NCQ (Native Command Queueing) from jdolecek-ncq branch
ATA subsystem was changed to support several outstanding commands, and use
NCQ xfers if supported by both the controller and the disk, including NCQ
error recovery. Set NCQ high priority for BPRIO_TIMECRITICAL xfers
if supported. Added FUA support.
Done some work towards MP-safe, all ATA code tsleep()/wakeup() replaced
by condvars, and switched most code from spl* to mutexes (separate
wd(4) and ata channel lock).
Introduced new option WD_CHAOS_MONKEY to facilitate testing of error
handling, fixed several uncovered issues. Also fixed several problems
with kernel dump to wd(4) disk.
Tested with ahcisata(4), mvsata(4), siisata(4), piixide(4) on amd64,
with and without port multiplier, both disk and ATAPI devices; other
drivers and archs mechanically adjusted and compile-tested. NCQ is
supported for ahcisata(4) and siisata(4) for any controller, for
mvsata(4) only Gen IIe ones for now. Also enabled ATAPI support in
mvsata(4).
Thanks to Matt Thomas for initial ATA infrastructure patch, and
Jonathan A.Kollasch for siisata(4) NCQ changes and general testing.
Also fixes PR kern/43169 (wd(4)); and PR kern/11811, PR kern/47041,
PR kern/51979 (kernel dump)
2017-10-07 19:05:31 +03:00
|
|
|
wd->drvp->drv_openings = 1;
|
2003-12-14 08:33:29 +03:00
|
|
|
wd->drvp->drv_done = wddone;
|
2017-11-01 22:34:45 +03:00
|
|
|
wd->drvp->drv_softc = dksc->sc_dev; /* done in atabusconfig_thread()
|
2012-07-31 19:50:31 +04:00
|
|
|
but too late */
|
1994-11-05 02:30:15 +03:00
|
|
|
|
2018-10-22 23:13:47 +03:00
|
|
|
SLIST_INIT(&wd->sc_retry_list);
|
|
|
|
SLIST_INIT(&wd->sc_requeue_list);
|
|
|
|
callout_init(&wd->sc_retry_callout, 0); /* XXX MPSAFE */
|
|
|
|
callout_init(&wd->sc_requeue_callout, 0); /* XXX MPSAFE */
|
|
|
|
callout_init(&wd->sc_restart_diskqueue, 0); /* XXX MPSAFE */
|
|
|
|
|
2003-05-18 01:52:03 +04:00
|
|
|
aprint_naive("\n");
|
2011-02-10 08:07:46 +03:00
|
|
|
aprint_normal("\n");
|
2003-05-18 01:52:03 +04:00
|
|
|
|
1998-10-12 20:09:10 +04:00
|
|
|
/* read our drive info */
|
2020-04-13 13:49:34 +03:00
|
|
|
if (wd_get_params(wd, &wd->sc_params) != 0) {
|
2011-02-10 08:07:46 +03:00
|
|
|
aprint_error_dev(self, "IDENTIFY failed\n");
|
2012-07-31 19:50:31 +04:00
|
|
|
goto out;
|
1998-10-12 20:09:10 +04:00
|
|
|
}
|
1997-08-27 15:22:52 +04:00
|
|
|
|
2005-05-30 02:11:28 +04:00
|
|
|
for (blank = 0, p = wd->sc_params.atap_model, q = tbuf, i = 0;
|
1998-10-12 20:09:10 +04:00
|
|
|
i < sizeof(wd->sc_params.atap_model); i++) {
|
1995-03-30 03:36:27 +04:00
|
|
|
c = *p++;
|
1994-03-04 07:15:24 +03:00
|
|
|
if (c == '\0')
|
|
|
|
break;
|
|
|
|
if (c != ' ') {
|
1995-03-30 03:36:27 +04:00
|
|
|
if (blank) {
|
|
|
|
*q++ = ' ';
|
|
|
|
blank = 0;
|
|
|
|
}
|
|
|
|
*q++ = c;
|
1994-03-04 07:15:24 +03:00
|
|
|
} else
|
|
|
|
blank = 1;
|
1999-09-22 13:51:03 +04:00
|
|
|
}
|
1995-03-30 03:36:27 +04:00
|
|
|
*q++ = '\0';
|
|
|
|
|
2019-03-19 09:51:05 +03:00
|
|
|
wd->sc_typename = kmem_asprintf("%s", tbuf);
|
|
|
|
aprint_normal_dev(self, "<%s>\n", wd->sc_typename);
|
1998-04-26 09:28:23 +04:00
|
|
|
|
2005-05-30 02:11:28 +04:00
|
|
|
wdq = wd_lookup_quirks(tbuf);
|
2003-03-22 01:40:56 +03:00
|
|
|
if (wdq != NULL)
|
|
|
|
wd->sc_quirks = wdq->wdq_quirks;
|
|
|
|
|
2006-08-01 11:19:07 +04:00
|
|
|
if (wd->sc_quirks != 0) {
|
|
|
|
char sbuf[sizeof(WD_QUIRK_FMT) + 64];
|
2008-12-17 01:35:21 +03:00
|
|
|
snprintb(sbuf, sizeof(sbuf), WD_QUIRK_FMT, wd->sc_quirks);
|
2008-03-18 23:46:35 +03:00
|
|
|
aprint_normal_dev(self, "quirks %s\n", sbuf);
|
2017-04-24 12:42:52 +03:00
|
|
|
|
|
|
|
if (wd->sc_quirks & WD_QUIRK_SPLIT_MOD15_WRITE) {
|
|
|
|
aprint_error_dev(self, "drive corrupts write transfers with certain controllers, consider replacing\n");
|
|
|
|
}
|
2006-08-01 11:19:07 +04:00
|
|
|
}
|
|
|
|
|
1998-10-12 20:09:10 +04:00
|
|
|
if ((wd->sc_params.atap_multi & 0xff) > 1) {
|
Merge support for SATA NCQ (Native Command Queueing) from jdolecek-ncq branch
ATA subsystem was changed to support several outstanding commands, and use
NCQ xfers if supported by both the controller and the disk, including NCQ
error recovery. Set NCQ high priority for BPRIO_TIMECRITICAL xfers
if supported. Added FUA support.
Done some work towards MP-safe, all ATA code tsleep()/wakeup() replaced
by condvars, and switched most code from spl* to mutexes (separate
wd(4) and ata channel lock).
Introduced new option WD_CHAOS_MONKEY to facilitate testing of error
handling, fixed several uncovered issues. Also fixed several problems
with kernel dump to wd(4) disk.
Tested with ahcisata(4), mvsata(4), siisata(4), piixide(4) on amd64,
with and without port multiplier, both disk and ATAPI devices; other
drivers and archs mechanically adjusted and compile-tested. NCQ is
supported for ahcisata(4) and siisata(4) for any controller, for
mvsata(4) only Gen IIe ones for now. Also enabled ATAPI support in
mvsata(4).
Thanks to Matt Thomas for initial ATA infrastructure patch, and
Jonathan A.Kollasch for siisata(4) NCQ changes and general testing.
Also fixes PR kern/43169 (wd(4)); and PR kern/11811, PR kern/47041,
PR kern/51979 (kernel dump)
2017-10-07 19:05:31 +03:00
|
|
|
wd->drvp->multi = wd->sc_params.atap_multi & 0xff;
|
1994-11-22 12:33:59 +03:00
|
|
|
} else {
|
Merge support for SATA NCQ (Native Command Queueing) from jdolecek-ncq branch
ATA subsystem was changed to support several outstanding commands, and use
NCQ xfers if supported by both the controller and the disk, including NCQ
error recovery. Set NCQ high priority for BPRIO_TIMECRITICAL xfers
if supported. Added FUA support.
Done some work towards MP-safe, all ATA code tsleep()/wakeup() replaced
by condvars, and switched most code from spl* to mutexes (separate
wd(4) and ata channel lock).
Introduced new option WD_CHAOS_MONKEY to facilitate testing of error
handling, fixed several uncovered issues. Also fixed several problems
with kernel dump to wd(4) disk.
Tested with ahcisata(4), mvsata(4), siisata(4), piixide(4) on amd64,
with and without port multiplier, both disk and ATAPI devices; other
drivers and archs mechanically adjusted and compile-tested. NCQ is
supported for ahcisata(4) and siisata(4) for any controller, for
mvsata(4) only Gen IIe ones for now. Also enabled ATAPI support in
mvsata(4).
Thanks to Matt Thomas for initial ATA infrastructure patch, and
Jonathan A.Kollasch for siisata(4) NCQ changes and general testing.
Also fixes PR kern/43169 (wd(4)); and PR kern/11811, PR kern/47041,
PR kern/51979 (kernel dump)
2017-10-07 19:05:31 +03:00
|
|
|
wd->drvp->multi = 1;
|
1994-11-22 12:33:59 +03:00
|
|
|
}
|
|
|
|
|
2008-03-18 23:46:35 +03:00
|
|
|
aprint_verbose_dev(self, "drive supports %d-sector PIO transfers,",
|
Merge support for SATA NCQ (Native Command Queueing) from jdolecek-ncq branch
ATA subsystem was changed to support several outstanding commands, and use
NCQ xfers if supported by both the controller and the disk, including NCQ
error recovery. Set NCQ high priority for BPRIO_TIMECRITICAL xfers
if supported. Added FUA support.
Done some work towards MP-safe, all ATA code tsleep()/wakeup() replaced
by condvars, and switched most code from spl* to mutexes (separate
wd(4) and ata channel lock).
Introduced new option WD_CHAOS_MONKEY to facilitate testing of error
handling, fixed several uncovered issues. Also fixed several problems
with kernel dump to wd(4) disk.
Tested with ahcisata(4), mvsata(4), siisata(4), piixide(4) on amd64,
with and without port multiplier, both disk and ATAPI devices; other
drivers and archs mechanically adjusted and compile-tested. NCQ is
supported for ahcisata(4) and siisata(4) for any controller, for
mvsata(4) only Gen IIe ones for now. Also enabled ATAPI support in
mvsata(4).
Thanks to Matt Thomas for initial ATA infrastructure patch, and
Jonathan A.Kollasch for siisata(4) NCQ changes and general testing.
Also fixes PR kern/43169 (wd(4)); and PR kern/11811, PR kern/47041,
PR kern/51979 (kernel dump)
2017-10-07 19:05:31 +03:00
|
|
|
wd->drvp->multi);
|
1998-04-26 09:28:23 +04:00
|
|
|
|
2002-01-13 20:24:28 +03:00
|
|
|
/* 48-bit LBA addressing */
|
2003-11-30 16:57:12 +03:00
|
|
|
if ((wd->sc_params.atap_cmd2_en & ATA_CMD2_LBA48) != 0)
|
2002-01-13 20:24:28 +03:00
|
|
|
wd->sc_flags |= WDF_LBA48;
|
|
|
|
|
1998-04-26 09:28:23 +04:00
|
|
|
/* Prior to ATA-4, LBA was optional. */
|
1998-10-12 20:09:10 +04:00
|
|
|
if ((wd->sc_params.atap_capabilities1 & WDC_CAP_LBA) != 0)
|
|
|
|
wd->sc_flags |= WDF_LBA;
|
1998-05-09 09:20:35 +04:00
|
|
|
#if 0
|
1998-04-26 09:28:23 +04:00
|
|
|
/* ATA-4 requires LBA. */
|
1998-10-12 20:09:10 +04:00
|
|
|
if (wd->sc_params.atap_ataversion != 0xffff &&
|
|
|
|
wd->sc_params.atap_ataversion >= WDC_VER_ATA4)
|
|
|
|
wd->sc_flags |= WDF_LBA;
|
1998-05-09 09:20:35 +04:00
|
|
|
#endif
|
1998-04-26 09:28:23 +04:00
|
|
|
|
2002-01-13 20:24:28 +03:00
|
|
|
if ((wd->sc_flags & WDF_LBA48) != 0) {
|
2007-02-10 00:55:00 +03:00
|
|
|
aprint_verbose(" LBA48 addressing\n");
|
2002-01-13 20:24:28 +03:00
|
|
|
wd->sc_capacity =
|
2014-09-10 11:04:48 +04:00
|
|
|
((uint64_t) wd->sc_params.atap_max_lba[3] << 48) |
|
|
|
|
((uint64_t) wd->sc_params.atap_max_lba[2] << 32) |
|
|
|
|
((uint64_t) wd->sc_params.atap_max_lba[1] << 16) |
|
|
|
|
((uint64_t) wd->sc_params.atap_max_lba[0] << 0);
|
2009-12-18 00:03:10 +03:00
|
|
|
wd->sc_capacity28 =
|
|
|
|
(wd->sc_params.atap_capacity[1] << 16) |
|
|
|
|
wd->sc_params.atap_capacity[0];
|
2023-01-24 11:34:18 +03:00
|
|
|
/*
|
|
|
|
* Force LBA48 addressing for invalid numbers.
|
|
|
|
*/
|
|
|
|
if (wd->sc_capacity28 > 0xfffffff)
|
|
|
|
wd->sc_capacity28 = 0xfffffff;
|
2002-01-13 20:24:28 +03:00
|
|
|
} else if ((wd->sc_flags & WDF_LBA) != 0) {
|
2007-02-10 00:55:00 +03:00
|
|
|
aprint_verbose(" LBA addressing\n");
|
2023-01-24 11:34:18 +03:00
|
|
|
wd->sc_capacity28 =
|
2009-12-18 00:03:10 +03:00
|
|
|
(wd->sc_params.atap_capacity[1] << 16) |
|
1998-10-12 20:09:10 +04:00
|
|
|
wd->sc_params.atap_capacity[0];
|
2023-01-24 11:34:18 +03:00
|
|
|
/*
|
|
|
|
* Limit capacity to LBA28 numbers to avoid overflow.
|
|
|
|
*/
|
|
|
|
if (wd->sc_capacity28 > 0xfffffff)
|
|
|
|
wd->sc_capacity28 = 0xfffffff;
|
|
|
|
wd->sc_capacity = wd->sc_capacity28;
|
1998-04-26 09:28:23 +04:00
|
|
|
} else {
|
2007-02-10 00:55:00 +03:00
|
|
|
aprint_verbose(" chs addressing\n");
|
2023-01-24 11:34:18 +03:00
|
|
|
wd->sc_capacity =
|
1998-10-12 20:09:10 +04:00
|
|
|
wd->sc_params.atap_cylinders *
|
|
|
|
wd->sc_params.atap_heads *
|
|
|
|
wd->sc_params.atap_sectors;
|
2023-01-24 11:34:18 +03:00
|
|
|
/*
|
|
|
|
* LBA28 size is ignored for CHS addressing. Use a reasonable
|
2024-02-06 00:46:04 +03:00
|
|
|
* value for debugging. The CHS values may be artificial and
|
2023-01-24 11:34:18 +03:00
|
|
|
* are mostly ignored.
|
|
|
|
*/
|
|
|
|
if (wd->sc_capacity < 0xfffffff)
|
|
|
|
wd->sc_capacity28 = wd->sc_capacity;
|
|
|
|
else
|
|
|
|
wd->sc_capacity28 = 0xfffffff;
|
1998-04-26 09:28:23 +04:00
|
|
|
}
|
2016-07-22 07:08:10 +03:00
|
|
|
if ((wd->sc_params.atap_secsz & ATA_SECSZ_VALID_MASK) == ATA_SECSZ_VALID
|
|
|
|
&& ((wd->sc_params.atap_secsz & ATA_SECSZ_LLS) != 0)) {
|
|
|
|
wd->sc_blksize = 2ULL *
|
2016-08-05 09:54:22 +03:00
|
|
|
((uint32_t)((wd->sc_params.atap_lls_secsz[1] << 16) |
|
|
|
|
wd->sc_params.atap_lls_secsz[0]));
|
2016-07-22 07:08:10 +03:00
|
|
|
} else {
|
|
|
|
wd->sc_blksize = 512;
|
|
|
|
}
|
2020-03-02 19:01:56 +03:00
|
|
|
wd->sc_sectoralign.dsa_firstaligned = 0;
|
|
|
|
wd->sc_sectoralign.dsa_alignment = 1;
|
|
|
|
if ((wd->sc_params.atap_secsz & ATA_SECSZ_VALID_MASK) == ATA_SECSZ_VALID
|
|
|
|
&& ((wd->sc_params.atap_secsz & ATA_SECSZ_LPS) != 0)) {
|
|
|
|
wd->sc_sectoralign.dsa_alignment = 1 <<
|
|
|
|
(wd->sc_params.atap_secsz & ATA_SECSZ_LPS_SZMSK);
|
|
|
|
if ((wd->sc_params.atap_logical_align & ATA_LA_VALID_MASK) ==
|
|
|
|
ATA_LA_VALID) {
|
|
|
|
wd->sc_sectoralign.dsa_firstaligned =
|
|
|
|
(wd->sc_sectoralign.dsa_alignment -
|
|
|
|
(wd->sc_params.atap_logical_align &
|
|
|
|
ATA_LA_MASK));
|
|
|
|
}
|
|
|
|
}
|
2016-07-22 07:08:10 +03:00
|
|
|
wd->sc_capacity512 = (wd->sc_capacity * wd->sc_blksize) / DEV_BSIZE;
|
|
|
|
format_bytes(pbuf, sizeof(pbuf), wd->sc_capacity * wd->sc_blksize);
|
2008-03-18 23:46:35 +03:00
|
|
|
aprint_normal_dev(self, "%s, %d cyl, %d head, %d sec, "
|
2020-03-02 19:01:56 +03:00
|
|
|
"%d bytes/sect x %llu sectors",
|
2008-03-18 23:46:35 +03:00
|
|
|
pbuf,
|
2003-08-03 21:53:04 +04:00
|
|
|
(wd->sc_flags & WDF_LBA) ? (int)(wd->sc_capacity /
|
|
|
|
(wd->sc_params.atap_heads * wd->sc_params.atap_sectors)) :
|
|
|
|
wd->sc_params.atap_cylinders,
|
2000-01-24 17:51:07 +03:00
|
|
|
wd->sc_params.atap_heads, wd->sc_params.atap_sectors,
|
2016-07-22 07:08:10 +03:00
|
|
|
wd->sc_blksize, (unsigned long long)wd->sc_capacity);
|
2020-03-02 19:01:56 +03:00
|
|
|
if (wd->sc_sectoralign.dsa_alignment != 1) {
|
|
|
|
aprint_normal(" (%d bytes/physsect",
|
2020-09-28 15:47:49 +03:00
|
|
|
wd->sc_sectoralign.dsa_alignment * wd->sc_blksize);
|
2020-03-02 19:01:56 +03:00
|
|
|
if (wd->sc_sectoralign.dsa_firstaligned != 0) {
|
|
|
|
aprint_normal("; first aligned sector: %jd",
|
|
|
|
(intmax_t)wd->sc_sectoralign.dsa_firstaligned);
|
|
|
|
}
|
|
|
|
aprint_normal(")");
|
|
|
|
}
|
|
|
|
aprint_normal("\n");
|
2000-01-24 17:51:07 +03:00
|
|
|
|
2004-08-13 08:10:49 +04:00
|
|
|
ATADEBUG_PRINT(("%s: atap_dmatiming_mimi=%d, atap_dmatiming_recom=%d\n",
|
2008-03-18 23:46:35 +03:00
|
|
|
device_xname(self), wd->sc_params.atap_dmatiming_mimi,
|
1998-10-12 20:09:10 +04:00
|
|
|
wd->sc_params.atap_dmatiming_recom), DEBUG_PROBE);
|
2016-07-22 07:08:10 +03:00
|
|
|
|
|
|
|
if (wd->sc_blksize <= 0 || !powerof2(wd->sc_blksize) ||
|
|
|
|
wd->sc_blksize < DEV_BSIZE || wd->sc_blksize > MAXPHYS) {
|
|
|
|
aprint_normal_dev(self, "WARNING: block size %u "
|
|
|
|
"might not actually work\n", wd->sc_blksize);
|
|
|
|
}
|
Merge support for SATA NCQ (Native Command Queueing) from jdolecek-ncq branch
ATA subsystem was changed to support several outstanding commands, and use
NCQ xfers if supported by both the controller and the disk, including NCQ
error recovery. Set NCQ high priority for BPRIO_TIMECRITICAL xfers
if supported. Added FUA support.
Done some work towards MP-safe, all ATA code tsleep()/wakeup() replaced
by condvars, and switched most code from spl* to mutexes (separate
wd(4) and ata channel lock).
Introduced new option WD_CHAOS_MONKEY to facilitate testing of error
handling, fixed several uncovered issues. Also fixed several problems
with kernel dump to wd(4) disk.
Tested with ahcisata(4), mvsata(4), siisata(4), piixide(4) on amd64,
with and without port multiplier, both disk and ATAPI devices; other
drivers and archs mechanically adjusted and compile-tested. NCQ is
supported for ahcisata(4) and siisata(4) for any controller, for
mvsata(4) only Gen IIe ones for now. Also enabled ATAPI support in
mvsata(4).
Thanks to Matt Thomas for initial ATA infrastructure patch, and
Jonathan A.Kollasch for siisata(4) NCQ changes and general testing.
Also fixes PR kern/43169 (wd(4)); and PR kern/11811, PR kern/47041,
PR kern/51979 (kernel dump)
2017-10-07 19:05:31 +03:00
|
|
|
|
2017-11-01 22:34:45 +03:00
|
|
|
if (strcmp(wd->sc_params.atap_model, "ST506") == 0)
|
|
|
|
dtype = DKTYPE_ST506;
|
|
|
|
else
|
|
|
|
dtype = DKTYPE_ESDI;
|
|
|
|
|
2012-07-31 19:50:31 +04:00
|
|
|
out:
|
1998-10-12 20:09:10 +04:00
|
|
|
/*
|
|
|
|
* Initialize and attach the disk structure.
|
|
|
|
*/
|
2017-11-01 22:34:45 +03:00
|
|
|
dk_init(dksc, self, dtype);
|
|
|
|
disk_init(&dksc->sc_dkdev, dksc->sc_xname, &wddkdriver);
|
|
|
|
|
|
|
|
/* Attach dk and disk subsystems */
|
|
|
|
dk_attach(dksc);
|
|
|
|
disk_attach(&dksc->sc_dkdev);
|
|
|
|
wd_set_geometry(wd);
|
|
|
|
|
|
|
|
bufq_alloc(&dksc->sc_bufq, BUFQ_DISK_DEFAULT_STRAT, BUFQ_SORT_RAWBLOCK);
|
|
|
|
|
|
|
|
/* reference to label structure, used by ata code */
|
|
|
|
wd->drvp->lp = dksc->sc_dkdev.dk_label;
|
2004-09-25 07:34:02 +04:00
|
|
|
|
|
|
|
/* Discover wedges on this disk. */
|
2017-11-01 22:34:45 +03:00
|
|
|
dkwedge_discover(&dksc->sc_dkdev);
|
2007-12-09 23:27:42 +03:00
|
|
|
|
2008-02-28 17:40:17 +03:00
|
|
|
if (!pmf_device_register1(self, wd_suspend, NULL, wd_shutdown))
|
2007-12-09 23:27:42 +03:00
|
|
|
aprint_error_dev(self, "couldn't establish power handler\n");
|
Merge support for SATA NCQ (Native Command Queueing) from jdolecek-ncq branch
ATA subsystem was changed to support several outstanding commands, and use
NCQ xfers if supported by both the controller and the disk, including NCQ
error recovery. Set NCQ high priority for BPRIO_TIMECRITICAL xfers
if supported. Added FUA support.
Done some work towards MP-safe, all ATA code tsleep()/wakeup() replaced
by condvars, and switched most code from spl* to mutexes (separate
wd(4) and ata channel lock).
Introduced new option WD_CHAOS_MONKEY to facilitate testing of error
handling, fixed several uncovered issues. Also fixed several problems
with kernel dump to wd(4) disk.
Tested with ahcisata(4), mvsata(4), siisata(4), piixide(4) on amd64,
with and without port multiplier, both disk and ATAPI devices; other
drivers and archs mechanically adjusted and compile-tested. NCQ is
supported for ahcisata(4) and siisata(4) for any controller, for
mvsata(4) only Gen IIe ones for now. Also enabled ATAPI support in
mvsata(4).
Thanks to Matt Thomas for initial ATA infrastructure patch, and
Jonathan A.Kollasch for siisata(4) NCQ changes and general testing.
Also fixes PR kern/43169 (wd(4)); and PR kern/11811, PR kern/47041,
PR kern/51979 (kernel dump)
2017-10-07 19:05:31 +03:00
|
|
|
|
|
|
|
wd_sysctl_attach(wd);
|
2007-12-09 23:27:42 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
static bool
|
2010-02-25 01:37:54 +03:00
|
|
|
wd_suspend(device_t dv, const pmf_qual_t *qual)
|
2007-12-09 23:27:42 +03:00
|
|
|
{
|
|
|
|
struct wd_softc *sc = device_private(dv);
|
|
|
|
|
2013-10-30 19:41:14 +04:00
|
|
|
/* the adapter needs to be enabled */
|
|
|
|
if (sc->atabus->ata_addref(sc->drvp))
|
|
|
|
return true; /* no need to complain */
|
|
|
|
|
2020-09-27 19:58:11 +03:00
|
|
|
wd_flushcache(sc, AT_WAIT);
|
2008-02-22 00:52:06 +03:00
|
|
|
wd_standby(sc, AT_WAIT);
|
2013-10-30 19:41:14 +04:00
|
|
|
|
|
|
|
sc->atabus->ata_delref(sc->drvp);
|
2007-12-09 23:27:42 +03:00
|
|
|
return true;
|
1993-03-21 12:45:37 +03:00
|
|
|
}
|
|
|
|
|
2017-11-01 22:34:45 +03:00
|
|
|
static int
|
2009-05-12 18:16:35 +04:00
|
|
|
wddetach(device_t self, int flags)
|
1999-09-23 15:04:29 +04:00
|
|
|
{
|
2017-11-01 22:34:45 +03:00
|
|
|
struct wd_softc *wd = device_private(self);
|
|
|
|
struct dk_softc *dksc = &wd->sc_dksc;
|
Merge support for SATA NCQ (Native Command Queueing) from jdolecek-ncq branch
ATA subsystem was changed to support several outstanding commands, and use
NCQ xfers if supported by both the controller and the disk, including NCQ
error recovery. Set NCQ high priority for BPRIO_TIMECRITICAL xfers
if supported. Added FUA support.
Done some work towards MP-safe, all ATA code tsleep()/wakeup() replaced
by condvars, and switched most code from spl* to mutexes (separate
wd(4) and ata channel lock).
Introduced new option WD_CHAOS_MONKEY to facilitate testing of error
handling, fixed several uncovered issues. Also fixed several problems
with kernel dump to wd(4) disk.
Tested with ahcisata(4), mvsata(4), siisata(4), piixide(4) on amd64,
with and without port multiplier, both disk and ATAPI devices; other
drivers and archs mechanically adjusted and compile-tested. NCQ is
supported for ahcisata(4) and siisata(4) for any controller, for
mvsata(4) only Gen IIe ones for now. Also enabled ATAPI support in
mvsata(4).
Thanks to Matt Thomas for initial ATA infrastructure patch, and
Jonathan A.Kollasch for siisata(4) NCQ changes and general testing.
Also fixes PR kern/43169 (wd(4)); and PR kern/11811, PR kern/47041,
PR kern/51979 (kernel dump)
2017-10-07 19:05:31 +03:00
|
|
|
int bmaj, cmaj, i, mn, rc;
|
2009-05-16 03:49:28 +04:00
|
|
|
|
2017-11-01 22:34:45 +03:00
|
|
|
if ((rc = disk_begindetach(&dksc->sc_dkdev, wd_lastclose, self, flags)) != 0)
|
2009-05-16 03:49:28 +04:00
|
|
|
return rc;
|
1999-09-23 15:04:29 +04:00
|
|
|
|
|
|
|
/* locate the major number */
|
2002-09-06 17:18:43 +04:00
|
|
|
bmaj = bdevsw_lookup_major(&wd_bdevsw);
|
|
|
|
cmaj = cdevsw_lookup_major(&wd_cdevsw);
|
1999-09-23 15:04:29 +04:00
|
|
|
|
2004-08-10 06:33:58 +04:00
|
|
|
/* Nuke the vnodes for any open instances. */
|
|
|
|
for (i = 0; i < MAXPARTITIONS; i++) {
|
2006-03-28 21:38:24 +04:00
|
|
|
mn = WDMINOR(device_unit(self), i);
|
2004-08-10 06:33:58 +04:00
|
|
|
vdevgone(bmaj, mn, mn, VBLK);
|
|
|
|
vdevgone(cmaj, mn, mn, VCHR);
|
|
|
|
}
|
|
|
|
|
2017-11-01 22:34:45 +03:00
|
|
|
dk_drain(dksc);
|
1999-09-23 15:04:29 +04:00
|
|
|
|
2017-11-01 22:34:45 +03:00
|
|
|
/* Kill off any pending commands. */
|
|
|
|
mutex_enter(&wd->sc_lock);
|
|
|
|
wd->atabus->ata_killpending(wd->drvp);
|
2018-10-22 23:13:47 +03:00
|
|
|
|
|
|
|
callout_halt(&wd->sc_retry_callout, &wd->sc_lock);
|
|
|
|
callout_destroy(&wd->sc_retry_callout);
|
|
|
|
callout_halt(&wd->sc_requeue_callout, &wd->sc_lock);
|
|
|
|
callout_destroy(&wd->sc_requeue_callout);
|
|
|
|
callout_halt(&wd->sc_restart_diskqueue, &wd->sc_lock);
|
|
|
|
callout_destroy(&wd->sc_restart_diskqueue);
|
|
|
|
|
2017-11-01 22:34:45 +03:00
|
|
|
mutex_exit(&wd->sc_lock);
|
1999-09-23 15:04:29 +04:00
|
|
|
|
2017-11-01 22:34:45 +03:00
|
|
|
bufq_free(dksc->sc_bufq);
|
Merge support for SATA NCQ (Native Command Queueing) from jdolecek-ncq branch
ATA subsystem was changed to support several outstanding commands, and use
NCQ xfers if supported by both the controller and the disk, including NCQ
error recovery. Set NCQ high priority for BPRIO_TIMECRITICAL xfers
if supported. Added FUA support.
Done some work towards MP-safe, all ATA code tsleep()/wakeup() replaced
by condvars, and switched most code from spl* to mutexes (separate
wd(4) and ata channel lock).
Introduced new option WD_CHAOS_MONKEY to facilitate testing of error
handling, fixed several uncovered issues. Also fixed several problems
with kernel dump to wd(4) disk.
Tested with ahcisata(4), mvsata(4), siisata(4), piixide(4) on amd64,
with and without port multiplier, both disk and ATAPI devices; other
drivers and archs mechanically adjusted and compile-tested. NCQ is
supported for ahcisata(4) and siisata(4) for any controller, for
mvsata(4) only Gen IIe ones for now. Also enabled ATAPI support in
mvsata(4).
Thanks to Matt Thomas for initial ATA infrastructure patch, and
Jonathan A.Kollasch for siisata(4) NCQ changes and general testing.
Also fixes PR kern/43169 (wd(4)); and PR kern/11811, PR kern/47041,
PR kern/51979 (kernel dump)
2017-10-07 19:05:31 +03:00
|
|
|
|
2017-11-01 22:34:45 +03:00
|
|
|
/* Delete all of our wedges. */
|
|
|
|
dkwedge_delall(&dksc->sc_dkdev);
|
2002-07-21 19:32:17 +04:00
|
|
|
|
2019-03-19 09:47:12 +03:00
|
|
|
if (flags & DETACH_POWEROFF)
|
|
|
|
wd_standby(wd, AT_POLL);
|
|
|
|
|
2017-11-01 22:34:45 +03:00
|
|
|
/* Detach from the disk list. */
|
|
|
|
disk_detach(&dksc->sc_dkdev);
|
|
|
|
disk_destroy(&dksc->sc_dkdev);
|
1999-09-23 15:04:29 +04:00
|
|
|
|
2017-11-01 22:34:45 +03:00
|
|
|
dk_detach(dksc);
|
1999-09-23 15:04:29 +04:00
|
|
|
|
2004-08-30 13:34:41 +04:00
|
|
|
#ifdef WD_SOFTBADSECT
|
2004-08-04 01:38:45 +04:00
|
|
|
/* Clean out the bad sector list */
|
2017-12-13 13:24:31 +03:00
|
|
|
while (!SLIST_EMPTY(&wd->sc_bslist)) {
|
2018-10-22 23:13:47 +03:00
|
|
|
struct disk_badsectors *dbs = SLIST_FIRST(&wd->sc_bslist);
|
2017-12-13 13:24:31 +03:00
|
|
|
SLIST_REMOVE_HEAD(&wd->sc_bslist, dbs_next);
|
2018-10-22 23:13:47 +03:00
|
|
|
kmem_free(dbs, sizeof(*dbs));
|
2004-08-04 01:38:45 +04:00
|
|
|
}
|
2017-12-13 13:24:31 +03:00
|
|
|
wd->sc_bscount = 0;
|
2004-08-30 13:34:41 +04:00
|
|
|
#endif
|
2019-03-19 09:51:05 +03:00
|
|
|
if (wd->sc_typename != NULL) {
|
|
|
|
kmem_free(wd->sc_typename, strlen(wd->sc_typename) + 1);
|
|
|
|
wd->sc_typename = NULL;
|
|
|
|
}
|
2004-08-04 01:38:45 +04:00
|
|
|
|
2007-12-09 23:27:42 +03:00
|
|
|
pmf_device_deregister(self);
|
1999-09-23 15:04:29 +04:00
|
|
|
|
2017-11-01 22:34:45 +03:00
|
|
|
wd_sysctl_detach(wd);
|
Merge support for SATA NCQ (Native Command Queueing) from jdolecek-ncq branch
ATA subsystem was changed to support several outstanding commands, and use
NCQ xfers if supported by both the controller and the disk, including NCQ
error recovery. Set NCQ high priority for BPRIO_TIMECRITICAL xfers
if supported. Added FUA support.
Done some work towards MP-safe, all ATA code tsleep()/wakeup() replaced
by condvars, and switched most code from spl* to mutexes (separate
wd(4) and ata channel lock).
Introduced new option WD_CHAOS_MONKEY to facilitate testing of error
handling, fixed several uncovered issues. Also fixed several problems
with kernel dump to wd(4) disk.
Tested with ahcisata(4), mvsata(4), siisata(4), piixide(4) on amd64,
with and without port multiplier, both disk and ATAPI devices; other
drivers and archs mechanically adjusted and compile-tested. NCQ is
supported for ahcisata(4) and siisata(4) for any controller, for
mvsata(4) only Gen IIe ones for now. Also enabled ATAPI support in
mvsata(4).
Thanks to Matt Thomas for initial ATA infrastructure patch, and
Jonathan A.Kollasch for siisata(4) NCQ changes and general testing.
Also fixes PR kern/43169 (wd(4)); and PR kern/11811, PR kern/47041,
PR kern/51979 (kernel dump)
2017-10-07 19:05:31 +03:00
|
|
|
|
2021-12-28 16:27:32 +03:00
|
|
|
#ifdef WD_SOFTBADSECT
|
|
|
|
KASSERT(SLIST_EMPTY(&wd->sc_bslist));
|
|
|
|
cv_destroy(&wd->sc_bslist_cv);
|
|
|
|
#endif
|
|
|
|
|
2017-11-01 22:34:45 +03:00
|
|
|
mutex_destroy(&wd->sc_lock);
|
1999-09-23 15:04:29 +04:00
|
|
|
|
2017-11-01 22:34:45 +03:00
|
|
|
wd->drvp->drive_type = ATA_DRIVET_NONE; /* no drive any more here */
|
|
|
|
wd->drvp->drive_flags = 0;
|
2004-08-04 02:03:46 +04:00
|
|
|
|
1999-09-23 15:04:29 +04:00
|
|
|
return (0);
|
|
|
|
}
|
|
|
|
|
1994-03-10 08:18:33 +03:00
|
|
|
/*
|
1995-03-30 03:36:27 +04:00
|
|
|
* Read/write routine for a buffer. Validates the arguments and schedules the
|
|
|
|
* transfer. Does not wait for the transfer to complete.
|
1993-03-21 12:45:37 +03:00
|
|
|
*/
|
2017-11-01 22:34:45 +03:00
|
|
|
static void
|
2003-07-11 19:33:13 +04:00
|
|
|
wdstrategy(struct buf *bp)
|
1993-03-21 12:45:37 +03:00
|
|
|
{
|
2008-03-18 23:46:35 +03:00
|
|
|
struct wd_softc *wd =
|
2008-06-08 22:34:06 +04:00
|
|
|
device_lookup_private(&wd_cd, WDUNIT(bp->b_dev));
|
2017-11-01 22:34:45 +03:00
|
|
|
struct dk_softc *dksc = &wd->sc_dksc;
|
2000-02-07 23:16:47 +03:00
|
|
|
|
2017-11-01 22:34:45 +03:00
|
|
|
ATADEBUG_PRINT(("wdstrategy (%s)\n", dksc->sc_xname),
|
1998-10-13 13:33:59 +04:00
|
|
|
DEBUG_XFERS);
|
2003-07-11 19:33:13 +04:00
|
|
|
|
2009-05-19 23:56:10 +04:00
|
|
|
/* If device invalidated (e.g. media change, door open,
|
2010-11-05 18:49:37 +03:00
|
|
|
* device detachment), then error.
|
2009-05-19 23:56:10 +04:00
|
|
|
*/
|
2010-11-05 18:49:37 +03:00
|
|
|
if ((wd->sc_flags & WDF_LOADED) == 0 ||
|
2017-11-01 22:34:45 +03:00
|
|
|
!device_is_enabled(dksc->sc_dev))
|
|
|
|
goto err;
|
2000-02-07 23:16:47 +03:00
|
|
|
|
2004-08-30 13:34:41 +04:00
|
|
|
#ifdef WD_SOFTBADSECT
|
2003-04-15 18:11:00 +04:00
|
|
|
/*
|
|
|
|
* If the transfer about to be attempted contains only a block that
|
|
|
|
* is known to be bad then return an error for the transfer without
|
|
|
|
* even attempting to start a transfer up under the premis that we
|
|
|
|
* will just end up doing more retries for a transfer that will end
|
|
|
|
* up failing again.
|
|
|
|
*/
|
|
|
|
if (__predict_false(!SLIST_EMPTY(&wd->sc_bslist))) {
|
2018-01-07 14:37:30 +03:00
|
|
|
struct disklabel *lp = dksc->sc_dkdev.dk_label;
|
2003-04-15 18:11:00 +04:00
|
|
|
struct disk_badsectors *dbs;
|
2018-01-07 14:37:30 +03:00
|
|
|
daddr_t blkno, maxblk;
|
|
|
|
|
|
|
|
/* convert the block number to absolute */
|
|
|
|
if (lp->d_secsize >= DEV_BSIZE)
|
|
|
|
blkno = bp->b_blkno / (lp->d_secsize / DEV_BSIZE);
|
|
|
|
else
|
|
|
|
blkno = bp->b_blkno * (DEV_BSIZE / lp->d_secsize);
|
|
|
|
if (WDPART(bp->b_dev) != RAW_PART)
|
|
|
|
blkno += lp->d_partitions[WDPART(bp->b_dev)].p_offset;
|
|
|
|
maxblk = blkno + (bp->b_bcount / wd->sc_blksize) - 1;
|
2003-04-15 18:11:00 +04:00
|
|
|
|
Merge support for SATA NCQ (Native Command Queueing) from jdolecek-ncq branch
ATA subsystem was changed to support several outstanding commands, and use
NCQ xfers if supported by both the controller and the disk, including NCQ
error recovery. Set NCQ high priority for BPRIO_TIMECRITICAL xfers
if supported. Added FUA support.
Done some work towards MP-safe, all ATA code tsleep()/wakeup() replaced
by condvars, and switched most code from spl* to mutexes (separate
wd(4) and ata channel lock).
Introduced new option WD_CHAOS_MONKEY to facilitate testing of error
handling, fixed several uncovered issues. Also fixed several problems
with kernel dump to wd(4) disk.
Tested with ahcisata(4), mvsata(4), siisata(4), piixide(4) on amd64,
with and without port multiplier, both disk and ATAPI devices; other
drivers and archs mechanically adjusted and compile-tested. NCQ is
supported for ahcisata(4) and siisata(4) for any controller, for
mvsata(4) only Gen IIe ones for now. Also enabled ATAPI support in
mvsata(4).
Thanks to Matt Thomas for initial ATA infrastructure patch, and
Jonathan A.Kollasch for siisata(4) NCQ changes and general testing.
Also fixes PR kern/43169 (wd(4)); and PR kern/11811, PR kern/47041,
PR kern/51979 (kernel dump)
2017-10-07 19:05:31 +03:00
|
|
|
mutex_enter(&wd->sc_lock);
|
2003-04-15 18:11:00 +04:00
|
|
|
SLIST_FOREACH(dbs, &wd->sc_bslist, dbs_next)
|
2017-12-13 13:24:31 +03:00
|
|
|
if ((dbs->dbs_min <= bp->b_rawblkno &&
|
|
|
|
bp->b_rawblkno <= dbs->dbs_max) ||
|
2003-04-16 04:07:17 +04:00
|
|
|
(dbs->dbs_min <= maxblk && maxblk <= dbs->dbs_max)){
|
Merge support for SATA NCQ (Native Command Queueing) from jdolecek-ncq branch
ATA subsystem was changed to support several outstanding commands, and use
NCQ xfers if supported by both the controller and the disk, including NCQ
error recovery. Set NCQ high priority for BPRIO_TIMECRITICAL xfers
if supported. Added FUA support.
Done some work towards MP-safe, all ATA code tsleep()/wakeup() replaced
by condvars, and switched most code from spl* to mutexes (separate
wd(4) and ata channel lock).
Introduced new option WD_CHAOS_MONKEY to facilitate testing of error
handling, fixed several uncovered issues. Also fixed several problems
with kernel dump to wd(4) disk.
Tested with ahcisata(4), mvsata(4), siisata(4), piixide(4) on amd64,
with and without port multiplier, both disk and ATAPI devices; other
drivers and archs mechanically adjusted and compile-tested. NCQ is
supported for ahcisata(4) and siisata(4) for any controller, for
mvsata(4) only Gen IIe ones for now. Also enabled ATAPI support in
mvsata(4).
Thanks to Matt Thomas for initial ATA infrastructure patch, and
Jonathan A.Kollasch for siisata(4) NCQ changes and general testing.
Also fixes PR kern/43169 (wd(4)); and PR kern/11811, PR kern/47041,
PR kern/51979 (kernel dump)
2017-10-07 19:05:31 +03:00
|
|
|
mutex_exit(&wd->sc_lock);
|
2017-11-01 22:34:45 +03:00
|
|
|
goto err;
|
2003-04-16 04:07:17 +04:00
|
|
|
}
|
Merge support for SATA NCQ (Native Command Queueing) from jdolecek-ncq branch
ATA subsystem was changed to support several outstanding commands, and use
NCQ xfers if supported by both the controller and the disk, including NCQ
error recovery. Set NCQ high priority for BPRIO_TIMECRITICAL xfers
if supported. Added FUA support.
Done some work towards MP-safe, all ATA code tsleep()/wakeup() replaced
by condvars, and switched most code from spl* to mutexes (separate
wd(4) and ata channel lock).
Introduced new option WD_CHAOS_MONKEY to facilitate testing of error
handling, fixed several uncovered issues. Also fixed several problems
with kernel dump to wd(4) disk.
Tested with ahcisata(4), mvsata(4), siisata(4), piixide(4) on amd64,
with and without port multiplier, both disk and ATAPI devices; other
drivers and archs mechanically adjusted and compile-tested. NCQ is
supported for ahcisata(4) and siisata(4) for any controller, for
mvsata(4) only Gen IIe ones for now. Also enabled ATAPI support in
mvsata(4).
Thanks to Matt Thomas for initial ATA infrastructure patch, and
Jonathan A.Kollasch for siisata(4) NCQ changes and general testing.
Also fixes PR kern/43169 (wd(4)); and PR kern/11811, PR kern/47041,
PR kern/51979 (kernel dump)
2017-10-07 19:05:31 +03:00
|
|
|
mutex_exit(&wd->sc_lock);
|
2003-04-15 18:11:00 +04:00
|
|
|
}
|
2004-08-30 13:34:41 +04:00
|
|
|
#endif
|
2003-04-15 18:11:00 +04:00
|
|
|
|
2017-11-01 22:34:45 +03:00
|
|
|
dk_strategy(dksc, bp);
|
1994-03-10 08:18:33 +03:00
|
|
|
return;
|
2017-11-01 22:34:45 +03:00
|
|
|
|
|
|
|
err:
|
|
|
|
bp->b_error = EIO;
|
1995-03-30 03:36:27 +04:00
|
|
|
bp->b_resid = bp->b_bcount;
|
1993-03-21 12:45:37 +03:00
|
|
|
biodone(bp);
|
|
|
|
}
|
|
|
|
|
2017-11-03 16:01:26 +03:00
|
|
|
static void
|
|
|
|
wdstart1(struct wd_softc *wd, struct buf *bp, struct ata_xfer *xfer)
|
1994-03-10 08:18:33 +03:00
|
|
|
{
|
2017-11-01 22:34:45 +03:00
|
|
|
struct dk_softc *dksc = &wd->sc_dksc;
|
2020-05-25 01:12:29 +03:00
|
|
|
const uint32_t secsize = dksc->sc_dkdev.dk_geom.dg_secsize;
|
Merge support for SATA NCQ (Native Command Queueing) from jdolecek-ncq branch
ATA subsystem was changed to support several outstanding commands, and use
NCQ xfers if supported by both the controller and the disk, including NCQ
error recovery. Set NCQ high priority for BPRIO_TIMECRITICAL xfers
if supported. Added FUA support.
Done some work towards MP-safe, all ATA code tsleep()/wakeup() replaced
by condvars, and switched most code from spl* to mutexes (separate
wd(4) and ata channel lock).
Introduced new option WD_CHAOS_MONKEY to facilitate testing of error
handling, fixed several uncovered issues. Also fixed several problems
with kernel dump to wd(4) disk.
Tested with ahcisata(4), mvsata(4), siisata(4), piixide(4) on amd64,
with and without port multiplier, both disk and ATAPI devices; other
drivers and archs mechanically adjusted and compile-tested. NCQ is
supported for ahcisata(4) and siisata(4) for any controller, for
mvsata(4) only Gen IIe ones for now. Also enabled ATAPI support in
mvsata(4).
Thanks to Matt Thomas for initial ATA infrastructure patch, and
Jonathan A.Kollasch for siisata(4) NCQ changes and general testing.
Also fixes PR kern/43169 (wd(4)); and PR kern/11811, PR kern/47041,
PR kern/51979 (kernel dump)
2017-10-07 19:05:31 +03:00
|
|
|
|
|
|
|
KASSERT(bp == xfer->c_bio.bp || xfer->c_bio.bp == NULL);
|
|
|
|
KASSERT((xfer->c_flags & (C_WAITACT|C_FREE)) == 0);
|
2020-04-07 16:22:05 +03:00
|
|
|
KASSERT(mutex_owned(&wd->sc_lock));
|
Merge support for SATA NCQ (Native Command Queueing) from jdolecek-ncq branch
ATA subsystem was changed to support several outstanding commands, and use
NCQ xfers if supported by both the controller and the disk, including NCQ
error recovery. Set NCQ high priority for BPRIO_TIMECRITICAL xfers
if supported. Added FUA support.
Done some work towards MP-safe, all ATA code tsleep()/wakeup() replaced
by condvars, and switched most code from spl* to mutexes (separate
wd(4) and ata channel lock).
Introduced new option WD_CHAOS_MONKEY to facilitate testing of error
handling, fixed several uncovered issues. Also fixed several problems
with kernel dump to wd(4) disk.
Tested with ahcisata(4), mvsata(4), siisata(4), piixide(4) on amd64,
with and without port multiplier, both disk and ATAPI devices; other
drivers and archs mechanically adjusted and compile-tested. NCQ is
supported for ahcisata(4) and siisata(4) for any controller, for
mvsata(4) only Gen IIe ones for now. Also enabled ATAPI support in
mvsata(4).
Thanks to Matt Thomas for initial ATA infrastructure patch, and
Jonathan A.Kollasch for siisata(4) NCQ changes and general testing.
Also fixes PR kern/43169 (wd(4)); and PR kern/11811, PR kern/47041,
PR kern/51979 (kernel dump)
2017-10-07 19:05:31 +03:00
|
|
|
|
|
|
|
/* Reset state, so that retries don't use stale info */
|
|
|
|
if (__predict_false(xfer->c_retries > 0)) {
|
|
|
|
xfer->c_flags = 0;
|
|
|
|
memset(&xfer->c_bio, 0, sizeof(xfer->c_bio));
|
|
|
|
}
|
|
|
|
|
|
|
|
xfer->c_bio.blkno = bp->b_rawblkno;
|
|
|
|
xfer->c_bio.bcount = bp->b_bcount;
|
|
|
|
xfer->c_bio.databuf = bp->b_data;
|
|
|
|
xfer->c_bio.blkdone = 0;
|
|
|
|
xfer->c_bio.bp = bp;
|
|
|
|
|
2020-05-25 01:12:29 +03:00
|
|
|
/* Adjust blkno and bcount if xfer has been already partially done */
|
|
|
|
if (__predict_false(xfer->c_skip > 0)) {
|
|
|
|
KASSERT(xfer->c_skip < xfer->c_bio.bcount);
|
|
|
|
KASSERT((xfer->c_skip % secsize) == 0);
|
|
|
|
xfer->c_bio.bcount -= xfer->c_skip;
|
|
|
|
xfer->c_bio.blkno += xfer->c_skip / secsize;
|
|
|
|
}
|
|
|
|
|
Merge support for SATA NCQ (Native Command Queueing) from jdolecek-ncq branch
ATA subsystem was changed to support several outstanding commands, and use
NCQ xfers if supported by both the controller and the disk, including NCQ
error recovery. Set NCQ high priority for BPRIO_TIMECRITICAL xfers
if supported. Added FUA support.
Done some work towards MP-safe, all ATA code tsleep()/wakeup() replaced
by condvars, and switched most code from spl* to mutexes (separate
wd(4) and ata channel lock).
Introduced new option WD_CHAOS_MONKEY to facilitate testing of error
handling, fixed several uncovered issues. Also fixed several problems
with kernel dump to wd(4) disk.
Tested with ahcisata(4), mvsata(4), siisata(4), piixide(4) on amd64,
with and without port multiplier, both disk and ATAPI devices; other
drivers and archs mechanically adjusted and compile-tested. NCQ is
supported for ahcisata(4) and siisata(4) for any controller, for
mvsata(4) only Gen IIe ones for now. Also enabled ATAPI support in
mvsata(4).
Thanks to Matt Thomas for initial ATA infrastructure patch, and
Jonathan A.Kollasch for siisata(4) NCQ changes and general testing.
Also fixes PR kern/43169 (wd(4)); and PR kern/11811, PR kern/47041,
PR kern/51979 (kernel dump)
2017-10-07 19:05:31 +03:00
|
|
|
#ifdef WD_CHAOS_MONKEY
|
|
|
|
/*
|
|
|
|
* Override blkno to be over device capacity to trigger error,
|
|
|
|
* but only if it's read, to avoid trashing disk contents should
|
|
|
|
* the command be clipped, or otherwise misinterpreted, by the
|
|
|
|
* driver or controller.
|
|
|
|
*/
|
|
|
|
if (BUF_ISREAD(bp) && xfer->c_retries == 0 && wd->drv_chaos_freq > 0 &&
|
|
|
|
(++wd->drv_chaos_cnt % wd->drv_chaos_freq) == 0) {
|
2018-10-22 23:13:47 +03:00
|
|
|
device_printf(dksc->sc_dev, "%s: chaos xfer %"PRIxPTR"\n",
|
|
|
|
__func__, (intptr_t)xfer & PAGE_MASK);
|
Merge support for SATA NCQ (Native Command Queueing) from jdolecek-ncq branch
ATA subsystem was changed to support several outstanding commands, and use
NCQ xfers if supported by both the controller and the disk, including NCQ
error recovery. Set NCQ high priority for BPRIO_TIMECRITICAL xfers
if supported. Added FUA support.
Done some work towards MP-safe, all ATA code tsleep()/wakeup() replaced
by condvars, and switched most code from spl* to mutexes (separate
wd(4) and ata channel lock).
Introduced new option WD_CHAOS_MONKEY to facilitate testing of error
handling, fixed several uncovered issues. Also fixed several problems
with kernel dump to wd(4) disk.
Tested with ahcisata(4), mvsata(4), siisata(4), piixide(4) on amd64,
with and without port multiplier, both disk and ATAPI devices; other
drivers and archs mechanically adjusted and compile-tested. NCQ is
supported for ahcisata(4) and siisata(4) for any controller, for
mvsata(4) only Gen IIe ones for now. Also enabled ATAPI support in
mvsata(4).
Thanks to Matt Thomas for initial ATA infrastructure patch, and
Jonathan A.Kollasch for siisata(4) NCQ changes and general testing.
Also fixes PR kern/43169 (wd(4)); and PR kern/11811, PR kern/47041,
PR kern/51979 (kernel dump)
2017-10-07 19:05:31 +03:00
|
|
|
xfer->c_bio.blkno = 7777777 + wd->sc_capacity;
|
|
|
|
xfer->c_flags |= C_CHAOS;
|
|
|
|
}
|
|
|
|
#endif
|
2000-02-07 23:16:47 +03:00
|
|
|
|
1998-10-12 20:09:10 +04:00
|
|
|
/*
|
|
|
|
* If we're retrying, retry in single-sector mode. This will give us
|
|
|
|
* the sector number of the problem, and will eventually allow the
|
Merge support for SATA NCQ (Native Command Queueing) from jdolecek-ncq branch
ATA subsystem was changed to support several outstanding commands, and use
NCQ xfers if supported by both the controller and the disk, including NCQ
error recovery. Set NCQ high priority for BPRIO_TIMECRITICAL xfers
if supported. Added FUA support.
Done some work towards MP-safe, all ATA code tsleep()/wakeup() replaced
by condvars, and switched most code from spl* to mutexes (separate
wd(4) and ata channel lock).
Introduced new option WD_CHAOS_MONKEY to facilitate testing of error
handling, fixed several uncovered issues. Also fixed several problems
with kernel dump to wd(4) disk.
Tested with ahcisata(4), mvsata(4), siisata(4), piixide(4) on amd64,
with and without port multiplier, both disk and ATAPI devices; other
drivers and archs mechanically adjusted and compile-tested. NCQ is
supported for ahcisata(4) and siisata(4) for any controller, for
mvsata(4) only Gen IIe ones for now. Also enabled ATAPI support in
mvsata(4).
Thanks to Matt Thomas for initial ATA infrastructure patch, and
Jonathan A.Kollasch for siisata(4) NCQ changes and general testing.
Also fixes PR kern/43169 (wd(4)); and PR kern/11811, PR kern/47041,
PR kern/51979 (kernel dump)
2017-10-07 19:05:31 +03:00
|
|
|
* transfer to succeed. If FUA is requested, we can't actually
|
|
|
|
* do this, as ATA_SINGLE is usually executed as PIO transfer by drivers
|
|
|
|
* which support it, and that isn't compatible with NCQ/FUA.
|
1998-10-12 20:09:10 +04:00
|
|
|
*/
|
Merge support for SATA NCQ (Native Command Queueing) from jdolecek-ncq branch
ATA subsystem was changed to support several outstanding commands, and use
NCQ xfers if supported by both the controller and the disk, including NCQ
error recovery. Set NCQ high priority for BPRIO_TIMECRITICAL xfers
if supported. Added FUA support.
Done some work towards MP-safe, all ATA code tsleep()/wakeup() replaced
by condvars, and switched most code from spl* to mutexes (separate
wd(4) and ata channel lock).
Introduced new option WD_CHAOS_MONKEY to facilitate testing of error
handling, fixed several uncovered issues. Also fixed several problems
with kernel dump to wd(4) disk.
Tested with ahcisata(4), mvsata(4), siisata(4), piixide(4) on amd64,
with and without port multiplier, both disk and ATAPI devices; other
drivers and archs mechanically adjusted and compile-tested. NCQ is
supported for ahcisata(4) and siisata(4) for any controller, for
mvsata(4) only Gen IIe ones for now. Also enabled ATAPI support in
mvsata(4).
Thanks to Matt Thomas for initial ATA infrastructure patch, and
Jonathan A.Kollasch for siisata(4) NCQ changes and general testing.
Also fixes PR kern/43169 (wd(4)); and PR kern/11811, PR kern/47041,
PR kern/51979 (kernel dump)
2017-10-07 19:05:31 +03:00
|
|
|
if (xfer->c_retries >= WDIORETRIES_SINGLE &&
|
|
|
|
(bp->b_flags & B_MEDIA_FUA) == 0)
|
|
|
|
xfer->c_bio.flags = ATA_SINGLE;
|
1998-10-12 20:09:10 +04:00
|
|
|
else
|
Merge support for SATA NCQ (Native Command Queueing) from jdolecek-ncq branch
ATA subsystem was changed to support several outstanding commands, and use
NCQ xfers if supported by both the controller and the disk, including NCQ
error recovery. Set NCQ high priority for BPRIO_TIMECRITICAL xfers
if supported. Added FUA support.
Done some work towards MP-safe, all ATA code tsleep()/wakeup() replaced
by condvars, and switched most code from spl* to mutexes (separate
wd(4) and ata channel lock).
Introduced new option WD_CHAOS_MONKEY to facilitate testing of error
handling, fixed several uncovered issues. Also fixed several problems
with kernel dump to wd(4) disk.
Tested with ahcisata(4), mvsata(4), siisata(4), piixide(4) on amd64,
with and without port multiplier, both disk and ATAPI devices; other
drivers and archs mechanically adjusted and compile-tested. NCQ is
supported for ahcisata(4) and siisata(4) for any controller, for
mvsata(4) only Gen IIe ones for now. Also enabled ATAPI support in
mvsata(4).
Thanks to Matt Thomas for initial ATA infrastructure patch, and
Jonathan A.Kollasch for siisata(4) NCQ changes and general testing.
Also fixes PR kern/43169 (wd(4)); and PR kern/11811, PR kern/47041,
PR kern/51979 (kernel dump)
2017-10-07 19:05:31 +03:00
|
|
|
xfer->c_bio.flags = 0;
|
2017-11-01 22:34:45 +03:00
|
|
|
|
|
|
|
/*
|
|
|
|
* request LBA48 transfers when supported by the controller
|
|
|
|
* and needed by transfer offset or size.
|
|
|
|
*/
|
2004-09-28 22:22:33 +04:00
|
|
|
if (wd->sc_flags & WDF_LBA48 &&
|
2020-05-25 01:12:29 +03:00
|
|
|
(((xfer->c_bio.blkno + xfer->c_bio.bcount / secsize) >
|
Merge support for SATA NCQ (Native Command Queueing) from jdolecek-ncq branch
ATA subsystem was changed to support several outstanding commands, and use
NCQ xfers if supported by both the controller and the disk, including NCQ
error recovery. Set NCQ high priority for BPRIO_TIMECRITICAL xfers
if supported. Added FUA support.
Done some work towards MP-safe, all ATA code tsleep()/wakeup() replaced
by condvars, and switched most code from spl* to mutexes (separate
wd(4) and ata channel lock).
Introduced new option WD_CHAOS_MONKEY to facilitate testing of error
handling, fixed several uncovered issues. Also fixed several problems
with kernel dump to wd(4) disk.
Tested with ahcisata(4), mvsata(4), siisata(4), piixide(4) on amd64,
with and without port multiplier, both disk and ATAPI devices; other
drivers and archs mechanically adjusted and compile-tested. NCQ is
supported for ahcisata(4) and siisata(4) for any controller, for
mvsata(4) only Gen IIe ones for now. Also enabled ATAPI support in
mvsata(4).
Thanks to Matt Thomas for initial ATA infrastructure patch, and
Jonathan A.Kollasch for siisata(4) NCQ changes and general testing.
Also fixes PR kern/43169 (wd(4)); and PR kern/11811, PR kern/47041,
PR kern/51979 (kernel dump)
2017-10-07 19:05:31 +03:00
|
|
|
wd->sc_capacity28) ||
|
2020-05-25 01:12:29 +03:00
|
|
|
((xfer->c_bio.bcount / secsize) > 128)))
|
Merge support for SATA NCQ (Native Command Queueing) from jdolecek-ncq branch
ATA subsystem was changed to support several outstanding commands, and use
NCQ xfers if supported by both the controller and the disk, including NCQ
error recovery. Set NCQ high priority for BPRIO_TIMECRITICAL xfers
if supported. Added FUA support.
Done some work towards MP-safe, all ATA code tsleep()/wakeup() replaced
by condvars, and switched most code from spl* to mutexes (separate
wd(4) and ata channel lock).
Introduced new option WD_CHAOS_MONKEY to facilitate testing of error
handling, fixed several uncovered issues. Also fixed several problems
with kernel dump to wd(4) disk.
Tested with ahcisata(4), mvsata(4), siisata(4), piixide(4) on amd64,
with and without port multiplier, both disk and ATAPI devices; other
drivers and archs mechanically adjusted and compile-tested. NCQ is
supported for ahcisata(4) and siisata(4) for any controller, for
mvsata(4) only Gen IIe ones for now. Also enabled ATAPI support in
mvsata(4).
Thanks to Matt Thomas for initial ATA infrastructure patch, and
Jonathan A.Kollasch for siisata(4) NCQ changes and general testing.
Also fixes PR kern/43169 (wd(4)); and PR kern/11811, PR kern/47041,
PR kern/51979 (kernel dump)
2017-10-07 19:05:31 +03:00
|
|
|
xfer->c_bio.flags |= ATA_LBA48;
|
|
|
|
|
|
|
|
/*
|
|
|
|
* If NCQ was negotiated, always use it for the first several attempts.
|
|
|
|
* 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 (WD_USE_NCQ(wd) && (xfer->c_retries < WDIORETRIES_SINGLE ||
|
|
|
|
(bp->b_flags & B_MEDIA_FUA) != 0)) {
|
|
|
|
xfer->c_bio.flags |= ATA_LBA48;
|
|
|
|
xfer->c_flags |= C_NCQ;
|
|
|
|
|
|
|
|
if (WD_USE_NCQ_PRIO(wd) &&
|
|
|
|
BIO_GETPRIO(bp) == BPRIO_TIMECRITICAL)
|
|
|
|
xfer->c_bio.flags |= ATA_PRIO_HIGH;
|
|
|
|
}
|
|
|
|
|
1998-10-12 20:09:10 +04:00
|
|
|
if (wd->sc_flags & WDF_LBA)
|
Merge support for SATA NCQ (Native Command Queueing) from jdolecek-ncq branch
ATA subsystem was changed to support several outstanding commands, and use
NCQ xfers if supported by both the controller and the disk, including NCQ
error recovery. Set NCQ high priority for BPRIO_TIMECRITICAL xfers
if supported. Added FUA support.
Done some work towards MP-safe, all ATA code tsleep()/wakeup() replaced
by condvars, and switched most code from spl* to mutexes (separate
wd(4) and ata channel lock).
Introduced new option WD_CHAOS_MONKEY to facilitate testing of error
handling, fixed several uncovered issues. Also fixed several problems
with kernel dump to wd(4) disk.
Tested with ahcisata(4), mvsata(4), siisata(4), piixide(4) on amd64,
with and without port multiplier, both disk and ATAPI devices; other
drivers and archs mechanically adjusted and compile-tested. NCQ is
supported for ahcisata(4) and siisata(4) for any controller, for
mvsata(4) only Gen IIe ones for now. Also enabled ATAPI support in
mvsata(4).
Thanks to Matt Thomas for initial ATA infrastructure patch, and
Jonathan A.Kollasch for siisata(4) NCQ changes and general testing.
Also fixes PR kern/43169 (wd(4)); and PR kern/11811, PR kern/47041,
PR kern/51979 (kernel dump)
2017-10-07 19:05:31 +03:00
|
|
|
xfer->c_bio.flags |= ATA_LBA;
|
2019-04-07 16:00:00 +03:00
|
|
|
if (bp->b_flags & B_READ) {
|
Merge support for SATA NCQ (Native Command Queueing) from jdolecek-ncq branch
ATA subsystem was changed to support several outstanding commands, and use
NCQ xfers if supported by both the controller and the disk, including NCQ
error recovery. Set NCQ high priority for BPRIO_TIMECRITICAL xfers
if supported. Added FUA support.
Done some work towards MP-safe, all ATA code tsleep()/wakeup() replaced
by condvars, and switched most code from spl* to mutexes (separate
wd(4) and ata channel lock).
Introduced new option WD_CHAOS_MONKEY to facilitate testing of error
handling, fixed several uncovered issues. Also fixed several problems
with kernel dump to wd(4) disk.
Tested with ahcisata(4), mvsata(4), siisata(4), piixide(4) on amd64,
with and without port multiplier, both disk and ATAPI devices; other
drivers and archs mechanically adjusted and compile-tested. NCQ is
supported for ahcisata(4) and siisata(4) for any controller, for
mvsata(4) only Gen IIe ones for now. Also enabled ATAPI support in
mvsata(4).
Thanks to Matt Thomas for initial ATA infrastructure patch, and
Jonathan A.Kollasch for siisata(4) NCQ changes and general testing.
Also fixes PR kern/43169 (wd(4)); and PR kern/11811, PR kern/47041,
PR kern/51979 (kernel dump)
2017-10-07 19:05:31 +03:00
|
|
|
xfer->c_bio.flags |= ATA_READ;
|
2019-04-07 16:00:00 +03:00
|
|
|
} else {
|
|
|
|
/* it's a write */
|
|
|
|
wd->sc_flags |= WDF_DIRTY;
|
|
|
|
}
|
Merge support for SATA NCQ (Native Command Queueing) from jdolecek-ncq branch
ATA subsystem was changed to support several outstanding commands, and use
NCQ xfers if supported by both the controller and the disk, including NCQ
error recovery. Set NCQ high priority for BPRIO_TIMECRITICAL xfers
if supported. Added FUA support.
Done some work towards MP-safe, all ATA code tsleep()/wakeup() replaced
by condvars, and switched most code from spl* to mutexes (separate
wd(4) and ata channel lock).
Introduced new option WD_CHAOS_MONKEY to facilitate testing of error
handling, fixed several uncovered issues. Also fixed several problems
with kernel dump to wd(4) disk.
Tested with ahcisata(4), mvsata(4), siisata(4), piixide(4) on amd64,
with and without port multiplier, both disk and ATAPI devices; other
drivers and archs mechanically adjusted and compile-tested. NCQ is
supported for ahcisata(4) and siisata(4) for any controller, for
mvsata(4) only Gen IIe ones for now. Also enabled ATAPI support in
mvsata(4).
Thanks to Matt Thomas for initial ATA infrastructure patch, and
Jonathan A.Kollasch for siisata(4) NCQ changes and general testing.
Also fixes PR kern/43169 (wd(4)); and PR kern/11811, PR kern/47041,
PR kern/51979 (kernel dump)
2017-10-07 19:05:31 +03:00
|
|
|
if (bp->b_flags & B_MEDIA_FUA) {
|
|
|
|
/* If not using NCQ, the command WRITE DMA FUA EXT is LBA48 */
|
|
|
|
KASSERT((wd->sc_flags & WDF_LBA48) != 0);
|
|
|
|
if ((xfer->c_flags & C_NCQ) == 0)
|
|
|
|
xfer->c_bio.flags |= ATA_LBA48;
|
|
|
|
|
|
|
|
xfer->c_bio.flags |= ATA_FUA;
|
|
|
|
}
|
|
|
|
|
2019-06-06 23:41:04 +03:00
|
|
|
if (xfer->c_retries == 0)
|
|
|
|
wd->inflight++;
|
2020-04-07 16:22:05 +03:00
|
|
|
mutex_exit(&wd->sc_lock);
|
|
|
|
|
2020-04-13 13:49:34 +03:00
|
|
|
/* Queue the xfer */
|
|
|
|
wd->atabus->ata_bio(wd->drvp, xfer);
|
2020-04-07 16:22:05 +03:00
|
|
|
|
|
|
|
mutex_enter(&wd->sc_lock);
|
2017-11-03 16:01:26 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
static int
|
|
|
|
wd_diskstart(device_t dev, struct buf *bp)
|
|
|
|
{
|
|
|
|
struct wd_softc *wd = device_private(dev);
|
|
|
|
#ifdef ATADEBUG
|
|
|
|
struct dk_softc *dksc = &wd->sc_dksc;
|
|
|
|
#endif
|
|
|
|
struct ata_xfer *xfer;
|
2019-03-19 19:56:29 +03:00
|
|
|
struct ata_channel *chp;
|
|
|
|
unsigned openings;
|
2019-05-24 09:01:05 +03:00
|
|
|
int ticks;
|
2017-11-03 16:01:26 +03:00
|
|
|
|
|
|
|
mutex_enter(&wd->sc_lock);
|
|
|
|
|
2019-03-19 19:56:29 +03:00
|
|
|
chp = wd->drvp->chnl_softc;
|
|
|
|
|
|
|
|
ata_channel_lock(chp);
|
|
|
|
openings = ata_queue_openings(chp);
|
|
|
|
ata_channel_unlock(chp);
|
|
|
|
|
|
|
|
openings = uimin(openings, wd->drvp->drv_openings);
|
|
|
|
|
|
|
|
if (wd->inflight >= openings) {
|
2019-05-24 09:01:05 +03:00
|
|
|
/*
|
|
|
|
* pretend we run out of memory when the queue is full,
|
|
|
|
* so that the operation is retried after a minimal
|
|
|
|
* delay.
|
|
|
|
*/
|
|
|
|
xfer = NULL;
|
|
|
|
ticks = 1;
|
|
|
|
} else {
|
|
|
|
/*
|
|
|
|
* If there is no available memory, retry later. This
|
|
|
|
* happens very rarely and only under memory pressure,
|
|
|
|
* so wait relatively long before retry.
|
|
|
|
*/
|
|
|
|
xfer = ata_get_xfer(chp, false);
|
|
|
|
ticks = hz/2;
|
2019-03-19 19:56:29 +03:00
|
|
|
}
|
|
|
|
|
2017-11-03 16:01:26 +03:00
|
|
|
if (xfer == NULL) {
|
|
|
|
ATADEBUG_PRINT(("wd_diskstart %s no xfer\n",
|
|
|
|
dksc->sc_xname), DEBUG_XFERS);
|
2018-10-22 23:13:47 +03:00
|
|
|
|
|
|
|
/*
|
2019-05-24 09:01:05 +03:00
|
|
|
* The disk queue is pushed automatically when an I/O
|
|
|
|
* operation finishes or another one is queued. We
|
|
|
|
* need this extra timeout because an ATA channel
|
|
|
|
* might be shared by more than one disk queue and
|
|
|
|
* all queues need to be restarted when another slot
|
|
|
|
* becomes available.
|
2018-10-22 23:13:47 +03:00
|
|
|
*/
|
|
|
|
if (!callout_pending(&wd->sc_restart_diskqueue)) {
|
2019-05-24 09:01:05 +03:00
|
|
|
callout_reset(&wd->sc_restart_diskqueue, ticks,
|
2018-10-22 23:13:47 +03:00
|
|
|
wdrestart, dev);
|
|
|
|
}
|
|
|
|
|
2017-11-03 16:01:26 +03:00
|
|
|
mutex_exit(&wd->sc_lock);
|
|
|
|
return EAGAIN;
|
|
|
|
}
|
|
|
|
|
|
|
|
wdstart1(wd, bp, xfer);
|
2017-11-01 22:34:45 +03:00
|
|
|
|
|
|
|
mutex_exit(&wd->sc_lock);
|
|
|
|
|
|
|
|
return 0;
|
1998-10-12 20:09:10 +04:00
|
|
|
}
|
|
|
|
|
2017-11-01 22:34:45 +03:00
|
|
|
/*
|
|
|
|
* Queue a drive for I/O.
|
|
|
|
*/
|
|
|
|
static void
|
2018-10-22 23:13:47 +03:00
|
|
|
wdrestart(void *x)
|
2017-11-01 22:34:45 +03:00
|
|
|
{
|
2018-10-22 23:13:47 +03:00
|
|
|
device_t self = x;
|
2017-11-01 22:34:45 +03:00
|
|
|
struct wd_softc *wd = device_private(self);
|
|
|
|
struct dk_softc *dksc = &wd->sc_dksc;
|
|
|
|
|
|
|
|
ATADEBUG_PRINT(("wdstart %s\n", dksc->sc_xname),
|
|
|
|
DEBUG_XFERS);
|
|
|
|
|
|
|
|
if (!device_is_active(dksc->sc_dev))
|
|
|
|
return;
|
|
|
|
|
|
|
|
dk_start(dksc, NULL);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
Merge support for SATA NCQ (Native Command Queueing) from jdolecek-ncq branch
ATA subsystem was changed to support several outstanding commands, and use
NCQ xfers if supported by both the controller and the disk, including NCQ
error recovery. Set NCQ high priority for BPRIO_TIMECRITICAL xfers
if supported. Added FUA support.
Done some work towards MP-safe, all ATA code tsleep()/wakeup() replaced
by condvars, and switched most code from spl* to mutexes (separate
wd(4) and ata channel lock).
Introduced new option WD_CHAOS_MONKEY to facilitate testing of error
handling, fixed several uncovered issues. Also fixed several problems
with kernel dump to wd(4) disk.
Tested with ahcisata(4), mvsata(4), siisata(4), piixide(4) on amd64,
with and without port multiplier, both disk and ATAPI devices; other
drivers and archs mechanically adjusted and compile-tested. NCQ is
supported for ahcisata(4) and siisata(4) for any controller, for
mvsata(4) only Gen IIe ones for now. Also enabled ATAPI support in
mvsata(4).
Thanks to Matt Thomas for initial ATA infrastructure patch, and
Jonathan A.Kollasch for siisata(4) NCQ changes and general testing.
Also fixes PR kern/43169 (wd(4)); and PR kern/11811, PR kern/47041,
PR kern/51979 (kernel dump)
2017-10-07 19:05:31 +03:00
|
|
|
wddone(device_t self, struct ata_xfer *xfer)
|
1998-10-12 20:09:10 +04:00
|
|
|
{
|
Merge support for SATA NCQ (Native Command Queueing) from jdolecek-ncq branch
ATA subsystem was changed to support several outstanding commands, and use
NCQ xfers if supported by both the controller and the disk, including NCQ
error recovery. Set NCQ high priority for BPRIO_TIMECRITICAL xfers
if supported. Added FUA support.
Done some work towards MP-safe, all ATA code tsleep()/wakeup() replaced
by condvars, and switched most code from spl* to mutexes (separate
wd(4) and ata channel lock).
Introduced new option WD_CHAOS_MONKEY to facilitate testing of error
handling, fixed several uncovered issues. Also fixed several problems
with kernel dump to wd(4) disk.
Tested with ahcisata(4), mvsata(4), siisata(4), piixide(4) on amd64,
with and without port multiplier, both disk and ATAPI devices; other
drivers and archs mechanically adjusted and compile-tested. NCQ is
supported for ahcisata(4) and siisata(4) for any controller, for
mvsata(4) only Gen IIe ones for now. Also enabled ATAPI support in
mvsata(4).
Thanks to Matt Thomas for initial ATA infrastructure patch, and
Jonathan A.Kollasch for siisata(4) NCQ changes and general testing.
Also fixes PR kern/43169 (wd(4)); and PR kern/11811, PR kern/47041,
PR kern/51979 (kernel dump)
2017-10-07 19:05:31 +03:00
|
|
|
struct wd_softc *wd = device_private(self);
|
2017-11-01 22:34:45 +03:00
|
|
|
struct dk_softc *dksc = &wd->sc_dksc;
|
2002-06-28 20:40:50 +04:00
|
|
|
const char *errmsg;
|
|
|
|
int do_perror = 0;
|
Merge support for SATA NCQ (Native Command Queueing) from jdolecek-ncq branch
ATA subsystem was changed to support several outstanding commands, and use
NCQ xfers if supported by both the controller and the disk, including NCQ
error recovery. Set NCQ high priority for BPRIO_TIMECRITICAL xfers
if supported. Added FUA support.
Done some work towards MP-safe, all ATA code tsleep()/wakeup() replaced
by condvars, and switched most code from spl* to mutexes (separate
wd(4) and ata channel lock).
Introduced new option WD_CHAOS_MONKEY to facilitate testing of error
handling, fixed several uncovered issues. Also fixed several problems
with kernel dump to wd(4) disk.
Tested with ahcisata(4), mvsata(4), siisata(4), piixide(4) on amd64,
with and without port multiplier, both disk and ATAPI devices; other
drivers and archs mechanically adjusted and compile-tested. NCQ is
supported for ahcisata(4) and siisata(4) for any controller, for
mvsata(4) only Gen IIe ones for now. Also enabled ATAPI support in
mvsata(4).
Thanks to Matt Thomas for initial ATA infrastructure patch, and
Jonathan A.Kollasch for siisata(4) NCQ changes and general testing.
Also fixes PR kern/43169 (wd(4)); and PR kern/11811, PR kern/47041,
PR kern/51979 (kernel dump)
2017-10-07 19:05:31 +03:00
|
|
|
struct buf *bp;
|
1998-10-12 20:09:10 +04:00
|
|
|
|
2017-11-01 22:34:45 +03:00
|
|
|
ATADEBUG_PRINT(("wddone %s\n", dksc->sc_xname),
|
2007-11-07 11:56:41 +03:00
|
|
|
DEBUG_XFERS);
|
Merge support for SATA NCQ (Native Command Queueing) from jdolecek-ncq branch
ATA subsystem was changed to support several outstanding commands, and use
NCQ xfers if supported by both the controller and the disk, including NCQ
error recovery. Set NCQ high priority for BPRIO_TIMECRITICAL xfers
if supported. Added FUA support.
Done some work towards MP-safe, all ATA code tsleep()/wakeup() replaced
by condvars, and switched most code from spl* to mutexes (separate
wd(4) and ata channel lock).
Introduced new option WD_CHAOS_MONKEY to facilitate testing of error
handling, fixed several uncovered issues. Also fixed several problems
with kernel dump to wd(4) disk.
Tested with ahcisata(4), mvsata(4), siisata(4), piixide(4) on amd64,
with and without port multiplier, both disk and ATAPI devices; other
drivers and archs mechanically adjusted and compile-tested. NCQ is
supported for ahcisata(4) and siisata(4) for any controller, for
mvsata(4) only Gen IIe ones for now. Also enabled ATAPI support in
mvsata(4).
Thanks to Matt Thomas for initial ATA infrastructure patch, and
Jonathan A.Kollasch for siisata(4) NCQ changes and general testing.
Also fixes PR kern/43169 (wd(4)); and PR kern/11811, PR kern/47041,
PR kern/51979 (kernel dump)
2017-10-07 19:05:31 +03:00
|
|
|
|
|
|
|
if (__predict_false(wddoingadump)) {
|
|
|
|
/* just drop it to the floor */
|
|
|
|
ata_free_xfer(wd->drvp->chnl_softc, xfer);
|
2001-06-13 22:17:38 +04:00
|
|
|
return;
|
Merge support for SATA NCQ (Native Command Queueing) from jdolecek-ncq branch
ATA subsystem was changed to support several outstanding commands, and use
NCQ xfers if supported by both the controller and the disk, including NCQ
error recovery. Set NCQ high priority for BPRIO_TIMECRITICAL xfers
if supported. Added FUA support.
Done some work towards MP-safe, all ATA code tsleep()/wakeup() replaced
by condvars, and switched most code from spl* to mutexes (separate
wd(4) and ata channel lock).
Introduced new option WD_CHAOS_MONKEY to facilitate testing of error
handling, fixed several uncovered issues. Also fixed several problems
with kernel dump to wd(4) disk.
Tested with ahcisata(4), mvsata(4), siisata(4), piixide(4) on amd64,
with and without port multiplier, both disk and ATAPI devices; other
drivers and archs mechanically adjusted and compile-tested. NCQ is
supported for ahcisata(4) and siisata(4) for any controller, for
mvsata(4) only Gen IIe ones for now. Also enabled ATAPI support in
mvsata(4).
Thanks to Matt Thomas for initial ATA infrastructure patch, and
Jonathan A.Kollasch for siisata(4) NCQ changes and general testing.
Also fixes PR kern/43169 (wd(4)); and PR kern/11811, PR kern/47041,
PR kern/51979 (kernel dump)
2017-10-07 19:05:31 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
bp = xfer->c_bio.bp;
|
|
|
|
KASSERT(bp != NULL);
|
|
|
|
|
|
|
|
bp->b_resid = xfer->c_bio.bcount;
|
|
|
|
switch (xfer->c_bio.error) {
|
1998-10-12 20:09:10 +04:00
|
|
|
case ERR_DMA:
|
2002-06-28 20:40:50 +04:00
|
|
|
errmsg = "DMA error";
|
1998-10-12 20:09:10 +04:00
|
|
|
goto retry;
|
|
|
|
case ERR_DF:
|
2002-06-28 20:40:50 +04:00
|
|
|
errmsg = "device fault";
|
1998-10-12 20:09:10 +04:00
|
|
|
goto retry;
|
|
|
|
case TIMEOUT:
|
2002-06-28 20:40:50 +04:00
|
|
|
errmsg = "device timeout";
|
1998-10-12 20:09:10 +04:00
|
|
|
goto retry;
|
Merge support for SATA NCQ (Native Command Queueing) from jdolecek-ncq branch
ATA subsystem was changed to support several outstanding commands, and use
NCQ xfers if supported by both the controller and the disk, including NCQ
error recovery. Set NCQ high priority for BPRIO_TIMECRITICAL xfers
if supported. Added FUA support.
Done some work towards MP-safe, all ATA code tsleep()/wakeup() replaced
by condvars, and switched most code from spl* to mutexes (separate
wd(4) and ata channel lock).
Introduced new option WD_CHAOS_MONKEY to facilitate testing of error
handling, fixed several uncovered issues. Also fixed several problems
with kernel dump to wd(4) disk.
Tested with ahcisata(4), mvsata(4), siisata(4), piixide(4) on amd64,
with and without port multiplier, both disk and ATAPI devices; other
drivers and archs mechanically adjusted and compile-tested. NCQ is
supported for ahcisata(4) and siisata(4) for any controller, for
mvsata(4) only Gen IIe ones for now. Also enabled ATAPI support in
mvsata(4).
Thanks to Matt Thomas for initial ATA infrastructure patch, and
Jonathan A.Kollasch for siisata(4) NCQ changes and general testing.
Also fixes PR kern/43169 (wd(4)); and PR kern/11811, PR kern/47041,
PR kern/51979 (kernel dump)
2017-10-07 19:05:31 +03:00
|
|
|
case REQUEUE:
|
|
|
|
errmsg = "requeue";
|
|
|
|
goto retry2;
|
2004-08-01 01:26:42 +04:00
|
|
|
case ERR_RESET:
|
|
|
|
errmsg = "channel reset";
|
|
|
|
goto retry2;
|
1998-10-12 20:09:10 +04:00
|
|
|
case ERROR:
|
|
|
|
/* Don't care about media change bits */
|
Merge support for SATA NCQ (Native Command Queueing) from jdolecek-ncq branch
ATA subsystem was changed to support several outstanding commands, and use
NCQ xfers if supported by both the controller and the disk, including NCQ
error recovery. Set NCQ high priority for BPRIO_TIMECRITICAL xfers
if supported. Added FUA support.
Done some work towards MP-safe, all ATA code tsleep()/wakeup() replaced
by condvars, and switched most code from spl* to mutexes (separate
wd(4) and ata channel lock).
Introduced new option WD_CHAOS_MONKEY to facilitate testing of error
handling, fixed several uncovered issues. Also fixed several problems
with kernel dump to wd(4) disk.
Tested with ahcisata(4), mvsata(4), siisata(4), piixide(4) on amd64,
with and without port multiplier, both disk and ATAPI devices; other
drivers and archs mechanically adjusted and compile-tested. NCQ is
supported for ahcisata(4) and siisata(4) for any controller, for
mvsata(4) only Gen IIe ones for now. Also enabled ATAPI support in
mvsata(4).
Thanks to Matt Thomas for initial ATA infrastructure patch, and
Jonathan A.Kollasch for siisata(4) NCQ changes and general testing.
Also fixes PR kern/43169 (wd(4)); and PR kern/11811, PR kern/47041,
PR kern/51979 (kernel dump)
2017-10-07 19:05:31 +03:00
|
|
|
if (xfer->c_bio.r_error != 0 &&
|
|
|
|
(xfer->c_bio.r_error & ~(WDCE_MC | WDCE_MCR)) == 0)
|
1998-10-12 20:09:10 +04:00
|
|
|
goto noerror;
|
2002-06-28 20:40:50 +04:00
|
|
|
errmsg = "error";
|
|
|
|
do_perror = 1;
|
1998-10-12 20:09:10 +04:00
|
|
|
retry: /* Just reset and retry. Can we do more ? */
|
2017-10-14 16:15:14 +03:00
|
|
|
if ((xfer->c_flags & C_RECOVERED) == 0) {
|
|
|
|
int wflags = (xfer->c_flags & C_POLL) ? AT_POLL : 0;
|
2018-10-22 23:13:47 +03:00
|
|
|
ata_channel_lock(wd->drvp->chnl_softc);
|
|
|
|
ata_thread_run(wd->drvp->chnl_softc, wflags,
|
|
|
|
ATACH_TH_DRIVE_RESET, wd->drvp->drive);
|
|
|
|
ata_channel_unlock(wd->drvp->chnl_softc);
|
2017-10-14 16:15:14 +03:00
|
|
|
}
|
2004-08-01 01:26:42 +04:00
|
|
|
retry2:
|
Merge support for SATA NCQ (Native Command Queueing) from jdolecek-ncq branch
ATA subsystem was changed to support several outstanding commands, and use
NCQ xfers if supported by both the controller and the disk, including NCQ
error recovery. Set NCQ high priority for BPRIO_TIMECRITICAL xfers
if supported. Added FUA support.
Done some work towards MP-safe, all ATA code tsleep()/wakeup() replaced
by condvars, and switched most code from spl* to mutexes (separate
wd(4) and ata channel lock).
Introduced new option WD_CHAOS_MONKEY to facilitate testing of error
handling, fixed several uncovered issues. Also fixed several problems
with kernel dump to wd(4) disk.
Tested with ahcisata(4), mvsata(4), siisata(4), piixide(4) on amd64,
with and without port multiplier, both disk and ATAPI devices; other
drivers and archs mechanically adjusted and compile-tested. NCQ is
supported for ahcisata(4) and siisata(4) for any controller, for
mvsata(4) only Gen IIe ones for now. Also enabled ATAPI support in
mvsata(4).
Thanks to Matt Thomas for initial ATA infrastructure patch, and
Jonathan A.Kollasch for siisata(4) NCQ changes and general testing.
Also fixes PR kern/43169 (wd(4)); and PR kern/11811, PR kern/47041,
PR kern/51979 (kernel dump)
2017-10-07 19:05:31 +03:00
|
|
|
mutex_enter(&wd->sc_lock);
|
|
|
|
|
2002-06-28 20:40:50 +04:00
|
|
|
diskerr(bp, "wd", errmsg, LOG_PRINTF,
|
2017-11-01 22:34:45 +03:00
|
|
|
xfer->c_bio.blkdone, dksc->sc_dkdev.dk_label);
|
Merge support for SATA NCQ (Native Command Queueing) from jdolecek-ncq branch
ATA subsystem was changed to support several outstanding commands, and use
NCQ xfers if supported by both the controller and the disk, including NCQ
error recovery. Set NCQ high priority for BPRIO_TIMECRITICAL xfers
if supported. Added FUA support.
Done some work towards MP-safe, all ATA code tsleep()/wakeup() replaced
by condvars, and switched most code from spl* to mutexes (separate
wd(4) and ata channel lock).
Introduced new option WD_CHAOS_MONKEY to facilitate testing of error
handling, fixed several uncovered issues. Also fixed several problems
with kernel dump to wd(4) disk.
Tested with ahcisata(4), mvsata(4), siisata(4), piixide(4) on amd64,
with and without port multiplier, both disk and ATAPI devices; other
drivers and archs mechanically adjusted and compile-tested. NCQ is
supported for ahcisata(4) and siisata(4) for any controller, for
mvsata(4) only Gen IIe ones for now. Also enabled ATAPI support in
mvsata(4).
Thanks to Matt Thomas for initial ATA infrastructure patch, and
Jonathan A.Kollasch for siisata(4) NCQ changes and general testing.
Also fixes PR kern/43169 (wd(4)); and PR kern/11811, PR kern/47041,
PR kern/51979 (kernel dump)
2017-10-07 19:05:31 +03:00
|
|
|
if (xfer->c_retries < WDIORETRIES)
|
2018-10-22 23:13:47 +03:00
|
|
|
printf(", xfer %"PRIxPTR", retry %d",
|
|
|
|
(intptr_t)xfer & PAGE_MASK,
|
|
|
|
xfer->c_retries);
|
2007-09-16 22:41:47 +04:00
|
|
|
printf("\n");
|
2002-06-28 20:40:50 +04:00
|
|
|
if (do_perror)
|
Merge support for SATA NCQ (Native Command Queueing) from jdolecek-ncq branch
ATA subsystem was changed to support several outstanding commands, and use
NCQ xfers if supported by both the controller and the disk, including NCQ
error recovery. Set NCQ high priority for BPRIO_TIMECRITICAL xfers
if supported. Added FUA support.
Done some work towards MP-safe, all ATA code tsleep()/wakeup() replaced
by condvars, and switched most code from spl* to mutexes (separate
wd(4) and ata channel lock).
Introduced new option WD_CHAOS_MONKEY to facilitate testing of error
handling, fixed several uncovered issues. Also fixed several problems
with kernel dump to wd(4) disk.
Tested with ahcisata(4), mvsata(4), siisata(4), piixide(4) on amd64,
with and without port multiplier, both disk and ATAPI devices; other
drivers and archs mechanically adjusted and compile-tested. NCQ is
supported for ahcisata(4) and siisata(4) for any controller, for
mvsata(4) only Gen IIe ones for now. Also enabled ATAPI support in
mvsata(4).
Thanks to Matt Thomas for initial ATA infrastructure patch, and
Jonathan A.Kollasch for siisata(4) NCQ changes and general testing.
Also fixes PR kern/43169 (wd(4)); and PR kern/11811, PR kern/47041,
PR kern/51979 (kernel dump)
2017-10-07 19:05:31 +03:00
|
|
|
wdperror(wd, xfer);
|
|
|
|
|
|
|
|
if (xfer->c_retries < WDIORETRIES) {
|
|
|
|
xfer->c_retries++;
|
|
|
|
|
|
|
|
/* Rerun ASAP if just requeued */
|
2018-10-22 23:13:47 +03:00
|
|
|
if (xfer->c_bio.error == REQUEUE) {
|
|
|
|
SLIST_INSERT_HEAD(&wd->sc_requeue_list, xfer,
|
|
|
|
c_retrychain);
|
|
|
|
callout_reset(&wd->sc_requeue_callout,
|
|
|
|
1, wdbiorequeue, wd);
|
|
|
|
} else {
|
|
|
|
SLIST_INSERT_HEAD(&wd->sc_retry_list, xfer,
|
|
|
|
c_retrychain);
|
|
|
|
callout_reset(&wd->sc_retry_callout,
|
|
|
|
RECOVERYTIME, wdbioretry, wd);
|
|
|
|
}
|
Merge support for SATA NCQ (Native Command Queueing) from jdolecek-ncq branch
ATA subsystem was changed to support several outstanding commands, and use
NCQ xfers if supported by both the controller and the disk, including NCQ
error recovery. Set NCQ high priority for BPRIO_TIMECRITICAL xfers
if supported. Added FUA support.
Done some work towards MP-safe, all ATA code tsleep()/wakeup() replaced
by condvars, and switched most code from spl* to mutexes (separate
wd(4) and ata channel lock).
Introduced new option WD_CHAOS_MONKEY to facilitate testing of error
handling, fixed several uncovered issues. Also fixed several problems
with kernel dump to wd(4) disk.
Tested with ahcisata(4), mvsata(4), siisata(4), piixide(4) on amd64,
with and without port multiplier, both disk and ATAPI devices; other
drivers and archs mechanically adjusted and compile-tested. NCQ is
supported for ahcisata(4) and siisata(4) for any controller, for
mvsata(4) only Gen IIe ones for now. Also enabled ATAPI support in
mvsata(4).
Thanks to Matt Thomas for initial ATA infrastructure patch, and
Jonathan A.Kollasch for siisata(4) NCQ changes and general testing.
Also fixes PR kern/43169 (wd(4)); and PR kern/11811, PR kern/47041,
PR kern/51979 (kernel dump)
2017-10-07 19:05:31 +03:00
|
|
|
|
|
|
|
mutex_exit(&wd->sc_lock);
|
1998-10-12 20:09:10 +04:00
|
|
|
return;
|
|
|
|
}
|
2003-04-15 18:11:00 +04:00
|
|
|
|
Merge support for SATA NCQ (Native Command Queueing) from jdolecek-ncq branch
ATA subsystem was changed to support several outstanding commands, and use
NCQ xfers if supported by both the controller and the disk, including NCQ
error recovery. Set NCQ high priority for BPRIO_TIMECRITICAL xfers
if supported. Added FUA support.
Done some work towards MP-safe, all ATA code tsleep()/wakeup() replaced
by condvars, and switched most code from spl* to mutexes (separate
wd(4) and ata channel lock).
Introduced new option WD_CHAOS_MONKEY to facilitate testing of error
handling, fixed several uncovered issues. Also fixed several problems
with kernel dump to wd(4) disk.
Tested with ahcisata(4), mvsata(4), siisata(4), piixide(4) on amd64,
with and without port multiplier, both disk and ATAPI devices; other
drivers and archs mechanically adjusted and compile-tested. NCQ is
supported for ahcisata(4) and siisata(4) for any controller, for
mvsata(4) only Gen IIe ones for now. Also enabled ATAPI support in
mvsata(4).
Thanks to Matt Thomas for initial ATA infrastructure patch, and
Jonathan A.Kollasch for siisata(4) NCQ changes and general testing.
Also fixes PR kern/43169 (wd(4)); and PR kern/11811, PR kern/47041,
PR kern/51979 (kernel dump)
2017-10-07 19:05:31 +03:00
|
|
|
mutex_exit(&wd->sc_lock);
|
|
|
|
|
2004-08-30 13:34:41 +04:00
|
|
|
#ifdef WD_SOFTBADSECT
|
2003-04-15 18:11:00 +04:00
|
|
|
/*
|
|
|
|
* Not all errors indicate a failed block but those that do,
|
|
|
|
* put the block on the bad-block list for the device. Only
|
|
|
|
* do this for reads because the drive should do it for writes,
|
|
|
|
* itself, according to Manuel.
|
|
|
|
*/
|
2003-04-15 21:42:44 +04:00
|
|
|
if ((bp->b_flags & B_READ) &&
|
Merge support for SATA NCQ (Native Command Queueing) from jdolecek-ncq branch
ATA subsystem was changed to support several outstanding commands, and use
NCQ xfers if supported by both the controller and the disk, including NCQ
error recovery. Set NCQ high priority for BPRIO_TIMECRITICAL xfers
if supported. Added FUA support.
Done some work towards MP-safe, all ATA code tsleep()/wakeup() replaced
by condvars, and switched most code from spl* to mutexes (separate
wd(4) and ata channel lock).
Introduced new option WD_CHAOS_MONKEY to facilitate testing of error
handling, fixed several uncovered issues. Also fixed several problems
with kernel dump to wd(4) disk.
Tested with ahcisata(4), mvsata(4), siisata(4), piixide(4) on amd64,
with and without port multiplier, both disk and ATAPI devices; other
drivers and archs mechanically adjusted and compile-tested. NCQ is
supported for ahcisata(4) and siisata(4) for any controller, for
mvsata(4) only Gen IIe ones for now. Also enabled ATAPI support in
mvsata(4).
Thanks to Matt Thomas for initial ATA infrastructure patch, and
Jonathan A.Kollasch for siisata(4) NCQ changes and general testing.
Also fixes PR kern/43169 (wd(4)); and PR kern/11811, PR kern/47041,
PR kern/51979 (kernel dump)
2017-10-07 19:05:31 +03:00
|
|
|
((wd->drvp->ata_vers >= 4 && xfer->c_bio.r_error & 64) ||
|
|
|
|
(wd->drvp->ata_vers < 4 && xfer->c_bio.r_error & 192))) {
|
2003-04-15 18:11:00 +04:00
|
|
|
struct disk_badsectors *dbs;
|
|
|
|
|
2018-10-22 23:13:47 +03:00
|
|
|
dbs = kmem_zalloc(sizeof *dbs, KM_NOSLEEP);
|
Merge support for SATA NCQ (Native Command Queueing) from jdolecek-ncq branch
ATA subsystem was changed to support several outstanding commands, and use
NCQ xfers if supported by both the controller and the disk, including NCQ
error recovery. Set NCQ high priority for BPRIO_TIMECRITICAL xfers
if supported. Added FUA support.
Done some work towards MP-safe, all ATA code tsleep()/wakeup() replaced
by condvars, and switched most code from spl* to mutexes (separate
wd(4) and ata channel lock).
Introduced new option WD_CHAOS_MONKEY to facilitate testing of error
handling, fixed several uncovered issues. Also fixed several problems
with kernel dump to wd(4) disk.
Tested with ahcisata(4), mvsata(4), siisata(4), piixide(4) on amd64,
with and without port multiplier, both disk and ATAPI devices; other
drivers and archs mechanically adjusted and compile-tested. NCQ is
supported for ahcisata(4) and siisata(4) for any controller, for
mvsata(4) only Gen IIe ones for now. Also enabled ATAPI support in
mvsata(4).
Thanks to Matt Thomas for initial ATA infrastructure patch, and
Jonathan A.Kollasch for siisata(4) NCQ changes and general testing.
Also fixes PR kern/43169 (wd(4)); and PR kern/11811, PR kern/47041,
PR kern/51979 (kernel dump)
2017-10-07 19:05:31 +03:00
|
|
|
if (dbs == NULL) {
|
2017-11-01 22:34:45 +03:00
|
|
|
aprint_error_dev(dksc->sc_dev,
|
Merge support for SATA NCQ (Native Command Queueing) from jdolecek-ncq branch
ATA subsystem was changed to support several outstanding commands, and use
NCQ xfers if supported by both the controller and the disk, including NCQ
error recovery. Set NCQ high priority for BPRIO_TIMECRITICAL xfers
if supported. Added FUA support.
Done some work towards MP-safe, all ATA code tsleep()/wakeup() replaced
by condvars, and switched most code from spl* to mutexes (separate
wd(4) and ata channel lock).
Introduced new option WD_CHAOS_MONKEY to facilitate testing of error
handling, fixed several uncovered issues. Also fixed several problems
with kernel dump to wd(4) disk.
Tested with ahcisata(4), mvsata(4), siisata(4), piixide(4) on amd64,
with and without port multiplier, both disk and ATAPI devices; other
drivers and archs mechanically adjusted and compile-tested. NCQ is
supported for ahcisata(4) and siisata(4) for any controller, for
mvsata(4) only Gen IIe ones for now. Also enabled ATAPI support in
mvsata(4).
Thanks to Matt Thomas for initial ATA infrastructure patch, and
Jonathan A.Kollasch for siisata(4) NCQ changes and general testing.
Also fixes PR kern/43169 (wd(4)); and PR kern/11811, PR kern/47041,
PR kern/51979 (kernel dump)
2017-10-07 19:05:31 +03:00
|
|
|
"failed to add bad block to list\n");
|
|
|
|
goto out;
|
|
|
|
}
|
|
|
|
|
2003-04-15 18:11:00 +04:00
|
|
|
dbs->dbs_min = bp->b_rawblkno;
|
2016-07-22 07:08:10 +03:00
|
|
|
dbs->dbs_max = dbs->dbs_min +
|
|
|
|
(bp->b_bcount /wd->sc_blksize) - 1;
|
2003-04-15 18:11:00 +04:00
|
|
|
microtime(&dbs->dbs_failedat);
|
Merge support for SATA NCQ (Native Command Queueing) from jdolecek-ncq branch
ATA subsystem was changed to support several outstanding commands, and use
NCQ xfers if supported by both the controller and the disk, including NCQ
error recovery. Set NCQ high priority for BPRIO_TIMECRITICAL xfers
if supported. Added FUA support.
Done some work towards MP-safe, all ATA code tsleep()/wakeup() replaced
by condvars, and switched most code from spl* to mutexes (separate
wd(4) and ata channel lock).
Introduced new option WD_CHAOS_MONKEY to facilitate testing of error
handling, fixed several uncovered issues. Also fixed several problems
with kernel dump to wd(4) disk.
Tested with ahcisata(4), mvsata(4), siisata(4), piixide(4) on amd64,
with and without port multiplier, both disk and ATAPI devices; other
drivers and archs mechanically adjusted and compile-tested. NCQ is
supported for ahcisata(4) and siisata(4) for any controller, for
mvsata(4) only Gen IIe ones for now. Also enabled ATAPI support in
mvsata(4).
Thanks to Matt Thomas for initial ATA infrastructure patch, and
Jonathan A.Kollasch for siisata(4) NCQ changes and general testing.
Also fixes PR kern/43169 (wd(4)); and PR kern/11811, PR kern/47041,
PR kern/51979 (kernel dump)
2017-10-07 19:05:31 +03:00
|
|
|
|
|
|
|
mutex_enter(&wd->sc_lock);
|
2003-04-15 18:11:00 +04:00
|
|
|
SLIST_INSERT_HEAD(&wd->sc_bslist, dbs, dbs_next);
|
2003-04-15 22:27:26 +04:00
|
|
|
wd->sc_bscount++;
|
Merge support for SATA NCQ (Native Command Queueing) from jdolecek-ncq branch
ATA subsystem was changed to support several outstanding commands, and use
NCQ xfers if supported by both the controller and the disk, including NCQ
error recovery. Set NCQ high priority for BPRIO_TIMECRITICAL xfers
if supported. Added FUA support.
Done some work towards MP-safe, all ATA code tsleep()/wakeup() replaced
by condvars, and switched most code from spl* to mutexes (separate
wd(4) and ata channel lock).
Introduced new option WD_CHAOS_MONKEY to facilitate testing of error
handling, fixed several uncovered issues. Also fixed several problems
with kernel dump to wd(4) disk.
Tested with ahcisata(4), mvsata(4), siisata(4), piixide(4) on amd64,
with and without port multiplier, both disk and ATAPI devices; other
drivers and archs mechanically adjusted and compile-tested. NCQ is
supported for ahcisata(4) and siisata(4) for any controller, for
mvsata(4) only Gen IIe ones for now. Also enabled ATAPI support in
mvsata(4).
Thanks to Matt Thomas for initial ATA infrastructure patch, and
Jonathan A.Kollasch for siisata(4) NCQ changes and general testing.
Also fixes PR kern/43169 (wd(4)); and PR kern/11811, PR kern/47041,
PR kern/51979 (kernel dump)
2017-10-07 19:05:31 +03:00
|
|
|
mutex_exit(&wd->sc_lock);
|
2003-04-15 18:11:00 +04:00
|
|
|
}
|
Merge support for SATA NCQ (Native Command Queueing) from jdolecek-ncq branch
ATA subsystem was changed to support several outstanding commands, and use
NCQ xfers if supported by both the controller and the disk, including NCQ
error recovery. Set NCQ high priority for BPRIO_TIMECRITICAL xfers
if supported. Added FUA support.
Done some work towards MP-safe, all ATA code tsleep()/wakeup() replaced
by condvars, and switched most code from spl* to mutexes (separate
wd(4) and ata channel lock).
Introduced new option WD_CHAOS_MONKEY to facilitate testing of error
handling, fixed several uncovered issues. Also fixed several problems
with kernel dump to wd(4) disk.
Tested with ahcisata(4), mvsata(4), siisata(4), piixide(4) on amd64,
with and without port multiplier, both disk and ATAPI devices; other
drivers and archs mechanically adjusted and compile-tested. NCQ is
supported for ahcisata(4) and siisata(4) for any controller, for
mvsata(4) only Gen IIe ones for now. Also enabled ATAPI support in
mvsata(4).
Thanks to Matt Thomas for initial ATA infrastructure patch, and
Jonathan A.Kollasch for siisata(4) NCQ changes and general testing.
Also fixes PR kern/43169 (wd(4)); and PR kern/11811, PR kern/47041,
PR kern/51979 (kernel dump)
2017-10-07 19:05:31 +03:00
|
|
|
out:
|
2004-08-30 13:34:41 +04:00
|
|
|
#endif
|
1998-10-12 20:09:10 +04:00
|
|
|
bp->b_error = EIO;
|
|
|
|
break;
|
|
|
|
case NOERROR:
|
Merge support for SATA NCQ (Native Command Queueing) from jdolecek-ncq branch
ATA subsystem was changed to support several outstanding commands, and use
NCQ xfers if supported by both the controller and the disk, including NCQ
error recovery. Set NCQ high priority for BPRIO_TIMECRITICAL xfers
if supported. Added FUA support.
Done some work towards MP-safe, all ATA code tsleep()/wakeup() replaced
by condvars, and switched most code from spl* to mutexes (separate
wd(4) and ata channel lock).
Introduced new option WD_CHAOS_MONKEY to facilitate testing of error
handling, fixed several uncovered issues. Also fixed several problems
with kernel dump to wd(4) disk.
Tested with ahcisata(4), mvsata(4), siisata(4), piixide(4) on amd64,
with and without port multiplier, both disk and ATAPI devices; other
drivers and archs mechanically adjusted and compile-tested. NCQ is
supported for ahcisata(4) and siisata(4) for any controller, for
mvsata(4) only Gen IIe ones for now. Also enabled ATAPI support in
mvsata(4).
Thanks to Matt Thomas for initial ATA infrastructure patch, and
Jonathan A.Kollasch for siisata(4) NCQ changes and general testing.
Also fixes PR kern/43169 (wd(4)); and PR kern/11811, PR kern/47041,
PR kern/51979 (kernel dump)
2017-10-07 19:05:31 +03:00
|
|
|
#ifdef WD_CHAOS_MONKEY
|
2018-10-22 23:13:47 +03:00
|
|
|
/*
|
|
|
|
* For example Parallels AHCI emulation doesn't actually
|
|
|
|
* return error for the invalid I/O, so just re-run
|
|
|
|
* the request and do not panic.
|
|
|
|
*/
|
|
|
|
if (__predict_false(xfer->c_flags & C_CHAOS)) {
|
|
|
|
xfer->c_bio.error = REQUEUE;
|
|
|
|
errmsg = "chaos noerror";
|
|
|
|
goto retry2;
|
|
|
|
}
|
Merge support for SATA NCQ (Native Command Queueing) from jdolecek-ncq branch
ATA subsystem was changed to support several outstanding commands, and use
NCQ xfers if supported by both the controller and the disk, including NCQ
error recovery. Set NCQ high priority for BPRIO_TIMECRITICAL xfers
if supported. Added FUA support.
Done some work towards MP-safe, all ATA code tsleep()/wakeup() replaced
by condvars, and switched most code from spl* to mutexes (separate
wd(4) and ata channel lock).
Introduced new option WD_CHAOS_MONKEY to facilitate testing of error
handling, fixed several uncovered issues. Also fixed several problems
with kernel dump to wd(4) disk.
Tested with ahcisata(4), mvsata(4), siisata(4), piixide(4) on amd64,
with and without port multiplier, both disk and ATAPI devices; other
drivers and archs mechanically adjusted and compile-tested. NCQ is
supported for ahcisata(4) and siisata(4) for any controller, for
mvsata(4) only Gen IIe ones for now. Also enabled ATAPI support in
mvsata(4).
Thanks to Matt Thomas for initial ATA infrastructure patch, and
Jonathan A.Kollasch for siisata(4) NCQ changes and general testing.
Also fixes PR kern/43169 (wd(4)); and PR kern/11811, PR kern/47041,
PR kern/51979 (kernel dump)
2017-10-07 19:05:31 +03:00
|
|
|
#endif
|
2018-10-22 23:13:47 +03:00
|
|
|
|
|
|
|
noerror: if ((xfer->c_bio.flags & ATA_CORR) || xfer->c_retries > 0)
|
|
|
|
device_printf(dksc->sc_dev,
|
|
|
|
"soft error (corrected) xfer %"PRIxPTR"\n",
|
|
|
|
(intptr_t)xfer & PAGE_MASK);
|
1999-10-20 19:22:24 +04:00
|
|
|
break;
|
|
|
|
case ERR_NODEV:
|
|
|
|
bp->b_error = EIO;
|
|
|
|
break;
|
1998-10-12 20:09:10 +04:00
|
|
|
}
|
2012-06-26 13:49:24 +04:00
|
|
|
if (__predict_false(bp->b_error != 0) && bp->b_resid == 0) {
|
|
|
|
/*
|
|
|
|
* the disk or controller sometimes report a complete
|
|
|
|
* xfer, when there has been an error. This is wrong,
|
2019-12-27 12:41:48 +03:00
|
|
|
* assume nothing got transferred in this case
|
2012-06-26 13:49:24 +04:00
|
|
|
*/
|
|
|
|
bp->b_resid = bp->b_bcount;
|
|
|
|
}
|
2017-11-01 22:34:45 +03:00
|
|
|
|
Merge support for SATA NCQ (Native Command Queueing) from jdolecek-ncq branch
ATA subsystem was changed to support several outstanding commands, and use
NCQ xfers if supported by both the controller and the disk, including NCQ
error recovery. Set NCQ high priority for BPRIO_TIMECRITICAL xfers
if supported. Added FUA support.
Done some work towards MP-safe, all ATA code tsleep()/wakeup() replaced
by condvars, and switched most code from spl* to mutexes (separate
wd(4) and ata channel lock).
Introduced new option WD_CHAOS_MONKEY to facilitate testing of error
handling, fixed several uncovered issues. Also fixed several problems
with kernel dump to wd(4) disk.
Tested with ahcisata(4), mvsata(4), siisata(4), piixide(4) on amd64,
with and without port multiplier, both disk and ATAPI devices; other
drivers and archs mechanically adjusted and compile-tested. NCQ is
supported for ahcisata(4) and siisata(4) for any controller, for
mvsata(4) only Gen IIe ones for now. Also enabled ATAPI support in
mvsata(4).
Thanks to Matt Thomas for initial ATA infrastructure patch, and
Jonathan A.Kollasch for siisata(4) NCQ changes and general testing.
Also fixes PR kern/43169 (wd(4)); and PR kern/11811, PR kern/47041,
PR kern/51979 (kernel dump)
2017-10-07 19:05:31 +03:00
|
|
|
ata_free_xfer(wd->drvp->chnl_softc, xfer);
|
2017-11-01 22:34:45 +03:00
|
|
|
|
2019-06-06 23:41:04 +03:00
|
|
|
mutex_enter(&wd->sc_lock);
|
2019-03-19 19:56:29 +03:00
|
|
|
wd->inflight--;
|
2019-06-06 23:41:04 +03:00
|
|
|
mutex_exit(&wd->sc_lock);
|
2017-11-01 22:34:45 +03:00
|
|
|
dk_done(dksc, bp);
|
2019-03-19 19:56:29 +03:00
|
|
|
dk_start(dksc, NULL);
|
1998-10-12 20:09:10 +04:00
|
|
|
}
|
|
|
|
|
Merge support for SATA NCQ (Native Command Queueing) from jdolecek-ncq branch
ATA subsystem was changed to support several outstanding commands, and use
NCQ xfers if supported by both the controller and the disk, including NCQ
error recovery. Set NCQ high priority for BPRIO_TIMECRITICAL xfers
if supported. Added FUA support.
Done some work towards MP-safe, all ATA code tsleep()/wakeup() replaced
by condvars, and switched most code from spl* to mutexes (separate
wd(4) and ata channel lock).
Introduced new option WD_CHAOS_MONKEY to facilitate testing of error
handling, fixed several uncovered issues. Also fixed several problems
with kernel dump to wd(4) disk.
Tested with ahcisata(4), mvsata(4), siisata(4), piixide(4) on amd64,
with and without port multiplier, both disk and ATAPI devices; other
drivers and archs mechanically adjusted and compile-tested. NCQ is
supported for ahcisata(4) and siisata(4) for any controller, for
mvsata(4) only Gen IIe ones for now. Also enabled ATAPI support in
mvsata(4).
Thanks to Matt Thomas for initial ATA infrastructure patch, and
Jonathan A.Kollasch for siisata(4) NCQ changes and general testing.
Also fixes PR kern/43169 (wd(4)); and PR kern/11811, PR kern/47041,
PR kern/51979 (kernel dump)
2017-10-07 19:05:31 +03:00
|
|
|
static void
|
2018-10-22 23:13:47 +03:00
|
|
|
wdbioretry(void *v)
|
1998-10-12 20:09:10 +04:00
|
|
|
{
|
2018-10-22 23:13:47 +03:00
|
|
|
struct wd_softc *wd = v;
|
|
|
|
struct ata_xfer *xfer;
|
2007-11-07 11:59:03 +03:00
|
|
|
|
2018-10-22 23:13:47 +03:00
|
|
|
ATADEBUG_PRINT(("%s %s\n", __func__, wd->sc_dksc.sc_xname),
|
1998-10-13 13:33:59 +04:00
|
|
|
DEBUG_XFERS);
|
Merge support for SATA NCQ (Native Command Queueing) from jdolecek-ncq branch
ATA subsystem was changed to support several outstanding commands, and use
NCQ xfers if supported by both the controller and the disk, including NCQ
error recovery. Set NCQ high priority for BPRIO_TIMECRITICAL xfers
if supported. Added FUA support.
Done some work towards MP-safe, all ATA code tsleep()/wakeup() replaced
by condvars, and switched most code from spl* to mutexes (separate
wd(4) and ata channel lock).
Introduced new option WD_CHAOS_MONKEY to facilitate testing of error
handling, fixed several uncovered issues. Also fixed several problems
with kernel dump to wd(4) disk.
Tested with ahcisata(4), mvsata(4), siisata(4), piixide(4) on amd64,
with and without port multiplier, both disk and ATAPI devices; other
drivers and archs mechanically adjusted and compile-tested. NCQ is
supported for ahcisata(4) and siisata(4) for any controller, for
mvsata(4) only Gen IIe ones for now. Also enabled ATAPI support in
mvsata(4).
Thanks to Matt Thomas for initial ATA infrastructure patch, and
Jonathan A.Kollasch for siisata(4) NCQ changes and general testing.
Also fixes PR kern/43169 (wd(4)); and PR kern/11811, PR kern/47041,
PR kern/51979 (kernel dump)
2017-10-07 19:05:31 +03:00
|
|
|
|
2017-11-03 16:01:26 +03:00
|
|
|
mutex_enter(&wd->sc_lock);
|
2018-10-22 23:13:47 +03:00
|
|
|
while ((xfer = SLIST_FIRST(&wd->sc_retry_list))) {
|
|
|
|
SLIST_REMOVE_HEAD(&wd->sc_retry_list, c_retrychain);
|
|
|
|
wdstart1(wd, xfer->c_bio.bp, xfer);
|
|
|
|
}
|
|
|
|
mutex_exit(&wd->sc_lock);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
wdbiorequeue(void *v)
|
|
|
|
{
|
|
|
|
struct wd_softc *wd = v;
|
|
|
|
struct ata_xfer *xfer;
|
|
|
|
|
|
|
|
ATADEBUG_PRINT(("%s %s\n", __func__, wd->sc_dksc.sc_xname),
|
|
|
|
DEBUG_XFERS);
|
|
|
|
|
|
|
|
mutex_enter(&wd->sc_lock);
|
|
|
|
while ((xfer = SLIST_FIRST(&wd->sc_requeue_list))) {
|
|
|
|
SLIST_REMOVE_HEAD(&wd->sc_requeue_list, c_retrychain);
|
|
|
|
wdstart1(wd, xfer->c_bio.bp, xfer);
|
|
|
|
}
|
2017-11-03 16:01:26 +03:00
|
|
|
mutex_exit(&wd->sc_lock);
|
1998-10-12 20:09:10 +04:00
|
|
|
}
|
|
|
|
|
2011-10-05 07:40:18 +04:00
|
|
|
static void
|
|
|
|
wdminphys(struct buf *bp)
|
|
|
|
{
|
2016-07-22 07:08:10 +03:00
|
|
|
const struct wd_softc * const wd =
|
|
|
|
device_lookup_private(&wd_cd, WDUNIT(bp->b_dev));
|
2017-11-01 22:34:45 +03:00
|
|
|
int maxsectors;
|
Merge support for SATA NCQ (Native Command Queueing) from jdolecek-ncq branch
ATA subsystem was changed to support several outstanding commands, and use
NCQ xfers if supported by both the controller and the disk, including NCQ
error recovery. Set NCQ high priority for BPRIO_TIMECRITICAL xfers
if supported. Added FUA support.
Done some work towards MP-safe, all ATA code tsleep()/wakeup() replaced
by condvars, and switched most code from spl* to mutexes (separate
wd(4) and ata channel lock).
Introduced new option WD_CHAOS_MONKEY to facilitate testing of error
handling, fixed several uncovered issues. Also fixed several problems
with kernel dump to wd(4) disk.
Tested with ahcisata(4), mvsata(4), siisata(4), piixide(4) on amd64,
with and without port multiplier, both disk and ATAPI devices; other
drivers and archs mechanically adjusted and compile-tested. NCQ is
supported for ahcisata(4) and siisata(4) for any controller, for
mvsata(4) only Gen IIe ones for now. Also enabled ATAPI support in
mvsata(4).
Thanks to Matt Thomas for initial ATA infrastructure patch, and
Jonathan A.Kollasch for siisata(4) NCQ changes and general testing.
Also fixes PR kern/43169 (wd(4)); and PR kern/11811, PR kern/47041,
PR kern/51979 (kernel dump)
2017-10-07 19:05:31 +03:00
|
|
|
|
|
|
|
/*
|
|
|
|
* The limit is actually 65536 for LBA48 and 256 for non-LBA48,
|
|
|
|
* but that requires to set the count for the ATA command
|
|
|
|
* to 0, which is somewhat error prone, so better stay safe.
|
|
|
|
*/
|
|
|
|
if (wd->sc_flags & WDF_LBA48)
|
|
|
|
maxsectors = 65535;
|
|
|
|
else
|
|
|
|
maxsectors = 128;
|
|
|
|
|
|
|
|
if (bp->b_bcount > (wd->sc_blksize * maxsectors))
|
|
|
|
bp->b_bcount = (wd->sc_blksize * maxsectors);
|
2011-10-05 07:40:18 +04:00
|
|
|
|
|
|
|
minphys(bp);
|
|
|
|
}
|
|
|
|
|
2017-11-01 22:34:45 +03:00
|
|
|
static void
|
|
|
|
wd_iosize(device_t dev, int *count)
|
|
|
|
{
|
|
|
|
struct buf B;
|
|
|
|
int bmaj;
|
|
|
|
|
|
|
|
bmaj = bdevsw_lookup_major(&wd_bdevsw);
|
|
|
|
B.b_dev = MAKEWDDEV(bmaj,device_unit(dev),RAW_PART);
|
|
|
|
B.b_bcount = *count;
|
|
|
|
|
|
|
|
wdminphys(&B);
|
|
|
|
|
|
|
|
*count = B.b_bcount;
|
|
|
|
}
|
|
|
|
|
|
|
|
static int
|
2006-11-16 04:32:37 +03:00
|
|
|
wdread(dev_t dev, struct uio *uio, int flags)
|
1995-07-04 11:15:28 +04:00
|
|
|
{
|
|
|
|
|
2004-08-13 08:10:49 +04:00
|
|
|
ATADEBUG_PRINT(("wdread\n"), DEBUG_XFERS);
|
2011-10-05 07:40:18 +04:00
|
|
|
return (physio(wdstrategy, NULL, dev, B_READ, wdminphys, uio));
|
1995-07-04 11:15:28 +04:00
|
|
|
}
|
|
|
|
|
2017-11-01 22:34:45 +03:00
|
|
|
static int
|
2006-11-16 04:32:37 +03:00
|
|
|
wdwrite(dev_t dev, struct uio *uio, int flags)
|
1995-07-04 11:15:28 +04:00
|
|
|
{
|
|
|
|
|
2004-08-13 08:10:49 +04:00
|
|
|
ATADEBUG_PRINT(("wdwrite\n"), DEBUG_XFERS);
|
2011-10-05 07:40:18 +04:00
|
|
|
return (physio(wdstrategy, NULL, dev, B_WRITE, wdminphys, uio));
|
1995-07-04 11:15:28 +04:00
|
|
|
}
|
|
|
|
|
2017-11-01 22:34:45 +03:00
|
|
|
static int
|
2006-11-16 04:32:37 +03:00
|
|
|
wdopen(dev_t dev, int flag, int fmt, struct lwp *l)
|
1993-03-21 12:45:37 +03:00
|
|
|
{
|
1994-03-10 08:18:33 +03:00
|
|
|
struct wd_softc *wd;
|
2017-11-01 22:34:45 +03:00
|
|
|
struct dk_softc *dksc;
|
|
|
|
int unit, part, error;
|
1997-08-27 15:22:52 +04:00
|
|
|
|
2004-08-13 08:10:49 +04:00
|
|
|
ATADEBUG_PRINT(("wdopen\n"), DEBUG_FUNCS);
|
2017-11-01 22:34:45 +03:00
|
|
|
unit = WDUNIT(dev);
|
|
|
|
wd = device_lookup_private(&wd_cd, unit);
|
1997-06-19 00:39:55 +04:00
|
|
|
if (wd == NULL)
|
2000-07-06 04:43:04 +04:00
|
|
|
return (ENXIO);
|
2017-11-01 22:34:45 +03:00
|
|
|
dksc = &wd->sc_dksc;
|
1998-11-20 04:23:52 +03:00
|
|
|
|
2017-11-01 22:34:45 +03:00
|
|
|
if (! device_is_active(dksc->sc_dev))
|
2012-07-31 19:50:31 +04:00
|
|
|
return (ENODEV);
|
|
|
|
|
2004-09-25 07:34:02 +04:00
|
|
|
part = WDPART(dev);
|
|
|
|
|
2017-11-01 22:34:45 +03:00
|
|
|
if (wd->sc_capacity == 0)
|
|
|
|
return (ENODEV);
|
2004-09-25 07:34:02 +04:00
|
|
|
|
|
|
|
/*
|
2017-11-01 22:34:45 +03:00
|
|
|
* If any partition is open, but the disk has been invalidated,
|
|
|
|
* disallow further opens.
|
2004-09-25 07:34:02 +04:00
|
|
|
*/
|
2017-11-03 16:01:26 +03:00
|
|
|
if ((wd->sc_flags & (WDF_OPEN | WDF_LOADED)) == WDF_OPEN) {
|
2017-11-01 22:34:45 +03:00
|
|
|
if (part != RAW_PART || fmt != S_IFCHR)
|
|
|
|
return EIO;
|
2004-09-25 07:34:02 +04:00
|
|
|
}
|
|
|
|
|
2017-11-01 22:34:45 +03:00
|
|
|
error = dk_open(dksc, dev, flag, fmt, l);
|
1994-11-21 01:36:43 +03:00
|
|
|
|
2017-11-01 22:34:45 +03:00
|
|
|
return error;
|
|
|
|
}
|
1994-11-21 01:36:43 +03:00
|
|
|
|
2017-11-01 22:34:45 +03:00
|
|
|
/*
|
|
|
|
* Serialized by caller
|
|
|
|
*/
|
|
|
|
static int
|
|
|
|
wd_firstopen(device_t self, dev_t dev, int flag, int fmt)
|
|
|
|
{
|
|
|
|
struct wd_softc *wd = device_private(self);
|
|
|
|
struct dk_softc *dksc = &wd->sc_dksc;
|
|
|
|
int error;
|
2003-07-11 19:33:13 +04:00
|
|
|
|
2017-11-01 22:34:45 +03:00
|
|
|
error = wd->atabus->ata_addref(wd->drvp);
|
|
|
|
if (error)
|
|
|
|
return error;
|
|
|
|
|
|
|
|
if ((wd->sc_flags & WDF_LOADED) == 0) {
|
|
|
|
int param_error;
|
|
|
|
|
|
|
|
/* Load the physical device parameters. */
|
2020-04-13 13:49:34 +03:00
|
|
|
param_error = wd_get_params(wd, &wd->sc_params);
|
2017-11-01 22:34:45 +03:00
|
|
|
if (param_error != 0) {
|
|
|
|
aprint_error_dev(dksc->sc_dev, "IDENTIFY failed\n");
|
|
|
|
error = EIO;
|
|
|
|
goto bad;
|
|
|
|
}
|
|
|
|
wd_set_geometry(wd);
|
|
|
|
wd->sc_flags |= WDF_LOADED;
|
1993-04-06 14:06:28 +04:00
|
|
|
}
|
1994-03-05 11:17:06 +03:00
|
|
|
|
2017-11-03 16:01:26 +03:00
|
|
|
wd->sc_flags |= WDF_OPEN;
|
1994-02-25 19:40:47 +03:00
|
|
|
return 0;
|
1994-10-20 16:44:46 +03:00
|
|
|
|
2017-11-01 22:34:45 +03:00
|
|
|
bad:
|
|
|
|
wd->atabus->ata_delref(wd->drvp);
|
1994-10-20 16:44:46 +03:00
|
|
|
return error;
|
1993-03-21 12:45:37 +03:00
|
|
|
}
|
|
|
|
|
2016-07-22 15:55:34 +03:00
|
|
|
/*
|
2009-05-16 03:49:28 +04:00
|
|
|
* Caller must hold wd->sc_dk.dk_openlock.
|
|
|
|
*/
|
2009-05-20 03:43:44 +04:00
|
|
|
static int
|
2017-11-01 22:34:45 +03:00
|
|
|
wd_lastclose(device_t self)
|
2009-05-16 03:49:28 +04:00
|
|
|
{
|
2009-05-20 03:43:44 +04:00
|
|
|
struct wd_softc *wd = device_private(self);
|
|
|
|
|
2018-08-11 01:43:22 +03:00
|
|
|
KASSERTMSG(bufq_peek(wd->sc_dksc.sc_bufq) == NULL, "bufq not empty");
|
|
|
|
|
2019-04-07 16:00:00 +03:00
|
|
|
if (wd->sc_flags & WDF_DIRTY)
|
2020-09-27 19:58:11 +03:00
|
|
|
wd_flushcache(wd, AT_WAIT);
|
2009-05-16 03:49:28 +04:00
|
|
|
|
|
|
|
wd->atabus->ata_delref(wd->drvp);
|
2017-11-03 16:01:26 +03:00
|
|
|
wd->sc_flags &= ~WDF_OPEN;
|
2009-05-20 03:43:44 +04:00
|
|
|
|
|
|
|
return 0;
|
2009-05-16 03:49:28 +04:00
|
|
|
}
|
|
|
|
|
2017-11-01 22:34:45 +03:00
|
|
|
static int
|
2006-11-16 04:32:37 +03:00
|
|
|
wdclose(dev_t dev, int flag, int fmt, struct lwp *l)
|
1995-03-30 03:36:27 +04:00
|
|
|
{
|
2017-11-01 22:34:45 +03:00
|
|
|
struct wd_softc *wd;
|
|
|
|
struct dk_softc *dksc;
|
|
|
|
int unit;
|
1994-11-22 12:33:59 +03:00
|
|
|
|
2017-11-01 22:34:45 +03:00
|
|
|
unit = WDUNIT(dev);
|
|
|
|
wd = device_lookup_private(&wd_cd, unit);
|
|
|
|
dksc = &wd->sc_dksc;
|
1994-11-21 01:36:43 +03:00
|
|
|
|
2017-11-01 22:34:45 +03:00
|
|
|
return dk_close(dksc, dev, flag, fmt, l);
|
1994-11-21 01:36:43 +03:00
|
|
|
}
|
|
|
|
|
2001-12-03 03:11:15 +03:00
|
|
|
void
|
Merge support for SATA NCQ (Native Command Queueing) from jdolecek-ncq branch
ATA subsystem was changed to support several outstanding commands, and use
NCQ xfers if supported by both the controller and the disk, including NCQ
error recovery. Set NCQ high priority for BPRIO_TIMECRITICAL xfers
if supported. Added FUA support.
Done some work towards MP-safe, all ATA code tsleep()/wakeup() replaced
by condvars, and switched most code from spl* to mutexes (separate
wd(4) and ata channel lock).
Introduced new option WD_CHAOS_MONKEY to facilitate testing of error
handling, fixed several uncovered issues. Also fixed several problems
with kernel dump to wd(4) disk.
Tested with ahcisata(4), mvsata(4), siisata(4), piixide(4) on amd64,
with and without port multiplier, both disk and ATAPI devices; other
drivers and archs mechanically adjusted and compile-tested. NCQ is
supported for ahcisata(4) and siisata(4) for any controller, for
mvsata(4) only Gen IIe ones for now. Also enabled ATAPI support in
mvsata(4).
Thanks to Matt Thomas for initial ATA infrastructure patch, and
Jonathan A.Kollasch for siisata(4) NCQ changes and general testing.
Also fixes PR kern/43169 (wd(4)); and PR kern/11811, PR kern/47041,
PR kern/51979 (kernel dump)
2017-10-07 19:05:31 +03:00
|
|
|
wdperror(const struct wd_softc *wd, struct ata_xfer *xfer)
|
2001-12-03 03:11:15 +03:00
|
|
|
{
|
2002-06-28 20:40:50 +04:00
|
|
|
static const char *const errstr0_3[] = {"address mark not found",
|
2001-12-03 03:11:15 +03:00
|
|
|
"track 0 not found", "aborted command", "media change requested",
|
|
|
|
"id not found", "media changed", "uncorrectable data error",
|
|
|
|
"bad block detected"};
|
2002-06-28 20:40:50 +04:00
|
|
|
static const char *const errstr4_5[] = {
|
|
|
|
"obsolete (address mark not found)",
|
2001-12-03 03:11:15 +03:00
|
|
|
"no media/write protected", "aborted command",
|
|
|
|
"media change requested", "id not found", "media changed",
|
|
|
|
"uncorrectable data error", "interface CRC error"};
|
2003-07-11 19:33:13 +04:00
|
|
|
const char *const *errstr;
|
2001-12-03 03:11:15 +03:00
|
|
|
int i;
|
2005-05-30 02:11:28 +04:00
|
|
|
const char *sep = "";
|
2001-12-03 03:11:15 +03:00
|
|
|
|
2017-11-01 22:34:45 +03:00
|
|
|
const struct dk_softc *dksc = &wd->sc_dksc;
|
|
|
|
const char *devname = dksc->sc_xname;
|
2002-06-28 20:40:50 +04:00
|
|
|
struct ata_drive_datas *drvp = wd->drvp;
|
Merge support for SATA NCQ (Native Command Queueing) from jdolecek-ncq branch
ATA subsystem was changed to support several outstanding commands, and use
NCQ xfers if supported by both the controller and the disk, including NCQ
error recovery. Set NCQ high priority for BPRIO_TIMECRITICAL xfers
if supported. Added FUA support.
Done some work towards MP-safe, all ATA code tsleep()/wakeup() replaced
by condvars, and switched most code from spl* to mutexes (separate
wd(4) and ata channel lock).
Introduced new option WD_CHAOS_MONKEY to facilitate testing of error
handling, fixed several uncovered issues. Also fixed several problems
with kernel dump to wd(4) disk.
Tested with ahcisata(4), mvsata(4), siisata(4), piixide(4) on amd64,
with and without port multiplier, both disk and ATAPI devices; other
drivers and archs mechanically adjusted and compile-tested. NCQ is
supported for ahcisata(4) and siisata(4) for any controller, for
mvsata(4) only Gen IIe ones for now. Also enabled ATAPI support in
mvsata(4).
Thanks to Matt Thomas for initial ATA infrastructure patch, and
Jonathan A.Kollasch for siisata(4) NCQ changes and general testing.
Also fixes PR kern/43169 (wd(4)); and PR kern/11811, PR kern/47041,
PR kern/51979 (kernel dump)
2017-10-07 19:05:31 +03:00
|
|
|
int errno = xfer->c_bio.r_error;
|
2002-06-28 20:40:50 +04:00
|
|
|
|
2001-12-03 03:11:15 +03:00
|
|
|
if (drvp->ata_vers >= 4)
|
|
|
|
errstr = errstr4_5;
|
|
|
|
else
|
|
|
|
errstr = errstr0_3;
|
|
|
|
|
2002-06-28 20:40:50 +04:00
|
|
|
printf("%s: (", devname);
|
|
|
|
|
2001-12-03 03:11:15 +03:00
|
|
|
if (errno == 0)
|
2002-06-28 20:40:50 +04:00
|
|
|
printf("error not notified");
|
2001-12-03 03:11:15 +03:00
|
|
|
|
|
|
|
for (i = 0; i < 8; i++) {
|
|
|
|
if (errno & (1 << i)) {
|
2002-06-28 20:40:50 +04:00
|
|
|
printf("%s%s", sep, errstr[i]);
|
2001-12-03 03:11:15 +03:00
|
|
|
sep = ", ";
|
|
|
|
}
|
|
|
|
}
|
2002-06-28 20:40:50 +04:00
|
|
|
printf(")\n");
|
2001-12-03 03:11:15 +03:00
|
|
|
}
|
|
|
|
|
1993-03-21 12:45:37 +03:00
|
|
|
int
|
2017-11-01 22:34:45 +03:00
|
|
|
wdioctl(dev_t dev, u_long cmd, void *addr, int flag, struct lwp *l)
|
1993-03-21 12:45:37 +03:00
|
|
|
{
|
2008-03-18 23:46:35 +03:00
|
|
|
struct wd_softc *wd =
|
2008-06-08 22:34:06 +04:00
|
|
|
device_lookup_private(&wd_cd, WDUNIT(dev));
|
2017-11-01 22:34:45 +03:00
|
|
|
struct dk_softc *dksc = &wd->sc_dksc;
|
1997-08-27 15:22:52 +04:00
|
|
|
|
2004-08-13 08:10:49 +04:00
|
|
|
ATADEBUG_PRINT(("wdioctl\n"), DEBUG_FUNCS);
|
1997-08-27 15:22:52 +04:00
|
|
|
|
1998-10-12 20:09:10 +04:00
|
|
|
if ((wd->sc_flags & WDF_LOADED) == 0)
|
1994-11-21 01:36:43 +03:00
|
|
|
return EIO;
|
|
|
|
|
2017-11-01 22:34:45 +03:00
|
|
|
switch (cmd) {
|
1998-03-25 12:58:24 +03:00
|
|
|
#ifdef HAS_BAD144_HANDLING
|
1993-03-21 12:45:37 +03:00
|
|
|
case DIOCSBAD:
|
1993-04-06 14:06:28 +04:00
|
|
|
if ((flag & FWRITE) == 0)
|
1994-03-03 04:58:21 +03:00
|
|
|
return EBADF;
|
2017-11-01 22:34:45 +03:00
|
|
|
dksc->sc_dkdev.dk_cpulabel->bad = *(struct dkbad *)addr;
|
|
|
|
dksc->sc_dkdev.dk_label->d_flags |= D_BADSECT;
|
1994-03-10 08:18:33 +03:00
|
|
|
bad144intern(wd);
|
1994-03-03 04:58:21 +03:00
|
|
|
return 0;
|
1998-03-25 12:58:24 +03:00
|
|
|
#endif
|
2004-08-30 13:34:41 +04:00
|
|
|
#ifdef WD_SOFTBADSECT
|
2021-12-28 16:27:32 +03:00
|
|
|
case DIOCBSLIST: {
|
2014-09-10 11:04:48 +04:00
|
|
|
uint32_t count, missing, skip;
|
2003-04-15 22:27:26 +04:00
|
|
|
struct disk_badsecinfo dbsi;
|
2021-12-28 16:27:32 +03:00
|
|
|
struct disk_badsectors *dbs, dbsbuf;
|
2003-04-15 18:11:00 +04:00
|
|
|
size_t available;
|
2007-09-05 09:36:19 +04:00
|
|
|
uint8_t *laddr;
|
2021-12-28 16:27:32 +03:00
|
|
|
int error;
|
2003-04-15 18:11:00 +04:00
|
|
|
|
2003-04-15 22:27:26 +04:00
|
|
|
dbsi = *(struct disk_badsecinfo *)addr;
|
|
|
|
missing = wd->sc_bscount;
|
2003-04-15 18:11:00 +04:00
|
|
|
count = 0;
|
2003-04-15 22:27:26 +04:00
|
|
|
available = dbsi.dbsi_bufsize;
|
|
|
|
skip = dbsi.dbsi_skip;
|
2007-09-05 09:36:19 +04:00
|
|
|
laddr = (uint8_t *)dbsi.dbsi_buffer;
|
2003-04-15 22:27:26 +04:00
|
|
|
|
|
|
|
/*
|
|
|
|
* We start this loop with the expectation that all of the
|
|
|
|
* entries will be missed and decrement this counter each
|
|
|
|
* time we either skip over one (already copied out) or
|
|
|
|
* we actually copy it back to user space. The structs
|
|
|
|
* holding the bad sector information are copied directly
|
|
|
|
* back to user space whilst the summary is returned via
|
|
|
|
* the struct passed in via the ioctl.
|
|
|
|
*/
|
2021-12-28 16:27:32 +03:00
|
|
|
error = 0;
|
2018-10-22 23:13:47 +03:00
|
|
|
mutex_enter(&wd->sc_lock);
|
2021-12-28 16:27:32 +03:00
|
|
|
wd->sc_bslist_inuse++;
|
2003-04-15 18:11:00 +04:00
|
|
|
SLIST_FOREACH(dbs, &wd->sc_bslist, dbs_next) {
|
2003-04-15 22:27:26 +04:00
|
|
|
if (skip > 0) {
|
|
|
|
missing--;
|
|
|
|
skip--;
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
if (available < sizeof(*dbs))
|
2003-04-15 18:11:00 +04:00
|
|
|
break;
|
2003-04-15 22:27:26 +04:00
|
|
|
available -= sizeof(*dbs);
|
2021-12-28 16:27:32 +03:00
|
|
|
memset(&dbsbuf, 0, sizeof(dbsbuf));
|
|
|
|
dbsbuf.dbs_min = dbs->dbs_min;
|
|
|
|
dbsbuf.dbs_max = dbs->dbs_max;
|
|
|
|
dbsbuf.dbs_failedat = dbs->dbs_failedat;
|
|
|
|
mutex_exit(&wd->sc_lock);
|
|
|
|
error = copyout(&dbsbuf, laddr, sizeof(dbsbuf));
|
|
|
|
mutex_enter(&wd->sc_lock);
|
|
|
|
if (error)
|
|
|
|
break;
|
2003-04-15 18:11:00 +04:00
|
|
|
laddr += sizeof(*dbs);
|
2003-04-15 22:27:26 +04:00
|
|
|
missing--;
|
2003-04-15 18:11:00 +04:00
|
|
|
count++;
|
|
|
|
}
|
2021-12-28 16:27:32 +03:00
|
|
|
if (--wd->sc_bslist_inuse == 0)
|
|
|
|
cv_broadcast(&wd->sc_bslist_cv);
|
2018-10-22 23:13:47 +03:00
|
|
|
mutex_exit(&wd->sc_lock);
|
2003-04-15 22:27:26 +04:00
|
|
|
dbsi.dbsi_left = missing;
|
|
|
|
dbsi.dbsi_copied = count;
|
|
|
|
*(struct disk_badsecinfo *)addr = dbsi;
|
2021-12-28 16:27:32 +03:00
|
|
|
|
|
|
|
/*
|
|
|
|
* If we copied anything out, ignore error and return
|
|
|
|
* success -- can't back it out.
|
|
|
|
*/
|
|
|
|
return count ? 0 : error;
|
2003-04-15 18:11:00 +04:00
|
|
|
}
|
|
|
|
|
2021-12-28 16:27:32 +03:00
|
|
|
case DIOCBSFLUSH: {
|
|
|
|
int error;
|
|
|
|
|
2003-04-15 18:11:00 +04:00
|
|
|
/* Clean out the bad sector list */
|
2018-10-22 23:13:47 +03:00
|
|
|
mutex_enter(&wd->sc_lock);
|
2021-12-28 16:27:32 +03:00
|
|
|
while (wd->sc_bslist_inuse) {
|
|
|
|
error = cv_wait_sig(&wd->sc_bslist_cv, &wd->sc_lock);
|
|
|
|
if (error) {
|
|
|
|
mutex_exit(&wd->sc_lock);
|
|
|
|
return error;
|
|
|
|
}
|
|
|
|
}
|
2003-04-15 18:11:00 +04:00
|
|
|
while (!SLIST_EMPTY(&wd->sc_bslist)) {
|
2018-10-22 23:13:47 +03:00
|
|
|
struct disk_badsectors *dbs =
|
|
|
|
SLIST_FIRST(&wd->sc_bslist);
|
2003-04-15 18:11:00 +04:00
|
|
|
SLIST_REMOVE_HEAD(&wd->sc_bslist, dbs_next);
|
2021-12-28 16:27:32 +03:00
|
|
|
mutex_exit(&wd->sc_lock);
|
2018-10-22 23:13:47 +03:00
|
|
|
kmem_free(dbs, sizeof(*dbs));
|
2021-12-28 16:27:32 +03:00
|
|
|
mutex_enter(&wd->sc_lock);
|
2003-04-15 18:11:00 +04:00
|
|
|
}
|
2018-10-22 23:13:47 +03:00
|
|
|
mutex_exit(&wd->sc_lock);
|
2003-04-15 22:27:26 +04:00
|
|
|
wd->sc_bscount = 0;
|
2003-04-15 18:11:00 +04:00
|
|
|
return 0;
|
2021-12-28 16:27:32 +03:00
|
|
|
}
|
2004-08-30 13:34:41 +04:00
|
|
|
#endif
|
2003-07-11 19:33:13 +04:00
|
|
|
|
1993-03-21 12:45:37 +03:00
|
|
|
#ifdef notyet
|
|
|
|
case DIOCWFORMAT:
|
|
|
|
if ((flag & FWRITE) == 0)
|
1994-03-03 04:58:21 +03:00
|
|
|
return EBADF;
|
1998-10-12 20:09:10 +04:00
|
|
|
{
|
1994-03-03 04:58:21 +03:00
|
|
|
register struct format_op *fop;
|
|
|
|
struct iovec aiov;
|
|
|
|
struct uio auio;
|
2017-11-01 22:34:45 +03:00
|
|
|
int error1;
|
2003-07-11 19:33:13 +04:00
|
|
|
|
1994-03-03 04:58:21 +03:00
|
|
|
fop = (struct format_op *)addr;
|
|
|
|
aiov.iov_base = fop->df_buf;
|
|
|
|
aiov.iov_len = fop->df_count;
|
|
|
|
auio.uio_iov = &aiov;
|
|
|
|
auio.uio_iovcnt = 1;
|
|
|
|
auio.uio_resid = fop->df_count;
|
|
|
|
auio.uio_offset =
|
1998-10-12 20:09:10 +04:00
|
|
|
fop->df_startblk * wd->sc_dk.dk_label->d_secsize;
|
2006-03-01 15:38:10 +03:00
|
|
|
auio.uio_vmspace = l->l_proc->p_vmspace;
|
2017-11-01 22:34:45 +03:00
|
|
|
error1 = physio(wdformat, NULL, dev, B_WRITE, wdminphys,
|
1994-03-10 08:18:33 +03:00
|
|
|
&auio);
|
1994-03-03 04:58:21 +03:00
|
|
|
fop->df_count -= auio.uio_resid;
|
1994-03-10 08:18:33 +03:00
|
|
|
fop->df_reg[0] = wdc->sc_status;
|
|
|
|
fop->df_reg[1] = wdc->sc_error;
|
2017-11-01 22:34:45 +03:00
|
|
|
return error1;
|
1998-10-12 20:09:10 +04:00
|
|
|
}
|
1993-03-21 12:45:37 +03:00
|
|
|
#endif
|
2003-04-26 13:54:15 +04:00
|
|
|
case DIOCGCACHE:
|
|
|
|
return wd_getcache(wd, (int *)addr);
|
|
|
|
|
|
|
|
case DIOCSCACHE:
|
|
|
|
return wd_setcache(wd, *(int *)addr);
|
1998-11-19 22:46:12 +03:00
|
|
|
|
2004-05-22 00:35:53 +04:00
|
|
|
case DIOCCACHESYNC:
|
2020-09-27 19:58:11 +03:00
|
|
|
return wd_flushcache(wd, AT_WAIT);
|
2004-05-22 00:35:53 +04:00
|
|
|
|
1998-11-20 02:44:20 +03:00
|
|
|
case ATAIOCCOMMAND:
|
1998-11-19 22:46:12 +03:00
|
|
|
/*
|
|
|
|
* Make sure this command is (relatively) safe first
|
|
|
|
*/
|
1998-11-20 02:44:20 +03:00
|
|
|
if ((((atareq_t *) addr)->flags & ATACMD_READ) == 0 &&
|
1998-11-19 22:46:12 +03:00
|
|
|
(flag & FWRITE) == 0)
|
|
|
|
return (EBADF);
|
|
|
|
{
|
|
|
|
struct wd_ioctl *wi;
|
1998-11-20 02:44:20 +03:00
|
|
|
atareq_t *atareq = (atareq_t *) addr;
|
2005-05-30 02:11:28 +04:00
|
|
|
int error1;
|
1998-11-19 22:46:12 +03:00
|
|
|
|
Merge support for SATA NCQ (Native Command Queueing) from jdolecek-ncq branch
ATA subsystem was changed to support several outstanding commands, and use
NCQ xfers if supported by both the controller and the disk, including NCQ
error recovery. Set NCQ high priority for BPRIO_TIMECRITICAL xfers
if supported. Added FUA support.
Done some work towards MP-safe, all ATA code tsleep()/wakeup() replaced
by condvars, and switched most code from spl* to mutexes (separate
wd(4) and ata channel lock).
Introduced new option WD_CHAOS_MONKEY to facilitate testing of error
handling, fixed several uncovered issues. Also fixed several problems
with kernel dump to wd(4) disk.
Tested with ahcisata(4), mvsata(4), siisata(4), piixide(4) on amd64,
with and without port multiplier, both disk and ATAPI devices; other
drivers and archs mechanically adjusted and compile-tested. NCQ is
supported for ahcisata(4) and siisata(4) for any controller, for
mvsata(4) only Gen IIe ones for now. Also enabled ATAPI support in
mvsata(4).
Thanks to Matt Thomas for initial ATA infrastructure patch, and
Jonathan A.Kollasch for siisata(4) NCQ changes and general testing.
Also fixes PR kern/43169 (wd(4)); and PR kern/11811, PR kern/47041,
PR kern/51979 (kernel dump)
2017-10-07 19:05:31 +03:00
|
|
|
wi = wi_get(wd);
|
1998-11-20 02:44:20 +03:00
|
|
|
wi->wi_atareq = *atareq;
|
1998-11-19 22:46:12 +03:00
|
|
|
|
1998-11-20 02:44:20 +03:00
|
|
|
if (atareq->datalen && atareq->flags &
|
|
|
|
(ATACMD_READ | ATACMD_WRITE)) {
|
2007-07-01 13:48:37 +04:00
|
|
|
void *tbuf;
|
|
|
|
if (atareq->datalen < DEV_BSIZE
|
|
|
|
&& atareq->command == WDCC_IDENTIFY) {
|
2018-10-22 23:13:47 +03:00
|
|
|
tbuf = kmem_zalloc(DEV_BSIZE, KM_SLEEP);
|
2007-07-01 13:48:37 +04:00
|
|
|
wi->wi_iov.iov_base = tbuf;
|
|
|
|
wi->wi_iov.iov_len = DEV_BSIZE;
|
|
|
|
UIO_SETUP_SYSSPACE(&wi->wi_uio);
|
|
|
|
} else {
|
|
|
|
tbuf = NULL;
|
|
|
|
wi->wi_iov.iov_base = atareq->databuf;
|
|
|
|
wi->wi_iov.iov_len = atareq->datalen;
|
|
|
|
wi->wi_uio.uio_vmspace = l->l_proc->p_vmspace;
|
|
|
|
}
|
1998-11-19 22:46:12 +03:00
|
|
|
wi->wi_uio.uio_iov = &wi->wi_iov;
|
|
|
|
wi->wi_uio.uio_iovcnt = 1;
|
1998-11-20 02:44:20 +03:00
|
|
|
wi->wi_uio.uio_resid = atareq->datalen;
|
1998-11-19 22:46:12 +03:00
|
|
|
wi->wi_uio.uio_offset = 0;
|
|
|
|
wi->wi_uio.uio_rw =
|
1998-11-20 02:44:20 +03:00
|
|
|
(atareq->flags & ATACMD_READ) ? B_READ : B_WRITE;
|
2005-05-30 02:11:28 +04:00
|
|
|
error1 = physio(wdioctlstrategy, &wi->wi_bp, dev,
|
1998-11-20 02:44:20 +03:00
|
|
|
(atareq->flags & ATACMD_READ) ? B_READ : B_WRITE,
|
2011-10-05 07:40:18 +04:00
|
|
|
wdminphys, &wi->wi_uio);
|
2007-07-01 13:48:37 +04:00
|
|
|
if (tbuf != NULL && error1 == 0) {
|
|
|
|
error1 = copyout(tbuf, atareq->databuf,
|
|
|
|
atareq->datalen);
|
2018-10-22 23:13:47 +03:00
|
|
|
kmem_free(tbuf, DEV_BSIZE);
|
2007-07-01 13:48:37 +04:00
|
|
|
}
|
1998-11-19 22:46:12 +03:00
|
|
|
} else {
|
|
|
|
/* No need to call physio if we don't have any
|
|
|
|
user data */
|
|
|
|
wi->wi_bp.b_flags = 0;
|
|
|
|
wi->wi_bp.b_data = 0;
|
|
|
|
wi->wi_bp.b_bcount = 0;
|
Merge support for SATA NCQ (Native Command Queueing) from jdolecek-ncq branch
ATA subsystem was changed to support several outstanding commands, and use
NCQ xfers if supported by both the controller and the disk, including NCQ
error recovery. Set NCQ high priority for BPRIO_TIMECRITICAL xfers
if supported. Added FUA support.
Done some work towards MP-safe, all ATA code tsleep()/wakeup() replaced
by condvars, and switched most code from spl* to mutexes (separate
wd(4) and ata channel lock).
Introduced new option WD_CHAOS_MONKEY to facilitate testing of error
handling, fixed several uncovered issues. Also fixed several problems
with kernel dump to wd(4) disk.
Tested with ahcisata(4), mvsata(4), siisata(4), piixide(4) on amd64,
with and without port multiplier, both disk and ATAPI devices; other
drivers and archs mechanically adjusted and compile-tested. NCQ is
supported for ahcisata(4) and siisata(4) for any controller, for
mvsata(4) only Gen IIe ones for now. Also enabled ATAPI support in
mvsata(4).
Thanks to Matt Thomas for initial ATA infrastructure patch, and
Jonathan A.Kollasch for siisata(4) NCQ changes and general testing.
Also fixes PR kern/43169 (wd(4)); and PR kern/11811, PR kern/47041,
PR kern/51979 (kernel dump)
2017-10-07 19:05:31 +03:00
|
|
|
wi->wi_bp.b_dev = dev;
|
2005-12-11 15:16:03 +03:00
|
|
|
wi->wi_bp.b_proc = l->l_proc;
|
1998-11-19 22:46:12 +03:00
|
|
|
wdioctlstrategy(&wi->wi_bp);
|
2005-05-30 02:11:28 +04:00
|
|
|
error1 = wi->wi_bp.b_error;
|
1998-11-19 22:46:12 +03:00
|
|
|
}
|
1998-11-20 02:44:20 +03:00
|
|
|
*atareq = wi->wi_atareq;
|
1998-11-19 22:46:12 +03:00
|
|
|
wi_free(wi);
|
2005-05-30 02:11:28 +04:00
|
|
|
return(error1);
|
1998-11-19 22:46:12 +03:00
|
|
|
}
|
|
|
|
|
2020-03-02 19:01:56 +03:00
|
|
|
case DIOCGSECTORALIGN: {
|
|
|
|
struct disk_sectoralign *dsa = addr;
|
|
|
|
int part = WDPART(dev);
|
|
|
|
|
|
|
|
*dsa = wd->sc_sectoralign;
|
|
|
|
if (part != RAW_PART) {
|
|
|
|
struct disklabel *lp = dksc->sc_dkdev.dk_label;
|
|
|
|
daddr_t offset = lp->d_partitions[part].p_offset;
|
|
|
|
uint32_t r = offset % dsa->dsa_alignment;
|
|
|
|
|
|
|
|
if (r < dsa->dsa_firstaligned)
|
|
|
|
dsa->dsa_firstaligned = dsa->dsa_firstaligned
|
|
|
|
- r;
|
|
|
|
else
|
|
|
|
dsa->dsa_firstaligned = (dsa->dsa_firstaligned
|
|
|
|
+ dsa->dsa_alignment) - r;
|
|
|
|
}
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
1993-03-21 12:45:37 +03:00
|
|
|
default:
|
2017-11-01 22:34:45 +03:00
|
|
|
return dk_ioctl(dksc, dev, cmd, addr, flag, l);
|
1993-03-21 12:45:37 +03:00
|
|
|
}
|
1994-03-03 04:58:21 +03:00
|
|
|
|
|
|
|
#ifdef DIAGNOSTIC
|
|
|
|
panic("wdioctl: impossible");
|
|
|
|
#endif
|
1993-03-21 12:45:37 +03:00
|
|
|
}
|
|
|
|
|
2014-07-25 12:22:08 +04:00
|
|
|
static int
|
2017-11-01 22:34:45 +03:00
|
|
|
wd_discard(device_t dev, off_t pos, off_t len)
|
2014-07-25 12:22:08 +04:00
|
|
|
{
|
2017-11-01 22:34:45 +03:00
|
|
|
struct wd_softc *wd = device_private(dev);
|
2014-07-25 12:22:08 +04:00
|
|
|
daddr_t bno;
|
|
|
|
long size, done;
|
|
|
|
long maxatonce, amount;
|
|
|
|
int result;
|
|
|
|
|
|
|
|
if (!(wd->sc_params.atap_ata_major & WDC_VER_ATA7)
|
|
|
|
|| !(wd->sc_params.support_dsm & ATA_SUPPORT_DSM_TRIM)) {
|
|
|
|
/* not supported; ignore request */
|
|
|
|
ATADEBUG_PRINT(("wddiscard (unsupported)\n"), DEBUG_FUNCS);
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
maxatonce = 0xffff; /*wd->sc_params.max_dsm_blocks*/
|
|
|
|
|
|
|
|
ATADEBUG_PRINT(("wddiscard\n"), DEBUG_FUNCS);
|
|
|
|
|
|
|
|
if ((wd->sc_flags & WDF_LOADED) == 0)
|
|
|
|
return EIO;
|
|
|
|
|
|
|
|
/* round the start up and the end down */
|
2016-07-22 07:08:10 +03:00
|
|
|
bno = (pos + wd->sc_blksize - 1) / wd->sc_blksize;
|
|
|
|
size = ((pos + len) / wd->sc_blksize) - bno;
|
2014-07-25 12:22:08 +04:00
|
|
|
|
|
|
|
done = 0;
|
|
|
|
while (done < size) {
|
|
|
|
amount = size - done;
|
|
|
|
if (amount > maxatonce) {
|
|
|
|
amount = maxatonce;
|
|
|
|
}
|
2017-11-01 22:34:45 +03:00
|
|
|
result = wd_trim(wd, bno + done, amount);
|
2014-07-25 12:22:08 +04:00
|
|
|
if (result) {
|
|
|
|
return result;
|
|
|
|
}
|
|
|
|
done += amount;
|
|
|
|
}
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2017-11-01 22:34:45 +03:00
|
|
|
static int
|
|
|
|
wddiscard(dev_t dev, off_t pos, off_t len)
|
|
|
|
{
|
|
|
|
struct wd_softc *wd;
|
|
|
|
struct dk_softc *dksc;
|
|
|
|
int unit;
|
|
|
|
|
|
|
|
unit = WDUNIT(dev);
|
|
|
|
wd = device_lookup_private(&wd_cd, unit);
|
|
|
|
dksc = &wd->sc_dksc;
|
|
|
|
|
|
|
|
return dk_discard(dksc, dev, pos, len);
|
|
|
|
}
|
|
|
|
|
1994-02-26 03:00:17 +03:00
|
|
|
#ifdef B_FORMAT
|
1993-03-21 12:45:37 +03:00
|
|
|
int
|
|
|
|
wdformat(struct buf *bp)
|
|
|
|
{
|
1994-02-26 03:00:17 +03:00
|
|
|
|
1993-03-21 12:45:37 +03:00
|
|
|
bp->b_flags |= B_FORMAT;
|
1994-02-25 19:40:47 +03:00
|
|
|
return wdstrategy(bp);
|
1993-03-21 12:45:37 +03:00
|
|
|
}
|
|
|
|
#endif
|
|
|
|
|
|
|
|
int
|
2003-07-11 19:33:13 +04:00
|
|
|
wdsize(dev_t dev)
|
1993-03-21 12:45:37 +03:00
|
|
|
{
|
1994-03-10 08:18:33 +03:00
|
|
|
struct wd_softc *wd;
|
2017-11-01 22:34:45 +03:00
|
|
|
struct dk_softc *dksc;
|
|
|
|
int unit;
|
1997-08-27 15:22:52 +04:00
|
|
|
|
2004-08-13 08:10:49 +04:00
|
|
|
ATADEBUG_PRINT(("wdsize\n"), DEBUG_FUNCS);
|
1997-08-27 15:22:52 +04:00
|
|
|
|
2017-11-01 22:34:45 +03:00
|
|
|
unit = WDUNIT(dev);
|
|
|
|
wd = device_lookup_private(&wd_cd, unit);
|
1997-06-19 00:39:55 +04:00
|
|
|
if (wd == NULL)
|
|
|
|
return (-1);
|
2017-11-01 22:34:45 +03:00
|
|
|
dksc = &wd->sc_dksc;
|
1997-06-19 00:39:55 +04:00
|
|
|
|
2017-11-01 22:34:45 +03:00
|
|
|
if (!device_is_active(dksc->sc_dev))
|
1997-06-19 00:39:55 +04:00
|
|
|
return (-1);
|
2017-11-01 22:34:45 +03:00
|
|
|
|
|
|
|
return dk_size(dksc, dev);
|
1993-03-21 12:45:37 +03:00
|
|
|
}
|
|
|
|
|
1994-03-10 08:18:33 +03:00
|
|
|
/*
|
|
|
|
* Dump core after a system crash.
|
|
|
|
*/
|
2017-11-01 22:34:45 +03:00
|
|
|
static int
|
2007-03-04 08:59:00 +03:00
|
|
|
wddump(dev_t dev, daddr_t blkno, void *va, size_t size)
|
1993-03-21 12:45:37 +03:00
|
|
|
{
|
2017-11-01 22:34:45 +03:00
|
|
|
struct wd_softc *wd;
|
|
|
|
struct dk_softc *dksc;
|
|
|
|
int unit;
|
1995-06-26 09:16:55 +04:00
|
|
|
|
|
|
|
/* Check if recursive dump; if so, punt. */
|
1994-11-23 04:35:43 +03:00
|
|
|
if (wddoingadump)
|
|
|
|
return EFAULT;
|
|
|
|
wddoingadump = 1;
|
1994-03-05 11:17:06 +03:00
|
|
|
|
2017-11-01 22:34:45 +03:00
|
|
|
unit = WDUNIT(dev);
|
|
|
|
wd = device_lookup_private(&wd_cd, unit);
|
2000-07-06 04:43:04 +04:00
|
|
|
if (wd == NULL)
|
|
|
|
return (ENXIO);
|
2017-11-01 22:34:45 +03:00
|
|
|
dksc = &wd->sc_dksc;
|
1995-06-26 09:16:55 +04:00
|
|
|
|
2020-03-01 06:21:54 +03:00
|
|
|
return dk_dump(dksc, dev, blkno, va, size, 0);
|
2017-11-01 22:34:45 +03:00
|
|
|
}
|
1995-06-26 09:16:55 +04:00
|
|
|
|
2017-11-01 22:34:45 +03:00
|
|
|
static int
|
|
|
|
wd_dumpblocks(device_t dev, void *va, daddr_t blkno, int nblk)
|
|
|
|
{
|
|
|
|
struct wd_softc *wd = device_private(dev);
|
|
|
|
struct dk_softc *dksc = &wd->sc_dksc;
|
|
|
|
struct disk_geom *dg = &dksc->sc_dkdev.dk_geom;
|
2018-10-22 23:13:47 +03:00
|
|
|
struct ata_xfer *xfer = &wd->dump_xfer;
|
2017-11-01 22:34:45 +03:00
|
|
|
int err;
|
1995-06-26 09:16:55 +04:00
|
|
|
|
|
|
|
/* Recalibrate, if first dump transfer. */
|
|
|
|
if (wddumprecalibrated == 0) {
|
|
|
|
wddumprecalibrated = 1;
|
2018-10-22 23:13:47 +03:00
|
|
|
ata_channel_lock(wd->drvp->chnl_softc);
|
|
|
|
/* This will directly execute the reset due to AT_POLL */
|
|
|
|
ata_thread_run(wd->drvp->chnl_softc, AT_POLL,
|
|
|
|
ATACH_TH_DRIVE_RESET, wd->drvp->drive);
|
|
|
|
|
2000-05-27 20:11:16 +04:00
|
|
|
wd->drvp->state = RESET;
|
2018-10-22 23:13:47 +03:00
|
|
|
ata_channel_unlock(wd->drvp->chnl_softc);
|
1994-03-07 08:54:44 +03:00
|
|
|
}
|
2003-07-11 19:33:13 +04:00
|
|
|
|
2018-10-22 23:13:47 +03:00
|
|
|
memset(xfer, 0, sizeof(*xfer));
|
|
|
|
xfer->c_flags |= C_PRIVATE_ALLOC | C_SKIP_QUEUE;
|
Merge support for SATA NCQ (Native Command Queueing) from jdolecek-ncq branch
ATA subsystem was changed to support several outstanding commands, and use
NCQ xfers if supported by both the controller and the disk, including NCQ
error recovery. Set NCQ high priority for BPRIO_TIMECRITICAL xfers
if supported. Added FUA support.
Done some work towards MP-safe, all ATA code tsleep()/wakeup() replaced
by condvars, and switched most code from spl* to mutexes (separate
wd(4) and ata channel lock).
Introduced new option WD_CHAOS_MONKEY to facilitate testing of error
handling, fixed several uncovered issues. Also fixed several problems
with kernel dump to wd(4) disk.
Tested with ahcisata(4), mvsata(4), siisata(4), piixide(4) on amd64,
with and without port multiplier, both disk and ATAPI devices; other
drivers and archs mechanically adjusted and compile-tested. NCQ is
supported for ahcisata(4) and siisata(4) for any controller, for
mvsata(4) only Gen IIe ones for now. Also enabled ATAPI support in
mvsata(4).
Thanks to Matt Thomas for initial ATA infrastructure patch, and
Jonathan A.Kollasch for siisata(4) NCQ changes and general testing.
Also fixes PR kern/43169 (wd(4)); and PR kern/11811, PR kern/47041,
PR kern/51979 (kernel dump)
2017-10-07 19:05:31 +03:00
|
|
|
|
|
|
|
xfer->c_bio.blkno = blkno;
|
|
|
|
xfer->c_bio.flags = ATA_POLL;
|
2005-08-29 23:05:54 +04:00
|
|
|
if (wd->sc_flags & WDF_LBA48 &&
|
2017-11-01 22:34:45 +03:00
|
|
|
(xfer->c_bio.blkno + nblk) > wd->sc_capacity28)
|
Merge support for SATA NCQ (Native Command Queueing) from jdolecek-ncq branch
ATA subsystem was changed to support several outstanding commands, and use
NCQ xfers if supported by both the controller and the disk, including NCQ
error recovery. Set NCQ high priority for BPRIO_TIMECRITICAL xfers
if supported. Added FUA support.
Done some work towards MP-safe, all ATA code tsleep()/wakeup() replaced
by condvars, and switched most code from spl* to mutexes (separate
wd(4) and ata channel lock).
Introduced new option WD_CHAOS_MONKEY to facilitate testing of error
handling, fixed several uncovered issues. Also fixed several problems
with kernel dump to wd(4) disk.
Tested with ahcisata(4), mvsata(4), siisata(4), piixide(4) on amd64,
with and without port multiplier, both disk and ATAPI devices; other
drivers and archs mechanically adjusted and compile-tested. NCQ is
supported for ahcisata(4) and siisata(4) for any controller, for
mvsata(4) only Gen IIe ones for now. Also enabled ATAPI support in
mvsata(4).
Thanks to Matt Thomas for initial ATA infrastructure patch, and
Jonathan A.Kollasch for siisata(4) NCQ changes and general testing.
Also fixes PR kern/43169 (wd(4)); and PR kern/11811, PR kern/47041,
PR kern/51979 (kernel dump)
2017-10-07 19:05:31 +03:00
|
|
|
xfer->c_bio.flags |= ATA_LBA48;
|
2005-08-29 23:05:54 +04:00
|
|
|
if (wd->sc_flags & WDF_LBA)
|
Merge support for SATA NCQ (Native Command Queueing) from jdolecek-ncq branch
ATA subsystem was changed to support several outstanding commands, and use
NCQ xfers if supported by both the controller and the disk, including NCQ
error recovery. Set NCQ high priority for BPRIO_TIMECRITICAL xfers
if supported. Added FUA support.
Done some work towards MP-safe, all ATA code tsleep()/wakeup() replaced
by condvars, and switched most code from spl* to mutexes (separate
wd(4) and ata channel lock).
Introduced new option WD_CHAOS_MONKEY to facilitate testing of error
handling, fixed several uncovered issues. Also fixed several problems
with kernel dump to wd(4) disk.
Tested with ahcisata(4), mvsata(4), siisata(4), piixide(4) on amd64,
with and without port multiplier, both disk and ATAPI devices; other
drivers and archs mechanically adjusted and compile-tested. NCQ is
supported for ahcisata(4) and siisata(4) for any controller, for
mvsata(4) only Gen IIe ones for now. Also enabled ATAPI support in
mvsata(4).
Thanks to Matt Thomas for initial ATA infrastructure patch, and
Jonathan A.Kollasch for siisata(4) NCQ changes and general testing.
Also fixes PR kern/43169 (wd(4)); and PR kern/11811, PR kern/47041,
PR kern/51979 (kernel dump)
2017-10-07 19:05:31 +03:00
|
|
|
xfer->c_bio.flags |= ATA_LBA;
|
2017-11-01 22:34:45 +03:00
|
|
|
xfer->c_bio.bcount = nblk * dg->dg_secsize;
|
Merge support for SATA NCQ (Native Command Queueing) from jdolecek-ncq branch
ATA subsystem was changed to support several outstanding commands, and use
NCQ xfers if supported by both the controller and the disk, including NCQ
error recovery. Set NCQ high priority for BPRIO_TIMECRITICAL xfers
if supported. Added FUA support.
Done some work towards MP-safe, all ATA code tsleep()/wakeup() replaced
by condvars, and switched most code from spl* to mutexes (separate
wd(4) and ata channel lock).
Introduced new option WD_CHAOS_MONKEY to facilitate testing of error
handling, fixed several uncovered issues. Also fixed several problems
with kernel dump to wd(4) disk.
Tested with ahcisata(4), mvsata(4), siisata(4), piixide(4) on amd64,
with and without port multiplier, both disk and ATAPI devices; other
drivers and archs mechanically adjusted and compile-tested. NCQ is
supported for ahcisata(4) and siisata(4) for any controller, for
mvsata(4) only Gen IIe ones for now. Also enabled ATAPI support in
mvsata(4).
Thanks to Matt Thomas for initial ATA infrastructure patch, and
Jonathan A.Kollasch for siisata(4) NCQ changes and general testing.
Also fixes PR kern/43169 (wd(4)); and PR kern/11811, PR kern/47041,
PR kern/51979 (kernel dump)
2017-10-07 19:05:31 +03:00
|
|
|
xfer->c_bio.databuf = va;
|
1995-06-26 09:16:55 +04:00
|
|
|
#ifndef WD_DUMP_NOT_TRUSTED
|
2020-04-13 13:49:34 +03:00
|
|
|
/* This will poll until the bio is complete */
|
|
|
|
wd->atabus->ata_bio(wd->drvp, xfer);
|
|
|
|
|
Merge support for SATA NCQ (Native Command Queueing) from jdolecek-ncq branch
ATA subsystem was changed to support several outstanding commands, and use
NCQ xfers if supported by both the controller and the disk, including NCQ
error recovery. Set NCQ high priority for BPRIO_TIMECRITICAL xfers
if supported. Added FUA support.
Done some work towards MP-safe, all ATA code tsleep()/wakeup() replaced
by condvars, and switched most code from spl* to mutexes (separate
wd(4) and ata channel lock).
Introduced new option WD_CHAOS_MONKEY to facilitate testing of error
handling, fixed several uncovered issues. Also fixed several problems
with kernel dump to wd(4) disk.
Tested with ahcisata(4), mvsata(4), siisata(4), piixide(4) on amd64,
with and without port multiplier, both disk and ATAPI devices; other
drivers and archs mechanically adjusted and compile-tested. NCQ is
supported for ahcisata(4) and siisata(4) for any controller, for
mvsata(4) only Gen IIe ones for now. Also enabled ATAPI support in
mvsata(4).
Thanks to Matt Thomas for initial ATA infrastructure patch, and
Jonathan A.Kollasch for siisata(4) NCQ changes and general testing.
Also fixes PR kern/43169 (wd(4)); and PR kern/11811, PR kern/47041,
PR kern/51979 (kernel dump)
2017-10-07 19:05:31 +03:00
|
|
|
switch(err = xfer->c_bio.error) {
|
2005-08-29 23:05:54 +04:00
|
|
|
case TIMEOUT:
|
|
|
|
printf("wddump: device timed out");
|
|
|
|
err = EIO;
|
|
|
|
break;
|
|
|
|
case ERR_DF:
|
|
|
|
printf("wddump: drive fault");
|
|
|
|
err = EIO;
|
|
|
|
break;
|
|
|
|
case ERR_DMA:
|
|
|
|
printf("wddump: DMA error");
|
|
|
|
err = EIO;
|
|
|
|
break;
|
|
|
|
case ERROR:
|
|
|
|
printf("wddump: ");
|
Merge support for SATA NCQ (Native Command Queueing) from jdolecek-ncq branch
ATA subsystem was changed to support several outstanding commands, and use
NCQ xfers if supported by both the controller and the disk, including NCQ
error recovery. Set NCQ high priority for BPRIO_TIMECRITICAL xfers
if supported. Added FUA support.
Done some work towards MP-safe, all ATA code tsleep()/wakeup() replaced
by condvars, and switched most code from spl* to mutexes (separate
wd(4) and ata channel lock).
Introduced new option WD_CHAOS_MONKEY to facilitate testing of error
handling, fixed several uncovered issues. Also fixed several problems
with kernel dump to wd(4) disk.
Tested with ahcisata(4), mvsata(4), siisata(4), piixide(4) on amd64,
with and without port multiplier, both disk and ATAPI devices; other
drivers and archs mechanically adjusted and compile-tested. NCQ is
supported for ahcisata(4) and siisata(4) for any controller, for
mvsata(4) only Gen IIe ones for now. Also enabled ATAPI support in
mvsata(4).
Thanks to Matt Thomas for initial ATA infrastructure patch, and
Jonathan A.Kollasch for siisata(4) NCQ changes and general testing.
Also fixes PR kern/43169 (wd(4)); and PR kern/11811, PR kern/47041,
PR kern/51979 (kernel dump)
2017-10-07 19:05:31 +03:00
|
|
|
wdperror(wd, xfer);
|
2005-08-29 23:05:54 +04:00
|
|
|
err = EIO;
|
|
|
|
break;
|
|
|
|
case NOERROR:
|
|
|
|
err = 0;
|
|
|
|
break;
|
|
|
|
default:
|
2018-10-22 23:13:47 +03:00
|
|
|
panic("wddump: unknown error type %x", err);
|
2005-08-29 23:05:54 +04:00
|
|
|
}
|
Merge support for SATA NCQ (Native Command Queueing) from jdolecek-ncq branch
ATA subsystem was changed to support several outstanding commands, and use
NCQ xfers if supported by both the controller and the disk, including NCQ
error recovery. Set NCQ high priority for BPRIO_TIMECRITICAL xfers
if supported. Added FUA support.
Done some work towards MP-safe, all ATA code tsleep()/wakeup() replaced
by condvars, and switched most code from spl* to mutexes (separate
wd(4) and ata channel lock).
Introduced new option WD_CHAOS_MONKEY to facilitate testing of error
handling, fixed several uncovered issues. Also fixed several problems
with kernel dump to wd(4) disk.
Tested with ahcisata(4), mvsata(4), siisata(4), piixide(4) on amd64,
with and without port multiplier, both disk and ATAPI devices; other
drivers and archs mechanically adjusted and compile-tested. NCQ is
supported for ahcisata(4) and siisata(4) for any controller, for
mvsata(4) only Gen IIe ones for now. Also enabled ATAPI support in
mvsata(4).
Thanks to Matt Thomas for initial ATA infrastructure patch, and
Jonathan A.Kollasch for siisata(4) NCQ changes and general testing.
Also fixes PR kern/43169 (wd(4)); and PR kern/11811, PR kern/47041,
PR kern/51979 (kernel dump)
2017-10-07 19:05:31 +03:00
|
|
|
|
2005-08-29 23:05:54 +04:00
|
|
|
if (err != 0) {
|
|
|
|
printf("\n");
|
|
|
|
return err;
|
|
|
|
}
|
1995-06-26 09:16:55 +04:00
|
|
|
#else /* WD_DUMP_NOT_TRUSTED */
|
2005-08-29 23:05:54 +04:00
|
|
|
/* Let's just talk about this first... */
|
|
|
|
printf("wd%d: dump addr 0x%x, cylin %d, head %d, sector %d\n",
|
|
|
|
unit, va, cylin, head, sector);
|
|
|
|
delay(500 * 1000); /* half a second */
|
1995-06-26 09:16:55 +04:00
|
|
|
#endif
|
1993-03-21 12:45:37 +03:00
|
|
|
|
1995-06-26 09:16:55 +04:00
|
|
|
wddoingadump = 0;
|
1994-02-25 19:40:47 +03:00
|
|
|
return 0;
|
1993-03-21 12:45:37 +03:00
|
|
|
}
|
1993-04-06 14:06:28 +04:00
|
|
|
|
1998-03-25 12:58:24 +03:00
|
|
|
#ifdef HAS_BAD144_HANDLING
|
1993-04-06 14:06:28 +04:00
|
|
|
/*
|
|
|
|
* Internalize the bad sector table.
|
|
|
|
*/
|
|
|
|
void
|
2003-07-11 19:33:13 +04:00
|
|
|
bad144intern(struct wd_softc *wd)
|
1993-04-06 14:06:28 +04:00
|
|
|
{
|
2017-11-01 22:34:45 +03:00
|
|
|
struct dk_softc *dksc = &wd->sc_dksc;
|
|
|
|
struct dkbad *bt = &dksc->sc_dkdev.dk_cpulabel->bad;
|
|
|
|
struct disklabel *lp = dksc->sc_dkdev.dk_label;
|
1994-10-20 21:37:45 +03:00
|
|
|
int i = 0;
|
1994-03-04 06:43:48 +03:00
|
|
|
|
2004-08-13 08:10:49 +04:00
|
|
|
ATADEBUG_PRINT(("bad144intern\n"), DEBUG_XFERS);
|
1997-08-27 15:22:52 +04:00
|
|
|
|
1998-03-25 12:58:24 +03:00
|
|
|
for (; i < NBT_BAD; i++) {
|
1994-10-20 21:37:45 +03:00
|
|
|
if (bt->bt_bad[i].bt_cyl == 0xffff)
|
1994-03-04 06:43:48 +03:00
|
|
|
break;
|
Merge support for SATA NCQ (Native Command Queueing) from jdolecek-ncq branch
ATA subsystem was changed to support several outstanding commands, and use
NCQ xfers if supported by both the controller and the disk, including NCQ
error recovery. Set NCQ high priority for BPRIO_TIMECRITICAL xfers
if supported. Added FUA support.
Done some work towards MP-safe, all ATA code tsleep()/wakeup() replaced
by condvars, and switched most code from spl* to mutexes (separate
wd(4) and ata channel lock).
Introduced new option WD_CHAOS_MONKEY to facilitate testing of error
handling, fixed several uncovered issues. Also fixed several problems
with kernel dump to wd(4) disk.
Tested with ahcisata(4), mvsata(4), siisata(4), piixide(4) on amd64,
with and without port multiplier, both disk and ATAPI devices; other
drivers and archs mechanically adjusted and compile-tested. NCQ is
supported for ahcisata(4) and siisata(4) for any controller, for
mvsata(4) only Gen IIe ones for now. Also enabled ATAPI support in
mvsata(4).
Thanks to Matt Thomas for initial ATA infrastructure patch, and
Jonathan A.Kollasch for siisata(4) NCQ changes and general testing.
Also fixes PR kern/43169 (wd(4)); and PR kern/11811, PR kern/47041,
PR kern/51979 (kernel dump)
2017-10-07 19:05:31 +03:00
|
|
|
wd->drvp->badsect[i] =
|
1994-10-20 21:37:45 +03:00
|
|
|
bt->bt_bad[i].bt_cyl * lp->d_secpercyl +
|
|
|
|
(bt->bt_bad[i].bt_trksec >> 8) * lp->d_nsectors +
|
|
|
|
(bt->bt_bad[i].bt_trksec & 0xff);
|
1993-04-06 14:06:28 +04:00
|
|
|
}
|
1998-03-25 12:58:24 +03:00
|
|
|
for (; i < NBT_BAD+1; i++)
|
Merge support for SATA NCQ (Native Command Queueing) from jdolecek-ncq branch
ATA subsystem was changed to support several outstanding commands, and use
NCQ xfers if supported by both the controller and the disk, including NCQ
error recovery. Set NCQ high priority for BPRIO_TIMECRITICAL xfers
if supported. Added FUA support.
Done some work towards MP-safe, all ATA code tsleep()/wakeup() replaced
by condvars, and switched most code from spl* to mutexes (separate
wd(4) and ata channel lock).
Introduced new option WD_CHAOS_MONKEY to facilitate testing of error
handling, fixed several uncovered issues. Also fixed several problems
with kernel dump to wd(4) disk.
Tested with ahcisata(4), mvsata(4), siisata(4), piixide(4) on amd64,
with and without port multiplier, both disk and ATAPI devices; other
drivers and archs mechanically adjusted and compile-tested. NCQ is
supported for ahcisata(4) and siisata(4) for any controller, for
mvsata(4) only Gen IIe ones for now. Also enabled ATAPI support in
mvsata(4).
Thanks to Matt Thomas for initial ATA infrastructure patch, and
Jonathan A.Kollasch for siisata(4) NCQ changes and general testing.
Also fixes PR kern/43169 (wd(4)); and PR kern/11811, PR kern/47041,
PR kern/51979 (kernel dump)
2017-10-07 19:05:31 +03:00
|
|
|
wd->drvp->badsect[i] = -1;
|
1993-07-06 04:42:43 +04:00
|
|
|
}
|
1998-03-25 12:58:24 +03:00
|
|
|
#endif
|
1993-12-13 13:16:56 +03:00
|
|
|
|
2006-09-22 08:48:38 +04:00
|
|
|
static void
|
2017-11-01 22:34:45 +03:00
|
|
|
wd_set_geometry(struct wd_softc *wd)
|
2006-09-22 08:48:38 +04:00
|
|
|
{
|
2017-11-01 22:34:45 +03:00
|
|
|
struct dk_softc *dksc = &wd->sc_dksc;
|
|
|
|
struct disk_geom *dg = &dksc->sc_dkdev.dk_geom;
|
2006-09-22 08:48:38 +04:00
|
|
|
|
2013-05-29 04:47:48 +04:00
|
|
|
memset(dg, 0, sizeof(*dg));
|
2006-09-22 08:48:38 +04:00
|
|
|
|
2013-05-29 04:47:48 +04:00
|
|
|
dg->dg_secperunit = wd->sc_capacity;
|
2016-07-22 07:08:10 +03:00
|
|
|
dg->dg_secsize = wd->sc_blksize;
|
2013-05-29 04:47:48 +04:00
|
|
|
dg->dg_nsectors = wd->sc_params.atap_sectors;
|
|
|
|
dg->dg_ntracks = wd->sc_params.atap_heads;
|
|
|
|
if ((wd->sc_flags & WDF_LBA) == 0)
|
|
|
|
dg->dg_ncylinders = wd->sc_params.atap_cylinders;
|
2006-10-26 09:04:18 +04:00
|
|
|
|
2019-03-19 09:51:05 +03:00
|
|
|
disk_set_info(dksc->sc_dev, &dksc->sc_dkdev, wd->sc_typename);
|
2006-09-22 08:48:38 +04:00
|
|
|
}
|
|
|
|
|
1998-10-12 20:09:10 +04:00
|
|
|
int
|
2020-04-13 13:49:34 +03:00
|
|
|
wd_get_params(struct wd_softc *wd, struct ataparams *params)
|
1994-03-07 08:54:44 +03:00
|
|
|
{
|
2019-04-05 21:23:45 +03:00
|
|
|
int retry = 0;
|
2019-06-06 23:55:43 +03:00
|
|
|
struct ata_channel *chp = wd->drvp->chnl_softc;
|
2020-04-13 13:49:34 +03:00
|
|
|
const int flags = AT_WAIT;
|
2007-11-07 11:59:03 +03:00
|
|
|
|
2019-04-05 21:23:45 +03:00
|
|
|
again:
|
2001-12-03 03:11:15 +03:00
|
|
|
switch (wd->atabus->ata_get_params(wd->drvp, flags, params)) {
|
1998-10-12 20:09:10 +04:00
|
|
|
case CMD_AGAIN:
|
|
|
|
return 1;
|
|
|
|
case CMD_ERR:
|
2019-04-05 21:23:45 +03:00
|
|
|
if (retry == 0) {
|
|
|
|
retry++;
|
2019-06-06 23:55:43 +03:00
|
|
|
ata_channel_lock(chp);
|
2019-04-06 00:31:44 +03:00
|
|
|
(*wd->atabus->ata_reset_drive)(wd->drvp, flags, NULL);
|
2019-06-06 23:55:43 +03:00
|
|
|
ata_channel_unlock(chp);
|
2019-04-05 21:23:45 +03:00
|
|
|
goto again;
|
|
|
|
}
|
|
|
|
|
2012-07-31 19:50:31 +04:00
|
|
|
if (wd->drvp->drive_type != ATA_DRIVET_OLD)
|
|
|
|
return 1;
|
1998-10-12 20:09:10 +04:00
|
|
|
/*
|
|
|
|
* We `know' there's a drive here; just assume it's old.
|
|
|
|
* This geometry is only used to read the MBR and print a
|
|
|
|
* (false) attach message.
|
|
|
|
*/
|
|
|
|
strncpy(params->atap_model, "ST506",
|
|
|
|
sizeof params->atap_model);
|
|
|
|
params->atap_config = ATA_CFG_FIXED;
|
|
|
|
params->atap_cylinders = 1024;
|
|
|
|
params->atap_heads = 8;
|
|
|
|
params->atap_sectors = 17;
|
|
|
|
params->atap_multi = 1;
|
|
|
|
params->atap_capabilities1 = params->atap_capabilities2 = 0;
|
1999-01-18 23:06:24 +03:00
|
|
|
wd->drvp->ata_vers = -1; /* Mark it as pre-ATA */
|
2006-09-22 08:48:38 +04:00
|
|
|
/* FALLTHROUGH */
|
1998-10-12 20:09:10 +04:00
|
|
|
case CMD_OK:
|
|
|
|
return 0;
|
|
|
|
default:
|
|
|
|
panic("wd_get_params: bad return code from ata_get_params");
|
|
|
|
/* NOTREACHED */
|
|
|
|
}
|
1994-03-07 08:54:44 +03:00
|
|
|
}
|
1998-11-19 22:46:12 +03:00
|
|
|
|
2003-04-26 13:54:15 +04:00
|
|
|
int
|
2003-07-11 19:33:13 +04:00
|
|
|
wd_getcache(struct wd_softc *wd, int *bitsp)
|
2003-04-26 13:54:15 +04:00
|
|
|
{
|
|
|
|
struct ataparams params;
|
|
|
|
|
2020-04-13 13:49:34 +03:00
|
|
|
if (wd_get_params(wd, ¶ms) != 0)
|
2003-04-26 13:54:15 +04:00
|
|
|
return EIO;
|
|
|
|
if (params.atap_cmd_set1 == 0x0000 ||
|
|
|
|
params.atap_cmd_set1 == 0xffff ||
|
|
|
|
(params.atap_cmd_set1 & WDC_CMD1_CACHE) == 0) {
|
|
|
|
*bitsp = 0;
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
*bitsp = DKCACHE_WCHANGE | DKCACHE_READ;
|
|
|
|
if (params.atap_cmd1_en & WDC_CMD1_CACHE)
|
|
|
|
*bitsp |= DKCACHE_WRITE;
|
|
|
|
|
Merge support for SATA NCQ (Native Command Queueing) from jdolecek-ncq branch
ATA subsystem was changed to support several outstanding commands, and use
NCQ xfers if supported by both the controller and the disk, including NCQ
error recovery. Set NCQ high priority for BPRIO_TIMECRITICAL xfers
if supported. Added FUA support.
Done some work towards MP-safe, all ATA code tsleep()/wakeup() replaced
by condvars, and switched most code from spl* to mutexes (separate
wd(4) and ata channel lock).
Introduced new option WD_CHAOS_MONKEY to facilitate testing of error
handling, fixed several uncovered issues. Also fixed several problems
with kernel dump to wd(4) disk.
Tested with ahcisata(4), mvsata(4), siisata(4), piixide(4) on amd64,
with and without port multiplier, both disk and ATAPI devices; other
drivers and archs mechanically adjusted and compile-tested. NCQ is
supported for ahcisata(4) and siisata(4) for any controller, for
mvsata(4) only Gen IIe ones for now. Also enabled ATAPI support in
mvsata(4).
Thanks to Matt Thomas for initial ATA infrastructure patch, and
Jonathan A.Kollasch for siisata(4) NCQ changes and general testing.
Also fixes PR kern/43169 (wd(4)); and PR kern/11811, PR kern/47041,
PR kern/51979 (kernel dump)
2017-10-07 19:05:31 +03:00
|
|
|
if (WD_USE_NCQ(wd) || (wd->drvp->drive_flags & ATA_DRIVE_WFUA))
|
|
|
|
*bitsp |= DKCACHE_FUA;
|
|
|
|
|
2003-04-26 13:54:15 +04:00
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2020-09-27 19:58:11 +03:00
|
|
|
|
|
|
|
static int
|
|
|
|
wd_check_error(const struct dk_softc *dksc, const struct ata_xfer *xfer,
|
|
|
|
const char *func)
|
|
|
|
{
|
|
|
|
static const char at_errbits[] = "\20\10ERROR\11TIMEOU\12DF";
|
|
|
|
|
|
|
|
int flags = xfer->c_ata_c.flags;
|
|
|
|
|
|
|
|
if ((flags & AT_ERROR) != 0 && xfer->c_ata_c.r_error == WDCE_ABRT) {
|
|
|
|
/* command not supported */
|
|
|
|
aprint_debug_dev(dksc->sc_dev, "%s: not supported\n", func);
|
|
|
|
return ENODEV;
|
|
|
|
}
|
|
|
|
if (flags & (AT_ERROR | AT_TIMEOU | AT_DF)) {
|
|
|
|
char sbuf[sizeof(at_errbits) + 64];
|
|
|
|
snprintb(sbuf, sizeof(sbuf), at_errbits, flags);
|
|
|
|
aprint_error_dev(dksc->sc_dev, "%s: status=%s\n", func, sbuf);
|
|
|
|
return EIO;
|
|
|
|
}
|
|
|
|
return 0;
|
|
|
|
}
|
2004-08-10 06:33:58 +04:00
|
|
|
|
2003-04-26 13:54:15 +04:00
|
|
|
int
|
2003-07-11 19:33:13 +04:00
|
|
|
wd_setcache(struct wd_softc *wd, int bits)
|
2003-04-26 13:54:15 +04:00
|
|
|
{
|
2017-11-01 22:34:45 +03:00
|
|
|
struct dk_softc *dksc = &wd->sc_dksc;
|
2003-04-26 13:54:15 +04:00
|
|
|
struct ataparams params;
|
Merge support for SATA NCQ (Native Command Queueing) from jdolecek-ncq branch
ATA subsystem was changed to support several outstanding commands, and use
NCQ xfers if supported by both the controller and the disk, including NCQ
error recovery. Set NCQ high priority for BPRIO_TIMECRITICAL xfers
if supported. Added FUA support.
Done some work towards MP-safe, all ATA code tsleep()/wakeup() replaced
by condvars, and switched most code from spl* to mutexes (separate
wd(4) and ata channel lock).
Introduced new option WD_CHAOS_MONKEY to facilitate testing of error
handling, fixed several uncovered issues. Also fixed several problems
with kernel dump to wd(4) disk.
Tested with ahcisata(4), mvsata(4), siisata(4), piixide(4) on amd64,
with and without port multiplier, both disk and ATAPI devices; other
drivers and archs mechanically adjusted and compile-tested. NCQ is
supported for ahcisata(4) and siisata(4) for any controller, for
mvsata(4) only Gen IIe ones for now. Also enabled ATAPI support in
mvsata(4).
Thanks to Matt Thomas for initial ATA infrastructure patch, and
Jonathan A.Kollasch for siisata(4) NCQ changes and general testing.
Also fixes PR kern/43169 (wd(4)); and PR kern/11811, PR kern/47041,
PR kern/51979 (kernel dump)
2017-10-07 19:05:31 +03:00
|
|
|
struct ata_xfer *xfer;
|
|
|
|
int error;
|
2003-04-26 13:54:15 +04:00
|
|
|
|
2020-04-13 13:49:34 +03:00
|
|
|
if (wd_get_params(wd, ¶ms) != 0)
|
2003-04-26 13:54:15 +04:00
|
|
|
return EIO;
|
|
|
|
|
|
|
|
if (params.atap_cmd_set1 == 0x0000 ||
|
2003-04-27 18:33:20 +04:00
|
|
|
params.atap_cmd_set1 == 0xffff ||
|
2003-04-26 13:54:15 +04:00
|
|
|
(params.atap_cmd_set1 & WDC_CMD1_CACHE) == 0)
|
|
|
|
return EOPNOTSUPP;
|
|
|
|
|
2003-04-27 18:27:36 +04:00
|
|
|
if ((bits & DKCACHE_READ) == 0 ||
|
|
|
|
(bits & DKCACHE_SAVE) != 0)
|
2003-04-26 13:54:15 +04:00
|
|
|
return EOPNOTSUPP;
|
|
|
|
|
2018-10-22 23:13:47 +03:00
|
|
|
xfer = ata_get_xfer(wd->drvp->chnl_softc, true);
|
Merge support for SATA NCQ (Native Command Queueing) from jdolecek-ncq branch
ATA subsystem was changed to support several outstanding commands, and use
NCQ xfers if supported by both the controller and the disk, including NCQ
error recovery. Set NCQ high priority for BPRIO_TIMECRITICAL xfers
if supported. Added FUA support.
Done some work towards MP-safe, all ATA code tsleep()/wakeup() replaced
by condvars, and switched most code from spl* to mutexes (separate
wd(4) and ata channel lock).
Introduced new option WD_CHAOS_MONKEY to facilitate testing of error
handling, fixed several uncovered issues. Also fixed several problems
with kernel dump to wd(4) disk.
Tested with ahcisata(4), mvsata(4), siisata(4), piixide(4) on amd64,
with and without port multiplier, both disk and ATAPI devices; other
drivers and archs mechanically adjusted and compile-tested. NCQ is
supported for ahcisata(4) and siisata(4) for any controller, for
mvsata(4) only Gen IIe ones for now. Also enabled ATAPI support in
mvsata(4).
Thanks to Matt Thomas for initial ATA infrastructure patch, and
Jonathan A.Kollasch for siisata(4) NCQ changes and general testing.
Also fixes PR kern/43169 (wd(4)); and PR kern/11811, PR kern/47041,
PR kern/51979 (kernel dump)
2017-10-07 19:05:31 +03:00
|
|
|
|
|
|
|
xfer->c_ata_c.r_command = SET_FEATURES;
|
|
|
|
xfer->c_ata_c.r_st_bmask = 0;
|
|
|
|
xfer->c_ata_c.r_st_pmask = 0;
|
|
|
|
xfer->c_ata_c.timeout = 30000; /* 30s timeout */
|
|
|
|
xfer->c_ata_c.flags = AT_WAIT;
|
2003-04-26 13:54:15 +04:00
|
|
|
if (bits & DKCACHE_WRITE)
|
Merge support for SATA NCQ (Native Command Queueing) from jdolecek-ncq branch
ATA subsystem was changed to support several outstanding commands, and use
NCQ xfers if supported by both the controller and the disk, including NCQ
error recovery. Set NCQ high priority for BPRIO_TIMECRITICAL xfers
if supported. Added FUA support.
Done some work towards MP-safe, all ATA code tsleep()/wakeup() replaced
by condvars, and switched most code from spl* to mutexes (separate
wd(4) and ata channel lock).
Introduced new option WD_CHAOS_MONKEY to facilitate testing of error
handling, fixed several uncovered issues. Also fixed several problems
with kernel dump to wd(4) disk.
Tested with ahcisata(4), mvsata(4), siisata(4), piixide(4) on amd64,
with and without port multiplier, both disk and ATAPI devices; other
drivers and archs mechanically adjusted and compile-tested. NCQ is
supported for ahcisata(4) and siisata(4) for any controller, for
mvsata(4) only Gen IIe ones for now. Also enabled ATAPI support in
mvsata(4).
Thanks to Matt Thomas for initial ATA infrastructure patch, and
Jonathan A.Kollasch for siisata(4) NCQ changes and general testing.
Also fixes PR kern/43169 (wd(4)); and PR kern/11811, PR kern/47041,
PR kern/51979 (kernel dump)
2017-10-07 19:05:31 +03:00
|
|
|
xfer->c_ata_c.r_features = WDSF_WRITE_CACHE_EN;
|
2003-04-26 13:54:15 +04:00
|
|
|
else
|
Merge support for SATA NCQ (Native Command Queueing) from jdolecek-ncq branch
ATA subsystem was changed to support several outstanding commands, and use
NCQ xfers if supported by both the controller and the disk, including NCQ
error recovery. Set NCQ high priority for BPRIO_TIMECRITICAL xfers
if supported. Added FUA support.
Done some work towards MP-safe, all ATA code tsleep()/wakeup() replaced
by condvars, and switched most code from spl* to mutexes (separate
wd(4) and ata channel lock).
Introduced new option WD_CHAOS_MONKEY to facilitate testing of error
handling, fixed several uncovered issues. Also fixed several problems
with kernel dump to wd(4) disk.
Tested with ahcisata(4), mvsata(4), siisata(4), piixide(4) on amd64,
with and without port multiplier, both disk and ATAPI devices; other
drivers and archs mechanically adjusted and compile-tested. NCQ is
supported for ahcisata(4) and siisata(4) for any controller, for
mvsata(4) only Gen IIe ones for now. Also enabled ATAPI support in
mvsata(4).
Thanks to Matt Thomas for initial ATA infrastructure patch, and
Jonathan A.Kollasch for siisata(4) NCQ changes and general testing.
Also fixes PR kern/43169 (wd(4)); and PR kern/11811, PR kern/47041,
PR kern/51979 (kernel dump)
2017-10-07 19:05:31 +03:00
|
|
|
xfer->c_ata_c.r_features = WDSF_WRITE_CACHE_DS;
|
2020-04-13 13:49:34 +03:00
|
|
|
|
|
|
|
wd->atabus->ata_exec_command(wd->drvp, xfer);
|
|
|
|
ata_wait_cmd(wd->drvp->chnl_softc, xfer);
|
Merge support for SATA NCQ (Native Command Queueing) from jdolecek-ncq branch
ATA subsystem was changed to support several outstanding commands, and use
NCQ xfers if supported by both the controller and the disk, including NCQ
error recovery. Set NCQ high priority for BPRIO_TIMECRITICAL xfers
if supported. Added FUA support.
Done some work towards MP-safe, all ATA code tsleep()/wakeup() replaced
by condvars, and switched most code from spl* to mutexes (separate
wd(4) and ata channel lock).
Introduced new option WD_CHAOS_MONKEY to facilitate testing of error
handling, fixed several uncovered issues. Also fixed several problems
with kernel dump to wd(4) disk.
Tested with ahcisata(4), mvsata(4), siisata(4), piixide(4) on amd64,
with and without port multiplier, both disk and ATAPI devices; other
drivers and archs mechanically adjusted and compile-tested. NCQ is
supported for ahcisata(4) and siisata(4) for any controller, for
mvsata(4) only Gen IIe ones for now. Also enabled ATAPI support in
mvsata(4).
Thanks to Matt Thomas for initial ATA infrastructure patch, and
Jonathan A.Kollasch for siisata(4) NCQ changes and general testing.
Also fixes PR kern/43169 (wd(4)); and PR kern/11811, PR kern/47041,
PR kern/51979 (kernel dump)
2017-10-07 19:05:31 +03:00
|
|
|
|
2020-09-27 19:58:11 +03:00
|
|
|
error = wd_check_error(dksc, xfer, __func__);
|
Merge support for SATA NCQ (Native Command Queueing) from jdolecek-ncq branch
ATA subsystem was changed to support several outstanding commands, and use
NCQ xfers if supported by both the controller and the disk, including NCQ
error recovery. Set NCQ high priority for BPRIO_TIMECRITICAL xfers
if supported. Added FUA support.
Done some work towards MP-safe, all ATA code tsleep()/wakeup() replaced
by condvars, and switched most code from spl* to mutexes (separate
wd(4) and ata channel lock).
Introduced new option WD_CHAOS_MONKEY to facilitate testing of error
handling, fixed several uncovered issues. Also fixed several problems
with kernel dump to wd(4) disk.
Tested with ahcisata(4), mvsata(4), siisata(4), piixide(4) on amd64,
with and without port multiplier, both disk and ATAPI devices; other
drivers and archs mechanically adjusted and compile-tested. NCQ is
supported for ahcisata(4) and siisata(4) for any controller, for
mvsata(4) only Gen IIe ones for now. Also enabled ATAPI support in
mvsata(4).
Thanks to Matt Thomas for initial ATA infrastructure patch, and
Jonathan A.Kollasch for siisata(4) NCQ changes and general testing.
Also fixes PR kern/43169 (wd(4)); and PR kern/11811, PR kern/47041,
PR kern/51979 (kernel dump)
2017-10-07 19:05:31 +03:00
|
|
|
ata_free_xfer(wd->drvp->chnl_softc, xfer);
|
|
|
|
return error;
|
2004-08-10 06:33:58 +04:00
|
|
|
}
|
|
|
|
|
2007-12-09 23:27:42 +03:00
|
|
|
static int
|
2004-08-10 06:33:58 +04:00
|
|
|
wd_standby(struct wd_softc *wd, int flags)
|
|
|
|
{
|
2017-11-01 22:34:45 +03:00
|
|
|
struct dk_softc *dksc = &wd->sc_dksc;
|
Merge support for SATA NCQ (Native Command Queueing) from jdolecek-ncq branch
ATA subsystem was changed to support several outstanding commands, and use
NCQ xfers if supported by both the controller and the disk, including NCQ
error recovery. Set NCQ high priority for BPRIO_TIMECRITICAL xfers
if supported. Added FUA support.
Done some work towards MP-safe, all ATA code tsleep()/wakeup() replaced
by condvars, and switched most code from spl* to mutexes (separate
wd(4) and ata channel lock).
Introduced new option WD_CHAOS_MONKEY to facilitate testing of error
handling, fixed several uncovered issues. Also fixed several problems
with kernel dump to wd(4) disk.
Tested with ahcisata(4), mvsata(4), siisata(4), piixide(4) on amd64,
with and without port multiplier, both disk and ATAPI devices; other
drivers and archs mechanically adjusted and compile-tested. NCQ is
supported for ahcisata(4) and siisata(4) for any controller, for
mvsata(4) only Gen IIe ones for now. Also enabled ATAPI support in
mvsata(4).
Thanks to Matt Thomas for initial ATA infrastructure patch, and
Jonathan A.Kollasch for siisata(4) NCQ changes and general testing.
Also fixes PR kern/43169 (wd(4)); and PR kern/11811, PR kern/47041,
PR kern/51979 (kernel dump)
2017-10-07 19:05:31 +03:00
|
|
|
struct ata_xfer *xfer;
|
|
|
|
int error;
|
|
|
|
|
2019-03-19 09:47:12 +03:00
|
|
|
aprint_debug_dev(dksc->sc_dev, "standby immediate\n");
|
2018-10-22 23:13:47 +03:00
|
|
|
xfer = ata_get_xfer(wd->drvp->chnl_softc, true);
|
Merge support for SATA NCQ (Native Command Queueing) from jdolecek-ncq branch
ATA subsystem was changed to support several outstanding commands, and use
NCQ xfers if supported by both the controller and the disk, including NCQ
error recovery. Set NCQ high priority for BPRIO_TIMECRITICAL xfers
if supported. Added FUA support.
Done some work towards MP-safe, all ATA code tsleep()/wakeup() replaced
by condvars, and switched most code from spl* to mutexes (separate
wd(4) and ata channel lock).
Introduced new option WD_CHAOS_MONKEY to facilitate testing of error
handling, fixed several uncovered issues. Also fixed several problems
with kernel dump to wd(4) disk.
Tested with ahcisata(4), mvsata(4), siisata(4), piixide(4) on amd64,
with and without port multiplier, both disk and ATAPI devices; other
drivers and archs mechanically adjusted and compile-tested. NCQ is
supported for ahcisata(4) and siisata(4) for any controller, for
mvsata(4) only Gen IIe ones for now. Also enabled ATAPI support in
mvsata(4).
Thanks to Matt Thomas for initial ATA infrastructure patch, and
Jonathan A.Kollasch for siisata(4) NCQ changes and general testing.
Also fixes PR kern/43169 (wd(4)); and PR kern/11811, PR kern/47041,
PR kern/51979 (kernel dump)
2017-10-07 19:05:31 +03:00
|
|
|
|
|
|
|
xfer->c_ata_c.r_command = WDCC_STANDBY_IMMED;
|
|
|
|
xfer->c_ata_c.r_st_bmask = WDCS_DRDY;
|
|
|
|
xfer->c_ata_c.r_st_pmask = WDCS_DRDY;
|
|
|
|
xfer->c_ata_c.flags = flags;
|
|
|
|
xfer->c_ata_c.timeout = 30000; /* 30s timeout */
|
2020-04-13 13:49:34 +03:00
|
|
|
|
|
|
|
wd->atabus->ata_exec_command(wd->drvp, xfer);
|
|
|
|
ata_wait_cmd(wd->drvp->chnl_softc, xfer);
|
|
|
|
|
2020-09-27 19:58:11 +03:00
|
|
|
error = wd_check_error(dksc, xfer, __func__);
|
Merge support for SATA NCQ (Native Command Queueing) from jdolecek-ncq branch
ATA subsystem was changed to support several outstanding commands, and use
NCQ xfers if supported by both the controller and the disk, including NCQ
error recovery. Set NCQ high priority for BPRIO_TIMECRITICAL xfers
if supported. Added FUA support.
Done some work towards MP-safe, all ATA code tsleep()/wakeup() replaced
by condvars, and switched most code from spl* to mutexes (separate
wd(4) and ata channel lock).
Introduced new option WD_CHAOS_MONKEY to facilitate testing of error
handling, fixed several uncovered issues. Also fixed several problems
with kernel dump to wd(4) disk.
Tested with ahcisata(4), mvsata(4), siisata(4), piixide(4) on amd64,
with and without port multiplier, both disk and ATAPI devices; other
drivers and archs mechanically adjusted and compile-tested. NCQ is
supported for ahcisata(4) and siisata(4) for any controller, for
mvsata(4) only Gen IIe ones for now. Also enabled ATAPI support in
mvsata(4).
Thanks to Matt Thomas for initial ATA infrastructure patch, and
Jonathan A.Kollasch for siisata(4) NCQ changes and general testing.
Also fixes PR kern/43169 (wd(4)); and PR kern/11811, PR kern/47041,
PR kern/51979 (kernel dump)
2017-10-07 19:05:31 +03:00
|
|
|
ata_free_xfer(wd->drvp->chnl_softc, xfer);
|
|
|
|
return error;
|
2003-04-26 13:54:15 +04:00
|
|
|
}
|
|
|
|
|
2004-05-22 00:35:53 +04:00
|
|
|
int
|
2020-09-27 19:58:11 +03:00
|
|
|
wd_flushcache(struct wd_softc *wd, int flags)
|
1999-01-18 23:06:24 +03:00
|
|
|
{
|
2017-11-01 22:34:45 +03:00
|
|
|
struct dk_softc *dksc = &wd->sc_dksc;
|
Merge support for SATA NCQ (Native Command Queueing) from jdolecek-ncq branch
ATA subsystem was changed to support several outstanding commands, and use
NCQ xfers if supported by both the controller and the disk, including NCQ
error recovery. Set NCQ high priority for BPRIO_TIMECRITICAL xfers
if supported. Added FUA support.
Done some work towards MP-safe, all ATA code tsleep()/wakeup() replaced
by condvars, and switched most code from spl* to mutexes (separate
wd(4) and ata channel lock).
Introduced new option WD_CHAOS_MONKEY to facilitate testing of error
handling, fixed several uncovered issues. Also fixed several problems
with kernel dump to wd(4) disk.
Tested with ahcisata(4), mvsata(4), siisata(4), piixide(4) on amd64,
with and without port multiplier, both disk and ATAPI devices; other
drivers and archs mechanically adjusted and compile-tested. NCQ is
supported for ahcisata(4) and siisata(4) for any controller, for
mvsata(4) only Gen IIe ones for now. Also enabled ATAPI support in
mvsata(4).
Thanks to Matt Thomas for initial ATA infrastructure patch, and
Jonathan A.Kollasch for siisata(4) NCQ changes and general testing.
Also fixes PR kern/43169 (wd(4)); and PR kern/11811, PR kern/47041,
PR kern/51979 (kernel dump)
2017-10-07 19:05:31 +03:00
|
|
|
struct ata_xfer *xfer;
|
|
|
|
int error;
|
1999-01-18 23:06:24 +03:00
|
|
|
|
2004-11-19 01:14:53 +03:00
|
|
|
/*
|
|
|
|
* WDCC_FLUSHCACHE is here since ATA-4, but some drives report
|
|
|
|
* only ATA-2 and still support it.
|
|
|
|
*/
|
|
|
|
if (wd->drvp->ata_vers < 4 &&
|
|
|
|
((wd->sc_params.atap_cmd_set2 & WDC_CMD2_FC) == 0 ||
|
|
|
|
wd->sc_params.atap_cmd_set2 == 0xffff))
|
2004-05-22 00:35:53 +04:00
|
|
|
return ENODEV;
|
Merge support for SATA NCQ (Native Command Queueing) from jdolecek-ncq branch
ATA subsystem was changed to support several outstanding commands, and use
NCQ xfers if supported by both the controller and the disk, including NCQ
error recovery. Set NCQ high priority for BPRIO_TIMECRITICAL xfers
if supported. Added FUA support.
Done some work towards MP-safe, all ATA code tsleep()/wakeup() replaced
by condvars, and switched most code from spl* to mutexes (separate
wd(4) and ata channel lock).
Introduced new option WD_CHAOS_MONKEY to facilitate testing of error
handling, fixed several uncovered issues. Also fixed several problems
with kernel dump to wd(4) disk.
Tested with ahcisata(4), mvsata(4), siisata(4), piixide(4) on amd64,
with and without port multiplier, both disk and ATAPI devices; other
drivers and archs mechanically adjusted and compile-tested. NCQ is
supported for ahcisata(4) and siisata(4) for any controller, for
mvsata(4) only Gen IIe ones for now. Also enabled ATAPI support in
mvsata(4).
Thanks to Matt Thomas for initial ATA infrastructure patch, and
Jonathan A.Kollasch for siisata(4) NCQ changes and general testing.
Also fixes PR kern/43169 (wd(4)); and PR kern/11811, PR kern/47041,
PR kern/51979 (kernel dump)
2017-10-07 19:05:31 +03:00
|
|
|
|
2018-10-22 23:13:47 +03:00
|
|
|
xfer = ata_get_xfer(wd->drvp->chnl_softc, true);
|
Merge support for SATA NCQ (Native Command Queueing) from jdolecek-ncq branch
ATA subsystem was changed to support several outstanding commands, and use
NCQ xfers if supported by both the controller and the disk, including NCQ
error recovery. Set NCQ high priority for BPRIO_TIMECRITICAL xfers
if supported. Added FUA support.
Done some work towards MP-safe, all ATA code tsleep()/wakeup() replaced
by condvars, and switched most code from spl* to mutexes (separate
wd(4) and ata channel lock).
Introduced new option WD_CHAOS_MONKEY to facilitate testing of error
handling, fixed several uncovered issues. Also fixed several problems
with kernel dump to wd(4) disk.
Tested with ahcisata(4), mvsata(4), siisata(4), piixide(4) on amd64,
with and without port multiplier, both disk and ATAPI devices; other
drivers and archs mechanically adjusted and compile-tested. NCQ is
supported for ahcisata(4) and siisata(4) for any controller, for
mvsata(4) only Gen IIe ones for now. Also enabled ATAPI support in
mvsata(4).
Thanks to Matt Thomas for initial ATA infrastructure patch, and
Jonathan A.Kollasch for siisata(4) NCQ changes and general testing.
Also fixes PR kern/43169 (wd(4)); and PR kern/11811, PR kern/47041,
PR kern/51979 (kernel dump)
2017-10-07 19:05:31 +03:00
|
|
|
|
2004-05-04 00:11:40 +04:00
|
|
|
if ((wd->sc_params.atap_cmd2_en & ATA_CMD2_LBA48) != 0 &&
|
2012-07-22 22:42:11 +04:00
|
|
|
(wd->sc_params.atap_cmd2_en & ATA_CMD2_FCE) != 0) {
|
Merge support for SATA NCQ (Native Command Queueing) from jdolecek-ncq branch
ATA subsystem was changed to support several outstanding commands, and use
NCQ xfers if supported by both the controller and the disk, including NCQ
error recovery. Set NCQ high priority for BPRIO_TIMECRITICAL xfers
if supported. Added FUA support.
Done some work towards MP-safe, all ATA code tsleep()/wakeup() replaced
by condvars, and switched most code from spl* to mutexes (separate
wd(4) and ata channel lock).
Introduced new option WD_CHAOS_MONKEY to facilitate testing of error
handling, fixed several uncovered issues. Also fixed several problems
with kernel dump to wd(4) disk.
Tested with ahcisata(4), mvsata(4), siisata(4), piixide(4) on amd64,
with and without port multiplier, both disk and ATAPI devices; other
drivers and archs mechanically adjusted and compile-tested. NCQ is
supported for ahcisata(4) and siisata(4) for any controller, for
mvsata(4) only Gen IIe ones for now. Also enabled ATAPI support in
mvsata(4).
Thanks to Matt Thomas for initial ATA infrastructure patch, and
Jonathan A.Kollasch for siisata(4) NCQ changes and general testing.
Also fixes PR kern/43169 (wd(4)); and PR kern/11811, PR kern/47041,
PR kern/51979 (kernel dump)
2017-10-07 19:05:31 +03:00
|
|
|
xfer->c_ata_c.r_command = WDCC_FLUSHCACHE_EXT;
|
2012-07-22 22:42:11 +04:00
|
|
|
flags |= AT_LBA48;
|
|
|
|
} else
|
Merge support for SATA NCQ (Native Command Queueing) from jdolecek-ncq branch
ATA subsystem was changed to support several outstanding commands, and use
NCQ xfers if supported by both the controller and the disk, including NCQ
error recovery. Set NCQ high priority for BPRIO_TIMECRITICAL xfers
if supported. Added FUA support.
Done some work towards MP-safe, all ATA code tsleep()/wakeup() replaced
by condvars, and switched most code from spl* to mutexes (separate
wd(4) and ata channel lock).
Introduced new option WD_CHAOS_MONKEY to facilitate testing of error
handling, fixed several uncovered issues. Also fixed several problems
with kernel dump to wd(4) disk.
Tested with ahcisata(4), mvsata(4), siisata(4), piixide(4) on amd64,
with and without port multiplier, both disk and ATAPI devices; other
drivers and archs mechanically adjusted and compile-tested. NCQ is
supported for ahcisata(4) and siisata(4) for any controller, for
mvsata(4) only Gen IIe ones for now. Also enabled ATAPI support in
mvsata(4).
Thanks to Matt Thomas for initial ATA infrastructure patch, and
Jonathan A.Kollasch for siisata(4) NCQ changes and general testing.
Also fixes PR kern/43169 (wd(4)); and PR kern/11811, PR kern/47041,
PR kern/51979 (kernel dump)
2017-10-07 19:05:31 +03:00
|
|
|
xfer->c_ata_c.r_command = WDCC_FLUSHCACHE;
|
|
|
|
xfer->c_ata_c.r_st_bmask = WDCS_DRDY;
|
|
|
|
xfer->c_ata_c.r_st_pmask = WDCS_DRDY;
|
|
|
|
xfer->c_ata_c.flags = flags | AT_READREG;
|
|
|
|
xfer->c_ata_c.timeout = 300000; /* 5m timeout */
|
2020-04-13 13:49:34 +03:00
|
|
|
|
|
|
|
wd->atabus->ata_exec_command(wd->drvp, xfer);
|
|
|
|
ata_wait_cmd(wd->drvp->chnl_softc, xfer);
|
|
|
|
|
2020-09-27 19:58:11 +03:00
|
|
|
error = wd_check_error(dksc, xfer, __func__);
|
2019-04-07 16:00:00 +03:00
|
|
|
wd->sc_flags &= ~WDF_DIRTY;
|
Merge support for SATA NCQ (Native Command Queueing) from jdolecek-ncq branch
ATA subsystem was changed to support several outstanding commands, and use
NCQ xfers if supported by both the controller and the disk, including NCQ
error recovery. Set NCQ high priority for BPRIO_TIMECRITICAL xfers
if supported. Added FUA support.
Done some work towards MP-safe, all ATA code tsleep()/wakeup() replaced
by condvars, and switched most code from spl* to mutexes (separate
wd(4) and ata channel lock).
Introduced new option WD_CHAOS_MONKEY to facilitate testing of error
handling, fixed several uncovered issues. Also fixed several problems
with kernel dump to wd(4) disk.
Tested with ahcisata(4), mvsata(4), siisata(4), piixide(4) on amd64,
with and without port multiplier, both disk and ATAPI devices; other
drivers and archs mechanically adjusted and compile-tested. NCQ is
supported for ahcisata(4) and siisata(4) for any controller, for
mvsata(4) only Gen IIe ones for now. Also enabled ATAPI support in
mvsata(4).
Thanks to Matt Thomas for initial ATA infrastructure patch, and
Jonathan A.Kollasch for siisata(4) NCQ changes and general testing.
Also fixes PR kern/43169 (wd(4)); and PR kern/11811, PR kern/47041,
PR kern/51979 (kernel dump)
2017-10-07 19:05:31 +03:00
|
|
|
ata_free_xfer(wd->drvp->chnl_softc, xfer);
|
|
|
|
return error;
|
1999-01-18 23:06:24 +03:00
|
|
|
}
|
|
|
|
|
2018-10-24 22:46:44 +03:00
|
|
|
/*
|
|
|
|
* Execute TRIM command, assumes sleep context.
|
|
|
|
*/
|
2017-11-01 22:34:45 +03:00
|
|
|
static int
|
|
|
|
wd_trim(struct wd_softc *wd, daddr_t bno, long size)
|
2012-10-19 21:09:06 +04:00
|
|
|
{
|
2017-11-01 22:34:45 +03:00
|
|
|
struct dk_softc *dksc = &wd->sc_dksc;
|
Merge support for SATA NCQ (Native Command Queueing) from jdolecek-ncq branch
ATA subsystem was changed to support several outstanding commands, and use
NCQ xfers if supported by both the controller and the disk, including NCQ
error recovery. Set NCQ high priority for BPRIO_TIMECRITICAL xfers
if supported. Added FUA support.
Done some work towards MP-safe, all ATA code tsleep()/wakeup() replaced
by condvars, and switched most code from spl* to mutexes (separate
wd(4) and ata channel lock).
Introduced new option WD_CHAOS_MONKEY to facilitate testing of error
handling, fixed several uncovered issues. Also fixed several problems
with kernel dump to wd(4) disk.
Tested with ahcisata(4), mvsata(4), siisata(4), piixide(4) on amd64,
with and without port multiplier, both disk and ATAPI devices; other
drivers and archs mechanically adjusted and compile-tested. NCQ is
supported for ahcisata(4) and siisata(4) for any controller, for
mvsata(4) only Gen IIe ones for now. Also enabled ATAPI support in
mvsata(4).
Thanks to Matt Thomas for initial ATA infrastructure patch, and
Jonathan A.Kollasch for siisata(4) NCQ changes and general testing.
Also fixes PR kern/43169 (wd(4)); and PR kern/11811, PR kern/47041,
PR kern/51979 (kernel dump)
2017-10-07 19:05:31 +03:00
|
|
|
struct ata_xfer *xfer;
|
|
|
|
int error;
|
2012-10-19 21:09:06 +04:00
|
|
|
unsigned char *req;
|
|
|
|
|
2018-10-22 23:13:47 +03:00
|
|
|
xfer = ata_get_xfer(wd->drvp->chnl_softc, true);
|
Merge support for SATA NCQ (Native Command Queueing) from jdolecek-ncq branch
ATA subsystem was changed to support several outstanding commands, and use
NCQ xfers if supported by both the controller and the disk, including NCQ
error recovery. Set NCQ high priority for BPRIO_TIMECRITICAL xfers
if supported. Added FUA support.
Done some work towards MP-safe, all ATA code tsleep()/wakeup() replaced
by condvars, and switched most code from spl* to mutexes (separate
wd(4) and ata channel lock).
Introduced new option WD_CHAOS_MONKEY to facilitate testing of error
handling, fixed several uncovered issues. Also fixed several problems
with kernel dump to wd(4) disk.
Tested with ahcisata(4), mvsata(4), siisata(4), piixide(4) on amd64,
with and without port multiplier, both disk and ATAPI devices; other
drivers and archs mechanically adjusted and compile-tested. NCQ is
supported for ahcisata(4) and siisata(4) for any controller, for
mvsata(4) only Gen IIe ones for now. Also enabled ATAPI support in
mvsata(4).
Thanks to Matt Thomas for initial ATA infrastructure patch, and
Jonathan A.Kollasch for siisata(4) NCQ changes and general testing.
Also fixes PR kern/43169 (wd(4)); and PR kern/11811, PR kern/47041,
PR kern/51979 (kernel dump)
2017-10-07 19:05:31 +03:00
|
|
|
|
2012-10-19 21:09:06 +04:00
|
|
|
req = kmem_zalloc(512, KM_SLEEP);
|
|
|
|
req[0] = bno & 0xff;
|
|
|
|
req[1] = (bno >> 8) & 0xff;
|
|
|
|
req[2] = (bno >> 16) & 0xff;
|
|
|
|
req[3] = (bno >> 24) & 0xff;
|
|
|
|
req[4] = (bno >> 32) & 0xff;
|
|
|
|
req[5] = (bno >> 40) & 0xff;
|
2014-07-25 12:22:08 +04:00
|
|
|
req[6] = size & 0xff;
|
|
|
|
req[7] = (size >> 8) & 0xff;
|
2012-10-19 21:09:06 +04:00
|
|
|
|
2018-10-24 22:46:44 +03:00
|
|
|
/*
|
|
|
|
* XXX We could possibly use NCQ TRIM, which supports executing
|
|
|
|
* this command concurrently. It would need some investigation, some
|
|
|
|
* early or not so early disk firmware caused data loss with NCQ TRIM.
|
|
|
|
* atastart() et.al would need to be adjusted to allow and support
|
|
|
|
* running several non-I/O ATA commands in parallel.
|
|
|
|
*/
|
|
|
|
|
Merge support for SATA NCQ (Native Command Queueing) from jdolecek-ncq branch
ATA subsystem was changed to support several outstanding commands, and use
NCQ xfers if supported by both the controller and the disk, including NCQ
error recovery. Set NCQ high priority for BPRIO_TIMECRITICAL xfers
if supported. Added FUA support.
Done some work towards MP-safe, all ATA code tsleep()/wakeup() replaced
by condvars, and switched most code from spl* to mutexes (separate
wd(4) and ata channel lock).
Introduced new option WD_CHAOS_MONKEY to facilitate testing of error
handling, fixed several uncovered issues. Also fixed several problems
with kernel dump to wd(4) disk.
Tested with ahcisata(4), mvsata(4), siisata(4), piixide(4) on amd64,
with and without port multiplier, both disk and ATAPI devices; other
drivers and archs mechanically adjusted and compile-tested. NCQ is
supported for ahcisata(4) and siisata(4) for any controller, for
mvsata(4) only Gen IIe ones for now. Also enabled ATAPI support in
mvsata(4).
Thanks to Matt Thomas for initial ATA infrastructure patch, and
Jonathan A.Kollasch for siisata(4) NCQ changes and general testing.
Also fixes PR kern/43169 (wd(4)); and PR kern/11811, PR kern/47041,
PR kern/51979 (kernel dump)
2017-10-07 19:05:31 +03:00
|
|
|
xfer->c_ata_c.r_command = ATA_DATA_SET_MANAGEMENT;
|
|
|
|
xfer->c_ata_c.r_count = 1;
|
|
|
|
xfer->c_ata_c.r_features = ATA_SUPPORT_DSM_TRIM;
|
|
|
|
xfer->c_ata_c.r_st_bmask = WDCS_DRDY;
|
|
|
|
xfer->c_ata_c.r_st_pmask = WDCS_DRDY;
|
|
|
|
xfer->c_ata_c.timeout = 30000; /* 30s timeout */
|
|
|
|
xfer->c_ata_c.data = req;
|
|
|
|
xfer->c_ata_c.bcount = 512;
|
|
|
|
xfer->c_ata_c.flags |= AT_WRITE | AT_WAIT;
|
2020-04-13 13:49:34 +03:00
|
|
|
|
|
|
|
wd->atabus->ata_exec_command(wd->drvp, xfer);
|
|
|
|
ata_wait_cmd(wd->drvp->chnl_softc, xfer);
|
|
|
|
|
2012-10-19 21:09:06 +04:00
|
|
|
kmem_free(req, 512);
|
2020-09-27 19:58:11 +03:00
|
|
|
error = wd_check_error(dksc, xfer, __func__);
|
Merge support for SATA NCQ (Native Command Queueing) from jdolecek-ncq branch
ATA subsystem was changed to support several outstanding commands, and use
NCQ xfers if supported by both the controller and the disk, including NCQ
error recovery. Set NCQ high priority for BPRIO_TIMECRITICAL xfers
if supported. Added FUA support.
Done some work towards MP-safe, all ATA code tsleep()/wakeup() replaced
by condvars, and switched most code from spl* to mutexes (separate
wd(4) and ata channel lock).
Introduced new option WD_CHAOS_MONKEY to facilitate testing of error
handling, fixed several uncovered issues. Also fixed several problems
with kernel dump to wd(4) disk.
Tested with ahcisata(4), mvsata(4), siisata(4), piixide(4) on amd64,
with and without port multiplier, both disk and ATAPI devices; other
drivers and archs mechanically adjusted and compile-tested. NCQ is
supported for ahcisata(4) and siisata(4) for any controller, for
mvsata(4) only Gen IIe ones for now. Also enabled ATAPI support in
mvsata(4).
Thanks to Matt Thomas for initial ATA infrastructure patch, and
Jonathan A.Kollasch for siisata(4) NCQ changes and general testing.
Also fixes PR kern/43169 (wd(4)); and PR kern/11811, PR kern/47041,
PR kern/51979 (kernel dump)
2017-10-07 19:05:31 +03:00
|
|
|
ata_free_xfer(wd->drvp->chnl_softc, xfer);
|
|
|
|
return error;
|
2012-10-19 21:09:06 +04:00
|
|
|
}
|
|
|
|
|
2008-02-28 17:40:17 +03:00
|
|
|
bool
|
|
|
|
wd_shutdown(device_t dev, int how)
|
2008-02-22 00:52:06 +03:00
|
|
|
{
|
2008-02-28 17:40:17 +03:00
|
|
|
struct wd_softc *wd = device_private(dev);
|
2009-02-06 16:43:11 +03:00
|
|
|
|
|
|
|
/* the adapter needs to be enabled */
|
|
|
|
if (wd->atabus->ata_addref(wd->drvp))
|
|
|
|
return true; /* no need to complain */
|
|
|
|
|
2020-09-27 19:58:11 +03:00
|
|
|
wd_flushcache(wd, AT_POLL);
|
2008-02-28 17:40:17 +03:00
|
|
|
if ((how & RB_POWERDOWN) == RB_POWERDOWN)
|
2008-02-22 00:52:06 +03:00
|
|
|
wd_standby(wd, AT_POLL);
|
2008-02-28 17:40:17 +03:00
|
|
|
return true;
|
2008-02-22 00:52:06 +03:00
|
|
|
}
|
|
|
|
|
1998-11-19 22:46:12 +03:00
|
|
|
/*
|
|
|
|
* Allocate space for a ioctl queue structure. Mostly taken from
|
|
|
|
* scsipi_ioctl.c
|
|
|
|
*/
|
|
|
|
struct wd_ioctl *
|
Merge support for SATA NCQ (Native Command Queueing) from jdolecek-ncq branch
ATA subsystem was changed to support several outstanding commands, and use
NCQ xfers if supported by both the controller and the disk, including NCQ
error recovery. Set NCQ high priority for BPRIO_TIMECRITICAL xfers
if supported. Added FUA support.
Done some work towards MP-safe, all ATA code tsleep()/wakeup() replaced
by condvars, and switched most code from spl* to mutexes (separate
wd(4) and ata channel lock).
Introduced new option WD_CHAOS_MONKEY to facilitate testing of error
handling, fixed several uncovered issues. Also fixed several problems
with kernel dump to wd(4) disk.
Tested with ahcisata(4), mvsata(4), siisata(4), piixide(4) on amd64,
with and without port multiplier, both disk and ATAPI devices; other
drivers and archs mechanically adjusted and compile-tested. NCQ is
supported for ahcisata(4) and siisata(4) for any controller, for
mvsata(4) only Gen IIe ones for now. Also enabled ATAPI support in
mvsata(4).
Thanks to Matt Thomas for initial ATA infrastructure patch, and
Jonathan A.Kollasch for siisata(4) NCQ changes and general testing.
Also fixes PR kern/43169 (wd(4)); and PR kern/11811, PR kern/47041,
PR kern/51979 (kernel dump)
2017-10-07 19:05:31 +03:00
|
|
|
wi_get(struct wd_softc *wd)
|
1998-11-19 22:46:12 +03:00
|
|
|
{
|
|
|
|
struct wd_ioctl *wi;
|
|
|
|
|
2018-10-22 23:13:47 +03:00
|
|
|
wi = kmem_zalloc(sizeof(struct wd_ioctl), KM_SLEEP);
|
Merge support for SATA NCQ (Native Command Queueing) from jdolecek-ncq branch
ATA subsystem was changed to support several outstanding commands, and use
NCQ xfers if supported by both the controller and the disk, including NCQ
error recovery. Set NCQ high priority for BPRIO_TIMECRITICAL xfers
if supported. Added FUA support.
Done some work towards MP-safe, all ATA code tsleep()/wakeup() replaced
by condvars, and switched most code from spl* to mutexes (separate
wd(4) and ata channel lock).
Introduced new option WD_CHAOS_MONKEY to facilitate testing of error
handling, fixed several uncovered issues. Also fixed several problems
with kernel dump to wd(4) disk.
Tested with ahcisata(4), mvsata(4), siisata(4), piixide(4) on amd64,
with and without port multiplier, both disk and ATAPI devices; other
drivers and archs mechanically adjusted and compile-tested. NCQ is
supported for ahcisata(4) and siisata(4) for any controller, for
mvsata(4) only Gen IIe ones for now. Also enabled ATAPI support in
mvsata(4).
Thanks to Matt Thomas for initial ATA infrastructure patch, and
Jonathan A.Kollasch for siisata(4) NCQ changes and general testing.
Also fixes PR kern/43169 (wd(4)); and PR kern/11811, PR kern/47041,
PR kern/51979 (kernel dump)
2017-10-07 19:05:31 +03:00
|
|
|
wi->wi_softc = wd;
|
2008-01-02 14:48:20 +03:00
|
|
|
buf_init(&wi->wi_bp);
|
Merge support for SATA NCQ (Native Command Queueing) from jdolecek-ncq branch
ATA subsystem was changed to support several outstanding commands, and use
NCQ xfers if supported by both the controller and the disk, including NCQ
error recovery. Set NCQ high priority for BPRIO_TIMECRITICAL xfers
if supported. Added FUA support.
Done some work towards MP-safe, all ATA code tsleep()/wakeup() replaced
by condvars, and switched most code from spl* to mutexes (separate
wd(4) and ata channel lock).
Introduced new option WD_CHAOS_MONKEY to facilitate testing of error
handling, fixed several uncovered issues. Also fixed several problems
with kernel dump to wd(4) disk.
Tested with ahcisata(4), mvsata(4), siisata(4), piixide(4) on amd64,
with and without port multiplier, both disk and ATAPI devices; other
drivers and archs mechanically adjusted and compile-tested. NCQ is
supported for ahcisata(4) and siisata(4) for any controller, for
mvsata(4) only Gen IIe ones for now. Also enabled ATAPI support in
mvsata(4).
Thanks to Matt Thomas for initial ATA infrastructure patch, and
Jonathan A.Kollasch for siisata(4) NCQ changes and general testing.
Also fixes PR kern/43169 (wd(4)); and PR kern/11811, PR kern/47041,
PR kern/51979 (kernel dump)
2017-10-07 19:05:31 +03:00
|
|
|
|
1998-11-19 22:46:12 +03:00
|
|
|
return (wi);
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Free an ioctl structure and remove it from our list
|
|
|
|
*/
|
|
|
|
|
|
|
|
void
|
2003-07-11 19:33:13 +04:00
|
|
|
wi_free(struct wd_ioctl *wi)
|
1998-11-19 22:46:12 +03:00
|
|
|
{
|
2008-01-02 14:48:20 +03:00
|
|
|
buf_destroy(&wi->wi_bp);
|
2018-10-22 23:13:47 +03:00
|
|
|
kmem_free(wi, sizeof(*wi));
|
1998-11-19 22:46:12 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Find a wd_ioctl structure based on the struct buf.
|
|
|
|
*/
|
|
|
|
|
|
|
|
struct wd_ioctl *
|
2003-07-11 19:33:13 +04:00
|
|
|
wi_find(struct buf *bp)
|
1998-11-19 22:46:12 +03:00
|
|
|
{
|
Merge support for SATA NCQ (Native Command Queueing) from jdolecek-ncq branch
ATA subsystem was changed to support several outstanding commands, and use
NCQ xfers if supported by both the controller and the disk, including NCQ
error recovery. Set NCQ high priority for BPRIO_TIMECRITICAL xfers
if supported. Added FUA support.
Done some work towards MP-safe, all ATA code tsleep()/wakeup() replaced
by condvars, and switched most code from spl* to mutexes (separate
wd(4) and ata channel lock).
Introduced new option WD_CHAOS_MONKEY to facilitate testing of error
handling, fixed several uncovered issues. Also fixed several problems
with kernel dump to wd(4) disk.
Tested with ahcisata(4), mvsata(4), siisata(4), piixide(4) on amd64,
with and without port multiplier, both disk and ATAPI devices; other
drivers and archs mechanically adjusted and compile-tested. NCQ is
supported for ahcisata(4) and siisata(4) for any controller, for
mvsata(4) only Gen IIe ones for now. Also enabled ATAPI support in
mvsata(4).
Thanks to Matt Thomas for initial ATA infrastructure patch, and
Jonathan A.Kollasch for siisata(4) NCQ changes and general testing.
Also fixes PR kern/43169 (wd(4)); and PR kern/11811, PR kern/47041,
PR kern/51979 (kernel dump)
2017-10-07 19:05:31 +03:00
|
|
|
return container_of(bp, struct wd_ioctl, wi_bp);
|
1998-11-19 22:46:12 +03:00
|
|
|
}
|
|
|
|
|
2016-07-22 07:08:10 +03:00
|
|
|
static uint
|
|
|
|
wi_sector_size(const struct wd_ioctl * const wi)
|
|
|
|
{
|
|
|
|
switch (wi->wi_atareq.command) {
|
|
|
|
case WDCC_READ:
|
|
|
|
case WDCC_WRITE:
|
|
|
|
case WDCC_READMULTI:
|
|
|
|
case WDCC_WRITEMULTI:
|
|
|
|
case WDCC_READDMA:
|
|
|
|
case WDCC_WRITEDMA:
|
|
|
|
case WDCC_READ_EXT:
|
|
|
|
case WDCC_WRITE_EXT:
|
|
|
|
case WDCC_READMULTI_EXT:
|
|
|
|
case WDCC_WRITEMULTI_EXT:
|
|
|
|
case WDCC_READDMA_EXT:
|
|
|
|
case WDCC_WRITEDMA_EXT:
|
|
|
|
case WDCC_READ_FPDMA_QUEUED:
|
|
|
|
case WDCC_WRITE_FPDMA_QUEUED:
|
|
|
|
return wi->wi_softc->sc_blksize;
|
|
|
|
default:
|
|
|
|
return 512;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
1998-11-19 22:46:12 +03:00
|
|
|
/*
|
|
|
|
* Ioctl pseudo strategy routine
|
|
|
|
*
|
|
|
|
* This is mostly stolen from scsipi_ioctl.c:scsistrategy(). What
|
|
|
|
* happens here is:
|
|
|
|
*
|
|
|
|
* - wdioctl() queues a wd_ioctl structure.
|
|
|
|
*
|
|
|
|
* - wdioctl() calls physio/wdioctlstrategy based on whether or not
|
|
|
|
* user space I/O is required. If physio() is called, physio() eventually
|
|
|
|
* calls wdioctlstrategy().
|
|
|
|
*
|
2001-12-03 03:11:15 +03:00
|
|
|
* - In either case, wdioctlstrategy() calls wd->atabus->ata_exec_command()
|
1998-11-19 22:46:12 +03:00
|
|
|
* to perform the actual command
|
|
|
|
*
|
|
|
|
* The reason for the use of the pseudo strategy routine is because
|
|
|
|
* when doing I/O to/from user space, physio _really_ wants to be in
|
|
|
|
* the loop. We could put the entire buffer into the ioctl request
|
|
|
|
* structure, but that won't scale if we want to do things like download
|
|
|
|
* microcode.
|
|
|
|
*/
|
|
|
|
|
|
|
|
void
|
2003-07-11 19:33:13 +04:00
|
|
|
wdioctlstrategy(struct buf *bp)
|
1998-11-19 22:46:12 +03:00
|
|
|
{
|
|
|
|
struct wd_ioctl *wi;
|
Merge support for SATA NCQ (Native Command Queueing) from jdolecek-ncq branch
ATA subsystem was changed to support several outstanding commands, and use
NCQ xfers if supported by both the controller and the disk, including NCQ
error recovery. Set NCQ high priority for BPRIO_TIMECRITICAL xfers
if supported. Added FUA support.
Done some work towards MP-safe, all ATA code tsleep()/wakeup() replaced
by condvars, and switched most code from spl* to mutexes (separate
wd(4) and ata channel lock).
Introduced new option WD_CHAOS_MONKEY to facilitate testing of error
handling, fixed several uncovered issues. Also fixed several problems
with kernel dump to wd(4) disk.
Tested with ahcisata(4), mvsata(4), siisata(4), piixide(4) on amd64,
with and without port multiplier, both disk and ATAPI devices; other
drivers and archs mechanically adjusted and compile-tested. NCQ is
supported for ahcisata(4) and siisata(4) for any controller, for
mvsata(4) only Gen IIe ones for now. Also enabled ATAPI support in
mvsata(4).
Thanks to Matt Thomas for initial ATA infrastructure patch, and
Jonathan A.Kollasch for siisata(4) NCQ changes and general testing.
Also fixes PR kern/43169 (wd(4)); and PR kern/11811, PR kern/47041,
PR kern/51979 (kernel dump)
2017-10-07 19:05:31 +03:00
|
|
|
struct ata_xfer *xfer;
|
1998-11-19 22:46:12 +03:00
|
|
|
int error = 0;
|
|
|
|
|
|
|
|
wi = wi_find(bp);
|
|
|
|
if (wi == NULL) {
|
2005-11-01 23:44:04 +03:00
|
|
|
printf("wdioctlstrategy: "
|
|
|
|
"No matching ioctl request found in queue\n");
|
1998-11-19 22:46:12 +03:00
|
|
|
error = EINVAL;
|
Merge support for SATA NCQ (Native Command Queueing) from jdolecek-ncq branch
ATA subsystem was changed to support several outstanding commands, and use
NCQ xfers if supported by both the controller and the disk, including NCQ
error recovery. Set NCQ high priority for BPRIO_TIMECRITICAL xfers
if supported. Added FUA support.
Done some work towards MP-safe, all ATA code tsleep()/wakeup() replaced
by condvars, and switched most code from spl* to mutexes (separate
wd(4) and ata channel lock).
Introduced new option WD_CHAOS_MONKEY to facilitate testing of error
handling, fixed several uncovered issues. Also fixed several problems
with kernel dump to wd(4) disk.
Tested with ahcisata(4), mvsata(4), siisata(4), piixide(4) on amd64,
with and without port multiplier, both disk and ATAPI devices; other
drivers and archs mechanically adjusted and compile-tested. NCQ is
supported for ahcisata(4) and siisata(4) for any controller, for
mvsata(4) only Gen IIe ones for now. Also enabled ATAPI support in
mvsata(4).
Thanks to Matt Thomas for initial ATA infrastructure patch, and
Jonathan A.Kollasch for siisata(4) NCQ changes and general testing.
Also fixes PR kern/43169 (wd(4)); and PR kern/11811, PR kern/47041,
PR kern/51979 (kernel dump)
2017-10-07 19:05:31 +03:00
|
|
|
goto out2;
|
1998-11-19 22:46:12 +03:00
|
|
|
}
|
|
|
|
|
2018-10-22 23:13:47 +03:00
|
|
|
xfer = ata_get_xfer(wi->wi_softc->drvp->chnl_softc, true);
|
1998-11-19 22:46:12 +03:00
|
|
|
|
|
|
|
/*
|
|
|
|
* Abort if physio broke up the transfer
|
|
|
|
*/
|
|
|
|
|
1998-11-20 02:44:20 +03:00
|
|
|
if (bp->b_bcount != wi->wi_atareq.datalen) {
|
1998-11-19 22:46:12 +03:00
|
|
|
printf("physio split wd ioctl request... cannot proceed\n");
|
|
|
|
error = EIO;
|
Merge support for SATA NCQ (Native Command Queueing) from jdolecek-ncq branch
ATA subsystem was changed to support several outstanding commands, and use
NCQ xfers if supported by both the controller and the disk, including NCQ
error recovery. Set NCQ high priority for BPRIO_TIMECRITICAL xfers
if supported. Added FUA support.
Done some work towards MP-safe, all ATA code tsleep()/wakeup() replaced
by condvars, and switched most code from spl* to mutexes (separate
wd(4) and ata channel lock).
Introduced new option WD_CHAOS_MONKEY to facilitate testing of error
handling, fixed several uncovered issues. Also fixed several problems
with kernel dump to wd(4) disk.
Tested with ahcisata(4), mvsata(4), siisata(4), piixide(4) on amd64,
with and without port multiplier, both disk and ATAPI devices; other
drivers and archs mechanically adjusted and compile-tested. NCQ is
supported for ahcisata(4) and siisata(4) for any controller, for
mvsata(4) only Gen IIe ones for now. Also enabled ATAPI support in
mvsata(4).
Thanks to Matt Thomas for initial ATA infrastructure patch, and
Jonathan A.Kollasch for siisata(4) NCQ changes and general testing.
Also fixes PR kern/43169 (wd(4)); and PR kern/11811, PR kern/47041,
PR kern/51979 (kernel dump)
2017-10-07 19:05:31 +03:00
|
|
|
goto out;
|
1998-11-19 22:46:12 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Abort if we didn't get a buffer size that was a multiple of
|
2016-07-22 07:08:10 +03:00
|
|
|
* our sector size (or overflows CHS/LBA28 sector count)
|
1998-11-19 22:46:12 +03:00
|
|
|
*/
|
|
|
|
|
2016-07-22 07:08:10 +03:00
|
|
|
if ((bp->b_bcount % wi_sector_size(wi)) != 0 ||
|
|
|
|
(bp->b_bcount / wi_sector_size(wi)) >=
|
1998-11-19 22:46:12 +03:00
|
|
|
(1 << NBBY)) {
|
|
|
|
error = EINVAL;
|
Merge support for SATA NCQ (Native Command Queueing) from jdolecek-ncq branch
ATA subsystem was changed to support several outstanding commands, and use
NCQ xfers if supported by both the controller and the disk, including NCQ
error recovery. Set NCQ high priority for BPRIO_TIMECRITICAL xfers
if supported. Added FUA support.
Done some work towards MP-safe, all ATA code tsleep()/wakeup() replaced
by condvars, and switched most code from spl* to mutexes (separate
wd(4) and ata channel lock).
Introduced new option WD_CHAOS_MONKEY to facilitate testing of error
handling, fixed several uncovered issues. Also fixed several problems
with kernel dump to wd(4) disk.
Tested with ahcisata(4), mvsata(4), siisata(4), piixide(4) on amd64,
with and without port multiplier, both disk and ATAPI devices; other
drivers and archs mechanically adjusted and compile-tested. NCQ is
supported for ahcisata(4) and siisata(4) for any controller, for
mvsata(4) only Gen IIe ones for now. Also enabled ATAPI support in
mvsata(4).
Thanks to Matt Thomas for initial ATA infrastructure patch, and
Jonathan A.Kollasch for siisata(4) NCQ changes and general testing.
Also fixes PR kern/43169 (wd(4)); and PR kern/11811, PR kern/47041,
PR kern/51979 (kernel dump)
2017-10-07 19:05:31 +03:00
|
|
|
goto out;
|
1998-11-19 22:46:12 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Make sure a timeout was supplied in the ioctl request
|
|
|
|
*/
|
|
|
|
|
1998-11-20 02:44:20 +03:00
|
|
|
if (wi->wi_atareq.timeout == 0) {
|
1998-11-19 22:46:12 +03:00
|
|
|
error = EINVAL;
|
Merge support for SATA NCQ (Native Command Queueing) from jdolecek-ncq branch
ATA subsystem was changed to support several outstanding commands, and use
NCQ xfers if supported by both the controller and the disk, including NCQ
error recovery. Set NCQ high priority for BPRIO_TIMECRITICAL xfers
if supported. Added FUA support.
Done some work towards MP-safe, all ATA code tsleep()/wakeup() replaced
by condvars, and switched most code from spl* to mutexes (separate
wd(4) and ata channel lock).
Introduced new option WD_CHAOS_MONKEY to facilitate testing of error
handling, fixed several uncovered issues. Also fixed several problems
with kernel dump to wd(4) disk.
Tested with ahcisata(4), mvsata(4), siisata(4), piixide(4) on amd64,
with and without port multiplier, both disk and ATAPI devices; other
drivers and archs mechanically adjusted and compile-tested. NCQ is
supported for ahcisata(4) and siisata(4) for any controller, for
mvsata(4) only Gen IIe ones for now. Also enabled ATAPI support in
mvsata(4).
Thanks to Matt Thomas for initial ATA infrastructure patch, and
Jonathan A.Kollasch for siisata(4) NCQ changes and general testing.
Also fixes PR kern/43169 (wd(4)); and PR kern/11811, PR kern/47041,
PR kern/51979 (kernel dump)
2017-10-07 19:05:31 +03:00
|
|
|
goto out;
|
1998-11-19 22:46:12 +03:00
|
|
|
}
|
|
|
|
|
1998-11-20 02:44:20 +03:00
|
|
|
if (wi->wi_atareq.flags & ATACMD_READ)
|
Merge support for SATA NCQ (Native Command Queueing) from jdolecek-ncq branch
ATA subsystem was changed to support several outstanding commands, and use
NCQ xfers if supported by both the controller and the disk, including NCQ
error recovery. Set NCQ high priority for BPRIO_TIMECRITICAL xfers
if supported. Added FUA support.
Done some work towards MP-safe, all ATA code tsleep()/wakeup() replaced
by condvars, and switched most code from spl* to mutexes (separate
wd(4) and ata channel lock).
Introduced new option WD_CHAOS_MONKEY to facilitate testing of error
handling, fixed several uncovered issues. Also fixed several problems
with kernel dump to wd(4) disk.
Tested with ahcisata(4), mvsata(4), siisata(4), piixide(4) on amd64,
with and without port multiplier, both disk and ATAPI devices; other
drivers and archs mechanically adjusted and compile-tested. NCQ is
supported for ahcisata(4) and siisata(4) for any controller, for
mvsata(4) only Gen IIe ones for now. Also enabled ATAPI support in
mvsata(4).
Thanks to Matt Thomas for initial ATA infrastructure patch, and
Jonathan A.Kollasch for siisata(4) NCQ changes and general testing.
Also fixes PR kern/43169 (wd(4)); and PR kern/11811, PR kern/47041,
PR kern/51979 (kernel dump)
2017-10-07 19:05:31 +03:00
|
|
|
xfer->c_ata_c.flags |= AT_READ;
|
1998-11-20 02:44:20 +03:00
|
|
|
else if (wi->wi_atareq.flags & ATACMD_WRITE)
|
Merge support for SATA NCQ (Native Command Queueing) from jdolecek-ncq branch
ATA subsystem was changed to support several outstanding commands, and use
NCQ xfers if supported by both the controller and the disk, including NCQ
error recovery. Set NCQ high priority for BPRIO_TIMECRITICAL xfers
if supported. Added FUA support.
Done some work towards MP-safe, all ATA code tsleep()/wakeup() replaced
by condvars, and switched most code from spl* to mutexes (separate
wd(4) and ata channel lock).
Introduced new option WD_CHAOS_MONKEY to facilitate testing of error
handling, fixed several uncovered issues. Also fixed several problems
with kernel dump to wd(4) disk.
Tested with ahcisata(4), mvsata(4), siisata(4), piixide(4) on amd64,
with and without port multiplier, both disk and ATAPI devices; other
drivers and archs mechanically adjusted and compile-tested. NCQ is
supported for ahcisata(4) and siisata(4) for any controller, for
mvsata(4) only Gen IIe ones for now. Also enabled ATAPI support in
mvsata(4).
Thanks to Matt Thomas for initial ATA infrastructure patch, and
Jonathan A.Kollasch for siisata(4) NCQ changes and general testing.
Also fixes PR kern/43169 (wd(4)); and PR kern/11811, PR kern/47041,
PR kern/51979 (kernel dump)
2017-10-07 19:05:31 +03:00
|
|
|
xfer->c_ata_c.flags |= AT_WRITE;
|
1998-11-19 22:46:12 +03:00
|
|
|
|
1998-11-24 02:00:26 +03:00
|
|
|
if (wi->wi_atareq.flags & ATACMD_READREG)
|
Merge support for SATA NCQ (Native Command Queueing) from jdolecek-ncq branch
ATA subsystem was changed to support several outstanding commands, and use
NCQ xfers if supported by both the controller and the disk, including NCQ
error recovery. Set NCQ high priority for BPRIO_TIMECRITICAL xfers
if supported. Added FUA support.
Done some work towards MP-safe, all ATA code tsleep()/wakeup() replaced
by condvars, and switched most code from spl* to mutexes (separate
wd(4) and ata channel lock).
Introduced new option WD_CHAOS_MONKEY to facilitate testing of error
handling, fixed several uncovered issues. Also fixed several problems
with kernel dump to wd(4) disk.
Tested with ahcisata(4), mvsata(4), siisata(4), piixide(4) on amd64,
with and without port multiplier, both disk and ATAPI devices; other
drivers and archs mechanically adjusted and compile-tested. NCQ is
supported for ahcisata(4) and siisata(4) for any controller, for
mvsata(4) only Gen IIe ones for now. Also enabled ATAPI support in
mvsata(4).
Thanks to Matt Thomas for initial ATA infrastructure patch, and
Jonathan A.Kollasch for siisata(4) NCQ changes and general testing.
Also fixes PR kern/43169 (wd(4)); and PR kern/11811, PR kern/47041,
PR kern/51979 (kernel dump)
2017-10-07 19:05:31 +03:00
|
|
|
xfer->c_ata_c.flags |= AT_READREG;
|
2004-08-12 08:57:19 +04:00
|
|
|
|
2012-01-25 00:04:07 +04:00
|
|
|
if ((wi->wi_atareq.flags & ATACMD_LBA) != 0)
|
Merge support for SATA NCQ (Native Command Queueing) from jdolecek-ncq branch
ATA subsystem was changed to support several outstanding commands, and use
NCQ xfers if supported by both the controller and the disk, including NCQ
error recovery. Set NCQ high priority for BPRIO_TIMECRITICAL xfers
if supported. Added FUA support.
Done some work towards MP-safe, all ATA code tsleep()/wakeup() replaced
by condvars, and switched most code from spl* to mutexes (separate
wd(4) and ata channel lock).
Introduced new option WD_CHAOS_MONKEY to facilitate testing of error
handling, fixed several uncovered issues. Also fixed several problems
with kernel dump to wd(4) disk.
Tested with ahcisata(4), mvsata(4), siisata(4), piixide(4) on amd64,
with and without port multiplier, both disk and ATAPI devices; other
drivers and archs mechanically adjusted and compile-tested. NCQ is
supported for ahcisata(4) and siisata(4) for any controller, for
mvsata(4) only Gen IIe ones for now. Also enabled ATAPI support in
mvsata(4).
Thanks to Matt Thomas for initial ATA infrastructure patch, and
Jonathan A.Kollasch for siisata(4) NCQ changes and general testing.
Also fixes PR kern/43169 (wd(4)); and PR kern/11811, PR kern/47041,
PR kern/51979 (kernel dump)
2017-10-07 19:05:31 +03:00
|
|
|
xfer->c_ata_c.flags |= AT_LBA;
|
2012-01-25 00:04:07 +04:00
|
|
|
|
Merge support for SATA NCQ (Native Command Queueing) from jdolecek-ncq branch
ATA subsystem was changed to support several outstanding commands, and use
NCQ xfers if supported by both the controller and the disk, including NCQ
error recovery. Set NCQ high priority for BPRIO_TIMECRITICAL xfers
if supported. Added FUA support.
Done some work towards MP-safe, all ATA code tsleep()/wakeup() replaced
by condvars, and switched most code from spl* to mutexes (separate
wd(4) and ata channel lock).
Introduced new option WD_CHAOS_MONKEY to facilitate testing of error
handling, fixed several uncovered issues. Also fixed several problems
with kernel dump to wd(4) disk.
Tested with ahcisata(4), mvsata(4), siisata(4), piixide(4) on amd64,
with and without port multiplier, both disk and ATAPI devices; other
drivers and archs mechanically adjusted and compile-tested. NCQ is
supported for ahcisata(4) and siisata(4) for any controller, for
mvsata(4) only Gen IIe ones for now. Also enabled ATAPI support in
mvsata(4).
Thanks to Matt Thomas for initial ATA infrastructure patch, and
Jonathan A.Kollasch for siisata(4) NCQ changes and general testing.
Also fixes PR kern/43169 (wd(4)); and PR kern/11811, PR kern/47041,
PR kern/51979 (kernel dump)
2017-10-07 19:05:31 +03:00
|
|
|
xfer->c_ata_c.flags |= AT_WAIT;
|
2004-08-12 08:57:19 +04:00
|
|
|
|
Merge support for SATA NCQ (Native Command Queueing) from jdolecek-ncq branch
ATA subsystem was changed to support several outstanding commands, and use
NCQ xfers if supported by both the controller and the disk, including NCQ
error recovery. Set NCQ high priority for BPRIO_TIMECRITICAL xfers
if supported. Added FUA support.
Done some work towards MP-safe, all ATA code tsleep()/wakeup() replaced
by condvars, and switched most code from spl* to mutexes (separate
wd(4) and ata channel lock).
Introduced new option WD_CHAOS_MONKEY to facilitate testing of error
handling, fixed several uncovered issues. Also fixed several problems
with kernel dump to wd(4) disk.
Tested with ahcisata(4), mvsata(4), siisata(4), piixide(4) on amd64,
with and without port multiplier, both disk and ATAPI devices; other
drivers and archs mechanically adjusted and compile-tested. NCQ is
supported for ahcisata(4) and siisata(4) for any controller, for
mvsata(4) only Gen IIe ones for now. Also enabled ATAPI support in
mvsata(4).
Thanks to Matt Thomas for initial ATA infrastructure patch, and
Jonathan A.Kollasch for siisata(4) NCQ changes and general testing.
Also fixes PR kern/43169 (wd(4)); and PR kern/11811, PR kern/47041,
PR kern/51979 (kernel dump)
2017-10-07 19:05:31 +03:00
|
|
|
xfer->c_ata_c.timeout = wi->wi_atareq.timeout;
|
|
|
|
xfer->c_ata_c.r_command = wi->wi_atareq.command;
|
|
|
|
xfer->c_ata_c.r_lba = ((wi->wi_atareq.head & 0x0f) << 24) |
|
2012-01-25 00:04:07 +04:00
|
|
|
(wi->wi_atareq.cylinder << 8) |
|
|
|
|
wi->wi_atareq.sec_num;
|
Merge support for SATA NCQ (Native Command Queueing) from jdolecek-ncq branch
ATA subsystem was changed to support several outstanding commands, and use
NCQ xfers if supported by both the controller and the disk, including NCQ
error recovery. Set NCQ high priority for BPRIO_TIMECRITICAL xfers
if supported. Added FUA support.
Done some work towards MP-safe, all ATA code tsleep()/wakeup() replaced
by condvars, and switched most code from spl* to mutexes (separate
wd(4) and ata channel lock).
Introduced new option WD_CHAOS_MONKEY to facilitate testing of error
handling, fixed several uncovered issues. Also fixed several problems
with kernel dump to wd(4) disk.
Tested with ahcisata(4), mvsata(4), siisata(4), piixide(4) on amd64,
with and without port multiplier, both disk and ATAPI devices; other
drivers and archs mechanically adjusted and compile-tested. NCQ is
supported for ahcisata(4) and siisata(4) for any controller, for
mvsata(4) only Gen IIe ones for now. Also enabled ATAPI support in
mvsata(4).
Thanks to Matt Thomas for initial ATA infrastructure patch, and
Jonathan A.Kollasch for siisata(4) NCQ changes and general testing.
Also fixes PR kern/43169 (wd(4)); and PR kern/11811, PR kern/47041,
PR kern/51979 (kernel dump)
2017-10-07 19:05:31 +03:00
|
|
|
xfer->c_ata_c.r_count = wi->wi_atareq.sec_count;
|
|
|
|
xfer->c_ata_c.r_features = wi->wi_atareq.features;
|
|
|
|
xfer->c_ata_c.r_st_bmask = WDCS_DRDY;
|
|
|
|
xfer->c_ata_c.r_st_pmask = WDCS_DRDY;
|
|
|
|
xfer->c_ata_c.data = wi->wi_bp.b_data;
|
|
|
|
xfer->c_ata_c.bcount = wi->wi_bp.b_bcount;
|
|
|
|
|
2020-04-13 13:49:34 +03:00
|
|
|
wi->wi_softc->atabus->ata_exec_command(wi->wi_softc->drvp, xfer);
|
|
|
|
ata_wait_cmd(wi->wi_softc->drvp->chnl_softc, xfer);
|
1998-11-19 22:46:12 +03:00
|
|
|
|
Merge support for SATA NCQ (Native Command Queueing) from jdolecek-ncq branch
ATA subsystem was changed to support several outstanding commands, and use
NCQ xfers if supported by both the controller and the disk, including NCQ
error recovery. Set NCQ high priority for BPRIO_TIMECRITICAL xfers
if supported. Added FUA support.
Done some work towards MP-safe, all ATA code tsleep()/wakeup() replaced
by condvars, and switched most code from spl* to mutexes (separate
wd(4) and ata channel lock).
Introduced new option WD_CHAOS_MONKEY to facilitate testing of error
handling, fixed several uncovered issues. Also fixed several problems
with kernel dump to wd(4) disk.
Tested with ahcisata(4), mvsata(4), siisata(4), piixide(4) on amd64,
with and without port multiplier, both disk and ATAPI devices; other
drivers and archs mechanically adjusted and compile-tested. NCQ is
supported for ahcisata(4) and siisata(4) for any controller, for
mvsata(4) only Gen IIe ones for now. Also enabled ATAPI support in
mvsata(4).
Thanks to Matt Thomas for initial ATA infrastructure patch, and
Jonathan A.Kollasch for siisata(4) NCQ changes and general testing.
Also fixes PR kern/43169 (wd(4)); and PR kern/11811, PR kern/47041,
PR kern/51979 (kernel dump)
2017-10-07 19:05:31 +03:00
|
|
|
if (xfer->c_ata_c.flags & (AT_ERROR | AT_TIMEOU | AT_DF)) {
|
|
|
|
if (xfer->c_ata_c.flags & AT_ERROR) {
|
1998-11-20 02:44:20 +03:00
|
|
|
wi->wi_atareq.retsts = ATACMD_ERROR;
|
Merge support for SATA NCQ (Native Command Queueing) from jdolecek-ncq branch
ATA subsystem was changed to support several outstanding commands, and use
NCQ xfers if supported by both the controller and the disk, including NCQ
error recovery. Set NCQ high priority for BPRIO_TIMECRITICAL xfers
if supported. Added FUA support.
Done some work towards MP-safe, all ATA code tsleep()/wakeup() replaced
by condvars, and switched most code from spl* to mutexes (separate
wd(4) and ata channel lock).
Introduced new option WD_CHAOS_MONKEY to facilitate testing of error
handling, fixed several uncovered issues. Also fixed several problems
with kernel dump to wd(4) disk.
Tested with ahcisata(4), mvsata(4), siisata(4), piixide(4) on amd64,
with and without port multiplier, both disk and ATAPI devices; other
drivers and archs mechanically adjusted and compile-tested. NCQ is
supported for ahcisata(4) and siisata(4) for any controller, for
mvsata(4) only Gen IIe ones for now. Also enabled ATAPI support in
mvsata(4).
Thanks to Matt Thomas for initial ATA infrastructure patch, and
Jonathan A.Kollasch for siisata(4) NCQ changes and general testing.
Also fixes PR kern/43169 (wd(4)); and PR kern/11811, PR kern/47041,
PR kern/51979 (kernel dump)
2017-10-07 19:05:31 +03:00
|
|
|
wi->wi_atareq.error = xfer->c_ata_c.r_error;
|
|
|
|
} else if (xfer->c_ata_c.flags & AT_DF)
|
1998-11-20 02:44:20 +03:00
|
|
|
wi->wi_atareq.retsts = ATACMD_DF;
|
1998-11-19 22:46:12 +03:00
|
|
|
else
|
1998-11-20 02:44:20 +03:00
|
|
|
wi->wi_atareq.retsts = ATACMD_TIMEOUT;
|
1998-11-24 02:00:26 +03:00
|
|
|
} else {
|
1998-11-20 02:44:20 +03:00
|
|
|
wi->wi_atareq.retsts = ATACMD_OK;
|
1998-11-24 02:00:26 +03:00
|
|
|
if (wi->wi_atareq.flags & ATACMD_READREG) {
|
Merge support for SATA NCQ (Native Command Queueing) from jdolecek-ncq branch
ATA subsystem was changed to support several outstanding commands, and use
NCQ xfers if supported by both the controller and the disk, including NCQ
error recovery. Set NCQ high priority for BPRIO_TIMECRITICAL xfers
if supported. Added FUA support.
Done some work towards MP-safe, all ATA code tsleep()/wakeup() replaced
by condvars, and switched most code from spl* to mutexes (separate
wd(4) and ata channel lock).
Introduced new option WD_CHAOS_MONKEY to facilitate testing of error
handling, fixed several uncovered issues. Also fixed several problems
with kernel dump to wd(4) disk.
Tested with ahcisata(4), mvsata(4), siisata(4), piixide(4) on amd64,
with and without port multiplier, both disk and ATAPI devices; other
drivers and archs mechanically adjusted and compile-tested. NCQ is
supported for ahcisata(4) and siisata(4) for any controller, for
mvsata(4) only Gen IIe ones for now. Also enabled ATAPI support in
mvsata(4).
Thanks to Matt Thomas for initial ATA infrastructure patch, and
Jonathan A.Kollasch for siisata(4) NCQ changes and general testing.
Also fixes PR kern/43169 (wd(4)); and PR kern/11811, PR kern/47041,
PR kern/51979 (kernel dump)
2017-10-07 19:05:31 +03:00
|
|
|
wi->wi_atareq.command = xfer->c_ata_c.r_status;
|
|
|
|
wi->wi_atareq.features = xfer->c_ata_c.r_error;
|
|
|
|
wi->wi_atareq.sec_count = xfer->c_ata_c.r_count;
|
|
|
|
wi->wi_atareq.sec_num = xfer->c_ata_c.r_lba & 0xff;
|
|
|
|
wi->wi_atareq.head = (xfer->c_ata_c.r_device & 0xf0) |
|
|
|
|
((xfer->c_ata_c.r_lba >> 24) & 0x0f);
|
|
|
|
wi->wi_atareq.cylinder =
|
|
|
|
(xfer->c_ata_c.r_lba >> 8) & 0xffff;
|
|
|
|
wi->wi_atareq.error = xfer->c_ata_c.r_error;
|
1998-11-24 02:00:26 +03:00
|
|
|
}
|
|
|
|
}
|
1998-11-19 22:46:12 +03:00
|
|
|
|
Merge support for SATA NCQ (Native Command Queueing) from jdolecek-ncq branch
ATA subsystem was changed to support several outstanding commands, and use
NCQ xfers if supported by both the controller and the disk, including NCQ
error recovery. Set NCQ high priority for BPRIO_TIMECRITICAL xfers
if supported. Added FUA support.
Done some work towards MP-safe, all ATA code tsleep()/wakeup() replaced
by condvars, and switched most code from spl* to mutexes (separate
wd(4) and ata channel lock).
Introduced new option WD_CHAOS_MONKEY to facilitate testing of error
handling, fixed several uncovered issues. Also fixed several problems
with kernel dump to wd(4) disk.
Tested with ahcisata(4), mvsata(4), siisata(4), piixide(4) on amd64,
with and without port multiplier, both disk and ATAPI devices; other
drivers and archs mechanically adjusted and compile-tested. NCQ is
supported for ahcisata(4) and siisata(4) for any controller, for
mvsata(4) only Gen IIe ones for now. Also enabled ATAPI support in
mvsata(4).
Thanks to Matt Thomas for initial ATA infrastructure patch, and
Jonathan A.Kollasch for siisata(4) NCQ changes and general testing.
Also fixes PR kern/43169 (wd(4)); and PR kern/11811, PR kern/47041,
PR kern/51979 (kernel dump)
2017-10-07 19:05:31 +03:00
|
|
|
out:
|
|
|
|
ata_free_xfer(wi->wi_softc->drvp->chnl_softc, xfer);
|
|
|
|
out2:
|
1998-11-19 22:46:12 +03:00
|
|
|
bp->b_error = error;
|
Merge support for SATA NCQ (Native Command Queueing) from jdolecek-ncq branch
ATA subsystem was changed to support several outstanding commands, and use
NCQ xfers if supported by both the controller and the disk, including NCQ
error recovery. Set NCQ high priority for BPRIO_TIMECRITICAL xfers
if supported. Added FUA support.
Done some work towards MP-safe, all ATA code tsleep()/wakeup() replaced
by condvars, and switched most code from spl* to mutexes (separate
wd(4) and ata channel lock).
Introduced new option WD_CHAOS_MONKEY to facilitate testing of error
handling, fixed several uncovered issues. Also fixed several problems
with kernel dump to wd(4) disk.
Tested with ahcisata(4), mvsata(4), siisata(4), piixide(4) on amd64,
with and without port multiplier, both disk and ATAPI devices; other
drivers and archs mechanically adjusted and compile-tested. NCQ is
supported for ahcisata(4) and siisata(4) for any controller, for
mvsata(4) only Gen IIe ones for now. Also enabled ATAPI support in
mvsata(4).
Thanks to Matt Thomas for initial ATA infrastructure patch, and
Jonathan A.Kollasch for siisata(4) NCQ changes and general testing.
Also fixes PR kern/43169 (wd(4)); and PR kern/11811, PR kern/47041,
PR kern/51979 (kernel dump)
2017-10-07 19:05:31 +03:00
|
|
|
if (error)
|
|
|
|
bp->b_resid = bp->b_bcount;
|
1998-11-19 22:46:12 +03:00
|
|
|
biodone(bp);
|
|
|
|
}
|
Merge support for SATA NCQ (Native Command Queueing) from jdolecek-ncq branch
ATA subsystem was changed to support several outstanding commands, and use
NCQ xfers if supported by both the controller and the disk, including NCQ
error recovery. Set NCQ high priority for BPRIO_TIMECRITICAL xfers
if supported. Added FUA support.
Done some work towards MP-safe, all ATA code tsleep()/wakeup() replaced
by condvars, and switched most code from spl* to mutexes (separate
wd(4) and ata channel lock).
Introduced new option WD_CHAOS_MONKEY to facilitate testing of error
handling, fixed several uncovered issues. Also fixed several problems
with kernel dump to wd(4) disk.
Tested with ahcisata(4), mvsata(4), siisata(4), piixide(4) on amd64,
with and without port multiplier, both disk and ATAPI devices; other
drivers and archs mechanically adjusted and compile-tested. NCQ is
supported for ahcisata(4) and siisata(4) for any controller, for
mvsata(4) only Gen IIe ones for now. Also enabled ATAPI support in
mvsata(4).
Thanks to Matt Thomas for initial ATA infrastructure patch, and
Jonathan A.Kollasch for siisata(4) NCQ changes and general testing.
Also fixes PR kern/43169 (wd(4)); and PR kern/11811, PR kern/47041,
PR kern/51979 (kernel dump)
2017-10-07 19:05:31 +03:00
|
|
|
|
|
|
|
static void
|
|
|
|
wd_sysctl_attach(struct wd_softc *wd)
|
|
|
|
{
|
2017-11-01 22:34:45 +03:00
|
|
|
struct dk_softc *dksc = &wd->sc_dksc;
|
Merge support for SATA NCQ (Native Command Queueing) from jdolecek-ncq branch
ATA subsystem was changed to support several outstanding commands, and use
NCQ xfers if supported by both the controller and the disk, including NCQ
error recovery. Set NCQ high priority for BPRIO_TIMECRITICAL xfers
if supported. Added FUA support.
Done some work towards MP-safe, all ATA code tsleep()/wakeup() replaced
by condvars, and switched most code from spl* to mutexes (separate
wd(4) and ata channel lock).
Introduced new option WD_CHAOS_MONKEY to facilitate testing of error
handling, fixed several uncovered issues. Also fixed several problems
with kernel dump to wd(4) disk.
Tested with ahcisata(4), mvsata(4), siisata(4), piixide(4) on amd64,
with and without port multiplier, both disk and ATAPI devices; other
drivers and archs mechanically adjusted and compile-tested. NCQ is
supported for ahcisata(4) and siisata(4) for any controller, for
mvsata(4) only Gen IIe ones for now. Also enabled ATAPI support in
mvsata(4).
Thanks to Matt Thomas for initial ATA infrastructure patch, and
Jonathan A.Kollasch for siisata(4) NCQ changes and general testing.
Also fixes PR kern/43169 (wd(4)); and PR kern/11811, PR kern/47041,
PR kern/51979 (kernel dump)
2017-10-07 19:05:31 +03:00
|
|
|
const struct sysctlnode *node;
|
|
|
|
int error;
|
|
|
|
|
|
|
|
/* sysctl set-up */
|
|
|
|
if (sysctl_createv(&wd->nodelog, 0, NULL, &node,
|
2017-11-01 22:34:45 +03:00
|
|
|
0, CTLTYPE_NODE, dksc->sc_xname,
|
Merge support for SATA NCQ (Native Command Queueing) from jdolecek-ncq branch
ATA subsystem was changed to support several outstanding commands, and use
NCQ xfers if supported by both the controller and the disk, including NCQ
error recovery. Set NCQ high priority for BPRIO_TIMECRITICAL xfers
if supported. Added FUA support.
Done some work towards MP-safe, all ATA code tsleep()/wakeup() replaced
by condvars, and switched most code from spl* to mutexes (separate
wd(4) and ata channel lock).
Introduced new option WD_CHAOS_MONKEY to facilitate testing of error
handling, fixed several uncovered issues. Also fixed several problems
with kernel dump to wd(4) disk.
Tested with ahcisata(4), mvsata(4), siisata(4), piixide(4) on amd64,
with and without port multiplier, both disk and ATAPI devices; other
drivers and archs mechanically adjusted and compile-tested. NCQ is
supported for ahcisata(4) and siisata(4) for any controller, for
mvsata(4) only Gen IIe ones for now. Also enabled ATAPI support in
mvsata(4).
Thanks to Matt Thomas for initial ATA infrastructure patch, and
Jonathan A.Kollasch for siisata(4) NCQ changes and general testing.
Also fixes PR kern/43169 (wd(4)); and PR kern/11811, PR kern/47041,
PR kern/51979 (kernel dump)
2017-10-07 19:05:31 +03:00
|
|
|
SYSCTL_DESCR("wd driver settings"),
|
|
|
|
NULL, 0, NULL, 0,
|
|
|
|
CTL_HW, CTL_CREATE, CTL_EOL) != 0) {
|
2017-11-01 22:34:45 +03:00
|
|
|
aprint_error_dev(dksc->sc_dev,
|
Merge support for SATA NCQ (Native Command Queueing) from jdolecek-ncq branch
ATA subsystem was changed to support several outstanding commands, and use
NCQ xfers if supported by both the controller and the disk, including NCQ
error recovery. Set NCQ high priority for BPRIO_TIMECRITICAL xfers
if supported. Added FUA support.
Done some work towards MP-safe, all ATA code tsleep()/wakeup() replaced
by condvars, and switched most code from spl* to mutexes (separate
wd(4) and ata channel lock).
Introduced new option WD_CHAOS_MONKEY to facilitate testing of error
handling, fixed several uncovered issues. Also fixed several problems
with kernel dump to wd(4) disk.
Tested with ahcisata(4), mvsata(4), siisata(4), piixide(4) on amd64,
with and without port multiplier, both disk and ATAPI devices; other
drivers and archs mechanically adjusted and compile-tested. NCQ is
supported for ahcisata(4) and siisata(4) for any controller, for
mvsata(4) only Gen IIe ones for now. Also enabled ATAPI support in
mvsata(4).
Thanks to Matt Thomas for initial ATA infrastructure patch, and
Jonathan A.Kollasch for siisata(4) NCQ changes and general testing.
Also fixes PR kern/43169 (wd(4)); and PR kern/11811, PR kern/47041,
PR kern/51979 (kernel dump)
2017-10-07 19:05:31 +03:00
|
|
|
"could not create %s.%s sysctl node\n",
|
2017-11-01 22:34:45 +03:00
|
|
|
"hw", dksc->sc_xname);
|
Merge support for SATA NCQ (Native Command Queueing) from jdolecek-ncq branch
ATA subsystem was changed to support several outstanding commands, and use
NCQ xfers if supported by both the controller and the disk, including NCQ
error recovery. Set NCQ high priority for BPRIO_TIMECRITICAL xfers
if supported. Added FUA support.
Done some work towards MP-safe, all ATA code tsleep()/wakeup() replaced
by condvars, and switched most code from spl* to mutexes (separate
wd(4) and ata channel lock).
Introduced new option WD_CHAOS_MONKEY to facilitate testing of error
handling, fixed several uncovered issues. Also fixed several problems
with kernel dump to wd(4) disk.
Tested with ahcisata(4), mvsata(4), siisata(4), piixide(4) on amd64,
with and without port multiplier, both disk and ATAPI devices; other
drivers and archs mechanically adjusted and compile-tested. NCQ is
supported for ahcisata(4) and siisata(4) for any controller, for
mvsata(4) only Gen IIe ones for now. Also enabled ATAPI support in
mvsata(4).
Thanks to Matt Thomas for initial ATA infrastructure patch, and
Jonathan A.Kollasch for siisata(4) NCQ changes and general testing.
Also fixes PR kern/43169 (wd(4)); and PR kern/11811, PR kern/47041,
PR kern/51979 (kernel dump)
2017-10-07 19:05:31 +03:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2020-01-18 14:22:49 +03:00
|
|
|
wd->drv_ncq = true;
|
Merge support for SATA NCQ (Native Command Queueing) from jdolecek-ncq branch
ATA subsystem was changed to support several outstanding commands, and use
NCQ xfers if supported by both the controller and the disk, including NCQ
error recovery. Set NCQ high priority for BPRIO_TIMECRITICAL xfers
if supported. Added FUA support.
Done some work towards MP-safe, all ATA code tsleep()/wakeup() replaced
by condvars, and switched most code from spl* to mutexes (separate
wd(4) and ata channel lock).
Introduced new option WD_CHAOS_MONKEY to facilitate testing of error
handling, fixed several uncovered issues. Also fixed several problems
with kernel dump to wd(4) disk.
Tested with ahcisata(4), mvsata(4), siisata(4), piixide(4) on amd64,
with and without port multiplier, both disk and ATAPI devices; other
drivers and archs mechanically adjusted and compile-tested. NCQ is
supported for ahcisata(4) and siisata(4) for any controller, for
mvsata(4) only Gen IIe ones for now. Also enabled ATAPI support in
mvsata(4).
Thanks to Matt Thomas for initial ATA infrastructure patch, and
Jonathan A.Kollasch for siisata(4) NCQ changes and general testing.
Also fixes PR kern/43169 (wd(4)); and PR kern/11811, PR kern/47041,
PR kern/51979 (kernel dump)
2017-10-07 19:05:31 +03:00
|
|
|
if ((error = sysctl_createv(&wd->nodelog, 0, NULL, NULL,
|
|
|
|
CTLFLAG_READWRITE, CTLTYPE_BOOL, "use_ncq",
|
|
|
|
SYSCTL_DESCR("use NCQ if supported"),
|
|
|
|
NULL, 0, &wd->drv_ncq, 0,
|
|
|
|
CTL_HW, node->sysctl_num, CTL_CREATE, CTL_EOL))
|
|
|
|
!= 0) {
|
2017-11-01 22:34:45 +03:00
|
|
|
aprint_error_dev(dksc->sc_dev,
|
Merge support for SATA NCQ (Native Command Queueing) from jdolecek-ncq branch
ATA subsystem was changed to support several outstanding commands, and use
NCQ xfers if supported by both the controller and the disk, including NCQ
error recovery. Set NCQ high priority for BPRIO_TIMECRITICAL xfers
if supported. Added FUA support.
Done some work towards MP-safe, all ATA code tsleep()/wakeup() replaced
by condvars, and switched most code from spl* to mutexes (separate
wd(4) and ata channel lock).
Introduced new option WD_CHAOS_MONKEY to facilitate testing of error
handling, fixed several uncovered issues. Also fixed several problems
with kernel dump to wd(4) disk.
Tested with ahcisata(4), mvsata(4), siisata(4), piixide(4) on amd64,
with and without port multiplier, both disk and ATAPI devices; other
drivers and archs mechanically adjusted and compile-tested. NCQ is
supported for ahcisata(4) and siisata(4) for any controller, for
mvsata(4) only Gen IIe ones for now. Also enabled ATAPI support in
mvsata(4).
Thanks to Matt Thomas for initial ATA infrastructure patch, and
Jonathan A.Kollasch for siisata(4) NCQ changes and general testing.
Also fixes PR kern/43169 (wd(4)); and PR kern/11811, PR kern/47041,
PR kern/51979 (kernel dump)
2017-10-07 19:05:31 +03:00
|
|
|
"could not create %s.%s.use_ncq sysctl - error %d\n",
|
2017-11-01 22:34:45 +03:00
|
|
|
"hw", dksc->sc_xname, error);
|
Merge support for SATA NCQ (Native Command Queueing) from jdolecek-ncq branch
ATA subsystem was changed to support several outstanding commands, and use
NCQ xfers if supported by both the controller and the disk, including NCQ
error recovery. Set NCQ high priority for BPRIO_TIMECRITICAL xfers
if supported. Added FUA support.
Done some work towards MP-safe, all ATA code tsleep()/wakeup() replaced
by condvars, and switched most code from spl* to mutexes (separate
wd(4) and ata channel lock).
Introduced new option WD_CHAOS_MONKEY to facilitate testing of error
handling, fixed several uncovered issues. Also fixed several problems
with kernel dump to wd(4) disk.
Tested with ahcisata(4), mvsata(4), siisata(4), piixide(4) on amd64,
with and without port multiplier, both disk and ATAPI devices; other
drivers and archs mechanically adjusted and compile-tested. NCQ is
supported for ahcisata(4) and siisata(4) for any controller, for
mvsata(4) only Gen IIe ones for now. Also enabled ATAPI support in
mvsata(4).
Thanks to Matt Thomas for initial ATA infrastructure patch, and
Jonathan A.Kollasch for siisata(4) NCQ changes and general testing.
Also fixes PR kern/43169 (wd(4)); and PR kern/11811, PR kern/47041,
PR kern/51979 (kernel dump)
2017-10-07 19:05:31 +03:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2017-10-14 16:20:32 +03:00
|
|
|
wd->drv_ncq_prio = false;
|
Merge support for SATA NCQ (Native Command Queueing) from jdolecek-ncq branch
ATA subsystem was changed to support several outstanding commands, and use
NCQ xfers if supported by both the controller and the disk, including NCQ
error recovery. Set NCQ high priority for BPRIO_TIMECRITICAL xfers
if supported. Added FUA support.
Done some work towards MP-safe, all ATA code tsleep()/wakeup() replaced
by condvars, and switched most code from spl* to mutexes (separate
wd(4) and ata channel lock).
Introduced new option WD_CHAOS_MONKEY to facilitate testing of error
handling, fixed several uncovered issues. Also fixed several problems
with kernel dump to wd(4) disk.
Tested with ahcisata(4), mvsata(4), siisata(4), piixide(4) on amd64,
with and without port multiplier, both disk and ATAPI devices; other
drivers and archs mechanically adjusted and compile-tested. NCQ is
supported for ahcisata(4) and siisata(4) for any controller, for
mvsata(4) only Gen IIe ones for now. Also enabled ATAPI support in
mvsata(4).
Thanks to Matt Thomas for initial ATA infrastructure patch, and
Jonathan A.Kollasch for siisata(4) NCQ changes and general testing.
Also fixes PR kern/43169 (wd(4)); and PR kern/11811, PR kern/47041,
PR kern/51979 (kernel dump)
2017-10-07 19:05:31 +03:00
|
|
|
if ((error = sysctl_createv(&wd->nodelog, 0, NULL, NULL,
|
|
|
|
CTLFLAG_READWRITE, CTLTYPE_BOOL, "use_ncq_prio",
|
|
|
|
SYSCTL_DESCR("use NCQ PRIORITY if supported"),
|
|
|
|
NULL, 0, &wd->drv_ncq_prio, 0,
|
|
|
|
CTL_HW, node->sysctl_num, CTL_CREATE, CTL_EOL))
|
|
|
|
!= 0) {
|
2017-11-01 22:34:45 +03:00
|
|
|
aprint_error_dev(dksc->sc_dev,
|
Merge support for SATA NCQ (Native Command Queueing) from jdolecek-ncq branch
ATA subsystem was changed to support several outstanding commands, and use
NCQ xfers if supported by both the controller and the disk, including NCQ
error recovery. Set NCQ high priority for BPRIO_TIMECRITICAL xfers
if supported. Added FUA support.
Done some work towards MP-safe, all ATA code tsleep()/wakeup() replaced
by condvars, and switched most code from spl* to mutexes (separate
wd(4) and ata channel lock).
Introduced new option WD_CHAOS_MONKEY to facilitate testing of error
handling, fixed several uncovered issues. Also fixed several problems
with kernel dump to wd(4) disk.
Tested with ahcisata(4), mvsata(4), siisata(4), piixide(4) on amd64,
with and without port multiplier, both disk and ATAPI devices; other
drivers and archs mechanically adjusted and compile-tested. NCQ is
supported for ahcisata(4) and siisata(4) for any controller, for
mvsata(4) only Gen IIe ones for now. Also enabled ATAPI support in
mvsata(4).
Thanks to Matt Thomas for initial ATA infrastructure patch, and
Jonathan A.Kollasch for siisata(4) NCQ changes and general testing.
Also fixes PR kern/43169 (wd(4)); and PR kern/11811, PR kern/47041,
PR kern/51979 (kernel dump)
2017-10-07 19:05:31 +03:00
|
|
|
"could not create %s.%s.use_ncq_prio sysctl - error %d\n",
|
2017-11-01 22:34:45 +03:00
|
|
|
"hw", dksc->sc_xname, error);
|
Merge support for SATA NCQ (Native Command Queueing) from jdolecek-ncq branch
ATA subsystem was changed to support several outstanding commands, and use
NCQ xfers if supported by both the controller and the disk, including NCQ
error recovery. Set NCQ high priority for BPRIO_TIMECRITICAL xfers
if supported. Added FUA support.
Done some work towards MP-safe, all ATA code tsleep()/wakeup() replaced
by condvars, and switched most code from spl* to mutexes (separate
wd(4) and ata channel lock).
Introduced new option WD_CHAOS_MONKEY to facilitate testing of error
handling, fixed several uncovered issues. Also fixed several problems
with kernel dump to wd(4) disk.
Tested with ahcisata(4), mvsata(4), siisata(4), piixide(4) on amd64,
with and without port multiplier, both disk and ATAPI devices; other
drivers and archs mechanically adjusted and compile-tested. NCQ is
supported for ahcisata(4) and siisata(4) for any controller, for
mvsata(4) only Gen IIe ones for now. Also enabled ATAPI support in
mvsata(4).
Thanks to Matt Thomas for initial ATA infrastructure patch, and
Jonathan A.Kollasch for siisata(4) NCQ changes and general testing.
Also fixes PR kern/43169 (wd(4)); and PR kern/11811, PR kern/47041,
PR kern/51979 (kernel dump)
2017-10-07 19:05:31 +03:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
#ifdef WD_CHAOS_MONKEY
|
|
|
|
wd->drv_chaos_freq = 0;
|
|
|
|
if ((error = sysctl_createv(&wd->nodelog, 0, NULL, NULL,
|
|
|
|
CTLFLAG_READWRITE, CTLTYPE_INT, "chaos_freq",
|
|
|
|
SYSCTL_DESCR("simulated bio read error rate"),
|
|
|
|
NULL, 0, &wd->drv_chaos_freq, 0,
|
|
|
|
CTL_HW, node->sysctl_num, CTL_CREATE, CTL_EOL))
|
|
|
|
!= 0) {
|
2017-11-01 22:34:45 +03:00
|
|
|
aprint_error_dev(dksc->sc_dev,
|
Merge support for SATA NCQ (Native Command Queueing) from jdolecek-ncq branch
ATA subsystem was changed to support several outstanding commands, and use
NCQ xfers if supported by both the controller and the disk, including NCQ
error recovery. Set NCQ high priority for BPRIO_TIMECRITICAL xfers
if supported. Added FUA support.
Done some work towards MP-safe, all ATA code tsleep()/wakeup() replaced
by condvars, and switched most code from spl* to mutexes (separate
wd(4) and ata channel lock).
Introduced new option WD_CHAOS_MONKEY to facilitate testing of error
handling, fixed several uncovered issues. Also fixed several problems
with kernel dump to wd(4) disk.
Tested with ahcisata(4), mvsata(4), siisata(4), piixide(4) on amd64,
with and without port multiplier, both disk and ATAPI devices; other
drivers and archs mechanically adjusted and compile-tested. NCQ is
supported for ahcisata(4) and siisata(4) for any controller, for
mvsata(4) only Gen IIe ones for now. Also enabled ATAPI support in
mvsata(4).
Thanks to Matt Thomas for initial ATA infrastructure patch, and
Jonathan A.Kollasch for siisata(4) NCQ changes and general testing.
Also fixes PR kern/43169 (wd(4)); and PR kern/11811, PR kern/47041,
PR kern/51979 (kernel dump)
2017-10-07 19:05:31 +03:00
|
|
|
"could not create %s.%s.chaos_freq sysctl - error %d\n",
|
2017-11-01 22:34:45 +03:00
|
|
|
"hw", dksc->sc_xname, error);
|
Merge support for SATA NCQ (Native Command Queueing) from jdolecek-ncq branch
ATA subsystem was changed to support several outstanding commands, and use
NCQ xfers if supported by both the controller and the disk, including NCQ
error recovery. Set NCQ high priority for BPRIO_TIMECRITICAL xfers
if supported. Added FUA support.
Done some work towards MP-safe, all ATA code tsleep()/wakeup() replaced
by condvars, and switched most code from spl* to mutexes (separate
wd(4) and ata channel lock).
Introduced new option WD_CHAOS_MONKEY to facilitate testing of error
handling, fixed several uncovered issues. Also fixed several problems
with kernel dump to wd(4) disk.
Tested with ahcisata(4), mvsata(4), siisata(4), piixide(4) on amd64,
with and without port multiplier, both disk and ATAPI devices; other
drivers and archs mechanically adjusted and compile-tested. NCQ is
supported for ahcisata(4) and siisata(4) for any controller, for
mvsata(4) only Gen IIe ones for now. Also enabled ATAPI support in
mvsata(4).
Thanks to Matt Thomas for initial ATA infrastructure patch, and
Jonathan A.Kollasch for siisata(4) NCQ changes and general testing.
Also fixes PR kern/43169 (wd(4)); and PR kern/11811, PR kern/47041,
PR kern/51979 (kernel dump)
2017-10-07 19:05:31 +03:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
wd->drv_chaos_cnt = 0;
|
|
|
|
if ((error = sysctl_createv(&wd->nodelog, 0, NULL, NULL,
|
|
|
|
CTLFLAG_READONLY, CTLTYPE_INT, "chaos_cnt",
|
|
|
|
SYSCTL_DESCR("number of processed bio reads"),
|
|
|
|
NULL, 0, &wd->drv_chaos_cnt, 0,
|
|
|
|
CTL_HW, node->sysctl_num, CTL_CREATE, CTL_EOL))
|
|
|
|
!= 0) {
|
2017-11-01 22:34:45 +03:00
|
|
|
aprint_error_dev(dksc->sc_dev,
|
Merge support for SATA NCQ (Native Command Queueing) from jdolecek-ncq branch
ATA subsystem was changed to support several outstanding commands, and use
NCQ xfers if supported by both the controller and the disk, including NCQ
error recovery. Set NCQ high priority for BPRIO_TIMECRITICAL xfers
if supported. Added FUA support.
Done some work towards MP-safe, all ATA code tsleep()/wakeup() replaced
by condvars, and switched most code from spl* to mutexes (separate
wd(4) and ata channel lock).
Introduced new option WD_CHAOS_MONKEY to facilitate testing of error
handling, fixed several uncovered issues. Also fixed several problems
with kernel dump to wd(4) disk.
Tested with ahcisata(4), mvsata(4), siisata(4), piixide(4) on amd64,
with and without port multiplier, both disk and ATAPI devices; other
drivers and archs mechanically adjusted and compile-tested. NCQ is
supported for ahcisata(4) and siisata(4) for any controller, for
mvsata(4) only Gen IIe ones for now. Also enabled ATAPI support in
mvsata(4).
Thanks to Matt Thomas for initial ATA infrastructure patch, and
Jonathan A.Kollasch for siisata(4) NCQ changes and general testing.
Also fixes PR kern/43169 (wd(4)); and PR kern/11811, PR kern/47041,
PR kern/51979 (kernel dump)
2017-10-07 19:05:31 +03:00
|
|
|
"could not create %s.%s.chaos_cnt sysctl - error %d\n",
|
2017-11-01 22:34:45 +03:00
|
|
|
"hw", dksc->sc_xname, error);
|
Merge support for SATA NCQ (Native Command Queueing) from jdolecek-ncq branch
ATA subsystem was changed to support several outstanding commands, and use
NCQ xfers if supported by both the controller and the disk, including NCQ
error recovery. Set NCQ high priority for BPRIO_TIMECRITICAL xfers
if supported. Added FUA support.
Done some work towards MP-safe, all ATA code tsleep()/wakeup() replaced
by condvars, and switched most code from spl* to mutexes (separate
wd(4) and ata channel lock).
Introduced new option WD_CHAOS_MONKEY to facilitate testing of error
handling, fixed several uncovered issues. Also fixed several problems
with kernel dump to wd(4) disk.
Tested with ahcisata(4), mvsata(4), siisata(4), piixide(4) on amd64,
with and without port multiplier, both disk and ATAPI devices; other
drivers and archs mechanically adjusted and compile-tested. NCQ is
supported for ahcisata(4) and siisata(4) for any controller, for
mvsata(4) only Gen IIe ones for now. Also enabled ATAPI support in
mvsata(4).
Thanks to Matt Thomas for initial ATA infrastructure patch, and
Jonathan A.Kollasch for siisata(4) NCQ changes and general testing.
Also fixes PR kern/43169 (wd(4)); and PR kern/11811, PR kern/47041,
PR kern/51979 (kernel dump)
2017-10-07 19:05:31 +03:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
wd_sysctl_detach(struct wd_softc *wd)
|
|
|
|
{
|
|
|
|
sysctl_teardown(&wd->nodelog);
|
|
|
|
}
|
|
|
|
|
2018-08-06 23:07:05 +03:00
|
|
|
#ifdef ATADEBUG
|
|
|
|
int wddebug(void);
|
|
|
|
|
|
|
|
int
|
|
|
|
wddebug(void)
|
|
|
|
{
|
|
|
|
struct wd_softc *wd;
|
|
|
|
struct dk_softc *dksc;
|
|
|
|
int unit;
|
|
|
|
|
|
|
|
for (unit = 0; unit <= 3; unit++) {
|
|
|
|
wd = device_lookup_private(&wd_cd, unit);
|
|
|
|
if (wd == NULL)
|
|
|
|
continue;
|
|
|
|
dksc = &wd->sc_dksc;
|
|
|
|
printf("%s fl %x bufq %p:\n",
|
|
|
|
dksc->sc_xname, wd->sc_flags, bufq_peek(dksc->sc_bufq));
|
|
|
|
|
|
|
|
atachannel_debug(wd->drvp->chnl_softc);
|
|
|
|
}
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
#endif /* ATADEBUG */
|