1 /* 2 * $NetBSD: xd.c,v 1.10 2009/03/14 21:04:04 dsl Exp $ 3 * 4 * Copyright (c) 1996 Ignatios Souvatzis. 5 * Copyright (c) 1995 Waldi Ravens. 6 * All rights reserved. 7 * 8 * Redistribution and use in source and binary forms, with or without 9 * modification, are permitted provided that the following conditions 10 * are met: 11 * 1. Redistributions of source code must retain the above copyright 12 * notice, this list of conditions and the following disclaimer. 13 * 2. Redistributions in binary form must reproduce the above copyright 14 * notice, this list of conditions and the following disclaimer in the 15 * documentation and/or other materials provided with the distribution. 16 * 3. All advertising materials mentioning features or use of this software 17 * must display the following acknowledgement: 18 * This product includes software developed by Waldi Ravens. 19 * 4. The name of the author may not be used to endorse or promote products 20 * derived from this software without specific prior written permission 21 * 22 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 23 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 24 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 25 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 26 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 27 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 28 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 29 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 30 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 31 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 32 */ 33 34 #include <sys/types.h> 35 36 #include <lib/libsa/stand.h> 37 #include <ufs.h> 38 #include <ustarfs.h> 39 40 #include "samachdep.h" 41 #include "amigaio.h" 42 #include "libstubs.h" 43 44 static int xdstrategy(void *, int, daddr_t, size_t, void *, size_t *); 45 static int xdopenclose(struct open_file *); 46 static int xdioctl(struct open_file *, u_long, void *); 47 48 u_int32_t aio_base; 49 static struct AmigaIO *aio_save; 50 51 struct devsw devsw[] = { 52 { "xd", xdstrategy, (void *)xdopenclose, (void *)xdopenclose, xdioctl } 53 }; 54 55 struct fs_ops file_system[] = { 56 FS_OPS(ufs), 57 FS_OPS(ustarfs), 58 }; 59 60 int nfsys = sizeof(file_system)/sizeof(struct fs_ops); 61 62 63 64 /* called from configure */ 65 66 void 67 xdinit(void *aio) 68 { 69 aio_save = aio; 70 aio_base = aio_save->offset; 71 } 72 73 /* 74 * Kernel ist loaded from device and partition the kickstart 75 * menu or boot priority has chosen: 76 */ 77 78 int 79 devopen(struct open_file *f, const char *fname, char **file) 80 { 81 f->f_devdata = aio_save; 82 f->f_dev = &devsw[0]; 83 *file = (char *)fname; 84 return 0; 85 } 86 87 /* tell kickstart to do the real work */ 88 89 static int 90 xdstrategy(void *devd, int flag, daddr_t dblk, size_t size, void *buf, 91 size_t *rsize) 92 { 93 struct AmigaIO *aio = (struct AmigaIO *)devd; 94 95 if (flag != F_READ) 96 return EIO; 97 98 aio->cmd = Cmd_Rd; 99 aio->length = size; 100 aio->offset = aio_base + (dblk << 9); 101 aio->buf = buf; 102 103 #ifdef XDDEBUG 104 printf("strategy called: %ld(%ld), %ld, 0x%lx\n", 105 (long)dblk, (long)aio->offset, (long)size, (unsigned long)buf); 106 #endif 107 108 DoIO(aio); 109 110 #ifdef XDDEBUG 111 printf("strategy got err %ld, rsize %ld\n", (long)aio->err, (long)aio->actual); 112 #endif 113 114 if (aio->err) { 115 *rsize = 0; 116 return EIO; 117 } 118 119 *rsize = aio->actual; 120 return 0; 121 } 122 123 124 /* nothing do do for these: */ 125 126 static int 127 xdopenclose(struct open_file *f) 128 { 129 aio_save->offset = aio_base; /* Restore original offset */ 130 return 0; 131 } 132 133 static int 134 xdioctl(struct open_file *f, u_long cmd, void *data) 135 { 136 return EIO; 137 } 138 139 #ifdef _PRIMARY_BOOT 140 void 141 xdreset(void) 142 { 143 aio_save->offset = aio_base; /* Restore original offset */ 144 } 145 #endif 146