Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

at v2.6.12 1070 lines 25 kB view raw
1 Summary of HDIO_ ioctl calls. 2 ============================ 3 4 Edward A. Falk <efalk@google.com> 5 6 November, 2004 7 8This document attempts to describe the ioctl(2) calls supported by 9the HD/IDE layer. These are by-and-large implemented (as of Linux 2.6) 10in drivers/ide/ide.c and drivers/block/scsi_ioctl.c 11 12ioctl values are listed in <linux/hdreg.h>. As of this writing, they 13are 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 62The information that follows was determined from reading kernel source 63code. It is likely that some corrections will be made over time. 64 65 66 67 68 69 70 71General: 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 85HDIO_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 131HDIO_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 145HDIO_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 166HDIO_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 182HDIO_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 206 This is tightly woven into the driver->do_special can not 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 215HDIO_GET_QDMA get use-qdma flag 216 217 Not implemented, as of 2.6.8.1 218 219 220 221HDIO_SET_XFER set transfer rate via proc 222 223 Not implemented, as of 2.6.8.1 224 225 226 227HDIO_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 234HDIO_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 264HDIO_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 283HDIO_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 303HDIO_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 321HDIO_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 335HDIO_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 349HDIO_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 371HDIO_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 401HDIO_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 415HDIO_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 433HDIO_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 451HDIO_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 470HDIO_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 491HDIO_TRISTATE_HWIF execute a channel tristate 492 493 Not implemented, as of 2.6.8.1. See HDIO_SET_BUSSTATE 494 495 496 497HDIO_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 511 512 notes: 513 514 Abort any current command, prevent anything else from being 515 queued, execute a reset on the device, and issue BLKRRPART 516 ioctl on the block device. 517 518 Executes an ATAPI soft reset if applicable, otherwise 519 executes an ATA soft reset on the controller. 520 521 522 523HDIO_DRIVE_TASKFILE execute raw taskfile 524 525 Note: If you don't have a copy of the ANSI ATA specification 526 handy, you should probably ignore this ioctl. 527 528 Execute an ATA disk command directly by writing the "taskfile" 529 registers of the drive. Requires ADMIN and RAWIO access 530 privileges. 531 532 usage: 533 534 struct { 535 ide_task_request_t req_task; 536 u8 outbuf[OUTPUT_SIZE]; 537 u8 inbuf[INPUT_SIZE]; 538 } task; 539 memset(&task.req_task, 0, sizeof(task.req_task)); 540 task.req_task.out_size = sizeof(task.outbuf); 541 task.req_task.in_size = sizeof(task.inbuf); 542 ... 543 ioctl(fd, HDIO_DRIVE_TASKFILE, &task); 544 ... 545 546 inputs: 547 548 (See below for details on memory area passed to ioctl.) 549 550 io_ports[8] values to be written to taskfile registers 551 hob_ports[8] high-order bytes, for extended commands. 552 out_flags flags indicating which registers are valid 553 in_flags flags indicating which registers should be returned 554 data_phase see below 555 req_cmd command type to be executed 556 out_size size of output buffer 557 outbuf buffer of data to be transmitted to disk 558 inbuf buffer of data to be received from disk (see [1]) 559 560 outputs: 561 562 io_ports[] values returned in the taskfile registers 563 hob_ports[] high-order bytes, for extended commands. 564 out_flags flags indicating which registers are valid (see [2]) 565 in_flags flags indicating which registers should be returned 566 outbuf buffer of data to be transmitted to disk (see [1]) 567 inbuf buffer of data to be received from disk 568 569 error returns: 570 EACCES CAP_SYS_ADMIN or CAP_SYS_RAWIO privilege not set. 571 ENOMSG Device is not a disk drive. 572 ENOMEM Unable to allocate memory for task 573 EFAULT req_cmd == TASKFILE_IN_OUT (not implemented as of 2.6.8) 574 EPERM req_cmd == TASKFILE_MULTI_OUT and drive 575 multi-count not yet set. 576 EIO Drive failed the command. 577 578 notes: 579 580 [1] READ THE FOLLOWING NOTES *CAREFULLY*. THIS IOCTL IS 581 FULL OF GOTCHAS. Extreme caution should be used with using 582 this ioctl. A mistake can easily corrupt data or hang the 583 system. 584 585 [2] Both the input and output buffers are copied from the 586 user and written back to the user, even when not used. 587 588 [3] If one or more bits are set in out_flags and in_flags is 589 zero, the following values are used for in_flags.all and 590 written back into in_flags on completion. 591 592 * IDE_TASKFILE_STD_IN_FLAGS | (IDE_HOB_STD_IN_FLAGS << 8) 593 if LBA48 addressing is enabled for the drive 594 * IDE_TASKFILE_STD_IN_FLAGS 595 if CHS/LBA28 596 597 The association between in_flags.all and each enable 598 bitfield flips depending on endianess; fortunately, TASKFILE 599 only uses inflags.b.data bit and ignores all other bits. 600 The end result is that, on any endian machines, it has no 601 effect other than modifying in_flags on completion. 602 603 [4] The default value of SELECT is (0xa0|DEV_bit|LBA_bit) 604 except for four drives per port chipsets. For four drives 605 per port chipsets, it's (0xa0|DEV_bit|LBA_bit) for the first 606 pair and (0x80|DEV_bit|LBA_bit) for the second pair. 607 608 [5] The argument to the ioctl is a pointer to a region of 609 memory containing a ide_task_request_t structure, followed 610 by an optional buffer of data to be transmitted to the 611 drive, followed by an optional buffer to receive data from 612 the drive. 613 614 Command is passed to the disk drive via the ide_task_request_t 615 structure, which contains these fields: 616 617 io_ports[8] values for the taskfile registers 618 hob_ports[8] high-order bytes, for extended commands 619 out_flags flags indicating which entries in the 620 io_ports[] and hob_ports[] arrays 621 contain valid values. Type ide_reg_valid_t. 622 in_flags flags indicating which entries in the 623 io_ports[] and hob_ports[] arrays 624 are expected to contain valid values 625 on return. 626 data_phase See below 627 req_cmd Command type, see below 628 out_size output (user->drive) buffer size, bytes 629 in_size input (drive->user) buffer size, bytes 630 631 When out_flags is zero, the following registers are loaded. 632 633 HOB_FEATURE If the drive supports LBA48 634 HOB_NSECTOR If the drive supports LBA48 635 HOB_SECTOR If the drive supports LBA48 636 HOB_LCYL If the drive supports LBA48 637 HOB_HCYL If the drive supports LBA48 638 FEATURE 639 NSECTOR 640 SECTOR 641 LCYL 642 HCYL 643 SELECT First, masked with 0xE0 if LBA48, 0xEF 644 otherwise; then, or'ed with the default 645 value of SELECT. 646 647 If any bit in out_flags is set, the following registers are loaded. 648 649 HOB_DATA If out_flags.b.data is set. HOB_DATA will 650 travel on DD8-DD15 on little endian machines 651 and on DD0-DD7 on big endian machines. 652 DATA If out_flags.b.data is set. DATA will 653 travel on DD0-DD7 on little endian machines 654 and on DD8-DD15 on big endian machines. 655 HOB_NSECTOR If out_flags.b.nsector_hob is set 656 HOB_SECTOR If out_flags.b.sector_hob is set 657 HOB_LCYL If out_flags.b.lcyl_hob is set 658 HOB_HCYL If out_flags.b.hcyl_hob is set 659 FEATURE If out_flags.b.feature is set 660 NSECTOR If out_flags.b.nsector is set 661 SECTOR If out_flags.b.sector is set 662 LCYL If out_flags.b.lcyl is set 663 HCYL If out_flags.b.hcyl is set 664 SELECT Or'ed with the default value of SELECT and 665 loaded regardless of out_flags.b.select. 666 667 Taskfile registers are read back from the drive into 668 {io|hob}_ports[] after the command completes iff one of the 669 following conditions is met; otherwise, the original values 670 will be written back, unchanged. 671 672 1. The drive fails the command (EIO). 673 2. One or more than one bits are set in out_flags. 674 3. The requested data_phase is TASKFILE_NO_DATA. 675 676 HOB_DATA If in_flags.b.data is set. It will contain 677 DD8-DD15 on little endian machines and 678 DD0-DD7 on big endian machines. 679 DATA If in_flags.b.data is set. It will contain 680 DD0-DD7 on little endian machines and 681 DD8-DD15 on big endian machines. 682 HOB_FEATURE If the drive supports LBA48 683 HOB_NSECTOR If the drive supports LBA48 684 HOB_SECTOR If the drive supports LBA48 685 HOB_LCYL If the drive supports LBA48 686 HOB_HCYL If the drive supports LBA48 687 NSECTOR 688 SECTOR 689 LCYL 690 HCYL 691 692 The data_phase field describes the data transfer to be 693 performed. Value is one of: 694 695 TASKFILE_IN 696 TASKFILE_MULTI_IN 697 TASKFILE_OUT 698 TASKFILE_MULTI_OUT 699 TASKFILE_IN_OUT 700 TASKFILE_IN_DMA 701 TASKFILE_IN_DMAQ == IN_DMA (queueing not supported) 702 TASKFILE_OUT_DMA 703 TASKFILE_OUT_DMAQ == OUT_DMA (queueing not supported) 704 TASKFILE_P_IN unimplemented 705 TASKFILE_P_IN_DMA unimplemented 706 TASKFILE_P_IN_DMAQ unimplemented 707 TASKFILE_P_OUT unimplemented 708 TASKFILE_P_OUT_DMA unimplemented 709 TASKFILE_P_OUT_DMAQ unimplemented 710 711 The req_cmd field classifies the command type. It may be 712 one of: 713 714 IDE_DRIVE_TASK_NO_DATA 715 IDE_DRIVE_TASK_SET_XFER unimplemented 716 IDE_DRIVE_TASK_IN 717 IDE_DRIVE_TASK_OUT unimplemented 718 IDE_DRIVE_TASK_RAW_WRITE 719 720 [6] Do not access {in|out}_flags->all except for resetting 721 all the bits. Always access individual bit fields. ->all 722 value will flip depending on endianess. For the same 723 reason, do not use IDE_{TASKFILE|HOB}_STD_{OUT|IN}_FLAGS 724 constants defined in hdreg.h. 725 726 727 728HDIO_DRIVE_CMD execute a special drive command 729 730 Note: If you don't have a copy of the ANSI ATA specification 731 handy, you should probably ignore this ioctl. 732 733 usage: 734 735 u8 args[4+XFER_SIZE]; 736 ... 737 ioctl(fd, HDIO_DRIVE_CMD, args); 738 739 inputs: 740 741 Commands other than WIN_SMART 742 args[0] COMMAND 743 args[1] NSECTOR 744 args[2] FEATURE 745 args[3] NSECTOR 746 747 WIN_SMART 748 args[0] COMMAND 749 args[1] SECTOR 750 args[2] FEATURE 751 args[3] NSECTOR 752 753 outputs: 754 755 args[] buffer is filled with register values followed by any 756 data returned by the disk. 757 args[0] status 758 args[1] error 759 args[2] NSECTOR 760 args[3] undefined 761 args[4+] NSECTOR * 512 bytes of data returned by the command. 762 763 error returns: 764 EACCES Access denied: requires CAP_SYS_RAWIO 765 ENOMEM Unable to allocate memory for task 766 EIO Drive reports error 767 768 notes: 769 770 [1] For commands other than WIN_SMART, args[1] should equal 771 args[3]. SECTOR, LCYL and HCYL are undefined. For 772 WIN_SMART, 0x4f and 0xc2 are loaded into LCYL and HCYL 773 respectively. In both cases SELECT will contain the default 774 value for the drive. Please refer to HDIO_DRIVE_TASKFILE 775 notes for the default value of SELECT. 776 777 [2] If NSECTOR value is greater than zero and the drive sets 778 DRQ when interrupting for the command, NSECTOR * 512 bytes 779 are read from the device into the area following NSECTOR. 780 In the above example, the area would be 781 args[4..4+XFER_SIZE]. 16bit PIO is used regardless of 782 HDIO_SET_32BIT setting. 783 784 [3] If COMMAND == WIN_SETFEATURES && FEATURE == SETFEATURES_XFER 785 && NSECTOR >= XFER_SW_DMA_0 && the drive supports any DMA 786 mode, IDE driver will try to tune the transfer mode of the 787 drive accordingly. 788 789 790 791HDIO_DRIVE_TASK execute task and special drive command 792 793 Note: If you don't have a copy of the ANSI ATA specification 794 handy, you should probably ignore this ioctl. 795 796 usage: 797 798 u8 args[7]; 799 ... 800 ioctl(fd, HDIO_DRIVE_TASK, args); 801 802 inputs: 803 804 Taskfile register values: 805 args[0] COMMAND 806 args[1] FEATURE 807 args[2] NSECTOR 808 args[3] SECTOR 809 args[4] LCYL 810 args[5] HCYL 811 args[6] SELECT 812 813 outputs: 814 815 Taskfile register values: 816 args[0] status 817 args[1] error 818 args[2] NSECTOR 819 args[3] SECTOR 820 args[4] LCYL 821 args[5] HCYL 822 args[6] SELECT 823 824 error returns: 825 EACCES Access denied: requires CAP_SYS_RAWIO 826 ENOMEM Unable to allocate memory for task 827 ENOMSG Device is not a disk drive. 828 EIO Drive failed the command. 829 830 notes: 831 832 [1] DEV bit (0x10) of SELECT register is ignored and the 833 appropriate value for the drive is used. All other bits 834 are used unaltered. 835 836 837 838HDIO_DRIVE_CMD_AEB HDIO_DRIVE_TASK 839 840 Not implemented, as of 2.6.8.1 841 842 843 844HDIO_SET_32BIT change io_32bit flags 845 846 usage: 847 848 int val; 849 ioctl(fd, HDIO_SET_32BIT, val); 850 851 inputs: 852 New value for io_32bit flag 853 854 outputs: none 855 856 error return: 857 EINVAL (bdev != bdev->bd_contains) (not sure what this means) 858 EACCES Access denied: requires CAP_SYS_ADMIN 859 EINVAL value out of range [0 3] 860 EBUSY Controller busy 861 862 863 864 865HDIO_SET_NOWERR change ignore-write-error flag 866 867 usage: 868 869 int val; 870 ioctl(fd, HDIO_SET_NOWERR, val); 871 872 inputs: 873 New value for ignore-write-error flag. Used for ignoring 874 WRERR_STAT 875 876 outputs: none 877 878 error return: 879 EINVAL (bdev != bdev->bd_contains) (not sure what this means) 880 EACCES Access denied: requires CAP_SYS_ADMIN 881 EINVAL value out of range [0 1] 882 EBUSY Controller busy 883 884 885 886HDIO_SET_DMA change use-dma flag 887 888 usage: 889 890 long val; 891 ioctl(fd, HDIO_SET_DMA, val); 892 893 inputs: 894 New value for use-dma flag 895 896 outputs: none 897 898 error return: 899 EINVAL (bdev != bdev->bd_contains) (not sure what this means) 900 EACCES Access denied: requires CAP_SYS_ADMIN 901 EINVAL value out of range [0 1] 902 EBUSY Controller busy 903 904 905 906HDIO_SET_PIO_MODE reconfig interface to new speed 907 908 usage: 909 910 long val; 911 ioctl(fd, HDIO_SET_PIO_MODE, val); 912 913 inputs: 914 New interface speed. 915 916 outputs: none 917 918 error return: 919 EINVAL (bdev != bdev->bd_contains) (not sure what this means) 920 EACCES Access denied: requires CAP_SYS_ADMIN 921 EINVAL value out of range [0 255] 922 EBUSY Controller busy 923 924 925 926HDIO_SCAN_HWIF register and (re)scan interface 927 928 usage: 929 930 int args[3] 931 ... 932 ioctl(fd, HDIO_SCAN_HWIF, args); 933 934 inputs: 935 args[0] io address to probe 936 args[1] control address to probe 937 args[2] irq number 938 939 outputs: none 940 941 error returns: 942 EACCES Access denied: requires CAP_SYS_RAWIO 943 EIO Probe failed. 944 945 notes: 946 947 This ioctl initializes the addresses and irq for a disk 948 controller, probes for drives, and creates /proc/ide 949 interfaces as appropiate. 950 951 952 953HDIO_UNREGISTER_HWIF unregister interface 954 955 usage: 956 957 int index; 958 ioctl(fd, HDIO_UNREGISTER_HWIF, index); 959 960 inputs: 961 index index of hardware interface to unregister 962 963 outputs: none 964 965 error returns: 966 EACCES Access denied: requires CAP_SYS_RAWIO 967 968 notes: 969 970 This ioctl removes a hardware interface from the kernel. 971 972 Currently (2.6.8) this ioctl silently fails if any drive on 973 the interface is busy. 974 975 976 977HDIO_SET_WCACHE change write cache enable-disable 978 979 usage: 980 981 int val; 982 ioctl(fd, HDIO_SET_WCACHE, val); 983 984 inputs: 985 New value for write cache enable 986 987 outputs: none 988 989 error return: 990 EINVAL (bdev != bdev->bd_contains) (not sure what this means) 991 EACCES Access denied: requires CAP_SYS_ADMIN 992 EINVAL value out of range [0 1] 993 EBUSY Controller busy 994 995 996 997HDIO_SET_ACOUSTIC change acoustic behavior 998 999 usage: 1000 1001 int val; 1002 ioctl(fd, HDIO_SET_ACOUSTIC, val); 1003 1004 inputs: 1005 New value for drive acoustic settings 1006 1007 outputs: none 1008 1009 error return: 1010 EINVAL (bdev != bdev->bd_contains) (not sure what this means) 1011 EACCES Access denied: requires CAP_SYS_ADMIN 1012 EINVAL value out of range [0 254] 1013 EBUSY Controller busy 1014 1015 1016 1017HDIO_SET_QDMA change use-qdma flag 1018 1019 Not implemented, as of 2.6.8.1 1020 1021 1022 1023HDIO_SET_ADDRESS change lba addressing modes 1024 1025 usage: 1026 1027 int val; 1028 ioctl(fd, HDIO_SET_ADDRESS, val); 1029 1030 inputs: 1031 New value for addressing mode 1032 0 = 28-bit 1033 1 = 48-bit 1034 2 = 48-bit doing 28-bit 1035 1036 outputs: none 1037 1038 error return: 1039 EINVAL (bdev != bdev->bd_contains) (not sure what this means) 1040 EACCES Access denied: requires CAP_SYS_ADMIN 1041 EINVAL value out of range [0 2] 1042 EBUSY Controller busy 1043 EIO Drive does not support lba48 mode. 1044 1045 1046HDIO_SET_IDE_SCSI 1047 1048 usage: 1049 1050 long val; 1051 ioctl(fd, HDIO_SET_IDE_SCSI, val); 1052 1053 inputs: 1054 New value for scsi emulation mode (?) 1055 1056 outputs: none 1057 1058 error return: 1059 EINVAL (bdev != bdev->bd_contains) (not sure what this means) 1060 EACCES Access denied: requires CAP_SYS_ADMIN 1061 EINVAL value out of range [0 1] 1062 EBUSY Controller busy 1063 1064 1065 1066HDIO_SET_SCSI_IDE 1067 1068 Not implemented, as of 2.6.8.1 1069 1070