summaryrefslogtreecommitdiff
path: root/sys/dev
diff options
context:
space:
mode:
Diffstat (limited to 'sys/dev')
-rw-r--r--sys/dev/ata/atascsi.c134
-rw-r--r--sys/dev/ata/atascsi.h60
-rw-r--r--sys/dev/ata/files.ata4
3 files changed, 197 insertions, 1 deletions
diff --git a/sys/dev/ata/atascsi.c b/sys/dev/ata/atascsi.c
new file mode 100644
index 00000000000..9ec35e2ff9d
--- /dev/null
+++ b/sys/dev/ata/atascsi.c
@@ -0,0 +1,134 @@
+/* $OpenBSD: atascsi.c,v 1.1 2007/02/19 11:44:24 dlg Exp $ */
+
+/*
+ * Copyright (c) 2007 David Gwynne <dlg@openbsd.org>
+ *
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+
+#include <sys/param.h>
+#include <sys/systm.h>
+#include <sys/buf.h>
+#include <sys/kernel.h>
+#include <sys/malloc.h>
+#include <sys/device.h>
+#include <sys/proc.h>
+#include <sys/queue.h>
+
+#include <scsi/scsi_all.h>
+#include <scsi/scsiconf.h>
+
+#include <dev/ata/atascsi.h>
+
+struct atascsi {
+ struct device *ab_dev;
+ void *ab_cookie;
+
+ int *ab_ports;
+
+ struct atascsi_methods *ab_methods;
+ struct scsi_adapter ab_switch;
+ struct scsi_link ab_link;
+ struct scsibus_softc *ab_scsibus;
+};
+
+int atascsi_probe(struct atascsi *, int);
+
+int atascsi_cmd(struct scsi_xfer *);
+
+/* template */
+struct scsi_adapter atascsi_switch = {
+ atascsi_cmd, /* scsi_cmd */
+ minphys, /* scsi_minphys */
+ NULL,
+ NULL,
+ NULL /* ioctl */
+};
+
+struct scsi_device atascsi_device = {
+ NULL, NULL, NULL, NULL
+};
+
+struct atascsi *
+atascsi_attach(struct device *self, struct atascsi_attach_args *aaa)
+{
+ struct scsibus_attach_args saa;
+ struct atascsi *ab;
+ int i;
+
+ ab = malloc(sizeof(struct atascsi), M_DEVBUF, M_WAITOK);
+ bzero(ab, sizeof(struct atascsi));
+
+ ab->ab_dev = self;
+ ab->ab_cookie = aaa->aaa_cookie;
+ ab->ab_methods = aaa->aaa_methods;
+
+ /* copy from template and modify for ourselves */
+ ab->ab_switch = atascsi_switch;
+ ab->ab_switch.scsi_minphys = aaa->aaa_minphys;
+
+ /* fill in our scsi_link */
+ ab->ab_link.device = &atascsi_device;
+ ab->ab_link.adapter = &ab->ab_switch;
+ ab->ab_link.adapter_softc = ab;
+ ab->ab_link.adapter_buswidth = aaa->aaa_nports;
+ ab->ab_link.luns = 1; /* XXX port multiplier as luns */
+ ab->ab_link.adapter_target = aaa->aaa_nports;
+ ab->ab_link.openings = aaa->aaa_ncmds;
+
+ ab->ab_ports = malloc(sizeof(int) * aaa->aaa_nports,
+ M_DEVBUF, M_WAITOK);
+ bzero(ab->ab_ports, sizeof(int) * aaa->aaa_nports);
+
+ /* fill in the port array with the type of devices there */
+ for (i = 0; i < ab->ab_link.adapter_buswidth; i++)
+ atascsi_probe(ab, i);
+
+ bzero(&saa, sizeof(saa));
+ saa.saa_sc_link = &ab->ab_link;
+
+ /* stash the scsibus so we can do hotplug on it */
+ ab->ab_scsibus = (struct scsibus_softc *)config_found(self, &saa,
+ scsiprint);
+
+ return (ab);
+}
+
+int
+atascsi_detach(struct atascsi *ab)
+{
+ return (0);
+}
+
+int
+atascsi_probe(struct atascsi *ab, int port)
+{
+ if (port > ab->ab_link.adapter_buswidth)
+ return (ENXIO);
+
+ ab->ab_ports[port] = ab->ab_methods->probe(ab->ab_cookie, port);
+
+ return (0);
+}
+
+int
+atascsi_cmd(struct scsi_xfer *xs)
+{
+ int s;
+
+ xs->error = XS_DRIVER_STUFFUP;
+ s = splbio();
+ scsi_done(xs);
+ splx(s);
+ return (COMPLETE);
+}
diff --git a/sys/dev/ata/atascsi.h b/sys/dev/ata/atascsi.h
new file mode 100644
index 00000000000..6f80cc4c547
--- /dev/null
+++ b/sys/dev/ata/atascsi.h
@@ -0,0 +1,60 @@
+/* $OpenBSD: atascsi.h,v 1.1 2007/02/19 11:44:24 dlg Exp $ */
+
+/*
+ * Copyright (c) 2007 David Gwynne <dlg@openbsd.org>
+ *
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+
+struct atascsi;
+struct ata_xfer;
+
+struct atascsi_methods {
+ int (*probe)(void *, int);
+ int (*ata_cmd)(void *, struct ata_xfer *);
+};
+
+struct atascsi_attach_args {
+ void *aaa_cookie;
+
+ struct atascsi_methods *aaa_methods;
+ void (*aaa_minphys)(struct buf *);
+ int aaa_nports;
+ int aaa_ncmds;
+};
+
+struct atascsi_port {
+ int ap_type;
+#define ATABUS_PORT_T_NONE 0
+#define ATABUS_PORT_T_DISK 1
+#define ATABUS_PORT_T_ATAPI 2
+};
+
+struct ata_xfer {
+ int port;
+
+ int flags;
+#define ATA_F_POLL (1<<0)
+#define ATA_F_NOSLEEP (1<<1)
+
+ u_int8_t *cmd;
+
+ u_int8_t *data;
+ size_t datalen;
+};
+
+struct atascsi *atascsi_attach(struct device *, struct atascsi_attach_args *);
+int atascsi_detach(struct atascsi *);
+
+int atascsi_probe_dev(struct atascsi *, int);
+int atascsi_detach_dev(struct atascsi *, int);
diff --git a/sys/dev/ata/files.ata b/sys/dev/ata/files.ata
index cf010e3131d..3adc4c4b8f9 100644
--- a/sys/dev/ata/files.ata
+++ b/sys/dev/ata/files.ata
@@ -1,4 +1,4 @@
-# $OpenBSD: files.ata,v 1.2 2002/12/23 02:37:38 grange Exp $
+# $OpenBSD: files.ata,v 1.3 2007/02/19 11:44:24 dlg Exp $
# $NetBSD: files.ata,v 1.3 1998/10/12 16:09:16 bouyer Exp $
#
# Config file and device description for machine-independent devices
@@ -13,3 +13,5 @@ file dev/ata/wd.c wd needs-flag
file dev/ata/ata_wdc.c wd & wdc_base
file dev/ata/ata.c (ata | atapi) & wdc_base
+
+file dev/ata/atascsi.c atascsi