/*
** -----------------------------------------------------------------------------
**
**  Perle Specialix driver for Linux
**  Ported from existing RIO Driver for SCO sources.
 *
 *  (C) 1990 - 2000 Specialix International Ltd., Byfleet, Surrey, UK.
 *
 *      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.
**
**	Module		: cmdpkt.h
**	SID		: 1.2
**	Last Modified	: 11/6/98 11:34:09
**	Retrieved	: 11/6/98 11:34:20
**
**  ident @(#)cmdpkt.h	1.2
**
** -----------------------------------------------------------------------------
*/
#ifndef __rio_cmdpkt_h__
#define __rio_cmdpkt_h__

#ifdef SCCS_LABELS
#ifndef lint
static char *_cmdpkt_h_sccs_ = "@(#)cmdpkt.h	1.2";
#endif
#endif

/*
** overlays for the data area of a packet. Used in both directions
** (to build a packet to send, and to interpret a packet that arrives)
** and is very inconvenient for MIPS, so they appear as two separate
** structures - those used for modifying/reading packets on the card
** and those for modifying/reading packets in real memory, which have an _M
** suffix.
*/

#define	RTA_BOOT_DATA_SIZE (PKT_MAX_DATA_LEN-2)

/*
** The boot information packet looks like this:
** This structure overlays a PktCmd->CmdData structure, and so starts
** at Data[2] in the actual pkt!
*/
struct BootSequence
{
    WORD	NumPackets;
    WORD	LoadBase;
    WORD	CodeSize;
};

#define	BOOT_SEQUENCE_LEN	8

struct SamTop
{
    BYTE Unit;
    BYTE Link;
};

struct CmdHdr
{
    BYTE PcCommand;
    union
    {
    BYTE PcPhbNum;
    BYTE PcLinkNum;
    BYTE PcIDNum;
    } U0;
};


struct PktCmd
{
    union
    {
	struct 
	{
	    struct CmdHdr CmdHdr;
	    struct BootSequence PcBootSequence;
	} S1;
	struct
	{
	    WORD PcSequence;
	    BYTE PcBootData[RTA_BOOT_DATA_SIZE];
	} S2;
	struct
	{
	    WORD  __crud__;
	    BYTE  PcUniqNum[4];	        /* this is really a uint. */
	    BYTE  PcModuleTypes;  	/* what modules are fitted */
	} S3;
	struct
	{
	    struct CmdHdr CmdHdr;
	    BYTE   __undefined__;
	    BYTE   PcModemStatus;
	    BYTE   PcPortStatus;
	    BYTE   PcSubCommand;	/* commands like mem or register dump */
	    WORD   PcSubAddr;		/* Address for command */
	    BYTE   PcSubData[64];	/* Date area for command */
	} S4;
	struct
	{
	    struct CmdHdr CmdHdr;
	    BYTE   PcCommandText[1];
	    BYTE   __crud__[20];
	    BYTE   PcIDNum2;		/* It had to go somewhere! */
	} S5;
	struct
	{
	    struct CmdHdr CmdHdr;
	    struct SamTop    Topology[LINKS_PER_UNIT];
	} S6;
    } U1;
};

struct PktCmd_M
{
    union
    {
	struct 
	{
	    struct
	    {
    		uchar PcCommand;
    		union
    		{
    		    uchar PcPhbNum;
    		    uchar PcLinkNum;
    		    uchar PcIDNum;
    		} U0;
	    } CmdHdr;
	    struct
	    {
                ushort	NumPackets;
                ushort	LoadBase;
                ushort	CodeSize;
            } PcBootSequence;
	} S1;
	struct
	{
	    ushort PcSequence;
	    uchar PcBootData[RTA_BOOT_DATA_SIZE];
	} S2;
	struct
	{
	    ushort  __crud__;
	    uchar  PcUniqNum[4];	        /* this is really a uint. */
	    uchar  PcModuleTypes;  	/* what modules are fitted */
	} S3;
	struct
	{
	    ushort  __cmd_hdr__;
	    uchar   __undefined__;
	    uchar   PcModemStatus;
	    uchar   PcPortStatus;
	    uchar   PcSubCommand;
	    ushort  PcSubAddr;
	    uchar   PcSubData[64];
	} S4;
	struct
	{
	    ushort  __cmd_hdr__;
	    uchar   PcCommandText[1];
	    uchar   __crud__[20];
	    uchar   PcIDNum2;		/* Tacked on end */
	} S5;
	struct
	{
	    ushort  __cmd_hdr__;
	    struct Top Topology[LINKS_PER_UNIT];
	} S6;
    } U1;
};

#define Command		U1.S1.CmdHdr.PcCommand
#define PhbNum		U1.S1.CmdHdr.U0.PcPhbNum
#define IDNum		U1.S1.CmdHdr.U0.PcIDNum
#define IDNum2		U1.S5.PcIDNum2
#define LinkNum		U1.S1.CmdHdr.U0.PcLinkNum
#define Sequence	U1.S2.PcSequence
#define BootData	U1.S2.PcBootData
#define BootSequence	U1.S1.PcBootSequence
#define UniqNum		U1.S3.PcUniqNum
#define ModemStatus	U1.S4.PcModemStatus
#define PortStatus	U1.S4.PcPortStatus
#define SubCommand	U1.S4.PcSubCommand
#define SubAddr		U1.S4.PcSubAddr
#define SubData		U1.S4.PcSubData
#define CommandText	U1.S5.PcCommandText
#define RouteTopology	U1.S6.Topology
#define ModuleTypes	U1.S3.PcModuleTypes

#endif
