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, ®_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, ®_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