summaryrefslogtreecommitdiff
path: root/sys/arch/hppa/stand/libsa/ct.c
diff options
context:
space:
mode:
Diffstat (limited to 'sys/arch/hppa/stand/libsa/ct.c')
-rw-r--r--sys/arch/hppa/stand/libsa/ct.c167
1 files changed, 167 insertions, 0 deletions
diff --git a/sys/arch/hppa/stand/libsa/ct.c b/sys/arch/hppa/stand/libsa/ct.c
new file mode 100644
index 00000000000..f5b3421b92e
--- /dev/null
+++ b/sys/arch/hppa/stand/libsa/ct.c
@@ -0,0 +1,167 @@
+/* $OpenBSD: ct.c,v 1.1 1998/06/23 18:46:42 mickey Exp $ */
+/* $NOWHERE: ct.c,v 2.2 1998/06/22 18:41:34 mickey Exp $ */
+
+/*
+ * Copyright (c) 1998 Michael Shalayeff
+ * All rights reserved.
+ *
+ * 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 Michael Shalayeff.
+ * 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.
+ */
+
+/*
+ * Copyright 1996 1995 by Open Software Foundation, Inc.
+ * All Rights Reserved
+ *
+ * Permission to use, copy, modify, and distribute this software and
+ * its documentation for any purpose and without fee is hereby granted,
+ * provided that the above copyright notice appears in all copies and
+ * that both the copyright notice and this permission notice appear in
+ * supporting documentation.
+ *
+ * OSF DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE
+ * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE.
+ *
+ * IN NO EVENT SHALL OSF BE LIABLE FOR ANY SPECIAL, INDIRECT, OR
+ * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
+ * LOSS OF USE, DATA OR PROFITS, WHETHER IN ACTION OF CONTRACT,
+ * NEGLIGENCE, OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION
+ * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ *
+ */
+
+#include "libsa.h"
+
+#include <sys/param.h>
+#include <sys/disklabel.h>
+#include <sys/reboot.h>
+#include <machine/pdc.h>
+#include <machine/iodc.h>
+#include <machine/iomod.h>
+
+#include "dev_hppa.h"
+
+int (*ctiodc)(); /* cartridge tape IODC entry point */
+int ctcode[IODC_MAXSIZE/sizeof(int)];
+
+/* hp800-specific comments:
+ *
+ * Tape driver ALWAYS uses "Alternate Boot Device", which is assumed to ALWAYS
+ * be the boot device in pagezero (meaning we booted from it).
+ *
+ * NOTE about skipping file, below: It's assumed that a read gets 2k (a page).
+ * This is done because, even though the cartridge tape has record sizes of 1k,
+ * and an EOF takes one record, reads through the IODC must be in 2k chunks,
+ * and must start on a 2k-byte boundary. This means that ANY TAPE FILE TO BE
+ * SKIPPED OVER IS GOING TO HAVE TO BE AN ODD NUMBER OF 1 KBYTE RECORDS so the
+ * read of the subsequent file can start on a 2k boundary. If a real error
+ * occurs, the record count is reset below, so this isn't a problem.
+ */
+int ctbyteno; /* block number on tape to access next */
+int ctworking; /* flag: have we read anything successfully? */
+
+int
+#ifdef __STDC__
+ctopen(struct open_file *f, ...)
+#else
+ctopen(f)
+ struct open_file *f;
+#endif
+{
+ struct hppa_dev *dp = f->f_devdata;
+ int i, ret, part = B_PARTITION(dp->bootdev);
+
+ if (ctiodc == 0) {
+
+ if ((ret = (*pdc)(PDC_IODC, PDC_IODC_READ, pdcbuf, ctdev.pz_hpa,
+ IODC_IO, ctcode, IODC_MAXSIZE)) < 0) {
+ printf("ct: device ENTRY_IO Read ret'd %d\n", ret);
+ return (EIO);
+ } else
+ ctdev.pz_iodc_io = ctiodc = (int (*)()) ctcode;
+ }
+
+ if (ctiodc != NULL)
+ if ((ret = (*ctiodc)(ctdev.pz_hpa, IODC_IO_BOOTIN, ctdev.pz_spa,
+ ctdev.pz_layers, pdcbuf,0, btbuf,0,0)) < 0)
+ printf("ct: device rewind ret'd %d\n", ret);
+
+ ctbyteno = 0;
+ for (i = part; --i >= 0; ) {
+ ctworking = 0;
+ for (;;) {
+ ret = iodc_rw(btbuf, ctbyteno, IONBPG, F_READ, &ctdev);
+ ctbyteno += IONBPG;
+ if (ret <= 0)
+ break;
+ ctworking = 1;
+ }
+ if (ret < 0 && (ret != -4 || !ctworking)) {
+ printf("ct: error %d after %d %d-byte records\n",
+ ret, ctbyteno >> IOPGSHIFT, IONBPG);
+ ctbyteno = 0;
+ ctworking = 0;
+ return (EIO);
+ }
+ }
+ ctworking = 0;
+ return (0);
+}
+
+/*ARGSUSED*/
+int
+ctclose(f)
+ struct open_file *f;
+{
+ ctbyteno = 0;
+ ctworking = 0;
+
+ return 0;
+}
+
+int
+ctstrategy(devdata, rw, dblk, size, buf, rsize)
+ void *devdata;
+ int rw;
+ daddr_t dblk;
+ size_t size;
+ void *buf;
+ size_t *rsize;
+{
+ int ret;
+
+ if ((ret = iodc_rw(buf, ctbyteno, size, rw, &ctdev)) < 0) {
+ if (ret == -4 && ctworking)
+ ret = 0;
+
+ ctworking = 0;
+ } else {
+ ctworking = 1;
+ ctbyteno += ret;
+ }
+
+ return (ret);
+}