1 /* 2 * CDDL HEADER START 3 * 4 * The contents of this file are subject to the terms of the 5 * Common Development and Distribution License, v.1, (the "License"). 6 * You may not use this file except in compliance with the License. 7 * 8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9 * or http://opensource.org/licenses/CDDL-1.0. 10 * See the License for the specific language governing permissions 11 * and limitations under the License. 12 * 13 * When distributing Covered Code, include this CDDL HEADER in each 14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15 * If applicable, add the following below this CDDL HEADER, with the 16 * fields enclosed by brackets "[]" replaced with your own identifying 17 * information: Portions Copyright [yyyy] [name of copyright owner] 18 * 19 * CDDL HEADER END 20 */ 21 22 /* 23 * Copyright 2014-2017 Cavium, Inc. 24 * The contents of this file are subject to the terms of the Common Development 25 * and Distribution License, v.1, (the "License"). 26 27 * You may not use this file except in compliance with the License. 28 29 * You can obtain a copy of the License at available 30 * at http://opensource.org/licenses/CDDL-1.0 31 32 * See the License for the specific language governing permissions and 33 * limitations under the License. 34 */ 35 36 37 #include "qede.h" 38 39 typedef struct _qede_kstat { 40 kstat_named_t qede_hi; 41 kstat_named_t qede_lo; 42 kstat_named_t version; 43 kstat_named_t versionFW; 44 kstat_named_t versionMFW; 45 kstat_named_t chipID; 46 kstat_named_t chipName; 47 kstat_named_t devBDF; 48 kstat_named_t devID; 49 kstat_named_t multiFunction; 50 kstat_named_t multiFunctionVnics; 51 kstat_named_t macAddr; 52 kstat_named_t hwInitDone; 53 kstat_named_t numVports; 54 kstat_named_t vportID; 55 kstat_named_t intrAlloc; 56 kstat_named_t intrFired; 57 kstat_named_t lroEnabled; 58 kstat_named_t lsoEnabled; 59 kstat_named_t jumboEnabled; 60 kstat_named_t txTotalPkts; 61 kstat_named_t txTotalBytes; 62 kstat_named_t txTotalDiscards; 63 kstat_named_t rxTotalPkts; 64 kstat_named_t rxTotalBytes; 65 kstat_named_t rxTotalDiscards; 66 kstat_named_t allocbFailures; 67 } qede_kstat_t; 68 69 #define QEDE_KSTAT_SIZE (sizeof (qede_kstat_t) / sizeof (kstat_named_t)) 70 71 typedef struct _qede_kstat_link { 72 kstat_named_t vportID; 73 kstat_named_t uptime; 74 kstat_named_t mtuL2; 75 kstat_named_t speed; 76 kstat_named_t link; 77 kstat_named_t duplex; 78 kstat_named_t pauseRx; 79 kstat_named_t pauseTx; 80 } qede_kstat_link_t; 81 82 #define QEDE_KSTAT_LINK_SIZE \ 83 (sizeof (qede_kstat_link_t) / sizeof (kstat_named_t)) 84 85 typedef struct _qede_kstat_intr { 86 kstat_named_t intrAlloc; 87 kstat_named_t intrFired; 88 kstat_named_t sb_00; 89 kstat_named_t sb_01; 90 kstat_named_t sb_02; 91 kstat_named_t sb_03; 92 kstat_named_t sb_04; 93 kstat_named_t sb_05; 94 kstat_named_t sb_06; 95 kstat_named_t sb_nc_00; 96 kstat_named_t sb_nc_01; 97 kstat_named_t sb_nc_02; 98 kstat_named_t sb_nc_03; 99 kstat_named_t sb_nc_04; 100 kstat_named_t sb_nc_05; 101 kstat_named_t sb_nc_06; 102 kstat_named_t sb_poll_00; 103 kstat_named_t sb_poll_01; 104 kstat_named_t sb_poll_02; 105 kstat_named_t sb_poll_03; 106 kstat_named_t sb_poll_04; 107 kstat_named_t sb_poll_05; 108 kstat_named_t sb_poll_06; 109 kstat_named_t sb_poll_nc_00; 110 kstat_named_t sb_poll_nc_01; 111 kstat_named_t sb_poll_nc_02; 112 kstat_named_t sb_poll_nc_03; 113 kstat_named_t sb_poll_nc_04; 114 kstat_named_t sb_poll_nc_05; 115 kstat_named_t sb_poll_nc_06; 116 } qede_kstat_intr_t; 117 118 #define QEDE_KSTAT_INTR_SIZE \ 119 (sizeof (qede_kstat_intr_t) / sizeof (kstat_named_t)) 120 121 typedef struct _qede_kstat_vport_stats { 122 kstat_named_t rxUcastBytes; 123 kstat_named_t rxMcastBytes; 124 kstat_named_t rxBcastBytes; 125 kstat_named_t rxUcastPkts; 126 kstat_named_t rxMcastPkts; 127 kstat_named_t rxBcastPkts; 128 kstat_named_t txUcastBytes; 129 kstat_named_t txMcastBytes; 130 kstat_named_t txBcastBytes; 131 kstat_named_t txUcastPkts; 132 kstat_named_t txMcastPkts; 133 kstat_named_t txBcastPkts; 134 kstat_named_t rx64bytePkts; 135 kstat_named_t rx127bytePkts; 136 kstat_named_t rx255bytePkts; 137 kstat_named_t rx511bytePkts; 138 kstat_named_t rx1023bytePkts; 139 kstat_named_t rx1518bytePkts; 140 kstat_named_t rx1522bytePkts; 141 kstat_named_t rx2047bytePkts; 142 kstat_named_t rx4095bytePkts; 143 kstat_named_t rx9216bytePkts; 144 kstat_named_t rx16383bytePkts; 145 kstat_named_t tx64bytePkts; 146 kstat_named_t tx64to127bytePkts; 147 kstat_named_t tx128to255bytePkts; 148 kstat_named_t tx256to511bytePkts; 149 kstat_named_t tx512to1023bytePkts; 150 kstat_named_t tx1024to1518bytePkts; 151 kstat_named_t tx1519to2047bytePkts; 152 kstat_named_t tx2048to4095bytePkts; 153 kstat_named_t tx4096to9216bytePkts; 154 kstat_named_t tx9217to16383bytePkts; 155 kstat_named_t rxMacCtrlFrames; 156 kstat_named_t rxPauseFrames; 157 kstat_named_t txPauseFrames; 158 kstat_named_t rxCRCerrors; 159 kstat_named_t rxAlignErrors; 160 kstat_named_t rxCarrierErrors; 161 kstat_named_t rxOversizeErrors; 162 kstat_named_t rxJabbers; 163 kstat_named_t rxUndersizePkts; 164 kstat_named_t rxFragments; 165 kstat_named_t txLpiEntryCnt; 166 kstat_named_t txTotalCollisions; 167 kstat_named_t brbTruncates; 168 kstat_named_t noBuffDiscards; 169 kstat_named_t mftagFilterDiscards; 170 kstat_named_t macFilterDiscards; 171 kstat_named_t txErrDropPkts; 172 kstat_named_t coalescedPkts; 173 kstat_named_t coalescedEvents; 174 kstat_named_t coalescedAbortsNum; 175 kstat_named_t nonCoalescedPkts; 176 kstat_named_t coalescedBytes; 177 } qede_kstat_vport_stats_t; 178 179 #define QEDE_KSTAT_VPORT_STATS_SIZE \ 180 (sizeof (qede_kstat_vport_stats_t) / sizeof (kstat_named_t)) 181 182 typedef struct _qede_kstat_rxq { 183 kstat_named_t rxqBdTotal; 184 kstat_named_t rxqBdLeft; 185 kstat_named_t rxqBdPageCnt; 186 kstat_named_t rxqBdsPerPage; 187 kstat_named_t rxqBdSize; 188 kstat_named_t rxqBdProdIdx; 189 kstat_named_t rxqBdConsIdx; 190 kstat_named_t rcqBdTotal; 191 kstat_named_t rcqBdLeft; 192 kstat_named_t rcqBdPageCnt; 193 kstat_named_t rcqBdsPerPage; 194 kstat_named_t rcqBdSize; 195 kstat_named_t rcqBdProdIdx; 196 kstat_named_t rcqBdConsIdx; 197 kstat_named_t hwRcqConIdx; 198 kstat_named_t rxFreeDescs; 199 kstat_named_t rxActiveDescs; 200 kstat_named_t rxCopyPkts; 201 kstat_named_t rxDropPkts; 202 kstat_named_t rxBufUpInStack; 203 kstat_named_t rxLowWater; 204 kstat_named_t rxLowWaterCnt; 205 kstat_named_t inPollMode; 206 kstat_named_t rxPollCnt; 207 kstat_named_t intrDisableCnt; 208 kstat_named_t intrEnableCnt; 209 kstat_named_t genNumber; 210 kstat_named_t rxRegPkts; 211 kstat_named_t rxJumboPkts; 212 kstat_named_t rxLroPkts; 213 kstat_named_t rxRingTotalPkts; 214 kstat_named_t rxRingTotalBytes; 215 } qede_kstat_rxq_t; 216 217 #define QEDE_KSTAT_RXQ_SIZE \ 218 (sizeof (qede_kstat_rxq_t) / sizeof (kstat_named_t)) 219 220 typedef struct _qede_kstat_txq { 221 kstat_named_t txBdTotal; 222 kstat_named_t txBdLeft; 223 kstat_named_t txBdPageCnt; 224 kstat_named_t txBdsPerPage; 225 kstat_named_t txBdSize; 226 kstat_named_t hwTxqConIdx; 227 kstat_named_t txBdProdIdx; 228 kstat_named_t txBdConsIdx; 229 kstat_named_t txLowWater; 230 kstat_named_t txRingPause; 231 kstat_named_t txDropPkts; 232 kstat_named_t txCopyPkts; 233 kstat_named_t txBind; 234 kstat_named_t txBindFail; 235 kstat_named_t txPremapped; 236 kstat_named_t txPremappedFail; 237 kstat_named_t txTooManyCookies; 238 kstat_named_t txPullupPkts; 239 kstat_named_t txLsoPkts; 240 kstat_named_t txTooManyMblks; 241 kstat_named_t txMappedPkts; 242 kstat_named_t txJumboPkts; 243 kstat_named_t txRingTotalPkts; 244 kstat_named_t txRingTotalBytes; 245 } qede_kstat_txq_t; 246 247 #define QEDE_KSTAT_TXQ_SIZE \ 248 (sizeof (qede_kstat_txq_t) / sizeof (kstat_named_t)) 249 250 251 static int 252 qede_kstat_update(kstat_t *kstats, 253 int rw) 254 { 255 256 qede_kstat_t *pStats = (qede_kstat_t *)kstats->ks_data; 257 qede_t *qede = (qede_t *)kstats->ks_private; 258 struct ecore_dev *edev = &qede->edev; 259 qede_fastpath_t *fp = &qede->fp_array[0]; 260 qede_rx_ring_t *rx_ring; 261 qede_tx_ring_t *tx_ring; 262 int i, j; 263 char buf[17]; 264 265 if (rw == KSTAT_WRITE) { 266 return EACCES; 267 } 268 269 mutex_enter(&qede->kstat_lock); 270 271 snprintf(buf, sizeof (buf), "%16p", (void *)qede); 272 strncpy(pStats->qede_hi.value.c, &buf[0], 8); 273 pStats->qede_hi.value.c[8] = 0; 274 strncpy(pStats->qede_lo.value.c, &buf[8], 8); 275 pStats->qede_lo.value.c[8] = 0; 276 277 278 strncpy(pStats->version.value.c, 279 qede->version, sizeof (pStats->version.value.c)); 280 strncpy(pStats->versionFW.value.c, 281 qede->versionFW, sizeof (pStats->versionFW.value.c)); 282 strncpy(pStats->versionMFW.value.c, 283 qede->versionMFW, sizeof (pStats->versionMFW.value.c)); 284 285 strncpy(pStats->chipName.value.c, 286 qede->chip_name, sizeof (pStats->chipName.value.c)); 287 strncpy(pStats->chipID.value.c, 288 qede->chipID, sizeof (pStats->chipID.value.c)); 289 290 strncpy(pStats->devBDF.value.c, 291 qede->bus_dev_func, sizeof (pStats->devBDF.value.c)); 292 strncpy(pStats->devID.value.c, 293 qede->vendor_device, sizeof (pStats->devID.value.c)); 294 295 strncpy(pStats->multiFunction.value.c, 296 ((edev->mf_mode == ECORE_MF_DEFAULT) ? "DEFAULT" : 297 (edev->mf_mode == ECORE_MF_OVLAN) ? "MF-OVLAN" : "Unknown"), 298 sizeof (pStats->multiFunction.value.c)); 299 300 pStats->multiFunctionVnics.value.ui64 = 0; 301 302 snprintf(pStats->macAddr.value.c, 16, "%02x%02x%02x%02x%02x%02x", 303 qede->ether_addr[0],qede->ether_addr[1], 304 qede->ether_addr[2], qede->ether_addr[3], 305 qede->ether_addr[4],qede->ether_addr[5]); 306 307 308 pStats->hwInitDone.value.ui64 = 309 (qede->attach_resources & QEDE_ECORE_HW_INIT)? 1 : 0; 310 /*pStats->numVports.value.ui64 = 311 p_hwfn->hw_info.resc_num[ECORE_VPORT]; */ 312 pStats->numVports.value.ui64 = edev->num_hwfns; 313 pStats->vportID.value.ui64 = qede->vport_params[0].vport_id; 314 315 316 strncpy(pStats->intrAlloc.value.c, 317 qede->intrAlloc, sizeof (pStats->intrAlloc.value.c)); 318 319 pStats->intrFired.value.ui64 = qede->intrFired; 320 pStats->lroEnabled.value.ui64 = qede->lro_enable; 321 pStats->lsoEnabled.value.ui64 = qede->lso_enable; 322 pStats->jumboEnabled.value.ui64 = qede->jumbo_enable; 323 324 qede->rxTotalPkts = 0; 325 qede->rxTotalBytes = 0; 326 qede->rxTotalDiscards = 0; 327 qede->txTotalPkts = 0; 328 qede->txTotalBytes = 0; 329 qede->txTotalDiscards = 0; 330 qede->allocbFailures = 0; 331 for (i = 0; i < qede->num_fp; i++, fp++) { 332 rx_ring = fp->rx_ring; 333 qede->rxTotalPkts += rx_ring->rx_pkt_cnt; 334 qede->rxTotalBytes += rx_ring->rx_byte_cnt; 335 qede->rxTotalDiscards += rx_ring->rx_drop_cnt; 336 for (j = 0; j < qede->num_tc; j++) { 337 tx_ring = fp->tx_ring[j]; 338 qede->txTotalPkts += tx_ring->tx_pkt_count; 339 qede->txTotalBytes += tx_ring->tx_byte_count; 340 qede->txTotalDiscards += tx_ring->tx_pkt_dropped; 341 } 342 } 343 pStats->rxTotalPkts.value.ui64 = qede->rxTotalPkts; 344 pStats->rxTotalBytes.value.ui64 = qede->rxTotalBytes; 345 pStats->rxTotalDiscards.value.ui64 = qede->rxTotalDiscards; 346 pStats->txTotalPkts.value.ui64 = qede->txTotalPkts; 347 pStats->txTotalBytes.value.ui64 = qede->txTotalBytes; 348 pStats->txTotalDiscards.value.ui64 = qede->txTotalDiscards; 349 pStats->allocbFailures.value.ui64 = qede->allocbFailures; 350 351 mutex_exit(&qede->kstat_lock); 352 return (0); 353 354 } 355 356 static int 357 qede_kstat_link_update(kstat_t *kstats, int rw) 358 { 359 qede_kstat_link_t *pStats = (qede_kstat_link_t *)kstats->ks_data; 360 qede_t *qede = (qede_t *)kstats->ks_private; 361 struct ecore_dev *edev = &qede->edev; 362 363 if (rw == KSTAT_WRITE) { 364 return EACCES; 365 } 366 mutex_enter(&qede->kstat_lock); 367 368 pStats->vportID.value.ui64 = qede->vport_params[0].vport_id; 369 pStats->uptime.value.ui64 = (qede->props.link_speed) ? 370 (ddi_get_time() - qede->props.uptime) : 0; 371 pStats->mtuL2.value.ui64 = qede->mtu; 372 pStats->speed.value.ui64 = qede->props.link_speed; 373 pStats->link.value.ui64 = qede->params.link_state; 374 pStats->duplex.value.ui64 = qede->props.link_duplex; 375 pStats->pauseRx.value.ui64 = qede->props.rx_pause; 376 pStats->pauseTx.value.ui64 = qede->props.tx_pause; 377 378 mutex_exit(&qede->kstat_lock); 379 return (0); 380 } 381 382 static int 383 qede_kstat_intr_update(kstat_t *kstats, int rw) 384 { 385 386 qede_kstat_intr_t * pStats = (qede_kstat_intr_t *)kstats->ks_data; 387 qede_t *qede = (qede_t *)kstats->ks_private; 388 struct ecore_dev *edev = &qede->edev; 389 390 if (rw == KSTAT_WRITE) { 391 return EACCES; 392 } 393 394 mutex_enter(&qede->kstat_lock); 395 396 397 strncpy(pStats->intrAlloc.value.c, 398 qede->intrAlloc, sizeof (pStats->intrAlloc.value.c)); 399 400 pStats->intrFired.value.ui64 = qede->intrFired; 401 402 pStats->sb_00.value.ui64 = qede->intrSbCnt[0]; 403 pStats->sb_01.value.ui64 = qede->intrSbCnt[1]; 404 pStats->sb_02.value.ui64 = qede->intrSbCnt[2]; 405 pStats->sb_03.value.ui64 = qede->intrSbCnt[3]; 406 pStats->sb_04.value.ui64 = qede->intrSbCnt[4]; 407 pStats->sb_05.value.ui64 = qede->intrSbCnt[5]; 408 pStats->sb_06.value.ui64 = qede->intrSbCnt[6]; 409 410 pStats->sb_nc_00.value.ui64 = qede->intrSbNoChangeCnt[0]; 411 pStats->sb_nc_01.value.ui64 = qede->intrSbNoChangeCnt[1]; 412 pStats->sb_nc_02.value.ui64 = qede->intrSbNoChangeCnt[2]; 413 pStats->sb_nc_03.value.ui64 = qede->intrSbNoChangeCnt[3]; 414 pStats->sb_nc_04.value.ui64 = qede->intrSbNoChangeCnt[4]; 415 pStats->sb_nc_05.value.ui64 = qede->intrSbNoChangeCnt[5]; 416 pStats->sb_nc_06.value.ui64 = qede->intrSbNoChangeCnt[6]; 417 418 419 pStats->sb_poll_00.value.ui64 = qede->intrSbPollCnt[0]; 420 pStats->sb_poll_01.value.ui64 = qede->intrSbPollCnt[1]; 421 pStats->sb_poll_02.value.ui64 = qede->intrSbPollCnt[2]; 422 pStats->sb_poll_03.value.ui64 = qede->intrSbPollCnt[3]; 423 pStats->sb_poll_04.value.ui64 = qede->intrSbPollCnt[4]; 424 pStats->sb_poll_05.value.ui64 = qede->intrSbPollCnt[5]; 425 pStats->sb_poll_06.value.ui64 = qede->intrSbPollCnt[6]; 426 427 pStats->sb_poll_nc_00.value.ui64 = qede->intrSbPollNoChangeCnt[0]; 428 pStats->sb_poll_nc_01.value.ui64 = qede->intrSbPollNoChangeCnt[1]; 429 pStats->sb_poll_nc_02.value.ui64 = qede->intrSbPollNoChangeCnt[2]; 430 pStats->sb_poll_nc_03.value.ui64 = qede->intrSbPollNoChangeCnt[3]; 431 pStats->sb_poll_nc_04.value.ui64 = qede->intrSbPollNoChangeCnt[4]; 432 pStats->sb_poll_nc_05.value.ui64 = qede->intrSbPollNoChangeCnt[5]; 433 pStats->sb_poll_nc_06.value.ui64 = qede->intrSbPollNoChangeCnt[6]; 434 435 436 mutex_exit(&qede->kstat_lock); 437 438 return (0); 439 } 440 441 static int 442 qede_kstat_vport_stats_update(kstat_t *kstats, int rw) 443 { 444 445 qede_kstat_vport_stats_t *pStats = 446 (qede_kstat_vport_stats_t *)kstats->ks_data; 447 qede_t *qede = (qede_t *)kstats->ks_private; 448 struct ecore_dev * edev = &qede->edev; 449 struct ecore_eth_stats vstats; 450 451 452 if (rw == KSTAT_WRITE) { 453 return EACCES; 454 } 455 456 457 mutex_enter(&qede->kstat_lock); 458 459 memset(&vstats, 0, sizeof (struct ecore_eth_stats)); 460 if(qede->qede_state == QEDE_STATE_STARTED) { 461 ecore_get_vport_stats(edev, &vstats); 462 memcpy(&qede->save_stats, &vstats, 463 sizeof (struct ecore_eth_stats)); 464 } 465 466 pStats->rxUcastBytes.value.ui64 = vstats.common.rx_ucast_bytes; 467 pStats->rxMcastBytes.value.ui64 = vstats.common.rx_mcast_bytes; 468 pStats->rxBcastBytes.value.ui64 = vstats.common.rx_bcast_bytes; 469 pStats->rxUcastPkts.value.ui64 = vstats.common.rx_ucast_pkts; 470 pStats->rxMcastPkts.value.ui64 = vstats.common.rx_mcast_pkts; 471 pStats->rxBcastPkts.value.ui64 = vstats.common.rx_bcast_pkts; 472 pStats->txUcastBytes.value.ui64 = vstats.common.tx_ucast_bytes; 473 pStats->txMcastBytes.value.ui64 = vstats.common.tx_mcast_bytes; 474 pStats->txBcastBytes.value.ui64 = vstats.common.tx_bcast_bytes; 475 pStats->txUcastPkts.value.ui64 = vstats.common.tx_ucast_pkts; 476 pStats->txMcastPkts.value.ui64 = vstats.common.tx_mcast_pkts; 477 pStats->txBcastPkts.value.ui64 = vstats.common.tx_bcast_pkts; 478 pStats->rx64bytePkts.value.ui64 = vstats.common.rx_64_byte_packets; 479 pStats->rx127bytePkts.value.ui64 = 480 vstats.common.rx_65_to_127_byte_packets; 481 pStats->rx255bytePkts.value.ui64 = 482 vstats.common.rx_128_to_255_byte_packets; 483 pStats->rx511bytePkts.value.ui64 = 484 vstats.common.rx_256_to_511_byte_packets; 485 pStats->rx1023bytePkts.value.ui64 = 486 vstats.common.rx_512_to_1023_byte_packets; 487 pStats->rx1518bytePkts.value.ui64 = 488 vstats.common.rx_1024_to_1518_byte_packets; 489 pStats->rx1522bytePkts.value.ui64 = 490 vstats.bb.rx_1519_to_1522_byte_packets; 491 pStats->rx2047bytePkts.value.ui64 = 492 vstats.bb.rx_1519_to_2047_byte_packets; 493 pStats->rx4095bytePkts.value.ui64 = 494 vstats.bb.rx_2048_to_4095_byte_packets; 495 pStats->rx9216bytePkts.value.ui64 = 496 vstats.bb.rx_4096_to_9216_byte_packets; 497 pStats->rx16383bytePkts.value.ui64 = 498 vstats.bb.rx_9217_to_16383_byte_packets; 499 pStats->tx64bytePkts.value.ui64 = 500 vstats.common.tx_64_byte_packets; 501 pStats->tx64to127bytePkts.value.ui64 = 502 vstats.common.tx_65_to_127_byte_packets; 503 pStats->tx128to255bytePkts.value.ui64 = 504 vstats.common.tx_128_to_255_byte_packets; 505 pStats->tx256to511bytePkts.value.ui64 = 506 vstats.common.tx_256_to_511_byte_packets; 507 pStats->tx512to1023bytePkts.value.ui64 = 508 vstats.common.tx_512_to_1023_byte_packets; 509 pStats->tx1024to1518bytePkts.value.ui64 = 510 vstats.common.tx_1024_to_1518_byte_packets; 511 pStats->tx1519to2047bytePkts.value.ui64 = 512 vstats.bb.tx_1519_to_2047_byte_packets; 513 pStats->tx2048to4095bytePkts.value.ui64 = 514 vstats.bb.tx_2048_to_4095_byte_packets; 515 pStats->tx4096to9216bytePkts.value.ui64 = 516 vstats.bb.tx_4096_to_9216_byte_packets; 517 pStats->tx9217to16383bytePkts.value.ui64 = 518 vstats.bb.tx_9217_to_16383_byte_packets; 519 pStats->rxMacCtrlFrames.value.ui64 = 520 vstats.common.rx_mac_crtl_frames; 521 pStats->rxPauseFrames.value.ui64 = 522 vstats.common.rx_pause_frames; 523 pStats->txPauseFrames.value.ui64 = 524 vstats.common.tx_pause_frames; 525 pStats->rxCRCerrors.value.ui64 = 526 vstats.common.rx_crc_errors; 527 pStats->rxAlignErrors.value.ui64 = 528 vstats.common.rx_align_errors; 529 pStats->rxCarrierErrors.value.ui64 = 530 vstats.common.rx_carrier_errors; 531 pStats->rxOversizeErrors.value.ui64 = 532 vstats.common.rx_oversize_packets; 533 pStats->rxJabbers.value.ui64 = 534 vstats.common.rx_jabbers; 535 pStats->rxUndersizePkts.value.ui64 = 536 vstats.common.rx_undersize_packets; 537 pStats->rxFragments.value.ui64 = 538 vstats.common.rx_fragments; 539 pStats->txLpiEntryCnt.value.ui64 = 540 vstats.bb.tx_lpi_entry_count; 541 pStats->txTotalCollisions.value.ui64 = 542 vstats.bb.tx_total_collisions; 543 pStats->brbTruncates.value.ui64 = 544 vstats.common.brb_truncates; 545 pStats->noBuffDiscards.value.ui64 = 546 vstats.common.no_buff_discards; 547 pStats->mftagFilterDiscards.value.ui64 = 548 vstats.common.mftag_filter_discards; 549 pStats->macFilterDiscards.value.ui64 = 550 vstats.common.mac_filter_discards; 551 pStats->txErrDropPkts.value.ui64 = 552 vstats.common.tx_err_drop_pkts; 553 pStats->coalescedPkts.value.ui64 = 554 vstats.common.tpa_coalesced_pkts; 555 pStats->coalescedEvents.value.ui64 = 556 vstats.common.tpa_coalesced_events; 557 pStats->coalescedAbortsNum.value.ui64 = 558 vstats.common.tpa_aborts_num; 559 pStats->nonCoalescedPkts.value.ui64 = 560 vstats.common.tpa_not_coalesced_pkts; 561 pStats->coalescedBytes.value.ui64 = 562 vstats.common.tpa_coalesced_bytes; 563 564 mutex_exit(&qede->kstat_lock); 565 566 return (0); 567 } 568 569 static int 570 qede_kstat_rxq_update(kstat_t *kstats, int rw) 571 { 572 573 qede_kstat_rxq_t *pStats = (qede_kstat_rxq_t *)kstats->ks_data; 574 KstatRingMap *pMap = (KstatRingMap *)kstats->ks_private; 575 qede_t *qede = (qede_t *)pMap->qede; 576 int idx = pMap->idx; 577 struct ecore_dev *edev = &qede->edev; 578 qede_rx_ring_t *rx_ring = &qede->rx_array[idx]; 579 580 581 if (rw == KSTAT_WRITE) { 582 return EACCES; 583 } 584 585 586 mutex_enter(&qede->kstat_lock); 587 588 pStats->rxqBdTotal.value.ui64 = qede->rx_ring_size; 589 pStats->rcqBdTotal.value.ui64 = qede->rx_ring_size; 590 pStats->rxLowWater.value.ui64 = rx_ring->rx_low_buffer_threshold; 591 592 if(qede->qede_state == QEDE_STATE_STARTED) { 593 594 pStats->rxqBdLeft.value.ui64 = 595 ecore_chain_get_elem_left(&rx_ring->rx_bd_ring); 596 pStats->rxqBdPageCnt.value.ui64 = 597 ECORE_CHAIN_PAGE_CNT(qede->rx_ring_size, 598 sizeof (struct eth_rx_bd), ECORE_CHAIN_MODE_NEXT_PTR); 599 pStats->rxqBdsPerPage.value.ui64 = 600 ELEMS_PER_PAGE(sizeof (struct eth_rx_bd)); 601 pStats->rxqBdSize.value.ui64 = sizeof (struct eth_rx_bd); 602 pStats->rxqBdProdIdx.value.ui64 = 603 ecore_chain_get_prod_idx(&rx_ring->rx_bd_ring) & 604 (rx_ring->qede->rx_ring_size - 1); 605 pStats->rxqBdConsIdx.value.ui64 = 606 ecore_chain_get_cons_idx(&rx_ring->rx_bd_ring) & 607 (rx_ring->qede->rx_ring_size - 1); 608 pStats->rcqBdLeft.value.ui64 = 609 ecore_chain_get_elem_left(&rx_ring->rx_cqe_ring); 610 pStats->rcqBdPageCnt.value.ui64 = 611 ECORE_CHAIN_PAGE_CNT(qede->rx_ring_size, 612 sizeof (union eth_rx_cqe), ECORE_CHAIN_MODE_PBL); 613 pStats->rcqBdsPerPage.value.ui64 = 614 ELEMS_PER_PAGE(sizeof (union eth_rx_cqe)); 615 pStats->rcqBdSize.value.ui64 = sizeof (union eth_rx_cqe); 616 pStats->rcqBdProdIdx.value.ui64 = 617 ecore_chain_get_prod_idx(&rx_ring->rx_cqe_ring) & 618 (rx_ring->qede->rx_ring_size - 1); 619 pStats->rcqBdConsIdx.value.ui64 = 620 ecore_chain_get_cons_idx(&rx_ring->rx_cqe_ring) & 621 (rx_ring->qede->rx_ring_size - 1); 622 pStats->hwRcqConIdx.value.ui64 = 623 (rx_ring->hw_cons_ptr != NULL) ? 624 HOST_TO_LE_16(*rx_ring->hw_cons_ptr) & 625 (rx_ring->qede->rx_ring_size - 1): 0; 626 pStats->rxFreeDescs.value.ui64 = 627 rx_ring->rx_buf_area->passive_buf_list.num_entries; 628 pStats->rxActiveDescs.value.ui64 = 629 rx_ring->rx_buf_area->active_buf_list.num_entries; 630 pStats->rxBufUpInStack.value.ui64 = 631 rx_ring->rx_buf_area->buf_upstream; 632 pStats->rxCopyPkts.value.ui64 = 633 rx_ring->rx_copy_cnt; 634 pStats->rxDropPkts.value.ui64 = 635 rx_ring->rx_drop_cnt; 636 pStats->rxLowWaterCnt.value.ui64 = 637 rx_ring->rx_low_water_cnt; 638 pStats->inPollMode.value.ui64 = 639 rx_ring->fp->disabled_by_poll; 640 pStats->rxPollCnt.value.ui64 = 641 rx_ring->rx_poll_cnt;; 642 pStats->intrDisableCnt.value.ui64 = 643 rx_ring->intrDisableCnt; 644 pStats->intrEnableCnt.value.ui64 = 645 rx_ring->intrEnableCnt; 646 pStats->genNumber.value.ui64 = 647 rx_ring->mr_gen_num; 648 pStats->rxLroPkts.value.ui64 = 649 rx_ring->rx_lro_pkt_cnt; 650 pStats->rxRingTotalPkts.value.ui64 = 651 rx_ring->rx_pkt_cnt; 652 pStats->rxRingTotalBytes.value.ui64 = 653 rx_ring->rx_byte_cnt; 654 pStats->rxRegPkts.value.ui64 = 655 rx_ring->rx_reg_pkt_cnt; 656 pStats->rxJumboPkts.value.ui64 = 657 rx_ring->rx_jumbo_pkt_cnt; 658 659 } else { 660 661 pStats->rxqBdLeft.value.ui64 = 0; 662 pStats->rxqBdPageCnt.value.ui64 = 0; 663 pStats->rxqBdsPerPage.value.ui64 = 0; 664 pStats->rxqBdSize.value.ui64 = 0; 665 pStats->rxqBdProdIdx.value.ui64 = 0; 666 pStats->rxqBdConsIdx.value.ui64 = 0; 667 pStats->rcqBdLeft.value.ui64 = 0; 668 pStats->rcqBdPageCnt.value.ui64 = 0; 669 pStats->rcqBdsPerPage.value.ui64 = 0; 670 pStats->rcqBdSize.value.ui64 = 0; 671 pStats->rcqBdProdIdx.value.ui64 = 0; 672 pStats->rcqBdConsIdx.value.ui64 = 0; 673 pStats->hwRcqConIdx.value.ui64 = 0; 674 pStats->rxFreeDescs.value.ui64 = 0; 675 pStats->rxActiveDescs.value.ui64 = 0; 676 pStats->rxBufUpInStack.value.ui64 = 0; 677 pStats->rxCopyPkts.value.ui64 = 0; 678 pStats->rxDropPkts.value.ui64 = 0; 679 pStats->rxLowWaterCnt.value.ui64 = 0; 680 pStats->inPollMode.value.ui64 = 0; 681 pStats->rxPollCnt.value.ui64 = 0; 682 pStats->intrDisableCnt.value.ui64 = 0; 683 pStats->intrEnableCnt.value.ui64 = 0; 684 pStats->genNumber.value.ui64 = 0; 685 pStats->rxLroPkts.value.ui64 = 0; 686 pStats->rxRingTotalPkts.value.ui64 = 0; 687 pStats->rxRingTotalBytes.value.ui64 = 0; 688 pStats->rxRegPkts.value.ui64 = 0; 689 pStats->rxJumboPkts.value.ui64 = 0; 690 } 691 692 mutex_exit(&qede->kstat_lock); 693 return (0); 694 } 695 696 697 static int 698 qede_kstat_txq_update(kstat_t *kstats, int rw) 699 { 700 701 qede_kstat_txq_t *pStats = (qede_kstat_txq_t *)kstats->ks_data; 702 KstatRingMap *pMap = (KstatRingMap *)kstats->ks_private; 703 qede_t *qede = (qede_t *)pMap->qede; 704 int idx = pMap->idx; 705 struct ecore_dev * edev = &qede->edev; 706 qede_tx_ring_t *tx_ring = &qede->tx_array[0][idx]; 707 708 709 if (rw == KSTAT_WRITE) { 710 return EACCES; 711 } 712 mutex_enter(&qede->kstat_lock); 713 714 pStats->txBdTotal.value.ui64 = qede->tx_ring_size; 715 pStats->txBdSize.value.ui64 = sizeof (union eth_tx_bd_types); 716 pStats->txLowWater.value.ui64 = qede->tx_recycle_threshold; 717 718 if(qede->qede_state == QEDE_STATE_STARTED) { 719 720 pStats->txBdLeft.value.ui64 = 721 ecore_chain_get_elem_left(&tx_ring->tx_bd_ring); 722 pStats->txBdPageCnt.value.ui64 = 723 ECORE_CHAIN_PAGE_CNT(tx_ring->bd_ring_size, 724 sizeof (union eth_tx_bd_types), ECORE_CHAIN_MODE_PBL); 725 pStats->txBdsPerPage.value.ui64 = 726 ELEMS_PER_PAGE(sizeof (union eth_tx_bd_types)); 727 pStats->hwTxqConIdx.value.ui64 = 728 (tx_ring->hw_cons_ptr != NULL) ? 729 HOST_TO_LE_16(*tx_ring->hw_cons_ptr) & TX_RING_MASK : 0; 730 pStats->txBdProdIdx.value.ui64 = 731 ecore_chain_get_prod_idx(&tx_ring->tx_bd_ring) & TX_RING_MASK; 732 pStats->txBdConsIdx.value.ui64 = 733 ecore_chain_get_cons_idx(&tx_ring->tx_bd_ring) & TX_RING_MASK; 734 pStats->txRingPause.value.ui64 = 735 tx_ring->tx_ring_pause; 736 pStats->txDropPkts.value.ui64 = tx_ring->tx_pkt_dropped; 737 pStats->txCopyPkts.value.ui64 = tx_ring->tx_copy_count; 738 pStats->txBind.value.ui64 = tx_ring->tx_bind_count; 739 pStats->txBindFail.value.ui64 = tx_ring->tx_bind_fail; 740 pStats->txPremapped.value.ui64 = tx_ring->tx_premap_count; 741 pStats->txPremappedFail.value.ui64 = tx_ring->tx_premap_fail; 742 pStats->txTooManyCookies.value.ui64 = tx_ring->tx_too_many_cookies; 743 pStats->txPullupPkts.value.ui64 = tx_ring->tx_pullup_count; 744 pStats->txLsoPkts.value.ui64 = tx_ring->tx_lso_pkt_count; 745 pStats->txTooManyMblks.value.ui64 = tx_ring->tx_too_many_mblks; 746 pStats->txMappedPkts.value.ui64 = tx_ring->tx_mapped_pkts; 747 pStats->txRingTotalPkts.value.ui64 = tx_ring->tx_pkt_count; 748 pStats->txRingTotalBytes.value.ui64 = tx_ring->tx_byte_count; 749 pStats->txJumboPkts.value.ui64 = tx_ring->tx_jumbo_pkt_count; 750 751 752 } else { 753 754 755 pStats->txBdLeft.value.ui64 = 0; 756 pStats->txBdPageCnt.value.ui64 = 0; 757 pStats->txBdsPerPage.value.ui64 = 0; 758 pStats->hwTxqConIdx.value.ui64 = 0; 759 pStats->txBdProdIdx.value.ui64 = 0; 760 pStats->txBdConsIdx.value.ui64 = 0; 761 pStats->txRingPause.value.ui64 = 0; 762 pStats->txDropPkts.value.ui64 = 0; 763 pStats->txCopyPkts.value.ui64 = 0; 764 pStats->txBind.value.ui64 = 0; 765 pStats->txBindFail.value.ui64 = 0; 766 pStats->txPremapped.value.ui64 = 0; 767 pStats->txPremappedFail.value.ui64 = 0; 768 pStats->txTooManyCookies.value.ui64 = 0; 769 pStats->txPullupPkts.value.ui64 = 0; 770 pStats->txLsoPkts.value.ui64 = 0; 771 pStats->txTooManyMblks.value.ui64 = 0; 772 pStats->txMappedPkts.value.ui64 = 0; 773 pStats->txJumboPkts.value.ui64 = 0; 774 pStats->txRingTotalPkts.value.ui64 = 0; 775 pStats->txRingTotalBytes.value.ui64 = 0; 776 } 777 778 mutex_exit(&qede->kstat_lock); 779 return (0); 780 } 781 782 boolean_t 783 qede_kstat_init_rxq(qede_t *qede, int idx) 784 { 785 786 char buf[32]; 787 788 qede_kstat_rxq_t *pStatsRxq; 789 790 #define QEDE_KSTAT_RXQ(f, t) kstat_named_init(&pStatsRxq->f, #f, t) 791 792 snprintf(buf, sizeof (buf), "rxq%d", idx); 793 794 if ((qede->kstats_rxq[idx] = kstat_create("qede", 795 qede->instance, 796 buf, 797 "net", 798 KSTAT_TYPE_NAMED, 799 QEDE_KSTAT_RXQ_SIZE, 800 0)) == NULL) 801 { 802 /*BnxeLogWarn(qede, "Failed to create rxq%d kstat", idx);*/ 803 cmn_err(CE_WARN, "Failed to create rxq%d kstat", idx); 804 return (B_FALSE); 805 } 806 pStatsRxq = (qede_kstat_rxq_t *)qede->kstats_rxq[idx]->ks_data; 807 808 QEDE_KSTAT_RXQ(rxqBdTotal, KSTAT_DATA_UINT64); 809 QEDE_KSTAT_RXQ(rxqBdLeft, KSTAT_DATA_UINT64); 810 QEDE_KSTAT_RXQ(rxqBdPageCnt, KSTAT_DATA_UINT64); 811 QEDE_KSTAT_RXQ(rxqBdsPerPage, KSTAT_DATA_UINT64); 812 QEDE_KSTAT_RXQ(rxqBdSize, KSTAT_DATA_UINT64); 813 QEDE_KSTAT_RXQ(rxqBdProdIdx, KSTAT_DATA_UINT64); 814 QEDE_KSTAT_RXQ(rxqBdConsIdx, KSTAT_DATA_UINT64); 815 QEDE_KSTAT_RXQ(rcqBdTotal, KSTAT_DATA_UINT64); 816 QEDE_KSTAT_RXQ(rcqBdLeft, KSTAT_DATA_UINT64); 817 QEDE_KSTAT_RXQ(rcqBdPageCnt, KSTAT_DATA_UINT64); 818 QEDE_KSTAT_RXQ(rcqBdsPerPage, KSTAT_DATA_UINT64); 819 QEDE_KSTAT_RXQ(rcqBdSize, KSTAT_DATA_UINT64); 820 QEDE_KSTAT_RXQ(rcqBdProdIdx, KSTAT_DATA_UINT64); 821 QEDE_KSTAT_RXQ(rcqBdConsIdx, KSTAT_DATA_UINT64); 822 QEDE_KSTAT_RXQ(hwRcqConIdx, KSTAT_DATA_UINT64); 823 QEDE_KSTAT_RXQ(rxFreeDescs, KSTAT_DATA_UINT64); 824 QEDE_KSTAT_RXQ(rxActiveDescs, KSTAT_DATA_UINT64); 825 QEDE_KSTAT_RXQ(rxCopyPkts, KSTAT_DATA_UINT64); 826 QEDE_KSTAT_RXQ(rxDropPkts, KSTAT_DATA_UINT64); 827 QEDE_KSTAT_RXQ(rxBufUpInStack, KSTAT_DATA_UINT64); 828 QEDE_KSTAT_RXQ(rxLowWater, KSTAT_DATA_UINT64); 829 QEDE_KSTAT_RXQ(rxLowWaterCnt, KSTAT_DATA_UINT64); 830 QEDE_KSTAT_RXQ(inPollMode, KSTAT_DATA_UINT64); 831 QEDE_KSTAT_RXQ(rxPollCnt, KSTAT_DATA_UINT64); 832 QEDE_KSTAT_RXQ(intrDisableCnt, KSTAT_DATA_UINT64); 833 QEDE_KSTAT_RXQ(intrEnableCnt, KSTAT_DATA_UINT64); 834 QEDE_KSTAT_RXQ(genNumber, KSTAT_DATA_UINT64); 835 QEDE_KSTAT_RXQ(rxRegPkts, KSTAT_DATA_UINT64); 836 QEDE_KSTAT_RXQ(rxJumboPkts, KSTAT_DATA_UINT64); 837 QEDE_KSTAT_RXQ(rxLroPkts, KSTAT_DATA_UINT64); 838 QEDE_KSTAT_RXQ(rxRingTotalPkts, KSTAT_DATA_UINT64); 839 QEDE_KSTAT_RXQ(rxRingTotalBytes, KSTAT_DATA_UINT64); 840 841 842 qede->kstats_rxq_map[idx].idx = idx; 843 qede->kstats_rxq_map[idx].qede = qede; 844 845 qede->kstats_rxq[idx]->ks_update = qede_kstat_rxq_update; 846 qede->kstats_rxq[idx]->ks_private = (void *)&qede->kstats_rxq_map[idx]; 847 848 kstat_install(qede->kstats_rxq[idx]); 849 850 return (B_TRUE); 851 } 852 853 854 boolean_t 855 qede_kstat_init_txq(qede_t *qede, int idx) 856 { 857 char buf[32]; 858 859 qede_kstat_txq_t *pStatsTxq; 860 861 #define QEDE_KSTAT_TXQ(f, t) kstat_named_init(&pStatsTxq->f, #f, t) 862 863 snprintf(buf, sizeof (buf), "txq%d", idx); 864 865 if ((qede->kstats_txq[idx] = kstat_create("qede", 866 qede->instance, 867 buf, 868 "net", 869 KSTAT_TYPE_NAMED, 870 QEDE_KSTAT_TXQ_SIZE, 871 0)) == NULL) { 872 /*BnxeLogWarn(qede, "Failed to create txq%d kstat", idx);*/ 873 cmn_err(CE_WARN, "Failed to create txq%d kstat", idx); 874 return (B_FALSE); 875 } 876 877 878 pStatsTxq = (qede_kstat_txq_t *)qede->kstats_txq[idx]->ks_data; 879 880 QEDE_KSTAT_TXQ(txBdTotal, KSTAT_DATA_UINT64); 881 QEDE_KSTAT_TXQ(txBdLeft, KSTAT_DATA_UINT64); 882 QEDE_KSTAT_TXQ(txBdPageCnt, KSTAT_DATA_UINT64); 883 QEDE_KSTAT_TXQ(txBdsPerPage, KSTAT_DATA_UINT64); 884 QEDE_KSTAT_TXQ(txBdSize, KSTAT_DATA_UINT64); 885 QEDE_KSTAT_TXQ(hwTxqConIdx, KSTAT_DATA_UINT64); 886 QEDE_KSTAT_TXQ(txBdProdIdx, KSTAT_DATA_UINT64); 887 QEDE_KSTAT_TXQ(txBdConsIdx, KSTAT_DATA_UINT64); 888 QEDE_KSTAT_TXQ(txLowWater, KSTAT_DATA_UINT64); 889 QEDE_KSTAT_TXQ(txDropPkts, KSTAT_DATA_UINT64); 890 QEDE_KSTAT_TXQ(txCopyPkts, KSTAT_DATA_UINT64); 891 QEDE_KSTAT_TXQ(txRingPause, KSTAT_DATA_UINT64); 892 QEDE_KSTAT_TXQ(txDropPkts, KSTAT_DATA_UINT64); 893 QEDE_KSTAT_TXQ(txBind, KSTAT_DATA_UINT64); 894 QEDE_KSTAT_TXQ(txBindFail, KSTAT_DATA_UINT64); 895 QEDE_KSTAT_TXQ(txPremapped, KSTAT_DATA_UINT64); 896 QEDE_KSTAT_TXQ(txPremappedFail, KSTAT_DATA_UINT64); 897 QEDE_KSTAT_TXQ(txTooManyCookies, KSTAT_DATA_UINT64); 898 QEDE_KSTAT_TXQ(txPullupPkts, KSTAT_DATA_UINT64); 899 QEDE_KSTAT_TXQ(txLsoPkts, KSTAT_DATA_UINT64); 900 QEDE_KSTAT_TXQ(txTooManyMblks, KSTAT_DATA_UINT64); 901 QEDE_KSTAT_TXQ(txMappedPkts, KSTAT_DATA_UINT64); 902 QEDE_KSTAT_TXQ(txJumboPkts, KSTAT_DATA_UINT64); 903 QEDE_KSTAT_TXQ(txRingTotalPkts, KSTAT_DATA_UINT64); 904 QEDE_KSTAT_TXQ(txRingTotalBytes, KSTAT_DATA_UINT64); 905 906 qede->kstats_txq_map[idx].idx = idx; 907 qede->kstats_txq_map[idx].qede = qede; 908 909 qede->kstats_txq[idx]->ks_update = qede_kstat_txq_update; 910 qede->kstats_txq[idx]->ks_private = (void *)&qede->kstats_txq_map[idx]; 911 912 kstat_install(qede->kstats_txq[idx]); 913 914 return (B_TRUE); 915 916 } 917 918 boolean_t 919 qede_kstat_init(qede_t *qede) 920 { 921 qede_kstat_t *pStats; 922 qede_kstat_link_t *pStatsLink; 923 qede_kstat_intr_t *pStatsIntr; 924 qede_kstat_vport_stats_t *pStatsVport; 925 int i; 926 927 #define QEDE_KSTAT(f, t) kstat_named_init(&pStats->f, #f, t) 928 #define QEDE_KSTAT_LINK(f, t) kstat_named_init(&pStatsLink->f, #f, t) 929 #define QEDE_KSTAT_INTR(f, t) kstat_named_init(&pStatsIntr->f, #f, t) 930 #define QEDE_KSTAT_VPORT(f,t) kstat_named_init(&pStatsVport->f, #f, t) 931 932 933 if ((qede->kstats = kstat_create("qede", 934 qede->instance, 935 "stats", 936 "net", 937 KSTAT_TYPE_NAMED, 938 QEDE_KSTAT_SIZE, 939 0)) == NULL) { 940 /*QedeLogWarn(qede, "Failed to create kstat");*/ 941 cmn_err(CE_WARN, "Failed to create kstat"); 942 return (B_FALSE); 943 } 944 945 pStats = (qede_kstat_t *)qede->kstats->ks_data; 946 QEDE_KSTAT(qede_hi, KSTAT_DATA_CHAR); 947 QEDE_KSTAT(qede_lo, KSTAT_DATA_CHAR); 948 QEDE_KSTAT(version, KSTAT_DATA_CHAR); 949 QEDE_KSTAT(versionFW, KSTAT_DATA_CHAR); 950 QEDE_KSTAT(versionMFW, KSTAT_DATA_CHAR); 951 QEDE_KSTAT(chipID, KSTAT_DATA_CHAR); 952 QEDE_KSTAT(chipName, KSTAT_DATA_CHAR); 953 QEDE_KSTAT(devBDF, KSTAT_DATA_CHAR); 954 QEDE_KSTAT(devID, KSTAT_DATA_CHAR); 955 QEDE_KSTAT(multiFunction, KSTAT_DATA_CHAR); 956 QEDE_KSTAT(multiFunctionVnics, KSTAT_DATA_UINT64); 957 QEDE_KSTAT(macAddr, KSTAT_DATA_CHAR); 958 QEDE_KSTAT(hwInitDone, KSTAT_DATA_UINT64); 959 QEDE_KSTAT(numVports, KSTAT_DATA_UINT64); 960 QEDE_KSTAT(vportID, KSTAT_DATA_UINT64); 961 QEDE_KSTAT(intrAlloc, KSTAT_DATA_CHAR); 962 QEDE_KSTAT(intrFired, KSTAT_DATA_UINT64); 963 QEDE_KSTAT(lroEnabled, KSTAT_DATA_UINT64); 964 QEDE_KSTAT(lsoEnabled, KSTAT_DATA_UINT64); 965 QEDE_KSTAT(jumboEnabled, KSTAT_DATA_UINT64); 966 QEDE_KSTAT(txTotalPkts, KSTAT_DATA_UINT64); 967 QEDE_KSTAT(txTotalBytes, KSTAT_DATA_UINT64); 968 QEDE_KSTAT(txTotalDiscards, KSTAT_DATA_UINT64); 969 QEDE_KSTAT(rxTotalPkts, KSTAT_DATA_UINT64); 970 QEDE_KSTAT(rxTotalBytes, KSTAT_DATA_UINT64); 971 QEDE_KSTAT(rxTotalDiscards, KSTAT_DATA_UINT64); 972 QEDE_KSTAT(allocbFailures, KSTAT_DATA_UINT64); 973 974 qede->kstats->ks_update = qede_kstat_update; 975 qede->kstats->ks_private = (void *)qede; 976 977 kstat_install(qede->kstats); 978 979 /****************************************************************/ 980 if ((qede->kstats_link = kstat_create("qede", 981 qede->instance, 982 "link", 983 "net", 984 KSTAT_TYPE_NAMED, 985 QEDE_KSTAT_LINK_SIZE, 986 0)) == NULL) { 987 /*BnxeLogWarn(qede, "Failed to create link kstat");*/ 988 cmn_err(CE_WARN, "Failed to create link kstat"); 989 qede_kstat_fini(qede); 990 return (B_FALSE); 991 } 992 993 pStatsLink = (qede_kstat_link_t *)qede->kstats_link->ks_data; 994 995 QEDE_KSTAT_LINK(vportID, KSTAT_DATA_UINT64); 996 QEDE_KSTAT_LINK(uptime, KSTAT_DATA_UINT64); 997 QEDE_KSTAT_LINK(mtuL2, KSTAT_DATA_UINT64); 998 QEDE_KSTAT_LINK(speed, KSTAT_DATA_UINT64); 999 QEDE_KSTAT_LINK(link, KSTAT_DATA_UINT64); 1000 QEDE_KSTAT_LINK(duplex, KSTAT_DATA_UINT64); 1001 QEDE_KSTAT_LINK(pauseRx, KSTAT_DATA_UINT64); 1002 QEDE_KSTAT_LINK(pauseTx, KSTAT_DATA_UINT64); 1003 1004 qede->kstats_link->ks_update = qede_kstat_link_update; 1005 qede->kstats_link->ks_private = (void *)qede; 1006 1007 kstat_install(qede->kstats_link); 1008 1009 /****************************************************************/ 1010 1011 if ((qede->kstats_intr = kstat_create("qede", 1012 qede->instance, 1013 "intr", 1014 "net", 1015 KSTAT_TYPE_NAMED, 1016 QEDE_KSTAT_INTR_SIZE, 1017 0)) == NULL) { 1018 /*BnxeLogWarn(qede, "Failed to create intr kstat");*/ 1019 cmn_err(CE_WARN, "Failed to create intr kstat"); 1020 qede_kstat_fini(qede); 1021 return (B_FALSE); 1022 } 1023 1024 1025 pStatsIntr = (qede_kstat_intr_t *)qede->kstats_intr->ks_data; 1026 1027 QEDE_KSTAT_INTR(intrAlloc, KSTAT_DATA_CHAR); 1028 QEDE_KSTAT_INTR(intrFired, KSTAT_DATA_UINT64); 1029 QEDE_KSTAT_INTR(sb_00, KSTAT_DATA_UINT64); 1030 QEDE_KSTAT_INTR(sb_01, KSTAT_DATA_UINT64); 1031 QEDE_KSTAT_INTR(sb_02, KSTAT_DATA_UINT64); 1032 QEDE_KSTAT_INTR(sb_03, KSTAT_DATA_UINT64); 1033 QEDE_KSTAT_INTR(sb_04, KSTAT_DATA_UINT64); 1034 QEDE_KSTAT_INTR(sb_05, KSTAT_DATA_UINT64); 1035 QEDE_KSTAT_INTR(sb_06, KSTAT_DATA_UINT64); 1036 QEDE_KSTAT_INTR(sb_nc_00, KSTAT_DATA_UINT64); 1037 QEDE_KSTAT_INTR(sb_nc_01, KSTAT_DATA_UINT64); 1038 QEDE_KSTAT_INTR(sb_nc_02, KSTAT_DATA_UINT64); 1039 QEDE_KSTAT_INTR(sb_nc_03, KSTAT_DATA_UINT64); 1040 QEDE_KSTAT_INTR(sb_nc_04, KSTAT_DATA_UINT64); 1041 QEDE_KSTAT_INTR(sb_nc_05, KSTAT_DATA_UINT64); 1042 QEDE_KSTAT_INTR(sb_nc_06, KSTAT_DATA_UINT64); 1043 QEDE_KSTAT_INTR(sb_poll_00, KSTAT_DATA_UINT64); 1044 QEDE_KSTAT_INTR(sb_poll_01, KSTAT_DATA_UINT64); 1045 QEDE_KSTAT_INTR(sb_poll_02, KSTAT_DATA_UINT64); 1046 QEDE_KSTAT_INTR(sb_poll_03, KSTAT_DATA_UINT64); 1047 QEDE_KSTAT_INTR(sb_poll_04, KSTAT_DATA_UINT64); 1048 QEDE_KSTAT_INTR(sb_poll_05, KSTAT_DATA_UINT64); 1049 QEDE_KSTAT_INTR(sb_poll_06, KSTAT_DATA_UINT64); 1050 QEDE_KSTAT_INTR(sb_poll_nc_00, KSTAT_DATA_UINT64); 1051 QEDE_KSTAT_INTR(sb_poll_nc_01, KSTAT_DATA_UINT64); 1052 QEDE_KSTAT_INTR(sb_poll_nc_02, KSTAT_DATA_UINT64); 1053 QEDE_KSTAT_INTR(sb_poll_nc_03, KSTAT_DATA_UINT64); 1054 QEDE_KSTAT_INTR(sb_poll_nc_04, KSTAT_DATA_UINT64); 1055 QEDE_KSTAT_INTR(sb_poll_nc_05, KSTAT_DATA_UINT64); 1056 QEDE_KSTAT_INTR(sb_poll_nc_06, KSTAT_DATA_UINT64); 1057 1058 qede->kstats_intr->ks_update = qede_kstat_intr_update; 1059 qede->kstats_intr->ks_private = (void *)qede; 1060 1061 kstat_install(qede->kstats_intr); 1062 1063 1064 /****************************************************************/ 1065 1066 if ((qede->kstats_vport = kstat_create("qede", 1067 qede->instance, 1068 "L2Stats", 1069 "net", 1070 KSTAT_TYPE_NAMED, 1071 QEDE_KSTAT_VPORT_STATS_SIZE, 1072 0)) == NULL) { 1073 /*BnxeLogWarn(qede, "Failed to create l2chip kstat");*/ 1074 cmn_err(CE_WARN, "Failed to create L2Stats kstat"); 1075 qede_kstat_fini(qede); 1076 return (B_FALSE); 1077 } 1078 1079 pStatsVport = (qede_kstat_vport_stats_t *)qede->kstats_vport->ks_data; 1080 1081 QEDE_KSTAT_VPORT(rxUcastBytes, KSTAT_DATA_UINT64); 1082 QEDE_KSTAT_VPORT(rxMcastBytes, KSTAT_DATA_UINT64); 1083 QEDE_KSTAT_VPORT(rxBcastBytes, KSTAT_DATA_UINT64); 1084 QEDE_KSTAT_VPORT(rxUcastPkts, KSTAT_DATA_UINT64); 1085 QEDE_KSTAT_VPORT(rxMcastPkts, KSTAT_DATA_UINT64); 1086 QEDE_KSTAT_VPORT(rxBcastPkts, KSTAT_DATA_UINT64); 1087 QEDE_KSTAT_VPORT(txUcastBytes, KSTAT_DATA_UINT64); 1088 QEDE_KSTAT_VPORT(txMcastBytes, KSTAT_DATA_UINT64); 1089 QEDE_KSTAT_VPORT(txBcastBytes, KSTAT_DATA_UINT64); 1090 QEDE_KSTAT_VPORT(txUcastPkts, KSTAT_DATA_UINT64); 1091 QEDE_KSTAT_VPORT(txMcastPkts, KSTAT_DATA_UINT64); 1092 QEDE_KSTAT_VPORT(txBcastPkts, KSTAT_DATA_UINT64); 1093 QEDE_KSTAT_VPORT(rx64bytePkts, KSTAT_DATA_UINT64); 1094 QEDE_KSTAT_VPORT(rx127bytePkts, KSTAT_DATA_UINT64); 1095 QEDE_KSTAT_VPORT(rx255bytePkts, KSTAT_DATA_UINT64); 1096 QEDE_KSTAT_VPORT(rx511bytePkts, KSTAT_DATA_UINT64); 1097 QEDE_KSTAT_VPORT(rx1023bytePkts, KSTAT_DATA_UINT64); 1098 QEDE_KSTAT_VPORT(rx1518bytePkts, KSTAT_DATA_UINT64); 1099 QEDE_KSTAT_VPORT(rx1518bytePkts, KSTAT_DATA_UINT64); 1100 QEDE_KSTAT_VPORT(rx1522bytePkts, KSTAT_DATA_UINT64); 1101 QEDE_KSTAT_VPORT(rx2047bytePkts, KSTAT_DATA_UINT64); 1102 QEDE_KSTAT_VPORT(rx4095bytePkts, KSTAT_DATA_UINT64); 1103 QEDE_KSTAT_VPORT(rx9216bytePkts, KSTAT_DATA_UINT64); 1104 QEDE_KSTAT_VPORT(rx16383bytePkts, KSTAT_DATA_UINT64); 1105 QEDE_KSTAT_VPORT(tx64bytePkts, KSTAT_DATA_UINT64); 1106 QEDE_KSTAT_VPORT(tx64to127bytePkts, KSTAT_DATA_UINT64); 1107 QEDE_KSTAT_VPORT(tx128to255bytePkts, KSTAT_DATA_UINT64); 1108 QEDE_KSTAT_VPORT(tx256to511bytePkts, KSTAT_DATA_UINT64); 1109 QEDE_KSTAT_VPORT(tx512to1023bytePkts, KSTAT_DATA_UINT64); 1110 QEDE_KSTAT_VPORT(tx1024to1518bytePkts, KSTAT_DATA_UINT64); 1111 QEDE_KSTAT_VPORT(tx1519to2047bytePkts, KSTAT_DATA_UINT64); 1112 QEDE_KSTAT_VPORT(tx2048to4095bytePkts, KSTAT_DATA_UINT64); 1113 QEDE_KSTAT_VPORT(tx4096to9216bytePkts, KSTAT_DATA_UINT64); 1114 QEDE_KSTAT_VPORT(tx9217to16383bytePkts, KSTAT_DATA_UINT64); 1115 QEDE_KSTAT_VPORT(rxMacCtrlFrames, KSTAT_DATA_UINT64); 1116 QEDE_KSTAT_VPORT(rxPauseFrames, KSTAT_DATA_UINT64); 1117 QEDE_KSTAT_VPORT(txPauseFrames, KSTAT_DATA_UINT64); 1118 QEDE_KSTAT_VPORT(rxCRCerrors, KSTAT_DATA_UINT64); 1119 QEDE_KSTAT_VPORT(rxAlignErrors, KSTAT_DATA_UINT64); 1120 QEDE_KSTAT_VPORT(rxCarrierErrors, KSTAT_DATA_UINT64); 1121 QEDE_KSTAT_VPORT(rxOversizeErrors, KSTAT_DATA_UINT64); 1122 QEDE_KSTAT_VPORT(rxJabbers, KSTAT_DATA_UINT64); 1123 QEDE_KSTAT_VPORT(rxUndersizePkts, KSTAT_DATA_UINT64); 1124 QEDE_KSTAT_VPORT(rxFragments, KSTAT_DATA_UINT64); 1125 QEDE_KSTAT_VPORT(txLpiEntryCnt, KSTAT_DATA_UINT64); 1126 QEDE_KSTAT_VPORT(txTotalCollisions, KSTAT_DATA_UINT64); 1127 QEDE_KSTAT_VPORT(brbTruncates, KSTAT_DATA_UINT64); 1128 1129 QEDE_KSTAT_VPORT(noBuffDiscards, KSTAT_DATA_UINT64); 1130 QEDE_KSTAT_VPORT(mftagFilterDiscards, KSTAT_DATA_UINT64); 1131 QEDE_KSTAT_VPORT(macFilterDiscards, KSTAT_DATA_UINT64); 1132 QEDE_KSTAT_VPORT(txErrDropPkts, KSTAT_DATA_UINT64); 1133 QEDE_KSTAT_VPORT(coalescedPkts, KSTAT_DATA_UINT64); 1134 QEDE_KSTAT_VPORT(coalescedEvents, KSTAT_DATA_UINT64); 1135 QEDE_KSTAT_VPORT(coalescedAbortsNum, KSTAT_DATA_UINT64); 1136 QEDE_KSTAT_VPORT(nonCoalescedPkts, KSTAT_DATA_UINT64); 1137 QEDE_KSTAT_VPORT(coalescedBytes, KSTAT_DATA_UINT64); 1138 1139 qede->kstats_vport->ks_update = qede_kstat_vport_stats_update; 1140 qede->kstats_vport->ks_private = (void *)qede; 1141 1142 kstat_install(qede->kstats_vport); 1143 for (i = 0; i < qede->num_fp; i++) { 1144 if(!qede_kstat_init_rxq(qede,i)) 1145 { 1146 qede_kstat_fini(qede); 1147 return (B_FALSE); 1148 } 1149 if(!qede_kstat_init_txq(qede,i)) 1150 { 1151 qede_kstat_fini(qede); 1152 return (B_FALSE); 1153 } 1154 1155 } 1156 1157 return (B_TRUE); 1158 1159 } 1160 1161 void 1162 qede_kstat_fini(qede_t *qede) 1163 { 1164 int i; 1165 1166 if(qede->kstats) { 1167 kstat_delete(qede->kstats); 1168 qede->kstats = NULL; 1169 } 1170 if(qede->kstats_link) { 1171 kstat_delete(qede->kstats_link); 1172 qede->kstats_link = NULL; 1173 } 1174 if(qede->kstats_intr) { 1175 kstat_delete(qede->kstats_intr); 1176 qede->kstats_intr = NULL; 1177 } 1178 if(qede->kstats_vport) { 1179 kstat_delete(qede->kstats_vport); 1180 qede->kstats_vport = NULL; 1181 } 1182 1183 1184 for (i = 0; i < qede->num_fp; i++) { 1185 if(qede->kstats_rxq[i]) { 1186 kstat_delete(qede->kstats_rxq[i]); 1187 qede->kstats_rxq[i] = NULL; 1188 } 1189 qede->kstats_rxq_map[i].idx = 0; 1190 qede->kstats_rxq_map[i].qede = NULL; 1191 if(qede->kstats_txq[i]) { 1192 kstat_delete(qede->kstats_txq[i]); 1193 qede->kstats_txq[i] = NULL; 1194 } 1195 qede->kstats_txq_map[i].idx = 0; 1196 qede->kstats_txq_map[i].qede = NULL; 1197 } 1198 } 1199