ofw_disk.c revision 106738
1/* 2 * Copyright (C) 2000 Benno Rice. 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 1. Redistributions of source code must retain the above copyright 9 * notice, this list of conditions and the following disclaimer. 10 * 2. Redistributions in binary form must reproduce the above copyright 11 * notice, this list of conditions and the following disclaimer in the 12 * documentation and/or other materials provided with the distribution. 13 * 14 * THIS SOFTWARE IS PROVIDED BY Benno Rice ``AS IS'' AND ANY EXPRESS OR 15 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 16 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 17 * IN NO EVENT SHALL TOOLS GMBH BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 18 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 19 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; 20 * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 21 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR 22 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF 23 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 24 * 25 * $FreeBSD: head/sys/boot/ofw/libofw/ofw_disk.c 106738 2002-11-10 19:17:36Z jake $ 26 */ 27 28/* 29 * Disk I/O routines using Open Firmware 30 */ 31 32#include <sys/param.h> 33#include <sys/disklabel.h> 34 35#include <netinet/in.h> 36 37#include <machine/stdarg.h> 38 39#include <stand.h> 40 41#include "bootstrap.h" 42#include "libofw.h" 43 44static int ofwd_init(void); 45static int ofwd_strategy(void *devdata, int flag, daddr_t dblk, 46 size_t size, char *buf, size_t *rsize); 47static int ofwd_open(struct open_file *f, ...); 48static int ofwd_close(struct open_file *f); 49static int ofwd_ioctl(struct open_file *f, u_long cmd, void *data); 50static void ofwd_print(int verbose); 51 52struct devsw ofwdisk = { 53 "block", 54 DEVT_DISK, 55 ofwd_init, 56 ofwd_strategy, 57 ofwd_open, 58 ofwd_close, 59 ofwd_ioctl, 60 ofwd_print 61}; 62 63static int 64ofwd_init(void) 65{ 66 return 0; 67} 68 69static int 70ofwd_strategy(void *devdata, int flag, daddr_t dblk, size_t size, char *buf, 71 size_t *rsize) 72{ 73 struct ofw_devdesc *dp = (struct ofw_devdesc *)devdata; 74 unsigned long pos; 75 int n; 76 int i, j; 77 78 pos = dblk * 512; 79 do { 80 if (OF_seek(dp->d_handle, pos) < 0) 81 return EIO; 82 n = OF_read(dp->d_handle, buf, size); 83 if (n < 0 && n != -2) 84 return EIO; 85 } while (n == -2); 86 *rsize = size; 87 return 0; 88} 89 90static int 91ofwd_open(struct open_file *f, ...) 92{ 93 struct ofw_devdesc *dp; 94 phandle_t handle; 95 va_list vl; 96 97 va_start(vl, f); 98 dp = va_arg(vl, struct ofw_devdesc *); 99 va_end(vl); 100 if ((handle = OF_open(dp->d_path)) == -1) { 101 printf("ofwd_open: Could not open %s\n", dp->d_path); 102 return 1; 103 } 104 dp->d_handle = handle; 105 return 0; 106} 107 108static int 109ofwd_close(struct open_file *f) 110{ 111 struct ofw_devdesc *dev = f->f_devdata; 112 113 OF_close(dev->d_handle); 114 return 0; 115} 116 117static int 118ofwd_ioctl(struct open_file *f, u_long cmd, void *data) 119{ 120 121 return (EINVAL); 122} 123 124static void 125ofwd_print(int verbose) 126{ 127} 128