1171095Ssam/*-
2171095Ssam * Copyright (c) 2002-2007 Neterion, Inc.
3171095Ssam * All rights reserved.
4171095Ssam *
5171095Ssam * Redistribution and use in source and binary forms, with or without
6171095Ssam * modification, are permitted provided that the following conditions
7171095Ssam * are met:
8171095Ssam * 1. Redistributions of source code must retain the above copyright
9171095Ssam *    notice, this list of conditions and the following disclaimer.
10171095Ssam * 2. Redistributions in binary form must reproduce the above copyright
11171095Ssam *    notice, this list of conditions and the following disclaimer in the
12171095Ssam *    documentation and/or other materials provided with the distribution.
13171095Ssam *
14171095Ssam * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
15171095Ssam * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16171095Ssam * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17171095Ssam * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
18171095Ssam * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19171095Ssam * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20171095Ssam * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21171095Ssam * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22171095Ssam * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23171095Ssam * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24171095Ssam * SUCH DAMAGE.
25171095Ssam *
26171095Ssam * $FreeBSD$
27171095Ssam */
28171095Ssam
29171095Ssam#include <dev/nxge/include/xgehal-mgmt.h>
30171095Ssam#include <dev/nxge/include/xgehal-driver.h>
31171095Ssam#include <dev/nxge/include/xgehal-device.h>
32171095Ssam
33171095Ssam#ifdef XGE_OS_HAS_SNPRINTF
34171095Ssam#define __hal_aux_snprintf(retbuf, bufsize, fmt, key, value, retsize) \
35173139Srwatson	if (bufsize <= 0) return XGE_HAL_ERR_OUT_OF_SPACE; \
36173139Srwatson	retsize = xge_os_snprintf(retbuf, bufsize, fmt, key, \
37173139Srwatson	        XGE_HAL_AUX_SEPA, value); \
38173139Srwatson	if (retsize < 0 || retsize >= bufsize) return XGE_HAL_ERR_OUT_OF_SPACE;
39171095Ssam#else
40171095Ssam#define __hal_aux_snprintf(retbuf, bufsize, fmt, key, value, retsize) \
41171095Ssam	if (bufsize <= 0) return XGE_HAL_ERR_OUT_OF_SPACE; \
42173139Srwatson	    retsize = xge_os_sprintf(retbuf, fmt, key, XGE_HAL_AUX_SEPA, value); \
43171095Ssam	xge_assert(retsize < bufsize); \
44171095Ssam	if (retsize < 0 || retsize >= bufsize) \
45173139Srwatson	    return XGE_HAL_ERR_OUT_OF_SPACE;
46171095Ssam#endif
47171095Ssam
48171095Ssam#define __HAL_AUX_ENTRY_DECLARE(size, buf) \
49171095Ssam	int entrysize = 0, leftsize = size; \
50171095Ssam	char *ptr = buf;
51171095Ssam
52171095Ssam#define __HAL_AUX_ENTRY(key, value, fmt) \
53171095Ssam	ptr += entrysize; leftsize -= entrysize; \
54171095Ssam	__hal_aux_snprintf(ptr, leftsize, "%s%c"fmt"\n", key, value, entrysize)
55171095Ssam
56171095Ssam#define __HAL_AUX_ENTRY_END(bufsize, retsize) \
57171095Ssam	leftsize -= entrysize; \
58171095Ssam	*retsize = bufsize - leftsize;
59171095Ssam
60173139Srwatson#define __hal_aux_pci_link_info(name, index, var) { \
61173139Srwatson	    __HAL_AUX_ENTRY(name,           \
62173139Srwatson	    (unsigned long long)pcim.link_info[index].var, "%llu") \
63171095Ssam	}
64171095Ssam
65173139Srwatson#define __hal_aux_pci_aggr_info(name, index, var) { \
66173139Srwatson	    __HAL_AUX_ENTRY(name,               \
67173139Srwatson	    (unsigned long long)pcim.aggr_info[index].var, "%llu") \
68171095Ssam	}
69171095Ssam
70171095Ssam/**
71171095Ssam * xge_hal_aux_bar0_read - Read and format Xframe BAR0 register.
72171095Ssam * @devh: HAL device handle.
73171095Ssam * @offset: Register offset in the BAR0 space.
74171095Ssam * @bufsize: Buffer size.
75171095Ssam * @retbuf: Buffer pointer.
76171095Ssam * @retsize: Size of the result. Cannot be greater than @bufsize.
77171095Ssam *
78171095Ssam * Read Xframe register from BAR0 space. The result is formatted as an ascii string.
79171095Ssam *
80171095Ssam * Returns: XGE_HAL_OK - success.
81171095Ssam * XGE_HAL_ERR_OUT_OF_SPACE - Buffer size is very small.
82171095Ssam * XGE_HAL_ERR_INVALID_DEVICE - Device is not valid.
83171095Ssam * XGE_HAL_ERR_INVALID_OFFSET - Register offset in the BAR space is not
84171095Ssam * valid.
85171095Ssam * XGE_HAL_ERR_INVALID_BAR_ID - BAR id is not valid.
86171095Ssam *
87171095Ssam * See also: xge_hal_mgmt_reg_read().
88171095Ssam */
89171095Ssamxge_hal_status_e xge_hal_aux_bar0_read(xge_hal_device_h devh,
90173139Srwatson	        unsigned int offset, int bufsize, char *retbuf,
91173139Srwatson	        int *retsize)
92171095Ssam{
93171095Ssam	xge_hal_status_e status;
94171095Ssam	u64 retval;
95171095Ssam
96171095Ssam	status = xge_hal_mgmt_reg_read(devh, 0, offset, &retval);
97171095Ssam	if (status != XGE_HAL_OK) {
98173139Srwatson	    return status;
99171095Ssam	}
100171095Ssam
101171095Ssam	if (bufsize < XGE_OS_SPRINTF_STRLEN) {
102173139Srwatson	    return XGE_HAL_ERR_OUT_OF_SPACE;
103171095Ssam	}
104171095Ssam
105171095Ssam	*retsize = xge_os_sprintf(retbuf, "0x%04X%c0x%08X%08X\n", offset,
106173139Srwatson	            XGE_HAL_AUX_SEPA, (u32)(retval>>32), (u32)retval);
107171095Ssam
108171095Ssam	return XGE_HAL_OK;
109171095Ssam}
110171095Ssam
111171095Ssam/**
112171095Ssam * xge_hal_aux_bar1_read - Read and format Xframe BAR1 register.
113171095Ssam * @devh: HAL device handle.
114171095Ssam * @offset: Register offset in the BAR1 space.
115171095Ssam * @bufsize: Buffer size.
116171095Ssam * @retbuf: Buffer pointer.
117171095Ssam * @retsize: Size of the result. Cannot be greater than @bufsize.
118171095Ssam *
119171095Ssam * Read Xframe register from BAR1 space. The result is formatted as ascii string.
120171095Ssam * Returns: XGE_HAL_OK - success.
121171095Ssam * XGE_HAL_ERR_OUT_OF_SPACE - Buffer size is very small.
122171095Ssam * XGE_HAL_ERR_INVALID_DEVICE - Device is not valid.
123171095Ssam * XGE_HAL_ERR_INVALID_OFFSET - Register offset in the BAR space is not
124171095Ssam * valid.
125171095Ssam * XGE_HAL_ERR_INVALID_BAR_ID - BAR id is not valid.
126171095Ssam *
127171095Ssam * See also: xge_hal_mgmt_reg_read().
128171095Ssam */
129171095Ssamxge_hal_status_e xge_hal_aux_bar1_read(xge_hal_device_h devh,
130173139Srwatson	        unsigned int offset, int bufsize, char *retbuf,
131173139Srwatson	        int *retsize)
132171095Ssam{
133171095Ssam	xge_hal_status_e status;
134171095Ssam	u64 retval;
135171095Ssam
136171095Ssam	status = xge_hal_mgmt_reg_read(devh, 1, offset, &retval);
137171095Ssam	if (status != XGE_HAL_OK) {
138173139Srwatson	    return status;
139171095Ssam	}
140171095Ssam
141171095Ssam	if (bufsize < XGE_OS_SPRINTF_STRLEN) {
142173139Srwatson	    return XGE_HAL_ERR_OUT_OF_SPACE;
143171095Ssam	}
144171095Ssam
145173139Srwatson	    *retsize = xge_os_sprintf(retbuf, "0x%04X%c0x%08X%08X\n",
146173139Srwatson	    offset,
147173139Srwatson	            XGE_HAL_AUX_SEPA, (u32)(retval>>32), (u32)retval);
148171095Ssam
149171095Ssam	return XGE_HAL_OK;
150171095Ssam}
151171095Ssam
152171095Ssam/**
153171095Ssam * xge_hal_aux_bar0_write - Write BAR0 register.
154171095Ssam * @devh: HAL device handle.
155171095Ssam * @offset: Register offset in the BAR0 space.
156171095Ssam * @value: Regsister value (to write).
157171095Ssam *
158171095Ssam * Write BAR0 register.
159171095Ssam *
160171095Ssam * Returns: XGE_HAL_OK - success.
161171095Ssam * XGE_HAL_ERR_INVALID_DEVICE - Device is not valid.
162171095Ssam * XGE_HAL_ERR_INVALID_OFFSET - Register offset in the BAR space is not
163171095Ssam * valid.
164171095Ssam * XGE_HAL_ERR_INVALID_BAR_ID - BAR id is not valid.
165171095Ssam *
166171095Ssam * See also: xge_hal_mgmt_reg_write().
167171095Ssam */
168171095Ssamxge_hal_status_e xge_hal_aux_bar0_write(xge_hal_device_h devh,
169173139Srwatson	        unsigned int offset, u64 value)
170171095Ssam{
171171095Ssam	xge_hal_status_e status;
172171095Ssam
173171095Ssam	status = xge_hal_mgmt_reg_write(devh, 0, offset, value);
174171095Ssam	if (status != XGE_HAL_OK) {
175173139Srwatson	    return status;
176171095Ssam	}
177171095Ssam
178171095Ssam	return XGE_HAL_OK;
179171095Ssam}
180171095Ssam
181171095Ssam/**
182171095Ssam * xge_hal_aux_about_read - Retrieve and format about info.
183171095Ssam * @devh: HAL device handle.
184171095Ssam * @bufsize: Buffer size.
185171095Ssam * @retbuf: Buffer pointer.
186171095Ssam * @retsize: Size of the result. Cannot be greater than @bufsize.
187171095Ssam *
188171095Ssam * Retrieve about info (using xge_hal_mgmt_about()) and sprintf it
189171095Ssam * into the provided @retbuf.
190171095Ssam *
191171095Ssam * Returns: XGE_HAL_OK - success.
192171095Ssam * XGE_HAL_ERR_INVALID_DEVICE - Device is not valid.
193171095Ssam * XGE_HAL_ERR_VERSION_CONFLICT - Version it not maching.
194171095Ssam * XGE_HAL_FAIL - Failed to retrieve the information.
195171095Ssam *
196171095Ssam * See also: xge_hal_mgmt_about(), xge_hal_aux_device_dump().
197171095Ssam */
198171095Ssamxge_hal_status_e xge_hal_aux_about_read(xge_hal_device_h devh, int bufsize,
199173139Srwatson	        char *retbuf, int *retsize)
200171095Ssam{
201171095Ssam	xge_hal_status_e status;
202171095Ssam	xge_hal_mgmt_about_info_t about_info;
203171095Ssam	__HAL_AUX_ENTRY_DECLARE(bufsize, retbuf);
204171095Ssam
205171095Ssam	status = xge_hal_mgmt_about(devh, &about_info,
206173139Srwatson	              sizeof(xge_hal_mgmt_about_info_t));
207171095Ssam	if (status != XGE_HAL_OK) {
208173139Srwatson	    return status;
209171095Ssam	}
210171095Ssam
211171095Ssam	__HAL_AUX_ENTRY("vendor", about_info.vendor, "0x%x");
212171095Ssam	__HAL_AUX_ENTRY("device", about_info.device, "0x%x");
213171095Ssam	__HAL_AUX_ENTRY("subsys_vendor", about_info.subsys_vendor, "0x%x");
214171095Ssam	__HAL_AUX_ENTRY("subsys_device", about_info.subsys_device, "0x%x");
215171095Ssam	__HAL_AUX_ENTRY("board_rev", about_info.board_rev, "0x%x");
216171095Ssam	__HAL_AUX_ENTRY("vendor_name", about_info.vendor_name, "%s");
217171095Ssam	__HAL_AUX_ENTRY("chip_name", about_info.chip_name, "%s");
218171095Ssam	__HAL_AUX_ENTRY("media", about_info.media, "%s");
219171095Ssam	__HAL_AUX_ENTRY("hal_major", about_info.hal_major, "%s");
220171095Ssam	__HAL_AUX_ENTRY("hal_minor", about_info.hal_minor, "%s");
221171095Ssam	__HAL_AUX_ENTRY("hal_fix", about_info.hal_fix, "%s");
222171095Ssam	__HAL_AUX_ENTRY("hal_build", about_info.hal_build, "%s");
223171095Ssam	__HAL_AUX_ENTRY("ll_major", about_info.ll_major, "%s");
224171095Ssam	__HAL_AUX_ENTRY("ll_minor", about_info.ll_minor, "%s");
225171095Ssam	__HAL_AUX_ENTRY("ll_fix", about_info.ll_fix, "%s");
226171095Ssam	__HAL_AUX_ENTRY("ll_build", about_info.ll_build, "%s");
227171095Ssam
228171095Ssam	__HAL_AUX_ENTRY("transponder_temperature",
229173139Srwatson	        about_info.transponder_temperature, "%d C");
230171095Ssam
231171095Ssam	__HAL_AUX_ENTRY_END(bufsize, retsize);
232171095Ssam
233171095Ssam	return XGE_HAL_OK;
234171095Ssam}
235171095Ssam
236171095Ssam/**
237171095Ssam * xge_hal_aux_stats_tmac_read - Read TMAC hardware statistics.
238171095Ssam * @devh: HAL device handle.
239171095Ssam * @bufsize: Buffer size.
240171095Ssam * @retbuf: Buffer pointer.
241171095Ssam * @retsize: Size of the result. Cannot be greater than @bufsize.
242171095Ssam *
243171095Ssam * Read TMAC hardware statistics. This is a subset of stats counters
244171095Ssam * from xge_hal_stats_hw_info_t{}.
245171095Ssam *
246171095Ssam * Returns: XGE_HAL_OK - success.
247171095Ssam * XGE_HAL_ERR_INVALID_DEVICE - Device is not valid.
248171095Ssam * XGE_HAL_ERR_VERSION_CONFLICT - Version it not maching.
249171095Ssam *
250171095Ssam * See also: xge_hal_mgmt_hw_stats{}, xge_hal_stats_hw_info_t{},
251171095Ssam * xge_hal_aux_stats_pci_read(),
252171095Ssam * xge_hal_aux_device_dump().
253171095Ssam */
254173139Srwatsonxge_hal_status_e xge_hal_aux_stats_tmac_read(xge_hal_device_h devh, int bufsize,
255173139Srwatson	            char *retbuf, int *retsize)
256171095Ssam{
257171095Ssam	xge_hal_status_e status;
258171095Ssam	xge_hal_device_t *hldev = (xge_hal_device_t*)devh;
259171095Ssam
260171095Ssam	__HAL_AUX_ENTRY_DECLARE(bufsize, retbuf);
261171095Ssam
262171095Ssam	if (xge_hal_device_check_id(hldev) != XGE_HAL_CARD_TITAN) {
263173139Srwatson	    xge_hal_mgmt_hw_stats_t hw;
264171095Ssam
265173139Srwatson	    status = xge_hal_mgmt_hw_stats(devh, &hw,
266173139Srwatson	                 sizeof(xge_hal_mgmt_hw_stats_t));
267173139Srwatson	    if (status != XGE_HAL_OK) {
268173139Srwatson	        return status;
269173139Srwatson	    }
270171095Ssam
271173139Srwatson	    __HAL_AUX_ENTRY("tmac_data_octets", hw.tmac_data_octets, "%u");
272173139Srwatson	    __HAL_AUX_ENTRY("tmac_frms", hw.tmac_frms, "%u");
273173139Srwatson	    __HAL_AUX_ENTRY("tmac_drop_frms", (unsigned long long)
274173139Srwatson	            hw.tmac_drop_frms, "%llu");
275173139Srwatson	    __HAL_AUX_ENTRY("tmac_bcst_frms", hw.tmac_bcst_frms, "%u");
276173139Srwatson	    __HAL_AUX_ENTRY("tmac_mcst_frms", hw.tmac_mcst_frms, "%u");
277173139Srwatson	    __HAL_AUX_ENTRY("tmac_pause_ctrl_frms", (unsigned long long)
278173139Srwatson	        hw.tmac_pause_ctrl_frms, "%llu");
279173139Srwatson	    __HAL_AUX_ENTRY("tmac_ucst_frms", hw.tmac_ucst_frms, "%u");
280173139Srwatson	    __HAL_AUX_ENTRY("tmac_ttl_octets", hw.tmac_ttl_octets, "%u");
281173139Srwatson	    __HAL_AUX_ENTRY("tmac_any_err_frms", hw.tmac_any_err_frms, "%u");
282173139Srwatson	    __HAL_AUX_ENTRY("tmac_nucst_frms", hw.tmac_nucst_frms, "%u");
283173139Srwatson	    __HAL_AUX_ENTRY("tmac_ttl_less_fb_octets", (unsigned long long)
284173139Srwatson	        hw.tmac_ttl_less_fb_octets, "%llu");
285173139Srwatson	    __HAL_AUX_ENTRY("tmac_vld_ip_octets", (unsigned long long)
286173139Srwatson	        hw.tmac_vld_ip_octets, "%llu");
287173139Srwatson	    __HAL_AUX_ENTRY("tmac_drop_ip", hw.tmac_drop_ip, "%u");
288173139Srwatson	    __HAL_AUX_ENTRY("tmac_vld_ip", hw.tmac_vld_ip, "%u");
289173139Srwatson	    __HAL_AUX_ENTRY("tmac_rst_tcp", hw.tmac_rst_tcp, "%u");
290173139Srwatson	    __HAL_AUX_ENTRY("tmac_icmp", hw.tmac_icmp, "%u");
291173139Srwatson	    __HAL_AUX_ENTRY("tmac_tcp", (unsigned long long)
292173139Srwatson	        hw.tmac_tcp, "%llu");
293173139Srwatson	    __HAL_AUX_ENTRY("reserved_0", hw.reserved_0, "%u");
294173139Srwatson	    __HAL_AUX_ENTRY("tmac_udp", hw.tmac_udp, "%u");
295171095Ssam	} else {
296173139Srwatson	    int i;
297173139Srwatson	    xge_hal_mgmt_pcim_stats_t pcim;
298173139Srwatson	    status = xge_hal_mgmt_pcim_stats(devh, &pcim,
299173139Srwatson	                 sizeof(xge_hal_mgmt_pcim_stats_t));
300173139Srwatson	    if (status != XGE_HAL_OK) {
301173139Srwatson	        return status;
302173139Srwatson	    }
303171095Ssam
304173139Srwatson	    for (i = 0; i < XGE_HAL_MAC_LINKS; i++) {
305173139Srwatson	        __hal_aux_pci_link_info("tx_frms", i,
306173139Srwatson	            tx_frms);
307173139Srwatson	        __hal_aux_pci_link_info("tx_ttl_eth_octets",
308173139Srwatson	            i, tx_ttl_eth_octets );
309173139Srwatson	        __hal_aux_pci_link_info("tx_data_octets", i,
310173139Srwatson	            tx_data_octets);
311173139Srwatson	        __hal_aux_pci_link_info("tx_mcst_frms", i,
312173139Srwatson	            tx_mcst_frms);
313173139Srwatson	        __hal_aux_pci_link_info("tx_bcst_frms", i,
314173139Srwatson	            tx_bcst_frms);
315173139Srwatson	        __hal_aux_pci_link_info("tx_ucst_frms", i,
316173139Srwatson	            tx_ucst_frms);
317173139Srwatson	        __hal_aux_pci_link_info("tx_tagged_frms", i,
318173139Srwatson	            tx_tagged_frms);
319173139Srwatson	        __hal_aux_pci_link_info("tx_vld_ip", i,
320173139Srwatson	            tx_vld_ip);
321173139Srwatson	        __hal_aux_pci_link_info("tx_vld_ip_octets", i,
322173139Srwatson	            tx_vld_ip_octets);
323173139Srwatson	        __hal_aux_pci_link_info("tx_icmp", i,
324173139Srwatson	            tx_icmp);
325173139Srwatson	        __hal_aux_pci_link_info("tx_tcp", i,
326173139Srwatson	            tx_tcp);
327173139Srwatson	        __hal_aux_pci_link_info("tx_rst_tcp", i,
328173139Srwatson	            tx_rst_tcp);
329173139Srwatson	        __hal_aux_pci_link_info("tx_udp", i,
330173139Srwatson	            tx_udp);
331173139Srwatson	        __hal_aux_pci_link_info("tx_unknown_protocol", i,
332173139Srwatson	            tx_unknown_protocol);
333173139Srwatson	        __hal_aux_pci_link_info("tx_parse_error", i,
334173139Srwatson	            tx_parse_error);
335173139Srwatson	        __hal_aux_pci_link_info("tx_pause_ctrl_frms", i,
336173139Srwatson	            tx_pause_ctrl_frms);
337173139Srwatson	        __hal_aux_pci_link_info("tx_lacpdu_frms", i,
338173139Srwatson	            tx_lacpdu_frms);
339173139Srwatson	        __hal_aux_pci_link_info("tx_marker_pdu_frms", i,
340173139Srwatson	            tx_marker_pdu_frms);
341173139Srwatson	        __hal_aux_pci_link_info("tx_marker_resp_pdu_frms", i,
342173139Srwatson	            tx_marker_resp_pdu_frms);
343173139Srwatson	        __hal_aux_pci_link_info("tx_drop_ip", i,
344173139Srwatson	            tx_drop_ip);
345173139Srwatson	        __hal_aux_pci_link_info("tx_xgmii_char1_match", i,
346173139Srwatson	            tx_xgmii_char1_match);
347173139Srwatson	        __hal_aux_pci_link_info("tx_xgmii_char2_match", i,
348173139Srwatson	            tx_xgmii_char2_match);
349173139Srwatson	        __hal_aux_pci_link_info("tx_xgmii_column1_match", i,
350173139Srwatson	            tx_xgmii_column1_match);
351173139Srwatson	        __hal_aux_pci_link_info("tx_xgmii_column2_match", i,
352173139Srwatson	            tx_xgmii_column2_match);
353173139Srwatson	        __hal_aux_pci_link_info("tx_drop_frms", i,
354173139Srwatson	            tx_drop_frms);
355173139Srwatson	        __hal_aux_pci_link_info("tx_any_err_frms", i,
356173139Srwatson	            tx_any_err_frms);
357173139Srwatson	    }
358171095Ssam
359173139Srwatson	    for (i = 0; i < XGE_HAL_MAC_AGGREGATORS; i++) {
360173139Srwatson	        __hal_aux_pci_aggr_info("tx_frms", i, tx_frms);
361173139Srwatson	        __hal_aux_pci_aggr_info("tx_mcst_frms", i,
362173139Srwatson	            tx_mcst_frms);
363173139Srwatson	        __hal_aux_pci_aggr_info("tx_bcst_frms", i,
364173139Srwatson	            tx_bcst_frms);
365173139Srwatson	        __hal_aux_pci_aggr_info("tx_discarded_frms", i,
366173139Srwatson	            tx_discarded_frms);
367173139Srwatson	        __hal_aux_pci_aggr_info("tx_errored_frms", i,
368173139Srwatson	            tx_errored_frms);
369173139Srwatson	    }
370171095Ssam	}
371171095Ssam
372171095Ssam	__HAL_AUX_ENTRY_END(bufsize, retsize);
373171095Ssam
374171095Ssam	return XGE_HAL_OK;
375171095Ssam}
376171095Ssam
377171095Ssam/**
378171095Ssam * xge_hal_aux_stats_rmac_read - Read RMAC hardware statistics.
379171095Ssam * @devh: HAL device handle.
380171095Ssam * @bufsize: Buffer size.
381171095Ssam * @retbuf: Buffer pointer.
382171095Ssam * @retsize: Size of the result. Cannot be greater than @bufsize.
383171095Ssam *
384171095Ssam * Read RMAC hardware statistics. This is a subset of stats counters
385171095Ssam * from xge_hal_stats_hw_info_t{}.
386171095Ssam *
387171095Ssam * Returns: XGE_HAL_OK - success.
388171095Ssam * XGE_HAL_ERR_INVALID_DEVICE - Device is not valid.
389171095Ssam * XGE_HAL_ERR_VERSION_CONFLICT - Version it not maching.
390171095Ssam *
391171095Ssam * See also: xge_hal_mgmt_hw_stats{}, xge_hal_stats_hw_info_t{},
392171095Ssam * xge_hal_aux_stats_pci_read(), xge_hal_aux_stats_tmac_read(),
393171095Ssam * xge_hal_aux_device_dump().
394171095Ssam */
395173139Srwatsonxge_hal_status_e xge_hal_aux_stats_rmac_read(xge_hal_device_h devh, int bufsize,
396173139Srwatson	            char *retbuf, int *retsize)
397171095Ssam{
398171095Ssam	xge_hal_status_e status;
399171095Ssam	xge_hal_device_t *hldev = (xge_hal_device_t*)devh;
400171095Ssam
401171095Ssam	__HAL_AUX_ENTRY_DECLARE(bufsize, retbuf);
402171095Ssam
403171095Ssam	if (xge_hal_device_check_id(hldev) != XGE_HAL_CARD_TITAN) {
404173139Srwatson	    xge_hal_mgmt_hw_stats_t hw;
405171095Ssam
406173139Srwatson	    status = xge_hal_mgmt_hw_stats(devh, &hw,
407173139Srwatson	                 sizeof(xge_hal_mgmt_hw_stats_t));
408173139Srwatson	    if (status != XGE_HAL_OK) {
409173139Srwatson	        return status;
410173139Srwatson	    }
411171095Ssam
412173139Srwatson	    __HAL_AUX_ENTRY("rmac_data_octets", hw.rmac_data_octets, "%u");
413173139Srwatson	    __HAL_AUX_ENTRY("rmac_vld_frms", hw.rmac_vld_frms, "%u");
414173139Srwatson	    __HAL_AUX_ENTRY("rmac_fcs_err_frms", (unsigned long long)
415173139Srwatson	            hw.rmac_fcs_err_frms, "%llu");
416173139Srwatson	    __HAL_AUX_ENTRY("mac_drop_frms", (unsigned long long)
417173139Srwatson	            hw.rmac_drop_frms, "%llu");
418173139Srwatson	    __HAL_AUX_ENTRY("rmac_vld_bcst_frms", hw.rmac_vld_bcst_frms,
419173139Srwatson	            "%u");
420173139Srwatson	    __HAL_AUX_ENTRY("rmac_vld_mcst_frms", hw.rmac_vld_mcst_frms,
421173139Srwatson	            "%u");
422173139Srwatson	    __HAL_AUX_ENTRY("rmac_out_rng_len_err_frms",
423173139Srwatson	            hw.rmac_out_rng_len_err_frms, "%u");
424173139Srwatson	    __HAL_AUX_ENTRY("rmac_in_rng_len_err_frms",
425173139Srwatson	            hw.rmac_in_rng_len_err_frms, "%u");
426173139Srwatson	    __HAL_AUX_ENTRY("rmac_long_frms", (unsigned long long)
427173139Srwatson	            hw.rmac_long_frms, "%llu");
428173139Srwatson	    __HAL_AUX_ENTRY("rmac_pause_ctrl_frms", (unsigned long long)
429173139Srwatson	            hw.rmac_pause_ctrl_frms, "%llu");
430173139Srwatson	    __HAL_AUX_ENTRY("rmac_unsup_ctrl_frms", (unsigned long long)
431173139Srwatson	            hw.rmac_unsup_ctrl_frms, "%llu");
432173139Srwatson	    __HAL_AUX_ENTRY("rmac_accepted_ucst_frms",
433173139Srwatson	            hw.rmac_accepted_ucst_frms, "%u");
434173139Srwatson	    __HAL_AUX_ENTRY("rmac_ttl_octets", hw.rmac_ttl_octets, "%u");
435173139Srwatson	    __HAL_AUX_ENTRY("rmac_discarded_frms", hw.rmac_discarded_frms,
436173139Srwatson	        "%u");
437173139Srwatson	    __HAL_AUX_ENTRY("rmac_accepted_nucst_frms",
438173139Srwatson	            hw.rmac_accepted_nucst_frms, "%u");
439173139Srwatson	    __HAL_AUX_ENTRY("reserved_1", hw.reserved_1, "%u");
440173139Srwatson	    __HAL_AUX_ENTRY("rmac_drop_events", hw.rmac_drop_events, "%u");
441173139Srwatson	    __HAL_AUX_ENTRY("rmac_ttl_less_fb_octets", (unsigned long long)
442173139Srwatson	            hw.rmac_ttl_less_fb_octets, "%llu");
443173139Srwatson	    __HAL_AUX_ENTRY("rmac_ttl_frms", (unsigned long long)
444173139Srwatson	            hw.rmac_ttl_frms, "%llu");
445173139Srwatson	    __HAL_AUX_ENTRY("reserved_2", (unsigned long long)
446173139Srwatson	            hw.reserved_2, "%llu");
447173139Srwatson	    __HAL_AUX_ENTRY("rmac_usized_frms", hw.rmac_usized_frms, "%u");
448173139Srwatson	    __HAL_AUX_ENTRY("reserved_3", hw.reserved_3, "%u");
449173139Srwatson	    __HAL_AUX_ENTRY("rmac_frag_frms", hw.rmac_frag_frms, "%u");
450173139Srwatson	    __HAL_AUX_ENTRY("rmac_osized_frms", hw.rmac_osized_frms, "%u");
451173139Srwatson	    __HAL_AUX_ENTRY("reserved_4", hw.reserved_4, "%u");
452173139Srwatson	    __HAL_AUX_ENTRY("rmac_jabber_frms", hw.rmac_jabber_frms, "%u");
453173139Srwatson	    __HAL_AUX_ENTRY("rmac_ttl_64_frms", (unsigned long long)
454173139Srwatson	            hw.rmac_ttl_64_frms, "%llu");
455173139Srwatson	    __HAL_AUX_ENTRY("rmac_ttl_65_127_frms", (unsigned long long)
456173139Srwatson	            hw.rmac_ttl_65_127_frms, "%llu");
457173139Srwatson	    __HAL_AUX_ENTRY("reserved_5", (unsigned long long)
458173139Srwatson	            hw.reserved_5, "%llu");
459173139Srwatson	    __HAL_AUX_ENTRY("rmac_ttl_128_255_frms", (unsigned long long)
460173139Srwatson	            hw.rmac_ttl_128_255_frms, "%llu");
461173139Srwatson	    __HAL_AUX_ENTRY("rmac_ttl_256_511_frms", (unsigned long long)
462173139Srwatson	            hw.rmac_ttl_256_511_frms, "%llu");
463173139Srwatson	    __HAL_AUX_ENTRY("reserved_6", (unsigned long long)
464173139Srwatson	            hw.reserved_6, "%llu");
465173139Srwatson	    __HAL_AUX_ENTRY("rmac_ttl_512_1023_frms", (unsigned long long)
466173139Srwatson	            hw.rmac_ttl_512_1023_frms, "%llu");
467173139Srwatson	    __HAL_AUX_ENTRY("rmac_ttl_1024_1518_frms", (unsigned long long)
468173139Srwatson	            hw.rmac_ttl_1024_1518_frms, "%llu");
469173139Srwatson	    __HAL_AUX_ENTRY("rmac_ip", hw.rmac_ip, "%u");
470173139Srwatson	    __HAL_AUX_ENTRY("reserved_7", hw.reserved_7, "%u");
471173139Srwatson	    __HAL_AUX_ENTRY("rmac_ip_octets", (unsigned long long)
472173139Srwatson	            hw.rmac_ip_octets, "%llu");
473173139Srwatson	    __HAL_AUX_ENTRY("rmac_drop_ip", hw.rmac_drop_ip, "%u");
474173139Srwatson	    __HAL_AUX_ENTRY("rmac_hdr_err_ip", hw.rmac_hdr_err_ip, "%u");
475173139Srwatson	    __HAL_AUX_ENTRY("reserved_8", hw.reserved_8, "%u");
476173139Srwatson	    __HAL_AUX_ENTRY("rmac_icmp", hw.rmac_icmp, "%u");
477173139Srwatson	    __HAL_AUX_ENTRY("rmac_tcp", (unsigned long long)
478173139Srwatson	            hw.rmac_tcp, "%llu");
479173139Srwatson	    __HAL_AUX_ENTRY("rmac_err_drp_udp", hw.rmac_err_drp_udp, "%u");
480173139Srwatson	    __HAL_AUX_ENTRY("rmac_udp", hw.rmac_udp, "%u");
481173139Srwatson	    __HAL_AUX_ENTRY("rmac_xgmii_err_sym", (unsigned long long)
482173139Srwatson	            hw.rmac_xgmii_err_sym, "%llu");
483173139Srwatson	    __HAL_AUX_ENTRY("rmac_frms_q0", (unsigned long long)
484173139Srwatson	            hw.rmac_frms_q0, "%llu");
485173139Srwatson	    __HAL_AUX_ENTRY("rmac_frms_q1", (unsigned long long)
486173139Srwatson	            hw.rmac_frms_q1, "%llu");
487173139Srwatson	    __HAL_AUX_ENTRY("rmac_frms_q2", (unsigned long long)
488173139Srwatson	            hw.rmac_frms_q2, "%llu");
489173139Srwatson	    __HAL_AUX_ENTRY("rmac_frms_q3", (unsigned long long)
490173139Srwatson	            hw.rmac_frms_q3, "%llu");
491173139Srwatson	    __HAL_AUX_ENTRY("rmac_frms_q4", (unsigned long long)
492173139Srwatson	            hw.rmac_frms_q4, "%llu");
493173139Srwatson	    __HAL_AUX_ENTRY("rmac_frms_q5", (unsigned long long)
494173139Srwatson	            hw.rmac_frms_q5, "%llu");
495173139Srwatson	    __HAL_AUX_ENTRY("rmac_frms_q6", (unsigned long long)
496173139Srwatson	            hw.rmac_frms_q6, "%llu");
497173139Srwatson	    __HAL_AUX_ENTRY("rmac_frms_q7", (unsigned long long)
498173139Srwatson	            hw.rmac_frms_q7, "%llu");
499173139Srwatson	    __HAL_AUX_ENTRY("rmac_full_q3", hw.rmac_full_q3, "%d");
500173139Srwatson	    __HAL_AUX_ENTRY("rmac_full_q2", hw.rmac_full_q2, "%d");
501173139Srwatson	    __HAL_AUX_ENTRY("rmac_full_q1", hw.rmac_full_q1, "%d");
502173139Srwatson	    __HAL_AUX_ENTRY("rmac_full_q0", hw.rmac_full_q0, "%d");
503173139Srwatson	    __HAL_AUX_ENTRY("rmac_full_q7", hw.rmac_full_q7, "%d");
504173139Srwatson	    __HAL_AUX_ENTRY("rmac_full_q6", hw.rmac_full_q6, "%d");
505173139Srwatson	    __HAL_AUX_ENTRY("rmac_full_q5", hw.rmac_full_q5, "%d");
506173139Srwatson	    __HAL_AUX_ENTRY("rmac_full_q4", hw.rmac_full_q4, "%d");
507173139Srwatson	    __HAL_AUX_ENTRY("reserved_9", hw.reserved_9, "%u");
508173139Srwatson	    __HAL_AUX_ENTRY("rmac_pause_cnt", hw.rmac_pause_cnt, "%u");
509173139Srwatson	    __HAL_AUX_ENTRY("rmac_xgmii_data_err_cnt", (unsigned long long)
510173139Srwatson	            hw.rmac_xgmii_data_err_cnt, "%llu");
511173139Srwatson	    __HAL_AUX_ENTRY("rmac_xgmii_ctrl_err_cnt", (unsigned long long)
512173139Srwatson	            hw.rmac_xgmii_ctrl_err_cnt, "%llu");
513173139Srwatson	    __HAL_AUX_ENTRY("rmac_err_tcp", hw.rmac_err_tcp, "%u");
514173139Srwatson	    __HAL_AUX_ENTRY("rmac_accepted_ip", hw.rmac_accepted_ip, "%u");
515171095Ssam	} else {
516173139Srwatson	    int i;
517173139Srwatson	    xge_hal_mgmt_pcim_stats_t pcim;
518173139Srwatson	    status = xge_hal_mgmt_pcim_stats(devh, &pcim,
519173139Srwatson	                 sizeof(xge_hal_mgmt_pcim_stats_t));
520173139Srwatson	    if (status != XGE_HAL_OK) {
521173139Srwatson	        return status;
522173139Srwatson	    }
523173139Srwatson	    for (i = 0; i < XGE_HAL_MAC_LINKS; i++) {
524173139Srwatson	        __hal_aux_pci_link_info("rx_ttl_frms", i,
525173139Srwatson	            rx_ttl_frms);
526173139Srwatson	        __hal_aux_pci_link_info("rx_vld_frms", i,
527173139Srwatson	            rx_vld_frms);
528173139Srwatson	        __hal_aux_pci_link_info("rx_offld_frms", i,
529173139Srwatson	            rx_offld_frms);
530173139Srwatson	        __hal_aux_pci_link_info("rx_ttl_eth_octets", i,
531173139Srwatson	            rx_ttl_eth_octets);
532173139Srwatson	        __hal_aux_pci_link_info("rx_data_octets", i,
533173139Srwatson	            rx_data_octets);
534173139Srwatson	        __hal_aux_pci_link_info("rx_offld_octets", i,
535173139Srwatson	            rx_offld_octets);
536173139Srwatson	        __hal_aux_pci_link_info("rx_vld_mcst_frms", i,
537173139Srwatson	            rx_vld_mcst_frms);
538173139Srwatson	        __hal_aux_pci_link_info("rx_vld_bcst_frms", i,
539173139Srwatson	            rx_vld_bcst_frms);
540173139Srwatson	        __hal_aux_pci_link_info("rx_accepted_ucst_frms", i,
541173139Srwatson	            rx_accepted_ucst_frms);
542173139Srwatson	        __hal_aux_pci_link_info("rx_accepted_nucst_frms", i,
543173139Srwatson	            rx_accepted_nucst_frms);
544173139Srwatson	        __hal_aux_pci_link_info("rx_tagged_frms", i,
545173139Srwatson	            rx_tagged_frms);
546173139Srwatson	        __hal_aux_pci_link_info("rx_long_frms", i,
547173139Srwatson	            rx_long_frms);
548173139Srwatson	        __hal_aux_pci_link_info("rx_usized_frms", i,
549173139Srwatson	            rx_usized_frms);
550173139Srwatson	        __hal_aux_pci_link_info("rx_osized_frms", i,
551173139Srwatson	            rx_osized_frms);
552173139Srwatson	        __hal_aux_pci_link_info("rx_frag_frms", i,
553173139Srwatson	            rx_frag_frms);
554173139Srwatson	        __hal_aux_pci_link_info("rx_jabber_frms", i,
555173139Srwatson	            rx_jabber_frms);
556173139Srwatson	        __hal_aux_pci_link_info("rx_ttl_64_frms", i,
557173139Srwatson	            rx_ttl_64_frms);
558173139Srwatson	        __hal_aux_pci_link_info("rx_ttl_65_127_frms", i,
559173139Srwatson	            rx_ttl_65_127_frms);
560173139Srwatson	        __hal_aux_pci_link_info("rx_ttl_128_255_frms", i,
561173139Srwatson	            rx_ttl_128_255_frms);
562173139Srwatson	        __hal_aux_pci_link_info("rx_ttl_256_511_frms", i,
563173139Srwatson	            rx_ttl_256_511_frms);
564173139Srwatson	        __hal_aux_pci_link_info("rx_ttl_512_1023_frms", i,
565173139Srwatson	            rx_ttl_512_1023_frms);
566173139Srwatson	        __hal_aux_pci_link_info("rx_ttl_1024_1518_frms", i,
567173139Srwatson	            rx_ttl_1024_1518_frms);
568173139Srwatson	        __hal_aux_pci_link_info("rx_ttl_1519_4095_frms", i,
569173139Srwatson	            rx_ttl_1519_4095_frms);
570173139Srwatson	        __hal_aux_pci_link_info("rx_ttl_40956_8191_frms", i,
571173139Srwatson	            rx_ttl_40956_8191_frms);
572173139Srwatson	        __hal_aux_pci_link_info("rx_ttl_8192_max_frms", i,
573173139Srwatson	            rx_ttl_8192_max_frms);
574173139Srwatson	        __hal_aux_pci_link_info("rx_ttl_gt_max_frms", i,
575173139Srwatson	            rx_ttl_gt_max_frms);
576173139Srwatson	        __hal_aux_pci_link_info("rx_ip", i,
577173139Srwatson	            rx_ip);
578173139Srwatson	        __hal_aux_pci_link_info("rx_ip_octets", i,
579173139Srwatson	            rx_ip_octets);
580171095Ssam
581173139Srwatson	        __hal_aux_pci_link_info("rx_hdr_err_ip", i,
582173139Srwatson	            rx_hdr_err_ip);
583171095Ssam
584173139Srwatson	        __hal_aux_pci_link_info("rx_icmp", i,
585173139Srwatson	            rx_icmp);
586173139Srwatson	        __hal_aux_pci_link_info("rx_tcp", i,
587173139Srwatson	            rx_tcp);
588173139Srwatson	        __hal_aux_pci_link_info("rx_udp", i,
589173139Srwatson	            rx_udp);
590173139Srwatson	        __hal_aux_pci_link_info("rx_err_tcp", i,
591173139Srwatson	            rx_err_tcp);
592173139Srwatson	        __hal_aux_pci_link_info("rx_pause_cnt", i,
593173139Srwatson	            rx_pause_cnt);
594173139Srwatson	        __hal_aux_pci_link_info("rx_pause_ctrl_frms", i,
595173139Srwatson	            rx_pause_ctrl_frms);
596173139Srwatson	        __hal_aux_pci_link_info("rx_unsup_ctrl_frms", i,
597173139Srwatson	            rx_pause_cnt);
598173139Srwatson	        __hal_aux_pci_link_info("rx_in_rng_len_err_frms", i,
599173139Srwatson	            rx_in_rng_len_err_frms);
600173139Srwatson	        __hal_aux_pci_link_info("rx_out_rng_len_err_frms", i,
601173139Srwatson	            rx_out_rng_len_err_frms);
602173139Srwatson	        __hal_aux_pci_link_info("rx_drop_frms", i,
603173139Srwatson	            rx_drop_frms);
604173139Srwatson	        __hal_aux_pci_link_info("rx_discarded_frms", i,
605173139Srwatson	            rx_discarded_frms);
606173139Srwatson	        __hal_aux_pci_link_info("rx_drop_ip", i,
607173139Srwatson	            rx_drop_ip);
608173139Srwatson	        __hal_aux_pci_link_info("rx_err_drp_udp", i,
609173139Srwatson	            rx_err_drp_udp);
610173139Srwatson	        __hal_aux_pci_link_info("rx_lacpdu_frms", i,
611173139Srwatson	            rx_lacpdu_frms);
612173139Srwatson	        __hal_aux_pci_link_info("rx_marker_pdu_frms", i,
613173139Srwatson	            rx_marker_pdu_frms);
614173139Srwatson	        __hal_aux_pci_link_info("rx_marker_resp_pdu_frms", i,
615173139Srwatson	            rx_marker_resp_pdu_frms);
616173139Srwatson	        __hal_aux_pci_link_info("rx_unknown_pdu_frms", i,
617173139Srwatson	            rx_unknown_pdu_frms);
618173139Srwatson	        __hal_aux_pci_link_info("rx_illegal_pdu_frms", i,
619173139Srwatson	            rx_illegal_pdu_frms);
620173139Srwatson	        __hal_aux_pci_link_info("rx_fcs_discard", i,
621173139Srwatson	            rx_fcs_discard);
622173139Srwatson	        __hal_aux_pci_link_info("rx_len_discard", i,
623173139Srwatson	            rx_len_discard);
624173139Srwatson	        __hal_aux_pci_link_info("rx_pf_discard", i,
625173139Srwatson	            rx_pf_discard);
626173139Srwatson	        __hal_aux_pci_link_info("rx_trash_discard", i,
627173139Srwatson	            rx_trash_discard);
628173139Srwatson	        __hal_aux_pci_link_info("rx_rts_discard", i,
629173139Srwatson	            rx_trash_discard);
630173139Srwatson	        __hal_aux_pci_link_info("rx_wol_discard", i,
631173139Srwatson	            rx_wol_discard);
632173139Srwatson	        __hal_aux_pci_link_info("rx_red_discard", i,
633173139Srwatson	            rx_red_discard);
634173139Srwatson	        __hal_aux_pci_link_info("rx_ingm_full_discard", i,
635173139Srwatson	            rx_ingm_full_discard);
636173139Srwatson	        __hal_aux_pci_link_info("rx_xgmii_data_err_cnt", i,
637173139Srwatson	            rx_xgmii_data_err_cnt);
638173139Srwatson	        __hal_aux_pci_link_info("rx_xgmii_ctrl_err_cnt", i,
639173139Srwatson	            rx_xgmii_ctrl_err_cnt);
640173139Srwatson	        __hal_aux_pci_link_info("rx_xgmii_err_sym", i,
641173139Srwatson	            rx_xgmii_err_sym);
642173139Srwatson	        __hal_aux_pci_link_info("rx_xgmii_char1_match", i,
643173139Srwatson	            rx_xgmii_char1_match);
644173139Srwatson	        __hal_aux_pci_link_info("rx_xgmii_char2_match", i,
645173139Srwatson	            rx_xgmii_char2_match);
646173139Srwatson	        __hal_aux_pci_link_info("rx_xgmii_column1_match", i,
647173139Srwatson	            rx_xgmii_column1_match);
648173139Srwatson	        __hal_aux_pci_link_info("rx_xgmii_column2_match", i,
649173139Srwatson	            rx_xgmii_column2_match);
650173139Srwatson	        __hal_aux_pci_link_info("rx_local_fault", i,
651173139Srwatson	            rx_local_fault);
652173139Srwatson	        __hal_aux_pci_link_info("rx_remote_fault", i,
653173139Srwatson	            rx_remote_fault);
654173139Srwatson	        __hal_aux_pci_link_info("rx_queue_full", i,
655173139Srwatson	            rx_queue_full);
656173139Srwatson	    }
657173139Srwatson	    for (i = 0; i < XGE_HAL_MAC_AGGREGATORS; i++) {
658173139Srwatson	        __hal_aux_pci_aggr_info("rx_frms", i, rx_frms);
659173139Srwatson	        __hal_aux_pci_link_info("rx_data_octets", i,
660173139Srwatson	            rx_data_octets);
661173139Srwatson	        __hal_aux_pci_aggr_info("rx_mcst_frms", i,
662173139Srwatson	            rx_mcst_frms);
663173139Srwatson	        __hal_aux_pci_aggr_info("rx_bcst_frms", i,
664173139Srwatson	            rx_bcst_frms);
665173139Srwatson	        __hal_aux_pci_aggr_info("rx_discarded_frms", i,
666173139Srwatson	            rx_discarded_frms);
667173139Srwatson	        __hal_aux_pci_aggr_info("rx_errored_frms", i,
668173139Srwatson	            rx_errored_frms);
669173139Srwatson	        __hal_aux_pci_aggr_info("rx_unknown_protocol_frms", i,
670173139Srwatson	            rx_unknown_protocol_frms);
671173139Srwatson	    }
672171095Ssam
673171095Ssam	}
674171095Ssam	__HAL_AUX_ENTRY_END(bufsize, retsize);
675171095Ssam
676171095Ssam	return XGE_HAL_OK;
677171095Ssam}
678171095Ssam
679171095Ssam/**
680171095Ssam * xge_hal_aux_stats_herc_enchanced - Get Hercules hardware statistics.
681171095Ssam * @devh: HAL device handle.
682171095Ssam * @bufsize: Buffer size.
683171095Ssam * @retbuf: Buffer pointer.
684171095Ssam * @retsize: Size of the result. Cannot be greater than @bufsize.
685171095Ssam *
686171095Ssam * Read Hercules device hardware statistics.
687171095Ssam *
688171095Ssam * Returns: XGE_HAL_OK - success.
689171095Ssam * XGE_HAL_ERR_INVALID_DEVICE - Device is not valid.
690171095Ssam * XGE_HAL_ERR_VERSION_CONFLICT - Version it not maching.
691171095Ssam *
692171095Ssam * See also: xge_hal_mgmt_hw_stats{}, xge_hal_stats_hw_info_t{},
693171095Ssam * xge_hal_aux_stats_tmac_read(), xge_hal_aux_stats_rmac_read(),
694171095Ssam * xge_hal_aux_device_dump().
695171095Ssam*/
696171095Ssamxge_hal_status_e xge_hal_aux_stats_herc_enchanced(xge_hal_device_h devh,
697173139Srwatson	              int bufsize, char *retbuf, int *retsize)
698171095Ssam{
699171095Ssam	xge_hal_status_e status;
700171095Ssam	xge_hal_mgmt_hw_stats_t hw;
701171095Ssam	xge_hal_device_t *hldev = (xge_hal_device_t*)devh;
702171095Ssam
703171095Ssam	__HAL_AUX_ENTRY_DECLARE(bufsize, retbuf);
704171095Ssam
705171095Ssam	if (xge_hal_device_check_id(hldev) == XGE_HAL_CARD_TITAN) {
706171095Ssam
707173139Srwatson	    __HAL_AUX_ENTRY_END(bufsize, retsize);
708171095Ssam
709173139Srwatson	    return XGE_HAL_OK;
710171095Ssam	}
711171095Ssam
712171095Ssam
713171095Ssam	status = xge_hal_mgmt_hw_stats(devh, &hw,
714173139Srwatson	                 sizeof(xge_hal_mgmt_hw_stats_t));
715171095Ssam	if (status != XGE_HAL_OK) {
716173139Srwatson	    return status;
717171095Ssam	}
718171095Ssam	__HAL_AUX_ENTRY("tmac_frms_oflow", hw.tmac_frms_oflow, "%u");
719171095Ssam	__HAL_AUX_ENTRY("tmac_data_octets_oflow", hw.tmac_data_octets_oflow,
720173139Srwatson	        "%u");
721171095Ssam	__HAL_AUX_ENTRY("tmac_mcst_frms_oflow", hw.tmac_mcst_frms_oflow, "%u");
722171095Ssam	__HAL_AUX_ENTRY("tmac_bcst_frms_oflow", hw.tmac_bcst_frms_oflow, "%u");
723171095Ssam	__HAL_AUX_ENTRY("tmac_ttl_octets_oflow", hw.tmac_ttl_octets_oflow,
724173139Srwatson	        "%u");
725171095Ssam	__HAL_AUX_ENTRY("tmac_ucst_frms_oflow", hw.tmac_ucst_frms_oflow, "%u");
726171095Ssam	__HAL_AUX_ENTRY("tmac_nucst_frms_oflow", hw.tmac_nucst_frms_oflow,
727173139Srwatson	        "%u");
728171095Ssam	__HAL_AUX_ENTRY("tmac_any_err_frms_oflow", hw.tmac_any_err_frms_oflow,
729173139Srwatson	        "%u");
730171095Ssam	__HAL_AUX_ENTRY("tmac_vlan_frms", (unsigned long long)hw.tmac_vlan_frms,
731173139Srwatson	        "%llu");
732171095Ssam	__HAL_AUX_ENTRY("tmac_vld_ip_oflow", hw.tmac_vld_ip_oflow, "%u");
733171095Ssam	__HAL_AUX_ENTRY("tmac_drop_ip_oflow", hw.tmac_drop_ip_oflow, "%u");
734171095Ssam	__HAL_AUX_ENTRY("tmac_icmp_oflow", hw.tmac_icmp_oflow, "%u");
735171095Ssam	__HAL_AUX_ENTRY("tmac_rst_tcp_oflow", hw.tmac_rst_tcp_oflow, "%u");
736171095Ssam	__HAL_AUX_ENTRY("tmac_udp_oflow", hw.tmac_udp_oflow, "%u");
737171095Ssam	__HAL_AUX_ENTRY("tpa_unknown_protocol", hw.tpa_unknown_protocol, "%u");
738171095Ssam	__HAL_AUX_ENTRY("tpa_parse_failure", hw.tpa_parse_failure, "%u");
739171095Ssam	__HAL_AUX_ENTRY("rmac_vld_frms_oflow", hw.rmac_vld_frms_oflow, "%u");
740171095Ssam	__HAL_AUX_ENTRY("rmac_data_octets_oflow", hw.rmac_data_octets_oflow,
741173139Srwatson	        "%u");
742171095Ssam	__HAL_AUX_ENTRY("rmac_vld_mcst_frms_oflow", hw.rmac_vld_mcst_frms_oflow,
743173139Srwatson	        "%u");
744171095Ssam	__HAL_AUX_ENTRY("rmac_vld_bcst_frms_oflow", hw.rmac_vld_bcst_frms_oflow,
745173139Srwatson	        "%u");
746171095Ssam	__HAL_AUX_ENTRY("rmac_ttl_octets_oflow", hw.rmac_ttl_octets_oflow,
747173139Srwatson	        "%u");
748171095Ssam	__HAL_AUX_ENTRY("rmac_accepted_ucst_frms_oflow",
749173139Srwatson	        hw.rmac_accepted_ucst_frms_oflow, "%u");
750171095Ssam	__HAL_AUX_ENTRY("rmac_accepted_nucst_frms_oflow",
751173139Srwatson	        hw.rmac_accepted_nucst_frms_oflow, "%u");
752171095Ssam	__HAL_AUX_ENTRY("rmac_discarded_frms_oflow",
753173139Srwatson	        hw.rmac_discarded_frms_oflow, "%u");
754171095Ssam	__HAL_AUX_ENTRY("rmac_drop_events_oflow", hw.rmac_drop_events_oflow,
755173139Srwatson	        "%u");
756171095Ssam	__HAL_AUX_ENTRY("rmac_usized_frms_oflow", hw.rmac_usized_frms_oflow,
757173139Srwatson	        "%u");
758171095Ssam	__HAL_AUX_ENTRY("rmac_osized_frms_oflow", hw.rmac_osized_frms_oflow,
759173139Srwatson	        "%u");
760171095Ssam	__HAL_AUX_ENTRY("rmac_frag_frms_oflow", hw.rmac_frag_frms_oflow, "%u");
761171095Ssam	__HAL_AUX_ENTRY("rmac_jabber_frms_oflow", hw.rmac_jabber_frms_oflow,
762173139Srwatson	        "%u");
763171095Ssam	__HAL_AUX_ENTRY("rmac_ip_oflow", hw.rmac_ip_oflow, "%u");
764171095Ssam	__HAL_AUX_ENTRY("rmac_drop_ip_oflow", hw.rmac_drop_ip_oflow, "%u");
765171095Ssam	__HAL_AUX_ENTRY("rmac_icmp_oflow", hw.rmac_icmp_oflow, "%u");
766171095Ssam	__HAL_AUX_ENTRY("rmac_udp_oflow", hw.rmac_udp_oflow, "%u");
767171095Ssam	__HAL_AUX_ENTRY("rmac_err_drp_udp_oflow", hw.rmac_err_drp_udp_oflow,
768173139Srwatson	        "%u");
769171095Ssam	__HAL_AUX_ENTRY("rmac_pause_cnt_oflow", hw.rmac_pause_cnt_oflow, "%u");
770171095Ssam	__HAL_AUX_ENTRY("rmac_ttl_1519_4095_frms",
771173139Srwatson	        (unsigned long long)hw.rmac_ttl_1519_4095_frms, "%llu");
772171095Ssam	__HAL_AUX_ENTRY("rmac_ttl_4096_8191_frms",
773173139Srwatson	        (unsigned long long)hw.rmac_ttl_4096_8191_frms, "%llu");
774171095Ssam	__HAL_AUX_ENTRY("rmac_ttl_8192_max_frms",
775173139Srwatson	        (unsigned long long)hw.rmac_ttl_8192_max_frms, "%llu");
776171095Ssam	__HAL_AUX_ENTRY("rmac_ttl_gt_max_frms",
777173139Srwatson	        (unsigned long long)hw.rmac_ttl_gt_max_frms, "%llu");
778171095Ssam	__HAL_AUX_ENTRY("rmac_osized_alt_frms",
779173139Srwatson	        (unsigned long long)hw.rmac_osized_alt_frms, "%llu");
780171095Ssam	__HAL_AUX_ENTRY("rmac_jabber_alt_frms",
781173139Srwatson	        (unsigned long long)hw.rmac_jabber_alt_frms, "%llu");
782171095Ssam	__HAL_AUX_ENTRY("rmac_gt_max_alt_frms",
783173139Srwatson	        (unsigned long long)hw.rmac_gt_max_alt_frms, "%llu");
784171095Ssam	__HAL_AUX_ENTRY("rmac_vlan_frms",
785173139Srwatson	        (unsigned long long)hw.rmac_vlan_frms, "%llu");
786171095Ssam	__HAL_AUX_ENTRY("rmac_fcs_discard", hw.rmac_fcs_discard, "%u");
787171095Ssam	__HAL_AUX_ENTRY("rmac_len_discard", hw.rmac_len_discard, "%u");
788171095Ssam	__HAL_AUX_ENTRY("rmac_da_discard", hw.rmac_da_discard, "%u");
789171095Ssam	__HAL_AUX_ENTRY("rmac_pf_discard", hw.rmac_pf_discard, "%u");
790171095Ssam	__HAL_AUX_ENTRY("rmac_rts_discard", hw.rmac_rts_discard, "%u");
791171095Ssam	__HAL_AUX_ENTRY("rmac_red_discard", hw.rmac_red_discard, "%u");
792171095Ssam	__HAL_AUX_ENTRY("rmac_ingm_full_discard", hw.rmac_ingm_full_discard,
793173139Srwatson	        "%u");
794171095Ssam	__HAL_AUX_ENTRY("rmac_accepted_ip_oflow", hw.rmac_accepted_ip_oflow,
795173139Srwatson	        "%u");
796171095Ssam	__HAL_AUX_ENTRY("link_fault_cnt", hw.link_fault_cnt, "%u");
797171095Ssam
798171095Ssam	__HAL_AUX_ENTRY_END(bufsize, retsize);
799171095Ssam
800171095Ssam	return XGE_HAL_OK;
801171095Ssam}
802171095Ssam
803171095Ssam/**
804171095Ssam * xge_hal_aux_stats_rmac_read - Read PCI hardware statistics.
805171095Ssam * @devh: HAL device handle.
806171095Ssam * @bufsize: Buffer size.
807171095Ssam * @retbuf: Buffer pointer.
808171095Ssam * @retsize: Size of the result. Cannot be greater than @bufsize.
809171095Ssam *
810171095Ssam * Read PCI statistics counters, including number of PCI read and
811171095Ssam * write transactions, PCI retries, discards, etc.
812171095Ssam * This is a subset of stats counters from xge_hal_stats_hw_info_t{}.
813171095Ssam *
814171095Ssam * Returns: XGE_HAL_OK - success.
815171095Ssam * XGE_HAL_ERR_INVALID_DEVICE - Device is not valid.
816171095Ssam * XGE_HAL_ERR_VERSION_CONFLICT - Version it not maching.
817171095Ssam *
818171095Ssam * See also: xge_hal_mgmt_hw_stats{}, xge_hal_stats_hw_info_t{},
819171095Ssam * xge_hal_aux_stats_tmac_read(), xge_hal_aux_stats_rmac_read(),
820171095Ssam * xge_hal_aux_device_dump().
821171095Ssam */
822171095Ssamxge_hal_status_e xge_hal_aux_stats_pci_read(xge_hal_device_h devh, int bufsize,
823173139Srwatson	            char *retbuf, int *retsize)
824171095Ssam{
825171095Ssam	xge_hal_status_e status;
826171095Ssam	xge_hal_mgmt_hw_stats_t hw;
827171095Ssam	xge_hal_device_t *hldev = (xge_hal_device_t*)devh;
828171095Ssam
829171095Ssam	__HAL_AUX_ENTRY_DECLARE(bufsize, retbuf);
830171095Ssam
831171095Ssam	if (xge_hal_device_check_id(hldev) == XGE_HAL_CARD_TITAN) {
832171095Ssam
833173139Srwatson	    __HAL_AUX_ENTRY_END(bufsize, retsize);
834171095Ssam
835173139Srwatson	    return XGE_HAL_OK;
836171095Ssam	}
837171095Ssam
838171095Ssam
839171095Ssam	status = xge_hal_mgmt_hw_stats(devh, &hw,
840173139Srwatson	                 sizeof(xge_hal_mgmt_hw_stats_t));
841171095Ssam	if (status != XGE_HAL_OK) {
842173139Srwatson	    return status;
843171095Ssam	}
844171095Ssam
845171095Ssam	__HAL_AUX_ENTRY("new_rd_req_cnt", hw.new_rd_req_cnt, "%u");
846171095Ssam	__HAL_AUX_ENTRY("rd_req_cnt", hw.rd_req_cnt, "%u");
847171095Ssam	__HAL_AUX_ENTRY("rd_rtry_cnt", hw.rd_rtry_cnt, "%u");
848171095Ssam	__HAL_AUX_ENTRY("new_rd_req_rtry_cnt", hw.new_rd_req_rtry_cnt, "%u");
849171095Ssam	__HAL_AUX_ENTRY("wr_req_cnt", hw.wr_req_cnt, "%u");
850171095Ssam	__HAL_AUX_ENTRY("wr_rtry_rd_ack_cnt", hw.wr_rtry_rd_ack_cnt, "%u");
851171095Ssam	__HAL_AUX_ENTRY("new_wr_req_rtry_cnt", hw.new_wr_req_rtry_cnt, "%u");
852171095Ssam	__HAL_AUX_ENTRY("new_wr_req_cnt", hw.new_wr_req_cnt, "%u");
853171095Ssam	__HAL_AUX_ENTRY("wr_disc_cnt", hw.wr_disc_cnt, "%u");
854171095Ssam	__HAL_AUX_ENTRY("wr_rtry_cnt", hw.wr_rtry_cnt, "%u");
855171095Ssam	__HAL_AUX_ENTRY("txp_wr_cnt", hw.txp_wr_cnt, "%u");
856171095Ssam	__HAL_AUX_ENTRY("rd_rtry_wr_ack_cnt", hw.rd_rtry_wr_ack_cnt, "%u");
857171095Ssam	__HAL_AUX_ENTRY("txd_wr_cnt", hw.txd_wr_cnt, "%u");
858171095Ssam	__HAL_AUX_ENTRY("txd_rd_cnt", hw.txd_rd_cnt, "%u");
859171095Ssam	__HAL_AUX_ENTRY("rxd_wr_cnt", hw.rxd_wr_cnt, "%u");
860171095Ssam	__HAL_AUX_ENTRY("rxd_rd_cnt", hw.rxd_rd_cnt, "%u");
861171095Ssam	__HAL_AUX_ENTRY("rxf_wr_cnt", hw.rxf_wr_cnt, "%u");
862171095Ssam	__HAL_AUX_ENTRY("txf_rd_cnt", hw.txf_rd_cnt, "%u");
863171095Ssam
864171095Ssam	__HAL_AUX_ENTRY_END(bufsize, retsize);
865171095Ssam
866171095Ssam	return XGE_HAL_OK;
867171095Ssam}
868171095Ssam
869171095Ssam/**
870171095Ssam * xge_hal_aux_stats_hal_read - Read HAL (layer) statistics.
871171095Ssam * @devh: HAL device handle.
872171095Ssam * @bufsize: Buffer size.
873171095Ssam * @retbuf: Buffer pointer.
874171095Ssam * @retsize: Size of the result. Cannot be greater than @bufsize.
875171095Ssam *
876171095Ssam * Read HAL statistics.
877171095Ssam *
878171095Ssam * Returns: XGE_HAL_OK - success.
879171095Ssam * XGE_HAL_ERR_INVALID_DEVICE - Device is not valid.
880171095Ssam * XGE_HAL_ERR_VERSION_CONFLICT - Version it not maching.
881171095Ssam * XGE_HAL_INF_STATS_IS_NOT_READY - Statistics information is not
882171095Ssam * currently available.
883171095Ssam *
884171095Ssam * See also: xge_hal_aux_device_dump().
885171095Ssam */
886171095Ssamxge_hal_status_e xge_hal_aux_stats_hal_read(xge_hal_device_h devh,
887173139Srwatson	        int bufsize, char *retbuf, int *retsize)
888171095Ssam{
889171095Ssam	xge_list_t *item;
890171095Ssam	xge_hal_channel_t *channel;
891171095Ssam	xge_hal_device_t *hldev = (xge_hal_device_t*)devh;
892171095Ssam	xge_hal_status_e status;
893171095Ssam	xge_hal_mgmt_device_stats_t devstat;
894171095Ssam	xge_hal_mgmt_channel_stats_t chstat;
895171095Ssam	__HAL_AUX_ENTRY_DECLARE(bufsize, retbuf);
896171095Ssam
897171095Ssam	status = xge_hal_mgmt_device_stats(hldev, &devstat,
898173139Srwatson	                 sizeof(xge_hal_mgmt_device_stats_t));
899171095Ssam	if (status != XGE_HAL_OK) {
900173139Srwatson	    return status;
901171095Ssam	}
902171095Ssam
903171095Ssam	if (!hldev->config.bimodal_interrupts) {
904173139Srwatson	    __HAL_AUX_ENTRY("rx_traffic_intr_cnt",
905173139Srwatson	            devstat.rx_traffic_intr_cnt, "%u");
906171095Ssam	}
907171095Ssam	__HAL_AUX_ENTRY("tx_traffic_intr_cnt", devstat.tx_traffic_intr_cnt, "%u");
908171095Ssam	__HAL_AUX_ENTRY("txpic_intr_cnt", devstat.txpic_intr_cnt, "%u");
909171095Ssam	__HAL_AUX_ENTRY("txdma_intr_cnt", devstat.txdma_intr_cnt, "%u");
910171095Ssam	__HAL_AUX_ENTRY("txmac_intr_cnt", devstat.txmac_intr_cnt, "%u");
911171095Ssam	__HAL_AUX_ENTRY("txxgxs_intr_cnt", devstat.txxgxs_intr_cnt, "%u");
912171095Ssam	__HAL_AUX_ENTRY("rxpic_intr_cnt", devstat.rxpic_intr_cnt, "%u");
913171095Ssam	__HAL_AUX_ENTRY("rxdma_intr_cnt", devstat.rxdma_intr_cnt, "%u");
914171095Ssam	__HAL_AUX_ENTRY("rxmac_intr_cnt", devstat.rxmac_intr_cnt, "%u");
915171095Ssam	__HAL_AUX_ENTRY("rxxgxs_intr_cnt", devstat.rxxgxs_intr_cnt, "%u");
916171095Ssam	__HAL_AUX_ENTRY("mc_intr_cnt", devstat.mc_intr_cnt, "%u");
917171095Ssam	__HAL_AUX_ENTRY("not_xge_intr_cnt", devstat.not_xge_intr_cnt, "%u");
918171095Ssam	__HAL_AUX_ENTRY("not_traffic_intr_cnt",
919173139Srwatson	        devstat.not_traffic_intr_cnt, "%u");
920171095Ssam	__HAL_AUX_ENTRY("traffic_intr_cnt", devstat.traffic_intr_cnt, "%u");
921171095Ssam	__HAL_AUX_ENTRY("total_intr_cnt", devstat.total_intr_cnt, "%u");
922171095Ssam	__HAL_AUX_ENTRY("soft_reset_cnt", devstat.soft_reset_cnt, "%u");
923171095Ssam
924171095Ssam	if (hldev->config.rxufca_hi_lim != hldev->config.rxufca_lo_lim &&
925171095Ssam	    hldev->config.rxufca_lo_lim != 0) {
926173139Srwatson	    __HAL_AUX_ENTRY("rxufca_lo_adjust_cnt",
927173139Srwatson	            devstat.rxufca_lo_adjust_cnt, "%u");
928173139Srwatson	    __HAL_AUX_ENTRY("rxufca_hi_adjust_cnt",
929173139Srwatson	            devstat.rxufca_hi_adjust_cnt, "%u");
930171095Ssam	}
931171095Ssam
932171095Ssam	if (hldev->config.bimodal_interrupts) {
933173139Srwatson	    __HAL_AUX_ENTRY("bimodal_lo_adjust_cnt",
934173139Srwatson	            devstat.bimodal_lo_adjust_cnt, "%u");
935173139Srwatson	    __HAL_AUX_ENTRY("bimodal_hi_adjust_cnt",
936173139Srwatson	            devstat.bimodal_hi_adjust_cnt, "%u");
937171095Ssam	}
938171095Ssam
939171095Ssam#if defined(XGE_HAL_CONFIG_LRO)
940171095Ssam	__HAL_AUX_ENTRY("tot_frms_lroised",
941173139Srwatson	        devstat.tot_frms_lroised, "%u");
942171095Ssam	__HAL_AUX_ENTRY("tot_lro_sessions",
943173139Srwatson	        devstat.tot_lro_sessions, "%u");
944171095Ssam	__HAL_AUX_ENTRY("lro_frm_len_exceed_cnt",
945173139Srwatson	        devstat.lro_frm_len_exceed_cnt, "%u");
946171095Ssam	__HAL_AUX_ENTRY("lro_sg_exceed_cnt",
947173139Srwatson	        devstat.lro_sg_exceed_cnt, "%u");
948171095Ssam	__HAL_AUX_ENTRY("lro_out_of_seq_pkt_cnt",
949173139Srwatson	        devstat.lro_out_of_seq_pkt_cnt, "%u");
950171095Ssam	__HAL_AUX_ENTRY("lro_dup_pkt_cnt",
951173139Srwatson	        devstat.lro_dup_pkt_cnt, "%u");
952171095Ssam#endif
953171095Ssam
954171095Ssam	/* for each opened rx channel */
955171095Ssam	xge_list_for_each(item, &hldev->ring_channels) {
956173139Srwatson	    char key[XGE_OS_SPRINTF_STRLEN];
957173139Srwatson	    channel = xge_container_of(item, xge_hal_channel_t, item);
958171095Ssam
959173139Srwatson	    status = xge_hal_mgmt_channel_stats(channel, &chstat,
960173139Srwatson	                 sizeof(xge_hal_mgmt_channel_stats_t));
961173139Srwatson	    if (status != XGE_HAL_OK) {
962173139Srwatson	        return status;
963173139Srwatson	    }
964171095Ssam
965173139Srwatson	    (void) xge_os_sprintf(key, "ring%d_", channel->post_qid);
966171095Ssam
967173139Srwatson	    xge_os_strcpy(key+6, "full_cnt");
968173139Srwatson	    __HAL_AUX_ENTRY(key, chstat.full_cnt, "%u");
969173139Srwatson	    xge_os_strcpy(key+6, "usage_max");
970173139Srwatson	    __HAL_AUX_ENTRY(key, chstat.usage_max, "%u");
971173139Srwatson	    xge_os_strcpy(key+6, "usage_cnt");
972173139Srwatson	    __HAL_AUX_ENTRY(key, channel->usage_cnt, "%u");
973173139Srwatson	    xge_os_strcpy(key+6, "reserve_free_swaps_cnt");
974173139Srwatson	    __HAL_AUX_ENTRY(key, chstat.reserve_free_swaps_cnt, "%u");
975173139Srwatson	    if (!hldev->config.bimodal_interrupts) {
976173139Srwatson	        xge_os_strcpy(key+6, "avg_compl_per_intr_cnt");
977173139Srwatson	        __HAL_AUX_ENTRY(key, chstat.avg_compl_per_intr_cnt, "%u");
978173139Srwatson	    }
979173139Srwatson	    xge_os_strcpy(key+6, "total_compl_cnt");
980173139Srwatson	    __HAL_AUX_ENTRY(key, chstat.total_compl_cnt, "%u");
981173139Srwatson	    xge_os_strcpy(key+6, "bump_cnt");
982173139Srwatson	    __HAL_AUX_ENTRY(key, chstat.ring_bump_cnt, "%u");
983171095Ssam	}
984171095Ssam
985171095Ssam	/* for each opened tx channel */
986171095Ssam	xge_list_for_each(item, &hldev->fifo_channels) {
987173139Srwatson	    char key[XGE_OS_SPRINTF_STRLEN];
988173139Srwatson	    channel = xge_container_of(item, xge_hal_channel_t, item);
989171095Ssam
990173139Srwatson	    status = xge_hal_mgmt_channel_stats(channel, &chstat,
991173139Srwatson	                 sizeof(xge_hal_mgmt_channel_stats_t));
992173139Srwatson	    if (status != XGE_HAL_OK) {
993173139Srwatson	        return status;
994173139Srwatson	    }
995171095Ssam
996173139Srwatson	    (void) xge_os_sprintf(key, "fifo%d_", channel->post_qid);
997171095Ssam
998173139Srwatson	    xge_os_strcpy(key+6, "full_cnt");
999173139Srwatson	    __HAL_AUX_ENTRY(key, chstat.full_cnt, "%u");
1000173139Srwatson	    xge_os_strcpy(key+6, "usage_max");
1001173139Srwatson	    __HAL_AUX_ENTRY(key, chstat.usage_max, "%u");
1002173139Srwatson	    xge_os_strcpy(key+6, "usage_cnt");
1003173139Srwatson	    __HAL_AUX_ENTRY(key, channel->usage_cnt, "%u");
1004173139Srwatson	    xge_os_strcpy(key+6, "reserve_free_swaps_cnt");
1005173139Srwatson	    __HAL_AUX_ENTRY(key, chstat.reserve_free_swaps_cnt, "%u");
1006173139Srwatson	    xge_os_strcpy(key+6, "avg_compl_per_intr_cnt");
1007173139Srwatson	    __HAL_AUX_ENTRY(key, chstat.avg_compl_per_intr_cnt, "%u");
1008173139Srwatson	    xge_os_strcpy(key+6, "total_compl_cnt");
1009173139Srwatson	    __HAL_AUX_ENTRY(key, chstat.total_compl_cnt, "%u");
1010173139Srwatson	    xge_os_strcpy(key+6, "total_posts");
1011173139Srwatson	    __HAL_AUX_ENTRY(key, chstat.total_posts, "%u");
1012173139Srwatson	    xge_os_strcpy(key+6, "total_posts_many");
1013173139Srwatson	    __HAL_AUX_ENTRY(key, chstat.total_posts_many, "%u");
1014173139Srwatson	    xge_os_strcpy(key+6, "copied_frags");
1015173139Srwatson	    __HAL_AUX_ENTRY(key, chstat.copied_frags, "%u");
1016173139Srwatson	    xge_os_strcpy(key+6, "copied_buffers");
1017173139Srwatson	    __HAL_AUX_ENTRY(key, chstat.copied_buffers, "%u");
1018173139Srwatson	    xge_os_strcpy(key+6, "total_buffers");
1019173139Srwatson	    __HAL_AUX_ENTRY(key, chstat.total_buffers, "%u");
1020173139Srwatson	    xge_os_strcpy(key+6, "avg_buffers_per_post");
1021173139Srwatson	    __HAL_AUX_ENTRY(key, chstat.avg_buffers_per_post, "%u");
1022173139Srwatson	    xge_os_strcpy(key+6, "avg_buffer_size");
1023173139Srwatson	    __HAL_AUX_ENTRY(key, chstat.avg_buffer_size, "%u");
1024173139Srwatson	    xge_os_strcpy(key+6, "avg_post_size");
1025173139Srwatson	    __HAL_AUX_ENTRY(key, chstat.avg_post_size, "%u");
1026173139Srwatson	    xge_os_strcpy(key+6, "total_posts_dtrs_many");
1027173139Srwatson	    __HAL_AUX_ENTRY(key, chstat.total_posts_dtrs_many, "%u");
1028173139Srwatson	    xge_os_strcpy(key+6, "total_posts_frags_many");
1029173139Srwatson	    __HAL_AUX_ENTRY(key, chstat.total_posts_frags_many, "%u");
1030173139Srwatson	    xge_os_strcpy(key+6, "total_posts_dang_dtrs");
1031173139Srwatson	    __HAL_AUX_ENTRY(key, chstat.total_posts_dang_dtrs, "%u");
1032173139Srwatson	    xge_os_strcpy(key+6, "total_posts_dang_frags");
1033173139Srwatson	    __HAL_AUX_ENTRY(key, chstat.total_posts_dang_frags, "%u");
1034171095Ssam	}
1035171095Ssam
1036171095Ssam	__HAL_AUX_ENTRY_END(bufsize, retsize);
1037171095Ssam
1038171095Ssam	return XGE_HAL_OK;
1039171095Ssam}
1040171095Ssam
1041171095Ssam
1042171095Ssam
1043171095Ssam/**
1044171095Ssam * xge_hal_aux_stats_sw_dev_read - Read software device statistics.
1045171095Ssam * @devh: HAL device handle.
1046171095Ssam * @bufsize: Buffer size.
1047171095Ssam * @retbuf: Buffer pointer.
1048171095Ssam * @retsize: Size of the result. Cannot be greater than @bufsize.
1049171095Ssam *
1050171095Ssam * Read software-maintained device statistics.
1051171095Ssam *
1052171095Ssam * Returns: XGE_HAL_OK - success.
1053171095Ssam * XGE_HAL_ERR_INVALID_DEVICE - Device is not valid.
1054171095Ssam * XGE_HAL_ERR_VERSION_CONFLICT - Version it not maching.
1055171095Ssam * XGE_HAL_INF_STATS_IS_NOT_READY - Statistics information is not
1056171095Ssam * currently available.
1057171095Ssam *
1058171095Ssam * See also: xge_hal_aux_device_dump().
1059171095Ssam */
1060171095Ssamxge_hal_status_e xge_hal_aux_stats_sw_dev_read(xge_hal_device_h devh,
1061173139Srwatson	            int bufsize, char *retbuf, int *retsize)
1062171095Ssam{
1063171095Ssam	xge_hal_device_t *hldev = (xge_hal_device_t*)devh;
1064171095Ssam	xge_hal_status_e status;
1065171095Ssam	xge_hal_mgmt_sw_stats_t sw_dev_err_stats;
1066171095Ssam	int t_code;
1067171095Ssam	char buf[XGE_OS_SPRINTF_STRLEN];
1068171095Ssam
1069171095Ssam	__HAL_AUX_ENTRY_DECLARE(bufsize, retbuf);
1070171095Ssam
1071171095Ssam	status = xge_hal_mgmt_sw_stats(hldev, &sw_dev_err_stats,
1072173139Srwatson	                 sizeof(xge_hal_mgmt_sw_stats_t));
1073171095Ssam	if (status != XGE_HAL_OK) {
1074173139Srwatson	    return status;
1075171095Ssam	}
1076171095Ssam
1077171095Ssam	__HAL_AUX_ENTRY("sm_err_cnt",sw_dev_err_stats.sm_err_cnt, "%u");
1078171095Ssam	__HAL_AUX_ENTRY("single_ecc_err_cnt",sw_dev_err_stats.single_ecc_err_cnt, "%u");
1079171095Ssam	__HAL_AUX_ENTRY("double_ecc_err_cnt",sw_dev_err_stats.double_ecc_err_cnt, "%u");
1080171095Ssam	__HAL_AUX_ENTRY("ecc_err_cnt", sw_dev_err_stats.ecc_err_cnt, "%u");
1081171095Ssam	__HAL_AUX_ENTRY("parity_err_cnt",sw_dev_err_stats.parity_err_cnt, "%u");
1082171095Ssam	__HAL_AUX_ENTRY("serr_cnt",sw_dev_err_stats.serr_cnt, "%u");
1083171095Ssam
1084171095Ssam	for (t_code = 1; t_code < 16; t_code++) {
1085171095Ssam	        int t_code_cnt = sw_dev_err_stats.rxd_t_code_err_cnt[t_code];
1086171095Ssam	        if (t_code_cnt)  {
1087173139Srwatson	        (void) xge_os_sprintf(buf, "rxd_t_code_%d", t_code);
1088173139Srwatson	        __HAL_AUX_ENTRY(buf, t_code_cnt, "%u");
1089171095Ssam	        }
1090171095Ssam	        t_code_cnt = sw_dev_err_stats.txd_t_code_err_cnt[t_code];
1091173139Srwatson	    if (t_code_cnt) {
1092173139Srwatson	        (void) xge_os_sprintf(buf, "txd_t_code_%d", t_code);
1093173139Srwatson	        __HAL_AUX_ENTRY(buf, t_code_cnt, "%u");
1094173139Srwatson	    }
1095171095Ssam	}
1096171095Ssam	__HAL_AUX_ENTRY("alarm_transceiver_temp_high",sw_dev_err_stats.
1097173139Srwatson	        stats_xpak.alarm_transceiver_temp_high, "%u");
1098171095Ssam	__HAL_AUX_ENTRY("alarm_transceiver_temp_low",sw_dev_err_stats.
1099173139Srwatson	        stats_xpak.alarm_transceiver_temp_low, "%u");
1100171095Ssam	__HAL_AUX_ENTRY("alarm_laser_bias_current_high",sw_dev_err_stats.
1101173139Srwatson	        stats_xpak.alarm_laser_bias_current_high, "%u");
1102171095Ssam	__HAL_AUX_ENTRY("alarm_laser_bias_current_low",sw_dev_err_stats.
1103173139Srwatson	        stats_xpak.alarm_laser_bias_current_low, "%u");
1104171095Ssam	__HAL_AUX_ENTRY("alarm_laser_output_power_high",sw_dev_err_stats.
1105173139Srwatson	        stats_xpak.alarm_laser_output_power_high, "%u");
1106171095Ssam	__HAL_AUX_ENTRY("alarm_laser_output_power_low",sw_dev_err_stats.
1107173139Srwatson	        stats_xpak.alarm_laser_output_power_low, "%u");
1108171095Ssam	__HAL_AUX_ENTRY("warn_transceiver_temp_high",sw_dev_err_stats.
1109173139Srwatson	        stats_xpak.warn_transceiver_temp_high, "%u");
1110171095Ssam	__HAL_AUX_ENTRY("warn_transceiver_temp_low",sw_dev_err_stats.
1111173139Srwatson	        stats_xpak.warn_transceiver_temp_low, "%u");
1112171095Ssam	__HAL_AUX_ENTRY("warn_laser_bias_current_high",sw_dev_err_stats.
1113173139Srwatson	        stats_xpak.warn_laser_bias_current_high, "%u");
1114171095Ssam	__HAL_AUX_ENTRY("warn_laser_bias_current_low",sw_dev_err_stats.
1115173139Srwatson	        stats_xpak.warn_laser_bias_current_low, "%u");
1116171095Ssam	__HAL_AUX_ENTRY("warn_laser_output_power_high",sw_dev_err_stats.
1117173139Srwatson	        stats_xpak.warn_laser_output_power_high, "%u");
1118171095Ssam	__HAL_AUX_ENTRY("warn_laser_output_power_low",sw_dev_err_stats.
1119173139Srwatson	        stats_xpak.warn_laser_output_power_low, "%u");
1120171095Ssam
1121171095Ssam	__HAL_AUX_ENTRY_END(bufsize, retsize);
1122171095Ssam
1123171095Ssam	return XGE_HAL_OK;
1124171095Ssam}
1125171095Ssam
1126171095Ssam/**
1127171095Ssam * xge_hal_aux_pci_config_read - Retrieve and format PCI Configuration
1128171095Ssam * info.
1129171095Ssam * @devh: HAL device handle.
1130171095Ssam * @bufsize: Buffer size.
1131171095Ssam * @retbuf: Buffer pointer.
1132171095Ssam * @retsize: Size of the result. Cannot be greater than @bufsize.
1133171095Ssam *
1134171095Ssam * Retrieve about info (using xge_hal_mgmt_pci_config()) and sprintf it
1135171095Ssam * into the provided @retbuf.
1136171095Ssam *
1137171095Ssam * Returns: XGE_HAL_OK - success.
1138171095Ssam * XGE_HAL_ERR_INVALID_DEVICE - Device is not valid.
1139171095Ssam * XGE_HAL_ERR_VERSION_CONFLICT - Version it not maching.
1140171095Ssam *
1141171095Ssam * See also: xge_hal_mgmt_pci_config(), xge_hal_aux_device_dump().
1142171095Ssam */
1143173139Srwatsonxge_hal_status_e xge_hal_aux_pci_config_read(xge_hal_device_h devh, int bufsize,
1144173139Srwatson	            char *retbuf, int *retsize)
1145171095Ssam{
1146171095Ssam	xge_hal_status_e status;
1147171095Ssam	xge_hal_mgmt_pci_config_t pci_config;
1148171095Ssam	__HAL_AUX_ENTRY_DECLARE(bufsize, retbuf);
1149171095Ssam
1150171095Ssam	status = xge_hal_mgmt_pci_config(devh, &pci_config,
1151173139Srwatson	              sizeof(xge_hal_mgmt_pci_config_t));
1152171095Ssam	if (status != XGE_HAL_OK) {
1153173139Srwatson	    return status;
1154171095Ssam	}
1155171095Ssam
1156171095Ssam	__HAL_AUX_ENTRY("vendor_id", pci_config.vendor_id, "0x%04X");
1157171095Ssam	__HAL_AUX_ENTRY("device_id", pci_config.device_id, "0x%04X");
1158171095Ssam	__HAL_AUX_ENTRY("command", pci_config.command, "0x%04X");
1159171095Ssam	__HAL_AUX_ENTRY("status", pci_config.status, "0x%04X");
1160171095Ssam	__HAL_AUX_ENTRY("revision", pci_config.revision, "0x%02X");
1161171095Ssam	__HAL_AUX_ENTRY("pciClass1", pci_config.pciClass[0], "0x%02X");
1162171095Ssam	__HAL_AUX_ENTRY("pciClass2", pci_config.pciClass[1], "0x%02X");
1163171095Ssam	__HAL_AUX_ENTRY("pciClass3", pci_config.pciClass[2], "0x%02X");
1164171095Ssam	__HAL_AUX_ENTRY("cache_line_size",
1165173139Srwatson	        pci_config.cache_line_size, "0x%02X");
1166171095Ssam	__HAL_AUX_ENTRY("latency_timer", pci_config.latency_timer, "0x%02X");
1167171095Ssam	__HAL_AUX_ENTRY("header_type", pci_config.header_type, "0x%02X");
1168171095Ssam	__HAL_AUX_ENTRY("bist", pci_config.bist, "0x%02X");
1169171095Ssam	__HAL_AUX_ENTRY("base_addr0_lo", pci_config.base_addr0_lo, "0x%08X");
1170171095Ssam	__HAL_AUX_ENTRY("base_addr0_hi", pci_config.base_addr0_hi, "0x%08X");
1171171095Ssam	__HAL_AUX_ENTRY("base_addr1_lo", pci_config.base_addr1_lo, "0x%08X");
1172171095Ssam	__HAL_AUX_ENTRY("base_addr1_hi", pci_config.base_addr1_hi, "0x%08X");
1173171095Ssam	__HAL_AUX_ENTRY("not_Implemented1",
1174173139Srwatson	        pci_config.not_Implemented1, "0x%08X");
1175171095Ssam	__HAL_AUX_ENTRY("not_Implemented2", pci_config.not_Implemented2,
1176173139Srwatson	        "0x%08X");
1177171095Ssam	__HAL_AUX_ENTRY("cardbus_cis_pointer", pci_config.cardbus_cis_pointer,
1178173139Srwatson	        "0x%08X");
1179171095Ssam	__HAL_AUX_ENTRY("subsystem_vendor_id", pci_config.subsystem_vendor_id,
1180173139Srwatson	        "0x%04X");
1181171095Ssam	__HAL_AUX_ENTRY("subsystem_id", pci_config.subsystem_id, "0x%04X");
1182171095Ssam	__HAL_AUX_ENTRY("rom_base", pci_config.rom_base, "0x%08X");
1183171095Ssam	__HAL_AUX_ENTRY("capabilities_pointer",
1184173139Srwatson	        pci_config.capabilities_pointer, "0x%02X");
1185171095Ssam	__HAL_AUX_ENTRY("interrupt_line", pci_config.interrupt_line, "0x%02X");
1186171095Ssam	__HAL_AUX_ENTRY("interrupt_pin", pci_config.interrupt_pin, "0x%02X");
1187171095Ssam	__HAL_AUX_ENTRY("min_grant", pci_config.min_grant, "0x%02X");
1188171095Ssam	__HAL_AUX_ENTRY("max_latency", pci_config.max_latency, "0x%02X");
1189171095Ssam	__HAL_AUX_ENTRY("msi_cap_id", pci_config.msi_cap_id, "0x%02X");
1190171095Ssam	__HAL_AUX_ENTRY("msi_next_ptr", pci_config.msi_next_ptr, "0x%02X");
1191171095Ssam	__HAL_AUX_ENTRY("msi_control", pci_config.msi_control, "0x%04X");
1192171095Ssam	__HAL_AUX_ENTRY("msi_lower_address", pci_config.msi_lower_address,
1193173139Srwatson	        "0x%08X");
1194171095Ssam	__HAL_AUX_ENTRY("msi_higher_address", pci_config.msi_higher_address,
1195173139Srwatson	        "0x%08X");
1196171095Ssam	__HAL_AUX_ENTRY("msi_data", pci_config.msi_data, "0x%04X");
1197171095Ssam	__HAL_AUX_ENTRY("msi_unused", pci_config.msi_unused, "0x%04X");
1198171095Ssam	__HAL_AUX_ENTRY("vpd_cap_id", pci_config.vpd_cap_id, "0x%02X");
1199171095Ssam	__HAL_AUX_ENTRY("vpd_next_cap", pci_config.vpd_next_cap, "0x%02X");
1200171095Ssam	__HAL_AUX_ENTRY("vpd_addr", pci_config.vpd_addr, "0x%04X");
1201171095Ssam	__HAL_AUX_ENTRY("vpd_data", pci_config.vpd_data, "0x%08X");
1202171095Ssam	__HAL_AUX_ENTRY("pcix_cap", pci_config.pcix_cap, "0x%02X");
1203171095Ssam	__HAL_AUX_ENTRY("pcix_next_cap", pci_config.pcix_next_cap, "0x%02X");
1204171095Ssam	__HAL_AUX_ENTRY("pcix_command", pci_config.pcix_command, "0x%04X");
1205171095Ssam	__HAL_AUX_ENTRY("pcix_status", pci_config.pcix_status, "0x%08X");
1206171095Ssam
1207171095Ssam	if (xge_hal_device_check_id(devh) == XGE_HAL_CARD_HERC) {
1208173139Srwatson	    char key[XGE_OS_SPRINTF_STRLEN];
1209173139Srwatson	    int i;
1210171095Ssam
1211173139Srwatson	    for (i = 0;
1212173139Srwatson	         i < (XGE_HAL_PCI_XFRAME_CONFIG_SPACE_SIZE - 0x68)/4;
1213173139Srwatson	         i++) {
1214173139Srwatson	        (void) xge_os_sprintf(key, "%03x:", 4*i + 0x68);
1215173139Srwatson	        __HAL_AUX_ENTRY(key, *((int *)pci_config.rsvd_b1 + i),
1216173139Srwatson	                "0x%08X");
1217173139Srwatson	    }
1218171095Ssam	}
1219171095Ssam
1220171095Ssam	__HAL_AUX_ENTRY_END(bufsize, retsize);
1221171095Ssam
1222171095Ssam	return XGE_HAL_OK;
1223171095Ssam}
1224171095Ssam
1225171095Ssam
1226171095Ssam/**
1227171095Ssam * xge_hal_aux_channel_read - Read channels information.
1228171095Ssam * @devh: HAL device handle.
1229171095Ssam * @bufsize: Buffer size.
1230171095Ssam * @retbuf: Buffer pointer.
1231171095Ssam * @retsize: Size of the result. Cannot be greater than @bufsize.
1232171095Ssam *
1233171095Ssam * Read HAL statistics.
1234171095Ssam *
1235171095Ssam * Returns: XGE_HAL_OK - success.
1236171095Ssam * XGE_HAL_ERR_INVALID_DEVICE - Device is not valid.
1237171095Ssam * XGE_HAL_ERR_OUT_OF_SPACE - Buffer size is very small.
1238171095Ssam * See also: xge_hal_aux_device_dump().
1239171095Ssam */
1240171095Ssamxge_hal_status_e xge_hal_aux_channel_read(xge_hal_device_h devh,
1241173139Srwatson	            int bufsize, char *retbuf, int *retsize)
1242171095Ssam{
1243171095Ssam	xge_list_t *item;
1244171095Ssam	xge_hal_channel_t *channel;
1245171095Ssam	xge_hal_device_t *hldev = (xge_hal_device_t*)devh;
1246171095Ssam	__HAL_AUX_ENTRY_DECLARE(bufsize, retbuf);
1247171095Ssam
1248171095Ssam	if (hldev->magic != XGE_HAL_MAGIC) {
1249173139Srwatson	            return XGE_HAL_ERR_INVALID_DEVICE;
1250173139Srwatson	    }
1251171095Ssam
1252171095Ssam	/* for each opened rx channel */
1253171095Ssam	xge_list_for_each(item, &hldev->ring_channels) {
1254173139Srwatson	    char key[XGE_OS_SPRINTF_STRLEN];
1255173139Srwatson	    channel = xge_container_of(item, xge_hal_channel_t, item);
1256171095Ssam
1257173139Srwatson	    if (channel->is_open != 1)
1258173139Srwatson	        continue;
1259171095Ssam
1260173139Srwatson	    (void) xge_os_sprintf(key, "ring%d_", channel->post_qid);
1261173139Srwatson	    xge_os_strcpy(key+6, "type");
1262173139Srwatson	    __HAL_AUX_ENTRY(key, channel->type, "%u");
1263173139Srwatson	    xge_os_strcpy(key+6, "length");
1264173139Srwatson	    __HAL_AUX_ENTRY(key, channel->length, "%u");
1265173139Srwatson	    xge_os_strcpy(key+6, "is_open");
1266173139Srwatson	    __HAL_AUX_ENTRY(key, channel->is_open, "%u");
1267173139Srwatson	    xge_os_strcpy(key+6, "reserve_initial");
1268173139Srwatson	    __HAL_AUX_ENTRY(key, channel->reserve_initial, "%u");
1269173139Srwatson	    xge_os_strcpy(key+6, "reserve_max");
1270173139Srwatson	    __HAL_AUX_ENTRY(key, channel->reserve_max, "%u");
1271173139Srwatson	    xge_os_strcpy(key+6, "reserve_length");
1272173139Srwatson	    __HAL_AUX_ENTRY(key, channel->reserve_length, "%u");
1273173139Srwatson	    xge_os_strcpy(key+6, "reserve_top");
1274173139Srwatson	    __HAL_AUX_ENTRY(key, channel->reserve_top, "%u");
1275173139Srwatson	    xge_os_strcpy(key+6, "reserve_threshold");
1276173139Srwatson	    __HAL_AUX_ENTRY(key, channel->reserve_threshold, "%u");
1277173139Srwatson	    xge_os_strcpy(key+6, "free_length");
1278173139Srwatson	    __HAL_AUX_ENTRY(key, channel->free_length, "%u");
1279173139Srwatson	    xge_os_strcpy(key+6, "post_index");
1280173139Srwatson	    __HAL_AUX_ENTRY(key, channel->post_index, "%u");
1281173139Srwatson	    xge_os_strcpy(key+6, "compl_index");
1282173139Srwatson	    __HAL_AUX_ENTRY(key, channel->compl_index, "%u");
1283173139Srwatson	    xge_os_strcpy(key+6, "per_dtr_space");
1284173139Srwatson	    __HAL_AUX_ENTRY(key, channel->per_dtr_space, "%u");
1285173139Srwatson	    xge_os_strcpy(key+6, "usage_cnt");
1286173139Srwatson	    __HAL_AUX_ENTRY(key, channel->usage_cnt, "%u");
1287171095Ssam	}
1288171095Ssam
1289171095Ssam	/* for each opened tx channel */
1290171095Ssam	xge_list_for_each(item, &hldev->fifo_channels) {
1291173139Srwatson	    char key[XGE_OS_SPRINTF_STRLEN];
1292173139Srwatson	    channel = xge_container_of(item, xge_hal_channel_t, item);
1293171095Ssam
1294173139Srwatson	    if (channel->is_open != 1)
1295173139Srwatson	        continue;
1296171095Ssam
1297173139Srwatson	    (void) xge_os_sprintf(key, "fifo%d_", channel->post_qid);
1298173139Srwatson	    xge_os_strcpy(key+6, "type");
1299173139Srwatson	    __HAL_AUX_ENTRY(key, channel->type, "%u");
1300173139Srwatson	    xge_os_strcpy(key+6, "length");
1301173139Srwatson	    __HAL_AUX_ENTRY(key, channel->length, "%u");
1302173139Srwatson	    xge_os_strcpy(key+6, "is_open");
1303173139Srwatson	    __HAL_AUX_ENTRY(key, channel->is_open, "%u");
1304173139Srwatson	    xge_os_strcpy(key+6, "reserve_initial");
1305173139Srwatson	    __HAL_AUX_ENTRY(key, channel->reserve_initial, "%u");
1306173139Srwatson	    xge_os_strcpy(key+6, "reserve_max");
1307173139Srwatson	    __HAL_AUX_ENTRY(key, channel->reserve_max, "%u");
1308173139Srwatson	    xge_os_strcpy(key+6, "reserve_length");
1309173139Srwatson	    __HAL_AUX_ENTRY(key, channel->reserve_length, "%u");
1310173139Srwatson	    xge_os_strcpy(key+6, "reserve_top");
1311173139Srwatson	    __HAL_AUX_ENTRY(key, channel->reserve_top, "%u");
1312173139Srwatson	    xge_os_strcpy(key+6, "reserve_threshold");
1313173139Srwatson	    __HAL_AUX_ENTRY(key, channel->reserve_threshold, "%u");
1314173139Srwatson	    xge_os_strcpy(key+6, "free_length");
1315173139Srwatson	    __HAL_AUX_ENTRY(key, channel->free_length, "%u");
1316173139Srwatson	    xge_os_strcpy(key+6, "post_index");
1317173139Srwatson	    __HAL_AUX_ENTRY(key, channel->post_index, "%u");
1318173139Srwatson	    xge_os_strcpy(key+6, "compl_index");
1319173139Srwatson	    __HAL_AUX_ENTRY(key, channel->compl_index, "%u");
1320173139Srwatson	    xge_os_strcpy(key+6, "per_dtr_space");
1321173139Srwatson	    __HAL_AUX_ENTRY(key, channel->per_dtr_space, "%u");
1322173139Srwatson	    xge_os_strcpy(key+6, "usage_cnt");
1323173139Srwatson	    __HAL_AUX_ENTRY(key, channel->usage_cnt, "%u");
1324171095Ssam	}
1325171095Ssam
1326171095Ssam	__HAL_AUX_ENTRY_END(bufsize, retsize);
1327171095Ssam
1328171095Ssam	return XGE_HAL_OK;
1329171095Ssam}
1330171095Ssam
1331171095Ssam/**
1332171095Ssam * xge_hal_aux_device_dump - Dump driver "about" info and device state.
1333171095Ssam * @devh: HAL device handle.
1334171095Ssam *
1335171095Ssam * Dump driver & device "about" info and device state,
1336171095Ssam * including all BAR0 registers, hardware and software statistics, PCI
1337171095Ssam * configuration space.
1338171095Ssam * See also: xge_hal_aux_about_read(), xge_hal_mgmt_reg_read(),
1339171095Ssam * xge_hal_aux_pci_config_read(), xge_hal_aux_stats_sw_dev_read(),
1340171095Ssam * xge_hal_aux_stats_tmac_read(), xge_hal_aux_stats_rmac_read(),
1341171095Ssam * xge_hal_aux_channel_read(), xge_hal_aux_stats_hal_read().
1342171095Ssam * Returns:
1343171095Ssam * XGE_HAL_ERR_INVALID_DEVICE - Device is not valid.
1344171095Ssam * XGE_HAL_ERR_OUT_OF_SPACE - Buffer size is very small.
1345171095Ssam */
1346171095Ssamxge_hal_status_e
1347171095Ssamxge_hal_aux_device_dump(xge_hal_device_h devh)
1348171095Ssam{
1349171095Ssam	xge_hal_device_t *hldev = (xge_hal_device_t*)devh;
1350171095Ssam	xge_hal_status_e status;
1351171095Ssam	int retsize;
1352171095Ssam	int offset;
1353171095Ssam	u64 retval;
1354171095Ssam
1355171095Ssam	xge_assert(hldev->dump_buf != NULL);
1356171095Ssam
1357171095Ssam	xge_os_println("********* xge DEVICE DUMP BEGIN **********");
1358171095Ssam
1359171095Ssam	status = xge_hal_aux_about_read(hldev, XGE_HAL_DUMP_BUF_SIZE,
1360171095Ssam	                                hldev->dump_buf,
1361171095Ssam	                                &retsize);
1362171095Ssam	if (status != XGE_HAL_OK) {
1363173139Srwatson	    goto error;
1364171095Ssam	}
1365171095Ssam	xge_os_println(hldev->dump_buf);
1366171095Ssam
1367171095Ssam
1368171095Ssam	for (offset = 0; offset < 1574; offset++) {
1369171095Ssam
1370173139Srwatson	    status = xge_hal_mgmt_reg_read(hldev, 0, offset*8, &retval);
1371173139Srwatson	    if (status != XGE_HAL_OK) {
1372173139Srwatson	        goto error;
1373173139Srwatson	    }
1374171095Ssam
1375173139Srwatson	    if (!retval) continue;
1376171095Ssam
1377173139Srwatson	    xge_os_printf("0x%04x 0x%08x%08x", offset*8,
1378173139Srwatson	                (u32)(retval>>32), (u32)retval);
1379171095Ssam	}
1380171095Ssam	xge_os_println("\n");
1381171095Ssam
1382171095Ssam	status = xge_hal_aux_pci_config_read(hldev, XGE_HAL_DUMP_BUF_SIZE,
1383171095Ssam	                                     hldev->dump_buf,
1384171095Ssam	                                     &retsize);
1385171095Ssam	if (status != XGE_HAL_OK) {
1386173139Srwatson	    goto error;
1387171095Ssam	}
1388171095Ssam	xge_os_println(hldev->dump_buf);
1389171095Ssam
1390171095Ssam	status = xge_hal_aux_stats_tmac_read(hldev, XGE_HAL_DUMP_BUF_SIZE,
1391171095Ssam	                                     hldev->dump_buf,
1392171095Ssam	                                     &retsize);
1393171095Ssam	if (status != XGE_HAL_OK) {
1394173139Srwatson	    goto error;
1395171095Ssam	}
1396171095Ssam	xge_os_println(hldev->dump_buf);
1397171095Ssam
1398171095Ssam	status = xge_hal_aux_stats_rmac_read(hldev, XGE_HAL_DUMP_BUF_SIZE,
1399171095Ssam	                                     hldev->dump_buf,
1400171095Ssam	                                     &retsize);
1401171095Ssam	if (status != XGE_HAL_OK) {
1402173139Srwatson	    goto error;
1403171095Ssam	}
1404171095Ssam	xge_os_println(hldev->dump_buf);
1405171095Ssam
1406171095Ssam	status = xge_hal_aux_stats_pci_read(hldev, XGE_HAL_DUMP_BUF_SIZE,
1407171095Ssam	                                    hldev->dump_buf,
1408171095Ssam	                                    &retsize);
1409171095Ssam	if (status != XGE_HAL_OK) {
1410173139Srwatson	    goto error;
1411171095Ssam	}
1412171095Ssam	xge_os_println(hldev->dump_buf);
1413171095Ssam
1414171095Ssam	if (xge_hal_device_check_id(hldev) == XGE_HAL_CARD_HERC) {
1415173139Srwatson	    status = xge_hal_aux_stats_herc_enchanced(hldev,
1416173139Srwatson	             XGE_HAL_DUMP_BUF_SIZE, hldev->dump_buf, &retsize);
1417173139Srwatson	    if (status != XGE_HAL_OK) {
1418173139Srwatson	        goto error;
1419173139Srwatson	    }
1420173139Srwatson	    xge_os_println(hldev->dump_buf);
1421171095Ssam	}
1422171095Ssam
1423171095Ssam	status = xge_hal_aux_stats_sw_dev_read(hldev, XGE_HAL_DUMP_BUF_SIZE,
1424173139Srwatson	                     hldev->dump_buf, &retsize);
1425171095Ssam	if (status != XGE_HAL_OK) {
1426173139Srwatson	    goto error;
1427171095Ssam	}
1428171095Ssam	xge_os_println(hldev->dump_buf);
1429171095Ssam
1430171095Ssam	status = xge_hal_aux_channel_read(hldev, XGE_HAL_DUMP_BUF_SIZE,
1431171095Ssam	                                  hldev->dump_buf,
1432171095Ssam	                                  &retsize);
1433171095Ssam	if (status != XGE_HAL_OK) {
1434173139Srwatson	    goto error;
1435171095Ssam	}
1436171095Ssam	xge_os_println(hldev->dump_buf);
1437171095Ssam
1438171095Ssam	status = xge_hal_aux_stats_hal_read(hldev, XGE_HAL_DUMP_BUF_SIZE,
1439171095Ssam	                                    hldev->dump_buf,
1440171095Ssam	                                    &retsize);
1441171095Ssam	if (status != XGE_HAL_OK) {
1442173139Srwatson	    goto error;
1443171095Ssam	}
1444171095Ssam	xge_os_println(hldev->dump_buf);
1445171095Ssam
1446171095Ssam	xge_os_println("********* XFRAME DEVICE DUMP END **********");
1447171095Ssam
1448171095Ssamerror:
1449171095Ssam	return status;
1450171095Ssam}
1451171095Ssam
1452171095Ssam
1453171095Ssam/**
1454171095Ssam * xge_hal_aux_driver_config_read - Read Driver configuration.
1455171095Ssam * @bufsize: Buffer size.
1456171095Ssam * @retbuf: Buffer pointer.
1457171095Ssam * @retsize: Size of the result. Cannot be greater than @bufsize.
1458171095Ssam *
1459171095Ssam * Read driver configuration,
1460171095Ssam *
1461171095Ssam * Returns: XGE_HAL_OK - success.
1462171095Ssam * XGE_HAL_ERR_VERSION_CONFLICT - Version it not maching.
1463171095Ssam *
1464171095Ssam * See also: xge_hal_aux_device_config_read().
1465171095Ssam */
1466171095Ssamxge_hal_status_e
1467171095Ssamxge_hal_aux_driver_config_read(int bufsize, char *retbuf, int *retsize)
1468171095Ssam{
1469171095Ssam	xge_hal_status_e status;
1470171095Ssam	xge_hal_driver_config_t  drv_config;
1471171095Ssam	__HAL_AUX_ENTRY_DECLARE(bufsize, retbuf);
1472171095Ssam
1473171095Ssam	status = xge_hal_mgmt_driver_config(&drv_config,
1474173139Srwatson	                  sizeof(xge_hal_driver_config_t));
1475171095Ssam	if (status != XGE_HAL_OK) {
1476173139Srwatson	    return status;
1477171095Ssam	}
1478171095Ssam
1479171095Ssam	__HAL_AUX_ENTRY("queue size initial",
1480173139Srwatson	        drv_config.queue_size_initial, "%u");
1481171095Ssam	__HAL_AUX_ENTRY("queue size max", drv_config.queue_size_max, "%u");
1482171095Ssam	__HAL_AUX_ENTRY_END(bufsize, retsize);
1483171095Ssam
1484171095Ssam	return XGE_HAL_OK;
1485171095Ssam}
1486171095Ssam
1487171095Ssam
1488171095Ssam/**
1489171095Ssam * xge_hal_aux_device_config_read - Read device configuration.
1490171095Ssam * @devh: HAL device handle.
1491171095Ssam * @bufsize: Buffer size.
1492171095Ssam * @retbuf: Buffer pointer.
1493171095Ssam * @retsize: Size of the result. Cannot be greater than @bufsize.
1494171095Ssam *
1495171095Ssam * Read device configuration,
1496171095Ssam *
1497171095Ssam * Returns: XGE_HAL_OK - success.
1498171095Ssam * XGE_HAL_ERR_INVALID_DEVICE - Device is not valid.
1499171095Ssam * XGE_HAL_ERR_VERSION_CONFLICT - Version it not maching.
1500171095Ssam *
1501171095Ssam * See also: xge_hal_aux_driver_config_read().
1502171095Ssam */
1503171095Ssamxge_hal_status_e xge_hal_aux_device_config_read(xge_hal_device_h devh,
1504173139Srwatson	            int bufsize, char *retbuf, int *retsize)
1505171095Ssam{
1506171095Ssam	int i;
1507171095Ssam	xge_hal_status_e status;
1508171095Ssam	xge_hal_device_config_t *dev_config;
1509171095Ssam	xge_hal_device_t *hldev = (xge_hal_device_t *) devh;
1510171095Ssam	char key[XGE_OS_SPRINTF_STRLEN];
1511171095Ssam	__HAL_AUX_ENTRY_DECLARE(bufsize, retbuf);
1512171095Ssam
1513171095Ssam	dev_config = (xge_hal_device_config_t *) xge_os_malloc(hldev->pdev,
1514173139Srwatson	                                    sizeof(xge_hal_device_config_t));
1515171095Ssam	if (dev_config == NULL) {
1516173139Srwatson	    return XGE_HAL_FAIL;
1517171095Ssam	}
1518171095Ssam
1519171095Ssam	status = xge_hal_mgmt_device_config(devh, dev_config,
1520173139Srwatson	                  sizeof(xge_hal_device_config_t));
1521171095Ssam	if (status != XGE_HAL_OK) {
1522173139Srwatson	    xge_os_free(hldev->pdev, dev_config,
1523173139Srwatson	            sizeof(xge_hal_device_config_t));
1524173139Srwatson	    return status;
1525171095Ssam	}
1526171095Ssam
1527171095Ssam	__HAL_AUX_ENTRY("mtu", dev_config->mtu, "%u");
1528171095Ssam	__HAL_AUX_ENTRY("isr_polling_count", dev_config->isr_polling_cnt, "%u");
1529171095Ssam	__HAL_AUX_ENTRY("latency_timer", dev_config->latency_timer, "%u");
1530171095Ssam	__HAL_AUX_ENTRY("max_splits_trans",
1531173139Srwatson	        dev_config->max_splits_trans, "%u");
1532171095Ssam	__HAL_AUX_ENTRY("mmrb_count", dev_config->mmrb_count, "%d");
1533171095Ssam	__HAL_AUX_ENTRY("shared_splits", dev_config->shared_splits, "%u");
1534171095Ssam	__HAL_AUX_ENTRY("stats_refresh_time_sec",
1535173139Srwatson	        dev_config->stats_refresh_time_sec, "%u");
1536171095Ssam	__HAL_AUX_ENTRY("pci_freq_mherz", dev_config->pci_freq_mherz, "%u");
1537171095Ssam	__HAL_AUX_ENTRY("intr_mode", dev_config->intr_mode, "%u");
1538171095Ssam	__HAL_AUX_ENTRY("ring_memblock_size",
1539173139Srwatson	        dev_config->ring.memblock_size,  "%u");
1540171095Ssam
1541171095Ssam	__HAL_AUX_ENTRY("sched_timer_us", dev_config->sched_timer_us, "%u");
1542171095Ssam	__HAL_AUX_ENTRY("sched_timer_one_shot",
1543173139Srwatson	        dev_config->sched_timer_one_shot,  "%u");
1544171095Ssam	__HAL_AUX_ENTRY("rxufca_intr_thres", dev_config->rxufca_intr_thres,  "%u");
1545171095Ssam	__HAL_AUX_ENTRY("rxufca_lo_lim", dev_config->rxufca_lo_lim,  "%u");
1546171095Ssam	__HAL_AUX_ENTRY("rxufca_hi_lim", dev_config->rxufca_hi_lim,  "%u");
1547171095Ssam	__HAL_AUX_ENTRY("rxufca_lbolt_period", dev_config->rxufca_lbolt_period,  "%u");
1548171095Ssam
1549171095Ssam	for(i = 0; i < XGE_HAL_MAX_RING_NUM;  i++)
1550171095Ssam	{
1551173139Srwatson	    xge_hal_ring_queue_t *ring = &dev_config->ring.queue[i];
1552173139Srwatson	    xge_hal_rti_config_t *rti =  &ring->rti;
1553171095Ssam
1554173139Srwatson	    if (!ring->configured)
1555173139Srwatson	        continue;
1556171095Ssam
1557173139Srwatson	    (void) xge_os_sprintf(key, "ring%d_", i);
1558173139Srwatson	    xge_os_strcpy(key+6, "inital");
1559173139Srwatson	    __HAL_AUX_ENTRY(key, ring->initial, "%u");
1560173139Srwatson	    xge_os_strcpy(key+6, "max");
1561173139Srwatson	    __HAL_AUX_ENTRY(key, ring->max, "%u");
1562173139Srwatson	    xge_os_strcpy(key+6, "buffer_mode");
1563173139Srwatson	    __HAL_AUX_ENTRY(key, ring->buffer_mode, "%u");
1564173139Srwatson	    xge_os_strcpy(key+6, "dram_size_mb");
1565173139Srwatson	    __HAL_AUX_ENTRY(key, ring->dram_size_mb, "%u");
1566173139Srwatson	    xge_os_strcpy(key+6, "backoff_interval_us");
1567173139Srwatson	    __HAL_AUX_ENTRY(key, ring->backoff_interval_us, "%u");
1568173139Srwatson	    xge_os_strcpy(key+6, "max_frame_len");
1569173139Srwatson	    __HAL_AUX_ENTRY(key, ring->max_frm_len, "%d");
1570173139Srwatson	    xge_os_strcpy(key+6, "priority");
1571173139Srwatson	    __HAL_AUX_ENTRY(key, ring->priority,  "%u");
1572173139Srwatson	    xge_os_strcpy(key+6, "rth_en");
1573173139Srwatson	    __HAL_AUX_ENTRY(key, ring->rth_en,  "%u");
1574173139Srwatson	    xge_os_strcpy(key+6, "no_snoop_bits");
1575173139Srwatson	    __HAL_AUX_ENTRY(key, ring->no_snoop_bits,  "%u");
1576173139Srwatson	    xge_os_strcpy(key+6, "indicate_max_pkts");
1577173139Srwatson	    __HAL_AUX_ENTRY(key, ring->indicate_max_pkts,  "%u");
1578171095Ssam
1579173139Srwatson	    xge_os_strcpy(key+6, "urange_a");
1580173139Srwatson	    __HAL_AUX_ENTRY(key, rti->urange_a,  "%u");
1581173139Srwatson	    xge_os_strcpy(key+6, "ufc_a");
1582173139Srwatson	    __HAL_AUX_ENTRY(key, rti->ufc_a,  "%u");
1583173139Srwatson	    xge_os_strcpy(key+6, "urange_b");
1584173139Srwatson	    __HAL_AUX_ENTRY(key, rti->urange_b,  "%u");
1585173139Srwatson	    xge_os_strcpy(key+6, "ufc_b");
1586173139Srwatson	    __HAL_AUX_ENTRY(key, rti->ufc_b,  "%u");
1587173139Srwatson	    xge_os_strcpy(key+6, "urange_c");
1588173139Srwatson	    __HAL_AUX_ENTRY(key, rti->urange_c,  "%u");
1589173139Srwatson	    xge_os_strcpy(key+6, "ufc_c");
1590173139Srwatson	    __HAL_AUX_ENTRY(key, rti->ufc_c,  "%u");
1591173139Srwatson	    xge_os_strcpy(key+6, "ufc_d");
1592173139Srwatson	    __HAL_AUX_ENTRY(key, rti->ufc_d,  "%u");
1593173139Srwatson	    xge_os_strcpy(key+6, "timer_val_us");
1594173139Srwatson	    __HAL_AUX_ENTRY(key, rti->timer_val_us,  "%u");
1595171095Ssam	}
1596171095Ssam
1597171095Ssam
1598171095Ssam	{
1599173139Srwatson	    xge_hal_mac_config_t *mac= &dev_config->mac;
1600171095Ssam
1601173139Srwatson	    __HAL_AUX_ENTRY("tmac_util_period",
1602173139Srwatson	            mac->tmac_util_period, "%u");
1603173139Srwatson	    __HAL_AUX_ENTRY("rmac_util_period",
1604173139Srwatson	            mac->rmac_util_period, "%u");
1605173139Srwatson	    __HAL_AUX_ENTRY("rmac_bcast_en",
1606173139Srwatson	            mac->rmac_bcast_en, "%u");
1607173139Srwatson	    __HAL_AUX_ENTRY("rmac_pause_gen_en",
1608173139Srwatson	            mac->rmac_pause_gen_en, "%d");
1609173139Srwatson	    __HAL_AUX_ENTRY("rmac_pause_rcv_en",
1610173139Srwatson	            mac->rmac_pause_rcv_en, "%d");
1611173139Srwatson	    __HAL_AUX_ENTRY("rmac_pause_time",
1612173139Srwatson	            mac->rmac_pause_time, "%u");
1613173139Srwatson	    __HAL_AUX_ENTRY("mc_pause_threshold_q0q3",
1614173139Srwatson	            mac->mc_pause_threshold_q0q3, "%u");
1615173139Srwatson	    __HAL_AUX_ENTRY("mc_pause_threshold_q4q7",
1616173139Srwatson	            mac->mc_pause_threshold_q4q7, "%u");
1617171095Ssam	}
1618171095Ssam
1619171095Ssam
1620171095Ssam	__HAL_AUX_ENTRY("fifo_max_frags", dev_config->fifo.max_frags, "%u");
1621171095Ssam	__HAL_AUX_ENTRY("fifo_reserve_threshold",
1622173139Srwatson	        dev_config->fifo.reserve_threshold, "%u");
1623171095Ssam	__HAL_AUX_ENTRY("fifo_memblock_size",
1624173139Srwatson	        dev_config->fifo.memblock_size, "%u");
1625171095Ssam#ifdef XGE_HAL_ALIGN_XMIT
1626171095Ssam	__HAL_AUX_ENTRY("fifo_alignment_size",
1627173139Srwatson	        dev_config->fifo.alignment_size, "%u");
1628171095Ssam#endif
1629171095Ssam
1630171095Ssam	for (i = 0; i < XGE_HAL_MAX_FIFO_NUM;  i++) {
1631173139Srwatson	    int j;
1632173139Srwatson	    xge_hal_fifo_queue_t *fifo = &dev_config->fifo.queue[i];
1633171095Ssam
1634173139Srwatson	    if (!fifo->configured)
1635173139Srwatson	        continue;
1636171095Ssam
1637173139Srwatson	    (void) xge_os_sprintf(key, "fifo%d_", i);
1638173139Srwatson	    xge_os_strcpy(key+6, "initial");
1639173139Srwatson	    __HAL_AUX_ENTRY(key, fifo->initial, "%u");
1640173139Srwatson	    xge_os_strcpy(key+6, "max");
1641173139Srwatson	    __HAL_AUX_ENTRY(key, fifo->max, "%u");
1642173139Srwatson	    xge_os_strcpy(key+6, "intr");
1643173139Srwatson	    __HAL_AUX_ENTRY(key, fifo->intr, "%u");
1644173139Srwatson	    xge_os_strcpy(key+6, "no_snoop_bits");
1645173139Srwatson	    __HAL_AUX_ENTRY(key, fifo->no_snoop_bits, "%u");
1646171095Ssam
1647173139Srwatson	    for (j = 0; j < XGE_HAL_MAX_FIFO_TTI_NUM; j++) {
1648173139Srwatson	        xge_hal_tti_config_t *tti =
1649173139Srwatson	            &dev_config->fifo.queue[i].tti[j];
1650171095Ssam
1651173139Srwatson	        if (!tti->enabled)
1652173139Srwatson	            continue;
1653171095Ssam
1654173139Srwatson	        (void) xge_os_sprintf(key, "fifo%d_tti%02d_", i,
1655173139Srwatson	            i * XGE_HAL_MAX_FIFO_TTI_NUM + j);
1656173139Srwatson	        xge_os_strcpy(key+12, "urange_a");
1657173139Srwatson	        __HAL_AUX_ENTRY(key, tti->urange_a, "%u");
1658173139Srwatson	        xge_os_strcpy(key+12, "ufc_a");
1659173139Srwatson	        __HAL_AUX_ENTRY(key, tti->ufc_a, "%u");
1660173139Srwatson	        xge_os_strcpy(key+12, "urange_b");
1661173139Srwatson	        __HAL_AUX_ENTRY(key, tti->urange_b, "%u");
1662173139Srwatson	        xge_os_strcpy(key+12, "ufc_b");
1663173139Srwatson	        __HAL_AUX_ENTRY(key, tti->ufc_b, "%u");
1664173139Srwatson	        xge_os_strcpy(key+12, "urange_c");
1665173139Srwatson	        __HAL_AUX_ENTRY(key, tti->urange_c, "%u");
1666173139Srwatson	        xge_os_strcpy(key+12, "ufc_c");
1667173139Srwatson	        __HAL_AUX_ENTRY(key, tti->ufc_c, "%u");
1668173139Srwatson	        xge_os_strcpy(key+12, "ufc_d");
1669173139Srwatson	        __HAL_AUX_ENTRY(key, tti->ufc_d, "%u");
1670173139Srwatson	        xge_os_strcpy(key+12, "timer_val_us");
1671173139Srwatson	        __HAL_AUX_ENTRY(key, tti->timer_val_us, "%u");
1672173139Srwatson	        xge_os_strcpy(key+12, "timer_ci_en");
1673173139Srwatson	        __HAL_AUX_ENTRY(key, tti->timer_ci_en, "%u");
1674173139Srwatson	    }
1675171095Ssam	}
1676171095Ssam
1677171095Ssam	/* and bimodal TTIs */
1678171095Ssam	for (i=0; i<XGE_HAL_MAX_RING_NUM; i++) {
1679173139Srwatson	    xge_hal_tti_config_t *tti = &hldev->bimodal_tti[i];
1680171095Ssam
1681173139Srwatson	    if (!tti->enabled)
1682173139Srwatson	        continue;
1683171095Ssam
1684173139Srwatson	    (void) xge_os_sprintf(key, "tti%02d_",
1685173139Srwatson	              XGE_HAL_MAX_FIFO_TTI_RING_0 + i);
1686171095Ssam
1687173139Srwatson	    xge_os_strcpy(key+6, "urange_a");
1688173139Srwatson	    __HAL_AUX_ENTRY(key, tti->urange_a, "%u");
1689173139Srwatson	    xge_os_strcpy(key+6, "ufc_a");
1690173139Srwatson	    __HAL_AUX_ENTRY(key, tti->ufc_a, "%u");
1691173139Srwatson	    xge_os_strcpy(key+6, "urange_b");
1692173139Srwatson	    __HAL_AUX_ENTRY(key, tti->urange_b, "%u");
1693173139Srwatson	    xge_os_strcpy(key+6, "ufc_b");
1694173139Srwatson	    __HAL_AUX_ENTRY(key, tti->ufc_b, "%u");
1695173139Srwatson	    xge_os_strcpy(key+6, "urange_c");
1696173139Srwatson	    __HAL_AUX_ENTRY(key, tti->urange_c, "%u");
1697173139Srwatson	    xge_os_strcpy(key+6, "ufc_c");
1698173139Srwatson	    __HAL_AUX_ENTRY(key, tti->ufc_c, "%u");
1699173139Srwatson	    xge_os_strcpy(key+6, "ufc_d");
1700173139Srwatson	    __HAL_AUX_ENTRY(key, tti->ufc_d, "%u");
1701173139Srwatson	    xge_os_strcpy(key+6, "timer_val_us");
1702173139Srwatson	    __HAL_AUX_ENTRY(key, tti->timer_val_us, "%u");
1703173139Srwatson	    xge_os_strcpy(key+6, "timer_ac_en");
1704173139Srwatson	    __HAL_AUX_ENTRY(key, tti->timer_ac_en, "%u");
1705173139Srwatson	    xge_os_strcpy(key+6, "timer_ci_en");
1706173139Srwatson	    __HAL_AUX_ENTRY(key, tti->timer_ci_en, "%u");
1707171095Ssam	}
1708171095Ssam	__HAL_AUX_ENTRY("dump_on_serr", dev_config->dump_on_serr, "%u");
1709171095Ssam	__HAL_AUX_ENTRY("dump_on_eccerr",
1710173139Srwatson	        dev_config->dump_on_eccerr, "%u");
1711171095Ssam	__HAL_AUX_ENTRY("dump_on_parityerr",
1712173139Srwatson	        dev_config->dump_on_parityerr, "%u");
1713171095Ssam	__HAL_AUX_ENTRY("rth_en", dev_config->rth_en, "%u");
1714171095Ssam	__HAL_AUX_ENTRY("rth_bucket_size", dev_config->rth_bucket_size, "%u");
1715171095Ssam
1716171095Ssam	__HAL_AUX_ENTRY_END(bufsize, retsize);
1717171095Ssam
1718171095Ssam	xge_os_free(hldev->pdev, dev_config,
1719173139Srwatson	        sizeof(xge_hal_device_config_t));
1720171095Ssam
1721171095Ssam	return XGE_HAL_OK;
1722171095Ssam}
1723171095Ssam
1724