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_hg.c (29118B)


      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 /*
     20  * Function:
     21  *      _bcm_stat_hg_get
     22  * Description:
     23  *      Get the specified statistic for a HG port on the StrataSwitch family
     24  *      of devices.
     25  * Parameters:
     26  *      unit - StrataSwitch PCI device unit number (driver internal).
     27  *      port - zero-based port number
     28  *      sync_mode - if 1 read hw counter else sw accumualated counter
     29  *      type - SNMP statistics type (see stat.h)
     30  *      val  - (OUT) 64 bit statistic counter value
     31  * Returns:
     32  *      BCM_E_NONE - Success.
     33  *      BCM_E_PARAM - Illegal parameter.
     34  *      BCM_E_INTERNAL - Chip access failure.
     35  */
     36 int
     37 _bcm_stat_hg_get_set(int unit, bcm_port_t port,
     38                      int sync_mode, int stat_op,
     39                      bcm_stat_val_t type, uint64 *val)
     40 {
     41     uint64 count, count1;
     42     int reg_op = (stat_op == _BCM_STAT_GET)? _BCM_STAT_REG_ADD: 
     43                                              _BCM_STAT_REG_CLEAR;
     44     int reg_sub_op = (stat_op == _BCM_STAT_GET)? _BCM_STAT_REG_SUB: 
     45                                              _BCM_STAT_REG_CLEAR;
     46 
     47     COMPILER_REFERENCE(&count);  /* Work around PPC compiler bug */
     48     COMPILER_64_ZERO(count);
     49 
     50     switch (type) {
     51     case snmpIfInOctets:
     52         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, IRBYTr, &count);
     53         break;
     54     case snmpIfInUcastPkts:
     55        if (soc_feature(unit, soc_feature_hw_stats_calc)) {
     56             if (SOC_REG_IS_VALID(unit, IRUCAr)) {
     57                 BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, 
     58                                   IRUCAr, &count);
     59             } else if (SOC_REG_IS_VALID(unit, IRUCr)) {
     60                 BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, IRUCr, &count);
     61             } else {
     62                 BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, RUCr, &count);  /* unicast pkts rcvd */
     63             }
     64         } else {
     65             BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, IRPKTr, &count);
     66             BCM_STAT_REG_OPER(unit, port, sync_mode, reg_sub_op, 
     67                               IRMCAr, &count); /* - multicast */
     68             BCM_STAT_REG_OPER(unit, port, sync_mode, reg_sub_op, 
     69                               IRBCAr, &count); /* - broadcast */
     70             BCM_STAT_REG_OPER(unit, port, sync_mode, reg_sub_op, 
     71                               IRFCSr, &count); /* - bad FCS */
     72             BCM_STAT_REG_OPER(unit, port, sync_mode, reg_sub_op, 
     73                               IRXCFr, &count); /* - good FCS, all MAC ctrl */
     74             BCM_STAT_REG_OPER(unit, port, sync_mode, reg_sub_op, 
     75                               IRJBRr, &count); /* - oversize, bad FCS */
     76             if (COUNT_OVR_ERRORS(unit)) {
     77                 BCM_STAT_REG_OPER(unit, port, sync_mode, reg_sub_op, 
     78                                   IROVRr, &count); /* - oversize, good FCS */
     79             }
     80         }
     81             break;
     82     case snmpIfInNUcastPkts:   /* Multicast frames plus broadcast frames */
     83         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, 
     84                           IRMCAr, &count); /* + multicast */
     85         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, 
     86                           IRBCAr, &count); /* + broadcast */
     87         break;
     88     case snmpIfInBroadcastPkts: /* broadcast frames */
     89         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, 
     90                           IRBCAr, &count); /* + broadcast */
     91         break;
     92     case snmpIfInMulticastPkts: /* Multicast frames */
     93         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, 
     94                           IRMCAr, &count); /* + multicast */
     95         break;
     96     case snmpIfInDiscards: /* Dropped packets including aborted */
     97         if (soc_feature(unit, soc_feature_stat_xgs3)) {
     98             BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, 
     99                               RDBGC0r, &count); /* Ingress drop conditions */
    100             BCM_IF_ERROR_RETURN
    101                 (_bcm_stat_counter_non_dma_extra_get(unit,
    102                                    SOC_COUNTER_NON_DMA_PORT_DROP_PKT_ING,
    103                                                      port, &count1));
    104             COMPILER_64_ADD_64(count, count1);
    105         } 
    106 #ifdef BCM_HERCULES_SUPPORT
    107         else {
    108             BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, IRDISCr, &count);
    109         }
    110 #endif
    111         break;
    112     case snmpIfInErrors: /* RX Errors or Receive packets - non-error frames */
    113         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, IRFCSr, &count);
    114         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, IRJBRr, &count);
    115         if (COUNT_OVR_ERRORS(unit)) {
    116             BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, IROVRr, &count);
    117         }
    118         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, IRUNDr, &count);
    119         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, IRFRGr, &count);
    120         break;
    121     case snmpIfInUnknownProtos: /* Not supported */
    122         break;
    123     case snmpIfOutOctets: /* TX bytes */
    124         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, ITBYTr, &count);
    125         break;
    126     case snmpIfOutUcastPkts: /* ALL - mcast - bcast */
    127         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, ITPKTr, &count);
    128         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_sub_op, 
    129                           ITMCAr, &count); /* - multicast */
    130         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_sub_op, 
    131                           ITBCAr, &count); /* - broadcast */
    132         break;
    133     case snmpIfOutNUcastPkts: /* broadcast frames plus multicast frames */
    134         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, 
    135                           ITMCAr, &count); /* + multicast */
    136         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, 
    137                           ITBCAr, &count); /* + broadcast */
    138         break;
    139     case snmpIfOutBroadcastPkts: /* broadcast frames */
    140         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, 
    141                           ITBCAr, &count); /* + broadcast */
    142         break;
    143     case snmpIfOutMulticastPkts: /* multicast frames */
    144         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, 
    145                           ITMCAr, &count); /* + multicast */
    146         break;
    147     case snmpIfOutDiscards: /* Aged packet counter */
    148         if (SOC_REG_IS_VALID(unit, HOLDr)) {
    149             BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, 
    150                               HOLDr, &count); /* L2 MTU drops */
    151         } else if (SOC_REG_IS_VALID(unit, HOL_DROPr)) {
    152             BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, 
    153                               HOL_DROPr, &count);
    154         }
    155 #ifdef BCM_HERCULES_SUPPORT
    156         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, ITAGEr, &count);
    157 #endif
    158         BCM_IF_ERROR_RETURN
    159             (_bcm_stat_counter_extra_get(unit, EGRDROPPKTCOUNTr,
    160                                          port, &count1));
    161         COMPILER_64_ADD_64(count, count1);
    162         BCM_IF_ERROR_RETURN
    163             (bcm_esw_cosq_stat_get(unit, port, BCM_COS_INVALID, 
    164                                bcmCosqStatDroppedPackets, &count1));
    165         COMPILER_64_ADD_64(count, count1);
    166         break;
    167     case snmpIfOutErrors:   /* Error packets could not be xmitted */
    168         /* XGS2 specific */
    169         break;
    170     case snmpIfOutQLen: {
    171         uint32  qcount;
    172         if (bcm_esw_port_queued_count_get(unit, port, &qcount) >= 0) {
    173             COMPILER_64_ADD_32(count, qcount);
    174         }
    175     }
    176     break;
    177     case snmpIpInReceives:
    178         break;
    179     case snmpIpInHdrErrors:
    180         break;
    181     case snmpIpForwDatagrams:
    182         break;
    183     case snmpIpInDiscards:
    184         break;
    185 
    186         /* *** RFC 1493 *** */
    187 
    188     case snmpDot1dBasePortDelayExceededDiscards:
    189         break;
    190     case snmpDot1dBasePortMtuExceededDiscards:
    191         if (COUNT_OVR_ERRORS(unit)) {
    192             BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, IROVRr, &count);     /* oversize pkts */
    193             BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, ITOVRr, &count);     /* oversize pkts */
    194         }
    195         break;
    196     case snmpDot1dTpPortInFrames:
    197         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, IRPKTr, &count);
    198         break;
    199     case snmpDot1dTpPortOutFrames:
    200         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, ITPKTr, &count);
    201         break;
    202     case snmpDot1dPortInDiscards:
    203         if (soc_feature(unit, soc_feature_stat_xgs3)) {
    204             BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, RDISCr, &count);
    205         } 
    206 #ifdef BCM_HERCULES_SUPPORT
    207         else {
    208             BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, IRDISCr, &count);
    209         }
    210 #endif
    211         break;
    212 
    213         /* *** RFC 1757 *** */
    214 
    215     case snmpEtherStatsDropEvents:
    216         if (soc_feature(unit, soc_feature_stat_xgs3)) {
    217             BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, RDISCr, &count);
    218         } 
    219 #ifdef BCM_HERCULES_SUPPORT
    220         else {
    221             BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, IRDISCr, &count);
    222             BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, ITAGEr, &count);
    223         }
    224 #endif
    225         break;
    226     case snmpEtherStatsOctets:
    227         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, IRBYTr, &count);
    228         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, ITBYTr, &count);
    229         break;
    230     case snmpEtherStatsPkts:
    231         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, IRPKTr, &count);
    232         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, ITPKTr, &count);
    233         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, 
    234                           IRUNDr, &count); /* Runts */
    235         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, 
    236                           IRFRGr, &count); /* Fragments */
    237         break;
    238     case snmpEtherStatsBroadcastPkts:  /* Broadcast packets (RX/TX) */
    239         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, 
    240                           IRBCAr, &count); /* + rx broadcast  */
    241         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, 
    242                           ITBCAr, &count); /* + tx broadcast */
    243         break;
    244     case snmpEtherStatsMulticastPkts:  /* Multicast packets (TX+RX) */
    245         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, 
    246                           IRMCAr, &count); /* + rx multicast */
    247         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, 
    248                           ITMCAr, &count); /* + tx multicast */
    249         break;
    250     case snmpEtherStatsCRCAlignErrors:
    251         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, IRFCSr, &count);
    252         break;
    253     case snmpEtherStatsUndersizePkts:  /* Undersize frames */
    254         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, IRUNDr, &count);
    255         break;
    256     case snmpEtherStatsOversizePkts:
    257         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, IROVRr, &count);
    258         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, ITOVRr, &count);
    259         break;
    260     case snmpEtherRxOversizePkts:
    261         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, IROVRr, &count);
    262         break;
    263     case snmpEtherTxOversizePkts:
    264         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, ITOVRr, &count);
    265         break;
    266     case snmpEtherStatsFragments:
    267         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, IRFRGr, &count);
    268         break;
    269     case snmpEtherStatsJabbers:
    270         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, IRJBRr, &count);
    271         break;
    272     case snmpEtherStatsCollisions:
    273         /* always 0 */
    274         break;
    275     case snmpEtherStatsPkts64Octets:
    276         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, IR64r, &count);
    277         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, IT64r, &count);
    278         break;
    279     case snmpEtherStatsPkts65to127Octets:
    280         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, IR127r, &count);
    281         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, IT127r, &count);
    282         break;
    283     case snmpEtherStatsPkts128to255Octets:
    284         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, IR255r, &count);
    285         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, IT255r, &count);
    286         break;
    287     case snmpEtherStatsPkts256to511Octets:
    288         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, IR511r, &count);
    289         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, IT511r, &count);
    290         break;
    291     case snmpEtherStatsPkts512to1023Octets:
    292         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, IR1023r, &count);
    293         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, IT1023r, &count);
    294         break;
    295     case snmpEtherStatsPkts1024to1518Octets:
    296         if (soc_feature(unit, soc_feature_stat_xgs3)) {
    297             BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, IR1518r, &count);
    298             BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, IT1518r, &count);
    299         } else {
    300             BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, IR2047r, &count);
    301             BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, IT2047r, &count);
    302         }
    303         break;
    304 
    305         /* *** not actually in rfc1757 *** */
    306 
    307     case snmpBcmEtherStatsPkts1519to1522Octets:
    308         break;
    309     case snmpBcmEtherStatsPkts1522to2047Octets:
    310         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, IR2047r, &count);
    311         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, IT2047r, &count);
    312         break;
    313     case snmpBcmEtherStatsPkts2048to4095Octets:
    314         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, IR4095r, &count);
    315         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, IT4095r, &count);
    316         break;
    317     case snmpBcmEtherStatsPkts4095to9216Octets:
    318         if (soc_feature(unit, soc_feature_stat_xgs3)) {
    319             BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, IR9216r, &count);
    320             BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, IT9216r, &count);
    321         } else {
    322 #ifdef BCM_HERCULES_SUPPORT
    323             BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, IR8191r, &count);
    324             BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, IT8191r, &count);
    325 #endif
    326             BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, IR16383r, &count);
    327             BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, IT16383r, &count);
    328         }
    329         break;
    330     case snmpBcmEtherStatsPkts9217to16383Octets:
    331         if (soc_feature(unit, soc_feature_stat_xgs3)) {
    332             BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, IR16383r, &count);
    333             BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, IT16383r, &count);
    334         }
    335         break;
    336 
    337     case snmpBcmReceivedPkts64Octets:
    338         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, IR64r, &count);
    339         break;
    340     case snmpBcmReceivedPkts65to127Octets:
    341         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, IR127r, &count);
    342         break;
    343     case snmpBcmReceivedPkts128to255Octets:
    344         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, IR255r, &count);
    345         break;
    346     case snmpBcmReceivedPkts256to511Octets:
    347         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, IR511r, &count);
    348         break;
    349     case snmpBcmReceivedPkts512to1023Octets:
    350         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, IR1023r, &count);
    351         break;
    352     case snmpBcmReceivedPkts1024to1518Octets:
    353         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, IR1518r, &count);
    354         break;
    355     case snmpBcmReceivedPkts1519to2047Octets:
    356         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, IR2047r, &count);
    357         break;
    358     case snmpBcmReceivedPkts2048to4095Octets:
    359         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, IR4095r, &count);
    360         break;
    361     case snmpBcmReceivedPkts4095to9216Octets:
    362         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, IR9216r, &count);
    363         break;
    364     case snmpBcmReceivedPkts9217to16383Octets:
    365         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, IR16383r, &count);
    366         break;
    367 
    368     case snmpBcmTransmittedPkts64Octets:
    369         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, IT64r, &count);
    370         break;
    371     case snmpBcmTransmittedPkts65to127Octets:
    372         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, IT127r, &count);
    373         break;
    374     case snmpBcmTransmittedPkts128to255Octets:
    375         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, IT255r, &count);
    376         break;
    377     case snmpBcmTransmittedPkts256to511Octets:
    378         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, IT511r, &count);
    379         break;
    380     case snmpBcmTransmittedPkts512to1023Octets:
    381         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, IT1023r, &count);
    382         break;
    383     case snmpBcmTransmittedPkts1024to1518Octets:
    384         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, IT1518r, &count);
    385         break;
    386     case snmpBcmTransmittedPkts1519to2047Octets:
    387         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, IT2047r, &count);
    388         break;
    389     case snmpBcmTransmittedPkts2048to4095Octets:
    390         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, IT4095r, &count);
    391         break;
    392     case snmpBcmTransmittedPkts4095to9216Octets:
    393         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, IT9216r, &count);
    394         break;
    395     case snmpBcmTransmittedPkts9217to16383Octets:
    396         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, IT16383r, &count);
    397         break;
    398 
    399     case snmpEtherStatsTXNoErrors:
    400         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, ITPKTr, &count);
    401         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_sub_op, ITFRGr, &count);
    402         if (COUNT_OVR_ERRORS(unit)) {
    403             BCM_STAT_REG_OPER(unit, port, sync_mode, reg_sub_op, 
    404                               ITOVRr, &count);
    405         }
    406         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_sub_op, ITUFLr, &count);
    407         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_sub_op, ITERRr, &count);
    408         break;
    409     case snmpEtherStatsRXNoErrors: /* RPKT - ( RFCS + RXUO + RFLR) */
    410         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, IRPKTr, &count);
    411         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_sub_op, IRFCSr, &count);
    412         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_sub_op, IRJBRr, &count);
    413         if (COUNT_OVR_ERRORS(unit)) {
    414             BCM_STAT_REG_OPER(unit, port, sync_mode, reg_sub_op, 
    415                               IROVRr, &count);
    416         }
    417         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_sub_op, IRUNDr, &count);
    418         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_sub_op, IRFRGr, &count);
    419         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_sub_op, IRERPKTr, &count);
    420         break;
    421 
    422         /* *** RFC 2665 *** */
    423 
    424     case snmpDot3StatsAlignmentErrors:
    425         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, RALNr, &count);
    426         break;
    427     case snmpDot3StatsFCSErrors:
    428         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, IRFCSr, &count);
    429         break;
    430     case snmpDot3StatsSingleCollisionFrames:
    431         break;
    432     case snmpDot3StatsMultipleCollisionFrames:
    433         break;
    434     case snmpDot3StatsSQETTestErrors:
    435         /* always 0 */
    436         break;
    437     case snmpDot3StatsDeferredTransmissions:
    438         break;
    439     case snmpDot3StatsLateCollisions:
    440         break;
    441     case snmpDot3StatsExcessiveCollisions:
    442         break;
    443     case snmpDot3StatsInternalMacTransmitErrors:
    444         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, ITUFLr, &count);
    445         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, ITERRr, &count);
    446         break;
    447     case snmpDot3StatsCarrierSenseErrors:
    448         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, RFCRr, &count);
    449         break;
    450     case snmpDot3StatsFrameTooLongs:
    451         if (SOC_REG_IS_VALID(unit, IRMEGr) && SOC_REG_IS_VALID(unit, IRMEBr)) {
    452              BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, IRMEGr, &count);
    453              BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, IRMEBr, &count);
    454         } else {
    455              BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, IRJBRr, &count);
    456         }
    457     break;
    458     case snmpDot3StatsInternalMacReceiveErrors:
    459         break;
    460     case snmpDot3StatsSymbolErrors:
    461         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, IRERBYTr, &count);
    462         break;
    463     case snmpDot3ControlInUnknownOpcodes:
    464         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, IRXUOr, &count);
    465         break;
    466     case snmpDot3InPauseFrames:
    467         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, IRXPFr, &count);
    468         break;
    469     case snmpDot3OutPauseFrames:
    470         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, ITXPFr, &count);
    471         break;
    472 
    473         /* *** RFC 2233 high capacity versions of RFC1213 objects *** */
    474 
    475     case snmpIfHCInOctets:
    476         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, IRBYTr, &count);
    477         break;
    478     case snmpIfHCInUcastPkts:
    479         if (soc_feature(unit, soc_feature_hw_stats_calc)) {
    480             if (SOC_REG_IS_VALID(unit, IRUCAr)) {
    481                 BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, 
    482                                   IRUCAr, &count);
    483             } else if (SOC_REG_IS_VALID(unit, IRUCr)) {
    484                 BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, IRUCr, &count);
    485             } else {
    486                 BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, RUCr, &count);  /* unicast pkts rcvd */
    487             }
    488         } else {
    489             BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, IRPKTr, &count);
    490             BCM_STAT_REG_OPER(unit, port, sync_mode, reg_sub_op, 
    491                               IRMCAr, &count);
    492             BCM_STAT_REG_OPER(unit, port, sync_mode, reg_sub_op, 
    493                               IRBCAr, &count);
    494             BCM_STAT_REG_OPER(unit, port, sync_mode, reg_sub_op, 
    495                               IRFCSr, &count); /* - bad FCS */
    496             BCM_STAT_REG_OPER(unit, port, sync_mode, reg_sub_op, 
    497                               IRXCFr, &count); /* - good FCS, all MAC ctrl */
    498             BCM_STAT_REG_OPER(unit, port, sync_mode, reg_sub_op, 
    499                               IRJBRr, &count); /* - oversize, bad FCS */
    500             if (COUNT_OVR_ERRORS(unit)) {
    501                 BCM_STAT_REG_OPER(unit, port, sync_mode, reg_sub_op, 
    502                                   IROVRr, &count); /* - oversize, good FCS */
    503             }
    504         }
    505             break;
    506     case snmpIfHCInMulticastPkts:
    507         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, IRMCAr, &count);
    508         break;
    509     case snmpIfHCInBroadcastPkts:
    510         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, IRBCAr, &count);
    511         break;
    512     case snmpIfHCOutOctets:
    513         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, ITBYTr, &count);
    514         break;
    515     case snmpIfHCOutUcastPkts:
    516         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, ITPKTr, &count);
    517         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_sub_op, ITMCAr, &count);
    518         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_sub_op, ITBCAr, &count);
    519         break;
    520     case snmpIfHCOutMulticastPkts:
    521         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, ITMCAr, &count);
    522         break;
    523     case snmpIfHCOutBroadcastPckts:
    524         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, ITBCAr, &count);
    525         break;
    526 
    527         /* *** RFC 2465 *** */
    528 
    529     case snmpIpv6IfStatsInReceives:
    530         if (soc_feature(unit, soc_feature_stat_xgs3)) {
    531             BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, RIPC6r, &count);
    532             BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, IMRP6r, &count);
    533         }
    534         break;
    535     case snmpIpv6IfStatsInHdrErrors:
    536         if (soc_feature(unit, soc_feature_stat_xgs3)) {
    537             BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, RIPD6r, &count);
    538         }
    539         break;
    540     case snmpIpv6IfStatsInAddrErrors:
    541         if (soc_feature(unit, soc_feature_stat_xgs3)) {
    542             BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, RIPHE6r, &count);
    543         }
    544         break;
    545     case snmpIpv6IfStatsInDiscards:
    546         if (soc_feature(unit, soc_feature_stat_xgs3)) {
    547              BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, RIPD6r, &count);
    548         }
    549         break;
    550     case snmpIpv6IfStatsOutForwDatagrams:
    551         if (soc_feature(unit, soc_feature_stat_xgs3)) {
    552             BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, TDBGC0r, &count);
    553         }
    554         break;
    555     case snmpIpv6IfStatsOutDiscards:
    556         if (soc_feature(unit, soc_feature_stat_xgs3)) {
    557             BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, TDBGC1r, &count);
    558         }
    559         break;
    560     case snmpIpv6IfStatsInMcastPkts:
    561         if (soc_feature(unit, soc_feature_stat_xgs3)) {
    562              BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, IMRP6r, &count);
    563         }
    564         break;
    565     case snmpIpv6IfStatsOutMcastPkts:
    566         if (soc_feature(unit, soc_feature_stat_xgs3)) {
    567             BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, TDBGC2r, &count);
    568         }
    569         break;
    570 
    571         /* *** IEEE 802.1bb *** */
    572     case snmpIeee8021PfcRequests:
    573         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, ITXPPr, &count);
    574         break;
    575     case snmpIeee8021PfcIndications:
    576         BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, IRXPPr, &count);
    577         break;
    578 
    579         /* IPMC counters (broadcom specific) */
    580 
    581     case snmpBcmIPMCBridgedPckts:
    582         break;
    583     case snmpBcmIPMCRoutedPckts:
    584         break;
    585     case snmpBcmIPMCInDroppedPckts:
    586         break;
    587     case snmpBcmIPMCOutDroppedPckts:
    588         break;
    589 
    590         /* *** RFC 1284 - unsupported in XGS *** */
    591     case snmpDot3StatsInRangeLengthError:
    592         break;
    593 
    594         /* *** RFC 4837 - unsupported in XGS *** */
    595     case snmpDot3OmpEmulationCRC8Errors:
    596     case snmpDot3MpcpRxGate:
    597     case snmpDot3MpcpRxRegister:
    598     case snmpDot3MpcpTxRegRequest:
    599     case snmpDot3MpcpTxRegAck:
    600     case snmpDot3MpcpTxReport:
    601     case snmpDot3EponFecCorrectedBlocks:
    602     case snmpDot3EponFecUncorrectableBlocks:
    603         break;
    604 
    605         /* EA (broadcom specific) - unsupported in XGS */
    606     case snmpBcmPonInDroppedOctets:
    607     case snmpBcmPonOutDroppedOctets:
    608     case snmpBcmPonInDelayedOctets:
    609     case snmpBcmPonOutDelayedOctets:
    610     case snmpBcmPonInDelayedHundredUs:
    611     case snmpBcmPonOutDelayedHundredUs:
    612     case snmpBcmPonInFrameErrors:
    613     case snmpBcmPonInOamFrames:
    614     case snmpBcmPonOutOamFrames:
    615     case snmpBcmPonOutUnusedOctets:
    616         break;
    617 
    618     case snmpFcmPortClass3RxFrames:
    619         if (soc_feature(unit, soc_feature_fcoe)) {
    620             BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, RDBGC3r, &count);
    621         } else {
    622             return BCM_E_UNAVAIL;
    623         }
    624         break;
    625 
    626     case snmpFcmPortClass3TxFrames:
    627         if (soc_feature(unit, soc_feature_fcoe)) {
    628             BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, TDBGC6r, &count);
    629         } else {
    630             return BCM_E_UNAVAIL;
    631         }
    632         break;
    633 
    634     case snmpFcmPortClass3Discards:
    635         if (soc_feature(unit, soc_feature_fcoe)) {
    636             BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, RDBGC4r, &count);
    637         } else {
    638             return BCM_E_UNAVAIL;
    639         }
    640         break;
    641 
    642     case snmpFcmPortClass2RxFrames:
    643         if (soc_feature(unit, soc_feature_fcoe)) {
    644             BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, RDBGC5r, &count);
    645         } else {
    646             return BCM_E_UNAVAIL;
    647         }
    648         break;
    649 
    650     case snmpFcmPortClass2TxFrames:
    651         if (soc_feature(unit, soc_feature_fcoe)) {
    652             BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, TDBGC7r, &count);
    653         } else {
    654             return BCM_E_UNAVAIL;
    655         }
    656         break;
    657 
    658     case snmpFcmPortClass2Discards:
    659         if (soc_feature(unit, soc_feature_fcoe)) {
    660             BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, RDBGC6r, &count);
    661         } else {
    662             return BCM_E_UNAVAIL;
    663         }
    664         break;
    665 
    666     case snmpFcmPortInvalidCRCs:
    667         if (soc_feature(unit, soc_feature_fcoe)) {
    668             BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, 
    669                               EGR_FCOE_INVALID_CRC_FRAMESr, &count);
    670         } else {
    671             return BCM_E_UNAVAIL;
    672         }
    673         break;
    674 
    675     case snmpFcmPortDelimiterErrors:
    676         if (soc_feature(unit, soc_feature_fcoe)) {
    677             BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, 
    678                               EGR_FCOE_DELIMITER_ERROR_FRAMESr, &count);
    679         } else {
    680             return BCM_E_UNAVAIL;
    681         }
    682         break;
    683 
    684     case snmpBcmTxE2ECCControlFrames:
    685         if (SOC_REG_IS_VALID(unit, XTHOLr)) {
    686             BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op, XTHOLr,
    687                               &count);
    688         }
    689         break;
    690 
    691     case snmpBcmRxDot3LengthMismatches:
    692         if (SOC_REG_IS_VALID(unit, IRFLRr)) {
    693             BCM_STAT_REG_OPER(unit, port, sync_mode, reg_op,
    694                               IRFLRr, &count); /* Good FCS, bad length */
    695         } else {
    696             return BCM_E_UNAVAIL;
    697         }
    698         break;
    699 
    700     default:
    701         if (type < snmpValCount) {
    702             return BCM_E_UNAVAIL;
    703         }
    704         LOG_VERBOSE(BSL_LS_SOC_COMMON,
    705                     (BSL_META_U(unit,
    706                                 "_bcm_stat_hg_get: Statistic not supported: %d\n"), type));
    707         return BCM_E_PARAM;
    708     }
    709 
    710     if (stat_op == _BCM_STAT_GET) {
    711         *val = count;
    712     }
    713 
    714     return BCM_E_NONE;
    715 }