📄 sysmotfccend.c
字号:
/* sysMotFccEnd.c - system configuration module for motFccEnd driver */
/* Copyright 1984-2001 Wind River Systems, Inc. */
#include "copyright_wrs.h"
/*
modification history
--------------------
01a,12oct01, gev created
*/
/*
DESCRIPTION
This is the WRS-supplied configuration module for the VxWorks
motFccEnd END driver.
It performs the dynamic parameterization of the motFccEnd driver.
This technique of 'just-in-time' parameterization allows driver
parameter values to be declared as any other defined constants rather
than as static strings.
*/
#include "vxWorks.h"
#include "config.h"
#include "vmLib.h"
#include "stdio.h"
#include "sysLib.h"
#include "logLib.h"
#include "stdlib.h"
#include "string.h"
#include "end.h"
#include "intLib.h"
#include "lstLib.h"
#include "sys82xxDpramLib.h"
#include "miiLib.h"
/* defines */
#if !defined(M8260_CMXFCR)
#define M8260_CMXFCR(base) (CAST(VUINT32 *)((base) + 0x11B04))
#endif
#ifdef INCLUDE_MOT_FCC
#define MOT_FCC_NUM_UNIT0 0x03 /* FCC3 is unit 0 */
#define MOT_FCC_NUM_UNIT1 0x02 /* FCC2 is unit 1 */
#define MOT_FCC_TBD_NUM 0x40 /* transmit buffer descriptors (TBD)*/
#define MOT_FCC_RBD_NUM 0x20 /* receive buffer descriptors (RBD)*/
#define MOT_FCC_PHY_ADDR 0x00 /* PHY address */
#define MOT_FCC_DEF_PHY_MODE 0x02 /* PHY's default operating mode */
#define MOT_FCC_BDS_SIZE (2 * 1024)
/* imports */
IMPORT END_OBJ *motFccEndLoad (char *);
IMPORT UINT32 sysPCGet (void);
IMPORT FUNCPTR _func_motFccPhyLSCInt;
IMPORT FUNCPTR _func_motFccPhyInit;
IMPORT FUNCPTR _func_motFccPhyDuplex;
IMPORT STATUS miiPhyInit (PHY_INFO * phyInfo);
/* globals */
UINT8 sysFccEnetAddr[MAC_ADRS_LEN] /* = ETHERNET_MAC_ADRS */ ;
UINT32 miiNumLinkChgInts = 0;
UINT32 miiBitRdCount = 0;
UINT32 miiBitWrCount = 0;
/* locals */
/*
* this table may be customized by the user to force a
* particular order how different technology abilities may be
* negotiated by the PHY. Entries in this table may be freely combined
* and even OR'd together.
*/
LOCAL INT16 motFccAnOrderTbl [] = {
MII_TECH_100BASE_TX, /* 100Base-T */
MII_TECH_100BASE_T4, /* 10Base-T */
MII_TECH_10BASE_T, /* 100Base-T4 */
MII_TECH_10BASE_FD, /* 100Base-T FD*/
MII_TECH_100BASE_TX_FD, /* 10Base-T FD */
-1 /* end of table */
};
/* forward declarations */
void sysEnetAddrSet(unsigned char,unsigned char,unsigned char,unsigned char,unsigned char,unsigned char);
STATUS sysEnetAddrGet(int unit, UINT8 *addr);
STATUS sysFccEnetAddrGet (int unit,UCHAR *address);
STATUS sysFccEnetEnable (UINT32 immrVal, UINT8 fccNum);
STATUS sysFccEnetCommand(UINT32 immrVal, UINT8 fccNum, UINT16 command);
STATUS sysFccMiiBitWr (UINT32 immrVal, UINT8 fccNum, INT32 bitVal);
STATUS sysFccMiiBitRd (UINT32 immrVal, UINT8 fccNum, INT8 * bitVal);
STATUS sysFccEnetDisable (UINT32 immrVal, UINT8 fccNum);
/******************************************************************************
*
* sysMotFccEndLoad - load an istance of the motFccEnd driver
*
* This routine loads the motFccEnd driver with proper parameters. It also
* reads the BCSR3 to find out which type of processor is being used, and
* sets up the load string accordingly.
*
* The END device load string formed by this routine is in the following
* format.
* <immrVal>:<fccNum>:<bdBase>:<bdSize>:<bufBase>:<bufSize>:<fifoTxBase>
* :<fifoRxBase>:<tbdNum>:<rbdNum>:<phyAddr>:<phyDefMode>:<pAnOrderTbl>:
* <userFlags>
*
* .IP <immrVal>
* Internal memory address
* .IP <fccNum>
* FCC number being used
* .IP <bdBase>
* buffer descriptors base address
* .IP <bdSize>
* buffer descriptors space size
* .IP <bufBase>
* data buffers base address
* .IP <bufSize>
* data buffers space size
* .IP <fifoTxBase>
* tx buffer in internal memory
* .IP <fifoRxBase>
* rx buffer in internal memory
* .IP <tbdNum>
* number of TBDs or NONE
* .IP <rbdNum>
* number of RBDs or NONE
* .IP <phyAddr>
* address of a MII-compliant PHY device
* .IP <phyDefMode>
* default operating mode of a MII-compliant PHY device
* .IP <pAnOrderTbl>
* auto-negotiation order table for a MII-compliant PHY device or NONE
*
* This routine only loads and initializes one instance of the device.
* If the user wishes to use more than one motFccEnd devices, this routine
* should be changed.
*
* RETURNS: pointer to END object or ERROR.
*
* SEE ALSO: motFccEndLoad ()
*/
END_OBJ * sysMotFccEndLoad
(
char * pParamStr, /* ptr to initialization parameter string */
void * unused /* unused optional argument */
)
{
/*
* The motFccEnd driver END_LOAD_STRING should be:
* <immrVal>:<fccNum>:<bdBase>:<bdSize>:<bufBase>:<bufSize>:<fifoTxBase>
* :<fifoRxBase>:<tbdNum>:<rbdNum>:<phyAddr>:<phyDefMode>
* :<pAnOrderTbl>:<userFlags>:<mBlkRatio>:<clusterRatio>
* Note that unit string is prepended by the mux, so we
* don't put it here.
*/
char *pStr = NULL;
char paramStr [300];
UINT32 regPC;
UINT32 motFccBufsDescAdr;
UINT32 motFccBufsDescSize;
UINT32 motFccBufsAdr;
UINT32 motFccBufsSize;
UINT32 motFccFlags;
END_OBJ *pEnd;
int unitNumber;
static char motFccEndParamTemplate [] =
"0x%x:0x%x:0x%x:0x%x:0x%x:0x%x:0x%x:0x%x:0x%x:0x%x:0x%x:0x%x:0x%x:0x%x:0x%x:0x%x";
if (strlen (pParamStr) == 0) {
/*
* muxDevLoad() calls us twice. If the string is
* zero length, then this is the first time through
* this routine.
*/
pEnd = (END_OBJ *) motFccEndLoad (pParamStr);
}else{
/* Chuck (PTR Group) Added: */
unitNumber = pParamStr[0] - '0';
if ((unitNumber > 0) && (ptrGetBoardID() != 0))
{
/* Only SBC1 (boardID 0) has multiple network interfaces. */
return NULL;
}
regPC = sysPCGet();
/* ROM resident applications MUST use the LOCAL BUS options,
* while RAM resident MAY use the option, which forces all
* driver buffers (rx and tx) to reside in local bus space. The
* drawback to having buffers on the local bus is that the driver
* MUST copy all transmit packets to the local bus -- so zcopy
* must be inhibited. The driver still passes rx data zcopy.
*/
if((regPC & ROM_BASE_ADRS) == ROM_BASE_ADRS){
/* We are running from ROM and, for ROM apps, we must specify
* local bus space for the buffers. This code uses the upper
* half of local bus memory. It is up to the user to make a
* more suitable choice if need be.
*/
motFccBufsAdr = LOCAL_BUS_SDRAM_ADRS + (LOCAL_BUS_SDRAM_SIZE >> 1);
motFccBufsSize = LOCAL_BUS_SDRAM_SIZE >> 1;
/* for ROM apps, MOT_FCC_FLAGS *must* include the following. */
motFccFlags = 0x00005000; /*(MOT_FCC_USR_BUF_LBUS|MOT_FCC_USR_NO_ZCOPY)*/
/* NOTE! The FCC driver internally forces MOT_FCC_USR_NO_ZCOPY if
* MOT_FCC_USR_BUF_LBUS is set in MOT_FCC_FLAGS, making the
* inclusion of 'NO_ZCOPY not strictly required. The 'NO_ZCOPY
* flag can be used independently of the bus on which buffers
* reside -- for those rare apps that might need this option.
*/
}else{
/* We are running from RAM */
/* for RAM apps, let the driver find space for the buffers */
motFccBufsAdr = -1UL;
motFccBufsSize = -1UL;
motFccFlags = 0;
}
/* Chuck (PTR Group) Added: */
motFccFlags |= 0x8000 /*MOT_FCC_USR_DPRAM_ALOC*/;
/* NOTE! Regarding bus choices for BDs and buffers.
* If you give a local bus address for BDs and don't include
* MOT_FCC_USR_BD_LBUS in MOT_FCC_FLAGS, the CPM will hang.
* If you give a local bus address for buffers and don't include
* MOT_FCC_USR_BUF_LBUS in MOT_FCC_FLAGS, the CPM will hang.
* If you give a 60x bus address for buffers and/or BDs and
* mistakenly include either a 'LBUS flag, the CPM will hang.
*/
/* If you want the driver to decide where to put the BDs, set
* BOTH of the following motFccBufsDescAdr & motFccBufsDescSize
* to -1UL. If you decide to force the driver to use BDs on the
* local bus, set the following motFccBufsDescAdr to a local bus
* address and size AND be sure to add MOT_FCC_USR_BD_LBUS to the
* definition of MOT_FCC_FLAGS below. The defaults use internal
* DPRAM for BDS. You may optionally specify a 60x bus address for
* BDS. In these cases do not set the LBUS flag.
*/
motFccBufsDescSize = MOT_FCC_BDS_SIZE;
motFccBufsDescAdr = (UINT32)sys82xxDpramAlignedMalloc(MOT_FCC_BDS_SIZE,8);
if(motFccBufsDescAdr == NULL){
motFccBufsDescAdr = -1UL;
}
/*
* On the second pass through here, we actually create
* the initialization parameter string on the fly.
* Note that we will be handed our unit number on the
* second pass and we need to preserve that information.
* So we use the unit number handed from the input string.
*/
pStr = strcpy (paramStr, pParamStr);
/* Now, we get to the end of the string */
pStr += strlen (paramStr);
/* finish off the initialization parameter string */
sprintf (pStr, motFccEndParamTemplate,
(UINT) vxImmrGet (),
(unitNumber ? MOT_FCC_NUM_UNIT1 : MOT_FCC_NUM_UNIT0),
motFccBufsDescAdr,
motFccBufsDescSize,
motFccBufsAdr,
motFccBufsSize,
-1UL,-1UL,
MOT_FCC_TBD_NUM,
MOT_FCC_RBD_NUM,
MOT_FCC_PHY_ADDR,
MOT_FCC_DEF_PHY_MODE,
&motFccAnOrderTbl,
motFccFlags,
3, /* driver allocates (3 * MOT_FCC_RBD_NUM) mblks */
4 /* driver allocates (4 * MOT_FCC_RBD_NUM) clusters */
);
if ((pEnd = (END_OBJ *) motFccEndLoad (paramStr)) == (END_OBJ *)ERROR) {
logMsg ("Error: motFccEndLoad failed to load driver\n", 0, 0, 0, 0, 0, 0);
}
}
return pEnd;
}
/****************************************************************************
*
* Function : sysEnetAddrSet( unsigned char byte5,.....byte1)
*
* Purpose. : Sets the 6 byte ethernet address used by the ethernet device.
*
* Returns. : OK
*
* Notes... : None
*
*/
void sysEnetAddrSet
(
unsigned char byte5,
unsigned char byte4,
unsigned char byte3,
unsigned char byte2,
unsigned char byte1,
unsigned char byte0
)
{
sysFccEnetAddr[0] = byte5;
sysFccEnetAddr[1] = byte4;
sysFccEnetAddr[2] = byte3;
sysFccEnetAddr[3] = byte2;
sysFccEnetAddr[4] = byte1;
sysFccEnetAddr[5] = byte0;
#ifdef MAC_ADRS_IN_NVRAM
sysNvRamSet((char *)&sysFccEnetAddr[0], MAC_ADRS_LEN, NV_MAC_ADRS_OFFSET );
#endif
}
/****************************************************************************
*
* Function : sysEnetAddrGet( int unit , UINT8 * addr )
*
* Purpose. : Gets the 6 byte ethernet address used by the ethernet device.
*
* Returns. : OK
*
* Notes... : None
*
*/
STATUS sysEnetAddrGet
(
int unit , /* not used */
UINT8 * addr /* Location address is returned in */
)
{
#ifdef MAC_ADRS_IN_NVRAM
sysNvRamGet(addr, MAC_ADRS_LEN, NV_MAC_ADRS_OFFSET );
#else
/* mac address in memory only */
int n;
for ( n=0; n < MAC_ADRS_LEN ;n++)
{
*(addr+n) = (char)sysFccEnetAddr[n];
}
#endif
/* Chuck (PTR Group) Added: */
if (unit == 1)
{
addr[3] += 0x80;
}
return( OK ) ;
}
LOCAL STATUS sysMiiPhyDuplex(PHY_INFO *pPhyInfo,int *duplex)
{
UINT16 miiStat;
int retVal;
MII_READ(pPhyInfo->phyAddr,17,&miiStat,retVal);
if(retVal == OK){
*duplex = (miiStat & 0x200) ? 1 : 0;
}
return retVal;
}
#if 0
LOCAL void sysMiiInt(PHY_INFO *pPhyInfo)
{
UINT16 miiIntStatusReg;
int tmp;
/* Clear MII interrupt by reading Int status reg */
MII_READ(pPhyInfo->phyAddr,19,&miiIntStatusReg,tmp);
++miiNumLinkChgInts;
if(_func_motFccPhyLSCInt){
(* _func_motFccPhyLSCInt)(pPhyInfo->pDrvCtrl);
}
}
#endif
LOCAL STATUS sysMiiPhyInit(PHY_INFO *pPhyInfo)
{
int retVal;
retVal = miiPhyInit(pPhyInfo);
#if 0
if(retVal == OK){
int tmp;
UINT16 miiIntEnableReg;
MII_READ(pPhyInfo->phyAddr,18,&miiIntEnableReg,tmp);
if(tmp == OK){
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -