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