[BACK]Return to atavar.h CVS log [TXT][DIR] Up to [local] / sys / dev / ata

Annotation of sys/dev/ata/atavar.h, Revision 1.1.1.1

1.1       nbrk        1: /*     $OpenBSD: atavar.h,v 1.18 2004/09/24 07:05:44 grange Exp $      */
                      2: /*     $NetBSD: atavar.h,v 1.13 1999/03/10 13:11:43 bouyer Exp $       */
                      3:
                      4: /*
                      5:  * Copyright (c) 1998, 2001 Manuel Bouyer.
                      6:  *
                      7:  * Redistribution and use in source and binary forms, with or without
                      8:  * modification, are permitted provided that the following conditions
                      9:  * are met:
                     10:  * 1. Redistributions of source code must retain the above copyright
                     11:  *    notice, this list of conditions and the following disclaimer.
                     12:  * 2. Redistributions in binary form must reproduce the above copyright
                     13:  *    notice, this list of conditions and the following disclaimer in the
                     14:  *    documentation and/or other materials provided with the distribution.
                     15:  * 3. All advertising materials mentioning features or use of this software
                     16:  *    must display the following acknowledgement:
                     17:  *     This product includes software developed by Manuel Bouyer.
                     18:  * 4. Neither the name of the University nor the names of its contributors
                     19:  *    may be used to endorse or promote products derived from this software
                     20:  *    without specific prior written permission.
                     21:  *
                     22:  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
                     23:  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
                     24:  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
                     25:  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
                     26:  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
                     27:  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
                     28:  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
                     29:  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
                     30:  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
                     31:  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
                     32:  *
                     33:  */
                     34:
                     35: #ifndef _DEV_ATA_ATAVAR_H_
                     36: #define _DEV_ATA_ATAVAR_H_
                     37:
                     38: /* High-level functions and structures used by both ATA and ATAPI devices */
                     39: #include <dev/ata/atareg.h>
                     40:
                     41: /* Datas common to drives and controller drivers */
                     42: struct ata_drive_datas {
                     43:        u_int8_t drive; /* drive number */
                     44:        int8_t ata_vers; /* ATA version supported */
                     45:        u_int16_t drive_flags; /* bitmask for drives present/absent and cap */
                     46: #define DRIVE_ATA      0x0001
                     47: #define DRIVE_ATAPI    0x0002
                     48: #define DRIVE_OLD      0x0004
                     49: #define DRIVE (DRIVE_ATA|DRIVE_ATAPI|DRIVE_OLD)
                     50: #define DRIVE_CAP32    0x0008
                     51: #define DRIVE_DMA      0x0010
                     52: #define DRIVE_UDMA     0x0020
                     53: #define DRIVE_MODE     0x0040 /* the drive reported its mode */
                     54: #define DRIVE_RESET    0x0080 /* reset the drive state at next xfer */
                     55: #define DRIVE_DMAERR   0x0100 /* Udma transfer had crc error, don't try DMA */
                     56: #define DRIVE_DSCBA    0x0200 /* DSC in buffer availability mode */
                     57: #define DRIVE_DSCWAIT  0x0400 /* In wait for DSC to be asserted */
                     58: #define DRIVE_DEVICE_RESET 0x0800 /* Drive supports DEVICE RESET command */
                     59: #define DRIVE_SATA     0x1000 /* SATA drive */
                     60:        /*
                     61:         * Current setting of drive's PIO, DMA and UDMA modes.
                     62:         * Is initialised by the disks drivers at attach time, and may be
                     63:         * changed later by the controller's code if needed
                     64:         */
                     65:        u_int8_t PIO_mode; /* Current setting of drive's PIO mode */
                     66:        u_int8_t DMA_mode; /* Current setting of drive's DMA mode */
                     67:        u_int8_t UDMA_mode; /* Current setting of drive's UDMA mode */
                     68:        /* Supported modes for this drive */
                     69:        u_int8_t PIO_cap; /* supported drive's PIO mode */
                     70:        u_int8_t DMA_cap; /* supported drive's DMA mode */
                     71:        u_int8_t UDMA_cap; /* supported drive's UDMA mode */
                     72:        /*
                     73:         * Drive state. This is drive-type (ATA or ATAPI) dependant
                     74:         * This is reset to 0 after a channel reset.
                     75:         */
                     76:        u_int8_t state;
                     77:
                     78: #define ACAP_LEN            0x01  /* 16 byte commands */
                     79: #define ACAP_DSC            0x02  /* use DSC signalling */
                     80:        /* 0x20-0x40 reserved for ATAPI_CFG_DRQ_MASK */
                     81:        u_int8_t atapi_cap;
                     82:
                     83:        /* Keeps track of the number of resets that have occurred in a row
                     84:           without a successful command completion. */
                     85:        u_int8_t n_resets;
                     86:        u_int8_t n_dmaerrs;
                     87:        u_int32_t n_xfers;
                     88: #define NERRS_MAX 4
                     89: #define NXFER 1000
                     90:
                     91:        char drive_name[31];
                     92:        int  cf_flags;
                     93:        void *chnl_softc; /* channel softc */
                     94:
                     95:        struct ataparams id;
                     96: };
                     97:
                     98: /* ATA/ATAPI common attachement datas */
                     99: struct ata_atapi_attach {
                    100:     u_int8_t aa_type; /* Type of device */
                    101: #define T_ATA 0
                    102: #define T_ATAPI 1
                    103:     u_int8_t aa_channel; /* controller's channel */
                    104:     u_int8_t aa_openings; /* Number of simultaneous commands possible */
                    105:     struct ata_drive_datas *aa_drv_data;
                    106:     void *aa_bus_private; /* infos specifics to this bus */
                    107: };
                    108:
                    109: /* User config flags that force (or disable) the use of a mode */
                    110: #define ATA_CONFIG_PIO_MODES   0x0007
                    111: #define ATA_CONFIG_PIO_SET     0x0008
                    112: #define ATA_CONFIG_PIO_OFF     0
                    113: #define ATA_CONFIG_DMA_MODES   0x0070
                    114: #define ATA_CONFIG_DMA_SET     0x0080
                    115: #define ATA_CONFIG_DMA_DISABLE 0x0070
                    116: #define ATA_CONFIG_DMA_OFF     4
                    117: #define ATA_CONFIG_UDMA_MODES  0x0700
                    118: #define ATA_CONFIG_UDMA_SET    0x0800
                    119: #define ATA_CONFIG_UDMA_DISABLE        0x0700
                    120: #define ATA_CONFIG_UDMA_OFF    8
                    121:
                    122: /*
                    123:  * ATA/ATAPI commands description
                    124:  *
                    125:  * This structure defines the interface between the ATA/ATAPI device driver
                    126:  * and the controller for short commands. It contains the command's parameter,
                    127:  * the len of data's to read/write (if any), and a function to call upon
                    128:  * completion.
                    129:  * If no sleep is allowed, the driver can poll for command completion.
                    130:  * Once the command completed, if the error registed is valid, the flag
                    131:  * AT_ERROR is set and the error register value is copied to r_error .
                    132:  * A separate interface is needed for read/write or ATAPI packet commands
                    133:  * (which need multiple interrupts per commands).
                    134:  */
                    135: struct wdc_command {
                    136:     u_int8_t r_command;  /* Parameters to upload to registers */
                    137:     u_int8_t r_head;
                    138:     u_int16_t r_cyl;
                    139:     u_int8_t r_sector;
                    140:     u_int8_t r_count;
                    141:     u_int8_t r_precomp;
                    142:     u_int8_t r_st_bmask; /* status register mask to wait for before command */
                    143:     u_int8_t r_st_pmask; /* status register mask to wait for after command */
                    144:     u_int8_t r_error;    /* error register after command done */
                    145:     volatile u_int16_t flags;
                    146: #define AT_READ     0x0001 /* There is data to read */
                    147: #define AT_WRITE    0x0002 /* There is data to write (excl. with AT_READ) */
                    148: #define AT_WAIT     0x0008 /* wait in controller code for command completion */
                    149: #define AT_POLL     0x0010 /* poll for command completion (no interrupts) */
                    150: #define AT_DONE     0x0020 /* command is done */
                    151: #define AT_ERROR    0x0040 /* command is done with error */
                    152: #define AT_TIMEOU   0x0080 /* command timed out */
                    153: #define AT_DF       0x0100 /* Drive fault */
                    154: #define AT_READREG  0x0200 /* Read registers on completion */
                    155:     int timeout;         /* timeout (in ms) */
                    156:     void *data;          /* Data buffer address */
                    157:     int bcount;          /* number of bytes to transfer */
                    158:     void (*callback)(void *); /* command to call once command completed */
                    159:     void *callback_arg;  /* argument passed to *callback() */
                    160: };
                    161:
                    162: extern int at_poll;
                    163:
                    164: int wdc_exec_command(struct ata_drive_datas *, struct wdc_command*);
                    165: #define WDC_COMPLETE  0x01
                    166: #define WDC_QUEUED    0x02
                    167: #define WDC_TRY_AGAIN 0x03
                    168:
                    169: void wdc_probe_caps(struct ata_drive_datas*, struct ataparams *);
                    170: void wdc_print_caps(struct ata_drive_datas*);
                    171: int  wdc_downgrade_mode(struct ata_drive_datas*);
                    172:
                    173: void wdc_reset_channel(struct ata_drive_datas *);
                    174:
                    175: int wdc_ata_addref(struct ata_drive_datas *);
                    176: void wdc_ata_delref(struct ata_drive_datas *);
                    177: void wdc_ata_kill_pending(struct ata_drive_datas *);
                    178:
                    179: int ata_get_params(struct ata_drive_datas*, u_int8_t,
                    180:        struct ataparams *);
                    181: int ata_set_mode(struct ata_drive_datas*, u_int8_t, u_int8_t);
                    182: /* return code for these cmds */
                    183: #define CMD_OK    0
                    184: #define CMD_ERR   1
                    185: #define CMD_AGAIN 2
                    186:
                    187: void ata_dmaerr(struct ata_drive_datas *);
                    188: void ata_perror(struct ata_drive_datas *, int, char *, size_t);
                    189:
                    190: #endif /* !_DEV_ATA_ATAVAR_H_ */

CVSweb