xref: /illumos-gate/usr/src/uts/common/io/bnx/bnx_kstat.c (revision eef4f27b)
1*eef4f27bSRobert Mustacchi /*
2*eef4f27bSRobert Mustacchi  * Copyright 2014-2017 Cavium, Inc.
3*eef4f27bSRobert Mustacchi  * The contents of this file are subject to the terms of the Common Development
4*eef4f27bSRobert Mustacchi  * and Distribution License, v.1,  (the "License").
5*eef4f27bSRobert Mustacchi  *
6*eef4f27bSRobert Mustacchi  * You may not use this file except in compliance with the License.
7*eef4f27bSRobert Mustacchi  *
8*eef4f27bSRobert Mustacchi  * You can obtain a copy of the License at available
9*eef4f27bSRobert Mustacchi  * at http://opensource.org/licenses/CDDL-1.0
10*eef4f27bSRobert Mustacchi  *
11*eef4f27bSRobert Mustacchi  * See the License for the specific language governing permissions and
12*eef4f27bSRobert Mustacchi  * limitations under the License.
13*eef4f27bSRobert Mustacchi  */
14*eef4f27bSRobert Mustacchi 
15*eef4f27bSRobert Mustacchi /*
16*eef4f27bSRobert Mustacchi  * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
17*eef4f27bSRobert Mustacchi  * Copyright (c) 2019, Joyent, Inc.
18*eef4f27bSRobert Mustacchi  */
19*eef4f27bSRobert Mustacchi 
20*eef4f27bSRobert Mustacchi #include "bnx.h"
21*eef4f27bSRobert Mustacchi 
22*eef4f27bSRobert Mustacchi typedef struct {
23*eef4f27bSRobert Mustacchi 	kstat_named_t version;
24*eef4f27bSRobert Mustacchi 	kstat_named_t versionFW;
25*eef4f27bSRobert Mustacchi 	kstat_named_t chipName;
26*eef4f27bSRobert Mustacchi 	kstat_named_t intrAlloc;
27*eef4f27bSRobert Mustacchi 	kstat_named_t intrFired;
28*eef4f27bSRobert Mustacchi 	kstat_named_t intrInDisabled;
29*eef4f27bSRobert Mustacchi 	kstat_named_t intrNoChange;
30*eef4f27bSRobert Mustacchi } bnx_kstat_t;
31*eef4f27bSRobert Mustacchi 
32*eef4f27bSRobert Mustacchi #define	BNX_KSTAT_SIZE (sizeof (bnx_kstat_t) / sizeof (kstat_named_t))
33*eef4f27bSRobert Mustacchi 
34*eef4f27bSRobert Mustacchi 
35*eef4f27bSRobert Mustacchi static int
bnx_kstat_update(kstat_t * kstats,int rw)36*eef4f27bSRobert Mustacchi bnx_kstat_update(kstat_t *kstats, int rw)
37*eef4f27bSRobert Mustacchi {
38*eef4f27bSRobert Mustacchi 	bnx_kstat_t *pStats = (bnx_kstat_t *)kstats->ks_data;
39*eef4f27bSRobert Mustacchi 	um_device_t *pUM = (um_device_t *)kstats->ks_private;
40*eef4f27bSRobert Mustacchi 
41*eef4f27bSRobert Mustacchi 	if (rw == KSTAT_WRITE) {
42*eef4f27bSRobert Mustacchi 		return (EACCES);
43*eef4f27bSRobert Mustacchi 	}
44*eef4f27bSRobert Mustacchi 
45*eef4f27bSRobert Mustacchi 	mutex_enter(&pUM->kstatMutex);
46*eef4f27bSRobert Mustacchi 
47*eef4f27bSRobert Mustacchi 	(void) strncpy(pStats->version.value.c, pUM->version,
48*eef4f27bSRobert Mustacchi 	    sizeof (pStats->version.value.c));
49*eef4f27bSRobert Mustacchi 	(void) strncpy(pStats->versionFW.value.c, pUM->versionFW,
50*eef4f27bSRobert Mustacchi 	    sizeof (pStats->versionFW.value.c));
51*eef4f27bSRobert Mustacchi 	(void) strncpy(pStats->chipName.value.c,  pUM->chipName,
52*eef4f27bSRobert Mustacchi 	    sizeof (pStats->chipName.value.c));
53*eef4f27bSRobert Mustacchi 	(void) strncpy(pStats->intrAlloc.value.c, pUM->intrAlloc,
54*eef4f27bSRobert Mustacchi 	    sizeof (pStats->intrAlloc.value.c));
55*eef4f27bSRobert Mustacchi 	pStats->intrFired.value.ui64 = pUM->intr_count;
56*eef4f27bSRobert Mustacchi 	pStats->intrInDisabled.value.ui64 = pUM->intr_in_disabled;
57*eef4f27bSRobert Mustacchi 	pStats->intrNoChange.value.ui64 = pUM->intr_no_change;
58*eef4f27bSRobert Mustacchi 
59*eef4f27bSRobert Mustacchi 	mutex_exit(&pUM->kstatMutex);
60*eef4f27bSRobert Mustacchi 
61*eef4f27bSRobert Mustacchi 	return (0);
62*eef4f27bSRobert Mustacchi }
63*eef4f27bSRobert Mustacchi 
64*eef4f27bSRobert Mustacchi #define	BNX_KSTAT(f, t)	kstat_named_init(&pStats->f, #f, t)
65*eef4f27bSRobert Mustacchi 
66*eef4f27bSRobert Mustacchi boolean_t
bnx_kstat_init(um_device_t * pUM)67*eef4f27bSRobert Mustacchi bnx_kstat_init(um_device_t *pUM)
68*eef4f27bSRobert Mustacchi {
69*eef4f27bSRobert Mustacchi 	bnx_kstat_t *pStats;
70*eef4f27bSRobert Mustacchi 
71*eef4f27bSRobert Mustacchi 	if ((pUM->kstats = kstat_create("bnx", pUM->instance, "statistics",
72*eef4f27bSRobert Mustacchi 	    "net", KSTAT_TYPE_NAMED, BNX_KSTAT_SIZE, 0)) == NULL) {
73*eef4f27bSRobert Mustacchi 		cmn_err(CE_WARN, "%s: Failed to create kstat", pUM->dev_name);
74*eef4f27bSRobert Mustacchi 		return (B_FALSE);
75*eef4f27bSRobert Mustacchi 	}
76*eef4f27bSRobert Mustacchi 
77*eef4f27bSRobert Mustacchi 	pStats = (bnx_kstat_t *)pUM->kstats->ks_data;
78*eef4f27bSRobert Mustacchi 
79*eef4f27bSRobert Mustacchi 	BNX_KSTAT(version, KSTAT_DATA_CHAR);
80*eef4f27bSRobert Mustacchi 	BNX_KSTAT(versionFW, KSTAT_DATA_CHAR);
81*eef4f27bSRobert Mustacchi 	BNX_KSTAT(chipName, KSTAT_DATA_CHAR);
82*eef4f27bSRobert Mustacchi 	BNX_KSTAT(intrAlloc, KSTAT_DATA_CHAR);
83*eef4f27bSRobert Mustacchi 	BNX_KSTAT(intrFired, KSTAT_DATA_UINT64);
84*eef4f27bSRobert Mustacchi 	BNX_KSTAT(intrInDisabled, KSTAT_DATA_UINT64);
85*eef4f27bSRobert Mustacchi 	BNX_KSTAT(intrNoChange, KSTAT_DATA_UINT64);
86*eef4f27bSRobert Mustacchi 
87*eef4f27bSRobert Mustacchi 	pUM->kstats->ks_update  = bnx_kstat_update;
88*eef4f27bSRobert Mustacchi 	pUM->kstats->ks_private = (void *)pUM;
89*eef4f27bSRobert Mustacchi 
90*eef4f27bSRobert Mustacchi 	mutex_init(&pUM->kstatMutex, NULL,
91*eef4f27bSRobert Mustacchi 	    MUTEX_DRIVER, DDI_INTR_PRI(pUM->intrPriority));
92*eef4f27bSRobert Mustacchi 
93*eef4f27bSRobert Mustacchi 	kstat_install(pUM->kstats);
94*eef4f27bSRobert Mustacchi 
95*eef4f27bSRobert Mustacchi 	return (B_TRUE);
96*eef4f27bSRobert Mustacchi }
97*eef4f27bSRobert Mustacchi 
98*eef4f27bSRobert Mustacchi void
bnx_kstat_fini(um_device_t * pUM)99*eef4f27bSRobert Mustacchi bnx_kstat_fini(um_device_t *pUM)
100*eef4f27bSRobert Mustacchi {
101*eef4f27bSRobert Mustacchi 	if (pUM->kstats) {
102*eef4f27bSRobert Mustacchi 		kstat_delete(pUM->kstats);
103*eef4f27bSRobert Mustacchi 		pUM->kstats = NULL;
104*eef4f27bSRobert Mustacchi 	}
105*eef4f27bSRobert Mustacchi 
106*eef4f27bSRobert Mustacchi 	mutex_destroy(&pUM->kstatMutex);
107*eef4f27bSRobert Mustacchi }
108