/*
 *  $Id: message.h,v 1.1 1996/11/07 13:07:47 fritz Exp $
 *  Copyright (C) 1996  SpellCaster Telecommunications Inc.
 *
 *  message.h - structures, macros and defines useful for sending
 *              messages to the adapter
 *
 *  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.
 *
 *  This program is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with this program; if not, write to the Free Software
 *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 *
 *  For more information, please contact gpl-info@spellcast.com or write:
 *
 *     SpellCaster Telecommunications Inc.
 *     5621 Finch Avenue East, Unit #3
 *     Scarborough, Ontario  Canada
 *     M1B 2T9
 *     +1 (416) 297-8565
 *     +1 (416) 297-6433 Facsimile
 */

/*
 * Board message macros, defines and structures
 */
 
#ifndef MESSAGE_H
#define MESSAGE_H

#define MAX_MESSAGES		32	/* Maximum messages that can be
					   queued */
#define MSG_DATA_LEN		48	/* Maximum size of message payload */
#define MSG_LEN			64	/* Size of a message */
#define CMPID			0	/* Loader message process ID */
#define CEPID			64	/* Firmware message process ID */

/*
 * Macro to determine if a message is a loader message
 */
#define IS_CM_MESSAGE(mesg, tx, cx, dx)		\
		((mesg.type == cmRspType##tx)		\
		&&(mesg.class == cmRspClass##cx)	\
		&&(mesg.code == cmRsp##dx))

/*
 * Macro to determine if a message is a firmware message
 */
#define IS_CE_MESSAGE(mesg, tx, cx, dx)		\
		((mesg.type == ceRspType##tx)		\
		&&(mesg.class == ceRspClass##cx)	\
		&&(mesg.code == ceRsp##tx##dx))

/* 
 * Loader Request and Response Messages
 */

/* message types */
#define cmReqType1			1
#define cmReqType2			2
#define cmRspType0			0
#define cmRspType1			1
#define cmRspType2			2
#define cmRspType5			5

/* message classes */
#define cmReqClass0			0
#define cmRspClass0			0

/* message codes */
#define cmReqHWConfig		1			/* 1,0,1 */
#define cmReqMsgLpbk		2			/* 1,0,2 */
#define cmReqVersion		3			/* 1,0,3 */
#define cmReqLoadProc		1			/* 2,0,1 */
#define cmReqStartProc		2			/* 2,0,2 */
#define cmReqReadMem		6			/* 2,0,6 */
#define cmRspHWConfig		cmReqHWConfig
#define	cmRspMsgLpbk		cmReqMsgLpbk
#define cmRspVersion		cmReqVersion
#define cmRspLoadProc		cmReqLoadProc
#define cmRspStartProc		cmReqStartProc
#define	cmRspReadMem		cmReqReadMem
#define cmRspMiscEngineUp	1			/* 5,0,1 */
#define cmRspInvalid		0			/* 0,0,0 */


/*
 * Firmware Request and Response Messages
 */

/* message types */
#define ceReqTypePhy		1
#define ceReqTypeLnk		2
#define ceReqTypeCall		3
#define ceReqTypeStat		1
#define ceRspTypeErr		0
#define	ceRspTypePhy		ceReqTypePhy
#define ceRspTypeLnk		ceReqTypeLnk
#define ceRspTypeCall		ceReqTypeCall
#define ceRspTypeStat		ceReqTypeStat

/* message classes */
#define ceReqClass0		0
#define ceReqClass1		1
#define ceReqClass2		2
#define ceReqClass3		3
#define ceRspClass0		ceReqClass0
#define ceRspClass1		ceReqClass1
#define ceRspClass2		ceReqClass2
#define ceRspClass3		ceReqClass3

/* message codes  (B) = BRI only, (P) = PRI only, (V) = POTS only */
#define ceReqPhyProcInfo	1			/* 1,0,1 */
#define ceReqPhyConnect		1			/* 1,1,1 */
#define ceReqPhyDisconnect	2			/* 1,1,2 */
#define ceReqPhySetParams	3			/* 1,1,3 (P) */
#define ceReqPhyGetParams	4			/* 1,1,4 (P) */
#define ceReqPhyStatus		1			/* 1,2,1 */
#define ceReqPhyAcfaStatus	2			/* 1,2,2 (P) */
#define ceReqPhyChCallState	3			/* 1,2,3 (P) */
#define ceReqPhyChServState	4			/* 1,2,4 (P) */
#define ceReqPhyRLoopBack	1			/* 1,3,1 */
#define ceRspPhyProcInfo	ceReqPhyProcInfo
#define	ceRspPhyConnect		ceReqPhyConnect
#define ceRspPhyDisconnect	ceReqPhyDisconnect
#define ceRspPhySetParams	ceReqPhySetParams
#define ceRspPhyGetParams	ceReqPhyGetParams
#define ceRspPhyStatus		ceReqPhyStatus
#define ceRspPhyAcfaStatus	ceReqPhyAcfaStatus
#define ceRspPhyChCallState	ceReqPhyChCallState
#define ceRspPhyChServState	ceReqPhyChServState
#define ceRspPhyRLoopBack	ceReqphyRLoopBack
#define ceReqLnkSetParam	1			/* 2,0,1 */
#define ceReqLnkGetParam	2			/* 2,0,2 */
#define ceReqLnkGetStats	3			/* 2,0,3 */
#define ceReqLnkWrite		1			/* 2,1,1 */
#define ceReqLnkRead		2			/* 2,1,2 */
#define ceReqLnkFlush		3			/* 2,1,3 */
#define ceReqLnkWrBufTrc	4			/* 2,1,4 */
#define ceReqLnkRdBufTrc	5			/* 2,1,5 */
#define ceRspLnkSetParam	ceReqLnkSetParam
#define ceRspLnkGetParam	ceReqLnkGetParam
#define ceRspLnkGetStats	ceReqLnkGetStats
#define ceRspLnkWrite		ceReqLnkWrite
#define ceRspLnkRead		ceReqLnkRead
#define ceRspLnkFlush		ceReqLnkFlush
#define ceRspLnkWrBufTrc	ceReqLnkWrBufTrc
#define ceRspLnkRdBufTrc	ceReqLnkRdBufTrc
#define ceReqCallSetSwitchType	1			/* 3,0,1 */
#define ceReqCallGetSwitchType	2			/* 3,0,2 */
#define ceReqCallSetFrameFormat	3			/* 3,0,3 */
#define ceReqCallGetFrameFormat	4			/* 3,0,4 */
#define ceReqCallSetCallType	5			/* 3,0,5 */
#define ceReqCallGetCallType	6			/* 3,0,6 */
#define ceReqCallSetSPID	7			/* 3,0,7 (!P) */
#define ceReqCallGetSPID	8			/* 3,0,8 (!P) */
#define ceReqCallSetMyNumber	9			/* 3,0,9 (!P) */
#define ceReqCallGetMyNumber	10			/* 3,0,10 (!P) */
#define	ceRspCallSetSwitchType	ceReqCallSetSwitchType
#define ceRspCallGetSwitchType	ceReqCallSetSwitchType
#define ceRspCallSetFrameFormat	ceReqCallSetFrameFormat
#define ceRspCallGetFrameFormat	ceReqCallGetFrameFormat
#define ceRspCallSetCallType	ceReqCallSetCallType
#define ceRspCallGetCallType	ceReqCallGetCallType
#define ceRspCallSetSPID	ceReqCallSetSPID
#define ceRspCallGetSPID	ceReqCallGetSPID
#define ceRspCallSetMyNumber	ceReqCallSetMyNumber
#define ceRspCallGetMyNumber	ceReqCallGetMyNumber
#define ceRspStatAcfaStatus	2
#define ceRspStat
#define ceRspErrError		0			/* 0,0,0 */

/*
 * Call Types
 */
#define CALLTYPE_64K		0
#define CALLTYPE_56K		1
#define CALLTYPE_SPEECH		2
#define CALLTYPE_31KHZ		3

/*
 * Link Level data contains a pointer to and the length of
 * a buffer in shared RAM. Used by LnkRead and LnkWrite message
 * types. Part of RspMsgStruct and ReqMsgStruct.
 */
typedef struct {
	unsigned long buff_offset;
	unsigned short msg_len;
} LLData;


/* 
 * Message payload template for an HWConfig message
 */
typedef struct {
	char st_u_sense;
	char powr_sense;
	char sply_sense;
	unsigned char asic_id;
	long ram_size;
	char serial_no[13];
	char part_no[13];
	char rev_no[2];
} HWConfig_pl;

/*
 * A Message
 */
struct message {
	unsigned char sequence_no;
	unsigned char process_id;
	unsigned char time_stamp;
	unsigned char cmd_sequence_no;	/* Rsp messages only */
	unsigned char reserved1[3];
	unsigned char msg_byte_cnt;
	unsigned char type;
	unsigned char class;
	unsigned char code;
	unsigned char phy_link_no;
	unsigned char rsp_status;	/* Rsp messages only */
	unsigned char reseved2[3];
	union {
		unsigned char byte_array[MSG_DATA_LEN];
		LLData response;
		HWConfig_pl HWCresponse;
	} msg_data;
};

typedef struct message ReqMessage;	/* Request message */
typedef struct message RspMessage;	/* Response message */

/*
 * The first 5010 bytes of shared memory contain the message queues,
 * indexes and other data. This structure is its template
 */
typedef struct {
	volatile ReqMessage req_queue[MAX_MESSAGES];
	volatile RspMessage rsp_queue[MAX_MESSAGES];
	volatile unsigned char req_head;
	volatile unsigned char req_tail;
	volatile unsigned char rsp_head;
	volatile unsigned char rsp_tail;
	volatile unsigned long signature;
	volatile unsigned long trace_enable;
	volatile unsigned char reserved[4];
} DualPortMemory;

#endif
