summaryrefslogblamecommitdiffstats
path: root/c/src/lib/libbsp/i386/i386ex/network/uti596.h
blob: 5448362a22b232310de5c3f7e0509a9c6f17ad76 (plain) (tree)
1
2
3
4
5
6
7
8





                                                                             

        











































                                                                            


                                                                                      





























                                                                         



                                


























                                                                           
                               


                               















































































                                              


                      
 



                      













































                                         

                                                   















                                                                                       
                                       

















                                          
                                                                                           

      

/* uti596.h: Contains the defines and structures used by the uti596 driver */

/*
 * EII: March 11: Created v. 0.0
 *      Jan 12/98 Added STAT bits, s11-=s5 and max_colls.
 *
 *  $Id$
 */

#ifndef UTI596_H
#define UTI596_H
#include <rtems/error.h>
#include <rtems/rtems_bsdnet.h>

#include <sys/param.h>
#include <sys/mbuf.h>
#include <sys/socket.h>
#include <sys/sockio.h>

#include <net/if.h>

#include <netinet/in.h>
#include <netinet/if_ether.h>

/* Ethernet statistics */

struct enet_statistics{
  int	rx_packets;			/* total packets received	*/
  int	tx_packets;			/* total packets transmitted	*/
  int	rx_errors;			/* bad packets received		*/
  int	tx_errors;			/* packet transmit problems	*/
  int	rx_dropped;			/* no space in buffers          */
  int	tx_dropped;			/*                              */
  int   tx_retries_exceeded;              /* excessive retries            */
  int	multicast;			/* multicast packets received	*/
  int	collisions;

  /* detailed rx_errors: */
  int	rx_length_errors;
  int	rx_over_errors;			/* receiver ring buff overflow	*/
  int	rx_crc_errors;			/* recved pkt with crc error	*/
  int	rx_frame_errors;		/* recv'd frame alignment error */
  int	rx_fifo_errors;			/* recv'r fifo overrun		*/
  int	rx_missed_errors;		/* receiver missed packet	*/

  /* detailed tx_errors */
  int	tx_aborted_errors;
  int	tx_carrier_errors;
  int	tx_fifo_errors;
  int	tx_heartbeat_errors;
  int	tx_window_errors;

  /* NIC reset errors */
  int   nic_reset_count;      /* The number of times uti596reset() has been called. */
};



enum commands {
  CmdNOp           = 0, 
  CmdSASetup       = 1, 
  CmdConfigure     = 2, 
  CmdMulticastList = 3,
  CmdTx            = 4, 
  CmdTDR           = 5, 
  CmdDump          = 6, 
  CmdDiagnose      = 7
};


#define UTI596_MUTEX   1


#define CMD_EOL		0x8000	/* The last command of the list, stop. */
#define CMD_SUSP	0x4000	/* Suspend after doing cmd. */
#define CMD_INTR	0x2000	/* Interrupt after doing cmd. */

#define CMD_FLEX	0x0008	/* Enable flexible memory model */

#define SCB_STAT_CX     0x8000  /* Cmd completes with 'I' bit set */
#define SCB_STAT_FR     0x4000  /* Frame Received                 */
#define SCB_STAT_CNA    0x2000  /* Cmd unit Not Active            */
#define SCB_STAT_RNR    0x1000  /* Receiver Not Ready             */

#define SCB_CUS_SUSPENDED 0x0100
#define SCB_CUS_ACTIVE    0x0200


#define STAT_C		0x8000	/* Set to 1 after execution              */
#define STAT_B		0x4000	/* 1 : Cmd being executed, 0 : Cmd done. */
#define STAT_OK		0x2000	/* 1: Command executed ok 0 : Error      */
#define STAT_A          0x1000  /* command has been aborted              */

#define STAT_S11        0x0800
#define STAT_S10        0x0400
#define STAT_S9         0x0200
#define STAT_S8         0x0100
#define STAT_S7         0x0080
#define STAT_S6         0x0040
#define STAT_S5         0x0020
#define STAT_MAX_COLLS  0x000F


#define RBD_STAT_P      0x4000  /* prefetch */
#define RBD_STAT_F      0x4000  /* used */

#define	 CUC_START	0x0100
#define	 CUC_RESUME	0x0200
#define	 CUC_SUSPEND    0x0300
#define	 CUC_ABORT	0x0400
#define	 RX_START	0x0010
#define	 RX_RESUME	0x0020
#define	 RX_SUSPEND	0x0030
#define	 RX_ABORT	0x0040

#define  RU_SUSPENDED    0x0010
#define  RU_NO_RESOURCES 0x0020
#define  RU_READY        0x0040


#define IO_ADDR         0x360
#define PORT_ADDR       IO_ADDR
#define CHAN_ATTN       PORT_ADDR + 4
#define NIC_ADDR        PORT_ADDR + 8

struct i596_cmd {
    volatile unsigned short status;
    volatile unsigned short command;
    struct i596_cmd *next;
};

#define I596_NULL ( ( void * ) 0xffffffff)
#define UTI_596_END_OF_FRAME		0x8000
#define SIZE_MASK	0x3fff

/*
 * Transmit buffer Descriptor
 */

struct i596_tbd {
    unsigned short size;
    unsigned short pad;
    struct i596_tbd *next;
    char *data; 
};

/*
 * Receive buffer Descriptor
 */

struct i596_rbd {
    unsigned short count;
    unsigned short offset;
    struct i596_rbd *next;
    char           *data; 
    unsigned short size;
    unsigned short pad;
};

/*
 * Transmit Command Structure
 */
struct tx_cmd {
    struct i596_cmd cmd;
    struct i596_tbd *pTbd;
    unsigned short size;
    unsigned short pad;
} ;


/*
 * Receive Frame Descriptor
 */
struct i596_rfd {
    volatile unsigned short stat;
    volatile unsigned short cmd;
    struct i596_rfd *next;
    struct i596_rbd *pRbd; 
    unsigned short count;
    unsigned short size;
    char data [1532 ];    
} ;


struct i596_dump {
  struct i596_cmd cmd;
  char * pData;
};

struct i596_set_add {
  struct i596_cmd cmd;
  char   data[8];
};

struct i596_configure {
  struct i596_cmd cmd;
  char   data[16];
};

struct i596_nop {
  struct i596_cmd cmd;
};

struct i596_tdr {
  struct i596_cmd cmd;
  unsigned int data;
};

#define RX_RING_SIZE 8

/*
 * System Control Block
 */
struct i596_scb {
    volatile unsigned short status;
    volatile unsigned short command;
    struct i596_cmd *pCmd;
    struct i596_rfd *pRfd;
    volatile unsigned long crc_err;
    volatile unsigned long align_err;
    volatile unsigned long resource_err;
    volatile unsigned long over_err;
    volatile unsigned long rcvdt_err;
    volatile unsigned long short_err;
    volatile unsigned short t_on;
    volatile unsigned short t_off;
};


/* 
 * Intermediate System Control Block
 */
struct i596_iscp {
    volatile unsigned long stat;
    struct i596_scb *scb;
} ;
/*
 * System Control Parameters
 */
struct i596_scp {
    unsigned long sysbus;
    unsigned long pad;
    struct i596_iscp *iscp;
} ;

struct uti596_softc {
  struct arpcom                 arpcom;
  rtems_irq_connect_data	irqInfo;
  struct i596_scp              *pScp;
  struct i596_iscp              iscp;
  struct i596_scb               scb;
  struct i596_set_add           set_add;
  struct i596_configure         set_conf;
  struct i596_tdr               tdr;
  struct i596_nop               nop;               
  unsigned long                 stat;
  struct tx_cmd                *pTxCmd;
  struct i596_tbd              *pTbd;

  int                   ioAddr;

  struct i596_rfd     *pBeginRFA;
  struct i596_rfd     *pEndRFA;
  struct i596_rfd     *pLastUnkRFD;
  struct i596_rbd     *pLastUnkRBD;
  struct i596_rfd     *pEndSavedQueue;
  struct i596_cmd     *pCmdHead;
  struct i596_cmd     *pCmdTail;  /* unneeded, as chaining not used, but implemented */

  rtems_id		rxDaemonTid;
  rtems_id		txDaemonTid;
  rtems_id		resetDaemonTid;

  struct enet_statistics stats;
  int                  started;
  unsigned long        rxInterrupts;
  unsigned long        txInterrupts;
  volatile int         cmdOk;
  int                  resetDone;
  unsigned long	       txRawWait;
  struct i596_rfd     *pInboundFrameQueue;
  short int            rxBdCount;
  short int            txBdCount;
  short int            countRFD;
  short int            savedCount;
  struct i596_rfd     *pSavedRfdQueue;
  rtems_name           semaphore_name;
  rtems_id             semaphore_id;
  char                 zeroes[64];
  unsigned long        rawsndcnt;
  int                  nic_reset; /* flag is for requesting that ISR issue a reset quest */
} ;
#endif