blob: 8372ba3345cb09a4a581107edc08c97145bbddc4 [file] [log] [blame]
#include <Copyright.h>
/********************************************************************************
* gtSysConfig.c
*
* DESCRIPTION:
* API definitions for system configuration, and enabling.
*
* DEPENDENCIES:
* None.
*
* FILE REVISION NUMBER:
* $Revision: 4 $
*
*******************************************************************************/
#include <msApi.h>
#include <gtDrvConfig.h>
#include <gtSem.h>
#include <platformDeps.h>
static GT_BOOL gtRegister(GT_QD_DEV *dev, BSP_FUNCTIONS* pBSPFunctions);
/*******************************************************************************
* qdLoadDriver
*
* DESCRIPTION:
* QuarterDeck Driver Initialization Routine.
* This is the first routine that needs be called by system software.
* It takes *cfg from system software, and retures a pointer (*dev)
* to a data structure which includes infomation related to this QuarterDeck
* device. This pointer (*dev) is then used for all the API functions.
*
* INPUTS:
* cfg - Holds device configuration parameters provided by system software.
*
* OUTPUTS:
* dev - Holds device information to be used for each API call.
*
* RETURNS:
* GT_OK - on success
* GT_FAIL - on error
* GT_ALREADY_EXIST - if device already started
* GT_BAD_PARAM - on bad parameters
*
* COMMENTS:
* qdUnloadDriver is also provided to do driver cleanup.
*
*******************************************************************************/
GT_STATUS qdLoadDriver
(
IN GT_SYS_CONFIG *cfg,
OUT GT_QD_DEV *dev
)
{
GT_STATUS retVal;
GT_LPORT port;
DBG_INFO(("qdLoadDriver Called.\n"));
/* Check for parameters validity */
if(dev == NULL)
{
DBG_INFO(("Failed.\n"));
return GT_BAD_PARAM;
}
/* Check for parameters validity */
if(cfg == NULL)
{
DBG_INFO(("Failed.\n"));
return GT_BAD_PARAM;
}
/* The initialization was already done. */
if(dev->devEnabled)
{
DBG_INFO(("QuarterDeck already started.\n"));
return GT_ALREADY_EXIST;
}
if(gtRegister(dev,&(cfg->BSPFunctions)) != GT_TRUE)
{
DBG_INFO(("gtRegister Failed.\n"));
return GT_FAIL;
}
dev->accessMode = (GT_U8)cfg->mode.scanMode;
if (dev->accessMode == SMI_MULTI_ADDR_MODE)
{
dev->baseRegAddr = 0;
dev->phyAddr = (GT_U8)cfg->mode.baseAddr;
}
else
{
dev->baseRegAddr = (GT_U8)cfg->mode.baseAddr;
dev->phyAddr = 0;
}
/* Initialize the driver */
retVal = driverConfig(dev);
if(retVal != GT_OK)
{
DBG_INFO(("driverConfig Failed.\n"));
return retVal;
}
/* Initialize dev fields. */
dev->cpuPortNum = cfg->cpuPortNum;
dev->maxPhyNum = 5;
dev->devGroup = 0;
dev->devStorage = 0;
/* Assign Device Name */
switch(dev->deviceId)
{
case GT_88E6021:
dev->numOfPorts = 3;
dev->maxPorts = 3;
dev->maxPhyNum = 2;
dev->validPortVec = (1 << dev->numOfPorts) - 1;
dev->validPhyVec = (1 << dev->maxPhyNum) - 1;
dev->devName = DEV_88E6021;
break;
case GT_88E6051:
dev->numOfPorts = 5;
dev->maxPorts = 5;
dev->maxPhyNum = 5;
dev->validPortVec = (1 << dev->numOfPorts) - 1;
dev->validPhyVec = (1 << dev->maxPhyNum) - 1;
dev->devName = DEV_88E6051;
break;
case GT_88E6052:
dev->numOfPorts = 7;
dev->maxPorts = 7;
dev->maxPhyNum = 5;
dev->validPortVec = (1 << dev->numOfPorts) - 1;
dev->validPhyVec = (1 << dev->maxPhyNum) - 1;
dev->devName = DEV_88E6052;
break;
case GT_88E6060:
if((dev->cpuPortNum != 4)&&(dev->cpuPortNum != 5))
{
return GT_FAIL;
}
dev->numOfPorts = 6;
dev->maxPorts = 6;
dev->maxPhyNum = 5;
dev->validPortVec = (1 << dev->numOfPorts) - 1;
dev->validPhyVec = (1 << dev->maxPhyNum) - 1;
dev->devName = DEV_88E6060;
break;
case GT_88E6031:
dev->numOfPorts = 3;
dev->maxPorts = 6;
dev->maxPhyNum = 3;
dev->validPortVec = 0x31; /* port 0, 4, and 5 */
dev->validPhyVec = 0x31; /* port 0, 4, and 5 */
dev->devName = DEV_88E6061;
break;
case GT_88E6061:
dev->numOfPorts = 6;
dev->maxPorts = 6;
dev->maxPhyNum = 6;
dev->validPortVec = (1 << dev->numOfPorts) - 1;
dev->validPhyVec = (1 << dev->maxPhyNum) - 1;
dev->devName = DEV_88E6061;
break;
case GT_88E6035:
dev->numOfPorts = 3;
dev->maxPorts = 6;
dev->maxPhyNum = 3;
dev->validPortVec = 0x31; /* port 0, 4, and 5 */
dev->validPhyVec = 0x31; /* port 0, 4, and 5 */
dev->devName = DEV_88E6065;
break;
case GT_88E6055:
dev->numOfPorts = 5;
dev->maxPorts = 6;
dev->maxPhyNum = 5;
dev->validPortVec = 0x2F; /* port 0,1,2,3, and 5 */
dev->validPhyVec = 0x2F; /* port 0,1,2,3, and 5 */
dev->devName = DEV_88E6065;
break;
case GT_88E6065:
dev->numOfPorts = 6;
dev->maxPorts = 6;
dev->maxPhyNum = 6;
dev->validPortVec = (1 << dev->numOfPorts) - 1;
dev->validPhyVec = (1 << dev->maxPhyNum) - 1;
dev->devName = DEV_88E6065;
break;
case GT_88E6063:
dev->numOfPorts = 7;
dev->maxPorts = 7;
dev->maxPhyNum = 5;
dev->validPortVec = (1 << dev->numOfPorts) - 1;
dev->validPhyVec = (1 << dev->maxPhyNum) - 1;
dev->devName = DEV_88E6063;
break;
case GT_FH_VPN:
dev->numOfPorts = 7;
dev->maxPorts = 7;
dev->maxPhyNum = 5;
dev->validPortVec = (1 << dev->numOfPorts) - 1;
dev->validPhyVec = (1 << dev->maxPhyNum) - 1;
dev->devName = DEV_FH_VPN;
break;
case GT_FF_EG:
if(dev->cpuPortNum != 5)
{
return GT_FAIL;
}
dev->numOfPorts = 6;
dev->maxPorts = 6;
dev->maxPhyNum = 5;
dev->validPortVec = (1 << dev->numOfPorts) - 1;
dev->validPhyVec = (1 << dev->maxPhyNum) - 1;
dev->devName = DEV_FF_EG;
break;
case GT_FF_HG:
dev->numOfPorts = 7;
dev->maxPorts = 7;
dev->maxPhyNum = 5;
dev->validPortVec = (1 << dev->numOfPorts) - 1;
dev->validPhyVec = (1 << dev->maxPhyNum) - 1;
dev->devName = DEV_FF_HG;
break;
case GT_88E6083:
dev->numOfPorts = 10;
dev->maxPorts = 10;
dev->maxPhyNum = 8;
dev->validPortVec = (1 << dev->numOfPorts) - 1;
dev->validPhyVec = (1 << dev->maxPhyNum) - 1;
dev->devName = DEV_88E6083;
break;
case GT_88E6153:
dev->numOfPorts = 6;
dev->maxPorts = 6;
dev->maxPhyNum = 6;
dev->validPortVec = (1 << dev->numOfPorts) - 1;
dev->validPhyVec = (1 << dev->maxPhyNum) - 1;
dev->devName = DEV_88E6183;
break;
case GT_88E6181:
dev->numOfPorts = 8;
dev->maxPorts = 8;
dev->maxPhyNum = 8;
dev->validPortVec = (1 << dev->numOfPorts) - 1;
dev->validPhyVec = (1 << dev->maxPhyNum) - 1;
dev->devName = DEV_88E6181;
break;
case GT_88E6183:
dev->numOfPorts = 10;
dev->maxPorts = 10;
dev->maxPhyNum = 10;
dev->validPortVec = (1 << dev->numOfPorts) - 1;
dev->validPhyVec = (1 << dev->maxPhyNum) - 1;
dev->devName = DEV_88E6183;
break;
case GT_88E6093:
dev->numOfPorts = 11;
dev->maxPorts = 11;
dev->maxPhyNum = 11;
dev->validPortVec = (1 << dev->numOfPorts) - 1;
dev->validPhyVec = (1 << dev->maxPhyNum) - 1;
dev->devName = DEV_88E6093;
break;
case GT_88E6092:
dev->numOfPorts = 11;
dev->maxPorts = 11;
dev->maxPhyNum = 11;
dev->validPortVec = (1 << dev->numOfPorts) - 1;
dev->validPhyVec = (1 << dev->maxPhyNum) - 1;
dev->devName = DEV_88E6092;
break;
case GT_88E6095:
dev->numOfPorts = 11;
dev->maxPorts = 11;
dev->maxPhyNum = 11;
dev->validPortVec = (1 << dev->numOfPorts) - 1;
dev->validPhyVec = (1 << dev->maxPhyNum) - 1;
dev->devName = DEV_88E6095;
break;
case GT_88E6045:
dev->numOfPorts = 6;
dev->maxPorts = 11;
dev->maxPhyNum = 11;
dev->validPortVec = 0x60F;
dev->validPhyVec = 0x60F;
dev->devName = DEV_88E6095;
break;
case GT_88E6097:
dev->numOfPorts = 11;
dev->maxPorts = 11;
dev->maxPhyNum = 11;
dev->validPortVec = (1 << dev->numOfPorts) - 1;
dev->validPhyVec = (1 << dev->maxPhyNum) - 1;
dev->devName = DEV_88E6097;
break;
case GT_88E6096:
dev->numOfPorts = 11;
dev->maxPorts = 11;
dev->maxPhyNum = 11;
dev->validPortVec = (1 << dev->numOfPorts) - 1;
dev->validPhyVec = (1 << dev->maxPhyNum) - 1;
dev->devName = DEV_88E6096;
break;
case GT_88E6047:
dev->numOfPorts = 6;
dev->maxPorts = 11;
dev->maxPhyNum = 11;
dev->validPortVec = 0x60F;
dev->validPhyVec = 0x60F;
dev->devName = DEV_88E6097;
break;
case GT_88E6046:
dev->numOfPorts = 6;
dev->maxPorts = 11;
dev->maxPhyNum = 11;
dev->validPortVec = 0x60F;
dev->validPhyVec = 0x60F;
dev->devName = DEV_88E6096;
break;
case GT_88E6085:
dev->numOfPorts = 10;
dev->maxPorts = 11;
dev->maxPhyNum = 11;
dev->validPortVec = 0x6FF;
dev->validPhyVec = 0x6FF;
dev->devName = DEV_88E6096;
break;
case GT_88E6152:
dev->numOfPorts = 6;
dev->maxPorts = 6;
dev->maxPhyNum = 6;
dev->validPortVec = (1 << dev->numOfPorts) - 1;
dev->validPhyVec = (1 << dev->maxPhyNum) - 1;
dev->devName = DEV_88E6182;
break;
case GT_88E6155:
dev->numOfPorts = 6;
dev->maxPorts = 6;
dev->maxPhyNum = 6;
dev->validPortVec = (1 << dev->numOfPorts) - 1;
dev->validPhyVec = (1 << dev->maxPhyNum) - 1;
dev->devName = DEV_88E6185;
break;
case GT_88E6182:
dev->numOfPorts = 10;
dev->maxPorts = 10;
dev->maxPhyNum = 10;
dev->validPortVec = (1 << dev->numOfPorts) - 1;
dev->validPhyVec = (1 << dev->maxPhyNum) - 1;
dev->devName = DEV_88E6182;
break;
case GT_88E6185:
dev->numOfPorts = 10;
dev->maxPorts = 10;
dev->maxPhyNum = 10;
dev->validPortVec = (1 << dev->numOfPorts) - 1;
dev->validPhyVec = (1 << dev->maxPhyNum) - 1;
dev->devName = DEV_88E6185;
break;
case GT_88E6121:
dev->numOfPorts = 3;
dev->maxPorts = 8;
dev->maxPhyNum = 3;
dev->validPortVec = 0xE; /* port 1, 2, and 3 */
dev->validPhyVec = 0xE; /* port 1, 2, and 3 */
dev->devName = DEV_88E6108;
break;
case GT_88E6122:
dev->numOfPorts = 6;
dev->maxPorts = 8;
dev->maxPhyNum = 16;
dev->validPortVec = 0x7E; /* port 1 ~ 6 */
dev->validPhyVec = 0xF07E; /* port 1 ~ 6, 12 ~ 15 (serdes) */
dev->validSerdesVec = 0xF000;
dev->devName = DEV_88E6108;
break;
case GT_88E6131:
case GT_88E6108:
dev->numOfPorts = 8;
dev->maxPorts = 8;
dev->maxPhyNum = 16;
dev->validPortVec = (1 << dev->numOfPorts) - 1;
dev->validPhyVec = (1 << dev->maxPhyNum) - 1;
dev->validSerdesVec = 0xF000;
dev->devName = DEV_88E6108;
break;
case GT_88E6123:
dev->numOfPorts = 3;
dev->maxPorts = 6;
dev->maxPhyNum = 14;
dev->validPortVec = 0x23;
dev->validPhyVec = 0x303F;
dev->validSerdesVec = 0x3000;
dev->devName = DEV_88E6161;
break;
case GT_88E6140:
dev->numOfPorts = 6;
dev->maxPorts = 6;
dev->maxPhyNum = 14;
dev->validPortVec = (1 << dev->numOfPorts) - 1;
dev->validPhyVec = 0x303F;
dev->validSerdesVec = 0x3000;
dev->devName = DEV_88E6165;
break;
case GT_88E6161:
dev->numOfPorts = 6;
dev->maxPorts = 6;
dev->maxPhyNum = 14;
dev->validPortVec = (1 << dev->numOfPorts) - 1;
dev->validPhyVec = 0x303F;
dev->validSerdesVec = 0x3000;
dev->devName = DEV_88E6161;
break;
case GT_88E6165:
dev->numOfPorts = 6;
dev->maxPorts = 6;
dev->maxPhyNum = 14;
dev->validPortVec = (1 << dev->numOfPorts) - 1;
dev->validPhyVec = 0x303F;
dev->validSerdesVec = 0x3000;
dev->devName = DEV_88E6165;
break;
case GT_KW2_INT :
dev->deviceId = GT_88E6351;
/* fall through */
case GT_88E6351:
dev->numOfPorts = 7;
dev->maxPorts = 7;
dev->maxPhyNum = 7;
dev->validPortVec = (1 << dev->numOfPorts) - 1;
dev->validPhyVec = 0x7F;
dev->devName = DEV_88E6351;
break;
case GT_88E6175:
dev->numOfPorts = 7;
dev->maxPorts = 7;
dev->maxPhyNum = 7;
dev->validPortVec = (1 << dev->numOfPorts) - 1;
dev->validPhyVec = 0x7F;
dev->devName = DEV_88E6175;
break;
case GT_88E6125 :
dev->numOfPorts = 4;
dev->maxPorts = 7;
dev->maxPhyNum = 7;
dev->validPortVec = (1 << dev->numOfPorts) - 1;
dev->validPortVec &= ~(0x7);
dev->validPhyVec = 0x78;
dev->devName = DEV_88E6171;
break;
case GT_88E6171 :
dev->numOfPorts = 7;
dev->maxPorts = 7;
dev->maxPhyNum = 7;
dev->validPortVec = (1 << dev->numOfPorts) - 1;
dev->validPhyVec = 0x7F;
dev->devName = DEV_88E6171;
break;
case GT_88E6321 :
dev->numOfPorts = 4;
dev->maxPorts = 7;
dev->maxPhyNum = 7;
dev->validPortVec = (1 << dev->numOfPorts) - 1;
dev->validPortVec &= ~(0x7);
dev->validPhyVec = 0x78;
dev->devName = DEV_88E6371;
break;
case GT_88E6350 :
dev->numOfPorts = 7;
dev->maxPorts = 7;
dev->maxPhyNum = 7;
dev->validPortVec = (1 << dev->numOfPorts) - 1;
dev->validPhyVec = 0x7F;
dev->devName = DEV_88E6371;
break;
default:
DBG_INFO(("Unknown Device. Initialization failed\n"));
return GT_FAIL;
}
dev->cpuPortNum = GT_PORT_2_LPORT(cfg->cpuPortNum);
if(dev->cpuPortNum == GT_INVALID_PORT)
{
if(GT_LPORT_2_PORT((GT_LPORT)cfg->cpuPortNum) != GT_INVALID_PORT)
{
dev->cpuPortNum = cfg->cpuPortNum;
}
else
{
return GT_BAD_CPU_PORT;
}
}
/* Initialize the MultiAddress Register Access semaphore. */
if((dev->multiAddrSem = gtSemCreate(dev,GT_SEM_FULL)) == 0)
{
DBG_INFO(("semCreate Failed.\n"));
qdUnloadDriver(dev);
return GT_FAIL;
}
/* Initialize the ATU semaphore. */
if((dev->atuRegsSem = gtSemCreate(dev,GT_SEM_FULL)) == 0)
{
DBG_INFO(("semCreate Failed.\n"));
qdUnloadDriver(dev);
return GT_FAIL;
}
/* Initialize the VTU semaphore. */
if((dev->vtuRegsSem = gtSemCreate(dev,GT_SEM_FULL)) == 0)
{
DBG_INFO(("semCreate Failed.\n"));
qdUnloadDriver(dev);
return GT_FAIL;
}
/* Initialize the STATS semaphore. */
if((dev->statsRegsSem = gtSemCreate(dev,GT_SEM_FULL)) == 0)
{
DBG_INFO(("semCreate Failed.\n"));
qdUnloadDriver(dev);
return GT_FAIL;
}
/* Initialize the PIRL semaphore. */
if((dev->pirlRegsSem = gtSemCreate(dev,GT_SEM_FULL)) == 0)
{
DBG_INFO(("semCreate Failed.\n"));
qdUnloadDriver(dev);
return GT_FAIL;
}
/* Initialize the PTP semaphore. */
if((dev->ptpRegsSem = gtSemCreate(dev,GT_SEM_FULL)) == 0)
{
DBG_INFO(("semCreate Failed.\n"));
qdUnloadDriver(dev);
return GT_FAIL;
}
/* Initialize the Table semaphore. */
if((dev->tblRegsSem = gtSemCreate(dev,GT_SEM_FULL)) == 0)
{
DBG_INFO(("semCreate Failed.\n"));
qdUnloadDriver(dev);
return GT_FAIL;
}
/* Initialize the EEPROM Configuration semaphore. */
if((dev->eepromRegsSem = gtSemCreate(dev,GT_SEM_FULL)) == 0)
{
DBG_INFO(("semCreate Failed.\n"));
qdUnloadDriver(dev);
return GT_FAIL;
}
/* Initialize the PHY Device Register Access semaphore. */
if((dev->phyRegsSem = gtSemCreate(dev,GT_SEM_FULL)) == 0)
{
DBG_INFO(("semCreate Failed.\n"));
qdUnloadDriver(dev);
return GT_FAIL;
}
/* Initialize the ports states to forwarding mode. */
if(cfg->initPorts == GT_TRUE)
{
for (port=0; port<dev->numOfPorts; port++)
{
if((retVal = gstpSetPortState(dev,port,GT_PORT_FORWARDING)) != GT_OK)
{
DBG_INFO(("Failed.\n"));
qdUnloadDriver(dev);
return retVal;
}
}
}
if(cfg->skipInitSetup == GT_SKIP_INIT_SETUP)
{
dev->devEnabled = 1;
dev->devNum = cfg->devNum;
DBG_INFO(("OK.\n"));
return GT_OK;
}
if(IS_IN_DEV_GROUP(dev,DEV_ENHANCED_CPU_PORT))
{
if((retVal = gsysSetRsvd2CpuEnables(dev,0)) != GT_OK)
{
DBG_INFO(("gsysGetRsvd2CpuEnables failed.\n"));
qdUnloadDriver(dev);
return retVal;
}
if((retVal = gsysSetRsvd2Cpu(dev,GT_FALSE)) != GT_OK)
{
DBG_INFO(("gsysSetRsvd2Cpu failed.\n"));
qdUnloadDriver(dev);
return retVal;
}
}
if (IS_IN_DEV_GROUP(dev,DEV_CPU_DEST_PER_PORT))
{
for (port=0; port<dev->numOfPorts; port++)
{
retVal = gprtSetCPUPort(dev,port,dev->cpuPortNum);
if(retVal != GT_OK)
{
DBG_INFO(("Failed.\n"));
qdUnloadDriver(dev);
return retVal;
}
}
}
if(IS_IN_DEV_GROUP(dev,DEV_CPU_PORT))
{
retVal = gsysSetCPUPort(dev,dev->cpuPortNum);
if(retVal != GT_OK)
{
DBG_INFO(("Failed.\n"));
qdUnloadDriver(dev);
return retVal;
}
}
if(IS_IN_DEV_GROUP(dev,DEV_CPU_DEST))
{
retVal = gsysSetCPUDest(dev,dev->cpuPortNum);
if(retVal != GT_OK)
{
DBG_INFO(("Failed.\n"));
qdUnloadDriver(dev);
return retVal;
}
}
if(IS_IN_DEV_GROUP(dev,DEV_MULTICAST))
{
if((retVal = gsysSetRsvd2Cpu(dev,GT_FALSE)) != GT_OK)
{
DBG_INFO(("gsysSetRsvd2Cpu failed.\n"));
qdUnloadDriver(dev);
return retVal;
}
}
if (IS_IN_DEV_GROUP(dev,DEV_PIRL_RESOURCE))
{
retVal = gpirlInitialize(dev);
if(retVal != GT_OK)
{
DBG_INFO(("Failed.\n"));
qdUnloadDriver(dev);
return retVal;
}
}
if (IS_IN_DEV_GROUP(dev,DEV_PIRL2_RESOURCE))
{
retVal = gpirl2Initialize(dev);
if(retVal != GT_OK)
{
DBG_INFO(("Failed.\n"));
qdUnloadDriver(dev);
return retVal;
}
}
dev->devEnabled = 1;
dev->devNum = cfg->devNum;
DBG_INFO(("OK.\n"));
return GT_OK;
}
/*******************************************************************************
* sysEnable
*
* DESCRIPTION:
* This function enables the system for full operation.
*
* INPUTS:
* None.
*
* OUTPUTS:
* None.
*
* RETURNS:
* GT_OK - on success
* GT_FAIL - on error
*
* COMMENTS:
* 1. This function should be called only after successful execution of
* qdLoadDriver().
*
*******************************************************************************/
GT_STATUS sysEnable( GT_QD_DEV *dev)
{
DBG_INFO(("sysEnable Called.\n"));
DBG_INFO(("OK.\n"));
return driverEnable(dev);
}
/*******************************************************************************
* qdUnloadDriver
*
* DESCRIPTION:
* This function unloads the QuaterDeck Driver.
*
* INPUTS:
* None.
*
* OUTPUTS:
* None.
*
* RETURNS:
* GT_OK - on success
* GT_FAIL - on error
*
* COMMENTS:
* 1. This function should be called only after successful execution of
* qdLoadDriver().
*
*******************************************************************************/
GT_STATUS qdUnloadDriver
(
IN GT_QD_DEV* dev
)
{
DBG_INFO(("qdUnloadDriver Called.\n"));
/* Delete the MultiAddress mode reagister access semaphore. */
if(gtSemDelete(dev,dev->multiAddrSem) != GT_OK)
{
DBG_INFO(("Failed.\n"));
return GT_FAIL;
}
/* Delete the ATU semaphore. */
if(gtSemDelete(dev,dev->atuRegsSem) != GT_OK)
{
DBG_INFO(("Failed.\n"));
return GT_FAIL;
}
/* Delete the VTU semaphore. */
if(gtSemDelete(dev,dev->vtuRegsSem) != GT_OK)
{
DBG_INFO(("Failed.\n"));
return GT_FAIL;
}
/* Delete the STATS semaphore. */
if(gtSemDelete(dev,dev->statsRegsSem) != GT_OK)
{
DBG_INFO(("Failed.\n"));
return GT_FAIL;
}
/* Delete the PIRL semaphore. */
if(gtSemDelete(dev,dev->pirlRegsSem) != GT_OK)
{
DBG_INFO(("Failed.\n"));
return GT_FAIL;
}
/* Delete the PTP semaphore. */
if(gtSemDelete(dev,dev->ptpRegsSem) != GT_OK)
{
DBG_INFO(("Failed.\n"));
return GT_FAIL;
}
/* Delete the Table semaphore. */
if(gtSemDelete(dev,dev->tblRegsSem) != GT_OK)
{
DBG_INFO(("Failed.\n"));
return GT_FAIL;
}
/* Delete the EEPROM Configuration semaphore. */
if(gtSemDelete(dev,dev->eepromRegsSem) != GT_OK)
{
DBG_INFO(("Failed.\n"));
return GT_FAIL;
}
/* Delete the PHY Device semaphore. */
if(gtSemDelete(dev,dev->phyRegsSem) != GT_OK)
{
DBG_INFO(("Failed.\n"));
return GT_FAIL;
}
gtMemSet(dev,0,sizeof(GT_QD_DEV));
return GT_OK;
}
/*******************************************************************************
* gtRegister
*
* DESCRIPTION:
* BSP should register the following functions:
* 1) MII Read - (Input, must provide)
* allows QuarterDeck driver to read QuarterDeck device registers.
* 2) MII Write - (Input, must provice)
* allows QuarterDeck driver to write QuarterDeck device registers.
* 3) Semaphore Create - (Input, optional)
* OS specific Semaphore Creat function.
* 4) Semaphore Delete - (Input, optional)
* OS specific Semaphore Delete function.
* 5) Semaphore Take - (Input, optional)
* OS specific Semaphore Take function.
* 6) Semaphore Give - (Input, optional)
* OS specific Semaphore Give function.
* Notes: 3) ~ 6) should be provided all or should not be provided at all.
*
* INPUTS:
* pBSPFunctions - pointer to the structure for above functions.
*
* OUTPUTS:
* None.
*
* RETURNS:
* GT_TRUE, if input is valid. GT_FALSE, otherwise.
*
* COMMENTS:
* This function should be called only once.
*
*******************************************************************************/
static GT_BOOL gtRegister(GT_QD_DEV *dev, BSP_FUNCTIONS* pBSPFunctions)
{
dev->fgtReadMii = pBSPFunctions->readMii;
dev->fgtWriteMii = pBSPFunctions->writeMii;
dev->semCreate = pBSPFunctions->semCreate;
dev->semDelete = pBSPFunctions->semDelete;
dev->semTake = pBSPFunctions->semTake ;
dev->semGive = pBSPFunctions->semGive ;
return GT_TRUE;
}