4 * The contents of this file are subject to the terms of the
5 * Common Development and Distribution License (the "License").
6 * You may not use this file except in compliance with the License.
8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9 * or http://www.opensolaris.org/os/licensing.
10 * See the License for the specific language governing permissions
11 * and limitations under the License.
13 * When distributing Covered Code, include this CDDL HEADER in each
14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15 * If applicable, add the following below this CDDL HEADER, with the
16 * fields enclosed by brackets "[]" replaced with your own identifying
17 * information: Portions Copyright [yyyy] [name of copyright owner]
22 * Copyright 2010 Sun Microsystems, Inc. All rights reserved.
23 * Use is subject to license terms.
26 #include <hxge_impl.h>
28 #include <sys/cmn_err.h>
30 #define RDC_NAME_FORMAT1 "RDC_"
31 #define TDC_NAME_FORMAT1 "TDC_"
32 #define CH_NAME_FORMAT "%d"
34 static int hxge_mmac_stat_update(kstat_t
*ksp
, int rw
);
37 hxge_init_statsp(p_hxge_t hxgep
)
41 HXGE_DEBUG_MSG((hxgep
, KST_CTL
, "==> hxge_init_statsp"));
43 stats_size
= sizeof (hxge_stats_t
);
44 hxgep
->statsp
= KMEM_ZALLOC(stats_size
, KM_SLEEP
);
45 hxgep
->statsp
->stats_size
= stats_size
;
47 HXGE_DEBUG_MSG((hxgep
, KST_CTL
, " <== hxge_init_statsp"));
61 RDC_STAT_RCR_UNKNOWN_ERR
,
62 RDC_STAT_RCR_SHA_PAR_ERR
,
63 RDC_STAT_RBR_PRE_PAR_ERR
,
64 RDC_STAT_RBR_PRE_EMTY
,
65 RDC_STAT_RCR_SHADOW_FULL
,
67 RDC_STAT_PEU_RESP_ERR
,
68 RDC_STAT_CTRL_FIFO_ECC_ERR
,
69 RDC_STAT_DATA_FIFO_ECC_ERR
,
72 RDC_STAT_RBR_EMPTY_FAIL
,
73 RDC_STAT_RBR_EMPTY_RESTORE
,
75 RDC_STAT_RCR_INVALIDS
,
80 } hxge_rdc_stat_index_t
;
82 hxge_kstat_index_t hxge_rdc_stats
[] = {
83 {RDC_STAT_PACKETS
, KSTAT_DATA_UINT64
, "rdc_packets"},
84 {RDC_STAT_BYTES
, KSTAT_DATA_UINT64
, "rdc_bytes"},
85 {RDC_STAT_ERRORS
, KSTAT_DATA_ULONG
, "rdc_errors"},
86 {RDC_STAT_JUMBO_PKTS
, KSTAT_DATA_ULONG
, "rdc_jumbo_pkts"},
87 {RDC_STAT_RCR_UNKNOWN_ERR
, KSTAT_DATA_ULONG
, "rdc_rcr_unknown_err"},
88 {RDC_STAT_RCR_SHA_PAR_ERR
, KSTAT_DATA_ULONG
, "rdc_rcr_sha_par_err"},
89 {RDC_STAT_RBR_PRE_PAR_ERR
, KSTAT_DATA_ULONG
, "rdc_rbr_pre_par_err"},
90 {RDC_STAT_RBR_PRE_EMTY
, KSTAT_DATA_ULONG
, "rdc_rbr_pre_empty"},
91 {RDC_STAT_RCR_SHADOW_FULL
, KSTAT_DATA_ULONG
, "rdc_rcr_shadow_full"},
92 {RDC_STAT_RBR_TMOUT
, KSTAT_DATA_ULONG
, "rdc_rbr_tmout"},
93 {RDC_STAT_PEU_RESP_ERR
, KSTAT_DATA_ULONG
, "peu_resp_err"},
94 {RDC_STAT_CTRL_FIFO_ECC_ERR
, KSTAT_DATA_ULONG
, "ctrl_fifo_ecc_err"},
95 {RDC_STAT_DATA_FIFO_ECC_ERR
, KSTAT_DATA_ULONG
, "data_fifo_ecc_err"},
96 {RDC_STAT_RCRFULL
, KSTAT_DATA_ULONG
, "rdc_rcrfull"},
97 {RDC_STAT_RBR_EMPTY
, KSTAT_DATA_ULONG
, "rdc_rbr_empty"},
98 {RDC_STAT_RBR_EMPTY_FAIL
, KSTAT_DATA_ULONG
, "rdc_rbr_empty_fail"},
99 {RDC_STAT_RBR_EMPTY_FAIL
, KSTAT_DATA_ULONG
, "rdc_rbr_empty_restore"},
100 {RDC_STAT_RBR_FULL
, KSTAT_DATA_ULONG
, "rdc_rbrfull"},
101 {RDC_STAT_RCR_INVALIDS
, KSTAT_DATA_ULONG
, "rdc_rcr_invalids"},
102 {RDC_STAT_RCRTO
, KSTAT_DATA_ULONG
, "rdc_rcrto"},
103 {RDC_STAT_RCRTHRES
, KSTAT_DATA_ULONG
, "rdc_rcrthres"},
104 {RDC_STAT_PKT_DROP
, KSTAT_DATA_ULONG
, "rdc_pkt_drop"},
105 {RDC_STAT_END
, 0, NULL
}
109 RDC_SYS_STAT_CTRL_FIFO_SEC
= 0,
110 RDC_SYS_STAT_CTRL_FIFO_DED
,
111 RDC_SYS_STAT_DATA_FIFO_SEC
,
112 RDC_SYS_STAT_DATA_FIFO_DED
,
114 } hxge_rdc_sys_stat_idx_t
;
116 hxge_kstat_index_t hxge_rdc_sys_stats
[] = {
117 {RDC_SYS_STAT_CTRL_FIFO_SEC
, KSTAT_DATA_UINT64
, "rdc_ctrl_fifo_sec"},
118 {RDC_SYS_STAT_CTRL_FIFO_DED
, KSTAT_DATA_UINT64
, "rdc_ctrl_fifo_ded"},
119 {RDC_SYS_STAT_DATA_FIFO_SEC
, KSTAT_DATA_UINT64
, "rdc_data_fifo_sec"},
120 {RDC_SYS_STAT_DATA_FIFO_DED
, KSTAT_DATA_UINT64
, "tdc_data_fifo_ded"},
121 {RDC_SYS_STAT_END
, 0, NULL
}
125 TDC_STAT_PACKETS
= 0,
127 TDC_STAT_BYTES_WITH_PAD
,
131 TDC_STAT_PEU_RESP_ERR
,
132 TDC_STAT_PKT_SIZE_ERR
,
133 TDC_STAT_TX_RNG_OFLOW
,
134 TDC_STAT_PKT_SIZE_HDR_ERR
,
135 TDC_STAT_RUNT_PKT_DROP_ERR
,
136 TDC_STAT_PREF_PAR_ERR
,
137 TDC_STAT_TDR_PREF_CPL_TO
,
139 TDC_STAT_INVALID_SOP
,
140 TDC_STAT_UNEXPECTED_SOP
,
141 TDC_STAT_COUNT_HDR_SIZE_ERR
,
143 TDC_STAT_COUNT_ABORT
,
146 TDC_STAT_TX_DMA_BIND_FAIL
,
147 TDC_STAT_TX_HDR_PKTS
,
148 TDC_STAT_TX_DDI_PKTS
,
149 TDC_STAT_TX_JUMBO_PKTS
,
150 TDC_STAT_TX_MAX_PEND
,
153 } hxge_tdc_stats_index_t
;
155 hxge_kstat_index_t hxge_tdc_stats
[] = {
156 {TDC_STAT_PACKETS
, KSTAT_DATA_UINT64
, "tdc_packets"},
157 {TDC_STAT_BYTES
, KSTAT_DATA_UINT64
, "tdc_bytes"},
158 {TDC_STAT_BYTES_WITH_PAD
, KSTAT_DATA_UINT64
, "tdc_bytes_with_pad"},
159 {TDC_STAT_ERRORS
, KSTAT_DATA_UINT64
, "tdc_errors"},
160 {TDC_STAT_TX_INITS
, KSTAT_DATA_ULONG
, "tdc_tx_inits"},
161 {TDC_STAT_TX_NO_BUF
, KSTAT_DATA_ULONG
, "tdc_tx_no_buf"},
163 {TDC_STAT_PEU_RESP_ERR
, KSTAT_DATA_ULONG
, "tdc_peu_resp_err"},
164 {TDC_STAT_PKT_SIZE_ERR
, KSTAT_DATA_ULONG
, "tdc_pkt_size_err"},
165 {TDC_STAT_TX_RNG_OFLOW
, KSTAT_DATA_ULONG
, "tdc_tx_rng_oflow"},
166 {TDC_STAT_PKT_SIZE_HDR_ERR
, KSTAT_DATA_ULONG
, "tdc_pkt_size_hdr_err"},
167 {TDC_STAT_RUNT_PKT_DROP_ERR
, KSTAT_DATA_ULONG
, "tdc_runt_pkt_drop_err"},
168 {TDC_STAT_PREF_PAR_ERR
, KSTAT_DATA_ULONG
, "tdc_pref_par_err"},
169 {TDC_STAT_TDR_PREF_CPL_TO
, KSTAT_DATA_ULONG
, "tdc_tdr_pref_cpl_to"},
170 {TDC_STAT_PKT_CPL_TO
, KSTAT_DATA_ULONG
, "tdc_pkt_cpl_to"},
171 {TDC_STAT_INVALID_SOP
, KSTAT_DATA_ULONG
, "tdc_invalid_sop"},
172 {TDC_STAT_UNEXPECTED_SOP
, KSTAT_DATA_ULONG
, "tdc_unexpected_sop"},
174 {TDC_STAT_COUNT_HDR_SIZE_ERR
, KSTAT_DATA_ULONG
,
175 "tdc_count_hdr_size_err"},
176 {TDC_STAT_COUNT_RUNT
, KSTAT_DATA_ULONG
, "tdc_count_runt"},
177 {TDC_STAT_COUNT_ABORT
, KSTAT_DATA_ULONG
, "tdc_count_abort"},
179 {TDC_STAT_TX_STARTS
, KSTAT_DATA_ULONG
, "tdc_tx_starts"},
180 {TDC_STAT_TX_NO_DESC
, KSTAT_DATA_ULONG
, "tdc_tx_no_desc"},
181 {TDC_STAT_TX_DMA_BIND_FAIL
, KSTAT_DATA_ULONG
, "tdc_tx_dma_bind_fail"},
182 {TDC_STAT_TX_HDR_PKTS
, KSTAT_DATA_ULONG
, "tdc_tx_hdr_pkts"},
183 {TDC_STAT_TX_DDI_PKTS
, KSTAT_DATA_ULONG
, "tdc_tx_ddi_pkts"},
184 {TDC_STAT_TX_JUMBO_PKTS
, KSTAT_DATA_ULONG
, "tdc_tx_jumbo_pkts"},
185 {TDC_STAT_TX_MAX_PEND
, KSTAT_DATA_ULONG
, "tdc_tx_max_pend"},
186 {TDC_STAT_TX_MARKS
, KSTAT_DATA_ULONG
, "tdc_tx_marks"},
187 {TDC_STAT_END
, 0, NULL
}
191 REORD_TBL_PAR_ERR
= 0,
195 } hxge_tdc_sys_stat_idx_t
;
197 hxge_kstat_index_t hxge_tdc_sys_stats
[] = {
198 {REORD_TBL_PAR_ERR
, KSTAT_DATA_UINT64
, "reord_tbl_par_err"},
199 {REORD_BUF_DED_ERR
, KSTAT_DATA_UINT64
, "reord_buf_ded_err"},
200 {REORD_BUF_SEC_ERR
, KSTAT_DATA_UINT64
, "reord_buf_sec_err"},
201 {TDC_SYS_STAT_END
, 0, NULL
}
205 VMAC_STAT_TX_FRAME_CNT
, /* vmac_tx_frame_cnt_t */
206 VMAC_STAT_TX_BYTE_CNT
, /* vmac_tx_byte_cnt_t */
208 VMAC_STAT_RX_FRAME_CNT
, /* vmac_rx_frame_cnt_t */
209 VMAC_STAT_RX_BYTE_CNT
, /* vmac_rx_byte_cnt_t */
210 VMAC_STAT_RX_DROP_FRAME_CNT
, /* vmac_rx_drop_fr_cnt_t */
211 VMAC_STAT_RX_DROP_BYTE_CNT
, /* vmac_rx_drop_byte_cnt_t */
212 VMAC_STAT_RX_CRC_CNT
, /* vmac_rx_crc_cnt_t */
213 VMAC_STAT_RX_PAUSE_CNT
, /* vmac_rx_pause_cnt_t */
214 VMAC_STAT_RX_BCAST_FR_CNT
, /* vmac_rx_bcast_fr_cnt_t */
215 VMAC_STAT_RX_MCAST_FR_CNT
, /* vmac_rx_mcast_fr_cnt_t */
217 } hxge_vmac_stat_index_t
;
219 hxge_kstat_index_t hxge_vmac_stats
[] = {
220 {VMAC_STAT_TX_FRAME_CNT
, KSTAT_DATA_UINT64
, "vmac_tx_frame_cnt"},
221 {VMAC_STAT_TX_BYTE_CNT
, KSTAT_DATA_UINT64
, "vmac_tx_byte_cnt"},
223 {VMAC_STAT_RX_FRAME_CNT
, KSTAT_DATA_UINT64
, "vmac_rx_frame_cnt"},
224 {VMAC_STAT_RX_BYTE_CNT
, KSTAT_DATA_UINT64
, "vmac_rx_byte_cnt"},
225 {VMAC_STAT_RX_DROP_FRAME_CNT
, KSTAT_DATA_UINT64
,
226 "vmac_rx_drop_frame_cnt"},
227 {VMAC_STAT_RX_DROP_BYTE_CNT
, KSTAT_DATA_UINT64
,
228 "vmac_rx_drop_byte_cnt"},
229 {VMAC_STAT_RX_CRC_CNT
, KSTAT_DATA_UINT64
, "vmac_rx_crc_cnt"},
230 {VMAC_STAT_RX_PAUSE_CNT
, KSTAT_DATA_UINT64
, "vmac_rx_pause_cnt"},
231 {VMAC_STAT_RX_BCAST_FR_CNT
, KSTAT_DATA_UINT64
, "vmac_rx_bcast_fr_cnt"},
232 {VMAC_STAT_RX_MCAST_FR_CNT
, KSTAT_DATA_UINT64
, "vmac_rx_mcast_fr_cnt"},
233 {VMAC_STAT_END
, 0, NULL
}
238 PFC_STAT_TCAM_PARITY_ERR
,
239 PFC_STAT_VLAN_PARITY_ERR
,
240 PFC_STAT_BAD_CS_COUNT
,
242 PFC_STAT_TCP_CTRL_DROP
,
243 PFC_STAT_L2_ADDR_DROP
,
244 PFC_STAT_CLASS_CODE_DROP
,
248 } hxge_pfc_stat_index_t
;
250 hxge_kstat_index_t hxge_pfc_stats
[] = {
251 {PFC_STAT_PKT_DROP
, KSTAT_DATA_ULONG
, "pfc_pkt_drop"},
252 {PFC_STAT_TCAM_PARITY_ERR
, KSTAT_DATA_ULONG
, "pfc_tcam_parity_err"},
253 {PFC_STAT_VLAN_PARITY_ERR
, KSTAT_DATA_ULONG
, "pfc_vlan_parity_err"},
254 {PFC_STAT_BAD_CS_COUNT
, KSTAT_DATA_ULONG
, "pfc_bad_cs_count"},
255 {PFC_STAT_DROP_COUNT
, KSTAT_DATA_ULONG
, "pfc_drop_count"},
256 {PFC_STAT_TCP_CTRL_DROP
, KSTAT_DATA_ULONG
, " pfc_pkt_drop_tcp_ctrl"},
257 {PFC_STAT_L2_ADDR_DROP
, KSTAT_DATA_ULONG
, " pfc_pkt_drop_l2_addr"},
258 {PFC_STAT_CLASS_CODE_DROP
, KSTAT_DATA_ULONG
,
259 " pfc_pkt_drop_class_code"},
260 {PFC_STAT_TCAM_DROP
, KSTAT_DATA_ULONG
, " pfc_pkt_drop_tcam"},
261 {PFC_STAT_VLAN_DROP
, KSTAT_DATA_ULONG
, " pfc_pkt_drop_vlan"},
262 {PFC_STAT_END
, 0, NULL
}
273 RETRYRAM_XDLH_PARERR
,
274 RETRYSOTRAM_XDLH_PARERR
,
282 } hxge_peu_sys_stat_idx_t
;
284 hxge_kstat_index_t hxge_peu_sys_stats
[] = {
285 {SPC_ACC_ERR
, KSTAT_DATA_UINT64
, "spc_acc_err"},
286 {TDC_PIOACC_ERR
, KSTAT_DATA_UINT64
, "tdc_pioacc_err"},
287 {RDC_PIOACC_ERR
, KSTAT_DATA_UINT64
, "rdc_pioacc_err"},
288 {PFC_PIOACC_ERR
, KSTAT_DATA_UINT64
, "pfc_pioacc_err"},
289 {VMAC_PIOACC_ERR
, KSTAT_DATA_UINT64
, "vmac_pioacc_err"},
290 {CPL_HDRQ_PARERR
, KSTAT_DATA_UINT64
, "cpl_hdrq_parerr"},
291 {CPL_DATAQ_PARERR
, KSTAT_DATA_UINT64
, "cpl_dataq_parerr"},
292 {RETRYRAM_XDLH_PARERR
, KSTAT_DATA_UINT64
, "retryram_xdlh_parerr"},
293 {RETRYSOTRAM_XDLH_PARERR
, KSTAT_DATA_UINT64
, "retrysotram_xdlh_parerr"},
294 {P_HDRQ_PARERR
, KSTAT_DATA_UINT64
, "p_hdrq_parerr"},
295 {P_DATAQ_PARERR
, KSTAT_DATA_UINT64
, "p_dataq_parerr"},
296 {NP_HDRQ_PARERR
, KSTAT_DATA_UINT64
, "np_hdrq_parerr"},
297 {NP_DATAQ_PARERR
, KSTAT_DATA_UINT64
, "np_dataq_parerr"},
298 {EIC_MSIX_PARERR
, KSTAT_DATA_UINT64
, "eic_msix_parerr"},
299 {HCR_PARERR
, KSTAT_DATA_UINT64
, "hcr_parerr"},
300 {TDC_SYS_STAT_END
, 0, NULL
}
323 } hxge_mmac_stat_index_t
;
325 hxge_kstat_index_t hxge_mmac_stats
[] = {
326 {MMAC_MAX_ADDR
, KSTAT_DATA_UINT64
, "max_mmac_addr"},
327 {MMAC_AVAIL_ADDR
, KSTAT_DATA_UINT64
, "avail_mmac_addr"},
328 {MMAC_ADDR_POOL1
, KSTAT_DATA_UINT64
, "mmac_addr_1"},
329 {MMAC_ADDR_POOL2
, KSTAT_DATA_UINT64
, "mmac_addr_2"},
330 {MMAC_ADDR_POOL3
, KSTAT_DATA_UINT64
, "mmac_addr_3"},
331 {MMAC_ADDR_POOL4
, KSTAT_DATA_UINT64
, "mmac_addr_4"},
332 {MMAC_ADDR_POOL5
, KSTAT_DATA_UINT64
, "mmac_addr_5"},
333 {MMAC_ADDR_POOL6
, KSTAT_DATA_UINT64
, "mmac_addr_6"},
334 {MMAC_ADDR_POOL7
, KSTAT_DATA_UINT64
, "mmac_addr_7"},
335 {MMAC_ADDR_POOL8
, KSTAT_DATA_UINT64
, "mmac_addr_8"},
336 {MMAC_ADDR_POOL9
, KSTAT_DATA_UINT64
, "mmac_addr_9"},
337 {MMAC_ADDR_POOL10
, KSTAT_DATA_UINT64
, "mmac_addr_10"},
338 {MMAC_ADDR_POOL11
, KSTAT_DATA_UINT64
, "mmac_addr_11"},
339 {MMAC_ADDR_POOL12
, KSTAT_DATA_UINT64
, "mmac_addr_12"},
340 {MMAC_ADDR_POOL13
, KSTAT_DATA_UINT64
, "mmac_addr_13"},
341 {MMAC_ADDR_POOL14
, KSTAT_DATA_UINT64
, "mmac_addr_14"},
342 {MMAC_ADDR_POOL15
, KSTAT_DATA_UINT64
, "mmac_addr_15"},
343 {MMAC_ADDR_POOL16
, KSTAT_DATA_UINT64
, "mmac_addr_16"},
344 {MMAC_STATS_END
, 0, NULL
},
350 hxge_tdc_stat_update(kstat_t
*ksp
, int rw
)
353 p_hxge_tdc_kstat_t tdc_kstatsp
;
354 p_hxge_tx_ring_stats_t statsp
;
358 hxgep
= (p_hxge_t
)ksp
->ks_private
;
361 HXGE_DEBUG_MSG((hxgep
, KST_CTL
, "==> hxge_rxstat_update"));
363 ch_name
= ksp
->ks_name
;
364 ch_name
+= strlen(TDC_NAME_FORMAT1
);
365 channel
= mi_strtol(ch_name
, &end
, 10);
367 tdc_kstatsp
= (p_hxge_tdc_kstat_t
)ksp
->ks_data
;
368 statsp
= (p_hxge_tx_ring_stats_t
)&hxgep
->statsp
->tdc_stats
[channel
];
370 HXGE_DEBUG_MSG((hxgep
, KST_CTL
,
371 "hxge_tdc_stat_update data $%p statsp $%p channel %d",
372 ksp
->ks_data
, statsp
, channel
));
374 tdc_kstatsp
->opackets
.value
.ull
= statsp
->opackets
;
375 tdc_kstatsp
->obytes
.value
.ull
= statsp
->obytes
;
376 tdc_kstatsp
->obytes_with_pad
.value
.ull
= statsp
->obytes_with_pad
;
377 tdc_kstatsp
->oerrors
.value
.ull
= statsp
->oerrors
;
378 tdc_kstatsp
->tx_hdr_pkts
.value
.ull
= statsp
->tx_hdr_pkts
;
379 tdc_kstatsp
->tx_ddi_pkts
.value
.ull
= statsp
->tx_ddi_pkts
;
380 tdc_kstatsp
->tx_jumbo_pkts
.value
.ull
= statsp
->tx_jumbo_pkts
;
381 tdc_kstatsp
->tx_max_pend
.value
.ull
= statsp
->tx_max_pend
;
382 tdc_kstatsp
->peu_resp_err
.value
.ul
= statsp
->peu_resp_err
;
383 tdc_kstatsp
->pkt_size_err
.value
.ul
= statsp
->pkt_size_err
;
384 tdc_kstatsp
->tx_rng_oflow
.value
.ul
= statsp
->tx_rng_oflow
;
385 tdc_kstatsp
->pkt_size_hdr_err
.value
.ul
= statsp
->pkt_size_hdr_err
;
386 tdc_kstatsp
->runt_pkt_drop_err
.value
.ul
= statsp
->runt_pkt_drop_err
;
387 tdc_kstatsp
->pref_par_err
.value
.ul
= statsp
->pref_par_err
;
388 tdc_kstatsp
->tdr_pref_cpl_to
.value
.ul
= statsp
->tdr_pref_cpl_to
;
389 tdc_kstatsp
->pkt_cpl_to
.value
.ul
= statsp
->pkt_cpl_to
;
390 tdc_kstatsp
->invalid_sop
.value
.ul
= statsp
->invalid_sop
;
391 tdc_kstatsp
->unexpected_sop
.value
.ul
= statsp
->unexpected_sop
;
392 tdc_kstatsp
->tx_starts
.value
.ul
= statsp
->tx_starts
;
393 tdc_kstatsp
->tx_no_desc
.value
.ul
= statsp
->tx_no_desc
;
394 tdc_kstatsp
->tx_dma_bind_fail
.value
.ul
= statsp
->tx_dma_bind_fail
;
396 tdc_kstatsp
->count_hdr_size_err
.value
.ul
=
397 statsp
->count_hdr_size_err
;
398 tdc_kstatsp
->count_runt
.value
.ul
= statsp
->count_runt
;
399 tdc_kstatsp
->count_abort
.value
.ul
= statsp
->count_abort
;
400 tdc_kstatsp
->tx_marks
.value
.ul
= statsp
->tx_marks
;
402 HXGE_DEBUG_MSG((hxgep
, KST_CTL
, " <== hxge_tdc_stat_update"));
408 hxge_tdc_sys_stat_update(kstat_t
*ksp
, int rw
)
411 p_hxge_tdc_sys_kstat_t tdc_sys_kstatsp
;
412 p_hxge_tdc_sys_stats_t statsp
;
414 hxgep
= (p_hxge_t
)ksp
->ks_private
;
417 HXGE_DEBUG_MSG((hxgep
, KST_CTL
, "==> hxge_tdc_sys_stat_update"));
419 tdc_sys_kstatsp
= (p_hxge_tdc_sys_kstat_t
)ksp
->ks_data
;
420 statsp
= (p_hxge_tdc_sys_stats_t
)&hxgep
->statsp
->tdc_sys_stats
;
422 HXGE_DEBUG_MSG((hxgep
, KST_CTL
, "hxge_tdc_sys_stat_update %llx",
425 tdc_sys_kstatsp
->reord_tbl_par_err
.value
.ul
=
426 statsp
->reord_tbl_par_err
;
427 tdc_sys_kstatsp
->reord_buf_ded_err
.value
.ul
=
428 statsp
->reord_buf_ded_err
;
429 tdc_sys_kstatsp
->reord_buf_sec_err
.value
.ul
=
430 statsp
->reord_buf_sec_err
;
432 HXGE_DEBUG_MSG((hxgep
, KST_CTL
, " <== hxge_tdc_sys_stat_update"));
438 hxge_rdc_stat_update(kstat_t
*ksp
, int rw
)
441 p_hxge_rdc_kstat_t rdc_kstatsp
;
442 p_hxge_rx_ring_stats_t statsp
;
446 hxgep
= (p_hxge_t
)ksp
->ks_private
;
450 HXGE_DEBUG_MSG((hxgep
, KST_CTL
, "==> hxge_rdc_stat_update"));
452 ch_name
= ksp
->ks_name
;
453 ch_name
+= strlen(RDC_NAME_FORMAT1
);
454 channel
= mi_strtol(ch_name
, &end
, 10);
456 rdc_kstatsp
= (p_hxge_rdc_kstat_t
)ksp
->ks_data
;
457 statsp
= (p_hxge_rx_ring_stats_t
)&hxgep
->statsp
->rdc_stats
[channel
];
459 HXGE_DEBUG_MSG((hxgep
, KST_CTL
,
460 "hxge_rdc_stat_update $%p statsp $%p channel %d",
461 ksp
->ks_data
, statsp
, channel
));
463 rdc_kstatsp
->ipackets
.value
.ull
= statsp
->ipackets
;
464 rdc_kstatsp
->rbytes
.value
.ull
= statsp
->ibytes
;
465 rdc_kstatsp
->jumbo_pkts
.value
.ul
= statsp
->jumbo_pkts
;
466 rdc_kstatsp
->rcr_unknown_err
.value
.ul
= statsp
->rcr_unknown_err
;
467 rdc_kstatsp
->errors
.value
.ul
= statsp
->ierrors
;
468 rdc_kstatsp
->rcr_sha_par_err
.value
.ul
= statsp
->rcr_sha_par
;
469 rdc_kstatsp
->rbr_pre_par_err
.value
.ul
= statsp
->rbr_pre_par
;
470 rdc_kstatsp
->rbr_pre_emty
.value
.ul
= statsp
->rbr_pre_empty
;
471 rdc_kstatsp
->rcr_shadow_full
.value
.ul
= statsp
->rcr_shadow_full
;
472 rdc_kstatsp
->rbr_tmout
.value
.ul
= statsp
->rbr_tmout
;
473 rdc_kstatsp
->peu_resp_err
.value
.ul
= statsp
->peu_resp_err
;
474 rdc_kstatsp
->ctrl_fifo_ecc_err
.value
.ul
= statsp
->ctrl_fifo_ecc_err
;
475 rdc_kstatsp
->data_fifo_ecc_err
.value
.ul
= statsp
->data_fifo_ecc_err
;
476 rdc_kstatsp
->rcrfull
.value
.ul
= statsp
->rcrfull
;
477 rdc_kstatsp
->rbr_empty
.value
.ul
= statsp
->rbr_empty
;
478 rdc_kstatsp
->rbr_empty_fail
.value
.ul
= statsp
->rbr_empty_fail
;
479 rdc_kstatsp
->rbr_empty_restore
.value
.ul
= statsp
->rbr_empty_restore
;
480 rdc_kstatsp
->rbrfull
.value
.ul
= statsp
->rbrfull
;
481 rdc_kstatsp
->rcr_invalids
.value
.ul
= statsp
->rcr_invalids
;
482 rdc_kstatsp
->rcr_to
.value
.ul
= statsp
->rcr_to
;
483 rdc_kstatsp
->rcr_thresh
.value
.ul
= statsp
->rcr_thres
;
484 rdc_kstatsp
->pkt_drop
.value
.ul
= statsp
->pkt_drop
;
486 HXGE_DEBUG_MSG((hxgep
, KST_CTL
, " <== hxge_rdc_stat_update"));
492 hxge_rdc_sys_stat_update(kstat_t
*ksp
, int rw
)
495 p_hxge_rdc_sys_kstat_t rdc_sys_kstatsp
;
496 p_hxge_rdc_sys_stats_t statsp
;
498 hxgep
= (p_hxge_t
)ksp
->ks_private
;
502 HXGE_DEBUG_MSG((hxgep
, KST_CTL
, "==> hxge_rdc_sys_stat_update"));
504 rdc_sys_kstatsp
= (p_hxge_rdc_sys_kstat_t
)ksp
->ks_data
;
505 statsp
= (p_hxge_rdc_sys_stats_t
)&hxgep
->statsp
->rdc_sys_stats
;
507 HXGE_DEBUG_MSG((hxgep
, KST_CTL
, "hxge_rdc_sys_stat_update %llx",
510 rdc_sys_kstatsp
->ctrl_fifo_sec
.value
.ul
= statsp
->ctrl_fifo_sec
;
511 rdc_sys_kstatsp
->ctrl_fifo_ded
.value
.ul
= statsp
->ctrl_fifo_ded
;
512 rdc_sys_kstatsp
->data_fifo_sec
.value
.ul
= statsp
->data_fifo_sec
;
513 rdc_sys_kstatsp
->data_fifo_ded
.value
.ul
= statsp
->data_fifo_ded
;
515 HXGE_DEBUG_MSG((hxgep
, KST_CTL
, " <== hxge_rdc_sys_stat_update"));
521 hxge_vmac_stat_update(kstat_t
*ksp
, int rw
)
524 p_hxge_vmac_kstat_t vmac_kstatsp
;
525 p_hxge_vmac_stats_t statsp
;
527 hxgep
= (p_hxge_t
)ksp
->ks_private
;
531 HXGE_DEBUG_MSG((hxgep
, KST_CTL
, "==> hxge_vmac_stat_update"));
533 hxge_save_cntrs(hxgep
);
535 vmac_kstatsp
= (p_hxge_vmac_kstat_t
)ksp
->ks_data
;
536 statsp
= (p_hxge_vmac_stats_t
)&hxgep
->statsp
->vmac_stats
;
538 vmac_kstatsp
->tx_frame_cnt
.value
.ul
= statsp
->tx_frame_cnt
;
539 vmac_kstatsp
->tx_byte_cnt
.value
.ul
= statsp
->tx_byte_cnt
;
541 vmac_kstatsp
->rx_frame_cnt
.value
.ul
= statsp
->rx_frame_cnt
;
542 vmac_kstatsp
->rx_byte_cnt
.value
.ul
= statsp
->rx_byte_cnt
;
543 vmac_kstatsp
->rx_drop_frame_cnt
.value
.ul
= statsp
->rx_drop_frame_cnt
;
544 vmac_kstatsp
->rx_drop_byte_cnt
.value
.ul
= statsp
->rx_drop_byte_cnt
;
545 vmac_kstatsp
->rx_crc_cnt
.value
.ul
= statsp
->rx_crc_cnt
;
546 vmac_kstatsp
->rx_pause_cnt
.value
.ul
= statsp
->rx_pause_cnt
;
547 vmac_kstatsp
->rx_bcast_fr_cnt
.value
.ul
= statsp
->rx_bcast_fr_cnt
;
548 vmac_kstatsp
->rx_mcast_fr_cnt
.value
.ul
= statsp
->rx_mcast_fr_cnt
;
550 HXGE_DEBUG_MSG((hxgep
, KST_CTL
, "<== hxge_vmac_stat_update"));
556 hxge_pfc_stat_update(kstat_t
*ksp
, int rw
)
559 p_hxge_pfc_kstat_t kstatsp
;
560 p_hxge_pfc_stats_t statsp
;
562 hxgep
= (p_hxge_t
)ksp
->ks_private
;
566 HXGE_DEBUG_MSG((hxgep
, KST_CTL
, "==> hxge_pfc_stat_update"));
568 kstatsp
= (p_hxge_pfc_kstat_t
)ksp
->ks_data
;
569 statsp
= (p_hxge_pfc_stats_t
)&hxgep
->statsp
->pfc_stats
;
571 kstatsp
->pfc_pkt_drop
.value
.ul
= statsp
->pkt_drop
;
572 kstatsp
->pfc_tcam_parity_err
.value
.ul
= statsp
->tcam_parity_err
;
573 kstatsp
->pfc_vlan_parity_err
.value
.ul
= statsp
->vlan_parity_err
;
574 kstatsp
->pfc_bad_cs_count
.value
.ul
= statsp
->bad_cs_count
;
575 kstatsp
->pfc_drop_count
.value
.ul
= statsp
->drop_count
;
576 kstatsp
->pfc_tcp_ctrl_drop
.value
.ul
= statsp
->errlog
.tcp_ctrl_drop
;
577 kstatsp
->pfc_l2_addr_drop
.value
.ul
= statsp
->errlog
.l2_addr_drop
;
578 kstatsp
->pfc_class_code_drop
.value
.ul
= statsp
->errlog
.class_code_drop
;
579 kstatsp
->pfc_tcam_drop
.value
.ul
= statsp
->errlog
.tcam_drop
;
580 kstatsp
->pfc_vlan_drop
.value
.ul
= statsp
->errlog
.vlan_drop
;
582 HXGE_DEBUG_MSG((hxgep
, KST_CTL
, "<== hxge_pfc_stat_update"));
588 hxge_peu_sys_stat_update(kstat_t
*ksp
, int rw
)
591 p_hxge_peu_sys_kstat_t peu_kstatsp
;
592 p_hxge_peu_sys_stats_t statsp
;
594 hxgep
= (p_hxge_t
)ksp
->ks_private
;
598 HXGE_DEBUG_MSG((hxgep
, KST_CTL
, "==> hxge_peu_sys_stat_update"));
600 peu_kstatsp
= (p_hxge_peu_sys_kstat_t
)ksp
->ks_data
;
601 statsp
= (p_hxge_peu_sys_stats_t
)&hxgep
->statsp
->peu_sys_stats
;
603 peu_kstatsp
->spc_acc_err
.value
.ul
= statsp
->spc_acc_err
;
604 peu_kstatsp
->tdc_pioacc_err
.value
.ul
= statsp
->tdc_pioacc_err
;
605 peu_kstatsp
->rdc_pioacc_err
.value
.ul
= statsp
->rdc_pioacc_err
;
606 peu_kstatsp
->pfc_pioacc_err
.value
.ul
= statsp
->pfc_pioacc_err
;
607 peu_kstatsp
->vmac_pioacc_err
.value
.ul
= statsp
->vmac_pioacc_err
;
608 peu_kstatsp
->cpl_hdrq_parerr
.value
.ul
= statsp
->cpl_hdrq_parerr
;
609 peu_kstatsp
->cpl_dataq_parerr
.value
.ul
= statsp
->cpl_dataq_parerr
;
610 peu_kstatsp
->retryram_xdlh_parerr
.value
.ul
=
611 statsp
->retryram_xdlh_parerr
;
612 peu_kstatsp
->retrysotram_xdlh_parerr
.value
.ul
=
613 statsp
->retrysotram_xdlh_parerr
;
614 peu_kstatsp
->p_hdrq_parerr
.value
.ul
= statsp
->p_hdrq_parerr
;
615 peu_kstatsp
->p_dataq_parerr
.value
.ul
= statsp
->p_dataq_parerr
;
616 peu_kstatsp
->np_hdrq_parerr
.value
.ul
= statsp
->np_hdrq_parerr
;
617 peu_kstatsp
->np_dataq_parerr
.value
.ul
= statsp
->np_dataq_parerr
;
618 peu_kstatsp
->eic_msix_parerr
.value
.ul
= statsp
->eic_msix_parerr
;
619 peu_kstatsp
->hcr_parerr
.value
.ul
= statsp
->hcr_parerr
;
621 HXGE_DEBUG_MSG((hxgep
, KST_CTL
, "<== hxge_peu_sys_stat_update"));
626 hxge_setup_local_kstat(p_hxge_t hxgep
, int instance
, char *name
,
627 const hxge_kstat_index_t
*ksip
, size_t count
,
628 int (*update
) (kstat_t
*, int))
634 ksp
= kstat_create(HXGE_DRIVER_NAME
, instance
, name
, "net",
635 KSTAT_TYPE_NAMED
, count
, 0);
639 ksp
->ks_private
= (void *) hxgep
;
640 ksp
->ks_update
= update
;
643 for (i
= 0; ksip
[i
].name
!= NULL
; i
++) {
644 kstat_named_init(&knp
[i
], ksip
[i
].name
, ksip
[i
].type
);
653 hxge_setup_kstats(p_hxge_t hxgep
)
656 p_hxge_port_kstat_t hxgekp
;
657 size_t hxge_kstat_sz
;
661 HXGE_DEBUG_MSG((hxgep
, KST_CTL
, "==> hxge_setup_kstats"));
663 /* Setup RDC statistics */
664 for (i
= 0; i
< hxgep
->nrdc
; i
++) {
665 (void) sprintf(stat_name
, "%s"CH_NAME_FORMAT
,
666 RDC_NAME_FORMAT1
, i
);
667 hxgep
->statsp
->rdc_ksp
[i
] = hxge_setup_local_kstat(hxgep
,
668 hxgep
->instance
, stat_name
, &hxge_rdc_stats
[0],
669 RDC_STAT_END
, hxge_rdc_stat_update
);
670 if (hxgep
->statsp
->rdc_ksp
[i
] == NULL
)
672 "kstat_create failed for rdc channel %d", i
);
675 /* Setup RDC System statistics */
676 hxgep
->statsp
->rdc_sys_ksp
= hxge_setup_local_kstat(hxgep
,
677 hxgep
->instance
, "RDC_system", &hxge_rdc_sys_stats
[0],
678 RDC_SYS_STAT_END
, hxge_rdc_sys_stat_update
);
679 if (hxgep
->statsp
->rdc_sys_ksp
== NULL
)
680 cmn_err(CE_WARN
, "kstat_create failed for rdc_sys_ksp");
682 /* Setup TDC statistics */
683 for (i
= 0; i
< hxgep
->ntdc
; i
++) {
684 (void) sprintf(stat_name
, "%s"CH_NAME_FORMAT
,
685 TDC_NAME_FORMAT1
, i
);
686 hxgep
->statsp
->tdc_ksp
[i
] = hxge_setup_local_kstat(hxgep
,
687 hxgep
->instance
, stat_name
, &hxge_tdc_stats
[0],
688 TDC_STAT_END
, hxge_tdc_stat_update
);
689 if (hxgep
->statsp
->tdc_ksp
[i
] == NULL
)
691 "kstat_create failed for tdc channel %d", i
);
694 /* Setup TDC System statistics */
695 hxgep
->statsp
->tdc_sys_ksp
= hxge_setup_local_kstat(hxgep
,
696 hxgep
->instance
, "TDC_system", &hxge_tdc_sys_stats
[0],
697 RDC_SYS_STAT_END
, hxge_tdc_sys_stat_update
);
698 if (hxgep
->statsp
->tdc_sys_ksp
== NULL
)
699 cmn_err(CE_WARN
, "kstat_create failed for tdc_sys_ksp");
701 /* Setup PFC statistics */
702 hxgep
->statsp
->pfc_ksp
= hxge_setup_local_kstat(hxgep
,
703 hxgep
->instance
, "PFC", &hxge_pfc_stats
[0],
704 PFC_STAT_END
, hxge_pfc_stat_update
);
705 if (hxgep
->statsp
->pfc_ksp
== NULL
)
706 cmn_err(CE_WARN
, "kstat_create failed for pfc");
708 /* Setup VMAC statistics */
709 hxgep
->statsp
->vmac_ksp
= hxge_setup_local_kstat(hxgep
,
710 hxgep
->instance
, "VMAC", &hxge_vmac_stats
[0],
711 VMAC_STAT_END
, hxge_vmac_stat_update
);
712 if (hxgep
->statsp
->vmac_ksp
== NULL
)
713 cmn_err(CE_WARN
, "kstat_create failed for vmac");
715 /* Setup MMAC Statistics. */
716 hxgep
->statsp
->mmac_ksp
= hxge_setup_local_kstat(hxgep
,
717 hxgep
->instance
, "MMAC", &hxge_mmac_stats
[0],
718 MMAC_STATS_END
, hxge_mmac_stat_update
);
719 if (hxgep
->statsp
->mmac_ksp
== NULL
)
720 cmn_err(CE_WARN
, "kstat_create failed for mmac");
722 /* Setup PEU System statistics */
723 hxgep
->statsp
->peu_sys_ksp
= hxge_setup_local_kstat(hxgep
,
724 hxgep
->instance
, "PEU", &hxge_peu_sys_stats
[0],
725 PEU_SYS_STAT_END
, hxge_peu_sys_stat_update
);
726 if (hxgep
->statsp
->peu_sys_ksp
== NULL
)
727 cmn_err(CE_WARN
, "kstat_create failed for peu sys");
730 hxge_kstat_sz
= sizeof (hxge_port_kstat_t
);
732 if ((ksp
= kstat_create(HXGE_DRIVER_NAME
, hxgep
->instance
,
733 "Port", "net", KSTAT_TYPE_NAMED
,
734 hxge_kstat_sz
/ sizeof (kstat_named_t
), 0)) == NULL
) {
735 cmn_err(CE_WARN
, "kstat_create failed for port stat");
739 hxgekp
= (p_hxge_port_kstat_t
)ksp
->ks_data
;
741 kstat_named_init(&hxgekp
->cap_10gfdx
, "cap_10gfdx", KSTAT_DATA_ULONG
);
744 * Link partner capabilities.
746 kstat_named_init(&hxgekp
->lp_cap_10gfdx
, "lp_cap_10gfdx",
752 kstat_named_init(&hxgekp
->link_speed
, "link_speed", KSTAT_DATA_ULONG
);
753 kstat_named_init(&hxgekp
->link_duplex
, "link_duplex", KSTAT_DATA_CHAR
);
754 kstat_named_init(&hxgekp
->link_up
, "link_up", KSTAT_DATA_ULONG
);
757 * Loopback statistics.
759 kstat_named_init(&hxgekp
->lb_mode
, "lb_mode", KSTAT_DATA_ULONG
);
761 /* General MAC statistics */
763 kstat_named_init(&hxgekp
->ifspeed
, "ifspeed", KSTAT_DATA_UINT64
);
764 kstat_named_init(&hxgekp
->promisc
, "promisc", KSTAT_DATA_CHAR
);
766 ksp
->ks_update
= hxge_port_kstat_update
;
767 ksp
->ks_private
= (void *) hxgep
;
769 hxgep
->statsp
->port_ksp
= ksp
;
770 HXGE_DEBUG_MSG((hxgep
, KST_CTL
, "<== hxge_setup_kstats"));
774 hxge_destroy_kstats(p_hxge_t hxgep
)
777 p_hxge_dma_pt_cfg_t p_dma_cfgp
;
778 p_hxge_hw_pt_cfg_t p_cfgp
;
780 HXGE_DEBUG_MSG((hxgep
, KST_CTL
, "==> hxge_destroy_kstats"));
781 if (hxgep
->statsp
== NULL
)
784 if (hxgep
->statsp
->ksp
)
785 kstat_delete(hxgep
->statsp
->ksp
);
787 p_dma_cfgp
= (p_hxge_dma_pt_cfg_t
)&hxgep
->pt_config
;
788 p_cfgp
= (p_hxge_hw_pt_cfg_t
)&p_dma_cfgp
->hw_config
;
790 for (channel
= 0; channel
< p_cfgp
->max_rdcs
; channel
++) {
791 if (hxgep
->statsp
->rdc_ksp
[channel
]) {
792 kstat_delete(hxgep
->statsp
->rdc_ksp
[channel
]);
796 for (channel
= 0; channel
< p_cfgp
->max_tdcs
; channel
++) {
797 if (hxgep
->statsp
->tdc_ksp
[channel
]) {
798 kstat_delete(hxgep
->statsp
->tdc_ksp
[channel
]);
802 if (hxgep
->statsp
->rdc_sys_ksp
)
803 kstat_delete(hxgep
->statsp
->rdc_sys_ksp
);
805 if (hxgep
->statsp
->tdc_sys_ksp
)
806 kstat_delete(hxgep
->statsp
->tdc_sys_ksp
);
808 if (hxgep
->statsp
->peu_sys_ksp
)
809 kstat_delete(hxgep
->statsp
->peu_sys_ksp
);
811 if (hxgep
->statsp
->mmac_ksp
)
812 kstat_delete(hxgep
->statsp
->mmac_ksp
);
814 if (hxgep
->statsp
->pfc_ksp
)
815 kstat_delete(hxgep
->statsp
->pfc_ksp
);
817 if (hxgep
->statsp
->vmac_ksp
)
818 kstat_delete(hxgep
->statsp
->vmac_ksp
);
820 if (hxgep
->statsp
->port_ksp
)
821 kstat_delete(hxgep
->statsp
->port_ksp
);
824 KMEM_FREE(hxgep
->statsp
, hxgep
->statsp
->stats_size
);
826 HXGE_DEBUG_MSG((hxgep
, KST_CTL
, "<== hxge_destroy_kstats"));
831 hxge_port_kstat_update(kstat_t
*ksp
, int rw
)
834 p_hxge_stats_t statsp
;
835 p_hxge_port_kstat_t hxgekp
;
836 p_hxge_port_stats_t psp
;
838 hxgep
= (p_hxge_t
)ksp
->ks_private
;
842 HXGE_DEBUG_MSG((hxgep
, KST_CTL
, "==> hxge_port_kstat_update"));
843 statsp
= (p_hxge_stats_t
)hxgep
->statsp
;
844 hxgekp
= (p_hxge_port_kstat_t
)ksp
->ks_data
;
845 psp
= &statsp
->port_stats
;
847 if (hxgep
->filter
.all_phys_cnt
)
848 (void) strcpy(hxgekp
->promisc
.value
.c
, "phys");
849 else if (hxgep
->filter
.all_multicast_cnt
)
850 (void) strcpy(hxgekp
->promisc
.value
.c
, "multi");
852 (void) strcpy(hxgekp
->promisc
.value
.c
, "off");
853 hxgekp
->ifspeed
.value
.ul
= statsp
->mac_stats
.link_speed
* 1000000ULL;
856 * transceiver state informations.
858 hxgekp
->cap_10gfdx
.value
.ul
= statsp
->mac_stats
.cap_10gfdx
;
861 * Link partner capabilities.
863 hxgekp
->lp_cap_10gfdx
.value
.ul
= statsp
->mac_stats
.lp_cap_10gfdx
;
866 * Physical link statistics.
868 hxgekp
->link_speed
.value
.ul
= statsp
->mac_stats
.link_speed
;
869 if (statsp
->mac_stats
.link_duplex
== 2)
870 (void) strcpy(hxgekp
->link_duplex
.value
.c
, "full");
872 (void) strcpy(hxgekp
->link_duplex
.value
.c
, "unknown");
873 hxgekp
->link_up
.value
.ul
= statsp
->mac_stats
.link_up
;
876 * Loopback statistics.
878 hxgekp
->lb_mode
.value
.ul
= psp
->lb_mode
;
880 HXGE_DEBUG_MSG((hxgep
, KST_CTL
, "<== hxge_port_kstat_update"));
885 * Retrieve a value for one of the statistics for a particular rx ring
888 hxge_rx_ring_stat(mac_ring_driver_t rdriver
, uint_t stat
, uint64_t *val
)
890 p_hxge_ring_handle_t rhp
= (p_hxge_ring_handle_t
)rdriver
;
891 p_hxge_t hxgep
= rhp
->hxgep
;
894 ASSERT(hxgep
!= NULL
);
895 ASSERT(hxgep
->statsp
!= NULL
);
896 ASSERT((rhp
->index
>= 0) && (rhp
->index
< HXGE_MAX_RDCS
));
899 case MAC_STAT_IERRORS
:
900 *val
= hxgep
->statsp
->rdc_stats
[rhp
->index
].ierrors
;
902 case MAC_STAT_RBYTES
:
903 *val
= hxgep
->statsp
->rdc_stats
[rhp
->index
].ibytes
;
905 case MAC_STAT_IPACKETS
:
906 *val
= hxgep
->statsp
->rdc_stats
[rhp
->index
].ipackets
;
917 * Retrieve a value for one of the statistics for a particular tx ring
920 hxge_tx_ring_stat(mac_ring_driver_t rdriver
, uint_t stat
, uint64_t *val
)
922 p_hxge_ring_handle_t rhp
= (p_hxge_ring_handle_t
)rdriver
;
923 p_hxge_t hxgep
= rhp
->hxgep
;
926 ASSERT(hxgep
!= NULL
);
927 ASSERT(hxgep
->statsp
!= NULL
);
928 ASSERT((rhp
->index
>= 0) && (rhp
->index
< HXGE_MAX_TDCS
));
931 case MAC_STAT_OERRORS
:
932 *val
= hxgep
->statsp
->tdc_stats
[rhp
->index
].oerrors
;
934 case MAC_STAT_OBYTES
:
935 *val
= hxgep
->statsp
->tdc_stats
[rhp
->index
].obytes
;
937 case MAC_STAT_OPACKETS
:
938 *val
= hxgep
->statsp
->tdc_stats
[rhp
->index
].opackets
;
949 hxge_m_stat(void *arg
, uint_t stat
, uint64_t *value
)
951 p_hxge_t hxgep
= (p_hxge_t
)arg
;
952 p_hxge_stats_t statsp
;
953 hxge_tx_ring_stats_t
*tx_stats
;
957 HXGE_DEBUG_MSG((hxgep
, KST_CTL
, "==> hxge_m_stat"));
958 statsp
= (p_hxge_stats_t
)hxgep
->statsp
;
961 case MAC_STAT_IFSPEED
:
962 val
= statsp
->mac_stats
.link_speed
* 1000000ull;
965 case MAC_STAT_MULTIRCV
:
969 case MAC_STAT_BRDCSTRCV
:
973 case MAC_STAT_MULTIXMT
:
977 case MAC_STAT_BRDCSTXMT
:
981 case MAC_STAT_NORCVBUF
:
985 case MAC_STAT_IERRORS
:
986 case ETHER_STAT_MACRCV_ERRORS
:
988 for (channel
= 0; channel
< hxgep
->nrdc
; channel
++) {
989 val
+= statsp
->rdc_stats
[channel
].ierrors
;
993 case MAC_STAT_NOXMTBUF
:
997 case MAC_STAT_OERRORS
:
998 for (channel
= 0; channel
< hxgep
->ntdc
; channel
++) {
999 val
+= statsp
->tdc_stats
[channel
].oerrors
;
1003 case MAC_STAT_COLLISIONS
:
1007 case MAC_STAT_RBYTES
:
1008 for (channel
= 0; channel
< hxgep
->nrdc
; channel
++) {
1009 val
+= statsp
->rdc_stats
[channel
].ibytes
;
1013 case MAC_STAT_IPACKETS
:
1014 for (channel
= 0; channel
< hxgep
->nrdc
; channel
++) {
1015 val
+= statsp
->rdc_stats
[channel
].ipackets
;
1019 case MAC_STAT_OBYTES
:
1020 for (channel
= 0; channel
< hxgep
->ntdc
; channel
++) {
1021 val
+= statsp
->tdc_stats
[channel
].obytes
;
1025 case MAC_STAT_OPACKETS
:
1026 for (channel
= 0; channel
< hxgep
->ntdc
; channel
++) {
1027 val
+= statsp
->tdc_stats
[channel
].opackets
;
1031 case MAC_STAT_UNKNOWNS
:
1035 case MAC_STAT_UNDERFLOWS
:
1039 case MAC_STAT_OVERFLOWS
:
1043 case MAC_STAT_LINK_STATE
:
1044 val
= statsp
->mac_stats
.link_duplex
;
1046 case MAC_STAT_LINK_UP
:
1047 val
= statsp
->mac_stats
.link_up
;
1049 case MAC_STAT_PROMISC
:
1050 val
= statsp
->mac_stats
.promisc
;
1052 case ETHER_STAT_SQE_ERRORS
:
1056 case ETHER_STAT_ALIGN_ERRORS
:
1058 * No similar error in Hydra receive channels
1063 case ETHER_STAT_FCS_ERRORS
:
1065 * No similar error in Hydra receive channels
1070 case ETHER_STAT_FIRST_COLLISIONS
:
1074 case ETHER_STAT_MULTI_COLLISIONS
:
1078 case ETHER_STAT_TX_LATE_COLLISIONS
:
1082 case ETHER_STAT_EX_COLLISIONS
:
1086 case ETHER_STAT_DEFER_XMTS
:
1090 case ETHER_STAT_MACXMT_ERRORS
:
1092 * A count of frames for which transmission on a
1093 * particular interface fails due to an internal
1094 * MAC sublayer transmit error
1096 for (channel
= 0; channel
< hxgep
->ntdc
; channel
++) {
1097 tx_stats
= &statsp
->tdc_stats
[channel
];
1098 val
+= tx_stats
->pkt_size_hdr_err
+
1099 tx_stats
->pkt_size_err
+
1100 tx_stats
->tx_rng_oflow
+
1101 tx_stats
->peu_resp_err
+
1102 tx_stats
->runt_pkt_drop_err
+
1103 tx_stats
->pref_par_err
+
1104 tx_stats
->tdr_pref_cpl_to
+
1105 tx_stats
->pkt_cpl_to
+
1106 tx_stats
->invalid_sop
+
1107 tx_stats
->unexpected_sop
;
1111 case ETHER_STAT_CARRIER_ERRORS
:
1113 * The number of times that the carrier sense
1114 * condition was lost or never asserted when
1115 * attempting to transmit a frame on a particular interface
1117 for (channel
= 0; channel
< hxgep
->ntdc
; channel
++) {
1118 tx_stats
= &statsp
->tdc_stats
[channel
];
1119 val
+= tx_stats
->tdr_pref_cpl_to
+ tx_stats
->pkt_cpl_to
;
1123 case ETHER_STAT_TOOLONG_ERRORS
:
1125 * A count of frames received on a particular
1126 * interface that exceed the maximum permitted frame size
1128 for (channel
= 0; channel
< hxgep
->ntdc
; channel
++) {
1129 tx_stats
= &statsp
->tdc_stats
[channel
];
1130 val
+= tx_stats
->pkt_size_err
;
1134 case ETHER_STAT_XCVR_ADDR
:
1137 case ETHER_STAT_XCVR_ID
:
1141 case ETHER_STAT_XCVR_INUSE
:
1145 case ETHER_STAT_CAP_1000FDX
:
1149 case ETHER_STAT_CAP_1000HDX
:
1153 case ETHER_STAT_CAP_100FDX
:
1157 case ETHER_STAT_CAP_100HDX
:
1161 case ETHER_STAT_CAP_10FDX
:
1165 case ETHER_STAT_CAP_10HDX
:
1169 case ETHER_STAT_CAP_ASMPAUSE
:
1173 case ETHER_STAT_CAP_PAUSE
:
1177 case ETHER_STAT_CAP_AUTONEG
:
1181 case ETHER_STAT_ADV_CAP_1000FDX
:
1185 case ETHER_STAT_ADV_CAP_1000HDX
:
1189 case ETHER_STAT_ADV_CAP_100FDX
:
1193 case ETHER_STAT_ADV_CAP_100HDX
:
1197 case ETHER_STAT_ADV_CAP_10FDX
:
1201 case ETHER_STAT_ADV_CAP_10HDX
:
1205 case ETHER_STAT_ADV_CAP_ASMPAUSE
:
1209 case ETHER_STAT_ADV_CAP_PAUSE
:
1213 case ETHER_STAT_ADV_CAP_AUTONEG
:
1217 case ETHER_STAT_LP_CAP_1000FDX
:
1221 case ETHER_STAT_LP_CAP_1000HDX
:
1225 case ETHER_STAT_LP_CAP_100FDX
:
1229 case ETHER_STAT_LP_CAP_100HDX
:
1233 case ETHER_STAT_LP_CAP_10FDX
:
1237 case ETHER_STAT_LP_CAP_10HDX
:
1241 case ETHER_STAT_LP_CAP_ASMPAUSE
:
1245 case ETHER_STAT_LP_CAP_PAUSE
:
1249 case ETHER_STAT_LP_CAP_AUTONEG
:
1253 case ETHER_STAT_LINK_ASMPAUSE
:
1257 case ETHER_STAT_LINK_PAUSE
:
1261 case ETHER_STAT_LINK_AUTONEG
:
1265 case ETHER_STAT_LINK_DUPLEX
:
1266 val
= statsp
->mac_stats
.link_duplex
;
1269 case ETHER_STAT_TOOSHORT_ERRORS
:
1273 case ETHER_STAT_CAP_REMFAULT
:
1277 case ETHER_STAT_ADV_REMFAULT
:
1281 case ETHER_STAT_LP_REMFAULT
:
1285 case ETHER_STAT_JABBER_ERRORS
:
1289 case ETHER_STAT_CAP_100T4
:
1293 case ETHER_STAT_ADV_CAP_100T4
:
1297 case ETHER_STAT_LP_CAP_100T4
:
1301 case ETHER_STAT_ADV_CAP_10GFDX
:
1302 case ETHER_STAT_CAP_10GFDX
:
1303 case ETHER_STAT_LP_CAP_10GFDX
:
1309 * Shouldn't reach here...
1312 "hxge_m_stat: unrecognized parameter value = 0x%x", stat
);
1320 hxge_mac_octet_to_u64(uint8_t *addr
)
1323 uint64_t addr64
= 0;
1325 for (i
= ETHERADDRL
- 1; i
>= 0; i
--) {
1334 hxge_mmac_stat_update(kstat_t
*ksp
, int rw
)
1337 p_hxge_mmac_kstat_t mmac_kstatsp
;
1339 hxgep
= (p_hxge_t
)ksp
->ks_private
;
1343 HXGE_DEBUG_MSG((hxgep
, KST_CTL
, "==> hxge_mmac_stat_update"));
1345 if (rw
== KSTAT_WRITE
) {
1346 cmn_err(CE_WARN
, "Can not write mmac stats");
1348 MUTEX_ENTER(hxgep
->genlock
);
1349 mmac_kstatsp
= (p_hxge_mmac_kstat_t
)ksp
->ks_data
;
1350 mmac_kstatsp
->mmac_max_addr_cnt
.value
.ul
= hxgep
->mmac
.total
;
1351 mmac_kstatsp
->mmac_avail_addr_cnt
.value
.ul
=
1352 hxgep
->mmac
.available
;
1353 mmac_kstatsp
->mmac_addr1
.value
.ul
=
1354 hxge_mac_octet_to_u64(hxgep
->mmac
.addrs
[0].addr
);
1355 mmac_kstatsp
->mmac_addr2
.value
.ul
=
1356 hxge_mac_octet_to_u64(hxgep
->mmac
.addrs
[1].addr
);
1357 mmac_kstatsp
->mmac_addr3
.value
.ul
=
1358 hxge_mac_octet_to_u64(hxgep
->mmac
.addrs
[2].addr
);
1359 mmac_kstatsp
->mmac_addr4
.value
.ul
=
1360 hxge_mac_octet_to_u64(hxgep
->mmac
.addrs
[3].addr
);
1361 mmac_kstatsp
->mmac_addr5
.value
.ul
=
1362 hxge_mac_octet_to_u64(hxgep
->mmac
.addrs
[4].addr
);
1363 mmac_kstatsp
->mmac_addr6
.value
.ul
=
1364 hxge_mac_octet_to_u64(hxgep
->mmac
.addrs
[5].addr
);
1365 mmac_kstatsp
->mmac_addr7
.value
.ul
=
1366 hxge_mac_octet_to_u64(hxgep
->mmac
.addrs
[6].addr
);
1367 mmac_kstatsp
->mmac_addr8
.value
.ul
=
1368 hxge_mac_octet_to_u64(hxgep
->mmac
.addrs
[7].addr
);
1369 mmac_kstatsp
->mmac_addr9
.value
.ul
=
1370 hxge_mac_octet_to_u64(hxgep
->mmac
.addrs
[8].addr
);
1371 mmac_kstatsp
->mmac_addr10
.value
.ul
=
1372 hxge_mac_octet_to_u64(hxgep
->mmac
.addrs
[9].addr
);
1373 mmac_kstatsp
->mmac_addr11
.value
.ul
=
1374 hxge_mac_octet_to_u64(hxgep
->mmac
.addrs
[10].addr
);
1375 mmac_kstatsp
->mmac_addr12
.value
.ul
=
1376 hxge_mac_octet_to_u64(hxgep
->mmac
.addrs
[11].addr
);
1377 mmac_kstatsp
->mmac_addr13
.value
.ul
=
1378 hxge_mac_octet_to_u64(hxgep
->mmac
.addrs
[12].addr
);
1379 mmac_kstatsp
->mmac_addr14
.value
.ul
=
1380 hxge_mac_octet_to_u64(hxgep
->mmac
.addrs
[13].addr
);
1381 mmac_kstatsp
->mmac_addr15
.value
.ul
=
1382 hxge_mac_octet_to_u64(hxgep
->mmac
.addrs
[14].addr
);
1383 mmac_kstatsp
->mmac_addr16
.value
.ul
=
1384 hxge_mac_octet_to_u64(hxgep
->mmac
.addrs
[15].addr
);
1385 MUTEX_EXIT(hxgep
->genlock
);
1388 HXGE_DEBUG_MSG((hxgep
, KST_CTL
, "<== hxge_mmac_stat_update"));