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

portmod_stat.c (26048B)


      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 #include <soc/portmod/portmod.h>
     17 
     18 #ifdef _ERR_MSG_MODULE_NAME 
     19 #error "_ERR_MSG_MODULE_NAME redefined" 
     20 #endif
     21 #define _ERR_MSG_MODULE_NAME BSL_LS_SOC_PORT
     22 
     23 
     24 typedef enum _pm_stat_oper_e
     25 {
     26    _PORTMOD_PORT_STAT_GET, 
     27    _PORTMOD_PORT_STAT_CLEAR 
     28 } pm_stat_oper_t;
     29 
     30 typedef enum _pm_stat_reg_oper_e
     31 {
     32    _PORTMOD_PORT_STAT_REG_ADD, 
     33    _PORTMOD_PORT_STAT_REG_SUB, 
     34    _PORTMOD_PORT_STAT_REG_CLEAR 
     35 } pm_stat_reg_oper_t;
     36 
     37 
     38 int
     39 _portmod_port_stat_reg_op(int unit, soc_port_t port, int reg_op, soc_reg_t ctrl_reg, uint64 *val)
     40 {
     41    int rv = SOC_E_NONE;
     42    uint64 reg_val;
     43  
     44    switch(reg_op) {
     45        case _PORTMOD_PORT_STAT_REG_ADD: 
     46             rv = soc_reg_get(unit, ctrl_reg, port, 0, &reg_val);
     47             if (!rv) COMPILER_64_ADD_64(*val, reg_val);
     48             break;
     49 
     50        case _PORTMOD_PORT_STAT_REG_SUB: 
     51             rv = soc_reg_get(unit, ctrl_reg, port, 0, &reg_val);
     52             if (!rv) COMPILER_64_ADD_64(*val, reg_val);
     53             break;
     54 
     55        case _PORTMOD_PORT_STAT_REG_CLEAR:
     56             rv = soc_reg_set (unit, ctrl_reg, port, 0, *val);
     57             break;
     58 
     59        default:
     60             break;
     61    }
     62    return (rv);
     63 }
     64 
     65 /*
     66  * Function:
     67  *      _portmod_port_stat_get
     68  * Description:
     69  *      Get the specified statistic for a port with common counter shared
     70  *      by both XE and GE MAC.
     71  * Parameters:
     72  *      unit - PCI device unit number (driver internal)
     73  *      port - zero-based port number
     74  *      type - SNMP statistics type (see stat.h)
     75  *      val  - (OUT) 64 bit statistic counter value
     76  * Returns:
     77  *      BCM_E_NONE - Success.
     78  *      BCM_E_PARAM - Illegal parameter.
     79  *      BCM_E_INTERNAL - Chip access failure.
     80  */
     81 STATIC int
     82 _portmod_port_stat_generic_get_set(int unit, soc_port_t port, 
     83                           int stat_op, portmod_stat_val_t type, uint64 *val)
     84 {
     85     uint64 count;
     86     int rv;
     87     int reg_op     = (stat_op == _PORTMOD_PORT_STAT_GET)? _PORTMOD_PORT_STAT_REG_ADD: _PORTMOD_PORT_STAT_REG_CLEAR;
     88     int reg_sub_op = (stat_op == _PORTMOD_PORT_STAT_GET)? _PORTMOD_PORT_STAT_REG_SUB: _PORTMOD_PORT_STAT_REG_CLEAR;
     89 
     90     COMPILER_REFERENCE(&count);  /* Work around PPC compiler bug */
     91     COMPILER_64_ZERO(count);
     92 
     93     switch (type) {
     94         /* *** RFC 1213 *** */
     95     case portmodIfInOctets:
     96         rv = _portmod_port_stat_reg_op(unit, port,  reg_op, RBYTr, &count);
     97         if (rv) break;
     98         rv = _portmod_port_stat_reg_op(unit, port,  reg_op, RRBYTr, &count);
     99         break;
    100     case portmodIfInUcastPkts:             /* Unicast frames */
    101         {
    102             rv = _portmod_port_stat_reg_op(unit, port,  reg_op, RPKTr, &count);
    103             if (rv) break;
    104             rv = _portmod_port_stat_reg_op(unit, port,  reg_sub_op, RMCAr, &count); /* - multicast */
    105             if (rv) break;
    106             rv = _portmod_port_stat_reg_op(unit, port,  reg_sub_op, RBCAr, &count); /* - broadcast */
    107             if (rv) break;
    108             rv = _portmod_port_stat_reg_op(unit, port,  reg_sub_op, RFCSr, &count); /* - bad FCS */
    109             if (rv) break;
    110             rv = _portmod_port_stat_reg_op(unit, port,  reg_sub_op, RXCFr, &count); /* - good FCS, all MAC ctrl */
    111             if (rv) break;
    112             rv = _portmod_port_stat_reg_op(unit, port,  reg_sub_op, RXPFr, &count); /* - not included in RXCFr */
    113             if (rv) break;
    114             rv = _portmod_port_stat_reg_op(unit, port,  reg_sub_op, RJBRr, &count); /* - oversize, bad FCS */
    115         }
    116         break;
    117     case portmodIfInNUcastPkts:             /* Non-unicast frames */
    118          {
    119             rv = _portmod_port_stat_reg_op(unit, port,  reg_op, RUCAr, &count); /* + unicast excl */
    120             if (rv) break;
    121             rv = _portmod_port_stat_reg_op(unit, port,  reg_op, RMCAr, &count); /* + multicast */
    122             if (rv) break;
    123             rv = _portmod_port_stat_reg_op(unit, port,  reg_op, RBCAr, &count); /* + broadcast */
    124             if (rv) break;
    125             rv = _portmod_port_stat_reg_op(unit, port,  reg_op, ROVRr, &count); /* + oversize */
    126             if (rv) break;
    127             rv = _portmod_port_stat_reg_op(unit, port,  reg_sub_op, RUCr, &count); /* - unicast */
    128         }
    129         break;
    130     case portmodIfInBroadcastPkts:          /* Broadcast frames */
    131         rv = _portmod_port_stat_reg_op(unit, port,  reg_op, RBCAr, &count);
    132         break;
    133     case portmodIfInMulticastPkts:          /* Multicast frames */
    134         rv = _portmod_port_stat_reg_op(unit, port,  reg_op, RMCAr, &count);
    135         break;
    136     case portmodIfInDiscards:           /* Dropped packets including aborted */
    137         rv = _portmod_port_stat_reg_op(unit, port,  reg_op, RDBGC0r, &count); /* Ingress drop conditions */
    138         break;
    139     case portmodIfInErrors: /* RX Errors or Receive packets - non-error frames */
    140         rv = _portmod_port_stat_reg_op(unit, port,  reg_op, RFCSr, &count);
    141         if (rv) break;
    142         rv = _portmod_port_stat_reg_op(unit, port,  reg_op, RJBRr, &count);
    143         if (rv) break;
    144         rv = _portmod_port_stat_reg_op(unit, port,  reg_op, RMTUEr, &count);  /* valid? */
    145         if (rv) break;
    146         rv = _portmod_port_stat_reg_op(unit, port,  reg_op, RRPKTr, &count);
    147         break;
    148     case portmodIfOutOctets:
    149         rv = _portmod_port_stat_reg_op(unit, port,  reg_op, TBYTr, &count);
    150         break;
    151     case portmodIfOutUcastPkts:             /* Unicast frames */
    152         rv = _portmod_port_stat_reg_op(unit, port,  reg_op, TUCAr, &count);
    153         if (rv) break;
    154         rv = _portmod_port_stat_reg_op(unit, port,  reg_op, TOVRr, &count); /* + oversized pkts */
    155         break;
    156     case portmodIfOutNUcastPkts:            /* Non-unicast frames */
    157         rv = _portmod_port_stat_reg_op(unit, port,  reg_op, TMCAr, &count); /* + multicast */
    158         if (rv) break;
    159         rv = _portmod_port_stat_reg_op(unit, port,  reg_op, TBCAr, &count); /* + broadcast */
    160         break;
    161     case portmodIfOutBroadcastPkts:         /* Broadcast frames */
    162         rv = _portmod_port_stat_reg_op(unit, port,  reg_op, TBCAr, &count);
    163         break;
    164     case portmodIfOutMulticastPkts:         /* Multicast frames */
    165         rv = _portmod_port_stat_reg_op(unit, port,  reg_op, TMCAr, &count);
    166         break;
    167     case portmodIfOutDiscards:              /* Aged packet counter */
    168         rv = _portmod_port_stat_reg_op(unit, port,  reg_op, TDBGC3r, &count);
    169         break;
    170     case portmodIfOutErrors:   /* Error packets could not be xmitted */
    171         rv = _portmod_port_stat_reg_op(unit, port,  reg_op, TERRr, &count);
    172         break;
    173     case portmodIpInReceives:
    174         rv = _portmod_port_stat_reg_op(unit, port,  reg_op, RIPC4r, &count);
    175         break;
    176     case portmodIpInHdrErrors:
    177         rv = _portmod_port_stat_reg_op(unit, port,  reg_op, RIPD4r, &count);
    178         break;
    179     case portmodIpForwDatagrams:
    180         rv = _portmod_port_stat_reg_op(unit, port,  reg_op, TDBGC4r, &count);
    181         break;
    182     case portmodIpInDiscards:
    183         rv = _portmod_port_stat_reg_op(unit, port,  reg_op, RIPHE4r, &count);
    184         if (rv) break;
    185         rv = _portmod_port_stat_reg_op(unit, port,  reg_op, RIPD4r, &count);
    186         break;
    187 
    188         /* *** RFC 1493 *** */
    189 
    190     case portmodDot1dBasePortMtuExceededDiscards:
    191         rv = _portmod_port_stat_reg_op(unit, port,  reg_op, RMTUEr, &count);
    192         break;
    193     case portmodDot1dTpPortInFrames:
    194         rv = _portmod_port_stat_reg_op(unit, port,  reg_op, RPKTr, &count);
    195         break;
    196     case portmodDot1dTpPortOutFrames:
    197         rv = _portmod_port_stat_reg_op(unit, port,  reg_op, TPKTr, &count);
    198         break;
    199     case portmodDot1dPortInDiscards:
    200         rv = _portmod_port_stat_reg_op(unit, port,  reg_op, RDISCr, &count);
    201         if (rv) break;
    202         rv = _portmod_port_stat_reg_op(unit, port,  reg_op, RIPD4r, &count);
    203         if (rv) break;
    204         rv = _portmod_port_stat_reg_op(unit, port,  reg_op, RIPD6r, &count);
    205         if (rv) break;
    206         rv = _portmod_port_stat_reg_op(unit, port,  reg_op, RPORTDr, &count);
    207         break;
    208 
    209         /* *** RFC 1757 *** */
    210 
    211     case portmodEtherStatsDropEvents:
    212         rv = _portmod_port_stat_reg_op(unit, port,  reg_op, RDISCr, &count);
    213         break;
    214     case portmodEtherStatsOctets:
    215         rv = _portmod_port_stat_reg_op(unit, port,  reg_op, RBYTr, &count);
    216         if (rv) break;
    217         rv = _portmod_port_stat_reg_op(unit, port,  reg_op, TBYTr, &count);
    218         if (rv) break;
    219         rv = _portmod_port_stat_reg_op(unit, port,  reg_op, RRBYTr, &count); /* Runts bytes */
    220         break;
    221     case portmodEtherStatsPkts:
    222         rv = _portmod_port_stat_reg_op(unit, port,  reg_op, RPKTr, &count);
    223         if (rv) break;
    224         rv = _portmod_port_stat_reg_op(unit, port,  reg_op, TPKTr, &count);
    225         if (rv) break;
    226         rv = _portmod_port_stat_reg_op(unit, port,  reg_op, RRPKTr, &count); /* Runts */
    227         break;
    228     case portmodEtherStatsBroadcastPkts:
    229         rv = _portmod_port_stat_reg_op(unit, port,  reg_op, RBCAr, &count);
    230         if (rv) break;
    231         rv = _portmod_port_stat_reg_op(unit, port,  reg_op, TBCAr, &count);
    232         break;
    233     case portmodEtherStatsMulticastPkts:
    234         rv = _portmod_port_stat_reg_op(unit, port,  reg_op, RMCAr, &count);
    235         if (rv) break;
    236         rv = _portmod_port_stat_reg_op(unit, port,  reg_op, TMCAr, &count);
    237         break;
    238     case portmodEtherStatsCRCAlignErrors:
    239         rv = _portmod_port_stat_reg_op(unit, port,  reg_op, RFCSr, &count);
    240         break;
    241     case portmodEtherStatsUndersizePkts:
    242         rv = _portmod_port_stat_reg_op(unit, port,  reg_op, RUNDr, &count);
    243         break;
    244     case portmodEtherStatsOversizePkts:
    245         rv = _portmod_port_stat_reg_op(unit, port,  reg_op, ROVRr, &count);
    246         if (rv) break;
    247         rv = _portmod_port_stat_reg_op(unit, port,  reg_op, TOVRr, &count);
    248         break;
    249     case portmodEtherRxOversizePkts:
    250         rv = _portmod_port_stat_reg_op(unit, port,  reg_op, ROVRr, &count);
    251         break;
    252     case portmodEtherTxOversizePkts:
    253         rv = _portmod_port_stat_reg_op(unit, port,  reg_op, TOVRr, &count);
    254         break;
    255     case portmodEtherStatsFragments:
    256         rv = _portmod_port_stat_reg_op(unit, port,  reg_op, RFRGr, &count);
    257         break;
    258     case portmodEtherStatsJabbers:
    259         rv = _portmod_port_stat_reg_op(unit, port,  reg_op, RJBRr, &count);
    260         break;
    261         /* *** rfc1757 definition counts receive packet only *** */
    262 
    263     case portmodEtherStatsPkts64Octets:
    264         rv = _portmod_port_stat_reg_op(unit, port,  reg_op, R64r, &count);
    265         if (rv) break;
    266         rv = _portmod_port_stat_reg_op(unit, port,  reg_op, T64r, &count);
    267         break;
    268     case portmodEtherStatsPkts65to127Octets:
    269         rv = _portmod_port_stat_reg_op(unit, port,  reg_op, R127r, &count);
    270         if (rv) break;
    271         rv = _portmod_port_stat_reg_op(unit, port,  reg_op, T127r, &count);
    272         break;
    273     case portmodEtherStatsPkts128to255Octets:
    274         rv = _portmod_port_stat_reg_op(unit, port,  reg_op, R255r, &count);
    275         if (rv) break;
    276         rv = _portmod_port_stat_reg_op(unit, port,  reg_op, T255r, &count);
    277         break;
    278     case portmodEtherStatsPkts256to511Octets:
    279         rv = _portmod_port_stat_reg_op(unit, port,  reg_op, R511r, &count);
    280         if (rv) break;
    281         rv = _portmod_port_stat_reg_op(unit, port,  reg_op, T511r, &count);
    282         break;
    283     case portmodEtherStatsPkts512to1023Octets:
    284         rv = _portmod_port_stat_reg_op(unit, port,  reg_op, R1023r, &count);
    285         if (rv) break;
    286         rv = _portmod_port_stat_reg_op(unit, port,  reg_op, T1023r, &count);
    287         break;
    288     case portmodEtherStatsPkts1024to1518Octets:
    289         rv = _portmod_port_stat_reg_op(unit, port,  reg_op, R1518r, &count);
    290         if (rv) break;
    291         rv = _portmod_port_stat_reg_op(unit, port,  reg_op, T1518r, &count);
    292         break;
    293     case portmodBcmEtherStatsPkts1519to1522Octets: /* not in rfc1757 */
    294         rv = _portmod_port_stat_reg_op(unit, port,  reg_op, RMGVr, &count);
    295         if (rv) break;
    296         rv = _portmod_port_stat_reg_op(unit, port,  reg_op, TMGVr, &count);
    297         break;
    298     case portmodBcmEtherStatsPkts1522to2047Octets: /* not in rfc1757 */
    299         rv = _portmod_port_stat_reg_op(unit, port,  reg_op, R2047r, &count);
    300         if (rv) break;
    301         rv = _portmod_port_stat_reg_op(unit, port,  reg_sub_op, RMGVr, &count);
    302         if (rv) break;
    303         rv = _portmod_port_stat_reg_op(unit, port,  reg_op, T2047r, &count);
    304         if (rv) break;
    305         rv = _portmod_port_stat_reg_op(unit, port,  reg_sub_op, TMGVr, &count);
    306         break;
    307     case portmodBcmEtherStatsPkts2048to4095Octets: /* not in rfc1757 */
    308         rv = _portmod_port_stat_reg_op(unit, port,  reg_op, R4095r, &count);
    309         if (rv) break;
    310         rv = _portmod_port_stat_reg_op(unit, port,  reg_op, T4095r, &count);
    311         break;
    312     case portmodBcmEtherStatsPkts4095to9216Octets: /* not in rfc1757 */
    313         rv = _portmod_port_stat_reg_op(unit, port,  reg_op, R9216r, &count);
    314         if (rv) break;
    315         rv = _portmod_port_stat_reg_op(unit, port,  reg_op, T9216r, &count);
    316         break;
    317     case portmodBcmEtherStatsPkts9217to16383Octets: /* not in rfc1757 */
    318         rv = _portmod_port_stat_reg_op(unit, port,  reg_op, R16383r, &count);
    319         if (rv) break;
    320         rv = _portmod_port_stat_reg_op(unit, port,  reg_op, T16383r, &count);
    321         break;
    322 
    323     case portmodBcmReceivedPkts64Octets:
    324         rv = _portmod_port_stat_reg_op(unit, port,  reg_op, R64r, &count);
    325         break;
    326     case portmodBcmReceivedPkts65to127Octets:
    327         rv = _portmod_port_stat_reg_op(unit, port,  reg_op, R127r, &count);
    328         break;
    329     case portmodBcmReceivedPkts128to255Octets:
    330         rv = _portmod_port_stat_reg_op(unit, port,  reg_op, R255r, &count);
    331         break;
    332     case portmodBcmReceivedPkts256to511Octets:
    333         rv = _portmod_port_stat_reg_op(unit, port,  reg_op, R511r, &count);
    334         break;
    335     case portmodBcmReceivedPkts512to1023Octets:
    336         rv = _portmod_port_stat_reg_op(unit, port,  reg_op, R1023r, &count);
    337         break;
    338     case portmodBcmReceivedPkts1024to1518Octets:
    339         rv = _portmod_port_stat_reg_op(unit, port,  reg_op, R1518r, &count);
    340         break;
    341     case portmodBcmReceivedPkts1519to2047Octets:
    342         rv = _portmod_port_stat_reg_op(unit, port,  reg_op, R2047r, &count);
    343         break;
    344     case portmodBcmReceivedPkts2048to4095Octets:
    345         rv = _portmod_port_stat_reg_op(unit, port,  reg_op, R4095r, &count);
    346         break;
    347     case portmodBcmReceivedPkts4095to9216Octets:
    348         rv = _portmod_port_stat_reg_op(unit, port,  reg_op, R9216r, &count);
    349         break;
    350     case portmodBcmReceivedPkts9217to16383Octets:
    351         rv = _portmod_port_stat_reg_op(unit, port,  reg_op, R16383r, &count);
    352         break;
    353 
    354     case portmodBcmTransmittedPkts64Octets:
    355         rv = _portmod_port_stat_reg_op(unit, port,  reg_op, T64r, &count);
    356         break;
    357     case portmodBcmTransmittedPkts65to127Octets:
    358         rv = _portmod_port_stat_reg_op(unit, port,  reg_op, T127r, &count);
    359         break;
    360     case portmodBcmTransmittedPkts128to255Octets:
    361         rv = _portmod_port_stat_reg_op(unit, port,  reg_op, T255r, &count);
    362         break;
    363     case portmodBcmTransmittedPkts256to511Octets:
    364         rv = _portmod_port_stat_reg_op(unit, port,  reg_op, T511r, &count);
    365         break;
    366     case portmodBcmTransmittedPkts512to1023Octets:
    367         rv = _portmod_port_stat_reg_op(unit, port,  reg_op, T1023r, &count);
    368         break;
    369     case portmodBcmTransmittedPkts1024to1518Octets:
    370         rv = _portmod_port_stat_reg_op(unit, port,  reg_op, T1518r, &count);
    371         break;
    372     case portmodBcmTransmittedPkts1519to2047Octets:
    373         rv = _portmod_port_stat_reg_op(unit, port,  reg_op, T2047r, &count);
    374         break;
    375     case portmodBcmTransmittedPkts2048to4095Octets:
    376         rv = _portmod_port_stat_reg_op(unit, port,  reg_op, T4095r, &count);
    377         break;
    378     case portmodBcmTransmittedPkts4095to9216Octets:
    379         rv = _portmod_port_stat_reg_op(unit, port,  reg_op, T9216r, &count);
    380         break;
    381     case portmodBcmTransmittedPkts9217to16383Octets:
    382         rv = _portmod_port_stat_reg_op(unit, port,  reg_op, T16383r, &count);
    383         break;
    384 
    385     case portmodEtherStatsTXNoErrors:
    386         rv = _portmod_port_stat_reg_op(unit, port,  reg_op, TPOKr, &count);
    387         break;
    388     case portmodEtherStatsRXNoErrors:
    389         rv = _portmod_port_stat_reg_op(unit, port,  reg_op, RPOKr, &count);
    390         break;
    391 
    392         /* *** RFC 2665 *** */
    393 
    394     case portmodDot3StatsFCSErrors:
    395         rv = _portmod_port_stat_reg_op(unit, port,  reg_op, RFCSr, &count);
    396         break;
    397     case portmodDot3StatsInternalMacTransmitErrors:
    398         rv = _portmod_port_stat_reg_op(unit, port,  reg_op, TUFLr, &count);
    399         if (rv) break;
    400         rv = _portmod_port_stat_reg_op(unit, port,  reg_op, TERRr, &count);
    401         break;
    402     case portmodDot3StatsFrameTooLongs:
    403         rv = _portmod_port_stat_reg_op(unit, port,  reg_op, RMTUEr, &count);
    404         break;
    405     case portmodDot3StatsSymbolErrors:
    406         rv = _portmod_port_stat_reg_op(unit, port,  reg_op, RERPKTr, &count);
    407         break;
    408     case portmodDot3ControlInUnknownOpcodes:
    409         rv = _portmod_port_stat_reg_op(unit, port,  reg_op, RXUOr, &count);
    410         break;
    411     case portmodDot3InPauseFrames:
    412         rv = _portmod_port_stat_reg_op(unit, port,  reg_op, RXPFr, &count);
    413         break;
    414     case portmodDot3OutPauseFrames:
    415         rv = _portmod_port_stat_reg_op(unit, port,  reg_op, TXPFr, &count);
    416         break;
    417 
    418         /* *** RFC 2233 high capacity versions of RFC1213 objects *** */
    419 
    420     case portmodIfHCInOctets:
    421         rv = _portmod_port_stat_reg_op(unit, port,  reg_op, RBYTr, &count);
    422         if (rv) break;
    423         rv = _portmod_port_stat_reg_op(unit, port,  reg_op, RRBYTr, &count);        
    424         break;
    425     case portmodIfHCInUcastPkts:
    426          {
    427             rv = _portmod_port_stat_reg_op(unit, port,  reg_op, RPKTr, &count);
    428             if (rv) break;
    429             rv = _portmod_port_stat_reg_op(unit, port,  reg_sub_op, RMCAr, &count);
    430             if (rv) break;
    431             rv = _portmod_port_stat_reg_op(unit, port,  reg_sub_op, RBCAr, &count);
    432             if (rv) break;
    433             rv = _portmod_port_stat_reg_op(unit, port,  reg_sub_op, RFCSr, &count); /* - bad FCS */
    434             if (rv) break;
    435             rv = _portmod_port_stat_reg_op(unit, port,  reg_sub_op, RXCFr, &count); /* - good FCS, all MAC ctrl */
    436             if (rv) break;
    437             rv = _portmod_port_stat_reg_op(unit, port,  reg_sub_op, RXPFr, &count); /* - not included in RXCFr */
    438             if (rv) break;
    439             rv = _portmod_port_stat_reg_op(unit, port,  reg_sub_op, RJBRr, &count); /* - oversize, bad FCS */
    440         }
    441         break;
    442     case portmodIfHCInMulticastPkts:
    443         rv = _portmod_port_stat_reg_op(unit, port,  reg_op, RMCAr, &count);
    444         break;
    445     case portmodIfHCInBroadcastPkts:
    446         rv = _portmod_port_stat_reg_op(unit, port,  reg_op, RBCAr, &count);
    447         break;
    448     case portmodIfHCOutOctets:
    449         rv = _portmod_port_stat_reg_op(unit, port,  reg_op, TBYTr, &count);
    450         break;
    451     case portmodIfHCOutUcastPkts:
    452         rv = _portmod_port_stat_reg_op(unit, port,  reg_op, TUCAr, &count);
    453         if (rv) break;
    454         rv = _portmod_port_stat_reg_op(unit, port,  reg_op, TOVRr, &count);
    455         break;
    456     case portmodIfHCOutMulticastPkts:
    457         rv = _portmod_port_stat_reg_op(unit, port,  reg_op, TMCAr, &count);
    458         break;
    459     case portmodIfHCOutBroadcastPckts:
    460         rv = _portmod_port_stat_reg_op(unit, port,  reg_op, TBCAr, &count);
    461         break;
    462 
    463         /* *** RFC 2465 *** */
    464 
    465     case portmodIpv6IfStatsInReceives:
    466         rv = _portmod_port_stat_reg_op(unit, port,  reg_op, RIPC6r, &count);
    467         if (rv) break;
    468         rv = _portmod_port_stat_reg_op(unit, port,  reg_op, IMRP6r, &count);
    469         break;
    470     case portmodIpv6IfStatsInHdrErrors:
    471         rv = _portmod_port_stat_reg_op(unit, port,  reg_op, RIPD6r, &count);
    472         break;
    473     case portmodIpv6IfStatsInAddrErrors:
    474         rv = _portmod_port_stat_reg_op(unit, port,  reg_op, RIPHE6r, &count);
    475         break;
    476     case portmodIpv6IfStatsInDiscards:
    477         rv = _portmod_port_stat_reg_op(unit, port,  reg_op, RIPHE6r, &count);
    478         if (rv) break;
    479         rv = _portmod_port_stat_reg_op(unit, port,  reg_op, RIPD6r, &count);
    480         break;
    481     case portmodIpv6IfStatsOutForwDatagrams:
    482         rv = _portmod_port_stat_reg_op(unit, port,  reg_op, TDBGC0r, &count);
    483         break;
    484     case portmodIpv6IfStatsOutDiscards:
    485         rv = _portmod_port_stat_reg_op(unit, port,  reg_op, TDBGC1r, &count);
    486         break;
    487     case portmodIpv6IfStatsInMcastPkts:
    488         rv = _portmod_port_stat_reg_op(unit, port,  reg_op, IMRP6r, &count);
    489         break;
    490     case portmodIpv6IfStatsOutMcastPkts:
    491         rv = _portmod_port_stat_reg_op(unit, port,  reg_op, TDBGC2r, &count);
    492         break;
    493 
    494         /* *** IEEE 802.1bb *** */
    495     case portmodIeee8021PfcRequests:
    496         rv = _portmod_port_stat_reg_op(unit, port,  reg_op, TXPPr, &count);
    497         break;
    498     case portmodIeee8021PfcIndications:
    499         rv = _portmod_port_stat_reg_op(unit, port,  reg_op, RXPPr, &count);
    500         break;
    501 
    502         /* IPMC counters (broadcom specific) */
    503 
    504     case portmodBcmIPMCBridgedPckts:
    505         rv = _portmod_port_stat_reg_op(unit, port,  reg_op, RDBGC1r, &count);
    506         break;
    507     case portmodBcmIPMCRoutedPckts:
    508         rv = _portmod_port_stat_reg_op(unit, port,  reg_op, IMRP4r, &count);
    509         if (rv) break;
    510         rv = _portmod_port_stat_reg_op(unit, port,  reg_op, IMRP6r, &count);
    511         break;
    512     case portmodBcmIPMCInDroppedPckts:
    513         rv = _portmod_port_stat_reg_op(unit, port,  reg_op, RDBGC2r, &count);
    514         break;
    515     case portmodBcmIPMCOutDroppedPckts:
    516         rv = _portmod_port_stat_reg_op(unit, port,  reg_op, TDBGC5r, &count);
    517         break;
    518 
    519     /* Vlan Tag Frame Counters */
    520     case portmodBcmRxVlanTagFrame:
    521         rv = _portmod_port_stat_reg_op(unit, port,  reg_op, RVLNr, &count);
    522         break;
    523     case portmodBcmRxDoubleVlanTagFrame:
    524         rv = _portmod_port_stat_reg_op(unit, port,  reg_op, RDVLNr, &count);
    525         break;
    526     case portmodBcmTxVlanTagFrame:
    527         rv = _portmod_port_stat_reg_op(unit, port,  reg_op, TVLNr, &count);
    528         break;
    529     case portmodBcmTxDoubleVlanTagFrame:
    530         rv = _portmod_port_stat_reg_op(unit, port,  reg_op, TDVLNr, &count);
    531         break;
    532 
    533     /* PFC Control Frame Counters */
    534     case portmodBcmRxPFCControlFrame:
    535         rv = _portmod_port_stat_reg_op(unit, port,  reg_op, RXPPr, &count);
    536         break;
    537 
    538     case portmodBcmTxPFCControlFrame:
    539         rv = _portmod_port_stat_reg_op(unit, port,  reg_op, TXPPr, &count);
    540         break;
    541 
    542     /* Receive PFC Frame Priority */
    543     case portmodBcmRxPFCFramePriority0:
    544         rv = _portmod_port_stat_reg_op(unit, port,  reg_op, RPFC0r, &count);
    545         break;
    546 
    547     case portmodBcmRxPFCFramePriority1:
    548         rv = _portmod_port_stat_reg_op(unit, port,  reg_op, RPFC1r, &count);
    549         break;
    550 
    551     case portmodBcmRxPFCFramePriority2:
    552         rv = _portmod_port_stat_reg_op(unit, port,  reg_op, RPFC2r, &count);
    553         break;
    554 
    555     case portmodBcmRxPFCFramePriority3:
    556         rv = _portmod_port_stat_reg_op(unit, port,  reg_op, RPFC3r, &count);
    557         break;
    558 
    559     case portmodBcmRxPFCFramePriority4:
    560         rv = _portmod_port_stat_reg_op(unit, port,  reg_op, RPFC4r, &count);
    561         break;
    562 
    563     case portmodBcmRxPFCFramePriority5:
    564         rv = _portmod_port_stat_reg_op(unit, port,  reg_op, RPFC5r, &count);
    565         break;
    566 
    567     case portmodBcmRxPFCFramePriority6:
    568         rv = _portmod_port_stat_reg_op(unit, port,  reg_op, RPFC6r, &count);
    569         break;
    570 
    571     case portmodBcmRxPFCFramePriority7:
    572         rv = _portmod_port_stat_reg_op(unit, port,  reg_op, RPFC7r, &count);
    573         break;
    574 
    575     /* Transmit PFC Frame Priority */
    576     case portmodBcmTxPFCFramePriority0:
    577         rv = _portmod_port_stat_reg_op(unit, port,  reg_op, TPFC0r, &count);
    578         break;
    579 
    580     case portmodBcmTxPFCFramePriority1:
    581         rv = _portmod_port_stat_reg_op(unit, port,  reg_op, TPFC1r, &count);
    582         break;
    583 
    584     case portmodBcmTxPFCFramePriority2:
    585         rv = _portmod_port_stat_reg_op(unit, port,  reg_op, TPFC2r, &count);
    586         break;
    587 
    588     case portmodBcmTxPFCFramePriority3:
    589         rv = _portmod_port_stat_reg_op(unit, port,  reg_op, TPFC3r, &count);
    590         break;
    591 
    592     case portmodBcmTxPFCFramePriority4:
    593         rv = _portmod_port_stat_reg_op(unit, port,  reg_op, TPFC4r, &count);
    594         break;
    595 
    596     case portmodBcmTxPFCFramePriority5:
    597         rv = _portmod_port_stat_reg_op(unit, port,  reg_op, TPFC5r, &count);
    598         break;
    599 
    600     case portmodBcmTxPFCFramePriority6:
    601         rv = _portmod_port_stat_reg_op(unit, port,  reg_op, TPFC6r, &count);
    602         break;
    603 
    604     case portmodBcmTxPFCFramePriority7:
    605         rv = _portmod_port_stat_reg_op(unit, port,  reg_op, TPFC7r, &count);
    606         break;
    607 
    608     default:
    609         if (type < portmodCount) {
    610             return BCM_E_UNAVAIL;
    611         }
    612         LOG_VERBOSE(BSL_LS_SOC_COMMON,
    613                     (BSL_META_U(unit,
    614                                 "rv = _portmod_port_stat_get: Statistic not supported: %d\n"), type));
    615         return BCM_E_PARAM;
    616     }
    617 
    618     if (stat_op == _PORTMOD_PORT_STAT_GET) {
    619         *val = count;
    620     }
    621 
    622     return rv;
    623 }
    624 
    625 /*get counter value. */
    626 int portmod_port_stats_read(int unit, int port, portmod_stat_val_t cntr_type, uint64* value)
    627 {
    628     return (_portmod_port_stat_generic_get_set(unit, port, _PORTMOD_PORT_STAT_REG_ADD, cntr_type, value));
    629 }
    630 
    631 /*clear counter value. */
    632 int portmod_port_stats_clear(int unit, int port, portmod_stat_val_t cntr_type)
    633 {
    634     return (_portmod_port_stat_generic_get_set(unit, port, _PORTMOD_PORT_STAT_REG_CLEAR, cntr_type, 0));
    635 }
    636 
    637 #undef _ERR_MSG_MODULE_NAME