xref: /illumos-gate/usr/src/uts/common/io/xge/hal/xgehal/xgehal-mgmtaux.c (revision 4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3)
1 /*
2  * CDDL HEADER START
3  *
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.
7  *
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.
12  *
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]
18  *
19  * CDDL HEADER END
20  *
21  * Copyright (c) 2002-2006 Neterion, Inc.
22  */
23 
24 #include "xgehal-mgmt.h"
25 #include "xgehal-driver.h"
26 #include "xgehal-device.h"
27 
28 #ifdef XGE_OS_HAS_SNPRINTF
29 #define __hal_aux_snprintf(retbuf, bufsize, fmt, key, value, retsize) \
30     if (bufsize <= 0) return XGE_HAL_ERR_OUT_OF_SPACE; \
31     retsize = xge_os_snprintf(retbuf, bufsize, fmt, key, \
32 			XGE_HAL_AUX_SEPA, value); \
33     if (retsize < 0 || retsize >= bufsize) return XGE_HAL_ERR_OUT_OF_SPACE;
34 #else
35 #define __hal_aux_snprintf(retbuf, bufsize, fmt, key, value, retsize) \
36 	if (bufsize <= 0) return XGE_HAL_ERR_OUT_OF_SPACE; \
37         retsize = xge_os_sprintf(retbuf, fmt, key, XGE_HAL_AUX_SEPA, value); \
38 	xge_assert(retsize < bufsize); \
39 	if (retsize < 0 || retsize >= bufsize) \
40 		return XGE_HAL_ERR_OUT_OF_SPACE;
41 #endif
42 
43 #define __HAL_AUX_ENTRY_DECLARE(size, buf) \
44 	int entrysize = 0, leftsize = size; \
45 	char *ptr = buf;
46 
47 #define __HAL_AUX_ENTRY(key, value, fmt) \
48 	ptr += entrysize; leftsize -= entrysize; \
49 	__hal_aux_snprintf(ptr, leftsize, "%s%c"fmt"\n", key, value, entrysize)
50 
51 #define __HAL_AUX_ENTRY_END(bufsize, retsize) \
52 	leftsize -= entrysize; \
53 	*retsize = bufsize - leftsize;
54 
55 /**
56  * xge_hal_aux_bar0_read - Read and format Xframe BAR0 register.
57  * @devh: HAL device handle.
58  * @offset: Register offset in the BAR0 space.
59  * @bufsize: Buffer size.
60  * @retbuf: Buffer pointer.
61  * @retsize: Size of the result. Cannot be greater than @bufsize.
62  *
63  * Read Xframe register from BAR0 space. The result is formatted as an ascii string.
64  *
65  * Returns: XGE_HAL_OK - success.
66  * XGE_HAL_ERR_OUT_OF_SPACE - Buffer size is very small.
67  * XGE_HAL_ERR_INVALID_DEVICE - Device is not valid.
68  * XGE_HAL_ERR_INVALID_OFFSET - Register offset in the BAR space is not
69  * valid.
70  * XGE_HAL_ERR_INVALID_BAR_ID - BAR id is not valid.
71  *
72  * See also: xge_hal_mgmt_reg_read().
73  */
74 xge_hal_status_e xge_hal_aux_bar0_read(xge_hal_device_h devh,
75 			unsigned int offset, int bufsize, char *retbuf,
76 			int *retsize)
77 {
78 	xge_hal_status_e status;
79 	u64 retval;
80 
81 	status = xge_hal_mgmt_reg_read(devh, 0, offset, &retval);
82 	if (status != XGE_HAL_OK) {
83 		return status;
84 	}
85 
86 	if (bufsize < XGE_OS_SPRINTF_STRLEN) {
87 		return XGE_HAL_ERR_OUT_OF_SPACE;
88 	}
89 
90 	*retsize = xge_os_sprintf(retbuf, "0x%04X%c0x%08X%08X\n", offset,
91 				XGE_HAL_AUX_SEPA, (u32)(retval>>32), (u32)retval);
92 
93 	return XGE_HAL_OK;
94 }
95 
96 /**
97  * xge_hal_aux_bar1_read - Read and format Xframe BAR1 register.
98  * @devh: HAL device handle.
99  * @offset: Register offset in the BAR1 space.
100  * @bufsize: Buffer size.
101  * @retbuf: Buffer pointer.
102  * @retsize: Size of the result. Cannot be greater than @bufsize.
103  *
104  * Read Xframe register from BAR1 space. The result is formatted as ascii string.
105  * Returns: XGE_HAL_OK - success.
106  * XGE_HAL_ERR_OUT_OF_SPACE - Buffer size is very small.
107  * XGE_HAL_ERR_INVALID_DEVICE - Device is not valid.
108  * XGE_HAL_ERR_INVALID_OFFSET - Register offset in the BAR space is not
109  * valid.
110  * XGE_HAL_ERR_INVALID_BAR_ID - BAR id is not valid.
111  *
112  * See also: xge_hal_mgmt_reg_read().
113  */
114 xge_hal_status_e xge_hal_aux_bar1_read(xge_hal_device_h devh,
115 			unsigned int offset, int bufsize, char *retbuf,
116 			int *retsize)
117 {
118 	xge_hal_status_e status;
119 	u64 retval;
120 
121 	status = xge_hal_mgmt_reg_read(devh, 1, offset, &retval);
122 	if (status != XGE_HAL_OK) {
123 		return status;
124 	}
125 
126 	if (bufsize < XGE_OS_SPRINTF_STRLEN) {
127 		return XGE_HAL_ERR_OUT_OF_SPACE;
128 	}
129 
130         *retsize = xge_os_sprintf(retbuf, "0x%04X%c0x%08X%08X\n",
131         offset,
132 				XGE_HAL_AUX_SEPA, (u32)(retval>>32), (u32)retval);
133 
134 	return XGE_HAL_OK;
135 }
136 
137 /**
138  * xge_hal_aux_bar0_write - Write BAR0 register.
139  * @devh: HAL device handle.
140  * @offset: Register offset in the BAR0 space.
141  * @value: Regsister value (to write).
142  *
143  * Write BAR0 register.
144  *
145  * Returns: XGE_HAL_OK - success.
146  * XGE_HAL_ERR_INVALID_DEVICE - Device is not valid.
147  * XGE_HAL_ERR_INVALID_OFFSET - Register offset in the BAR space is not
148  * valid.
149  * XGE_HAL_ERR_INVALID_BAR_ID - BAR id is not valid.
150  *
151  * See also: xge_hal_mgmt_reg_write().
152  */
153 xge_hal_status_e xge_hal_aux_bar0_write(xge_hal_device_h devh,
154 			unsigned int offset, u64 value)
155 {
156 	xge_hal_status_e status;
157 
158 	status = xge_hal_mgmt_reg_write(devh, 0, offset, value);
159 	if (status != XGE_HAL_OK) {
160 		return status;
161 	}
162 
163 	return XGE_HAL_OK;
164 }
165 
166 /**
167  * xge_hal_aux_about_read - Retrieve and format about info.
168  * @devh: HAL device handle.
169  * @bufsize: Buffer size.
170  * @retbuf: Buffer pointer.
171  * @retsize: Size of the result. Cannot be greater than @bufsize.
172  *
173  * Retrieve about info (using xge_hal_mgmt_about()) and sprintf it
174  * into the provided @retbuf.
175  *
176  * Returns: XGE_HAL_OK - success.
177  * XGE_HAL_ERR_INVALID_DEVICE - Device is not valid.
178  * XGE_HAL_ERR_VERSION_CONFLICT - Version it not maching.
179  * XGE_HAL_FAIL - Failed to retrieve the information.
180  *
181  * See also: xge_hal_mgmt_about(), xge_hal_aux_device_dump().
182  */
183 xge_hal_status_e xge_hal_aux_about_read(xge_hal_device_h devh, int bufsize,
184 			char *retbuf, int *retsize)
185 {
186 	xge_hal_status_e status;
187 	xge_hal_mgmt_about_info_t about_info;
188 	__HAL_AUX_ENTRY_DECLARE(bufsize, retbuf);
189 
190 	status = xge_hal_mgmt_about(devh, &about_info,
191 				  sizeof(xge_hal_mgmt_about_info_t));
192 	if (status != XGE_HAL_OK) {
193 		return status;
194 	}
195 
196 	__HAL_AUX_ENTRY("vendor", about_info.vendor, "0x%x");
197 	__HAL_AUX_ENTRY("device", about_info.device, "0x%x");
198 	__HAL_AUX_ENTRY("subsys_vendor", about_info.subsys_vendor, "0x%x");
199 	__HAL_AUX_ENTRY("subsys_device", about_info.subsys_device, "0x%x");
200 	__HAL_AUX_ENTRY("board_rev", about_info.board_rev, "0x%x");
201 	__HAL_AUX_ENTRY("vendor_name", about_info.vendor_name, "%s");
202 	__HAL_AUX_ENTRY("chip_name", about_info.chip_name, "%s");
203 	__HAL_AUX_ENTRY("media", about_info.media, "%s");
204 	__HAL_AUX_ENTRY("hal_major", about_info.hal_major, "%s");
205 	__HAL_AUX_ENTRY("hal_minor", about_info.hal_minor, "%s");
206 	__HAL_AUX_ENTRY("hal_fix", about_info.hal_fix, "%s");
207 	__HAL_AUX_ENTRY("hal_build", about_info.hal_build, "%s");
208 	__HAL_AUX_ENTRY("ll_major", about_info.ll_major, "%s");
209 	__HAL_AUX_ENTRY("ll_minor", about_info.ll_minor, "%s");
210 	__HAL_AUX_ENTRY("ll_fix", about_info.ll_fix, "%s");
211 	__HAL_AUX_ENTRY("ll_build", about_info.ll_build, "%s");
212 
213 	__HAL_AUX_ENTRY("transponder_temperature",
214 			about_info.transponder_temperature, "%d C");
215 
216 	__HAL_AUX_ENTRY_END(bufsize, retsize);
217 
218 	return XGE_HAL_OK;
219 }
220 
221 /**
222  * xge_hal_aux_stats_tmac_read - Read TMAC hardware statistics.
223  * @devh: HAL device handle.
224  * @bufsize: Buffer size.
225  * @retbuf: Buffer pointer.
226  * @retsize: Size of the result. Cannot be greater than @bufsize.
227  *
228  * Read TMAC hardware statistics. This is a subset of stats counters
229  * from xge_hal_stats_hw_info_t{}.
230  *
231  * Returns: XGE_HAL_OK - success.
232  * XGE_HAL_ERR_INVALID_DEVICE - Device is not valid.
233  * XGE_HAL_ERR_VERSION_CONFLICT - Version it not maching.
234  *
235  * See also: xge_hal_mgmt_hw_stats{}, xge_hal_stats_hw_info_t{},
236  * xge_hal_aux_stats_pci_read(),
237  * xge_hal_aux_device_dump().
238  */
239 xge_hal_status_e xge_hal_aux_stats_tmac_read(xge_hal_device_h devh, int	bufsize,
240 				char *retbuf, int *retsize)
241 {
242 	xge_hal_status_e status;
243 	xge_hal_mgmt_hw_stats_t hw;
244 	__HAL_AUX_ENTRY_DECLARE(bufsize, retbuf);
245 
246 	status = xge_hal_mgmt_hw_stats(devh, &hw,
247 				     sizeof(xge_hal_mgmt_hw_stats_t));
248 	if (status != XGE_HAL_OK) {
249 		return status;
250 	}
251 
252 	__HAL_AUX_ENTRY("tmac_data_octets", hw.tmac_data_octets, "%u");
253 	__HAL_AUX_ENTRY("tmac_frms", hw.tmac_frms, "%u");
254 	__HAL_AUX_ENTRY("tmac_drop_frms", (unsigned long long)
255 			hw.tmac_drop_frms, "%llu");
256 	__HAL_AUX_ENTRY("tmac_bcst_frms", hw.tmac_bcst_frms, "%u");
257 	__HAL_AUX_ENTRY("tmac_mcst_frms", hw.tmac_mcst_frms, "%u");
258 	__HAL_AUX_ENTRY("tmac_pause_ctrl_frms", (unsigned long long)
259 			hw.tmac_pause_ctrl_frms, "%llu");
260 	__HAL_AUX_ENTRY("tmac_ucst_frms", hw.tmac_ucst_frms, "%u");
261 	__HAL_AUX_ENTRY("tmac_ttl_octets", hw.tmac_ttl_octets, "%u");
262 	__HAL_AUX_ENTRY("tmac_any_err_frms", hw.tmac_any_err_frms, "%u");
263 	__HAL_AUX_ENTRY("tmac_nucst_frms", hw.tmac_nucst_frms, "%u");
264 	__HAL_AUX_ENTRY("tmac_ttl_less_fb_octets", (unsigned long long)
265 			hw.tmac_ttl_less_fb_octets, "%llu");
266 	__HAL_AUX_ENTRY("tmac_vld_ip_octets", (unsigned long long)
267 			hw.tmac_vld_ip_octets, "%llu");
268 	__HAL_AUX_ENTRY("tmac_drop_ip", hw.tmac_drop_ip, "%u");
269 	__HAL_AUX_ENTRY("tmac_vld_ip", hw.tmac_vld_ip, "%u");
270 	__HAL_AUX_ENTRY("tmac_rst_tcp", hw.tmac_rst_tcp, "%u");
271 	__HAL_AUX_ENTRY("tmac_icmp", hw.tmac_icmp, "%u");
272 	__HAL_AUX_ENTRY("tmac_tcp", (unsigned long long)
273 			hw.tmac_tcp, "%llu");
274 	__HAL_AUX_ENTRY("reserved_0", hw.reserved_0, "%u");
275 	__HAL_AUX_ENTRY("tmac_udp", hw.tmac_udp, "%u");
276 
277 	__HAL_AUX_ENTRY_END(bufsize, retsize);
278 
279 	return XGE_HAL_OK;
280 }
281 
282 /**
283  * xge_hal_aux_stats_rmac_read - Read RMAC hardware statistics.
284  * @devh: HAL device handle.
285  * @bufsize: Buffer size.
286  * @retbuf: Buffer pointer.
287  * @retsize: Size of the result. Cannot be greater than @bufsize.
288  *
289  * Read RMAC hardware statistics. This is a subset of stats counters
290  * from xge_hal_stats_hw_info_t{}.
291  *
292  * Returns: XGE_HAL_OK - success.
293  * XGE_HAL_ERR_INVALID_DEVICE - Device is not valid.
294  * XGE_HAL_ERR_VERSION_CONFLICT - Version it not maching.
295  *
296  * See also: xge_hal_mgmt_hw_stats{}, xge_hal_stats_hw_info_t{},
297  * xge_hal_aux_stats_pci_read(), xge_hal_aux_stats_tmac_read(),
298  * xge_hal_aux_device_dump().
299  */
300 xge_hal_status_e xge_hal_aux_stats_rmac_read(xge_hal_device_h devh, int	bufsize,
301 				char *retbuf, int *retsize)
302 {
303 	xge_hal_status_e status;
304 	xge_hal_mgmt_hw_stats_t hw;
305 	__HAL_AUX_ENTRY_DECLARE(bufsize, retbuf);
306 
307 	status = xge_hal_mgmt_hw_stats(devh, &hw,
308 				     sizeof(xge_hal_mgmt_hw_stats_t));
309 	if (status != XGE_HAL_OK) {
310 		return status;
311 	}
312 
313 	__HAL_AUX_ENTRY("rmac_data_octets", hw.rmac_data_octets, "%u");
314 	__HAL_AUX_ENTRY("rmac_vld_frms", hw.rmac_vld_frms, "%u");
315 	__HAL_AUX_ENTRY("rmac_fcs_err_frms", (unsigned long long)
316 			hw.rmac_fcs_err_frms, "%llu");
317 	__HAL_AUX_ENTRY("mac_drop_frms", (unsigned long long)
318 			hw.rmac_drop_frms, "%llu");
319 	__HAL_AUX_ENTRY("rmac_vld_bcst_frms", hw.rmac_vld_bcst_frms, "%u");
320 	__HAL_AUX_ENTRY("rmac_vld_mcst_frms", hw.rmac_vld_mcst_frms, "%u");
321 	__HAL_AUX_ENTRY("rmac_out_rng_len_err_frms",
322 			hw.rmac_out_rng_len_err_frms, "%u");
323 	__HAL_AUX_ENTRY("rmac_in_rng_len_err_frms",
324 			hw.rmac_in_rng_len_err_frms, "%u");
325 	__HAL_AUX_ENTRY("rmac_long_frms", (unsigned long long)
326 			hw.rmac_long_frms, "%llu");
327 	__HAL_AUX_ENTRY("rmac_pause_ctrl_frms", (unsigned long long)
328 			hw.rmac_pause_ctrl_frms, "%llu");
329 	__HAL_AUX_ENTRY("rmac_unsup_ctrl_frms", (unsigned long long)
330 			hw.rmac_unsup_ctrl_frms, "%llu");
331 	__HAL_AUX_ENTRY("rmac_accepted_ucst_frms",
332 			hw.rmac_accepted_ucst_frms, "%u");
333 	__HAL_AUX_ENTRY("rmac_ttl_octets", hw.rmac_ttl_octets, "%u");
334 	__HAL_AUX_ENTRY("rmac_discarded_frms", hw.rmac_discarded_frms, "%u");
335 	__HAL_AUX_ENTRY("rmac_accepted_nucst_frms",
336 			hw.rmac_accepted_nucst_frms, "%u");
337 	__HAL_AUX_ENTRY("reserved_1", hw.reserved_1, "%u");
338 	__HAL_AUX_ENTRY("rmac_drop_events", hw.rmac_drop_events, "%u");
339 	__HAL_AUX_ENTRY("rmac_ttl_less_fb_octets", (unsigned long long)
340 			hw.rmac_ttl_less_fb_octets, "%llu");
341 	__HAL_AUX_ENTRY("rmac_ttl_frms", (unsigned long long)
342 			hw.rmac_ttl_frms, "%llu");
343 	__HAL_AUX_ENTRY("reserved_2", (unsigned long long)
344 			hw.reserved_2, "%llu");
345 	__HAL_AUX_ENTRY("rmac_usized_frms", hw.rmac_usized_frms, "%u");
346 	__HAL_AUX_ENTRY("reserved_3", hw.reserved_3, "%u");
347 	__HAL_AUX_ENTRY("rmac_frag_frms", hw.rmac_frag_frms, "%u");
348 	__HAL_AUX_ENTRY("rmac_osized_frms", hw.rmac_osized_frms, "%u");
349 	__HAL_AUX_ENTRY("reserved_4", hw.reserved_4, "%u");
350 	__HAL_AUX_ENTRY("rmac_jabber_frms", hw.rmac_jabber_frms, "%u");
351 	__HAL_AUX_ENTRY("rmac_ttl_64_frms", (unsigned long long)
352 			hw.rmac_ttl_64_frms, "%llu");
353 	__HAL_AUX_ENTRY("rmac_ttl_65_127_frms", (unsigned long long)
354 			hw.rmac_ttl_65_127_frms, "%llu");
355 	__HAL_AUX_ENTRY("reserved_5", (unsigned long long)
356 			hw.reserved_5, "%llu");
357 	__HAL_AUX_ENTRY("rmac_ttl_128_255_frms", (unsigned long long)
358 			hw.rmac_ttl_128_255_frms, "%llu");
359 	__HAL_AUX_ENTRY("rmac_ttl_256_511_frms", (unsigned long long)
360 			hw.rmac_ttl_256_511_frms, "%llu");
361 	__HAL_AUX_ENTRY("reserved_6", (unsigned long long)
362 			hw.reserved_6, "%llu");
363 	__HAL_AUX_ENTRY("rmac_ttl_512_1023_frms", (unsigned long long)
364 			hw.rmac_ttl_512_1023_frms, "%llu");
365 	__HAL_AUX_ENTRY("rmac_ttl_1024_1518_frms", (unsigned long long)
366 			hw.rmac_ttl_1024_1518_frms, "%llu");
367 	__HAL_AUX_ENTRY("rmac_ip", hw.rmac_ip, "%u");
368 	__HAL_AUX_ENTRY("reserved_7", hw.reserved_7, "%u");
369 	__HAL_AUX_ENTRY("rmac_ip_octets", (unsigned long long)
370 			hw.rmac_ip_octets, "%llu");
371 	__HAL_AUX_ENTRY("rmac_drop_ip", hw.rmac_drop_ip, "%u");
372 	__HAL_AUX_ENTRY("rmac_hdr_err_ip", hw.rmac_hdr_err_ip, "%u");
373 	__HAL_AUX_ENTRY("reserved_8", hw.reserved_8, "%u");
374 	__HAL_AUX_ENTRY("rmac_icmp", hw.rmac_icmp, "%u");
375 	__HAL_AUX_ENTRY("rmac_tcp", (unsigned long long)
376 			hw.rmac_tcp, "%llu");
377 	__HAL_AUX_ENTRY("rmac_err_drp_udp", hw.rmac_err_drp_udp, "%u");
378 	__HAL_AUX_ENTRY("rmac_udp", hw.rmac_udp, "%u");
379 	__HAL_AUX_ENTRY("rmac_xgmii_err_sym", (unsigned long long)
380 			hw.rmac_xgmii_err_sym, "%llu");
381 	__HAL_AUX_ENTRY("rmac_frms_q0", (unsigned long long)
382 			hw.rmac_frms_q0, "%llu");
383 	__HAL_AUX_ENTRY("rmac_frms_q1", (unsigned long long)
384 			hw.rmac_frms_q1, "%llu");
385 	__HAL_AUX_ENTRY("rmac_frms_q2", (unsigned long long)
386 			hw.rmac_frms_q2, "%llu");
387 	__HAL_AUX_ENTRY("rmac_frms_q3", (unsigned long long)
388 			hw.rmac_frms_q3, "%llu");
389 	__HAL_AUX_ENTRY("rmac_frms_q4", (unsigned long long)
390 			hw.rmac_frms_q4, "%llu");
391 	__HAL_AUX_ENTRY("rmac_frms_q5", (unsigned long long)
392 			hw.rmac_frms_q5, "%llu");
393 	__HAL_AUX_ENTRY("rmac_frms_q6", (unsigned long long)
394 			hw.rmac_frms_q6, "%llu");
395 	__HAL_AUX_ENTRY("rmac_frms_q7", (unsigned long long)
396 			hw.rmac_frms_q7, "%llu");
397 	__HAL_AUX_ENTRY("rmac_full_q3", hw.rmac_full_q3, "%d");
398 	__HAL_AUX_ENTRY("rmac_full_q2", hw.rmac_full_q2, "%d");
399 	__HAL_AUX_ENTRY("rmac_full_q1", hw.rmac_full_q1, "%d");
400 	__HAL_AUX_ENTRY("rmac_full_q0", hw.rmac_full_q0, "%d");
401 	__HAL_AUX_ENTRY("rmac_full_q7", hw.rmac_full_q7, "%d");
402 	__HAL_AUX_ENTRY("rmac_full_q6", hw.rmac_full_q6, "%d");
403 	__HAL_AUX_ENTRY("rmac_full_q5", hw.rmac_full_q5, "%d");
404 	__HAL_AUX_ENTRY("rmac_full_q4", hw.rmac_full_q4, "%d");
405 	__HAL_AUX_ENTRY("reserved_9", hw.reserved_9, "%u");
406 	__HAL_AUX_ENTRY("rmac_pause_cnt", hw.rmac_pause_cnt, "%u");
407 	__HAL_AUX_ENTRY("rmac_xgmii_data_err_cnt", (unsigned long long)
408 			hw.rmac_xgmii_data_err_cnt, "%llu");
409 	__HAL_AUX_ENTRY("rmac_xgmii_ctrl_err_cnt", (unsigned long long)
410 			hw.rmac_xgmii_ctrl_err_cnt, "%llu");
411 	__HAL_AUX_ENTRY("rmac_err_tcp", hw.rmac_err_tcp, "%u");
412 	__HAL_AUX_ENTRY("rmac_accepted_ip", hw.rmac_accepted_ip, "%u");
413 
414 	__HAL_AUX_ENTRY_END(bufsize, retsize);
415 
416 	return XGE_HAL_OK;
417 }
418 
419 /**
420  * xge_hal_aux_stats_herc_enchanced - Get Hercules hardware statistics.
421  * @devh: HAL device handle.
422  * @bufsize: Buffer size.
423  * @retbuf: Buffer pointer.
424  * @retsize: Size of the result. Cannot be greater than @bufsize.
425  *
426  * Read Hercules device hardware statistics.
427  *
428  * Returns: XGE_HAL_OK - success.
429  * XGE_HAL_ERR_INVALID_DEVICE - Device is not valid.
430  * XGE_HAL_ERR_VERSION_CONFLICT - Version it not maching.
431  *
432  * See also: xge_hal_mgmt_hw_stats{}, xge_hal_stats_hw_info_t{},
433  * xge_hal_aux_stats_tmac_read(), xge_hal_aux_stats_rmac_read(),
434  * xge_hal_aux_device_dump().
435 */
436 xge_hal_status_e xge_hal_aux_stats_herc_enchanced(xge_hal_device_h devh,
437 				  int bufsize, char *retbuf, int *retsize)
438 {
439 	xge_hal_status_e status;
440 	xge_hal_mgmt_hw_stats_t hw;
441 	__HAL_AUX_ENTRY_DECLARE(bufsize, retbuf);
442 
443 	status = xge_hal_mgmt_hw_stats(devh, &hw,
444 				     sizeof(xge_hal_mgmt_hw_stats_t));
445 	if (status != XGE_HAL_OK) {
446 		return status;
447 	}
448 	__HAL_AUX_ENTRY("tmac_frms_oflow", hw.tmac_frms_oflow, "%u");
449 	__HAL_AUX_ENTRY("tmac_data_octets_oflow", hw.tmac_data_octets_oflow,
450 			"%u");
451 	__HAL_AUX_ENTRY("tmac_mcst_frms_oflow", hw.tmac_mcst_frms_oflow, "%u");
452 	__HAL_AUX_ENTRY("tmac_bcst_frms_oflow", hw.tmac_bcst_frms_oflow, "%u");
453 	__HAL_AUX_ENTRY("tmac_ttl_octets_oflow", hw.tmac_ttl_octets_oflow,
454 			"%u");
455 	__HAL_AUX_ENTRY("tmac_ucst_frms_oflow", hw.tmac_ucst_frms_oflow, "%u");
456 	__HAL_AUX_ENTRY("tmac_nucst_frms_oflow", hw.tmac_nucst_frms_oflow,
457 			"%u");
458 	__HAL_AUX_ENTRY("tmac_any_err_frms_oflow", hw.tmac_any_err_frms_oflow,
459 			"%u");
460 	__HAL_AUX_ENTRY("tmac_vlan_frms", (unsigned long long)hw.tmac_vlan_frms,
461 			"%llu");
462 	__HAL_AUX_ENTRY("tmac_vld_ip_oflow", hw.tmac_vld_ip_oflow, "%u");
463 	__HAL_AUX_ENTRY("tmac_drop_ip_oflow", hw.tmac_drop_ip_oflow, "%u");
464 	__HAL_AUX_ENTRY("tmac_icmp_oflow", hw.tmac_icmp_oflow, "%u");
465 	__HAL_AUX_ENTRY("tmac_rst_tcp_oflow", hw.tmac_rst_tcp_oflow, "%u");
466 	__HAL_AUX_ENTRY("tmac_udp_oflow", hw.tmac_udp_oflow, "%u");
467 	__HAL_AUX_ENTRY("tpa_unknown_protocol", hw.tpa_unknown_protocol, "%u");
468 	__HAL_AUX_ENTRY("tpa_parse_failure", hw.tpa_parse_failure, "%u");
469 	__HAL_AUX_ENTRY("rmac_vld_frms_oflow", hw.rmac_vld_frms_oflow, "%u");
470 	__HAL_AUX_ENTRY("rmac_data_octets_oflow", hw.rmac_data_octets_oflow,
471 			"%u");
472 	__HAL_AUX_ENTRY("rmac_vld_mcst_frms_oflow", hw.rmac_vld_mcst_frms_oflow,
473 			"%u");
474 	__HAL_AUX_ENTRY("rmac_vld_bcst_frms_oflow", hw.rmac_vld_bcst_frms_oflow,
475 			"%u");
476 	__HAL_AUX_ENTRY("rmac_ttl_octets_oflow", hw.rmac_ttl_octets_oflow,
477 			"%u");
478 	__HAL_AUX_ENTRY("rmac_accepted_ucst_frms_oflow",
479 			hw.rmac_accepted_ucst_frms_oflow, "%u");
480 	__HAL_AUX_ENTRY("rmac_accepted_nucst_frms_oflow",
481 			hw.rmac_accepted_nucst_frms_oflow, "%u");
482 	__HAL_AUX_ENTRY("rmac_discarded_frms_oflow",
483 			hw.rmac_discarded_frms_oflow, "%u");
484 	__HAL_AUX_ENTRY("rmac_drop_events_oflow", hw.rmac_drop_events_oflow,
485 			"%u");
486 	__HAL_AUX_ENTRY("rmac_usized_frms_oflow", hw.rmac_usized_frms_oflow,
487 			"%u");
488 	__HAL_AUX_ENTRY("rmac_osized_frms_oflow", hw.rmac_osized_frms_oflow,
489 			"%u");
490 	__HAL_AUX_ENTRY("rmac_frag_frms_oflow", hw.rmac_frag_frms_oflow, "%u");
491 	__HAL_AUX_ENTRY("rmac_jabber_frms_oflow", hw.rmac_jabber_frms_oflow,
492 			"%u");
493 	__HAL_AUX_ENTRY("rmac_ip_oflow", hw.rmac_ip_oflow, "%u");
494 	__HAL_AUX_ENTRY("rmac_drop_ip_oflow", hw.rmac_drop_ip_oflow, "%u");
495 	__HAL_AUX_ENTRY("rmac_icmp_oflow", hw.rmac_icmp_oflow, "%u");
496 	__HAL_AUX_ENTRY("rmac_udp_oflow", hw.rmac_udp_oflow, "%u");
497 	__HAL_AUX_ENTRY("rmac_err_drp_udp_oflow", hw.rmac_err_drp_udp_oflow,
498 			"%u");
499 	__HAL_AUX_ENTRY("rmac_pause_cnt_oflow", hw.rmac_pause_cnt_oflow, "%u");
500 	__HAL_AUX_ENTRY("rmac_ttl_1519_4095_frms",
501 			(unsigned long long)hw.rmac_ttl_1519_4095_frms, "%llu");
502 	__HAL_AUX_ENTRY("rmac_ttl_4096_8191_frms",
503 			(unsigned long long)hw.rmac_ttl_4096_8191_frms, "%llu");
504 	__HAL_AUX_ENTRY("rmac_ttl_8192_max_frms",
505 			(unsigned long long)hw.rmac_ttl_8192_max_frms, "%llu");
506 	__HAL_AUX_ENTRY("rmac_ttl_gt_max_frms",
507 			(unsigned long long)hw.rmac_ttl_gt_max_frms, "%llu");
508 	__HAL_AUX_ENTRY("rmac_osized_alt_frms",
509 			(unsigned long long)hw.rmac_osized_alt_frms, "%llu");
510 	__HAL_AUX_ENTRY("rmac_jabber_alt_frms",
511 			(unsigned long long)hw.rmac_jabber_alt_frms, "%llu");
512 	__HAL_AUX_ENTRY("rmac_gt_max_alt_frms",
513 			(unsigned long long)hw.rmac_gt_max_alt_frms, "%llu");
514 	__HAL_AUX_ENTRY("rmac_vlan_frms",
515 			(unsigned long long)hw.rmac_vlan_frms, "%llu");
516 	__HAL_AUX_ENTRY("rmac_fcs_discard", hw.rmac_fcs_discard, "%u");
517 	__HAL_AUX_ENTRY("rmac_len_discard", hw.rmac_len_discard, "%u");
518 	__HAL_AUX_ENTRY("rmac_da_discard", hw.rmac_da_discard, "%u");
519 	__HAL_AUX_ENTRY("rmac_pf_discard", hw.rmac_pf_discard, "%u");
520 	__HAL_AUX_ENTRY("rmac_rts_discard", hw.rmac_rts_discard, "%u");
521 	__HAL_AUX_ENTRY("rmac_red_discard", hw.rmac_red_discard, "%u");
522 	__HAL_AUX_ENTRY("rmac_ingm_full_discard", hw.rmac_ingm_full_discard,
523 			"%u");
524 	__HAL_AUX_ENTRY("rmac_accepted_ip_oflow", hw.rmac_accepted_ip_oflow,
525 			"%u");
526 	__HAL_AUX_ENTRY("link_fault_cnt", hw.link_fault_cnt, "%u");
527 
528 	__HAL_AUX_ENTRY_END(bufsize, retsize);
529 
530 	return XGE_HAL_OK;
531 }
532 
533 /**
534  * xge_hal_aux_stats_rmac_read - Read PCI hardware statistics.
535  * @devh: HAL device handle.
536  * @bufsize: Buffer size.
537  * @retbuf: Buffer pointer.
538  * @retsize: Size of the result. Cannot be greater than @bufsize.
539  *
540  * Read PCI statistics counters, including number of PCI read and
541  * write transactions, PCI retries, discards, etc.
542  * This is a subset of stats counters from xge_hal_stats_hw_info_t{}.
543  *
544  * Returns: XGE_HAL_OK - success.
545  * XGE_HAL_ERR_INVALID_DEVICE - Device is not valid.
546  * XGE_HAL_ERR_VERSION_CONFLICT - Version it not maching.
547  *
548  * See also: xge_hal_mgmt_hw_stats{}, xge_hal_stats_hw_info_t{},
549  * xge_hal_aux_stats_tmac_read(), xge_hal_aux_stats_rmac_read(),
550  * xge_hal_aux_device_dump().
551  */
552 xge_hal_status_e xge_hal_aux_stats_pci_read(xge_hal_device_h devh, int bufsize,
553 				char *retbuf, int *retsize)
554 {
555 	xge_hal_status_e status;
556 	xge_hal_mgmt_hw_stats_t hw;
557 	__HAL_AUX_ENTRY_DECLARE(bufsize, retbuf);
558 
559 	status = xge_hal_mgmt_hw_stats(devh, &hw,
560 				     sizeof(xge_hal_mgmt_hw_stats_t));
561 	if (status != XGE_HAL_OK) {
562 		return status;
563 	}
564 
565 	__HAL_AUX_ENTRY("new_rd_req_cnt", hw.new_rd_req_cnt, "%u");
566 	__HAL_AUX_ENTRY("rd_req_cnt", hw.rd_req_cnt, "%u");
567 	__HAL_AUX_ENTRY("rd_rtry_cnt", hw.rd_rtry_cnt, "%u");
568 	__HAL_AUX_ENTRY("new_rd_req_rtry_cnt", hw.new_rd_req_rtry_cnt, "%u");
569 	__HAL_AUX_ENTRY("wr_req_cnt", hw.wr_req_cnt, "%u");
570 	__HAL_AUX_ENTRY("wr_rtry_rd_ack_cnt", hw.wr_rtry_rd_ack_cnt, "%u");
571 	__HAL_AUX_ENTRY("new_wr_req_rtry_cnt", hw.new_wr_req_rtry_cnt, "%u");
572 	__HAL_AUX_ENTRY("new_wr_req_cnt", hw.new_wr_req_cnt, "%u");
573 	__HAL_AUX_ENTRY("wr_disc_cnt", hw.wr_disc_cnt, "%u");
574 	__HAL_AUX_ENTRY("wr_rtry_cnt", hw.wr_rtry_cnt, "%u");
575 	__HAL_AUX_ENTRY("txp_wr_cnt", hw.txp_wr_cnt, "%u");
576 	__HAL_AUX_ENTRY("rd_rtry_wr_ack_cnt", hw.rd_rtry_wr_ack_cnt, "%u");
577 	__HAL_AUX_ENTRY("txd_wr_cnt", hw.txd_wr_cnt, "%u");
578 	__HAL_AUX_ENTRY("txd_rd_cnt", hw.txd_rd_cnt, "%u");
579 	__HAL_AUX_ENTRY("rxd_wr_cnt", hw.rxd_wr_cnt, "%u");
580 	__HAL_AUX_ENTRY("rxd_rd_cnt", hw.rxd_rd_cnt, "%u");
581 	__HAL_AUX_ENTRY("rxf_wr_cnt", hw.rxf_wr_cnt, "%u");
582 	__HAL_AUX_ENTRY("txf_rd_cnt", hw.txf_rd_cnt, "%u");
583 
584 	__HAL_AUX_ENTRY_END(bufsize, retsize);
585 
586 	return XGE_HAL_OK;
587 }
588 
589 /**
590  * xge_hal_aux_stats_hal_read - Read HAL (layer) statistics.
591  * @devh: HAL device handle.
592  * @bufsize: Buffer size.
593  * @retbuf: Buffer pointer.
594  * @retsize: Size of the result. Cannot be greater than @bufsize.
595  *
596  * Read HAL statistics.
597  *
598  * Returns: XGE_HAL_OK - success.
599  * XGE_HAL_ERR_INVALID_DEVICE - Device is not valid.
600  * XGE_HAL_ERR_VERSION_CONFLICT - Version it not maching.
601  * XGE_HAL_INF_STATS_IS_NOT_READY - Statistics information is not
602  * currently available.
603  *
604  * See also: xge_hal_aux_device_dump().
605  */
606 xge_hal_status_e xge_hal_aux_stats_hal_read(xge_hal_device_h devh,
607 			int bufsize, char *retbuf, int *retsize)
608 {
609 	xge_list_t *item;
610 	xge_hal_channel_t *channel;
611 	xge_hal_device_t *hldev = (xge_hal_device_t*)devh;
612 	xge_hal_status_e status;
613 	xge_hal_mgmt_device_stats_t devstat;
614 	xge_hal_mgmt_channel_stats_t chstat;
615 	__HAL_AUX_ENTRY_DECLARE(bufsize, retbuf);
616 
617 	status = xge_hal_mgmt_device_stats(hldev, &devstat,
618 				     sizeof(xge_hal_mgmt_device_stats_t));
619 	if (status != XGE_HAL_OK) {
620 		return status;
621 	}
622 
623 	if (!hldev->config.bimodal_interrupts) {
624 		__HAL_AUX_ENTRY("rx_traffic_intr_cnt",
625 				devstat.rx_traffic_intr_cnt, "%u");
626 	}
627 	__HAL_AUX_ENTRY("tx_traffic_intr_cnt", devstat.tx_traffic_intr_cnt, "%u");
628 	__HAL_AUX_ENTRY("txpic_intr_cnt", devstat.txpic_intr_cnt, "%u");
629 	__HAL_AUX_ENTRY("txdma_intr_cnt", devstat.txdma_intr_cnt, "%u");
630 	__HAL_AUX_ENTRY("txmac_intr_cnt", devstat.txmac_intr_cnt, "%u");
631 	__HAL_AUX_ENTRY("txxgxs_intr_cnt", devstat.txxgxs_intr_cnt, "%u");
632 	__HAL_AUX_ENTRY("rxpic_intr_cnt", devstat.rxpic_intr_cnt, "%u");
633 	__HAL_AUX_ENTRY("rxdma_intr_cnt", devstat.rxdma_intr_cnt, "%u");
634 	__HAL_AUX_ENTRY("rxmac_intr_cnt", devstat.rxmac_intr_cnt, "%u");
635 	__HAL_AUX_ENTRY("rxxgxs_intr_cnt", devstat.rxxgxs_intr_cnt, "%u");
636 	__HAL_AUX_ENTRY("mc_intr_cnt", devstat.mc_intr_cnt, "%u");
637 	__HAL_AUX_ENTRY("not_traffic_intr_cnt",
638 			devstat.not_traffic_intr_cnt, "%u");
639 	__HAL_AUX_ENTRY("traffic_intr_cnt", devstat.traffic_intr_cnt, "%u");
640 	__HAL_AUX_ENTRY("total_intr_cnt", devstat.total_intr_cnt, "%u");
641 	__HAL_AUX_ENTRY("soft_reset_cnt", devstat.soft_reset_cnt, "%u");
642 
643 	if (hldev->config.rxufca_hi_lim != hldev->config.rxufca_lo_lim &&
644 	    hldev->config.rxufca_lo_lim != 0) {
645 		__HAL_AUX_ENTRY("rxufca_lo_adjust_cnt",
646 				devstat.rxufca_lo_adjust_cnt, "%u");
647 		__HAL_AUX_ENTRY("rxufca_hi_adjust_cnt",
648 				devstat.rxufca_hi_adjust_cnt, "%u");
649 	}
650 
651 	if (hldev->config.bimodal_interrupts) {
652 		__HAL_AUX_ENTRY("bimodal_lo_adjust_cnt",
653 				devstat.bimodal_lo_adjust_cnt, "%u");
654 		__HAL_AUX_ENTRY("bimodal_hi_adjust_cnt",
655 				devstat.bimodal_hi_adjust_cnt, "%u");
656 	}
657 
658 #if defined(XGE_HAL_CONFIG_LRO)
659 	__HAL_AUX_ENTRY("tot_frms_lroised",
660 			devstat.tot_frms_lroised, "%u");
661 	__HAL_AUX_ENTRY("tot_lro_sessions",
662 			devstat.tot_lro_sessions, "%u");
663 	__HAL_AUX_ENTRY("lro_frm_len_exceed_cnt",
664 			devstat.lro_frm_len_exceed_cnt, "%u");
665 	__HAL_AUX_ENTRY("lro_sg_exceed_cnt",
666 			devstat.lro_sg_exceed_cnt, "%u");
667 	__HAL_AUX_ENTRY("lro_out_of_seq_pkt_cnt",
668 			devstat.lro_out_of_seq_pkt_cnt, "%u");
669 	__HAL_AUX_ENTRY("lro_dup_pkt_cnt",
670 			devstat.lro_dup_pkt_cnt, "%u");
671 #endif
672 
673 	/* for each opened rx channel */
674 	xge_list_for_each(item, &hldev->ring_channels) {
675 		char key[XGE_OS_SPRINTF_STRLEN];
676 		channel = xge_container_of(item, xge_hal_channel_t, item);
677 
678 		status = xge_hal_mgmt_channel_stats(channel, &chstat,
679 				     sizeof(xge_hal_mgmt_channel_stats_t));
680 		if (status != XGE_HAL_OK) {
681 			return status;
682 		}
683 
684 		(void) xge_os_sprintf(key, "ring%d_", channel->post_qid);
685 
686 		xge_os_strcpy(key+6, "full_cnt");
687 		__HAL_AUX_ENTRY(key, chstat.full_cnt, "%u");
688 		xge_os_strcpy(key+6, "usage_max");
689 		__HAL_AUX_ENTRY(key, chstat.usage_max, "%u");
690 		xge_os_strcpy(key+6, "usage_cnt");
691 		__HAL_AUX_ENTRY(key, channel->usage_cnt, "%u");
692 		xge_os_strcpy(key+6, "reserve_free_swaps_cnt");
693 		__HAL_AUX_ENTRY(key, chstat.reserve_free_swaps_cnt, "%u");
694 		if (!hldev->config.bimodal_interrupts) {
695 			xge_os_strcpy(key+6, "avg_compl_per_intr_cnt");
696 			__HAL_AUX_ENTRY(key, chstat.avg_compl_per_intr_cnt, "%u");
697 		}
698 		xge_os_strcpy(key+6, "total_compl_cnt");
699 		__HAL_AUX_ENTRY(key, chstat.total_compl_cnt, "%u");
700 		xge_os_strcpy(key+6, "bump_cnt");
701 		__HAL_AUX_ENTRY(key, chstat.ring_bump_cnt, "%u");
702 	}
703 
704 	/* for each opened tx channel */
705 	xge_list_for_each(item, &hldev->fifo_channels) {
706 		char key[XGE_OS_SPRINTF_STRLEN];
707 		channel = xge_container_of(item, xge_hal_channel_t, item);
708 
709 		status = xge_hal_mgmt_channel_stats(channel, &chstat,
710 				     sizeof(xge_hal_mgmt_channel_stats_t));
711 		if (status != XGE_HAL_OK) {
712 			return status;
713 		}
714 
715 		(void) xge_os_sprintf(key, "fifo%d_", channel->post_qid);
716 
717 		xge_os_strcpy(key+6, "full_cnt");
718 		__HAL_AUX_ENTRY(key, chstat.full_cnt, "%u");
719 		xge_os_strcpy(key+6, "usage_max");
720 		__HAL_AUX_ENTRY(key, chstat.usage_max, "%u");
721 		xge_os_strcpy(key+6, "usage_cnt");
722 		__HAL_AUX_ENTRY(key, channel->usage_cnt, "%u");
723 		xge_os_strcpy(key+6, "reserve_free_swaps_cnt");
724 		__HAL_AUX_ENTRY(key, chstat.reserve_free_swaps_cnt, "%u");
725 		xge_os_strcpy(key+6, "avg_compl_per_intr_cnt");
726 		__HAL_AUX_ENTRY(key, chstat.avg_compl_per_intr_cnt, "%u");
727 		xge_os_strcpy(key+6, "total_compl_cnt");
728 		__HAL_AUX_ENTRY(key, chstat.total_compl_cnt, "%u");
729 		xge_os_strcpy(key+6, "total_posts");
730 		__HAL_AUX_ENTRY(key, chstat.total_posts, "%u");
731 		xge_os_strcpy(key+6, "total_posts_many");
732 		__HAL_AUX_ENTRY(key, chstat.total_posts_many, "%u");
733 		xge_os_strcpy(key+6, "copied_frags");
734 		__HAL_AUX_ENTRY(key, chstat.copied_frags, "%u");
735 		xge_os_strcpy(key+6, "copied_buffers");
736 		__HAL_AUX_ENTRY(key, chstat.copied_buffers, "%u");
737 		xge_os_strcpy(key+6, "total_buffers");
738 		__HAL_AUX_ENTRY(key, chstat.total_buffers, "%u");
739 		xge_os_strcpy(key+6, "avg_buffers_per_post");
740 		__HAL_AUX_ENTRY(key, chstat.avg_buffers_per_post, "%u");
741 		xge_os_strcpy(key+6, "avg_buffer_size");
742 		__HAL_AUX_ENTRY(key, chstat.avg_buffer_size, "%u");
743 		xge_os_strcpy(key+6, "avg_post_size");
744 		__HAL_AUX_ENTRY(key, chstat.avg_post_size, "%u");
745 		xge_os_strcpy(key+6, "total_posts_dtrs_many");
746 		__HAL_AUX_ENTRY(key, chstat.total_posts_dtrs_many, "%u");
747 		xge_os_strcpy(key+6, "total_posts_frags_many");
748 		__HAL_AUX_ENTRY(key, chstat.total_posts_frags_many, "%u");
749 		xge_os_strcpy(key+6, "total_posts_dang_dtrs");
750 		__HAL_AUX_ENTRY(key, chstat.total_posts_dang_dtrs, "%u");
751 		xge_os_strcpy(key+6, "total_posts_dang_frags");
752 		__HAL_AUX_ENTRY(key, chstat.total_posts_dang_frags, "%u");
753 	}
754 
755 	__HAL_AUX_ENTRY_END(bufsize, retsize);
756 
757 	return XGE_HAL_OK;
758 }
759 
760 
761 
762 /**
763  * xge_hal_aux_stats_sw_dev_read - Read software device statistics.
764  * @devh: HAL device handle.
765  * @bufsize: Buffer size.
766  * @retbuf: Buffer pointer.
767  * @retsize: Size of the result. Cannot be greater than @bufsize.
768  *
769  * Read software-maintained device statistics.
770  *
771  * Returns: XGE_HAL_OK - success.
772  * XGE_HAL_ERR_INVALID_DEVICE - Device is not valid.
773  * XGE_HAL_ERR_VERSION_CONFLICT - Version it not maching.
774  * XGE_HAL_INF_STATS_IS_NOT_READY - Statistics information is not
775  * currently available.
776  *
777  * See also: xge_hal_aux_device_dump().
778  */
779 xge_hal_status_e xge_hal_aux_stats_sw_dev_read(xge_hal_device_h devh,
780 				int bufsize, char *retbuf, int *retsize)
781 {
782 	xge_hal_device_t *hldev = (xge_hal_device_t*)devh;
783 	xge_hal_status_e status;
784 	xge_hal_mgmt_sw_stats_t sw_dev_err_stats;
785 	int t_code;
786 	char buf[XGE_OS_SPRINTF_STRLEN];
787 
788 	__HAL_AUX_ENTRY_DECLARE(bufsize, retbuf);
789 
790 	status = xge_hal_mgmt_sw_stats(hldev, &sw_dev_err_stats,
791 				     sizeof(xge_hal_mgmt_sw_stats_t));
792 	if (status != XGE_HAL_OK) {
793 		return status;
794 	}
795 
796 	__HAL_AUX_ENTRY("sm_err_cnt",sw_dev_err_stats.sm_err_cnt, "%u");
797 	__HAL_AUX_ENTRY("single_ecc_err_cnt",sw_dev_err_stats.single_ecc_err_cnt, "%u");
798 	__HAL_AUX_ENTRY("double_ecc_err_cnt",sw_dev_err_stats.double_ecc_err_cnt, "%u");
799 	__HAL_AUX_ENTRY("ecc_err_cnt", sw_dev_err_stats.ecc_err_cnt, "%u");
800 	__HAL_AUX_ENTRY("parity_err_cnt",sw_dev_err_stats.parity_err_cnt, "%u");
801 	__HAL_AUX_ENTRY("serr_cnt",sw_dev_err_stats.serr_cnt, "%u");
802 
803 	for (t_code = 1; t_code < 16; t_code++) {
804 	        int t_code_cnt = sw_dev_err_stats.rxd_t_code_err_cnt[t_code];
805 	        if (t_code_cnt)  {
806 			(void) xge_os_sprintf(buf, "rxd_t_code_%d", t_code);
807 			__HAL_AUX_ENTRY(buf, t_code_cnt, "%u");
808 	        }
809 	        t_code_cnt = sw_dev_err_stats.txd_t_code_err_cnt[t_code];
810 		if (t_code_cnt)	{
811 			(void) xge_os_sprintf(buf, "txd_t_code_%d", t_code);
812 			__HAL_AUX_ENTRY(buf, t_code_cnt, "%u");
813 		}
814 	}
815 	__HAL_AUX_ENTRY("alarm_transceiver_temp_high",sw_dev_err_stats.
816 			stats_xpak.alarm_transceiver_temp_high, "%u");
817 	__HAL_AUX_ENTRY("alarm_transceiver_temp_low",sw_dev_err_stats.
818 			stats_xpak.alarm_transceiver_temp_low, "%u");
819 	__HAL_AUX_ENTRY("alarm_laser_bias_current_high",sw_dev_err_stats.
820 			stats_xpak.alarm_laser_bias_current_high, "%u");
821 	__HAL_AUX_ENTRY("alarm_laser_bias_current_low",sw_dev_err_stats.
822 			stats_xpak.alarm_laser_bias_current_low, "%u");
823 	__HAL_AUX_ENTRY("alarm_laser_output_power_high",sw_dev_err_stats.
824 			stats_xpak.alarm_laser_output_power_high, "%u");
825 	__HAL_AUX_ENTRY("alarm_laser_output_power_low",sw_dev_err_stats.
826 			stats_xpak.alarm_laser_output_power_low, "%u");
827 	__HAL_AUX_ENTRY("warn_transceiver_temp_high",sw_dev_err_stats.
828 			stats_xpak.warn_transceiver_temp_high, "%u");
829 	__HAL_AUX_ENTRY("warn_transceiver_temp_low",sw_dev_err_stats.
830 			stats_xpak.warn_transceiver_temp_low, "%u");
831 	__HAL_AUX_ENTRY("warn_laser_bias_current_high",sw_dev_err_stats.
832 			stats_xpak.warn_laser_bias_current_high, "%u");
833 	__HAL_AUX_ENTRY("warn_laser_bias_current_low",sw_dev_err_stats.
834 			stats_xpak.warn_laser_bias_current_low, "%u");
835 	__HAL_AUX_ENTRY("warn_laser_output_power_high",sw_dev_err_stats.
836 			stats_xpak.warn_laser_output_power_high, "%u");
837 	__HAL_AUX_ENTRY("warn_laser_output_power_low",sw_dev_err_stats.
838 			stats_xpak.warn_laser_output_power_low, "%u");
839 
840 	__HAL_AUX_ENTRY_END(bufsize, retsize);
841 
842 	return XGE_HAL_OK;
843 }
844 
845 /**
846  * xge_hal_aux_pci_config_read - Retrieve and format PCI Configuration
847  * info.
848  * @devh: HAL device handle.
849  * @bufsize: Buffer size.
850  * @retbuf: Buffer pointer.
851  * @retsize: Size of the result. Cannot be greater than @bufsize.
852  *
853  * Retrieve about info (using xge_hal_mgmt_pci_config()) and sprintf it
854  * into the provided @retbuf.
855  *
856  * Returns: XGE_HAL_OK - success.
857  * XGE_HAL_ERR_INVALID_DEVICE - Device is not valid.
858  * XGE_HAL_ERR_VERSION_CONFLICT - Version it not maching.
859  *
860  * See also: xge_hal_mgmt_pci_config(), xge_hal_aux_device_dump().
861  */
862 xge_hal_status_e xge_hal_aux_pci_config_read(xge_hal_device_h devh, int	bufsize,
863 				char *retbuf, int *retsize)
864 {
865 	xge_hal_status_e status;
866 	xge_hal_mgmt_pci_config_t pci_config;
867 	__HAL_AUX_ENTRY_DECLARE(bufsize, retbuf);
868 
869 	status = xge_hal_mgmt_pci_config(devh, &pci_config,
870 				  sizeof(xge_hal_mgmt_pci_config_t));
871 	if (status != XGE_HAL_OK) {
872 		return status;
873 	}
874 
875 	__HAL_AUX_ENTRY("vendor_id", pci_config.vendor_id, "0x%04X");
876 	__HAL_AUX_ENTRY("device_id", pci_config.device_id, "0x%04X");
877 	__HAL_AUX_ENTRY("command", pci_config.command, "0x%04X");
878 	__HAL_AUX_ENTRY("status", pci_config.status, "0x%04X");
879 	__HAL_AUX_ENTRY("revision", pci_config.revision, "0x%02X");
880 	__HAL_AUX_ENTRY("pciClass1", pci_config.pciClass[0], "0x%02X");
881 	__HAL_AUX_ENTRY("pciClass2", pci_config.pciClass[1], "0x%02X");
882 	__HAL_AUX_ENTRY("pciClass3", pci_config.pciClass[2], "0x%02X");
883 	__HAL_AUX_ENTRY("cache_line_size",
884 			pci_config.cache_line_size, "0x%02X");
885 	__HAL_AUX_ENTRY("latency_timer", pci_config.latency_timer, "0x%02X");
886 	__HAL_AUX_ENTRY("header_type", pci_config.header_type, "0x%02X");
887 	__HAL_AUX_ENTRY("bist", pci_config.bist, "0x%02X");
888 	__HAL_AUX_ENTRY("base_addr0_lo", pci_config.base_addr0_lo, "0x%08X");
889 	__HAL_AUX_ENTRY("base_addr0_hi", pci_config.base_addr0_hi, "0x%08X");
890 	__HAL_AUX_ENTRY("base_addr1_lo", pci_config.base_addr1_lo, "0x%08X");
891 	__HAL_AUX_ENTRY("base_addr1_hi", pci_config.base_addr1_hi, "0x%08X");
892 	__HAL_AUX_ENTRY("not_Implemented1",
893 			pci_config.not_Implemented1, "0x%08X");
894 	__HAL_AUX_ENTRY("not_Implemented2", pci_config.not_Implemented2,
895 			"0x%08X");
896 	__HAL_AUX_ENTRY("cardbus_cis_pointer", pci_config.cardbus_cis_pointer,
897 			"0x%08X");
898 	__HAL_AUX_ENTRY("subsystem_vendor_id", pci_config.subsystem_vendor_id,
899 			"0x%04X");
900 	__HAL_AUX_ENTRY("subsystem_id", pci_config.subsystem_id, "0x%04X");
901 	__HAL_AUX_ENTRY("rom_base", pci_config.rom_base, "0x%08X");
902 	__HAL_AUX_ENTRY("capabilities_pointer",
903 			pci_config.capabilities_pointer, "0x%02X");
904 	__HAL_AUX_ENTRY("interrupt_line", pci_config.interrupt_line, "0x%02X");
905 	__HAL_AUX_ENTRY("interrupt_pin", pci_config.interrupt_pin, "0x%02X");
906 	__HAL_AUX_ENTRY("min_grant", pci_config.min_grant, "0x%02X");
907 	__HAL_AUX_ENTRY("max_latency", pci_config.max_latency, "0x%02X");
908 	__HAL_AUX_ENTRY("msi_cap_id", pci_config.msi_cap_id, "0x%02X");
909 	__HAL_AUX_ENTRY("msi_next_ptr", pci_config.msi_next_ptr, "0x%02X");
910 	__HAL_AUX_ENTRY("msi_control", pci_config.msi_control, "0x%04X");
911 	__HAL_AUX_ENTRY("msi_lower_address", pci_config.msi_lower_address,
912 			"0x%08X");
913 	__HAL_AUX_ENTRY("msi_higher_address", pci_config.msi_higher_address,
914 			"0x%08X");
915 	__HAL_AUX_ENTRY("msi_data", pci_config.msi_data, "0x%04X");
916 	__HAL_AUX_ENTRY("msi_unused", pci_config.msi_unused, "0x%04X");
917 	__HAL_AUX_ENTRY("vpd_cap_id", pci_config.vpd_cap_id, "0x%02X");
918 	__HAL_AUX_ENTRY("vpd_next_cap", pci_config.vpd_next_cap, "0x%02X");
919 	__HAL_AUX_ENTRY("vpd_addr", pci_config.vpd_addr, "0x%04X");
920 	__HAL_AUX_ENTRY("vpd_data", pci_config.vpd_data, "0x%08X");
921 	__HAL_AUX_ENTRY("pcix_cap", pci_config.pcix_cap, "0x%02X");
922 	__HAL_AUX_ENTRY("pcix_next_cap", pci_config.pcix_next_cap, "0x%02X");
923 	__HAL_AUX_ENTRY("pcix_command", pci_config.pcix_command, "0x%04X");
924 	__HAL_AUX_ENTRY("pcix_status", pci_config.pcix_status, "0x%08X");
925 
926 	if (xge_hal_device_check_id(devh) == XGE_HAL_CARD_HERC) {
927 		char key[XGE_OS_SPRINTF_STRLEN];
928 		int i;
929 
930 		for (i = 0;
931 		     i < (XGE_HAL_PCI_XFRAME_CONFIG_SPACE_SIZE - 0x68)/4;
932 		     i++) {
933 			(void) xge_os_sprintf(key, "%03x:", 4*i + 0x68);
934 			__HAL_AUX_ENTRY(key, *((int *)pci_config.rsvd_b1 + i),
935 					"0x%08X");
936 		}
937 	}
938 
939 	__HAL_AUX_ENTRY_END(bufsize, retsize);
940 
941 	return XGE_HAL_OK;
942 }
943 
944 
945 /**
946  * xge_hal_aux_channel_read - Read channels information.
947  * @devh: HAL device handle.
948  * @bufsize: Buffer size.
949  * @retbuf: Buffer pointer.
950  * @retsize: Size of the result. Cannot be greater than @bufsize.
951  *
952  * Read HAL statistics.
953  *
954  * Returns: XGE_HAL_OK - success.
955  * XGE_HAL_ERR_INVALID_DEVICE - Device is not valid.
956  * XGE_HAL_ERR_OUT_OF_SPACE - Buffer size is very small.
957  * See also: xge_hal_aux_device_dump().
958  */
959 xge_hal_status_e xge_hal_aux_channel_read(xge_hal_device_h devh,
960 				int bufsize, char *retbuf, int *retsize)
961 {
962 	xge_list_t *item;
963 	xge_hal_channel_t *channel;
964 	xge_hal_device_t *hldev = (xge_hal_device_t*)devh;
965 	__HAL_AUX_ENTRY_DECLARE(bufsize, retbuf);
966 
967 	if (hldev->magic != XGE_HAL_MAGIC) {
968                 return XGE_HAL_ERR_INVALID_DEVICE;
969         }
970 
971 	/* for each opened rx channel */
972 	xge_list_for_each(item, &hldev->ring_channels) {
973 		char key[XGE_OS_SPRINTF_STRLEN];
974 		channel = xge_container_of(item, xge_hal_channel_t, item);
975 
976 		if (channel->is_open != 1)
977 			continue;
978 
979 		(void) xge_os_sprintf(key, "ring%d_", channel->post_qid);
980 		xge_os_strcpy(key+6, "type");
981 		__HAL_AUX_ENTRY(key, channel->type, "%u");
982 		xge_os_strcpy(key+6, "length");
983 		__HAL_AUX_ENTRY(key, channel->length, "%u");
984 		xge_os_strcpy(key+6, "is_open");
985 		__HAL_AUX_ENTRY(key, channel->is_open, "%u");
986 		xge_os_strcpy(key+6, "reserve_initial");
987 		__HAL_AUX_ENTRY(key, channel->reserve_initial, "%u");
988 		xge_os_strcpy(key+6, "reserve_max");
989 		__HAL_AUX_ENTRY(key, channel->reserve_max, "%u");
990 		xge_os_strcpy(key+6, "reserve_length");
991 		__HAL_AUX_ENTRY(key, channel->reserve_length, "%u");
992 		xge_os_strcpy(key+6, "reserve_top");
993 		__HAL_AUX_ENTRY(key, channel->reserve_top, "%u");
994 		xge_os_strcpy(key+6, "reserve_threshold");
995 		__HAL_AUX_ENTRY(key, channel->reserve_threshold, "%u");
996 		xge_os_strcpy(key+6, "free_length");
997 		__HAL_AUX_ENTRY(key, channel->free_length, "%u");
998 		xge_os_strcpy(key+6, "post_index");
999 		__HAL_AUX_ENTRY(key, channel->post_index, "%u");
1000 		xge_os_strcpy(key+6, "compl_index");
1001 		__HAL_AUX_ENTRY(key, channel->compl_index, "%u");
1002 		xge_os_strcpy(key+6, "per_dtr_space");
1003 		__HAL_AUX_ENTRY(key, channel->per_dtr_space, "%u");
1004 		xge_os_strcpy(key+6, "usage_cnt");
1005 		__HAL_AUX_ENTRY(key, channel->usage_cnt, "%u");
1006 	}
1007 
1008 	/* for each opened tx channel */
1009 	xge_list_for_each(item, &hldev->fifo_channels) {
1010 		char key[XGE_OS_SPRINTF_STRLEN];
1011 		channel = xge_container_of(item, xge_hal_channel_t, item);
1012 
1013 		if (channel->is_open != 1)
1014 			continue;
1015 
1016 		(void) xge_os_sprintf(key, "fifo%d_", channel->post_qid);
1017 		xge_os_strcpy(key+6, "type");
1018 		__HAL_AUX_ENTRY(key, channel->type, "%u");
1019 		xge_os_strcpy(key+6, "length");
1020 		__HAL_AUX_ENTRY(key, channel->length, "%u");
1021 		xge_os_strcpy(key+6, "is_open");
1022 		__HAL_AUX_ENTRY(key, channel->is_open, "%u");
1023 		xge_os_strcpy(key+6, "reserve_initial");
1024 		__HAL_AUX_ENTRY(key, channel->reserve_initial, "%u");
1025 		xge_os_strcpy(key+6, "reserve_max");
1026 		__HAL_AUX_ENTRY(key, channel->reserve_max, "%u");
1027 		xge_os_strcpy(key+6, "reserve_length");
1028 		__HAL_AUX_ENTRY(key, channel->reserve_length, "%u");
1029 		xge_os_strcpy(key+6, "reserve_top");
1030 		__HAL_AUX_ENTRY(key, channel->reserve_top, "%u");
1031 		xge_os_strcpy(key+6, "reserve_threshold");
1032 		__HAL_AUX_ENTRY(key, channel->reserve_threshold, "%u");
1033 		xge_os_strcpy(key+6, "free_length");
1034 		__HAL_AUX_ENTRY(key, channel->free_length, "%u");
1035 		xge_os_strcpy(key+6, "post_index");
1036 		__HAL_AUX_ENTRY(key, channel->post_index, "%u");
1037 		xge_os_strcpy(key+6, "compl_index");
1038 		__HAL_AUX_ENTRY(key, channel->compl_index, "%u");
1039 		xge_os_strcpy(key+6, "per_dtr_space");
1040 		__HAL_AUX_ENTRY(key, channel->per_dtr_space, "%u");
1041 		xge_os_strcpy(key+6, "usage_cnt");
1042 		__HAL_AUX_ENTRY(key, channel->usage_cnt, "%u");
1043 	}
1044 
1045 	__HAL_AUX_ENTRY_END(bufsize, retsize);
1046 
1047 	return XGE_HAL_OK;
1048 }
1049 
1050 /**
1051  * xge_hal_aux_device_dump - Dump driver "about" info and device state.
1052  * @devh: HAL device handle.
1053  *
1054  * Dump driver & device "about" info and device state,
1055  * including all BAR0 registers, hardware and software statistics, PCI
1056  * configuration space.
1057  * See also: xge_hal_aux_about_read(), xge_hal_mgmt_reg_read(),
1058  * xge_hal_aux_pci_config_read(), xge_hal_aux_stats_sw_dev_read(),
1059  * xge_hal_aux_stats_tmac_read(), xge_hal_aux_stats_rmac_read(),
1060  * xge_hal_aux_channel_read(), xge_hal_aux_stats_hal_read().
1061  * Returns:
1062  * XGE_HAL_ERR_INVALID_DEVICE - Device is not valid.
1063  * XGE_HAL_ERR_OUT_OF_SPACE - Buffer size is very small.
1064  */
1065 xge_hal_status_e
1066 xge_hal_aux_device_dump(xge_hal_device_h devh)
1067 {
1068 	xge_hal_device_t *hldev = (xge_hal_device_t*)devh;
1069 	xge_hal_status_e status;
1070 	int retsize;
1071 	int offset;
1072 	u64 retval;
1073 
1074 	xge_assert(hldev->dump_buf != NULL);
1075 
1076 	xge_os_println("********* xge DEVICE DUMP BEGIN **********");
1077 
1078 	status = xge_hal_aux_about_read(hldev, XGE_HAL_DUMP_BUF_SIZE,
1079 	                                hldev->dump_buf,
1080 	                                &retsize);
1081 	if (status != XGE_HAL_OK) {
1082 		goto error;
1083 	}
1084 	xge_os_println(hldev->dump_buf);
1085 
1086 
1087 	for (offset = 0; offset < 1574; offset++) {
1088 
1089 		status = xge_hal_mgmt_reg_read(hldev, 0, offset*8, &retval);
1090 		if (status != XGE_HAL_OK) {
1091 			goto error;
1092 		}
1093 
1094 		if (!retval) continue;
1095 
1096 		xge_os_printf("0x%04x 0x%08x%08x", offset*8,
1097 					(u32)(retval>>32), (u32)retval);
1098 	}
1099 	xge_os_println("\n");
1100 
1101 	status = xge_hal_aux_pci_config_read(hldev, XGE_HAL_DUMP_BUF_SIZE,
1102 	                                     hldev->dump_buf,
1103 	                                     &retsize);
1104 	if (status != XGE_HAL_OK) {
1105 		goto error;
1106 	}
1107 	xge_os_println(hldev->dump_buf);
1108 
1109 	status = xge_hal_aux_stats_tmac_read(hldev, XGE_HAL_DUMP_BUF_SIZE,
1110 	                                     hldev->dump_buf,
1111 	                                     &retsize);
1112 	if (status != XGE_HAL_OK) {
1113 		goto error;
1114 	}
1115 	xge_os_println(hldev->dump_buf);
1116 
1117 	status = xge_hal_aux_stats_rmac_read(hldev, XGE_HAL_DUMP_BUF_SIZE,
1118 	                                     hldev->dump_buf,
1119 	                                     &retsize);
1120 	if (status != XGE_HAL_OK) {
1121 		goto error;
1122 	}
1123 	xge_os_println(hldev->dump_buf);
1124 
1125 	status = xge_hal_aux_stats_pci_read(hldev, XGE_HAL_DUMP_BUF_SIZE,
1126 	                                    hldev->dump_buf,
1127 	                                    &retsize);
1128 	if (status != XGE_HAL_OK) {
1129 		goto error;
1130 	}
1131 	xge_os_println(hldev->dump_buf);
1132 
1133 	if (xge_hal_device_check_id(hldev) == XGE_HAL_CARD_HERC) {
1134 		status = xge_hal_aux_stats_herc_enchanced(hldev,
1135 			     XGE_HAL_DUMP_BUF_SIZE, hldev->dump_buf, &retsize);
1136 		if (status != XGE_HAL_OK) {
1137 			goto error;
1138 		}
1139 		xge_os_println(hldev->dump_buf);
1140 	}
1141 
1142 	status = xge_hal_aux_stats_sw_dev_read(hldev, XGE_HAL_DUMP_BUF_SIZE,
1143 					     hldev->dump_buf, &retsize);
1144 	if (status != XGE_HAL_OK) {
1145 		goto error;
1146 	}
1147 	xge_os_println(hldev->dump_buf);
1148 
1149 	status = xge_hal_aux_channel_read(hldev, XGE_HAL_DUMP_BUF_SIZE,
1150 	                                  hldev->dump_buf,
1151 	                                  &retsize);
1152 	if (status != XGE_HAL_OK) {
1153 		goto error;
1154 	}
1155 	xge_os_println(hldev->dump_buf);
1156 
1157 	status = xge_hal_aux_stats_hal_read(hldev, XGE_HAL_DUMP_BUF_SIZE,
1158 	                                    hldev->dump_buf,
1159 	                                    &retsize);
1160 	if (status != XGE_HAL_OK) {
1161 		goto error;
1162 	}
1163 	xge_os_println(hldev->dump_buf);
1164 
1165 	xge_os_println("********* XFRAME DEVICE DUMP END **********");
1166 
1167 error:
1168 	return status;
1169 }
1170 
1171 
1172 /**
1173  * xge_hal_aux_driver_config_read - Read Driver configuration.
1174  * @bufsize: Buffer size.
1175  * @retbuf: Buffer pointer.
1176  * @retsize: Size of the result. Cannot be greater than @bufsize.
1177  *
1178  * Read driver configuration,
1179  *
1180  * Returns: XGE_HAL_OK - success.
1181  * XGE_HAL_ERR_VERSION_CONFLICT - Version it not maching.
1182  *
1183  * See also: xge_hal_aux_device_config_read().
1184  */
1185 xge_hal_status_e
1186 xge_hal_aux_driver_config_read(int bufsize, char *retbuf, int *retsize)
1187 {
1188 	xge_hal_status_e status;
1189 	xge_hal_driver_config_t  drv_config;
1190 	__HAL_AUX_ENTRY_DECLARE(bufsize, retbuf);
1191 
1192 	status = xge_hal_mgmt_driver_config(&drv_config,
1193 					  sizeof(xge_hal_driver_config_t));
1194 	if (status != XGE_HAL_OK) {
1195 		return status;
1196 	}
1197 
1198 	__HAL_AUX_ENTRY("queue size initial",
1199 			drv_config.queue_size_initial, "%u");
1200 	__HAL_AUX_ENTRY("queue size max", drv_config.queue_size_max, "%u");
1201 	__HAL_AUX_ENTRY_END(bufsize, retsize);
1202 
1203 	return XGE_HAL_OK;
1204 }
1205 
1206 
1207 /**
1208  * xge_hal_aux_device_config_read - Read device configuration.
1209  * @devh: HAL device handle.
1210  * @bufsize: Buffer size.
1211  * @retbuf: Buffer pointer.
1212  * @retsize: Size of the result. Cannot be greater than @bufsize.
1213  *
1214  * Read device configuration,
1215  *
1216  * Returns: XGE_HAL_OK - success.
1217  * XGE_HAL_ERR_INVALID_DEVICE - Device is not valid.
1218  * XGE_HAL_ERR_VERSION_CONFLICT - Version it not maching.
1219  *
1220  * See also: xge_hal_aux_driver_config_read().
1221  */
1222 xge_hal_status_e xge_hal_aux_device_config_read(xge_hal_device_h devh,
1223 				int bufsize, char *retbuf, int *retsize)
1224 {
1225 	int i;
1226 	xge_hal_status_e status;
1227 	xge_hal_device_config_t  dev_config;
1228 	char key[XGE_OS_SPRINTF_STRLEN];
1229 	__HAL_AUX_ENTRY_DECLARE(bufsize, retbuf);
1230 
1231 	status = xge_hal_mgmt_device_config(devh, &dev_config,
1232 					  sizeof(xge_hal_device_config_t));
1233 	if (status != XGE_HAL_OK) {
1234 		return status;
1235 	}
1236 
1237 	__HAL_AUX_ENTRY("mtu", dev_config.mtu, "%u");
1238 	__HAL_AUX_ENTRY("isr_polling_count", dev_config.isr_polling_cnt, "%u");
1239 	__HAL_AUX_ENTRY("latency_timer", dev_config.latency_timer, "%u");
1240 	__HAL_AUX_ENTRY("max_splits_trans",
1241 			dev_config.max_splits_trans, "%u");
1242 	__HAL_AUX_ENTRY("mmrb_count", dev_config.mmrb_count, "%d");
1243 	__HAL_AUX_ENTRY("shared_splits", dev_config.shared_splits, "%u");
1244 	__HAL_AUX_ENTRY("stats_refresh_time_sec",
1245 			dev_config.stats_refresh_time_sec, "%u");
1246 	__HAL_AUX_ENTRY("pci_freq_mherz", dev_config.pci_freq_mherz, "%u");
1247 	__HAL_AUX_ENTRY("intr_mode", dev_config.intr_mode, "%u");
1248 	__HAL_AUX_ENTRY("ring_memblock_size",
1249 			dev_config.ring.memblock_size,  "%u");
1250 
1251 	__HAL_AUX_ENTRY("sched_timer_us", dev_config.sched_timer_us, "%u");
1252 	__HAL_AUX_ENTRY("sched_timer_one_shot",
1253 			dev_config.sched_timer_one_shot,  "%u");
1254 	__HAL_AUX_ENTRY("rxufca_intr_thres", dev_config.rxufca_intr_thres,  "%u");
1255 	__HAL_AUX_ENTRY("rxufca_lo_lim", dev_config.rxufca_lo_lim,  "%u");
1256 	__HAL_AUX_ENTRY("rxufca_hi_lim", dev_config.rxufca_hi_lim,  "%u");
1257 	__HAL_AUX_ENTRY("rxufca_lbolt_period", dev_config.rxufca_lbolt_period,  "%u");
1258 
1259 	for(i = 0; i < XGE_HAL_MAX_RING_NUM;  i++)
1260 	{
1261 		xge_hal_ring_queue_t *ring = &dev_config.ring.queue[i];
1262 		xge_hal_rti_config_t *rti =  &ring->rti;
1263 
1264 		if (!ring->configured)
1265 			continue;
1266 
1267 		(void) xge_os_sprintf(key, "ring%d_", i);
1268 		xge_os_strcpy(key+6, "inital");
1269 		__HAL_AUX_ENTRY(key, ring->initial, "%u");
1270 		xge_os_strcpy(key+6, "max");
1271 		__HAL_AUX_ENTRY(key, ring->max, "%u");
1272 		xge_os_strcpy(key+6, "buffer_mode");
1273 		__HAL_AUX_ENTRY(key, ring->buffer_mode, "%u");
1274 		xge_os_strcpy(key+6, "dram_size_mb");
1275 		__HAL_AUX_ENTRY(key, ring->dram_size_mb, "%u");
1276 		xge_os_strcpy(key+6, "backoff_interval_us");
1277 		__HAL_AUX_ENTRY(key, ring->backoff_interval_us, "%u");
1278 		xge_os_strcpy(key+6, "max_frame_len");
1279 		__HAL_AUX_ENTRY(key, ring->max_frm_len, "%d");
1280 		xge_os_strcpy(key+6, "priority");
1281 		__HAL_AUX_ENTRY(key, ring->priority,  "%u");
1282 		xge_os_strcpy(key+6, "rth_en");
1283 		__HAL_AUX_ENTRY(key, ring->rth_en,  "%u");
1284 		xge_os_strcpy(key+6, "no_snoop_bits");
1285 		__HAL_AUX_ENTRY(key, ring->no_snoop_bits,  "%u");
1286 		xge_os_strcpy(key+6, "indicate_max_pkts");
1287 		__HAL_AUX_ENTRY(key, ring->indicate_max_pkts,  "%u");
1288 
1289 		xge_os_strcpy(key+6, "urange_a");
1290 		__HAL_AUX_ENTRY(key, rti->urange_a,  "%u");
1291 		xge_os_strcpy(key+6, "ufc_a");
1292 		__HAL_AUX_ENTRY(key, rti->ufc_a,  "%u");
1293 		xge_os_strcpy(key+6, "urange_b");
1294 		__HAL_AUX_ENTRY(key, rti->urange_b,  "%u");
1295 		xge_os_strcpy(key+6, "ufc_b");
1296 		__HAL_AUX_ENTRY(key, rti->ufc_b,  "%u");
1297 		xge_os_strcpy(key+6, "urange_c");
1298 		__HAL_AUX_ENTRY(key, rti->urange_c,  "%u");
1299 		xge_os_strcpy(key+6, "ufc_c");
1300 		__HAL_AUX_ENTRY(key, rti->ufc_c,  "%u");
1301 		xge_os_strcpy(key+6, "ufc_d");
1302 		__HAL_AUX_ENTRY(key, rti->ufc_d,  "%u");
1303 		xge_os_strcpy(key+6, "timer_val_us");
1304 		__HAL_AUX_ENTRY(key, rti->timer_val_us,  "%u");
1305 	}
1306 
1307 
1308 	{
1309 		xge_hal_mac_config_t *mac= &dev_config.mac;
1310 
1311 		__HAL_AUX_ENTRY("tmac_util_period",
1312 				mac->tmac_util_period, "%u");
1313 		__HAL_AUX_ENTRY("rmac_util_period",
1314 				mac->rmac_util_period, "%u");
1315 		__HAL_AUX_ENTRY("rmac_bcast_en",
1316 				mac->rmac_bcast_en, "%u");
1317 		__HAL_AUX_ENTRY("rmac_pause_gen_en",
1318 				mac->rmac_pause_gen_en, "%d");
1319 		__HAL_AUX_ENTRY("rmac_pause_rcv_en",
1320 				mac->rmac_pause_rcv_en, "%d");
1321 		__HAL_AUX_ENTRY("rmac_pause_time",
1322 				mac->rmac_pause_time, "%u");
1323 		__HAL_AUX_ENTRY("mc_pause_threshold_q0q3",
1324 				mac->mc_pause_threshold_q0q3, "%u");
1325 		__HAL_AUX_ENTRY("mc_pause_threshold_q4q7",
1326 				mac->mc_pause_threshold_q4q7, "%u");
1327 	}
1328 
1329 
1330 	__HAL_AUX_ENTRY("fifo_max_frags", dev_config.fifo.max_frags, "%u");
1331 	__HAL_AUX_ENTRY("fifo_reserve_threshold",
1332 			dev_config.fifo.reserve_threshold, "%u");
1333 	__HAL_AUX_ENTRY("fifo_memblock_size",
1334 			dev_config.fifo.memblock_size, "%u");
1335 #ifdef XGE_HAL_ALIGN_XMIT
1336 	__HAL_AUX_ENTRY("fifo_alignment_size",
1337 			dev_config.fifo.alignment_size, "%u");
1338 #endif
1339 
1340 	for (i = 0; i < XGE_HAL_MAX_FIFO_NUM;  i++) {
1341 		int j;
1342 		xge_hal_fifo_queue_t *fifo = &dev_config.fifo.queue[i];
1343 
1344 		if (!fifo->configured)
1345 			continue;
1346 
1347 		(void) xge_os_sprintf(key, "fifo%d_", i);
1348 		xge_os_strcpy(key+6, "initial");
1349 		__HAL_AUX_ENTRY(key, fifo->initial, "%u");
1350 		xge_os_strcpy(key+6, "max");
1351 		__HAL_AUX_ENTRY(key, fifo->max, "%u");
1352 		xge_os_strcpy(key+6, "intr");
1353 		__HAL_AUX_ENTRY(key, fifo->intr, "%u");
1354 		xge_os_strcpy(key+6, "no_snoop_bits");
1355 		__HAL_AUX_ENTRY(key, fifo->no_snoop_bits, "%u");
1356 
1357 		for (j = 0; j < XGE_HAL_MAX_FIFO_TTI_NUM; j++) {
1358 			xge_hal_tti_config_t *tti =
1359 				&dev_config.fifo.queue[i].tti[j];
1360 
1361 			if (!tti->enabled)
1362 				continue;
1363 
1364 			(void) xge_os_sprintf(key, "fifo%d_tti%02d_", i,
1365 				i * XGE_HAL_MAX_FIFO_TTI_NUM + j);
1366 			xge_os_strcpy(key+12, "urange_a");
1367 			__HAL_AUX_ENTRY(key, tti->urange_a, "%u");
1368 			xge_os_strcpy(key+12, "ufc_a");
1369 			__HAL_AUX_ENTRY(key, tti->ufc_a, "%u");
1370 			xge_os_strcpy(key+12, "urange_b");
1371 			__HAL_AUX_ENTRY(key, tti->urange_b, "%u");
1372 			xge_os_strcpy(key+12, "ufc_b");
1373 			__HAL_AUX_ENTRY(key, tti->ufc_b, "%u");
1374 			xge_os_strcpy(key+12, "urange_c");
1375 			__HAL_AUX_ENTRY(key, tti->urange_c, "%u");
1376 			xge_os_strcpy(key+12, "ufc_c");
1377 			__HAL_AUX_ENTRY(key, tti->ufc_c, "%u");
1378 			xge_os_strcpy(key+12, "ufc_d");
1379 			__HAL_AUX_ENTRY(key, tti->ufc_d, "%u");
1380 			xge_os_strcpy(key+12, "timer_val_us");
1381 			__HAL_AUX_ENTRY(key, tti->timer_val_us, "%u");
1382 			xge_os_strcpy(key+12, "timer_ci_en");
1383 			__HAL_AUX_ENTRY(key, tti->timer_ci_en, "%u");
1384 		}
1385 	}
1386 
1387 	/* and bimodal TTIs */
1388 	for (i=0; i<XGE_HAL_MAX_RING_NUM; i++) {
1389 		xge_hal_device_t *hldev = (xge_hal_device_t*)devh;
1390 		xge_hal_tti_config_t *tti = &hldev->bimodal_tti[i];
1391 
1392 		if (!tti->enabled)
1393 			continue;
1394 
1395 		(void) xge_os_sprintf(key, "tti%02d_",
1396 			      XGE_HAL_MAX_FIFO_TTI_RING_0 + i);
1397 
1398 		xge_os_strcpy(key+6, "urange_a");
1399 		__HAL_AUX_ENTRY(key, tti->urange_a, "%u");
1400 		xge_os_strcpy(key+6, "ufc_a");
1401 		__HAL_AUX_ENTRY(key, tti->ufc_a, "%u");
1402 		xge_os_strcpy(key+6, "urange_b");
1403 		__HAL_AUX_ENTRY(key, tti->urange_b, "%u");
1404 		xge_os_strcpy(key+6, "ufc_b");
1405 		__HAL_AUX_ENTRY(key, tti->ufc_b, "%u");
1406 		xge_os_strcpy(key+6, "urange_c");
1407 		__HAL_AUX_ENTRY(key, tti->urange_c, "%u");
1408 		xge_os_strcpy(key+6, "ufc_c");
1409 		__HAL_AUX_ENTRY(key, tti->ufc_c, "%u");
1410 		xge_os_strcpy(key+6, "ufc_d");
1411 		__HAL_AUX_ENTRY(key, tti->ufc_d, "%u");
1412 		xge_os_strcpy(key+6, "timer_val_us");
1413 		__HAL_AUX_ENTRY(key, tti->timer_val_us, "%u");
1414 		xge_os_strcpy(key+6, "timer_ac_en");
1415 		__HAL_AUX_ENTRY(key, tti->timer_ac_en, "%u");
1416 		xge_os_strcpy(key+6, "timer_ci_en");
1417 		__HAL_AUX_ENTRY(key, tti->timer_ci_en, "%u");
1418 	}
1419 	__HAL_AUX_ENTRY("dump_on_serr", dev_config.dump_on_serr, "%u");
1420 	__HAL_AUX_ENTRY("dump_on_eccerr",
1421 			dev_config.dump_on_eccerr, "%u");
1422 	__HAL_AUX_ENTRY("dump_on_parityerr",
1423 			dev_config.dump_on_parityerr, "%u");
1424 	__HAL_AUX_ENTRY("rth_en", dev_config.rth_en, "%u");
1425 	__HAL_AUX_ENTRY("rth_bucket_size", dev_config.rth_bucket_size, "%u");
1426 
1427 	__HAL_AUX_ENTRY_END(bufsize, retsize);
1428 
1429 	return XGE_HAL_OK;
1430 }
1431 
1432