diff options
Diffstat (limited to 'sys/dev/ice/ice_strings.c')
-rw-r--r-- | sys/dev/ice/ice_strings.c | 1034 |
1 files changed, 1034 insertions, 0 deletions
diff --git a/sys/dev/ice/ice_strings.c b/sys/dev/ice/ice_strings.c new file mode 100644 index 000000000000..4d12aa59849f --- /dev/null +++ b/sys/dev/ice/ice_strings.c @@ -0,0 +1,1034 @@ +/* SPDX-License-Identifier: BSD-3-Clause */ +/* Copyright (c) 2020, Intel Corporation + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * 3. Neither the name of the Intel Corporation nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ +/*$FreeBSD$*/ + +/** + * @file ice_strings.c + * @brief functions to convert enumerated values to human readable strings + * + * Contains various functions which convert enumerated values into human + * readable strings. Primarily this is used for error values, such as the + * ice_status enum, the ice_aq_err values, or standard sys/errno.h values. + * + * Additionally, various other driver enumerations which are displayed via + * sysctl have converter functions. + * + * Some of the functions return struct ice_str_buf, instead of a character + * string pointer. This is a trick to allow the function to create a struct + * with space to convert unknown numeric values into a string, and return the + * contents via copying the struct memory back. The functions then have an + * associated macro to access the string value immediately. This allows the + * functions to return static strings for known values, and convert unknown + * values into a numeric representation. It also does not require + * pre-allocating storage at each callsite, or using a local static value + * which wouldn't be re-entrant, and could collide if multiple threads call + * the function. The extra copies are somewhat annoying, but generally the + * error functions aren't expected to be in a hot path so this is an + * acceptable trade off. + */ + +#include "ice_lib.h" + +/** + * ice_aq_str - Convert an AdminQ error into a string + * @aq_err: the AQ error code to convert + * + * Convert the AdminQ status into its string name, if known. Otherwise, format + * the error as an integer. + */ +struct ice_str_buf +_ice_aq_str(enum ice_aq_err aq_err) +{ + struct ice_str_buf buf = { .str = "" }; + const char *str = NULL; + + switch (aq_err) { + case ICE_AQ_RC_OK: + str = "OK"; + break; + case ICE_AQ_RC_EPERM: + str = "AQ_RC_EPERM"; + break; + case ICE_AQ_RC_ENOENT: + str = "AQ_RC_ENOENT"; + break; + case ICE_AQ_RC_ESRCH: + str = "AQ_RC_ESRCH"; + break; + case ICE_AQ_RC_EINTR: + str = "AQ_RC_EINTR"; + break; + case ICE_AQ_RC_EIO: + str = "AQ_RC_EIO"; + break; + case ICE_AQ_RC_ENXIO: + str = "AQ_RC_ENXIO"; + break; + case ICE_AQ_RC_E2BIG: + str = "AQ_RC_E2BIG"; + break; + case ICE_AQ_RC_EAGAIN: + str = "AQ_RC_EAGAIN"; + break; + case ICE_AQ_RC_ENOMEM: + str = "AQ_RC_ENOMEM"; + break; + case ICE_AQ_RC_EACCES: + str = "AQ_RC_EACCES"; + break; + case ICE_AQ_RC_EFAULT: + str = "AQ_RC_EFAULT"; + break; + case ICE_AQ_RC_EBUSY: + str = "AQ_RC_EBUSY"; + break; + case ICE_AQ_RC_EEXIST: + str = "AQ_RC_EEXIST"; + break; + case ICE_AQ_RC_EINVAL: + str = "AQ_RC_EINVAL"; + break; + case ICE_AQ_RC_ENOTTY: + str = "AQ_RC_ENOTTY"; + break; + case ICE_AQ_RC_ENOSPC: + str = "AQ_RC_ENOSPC"; + break; + case ICE_AQ_RC_ENOSYS: + str = "AQ_RC_ENOSYS"; + break; + case ICE_AQ_RC_ERANGE: + str = "AQ_RC_ERANGE"; + break; + case ICE_AQ_RC_EFLUSHED: + str = "AQ_RC_EFLUSHED"; + break; + case ICE_AQ_RC_BAD_ADDR: + str = "AQ_RC_BAD_ADDR"; + break; + case ICE_AQ_RC_EMODE: + str = "AQ_RC_EMODE"; + break; + case ICE_AQ_RC_EFBIG: + str = "AQ_RC_EFBIG"; + break; + case ICE_AQ_RC_ESBCOMP: + str = "AQ_RC_ESBCOMP"; + break; + case ICE_AQ_RC_ENOSEC: + str = "AQ_RC_ENOSEC"; + break; + case ICE_AQ_RC_EBADSIG: + str = "AQ_RC_EBADSIG"; + break; + case ICE_AQ_RC_ESVN: + str = "AQ_RC_ESVN"; + break; + case ICE_AQ_RC_EBADMAN: + str = "AQ_RC_EBADMAN"; + break; + case ICE_AQ_RC_EBADBUF: + str = "AQ_RC_EBADBUF"; + break; + case ICE_AQ_RC_EACCES_BMCU: + str = "AQ_RC_EACCES_BMCU"; + break; + } + + if (str) + snprintf(buf.str, ICE_STR_BUF_LEN, "%s", str); + else + snprintf(buf.str, ICE_STR_BUF_LEN, "%d", aq_err); + + return buf; +} + +/** + * ice_status_str - convert status err code to a string + * @status: the status error code to convert + * + * Convert the status code into its string name if known. + * + * Otherwise, use the scratch space to format the status code into a number. + */ +struct ice_str_buf +_ice_status_str(enum ice_status status) +{ + struct ice_str_buf buf = { .str = "" }; + const char *str = NULL; + + switch (status) { + case ICE_SUCCESS: + str = "OK"; + break; + case ICE_ERR_PARAM: + str = "ICE_ERR_PARAM"; + break; + case ICE_ERR_NOT_IMPL: + str = "ICE_ERR_NOT_IMPL"; + break; + case ICE_ERR_NOT_READY: + str = "ICE_ERR_NOT_READY"; + break; + case ICE_ERR_NOT_SUPPORTED: + str = "ICE_ERR_NOT_SUPPORTED"; + break; + case ICE_ERR_BAD_PTR: + str = "ICE_ERR_BAD_PTR"; + break; + case ICE_ERR_INVAL_SIZE: + str = "ICE_ERR_INVAL_SIZE"; + break; + case ICE_ERR_DEVICE_NOT_SUPPORTED: + str = "ICE_ERR_DEVICE_NOT_SUPPORTED"; + break; + case ICE_ERR_RESET_FAILED: + str = "ICE_ERR_RESET_FAILED"; + break; + case ICE_ERR_FW_API_VER: + str = "ICE_ERR_FW_API_VER"; + break; + case ICE_ERR_NO_MEMORY: + str = "ICE_ERR_NO_MEMORY"; + break; + case ICE_ERR_CFG: + str = "ICE_ERR_CFG"; + break; + case ICE_ERR_OUT_OF_RANGE: + str = "ICE_ERR_OUT_OF_RANGE"; + break; + case ICE_ERR_ALREADY_EXISTS: + str = "ICE_ERR_ALREADY_EXISTS"; + break; + case ICE_ERR_NVM: + str = "ICE_ERR_NVM"; + break; + case ICE_ERR_NVM_CHECKSUM: + str = "ICE_ERR_NVM_CHECKSUM"; + break; + case ICE_ERR_BUF_TOO_SHORT: + str = "ICE_ERR_BUF_TOO_SHORT"; + break; + case ICE_ERR_NVM_BLANK_MODE: + str = "ICE_ERR_NVM_BLANK_MODE"; + break; + case ICE_ERR_IN_USE: + str = "ICE_ERR_IN_USE"; + break; + case ICE_ERR_MAX_LIMIT: + str = "ICE_ERR_MAX_LIMIT"; + break; + case ICE_ERR_RESET_ONGOING: + str = "ICE_ERR_RESET_ONGOING"; + break; + case ICE_ERR_HW_TABLE: + str = "ICE_ERR_HW_TABLE"; + break; + case ICE_ERR_DOES_NOT_EXIST: + str = "ICE_ERR_DOES_NOT_EXIST"; + break; + case ICE_ERR_AQ_ERROR: + str = "ICE_ERR_AQ_ERROR"; + break; + case ICE_ERR_AQ_TIMEOUT: + str = "ICE_ERR_AQ_TIMEOUT"; + break; + case ICE_ERR_AQ_FULL: + str = "ICE_ERR_AQ_FULL"; + break; + case ICE_ERR_AQ_NO_WORK: + str = "ICE_ERR_AQ_NO_WORK"; + break; + case ICE_ERR_AQ_EMPTY: + str = "ICE_ERR_AQ_EMPTY"; + break; + case ICE_ERR_FW_DDP_MISMATCH: + str = "ICE_ERR_FW_DDP_MISMATCH"; + break; + } + + if (str) + snprintf(buf.str, ICE_STR_BUF_LEN, "%s", str); + else + snprintf(buf.str, ICE_STR_BUF_LEN, "%d", status); + + return buf; +} + +/** + * ice_err_str - convert error code to a string + * @err: the error code to convert + * + * Convert an error code into its string/macro name if known. Note, it doesn't + * handle negated errors. + * + * Otherwise, use the scratch space to format the error into a number. + */ +struct ice_str_buf +_ice_err_str(int err) +{ + struct ice_str_buf buf = { .str = "" }; + const char *str = NULL; + + switch (err) { + case 0: + str = "OK"; + break; + case EPERM: + str = "EPERM"; + break; + case ENOENT: + str = "ENOENT"; + break; + case ESRCH: + str = "ESRCH"; + break; + case EINTR: + str = "EINTR"; + break; + case EIO: + str = "EIO"; + break; + case ENXIO: + str = "ENXIO"; + break; + case E2BIG: + str = "E2BIG"; + break; + case ENOEXEC: + str = "ENOEXEC"; + break; + case EBADF: + str = "EBADF"; + break; + case ECHILD: + str = "ECHILD"; + break; + case EDEADLK: + str = "EDEADLK"; + break; + case ENOMEM: + str = "ENOMEM"; + break; + case EACCES: + str = "EACCES"; + break; + case EFAULT: + str = "EFAULT"; + break; + case ENOTBLK: + str = "ENOTBLK"; + break; + case EBUSY: + str = "EBUSY"; + break; + case EEXIST: + str = "EEXIST"; + break; + case EXDEV: + str = "EXDEV"; + break; + case ENODEV: + str = "ENODEV"; + break; + case ENOTDIR: + str = "ENOTDIR"; + break; + case EISDIR: + str = "EISDIR"; + break; + case EINVAL: + str = "EINVAL"; + break; + case ENFILE: + str = "ENFILE"; + break; + case EMFILE: + str = "EMFILE"; + break; + case ENOTTY: + str = "ENOTTY"; + break; + case ETXTBSY: + str = "ETXTBSY"; + break; + case EFBIG: + str = "EFBIG"; + break; + case ENOSPC: + str = "ENOSPC"; + break; + case ESPIPE: + str = "ESPIPE"; + break; + case EROFS: + str = "EROFS"; + break; + case EMLINK: + str = "EMLINK"; + break; + case EPIPE: + str = "EPIPE"; + break; + case EDOM: + str = "EDOM"; + break; + case ERANGE: + str = "ERANGE"; + break; + case EAGAIN: + /* EWOULDBLOCK */ + str = "EAGAIN"; + break; + case EINPROGRESS: + str = "EINPROGRESS"; + break; + case EALREADY: + str = "EALREADY"; + break; + case ENOTSOCK: + str = "ENOTSOCK"; + break; + case EDESTADDRREQ: + str = "EDESTADDRREQ"; + break; + case EMSGSIZE: + str = "EMSGSIZE"; + break; + case EPROTOTYPE: + str = "EPROTOTYPE"; + break; + case ENOPROTOOPT: + str = "ENOPROTOOPT"; + break; + case EPROTONOSUPPORT: + str = "EPROTONOSUPPORT"; + break; + case ESOCKTNOSUPPORT: + str = "ESOCKTNOSUPPORT"; + break; + case EOPNOTSUPP: + str = "EOPNOTSUPP"; + break; + case EPFNOSUPPORT: + /* ENOTSUP */ + str = "EPFNOSUPPORT"; + break; + case EAFNOSUPPORT: + str = "EAFNOSUPPORT"; + break; + case EADDRINUSE: + str = "EADDRINUSE"; + break; + case EADDRNOTAVAIL: + str = "EADDRNOTAVAIL"; + break; + case ENETDOWN: + str = "ENETDOWN"; + break; + case ENETUNREACH: + str = "ENETUNREACH"; + break; + case ENETRESET: + str = "ENETRESET"; + break; + case ECONNABORTED: + str = "ECONNABORTED"; + break; + case ECONNRESET: + str = "ECONNRESET"; + break; + case ENOBUFS: + str = "ENOBUFS"; + break; + case EISCONN: + str = "EISCONN"; + break; + case ENOTCONN: + str = "ENOTCONN"; + break; + case ESHUTDOWN: + str = "ESHUTDOWN"; + break; + case ETOOMANYREFS: + str = "ETOOMANYREFS"; + break; + case ETIMEDOUT: + str = "ETIMEDOUT"; + break; + case ECONNREFUSED: + str = "ECONNREFUSED"; + break; + case ELOOP: + str = "ELOOP"; + break; + case ENAMETOOLONG: + str = "ENAMETOOLONG"; + break; + case EHOSTDOWN: + str = "EHOSTDOWN"; + break; + case EHOSTUNREACH: + str = "EHOSTUNREACH"; + break; + case ENOTEMPTY: + str = "ENOTEMPTY"; + break; + case EPROCLIM: + str = "EPROCLIM"; + break; + case EUSERS: + str = "EUSERS"; + break; + case EDQUOT: + str = "EDQUOT"; + break; + case ESTALE: + str = "ESTALE"; + break; + case EREMOTE: + str = "EREMOTE"; + break; + case EBADRPC: + str = "EBADRPC"; + break; + case ERPCMISMATCH: + str = "ERPCMISMATCH"; + break; + case EPROGUNAVAIL: + str = "EPROGUNAVAIL"; + break; + case EPROGMISMATCH: + str = "EPROGMISMATCH"; + break; + case EPROCUNAVAIL: + str = "EPROCUNAVAIL"; + break; + case ENOLCK: + str = "ENOLCK"; + break; + case ENOSYS: + str = "ENOSYS"; + break; + case EFTYPE: + str = "EFTYPE"; + break; + case EAUTH: + str = "EAUTH"; + break; + case ENEEDAUTH: + str = "ENEEDAUTH"; + break; + case EIDRM: + str = "EIDRM"; + break; + case ENOMSG: + str = "ENOMSG"; + break; + case EOVERFLOW: + str = "EOVERFLOW"; + break; + case ECANCELED: + str = "ECANCELED"; + break; + case EILSEQ: + str = "EILSEQ"; + break; + case ENOATTR: + str = "ENOATTR"; + break; + case EDOOFUS: + str = "EDOOFUS"; + break; + case EBADMSG: + str = "EBADMSG"; + break; + case EMULTIHOP: + str = "EMULTIHOP"; + break; + case ENOLINK: + str = "ENOLINK"; + break; + case EPROTO: + str = "EPROTO"; + break; + case ENOTCAPABLE: + str = "ENOTCAPABLE"; + break; + case ECAPMODE: + str = "ECAPMODE"; + break; + case ENOTRECOVERABLE: + str = "ENOTRECOVERABLE"; + break; + case EOWNERDEAD: + str = "EOWNERDEAD"; + break; + } + + if (str) + snprintf(buf.str, ICE_STR_BUF_LEN, "%s", str); + else + snprintf(buf.str, ICE_STR_BUF_LEN, "%d", err); + + return buf; +} + +/** + * ice_fec_str - convert fec mode enum to a string + * @mode: the enum value to convert + * + * Convert an FEC mode enum to a string for display in a sysctl or log message. + * Returns "Unknown" if the mode is not one of currently known FEC modes. + */ +const char * +ice_fec_str(enum ice_fec_mode mode) +{ + switch (mode) { + case ICE_FEC_AUTO: + return ICE_FEC_STRING_AUTO; + case ICE_FEC_RS: + return ICE_FEC_STRING_RS; + case ICE_FEC_BASER: + return ICE_FEC_STRING_BASER; + case ICE_FEC_NONE: + return ICE_FEC_STRING_NONE; + } + + /* The compiler generates errors on unhandled enum values if we omit + * the default case. + */ + return "Unknown"; +} + +/** + * ice_fc_str - convert flow control mode enum to a string + * @mode: the enum value to convert + * + * Convert a flow control mode enum to a string for display in a sysctl or log + * message. Returns "Unknown" if the mode is not one of currently supported or + * known flow control modes. + */ +const char * +ice_fc_str(enum ice_fc_mode mode) +{ + switch (mode) { + case ICE_FC_FULL: + return ICE_FC_STRING_FULL; + case ICE_FC_TX_PAUSE: + return ICE_FC_STRING_TX; + case ICE_FC_RX_PAUSE: + return ICE_FC_STRING_RX; + case ICE_FC_NONE: + return ICE_FC_STRING_NONE; + case ICE_FC_AUTO: + case ICE_FC_PFC: + case ICE_FC_DFLT: + break; + } + + /* The compiler generates errors on unhandled enum values if we omit + * the default case. + */ + return "Unknown"; +} + +/** + * ice_fltr_flag_str - Convert filter flags to a string + * @flag: the filter flags to convert + * + * Convert the u16 flag value of a filter into a readable string for + * outputting in a sysctl. + */ +struct ice_str_buf +_ice_fltr_flag_str(u16 flag) +{ + struct ice_str_buf buf = { .str = "" }; + const char *str = NULL; + + switch (flag) { + case ICE_FLTR_RX: + str = "RX"; + break; + case ICE_FLTR_TX: + str = "TX"; + break; + case ICE_FLTR_TX_RX: + str = "TX_RX"; + break; + default: + break; + } + + if (str) + snprintf(buf.str, ICE_STR_BUF_LEN, "%s", str); + else + snprintf(buf.str, ICE_STR_BUF_LEN, "%u", flag); + + return buf; +} + +/** + * ice_fwd_act_str - convert filter action enum to a string + * @action: the filter action to convert + * + * Convert an enum value of type enum ice_sw_fwd_act_type into a string, for + * display in a sysctl filter list. Returns "UNKNOWN" for actions outside the + * enumeration type. + */ +const char * +ice_fwd_act_str(enum ice_sw_fwd_act_type action) +{ + switch (action) { + case ICE_FWD_TO_VSI: + return "FWD_TO_VSI"; + case ICE_FWD_TO_VSI_LIST: + return "FWD_TO_VSI_LIST"; + case ICE_FWD_TO_Q: + return "FWD_TO_Q"; + case ICE_FWD_TO_QGRP: + return "FWD_TO_QGRP"; + case ICE_DROP_PACKET: + return "DROP_PACKET"; + case ICE_INVAL_ACT: + return "INVAL_ACT"; + } + + /* The compiler generates errors on unhandled enum values if we omit + * the default case. + */ + return "Unknown"; +} + +/** + * ice_mdd_tx_tclan_str - Convert MDD Tx TCLAN event to a string + * @event: the MDD event number to convert + * + * Convert the Tx TCLAN event value from the GL_MDET_TX_TCLAN register into + * a human readable string for logging of MDD events. + */ +struct ice_str_buf +_ice_mdd_tx_tclan_str(u8 event) +{ + struct ice_str_buf buf = { .str = "" }; + const char *str = NULL; + + switch (event) { + case 0: + str = "Wrong descriptor format/order"; + break; + case 1: + str = "Descriptor fetch failed"; + break; + case 2: + str = "Tail descriptor not EOP/NOP"; + break; + case 3: + str = "False scheduling error"; + break; + case 4: + str = "Tail value larger than ring len"; + break; + case 5: + str = "Too many data commands"; + break; + case 6: + str = "Zero packets sent in quanta"; + break; + case 7: + str = "Packet too small or too big"; + break; + case 8: + str = "TSO length doesn't match sum"; + break; + case 9: + str = "TSO tail reached before TLEN"; + break; + case 10: + str = "TSO max 3 descs for headers"; + break; + case 11: + str = "EOP on header descriptor"; + break; + case 12: + str = "MSS is 0 or TLEN is 0"; + break; + case 13: + str = "CTX desc invalid IPSec fields"; + break; + case 14: + str = "Quanta invalid # of SSO packets"; + break; + case 15: + str = "Quanta bytes exceeds pkt_len*64"; + break; + case 16: + str = "Quanta exceeds max_cmds_in_sq"; + break; + case 17: + str = "incoherent last_lso_quanta"; + break; + case 18: + str = "incoherent TSO TLEN"; + break; + case 19: + str = "Quanta: too many descriptors"; + break; + case 20: + str = "Quanta: # of packets mismatch"; + break; + default: + break; + } + + if (str) + snprintf(buf.str, ICE_STR_BUF_LEN, "%s", str); + else + snprintf(buf.str, ICE_STR_BUF_LEN, "Unknown Tx TCLAN event %u", event); + + return buf; +} + +/** + * ice_mdd_tx_pqm_str - Convert MDD Tx PQM event to a string + * @event: the MDD event number to convert + * + * Convert the Tx PQM event value from the GL_MDET_TX_PQM register into + * a human readable string for logging of MDD events. + */ +struct ice_str_buf +_ice_mdd_tx_pqm_str(u8 event) +{ + struct ice_str_buf buf = { .str = "" }; + const char *str = NULL; + + switch (event) { + case 0: + str = "PCI_DUMMY_COMP"; + break; + case 1: + str = "PCI_UR_COMP"; + break; + /* Index 2 is unused */ + case 3: + str = "RCV_SH_BE_LSO"; + break; + case 4: + str = "Q_FL_MNG_EPY_CH"; + break; + case 5: + str = "Q_EPY_MNG_FL_CH"; + break; + case 6: + str = "LSO_NUMDESCS_ZERO"; + break; + case 7: + str = "LSO_LENGTH_ZERO"; + break; + case 8: + str = "LSO_MSS_BELOW_MIN"; + break; + case 9: + str = "LSO_MSS_ABOVE_MAX"; + break; + case 10: + str = "LSO_HDR_SIZE_ZERO"; + break; + case 11: + str = "RCV_CNT_BE_LSO"; + break; + case 12: + str = "SKIP_ONE_QT_ONLY"; + break; + case 13: + str = "LSO_PKTCNT_ZERO"; + break; + case 14: + str = "SSO_LENGTH_ZERO"; + break; + case 15: + str = "SSO_LENGTH_EXCEED"; + break; + case 16: + str = "SSO_PKTCNT_ZERO"; + break; + case 17: + str = "SSO_PKTCNT_EXCEED"; + break; + case 18: + str = "SSO_NUMDESCS_ZERO"; + break; + case 19: + str = "SSO_NUMDESCS_EXCEED"; + break; + case 20: + str = "TAIL_GT_RING_LENGTH"; + break; + case 21: + str = "RESERVED_DBL_TYPE"; + break; + case 22: + str = "ILLEGAL_HEAD_DROP_DBL"; + break; + case 23: + str = "LSO_OVER_COMMS_Q"; + break; + case 24: + str = "ILLEGAL_VF_QNUM"; + break; + case 25: + str = "QTAIL_GT_RING_LENGTH"; + break; + default: + break; + } + + if (str) + snprintf(buf.str, ICE_STR_BUF_LEN, "%s", str); + else + snprintf(buf.str, ICE_STR_BUF_LEN, "Unknown Tx PQM event %u", event); + + return buf; +} + +/** + * ice_mdd_rx_str - Convert MDD Rx queue event to a string + * @event: the MDD event number to convert + * + * Convert the Rx queue event value from the GL_MDET_RX register into a human + * readable string for logging of MDD events. + */ +struct ice_str_buf +_ice_mdd_rx_str(u8 event) +{ + struct ice_str_buf buf = { .str = "" }; + const char *str = NULL; + + switch (event) { + case 1: + str = "Descriptor fetch failed"; + break; + default: + break; + } + + if (str) + snprintf(buf.str, ICE_STR_BUF_LEN, "%s", str); + else + snprintf(buf.str, ICE_STR_BUF_LEN, "Unknown Rx event %u", event); + + return buf; +} + +/** + * ice_state_to_str - Convert the state enum to a string value + * @state: the state bit to convert + * + * Converts a given state bit to its human readable string name. If the enum + * value is unknown, returns NULL; + */ +const char * +ice_state_to_str(enum ice_state state) +{ + switch (state) { + case ICE_STATE_CONTROLQ_EVENT_PENDING: + return "CONTROLQ_EVENT_PENDING"; + case ICE_STATE_VFLR_PENDING: + return "VFLR_PENDING"; + case ICE_STATE_MDD_PENDING: + return "MDD_PENDING"; + case ICE_STATE_RESET_OICR_RECV: + return "RESET_OICR_RECV"; + case ICE_STATE_RESET_PFR_REQ: + return "RESET_PFR_REQ"; + case ICE_STATE_PREPARED_FOR_RESET: + return "PREPARED_FOR_RESET"; + case ICE_STATE_RESET_FAILED: + return "RESET_FAILED"; + case ICE_STATE_DRIVER_INITIALIZED: + return "DRIVER_INITIALIZED"; + case ICE_STATE_NO_MEDIA: + return "NO_MEDIA"; + case ICE_STATE_RECOVERY_MODE: + return "RECOVERY_MODE"; + case ICE_STATE_ROLLBACK_MODE: + return "ROLLBACK_MODE"; + case ICE_STATE_LINK_STATUS_REPORTED: + return "LINK_STATUS_REPORTED"; + case ICE_STATE_DETACHING: + return "DETACHING"; + case ICE_STATE_LINK_DEFAULT_OVERRIDE_PENDING: + return "LINK_DEFAULT_OVERRIDE_PENDING"; + case ICE_STATE_LAST: + return NULL; + } + + return NULL; +} + +/** + * ice_fw_lldp_status - Convert FW LLDP status to a string + * @lldp_status: firmware LLDP status value to convert + * + * Given the FW LLDP status, convert it to a human readable string. + */ +struct ice_str_buf +_ice_fw_lldp_status(u32 lldp_status) +{ + struct ice_str_buf buf = { .str = "" }; + const char *str = NULL; + + switch (lldp_status) + { + case ICE_LLDP_ADMINSTATUS_DIS: + str = "DISABLED"; + break; + case ICE_LLDP_ADMINSTATUS_ENA_RX: + str = "ENA_RX"; + break; + case ICE_LLDP_ADMINSTATUS_ENA_TX: + str = "ENA_TX"; + break; + case ICE_LLDP_ADMINSTATUS_ENA_RXTX: + str = "ENA_RXTX"; + break; + case 0xF: + str = "NVM_DEFAULT"; + break; + } + + if (str) + snprintf(buf.str, ICE_STR_BUF_LEN, "%s", str); + else + snprintf(buf.str, ICE_STR_BUF_LEN, "Unknown LLDP status %u", lldp_status); + + return buf; +} |