1*3526Sxy150489 /* 2*3526Sxy150489 * This file is provided under a CDDLv1 license. When using or 3*3526Sxy150489 * redistributing this file, you may do so under this license. 4*3526Sxy150489 * In redistributing this file this license must be included 5*3526Sxy150489 * and no other modification of this header file is permitted. 6*3526Sxy150489 * 7*3526Sxy150489 * CDDL LICENSE SUMMARY 8*3526Sxy150489 * 9*3526Sxy150489 * Copyright(c) 1999 - 2007 Intel Corporation. All rights reserved. 10*3526Sxy150489 * 11*3526Sxy150489 * The contents of this file are subject to the terms of Version 12*3526Sxy150489 * 1.0 of the Common Development and Distribution License (the "License"). 13*3526Sxy150489 * 14*3526Sxy150489 * You should have received a copy of the License with this software. 15*3526Sxy150489 * You can obtain a copy of the License at 16*3526Sxy150489 * http://www.opensolaris.org/os/licensing. 17*3526Sxy150489 * See the License for the specific language governing permissions 18*3526Sxy150489 * and limitations under the License. 19*3526Sxy150489 */ 20*3526Sxy150489 21*3526Sxy150489 /* 22*3526Sxy150489 * Copyright 2007 Sun Microsystems, Inc. All rights reserved. 23*3526Sxy150489 * Use is subject to license terms of the CDDLv1. 24*3526Sxy150489 */ 25*3526Sxy150489 26*3526Sxy150489 #pragma ident "%Z%%M% %I% %E% SMI" 27*3526Sxy150489 28*3526Sxy150489 /* 29*3526Sxy150489 * ********************************************************************** 30*3526Sxy150489 * * 31*3526Sxy150489 * Module Name: e1000g_stat.c * 32*3526Sxy150489 * * 33*3526Sxy150489 * Abstract: Functions for displaying statistics * 34*3526Sxy150489 * * 35*3526Sxy150489 * ********************************************************************** 36*3526Sxy150489 */ 37*3526Sxy150489 #include "e1000g_sw.h" 38*3526Sxy150489 #include "e1000g_debug.h" 39*3526Sxy150489 40*3526Sxy150489 static int UpdateStatsCounters(kstat_t *ksp, int rw); 41*3526Sxy150489 42*3526Sxy150489 /* 43*3526Sxy150489 * ********************************************************************** 44*3526Sxy150489 * * 45*3526Sxy150489 * Name: AdjustTbiAcceptedStats * 46*3526Sxy150489 * * 47*3526Sxy150489 * Description: Adjusts statistic counters when a frame is accepted * 48*3526Sxy150489 * under the TBI workaround. This function has been * 49*3526Sxy150489 * adapted for Solaris from shared code. * 50*3526Sxy150489 * * 51*3526Sxy150489 * Author: Bill Campbell * 52*3526Sxy150489 * * 53*3526Sxy150489 * Born on Date: 4/12/2001 * 54*3526Sxy150489 * * 55*3526Sxy150489 * Arguments: * 56*3526Sxy150489 * Adapter - Ptr to this card's adapter data structure. * 57*3526Sxy150489 * FrameLength - Length as reported from Hardware * 58*3526Sxy150489 * MacAddress - Pointer to MAC address field in frame. * 59*3526Sxy150489 * * 60*3526Sxy150489 * Returns: * 61*3526Sxy150489 * VOID * 62*3526Sxy150489 * * 63*3526Sxy150489 * ********************************************************************** 64*3526Sxy150489 */ 65*3526Sxy150489 void 66*3526Sxy150489 AdjustTbiAcceptedStats(struct e1000g *Adapter, 67*3526Sxy150489 UINT32 FrameLength, PUCHAR MacAddress) 68*3526Sxy150489 { 69*3526Sxy150489 UINT32 CarryBit; 70*3526Sxy150489 e1000gstat *e1000g_ksp; 71*3526Sxy150489 72*3526Sxy150489 e1000g_ksp = (e1000gstat *)Adapter->e1000g_ksp->ks_data; 73*3526Sxy150489 74*3526Sxy150489 /* 75*3526Sxy150489 * First adjust the frame length. 76*3526Sxy150489 */ 77*3526Sxy150489 FrameLength--; 78*3526Sxy150489 /* 79*3526Sxy150489 * We need to adjust the statistics counters, since the hardware 80*3526Sxy150489 * counters overcount this packet as a CRC error and undercount 81*3526Sxy150489 * the packet as a good packet 82*3526Sxy150489 */ 83*3526Sxy150489 84*3526Sxy150489 /* 85*3526Sxy150489 * This packet should not be counted as a CRC error. 86*3526Sxy150489 */ 87*3526Sxy150489 e1000g_ksp->Crcerrs.value.ul--; 88*3526Sxy150489 /* 89*3526Sxy150489 * This packet does count as a Good Packet Received. 90*3526Sxy150489 */ 91*3526Sxy150489 e1000g_ksp->Gprc.value.ul++; 92*3526Sxy150489 93*3526Sxy150489 /* 94*3526Sxy150489 * Adjust the Good Octets received counters 95*3526Sxy150489 */ 96*3526Sxy150489 CarryBit = 0x80000000 & e1000g_ksp->Gorl.value.ul; 97*3526Sxy150489 e1000g_ksp->Gorl.value.ul += FrameLength; 98*3526Sxy150489 /* 99*3526Sxy150489 * If the high bit of Gorcl (the low 32 bits of the Good Octets 100*3526Sxy150489 * Received Count) was one before the addition, 101*3526Sxy150489 * AND it is zero after, then we lost the carry out, 102*3526Sxy150489 * need to add one to Gorch (Good Octets Received Count High). 103*3526Sxy150489 * This could be simplified if all environments supported 104*3526Sxy150489 * 64-bit integers. 105*3526Sxy150489 */ 106*3526Sxy150489 if (CarryBit && ((e1000g_ksp->Gorl.value.ul & 0x80000000) == 0)) { 107*3526Sxy150489 e1000g_ksp->Gorh.value.ul++; 108*3526Sxy150489 } 109*3526Sxy150489 /* 110*3526Sxy150489 * Is this a broadcast or multicast? Check broadcast first, 111*3526Sxy150489 * since the test for a multicast frame will test positive on 112*3526Sxy150489 * a broadcast frame. 113*3526Sxy150489 */ 114*3526Sxy150489 if ((MacAddress[0] == (UCHAR) 0xff) && 115*3526Sxy150489 (MacAddress[1] == (UCHAR) 0xff)) { 116*3526Sxy150489 /* 117*3526Sxy150489 * Broadcast packet 118*3526Sxy150489 */ 119*3526Sxy150489 e1000g_ksp->Bprc.value.ul++; 120*3526Sxy150489 } else if (*MacAddress & 0x01) { 121*3526Sxy150489 /* 122*3526Sxy150489 * Multicast packet 123*3526Sxy150489 */ 124*3526Sxy150489 e1000g_ksp->Mprc.value.ul++; 125*3526Sxy150489 } 126*3526Sxy150489 if (FrameLength == Adapter->Shared.max_frame_size) { 127*3526Sxy150489 /* 128*3526Sxy150489 * In this case, the hardware has overcounted the number of 129*3526Sxy150489 * oversize frames. 130*3526Sxy150489 */ 131*3526Sxy150489 if (e1000g_ksp->Roc.value.ul > 0) 132*3526Sxy150489 e1000g_ksp->Roc.value.ul--; 133*3526Sxy150489 } 134*3526Sxy150489 135*3526Sxy150489 /* 136*3526Sxy150489 * Adjust the bin counters when the extra byte put the frame in the 137*3526Sxy150489 * wrong bin. Remember that the FrameLength was adjusted above. 138*3526Sxy150489 */ 139*3526Sxy150489 if (FrameLength == 64) { 140*3526Sxy150489 e1000g_ksp->Prc64.value.ul++; 141*3526Sxy150489 e1000g_ksp->Prc127.value.ul--; 142*3526Sxy150489 } else if (FrameLength == 127) { 143*3526Sxy150489 e1000g_ksp->Prc127.value.ul++; 144*3526Sxy150489 e1000g_ksp->Prc255.value.ul--; 145*3526Sxy150489 } else if (FrameLength == 255) { 146*3526Sxy150489 e1000g_ksp->Prc255.value.ul++; 147*3526Sxy150489 e1000g_ksp->Prc511.value.ul--; 148*3526Sxy150489 } else if (FrameLength == 511) { 149*3526Sxy150489 e1000g_ksp->Prc511.value.ul++; 150*3526Sxy150489 e1000g_ksp->Prc1023.value.ul--; 151*3526Sxy150489 } else if (FrameLength == 1023) { 152*3526Sxy150489 e1000g_ksp->Prc1023.value.ul++; 153*3526Sxy150489 e1000g_ksp->Prc1522.value.ul--; 154*3526Sxy150489 } else if (FrameLength == 1522) { 155*3526Sxy150489 e1000g_ksp->Prc1522.value.ul++; 156*3526Sxy150489 } 157*3526Sxy150489 } 158*3526Sxy150489 159*3526Sxy150489 160*3526Sxy150489 /* 161*3526Sxy150489 * ********************************************************************** 162*3526Sxy150489 * Name: UpdateStatsCounters * 163*3526Sxy150489 * * 164*3526Sxy150489 * Description: This routine will dump and reset the 1000's internal * 165*3526Sxy150489 * Statistics counters. The current stats dump values will * 166*3526Sxy150489 * be sent to the kernel status area. * 167*3526Sxy150489 * * 168*3526Sxy150489 * Author: Phil Cayton * 169*3526Sxy150489 * * 170*3526Sxy150489 * Born on Date: 7/13/98 * 171*3526Sxy150489 * * 172*3526Sxy150489 * Arguments: * 173*3526Sxy150489 * *ksp - A kernel stat pointer * 174*3526Sxy150489 * rw - Read/Write flag * 175*3526Sxy150489 * * 176*3526Sxy150489 * Returns: * 177*3526Sxy150489 * (EACCES) If an attempt is made to write stats to the hw * 178*3526Sxy150489 * (0) On successful read of statistics to kernel stats. * 179*3526Sxy150489 * * 180*3526Sxy150489 * File: e1000g_stat.c * 181*3526Sxy150489 * * 182*3526Sxy150489 * Modification log: * 183*3526Sxy150489 * Date Who Description * 184*3526Sxy150489 * -------- --- ------------------------------------------------------* 185*3526Sxy150489 * Sept 10,99 Vinay New Counters for Livengood have been added. * 186*3526Sxy150489 * ********************************************************************** 187*3526Sxy150489 */ 188*3526Sxy150489 static int 189*3526Sxy150489 UpdateStatsCounters(IN kstat_t *ksp, int rw) 190*3526Sxy150489 { 191*3526Sxy150489 uint16_t LineSpeed, Duplex; 192*3526Sxy150489 struct e1000g *Adapter; 193*3526Sxy150489 e1000gstat *e1000g_ksp; 194*3526Sxy150489 uint64_t val; 195*3526Sxy150489 uint32_t low_val, high_val; 196*3526Sxy150489 197*3526Sxy150489 if (rw == KSTAT_WRITE) 198*3526Sxy150489 return (EACCES); 199*3526Sxy150489 200*3526Sxy150489 Adapter = (struct e1000g *)ksp->ks_private; 201*3526Sxy150489 ASSERT(Adapter != NULL); 202*3526Sxy150489 e1000g_ksp = (e1000gstat *)ksp->ks_data; 203*3526Sxy150489 ASSERT(e1000g_ksp != NULL); 204*3526Sxy150489 205*3526Sxy150489 e1000g_ksp->link_up.value.ul = Adapter->LinkIsActive; 206*3526Sxy150489 e1000g_ksp->link_speed.value.ul = Adapter->link_speed; 207*3526Sxy150489 e1000g_ksp->rx_none.value.ul = Adapter->rx_none; 208*3526Sxy150489 e1000g_ksp->rx_error.value.ul = Adapter->rx_error; 209*3526Sxy150489 e1000g_ksp->rx_no_freepkt.value.ul = Adapter->rx_no_freepkt; 210*3526Sxy150489 e1000g_ksp->rx_esballoc_fail.value.ul = Adapter->rx_esballoc_fail; 211*3526Sxy150489 e1000g_ksp->rx_exceed_pkt.value.ul = Adapter->rx_exceed_pkt; 212*3526Sxy150489 e1000g_ksp->rx_multi_desc.value.ul = Adapter->rx_multi_desc; 213*3526Sxy150489 e1000g_ksp->rx_allocb_fail.value.ul = Adapter->rx_allocb_fail; 214*3526Sxy150489 e1000g_ksp->rx_avail_freepkt.value.ul = Adapter->rx_avail_freepkt; 215*3526Sxy150489 e1000g_ksp->rx_seq_intr.value.ul = Adapter->rx_seq_intr; 216*3526Sxy150489 e1000g_ksp->tx_no_desc.value.ul = Adapter->tx_no_desc; 217*3526Sxy150489 e1000g_ksp->tx_no_swpkt.value.ul = Adapter->tx_no_swpkt; 218*3526Sxy150489 e1000g_ksp->tx_lack_desc.value.ul = Adapter->tx_lack_desc; 219*3526Sxy150489 e1000g_ksp->tx_send_fail.value.ul = Adapter->tx_send_fail; 220*3526Sxy150489 e1000g_ksp->tx_multi_cookie.value.ul = Adapter->tx_multi_cookie; 221*3526Sxy150489 e1000g_ksp->tx_over_size.value.ul = Adapter->tx_over_size; 222*3526Sxy150489 e1000g_ksp->tx_under_size.value.ul = Adapter->tx_under_size; 223*3526Sxy150489 e1000g_ksp->tx_copy.value.ul = Adapter->tx_copy; 224*3526Sxy150489 e1000g_ksp->tx_bind.value.ul = Adapter->tx_bind; 225*3526Sxy150489 e1000g_ksp->tx_multi_copy.value.ul = Adapter->tx_multi_copy; 226*3526Sxy150489 e1000g_ksp->tx_reschedule.value.ul = Adapter->tx_reschedule; 227*3526Sxy150489 e1000g_ksp->tx_empty_frags.value.ul = Adapter->tx_empty_frags; 228*3526Sxy150489 e1000g_ksp->tx_exceed_frags.value.ul = Adapter->tx_exceed_frags; 229*3526Sxy150489 e1000g_ksp->tx_recycle.value.ul = Adapter->tx_recycle; 230*3526Sxy150489 e1000g_ksp->tx_recycle_retry.value.ul = Adapter->tx_recycle_retry; 231*3526Sxy150489 e1000g_ksp->tx_recycle_intr.value.ul = Adapter->tx_recycle_intr; 232*3526Sxy150489 e1000g_ksp->tx_recycle_none.value.ul = Adapter->tx_recycle_none; 233*3526Sxy150489 e1000g_ksp->StallWatchdog.value.ul = Adapter->StallWatchdog; 234*3526Sxy150489 e1000g_ksp->reset_count.value.ul = Adapter->reset_count; 235*3526Sxy150489 e1000g_ksp->JumboTx_4K.value.ul = Adapter->JumboTx_4K; 236*3526Sxy150489 e1000g_ksp->JumboRx_4K.value.ul = Adapter->JumboRx_4K; 237*3526Sxy150489 e1000g_ksp->JumboTx_8K.value.ul = Adapter->JumboTx_8K; 238*3526Sxy150489 e1000g_ksp->JumboRx_8K.value.ul = Adapter->JumboRx_8K; 239*3526Sxy150489 e1000g_ksp->JumboTx_16K.value.ul = Adapter->JumboTx_16K; 240*3526Sxy150489 e1000g_ksp->JumboRx_16K.value.ul = Adapter->JumboRx_16K; 241*3526Sxy150489 e1000g_ksp->intr_type.value.ul = Adapter->intr_type; 242*3526Sxy150489 243*3526Sxy150489 /* 244*3526Sxy150489 * Mutex required if in TBI mode 245*3526Sxy150489 */ 246*3526Sxy150489 if (Adapter->Shared.tbi_compatibility_on == 1) { 247*3526Sxy150489 mutex_enter(&Adapter->TbiCntrMutex); 248*3526Sxy150489 } 249*3526Sxy150489 250*3526Sxy150489 /* 251*3526Sxy150489 * Standard Stats 252*3526Sxy150489 */ 253*3526Sxy150489 e1000g_ksp->Mpc.value.ul += 254*3526Sxy150489 E1000_READ_REG(&Adapter->Shared, MPC); 255*3526Sxy150489 256*3526Sxy150489 e1000g_ksp->Symerrs.value.ul += 257*3526Sxy150489 E1000_READ_REG(&Adapter->Shared, SYMERRS); 258*3526Sxy150489 259*3526Sxy150489 e1000g_ksp->Rlec.value.ul += 260*3526Sxy150489 E1000_READ_REG(&Adapter->Shared, RLEC); 261*3526Sxy150489 262*3526Sxy150489 e1000g_ksp->Xonrxc.value.ul += 263*3526Sxy150489 E1000_READ_REG(&Adapter->Shared, XONRXC); 264*3526Sxy150489 265*3526Sxy150489 e1000g_ksp->Xontxc.value.ul += 266*3526Sxy150489 E1000_READ_REG(&Adapter->Shared, XONTXC); 267*3526Sxy150489 268*3526Sxy150489 e1000g_ksp->Xoffrxc.value.ul += 269*3526Sxy150489 E1000_READ_REG(&Adapter->Shared, XOFFRXC); 270*3526Sxy150489 271*3526Sxy150489 e1000g_ksp->Xofftxc.value.ul += 272*3526Sxy150489 E1000_READ_REG(&Adapter->Shared, XOFFTXC); 273*3526Sxy150489 274*3526Sxy150489 e1000g_ksp->Fcruc.value.ul += 275*3526Sxy150489 E1000_READ_REG(&Adapter->Shared, FCRUC); 276*3526Sxy150489 277*3526Sxy150489 e1000g_ksp->Prc64.value.ul += 278*3526Sxy150489 E1000_READ_REG(&Adapter->Shared, PRC64); 279*3526Sxy150489 280*3526Sxy150489 e1000g_ksp->Prc127.value.ul += 281*3526Sxy150489 E1000_READ_REG(&Adapter->Shared, PRC127); 282*3526Sxy150489 283*3526Sxy150489 e1000g_ksp->Prc255.value.ul += 284*3526Sxy150489 E1000_READ_REG(&Adapter->Shared, PRC255); 285*3526Sxy150489 286*3526Sxy150489 e1000g_ksp->Prc511.value.ul += 287*3526Sxy150489 E1000_READ_REG(&Adapter->Shared, PRC511); 288*3526Sxy150489 289*3526Sxy150489 e1000g_ksp->Prc1023.value.ul += 290*3526Sxy150489 E1000_READ_REG(&Adapter->Shared, PRC1023); 291*3526Sxy150489 292*3526Sxy150489 e1000g_ksp->Prc1522.value.ul += 293*3526Sxy150489 E1000_READ_REG(&Adapter->Shared, PRC1522); 294*3526Sxy150489 295*3526Sxy150489 e1000g_ksp->Gprc.value.ul += 296*3526Sxy150489 E1000_READ_REG(&Adapter->Shared, GPRC); 297*3526Sxy150489 298*3526Sxy150489 e1000g_ksp->Gptc.value.ul += 299*3526Sxy150489 E1000_READ_REG(&Adapter->Shared, GPTC); 300*3526Sxy150489 301*3526Sxy150489 /* 302*3526Sxy150489 * The 64-bit register will reset whenever the upper 303*3526Sxy150489 * 32 bits are read. So we need to read the lower 304*3526Sxy150489 * 32 bits first, then read the upper 32 bits. 305*3526Sxy150489 */ 306*3526Sxy150489 low_val = E1000_READ_REG(&Adapter->Shared, GORCL); 307*3526Sxy150489 high_val = E1000_READ_REG(&Adapter->Shared, GORCH); 308*3526Sxy150489 val = (uint64_t)e1000g_ksp->Gorh.value.ul << 32 | 309*3526Sxy150489 (uint64_t)e1000g_ksp->Gorl.value.ul; 310*3526Sxy150489 val += (uint64_t)high_val << 32 | (uint64_t)low_val; 311*3526Sxy150489 e1000g_ksp->Gorl.value.ul = (uint32_t)val; 312*3526Sxy150489 e1000g_ksp->Gorh.value.ul = (uint32_t)(val >> 32); 313*3526Sxy150489 314*3526Sxy150489 low_val = E1000_READ_REG(&Adapter->Shared, GOTCL); 315*3526Sxy150489 high_val = E1000_READ_REG(&Adapter->Shared, GOTCH); 316*3526Sxy150489 val = (uint64_t)e1000g_ksp->Goth.value.ul << 32 | 317*3526Sxy150489 (uint64_t)e1000g_ksp->Gotl.value.ul; 318*3526Sxy150489 val += (uint64_t)high_val << 32 | (uint64_t)low_val; 319*3526Sxy150489 e1000g_ksp->Gotl.value.ul = (uint32_t)val; 320*3526Sxy150489 e1000g_ksp->Goth.value.ul = (uint32_t)(val >> 32); 321*3526Sxy150489 322*3526Sxy150489 e1000g_ksp->Ruc.value.ul += 323*3526Sxy150489 E1000_READ_REG(&Adapter->Shared, RUC); 324*3526Sxy150489 325*3526Sxy150489 e1000g_ksp->Rfc.value.ul += 326*3526Sxy150489 E1000_READ_REG(&Adapter->Shared, RFC); 327*3526Sxy150489 328*3526Sxy150489 e1000g_ksp->Roc.value.ul += 329*3526Sxy150489 E1000_READ_REG(&Adapter->Shared, ROC); 330*3526Sxy150489 331*3526Sxy150489 e1000g_ksp->Rjc.value.ul += 332*3526Sxy150489 E1000_READ_REG(&Adapter->Shared, RJC); 333*3526Sxy150489 334*3526Sxy150489 low_val = E1000_READ_REG(&Adapter->Shared, TORL); 335*3526Sxy150489 high_val = E1000_READ_REG(&Adapter->Shared, TORH); 336*3526Sxy150489 val = (uint64_t)e1000g_ksp->Torh.value.ul << 32 | 337*3526Sxy150489 (uint64_t)e1000g_ksp->Torl.value.ul; 338*3526Sxy150489 val += (uint64_t)high_val << 32 | (uint64_t)low_val; 339*3526Sxy150489 e1000g_ksp->Torl.value.ul = (uint32_t)val; 340*3526Sxy150489 e1000g_ksp->Torh.value.ul = (uint32_t)(val >> 32); 341*3526Sxy150489 342*3526Sxy150489 low_val = E1000_READ_REG(&Adapter->Shared, TOTL); 343*3526Sxy150489 high_val = E1000_READ_REG(&Adapter->Shared, TOTH); 344*3526Sxy150489 val = (uint64_t)e1000g_ksp->Toth.value.ul << 32 | 345*3526Sxy150489 (uint64_t)e1000g_ksp->Totl.value.ul; 346*3526Sxy150489 val += (uint64_t)high_val << 32 | (uint64_t)low_val; 347*3526Sxy150489 e1000g_ksp->Totl.value.ul = (uint32_t)val; 348*3526Sxy150489 e1000g_ksp->Toth.value.ul = (uint32_t)(val >> 32); 349*3526Sxy150489 350*3526Sxy150489 e1000g_ksp->Tpr.value.ul += 351*3526Sxy150489 E1000_READ_REG(&Adapter->Shared, TPR); 352*3526Sxy150489 353*3526Sxy150489 /* 354*3526Sxy150489 * Adaptive Calculations 355*3526Sxy150489 */ 356*3526Sxy150489 Adapter->Shared.tx_packet_delta = 357*3526Sxy150489 E1000_READ_REG(&Adapter->Shared, TPT); 358*3526Sxy150489 e1000g_ksp->Tpt.value.ul += 359*3526Sxy150489 Adapter->Shared.tx_packet_delta; 360*3526Sxy150489 361*3526Sxy150489 e1000g_ksp->Ptc64.value.ul += 362*3526Sxy150489 E1000_READ_REG(&Adapter->Shared, PTC64); 363*3526Sxy150489 364*3526Sxy150489 e1000g_ksp->Ptc127.value.ul += 365*3526Sxy150489 E1000_READ_REG(&Adapter->Shared, PTC127); 366*3526Sxy150489 367*3526Sxy150489 e1000g_ksp->Ptc255.value.ul += 368*3526Sxy150489 E1000_READ_REG(&Adapter->Shared, PTC255); 369*3526Sxy150489 370*3526Sxy150489 e1000g_ksp->Ptc511.value.ul += 371*3526Sxy150489 E1000_READ_REG(&Adapter->Shared, PTC511); 372*3526Sxy150489 373*3526Sxy150489 e1000g_ksp->Ptc1023.value.ul += 374*3526Sxy150489 E1000_READ_REG(&Adapter->Shared, PTC1023); 375*3526Sxy150489 376*3526Sxy150489 e1000g_ksp->Ptc1522.value.ul += 377*3526Sxy150489 E1000_READ_REG(&Adapter->Shared, PTC1522); 378*3526Sxy150489 379*3526Sxy150489 /* 380*3526Sxy150489 * Livengood Counters 381*3526Sxy150489 */ 382*3526Sxy150489 e1000g_ksp->Tncrs.value.ul += 383*3526Sxy150489 E1000_READ_REG(&Adapter->Shared, TNCRS); 384*3526Sxy150489 385*3526Sxy150489 e1000g_ksp->Tsctc.value.ul += 386*3526Sxy150489 E1000_READ_REG(&Adapter->Shared, TSCTC); 387*3526Sxy150489 388*3526Sxy150489 e1000g_ksp->Tsctfc.value.ul += 389*3526Sxy150489 E1000_READ_REG(&Adapter->Shared, TSCTFC); 390*3526Sxy150489 391*3526Sxy150489 /* 392*3526Sxy150489 * Mutex required if in TBI mode 393*3526Sxy150489 */ 394*3526Sxy150489 if (Adapter->Shared.tbi_compatibility_on == 1) { 395*3526Sxy150489 mutex_exit(&Adapter->TbiCntrMutex); 396*3526Sxy150489 } 397*3526Sxy150489 398*3526Sxy150489 return (0); 399*3526Sxy150489 } 400*3526Sxy150489 401*3526Sxy150489 int 402*3526Sxy150489 e1000g_m_stat(void *arg, uint_t stat, uint64_t *val) 403*3526Sxy150489 { 404*3526Sxy150489 struct e1000g *Adapter = (struct e1000g *)arg; 405*3526Sxy150489 e1000gstat *e1000g_ksp; 406*3526Sxy150489 uint32_t low_val, high_val; 407*3526Sxy150489 uint16_t phy_reg, phy_reg_2; 408*3526Sxy150489 409*3526Sxy150489 e1000g_ksp = (e1000gstat *)Adapter->e1000g_ksp->ks_data; 410*3526Sxy150489 411*3526Sxy150489 switch (stat) { 412*3526Sxy150489 case MAC_STAT_IFSPEED: 413*3526Sxy150489 *val = Adapter->link_speed * 1000000ull; 414*3526Sxy150489 break; 415*3526Sxy150489 416*3526Sxy150489 case MAC_STAT_MULTIRCV: 417*3526Sxy150489 e1000g_ksp->Mprc.value.ul += 418*3526Sxy150489 E1000_READ_REG(&Adapter->Shared, MPRC); 419*3526Sxy150489 *val = e1000g_ksp->Mprc.value.ul; 420*3526Sxy150489 break; 421*3526Sxy150489 422*3526Sxy150489 case MAC_STAT_BRDCSTRCV: 423*3526Sxy150489 e1000g_ksp->Bprc.value.ul += 424*3526Sxy150489 E1000_READ_REG(&Adapter->Shared, BPRC); 425*3526Sxy150489 *val = e1000g_ksp->Bprc.value.ul; 426*3526Sxy150489 break; 427*3526Sxy150489 428*3526Sxy150489 case MAC_STAT_MULTIXMT: 429*3526Sxy150489 e1000g_ksp->Mptc.value.ul += 430*3526Sxy150489 E1000_READ_REG(&Adapter->Shared, MPTC); 431*3526Sxy150489 *val = e1000g_ksp->Mptc.value.ul; 432*3526Sxy150489 break; 433*3526Sxy150489 434*3526Sxy150489 case MAC_STAT_BRDCSTXMT: 435*3526Sxy150489 e1000g_ksp->Bptc.value.ul += 436*3526Sxy150489 E1000_READ_REG(&Adapter->Shared, BPTC); 437*3526Sxy150489 *val = e1000g_ksp->Bptc.value.ul; 438*3526Sxy150489 break; 439*3526Sxy150489 440*3526Sxy150489 case MAC_STAT_NORCVBUF: 441*3526Sxy150489 e1000g_ksp->Rnbc.value.ul += 442*3526Sxy150489 E1000_READ_REG(&Adapter->Shared, RNBC); 443*3526Sxy150489 *val = e1000g_ksp->Rnbc.value.ul; 444*3526Sxy150489 break; 445*3526Sxy150489 446*3526Sxy150489 case MAC_STAT_IERRORS: 447*3526Sxy150489 e1000g_ksp->Rxerrc.value.ul += 448*3526Sxy150489 E1000_READ_REG(&Adapter->Shared, RXERRC); 449*3526Sxy150489 e1000g_ksp->Algnerrc.value.ul += 450*3526Sxy150489 E1000_READ_REG(&Adapter->Shared, ALGNERRC); 451*3526Sxy150489 e1000g_ksp->Rlec.value.ul += 452*3526Sxy150489 E1000_READ_REG(&Adapter->Shared, RLEC); 453*3526Sxy150489 e1000g_ksp->Crcerrs.value.ul += 454*3526Sxy150489 E1000_READ_REG(&Adapter->Shared, CRCERRS); 455*3526Sxy150489 e1000g_ksp->Cexterr.value.ul += 456*3526Sxy150489 E1000_READ_REG(&Adapter->Shared, CEXTERR); 457*3526Sxy150489 *val = e1000g_ksp->Rxerrc.value.ul + 458*3526Sxy150489 e1000g_ksp->Algnerrc.value.ul + 459*3526Sxy150489 e1000g_ksp->Rlec.value.ul + 460*3526Sxy150489 e1000g_ksp->Crcerrs.value.ul + 461*3526Sxy150489 e1000g_ksp->Cexterr.value.ul; 462*3526Sxy150489 break; 463*3526Sxy150489 464*3526Sxy150489 case MAC_STAT_NOXMTBUF: 465*3526Sxy150489 *val = Adapter->tx_no_desc; 466*3526Sxy150489 break; 467*3526Sxy150489 468*3526Sxy150489 case MAC_STAT_OERRORS: 469*3526Sxy150489 e1000g_ksp->Ecol.value.ul += 470*3526Sxy150489 E1000_READ_REG(&Adapter->Shared, ECOL); 471*3526Sxy150489 *val = e1000g_ksp->Ecol.value.ul; 472*3526Sxy150489 break; 473*3526Sxy150489 474*3526Sxy150489 case MAC_STAT_COLLISIONS: 475*3526Sxy150489 e1000g_ksp->Colc.value.ul += 476*3526Sxy150489 E1000_READ_REG(&Adapter->Shared, COLC); 477*3526Sxy150489 *val = e1000g_ksp->Colc.value.ul; 478*3526Sxy150489 break; 479*3526Sxy150489 480*3526Sxy150489 case MAC_STAT_RBYTES: 481*3526Sxy150489 /* 482*3526Sxy150489 * The 64-bit register will reset whenever the upper 483*3526Sxy150489 * 32 bits are read. So we need to read the lower 484*3526Sxy150489 * 32 bits first, then read the upper 32 bits. 485*3526Sxy150489 */ 486*3526Sxy150489 low_val = E1000_READ_REG(&Adapter->Shared, TORL); 487*3526Sxy150489 high_val = E1000_READ_REG(&Adapter->Shared, TORH); 488*3526Sxy150489 *val = (uint64_t)e1000g_ksp->Torh.value.ul << 32 | 489*3526Sxy150489 (uint64_t)e1000g_ksp->Torl.value.ul; 490*3526Sxy150489 *val += (uint64_t)high_val << 32 | (uint64_t)low_val; 491*3526Sxy150489 492*3526Sxy150489 e1000g_ksp->Torl.value.ul = (uint32_t)*val; 493*3526Sxy150489 e1000g_ksp->Torh.value.ul = (uint32_t)(*val >> 32); 494*3526Sxy150489 break; 495*3526Sxy150489 496*3526Sxy150489 case MAC_STAT_IPACKETS: 497*3526Sxy150489 e1000g_ksp->Tpr.value.ul += 498*3526Sxy150489 E1000_READ_REG(&Adapter->Shared, TPR); 499*3526Sxy150489 *val = e1000g_ksp->Tpr.value.ul; 500*3526Sxy150489 break; 501*3526Sxy150489 502*3526Sxy150489 case MAC_STAT_OBYTES: 503*3526Sxy150489 /* 504*3526Sxy150489 * The 64-bit register will reset whenever the upper 505*3526Sxy150489 * 32 bits are read. So we need to read the lower 506*3526Sxy150489 * 32 bits first, then read the upper 32 bits. 507*3526Sxy150489 */ 508*3526Sxy150489 low_val = E1000_READ_REG(&Adapter->Shared, TOTL); 509*3526Sxy150489 high_val = E1000_READ_REG(&Adapter->Shared, TOTH); 510*3526Sxy150489 *val = (uint64_t)e1000g_ksp->Toth.value.ul << 32 | 511*3526Sxy150489 (uint64_t)e1000g_ksp->Totl.value.ul; 512*3526Sxy150489 *val += (uint64_t)high_val << 32 | (uint64_t)low_val; 513*3526Sxy150489 514*3526Sxy150489 e1000g_ksp->Totl.value.ul = (uint32_t)*val; 515*3526Sxy150489 e1000g_ksp->Toth.value.ul = (uint32_t)(*val >> 32); 516*3526Sxy150489 break; 517*3526Sxy150489 518*3526Sxy150489 case MAC_STAT_OPACKETS: 519*3526Sxy150489 e1000g_ksp->Tpt.value.ul += 520*3526Sxy150489 E1000_READ_REG(&Adapter->Shared, TPT); 521*3526Sxy150489 *val = e1000g_ksp->Tpt.value.ul; 522*3526Sxy150489 break; 523*3526Sxy150489 524*3526Sxy150489 case ETHER_STAT_ALIGN_ERRORS: 525*3526Sxy150489 e1000g_ksp->Algnerrc.value.ul += 526*3526Sxy150489 E1000_READ_REG(&Adapter->Shared, ALGNERRC); 527*3526Sxy150489 *val = e1000g_ksp->Algnerrc.value.ul; 528*3526Sxy150489 break; 529*3526Sxy150489 530*3526Sxy150489 case ETHER_STAT_FCS_ERRORS: 531*3526Sxy150489 e1000g_ksp->Crcerrs.value.ul += 532*3526Sxy150489 E1000_READ_REG(&Adapter->Shared, CRCERRS); 533*3526Sxy150489 *val = e1000g_ksp->Crcerrs.value.ul; 534*3526Sxy150489 break; 535*3526Sxy150489 536*3526Sxy150489 case ETHER_STAT_SQE_ERRORS: 537*3526Sxy150489 e1000g_ksp->Sec.value.ul += 538*3526Sxy150489 E1000_READ_REG(&Adapter->Shared, SEC); 539*3526Sxy150489 *val = e1000g_ksp->Sec.value.ul; 540*3526Sxy150489 break; 541*3526Sxy150489 542*3526Sxy150489 case ETHER_STAT_CARRIER_ERRORS: 543*3526Sxy150489 e1000g_ksp->Cexterr.value.ul += 544*3526Sxy150489 E1000_READ_REG(&Adapter->Shared, CEXTERR); 545*3526Sxy150489 *val = e1000g_ksp->Cexterr.value.ul; 546*3526Sxy150489 break; 547*3526Sxy150489 548*3526Sxy150489 case ETHER_STAT_EX_COLLISIONS: 549*3526Sxy150489 e1000g_ksp->Ecol.value.ul += 550*3526Sxy150489 E1000_READ_REG(&Adapter->Shared, ECOL); 551*3526Sxy150489 *val = e1000g_ksp->Ecol.value.ul; 552*3526Sxy150489 break; 553*3526Sxy150489 554*3526Sxy150489 case ETHER_STAT_TX_LATE_COLLISIONS: 555*3526Sxy150489 e1000g_ksp->Latecol.value.ul += 556*3526Sxy150489 E1000_READ_REG(&Adapter->Shared, LATECOL); 557*3526Sxy150489 *val = e1000g_ksp->Latecol.value.ul; 558*3526Sxy150489 break; 559*3526Sxy150489 560*3526Sxy150489 case ETHER_STAT_DEFER_XMTS: 561*3526Sxy150489 e1000g_ksp->Dc.value.ul += 562*3526Sxy150489 E1000_READ_REG(&Adapter->Shared, DC); 563*3526Sxy150489 *val = e1000g_ksp->Dc.value.ul; 564*3526Sxy150489 break; 565*3526Sxy150489 566*3526Sxy150489 case ETHER_STAT_FIRST_COLLISIONS: 567*3526Sxy150489 e1000g_ksp->Scc.value.ul += 568*3526Sxy150489 E1000_READ_REG(&Adapter->Shared, SCC); 569*3526Sxy150489 *val = e1000g_ksp->Scc.value.ul; 570*3526Sxy150489 break; 571*3526Sxy150489 572*3526Sxy150489 case ETHER_STAT_MULTI_COLLISIONS: 573*3526Sxy150489 e1000g_ksp->Mcc.value.ul += 574*3526Sxy150489 E1000_READ_REG(&Adapter->Shared, MCC); 575*3526Sxy150489 *val = e1000g_ksp->Mcc.value.ul; 576*3526Sxy150489 break; 577*3526Sxy150489 578*3526Sxy150489 case ETHER_STAT_MACRCV_ERRORS: 579*3526Sxy150489 e1000g_ksp->Rxerrc.value.ul += 580*3526Sxy150489 E1000_READ_REG(&Adapter->Shared, RXERRC); 581*3526Sxy150489 *val = e1000g_ksp->Rxerrc.value.ul; 582*3526Sxy150489 break; 583*3526Sxy150489 584*3526Sxy150489 case ETHER_STAT_MACXMT_ERRORS: 585*3526Sxy150489 e1000g_ksp->Ecol.value.ul += 586*3526Sxy150489 E1000_READ_REG(&Adapter->Shared, ECOL); 587*3526Sxy150489 *val = e1000g_ksp->Ecol.value.ul; 588*3526Sxy150489 break; 589*3526Sxy150489 590*3526Sxy150489 case ETHER_STAT_TOOLONG_ERRORS: 591*3526Sxy150489 e1000g_ksp->Roc.value.ul += 592*3526Sxy150489 E1000_READ_REG(&Adapter->Shared, ROC); 593*3526Sxy150489 *val = e1000g_ksp->Roc.value.ul; 594*3526Sxy150489 break; 595*3526Sxy150489 596*3526Sxy150489 case ETHER_STAT_XCVR_ADDR: 597*3526Sxy150489 /* The Internal PHY's MDI address for each MAC is 1 */ 598*3526Sxy150489 *val = 1; 599*3526Sxy150489 break; 600*3526Sxy150489 601*3526Sxy150489 case ETHER_STAT_XCVR_ID: 602*3526Sxy150489 e1000_read_phy_reg(&Adapter->Shared, PHY_ID1, &phy_reg); 603*3526Sxy150489 e1000_read_phy_reg(&Adapter->Shared, PHY_ID2, &phy_reg_2); 604*3526Sxy150489 *val = (uint32_t)((phy_reg << 16) | phy_reg_2); 605*3526Sxy150489 break; 606*3526Sxy150489 607*3526Sxy150489 case ETHER_STAT_XCVR_INUSE: 608*3526Sxy150489 e1000_read_phy_reg(&Adapter->Shared, PHY_STATUS, &phy_reg); 609*3526Sxy150489 switch (Adapter->link_speed) { 610*3526Sxy150489 case SPEED_1000: 611*3526Sxy150489 *val = 612*3526Sxy150489 (Adapter->Shared.media_type == 613*3526Sxy150489 e1000_media_type_copper) ? XCVR_1000T : 614*3526Sxy150489 XCVR_1000X; 615*3526Sxy150489 break; 616*3526Sxy150489 case SPEED_100: 617*3526Sxy150489 *val = 618*3526Sxy150489 (Adapter->Shared.media_type == 619*3526Sxy150489 e1000_media_type_copper) ? (phy_reg & 620*3526Sxy150489 MII_SR_100T4_CAPS) ? XCVR_100T4 : XCVR_100T2 : 621*3526Sxy150489 XCVR_100X; 622*3526Sxy150489 break; 623*3526Sxy150489 case SPEED_10: 624*3526Sxy150489 *val = XCVR_10; 625*3526Sxy150489 break; 626*3526Sxy150489 default: 627*3526Sxy150489 *val = XCVR_NONE; 628*3526Sxy150489 break; 629*3526Sxy150489 } 630*3526Sxy150489 break; 631*3526Sxy150489 632*3526Sxy150489 case ETHER_STAT_CAP_1000FDX: 633*3526Sxy150489 e1000_read_phy_reg(&Adapter->Shared, PHY_EXT_STATUS, 634*3526Sxy150489 &phy_reg); 635*3526Sxy150489 *val = ((phy_reg & IEEE_ESR_1000T_FD_CAPS) || 636*3526Sxy150489 (phy_reg & IEEE_ESR_1000X_FD_CAPS)) ? 1 : 0; 637*3526Sxy150489 break; 638*3526Sxy150489 639*3526Sxy150489 case ETHER_STAT_CAP_1000HDX: 640*3526Sxy150489 e1000_read_phy_reg(&Adapter->Shared, PHY_EXT_STATUS, 641*3526Sxy150489 &phy_reg); 642*3526Sxy150489 *val = ((phy_reg & IEEE_ESR_1000T_HD_CAPS) || 643*3526Sxy150489 (phy_reg & IEEE_ESR_1000X_HD_CAPS)) ? 1 : 0; 644*3526Sxy150489 break; 645*3526Sxy150489 646*3526Sxy150489 case ETHER_STAT_CAP_100FDX: 647*3526Sxy150489 e1000_read_phy_reg(&Adapter->Shared, PHY_STATUS, &phy_reg); 648*3526Sxy150489 *val = ((phy_reg & MII_SR_100X_FD_CAPS) || 649*3526Sxy150489 (phy_reg & MII_SR_100T2_FD_CAPS)) ? 1 : 0; 650*3526Sxy150489 break; 651*3526Sxy150489 652*3526Sxy150489 case ETHER_STAT_CAP_100HDX: 653*3526Sxy150489 e1000_read_phy_reg(&Adapter->Shared, PHY_STATUS, &phy_reg); 654*3526Sxy150489 *val = ((phy_reg & MII_SR_100X_HD_CAPS) || 655*3526Sxy150489 (phy_reg & MII_SR_100T2_HD_CAPS)) ? 1 : 0; 656*3526Sxy150489 break; 657*3526Sxy150489 658*3526Sxy150489 case ETHER_STAT_CAP_10FDX: 659*3526Sxy150489 e1000_read_phy_reg(&Adapter->Shared, PHY_STATUS, &phy_reg); 660*3526Sxy150489 *val = (phy_reg & MII_SR_10T_FD_CAPS) ? 1 : 0; 661*3526Sxy150489 break; 662*3526Sxy150489 663*3526Sxy150489 case ETHER_STAT_CAP_10HDX: 664*3526Sxy150489 e1000_read_phy_reg(&Adapter->Shared, PHY_STATUS, &phy_reg); 665*3526Sxy150489 *val = (phy_reg & MII_SR_10T_HD_CAPS) ? 1 : 0; 666*3526Sxy150489 break; 667*3526Sxy150489 668*3526Sxy150489 case ETHER_STAT_CAP_ASMPAUSE: 669*3526Sxy150489 e1000_read_phy_reg(&Adapter->Shared, PHY_AUTONEG_ADV, 670*3526Sxy150489 &phy_reg); 671*3526Sxy150489 *val = (phy_reg & NWAY_AR_ASM_DIR) ? 1 : 0; 672*3526Sxy150489 break; 673*3526Sxy150489 674*3526Sxy150489 case ETHER_STAT_CAP_PAUSE: 675*3526Sxy150489 e1000_read_phy_reg(&Adapter->Shared, PHY_AUTONEG_ADV, 676*3526Sxy150489 &phy_reg); 677*3526Sxy150489 *val = (phy_reg & NWAY_AR_PAUSE) ? 1 : 0; 678*3526Sxy150489 break; 679*3526Sxy150489 680*3526Sxy150489 case ETHER_STAT_CAP_AUTONEG: 681*3526Sxy150489 e1000_read_phy_reg(&Adapter->Shared, PHY_STATUS, &phy_reg); 682*3526Sxy150489 *val = (phy_reg & MII_SR_AUTONEG_CAPS) ? 1 : 0; 683*3526Sxy150489 break; 684*3526Sxy150489 685*3526Sxy150489 case ETHER_STAT_ADV_CAP_1000FDX: 686*3526Sxy150489 e1000_read_phy_reg(&Adapter->Shared, PHY_1000T_CTRL, 687*3526Sxy150489 &phy_reg); 688*3526Sxy150489 *val = (phy_reg & CR_1000T_FD_CAPS) ? 1 : 0; 689*3526Sxy150489 break; 690*3526Sxy150489 691*3526Sxy150489 case ETHER_STAT_ADV_CAP_1000HDX: 692*3526Sxy150489 e1000_read_phy_reg(&Adapter->Shared, PHY_1000T_CTRL, 693*3526Sxy150489 &phy_reg); 694*3526Sxy150489 *val = (phy_reg & CR_1000T_HD_CAPS) ? 1 : 0; 695*3526Sxy150489 break; 696*3526Sxy150489 697*3526Sxy150489 case ETHER_STAT_ADV_CAP_100FDX: 698*3526Sxy150489 e1000_read_phy_reg(&Adapter->Shared, PHY_AUTONEG_ADV, 699*3526Sxy150489 &phy_reg); 700*3526Sxy150489 *val = (phy_reg & NWAY_AR_100TX_FD_CAPS) ? 1 : 0; 701*3526Sxy150489 break; 702*3526Sxy150489 703*3526Sxy150489 case ETHER_STAT_ADV_CAP_100HDX: 704*3526Sxy150489 e1000_read_phy_reg(&Adapter->Shared, PHY_AUTONEG_ADV, 705*3526Sxy150489 &phy_reg); 706*3526Sxy150489 *val = (phy_reg & NWAY_AR_100TX_HD_CAPS) ? 1 : 0; 707*3526Sxy150489 break; 708*3526Sxy150489 709*3526Sxy150489 case ETHER_STAT_ADV_CAP_10FDX: 710*3526Sxy150489 e1000_read_phy_reg(&Adapter->Shared, PHY_AUTONEG_ADV, 711*3526Sxy150489 &phy_reg); 712*3526Sxy150489 *val = (phy_reg & NWAY_AR_10T_FD_CAPS) ? 1 : 0; 713*3526Sxy150489 break; 714*3526Sxy150489 715*3526Sxy150489 case ETHER_STAT_ADV_CAP_10HDX: 716*3526Sxy150489 e1000_read_phy_reg(&Adapter->Shared, PHY_AUTONEG_ADV, 717*3526Sxy150489 &phy_reg); 718*3526Sxy150489 *val = (phy_reg & NWAY_AR_10T_HD_CAPS) ? 1 : 0; 719*3526Sxy150489 break; 720*3526Sxy150489 721*3526Sxy150489 case ETHER_STAT_ADV_CAP_ASMPAUSE: 722*3526Sxy150489 e1000_read_phy_reg(&Adapter->Shared, PHY_AUTONEG_ADV, 723*3526Sxy150489 &phy_reg); 724*3526Sxy150489 *val = (phy_reg & NWAY_AR_ASM_DIR) ? 1 : 0; 725*3526Sxy150489 break; 726*3526Sxy150489 727*3526Sxy150489 case ETHER_STAT_ADV_CAP_PAUSE: 728*3526Sxy150489 e1000_read_phy_reg(&Adapter->Shared, PHY_AUTONEG_ADV, 729*3526Sxy150489 &phy_reg); 730*3526Sxy150489 *val = (phy_reg & NWAY_AR_PAUSE) ? 1 : 0; 731*3526Sxy150489 break; 732*3526Sxy150489 733*3526Sxy150489 case ETHER_STAT_ADV_CAP_AUTONEG: 734*3526Sxy150489 *val = Adapter->Shared.autoneg; 735*3526Sxy150489 break; 736*3526Sxy150489 737*3526Sxy150489 case ETHER_STAT_LP_CAP_1000FDX: 738*3526Sxy150489 e1000_read_phy_reg(&Adapter->Shared, PHY_1000T_STATUS, 739*3526Sxy150489 &phy_reg); 740*3526Sxy150489 *val = (phy_reg & SR_1000T_LP_FD_CAPS) ? 1 : 0; 741*3526Sxy150489 break; 742*3526Sxy150489 743*3526Sxy150489 case ETHER_STAT_LP_CAP_1000HDX: 744*3526Sxy150489 e1000_read_phy_reg(&Adapter->Shared, PHY_1000T_STATUS, 745*3526Sxy150489 &phy_reg); 746*3526Sxy150489 *val = (phy_reg & SR_1000T_LP_HD_CAPS) ? 1 : 0; 747*3526Sxy150489 break; 748*3526Sxy150489 749*3526Sxy150489 case ETHER_STAT_LP_CAP_100FDX: 750*3526Sxy150489 e1000_read_phy_reg(&Adapter->Shared, PHY_LP_ABILITY, 751*3526Sxy150489 &phy_reg); 752*3526Sxy150489 *val = (phy_reg & NWAY_LPAR_100TX_FD_CAPS) ? 1 : 0; 753*3526Sxy150489 break; 754*3526Sxy150489 755*3526Sxy150489 case ETHER_STAT_LP_CAP_100HDX: 756*3526Sxy150489 e1000_read_phy_reg(&Adapter->Shared, PHY_LP_ABILITY, 757*3526Sxy150489 &phy_reg); 758*3526Sxy150489 *val = (phy_reg & NWAY_LPAR_100TX_HD_CAPS) ? 1 : 0; 759*3526Sxy150489 break; 760*3526Sxy150489 761*3526Sxy150489 case ETHER_STAT_LP_CAP_10FDX: 762*3526Sxy150489 e1000_read_phy_reg(&Adapter->Shared, PHY_LP_ABILITY, 763*3526Sxy150489 &phy_reg); 764*3526Sxy150489 *val = (phy_reg & NWAY_LPAR_10T_FD_CAPS) ? 1 : 0; 765*3526Sxy150489 break; 766*3526Sxy150489 767*3526Sxy150489 case ETHER_STAT_LP_CAP_10HDX: 768*3526Sxy150489 e1000_read_phy_reg(&Adapter->Shared, PHY_LP_ABILITY, 769*3526Sxy150489 &phy_reg); 770*3526Sxy150489 *val = (phy_reg & NWAY_LPAR_10T_HD_CAPS) ? 1 : 0; 771*3526Sxy150489 break; 772*3526Sxy150489 773*3526Sxy150489 case ETHER_STAT_LP_CAP_ASMPAUSE: 774*3526Sxy150489 e1000_read_phy_reg(&Adapter->Shared, PHY_LP_ABILITY, 775*3526Sxy150489 &phy_reg); 776*3526Sxy150489 *val = (phy_reg & NWAY_LPAR_ASM_DIR) ? 1 : 0; 777*3526Sxy150489 break; 778*3526Sxy150489 779*3526Sxy150489 case ETHER_STAT_LP_CAP_PAUSE: 780*3526Sxy150489 e1000_read_phy_reg(&Adapter->Shared, PHY_LP_ABILITY, 781*3526Sxy150489 &phy_reg); 782*3526Sxy150489 *val = (phy_reg & NWAY_LPAR_PAUSE) ? 1 : 0; 783*3526Sxy150489 break; 784*3526Sxy150489 785*3526Sxy150489 case ETHER_STAT_LP_CAP_AUTONEG: 786*3526Sxy150489 e1000_read_phy_reg(&Adapter->Shared, PHY_AUTONEG_EXP, 787*3526Sxy150489 &phy_reg); 788*3526Sxy150489 *val = (phy_reg & NWAY_ER_LP_NWAY_CAPS) ? 1 : 0; 789*3526Sxy150489 break; 790*3526Sxy150489 791*3526Sxy150489 case ETHER_STAT_LINK_ASMPAUSE: 792*3526Sxy150489 e1000_read_phy_reg(&Adapter->Shared, PHY_AUTONEG_ADV, 793*3526Sxy150489 &phy_reg); 794*3526Sxy150489 *val = (phy_reg & NWAY_AR_ASM_DIR) ? 1 : 0; 795*3526Sxy150489 break; 796*3526Sxy150489 797*3526Sxy150489 case ETHER_STAT_LINK_PAUSE: 798*3526Sxy150489 e1000_read_phy_reg(&Adapter->Shared, PHY_AUTONEG_ADV, 799*3526Sxy150489 &phy_reg); 800*3526Sxy150489 *val = (phy_reg & NWAY_AR_PAUSE) ? 1 : 0; 801*3526Sxy150489 break; 802*3526Sxy150489 803*3526Sxy150489 case ETHER_STAT_LINK_AUTONEG: 804*3526Sxy150489 e1000_read_phy_reg(&Adapter->Shared, PHY_CTRL, &phy_reg); 805*3526Sxy150489 *val = (phy_reg & MII_CR_AUTO_NEG_EN) ? 1 : 0; 806*3526Sxy150489 break; 807*3526Sxy150489 808*3526Sxy150489 case ETHER_STAT_LINK_DUPLEX: 809*3526Sxy150489 *val = (Adapter->link_duplex == FULL_DUPLEX) ? 810*3526Sxy150489 LINK_DUPLEX_FULL : LINK_DUPLEX_HALF; 811*3526Sxy150489 break; 812*3526Sxy150489 813*3526Sxy150489 default: 814*3526Sxy150489 return (ENOTSUP); 815*3526Sxy150489 } 816*3526Sxy150489 817*3526Sxy150489 return (0); 818*3526Sxy150489 } 819*3526Sxy150489 820*3526Sxy150489 /* 821*3526Sxy150489 * ********************************************************************** 822*3526Sxy150489 * Name: InitStatsCounters * 823*3526Sxy150489 * * 824*3526Sxy150489 * Description: This routine will create and initialize the kernel * 825*3526Sxy150489 * statistics counters. * 826*3526Sxy150489 * * 827*3526Sxy150489 * Author: Phil Cayton * 828*3526Sxy150489 * * 829*3526Sxy150489 * Born on Date: 7/13/98 * 830*3526Sxy150489 * * 831*3526Sxy150489 * Arguments: * 832*3526Sxy150489 * Adapter - A pointer to our context sensitive "Adapter" * 833*3526Sxy150489 * structure. * 834*3526Sxy150489 * * 835*3526Sxy150489 * Returns: * 836*3526Sxy150489 * '0' if unable to create kernel statistics structure. * 837*3526Sxy150489 * '1' if creation and initialization successful * 838*3526Sxy150489 * * 839*3526Sxy150489 * File: e1000g_stat.c * 840*3526Sxy150489 * * 841*3526Sxy150489 * Modification log: * 842*3526Sxy150489 * Date Who Description * 843*3526Sxy150489 * -------- --- ------------------------------------------------------* 844*3526Sxy150489 * * 845*3526Sxy150489 * ********************************************************************** 846*3526Sxy150489 */ 847*3526Sxy150489 int 848*3526Sxy150489 InitStatsCounters(IN struct e1000g *Adapter) 849*3526Sxy150489 { 850*3526Sxy150489 kstat_t *ksp; 851*3526Sxy150489 e1000gstat *e1000g_ksp; 852*3526Sxy150489 853*3526Sxy150489 /* 854*3526Sxy150489 * Create and init kstat 855*3526Sxy150489 */ 856*3526Sxy150489 ksp = kstat_create(WSNAME, ddi_get_instance(Adapter->dip), 857*3526Sxy150489 "statistics", "net", KSTAT_TYPE_NAMED, 858*3526Sxy150489 sizeof (e1000gstat) / sizeof (kstat_named_t), 0); 859*3526Sxy150489 860*3526Sxy150489 if (ksp == NULL) { 861*3526Sxy150489 e1000g_log(Adapter, CE_WARN, 862*3526Sxy150489 "Could not create kernel statistics\n"); 863*3526Sxy150489 return (DDI_FAILURE); 864*3526Sxy150489 } 865*3526Sxy150489 866*3526Sxy150489 Adapter->e1000g_ksp = ksp; /* Fill in the Adapters ksp */ 867*3526Sxy150489 868*3526Sxy150489 e1000g_ksp = (e1000gstat *) ksp->ks_data; 869*3526Sxy150489 870*3526Sxy150489 /* 871*3526Sxy150489 * Initialize all the statistics 872*3526Sxy150489 */ 873*3526Sxy150489 kstat_named_init(&e1000g_ksp->link_up, "link_up", 874*3526Sxy150489 KSTAT_DATA_ULONG); 875*3526Sxy150489 876*3526Sxy150489 kstat_named_init(&e1000g_ksp->link_speed, "link_speed", 877*3526Sxy150489 KSTAT_DATA_ULONG); 878*3526Sxy150489 879*3526Sxy150489 kstat_named_init(&e1000g_ksp->rx_none, "Rx No Data", 880*3526Sxy150489 KSTAT_DATA_ULONG); 881*3526Sxy150489 882*3526Sxy150489 kstat_named_init(&e1000g_ksp->rx_error, "Rx Error", 883*3526Sxy150489 KSTAT_DATA_ULONG); 884*3526Sxy150489 885*3526Sxy150489 kstat_named_init(&e1000g_ksp->rx_no_freepkt, "Rx Freelist Empty", 886*3526Sxy150489 KSTAT_DATA_ULONG); 887*3526Sxy150489 888*3526Sxy150489 kstat_named_init(&e1000g_ksp->rx_avail_freepkt, "Rx Freelist Avail", 889*3526Sxy150489 KSTAT_DATA_ULONG); 890*3526Sxy150489 891*3526Sxy150489 kstat_named_init(&e1000g_ksp->rx_esballoc_fail, "Rx Desballoc Failure", 892*3526Sxy150489 KSTAT_DATA_ULONG); 893*3526Sxy150489 894*3526Sxy150489 kstat_named_init(&e1000g_ksp->rx_exceed_pkt, "Rx Exceed Max Pkt Count", 895*3526Sxy150489 KSTAT_DATA_ULONG); 896*3526Sxy150489 897*3526Sxy150489 kstat_named_init(&e1000g_ksp->rx_multi_desc, "Rx Span Multi Desc", 898*3526Sxy150489 KSTAT_DATA_ULONG); 899*3526Sxy150489 900*3526Sxy150489 kstat_named_init(&e1000g_ksp->rx_allocb_fail, "Rx Allocb Failure", 901*3526Sxy150489 KSTAT_DATA_ULONG); 902*3526Sxy150489 903*3526Sxy150489 kstat_named_init(&e1000g_ksp->rx_seq_intr, "Rx Seq Err Intr", 904*3526Sxy150489 KSTAT_DATA_ULONG); 905*3526Sxy150489 906*3526Sxy150489 kstat_named_init(&e1000g_ksp->tx_no_desc, "Tx No Desc", 907*3526Sxy150489 KSTAT_DATA_ULONG); 908*3526Sxy150489 909*3526Sxy150489 kstat_named_init(&e1000g_ksp->tx_no_swpkt, "Tx No Buffer", 910*3526Sxy150489 KSTAT_DATA_ULONG); 911*3526Sxy150489 912*3526Sxy150489 kstat_named_init(&e1000g_ksp->tx_lack_desc, "Tx Desc Insufficient", 913*3526Sxy150489 KSTAT_DATA_ULONG); 914*3526Sxy150489 915*3526Sxy150489 kstat_named_init(&e1000g_ksp->tx_send_fail, 916*3526Sxy150489 "Tx Send Failure", KSTAT_DATA_ULONG); 917*3526Sxy150489 918*3526Sxy150489 kstat_named_init(&e1000g_ksp->tx_multi_cookie, 919*3526Sxy150489 "Tx Bind Multi Cookies", KSTAT_DATA_ULONG); 920*3526Sxy150489 921*3526Sxy150489 kstat_named_init(&e1000g_ksp->tx_over_size, "Tx Pkt Over Size", 922*3526Sxy150489 KSTAT_DATA_ULONG); 923*3526Sxy150489 924*3526Sxy150489 kstat_named_init(&e1000g_ksp->tx_under_size, "Tx Pkt Under Size", 925*3526Sxy150489 KSTAT_DATA_ULONG); 926*3526Sxy150489 927*3526Sxy150489 kstat_named_init(&e1000g_ksp->tx_copy, "Tx Send Copy", 928*3526Sxy150489 KSTAT_DATA_ULONG); 929*3526Sxy150489 930*3526Sxy150489 kstat_named_init(&e1000g_ksp->tx_bind, "Tx Send Bind", 931*3526Sxy150489 KSTAT_DATA_ULONG); 932*3526Sxy150489 933*3526Sxy150489 kstat_named_init(&e1000g_ksp->tx_multi_copy, "Tx Copy Multi Frags", 934*3526Sxy150489 KSTAT_DATA_ULONG); 935*3526Sxy150489 936*3526Sxy150489 kstat_named_init(&e1000g_ksp->tx_reschedule, "Tx Reschedule", 937*3526Sxy150489 KSTAT_DATA_ULONG); 938*3526Sxy150489 939*3526Sxy150489 kstat_named_init(&e1000g_ksp->tx_empty_frags, "Tx Empty Frags", 940*3526Sxy150489 KSTAT_DATA_ULONG); 941*3526Sxy150489 942*3526Sxy150489 kstat_named_init(&e1000g_ksp->tx_exceed_frags, "Tx Exceed Max Frags", 943*3526Sxy150489 KSTAT_DATA_ULONG); 944*3526Sxy150489 945*3526Sxy150489 kstat_named_init(&e1000g_ksp->tx_recycle, 946*3526Sxy150489 "Tx Desc Recycle", KSTAT_DATA_ULONG); 947*3526Sxy150489 948*3526Sxy150489 kstat_named_init(&e1000g_ksp->tx_recycle_retry, 949*3526Sxy150489 "Tx Desc Recycle Retry", KSTAT_DATA_ULONG); 950*3526Sxy150489 951*3526Sxy150489 kstat_named_init(&e1000g_ksp->tx_recycle_intr, 952*3526Sxy150489 "Tx Desc Recycle Intr", KSTAT_DATA_ULONG); 953*3526Sxy150489 954*3526Sxy150489 kstat_named_init(&e1000g_ksp->tx_recycle_none, 955*3526Sxy150489 "Tx Desc Recycled None", KSTAT_DATA_ULONG); 956*3526Sxy150489 957*3526Sxy150489 kstat_named_init(&e1000g_ksp->StallWatchdog, 958*3526Sxy150489 "Tx Stall Watchdog", KSTAT_DATA_ULONG); 959*3526Sxy150489 960*3526Sxy150489 kstat_named_init(&e1000g_ksp->reset_count, 961*3526Sxy150489 "Reset Count", KSTAT_DATA_ULONG); 962*3526Sxy150489 963*3526Sxy150489 kstat_named_init(&e1000g_ksp->intr_type, 964*3526Sxy150489 "Interrupt Type", KSTAT_DATA_ULONG); 965*3526Sxy150489 966*3526Sxy150489 kstat_named_init(&e1000g_ksp->Mpc, "Recv_Missed_Packets", 967*3526Sxy150489 KSTAT_DATA_ULONG); 968*3526Sxy150489 969*3526Sxy150489 kstat_named_init(&e1000g_ksp->Symerrs, "Recv_Symbol_Errors", 970*3526Sxy150489 KSTAT_DATA_ULONG); 971*3526Sxy150489 972*3526Sxy150489 kstat_named_init(&e1000g_ksp->Rlec, "Recv_Length_Errors", 973*3526Sxy150489 KSTAT_DATA_ULONG); 974*3526Sxy150489 975*3526Sxy150489 kstat_named_init(&e1000g_ksp->Xonrxc, "XONs_Recvd", 976*3526Sxy150489 KSTAT_DATA_ULONG); 977*3526Sxy150489 978*3526Sxy150489 kstat_named_init(&e1000g_ksp->Xontxc, "XONs_Xmitd", 979*3526Sxy150489 KSTAT_DATA_ULONG); 980*3526Sxy150489 981*3526Sxy150489 kstat_named_init(&e1000g_ksp->Xoffrxc, "XOFFs_Recvd", 982*3526Sxy150489 KSTAT_DATA_ULONG); 983*3526Sxy150489 984*3526Sxy150489 kstat_named_init(&e1000g_ksp->Xofftxc, "XOFFs_Xmitd", 985*3526Sxy150489 KSTAT_DATA_ULONG); 986*3526Sxy150489 987*3526Sxy150489 kstat_named_init(&e1000g_ksp->Fcruc, "Recv_Unsupport_FC_Pkts", 988*3526Sxy150489 KSTAT_DATA_ULONG); 989*3526Sxy150489 990*3526Sxy150489 kstat_named_init(&e1000g_ksp->Prc64, "Pkts_Recvd_( 64b)", 991*3526Sxy150489 KSTAT_DATA_ULONG); 992*3526Sxy150489 993*3526Sxy150489 kstat_named_init(&e1000g_ksp->Prc127, "Pkts_Recvd_( 65- 127b)", 994*3526Sxy150489 KSTAT_DATA_ULONG); 995*3526Sxy150489 996*3526Sxy150489 kstat_named_init(&e1000g_ksp->Prc255, "Pkts_Recvd_( 127- 255b)", 997*3526Sxy150489 KSTAT_DATA_ULONG); 998*3526Sxy150489 999*3526Sxy150489 kstat_named_init(&e1000g_ksp->Prc511, "Pkts_Recvd_( 256- 511b)", 1000*3526Sxy150489 KSTAT_DATA_ULONG); 1001*3526Sxy150489 1002*3526Sxy150489 kstat_named_init(&e1000g_ksp->Prc1023, "Pkts_Recvd_( 511-1023b)", 1003*3526Sxy150489 KSTAT_DATA_ULONG); 1004*3526Sxy150489 1005*3526Sxy150489 kstat_named_init(&e1000g_ksp->Prc1522, "Pkts_Recvd_(1024-1522b)", 1006*3526Sxy150489 KSTAT_DATA_ULONG); 1007*3526Sxy150489 1008*3526Sxy150489 kstat_named_init(&e1000g_ksp->Gprc, "Good_Pkts_Recvd", 1009*3526Sxy150489 KSTAT_DATA_ULONG); 1010*3526Sxy150489 1011*3526Sxy150489 kstat_named_init(&e1000g_ksp->Gptc, "Good_Pkts_Xmitd", 1012*3526Sxy150489 KSTAT_DATA_ULONG); 1013*3526Sxy150489 1014*3526Sxy150489 kstat_named_init(&e1000g_ksp->Gorl, "Good_Octets_Recvd_Lo", 1015*3526Sxy150489 KSTAT_DATA_ULONG); 1016*3526Sxy150489 1017*3526Sxy150489 kstat_named_init(&e1000g_ksp->Gorh, "Good_Octets_Recvd_Hi", 1018*3526Sxy150489 KSTAT_DATA_ULONG); 1019*3526Sxy150489 1020*3526Sxy150489 kstat_named_init(&e1000g_ksp->Gotl, "Good_Octets_Xmitd_Lo", 1021*3526Sxy150489 KSTAT_DATA_ULONG); 1022*3526Sxy150489 1023*3526Sxy150489 kstat_named_init(&e1000g_ksp->Goth, "Good_Octets_Xmitd_Hi", 1024*3526Sxy150489 KSTAT_DATA_ULONG); 1025*3526Sxy150489 1026*3526Sxy150489 kstat_named_init(&e1000g_ksp->Ruc, "Recv_Undersize", 1027*3526Sxy150489 KSTAT_DATA_ULONG); 1028*3526Sxy150489 1029*3526Sxy150489 kstat_named_init(&e1000g_ksp->Rfc, "Recv_Frag", 1030*3526Sxy150489 KSTAT_DATA_ULONG); 1031*3526Sxy150489 1032*3526Sxy150489 kstat_named_init(&e1000g_ksp->Roc, "Recv_Oversize", 1033*3526Sxy150489 KSTAT_DATA_ULONG); 1034*3526Sxy150489 1035*3526Sxy150489 kstat_named_init(&e1000g_ksp->Rjc, "Recv_Jabber", 1036*3526Sxy150489 KSTAT_DATA_ULONG); 1037*3526Sxy150489 1038*3526Sxy150489 kstat_named_init(&e1000g_ksp->Torl, "Total_Octets_Recvd_Lo", 1039*3526Sxy150489 KSTAT_DATA_ULONG); 1040*3526Sxy150489 1041*3526Sxy150489 kstat_named_init(&e1000g_ksp->Torh, "Total_Octets_Recvd_Hi", 1042*3526Sxy150489 KSTAT_DATA_ULONG); 1043*3526Sxy150489 1044*3526Sxy150489 kstat_named_init(&e1000g_ksp->Totl, "Total_Octets_Xmitd_Lo", 1045*3526Sxy150489 KSTAT_DATA_ULONG); 1046*3526Sxy150489 1047*3526Sxy150489 kstat_named_init(&e1000g_ksp->Toth, "Total_Octets_Xmitd_Hi", 1048*3526Sxy150489 KSTAT_DATA_ULONG); 1049*3526Sxy150489 1050*3526Sxy150489 kstat_named_init(&e1000g_ksp->Tpr, "Total_Packets_Recvd", 1051*3526Sxy150489 KSTAT_DATA_ULONG); 1052*3526Sxy150489 1053*3526Sxy150489 kstat_named_init(&e1000g_ksp->Tpt, "Total_Packets_Xmitd", 1054*3526Sxy150489 KSTAT_DATA_ULONG); 1055*3526Sxy150489 1056*3526Sxy150489 kstat_named_init(&e1000g_ksp->Ptc64, "Pkts_Xmitd_( 64b)", 1057*3526Sxy150489 KSTAT_DATA_ULONG); 1058*3526Sxy150489 1059*3526Sxy150489 kstat_named_init(&e1000g_ksp->Ptc127, "Pkts_Xmitd_( 65- 127b)", 1060*3526Sxy150489 KSTAT_DATA_ULONG); 1061*3526Sxy150489 1062*3526Sxy150489 kstat_named_init(&e1000g_ksp->Ptc255, "Pkts_Xmitd_( 128- 255b)", 1063*3526Sxy150489 KSTAT_DATA_ULONG); 1064*3526Sxy150489 1065*3526Sxy150489 kstat_named_init(&e1000g_ksp->Ptc511, "Pkts_Xmitd_( 255- 511b)", 1066*3526Sxy150489 KSTAT_DATA_ULONG); 1067*3526Sxy150489 1068*3526Sxy150489 kstat_named_init(&e1000g_ksp->Ptc1023, "Pkts_Xmitd_( 512-1023b)", 1069*3526Sxy150489 KSTAT_DATA_ULONG); 1070*3526Sxy150489 1071*3526Sxy150489 kstat_named_init(&e1000g_ksp->Ptc1522, "Pkts_Xmitd_(1024-1522b)", 1072*3526Sxy150489 KSTAT_DATA_ULONG); 1073*3526Sxy150489 1074*3526Sxy150489 /* 1075*3526Sxy150489 * Livengood Initializations 1076*3526Sxy150489 */ 1077*3526Sxy150489 kstat_named_init(&e1000g_ksp->Tncrs, "Xmit_with_No_CRS", 1078*3526Sxy150489 KSTAT_DATA_ULONG); 1079*3526Sxy150489 1080*3526Sxy150489 kstat_named_init(&e1000g_ksp->Tsctc, "Xmit_TCP_Seg_Contexts", 1081*3526Sxy150489 KSTAT_DATA_ULONG); 1082*3526Sxy150489 1083*3526Sxy150489 kstat_named_init(&e1000g_ksp->Tsctfc, "Xmit_TCP_Seg_Contexts_Fail", 1084*3526Sxy150489 KSTAT_DATA_ULONG); 1085*3526Sxy150489 1086*3526Sxy150489 /* 1087*3526Sxy150489 * Jumbo Frame Counters 1088*3526Sxy150489 */ 1089*3526Sxy150489 kstat_named_init(&e1000g_ksp->JumboTx_4K, "Jumbo Tx Frame 4K", 1090*3526Sxy150489 KSTAT_DATA_ULONG); 1091*3526Sxy150489 1092*3526Sxy150489 kstat_named_init(&e1000g_ksp->JumboRx_4K, "Jumbo Rx Frame 4K", 1093*3526Sxy150489 KSTAT_DATA_ULONG); 1094*3526Sxy150489 1095*3526Sxy150489 kstat_named_init(&e1000g_ksp->JumboTx_8K, "Jumbo Tx Frame 8K", 1096*3526Sxy150489 KSTAT_DATA_ULONG); 1097*3526Sxy150489 1098*3526Sxy150489 kstat_named_init(&e1000g_ksp->JumboRx_8K, "Jumbo Rx Frame 8K", 1099*3526Sxy150489 KSTAT_DATA_ULONG); 1100*3526Sxy150489 1101*3526Sxy150489 kstat_named_init(&e1000g_ksp->JumboTx_16K, "Jumbo Tx Frame 16K", 1102*3526Sxy150489 KSTAT_DATA_ULONG); 1103*3526Sxy150489 1104*3526Sxy150489 kstat_named_init(&e1000g_ksp->JumboRx_16K, "Jumbo Rx Frame 16K", 1105*3526Sxy150489 KSTAT_DATA_ULONG); 1106*3526Sxy150489 1107*3526Sxy150489 /* 1108*3526Sxy150489 * Function to provide kernel stat update on demand 1109*3526Sxy150489 */ 1110*3526Sxy150489 ksp->ks_update = UpdateStatsCounters; 1111*3526Sxy150489 1112*3526Sxy150489 /* 1113*3526Sxy150489 * Pointer into provider's raw statistics 1114*3526Sxy150489 */ 1115*3526Sxy150489 ksp->ks_private = (void *)Adapter; 1116*3526Sxy150489 1117*3526Sxy150489 /* 1118*3526Sxy150489 * Add kstat to systems kstat chain 1119*3526Sxy150489 */ 1120*3526Sxy150489 kstat_install(ksp); 1121*3526Sxy150489 1122*3526Sxy150489 return (DDI_SUCCESS); 1123*3526Sxy150489 } 1124