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