xref: /openbsd-src/sys/dev/ata/wdvar.h (revision d677d78dad70f7b6170eb7b4f7ca34609242b6d8)
1*d677d78dSmpi /*	$OpenBSD: wdvar.h,v 1.21 2014/07/09 12:56:28 mpi Exp $	*/
27481efa2Scsapuntz /*	$NetBSD: wdvar.h,v 1.3 1998/11/11 19:38:27 bouyer Exp $	*/
37481efa2Scsapuntz 
47481efa2Scsapuntz /*
59a5cc0e7Sgrange  * Copyright (c) 1998, 2001 Manuel Bouyer.
67481efa2Scsapuntz  *
77481efa2Scsapuntz  * Redistribution and use in source and binary forms, with or without
87481efa2Scsapuntz  * modification, are permitted provided that the following conditions
97481efa2Scsapuntz  * are met:
107481efa2Scsapuntz  * 1. Redistributions of source code must retain the above copyright
117481efa2Scsapuntz  *    notice, this list of conditions and the following disclaimer.
127481efa2Scsapuntz  * 2. Redistributions in binary form must reproduce the above copyright
137481efa2Scsapuntz  *    notice, this list of conditions and the following disclaimer in the
147481efa2Scsapuntz  *    documentation and/or other materials provided with the distribution.
157481efa2Scsapuntz  *
169a5cc0e7Sgrange  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
179a5cc0e7Sgrange  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
189a5cc0e7Sgrange  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
199a5cc0e7Sgrange  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
209a5cc0e7Sgrange  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
219a5cc0e7Sgrange  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
229a5cc0e7Sgrange  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
239a5cc0e7Sgrange  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
249a5cc0e7Sgrange  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
259a5cc0e7Sgrange  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
267481efa2Scsapuntz  *
277481efa2Scsapuntz  */
287481efa2Scsapuntz 
29bca4f8cbSgrange #ifndef _DEV_ATA_WDVAR_H_
30bca4f8cbSgrange #define _DEV_ATA_WDVAR_H_
31bca4f8cbSgrange 
327481efa2Scsapuntz /* Params needed by the controller to perform an ATA bio */
337481efa2Scsapuntz struct ata_bio {
347481efa2Scsapuntz     volatile u_int16_t flags; /* cmd flags */
357481efa2Scsapuntz #define ATA_NOSLEEP 0x0001 /* Can't sleep */
367481efa2Scsapuntz #define ATA_POLL    0x0002 /* poll for completion */
377481efa2Scsapuntz #define ATA_ITSDONE 0x0004 /* the transfer is as done as it gets */
387481efa2Scsapuntz #define ATA_SINGLE  0x0008 /* transfer has to be done in single-sector mode */
3959a52720Sjmc #define ATA_LBA     0x0010 /* transfer uses LBA addressing */
4059a52720Sjmc #define ATA_READ    0x0020 /* transfer is a read (otherwise a write) */
417481efa2Scsapuntz #define ATA_CORR    0x0040 /* transfer had a corrected error */
4259a52720Sjmc #define ATA_LBA48   0x0080 /* transfer uses 48-bit LBA addressing */
437481efa2Scsapuntz     int multi; /* number of blocks to transfer in multi-mode */
447481efa2Scsapuntz     struct disklabel *lp; /* pointer to drive's label info */
451abdbfdeSderaadt     daddr_t blkno; /* block addr */
461abdbfdeSderaadt     daddr_t blkdone; /* number of blks transferred */
471abdbfdeSderaadt     daddr_t nblks; /* number of block currently transferring */
4898c26657Sguenther     int     nbytes; /* number of bytes currently transferring */
497481efa2Scsapuntz     long    bcount; /* total number of bytes */
5059a52720Sjmc     char   *databuf; /* data buffer address */
517481efa2Scsapuntz     volatile int error;
527481efa2Scsapuntz #define NOERROR   0 /* There was no error (r_error invalid) */
537481efa2Scsapuntz #define ERROR     1 /* check r_error */
547481efa2Scsapuntz #define ERR_DF    2 /* Drive fault */
557481efa2Scsapuntz #define ERR_DMA   3 /* DMA error */
567481efa2Scsapuntz #define TIMEOUT   4 /* device timed out */
57f97ca3e4Scsapuntz #define ERR_NODEV 5 /* device bas been detached */
587481efa2Scsapuntz     u_int8_t r_error; /* copy of error register */
59f97ca3e4Scsapuntz     struct wd_softc *wd;
607481efa2Scsapuntz };
617481efa2Scsapuntz 
62dba50645Sderaadt struct wd_softc {
63dba50645Sderaadt 	/* General disk infos */
64dba50645Sderaadt 	struct device sc_dev;
65dba50645Sderaadt 	struct disk sc_dk;
66dba50645Sderaadt 	struct bufq sc_bufq;
67dba50645Sderaadt 
68dba50645Sderaadt 	/* IDE disk soft states */
69dba50645Sderaadt 	struct ata_bio sc_wdc_bio; /* current transfer */
70dba50645Sderaadt 	struct buf *sc_bp; /* buf being transferred */
71dba50645Sderaadt 	struct ata_drive_datas *drvp; /* Our controller's infos */
72dba50645Sderaadt 	int openings;
73dba50645Sderaadt 	struct ataparams sc_params;/* drive characteristics found */
74dba50645Sderaadt 	int sc_flags;
75dba50645Sderaadt /*
76dba50645Sderaadt  * XXX Nothing resets this yet, but disk change sensing will when ATA-4 is
77dba50645Sderaadt  * more fully implemented.
78dba50645Sderaadt  */
79dba50645Sderaadt #define WDF_LOADED	0x10 /* parameters loaded */
80dba50645Sderaadt #define WDF_WAIT	0x20 /* waiting for resources */
81dba50645Sderaadt #define WDF_LBA		0x40 /* using LBA mode */
82dba50645Sderaadt #define WDF_LBA48	0x80 /* using 48-bit LBA mode */
83dba50645Sderaadt 
84dba50645Sderaadt 	u_int64_t sc_capacity;
85dba50645Sderaadt 	int cyl; /* actual drive parameters */
86dba50645Sderaadt 	int heads;
87dba50645Sderaadt 	int sectors;
88dba50645Sderaadt 	int retries; /* number of xfer retry */
89dba50645Sderaadt 	struct timeout sc_restart_timeout;
90dba50645Sderaadt };
91dba50645Sderaadt 
927481efa2Scsapuntz /* drive states stored in ata_drive_datas */
937481efa2Scsapuntz #define RECAL          0
947481efa2Scsapuntz #define RECAL_WAIT     1
957481efa2Scsapuntz #define PIOMODE        2
967481efa2Scsapuntz #define PIOMODE_WAIT   3
977481efa2Scsapuntz #define DMAMODE        4
987481efa2Scsapuntz #define DMAMODE_WAIT   5
997481efa2Scsapuntz #define GEOMETRY       6
1007481efa2Scsapuntz #define GEOMETRY_WAIT  7
1017481efa2Scsapuntz #define MULTIMODE      8
1027481efa2Scsapuntz #define MULTIMODE_WAIT 9
1037481efa2Scsapuntz #define READY          10
1047481efa2Scsapuntz 
105c4071fd1Smillert int wdc_ata_bio(struct ata_drive_datas*, struct ata_bio*);
106e33b04c7Sderaadt int wd_hibernate_io(dev_t dev, daddr_t blkno, vaddr_t addr, size_t size,
107dba50645Sderaadt 	    int wr, void *page);
1087481efa2Scsapuntz 
109c4071fd1Smillert void wddone(void *);
110bca4f8cbSgrange 
111bca4f8cbSgrange #endif	/* !_DEV_ATA_WDVAR_H_ */
112