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
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
|
/*
* CDDL HEADER START
*
* The contents of this file are subject to the terms of the
* Common Development and Distribution License, Version 1.0 only
* (the "License"). You may not use this file except in compliance
* with the License.
*
* You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
* or http://www.opensolaris.org/os/licensing.
* See the License for the specific language governing permissions
* and limitations under the License.
*
* When distributing Covered Code, include this CDDL HEADER in each
* file and include the License file at usr/src/OPENSOLARIS.LICENSE.
* If applicable, add the following below this CDDL HEADER, with the
* fields enclosed by brackets "[]" replaced with your own identifying
* information: Portions Copyright [yyyy] [name of copyright owner]
*
* CDDL HEADER END
*/
/*
* Copyright 2004 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
#ifndef _SYS_DEVCTL_H
#define _SYS_DEVCTL_H
#pragma ident "%Z%%M% %I% %E% SMI"
/*
* Device control interfaces
*/
#include <sys/types.h>
#include <sys/nvpair.h>
#ifdef __cplusplus
extern "C" {
#endif
/*
* structure used to pass IOCTL data between the libdevice interfaces
* and nexus driver devctl IOCTL interface.
*
* Applications and nexus drivers may not access the contents of this
* structure directly. Instead, drivers must use the ndi_dc_XXX(9n)
* interfaces, while applications must use the interfaces provided by
* libdevice.so.1.
*/
struct devctl_iocdata {
uint_t cmd; /* ioctl cmd */
uint_t flags; /* command-specific flags */
void *cpyout_buf; /* copyout vector */
nvlist_t *nvl_user; /* application defined attributes */
size_t nvl_usersz;
char *c_nodename; /* child device nodename */
char *c_unitaddr; /* child device unit address */
};
#if defined(_SYSCALL32)
/*
* Structure to pass/return data from 32-bit program's.
*/
struct devctl_iocdata32 {
uint32_t cmd;
uint32_t flags;
caddr32_t cpyout_buf;
caddr32_t nvl_user;
uint32_t nvl_usersz;
caddr32_t c_nodename;
caddr32_t c_unitaddr;
};
#endif
/*
* State of receptacle for an Attachment Point.
*/
typedef enum {
AP_RSTATE_EMPTY,
AP_RSTATE_DISCONNECTED,
AP_RSTATE_CONNECTED
} ap_rstate_t;
/*
* State of occupant for an Attachment Point.
*/
typedef enum {
AP_OSTATE_UNCONFIGURED,
AP_OSTATE_CONFIGURED
} ap_ostate_t;
/*
* condition of an Attachment Point.
*/
typedef enum {
AP_COND_UNKNOWN,
AP_COND_OK,
AP_COND_FAILING,
AP_COND_FAILED,
AP_COND_UNUSABLE
} ap_condition_t;
/*
* structure used to return the state of Attachment Point (AP) thru
* devctl_ap_getstate() interface.
*/
typedef struct devctl_ap_state {
ap_rstate_t ap_rstate; /* receptacle state */
ap_ostate_t ap_ostate; /* occupant state */
ap_condition_t ap_condition; /* condition of AP */
time_t ap_last_change;
uint32_t ap_error_code; /* error code */
uint8_t ap_in_transition;
} devctl_ap_state_t;
#if defined(_SYSCALL32)
/*
* Structure to pass/return data from 32-bit program's.
*/
typedef struct devctl_ap_state32 {
ap_rstate_t ap_rstate; /* receptacle state */
ap_ostate_t ap_ostate; /* occupant state */
ap_condition_t ap_condition; /* condition of AP */
time32_t ap_last_change;
uint32_t ap_error_code; /* error code */
uint8_t ap_in_transition;
} devctl_ap_state32_t;
#endif
#define DEVCTL_IOC (0xDC << 16)
#define DEVCTL_IOC_MAX (DEVCTL_IOC | 0xFFFF)
#define DEVCTL_BUS_QUIESCE (DEVCTL_IOC | 1)
#define DEVCTL_BUS_UNQUIESCE (DEVCTL_IOC | 2)
#define DEVCTL_BUS_RESETALL (DEVCTL_IOC | 3)
#define DEVCTL_BUS_RESET (DEVCTL_IOC | 4)
#define DEVCTL_BUS_GETSTATE (DEVCTL_IOC | 5)
#define DEVCTL_DEVICE_ONLINE (DEVCTL_IOC | 6)
#define DEVCTL_DEVICE_OFFLINE (DEVCTL_IOC | 7)
#define DEVCTL_DEVICE_GETSTATE (DEVCTL_IOC | 9)
#define DEVCTL_DEVICE_RESET (DEVCTL_IOC | 10)
#define DEVCTL_BUS_CONFIGURE (DEVCTL_IOC | 11)
#define DEVCTL_BUS_UNCONFIGURE (DEVCTL_IOC | 12)
#define DEVCTL_DEVICE_REMOVE (DEVCTL_IOC | 13)
#define DEVCTL_AP_CONNECT (DEVCTL_IOC | 14)
#define DEVCTL_AP_DISCONNECT (DEVCTL_IOC | 15)
#define DEVCTL_AP_INSERT (DEVCTL_IOC | 16)
#define DEVCTL_AP_REMOVE (DEVCTL_IOC | 17)
#define DEVCTL_AP_CONFIGURE (DEVCTL_IOC | 18)
#define DEVCTL_AP_UNCONFIGURE (DEVCTL_IOC | 19)
#define DEVCTL_AP_GETSTATE (DEVCTL_IOC | 20)
#define DEVCTL_AP_CONTROL (DEVCTL_IOC | 21)
#define DEVCTL_BUS_DEV_CREATE (DEVCTL_IOC | 22)
#define DEVCTL_PM_BUSY_COMP (DEVCTL_IOC | 23)
#define DEVCTL_PM_IDLE_COMP (DEVCTL_IOC | 24)
#define DEVCTL_PM_RAISE_PWR (DEVCTL_IOC | 25)
#define DEVCTL_PM_LOWER_PWR (DEVCTL_IOC | 26)
#define DEVCTL_PM_CHANGE_PWR_LOW (DEVCTL_IOC | 27)
#define DEVCTL_PM_CHANGE_PWR_HIGH (DEVCTL_IOC | 28)
#define DEVCTL_PM_POWER (DEVCTL_IOC | 29)
#define DEVCTL_PM_PROM_PRINTF (DEVCTL_IOC | 30)
#define DEVCTL_PM_FAIL_SUSPEND (DEVCTL_IOC | 31)
#define DEVCTL_PM_PWR_HAS_CHANGED_ON_RESUME (DEVCTL_IOC | 32)
#define DEVCTL_PM_PUP_WITH_PWR_HAS_CHANGED (DEVCTL_IOC | 34)
#define DEVCTL_PM_BUSY_COMP_TEST (DEVCTL_IOC | 35)
#define DEVCTL_PM_BUS_STRICT_TEST (DEVCTL_IOC | 36)
#define DEVCTL_PM_NO_LOWER_POWER (DEVCTL_IOC | 37)
#define DEVCTL_PM_BUS_NO_INVOL (DEVCTL_IOC | 38)
/*
* is (c) in the range of possible devctl IOCTL commands?
*/
#define IS_DEVCTL(c) (((c) >= DEVCTL_IOC) && ((c) <= DEVCTL_IOC_MAX))
/*
* Device and Bus State definitions
*
* Device state is returned as a set of bit-flags that indicate the current
* operational state of a device node.
*
* Device nodes for leaf devices only contain state information for the
* device itself. Nexus device nodes contain both Bus and Device state
* information.
*
* DEVICE_ONLINE - Device is available for use by the system. Mutually
* exclusive with DEVICE_OFFLINE.
*
* DEVICE_OFFLINE - Device is unavailable for use by the system.
* Mutually exclusive with DEVICE_ONLINE and DEVICE_BUSY.
*
* DEVICE_DOWN - Device has been placed in the "DOWN" state by
* its controlling driver.
*
* DEVICE_BUSY - Device has open instances or nexus has INITALIZED
* children (nexi). A device in this state is by
* definition Online.
*
* Bus state is returned as a set of bit-flags which indicates the
* operational state of a bus associated with the nexus dev_info node.
*
* BUS_ACTIVE - The bus associated with the device node is Active.
* I/O requests from child devices attached to the
* are initiated (or queued for initiation) as they
* are received.
*
* BUS_QUIESCED - The bus associated with the device node has been
* Quieced. I/O requests from child devices attached
* to the bus are held pending until the bus nexus is
* Unquiesced.
*
* BUS_SHUTDOWN - The bus associated with the device node has been
* shutdown by the nexus driver. I/O requests from
* child devices are returned with an error indicating
* the requested operation failed.
*/
#define DEVICE_ONLINE 0x1
#define DEVICE_BUSY 0x2
#define DEVICE_OFFLINE 0x4
#define DEVICE_DOWN 0x8
#define BUS_ACTIVE 0x10
#define BUS_QUIESCED 0x20
#define BUS_SHUTDOWN 0x40
#define DC_DEVI_NODENAME "ndi_dc.devi_nodename"
#define DEVCTL_CONSTRUCT 0x1
#define DEVCTL_OFFLINE 0x2
#ifdef __cplusplus
}
#endif
#endif /* _SYS_DEVCTL_H */
|