⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 hdio.txt

📁 linux 内核源代码
💻 TXT
📖 第 1 页 / 共 2 页
字号:
	    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 endianess; 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 endianess.  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.1HDIO_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 busyHDIO_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 busyHDIO_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 busyHDIO_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 busyHDIO_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 busyHDIO_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 busyHDIO_SET_QDMA			change use-qdma flag	Not implemented, as of 2.6.8.1HDIO_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 busyHDIO_SET_SCSI_IDE	Not implemented, as of 2.6.8.1

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -