/*
 ******************************  trlld.h  ***********************************
 *
 *                          Copyright (c) 1997
 *                          OLICOM A/S
 *                          Denmark
 *
 *                          All Rights Reserved
 *
 *      This source file is subject to the terms and conditions of the
 *      OLICOM Software License Agreement which restricts the manner
 *      in which it may be used.
 *
 *---------------------------------------------------------------------------
 *
 * Description: PowerMACH Works header file
 *
 *---------------------------------------------------------------------------
 * $Log: trlld.h,v $
 *    Rev 1.9   25 Jan 1999 09:56:28   EGS
 * Added 3150
 * 
 *    Rev 1.8   10 Dec 1998 12:24:52   JHM
 * version 1.2.0,prominfo structure with shorts.
 * 
 *    Rev 1.7   25 Nov 1998 16:18:48   JHM
 * Bullseye mac, 100MBPS, mactype in config structure,
 * 3540 adapter, TRlldTransmitFree, TRlldReceiveFree,
 * TRlldAdapterName
 * 
 *    Rev 1.6   23 Oct 1998 16:00:36   JHM
 * hawkeye adapter types
 * 
 *    Rev 1.5   11 Aug 1998 12:22:06   JHM
 * split hawkeye types into PCI4,5,6
 * 
 *    Rev 1.4   10 Jul 1998 14:39:22   JHM
 * OC_3140,OC_3250
 * 
 *    Rev 1.3   18 Jun 1998 11:32:20   JHM
 * AddMemory,OC_3250
 * 
 *    Rev 1.2   18 Apr 1998 15:11:20   JHM
 * 
 *    Rev 1.1   09 Dec 1997 18:17:52   JHM
 * rel111: TRlldDataPtr_t
 * 
 *    Rev 1.0   24 Nov 1997 11:08:58   JHM
 * Initial revision.
   
      Rev 1.5   18 Jun 1997 11:31:36   JHM
   Checks for version
   
      Rev 1.4   13 Jun 1997 13:47:34   JHM
   
      Rev 1.3   13 Jun 1997 13:27:56   JHM
   DTR support, version change
   
      Rev 1.2   12 Jun 1997 11:43:20   JHM
   TRLLD_INTERRUPT_TIMEOUT defined
   
      Rev 1.1   11 Apr 1997 15:24:18   JHM
   replaced tabs with spaces
   
      Rev 1.0   11 Apr 1997 14:43:04   JHM
   Initial revision.
 *
 ****************************************************************************
*/

#ifndef TRLLD_H
#define TRLLD_H

/* Data buffer pointers are always 32 bits.
   For 16:16 it is segment:offset while it for 32:32 is a linear address. */

#ifdef TRlldSmall
#define TRlldDataPtr_t      unsigned char far *
#define TRlldWordDataPtr_t  unsigned short far *
#define TRlldDWordDataPtr_t	unsigned long far *
#else
#define TRlldDataPtr_t      unsigned char *
#define TRlldWordDataPtr_t  unsigned short *
#define TRlldDWordDataPtr_t	unsigned long *
#endif

#ifdef __WATCOMC__
#define CDECL    _cdecl
#else
#define CDECL
#endif

/*****************************************************************************/
/*                                                                           */
/* Firmware                                                                  */
/*                                                                           */
/*****************************************************************************/

extern unsigned char TRlldMacCode[];       /* 3115,17,18,29,33,36,37 */
extern unsigned char TRlldHawkeyeMac[];    /* 3139,3140,3141,3250    */
extern unsigned char TRlldBullseyeMac[];   /* 3150,3540              */

/*****************************************************************************/
/*                                                                           */
/* Maximal numbers of concurrent receive and transmit slots                  */
/*                                                                           */
/*****************************************************************************/

#define TRLLD_MAX_RECEIVE        32
#define TRLLD_MAX_TRANSMIT       32

/*****************************************************************************/
/*                                                                           */
/* Maximal frame sizes                                                       */
/*                                                                           */
/*****************************************************************************/

#define TRLLD_MAXFRAME_100MBPS 18000
#define TRLLD_MAXFRAME_16MBPS  18000
#define TRLLD_MAXFRAME_4MBPS    4500

/*****************************************************************************/
/*                                                                           */
/* TRlldStatus contains the adapter status used in a DriverStatus call-back. */
/*                                                                           */
/*****************************************************************************/

struct OnWireInformation {
	unsigned short RingStatus;
	unsigned short Speed;
	unsigned short AccessProtocol;
	unsigned short Reserved;
};

typedef struct TRlldStatus {
    unsigned short Type;
    unsigned char Closed;
    unsigned char AccessProtocol;
    unsigned short MaxFrameSize;
    unsigned short Reserved;
    union {
        unsigned short OnWireRingStatus;	/* for compability */
        unsigned short SelftestStatus;
        unsigned short InitStatus;
        unsigned short RingStatus;
        unsigned short AdapterCheck[4];
        unsigned short InternalError[4];
        unsigned short PromRemovedCause;
        unsigned short AdapterTimeout;
        struct OnWireInformation OnWireInformation;
    } Specification;
} TRlldStatus_t;

/* values of TRlldStatus.Type */

#define TRLLD_STS_ON_WIRE                0
#define TRLLD_STS_SELFTEST_STATUS        1
#define TRLLD_STS_INIT_STATUS            2
#define TRLLD_STS_RING_STATUS            3
#define TRLLD_STS_ADAPTER_CHECK          4
#define TRLLD_STS_PROMISCUOUS_STOPPED    5
#define TRLLD_STS_LLD_ERROR              6
#define TRLLD_STS_ADAPTER_TIMEOUT        7

/* values of TRlldStatus.Closed */

#define TRLLD_STS_STATUS_OK              0
#define TRLLD_STS_STATUS_CLOSED          1

/* values of TRlldStatus.AccessProtocol */

#define TRLLD_ACCESS_UNKNOWN             0
#define TRLLD_ACCESS_TKP                 1
#define TRLLD_ACCESS_TXI                 2

/* values of TRlldStatus.SelftestStatus */

#define TRLLD_ST_OK            0
#define TRLLD_ST_ERROR    0x0100       /* actual errors are 010x, where x is */
                                       /* 0: Initial Test Error              */
                                       /* 1: Adapter Software Checksum Error */
                                       /* 2: Adapter RAM Error               */
                                       /* 4: Instruction Test Error          */
                                       /* 5: Protocol Handler/RI Hw Error    */
                                       /* 6: System Interface Register Error */

#define TRLLD_ST_TIMEOUT  0x0200       /* The adapter did not complete */
                                       /* selftest after download      */

/* values of TRlldStatus.Specification.InitStatus */

/* the most likely cause of an init error (whatever the code) is a wrong */
/* physical or virtual address of the adapter block in TRlldAdapterInit  */

#define TRLLD_INIT_ERROR       0x100   /* actual errors are 010x, where x is */
                                       /* 1: Invalid init block (LLD error)  */
                                       /* 2: Invalid options (LLD error)     */
                                       /* 3: Invalid rcv burst (LLD error)   */
                                       /* 4: Invalid xmt burst (LLD error)   */
                                       /* 5: Invalid DMA threshold (LLDerror)*/
                                       /* 6: Invalid scb addr                */
                                       /* 7: Invalid ssb addr                */
                                       /* 8: DIO parity error (HW error)     */
                                       /* 9: DMA timeout (May be interrupt
                                             failing if PIO mode or PCI2)    */
                                       /* A: DMA parity error (HW error)     */
                                       /* B: DMA bus error (HW error)        */
                                       /* C: DMA data error                  */
                                       /* D: Adapter check                   */

#define TRLLD_INIT_TIMEOUT     0x200   /* adapter init did not complete      */
#define TRLLD_INIT_DMA_ERROR   0x300   /* adapter cannot access sys memory   */
#define TRLLD_INIT_INTR_ERROR  0x400   /* adapter cannot interrupt           */
#define TRLLD_OPEN_TIMEOUT     0x500   /* adapter open did not complete      */
                                       /* within 30 seconds                  */

#define TRLLD_OPEN_ERROR       0x600   /* actual errors are 06xx, where the  */
                                       /* bits in x mean:                    */
                                       /* 01: Invalid open options (LLDerror)*/
                                       /* 04: TxBuffer count error (LLDerror)*/
                                       /* 10: Buffer size error (LLD error)  */
                                       /* 20: List size error (LLD error)    */
                                       /* 40: Node address error             */

#define TRLLD_OPEN_REPEAT      0x700   /* actual errors are 07xy, where      */
                                       /* x is the open phase:               */
                                       /* 1: Lobe media test                 */
                                       /* 2: Physical Insertion              */
                                       /* 3: Address verification            */
                                       /* 4: Participation in ring poll      */
                                       /* 5: Request Initialization          */
                                       /* 9: Request registration (TXI)      */
                                       /* A: Lobe Media Test (TXI)           */
                                       /* B: Address verification (TXI)      */
                                       /* y is the type of error:            */
                                       /* 1: Function failure (No Cable ?)   */
                                       /* 2: Signal loss                     */
                                       /* 5: Timeout                         */
                                       /* 6: Ring failure (TKP)              */
                                       /* 6: Protocol error (TXI)            */
                                       /* 7: Ring beaconing                  */
                                       /* 8: Duplicate Node Address (TKP)    */
                                       /* 8: Insert Denied (TXI)             */
                                       /* 9: Request Initialization (TKP)    */
                                       /* 9: Heart beat failure (TXI)        */
                                       /* A: Remove received                 */
                                       /* B: C-port address changed (TXI)    */
                                       /* C: Wire Fault (TKP)                */
                                       /* D: Auto Speed, 1. on ring (TKP)    */
                                       /* E: Speed sense failed              */

/* When opening with FORCE_TXI and only classic token ring attachment is     */
/* possible, the error is Request Registration/Timeout or 0x795              */

#define TRLLD_OPEN_1ST_ON_RING	0x800  /* Speed sense is active, but no other*/
                                       /* station is present to set the speed*/


/* values of TRlldStatus.Specification.RingStatus */

#define TRLLD_RS_SIGNAL_LOSS        0x8000
#define TRLLD_RS_HARD_ERROR         0x4000
#define TRLLD_RS_SOFT_ERROR         0x2000
#define TRLLD_RS_TRANSMIT_BEACON    0x1000
#define TRLLD_RS_LOBE_WIRE_FAULT    0x0800
#define TRLLD_RS_AUTO_REMOVAL_ERROR 0x0400
#define TRLLD_RS_REMOVE_RECEIVED    0x0100
#define TRLLD_RS_COUNTER_OVERFLOW   0x0080
#define TRLLD_RS_SINGLE_STATION     0x0040
#define TRLLD_RS_RING_RECOVERY      0x0020

/* values of TRlldStatus.Specification.AdapterCheck */
/* MISSING */

/* values of TRlldStatus.Specification.PromRemovedCause */

#define TRLLD_PROM_REMOVE_RECEIVED    1
#define TRLLD_PROM_POLL_FAILURE       2
#define TRLLD_PROM_BUFFER_SIZE        3

/* values of TRlldStatus.Specification.InternalError */

#define TRLLD_INTERNAL_PIO   1        /* A PIO transfer to or from adapter  */
                                      /* did not complete                   */
#define TRLLD_INTERNAL_TX    2        /* Trouble with clean up of tx frames */
#define TRLLD_INTERNAL_RX    3        /* Trouble with clean up of receive   */
                                      /* fragments                          */
#define TRLLD_INTERNAL_CMD   4        /* error response from adapter        */
#define TRLLD_INTERNAL_STATE 5        /* event happened in unexpected state */

/* values of TRlldStatus.Specification.AdapterTimeout */

#define TRLLD_COMMAND_TIMEOUT    1
#define TRLLD_TRANSMIT_TIMEOUT   2
#define TRLLD_INTERRUPT_TIMEOUT  3


/*****************************************************************************/
/*                                                                           */
/* TRlldStatistics contains the adapter statistics returned to Driver        */
/* in TRlldStatistics calls and DriverStatistics call-backs                  */
/*                                                                           */
/*****************************************************************************/

typedef struct TRlldStatistics {
    unsigned long LineErrors;
    unsigned long InternalErrors;       /* Not maintained by TMS based boards */
    unsigned long BurstErrors;
    unsigned long ARIFCIErrors;
    unsigned long AbortDelimiters;      /* Not maintained by TMS based boards */
    unsigned long LostFrames;
    unsigned long CongestionErrors;
    unsigned long FrameCopiedErrors;
    unsigned long FrequencyErrors;      /* Not maintained by TMS based boards */
    unsigned long TokenErrors;
    unsigned long DMABusErrors;         /* Not maintained by 3139 */
    unsigned long DMAParityErrors;      /* Not maintained by 3139 */
    unsigned long ReceiveLongFrame;     /* Not maintained by TMS based boards */
    unsigned long ReceiveCRCErrors;     /* Not maintained by TMS based boards */
    unsigned long ReceiveOverflow;      /* Not maintained by TMS based boards */
    unsigned long TransmitUnderrun;     /* Not maintained by TMS based boards */
	unsigned long UnderrunLock;			/* Not maintained by TMS based boards */
	unsigned long OverflowReset;
    unsigned char UpstreamNeighbour[6];
    unsigned short RingNumber;
    unsigned char BeaconingUpstreamNeighbour[6];
    unsigned short padding;
} TRlldStatistics_t;


/*****************************************************************************/
/*                                                                           */
/* TRlldDriver contains the Driver call-backs                                */
/*                                                                           */
/*****************************************************************************/

typedef struct TRlldDriver {
    unsigned long TRlldVersion;
#ifndef TRlldInlineIO
    void (CDECL * DriverOutByte)(unsigned short IOAddress,
                                 unsigned char Value);
    void (CDECL * DriverOutWord)(unsigned short IOAddress,
                                 unsigned short Value);
    void (CDECL * DriverOutDWord)(unsigned short IOAddress,
                                  unsigned long Value);
    void (CDECL * DriverRepOutByte)(unsigned short IOAddress,
                                    TRlldDataPtr_t DataPointer,
                                    int ByteCount);
    void (CDECL * DriverRepOutWord)(unsigned short IOAddress,
                                    TRlldWordDataPtr_t DataPointer,
                                    int WordCount);
    void (CDECL * DriverRepOutDWord)(unsigned short IOAddress,
                                     TRlldDWordDataPtr_t DataPointer,
                                     int DWordCount);
    unsigned char (CDECL * DriverInByte)(unsigned short IOAddress);
    unsigned short (CDECL * DriverInWord)(unsigned short IOAddress);
    unsigned long (CDECL * DriverInDWord)(unsigned short IOAddress);
    void (CDECL * DriverRepInByte)(unsigned short IOAddress,
                                   TRlldDataPtr_t DataPointer,
                                   int ByteCount);
    void (CDECL * DriverRepInWord)(unsigned short IOAddress,
                                   TRlldWordDataPtr_t DataPointer,
                                   int WordCount);
    void (CDECL * DriverRepInDWord)(unsigned short IOAddress,
                                    TRlldDWordDataPtr_t DataPointer,
                                    int DWordCount);
#endif
    void (CDECL * DriverSuspend)(unsigned short MicroSeconds);
    void (CDECL * DriverStatus)(void * DriverHandle,
                                TRlldStatus_t * Status);
    void (CDECL * DriverCloseCmpltd)(void * DriverHandle);
    void (CDECL * DriverStatistics)(void * DriverHandle,
                                    TRlldStatistics_t * Statistics);
    void (CDECL * DriverTxFrameCmpltd)(void * DriverHandle,
                                       void * FrameHandle,
                                       int TxStatus);
    void (CDECL * DriverRcvFrameCmpltd)(void * DriverHandle,
                                        int ByteCount,
                                        int FragmentCount,
                                        void * FragmentHandle,
                                        int RcvStatus);
} TRlldDriver_t;

/* Version and model control */

#define TRLLD_VERSION_INLINEIO    0x8000
#define TRLLD_VERSION_SMALL       0x4000
#ifdef TRlldInlineIO
#ifdef TRlldSmall
#define TRLLD_VERSION    0x4120
#else
#define TRLLD_VERSION    0x0120
#endif
#else
#ifdef TRlldSmall
#define TRLLD_VERSION    0xC120
#else
#define TRLLD_VERSION    0x8120
#endif
#endif


/*****************************************************************************/
/*                                                                           */
/* TRlldAdapterConfig contains the properties found for an adapter           */
/* used when finding and defining adapters to use                            */
/*                                                                           */
/*****************************************************************************/


struct pnp_id {
    unsigned short vendor;
    unsigned short device;
};

struct pci_id {
    unsigned short vendor;
    unsigned short device;
    unsigned char revision;
    unsigned char reserved_byte;
    unsigned short reserved_word;
};

struct pcmcia_id {
    /* unknown as yet */
    unsigned char x;
};

struct pci_slot {
    unsigned short bus_no;
    unsigned short device_no;
};

struct pcmcia_socket {
    /* unknown as yet */
    unsigned char x;
};

typedef struct TRlldAdapterConfig {
    unsigned char type;
    unsigned char bus;
    unsigned short magic;
    union {
        struct pnp_id pnp;
        unsigned long eisa;
        unsigned short mca;
        struct pci_id pci;
        struct pcmcia_id pcmcia;
    } id;
    union {
        unsigned short csn;
        unsigned short eisa;
        unsigned short mca;
        struct pci_slot pci;
        struct pcmcia_socket pcmcia;
    } slot;
    unsigned short iobase0;
    unsigned short iolength0;
    unsigned short iobase1;
    unsigned short iolength1;
    unsigned long memorybase;
    unsigned short memorylength;
    unsigned char mode;
    unsigned char xmode;
    unsigned char interruptlevel;
    unsigned char dmalevel;
    unsigned char macaddress[6];
    unsigned long prombase;
    unsigned char speed;
    unsigned char cachelinesize;
    unsigned short pcicommand;
	unsigned char mactype;
	unsigned char reserved[3];
} TRlldAdapterConfig_t;

/* values of TRlldAdapterConfig.Type */

#define TRLLD_ADAPTER_XT            0        /* not supported             */
#define TRLLD_ADAPTER_ISA1          1        /* OC-3115                   */
#define TRLLD_ADAPTER_ISA2          2        /* OC-3117                   */
#define TRLLD_ADAPTER_ISA3          3        /* OC-3118                   */
#define TRLLD_ADAPTER_MCA1          4        /* OC-3129 id A84            */
#define TRLLD_ADAPTER_MCA2          5        /* OC-3129 id A85            */
#define TRLLD_ADAPTER_MCA3          6        /* OC-3129 id A86            */
#define TRLLD_ADAPTER_EISA1         7        /* OC-3133 id 0109833D       */
#define TRLLD_ADAPTER_EISA2         8        /* OC-3133 id 0209833D       */
#define TRLLD_ADAPTER_EISA3         9        /* OC-3135 not supported     */
#define TRLLD_ADAPTER_PCI1         10        /* OC-3136 id 108d0001 rev 1 */
#define TRLLD_ADAPTER_PCI2         11        /* OC-3136 id 108d0001 rev 2 */
#define TRLLD_ADAPTER_PCI3         12        /* OC-3137 id 108d0001 rev 3 */
#define TRLLD_ADAPTER_PCI4         13        /* OC-3139 id 108d0004 rev 2 */
#define TRLLD_ADAPTER_PCI5         14        /* OC-3140 id 108d0004 rev 3 */
#define TRLLD_ADAPTER_PCI6         15        /* OC-3141 id 108d0007 rev 1 */
#define TRLLD_ADAPTER_PCI7         19        /* OC-3540 id 108d0008 rev 1 */
#define TRLLD_ADAPTER_PCI8         20        /* OC-3150 id 108d000a rev 1 */
#ifdef PCMCIA
#define TRLLD_ADAPTER_PCCARD1      16        /* OC-3220                   */
#define TRLLD_ADAPTER_PCCARD2      17        /* OC-3221,OC-3230,OC-3232   */
#endif
#define TRLLD_ADAPTER_PCCARD3      18        /* OC-3250 id 108d0005 rev 1 */

/* values of TRlldAdapterConfig.Bus */

#define TRLLD_BUS_ISA           1
#define TRLLD_BUS_EISA          2
#define TRLLD_BUS_MCA           3
#define TRLLD_BUS_PCI           4
#define TRLLD_BUS_PCMCIA        5

/* values of TRlldAdapterConfig.mode */

#define TRLLD_MODE_16M             0x01  /* needs data buffers below 16 M     */
#define TRLLD_MODE_PHYSICAL        0x02  /* needs valid physical addresses    */
#define TRLLD_MODE_FIXED_CFG       0x04  /* cannot be reconfigured            */
#define TRLLD_MODE_SHORT_SLOT      0x08  /* in short ISA slot, cannot use DMA */
#define TRLLD_MODE_CANNOT_DISABLE  0x10  /* can not disable interrupt         */
#define TRLLD_MODE_SHARE_INTERRUPT 0x20  /* may share interrupt               */
#define TRLLD_MODE_MEMORY          0x40  /* is configured with a memory window*/

/* values of TRlldAdapterConfig.dma */

#define TRLLD_DMA_PIO      4       /* other values signifies the DMA channel */
#define TRLLD_DMA_MASTER   0xff    /* to use                                 */

/* values of TRlldAdapterConfig.mactype */

                                   /* download with:   */
#define TRLLD_MAC_TMS       1      /* TRlldMACCode     */
#define TRLLD_MAC_HAWKEYE   2      /* TRlldHawkeyeMAC  */
#define TRLLD_MAC_BULLSEYE  3      /* TRlldBullseyeMAC */


typedef void * TRlldAdapter_t;
typedef void * TRlldAdapterType_t;

#ifndef MAX_FRAGMENTS
#define MAX_FRAGMENTS 32
#endif

typedef struct TRlldTransmit {
    unsigned short FragmentCount;
    unsigned short TRlldTransmitReserved;
    struct TRlldTransmitFragment {
        unsigned long PhysicalAddress;
        TRlldDataPtr_t VirtualAddress;
        unsigned short count;
        unsigned short TRlldTransmitFragmentReserved;
    } TransmitFragment[MAX_FRAGMENTS];
} TRlldTransmit_t;

int CDECL TRlldAdapterSize(void);

int CDECL TRlldInit(int TypeCount,
                    TRlldAdapterType_t * AdapterTypeTable);

extern TRlldAdapterType_t CDECL TRlld3115;    /* ISA adapters */
extern TRlldAdapterType_t CDECL TRlld3117;
extern TRlldAdapterType_t CDECL TRlld3118;
extern TRlldAdapterType_t CDECL TRlld3129;    /* MCA adapters */
extern TRlldAdapterType_t CDECL TRlld3133;    /* EISA adapters */
extern TRlldAdapterType_t CDECL TRlld3136;    /* PCI adapters */
extern TRlldAdapterType_t CDECL TRlld3137;
extern TRlldAdapterType_t CDECL TRlld3139;    /* Hawkeye adapters */
extern TRlldAdapterType_t CDECL TRlld3540;    /* Bullseye adapters */

#define T3115   &TRlld3115
#define T3117   &TRlld3117
#define T3118   &TRlld3118
#define T3129   &TRlld3129
#define T3133   &TRlld3133
#define T3136   &TRlld3136
#define T3137   &TRlld3137
#define T3139   &TRlld3139
#define T3540   &TRlld3540

/* Only for Boot Prom Page Zero code */

extern TRlldAdapterType_t CDECL TRlld3115Boot;    /* ISA adapters */
extern TRlldAdapterType_t CDECL TRlld3117Boot;
extern TRlldAdapterType_t CDECL TRlld3118Boot;
extern TRlldAdapterType_t CDECL TRlld3129Boot;    /* MCA adapters */
extern TRlldAdapterType_t CDECL TRlld3133Boot;    /* EISA adapters */
extern TRlldAdapterType_t CDECL TRlld3136Boot;    /* PCI adapters */
extern TRlldAdapterType_t CDECL TRlld3137Boot;
extern TRlldAdapterType_t CDECL TRlld3139Boot;    /* Hawkeye adapters */
extern TRlldAdapterType_t CDECL TRlld3150Boot;
extern TRlldAdapterType_t CDECL TRlld3250Boot;
extern TRlldAdapterType_t CDECL TRlld3540Boot;    /* Bullseye adapter */

#define B3115   &TRlld3115Boot
#define B3117   &TRlld3117Boot
#define B3118   &TRlld3118Boot
#define B3129   &TRlld3129Boot
#define B3133   &TRlld3133Boot
#define B3136   &TRlld3136Boot
#define B3137   &TRlld3137Boot
#define B3139   &TRlld3139Boot
#define B3150   &TRlld3150Boot
#define B3250   &TRlld3250Boot
#define B3540   &TRlld3540Boot

#define TRLLD_INIT_OK           0
#define TRLLD_INIT_UNKNOWN      5

int CDECL TRlldAdapterInit(TRlldDriver_t * DriverDefinition,
                           TRlldAdapter_t * TRlldAdapter,
                           unsigned long TRlldAdapterPhysical,
                           void * DriverHandle,
                           TRlldAdapterConfig_t * config);

#define TRLLD_INIT_OK           0
#define TRLLD_INIT_NOT_FOUND    1
#define TRLLD_INIT_UNSUPPORTED  2
#define TRLLD_INIT_PHYS16       3
#define TRLLD_INIT_VERSION      4

int CDECL TRlldSetSpeed(TRlldAdapter_t * adapter,
                        unsigned char speed);

#define TRLLD_SPEED_4MBPS      4
#define TRLLD_SPEED_16MBPS    16
#define TRLLD_SPEED_100MBPS  100

int CDECL TRlldSetInterrupt(TRlldAdapter_t * adapter,
                            unsigned char interruptlevel);

int CDECL TRlldSetDMA(TRlldAdapter_t * adapter,
                      unsigned char dma, unsigned char * mode);

#define TRLLD_CONFIG_OK       0
#define TRLLD_CONFIG_STATE    1
#define TRLLD_CONFIG_ILLEGAL  2
#define TRLLD_CONFIG_FAILED   3

int CDECL TRlldSetSpecial(TRlldAdapter_t * adapter,
                          unsigned short param1, unsigned short param2,
                          unsigned short param3, unsigned short param4);

int CDECL TRlldAddMemory(TRlldAdapter_t * adapter,
                         TRlldDataPtr_t virtual,
                         unsigned long physical,
                         long size);

int CDECL TRlldDisable(TRlldAdapter_t * adapter);

#define TRLLD_OK             0
#define TRLLD_NOT_SUPPORTED  1

void CDECL TRlldEnable(TRlldAdapter_t * adapter);

int CDECL TRlldInterruptPresent(TRlldAdapter_t * adapter);

#define TRLLD_NO_INTERRUPT  0
#define TRLLD_INTERRUPT     1

int CDECL TRlldInterruptService(TRlldAdapter_t * adapter);

int CDECL TRlldInterruptPreService(TRlldAdapter_t * adapter);

void CDECL TRlldInterruptPostService(TRlldAdapter_t * adapter);


int CDECL TRlldPoll(TRlldAdapter_t * adapter);

int CDECL TRlldDownload(TRlldAdapter_t * adapter,
                        char * DownLoadCode);

#define TRLLD_DOWNLOAD_OK     0
#define TRLLD_DOWNLOAD_ERROR  1
#define TRLLD_STATE           2

typedef int (CDECL * GetCode_t)(void * handle, unsigned char * maccodebyte);

int CDECL TRlldStreamDownload(TRlldAdapter_t * adapter,
                              GetCode_t procedure, void * handle);

int CDECL TRlldOpen(TRlldAdapter_t * adapter,
                    unsigned char * MACAddress,
                    unsigned long GroupAddress,
                    unsigned long FunctionalAddress,
                    unsigned short MaxFrameSize,
                    unsigned short OpenModes);

#define TRLLD_OPEN_OK             0
#define TRLLD_OPEN_STATE          1
#define TRLLD_OPEN_ADDRESS_ERROR  2
#define TRLLD_OPEN_MODE_ERROR     3
#define TRLLD_OPEN_MEMORY         4

#define TRLLD_MODE_TX_STATUS      0x01
#define TRLLD_MODE_RX_SINGLE      0x02
#define TRLLD_MODE_FORCE_TKP      0x04
#define TRLLD_MODE_FORCE_TXI      0x08
#define TRLLD_MODE_TX_CRC         0x10

void CDECL TRlldClose(TRlldAdapter_t * adapter, int immediate);

void CDECL TRlldSetGroupAddress(TRlldAdapter_t * adapter,
                                unsigned long GroupAddress);

void CDECL TRlldSetFunctionalAddress(TRlldAdapter_t * adapter,
                                     unsigned long FunctionalAddress);

void CDECL TRlldSetPromiscuousMode(TRlldAdapter_t * adapter,
                                   unsigned char mode);

/* mode bits */

#define TRLLD_PROM_LLC          1
#define TRLLD_PROM_MAC          2
#define TRLLD_PROM_ERRORFRAMES  4

int CDECL TRlldGetStatistics(TRlldAdapter_t * adapter,
                             TRlldStatistics_t * statistics,
                             int immediate);

#define TRLLD_IMMEDIATE_STATISTICS  1

#define TRLLD_STATISTICS_RETRIEVED  0
#define TRLLD_STATISTICS_PENDING    1

int CDECL TRlldTransmitFrame(TRlldAdapter_t * adapter,
                             TRlldTransmit_t * TransmitFrame,
                             void * FrameHandle);

#define TRLLD_TRANSMIT_OK        0
#define TRLLD_TRANSMIT_NOT_OPEN  1
#define TRLLD_TRANSMIT_TOO_MANY  2
#define TRLLD_TRANSMIT_MAX16     3
#define TRLLD_TRANSMIT_SIZE      4
#define TRLLD_TRANSMIT_EMPTY     5

/* completion flags */

#define TRLLD_TX_OK              0
#define TRLLD_TX_NOT_PROCESSED   1
#define TRLLD_TX_NOT_RECOGNIZED  2
#define TRLLD_TX_NOT_COPIED      3

/* number of free transmit fragments */

int CDECL TRlldTransmitFree(TRlldAdapter_t * adapter);

int CDECL TRlldReceiveFragment(TRlldAdapter_t * adapter,
                               TRlldDataPtr_t FragmentStart,
                               unsigned long FragmentPhysical,
                               int count,
                               void * FragmentHandle);

#define TRLLD_RECEIVE_OK        0
#define TRLLD_RECEIVE_NOT_OPEN  1
#define TRLLD_RECEIVE_TOO_MANY  2
#define TRLLD_RECEIVE_SIZE      3
#define TRLLD_RECEIVE_MAX16     4

/* completion flags */

#define TRLLD_RCV_OK       0
#define TRLLD_RCV_NO_DATA  1
#define TRLLD_RCV_ERROR    2    /* Only when TRLLD_PROM_ERRORFRAMES */
#define TRLLD_RCV_LONG     3

/* number of free receive fragments */

int CDECL TRlldReceiveFree(TRlldAdapter_t * adapter);

int CDECL TRlldFind(TRlldDriver_t * driver,
                    TRlldAdapterConfig_t * config_table,
                    unsigned long type_mask,
                    int max);

/* type mask bits */

#define OC_3115            0x0001
#define OC_3117            0x0002
#define OC_3118            0x0004
#define OC_3129            0x0008
#define OC_3133            0x0010
#define OC_3136            0x0040
#define OC_3137            0x0080
#define OC_3139            0x0100
#define OC_3140            0x0200
#define OC_3141            0x0400
#define OC_3540            0x0800
#define OC_3150            0x1000

#ifdef PCMCIA
#define OC_3220            0x0800
#define OC_3221            0x1000
#define OC_3230            0x2000
#define OC_3232            0x4000
#endif

#define OC_3250            0x8000

int CDECL TRlldIOAddressConfig(TRlldDriver_t * driver,
                               TRlldAdapterConfig_t * config,
                               unsigned short address);


#define TRLLD_FIND_OK        1
#define TRLLD_FIND_ERROR     0
#define TRLLD_FIND_VERSION  -1

int CDECL TRlldEISASlotConfig(TRlldDriver_t * driver,
                              TRlldAdapterConfig_t * config,
                              int slot);

int CDECL TRlldMCASlotConfig(TRlldDriver_t * driver,
                             TRlldAdapterConfig_t * config,
                             int slot);

int CDECL TRlldPCIConfig(TRlldDriver_t * driver,
                         TRlldAdapterConfig_t * config,
                         char * PCIConfigurationSpace);

#define TRLLD_PCICONFIG_OK           0
#define TRLLD_PCICONFIG_FAIL         1
#define TRLLD_PCICONFIG_SET_COMMAND  2
#define TRLLD_PCICONFIG_VERSION      3


int CDECL TRlldFindPCI(TRlldDriver_t * driver,
                       TRlldAdapterConfig_t * config_table,
                       unsigned long type_mask,
                       int max);

#ifdef PCMCIA
typedef void * PCCardHandle_t;

typedef int (CDECL * GetTupleData_t)(PCCardHandle_t handle,
                                     unsigned short TupleIdent,
                                     char * TupleData,
                                     int length);

int CDECL TRlldPCCardConfig(TRlldDriver_t * driver,
                            TRlldAdapterConfig_t * config,
                            unsigned short address,
                            int irq,
                            GetTupleData_t GetTuple,
                            PCCardHandle_t handle);

#define TRLLD_PCCARD_CONFIG_OK    0
#define TRLLD_PCCARD_CONFIG_FAIL  1
#endif

/* Boot Prom Support */

typedef struct TRlldPromInfo {
	unsigned short PromIdent;
	short PromPages;
	short PromPageSize;
} TRlldPromInfo_t;

int CDECL TRlldMapBootProm(TRlldAdapter_t * adapter,
                           TRlldDataPtr_t prompointer);

#define TRLLD_PROM_OK           0
#define TRLLD_PROM_FAILED       3

int CDECL TRlldGetPromInfo(TRlldAdapter_t * adapter, TRlldPromInfo_t * info);

#define TRLLD_PROM_OK           0
#define TRLLD_PROM_NOT_MOUNTED  1
#define TRLLD_PROM_NOT_MAPPED   2

void CDECL TRlldSetPromPage(TRlldAdapter_t * adapter, int page);

int CDECL TRlldSetMemoryUse(TRlldAdapter_t * adapter, int use);

#define TRLLD_PROM_TO_MEMORY       0
#define TRLLD_REGISTERS_TO_MEMORY  1

#define TRLLD_MEMORY_USE_OK         0
#define TRLLD_MEMORY_USE_NO_MEMORY  1
#define TRLLD_MEMORY_USE_STATE      2
#define TRLLD_MEMORY_USE_ILLEGAL    3

int CDECL TRlldPromErase(TRlldAdapter_t * adapter,
                         void (CDECL * delay)(int milliseconds));

#define TRLLD_PROM_OK           0
#define TRLLD_PROM_NOT_MOUNTED  1
#define TRLLD_PROM_NOT_MAPPED   2
#define TRLLD_PROM_FAILED       3

int CDECL TRlldPromWrite(TRlldAdapter_t * adapter, char * data,
                         int offset, int count);

#define TRLLD_PROM_OK           0
#define TRLLD_PROM_NOT_MOUNTED  1
#define TRLLD_PROM_NOT_MAPPED   2
#define TRLLD_PROM_FAILED       3
#define TRLLD_PROM_ILLEGAL      4

void CDECL TRlldEmergency(TRlldAdapter_t * adapter);

/* Convert from TRlldAdapterConfig.type to name string */
char * CDECL TRlldAdapterName(int type);
#endif
