/* * Disable QuarterDeck Interrupt. */ GT_STATUS sampleQDIntDisable(GT_QD_DEV *dev) { GT_STATUS status; GT_LPORT port; /* * Writing 0 into eventSetActive(), all port interrupt will be disabled. */ if((status = eventSetActive(dev,0)) != GT_OK) { MSG_PRINT(("eventSetActive returned fail.\n")); return status; } /* * Writing 0 into gprtPhyIntEnable(), all port interrupt will be disabled. */ for(port=0; port<3; port++) { if((status = gprtPhyIntEnable(dev,port,0)) != GT_OK) { MSG_PRINT(("gprtPhyIntEnable returned fail.\n")); return status; } } return GT_OK; }
/* * Disable Egress Monitoring and Ingress Monitoring for the monitoredPort. */ GT_STATUS sampleDisablePortMonitor(GT_QD_DEV *dev,GT_LPORT monitoredPort) { GT_STATUS status; GT_U16 pav; /* * Disable Egress Monitoring for the monitoredPort. */ pav = (1<<monitoredPort); if((status = gpavSetPAV(dev,monitoredPort, pav)) != GT_OK) { MSG_PRINT(("gpavSetPAV return Failed\n")); return status; } /* * Disable Ingress Monitoring for the monitoredPort. */ if((status = gpavSetIngressMonitor(dev,monitoredPort, GT_FALSE)) != GT_OK) { MSG_PRINT(("gpavSetIngressMonitor return Failed\n")); return status; } return GT_OK; }
void displayStatus_drv_1(MAD_STATUS status) { /* MAD error status driver level 1 */ switch(status&MAD_ERR_ST_DRV_1_MASK) { case 0 : break; case MAD_DRV_FAIL_ACCESS_PAGE_REG : MSG_PRINT("Accessing Page Register failed \n"); break; case MAD_DRV_FAIL_WRITE_PAGED_REG : MSG_PRINT("SMI Paged register Write failed \n"); break; case MAD_DRV_NO_ABLE_READ_REG : MSG_PRINT("Not able to read Phy Register. \n"); break; case MAD_DRV_NO_ABLE_WRITE_REG : MSG_PRINT("Not able to write Phy Register. \n"); break; default: MSG_PRINT("Unknown Error Driver layer 1L\n"); break; } }
GT_STATUS sampleCPUTrailerEnable(GT_QD_DEV *dev, GT_BOOL en) { GT_STATUS status; GT_INGRESS_MODE inMode; if (en) /* Enable Trailer Mode */ { inMode = GT_TRAILER_INGRESS; } else { inMode = GT_UNMODIFY_INGRESS; } /* * Enable CPU's Ingress Trailer */ if((status = gprtSetIngressMode(dev,dev->cpuPortNum, inMode)) != GT_OK) { MSG_PRINT(("gprtSetIngressMode return Failed\n")); return status; } /* * Enable CPU's Egress Trailer */ if((status = gprtSetTrailerMode(dev,dev->cpuPortNum, en)) != GT_OK) { MSG_PRINT(("gprtSetTrailerMode return Failed\n")); return status; } return GT_OK; }
MAD_STATUS stopExLoopback(MAD_DEV *dev,MAD_LPORT port, MAD_SPEED_MODE mode) { MAD_STATUS status; if (dev == 0) { MSG_PRINT("MAD driver is not initialized\n"); return MAD_FAIL; } MSG_PRINT("Stopping External Loopback for port %i\n",(int)port); /* * Stop External Loopback */ if((status = mdDiagSetExternalLoopback(dev,port,MAD_FALSE,mode)) != MAD_OK) { MSG_PRINT("mdDiagSetExternalLoopback return Failed\n"); testMADDisplayStatus(status); return status; } /* * Reconfigure Copper Auto-Neg mode */ if((status = mdCopperSetAutoNeg(dev,port,orgAutoNegState,orgMode)) != MAD_OK) { MSG_PRINT("mdCopperSetAutoNeg return Failed\n"); testMADDisplayStatus(status); return status; } return MAD_OK; }
/* * Start Packet Generator. * Input: * pktload - enum GT_PG_PAYLOAD (GT_PG_PAYLOAD_RANDOM or GT_PG_PAYLOAD_5AA5) * length - enum GT_PG_LENGTH (GT_PG_LENGTH_64 or GT_PG_LENGTH_1514) * tx - enum GT_PG_TX (GT_PG_TX_NORMAL or GT_PG_TX_ERROR) */ GT_STATUS startPktGenerator ( GT_QD_DEV *dev, GT_LPORT port, GT_PG_PAYLOAD payload, GT_PG_LENGTH length, GT_PG_TX tx ) { GT_STATUS status; GT_PG pktInfo; if (dev == 0) { MSG_PRINT(("GT driver is not initialized\n")); return GT_FAIL; } MSG_PRINT(("Start Packet Generator for port %i\n",(int)port)); pktInfo.payload = payload; /* Pseudo-random, 5AA55AA5... */ pktInfo.length = length; /* 64 bytes, 1514 bytes */ pktInfo.tx = tx; /* normal packet, error packet */ /* * Start Packet Generator */ if((status = gprtSetPktGenEnable(dev,port,GT_TRUE,&pktInfo)) != GT_OK) { MSG_PRINT(("mdDiagSetPktGenEnable return Failed\n")); return status; } return GT_OK; }
GT_STATUS samplePIRL2CustomSetup(GT_QD_DEV *dev) { GT_STATUS status; GT_PIRL2_DATA pirlData; GT_U32 irlRes; GT_LPORT port; port = 0; irlRes = 0; pirlData.customSetup.isValid = GT_TRUE; pirlData.customSetup.ebsLimit = 0xFFFFFF; pirlData.customSetup.cbsLimit = 0x200000; pirlData.customSetup.bktIncrement = 0x3D; pirlData.customSetup.bktRateFactor = 2; pirlData.accountQConf = GT_FALSE; pirlData.accountFiltered = GT_TRUE; pirlData.mgmtNrlEn = GT_TRUE; pirlData.saNrlEn = GT_TRUE; pirlData.daNrlEn = GT_FALSE; pirlData.samplingMode = GT_FALSE; pirlData.actionMode = PIRL_ACTION_USE_LIMIT_ACTION; pirlData.ebsLimitAction = ESB_LIMIT_ACTION_DROP; pirlData.bktRateType = BUCKET_TYPE_TRAFFIC_BASED; pirlData.bktTypeMask = BUCKET_TRAFFIC_BROADCAST | BUCKET_TRAFFIC_MULTICAST | BUCKET_TRAFFIC_UNICAST | BUCKET_TRAFFIC_MGMT_FRAME| BUCKET_TRAFFIC_ARP; pirlData.priORpt = GT_TRUE; pirlData.priMask = 0; pirlData.byteTobeCounted = GT_PIRL2_COUNT_ALL_LAYER3; status = gpirl2WriteResource(dev,port,irlRes,&pirlData); switch (status) { case GT_OK: MSG_PRINT(("PIRL2 writing completed.\n")); break; case GT_BAD_PARAM: MSG_PRINT(("Invalid parameters are given.\n")); break; case GT_NOT_SUPPORTED: MSG_PRINT(("Device is not supporting PIRL2.\n")); break; default: MSG_PRINT(("Failure to configure device.\n")); break; } return status; }
/***************************************************************************** * sampleAdmitOnlyTaggedFrame * * DESCRIPTION: * This routine will show how to configure a port to accept only vlan * tagged frames. * This routine assumes that 802.1Q has been enabled for the given port. * * INPUTS: * port - logical port to be configured. * * OUTPUTS: * None. * * RETURNS: * GT_OK - on success * GT_FAIL - on error * * COMMENTS: * Some device support Discard Untagged feature. If so, gprtSetDiscardUntagged * function will do the work. * *******************************************************************************/ GT_STATUS sampleAdmitOnlyTaggedFrame(GT_QD_DEV *dev,GT_LPORT port) { GT_STATUS status; GT_VTU_ENTRY vtuEntry; int i; /* * 0) If device support gprtSetDiscardUntagged, call the function. */ status = gprtSetDiscardUntagged(dev, port, GT_TRUE); switch (status) { case GT_OK: MSG_PRINT(("Done.\n")); return status; case GT_NOT_SUPPORTED: MSG_PRINT(("Try other method.\n")); break; default: MSG_PRINT(("Failure accessing device.\n")); return status; } /* * 1) Add VLAN ID 0xFFF with the given port as a member. */ gtMemSet(&vtuEntry,0,sizeof(GT_VTU_ENTRY)); vtuEntry.DBNum = 0; vtuEntry.vid = 0xFFF; for(i=0; i<dev->numOfPorts; i++) { vtuEntry.vtuData.memberTagP[i] = NOT_A_MEMBER; } vtuEntry.vtuData.memberTagP[port] = MEMBER_EGRESS_TAGGED; if((status = gvtuAddEntry(dev,&vtuEntry)) != GT_OK) { MSG_PRINT(("gvtuAddEntry returned fail.\n")); return status; } /* * 2) Configure the default vid for the given port with VID 0xFFF */ if((status = gvlnSetPortVid(dev,port,0xFFF)) != GT_OK) { MSG_PRINT(("gvlnSetPortVid returned fail.\n")); return status; } return GT_OK; }
GT_STATUS sampleLoadBalance(GT_QD_DEV *dev) { GT_STATUS status; int i; GT_U32 mask, baseMask; baseMask = (1 << dev->numOfPorts) - 1; baseMask &= 0xFFF0; /* clear bits for port 0 ~ 3 */ /* * Set the trunk mask table for load balancing. */ for(i=0; i<8; i++) { mask = baseMask | (1 << (i%4)); if((status = gsysSetTrunkMaskTable(dev,i,mask)) != GT_OK) { MSG_PRINT(("gsysSetTrunkMaskTable return Failed\n")); return status; } } return GT_OK; }
void testMADDisplayStatus(MAD_STATUS status) { MSG_PRINT("\n"); displayStatus_drv_0(status); displayStatus_drv_1(status); displayStatus_api_0(status); displayStatus_api_1(status); }
// ============================================================================ ssize_t PacketManager::sendto_Err(int s, void *buf, size_t len, int flags, const struct sockaddr *to, socklen_t tolen) { int nResult = 0; if (buf == NULL) { ERR_PRINT("buf pointer == NULL\n"); exit(1); } if (len == 0) { ERR_PRINT("len == 0: %u\n", len); exit(1); } if (to == NULL) { ERR_PRINT("sockaddr pointer == NULL\n"); exit(1); } ++m_MsgNo; uint32_t seqNo = ntohl(*(uint32_t*)(buf)); MSG_PRINT("MSG# %3u SEQ# %3u LEN %4u FLAGS 0x%08X\n", m_MsgNo, seqNo, len, flags); size_t lenTmp = len; unsigned char bufTmp[len]; memcpy(bufTmp, buf, lenTmp); void* pBuf = bufTmp; nResult = processEvents((void**)&pBuf, &lenTmp, m_MsgNo); if (nResult < 0) { ERR_PRINT("prcoessEvents\n"); return nResult; } else if ((nResult == 0) || (nResult == 1)) { ssize_t lenSent = sendto(s, pBuf, lenTmp, flags, to, tolen); if (lenSent == (ssize_t)lenTmp) { return len; } else { return lenSent; } } else { return len; } return -1; }
// ============================================================================ ssize_t PacketManager::recv_Mod(int s, void *buf, size_t len, int flags) { ssize_t ret = ::recv(s, buf, len, flags); uint32_t seqNo = ntohl(*(uint32_t*)(buf)); MSG_PRINT(" SEQ# %3u LEN %4u FLAGS 0x%08X\n", seqNo, ret, flags); return ret; }
// ============================================================================ ssize_t PacketManager::recvfrom_Mod(int s, void *buf, size_t len, int flags, struct sockaddr *from, socklen_t *fromlen) { ssize_t ret = ::recvfrom(s, buf, len, flags, from, fromlen); uint32_t seqNo = ntohl(*(uint32_t*)(buf)); MSG_PRINT(" SEQ# %3u LEN %4u FLAGS 0x%08X\n", seqNo, ret, flags); return ret; }
/* * This sample is for every device that support RMON counter. */ GT_STATUS sampleClearRMONCounter(GT_QD_DEV *dev,GT_LPORT port) { GT_STATUS status; if((status = gstatsFlushPort(dev,port)) != GT_OK) { MSG_PRINT(("gstatsFlushPort returned fail (%#x).\n",status)); return status; } return GT_OK; }
// ============================================================================ ssize_t PacketManager::send_Err(int s, void *buf, size_t len, int flags) { ssize_t nResult = 0; if (buf == NULL) { ERR_PRINT("buf pointer == NULL\n"); exit(1); } if (len == 0) { ERR_PRINT("len == 0: %u\n", len); exit(1); } ++m_MsgNo; uint32_t seqNo = ntohl(*(uint32_t*)(buf)); MSG_PRINT("MSG# %3u SEQ# %3u LEN %4u FLAGS 0x%08X\n", m_MsgNo, seqNo, len, flags); size_t lenTmp = len; unsigned char bufTmp[len]; memcpy(bufTmp, buf, lenTmp); void* pBuf = bufTmp; nResult = processEvents((void**)&pBuf, &lenTmp, m_MsgNo); // Error Case if (nResult < 0) { // Do nothing. Will return nResult } // (Non-)changed Cases else if ((nResult == 0) || (nResult == 1)) { ssize_t lenSent = send(s, bufTmp, lenTmp, flags); if (lenSent == (ssize_t)lenTmp) { nResult = len; } else { nResult = lenSent; } } // Drop Case else { nResult = len; } return nResult; }
/* * This sample is for 88E6021, 88E6063, and 88E6083. */ GT_STATUS sampleGetRMONCounter(GT_QD_DEV *dev) { GT_STATUS status; GT_LPORT port; GT_STATS_COUNTER_SET statsCounterSet; for(port=0; port<dev->numOfPorts; port++) { MSG_PRINT(("Port %i :\n",port)); if((status = gstatsGetPortAllCounters(dev,port,&statsCounterSet)) != GT_OK) { MSG_PRINT(("gstatsGetPortAllCounters returned fail (%#x).\n",status)); return status; } sampleDisplayCounter(&statsCounterSet); } return GT_OK; }
GT_STATUS sampleCableTest(GT_QD_DEV *dev,GT_LPORT port) { GT_STATUS status; GT_CABLE_STATUS cableStatus; int i; /* * Start and get Cable Test Result */ if((status = gvctGetCableDiag(dev,port, &cableStatus)) != GT_OK) { MSG_PRINT(("gvctGetCableDiag return Failed\n")); return status; } MSG_PRINT(("Cable Test Result for Port %i\n",port)); if(cableStatus.phyType == PHY_100M) { MSG_PRINT(("RX PAIR :\n")); sampleDisplayCableTestResult(&cableStatus.cableStatus[MDI_RX_PAIR], &cableStatus.cableLen[MDI_RX_PAIR]); MSG_PRINT(("TX PAIR :\n")); sampleDisplayCableTestResult(&cableStatus.cableStatus[MDI_TX_PAIR], &cableStatus.cableLen[MDI_TX_PAIR]); } else /* phyType must be PHY_1000M */ { for(i=0; i<GT_MDI_PAIR_NUM; i++) { MSG_PRINT(("MDI PAIR %i:\n",i)); sampleDisplayCableTestResult(&cableStatus.cableStatus[i], &cableStatus.cableLen[i]); } } return GT_OK; }
/* * Start Packet Generator. * Input: * pktload - enum MAD_PG_PAYLOAD (MAD_PG_PAYLOAD_RANDOM or MAD_PG_PAYLOAD_5AA5) * length - enum MAD_PG_LENGTH (MAD_PG_LENGTH_64 or MAD_PG_LENGTH_1514) * tx - enum MAD_PG_TX (MAD_PG_TX_NORMAL or MAD_PG_TX_ERROR) * en_type - enum MAD_PG_EN_TYPE (MAD_PG_DISABLE or MAD_PG_EN_COPPER...) */ MAD_STATUS startPktGenerator ( MAD_DEV *dev, MAD_LPORT port, MAD_PG_PAYLOAD payload, MAD_PG_LENGTH length, MAD_PG_TX tx, MAD_PG_EN_TYPE en_type ) { MAD_STATUS status; MAD_PG pktInfo; if (dev == 0) { MSG_PRINT("MAD driver is not initialized\n"); return MAD_FAIL; } MSG_PRINT("Start Packet Generator for port %i\n",(int)port); pktInfo.payload = payload; /* Pseudo-random, 5AA55AA5... */ pktInfo.length = length; /* 64 bytes, 1514 bytes */ pktInfo.tx = tx; /* normal packet, error packet */ pktInfo.en_type = en_type; /* Enable_type */ /* * Start Packet Generator */ if((status = mdDiagSetPktGenEnable(dev,port,1,&pktInfo)) != MAD_OK) { MSG_PRINT("mdDiagSetPktGenEnable return Failed\n"); testMADDisplayStatus(status); return status; } return MAD_OK; }
/* * Stop Packet Generator. */ GT_STATUS stopPktGenerator(GT_QD_DEV *dev,GT_LPORT port) { GT_STATUS status; if (dev == 0) { MSG_PRINT(("GT driver is not initialized\n")); return GT_FAIL; } MSG_PRINT(("Stopping Packet Generator for port %i\n",(int)port)); /* * Start Packet Generator */ if((status = gprtSetPktGenEnable(dev,port,GT_FALSE,NULL)) != GT_OK) { MSG_PRINT(("mdDiagSetPktGenEnable return Failed\n")); return status; } return GT_OK; }
GT_STATUS sampleHeaderEnable(GT_QD_DEV *dev,GT_BOOL en) { GT_STATUS status; /* * Enable/Disable Header mode */ if((status = gprtSetHeaderMode(dev,dev->cpuPortNum, en)) != GT_OK) { MSG_PRINT(("gprtSetHeaderMode return Failed\n")); return status; } return GT_OK; }
/* * To enable quarterDeck interrupt, you need to call eventSetActive() and * gprtPhyIntEnable(), as following sample routine. * sampleQDIntEnable will enable all interrupt causes. * For Port, GT_ATU_FULL, GT_ATU_DONE, GT_PHY_INTERRUPT, and GT_EE_INTERRUPT * are enabled. * * In this sample, GT_SPEED_CHANGED, GT_DUPLEX_CHANGED, and * GT_LINK_STATUS_CHANGED are enabled for ports 0 ~ 2. */ GT_STATUS sampleQDIntEnable(GT_QD_DEV *dev) { GT_STATUS status; GT_LPORT port; GT_U16 data; /* * Enable QuarterDeck interrupt for ATUFull, ATUDone, PHYInt, and EEInt. * If writing 0 into eventSetActive(), all port interrupt will be disabled. */ data = GT_STATS_DONE|GT_VTU_PROB|GT_VTU_DONE| GT_ATU_FULL|GT_ATU_DONE|GT_EE_INTERRUPT; /* GT_ATU_FULL|GT_ATU_DONE|GT_PHY_INTERRUPT|GT_EE_INTERRUPT; */ if((status = eventSetActive(dev,data)) != GT_OK) { MSG_PRINT(("eventSetActive returned fail.\n")); return status; } /* * Enable Phy interrupt for every possible interrupt cause. * If writing 0 into gprtPhyIntEnable(), all port interrupt will be disabled. */ data = GT_SPEED_CHANGED|GT_DUPLEX_CHANGED|GT_LINK_STATUS_CHANGED; for(port=0; port<3; port++) { if((status = gprtPhyIntEnable(dev,port,data)) != GT_OK) { MSG_PRINT(("gprtPhyIntEnable returned fail.\n")); return status; } } return GT_OK; }
/* * Stop Packet Generator. */ MAD_STATUS stopPktGenerator(MAD_DEV *dev,MAD_LPORT port) { MAD_STATUS status; if (dev == 0) { MSG_PRINT("MAD driver is not initialized\n"); return MAD_FAIL; } MSG_PRINT("Stopping Packet Generator for port %i\n",(int)port); /* * Start Packet Generator */ if((status = mdDiagSetPktGenEnable(dev,port,0,NULL)) != MAD_OK) { MSG_PRINT("mdDiagSetPktGenEnable return Failed\n"); testMADDisplayStatus(status); return status; } return MAD_OK; }
/***************************************************************************** * sampleDisplayVIDTable * * DESCRIPTION: * This routine will show how to enumerate each vid entry in the VTU table * * INPUTS: * None. * * OUTPUTS: * None. * * RETURNS: * GT_OK - on success * GT_FAIL - on error * COMMENTS: * *******************************************************************************/ GT_STATUS sampleDisplayVIDTable(GT_QD_DEV *dev) { GT_STATUS status; GT_VTU_ENTRY vtuEntry; GT_LPORT port; int portIndex; gtMemSet(&vtuEntry,0,sizeof(GT_VTU_ENTRY)); vtuEntry.vid = 0xfff; if((status = gvtuGetEntryFirst(dev,&vtuEntry)) != GT_OK) { MSG_PRINT(("gvtuGetEntryCount returned fail.\n")); return status; } MSG_PRINT(("DBNum:%i, VID:%i \n",vtuEntry.DBNum,vtuEntry.vid)); for(portIndex=0; portIndex<dev->numOfPorts; portIndex++) { port = portIndex; MSG_PRINT(("Tag%i:%#x ",port,vtuEntry.vtuData.memberTagP[port])); } MSG_PRINT(("\n")); while(1) { if((status = gvtuGetEntryNext(dev,&vtuEntry)) != GT_OK) { break; } MSG_PRINT(("DBNum:%i, VID:%i \n",vtuEntry.DBNum,vtuEntry.vid)); for(portIndex=0; portIndex<dev->numOfPorts; portIndex++) { port = portIndex; MSG_PRINT(("Tag%i:%#x ",port,vtuEntry.vtuData.memberTagP[port])); } MSG_PRINT(("\n")); } return GT_OK; }
GT_STATUS samplePTPIntHandler(GT_QD_DEV *dev) { GT_U32 int_ports, i, int_status; GT_STATUS status; GT_PTP_TS_STATUS ptpStatus; /* disable AVB Interrupt */ eventSetActive(dev, 0); /* read interrupt cause */ if((status=eventGetIntStatus(dev,(GT_U16*)&int_status))!=GT_OK) { return GT_FAIL; } if ((int_status & GT_AVB_INT) == 0) { MSG_PRINT(("eventGetIntStatus return No AVB Interrupt\n")); /* it's not PTP interrupt */ goto ret_int; } /* read AVB Int status */ if((status = gptpGetPTPInt(dev, &int_ports)) != GT_OK) { MSG_PRINT(("gptpGetPTPInt return failed\n")); goto ret_int; } /* for each port, get the timestamp information if necessary */ i = 0; while(int_ports) { if(!(int_ports & 0x1)) { i++; int_ports >>= 1; continue; } /* check Arrival0 Time Stamp */ if((status = gptpGetTimeStamped(dev, i, PTP_ARR0_TIME, &ptpStatus)) != GT_OK) { MSG_PRINT(("gptpGetTimeStamped return failed\n")); goto ret_int; } if (ptpStatus.isValid == GT_TRUE) { switch(ptpStatus.status) { case PTP_INT_NORMAL: /* To Do: No error condition occurred. So store the time stamp and seqId */ break; case PTP_INT_OVERWRITE: /* To Do: PTP Logic received several PTP frames and only the last one is valid */ break; case PTP_INT_DROP: /* To Do: PTP Logic received several PTP frames and only the first one is valid */ break; default: MSG_PRINT(("unknown ptp status %i\n", ptpStatus.status)); status = GT_FAIL; goto ret_int; } if((status = gptpResetTimeStamp(dev, i, PTP_ARR0_TIME)) != GT_OK) { MSG_PRINT(("gptpResetTimeStamp return failed\n")); goto ret_int; } } /* check Arrival1 Time Stamp */ if((status = gptpGetTimeStamped(dev, i, PTP_ARR1_TIME, &ptpStatus)) != GT_OK) { MSG_PRINT(("gptpGetTimeStamped return failed\n")); goto ret_int; } if (ptpStatus.isValid == GT_TRUE) { switch(ptpStatus.status) { case PTP_INT_NORMAL: /* To Do: No error condition occurred. So store the time stamp and seqId */ break; case PTP_INT_OVERWRITE: /* To Do: PTP Logic received several PTP frames and only the last one is valid */ break; case PTP_INT_DROP: /* To Do: PTP Logic received several PTP frames and only the first one is valid */ break; default: MSG_PRINT(("unknown ptp status %i\n", ptpStatus.status)); status = GT_FAIL; goto ret_int; } if((status = gptpResetTimeStamp(dev, i, PTP_ARR1_TIME)) != GT_OK) { MSG_PRINT(("gptpResetTimeStamp return failed\n")); goto ret_int; } } /* check Departure Time Stamp */ if((status = gptpGetTimeStamped(dev, i, PTP_DEP_TIME, &ptpStatus)) != GT_OK) { MSG_PRINT(("gptpGetTimeStamped return failed\n")); goto ret_int; } if (ptpStatus.isValid == GT_TRUE) { switch(ptpStatus.status) { case PTP_INT_NORMAL: /* To Do: No error condition occurred. So store the time stamp and seqId */ break; case PTP_INT_OVERWRITE: /* To Do: PTP Logic received several PTP frames and only the last one is valid */ break; case PTP_INT_DROP: /* To Do: PTP Logic received several PTP frames and only the first one is valid */ break; default: MSG_PRINT(("unknown ptp status %i\n", ptpStatus.status)); status = GT_FAIL; goto ret_int; } if((status = gptpResetTimeStamp(dev, i, PTP_DEP_TIME)) != GT_OK) { MSG_PRINT(("gptpResetTimeStamp return failed\n")); goto ret_int; } } int_ports >>= 1; }
GT_STATUS samplePTPInit(GT_QD_DEV *dev) { GT_PTP_CONFIG ptpCfg; GT_LPORT port; GT_STATUS status; /* * 1) Setup each port to forward PTP frame to CPU port */ /* setup EtypeType and Policy */ for(port=0; port<dev->numOfPorts; port++) { if ((status = gprtSetPortEType(dev, port, (GT_ETYPE)0x88F7)) != GT_OK) { MSG_PRINT(("gprtSetPortEType returned not OK\n")); return status; } if (port == dev->cpuPortNum) continue; if ((status = gprtSetPolicy(dev, port, POLICY_TYPE_ETYPE, FRAME_POLICY_TRAP)) != GT_OK) { MSG_PRINT(("gprtSetPolicy returned not OK\n")); return status; } } /* setup Frame Mode for CPU port */ if ((status = gprtSetFrameMode(dev, dev->cpuPortNum, GT_FRAME_MODE_ETHER_TYPE_DSA)) != GT_OK) { MSG_PRINT(("gprtSetFrameMode return failed\n")); return status; } /* * 2) Enable PTP Interrupt */ eventSetActive(dev, GT_AVB_INT); /* * 3) Configure PTP */ ptpCfg.ptpEType = 0x88F7; ptpCfg.msgIdTSEn = 0xd; /* id 0, 2, and 3 */ ptpCfg.tsArrPtr = 0x8; /* id 0 and 2 for ARR0, id 3 for ARR1 */ /* Transport specific bits present in PTP Common Header */ ptpCfg.transSpec = 1; /* starting bit location for the Message ID field in the PTP Common Header */ ptpCfg.msgIdStartBit = 4; ptpCfg.ptpArrIntEn = 0x3F; ptpCfg.ptpDepIntEn = 0x3F; ptpCfg.disTSOverwrite = 0; if ((status = gptpSetConfig(dev, &ptpCfg)) != GT_OK) { MSG_PRINT(("gptpSetConfig return failed\n")); return status; } if ((status = gptpSetPTPEn(dev, GT_TRUE)) != GT_OK) { MSG_PRINT(("gptpSetPTPEn return failed\n")); return status; } return GT_OK; }
/***************************************************************************** * sample802_1qSetup * * DESCRIPTION: * This routine will show how to configure the switch device so that it * can be a Home Gateway. This example assumes that all the frames are not * VLAN-Tagged. * 1) to clear VLAN ID Table, * 2) to enable 802.1Q in SECURE mode for each port except CPU port, * 3) to enable 802.1Q in FALL BACK mode for the CPU port. * 4) to add VLAN ID 1 with member port 0 and CPU port * (untagged egress), * 5) to add VLAN ID 2 with member the rest of the ports and CPU port * (untagged egress), * 6) to configure the default vid of each port: * Port 0 have PVID 1, CPU port has PVID 3, and the rest ports have PVID 2. * Note: CPU port's PVID should be unknown VID, so that QuarterDeck can use * VlanTable (header info) for TX. * * * INPUTS: * None. * * OUTPUTS: * None. * * RETURNS: * GT_OK - on success * GT_FAIL - on error * * COMMENTS: * WARNING!! * If you create just two VLAN for this setup, Trailer mode or Header mode * for the CPU port has to be enabled and Ethernet driver which connects to * CPU port should understand VLAN-TAGGING, Trailer mode, or Header mode. * *******************************************************************************/ GT_STATUS sample802_1qSetup(GT_QD_DEV *dev) { GT_STATUS status; GT_DOT1Q_MODE mode; GT_VTU_ENTRY vtuEntry; GT_U16 vid; GT_LPORT port; int i; /* * 1) Clear VLAN ID Table */ if((status = gvtuFlush(dev)) != GT_OK) { MSG_PRINT(("gvtuFlush returned fail.\n")); return status; } /* * 2) Enable 802.1Q for each port as GT_SECURE mode except CPU port. */ mode = GT_SECURE; for(i=0; i<dev->numOfPorts; i++) { port = i; if (port == dev->cpuPortNum) continue; if((status = gvlnSetPortVlanDot1qMode(dev,port, mode)) != GT_OK) { MSG_PRINT(("gvlnSetPortVlanDot1qMode return Failed\n")); return status; } } /* * 3) Enable 802.1Q for CPU port as GT_FALLBACK mode */ if((status = gvlnSetPortVlanDot1qMode(dev, dev->cpuPortNum, GT_FALLBACK)) != GT_OK) { MSG_PRINT(("gvlnSetPortVlanDot1qMode return Failed\n")); return status; } /* * 4) Add VLAN ID 1 with Port 0 and CPU Port as members of the Vlan. */ gtMemSet(&vtuEntry,0,sizeof(GT_VTU_ENTRY)); vtuEntry.DBNum = 0; vtuEntry.vid = 1; for(i=0; i<dev->numOfPorts; i++) { port = i; if((i==0) || (port == dev->cpuPortNum)) vtuEntry.vtuData.memberTagP[port] = MEMBER_EGRESS_UNTAGGED; else vtuEntry.vtuData.memberTagP[port] = NOT_A_MEMBER; } if((status = gvtuAddEntry(dev,&vtuEntry)) != GT_OK) { MSG_PRINT(("gvtuAddEntry returned fail.\n")); return status; } /* * 5) Add VLAN ID 2 with the rest of the Ports and CPU Port as members of * the Vlan. */ gtMemSet(&vtuEntry,0,sizeof(GT_VTU_ENTRY)); vtuEntry.DBNum = 0; vtuEntry.vid = 2; for(i=0; i<dev->numOfPorts; i++) { port = i; if(i == 0) vtuEntry.vtuData.memberTagP[port] = NOT_A_MEMBER; else vtuEntry.vtuData.memberTagP[port] = MEMBER_EGRESS_UNTAGGED; } if((status = gvtuAddEntry(dev,&vtuEntry)) != GT_OK) { MSG_PRINT(("gvtuAddEntry returned fail.\n")); return status; } /* * 6) Configure the default vid for each port. * Port 0 has PVID 1, CPU port has PVID 3, and the rest ports have PVID 2. */ for(i=0; i<dev->numOfPorts; i++) { port = i; if(i==0) vid = 1; else if(port == dev->cpuPortNum) vid = 3; else vid = 2; if((status = gvlnSetPortVid(dev,port,vid)) != GT_OK) { MSG_PRINT(("gvlnSetPortVid returned fail.\n")); return status; } } return GT_OK; }
GT_STATUS sampleCrossChipTrunk(GT_QD_DEV *dev[], TRUNK_MEMBER* tm) { GT_STATUS status; int i,j,index; GT_U32 mask, trunkId; TRUNK_SET* ts; GT_U32 portVec[N_OF_QD_DEVICES]; GT_U32 casecadeVec = 0xC0; /* Port 6 and 7. ToDo : get this value from user or device */ /* * Enable Trunk for each member of the Trunk and set the Trunk ID (1). */ printf("Setting TRUNK\n"); printf("Trunk ID : %i\n",(unsigned int)tm->trunkId); printf("N Ports : %i\n",(unsigned int)tm->nTrunkPort); printf("1st Port : Dev %i, Port %i\n", (unsigned int)tm->trunkSet[0].devIndex,(unsigned int)tm->trunkSet[0].port); printf("2nd Port : Dev %i, Port %i\n", (unsigned int)tm->trunkSet[1].devIndex,(unsigned int)tm->trunkSet[1].port); printf("3rd Port : Dev %i, Port %i\n", (unsigned int)tm->trunkSet[2].devIndex,(unsigned int)tm->trunkSet[2].port); printf("4th Port : Dev %i, Port %i\n", (unsigned int)tm->trunkSet[3].devIndex,(unsigned int)tm->trunkSet[3].port); trunkId = tm->trunkId; for(i=0; i<N_OF_QD_DEVICES; i++) portVec[i] = 0; printf("Enabling TRUNK for each member port.\n"); for(i=0; i<tm->nTrunkPort; i++) { ts = &tm->trunkSet[i]; if(ts->devIndex >= N_OF_QD_DEVICES) { printf("Device %i is supported. Max Device Number is %i\n",(unsigned int)ts->devIndex,N_OF_QD_DEVICES-1); return GT_FAIL; } if((dev[ts->devIndex] == NULL) || (!dev[ts->devIndex]->devEnabled)) { printf("Device %i is not initialized\n",(unsigned int)ts->devIndex); return GT_FAIL; } /* enabled trunk on the given port */ if((status = gprtSetTrunkPort(dev[ts->devIndex],ts->port,GT_TRUE,trunkId)) != GT_OK) { MSG_PRINT(("gprtSetTrunkPort return Failed\n")); return status; } portVec[ts->devIndex] |= (1 << ts->port); } /* * Set Trunk Route Table for the given Trunk ID. */ printf("Setting TRUNK Routing Table\n"); for(i=0; i<N_OF_QD_DEVICES; i++) { if((dev[i] == NULL) || (!dev[i]->devEnabled)) { printf("Device %i is not initialized\n",i); break; } if((status = gsysSetTrunkRouting(dev[i],trunkId,portVec[i]|casecadeVec)) != GT_OK) { MSG_PRINT(("gsysSetTrunkRouting return Failed\n")); return status; } } /* * Set Trunk Mask Table for load balancing. */ printf("Setting TRUNK Mask for Load Balancing\n"); for(i=0; i<8; i++) { /* choose a port to be used for the given addr combo index */ index = i % tm->nTrunkPort; ts = &tm->trunkSet[index]; for(j=0; j<N_OF_QD_DEVICES; j++) { if((dev[j] == NULL) || (!dev[j]->devEnabled)) { printf("Device %i is not initialized\n",j); continue; } if(portVec[j] == 0) continue; if((status = gsysGetTrunkMaskTable(dev[j],i,&mask)) != GT_OK) { MSG_PRINT(("gsysGetTrunkMaskTable return Failed\n")); return status; } mask &= ~portVec[j]; if(ts->devIndex == j) mask |= (1 << ts->port); if((status = gsysSetTrunkMaskTable(dev[j],i,mask)) != GT_OK) { MSG_PRINT(("gsysSetTrunkMaskTable return Failed\n")); return status; } } } return GT_OK; }
GT_STATUS sampleFixedCrossChipTrunk(GT_QD_DEV *dev[]) { GT_STATUS status; int i; GT_U32 mask, trunkBit, trunkId; /* * Enable Trunk for each member of the Trunk and set the Trunk ID (1). */ trunkId = 1; if((dev[0] == NULL) || (!dev[0]->devEnabled)) { printf("Device 0 is not initialized\n"); return GT_FAIL; } if((dev[1] == NULL) || (!dev[1]->devEnabled)) { printf("Device 1 is not initialized\n"); return GT_FAIL; } /* setup for Device 0 port 0 */ if((status = gprtSetTrunkPort(dev[0],0,GT_TRUE,trunkId)) != GT_OK) { MSG_PRINT(("gprtSetTrunkPort return Failed\n")); return status; } /* setup for Device 0 port 1 */ if((status = gprtSetTrunkPort(dev[0],1,GT_TRUE,trunkId)) != GT_OK) { MSG_PRINT(("gprtSetTrunkPort return Failed\n")); return status; } /* setup for Device 0 port 2 */ if((status = gprtSetTrunkPort(dev[0],2,GT_TRUE,trunkId)) != GT_OK) { MSG_PRINT(("gprtSetTrunkPort return Failed\n")); return status; } /* setup for Device 1 port 0 */ if((status = gprtSetTrunkPort(dev[1],0,GT_TRUE,trunkId)) != GT_OK) { MSG_PRINT(("gprtSetTrunkPort return Failed\n")); return status; } /* * Set Trunk Route Table for the given Trunk ID. */ /* setup for Device 0, trunk ID 1 : port 0,1,2, and 9 (cascading port, assumption1) */ if((status = gsysSetTrunkRouting(dev[0],trunkId,0x7|0x200)) != GT_OK) { MSG_PRINT(("gsysSetTrunkRouting return Failed\n")); return status; } /* setup for Device 1, trunk ID 1 : port 0, and 8 (cascading port, assumption1) */ if((status = gsysSetTrunkRouting(dev[1],trunkId,0x1|0x100)) != GT_OK) { MSG_PRINT(("gsysSetTrunkRouting return Failed\n")); return status; } /* * Set Trunk Mask Table for load balancing. */ /* Trunk Mask Table for Device 0: 10 9 8 7 6 5 4 3 2 1 0 TrunkMask[0] 1 1 1 1 1 1 1 1 0 0 1 TrunkMask[1] 1 1 1 1 1 1 1 1 0 1 0 TrunkMask[2] 1 1 1 1 1 1 1 1 1 0 0 TrunkMask[3] 1 1 1 1 1 1 1 1 0 0 0 TrunkMask[4] 1 1 1 1 1 1 1 1 0 0 1 TrunkMask[5] 1 1 1 1 1 1 1 1 0 1 0 TrunkMask[6] 1 1 1 1 1 1 1 1 1 0 0 TrunkMask[7] 1 1 1 1 1 1 1 1 0 0 0 Trunk Mask Table for Device 1: 10 9 8 7 6 5 4 3 2 1 0 TrunkMask[0] 1 1 1 1 1 1 1 1 1 1 0 TrunkMask[1] 1 1 1 1 1 1 1 1 1 1 0 TrunkMask[2] 1 1 1 1 1 1 1 1 1 1 0 TrunkMask[3] 1 1 1 1 1 1 1 1 1 1 1 TrunkMask[4] 1 1 1 1 1 1 1 1 1 1 0 TrunkMask[5] 1 1 1 1 1 1 1 1 1 1 0 TrunkMask[6] 1 1 1 1 1 1 1 1 1 1 0 TrunkMask[7] 1 1 1 1 1 1 1 1 1 1 1 */ /* setup for Device 0 */ for(i=0; i<8; i++) { if((i%4) == 3) { trunkBit = 0; } else { trunkBit = 1 << (i%4); } mask = 0x7F8 | trunkBit; if((status = gsysSetTrunkMaskTable(dev[0],i,mask)) != GT_OK) { MSG_PRINT(("gsysSetTrunkMaskTable return Failed\n")); return status; } } /* setup for Device 1 */ for(i=0; i<8; i++) { if((i%4) == 3) { trunkBit = 1; } else { trunkBit = 0; } mask = 0x7FE | trunkBit; if((status = gsysSetTrunkMaskTable(dev[1],i,mask)) != GT_OK) { MSG_PRINT(("gsysSetTrunkMaskTable return Failed\n")); return status; } } return GT_OK; }
GT_STATUS sampleIsolatedCPUPort(GT_QD_DEV *dev, GT_U8* macAddr) { GT_STATUS status; int i; GT_LPORT memPorts[16], cpuPort; GT_U8 memPortsLen, index; GT_ATU_ENTRY macEntry; cpuPort = (GT_LPORT)dev->cpuPortNum; /* * Remove CPU port from VLAN Member Table. */ for(i=0; i<dev->numOfPorts; i++) { if((status = gvlnGetPortVlanPorts(dev,(GT_LPORT)i,memPorts,&memPortsLen)) != GT_OK) { MSG_PRINT(("gvlnGetPortVlanPorts return Failed\n")); return status; } for(index=0; index<memPortsLen; index++) { if (memPorts[index] == cpuPort) break; } if(index != memPortsLen) { /* CPU Port is the member of the port vlan */ if((memPortsLen-1) != index) { memPorts[index] = memPorts[memPortsLen-1]; } memPortsLen--; if((status = gvlnSetPortVlanPorts(dev,(GT_LPORT)i,memPorts,memPortsLen)) != GT_OK) { MSG_PRINT(("gvlnSetPortVlanPorts return Failed\n")); return status; } } } /* * Mirror ARPs to the CPU with To_CPU Marvell Tag. */ if((status = gsysSetARPDest(dev,cpuPort)) != GT_OK) { MSG_PRINT(("gsysSetARPDest return Failed\n")); return status; } /* * Convert unicast frames directed to the CPU into To_CPU Marvell Tag. * This sample assumes that DBNum is not used. If DBNum is used, * the macEntry has to be added for each DBNum used. */ memset(&macEntry,0,sizeof(GT_ATU_ENTRY)); memcpy(macEntry.macAddr.arEther,macAddr,6); macEntry.portVec = 1 << dev->cpuPortNum; macEntry.prio = 0; /* Priority (2bits). When these bits are used they override any other priority determined by the frame's data */ macEntry.entryState.ucEntryState = GT_UC_TO_CPU_STATIC; macEntry.DBNum = 0; macEntry.trunkMember = GT_FALSE; if((status = gfdbAddMacEntry(dev,&macEntry)) != GT_OK) { MSG_PRINT(("gsysSetARPDest return Failed\n")); return status; } return GT_OK; }
void sampleDisplayCableTestResult ( GT_TEST_STATUS *cableStatus, GT_CABLE_LEN *cableLen ) { switch(*cableStatus) { case GT_TEST_FAIL: MSG_PRINT(("Cable Test Failed\n")); break; case GT_NORMAL_CABLE: MSG_PRINT(("Cable Test Passed. No problem found.\n")); switch(cableLen->normCableLen) { case GT_LESS_THAN_50M: MSG_PRINT(("Cable Length is less than 50M.\n")); break; case GT_50M_80M: MSG_PRINT(("Cable Length is between 50M and 80M.\n")); break; case GT_80M_110M: MSG_PRINT(("Cable Length is between 80M and 110M.\n")); break; case GT_110M_140M: MSG_PRINT(("Cable Length is between 110M and 140M.\n")); break; case GT_MORE_THAN_140: MSG_PRINT(("Cable Length is over 140M.\n")); break; default: MSG_PRINT(("Cable Length is unknown.\n")); break; } break; case GT_IMPEDANCE_MISMATCH: MSG_PRINT(("Cable Test Passed. Cable has Impedance Mismatch .\n")); MSG_PRINT(("Approximatly %i meters from the tested port.\n",cableLen->errCableLen)); break; case GT_OPEN_CABLE: MSG_PRINT(("Cable Test Passed. Cable is open.\n")); MSG_PRINT(("Approximatly %i meters from the tested port.\n",cableLen->errCableLen)); break; case GT_SHORT_CABLE: MSG_PRINT(("Cable Test Passed. Cable is short.\n")); MSG_PRINT(("Approximatly %i meters from the tested port.\n",cableLen->errCableLen)); break; default: MSG_PRINT(("Unknown Test Result.\n")); break; } }