1 /* 2 * Copyright (c) 2003,2004 The DragonFly Project. All rights reserved. 3 * 4 * This code is derived from software contributed to The DragonFly Project 5 * by Matthew Dillon <dillon@backplane.com> 6 * 7 * Redistribution and use in source and binary forms, with or without 8 * modification, are permitted provided that the following conditions 9 * are met: 10 * 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 15 * the documentation and/or other materials provided with the 16 * distribution. 17 * 3. Neither the name of The DragonFly Project nor the names of its 18 * contributors may be used to endorse or promote products derived 19 * from this software without specific, prior written permission. 20 * 21 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 22 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 23 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 24 * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE 25 * COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, 26 * INCIDENTAL, SPECIAL, EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, 27 * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 28 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED 29 * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 30 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT 31 * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 32 * SUCH DAMAGE. 33 * 34 * $DragonFly: src/sys/sys/device.h,v 1.3 2004/07/16 05:51:57 dillon Exp $ 35 */ 36 37 #ifndef _SYS_DEVICE_H_ 38 #define _SYS_DEVICE_H_ 39 40 #ifndef _SYS_MSGPORT_H_ 41 #include <sys/msgport.h> 42 #endif 43 44 /* 45 * This structure is at the base of every CDEVSW port message 46 */ 47 struct cdevmsg { 48 lwkt_msg msg; 49 dev_t dev; 50 }; 51 52 /* 53 * int d_open(dev_t dev, int oflags, int devtype, thread_t td) 54 */ 55 struct cdevmsg_open { 56 struct cdevmsg msg; 57 int oflags; 58 int devtype; 59 struct thread *td; 60 }; 61 62 /* 63 * int d_close(dev_t dev, int fflag, int devtype, thread_t td) 64 */ 65 struct cdevmsg_close { 66 struct cdevmsg msg; 67 int fflag; 68 int devtype; 69 struct thread *td; 70 }; 71 72 /* 73 * void d_strategy(struct buf *bp) 74 */ 75 struct cdevmsg_strategy { 76 struct cdevmsg msg; 77 struct buf *bp; 78 }; 79 80 /* 81 * int d_ioctl(dev_t dev, u_long cmd, caddr_t data, int fflag, thread_t td) 82 */ 83 struct cdevmsg_ioctl { 84 struct cdevmsg msg; 85 u_long cmd; 86 caddr_t data; 87 int fflag; 88 struct thread *td; 89 }; 90 91 /* 92 * void d_dump(dev_t dev) 93 */ 94 struct cdevmsg_dump { 95 struct cdevmsg msg; 96 u_int count; 97 u_int blkno; 98 u_int secsize; 99 }; 100 101 /* 102 * int d_psize(dev_t dev) 103 */ 104 struct cdevmsg_psize { 105 struct cdevmsg msg; 106 int result; 107 }; 108 109 /* 110 * int d_read(dev_t dev, struct uio *uio, int ioflag) 111 */ 112 struct cdevmsg_read { 113 struct cdevmsg msg; 114 struct uio *uio; 115 int ioflag; 116 }; 117 118 /* 119 * int d_write(dev_t dev, struct uio *uio, int ioflag) 120 */ 121 struct cdevmsg_write { 122 struct cdevmsg msg; 123 struct uio *uio; 124 int ioflag; 125 }; 126 127 /* 128 * int d_poll(dev_t dev, int events, thread_t td) 129 */ 130 struct cdevmsg_poll { 131 struct cdevmsg msg; 132 int events; 133 struct thread *td; 134 }; 135 136 /* 137 * int d_kqfilter(dev_t dev, struct knote *kn) 138 */ 139 struct cdevmsg_kqfilter { 140 struct cdevmsg msg; 141 struct knote *kn; 142 int result; 143 }; 144 145 /* 146 * int d_mmap(dev_t dev, vm_offset_t offset, int nprot) 147 */ 148 struct cdevmsg_mmap { 149 struct cdevmsg msg; 150 vm_offset_t offset; 151 int nprot; 152 int result; /* page number */ 153 }; 154 155 union cdevallmsg { 156 struct lwkt_msg am_lmsg; 157 struct cdevmsg am_msg; 158 struct cdevmsg_open am_open; 159 struct cdevmsg_close am_close; 160 struct cdevmsg_strategy am_strategy; 161 struct cdevmsg_ioctl am_ioctl; 162 struct cdevmsg_dump am_dump; 163 struct cdevmsg_psize am_psize; 164 struct cdevmsg_read am_read; 165 struct cdevmsg_write am_write; 166 struct cdevmsg_poll am_poll; 167 struct cdevmsg_kqfilter am_kqfilter; 168 struct cdevmsg_mmap am_mmap; 169 }; 170 171 typedef union cdevallmsg *cdevallmsg_t; 172 typedef struct cdevmsg *cdevmsg_t; 173 typedef struct cdevmsg_open *cdevmsg_open_t; 174 typedef struct cdevmsg_close *cdevmsg_close_t; 175 typedef struct cdevmsg_strategy *cdevmsg_strategy_t; 176 typedef struct cdevmsg_ioctl *cdevmsg_ioctl_t; 177 typedef struct cdevmsg_dump *cdevmsg_dump_t; 178 typedef struct cdevmsg_psize *cdevmsg_psize_t; 179 typedef struct cdevmsg_read *cdevmsg_read_t; 180 typedef struct cdevmsg_write *cdevmsg_write_t; 181 typedef struct cdevmsg_poll *cdevmsg_poll_t; 182 typedef struct cdevmsg_kqfilter *cdevmsg_kqfilter_t; 183 typedef struct cdevmsg_mmap *cdevmsg_mmap_t; 184 185 #define CDEV_CMD_OPEN (MSG_CMD_CDEV|0x0001) 186 #define CDEV_CMD_CLOSE (MSG_CMD_CDEV|0x0002) 187 #define CDEV_CMD_STRATEGY (MSG_CMD_CDEV|0x0003) 188 #define CDEV_CMD_IOCTL (MSG_CMD_CDEV|0x0004) 189 #define CDEV_CMD_DUMP (MSG_CMD_CDEV|0x0005) 190 #define CDEV_CMD_PSIZE (MSG_CMD_CDEV|0x0006) 191 #define CDEV_CMD_READ (MSG_CMD_CDEV|0x0007) 192 #define CDEV_CMD_WRITE (MSG_CMD_CDEV|0x0008) 193 #define CDEV_CMD_POLL (MSG_CMD_CDEV|0x0009) 194 #define CDEV_CMD_KQFILTER (MSG_CMD_CDEV|0x000A) 195 #define CDEV_CMD_MMAP (MSG_CMD_CDEV|0x000B) 196 197 #ifdef _KERNEL 198 199 struct disk; 200 201 const char *dev_dname(dev_t dev); 202 struct lwkt_port *dev_dport(dev_t dev); 203 int dev_dflags(dev_t dev); 204 int dev_dmaj(dev_t dev); 205 int dev_dopen(dev_t dev, int oflags, int devtype, struct thread *td); 206 int dev_dclose(dev_t dev, int fflag, int devtype, struct thread *td); 207 void dev_dstrategy(dev_t dev, struct buf *bp); 208 int dev_dioctl(dev_t dev, u_long cmd, caddr_t data, int fflag, struct thread *td); 209 int dev_ddump(dev_t dev); 210 int dev_dpsize(dev_t dev); 211 int dev_dread(dev_t dev, struct uio *uio, int ioflag); 212 int dev_dwrite(dev_t dev, struct uio *uio, int ioflag); 213 int dev_dpoll(dev_t dev, int events, struct thread *td); 214 int dev_dkqfilter(dev_t dev, struct knote *kn); 215 int dev_dmmap(dev_t dev, vm_offset_t offset, int nprot); 216 217 #endif 218 219 #endif 220 221