📄 sysfei82557end.c
字号:
/* sysFei82557End.c - system configuration module for fei82557End */
/* Copyright 1984 - 1999 Wind River Systems, Inc. */
/*
modification history
--------------------
01c,07mar02,kab SPR 70817: *EndLoad returns NULL on failure
01b,13apr01,pch Check fei82557EndLoad() return for NULL not ERROR
01a,20oct99,mtl written from yk 750 by teamF1
*/
/*
DESCRIPTION
This is the WRS-supplied configuration module for the VxWorks
fei82557End (fei) END driver. It performs the dynamic parameterization
of the fei82557End driver. This technique of 'just-in-time'
parameterization allows driver parameter values to be declared
as something other than static strings.
*/
#if (defined(INCLUDE_FEI_END) && defined (INCLUDE_NETWORK) \
&& defined (INCLUDE_END))
/* includes */
#include "vxWorks.h"
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
#include "end.h"
#include "config.h"
#include "fei82557End.h"
/* imports */
IMPORT FUNCPTR feiEndIntConnect;
IMPORT FUNCPTR feiEndIntDisconnect;
IMPORT END_OBJ * fei82557EndLoad (char *);
/* defines */
#ifdef I82557_DEBUG
# undef LOCAL
# define LOCAL
#endif /* I82557_DEBUG */
/* Intel EtherExpress PRO100B LAN Adapter type */
#define TYPE_PRO100B_PCI 1 /* Intel EtherExpress PRO-100B PCI */
/* EEPROM control bits */
#define EE_SK 0x01 /* shift clock */
#define EE_CS 0x02 /* chip select */
#define EE_DI 0x04 /* chip data in */
#define EE_DO 0x08 /* chip data out */
/* EEPROM opcode */
#define EE_CMD_WRITE 0x05 /* WRITE opcode, 101 */
#define EE_CMD_READ 0x06 /* READ opcode, 110 */
#define EE_CMD_ERASE 0x07 /* ERASE opcode, 111 */
/* EEPROM misc. defines */
#define EE_CMD_BITS 3 /* number of opcode bits */
#define EE_ADDR_BITS 6 /* number of address bits */
#define EE_DATA_BITS 16 /* number of data bits */
#define EE_SIZE 0x40 /* 0x40 words */
#define EE_CHECKSUM 0xbaba /* checksum */
/* unknown values */
#define UNKNOWN -1
/* FEI driver access routines */
/* typedefs */
typedef struct feiResource /* FEI_RESOURCE */
{
UINT32 membaseCsr; /* Base Address Register 0 */
UINT32 iobaseCsr; /* Base Address Register 1 */
UINT32 membaseFlash; /* Base Address Register 2 */
char irq; /* Interrupt Request Level */
UINT32 configType; /* type of configuration - unused */
UINT32 boardType; /* type of LAN board this unit is */
UINT32 pciBus; /* PCI Bus number */
UINT32 pciDevice; /* PCI Device number */
UINT32 pciFunc; /* PCI Function number */
UINT32 eeprom[0x40]; /* Ethernet Address of this unit */
INT32 timeout; /* timeout for the self-test */
INT32 str[6]; /* storage for the self-test result */
INT32 *pResults; /* pointer to the self-test result */
UINT memLength; /* required memory size */
UINT initialStateMask; /* mask parameter to vmStateSet */
UINT initialState; /* state parameter to vmStateSet */
} FEI_RESOURCE;
/* locals */
LOCAL STATUS sys557IntEnable
(
int unit /* END driver unit number */
);
LOCAL STATUS sys557IntDisable
(
int unit /* END driver unit number */
);
LOCAL UINT32 sys557LocalToPciBusAdrs (int unit, UINT32 adrs);
LOCAL UINT32 sys557PciBusToLocalAdrs (int unit, UINT32 adrs);
LOCAL UINT32 feiUnits; /* number of FEIs we found */
LOCAL FEI_RESOURCE feiResources [FEI_MAX_UNITS] =
{
{UNKNOWN, UNKNOWN, UNKNOWN, UNKNOWN, UNKNOWN,
UNKNOWN, UNKNOWN, UNKNOWN, UNKNOWN, {UNKNOWN}, UNKNOWN, {UNKNOWN}, NULL,
UNKNOWN, UNKNOWN, UNKNOWN},
{UNKNOWN, UNKNOWN, UNKNOWN, UNKNOWN, UNKNOWN,
UNKNOWN, UNKNOWN, UNKNOWN, UNKNOWN, {UNKNOWN}, UNKNOWN, {UNKNOWN}, NULL,
UNKNOWN, UNKNOWN, UNKNOWN},
{UNKNOWN, UNKNOWN, UNKNOWN, UNKNOWN, UNKNOWN,
UNKNOWN, UNKNOWN, UNKNOWN, UNKNOWN, {UNKNOWN}, UNKNOWN, {UNKNOWN}, NULL,
UNKNOWN, UNKNOWN, UNKNOWN},
{UNKNOWN, UNKNOWN, UNKNOWN, UNKNOWN, UNKNOWN,
UNKNOWN, UNKNOWN, UNKNOWN, UNKNOWN, {UNKNOWN}, UNKNOWN, {UNKNOWN}, NULL,
UNKNOWN, UNKNOWN, UNKNOWN},
};
LOCAL const char *phys[] =
{
"None", "i82553-A/B", "i82553-C", "i82503",
"DP83840", "80c240", "80c24", "unknown"
};
enum phy_chips
{
NonSuchPhy=0, I82553AB, I82553C, I82503,
DP83840, S80C240, S80C24, UndefinedPhy
};
LOCAL const char *connectors[] = {" RJ45", " BNC", " AUI", " MII"};
/* forward declarations */
LOCAL UINT16 sys557eepromRead (int unit, int location);
LOCAL UINT16 sys557mdioRead (int unit, int phyId, int location);
LOCAL UINT16 sys557mdioWrite (int unit, int phyId, int location, int value);
LOCAL int sys557IntAck (int unit);
/******************************************************************************
*
* sysFei82557EndLoad - load fei82557 (fei) device.
*
* This routine loads the fei device with initial parameters.
*
* RETURNS: pointer to END object or NULL.
*
* SEE ALSO: fei82557EndLoad()
*/
END_OBJ * sysFei82557EndLoad
(
char * pParamStr, /* ptr to initialization parameter string */
void * unused /* unused optional argument */
)
{
/*
* The fei82557End driver END_LOAD_STRING should be:
* "<memBase>:<memSize>:<nTfds>:<nRfds>:<flags>"
*
*/
char * cp;
char paramStr [END_INIT_STR_MAX]; /* from end.h */
END_OBJ * pEnd;
if (strlen (pParamStr) == 0)
{
/*
* muxDevLoad() calls us twice. If the string is
* zero length, it is asking for the device name so
* we just return whatever fei82557EndLoad provides.
*/
pEnd = fei82557EndLoad (pParamStr);
}
else
{
/*
* On the second pass though here, we actually create
* the initialization parameter string on the fly.
* Note that we will be handed our unit number on the
* second pass through and we need to preserve that information.
* So we use the unit number handed from the input string.
*/
cp = strcpy (paramStr, pParamStr); /* cp points to paramStr */
/* Now, we advance cp, by finding the end the string */
cp += strlen (paramStr);
/* finish off the initialization parameter string */
sprintf (cp, "-1:0x00:0x20:0x20:0x00");
if ((pEnd = fei82557EndLoad (paramStr)) == (END_OBJ *)NULL)
{
printf ("Error: device failed fei82557EndLoad routine.\n");
}
}
return (pEnd);
}
/*******************************************************************************
*
* sys557PciInit - prepare LAN adapter for 82557 initialization
*
* This routine find out the PCI device, and map its memory and IO address.
* It must be done prior to initializing the 82557, sys557Init(). Also
* must be done prior to MMU initialization, usrMmuInit().
*
* RETURNS: N/A
*/
void sys557PciInit (void)
{
FEI_RESOURCE *pReso;
int pciBus;
int pciDevice;
int pciFunc;
int unit;
BOOL duplicate;
UINT32 membaseCsr;
UINT32 iobaseCsr;
UINT32 membaseFlash;
char irq;
int ix;
for (unit = 0; unit < FEI_MAX_UNITS; unit++)
{
if (pciFindDevice (PRO100B_PCI_VENDOR_ID, PRO100B_PCI_DEVICE_ID, unit,
&pciBus, &pciDevice, &pciFunc) != OK)
break;
/* check the duplicate */
pReso = &feiResources [0];
duplicate = FALSE;
for (ix = 0; ix < FEI_MAX_UNITS; ix++, pReso++)
{
if ((ix != unit) && (pReso->pciBus == pciBus) &&
(pReso->pciDevice == pciDevice) && (pReso->pciFunc == pciFunc))
duplicate = TRUE;
}
if (duplicate)
continue;
/* we found the right one */
pReso = &feiResources [unit];
pReso->pciBus = pciBus;
pReso->pciDevice = pciDevice;
pReso->pciFunc = pciFunc;
if(unit ==0)
{
membaseCsr = 0xed000000;
iobaseCsr = 0xf400;
irq = 0x3;
pciConfigOutLong(pReso->pciBus, pReso->pciDevice, pReso->pciFunc,0x10,membaseCsr);
pciConfigOutLong(pReso->pciBus, pReso->pciDevice, pReso->pciFunc,0x14,iobaseCsr);
pciConfigOutByte(pReso->pciBus, pReso->pciDevice, pReso->pciFunc,0x3c,irq);
}
else
{
membaseCsr = 0xee000000;
iobaseCsr = 0xf600;
irq = 0x4;
pciConfigOutLong(pReso->pciBus, pReso->pciDevice, pReso->pciFunc,0x10,membaseCsr);
pciConfigOutLong(pReso->pciBus, pReso->pciDevice, pReso->pciFunc,0x14,iobaseCsr);
pciConfigOutByte(pReso->pciBus, pReso->pciDevice, pReso->pciFunc,0x3c,irq);
}
/* get memory base address and IO base address */
pciConfigInLong (pReso->pciBus, pReso->pciDevice, pReso->pciFunc,
PCI_CFG_BASE_ADDRESS_0, &membaseCsr);
pciConfigInLong (pReso->pciBus, pReso->pciDevice, pReso->pciFunc,
PCI_CFG_BASE_ADDRESS_1, &iobaseCsr);
pciConfigInLong (pReso->pciBus, pReso->pciDevice, pReso->pciFunc,
PCI_CFG_BASE_ADDRESS_2, &membaseFlash);
pciConfigInByte (pReso->pciBus, pReso->pciDevice, pReso->pciFunc,
PCI_CFG_DEV_INT_LINE, &irq);
/*printf("\nunit = %d,membaseCsr=0x%x,iobaseCsr=0x%x,membaseFlash=0x%x,irq=0x%x\n",unit,membaseCsr,iobaseCsr,membaseFlash,irq);*/
membaseCsr &= PCI_MEMBASE_MASK;
iobaseCsr &= PCI_IOBASE_MASK;
membaseFlash &= PCI_MEMBASE_MASK;
/*printf("\nunit = %d,membaseCsr1=0x%x,iobaseCsr1=0x%x,membaseFlash1=0x%x,irq1=0x%x\n",unit,membaseCsr,iobaseCsr,membaseFlash,irq);*/
/* over write the resource table with read value */
pReso->membaseCsr = membaseCsr;
pReso->iobaseCsr = iobaseCsr;
pReso->membaseFlash = membaseFlash;
pReso->irq = irq;
/* enable mapped memory and IO addresses */
pciConfigOutWord (pReso->pciBus, pReso->pciDevice, pReso->pciFunc,
PCI_CFG_COMMAND, PCI_CMD_IO_ENABLE |
PCI_CMD_MEM_ENABLE | PCI_CMD_MASTER_ENABLE);
feiUnits++;
}
/* specify the interrupt connect/disconnect routines to be used */
feiEndIntConnect = (FUNCPTR) intConnect;
feiEndIntDisconnect = NULL;
}
/*******************************************************************************
*
* sys557Init - prepare LAN adapter for 82557 initialization
*
* This routine is expected to perform any adapter-specific or target-specific
* initialization that must be done prior to initializing the 82557.
*
* The 82557 driver calls this routine from the driver attach routine before
* any other routines in this library.
*
* This routine returns the interrupt level the <pIntLvl> parameter.
*
* RETURNS: OK or ERROR if the adapter could not be prepared for initialization.
*/
STATUS sys557Init
(
int unit, /* unit number */
FEI_BOARD_INFO *pBoard /* board information for the end driver */
)
{
FEI_RESOURCE *pReso = &feiResources [unit];
UINT16 sum = 0;
int ix;
int iy;
UINT16 value;
if (unit >= feiUnits)
return (ERROR);
/* locate the 82557 based adapter. PRO100B and XXX */
if (pReso->boardType == TYPE_PRO100B_PCI) /* only setup once */
{
}
else
{
/* read the configuration in EEPROM */
for (ix = 0; ix < EE_SIZE; ix++)
{
value = sys557eepromRead (unit, ix);
pReso->eeprom[ix] = value;
sum += value;
}
if (sum != EE_CHECKSUM)
printf ("i82557(%d): Invalid EEPROM checksum %#4.4x\n", unit, sum);
/* DP83840 specific setup */
if (((pReso->eeprom[6]>>8) & 0x3f) == DP83840)
{
int reg23 = sys557mdioRead (unit, pReso->eeprom[6] & 0x1f, 23);
sys557mdioWrite (unit, pReso->eeprom[6] & 0x1f, 23, reg23 | 0x0420);
}
/* perform a system self-test. */
pReso->timeout = 16000; /* Timeout for set-test. */
pReso->pResults = (int *) ((((int) pReso->str) + 0xf) & ~0xf);
pReso->pResults[0] = 0;
pReso->pResults[1] = -1;
sysOutLong (PCI_MEMIO2LOCAL ((pReso->membaseCsr + SCB_PORT)),
(int)pReso->pResults | 1);
do {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -