xref: /freebsd/lib/libdevctl/devctl.3 (revision d48a2d23039536ab9f92f88a72c27b9895796abf)
1.\"
2.\" Copyright (c) 2014 John Baldwin <jhb@FreeBSD.org>
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 THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
15.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
18.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24.\" SUCH DAMAGE.
25.\"
26.\" $FreeBSD$
27.\"
28.Dd February 2, 2016
29.Dt DEVCTL 3
30.Os
31.Sh NAME
32.Nm devctl ,
33.Nm devctl_attach ,
34.Nm devctl_detach ,
35.Nm devctl_disable ,
36.Nm devctl_enable ,
37.Nm devctl_resume ,
38.Nm devctl_set_driver ,
39.Nm devctl_suspend
40.Nd device control library
41.Sh LIBRARY
42.Lb libdevctl
43.Sh SYNOPSIS
44.In devctl.h
45.Ft int
46.Fn devctl_attach "const char *device"
47.Ft int
48.Fn devctl_detach "const char *device" "bool force"
49.Ft int
50.Fn devctl_disable "const char *device" "bool force_detach"
51.Ft int
52.Fn devctl_enable "const char *device"
53.Ft int
54.Fn devctl_resume "const char *device"
55.Ft int
56.Fn devctl_set_driver "const char *device" "const char *driver" "bool force"
57.Ft int
58.Fn devctl_suspend "const char *device"
59.Sh DESCRIPTION
60The
61.Nm
62library adjusts the state of devices in the kernel's internal device
63hierarchy.
64Each control operation accepts a
65.Fa device
66argument that identifies the device to adjust.
67The
68.Fa device
69may be specified as either the name of an existing device or as a
70bus-specific address.
71The following bus-specific address formats are currently supported:
72.Bl -tag -offset indent
73.It Sy pci Ns Fa domain Ns : Ns Fa bus Ns : Ns Fa slot Ns : Ns Fa function
74A PCI device with the specified
75.Fa domain ,
76.Fa bus ,
77.Fa slot ,
78and
79.Fa function .
80.It Sy pci Ns Fa bus Ns : Ns Fa slot Ns : Ns Fa function
81A PCI device in domain zero with the specified
82.Fa bus ,
83.Fa slot ,
84and
85.Fa function .
86.It Fa handle
87A device with an ACPI handle of
88.Fa handle .
89The handle must be specified as an absolute path and must begin with a
90.Dq \e .
91.El
92.Pp
93The
94.Fn devctl_attach
95function probes a device and attaches a suitable device driver if one is
96found.
97.Pp
98The
99.Fn devctl_detach
100function detaches a device from its current device driver.
101The device is left detached until either a new driver for its parent
102bus is loaded or the device is explicitly probed via
103.Fn devctl_attach .
104If
105.Fa force
106is true,
107the current device driver will be detached even if the device is busy.
108.Pp
109The
110.Fn devctl_disable
111function disables a device.
112If the device is currently attached to a device driver,
113the device driver will be detached from the device,
114but the device will retain its current name.
115If
116.Fa force_detach
117is true,
118the current device driver will be detached even if the device is busy.
119The device will remain disabled and detached until it is explicitly enabled
120via
121.Fn devctl_enable .
122.Pp
123The
124.Fn devctl_enable
125function re-enables a disabled device.
126The device will probe and attach if a suitable device driver is found.
127.Pp
128The
129.Fn devctl_suspend
130function suspends a device.
131This may include placing the device in a reduced power state,
132but any device driver currently attached to the device will remain attached.
133.Pp
134The
135.Fn devctl_resume
136function resumes a suspended device to a fully working state.
137.Pp
138The
139.Fn devctl_set_driver
140function attaches a device driver named
141.Fa driver
142to a device.
143If the device is already attached and
144.Fa force
145is false,
146the request will fail.
147If the device is already attached and
148.Fa force
149is true,
150the device will be detached from its current device driver before it is
151attached to the new device driver.
152.Sh RETURN VALUES
153.Rv -std devctl_attach devctl_detach devctl_disable devctl_enable \
154devctl_suspend devctl_resume devctl_set_driver
155.Sh ERRORS
156In addition to specific errors noted below,
157all of the
158.Nm
159functions may fail for any of the errors described in
160.Xr open 2
161as well as:
162.Bl -tag -width Er
163.It Bq Er EINVAL
164The device name is too long.
165.It Bq Er ENOENT
166No existing device matches the specified name or location.
167.It Bq Er EPERM
168The current process is not permitted to adjust the state of
169.Fa device .
170.El
171.Pp
172The
173.Fn devctl_attach
174function may fail if:
175.Bl -tag -width Er
176.It Bq Er EBUSY
177The device is already attached.
178.It Bq Er ENOMEM
179An internal memory allocation request failed.
180.It Bq Er ENXIO
181The device is disabled.
182.It Bq Er ENXIO
183No suitable driver for the device could be found,
184or the driver failed to attach.
185.El
186.Pp
187The
188.Fn devctl_detach
189function may fail if:
190.Bl -tag -width Er
191.It Bq Er EBUSY
192The current device driver for
193.Fa device
194is busy and cannot detach at this time.
195Note that some drivers may return this even if
196.Fa force
197is true.
198.It Bq Er ENXIO
199The device is not attached to a driver.
200.It Bq Er ENXIO
201The current device driver for
202.Fa device
203does not support detaching.
204.El
205.Pp
206The
207.Fn devctl_enable
208function may fail if:
209.Bl -tag -width Er
210.It Bq Er EBUSY
211The device is already enabled.
212.It Bq Er ENOMEM
213An internal memory allocation request failed.
214.It Bq Er ENXIO
215No suitable driver for the device could be found,
216or the driver failed to attach.
217.El
218.Pp
219The
220.Fn devctl_disable
221function may fail if:
222.Bl -tag -width Er
223.It Bq Er EBUSY
224The current device driver for
225.Fa device
226is busy and cannot detach at this time.
227Note that some drivers may return this even if
228.Fa force_detach
229is true.
230.It Bq Er ENXIO
231The device is already disabled.
232.It Bq Er ENXIO
233The current device driver for
234.Fa device
235does not support detaching.
236.El
237.Pp
238The
239.Fn devctl_suspend
240function may fail if:
241.Bl -tag -width Er
242.It Bq Er EBUSY
243The device is already suspended.
244.It Bq Er EINVAL
245The device to be suspended is the root bus device.
246.El
247.Pp
248The
249.Fn devctl_resume
250function may fail if:
251.Bl -tag -width Er
252.It Bq Er EINVAL
253The device is not suspended.
254.It Bq Er EINVAL
255The device to be resumed is the root bus device.
256.El
257.Pp
258The
259.Fn devctl_set_driver
260function may fail if:
261.Bl -tag -width Er
262.It Bq Er EBUSY
263The device is currently attached to a device driver and
264.Fa force
265is false.
266.It Bq Er EBUSY
267The current device driver for
268.Fa device
269is busy and cannot detach at this time.
270.It Bq Er EFAULT
271The
272.Fa driver
273argument points outside the process' allocated address space.
274.It Bq Er ENOENT
275No device driver with the requested name exists.
276.It Bq Er ENOMEM
277An internal memory allocation request failed.
278.It Bq Er ENXIO
279The device is disabled.
280.It Bq Er ENXIO
281The new device driver failed to attach.
282.El
283.Sh SEE ALSO
284.Xr devinfo 3 ,
285.Xr devstat 3 ,
286.Xr devctl 8
287.Sh HISTORY
288The
289.Nm
290library first appeared in
291.Fx 10.3 .
292.Sh BUGS
293If a device is suspended individually via
294.Fn devctl_suspend
295and the entire machine is subsequently suspended,
296the device will be resumed when the machine resumes.
297