xref: /freebsd/sys/dev/fdc/fdcvar.h (revision 6b3455a7665208c366849f0b2b3bc916fb97516e)
1 /*-
2  * Copyright (c) 2004 M. Warner Losh.
3  * All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  * 1. Redistributions of source code must retain the above copyright
9  *    notice, this list of conditions, and the following disclaimer,
10  *    without modification, immediately at the beginning of the file.
11  * 2. Redistributions in binary form must reproduce the above copyright
12  *    notice, this list of conditions and the following disclaimer in
13  *    the documentation and/or other materials provided with the
14  *    distribution.
15  *
16  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
17  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19  * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR
20  * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
21  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
22  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
23  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
24  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
25  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
26  * SUCH DAMAGE.
27  *
28  * $FreeBSD$
29  */
30 
31 /* XXX should audit this file to see if additional copyrights needed */
32 
33 enum fdc_type
34 {
35 	FDC_NE765, FDC_ENHANCED, FDC_UNKNOWN = -1
36 };
37 
38 enum fdc_states {
39 	DEVIDLE,
40 	FINDWORK,
41 	DOSEEK,
42 	SEEKCOMPLETE ,
43 	IOCOMPLETE,
44 	RECALCOMPLETE,
45 	STARTRECAL,
46 	RESETCTLR,
47 	SEEKWAIT,
48 	RECALWAIT,
49 	MOTORWAIT,
50 	IOTIMEDOUT,
51 	RESETCOMPLETE,
52 	PIOREAD
53 };
54 
55 #ifdef	FDC_DEBUG
56 static char const * const fdstates[] = {
57 	"DEVIDLE",
58 	"FINDWORK",
59 	"DOSEEK",
60 	"SEEKCOMPLETE",
61 	"IOCOMPLETE",
62 	"RECALCOMPLETE",
63 	"STARTRECAL",
64 	"RESETCTLR",
65 	"SEEKWAIT",
66 	"RECALWAIT",
67 	"MOTORWAIT",
68 	"IOTIMEDOUT",
69 	"RESETCOMPLETE",
70 	"PIOREAD"
71 };
72 #endif
73 
74 /*
75  * Per controller structure (softc).
76  */
77 struct fdc_data
78 {
79 	int	fdcu;		/* our unit number */
80 	int	dmacnt;
81 	int	dmachan;
82 	int	flags;
83 #define FDC_STAT_VALID	0x08
84 #define FDC_HAS_FIFO	0x10
85 #define FDC_NEEDS_RESET	0x20
86 #define FDC_NODMA	0x40
87 #define FDC_ISPNP	0x80
88 #define FDC_ISPCMCIA	0x100
89 	struct	fd_data *fd;
90 	int	fdu;		/* the active drive	*/
91 	enum	fdc_states state;
92 	int	retry;
93 	int	fdout;		/* mirror of the w/o digital output reg */
94 	u_int	status[7];	/* copy of the registers */
95 	enum	fdc_type fdct;	/* chip version of FDC */
96 	int	fdc_errs;	/* number of logged errors */
97 	int	dma_overruns;	/* number of DMA overruns */
98 	struct	bio_queue_head head;
99 	struct	bio *bp;	/* active buffer */
100 	struct	resource *res_ioport, *res_ctl, *res_irq, *res_drq;
101 	int	rid_ioport, rid_ctl, rid_irq, rid_drq;
102 	int	port_off;
103 	bus_space_tag_t portt;
104 	bus_space_handle_t porth;
105 	bus_space_tag_t ctlt;
106 	bus_space_handle_t ctlh;
107 	void	*fdc_intr;
108 	struct	device *fdc_dev;
109 	void	(*fdctl_wr)(struct fdc_data *fdc, u_int8_t v);
110 };
111 
112 typedef int	fdu_t;
113 typedef int	fdcu_t;
114 typedef int	fdsu_t;
115 typedef	struct fd_data *fd_p;
116 typedef struct fdc_data *fdc_p;
117 typedef enum fdc_type fdc_t;
118 
119 /* error returns for fd_cmd() */
120 #define FD_FAILED -1
121 #define FD_NOT_VALID -2
122 #define FDC_ERRMAX	100	/* do not log more */
123 
124 extern devclass_t fdc_devclass;
125 
126 enum fdc_device_ivars {
127 	FDC_IVAR_FDUNIT,
128 	FDC_IVAR_FDTYPE,
129 };
130 
131 __BUS_ACCESSOR(fdc, fdunit, FDC, FDUNIT, int);
132 __BUS_ACCESSOR(fdc, fdtype, FDC, FDTYPE, int);
133 
134 int fdc_alloc_resources(struct fdc_data *);
135 void fdout_wr(fdc_p, u_int8_t);
136 int fd_cmd(struct fdc_data *, int, ...);
137 void fdc_release_resources(struct fdc_data *);
138 int fdc_attach(device_t);
139 int fdc_hints_probe(device_t);
140 int fdc_detach(device_t dev);
141 device_t fdc_add_child(device_t, const char *, int);
142 int fdc_initial_reset(struct fdc_data *);
143 int fdc_print_child(device_t, device_t);
144 int fdc_read_ivar(device_t, device_t, int, uintptr_t *);
145 int fdc_write_ivar(device_t, device_t, int, uintptr_t);
146 int fdc_isa_alloc_resources(device_t, struct fdc_data *);
147