linux/Documentation/ioctl/hdio.txt
<<
>>
Prefs
   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 cannot
 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          ENXIO         No such device: phy dead or ctl_addr == 0
 512          EIO           I/O error:      reset timed out or hardware error
 513
 514        notes:
 515
 516          Execute a reset on the device as soon as the current IO
 517          operation has completed.
 518
 519          Executes an ATAPI soft reset if applicable, otherwise
 520          executes an ATA soft reset on the controller.
 521
 522
 523
 524HDIO_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
 599          bitfield flips depending on endianness; fortunately, TASKFILE
 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
 723          value will flip depending on endianness.  For the same
 724          reason, do not use IDE_{TASKFILE|HOB}_STD_{OUT|IN}_FLAGS
 725          constants defined in hdreg.h.
 726
 727
 728
 729HDIO_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
 792HDIO_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
 839HDIO_DRIVE_CMD_AEB              HDIO_DRIVE_TASK
 840
 841        Not implemented, as of 2.6.8.1
 842
 843
 844
 845HDIO_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
 866HDIO_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
 887HDIO_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
 907HDIO_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
 927HDIO_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
 950          interfaces as appropriate.
 951
 952
 953
 954HDIO_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
 978HDIO_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
 998HDIO_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
1018HDIO_SET_QDMA                   change use-qdma flag
1019
1020        Not implemented, as of 2.6.8.1
1021
1022
1023
1024HDIO_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
1047HDIO_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
1067HDIO_SET_SCSI_IDE
1068
1069        Not implemented, as of 2.6.8.1
1070
1071
1072
lxr.linux.no kindly hosted by Redpill Linpro AS, provider of Linux consulting and operations services since 1995.