xref: /OK3568_Linux_fs/kernel/Documentation/userspace-api/ioctl/hdio.rst (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun==============================
2*4882a593SmuzhiyunSummary of `HDIO_` ioctl calls
3*4882a593Smuzhiyun==============================
4*4882a593Smuzhiyun
5*4882a593Smuzhiyun- Edward A. Falk <efalk@google.com>
6*4882a593Smuzhiyun
7*4882a593SmuzhiyunNovember, 2004
8*4882a593Smuzhiyun
9*4882a593SmuzhiyunThis document attempts to describe the ioctl(2) calls supported by
10*4882a593Smuzhiyunthe HD/IDE layer.  These are by-and-large implemented (as of Linux 2.6)
11*4882a593Smuzhiyunin drivers/ide/ide.c and drivers/block/scsi_ioctl.c
12*4882a593Smuzhiyun
13*4882a593Smuzhiyunioctl values are listed in <linux/hdreg.h>.  As of this writing, they
14*4882a593Smuzhiyunare as follows:
15*4882a593Smuzhiyun
16*4882a593Smuzhiyun    ioctls that pass argument pointers to user space:
17*4882a593Smuzhiyun
18*4882a593Smuzhiyun	=======================	=======================================
19*4882a593Smuzhiyun	HDIO_GETGEO		get device geometry
20*4882a593Smuzhiyun	HDIO_GET_UNMASKINTR	get current unmask setting
21*4882a593Smuzhiyun	HDIO_GET_MULTCOUNT	get current IDE blockmode setting
22*4882a593Smuzhiyun	HDIO_GET_QDMA		get use-qdma flag
23*4882a593Smuzhiyun	HDIO_SET_XFER		set transfer rate via proc
24*4882a593Smuzhiyun	HDIO_OBSOLETE_IDENTITY	OBSOLETE, DO NOT USE
25*4882a593Smuzhiyun	HDIO_GET_KEEPSETTINGS	get keep-settings-on-reset flag
26*4882a593Smuzhiyun	HDIO_GET_32BIT		get current io_32bit setting
27*4882a593Smuzhiyun	HDIO_GET_NOWERR		get ignore-write-error flag
28*4882a593Smuzhiyun	HDIO_GET_DMA		get use-dma flag
29*4882a593Smuzhiyun	HDIO_GET_NICE		get nice flags
30*4882a593Smuzhiyun	HDIO_GET_IDENTITY	get IDE identification info
31*4882a593Smuzhiyun	HDIO_GET_WCACHE		get write cache mode on|off
32*4882a593Smuzhiyun	HDIO_GET_ACOUSTIC	get acoustic value
33*4882a593Smuzhiyun	HDIO_GET_ADDRESS	get sector addressing mode
34*4882a593Smuzhiyun	HDIO_GET_BUSSTATE	get the bus state of the hwif
35*4882a593Smuzhiyun	HDIO_TRISTATE_HWIF	execute a channel tristate
36*4882a593Smuzhiyun	HDIO_DRIVE_RESET	execute a device reset
37*4882a593Smuzhiyun	HDIO_DRIVE_TASKFILE	execute raw taskfile
38*4882a593Smuzhiyun	HDIO_DRIVE_TASK		execute task and special drive command
39*4882a593Smuzhiyun	HDIO_DRIVE_CMD		execute a special drive command
40*4882a593Smuzhiyun	HDIO_DRIVE_CMD_AEB	HDIO_DRIVE_TASK
41*4882a593Smuzhiyun	=======================	=======================================
42*4882a593Smuzhiyun
43*4882a593Smuzhiyun    ioctls that pass non-pointer values:
44*4882a593Smuzhiyun
45*4882a593Smuzhiyun	=======================	=======================================
46*4882a593Smuzhiyun	HDIO_SET_MULTCOUNT	change IDE blockmode
47*4882a593Smuzhiyun	HDIO_SET_UNMASKINTR	permit other irqs during I/O
48*4882a593Smuzhiyun	HDIO_SET_KEEPSETTINGS	keep ioctl settings on reset
49*4882a593Smuzhiyun	HDIO_SET_32BIT		change io_32bit flags
50*4882a593Smuzhiyun	HDIO_SET_NOWERR		change ignore-write-error flag
51*4882a593Smuzhiyun	HDIO_SET_DMA		change use-dma flag
52*4882a593Smuzhiyun	HDIO_SET_PIO_MODE	reconfig interface to new speed
53*4882a593Smuzhiyun	HDIO_SCAN_HWIF		register and (re)scan interface
54*4882a593Smuzhiyun	HDIO_SET_NICE		set nice flags
55*4882a593Smuzhiyun	HDIO_UNREGISTER_HWIF	unregister interface
56*4882a593Smuzhiyun	HDIO_SET_WCACHE		change write cache enable-disable
57*4882a593Smuzhiyun	HDIO_SET_ACOUSTIC	change acoustic behavior
58*4882a593Smuzhiyun	HDIO_SET_BUSSTATE	set the bus state of the hwif
59*4882a593Smuzhiyun	HDIO_SET_QDMA		change use-qdma flag
60*4882a593Smuzhiyun	HDIO_SET_ADDRESS	change lba addressing modes
61*4882a593Smuzhiyun
62*4882a593Smuzhiyun	HDIO_SET_IDE_SCSI	Set scsi emulation mode on/off
63*4882a593Smuzhiyun	HDIO_SET_SCSI_IDE	not implemented yet
64*4882a593Smuzhiyun	=======================	=======================================
65*4882a593Smuzhiyun
66*4882a593Smuzhiyun
67*4882a593SmuzhiyunThe information that follows was determined from reading kernel source
68*4882a593Smuzhiyuncode.  It is likely that some corrections will be made over time.
69*4882a593Smuzhiyun
70*4882a593Smuzhiyun------------------------------------------------------------------------------
71*4882a593Smuzhiyun
72*4882a593SmuzhiyunGeneral:
73*4882a593Smuzhiyun
74*4882a593Smuzhiyun	Unless otherwise specified, all ioctl calls return 0 on success
75*4882a593Smuzhiyun	and -1 with errno set to an appropriate value on error.
76*4882a593Smuzhiyun
77*4882a593Smuzhiyun	Unless otherwise specified, all ioctl calls return -1 and set
78*4882a593Smuzhiyun	errno to EFAULT on a failed attempt to copy data to or from user
79*4882a593Smuzhiyun	address space.
80*4882a593Smuzhiyun
81*4882a593Smuzhiyun	Unless otherwise specified, all data structures and constants
82*4882a593Smuzhiyun	are defined in <linux/hdreg.h>
83*4882a593Smuzhiyun
84*4882a593Smuzhiyun------------------------------------------------------------------------------
85*4882a593Smuzhiyun
86*4882a593SmuzhiyunHDIO_GETGEO
87*4882a593Smuzhiyun	get device geometry
88*4882a593Smuzhiyun
89*4882a593Smuzhiyun
90*4882a593Smuzhiyun	usage::
91*4882a593Smuzhiyun
92*4882a593Smuzhiyun	  struct hd_geometry geom;
93*4882a593Smuzhiyun
94*4882a593Smuzhiyun	  ioctl(fd, HDIO_GETGEO, &geom);
95*4882a593Smuzhiyun
96*4882a593Smuzhiyun
97*4882a593Smuzhiyun	inputs:
98*4882a593Smuzhiyun		none
99*4882a593Smuzhiyun
100*4882a593Smuzhiyun
101*4882a593Smuzhiyun
102*4882a593Smuzhiyun	outputs:
103*4882a593Smuzhiyun		hd_geometry structure containing:
104*4882a593Smuzhiyun
105*4882a593Smuzhiyun
106*4882a593Smuzhiyun	    =========	==================================
107*4882a593Smuzhiyun	    heads	number of heads
108*4882a593Smuzhiyun	    sectors	number of sectors/track
109*4882a593Smuzhiyun	    cylinders	number of cylinders, mod 65536
110*4882a593Smuzhiyun	    start	starting sector of this partition.
111*4882a593Smuzhiyun	    =========	==================================
112*4882a593Smuzhiyun
113*4882a593Smuzhiyun
114*4882a593Smuzhiyun	error returns:
115*4882a593Smuzhiyun	  - EINVAL
116*4882a593Smuzhiyun
117*4882a593Smuzhiyun			if the device is not a disk drive or floppy drive,
118*4882a593Smuzhiyun			or if the user passes a null pointer
119*4882a593Smuzhiyun
120*4882a593Smuzhiyun
121*4882a593Smuzhiyun	notes:
122*4882a593Smuzhiyun		Not particularly useful with modern disk drives, whose geometry
123*4882a593Smuzhiyun		is a polite fiction anyway.  Modern drives are addressed
124*4882a593Smuzhiyun		purely by sector number nowadays (lba addressing), and the
125*4882a593Smuzhiyun		drive geometry is an abstraction which is actually subject
126*4882a593Smuzhiyun		to change.  Currently (as of Nov 2004), the geometry values
127*4882a593Smuzhiyun		are the "bios" values -- presumably the values the drive had
128*4882a593Smuzhiyun		when Linux first booted.
129*4882a593Smuzhiyun
130*4882a593Smuzhiyun		In addition, the cylinders field of the hd_geometry is an
131*4882a593Smuzhiyun		unsigned short, meaning that on most architectures, this
132*4882a593Smuzhiyun		ioctl will not return a meaningful value on drives with more
133*4882a593Smuzhiyun		than 65535 tracks.
134*4882a593Smuzhiyun
135*4882a593Smuzhiyun		The start field is unsigned long, meaning that it will not
136*4882a593Smuzhiyun		contain a meaningful value for disks over 219 Gb in size.
137*4882a593Smuzhiyun
138*4882a593Smuzhiyun
139*4882a593Smuzhiyun
140*4882a593Smuzhiyun
141*4882a593SmuzhiyunHDIO_GET_UNMASKINTR
142*4882a593Smuzhiyun	get current unmask setting
143*4882a593Smuzhiyun
144*4882a593Smuzhiyun
145*4882a593Smuzhiyun	usage::
146*4882a593Smuzhiyun
147*4882a593Smuzhiyun	  long val;
148*4882a593Smuzhiyun
149*4882a593Smuzhiyun	  ioctl(fd, HDIO_GET_UNMASKINTR, &val);
150*4882a593Smuzhiyun
151*4882a593Smuzhiyun	inputs:
152*4882a593Smuzhiyun		none
153*4882a593Smuzhiyun
154*4882a593Smuzhiyun
155*4882a593Smuzhiyun
156*4882a593Smuzhiyun	outputs:
157*4882a593Smuzhiyun		The value of the drive's current unmask setting
158*4882a593Smuzhiyun
159*4882a593Smuzhiyun
160*4882a593Smuzhiyun
161*4882a593Smuzhiyun
162*4882a593Smuzhiyun
163*4882a593SmuzhiyunHDIO_SET_UNMASKINTR
164*4882a593Smuzhiyun	permit other irqs during I/O
165*4882a593Smuzhiyun
166*4882a593Smuzhiyun
167*4882a593Smuzhiyun	usage::
168*4882a593Smuzhiyun
169*4882a593Smuzhiyun	  unsigned long val;
170*4882a593Smuzhiyun
171*4882a593Smuzhiyun	  ioctl(fd, HDIO_SET_UNMASKINTR, val);
172*4882a593Smuzhiyun
173*4882a593Smuzhiyun	inputs:
174*4882a593Smuzhiyun		New value for unmask flag
175*4882a593Smuzhiyun
176*4882a593Smuzhiyun
177*4882a593Smuzhiyun
178*4882a593Smuzhiyun	outputs:
179*4882a593Smuzhiyun		none
180*4882a593Smuzhiyun
181*4882a593Smuzhiyun
182*4882a593Smuzhiyun
183*4882a593Smuzhiyun	error return:
184*4882a593Smuzhiyun	  - EINVAL	Called on a partition instead of the whole disk device
185*4882a593Smuzhiyun	  - EACCES	Access denied:  requires CAP_SYS_ADMIN
186*4882a593Smuzhiyun	  - EINVAL	value out of range [0 1]
187*4882a593Smuzhiyun	  - EBUSY	Controller busy
188*4882a593Smuzhiyun
189*4882a593Smuzhiyun
190*4882a593Smuzhiyun
191*4882a593Smuzhiyun
192*4882a593SmuzhiyunHDIO_GET_MULTCOUNT
193*4882a593Smuzhiyun	get current IDE blockmode setting
194*4882a593Smuzhiyun
195*4882a593Smuzhiyun
196*4882a593Smuzhiyun	usage::
197*4882a593Smuzhiyun
198*4882a593Smuzhiyun	  long val;
199*4882a593Smuzhiyun
200*4882a593Smuzhiyun	  ioctl(fd, HDIO_GET_MULTCOUNT, &val);
201*4882a593Smuzhiyun
202*4882a593Smuzhiyun	inputs:
203*4882a593Smuzhiyun		none
204*4882a593Smuzhiyun
205*4882a593Smuzhiyun
206*4882a593Smuzhiyun
207*4882a593Smuzhiyun	outputs:
208*4882a593Smuzhiyun		The value of the current IDE block mode setting.  This
209*4882a593Smuzhiyun		controls how many sectors the drive will transfer per
210*4882a593Smuzhiyun		interrupt.
211*4882a593Smuzhiyun
212*4882a593Smuzhiyun
213*4882a593Smuzhiyun
214*4882a593SmuzhiyunHDIO_SET_MULTCOUNT
215*4882a593Smuzhiyun	change IDE blockmode
216*4882a593Smuzhiyun
217*4882a593Smuzhiyun
218*4882a593Smuzhiyun	usage::
219*4882a593Smuzhiyun
220*4882a593Smuzhiyun	  int val;
221*4882a593Smuzhiyun
222*4882a593Smuzhiyun	  ioctl(fd, HDIO_SET_MULTCOUNT, val);
223*4882a593Smuzhiyun
224*4882a593Smuzhiyun	inputs:
225*4882a593Smuzhiyun		New value for IDE block mode setting.  This controls how many
226*4882a593Smuzhiyun		sectors the drive will transfer per interrupt.
227*4882a593Smuzhiyun
228*4882a593Smuzhiyun	outputs:
229*4882a593Smuzhiyun		none
230*4882a593Smuzhiyun
231*4882a593Smuzhiyun
232*4882a593Smuzhiyun
233*4882a593Smuzhiyun	error return:
234*4882a593Smuzhiyun	  - EINVAL	Called on a partition instead of the whole disk device
235*4882a593Smuzhiyun	  - EACCES	Access denied:  requires CAP_SYS_ADMIN
236*4882a593Smuzhiyun	  - EINVAL	value out of range supported by disk.
237*4882a593Smuzhiyun	  - EBUSY	Controller busy or blockmode already set.
238*4882a593Smuzhiyun	  - EIO		Drive did not accept new block mode.
239*4882a593Smuzhiyun
240*4882a593Smuzhiyun	notes:
241*4882a593Smuzhiyun	  Source code comments read::
242*4882a593Smuzhiyun
243*4882a593Smuzhiyun	    This is tightly woven into the driver->do_special cannot
244*4882a593Smuzhiyun	    touch.  DON'T do it again until a total personality rewrite
245*4882a593Smuzhiyun	    is committed.
246*4882a593Smuzhiyun
247*4882a593Smuzhiyun	  If blockmode has already been set, this ioctl will fail with
248*4882a593Smuzhiyun	  -EBUSY
249*4882a593Smuzhiyun
250*4882a593Smuzhiyun
251*4882a593Smuzhiyun
252*4882a593SmuzhiyunHDIO_GET_QDMA
253*4882a593Smuzhiyun	get use-qdma flag
254*4882a593Smuzhiyun
255*4882a593Smuzhiyun
256*4882a593Smuzhiyun	Not implemented, as of 2.6.8.1
257*4882a593Smuzhiyun
258*4882a593Smuzhiyun
259*4882a593Smuzhiyun
260*4882a593SmuzhiyunHDIO_SET_XFER
261*4882a593Smuzhiyun	set transfer rate via proc
262*4882a593Smuzhiyun
263*4882a593Smuzhiyun
264*4882a593Smuzhiyun	Not implemented, as of 2.6.8.1
265*4882a593Smuzhiyun
266*4882a593Smuzhiyun
267*4882a593Smuzhiyun
268*4882a593SmuzhiyunHDIO_OBSOLETE_IDENTITY
269*4882a593Smuzhiyun	OBSOLETE, DO NOT USE
270*4882a593Smuzhiyun
271*4882a593Smuzhiyun
272*4882a593Smuzhiyun	Same as HDIO_GET_IDENTITY (see below), except that it only
273*4882a593Smuzhiyun	returns the first 142 bytes of drive identity information.
274*4882a593Smuzhiyun
275*4882a593Smuzhiyun
276*4882a593Smuzhiyun
277*4882a593SmuzhiyunHDIO_GET_IDENTITY
278*4882a593Smuzhiyun	get IDE identification info
279*4882a593Smuzhiyun
280*4882a593Smuzhiyun
281*4882a593Smuzhiyun	usage::
282*4882a593Smuzhiyun
283*4882a593Smuzhiyun	  unsigned char identity[512];
284*4882a593Smuzhiyun
285*4882a593Smuzhiyun	  ioctl(fd, HDIO_GET_IDENTITY, identity);
286*4882a593Smuzhiyun
287*4882a593Smuzhiyun	inputs:
288*4882a593Smuzhiyun		none
289*4882a593Smuzhiyun
290*4882a593Smuzhiyun
291*4882a593Smuzhiyun
292*4882a593Smuzhiyun	outputs:
293*4882a593Smuzhiyun		ATA drive identity information.  For full description, see
294*4882a593Smuzhiyun		the IDENTIFY DEVICE and IDENTIFY PACKET DEVICE commands in
295*4882a593Smuzhiyun		the ATA specification.
296*4882a593Smuzhiyun
297*4882a593Smuzhiyun	error returns:
298*4882a593Smuzhiyun	  - EINVAL	Called on a partition instead of the whole disk device
299*4882a593Smuzhiyun	  - ENOMSG	IDENTIFY DEVICE information not available
300*4882a593Smuzhiyun
301*4882a593Smuzhiyun	notes:
302*4882a593Smuzhiyun		Returns information that was obtained when the drive was
303*4882a593Smuzhiyun		probed.  Some of this information is subject to change, and
304*4882a593Smuzhiyun		this ioctl does not re-probe the drive to update the
305*4882a593Smuzhiyun		information.
306*4882a593Smuzhiyun
307*4882a593Smuzhiyun		This information is also available from /proc/ide/hdX/identify
308*4882a593Smuzhiyun
309*4882a593Smuzhiyun
310*4882a593Smuzhiyun
311*4882a593SmuzhiyunHDIO_GET_KEEPSETTINGS
312*4882a593Smuzhiyun	get keep-settings-on-reset flag
313*4882a593Smuzhiyun
314*4882a593Smuzhiyun
315*4882a593Smuzhiyun	usage::
316*4882a593Smuzhiyun
317*4882a593Smuzhiyun	  long val;
318*4882a593Smuzhiyun
319*4882a593Smuzhiyun	  ioctl(fd, HDIO_GET_KEEPSETTINGS, &val);
320*4882a593Smuzhiyun
321*4882a593Smuzhiyun	inputs:
322*4882a593Smuzhiyun		none
323*4882a593Smuzhiyun
324*4882a593Smuzhiyun
325*4882a593Smuzhiyun
326*4882a593Smuzhiyun	outputs:
327*4882a593Smuzhiyun		The value of the current "keep settings" flag
328*4882a593Smuzhiyun
329*4882a593Smuzhiyun
330*4882a593Smuzhiyun
331*4882a593Smuzhiyun	notes:
332*4882a593Smuzhiyun		When set, indicates that kernel should restore settings
333*4882a593Smuzhiyun		after a drive reset.
334*4882a593Smuzhiyun
335*4882a593Smuzhiyun
336*4882a593Smuzhiyun
337*4882a593SmuzhiyunHDIO_SET_KEEPSETTINGS
338*4882a593Smuzhiyun	keep ioctl settings on reset
339*4882a593Smuzhiyun
340*4882a593Smuzhiyun
341*4882a593Smuzhiyun	usage::
342*4882a593Smuzhiyun
343*4882a593Smuzhiyun	  long val;
344*4882a593Smuzhiyun
345*4882a593Smuzhiyun	  ioctl(fd, HDIO_SET_KEEPSETTINGS, val);
346*4882a593Smuzhiyun
347*4882a593Smuzhiyun	inputs:
348*4882a593Smuzhiyun		New value for keep_settings flag
349*4882a593Smuzhiyun
350*4882a593Smuzhiyun
351*4882a593Smuzhiyun
352*4882a593Smuzhiyun	outputs:
353*4882a593Smuzhiyun		none
354*4882a593Smuzhiyun
355*4882a593Smuzhiyun
356*4882a593Smuzhiyun
357*4882a593Smuzhiyun	error return:
358*4882a593Smuzhiyun	  - EINVAL	Called on a partition instead of the whole disk device
359*4882a593Smuzhiyun	  - EACCES	Access denied:  requires CAP_SYS_ADMIN
360*4882a593Smuzhiyun	  - EINVAL	value out of range [0 1]
361*4882a593Smuzhiyun	  - EBUSY		Controller busy
362*4882a593Smuzhiyun
363*4882a593Smuzhiyun
364*4882a593Smuzhiyun
365*4882a593SmuzhiyunHDIO_GET_32BIT
366*4882a593Smuzhiyun	get current io_32bit setting
367*4882a593Smuzhiyun
368*4882a593Smuzhiyun
369*4882a593Smuzhiyun	usage::
370*4882a593Smuzhiyun
371*4882a593Smuzhiyun	  long val;
372*4882a593Smuzhiyun
373*4882a593Smuzhiyun	  ioctl(fd, HDIO_GET_32BIT, &val);
374*4882a593Smuzhiyun
375*4882a593Smuzhiyun	inputs:
376*4882a593Smuzhiyun		none
377*4882a593Smuzhiyun
378*4882a593Smuzhiyun
379*4882a593Smuzhiyun
380*4882a593Smuzhiyun	outputs:
381*4882a593Smuzhiyun		The value of the current io_32bit setting
382*4882a593Smuzhiyun
383*4882a593Smuzhiyun
384*4882a593Smuzhiyun
385*4882a593Smuzhiyun	notes:
386*4882a593Smuzhiyun		0=16-bit, 1=32-bit, 2,3 = 32bit+sync
387*4882a593Smuzhiyun
388*4882a593Smuzhiyun
389*4882a593Smuzhiyun
390*4882a593Smuzhiyun
391*4882a593Smuzhiyun
392*4882a593SmuzhiyunHDIO_GET_NOWERR
393*4882a593Smuzhiyun	get ignore-write-error flag
394*4882a593Smuzhiyun
395*4882a593Smuzhiyun
396*4882a593Smuzhiyun	usage::
397*4882a593Smuzhiyun
398*4882a593Smuzhiyun	  long val;
399*4882a593Smuzhiyun
400*4882a593Smuzhiyun	  ioctl(fd, HDIO_GET_NOWERR, &val);
401*4882a593Smuzhiyun
402*4882a593Smuzhiyun	inputs:
403*4882a593Smuzhiyun		none
404*4882a593Smuzhiyun
405*4882a593Smuzhiyun
406*4882a593Smuzhiyun
407*4882a593Smuzhiyun	outputs:
408*4882a593Smuzhiyun		The value of the current ignore-write-error flag
409*4882a593Smuzhiyun
410*4882a593Smuzhiyun
411*4882a593Smuzhiyun
412*4882a593Smuzhiyun
413*4882a593Smuzhiyun
414*4882a593SmuzhiyunHDIO_GET_DMA
415*4882a593Smuzhiyun	get use-dma flag
416*4882a593Smuzhiyun
417*4882a593Smuzhiyun
418*4882a593Smuzhiyun	usage::
419*4882a593Smuzhiyun
420*4882a593Smuzhiyun	  long val;
421*4882a593Smuzhiyun
422*4882a593Smuzhiyun	  ioctl(fd, HDIO_GET_DMA, &val);
423*4882a593Smuzhiyun
424*4882a593Smuzhiyun	inputs:
425*4882a593Smuzhiyun		none
426*4882a593Smuzhiyun
427*4882a593Smuzhiyun
428*4882a593Smuzhiyun
429*4882a593Smuzhiyun	outputs:
430*4882a593Smuzhiyun		The value of the current use-dma flag
431*4882a593Smuzhiyun
432*4882a593Smuzhiyun
433*4882a593Smuzhiyun
434*4882a593Smuzhiyun
435*4882a593Smuzhiyun
436*4882a593SmuzhiyunHDIO_GET_NICE
437*4882a593Smuzhiyun	get nice flags
438*4882a593Smuzhiyun
439*4882a593Smuzhiyun
440*4882a593Smuzhiyun	usage::
441*4882a593Smuzhiyun
442*4882a593Smuzhiyun	  long nice;
443*4882a593Smuzhiyun
444*4882a593Smuzhiyun	  ioctl(fd, HDIO_GET_NICE, &nice);
445*4882a593Smuzhiyun
446*4882a593Smuzhiyun	inputs:
447*4882a593Smuzhiyun		none
448*4882a593Smuzhiyun
449*4882a593Smuzhiyun
450*4882a593Smuzhiyun
451*4882a593Smuzhiyun	outputs:
452*4882a593Smuzhiyun		The drive's "nice" values.
453*4882a593Smuzhiyun
454*4882a593Smuzhiyun
455*4882a593Smuzhiyun
456*4882a593Smuzhiyun	notes:
457*4882a593Smuzhiyun		Per-drive flags which determine when the system will give more
458*4882a593Smuzhiyun		bandwidth to other devices sharing the same IDE bus.
459*4882a593Smuzhiyun
460*4882a593Smuzhiyun		See <linux/hdreg.h>, near symbol IDE_NICE_DSC_OVERLAP.
461*4882a593Smuzhiyun
462*4882a593Smuzhiyun
463*4882a593Smuzhiyun
464*4882a593Smuzhiyun
465*4882a593SmuzhiyunHDIO_SET_NICE
466*4882a593Smuzhiyun	set nice flags
467*4882a593Smuzhiyun
468*4882a593Smuzhiyun
469*4882a593Smuzhiyun	usage::
470*4882a593Smuzhiyun
471*4882a593Smuzhiyun	  unsigned long nice;
472*4882a593Smuzhiyun
473*4882a593Smuzhiyun	  ...
474*4882a593Smuzhiyun	  ioctl(fd, HDIO_SET_NICE, nice);
475*4882a593Smuzhiyun
476*4882a593Smuzhiyun	inputs:
477*4882a593Smuzhiyun		bitmask of nice flags.
478*4882a593Smuzhiyun
479*4882a593Smuzhiyun
480*4882a593Smuzhiyun
481*4882a593Smuzhiyun	outputs:
482*4882a593Smuzhiyun		none
483*4882a593Smuzhiyun
484*4882a593Smuzhiyun
485*4882a593Smuzhiyun
486*4882a593Smuzhiyun	error returns:
487*4882a593Smuzhiyun	  - EACCES	Access denied:  requires CAP_SYS_ADMIN
488*4882a593Smuzhiyun	  - EPERM	Flags other than DSC_OVERLAP and NICE_1 set.
489*4882a593Smuzhiyun	  - EPERM	DSC_OVERLAP specified but not supported by drive
490*4882a593Smuzhiyun
491*4882a593Smuzhiyun	notes:
492*4882a593Smuzhiyun		This ioctl sets the DSC_OVERLAP and NICE_1 flags from values
493*4882a593Smuzhiyun		provided by the user.
494*4882a593Smuzhiyun
495*4882a593Smuzhiyun		Nice flags are listed in <linux/hdreg.h>, starting with
496*4882a593Smuzhiyun		IDE_NICE_DSC_OVERLAP.  These values represent shifts.
497*4882a593Smuzhiyun
498*4882a593Smuzhiyun
499*4882a593Smuzhiyun
500*4882a593Smuzhiyun
501*4882a593Smuzhiyun
502*4882a593SmuzhiyunHDIO_GET_WCACHE
503*4882a593Smuzhiyun	get write cache mode on|off
504*4882a593Smuzhiyun
505*4882a593Smuzhiyun
506*4882a593Smuzhiyun	usage::
507*4882a593Smuzhiyun
508*4882a593Smuzhiyun	  long val;
509*4882a593Smuzhiyun
510*4882a593Smuzhiyun	  ioctl(fd, HDIO_GET_WCACHE, &val);
511*4882a593Smuzhiyun
512*4882a593Smuzhiyun	inputs:
513*4882a593Smuzhiyun		none
514*4882a593Smuzhiyun
515*4882a593Smuzhiyun
516*4882a593Smuzhiyun
517*4882a593Smuzhiyun	outputs:
518*4882a593Smuzhiyun		The value of the current write cache mode
519*4882a593Smuzhiyun
520*4882a593Smuzhiyun
521*4882a593Smuzhiyun
522*4882a593Smuzhiyun
523*4882a593Smuzhiyun
524*4882a593SmuzhiyunHDIO_GET_ACOUSTIC
525*4882a593Smuzhiyun	get acoustic value
526*4882a593Smuzhiyun
527*4882a593Smuzhiyun
528*4882a593Smuzhiyun	usage::
529*4882a593Smuzhiyun
530*4882a593Smuzhiyun	  long val;
531*4882a593Smuzhiyun
532*4882a593Smuzhiyun	  ioctl(fd, HDIO_GET_ACOUSTIC, &val);
533*4882a593Smuzhiyun
534*4882a593Smuzhiyun	inputs:
535*4882a593Smuzhiyun		none
536*4882a593Smuzhiyun
537*4882a593Smuzhiyun
538*4882a593Smuzhiyun
539*4882a593Smuzhiyun	outputs:
540*4882a593Smuzhiyun		The value of the current acoustic settings
541*4882a593Smuzhiyun
542*4882a593Smuzhiyun
543*4882a593Smuzhiyun
544*4882a593Smuzhiyun	notes:
545*4882a593Smuzhiyun		See HDIO_SET_ACOUSTIC
546*4882a593Smuzhiyun
547*4882a593Smuzhiyun
548*4882a593Smuzhiyun
549*4882a593Smuzhiyun
550*4882a593Smuzhiyun
551*4882a593SmuzhiyunHDIO_GET_ADDRESS
552*4882a593Smuzhiyun	usage::
553*4882a593Smuzhiyun
554*4882a593Smuzhiyun
555*4882a593Smuzhiyun	  long val;
556*4882a593Smuzhiyun
557*4882a593Smuzhiyun	  ioctl(fd, HDIO_GET_ADDRESS, &val);
558*4882a593Smuzhiyun
559*4882a593Smuzhiyun	inputs:
560*4882a593Smuzhiyun		none
561*4882a593Smuzhiyun
562*4882a593Smuzhiyun
563*4882a593Smuzhiyun
564*4882a593Smuzhiyun	outputs:
565*4882a593Smuzhiyun		The value of the current addressing mode:
566*4882a593Smuzhiyun
567*4882a593Smuzhiyun	    =  ===================
568*4882a593Smuzhiyun	    0  28-bit
569*4882a593Smuzhiyun	    1  48-bit
570*4882a593Smuzhiyun	    2  48-bit doing 28-bit
571*4882a593Smuzhiyun	    3  64-bit
572*4882a593Smuzhiyun	    =  ===================
573*4882a593Smuzhiyun
574*4882a593Smuzhiyun
575*4882a593Smuzhiyun
576*4882a593SmuzhiyunHDIO_GET_BUSSTATE
577*4882a593Smuzhiyun	get the bus state of the hwif
578*4882a593Smuzhiyun
579*4882a593Smuzhiyun
580*4882a593Smuzhiyun	usage::
581*4882a593Smuzhiyun
582*4882a593Smuzhiyun	  long state;
583*4882a593Smuzhiyun
584*4882a593Smuzhiyun	  ioctl(fd, HDIO_SCAN_HWIF, &state);
585*4882a593Smuzhiyun
586*4882a593Smuzhiyun	inputs:
587*4882a593Smuzhiyun		none
588*4882a593Smuzhiyun
589*4882a593Smuzhiyun
590*4882a593Smuzhiyun
591*4882a593Smuzhiyun	outputs:
592*4882a593Smuzhiyun		Current power state of the IDE bus.  One of BUSSTATE_OFF,
593*4882a593Smuzhiyun		BUSSTATE_ON, or BUSSTATE_TRISTATE
594*4882a593Smuzhiyun
595*4882a593Smuzhiyun	error returns:
596*4882a593Smuzhiyun	  - EACCES	Access denied:  requires CAP_SYS_ADMIN
597*4882a593Smuzhiyun
598*4882a593Smuzhiyun
599*4882a593Smuzhiyun
600*4882a593Smuzhiyun
601*4882a593SmuzhiyunHDIO_SET_BUSSTATE
602*4882a593Smuzhiyun	set the bus state of the hwif
603*4882a593Smuzhiyun
604*4882a593Smuzhiyun
605*4882a593Smuzhiyun	usage::
606*4882a593Smuzhiyun
607*4882a593Smuzhiyun	  int state;
608*4882a593Smuzhiyun
609*4882a593Smuzhiyun	  ...
610*4882a593Smuzhiyun	  ioctl(fd, HDIO_SCAN_HWIF, state);
611*4882a593Smuzhiyun
612*4882a593Smuzhiyun	inputs:
613*4882a593Smuzhiyun		Desired IDE power state.  One of BUSSTATE_OFF, BUSSTATE_ON,
614*4882a593Smuzhiyun		or BUSSTATE_TRISTATE
615*4882a593Smuzhiyun
616*4882a593Smuzhiyun	outputs:
617*4882a593Smuzhiyun		none
618*4882a593Smuzhiyun
619*4882a593Smuzhiyun
620*4882a593Smuzhiyun
621*4882a593Smuzhiyun	error returns:
622*4882a593Smuzhiyun	  - EACCES	Access denied:  requires CAP_SYS_RAWIO
623*4882a593Smuzhiyun	  - EOPNOTSUPP	Hardware interface does not support bus power control
624*4882a593Smuzhiyun
625*4882a593Smuzhiyun
626*4882a593Smuzhiyun
627*4882a593Smuzhiyun
628*4882a593SmuzhiyunHDIO_TRISTATE_HWIF
629*4882a593Smuzhiyun	execute a channel tristate
630*4882a593Smuzhiyun
631*4882a593Smuzhiyun
632*4882a593Smuzhiyun	Not implemented, as of 2.6.8.1.  See HDIO_SET_BUSSTATE
633*4882a593Smuzhiyun
634*4882a593Smuzhiyun
635*4882a593Smuzhiyun
636*4882a593SmuzhiyunHDIO_DRIVE_RESET
637*4882a593Smuzhiyun	execute a device reset
638*4882a593Smuzhiyun
639*4882a593Smuzhiyun
640*4882a593Smuzhiyun	usage::
641*4882a593Smuzhiyun
642*4882a593Smuzhiyun	  int args[3]
643*4882a593Smuzhiyun
644*4882a593Smuzhiyun	  ...
645*4882a593Smuzhiyun	  ioctl(fd, HDIO_DRIVE_RESET, args);
646*4882a593Smuzhiyun
647*4882a593Smuzhiyun	inputs:
648*4882a593Smuzhiyun		none
649*4882a593Smuzhiyun
650*4882a593Smuzhiyun
651*4882a593Smuzhiyun
652*4882a593Smuzhiyun	outputs:
653*4882a593Smuzhiyun		none
654*4882a593Smuzhiyun
655*4882a593Smuzhiyun
656*4882a593Smuzhiyun
657*4882a593Smuzhiyun	error returns:
658*4882a593Smuzhiyun	  - EACCES	Access denied:  requires CAP_SYS_ADMIN
659*4882a593Smuzhiyun	  - ENXIO	No such device:	phy dead or ctl_addr == 0
660*4882a593Smuzhiyun	  - EIO		I/O error:	reset timed out or hardware error
661*4882a593Smuzhiyun
662*4882a593Smuzhiyun	notes:
663*4882a593Smuzhiyun
664*4882a593Smuzhiyun	  - Execute a reset on the device as soon as the current IO
665*4882a593Smuzhiyun	    operation has completed.
666*4882a593Smuzhiyun
667*4882a593Smuzhiyun	  - Executes an ATAPI soft reset if applicable, otherwise
668*4882a593Smuzhiyun	    executes an ATA soft reset on the controller.
669*4882a593Smuzhiyun
670*4882a593Smuzhiyun
671*4882a593Smuzhiyun
672*4882a593SmuzhiyunHDIO_DRIVE_TASKFILE
673*4882a593Smuzhiyun	execute raw taskfile
674*4882a593Smuzhiyun
675*4882a593Smuzhiyun
676*4882a593Smuzhiyun	Note:
677*4882a593Smuzhiyun		If you don't have a copy of the ANSI ATA specification
678*4882a593Smuzhiyun		handy, you should probably ignore this ioctl.
679*4882a593Smuzhiyun
680*4882a593Smuzhiyun	- Execute an ATA disk command directly by writing the "taskfile"
681*4882a593Smuzhiyun	  registers of the drive.  Requires ADMIN and RAWIO access
682*4882a593Smuzhiyun	  privileges.
683*4882a593Smuzhiyun
684*4882a593Smuzhiyun	usage::
685*4882a593Smuzhiyun
686*4882a593Smuzhiyun	  struct {
687*4882a593Smuzhiyun
688*4882a593Smuzhiyun	    ide_task_request_t req_task;
689*4882a593Smuzhiyun	    u8 outbuf[OUTPUT_SIZE];
690*4882a593Smuzhiyun	    u8 inbuf[INPUT_SIZE];
691*4882a593Smuzhiyun	  } task;
692*4882a593Smuzhiyun	  memset(&task.req_task, 0, sizeof(task.req_task));
693*4882a593Smuzhiyun	  task.req_task.out_size = sizeof(task.outbuf);
694*4882a593Smuzhiyun	  task.req_task.in_size = sizeof(task.inbuf);
695*4882a593Smuzhiyun	  ...
696*4882a593Smuzhiyun	  ioctl(fd, HDIO_DRIVE_TASKFILE, &task);
697*4882a593Smuzhiyun	  ...
698*4882a593Smuzhiyun
699*4882a593Smuzhiyun	inputs:
700*4882a593Smuzhiyun
701*4882a593Smuzhiyun	  (See below for details on memory area passed to ioctl.)
702*4882a593Smuzhiyun
703*4882a593Smuzhiyun	  ============	===================================================
704*4882a593Smuzhiyun	  io_ports[8]	values to be written to taskfile registers
705*4882a593Smuzhiyun	  hob_ports[8]	high-order bytes, for extended commands.
706*4882a593Smuzhiyun	  out_flags	flags indicating which registers are valid
707*4882a593Smuzhiyun	  in_flags	flags indicating which registers should be returned
708*4882a593Smuzhiyun	  data_phase	see below
709*4882a593Smuzhiyun	  req_cmd	command type to be executed
710*4882a593Smuzhiyun	  out_size	size of output buffer
711*4882a593Smuzhiyun	  outbuf	buffer of data to be transmitted to disk
712*4882a593Smuzhiyun	  inbuf		buffer of data to be received from disk (see [1])
713*4882a593Smuzhiyun	  ============	===================================================
714*4882a593Smuzhiyun
715*4882a593Smuzhiyun	outputs:
716*4882a593Smuzhiyun
717*4882a593Smuzhiyun	  ===========	====================================================
718*4882a593Smuzhiyun	  io_ports[]	values returned in the taskfile registers
719*4882a593Smuzhiyun	  hob_ports[]	high-order bytes, for extended commands.
720*4882a593Smuzhiyun	  out_flags	flags indicating which registers are valid (see [2])
721*4882a593Smuzhiyun	  in_flags	flags indicating which registers should be returned
722*4882a593Smuzhiyun	  outbuf	buffer of data to be transmitted to disk (see [1])
723*4882a593Smuzhiyun	  inbuf		buffer of data to be received from disk
724*4882a593Smuzhiyun	  ===========	====================================================
725*4882a593Smuzhiyun
726*4882a593Smuzhiyun	error returns:
727*4882a593Smuzhiyun	  - EACCES	CAP_SYS_ADMIN or CAP_SYS_RAWIO privilege not set.
728*4882a593Smuzhiyun	  - ENOMSG	Device is not a disk drive.
729*4882a593Smuzhiyun	  - ENOMEM	Unable to allocate memory for task
730*4882a593Smuzhiyun	  - EFAULT	req_cmd == TASKFILE_IN_OUT (not implemented as of 2.6.8)
731*4882a593Smuzhiyun	  - EPERM
732*4882a593Smuzhiyun
733*4882a593Smuzhiyun			req_cmd == TASKFILE_MULTI_OUT and drive
734*4882a593Smuzhiyun			multi-count not yet set.
735*4882a593Smuzhiyun	  - EIO		Drive failed the command.
736*4882a593Smuzhiyun
737*4882a593Smuzhiyun	notes:
738*4882a593Smuzhiyun
739*4882a593Smuzhiyun	  [1] READ THE FOLLOWING NOTES *CAREFULLY*.  THIS IOCTL IS
740*4882a593Smuzhiyun	  FULL OF GOTCHAS.  Extreme caution should be used with using
741*4882a593Smuzhiyun	  this ioctl.  A mistake can easily corrupt data or hang the
742*4882a593Smuzhiyun	  system.
743*4882a593Smuzhiyun
744*4882a593Smuzhiyun	  [2] Both the input and output buffers are copied from the
745*4882a593Smuzhiyun	  user and written back to the user, even when not used.
746*4882a593Smuzhiyun
747*4882a593Smuzhiyun	  [3] If one or more bits are set in out_flags and in_flags is
748*4882a593Smuzhiyun	  zero, the following values are used for in_flags.all and
749*4882a593Smuzhiyun	  written back into in_flags on completion.
750*4882a593Smuzhiyun
751*4882a593Smuzhiyun	   * IDE_TASKFILE_STD_IN_FLAGS | (IDE_HOB_STD_IN_FLAGS << 8)
752*4882a593Smuzhiyun	     if LBA48 addressing is enabled for the drive
753*4882a593Smuzhiyun	   * IDE_TASKFILE_STD_IN_FLAGS
754*4882a593Smuzhiyun	     if CHS/LBA28
755*4882a593Smuzhiyun
756*4882a593Smuzhiyun	  The association between in_flags.all and each enable
757*4882a593Smuzhiyun	  bitfield flips depending on endianness; fortunately, TASKFILE
758*4882a593Smuzhiyun	  only uses inflags.b.data bit and ignores all other bits.
759*4882a593Smuzhiyun	  The end result is that, on any endian machines, it has no
760*4882a593Smuzhiyun	  effect other than modifying in_flags on completion.
761*4882a593Smuzhiyun
762*4882a593Smuzhiyun	  [4] The default value of SELECT is (0xa0|DEV_bit|LBA_bit)
763*4882a593Smuzhiyun	  except for four drives per port chipsets.  For four drives
764*4882a593Smuzhiyun	  per port chipsets, it's (0xa0|DEV_bit|LBA_bit) for the first
765*4882a593Smuzhiyun	  pair and (0x80|DEV_bit|LBA_bit) for the second pair.
766*4882a593Smuzhiyun
767*4882a593Smuzhiyun	  [5] The argument to the ioctl is a pointer to a region of
768*4882a593Smuzhiyun	  memory containing a ide_task_request_t structure, followed
769*4882a593Smuzhiyun	  by an optional buffer of data to be transmitted to the
770*4882a593Smuzhiyun	  drive, followed by an optional buffer to receive data from
771*4882a593Smuzhiyun	  the drive.
772*4882a593Smuzhiyun
773*4882a593Smuzhiyun	  Command is passed to the disk drive via the ide_task_request_t
774*4882a593Smuzhiyun	  structure, which contains these fields:
775*4882a593Smuzhiyun
776*4882a593Smuzhiyun	    ============	===============================================
777*4882a593Smuzhiyun	    io_ports[8]		values for the taskfile registers
778*4882a593Smuzhiyun	    hob_ports[8]	high-order bytes, for extended commands
779*4882a593Smuzhiyun	    out_flags		flags indicating which entries in the
780*4882a593Smuzhiyun				io_ports[] and hob_ports[] arrays
781*4882a593Smuzhiyun				contain valid values.  Type ide_reg_valid_t.
782*4882a593Smuzhiyun	    in_flags		flags indicating which entries in the
783*4882a593Smuzhiyun				io_ports[] and hob_ports[] arrays
784*4882a593Smuzhiyun				are expected to contain valid values
785*4882a593Smuzhiyun				on return.
786*4882a593Smuzhiyun	    data_phase		See below
787*4882a593Smuzhiyun	    req_cmd		Command type, see below
788*4882a593Smuzhiyun	    out_size		output (user->drive) buffer size, bytes
789*4882a593Smuzhiyun	    in_size		input (drive->user) buffer size, bytes
790*4882a593Smuzhiyun	    ============	===============================================
791*4882a593Smuzhiyun
792*4882a593Smuzhiyun	  When out_flags is zero, the following registers are loaded.
793*4882a593Smuzhiyun
794*4882a593Smuzhiyun	    ============	===============================================
795*4882a593Smuzhiyun	    HOB_FEATURE		If the drive supports LBA48
796*4882a593Smuzhiyun	    HOB_NSECTOR		If the drive supports LBA48
797*4882a593Smuzhiyun	    HOB_SECTOR		If the drive supports LBA48
798*4882a593Smuzhiyun	    HOB_LCYL		If the drive supports LBA48
799*4882a593Smuzhiyun	    HOB_HCYL		If the drive supports LBA48
800*4882a593Smuzhiyun	    FEATURE
801*4882a593Smuzhiyun	    NSECTOR
802*4882a593Smuzhiyun	    SECTOR
803*4882a593Smuzhiyun	    LCYL
804*4882a593Smuzhiyun	    HCYL
805*4882a593Smuzhiyun	    SELECT		First, masked with 0xE0 if LBA48, 0xEF
806*4882a593Smuzhiyun				otherwise; then, or'ed with the default
807*4882a593Smuzhiyun				value of SELECT.
808*4882a593Smuzhiyun	    ============	===============================================
809*4882a593Smuzhiyun
810*4882a593Smuzhiyun	  If any bit in out_flags is set, the following registers are loaded.
811*4882a593Smuzhiyun
812*4882a593Smuzhiyun	    ============	===============================================
813*4882a593Smuzhiyun	    HOB_DATA		If out_flags.b.data is set.  HOB_DATA will
814*4882a593Smuzhiyun				travel on DD8-DD15 on little endian machines
815*4882a593Smuzhiyun				and on DD0-DD7 on big endian machines.
816*4882a593Smuzhiyun	    DATA		If out_flags.b.data is set.  DATA will
817*4882a593Smuzhiyun				travel on DD0-DD7 on little endian machines
818*4882a593Smuzhiyun				and on DD8-DD15 on big endian machines.
819*4882a593Smuzhiyun	    HOB_NSECTOR		If out_flags.b.nsector_hob is set
820*4882a593Smuzhiyun	    HOB_SECTOR		If out_flags.b.sector_hob is set
821*4882a593Smuzhiyun	    HOB_LCYL		If out_flags.b.lcyl_hob is set
822*4882a593Smuzhiyun	    HOB_HCYL		If out_flags.b.hcyl_hob is set
823*4882a593Smuzhiyun	    FEATURE		If out_flags.b.feature is set
824*4882a593Smuzhiyun	    NSECTOR		If out_flags.b.nsector is set
825*4882a593Smuzhiyun	    SECTOR		If out_flags.b.sector is set
826*4882a593Smuzhiyun	    LCYL		If out_flags.b.lcyl is set
827*4882a593Smuzhiyun	    HCYL		If out_flags.b.hcyl is set
828*4882a593Smuzhiyun	    SELECT		Or'ed with the default value of SELECT and
829*4882a593Smuzhiyun				loaded regardless of out_flags.b.select.
830*4882a593Smuzhiyun	    ============	===============================================
831*4882a593Smuzhiyun
832*4882a593Smuzhiyun	  Taskfile registers are read back from the drive into
833*4882a593Smuzhiyun	  {io|hob}_ports[] after the command completes iff one of the
834*4882a593Smuzhiyun	  following conditions is met; otherwise, the original values
835*4882a593Smuzhiyun	  will be written back, unchanged.
836*4882a593Smuzhiyun
837*4882a593Smuzhiyun	    1. The drive fails the command (EIO).
838*4882a593Smuzhiyun	    2. One or more than one bits are set in out_flags.
839*4882a593Smuzhiyun	    3. The requested data_phase is TASKFILE_NO_DATA.
840*4882a593Smuzhiyun
841*4882a593Smuzhiyun	    ============	===============================================
842*4882a593Smuzhiyun	    HOB_DATA		If in_flags.b.data is set.  It will contain
843*4882a593Smuzhiyun				DD8-DD15 on little endian machines and
844*4882a593Smuzhiyun				DD0-DD7 on big endian machines.
845*4882a593Smuzhiyun	    DATA		If in_flags.b.data is set.  It will contain
846*4882a593Smuzhiyun				DD0-DD7 on little endian machines and
847*4882a593Smuzhiyun				DD8-DD15 on big endian machines.
848*4882a593Smuzhiyun	    HOB_FEATURE		If the drive supports LBA48
849*4882a593Smuzhiyun	    HOB_NSECTOR		If the drive supports LBA48
850*4882a593Smuzhiyun	    HOB_SECTOR		If the drive supports LBA48
851*4882a593Smuzhiyun	    HOB_LCYL		If the drive supports LBA48
852*4882a593Smuzhiyun	    HOB_HCYL		If the drive supports LBA48
853*4882a593Smuzhiyun	    NSECTOR
854*4882a593Smuzhiyun	    SECTOR
855*4882a593Smuzhiyun	    LCYL
856*4882a593Smuzhiyun	    HCYL
857*4882a593Smuzhiyun	    ============	===============================================
858*4882a593Smuzhiyun
859*4882a593Smuzhiyun	  The data_phase field describes the data transfer to be
860*4882a593Smuzhiyun	  performed.  Value is one of:
861*4882a593Smuzhiyun
862*4882a593Smuzhiyun	    ===================        ========================================
863*4882a593Smuzhiyun	    TASKFILE_IN
864*4882a593Smuzhiyun	    TASKFILE_MULTI_IN
865*4882a593Smuzhiyun	    TASKFILE_OUT
866*4882a593Smuzhiyun	    TASKFILE_MULTI_OUT
867*4882a593Smuzhiyun	    TASKFILE_IN_OUT
868*4882a593Smuzhiyun	    TASKFILE_IN_DMA
869*4882a593Smuzhiyun	    TASKFILE_IN_DMAQ		== IN_DMA (queueing not supported)
870*4882a593Smuzhiyun	    TASKFILE_OUT_DMA
871*4882a593Smuzhiyun	    TASKFILE_OUT_DMAQ		== OUT_DMA (queueing not supported)
872*4882a593Smuzhiyun	    TASKFILE_P_IN		unimplemented
873*4882a593Smuzhiyun	    TASKFILE_P_IN_DMA		unimplemented
874*4882a593Smuzhiyun	    TASKFILE_P_IN_DMAQ		unimplemented
875*4882a593Smuzhiyun	    TASKFILE_P_OUT		unimplemented
876*4882a593Smuzhiyun	    TASKFILE_P_OUT_DMA		unimplemented
877*4882a593Smuzhiyun	    TASKFILE_P_OUT_DMAQ		unimplemented
878*4882a593Smuzhiyun	    ===================        ========================================
879*4882a593Smuzhiyun
880*4882a593Smuzhiyun	  The req_cmd field classifies the command type.  It may be
881*4882a593Smuzhiyun	  one of:
882*4882a593Smuzhiyun
883*4882a593Smuzhiyun	    ========================    =======================================
884*4882a593Smuzhiyun	    IDE_DRIVE_TASK_NO_DATA
885*4882a593Smuzhiyun	    IDE_DRIVE_TASK_SET_XFER	unimplemented
886*4882a593Smuzhiyun	    IDE_DRIVE_TASK_IN
887*4882a593Smuzhiyun	    IDE_DRIVE_TASK_OUT		unimplemented
888*4882a593Smuzhiyun	    IDE_DRIVE_TASK_RAW_WRITE
889*4882a593Smuzhiyun	    ========================    =======================================
890*4882a593Smuzhiyun
891*4882a593Smuzhiyun	  [6] Do not access {in|out}_flags->all except for resetting
892*4882a593Smuzhiyun	  all the bits.  Always access individual bit fields.  ->all
893*4882a593Smuzhiyun	  value will flip depending on endianness.  For the same
894*4882a593Smuzhiyun	  reason, do not use IDE_{TASKFILE|HOB}_STD_{OUT|IN}_FLAGS
895*4882a593Smuzhiyun	  constants defined in hdreg.h.
896*4882a593Smuzhiyun
897*4882a593Smuzhiyun
898*4882a593Smuzhiyun
899*4882a593SmuzhiyunHDIO_DRIVE_CMD
900*4882a593Smuzhiyun	execute a special drive command
901*4882a593Smuzhiyun
902*4882a593Smuzhiyun
903*4882a593Smuzhiyun	Note:  If you don't have a copy of the ANSI ATA specification
904*4882a593Smuzhiyun	handy, you should probably ignore this ioctl.
905*4882a593Smuzhiyun
906*4882a593Smuzhiyun	usage::
907*4882a593Smuzhiyun
908*4882a593Smuzhiyun	  u8 args[4+XFER_SIZE];
909*4882a593Smuzhiyun
910*4882a593Smuzhiyun	  ...
911*4882a593Smuzhiyun	  ioctl(fd, HDIO_DRIVE_CMD, args);
912*4882a593Smuzhiyun
913*4882a593Smuzhiyun	inputs:
914*4882a593Smuzhiyun	    Commands other than WIN_SMART:
915*4882a593Smuzhiyun
916*4882a593Smuzhiyun	    =======     =======
917*4882a593Smuzhiyun	    args[0]	COMMAND
918*4882a593Smuzhiyun	    args[1]	NSECTOR
919*4882a593Smuzhiyun	    args[2]	FEATURE
920*4882a593Smuzhiyun	    args[3]	NSECTOR
921*4882a593Smuzhiyun	    =======     =======
922*4882a593Smuzhiyun
923*4882a593Smuzhiyun	    WIN_SMART:
924*4882a593Smuzhiyun
925*4882a593Smuzhiyun	    =======     =======
926*4882a593Smuzhiyun	    args[0]	COMMAND
927*4882a593Smuzhiyun	    args[1]	SECTOR
928*4882a593Smuzhiyun	    args[2]	FEATURE
929*4882a593Smuzhiyun	    args[3]	NSECTOR
930*4882a593Smuzhiyun	    =======     =======
931*4882a593Smuzhiyun
932*4882a593Smuzhiyun	outputs:
933*4882a593Smuzhiyun		args[] buffer is filled with register values followed by any
934*4882a593Smuzhiyun
935*4882a593Smuzhiyun
936*4882a593Smuzhiyun	  data returned by the disk.
937*4882a593Smuzhiyun
938*4882a593Smuzhiyun	    ========	====================================================
939*4882a593Smuzhiyun	    args[0]	status
940*4882a593Smuzhiyun	    args[1]	error
941*4882a593Smuzhiyun	    args[2]	NSECTOR
942*4882a593Smuzhiyun	    args[3]	undefined
943*4882a593Smuzhiyun	    args[4+]	NSECTOR * 512 bytes of data returned by the command.
944*4882a593Smuzhiyun	    ========	====================================================
945*4882a593Smuzhiyun
946*4882a593Smuzhiyun	error returns:
947*4882a593Smuzhiyun	  - EACCES	Access denied:  requires CAP_SYS_RAWIO
948*4882a593Smuzhiyun	  - ENOMEM	Unable to allocate memory for task
949*4882a593Smuzhiyun	  - EIO		Drive reports error
950*4882a593Smuzhiyun
951*4882a593Smuzhiyun	notes:
952*4882a593Smuzhiyun
953*4882a593Smuzhiyun	  [1] For commands other than WIN_SMART, args[1] should equal
954*4882a593Smuzhiyun	  args[3].  SECTOR, LCYL and HCYL are undefined.  For
955*4882a593Smuzhiyun	  WIN_SMART, 0x4f and 0xc2 are loaded into LCYL and HCYL
956*4882a593Smuzhiyun	  respectively.  In both cases SELECT will contain the default
957*4882a593Smuzhiyun	  value for the drive.  Please refer to HDIO_DRIVE_TASKFILE
958*4882a593Smuzhiyun	  notes for the default value of SELECT.
959*4882a593Smuzhiyun
960*4882a593Smuzhiyun	  [2] If NSECTOR value is greater than zero and the drive sets
961*4882a593Smuzhiyun	  DRQ when interrupting for the command, NSECTOR * 512 bytes
962*4882a593Smuzhiyun	  are read from the device into the area following NSECTOR.
963*4882a593Smuzhiyun	  In the above example, the area would be
964*4882a593Smuzhiyun	  args[4..4+XFER_SIZE].  16bit PIO is used regardless of
965*4882a593Smuzhiyun	  HDIO_SET_32BIT setting.
966*4882a593Smuzhiyun
967*4882a593Smuzhiyun	  [3] If COMMAND == WIN_SETFEATURES && FEATURE == SETFEATURES_XFER
968*4882a593Smuzhiyun	  && NSECTOR >= XFER_SW_DMA_0 && the drive supports any DMA
969*4882a593Smuzhiyun	  mode, IDE driver will try to tune the transfer mode of the
970*4882a593Smuzhiyun	  drive accordingly.
971*4882a593Smuzhiyun
972*4882a593Smuzhiyun
973*4882a593Smuzhiyun
974*4882a593SmuzhiyunHDIO_DRIVE_TASK
975*4882a593Smuzhiyun	execute task and special drive command
976*4882a593Smuzhiyun
977*4882a593Smuzhiyun
978*4882a593Smuzhiyun	Note:  If you don't have a copy of the ANSI ATA specification
979*4882a593Smuzhiyun	handy, you should probably ignore this ioctl.
980*4882a593Smuzhiyun
981*4882a593Smuzhiyun	usage::
982*4882a593Smuzhiyun
983*4882a593Smuzhiyun	  u8 args[7];
984*4882a593Smuzhiyun
985*4882a593Smuzhiyun	  ...
986*4882a593Smuzhiyun	  ioctl(fd, HDIO_DRIVE_TASK, args);
987*4882a593Smuzhiyun
988*4882a593Smuzhiyun	inputs:
989*4882a593Smuzhiyun	    Taskfile register values:
990*4882a593Smuzhiyun
991*4882a593Smuzhiyun	    =======	=======
992*4882a593Smuzhiyun	    args[0]	COMMAND
993*4882a593Smuzhiyun	    args[1]	FEATURE
994*4882a593Smuzhiyun	    args[2]	NSECTOR
995*4882a593Smuzhiyun	    args[3]	SECTOR
996*4882a593Smuzhiyun	    args[4]	LCYL
997*4882a593Smuzhiyun	    args[5]	HCYL
998*4882a593Smuzhiyun	    args[6]	SELECT
999*4882a593Smuzhiyun	    =======	=======
1000*4882a593Smuzhiyun
1001*4882a593Smuzhiyun	outputs:
1002*4882a593Smuzhiyun	    Taskfile register values:
1003*4882a593Smuzhiyun
1004*4882a593Smuzhiyun
1005*4882a593Smuzhiyun	    =======	=======
1006*4882a593Smuzhiyun	    args[0]	status
1007*4882a593Smuzhiyun	    args[1]	error
1008*4882a593Smuzhiyun	    args[2]	NSECTOR
1009*4882a593Smuzhiyun	    args[3]	SECTOR
1010*4882a593Smuzhiyun	    args[4]	LCYL
1011*4882a593Smuzhiyun	    args[5]	HCYL
1012*4882a593Smuzhiyun	    args[6]	SELECT
1013*4882a593Smuzhiyun	    =======	=======
1014*4882a593Smuzhiyun
1015*4882a593Smuzhiyun	error returns:
1016*4882a593Smuzhiyun	  - EACCES	Access denied:  requires CAP_SYS_RAWIO
1017*4882a593Smuzhiyun	  - ENOMEM	Unable to allocate memory for task
1018*4882a593Smuzhiyun	  - ENOMSG	Device is not a disk drive.
1019*4882a593Smuzhiyun	  - EIO		Drive failed the command.
1020*4882a593Smuzhiyun
1021*4882a593Smuzhiyun	notes:
1022*4882a593Smuzhiyun
1023*4882a593Smuzhiyun	  [1] DEV bit (0x10) of SELECT register is ignored and the
1024*4882a593Smuzhiyun	  appropriate value for the drive is used.  All other bits
1025*4882a593Smuzhiyun	  are used unaltered.
1026*4882a593Smuzhiyun
1027*4882a593Smuzhiyun
1028*4882a593Smuzhiyun
1029*4882a593SmuzhiyunHDIO_DRIVE_CMD_AEB
1030*4882a593Smuzhiyun	HDIO_DRIVE_TASK
1031*4882a593Smuzhiyun
1032*4882a593Smuzhiyun
1033*4882a593Smuzhiyun	Not implemented, as of 2.6.8.1
1034*4882a593Smuzhiyun
1035*4882a593Smuzhiyun
1036*4882a593Smuzhiyun
1037*4882a593SmuzhiyunHDIO_SET_32BIT
1038*4882a593Smuzhiyun	change io_32bit flags
1039*4882a593Smuzhiyun
1040*4882a593Smuzhiyun
1041*4882a593Smuzhiyun	usage::
1042*4882a593Smuzhiyun
1043*4882a593Smuzhiyun	  int val;
1044*4882a593Smuzhiyun
1045*4882a593Smuzhiyun	  ioctl(fd, HDIO_SET_32BIT, val);
1046*4882a593Smuzhiyun
1047*4882a593Smuzhiyun	inputs:
1048*4882a593Smuzhiyun		New value for io_32bit flag
1049*4882a593Smuzhiyun
1050*4882a593Smuzhiyun
1051*4882a593Smuzhiyun
1052*4882a593Smuzhiyun	outputs:
1053*4882a593Smuzhiyun		none
1054*4882a593Smuzhiyun
1055*4882a593Smuzhiyun
1056*4882a593Smuzhiyun
1057*4882a593Smuzhiyun	error return:
1058*4882a593Smuzhiyun	  - EINVAL	Called on a partition instead of the whole disk device
1059*4882a593Smuzhiyun	  - EACCES	Access denied:  requires CAP_SYS_ADMIN
1060*4882a593Smuzhiyun	  - EINVAL	value out of range [0 3]
1061*4882a593Smuzhiyun	  - EBUSY	Controller busy
1062*4882a593Smuzhiyun
1063*4882a593Smuzhiyun
1064*4882a593Smuzhiyun
1065*4882a593Smuzhiyun
1066*4882a593SmuzhiyunHDIO_SET_NOWERR
1067*4882a593Smuzhiyun	change ignore-write-error flag
1068*4882a593Smuzhiyun
1069*4882a593Smuzhiyun
1070*4882a593Smuzhiyun	usage::
1071*4882a593Smuzhiyun
1072*4882a593Smuzhiyun	  int val;
1073*4882a593Smuzhiyun
1074*4882a593Smuzhiyun	  ioctl(fd, HDIO_SET_NOWERR, val);
1075*4882a593Smuzhiyun
1076*4882a593Smuzhiyun	inputs:
1077*4882a593Smuzhiyun		New value for ignore-write-error flag.  Used for ignoring
1078*4882a593Smuzhiyun
1079*4882a593Smuzhiyun
1080*4882a593Smuzhiyun	  WRERR_STAT
1081*4882a593Smuzhiyun
1082*4882a593Smuzhiyun	outputs:
1083*4882a593Smuzhiyun		none
1084*4882a593Smuzhiyun
1085*4882a593Smuzhiyun
1086*4882a593Smuzhiyun
1087*4882a593Smuzhiyun	error return:
1088*4882a593Smuzhiyun	  - EINVAL	Called on a partition instead of the whole disk device
1089*4882a593Smuzhiyun	  - EACCES	Access denied:  requires CAP_SYS_ADMIN
1090*4882a593Smuzhiyun	  - EINVAL	value out of range [0 1]
1091*4882a593Smuzhiyun	  - EBUSY		Controller busy
1092*4882a593Smuzhiyun
1093*4882a593Smuzhiyun
1094*4882a593Smuzhiyun
1095*4882a593SmuzhiyunHDIO_SET_DMA
1096*4882a593Smuzhiyun	change use-dma flag
1097*4882a593Smuzhiyun
1098*4882a593Smuzhiyun
1099*4882a593Smuzhiyun	usage::
1100*4882a593Smuzhiyun
1101*4882a593Smuzhiyun	  long val;
1102*4882a593Smuzhiyun
1103*4882a593Smuzhiyun	  ioctl(fd, HDIO_SET_DMA, val);
1104*4882a593Smuzhiyun
1105*4882a593Smuzhiyun	inputs:
1106*4882a593Smuzhiyun		New value for use-dma flag
1107*4882a593Smuzhiyun
1108*4882a593Smuzhiyun
1109*4882a593Smuzhiyun
1110*4882a593Smuzhiyun	outputs:
1111*4882a593Smuzhiyun		none
1112*4882a593Smuzhiyun
1113*4882a593Smuzhiyun
1114*4882a593Smuzhiyun
1115*4882a593Smuzhiyun	error return:
1116*4882a593Smuzhiyun	  - EINVAL	Called on a partition instead of the whole disk device
1117*4882a593Smuzhiyun	  - EACCES	Access denied:  requires CAP_SYS_ADMIN
1118*4882a593Smuzhiyun	  - EINVAL	value out of range [0 1]
1119*4882a593Smuzhiyun	  - EBUSY	Controller busy
1120*4882a593Smuzhiyun
1121*4882a593Smuzhiyun
1122*4882a593Smuzhiyun
1123*4882a593SmuzhiyunHDIO_SET_PIO_MODE
1124*4882a593Smuzhiyun	reconfig interface to new speed
1125*4882a593Smuzhiyun
1126*4882a593Smuzhiyun
1127*4882a593Smuzhiyun	usage::
1128*4882a593Smuzhiyun
1129*4882a593Smuzhiyun	  long val;
1130*4882a593Smuzhiyun
1131*4882a593Smuzhiyun	  ioctl(fd, HDIO_SET_PIO_MODE, val);
1132*4882a593Smuzhiyun
1133*4882a593Smuzhiyun	inputs:
1134*4882a593Smuzhiyun		New interface speed.
1135*4882a593Smuzhiyun
1136*4882a593Smuzhiyun
1137*4882a593Smuzhiyun
1138*4882a593Smuzhiyun	outputs:
1139*4882a593Smuzhiyun		none
1140*4882a593Smuzhiyun
1141*4882a593Smuzhiyun
1142*4882a593Smuzhiyun
1143*4882a593Smuzhiyun	error return:
1144*4882a593Smuzhiyun	  - EINVAL	Called on a partition instead of the whole disk device
1145*4882a593Smuzhiyun	  - EACCES	Access denied:  requires CAP_SYS_ADMIN
1146*4882a593Smuzhiyun	  - EINVAL	value out of range [0 255]
1147*4882a593Smuzhiyun	  - EBUSY	Controller busy
1148*4882a593Smuzhiyun
1149*4882a593Smuzhiyun
1150*4882a593Smuzhiyun
1151*4882a593SmuzhiyunHDIO_SCAN_HWIF
1152*4882a593Smuzhiyun	register and (re)scan interface
1153*4882a593Smuzhiyun
1154*4882a593Smuzhiyun
1155*4882a593Smuzhiyun	usage::
1156*4882a593Smuzhiyun
1157*4882a593Smuzhiyun	  int args[3]
1158*4882a593Smuzhiyun
1159*4882a593Smuzhiyun	  ...
1160*4882a593Smuzhiyun	  ioctl(fd, HDIO_SCAN_HWIF, args);
1161*4882a593Smuzhiyun
1162*4882a593Smuzhiyun	inputs:
1163*4882a593Smuzhiyun
1164*4882a593Smuzhiyun	  =======	=========================
1165*4882a593Smuzhiyun	  args[0]	io address to probe
1166*4882a593Smuzhiyun
1167*4882a593Smuzhiyun
1168*4882a593Smuzhiyun	  args[1]	control address to probe
1169*4882a593Smuzhiyun	  args[2]	irq number
1170*4882a593Smuzhiyun	  =======	=========================
1171*4882a593Smuzhiyun
1172*4882a593Smuzhiyun	outputs:
1173*4882a593Smuzhiyun		none
1174*4882a593Smuzhiyun
1175*4882a593Smuzhiyun
1176*4882a593Smuzhiyun
1177*4882a593Smuzhiyun	error returns:
1178*4882a593Smuzhiyun	  - EACCES	Access denied:  requires CAP_SYS_RAWIO
1179*4882a593Smuzhiyun	  - EIO		Probe failed.
1180*4882a593Smuzhiyun
1181*4882a593Smuzhiyun	notes:
1182*4882a593Smuzhiyun		This ioctl initializes the addresses and irq for a disk
1183*4882a593Smuzhiyun		controller, probes for drives, and creates /proc/ide
1184*4882a593Smuzhiyun		interfaces as appropriate.
1185*4882a593Smuzhiyun
1186*4882a593Smuzhiyun
1187*4882a593Smuzhiyun
1188*4882a593SmuzhiyunHDIO_UNREGISTER_HWIF
1189*4882a593Smuzhiyun	unregister interface
1190*4882a593Smuzhiyun
1191*4882a593Smuzhiyun
1192*4882a593Smuzhiyun	usage::
1193*4882a593Smuzhiyun
1194*4882a593Smuzhiyun	  int index;
1195*4882a593Smuzhiyun
1196*4882a593Smuzhiyun	  ioctl(fd, HDIO_UNREGISTER_HWIF, index);
1197*4882a593Smuzhiyun
1198*4882a593Smuzhiyun	inputs:
1199*4882a593Smuzhiyun		index		index of hardware interface to unregister
1200*4882a593Smuzhiyun
1201*4882a593Smuzhiyun
1202*4882a593Smuzhiyun
1203*4882a593Smuzhiyun	outputs:
1204*4882a593Smuzhiyun		none
1205*4882a593Smuzhiyun
1206*4882a593Smuzhiyun
1207*4882a593Smuzhiyun
1208*4882a593Smuzhiyun	error returns:
1209*4882a593Smuzhiyun	  - EACCES	Access denied:  requires CAP_SYS_RAWIO
1210*4882a593Smuzhiyun
1211*4882a593Smuzhiyun	notes:
1212*4882a593Smuzhiyun		This ioctl removes a hardware interface from the kernel.
1213*4882a593Smuzhiyun
1214*4882a593Smuzhiyun		Currently (2.6.8) this ioctl silently fails if any drive on
1215*4882a593Smuzhiyun		the interface is busy.
1216*4882a593Smuzhiyun
1217*4882a593Smuzhiyun
1218*4882a593Smuzhiyun
1219*4882a593SmuzhiyunHDIO_SET_WCACHE
1220*4882a593Smuzhiyun	change write cache enable-disable
1221*4882a593Smuzhiyun
1222*4882a593Smuzhiyun
1223*4882a593Smuzhiyun	usage::
1224*4882a593Smuzhiyun
1225*4882a593Smuzhiyun	  int val;
1226*4882a593Smuzhiyun
1227*4882a593Smuzhiyun	  ioctl(fd, HDIO_SET_WCACHE, val);
1228*4882a593Smuzhiyun
1229*4882a593Smuzhiyun	inputs:
1230*4882a593Smuzhiyun		New value for write cache enable
1231*4882a593Smuzhiyun
1232*4882a593Smuzhiyun
1233*4882a593Smuzhiyun
1234*4882a593Smuzhiyun	outputs:
1235*4882a593Smuzhiyun		none
1236*4882a593Smuzhiyun
1237*4882a593Smuzhiyun
1238*4882a593Smuzhiyun
1239*4882a593Smuzhiyun	error return:
1240*4882a593Smuzhiyun	  - EINVAL	Called on a partition instead of the whole disk device
1241*4882a593Smuzhiyun	  - EACCES	Access denied:  requires CAP_SYS_ADMIN
1242*4882a593Smuzhiyun	  - EINVAL	value out of range [0 1]
1243*4882a593Smuzhiyun	  - EBUSY	Controller busy
1244*4882a593Smuzhiyun
1245*4882a593Smuzhiyun
1246*4882a593Smuzhiyun
1247*4882a593SmuzhiyunHDIO_SET_ACOUSTIC
1248*4882a593Smuzhiyun	change acoustic behavior
1249*4882a593Smuzhiyun
1250*4882a593Smuzhiyun
1251*4882a593Smuzhiyun	usage::
1252*4882a593Smuzhiyun
1253*4882a593Smuzhiyun	  int val;
1254*4882a593Smuzhiyun
1255*4882a593Smuzhiyun	  ioctl(fd, HDIO_SET_ACOUSTIC, val);
1256*4882a593Smuzhiyun
1257*4882a593Smuzhiyun	inputs:
1258*4882a593Smuzhiyun		New value for drive acoustic settings
1259*4882a593Smuzhiyun
1260*4882a593Smuzhiyun
1261*4882a593Smuzhiyun
1262*4882a593Smuzhiyun	outputs:
1263*4882a593Smuzhiyun		none
1264*4882a593Smuzhiyun
1265*4882a593Smuzhiyun
1266*4882a593Smuzhiyun
1267*4882a593Smuzhiyun	error return:
1268*4882a593Smuzhiyun	  - EINVAL	Called on a partition instead of the whole disk device
1269*4882a593Smuzhiyun	  - EACCES	Access denied:  requires CAP_SYS_ADMIN
1270*4882a593Smuzhiyun	  - EINVAL	value out of range [0 254]
1271*4882a593Smuzhiyun	  - EBUSY	Controller busy
1272*4882a593Smuzhiyun
1273*4882a593Smuzhiyun
1274*4882a593Smuzhiyun
1275*4882a593SmuzhiyunHDIO_SET_QDMA
1276*4882a593Smuzhiyun	change use-qdma flag
1277*4882a593Smuzhiyun
1278*4882a593Smuzhiyun
1279*4882a593Smuzhiyun	Not implemented, as of 2.6.8.1
1280*4882a593Smuzhiyun
1281*4882a593Smuzhiyun
1282*4882a593Smuzhiyun
1283*4882a593SmuzhiyunHDIO_SET_ADDRESS
1284*4882a593Smuzhiyun	change lba addressing modes
1285*4882a593Smuzhiyun
1286*4882a593Smuzhiyun
1287*4882a593Smuzhiyun	usage::
1288*4882a593Smuzhiyun
1289*4882a593Smuzhiyun	  int val;
1290*4882a593Smuzhiyun
1291*4882a593Smuzhiyun	  ioctl(fd, HDIO_SET_ADDRESS, val);
1292*4882a593Smuzhiyun
1293*4882a593Smuzhiyun	inputs:
1294*4882a593Smuzhiyun		New value for addressing mode
1295*4882a593Smuzhiyun
1296*4882a593Smuzhiyun	    =   ===================
1297*4882a593Smuzhiyun	    0   28-bit
1298*4882a593Smuzhiyun	    1   48-bit
1299*4882a593Smuzhiyun	    2   48-bit doing 28-bit
1300*4882a593Smuzhiyun	    =   ===================
1301*4882a593Smuzhiyun
1302*4882a593Smuzhiyun	outputs:
1303*4882a593Smuzhiyun		none
1304*4882a593Smuzhiyun
1305*4882a593Smuzhiyun
1306*4882a593Smuzhiyun
1307*4882a593Smuzhiyun	error return:
1308*4882a593Smuzhiyun	  - EINVAL	Called on a partition instead of the whole disk device
1309*4882a593Smuzhiyun	  - EACCES	Access denied:  requires CAP_SYS_ADMIN
1310*4882a593Smuzhiyun	  - EINVAL	value out of range [0 2]
1311*4882a593Smuzhiyun	  - EBUSY		Controller busy
1312*4882a593Smuzhiyun	  - EIO		Drive does not support lba48 mode.
1313*4882a593Smuzhiyun
1314*4882a593Smuzhiyun
1315*4882a593SmuzhiyunHDIO_SET_IDE_SCSI
1316*4882a593Smuzhiyun	usage::
1317*4882a593Smuzhiyun
1318*4882a593Smuzhiyun
1319*4882a593Smuzhiyun	  long val;
1320*4882a593Smuzhiyun
1321*4882a593Smuzhiyun	  ioctl(fd, HDIO_SET_IDE_SCSI, val);
1322*4882a593Smuzhiyun
1323*4882a593Smuzhiyun	inputs:
1324*4882a593Smuzhiyun		New value for scsi emulation mode (?)
1325*4882a593Smuzhiyun
1326*4882a593Smuzhiyun
1327*4882a593Smuzhiyun
1328*4882a593Smuzhiyun	outputs:
1329*4882a593Smuzhiyun		none
1330*4882a593Smuzhiyun
1331*4882a593Smuzhiyun
1332*4882a593Smuzhiyun
1333*4882a593Smuzhiyun	error return:
1334*4882a593Smuzhiyun	  - EINVAL	Called on a partition instead of the whole disk device
1335*4882a593Smuzhiyun	  - EACCES	Access denied:  requires CAP_SYS_ADMIN
1336*4882a593Smuzhiyun	  - EINVAL	value out of range [0 1]
1337*4882a593Smuzhiyun	  - EBUSY	Controller busy
1338*4882a593Smuzhiyun
1339*4882a593Smuzhiyun
1340*4882a593Smuzhiyun
1341*4882a593SmuzhiyunHDIO_SET_SCSI_IDE
1342*4882a593Smuzhiyun	Not implemented, as of 2.6.8.1
1343