text: /*
  ** -----------------------------------------------------------------------------
  **
  **  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 {
  	u16 NumPackets;
  	u16 LoadBase;
  	u16 CodeSize;
  };
  
  #define	BOOT_SEQUENCE_LEN	8
  
  struct SamTop {
  	u8 Unit;
  	u8 Link;
  };
  
  struct CmdHdr {
  	u8 PcCommand;
  	union {
  		u8 PcPhbNum;
  		u8 PcLinkNum;
  		u8 PcIDNum;
  	} U0;
  };
  
  
  struct PktCmd {
  	union {
  		struct {
  			struct CmdHdr CmdHdr;
  			struct BootSequence PcBootSequence;
  		} S1;
  		struct {
  			u16 PcSequence;
  			u8 PcBootData[RTA_BOOT_DATA_SIZE];
  		} S2;
  		struct {
  			u16 __crud__;
  			u8 PcUniqNum[4];	/* this is really a uint. */
  			u8 PcModuleTypes;	/* what modules are fitted */
  		} S3;
  		struct {
  			struct CmdHdr CmdHdr;
  			u8 __undefined__;
  			u8 PcModemStatus;
  			u8 PcPortStatus;
  			u8 PcSubCommand;	/* commands like mem or register dump */
  			u16 PcSubAddr;	/* Address for command */
  			u8 PcSubData[64];	/* Date area for command */
  		} S4;
  		struct {
  			struct CmdHdr CmdHdr;
  			u8 PcCommandText[1];
  			u8 __crud__[20];
  			u8 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 {
  				u8 PcCommand;
  				union {
  					u8 PcPhbNum;
  					u8 PcLinkNum;
  					u8 PcIDNum;
  				} U0;
  			} CmdHdr;
  			struct {
  				u16 NumPackets;
  				u16 LoadBase;
  				u16 CodeSize;
  			} PcBootSequence;
  		} S1;
  		struct {
  			u16 PcSequence;
  			u8 PcBootData[RTA_BOOT_DATA_SIZE];
  		} S2;
  		struct {
  			u16 __crud__;
  			u8 PcUniqNum[4];	/* this is really a uint. */
  			u8 PcModuleTypes;	/* what modules are fitted */
  		} S3;
  		struct {
  			u16 __cmd_hdr__;
  			u8 __undefined__;
  			u8 PcModemStatus;
  			u8 PcPortStatus;
  			u8 PcSubCommand;
  			u16 PcSubAddr;
  			u8 PcSubData[64];
  		} S4;
  		struct {
  			u16 __cmd_hdr__;
  			u8 PcCommandText[1];
  			u8 __crud__[20];
  			u8 PcIDNum2;	/* Tacked on end */
  		} S5;
  		struct {
  			u16 __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
  