1132286Snyan/*- 2131819Snyan * Copyright (c) 2004 M. Warner Losh. 3131819Snyan * All rights reserved. 4131819Snyan * 5131819Snyan * Redistribution and use in source and binary forms, with or without 6131819Snyan * modification, are permitted provided that the following conditions 7131819Snyan * are met: 8131819Snyan * 1. Redistributions of source code must retain the above copyright 9131819Snyan * notice, this list of conditions, and the following disclaimer, 10131819Snyan * without modification, immediately at the beginning of the file. 11131819Snyan * 2. Redistributions in binary form must reproduce the above copyright 12131819Snyan * notice, this list of conditions and the following disclaimer in 13131819Snyan * the documentation and/or other materials provided with the 14131819Snyan * distribution. 15131819Snyan * 16131819Snyan * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 17131819Snyan * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 18131819Snyan * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 19131819Snyan * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR 20131819Snyan * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 21131819Snyan * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 22131819Snyan * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 23131819Snyan * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 24131819Snyan * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 25131819Snyan * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 26131819Snyan * SUCH DAMAGE. 27131819Snyan * 28131819Snyan * $FreeBSD: releng/10.3/sys/pc98/cbus/fdcvar.h 132286 2004-07-17 10:07:19Z nyan $ 29131819Snyan */ 30131819Snyan 31131819Snyan/* XXX should audit this file to see if additional copyrights needed */ 32131819Snyan 33131819Snyanenum fdc_type 34131819Snyan{ 35131819Snyan FDC_NE765, FDC_ENHANCED, FDC_UNKNOWN = -1 36131819Snyan}; 37131819Snyan 38131819Snyanenum fdc_states { 39131819Snyan DEVIDLE, 40131819Snyan FINDWORK, 41131819Snyan DOSEEK, 42131819Snyan SEEKCOMPLETE , 43131819Snyan IOCOMPLETE, 44131819Snyan RECALCOMPLETE, 45131819Snyan STARTRECAL, 46131819Snyan RESETCTLR, 47131819Snyan SEEKWAIT, 48131819Snyan RECALWAIT, 49131819Snyan MOTORWAIT, 50131819Snyan IOTIMEDOUT, 51131819Snyan RESETCOMPLETE, 52131819Snyan PIOREAD 53131819Snyan}; 54131819Snyan 55131819Snyan#ifdef FDC_DEBUG 56131819Snyanstatic char const * const fdstates[] = { 57131819Snyan "DEVIDLE", 58131819Snyan "FINDWORK", 59131819Snyan "DOSEEK", 60131819Snyan "SEEKCOMPLETE", 61131819Snyan "IOCOMPLETE", 62131819Snyan "RECALCOMPLETE", 63131819Snyan "STARTRECAL", 64131819Snyan "RESETCTLR", 65131819Snyan "SEEKWAIT", 66131819Snyan "RECALWAIT", 67131819Snyan "MOTORWAIT", 68131819Snyan "IOTIMEDOUT", 69131819Snyan "RESETCOMPLETE", 70131819Snyan "PIOREAD" 71131819Snyan}; 72131819Snyan#endif 73131819Snyan 74131819Snyan/* 75131819Snyan * Per controller structure (softc). 76131819Snyan */ 77131819Snyanstruct fdc_data 78131819Snyan{ 79131819Snyan int fdcu; /* our unit number */ 80131819Snyan int dmacnt; 81131819Snyan int dmachan; 82131819Snyan int flags; 83131819Snyan#define FDC_STAT_VALID 0x08 84131819Snyan#define FDC_HAS_FIFO 0x10 85131819Snyan#define FDC_NEEDS_RESET 0x20 86131819Snyan#define FDC_NODMA 0x40 87131819Snyan#define FDC_ISPNP 0x80 88131819Snyan#define FDC_ISPCMCIA 0x100 89131819Snyan struct fd_data *fd; 90131819Snyan int fdu; /* the active drive */ 91131819Snyan enum fdc_states state; 92131819Snyan int retry; 93131819Snyan#ifndef PC98 94131819Snyan int fdout; /* mirror of the w/o digital output reg */ 95131819Snyan#endif 96131819Snyan u_int status[7]; /* copy of the registers */ 97131819Snyan enum fdc_type fdct; /* chip version of FDC */ 98131819Snyan int fdc_errs; /* number of logged errors */ 99131819Snyan int dma_overruns; /* number of DMA overruns */ 100131819Snyan struct bio_queue_head head; 101131819Snyan struct bio *bp; /* active buffer */ 102131819Snyan#ifdef PC98 103131819Snyan struct resource *res_ioport, *res_fdsio, *res_fdemsio; 104131819Snyan struct resource *res_irq, *res_drq; 105131819Snyan int rid_ioport, rid_irq, rid_drq; 106131819Snyan#else 107131819Snyan struct resource *res_ioport, *res_ctl, *res_irq, *res_drq; 108131819Snyan int rid_ioport, rid_ctl, rid_irq, rid_drq; 109131819Snyan#endif 110131819Snyan int port_off; 111131819Snyan bus_space_tag_t portt; 112131819Snyan bus_space_handle_t porth; 113131819Snyan#ifdef PC98 114131819Snyan bus_space_tag_t sc_fdsiot; 115131819Snyan bus_space_handle_t sc_fdsioh; 116131819Snyan bus_space_tag_t sc_fdemsiot; 117131819Snyan bus_space_handle_t sc_fdemsioh; 118131819Snyan#else 119131819Snyan bus_space_tag_t ctlt; 120131819Snyan bus_space_handle_t ctlh; 121131819Snyan#endif 122131819Snyan void *fdc_intr; 123131819Snyan struct device *fdc_dev; 124131819Snyan#ifndef PC98 125131819Snyan void (*fdctl_wr)(struct fdc_data *fdc, u_int8_t v); 126131819Snyan#endif 127131819Snyan}; 128131819Snyan 129131819Snyantypedef int fdu_t; 130131819Snyantypedef int fdcu_t; 131131819Snyantypedef int fdsu_t; 132131819Snyantypedef struct fd_data *fd_p; 133131819Snyantypedef struct fdc_data *fdc_p; 134131819Snyantypedef enum fdc_type fdc_t; 135131819Snyan 136131819Snyan/* error returns for fd_cmd() */ 137131819Snyan#define FD_FAILED -1 138131819Snyan#define FD_NOT_VALID -2 139131819Snyan#define FDC_ERRMAX 100 /* do not log more */ 140131819Snyan 141131819Snyanextern devclass_t fdc_devclass; 142131819Snyan 143132103Snyanenum fdc_device_ivars { 144132103Snyan FDC_IVAR_FDUNIT, 145132103Snyan FDC_IVAR_FDTYPE, 146132103Snyan}; 147132103Snyan 148132103Snyan__BUS_ACCESSOR(fdc, fdunit, FDC, FDUNIT, int); 149132103Snyan__BUS_ACCESSOR(fdc, fdtype, FDC, FDTYPE, int); 150132103Snyan 151131819Snyanint fdc_alloc_resources(struct fdc_data *); 152131819Snyan#ifndef PC98 153131819Snyanvoid fdout_wr(fdc_p, u_int8_t); 154131819Snyan#endif 155131819Snyanint fd_cmd(struct fdc_data *, int, ...); 156131819Snyanvoid fdc_release_resources(struct fdc_data *); 157131819Snyanint fdc_attach(device_t); 158132286Snyanint fdc_hints_probe(device_t); 159131819Snyanint fdc_detach(device_t dev); 160132286Snyandevice_t fdc_add_child(device_t, const char *, int); 161132103Snyanint fdc_initial_reset(struct fdc_data *); 162131819Snyanint fdc_print_child(device_t, device_t); 163131819Snyanint fdc_read_ivar(device_t, device_t, int, uintptr_t *); 164132103Snyanint fdc_write_ivar(device_t, device_t, int, uintptr_t); 165132286Snyan#ifndef PC98 166132286Snyanint fdc_isa_alloc_resources(device_t, struct fdc_data *); 167132286Snyan#endif 168