summaryrefslogtreecommitdiffstats
path: root/sys/scsi/scsi_base.c
diff options
context:
space:
mode:
authorkrw <krw@openbsd.org>2020-10-14 23:40:33 +0000
committerkrw <krw@openbsd.org>2020-10-14 23:40:33 +0000
commitf31f903f6b76ce68f8d91daeaf607db9eb189363 (patch)
treefa58de913e363e0856d42a3a3c4efa1eac902e7f /sys/scsi/scsi_base.c
parentdelete strange historical FFS_SOFTUPDATES ifdef... (diff)
downloadwireguard-openbsd-f31f903f6b76ce68f8d91daeaf607db9eb189363.tar.xz
wireguard-openbsd-f31f903f6b76ce68f8d91daeaf607db9eb189363.zip
Introduce scsi_copy_internal_data() to copy 'faked' data from a driver to a
scsi_xfer. Will replace various equivalent functions/hand-rolled chunks, none of which were setting xs->resid.
Diffstat (limited to 'sys/scsi/scsi_base.c')
-rw-r--r--sys/scsi/scsi_base.c22
1 files changed, 21 insertions, 1 deletions
diff --git a/sys/scsi/scsi_base.c b/sys/scsi/scsi_base.c
index 645790e961a..dcd9f0e5544 100644
--- a/sys/scsi/scsi_base.c
+++ b/sys/scsi/scsi_base.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: scsi_base.c,v 1.276 2020/09/22 19:32:53 krw Exp $ */
+/* $OpenBSD: scsi_base.c,v 1.277 2020/10/14 23:40:33 krw Exp $ */
/* $NetBSD: scsi_base.c,v 1.43 1997/04/02 02:29:36 mycroft Exp $ */
/*
@@ -1445,6 +1445,26 @@ scsi_xs_exec(struct scsi_xfer *xs)
}
/*
+ * Used by device drivers that fake various scsi commands.
+ */
+void
+scsi_copy_internal_data(struct scsi_xfer *xs, void *data, size_t datalen)
+{
+ size_t copy_cnt;
+
+ SC_DEBUG(xs->sc_link, SDEV_DB3, ("scsi_copy_internal_data\n"));
+
+ if (xs->datalen == 0) {
+ sc_print_addr(xs->sc_link);
+ printf("uio internal data copy not supported\n");
+ } else {
+ copy_cnt = MIN(datalen, xs->datalen);
+ memcpy(xs->data, data, copy_cnt);
+ xs->resid = xs->datalen - copy_cnt;
+ }
+}
+
+/*
* This routine is called by the adapter when its xs handling is done.
*/
void