1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
|
/* $OpenBSD: biovar.h,v 1.5 2005/04/06 02:11:25 marco Exp $ */
/*
* Copyright (c) 2002 Niklas Hallqvist. 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.
*
* 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.
*/
/*
* Devices getting ioctls through this interface should use ioctl class 'B'
* and command numbers starting from 32, lower ones are reserved for generic
* ioctls. All ioctl data must be structures which start with a void *
* cookie.
*/
#include <sys/types.h>
struct bio_common {
void *cookie;
};
#define BIOCLOCATE _IOWR('B', 0, struct bio_locate)
struct bio_locate {
void *cookie;
char *name;
};
#ifdef _KERNEL
int bio_register(struct device *, int (*)(struct device *, u_long,
caddr_t));
#endif
/* RAID section */
#define BIOC_MAX_CDB 16
#define BIOC_MAX_SENSE 32
#define BIOC_MAX_PHYSDISK 128 /* based on FC arrays */
#define BIOC_MAX_VIRTDISK 128 /* based on FC arrays */
/* ioctl tunnel defines */
/* SHALL be implemented */
#define BIOCPING _IOWR('B', 32, bioc_ping)
typedef struct _bioc_ping {
void *cookie;
int x;
} bioc_ping;
/* SHALL be implemented */
#define BIOCCAPABILITIES _IOWR('B', 33, bioc_capabilities)
typedef struct _bioc_capabilities {
void *cookie;
u_int64_t ioctls; /* bit field, 1 ioctl supported */
#define BIOC_PING 0x01
#define BIOC_ALARM 0x02
#define BIOC_PREP_REMOVAL 0x04
#define BIOC_REBUILD 0x08
#define BIOC_STATUS 0x10
#define BIOC_SCSICMD 0x20
#define BIOC_STARTSTOP 0x40
#define BIOC_BLINK 0x80
u_int32_t raid_types; /* bit field, 1 supported raid type */
#define BIOC_RAID0 0x01
#define BIOC_RAID1 0x02
#define BIOC_RAID3 0x04
#define BIOC_RAID5 0x08
#define BIOC_RAID10 0x10
#define BIOC_RAID01 0x20
#define BIOC_RAID50 0x40
} bioc_capabilities;
/* OPTIONAL */
#define BIOCALARM _IOWR('B', 34, bioc_alarm)
typedef struct _bioc_alarm {
void *cookie;
u_int32_t opcode;
#define BIOCSALARM_DISABLE 0x00
#define BIOCSALARM_ENABLE 0x01
#define BIOCSALARM_SILENCE 0x02
#define BIOCGALARM_STATE 0x03
#define BIOCSALARM_TEST 0x04
u_int8_t state; /* only used with GET function */
} bioc_alarm;
/* OPTIONAL */
#define BIOCSCSICMD _IOWR('B', 35, bioc_scsicmd)
typedef struct _bioc_scsicmd {
void *cookie;
/* in (kernel centric) */
u_int8_t channel;
u_int8_t target;
u_int8_t cdb[BIOC_MAX_CDB];
u_int8_t cdblen;
u_int8_t direction; /* 0 = out, 1 = in, this is userland centric */
#define BIOC_DIROUT 0x00
#define BIOC_DIRIN 0x01
#define BIOC_DIRNONE 0x02
/* out (kernel centric) */
u_int8_t status;
u_int8_t sensebuf[BIOC_MAX_SENSE];
u_int8_t senselen;
/* in & out (kernel centric) */
void *data;
u_int32_t datalen; /* going in it governs the maximum buffer size
going out it contains actual bytes transfered */
} bioc_scsicmd;
/* OPTIONAL */
#define BIOCSTARTSTOP _IOWR('B', 36, bioc_startstop)
typedef struct _bioc_startstop {
void *cookie;
u_int8_t opcode;
#define BIOCSUNIT_START 0x00
#define BIOCSUNIT_STOP 0x01
u_int8_t channel;
u_int8_t target;
} bioc_startstop;
/* SHALL be implemented */
#define BIOCSTATUS _IOWR('B', 37, bioc_status)
typedef struct _bioc_status {
void *cookie;
u_int8_t opcode;
#define BIOCGSTAT_CHANGE 0x00 /* any changes since last call? */
#define BIOCGSTAT_ALL 0x01 /* get all status */
#define BIOCGSTAT_PHYSDISK 0x02 /* get physical disk status only */
#define BIOCGSTAT_VIRTDISK 0x03 /* get virtual disk status only */
#define BIOCGSTAT_BATTERY 0x04 /* get battery status only */
#define BIOCGSTAT_ENCLOSURE 0x05 /* get enclosure status only */
#define BIOCGSTAT_TEMPERATURE 0x06 /* get temperature status only */
u_int8_t status; /* global status flag */
#define BIOC_STATOK 0x00 /* status is OK */
#define BIOC_STATDEGRAD 0x01 /* status is degraded */
#define BIOC_STATCRIT 0x02 /* status is critical */
#define BIOC_STATBAT 0x04 /* something wrong with battery */
#define BIOC_STATENC 0x08 /* something wrong with enclosure */
#define BIOC_STATTEMP 0x10 /* something is over/under heating */
/* return fields used per request define in opcode */
u_int8_t channels; /* max channels */
u_int8_t buswidth; /* max physical drives per channel */
/* filled in when called with BIOCGSTAT_PHYSDISK set */
u_int8_t pdcount; /* physical disk counter */
u_int8_t physdisk[BIOC_MAX_PHYSDISK];
#define BIOC_PDUNUSED 0x00 /* disk not present */
#define BIOC_PDONLINE 0x01 /* disk present */
#define BIOC_PDOFFLINE 0x02 /* disk present but offline */
#define BIOC_PDINUSE 0x04 /* critical operation in progress */
/* filled in when called with BIOCGSTAT_VIRTDISK set */
u_int8_t vdcount; /* virtual disk counter */
u_int8_t virtdisk[BIOC_MAX_VIRTDISK];
#define BIOC_VDUNUSED 0x00 /* disk not present */
#define BIOC_VDONLINE 0x01 /* disk present */
#define BIOC_VDOFFLINE 0x02 /* disk present but offline */
#define BIOC_VDINUSE 0x04 /* critical operation in progress */
/* filled in when called with BIOCGSTAT_BATTERY set */
u_int8_t batstat; /* battery status */
#define BIOC_BATNOTPRES 0x00 /* battery not present */
#define BIOC_BATMISSING 0x01 /* battery removed */
#define BIOC_BATVOLTERR 0x02 /* battery low/high power */
#define BIOC_BATTEMP 0x04 /* battery over/under temp*/
/* NOTYET: encloure status & temperature status */
} bioc_status;
/* OPTIONAL */
/* depending on the controller it is handled either in userland or in kernel */
#define BIOCBLINK _IOWR('B', 38, bioc_blink)
typedef struct _bioc_blink {
void *cookie;
u_int8_t opcode;
#define BIOCSBLINK_BLINK 0x00
#define BIOCSBLINK_UNBLINK 0x01
#define BIOCSBLINK_ALERT 0x02
u_int8_t channel;
u_int8_t target;
} bioc_blink;
|