		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 cannot
	    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
	  ENXIO		No such device:	phy dead or ctl_addr == 0
	  EIO		I/O error:	reset timed out or hardware error

	notes:

	  Execute a reset on the device as soon as the current IO
	  operation has completed.

	  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.
	  EIO		Drive failed the command.

	notes:

	  [1] READ THE FOLLOWING NOTES *CAREFULLY*.  THIS IOCTL IS
	  FULL OF GOTCHAS.  Extreme caution should be used with using
	  this ioctl.  A mistake can easily corrupt data or hang the
	  system.

	  [2] Both the input and output buffers are copied from the
	  user and written back to the user, even when not used.

	  [3] If one or more bits are set in out_flags and in_flags is
	  zero, the following values are used for in_flags.all and
	  written back into in_flags on completion.

	   * IDE_TASKFILE_STD_IN_FLAGS | (IDE_HOB_STD_IN_FLAGS << 8)
	     if LBA48 addressing is enabled for the drive
	   * IDE_TASKFILE_STD_IN_FLAGS
	     if CHS/LBA28

	  The association between in_flags.all and each enable
	  bitfield flips depending on endianness; fortunately, TASKFILE
	  only uses inflags.b.data bit and ignores all other bits.
	  The end result is that, on any endian machines, it has no
	  effect other than modifying in_flags on completion.

	  [4] The default value of SELECT is (0xa0|DEV_bit|LBA_bit)
	  except for four drives per port chipsets.  For four drives
	  per port chipsets, it's (0xa0|DEV_bit|LBA_bit) for the first
	  pair and (0x80|DEV_bit|LBA_bit) for the second pair.

	  [5] 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

	  When out_flags is zero, the following registers are loaded.

	    HOB_FEATURE		If the drive supports LBA48
	    HOB_NSECTOR		If the drive supports LBA48
	    HOB_SECTOR		If the drive supports LBA48
	    HOB_LCYL		If the drive supports LBA48
	    HOB_HCYL		If the drive supports LBA48
	    FEATURE
	    NSECTOR
	    SECTOR
	    LCYL
	    HCYL
	    SELECT		First, masked with 0xE0 if LBA48, 0xEF
				otherwise; then, or'ed with the default
				value of SELECT.

	  If any bit in out_flags is set, the following registers are loaded.

	    HOB_DATA		If out_flags.b.data is set.  HOB_DATA will
				travel on DD8-DD15 on little endian machines
				and on DD0-DD7 on big endian machines.
	    DATA		If out_flags.b.data is set.  DATA will
				travel on DD0-DD7 on little endian machines
				and on DD8-DD15 on big endian machines.
	    HOB_NSECTOR		If out_flags.b.nsector_hob is set
	    HOB_SECTOR		If out_flags.b.sector_hob is set
	    HOB_LCYL		If out_flags.b.lcyl_hob is set
	    HOB_HCYL		If out_flags.b.hcyl_hob is set
	    FEATURE		If out_flags.b.feature is set
	    NSECTOR		If out_flags.b.nsector is set
	    SECTOR		If out_flags.b.sector is set
	    LCYL		If out_flags.b.lcyl is set
	    HCYL		If out_flags.b.hcyl is set
	    SELECT		Or'ed with the default value of SELECT and
				loaded regardless of out_flags.b.select.

	  Taskfile registers are read back from the drive into
	  {io|hob}_ports[] after the command completes iff one of the
	  following conditions is met; otherwise, the original values
	  will be written back, unchanged.

	    1. The drive fails the command (EIO).
	    2. One or more than one bits are set in out_flags.
	    3. The requested data_phase is TASKFILE_NO_DATA.

	    HOB_DATA		If in_flags.b.data is set.  It will contain
				DD8-DD15 on little endian machines and
				DD0-DD7 on big endian machines.
	    DATA		If in_flags.b.data is set.  It will contain
				DD0-DD7 on little endian machines and
				DD8-DD15 on big endian machines.
	    HOB_FEATURE		If the drive supports LBA48
	    HOB_NSECTOR		If the drive supports LBA48
	    HOB_SECTOR		If the drive supports LBA48
	    HOB_LCYL		If the drive supports LBA48
	    HOB_HCYL		If the drive supports LBA48
	    NSECTOR
	    SECTOR
	    LCYL
	    HCYL

	  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		== IN_DMA (queueing not supported)
	    TASKFILE_OUT_DMA
	    TASKFILE_OUT_DMAQ		== OUT_DMA (queueing not supported)
	    TASKFILE_P_IN		unimplemented
	    TASKFILE_P_IN_DMA		unimplemented
	    TASKFILE_P_IN_DMAQ		unimplemented
	    TASKFILE_P_OUT		unimplemented
	    TASKFILE_P_OUT_DMA		unimplemented
	    TASKFILE_P_OUT_DMAQ		unimplemented

	  The req_cmd field classifies the command type.  It may be
	  one of:

	    IDE_DRIVE_TASK_NO_DATA
	    IDE_DRIVE_TASK_SET_XFER	unimplemented
	    IDE_DRIVE_TASK_IN
	    IDE_DRIVE_TASK_OUT		unimplemented
	    IDE_DRIVE_TASK_RAW_WRITE

	  [6] Do not access {in|out}_flags->all except for resetting
	  all the bits.  Always access individual bit fields.  ->all
	  value will flip depending on endianness.  For the same
	  reason, do not use IDE_{TASKFILE|HOB}_STD_{OUT|IN}_FLAGS
	  constants defined in hdreg.h.



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:

	  Commands other than WIN_SMART
	    args[0]	COMMAND
	    args[1]	NSECTOR
	    args[2]	FEATURE
	    args[3]	NSECTOR

	  WIN_SMART
	    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
	  EIO		Drive reports error

	notes:

	  [1] For commands other than WIN_SMART, args[1] should equal
	  args[3].  SECTOR, LCYL and HCYL are undefined.  For
	  WIN_SMART, 0x4f and 0xc2 are loaded into LCYL and HCYL
	  respectively.  In both cases SELECT will contain the default
	  value for the drive.  Please refer to HDIO_DRIVE_TASKFILE
	  notes for the default value of SELECT.

	  [2] If NSECTOR value is greater than zero and the drive sets
	  DRQ when interrupting for the command, NSECTOR * 512 bytes
	  are read from the device into the area following NSECTOR.
	  In the above example, the area would be
	  args[4..4+XFER_SIZE].  16bit PIO is used regardless of
	  HDIO_SET_32BIT setting.

	  [3] If COMMAND == WIN_SETFEATURES && FEATURE == SETFEATURES_XFER
	  && NSECTOR >= XFER_SW_DMA_0 && the drive supports any DMA
	  mode, IDE driver will try to tune the transfer mode of the
	  drive accordingly.



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
	  ENOMSG	Device is not a disk drive.
	  EIO		Drive failed the command.

	notes:

	  [1] DEV bit (0x10) of SELECT register is ignored and the
	  appropriate value for the drive is used.  All other bits
	  are used unaltered.



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 appropriate.



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


