summaryrefslogtreecommitdiff
path: root/sys/dev/isa/wdlink.h
diff options
context:
space:
mode:
Diffstat (limited to 'sys/dev/isa/wdlink.h')
-rw-r--r--sys/dev/isa/wdlink.h151
1 files changed, 151 insertions, 0 deletions
diff --git a/sys/dev/isa/wdlink.h b/sys/dev/isa/wdlink.h
new file mode 100644
index 00000000000..0a6ba4e6362
--- /dev/null
+++ b/sys/dev/isa/wdlink.h
@@ -0,0 +1,151 @@
+/* $NetBSD: $ */
+
+/*
+ * Copyright (c) 1994, 1995 Charles M. Hannum. All rights reserved.
+ *
+ * DMA and multi-sector PIO handling are derived from code contributed by
+ * Onno van der Linden.
+ *
+ * Atapi support added by Manuel Bouyer.
+ *
+ * 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.
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgement:
+ * This product includes software developed by Charles M. Hannum.
+ * 4. The name of the author may not be used to endorse or promote products
+ * derived from this software without specific prior written permission.
+ *
+ * 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.
+ * IN NO EVENT SHALL THE AUTHOR 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.
+ */
+
+
+#undef WDDEBUG
+/* #undef DIAGNOSTIC */
+
+struct wdc_link {
+ int flags;
+ int openings;
+};
+
+struct wdc_softc {
+ struct device sc_dev;
+ void *sc_ih;
+ struct wd_link *d_link[2];
+ struct bus_link *ab_link;
+ struct wdc_link ctlr_link;
+ int sc_iobase; /* I/O port base */
+ int sc_drq; /* DMA channel */
+
+ TAILQ_HEAD(xferhead, wdc_xfer) sc_xfer;
+ int sc_flags;
+#define WDCF_ACTIVE 0x01 /* controller is active */
+#define WDCF_SINGLE 0x02 /* sector at a time mode */
+#define WDCF_ERROR 0x04 /* processing a disk error */
+#define WDCF_WANTED 0x08 /* XXX locking for wd_get_parms() */
+#define WDCF_IRQ_WAIT 0x10 /* controller is waiting for irq */
+#define WDCF_ONESLAVE 0x20 /* ctrl. has one ATAPI slave attached */
+ int sc_errors; /* errors during current transfer */
+ u_char sc_status; /* copy of status register */
+ u_char sc_error; /* copy of error register */
+};
+
+struct wd_link {
+ u_char type;
+#define DRIVE 0
+#define BUS 1
+ caddr_t wdc_softc;
+ caddr_t wd_softc;
+ struct wdc_link *ctlr_link;
+ struct wdparams sc_params;
+
+ /* Long-term state: */
+ u_int8_t openings;
+ int sc_drive; /* physical unit number */
+ int sc_state; /* control state */
+#define RECAL 0 /* recalibrate */
+#define RECAL_WAIT 1 /* done recalibrating */
+#define GEOMETRY 2 /* upload geometry */
+#define GEOMETRY_WAIT 3 /* done uploading geometry */
+#define MULTIMODE 4 /* set multiple mode */
+#define MULTIMODE_WAIT 5 /* done setting multiple mode */
+#define OPEN 6 /* done with open */
+ int sc_mode; /* transfer mode */
+#define WDM_PIOSINGLE 0 /* single-sector PIO */
+#define WDM_PIOMULTI 1 /* multi-sector PIO */
+#define WDM_DMA 2 /* DMA */
+ int sc_multiple; /* multiple for WDM_PIOMULTI */
+ int sc_flags; /* drive characteistics found */
+#define WDF_LOCKED 0x01
+#define WDF_WANTED 0x02
+#define WDF_WLABEL 0x04 /* label is writable */
+#define WDF_LABELLING 0x08 /* writing label */
+
+/*
+ * XXX Nothing resets this yet, but disk change sensing will when ATAPI is
+ * implemented.
+ */
+#define WDF_LOADED 0x10 /* parameters loaded */
+#define WDF_32BIT 0x20 /* can do 32-bit transfer */
+#define WDF_WAIT 0x40 /* waiting for resourses */
+
+ daddr_t sc_badsect[127]; /* 126 plus trailing -1 marker */
+ struct disklabel *sc_lp; /* label info for this disk */
+};
+
+struct wdc_xfer {
+ struct wdc_link *c_link; /* controller structure info */
+ struct wd_link *d_link; /* drive/bus structure info */
+ volatile long c_flags; /* handle also B_READ and B_WRITE */
+#define C_INUSE 0x01
+#define C_ATAPI 0x02
+#define C_ERROR 0x04
+
+ /* Information about the current transfer */
+ struct buf *c_bp;
+ void *atapi_cmd;
+ void *databuf;
+ daddr_t c_blkno; /* starting block number */
+ int c_bcount; /* byte count left */
+ int c_skip; /* bytes already transferred */
+ int c_nblks; /* number of blocks currently transferring */
+ int c_nbytes; /* number of bytes currently transferring */
+ u_long c_p_offset; /* offset of the partition */
+ TAILQ_ENTRY(wdc_xfer) c_xferchain;
+ LIST_ENTRY(wdc_xfer) free_list;
+};
+
+void wdc_exec_xfer __P((struct wd_link *, struct wdc_xfer *));
+struct wdc_xfer *wdc_get_xfer __P((struct wdc_link *, int));
+int wdc_get_parms __P((struct wd_link *));
+void wderror __P((struct wd_link* , struct buf *, char *));
+void wddone __P((struct wd_link*, struct buf*));
+int wdccommand __P((struct wd_link *, int, int, int, int, int, int));
+int wdccommandshort __P((struct wdc_softc *, int, int));
+int wdcwait __P((struct wdc_softc *, int));
+
+/*
+ * ST506 spec says that if READY or SEEKCMPLT go off, then the read or write
+ * command is aborted.
+ */
+#define wait_for_drq(d) wdcwait(d, WDCS_DRDY | WDCS_DSC | WDCS_DRQ)
+#define wait_for_unbusy(d) wdcwait(d, 0)
+#define wait_for_ready(d) wdcwait(d, WDCS_DRDY | WDCS_DSC)
+#define atapi_ready(d) wdcwait(d, WDCS_DRQ)
+
+#define IDE_NOSLEEP 0x01