/******************************************************************************
 *
 *	(C)Copyright 1998,1999 SysKonnect,
 *	a business unit of Schneider & Koch & Co. Datensysteme GmbH.
 *
 *	This program is free software; you can redistribute it and/or modify
 *	it under the terms of the GNU General Public License as published by
 *	the Free Software Foundation; either version 2 of the License, or
 *	(at your option) any later version.
 *
 *	The information in this file is provided "AS IS" without warranty.
 *
 ******************************************************************************/

#ifndef	_HWM_
#define	_HWM_

#include "mbuf.h"

/*
 * MACRO for DMA synchronization:
 *	The descriptor 'desc' is flushed for the device 'flag'.
 *	Devices are the CPU (DDI_DMA_SYNC_FORCPU) and the
 *	adapter (DDI_DMA_SYNC_FORDEV).
 *
 *	'desc'	Pointer to a Rx or Tx descriptor.
 *	'flag'	Flag for direction (view for CPU or DEVICE) that
 *		should be synchronized.
 *
 *	Empty macros and defines are specified here. The real macro
 *	is os-specific and should be defined in osdef1st.h.
 */
#ifndef DRV_BUF_FLUSH
#define DRV_BUF_FLUSH(desc,flag)
#define DDI_DMA_SYNC_FORCPU
#define DDI_DMA_SYNC_FORDEV
#endif

	/*
	 * hardware modul dependent receive modes
	 */
#define	RX_ENABLE_PASS_SMT	21
#define	RX_DISABLE_PASS_SMT	22
#define	RX_ENABLE_PASS_NSA	23
#define	RX_DISABLE_PASS_NSA	24
#define	RX_ENABLE_PASS_DB	25
#define	RX_DISABLE_PASS_DB	26
#define	RX_DISABLE_PASS_ALL	27
#define	RX_DISABLE_LLC_PROMISC	28
#define	RX_ENABLE_LLC_PROMISC	29


#ifndef	DMA_RD
#define DMA_RD		1	/* memory -> hw */
#endif
#ifndef DMA_WR
#define DMA_WR		2	/* hw -> memory */
#endif
#define SMT_BUF		0x80

	/*
	 * bits of the frame status byte
	 */
#define EN_IRQ_EOF	0x02	/* get IRQ after end of frame transmission */
#define	LOC_TX		0x04	/* send frame to the local SMT */
#define LAST_FRAG	0x08	/* last TxD of the frame */
#define	FIRST_FRAG	0x10	/* first TxD of the frame */
#define	LAN_TX		0x20	/* send frame to network if set */
#define RING_DOWN	0x40	/* error: unable to send, ring down */
#define OUT_OF_TXD	0x80	/* error: not enough TxDs available */


#ifndef NULL
#define NULL 		0
#endif

#ifdef	LITTLE_ENDIAN
#define HWM_REVERSE(x)	(x)
#else
#define	HWM_REVERSE(x)		((((x)<<24L)&0xff000000L)	+	\
				 (((x)<< 8L)&0x00ff0000L)	+	\
				 (((x)>> 8L)&0x0000ff00L)	+	\
				 (((x)>>24L)&0x000000ffL))
#endif

#define C_INDIC		(1L<<25)
#define A_INDIC		(1L<<26)
#define	RD_FS_LOCAL	0x80

	/*
	 * DEBUG FLAGS
	 */
#define	DEBUG_SMTF	1
#define	DEBUG_SMT	2
#define	DEBUG_ECM	3
#define	DEBUG_RMT	4
#define	DEBUG_CFM	5
#define	DEBUG_PCM	6
#define	DEBUG_SBA	7
#define	DEBUG_ESS	8

#define	DB_HWM_RX	10
#define	DB_HWM_TX	11
#define DB_HWM_GEN	12

struct s_mbuf_pool {
#ifndef	MB_OUTSIDE_SMC
	SMbuf		mb[MAX_MBUF] ;		/* mbuf pool */
#endif
	SMbuf		*mb_start ;		/* points to the first mb */
	SMbuf		*mb_free ;		/* free queue */
} ;

struct hwm_r {
	/*
	 * hardware modul specific receive variables
	 */
	u_int			len ;		/* length of the whole frame */
	char			*mb_pos ;	/* SMbuf receive position */
} ;

struct hw_modul {
	/*
	 * All hardware modul specific variables
	 */
	struct	s_mbuf_pool	mbuf_pool ;
	struct	hwm_r	r ;

	union s_fp_descr volatile *descr_p ; /* points to the desriptor area */

	u_short pass_SMT ;		/* pass SMT frames */
	u_short pass_NSA ;		/* pass all NSA frames */
	u_short pass_DB ;		/* pass Direct Beacon Frames */
	u_short pass_llc_promisc ;	/* pass all llc frames (default ON) */

	SMbuf	*llc_rx_pipe ;		/* points to the first queued llc fr */
	SMbuf	*llc_rx_tail ;		/* points to the last queued llc fr */
	int	queued_rx_frames ;	/* number of queued frames */

	SMbuf	*txd_tx_pipe ;		/* points to first mb in the txd ring */
	SMbuf	*txd_tx_tail ;		/* points to last mb in the txd ring */
	int	queued_txd_mb ;		/* number of SMT MBufs in txd ring */

	int	rx_break ;		/* rev. was breaked because ind. off */
	int	leave_isr ;		/* leave fddi_isr immedeately if set */
	int	isr_flag ;		/* set, when HWM is entered from isr */
	/*
	 * variables for the current transmit frame
	 */
	struct s_smt_tx_queue *tx_p ;	/* pointer to the transmit queue */
	u_long	tx_descr ;		/* tx descriptor for FORMAC+ */
	int	tx_len ;		/* tx frame length */
	SMbuf	*tx_mb ;		/* SMT tx MBuf pointer */
	char	*tx_data ;		/* data pointer to the SMT tx Mbuf */

	int	detec_count ;		/* counter for out of RxD condition */
	u_long	rx_len_error ;		/* rx len FORMAC != sum of fragments */
} ;


/*
 * DEBUG structs and macros
 */

#ifdef	DEBUG
struct os_debug {
	int	hwm_rx ;
	int	hwm_tx ;
	int	hwm_gen ;
} ;
#endif

#ifdef	DEBUG
#ifdef	DEBUG_BRD
#define	DB_P	smc->debug
#else
#define DB_P	debug
#endif

#define DB_RX(a,b,c,lev) if (DB_P.d_os.hwm_rx >= (lev))	printf(a,b,c)
#define DB_TX(a,b,c,lev) if (DB_P.d_os.hwm_tx >= (lev))	printf(a,b,c)
#define DB_GEN(a,b,c,lev) if (DB_P.d_os.hwm_gen >= (lev)) printf(a,b,c)
#else	/* DEBUG */
#define DB_RX(a,b,c,lev)
#define DB_TX(a,b,c,lev)
#define DB_GEN(a,b,c,lev)
#endif	/* DEBUG */

#ifndef	SK_BREAK
#define	SK_BREAK()
#endif


/*
 * HWM Macros
 */

/*
 *	BEGIN_MANUAL_ENTRY(HWM_GET_TX_PHYS)
 *	u_long HWM_GET_TX_PHYS(txd)
 *
 * function	MACRO		(hardware module, hwmtm.h)
 *		This macro may be invoked by the OS-specific module to read
 *		the physical address of the specified TxD.
 *
 * para	txd	pointer to the TxD
 *
 *	END_MANUAL_ENTRY
 */
#define	HWM_GET_TX_PHYS(txd)		(u_long)AIX_REVERSE((txd)->txd_tbadr)

/*
 *	BEGIN_MANUAL_ENTRY(HWM_GET_TX_LEN)
 *	int HWM_GET_TX_LEN(txd)
 *
 * function	MACRO		(hardware module, hwmtm.h)
 *		This macro may be invoked by the OS-specific module to read
 *		the fragment length of the specified TxD
 *
 * para	rxd	pointer to the TxD
 *
 * return	the length of the fragment in bytes
 *
 *	END_MANUAL_ENTRY
 */
#define	HWM_GET_TX_LEN(txd)	((int)AIX_REVERSE((txd)->txd_tbctrl)& RD_LENGTH)

/*
 *	BEGIN_MANUAL_ENTRY(HWM_GET_TX_USED)
 *	txd *HWM_GET_TX_USED(smc,queue)
 *
 * function	MACRO		(hardware module, hwmtm.h)
 *		This macro may be invoked by the OS-specific module to get the
 *		number of used TxDs for the queue, specified by the index.
 *
 * para	queue	the number of the send queue: Can be specified by
 *		QUEUE_A0, QUEUE_S or (frame_status & QUEUE_A0)
 *
 * return	number of used TxDs for this send queue
 *
 *	END_MANUAL_ENTRY
 */
#define	HWM_GET_TX_USED(smc,queue)	(int) (smc)->hw.fp.tx_q[queue].tx_used

/*
 *	BEGIN_MANUAL_ENTRY(HWM_GET_CURR_TXD)
 *	txd *HWM_GET_CURR_TXD(smc,queue)
 *
 * function	MACRO		(hardware module, hwmtm.h)
 *		This macro may be invoked by the OS-specific module to get the
 *		pointer to the TxD which points to the current queue put
 *		position.
 *
 * para	queue	the number of the send queue: Can be specified by
 *		QUEUE_A0, QUEUE_S or (frame_status & QUEUE_A0)
 *
 * return	pointer to the current TxD
 *
 *	END_MANUAL_ENTRY
 */
#define	HWM_GET_CURR_TXD(smc,queue)	(struct s_smt_fp_txd volatile *)\
					(smc)->hw.fp.tx_q[queue].tx_curr_put

/*
 *	BEGIN_MANUAL_ENTRY(HWM_GET_RX_FRAG_LEN)
 *	int HWM_GET_RX_FRAG_LEN(rxd)
 *
 * function	MACRO		(hardware module, hwmtm.h)
 *		This macro may be invoked by the OS-specific module to read
 *		the fragment length of the specified RxD
 *
 * para	rxd	pointer to the RxD
 *
 * return	the length of the fragment in bytes
 *
 *	END_MANUAL_ENTRY
 */
#define	HWM_GET_RX_FRAG_LEN(rxd)	((int)AIX_REVERSE((rxd)->rxd_rbctrl)& \
				RD_LENGTH)

/*
 *	BEGIN_MANUAL_ENTRY(HWM_GET_RX_PHYS)
 *	u_long HWM_GET_RX_PHYS(rxd)
 *
 * function	MACRO		(hardware module, hwmtm.h)
 *		This macro may be invoked by the OS-specific module to read
 *		the physical address of the specified RxD.
 *
 * para	rxd	pointer to the RxD
 *
 * return	the RxD's physical pointer to the data fragment
 *
 *	END_MANUAL_ENTRY
 */
#define	HWM_GET_RX_PHYS(rxd)	(u_long)AIX_REVERSE((rxd)->rxd_rbadr)

/*
 *	BEGIN_MANUAL_ENTRY(HWM_GET_RX_USED)
 *	int HWM_GET_RX_USED(smc)
 *
 * function	MACRO		(hardware module, hwmtm.h)
 *		This macro may be invoked by the OS-specific module to get
 *		the count of used RXDs in receive queue 1.
 *
 * return	the used RXD count of receive queue 1
 *
 * NOTE: Remember, because of an ASIC bug at least one RXD should be unused
 *	 in the descriptor ring !
 *
 *	END_MANUAL_ENTRY
 */
#define	HWM_GET_RX_USED(smc)	((int)(smc)->hw.fp.rx_q[QUEUE_R1].rx_used)

/*
 *	BEGIN_MANUAL_ENTRY(HWM_GET_RX_FREE)
 *	int HWM_GET_RX_FREE(smc)
 *
 * function	MACRO		(hardware module, hwmtm.h)
 *		This macro may be invoked by the OS-specific module to get
 *		the rxd_free count of receive queue 1.
 *
 * return	the rxd_free count of receive queue 1
 *
 *	END_MANUAL_ENTRY
 */
#define	HWM_GET_RX_FREE(smc)	((int)(smc)->hw.fp.rx_q[QUEUE_R1].rx_free-1)

/*
 *	BEGIN_MANUAL_ENTRY(HWM_GET_CURR_RXD)
 *	rxd *HWM_GET_CURR_RXD(smc)
 *
 * function	MACRO		(hardware module, hwmtm.h)
 *		This macro may be invoked by the OS-specific module to get the
 *		pointer to the RxD which points to the current queue put
 *		position.
 *
 * return	pointer to the current RxD
 *
 *	END_MANUAL_ENTRY
 */
#define	HWM_GET_CURR_RXD(smc)	(struct s_smt_fp_rxd volatile *)\
				(smc)->hw.fp.rx_q[QUEUE_R1].rx_curr_put

/*
 *	BEGIN_MANUAL_ENTRY(HWM_RX_CHECK)
 *	void HWM_RX_CHECK(smc,low_water)
 *
 * function	MACRO		(hardware module, hwmtm.h)
 *		This macro is invoked by the OS-specific before it left the
 *		function mac_drv_rx_complete. This macro calls mac_drv_fill_rxd
 *		if the number of used RxDs is equal or lower than the
 *		the given low water mark.
 *
 * para	low_water	low water mark of used RxD's
 *
 *	END_MANUAL_ENTRY
 */
#ifndef HWM_NO_FLOW_CTL
#define	HWM_RX_CHECK(smc,low_water) {\
	if ((low_water) >= (smc)->hw.fp.rx_q[QUEUE_R1].rx_used) {\
		mac_drv_fill_rxd(smc) ;\
	}\
}
#else
#define	HWM_RX_CHECK(smc,low_water)		mac_drv_fill_rxd(smc)
#endif

#ifndef	HWM_EBASE
#define	HWM_EBASE	500
#endif

#define	HWM_E0001	HWM_EBASE + 1
#define	HWM_E0001_MSG	"HWM: Wrong size of s_rxd_os struct"
#define	HWM_E0002	HWM_EBASE + 2
#define	HWM_E0002_MSG	"HWM: Wrong size of s_txd_os struct"
#define	HWM_E0003	HWM_EBASE + 3
#define	HWM_E0003_MSG	"HWM: smt_free_mbuf() called with NULL pointer"
#define	HWM_E0004	HWM_EBASE + 4
#define	HWM_E0004_MSG	"HWM: Parity error rx queue 1"
#define	HWM_E0005	HWM_EBASE + 5
#define	HWM_E0005_MSG	"HWM: Encoding error rx queue 1"
#define	HWM_E0006	HWM_EBASE + 6
#define	HWM_E0006_MSG	"HWM: Encoding error async tx queue"
#define	HWM_E0007	HWM_EBASE + 7
#define	HWM_E0007_MSG	"HWM: Encoding error sync tx queue"
#define	HWM_E0008	HWM_EBASE + 8
#define	HWM_E0008_MSG	""
#define	HWM_E0009	HWM_EBASE + 9
#define	HWM_E0009_MSG	"HWM: Out of RxD condition detected"
#define	HWM_E0010	HWM_EBASE + 10
#define	HWM_E0010_MSG	"HWM: A protocol layer has tried to send a frame with an invalid frame control"
#define HWM_E0011	HWM_EBASE + 11
#define HWM_E0011_MSG	"HWM: mac_drv_clear_tx_queue was called although the hardware wasn't stopped"
#define HWM_E0012	HWM_EBASE + 12
#define HWM_E0012_MSG	"HWM: mac_drv_clear_rx_queue was called although the hardware wasn't stopped"
#define HWM_E0013	HWM_EBASE + 13
#define HWM_E0013_MSG	"HWM: mac_drv_repair_descr was called although the hardware wasn't stopped"

#endif
