aboutsummaryrefslogtreecommitdiff
path: root/sys/dev/ice/ice_strings.c
diff options
context:
space:
mode:
Diffstat (limited to 'sys/dev/ice/ice_strings.c')
-rw-r--r--sys/dev/ice/ice_strings.c1034
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;
+}