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