1 /* $OpenBSD: biovar.h,v 1.46 2020/06/07 16:51:43 kn Exp $ */ 2 3 /* 4 * Copyright (c) 2002 Niklas Hallqvist. All rights reserved. 5 * Copyright (c) 2005 Marco Peereboom. All rights reserved. 6 * Copyright (c) 2012 Joel Sing <jsing@openbsd.org>. 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 * 17 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 18 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 19 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 20 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 21 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 22 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 23 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 24 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 25 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 26 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 27 */ 28 29 #ifndef _SYS_DEV_BIOVAR_H_ 30 #define _SYS_DEV_BIOVAR_H_ 31 32 /* 33 * Devices getting ioctls through this interface should use ioctl class 'B' 34 * and command numbers starting from 32, lower ones are reserved for generic 35 * ioctls. All ioctl data must be structures which start with a struct bio. 36 */ 37 38 #include <sys/types.h> 39 40 #define BIO_MSG_COUNT 5 41 #define BIO_MSG_LEN 128 42 43 struct bio_msg { 44 int bm_type; 45 #define BIO_MSG_INFO 1 46 #define BIO_MSG_WARN 2 47 #define BIO_MSG_ERROR 3 48 char bm_msg[BIO_MSG_LEN]; 49 }; 50 51 struct bio_status { 52 char bs_controller[16]; 53 int bs_status; 54 #define BIO_STATUS_UNKNOWN 0 55 #define BIO_STATUS_SUCCESS 1 56 #define BIO_STATUS_ERROR 2 57 int bs_msg_count; 58 struct bio_msg bs_msgs[BIO_MSG_COUNT]; 59 }; 60 61 struct bio { 62 void *bio_cookie; 63 struct bio_status bio_status; 64 }; 65 66 /* convert name to a cookie */ 67 #define BIOCLOCATE _IOWR('B', 0, struct bio_locate) 68 struct bio_locate { 69 struct bio bl_bio; 70 char *bl_name; 71 }; 72 73 #define BIOCINQ _IOWR('B', 32, struct bioc_inq) 74 struct bioc_inq { 75 struct bio bi_bio; 76 77 char bi_dev[16]; /* controller device */ 78 int bi_novol; /* nr of volumes */ 79 int bi_nodisk; /* nr of total disks */ 80 }; 81 82 #define BIOCDISK _IOWR('B', 33, struct bioc_disk) 83 /* structure that represents a disk in a RAID volume */ 84 struct bioc_disk { 85 struct bio bd_bio; 86 87 u_int16_t bd_channel; 88 u_int16_t bd_target; 89 u_int16_t bd_lun; 90 u_int16_t bd_other_id; /* unused for now */ 91 92 int bd_volid; /* associate with volume */ 93 int bd_diskid; /* virtual disk */ 94 int bd_status; /* current status */ 95 #define BIOC_SDONLINE 0x00 96 #define BIOC_SDONLINE_S "Online" 97 #define BIOC_SDOFFLINE 0x01 98 #define BIOC_SDOFFLINE_S "Offline" 99 #define BIOC_SDFAILED 0x02 100 #define BIOC_SDFAILED_S "Failed" 101 #define BIOC_SDREBUILD 0x03 102 #define BIOC_SDREBUILD_S "Rebuild" 103 #define BIOC_SDHOTSPARE 0x04 104 #define BIOC_SDHOTSPARE_S "Hot spare" 105 #define BIOC_SDUNUSED 0x05 106 #define BIOC_SDUNUSED_S "Unused" 107 #define BIOC_SDSCRUB 0x06 108 #define BIOC_SDSCRUB_S "Scrubbing" 109 #define BIOC_SDINVALID 0xff 110 #define BIOC_SDINVALID_S "Invalid" 111 uint64_t bd_size; /* size of the disk */ 112 113 char bd_vendor[32]; /* scsi string */ 114 char bd_serial[32]; /* serial number */ 115 char bd_procdev[16]; /* processor device */ 116 117 struct { 118 int bdp_percent; 119 int bdp_seconds; 120 } bd_patrol; 121 }; 122 123 #define BIOCVOL _IOWR('B', 34, struct bioc_vol) 124 /* structure that represents a RAID volume */ 125 struct bioc_vol { 126 struct bio bv_bio; 127 int bv_volid; /* volume id */ 128 129 int16_t bv_percent; /* percent done operation */ 130 u_int16_t bv_seconds; /* seconds of progress so far */ 131 132 int bv_status; /* current status */ 133 #define BIOC_SVONLINE 0x00 134 #define BIOC_SVONLINE_S "Online" 135 #define BIOC_SVOFFLINE 0x01 136 #define BIOC_SVOFFLINE_S "Offline" 137 #define BIOC_SVDEGRADED 0x02 138 #define BIOC_SVDEGRADED_S "Degraded" 139 #define BIOC_SVBUILDING 0x03 140 #define BIOC_SVBUILDING_S "Building" 141 #define BIOC_SVSCRUB 0x04 142 #define BIOC_SVSCRUB_S "Scrubbing" 143 #define BIOC_SVREBUILD 0x05 144 #define BIOC_SVREBUILD_S "Rebuild" 145 #define BIOC_SVINVALID 0xff 146 #define BIOC_SVINVALID_S "Invalid" 147 uint64_t bv_size; /* size of the disk */ 148 int bv_level; /* raid level */ 149 int bv_nodisk; /* nr of drives */ 150 int bv_cache; /* cache mode */ 151 #define BIOC_CVUNKNOWN 0x00 152 #define BIOC_CVUNKNOWN_S "" 153 #define BIOC_CVWRITEBACK 0x01 154 #define BIOC_CVWRITEBACK_S "WB" 155 #define BIOC_CVWRITETHROUGH 0x02 156 #define BIOC_CVWRITETHROUGH_S "WT" 157 158 char bv_dev[16]; /* device */ 159 char bv_vendor[32]; /* scsi string */ 160 }; 161 162 #define BIOCALARM _IOWR('B', 35, struct bioc_alarm) 163 struct bioc_alarm { 164 struct bio ba_bio; 165 int ba_opcode; 166 167 int ba_status; /* only used with get state */ 168 #define BIOC_SADISABLE 0x00 /* disable alarm */ 169 #define BIOC_SAENABLE 0x01 /* enable alarm */ 170 #define BIOC_SASILENCE 0x02 /* silence alarm */ 171 #define BIOC_GASTATUS 0x03 /* get status */ 172 #define BIOC_SATEST 0x04 /* test alarm */ 173 }; 174 175 #define BIOCBLINK _IOWR('B', 36, struct bioc_blink) 176 struct bioc_blink { 177 struct bio bb_bio; 178 u_int16_t bb_channel; 179 u_int16_t bb_target; 180 181 int bb_status; /* current status */ 182 #define BIOC_SBUNBLINK 0x00 /* disable blinking */ 183 #define BIOC_SBBLINK 0x01 /* enable blink */ 184 #define BIOC_SBALARM 0x02 /* enable alarm blink */ 185 }; 186 187 #define BIOCSETSTATE _IOWR('B', 37, struct bioc_setstate) 188 struct bioc_setstate { 189 struct bio bs_bio; 190 u_int16_t bs_channel; 191 u_int16_t bs_target; 192 u_int16_t bs_lun; 193 u_int16_t bs_other_id_type; /* use other_id instead of ctl */ 194 #define BIOC_SSOTHER_UNUSED 0x00 195 #define BIOC_SSOTHER_DEVT 0x01 196 int bs_other_id; /* cram dev_t or other id in here */ 197 198 int bs_status; /* change to this status */ 199 #define BIOC_SSONLINE 0x00 /* online disk */ 200 #define BIOC_SSOFFLINE 0x01 /* offline disk */ 201 #define BIOC_SSHOTSPARE 0x02 /* mark as hotspare */ 202 #define BIOC_SSREBUILD 0x03 /* rebuild on this disk */ 203 int bs_volid; /* volume id for rebuild */ 204 }; 205 206 #define BIOCCREATERAID _IOWR('B', 38, struct bioc_createraid) 207 struct bioc_createraid { 208 struct bio bc_bio; 209 void *bc_dev_list; 210 u_int16_t bc_dev_list_len; 211 int32_t bc_key_disk; 212 #define BIOC_CRMAXLEN 1024 213 u_int16_t bc_level; 214 u_int32_t bc_flags; 215 #define BIOC_SCFORCE 0x01 /* do not assemble, force create */ 216 #define BIOC_SCDEVT 0x02 /* dev_t array or string in dev_list */ 217 #define BIOC_SCNOAUTOASSEMBLE 0x04 /* do not assemble during autoconf */ 218 #define BIOC_SCBOOTABLE 0x08 /* device is bootable */ 219 u_int32_t bc_opaque_size; 220 u_int32_t bc_opaque_flags; 221 #define BIOC_SOINVALID 0x00 /* no opaque pointer */ 222 #define BIOC_SOIN 0x01 /* kernel perspective direction */ 223 #define BIOC_SOOUT 0x02 /* kernel perspective direction */ 224 u_int32_t bc_opaque_status; 225 #define BIOC_SOINOUT_FAILED 0x00 /* operation failed */ 226 #define BIOC_SOINOUT_OK 0x01 /* operation succeeded */ 227 void *bc_opaque; 228 }; 229 230 #define BIOCDELETERAID _IOWR('B', 39, struct bioc_deleteraid) 231 struct bioc_deleteraid { 232 struct bio bd_bio; 233 u_int32_t bd_flags; 234 #define BIOC_SDCLEARMETA 0x01 /* clear metadata region */ 235 char bd_dev[16]; /* device */ 236 }; 237 238 #define BIOCDISCIPLINE _IOWR('B', 40, struct bioc_discipline) 239 struct bioc_discipline { 240 struct bio bd_bio; 241 char bd_dev[16]; 242 u_int32_t bd_cmd; 243 u_int32_t bd_size; 244 void *bd_data; 245 }; 246 247 #define BIOCINSTALLBOOT _IOWR('B', 41, struct bioc_installboot) 248 struct bioc_installboot { 249 struct bio bb_bio; 250 char bb_dev[16]; 251 void *bb_bootblk; 252 void *bb_bootldr; 253 u_int32_t bb_bootblk_size; 254 u_int32_t bb_bootldr_size; 255 }; 256 257 #define BIOCPATROL _IOWR('B', 42, struct bioc_patrol) 258 struct bioc_patrol { 259 struct bio bp_bio; 260 int bp_opcode; 261 #define BIOC_SPSTOP 0x00 /* stop patrol */ 262 #define BIOC_SPSTART 0x01 /* start patrol */ 263 #define BIOC_GPSTATUS 0x02 /* get status */ 264 #define BIOC_SPDISABLE 0x03 /* disable patrol */ 265 #define BIOC_SPAUTO 0x04 /* enable patrol as auto */ 266 #define BIOC_SPMANUAL 0x05 /* enable patrol as manual */ 267 268 int bp_mode; 269 #define BIOC_SPMAUTO 0x00 270 #define BIOC_SPMMANUAL 0x01 271 #define BIOC_SPMDISABLED 0x02 272 int bp_status; /* only used with get state */ 273 #define BIOC_SPSSTOPPED 0x00 274 #define BIOC_SPSREADY 0x01 275 #define BIOC_SPSACTIVE 0x02 276 #define BIOC_SPSABORTED 0xff 277 278 int bp_autoival; 279 int bp_autonext; 280 int bp_autonow; 281 }; 282 283 /* kernel and userspace defines */ 284 #define BIOC_INQ 0x0001 285 #define BIOC_DISK 0x0002 286 #define BIOC_VOL 0x0004 287 #define BIOC_ALARM 0x0008 288 #define BIOC_BLINK 0x0010 289 #define BIOC_SETSTATE 0x0020 290 #define BIOC_CREATERAID 0x0040 291 #define BIOC_DELETERAID 0x0080 292 #define BIOC_DISCIPLINE 0x0100 293 #define BIOC_INSTALLBOOT 0x0200 294 #define BIOC_PATROL 0x0400 295 296 /* user space defines */ 297 #define BIOC_DEVLIST 0x10000 298 299 #ifdef _KERNEL 300 int bio_register(struct device *, int (*)(struct device *, u_long, 301 caddr_t)); 302 void bio_unregister(struct device *); 303 304 void bio_status_init(struct bio_status *, struct device *); 305 void bio_status(struct bio_status *, int, int, const char *, va_list *); 306 307 void bio_info(struct bio_status *, int, const char *, ...); 308 void bio_warn(struct bio_status *, int, const char *, ...); 309 void bio_error(struct bio_status *, int, const char *, ...); 310 #endif 311 312 #endif /* _SYS_DEV_BIOVAR_H_ */ 313