net: use bitrev8
[linux-2.6] / drivers / net / skfp / h / hwmtm.h
1 /******************************************************************************
2  *
3  *      (C)Copyright 1998,1999 SysKonnect,
4  *      a business unit of Schneider & Koch & Co. Datensysteme GmbH.
5  *
6  *      This program is free software; you can redistribute it and/or modify
7  *      it under the terms of the GNU General Public License as published by
8  *      the Free Software Foundation; either version 2 of the License, or
9  *      (at your option) any later version.
10  *
11  *      The information in this file is provided "AS IS" without warranty.
12  *
13  ******************************************************************************/
14
15 #ifndef _HWM_
16 #define _HWM_
17
18 #include "h/mbuf.h"
19
20 /*
21  * MACRO for DMA synchronization:
22  *      The descriptor 'desc' is flushed for the device 'flag'.
23  *      Devices are the CPU (DDI_DMA_SYNC_FORCPU) and the
24  *      adapter (DDI_DMA_SYNC_FORDEV).
25  *
26  *      'desc'  Pointer to a Rx or Tx descriptor.
27  *      'flag'  Flag for direction (view for CPU or DEVICE) that
28  *              should be synchronized.
29  *
30  *      Empty macros and defines are specified here. The real macro
31  *      is os-specific and should be defined in osdef1st.h.
32  */
33 #ifndef DRV_BUF_FLUSH
34 #define DRV_BUF_FLUSH(desc,flag)
35 #define DDI_DMA_SYNC_FORCPU
36 #define DDI_DMA_SYNC_FORDEV
37 #endif
38
39         /*
40          * hardware modul dependent receive modes
41          */
42 #define RX_ENABLE_PASS_SMT      21
43 #define RX_DISABLE_PASS_SMT     22
44 #define RX_ENABLE_PASS_NSA      23
45 #define RX_DISABLE_PASS_NSA     24
46 #define RX_ENABLE_PASS_DB       25
47 #define RX_DISABLE_PASS_DB      26
48 #define RX_DISABLE_PASS_ALL     27
49 #define RX_DISABLE_LLC_PROMISC  28
50 #define RX_ENABLE_LLC_PROMISC   29
51
52
53 #ifndef DMA_RD
54 #define DMA_RD          1       /* memory -> hw */
55 #endif
56 #ifndef DMA_WR
57 #define DMA_WR          2       /* hw -> memory */
58 #endif
59 #define SMT_BUF         0x80
60
61         /*
62          * bits of the frame status byte
63          */
64 #define EN_IRQ_EOF      0x02    /* get IRQ after end of frame transmission */
65 #define LOC_TX          0x04    /* send frame to the local SMT */
66 #define LAST_FRAG       0x08    /* last TxD of the frame */
67 #define FIRST_FRAG      0x10    /* first TxD of the frame */
68 #define LAN_TX          0x20    /* send frame to network if set */
69 #define RING_DOWN       0x40    /* error: unable to send, ring down */
70 #define OUT_OF_TXD      0x80    /* error: not enough TxDs available */
71
72
73 #ifndef NULL
74 #define NULL            0
75 #endif
76
77 #ifdef  LITTLE_ENDIAN
78 #define HWM_REVERSE(x)  (x)
79 #else
80 #define HWM_REVERSE(x)          ((((x)<<24L)&0xff000000L)       +       \
81                                  (((x)<< 8L)&0x00ff0000L)       +       \
82                                  (((x)>> 8L)&0x0000ff00L)       +       \
83                                  (((x)>>24L)&0x000000ffL))
84 #endif
85
86 #define C_INDIC         (1L<<25)
87 #define A_INDIC         (1L<<26)
88 #define RD_FS_LOCAL     0x80
89
90         /*
91          * DEBUG FLAGS
92          */
93 #define DEBUG_SMTF      1
94 #define DEBUG_SMT       2
95 #define DEBUG_ECM       3
96 #define DEBUG_RMT       4
97 #define DEBUG_CFM       5
98 #define DEBUG_PCM       6
99 #define DEBUG_SBA       7
100 #define DEBUG_ESS       8
101
102 #define DB_HWM_RX       10
103 #define DB_HWM_TX       11
104 #define DB_HWM_GEN      12
105
106 struct s_mbuf_pool {
107 #ifndef MB_OUTSIDE_SMC
108         SMbuf           mb[MAX_MBUF] ;          /* mbuf pool */
109 #endif
110         SMbuf           *mb_start ;             /* points to the first mb */
111         SMbuf           *mb_free ;              /* free queue */
112 } ;
113
114 struct hwm_r {
115         /*
116          * hardware modul specific receive variables
117          */
118         u_int                   len ;           /* length of the whole frame */
119         char                    *mb_pos ;       /* SMbuf receive position */
120 } ;
121
122 struct hw_modul {
123         /*
124          * All hardware modul specific variables
125          */
126         struct  s_mbuf_pool     mbuf_pool ;
127         struct  hwm_r   r ;
128
129         union s_fp_descr volatile *descr_p ; /* points to the desriptor area */
130
131         u_short pass_SMT ;              /* pass SMT frames */
132         u_short pass_NSA ;              /* pass all NSA frames */
133         u_short pass_DB ;               /* pass Direct Beacon Frames */
134         u_short pass_llc_promisc ;      /* pass all llc frames (default ON) */
135
136         SMbuf   *llc_rx_pipe ;          /* points to the first queued llc fr */
137         SMbuf   *llc_rx_tail ;          /* points to the last queued llc fr */
138         int     queued_rx_frames ;      /* number of queued frames */
139
140         SMbuf   *txd_tx_pipe ;          /* points to first mb in the txd ring */
141         SMbuf   *txd_tx_tail ;          /* points to last mb in the txd ring */
142         int     queued_txd_mb ;         /* number of SMT MBufs in txd ring */
143
144         int     rx_break ;              /* rev. was breaked because ind. off */
145         int     leave_isr ;             /* leave fddi_isr immedeately if set */
146         int     isr_flag ;              /* set, when HWM is entered from isr */
147         /*
148          * varaibles for the current transmit frame
149          */
150         struct s_smt_tx_queue *tx_p ;   /* pointer to the transmit queue */
151         u_long  tx_descr ;              /* tx descriptor for FORMAC+ */
152         int     tx_len ;                /* tx frame length */
153         SMbuf   *tx_mb ;                /* SMT tx MBuf pointer */
154         char    *tx_data ;              /* data pointer to the SMT tx Mbuf */
155
156         int     detec_count ;           /* counter for out of RxD condition */
157         u_long  rx_len_error ;          /* rx len FORMAC != sum of fragments */
158 } ;
159
160
161 /*
162  * DEBUG structs and macros
163  */
164
165 #ifdef  DEBUG
166 struct os_debug {
167         int     hwm_rx ;
168         int     hwm_tx ;
169         int     hwm_gen ;
170 } ;
171 #endif
172
173 #ifdef  DEBUG
174 #ifdef  DEBUG_BRD
175 #define DB_P    smc->debug
176 #else
177 #define DB_P    debug
178 #endif
179
180 #define DB_RX(a,b,c,lev) if (DB_P.d_os.hwm_rx >= (lev)) printf(a,b,c)
181 #define DB_TX(a,b,c,lev) if (DB_P.d_os.hwm_tx >= (lev)) printf(a,b,c)
182 #define DB_GEN(a,b,c,lev) if (DB_P.d_os.hwm_gen >= (lev)) printf(a,b,c)
183 #else   /* DEBUG */
184 #define DB_RX(a,b,c,lev)
185 #define DB_TX(a,b,c,lev)
186 #define DB_GEN(a,b,c,lev)
187 #endif  /* DEBUG */
188
189 #ifndef SK_BREAK
190 #define SK_BREAK()
191 #endif
192
193
194 /*
195  * HWM Macros
196  */
197
198 /*
199  *      BEGIN_MANUAL_ENTRY(HWM_GET_TX_PHYS)
200  *      u_long HWM_GET_TX_PHYS(txd)
201  *
202  * function     MACRO           (hardware module, hwmtm.h)
203  *              This macro may be invoked by the OS-specific module to read
204  *              the physical address of the specified TxD.
205  *
206  * para txd     pointer to the TxD
207  *
208  *      END_MANUAL_ENTRY
209  */
210 #define HWM_GET_TX_PHYS(txd)            (u_long)AIX_REVERSE((txd)->txd_tbadr)
211
212 /*
213  *      BEGIN_MANUAL_ENTRY(HWM_GET_TX_LEN)
214  *      int HWM_GET_TX_LEN(txd)
215  *
216  * function     MACRO           (hardware module, hwmtm.h)
217  *              This macro may be invoked by the OS-specific module to read
218  *              the fragment length of the specified TxD
219  *
220  * para rxd     pointer to the TxD
221  *
222  * return       the length of the fragment in bytes
223  *
224  *      END_MANUAL_ENTRY
225  */
226 #define HWM_GET_TX_LEN(txd)     ((int)AIX_REVERSE((txd)->txd_tbctrl)& RD_LENGTH)
227
228 /*
229  *      BEGIN_MANUAL_ENTRY(HWM_GET_TX_USED)
230  *      txd *HWM_GET_TX_USED(smc,queue)
231  *
232  * function     MACRO           (hardware module, hwmtm.h)
233  *              This macro may be invoked by the OS-specific module to get the
234  *              number of used TxDs for the queue, specified by the index.
235  *
236  * para queue   the number of the send queue: Can be specified by
237  *              QUEUE_A0, QUEUE_S or (frame_status & QUEUE_A0)
238  *
239  * return       number of used TxDs for this send queue
240  *
241  *      END_MANUAL_ENTRY
242  */
243 #define HWM_GET_TX_USED(smc,queue)      (int) (smc)->hw.fp.tx_q[queue].tx_used
244
245 /*
246  *      BEGIN_MANUAL_ENTRY(HWM_GET_CURR_TXD)
247  *      txd *HWM_GET_CURR_TXD(smc,queue)
248  *
249  * function     MACRO           (hardware module, hwmtm.h)
250  *              This macro may be invoked by the OS-specific module to get the
251  *              pointer to the TxD which points to the current queue put
252  *              position.
253  *
254  * para queue   the number of the send queue: Can be specified by
255  *              QUEUE_A0, QUEUE_S or (frame_status & QUEUE_A0)
256  *
257  * return       pointer to the current TxD
258  *
259  *      END_MANUAL_ENTRY
260  */
261 #define HWM_GET_CURR_TXD(smc,queue)     (struct s_smt_fp_txd volatile *)\
262                                         (smc)->hw.fp.tx_q[queue].tx_curr_put
263
264 /*
265  *      BEGIN_MANUAL_ENTRY(HWM_GET_RX_FRAG_LEN)
266  *      int HWM_GET_RX_FRAG_LEN(rxd)
267  *
268  * function     MACRO           (hardware module, hwmtm.h)
269  *              This macro may be invoked by the OS-specific module to read
270  *              the fragment length of the specified RxD
271  *
272  * para rxd     pointer to the RxD
273  *
274  * return       the length of the fragment in bytes
275  *
276  *      END_MANUAL_ENTRY
277  */
278 #define HWM_GET_RX_FRAG_LEN(rxd)        ((int)AIX_REVERSE((rxd)->rxd_rbctrl)& \
279                                 RD_LENGTH)
280
281 /*
282  *      BEGIN_MANUAL_ENTRY(HWM_GET_RX_PHYS)
283  *      u_long HWM_GET_RX_PHYS(rxd)
284  *
285  * function     MACRO           (hardware module, hwmtm.h)
286  *              This macro may be invoked by the OS-specific module to read
287  *              the physical address of the specified RxD.
288  *
289  * para rxd     pointer to the RxD
290  *
291  * return       the RxD's physical pointer to the data fragment
292  *
293  *      END_MANUAL_ENTRY
294  */
295 #define HWM_GET_RX_PHYS(rxd)    (u_long)AIX_REVERSE((rxd)->rxd_rbadr)
296
297 /*
298  *      BEGIN_MANUAL_ENTRY(HWM_GET_RX_USED)
299  *      int HWM_GET_RX_USED(smc)
300  *
301  * function     MACRO           (hardware module, hwmtm.h)
302  *              This macro may be invoked by the OS-specific module to get
303  *              the count of used RXDs in receive queue 1.
304  *
305  * return       the used RXD count of receive queue 1
306  *
307  * NOTE: Remember, because of an ASIC bug at least one RXD should be unused
308  *       in the descriptor ring !
309  *
310  *      END_MANUAL_ENTRY
311  */
312 #define HWM_GET_RX_USED(smc)    ((int)(smc)->hw.fp.rx_q[QUEUE_R1].rx_used)
313
314 /*
315  *      BEGIN_MANUAL_ENTRY(HWM_GET_RX_FREE)
316  *      int HWM_GET_RX_FREE(smc)
317  *
318  * function     MACRO           (hardware module, hwmtm.h)
319  *              This macro may be invoked by the OS-specific module to get
320  *              the rxd_free count of receive queue 1.
321  *
322  * return       the rxd_free count of receive queue 1
323  *
324  *      END_MANUAL_ENTRY
325  */
326 #define HWM_GET_RX_FREE(smc)    ((int)(smc)->hw.fp.rx_q[QUEUE_R1].rx_free-1)
327
328 /*
329  *      BEGIN_MANUAL_ENTRY(HWM_GET_CURR_RXD)
330  *      rxd *HWM_GET_CURR_RXD(smc)
331  *
332  * function     MACRO           (hardware module, hwmtm.h)
333  *              This macro may be invoked by the OS-specific module to get the
334  *              pointer to the RxD which points to the current queue put
335  *              position.
336  *
337  * return       pointer to the current RxD
338  *
339  *      END_MANUAL_ENTRY
340  */
341 #define HWM_GET_CURR_RXD(smc)   (struct s_smt_fp_rxd volatile *)\
342                                 (smc)->hw.fp.rx_q[QUEUE_R1].rx_curr_put
343
344 /*
345  *      BEGIN_MANUAL_ENTRY(HWM_RX_CHECK)
346  *      void HWM_RX_CHECK(smc,low_water)
347  *
348  * function     MACRO           (hardware module, hwmtm.h)
349  *              This macro is invoked by the OS-specific before it left the
350  *              function mac_drv_rx_complete. This macro calls mac_drv_fill_rxd
351  *              if the number of used RxDs is equal or lower than the
352  *              the given low water mark.
353  *
354  * para low_water       low water mark of used RxD's
355  *
356  *      END_MANUAL_ENTRY
357  */
358 #ifndef HWM_NO_FLOW_CTL
359 #define HWM_RX_CHECK(smc,low_water) {\
360         if ((low_water) >= (smc)->hw.fp.rx_q[QUEUE_R1].rx_used) {\
361                 mac_drv_fill_rxd(smc) ;\
362         }\
363 }
364 #else
365 #define HWM_RX_CHECK(smc,low_water)             mac_drv_fill_rxd(smc)
366 #endif
367
368 #ifndef HWM_EBASE
369 #define HWM_EBASE       500
370 #endif
371
372 #define HWM_E0001       HWM_EBASE + 1
373 #define HWM_E0001_MSG   "HWM: Wrong size of s_rxd_os struct"
374 #define HWM_E0002       HWM_EBASE + 2
375 #define HWM_E0002_MSG   "HWM: Wrong size of s_txd_os struct"
376 #define HWM_E0003       HWM_EBASE + 3
377 #define HWM_E0003_MSG   "HWM: smt_free_mbuf() called with NULL pointer"
378 #define HWM_E0004       HWM_EBASE + 4
379 #define HWM_E0004_MSG   "HWM: Parity error rx queue 1"
380 #define HWM_E0005       HWM_EBASE + 5
381 #define HWM_E0005_MSG   "HWM: Encoding error rx queue 1"
382 #define HWM_E0006       HWM_EBASE + 6
383 #define HWM_E0006_MSG   "HWM: Encoding error async tx queue"
384 #define HWM_E0007       HWM_EBASE + 7
385 #define HWM_E0007_MSG   "HWM: Encoding error sync tx queue"
386 #define HWM_E0008       HWM_EBASE + 8
387 #define HWM_E0008_MSG   ""
388 #define HWM_E0009       HWM_EBASE + 9
389 #define HWM_E0009_MSG   "HWM: Out of RxD condition detected"
390 #define HWM_E0010       HWM_EBASE + 10
391 #define HWM_E0010_MSG   "HWM: A protocol layer has tried to send a frame with an invalid frame control"
392 #define HWM_E0011       HWM_EBASE + 11
393 #define HWM_E0011_MSG   "HWM: mac_drv_clear_tx_queue was called although the hardware wasn't stopped"
394 #define HWM_E0012       HWM_EBASE + 12
395 #define HWM_E0012_MSG   "HWM: mac_drv_clear_rx_queue was called although the hardware wasn't stopped"
396 #define HWM_E0013       HWM_EBASE + 13
397 #define HWM_E0013_MSG   "HWM: mac_drv_repair_descr was called although the hardware wasn't stopped"
398
399 #endif