xref: /netbsd/sys/arch/mac68k/obio/iwm_fdvar.h (revision 6550d01e)
1 /*	$NetBSD: iwm_fdvar.h,v 1.14 2008/05/26 17:58:37 hauke Exp $	*/
2 
3 /*
4  * Copyright (c) 1997, 1998 Hauke Fath.  All rights reserved.
5  *
6  * Redistribution and use in source and binary forms, with or without
7  * modification, are permitted provided that the following conditions
8  * are met:
9  * 1. Redistributions of source code must retain the above copyright
10  *    notice, this list of conditions and the following disclaimer.
11  * 2. Redistributions in binary form must reproduce the above copyright
12  *    notice, this list of conditions and the following disclaimer in the
13  *    documentation and/or other materials provided with the distribution.
14  *
15  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
16  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
17  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
18  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
19  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
20  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
21  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
22  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
23  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
24  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
25  */
26 #ifndef _MAC68K_FDVAR_H
27 #define _MAC68K_FDVAR_H
28 
29 /**
30  **	Constants
31  **/
32 
33 enum {
34 	IWM_MAX_DRIVE = 2,		/* Attachable drives */
35 	IWM_GCR_DISK_ZONES = 5,		/* Zones on GCR disk */
36 	IWM_MAX_GCR_SECTORS = 12,	/* Max. sectors per GCR track */
37 	IWM_MAX_FLOPPY_SECT = 50,	/* Larger than the highest sector */
38 					/* number likely to occur */
39 };
40 
41 
42 /* Physical track format codes */
43 enum {
44 	IWM_GCR,		/* Apple's Group Code Recording format */
45 	IWM_MFM_DD,		/* Standard MFM on DD disk (250 KBit/s)	*/
46 	IWM_MFM_HD		/* Standard MFM on HD disk (500 KBit/s)	*/
47 };
48 
49 /* Drive softc flags */
50 enum {
51 	IWM_FD_IS_OPEN	= 0x00000001,
52 	IWM_FD_MOTOR_ON = 0x00000002
53 };
54 
55 /* seek() behaviour */
56 enum {
57 	IWM_SEEK_VANILLA,
58 	IWM_SEEK_RECAL,
59 	IWM_SEEK_VERIFY
60 };
61 
62 /* I/O direction */
63 enum {
64 	IWM_WRITE = 0,
65 	IWM_READ
66 };
67 
68 
69 /**
70  **	Data Types
71  **/
72 
73 /*
74  * Floppy disk format information
75  *
76  * XXX How to describe ZBR here? UN*X disk drive handling -- clinging
77  *     tenaciously to the trailing edge of technology...
78  */
79 struct fdInfo {
80 	short	heads;			/* # of heads the drive has */
81 	short	tracks;			/* # of tracks per side (cyl's)	*/
82 	short	sectorSize;		/* Bytes per sector */
83 	short	secPerTrack;		/* fake	*/
84 	short	secPerCyl;		/* fake	*/
85 	short	secPerDisk;		/* # of sectors per __disk__ */
86 	short	stepRate;		/* in ms (is a software delay) */
87 	short	interleave;		/* Sector interleave */
88 	short	physFormat;		/* GCR, MFM DD, MFM HD */
89 	const char	*description;
90 };
91 typedef struct fdInfo fdInfo_t;
92 
93 /*
94  * Current physical location on Sony GCR disk
95  */
96 struct diskPosition {
97 	short	track;
98 	short	oldTrack;
99 	short	side;
100 	short	sector;
101 	short	maxSect;		/* Highest sector # for this track */
102 };
103 typedef struct diskPosition diskPosition_t;
104 
105 /*
106  * Zone recording scheme (per disk surface/head)
107  */
108 struct diskZone {
109 	short	tracks;			/* # of tracks per zone	*/
110 	short	sectPerTrack;
111 	short	firstBlock;
112 	short	lastBlock;
113 };
114 typedef struct diskZone diskZone_t;
115 
116 /*
117  * Arguments passed between iwmAttach() and the fd probe routines.
118  */
119 struct iwmAttachArgs {
120 	fdInfo_t *driveType;		/* Default drive parameters */
121 	short	unit;			/* Current drive # */
122 };
123 typedef struct iwmAttachArgs iwmAttachArgs_t;
124 
125 /*
126  * Software state per disk: the IWM can have max. 2 drives. Newer
127  * machines don't even have a port for an external drive.
128  *
129  */
130 struct fd_softc {
131 	struct device devInfo;		/* generic device info */
132 	struct disk diskInfo;		/* generic disk info */
133 	struct bufq_state *bufQueue;	/* queue of buf's */
134 	int sc_active;			/* number of active requests */
135 	struct callout motor_ch;	/* motor callout */
136 
137 /* private stuff here */
138 /* errors & retries in current I/O job */
139 	int	iwmErr;			/* Last IO error */
140 	int	ioRetries;
141 	int	seekRetries;
142 	int	sectRetries;
143 	int	verifyRetries;
144 
145 /* hardware info */
146 	int	drvFlags;		/* Copy of drive flags */
147 	short   stepDirection;		/* Current step direction */
148 	diskPosition_t pos;		/* Physical position on disk */
149 
150 
151 /* drive info */
152 	short	unit;			/* Drive # as seen by IWM */
153 	short	partition;		/* "Partition" info {a,b,c,...} */
154 	fdInfo_t *defaultType;		/* default floppy format */
155 	fdInfo_t *currentType;		/* current floppy format */
156 	int     state;			/* XXX */
157 
158 /* data transfer info */
159 	int	ioDirection;		/* Read/write */
160 	daddr_t	startBlk;		/* Starting block # */
161 	int	bytesLeft;		/* Bytes left to transfer */
162 	int	bytesDone;		/* Bytes transferred */
163 	char *current_buffer; 	/* target of current data transfer */
164 	unsigned char *cbuf;		/* ptr to cylinder cache */
165 	int	cachedSide;		/* Which head is cached? */
166 	cylCacheSlot_t r_slots[IWM_MAX_GCR_SECTORS];
167 	cylCacheSlot_t w_slots[IWM_MAX_GCR_SECTORS];
168 	int	writeLabel;		/* Write access to disklabel? */
169 	sectorHdr_t sHdr;		/* current sector header */
170 };
171 typedef struct fd_softc fd_softc_t;
172 
173 /*
174  * Software state of IWM controller
175  *
176  * SWIM/MFM mode may have some state to keep here.
177  */
178 struct iwm_softc {
179 	struct device devInfo;		/* generic device info */
180 	int	drives;			/* # of attached fd's */
181 	fd_softc_t *fd[IWM_MAX_DRIVE];	/* ptrs to children */
182 
183 	int	state;			/* make that an enum? */
184 	u_char	modeReg;		/* Copy of IWM mode register */
185 	short	maxRetries;		/* I/O retries */
186 	int	errors;
187 	int	underruns;		/* data not delivered in time */
188 };
189 typedef struct iwm_softc iwm_softc_t;
190 
191 
192 /**
193  **     Exported functions
194  **/
195 
196 /*
197  * IWM Loadable Kernel Module : Exported functions
198  */
199 #ifdef _LKM
200 int	fdModInit(void);
201 void	fdModFree(void);
202 #endif
203 
204 int 	iwmInit(void);
205 int 	iwmCheckDrive(int32_t);
206 int	iwmSelectDrive(int32_t);
207 int	iwmSelectSide(int32_t);
208 int	iwmTrack00(void);
209 int	iwmSeek(int32_t);
210 
211 int     iwmReadSector(sectorHdr_t *, cylCacheSlot_t *, void *);
212 int	iwmWriteSector(sectorHdr_t *, cylCacheSlot_t *);
213 
214 int	iwmDiskEject(int32_t);		/* drive = [0..1] */
215 int	iwmMotor(int32_t, int32_t);	/* on(1)/off(0)	*/
216 
217 /*
218  * Debugging only
219  */
220 int	iwmQueryDrvFlag(int32_t, int32_t); /* reg = [0..15] */
221 
222 /* Make sure we run at splhigh when calling! */
223 int	iwmReadSectHdr(sectorHdr_t *);
224 
225 #if 0 /* XXX not yet */
226 int	iwmReadRawSector(int32_t, void *);
227 int	iwmWriteRawSector(int32_t, void *);
228 int	iwmReadRawTrack(int32_t, void *);
229 #endif
230 
231 #endif /* _MAC68K_FDVAR_H */
232