1 /* 2 * This file is provided under a CDDLv1 license. When using or 3 * redistributing this file, you may do so under this license. 4 * In redistributing this file this license must be included 5 * and no other modification of this header file is permitted. 6 * 7 * CDDL LICENSE SUMMARY 8 * 9 * Copyright(c) 1999 - 2009 Intel Corporation. All rights reserved. 10 * 11 * The contents of this file are subject to the terms of Version 12 * 1.0 of the Common Development and Distribution License (the "License"). 13 * 14 * You should have received a copy of the License with this software. 15 * You can obtain a copy of the License at 16 * http://www.opensolaris.org/os/licensing. 17 * See the License for the specific language governing permissions 18 * and limitations under the License. 19 */ 20 21 /* 22 * Copyright 2009 Sun Microsystems, Inc. All rights reserved. 23 * Use is subject to license terms. 24 */ 25 26 /* 27 * ********************************************************************** 28 * * 29 * Module Name: e1000g_stat.c * 30 * * 31 * Abstract: Functions for processing statistics * 32 * * 33 * ********************************************************************** 34 */ 35 #include "e1000g_sw.h" 36 #include "e1000g_debug.h" 37 38 static int e1000g_update_stats(kstat_t *ksp, int rw); 39 static uint32_t e1000g_read_phy_stat(struct e1000_hw *hw, int reg); 40 41 /* 42 * e1000_tbi_adjust_stats 43 * 44 * Adjusts statistic counters when a frame is accepted 45 * under the TBI workaround. This function has been 46 * adapted for Solaris from shared code. 47 */ 48 void 49 e1000_tbi_adjust_stats(struct e1000g *Adapter, 50 uint32_t frame_len, uint8_t *mac_addr) 51 { 52 uint32_t carry_bit; 53 p_e1000g_stat_t e1000g_ksp; 54 55 e1000g_ksp = (p_e1000g_stat_t)Adapter->e1000g_ksp->ks_data; 56 57 /* First adjust the frame length */ 58 frame_len--; 59 60 /* 61 * We need to adjust the statistics counters, since the hardware 62 * counters overcount this packet as a CRC error and undercount 63 * the packet as a good packet 64 */ 65 /* This packet should not be counted as a CRC error */ 66 e1000g_ksp->Crcerrs.value.ul--; 67 /* This packet does count as a Good Packet Received */ 68 e1000g_ksp->Gprc.value.ul++; 69 70 /* 71 * Adjust the Good Octets received counters 72 */ 73 carry_bit = 0x80000000 & e1000g_ksp->Gorl.value.ul; 74 e1000g_ksp->Gorl.value.ul += frame_len; 75 /* 76 * If the high bit of Gorcl (the low 32 bits of the Good Octets 77 * Received Count) was one before the addition, 78 * AND it is zero after, then we lost the carry out, 79 * need to add one to Gorch (Good Octets Received Count High). 80 * This could be simplified if all environments supported 81 * 64-bit integers. 82 */ 83 if (carry_bit && ((e1000g_ksp->Gorl.value.ul & 0x80000000) == 0)) { 84 e1000g_ksp->Gorh.value.ul++; 85 } 86 /* 87 * Is this a broadcast or multicast? Check broadcast first, 88 * since the test for a multicast frame will test positive on 89 * a broadcast frame. 90 */ 91 if ((mac_addr[0] == (uint8_t)0xff) && 92 (mac_addr[1] == (uint8_t)0xff)) { 93 /* 94 * Broadcast packet 95 */ 96 e1000g_ksp->Bprc.value.ul++; 97 } else if (*mac_addr & 0x01) { 98 /* 99 * Multicast packet 100 */ 101 e1000g_ksp->Mprc.value.ul++; 102 } 103 104 if (frame_len == Adapter->max_frame_size) { 105 /* 106 * In this case, the hardware has overcounted the number of 107 * oversize frames. 108 */ 109 if (e1000g_ksp->Roc.value.ul > 0) 110 e1000g_ksp->Roc.value.ul--; 111 } 112 113 #ifdef E1000G_DEBUG 114 /* 115 * Adjust the bin counters when the extra byte put the frame in the 116 * wrong bin. Remember that the frame_len was adjusted above. 117 */ 118 if (frame_len == 64) { 119 e1000g_ksp->Prc64.value.ul++; 120 e1000g_ksp->Prc127.value.ul--; 121 } else if (frame_len == 127) { 122 e1000g_ksp->Prc127.value.ul++; 123 e1000g_ksp->Prc255.value.ul--; 124 } else if (frame_len == 255) { 125 e1000g_ksp->Prc255.value.ul++; 126 e1000g_ksp->Prc511.value.ul--; 127 } else if (frame_len == 511) { 128 e1000g_ksp->Prc511.value.ul++; 129 e1000g_ksp->Prc1023.value.ul--; 130 } else if (frame_len == 1023) { 131 e1000g_ksp->Prc1023.value.ul++; 132 e1000g_ksp->Prc1522.value.ul--; 133 } else if (frame_len == 1522) { 134 e1000g_ksp->Prc1522.value.ul++; 135 } 136 #endif 137 } 138 139 140 /* 141 * e1000g_update_stats - update driver private kstat counters 142 * 143 * This routine will dump and reset the e1000's internal 144 * statistics counters. The current stats dump values will 145 * be sent to the kernel status area. 146 */ 147 static int 148 e1000g_update_stats(kstat_t *ksp, int rw) 149 { 150 struct e1000g *Adapter; 151 struct e1000_hw *hw; 152 p_e1000g_stat_t e1000g_ksp; 153 e1000g_tx_ring_t *tx_ring; 154 e1000g_rx_ring_t *rx_ring; 155 #ifdef E1000G_DEBUG 156 e1000g_rx_data_t *rx_data; 157 #endif 158 uint64_t val; 159 uint32_t low_val, high_val; 160 161 if (rw == KSTAT_WRITE) 162 return (EACCES); 163 164 Adapter = (struct e1000g *)ksp->ks_private; 165 ASSERT(Adapter != NULL); 166 e1000g_ksp = (p_e1000g_stat_t)ksp->ks_data; 167 ASSERT(e1000g_ksp != NULL); 168 hw = &Adapter->shared; 169 170 tx_ring = Adapter->tx_ring; 171 rx_ring = Adapter->rx_ring; 172 #ifdef E1000G_DEBUG 173 rx_data = rx_ring->rx_data; 174 #endif 175 176 rw_enter(&Adapter->chip_lock, RW_WRITER); 177 178 e1000g_ksp->link_speed.value.ul = Adapter->link_speed; 179 e1000g_ksp->reset_count.value.ul = Adapter->reset_count; 180 181 e1000g_ksp->rx_error.value.ul = rx_ring->stat_error; 182 e1000g_ksp->rx_allocb_fail.value.ul = rx_ring->stat_allocb_fail; 183 e1000g_ksp->rx_size_error.value.ul = rx_ring->stat_size_error; 184 185 e1000g_ksp->tx_no_swpkt.value.ul = tx_ring->stat_no_swpkt; 186 e1000g_ksp->tx_no_desc.value.ul = tx_ring->stat_no_desc; 187 e1000g_ksp->tx_send_fail.value.ul = tx_ring->stat_send_fail; 188 e1000g_ksp->tx_reschedule.value.ul = tx_ring->stat_reschedule; 189 e1000g_ksp->tx_over_size.value.ul = tx_ring->stat_over_size; 190 191 #ifdef E1000G_DEBUG 192 e1000g_ksp->rx_none.value.ul = rx_ring->stat_none; 193 e1000g_ksp->rx_multi_desc.value.ul = rx_ring->stat_multi_desc; 194 e1000g_ksp->rx_no_freepkt.value.ul = rx_ring->stat_no_freepkt; 195 if (rx_data != NULL) 196 e1000g_ksp->rx_avail_freepkt.value.ul = rx_data->avail_freepkt; 197 198 e1000g_ksp->tx_under_size.value.ul = tx_ring->stat_under_size; 199 e1000g_ksp->tx_exceed_frags.value.ul = tx_ring->stat_exceed_frags; 200 e1000g_ksp->tx_empty_frags.value.ul = tx_ring->stat_empty_frags; 201 e1000g_ksp->tx_recycle.value.ul = tx_ring->stat_recycle; 202 e1000g_ksp->tx_recycle_intr.value.ul = tx_ring->stat_recycle_intr; 203 e1000g_ksp->tx_recycle_retry.value.ul = tx_ring->stat_recycle_retry; 204 e1000g_ksp->tx_recycle_none.value.ul = tx_ring->stat_recycle_none; 205 e1000g_ksp->tx_copy.value.ul = tx_ring->stat_copy; 206 e1000g_ksp->tx_bind.value.ul = tx_ring->stat_bind; 207 e1000g_ksp->tx_multi_copy.value.ul = tx_ring->stat_multi_copy; 208 e1000g_ksp->tx_multi_cookie.value.ul = tx_ring->stat_multi_cookie; 209 e1000g_ksp->tx_lack_desc.value.ul = tx_ring->stat_lack_desc; 210 #endif 211 212 /* 213 * Standard Stats 214 */ 215 e1000g_ksp->Mpc.value.ul += E1000_READ_REG(hw, E1000_MPC); 216 e1000g_ksp->Rlec.value.ul += E1000_READ_REG(hw, E1000_RLEC); 217 e1000g_ksp->Xonrxc.value.ul += E1000_READ_REG(hw, E1000_XONRXC); 218 e1000g_ksp->Xontxc.value.ul += E1000_READ_REG(hw, E1000_XONTXC); 219 e1000g_ksp->Xoffrxc.value.ul += E1000_READ_REG(hw, E1000_XOFFRXC); 220 e1000g_ksp->Xofftxc.value.ul += E1000_READ_REG(hw, E1000_XOFFTXC); 221 e1000g_ksp->Fcruc.value.ul += E1000_READ_REG(hw, E1000_FCRUC); 222 223 if ((hw->mac.type != e1000_ich8lan) && 224 (hw->mac.type != e1000_ich9lan) && 225 (hw->mac.type != e1000_ich10lan) && 226 (hw->mac.type != e1000_pchlan)) { 227 e1000g_ksp->Symerrs.value.ul += 228 E1000_READ_REG(hw, E1000_SYMERRS); 229 #ifdef E1000G_DEBUG 230 e1000g_ksp->Prc64.value.ul += 231 E1000_READ_REG(hw, E1000_PRC64); 232 e1000g_ksp->Prc127.value.ul += 233 E1000_READ_REG(hw, E1000_PRC127); 234 e1000g_ksp->Prc255.value.ul += 235 E1000_READ_REG(hw, E1000_PRC255); 236 e1000g_ksp->Prc511.value.ul += 237 E1000_READ_REG(hw, E1000_PRC511); 238 e1000g_ksp->Prc1023.value.ul += 239 E1000_READ_REG(hw, E1000_PRC1023); 240 e1000g_ksp->Prc1522.value.ul += 241 E1000_READ_REG(hw, E1000_PRC1522); 242 243 e1000g_ksp->Ptc64.value.ul += 244 E1000_READ_REG(hw, E1000_PTC64); 245 e1000g_ksp->Ptc127.value.ul += 246 E1000_READ_REG(hw, E1000_PTC127); 247 e1000g_ksp->Ptc255.value.ul += 248 E1000_READ_REG(hw, E1000_PTC255); 249 e1000g_ksp->Ptc511.value.ul += 250 E1000_READ_REG(hw, E1000_PTC511); 251 e1000g_ksp->Ptc1023.value.ul += 252 E1000_READ_REG(hw, E1000_PTC1023); 253 e1000g_ksp->Ptc1522.value.ul += 254 E1000_READ_REG(hw, E1000_PTC1522); 255 #endif 256 } 257 258 e1000g_ksp->Gprc.value.ul += E1000_READ_REG(hw, E1000_GPRC); 259 e1000g_ksp->Gptc.value.ul += E1000_READ_REG(hw, E1000_GPTC); 260 e1000g_ksp->Ruc.value.ul += E1000_READ_REG(hw, E1000_RUC); 261 e1000g_ksp->Rfc.value.ul += E1000_READ_REG(hw, E1000_RFC); 262 e1000g_ksp->Roc.value.ul += E1000_READ_REG(hw, E1000_ROC); 263 e1000g_ksp->Rjc.value.ul += E1000_READ_REG(hw, E1000_RJC); 264 e1000g_ksp->Tpr.value.ul += E1000_READ_REG(hw, E1000_TPR); 265 e1000g_ksp->Tncrs.value.ul += e1000g_read_phy_stat(hw, E1000_TNCRS); 266 e1000g_ksp->Tsctc.value.ul += E1000_READ_REG(hw, E1000_TSCTC); 267 e1000g_ksp->Tsctfc.value.ul += E1000_READ_REG(hw, E1000_TSCTFC); 268 269 /* 270 * Adaptive Calculations 271 */ 272 hw->mac.tx_packet_delta = E1000_READ_REG(hw, E1000_TPT); 273 e1000g_ksp->Tpt.value.ul += hw->mac.tx_packet_delta; 274 275 /* 276 * The 64-bit register will reset whenever the upper 277 * 32 bits are read. So we need to read the lower 278 * 32 bits first, then read the upper 32 bits. 279 */ 280 low_val = E1000_READ_REG(hw, E1000_GORCL); 281 high_val = E1000_READ_REG(hw, E1000_GORCH); 282 val = (uint64_t)e1000g_ksp->Gorh.value.ul << 32 | 283 (uint64_t)e1000g_ksp->Gorl.value.ul; 284 val += (uint64_t)high_val << 32 | (uint64_t)low_val; 285 e1000g_ksp->Gorl.value.ul = (uint32_t)val; 286 e1000g_ksp->Gorh.value.ul = (uint32_t)(val >> 32); 287 288 low_val = E1000_READ_REG(hw, E1000_GOTCL); 289 high_val = E1000_READ_REG(hw, E1000_GOTCH); 290 val = (uint64_t)e1000g_ksp->Goth.value.ul << 32 | 291 (uint64_t)e1000g_ksp->Gotl.value.ul; 292 val += (uint64_t)high_val << 32 | (uint64_t)low_val; 293 e1000g_ksp->Gotl.value.ul = (uint32_t)val; 294 e1000g_ksp->Goth.value.ul = (uint32_t)(val >> 32); 295 296 low_val = E1000_READ_REG(hw, E1000_TORL); 297 high_val = E1000_READ_REG(hw, E1000_TORH); 298 val = (uint64_t)e1000g_ksp->Torh.value.ul << 32 | 299 (uint64_t)e1000g_ksp->Torl.value.ul; 300 val += (uint64_t)high_val << 32 | (uint64_t)low_val; 301 e1000g_ksp->Torl.value.ul = (uint32_t)val; 302 e1000g_ksp->Torh.value.ul = (uint32_t)(val >> 32); 303 304 low_val = E1000_READ_REG(hw, E1000_TOTL); 305 high_val = E1000_READ_REG(hw, E1000_TOTH); 306 val = (uint64_t)e1000g_ksp->Toth.value.ul << 32 | 307 (uint64_t)e1000g_ksp->Totl.value.ul; 308 val += (uint64_t)high_val << 32 | (uint64_t)low_val; 309 e1000g_ksp->Totl.value.ul = (uint32_t)val; 310 e1000g_ksp->Toth.value.ul = (uint32_t)(val >> 32); 311 312 rw_exit(&Adapter->chip_lock); 313 314 if (e1000g_check_acc_handle(Adapter->osdep.reg_handle) != DDI_FM_OK) { 315 ddi_fm_service_impact(Adapter->dip, DDI_SERVICE_UNAFFECTED); 316 return (EIO); 317 } 318 319 return (0); 320 } 321 322 int 323 e1000g_m_stat(void *arg, uint_t stat, uint64_t *val) 324 { 325 struct e1000g *Adapter = (struct e1000g *)arg; 326 struct e1000_hw *hw = &Adapter->shared; 327 p_e1000g_stat_t e1000g_ksp; 328 uint32_t low_val, high_val; 329 330 e1000g_ksp = (p_e1000g_stat_t)Adapter->e1000g_ksp->ks_data; 331 332 rw_enter(&Adapter->chip_lock, RW_READER); 333 334 if (Adapter->e1000g_state & E1000G_SUSPENDED) { 335 rw_exit(&Adapter->chip_lock); 336 return (ECANCELED); 337 } 338 339 switch (stat) { 340 case MAC_STAT_IFSPEED: 341 *val = Adapter->link_speed * 1000000ull; 342 break; 343 344 case MAC_STAT_MULTIRCV: 345 e1000g_ksp->Mprc.value.ul += 346 E1000_READ_REG(hw, E1000_MPRC); 347 *val = e1000g_ksp->Mprc.value.ul; 348 break; 349 350 case MAC_STAT_BRDCSTRCV: 351 e1000g_ksp->Bprc.value.ul += 352 E1000_READ_REG(hw, E1000_BPRC); 353 *val = e1000g_ksp->Bprc.value.ul; 354 break; 355 356 case MAC_STAT_MULTIXMT: 357 e1000g_ksp->Mptc.value.ul += 358 E1000_READ_REG(hw, E1000_MPTC); 359 *val = e1000g_ksp->Mptc.value.ul; 360 break; 361 362 case MAC_STAT_BRDCSTXMT: 363 e1000g_ksp->Bptc.value.ul += 364 E1000_READ_REG(hw, E1000_BPTC); 365 *val = e1000g_ksp->Bptc.value.ul; 366 break; 367 368 case MAC_STAT_NORCVBUF: 369 e1000g_ksp->Rnbc.value.ul += 370 E1000_READ_REG(hw, E1000_RNBC); 371 *val = e1000g_ksp->Rnbc.value.ul; 372 break; 373 374 case MAC_STAT_IERRORS: 375 e1000g_ksp->Rxerrc.value.ul += 376 E1000_READ_REG(hw, E1000_RXERRC); 377 e1000g_ksp->Algnerrc.value.ul += 378 E1000_READ_REG(hw, E1000_ALGNERRC); 379 e1000g_ksp->Rlec.value.ul += 380 E1000_READ_REG(hw, E1000_RLEC); 381 e1000g_ksp->Crcerrs.value.ul += 382 E1000_READ_REG(hw, E1000_CRCERRS); 383 e1000g_ksp->Cexterr.value.ul += 384 E1000_READ_REG(hw, E1000_CEXTERR); 385 *val = e1000g_ksp->Rxerrc.value.ul + 386 e1000g_ksp->Algnerrc.value.ul + 387 e1000g_ksp->Rlec.value.ul + 388 e1000g_ksp->Crcerrs.value.ul + 389 e1000g_ksp->Cexterr.value.ul; 390 break; 391 392 case MAC_STAT_NOXMTBUF: 393 *val = Adapter->tx_ring->stat_no_desc; 394 break; 395 396 case MAC_STAT_OERRORS: 397 e1000g_ksp->Ecol.value.ul += 398 e1000g_read_phy_stat(hw, E1000_ECOL); 399 *val = e1000g_ksp->Ecol.value.ul; 400 break; 401 402 case MAC_STAT_COLLISIONS: 403 e1000g_ksp->Colc.value.ul += 404 e1000g_read_phy_stat(hw, E1000_COLC); 405 *val = e1000g_ksp->Colc.value.ul; 406 break; 407 408 case MAC_STAT_RBYTES: 409 /* 410 * The 64-bit register will reset whenever the upper 411 * 32 bits are read. So we need to read the lower 412 * 32 bits first, then read the upper 32 bits. 413 */ 414 low_val = E1000_READ_REG(hw, E1000_TORL); 415 high_val = E1000_READ_REG(hw, E1000_TORH); 416 *val = (uint64_t)e1000g_ksp->Torh.value.ul << 32 | 417 (uint64_t)e1000g_ksp->Torl.value.ul; 418 *val += (uint64_t)high_val << 32 | (uint64_t)low_val; 419 420 e1000g_ksp->Torl.value.ul = (uint32_t)*val; 421 e1000g_ksp->Torh.value.ul = (uint32_t)(*val >> 32); 422 break; 423 424 case MAC_STAT_IPACKETS: 425 e1000g_ksp->Tpr.value.ul += 426 E1000_READ_REG(hw, E1000_TPR); 427 *val = e1000g_ksp->Tpr.value.ul; 428 break; 429 430 case MAC_STAT_OBYTES: 431 /* 432 * The 64-bit register will reset whenever the upper 433 * 32 bits are read. So we need to read the lower 434 * 32 bits first, then read the upper 32 bits. 435 */ 436 low_val = E1000_READ_REG(hw, E1000_TOTL); 437 high_val = E1000_READ_REG(hw, E1000_TOTH); 438 *val = (uint64_t)e1000g_ksp->Toth.value.ul << 32 | 439 (uint64_t)e1000g_ksp->Totl.value.ul; 440 *val += (uint64_t)high_val << 32 | (uint64_t)low_val; 441 442 e1000g_ksp->Totl.value.ul = (uint32_t)*val; 443 e1000g_ksp->Toth.value.ul = (uint32_t)(*val >> 32); 444 break; 445 446 case MAC_STAT_OPACKETS: 447 e1000g_ksp->Tpt.value.ul += 448 E1000_READ_REG(hw, E1000_TPT); 449 *val = e1000g_ksp->Tpt.value.ul; 450 break; 451 452 case ETHER_STAT_ALIGN_ERRORS: 453 e1000g_ksp->Algnerrc.value.ul += 454 E1000_READ_REG(hw, E1000_ALGNERRC); 455 *val = e1000g_ksp->Algnerrc.value.ul; 456 break; 457 458 case ETHER_STAT_FCS_ERRORS: 459 e1000g_ksp->Crcerrs.value.ul += 460 E1000_READ_REG(hw, E1000_CRCERRS); 461 *val = e1000g_ksp->Crcerrs.value.ul; 462 break; 463 464 case ETHER_STAT_SQE_ERRORS: 465 e1000g_ksp->Sec.value.ul += 466 E1000_READ_REG(hw, E1000_SEC); 467 *val = e1000g_ksp->Sec.value.ul; 468 break; 469 470 case ETHER_STAT_CARRIER_ERRORS: 471 e1000g_ksp->Cexterr.value.ul += 472 E1000_READ_REG(hw, E1000_CEXTERR); 473 *val = e1000g_ksp->Cexterr.value.ul; 474 break; 475 476 case ETHER_STAT_EX_COLLISIONS: 477 e1000g_ksp->Ecol.value.ul += 478 e1000g_read_phy_stat(hw, E1000_ECOL); 479 *val = e1000g_ksp->Ecol.value.ul; 480 break; 481 482 case ETHER_STAT_TX_LATE_COLLISIONS: 483 e1000g_ksp->Latecol.value.ul += 484 e1000g_read_phy_stat(hw, E1000_LATECOL); 485 *val = e1000g_ksp->Latecol.value.ul; 486 break; 487 488 case ETHER_STAT_DEFER_XMTS: 489 e1000g_ksp->Dc.value.ul += 490 e1000g_read_phy_stat(hw, E1000_DC); 491 *val = e1000g_ksp->Dc.value.ul; 492 break; 493 494 case ETHER_STAT_FIRST_COLLISIONS: 495 e1000g_ksp->Scc.value.ul += 496 e1000g_read_phy_stat(hw, E1000_SCC); 497 *val = e1000g_ksp->Scc.value.ul; 498 break; 499 500 case ETHER_STAT_MULTI_COLLISIONS: 501 e1000g_ksp->Mcc.value.ul += 502 e1000g_read_phy_stat(hw, E1000_MCC); 503 *val = e1000g_ksp->Mcc.value.ul; 504 break; 505 506 case ETHER_STAT_MACRCV_ERRORS: 507 e1000g_ksp->Rxerrc.value.ul += 508 E1000_READ_REG(hw, E1000_RXERRC); 509 *val = e1000g_ksp->Rxerrc.value.ul; 510 break; 511 512 case ETHER_STAT_MACXMT_ERRORS: 513 e1000g_ksp->Ecol.value.ul += 514 e1000g_read_phy_stat(hw, E1000_ECOL); 515 *val = e1000g_ksp->Ecol.value.ul; 516 break; 517 518 case ETHER_STAT_TOOLONG_ERRORS: 519 e1000g_ksp->Roc.value.ul += 520 E1000_READ_REG(hw, E1000_ROC); 521 *val = e1000g_ksp->Roc.value.ul; 522 break; 523 524 case ETHER_STAT_XCVR_ADDR: 525 /* The Internal PHY's MDI address for each MAC is 1 */ 526 *val = 1; 527 break; 528 529 case ETHER_STAT_XCVR_ID: 530 *val = hw->phy.id | hw->phy.revision; 531 break; 532 533 case ETHER_STAT_XCVR_INUSE: 534 switch (Adapter->link_speed) { 535 case SPEED_1000: 536 *val = 537 (hw->phy.media_type == e1000_media_type_copper) ? 538 XCVR_1000T : XCVR_1000X; 539 break; 540 case SPEED_100: 541 *val = 542 (hw->phy.media_type == e1000_media_type_copper) ? 543 (Adapter->phy_status & MII_SR_100T4_CAPS) ? 544 XCVR_100T4 : XCVR_100T2 : XCVR_100X; 545 break; 546 case SPEED_10: 547 *val = XCVR_10; 548 break; 549 default: 550 *val = XCVR_NONE; 551 break; 552 } 553 break; 554 555 case ETHER_STAT_CAP_1000FDX: 556 *val = Adapter->param_1000fdx_cap; 557 break; 558 559 case ETHER_STAT_CAP_1000HDX: 560 *val = Adapter->param_1000hdx_cap; 561 break; 562 563 case ETHER_STAT_CAP_100FDX: 564 *val = Adapter->param_100fdx_cap; 565 break; 566 567 case ETHER_STAT_CAP_100HDX: 568 *val = Adapter->param_100hdx_cap; 569 break; 570 571 case ETHER_STAT_CAP_10FDX: 572 *val = Adapter->param_10fdx_cap; 573 break; 574 575 case ETHER_STAT_CAP_10HDX: 576 *val = Adapter->param_10hdx_cap; 577 break; 578 579 case ETHER_STAT_CAP_ASMPAUSE: 580 *val = Adapter->param_asym_pause_cap; 581 break; 582 583 case ETHER_STAT_CAP_PAUSE: 584 *val = Adapter->param_pause_cap; 585 break; 586 587 case ETHER_STAT_CAP_AUTONEG: 588 *val = Adapter->param_autoneg_cap; 589 break; 590 591 case ETHER_STAT_ADV_CAP_1000FDX: 592 *val = Adapter->param_adv_1000fdx; 593 break; 594 595 case ETHER_STAT_ADV_CAP_1000HDX: 596 *val = Adapter->param_adv_1000hdx; 597 break; 598 599 case ETHER_STAT_ADV_CAP_100FDX: 600 *val = Adapter->param_adv_100fdx; 601 break; 602 603 case ETHER_STAT_ADV_CAP_100HDX: 604 *val = Adapter->param_adv_100hdx; 605 break; 606 607 case ETHER_STAT_ADV_CAP_10FDX: 608 *val = Adapter->param_adv_10fdx; 609 break; 610 611 case ETHER_STAT_ADV_CAP_10HDX: 612 *val = Adapter->param_adv_10hdx; 613 break; 614 615 case ETHER_STAT_ADV_CAP_ASMPAUSE: 616 *val = Adapter->param_adv_asym_pause; 617 break; 618 619 case ETHER_STAT_ADV_CAP_PAUSE: 620 *val = Adapter->param_adv_pause; 621 break; 622 623 case ETHER_STAT_ADV_CAP_AUTONEG: 624 *val = hw->mac.autoneg; 625 break; 626 627 case ETHER_STAT_LP_CAP_1000FDX: 628 *val = Adapter->param_lp_1000fdx; 629 break; 630 631 case ETHER_STAT_LP_CAP_1000HDX: 632 *val = Adapter->param_lp_1000hdx; 633 break; 634 635 case ETHER_STAT_LP_CAP_100FDX: 636 *val = Adapter->param_lp_100fdx; 637 break; 638 639 case ETHER_STAT_LP_CAP_100HDX: 640 *val = Adapter->param_lp_100hdx; 641 break; 642 643 case ETHER_STAT_LP_CAP_10FDX: 644 *val = Adapter->param_lp_10fdx; 645 break; 646 647 case ETHER_STAT_LP_CAP_10HDX: 648 *val = Adapter->param_lp_10hdx; 649 break; 650 651 case ETHER_STAT_LP_CAP_ASMPAUSE: 652 *val = Adapter->param_lp_asym_pause; 653 break; 654 655 case ETHER_STAT_LP_CAP_PAUSE: 656 *val = Adapter->param_lp_pause; 657 break; 658 659 case ETHER_STAT_LP_CAP_AUTONEG: 660 *val = Adapter->param_lp_autoneg; 661 break; 662 663 case ETHER_STAT_LINK_ASMPAUSE: 664 *val = Adapter->param_asym_pause_cap; 665 break; 666 667 case ETHER_STAT_LINK_PAUSE: 668 *val = Adapter->param_pause_cap; 669 break; 670 671 case ETHER_STAT_LINK_AUTONEG: 672 *val = hw->mac.autoneg; 673 break; 674 675 case ETHER_STAT_LINK_DUPLEX: 676 *val = (Adapter->link_duplex == FULL_DUPLEX) ? 677 LINK_DUPLEX_FULL : LINK_DUPLEX_HALF; 678 break; 679 680 case ETHER_STAT_CAP_100T4: 681 *val = Adapter->param_100t4_cap; 682 break; 683 684 case ETHER_STAT_ADV_CAP_100T4: 685 *val = Adapter->param_adv_100t4; 686 break; 687 688 case ETHER_STAT_LP_CAP_100T4: 689 *val = Adapter->param_lp_100t4; 690 break; 691 692 default: 693 rw_exit(&Adapter->chip_lock); 694 return (ENOTSUP); 695 } 696 697 rw_exit(&Adapter->chip_lock); 698 699 if (e1000g_check_acc_handle(Adapter->osdep.reg_handle) != DDI_FM_OK) { 700 ddi_fm_service_impact(Adapter->dip, DDI_SERVICE_UNAFFECTED); 701 return (EIO); 702 } 703 704 return (0); 705 } 706 707 /* 708 * e1000g_init_stats - initialize kstat data structures 709 * 710 * This routine will create and initialize the driver private 711 * statistics counters. 712 */ 713 int 714 e1000g_init_stats(struct e1000g *Adapter) 715 { 716 kstat_t *ksp; 717 p_e1000g_stat_t e1000g_ksp; 718 719 /* 720 * Create and init kstat 721 */ 722 ksp = kstat_create(WSNAME, ddi_get_instance(Adapter->dip), 723 "statistics", "net", KSTAT_TYPE_NAMED, 724 sizeof (e1000g_stat_t) / sizeof (kstat_named_t), 0); 725 726 if (ksp == NULL) { 727 e1000g_log(Adapter, CE_WARN, 728 "Could not create kernel statistics\n"); 729 return (DDI_FAILURE); 730 } 731 732 Adapter->e1000g_ksp = ksp; /* Fill in the Adapters ksp */ 733 734 e1000g_ksp = (p_e1000g_stat_t)ksp->ks_data; 735 736 /* 737 * Initialize all the statistics 738 */ 739 kstat_named_init(&e1000g_ksp->link_speed, "link_speed", 740 KSTAT_DATA_ULONG); 741 kstat_named_init(&e1000g_ksp->reset_count, "Reset Count", 742 KSTAT_DATA_ULONG); 743 744 kstat_named_init(&e1000g_ksp->rx_error, "Rx Error", 745 KSTAT_DATA_ULONG); 746 kstat_named_init(&e1000g_ksp->rx_allocb_fail, "Rx Allocb Failure", 747 KSTAT_DATA_ULONG); 748 kstat_named_init(&e1000g_ksp->rx_size_error, "Rx Size Error", 749 KSTAT_DATA_ULONG); 750 751 kstat_named_init(&e1000g_ksp->tx_no_desc, "Tx No Desc", 752 KSTAT_DATA_ULONG); 753 kstat_named_init(&e1000g_ksp->tx_no_swpkt, "Tx No Buffer", 754 KSTAT_DATA_ULONG); 755 kstat_named_init(&e1000g_ksp->tx_send_fail, "Tx Send Failure", 756 KSTAT_DATA_ULONG); 757 kstat_named_init(&e1000g_ksp->tx_over_size, "Tx Pkt Over Size", 758 KSTAT_DATA_ULONG); 759 kstat_named_init(&e1000g_ksp->tx_reschedule, "Tx Reschedule", 760 KSTAT_DATA_ULONG); 761 762 kstat_named_init(&e1000g_ksp->Mpc, "Recv_Missed_Packets", 763 KSTAT_DATA_ULONG); 764 kstat_named_init(&e1000g_ksp->Symerrs, "Recv_Symbol_Errors", 765 KSTAT_DATA_ULONG); 766 kstat_named_init(&e1000g_ksp->Rlec, "Recv_Length_Errors", 767 KSTAT_DATA_ULONG); 768 kstat_named_init(&e1000g_ksp->Xonrxc, "XONs_Recvd", 769 KSTAT_DATA_ULONG); 770 kstat_named_init(&e1000g_ksp->Xontxc, "XONs_Xmitd", 771 KSTAT_DATA_ULONG); 772 kstat_named_init(&e1000g_ksp->Xoffrxc, "XOFFs_Recvd", 773 KSTAT_DATA_ULONG); 774 kstat_named_init(&e1000g_ksp->Xofftxc, "XOFFs_Xmitd", 775 KSTAT_DATA_ULONG); 776 kstat_named_init(&e1000g_ksp->Fcruc, "Recv_Unsupport_FC_Pkts", 777 KSTAT_DATA_ULONG); 778 #ifdef E1000G_DEBUG 779 kstat_named_init(&e1000g_ksp->Prc64, "Pkts_Recvd_( 64b)", 780 KSTAT_DATA_ULONG); 781 kstat_named_init(&e1000g_ksp->Prc127, "Pkts_Recvd_( 65- 127b)", 782 KSTAT_DATA_ULONG); 783 kstat_named_init(&e1000g_ksp->Prc255, "Pkts_Recvd_( 127- 255b)", 784 KSTAT_DATA_ULONG); 785 kstat_named_init(&e1000g_ksp->Prc511, "Pkts_Recvd_( 256- 511b)", 786 KSTAT_DATA_ULONG); 787 kstat_named_init(&e1000g_ksp->Prc1023, "Pkts_Recvd_( 511-1023b)", 788 KSTAT_DATA_ULONG); 789 kstat_named_init(&e1000g_ksp->Prc1522, "Pkts_Recvd_(1024-1522b)", 790 KSTAT_DATA_ULONG); 791 #endif 792 kstat_named_init(&e1000g_ksp->Gprc, "Good_Pkts_Recvd", 793 KSTAT_DATA_ULONG); 794 kstat_named_init(&e1000g_ksp->Gptc, "Good_Pkts_Xmitd", 795 KSTAT_DATA_ULONG); 796 kstat_named_init(&e1000g_ksp->Gorl, "Good_Octets_Recvd_Lo", 797 KSTAT_DATA_ULONG); 798 kstat_named_init(&e1000g_ksp->Gorh, "Good_Octets_Recvd_Hi", 799 KSTAT_DATA_ULONG); 800 kstat_named_init(&e1000g_ksp->Gotl, "Good_Octets_Xmitd_Lo", 801 KSTAT_DATA_ULONG); 802 kstat_named_init(&e1000g_ksp->Goth, "Good_Octets_Xmitd_Hi", 803 KSTAT_DATA_ULONG); 804 kstat_named_init(&e1000g_ksp->Ruc, "Recv_Undersize", 805 KSTAT_DATA_ULONG); 806 kstat_named_init(&e1000g_ksp->Rfc, "Recv_Frag", 807 KSTAT_DATA_ULONG); 808 kstat_named_init(&e1000g_ksp->Roc, "Recv_Oversize", 809 KSTAT_DATA_ULONG); 810 kstat_named_init(&e1000g_ksp->Rjc, "Recv_Jabber", 811 KSTAT_DATA_ULONG); 812 kstat_named_init(&e1000g_ksp->Torl, "Total_Octets_Recvd_Lo", 813 KSTAT_DATA_ULONG); 814 kstat_named_init(&e1000g_ksp->Torh, "Total_Octets_Recvd_Hi", 815 KSTAT_DATA_ULONG); 816 kstat_named_init(&e1000g_ksp->Totl, "Total_Octets_Xmitd_Lo", 817 KSTAT_DATA_ULONG); 818 kstat_named_init(&e1000g_ksp->Toth, "Total_Octets_Xmitd_Hi", 819 KSTAT_DATA_ULONG); 820 kstat_named_init(&e1000g_ksp->Tpr, "Total_Packets_Recvd", 821 KSTAT_DATA_ULONG); 822 kstat_named_init(&e1000g_ksp->Tpt, "Total_Packets_Xmitd", 823 KSTAT_DATA_ULONG); 824 #ifdef E1000G_DEBUG 825 kstat_named_init(&e1000g_ksp->Ptc64, "Pkts_Xmitd_( 64b)", 826 KSTAT_DATA_ULONG); 827 kstat_named_init(&e1000g_ksp->Ptc127, "Pkts_Xmitd_( 65- 127b)", 828 KSTAT_DATA_ULONG); 829 kstat_named_init(&e1000g_ksp->Ptc255, "Pkts_Xmitd_( 128- 255b)", 830 KSTAT_DATA_ULONG); 831 kstat_named_init(&e1000g_ksp->Ptc511, "Pkts_Xmitd_( 255- 511b)", 832 KSTAT_DATA_ULONG); 833 kstat_named_init(&e1000g_ksp->Ptc1023, "Pkts_Xmitd_( 512-1023b)", 834 KSTAT_DATA_ULONG); 835 kstat_named_init(&e1000g_ksp->Ptc1522, "Pkts_Xmitd_(1024-1522b)", 836 KSTAT_DATA_ULONG); 837 #endif 838 kstat_named_init(&e1000g_ksp->Tncrs, "Xmit_with_No_CRS", 839 KSTAT_DATA_ULONG); 840 kstat_named_init(&e1000g_ksp->Tsctc, "Xmit_TCP_Seg_Contexts", 841 KSTAT_DATA_ULONG); 842 kstat_named_init(&e1000g_ksp->Tsctfc, "Xmit_TCP_Seg_Contexts_Fail", 843 KSTAT_DATA_ULONG); 844 845 #ifdef E1000G_DEBUG 846 kstat_named_init(&e1000g_ksp->rx_none, "Rx No Data", 847 KSTAT_DATA_ULONG); 848 kstat_named_init(&e1000g_ksp->rx_multi_desc, "Rx Span Multi Desc", 849 KSTAT_DATA_ULONG); 850 kstat_named_init(&e1000g_ksp->rx_no_freepkt, "Rx Freelist Empty", 851 KSTAT_DATA_ULONG); 852 kstat_named_init(&e1000g_ksp->rx_avail_freepkt, "Rx Freelist Avail", 853 KSTAT_DATA_ULONG); 854 855 kstat_named_init(&e1000g_ksp->tx_under_size, "Tx Pkt Under Size", 856 KSTAT_DATA_ULONG); 857 kstat_named_init(&e1000g_ksp->tx_exceed_frags, "Tx Exceed Max Frags", 858 KSTAT_DATA_ULONG); 859 kstat_named_init(&e1000g_ksp->tx_empty_frags, "Tx Empty Frags", 860 KSTAT_DATA_ULONG); 861 kstat_named_init(&e1000g_ksp->tx_recycle, "Tx Recycle", 862 KSTAT_DATA_ULONG); 863 kstat_named_init(&e1000g_ksp->tx_recycle_intr, "Tx Recycle Intr", 864 KSTAT_DATA_ULONG); 865 kstat_named_init(&e1000g_ksp->tx_recycle_retry, "Tx Recycle Retry", 866 KSTAT_DATA_ULONG); 867 kstat_named_init(&e1000g_ksp->tx_recycle_none, "Tx Recycled None", 868 KSTAT_DATA_ULONG); 869 kstat_named_init(&e1000g_ksp->tx_copy, "Tx Send Copy", 870 KSTAT_DATA_ULONG); 871 kstat_named_init(&e1000g_ksp->tx_bind, "Tx Send Bind", 872 KSTAT_DATA_ULONG); 873 kstat_named_init(&e1000g_ksp->tx_multi_copy, "Tx Copy Multi Frags", 874 KSTAT_DATA_ULONG); 875 kstat_named_init(&e1000g_ksp->tx_multi_cookie, "Tx Bind Multi Cookies", 876 KSTAT_DATA_ULONG); 877 kstat_named_init(&e1000g_ksp->tx_lack_desc, "Tx Desc Insufficient", 878 KSTAT_DATA_ULONG); 879 #endif 880 881 /* 882 * Function to provide kernel stat update on demand 883 */ 884 ksp->ks_update = e1000g_update_stats; 885 886 /* 887 * Pointer into provider's raw statistics 888 */ 889 ksp->ks_private = (void *)Adapter; 890 891 /* 892 * Add kstat to systems kstat chain 893 */ 894 kstat_install(ksp); 895 896 return (DDI_SUCCESS); 897 } 898 899 /* 900 * e1000g_read_phy_stat - read certain PHY statistics 901 * 902 * Certain statistics are read from MAC registers on some silicon types 903 * but are read from the PHY on other silicon types. This routine 904 * handles that difference as needed. 905 */ 906 static uint32_t 907 e1000g_read_phy_stat(struct e1000_hw *hw, int reg) 908 { 909 uint16_t phy_low, phy_high; 910 uint32_t val; 911 912 /* get statistic from PHY in these cases */ 913 if ((hw->phy.type == e1000_phy_82578) || 914 (hw->phy.type == e1000_phy_82577)) { 915 916 switch (reg) { 917 case E1000_SCC: 918 (void) e1000_read_phy_reg(hw, HV_SCC_UPPER, &phy_high); 919 (void) e1000_read_phy_reg(hw, HV_SCC_LOWER, &phy_low); 920 val = ((uint32_t)phy_high << 16) | (uint32_t)phy_low; 921 break; 922 923 case E1000_MCC: 924 (void) e1000_read_phy_reg(hw, HV_MCC_UPPER, &phy_high); 925 (void) e1000_read_phy_reg(hw, HV_MCC_LOWER, &phy_low); 926 val = ((uint32_t)phy_high << 16) | (uint32_t)phy_low; 927 break; 928 929 case E1000_ECOL: 930 (void) e1000_read_phy_reg(hw, HV_ECOL_UPPER, &phy_high); 931 (void) e1000_read_phy_reg(hw, HV_ECOL_LOWER, &phy_low); 932 val = ((uint32_t)phy_high << 16) | (uint32_t)phy_low; 933 break; 934 935 case E1000_COLC: 936 (void) e1000_read_phy_reg(hw, HV_COLC_UPPER, &phy_high); 937 (void) e1000_read_phy_reg(hw, HV_COLC_LOWER, &phy_low); 938 val = ((uint32_t)phy_high << 16) | (uint32_t)phy_low; 939 break; 940 941 case E1000_LATECOL: 942 (void) e1000_read_phy_reg(hw, HV_LATECOL_UPPER, 943 &phy_high); 944 (void) e1000_read_phy_reg(hw, HV_LATECOL_LOWER, 945 &phy_low); 946 val = ((uint32_t)phy_high << 16) | (uint32_t)phy_low; 947 break; 948 949 case E1000_DC: 950 (void) e1000_read_phy_reg(hw, HV_DC_UPPER, &phy_high); 951 (void) e1000_read_phy_reg(hw, HV_DC_LOWER, &phy_low); 952 val = ((uint32_t)phy_high << 16) | (uint32_t)phy_low; 953 break; 954 955 case E1000_TNCRS: 956 (void) e1000_read_phy_reg(hw, HV_TNCRS_UPPER, 957 &phy_high); 958 (void) e1000_read_phy_reg(hw, HV_TNCRS_LOWER, 959 &phy_low); 960 val = ((uint32_t)phy_high << 16) | (uint32_t)phy_low; 961 break; 962 963 default: 964 break; 965 } 966 967 /* get statistic from MAC otherwise */ 968 } else { 969 val = E1000_READ_REG(hw, reg); 970 } 971 972 return (val); 973 } 974