/******************************************************************************* * gvlnGetPortVlanPorts * * DESCRIPTION: * This routine gets the port VLAN group port membership list. * * INPUTS: * port - logical port number to set. * * OUTPUTS: * memPorts - array of logical ports in the same vlan. * memPortsLen - number of members in memPorts array * * RETURNS: * GT_OK - on success * GT_FAIL - on error * GT_BAD_PARAM - on bad parameters * * COMMENTS: * * GalTis: * *******************************************************************************/ GT_STATUS gvlnGetPortVlanPorts ( IN GT_QD_DEV *dev, IN GT_LPORT port, OUT GT_LPORT memPorts[], OUT GT_U8 *memPortsLen ) { GT_STATUS retVal; /* Functions return value. */ GT_U16 data; /* The register's read data. */ GT_U8 phyPort; /* Physical port. */ GT_U8 i; DBG_INFO(("gvlnGetPortVlanPorts Called.\n")); if((memPorts == NULL) || (memPortsLen == NULL)) { DBG_INFO(("Failed.\n")); return GT_BAD_PARAM; } phyPort = GT_LPORT_2_PORT(port); /* memPortsLen = 3 for fullsail, =7 for others */ retVal = hwGetPortRegField(dev,phyPort,QD_REG_PORT_VLAN_MAP,0,dev->maxPorts,&data); if(retVal != GT_OK) { DBG_INFO(("Failed.\n")); return retVal; } i = 0; for(phyPort = 0; phyPort < dev->maxPorts; phyPort++) { if(!GT_IS_PORT_SET(dev->validPortVec, phyPort)) continue; if(((1 << phyPort) & data) != 0) { memPorts[i] = GT_PORT_2_LPORT(phyPort); i++; } } *memPortsLen = i; DBG_INFO(("OK.\n")); return GT_OK; }
/******************************************************************************* * gstuAddEntry * * DESCRIPTION: * Creates or update the entry in STU table based on user input. * * INPUTS: * stuEntry - stu entry to insert to the STU. * * OUTPUTS: * None * * RETURNS: * GT_OK - on success * GT_FAIL - on error * GT_NOT_SUPPORTED - if current device does not support this feature. * * COMMENTS: * Valid SID is 1 ~ 63. * *******************************************************************************/ GT_STATUS gstuAddEntry ( IN GT_QD_DEV *dev, IN GT_STU_ENTRY *stuEntry ) { GT_U8 valid; GT_STATUS retVal; GT_U8 port; GT_LPORT lport; GT_STU_ENTRY tmpStuEntry; GT_BOOL found; int count = 50000; GT_STU_ENTRY entry; DBG_INFO(("gstuAddEntry Called.\n")); /* check if device supports this feature */ if (!IS_IN_DEV_GROUP(dev,DEV_802_1S_STU)) { DBG_INFO(("GT_NOT_SUPPORTED\n")); return GT_NOT_SUPPORTED; } if((stuEntry->sid == 0) || (stuEntry->sid > 0x3F)) { DBG_INFO(("GT_BAD_PARAM\n")); return GT_BAD_PARAM; } entry.sid = stuEntry->sid; valid = 1; /* for load operation */ for(port=0; port<dev->maxPorts; port++) { lport = GT_PORT_2_LPORT(port); if (lport == GT_INVALID_PORT) entry.portState[port] = 0; else entry.portState[port] = stuEntry->portState[lport]; } retVal = stuOperationPerform(dev,LOAD_PURGE_STU_ENTRY,&valid, &entry); if(retVal != GT_OK) { DBG_INFO(("Failed (stuOperationPerform returned GT_FAIL).\n")); return retVal; } /* verify that the given entry has been added */ tmpStuEntry.sid = stuEntry->sid; if((retVal = gstuFindSidEntry(dev,&tmpStuEntry,&found)) != GT_OK) { while(count--); if((retVal = gstuFindSidEntry(dev,&tmpStuEntry,&found)) != GT_OK) { DBG_INFO(("Added entry cannot be found\n")); return retVal; } } if(found == GT_FALSE) { DBG_INFO(("Added entry cannot be found\n")); return GT_FAIL; } DBG_INFO(("OK.\n")); return GT_OK; }
/******************************************************************************* * 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; } #ifdef GT_PORT_MAP_IN_DEV /* Modified to add port mapping functions into device ssystem configuration. */ if (dev->lport2port == NULL) { dev->lport2port = lport2port; } if (dev->port2lport == NULL) { dev->port2lport = port2lport; } if (dev->lportvec2portvec == NULL) { dev->lportvec2portvec = lportvec2portvec; } if (dev->portvec2lportvec == NULL) { dev->portvec2lportvec = portvec2lportvec; } #endif 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 */ dev->devName = 0; dev->devName1 = 0; dev->validSerdesVec = 0; if((dev->deviceId&0xfff8)==GT_88EC000) /* device id 0xc00 - 0xc07 are GT_88EC0XX */ dev->deviceId=GT_88EC000; 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_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_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_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 = 0x28F; dev->validPhyVec = 0x28F; dev->devName = DEV_88E6182; break; case GT_88E6155: dev->numOfPorts = 6; dev->maxPorts = 6; dev->maxPhyNum = 6; dev->validPortVec = 0x28F; dev->validPhyVec = 0x28F; 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_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_88E6351: dev->numOfPorts = 7; dev->maxPorts = 7; dev->maxPhyNum = 5; dev->validPortVec = (1 << dev->numOfPorts) - 1; dev->validPhyVec = 0x1F; dev->devName = DEV_88E6351; break; case GT_88E6175: dev->numOfPorts = 7; dev->maxPorts = 7; dev->maxPhyNum = 5; dev->validPortVec = (1 << dev->numOfPorts) - 1; dev->validPhyVec = 0x1F; dev->devName1 = DEV_88E6175; /* test device group 1 */ break; case GT_88E6171 : dev->numOfPorts = 7; dev->maxPorts = 7; dev->maxPhyNum = 5; dev->validPortVec = (1 << dev->numOfPorts) - 1; dev->validPhyVec = 0x1F; dev->devName = DEV_88E6171; break; case GT_88E6350 : dev->numOfPorts = 7; dev->maxPorts = 7; dev->maxPhyNum = 5; dev->validPortVec = (1 << dev->numOfPorts) - 1; dev->validPhyVec = 0x1F; dev->devName = DEV_88E6371; break; case GT_88EC000 : dev->numOfPorts = 7; dev->maxPorts = 7; dev->maxPhyNum = 5; dev->validPortVec = (1 << dev->numOfPorts) - 1; dev->validPhyVec = 0x1F; dev->devName1 = DEV_88EC000; break; case GT_88E6020: dev->numOfPorts = 7; dev->maxPorts = 7; dev->maxPhyNum = 5; dev->validPortVec = (1 << dev->numOfPorts) - 1; dev->validPhyVec = 0x1F; dev->devName1 = DEV_88E3020; break; case GT_88E6070: dev->numOfPorts = 7; dev->maxPorts = 7; dev->maxPhyNum = 5; dev->validPortVec = (1 << dev->numOfPorts) - 1; dev->validPhyVec = 0x1F; dev->devName1 = DEV_88E3020; break; case GT_88E6071: dev->numOfPorts = 7; dev->maxPorts = 7; dev->maxPhyNum = 5; dev->validPortVec = (1 << dev->numOfPorts) - 1; dev->validPhyVec = 0x1F; dev->devName1 = DEV_88E3020; break; case GT_88E6220: dev->numOfPorts = 7; dev->maxPorts = 7; dev->maxPhyNum = 5; dev->validPortVec = (1 << dev->numOfPorts) - 1; dev->validPhyVec = 0x1F; dev->devName1 = DEV_88E3020; break; case GT_88E6250: dev->numOfPorts = 7; dev->maxPorts = 7; dev->maxPhyNum = 5; dev->validPortVec = (1 << dev->numOfPorts) - 1; dev->validPhyVec = 0x1F; dev->devName1 = DEV_88E3020; break; case GT_88E6172: dev->numOfPorts = 7; dev->maxPorts = 7; dev->maxPhyNum = 16; dev->validPortVec = (1 << dev->numOfPorts) - 1; dev->validPhyVec = 0x1F; dev->validSerdesVec = 0x8000; dev->devName = DEV_88E6172; break; case GT_88E6176: dev->numOfPorts = 7; dev->maxPorts = 7; dev->maxPhyNum = 16; dev->validPortVec = (1 << dev->numOfPorts) - 1; dev->validPhyVec = 0x7F; dev->validSerdesVec = 0x8000; dev->devName = DEV_88E6176; break; case GT_88E6240: dev->numOfPorts = 7; dev->maxPorts = 7; dev->maxPhyNum = 16; dev->validPortVec = (1 << dev->numOfPorts) - 1; dev->validPhyVec = 0x7F; dev->validSerdesVec = 0x8000; dev->devName = DEV_88E6240; break; case GT_88E6352: dev->numOfPorts = 7; dev->maxPorts = 7; dev->maxPhyNum = 16; dev->validPortVec = (1 << dev->numOfPorts) - 1; dev->validPhyVec = 0x7F; dev->validSerdesVec = 0x8000; dev->devName = DEV_88E6352; break; case GT_88E6320: dev->numOfPorts = 7; dev->maxPorts = 7; dev->maxPhyNum = 16; dev->validPortVec = (1 << dev->numOfPorts) - 1; dev->validPhyVec = 0x18; dev->validSerdesVec = 0x3000; dev->devName1 = DEV_88E6320; break; case GT_88E6321: dev->numOfPorts = 7; dev->maxPorts = 7; dev->maxPhyNum = 12; dev->validPortVec = (1 << dev->numOfPorts) - 1; dev->validPhyVec = 0x18; dev->validSerdesVec = 0x3000; dev->devName1 = DEV_88E6321; break; case GT_88E6999: /* Opus */ dev->numOfPorts = 11; dev->maxPorts = 11; dev->maxPhyNum = 16; dev->validPortVec = (1 << dev->numOfPorts) - 1; dev->validPhyVec = 0x0; dev->validSerdesVec = 0x0000; dev->devName1 = DEV_88E6999; break; case GT_88E6390: /* Peridot Full Featured Device */ dev->numOfPorts = 11; dev->maxPorts = 11; dev->maxPhyNum = 16; dev->validPortVec = (1 << dev->numOfPorts) - 1; dev->validPhyVec = 0; dev->validSerdesVec = 0x0000; dev->devName1 = DEV_88E6390; break; case GT_88E6360: /* Peridot 5 GE PHY version */ dev->numOfPorts = 5; dev->maxPorts = 5; dev->maxPhyNum = 16; dev->validPortVec = (1 << dev->numOfPorts) - 1; dev->validPhyVec = 0x0; dev->validSerdesVec = 0x0000; dev->devName1 = DEV_88E6390; break; case GT_88E6290: /* Peridot FE PHY version */ dev->numOfPorts = 11; dev->maxPorts = 11; dev->maxPhyNum = 16; dev->validPortVec = (1 << dev->numOfPorts) - 1; dev->validPhyVec = 0x0; dev->validSerdesVec = 0x0000; dev->devName1 = DEV_88E6290; break; case GT_88E6290A: /* Peridot Forced FE PHY (no AutoNeg) for Automotive */ dev->numOfPorts = 11; dev->maxPorts = 11; dev->maxPhyNum = 16; dev->validPortVec = (1 << dev->numOfPorts) - 1; dev->validPhyVec = 0x0; dev->validSerdesVec = 0x0000; dev->devName1 = DEV_88E6290A; break; case GT_88E6191: /* Peridot No AVB */ dev->numOfPorts = 11; dev->maxPorts = 11; dev->maxPhyNum = 16; dev->validPortVec = (1 << dev->numOfPorts) - 1; dev->validPhyVec = 0x0; dev->validSerdesVec = 0x0000; dev->devName1 = DEV_88E6190; break; case GT_88E6190: /* Peridot No AVB, Z80 NIC, TCAM nor Cut Through */ dev->numOfPorts = 11; dev->maxPorts = 11; dev->maxPhyNum = 16; dev->validPortVec = (1 << dev->numOfPorts) - 1; dev->validPhyVec = 0x0; dev->validSerdesVec = 0x0000; dev->devName1 = DEV_88E6191; 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 Remote management Register Access semaphore. */ if((dev->hwAccessRegsSem = 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; } } } dev->use_mad = GT_FALSE; #ifdef GT_USE_MAD { int portPhyAddr=0; unsigned int validPhyVec = dev->validPhyVec; while((validPhyVec&1)==0) { validPhyVec >>= 1; portPhyAddr++; } DBG_INFO(("@@@@@@@@@@ qd_madInit\n")); if((retVal = qd_madInit(dev, portPhyAddr)) != GT_OK) { DBG_INFO(("Initialize MAD failed.\n")); qdUnloadDriver(dev); return retVal; } } #endif 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; } } else if (IS_IN_DEV_GROUP(dev,DEV_PIRL3_RESOURCE)) { retVal = gpirl3Initialize(dev); if(retVal != GT_OK) { DBG_INFO(("Failed.\n")); qdUnloadDriver(dev); return retVal; } } if(IS_IN_DEV_GROUP(dev,DEV_CPU_PORT_NEED_INIT)) { retVal = gsysInitCPUPort(dev,dev->cpuPortNum); 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; }
/******************************************************************************* * 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; }
/******************************************************************************* * gstpSetMode * * DESCRIPTION: * This routine Enable the Spanning tree. * * INPUTS: * en - GT_TRUE for enable, GT_FALSE for disable. * * OUTPUTS: * None. * * RETURNS: * GT_OK - on success * GT_FAIL - on error * * COMMENTS: * when enabled, this function sets all port to blocking state, and inserts * the BPDU MAC into the ATU to be captured to CPU, on disable all port are * being modified to be in forwarding state. * * GalTis: * *******************************************************************************/ GT_STATUS gstpSetMode ( IN GT_QD_DEV *dev, IN GT_BOOL en ) { GT_STATUS retVal; /* Functions return value. */ GT_PORT_STP_STATE state; /* STP state to be set. */ GT_ATU_ENTRY atuEntry; /* The ATU entry data to be set */ GT_U8 i; DBG_INFO(("gstpSetMode Called.\n")); if(dev->deviceId == GT_88E6051) { DBG_INFO(("Failed.\n")); return GT_FAIL; } if((en == GT_TRUE) && (dev->stpMode == 1)) { DBG_INFO(("OK.\n")); return GT_OK; } /* Set the STP state in the relevant register. */ if(en == GT_TRUE) state = GT_PORT_BLOCKING; else state = GT_PORT_FORWARDING; for(i = 0; i < dev->numOfPorts; i++) { retVal = gstpSetPortState(dev,i,state); if(retVal != GT_OK) { DBG_INFO(("Failed.\n")); return retVal; } } /* Set the Atu entry parameters. */ atuEntry.macAddr.arEther[0] = 0x01; atuEntry.macAddr.arEther[1] = 0x80; atuEntry.macAddr.arEther[2] = 0xC2; atuEntry.macAddr.arEther[3] = 0x00; atuEntry.macAddr.arEther[4] = 0x00; atuEntry.macAddr.arEther[5] = 0x00; atuEntry.portVec = ( 1 << GT_PORT_2_LPORT(dev->cpuPortNum)); atuEntry.prio = 3; atuEntry.DBNum = 0; atuEntry.entryState.mcEntryState = GT_MC_PRIO_MGM_STATIC; if(en == GT_TRUE) { retVal = gfdbAddMacEntry(dev,&atuEntry); } else if((en == GT_FALSE) && (dev->stpMode != 0)) retVal = gfdbDelMacEntry(dev,&(atuEntry.macAddr)); else retVal = GT_OK; if(en == GT_TRUE) dev->stpMode = 1; else dev->stpMode = 2; if(retVal == GT_OK) DBG_INFO(("OK.\n")); else DBG_INFO(("Failed.\n")); return retVal; }