
/*
 *
 Copyright (c) Eicon Networks, 2002.
 *
 This source file is supplied for the use with
 Eicon Networks range of DIVA Server Adapters.
 *
 Eicon File Revision :    2.1
 *
 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, or (at your option)
 any later version.
 *
 This program is distributed in the hope that it will be useful,
 but WITHOUT ANY WARRANTY OF ANY KIND WHATSOEVER INCLUDING ANY
 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.
 *
 */
#ifdef PLATFORM_GT_32BIT
/* #define POINTER_32BIT byte * __ptr32 */
#define POINTER_32BIT dword
#else
#define POINTER_32BIT byte *
#endif
#if !defined(MIPS_SCOM)
#define BUFFER_SZ  48
#define MAINT_OFFS 0x380
#else
#define BUFFER_SZ  128
#if defined(PRI)
#define MAINT_OFFS 0xef00
#else
#define MAINT_OFFS 0xff00
#endif
#endif
#define MIPS_BUFFER_SZ  128
#if defined(PRI)
#define MIPS_MAINT_OFFS 0xef00
#else
#define MIPS_MAINT_OFFS 0xff00
#endif
#define LOG                     1
#define MEMR                    2
#define MEMW                    3
#define IOR                     4
#define IOW                     5
#define B1TEST                  6
#define B2TEST                  7
#define BTESTOFF                8
#define DSIG_STATS              9
#define B_CH_STATS              10
#define D_CH_STATS              11
#define BL1_STATS               12
#define BL1_STATS_C             13
#define GET_VERSION             14
#define OS_STATS                15
#define XLOG_SET_MASK           16
#define XLOG_GET_MASK           17
#define DSP_READ                20
#define DSP_WRITE               21
#define OK 0xff
#define MORE_EVENTS 0xfe
#define NO_EVENT 1
struct DSigStruc
{
	byte Id;
	byte u;
	byte listen;
	byte active;
	byte sin[3];
	byte bc[6];
	byte llc[6];
	byte hlc[6];
	byte oad[20];
};
struct BL1Struc {
	dword cx_b1;
	dword cx_b2;
	dword cr_b1;
	dword cr_b2;
	dword px_b1;
	dword px_b2;
	dword pr_b1;
	dword pr_b2;
	word er_b1;
	word er_b2;
};
struct L2Struc {
	dword XTotal;
	dword RTotal;
	word XError;
	word RError;
};
struct OSStruc {
	dword free_n;
};
typedef union
{
	struct DSigStruc DSigStats;
	struct BL1Struc BL1Stats;
	struct L2Struc L2Stats;
	struct OSStruc OSStats;
	byte   b[BUFFER_SZ];
	word   w[BUFFER_SZ >> 1];
	word   l[BUFFER_SZ >> 2]; /* word is wrong, do not use! Use 'd' instead. */
	dword  d[BUFFER_SZ >> 2];
} BUFFER;
typedef union
{
	struct DSigStruc DSigStats;
	struct BL1Struc BL1Stats;
	struct L2Struc L2Stats;
	struct OSStruc OSStats;
	byte   b[MIPS_BUFFER_SZ];
	word   w[MIPS_BUFFER_SZ >> 1];
	word   l[BUFFER_SZ >> 2]; /* word is wrong, do not use! Use 'd' instead. */
	dword  d[MIPS_BUFFER_SZ >> 2];
} MIPS_BUFFER;
#if !defined(MIPS_SCOM)
struct pc_maint
{
	byte req;
	byte rc;
	POINTER_32BIT mem;
	short length;
	word port;
	byte fill[6];
	BUFFER data;
};
#else
struct pc_maint
{
	byte req;
	byte rc;
	byte reserved[2];     /* R3000 alignment ... */
	POINTER_32BIT mem;
	short length;
	word port;
	byte fill[4];         /* data at offset 16   */
	BUFFER data;
};
#endif
struct mi_pc_maint
{
	byte req;
	byte rc;
	byte reserved[2];     /* R3000 alignment ... */
	POINTER_32BIT mem;
	short length;
	word port;
	byte fill[4];         /* data at offset 16   */
	MIPS_BUFFER data;
};
