]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - sys/dev/nxge/xgehal/xgehal-mgmtaux.c
sys/dev: further adoption of SPDX licensing ID tags.
[FreeBSD/FreeBSD.git] / sys / dev / nxge / xgehal / xgehal-mgmtaux.c
1 /*-
2  * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
3  *
4  * Copyright (c) 2002-2007 Neterion, Inc.
5  * All rights reserved.
6  *
7  * Redistribution and use in source and binary forms, with or without
8  * modification, are permitted provided that the following conditions
9  * are met:
10  * 1. Redistributions of source code must retain the above copyright
11  *    notice, this list of conditions and the following disclaimer.
12  * 2. Redistributions in binary form must reproduce the above copyright
13  *    notice, this list of conditions and the following disclaimer in the
14  *    documentation and/or other materials provided with the distribution.
15  *
16  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
17  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
20  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
21  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
22  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
23  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
24  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
25  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
26  * SUCH DAMAGE.
27  *
28  * $FreeBSD$
29  */
30
31 #include <dev/nxge/include/xgehal-mgmt.h>
32 #include <dev/nxge/include/xgehal-driver.h>
33 #include <dev/nxge/include/xgehal-device.h>
34
35 #ifdef XGE_OS_HAS_SNPRINTF
36 #define __hal_aux_snprintf(retbuf, bufsize, fmt, key, value, retsize) \
37         if (bufsize <= 0) return XGE_HAL_ERR_OUT_OF_SPACE; \
38         retsize = xge_os_snprintf(retbuf, bufsize, fmt, key, \
39                 XGE_HAL_AUX_SEPA, value); \
40         if (retsize < 0 || retsize >= bufsize) return XGE_HAL_ERR_OUT_OF_SPACE;
41 #else
42 #define __hal_aux_snprintf(retbuf, bufsize, fmt, key, value, retsize) \
43         if (bufsize <= 0) return XGE_HAL_ERR_OUT_OF_SPACE; \
44             retsize = xge_os_sprintf(retbuf, fmt, key, XGE_HAL_AUX_SEPA, value); \
45         xge_assert(retsize < bufsize); \
46         if (retsize < 0 || retsize >= bufsize) \
47             return XGE_HAL_ERR_OUT_OF_SPACE;
48 #endif
49
50 #define __HAL_AUX_ENTRY_DECLARE(size, buf) \
51         int entrysize = 0, leftsize = size; \
52         char *ptr = buf;
53
54 #define __HAL_AUX_ENTRY(key, value, fmt) \
55         ptr += entrysize; leftsize -= entrysize; \
56         __hal_aux_snprintf(ptr, leftsize, "%s%c"fmt"\n", key, value, entrysize)
57
58 #define __HAL_AUX_ENTRY_END(bufsize, retsize) \
59         leftsize -= entrysize; \
60         *retsize = bufsize - leftsize;
61
62 #define __hal_aux_pci_link_info(name, index, var) { \
63             __HAL_AUX_ENTRY(name,           \
64             (unsigned long long)pcim.link_info[index].var, "%llu") \
65         }
66
67 #define __hal_aux_pci_aggr_info(name, index, var) { \
68             __HAL_AUX_ENTRY(name,               \
69             (unsigned long long)pcim.aggr_info[index].var, "%llu") \
70         }
71
72 /**
73  * xge_hal_aux_bar0_read - Read and format Xframe BAR0 register.
74  * @devh: HAL device handle.
75  * @offset: Register offset in the BAR0 space.
76  * @bufsize: Buffer size.
77  * @retbuf: Buffer pointer.
78  * @retsize: Size of the result. Cannot be greater than @bufsize.
79  *
80  * Read Xframe register from BAR0 space. The result is formatted as an ascii string.
81  *
82  * Returns: XGE_HAL_OK - success.
83  * XGE_HAL_ERR_OUT_OF_SPACE - Buffer size is very small.
84  * XGE_HAL_ERR_INVALID_DEVICE - Device is not valid.
85  * XGE_HAL_ERR_INVALID_OFFSET - Register offset in the BAR space is not
86  * valid.
87  * XGE_HAL_ERR_INVALID_BAR_ID - BAR id is not valid.
88  *
89  * See also: xge_hal_mgmt_reg_read().
90  */
91 xge_hal_status_e xge_hal_aux_bar0_read(xge_hal_device_h devh,
92                 unsigned int offset, int bufsize, char *retbuf,
93                 int *retsize)
94 {
95         xge_hal_status_e status;
96         u64 retval;
97
98         status = xge_hal_mgmt_reg_read(devh, 0, offset, &retval);
99         if (status != XGE_HAL_OK) {
100             return status;
101         }
102
103         if (bufsize < XGE_OS_SPRINTF_STRLEN) {
104             return XGE_HAL_ERR_OUT_OF_SPACE;
105         }
106
107         *retsize = xge_os_sprintf(retbuf, "0x%04X%c0x%08X%08X\n", offset,
108                     XGE_HAL_AUX_SEPA, (u32)(retval>>32), (u32)retval);
109
110         return XGE_HAL_OK;
111 }
112
113 /**
114  * xge_hal_aux_bar1_read - Read and format Xframe BAR1 register.
115  * @devh: HAL device handle.
116  * @offset: Register offset in the BAR1 space.
117  * @bufsize: Buffer size.
118  * @retbuf: Buffer pointer.
119  * @retsize: Size of the result. Cannot be greater than @bufsize.
120  *
121  * Read Xframe register from BAR1 space. The result is formatted as ascii string.
122  * Returns: XGE_HAL_OK - success.
123  * XGE_HAL_ERR_OUT_OF_SPACE - Buffer size is very small.
124  * XGE_HAL_ERR_INVALID_DEVICE - Device is not valid.
125  * XGE_HAL_ERR_INVALID_OFFSET - Register offset in the BAR space is not
126  * valid.
127  * XGE_HAL_ERR_INVALID_BAR_ID - BAR id is not valid.
128  *
129  * See also: xge_hal_mgmt_reg_read().
130  */
131 xge_hal_status_e xge_hal_aux_bar1_read(xge_hal_device_h devh,
132                 unsigned int offset, int bufsize, char *retbuf,
133                 int *retsize)
134 {
135         xge_hal_status_e status;
136         u64 retval;
137
138         status = xge_hal_mgmt_reg_read(devh, 1, offset, &retval);
139         if (status != XGE_HAL_OK) {
140             return status;
141         }
142
143         if (bufsize < XGE_OS_SPRINTF_STRLEN) {
144             return XGE_HAL_ERR_OUT_OF_SPACE;
145         }
146
147             *retsize = xge_os_sprintf(retbuf, "0x%04X%c0x%08X%08X\n",
148             offset,
149                     XGE_HAL_AUX_SEPA, (u32)(retval>>32), (u32)retval);
150
151         return XGE_HAL_OK;
152 }
153
154 /**
155  * xge_hal_aux_bar0_write - Write BAR0 register.
156  * @devh: HAL device handle.
157  * @offset: Register offset in the BAR0 space.
158  * @value: Regsister value (to write).
159  *
160  * Write BAR0 register.
161  *
162  * Returns: XGE_HAL_OK - success.
163  * XGE_HAL_ERR_INVALID_DEVICE - Device is not valid.
164  * XGE_HAL_ERR_INVALID_OFFSET - Register offset in the BAR space is not
165  * valid.
166  * XGE_HAL_ERR_INVALID_BAR_ID - BAR id is not valid.
167  *
168  * See also: xge_hal_mgmt_reg_write().
169  */
170 xge_hal_status_e xge_hal_aux_bar0_write(xge_hal_device_h devh,
171                 unsigned int offset, u64 value)
172 {
173         xge_hal_status_e status;
174
175         status = xge_hal_mgmt_reg_write(devh, 0, offset, value);
176         if (status != XGE_HAL_OK) {
177             return status;
178         }
179
180         return XGE_HAL_OK;
181 }
182
183 /**
184  * xge_hal_aux_about_read - Retrieve and format about info.
185  * @devh: HAL device handle.
186  * @bufsize: Buffer size.
187  * @retbuf: Buffer pointer.
188  * @retsize: Size of the result. Cannot be greater than @bufsize.
189  *
190  * Retrieve about info (using xge_hal_mgmt_about()) and sprintf it
191  * into the provided @retbuf.
192  *
193  * Returns: XGE_HAL_OK - success.
194  * XGE_HAL_ERR_INVALID_DEVICE - Device is not valid.
195  * XGE_HAL_ERR_VERSION_CONFLICT - Version it not maching.
196  * XGE_HAL_FAIL - Failed to retrieve the information.
197  *
198  * See also: xge_hal_mgmt_about(), xge_hal_aux_device_dump().
199  */
200 xge_hal_status_e xge_hal_aux_about_read(xge_hal_device_h devh, int bufsize,
201                 char *retbuf, int *retsize)
202 {
203         xge_hal_status_e status;
204         xge_hal_mgmt_about_info_t about_info;
205         __HAL_AUX_ENTRY_DECLARE(bufsize, retbuf);
206
207         status = xge_hal_mgmt_about(devh, &about_info,
208                       sizeof(xge_hal_mgmt_about_info_t));
209         if (status != XGE_HAL_OK) {
210             return status;
211         }
212
213         __HAL_AUX_ENTRY("vendor", about_info.vendor, "0x%x");
214         __HAL_AUX_ENTRY("device", about_info.device, "0x%x");
215         __HAL_AUX_ENTRY("subsys_vendor", about_info.subsys_vendor, "0x%x");
216         __HAL_AUX_ENTRY("subsys_device", about_info.subsys_device, "0x%x");
217         __HAL_AUX_ENTRY("board_rev", about_info.board_rev, "0x%x");
218         __HAL_AUX_ENTRY("vendor_name", about_info.vendor_name, "%s");
219         __HAL_AUX_ENTRY("chip_name", about_info.chip_name, "%s");
220         __HAL_AUX_ENTRY("media", about_info.media, "%s");
221         __HAL_AUX_ENTRY("hal_major", about_info.hal_major, "%s");
222         __HAL_AUX_ENTRY("hal_minor", about_info.hal_minor, "%s");
223         __HAL_AUX_ENTRY("hal_fix", about_info.hal_fix, "%s");
224         __HAL_AUX_ENTRY("hal_build", about_info.hal_build, "%s");
225         __HAL_AUX_ENTRY("ll_major", about_info.ll_major, "%s");
226         __HAL_AUX_ENTRY("ll_minor", about_info.ll_minor, "%s");
227         __HAL_AUX_ENTRY("ll_fix", about_info.ll_fix, "%s");
228         __HAL_AUX_ENTRY("ll_build", about_info.ll_build, "%s");
229
230         __HAL_AUX_ENTRY("transponder_temperature",
231                 about_info.transponder_temperature, "%d C");
232
233         __HAL_AUX_ENTRY_END(bufsize, retsize);
234
235         return XGE_HAL_OK;
236 }
237
238 /**
239  * xge_hal_aux_stats_tmac_read - Read TMAC hardware statistics.
240  * @devh: HAL device handle.
241  * @bufsize: Buffer size.
242  * @retbuf: Buffer pointer.
243  * @retsize: Size of the result. Cannot be greater than @bufsize.
244  *
245  * Read TMAC hardware statistics. This is a subset of stats counters
246  * from xge_hal_stats_hw_info_t{}.
247  *
248  * Returns: XGE_HAL_OK - success.
249  * XGE_HAL_ERR_INVALID_DEVICE - Device is not valid.
250  * XGE_HAL_ERR_VERSION_CONFLICT - Version it not maching.
251  *
252  * See also: xge_hal_mgmt_hw_stats{}, xge_hal_stats_hw_info_t{},
253  * xge_hal_aux_stats_pci_read(),
254  * xge_hal_aux_device_dump().
255  */
256 xge_hal_status_e xge_hal_aux_stats_tmac_read(xge_hal_device_h devh, int bufsize,
257                     char *retbuf, int *retsize)
258 {
259         xge_hal_status_e status;
260         xge_hal_device_t *hldev = (xge_hal_device_t*)devh;
261
262         __HAL_AUX_ENTRY_DECLARE(bufsize, retbuf);
263
264         if (xge_hal_device_check_id(hldev) != XGE_HAL_CARD_TITAN) {
265             xge_hal_mgmt_hw_stats_t hw;
266
267             status = xge_hal_mgmt_hw_stats(devh, &hw,
268                          sizeof(xge_hal_mgmt_hw_stats_t));
269             if (status != XGE_HAL_OK) {
270                 return status;
271             }
272
273             __HAL_AUX_ENTRY("tmac_data_octets", hw.tmac_data_octets, "%u");
274             __HAL_AUX_ENTRY("tmac_frms", hw.tmac_frms, "%u");
275             __HAL_AUX_ENTRY("tmac_drop_frms", (unsigned long long)
276                     hw.tmac_drop_frms, "%llu");
277             __HAL_AUX_ENTRY("tmac_bcst_frms", hw.tmac_bcst_frms, "%u");
278             __HAL_AUX_ENTRY("tmac_mcst_frms", hw.tmac_mcst_frms, "%u");
279             __HAL_AUX_ENTRY("tmac_pause_ctrl_frms", (unsigned long long)
280                 hw.tmac_pause_ctrl_frms, "%llu");
281             __HAL_AUX_ENTRY("tmac_ucst_frms", hw.tmac_ucst_frms, "%u");
282             __HAL_AUX_ENTRY("tmac_ttl_octets", hw.tmac_ttl_octets, "%u");
283             __HAL_AUX_ENTRY("tmac_any_err_frms", hw.tmac_any_err_frms, "%u");
284             __HAL_AUX_ENTRY("tmac_nucst_frms", hw.tmac_nucst_frms, "%u");
285             __HAL_AUX_ENTRY("tmac_ttl_less_fb_octets", (unsigned long long)
286                 hw.tmac_ttl_less_fb_octets, "%llu");
287             __HAL_AUX_ENTRY("tmac_vld_ip_octets", (unsigned long long)
288                 hw.tmac_vld_ip_octets, "%llu");
289             __HAL_AUX_ENTRY("tmac_drop_ip", hw.tmac_drop_ip, "%u");
290             __HAL_AUX_ENTRY("tmac_vld_ip", hw.tmac_vld_ip, "%u");
291             __HAL_AUX_ENTRY("tmac_rst_tcp", hw.tmac_rst_tcp, "%u");
292             __HAL_AUX_ENTRY("tmac_icmp", hw.tmac_icmp, "%u");
293             __HAL_AUX_ENTRY("tmac_tcp", (unsigned long long)
294                 hw.tmac_tcp, "%llu");
295             __HAL_AUX_ENTRY("reserved_0", hw.reserved_0, "%u");
296             __HAL_AUX_ENTRY("tmac_udp", hw.tmac_udp, "%u");
297         } else {
298             int i;
299             xge_hal_mgmt_pcim_stats_t pcim;
300             status = xge_hal_mgmt_pcim_stats(devh, &pcim,
301                          sizeof(xge_hal_mgmt_pcim_stats_t));
302             if (status != XGE_HAL_OK) {
303                 return status;
304             }
305
306             for (i = 0; i < XGE_HAL_MAC_LINKS; i++) {
307                 __hal_aux_pci_link_info("tx_frms", i,
308                     tx_frms);
309                 __hal_aux_pci_link_info("tx_ttl_eth_octets",
310                     i, tx_ttl_eth_octets );
311                 __hal_aux_pci_link_info("tx_data_octets", i,
312                     tx_data_octets);
313                 __hal_aux_pci_link_info("tx_mcst_frms", i,
314                     tx_mcst_frms);
315                 __hal_aux_pci_link_info("tx_bcst_frms", i,
316                     tx_bcst_frms);
317                 __hal_aux_pci_link_info("tx_ucst_frms", i,
318                     tx_ucst_frms);
319                 __hal_aux_pci_link_info("tx_tagged_frms", i,
320                     tx_tagged_frms);
321                 __hal_aux_pci_link_info("tx_vld_ip", i,
322                     tx_vld_ip);
323                 __hal_aux_pci_link_info("tx_vld_ip_octets", i,
324                     tx_vld_ip_octets);
325                 __hal_aux_pci_link_info("tx_icmp", i,
326                     tx_icmp);
327                 __hal_aux_pci_link_info("tx_tcp", i,
328                     tx_tcp);
329                 __hal_aux_pci_link_info("tx_rst_tcp", i,
330                     tx_rst_tcp);
331                 __hal_aux_pci_link_info("tx_udp", i,
332                     tx_udp);
333                 __hal_aux_pci_link_info("tx_unknown_protocol", i,
334                     tx_unknown_protocol);
335                 __hal_aux_pci_link_info("tx_parse_error", i,
336                     tx_parse_error);
337                 __hal_aux_pci_link_info("tx_pause_ctrl_frms", i,
338                     tx_pause_ctrl_frms);
339                 __hal_aux_pci_link_info("tx_lacpdu_frms", i,
340                     tx_lacpdu_frms);
341                 __hal_aux_pci_link_info("tx_marker_pdu_frms", i,
342                     tx_marker_pdu_frms);
343                 __hal_aux_pci_link_info("tx_marker_resp_pdu_frms", i,
344                     tx_marker_resp_pdu_frms);
345                 __hal_aux_pci_link_info("tx_drop_ip", i,
346                     tx_drop_ip);
347                 __hal_aux_pci_link_info("tx_xgmii_char1_match", i,
348                     tx_xgmii_char1_match);
349                 __hal_aux_pci_link_info("tx_xgmii_char2_match", i,
350                     tx_xgmii_char2_match);
351                 __hal_aux_pci_link_info("tx_xgmii_column1_match", i,
352                     tx_xgmii_column1_match);
353                 __hal_aux_pci_link_info("tx_xgmii_column2_match", i,
354                     tx_xgmii_column2_match);
355                 __hal_aux_pci_link_info("tx_drop_frms", i,
356                     tx_drop_frms);
357                 __hal_aux_pci_link_info("tx_any_err_frms", i,
358                     tx_any_err_frms);
359             }
360
361             for (i = 0; i < XGE_HAL_MAC_AGGREGATORS; i++) {
362                 __hal_aux_pci_aggr_info("tx_frms", i, tx_frms);
363                 __hal_aux_pci_aggr_info("tx_mcst_frms", i,
364                     tx_mcst_frms);
365                 __hal_aux_pci_aggr_info("tx_bcst_frms", i,
366                     tx_bcst_frms);
367                 __hal_aux_pci_aggr_info("tx_discarded_frms", i,
368                     tx_discarded_frms);
369                 __hal_aux_pci_aggr_info("tx_errored_frms", i,
370                     tx_errored_frms);
371             }
372         }
373
374         __HAL_AUX_ENTRY_END(bufsize, retsize);
375
376         return XGE_HAL_OK;
377 }
378
379 /**
380  * xge_hal_aux_stats_rmac_read - Read RMAC hardware statistics.
381  * @devh: HAL device handle.
382  * @bufsize: Buffer size.
383  * @retbuf: Buffer pointer.
384  * @retsize: Size of the result. Cannot be greater than @bufsize.
385  *
386  * Read RMAC hardware statistics. This is a subset of stats counters
387  * from xge_hal_stats_hw_info_t{}.
388  *
389  * Returns: XGE_HAL_OK - success.
390  * XGE_HAL_ERR_INVALID_DEVICE - Device is not valid.
391  * XGE_HAL_ERR_VERSION_CONFLICT - Version it not maching.
392  *
393  * See also: xge_hal_mgmt_hw_stats{}, xge_hal_stats_hw_info_t{},
394  * xge_hal_aux_stats_pci_read(), xge_hal_aux_stats_tmac_read(),
395  * xge_hal_aux_device_dump().
396  */
397 xge_hal_status_e xge_hal_aux_stats_rmac_read(xge_hal_device_h devh, int bufsize,
398                     char *retbuf, int *retsize)
399 {
400         xge_hal_status_e status;
401         xge_hal_device_t *hldev = (xge_hal_device_t*)devh;
402
403         __HAL_AUX_ENTRY_DECLARE(bufsize, retbuf);
404
405         if (xge_hal_device_check_id(hldev) != XGE_HAL_CARD_TITAN) {
406             xge_hal_mgmt_hw_stats_t hw;
407
408             status = xge_hal_mgmt_hw_stats(devh, &hw,
409                          sizeof(xge_hal_mgmt_hw_stats_t));
410             if (status != XGE_HAL_OK) {
411                 return status;
412             }
413
414             __HAL_AUX_ENTRY("rmac_data_octets", hw.rmac_data_octets, "%u");
415             __HAL_AUX_ENTRY("rmac_vld_frms", hw.rmac_vld_frms, "%u");
416             __HAL_AUX_ENTRY("rmac_fcs_err_frms", (unsigned long long)
417                     hw.rmac_fcs_err_frms, "%llu");
418             __HAL_AUX_ENTRY("mac_drop_frms", (unsigned long long)
419                     hw.rmac_drop_frms, "%llu");
420             __HAL_AUX_ENTRY("rmac_vld_bcst_frms", hw.rmac_vld_bcst_frms,
421                     "%u");
422             __HAL_AUX_ENTRY("rmac_vld_mcst_frms", hw.rmac_vld_mcst_frms,
423                     "%u");
424             __HAL_AUX_ENTRY("rmac_out_rng_len_err_frms",
425                     hw.rmac_out_rng_len_err_frms, "%u");
426             __HAL_AUX_ENTRY("rmac_in_rng_len_err_frms",
427                     hw.rmac_in_rng_len_err_frms, "%u");
428             __HAL_AUX_ENTRY("rmac_long_frms", (unsigned long long)
429                     hw.rmac_long_frms, "%llu");
430             __HAL_AUX_ENTRY("rmac_pause_ctrl_frms", (unsigned long long)
431                     hw.rmac_pause_ctrl_frms, "%llu");
432             __HAL_AUX_ENTRY("rmac_unsup_ctrl_frms", (unsigned long long)
433                     hw.rmac_unsup_ctrl_frms, "%llu");
434             __HAL_AUX_ENTRY("rmac_accepted_ucst_frms",
435                     hw.rmac_accepted_ucst_frms, "%u");
436             __HAL_AUX_ENTRY("rmac_ttl_octets", hw.rmac_ttl_octets, "%u");
437             __HAL_AUX_ENTRY("rmac_discarded_frms", hw.rmac_discarded_frms,
438                 "%u");
439             __HAL_AUX_ENTRY("rmac_accepted_nucst_frms",
440                     hw.rmac_accepted_nucst_frms, "%u");
441             __HAL_AUX_ENTRY("reserved_1", hw.reserved_1, "%u");
442             __HAL_AUX_ENTRY("rmac_drop_events", hw.rmac_drop_events, "%u");
443             __HAL_AUX_ENTRY("rmac_ttl_less_fb_octets", (unsigned long long)
444                     hw.rmac_ttl_less_fb_octets, "%llu");
445             __HAL_AUX_ENTRY("rmac_ttl_frms", (unsigned long long)
446                     hw.rmac_ttl_frms, "%llu");
447             __HAL_AUX_ENTRY("reserved_2", (unsigned long long)
448                     hw.reserved_2, "%llu");
449             __HAL_AUX_ENTRY("rmac_usized_frms", hw.rmac_usized_frms, "%u");
450             __HAL_AUX_ENTRY("reserved_3", hw.reserved_3, "%u");
451             __HAL_AUX_ENTRY("rmac_frag_frms", hw.rmac_frag_frms, "%u");
452             __HAL_AUX_ENTRY("rmac_osized_frms", hw.rmac_osized_frms, "%u");
453             __HAL_AUX_ENTRY("reserved_4", hw.reserved_4, "%u");
454             __HAL_AUX_ENTRY("rmac_jabber_frms", hw.rmac_jabber_frms, "%u");
455             __HAL_AUX_ENTRY("rmac_ttl_64_frms", (unsigned long long)
456                     hw.rmac_ttl_64_frms, "%llu");
457             __HAL_AUX_ENTRY("rmac_ttl_65_127_frms", (unsigned long long)
458                     hw.rmac_ttl_65_127_frms, "%llu");
459             __HAL_AUX_ENTRY("reserved_5", (unsigned long long)
460                     hw.reserved_5, "%llu");
461             __HAL_AUX_ENTRY("rmac_ttl_128_255_frms", (unsigned long long)
462                     hw.rmac_ttl_128_255_frms, "%llu");
463             __HAL_AUX_ENTRY("rmac_ttl_256_511_frms", (unsigned long long)
464                     hw.rmac_ttl_256_511_frms, "%llu");
465             __HAL_AUX_ENTRY("reserved_6", (unsigned long long)
466                     hw.reserved_6, "%llu");
467             __HAL_AUX_ENTRY("rmac_ttl_512_1023_frms", (unsigned long long)
468                     hw.rmac_ttl_512_1023_frms, "%llu");
469             __HAL_AUX_ENTRY("rmac_ttl_1024_1518_frms", (unsigned long long)
470                     hw.rmac_ttl_1024_1518_frms, "%llu");
471             __HAL_AUX_ENTRY("rmac_ip", hw.rmac_ip, "%u");
472             __HAL_AUX_ENTRY("reserved_7", hw.reserved_7, "%u");
473             __HAL_AUX_ENTRY("rmac_ip_octets", (unsigned long long)
474                     hw.rmac_ip_octets, "%llu");
475             __HAL_AUX_ENTRY("rmac_drop_ip", hw.rmac_drop_ip, "%u");
476             __HAL_AUX_ENTRY("rmac_hdr_err_ip", hw.rmac_hdr_err_ip, "%u");
477             __HAL_AUX_ENTRY("reserved_8", hw.reserved_8, "%u");
478             __HAL_AUX_ENTRY("rmac_icmp", hw.rmac_icmp, "%u");
479             __HAL_AUX_ENTRY("rmac_tcp", (unsigned long long)
480                     hw.rmac_tcp, "%llu");
481             __HAL_AUX_ENTRY("rmac_err_drp_udp", hw.rmac_err_drp_udp, "%u");
482             __HAL_AUX_ENTRY("rmac_udp", hw.rmac_udp, "%u");
483             __HAL_AUX_ENTRY("rmac_xgmii_err_sym", (unsigned long long)
484                     hw.rmac_xgmii_err_sym, "%llu");
485             __HAL_AUX_ENTRY("rmac_frms_q0", (unsigned long long)
486                     hw.rmac_frms_q0, "%llu");
487             __HAL_AUX_ENTRY("rmac_frms_q1", (unsigned long long)
488                     hw.rmac_frms_q1, "%llu");
489             __HAL_AUX_ENTRY("rmac_frms_q2", (unsigned long long)
490                     hw.rmac_frms_q2, "%llu");
491             __HAL_AUX_ENTRY("rmac_frms_q3", (unsigned long long)
492                     hw.rmac_frms_q3, "%llu");
493             __HAL_AUX_ENTRY("rmac_frms_q4", (unsigned long long)
494                     hw.rmac_frms_q4, "%llu");
495             __HAL_AUX_ENTRY("rmac_frms_q5", (unsigned long long)
496                     hw.rmac_frms_q5, "%llu");
497             __HAL_AUX_ENTRY("rmac_frms_q6", (unsigned long long)
498                     hw.rmac_frms_q6, "%llu");
499             __HAL_AUX_ENTRY("rmac_frms_q7", (unsigned long long)
500                     hw.rmac_frms_q7, "%llu");
501             __HAL_AUX_ENTRY("rmac_full_q3", hw.rmac_full_q3, "%d");
502             __HAL_AUX_ENTRY("rmac_full_q2", hw.rmac_full_q2, "%d");
503             __HAL_AUX_ENTRY("rmac_full_q1", hw.rmac_full_q1, "%d");
504             __HAL_AUX_ENTRY("rmac_full_q0", hw.rmac_full_q0, "%d");
505             __HAL_AUX_ENTRY("rmac_full_q7", hw.rmac_full_q7, "%d");
506             __HAL_AUX_ENTRY("rmac_full_q6", hw.rmac_full_q6, "%d");
507             __HAL_AUX_ENTRY("rmac_full_q5", hw.rmac_full_q5, "%d");
508             __HAL_AUX_ENTRY("rmac_full_q4", hw.rmac_full_q4, "%d");
509             __HAL_AUX_ENTRY("reserved_9", hw.reserved_9, "%u");
510             __HAL_AUX_ENTRY("rmac_pause_cnt", hw.rmac_pause_cnt, "%u");
511             __HAL_AUX_ENTRY("rmac_xgmii_data_err_cnt", (unsigned long long)
512                     hw.rmac_xgmii_data_err_cnt, "%llu");
513             __HAL_AUX_ENTRY("rmac_xgmii_ctrl_err_cnt", (unsigned long long)
514                     hw.rmac_xgmii_ctrl_err_cnt, "%llu");
515             __HAL_AUX_ENTRY("rmac_err_tcp", hw.rmac_err_tcp, "%u");
516             __HAL_AUX_ENTRY("rmac_accepted_ip", hw.rmac_accepted_ip, "%u");
517         } else {
518             int i;
519             xge_hal_mgmt_pcim_stats_t pcim;
520             status = xge_hal_mgmt_pcim_stats(devh, &pcim,
521                          sizeof(xge_hal_mgmt_pcim_stats_t));
522             if (status != XGE_HAL_OK) {
523                 return status;
524             }
525             for (i = 0; i < XGE_HAL_MAC_LINKS; i++) {
526                 __hal_aux_pci_link_info("rx_ttl_frms", i,
527                     rx_ttl_frms);
528                 __hal_aux_pci_link_info("rx_vld_frms", i,
529                     rx_vld_frms);
530                 __hal_aux_pci_link_info("rx_offld_frms", i,
531                     rx_offld_frms);
532                 __hal_aux_pci_link_info("rx_ttl_eth_octets", i,
533                     rx_ttl_eth_octets);
534                 __hal_aux_pci_link_info("rx_data_octets", i,
535                     rx_data_octets);
536                 __hal_aux_pci_link_info("rx_offld_octets", i,
537                     rx_offld_octets);
538                 __hal_aux_pci_link_info("rx_vld_mcst_frms", i,
539                     rx_vld_mcst_frms);
540                 __hal_aux_pci_link_info("rx_vld_bcst_frms", i,
541                     rx_vld_bcst_frms);
542                 __hal_aux_pci_link_info("rx_accepted_ucst_frms", i,
543                     rx_accepted_ucst_frms);
544                 __hal_aux_pci_link_info("rx_accepted_nucst_frms", i,
545                     rx_accepted_nucst_frms);
546                 __hal_aux_pci_link_info("rx_tagged_frms", i,
547                     rx_tagged_frms);
548                 __hal_aux_pci_link_info("rx_long_frms", i,
549                     rx_long_frms);
550                 __hal_aux_pci_link_info("rx_usized_frms", i,
551                     rx_usized_frms);
552                 __hal_aux_pci_link_info("rx_osized_frms", i,
553                     rx_osized_frms);
554                 __hal_aux_pci_link_info("rx_frag_frms", i,
555                     rx_frag_frms);
556                 __hal_aux_pci_link_info("rx_jabber_frms", i,
557                     rx_jabber_frms);
558                 __hal_aux_pci_link_info("rx_ttl_64_frms", i,
559                     rx_ttl_64_frms);
560                 __hal_aux_pci_link_info("rx_ttl_65_127_frms", i,
561                     rx_ttl_65_127_frms);
562                 __hal_aux_pci_link_info("rx_ttl_128_255_frms", i,
563                     rx_ttl_128_255_frms);
564                 __hal_aux_pci_link_info("rx_ttl_256_511_frms", i,
565                     rx_ttl_256_511_frms);
566                 __hal_aux_pci_link_info("rx_ttl_512_1023_frms", i,
567                     rx_ttl_512_1023_frms);
568                 __hal_aux_pci_link_info("rx_ttl_1024_1518_frms", i,
569                     rx_ttl_1024_1518_frms);
570                 __hal_aux_pci_link_info("rx_ttl_1519_4095_frms", i,
571                     rx_ttl_1519_4095_frms);
572                 __hal_aux_pci_link_info("rx_ttl_40956_8191_frms", i,
573                     rx_ttl_40956_8191_frms);
574                 __hal_aux_pci_link_info("rx_ttl_8192_max_frms", i,
575                     rx_ttl_8192_max_frms);
576                 __hal_aux_pci_link_info("rx_ttl_gt_max_frms", i,
577                     rx_ttl_gt_max_frms);
578                 __hal_aux_pci_link_info("rx_ip", i,
579                     rx_ip);
580                 __hal_aux_pci_link_info("rx_ip_octets", i,
581                     rx_ip_octets);
582
583                 __hal_aux_pci_link_info("rx_hdr_err_ip", i,
584                     rx_hdr_err_ip);
585
586                 __hal_aux_pci_link_info("rx_icmp", i,
587                     rx_icmp);
588                 __hal_aux_pci_link_info("rx_tcp", i,
589                     rx_tcp);
590                 __hal_aux_pci_link_info("rx_udp", i,
591                     rx_udp);
592                 __hal_aux_pci_link_info("rx_err_tcp", i,
593                     rx_err_tcp);
594                 __hal_aux_pci_link_info("rx_pause_cnt", i,
595                     rx_pause_cnt);
596                 __hal_aux_pci_link_info("rx_pause_ctrl_frms", i,
597                     rx_pause_ctrl_frms);
598                 __hal_aux_pci_link_info("rx_unsup_ctrl_frms", i,
599                     rx_pause_cnt);
600                 __hal_aux_pci_link_info("rx_in_rng_len_err_frms", i,
601                     rx_in_rng_len_err_frms);
602                 __hal_aux_pci_link_info("rx_out_rng_len_err_frms", i,
603                     rx_out_rng_len_err_frms);
604                 __hal_aux_pci_link_info("rx_drop_frms", i,
605                     rx_drop_frms);
606                 __hal_aux_pci_link_info("rx_discarded_frms", i,
607                     rx_discarded_frms);
608                 __hal_aux_pci_link_info("rx_drop_ip", i,
609                     rx_drop_ip);
610                 __hal_aux_pci_link_info("rx_err_drp_udp", i,
611                     rx_err_drp_udp);
612                 __hal_aux_pci_link_info("rx_lacpdu_frms", i,
613                     rx_lacpdu_frms);
614                 __hal_aux_pci_link_info("rx_marker_pdu_frms", i,
615                     rx_marker_pdu_frms);
616                 __hal_aux_pci_link_info("rx_marker_resp_pdu_frms", i,
617                     rx_marker_resp_pdu_frms);
618                 __hal_aux_pci_link_info("rx_unknown_pdu_frms", i,
619                     rx_unknown_pdu_frms);
620                 __hal_aux_pci_link_info("rx_illegal_pdu_frms", i,
621                     rx_illegal_pdu_frms);
622                 __hal_aux_pci_link_info("rx_fcs_discard", i,
623                     rx_fcs_discard);
624                 __hal_aux_pci_link_info("rx_len_discard", i,
625                     rx_len_discard);
626                 __hal_aux_pci_link_info("rx_pf_discard", i,
627                     rx_pf_discard);
628                 __hal_aux_pci_link_info("rx_trash_discard", i,
629                     rx_trash_discard);
630                 __hal_aux_pci_link_info("rx_rts_discard", i,
631                     rx_trash_discard);
632                 __hal_aux_pci_link_info("rx_wol_discard", i,
633                     rx_wol_discard);
634                 __hal_aux_pci_link_info("rx_red_discard", i,
635                     rx_red_discard);
636                 __hal_aux_pci_link_info("rx_ingm_full_discard", i,
637                     rx_ingm_full_discard);
638                 __hal_aux_pci_link_info("rx_xgmii_data_err_cnt", i,
639                     rx_xgmii_data_err_cnt);
640                 __hal_aux_pci_link_info("rx_xgmii_ctrl_err_cnt", i,
641                     rx_xgmii_ctrl_err_cnt);
642                 __hal_aux_pci_link_info("rx_xgmii_err_sym", i,
643                     rx_xgmii_err_sym);
644                 __hal_aux_pci_link_info("rx_xgmii_char1_match", i,
645                     rx_xgmii_char1_match);
646                 __hal_aux_pci_link_info("rx_xgmii_char2_match", i,
647                     rx_xgmii_char2_match);
648                 __hal_aux_pci_link_info("rx_xgmii_column1_match", i,
649                     rx_xgmii_column1_match);
650                 __hal_aux_pci_link_info("rx_xgmii_column2_match", i,
651                     rx_xgmii_column2_match);
652                 __hal_aux_pci_link_info("rx_local_fault", i,
653                     rx_local_fault);
654                 __hal_aux_pci_link_info("rx_remote_fault", i,
655                     rx_remote_fault);
656                 __hal_aux_pci_link_info("rx_queue_full", i,
657                     rx_queue_full);
658             }
659             for (i = 0; i < XGE_HAL_MAC_AGGREGATORS; i++) {
660                 __hal_aux_pci_aggr_info("rx_frms", i, rx_frms);
661                 __hal_aux_pci_link_info("rx_data_octets", i,
662                     rx_data_octets);
663                 __hal_aux_pci_aggr_info("rx_mcst_frms", i,
664                     rx_mcst_frms);
665                 __hal_aux_pci_aggr_info("rx_bcst_frms", i,
666                     rx_bcst_frms);
667                 __hal_aux_pci_aggr_info("rx_discarded_frms", i,
668                     rx_discarded_frms);
669                 __hal_aux_pci_aggr_info("rx_errored_frms", i,
670                     rx_errored_frms);
671                 __hal_aux_pci_aggr_info("rx_unknown_protocol_frms", i,
672                     rx_unknown_protocol_frms);
673             }
674
675         }
676         __HAL_AUX_ENTRY_END(bufsize, retsize);
677
678         return XGE_HAL_OK;
679 }
680
681 /**
682  * xge_hal_aux_stats_herc_enchanced - Get Hercules hardware statistics.
683  * @devh: HAL device handle.
684  * @bufsize: Buffer size.
685  * @retbuf: Buffer pointer.
686  * @retsize: Size of the result. Cannot be greater than @bufsize.
687  *
688  * Read Hercules device hardware statistics.
689  *
690  * Returns: XGE_HAL_OK - success.
691  * XGE_HAL_ERR_INVALID_DEVICE - Device is not valid.
692  * XGE_HAL_ERR_VERSION_CONFLICT - Version it not maching.
693  *
694  * See also: xge_hal_mgmt_hw_stats{}, xge_hal_stats_hw_info_t{},
695  * xge_hal_aux_stats_tmac_read(), xge_hal_aux_stats_rmac_read(),
696  * xge_hal_aux_device_dump().
697 */
698 xge_hal_status_e xge_hal_aux_stats_herc_enchanced(xge_hal_device_h devh,
699                       int bufsize, char *retbuf, int *retsize)
700 {
701         xge_hal_status_e status;
702         xge_hal_mgmt_hw_stats_t hw;
703         xge_hal_device_t *hldev = (xge_hal_device_t*)devh;
704
705         __HAL_AUX_ENTRY_DECLARE(bufsize, retbuf);
706
707         if (xge_hal_device_check_id(hldev) == XGE_HAL_CARD_TITAN) {
708
709             __HAL_AUX_ENTRY_END(bufsize, retsize);
710
711             return XGE_HAL_OK;
712         }
713
714
715         status = xge_hal_mgmt_hw_stats(devh, &hw,
716                          sizeof(xge_hal_mgmt_hw_stats_t));
717         if (status != XGE_HAL_OK) {
718             return status;
719         }
720         __HAL_AUX_ENTRY("tmac_frms_oflow", hw.tmac_frms_oflow, "%u");
721         __HAL_AUX_ENTRY("tmac_data_octets_oflow", hw.tmac_data_octets_oflow,
722                 "%u");
723         __HAL_AUX_ENTRY("tmac_mcst_frms_oflow", hw.tmac_mcst_frms_oflow, "%u");
724         __HAL_AUX_ENTRY("tmac_bcst_frms_oflow", hw.tmac_bcst_frms_oflow, "%u");
725         __HAL_AUX_ENTRY("tmac_ttl_octets_oflow", hw.tmac_ttl_octets_oflow,
726                 "%u");
727         __HAL_AUX_ENTRY("tmac_ucst_frms_oflow", hw.tmac_ucst_frms_oflow, "%u");
728         __HAL_AUX_ENTRY("tmac_nucst_frms_oflow", hw.tmac_nucst_frms_oflow,
729                 "%u");
730         __HAL_AUX_ENTRY("tmac_any_err_frms_oflow", hw.tmac_any_err_frms_oflow,
731                 "%u");
732         __HAL_AUX_ENTRY("tmac_vlan_frms", (unsigned long long)hw.tmac_vlan_frms,
733                 "%llu");
734         __HAL_AUX_ENTRY("tmac_vld_ip_oflow", hw.tmac_vld_ip_oflow, "%u");
735         __HAL_AUX_ENTRY("tmac_drop_ip_oflow", hw.tmac_drop_ip_oflow, "%u");
736         __HAL_AUX_ENTRY("tmac_icmp_oflow", hw.tmac_icmp_oflow, "%u");
737         __HAL_AUX_ENTRY("tmac_rst_tcp_oflow", hw.tmac_rst_tcp_oflow, "%u");
738         __HAL_AUX_ENTRY("tmac_udp_oflow", hw.tmac_udp_oflow, "%u");
739         __HAL_AUX_ENTRY("tpa_unknown_protocol", hw.tpa_unknown_protocol, "%u");
740         __HAL_AUX_ENTRY("tpa_parse_failure", hw.tpa_parse_failure, "%u");
741         __HAL_AUX_ENTRY("rmac_vld_frms_oflow", hw.rmac_vld_frms_oflow, "%u");
742         __HAL_AUX_ENTRY("rmac_data_octets_oflow", hw.rmac_data_octets_oflow,
743                 "%u");
744         __HAL_AUX_ENTRY("rmac_vld_mcst_frms_oflow", hw.rmac_vld_mcst_frms_oflow,
745                 "%u");
746         __HAL_AUX_ENTRY("rmac_vld_bcst_frms_oflow", hw.rmac_vld_bcst_frms_oflow,
747                 "%u");
748         __HAL_AUX_ENTRY("rmac_ttl_octets_oflow", hw.rmac_ttl_octets_oflow,
749                 "%u");
750         __HAL_AUX_ENTRY("rmac_accepted_ucst_frms_oflow",
751                 hw.rmac_accepted_ucst_frms_oflow, "%u");
752         __HAL_AUX_ENTRY("rmac_accepted_nucst_frms_oflow",
753                 hw.rmac_accepted_nucst_frms_oflow, "%u");
754         __HAL_AUX_ENTRY("rmac_discarded_frms_oflow",
755                 hw.rmac_discarded_frms_oflow, "%u");
756         __HAL_AUX_ENTRY("rmac_drop_events_oflow", hw.rmac_drop_events_oflow,
757                 "%u");
758         __HAL_AUX_ENTRY("rmac_usized_frms_oflow", hw.rmac_usized_frms_oflow,
759                 "%u");
760         __HAL_AUX_ENTRY("rmac_osized_frms_oflow", hw.rmac_osized_frms_oflow,
761                 "%u");
762         __HAL_AUX_ENTRY("rmac_frag_frms_oflow", hw.rmac_frag_frms_oflow, "%u");
763         __HAL_AUX_ENTRY("rmac_jabber_frms_oflow", hw.rmac_jabber_frms_oflow,
764                 "%u");
765         __HAL_AUX_ENTRY("rmac_ip_oflow", hw.rmac_ip_oflow, "%u");
766         __HAL_AUX_ENTRY("rmac_drop_ip_oflow", hw.rmac_drop_ip_oflow, "%u");
767         __HAL_AUX_ENTRY("rmac_icmp_oflow", hw.rmac_icmp_oflow, "%u");
768         __HAL_AUX_ENTRY("rmac_udp_oflow", hw.rmac_udp_oflow, "%u");
769         __HAL_AUX_ENTRY("rmac_err_drp_udp_oflow", hw.rmac_err_drp_udp_oflow,
770                 "%u");
771         __HAL_AUX_ENTRY("rmac_pause_cnt_oflow", hw.rmac_pause_cnt_oflow, "%u");
772         __HAL_AUX_ENTRY("rmac_ttl_1519_4095_frms",
773                 (unsigned long long)hw.rmac_ttl_1519_4095_frms, "%llu");
774         __HAL_AUX_ENTRY("rmac_ttl_4096_8191_frms",
775                 (unsigned long long)hw.rmac_ttl_4096_8191_frms, "%llu");
776         __HAL_AUX_ENTRY("rmac_ttl_8192_max_frms",
777                 (unsigned long long)hw.rmac_ttl_8192_max_frms, "%llu");
778         __HAL_AUX_ENTRY("rmac_ttl_gt_max_frms",
779                 (unsigned long long)hw.rmac_ttl_gt_max_frms, "%llu");
780         __HAL_AUX_ENTRY("rmac_osized_alt_frms",
781                 (unsigned long long)hw.rmac_osized_alt_frms, "%llu");
782         __HAL_AUX_ENTRY("rmac_jabber_alt_frms",
783                 (unsigned long long)hw.rmac_jabber_alt_frms, "%llu");
784         __HAL_AUX_ENTRY("rmac_gt_max_alt_frms",
785                 (unsigned long long)hw.rmac_gt_max_alt_frms, "%llu");
786         __HAL_AUX_ENTRY("rmac_vlan_frms",
787                 (unsigned long long)hw.rmac_vlan_frms, "%llu");
788         __HAL_AUX_ENTRY("rmac_fcs_discard", hw.rmac_fcs_discard, "%u");
789         __HAL_AUX_ENTRY("rmac_len_discard", hw.rmac_len_discard, "%u");
790         __HAL_AUX_ENTRY("rmac_da_discard", hw.rmac_da_discard, "%u");
791         __HAL_AUX_ENTRY("rmac_pf_discard", hw.rmac_pf_discard, "%u");
792         __HAL_AUX_ENTRY("rmac_rts_discard", hw.rmac_rts_discard, "%u");
793         __HAL_AUX_ENTRY("rmac_red_discard", hw.rmac_red_discard, "%u");
794         __HAL_AUX_ENTRY("rmac_ingm_full_discard", hw.rmac_ingm_full_discard,
795                 "%u");
796         __HAL_AUX_ENTRY("rmac_accepted_ip_oflow", hw.rmac_accepted_ip_oflow,
797                 "%u");
798         __HAL_AUX_ENTRY("link_fault_cnt", hw.link_fault_cnt, "%u");
799
800         __HAL_AUX_ENTRY_END(bufsize, retsize);
801
802         return XGE_HAL_OK;
803 }
804
805 /**
806  * xge_hal_aux_stats_rmac_read - Read PCI hardware statistics.
807  * @devh: HAL device handle.
808  * @bufsize: Buffer size.
809  * @retbuf: Buffer pointer.
810  * @retsize: Size of the result. Cannot be greater than @bufsize.
811  *
812  * Read PCI statistics counters, including number of PCI read and
813  * write transactions, PCI retries, discards, etc.
814  * This is a subset of stats counters from xge_hal_stats_hw_info_t{}.
815  *
816  * Returns: XGE_HAL_OK - success.
817  * XGE_HAL_ERR_INVALID_DEVICE - Device is not valid.
818  * XGE_HAL_ERR_VERSION_CONFLICT - Version it not maching.
819  *
820  * See also: xge_hal_mgmt_hw_stats{}, xge_hal_stats_hw_info_t{},
821  * xge_hal_aux_stats_tmac_read(), xge_hal_aux_stats_rmac_read(),
822  * xge_hal_aux_device_dump().
823  */
824 xge_hal_status_e xge_hal_aux_stats_pci_read(xge_hal_device_h devh, int bufsize,
825                     char *retbuf, int *retsize)
826 {
827         xge_hal_status_e status;
828         xge_hal_mgmt_hw_stats_t hw;
829         xge_hal_device_t *hldev = (xge_hal_device_t*)devh;
830
831         __HAL_AUX_ENTRY_DECLARE(bufsize, retbuf);
832
833         if (xge_hal_device_check_id(hldev) == XGE_HAL_CARD_TITAN) {
834
835             __HAL_AUX_ENTRY_END(bufsize, retsize);
836
837             return XGE_HAL_OK;
838         }
839
840
841         status = xge_hal_mgmt_hw_stats(devh, &hw,
842                          sizeof(xge_hal_mgmt_hw_stats_t));
843         if (status != XGE_HAL_OK) {
844             return status;
845         }
846
847         __HAL_AUX_ENTRY("new_rd_req_cnt", hw.new_rd_req_cnt, "%u");
848         __HAL_AUX_ENTRY("rd_req_cnt", hw.rd_req_cnt, "%u");
849         __HAL_AUX_ENTRY("rd_rtry_cnt", hw.rd_rtry_cnt, "%u");
850         __HAL_AUX_ENTRY("new_rd_req_rtry_cnt", hw.new_rd_req_rtry_cnt, "%u");
851         __HAL_AUX_ENTRY("wr_req_cnt", hw.wr_req_cnt, "%u");
852         __HAL_AUX_ENTRY("wr_rtry_rd_ack_cnt", hw.wr_rtry_rd_ack_cnt, "%u");
853         __HAL_AUX_ENTRY("new_wr_req_rtry_cnt", hw.new_wr_req_rtry_cnt, "%u");
854         __HAL_AUX_ENTRY("new_wr_req_cnt", hw.new_wr_req_cnt, "%u");
855         __HAL_AUX_ENTRY("wr_disc_cnt", hw.wr_disc_cnt, "%u");
856         __HAL_AUX_ENTRY("wr_rtry_cnt", hw.wr_rtry_cnt, "%u");
857         __HAL_AUX_ENTRY("txp_wr_cnt", hw.txp_wr_cnt, "%u");
858         __HAL_AUX_ENTRY("rd_rtry_wr_ack_cnt", hw.rd_rtry_wr_ack_cnt, "%u");
859         __HAL_AUX_ENTRY("txd_wr_cnt", hw.txd_wr_cnt, "%u");
860         __HAL_AUX_ENTRY("txd_rd_cnt", hw.txd_rd_cnt, "%u");
861         __HAL_AUX_ENTRY("rxd_wr_cnt", hw.rxd_wr_cnt, "%u");
862         __HAL_AUX_ENTRY("rxd_rd_cnt", hw.rxd_rd_cnt, "%u");
863         __HAL_AUX_ENTRY("rxf_wr_cnt", hw.rxf_wr_cnt, "%u");
864         __HAL_AUX_ENTRY("txf_rd_cnt", hw.txf_rd_cnt, "%u");
865
866         __HAL_AUX_ENTRY_END(bufsize, retsize);
867
868         return XGE_HAL_OK;
869 }
870
871 /**
872  * xge_hal_aux_stats_hal_read - Read HAL (layer) statistics.
873  * @devh: HAL device handle.
874  * @bufsize: Buffer size.
875  * @retbuf: Buffer pointer.
876  * @retsize: Size of the result. Cannot be greater than @bufsize.
877  *
878  * Read HAL statistics.
879  *
880  * Returns: XGE_HAL_OK - success.
881  * XGE_HAL_ERR_INVALID_DEVICE - Device is not valid.
882  * XGE_HAL_ERR_VERSION_CONFLICT - Version it not maching.
883  * XGE_HAL_INF_STATS_IS_NOT_READY - Statistics information is not
884  * currently available.
885  *
886  * See also: xge_hal_aux_device_dump().
887  */
888 xge_hal_status_e xge_hal_aux_stats_hal_read(xge_hal_device_h devh,
889                 int bufsize, char *retbuf, int *retsize)
890 {
891         xge_list_t *item;
892         xge_hal_channel_t *channel;
893         xge_hal_device_t *hldev = (xge_hal_device_t*)devh;
894         xge_hal_status_e status;
895         xge_hal_mgmt_device_stats_t devstat;
896         xge_hal_mgmt_channel_stats_t chstat;
897         __HAL_AUX_ENTRY_DECLARE(bufsize, retbuf);
898
899         status = xge_hal_mgmt_device_stats(hldev, &devstat,
900                          sizeof(xge_hal_mgmt_device_stats_t));
901         if (status != XGE_HAL_OK) {
902             return status;
903         }
904
905         if (!hldev->config.bimodal_interrupts) {
906             __HAL_AUX_ENTRY("rx_traffic_intr_cnt",
907                     devstat.rx_traffic_intr_cnt, "%u");
908         }
909         __HAL_AUX_ENTRY("tx_traffic_intr_cnt", devstat.tx_traffic_intr_cnt, "%u");
910         __HAL_AUX_ENTRY("txpic_intr_cnt", devstat.txpic_intr_cnt, "%u");
911         __HAL_AUX_ENTRY("txdma_intr_cnt", devstat.txdma_intr_cnt, "%u");
912         __HAL_AUX_ENTRY("txmac_intr_cnt", devstat.txmac_intr_cnt, "%u");
913         __HAL_AUX_ENTRY("txxgxs_intr_cnt", devstat.txxgxs_intr_cnt, "%u");
914         __HAL_AUX_ENTRY("rxpic_intr_cnt", devstat.rxpic_intr_cnt, "%u");
915         __HAL_AUX_ENTRY("rxdma_intr_cnt", devstat.rxdma_intr_cnt, "%u");
916         __HAL_AUX_ENTRY("rxmac_intr_cnt", devstat.rxmac_intr_cnt, "%u");
917         __HAL_AUX_ENTRY("rxxgxs_intr_cnt", devstat.rxxgxs_intr_cnt, "%u");
918         __HAL_AUX_ENTRY("mc_intr_cnt", devstat.mc_intr_cnt, "%u");
919         __HAL_AUX_ENTRY("not_xge_intr_cnt", devstat.not_xge_intr_cnt, "%u");
920         __HAL_AUX_ENTRY("not_traffic_intr_cnt",
921                 devstat.not_traffic_intr_cnt, "%u");
922         __HAL_AUX_ENTRY("traffic_intr_cnt", devstat.traffic_intr_cnt, "%u");
923         __HAL_AUX_ENTRY("total_intr_cnt", devstat.total_intr_cnt, "%u");
924         __HAL_AUX_ENTRY("soft_reset_cnt", devstat.soft_reset_cnt, "%u");
925
926         if (hldev->config.rxufca_hi_lim != hldev->config.rxufca_lo_lim &&
927             hldev->config.rxufca_lo_lim != 0) {
928             __HAL_AUX_ENTRY("rxufca_lo_adjust_cnt",
929                     devstat.rxufca_lo_adjust_cnt, "%u");
930             __HAL_AUX_ENTRY("rxufca_hi_adjust_cnt",
931                     devstat.rxufca_hi_adjust_cnt, "%u");
932         }
933
934         if (hldev->config.bimodal_interrupts) {
935             __HAL_AUX_ENTRY("bimodal_lo_adjust_cnt",
936                     devstat.bimodal_lo_adjust_cnt, "%u");
937             __HAL_AUX_ENTRY("bimodal_hi_adjust_cnt",
938                     devstat.bimodal_hi_adjust_cnt, "%u");
939         }
940
941 #if defined(XGE_HAL_CONFIG_LRO)
942         __HAL_AUX_ENTRY("tot_frms_lroised",
943                 devstat.tot_frms_lroised, "%u");
944         __HAL_AUX_ENTRY("tot_lro_sessions",
945                 devstat.tot_lro_sessions, "%u");
946         __HAL_AUX_ENTRY("lro_frm_len_exceed_cnt",
947                 devstat.lro_frm_len_exceed_cnt, "%u");
948         __HAL_AUX_ENTRY("lro_sg_exceed_cnt",
949                 devstat.lro_sg_exceed_cnt, "%u");
950         __HAL_AUX_ENTRY("lro_out_of_seq_pkt_cnt",
951                 devstat.lro_out_of_seq_pkt_cnt, "%u");
952         __HAL_AUX_ENTRY("lro_dup_pkt_cnt",
953                 devstat.lro_dup_pkt_cnt, "%u");
954 #endif
955
956         /* for each opened rx channel */
957         xge_list_for_each(item, &hldev->ring_channels) {
958             char key[XGE_OS_SPRINTF_STRLEN];
959             channel = xge_container_of(item, xge_hal_channel_t, item);
960
961             status = xge_hal_mgmt_channel_stats(channel, &chstat,
962                          sizeof(xge_hal_mgmt_channel_stats_t));
963             if (status != XGE_HAL_OK) {
964                 return status;
965             }
966
967             (void) xge_os_sprintf(key, "ring%d_", channel->post_qid);
968
969             xge_os_strcpy(key+6, "full_cnt");
970             __HAL_AUX_ENTRY(key, chstat.full_cnt, "%u");
971             xge_os_strcpy(key+6, "usage_max");
972             __HAL_AUX_ENTRY(key, chstat.usage_max, "%u");
973             xge_os_strcpy(key+6, "usage_cnt");
974             __HAL_AUX_ENTRY(key, channel->usage_cnt, "%u");
975             xge_os_strcpy(key+6, "reserve_free_swaps_cnt");
976             __HAL_AUX_ENTRY(key, chstat.reserve_free_swaps_cnt, "%u");
977             if (!hldev->config.bimodal_interrupts) {
978                 xge_os_strcpy(key+6, "avg_compl_per_intr_cnt");
979                 __HAL_AUX_ENTRY(key, chstat.avg_compl_per_intr_cnt, "%u");
980             }
981             xge_os_strcpy(key+6, "total_compl_cnt");
982             __HAL_AUX_ENTRY(key, chstat.total_compl_cnt, "%u");
983             xge_os_strcpy(key+6, "bump_cnt");
984             __HAL_AUX_ENTRY(key, chstat.ring_bump_cnt, "%u");
985         }
986
987         /* for each opened tx channel */
988         xge_list_for_each(item, &hldev->fifo_channels) {
989             char key[XGE_OS_SPRINTF_STRLEN];
990             channel = xge_container_of(item, xge_hal_channel_t, item);
991
992             status = xge_hal_mgmt_channel_stats(channel, &chstat,
993                          sizeof(xge_hal_mgmt_channel_stats_t));
994             if (status != XGE_HAL_OK) {
995                 return status;
996             }
997
998             (void) xge_os_sprintf(key, "fifo%d_", channel->post_qid);
999
1000             xge_os_strcpy(key+6, "full_cnt");
1001             __HAL_AUX_ENTRY(key, chstat.full_cnt, "%u");
1002             xge_os_strcpy(key+6, "usage_max");
1003             __HAL_AUX_ENTRY(key, chstat.usage_max, "%u");
1004             xge_os_strcpy(key+6, "usage_cnt");
1005             __HAL_AUX_ENTRY(key, channel->usage_cnt, "%u");
1006             xge_os_strcpy(key+6, "reserve_free_swaps_cnt");
1007             __HAL_AUX_ENTRY(key, chstat.reserve_free_swaps_cnt, "%u");
1008             xge_os_strcpy(key+6, "avg_compl_per_intr_cnt");
1009             __HAL_AUX_ENTRY(key, chstat.avg_compl_per_intr_cnt, "%u");
1010             xge_os_strcpy(key+6, "total_compl_cnt");
1011             __HAL_AUX_ENTRY(key, chstat.total_compl_cnt, "%u");
1012             xge_os_strcpy(key+6, "total_posts");
1013             __HAL_AUX_ENTRY(key, chstat.total_posts, "%u");
1014             xge_os_strcpy(key+6, "total_posts_many");
1015             __HAL_AUX_ENTRY(key, chstat.total_posts_many, "%u");
1016             xge_os_strcpy(key+6, "copied_frags");
1017             __HAL_AUX_ENTRY(key, chstat.copied_frags, "%u");
1018             xge_os_strcpy(key+6, "copied_buffers");
1019             __HAL_AUX_ENTRY(key, chstat.copied_buffers, "%u");
1020             xge_os_strcpy(key+6, "total_buffers");
1021             __HAL_AUX_ENTRY(key, chstat.total_buffers, "%u");
1022             xge_os_strcpy(key+6, "avg_buffers_per_post");
1023             __HAL_AUX_ENTRY(key, chstat.avg_buffers_per_post, "%u");
1024             xge_os_strcpy(key+6, "avg_buffer_size");
1025             __HAL_AUX_ENTRY(key, chstat.avg_buffer_size, "%u");
1026             xge_os_strcpy(key+6, "avg_post_size");
1027             __HAL_AUX_ENTRY(key, chstat.avg_post_size, "%u");
1028             xge_os_strcpy(key+6, "total_posts_dtrs_many");
1029             __HAL_AUX_ENTRY(key, chstat.total_posts_dtrs_many, "%u");
1030             xge_os_strcpy(key+6, "total_posts_frags_many");
1031             __HAL_AUX_ENTRY(key, chstat.total_posts_frags_many, "%u");
1032             xge_os_strcpy(key+6, "total_posts_dang_dtrs");
1033             __HAL_AUX_ENTRY(key, chstat.total_posts_dang_dtrs, "%u");
1034             xge_os_strcpy(key+6, "total_posts_dang_frags");
1035             __HAL_AUX_ENTRY(key, chstat.total_posts_dang_frags, "%u");
1036         }
1037
1038         __HAL_AUX_ENTRY_END(bufsize, retsize);
1039
1040         return XGE_HAL_OK;
1041 }
1042
1043
1044
1045 /**
1046  * xge_hal_aux_stats_sw_dev_read - Read software device statistics.
1047  * @devh: HAL device handle.
1048  * @bufsize: Buffer size.
1049  * @retbuf: Buffer pointer.
1050  * @retsize: Size of the result. Cannot be greater than @bufsize.
1051  *
1052  * Read software-maintained device statistics.
1053  *
1054  * Returns: XGE_HAL_OK - success.
1055  * XGE_HAL_ERR_INVALID_DEVICE - Device is not valid.
1056  * XGE_HAL_ERR_VERSION_CONFLICT - Version it not maching.
1057  * XGE_HAL_INF_STATS_IS_NOT_READY - Statistics information is not
1058  * currently available.
1059  *
1060  * See also: xge_hal_aux_device_dump().
1061  */
1062 xge_hal_status_e xge_hal_aux_stats_sw_dev_read(xge_hal_device_h devh,
1063                     int bufsize, char *retbuf, int *retsize)
1064 {
1065         xge_hal_device_t *hldev = (xge_hal_device_t*)devh;
1066         xge_hal_status_e status;
1067         xge_hal_mgmt_sw_stats_t sw_dev_err_stats;
1068         int t_code;
1069         char buf[XGE_OS_SPRINTF_STRLEN];
1070
1071         __HAL_AUX_ENTRY_DECLARE(bufsize, retbuf);
1072
1073         status = xge_hal_mgmt_sw_stats(hldev, &sw_dev_err_stats,
1074                          sizeof(xge_hal_mgmt_sw_stats_t));
1075         if (status != XGE_HAL_OK) {
1076             return status;
1077         }
1078
1079         __HAL_AUX_ENTRY("sm_err_cnt",sw_dev_err_stats.sm_err_cnt, "%u");
1080         __HAL_AUX_ENTRY("single_ecc_err_cnt",sw_dev_err_stats.single_ecc_err_cnt, "%u");
1081         __HAL_AUX_ENTRY("double_ecc_err_cnt",sw_dev_err_stats.double_ecc_err_cnt, "%u");
1082         __HAL_AUX_ENTRY("ecc_err_cnt", sw_dev_err_stats.ecc_err_cnt, "%u");
1083         __HAL_AUX_ENTRY("parity_err_cnt",sw_dev_err_stats.parity_err_cnt, "%u");
1084         __HAL_AUX_ENTRY("serr_cnt",sw_dev_err_stats.serr_cnt, "%u");
1085
1086         for (t_code = 1; t_code < 16; t_code++) {
1087                 int t_code_cnt = sw_dev_err_stats.rxd_t_code_err_cnt[t_code];
1088                 if (t_code_cnt)  {
1089                 (void) xge_os_sprintf(buf, "rxd_t_code_%d", t_code);
1090                 __HAL_AUX_ENTRY(buf, t_code_cnt, "%u");
1091                 }
1092                 t_code_cnt = sw_dev_err_stats.txd_t_code_err_cnt[t_code];
1093             if (t_code_cnt) {
1094                 (void) xge_os_sprintf(buf, "txd_t_code_%d", t_code);
1095                 __HAL_AUX_ENTRY(buf, t_code_cnt, "%u");
1096             }
1097         }
1098         __HAL_AUX_ENTRY("alarm_transceiver_temp_high",sw_dev_err_stats.
1099                 stats_xpak.alarm_transceiver_temp_high, "%u");
1100         __HAL_AUX_ENTRY("alarm_transceiver_temp_low",sw_dev_err_stats.
1101                 stats_xpak.alarm_transceiver_temp_low, "%u");
1102         __HAL_AUX_ENTRY("alarm_laser_bias_current_high",sw_dev_err_stats.
1103                 stats_xpak.alarm_laser_bias_current_high, "%u");
1104         __HAL_AUX_ENTRY("alarm_laser_bias_current_low",sw_dev_err_stats.
1105                 stats_xpak.alarm_laser_bias_current_low, "%u");
1106         __HAL_AUX_ENTRY("alarm_laser_output_power_high",sw_dev_err_stats.
1107                 stats_xpak.alarm_laser_output_power_high, "%u");
1108         __HAL_AUX_ENTRY("alarm_laser_output_power_low",sw_dev_err_stats.
1109                 stats_xpak.alarm_laser_output_power_low, "%u");
1110         __HAL_AUX_ENTRY("warn_transceiver_temp_high",sw_dev_err_stats.
1111                 stats_xpak.warn_transceiver_temp_high, "%u");
1112         __HAL_AUX_ENTRY("warn_transceiver_temp_low",sw_dev_err_stats.
1113                 stats_xpak.warn_transceiver_temp_low, "%u");
1114         __HAL_AUX_ENTRY("warn_laser_bias_current_high",sw_dev_err_stats.
1115                 stats_xpak.warn_laser_bias_current_high, "%u");
1116         __HAL_AUX_ENTRY("warn_laser_bias_current_low",sw_dev_err_stats.
1117                 stats_xpak.warn_laser_bias_current_low, "%u");
1118         __HAL_AUX_ENTRY("warn_laser_output_power_high",sw_dev_err_stats.
1119                 stats_xpak.warn_laser_output_power_high, "%u");
1120         __HAL_AUX_ENTRY("warn_laser_output_power_low",sw_dev_err_stats.
1121                 stats_xpak.warn_laser_output_power_low, "%u");
1122
1123         __HAL_AUX_ENTRY_END(bufsize, retsize);
1124
1125         return XGE_HAL_OK;
1126 }
1127
1128 /**
1129  * xge_hal_aux_pci_config_read - Retrieve and format PCI Configuration
1130  * info.
1131  * @devh: HAL device handle.
1132  * @bufsize: Buffer size.
1133  * @retbuf: Buffer pointer.
1134  * @retsize: Size of the result. Cannot be greater than @bufsize.
1135  *
1136  * Retrieve about info (using xge_hal_mgmt_pci_config()) and sprintf it
1137  * into the provided @retbuf.
1138  *
1139  * Returns: XGE_HAL_OK - success.
1140  * XGE_HAL_ERR_INVALID_DEVICE - Device is not valid.
1141  * XGE_HAL_ERR_VERSION_CONFLICT - Version it not maching.
1142  *
1143  * See also: xge_hal_mgmt_pci_config(), xge_hal_aux_device_dump().
1144  */
1145 xge_hal_status_e xge_hal_aux_pci_config_read(xge_hal_device_h devh, int bufsize,
1146                     char *retbuf, int *retsize)
1147 {
1148         xge_hal_status_e status;
1149         xge_hal_mgmt_pci_config_t pci_config;
1150         __HAL_AUX_ENTRY_DECLARE(bufsize, retbuf);
1151
1152         status = xge_hal_mgmt_pci_config(devh, &pci_config,
1153                       sizeof(xge_hal_mgmt_pci_config_t));
1154         if (status != XGE_HAL_OK) {
1155             return status;
1156         }
1157
1158         __HAL_AUX_ENTRY("vendor_id", pci_config.vendor_id, "0x%04X");
1159         __HAL_AUX_ENTRY("device_id", pci_config.device_id, "0x%04X");
1160         __HAL_AUX_ENTRY("command", pci_config.command, "0x%04X");
1161         __HAL_AUX_ENTRY("status", pci_config.status, "0x%04X");
1162         __HAL_AUX_ENTRY("revision", pci_config.revision, "0x%02X");
1163         __HAL_AUX_ENTRY("pciClass1", pci_config.pciClass[0], "0x%02X");
1164         __HAL_AUX_ENTRY("pciClass2", pci_config.pciClass[1], "0x%02X");
1165         __HAL_AUX_ENTRY("pciClass3", pci_config.pciClass[2], "0x%02X");
1166         __HAL_AUX_ENTRY("cache_line_size",
1167                 pci_config.cache_line_size, "0x%02X");
1168         __HAL_AUX_ENTRY("latency_timer", pci_config.latency_timer, "0x%02X");
1169         __HAL_AUX_ENTRY("header_type", pci_config.header_type, "0x%02X");
1170         __HAL_AUX_ENTRY("bist", pci_config.bist, "0x%02X");
1171         __HAL_AUX_ENTRY("base_addr0_lo", pci_config.base_addr0_lo, "0x%08X");
1172         __HAL_AUX_ENTRY("base_addr0_hi", pci_config.base_addr0_hi, "0x%08X");
1173         __HAL_AUX_ENTRY("base_addr1_lo", pci_config.base_addr1_lo, "0x%08X");
1174         __HAL_AUX_ENTRY("base_addr1_hi", pci_config.base_addr1_hi, "0x%08X");
1175         __HAL_AUX_ENTRY("not_Implemented1",
1176                 pci_config.not_Implemented1, "0x%08X");
1177         __HAL_AUX_ENTRY("not_Implemented2", pci_config.not_Implemented2,
1178                 "0x%08X");
1179         __HAL_AUX_ENTRY("cardbus_cis_pointer", pci_config.cardbus_cis_pointer,
1180                 "0x%08X");
1181         __HAL_AUX_ENTRY("subsystem_vendor_id", pci_config.subsystem_vendor_id,
1182                 "0x%04X");
1183         __HAL_AUX_ENTRY("subsystem_id", pci_config.subsystem_id, "0x%04X");
1184         __HAL_AUX_ENTRY("rom_base", pci_config.rom_base, "0x%08X");
1185         __HAL_AUX_ENTRY("capabilities_pointer",
1186                 pci_config.capabilities_pointer, "0x%02X");
1187         __HAL_AUX_ENTRY("interrupt_line", pci_config.interrupt_line, "0x%02X");
1188         __HAL_AUX_ENTRY("interrupt_pin", pci_config.interrupt_pin, "0x%02X");
1189         __HAL_AUX_ENTRY("min_grant", pci_config.min_grant, "0x%02X");
1190         __HAL_AUX_ENTRY("max_latency", pci_config.max_latency, "0x%02X");
1191         __HAL_AUX_ENTRY("msi_cap_id", pci_config.msi_cap_id, "0x%02X");
1192         __HAL_AUX_ENTRY("msi_next_ptr", pci_config.msi_next_ptr, "0x%02X");
1193         __HAL_AUX_ENTRY("msi_control", pci_config.msi_control, "0x%04X");
1194         __HAL_AUX_ENTRY("msi_lower_address", pci_config.msi_lower_address,
1195                 "0x%08X");
1196         __HAL_AUX_ENTRY("msi_higher_address", pci_config.msi_higher_address,
1197                 "0x%08X");
1198         __HAL_AUX_ENTRY("msi_data", pci_config.msi_data, "0x%04X");
1199         __HAL_AUX_ENTRY("msi_unused", pci_config.msi_unused, "0x%04X");
1200         __HAL_AUX_ENTRY("vpd_cap_id", pci_config.vpd_cap_id, "0x%02X");
1201         __HAL_AUX_ENTRY("vpd_next_cap", pci_config.vpd_next_cap, "0x%02X");
1202         __HAL_AUX_ENTRY("vpd_addr", pci_config.vpd_addr, "0x%04X");
1203         __HAL_AUX_ENTRY("vpd_data", pci_config.vpd_data, "0x%08X");
1204         __HAL_AUX_ENTRY("pcix_cap", pci_config.pcix_cap, "0x%02X");
1205         __HAL_AUX_ENTRY("pcix_next_cap", pci_config.pcix_next_cap, "0x%02X");
1206         __HAL_AUX_ENTRY("pcix_command", pci_config.pcix_command, "0x%04X");
1207         __HAL_AUX_ENTRY("pcix_status", pci_config.pcix_status, "0x%08X");
1208
1209         if (xge_hal_device_check_id(devh) == XGE_HAL_CARD_HERC) {
1210             char key[XGE_OS_SPRINTF_STRLEN];
1211             int i;
1212
1213             for (i = 0;
1214                  i < (XGE_HAL_PCI_XFRAME_CONFIG_SPACE_SIZE - 0x68)/4;
1215                  i++) {
1216                 (void) xge_os_sprintf(key, "%03x:", 4*i + 0x68);
1217                 __HAL_AUX_ENTRY(key, *((int *)pci_config.rsvd_b1 + i),
1218                         "0x%08X");
1219             }
1220         }
1221
1222         __HAL_AUX_ENTRY_END(bufsize, retsize);
1223
1224         return XGE_HAL_OK;
1225 }
1226
1227
1228 /**
1229  * xge_hal_aux_channel_read - Read channels information.
1230  * @devh: HAL device handle.
1231  * @bufsize: Buffer size.
1232  * @retbuf: Buffer pointer.
1233  * @retsize: Size of the result. Cannot be greater than @bufsize.
1234  *
1235  * Read HAL statistics.
1236  *
1237  * Returns: XGE_HAL_OK - success.
1238  * XGE_HAL_ERR_INVALID_DEVICE - Device is not valid.
1239  * XGE_HAL_ERR_OUT_OF_SPACE - Buffer size is very small.
1240  * See also: xge_hal_aux_device_dump().
1241  */
1242 xge_hal_status_e xge_hal_aux_channel_read(xge_hal_device_h devh,
1243                     int bufsize, char *retbuf, int *retsize)
1244 {
1245         xge_list_t *item;
1246         xge_hal_channel_t *channel;
1247         xge_hal_device_t *hldev = (xge_hal_device_t*)devh;
1248         __HAL_AUX_ENTRY_DECLARE(bufsize, retbuf);
1249
1250         if (hldev->magic != XGE_HAL_MAGIC) {
1251                     return XGE_HAL_ERR_INVALID_DEVICE;
1252             }
1253
1254         /* for each opened rx channel */
1255         xge_list_for_each(item, &hldev->ring_channels) {
1256             char key[XGE_OS_SPRINTF_STRLEN];
1257             channel = xge_container_of(item, xge_hal_channel_t, item);
1258
1259             if (channel->is_open != 1)
1260                 continue;
1261
1262             (void) xge_os_sprintf(key, "ring%d_", channel->post_qid);
1263             xge_os_strcpy(key+6, "type");
1264             __HAL_AUX_ENTRY(key, channel->type, "%u");
1265             xge_os_strcpy(key+6, "length");
1266             __HAL_AUX_ENTRY(key, channel->length, "%u");
1267             xge_os_strcpy(key+6, "is_open");
1268             __HAL_AUX_ENTRY(key, channel->is_open, "%u");
1269             xge_os_strcpy(key+6, "reserve_initial");
1270             __HAL_AUX_ENTRY(key, channel->reserve_initial, "%u");
1271             xge_os_strcpy(key+6, "reserve_max");
1272             __HAL_AUX_ENTRY(key, channel->reserve_max, "%u");
1273             xge_os_strcpy(key+6, "reserve_length");
1274             __HAL_AUX_ENTRY(key, channel->reserve_length, "%u");
1275             xge_os_strcpy(key+6, "reserve_top");
1276             __HAL_AUX_ENTRY(key, channel->reserve_top, "%u");
1277             xge_os_strcpy(key+6, "reserve_threshold");
1278             __HAL_AUX_ENTRY(key, channel->reserve_threshold, "%u");
1279             xge_os_strcpy(key+6, "free_length");
1280             __HAL_AUX_ENTRY(key, channel->free_length, "%u");
1281             xge_os_strcpy(key+6, "post_index");
1282             __HAL_AUX_ENTRY(key, channel->post_index, "%u");
1283             xge_os_strcpy(key+6, "compl_index");
1284             __HAL_AUX_ENTRY(key, channel->compl_index, "%u");
1285             xge_os_strcpy(key+6, "per_dtr_space");
1286             __HAL_AUX_ENTRY(key, channel->per_dtr_space, "%u");
1287             xge_os_strcpy(key+6, "usage_cnt");
1288             __HAL_AUX_ENTRY(key, channel->usage_cnt, "%u");
1289         }
1290
1291         /* for each opened tx channel */
1292         xge_list_for_each(item, &hldev->fifo_channels) {
1293             char key[XGE_OS_SPRINTF_STRLEN];
1294             channel = xge_container_of(item, xge_hal_channel_t, item);
1295
1296             if (channel->is_open != 1)
1297                 continue;
1298
1299             (void) xge_os_sprintf(key, "fifo%d_", channel->post_qid);
1300             xge_os_strcpy(key+6, "type");
1301             __HAL_AUX_ENTRY(key, channel->type, "%u");
1302             xge_os_strcpy(key+6, "length");
1303             __HAL_AUX_ENTRY(key, channel->length, "%u");
1304             xge_os_strcpy(key+6, "is_open");
1305             __HAL_AUX_ENTRY(key, channel->is_open, "%u");
1306             xge_os_strcpy(key+6, "reserve_initial");
1307             __HAL_AUX_ENTRY(key, channel->reserve_initial, "%u");
1308             xge_os_strcpy(key+6, "reserve_max");
1309             __HAL_AUX_ENTRY(key, channel->reserve_max, "%u");
1310             xge_os_strcpy(key+6, "reserve_length");
1311             __HAL_AUX_ENTRY(key, channel->reserve_length, "%u");
1312             xge_os_strcpy(key+6, "reserve_top");
1313             __HAL_AUX_ENTRY(key, channel->reserve_top, "%u");
1314             xge_os_strcpy(key+6, "reserve_threshold");
1315             __HAL_AUX_ENTRY(key, channel->reserve_threshold, "%u");
1316             xge_os_strcpy(key+6, "free_length");
1317             __HAL_AUX_ENTRY(key, channel->free_length, "%u");
1318             xge_os_strcpy(key+6, "post_index");
1319             __HAL_AUX_ENTRY(key, channel->post_index, "%u");
1320             xge_os_strcpy(key+6, "compl_index");
1321             __HAL_AUX_ENTRY(key, channel->compl_index, "%u");
1322             xge_os_strcpy(key+6, "per_dtr_space");
1323             __HAL_AUX_ENTRY(key, channel->per_dtr_space, "%u");
1324             xge_os_strcpy(key+6, "usage_cnt");
1325             __HAL_AUX_ENTRY(key, channel->usage_cnt, "%u");
1326         }
1327
1328         __HAL_AUX_ENTRY_END(bufsize, retsize);
1329
1330         return XGE_HAL_OK;
1331 }
1332
1333 /**
1334  * xge_hal_aux_device_dump - Dump driver "about" info and device state.
1335  * @devh: HAL device handle.
1336  *
1337  * Dump driver & device "about" info and device state,
1338  * including all BAR0 registers, hardware and software statistics, PCI
1339  * configuration space.
1340  * See also: xge_hal_aux_about_read(), xge_hal_mgmt_reg_read(),
1341  * xge_hal_aux_pci_config_read(), xge_hal_aux_stats_sw_dev_read(),
1342  * xge_hal_aux_stats_tmac_read(), xge_hal_aux_stats_rmac_read(),
1343  * xge_hal_aux_channel_read(), xge_hal_aux_stats_hal_read().
1344  * Returns:
1345  * XGE_HAL_ERR_INVALID_DEVICE - Device is not valid.
1346  * XGE_HAL_ERR_OUT_OF_SPACE - Buffer size is very small.
1347  */
1348 xge_hal_status_e
1349 xge_hal_aux_device_dump(xge_hal_device_h devh)
1350 {
1351         xge_hal_device_t *hldev = (xge_hal_device_t*)devh;
1352         xge_hal_status_e status;
1353         int retsize;
1354         int offset;
1355         u64 retval;
1356
1357         xge_assert(hldev->dump_buf != NULL);
1358
1359         xge_os_println("********* xge DEVICE DUMP BEGIN **********");
1360
1361         status = xge_hal_aux_about_read(hldev, XGE_HAL_DUMP_BUF_SIZE,
1362                                         hldev->dump_buf,
1363                                         &retsize);
1364         if (status != XGE_HAL_OK) {
1365             goto error;
1366         }
1367         xge_os_println(hldev->dump_buf);
1368
1369
1370         for (offset = 0; offset < 1574; offset++) {
1371
1372             status = xge_hal_mgmt_reg_read(hldev, 0, offset*8, &retval);
1373             if (status != XGE_HAL_OK) {
1374                 goto error;
1375             }
1376
1377             if (!retval) continue;
1378
1379             xge_os_printf("0x%04x 0x%08x%08x", offset*8,
1380                         (u32)(retval>>32), (u32)retval);
1381         }
1382         xge_os_println("\n");
1383
1384         status = xge_hal_aux_pci_config_read(hldev, XGE_HAL_DUMP_BUF_SIZE,
1385                                              hldev->dump_buf,
1386                                              &retsize);
1387         if (status != XGE_HAL_OK) {
1388             goto error;
1389         }
1390         xge_os_println(hldev->dump_buf);
1391
1392         status = xge_hal_aux_stats_tmac_read(hldev, XGE_HAL_DUMP_BUF_SIZE,
1393                                              hldev->dump_buf,
1394                                              &retsize);
1395         if (status != XGE_HAL_OK) {
1396             goto error;
1397         }
1398         xge_os_println(hldev->dump_buf);
1399
1400         status = xge_hal_aux_stats_rmac_read(hldev, XGE_HAL_DUMP_BUF_SIZE,
1401                                              hldev->dump_buf,
1402                                              &retsize);
1403         if (status != XGE_HAL_OK) {
1404             goto error;
1405         }
1406         xge_os_println(hldev->dump_buf);
1407
1408         status = xge_hal_aux_stats_pci_read(hldev, XGE_HAL_DUMP_BUF_SIZE,
1409                                             hldev->dump_buf,
1410                                             &retsize);
1411         if (status != XGE_HAL_OK) {
1412             goto error;
1413         }
1414         xge_os_println(hldev->dump_buf);
1415
1416         if (xge_hal_device_check_id(hldev) == XGE_HAL_CARD_HERC) {
1417             status = xge_hal_aux_stats_herc_enchanced(hldev,
1418                      XGE_HAL_DUMP_BUF_SIZE, hldev->dump_buf, &retsize);
1419             if (status != XGE_HAL_OK) {
1420                 goto error;
1421             }
1422             xge_os_println(hldev->dump_buf);
1423         }
1424
1425         status = xge_hal_aux_stats_sw_dev_read(hldev, XGE_HAL_DUMP_BUF_SIZE,
1426                              hldev->dump_buf, &retsize);
1427         if (status != XGE_HAL_OK) {
1428             goto error;
1429         }
1430         xge_os_println(hldev->dump_buf);
1431
1432         status = xge_hal_aux_channel_read(hldev, XGE_HAL_DUMP_BUF_SIZE,
1433                                           hldev->dump_buf,
1434                                           &retsize);
1435         if (status != XGE_HAL_OK) {
1436             goto error;
1437         }
1438         xge_os_println(hldev->dump_buf);
1439
1440         status = xge_hal_aux_stats_hal_read(hldev, XGE_HAL_DUMP_BUF_SIZE,
1441                                             hldev->dump_buf,
1442                                             &retsize);
1443         if (status != XGE_HAL_OK) {
1444             goto error;
1445         }
1446         xge_os_println(hldev->dump_buf);
1447
1448         xge_os_println("********* XFRAME DEVICE DUMP END **********");
1449
1450 error:
1451         return status;
1452 }
1453
1454
1455 /**
1456  * xge_hal_aux_driver_config_read - Read Driver configuration.
1457  * @bufsize: Buffer size.
1458  * @retbuf: Buffer pointer.
1459  * @retsize: Size of the result. Cannot be greater than @bufsize.
1460  *
1461  * Read driver configuration,
1462  *
1463  * Returns: XGE_HAL_OK - success.
1464  * XGE_HAL_ERR_VERSION_CONFLICT - Version it not maching.
1465  *
1466  * See also: xge_hal_aux_device_config_read().
1467  */
1468 xge_hal_status_e
1469 xge_hal_aux_driver_config_read(int bufsize, char *retbuf, int *retsize)
1470 {
1471         xge_hal_status_e status;
1472         xge_hal_driver_config_t  drv_config;
1473         __HAL_AUX_ENTRY_DECLARE(bufsize, retbuf);
1474
1475         status = xge_hal_mgmt_driver_config(&drv_config,
1476                           sizeof(xge_hal_driver_config_t));
1477         if (status != XGE_HAL_OK) {
1478             return status;
1479         }
1480
1481         __HAL_AUX_ENTRY("queue size initial",
1482                 drv_config.queue_size_initial, "%u");
1483         __HAL_AUX_ENTRY("queue size max", drv_config.queue_size_max, "%u");
1484         __HAL_AUX_ENTRY_END(bufsize, retsize);
1485
1486         return XGE_HAL_OK;
1487 }
1488
1489
1490 /**
1491  * xge_hal_aux_device_config_read - Read device configuration.
1492  * @devh: HAL device handle.
1493  * @bufsize: Buffer size.
1494  * @retbuf: Buffer pointer.
1495  * @retsize: Size of the result. Cannot be greater than @bufsize.
1496  *
1497  * Read device configuration,
1498  *
1499  * Returns: XGE_HAL_OK - success.
1500  * XGE_HAL_ERR_INVALID_DEVICE - Device is not valid.
1501  * XGE_HAL_ERR_VERSION_CONFLICT - Version it not maching.
1502  *
1503  * See also: xge_hal_aux_driver_config_read().
1504  */
1505 xge_hal_status_e xge_hal_aux_device_config_read(xge_hal_device_h devh,
1506                     int bufsize, char *retbuf, int *retsize)
1507 {
1508         int i;
1509         xge_hal_status_e status;
1510         xge_hal_device_config_t *dev_config;
1511         xge_hal_device_t *hldev = (xge_hal_device_t *) devh;
1512         char key[XGE_OS_SPRINTF_STRLEN];
1513         __HAL_AUX_ENTRY_DECLARE(bufsize, retbuf);
1514
1515         dev_config = (xge_hal_device_config_t *) xge_os_malloc(hldev->pdev,
1516                                             sizeof(xge_hal_device_config_t));
1517         if (dev_config == NULL) {
1518             return XGE_HAL_FAIL;
1519         }
1520
1521         status = xge_hal_mgmt_device_config(devh, dev_config,
1522                           sizeof(xge_hal_device_config_t));
1523         if (status != XGE_HAL_OK) {
1524             xge_os_free(hldev->pdev, dev_config,
1525                     sizeof(xge_hal_device_config_t));
1526             return status;
1527         }
1528
1529         __HAL_AUX_ENTRY("mtu", dev_config->mtu, "%u");
1530         __HAL_AUX_ENTRY("isr_polling_count", dev_config->isr_polling_cnt, "%u");
1531         __HAL_AUX_ENTRY("latency_timer", dev_config->latency_timer, "%u");
1532         __HAL_AUX_ENTRY("max_splits_trans",
1533                 dev_config->max_splits_trans, "%u");
1534         __HAL_AUX_ENTRY("mmrb_count", dev_config->mmrb_count, "%d");
1535         __HAL_AUX_ENTRY("shared_splits", dev_config->shared_splits, "%u");
1536         __HAL_AUX_ENTRY("stats_refresh_time_sec",
1537                 dev_config->stats_refresh_time_sec, "%u");
1538         __HAL_AUX_ENTRY("pci_freq_mherz", dev_config->pci_freq_mherz, "%u");
1539         __HAL_AUX_ENTRY("intr_mode", dev_config->intr_mode, "%u");
1540         __HAL_AUX_ENTRY("ring_memblock_size",
1541                 dev_config->ring.memblock_size,  "%u");
1542
1543         __HAL_AUX_ENTRY("sched_timer_us", dev_config->sched_timer_us, "%u");
1544         __HAL_AUX_ENTRY("sched_timer_one_shot",
1545                 dev_config->sched_timer_one_shot,  "%u");
1546         __HAL_AUX_ENTRY("rxufca_intr_thres", dev_config->rxufca_intr_thres,  "%u");
1547         __HAL_AUX_ENTRY("rxufca_lo_lim", dev_config->rxufca_lo_lim,  "%u");
1548         __HAL_AUX_ENTRY("rxufca_hi_lim", dev_config->rxufca_hi_lim,  "%u");
1549         __HAL_AUX_ENTRY("rxufca_lbolt_period", dev_config->rxufca_lbolt_period,  "%u");
1550
1551         for(i = 0; i < XGE_HAL_MAX_RING_NUM;  i++)
1552         {
1553             xge_hal_ring_queue_t *ring = &dev_config->ring.queue[i];
1554             xge_hal_rti_config_t *rti =  &ring->rti;
1555
1556             if (!ring->configured)
1557                 continue;
1558
1559             (void) xge_os_sprintf(key, "ring%d_", i);
1560             xge_os_strcpy(key+6, "inital");
1561             __HAL_AUX_ENTRY(key, ring->initial, "%u");
1562             xge_os_strcpy(key+6, "max");
1563             __HAL_AUX_ENTRY(key, ring->max, "%u");
1564             xge_os_strcpy(key+6, "buffer_mode");
1565             __HAL_AUX_ENTRY(key, ring->buffer_mode, "%u");
1566             xge_os_strcpy(key+6, "dram_size_mb");
1567             __HAL_AUX_ENTRY(key, ring->dram_size_mb, "%u");
1568             xge_os_strcpy(key+6, "backoff_interval_us");
1569             __HAL_AUX_ENTRY(key, ring->backoff_interval_us, "%u");
1570             xge_os_strcpy(key+6, "max_frame_len");
1571             __HAL_AUX_ENTRY(key, ring->max_frm_len, "%d");
1572             xge_os_strcpy(key+6, "priority");
1573             __HAL_AUX_ENTRY(key, ring->priority,  "%u");
1574             xge_os_strcpy(key+6, "rth_en");
1575             __HAL_AUX_ENTRY(key, ring->rth_en,  "%u");
1576             xge_os_strcpy(key+6, "no_snoop_bits");
1577             __HAL_AUX_ENTRY(key, ring->no_snoop_bits,  "%u");
1578             xge_os_strcpy(key+6, "indicate_max_pkts");
1579             __HAL_AUX_ENTRY(key, ring->indicate_max_pkts,  "%u");
1580
1581             xge_os_strcpy(key+6, "urange_a");
1582             __HAL_AUX_ENTRY(key, rti->urange_a,  "%u");
1583             xge_os_strcpy(key+6, "ufc_a");
1584             __HAL_AUX_ENTRY(key, rti->ufc_a,  "%u");
1585             xge_os_strcpy(key+6, "urange_b");
1586             __HAL_AUX_ENTRY(key, rti->urange_b,  "%u");
1587             xge_os_strcpy(key+6, "ufc_b");
1588             __HAL_AUX_ENTRY(key, rti->ufc_b,  "%u");
1589             xge_os_strcpy(key+6, "urange_c");
1590             __HAL_AUX_ENTRY(key, rti->urange_c,  "%u");
1591             xge_os_strcpy(key+6, "ufc_c");
1592             __HAL_AUX_ENTRY(key, rti->ufc_c,  "%u");
1593             xge_os_strcpy(key+6, "ufc_d");
1594             __HAL_AUX_ENTRY(key, rti->ufc_d,  "%u");
1595             xge_os_strcpy(key+6, "timer_val_us");
1596             __HAL_AUX_ENTRY(key, rti->timer_val_us,  "%u");
1597         }
1598
1599
1600         {
1601             xge_hal_mac_config_t *mac= &dev_config->mac;
1602
1603             __HAL_AUX_ENTRY("tmac_util_period",
1604                     mac->tmac_util_period, "%u");
1605             __HAL_AUX_ENTRY("rmac_util_period",
1606                     mac->rmac_util_period, "%u");
1607             __HAL_AUX_ENTRY("rmac_bcast_en",
1608                     mac->rmac_bcast_en, "%u");
1609             __HAL_AUX_ENTRY("rmac_pause_gen_en",
1610                     mac->rmac_pause_gen_en, "%d");
1611             __HAL_AUX_ENTRY("rmac_pause_rcv_en",
1612                     mac->rmac_pause_rcv_en, "%d");
1613             __HAL_AUX_ENTRY("rmac_pause_time",
1614                     mac->rmac_pause_time, "%u");
1615             __HAL_AUX_ENTRY("mc_pause_threshold_q0q3",
1616                     mac->mc_pause_threshold_q0q3, "%u");
1617             __HAL_AUX_ENTRY("mc_pause_threshold_q4q7",
1618                     mac->mc_pause_threshold_q4q7, "%u");
1619         }
1620
1621
1622         __HAL_AUX_ENTRY("fifo_max_frags", dev_config->fifo.max_frags, "%u");
1623         __HAL_AUX_ENTRY("fifo_reserve_threshold",
1624                 dev_config->fifo.reserve_threshold, "%u");
1625         __HAL_AUX_ENTRY("fifo_memblock_size",
1626                 dev_config->fifo.memblock_size, "%u");
1627 #ifdef XGE_HAL_ALIGN_XMIT
1628         __HAL_AUX_ENTRY("fifo_alignment_size",
1629                 dev_config->fifo.alignment_size, "%u");
1630 #endif
1631
1632         for (i = 0; i < XGE_HAL_MAX_FIFO_NUM;  i++) {
1633             int j;
1634             xge_hal_fifo_queue_t *fifo = &dev_config->fifo.queue[i];
1635
1636             if (!fifo->configured)
1637                 continue;
1638
1639             (void) xge_os_sprintf(key, "fifo%d_", i);
1640             xge_os_strcpy(key+6, "initial");
1641             __HAL_AUX_ENTRY(key, fifo->initial, "%u");
1642             xge_os_strcpy(key+6, "max");
1643             __HAL_AUX_ENTRY(key, fifo->max, "%u");
1644             xge_os_strcpy(key+6, "intr");
1645             __HAL_AUX_ENTRY(key, fifo->intr, "%u");
1646             xge_os_strcpy(key+6, "no_snoop_bits");
1647             __HAL_AUX_ENTRY(key, fifo->no_snoop_bits, "%u");
1648
1649             for (j = 0; j < XGE_HAL_MAX_FIFO_TTI_NUM; j++) {
1650                 xge_hal_tti_config_t *tti =
1651                     &dev_config->fifo.queue[i].tti[j];
1652
1653                 if (!tti->enabled)
1654                     continue;
1655
1656                 (void) xge_os_sprintf(key, "fifo%d_tti%02d_", i,
1657                     i * XGE_HAL_MAX_FIFO_TTI_NUM + j);
1658                 xge_os_strcpy(key+12, "urange_a");
1659                 __HAL_AUX_ENTRY(key, tti->urange_a, "%u");
1660                 xge_os_strcpy(key+12, "ufc_a");
1661                 __HAL_AUX_ENTRY(key, tti->ufc_a, "%u");
1662                 xge_os_strcpy(key+12, "urange_b");
1663                 __HAL_AUX_ENTRY(key, tti->urange_b, "%u");
1664                 xge_os_strcpy(key+12, "ufc_b");
1665                 __HAL_AUX_ENTRY(key, tti->ufc_b, "%u");
1666                 xge_os_strcpy(key+12, "urange_c");
1667                 __HAL_AUX_ENTRY(key, tti->urange_c, "%u");
1668                 xge_os_strcpy(key+12, "ufc_c");
1669                 __HAL_AUX_ENTRY(key, tti->ufc_c, "%u");
1670                 xge_os_strcpy(key+12, "ufc_d");
1671                 __HAL_AUX_ENTRY(key, tti->ufc_d, "%u");
1672                 xge_os_strcpy(key+12, "timer_val_us");
1673                 __HAL_AUX_ENTRY(key, tti->timer_val_us, "%u");
1674                 xge_os_strcpy(key+12, "timer_ci_en");
1675                 __HAL_AUX_ENTRY(key, tti->timer_ci_en, "%u");
1676             }
1677         }
1678
1679         /* and bimodal TTIs */
1680         for (i=0; i<XGE_HAL_MAX_RING_NUM; i++) {
1681             xge_hal_tti_config_t *tti = &hldev->bimodal_tti[i];
1682
1683             if (!tti->enabled)
1684                 continue;
1685
1686             (void) xge_os_sprintf(key, "tti%02d_",
1687                       XGE_HAL_MAX_FIFO_TTI_RING_0 + i);
1688
1689             xge_os_strcpy(key+6, "urange_a");
1690             __HAL_AUX_ENTRY(key, tti->urange_a, "%u");
1691             xge_os_strcpy(key+6, "ufc_a");
1692             __HAL_AUX_ENTRY(key, tti->ufc_a, "%u");
1693             xge_os_strcpy(key+6, "urange_b");
1694             __HAL_AUX_ENTRY(key, tti->urange_b, "%u");
1695             xge_os_strcpy(key+6, "ufc_b");
1696             __HAL_AUX_ENTRY(key, tti->ufc_b, "%u");
1697             xge_os_strcpy(key+6, "urange_c");
1698             __HAL_AUX_ENTRY(key, tti->urange_c, "%u");
1699             xge_os_strcpy(key+6, "ufc_c");
1700             __HAL_AUX_ENTRY(key, tti->ufc_c, "%u");
1701             xge_os_strcpy(key+6, "ufc_d");
1702             __HAL_AUX_ENTRY(key, tti->ufc_d, "%u");
1703             xge_os_strcpy(key+6, "timer_val_us");
1704             __HAL_AUX_ENTRY(key, tti->timer_val_us, "%u");
1705             xge_os_strcpy(key+6, "timer_ac_en");
1706             __HAL_AUX_ENTRY(key, tti->timer_ac_en, "%u");
1707             xge_os_strcpy(key+6, "timer_ci_en");
1708             __HAL_AUX_ENTRY(key, tti->timer_ci_en, "%u");
1709         }
1710         __HAL_AUX_ENTRY("dump_on_serr", dev_config->dump_on_serr, "%u");
1711         __HAL_AUX_ENTRY("dump_on_eccerr",
1712                 dev_config->dump_on_eccerr, "%u");
1713         __HAL_AUX_ENTRY("dump_on_parityerr",
1714                 dev_config->dump_on_parityerr, "%u");
1715         __HAL_AUX_ENTRY("rth_en", dev_config->rth_en, "%u");
1716         __HAL_AUX_ENTRY("rth_bucket_size", dev_config->rth_bucket_size, "%u");
1717
1718         __HAL_AUX_ENTRY_END(bufsize, retsize);
1719
1720         xge_os_free(hldev->pdev, dev_config,
1721                 sizeof(xge_hal_device_config_t));
1722
1723         return XGE_HAL_OK;
1724 }
1725