| Summary of HDIO_ ioctl calls. |
| ============================ |
| |
| Edward A. Falk <efalk@google.com> |
| |
| November, 2004 |
| |
| This document attempts to describe the ioctl(2) calls supported by |
| the HD/IDE layer. These are by-and-large implemented (as of Linux 2.6) |
| in drivers/ide/ide.c and drivers/block/scsi_ioctl.c |
| |
| ioctl values are listed in <linux/hdreg.h>. As of this writing, they |
| are as follows: |
| |
| ioctls that pass argument pointers to user space: |
| |
| HDIO_GETGEO get device geometry |
| HDIO_GET_UNMASKINTR get current unmask setting |
| HDIO_GET_MULTCOUNT get current IDE blockmode setting |
| HDIO_GET_QDMA get use-qdma flag |
| HDIO_SET_XFER set transfer rate via proc |
| HDIO_OBSOLETE_IDENTITY OBSOLETE, DO NOT USE |
| HDIO_GET_KEEPSETTINGS get keep-settings-on-reset flag |
| HDIO_GET_32BIT get current io_32bit setting |
| HDIO_GET_NOWERR get ignore-write-error flag |
| HDIO_GET_DMA get use-dma flag |
| HDIO_GET_NICE get nice flags |
| HDIO_GET_IDENTITY get IDE identification info |
| HDIO_GET_WCACHE get write cache mode on|off |
| HDIO_GET_ACOUSTIC get acoustic value |
| HDIO_GET_ADDRESS get sector addressing mode |
| HDIO_GET_BUSSTATE get the bus state of the hwif |
| HDIO_TRISTATE_HWIF execute a channel tristate |
| HDIO_DRIVE_RESET execute a device reset |
| HDIO_DRIVE_TASKFILE execute raw taskfile |
| HDIO_DRIVE_TASK execute task and special drive command |
| HDIO_DRIVE_CMD execute a special drive command |
| HDIO_DRIVE_CMD_AEB HDIO_DRIVE_TASK |
| |
| ioctls that pass non-pointer values: |
| |
| HDIO_SET_MULTCOUNT change IDE blockmode |
| HDIO_SET_UNMASKINTR permit other irqs during I/O |
| HDIO_SET_KEEPSETTINGS keep ioctl settings on reset |
| HDIO_SET_32BIT change io_32bit flags |
| HDIO_SET_NOWERR change ignore-write-error flag |
| HDIO_SET_DMA change use-dma flag |
| HDIO_SET_PIO_MODE reconfig interface to new speed |
| HDIO_SCAN_HWIF register and (re)scan interface |
| HDIO_SET_NICE set nice flags |
| HDIO_UNREGISTER_HWIF unregister interface |
| HDIO_SET_WCACHE change write cache enable-disable |
| HDIO_SET_ACOUSTIC change acoustic behavior |
| HDIO_SET_BUSSTATE set the bus state of the hwif |
| HDIO_SET_QDMA change use-qdma flag |
| HDIO_SET_ADDRESS change lba addressing modes |
| |
| HDIO_SET_IDE_SCSI Set scsi emulation mode on/off |
| HDIO_SET_SCSI_IDE not implemented yet |
| |
| |
| The information that follows was determined from reading kernel source |
| code. It is likely that some corrections will be made over time. |
| |
| |
| |
| |
| |
| |
| |
| General: |
| |
| Unless otherwise specified, all ioctl calls return 0 on success |
| and -1 with errno set to an appropriate value on error. |
| |
| Unless otherwise specified, all ioctl calls return -1 and set |
| errno to EFAULT on a failed attempt to copy data to or from user |
| address space. |
| |
| Unless otherwise specified, all data structures and constants |
| are defined in <linux/hdreg.h> |
| |
| |
| |
| HDIO_GETGEO get device geometry |
| |
| usage: |
| |
| struct hd_geometry geom; |
| ioctl(fd, HDIO_GETGEO, &geom); |
| |
| |
| inputs: none |
| |
| outputs: |
| |
| hd_geometry structure containing: |
| |
| heads number of heads |
| sectors number of sectors/track |
| cylinders number of cylinders, mod 65536 |
| start starting sector of this partition. |
| |
| |
| error returns: |
| EINVAL if the device is not a disk drive or floppy drive, |
| or if the user passes a null pointer |
| |
| |
| notes: |
| |
| Not particularly useful with modern disk drives, whose geometry |
| is a polite fiction anyway. Modern drives are addressed |
| purely by sector number nowadays (lba addressing), and the |
| drive geometry is an abstraction which is actually subject |
| to change. Currently (as of Nov 2004), the geometry values |
| are the "bios" values -- presumably the values the drive had |
| when Linux first booted. |
| |
| In addition, the cylinders field of the hd_geometry is an |
| unsigned short, meaning that on most architectures, this |
| ioctl will not return a meaningful value on drives with more |
| than 65535 tracks. |
| |
| The start field is unsigned long, meaning that it will not |
| contain a meaningful value for disks over 219 Gb in size. |
| |
| |
| |
| |
| HDIO_GET_UNMASKINTR get current unmask setting |
| |
| usage: |
| |
| long val; |
| ioctl(fd, HDIO_GET_UNMASKINTR, &val); |
| |
| inputs: none |
| |
| outputs: |
| The value of the drive's current unmask setting |
| |
| |
| |
| HDIO_SET_UNMASKINTR permit other irqs during I/O |
| |
| usage: |
| |
| unsigned long val; |
| ioctl(fd, HDIO_SET_UNMASKINTR, val); |
| |
| inputs: |
| New value for unmask flag |
| |
| outputs: none |
| |
| error return: |
| EINVAL (bdev != bdev->bd_contains) (not sure what this means) |
| EACCES Access denied: requires CAP_SYS_ADMIN |
| EINVAL value out of range [0 1] |
| EBUSY Controller busy |
| |
| |
| |
| |
| HDIO_GET_MULTCOUNT get current IDE blockmode setting |
| |
| usage: |
| |
| long val; |
| ioctl(fd, HDIO_GET_MULTCOUNT, &val); |
| |
| inputs: none |
| |
| outputs: |
| The value of the current IDE block mode setting. This |
| controls how many sectors the drive will transfer per |
| interrupt. |
| |
| |
| |
| HDIO_SET_MULTCOUNT change IDE blockmode |
| |
| usage: |
| |
| int val; |
| ioctl(fd, HDIO_SET_MULTCOUNT, val); |
| |
| inputs: |
| New value for IDE block mode setting. This controls how many |
| sectors the drive will transfer per interrupt. |
| |
| outputs: none |
| |
| error return: |
| EINVAL (bdev != bdev->bd_contains) (not sure what this means) |
| EACCES Access denied: requires CAP_SYS_ADMIN |
| EINVAL value out of range supported by disk. |
| EBUSY Controller busy or blockmode already set. |
| EIO Drive did not accept new block mode. |
| |
| notes: |
| |
| Source code comments read: |
| |
| This is tightly woven into the driver->do_special can not |
| touch. DON'T do it again until a total personality rewrite |
| is committed. |
| |
| If blockmode has already been set, this ioctl will fail with |
| EBUSY |
| |
| |
| |
| HDIO_GET_QDMA get use-qdma flag |
| |
| Not implemented, as of 2.6.8.1 |
| |
| |
| |
| HDIO_SET_XFER set transfer rate via proc |
| |
| Not implemented, as of 2.6.8.1 |
| |
| |
| |
| HDIO_OBSOLETE_IDENTITY OBSOLETE, DO NOT USE |
| |
| Same as HDIO_GET_IDENTITY (see below), except that it only |
| returns the first 142 bytes of drive identity information. |
| |
| |
| |
| HDIO_GET_IDENTITY get IDE identification info |
| |
| usage: |
| |
| unsigned char identity[512]; |
| ioctl(fd, HDIO_GET_IDENTITY, identity); |
| |
| inputs: none |
| |
| outputs: |
| |
| ATA drive identity information. For full description, see |
| the IDENTIFY DEVICE and IDENTIFY PACKET DEVICE commands in |
| the ATA specification. |
| |
| error returns: |
| EINVAL (bdev != bdev->bd_contains) (not sure what this means) |
| ENOMSG IDENTIFY DEVICE information not available |
| |
| notes: |
| |
| Returns information that was obtained when the drive was |
| probed. Some of this information is subject to change, and |
| this ioctl does not re-probe the drive to update the |
| information. |
| |
| This information is also available from /proc/ide/hdX/identify |
| |
| |
| |
| HDIO_GET_KEEPSETTINGS get keep-settings-on-reset flag |
| |
| usage: |
| |
| long val; |
| ioctl(fd, HDIO_GET_KEEPSETTINGS, &val); |
| |
| inputs: none |
| |
| outputs: |
| The value of the current "keep settings" flag |
| |
| notes: |
| |
| When set, indicates that kernel should restore settings |
| after a drive reset. |
| |
| |
| |
| HDIO_SET_KEEPSETTINGS keep ioctl settings on reset |
| |
| usage: |
| |
| long val; |
| ioctl(fd, HDIO_SET_KEEPSETTINGS, val); |
| |
| inputs: |
| New value for keep_settings flag |
| |
| outputs: none |
| |
| error return: |
| EINVAL (bdev != bdev->bd_contains) (not sure what this means) |
| EACCES Access denied: requires CAP_SYS_ADMIN |
| EINVAL value out of range [0 1] |
| EBUSY Controller busy |
| |
| |
| |
| HDIO_GET_32BIT get current io_32bit setting |
| |
| usage: |
| |
| long val; |
| ioctl(fd, HDIO_GET_32BIT, &val); |
| |
| inputs: none |
| |
| outputs: |
| The value of the current io_32bit setting |
| |
| notes: |
| |
| 0=16-bit, 1=32-bit, 2,3 = 32bit+sync |
| |
| |
| |
| HDIO_GET_NOWERR get ignore-write-error flag |
| |
| usage: |
| |
| long val; |
| ioctl(fd, HDIO_GET_NOWERR, &val); |
| |
| inputs: none |
| |
| outputs: |
| The value of the current ignore-write-error flag |
| |
| |
| |
| HDIO_GET_DMA get use-dma flag |
| |
| usage: |
| |
| long val; |
| ioctl(fd, HDIO_GET_DMA, &val); |
| |
| inputs: none |
| |
| outputs: |
| The value of the current use-dma flag |
| |
| |
| |
| HDIO_GET_NICE get nice flags |
| |
| usage: |
| |
| long nice; |
| ioctl(fd, HDIO_GET_NICE, &nice); |
| |
| inputs: none |
| |
| outputs: |
| |
| The drive's "nice" values. |
| |
| notes: |
| |
| Per-drive flags which determine when the system will give more |
| bandwidth to other devices sharing the same IDE bus. |
| See <linux/hdreg.h>, near symbol IDE_NICE_DSC_OVERLAP. |
| |
| |
| |
| |
| HDIO_SET_NICE set nice flags |
| |
| usage: |
| |
| unsigned long nice; |
| ... |
| ioctl(fd, HDIO_SET_NICE, nice); |
| |
| inputs: |
| bitmask of nice flags. |
| |
| outputs: none |
| |
| error returns: |
| EACCES Access denied: requires CAP_SYS_ADMIN |
| EPERM Flags other than DSC_OVERLAP and NICE_1 set. |
| EPERM DSC_OVERLAP specified but not supported by drive |
| |
| notes: |
| |
| This ioctl sets the DSC_OVERLAP and NICE_1 flags from values |
| provided by the user. |
| |
| Nice flags are listed in <linux/hdreg.h>, starting with |
| IDE_NICE_DSC_OVERLAP. These values represent shifts. |
| |
| |
| |
| |
| |
| HDIO_GET_WCACHE get write cache mode on|off |
| |
| usage: |
| |
| long val; |
| ioctl(fd, HDIO_GET_WCACHE, &val); |
| |
| inputs: none |
| |
| outputs: |
| The value of the current write cache mode |
| |
| |
| |
| HDIO_GET_ACOUSTIC get acoustic value |
| |
| usage: |
| |
| long val; |
| ioctl(fd, HDIO_GET_ACOUSTIC, &val); |
| |
| inputs: none |
| |
| outputs: |
| The value of the current acoustic settings |
| |
| notes: |
| |
| See HDIO_SET_ACOUSTIC |
| |
| |
| |
| HDIO_GET_ADDRESS |
| |
| usage: |
| |
| long val; |
| ioctl(fd, HDIO_GET_ADDRESS, &val); |
| |
| inputs: none |
| |
| outputs: |
| The value of the current addressing mode: |
| 0 = 28-bit |
| 1 = 48-bit |
| 2 = 48-bit doing 28-bit |
| 3 = 64-bit |
| |
| |
| |
| HDIO_GET_BUSSTATE get the bus state of the hwif |
| |
| usage: |
| |
| long state; |
| ioctl(fd, HDIO_SCAN_HWIF, &state); |
| |
| inputs: none |
| |
| outputs: |
| Current power state of the IDE bus. One of BUSSTATE_OFF, |
| BUSSTATE_ON, or BUSSTATE_TRISTATE |
| |
| error returns: |
| EACCES Access denied: requires CAP_SYS_ADMIN |
| |
| |
| |
| |
| HDIO_SET_BUSSTATE set the bus state of the hwif |
| |
| usage: |
| |
| int state; |
| ... |
| ioctl(fd, HDIO_SCAN_HWIF, state); |
| |
| inputs: |
| Desired IDE power state. One of BUSSTATE_OFF, BUSSTATE_ON, |
| or BUSSTATE_TRISTATE |
| |
| outputs: none |
| |
| error returns: |
| EACCES Access denied: requires CAP_SYS_RAWIO |
| EOPNOTSUPP Hardware interface does not support bus power control |
| |
| |
| |
| |
| HDIO_TRISTATE_HWIF execute a channel tristate |
| |
| Not implemented, as of 2.6.8.1. See HDIO_SET_BUSSTATE |
| |
| |
| |
| HDIO_DRIVE_RESET execute a device reset |
| |
| usage: |
| |
| int args[3] |
| ... |
| ioctl(fd, HDIO_DRIVE_RESET, args); |
| |
| inputs: none |
| |
| outputs: none |
| |
| error returns: |
| EACCES Access denied: requires CAP_SYS_ADMIN |
| |
| notes: |
| |
| Abort any current command, prevent anything else from being |
| queued, execute a reset on the device, and issue BLKRRPART |
| ioctl on the block device. |
| |
| Executes an ATAPI soft reset if applicable, otherwise |
| executes an ATA soft reset on the controller. |
| |
| |
| |
| HDIO_DRIVE_TASKFILE execute raw taskfile |
| |
| Note: If you don't have a copy of the ANSI ATA specification |
| handy, you should probably ignore this ioctl. |
| |
| Execute an ATA disk command directly by writing the "taskfile" |
| registers of the drive. Requires ADMIN and RAWIO access |
| privileges. |
| |
| usage: |
| |
| struct { |
| ide_task_request_t req_task; |
| u8 outbuf[OUTPUT_SIZE]; |
| u8 inbuf[INPUT_SIZE]; |
| } task; |
| memset(&task.req_task, 0, sizeof(task.req_task)); |
| task.req_task.out_size = sizeof(task.outbuf); |
| task.req_task.in_size = sizeof(task.inbuf); |
| ... |
| ioctl(fd, HDIO_DRIVE_TASKFILE, &task); |
| ... |
| |
| inputs: |
| |
| (See below for details on memory area passed to ioctl.) |
| |
| io_ports[8] values to be written to taskfile registers |
| hob_ports[8] high-order bytes, for extended commands. |
| out_flags flags indicating which registers are valid |
| in_flags flags indicating which registers should be returned |
| data_phase see below |
| req_cmd command type to be executed |
| out_size size of output buffer |
| outbuf buffer of data to be transmitted to disk |
| inbuf buffer of data to be received from disk (see [1]) |
| |
| outputs: |
| |
| io_ports[] values returned in the taskfile registers |
| hob_ports[] high-order bytes, for extended commands. |
| out_flags flags indicating which registers are valid (see [2]) |
| in_flags flags indicating which registers should be returned |
| outbuf buffer of data to be transmitted to disk (see [1]) |
| inbuf buffer of data to be received from disk |
| |
| error returns: |
| EACCES CAP_SYS_ADMIN or CAP_SYS_RAWIO privilege not set. |
| ENOMSG Device is not a disk drive. |
| ENOMEM Unable to allocate memory for task |
| EFAULT req_cmd == TASKFILE_IN_OUT (not implemented as of 2.6.8) |
| EPERM req_cmd == TASKFILE_MULTI_OUT and drive |
| multi-count not yet set. |
| |
| |
| notes: |
| |
| [1] Currently (2.6.8), both the input and output buffers are |
| copied from the user and written back to the user, even when |
| not used. This may be a bug. |
| |
| [2] The out_flags and in_flags are returned to the user after |
| the ioctl completes. Currently (2.6.8) these are the same |
| as the input values, unchanged. In the future, they may have |
| more significance. |
| |
| Extreme caution should be used with using this ioctl. A |
| mistake can easily corrupt data or hang the system. |
| |
| The argument to the ioctl is a pointer to a region of memory |
| containing a ide_task_request_t structure, followed by an |
| optional buffer of data to be transmitted to the drive, |
| followed by an optional buffer to receive data from the drive. |
| |
| Command is passed to the disk drive via the ide_task_request_t |
| structure, which contains these fields: |
| |
| io_ports[8] values for the taskfile registers |
| hob_ports[8] high-order bytes, for extended commands |
| out_flags flags indicating which entries in the |
| io_ports[] and hob_ports[] arrays |
| contain valid values. Type ide_reg_valid_t. |
| in_flags flags indicating which entries in the |
| io_ports[] and hob_ports[] arrays |
| are expected to contain valid values |
| on return. |
| data_phase See below |
| req_cmd Command type, see below |
| out_size output (user->drive) buffer size, bytes |
| in_size input (drive->user) buffer size, bytes |
| |
| This ioctl does not necessarily respect all flags in the |
| out_flags and in_flags values -- some taskfile registers |
| may be written or read even if not requested in the flags. |
| Unused fields of io_ports[] and hob_ports[] should be set |
| to zero. |
| |
| The data_phase field describes the data transfer to be |
| performed. Value is one of: |
| |
| TASKFILE_IN |
| TASKFILE_MULTI_IN |
| TASKFILE_OUT |
| TASKFILE_MULTI_OUT |
| TASKFILE_IN_OUT |
| TASKFILE_IN_DMA |
| TASKFILE_IN_DMAQ |
| TASKFILE_OUT_DMA |
| TASKFILE_OUT_DMAQ |
| TASKFILE_P_IN |
| TASKFILE_P_IN_DMA |
| TASKFILE_P_IN_DMAQ |
| TASKFILE_P_OUT |
| TASKFILE_P_OUT_DMA |
| TASKFILE_P_OUT_DMAQ |
| |
| The req_cmd field classifies the command type. It may be |
| one of: |
| |
| IDE_DRIVE_TASK_NO_DATA |
| IDE_DRIVE_TASK_SET_XFER |
| IDE_DRIVE_TASK_IN |
| IDE_DRIVE_TASK_OUT |
| IDE_DRIVE_TASK_RAW_WRITE |
| |
| |
| |
| |
| |
| |
| HDIO_DRIVE_CMD execute a special drive command |
| |
| Note: If you don't have a copy of the ANSI ATA specification |
| handy, you should probably ignore this ioctl. |
| |
| usage: |
| |
| u8 args[4+XFER_SIZE]; |
| ... |
| ioctl(fd, HDIO_DRIVE_CMD, args); |
| |
| inputs: |
| |
| Taskfile register values: |
| args[0] COMMAND |
| args[1] SECTOR |
| args[2] FEATURE |
| args[3] NSECTOR |
| |
| outputs: |
| |
| args[] buffer is filled with register values followed by any |
| data returned by the disk. |
| args[0] status |
| args[1] error |
| args[2] NSECTOR |
| args[3] undefined |
| args[4+] NSECTOR * 512 bytes of data returned by the command. |
| |
| error returns: |
| EACCES Access denied: requires CAP_SYS_RAWIO |
| ENOMEM Unable to allocate memory for task |
| |
| notes: |
| |
| Taskfile registers IDE_LCYL, IDE_HCYL, and IDE_SELECT are |
| set to zero before executing the command. |
| |
| |
| |
| HDIO_DRIVE_TASK execute task and special drive command |
| |
| Note: If you don't have a copy of the ANSI ATA specification |
| handy, you should probably ignore this ioctl. |
| |
| usage: |
| |
| u8 args[7]; |
| ... |
| ioctl(fd, HDIO_DRIVE_TASK, args); |
| |
| inputs: |
| |
| Taskfile register values: |
| args[0] COMMAND |
| args[1] FEATURE |
| args[2] NSECTOR |
| args[3] SECTOR |
| args[4] LCYL |
| args[5] HCYL |
| args[6] SELECT |
| |
| outputs: |
| |
| Taskfile register values: |
| args[0] status |
| args[1] error |
| args[2] NSECTOR |
| args[3] SECTOR |
| args[4] LCYL |
| args[5] HCYL |
| args[6] SELECT |
| |
| error returns: |
| EACCES Access denied: requires CAP_SYS_RAWIO |
| ENOMEM Unable to allocate memory for task |
| |
| |
| |
| |
| HDIO_DRIVE_CMD_AEB HDIO_DRIVE_TASK |
| |
| Not implemented, as of 2.6.8.1 |
| |
| |
| |
| HDIO_SET_32BIT change io_32bit flags |
| |
| usage: |
| |
| int val; |
| ioctl(fd, HDIO_SET_32BIT, val); |
| |
| inputs: |
| New value for io_32bit flag |
| |
| outputs: none |
| |
| error return: |
| EINVAL (bdev != bdev->bd_contains) (not sure what this means) |
| EACCES Access denied: requires CAP_SYS_ADMIN |
| EINVAL value out of range [0 3] |
| EBUSY Controller busy |
| |
| |
| |
| |
| HDIO_SET_NOWERR change ignore-write-error flag |
| |
| usage: |
| |
| int val; |
| ioctl(fd, HDIO_SET_NOWERR, val); |
| |
| inputs: |
| New value for ignore-write-error flag. Used for ignoring |
| WRERR_STAT |
| |
| outputs: none |
| |
| error return: |
| EINVAL (bdev != bdev->bd_contains) (not sure what this means) |
| EACCES Access denied: requires CAP_SYS_ADMIN |
| EINVAL value out of range [0 1] |
| EBUSY Controller busy |
| |
| |
| |
| HDIO_SET_DMA change use-dma flag |
| |
| usage: |
| |
| long val; |
| ioctl(fd, HDIO_SET_DMA, val); |
| |
| inputs: |
| New value for use-dma flag |
| |
| outputs: none |
| |
| error return: |
| EINVAL (bdev != bdev->bd_contains) (not sure what this means) |
| EACCES Access denied: requires CAP_SYS_ADMIN |
| EINVAL value out of range [0 1] |
| EBUSY Controller busy |
| |
| |
| |
| HDIO_SET_PIO_MODE reconfig interface to new speed |
| |
| usage: |
| |
| long val; |
| ioctl(fd, HDIO_SET_PIO_MODE, val); |
| |
| inputs: |
| New interface speed. |
| |
| outputs: none |
| |
| error return: |
| EINVAL (bdev != bdev->bd_contains) (not sure what this means) |
| EACCES Access denied: requires CAP_SYS_ADMIN |
| EINVAL value out of range [0 255] |
| EBUSY Controller busy |
| |
| |
| |
| HDIO_SCAN_HWIF register and (re)scan interface |
| |
| usage: |
| |
| int args[3] |
| ... |
| ioctl(fd, HDIO_SCAN_HWIF, args); |
| |
| inputs: |
| args[0] io address to probe |
| args[1] control address to probe |
| args[2] irq number |
| |
| outputs: none |
| |
| error returns: |
| EACCES Access denied: requires CAP_SYS_RAWIO |
| EIO Probe failed. |
| |
| notes: |
| |
| This ioctl initializes the addresses and irq for a disk |
| controller, probes for drives, and creates /proc/ide |
| interfaces as appropiate. |
| |
| |
| |
| HDIO_UNREGISTER_HWIF unregister interface |
| |
| usage: |
| |
| int index; |
| ioctl(fd, HDIO_UNREGISTER_HWIF, index); |
| |
| inputs: |
| index index of hardware interface to unregister |
| |
| outputs: none |
| |
| error returns: |
| EACCES Access denied: requires CAP_SYS_RAWIO |
| |
| notes: |
| |
| This ioctl removes a hardware interface from the kernel. |
| |
| Currently (2.6.8) this ioctl silently fails if any drive on |
| the interface is busy. |
| |
| |
| |
| HDIO_SET_WCACHE change write cache enable-disable |
| |
| usage: |
| |
| int val; |
| ioctl(fd, HDIO_SET_WCACHE, val); |
| |
| inputs: |
| New value for write cache enable |
| |
| outputs: none |
| |
| error return: |
| EINVAL (bdev != bdev->bd_contains) (not sure what this means) |
| EACCES Access denied: requires CAP_SYS_ADMIN |
| EINVAL value out of range [0 1] |
| EBUSY Controller busy |
| |
| |
| |
| HDIO_SET_ACOUSTIC change acoustic behavior |
| |
| usage: |
| |
| int val; |
| ioctl(fd, HDIO_SET_ACOUSTIC, val); |
| |
| inputs: |
| New value for drive acoustic settings |
| |
| outputs: none |
| |
| error return: |
| EINVAL (bdev != bdev->bd_contains) (not sure what this means) |
| EACCES Access denied: requires CAP_SYS_ADMIN |
| EINVAL value out of range [0 254] |
| EBUSY Controller busy |
| |
| |
| |
| HDIO_SET_QDMA change use-qdma flag |
| |
| Not implemented, as of 2.6.8.1 |
| |
| |
| |
| HDIO_SET_ADDRESS change lba addressing modes |
| |
| usage: |
| |
| int val; |
| ioctl(fd, HDIO_SET_ADDRESS, val); |
| |
| inputs: |
| New value for addressing mode |
| 0 = 28-bit |
| 1 = 48-bit |
| 2 = 48-bit doing 28-bit |
| |
| outputs: none |
| |
| error return: |
| EINVAL (bdev != bdev->bd_contains) (not sure what this means) |
| EACCES Access denied: requires CAP_SYS_ADMIN |
| EINVAL value out of range [0 2] |
| EBUSY Controller busy |
| EIO Drive does not support lba48 mode. |
| |
| |
| HDIO_SET_IDE_SCSI |
| |
| usage: |
| |
| long val; |
| ioctl(fd, HDIO_SET_IDE_SCSI, val); |
| |
| inputs: |
| New value for scsi emulation mode (?) |
| |
| outputs: none |
| |
| error return: |
| EINVAL (bdev != bdev->bd_contains) (not sure what this means) |
| EACCES Access denied: requires CAP_SYS_ADMIN |
| EINVAL value out of range [0 1] |
| EBUSY Controller busy |
| |
| |
| |
| HDIO_SET_SCSI_IDE |
| |
| Not implemented, as of 2.6.8.1 |
| |
| |