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