1 /* SPDX-License-Identifier: BSD-3-Clause */ 2 /* Copyright (c) 2024, Intel Corporation 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions are met: 7 * 8 * 1. Redistributions of source code must retain the above copyright notice, 9 * this list of conditions and the following disclaimer. 10 * 11 * 2. Redistributions in binary form must reproduce the above copyright 12 * notice, this list of conditions and the following disclaimer in the 13 * documentation and/or other materials provided with the distribution. 14 * 15 * 3. Neither the name of the Intel Corporation nor the names of its 16 * contributors may be used to endorse or promote products derived from 17 * this software without specific prior written permission. 18 * 19 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 20 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 21 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 22 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE 23 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 24 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 25 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 26 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 27 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 28 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 29 * POSSIBILITY OF SUCH DAMAGE. 30 */ 31 32 /** 33 * @file ice_strings.c 34 * @brief functions to convert enumerated values to human readable strings 35 * 36 * Contains various functions which convert enumerated values into human 37 * readable strings. Primarily this is used for error values, such as the 38 * ice_status enum, the ice_aq_err values, or standard sys/errno.h values. 39 * 40 * Additionally, various other driver enumerations which are displayed via 41 * sysctl have converter functions. 42 * 43 * Some of the functions return struct ice_str_buf, instead of a character 44 * string pointer. This is a trick to allow the function to create a struct 45 * with space to convert unknown numeric values into a string, and return the 46 * contents via copying the struct memory back. The functions then have an 47 * associated macro to access the string value immediately. This allows the 48 * functions to return static strings for known values, and convert unknown 49 * values into a numeric representation. It also does not require 50 * pre-allocating storage at each callsite, or using a local static value 51 * which wouldn't be re-entrant, and could collide if multiple threads call 52 * the function. The extra copies are somewhat annoying, but generally the 53 * error functions aren't expected to be in a hot path so this is an 54 * acceptable trade off. 55 */ 56 57 #include "ice_lib.h" 58 59 /** 60 * ice_aq_str - Convert an AdminQ error into a string 61 * @aq_err: the AQ error code to convert 62 * 63 * Convert the AdminQ status into its string name, if known. Otherwise, format 64 * the error as an integer. 65 */ 66 struct ice_str_buf 67 _ice_aq_str(enum ice_aq_err aq_err) 68 { 69 struct ice_str_buf buf = { .str = "" }; 70 const char *str = NULL; 71 72 switch (aq_err) { 73 case ICE_AQ_RC_OK: 74 str = "OK"; 75 break; 76 case ICE_AQ_RC_EPERM: 77 str = "AQ_RC_EPERM"; 78 break; 79 case ICE_AQ_RC_ENOENT: 80 str = "AQ_RC_ENOENT"; 81 break; 82 case ICE_AQ_RC_ESRCH: 83 str = "AQ_RC_ESRCH"; 84 break; 85 case ICE_AQ_RC_EINTR: 86 str = "AQ_RC_EINTR"; 87 break; 88 case ICE_AQ_RC_EIO: 89 str = "AQ_RC_EIO"; 90 break; 91 case ICE_AQ_RC_ENXIO: 92 str = "AQ_RC_ENXIO"; 93 break; 94 case ICE_AQ_RC_E2BIG: 95 str = "AQ_RC_E2BIG"; 96 break; 97 case ICE_AQ_RC_EAGAIN: 98 str = "AQ_RC_EAGAIN"; 99 break; 100 case ICE_AQ_RC_ENOMEM: 101 str = "AQ_RC_ENOMEM"; 102 break; 103 case ICE_AQ_RC_EACCES: 104 str = "AQ_RC_EACCES"; 105 break; 106 case ICE_AQ_RC_EFAULT: 107 str = "AQ_RC_EFAULT"; 108 break; 109 case ICE_AQ_RC_EBUSY: 110 str = "AQ_RC_EBUSY"; 111 break; 112 case ICE_AQ_RC_EEXIST: 113 str = "AQ_RC_EEXIST"; 114 break; 115 case ICE_AQ_RC_EINVAL: 116 str = "AQ_RC_EINVAL"; 117 break; 118 case ICE_AQ_RC_ENOTTY: 119 str = "AQ_RC_ENOTTY"; 120 break; 121 case ICE_AQ_RC_ENOSPC: 122 str = "AQ_RC_ENOSPC"; 123 break; 124 case ICE_AQ_RC_ENOSYS: 125 str = "AQ_RC_ENOSYS"; 126 break; 127 case ICE_AQ_RC_ERANGE: 128 str = "AQ_RC_ERANGE"; 129 break; 130 case ICE_AQ_RC_EFLUSHED: 131 str = "AQ_RC_EFLUSHED"; 132 break; 133 case ICE_AQ_RC_BAD_ADDR: 134 str = "AQ_RC_BAD_ADDR"; 135 break; 136 case ICE_AQ_RC_EMODE: 137 str = "AQ_RC_EMODE"; 138 break; 139 case ICE_AQ_RC_EFBIG: 140 str = "AQ_RC_EFBIG"; 141 break; 142 case ICE_AQ_RC_ESBCOMP: 143 str = "AQ_RC_ESBCOMP"; 144 break; 145 case ICE_AQ_RC_ENOSEC: 146 str = "AQ_RC_ENOSEC"; 147 break; 148 case ICE_AQ_RC_EBADSIG: 149 str = "AQ_RC_EBADSIG"; 150 break; 151 case ICE_AQ_RC_ESVN: 152 str = "AQ_RC_ESVN"; 153 break; 154 case ICE_AQ_RC_EBADMAN: 155 str = "AQ_RC_EBADMAN"; 156 break; 157 case ICE_AQ_RC_EBADBUF: 158 str = "AQ_RC_EBADBUF"; 159 break; 160 case ICE_AQ_RC_EACCES_BMCU: 161 str = "AQ_RC_EACCES_BMCU"; 162 break; 163 } 164 165 if (str) 166 snprintf(buf.str, ICE_STR_BUF_LEN, "%s", str); 167 else 168 snprintf(buf.str, ICE_STR_BUF_LEN, "%d", aq_err); 169 170 return buf; 171 } 172 173 /** 174 * ice_status_str - convert status err code to a string 175 * @status: the status error code to convert 176 * 177 * Convert the status code into its string name if known. 178 * 179 * Otherwise, use the scratch space to format the status code into a number. 180 */ 181 struct ice_str_buf 182 _ice_status_str(int status) 183 { 184 struct ice_str_buf buf = { .str = "" }; 185 const char *str = NULL; 186 187 switch (status) { 188 case 0: 189 str = "OK"; 190 break; 191 case ICE_ERR_PARAM: 192 str = "ICE_ERR_PARAM"; 193 break; 194 case ICE_ERR_NOT_IMPL: 195 str = "ICE_ERR_NOT_IMPL"; 196 break; 197 case ICE_ERR_NOT_READY: 198 str = "ICE_ERR_NOT_READY"; 199 break; 200 case ICE_ERR_NOT_SUPPORTED: 201 str = "ICE_ERR_NOT_SUPPORTED"; 202 break; 203 case ICE_ERR_BAD_PTR: 204 str = "ICE_ERR_BAD_PTR"; 205 break; 206 case ICE_ERR_INVAL_SIZE: 207 str = "ICE_ERR_INVAL_SIZE"; 208 break; 209 case ICE_ERR_DEVICE_NOT_SUPPORTED: 210 str = "ICE_ERR_DEVICE_NOT_SUPPORTED"; 211 break; 212 case ICE_ERR_RESET_FAILED: 213 str = "ICE_ERR_RESET_FAILED"; 214 break; 215 case ICE_ERR_FW_API_VER: 216 str = "ICE_ERR_FW_API_VER"; 217 break; 218 case ICE_ERR_NO_MEMORY: 219 str = "ICE_ERR_NO_MEMORY"; 220 break; 221 case ICE_ERR_CFG: 222 str = "ICE_ERR_CFG"; 223 break; 224 case ICE_ERR_OUT_OF_RANGE: 225 str = "ICE_ERR_OUT_OF_RANGE"; 226 break; 227 case ICE_ERR_ALREADY_EXISTS: 228 str = "ICE_ERR_ALREADY_EXISTS"; 229 break; 230 case ICE_ERR_NVM: 231 str = "ICE_ERR_NVM"; 232 break; 233 case ICE_ERR_NVM_CHECKSUM: 234 str = "ICE_ERR_NVM_CHECKSUM"; 235 break; 236 case ICE_ERR_BUF_TOO_SHORT: 237 str = "ICE_ERR_BUF_TOO_SHORT"; 238 break; 239 case ICE_ERR_NVM_BLANK_MODE: 240 str = "ICE_ERR_NVM_BLANK_MODE"; 241 break; 242 case ICE_ERR_IN_USE: 243 str = "ICE_ERR_IN_USE"; 244 break; 245 case ICE_ERR_MAX_LIMIT: 246 str = "ICE_ERR_MAX_LIMIT"; 247 break; 248 case ICE_ERR_RESET_ONGOING: 249 str = "ICE_ERR_RESET_ONGOING"; 250 break; 251 case ICE_ERR_HW_TABLE: 252 str = "ICE_ERR_HW_TABLE"; 253 break; 254 case ICE_ERR_FW_DDP_MISMATCH: 255 str = "ICE_ERR_FW_DDP_MISMATCH"; 256 break; 257 case ICE_ERR_DOES_NOT_EXIST: 258 str = "ICE_ERR_DOES_NOT_EXIST"; 259 break; 260 case ICE_ERR_AQ_ERROR: 261 str = "ICE_ERR_AQ_ERROR"; 262 break; 263 case ICE_ERR_AQ_TIMEOUT: 264 str = "ICE_ERR_AQ_TIMEOUT"; 265 break; 266 case ICE_ERR_AQ_FULL: 267 str = "ICE_ERR_AQ_FULL"; 268 break; 269 case ICE_ERR_AQ_NO_WORK: 270 str = "ICE_ERR_AQ_NO_WORK"; 271 break; 272 case ICE_ERR_AQ_EMPTY: 273 str = "ICE_ERR_AQ_EMPTY"; 274 break; 275 case ICE_ERR_AQ_FW_CRITICAL: 276 str = "ICE_ERR_AQ_FW_CRITICAL"; 277 break; 278 } 279 280 if (str) 281 snprintf(buf.str, ICE_STR_BUF_LEN, "%s", str); 282 else 283 snprintf(buf.str, ICE_STR_BUF_LEN, "%d", status); 284 285 return buf; 286 } 287 288 /** 289 * ice_err_str - convert error code to a string 290 * @err: the error code to convert 291 * 292 * Convert an error code into its string/macro name if known. Note, it doesn't 293 * handle negated errors. 294 * 295 * Otherwise, use the scratch space to format the error into a number. 296 */ 297 struct ice_str_buf 298 _ice_err_str(int err) 299 { 300 struct ice_str_buf buf = { .str = "" }; 301 const char *str = NULL; 302 303 switch (err) { 304 case 0: 305 str = "OK"; 306 break; 307 case EPERM: 308 str = "EPERM"; 309 break; 310 case ENOENT: 311 str = "ENOENT"; 312 break; 313 case ESRCH: 314 str = "ESRCH"; 315 break; 316 case EINTR: 317 str = "EINTR"; 318 break; 319 case EIO: 320 str = "EIO"; 321 break; 322 case ENXIO: 323 str = "ENXIO"; 324 break; 325 case E2BIG: 326 str = "E2BIG"; 327 break; 328 case ENOEXEC: 329 str = "ENOEXEC"; 330 break; 331 case EBADF: 332 str = "EBADF"; 333 break; 334 case ECHILD: 335 str = "ECHILD"; 336 break; 337 case EDEADLK: 338 str = "EDEADLK"; 339 break; 340 case ENOMEM: 341 str = "ENOMEM"; 342 break; 343 case EACCES: 344 str = "EACCES"; 345 break; 346 case EFAULT: 347 str = "EFAULT"; 348 break; 349 case ENOTBLK: 350 str = "ENOTBLK"; 351 break; 352 case EBUSY: 353 str = "EBUSY"; 354 break; 355 case EEXIST: 356 str = "EEXIST"; 357 break; 358 case EXDEV: 359 str = "EXDEV"; 360 break; 361 case ENODEV: 362 str = "ENODEV"; 363 break; 364 case ENOTDIR: 365 str = "ENOTDIR"; 366 break; 367 case EISDIR: 368 str = "EISDIR"; 369 break; 370 case EINVAL: 371 str = "EINVAL"; 372 break; 373 case ENFILE: 374 str = "ENFILE"; 375 break; 376 case EMFILE: 377 str = "EMFILE"; 378 break; 379 case ENOTTY: 380 str = "ENOTTY"; 381 break; 382 case ETXTBSY: 383 str = "ETXTBSY"; 384 break; 385 case EFBIG: 386 str = "EFBIG"; 387 break; 388 case ENOSPC: 389 str = "ENOSPC"; 390 break; 391 case ESPIPE: 392 str = "ESPIPE"; 393 break; 394 case EROFS: 395 str = "EROFS"; 396 break; 397 case EMLINK: 398 str = "EMLINK"; 399 break; 400 case EPIPE: 401 str = "EPIPE"; 402 break; 403 case EDOM: 404 str = "EDOM"; 405 break; 406 case ERANGE: 407 str = "ERANGE"; 408 break; 409 case EAGAIN: 410 /* EWOULDBLOCK */ 411 str = "EAGAIN"; 412 break; 413 case EINPROGRESS: 414 str = "EINPROGRESS"; 415 break; 416 case EALREADY: 417 str = "EALREADY"; 418 break; 419 case ENOTSOCK: 420 str = "ENOTSOCK"; 421 break; 422 case EDESTADDRREQ: 423 str = "EDESTADDRREQ"; 424 break; 425 case EMSGSIZE: 426 str = "EMSGSIZE"; 427 break; 428 case EPROTOTYPE: 429 str = "EPROTOTYPE"; 430 break; 431 case ENOPROTOOPT: 432 str = "ENOPROTOOPT"; 433 break; 434 case EPROTONOSUPPORT: 435 str = "EPROTONOSUPPORT"; 436 break; 437 case ESOCKTNOSUPPORT: 438 str = "ESOCKTNOSUPPORT"; 439 break; 440 case EOPNOTSUPP: 441 str = "EOPNOTSUPP"; 442 break; 443 case EPFNOSUPPORT: 444 /* ENOTSUP */ 445 str = "EPFNOSUPPORT"; 446 break; 447 case EAFNOSUPPORT: 448 str = "EAFNOSUPPORT"; 449 break; 450 case EADDRINUSE: 451 str = "EADDRINUSE"; 452 break; 453 case EADDRNOTAVAIL: 454 str = "EADDRNOTAVAIL"; 455 break; 456 case ENETDOWN: 457 str = "ENETDOWN"; 458 break; 459 case ENETUNREACH: 460 str = "ENETUNREACH"; 461 break; 462 case ENETRESET: 463 str = "ENETRESET"; 464 break; 465 case ECONNABORTED: 466 str = "ECONNABORTED"; 467 break; 468 case ECONNRESET: 469 str = "ECONNRESET"; 470 break; 471 case ENOBUFS: 472 str = "ENOBUFS"; 473 break; 474 case EISCONN: 475 str = "EISCONN"; 476 break; 477 case ENOTCONN: 478 str = "ENOTCONN"; 479 break; 480 case ESHUTDOWN: 481 str = "ESHUTDOWN"; 482 break; 483 case ETOOMANYREFS: 484 str = "ETOOMANYREFS"; 485 break; 486 case ETIMEDOUT: 487 str = "ETIMEDOUT"; 488 break; 489 case ECONNREFUSED: 490 str = "ECONNREFUSED"; 491 break; 492 case ELOOP: 493 str = "ELOOP"; 494 break; 495 case ENAMETOOLONG: 496 str = "ENAMETOOLONG"; 497 break; 498 case EHOSTDOWN: 499 str = "EHOSTDOWN"; 500 break; 501 case EHOSTUNREACH: 502 str = "EHOSTUNREACH"; 503 break; 504 case ENOTEMPTY: 505 str = "ENOTEMPTY"; 506 break; 507 case EPROCLIM: 508 str = "EPROCLIM"; 509 break; 510 case EUSERS: 511 str = "EUSERS"; 512 break; 513 case EDQUOT: 514 str = "EDQUOT"; 515 break; 516 case ESTALE: 517 str = "ESTALE"; 518 break; 519 case EREMOTE: 520 str = "EREMOTE"; 521 break; 522 case EBADRPC: 523 str = "EBADRPC"; 524 break; 525 case ERPCMISMATCH: 526 str = "ERPCMISMATCH"; 527 break; 528 case EPROGUNAVAIL: 529 str = "EPROGUNAVAIL"; 530 break; 531 case EPROGMISMATCH: 532 str = "EPROGMISMATCH"; 533 break; 534 case EPROCUNAVAIL: 535 str = "EPROCUNAVAIL"; 536 break; 537 case ENOLCK: 538 str = "ENOLCK"; 539 break; 540 case ENOSYS: 541 str = "ENOSYS"; 542 break; 543 case EFTYPE: 544 str = "EFTYPE"; 545 break; 546 case EAUTH: 547 str = "EAUTH"; 548 break; 549 case ENEEDAUTH: 550 str = "ENEEDAUTH"; 551 break; 552 case EIDRM: 553 str = "EIDRM"; 554 break; 555 case ENOMSG: 556 str = "ENOMSG"; 557 break; 558 case EOVERFLOW: 559 str = "EOVERFLOW"; 560 break; 561 case ECANCELED: 562 str = "ECANCELED"; 563 break; 564 case EILSEQ: 565 str = "EILSEQ"; 566 break; 567 case ENOATTR: 568 str = "ENOATTR"; 569 break; 570 case EDOOFUS: 571 str = "EDOOFUS"; 572 break; 573 case EBADMSG: 574 str = "EBADMSG"; 575 break; 576 case EMULTIHOP: 577 str = "EMULTIHOP"; 578 break; 579 case ENOLINK: 580 str = "ENOLINK"; 581 break; 582 case EPROTO: 583 str = "EPROTO"; 584 break; 585 case ENOTCAPABLE: 586 str = "ENOTCAPABLE"; 587 break; 588 case ECAPMODE: 589 str = "ECAPMODE"; 590 break; 591 case ENOTRECOVERABLE: 592 str = "ENOTRECOVERABLE"; 593 break; 594 case EOWNERDEAD: 595 str = "EOWNERDEAD"; 596 break; 597 } 598 599 if (str) 600 snprintf(buf.str, ICE_STR_BUF_LEN, "%s", str); 601 else 602 snprintf(buf.str, ICE_STR_BUF_LEN, "%d", err); 603 604 return buf; 605 } 606 607 /** 608 * ice_fec_str - convert fec mode enum to a string 609 * @mode: the enum value to convert 610 * 611 * Convert an FEC mode enum to a string for display in a sysctl or log message. 612 * Returns "Unknown" if the mode is not one of currently known FEC modes. 613 */ 614 const char * 615 ice_fec_str(enum ice_fec_mode mode) 616 { 617 switch (mode) { 618 case ICE_FEC_AUTO: 619 return ICE_FEC_STRING_AUTO; 620 case ICE_FEC_RS: 621 return ICE_FEC_STRING_RS; 622 case ICE_FEC_BASER: 623 return ICE_FEC_STRING_BASER; 624 case ICE_FEC_NONE: 625 return ICE_FEC_STRING_NONE; 626 case ICE_FEC_DIS_AUTO: 627 return ICE_FEC_STRING_DIS_AUTO; 628 } 629 630 /* The compiler generates errors on unhandled enum values if we omit 631 * the default case. 632 */ 633 return "Unknown"; 634 } 635 636 /** 637 * ice_fc_str - convert flow control mode enum to a string 638 * @mode: the enum value to convert 639 * 640 * Convert a flow control mode enum to a string for display in a sysctl or log 641 * message. Returns "Unknown" if the mode is not one of currently supported or 642 * known flow control modes. 643 */ 644 const char * 645 ice_fc_str(enum ice_fc_mode mode) 646 { 647 switch (mode) { 648 case ICE_FC_FULL: 649 return ICE_FC_STRING_FULL; 650 case ICE_FC_TX_PAUSE: 651 return ICE_FC_STRING_TX; 652 case ICE_FC_RX_PAUSE: 653 return ICE_FC_STRING_RX; 654 case ICE_FC_NONE: 655 return ICE_FC_STRING_NONE; 656 case ICE_FC_AUTO: 657 case ICE_FC_PFC: 658 case ICE_FC_DFLT: 659 break; 660 } 661 662 /* The compiler generates errors on unhandled enum values if we omit 663 * the default case. 664 */ 665 return "Unknown"; 666 } 667 668 /** 669 * ice_fltr_flag_str - Convert filter flags to a string 670 * @flag: the filter flags to convert 671 * 672 * Convert the u16 flag value of a filter into a readable string for 673 * outputting in a sysctl. 674 */ 675 struct ice_str_buf 676 _ice_fltr_flag_str(u16 flag) 677 { 678 struct ice_str_buf buf = { .str = "" }; 679 const char *str = NULL; 680 681 switch (flag) { 682 case ICE_FLTR_RX: 683 str = "RX"; 684 break; 685 case ICE_FLTR_TX: 686 str = "TX"; 687 break; 688 case ICE_FLTR_TX_RX: 689 str = "TX_RX"; 690 break; 691 default: 692 break; 693 } 694 695 if (str) 696 snprintf(buf.str, ICE_STR_BUF_LEN, "%s", str); 697 else 698 snprintf(buf.str, ICE_STR_BUF_LEN, "%u", flag); 699 700 return buf; 701 } 702 703 /** 704 * ice_log_sev_str - Convert log level to a string 705 * @log_level: the log level to convert 706 * 707 * Convert the u8 log level of a FW logging module into a readable 708 * string for outputting in a sysctl. 709 */ 710 struct ice_str_buf 711 _ice_log_sev_str(u8 log_level) 712 { 713 struct ice_str_buf buf = { .str = "" }; 714 const char *str = NULL; 715 716 switch (log_level) { 717 case ICE_FWLOG_LEVEL_NONE: 718 str = "none"; 719 break; 720 case ICE_FWLOG_LEVEL_ERROR: 721 str = "error"; 722 break; 723 case ICE_FWLOG_LEVEL_WARNING: 724 str = "warning"; 725 break; 726 case ICE_FWLOG_LEVEL_NORMAL: 727 str = "normal"; 728 break; 729 case ICE_FWLOG_LEVEL_VERBOSE: 730 str = "verbose"; 731 break; 732 default: 733 break; 734 } 735 736 if (str) 737 snprintf(buf.str, ICE_STR_BUF_LEN, "%s", str); 738 else 739 snprintf(buf.str, ICE_STR_BUF_LEN, "%u", log_level); 740 741 return buf; 742 } 743 744 /** 745 * ice_fwd_act_str - convert filter action enum to a string 746 * @action: the filter action to convert 747 * 748 * Convert an enum value of type enum ice_sw_fwd_act_type into a string, for 749 * display in a sysctl filter list. Returns "UNKNOWN" for actions outside the 750 * enumeration type. 751 */ 752 const char * 753 ice_fwd_act_str(enum ice_sw_fwd_act_type action) 754 { 755 switch (action) { 756 case ICE_FWD_TO_VSI: 757 return "FWD_TO_VSI"; 758 case ICE_FWD_TO_VSI_LIST: 759 return "FWD_TO_VSI_LIST"; 760 case ICE_FWD_TO_Q: 761 return "FWD_TO_Q"; 762 case ICE_FWD_TO_QGRP: 763 return "FWD_TO_QGRP"; 764 case ICE_DROP_PACKET: 765 return "DROP_PACKET"; 766 case ICE_LG_ACTION: 767 return "LG_ACTION"; 768 case ICE_INVAL_ACT: 769 return "INVAL_ACT"; 770 } 771 772 /* The compiler generates errors on unhandled enum values if we omit 773 * the default case. 774 */ 775 return "Unknown"; 776 } 777 778 /** 779 * ice_mdd_tx_tclan_str - Convert MDD Tx TCLAN event to a string 780 * @event: the MDD event number to convert 781 * 782 * Convert the Tx TCLAN event value from the GL_MDET_TX_TCLAN register into 783 * a human readable string for logging of MDD events. 784 */ 785 struct ice_str_buf 786 _ice_mdd_tx_tclan_str(u8 event) 787 { 788 struct ice_str_buf buf = { .str = "" }; 789 const char *str = NULL; 790 791 switch (event) { 792 case 0: 793 str = "Wrong descriptor format/order"; 794 break; 795 case 1: 796 str = "Descriptor fetch failed"; 797 break; 798 case 2: 799 str = "Tail descriptor not EOP/NOP"; 800 break; 801 case 3: 802 str = "False scheduling error"; 803 break; 804 case 4: 805 str = "Tail value larger than ring len"; 806 break; 807 case 5: 808 str = "Too many data commands"; 809 break; 810 case 6: 811 str = "Zero packets sent in quanta"; 812 break; 813 case 7: 814 str = "Packet too small or too big"; 815 break; 816 case 8: 817 str = "TSO length doesn't match sum"; 818 break; 819 case 9: 820 str = "TSO tail reached before TLEN"; 821 break; 822 case 10: 823 str = "TSO max 3 descs for headers"; 824 break; 825 case 11: 826 str = "EOP on header descriptor"; 827 break; 828 case 12: 829 str = "MSS is 0 or TLEN is 0"; 830 break; 831 case 13: 832 str = "CTX desc invalid IPSec fields"; 833 break; 834 case 14: 835 str = "Quanta invalid # of SSO packets"; 836 break; 837 case 15: 838 str = "Quanta bytes exceeds pkt_len*64"; 839 break; 840 case 16: 841 str = "Quanta exceeds max_cmds_in_sq"; 842 break; 843 case 17: 844 str = "incoherent last_lso_quanta"; 845 break; 846 case 18: 847 str = "incoherent TSO TLEN"; 848 break; 849 case 19: 850 str = "Quanta: too many descriptors"; 851 break; 852 case 20: 853 str = "Quanta: # of packets mismatch"; 854 break; 855 default: 856 break; 857 } 858 859 if (str) 860 snprintf(buf.str, ICE_STR_BUF_LEN, "%s", str); 861 else 862 snprintf(buf.str, ICE_STR_BUF_LEN, "Unknown Tx TCLAN event %u", event); 863 864 return buf; 865 } 866 867 /** 868 * ice_mdd_tx_pqm_str - Convert MDD Tx PQM event to a string 869 * @event: the MDD event number to convert 870 * 871 * Convert the Tx PQM event value from the GL_MDET_TX_PQM register into 872 * a human readable string for logging of MDD events. 873 */ 874 struct ice_str_buf 875 _ice_mdd_tx_pqm_str(u8 event) 876 { 877 struct ice_str_buf buf = { .str = "" }; 878 const char *str = NULL; 879 880 switch (event) { 881 case 0: 882 str = "PCI_DUMMY_COMP"; 883 break; 884 case 1: 885 str = "PCI_UR_COMP"; 886 break; 887 /* Index 2 is unused */ 888 case 3: 889 str = "RCV_SH_BE_LSO"; 890 break; 891 case 4: 892 str = "Q_FL_MNG_EPY_CH"; 893 break; 894 case 5: 895 str = "Q_EPY_MNG_FL_CH"; 896 break; 897 case 6: 898 str = "LSO_NUMDESCS_ZERO"; 899 break; 900 case 7: 901 str = "LSO_LENGTH_ZERO"; 902 break; 903 case 8: 904 str = "LSO_MSS_BELOW_MIN"; 905 break; 906 case 9: 907 str = "LSO_MSS_ABOVE_MAX"; 908 break; 909 case 10: 910 str = "LSO_HDR_SIZE_ZERO"; 911 break; 912 case 11: 913 str = "RCV_CNT_BE_LSO"; 914 break; 915 case 12: 916 str = "SKIP_ONE_QT_ONLY"; 917 break; 918 case 13: 919 str = "LSO_PKTCNT_ZERO"; 920 break; 921 case 14: 922 str = "SSO_LENGTH_ZERO"; 923 break; 924 case 15: 925 str = "SSO_LENGTH_EXCEED"; 926 break; 927 case 16: 928 str = "SSO_PKTCNT_ZERO"; 929 break; 930 case 17: 931 str = "SSO_PKTCNT_EXCEED"; 932 break; 933 case 18: 934 str = "SSO_NUMDESCS_ZERO"; 935 break; 936 case 19: 937 str = "SSO_NUMDESCS_EXCEED"; 938 break; 939 case 20: 940 str = "TAIL_GT_RING_LENGTH"; 941 break; 942 case 21: 943 str = "RESERVED_DBL_TYPE"; 944 break; 945 case 22: 946 str = "ILLEGAL_HEAD_DROP_DBL"; 947 break; 948 case 23: 949 str = "LSO_OVER_COMMS_Q"; 950 break; 951 case 24: 952 str = "ILLEGAL_VF_QNUM"; 953 break; 954 case 25: 955 str = "QTAIL_GT_RING_LENGTH"; 956 break; 957 default: 958 break; 959 } 960 961 if (str) 962 snprintf(buf.str, ICE_STR_BUF_LEN, "%s", str); 963 else 964 snprintf(buf.str, ICE_STR_BUF_LEN, "Unknown Tx PQM event %u", event); 965 966 return buf; 967 } 968 969 /** 970 * ice_mdd_rx_str - Convert MDD Rx queue event to a string 971 * @event: the MDD event number to convert 972 * 973 * Convert the Rx queue event value from the GL_MDET_RX register into a human 974 * readable string for logging of MDD events. 975 */ 976 struct ice_str_buf 977 _ice_mdd_rx_str(u8 event) 978 { 979 struct ice_str_buf buf = { .str = "" }; 980 const char *str = NULL; 981 982 switch (event) { 983 case 1: 984 str = "Descriptor fetch failed"; 985 break; 986 default: 987 break; 988 } 989 990 if (str) 991 snprintf(buf.str, ICE_STR_BUF_LEN, "%s", str); 992 else 993 snprintf(buf.str, ICE_STR_BUF_LEN, "Unknown Rx event %u", event); 994 995 return buf; 996 } 997 998 /** 999 * ice_state_to_str - Convert the state enum to a string value 1000 * @state: the state bit to convert 1001 * 1002 * Converts a given state bit to its human readable string name. If the enum 1003 * value is unknown, returns NULL; 1004 */ 1005 const char * 1006 ice_state_to_str(enum ice_state state) 1007 { 1008 switch (state) { 1009 case ICE_STATE_CONTROLQ_EVENT_PENDING: 1010 return "CONTROLQ_EVENT_PENDING"; 1011 case ICE_STATE_VFLR_PENDING: 1012 return "VFLR_PENDING"; 1013 case ICE_STATE_MDD_PENDING: 1014 return "MDD_PENDING"; 1015 case ICE_STATE_RESET_OICR_RECV: 1016 return "RESET_OICR_RECV"; 1017 case ICE_STATE_RESET_PFR_REQ: 1018 return "RESET_PFR_REQ"; 1019 case ICE_STATE_PREPARED_FOR_RESET: 1020 return "PREPARED_FOR_RESET"; 1021 case ICE_STATE_SUBIF_NEEDS_REINIT: 1022 return "SUBIF_NEEDS_REINIT"; 1023 case ICE_STATE_RESET_FAILED: 1024 return "RESET_FAILED"; 1025 case ICE_STATE_DRIVER_INITIALIZED: 1026 return "DRIVER_INITIALIZED"; 1027 case ICE_STATE_NO_MEDIA: 1028 return "NO_MEDIA"; 1029 case ICE_STATE_RECOVERY_MODE: 1030 return "RECOVERY_MODE"; 1031 case ICE_STATE_ROLLBACK_MODE: 1032 return "ROLLBACK_MODE"; 1033 case ICE_STATE_LINK_STATUS_REPORTED: 1034 return "LINK_STATUS_REPORTED"; 1035 case ICE_STATE_ATTACHING: 1036 return "ATTACHING"; 1037 case ICE_STATE_DETACHING: 1038 return "DETACHING"; 1039 case ICE_STATE_LINK_DEFAULT_OVERRIDE_PENDING: 1040 return "LINK_DEFAULT_OVERRIDE_PENDING"; 1041 case ICE_STATE_LLDP_RX_FLTR_FROM_DRIVER: 1042 return "LLDP_RX_FLTR_FROM_DRIVER"; 1043 case ICE_STATE_MULTIPLE_TCS: 1044 return "MULTIPLE_TCS"; 1045 case ICE_STATE_DO_FW_DEBUG_DUMP: 1046 return "DO_FW_DEBUG_DUMP"; 1047 case ICE_STATE_LINK_ACTIVE_ON_DOWN: 1048 return "LINK_ACTIVE_ON_DOWN"; 1049 case ICE_STATE_FIRST_INIT_LINK: 1050 return "FIRST_INIT_LINK"; 1051 case ICE_STATE_DO_CREATE_MIRR_INTFC: 1052 return "DO_CREATE_MIRR_INTFC"; 1053 case ICE_STATE_DO_DESTROY_MIRR_INTFC: 1054 return "DO_DESTROY_MIRR_INTFC"; 1055 case ICE_STATE_PHY_FW_INIT_PENDING: 1056 return "PHY_FW_INIT_PENDING"; 1057 case ICE_STATE_LAST: 1058 return NULL; 1059 } 1060 1061 return NULL; 1062 } 1063 1064 /** 1065 * ice_fw_module_str - Convert a FW logging module to a string name 1066 * @module: the module to convert 1067 * 1068 * Given a FW logging module id, convert it to a shorthand human readable 1069 * name, for generating sysctl tunables. 1070 */ 1071 const char * 1072 ice_fw_module_str(enum ice_aqc_fw_logging_mod module) 1073 { 1074 switch (module) { 1075 case ICE_AQC_FW_LOG_ID_GENERAL: 1076 return "general"; 1077 case ICE_AQC_FW_LOG_ID_CTRL: 1078 return "ctrl"; 1079 case ICE_AQC_FW_LOG_ID_LINK: 1080 return "link"; 1081 case ICE_AQC_FW_LOG_ID_LINK_TOPO: 1082 return "link_topo"; 1083 case ICE_AQC_FW_LOG_ID_DNL: 1084 return "dnl"; 1085 case ICE_AQC_FW_LOG_ID_I2C: 1086 return "i2c"; 1087 case ICE_AQC_FW_LOG_ID_SDP: 1088 return "sdp"; 1089 case ICE_AQC_FW_LOG_ID_MDIO: 1090 return "mdio"; 1091 case ICE_AQC_FW_LOG_ID_ADMINQ: 1092 return "adminq"; 1093 case ICE_AQC_FW_LOG_ID_HDMA: 1094 return "hdma"; 1095 case ICE_AQC_FW_LOG_ID_LLDP: 1096 return "lldp"; 1097 case ICE_AQC_FW_LOG_ID_DCBX: 1098 return "dcbx"; 1099 case ICE_AQC_FW_LOG_ID_DCB: 1100 return "dcb"; 1101 case ICE_AQC_FW_LOG_ID_XLR: 1102 return "xlr"; 1103 case ICE_AQC_FW_LOG_ID_NVM: 1104 return "nvm"; 1105 case ICE_AQC_FW_LOG_ID_AUTH: 1106 return "auth"; 1107 case ICE_AQC_FW_LOG_ID_VPD: 1108 return "vpd"; 1109 case ICE_AQC_FW_LOG_ID_IOSF: 1110 return "iosf"; 1111 case ICE_AQC_FW_LOG_ID_PARSER: 1112 return "parser"; 1113 case ICE_AQC_FW_LOG_ID_SW: 1114 return "sw"; 1115 case ICE_AQC_FW_LOG_ID_SCHEDULER: 1116 return "scheduler"; 1117 case ICE_AQC_FW_LOG_ID_TXQ: 1118 return "txq"; 1119 case ICE_AQC_FW_LOG_ID_RSVD: 1120 return "acl"; 1121 case ICE_AQC_FW_LOG_ID_POST: 1122 return "post"; 1123 case ICE_AQC_FW_LOG_ID_WATCHDOG: 1124 return "watchdog"; 1125 case ICE_AQC_FW_LOG_ID_TASK_DISPATCH: 1126 return "task_dispatch"; 1127 case ICE_AQC_FW_LOG_ID_MNG: 1128 return "mng"; 1129 case ICE_AQC_FW_LOG_ID_SYNCE: 1130 return "synce"; 1131 case ICE_AQC_FW_LOG_ID_HEALTH: 1132 return "health"; 1133 case ICE_AQC_FW_LOG_ID_TSDRV: 1134 return "tsdrv"; 1135 case ICE_AQC_FW_LOG_ID_PFREG: 1136 return "pfreg"; 1137 case ICE_AQC_FW_LOG_ID_MDLVER: 1138 return "mdlver"; 1139 case ICE_AQC_FW_LOG_ID_MAX: 1140 return "unknown"; 1141 } 1142 1143 /* The compiler generates errors on unhandled enum values if we omit 1144 * the default case. 1145 */ 1146 return "unknown"; 1147 } 1148 1149 /** 1150 * ice_fw_lldp_status - Convert FW LLDP status to a string 1151 * @lldp_status: firmware LLDP status value to convert 1152 * 1153 * Given the FW LLDP status, convert it to a human readable string. 1154 */ 1155 struct ice_str_buf 1156 _ice_fw_lldp_status(u32 lldp_status) 1157 { 1158 struct ice_str_buf buf = { .str = "" }; 1159 const char *str = NULL; 1160 1161 switch (lldp_status) 1162 { 1163 case ICE_LLDP_ADMINSTATUS_DIS: 1164 str = "DISABLED"; 1165 break; 1166 case ICE_LLDP_ADMINSTATUS_ENA_RX: 1167 str = "ENA_RX"; 1168 break; 1169 case ICE_LLDP_ADMINSTATUS_ENA_TX: 1170 str = "ENA_TX"; 1171 break; 1172 case ICE_LLDP_ADMINSTATUS_ENA_RXTX: 1173 str = "ENA_RXTX"; 1174 break; 1175 case 0xF: 1176 str = "NVM_DEFAULT"; 1177 break; 1178 } 1179 1180 if (str) 1181 snprintf(buf.str, ICE_STR_BUF_LEN, "%s", str); 1182 else 1183 snprintf(buf.str, ICE_STR_BUF_LEN, "Unknown LLDP status %u", lldp_status); 1184 1185 return buf; 1186 } 1187