1 /*
2 * This file and its contents are supplied under the terms of the
3 * Common Development and Distribution License ("CDDL"), version 1.0.
4 * You may only use this file in accordance with the terms of version
5 * 1.0 of the CDDL.
6 *
7 * A full copy of the text of the CDDL should have accompanied this
8 * source. A copy of the CDDL is also available via the Internet at
9 * http://www.illumos.org/license/CDDL.
10 */
11
12 /*
13 * Copyright 2015 OmniTI Computer Consulting, Inc. All rights reserved.
14 */
15
16 #include "i40e_sw.h"
17
18 /*
19 * Functions for keeping track of an i40e_t's statistics.
20 */
21 boolean_t
22 i40e_init_stats(i40e_t *i40e)
23 {
24 kstat_t *ks;
25 i40e_kstat_t *i40e_kstats;
26
27 ks = kstat_create(MODULE_NAME, ddi_get_instance(i40e->i40e_dip),
28 "statistics", "net", KSTAT_TYPE_NAMED,
29 sizeof (i40e_kstat_t) / sizeof (kstat_named_t), 0);
30 if (ks == NULL) {
31 i40e_error(i40e, "Could not create kernel statistics.");
32 return (B_FALSE);
33 }
34
35 i40e->i40e_kstats = ks;
36
37 i40e_kstats = (i40e_kstat_t *)ks->ks_data;
38
39 /*
40 * Initialize all of the statistics now.
41 */
42 kstat_named_init(&i40e_kstats->link_speed, "link_speed",
43 KSTAT_DATA_UINT64);
44 /* XXX KEBE SAYS MORE MORE MORE! */
45
46 return (B_TRUE);
47 }
48
49 /*
50 * For Nemo/GLDv3.
51 */
52 int
53 i40e_m_stat(void *arg, uint_t stat, uint64_t *val)
54 {
55 i40e_t *i40e = (i40e_t *)arg;
56 /* struct i40e_hw *hw = &i40e->i40e_hw_space;
57 i40e_kstat_t *i40e_kstats; */
58
59 mutex_enter(&i40e->i40e_general_lock);
60
61 if (i40e->i40e_state & I40E_SUSPENDED) {
62 mutex_exit(&i40e->i40e_general_lock);
63 return (ECANCELED);
64 }
65
66 switch (stat) {
67 case MAC_STAT_IFSPEED:
68 *val = i40e->i40e_link_speed * 1000000ull;
69 break;
70
71 /* XXX KEBE SAYS LOTS TO DO HERE... */
72 case MAC_STAT_MULTIRCV:
73 case MAC_STAT_BRDCSTRCV:
74 case MAC_STAT_MULTIXMT:
75 case MAC_STAT_BRDCSTXMT:
76 case MAC_STAT_NORCVBUF:
77 case MAC_STAT_IERRORS:
78 case MAC_STAT_RBYTES:
79 case MAC_STAT_OBYTES:
80 case MAC_STAT_IPACKETS:
81 case MAC_STAT_OPACKETS:
82 /* RFC 1643 stats */
83 case ETHER_STAT_FCS_ERRORS:
84 case ETHER_STAT_TOOLONG_ERRORS:
85 case ETHER_STAT_MACRCV_ERRORS:
86 /* MII/GMII stats */
87 case ETHER_STAT_XCVR_ADDR:
88 case ETHER_STAT_XCVR_ID:
89 case ETHER_STAT_XCVR_INUSE:
90 case ETHER_STAT_CAP_10GFDX:
91 case ETHER_STAT_CAP_1000FDX:
92 case ETHER_STAT_CAP_100FDX:
93 case ETHER_STAT_CAP_ASMPAUSE:
94 case ETHER_STAT_CAP_PAUSE:
95 case ETHER_STAT_CAP_AUTONEG:
96 case ETHER_STAT_ADV_CAP_10GFDX:
97 case ETHER_STAT_ADV_CAP_1000FDX:
98 case ETHER_STAT_ADV_CAP_100FDX:
99 case ETHER_STAT_ADV_CAP_ASMPAUSE:
100 case ETHER_STAT_ADV_CAP_PAUSE:
101 case ETHER_STAT_ADV_CAP_AUTONEG:
102 case ETHER_STAT_LP_CAP_10GFDX:
103 case ETHER_STAT_LP_CAP_1000FDX:
104 case ETHER_STAT_LP_CAP_100FDX:
105 case ETHER_STAT_LP_CAP_ASMPAUSE:
106 case ETHER_STAT_LP_CAP_PAUSE:
107 case ETHER_STAT_LP_CAP_AUTONEG:
108 case ETHER_STAT_LINK_ASMPAUSE:
109 case ETHER_STAT_LINK_PAUSE:
110 case ETHER_STAT_LINK_AUTONEG:
111 case ETHER_STAT_LINK_DUPLEX:
112 case ETHER_STAT_TOOSHORT_ERRORS:
113 case ETHER_STAT_CAP_REMFAULT:
114 case ETHER_STAT_ADV_REMFAULT:
115 case ETHER_STAT_LP_REMFAULT:
116 case ETHER_STAT_JABBER_ERRORS:
117 default:
118 mutex_exit(&i40e->i40e_general_lock);
119 return (ENOTSUP);
120 }
121
122 mutex_exit(&i40e->i40e_general_lock);
123
124 if (i40e_check_acc_handle(i40e->i40e_osdep_space.reg_handle) !=
125 DDI_FM_OK) {
126 ddi_fm_service_impact(i40e->i40e_dip, DDI_SERVICE_DEGRADED);
127 return (EIO);
128 }
129
130 return (0);
131 }
132
133 int
134 i40e_rx_ring_stat(mac_ring_driver_t rh, uint_t stat, uint64_t *val)
135 {
136 i40e_trqpair_t *itrq = (i40e_trqpair_t *)rh;
137 i40e_t *i40e = itrq->itrq_i40e;
138 int rc = 0;
139
140 if (i40e->i40e_state & I40E_SUSPENDED) {
141 return (ECANCELED);
142 }
143
144 switch (stat) {
145 /* XXX KEBE SAYS FILL ME IN! */
146 case MAC_STAT_RBYTES:
147 case MAC_STAT_IPACKETS:
148 default:
149 *val = 0;
150 rc = ENOTSUP;
151 break;
152 }
153
154 return (rc);
155 }
156
157 int
158 i40e_tx_ring_stat(mac_ring_driver_t rh, uint_t stat, uint64_t *val)
159 {
160 i40e_trqpair_t *itrq = (i40e_trqpair_t *)rh;
161 i40e_t *i40e = itrq->itrq_i40e;
162 int rc = 0;
163
164 if (i40e->i40e_state & I40E_SUSPENDED) {
165 return (ECANCELED);
166 }
167
168 switch (stat) {
169 /* XXX KEBE SAYS FILL ME IN! */
170 case MAC_STAT_OBYTES:
171 case MAC_STAT_OPACKETS:
172 default:
173 *val = 0;
174 rc = ENOTSUP;
175 break;
176 }
177
178 return (rc);
179 }