Module Name: src
Committed By: jdolecek
Date: Mon Sep 17 18:36:14 UTC 2018
Modified Files:
src/sys/dev/ata [jdolecek-ncqfixes]: ata.c ata_subr.c ata_wdc.c
atavar.h
src/sys/dev/ic [jdolecek-ncqfixes]: ahcisata_core.c mvsata.c siisata.c
wdc.c
src/sys/dev/scsipi [jdolecek-ncqfixes]: atapi_wdc.c
Log Message:
move low-level protocol handlers hooks from ata_xfer to separate struct,
initialized statically
primarily to reduce ata_xfer struct size, but also improves readibility,
and enforces consistency
To generate a diff of this commit:
cvs rdiff -u -r1.141.6.2 -r1.141.6.3 src/sys/dev/ata/ata.c
cvs rdiff -u -r1.6.2.1 -r1.6.2.2 src/sys/dev/ata/ata_subr.c
cvs rdiff -u -r1.110.4.1 -r1.110.4.2 src/sys/dev/ata/ata_wdc.c
cvs rdiff -u -r1.99.2.1 -r1.99.2.2 src/sys/dev/ata/atavar.h
cvs rdiff -u -r1.62.2.2 -r1.62.2.3 src/sys/dev/ic/ahcisata_core.c
cvs rdiff -u -r1.41.2.1 -r1.41.2.2 src/sys/dev/ic/mvsata.c
cvs rdiff -u -r1.35.6.2 -r1.35.6.3 src/sys/dev/ic/siisata.c
cvs rdiff -u -r1.288.6.1 -r1.288.6.2 src/sys/dev/ic/wdc.c
cvs rdiff -u -r1.129.6.1 -r1.129.6.2 src/sys/dev/scsipi/atapi_wdc.c
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/sys/dev/ata/ata.c
diff -u src/sys/dev/ata/ata.c:1.141.6.2 src/sys/dev/ata/ata.c:1.141.6.3
--- src/sys/dev/ata/ata.c:1.141.6.2 Sat Sep 1 09:48:32 2018
+++ src/sys/dev/ata/ata.c Mon Sep 17 18:36:13 2018
@@ -1,4 +1,4 @@
-/* $NetBSD: ata.c,v 1.141.6.2 2018/09/01 09:48:32 jdolecek Exp $ */
+/* $NetBSD: ata.c,v 1.141.6.3 2018/09/17 18:36:13 jdolecek Exp $ */
/*
* Copyright (c) 1998, 2001 Manuel Bouyer. All rights reserved.
@@ -25,7 +25,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: ata.c,v 1.141.6.2 2018/09/01 09:48:32 jdolecek Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ata.c,v 1.141.6.3 2018/09/17 18:36:13 jdolecek Exp $");
#include "opt_ata.h"
@@ -1238,7 +1238,7 @@ ata_xfer_start(struct ata_xfer *xfer)
KASSERT(mutex_owned(&chp->ch_lock));
- rv = xfer->c_start(chp, xfer);
+ rv = xfer->ops->c_start(chp, xfer);
switch (rv) {
case ATASTART_STARTED:
/* nothing to do */
@@ -1250,14 +1250,14 @@ ata_xfer_start(struct ata_xfer *xfer)
case ATASTART_POLL:
/* can happen even in thread context for some ATAPI devices */
ata_channel_unlock(chp);
- KASSERT(xfer->c_poll != NULL);
- xfer->c_poll(chp, xfer);
+ KASSERT(xfer->ops != NULL && xfer->ops->c_poll != NULL);
+ xfer->ops->c_poll(chp, xfer);
ata_channel_lock(chp);
break;
case ATASTART_ABORT:
ata_channel_unlock(chp);
- KASSERT(xfer->c_abort != NULL);
- xfer->c_abort(chp, xfer);
+ KASSERT(xfer->ops != NULL && xfer->ops->c_abort != NULL);
+ xfer->ops->c_abort(chp, xfer);
ata_channel_lock(chp);
break;
}
@@ -1337,7 +1337,7 @@ ata_waitdrain_xfer_check(struct ata_chan
if (chp->ch_drive[drive].drive_flags & ATA_DRIVE_WAITDRAIN) {
ata_channel_unlock(chp);
- (*xfer->c_kill_xfer)(chp, xfer, KILL_GONE);
+ xfer->ops->c_kill_xfer(chp, xfer, KILL_GONE);
ata_channel_lock(chp);
chp->ch_drive[drive].drive_flags &= ~ATA_DRIVE_WAITDRAIN;
@@ -1404,7 +1404,7 @@ ata_kill_active(struct ata_channel *chp,
KASSERT(mutex_owned(&chp->ch_lock));
TAILQ_FOREACH_SAFE(xfer, &chq->active_xfers, c_activechain, xfernext) {
- (*xfer->c_kill_xfer)(xfer->c_chp, xfer, reason);
+ xfer->ops->c_kill_xfer(xfer->c_chp, xfer, reason);
}
if (flags & AT_RST_EMERG)
@@ -1438,7 +1438,7 @@ ata_kill_pending(struct ata_drive_datas
* data corruption, if the hook tries to call back into
* middle layer for inactive xfer.
*/
- (*xfer->c_kill_xfer)(chp, xfer, KILL_GONE_INACTIVE);
+ xfer->ops->c_kill_xfer(chp, xfer, KILL_GONE_INACTIVE);
}
/* Wait until all active transfers on the drive finish */
Index: src/sys/dev/ata/ata_subr.c
diff -u src/sys/dev/ata/ata_subr.c:1.6.2.1 src/sys/dev/ata/ata_subr.c:1.6.2.2
--- src/sys/dev/ata/ata_subr.c:1.6.2.1 Fri Aug 31 19:08:03 2018
+++ src/sys/dev/ata/ata_subr.c Mon Sep 17 18:36:13 2018
@@ -1,4 +1,4 @@
-/* $NetBSD: ata_subr.c,v 1.6.2.1 2018/08/31 19:08:03 jdolecek Exp $ */
+/* $NetBSD: ata_subr.c,v 1.6.2.2 2018/09/17 18:36:13 jdolecek Exp $ */
/*
* Copyright (c) 1998, 2001 Manuel Bouyer. All rights reserved.
@@ -25,7 +25,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: ata_subr.c,v 1.6.2.1 2018/08/31 19:08:03 jdolecek Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ata_subr.c,v 1.6.2.2 2018/09/17 18:36:13 jdolecek Exp $");
#include "opt_ata.h"
@@ -326,6 +326,7 @@ ata_free_xfer(struct ata_channel *chp, s
goto out;
}
+ /* XXX move PIOBM and free_gw to deactivate? */
#if NATA_PIOBM /* XXX wdc dependent code */
if (xfer->c_flags & C_PIOBM) {
struct wdc_softc *wdc = CHAN_TO_WDC(chp);
@@ -386,7 +387,7 @@ ata_timeout(void *v)
/* Mark as timed out. Do not print anything, wd(4) will. */
xfer->c_flags |= C_TIMEOU;
- xfer->c_intr(xfer->c_chp, xfer, 0);
+ xfer->ops->c_intr(xfer->c_chp, xfer, 0);
}
splx(s);
Index: src/sys/dev/ata/ata_wdc.c
diff -u src/sys/dev/ata/ata_wdc.c:1.110.4.1 src/sys/dev/ata/ata_wdc.c:1.110.4.2
--- src/sys/dev/ata/ata_wdc.c:1.110.4.1 Fri Aug 31 19:08:03 2018
+++ src/sys/dev/ata/ata_wdc.c Mon Sep 17 18:36:13 2018
@@ -1,4 +1,4 @@
-/* $NetBSD: ata_wdc.c,v 1.110.4.1 2018/08/31 19:08:03 jdolecek Exp $ */
+/* $NetBSD: ata_wdc.c,v 1.110.4.2 2018/09/17 18:36:13 jdolecek Exp $ */
/*
* Copyright (c) 1998, 2001, 2003 Manuel Bouyer.
@@ -54,7 +54,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: ata_wdc.c,v 1.110.4.1 2018/08/31 19:08:03 jdolecek Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ata_wdc.c,v 1.110.4.2 2018/09/17 18:36:13 jdolecek Exp $");
#include "opt_ata.h"
#include "opt_wdc.h"
@@ -131,6 +131,14 @@ const struct ata_bustype wdc_ata_bustype
ata_kill_pending,
};
+static const struct ata_xfer_ops wdc_bio_xfer_ops = {
+ .c_start = wdc_ata_bio_start,
+ .c_poll = wdc_ata_bio_poll,
+ .c_abort = wdc_ata_bio_done,
+ .c_intr = wdc_ata_bio_intr,
+ .c_kill_xfer = wdc_ata_bio_kill_xfer
+};
+
/*
* Handle block I/O operation. Return ATACMD_COMPLETE, ATACMD_QUEUED, or
* ATACMD_TRY_AGAIN. Must be called at splbio().
@@ -161,11 +169,7 @@ wdc_ata_bio(struct ata_drive_datas *drvp
xfer->c_drive = drvp->drive;
xfer->c_databuf = ata_bio->databuf;
xfer->c_bcount = ata_bio->bcount;
- xfer->c_start = wdc_ata_bio_start;
- xfer->c_poll = wdc_ata_bio_poll;
- xfer->c_abort = wdc_ata_bio_done;
- xfer->c_intr = wdc_ata_bio_intr;
- xfer->c_kill_xfer = wdc_ata_bio_kill_xfer;
+ xfer->ops = &wdc_bio_xfer_ops;
ata_exec_xfer(chp, xfer);
return (ata_bio->flags & ATA_ITSDONE) ? ATACMD_COMPLETE : ATACMD_QUEUED;
}
Index: src/sys/dev/ata/atavar.h
diff -u src/sys/dev/ata/atavar.h:1.99.2.1 src/sys/dev/ata/atavar.h:1.99.2.2
--- src/sys/dev/ata/atavar.h:1.99.2.1 Fri Aug 31 19:08:03 2018
+++ src/sys/dev/ata/atavar.h Mon Sep 17 18:36:13 2018
@@ -1,4 +1,4 @@
-/* $NetBSD: atavar.h,v 1.99.2.1 2018/08/31 19:08:03 jdolecek Exp $ */
+/* $NetBSD: atavar.h,v 1.99.2.2 2018/09/17 18:36:13 jdolecek Exp $ */
/*
* Copyright (c) 1998, 2001 Manuel Bouyer.
@@ -125,6 +125,7 @@ struct ata_command {
/* Forward declaration for ata_xfer */
struct scsipi_xfer;
+struct ata_xfer_ops;
/*
* Description of a command to be handled by an ATA controller. These
@@ -166,6 +167,10 @@ struct ata_xfer {
SLIST_ENTRY(ata_xfer) c_retrychain;
/* Low-level protocol handlers. */
+ const struct ata_xfer_ops *ops;
+};
+
+struct ata_xfer_ops {
int (*c_start)(struct ata_channel *, struct ata_xfer *);
#define ATASTART_STARTED 0 /* xfer started, waiting for intr */
#define ATASTART_TH 1 /* xfer needs to be run in thread */
Index: src/sys/dev/ic/ahcisata_core.c
diff -u src/sys/dev/ic/ahcisata_core.c:1.62.2.2 src/sys/dev/ic/ahcisata_core.c:1.62.2.3
--- src/sys/dev/ic/ahcisata_core.c:1.62.2.2 Sat Sep 1 10:13:41 2018
+++ src/sys/dev/ic/ahcisata_core.c Mon Sep 17 18:36:13 2018
@@ -1,4 +1,4 @@
-/* $NetBSD: ahcisata_core.c,v 1.62.2.2 2018/09/01 10:13:41 jdolecek Exp $ */
+/* $NetBSD: ahcisata_core.c,v 1.62.2.3 2018/09/17 18:36:13 jdolecek Exp $ */
/*
* Copyright (c) 2006 Manuel Bouyer.
@@ -26,7 +26,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: ahcisata_core.c,v 1.62.2.2 2018/09/01 10:13:41 jdolecek Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ahcisata_core.c,v 1.62.2.3 2018/09/17 18:36:13 jdolecek Exp $");
#include <sys/types.h>
#include <sys/malloc.h>
@@ -647,7 +647,7 @@ ahci_intr_port(struct ahci_softc *sc, st
if ((achp->ahcic_cmds_active & __BIT(slot)) != 0 &&
(sact & __BIT(slot)) == 0) {
xfer = ata_queue_hwslot_to_xfer(chp, slot);
- xfer->c_intr(chp, xfer, tfd);
+ xfer->ops->c_intr(chp, xfer, tfd);
}
} else {
/*
@@ -665,7 +665,7 @@ ahci_intr_port(struct ahci_softc *sc, st
if ((aslots & __BIT(slot)) != 0 &&
(sact & __BIT(slot)) == 0) {
xfer = ata_queue_hwslot_to_xfer(chp, slot);
- xfer->c_intr(chp, xfer, tfd);
+ xfer->ops->c_intr(chp, xfer, tfd);
}
}
}
@@ -1003,6 +1003,14 @@ ahci_setup_channel(struct ata_channel *c
return;
}
+static const struct ata_xfer_ops ahci_cmd_xfer_ops = {
+ .c_start = ahci_cmd_start,
+ .c_poll = ahci_cmd_poll,
+ .c_abort = ahci_cmd_abort,
+ .c_intr = ahci_cmd_complete,
+ .c_kill_xfer = ahci_cmd_kill_xfer,
+};
+
static int
ahci_exec_command(struct ata_drive_datas *drvp, struct ata_xfer *xfer)
{
@@ -1022,11 +1030,7 @@ ahci_exec_command(struct ata_drive_datas
xfer->c_drive = drvp->drive;
xfer->c_databuf = ata_c->data;
xfer->c_bcount = ata_c->bcount;
- xfer->c_start = ahci_cmd_start;
- xfer->c_poll = ahci_cmd_poll;
- xfer->c_abort = ahci_cmd_abort;
- xfer->c_intr = ahci_cmd_complete;
- xfer->c_kill_xfer = ahci_cmd_kill_xfer;
+ xfer->ops = &ahci_cmd_xfer_ops;
s = splbio();
ata_exec_xfer(chp, xfer);
#ifdef DIAGNOSTIC
@@ -1142,7 +1146,7 @@ ahci_cmd_poll(struct ata_channel *chp, s
if ((xfer->c_ata_c.flags & AT_DONE) == 0) {
xfer->c_ata_c.flags |= AT_TIMEOU;
- xfer->c_intr(chp, xfer, 0);
+ xfer->ops->c_intr(chp, xfer, 0);
}
/* reenable interrupts */
AHCI_WRITE(sc, AHCI_GHC, AHCI_READ(sc, AHCI_GHC) | AHCI_GHC_IE);
@@ -1279,6 +1283,14 @@ ahci_cmd_done_end(struct ata_channel *ch
ata_c->flags |= AT_DONE;
}
+static const struct ata_xfer_ops ahci_bio_xfer_ops = {
+ .c_start = ahci_bio_start,
+ .c_poll = ahci_bio_poll,
+ .c_abort = ahci_bio_abort,
+ .c_intr = ahci_bio_complete,
+ .c_kill_xfer = ahci_bio_kill_xfer,
+};
+
static int
ahci_ata_bio(struct ata_drive_datas *drvp, struct ata_xfer *xfer)
{
@@ -1294,11 +1306,7 @@ ahci_ata_bio(struct ata_drive_datas *drv
xfer->c_drive = drvp->drive;
xfer->c_databuf = ata_bio->databuf;
xfer->c_bcount = ata_bio->bcount;
- xfer->c_start = ahci_bio_start;
- xfer->c_poll = ahci_bio_poll;
- xfer->c_abort = ahci_bio_abort;
- xfer->c_intr = ahci_bio_complete;
- xfer->c_kill_xfer = ahci_bio_kill_xfer;
+ xfer->ops = &ahci_bio_xfer_ops;
ata_exec_xfer(chp, xfer);
return (ata_bio->flags & ATA_ITSDONE) ? ATACMD_COMPLETE : ATACMD_QUEUED;
}
@@ -1386,7 +1394,7 @@ ahci_bio_poll(struct ata_channel *chp, s
DEBUG_XFERS);
if ((xfer->c_bio.flags & ATA_ITSDONE) == 0) {
xfer->c_bio.error = TIMEOUT;
- xfer->c_intr(chp, xfer, 0);
+ xfer->ops->c_intr(chp, xfer, 0);
}
/* reenable interrupts */
AHCI_WRITE(sc, AHCI_GHC, AHCI_READ(sc, AHCI_GHC) | AHCI_GHC_IE);
@@ -1671,7 +1679,7 @@ ahci_channel_recover(struct ahci_softc *
if ((achp->ahcic_cmds_active & (1U << eslot)) != 0) {
xfer = ata_queue_hwslot_to_xfer(chp, eslot);
xfer->c_flags |= C_RECOVERED;
- xfer->c_intr(chp, xfer,
+ xfer->ops->c_intr(chp, xfer,
(err << AHCI_P_TFD_ERR_SHIFT) | st);
}
break;
@@ -1684,7 +1692,7 @@ ahci_channel_recover(struct ahci_softc *
for (slot = 0; slot < sc->sc_ncmds; slot++) {
if ((achp->ahcic_cmds_active & (1U << slot)) != 0) {
xfer = ata_queue_hwslot_to_xfer(chp, slot);
- xfer->c_intr(chp, xfer, tfd);
+ xfer->ops->c_intr(chp, xfer, tfd);
}
}
break;
@@ -1718,7 +1726,7 @@ reset:
if (drive != xfer->c_drive)
continue;
- xfer->c_kill_xfer(chp, xfer,
+ xfer->ops->c_kill_xfer(chp, xfer,
(error == 0) ? KILL_REQUEUE : KILL_RESET);
}
@@ -1827,6 +1835,14 @@ ahci_atapi_kill_pending(struct scsipi_pe
ata_kill_pending(&chp->ch_drive[periph->periph_target]);
}
+static const struct ata_xfer_ops ahci_atapi_xfer_ops = {
+ .c_start = ahci_atapi_start,
+ .c_poll = ahci_atapi_poll,
+ .c_abort = ahci_atapi_abort,
+ .c_intr = ahci_atapi_complete,
+ .c_kill_xfer = ahci_atapi_kill_xfer,
+};
+
static void
ahci_atapi_scsipi_request(struct scsipi_channel *chan,
scsipi_adapter_req_t req, void *arg)
@@ -1864,11 +1880,7 @@ ahci_atapi_scsipi_request(struct scsipi_
xfer->c_scsipi = sc_xfer;
xfer->c_databuf = sc_xfer->data;
xfer->c_bcount = sc_xfer->datalen;
- xfer->c_start = ahci_atapi_start;
- xfer->c_poll = ahci_atapi_poll;
- xfer->c_abort = ahci_atapi_abort;
- xfer->c_intr = ahci_atapi_complete;
- xfer->c_kill_xfer = ahci_atapi_kill_xfer;
+ xfer->ops = &ahci_atapi_xfer_ops;
xfer->c_dscpoll = 0;
s = splbio();
ata_exec_xfer(atac->atac_channels[channel], xfer);
@@ -1972,7 +1984,7 @@ ahci_atapi_poll(struct ata_channel *chp,
DEBUG_XFERS);
if ((xfer->c_scsipi->xs_status & XS_STS_DONE) == 0) {
xfer->c_scsipi->error = XS_TIMEOUT;
- xfer->c_intr(chp, xfer, 0);
+ xfer->ops->c_intr(chp, xfer, 0);
}
/* reenable interrupts */
AHCI_WRITE(sc, AHCI_GHC, AHCI_READ(sc, AHCI_GHC) | AHCI_GHC_IE);
Index: src/sys/dev/ic/mvsata.c
diff -u src/sys/dev/ic/mvsata.c:1.41.2.1 src/sys/dev/ic/mvsata.c:1.41.2.2
--- src/sys/dev/ic/mvsata.c:1.41.2.1 Fri Aug 31 19:08:03 2018
+++ src/sys/dev/ic/mvsata.c Mon Sep 17 18:36:14 2018
@@ -1,4 +1,4 @@
-/* $NetBSD: mvsata.c,v 1.41.2.1 2018/08/31 19:08:03 jdolecek Exp $ */
+/* $NetBSD: mvsata.c,v 1.41.2.2 2018/09/17 18:36:14 jdolecek Exp $ */
/*
* Copyright (c) 2008 KIYOHARA Takashi
* All rights reserved.
@@ -26,7 +26,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: mvsata.c,v 1.41.2.1 2018/08/31 19:08:03 jdolecek Exp $");
+__KERNEL_RCSID(0, "$NetBSD: mvsata.c,v 1.41.2.2 2018/09/17 18:36:14 jdolecek Exp $");
#include "opt_mvsata.h"
@@ -457,7 +457,7 @@ mvsata_nondma_handle(struct mvsata_port
return 0;
}
- ret = xfer->c_intr(chp, xfer, 1);
+ ret = xfer->ops->c_intr(chp, xfer, 1);
return (ret);
}
@@ -609,7 +609,7 @@ mvsata_channel_recover(struct mvsata_por
xfer->c_flags |= C_RECOVERED;
xfer->c_bio.error = ERROR;
xfer->c_bio.r_error = err;
- xfer->c_intr(chp, xfer, 1);
+ xfer->ops->c_intr(chp, xfer, 1);
}
break;
@@ -624,7 +624,7 @@ mvsata_channel_recover(struct mvsata_por
if (xfer->c_drive != drive)
continue;
- xfer->c_intr(chp, xfer, 1);
+ xfer->ops->c_intr(chp, xfer, 1);
}
}
break;
@@ -657,7 +657,7 @@ mvsata_channel_recover(struct mvsata_por
if (xfer->c_drive != drive)
continue;
- xfer->c_kill_xfer(chp, xfer,
+ xfer->ops->c_kill_xfer(chp, xfer,
(error == 0) ? KILL_REQUEUE : KILL_RESET);
}
@@ -1081,6 +1081,14 @@ no_edma:
}
#ifndef MVSATA_WITHOUTDMA
+static const struct ata_xfer_ops mvsata_bio_xfer_ops = {
+ .c_start = mvsata_bio_start,
+ .c_intr = mvsata_bio_intr,
+ .c_poll = mvsata_bio_poll,
+ .c_abort = mvsata_bio_done,
+ .c_kill_xfer = mvsata_bio_kill_xfer,
+};
+
static int
mvsata_bio(struct ata_drive_datas *drvp, struct ata_xfer *xfer)
{
@@ -1103,11 +1111,7 @@ mvsata_bio(struct ata_drive_datas *drvp,
xfer->c_drive = drvp->drive;
xfer->c_databuf = ata_bio->databuf;
xfer->c_bcount = ata_bio->bcount;
- xfer->c_start = mvsata_bio_start;
- xfer->c_intr = mvsata_bio_intr;
- xfer->c_poll = mvsata_bio_poll;
- xfer->c_abort = mvsata_bio_done;
- xfer->c_kill_xfer = mvsata_bio_kill_xfer;
+ xfer->ops = &mvsata_bio_xfer_ops;
ata_exec_xfer(chp, xfer);
return (ata_bio->flags & ATA_ITSDONE) ? ATACMD_COMPLETE : ATACMD_QUEUED;
}
@@ -1676,6 +1680,14 @@ ctrldone:
return -1;
}
+static const struct ata_xfer_ops mvsata_wdc_cmd_xfer_ops = {
+ .c_start = mvsata_wdc_cmd_start,
+ .c_intr = mvsata_wdc_cmd_intr,
+ .c_poll = mvsata_wdc_cmd_poll,
+ .c_abort = mvsata_wdc_cmd_done,
+ .c_kill_xfer = mvsata_wdc_cmd_kill_xfer,
+};
+
static int
mvsata_exec_command(struct ata_drive_datas *drvp, struct ata_xfer *xfer)
{
@@ -1699,11 +1711,7 @@ mvsata_exec_command(struct ata_drive_dat
xfer->c_drive = drvp->drive;
xfer->c_databuf = ata_c->data;
xfer->c_bcount = ata_c->bcount;
- xfer->c_start = mvsata_wdc_cmd_start;
- xfer->c_intr = mvsata_wdc_cmd_intr;
- xfer->c_poll = mvsata_wdc_cmd_poll;
- xfer->c_abort = mvsata_wdc_cmd_done;
- xfer->c_kill_xfer = mvsata_wdc_cmd_kill_xfer;
+ xfer->ops = &mvsata_wdc_cmd_xfer_ops;
s = splbio();
ata_exec_xfer(chp, xfer);
#ifdef DIAGNOSTIC
@@ -2041,6 +2049,14 @@ mvsata_wdc_cmd_done_end(struct ata_chann
}
#if NATAPIBUS > 0
+static const struct ata_xfer_ops mvsata_atapi_xfer_ops = {
+ .c_start = mvsata_atapi_start,
+ .c_intr = mvsata_atapi_intr,
+ .c_poll = mvsata_atapi_poll,
+ .c_abort = mvsata_atapi_reset,
+ .c_kill_xfer = mvsata_atapi_kill_xfer,
+};
+
static void
mvsata_atapi_scsipi_request(struct scsipi_channel *chan,
scsipi_adapter_req_t req, void *arg)
@@ -2079,11 +2095,7 @@ mvsata_atapi_scsipi_request(struct scsip
xfer->c_scsipi = sc_xfer;
xfer->c_databuf = sc_xfer->data;
xfer->c_bcount = sc_xfer->datalen;
- xfer->c_start = mvsata_atapi_start;
- xfer->c_intr = mvsata_atapi_intr;
- xfer->c_poll = mvsata_atapi_poll;
- xfer->c_abort = mvsata_atapi_reset;
- xfer->c_kill_xfer = mvsata_atapi_kill_xfer;
+ xfer->ops = &mvsata_atapi_xfer_ops;
xfer->c_dscpoll = 0;
s = splbio();
ata_exec_xfer(chp, xfer);
Index: src/sys/dev/ic/siisata.c
diff -u src/sys/dev/ic/siisata.c:1.35.6.2 src/sys/dev/ic/siisata.c:1.35.6.3
--- src/sys/dev/ic/siisata.c:1.35.6.2 Sat Sep 1 10:13:41 2018
+++ src/sys/dev/ic/siisata.c Mon Sep 17 18:36:14 2018
@@ -1,4 +1,4 @@
-/* $NetBSD: siisata.c,v 1.35.6.2 2018/09/01 10:13:41 jdolecek Exp $ */
+/* $NetBSD: siisata.c,v 1.35.6.3 2018/09/17 18:36:14 jdolecek Exp $ */
/* from ahcisata_core.c */
@@ -79,7 +79,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: siisata.c,v 1.35.6.2 2018/09/01 10:13:41 jdolecek Exp $");
+__KERNEL_RCSID(0, "$NetBSD: siisata.c,v 1.35.6.3 2018/09/17 18:36:14 jdolecek Exp $");
#include <sys/types.h>
#include <sys/param.h>
@@ -563,7 +563,7 @@ siisata_intr_port(struct siisata_channel
process:
if (xfer != NULL) {
- xfer->c_intr(chp, xfer, tfd);
+ xfer->ops->c_intr(chp, xfer, tfd);
} else {
/*
* For NCQ, HBA halts processing when error is notified,
@@ -580,7 +580,7 @@ process:
if ((aslots & __BIT(slot)) != 0 &&
(pss & PR_PXSS(slot)) == 0) {
xfer = ata_queue_hwslot_to_xfer(chp, slot);
- xfer->c_intr(chp, xfer, 0);
+ xfer->ops->c_intr(chp, xfer, 0);
}
}
}
@@ -659,7 +659,7 @@ siisata_channel_recover(struct ata_chann
if ((schp->sch_active_slots & (1 << eslot)) != 0) {
xfer = ata_queue_hwslot_to_xfer(chp, eslot);
xfer->c_flags |= C_RECOVERED;
- xfer->c_intr(chp, xfer, ATACH_ERR_ST(err, st));
+ xfer->ops->c_intr(chp, xfer, ATACH_ERR_ST(err, st));
}
break;
@@ -674,7 +674,7 @@ siisata_channel_recover(struct ata_chann
if (xfer->c_drive != drive)
continue;
- xfer->c_intr(chp, xfer, tfd);
+ xfer->ops->c_intr(chp, xfer, tfd);
}
}
break;
@@ -708,7 +708,7 @@ reset:
if (xfer->c_drive != drive)
continue;
- xfer->c_kill_xfer(chp, xfer,
+ xfer->ops->c_kill_xfer(chp, xfer,
(error == 0) ? KILL_REQUEUE : KILL_RESET);
}
@@ -970,6 +970,14 @@ siisata_setup_channel(struct ata_channel
return;
}
+static const struct ata_xfer_ops siisata_cmd_xfer_ops = {
+ .c_start = siisata_cmd_start,
+ .c_intr = siisata_cmd_complete,
+ .c_poll = siisata_cmd_poll,
+ .c_abort = siisata_cmd_abort,
+ .c_kill_xfer = siisata_cmd_kill_xfer,
+};
+
int
siisata_exec_command(struct ata_drive_datas *drvp, struct ata_xfer *xfer)
{
@@ -989,11 +997,7 @@ siisata_exec_command(struct ata_drive_da
xfer->c_drive = drvp->drive;
xfer->c_databuf = ata_c->data;
xfer->c_bcount = ata_c->bcount;
- xfer->c_start = siisata_cmd_start;
- xfer->c_intr = siisata_cmd_complete;
- xfer->c_poll = siisata_cmd_poll;
- xfer->c_abort = siisata_cmd_abort;
- xfer->c_kill_xfer = siisata_cmd_kill_xfer;
+ xfer->ops = &siisata_cmd_xfer_ops;
s = splbio();
ata_exec_xfer(chp, xfer);
#ifdef DIAGNOSTIC
@@ -1223,6 +1227,14 @@ siisata_cmd_done_end(struct ata_channel
ata_c->flags |= AT_DONE;
}
+static const struct ata_xfer_ops siisata_bio_xfer_ops = {
+ .c_start = siisata_bio_start,
+ .c_intr = siisata_bio_complete,
+ .c_poll = siisata_bio_poll,
+ .c_abort = siisata_bio_abort,
+ .c_kill_xfer = siisata_bio_kill_xfer,
+};
+
int
siisata_ata_bio(struct ata_drive_datas *drvp, struct ata_xfer *xfer)
{
@@ -1240,11 +1252,7 @@ siisata_ata_bio(struct ata_drive_datas *
xfer->c_drive = drvp->drive;
xfer->c_databuf = ata_bio->databuf;
xfer->c_bcount = ata_bio->bcount;
- xfer->c_start = siisata_bio_start;
- xfer->c_intr = siisata_bio_complete;
- xfer->c_poll = siisata_bio_poll;
- xfer->c_abort = siisata_bio_abort;
- xfer->c_kill_xfer = siisata_bio_kill_xfer;
+ xfer->ops = &siisata_bio_xfer_ops;
ata_exec_xfer(chp, xfer);
return (ata_bio->flags & ATA_ITSDONE) ?
ATACMD_COMPLETE : ATACMD_QUEUED;
@@ -1782,6 +1790,14 @@ siisata_atapi_probe_device(struct atapib
}
}
+static const struct ata_xfer_ops siisata_atapi_xfer_ops = {
+ .c_start = siisata_atapi_start,
+ .c_intr = siisata_atapi_complete,
+ .c_poll = siisata_atapi_poll,
+ .c_abort = siisata_atapi_abort,
+ .c_kill_xfer = siisata_atapi_kill_xfer,
+};
+
void
siisata_atapi_scsipi_request(struct scsipi_channel *chan,
scsipi_adapter_req_t req, void *arg)
@@ -1824,11 +1840,7 @@ siisata_atapi_scsipi_request(struct scsi
xfer->c_scsipi = sc_xfer;
xfer->c_databuf = sc_xfer->data;
xfer->c_bcount = sc_xfer->datalen;
- xfer->c_start = siisata_atapi_start;
- xfer->c_intr = siisata_atapi_complete;
- xfer->c_poll = siisata_atapi_poll;
- xfer->c_abort = siisata_atapi_abort;
- xfer->c_kill_xfer = siisata_atapi_kill_xfer;
+ xfer->ops = &siisata_atapi_xfer_ops;
xfer->c_dscpoll = 0;
s = splbio();
ata_exec_xfer(atac->atac_channels[channel], xfer);
Index: src/sys/dev/ic/wdc.c
diff -u src/sys/dev/ic/wdc.c:1.288.6.1 src/sys/dev/ic/wdc.c:1.288.6.2
--- src/sys/dev/ic/wdc.c:1.288.6.1 Fri Aug 31 19:08:03 2018
+++ src/sys/dev/ic/wdc.c Mon Sep 17 18:36:14 2018
@@ -1,4 +1,4 @@
-/* $NetBSD: wdc.c,v 1.288.6.1 2018/08/31 19:08:03 jdolecek Exp $ */
+/* $NetBSD: wdc.c,v 1.288.6.2 2018/09/17 18:36:14 jdolecek Exp $ */
/*
* Copyright (c) 1998, 2001, 2003 Manuel Bouyer. All rights reserved.
@@ -58,7 +58,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: wdc.c,v 1.288.6.1 2018/08/31 19:08:03 jdolecek Exp $");
+__KERNEL_RCSID(0, "$NetBSD: wdc.c,v 1.288.6.2 2018/09/17 18:36:14 jdolecek Exp $");
#include "opt_ata.h"
#include "opt_wdc.h"
@@ -919,8 +919,8 @@ ignore:
}
#endif
chp->ch_flags &= ~ATACH_IRQ_WAIT;
- KASSERT(xfer->c_intr != NULL);
- ret = xfer->c_intr(chp, xfer, 1);
+ KASSERT(xfer->ops != NULL && xfer->ops->c_intr != NULL);
+ ret = xfer->ops->c_intr(chp, xfer, 1);
if (ret == 0) /* irq was not for us, still waiting for irq */
chp->ch_flags |= ATACH_IRQ_WAIT;
return (ret);
@@ -1367,13 +1367,21 @@ wdctimeout(void *arg)
*/
callout_reset(&chp->c_timo_callout, hz, wdctimeout, chp);
xfer->c_flags |= C_TIMEOU;
- KASSERT(xfer->c_intr != NULL);
- xfer->c_intr(chp, xfer, 1);
+ KASSERT(xfer->ops != NULL && xfer->ops->c_intr != NULL);
+ xfer->ops->c_intr(chp, xfer, 1);
out:
splx(s);
}
+static const struct ata_xfer_ops wdc_cmd_xfer_ops = {
+ .c_start = __wdccommand_start,
+ .c_poll = __wdccommand_poll,
+ .c_abort = __wdccommand_done,
+ .c_intr = __wdccommand_intr,
+ .c_kill_xfer = __wdccommand_kill_xfer,
+};
+
int
wdc_exec_command(struct ata_drive_datas *drvp, struct ata_xfer *xfer)
{
@@ -1395,11 +1403,7 @@ wdc_exec_command(struct ata_drive_datas
xfer->c_drive = drvp->drive;
xfer->c_databuf = ata_c->data;
xfer->c_bcount = ata_c->bcount;
- xfer->c_start = __wdccommand_start;
- xfer->c_poll = __wdccommand_poll;
- xfer->c_abort = __wdccommand_done;
- xfer->c_intr = __wdccommand_intr;
- xfer->c_kill_xfer = __wdccommand_kill_xfer;
+ xfer->ops = &wdc_cmd_xfer_ops;
s = splbio();
ata_exec_xfer(chp, xfer);
Index: src/sys/dev/scsipi/atapi_wdc.c
diff -u src/sys/dev/scsipi/atapi_wdc.c:1.129.6.1 src/sys/dev/scsipi/atapi_wdc.c:1.129.6.2
--- src/sys/dev/scsipi/atapi_wdc.c:1.129.6.1 Fri Aug 31 19:08:03 2018
+++ src/sys/dev/scsipi/atapi_wdc.c Mon Sep 17 18:36:14 2018
@@ -1,4 +1,4 @@
-/* $NetBSD: atapi_wdc.c,v 1.129.6.1 2018/08/31 19:08:03 jdolecek Exp $ */
+/* $NetBSD: atapi_wdc.c,v 1.129.6.2 2018/09/17 18:36:14 jdolecek Exp $ */
/*
* Copyright (c) 1998, 2001 Manuel Bouyer.
@@ -25,7 +25,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: atapi_wdc.c,v 1.129.6.1 2018/08/31 19:08:03 jdolecek Exp $");
+__KERNEL_RCSID(0, "$NetBSD: atapi_wdc.c,v 1.129.6.2 2018/09/17 18:36:14 jdolecek Exp $");
#ifndef ATADEBUG
#define ATADEBUG
@@ -359,6 +359,14 @@ wdc_atapi_probe_device(struct atapibus_s
}
}
+static const struct ata_xfer_ops wdc_atapi_xfer_ops = {
+ .c_start = wdc_atapi_start,
+ .c_intr = wdc_atapi_intr,
+ .c_poll = wdc_atapi_poll,
+ .c_abort = wdc_atapi_reset,
+ .c_kill_xfer = wdc_atapi_kill_xfer,
+};
+
static void
wdc_atapi_scsipi_request(struct scsipi_channel *chan, scsipi_adapter_req_t req,
void *arg)
@@ -452,11 +460,7 @@ wdc_atapi_scsipi_request(struct scsipi_c
xfer->c_scsipi = sc_xfer;
xfer->c_databuf = sc_xfer->data;
xfer->c_bcount = sc_xfer->datalen;
- xfer->c_start = wdc_atapi_start;
- xfer->c_intr = wdc_atapi_intr;
- xfer->c_poll = wdc_atapi_poll;
- xfer->c_abort = wdc_atapi_reset;
- xfer->c_kill_xfer = wdc_atapi_kill_xfer;
+ xfer->ops = &wdc_atapi_xfer_ops;
xfer->c_dscpoll = 0;
s = splbio();
ata_exec_xfer(atac->atac_channels[channel], xfer);