blob: d7a7d5b3e4476cd17cc1fd17ee9c4723241bc020 [file] [log] [blame]
#include <Copyright.h>
/********************************************************************************
* msApiInit.c
*
* DESCRIPTION:
* MS API initialization routine for devices supporting Multi Address Mode,
* such as 88E6183. Following setup will be used for this sample code.
*
* ------------------
* |CPU Ethernet Dev|
* ------------------
* |
* |
* | 8--------------9 8--------------9 8--------------
* |----| QD Device 0|------| QD Device 1|-----| QD Device 2|
* -------------- -------------- --------------
* 0 1 2 ... 7 0 1 2 ... 7 0 1 2 ... 7
*
*
* Ethernet port of CPU is connected to port 8 of Device 0,
* port 9 of Device 0 is connected to port 8 of Device 1, and
* port 9 of Device 1 is connected to port 8 of Device 2.
*
* Device 0 uses Phy Address 1,
* Device 1 uses Phy Address 2, and
* Device 2 uses Phy Address 3
* Notes: Phy Address 0 cannot be used in a Multi Chip Address Mode.
*
* Each Switch Device has to be configured to Multi Chip Address Mode.
* For detailed information for Multi Chip Address Mode configuration,
* please refer to your device's Datasheet.
*
* DEPENDENCIES: Platform
*
* FILE REVISION NUMBER:
*
*******************************************************************************/
#include "msSample.h"
/*
#define MULTI_ADDR_MODE
#define MANUAL_MODE
*/
#define MULTI_ADDR_MODE
#define N_OF_QD_DEVICES 3 /* number of 88E6183 devices connected */
#define DEVICE0_ID 10
#define DEVICE1_ID DEVICE0_ID + 1
#define DEVICE2_ID DEVICE0_ID + 2
#define DEVICE0_PHY_ADDR 1
#define DEVICE1_PHY_ADDR DEVICE0_PHY_ADDR + 1
#define DEVICE2_PHY_ADDR DEVICE0_PHY_ADDR + 2
#define S_CPU_DEVICE DEVICE0_ID
#define DEVICE0_CPU_PORT 8
#define DEVICE0_CASCADE_PORT 9
#define DEVICE1_CPU_PORT 8
#define DEVICE1_CASCADE_PORT 9
#define DEVICE2_CPU_PORT 8
#define DEVICE2_CASCADE_PORT 9
GT_QD_DEV *qdMultiDev[N_OF_QD_DEVICES] = {0,};
/*
* Initialize each Switch Devices. This should be done in BSP driver init routine.
* Since BSP is not combined with QuarterDeck driver, we are doing here.
* This routine will setup Switch Devices according to the above description.
*/
GT_STATUS qdMultiDevStart()
{
GT_STATUS status = GT_FAIL;
GT_SYS_CONFIG cfg;
int cpuPort;
int cascadePort;
int i,j;
memset((char*)&cfg,0,sizeof(GT_SYS_CONFIG));
/*
* Create QD Device Structure for each device.
*/
for(i=0; i<N_OF_QD_DEVICES; i++)
{
qdMultiDev[i] = (GT_QD_DEV*)malloc(sizeof(GT_QD_DEV));
if(qdMultiDev[i] == NULL)
{
while(i--)
free(qdMultiDev[i]);
return GT_FAIL;
}
memset((char*)qdMultiDev[i],0,sizeof(GT_QD_DEV));
}
/*
* Register all the required functions to QuarterDeck Driver for each device.
*/
for(i=0; i<N_OF_QD_DEVICES; i++)
{
cfg.BSPFunctions.readMii = gtBspReadMii;
cfg.BSPFunctions.writeMii = gtBspWriteMii;
#ifdef USE_SEMAPHORE
cfg.BSPFunctions.semCreate = osSemCreate;
cfg.BSPFunctions.semDelete = osSemDelete;
cfg.BSPFunctions.semTake = osSemWait;
cfg.BSPFunctions.semGive = osSemSignal;
#else
cfg.BSPFunctions.semCreate = NULL;
cfg.BSPFunctions.semDelete = NULL;
cfg.BSPFunctions.semTake = NULL;
cfg.BSPFunctions.semGive = NULL;
#endif
cfg.initPorts = GT_TRUE; /* Set switch ports to Forwarding mode. If GT_FALSE, use Default Setting. */
switch (i)
{
case 0: /* if we are registering device 0 */
cfg.cpuPortNum = DEVICE0_CPU_PORT;
break;
case 1: /* if we are registering device 1 */
cfg.cpuPortNum = DEVICE1_CPU_PORT; /* where device 0 is connected */
break;
case 2: /* if we are registering device 2 */
cfg.cpuPortNum = DEVICE2_CPU_PORT; /* where device 1 is connected */
break;
default: /* we don't have any more device. it shouldn't happen in our sample setup. */
goto errorExit;
}
#ifdef MANUAL_MODE /* not defined. this is only for sample */
/* user may want to use this mode when there are two QD switchs on the same MII bus. */
cfg.mode.scanMode = SMI_MANUAL_MODE; /* Use QD located at manually defined base addr */
cfg.mode.baseAddr = 0x10; /* valid value in this case is either 0 or 0x10 */
#else
#ifdef MULTI_ADDR_MODE /* It should have been defined for this sample code */
cfg.mode.scanMode = SMI_MULTI_ADDR_MODE; /* find a QD in indirect access mode */
cfg.mode.baseAddr = DEVICE0_PHY_ADDR + i; /* this is the phyAddr used by QD family device.
Valid values are 1 ~ 31.*/
#else
cfg.mode.scanMode = SMI_AUTO_SCAN_MODE; /* Scan 0 or 0x10 base address to find the QD */
cfg.mode.baseAddr = 0;
#endif
#endif
if((status=qdLoadDriver(&cfg, qdMultiDev[i])) != GT_OK)
{
MSG_PRINT(("qdLoadDriver return Failed\n"));
goto errorExit;
}
MSG_PRINT(("Device ID : 0x%x\n",qdMultiDev[i]->deviceId));
MSG_PRINT(("Base Reg Addr : 0x%x\n",qdMultiDev[i]->baseRegAddr));
MSG_PRINT(("No of Ports : %d\n",qdMultiDev[i]->numOfPorts));
MSG_PRINT(("CPU Ports : %d\n",qdMultiDev[i]->cpuPortNum));
/*
* start the QuarterDeck
*/
if((status=sysEnable(qdMultiDev[i])) != GT_OK)
{
MSG_PRINT(("sysConfig return Failed\n"));
goto errorExit;
}
}
/*
Now, we need to configure Cascading information for each devices.
1. Set Interswitch port mode for port 8 and 9 for device 0,1,and 2,
so that switch device can expect Marvell Tag from frames
ingressing/egressing this port.
2. Set CPU Port information (for To_CPU frame) for each port of device.
3. Set Cascading Port information (for From_CPU fram) for each device.
4. Set Device ID (if required)
Note: DeviceID is hardware configurable.
*/
for(i=0; i<N_OF_QD_DEVICES; i++)
{
switch (i)
{
case 0: /* if we are registering device 0 */
cpuPort = DEVICE0_CPU_PORT; /* where CPU Enet port is connected */
cascadePort = DEVICE0_CASCADE_PORT; /* where device 1 is connected */
break;
case 1: /* if we are registering device 1 */
cpuPort = DEVICE1_CPU_PORT; /* where device 0 is connected */
cascadePort = DEVICE1_CASCADE_PORT; /* where device 2 is connected */
break;
case 2: /* if we are registering device 2 */
cpuPort = DEVICE2_CPU_PORT; /* where device 1 is connected */
cascadePort = DEVICE2_CASCADE_PORT; /* no need to setup for the given sample setup */
break;
default: /* we don't have any more device. it shouldn't happen in our sample setup. */
goto errorExit;
}
/*
1. Set Interswitch port mode for port 8 and 9 for device 0,1,and 2,
so that switch device can expect Marvell Tag from frames
ingressing/egressing this port.
2. Set CPU Port information (for To_CPU frame) for each port of device.
*/
for(j=0; j<qdMultiDev[i]->numOfPorts; j++)
{
if((i == cpuPort) || (i == cascadePort))
{
if((status=gprtSetInterswitchPort(qdMultiDev[i],j,GT_TRUE)) != GT_OK)
{
MSG_PRINT(("gprtSetInterswitchPort returned %i (port %i, mode TRUE)\n",status,j));
goto errorExit;
}
}
else
{
if((status=gprtSetInterswitchPort(qdMultiDev[i],j,GT_FALSE)) != GT_OK)
{
MSG_PRINT(("gprtSetInterswitchPort returned %i (port %i, mode FALSE)\n",status,j));
goto errorExit;
}
}
if((status=gprtSetCPUPort(qdMultiDev[i],j,cpuPort)) != GT_OK)
{
MSG_PRINT(("gprtSetCPUPort returned %i\n",status));
goto errorExit;
}
}
/*
3. Set Cascading Port information (for From_CPU fram) for each device.
*/
if((status=gsysSetCascadePort(qdMultiDev[i],cascadePort)) != GT_OK)
{
MSG_PRINT(("gsysSetCascadePort returned %i\n",status));
goto errorExit;
}
/*
4. Set Device ID (if required)
*/
if((status=gsysSetDeviceNumber(qdMultiDev[i],DEVICE0_ID+i)) != GT_OK)
{
MSG_PRINT(("gsysSetDeviceNumber returned %i\n",status));
goto errorExit;
}
}
MSG_PRINT(("QuarterDeck has been started.\n"));
return GT_OK;
errorExit:
for(i=0; i<N_OF_QD_DEVICES; i++)
{
if(qdMultiDev[i] != NULL)
{
qdUnloadDriver(qdMultiDev[i]);
free(qdMultiDev[i]);
}
}
MSG_PRINT(("QuarterDeck initialization failed.\n"));
return status;
}