📄 rclanmtl.c
字号:
/*** ******************************************************************************* R C L A N M T L . C $Revision: 6 $****** RedCreek I2O LAN Message Transport Layer program module.**** ---------------------------------------------------------------------** --- Copyright (c) 1997-1999, RedCreek Communications Inc. ---** --- All rights reserved. ---** ---------------------------------------------------------------------**** File Description:**** Host side I2O (Intelligent I/O) LAN message transport layer.**** 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.**** 1998-1999, LAN API was modified and enhanced by Alice Hennessy.**** Sometime in 1997, LAN API was written from scratch by Wendell Nichols.** **************************************************************************/#undef DEBUG#define RC_LINUX_MODULE#include "rclanmtl.h"#define dprintf kprintfextern int printk(const char * fmt, ...); /* RedCreek LAN device Target ID */#define RC_LAN_TARGET_ID 0x10 /* RedCreek's OSM default LAN receive Initiator */#define DEFAULT_RECV_INIT_CONTEXT 0xA17 /*** I2O message structures*/#define I2O_TID_SZ 12#define I2O_FUNCTION_SZ 8/* Transaction Reply Lists (TRL) Control Word structure */#define I2O_TRL_FLAGS_SINGLE_FIXED_LENGTH 0x00#define I2O_TRL_FLAGS_SINGLE_VARIABLE_LENGTH 0x40#define I2O_TRL_FLAGS_MULTIPLE_FIXED_LENGTH 0x80/* LAN Class specific functions */#define I2O_LAN_PACKET_SEND 0x3B#define I2O_LAN_SDU_SEND 0x3D#define I2O_LAN_RECEIVE_POST 0x3E#define I2O_LAN_RESET 0x35#define I2O_LAN_SHUTDOWN 0x37/* Private Class specfic function */#define I2O_PRIVATE 0xFF/* I2O Executive Function Codes. */#define I2O_EXEC_ADAPTER_ASSIGN 0xB3#define I2O_EXEC_ADAPTER_READ 0xB2#define I2O_EXEC_ADAPTER_RELEASE 0xB5#define I2O_EXEC_BIOS_INFO_SET 0xA5#define I2O_EXEC_BOOT_DEVICE_SET 0xA7#define I2O_EXEC_CONFIG_VALIDATE 0xBB#define I2O_EXEC_CONN_SETUP 0xCA#define I2O_EXEC_DEVICE_ASSIGN 0xB7#define I2O_EXEC_DEVICE_RELEASE 0xB9#define I2O_EXEC_HRT_GET 0xA8#define I2O_EXEC_IOP_CLEAR 0xBE#define I2O_EXEC_IOP_CONNECT 0xC9#define I2O_EXEC_IOP_RESET 0xBD#define I2O_EXEC_LCT_NOTIFY 0xA2#define I2O_EXEC_OUTBOUND_INIT 0xA1#define I2O_EXEC_PATH_ENABLE 0xD3#define I2O_EXEC_PATH_QUIESCE 0xC5#define I2O_EXEC_PATH_RESET 0xD7#define I2O_EXEC_STATIC_MF_CREATE 0xDD#define I2O_EXEC_STATIC_MF_RELEASE 0xDF#define I2O_EXEC_STATUS_GET 0xA0#define I2O_EXEC_SW_DOWNLOAD 0xA9#define I2O_EXEC_SW_UPLOAD 0xAB#define I2O_EXEC_SW_REMOVE 0xAD#define I2O_EXEC_SYS_ENABLE 0xD1#define I2O_EXEC_SYS_MODIFY 0xC1#define I2O_EXEC_SYS_QUIESCE 0xC3#define I2O_EXEC_SYS_TAB_SET 0xA3 /* Init Outbound Q status */#define I2O_EXEC_OUTBOUND_INIT_IN_PROGRESS 0x01#define I2O_EXEC_OUTBOUND_INIT_REJECTED 0x02#define I2O_EXEC_OUTBOUND_INIT_FAILED 0x03#define I2O_EXEC_OUTBOUND_INIT_COMPLETE 0x04#define I2O_UTIL_NOP 0x00/* I2O Get Status State values */#define I2O_IOP_STATE_INITIALIZING 0x01#define I2O_IOP_STATE_RESET 0x02#define I2O_IOP_STATE_HOLD 0x04#define I2O_IOP_STATE_READY 0x05#define I2O_IOP_STATE_OPERATIONAL 0x08#define I2O_IOP_STATE_FAILED 0x10#define I2O_IOP_STATE_FAULTED 0x11/* Defines for Request Status Codes: Table 3-1 Reply Status Codes. */#define I2O_REPLY_STATUS_SUCCESS 0x00#define I2O_REPLY_STATUS_ABORT_DIRTY 0x01#define I2O_REPLY_STATUS_ABORT_NO_DATA_TRANSFER 0x02#define I2O_REPLY_STATUS_ABORT_PARTIAL_TRANSFER 0x03#define I2O_REPLY_STATUS_ERROR_DIRTY 0x04#define I2O_REPLY_STATUS_ERROR_NO_DATA_TRANSFER 0x05#define I2O_REPLY_STATUS_ERROR_PARTIAL_TRANSFER 0x06#define I2O_REPLY_STATUS_PROCESS_ABORT_DIRTY 0x07#define I2O_REPLY_STATUS_PROCESS_ABORT_NO_DATA_TRANSFER 0x08#define I2O_REPLY_STATUS_PROCESS_ABORT_PARTIAL_TRANSFER 0x09#define I2O_REPLY_STATUS_TRANSACTION_ERROR 0x0A#define I2O_REPLY_STATUS_PROGRESS_REPORT 0x80/* DetailedStatusCode defines for ALL messages: Table 3-2 Detailed Status Codes.*/#define I2O_DETAIL_STATUS_SUCCESS 0x0000#define I2O_DETAIL_STATUS_BAD_KEY 0x0001#define I2O_DETAIL_STATUS_CHAIN_BUFFER_TOO_LARGE 0x0002#define I2O_DETAIL_STATUS_DEVICE_BUSY 0x0003#define I2O_DETAIL_STATUS_DEVICE_LOCKED 0x0004#define I2O_DETAIL_STATUS_DEVICE_NOT_AVAILABLE 0x0005#define I2O_DETAIL_STATUS_DEVICE_RESET 0x0006#define I2O_DETAIL_STATUS_INAPPROPRIATE_FUNCTION 0x0007#define I2O_DETAIL_STATUS_INSUFFICIENT_RESOURCE_HARD 0x0008#define I2O_DETAIL_STATUS_INSUFFICIENT_RESOURCE_SOFT 0x0009#define I2O_DETAIL_STATUS_INVALID_INITIATOR_ADDRESS 0x000A#define I2O_DETAIL_STATUS_INVALID_MESSAGE_FLAGS 0x000B#define I2O_DETAIL_STATUS_INVALID_OFFSET 0x000C#define I2O_DETAIL_STATUS_INVALID_PARAMETER 0x000D#define I2O_DETAIL_STATUS_INVALID_REQUEST 0x000E#define I2O_DETAIL_STATUS_INVALID_TARGET_ADDRESS 0x000F#define I2O_DETAIL_STATUS_MESSAGE_TOO_LARGE 0x0010#define I2O_DETAIL_STATUS_MESSAGE_TOO_SMALL 0x0011#define I2O_DETAIL_STATUS_MISSING_PARAMETER 0x0012#define I2O_DETAIL_STATUS_NO_SUCH_PAGE 0x0013#define I2O_DETAIL_STATUS_REPLY_BUFFER_FULL 0x0014#define I2O_DETAIL_STATUS_TCL_ERROR 0x0015#define I2O_DETAIL_STATUS_TIMEOUT 0x0016#define I2O_DETAIL_STATUS_UNKNOWN_ERROR 0x0017#define I2O_DETAIL_STATUS_UNKNOWN_FUNCTION 0x0018#define I2O_DETAIL_STATUS_UNSUPPORTED_FUNCTION 0x0019#define I2O_DETAIL_STATUS_UNSUPPORTED_VERSION 0x001A /* I2O msg header defines for VersionOffset */#define I2OMSGVER_1_5 0x0001#define SGL_OFFSET_0 I2OMSGVER_1_5#define SGL_OFFSET_4 (0x0040 | I2OMSGVER_1_5)#define TRL_OFFSET_5 (0x0050 | I2OMSGVER_1_5)#define TRL_OFFSET_6 (0x0060 | I2OMSGVER_1_5) /* I2O msg header defines for MsgFlags */#define MSG_STATIC 0x0100#define MSG_64BIT_CNTXT 0x0200#define MSG_MULTI_TRANS 0x1000#define MSG_FAIL 0x2000#define MSG_LAST 0x4000#define MSG_REPLY 0x8000 /* normal LAN request message MsgFlags and VersionOffset (0x1041) */#define LAN_MSG_REQST (MSG_MULTI_TRANS | SGL_OFFSET_4) /* minimum size msg */#define THREE_WORD_MSG_SIZE 0x00030000#define FOUR_WORD_MSG_SIZE 0x00040000#define FIVE_WORD_MSG_SIZE 0x00050000#define SIX_WORD_MSG_SIZE 0x00060000#define SEVEN_WORD_MSG_SIZE 0x00070000#define EIGHT_WORD_MSG_SIZE 0x00080000#define NINE_WORD_MSG_SIZE 0x00090000/* Special TID Assignments */#define I2O_IOP_TID 0#define I2O_HOST_TID 0xB91 /* RedCreek I2O private message codes */#define RC_PRIVATE_GET_MAC_ADDR 0x0001/**/ /* OBSOLETE */#define RC_PRIVATE_SET_MAC_ADDR 0x0002#define RC_PRIVATE_GET_NIC_STATS 0x0003#define RC_PRIVATE_GET_LINK_STATUS 0x0004#define RC_PRIVATE_SET_LINK_SPEED 0x0005#define RC_PRIVATE_SET_IP_AND_MASK 0x0006/* #define RC_PRIVATE_GET_IP_AND_MASK 0x0007 */ /* OBSOLETE */#define RC_PRIVATE_GET_LINK_SPEED 0x0008#define RC_PRIVATE_GET_FIRMWARE_REV 0x0009/* #define RC_PRIVATE_GET_MAC_ADDR 0x000A *//**/#define RC_PRIVATE_GET_IP_AND_MASK 0x000B /**/#define RC_PRIVATE_DEBUG_MSG 0x000C#define RC_PRIVATE_REPORT_DRIVER_CAPABILITY 0x000D#define RC_PRIVATE_SET_PROMISCUOUS_MODE 0x000e#define RC_PRIVATE_GET_PROMISCUOUS_MODE 0x000f#define RC_PRIVATE_SET_BROADCAST_MODE 0x0010#define RC_PRIVATE_GET_BROADCAST_MODE 0x0011#define RC_PRIVATE_REBOOT 0x00FF/* I2O message header */typedef struct _I2O_MESSAGE_FRAME { U8 VersionOffset; U8 MsgFlags; U16 MessageSize; BF TargetAddress:I2O_TID_SZ; BF InitiatorAddress:I2O_TID_SZ; BF Function:I2O_FUNCTION_SZ; U32 InitiatorContext; /* SGL[] */ }I2O_MESSAGE_FRAME, *PI2O_MESSAGE_FRAME; /* assumed a 16K minus 256 byte space for outbound queue message frames */#define MSG_FRAME_SIZE 512#define NMBR_MSG_FRAMES 30/*** Message Unit CSR definitions for RedCreek PCI45 board*/typedef struct tag_rcatu { volatile unsigned long APICRegSel; /* APIC Register Select */ volatile unsigned long reserved0; volatile unsigned long APICWinReg; /* APIC Window Register */ volatile unsigned long reserved1; volatile unsigned long InMsgReg0; /* inbound message register 0 */ volatile unsigned long InMsgReg1; /* inbound message register 1 */ volatile unsigned long OutMsgReg0; /* outbound message register 0 */ volatile unsigned long OutMsgReg1; /* outbound message register 1 */ volatile unsigned long InDoorReg; /* inbound doorbell register */ volatile unsigned long InIntStat; /* inbound interrupt status register */ volatile unsigned long InIntMask; /* inbound interrupt mask register */ volatile unsigned long OutDoorReg; /* outbound doorbell register */ volatile unsigned long OutIntStat; /* outbound interrupt status register */ volatile unsigned long OutIntMask; /* outbound interrupt mask register */ volatile unsigned long reserved2; volatile unsigned long reserved3; volatile unsigned long InQueue; /* inbound queue port */ volatile unsigned long OutQueue; /* outbound queue port */ volatile unsigned long reserved4; volatile unsigned long reserver5; /* RedCreek extension */ volatile unsigned long EtherMacLow; volatile unsigned long EtherMacHi; volatile unsigned long IPaddr; volatile unsigned long IPmask;}ATU, *PATU; /* ** typedef PAB ** ** PCI Adapter Block - holds instance specific information and is located ** in a reserved space at the start of the message buffer allocated by user. */typedef struct{ PATU p_atu; /* ptr to ATU register block */ PU8 pPci45LinBaseAddr; PU8 pLinOutMsgBlock; U32 outMsgBlockPhyAddr; PFNTXCALLBACK pTransCallbackFunc; PFNRXCALLBACK pRecvCallbackFunc; PFNCALLBACK pRebootCallbackFunc; PFNCALLBACK pCallbackFunc; U16 IOPState; U16 InboundMFrameSize;}PAB, *PPAB; /* ** in reserved space right after PAB in host memory is area for returning ** values from card */ /* ** Array of pointers to PCI Adapter Blocks. ** Indexed by a zero based (0-31) interface number. */ #define MAX_ADAPTERS 32static PPAB PCIAdapterBlock[MAX_ADAPTERS];/*** typedef NICSTAT**** Data structure for NIC statistics retruned from PCI card. Data copied from** here to user allocated RCLINKSTATS (see rclanmtl.h) structure.*/typedef struct tag_NicStat { unsigned long TX_good; unsigned long TX_maxcol; unsigned long TX_latecol; unsigned long TX_urun; unsigned long TX_crs; /* lost carrier sense */ unsigned long TX_def; /* transmit deferred */ unsigned long TX_singlecol; /* single collisions */ unsigned long TX_multcol; unsigned long TX_totcol; unsigned long Rcv_good; unsigned long Rcv_CRCerr; unsigned long Rcv_alignerr; unsigned long Rcv_reserr; /* rnr'd pkts */ unsigned long Rcv_orun; unsigned long Rcv_cdt; unsigned long Rcv_runt; unsigned long dump_status; /* last field directly from the chip */} NICSTAT, *P_NICSTAT; #define DUMP_DONE 0x0000A005 /* completed statistical dump */#define DUMP_CLEAR 0x0000A007 /* completed stat dump and clear counters */static volatile int msgFlag;/* local function prototypes */static void ProcessOutboundI2OMsg(PPAB pPab, U32 phyMsgAddr);static int FillI2OMsgSGLFromTCB(PU32 pMsg, PRCTCB pXmitCntrlBlock);static int GetI2OStatus(PPAB pPab);static int SendI2OOutboundQInitMsg(PPAB pPab);static int SendEnableSysMsg(PPAB pPab);/* 1st 100h bytes of message block is reserved for messenger instance */#define ADAPTER_BLOCK_RESERVED_SPACE 0x100/*** =========================================================================** RCInitI2OMsgLayer()**** Initialize the RedCreek I2O Module and adapter.**** 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 transmit callback function** ReceiveCallbackFunction - address of receive callback function**** private message block is allocated by user. It must be in locked pages.** p_msgbuf and p_phymsgbuf point to the same location. Must be contigous** memory block of a minimum of 16K byte and long word aligned.** =========================================================================*/RC_RETURNRCInitI2OMsgLayer(U16 AdapterID, U32 pciBaseAddr, PU8 p_msgbuf, PU8 p_phymsgbuf, PFNTXCALLBACK TransmitCallbackFunction, PFNRXCALLBACK ReceiveCallbackFunction, PFNCALLBACK RebootCallbackFunction){ int result; PPAB pPab; #ifdef DEBUG kprintf("InitI2O: Adapter:0x%04.4ux ATU:0x%08.8ulx msgbuf:0x%08.8ulx phymsgbuf:0x%08.8ulx\n" "TransmitCallbackFunction:0x%08.8ulx ReceiveCallbackFunction:0x%08.8ulx\n", AdapterID, pciBaseAddr, p_msgbuf, p_phymsgbuf, TransmitCallbackFunction, ReceiveCallbackFunction);#endif /* DEBUG */ /* Check if this interface already initialized - if so, shut it down */ if (PCIAdapterBlock[AdapterID] != NULL) { printk("PCIAdapterBlock[%d]!=NULL\n", AdapterID);// RCResetLANCard(AdapterID, 0, (PU32)NULL, (PFNCALLBACK)NULL); PCIAdapterBlock[AdapterID] = NULL; } /* ** store adapter instance values in adapter block. ** Adapter block is at beginning of message buffer */ pPab = (PPAB)p_msgbuf; pPab->p_atu = (PATU)pciBaseAddr; pPab->pPci45LinBaseAddr = (PU8)pciBaseAddr; /* Set outbound message frame addr - skip over Adapter Block */ pPab->outMsgBlockPhyAddr = (U32)(p_phymsgbuf + ADAPTER_BLOCK_RESERVED_SPACE); pPab->pLinOutMsgBlock = (PU8)(p_msgbuf + ADAPTER_BLOCK_RESERVED_SPACE); /* store callback function addresses */ pPab->pTransCallbackFunc = TransmitCallbackFunction; pPab->pRecvCallbackFunc = ReceiveCallbackFunction;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -