summaryrefslogtreecommitdiff
path: root/static/netbsd/man9/wdc.9
diff options
context:
space:
mode:
Diffstat (limited to 'static/netbsd/man9/wdc.9')
-rw-r--r--static/netbsd/man9/wdc.9412
1 files changed, 412 insertions, 0 deletions
diff --git a/static/netbsd/man9/wdc.9 b/static/netbsd/man9/wdc.9
new file mode 100644
index 00000000..6884a664
--- /dev/null
+++ b/static/netbsd/man9/wdc.9
@@ -0,0 +1,412 @@
+.\" $NetBSD: wdc.9,v 1.19 2015/04/28 09:48:31 prlw1 Exp $
+.\"
+.\" Copyright (c) 1998 Manuel Bouyer.
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\" notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\" notice, this list of conditions and the following disclaimer in the
+.\" documentation and/or other materials provided with the distribution.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+.\" IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+.\" OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+.\" IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+.\" INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+.\" NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+.\" DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+.\" THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+.\" INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+.\" THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+.\"
+.\"
+.Dd April 18, 2010
+.Dt WDC 9
+.Os
+.Sh NAME
+.Nm wdc
+.Nd machine-independent IDE/ATAPI driver
+.Sh SYNOPSIS
+.In dev/ata/atavar.h
+.In sys/dev/ic/wdcvar.h
+.Ft int
+.Fn wdcprobe "struct channel_softc * chp"
+.Ft void
+.Fn wdcattach "struct channel_softc * chp"
+.Sh DESCRIPTION
+The
+.Nm
+driver provides the machine independent core functions for driving IDE
+devices.
+IDE devices-specific drivers
+.Po
+.Xr wd 4
+or
+.Xr atapibus 4
+.Pc
+will use services provided by
+.Nm .
+.Pp
+The machine-dependent bus front-end provides information to
+.Nm
+with the
+.Va wdc_softc
+and
+.Va channel_softc
+structures.
+The first one defines global controller properties, and the second contains
+per-channel information.
+.Nm
+returns information about the attached devices in the
+.Va ata_drive_datas
+structure.
+.Bd -literal
+struct wdc_softc { /* Per controller state */
+ struct device sc_dev;
+ int cap;
+#define WDC_CAPABILITY_DATA16 0x0001
+#define WDC_CAPABILITY_DATA32 0x0002
+#define WDC_CAPABILITY_MODE 0x0004
+#define WDC_CAPABILITY_DMA 0x0008
+#define WDC_CAPABILITY_UDMA 0x0010
+#define WDC_CAPABILITY_HWLOCK 0x0020
+#define WDC_CAPABILITY_ATA_NOSTREAM 0x0040
+#define WDC_CAPABILITY_ATAPI_NOSTREAM 0x0080
+#define WDC_CAPABILITY_NO_EXTRA_RESETS 0x0100
+#define WDC_CAPABILITY_PREATA 0x0200
+#define WDC_CAPABILITY_IRQACK 0x0400
+#define WDC_CAPABILITY_SINGLE_DRIVE 0x0800
+#define WDC_CAPABILITY_NOIRQ 0x1000
+#define WDC_CAPABILITY_SELECT 0x2000
+ uint8_t pio_mode;
+ uint8_t dma_mode;
+ int nchannels;
+ struct channel_softc *channels;
+
+ void *dma_arg;
+ int (*dma_init)(void *, int, int, void *, size_t, int);
+ void (*dma_start)(void *, int, int, int);
+ int (*dma_finish)(void *, int, int, int);
+#define WDC_DMA_READ 0x01
+#define WDC_DMA_POLL 0x02
+
+ int (*claim_hw)(void *, int);
+ void (*free_hw)(void *);
+};
+
+struct channel_softc { /* Per channel data */
+ int channel;
+ struct wdc_softc *wdc;
+ bus_space_tag_t cmd_iot;
+ bus_space_handle_t cmd_ioh;
+ bus_space_tag_t ctl_iot;
+ bus_space_handle_t ctl_ioh;
+ bus_space_tag_t data32iot;
+ bus_space_handle_t data32ioh;
+ int ch_flags;
+#define WDCF_ACTIVE 0x01
+#define WDCF_IRQ_WAIT 0x10
+ uint8_t ch_status;
+ uint8_t ch_error;
+ struct ata_drive_datas ch_drive[2];
+ struct channel_queue *ch_queue;
+};
+
+struct ata_drive_datas {
+ uint8_t drive;
+ uint8_t drive_flags;
+#define DRIVE_ATA 0x01
+#define DRIVE_ATAPI 0x02
+#define DRIVE (DRIVE_ATA|DRIVE_ATAPI)
+#define DRIVE_CAP32 0x04
+#define DRIVE_DMA 0x08
+#define DRIVE_UDMA 0x10
+#define DRIVE_MODE 0x20
+ uint8_t PIO_mode;
+ uint8_t DMA_mode;
+ uint8_t UDMA_mode;
+ uint8_t state;
+
+ struct device *drv_softc;
+ void* chnl_softc;
+};
+.Ed
+.Pp
+The bus front-end needs to fill in the following elements of
+.Va wdc_softc :
+.Bl -tag -compact -width "dma_finish" -offset "xxxx"
+.It cap
+supports one or more of the WDC_CAPABILITY flags
+.It nchannels
+number of channels supported by this controller
+.It channels
+array of
+.Va struct channel_softc
+of size
+.Va nchannels
+properly initialised
+.El
+The following elements are optional:
+.Bl -tag -compact -width "dma_finish" -offset "xxxx"
+.It pio_mode
+.It dma_mode
+.It dma_arg
+.It dma_init
+.It dma_start
+.It dma_finish
+.It claim_hw
+.It free_hw
+.El
+.Pp
+The
+.Dv WDC_CAPABILITY_DATA16
+and
+.Dv WDC_CAPABILITY_DATA32
+flags informs
+.Nm
+whether the controller supports 16- or 32-bit I/O accesses on the data port.
+If both are set, a test will be done for each drive using the ATA or
+ATAPI IDENTIFY command, to automatically select the working mode.
+.Pp
+The
+.Dv WDC_CAPABILITY_DMA
+and
+.Dv WDC_CAPABILITY_UDMA
+flags are set for controllers supporting the DMA and Ultra-DMA modes.
+The bus front-end needs to provide the
+.Fn dma_init ,
+.Fn dma_start
+and
+.Fn dma_finish
+functions.
+.Fn dma_init
+is called just before issuing a DMA command to the IDE device.
+The arguments are, respectively:
+.Va dma_arg ,
+the channel number, the drive number on this channel,
+the virtual address of the DMA buffer, the size of the transfer, and the
+.Dv WDC_DMA
+flags.
+.Fn dma_start
+is called just after issuing a DMA command to the IDE device.
+The arguments are, respectively:
+.Va dma_arg ,
+the channel number, the drive number on this channel, and the
+.Dv WDC_DMA
+flags.
+.Fn dma_finish
+is called once the transfer is complete.
+The arguments are, respectively:
+.Va dma_arg ,
+the channel number, the drive number on this channel, and the
+.Dv WDC_DMA
+flags.
+.Dv WDC_DMA_READ
+indicates the direction of the data transfer, and
+.Dv WDC_DMA_POLL
+indicates if the transfer will use (or used) interrupts.
+.Pp
+The
+.Dv WDC_CAPABILITY_MODE
+flag means that the bus front-end can program the PIO and DMA modes, so
+.Nm
+needs to provide back the supported modes for each drive, and set the drives
+modes.
+The
+.Va pio_mode
+and
+.Va dma_mode
+needs to be set to the highest PIO and DMA mode supported.
+If
+.Dv WDC_CAPABILITY_UDMA
+is set, then
+.Va dma_mode
+must be set to the highest Ultra-DMA mode supported.
+If
+.Dv WDC_CAPABILITY_MODE
+is not set,
+.Nm
+will not attempt to change the current drive's settings, assuming the host's
+firmware has done it right.
+.Pp
+The
+.Dv WDC_CAPABILITY_HWLOCK
+flag is set for controllers needing hardware looking before accessing the
+I/O ports.
+If this flag is set, the bus front-end needs to provide the
+.Fn claim_hw
+and
+.Fn free_hw
+functions.
+.Fn claim_hw
+will be called when the driver wants to access the controller ports.
+The second parameter is set to 1 when it is possible to sleep waiting
+for the lock, 0 otherwise.
+It should return 1 when access has been granted, 0 otherwise.
+When access has not been granted and sleep is not allowed, the bus
+front-end shall call
+.Fn wdcrestart
+with the first argument passed to
+.Fn claim_hw
+as argument.
+This arguments will also be the one passed to
+.Fn free_hw .
+This function is called once the transfer is complete, so that the lock can
+be released.
+.Pp
+Accesses to the data port are done by using the bus_space stream functions,
+unless the
+.Dv WDC_CAPABILITY_ATA_NOSTREAM
+or
+.Dv WDC_CAPABILITY_ATAPI_NOSTREAM
+flags are set.
+This should not be used, unless the data bus is not wired properly (which
+seems common on big-endian systems), and byte-order needs to be preserved
+for compatibility with the host's firmware.
+Also note that the IDE bus is a little-endian bus, so the bus_space
+functions used for the bus_space tag passed in the
+.Va channel_softc
+have to do the appropriate byte-swapping for big-endian systems.
+.Pp
+.Dv WDC_CAPABILITY_NO_EXTRA_RESETS
+avoid the controller reset at the end of the disks probe.
+This reset is needed for some controllers, but causes problems with some
+others.
+.Pp
+.Dv WDC_CAPABILITY_NOIRQ
+tells the driver that this controller doesn't have its interrupt lines
+wired up usefully, so it should always use polled transfers.
+.Pp
+The bus front-end needs to fill in the following
+elements of
+.Va channel_softc :
+.Bl -tag -compact -width "dma_finish" -offset "xxxx"
+.It channel
+The channel number on the controller
+.It wdc
+A pointer to the controller's wdc_softc
+.It cmd_iot, cmd_ioh
+Bus-space tag and handle for access to the command block registers (which
+includes the 16-bit data port)
+.It ctl_iot, ctl_ioh
+Bus-space tag and handle for access to the control block registers
+.It ch_queue
+A pointer to a
+.Va struct channel_queue .
+This will hold the queues of outstanding commands for this controller.
+.El
+The following elements are optional:
+.Bl -tag -compact -width "dma_finish" -offset "xxxx"
+.It data32iot, data32ioh
+Bus-space tag and handle for 32-bit data accesses.
+Only needed if
+.Dv WDC_CAPABILITY_DATA32
+is set in the controller's
+.Va wdc_softc .
+.El
+.Pp
+.Va ch_queue
+can point to a common
+.Va struct channel_queue
+if the controller doesn't support concurrent access to its different channels.
+If all channels are independent, it is recommended that each channel has
+its own
+.Va ch_queue
+(for better performance).
+.Pp
+The bus-specific front-end can use the
+.Fn wdcprobe
+function, with a properly initialised
+.Va struct channel_softc
+as argument (
+.Va wdc
+can be set to NULL.
+This allows
+.Fn wdcprobe
+to be easily used in bus front-end probe functions).
+This function will return an integer where bit 0 will be set if the master
+device has been found, and 1 if the slave device has been found.
+.Pp
+The bus-specific attach function has to call
+.Fn wdcattach
+for each channel, with a pointer to a properly initialised
+.Va channel softc
+as argument.
+This will probe devices attached to the IDE channel and attach them.
+Once this function returns, the
+.Va ch_drive
+array of the
+.Va channel_softc
+will contain the drive's capabilities.
+This can be used to properly initialise the controller's mode, or disable a
+channel without drives.
+.Pp
+The elements of interest in
+.Va ata_drive_datas
+for a bus front-end are:
+.Bl -tag -compact -width "dma_finish" -offset "xxxx"
+.It drive
+The drive number
+.It drive_flags
+Flags indicating the drive capabilities.
+A null
+.Va drive_flags
+indicate either that no drive is here, or that no driver was
+found for this device.
+.It PIO_mode, DMA_mode, UDMA_mode
+the highest supported modes for this drive compatible with the controller's
+capabilities.
+Needs to be reset to the mode to use by the drive, if known.
+.It drv_softc
+A pointer to the drive's softc.
+Can be used to print the drive's name.
+.El
+.Pp
+.Va drive_flags
+handles the following flags:
+.Bl -tag -compact -width "dma_finish" -offset "xxxx"
+.It DRIVE_ATA, DRIVE_ATAPI
+Gives the drive type, if any.
+The shortcut DRIVE can be used to just test the presence/absence of a drive.
+.It DRIVE_CAP32
+This drive works with 32-bit data I/O.
+.It DRIVE_DMA
+This drive supports DMA.
+.It DRIVE_UDMA
+This drive supports Ultra-DMA.
+.It DRIVE_MODE
+This drive properly reported its PIO and DMA mode.
+.El
+.Pp
+Once the controller has been initialised, it has to reset the
+.Dv DRIVE_DMA
+and
+.Dv DRIVE_UDMA ,
+as well as the values of
+.Va PIO_mode ,
+.Va DMA_mode
+and
+.Va UDMA_mode
+if the modes to be used are not highest ones supported by the drive.
+.Sh CODE REFERENCES
+The wdc core functions are implemented in
+.Pa sys/dev/ic/wdc.c .
+Low-level ATA and ATAPI support is provided by
+.Pa sys/dev/ata_wdc.c
+and
+.Pa sys/dev/scsipi/atapi_wdc.c
+respectively.
+.Pp
+An example of a simple bus front-end can be found in
+.Pa sys/dev/isapnp/wdc_isapnp.c .
+A more complex one, with multiple channels and bus-master DMA support is
+.Pa sys/dev/pci/pciide.c .
+.Pa sys/arch/atari/dev/wdc_mb.c
+makes use of hardware locking, and also provides an example of bus-front
+end for a big-endian system, which needs byte-swapping bus_space functions.
+.Sh SEE ALSO
+.Xr wdc 4 ,
+.Xr bus_space 9