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