Exemplo n.º 1
0
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);
}
Exemplo n.º 2
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;
}
Exemplo n.º 3
0
/*
 * 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;
}