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_fe.c (24776B)


      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 
     15 #include <bcm_int/esw/stat.h>
     16 
     17 #include <bcm_int/esw_dispatch.h>
     18 
     19 #define FE_CNTR(_fe)	(_fe)
     20 
     21 /*
     22  * Function:
     23  *      _bcm_stat_fe_get
     24  * Description:
     25  *      Get the specified statistic for a FE port or GE port in 10/100 Mb
     26  *      mode on the StrataSwitch family of devices.
     27  * Parameters:
     28  *      unit - StrataSwitch PCI device unit number (driver internal).
     29  *      port - zero-based port number
     30  *      sync_mode - if 1 read hw counter else sw accumualated counter
     31  *      type - SNMP statistics type (see stat.h)
     32  *      val  - (OUT) 64 bit statistic counter value
     33  * Returns:
     34  *      BCM_E_NONE - Success.
     35  *      BCM_E_PARAM - Illegal parameter.
     36  *      BCM_E_INTERNAL - Chip access failure.
     37  */
     38 int
     39 _bcm_stat_fe_get_set(int unit, bcm_port_t port, int sync_mode, 
     40                      int stat_op, bcm_stat_val_t type, uint64 *val)
     41 {
     42     uint64      count, count1;
     43     int reg_op = (stat_op == _BCM_STAT_GET)? _BCM_STAT_REG_ADD: 
     44                                              _BCM_STAT_REG_CLEAR;
     45     int reg_sub_op = (stat_op == _BCM_STAT_GET)? _BCM_STAT_REG_SUB: 
     46                                              _BCM_STAT_REG_CLEAR;
     47 
     48     COMPILER_REFERENCE(&count);  /* Work around PPC compiler bug */
     49 
     50     COMPILER_64_ZERO(count);
     51 
     52     switch (type) {
     53         /* *** RFC 1213 *** */
     54 
     55     case snmpIfInOctets:
     56         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, 
     57                           FE_CNTR(RBYTr), &count);
     58         break;
     59     case snmpIfInUcastPkts:
     60         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, 
     61                           FE_CNTR(RPKTr), &count); /* all pkts rcvd */
     62         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_sub_op, 
     63                           FE_CNTR(RMCAr), &count); /* - multicast */
     64         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_sub_op, 
     65                           FE_CNTR(RBCAr), &count); /* - broadcast */
     66         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_sub_op, 
     67                           FE_CNTR(RALNr), &count); /* - bad FCS, dribble bit */
     68         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_sub_op, FE_CNTR(RFCSr), 
     69                           &count); /* - bad FCS, no dribble bit */
     70         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_sub_op, FE_CNTR(RFLRr), 
     71                           &count); /* - good FCS, bad length */
     72         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_sub_op, FE_CNTR(RJBRr), 
     73                           &count); /* - oversize, bad FCS */
     74         if (COUNT_OVR_ERRORS(unit)) {
     75             BCM_STAT_REG_OPER(unit, port, sync_mode, reg_sub_op, FE_CNTR(ROVRr),
     76                               &count); /* - oversize, good FCS */
     77         }
     78         break;
     79     case snmpIfInNUcastPkts:  /* Multicast frames plus broadcast frames */
     80         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, 
     81                           FE_CNTR(RMCAr), &count);
     82         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, 
     83                           FE_CNTR(RBCAr), &count);
     84         break;
     85     case snmpIfInBroadcastPkts:  /* broadcast frames */
     86         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, 
     87                           FE_CNTR(RBCAr), &count);
     88         break;
     89     case snmpIfInMulticastPkts:  /* Multicast frames */
     90         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, 
     91                           FE_CNTR(RMCAr), &count);
     92         break;
     93     case snmpIfInDiscards:  /* Dropped packets including aborted */
     94         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, 
     95                           FE_CNTR(RDISCr), &count);
     96         break;
     97     case snmpIfInErrors:        /* received packts containing errors */
     98         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, 
     99                           FE_CNTR(RUNDr), &count);  /* undersize, ok FCS */
    100         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, 
    101                           FE_CNTR(RFRGr), &count);  /* ..., bad FCS */
    102         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, 
    103                           FE_CNTR(RFCSr), &count);  /* FCS errors */
    104         if (COUNT_OVR_ERRORS(unit)) {
    105             BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, 
    106                               FE_CNTR(ROVRr), &count);  /* oversize, ok FCS */
    107         }
    108         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, 
    109                           FE_CNTR(RJBRr), &count);  /* ..., bad FCS */
    110         break;
    111     case snmpIfInUnknownProtos:
    112         /* always 0 */
    113         break;
    114     case snmpIfOutOctets:        /* TX bytes */
    115         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, 
    116                           FE_CNTR(TBYTr), &count);
    117         break;
    118     case snmpIfOutUcastPkts:        /* ALL - mcast - bcast */
    119         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, 
    120                           FE_CNTR(TPKTr), &count);
    121         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_sub_op, 
    122                           FE_CNTR(TMCAr), &count);
    123         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_sub_op, 
    124                           FE_CNTR(TBCAr), &count);
    125         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_sub_op, 
    126                           FE_CNTR(TFCSr), &count); /* bad FCS */
    127         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_sub_op, 
    128                           FE_CNTR(TJBRr), &count); /* oversize, bad FCS */
    129         if (COUNT_OVR_ERRORS(unit)) {
    130             BCM_STAT_REG_OPER(unit, port, sync_mode, reg_sub_op, 
    131                               FE_CNTR(TOVRr), &count);  /* oversize, good FCS */
    132         }
    133         break;
    134     case snmpIfOutNUcastPkts:  /* broadcast frames plus multicast frames */
    135         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, 
    136                           FE_CNTR(TMCAr), &count);
    137         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, 
    138                           FE_CNTR(TBCAr), &count);
    139         break;
    140     case snmpIfOutBroadcastPkts:        /* broadcast frames */
    141         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, 
    142                           FE_CNTR(TBCAr), &count);
    143         break;
    144     case snmpIfOutMulticastPkts:        /* multicast frames */
    145         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, 
    146                           FE_CNTR(TMCAr), &count);
    147         break;
    148     case snmpIfOutDiscards:
    149         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, 
    150                           FE_CNTR(TEDFr), &count);  /* multiple deferral */
    151         _bcm_stat_counter_extra_get(unit, EGRDROPPKTCOUNTr, port, &count1);
    152         COMPILER_64_ADD_64(count, count1);
    153         /* other causes of discards? */
    154         break;
    155     case snmpIfOutErrors:
    156         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, 
    157                           FE_CNTR(TXCLr), &count);  /* excessive coll */
    158         break;
    159     case snmpIfOutQLen: {
    160         uint32  qcount;
    161         if (bcm_esw_port_queued_count_get(unit, port, &qcount) >= 0) {
    162             COMPILER_64_ADD_32(count, qcount);
    163         }
    164     }
    165     break;
    166     case snmpIpInReceives:
    167         /* XGS2 specific */
    168         break;
    169     case snmpIpInHdrErrors:
    170         break;
    171     case snmpIpForwDatagrams:
    172         /* XGS2 specific */
    173         break;
    174     case snmpIpInDiscards:
    175         /* XGS2 specific */
    176         break;
    177 
    178         /* *** RFC 1493 *** */
    179 
    180     case snmpDot1dBasePortDelayExceededDiscards:
    181         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, 
    182                           FE_CNTR(TEDFr), &count);  /* multiple deferral */
    183         break;
    184     case snmpDot1dBasePortMtuExceededDiscards:
    185         if (COUNT_OVR_ERRORS(unit)) {
    186             BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, 
    187                               FE_CNTR(ROVRr), &count);
    188             BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, 
    189                               FE_CNTR(TOVRr), &count);
    190         }
    191         break;
    192     case snmpDot1dTpPortInFrames:
    193         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, 
    194                           FE_CNTR(RPKTr), &count);
    195         break;
    196     case snmpDot1dTpPortOutFrames:
    197         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, 
    198                           FE_CNTR(TPKTr), &count);
    199         break;
    200     case snmpDot1dPortInDiscards:
    201         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, 
    202                           FE_CNTR(RDISCr), &count);
    203         break;
    204 
    205         /* *** RFC 1757 *** */
    206 
    207     case snmpEtherStatsDropEvents:
    208         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, 
    209                           FE_CNTR(RDISCr), &count);
    210         break;
    211     case snmpEtherStatsOctets:
    212         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, 
    213                           FE_CNTR(RBYTr), &count);
    214         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, 
    215                           FE_CNTR(TBYTr), &count);
    216         break;
    217     case snmpEtherStatsPkts:
    218         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, 
    219                           FE_CNTR(RPKTr), &count);
    220         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, 
    221                           FE_CNTR(TPKTr), &count);
    222         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op,
    223                           FE_CNTR(RUNDr), &count); /* Runt packets */
    224         break;
    225     case snmpEtherStatsBroadcastPkts:
    226         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, 
    227                           FE_CNTR(RBCAr), &count);
    228         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, 
    229                           FE_CNTR(TBCAr), &count);
    230         break;
    231     case snmpEtherStatsMulticastPkts:
    232         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, 
    233                           FE_CNTR(RMCAr), &count);
    234         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, 
    235                           FE_CNTR(TMCAr), &count);
    236         break;
    237     case snmpEtherStatsCRCAlignErrors:  /* CRC errors + alignment errors */
    238         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, 
    239                           FE_CNTR(RFCSr), &count);
    240         break;
    241     case snmpEtherStatsUndersizePkts:  /* Undersize frames */
    242         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, 
    243                           FE_CNTR(RUNDr), &count);
    244         break;
    245     case snmpEtherStatsOversizePkts:
    246         if (soc_feature(unit, soc_feature_stat_jumbo_adj)) {
    247             BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, 
    248                               FE_CNTR(ROVRr), &count);
    249             BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, 
    250                               FE_CNTR(TOVRr), &count);
    251         } else {
    252             BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, 
    253                               FE_CNTR(RJBRr), &count);
    254         }
    255         break;
    256     case snmpEtherRxOversizePkts:
    257         if (soc_feature(unit, soc_feature_stat_jumbo_adj)) {
    258                 BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, 
    259                                   FE_CNTR(ROVRr), &count);
    260         }
    261         break;
    262     case snmpEtherTxOversizePkts:
    263         if (soc_feature(unit, soc_feature_stat_jumbo_adj)) {
    264                 BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, 
    265                                   FE_CNTR(TOVRr), &count);
    266             }
    267         break;
    268      case snmpEtherStatsFragments:
    269         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op,
    270                           FE_CNTR(RFRGr), &count);
    271         if (SOC_REG_IS_VALID(unit,TFRGr)) {
    272            BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, 
    273                              FE_CNTR(TFRGr), &count);
    274         }
    275         break;
    276     case snmpEtherStatsJabbers:
    277         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op,
    278                           FE_CNTR(RJBRr), &count);
    279         break;
    280     case snmpEtherStatsCollisions:
    281         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, 
    282                           FE_CNTR(TNCLr), &count);
    283         break;
    284     case snmpEtherStatsPkts64Octets:
    285     case snmpEtherStatsPkts65to127Octets:
    286     case snmpEtherStatsPkts128to255Octets:
    287     case snmpEtherStatsPkts256to511Octets:
    288     case snmpEtherStatsPkts512to1023Octets:
    289         /* XGS2 specific */
    290         break;
    291     case snmpEtherStatsPkts1024to1518Octets:
    292         break;
    293 
    294         /* *** not actually in rfc1757 *** */
    295 
    296     case snmpBcmEtherStatsPkts1519to1522Octets:
    297     case snmpBcmEtherStatsPkts1522to2047Octets:
    298     case snmpBcmEtherStatsPkts2048to4095Octets:
    299     case snmpBcmEtherStatsPkts4095to9216Octets:
    300     case snmpBcmEtherStatsPkts9217to16383Octets:
    301     case snmpBcmReceivedPkts64Octets:
    302     case snmpBcmReceivedPkts65to127Octets:
    303     case snmpBcmReceivedPkts128to255Octets:
    304     case snmpBcmReceivedPkts256to511Octets:
    305     case snmpBcmReceivedPkts512to1023Octets:
    306     case snmpBcmReceivedPkts1024to1518Octets:
    307     case snmpBcmReceivedPkts1519to2047Octets:
    308     case snmpBcmReceivedPkts2048to4095Octets:
    309     case snmpBcmReceivedPkts4095to9216Octets:
    310     case snmpBcmReceivedPkts9217to16383Octets:
    311     case snmpBcmTransmittedPkts64Octets:
    312     case snmpBcmTransmittedPkts65to127Octets:
    313     case snmpBcmTransmittedPkts128to255Octets:
    314     case snmpBcmTransmittedPkts256to511Octets:
    315     case snmpBcmTransmittedPkts512to1023Octets:
    316     case snmpBcmTransmittedPkts1024to1518Octets:
    317     case snmpBcmTransmittedPkts1519to2047Octets:
    318     case snmpBcmTransmittedPkts2048to4095Octets:
    319     case snmpBcmTransmittedPkts4095to9216Octets:
    320     case snmpBcmTransmittedPkts9217to16383Octets:
    321         break;
    322 
    323     case snmpEtherStatsTXNoErrors:
    324         /*  TPKT - (TNCL + TOVR + TFRG + TUND) */
    325         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, 
    326                           FE_CNTR(TPKTr), &count);  /* All Packets */
    327         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_sub_op, 
    328                           FE_CNTR(TNCLr), &count);  /* collision */
    329         if (COUNT_OVR_ERRORS(unit)) {
    330             BCM_STAT_REG_OPER(unit, port, sync_mode, reg_sub_op, 
    331                               FE_CNTR(TOVRr), &count);  /* Oversize */
    332         }
    333         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_sub_op, 
    334                           FE_CNTR(TFRGr), &count);  /* Fragments */
    335         break;
    336     case snmpEtherStatsRXNoErrors:
    337         /* RPKT - ( RFCS + RXUO + ROVR + RFLR) */
    338         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, 
    339                           FE_CNTR(RPKTr), &count);
    340         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_sub_op, 
    341                           FE_CNTR(RFCSr), &count);
    342         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_sub_op, 
    343                           FE_CNTR(RXUOr), &count);
    344         if (COUNT_OVR_ERRORS(unit)) {
    345             BCM_STAT_REG_OPER(unit, port, sync_mode, reg_sub_op, 
    346                               FE_CNTR(ROVRr), &count);
    347         }
    348         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_sub_op, 
    349                           FE_CNTR(RFLRr), &count);
    350         break;
    351 
    352         /* *** RFC 2665 *** */
    353 
    354     case snmpDot3StatsAlignmentErrors:
    355         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, 
    356                           FE_CNTR(RALNr), &count);
    357         break;
    358     case snmpDot3StatsFCSErrors:
    359         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, 
    360                           FE_CNTR(RFCSr), &count);
    361         break;
    362     case snmpDot3StatsSingleCollisionFrames:
    363         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, 
    364                           FE_CNTR(TSCLr), &count);
    365         break;
    366     case snmpDot3StatsMultipleCollisionFrames:
    367         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, 
    368                           FE_CNTR(TMCLr), &count);
    369         break;
    370     case snmpDot3StatsSQETTestErrors:
    371         /* always 0 */
    372         break;
    373     case snmpDot3StatsDeferredTransmissions:
    374         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, 
    375                           FE_CNTR(TDFRr), &count);
    376         break;
    377     case snmpDot3StatsLateCollisions:
    378         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, 
    379                           FE_CNTR(TLCLr), &count);
    380         break;
    381     case snmpDot3StatsExcessiveCollisions:
    382         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, 
    383                           FE_CNTR(TXCLr), &count);
    384         break;
    385     case snmpDot3StatsInternalMacTransmitErrors:
    386         /* always 0 */
    387         break;
    388     case snmpDot3StatsCarrierSenseErrors:
    389         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op,
    390                           FE_CNTR(RFCRr), &count);
    391         break;
    392     case snmpDot3StatsFrameTooLongs:
    393         if (soc_feature(unit, soc_feature_stat_jumbo_adj)) {
    394             BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, 
    395                               FE_CNTR(ROVRr), &count);
    396         } else {
    397             BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, 
    398                               FE_CNTR(RJBRr), &count);
    399         }
    400         break;
    401     case snmpDot3StatsInternalMacReceiveErrors:
    402         /* always 0 */
    403         break;
    404     case snmpDot3StatsSymbolErrors:
    405         /* XGS2 specific */
    406         break;
    407     case snmpDot3ControlInUnknownOpcodes:
    408         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, 
    409                           FE_CNTR(RXUOr), &count);
    410         break;
    411     case snmpDot3InPauseFrames:
    412         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, 
    413                           FE_CNTR(RXPFr), &count);
    414         break;
    415     case snmpDot3OutPauseFrames:
    416         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, 
    417                           FE_CNTR(TXPFr), &count);
    418         break;
    419 
    420         /* *** RFC 2233 high capacity versions of RFC1213 objects *** */
    421 
    422     case snmpIfHCInOctets:
    423         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, 
    424                           FE_CNTR(RBYTr), &count);
    425         break;
    426     case snmpIfHCInUcastPkts:
    427         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, 
    428                           FE_CNTR(RPKTr), &count); /* all pkts rcvd */
    429         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_sub_op, 
    430                           FE_CNTR(RMCAr), &count); /* - multicast */
    431         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_sub_op, 
    432                           FE_CNTR(RBCAr), &count); /* - broadcast */
    433         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_sub_op, 
    434                           FE_CNTR(RALNr), &count); /* - bad FCS, dribble bit  */
    435         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_sub_op, FE_CNTR(RFCSr), 
    436                           &count); /* - bad FCS, no dribble bit */
    437         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_sub_op, 
    438                           FE_CNTR(RFLRr), &count); /* - good FCS, bad length */
    439         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_sub_op, 
    440                           FE_CNTR(RJBRr), &count); /* - oversize, bad FCS */
    441         if (COUNT_OVR_ERRORS(unit)) {
    442             BCM_STAT_REG_OPER(unit, port, sync_mode, reg_sub_op, FE_CNTR(ROVRr),
    443                               &count); /* - oversize, good FCS */
    444         }
    445         break;
    446     case snmpIfHCInMulticastPkts:
    447         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, 
    448                           FE_CNTR(RMCAr), &count);
    449         break;
    450     case snmpIfHCInBroadcastPkts:
    451         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, 
    452                           FE_CNTR(RBCAr), &count);
    453         break;
    454     case snmpIfHCOutOctets:
    455         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, 
    456                           FE_CNTR(TBYTr), &count);
    457         break;
    458     case snmpIfHCOutUcastPkts:
    459         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, 
    460                           FE_CNTR(TPKTr), &count);
    461         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_sub_op, 
    462                           FE_CNTR(TMCAr), &count);
    463         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_sub_op, 
    464                           FE_CNTR(TBCAr), &count);
    465         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_sub_op, 
    466                           FE_CNTR(TFCSr), &count); /* bad FCS */
    467         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_sub_op, 
    468                           FE_CNTR(TJBRr), &count); /* oversize, bad FCS */
    469         if (COUNT_OVR_ERRORS(unit)) {
    470             BCM_STAT_REG_OPER(unit, port, sync_mode, reg_sub_op, 
    471                               FE_CNTR(TOVRr), &count);  /* oversize, good FCS */
    472         }
    473         break;
    474     case snmpIfHCOutMulticastPkts:
    475         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, 
    476                           FE_CNTR(TMCAr), &count);
    477         break;
    478     case snmpIfHCOutBroadcastPckts:
    479         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, 
    480                           FE_CNTR(TBCAr), &count);
    481         break;
    482 
    483         /* *** RFC 2465 *** */
    484 
    485     case snmpIpv6IfStatsInReceives:
    486     case snmpIpv6IfStatsInHdrErrors:
    487     case snmpIpv6IfStatsInAddrErrors:
    488     case snmpIpv6IfStatsInDiscards:
    489     case snmpIpv6IfStatsOutForwDatagrams:
    490     case snmpIpv6IfStatsOutDiscards:
    491     case snmpIpv6IfStatsInMcastPkts:
    492     case snmpIpv6IfStatsOutMcastPkts:
    493         break;
    494 
    495         /* *** RFC 1284 - unsupported in XGS *** */
    496     case snmpDot3StatsInRangeLengthError:
    497         break;
    498 
    499         /* *** RFC 4837 - unsupported in XGS *** */
    500     case snmpDot3OmpEmulationCRC8Errors:
    501     case snmpDot3MpcpRxGate:
    502     case snmpDot3MpcpRxRegister:
    503     case snmpDot3MpcpTxRegRequest:
    504     case snmpDot3MpcpTxRegAck:
    505     case snmpDot3MpcpTxReport:
    506     case snmpDot3EponFecCorrectedBlocks:
    507     case snmpDot3EponFecUncorrectableBlocks:
    508         break;
    509 
    510         /* IPMC counters (broadcom XGS2 specific) */
    511     case snmpBcmIPMCBridgedPckts:
    512     case snmpBcmIPMCRoutedPckts:
    513     case snmpBcmIPMCInDroppedPckts:
    514     case snmpBcmIPMCOutDroppedPckts:
    515         break;
    516 
    517         /* EA (broadcom specific) - unsupported in XGS */
    518     case snmpBcmPonInDroppedOctets:
    519     case snmpBcmPonOutDroppedOctets:
    520     case snmpBcmPonInDelayedOctets:
    521     case snmpBcmPonOutDelayedOctets:
    522     case snmpBcmPonInDelayedHundredUs:
    523     case snmpBcmPonOutDelayedHundredUs:
    524     case snmpBcmPonInFrameErrors:
    525     case snmpBcmPonInOamFrames:
    526     case snmpBcmPonOutOamFrames:
    527     case snmpBcmPonOutUnusedOctets:
    528         break;
    529 
    530     case snmpFcmPortClass3RxFrames:
    531         if (soc_feature(unit, soc_feature_fcoe)) {
    532             BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, RDBGC3r, &count);
    533         } else {
    534             return BCM_E_UNAVAIL;
    535         }
    536         break;
    537 
    538     case snmpFcmPortClass3TxFrames:
    539         if (soc_feature(unit, soc_feature_fcoe)) {
    540             BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, TDBGC6r, &count);
    541         } else {
    542             return BCM_E_UNAVAIL;
    543         }
    544         break;
    545 
    546     case snmpFcmPortClass3Discards:
    547         if (soc_feature(unit, soc_feature_fcoe)) {
    548             BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, RDBGC4r, &count);
    549         } else {
    550             return BCM_E_UNAVAIL;
    551         }
    552         break;
    553 
    554     case snmpFcmPortClass2RxFrames:
    555         if (soc_feature(unit, soc_feature_fcoe)) {
    556             BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, RDBGC5r, &count);
    557         } else {
    558             return BCM_E_UNAVAIL;
    559         }
    560         break;
    561 
    562     case snmpFcmPortClass2TxFrames:
    563         if (soc_feature(unit, soc_feature_fcoe)) {
    564             BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, TDBGC7r, &count);
    565         } else {
    566             return BCM_E_UNAVAIL;
    567         }
    568         break;
    569 
    570     case snmpFcmPortClass2Discards:
    571         if (soc_feature(unit, soc_feature_fcoe)) {
    572             BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, RDBGC6r, &count);
    573         } else {
    574             return BCM_E_UNAVAIL;
    575         }
    576         break;
    577 
    578     case snmpFcmPortInvalidCRCs:
    579         if (soc_feature(unit, soc_feature_fcoe)) {
    580             BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, 
    581                               EGR_FCOE_INVALID_CRC_FRAMESr, &count);
    582         } else {
    583             return BCM_E_UNAVAIL;
    584         }
    585         break;
    586 
    587     case snmpFcmPortDelimiterErrors:
    588         if (soc_feature(unit, soc_feature_fcoe)) {
    589             BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, 
    590                               EGR_FCOE_DELIMITER_ERROR_FRAMESr, &count);
    591         } else {
    592             return BCM_E_UNAVAIL;
    593         }
    594         break;
    595 
    596     case snmpBcmTxE2ECCControlFrames:
    597         if (SOC_REG_IS_VALID(unit, XTHOLr)) {
    598             BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, XTHOLr,
    599                               &count);
    600         }
    601         break;
    602 
    603     case snmpBcmRxDot3LengthMismatches:
    604         if (SOC_REG_IS_VALID(unit, RFLRr)) {
    605             BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, FE_CNTR(RFLRr),
    606                               &count); /* Good FCS, bad length */
    607         } else {
    608             return BCM_E_UNAVAIL;
    609         }
    610         break;
    611 
    612     default:
    613         if (type < snmpValCount) {
    614             return BCM_E_UNAVAIL;
    615         }
    616         LOG_VERBOSE(BSL_LS_SOC_COMMON,
    617                     (BSL_META_U(unit,
    618                                 "bcm_stat_get: Statistic not supported: %d\n"), type));
    619         return BCM_E_PARAM;
    620     }
    621 
    622     if (stat_op == _BCM_STAT_GET) {
    623         *val = count;
    624     }
    625 
    626     return BCM_E_NONE;
    627 }