/* ** ************************************************************************* ** ** ** 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 #else #include #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 buffer reference ** +-----------------------+ ** | 1 | one segment buffer ** +-----------------------+ _ ** | | size \ ** +-----------------------+ \ segment descriptor ** | | 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 */