/*	$OpenBSD: if_san_front_end.h,v 1.5 2007/09/12 13:56:40 chl Exp $	*/

/*-
 * Copyright (c) 2001-2004 Sangoma Technologies (SAN)
 * All rights reserved.  www.sangoma.com
 *
 * This code is written by Alex Feldman <al.feldman@sangoma.com> for SAN.
 * The code is derived from permitted modifications to software created
 * by Nenad Corbic (ncorbic@sangoma.com).
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above
 *    copyright notice, this list of conditions and the following disclaimer
 *    in the documentation and/or other materials provided with the
 *    distribution.
 * 3. Neither the name of Sangoma Technologies nor the names of its
 *    contributors may be used to endorse or promote products derived
 *    from this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY SANGOMA TECHNOLOGIES AND CONTRIBUTORS
 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
 * THE POSSIBILITY OF SUCH DAMAGE.
 */

#ifndef __IF_SAN_FRONT_END_H_
#define __IF_SAN_FRONT_END_H_

/* The hardware media */
#define WAN_MEDIA_NONE       0x00    /* Regular card */
#define WAN_MEDIA_T1         0x01    /* T1 connection */
#define WAN_MEDIA_E1         0x02    /* E1 connection */
#define WAN_MEDIA_56K        0x03    /* 56K connection */

/* settings for the 'adapter_type' */
#define S508_ADPTR			0x0001	/* S508 */
#define S5141_ADPTR_1_CPU_SERIAL	0x0011	/* S5141, single CPU, serial */
#define S5142_ADPTR_2_CPU_SERIAL	0x0012	/* S5142, dual CPU, serial */
#define S5143_ADPTR_1_CPU_FT1		0x0013	/* S5143, single CPU, FT1 */
#define S5144_ADPTR_1_CPU_T1E1		0x0014	/* S5144, single CPU, T1/E1 */
#define S5145_ADPTR_1_CPU_56K		0x0015	/* S5145, single CPU, 56K */
#define S5147_ADPTR_2_CPU_T1E1		0x0017  /* S5147, dual CPU, T1/E1 */
#define S5148_ADPTR_1_CPU_T1E1		0x0018	/* S5148, single CPU, T1/E1 */

#define S518_ADPTR_1_CPU_ADSL		0x0018	/* S518, adsl card */

#define A101_ADPTR_T1E1_MASK		0x0040	/* T1/E1 type mask  */
#define A101_ADPTR_1TE1			0x0041	/* 1 Channel T1/E1  */
#define A101_ADPTR_2TE1			0x0042	/* 2 Channels T1/E1 */

#define A100_ADPTR_T3E3_MASK		0x0080	/* T3/E3  type mask */
#define A100_ADPTR_1_CHN_T3E3		0x0081	/* 1 Channel T3/E3 (Proto.) */
#define A105_ADPTR_1_CHN_T3E3		0x0082	/* 1 Channel T3/E3 */

#define OPERATE_T1E1_AS_SERIAL		0x8000  /* For bitstreaming only 
						 * Allow the application to 
						 * E1 front end */

#define SDLA_ADPTR_DECODE(adapter_type)			\
		(adapter_type == S5141_ADPTR_1_CPU_SERIAL) ? "S514-1-PCI" : \
		(adapter_type == S5142_ADPTR_2_CPU_SERIAL) ? "S514-2-PCI" : \
		(adapter_type == S5143_ADPTR_1_CPU_FT1)    ? "S514-3-PCI" : \
		(adapter_type == S5144_ADPTR_1_CPU_T1E1)   ? "S514-4-PCI" : \
		(adapter_type == S5145_ADPTR_1_CPU_56K)    ? "S514-5-PCI" : \
		(adapter_type == S5147_ADPTR_2_CPU_T1E1)   ? "S514-7-PCI" : \
		(adapter_type == S518_ADPTR_1_CPU_ADSL)    ? "S518-PCI  " : \
		(adapter_type == A101_ADPTR_1TE1)	   ? "AFT-A101  " : \
		(adapter_type == A101_ADPTR_2TE1)	   ? "AFT-A102  " : \
		(adapter_type == A105_ADPTR_1_CHN_T3E3)    ? "A105-1-PCI" : \
		(adapter_type == A105_ADPTR_1_CHN_T3E3)    ? "A105-2    " : \
							     "UNKNOWN   "

/* front-end UDP command */
#define WAN_FE_GET_STAT			(WAN_FE_UDP_CMD_START + 0)
#define WAN_FE_SET_LB_MODE		(WAN_FE_UDP_CMD_START + 1)
#define WAN_FE_FLUSH_PMON		(WAN_FE_UDP_CMD_START + 2)
#define WAN_FE_GET_CFG			(WAN_FE_UDP_CMD_START + 3)

/* front-end configuration and access interface commands */

/* 0x90 read from front-end register */
#define READ_FRONT_END_REGISTER		(WAN_FE_CMD_START+0)

/* 0x91 write to front-end register */
#define WRITE_FRONT_END_REGISTER	(WAN_FE_CMD_START+1)

/* 0x92 read the front-end statistics */
#define READ_FRONT_END_STATISTICS	(WAN_FE_CMD_START+2)

/* 0x93 flush the front-end statistics */
#define FLUSH_FRONT_END_STATISTICS	(WAN_FE_CMD_START+3)

#ifdef _KERNEL

/* adapter configuration interface commands */

/* 0xA0 set adapter configuration */
#define SET_ADAPTER_CONFIGURATION	(WAN_INTERFACE_CMD_START+0)

/* 0xA1 read adapter configuration */
#define READ_ADAPTER_CONFIGURATION	(WAN_INTERFACE_CMD_START+1)

/* front-end command */
#define WAN_FE_GET_STAT			(WAN_FE_UDP_CMD_START + 0)
#define WAN_FE_SET_LB_MODE		(WAN_FE_UDP_CMD_START + 1)
#define WAN_FE_FLUSH_PMON		(WAN_FE_UDP_CMD_START + 2)
#define WAN_FE_GET_CFG			(WAN_FE_UDP_CMD_START + 3)

/*
 * return codes from interface commands 
 */
/* the length of the FE_RX_DISC_TX_IDLE_STRUCT is invalid */
#define LGTH_FE_CFG_DATA_INVALID       0x91

/* the length of the passed configuration data is invalid */
#define LGTH_ADAPTER_CFG_DATA_INVALID  0x91

/* the passed SET_FE_RX_DISC_TX_IDLE_CFG data is invalid */
#define INVALID_FE_CFG_DATA            0x92

/* an invalid adapter operating frequency was selected */
#define ADPTR_OPERATING_FREQ_INVALID   0x92

/* set the protocol-level configuration before setting the FE configuration */
#define PROT_CFG_BEFORE_FE_CFG         0x93

/* set the front-end Rx discard/Tx idle configuration */
#define SET_FE_RX_DISC_TX_IDLE_CFG      0x98

/* read the front-end Rx discard/Tx idle configuration */
#define READ_FE_RX_DISC_TX_IDLE_CFG     0x99

/* set the T1/E1 signaling configuration */
#define SET_TE1_SIGNALING_CFG		0x9A

/* read the T1/E1 signaling configuration */
#define READ_TE1_SIGNALING_CFG	0x9B


/* the command is invalid for the adapter type */
#define COMMAND_INVALID_FOR_ADAPTER    0x9F


/*
 * Constants for the SET_FE_RX_DISC_TX_IDLE_CFG 
 * and READ_FE_RX_DISC_TX_IDLE_CFG commands
 */

/* T1 - no active time slots used for reception */
#define NO_ACTIVE_RX_TIME_SLOTS_T1   24

/* T1 - no active time slots used for transmission */
#define NO_ACTIVE_TX_TIME_SLOTS_T1   24

/* E1 - no active time slots used for reception */
#define NO_ACTIVE_RX_TIME_SLOTS_E1   32

/*
 * E1 - no active time slots used for transmission
 * (channel 0 reserved for framing)
 */
#define NO_ACTIVE_TX_TIME_SLOTS_E1   31

/* Read/Write to front-end register */
#define READ_REG(reg)		card->read_front_end_reg(card, reg)
#define WRITE_REG(reg, value)	card->write_front_end_reg(card, reg, \
				    (unsigned char)(value))

/*
 * the structure used for the SET_FE_RX_DISC_TX_IDLE_CFG and
 * READ_FE_RX_DISC_TX_IDLE_CFG command
 */
#pragma pack(1)
typedef struct {
	/* the length of the Rx discard buffer */
	unsigned short lgth_Rx_disc_bfr;

	/* the length of the Tx idle buffer */
	unsigned short lgth_Tx_idle_bfr;

	/* the transmit idle data buffer */
	unsigned char Tx_idle_data_bfr[NO_ACTIVE_TX_TIME_SLOTS_E1];
} FE_RX_DISC_TX_IDLE_STRUCT;
#pragma pack()


/*
 * Constants for front-end access
 */

/*
 * the structure used for the READ_FRONT_END_REGISTER and
 * WRITE_FRONT_END_REGISTER command
 */
#pragma pack(1)
typedef struct {
	/* the register number to be read from or written to */
	unsigned short register_number;

	/* the register value read/written */
	unsigned char register_value;
} FRONT_END_REG_STRUCT;
#pragma pack()


/* -----------------------------------------------------------------------------
 *            Constants for the READ_FRONT_END_STATISTICS command
 * ---------------------------------------------------------------------------*/

/* the front-end statistics structure */
#pragma pack(1)
typedef struct {
	/* the number of front-end interrupts generated */
	unsigned long FE_interrupt_count;

	/* the number of front-end interrupt application timeouts */
	unsigned long FE_app_timeout_count;
} FE_STATISTICS_STRUCT;
#pragma pack()



/*
 * Constants for the SET_ADAPTER_CONFIGURATION
 * and READ_ADAPTER_CONFIGURATION commands
 */

/* the adapter configuration structure */
#pragma pack(1)
typedef struct {
	unsigned short adapter_type;		/* type of adapter */
	unsigned short adapter_config;		/* misc adapter config */
	unsigned long operating_frequency;	/* adapter operating freq */
} ADAPTER_CONFIGURATION_STRUCT;
#pragma pack()



typedef unsigned char (WRITE_FRONT_END_REG_T)
	(void *, unsigned short, unsigned char);
typedef unsigned char (READ_FRONT_END_REG_T)
	(void *, unsigned short);


enum {
	AFT_LED_ON,
	AFT_LED_OFF,
	AFT_LED_TOGGLE
};


/*
 * Sangoma Front-End interface structure 
 */
typedef struct {
	/* In-Service or Not (T1/E1/56K) */
	unsigned long	(*get_fe_service_status)(void*);

	/* Print Front-End alarm (T1/E1/56K) */
	void		(*print_fe_alarm)(void*,unsigned long);

	/* Print Front-End alarm (T1/E1/56K) */
	char*		(*print_fe_act_channels)(void*);

	/* Set Front-End alarm (T1/E1) */
	void		(*set_fe_alarm)(void*,unsigned long);
} sdla_fe_iface_t;


#endif	/* _KERNEL */

#endif
