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