ath9k: Synchronize DMA transfer with CPU at right place
[linux-2.6] / drivers / net / wireless / i82586.h
1 /*
2  * Intel 82586 IEEE 802.3 Ethernet LAN Coprocessor.
3  *
4  * See:
5  *      Intel Microcommunications 1991
6  *      p1-1 to p1-37
7  *      Intel order No. 231658
8  *      ISBN 1-55512-119-5
9  *
10  *     Unfortunately, the above chapter mentions neither
11  * the System Configuration Pointer (SCP) nor the
12  * Intermediate System Configuration Pointer (ISCP),
13  * so we probably need to look elsewhere for the
14  * whole story -- some recommend the "Intel LAN
15  * Components manual" but I have neither a copy
16  * nor a full reference.  But "elsewhere" may be
17  * in the same publication...
18  *     The description of a later device, the
19  * "82596CA High-Performance 32-Bit Local Area Network
20  * Coprocessor", (ibid. p1-38 to p1-109) does mention
21  * the SCP and ISCP and also has an i82586 compatibility
22  * mode.  Even more useful is "AP-235 An 82586 Data Link
23  * Driver" (ibid. p1-337 to p1-417).
24  */
25
26 #define I82586_MEMZ     (64 * 1024)
27
28 #define I82586_SCP_ADDR (I82586_MEMZ - sizeof(scp_t))
29
30 #define ADDR_LEN        6
31 #define I82586NULL      0xFFFF
32
33 #define toff(t,p,f)     (unsigned short)((void *)(&((t *)((void *)0 + (p)))->f) - (void *)0)
34
35 /*
36  * System Configuration Pointer (SCP).
37  */
38 typedef struct scp_t    scp_t;
39 struct scp_t
40 {
41         unsigned short  scp_sysbus;     /* 82586 bus width:     */
42 #define         SCP_SY_16BBUS   (0x0 << 0)      /* 16 bits */
43 #define         SCP_SY_8BBUS    (0x1 << 0)      /*  8 bits. */
44         unsigned short  scp_junk[2];    /* Unused */
45         unsigned short  scp_iscpl;      /* lower 16 bits of ISCP_ADDR */
46         unsigned short  scp_iscph;      /* upper 16 bits of ISCP_ADDR */
47 };
48
49 /*
50  * Intermediate System Configuration Pointer (ISCP).
51  */
52 typedef struct iscp_t   iscp_t;
53 struct iscp_t
54 {
55         unsigned short  iscp_busy;      /* set by CPU before first CA,  */
56                                         /* cleared by 82586 after read. */
57         unsigned short  iscp_offset;    /* offset of SCB                */
58         unsigned short  iscp_basel;     /* base of SCB                  */
59         unsigned short  iscp_baseh;     /*  "                           */
60 };
61
62 /*
63  * System Control Block (SCB).
64  *      The 82586 writes its status to scb_status and then
65  *      raises an interrupt to alert the CPU.
66  *      The CPU writes a command to scb_command and
67  *      then issues a Channel Attention (CA) to alert the 82586.
68  */
69 typedef struct scb_t    scb_t;
70 struct scb_t
71 {
72         unsigned short  scb_status;     /* Status of 82586              */
73 #define         SCB_ST_INT      (0xF << 12)     /* Some of:             */
74 #define         SCB_ST_CX       (0x1 << 15)     /* Cmd completed        */
75 #define         SCB_ST_FR       (0x1 << 14)     /* Frame received       */
76 #define         SCB_ST_CNA      (0x1 << 13)     /* Cmd unit not active  */
77 #define         SCB_ST_RNR      (0x1 << 12)     /* Rcv unit not ready   */
78 #define         SCB_ST_JUNK0    (0x1 << 11)     /* 0                    */
79 #define         SCB_ST_CUS      (0x7 <<  8)     /* Cmd unit status      */
80 #define                 SCB_ST_CUS_IDLE (0 << 8)        /* Idle         */
81 #define                 SCB_ST_CUS_SUSP (1 << 8)        /* Suspended    */
82 #define                 SCB_ST_CUS_ACTV (2 << 8)        /* Active       */
83 #define         SCB_ST_JUNK1    (0x1 <<  7)     /* 0                    */
84 #define         SCB_ST_RUS      (0x7 <<  4)     /* Rcv unit status      */
85 #define                 SCB_ST_RUS_IDLE (0 << 4)        /* Idle         */
86 #define                 SCB_ST_RUS_SUSP (1 << 4)        /* Suspended    */
87 #define                 SCB_ST_RUS_NRES (2 << 4)        /* No resources */
88 #define                 SCB_ST_RUS_RDY  (4 << 4)        /* Ready        */
89         unsigned short  scb_command;    /* Next command                 */
90 #define         SCB_CMD_ACK_CX  (0x1 << 15)     /* Ack cmd completion   */
91 #define         SCB_CMD_ACK_FR  (0x1 << 14)     /* Ack frame received   */
92 #define         SCB_CMD_ACK_CNA (0x1 << 13)     /* Ack CU not active    */
93 #define         SCB_CMD_ACK_RNR (0x1 << 12)     /* Ack RU not ready     */
94 #define         SCB_CMD_JUNKX   (0x1 << 11)     /* Unused               */
95 #define         SCB_CMD_CUC     (0x7 <<  8)     /* Command Unit command */
96 #define                 SCB_CMD_CUC_NOP (0 << 8)        /* Nop          */
97 #define                 SCB_CMD_CUC_GO  (1 << 8)        /* Start cbl_offset */
98 #define                 SCB_CMD_CUC_RES (2 << 8)        /* Resume execution */
99 #define                 SCB_CMD_CUC_SUS (3 << 8)        /* Suspend   "  */
100 #define                 SCB_CMD_CUC_ABT (4 << 8)        /* Abort     "  */
101 #define         SCB_CMD_RESET   (0x1 <<  7)     /* Reset chip (hardware) */
102 #define         SCB_CMD_RUC     (0x7 <<  4)     /* Receive Unit command */
103 #define                 SCB_CMD_RUC_NOP (0 << 4)        /* Nop          */
104 #define                 SCB_CMD_RUC_GO  (1 << 4)        /* Start rfa_offset */
105 #define                 SCB_CMD_RUC_RES (2 << 4)        /* Resume reception */
106 #define                 SCB_CMD_RUC_SUS (3 << 4)        /* Suspend   "  */
107 #define                 SCB_CMD_RUC_ABT (4 << 4)        /* Abort     "  */
108         unsigned short  scb_cbl_offset; /* Offset of first command unit */
109                                         /* Action Command               */
110         unsigned short  scb_rfa_offset; /* Offset of first Receive      */
111                                         /* Frame Descriptor in the      */
112                                         /* Receive Frame Area           */
113         unsigned short  scb_crcerrs;    /* Properly aligned frames      */
114                                         /* received with a CRC error    */
115         unsigned short  scb_alnerrs;    /* Misaligned frames received   */
116                                         /* with a CRC error             */
117         unsigned short  scb_rscerrs;    /* Frames lost due to no space  */
118         unsigned short  scb_ovrnerrs;   /* Frames lost due to slow bus  */
119 };
120
121 #define scboff(p,f)     toff(scb_t, p, f)
122
123 /*
124  * The eight Action Commands.
125  */
126 typedef enum acmd_e     acmd_e;
127 enum acmd_e
128 {
129         acmd_nop        = 0,    /* Do nothing                           */
130         acmd_ia_setup   = 1,    /* Load an (ethernet) address into the  */
131                                 /* 82586                                */
132         acmd_configure  = 2,    /* Update the 82586 operating parameters */
133         acmd_mc_setup   = 3,    /* Load a list of (ethernet) multicast  */
134                                 /* addresses into the 82586             */
135         acmd_transmit   = 4,    /* Transmit a frame                     */
136         acmd_tdr        = 5,    /* Perform a Time Domain Reflectometer  */
137                                 /* test on the serial link              */
138         acmd_dump       = 6,    /* Copy 82586 registers to memory       */
139         acmd_diagnose   = 7,    /* Run an internal self test            */
140 };
141
142 /*
143  * Generic Action Command header.
144  */
145 typedef struct ach_t    ach_t;
146 struct ach_t
147 {
148         unsigned short  ac_status;              /* Command status:      */
149 #define         AC_SFLD_C       (0x1 << 15)     /* Command completed    */
150 #define         AC_SFLD_B       (0x1 << 14)     /* Busy executing       */
151 #define         AC_SFLD_OK      (0x1 << 13)     /* Completed error free */
152 #define         AC_SFLD_A       (0x1 << 12)     /* Command aborted      */
153 #define         AC_SFLD_FAIL    (0x1 << 11)     /* Selftest failed      */
154 #define         AC_SFLD_S10     (0x1 << 10)     /* No carrier sense     */
155                                                 /* during transmission  */
156 #define         AC_SFLD_S9      (0x1 <<  9)     /* Tx unsuccessful:     */
157                                                 /* (stopped) lost CTS   */
158 #define         AC_SFLD_S8      (0x1 <<  8)     /* Tx unsuccessful:     */
159                                                 /* (stopped) slow DMA   */
160 #define         AC_SFLD_S7      (0x1 <<  7)     /* Tx deferred:         */
161                                                 /* other link traffic   */
162 #define         AC_SFLD_S6      (0x1 <<  6)     /* Heart Beat: collision */
163                                                 /* detect after last tx */
164 #define         AC_SFLD_S5      (0x1 <<  5)     /* Tx stopped:          */
165                                                 /* excessive collisions */
166 #define         AC_SFLD_MAXCOL  (0xF <<  0)     /* Collision count      */
167         unsigned short  ac_command;             /* Command specifier:   */
168 #define         AC_CFLD_EL      (0x1 << 15)     /* End of command list  */
169 #define         AC_CFLD_S       (0x1 << 14)     /* Suspend on completion */
170 #define         AC_CFLD_I       (0x1 << 13)     /* Interrupt on completion */
171 #define         AC_CFLD_CMD     (0x7 <<  0)     /* acmd_e               */
172         unsigned short  ac_link;                /* Next Action Command  */
173 };
174
175 #define acoff(p,f)      toff(ach_t, p, f)
176
177 /*
178  * The Nop Action Command.
179  */
180 typedef struct ac_nop_t ac_nop_t;
181 struct ac_nop_t
182 {
183         ach_t   nop_h;
184 };
185
186 /*
187  * The IA-Setup Action Command.
188  */
189 typedef struct ac_ias_t ac_ias_t;
190 struct ac_ias_t
191 {
192         ach_t           ias_h;
193         unsigned char   ias_addr[ADDR_LEN]; /* The (ethernet) address   */
194 };
195
196 /*
197  * The Configure Action Command.
198  */
199 typedef struct ac_cfg_t ac_cfg_t;
200 struct ac_cfg_t
201 {
202         ach_t           cfg_h;
203         unsigned char   cfg_byte_cnt;   /* Size foll data: 4-12 */
204 #define AC_CFG_BYTE_CNT(v)      (((v) & 0xF) << 0)
205         unsigned char   cfg_fifolim;    /* FIFO threshold       */
206 #define AC_CFG_FIFOLIM(v)       (((v) & 0xF) << 0)
207         unsigned char   cfg_byte8;
208 #define AC_CFG_SAV_BF(v)        (((v) & 0x1) << 7)      /* Save rxd bad frames  */
209 #define AC_CFG_SRDY(v)          (((v) & 0x1) << 6)      /* SRDY/ARDY pin means  */
210                                                         /* external sync.       */
211         unsigned char   cfg_byte9;
212 #define AC_CFG_ELPBCK(v)        (((v) & 0x1) << 7)      /* External loopback    */
213 #define AC_CFG_ILPBCK(v)        (((v) & 0x1) << 6)      /* Internal loopback    */
214 #define AC_CFG_PRELEN(v)        (((v) & 0x3) << 4)      /* Preamble length      */
215 #define         AC_CFG_PLEN_2           0               /*  2 bytes     */
216 #define         AC_CFG_PLEN_4           1               /*  4 bytes     */
217 #define         AC_CFG_PLEN_8           2               /*  8 bytes     */
218 #define         AC_CFG_PLEN_16          3               /* 16 bytes     */
219 #define AC_CFG_ALOC(v)          (((v) & 0x1) << 3)      /* Addr/len data is     */
220                                                         /* explicit in buffers  */
221 #define AC_CFG_ADDRLEN(v)       (((v) & 0x7) << 0)      /* Bytes per address    */
222         unsigned char   cfg_byte10;
223 #define AC_CFG_BOFMET(v)        (((v) & 0x1) << 7)      /* Use alternate expo.  */
224                                                         /* backoff method       */
225 #define AC_CFG_ACR(v)           (((v) & 0x7) << 4)      /* Accelerated cont. res. */
226 #define AC_CFG_LINPRIO(v)       (((v) & 0x7) << 0)      /* Linear priority      */
227         unsigned char   cfg_ifs;        /* Interframe spacing           */
228         unsigned char   cfg_slotl;      /* Slot time (low byte)         */
229         unsigned char   cfg_byte13;
230 #define AC_CFG_RETRYNUM(v)      (((v) & 0xF) << 4)      /* Max. collision retry */
231 #define AC_CFG_SLTTMHI(v)       (((v) & 0x7) << 0)      /* Slot time (high bits) */
232         unsigned char   cfg_byte14;
233 #define AC_CFG_FLGPAD(v)        (((v) & 0x1) << 7)      /* Pad with HDLC flags  */
234 #define AC_CFG_BTSTF(v)         (((v) & 0x1) << 6)      /* Do HDLC bitstuffing  */
235 #define AC_CFG_CRC16(v)         (((v) & 0x1) << 5)      /* 16 bit CCITT CRC     */
236 #define AC_CFG_NCRC(v)          (((v) & 0x1) << 4)      /* Insert no CRC        */
237 #define AC_CFG_TNCRS(v)         (((v) & 0x1) << 3)      /* Tx even if no carrier */
238 #define AC_CFG_MANCH(v)         (((v) & 0x1) << 2)      /* Manchester coding    */
239 #define AC_CFG_BCDIS(v)         (((v) & 0x1) << 1)      /* Disable broadcast    */
240 #define AC_CFG_PRM(v)           (((v) & 0x1) << 0)      /* Promiscuous mode     */
241         unsigned char   cfg_byte15;
242 #define AC_CFG_ICDS(v)          (((v) & 0x1) << 7)      /* Internal collision   */
243                                                         /* detect source        */
244 #define AC_CFG_CDTF(v)          (((v) & 0x7) << 4)      /* Collision detect     */
245                                                         /* filter in bit times  */
246 #define AC_CFG_ICSS(v)          (((v) & 0x1) << 3)      /* Internal carrier     */
247                                                         /* sense source         */
248 #define AC_CFG_CSTF(v)          (((v) & 0x7) << 0)      /* Carrier sense        */
249                                                         /* filter in bit times  */
250         unsigned short  cfg_min_frm_len;
251 #define AC_CFG_MNFRM(v)         (((v) & 0xFF) << 0)     /* Min. bytes/frame (<= 255) */
252 };
253
254 /*
255  * The MC-Setup Action Command.
256  */
257 typedef struct ac_mcs_t ac_mcs_t;
258 struct ac_mcs_t
259 {
260         ach_t           mcs_h;
261         unsigned short  mcs_cnt;        /* No. of bytes of MC addresses */
262 #if 0
263         unsigned char   mcs_data[ADDR_LEN]; /* The first MC address ..  */
264         ...
265 #endif
266 };
267
268 #define I82586_MAX_MULTICAST_ADDRESSES  128     /* Hardware hashed filter */
269
270 /*
271  * The Transmit Action Command.
272  */
273 typedef struct ac_tx_t  ac_tx_t;
274 struct ac_tx_t
275 {
276         ach_t           tx_h;
277         unsigned short  tx_tbd_offset;  /* Address of list of buffers.  */
278 #if     0
279 Linux packets are passed down with the destination MAC address
280 and length/type field already prepended to the data,
281 so we do not need to insert it.  Consistent with this
282 we must also set the AC_CFG_ALOC(..) flag during the
283 ac_cfg_t action command.
284         unsigned char   tx_addr[ADDR_LEN]; /* The frame dest. address   */
285         unsigned short  tx_length;      /* The frame length             */
286 #endif  /* 0 */
287 };
288
289 /*
290  * The Time Domain Reflectometer Action Command.
291  */
292 typedef struct ac_tdr_t ac_tdr_t;
293 struct ac_tdr_t
294 {
295         ach_t           tdr_h;
296         unsigned short  tdr_result;     /* Result.      */
297 #define         AC_TDR_LNK_OK   (0x1 << 15)     /* No link problem      */
298 #define         AC_TDR_XCVR_PRB (0x1 << 14)     /* Txcvr cable problem  */
299 #define         AC_TDR_ET_OPN   (0x1 << 13)     /* Open on the link     */
300 #define         AC_TDR_ET_SRT   (0x1 << 12)     /* Short on the link    */
301 #define         AC_TDR_TIME     (0x7FF << 0)    /* Distance to problem  */
302                                                 /* site in transmit     */
303                                                 /* clock cycles         */
304 };
305
306 /*
307  * The Dump Action Command.
308  */
309 typedef struct ac_dmp_t ac_dmp_t;
310 struct ac_dmp_t
311 {
312         ach_t           dmp_h;
313         unsigned short  dmp_offset;     /* Result.      */
314 };
315
316 /*
317  * Size of the result of the dump command.
318  */
319 #define DUMPBYTES       170
320
321 /*
322  * The Diagnose Action Command.
323  */
324 typedef struct ac_dgn_t ac_dgn_t;
325 struct ac_dgn_t
326 {
327         ach_t           dgn_h;
328 };
329
330 /*
331  * Transmit Buffer Descriptor (TBD).
332  */
333 typedef struct tbd_t    tbd_t;
334 struct tbd_t
335 {
336         unsigned short  tbd_status;             /* Written by the CPU   */
337 #define         TBD_STATUS_EOF  (0x1 << 15)     /* This TBD is the      */
338                                                 /* last for this frame  */
339 #define         TBD_STATUS_ACNT (0x3FFF << 0)   /* Actual count of data */
340                                                 /* bytes in this buffer */
341         unsigned short  tbd_next_bd_offset;     /* Next in list         */
342         unsigned short  tbd_bufl;               /* Buffer address (low) */
343         unsigned short  tbd_bufh;               /*    "      "  (high)  */
344 };
345
346 /*
347  * Receive Buffer Descriptor (RBD).
348  */
349 typedef struct rbd_t    rbd_t;
350 struct rbd_t
351 {
352         unsigned short  rbd_status;             /* Written by the 82586 */
353 #define         RBD_STATUS_EOF  (0x1 << 15)     /* This RBD is the      */
354                                                 /* last for this frame  */
355 #define         RBD_STATUS_F    (0x1 << 14)     /* ACNT field is valid  */
356 #define         RBD_STATUS_ACNT (0x3FFF << 0)   /* Actual no. of data   */
357                                                 /* bytes in this buffer */
358         unsigned short  rbd_next_rbd_offset;    /* Next rbd in list     */
359         unsigned short  rbd_bufl;               /* Data pointer (low)   */
360         unsigned short  rbd_bufh;               /*  "      "    (high)  */
361         unsigned short  rbd_el_size;            /* EL+Data buf. size    */
362 #define         RBD_EL  (0x1 << 15)             /* This BD is the       */
363                                                 /* last in the list     */
364 #define         RBD_SIZE (0x3FFF << 0)          /* No. of bytes the     */
365                                                 /* buffer can hold      */
366 };
367
368 #define rbdoff(p,f)     toff(rbd_t, p, f)
369
370 /*
371  * Frame Descriptor (FD).
372  */
373 typedef struct fd_t     fd_t;
374 struct fd_t
375 {
376         unsigned short  fd_status;              /* Written by the 82586 */
377 #define         FD_STATUS_C     (0x1 << 15)     /* Completed storing frame */
378 #define         FD_STATUS_B     (0x1 << 14)     /* FD was consumed by RU */
379 #define         FD_STATUS_OK    (0x1 << 13)     /* Frame rxd successfully */
380 #define         FD_STATUS_S11   (0x1 << 11)     /* CRC error            */
381 #define         FD_STATUS_S10   (0x1 << 10)     /* Alignment error      */
382 #define         FD_STATUS_S9    (0x1 <<  9)     /* Ran out of resources */
383 #define         FD_STATUS_S8    (0x1 <<  8)     /* Rx DMA overrun       */
384 #define         FD_STATUS_S7    (0x1 <<  7)     /* Frame too short      */
385 #define         FD_STATUS_S6    (0x1 <<  6)     /* No EOF flag          */
386         unsigned short  fd_command;             /* Command              */
387 #define         FD_COMMAND_EL   (0x1 << 15)     /* Last FD in list      */
388 #define         FD_COMMAND_S    (0x1 << 14)     /* Suspend RU after rx  */
389         unsigned short  fd_link_offset;         /* Next FD              */
390         unsigned short  fd_rbd_offset;          /* First RBD (data)     */
391                                                 /* Prepared by CPU,     */
392                                                 /* updated by 82586     */
393 #if     0
394 I think the rest is unused since we
395 have set AC_CFG_ALOC(..).  However, just
396 in case, we leave the space.
397 #endif  /* 0 */
398         unsigned char   fd_dest[ADDR_LEN];      /* Destination address  */
399                                                 /* Written by 82586     */
400         unsigned char   fd_src[ADDR_LEN];       /* Source address       */
401                                                 /* Written by 82586     */
402         unsigned short  fd_length;              /* Frame length or type */
403                                                 /* Written by 82586     */
404 };
405
406 #define fdoff(p,f)      toff(fd_t, p, f)
407
408 /*
409  * This software may only be used and distributed
410  * according to the terms of the GNU General Public License.
411  *
412  * For more details, see wavelan.c.
413  */