Linux-2.6.12-rc2
[cascardo/linux.git] / include / asm-m68k / swim_iop.h
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     /* can't 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__ */