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