openbcm

Git mirror of https://github.com/Broadcom-Network-Switching-Software/OpenBCM
git clone git://git.finwo.net/mirror/broadcom/openbcm
Log | Files | Refs | README

stat_generic.c (44487B)


      1 /*
      2  * 
      3  * This license is set out in https://raw.githubusercontent.com/Broadcom-Network-Switching-Software/OpenBCM/master/Legal/LICENSE file.
      4  * 
      5  * Copyright 2007-2019 Broadcom Inc. All rights reserved.
      6  */
      7 
      8 #include <soc/drv.h>
      9 #include <soc/counter.h>
     10 #include <soc/debug.h>
     11 #include <shared/bsl.h>
     12 #include <bcm/stat.h>
     13 #include <bcm/error.h>
     14 #include <bcm_int/esw/stat.h>
     15 #include <bcm_int/esw_dispatch.h>
     16 
     17 /*
     18  * Function:
     19  *      _bcm_stat_generic_get
     20  * Description:
     21  *      Get the specified statistic for a port with common counter shared
     22  *      by both XE and GE MAC.
     23  * Parameters:
     24  *      unit - PCI device unit number (driver internal)
     25  *      port - zero-based port number
     26  *      sync_mode - if 1 read hw counter else sw accumualated counter
     27  *      type - SNMP statistics type (see stat.h)
     28  *      val  - (OUT) 64 bit statistic counter value
     29  * Returns:
     30  *      BCM_E_NONE - Success.
     31  *      BCM_E_PARAM - Illegal parameter.
     32  *      BCM_E_INTERNAL - Chip access failure.
     33  */
     34 int
     35 _bcm_stat_generic_get_set(int unit, bcm_port_t port, 
     36                           int sync_mode, int stat_op,
     37                           bcm_stat_val_t type, uint64 *val)
     38 {
     39     uint64 count, count1;
     40     int reg_valid;
     41     int reg_op = (stat_op == _BCM_STAT_GET)? _BCM_STAT_REG_ADD: 
     42                                              _BCM_STAT_REG_CLEAR;
     43     int reg_sub_op = (stat_op == _BCM_STAT_GET)? _BCM_STAT_REG_SUB: 
     44                                              _BCM_STAT_REG_CLEAR;
     45 
     46 #ifdef BCM_TOMAHAWK_SUPPORT
     47     soc_ctr_control_info_t ctrl_info;
     48     ctrl_info.instance = -1;
     49 #endif /* BCM_TOMAHAWK_SUPPORT */
     50 
     51     COMPILER_REFERENCE(&count);  /* Work around PPC compiler bug */
     52     COMPILER_64_ZERO(count);
     53 
     54     switch (type) {
     55         /* *** RFC 1213 *** */
     56     case snmpIfInOctets:
     57         BCM_STAT_GENERIC_REG_OPER(unit, port, sync_mode, reg_op, RBYT, &count);
     58         BCM_STAT_GENERIC_REG_OPER(unit, port, sync_mode, reg_op, RRBYT, &count);
     59         break;
     60     case snmpIfInUcastPkts:             /* Unicast frames */
     61         if (soc_feature(unit, soc_feature_hw_stats_calc)) {
     62             if (COUNT_OVR_ERRORS(unit)) {
     63                 BCM_STAT_GENERIC_REG_OPER(unit, port, sync_mode, reg_op,
     64                                   RUCA, &count); /*unicast pkts rcvd */
     65             } else {
     66                 if (SOC_REG_IS_VALID(unit, RUC_64r)) {
     67                     BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, 
     68                                       RUC_64r, &count); /* unicast pkts rcvd */
     69                 } else {
     70                     BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, 
     71                                       RUCr, &count); /* unicast pkts rcvd */
     72                 }
     73             }
     74         } else {
     75             BCM_STAT_GENERIC_REG_OPER(unit, port, sync_mode, reg_op, RPKT, &count);
     76 
     77             BCM_STAT_GENERIC_REG_OPER(unit, port, sync_mode, reg_sub_op,
     78                               RMCA, &count); /* - multicast */
     79             BCM_STAT_GENERIC_REG_OPER(unit, port, sync_mode, reg_sub_op,
     80                               RBCA, &count); /* - broadcast */
     81             BCM_STAT_GENERIC_REG_OPER(unit, port, sync_mode, reg_sub_op,
     82                               RFCS, &count); /* - bad FCS */
     83             BCM_STAT_GENERIC_REG_OPER(unit, port, sync_mode, reg_sub_op,
     84                               RFLR, &count); /* - good FCS, bad length */
     85             BCM_STAT_GENERIC_REG_OPER(unit, port, sync_mode, reg_sub_op,
     86                               RXCF, &count); /* - good FCS, all MAC ctrl */
     87             BCM_STAT_GENERIC_REG_OPER(unit, port, sync_mode, reg_sub_op,
     88                               RJBR, &count); /* - oversize, bad FCS */
     89             if (COUNT_OVR_ERRORS(unit)) {
     90                 BCM_STAT_GENERIC_REG_OPER(unit, port, sync_mode, reg_sub_op,
     91                                   ROVR, &count); /* - oversize, good FCS */
     92             }
     93             BCM_STAT_GENERIC_REG_OPER(unit, port, sync_mode, reg_sub_op,
     94                               RMTUE, &count); /* - MTU errors */
     95         }
     96         break;
     97     case snmpIfInNUcastPkts:             /* Non-unicast frames */
     98         if (COUNT_OVR_ERRORS(unit)) {
     99             BCM_STAT_GENERIC_REG_OPER(unit, port, sync_mode, reg_op,
    100                               RMCA, &count); /* + multicast */
    101             BCM_STAT_GENERIC_REG_OPER(unit, port, sync_mode, reg_op,
    102                               RBCA, &count); /* + broadcast */
    103         } else {
    104             BCM_STAT_GENERIC_REG_OPER(unit, port, sync_mode, reg_op,
    105                               RUCA, &count); /* + unicast excl */
    106                                               /*   oversize */
    107             BCM_STAT_GENERIC_REG_OPER(unit, port, sync_mode, reg_op,
    108                               RMCA, &count); /* + multicast */
    109             BCM_STAT_GENERIC_REG_OPER(unit, port, sync_mode, reg_op,
    110                               RBCA, &count); /* + broadcast */
    111             BCM_STAT_GENERIC_REG_OPER(unit, port, sync_mode, reg_op,
    112                               ROVR, &count); /* + oversize */
    113             if (SOC_REG_IS_VALID(unit, RUC_64r)) {
    114                 BCM_STAT_REG_OPER(unit, port, sync_mode, reg_sub_op, 
    115                                   RUC_64r, &count); /* - unicast */
    116             } else {
    117                 BCM_STAT_REG_OPER(unit, port, sync_mode, reg_sub_op, 
    118                                   RUCr, &count); /* - unicast */
    119             }
    120         }
    121         break;
    122     case snmpIfInBroadcastPkts:          /* Broadcast frames */
    123         BCM_STAT_GENERIC_REG_OPER(unit, port, sync_mode, reg_op, RBCA, &count);
    124         break;
    125     case snmpIfInMulticastPkts:          /* Multicast frames */
    126         BCM_STAT_GENERIC_REG_OPER(unit, port, sync_mode, reg_op, RMCA, &count);
    127         break;
    128     case snmpIfInDiscards:           /* Dropped packets including aborted */
    129         if (SOC_REG_IS_VALID(unit, RDBGC0_64r)) {
    130             BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, RDBGC0_64r, &count);
    131         } else {
    132             BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, 
    133                               RDBGC0r, &count); /* Ingress drop conditions */
    134         }
    135         BCM_IF_ERROR_RETURN
    136             (_bcm_stat_counter_non_dma_extra_get(unit,
    137                                    SOC_COUNTER_NON_DMA_PORT_DROP_PKT_ING,
    138                                                  port, &count1));
    139         COMPILER_64_ADD_64(count, count1);
    140         break;
    141     case snmpIfInErrors: /* RX Errors or Receive packets - non-error frames */
    142         BCM_STAT_GENERIC_REG_OPER(unit, port, sync_mode, reg_op, RFCS, &count);
    143         BCM_STAT_GENERIC_REG_OPER(unit, port, sync_mode, reg_op, RJBR, &count);
    144         BCM_STAT_GENERIC_REG_OPER(unit, port, sync_mode, reg_op, RRPKT, &count);
    145 
    146         BCM_STAT_GENERIC_REG_VALIDATE(unit, port, RMTUE, reg_valid);
    147         if (reg_valid) {
    148             BCM_STAT_GENERIC_REG_OPER(unit, port, sync_mode, reg_op, RMTUE, &count);
    149         } else if (COUNT_OVR_ERRORS(unit)) {
    150             BCM_STAT_GENERIC_REG_OPER(unit, port, sync_mode, reg_op, ROVR, &count);
    151         }
    152         break;
    153     case snmpIfInUnknownProtos:
    154         break;
    155     case snmpIfOutOctets:
    156         BCM_STAT_GENERIC_REG_OPER(unit, port, sync_mode, reg_op, TBYT, &count);
    157         break;
    158     case snmpIfOutUcastPkts:             /* Unicast frames */
    159         BCM_STAT_GENERIC_REG_OPER(unit, port, sync_mode, reg_op, TUCA, &count);
    160         if (!COUNT_OVR_ERRORS(unit)) {
    161             BCM_STAT_GENERIC_REG_OPER(unit, port, sync_mode, reg_op,
    162                               TOVR, &count); /* + oversized pkts */
    163         }
    164         break;
    165     case snmpIfOutNUcastPkts:            /* Non-unicast frames */
    166         BCM_STAT_GENERIC_REG_OPER(unit, port, sync_mode, reg_op,
    167                           TMCA, &count); /* + multicast */
    168         BCM_STAT_GENERIC_REG_OPER(unit, port, sync_mode, reg_op,
    169                           TBCA, &count); /* + broadcast */
    170         break;
    171     case snmpIfOutBroadcastPkts:         /* Broadcast frames */
    172         BCM_STAT_GENERIC_REG_OPER(unit, port, sync_mode, reg_op, TBCA, &count);
    173         break;
    174     case snmpIfOutMulticastPkts:         /* Multicast frames */
    175         BCM_STAT_GENERIC_REG_OPER(unit, port, sync_mode, reg_op, TMCA, &count);
    176         break;
    177     case snmpIfOutDiscards:              /* Aged packet counter */
    178         if (SOC_REG_IS_VALID(unit, HOLDr)) {
    179             BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, 
    180                               HOLDr, &count);  /* L2 MTU drops */
    181         } else if (SOC_REG_IS_VALID(unit, HOL_DROPr)) {
    182             BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, HOL_DROPr, &count);
    183         }
    184         if (SOC_REG_IS_VALID(unit, TDBGC3_64r)) {
    185             BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, TDBGC3_64r, &count);
    186         } else {
    187             BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, TDBGC3r, &count);
    188         }
    189         BCM_IF_ERROR_RETURN(
    190             bcm_esw_cosq_stat_get(unit, port, BCM_COS_INVALID, 
    191                                   bcmCosqStatDroppedPackets, &count1));
    192         COMPILER_64_ADD_64(count, count1);
    193         break;
    194     case snmpIfOutErrors:   /* Error packets could not be xmitted */
    195         BCM_STAT_GENERIC_REG_OPER(unit, port, sync_mode, reg_op, TERR, &count);
    196         break;
    197     case snmpIfOutQLen:
    198         {
    199             uint32 qcount;
    200             if (bcm_esw_port_queued_count_get(unit, port, &qcount) >= 0) {
    201                 COMPILER_64_ADD_32(count, qcount);
    202             }
    203         }
    204         break;
    205     case snmpIpInReceives:
    206         if (SOC_REG_IS_VALID(unit, RIPC4_64r)) {
    207             BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, RIPC4_64r, &count);
    208         } else {
    209             BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, RIPC4r, &count);
    210         }
    211         break;
    212     case snmpIpInHdrErrors:
    213         if (SOC_REG_IS_VALID(unit, RIPD4_64r)) {
    214             BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, RIPD4_64r, &count);
    215         } else {
    216             BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, RIPD4r, &count);
    217         }
    218         break;
    219     case snmpIpForwDatagrams:
    220         if (SOC_REG_IS_VALID(unit, TDBGC4_64r)) {
    221             BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, TDBGC4_64r, &count);
    222         } else {
    223             BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, TDBGC4r, &count);
    224         }
    225         break;
    226     case snmpIpInDiscards:
    227         if (SOC_REG_IS_VALID(unit, RIPHE4_64r)) {
    228             BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, RIPHE4_64r, &count);
    229         } else {
    230             BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, RIPHE4r, &count);
    231         }
    232         if (SOC_REG_IS_VALID(unit, RIPD4_64r)) {
    233             BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, RIPD4_64r, &count);
    234         } else {
    235             BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, RIPD4r, &count);
    236         }
    237         break;
    238 
    239         /* *** RFC 1493 *** */
    240 
    241     case snmpDot1dBasePortDelayExceededDiscards:
    242         break;
    243     case snmpDot1dBasePortMtuExceededDiscards:
    244         BCM_STAT_GENERIC_REG_OPER(unit, port, sync_mode, reg_op, RMTUE, &count);
    245         break;
    246     case snmpDot1dTpPortInFrames:
    247         BCM_STAT_GENERIC_REG_OPER(unit, port, sync_mode, reg_op, RPKT, &count);
    248         break;
    249     case snmpDot1dTpPortOutFrames:
    250         BCM_STAT_GENERIC_REG_OPER(unit, port, sync_mode, reg_op, TPKT, &count);
    251         break;
    252     case snmpDot1dPortInDiscards:
    253         if (SOC_REG_IS_VALID(unit, RDISC_64r)) {
    254             BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, RDISC_64r, &count);
    255         } else {
    256             BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, RDISCr, &count);
    257         }
    258         if (SOC_REG_IS_VALID(unit, RIPD4_64r)) {
    259             BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, RIPD4_64r, &count);
    260         } else {
    261             BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, RIPD4r, &count);
    262         }
    263         if (SOC_REG_IS_VALID(unit, RIPD6_64r)) {
    264             BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, RIPD6_64r, &count);
    265         } else {
    266             BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, RIPD6r, &count);
    267         }
    268         if (SOC_REG_IS_VALID(unit, RPORTD_64r)) {
    269             BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, RPORTD_64r, &count);
    270         } else {
    271             BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, RPORTDr, &count);
    272         }
    273         break;
    274 
    275         /* *** RFC 1757 *** */
    276 
    277     case snmpEtherStatsDropEvents:
    278         if (SOC_REG_IS_VALID(unit, RDISC_64r)) {
    279             BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, RDISC_64r, &count);
    280         } else {
    281             BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, RDISCr, &count);
    282         }
    283         break;
    284     case snmpEtherStatsOctets:
    285         BCM_STAT_GENERIC_REG_OPER(unit, port, sync_mode, reg_op, RBYT, &count);
    286         BCM_STAT_GENERIC_REG_OPER(unit, port, sync_mode, reg_op, TBYT, &count);
    287         BCM_STAT_GENERIC_REG_OPER(unit, port, sync_mode, reg_op,
    288                           RRBYT, &count); /* Runts bytes */
    289         break;
    290     case snmpEtherStatsPkts:
    291         BCM_STAT_GENERIC_REG_OPER(unit, port, sync_mode, reg_op, RPKT, &count);
    292         BCM_STAT_GENERIC_REG_OPER(unit, port, sync_mode, reg_op, TPKT, &count);
    293         BCM_STAT_GENERIC_REG_OPER(unit, port, sync_mode, reg_op,
    294                           RRPKT, &count); /* Runts */
    295         break;
    296     case snmpEtherStatsBroadcastPkts:
    297         BCM_STAT_GENERIC_REG_OPER(unit, port, sync_mode, reg_op, RBCA, &count);
    298         BCM_STAT_GENERIC_REG_OPER(unit, port, sync_mode, reg_op, TBCA, &count);
    299         break;
    300     case snmpEtherStatsMulticastPkts:
    301         BCM_STAT_GENERIC_REG_OPER(unit, port, sync_mode, reg_op, RMCA, &count);
    302         BCM_STAT_GENERIC_REG_OPER(unit, port, sync_mode, reg_op, TMCA, &count);
    303         break;
    304     case snmpEtherStatsCRCAlignErrors:
    305         BCM_STAT_GENERIC_REG_OPER(unit, port, sync_mode, reg_op, RFCS, &count);
    306         break;
    307     case snmpEtherStatsUndersizePkts:
    308         BCM_STAT_GENERIC_REG_OPER(unit, port, sync_mode, reg_op, RUND, &count);
    309         break;
    310     case snmpEtherStatsOversizePkts:
    311         BCM_STAT_GENERIC_REG_OPER(unit, port, sync_mode, reg_op, ROVR, &count);
    312         BCM_STAT_GENERIC_REG_OPER(unit, port, sync_mode, reg_op, TOVR, &count);
    313         break;
    314     case snmpEtherRxOversizePkts:
    315         BCM_STAT_GENERIC_REG_OPER(unit, port, sync_mode, reg_op, ROVR, &count);
    316         break;
    317     case snmpEtherTxOversizePkts:
    318         BCM_STAT_GENERIC_REG_OPER(unit, port, sync_mode, reg_op, TOVR, &count);
    319         break;
    320     case snmpEtherStatsFragments:
    321         BCM_STAT_GENERIC_REG_OPER(unit, port, sync_mode, reg_op, RFRG, &count);
    322         break;
    323     case snmpEtherStatsJabbers:
    324         BCM_STAT_GENERIC_REG_OPER(unit, port, sync_mode, reg_op, RJBR, &count);
    325         break;
    326     case snmpEtherStatsCollisions:
    327         break;
    328 
    329         /* *** rfc1757 definition counts receive packet only *** */
    330 
    331     case snmpEtherStatsPkts64Octets:
    332         BCM_STAT_GENERIC_REG_OPER(unit, port, sync_mode, reg_op, R64, &count);
    333         BCM_STAT_GENERIC_REG_OPER(unit, port, sync_mode, reg_op, T64, &count);
    334         break;
    335     case snmpEtherStatsPkts65to127Octets:
    336         BCM_STAT_GENERIC_REG_OPER(unit, port, sync_mode, reg_op, R127, &count);
    337         BCM_STAT_GENERIC_REG_OPER(unit, port, sync_mode, reg_op, T127, &count);
    338         break;
    339     case snmpEtherStatsPkts128to255Octets:
    340         BCM_STAT_GENERIC_REG_OPER(unit, port, sync_mode, reg_op, R255, &count);
    341         BCM_STAT_GENERIC_REG_OPER(unit, port, sync_mode, reg_op, T255, &count);
    342         break;
    343     case snmpEtherStatsPkts256to511Octets:
    344         BCM_STAT_GENERIC_REG_OPER(unit, port, sync_mode, reg_op, R511, &count);
    345         BCM_STAT_GENERIC_REG_OPER(unit, port, sync_mode, reg_op, T511, &count);
    346         break;
    347     case snmpEtherStatsPkts512to1023Octets:
    348         BCM_STAT_GENERIC_REG_OPER(unit, port, sync_mode, reg_op, R1023, &count);
    349         BCM_STAT_GENERIC_REG_OPER(unit, port, sync_mode, reg_op, T1023, &count);
    350         break;
    351     case snmpEtherStatsPkts1024to1518Octets:
    352         BCM_STAT_GENERIC_REG_OPER(unit, port, sync_mode, reg_op, R1518, &count);
    353         BCM_STAT_GENERIC_REG_OPER(unit, port, sync_mode, reg_op, T1518, &count);
    354         break;
    355     case snmpBcmEtherStatsPkts1519to1522Octets: /* not in rfc1757 */
    356         BCM_STAT_GENERIC_REG_OPER(unit, port, sync_mode, reg_op, RMGV, &count);
    357         BCM_STAT_GENERIC_REG_OPER(unit, port, sync_mode, reg_op, TMGV, &count);
    358         break;
    359     case snmpBcmEtherStatsPkts1522to2047Octets: /* not in rfc1757 */
    360         BCM_STAT_GENERIC_REG_OPER(unit, port, sync_mode, reg_op, R2047, &count);
    361         BCM_STAT_GENERIC_REG_OPER(unit, port, sync_mode, reg_sub_op, RMGV, &count);
    362         BCM_STAT_GENERIC_REG_OPER(unit, port, sync_mode, reg_op, T2047, &count);
    363         BCM_STAT_GENERIC_REG_OPER(unit, port, sync_mode, reg_sub_op, TMGV, &count);
    364         break;
    365     case snmpBcmEtherStatsPkts2048to4095Octets: /* not in rfc1757 */
    366         BCM_STAT_GENERIC_REG_OPER(unit, port, sync_mode, reg_op, R4095, &count);
    367         BCM_STAT_GENERIC_REG_OPER(unit, port, sync_mode, reg_op, T4095, &count);
    368         break;
    369     case snmpBcmEtherStatsPkts4095to9216Octets: /* not in rfc1757 */
    370         BCM_STAT_GENERIC_REG_OPER(unit, port, sync_mode, reg_op, R9216, &count);
    371         BCM_STAT_GENERIC_REG_OPER(unit, port, sync_mode, reg_op, T9216, &count);
    372         break;
    373     case snmpBcmEtherStatsPkts9217to16383Octets: /* not in rfc1757 */
    374         BCM_STAT_GENERIC_REG_OPER(unit, port, sync_mode, reg_op, R16383, &count);
    375         BCM_STAT_GENERIC_REG_OPER(unit, port, sync_mode, reg_op, T16383, &count);
    376         break;
    377 
    378     case snmpBcmReceivedPkts64Octets:
    379         BCM_STAT_GENERIC_REG_OPER(unit, port, sync_mode, reg_op, R64, &count);
    380         break;
    381     case snmpBcmReceivedPkts65to127Octets:
    382         BCM_STAT_GENERIC_REG_OPER(unit, port, sync_mode, reg_op, R127, &count);
    383         break;
    384     case snmpBcmReceivedPkts128to255Octets:
    385         BCM_STAT_GENERIC_REG_OPER(unit, port, sync_mode, reg_op, R255, &count);
    386         break;
    387     case snmpBcmReceivedPkts256to511Octets:
    388         BCM_STAT_GENERIC_REG_OPER(unit, port, sync_mode, reg_op, R511, &count);
    389         break;
    390     case snmpBcmReceivedPkts512to1023Octets:
    391         BCM_STAT_GENERIC_REG_OPER(unit, port, sync_mode, reg_op, R1023, &count);
    392         break;
    393     case snmpBcmReceivedPkts1024to1518Octets:
    394         BCM_STAT_GENERIC_REG_OPER(unit, port, sync_mode, reg_op, R1518, &count);
    395         break;
    396     case snmpBcmReceivedPkts1519to2047Octets:
    397         BCM_STAT_GENERIC_REG_OPER(unit, port, sync_mode, reg_op, R2047, &count);
    398         break;
    399     case snmpBcmReceivedPkts2048to4095Octets:
    400         BCM_STAT_GENERIC_REG_OPER(unit, port, sync_mode, reg_op, R4095, &count);
    401         break;
    402     case snmpBcmReceivedPkts4095to9216Octets:
    403         BCM_STAT_GENERIC_REG_OPER(unit, port, sync_mode, reg_op, R9216, &count);
    404         break;
    405     case snmpBcmReceivedPkts9217to16383Octets:
    406         BCM_STAT_GENERIC_REG_OPER(unit, port, sync_mode, reg_op, R16383, &count);
    407         break;
    408 
    409     case snmpBcmTransmittedPkts64Octets:
    410         BCM_STAT_GENERIC_REG_OPER(unit, port, sync_mode, reg_op, T64, &count);
    411         break;
    412     case snmpBcmTransmittedPkts65to127Octets:
    413         BCM_STAT_GENERIC_REG_OPER(unit, port, sync_mode, reg_op, T127, &count);
    414         break;
    415     case snmpBcmTransmittedPkts128to255Octets:
    416         BCM_STAT_GENERIC_REG_OPER(unit, port, sync_mode, reg_op, T255, &count);
    417         break;
    418     case snmpBcmTransmittedPkts256to511Octets:
    419         BCM_STAT_GENERIC_REG_OPER(unit, port, sync_mode, reg_op, T511, &count);
    420         break;
    421     case snmpBcmTransmittedPkts512to1023Octets:
    422         BCM_STAT_GENERIC_REG_OPER(unit, port, sync_mode, reg_op, T1023, &count);
    423         break;
    424     case snmpBcmTransmittedPkts1024to1518Octets:
    425         BCM_STAT_GENERIC_REG_OPER(unit, port, sync_mode, reg_op, T1518, &count);
    426         break;
    427     case snmpBcmTransmittedPkts1519to2047Octets:
    428         BCM_STAT_GENERIC_REG_OPER(unit, port, sync_mode, reg_op, T2047, &count);
    429         break;
    430     case snmpBcmTransmittedPkts2048to4095Octets:
    431         BCM_STAT_GENERIC_REG_OPER(unit, port, sync_mode, reg_op, T4095, &count);
    432         break;
    433     case snmpBcmTransmittedPkts4095to9216Octets:
    434         BCM_STAT_GENERIC_REG_OPER(unit, port, sync_mode, reg_op, T9216, &count);
    435         break;
    436     case snmpBcmTransmittedPkts9217to16383Octets:
    437         BCM_STAT_GENERIC_REG_OPER(unit, port, sync_mode, reg_op, T16383, &count);
    438         break;
    439 
    440     case snmpEtherStatsTXNoErrors:
    441         BCM_STAT_GENERIC_REG_OPER(unit, port, sync_mode, reg_op, TPOK, &count);
    442         break;
    443     case snmpEtherStatsRXNoErrors:
    444         BCM_STAT_GENERIC_REG_OPER(unit, port, sync_mode, reg_op, RPOK, &count);
    445         break;
    446 
    447         /* *** RFC 2665 *** */
    448 
    449     case snmpDot3StatsAlignmentErrors:
    450         /* SDK-133312:
    451            lack of CDMIB_RALNf, can't use BCM_STAT_GENERIC_REG_OPER */
    452         if (soc_feature(unit, soc_feature_cxl_mib)) {
    453             int phy_port;
    454             soc_reg_t ctr_reg_adj = RALNr;
    455 
    456             if (soc_feature(unit, soc_feature_logical_port_num)) {
    457                 phy_port = SOC_INFO(unit).port_l2p_mapping[port];
    458             } else {
    459                 phy_port = port;
    460             }
    461             if (SOC_BLOCK_IS_CMP(unit, SOC_PORT_BLOCK(unit, phy_port),
    462                                  SOC_BLK_CLPORT)) {
    463                 if (SOC_REG_IS_VALID(unit, CLMIB_RALNr)) {
    464                     ctr_reg_adj = CLMIB_RALNr;
    465                 }
    466             } else if (SOC_BLOCK_IS_CMP(unit, SOC_PORT_BLOCK(unit, phy_port),
    467                                         SOC_BLK_XLPORT)) {
    468                 if (SOC_REG_IS_VALID(unit, XLMIB_RALNr)) {
    469                     ctr_reg_adj = XLMIB_RALNr;
    470                 }
    471             }
    472             BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, ctr_reg_adj, val);
    473         } else {
    474             BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, RALNr, val);
    475         }
    476         break;
    477     case snmpDot3StatsFCSErrors:
    478         BCM_STAT_GENERIC_REG_OPER(unit, port, sync_mode, reg_op, RFCS, &count);
    479         break;
    480     case snmpDot3StatsSingleCollisionFrames:
    481         break;
    482     case snmpDot3StatsMultipleCollisionFrames:
    483         break;
    484     case snmpDot3StatsSQETTestErrors:
    485         break;
    486     case snmpDot3StatsDeferredTransmissions:
    487         break;
    488     case snmpDot3StatsLateCollisions:
    489         break;
    490     case snmpDot3StatsExcessiveCollisions:
    491         break;
    492     case snmpDot3StatsInternalMacTransmitErrors:
    493         BCM_STAT_GENERIC_REG_OPER(unit, port, sync_mode, reg_op, TUFL, &count);
    494         BCM_STAT_GENERIC_REG_OPER(unit, port, sync_mode, reg_op, TERR, &count);
    495         break;
    496     case snmpDot3StatsCarrierSenseErrors:
    497         /* SDK-133312:
    498            lack of CDMIB_RFCRf, can't use BCM_STAT_GENERIC_REG_OPER */
    499         if (soc_feature(unit, soc_feature_cxl_mib)) {
    500             int phy_port;
    501             soc_reg_t ctr_reg_adj = RFCRr;
    502 
    503             if (soc_feature(unit, soc_feature_logical_port_num)) {
    504                 phy_port = SOC_INFO(unit).port_l2p_mapping[port];
    505             } else {
    506                 phy_port = port;
    507             }
    508             if (SOC_BLOCK_IS_CMP(unit, SOC_PORT_BLOCK(unit, phy_port),
    509                                  SOC_BLK_CLPORT)) {
    510                 if (SOC_REG_IS_VALID(unit, CLMIB_RFCRr)) {
    511                     ctr_reg_adj = CLMIB_RFCRr;
    512                 }
    513             } else if (SOC_BLOCK_IS_CMP(unit, SOC_PORT_BLOCK(unit, phy_port),
    514                                         SOC_BLK_XLPORT)) {
    515                 if (SOC_REG_IS_VALID(unit, XLMIB_RFCRr)) {
    516                     ctr_reg_adj = XLMIB_RFCRr;
    517                 }
    518             }
    519             BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, ctr_reg_adj, val);
    520         } else {
    521             BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, RFCRr, val);
    522         }
    523         break;
    524     case snmpDot3StatsFrameTooLongs:
    525         BCM_STAT_GENERIC_REG_OPER(unit, port, sync_mode, reg_op, RMTUE, &count);
    526         break;
    527     case snmpDot3StatsInternalMacReceiveErrors:
    528         break;
    529     case snmpDot3StatsSymbolErrors:
    530         BCM_STAT_GENERIC_REG_OPER(unit, port, sync_mode, reg_op, RERPKT, &count);
    531         break;
    532     case snmpDot3ControlInUnknownOpcodes:
    533         BCM_STAT_GENERIC_REG_OPER(unit, port, sync_mode, reg_op, RXUO, &count);
    534         break;
    535     case snmpDot3InPauseFrames:
    536         BCM_STAT_GENERIC_REG_OPER(unit, port, sync_mode, reg_op, RXPF, &count);
    537         break;
    538     case snmpDot3OutPauseFrames:
    539         BCM_STAT_GENERIC_REG_OPER(unit, port, sync_mode, reg_op, TXPF, &count);
    540         break;
    541 
    542         /* *** RFC 2233 high capacity versions of RFC1213 objects *** */
    543 
    544     case snmpIfHCInOctets:
    545         BCM_STAT_GENERIC_REG_OPER(unit, port, sync_mode, reg_op, RBYT, &count);
    546         BCM_STAT_GENERIC_REG_OPER(unit, port, sync_mode, reg_op, RRBYT, &count);
    547         break;
    548     case snmpIfHCInUcastPkts:
    549         if (soc_feature(unit, soc_feature_hw_stats_calc)) {
    550             if (COUNT_OVR_ERRORS(unit)) {
    551                 BCM_STAT_GENERIC_REG_OPER(unit, port, sync_mode, reg_op,
    552                                   RUCA, &count);  /* unicast pkts rcvd */
    553             } else {
    554                 if (SOC_REG_IS_VALID(unit, RUC_64r)) {
    555                     BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, 
    556                                       RUC_64r, &count);  /* unicast pkts rcvd */
    557                 } else {
    558                     BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, 
    559                                       RUCr, &count);  /* unicast pkts rcvd */
    560                 }
    561             }
    562         } else {
    563             BCM_STAT_GENERIC_REG_OPER(unit, port, sync_mode, reg_op, RPKT, &count);
    564             BCM_STAT_GENERIC_REG_OPER(unit, port, sync_mode, reg_sub_op,
    565                               RMCA, &count);
    566             BCM_STAT_GENERIC_REG_OPER(unit, port, sync_mode, reg_sub_op,
    567                               RBCA, &count);
    568             BCM_STAT_GENERIC_REG_OPER(unit, port, sync_mode, reg_sub_op,
    569                               RFCS, &count); /* - bad FCS */
    570             BCM_STAT_GENERIC_REG_OPER(unit, port, sync_mode, reg_sub_op,
    571                               RFLR, &count); /* - good FCS, bad length */
    572             BCM_STAT_GENERIC_REG_OPER(unit, port, sync_mode, reg_sub_op,
    573                               RXCF, &count); /* - good FCS, all MAC ctrl */
    574             BCM_STAT_GENERIC_REG_OPER(unit, port, sync_mode, reg_sub_op,
    575                               RXPF, &count); /* - not included in RXCFr */
    576             BCM_STAT_GENERIC_REG_OPER(unit, port, sync_mode, reg_sub_op,
    577                               RJBR, &count); /* - oversize, bad FCS */
    578             if (COUNT_OVR_ERRORS(unit)) {
    579                 BCM_STAT_GENERIC_REG_OPER(unit, port, sync_mode, reg_sub_op,
    580                                   ROVR, &count); /* - oversize, good FCS */
    581             }
    582             BCM_STAT_GENERIC_REG_OPER(unit, port, sync_mode, reg_sub_op,
    583                               RMTUE, &count); /* - MTU errors */
    584         }
    585         break;
    586     case snmpIfHCInMulticastPkts:
    587         BCM_STAT_GENERIC_REG_OPER(unit, port, sync_mode, reg_op, RMCA, &count);
    588         break;
    589     case snmpIfHCInBroadcastPkts:
    590         BCM_STAT_GENERIC_REG_OPER(unit, port, sync_mode, reg_op, RBCA, &count);
    591         break;
    592     case snmpIfHCOutOctets:
    593         BCM_STAT_GENERIC_REG_OPER(unit, port, sync_mode, reg_op, TBYT, &count);
    594         break;
    595     case snmpIfHCOutUcastPkts:
    596         BCM_STAT_GENERIC_REG_OPER(unit, port, sync_mode, reg_op, TUCA, &count);
    597         if (!COUNT_OVR_ERRORS(unit)) {
    598             BCM_STAT_GENERIC_REG_OPER(unit, port, sync_mode, reg_op,
    599                               TOVR, &count); /* + oversized pkts */
    600         }
    601         break;
    602     case snmpIfHCOutMulticastPkts:
    603         BCM_STAT_GENERIC_REG_OPER(unit, port, sync_mode, reg_op, TMCA, &count);
    604         break;
    605     case snmpIfHCOutBroadcastPckts:
    606         BCM_STAT_GENERIC_REG_OPER(unit, port, sync_mode, reg_op, TBCA, &count);
    607         break;
    608 
    609         /* *** RFC 2465 *** */
    610 
    611     case snmpIpv6IfStatsInReceives:
    612         if (SOC_REG_IS_VALID(unit, RIPC6_64r)) {
    613             BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, RIPC6_64r, &count);
    614         } else {
    615             BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, RIPC6r, &count);
    616         }
    617         if (SOC_REG_IS_VALID(unit, IMRP6_64r)) {
    618             BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, IMRP6_64r, &count);
    619         } else {
    620             BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, IMRP6r, &count);
    621         }
    622         break;
    623     case snmpIpv6IfStatsInHdrErrors:
    624         if (SOC_REG_IS_VALID(unit, RIPD6_64r)) {
    625             BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, RIPD6_64r, &count);
    626         } else {
    627             BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, RIPD6r, &count);
    628         }
    629         break;
    630     case snmpIpv6IfStatsInAddrErrors:
    631         if (SOC_REG_IS_VALID(unit, RIPHE6_64r)) {
    632             BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, RIPHE6_64r, &count);
    633         } else {
    634             BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, RIPHE6r, &count);
    635         }
    636         break;
    637     case snmpIpv6IfStatsInDiscards:
    638         if (SOC_REG_IS_VALID(unit, RIPHE6_64r)) {
    639             BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, RIPHE6_64r, &count);
    640         } else {
    641             BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, RIPHE6r, &count);
    642         }
    643         if (SOC_REG_IS_VALID(unit, RIPD6_64r)) {
    644             BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, RIPD6_64r, &count);
    645         } else {
    646             BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, RIPD6r, &count);
    647         }
    648         break;
    649     case snmpIpv6IfStatsOutForwDatagrams:
    650         if (SOC_REG_IS_VALID(unit, TDBGC0_64r)) {
    651             BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, TDBGC0_64r, &count);
    652         } else {
    653             BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, TDBGC0r, &count);
    654         }
    655         break;
    656     case snmpIpv6IfStatsOutDiscards:
    657         if (SOC_REG_IS_VALID(unit, TDBGC1_64r)) {
    658             BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, TDBGC1_64r, &count);
    659         } else {
    660             BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, TDBGC1r, &count);
    661         }
    662         break;
    663     case snmpIpv6IfStatsInMcastPkts:
    664         if (SOC_REG_IS_VALID(unit, IMRP6_64r)) {
    665             BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, IMRP6_64r, &count);
    666         } else {
    667             BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, IMRP6r, &count);
    668         }
    669         break;
    670     case snmpIpv6IfStatsOutMcastPkts:
    671         if (SOC_REG_IS_VALID(unit, TDBGC2_64r)) {
    672             BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, TDBGC2_64r, &count);
    673         } else {
    674             BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, TDBGC2r, &count);
    675         }
    676         break;
    677 
    678         /* *** IEEE 802.1bb *** */
    679     case snmpIeee8021PfcRequests:
    680         BCM_STAT_GENERIC_REG_OPER(unit, port, sync_mode, reg_op, TXPP, &count);
    681         break;
    682     case snmpIeee8021PfcIndications:
    683         BCM_STAT_GENERIC_REG_OPER(unit, port, sync_mode, reg_op, RXPP, &count);
    684         break;
    685 
    686         /* *** RFC 1284 - unsupported in XGS *** */
    687     case snmpDot3StatsInRangeLengthError:
    688         break;
    689 
    690         /* *** RFC 4837 - unsupported in XGS *** */
    691     case snmpDot3OmpEmulationCRC8Errors:
    692     case snmpDot3MpcpRxGate:
    693     case snmpDot3MpcpRxRegister:
    694     case snmpDot3MpcpTxRegRequest:
    695     case snmpDot3MpcpTxRegAck:
    696     case snmpDot3MpcpTxReport:
    697     case snmpDot3EponFecCorrectedBlocks:
    698     case snmpDot3EponFecUncorrectableBlocks:
    699         break;
    700 
    701         /* IPMC counters (broadcom specific) */
    702 
    703     case snmpBcmIPMCBridgedPckts:
    704         if (SOC_REG_IS_VALID(unit, RDBGC1_64r)) {
    705             BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, RDBGC1_64r, &count);
    706         } else {
    707             BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, RDBGC1r, &count);
    708         }
    709         break;
    710     case snmpBcmIPMCRoutedPckts:
    711         if (SOC_REG_IS_VALID(unit, IMRP4_64r)) {
    712             BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, IMRP4_64r, &count);
    713         } else {
    714             BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, IMRP4r, &count);
    715         }
    716         if (SOC_REG_IS_VALID(unit, IMRP6_64r)) {
    717             BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, IMRP6_64r, &count);
    718         } else {
    719             BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, IMRP6r, &count);
    720         }
    721         break;
    722     case snmpBcmIPMCInDroppedPckts:
    723         if (SOC_REG_IS_VALID(unit, RDBGC2_64r)) {
    724             BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, RDBGC2_64r, &count);
    725         } else {
    726             BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, RDBGC2r, &count);
    727         }
    728         break;
    729     case snmpBcmIPMCOutDroppedPckts:
    730         if (SOC_REG_IS_VALID(unit, TDBGC5_64r)) {
    731             BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, TDBGC5_64r, &count);
    732         } else {
    733             BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, TDBGC5r, &count);
    734         }
    735         break;
    736 
    737         /* EA (broadcom specific) - unsupported in XGS */
    738     case snmpBcmPonInDroppedOctets:
    739     case snmpBcmPonOutDroppedOctets:
    740     case snmpBcmPonInDelayedOctets:
    741     case snmpBcmPonOutDelayedOctets:
    742     case snmpBcmPonInDelayedHundredUs:
    743     case snmpBcmPonOutDelayedHundredUs:
    744     case snmpBcmPonInFrameErrors:
    745     case snmpBcmPonInOamFrames:
    746     case snmpBcmPonOutOamFrames:
    747     case snmpBcmPonOutUnusedOctets:
    748 	break;
    749 
    750     /* Vlan Tag Frame Counters */
    751     case snmpBcmRxVlanTagFrame:
    752         BCM_STAT_GENERIC_REG_OPER(unit, port, sync_mode, reg_op, RVLN, &count);
    753         break;
    754     case snmpBcmRxDoubleVlanTagFrame:
    755         BCM_STAT_GENERIC_REG_OPER(unit, port, sync_mode, reg_op, RDVLN, &count);
    756         break;
    757     case snmpBcmTxVlanTagFrame:
    758         BCM_STAT_GENERIC_REG_OPER(unit, port, sync_mode, reg_op, TVLN, &count);
    759         break;
    760     case snmpBcmTxDoubleVlanTagFrame:
    761         BCM_STAT_GENERIC_REG_OPER(unit, port, sync_mode, reg_op, TDVLN, &count);
    762         break;
    763 
    764     /* PFC Control Frame Counters */
    765     case snmpBcmRxPFCControlFrame:
    766         BCM_STAT_GENERIC_REG_OPER(unit, port, sync_mode, reg_op, RXPP, &count);
    767         break;
    768 
    769     case snmpBcmTxPFCControlFrame:
    770         BCM_STAT_GENERIC_REG_OPER(unit, port, sync_mode, reg_op, TXPP, &count);
    771         break;
    772 
    773     /* Receive PFC Frame Priority 0 XON to XOFF */
    774     case snmpBcmRxPFCFrameXonPriority0:
    775         BCM_STAT_GENERIC_REG_OPER(unit, port, sync_mode, reg_op, RPFCOFF0, &count);
    776         break;
    777 
    778     case snmpBcmRxPFCFrameXonPriority1:
    779         BCM_STAT_GENERIC_REG_OPER(unit, port, sync_mode, reg_op, RPFCOFF1, &count);
    780         break;
    781 
    782     case snmpBcmRxPFCFrameXonPriority2:
    783         BCM_STAT_GENERIC_REG_OPER(unit, port, sync_mode, reg_op, RPFCOFF2, &count);
    784         break;
    785 
    786     case snmpBcmRxPFCFrameXonPriority3:
    787         BCM_STAT_GENERIC_REG_OPER(unit, port, sync_mode, reg_op, RPFCOFF3, &count);
    788         break;
    789 
    790     case snmpBcmRxPFCFrameXonPriority4:
    791         BCM_STAT_GENERIC_REG_OPER(unit, port, sync_mode, reg_op, RPFCOFF4, &count);
    792         break;
    793 
    794     case snmpBcmRxPFCFrameXonPriority5:
    795         BCM_STAT_GENERIC_REG_OPER(unit, port, sync_mode, reg_op, RPFCOFF5, &count);
    796         break;
    797 
    798     case snmpBcmRxPFCFrameXonPriority6:
    799         BCM_STAT_GENERIC_REG_OPER(unit, port, sync_mode, reg_op, RPFCOFF6, &count);
    800         break;
    801 
    802     case snmpBcmRxPFCFrameXonPriority7:
    803         BCM_STAT_GENERIC_REG_OPER(unit, port, sync_mode, reg_op, RPFCOFF7, &count);
    804         break;
    805 
    806     /* Receive PFC Frame Priority */
    807     case snmpBcmRxPFCFramePriority0:
    808         BCM_STAT_GENERIC_REG_OPER(unit, port, sync_mode, reg_op, RPFC0, &count);
    809         break;
    810 
    811     case snmpBcmRxPFCFramePriority1:
    812         BCM_STAT_GENERIC_REG_OPER(unit, port, sync_mode, reg_op, RPFC1, &count);
    813         break;
    814 
    815     case snmpBcmRxPFCFramePriority2:
    816         BCM_STAT_GENERIC_REG_OPER(unit, port, sync_mode, reg_op, RPFC2, &count);
    817         break;
    818 
    819     case snmpBcmRxPFCFramePriority3:
    820         BCM_STAT_GENERIC_REG_OPER(unit, port, sync_mode, reg_op, RPFC3, &count);
    821         break;
    822 
    823     case snmpBcmRxPFCFramePriority4:
    824         BCM_STAT_GENERIC_REG_OPER(unit, port, sync_mode, reg_op, RPFC4, &count);
    825         break;
    826 
    827     case snmpBcmRxPFCFramePriority5:
    828         BCM_STAT_GENERIC_REG_OPER(unit, port, sync_mode, reg_op, RPFC5, &count);
    829         break;
    830 
    831     case snmpBcmRxPFCFramePriority6:
    832         BCM_STAT_GENERIC_REG_OPER(unit, port, sync_mode, reg_op, RPFC6, &count);
    833         break;
    834 
    835     case snmpBcmRxPFCFramePriority7:
    836         BCM_STAT_GENERIC_REG_OPER(unit, port, sync_mode, reg_op, RPFC7, &count);
    837         break;
    838 
    839     /* Transmit PFC Frame Priority */
    840     case snmpBcmTxPFCFramePriority0:
    841         BCM_STAT_GENERIC_REG_OPER(unit, port, sync_mode, reg_op, TPFC0, &count);
    842         break;
    843 
    844     case snmpBcmTxPFCFramePriority1:
    845         BCM_STAT_GENERIC_REG_OPER(unit, port, sync_mode, reg_op, TPFC1, &count);
    846         break;
    847 
    848     case snmpBcmTxPFCFramePriority2:
    849         BCM_STAT_GENERIC_REG_OPER(unit, port, sync_mode, reg_op, TPFC2, &count);
    850         break;
    851 
    852     case snmpBcmTxPFCFramePriority3:
    853         BCM_STAT_GENERIC_REG_OPER(unit, port, sync_mode, reg_op, TPFC3, &count);
    854         break;
    855 
    856     case snmpBcmTxPFCFramePriority4:
    857         BCM_STAT_GENERIC_REG_OPER(unit, port, sync_mode, reg_op, TPFC4, &count);
    858         break;
    859 
    860     case snmpBcmTxPFCFramePriority5:
    861         BCM_STAT_GENERIC_REG_OPER(unit, port, sync_mode, reg_op, TPFC5, &count);
    862         break;
    863 
    864     case snmpBcmTxPFCFramePriority6:
    865         BCM_STAT_GENERIC_REG_OPER(unit, port, sync_mode, reg_op, TPFC6, &count);
    866         break;
    867 
    868     case snmpBcmTxPFCFramePriority7:
    869         BCM_STAT_GENERIC_REG_OPER(unit, port, sync_mode, reg_op, TPFC7, &count);
    870         break;
    871 
    872     case snmpFcmPortClass3RxFrames:
    873         if (soc_feature(unit, soc_feature_fcoe)) {
    874             if (SOC_REG_IS_VALID(unit, RDBGC3_64r)) {
    875                 BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, RDBGC3_64r, &count);
    876             } else {
    877                 BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, RDBGC3r, &count);
    878             }
    879         } else {
    880             return BCM_E_UNAVAIL;
    881         }
    882         break;
    883 
    884     case snmpFcmPortClass3TxFrames:
    885         if (soc_feature(unit, soc_feature_fcoe)) {
    886             if (SOC_REG_IS_VALID(unit, TDBGC6_64r)) {
    887                 BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, TDBGC6_64r, &count);
    888             } else {
    889                 BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, TDBGC6r, &count);
    890             }
    891         } else {
    892             return BCM_E_UNAVAIL;
    893         }
    894         break;
    895 
    896     case snmpFcmPortClass3Discards:
    897         if (soc_feature(unit, soc_feature_fcoe)) {
    898             if (SOC_REG_IS_VALID(unit, RDBGC4_64r)) {
    899                 BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, RDBGC4_64r, &count);
    900             } else {
    901                 BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, RDBGC4r, &count);
    902             }
    903         } else {
    904             return BCM_E_UNAVAIL;
    905         }
    906         break;
    907 
    908     case snmpFcmPortClass2RxFrames:
    909         if (soc_feature(unit, soc_feature_fcoe)) {
    910             if (SOC_REG_IS_VALID(unit, RDBGC5_64r)) {
    911                 BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, RDBGC5_64r, &count);
    912             } else {
    913                 BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, RDBGC5r, &count);
    914             }
    915         } else {
    916             return BCM_E_UNAVAIL;
    917         }
    918         break;
    919 
    920     case snmpFcmPortClass2TxFrames:
    921         if (soc_feature(unit, soc_feature_fcoe)) {
    922             if (SOC_REG_IS_VALID(unit, TDBGC7_64r)) {
    923                 BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, TDBGC7_64r, &count);
    924             } else {
    925                 BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, TDBGC7r, &count);
    926             }
    927         } else {
    928             return BCM_E_UNAVAIL;
    929         }
    930         break;
    931 
    932     case snmpFcmPortClass2Discards:
    933         if (soc_feature(unit, soc_feature_fcoe)) {
    934             if (SOC_REG_IS_VALID(unit, RDBGC6_64r)) {
    935                 BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, RDBGC6_64r, &count);
    936             } else {
    937                 BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, RDBGC6r, &count);
    938             }
    939         } else {
    940             return BCM_E_UNAVAIL;
    941         }
    942         break;
    943 
    944     case snmpFcmPortInvalidCRCs:
    945         if (soc_feature(unit, soc_feature_fcoe)) {
    946             BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, 
    947                               EGR_FCOE_INVALID_CRC_FRAMESr, &count);
    948         } else {
    949             return BCM_E_UNAVAIL;
    950         }
    951         break;
    952 
    953     case snmpFcmPortDelimiterErrors:
    954         if (soc_feature(unit, soc_feature_fcoe)) {
    955             BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, 
    956                               EGR_FCOE_DELIMITER_ERROR_FRAMESr, &count);
    957         } else {
    958             return BCM_E_UNAVAIL;
    959         }
    960         break;
    961 #ifdef BCM_TOMAHAWK_SUPPORT
    962     case snmpBcmSampleIngressPkts:
    963     case snmpBcmSampleIngressSnapshotPkts:
    964     case snmpBcmSampleIngressSampledPkts:
    965         if (soc_feature(unit, soc_feature_sflow_counters)) {
    966             ctrl_info.instance_type = SOC_CTR_INSTANCE_TYPE_SFLOW;
    967 
    968             if (type == snmpBcmSampleIngressPkts) {
    969                 ctrl_info.instance = SOC_SFLOW_CTR_TYPE_SAMPLE_POOL;
    970             } else if (type == snmpBcmSampleIngressSnapshotPkts) {
    971                 ctrl_info.instance = SOC_SFLOW_CTR_TYPE_SAMPLE_POOL_SNAPSHOT;
    972             } else { /* snmpBcmSampleIngressSampledPkts */
    973                 ctrl_info.instance = SOC_SFLOW_CTR_TYPE_SAMPLE_COUNT;
    974             }
    975 
    976             if (stat_op == _BCM_STAT_GET) {
    977                 BCM_IF_ERROR_RETURN
    978                     (soc_counter_generic_get(unit,
    979                                              SOC_COUNTER_NON_DMA_SFLOW_ING_PKT,
    980                                              ctrl_info, sync_mode, port,
    981                                              &count));
    982             } else { /* _BCM_STAT_CLEAR */
    983                 BCM_IF_ERROR_RETURN
    984                     (soc_counter_generic_set(unit,
    985                                              SOC_COUNTER_NON_DMA_SFLOW_ING_PKT,
    986                                              ctrl_info, 0, port, count));
    987             }
    988         }
    989         break;
    990     case snmpBcmSampleFlexPkts:
    991     case snmpBcmSampleFlexSnapshotPkts:
    992     case snmpBcmSampleFlexSampledPkts:
    993         if (soc_feature(unit, soc_feature_sflow_counters))  {
    994             ctrl_info.instance_type = SOC_CTR_INSTANCE_TYPE_SFLOW;
    995 
    996             if (type == snmpBcmSampleFlexPkts) {
    997                 ctrl_info.instance = SOC_SFLOW_CTR_TYPE_SAMPLE_POOL;
    998             } else if (type == snmpBcmSampleFlexSnapshotPkts) {
    999                 ctrl_info.instance = SOC_SFLOW_CTR_TYPE_SAMPLE_POOL_SNAPSHOT;
   1000             } else { /* snmpBcmSampleFlexSampledPkts */
   1001                 ctrl_info.instance = SOC_SFLOW_CTR_TYPE_SAMPLE_COUNT;
   1002             }
   1003 
   1004             if (stat_op == _BCM_STAT_GET) {
   1005                 BCM_IF_ERROR_RETURN
   1006                     (soc_counter_generic_get(unit,
   1007                                         SOC_COUNTER_NON_DMA_SFLOW_FLEX_PKT,
   1008                                         ctrl_info, sync_mode, port, &count));
   1009             } else { /* _BCM_STAT_CLEAR */
   1010                 BCM_IF_ERROR_RETURN
   1011                     (soc_counter_generic_set(unit,
   1012                                         SOC_COUNTER_NON_DMA_SFLOW_FLEX_PKT,
   1013                                         ctrl_info, 0, port, count));
   1014             }
   1015         }
   1016         break;
   1017 #endif /* BCM_TOMAHAWK_SUPPORT */
   1018 
   1019     case snmpBcmTxE2ECCControlFrames:
   1020         if (SOC_REG_IS_VALID(unit, XTHOLr)) {
   1021             BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, XTHOLr,
   1022                               &count);
   1023         }
   1024         break;
   1025 
   1026     case snmpBcmTxEcnErrors:
   1027         if (SOC_REG_IS_VALID(unit, EGR_ECN_COUNTER_64r)) {
   1028             BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, EGR_ECN_COUNTER_64r, &count);
   1029         } else if (SOC_REG_IS_VALID(unit, EGR_ECN_COUNTERr)) {
   1030             BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, EGR_ECN_COUNTERr, &count);
   1031         } else {
   1032             return BCM_E_UNAVAIL;
   1033         }
   1034         break;
   1035 
   1036     case snmpBcmRxDot3LengthMismatches:
   1037         if (SOC_REG_IS_VALID(unit, RFLRr)) {
   1038             BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op,
   1039                               RFLRr, &count); /* Good FCS, bad length */
   1040         } else {
   1041             return BCM_E_UNAVAIL;
   1042         }
   1043         break;
   1044 
   1045     default:
   1046         if (type < snmpValCount) {
   1047             return BCM_E_UNAVAIL;
   1048         }
   1049         LOG_VERBOSE(BSL_LS_SOC_COMMON,
   1050                     (BSL_META_U(unit,
   1051                                 "_bcm_stat_generic_get: Statistic not supported: %d\n"), type));
   1052         return BCM_E_PARAM;
   1053     }
   1054 
   1055     if (stat_op == _BCM_STAT_GET) {
   1056         *val = count;
   1057     }
   1058 
   1059     return BCM_E_NONE;
   1060 }