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
90struct 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
121struct swimcmd_init {
122	__u8	code;		/* CMD_INIT */
123	__u8	unusued;
124	__u16	error;
125	__u8	drives[28];	/* drive type list */
126};
127
128struct swimcmd_startpoll {
129	__u8	code;		/* CMD_START_POLL */
130	__u8	unusued;
131	__u16	error;
132};
133
134struct swimcmd_sethfstag {
135	__u8	code;		/* CMD_SETHFSTAG */
136	__u8	unusued;
137	__u16	error;
138	caddr_t	tagbuf;		/* HFS tag buffer address */
139};
140
141struct swimcmd_status {
142	__u8	code;		/* CMD_STATUS */
143	__u8	drive_num;
144	__u16	error;
145	struct swim_drvstatus status;
146};
147
148struct swimcmd_eject {
149	__u8	code;		/* CMD_EJECT */
150	__u8	drive_num;
151	__u16	error;
152	struct swim_drvstatus status;
153};
154
155struct 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
171struct swimcmd_fmtverify {
172	__u8	code;		/* CMD_FORMAT_VERIFY */
173	__u8	drive_num;
174	__u16	error;
175};
176
177struct 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
187struct 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
195struct 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
202struct 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
214struct 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