/*
** *************************************************************************
**
**
**     R C L A N M T L . H             $Revision: 6 $
**
**
**  RedCreek I2O LAN Message Transport Layer header file.
**
**  ---------------------------------------------------------------------
**  ---     Copyright (c) 1997-1999, RedCreek Communications Inc.     ---
**  ---                   All rights reserved.                        ---
**  ---------------------------------------------------------------------
**
**  File Description:
**
**  Header file for host I2O (Intelligent I/O) LAN message transport layer 
**  API and data types.
**
**  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.
**
** *************************************************************************
*/

#ifndef RCLANMTL_H
#define RCLANMTL_H

/* Linux specific includes */
#define kprintf printk
#ifdef RC_LINUX_MODULE     /* linux modules need non-library version of string functions */
#include <linux/string.h>
#else
#include <string.h>
#endif

/* PCI/45 Configuration space values */
#define RC_PCI45_VENDOR_ID  0x4916
#define RC_PCI45_DEVICE_ID  0x1960


 /* RedCreek API function return values */
#define RC_RTN_NO_ERROR             0
#define RC_RTN_I2O_NOT_INIT         1
#define RC_RTN_FREE_Q_EMPTY         2
#define RC_RTN_TCB_ERROR            3
#define RC_RTN_TRANSACTION_ERROR    4
#define RC_RTN_ADAPTER_ALREADY_INIT 5
#define RC_RTN_MALLOC_ERROR         6
#define RC_RTN_ADPTR_NOT_REGISTERED 7
#define RC_RTN_MSG_REPLY_TIMEOUT    8
#define RC_RTN_NO_I2O_STATUS        9
#define RC_RTN_NO_FIRM_VER         10
#define RC_RTN_NO_LINK_SPEED       11

/* Driver capability flags */
#define WARM_REBOOT_CAPABLE      0x01

 /* scalar data types */
typedef unsigned char   U8;
typedef unsigned char*  PU8;
typedef unsigned short  U16;
typedef unsigned short* PU16;
typedef unsigned long   U32;
typedef unsigned long*  PU32;
typedef unsigned long   BF;
typedef int             RC_RETURN;


 /* 
 ** type PFNWAITCALLBACK
 **
 ** pointer to void function - type used for WaitCallback in some functions 
 */
typedef void (*PFNWAITCALLBACK)(void);  /* void argument avoids compiler complaint */

 /*
 ** type PFNTXCALLBACK 
 **
 ** Pointer to user's transmit callback function.  This user function is
 ** called from RCProcI2OMsgQ() when packet have been transmitted from buffers
 ** given in the RCI2OSendPacket() function.  BufferContext is a pointer to
 ** an array of 32 bit context values.  These are the values the user assigned
 ** and passed in the TCB to the RCI2OSendPacket() function.  PcktCount
 ** indicates the number of buffer context values in the BufferContext[] array.
 ** The User's TransmitCallbackFunction should recover (put back in free queue)
 ** the packet buffers associated with the buffer context values.
 */
typedef void (*PFNTXCALLBACK)(U32  Status,
                              U16  PcktCount,
                              PU32 BufferContext,
                              U16  AdaterID);

 /* 
 ** type PFNRXCALLBACK 
 **
 ** Pointer to user's receive callback function.  This user function
 ** is called from RCProcI2OMsgQ() when packets have been received into
 ** previously posted packet buffers throught the RCPostRecvBuffers() function.
 ** The received callback function should process the Packet Descriptor Block
 ** pointed to by PacketDescBlock. See Packet Decription Block below.
 */
typedef void (*PFNRXCALLBACK)(U32  Status,
                              U8   PktCount,
                              U32  BucketsRemain,
                              PU32 PacketDescBlock,
                              U16  AdapterID);

 /* 
 ** type PFNCALLBACK 
 **
 ** Pointer to user's generic callback function.  This user function
 ** can be passed to LANReset or LANShutdown and is called when the 
 ** the reset or shutdown is complete.
 ** Param1 and Param2 are invalid for LANReset and LANShutdown.
 */
typedef void (*PFNCALLBACK)(U32  Status,
                              U32  Param1,
                              U32  Param2,
                              U16  AdapterID);

/*
** Status - Transmit and Receive callback status word 
**
** A 32 bit Status is returned to the TX and RX callback functions.  This value
** contains both the reply status and the detailed status as follows:
**
**  32    24     16            0
**  +------+------+------------+
**  | Reply|      |  Detailed  |
**  |Status|   0  |   Status   |
**  +------+------+------------+
**
** Reply Status and Detailed Status of zero indicates No Errors.
*/
 /* reply message status defines */
#define    I2O_REPLY_STATUS_SUCCESS                    0x00
#define    I2O_REPLY_STATUS_ABORT_NO_DATA_TRANSFER     0x02
#define    I2O_REPLY_STATUS_TRANSACTION_ERROR          0x0A


/* DetailedStatusCode defines */
#define    I2O_LAN_DSC_SUCCESS                         0x0000
#define    I2O_LAN_DSC_DEVICE_FAILURE                  0x0001
#define    I2O_LAN_DSC_DESTINATION_NOT_FOUND           0x0002
#define    I2O_LAN_DSC_TRANSMIT_ERROR                  0x0003
#define    I2O_LAN_DSC_TRANSMIT_ABORTED                0x0004
#define    I2O_LAN_DSC_RECEIVE_ERROR                   0x0005
#define    I2O_LAN_DSC_RECEIVE_ABORTED                 0x0006
#define    I2O_LAN_DSC_DMA_ERROR                       0x0007
#define    I2O_LAN_DSC_BAD_PACKET_DETECTED             0x0008
#define    I2O_LAN_DSC_OUT_OF_MEMORY                   0x0009
#define    I2O_LAN_DSC_BUCKET_OVERRUN                  0x000A
#define    I2O_LAN_DSC_IOP_INTERNAL_ERROR              0x000B
#define    I2O_LAN_DSC_CANCELED                        0x000C
#define    I2O_LAN_DSC_INVALID_TRANSACTION_CONTEXT     0x000D
#define    I2O_LAN_DSC_DESTINATION_ADDRESS_DETECTED    0x000E
#define    I2O_LAN_DSC_DESTINATION_ADDRESS_OMITTED     0x000F
#define    I2O_LAN_DSC_PARTIAL_PACKET_RETURNED         0x0010


/*
** Packet Description Block   (Received packets)
**
** A pointer to this block structure is returned to the ReceiveCallback 
** function.  It contains the list of packet buffers which have either been
** filled with a packet or returned to host due to a LANReset function. 
** Currently there will only be one packet per receive bucket (buffer) posted. 
**
**   32   24               0     
**  +-----------------------+  -\
**  |   Buffer 1 Context    |    \
**  +-----------------------+     \
**  |      0xC0000000       |     / First Bucket Descriptor
**  +-----+-----------------+    /
**  |  0  | packet 1 length |   / 
**  +-----------------------+  -\
**  |   Buffer 2 Context    |    \
**  +-----------------------+     \
**  |      0xC0000000       |     / Second Bucket Descriptor
**  +-----+-----------------+    /
**  |  0  | packet 2 length |   / 
**  +-----+-----------------+  -
**  |         ...           |  ----- more bucket descriptors
**  +-----------------------+  -\
**  |   Buffer n Context    |    \
**  +-----------------------+     \
**  |      0xC0000000       |     / Last Bucket Descriptor
**  +-----+-----------------+    /
**  |  0  | packet n length |   / 
**  +-----+-----------------+  -
**
** Buffer Context values are those given to adapter in the TCB on calls to
** RCPostRecvBuffers().
**  
*/



/*
** Transaction Control Block (TCB) structure
**
** A structure like this is filled in by the user and passed by reference to 
** RCI2OSendPacket() and RCPostRecvBuffers() functions.  Minimum size is five
** 32-bit words for one buffer with one segment descriptor.  
** MAX_NMBR_POST_BUFFERS_PER_MSG defines the maximum single segment buffers
** that can be described in a given TCB.
**
**   32                    0
**  +-----------------------+
**  |   Buffer Count        |  Number of buffers in the TCB
**  +-----------------------+
**  |   Buffer 1 Context    |  first buffer reference
**  +-----------------------+
**  |   Buffer 1 Seg Count  |  number of segments in buffer
**  +-----------------------+
**  |   Buffer 1 Seg Desc 1 |  first segment descriptor (size, physical address)
**  +-----------------------+
**  |         ...           |  more segment descriptors (size, physical address)
**  +-----------------------+
**  |   Buffer 1 Seg Desc n |  last segment descriptor (size, physical address)
**  +-----------------------+
**  |   Buffer 2 Context    |  second buffer reference
**  +-----------------------+
**  |   Buffer 2 Seg Count  |  number of segments in buffer
**  +-----------------------+
**  |   Buffer 2 Seg Desc 1 |  segment descriptor (size, physical address)
**  +-----------------------+
**  |         ...           |  more segment descriptors (size, physical address)
**  +-----------------------+
**  |   Buffer 2 Seg Desc n |
**  +-----------------------+
**  |         ...           |  more buffer descriptor blocks ...
**  +-----------------------+
**  |   Buffer n Context    |
**  +-----------------------+
**  |   Buffer n Seg Count  |
**  +-----------------------+
**  |   Buffer n Seg Desc 1 |
**  +-----------------------+
**  |         ...           |
**  +-----------------------+
**  |   Buffer n Seg Desc n |
**  +-----------------------+
**
**
** A TCB for one contigous packet buffer would look like the following:
**
**   32                    0
**  +-----------------------+
**  |         1             |  one buffer in the TCB
**  +-----------------------+
**  |  <user's Context>     |  user's buffer reference
**  +-----------------------+
**  |         1             |  one segment buffer
**  +-----------------------+                            _
**  |    <buffer size>      |  size                       \ 
**  +-----------------------+                              \ segment descriptor
**  |  <physical address>   |  physical address of buffer  /
**  +-----------------------+                            _/
**
*/

 /* Buffer Segment Descriptor */
typedef struct
{
    U32 size;
    U32 phyAddress;
}
 BSD, *PBSD;
 
typedef PU32 PRCTCB;
/*
** -------------------------------------------------------------------------
** Exported functions comprising the API to the LAN I2O message transport layer
** -------------------------------------------------------------------------
*/


 /*
 ** InitRCI2OMsgLayer()
 ** 
 ** Called once prior to using the I2O LAN message transport layer.  User 
 ** provides both the physical and virual address of a locked page buffer 
 ** that is used as a private buffer for the RedCreek I2O message
 ** transport layer.  This buffer must be a contigous memory block of a 
 ** minimum of 16K bytes and long word aligned.  The user also must provide
 ** the base address of the RedCreek PCI adapter assigned by BIOS or operating
 ** system.  The user provided value AdapterID is a zero based index of the
 ** Ravlin 45/PCI adapter.  This interface number is used in all subsequent API
 ** calls to identify which adpapter for which the function is intended.  
 ** Up to sixteen interfaces are supported with this API.
 **
 ** Inputs:  AdapterID - interface number from 0 to 15
 **          pciBaseAddr - virual base address of PCI (set by BIOS)
 **          p_msgbuf - virual address to private message block (min. 16K)
 **          p_phymsgbuf - physical address of private message block
 **          TransmitCallbackFunction - address of user's TX callback function
 **          ReceiveCallbackFunction  - address of user's RX callback function
 **
 */
RC_RETURN RCInitI2OMsgLayer(U16 AdapterID, U32 pciBaseAddr, 
                            PU8 p_msgbuf,  PU8 p_phymsgbuf,
                            PFNTXCALLBACK TransmitCallbackFunction,
                            PFNRXCALLBACK ReceiveCallbackFunction,
                            PFNCALLBACK   RebootCallbackFunction);

 /*
 ** RCSetRavlinIPandMask()
 **
 ** Set the Ravlin 45/PCI cards IP address and network mask.
 **
 ** IP address and mask must be in network byte order.
 ** For example, IP address 1.2.3.4 and mask 255.255.255.0 would be
 ** 0x04030201 and 0x00FFFFFF on a little endian machine.
 **
 */
RC_RETURN RCSetRavlinIPandMask(U16 AdapterID, U32 ipAddr, U32 netMask);


/*
** =========================================================================
** RCGetRavlinIPandMask()
**
** get the IP address and MASK from the card
** 
** =========================================================================
*/
RC_RETURN
RCGetRavlinIPandMask(U16 AdapterID, PU32 pIpAddr, PU32 pNetMask, 
                        PFNWAITCALLBACK WaitCallback);

 /* 
 ** RCProcI2OMsgQ()
 ** 
 ** Called from user's polling loop or Interrupt Service Routine for a PCI 
 ** interrupt from the RedCreek PCI adapter.  User responsible for determining
 ** and hooking the PCI interrupt. This function will call the registered
 ** callback functions, TransmitCallbackFunction or ReceiveCallbackFunction,
 ** if a TX or RX transaction has completed.
 */
void RCProcI2OMsgQ(U16 AdapterID);


 /*
 ** Disable and Enable I2O interrupts.  I2O interrupts are enabled at Init time
 ** but can be disabled and re-enabled through these two function calls.
 ** Packets will still be put into any posted recieved buffers and packets will
 ** be sent through RCI2OSendPacket() functions.  Disabling I2O interrupts
 ** will prevent hardware interrupt to host even though the outbound I2O msg
 ** queue is not emtpy.
 */
RC_RETURN RCEnableI2OInterrupts(U16 adapterID);
RC_RETURN RCDisableI2OInterrupts(U16 AdapterID);


 /* 
 ** RCPostRecvBuffers()
 ** 
 ** Post user's page locked buffers for use by the PCI adapter to
 ** return ethernet packets received from the LAN.  Transaction Control Block,
 ** provided by user, contains buffer descriptor(s) which includes a buffer
 ** context number along with buffer size and physical address.  See TCB above.
 ** The buffer context and actual packet length are returned to the 
 ** ReceiveCallbackFunction when packets have been received.  Buffers posted
 ** to the RedCreek adapter are considered owned by the adapter until the
 ** context is return to user through the ReceiveCallbackFunction.
 */
RC_RETURN RCPostRecvBuffers(U16 AdapterID, PRCTCB pTransactionCtrlBlock);
#define MAX_NMBR_POST_BUFFERS_PER_MSG 32

 /*
 ** RCI2OSendPacket()
 ** 
 ** Send user's ethernet packet from a locked page buffer.  
 ** Packet must have full MAC header, however without a CRC.  
 ** Initiator context is a user provided value that is returned 
 ** to the TransmitCallbackFunction when packet buffer is free.
 ** Transmit buffer are considered owned by the adapter until context's
 ** returned to user through the TransmitCallbackFunction.
 */
RC_RETURN RCI2OSendPacket(U16 AdapterID, 
                          U32 context, 
                          PRCTCB pTransactionCtrlBlock);


 /* Ethernet Link Statistics structure */
typedef struct tag_RC_link_stats
{
    U32 TX_good;      /* good transmit frames */
    U32 TX_maxcol;    /* frames not TX due to MAX collisions */
    U32 TX_latecol;   /* frames not TX due to late collisions */
    U32 TX_urun;      /* frames not TX due to DMA underrun */
    U32 TX_crs;       /* frames TX with lost carrier sense */
    U32 TX_def;       /* frames deferred due to activity on link */
    U32 TX_singlecol; /* frames TX with one and only on collision */
    U32 TX_multcol;   /* frames TX with more than one collision */
    U32 TX_totcol;    /* total collisions detected during TX */
    U32 Rcv_good;     /* good frames received */
    U32 Rcv_CRCerr;   /* frames RX and discarded with CRC errors */
    U32 Rcv_alignerr; /* frames RX with alignment and CRC errors */
    U32 Rcv_reserr;   /* good frames discarded due to no RX buffer */
    U32 Rcv_orun;     /* RX frames lost due to FIFO overrun */
    U32 Rcv_cdt;      /* RX frames with collision during RX */
    U32 Rcv_runt;     /* RX frames shorter than 64 bytes */
}
 RCLINKSTATS, *P_RCLINKSTATS;

 /*
 ** RCGetLinkStatistics()
 **
 ** Returns link statistics in user's structure at address StatsReturnAddr
 ** If given, not NULL, the function WaitCallback is called during the wait
 ** loop while waiting for the adapter to respond.
 */
RC_RETURN RCGetLinkStatistics(U16 AdapterID,
                              P_RCLINKSTATS StatsReturnAddr,
                              PFNWAITCALLBACK WaitCallback);

 /*
 ** RCGetLinkStatus()
 **
 ** Return link status, up or down, to user's location addressed by ReturnAddr.
 ** If given, not NULL, the function WaitCallback is called during the wait
 ** loop while waiting for the adapter to respond.
 */
RC_RETURN RCGetLinkStatus(U16 AdapterID, 
                          PU32 pReturnStatus,
                          PFNWAITCALLBACK WaitCallback);
                               
 /* Link Status defines - value returned in pReturnStatus */
#define RC_LAN_LINK_STATUS_DOWN     0
#define RC_LAN_LINK_STATUS_UP       1

 /*
 ** RCGetMAC()
 **
 ** Get the current MAC address assigned to user.  RedCreek Ravlin 45/PCI 
 ** has two MAC addresses.  One which is private to the PCI Card, and 
 ** another MAC which is given to the user as its link layer MAC address. The
 ** adapter runs in promiscous mode because of the dual address requirement.
 ** The MAC address is returned to the unsigned char array pointer to by mac.
 */
RC_RETURN RCGetMAC(U16 AdapterID, PU8 mac, PFNWAITCALLBACK WaitCallback);

 /*
 ** RCSetMAC()
 **
 ** Set a new user port MAC address.  This address will be returned on
 ** subsequent RCGetMAC() calls.
 */
RC_RETURN RCSetMAC(U16 AdapterID, PU8 mac);

 /*
 ** RCSetLinkSpeed()
 **
 ** set adapter's link speed based on given input code.
 */
RC_RETURN RCSetLinkSpeed(U16 AdapterID, U16 LinkSpeedCode);
 /* Set link speed codes */
#define LNK_SPD_AUTO_NEG_NWAY   0
#define LNK_SPD_100MB_FULL      1
#define LNK_SPD_100MB_HALF      2
#define LNK_SPD_10MB_FULL       3
#define LNK_SPD_10MB_HALF       4




 /*
 ** RCGetLinkSpeed()
 **
 ** Return link speed code.
 */
 /* Return link speed codes */
#define LNK_SPD_UNKNOWN         0
#define LNK_SPD_100MB_FULL      1
#define LNK_SPD_100MB_HALF      2
#define LNK_SPD_10MB_FULL       3
#define LNK_SPD_10MB_HALF       4

RC_RETURN
RCGetLinkSpeed(U16 AdapterID, PU32 pLinkSpeedCode, PFNWAITCALLBACK WaitCallback);
/*
** =========================================================================
** RCSetPromiscuousMode(U16 AdapterID, U16 Mode)
**
** Defined values for Mode:
**  0 - turn off promiscuous mode
**  1 - turn on  promiscuous mode
**
** =========================================================================
*/
#define PROMISCUOUS_MODE_OFF 0
#define PROMISCUOUS_MODE_ON  1
RC_RETURN
RCSetPromiscuousMode(U16 AdapterID, U16 Mode);
/*
** =========================================================================
** RCGetPromiscuousMode(U16 AdapterID, PU32 pMode, PFNWAITCALLBACK WaitCallback)
**
** get promiscuous mode setting
**
** Possible return values placed in pMode:
**  0 = promisuous mode not set
**  1 = promisuous mode is set
**
** =========================================================================
*/
RC_RETURN
RCGetPromiscuousMode(U16 AdapterID, PU32 pMode, PFNWAITCALLBACK WaitCallback);

/*
** =========================================================================
** RCSetBroadcastMode(U16 AdapterID, U16 Mode)
**
** Defined values for Mode:
**  0 - turn off promiscuous mode
**  1 - turn on  promiscuous mode
**
** =========================================================================
*/
#define BROADCAST_MODE_OFF 0
#define BROADCAST_MODE_ON  1
RC_RETURN
RCSetBroadcastMode(U16 AdapterID, U16 Mode);
/*
** =========================================================================
** RCGetBroadcastMode(U16 AdapterID, PU32 pMode, PFNWAITCALLBACK WaitCallback)
**
** get broadcast mode setting
**
** Possible return values placed in pMode:
**  0 = broadcast mode not set
**  1 = broadcast mode is set
**
** =========================================================================
*/
RC_RETURN
RCGetBroadcastMode(U16 AdapterID, PU32 pMode, PFNWAITCALLBACK WaitCallback);
/*
** =========================================================================
** RCReportDriverCapability(U16 AdapterID, U32 capability)
**
** Currently defined bits:
** WARM_REBOOT_CAPABLE   0x01
**
** =========================================================================
*/
RC_RETURN
RCReportDriverCapability(U16 AdapterID, U32 capability);

/*
** RCGetFirmwareVer()
**
** Return firmware version in the form "SoftwareVersion : Bt BootVersion"
**
** WARNING: user's space pointed to by pFirmString should be at least 60 bytes.
*/
RC_RETURN
RCGetFirmwareVer(U16 AdapterID, PU8 pFirmString, PFNWAITCALLBACK WaitCallback);

/*
** ----------------------------------------------
** LAN adapter Reset and Shutdown functions
** ----------------------------------------------
*/
 /* resource flag bit assignments for RCResetLANCard() & RCShutdownLANCard() */
#define RC_RESOURCE_RETURN_POSTED_RX_BUCKETS  0x0001 
#define RC_RESOURCE_RETURN_PEND_TX_BUFFERS    0x0002

 /*
 ** RCResetLANCard()
 **
 ** Reset LAN card operation.  Causes a software reset of the ethernet
 ** controller and restarts the command and receive units. Depending on 
 ** the ResourceFlags given, the buffers are either returned to the
 ** host with reply status of I2O_REPLY_STATUS_ABORT_NO_DATA_TRANSFER and
 ** detailed status of I2O_LAN_DSC_CANCELED (new receive buffers must be
 ** posted after issuing this) OR the buffers are kept and reused by
 ** the ethernet controller. If CallbackFunction is not NULL, the function
 ** will be called when the reset is complete.  If the CallbackFunction is
 ** NULL,a 1 will be put into the ReturnAddr after waiting for the reset 
 ** to complete (please disable I2O interrupts during this method).
 ** Any outstanding transmit or receive buffers that are complete will be
 ** returned via the normal reply messages before the requested resource
 ** buffers are returned.
 ** A call to RCPostRecvBuffers() is needed to return the ethernet to full
 ** operation if the receive buffers were returned during LANReset.
 ** Note: The IOP status is not affected by a LAN reset.
 */
RC_RETURN RCResetLANCard(U16 AdapterID, U16 ResourceFlags, PU32 ReturnAddr, PFNCALLBACK CallbackFunction);


 /*
 ** RCShutdownLANCard()
 **
 ** Shutdown LAN card operation and put into an idle (suspended) state.
 ** The LAN card is restarted with RCResetLANCard() function.
 ** Depending on the ResourceFlags given, the buffers are either returned 
 ** to the host with reply status of I2O_REPLY_STATUS_ABORT_NO_DATA_TRANSFER 
 ** and detailed status of I2O_LAN_DSC_CANCELED (new receive buffers must be
 ** posted after issuing this) OR the buffers are kept and reused by
 ** the ethernet controller. If CallbackFunction is not NULL, the function
 ** will be called when the reset is complete.  If the CallbackFunction is
 ** NULL,a 1 will be put into the ReturnAddr after waiting for the reset 
 ** to complete (please disable I2O interrupts during this method).
 ** Any outstanding transmit or receive buffers that are complete will be
 ** returned via the normal reply messages before the requested resource
 ** buffers are returned.
 ** Note: The IOP status is not affected by a LAN shutdown.
 */                                      
RC_RETURN 
RCShutdownLANCard(U16 AdapterID, U16 ResourceFlags, PU32 ReturnAddr, PFNCALLBACK CallbackFunction);

 /*
 ** RCResetIOP();
 **     Initializes IOPState to I2O_IOP_STATE_RESET.
 **     Stops access to outbound message Q.
 **     Discards any outstanding transmit or posted receive buffers.
 **     Clears outbound message Q. 
 */
RC_RETURN 
RCResetIOP(U16 AdapterID);

#endif /* RCLANMTL_H */
