void libmixer_init() { REG_SUB(libmixer, "surmxAAN", cellAANAddData, 0xffffffff7c691b78, 0xffffffff7c0802a6, 0xfffffffff821ff91, 0xfffffffff8010080, 0xffffffff7c802378, 0xffffffff7caa2b78, 0xffffffff81690000, 0xffffffff7c050378, 0xffffffff7cc43378, 0x78630020, // clrldi r3,r3,32 0xffffffff7d465378, 0xffffffff812b0030, 0xffffffff80090000, 0xfffffffff8410028, 0xffffffff7c0903a6, 0xffffffff80490004, 0xffffffff4e800421, 0xffffffffe8410028, 0xffffffffe8010080, 0xffffffff7c6307b4, 0xffffffff7c0803a6, 0xffffffff38210070, 0xffffffff4e800020 ); REG_SUB(libmixer, "surmxAAN", cellAANConnect, 0xfffffffff821ff71, 0xffffffff7c0802a6, 0xffffffff2f830000, 0xfffffffff80100a0, 0xffffffff3c008031, 0xffffffff7c691b78, 0xffffffff7c8a2378, 0xffffffff60000003, 0xffffff00409e0018, // bne 0xffffffff7c0307b4, 0xffffffffe80100a0, 0xffffffff38210090, 0xffffffff7c0803a6, 0xffffffff4e800020, 0xffffffff2f850000, 0xffffffff78630020, 0xffffffff38810070, 0xffffff00419effe0, // beq 0xffffffff81690000, 0xffffffff38000001, 0xffffffff91210074, 0xffffffff90a10070, 0xffffffff90c10078, 0xffffffff9141007c, 0xffffffff812b0018, // difference 0xffffffff90010080, 0xffffffff80090000, 0xfffffffff8410028, 0xffffffff7c0903a6, 0xffffffff80490004, 0xffffffff4e800421, 0xffffffffe8410028, 0xffffffff7c601b78, 0xffffffff7c0307b4, 0xffffffffe80100a0, 0xffffffff38210090, 0xffffffff7c0803a6, 0xffffffff4e800020 ); REG_SUB(libmixer, "surmxAAN", cellAANDisconnect, 0xfffffffff821ff71, 0xffffffff7c0802a6, 0xffffffff2f830000, 0xfffffffff80100a0, 0xffffffff3c008031, 0xffffffff7c691b78, 0xffffffff7c8a2378, 0xffffffff60000003, 0xffffff00409e0018, // bne 0xffffffff7c0307b4, 0xffffffffe80100a0, 0xffffffff38210090, 0xffffffff7c0803a6, 0xffffffff4e800020, 0xffffffff2f850000, 0xffffffff78630020, 0xffffffff38810070, 0xffffff00419effe0, // beq 0xffffffff81690000, 0xffffffff38000001, 0xffffffff91210074, 0xffffffff90a10070, 0xffffffff90c10078, 0xffffffff9141007c, 0xffffffff812b001c, // difference 0xffffffff90010080, 0xffffffff80090000, 0xfffffffff8410028, 0xffffffff7c0903a6, 0xffffffff80490004, 0xffffffff4e800421, 0xffffffffe8410028, 0xffffffff7c601b78, 0xffffffff7c0307b4, 0xffffffffe80100a0, 0xffffffff38210090, 0xffffffff7c0803a6, 0xffffffff4e800020 ); REG_SUB(libmixer, "surmixer", cellSurMixerCreate, 0xffffffff2f830000, 0xffffffff7c0802a6, 0xfffffffff821ff51, 0xfffffffffbc100a0, 0xfffffffffb210078, 0xfffffffffb410080, 0xfffffffffb610088, 0xfffffffffb810090, 0xfffffffffba10098, 0xfffffffffbe100a8, 0xfffffffff80100c0, 0xffffffff7c7e1b78, 0xf000000040000000, // bne 0xffffffff3fe08031, 0xffffffff63ff0003, 0xffffffffe80100c0, 0xffffffff7fe307b4, 0xffffffffeb210078, 0xffffffffeb410080, 0xffffffff7c0803a6, 0xffffffffeb610088, 0xffffffffeb810090, 0xffffffffeba10098, 0xffffffffebc100a0, 0xffffffffebe100a8, 0xffffffff382100b0 ); REG_SUB(libmixer, "surmixer", cellSurMixerGetAANHandle, 0xff00000081428250, // lwz 0xffffffff3d607fce, 0xffffffff616bfffe, 0xffffffff812a0018, 0xffffffff7d2afe70, 0xffffffff91230000, 0xffffffff7d404a78, 0xffffffff7c005050, 0xffffffff7c00fe70, 0xffffffff7c035838, 0xffffffff3c638031, 0xffffffff38630002, 0xffffffff7c6307b4, 0xffffffff4e800020 ); REG_SUB(libmixer, "surmixer", cellSurMixerChStripGetAANPortNo, 0xff00000081228250, // lwz 0xffffffff7c661b78, 0xffffffff3c608031, 0xffffffff78c60020, 0xffffffff78840020, 0xffffffff60630002, 0xffffffff80090018, 0xffffffff78a50020, 0xffffffff2f800000, 0xffffffff4d9e0020, 0xffffffff78030020, 0xf000000040000000 // b ); REG_SUB(libmixer, "surmixer", cellSurMixerSetNotifyCallback, 0xff00000081428250, // lwz 0xffffffff7c0802a6, 0xfffffffff821ff81, 0xfffffffff8010090, 0xffffffff7c6b1b78, 0xffffffff3c608031, 0xffffffff812a0018, 0xffffffff7c882378, 0xffffffff60630003, 0xffffffff2f890000, 0xffffffff2f0b0000, 0xffffff00409e0020, // bne 0xffffffff3c608031, 0xffffffff60630002, 0xffffffffe8010090, 0xffffffff7c6307b4, 0xffffffff38210080, 0xffffffff7c0803a6, 0xffffffff4e800020, 0xffffff00419affec, // beq 0xf0000000800a001c, // lwz 0xffffffff79290020, 0xffffffff38810070, 0xffffffff2f800000, 0xffffffff7d234b78 ); REG_SUB(libmixer, "surmixer", cellSurMixerRemoveNotifyCallback, 0xff00000081628250, // lwz 0xffffffff7c0802a6, 0xfffffffff821ff81, 0xfffffffff8010090, 0xffffffff7c6a1b78, 0xffffffff3d208031, 0xffffffff806b0018, 0xffffffff61290002, // ori 0xffffffff2f830000, 0xffff0000409e0018, // bne 0xffffffffe8010090, 0xffffffff7d2307b4, 0xffffffff38210080, 0xffffffff7c0803a6, 0xffffffff4e800020 ); REG_SUB(libmixer, "surmixer", cellSurMixerStart, 0xfffffffff821ff71, 0xffffffff7c0802a6, 0xfffffffffbc10080, 0xf000000083c20000, // lwz 0xfffffffff80100a0, 0xfffffffffba10078, 0xfffffffffbe10088, 0xffffffff801e0018, 0xffffffff2f800000, 0xf0000000409e002c, // bne 0xffffffff3fe08031, 0xffffffff63ff0002, 0xffffffffe80100a0, 0xffffffff7fe307b4, 0xffffffffeba10078, 0xffffffffebc10080, 0xffffffff7c0803a6, 0xffffffffebe10088, 0xffffffff38210090, 0xffffffff4e800020 ); REG_SUB(libmixer, "surmixer", cellSurMixerSetParameter, 0xfffffffff821ff81, 0xffffffff7c0802a6, 0xfffffffffbc10070, 0xfffffffffc000890, 0xf000000083c28250, // lwz 0xffffffff3d208031, 0xfffffffff8010090, 0xfffffffffbe10078, 0xffffffff61290002, 0xffffffff7c7f1b78, 0xffffffff801e0018, 0xffffffff2f800000, 0xffff0000409e0020, // bne 0xffffffffe8010090, 0xffffffff7d2307b4, 0xffffffffebc10070, 0xffffffffebe10078, 0xffffffff7c0803a6, 0xffffffff38210080, 0xffffffff4e800020, 0xffffffff801e001c, 0xffffffff2b03001f, 0xffffffff2f800000, 0xffff0000419cffd8, // blt 0xffffffff2b83002b, 0xffff000040990008, // ble 0xffff0000409d0054 // ble ); REG_SUB(libmixer, "surmixer", cellSurMixerFinalize, 0xfffffffff821ff91, 0xffffffff7c0802a6, 0xfffffffff8010080, 0xffffff004bfffde1, // bl 0xffffffffe8010080, 0xffffffff38600000, 0xffffffff38210070, 0xffffffff7c0803a6, 0xffffffff4e800020, 0xfffffffff821ff71, 0xffffffff7c0802a6, 0xfffffffffba10078, 0xf000000083a28250, // lwz 0xfffffffff80100a0, 0xffffffff817d0018, 0xffffffff7d635b78, 0xffffffff812b0000, 0xffffffff81490000, 0xffffffff800a0000, 0xfffffffff8410028, 0xffffffff7c0903a6, 0xffffffff804a0004, 0xffffffff4e800421 ); REG_SUB(libmixer, "surmixer", cellSurMixerSurBusAddData, 0xff00000081428250, // lwz 0xffffffff7c0802a6, 0xfffffffff821ff91, 0xfffffffff8010080, 0xffffffff7c601b78, 0xffffffff3d208031, 0xffffffff806a0018, 0xffffffff7c8b2378, 0xffffffff7cc73378, 0xffffffff2f830000, 0xffffffff61290002, 0xffff0000409e0018, // bne 0xffffffffe8010080, 0xffffffff7d2307b4, 0xffffffff38210070, 0xffffffff7c0803a6, 0xffffffff4e800020, 0xffffffff78a40020, 0xffffffff78050020, 0xffffffff800a001c, 0xffffffff78680020, 0xffffffff2f800000, 0xffffffff7d034378, 0xffffffff79660020, 0xffffffff78e70020, 0xffff0000419cffcc // blt ); REG_SUB(libmixer, "surmixer", cellSurMixerChStripSetParameter, 0xff00000081028250, // lwz 0xffffffff7c6b1b78, 0xffffffff3c608031, 0xffffffff7c8a2378, 0xffffffff7ca62b78, 0xffffffff60630002, 0xffffffff81280018, 0xffffffff2f890000, 0xffff00004d9e0020, // beqlr 0xffffffff8008001c, 0xffffffff79640020, 0xffffffff79450020, 0xffffffff2f800000, 0xffffffff78c60020, 0xffffffff4d9c0020, 0xffffffff79230020, 0xf000000048000000 // b ); REG_SUB(libmixer, "surmixer", cellSurMixerPause, 0xff00000081428250, // lwz 0xffffffff7c0802a6, 0xfffffffff821ff81, 0xfffffffff8010090, 0xffffffff3d208031, 0xfffffffffbe10078, 0xffffffff800a0018, 0xffffffff7c7f1b78, 0xfffffffffbc10070, 0xffffffff2f800000, 0xffffffff61290002, 0xffff0000409e0020, // bne 0xffffffffe8010090, 0xffffffff7d2307b4, 0xffffffffebc10070, 0xffffffffebe10078, 0xffffffff7c0803a6, 0xffffffff38210080, 0xffffffff4e800020, 0xffffffff800a001c, 0xffffffff2b030002, 0xffffffff2f800000 ); REG_SUB(libmixer, "surmixer", cellSurMixerGetCurrentBlockTag, 0xff00000081628250, // lwz 0xffffffff3d208031, 0xffffffff61290002, 0xffffffff880b0020, 0xffffffff2f800000, 0xffff0000419e0010, // beq 0xffffffffe80b0028, 0xffffffff39200000, 0xfffffffff8030000, 0xffffffff7d2307b4, 0xffffffff4e800020 ); REG_SUB(libmixer, "surmixer", cellSurMixerGetTimestamp, 0xff00000081628250, // lwz 0xffffffff7c0802a6, 0xfffffffff821ff91, 0xfffffffff8010080, 0xffffffff7c852378, 0xffffffff3d208031, 0xffffffff880b0020, 0xffffffff7c641b78, 0xffffffff78a50020, 0xffffffff2f800000, 0xffffffff61290002, 0xffff000040de0018, // bne- 0xffffffffe8010080, 0xffffffff7d2307b4, 0xffffffff38210070, 0xffffffff7c0803a6, 0xffffffff4e800020, 0xffffffff806b04d8, 0xf000000048000001 // bl ); REG_SUB(libmixer, "surmixer", cellSurMixerBeep, 0xff00000081228250, // lwz 0xffffffff7c641b78, 0xffffffff80690018, 0xffffffff2f830000, 0xffff00004d9e0020, // beqlr 0xffffffff8009001c, 0xffffffff78630020, 0xffffffff78840020, 0xffffffff2f800000, 0xffffffff4d9c0020, 0xf000000048000000 // b ); REG_SUB(libmixer, "surmxSSP", cellSSPlayerCreate, 0xfffffffff821ff51, 0xffffffff7c0802a6, 0xffffffff2f840000, 0xfffffffff80100c0, 0xffffffff3c008031, 0xfffffffffb210078, 0xfffffffffb410080, 0xfffffffffb610088, 0xfffffffffb810090, 0xfffffffffba10098, 0xfffffffffbc100a0, 0xfffffffffbe100a8, 0xffffffff7c9a2378, 0xffffffff7c791b78, 0xffffffff60000003, 0xffff0000419e0068, // beq 0xff00000083620000, // lwz 0xffffffff3b800000, 0xffffffff381b0064, 0xffffffff901b0018, 0xffffffff5780103a, 0xffffffff38800010, 0xffffffff7c0007b4, 0xffffffff38a01c70, 0xffffffff7fc0da14, 0xffffffff38c00000, 0xffffffff83be0024, 0xffffffff2f9d0000, 0xffffffff7ba30020, 0xffff000041de00c0, // beq- 0xf000000048000001 // bl ); REG_SUB(libmixer, "surmxSSP", cellSSPlayerRemove, 0xffffffff7c641b78, 0xffffffff7c0802a6, 0xffffffff3c608031, 0xffffffff2f840000, 0xfffffffff821ff51, 0xfffffffffb010070, 0xfffffffffb210078, 0xfffffffffb410080, 0xfffffffffb610088, 0xfffffffffb810090, 0xfffffffffba10098, 0xfffffffffbc100a0, 0xfffffffffbe100a8, 0xfffffffff80100c0, 0xffffffff60630003, 0xffff0000419e0074, // beq 0xffffffff81240000, 0xffffffff78830020, 0xffffffff83440004, 0xffffffff83240008, 0xffffffff7b5b0020, 0xffffffff81690000, 0xffffffff800b0000, 0xfffffffff8410028, 0xffffffff7c0903a6, 0xffffffff804b0004, 0xffffffff4e800421 ); REG_SUB(libmixer, "surmxSSP", cellSSPlayerSetWave, 0xffffffff7c601b78, 0xffffffff78840020, 0xffffffff2f800000, 0xffffffff3c608031, 0xffffffff78a50020, 0xffff0000419e000c, // beq 0xffffffff78030020, 0xf000000048000000, // b 0xffffffff60630003, 0xffffffff4e800020 ); REG_SUB(libmixer, "surmxSSP", cellSSPlayerPlay, 0xffffffff7c601b78, 0xffffffff3c608031, 0xffffffff2f800000, 0xffffffff60630003, 0xffffffff78840020, 0xffffffff4d9e0020, 0xffffffff78030020, 0xf000000048000000, // b 0xfffffffff821ff81, // next func 0xffffffff7c0802a6, 0xfffffffffbe10078, 0xffffffff7c7f1b78, 0xff00000081620028, // lwz 0xfffffffff8010090, 0xffffffff39400000, 0xffffffff38630010 ); REG_SUB(libmixer, "surmxSSP", cellSSPlayerStop, 0xfffffffff821ff91, 0xffffffff7c0802a6, 0xffffffff2f830000, 0xfffffffff8010080, 0xffffffff3c008031, 0xffffffff78630020, 0xffffffff60000003, 0xffff0000419e0010, // beq 0xffffffff78840020, 0xf000000048000001, // bl 0xffffffff38000000, 0xffffffff7c0307b4, 0xffffffffe8010080, 0xffffffff38210070, 0xffffffff7c0803a6, 0xffffffff4e800020 ); REG_SUB(libmixer, "surmxSSP", cellSSPlayerSetParam, 0xffffffff7c601b78, 0xffffffff3c608031, 0xffffffff2f800000, 0xffffffff60630003, 0xffffffff78840020, 0xffffffff4d9e0020, 0xffffffff78030020, 0xf000000048000000, // b 0xfffffffff821ff71, // next func 0xffffffff7c0802a6, 0xffffffff3d608031, 0xfffffffff80100a0, 0xffffffff80030068, 0xffffffff616b0002, 0xfffffffffbc10080, 0xffffffff2f800000 ); REG_SUB(libmixer, "surmxSSP", cellSSPlayerGetState, 0xffffffff7c601b78, 0xffffffff3c608031, 0xffffffff2f800000, 0xffffffff60630003, 0xffffffff4d9e0020, 0xffffffff78030020, 0xf000000048000000 // b ); REG_SUB(libmixer, "surmxUti", cellSurMixerUtilGetLevelFromDB, 0); REG_SUB(libmixer, "surmxUti", cellSurMixerUtilGetLevelFromDBIndex, 0); REG_SUB(libmixer, "surmxUti", cellSurMixerUtilNoteToRatio, 0); }
/* * Function: * _bcm_stat_ge_get * Description: * Get the specified statistic for a GE port in 1000 Mb mode on the * StrataSwitch family of devices. * Parameters: * unit - StrataSwitch PCI device unit number (driver internal). * port - zero-based port number * sync_mode - if 1 read hw counter else sw accumualated counter * type - SNMP statistics type (see bcm/stat.h) * val - (OUT) 64 bit statistic counter value * Returns: * BCM_E_NONE - Success. * BCM_E_PARAM - Illegal parameter. * BCM_E_INTERNAL - Chip access failure. */ int _bcm_stat_ge_get(int unit, bcm_port_t port, int sync_mode, bcm_stat_val_t type, uint64 *val, int incl_non_ge_stat) { uint64 count, count1; REG_MATH_DECL; /* Required for use of the REG_* macros */ COMPILER_REFERENCE(&count); /* Work around PPC compiler bug */ COMPILER_64_ZERO(count); switch (type) { /* *** RFC 1213 *** */ case snmpIfInOctets: REG_ADD(unit, port, sync_mode, GRBYTr, count); /* bytes rcvd */ REG_ADD(unit, port, sync_mode, RRBYTr, count); /* Runt bytes */ break; case snmpIfInUcastPkts: /* Unicast packets received */ if (soc_feature(unit, soc_feature_hw_stats_calc)) { if (SOC_REG_IS_VALID(unit, GRUCr) && !((SOC_IS_RAPTOR(unit) || SOC_IS_RAVEN(unit)) && SOC_IS_STACK_PORT(unit, port))) { REG_ADD(unit, port, sync_mode, GRUCr, count); } else { if (incl_non_ge_stat) { /* RUC switch register has the count of all received packets, * add the count when incl_non_ge_stat flag is set. */ REG_ADD(unit, port, sync_mode, RUCr, count); /* unicast pkts rcvd */ } } } else { REG_ADD(unit, port, sync_mode, GRPKTr, count); /* all pkts rcvd */ REG_SUB(unit, port, sync_mode, GRMCAr, count); /* - multicast */ REG_SUB(unit, port, sync_mode, GRBCAr, count); /* - broadcast */ REG_SUB(unit, port, sync_mode, GRALNr, count); /* - bad FCS, dribble bit */ REG_SUB(unit, port, sync_mode, GRFCSr, count); /* - bad FCS, no dribble bit */ REG_SUB(unit, port, sync_mode, GRJBRr, count); /* - oversize, bad FCS */ if (SOC_REG_IS_VALID(unit, GRMTUEr)) { REG_SUB(unit, port, sync_mode, GRMTUEr, count); /* - mtu exceeded, good FCS */ if (SOC_REG_IS_VALID(unit, GROVRr)) { REG_SUB(unit, port, sync_mode, GROVRr, count); } } else if (COUNT_OVR_ERRORS(unit)) { REG_SUB(unit, port, sync_mode, GROVRr, count); /* - oversize, good FCS */ } } break; case snmpIfInNUcastPkts: /* Non Unicast packets received */ REG_ADD(unit, port, sync_mode, GRMCAr, count); /* multicast pkts rcvd */ REG_ADD(unit, port, sync_mode, GRBCAr, count); /* broadcast pkts rcvd */ break; case snmpIfInBroadcastPkts: /* Broadcast packets received */ REG_ADD(unit, port, sync_mode, GRBCAr, count); /* broadcast pkts rcvd */ break; case snmpIfInMulticastPkts: /* Multicast packets received */ REG_ADD(unit, port, sync_mode, GRMCAr, count); /* multicast pkts rcvd */ break; case snmpIfInDiscards: /* Dropped packets including aborted */ if (soc_feature(unit, soc_feature_stat_xgs3)) { if (incl_non_ge_stat) { REG_ADD(unit, port, sync_mode, RDBGC0r, count); /* Ingress drop conditions */ BCM_IF_ERROR_RETURN (_bcm_stat_counter_non_dma_extra_get(unit, SOC_COUNTER_NON_DMA_PORT_DROP_PKT_ING, port, &count1)); COMPILER_64_ADD_64(count, count1); } } break; case snmpIfInErrors: /* Receive packets containing errors */ REG_ADD(unit, port, sync_mode, GRUNDr, count); /* undersize pkts, good FCS */ REG_ADD(unit, port, sync_mode, GRFRGr, count); /* undersize pkts, bad FCS */ REG_ADD(unit, port, sync_mode, GRFCSr, count); /* FCS errors */ if (SOC_REG_IS_VALID(unit, GRMTUEr)) { REG_ADD(unit, port, sync_mode, GRMTUEr, count); /* mtu exceeded pkts, good FCS */ } else if (COUNT_OVR_ERRORS(unit)) { REG_ADD(unit, port, sync_mode, GROVRr, count); /* oversize pkts, good FCS */ } REG_ADD(unit, port, sync_mode, GRJBRr, count); /* oversize pkts, bad FCS */ break; case snmpIfInUnknownProtos: break; case snmpIfOutOctets: REG_ADD(unit, port, sync_mode, GTBYTr, count); /* transmit bytes */ break; case snmpIfOutUcastPkts: #if defined(BCM_RAPTOR_SUPPORT) || defined(BCM_FIREBOLT2_SUPPORT) || \ defined(BCM_TRX_SUPPORT) if (soc_feature(unit, soc_feature_hw_stats_calc)) { REG_ADD(unit, port, sync_mode, GTUCr, count); /* unicast pkts sent */ } else #endif /* BCM_RAPTOR_SUPPORT || BCM_FIREBOLT2_SUPPORT || BCM_TRX_SUPPORT */ { REG_ADD(unit, port, sync_mode, GTPKTr, count); /* all pkts xmited */ REG_SUB(unit, port, sync_mode, GTMCAr, count); /* - multicast */ REG_SUB(unit, port, sync_mode, GTBCAr, count); /* - broadcast */ REG_SUB(unit, port, sync_mode, GTFCSr, count); /* - bad FCS */ REG_SUB(unit, port, sync_mode, GTJBRr, count); /* - oversize, bad FCS */ if (COUNT_OVR_ERRORS(unit)) { REG_SUB(unit, port, sync_mode, GTOVRr, count); /* - oversize, good FCS */ } } break; case snmpIfOutNUcastPkts: REG_ADD(unit, port, sync_mode, GTMCAr, count); /* multicast pkts */ REG_ADD(unit, port, sync_mode, GTBCAr, count); /* broadcast pkts */ break; case snmpIfOutBroadcastPkts: REG_ADD(unit, port, sync_mode, GTBCAr, count); /* broadcast pkts */ break; case snmpIfOutMulticastPkts: REG_ADD(unit, port, sync_mode, GTMCAr, count); /* multicast pkts */ break; case snmpIfOutDiscards: REG_ADD(unit, port, sync_mode, GTEDFr, count); /* multiple deferral */ if (soc_feature(unit, soc_feature_stat_xgs3)) { if (incl_non_ge_stat) { REG_ADD(unit, port, sync_mode, HOLDr, count); /* L2 MTU drops */ REG_ADD(unit, port, sync_mode, TDBGC3r, count); BCM_IF_ERROR_RETURN (_bcm_stat_counter_extra_get(unit, EGRDROPPKTCOUNTr, port, &count1)); COMPILER_64_ADD_64(count, count1); BCM_IF_ERROR_RETURN (_bcm_stat_counter_non_dma_extra_get(unit, SOC_COUNTER_NON_DMA_COSQ_DROP_PKT, port, &count1)); COMPILER_64_ADD_64(count, count1); } } /* other causes of discards? */ break; case snmpIfOutErrors: REG_ADD(unit, port, sync_mode, GTXCLr, count); /* excessive collisions */ break; case snmpIfOutQLen: { uint32 qcount; if (incl_non_ge_stat) { if (bcm_esw_port_queued_count_get(unit, port, &qcount) >= 0) { COMPILER_64_ADD_32(count, qcount); } } } break; case snmpIpInReceives: if (soc_feature(unit, soc_feature_stat_xgs3)) { if (incl_non_ge_stat) { REG_ADD(unit, port, sync_mode, RIPC4r, count); } } break; case snmpIpInHdrErrors: if (soc_feature(unit, soc_feature_stat_xgs3)) { if (incl_non_ge_stat) { REG_ADD(unit, port, sync_mode, RIPD4r, count); } } break; /* ipInAddrErrors */ case snmpIpForwDatagrams: if (soc_feature(unit, soc_feature_stat_xgs3)) { if (incl_non_ge_stat) { REG_ADD(unit, port, sync_mode, TDBGC4r, count); } } break; /* ipInUnknownProtos */ case snmpIpInDiscards: if (soc_feature(unit, soc_feature_stat_xgs3)) { if (incl_non_ge_stat) { REG_ADD(unit, port, sync_mode, RIPHE4r, count); REG_ADD(unit, port, sync_mode, RIPD4r, count); } } break; /* ipInDelivers */ /* ipOutRequests */ /* ipOutDiscards */ /* ipOutNoRoutes */ /* *** RFC 1493 *** */ case snmpDot1dBasePortDelayExceededDiscards: REG_ADD(unit, port, sync_mode, GTEDFr, count); /* multiple deferral */ break; case snmpDot1dBasePortMtuExceededDiscards: if (SOC_REG_IS_VALID(unit, GRMTUEr)) { REG_ADD(unit, port, sync_mode, GRMTUEr, count); /* mtu exceeded pkts */ } else if (COUNT_OVR_ERRORS(unit)) { REG_ADD(unit, port, sync_mode, GROVRr, count); /* oversize pkts */ } if (COUNT_OVR_ERRORS(unit)) { REG_ADD(unit, port, sync_mode, GTOVRr, count); /* oversize pkts */ } break; case snmpDot1dTpPortInFrames: /* should be only bridge mgmt */ REG_ADD(unit, port, sync_mode, GRPKTr, count); break; case snmpDot1dTpPortOutFrames: /* should be only bridge mgmt */ REG_ADD(unit, port, sync_mode, GTPKTr, count); break; case snmpDot1dPortInDiscards: if (soc_feature(unit, soc_feature_stat_xgs3)) { if (incl_non_ge_stat) { REG_ADD(unit, port, sync_mode, RDISCr, count); REG_ADD(unit, port, sync_mode, RIPD4r, count); REG_ADD(unit, port, sync_mode, RIPD6r, count); REG_ADD(unit, port, sync_mode, RPORTDr, count); } } break; /* *** RFC 1757 *** */ case snmpEtherStatsDropEvents: if (soc_feature(unit, soc_feature_stat_xgs3)) { if (incl_non_ge_stat) { REG_ADD(unit, port, sync_mode, RDISCr, count); } } break; case snmpEtherStatsOctets: REG_ADD(unit, port, sync_mode, GRBYTr, count); REG_ADD(unit, port, sync_mode, GTBYTr, count); if (SOC_REG_IS_VALID(unit, GRRBYTr)) { REG_ADD(unit,port,sync_mode,GRRBYTr,count); /* Runt bytes */ } else { REG_ADD(unit, port, sync_mode, RRBYTr, count); /* Runt bytes */ } break; case snmpEtherStatsPkts: REG_ADD(unit, port, sync_mode, GRPKTr, count); REG_ADD(unit, port, sync_mode, GTPKTr, count); if (SOC_REG_IS_VALID(unit, GRRPKTr)) { REG_ADD(unit, port, sync_mode, GRRPKTr, count); /* Runt packets */ } else { REG_ADD(unit, port, sync_mode, RRPKTr, count); /* Runt packets */ } break; case snmpEtherStatsBroadcastPkts: REG_ADD(unit, port, sync_mode, GRBCAr, count); REG_ADD(unit, port, sync_mode, GTBCAr, count); break; case snmpEtherStatsMulticastPkts: REG_ADD(unit, port, sync_mode, GRMCAr, count); REG_ADD(unit, port, sync_mode, GTMCAr, count); break; case snmpEtherStatsCRCAlignErrors: /* CRC errors + alignment errors */ REG_ADD(unit, port, sync_mode, GRFCSr, count); break; case snmpEtherStatsUndersizePkts: /* Undersize frames */ REG_ADD(unit, port, sync_mode, GRUNDr, count); break; case snmpEtherStatsOversizePkts: if (soc_feature(unit, soc_feature_stat_jumbo_adj)) { REG_ADD(unit, port, sync_mode, GROVRr, count); REG_ADD(unit, port, sync_mode, GTOVRr, count); } else { REG_ADD(unit, port, sync_mode, GRJBRr, count); REG_ADD(unit, port, sync_mode, GTJBRr, count); } break; case snmpEtherRxOversizePkts: if (soc_feature(unit, soc_feature_stat_jumbo_adj)) { REG_ADD(unit, port, sync_mode, GROVRr, count); } break; case snmpEtherTxOversizePkts: if (soc_feature(unit, soc_feature_stat_jumbo_adj)) { REG_ADD(unit, port, sync_mode, GTOVRr, count); } break; case snmpEtherStatsFragments: REG_ADD(unit, port, sync_mode, GRFRGr, count); REG_ADD(unit, port, sync_mode, GTFRGr, count); break; case snmpEtherStatsJabbers: REG_ADD(unit, port, sync_mode, GRJBRr, count); REG_ADD(unit, port, sync_mode, GTJBRr, count); break; case snmpEtherStatsCollisions: REG_ADD(unit, port, sync_mode, GTNCLr, count); break; case snmpEtherStatsPkts64Octets: if (soc_feature(unit, soc_feature_stat_xgs3)) { REG_ADD(unit, port, sync_mode, GR64r, count); REG_ADD(unit, port, sync_mode, GT64r, count); } break; case snmpEtherStatsPkts65to127Octets: if (soc_feature(unit, soc_feature_stat_xgs3)) { REG_ADD(unit, port, sync_mode, GR127r, count); REG_ADD(unit, port, sync_mode, GT127r, count); } break; case snmpEtherStatsPkts128to255Octets: if (soc_feature(unit, soc_feature_stat_xgs3)) { REG_ADD(unit, port, sync_mode, GR255r, count); REG_ADD(unit, port, sync_mode, GT255r, count); } break; case snmpEtherStatsPkts256to511Octets: if (soc_feature(unit, soc_feature_stat_xgs3)) { REG_ADD(unit, port, sync_mode, GR511r, count); REG_ADD(unit, port, sync_mode, GT511r, count); } break; case snmpEtherStatsPkts512to1023Octets: if (soc_feature(unit, soc_feature_stat_xgs3)) { REG_ADD(unit, port, sync_mode, GR1023r, count); REG_ADD(unit, port, sync_mode, GT1023r, count); } break; case snmpEtherStatsPkts1024to1518Octets: if (soc_feature(unit, soc_feature_stat_xgs3)) { REG_ADD(unit, port, sync_mode, GR1518r, count); REG_ADD(unit, port, sync_mode, GT1518r, count); } break; /* *** not actually in rfc1757 *** */ case snmpBcmEtherStatsPkts1519to1522Octets: if (soc_feature(unit, soc_feature_stat_xgs3)) { REG_ADD(unit, port, sync_mode, GRMGVr, count); REG_ADD(unit, port, sync_mode, GTMGVr, count); } break; case snmpBcmEtherStatsPkts1522to2047Octets: if (soc_feature(unit, soc_feature_stat_xgs3)) { REG_ADD(unit, port, sync_mode, GR2047r, count); REG_SUB(unit, port, sync_mode, GRMGVr, count); REG_ADD(unit, port, sync_mode, GT2047r, count); REG_SUB(unit, port, sync_mode, GTMGVr, count); } break; case snmpBcmEtherStatsPkts2048to4095Octets: if (soc_feature(unit, soc_feature_stat_xgs3)) { REG_ADD(unit, port, sync_mode, GR4095r, count); REG_ADD(unit, port, sync_mode, GT4095r, count); } break; case snmpBcmEtherStatsPkts4095to9216Octets: if (soc_feature(unit, soc_feature_stat_xgs3)) { REG_ADD(unit, port, sync_mode, GR9216r, count); REG_ADD(unit, port, sync_mode, GT9216r, count); } break; #ifdef BCM_KATANA_SUPPORT case snmpBcmEtherStatsPkts9217to16383Octets: /* not in rfc1757 */ if(SOC_IS_KATANA(unit)) { if (soc_feature(unit, soc_feature_stat_xgs3)) { REG_ADD(unit, port, sync_mode, GR16383r, count); REG_ADD(unit, port, sync_mode, GT16383r, count); } } break; #endif case snmpBcmReceivedPkts64Octets: REG_ADD(unit, port, sync_mode, GR64r, count); break; case snmpBcmReceivedPkts65to127Octets: REG_ADD(unit, port, sync_mode, GR127r, count); break; case snmpBcmReceivedPkts128to255Octets: REG_ADD(unit, port, sync_mode, GR255r, count); break; case snmpBcmReceivedPkts256to511Octets: REG_ADD(unit, port, sync_mode, GR511r, count); break; case snmpBcmReceivedPkts512to1023Octets: REG_ADD(unit, port, sync_mode, GR1023r, count); break; case snmpBcmReceivedPkts1024to1518Octets: REG_ADD(unit, port, sync_mode, GR1518r, count); break; case snmpBcmReceivedPkts1519to2047Octets: REG_ADD(unit, port, sync_mode, GR2047r, count); break; case snmpBcmReceivedPkts2048to4095Octets: REG_ADD(unit, port, sync_mode, GR4095r, count); break; case snmpBcmReceivedPkts4095to9216Octets: REG_ADD(unit, port, sync_mode, GR9216r, count); break; #ifdef BCM_KATANA_SUPPORT case snmpBcmReceivedPkts9217to16383Octets: if(SOC_IS_KATANA(unit)) { REG_ADD(unit, port, sync_mode, GR16383r, count); } break; #endif case snmpBcmTransmittedPkts64Octets: REG_ADD(unit, port, sync_mode, GT64r, count); break; case snmpBcmTransmittedPkts65to127Octets: REG_ADD(unit, port, sync_mode, GT127r, count); break; case snmpBcmTransmittedPkts128to255Octets: REG_ADD(unit, port, sync_mode, GT255r, count); break; case snmpBcmTransmittedPkts256to511Octets: REG_ADD(unit, port, sync_mode, GT511r, count); break; case snmpBcmTransmittedPkts512to1023Octets: REG_ADD(unit, port, sync_mode, GT1023r, count); break; case snmpBcmTransmittedPkts1024to1518Octets: REG_ADD(unit, port, sync_mode, GT1518r, count); break; case snmpBcmTransmittedPkts1519to2047Octets: REG_ADD(unit, port, sync_mode, GT2047r, count); break; case snmpBcmTransmittedPkts2048to4095Octets: REG_ADD(unit, port, sync_mode, GT4095r, count); break; case snmpBcmTransmittedPkts4095to9216Octets: REG_ADD(unit, port, sync_mode, GT9216r, count); break; #ifdef BCM_KATANA_SUPPORT case snmpBcmTransmittedPkts9217to16383Octets: if(SOC_IS_KATANA(unit)) { REG_ADD(unit, port, sync_mode, GT16383r, count); } break; #endif case snmpEtherStatsTXNoErrors: /* FE = TPKT - (TNCL + TOVR + TFRG + TUND) */ /* GE = GTPKT - (GTOVR + GTIPD + GTABRT) */ #if defined(BCM_RAPTOR_SUPPORT) || defined(BCM_FIREBOLT2_SUPPORT) || \ defined(BCM_TRX_SUPPORT) if (soc_feature(unit, soc_feature_hw_stats_calc)) { REG_ADD(unit, port, sync_mode, GTPOKr, count); /* All good packets */ } else #endif /* BCM_RAPTOR_SUPPORT || BCM_FIREBOLT2_SUPPORT || BCM_TRX_SUPPORT */ { REG_ADD(unit, port, sync_mode, GTPKTr, count); /* All Packets */ if (COUNT_OVR_ERRORS(unit)) { REG_SUB(unit, port, sync_mode, GTOVRr, count); /* Oversize */ } } break; case snmpEtherStatsRXNoErrors: #if defined(BCM_RAPTOR_SUPPORT) || defined(BCM_FIREBOLT2_SUPPORT) || \ defined(BCM_TRX_SUPPORT) /* Some chips have a dedicated register for this stat */ if (soc_feature(unit, soc_feature_hw_stats_calc)) { REG_ADD(unit, port, sync_mode, GRPOKr, count); } else #endif /* BCM_RAPTOR_SUPPORT || BCM_FIREBOLT2_SUPPORT || BCM_TRX_SUPPORT */ { /* * GE = GRPKT - (GRFCS + GRXUO + GRFLR + GRCDE + GRFCR + * GRUND + GROVR + GRJBR + GRIPCHK/GRIPHE) */ REG_ADD(unit, port, sync_mode, GRPKTr, count); REG_SUB(unit, port, sync_mode, GRFCSr, count); REG_SUB(unit, port, sync_mode, GRXUOr, count); REG_SUB(unit, port, sync_mode, GRCDEr, count); REG_SUB(unit, port, sync_mode, GRFCRr, count); REG_SUB(unit, port, sync_mode, GRUNDr, count); if (SOC_REG_IS_VALID(unit, GRMTUEr)) { REG_SUB(unit, port, sync_mode, GRMTUEr, count); /* mtu exceeded pkts */ } else if (COUNT_OVR_ERRORS(unit)) { REG_SUB(unit, port, sync_mode, GROVRr, count); /* oversize pkts */ } REG_SUB(unit, port, sync_mode, GRJBRr, count); } break; /* *** RFC 2665 *** */ case snmpDot3StatsAlignmentErrors: REG_ADD(unit, port, sync_mode, GRALNr, count); break; case snmpDot3StatsFCSErrors: REG_ADD(unit, port, sync_mode, GRFCSr, count); break; case snmpDot3StatsSingleCollisionFrames: REG_ADD(unit, port, sync_mode, GTSCLr, count); break; case snmpDot3StatsMultipleCollisionFrames: REG_ADD(unit, port, sync_mode, GTMCLr, count); break; case snmpDot3StatsSQETTestErrors: /* always 0 */ break; case snmpDot3StatsDeferredTransmissions: REG_ADD(unit, port, sync_mode, GTDFRr, count); break; case snmpDot3StatsLateCollisions: REG_ADD(unit, port, sync_mode, GTLCLr, count); break; case snmpDot3StatsExcessiveCollisions: REG_ADD(unit, port, sync_mode, GTXCLr, count); break; case snmpDot3StatsInternalMacTransmitErrors: /* always 0 */ break; case snmpDot3StatsCarrierSenseErrors: REG_ADD(unit, port, sync_mode, GRFCRr, count); break; case snmpDot3StatsFrameTooLongs: if (soc_feature(unit, soc_feature_stat_jumbo_adj)) { if (SOC_REG_IS_VALID(unit, GRMTUEr)) { REG_ADD(unit, port, sync_mode, GRMTUEr, count); /* mtu exceeded pkts */ } else { REG_ADD(unit, port, sync_mode, GROVRr, count); /* oversized pkts */ } } else { REG_ADD(unit, port, sync_mode, GRJBRr, count); } break; case snmpDot3StatsInternalMacReceiveErrors: /* always 0 */ break; case snmpDot3StatsSymbolErrors: REG_ADD(unit, port, sync_mode, GRCDEr, count); break; case snmpDot3ControlInUnknownOpcodes: REG_ADD(unit, port, sync_mode, GRXUOr, count); break; case snmpDot3InPauseFrames: REG_ADD(unit, port, sync_mode, GRXPFr, count); break; case snmpDot3OutPauseFrames: if (incl_non_ge_stat) { REG_ADD(unit, port, sync_mode, GTXPFr, count); } /* Else avoid double-counting of pause frames on GXMACs */ break; /* *** RFC 2233 high capacity versions of RFC1213 objects *** */ case snmpIfHCInOctets: REG_ADD(unit, port, sync_mode, GRBYTr, count); /* bytes rcvd */ REG_ADD(unit, port, sync_mode, RRBYTr, count); /* Runt bytes */ break; case snmpIfHCInUcastPkts: if (soc_feature(unit, soc_feature_hw_stats_calc)) { if (SOC_REG_IS_VALID(unit, GRUCr) && !((SOC_IS_RAPTOR(unit) || SOC_IS_RAVEN(unit)) && SOC_IS_STACK_PORT(unit, port))) { REG_ADD(unit, port, sync_mode, GRUCr, count); } else { if (incl_non_ge_stat) { /* RUC switch register has the count of all received packets, * add the count when incl_non_ge_stat flag is set. */ REG_ADD(unit, port, sync_mode, RUCr, count); /* unicast pkts rcvd */ } } } else { REG_ADD(unit, port, sync_mode, GRPKTr, count); /* all pkts rcvd */ REG_SUB(unit, port, sync_mode, GRMCAr, count); /* - multicast */ REG_SUB(unit, port, sync_mode, GRBCAr, count); /* - broadcast */ REG_SUB(unit, port, sync_mode, GRALNr, count); /* - bad FCS, dribble bit */ REG_SUB(unit, port, sync_mode, GRFCSr, count); /* - bad FCS, no dribble bit */ REG_SUB(unit, port, sync_mode, GRJBRr, count); /* - oversize, bad FCS */ if (SOC_REG_IS_VALID(unit, GRMTUEr)) { REG_SUB(unit, port, sync_mode, GRMTUEr, count); /* mtu exceeded pkts */ } else if (COUNT_OVR_ERRORS(unit)) { REG_SUB(unit, port, sync_mode, GROVRr, count); /* oversize pkts */ } } break; case snmpIfHCInMulticastPkts: REG_ADD(unit, port, sync_mode, GRMCAr, count); /* multicast */ break; case snmpIfHCInBroadcastPkts: REG_ADD(unit, port, sync_mode, GRBCAr, count); /* broadcast */ break; case snmpIfHCOutOctets: REG_ADD(unit, port, sync_mode, GTBYTr, count); /* transmit bytes */ break; case snmpIfHCOutUcastPkts: #if defined(BCM_RAPTOR_SUPPORT) || defined(BCM_FIREBOLT2_SUPPORT) || \ defined(BCM_TRX_SUPPORT) if (soc_feature(unit, soc_feature_hw_stats_calc)) { REG_ADD(unit, port, sync_mode, GTUCr, count); /* All good packets */ } else #endif /* BCM_RAPTOR_SUPPORT || BCM_FIREBOLT2_SUPPORT || BCM_TRX_SUPPORT */ { REG_ADD(unit, port, sync_mode, GTPKTr, count); /* all pkts xmited */ REG_SUB(unit, port, sync_mode, GTMCAr, count); /* - multicast */ REG_SUB(unit, port, sync_mode, GTBCAr, count); /* - broadcast */ REG_SUB(unit, port, sync_mode, GTFCSr, count); /* - bad FCS */ REG_SUB(unit, port, sync_mode, GTJBRr, count); /* - oversize, bad FCS */ if (COUNT_OVR_ERRORS(unit)) { REG_SUB(unit, port, sync_mode, GTOVRr, count); /* - oversize, good FCS */ } } break; case snmpIfHCOutMulticastPkts: REG_ADD(unit, port, sync_mode, GTMCAr, count); /* multicast xmited */ break; case snmpIfHCOutBroadcastPckts: REG_ADD(unit, port, sync_mode, GTBCAr, count); /* broadcast xmited */ break; /* *** RFC 2465 *** */ case snmpIpv6IfStatsInReceives: if (soc_feature(unit, soc_feature_stat_xgs3)) { if (incl_non_ge_stat) { REG_ADD(unit, port, sync_mode, RIPC6r, count); REG_ADD(unit, port, sync_mode, IMRP6r, count); } } break; case snmpIpv6IfStatsInHdrErrors: if (soc_feature(unit, soc_feature_stat_xgs3)) { if (incl_non_ge_stat) { REG_ADD(unit, port, sync_mode, RIPD6r, count); } } break; case snmpIpv6IfStatsInAddrErrors: if (soc_feature(unit, soc_feature_stat_xgs3)) { if (incl_non_ge_stat) { REG_ADD(unit, port, sync_mode, RIPHE6r, count); } } break; case snmpIpv6IfStatsInDiscards: if (soc_feature(unit, soc_feature_stat_xgs3)) { if (incl_non_ge_stat) { REG_ADD(unit, port, sync_mode, RIPHE6r, count); REG_ADD(unit, port, sync_mode, RIPD6r, count); } } break; case snmpIpv6IfStatsOutForwDatagrams: if (soc_feature(unit, soc_feature_stat_xgs3)) { if (incl_non_ge_stat) { REG_ADD(unit, port, sync_mode, TDBGC0r, count); } } break; case snmpIpv6IfStatsOutDiscards: if (soc_feature(unit, soc_feature_stat_xgs3)) { if (incl_non_ge_stat) { REG_ADD(unit, port, sync_mode, TDBGC1r, count); } } break; case snmpIpv6IfStatsInMcastPkts: if (soc_feature(unit, soc_feature_stat_xgs3)) { if (incl_non_ge_stat) { REG_ADD(unit, port, sync_mode, IMRP6r, count); } } break; case snmpIpv6IfStatsOutMcastPkts: if (soc_feature(unit, soc_feature_stat_xgs3)) { if (incl_non_ge_stat) { REG_ADD(unit, port, sync_mode, TDBGC2r, count); } } break; /* *** IEEE 802.1bb *** */ case snmpIeee8021PfcRequests: REG_ADD(unit, port, sync_mode, GTXPPr, count); break; case snmpIeee8021PfcIndications: REG_ADD(unit, port, sync_mode, GRXPPr, count); break; /* *** RFC 1284 - unsupported in XGS *** */ case snmpDot3StatsInRangeLengthError: break; /* *** RFC 4837 - unsupported in XGS *** */ case snmpDot3OmpEmulationCRC8Errors: case snmpDot3MpcpRxGate: case snmpDot3MpcpRxRegister: case snmpDot3MpcpTxRegRequest: case snmpDot3MpcpTxRegAck: case snmpDot3MpcpTxReport: case snmpDot3EponFecCorrectedBlocks: case snmpDot3EponFecUncorrectableBlocks: break; /* IPMC counters (broadcom specific) */ case snmpBcmIPMCBridgedPckts: if (soc_feature(unit, soc_feature_ip_mcast)) { if (soc_feature(unit, soc_feature_stat_xgs3)) { if (incl_non_ge_stat) { REG_ADD(unit, port, sync_mode, RDBGC1r, count); } } } break; case snmpBcmIPMCRoutedPckts: if (soc_feature(unit, soc_feature_ip_mcast)) { if (soc_feature(unit, soc_feature_stat_xgs3)) { if (incl_non_ge_stat) { REG_ADD(unit, port, sync_mode, IMRP4r, count); REG_ADD(unit, port, sync_mode, IMRP6r, count); } } } break; case snmpBcmIPMCInDroppedPckts: if (soc_feature(unit, soc_feature_ip_mcast)) { if (soc_feature(unit, soc_feature_stat_xgs3)) { if (incl_non_ge_stat) { REG_ADD(unit, port, sync_mode, RDBGC2r, count); } } } break; case snmpBcmIPMCOutDroppedPckts: if (soc_feature(unit, soc_feature_ip_mcast)) { if (soc_feature(unit, soc_feature_stat_xgs3)) { if (incl_non_ge_stat) { REG_ADD(unit, port, sync_mode, TDBGC5r, count); } } } break; /* EA (broadcom specific) - unsupported in XGS */ case snmpBcmPonInDroppedOctets: case snmpBcmPonOutDroppedOctets: case snmpBcmPonInDelayedOctets: case snmpBcmPonOutDelayedOctets: case snmpBcmPonInDelayedHundredUs: case snmpBcmPonOutDelayedHundredUs: case snmpBcmPonInFrameErrors: case snmpBcmPonInOamFrames: case snmpBcmPonOutOamFrames: case snmpBcmPonOutUnusedOctets: break; case snmpFcmPortClass3RxFrames: if (soc_feature(unit, soc_feature_fcoe)) { REG_ADD(unit, port, sync_mode, RDBGC3r, count); } else { return BCM_E_UNAVAIL; } break; case snmpFcmPortClass3TxFrames: if (soc_feature(unit, soc_feature_fcoe)) { REG_ADD(unit, port, sync_mode, TDBGC6r, count); } else { return BCM_E_UNAVAIL; } break; case snmpFcmPortClass3Discards: if (soc_feature(unit, soc_feature_fcoe)) { REG_ADD(unit, port, sync_mode, RDBGC4r, count); } else { return BCM_E_UNAVAIL; } break; case snmpFcmPortClass2RxFrames: if (soc_feature(unit, soc_feature_fcoe)) { REG_ADD(unit, port, sync_mode, RDBGC5r, count); } else { return BCM_E_UNAVAIL; } break; case snmpFcmPortClass2TxFrames: if (soc_feature(unit, soc_feature_fcoe)) { REG_ADD(unit, port, sync_mode, TDBGC7r, count); } else { return BCM_E_UNAVAIL; } break; case snmpFcmPortClass2Discards: if (soc_feature(unit, soc_feature_fcoe)) { REG_ADD(unit, port, sync_mode, RDBGC6r, count); } else { return BCM_E_UNAVAIL; } break; case snmpFcmPortInvalidCRCs: if (soc_feature(unit, soc_feature_fcoe)) { REG_ADD(unit, port, sync_mode, EGR_FCOE_INVALID_CRC_FRAMESr, count); } else { return BCM_E_UNAVAIL; } break; case snmpFcmPortDelimiterErrors: if (soc_feature(unit, soc_feature_fcoe)) { REG_ADD(unit, port, sync_mode, EGR_FCOE_DELIMITER_ERROR_FRAMESr, count); } else { return BCM_E_UNAVAIL; } break; default: if (type < snmpValCount) { return BCM_E_UNAVAIL; } soc_cm_debug(DK_WARN+DK_VERBOSE, "bcm_stat_get: Statistic not supported: %d\n", type); return BCM_E_PARAM; } *val = count; return BCM_E_NONE; }
/* * Function: * _bcm_stat_fe_get * Description: * Get the specified statistic for a FE port or GE port in 10/100 Mb * mode on the StrataSwitch family of devices. * Parameters: * unit - StrataSwitch PCI device unit number (driver internal). * port - zero-based port number * sync_mode - if 1 read hw counter else sw accumualated counter * type - SNMP statistics type (see stat.h) * val - (OUT) 64 bit statistic counter value * Returns: * BCM_E_NONE - Success. * BCM_E_PARAM - Illegal parameter. * BCM_E_INTERNAL - Chip access failure. */ int _bcm_stat_fe_get(int unit, bcm_port_t port, int sync_mode, bcm_stat_val_t type, uint64 *val) { uint64 count, count1; REG_MATH_DECL; /* Required for use of the REG_* macros */ COMPILER_REFERENCE(&count); /* Work around PPC compiler bug */ COMPILER_64_ZERO(count); switch (type) { /* *** RFC 1213 *** */ case snmpIfInOctets: REG_ADD(unit, port, sync_mode, FE_CNTR(RBYTr), count); break; case snmpIfInUcastPkts: REG_ADD(unit, port, sync_mode, FE_CNTR(RPKTr), count); /* all pkts rcvd */ REG_SUB(unit, port, sync_mode, FE_CNTR(RMCAr), count); /* - multicast */ REG_SUB(unit, port, sync_mode, FE_CNTR(RBCAr), count); /* - broadcast */ REG_SUB(unit, port, sync_mode, FE_CNTR(RALNr), count); /* - bad FCS, dribble bit */ REG_SUB(unit, port, sync_mode, FE_CNTR(RFCSr), count); /* - bad FCS, no dribble bit */ REG_SUB(unit, port, sync_mode, FE_CNTR(RFLRr), count); /* - good FCS, bad length */ REG_SUB(unit, port, sync_mode, FE_CNTR(RJBRr), count); /* - oversize, bad FCS */ if (COUNT_OVR_ERRORS(unit)) { REG_SUB(unit, port, sync_mode, FE_CNTR(ROVRr), count); /* - oversize, good FCS */ } break; case snmpIfInNUcastPkts: /* Multicast frames plus broadcast frames */ REG_ADD(unit, port, sync_mode, FE_CNTR(RMCAr), count); REG_ADD(unit, port, sync_mode, FE_CNTR(RBCAr), count); break; case snmpIfInBroadcastPkts: /* broadcast frames */ REG_ADD(unit, port, sync_mode, FE_CNTR(RBCAr), count); break; case snmpIfInMulticastPkts: /* Multicast frames */ REG_ADD(unit, port, sync_mode, FE_CNTR(RMCAr), count); break; case snmpIfInDiscards: /* Dropped packets including aborted */ REG_ADD(unit, port, sync_mode, FE_CNTR(RDISCr), count); break; case snmpIfInErrors: /* received packts containing errors */ REG_ADD(unit, port, sync_mode, FE_CNTR(RUNDr), count); /* undersize, ok FCS */ REG_ADD(unit, port, sync_mode, FE_CNTR(RFRGr), count); /* ..., bad FCS */ REG_ADD(unit, port, sync_mode, FE_CNTR(RFCSr), count); /* FCS errors */ if (COUNT_OVR_ERRORS(unit)) { REG_ADD(unit, port, sync_mode, FE_CNTR(ROVRr), count); /* oversize, ok FCS */ } REG_ADD(unit, port, sync_mode, FE_CNTR(RJBRr), count); /* ..., bad FCS */ break; case snmpIfInUnknownProtos: /* always 0 */ break; case snmpIfOutOctets: /* TX bytes */ REG_ADD(unit, port, sync_mode, FE_CNTR(TBYTr), count); break; case snmpIfOutUcastPkts: /* ALL - mcast - bcast */ REG_ADD(unit, port, sync_mode, FE_CNTR(TPKTr), count); REG_SUB(unit, port, sync_mode, FE_CNTR(TMCAr), count); REG_SUB(unit, port, sync_mode, FE_CNTR(TBCAr), count); REG_SUB(unit, port, sync_mode, FE_CNTR(TFCSr), count); /* bad FCS */ REG_SUB(unit, port, sync_mode, FE_CNTR(TJBRr), count); /* oversize, bad FCS */ if (COUNT_OVR_ERRORS(unit)) { REG_SUB(unit, port, sync_mode, FE_CNTR(TOVRr), count); /* oversize, good FCS */ } break; case snmpIfOutNUcastPkts: /* broadcast frames plus multicast frames */ REG_ADD(unit, port, sync_mode, FE_CNTR(TMCAr), count); REG_ADD(unit, port, sync_mode, FE_CNTR(TBCAr), count); break; case snmpIfOutBroadcastPkts: /* broadcast frames */ REG_ADD(unit, port, sync_mode, FE_CNTR(TBCAr), count); break; case snmpIfOutMulticastPkts: /* multicast frames */ REG_ADD(unit, port, sync_mode, FE_CNTR(TMCAr), count); break; case snmpIfOutDiscards: REG_ADD(unit, port, sync_mode, FE_CNTR(TEDFr), count); /* multiple deferral */ _bcm_stat_counter_extra_get(unit, EGRDROPPKTCOUNTr, port, &count1); COMPILER_64_ADD_64(count, count1); /* other causes of discards? */ break; case snmpIfOutErrors: REG_ADD(unit, port, sync_mode, FE_CNTR(TXCLr), count); /* excessive coll */ break; case snmpIfOutQLen: { uint32 qcount; if (bcm_esw_port_queued_count_get(unit, port, &qcount) >= 0) { COMPILER_64_ADD_32(count, qcount); } } break; case snmpIpInReceives: /* XGS2 specific */ break; case snmpIpInHdrErrors: break; case snmpIpForwDatagrams: /* XGS2 specific */ break; case snmpIpInDiscards: /* XGS2 specific */ break; /* *** RFC 1493 *** */ case snmpDot1dBasePortDelayExceededDiscards: REG_ADD(unit, port, sync_mode, FE_CNTR(TEDFr), count); /* multiple deferral */ break; case snmpDot1dBasePortMtuExceededDiscards: if (COUNT_OVR_ERRORS(unit)) { REG_ADD(unit, port, sync_mode, FE_CNTR(ROVRr), count); REG_ADD(unit, port, sync_mode, FE_CNTR(TOVRr), count); } break; case snmpDot1dTpPortInFrames: REG_ADD(unit, port, sync_mode, FE_CNTR(RPKTr), count); break; case snmpDot1dTpPortOutFrames: REG_ADD(unit, port, sync_mode, FE_CNTR(TPKTr), count); break; case snmpDot1dPortInDiscards: REG_ADD(unit, port, sync_mode, FE_CNTR(RDISCr), count); break; /* *** RFC 1757 *** */ case snmpEtherStatsDropEvents: REG_ADD(unit, port, sync_mode, FE_CNTR(RDISCr), count); break; case snmpEtherStatsOctets: REG_ADD(unit, port, sync_mode, FE_CNTR(RBYTr), count); REG_ADD(unit, port, sync_mode, FE_CNTR(TBYTr), count); break; case snmpEtherStatsPkts: REG_ADD(unit, port, sync_mode, FE_CNTR(RPKTr), count); REG_ADD(unit, port, sync_mode, FE_CNTR(TPKTr), count); REG_ADD(unit, port, sync_mode, FE_CNTR(RUNDr), count); /* Runt packets */ break; case snmpEtherStatsBroadcastPkts: REG_ADD(unit, port, sync_mode, FE_CNTR(RBCAr), count); REG_ADD(unit, port, sync_mode, FE_CNTR(TBCAr), count); break; case snmpEtherStatsMulticastPkts: REG_ADD(unit, port, sync_mode, FE_CNTR(RMCAr), count); REG_ADD(unit, port, sync_mode, FE_CNTR(TMCAr), count); break; case snmpEtherStatsCRCAlignErrors: /* CRC errors + alignment errors */ REG_ADD(unit, port, sync_mode, FE_CNTR(RFCSr), count); break; case snmpEtherStatsUndersizePkts: /* Undersize frames */ REG_ADD(unit, port, sync_mode, FE_CNTR(RUNDr), count); break; case snmpEtherStatsOversizePkts: if (soc_feature(unit, soc_feature_stat_jumbo_adj)) { REG_ADD(unit, port, sync_mode, FE_CNTR(ROVRr), count); REG_ADD(unit, port, sync_mode, FE_CNTR(TOVRr), count); } else { REG_ADD(unit, port, sync_mode, FE_CNTR(RJBRr), count); } break; case snmpEtherRxOversizePkts: if (soc_feature(unit, soc_feature_stat_jumbo_adj)) { REG_ADD(unit, port, sync_mode, FE_CNTR(ROVRr), count); } break; case snmpEtherTxOversizePkts: if (soc_feature(unit, soc_feature_stat_jumbo_adj)) { REG_ADD(unit, port, sync_mode, FE_CNTR(TOVRr), count); } break; case snmpEtherStatsFragments: REG_ADD(unit, port, sync_mode, FE_CNTR(RFRGr), count); if (SOC_REG_IS_VALID(unit,TFRGr)) { REG_ADD(unit, port, sync_mode, FE_CNTR(TFRGr), count); } break; case snmpEtherStatsJabbers: REG_ADD(unit, port, sync_mode, FE_CNTR(RJBRr), count); break; case snmpEtherStatsCollisions: REG_ADD(unit, port, sync_mode, FE_CNTR(TNCLr), count); break; case snmpEtherStatsPkts64Octets: case snmpEtherStatsPkts65to127Octets: case snmpEtherStatsPkts128to255Octets: case snmpEtherStatsPkts256to511Octets: case snmpEtherStatsPkts512to1023Octets: /* XGS2 specific */ break; case snmpEtherStatsPkts1024to1518Octets: break; /* *** not actually in rfc1757 *** */ case snmpBcmEtherStatsPkts1519to1522Octets: case snmpBcmEtherStatsPkts1522to2047Octets: case snmpBcmEtherStatsPkts2048to4095Octets: case snmpBcmEtherStatsPkts4095to9216Octets: case snmpBcmEtherStatsPkts9217to16383Octets: case snmpBcmReceivedPkts64Octets: case snmpBcmReceivedPkts65to127Octets: case snmpBcmReceivedPkts128to255Octets: case snmpBcmReceivedPkts256to511Octets: case snmpBcmReceivedPkts512to1023Octets: case snmpBcmReceivedPkts1024to1518Octets: case snmpBcmReceivedPkts1519to2047Octets: case snmpBcmReceivedPkts2048to4095Octets: case snmpBcmReceivedPkts4095to9216Octets: case snmpBcmReceivedPkts9217to16383Octets: case snmpBcmTransmittedPkts64Octets: case snmpBcmTransmittedPkts65to127Octets: case snmpBcmTransmittedPkts128to255Octets: case snmpBcmTransmittedPkts256to511Octets: case snmpBcmTransmittedPkts512to1023Octets: case snmpBcmTransmittedPkts1024to1518Octets: case snmpBcmTransmittedPkts1519to2047Octets: case snmpBcmTransmittedPkts2048to4095Octets: case snmpBcmTransmittedPkts4095to9216Octets: case snmpBcmTransmittedPkts9217to16383Octets: break; case snmpEtherStatsTXNoErrors: /* TPKT - (TNCL + TOVR + TFRG + TUND) */ REG_ADD(unit, port, sync_mode, FE_CNTR(TPKTr), count); /* All Packets */ REG_SUB(unit, port, sync_mode, FE_CNTR(TNCLr), count); /* collision */ if (COUNT_OVR_ERRORS(unit)) { REG_SUB(unit, port, sync_mode, FE_CNTR(TOVRr), count); /* Oversize */ } REG_SUB(unit, port, sync_mode, FE_CNTR(TFRGr), count); /* Fragments */ break; case snmpEtherStatsRXNoErrors: /* RPKT - ( RFCS + RXUO + ROVR + RFLR) */ REG_ADD(unit, port, sync_mode, FE_CNTR(RPKTr), count); REG_SUB(unit, port, sync_mode, FE_CNTR(RFCSr), count); REG_SUB(unit, port, sync_mode, FE_CNTR(RXUOr), count); if (COUNT_OVR_ERRORS(unit)) { REG_SUB(unit, port, sync_mode, FE_CNTR(ROVRr), count); } REG_SUB(unit, port, sync_mode, FE_CNTR(RFLRr), count); break; /* *** RFC 2665 *** */ case snmpDot3StatsAlignmentErrors: REG_ADD(unit, port, sync_mode, FE_CNTR(RALNr), count); break; case snmpDot3StatsFCSErrors: REG_ADD(unit, port, sync_mode, FE_CNTR(RFCSr), count); break; case snmpDot3StatsSingleCollisionFrames: REG_ADD(unit, port, sync_mode, FE_CNTR(TSCLr), count); break; case snmpDot3StatsMultipleCollisionFrames: REG_ADD(unit, port, sync_mode, FE_CNTR(TMCLr), count); break; case snmpDot3StatsSQETTestErrors: /* always 0 */ break; case snmpDot3StatsDeferredTransmissions: REG_ADD(unit, port, sync_mode, FE_CNTR(TDFRr), count); break; case snmpDot3StatsLateCollisions: REG_ADD(unit, port, sync_mode, FE_CNTR(TLCLr), count); break; case snmpDot3StatsExcessiveCollisions: REG_ADD(unit, port, sync_mode, FE_CNTR(TXCLr), count); break; case snmpDot3StatsInternalMacTransmitErrors: /* always 0 */ break; case snmpDot3StatsCarrierSenseErrors: REG_ADD(unit, port, sync_mode, FE_CNTR(RFCRr), count); break; case snmpDot3StatsFrameTooLongs: if (soc_feature(unit, soc_feature_stat_jumbo_adj)) { REG_ADD(unit, port, sync_mode, FE_CNTR(ROVRr), count); } else { REG_ADD(unit, port, sync_mode, FE_CNTR(RJBRr), count); } break; case snmpDot3StatsInternalMacReceiveErrors: /* always 0 */ break; case snmpDot3StatsSymbolErrors: /* XGS2 specific */ break; case snmpDot3ControlInUnknownOpcodes: REG_ADD(unit, port, sync_mode, FE_CNTR(RXUOr), count); break; case snmpDot3InPauseFrames: REG_ADD(unit, port, sync_mode, FE_CNTR(RXPFr), count); break; case snmpDot3OutPauseFrames: REG_ADD(unit, port, sync_mode, FE_CNTR(TXPFr), count); break; /* *** RFC 2233 high capacity versions of RFC1213 objects *** */ case snmpIfHCInOctets: REG_ADD(unit, port, sync_mode, FE_CNTR(RBYTr), count); break; case snmpIfHCInUcastPkts: REG_ADD(unit, port, sync_mode, FE_CNTR(RPKTr), count); /* all pkts rcvd */ REG_SUB(unit, port, sync_mode, FE_CNTR(RMCAr), count); /* - multicast */ REG_SUB(unit, port, sync_mode, FE_CNTR(RBCAr), count); /* - broadcast */ REG_SUB(unit, port, sync_mode, FE_CNTR(RALNr), count); /* - bad FCS, dribble bit */ REG_SUB(unit, port, sync_mode, FE_CNTR(RFCSr), count); /* - bad FCS, no dribble bit */ REG_SUB(unit, port, sync_mode, FE_CNTR(RFLRr), count); /* - good FCS, bad length */ REG_SUB(unit, port, sync_mode, FE_CNTR(RJBRr), count); /* - oversize, bad FCS */ if (COUNT_OVR_ERRORS(unit)) { REG_SUB(unit, port, sync_mode, FE_CNTR(ROVRr), count); /* - oversize, good FCS */ } break; case snmpIfHCInMulticastPkts: REG_ADD(unit, port, sync_mode, FE_CNTR(RMCAr), count); break; case snmpIfHCInBroadcastPkts: REG_ADD(unit, port, sync_mode, FE_CNTR(RBCAr), count); break; case snmpIfHCOutOctets: REG_ADD(unit, port, sync_mode, FE_CNTR(TBYTr), count); break; case snmpIfHCOutUcastPkts: REG_ADD(unit, port, sync_mode, FE_CNTR(TPKTr), count); REG_SUB(unit, port, sync_mode, FE_CNTR(TMCAr), count); REG_SUB(unit, port, sync_mode, FE_CNTR(TBCAr), count); REG_SUB(unit, port, sync_mode, FE_CNTR(TFCSr), count); /* bad FCS */ REG_SUB(unit, port, sync_mode, FE_CNTR(TJBRr), count); /* oversize, bad FCS */ if (COUNT_OVR_ERRORS(unit)) { REG_SUB(unit, port, sync_mode, FE_CNTR(TOVRr), count); /* oversize, good FCS */ } break; case snmpIfHCOutMulticastPkts: REG_ADD(unit, port, sync_mode, FE_CNTR(TMCAr), count); break; case snmpIfHCOutBroadcastPckts: REG_ADD(unit, port, sync_mode, FE_CNTR(TBCAr), count); break; /* *** RFC 2465 *** */ case snmpIpv6IfStatsInReceives: case snmpIpv6IfStatsInHdrErrors: case snmpIpv6IfStatsInAddrErrors: case snmpIpv6IfStatsInDiscards: case snmpIpv6IfStatsOutForwDatagrams: case snmpIpv6IfStatsOutDiscards: case snmpIpv6IfStatsInMcastPkts: case snmpIpv6IfStatsOutMcastPkts: break; /* *** RFC 1284 - unsupported in XGS *** */ case snmpDot3StatsInRangeLengthError: break; /* *** RFC 4837 - unsupported in XGS *** */ case snmpDot3OmpEmulationCRC8Errors: case snmpDot3MpcpRxGate: case snmpDot3MpcpRxRegister: case snmpDot3MpcpTxRegRequest: case snmpDot3MpcpTxRegAck: case snmpDot3MpcpTxReport: case snmpDot3EponFecCorrectedBlocks: case snmpDot3EponFecUncorrectableBlocks: break; /* IPMC counters (broadcom XGS2 specific) */ case snmpBcmIPMCBridgedPckts: case snmpBcmIPMCRoutedPckts: case snmpBcmIPMCInDroppedPckts: case snmpBcmIPMCOutDroppedPckts: break; /* EA (broadcom specific) - unsupported in XGS */ case snmpBcmPonInDroppedOctets: case snmpBcmPonOutDroppedOctets: case snmpBcmPonInDelayedOctets: case snmpBcmPonOutDelayedOctets: case snmpBcmPonInDelayedHundredUs: case snmpBcmPonOutDelayedHundredUs: case snmpBcmPonInFrameErrors: case snmpBcmPonInOamFrames: case snmpBcmPonOutOamFrames: case snmpBcmPonOutUnusedOctets: break; case snmpFcmPortClass3RxFrames: if (soc_feature(unit, soc_feature_fcoe)) { REG_ADD(unit, port, sync_mode, RDBGC3r, count); } else { return BCM_E_UNAVAIL; } break; case snmpFcmPortClass3TxFrames: if (soc_feature(unit, soc_feature_fcoe)) { REG_ADD(unit, port, sync_mode, TDBGC6r, count); } else { return BCM_E_UNAVAIL; } break; case snmpFcmPortClass3Discards: if (soc_feature(unit, soc_feature_fcoe)) { REG_ADD(unit, port, sync_mode, RDBGC4r, count); } else { return BCM_E_UNAVAIL; } break; case snmpFcmPortClass2RxFrames: if (soc_feature(unit, soc_feature_fcoe)) { REG_ADD(unit, port, sync_mode, RDBGC5r, count); } else { return BCM_E_UNAVAIL; } break; case snmpFcmPortClass2TxFrames: if (soc_feature(unit, soc_feature_fcoe)) { REG_ADD(unit, port, sync_mode, TDBGC7r, count); } else { return BCM_E_UNAVAIL; } break; case snmpFcmPortClass2Discards: if (soc_feature(unit, soc_feature_fcoe)) { REG_ADD(unit, port, sync_mode, RDBGC6r, count); } else { return BCM_E_UNAVAIL; } break; case snmpFcmPortInvalidCRCs: if (soc_feature(unit, soc_feature_fcoe)) { REG_ADD(unit, port, sync_mode, EGR_FCOE_INVALID_CRC_FRAMESr, count); } else { return BCM_E_UNAVAIL; } break; case snmpFcmPortDelimiterErrors: if (soc_feature(unit, soc_feature_fcoe)) { REG_ADD(unit, port, sync_mode, EGR_FCOE_DELIMITER_ERROR_FRAMESr, count); } else { return BCM_E_UNAVAIL; } break; default: if (type < snmpValCount) { return BCM_E_UNAVAIL; } LOG_VERBOSE(BSL_LS_SOC_COMMON, (BSL_META_U(unit, "bcm_stat_get: Statistic not supported: %d\n"), type)); return BCM_E_PARAM; } *val = count; return BCM_E_NONE; }