1 /*
2  * SWIM access through the IOP
3  * Written by Joshua M. Thompson
4  */
5 
6 /* IOP number and channel number for the SWIM */
7 
8 #define SWIM_IOP	IOP_NUM_ISM
9 #define SWIM_CHAN	1
10 
11 /* Command code: */
12 
13 #define CMD_INIT		0x01	/* Initialize                  */
14 #define CMD_SHUTDOWN		0x02	/* Shutdown                    */
15 #define CMD_START_POLL		0x03	/* Start insert/eject polling  */
16 #define CMD_STOP_POLL		0x04	/* Stop insert/eject polling   */
17 #define CMD_SETHFSTAG		0x05	/* Set HFS tag buffer address  */
18 #define CMD_STATUS		0x06	/* Status                      */
19 #define CMD_EJECT		0x07	/* Eject                       */
20 #define CMD_FORMAT		0x08	/* Format                      */
21 #define CMD_FORMAT_VERIFY	0x09	/* Format and Verify           */
22 #define CMD_WRITE		0x0A	/* Write                       */
23 #define CMD_READ		0x0B	/* Read                        */
24 #define CMD_READ_VERIFY		0x0C	/* Read and Verify             */
25 #define CMD_CACHE_CTRL		0x0D	/* Cache control               */
26 #define CMD_TAGBUFF_CTRL	0x0E	/* Tag buffer control          */
27 #define CMD_GET_ICON		0x0F	/* Get Icon                    */
28 
29 /* Drive types: */
30 
31 /* note: apple sez DRV_FDHD is 4, but I get back a type */
32 /*       of 5 when I do a drive status check on my FDHD */
33 
34 #define	DRV_NONE	0	/* No drive             */
35 #define	DRV_UNKNOWN	1	/* Unspecified drive    */
36 #define	DRV_400K	2	/* 400K                 */
37 #define	DRV_800K	3	/* 400K/800K            */
38 #define	DRV_FDHD	5	/* 400K/800K/720K/1440K */
39 #define	DRV_HD20	7	/* Apple HD20           */
40 
41 /* Format types: */
42 
43 #define	FMT_HD20	0x0001	/*  Apple HD20 */
44 #define	FMT_400K	0x0002	/*  400K (GCR) */
45 #define	FMT_800K	0x0004	/*  800K (GCR) */
46 #define	FMT_720K	0x0008	/*  720K (MFM) */
47 #define	FMT_1440K	0x0010	/* 1.44M (MFM) */
48 
49 #define	FMD_KIND_400K	1
50 #define	FMD_KIND_800K	2
51 #define	FMD_KIND_720K	3
52 #define	FMD_KIND_1440K	1
53 
54 /* Icon Flags: */
55 
56 #define	ICON_MEDIA	0x01	/* Have IOP supply media icon */
57 #define	ICON_DRIVE	0x01	/* Have IOP supply drive icon */
58 
59 /* Error codes: */
60 
61 #define	gcrOnMFMErr	-400	/* GCR (400/800K) on HD media */
62 #define	verErr		-84	/* verify failed */
63 #define	fmt2Err		-83	/* cant get enough sync during format */
64 #define	fmt1Err		-82	/* can't find sector 0 after track format */
65 #define	sectNFErr	-81	/* can't find sector */
66 #define	seekErr		-80	/* drive error during seek */
67 #define	spdAdjErr	-79	/* can't set drive speed */
68 #define	twoSideErr	-78	/* drive is single-sided */
69 #define	initIWMErr	-77	/* error during initialization */
70 #define	tk0badErr	-76	/* track zero is bad */
71 #define	cantStepErr	-75	/* drive error during step */
72 #define	wrUnderrun	-74	/* write underrun occurred */
73 #define	badDBtSlp	-73	/* bad data bitslip marks */
74 #define	badDCksum	-72	/* bad data checksum */
75 #define	noDtaMkErr	-71	/* can't find data mark */
76 #define	badBtSlpErr	-70	/* bad address bitslip marks */
77 #define	badCksmErr	-69	/* bad address-mark checksum */
78 #define	dataVerErr	-68	/* read-verify failed */
79 #define	noAdrMkErr	-67	/* can't find an address mark */
80 #define	noNybErr	-66	/* no nybbles? disk is probably degaussed */
81 #define	offLinErr	-65	/* no disk in drive */
82 #define	noDriveErr	-64	/* drive isn't connected */
83 #define	nsDrvErr	-56	/* no such drive */
84 #define	paramErr	-50	/* bad positioning information */
85 #define	wPrErr		-44	/* write protected */
86 #define	openErr		-23	/* already initialized */
87 
88 #ifndef __ASSEMBLY__
89 
90 struct swim_drvstatus {
91 	__u16	curr_track;	/* Current track number                   */
92 	__u8	write_prot;	/* 0x80 if disk is write protected        */
93 	__u8	disk_in_drive;	/* 0x01 or 0x02 if a disk is in the drive */
94 	__u8	installed;	/* 0x01 if drive installed, 0xFF if not   */
95 	__u8	num_sides;	/* 0x80 if two-sided format supported     */
96 	__u8	two_sided;	/* 0xff if two-sided format diskette      */
97 	__u8	new_interface;	/* 0x00 if old 400K drive, 0xFF if newer  */
98 	__u16	errors;		/* Disk error count                       */
99 	struct {		/* 32 bits */
100 		__u16	reserved;
101 		__u16	:4;
102 		__u16	external:1;	/* Drive is external        */
103 		__u16	scsi:1;		/* Drive is a SCSI drive    */
104 		__u16	fixed:1;	/* Drive has fixed media    */
105 		__u16	secondary:1;	/* Drive is secondary drive */
106 		__u8	type;		/* Drive type               */
107 	} info;
108 	__u8	mfm_drive;	/* 0xFF if this is an FDHD drive    */
109 	__u8	mfm_disk;	/* 0xFF if 720K/1440K (MFM) disk    */
110 	__u8	mfm_format;	/* 0x00 if 720K, 0xFF if 1440K      */
111 	__u8	ctlr_type;	/* 0x00 if IWM, 0xFF if SWIM        */
112 	__u16	curr_format;	/* Current format type              */
113 	__u16	allowed_fmt;	/* Allowed format types             */
114 	__u32	num_blocks;	/* Number of blocks on disk         */
115 	__u8	icon_flags;	/* Icon flags                       */
116 	__u8	unusued;
117 };
118 
119 /* Commands issued from the host to the IOP: */
120 
121 struct swimcmd_init {
122 	__u8	code;		/* CMD_INIT */
123 	__u8	unusued;
124 	__u16	error;
125 	__u8	drives[28];	/* drive type list */
126 };
127 
128 struct swimcmd_startpoll {
129 	__u8	code;		/* CMD_START_POLL */
130 	__u8	unusued;
131 	__u16	error;
132 };
133 
134 struct swimcmd_sethfstag {
135 	__u8	code;		/* CMD_SETHFSTAG */
136 	__u8	unusued;
137 	__u16	error;
138 	caddr_t	tagbuf;		/* HFS tag buffer address */
139 };
140 
141 struct swimcmd_status {
142 	__u8	code;		/* CMD_STATUS */
143 	__u8	drive_num;
144 	__u16	error;
145 	struct swim_drvstatus status;
146 };
147 
148 struct swimcmd_eject {
149 	__u8	code;		/* CMD_EJECT */
150 	__u8	drive_num;
151 	__u16	error;
152 	struct swim_drvstatus status;
153 };
154 
155 struct swimcmd_format {
156 	__u8	code;		/* CMD_FORMAT */
157 	__u8	drive_num;
158 	__u16	error;
159 	union {
160 		struct {
161 			__u16 fmt;	   /* format kind                  */
162 			__u8  hdrbyte;	   /* fmt byte for hdr (0=default) */
163 			__u8  interleave;  /* interleave (0 = default)     */
164 			caddr_t	databuf;   /* sector data buff (0=default  */
165 			caddr_t	tagbuf;	   /* tag data buffer (0=default)  */
166 		} f;
167 		struct swim_drvstatus status;
168 	} p;
169 };
170 
171 struct swimcmd_fmtverify {
172 	__u8	code;		/* CMD_FORMAT_VERIFY */
173 	__u8	drive_num;
174 	__u16	error;
175 };
176 
177 struct swimcmd_rw {
178 	__u8	code;		/* CMD_READ, CMD_WRITE or CMD_READ_VERIFY */
179 	__u8	drive_num;
180 	__u16	error;
181 	caddr_t	buffer;		/* R/W buffer address */
182 	__u32	first_block;	/* Starting block     */
183 	__u32	num_blocks;	/* Number of blocks   */
184 	__u8	tag[12];	/* tag data           */
185 };
186 
187 struct swimcmd_cachectl {
188 	__u8	code;		/* CMD_CACHE_CTRL */
189 	__u8	unused;
190 	__u16	error;
191 	__u8	enable;		/* Nonzero to enable cache                */
192 	__u8	install;	/* +1 = install, -1 = remove, 0 = neither */
193 };
194 
195 struct swimcmd_tagbufctl {
196 	__u8	code;		/* CMD_TAGBUFF_CTRL */
197 	__u8	unused;
198 	__u16	error;
199 	caddr_t	buf;		/* buffer address or 0 to disable */
200 };
201 
202 struct swimcmd_geticon {
203 	__u8	code;		/* CMD_GET_ICON */
204 	__u8	drive_num;
205 	__u16	error;
206 	caddr_t	buffer;		/* Nuffer address */
207 	__u16	kind;		/* 0 = media icon, 1 = drive icon */
208 	__u16	unused;
209 	__u16	max_bytes;	/* maximum  byte count */
210 };
211 
212 /* Messages from the SWIM IOP to the host CPU: */
213 
214 struct swimmsg_status {
215 	__u8	code;		/* 1 = insert, 2 = eject, 3 = status changed */
216 	__u8	drive_num;
217 	__u16	error;
218 	struct swim_drvstatus status;
219 };
220 
221 #endif /* __ASSEMBLY__ */
222