⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 rclanmtl.c

📁 讲述linux的初始化过程
💻 C
📖 第 1 页 / 共 5 页
字号:
/*** *******************************************************************************     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 + -