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_clmib.c (27436B)


      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  *      bcmi_stat_clmib_get_set
     20  * Description:
     21  *      Get the specified statistic for CL port with CLMIB counters.
     22  * Parameters:
     23  *      unit - PCI device unit number (driver internal)
     24  *      port - zero-based port number
     25  *      sync_mode - if 1 read hw counter else sw accumualated counter
     26  *      type - SNMP statistics type (see stat.h)
     27  *      val  - (OUT) 64 bit statistic counter value
     28  * Returns:
     29  *      BCM_E_NONE - Success.
     30  *      BCM_E_PARAM - Illegal parameter.
     31  *      BCM_E_INTERNAL - Chip access failure.
     32  */
     33 int
     34 bcmi_stat_clmib_get_set(int unit, bcm_port_t port,
     35                         int sync_mode, int stat_op,
     36                         bcm_stat_val_t type, uint64 *val)
     37 {
     38     uint64 count, count1;
     39     int reg_op = (stat_op == _BCM_STAT_GET)? _BCM_STAT_REG_ADD:
     40                                              _BCM_STAT_REG_CLEAR;
     41     int reg_sub_op = (stat_op == _BCM_STAT_GET)? _BCM_STAT_REG_SUB:
     42                                                  _BCM_STAT_REG_CLEAR;
     43 
     44     COMPILER_REFERENCE(&count);  /* Work around PPC compiler bug */
     45     COMPILER_64_ZERO(count);
     46 
     47     switch (type) {
     48         /* *** RFC 1213 *** */
     49     case snmpIfInOctets:
     50         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, CLMIB_RBYTr, &count);
     51         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, CLMIB_RRBYTr, &count);
     52         break;
     53     case snmpIfInUcastPkts:             /* Unicast frames */
     54         if (COUNT_OVR_ERRORS(unit)) {
     55             BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op,
     56                               CLMIB_RUCAr, &count); /*unicast pkts rcvd */
     57         } else {
     58             BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op,
     59                               RUCr, &count); /* unicast pkts rcvd */
     60         }
     61         break;
     62     case snmpIfInNUcastPkts:             /* Non-unicast frames */
     63         if (COUNT_OVR_ERRORS(unit)) {
     64             BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op,
     65                               CLMIB_RMCAr, &count); /* + multicast */
     66             BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op,
     67                               CLMIB_RBCAr, &count); /* + broadcast */
     68         } else {
     69             BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op,
     70                               CLMIB_RUCAr, &count); /* + unicast excl */
     71                                               /*   oversize */
     72             BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op,
     73                               CLMIB_RMCAr, &count); /* + multicast */
     74             BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op,
     75                               CLMIB_RBCAr, &count); /* + broadcast */
     76             BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op,
     77                               CLMIB_ROVRr, &count); /* + oversize */
     78             BCM_STAT_REG_OPER(unit, port, sync_mode, reg_sub_op,
     79                               RUCr, &count); /* - unicast */
     80         }
     81         break;
     82     case snmpIfInBroadcastPkts:          /* Broadcast frames */
     83         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, CLMIB_RBCAr, &count);
     84         break;
     85     case snmpIfInMulticastPkts:          /* Multicast frames */
     86         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, CLMIB_RMCAr, &count);
     87         break;
     88     case snmpIfInDiscards:           /* Dropped packets including aborted */
     89         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op,
     90                           RDBGC0r, &count); /* Ingress drop conditions */
     91         BCM_IF_ERROR_RETURN
     92             (_bcm_stat_counter_non_dma_extra_get(unit,
     93                                                  SOC_COUNTER_NON_DMA_PORT_DROP_PKT_ING,
     94                                                  port, &count1));
     95         COMPILER_64_ADD_64(count, count1);
     96         break;
     97     case snmpIfInErrors: /* RX Errors or Receive packets - non-error frames */
     98         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, CLMIB_RFCSr, &count);
     99         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, CLMIB_RJBRr, &count);
    100         if (SOC_REG_IS_VALID(unit, CLMIB_RMTUEr)) {
    101            BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, CLMIB_RMTUEr, &count);
    102         } else if (COUNT_OVR_ERRORS(unit)) {
    103             BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, CLMIB_ROVRr, &count);
    104         }
    105         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, CLMIB_RRPKTr, &count);
    106         break;
    107     case snmpIfInUnknownProtos:
    108         break;
    109     case snmpIfOutOctets:
    110         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, CLMIB_TBYTr, &count);
    111         break;
    112     case snmpIfOutUcastPkts:             /* Unicast frames */
    113         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, CLMIB_TUCAr, &count);
    114         break;
    115     case snmpIfOutNUcastPkts:            /* Non-unicast frames */
    116         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op,
    117                           CLMIB_TMCAr, &count); /* + multicast */
    118         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op,
    119                           CLMIB_TBCAr, &count); /* + broadcast */
    120         break;
    121     case snmpIfOutBroadcastPkts:         /* Broadcast frames */
    122         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, CLMIB_TBCAr, &count);
    123         break;
    124     case snmpIfOutMulticastPkts:         /* Multicast frames */
    125         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, CLMIB_TMCAr, &count);
    126         break;
    127     case snmpIfOutDiscards:              /* Aged packet counter */
    128         if (SOC_REG_IS_VALID(unit, HOLDr)) {
    129             BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op,
    130                               HOLDr, &count);  /* L2 MTU drops */
    131         } else if (SOC_REG_IS_VALID(unit, HOL_DROPr)) {
    132             BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, HOL_DROPr, &count);
    133         }
    134         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, TDBGC3r, &count);
    135         BCM_IF_ERROR_RETURN(
    136             bcm_esw_cosq_stat_get(unit, port, BCM_COS_INVALID,
    137                                   bcmCosqStatDroppedPackets, &count1));
    138         COMPILER_64_ADD_64(count, count1);
    139         break;
    140     case snmpIfOutErrors:   /* Error packets could not be xmitted */
    141         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, CLMIB_TERRr, &count);
    142         break;
    143     case snmpIfOutQLen:
    144         {
    145             uint32 qcount;
    146             if (bcm_esw_port_queued_count_get(unit, port, &qcount) >= 0) {
    147                 COMPILER_64_ADD_32(count, qcount);
    148             }
    149         }
    150         break;
    151     case snmpIpInReceives:
    152         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, RIPC4r, &count);
    153         break;
    154     case snmpIpInHdrErrors:
    155         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, RIPD4r, &count);
    156         break;
    157     case snmpIpForwDatagrams:
    158         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, TDBGC4r, &count);
    159         break;
    160     case snmpIpInDiscards:
    161         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, RIPHE4r, &count);
    162         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, RIPD4r, &count);
    163         break;
    164 
    165         /* *** RFC 1493 *** */
    166 
    167     case snmpDot1dBasePortDelayExceededDiscards:
    168         break;
    169     case snmpDot1dBasePortMtuExceededDiscards:
    170         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, CLMIB_RMTUEr, &count);
    171         break;
    172     case snmpDot1dTpPortInFrames:
    173         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, CLMIB_RPKTr, &count);
    174         break;
    175     case snmpDot1dTpPortOutFrames:
    176         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, CLMIB_TPKTr, &count);
    177         break;
    178     case snmpDot1dPortInDiscards:
    179         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, RDISCr, &count);
    180         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, RIPD4r, &count);
    181         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, RIPD6r, &count);
    182         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, RPORTDr, &count);
    183         break;
    184 
    185         /* *** RFC 1757 *** */
    186 
    187     case snmpEtherStatsDropEvents:
    188         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, RDISCr, &count);
    189         break;
    190     case snmpEtherStatsOctets:
    191         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, CLMIB_RBYTr, &count);
    192         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, CLMIB_TBYTr, &count);
    193         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op,
    194                           CLMIB_RRBYTr, &count); /* Runts bytes */
    195         break;
    196     case snmpEtherStatsPkts:
    197         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, CLMIB_RPKTr, &count);
    198         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, CLMIB_TPKTr, &count);
    199         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op,
    200                           CLMIB_RRPKTr, &count); /* Runts */
    201         break;
    202     case snmpEtherStatsBroadcastPkts:
    203         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, CLMIB_RBCAr, &count);
    204         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, CLMIB_TBCAr, &count);
    205         break;
    206     case snmpEtherStatsMulticastPkts:
    207         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, CLMIB_RMCAr, &count);
    208         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, CLMIB_TMCAr, &count);
    209         break;
    210     case snmpEtherStatsCRCAlignErrors:
    211         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, CLMIB_RFCSr, &count);
    212         break;
    213     case snmpEtherStatsUndersizePkts:
    214         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, CLMIB_RUNDr, &count);
    215         break;
    216     case snmpEtherStatsOversizePkts:
    217         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, CLMIB_ROVRr, &count);
    218         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, CLMIB_TOVRr, &count);
    219         break;
    220     case snmpEtherRxOversizePkts:
    221         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, CLMIB_ROVRr, &count);
    222         break;
    223     case snmpEtherTxOversizePkts:
    224         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, CLMIB_TOVRr, &count);
    225         break;
    226     case snmpEtherStatsFragments:
    227         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, CLMIB_RFRGr, &count);
    228         break;
    229     case snmpEtherStatsJabbers:
    230         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, CLMIB_RJBRr, &count);
    231         break;
    232     case snmpEtherStatsCollisions:
    233         break;
    234 
    235         /* *** rfc1757 definition counts receive packet only *** */
    236 
    237     case snmpEtherStatsPkts64Octets:
    238         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, CLMIB_R64r, &count);
    239         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, CLMIB_T64r, &count);
    240         break;
    241     case snmpEtherStatsPkts65to127Octets:
    242         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, CLMIB_R127r, &count);
    243         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, CLMIB_T127r, &count);
    244         break;
    245     case snmpEtherStatsPkts128to255Octets:
    246         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, CLMIB_R255r, &count);
    247         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, CLMIB_T255r, &count);
    248         break;
    249     case snmpEtherStatsPkts256to511Octets:
    250         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, CLMIB_R511r, &count);
    251         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, CLMIB_T511r, &count);
    252         break;
    253     case snmpEtherStatsPkts512to1023Octets:
    254         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, CLMIB_R1023r, &count);
    255         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, CLMIB_T1023r, &count);
    256         break;
    257     case snmpEtherStatsPkts1024to1518Octets:
    258         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, CLMIB_R1518r, &count);
    259         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, CLMIB_T1518r, &count);
    260         break;
    261     case snmpBcmEtherStatsPkts1519to1522Octets: /* not in rfc1757 */
    262         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, CLMIB_RMGVr, &count);
    263         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, CLMIB_TMGVr, &count);
    264         break;
    265     case snmpBcmEtherStatsPkts1522to2047Octets: /* not in rfc1757 */
    266         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, CLMIB_R2047r, &count);
    267         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_sub_op, CLMIB_RMGVr, &count);
    268         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, CLMIB_T2047r, &count);
    269         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_sub_op, CLMIB_TMGVr, &count);
    270         break;
    271     case snmpBcmEtherStatsPkts2048to4095Octets: /* not in rfc1757 */
    272         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, CLMIB_R4095r, &count);
    273         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, CLMIB_T4095r, &count);
    274         break;
    275     case snmpBcmEtherStatsPkts4095to9216Octets: /* not in rfc1757 */
    276         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, CLMIB_R9216r, &count);
    277         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, CLMIB_T9216r, &count);
    278         break;
    279     case snmpBcmEtherStatsPkts9217to16383Octets: /* not in rfc1757 */
    280         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, CLMIB_R16383r, &count);
    281         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, CLMIB_T16383r, &count);
    282         break;
    283 
    284     case snmpBcmReceivedPkts64Octets:
    285         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, CLMIB_R64r, &count);
    286         break;
    287     case snmpBcmReceivedPkts65to127Octets:
    288         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, CLMIB_R127r, &count);
    289         break;
    290     case snmpBcmReceivedPkts128to255Octets:
    291         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, CLMIB_R255r, &count);
    292         break;
    293     case snmpBcmReceivedPkts256to511Octets:
    294         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, CLMIB_R511r, &count);
    295         break;
    296     case snmpBcmReceivedPkts512to1023Octets:
    297         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, CLMIB_R1023r, &count);
    298         break;
    299     case snmpBcmReceivedPkts1024to1518Octets:
    300         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, CLMIB_R1518r, &count);
    301         break;
    302     case snmpBcmReceivedPkts1519to2047Octets:
    303         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, CLMIB_R2047r, &count);
    304         break;
    305     case snmpBcmReceivedPkts2048to4095Octets:
    306         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, CLMIB_R4095r, &count);
    307         break;
    308     case snmpBcmReceivedPkts4095to9216Octets:
    309         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, CLMIB_R9216r, &count);
    310         break;
    311     case snmpBcmReceivedPkts9217to16383Octets:
    312         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, CLMIB_R16383r, &count);
    313         break;
    314 
    315     case snmpBcmTransmittedPkts64Octets:
    316         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, CLMIB_T64r, &count);
    317         break;
    318     case snmpBcmTransmittedPkts65to127Octets:
    319         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, CLMIB_T127r, &count);
    320         break;
    321     case snmpBcmTransmittedPkts128to255Octets:
    322         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, CLMIB_T255r, &count);
    323         break;
    324     case snmpBcmTransmittedPkts256to511Octets:
    325         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, CLMIB_T511r, &count);
    326         break;
    327     case snmpBcmTransmittedPkts512to1023Octets:
    328         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, CLMIB_T1023r, &count);
    329         break;
    330     case snmpBcmTransmittedPkts1024to1518Octets:
    331         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, CLMIB_T1518r, &count);
    332         break;
    333     case snmpBcmTransmittedPkts1519to2047Octets:
    334         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, CLMIB_T2047r, &count);
    335         break;
    336     case snmpBcmTransmittedPkts2048to4095Octets:
    337         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, CLMIB_T4095r, &count);
    338         break;
    339     case snmpBcmTransmittedPkts4095to9216Octets:
    340         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, CLMIB_T9216r, &count);
    341         break;
    342     case snmpBcmTransmittedPkts9217to16383Octets:
    343         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, CLMIB_T16383r, &count);
    344         break;
    345 
    346     case snmpEtherStatsTXNoErrors:
    347         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, CLMIB_TPOKr, &count);
    348         break;
    349     case snmpEtherStatsRXNoErrors:
    350         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, CLMIB_RPOKr, &count);
    351         break;
    352 
    353         /* *** RFC 2665 *** */
    354 
    355     case snmpDot3StatsAlignmentErrors:
    356         break;
    357     case snmpDot3StatsFCSErrors:
    358         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, CLMIB_RFCSr, &count);
    359         break;
    360     case snmpDot3StatsSingleCollisionFrames:
    361     case snmpDot3StatsMultipleCollisionFrames:
    362     case snmpDot3StatsSQETTestErrors:
    363     case snmpDot3StatsDeferredTransmissions:
    364     case snmpDot3StatsLateCollisions:
    365     case snmpDot3StatsExcessiveCollisions:
    366         break;
    367     case snmpDot3StatsInternalMacTransmitErrors:
    368         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, CLMIB_TUFLr, &count);
    369         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, CLMIB_TERRr, &count);
    370         break;
    371     case snmpDot3StatsCarrierSenseErrors:
    372         break;
    373     case snmpDot3StatsFrameTooLongs:
    374         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, CLMIB_RMTUEr, &count);
    375         break;
    376     case snmpDot3StatsInternalMacReceiveErrors:
    377         break;
    378     case snmpDot3StatsSymbolErrors:
    379         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, CLMIB_RERPKTr, &count);
    380         break;
    381     case snmpDot3ControlInUnknownOpcodes:
    382         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, CLMIB_RXUOr, &count);
    383         break;
    384     case snmpDot3InPauseFrames:
    385         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, CLMIB_RXPFr, &count);
    386         break;
    387     case snmpDot3OutPauseFrames:
    388         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, CLMIB_TXPFr, &count);
    389         break;
    390 
    391         /* *** RFC 2233 high capacity versions of RFC1213 objects *** */
    392 
    393     case snmpIfHCInOctets:
    394         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, CLMIB_RBYTr, &count);
    395         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, CLMIB_RRBYTr, &count);
    396         break;
    397     case snmpIfHCInUcastPkts:
    398         if (COUNT_OVR_ERRORS(unit)) {
    399             BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op,
    400                               CLMIB_RUCAr, &count);  /* unicast pkts rcvd */
    401         } else {
    402             BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op,
    403                               RUCr, &count);  /* unicast pkts rcvd */
    404         }
    405         break;
    406     case snmpIfHCInMulticastPkts:
    407         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, CLMIB_RMCAr, &count);
    408         break;
    409     case snmpIfHCInBroadcastPkts:
    410         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, CLMIB_RBCAr, &count);
    411         break;
    412     case snmpIfHCOutOctets:
    413         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, CLMIB_TBYTr, &count);
    414         break;
    415     case snmpIfHCOutUcastPkts:
    416         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, CLMIB_TUCAr, &count);
    417         break;
    418     case snmpIfHCOutMulticastPkts:
    419         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, CLMIB_TMCAr, &count);
    420         break;
    421     case snmpIfHCOutBroadcastPckts:
    422         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, CLMIB_TBCAr, &count);
    423         break;
    424 
    425         /* *** RFC 2465 *** */
    426 
    427     case snmpIpv6IfStatsInReceives:
    428         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, RIPC6r, &count);
    429         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, IMRP6r, &count);
    430         break;
    431     case snmpIpv6IfStatsInHdrErrors:
    432         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, RIPD6r, &count);
    433         break;
    434     case snmpIpv6IfStatsInAddrErrors:
    435         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, RIPHE6r, &count);
    436         break;
    437     case snmpIpv6IfStatsInDiscards:
    438         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, RIPHE6r, &count);
    439         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, RIPD6r, &count);
    440         break;
    441     case snmpIpv6IfStatsOutForwDatagrams:
    442         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, TDBGC0r, &count);
    443         break;
    444     case snmpIpv6IfStatsOutDiscards:
    445         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, TDBGC1r, &count);
    446         break;
    447     case snmpIpv6IfStatsInMcastPkts:
    448         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, IMRP6r, &count);
    449         break;
    450     case snmpIpv6IfStatsOutMcastPkts:
    451         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, TDBGC2r, &count);
    452         break;
    453 
    454         /* *** IEEE 802.1bb *** */
    455     case snmpIeee8021PfcRequests:
    456         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, CLMIB_TXPPr, &count);
    457         break;
    458     case snmpIeee8021PfcIndications:
    459         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, CLMIB_RXPPr, &count);
    460         break;
    461 
    462         /* *** RFC 1284 - unsupported in XGS *** */
    463     case snmpDot3StatsInRangeLengthError:
    464         break;
    465 
    466         /* *** RFC 4837 - unsupported in XGS *** */
    467     case snmpDot3OmpEmulationCRC8Errors:
    468     case snmpDot3MpcpRxGate:
    469     case snmpDot3MpcpRxRegister:
    470     case snmpDot3MpcpTxRegRequest:
    471     case snmpDot3MpcpTxRegAck:
    472     case snmpDot3MpcpTxReport:
    473     case snmpDot3EponFecCorrectedBlocks:
    474     case snmpDot3EponFecUncorrectableBlocks:
    475         break;
    476 
    477         /* IPMC counters (broadcom specific) */
    478 
    479     case snmpBcmIPMCBridgedPckts:
    480         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, RDBGC1r, &count);
    481         break;
    482     case snmpBcmIPMCRoutedPckts:
    483         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, IMRP4r, &count);
    484         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, IMRP6r, &count);
    485         break;
    486     case snmpBcmIPMCInDroppedPckts:
    487         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, RDBGC2r, &count);
    488         break;
    489     case snmpBcmIPMCOutDroppedPckts:
    490         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, TDBGC5r, &count);
    491         break;
    492 
    493         /* EA (broadcom specific) - unsupported in XGS */
    494     case snmpBcmPonInDroppedOctets:
    495     case snmpBcmPonOutDroppedOctets:
    496     case snmpBcmPonInDelayedOctets:
    497     case snmpBcmPonOutDelayedOctets:
    498     case snmpBcmPonInDelayedHundredUs:
    499     case snmpBcmPonOutDelayedHundredUs:
    500     case snmpBcmPonInFrameErrors:
    501     case snmpBcmPonInOamFrames:
    502     case snmpBcmPonOutOamFrames:
    503     case snmpBcmPonOutUnusedOctets:
    504         break;
    505 
    506     /* Vlan Tag Frame Counters */
    507     case snmpBcmRxVlanTagFrame:
    508         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, RVLNr, &count);
    509         break;
    510     case snmpBcmRxDoubleVlanTagFrame:
    511         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, RDVLNr, &count);
    512         break;
    513     case snmpBcmTxVlanTagFrame:
    514         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, TVLNr, &count);
    515         break;
    516     case snmpBcmTxDoubleVlanTagFrame:
    517         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, TDVLNr, &count);
    518         break;
    519 
    520     /* PFC Control Frame Counters */
    521     case snmpBcmRxPFCControlFrame:
    522         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, CLMIB_RXPPr, &count);
    523         break;
    524 
    525     case snmpBcmTxPFCControlFrame:
    526         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, CLMIB_TXPPr, &count);
    527         break;
    528 
    529     /* Receive PFC Frame Priority 0 XON to XOFF */
    530     case snmpBcmRxPFCFrameXonPriority0:
    531         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, CLMIB_RPFCOFF0r, &count);
    532         break;
    533 
    534     case snmpBcmRxPFCFrameXonPriority1:
    535         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, CLMIB_RPFCOFF1r, &count);
    536         break;
    537 
    538     case snmpBcmRxPFCFrameXonPriority2:
    539         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, CLMIB_RPFCOFF2r, &count);
    540         break;
    541 
    542     case snmpBcmRxPFCFrameXonPriority3:
    543         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, CLMIB_RPFCOFF3r, &count);
    544         break;
    545 
    546     case snmpBcmRxPFCFrameXonPriority4:
    547         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, CLMIB_RPFCOFF4r, &count);
    548         break;
    549 
    550     case snmpBcmRxPFCFrameXonPriority5:
    551         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, CLMIB_RPFCOFF5r, &count);
    552         break;
    553 
    554     case snmpBcmRxPFCFrameXonPriority6:
    555         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, CLMIB_RPFCOFF6r, &count);
    556         break;
    557 
    558     case snmpBcmRxPFCFrameXonPriority7:
    559         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, CLMIB_RPFCOFF7r, &count);
    560         break;
    561 
    562     /* Receive PFC Frame Priority */
    563     case snmpBcmRxPFCFramePriority0:
    564         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, CLMIB_RPFC0r, &count);
    565         break;
    566 
    567     case snmpBcmRxPFCFramePriority1:
    568         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, CLMIB_RPFC1r, &count);
    569         break;
    570 
    571     case snmpBcmRxPFCFramePriority2:
    572         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, CLMIB_RPFC2r, &count);
    573         break;
    574 
    575     case snmpBcmRxPFCFramePriority3:
    576         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, CLMIB_RPFC3r, &count);
    577         break;
    578 
    579     case snmpBcmRxPFCFramePriority4:
    580         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, CLMIB_RPFC4r, &count);
    581         break;
    582 
    583     case snmpBcmRxPFCFramePriority5:
    584         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, CLMIB_RPFC5r, &count);
    585         break;
    586 
    587     case snmpBcmRxPFCFramePriority6:
    588         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, CLMIB_RPFC6r, &count);
    589         break;
    590 
    591     case snmpBcmRxPFCFramePriority7:
    592         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, CLMIB_RPFC7r, &count);
    593         break;
    594 
    595     /* Transmit PFC Frame Priority */
    596     case snmpBcmTxPFCFramePriority0:
    597         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, CLMIB_TPFC0r, &count);
    598         break;
    599 
    600     case snmpBcmTxPFCFramePriority1:
    601         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, CLMIB_TPFC1r, &count);
    602         break;
    603 
    604     case snmpBcmTxPFCFramePriority2:
    605         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, CLMIB_TPFC2r, &count);
    606         break;
    607 
    608     case snmpBcmTxPFCFramePriority3:
    609         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, CLMIB_TPFC3r, &count);
    610         break;
    611 
    612     case snmpBcmTxPFCFramePriority4:
    613         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, CLMIB_TPFC4r, &count);
    614         break;
    615 
    616     case snmpBcmTxPFCFramePriority5:
    617         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, CLMIB_TPFC5r, &count);
    618         break;
    619 
    620     case snmpBcmTxPFCFramePriority6:
    621         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, CLMIB_TPFC6r, &count);
    622         break;
    623 
    624     case snmpBcmTxPFCFramePriority7:
    625         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, CLMIB_TPFC7r, &count);
    626         break;
    627 
    628     case snmpFcmPortClass3RxFrames:
    629     case snmpFcmPortClass3TxFrames:
    630     case snmpFcmPortClass3Discards:
    631     case snmpFcmPortClass2RxFrames:
    632     case snmpFcmPortClass2TxFrames:
    633     case snmpFcmPortClass2Discards:
    634     case snmpFcmPortInvalidCRCs:
    635     case snmpFcmPortDelimiterErrors:
    636         if (!soc_feature(unit, soc_feature_fcoe)) {
    637             return BCM_E_UNAVAIL;
    638         }
    639         break;
    640 
    641     case snmpBcmRxDot3LengthMismatches:
    642         if (SOC_REG_IS_VALID(unit, CLMIB_RFLRr)) {
    643             BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op,
    644                               CLMIB_RFLRr, &count); /* Good FCS, bad length */
    645         } else {
    646             return BCM_E_UNAVAIL;
    647         }
    648         break;
    649 
    650     default:
    651         if (type < snmpValCount) {
    652             return BCM_E_UNAVAIL;
    653         }
    654         LOG_VERBOSE(BSL_LS_SOC_COMMON,
    655                     (BSL_META_U(unit,
    656                                 "bcmi_stat_clmib_get_set: Statistic not supported: %d\n"), type));
    657         return BCM_E_PARAM;
    658     }
    659 
    660     if (stat_op == _BCM_STAT_GET) {
    661         *val = count;
    662     }
    663 
    664     return BCM_E_NONE;
    665 }