ppc64-diag-2.6.4/0000755000000000000000000000000012313010662012051 5ustar rootrootppc64-diag-2.6.4/doxygen.config0000644000000000000000000013426712313010662014732 0ustar rootroot# Doxyfile 1.3.8 # This file describes the settings to be used by the documentation system # doxygen (www.doxygen.org) for a project # # All text after a hash (#) is considered a comment and will be ignored # The format is: # TAG = value [value, ...] # For lists items can also be appended using: # TAG += value [value, ...] # Values that contain spaces should be placed between quotes (" ") #--------------------------------------------------------------------------- # Project related configuration options #--------------------------------------------------------------------------- # The PROJECT_NAME tag is a single word (or a sequence of words surrounded # by quotes) that should identify the project. PROJECT_NAME = ppc64-diag # The PROJECT_NUMBER tag can be used to enter a project or revision number. # This could be handy for archiving the generated documentation or # if some version control system is used. PROJECT_NUMBER = # The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) # base path where the generated documentation will be put. # If a relative path is entered, it will be relative to the location # where doxygen was started. If left blank the current directory will be used. OUTPUT_DIRECTORY = doc # If the CREATE_SUBDIRS tag is set to YES, then doxygen will create # 4096 sub-directories (in 2 levels) under the output directory of each output # format and will distribute the generated files over these directories. # Enabling this option can be useful when feeding doxygen a huge amount of source # files, where putting all generated files in the same directory would otherwise # cause performance problems for the file system. CREATE_SUBDIRS = NO # The OUTPUT_LANGUAGE tag is used to specify the language in which all # documentation generated by doxygen is written. Doxygen will use this # information to generate all constant output in the proper language. # The default language is English, other supported languages are: # Brazilian, Catalan, Chinese, Chinese-Traditional, Croatian, Czech, Danish, # Dutch, Finnish, French, German, Greek, Hungarian, Italian, Japanese, # Japanese-en (Japanese with English messages), Korean, Korean-en, Norwegian, # Polish, Portuguese, Romanian, Russian, Serbian, Slovak, Slovene, Spanish, # Swedish, and Ukrainian. OUTPUT_LANGUAGE = English # This tag can be used to specify the encoding used in the generated output. # The encoding is not always determined by the language that is chosen, # but also whether or not the output is meant for Windows or non-Windows users. # In case there is a difference, setting the USE_WINDOWS_ENCODING tag to YES # forces the Windows encoding (this is the default for the Windows binary), # whereas setting the tag to NO uses a Unix-style encoding (the default for # all platforms other than Windows). USE_WINDOWS_ENCODING = NO # If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will # include brief member descriptions after the members that are listed in # the file and class documentation (similar to JavaDoc). # Set to NO to disable this. BRIEF_MEMBER_DESC = YES # If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend # the brief description of a member or function before the detailed description. # Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the # brief descriptions will be completely suppressed. REPEAT_BRIEF = NO # This tag implements a quasi-intelligent brief description abbreviator # that is used to form the text in various listings. Each string # in this list, if found as the leading text of the brief description, will be # stripped from the text and the result after processing the whole list, is used # as the annotated text. Otherwise, the brief description is used as-is. If left # blank, the following values are used ("$name" is automatically replaced with the # name of the entity): "The $name class" "The $name widget" "The $name file" # "is" "provides" "specifies" "contains" "represents" "a" "an" "the" ABBREVIATE_BRIEF = # If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then # Doxygen will generate a detailed section even if there is only a brief # description. ALWAYS_DETAILED_SEC = NO # If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all inherited # members of a class in the documentation of that class as if those members were # ordinary class members. Constructors, destructors and assignment operators of # the base classes will not be shown. INLINE_INHERITED_MEMB = NO # If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full # path before files name in the file list and in the header files. If set # to NO the shortest path that makes the file name unique will be used. FULL_PATH_NAMES = YES # If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag # can be used to strip a user-defined part of the path. Stripping is # only done if one of the specified strings matches the left-hand part of # the path. The tag can be used to show relative paths in the file list. # If left blank the directory from which doxygen is run is used as the # path to strip. STRIP_FROM_PATH = # The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of # the path mentioned in the documentation of a class, which tells # the reader which header file to include in order to use a class. # If left blank only the name of the header file containing the class # definition is used. Otherwise one should specify the include paths that # are normally passed to the compiler using the -I flag. STRIP_FROM_INC_PATH = # If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter # (but less readable) file names. This can be useful is your file systems # doesn't support long names like on DOS, Mac, or CD-ROM. SHORT_NAMES = NO # If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen # will interpret the first line (until the first dot) of a JavaDoc-style # comment as the brief description. If set to NO, the JavaDoc # comments will behave just like the Qt-style comments (thus requiring an # explicit @brief command for a brief description. JAVADOC_AUTOBRIEF = NO # The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen # treat a multi-line C++ special comment block (i.e. a block of //! or /// # comments) as a brief description. This used to be the default behaviour. # The new default is to treat a multi-line C++ comment block as a detailed # description. Set this tag to YES if you prefer the old behaviour instead. MULTILINE_CPP_IS_BRIEF = NO # If the DETAILS_AT_TOP tag is set to YES then Doxygen # will output the detailed description near the top, like JavaDoc. # If set to NO, the detailed description appears after the member # documentation. DETAILS_AT_TOP = NO # If the INHERIT_DOCS tag is set to YES (the default) then an undocumented # member inherits the documentation from any documented member that it # re-implements. INHERIT_DOCS = YES # If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC # tag is set to YES, then doxygen will reuse the documentation of the first # member in the group (if any) for the other members of the group. By default # all members of a group must be documented explicitly. DISTRIBUTE_GROUP_DOC = NO # The TAB_SIZE tag can be used to set the number of spaces in a tab. # Doxygen uses this value to replace tabs by spaces in code fragments. TAB_SIZE = 8 # This tag can be used to specify a number of aliases that acts # as commands in the documentation. An alias has the form "name=value". # For example adding "sideeffect=\par Side Effects:\n" will allow you to # put the command \sideeffect (or @sideeffect) in the documentation, which # will result in a user-defined paragraph with heading "Side Effects:". # You can put \n's in the value part of an alias to insert newlines. ALIASES = # Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C sources # only. Doxygen will then generate output that is more tailored for C. # For instance, some of the names that are used will be different. The list # of all members will be omitted, etc. OPTIMIZE_OUTPUT_FOR_C = YES # Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java sources # only. Doxygen will then generate output that is more tailored for Java. # For instance, namespaces will be presented as packages, qualified scopes # will look different, etc. OPTIMIZE_OUTPUT_JAVA = NO # Set the SUBGROUPING tag to YES (the default) to allow class member groups of # the same type (for instance a group of public functions) to be put as a # subgroup of that type (e.g. under the Public Functions section). Set it to # NO to prevent subgrouping. Alternatively, this can be done per class using # the \nosubgrouping command. SUBGROUPING = NO #--------------------------------------------------------------------------- # Build related configuration options #--------------------------------------------------------------------------- # If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in # documentation are documented, even if no documentation was available. # Private class members and static file members will be hidden unless # the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES EXTRACT_ALL = YES # If the EXTRACT_PRIVATE tag is set to YES all private members of a class # will be included in the documentation. EXTRACT_PRIVATE = NO # If the EXTRACT_STATIC tag is set to YES all static members of a file # will be included in the documentation. EXTRACT_STATIC = YES # If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) # defined locally in source files will be included in the documentation. # If set to NO only classes defined in header files are included. EXTRACT_LOCAL_CLASSES = YES # This flag is only useful for Objective-C code. When set to YES local # methods, which are defined in the implementation section but not in # the interface are included in the documentation. # If set to NO (the default) only methods in the interface are included. EXTRACT_LOCAL_METHODS = NO # If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all # undocumented members of documented classes, files or namespaces. # If set to NO (the default) these members will be included in the # various overviews, but no documentation section is generated. # This option has no effect if EXTRACT_ALL is enabled. HIDE_UNDOC_MEMBERS = NO # If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all # undocumented classes that are normally visible in the class hierarchy. # If set to NO (the default) these classes will be included in the various # overviews. This option has no effect if EXTRACT_ALL is enabled. HIDE_UNDOC_CLASSES = NO # If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all # friend (class|struct|union) declarations. # If set to NO (the default) these declarations will be included in the # documentation. HIDE_FRIEND_COMPOUNDS = NO # If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any # documentation blocks found inside the body of a function. # If set to NO (the default) these blocks will be appended to the # function's detailed documentation block. HIDE_IN_BODY_DOCS = NO # The INTERNAL_DOCS tag determines if documentation # that is typed after a \internal command is included. If the tag is set # to NO (the default) then the documentation will be excluded. # Set it to YES to include the internal documentation. INTERNAL_DOCS = NO # If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate # file names in lower-case letters. If set to YES upper-case letters are also # allowed. This is useful if you have classes or files whose names only differ # in case and if your file system supports case sensitive file names. Windows # and Mac users are advised to set this option to NO. CASE_SENSE_NAMES = YES # If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen # will show members with their full class and namespace scopes in the # documentation. If set to YES the scope will be hidden. HIDE_SCOPE_NAMES = NO # If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen # will put a list of the files that are included by a file in the documentation # of that file. SHOW_INCLUDE_FILES = YES # If the INLINE_INFO tag is set to YES (the default) then a tag [inline] # is inserted in the documentation for inline members. INLINE_INFO = YES # If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen # will sort the (detailed) documentation of file and class members # alphabetically by member name. If set to NO the members will appear in # declaration order. SORT_MEMBER_DOCS = YES # If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the # brief documentation of file, namespace and class members alphabetically # by member name. If set to NO (the default) the members will appear in # declaration order. SORT_BRIEF_DOCS = NO # If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be # sorted by fully-qualified names, including namespaces. If set to # NO (the default), the class list will be sorted only by class name, # not including the namespace part. # Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. # Note: This option applies only to the class list, not to the # alphabetical list. SORT_BY_SCOPE_NAME = NO # The GENERATE_TODOLIST tag can be used to enable (YES) or # disable (NO) the todo list. This list is created by putting \todo # commands in the documentation. GENERATE_TODOLIST = YES # The GENERATE_TESTLIST tag can be used to enable (YES) or # disable (NO) the test list. This list is created by putting \test # commands in the documentation. GENERATE_TESTLIST = YES # The GENERATE_BUGLIST tag can be used to enable (YES) or # disable (NO) the bug list. This list is created by putting \bug # commands in the documentation. GENERATE_BUGLIST = YES # The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or # disable (NO) the deprecated list. This list is created by putting # \deprecated commands in the documentation. GENERATE_DEPRECATEDLIST= YES # The ENABLED_SECTIONS tag can be used to enable conditional # documentation sections, marked by \if sectionname ... \endif. ENABLED_SECTIONS = # The MAX_INITIALIZER_LINES tag determines the maximum number of lines # the initial value of a variable or define consists of for it to appear in # the documentation. If the initializer consists of more lines than specified # here it will be hidden. Use a value of 0 to hide initializers completely. # The appearance of the initializer of individual variables and defines in the # documentation can be controlled using \showinitializer or \hideinitializer # command in the documentation regardless of this setting. MAX_INITIALIZER_LINES = 30 # Set the SHOW_USED_FILES tag to NO to disable the list of files generated # at the bottom of the documentation of classes and structs. If set to YES the # list will mention the files that were used to generate the documentation. SHOW_USED_FILES = YES #--------------------------------------------------------------------------- # configuration options related to warning and progress messages #--------------------------------------------------------------------------- # The QUIET tag can be used to turn on/off the messages that are generated # by doxygen. Possible values are YES and NO. If left blank NO is used. QUIET = NO # The WARNINGS tag can be used to turn on/off the warning messages that are # generated by doxygen. Possible values are YES and NO. If left blank # NO is used. WARNINGS = YES # If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings # for undocumented members. If EXTRACT_ALL is set to YES then this flag will # automatically be disabled. WARN_IF_UNDOCUMENTED = YES # If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for # potential errors in the documentation, such as not documenting some # parameters in a documented function, or documenting parameters that # don't exist or using markup commands wrongly. WARN_IF_DOC_ERROR = YES # The WARN_FORMAT tag determines the format of the warning messages that # doxygen can produce. The string should contain the $file, $line, and $text # tags, which will be replaced by the file and line number from which the # warning originated and the warning text. WARN_FORMAT = "$file:$line: $text" # The WARN_LOGFILE tag can be used to specify a file to which warning # and error messages should be written. If left blank the output is written # to stderr. WARN_LOGFILE = #--------------------------------------------------------------------------- # configuration options related to the input files #--------------------------------------------------------------------------- # The INPUT tag can be used to specify the files and/or directories that contain # documented source files. You may enter file names like "myfile.cpp" or # directories like "/usr/src/myproject". Separate the files or directories # with spaces. INPUT = ./rtas_errd # If the value of the INPUT tag contains directories, you can use the # FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp # and *.h) to filter out the source-files in the directories. If left # blank the following patterns are tested: # *.c *.cc *.cxx *.cpp *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh *.hxx *.hpp # *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm FILE_PATTERNS = # The RECURSIVE tag can be used to turn specify whether or not subdirectories # should be searched for input files as well. Possible values are YES and NO. # If left blank NO is used. RECURSIVE = NO # The EXCLUDE tag can be used to specify files and/or directories that should # excluded from the INPUT source files. This way you can easily exclude a # subdirectory from a directory tree whose root is specified with the INPUT tag. EXCLUDE = # The EXCLUDE_SYMLINKS tag can be used select whether or not files or directories # that are symbolic links (a Unix filesystem feature) are excluded from the input. EXCLUDE_SYMLINKS = NO # If the value of the INPUT tag contains directories, you can use the # EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude # certain files from those directories. EXCLUDE_PATTERNS = # The EXAMPLE_PATH tag can be used to specify one or more files or # directories that contain example code fragments that are included (see # the \include command). EXAMPLE_PATH = # If the value of the EXAMPLE_PATH tag contains directories, you can use the # EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp # and *.h) to filter out the source-files in the directories. If left # blank all files are included. EXAMPLE_PATTERNS = # If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be # searched for input files to be used with the \include or \dontinclude # commands irrespective of the value of the RECURSIVE tag. # Possible values are YES and NO. If left blank NO is used. EXAMPLE_RECURSIVE = NO # The IMAGE_PATH tag can be used to specify one or more files or # directories that contain image that are included in the documentation (see # the \image command). IMAGE_PATH = # The INPUT_FILTER tag can be used to specify a program that doxygen should # invoke to filter for each input file. Doxygen will invoke the filter program # by executing (via popen()) the command , where # is the value of the INPUT_FILTER tag, and is the name of an # input file. Doxygen will then use the output that the filter program writes # to standard output. If FILTER_PATTERNS is specified, this tag will be # ignored. INPUT_FILTER = # The FILTER_PATTERNS tag can be used to specify filters on a per file pattern # basis. Doxygen will compare the file name with each pattern and apply the # filter if there is a match. The filters are a list of the form: # pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further # info on how filters are used. If FILTER_PATTERNS is empty, INPUT_FILTER # is applied to all files. FILTER_PATTERNS = # If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using # INPUT_FILTER) will be used to filter the input files when producing source # files to browse (i.e. when SOURCE_BROWSER is set to YES). FILTER_SOURCE_FILES = NO #--------------------------------------------------------------------------- # configuration options related to source browsing #--------------------------------------------------------------------------- # If the SOURCE_BROWSER tag is set to YES then a list of source files will # be generated. Documented entities will be cross-referenced with these sources. # Note: To get rid of all source code in the generated output, make sure also # VERBATIM_HEADERS is set to NO. SOURCE_BROWSER = NO # Setting the INLINE_SOURCES tag to YES will include the body # of functions and classes directly in the documentation. INLINE_SOURCES = NO # Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct # doxygen to hide any special comment blocks from generated source code # fragments. Normal C and C++ comments will always remain visible. STRIP_CODE_COMMENTS = YES # If the REFERENCED_BY_RELATION tag is set to YES (the default) # then for each documented function all documented # functions referencing it will be listed. REFERENCED_BY_RELATION = YES # If the REFERENCES_RELATION tag is set to YES (the default) # then for each documented function all documented entities # called/used by that function will be listed. REFERENCES_RELATION = YES # If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen # will generate a verbatim copy of the header file for each class for # which an include is specified. Set to NO to disable this. VERBATIM_HEADERS = YES #--------------------------------------------------------------------------- # configuration options related to the alphabetical class index #--------------------------------------------------------------------------- # If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index # of all compounds will be generated. Enable this if the project # contains a lot of classes, structs, unions or interfaces. ALPHABETICAL_INDEX = NO # If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then # the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns # in which this list will be split (can be a number in the range [1..20]) COLS_IN_ALPHA_INDEX = 5 # In case all classes in a project start with a common prefix, all # classes will be put under the same header in the alphabetical index. # The IGNORE_PREFIX tag can be used to specify one or more prefixes that # should be ignored while generating the index headers. IGNORE_PREFIX = #--------------------------------------------------------------------------- # configuration options related to the HTML output #--------------------------------------------------------------------------- # If the GENERATE_HTML tag is set to YES (the default) Doxygen will # generate HTML output. GENERATE_HTML = YES # The HTML_OUTPUT tag is used to specify where the HTML docs will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `html' will be used as the default path. HTML_OUTPUT = html # The HTML_FILE_EXTENSION tag can be used to specify the file extension for # each generated HTML page (for example: .htm,.php,.asp). If it is left blank # doxygen will generate files with .html extension. HTML_FILE_EXTENSION = .html # The HTML_HEADER tag can be used to specify a personal HTML header for # each generated HTML page. If it is left blank doxygen will generate a # standard header. HTML_HEADER = # The HTML_FOOTER tag can be used to specify a personal HTML footer for # each generated HTML page. If it is left blank doxygen will generate a # standard footer. HTML_FOOTER = # The HTML_STYLESHEET tag can be used to specify a user-defined cascading # style sheet that is used by each HTML page. It can be used to # fine-tune the look of the HTML output. If the tag is left blank doxygen # will generate a default style sheet. Note that doxygen will try to copy # the style sheet file to the HTML output directory, so don't put your own # stylesheet in the HTML output directory as well, or it will be erased! HTML_STYLESHEET = # If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes, # files or namespaces will be aligned in HTML using tables. If set to # NO a bullet list will be used. HTML_ALIGN_MEMBERS = YES # If the GENERATE_HTMLHELP tag is set to YES, additional index files # will be generated that can be used as input for tools like the # Microsoft HTML help workshop to generate a compressed HTML help file (.chm) # of the generated HTML documentation. GENERATE_HTMLHELP = NO # If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can # be used to specify the file name of the resulting .chm file. You # can add a path in front of the file if the result should not be # written to the html output directory. CHM_FILE = # If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can # be used to specify the location (absolute path including file name) of # the HTML help compiler (hhc.exe). If non-empty doxygen will try to run # the HTML help compiler on the generated index.hhp. HHC_LOCATION = # If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag # controls if a separate .chi index file is generated (YES) or that # it should be included in the master .chm file (NO). GENERATE_CHI = NO # If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag # controls whether a binary table of contents is generated (YES) or a # normal table of contents (NO) in the .chm file. BINARY_TOC = NO # The TOC_EXPAND flag can be set to YES to add extra items for group members # to the contents of the HTML help documentation and to the tree view. TOC_EXPAND = NO # The DISABLE_INDEX tag can be used to turn on/off the condensed index at # top of each HTML page. The value NO (the default) enables the index and # the value YES disables it. DISABLE_INDEX = NO # This tag can be used to set the number of enum values (range [1..20]) # that doxygen will group on one line in the generated HTML documentation. ENUM_VALUES_PER_LINE = 4 # If the GENERATE_TREEVIEW tag is set to YES, a side panel will be # generated containing a tree-like index structure (just like the one that # is generated for HTML Help). For this to work a browser that supports # JavaScript, DHTML, CSS and frames is required (for instance Mozilla 1.0+, # Netscape 6.0+, Internet explorer 5.0+, or Konqueror). Windows users are # probably better off using the HTML help feature. GENERATE_TREEVIEW = NO # If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be # used to set the initial width (in pixels) of the frame in which the tree # is shown. TREEVIEW_WIDTH = 250 #--------------------------------------------------------------------------- # configuration options related to the LaTeX output #--------------------------------------------------------------------------- # If the GENERATE_LATEX tag is set to YES (the default) Doxygen will # generate Latex output. GENERATE_LATEX = YES # The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `latex' will be used as the default path. LATEX_OUTPUT = latex # The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be # invoked. If left blank `latex' will be used as the default command name. LATEX_CMD_NAME = latex # The MAKEINDEX_CMD_NAME tag can be used to specify the command name to # generate index for LaTeX. If left blank `makeindex' will be used as the # default command name. MAKEINDEX_CMD_NAME = makeindex # If the COMPACT_LATEX tag is set to YES Doxygen generates more compact # LaTeX documents. This may be useful for small projects and may help to # save some trees in general. COMPACT_LATEX = NO # The PAPER_TYPE tag can be used to set the paper type that is used # by the printer. Possible values are: a4, a4wide, letter, legal and # executive. If left blank a4wide will be used. PAPER_TYPE = a4wide # The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX # packages that should be included in the LaTeX output. EXTRA_PACKAGES = # The LATEX_HEADER tag can be used to specify a personal LaTeX header for # the generated latex document. The header should contain everything until # the first chapter. If it is left blank doxygen will generate a # standard header. Notice: only use this tag if you know what you are doing! LATEX_HEADER = # If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated # is prepared for conversion to pdf (using ps2pdf). The pdf file will # contain links (just like the HTML output) instead of page references # This makes the output suitable for online browsing using a pdf viewer. PDF_HYPERLINKS = NO # If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of # plain latex in the generated Makefile. Set this option to YES to get a # higher quality PDF documentation. USE_PDFLATEX = NO # If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode. # command to the generated LaTeX files. This will instruct LaTeX to keep # running if errors occur, instead of asking the user for help. # This option is also used when generating formulas in HTML. LATEX_BATCHMODE = NO # If LATEX_HIDE_INDICES is set to YES then doxygen will not # include the index chapters (such as File Index, Compound Index, etc.) # in the output. LATEX_HIDE_INDICES = NO #--------------------------------------------------------------------------- # configuration options related to the RTF output #--------------------------------------------------------------------------- # If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output # The RTF output is optimized for Word 97 and may not look very pretty with # other RTF readers or editors. GENERATE_RTF = NO # The RTF_OUTPUT tag is used to specify where the RTF docs will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `rtf' will be used as the default path. RTF_OUTPUT = rtf # If the COMPACT_RTF tag is set to YES Doxygen generates more compact # RTF documents. This may be useful for small projects and may help to # save some trees in general. COMPACT_RTF = NO # If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated # will contain hyperlink fields. The RTF file will # contain links (just like the HTML output) instead of page references. # This makes the output suitable for online browsing using WORD or other # programs which support those fields. # Note: wordpad (write) and others do not support links. RTF_HYPERLINKS = NO # Load stylesheet definitions from file. Syntax is similar to doxygen's # config file, i.e. a series of assignments. You only have to provide # replacements, missing definitions are set to their default value. RTF_STYLESHEET_FILE = # Set optional variables used in the generation of an rtf document. # Syntax is similar to doxygen's config file. RTF_EXTENSIONS_FILE = #--------------------------------------------------------------------------- # configuration options related to the man page output #--------------------------------------------------------------------------- # If the GENERATE_MAN tag is set to YES (the default) Doxygen will # generate man pages GENERATE_MAN = NO # The MAN_OUTPUT tag is used to specify where the man pages will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `man' will be used as the default path. MAN_OUTPUT = man # The MAN_EXTENSION tag determines the extension that is added to # the generated man pages (default is the subroutine's section .3) MAN_EXTENSION = .3 # If the MAN_LINKS tag is set to YES and Doxygen generates man output, # then it will generate one additional man file for each entity # documented in the real man page(s). These additional files # only source the real man page, but without them the man command # would be unable to find the correct page. The default is NO. MAN_LINKS = NO #--------------------------------------------------------------------------- # configuration options related to the XML output #--------------------------------------------------------------------------- # If the GENERATE_XML tag is set to YES Doxygen will # generate an XML file that captures the structure of # the code including all documentation. GENERATE_XML = NO # The XML_OUTPUT tag is used to specify where the XML pages will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `xml' will be used as the default path. XML_OUTPUT = xml # The XML_SCHEMA tag can be used to specify an XML schema, # which can be used by a validating XML parser to check the # syntax of the XML files. XML_SCHEMA = # The XML_DTD tag can be used to specify an XML DTD, # which can be used by a validating XML parser to check the # syntax of the XML files. XML_DTD = # If the XML_PROGRAMLISTING tag is set to YES Doxygen will # dump the program listings (including syntax highlighting # and cross-referencing information) to the XML output. Note that # enabling this will significantly increase the size of the XML output. XML_PROGRAMLISTING = YES #--------------------------------------------------------------------------- # configuration options for the AutoGen Definitions output #--------------------------------------------------------------------------- # If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will # generate an AutoGen Definitions (see autogen.sf.net) file # that captures the structure of the code including all # documentation. Note that this feature is still experimental # and incomplete at the moment. GENERATE_AUTOGEN_DEF = NO #--------------------------------------------------------------------------- # configuration options related to the Perl module output #--------------------------------------------------------------------------- # If the GENERATE_PERLMOD tag is set to YES Doxygen will # generate a Perl module file that captures the structure of # the code including all documentation. Note that this # feature is still experimental and incomplete at the # moment. GENERATE_PERLMOD = NO # If the PERLMOD_LATEX tag is set to YES Doxygen will generate # the necessary Makefile rules, Perl scripts and LaTeX code to be able # to generate PDF and DVI output from the Perl module output. PERLMOD_LATEX = NO # If the PERLMOD_PRETTY tag is set to YES the Perl module output will be # nicely formatted so it can be parsed by a human reader. This is useful # if you want to understand what is going on. On the other hand, if this # tag is set to NO the size of the Perl module output will be much smaller # and Perl will parse it just the same. PERLMOD_PRETTY = YES # The names of the make variables in the generated doxyrules.make file # are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. # This is useful so different doxyrules.make files included by the same # Makefile don't overwrite each other's variables. PERLMOD_MAKEVAR_PREFIX = #--------------------------------------------------------------------------- # Configuration options related to the preprocessor #--------------------------------------------------------------------------- # If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will # evaluate all C-preprocessor directives found in the sources and include # files. ENABLE_PREPROCESSING = YES # If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro # names in the source code. If set to NO (the default) only conditional # compilation will be performed. Macro expansion can be done in a controlled # way by setting EXPAND_ONLY_PREDEF to YES. MACRO_EXPANSION = NO # If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES # then the macro expansion is limited to the macros specified with the # PREDEFINED and EXPAND_AS_PREDEFINED tags. EXPAND_ONLY_PREDEF = NO # If the SEARCH_INCLUDES tag is set to YES (the default) the includes files # in the INCLUDE_PATH (see below) will be search if a #include is found. SEARCH_INCLUDES = YES # The INCLUDE_PATH tag can be used to specify one or more directories that # contain include files that are not input files but should be processed by # the preprocessor. INCLUDE_PATH = # You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard # patterns (like *.h and *.hpp) to filter out the header-files in the # directories. If left blank, the patterns specified with FILE_PATTERNS will # be used. INCLUDE_FILE_PATTERNS = # The PREDEFINED tag can be used to specify one or more macro names that # are defined before the preprocessor is started (similar to the -D option of # gcc). The argument of the tag is a list of macros of the form: name # or name=definition (no spaces). If the definition and the = are # omitted =1 is assumed. PREDEFINED = # If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then # this tag can be used to specify a list of macro names that should be expanded. # The macro definition that is found in the sources will be used. # Use the PREDEFINED tag if you want to use a different macro definition. EXPAND_AS_DEFINED = # If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then # doxygen's preprocessor will remove all function-like macros that are alone # on a line, have an all uppercase name, and do not end with a semicolon. Such # function macros are typically used for boiler-plate code, and will confuse the # parser if not removed. SKIP_FUNCTION_MACROS = YES #--------------------------------------------------------------------------- # Configuration::additions related to external references #--------------------------------------------------------------------------- # The TAGFILES option can be used to specify one or more tagfiles. # Optionally an initial location of the external documentation # can be added for each tagfile. The format of a tag file without # this location is as follows: # TAGFILES = file1 file2 ... # Adding location for the tag files is done as follows: # TAGFILES = file1=loc1 "file2 = loc2" ... # where "loc1" and "loc2" can be relative or absolute paths or # URLs. If a location is present for each tag, the installdox tool # does not have to be run to correct the links. # Note that each tag file must have a unique name # (where the name does NOT include the path) # If a tag file is not located in the directory in which doxygen # is run, you must also specify the path to the tagfile here. TAGFILES = # When a file name is specified after GENERATE_TAGFILE, doxygen will create # a tag file that is based on the input files it reads. GENERATE_TAGFILE = # If the ALLEXTERNALS tag is set to YES all external classes will be listed # in the class index. If set to NO only the inherited external classes # will be listed. ALLEXTERNALS = NO # If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed # in the modules index. If set to NO, only the current project's groups will # be listed. EXTERNAL_GROUPS = YES # The PERL_PATH should be the absolute path and name of the perl script # interpreter (i.e. the result of `which perl'). PERL_PATH = /usr/bin/perl #--------------------------------------------------------------------------- # Configuration options related to the dot tool #--------------------------------------------------------------------------- # If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will # generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base or # super classes. Setting the tag to NO turns the diagrams off. Note that this # option is superseded by the HAVE_DOT option below. This is only a fallback. It is # recommended to install and use dot, since it yields more powerful graphs. CLASS_DIAGRAMS = YES # If set to YES, the inheritance and collaboration graphs will hide # inheritance and usage relations if the target is undocumented # or is not a class. HIDE_UNDOC_RELATIONS = YES # If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is # available from the path. This tool is part of Graphviz, a graph visualization # toolkit from AT&T and Lucent Bell Labs. The other options in this section # have no effect if this option is set to NO (the default) HAVE_DOT = NO # If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen # will generate a graph for each documented class showing the direct and # indirect inheritance relations. Setting this tag to YES will force the # the CLASS_DIAGRAMS tag to NO. CLASS_GRAPH = YES # If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen # will generate a graph for each documented class showing the direct and # indirect implementation dependencies (inheritance, containment, and # class references variables) of the class with other documented classes. COLLABORATION_GRAPH = YES # If the UML_LOOK tag is set to YES doxygen will generate inheritance and # collaboration diagrams in a style similar to the OMG's Unified Modeling # Language. UML_LOOK = NO # If set to YES, the inheritance and collaboration graphs will show the # relations between templates and their instances. TEMPLATE_RELATIONS = NO # If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT # tags are set to YES then doxygen will generate a graph for each documented # file showing the direct and indirect include dependencies of the file with # other documented files. INCLUDE_GRAPH = YES # If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and # HAVE_DOT tags are set to YES then doxygen will generate a graph for each # documented header file showing the documented files that directly or # indirectly include this file. INCLUDED_BY_GRAPH = YES # If the CALL_GRAPH and HAVE_DOT tags are set to YES then doxygen will # generate a call dependency graph for every global function or class method. # Note that enabling this option will significantly increase the time of a run. # So in most cases it will be better to enable call graphs for selected # functions only using the \callgraph command. CALL_GRAPH = NO # If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen # will graphical hierarchy of all classes instead of a textual one. GRAPHICAL_HIERARCHY = YES # The DOT_IMAGE_FORMAT tag can be used to set the image format of the images # generated by dot. Possible values are png, jpg, or gif # If left blank png will be used. DOT_IMAGE_FORMAT = png # The tag DOT_PATH can be used to specify the path where the dot tool can be # found. If left blank, it is assumed the dot tool can be found on the path. DOT_PATH = # The DOTFILE_DIRS tag can be used to specify one or more directories that # contain dot files that are included in the documentation (see the # \dotfile command). DOTFILE_DIRS = # The MAX_DOT_GRAPH_WIDTH tag can be used to set the maximum allowed width # (in pixels) of the graphs generated by dot. If a graph becomes larger than # this value, doxygen will try to truncate the graph, so that it fits within # the specified constraint. Beware that most browsers cannot cope with very # large images. MAX_DOT_GRAPH_WIDTH = 1024 # The MAX_DOT_GRAPH_HEIGHT tag can be used to set the maximum allows height # (in pixels) of the graphs generated by dot. If a graph becomes larger than # this value, doxygen will try to truncate the graph, so that it fits within # the specified constraint. Beware that most browsers cannot cope with very # large images. MAX_DOT_GRAPH_HEIGHT = 1024 # The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the # graphs generated by dot. A depth value of 3 means that only nodes reachable # from the root by following a path via at most 3 edges will be shown. Nodes that # lay further from the root node will be omitted. Note that setting this option to # 1 or 2 may greatly reduce the computation time needed for large code bases. Also # note that a graph may be further truncated if the graph's image dimensions are # not sufficient to fit the graph (see MAX_DOT_GRAPH_WIDTH and MAX_DOT_GRAPH_HEIGHT). # If 0 is used for the depth value (the default), the graph is not depth-constrained. MAX_DOT_GRAPH_DEPTH = 0 # If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will # generate a legend page explaining the meaning of the various boxes and # arrows in the dot generated graphs. GENERATE_LEGEND = YES # If the DOT_CLEANUP tag is set to YES (the default) Doxygen will # remove the intermediate dot files that are used to generate # the various graphs. DOT_CLEANUP = YES #--------------------------------------------------------------------------- # Configuration::additions related to the search engine #--------------------------------------------------------------------------- # The SEARCHENGINE tag specifies whether or not a search engine should be # used. If set to NO the values of all tags below this one will be ignored. SEARCHENGINE = NO ppc64-diag-2.6.4/ppc64-diag.spec0000644000000000000000000001415712313010662014573 0ustar rootrootName: ppc64-diag Version: 2.6.4 Release: 0 Summary: PowerLinux Platform Diagnostics Group: System Environment/Base License: Eclipse Public License (EPL) v1.0 Packager: IBM Corp. Vendor: IBM Corp. ExclusiveArch: ppc ppc64 BuildRequires: libservicelog-devel, flex, perl, /usr/bin/yacc BuildRequires: libvpd-devel BuildRequires: librtas-devel >= 1.3.9 BuildRequires: ncurses-devel Requires: servicelog, /sbin/chkconfig # PCI hotplug support on PowerKVM guest depends on below # powerpc-utils version. Requires: powerpc-utils >= 1.2.19 # Light Path Diagnostics depends on below lsvpd version. Requires: lsvpd >= 1.7.1 BuildRoot: %{_tmppath}/%{name}-%{version}-build Source0: ppc64-diag-%{version}.tar.gz %description This package contains various diagnostic tools for PowerLinux. These tools captures the diagnostic events from Power Systems platform firmware, SES enclosures and device drivers, and write events to servicelog database. It also provides automated responses to urgent events such as environmental conditions and predictive failures, if appropriate modifies the FRUs fault indicator(s) and provides event notification to system administrators or connected service frameworks. %prep %setup -q %build make %install make install DESTDIR=$RPM_BUILD_ROOT chmod 644 $RPM_BUILD_ROOT/etc/ppc64-diag/servevent_parse.pl mkdir $RPM_BUILD_ROOT/etc/ppc64-diag/ses_pages mkdir $RPM_BUILD_ROOT/var/log/dump ln -sfv /usr/sbin/usysattn $RPM_BUILD_ROOT/usr/sbin/usysfault %files %defattr (-,root,root,-) %doc /usr/share/doc/packages/ppc64-diag/COPYRIGHT %doc /usr/share/man/man8/* /usr/sbin/* %dir /etc/ppc64-diag %dir /etc/ppc64-diag/ses_pages %dir /var/log/dump %config /etc/ppc64-diag/* %config /etc/rc.powerfail %config %attr(755,root,root) /etc/init.d/rtas_errd %config %attr(755,root,root) /etc/init.d/opal_errd %config %attr(744,root,root) /etc/ppc64-diag/prrn_hotplug %post # Post-install script -------------------------------------------------- # We will install both opal_errd and rtas_errd daemon and during boottime # daemon will fail gracefully if its not relevant to the running platform /etc/ppc64-diag/ppc64_diag_setup --register >/dev/null 2>&1 /etc/ppc64-diag/lp_diag_setup --register >/dev/null 2>&1 if [ "$1" = "1" ]; then # first install /sbin/chkconfig --add rtas_errd /sbin/chkconfig --add opal_errd /etc/init.d/opal_errd start >/dev/null || /etc/init.d/rtas_errd start >/dev/null elif [ "$1" = "2" ]; then # upgrade /etc/init.d/rtas_errd restart >/dev/null || /etc/init.d/opal_errd restart >/dev/null fi %preun # Pre-uninstall script ------------------------------------------------- if [ "$1" = "0" ]; then # last uninstall /etc/init.d/opal_errd stop >/dev/null || /etc/init.d/rtas_errd stop >/dev/null /sbin/chkconfig --del opal_errd /sbin/chkconfig --del rtas_errd /etc/ppc64-diag/ppc64_diag_setup --unregister >/dev/null /etc/ppc64-diag/lp_diag_setup --unregister >/dev/null fi %triggerin -- librtas # trigger on librtas upgrades ------------------------------------------ if [ "$2" = "2" ]; then /etc/init.d/opal_errd restart >/dev/null || /etc/init.d/rtas_errd restart >/dev/null fi %changelog * Fri Mar 21 2014 - Vasant Hegde - 2.6.4 - Added support for PowerKVM host (opal_errd, extract_opal_dump) - Added support to parse PEL format log (opal-elog-parse) * Fri Mar 07 2014 - Vasant Hegde - 2.6.3 - Added platform validation code - Add support for hotplugging qemu pci devices via RTAS event - Minor bug fixes in rtas_errd code * Tue Aug 20 2013 - Vasant Hegde - 2.6.2 - Minor bug fix in diag_encl and encl_led * Fri Feb 08 2013 - Vasant Hegde - 2.6.1 - Handler to handle PRRN RTAS notification * Tue Jan 29 2013 - Vasant Hegde - 2.6.0-3 - rtas_errd segfault fix in test path (bug #88056) * Fri Jan 18 2013 - Vasant Hegde - 2.6.0-2 - Updated ELA catalog for e1000e and cxgb3 driver * Fri Jan 11 2013 - Vasant Hegde - 2.6.0-1 - ppc64_diag_notify alignment fix * Wed Dec 19 2012 - Vasant Hegde - 2.6.0 - Added Light Path Diagnostics code. * Fri Nov 23 2012 - Vasant Hegde - 2.5.1 - 2.5.1 release * Fri Sep 07 2012 - Vasant Hegde - 2.5.0 - Introduced new options to diag_encl command (Jim). - Added bluehawk enclosure diagnostics support (Jim). - Introduced new command "encl_led" to modify identify/fault indicators for SCSI enclosures (Jim). - Fixed bug #78826. - Added libvpd-devel as compilation dependency. * Wed May 23 2012 - Vasant Hegde - 2.4.4 - Fixed bug #80220 and #81288. * Tue Feb 14 2012 - Jim Keniston - 2.4.3 - Added message catalogs for the ipr, ixgb, lpfc, and qla2xxx drivers (Anithra). Fixed bugs #75118, #74636 and #74308. Removed obsolete ppc64_diag_servagent script. * Mon Jul 11 2011 - Anithra P Janakiraman -2.4.2-1 - Minor modifications to GPFS catalog files and syslog_to_svclog.cpp * Wed Jun 29 2011 - Anithra P Janakiraman -2.4.2-0 - Added gpfs files to the catalog, updated ppc64-diag-setup notification commands * Wed Jun 15 2011 - Jim Keniston - 2.4.1-0 - Changed Makefiles and rules.mk to build for the default architecture rather than -m32. * Tue Feb 22 2011 - Anithra P Janakiraman - 2.4.0-0 - Added ELA code to the package, made changes to the rules.mk and minor changes to the spec file. * Fri Nov 19 2010 - Brad Peters - 2.3.5-0 - Bug fix adding in support for -e and -l, so that root users can be notified of serviceable events. Addresses bug #26192 * Wed Feb 24 2010 - Mike Mason - 2.3.4-2 - Added SIGCHLD handler to clean up servicelog notification scripts. * Tue Sep 22 2009 - Brad Peters - 2.3.2-2 - Removed all absolute path references, specifically to /sbin/lsvpd and lsvpd * Mon Sep 21 2009 - Brad Peters - 2.3.2-1 - Removed .spec references to aaa_base and insserv, which are SLES specific ppc64-diag-2.6.4/COPYRIGHT0000644000000000000000000002576512313010662013363 0ustar rootrootEclipse Public License - v 1.0 THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS ECLIPSE PUBLIC LICENSE ("AGREEMENT"). ANY USE, REPRODUCTION OR DISTRIBUTION OF THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS AGREEMENT. 1. DEFINITIONS "Contribution" means: a) in the case of the initial Contributor, the initial code and documentation distributed under this Agreement, and b) in the case of each subsequent Contributor: i) changes to the Program, and ii) additions to the Program; where such changes and/or additions to the Program originate from and are distributed by that particular Contributor. A Contribution 'originates' from a Contributor if it was added to the Program by such Contributor itself or anyone acting on such Contributor's behalf. Contributions do not include additions to the Program which: (i) are separate modules of software distributed in conjunction with the Program under their own license agreement, and (ii) are not derivative works of the Program. "Contributor" means any person or entity that distributes the Program. "Licensed Patents " mean patent claims licensable by a Contributor which are necessarily infringed by the use or sale of its Contribution alone or when combined with the Program. "Program" means the Contributions distributed in accordance with this Agreement. "Recipient" means anyone who receives the Program under this Agreement, including all Contributors. 2. GRANT OF RIGHTS a) Subject to the terms of this Agreement, each Contributor hereby grants Recipient a non-exclusive, worldwide, royalty-free copyright license to reproduce, prepare derivative works of, publicly display, publicly perform, distribute and sublicense the Contribution of such Contributor, if any, and such derivative works, in source code and object code form. b) Subject to the terms of this Agreement, each Contributor hereby grants Recipient a non-exclusive, worldwide, royalty-free patent license under Licensed Patents to make, use, sell, offer to sell, import and otherwise transfer the Contribution of such Contributor, if any, in source code and object code form. This patent license shall apply to the combination of the Contribution and the Program if, at the time the Contribution is added by the Contributor, such addition of the Contribution causes such combination to be covered by the Licensed Patents. The patent license shall not apply to any other combinations which include the Contribution. No hardware per se is licensed hereunder. c) Recipient understands that although each Contributor grants the licenses to its Contributions set forth herein, no assurances are provided by any Contributor that the Program does not infringe the patent or other intellectual property rights of any other entity. Each Contributor disclaims any liability to Recipient for claims brought by any other entity based on infringement of intellectual property rights or otherwise. As a condition to exercising the rights and licenses granted hereunder, each Recipient hereby assumes sole responsibility to secure any other intellectual property rights needed, if any. For example, if a third party patent license is required to allow Recipient to distribute the Program, it is Recipient's responsibility to acquire that license before distributing the Program. d) Each Contributor represents that to its knowledge it has sufficient copyright rights in its Contribution, if any, to grant the copyright license set forth in this Agreement. 3. REQUIREMENTS A Contributor may choose to distribute the Program in object code form under its own license agreement, provided that: a) it complies with the terms and conditions of this Agreement; and b) its license agreement: i) effectively disclaims on behalf of all Contributors all warranties andi conditions, express and implied, including warranties or conditions of title and non-infringement, and implied warranties or conditions of merchantability and fitness for a particular purpose; ii) effectively excludes on behalf of all Contributors all liability for damages, including direct, indirect, special, incidental and consequential damages, such as lost profits; iii) states that any provisions which differ from this Agreement are offered by that Contributor alone and not by any other party; and iv) states that source code for the Program is available from such Contributor, and informs licensees how to obtain it in a reasonable manner on or through a medium customarily used for software exchange. When the Program is made available in source code form: a) it must be made available under this Agreement; and b) a copy of this Agreement must be included with each copy of the Program. Contributors may not remove or alter any copyright notices contained within the Program. Each Contributor must identify itself as the originator of its Contribution, if any, in a manner that reasonably allows subsequent Recipients to identify the originator of the Contribution. 4. COMMERCIAL DISTRIBUTION Commercial distributors of software may accept certain responsibilities with respect to end users, business partners and the like. While this license is intended to facilitate the commercial use of the Program, the Contributor who includes the Program in a commercial product offering should do so in a manner which does not create potential liability for other Contributors. Therefore, if a Contributor includes the Program in a commercial product offering, such Contributor ("Commercial Contributor") hereby agrees to defend and indemnify every other Contributor ("Indemnified Contributor") against any losses, damages and costs (collectively "Losses") arising from claims, lawsuits and other legal actions brought by a third party against the Indemnified Contributor to the extent caused by the acts or omissions of such Commercial Contributor in connection with its distribution of the Program in a commercial product offering. The obligations in this section do not apply to any claims or Losses relating to any actual or alleged intellectual property infringement. In order to qualify, an Indemnified Contributor must: a) promptly notify the Commercial Contributor in writing of such claim, and b) allow the Commercial Contributor to control, and cooperate with the Commercial Contributor in, the defense and any related settlement negotiations. The Indemnified Contributor may participate in any such claim at its own expense. For example, a Contributor might include the Program in a commercial product offering, Product X. That Contributor is then a Commercial Contributor. If that Commercial Contributor then makes performance claims, or offers warranties related to Product X, those performance claims and warranties are such Commercial Contributor's responsibility alone. Under this section, the Commercial Contributor would have to defend claims against the other Contributors related to those performance claims and warranties, and if a court requires any other Contributor to pay any damages as a result, the Commercial Contributor must pay those damages. 5. NO WARRANTY EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE PROGRAM IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION, ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is solely responsible for determining the appropriateness of using and distributing the Program and assumes all risks associated with its exercise of rights under this Agreement , including but not limited to the risks and costs of program errors, compliance with applicable laws, damage to or loss of data, programs or equipment, and unavailability or interruption of operations. 6. DISCLAIMER OF LIABILITY EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER RECIPIENT NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT, INCIDENTAL,i SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING WITHOUT LIMITATION LOST PROFITS), 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 OR DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. 7. GENERAL If any provision of this Agreement is invalid or unenforceable under applicable law, it shall not affect the validity or enforceability of the remainder of the terms of this Agreement, and without further action by the parties hereto, such provision shall be reformed to the minimum extent necessary to make such provision valid and enforceable. If Recipient institutes patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Program itself (excluding combinations of the Program with other software or hardware) infringes such Recipient's patent(s), then such Recipient's rights granted under Section 2(b) shall terminate as of the date such litigation is filed. All Recipient's rights under this Agreement shall terminate if it fails to comply with any of the material terms or conditions of this Agreement and does not cure such failure in a reasonable period of time after becoming aware of such noncompliance. If all Recipient's rights under this Agreement terminate, Recipient agrees to cease use and distribution of the Program as soon as reasonably practicable. However, Recipient's obligations under this Agreement and any licenses granted by Recipient relating to the Program shall continue and survive. Everyone is permitted to copy and distribute copies of this Agreement, but in order to avoid inconsistency the Agreement is copyrighted and may only be modified in the following manner. The Agreement Steward reserves the right to publish new versions (including revisions) of this Agreement from time to time. No one other than the Agreement Steward has the right to modify this Agreement. The Eclipse Foundation is the initial Agreement Steward. The Eclipse Foundation may assign the responsibility to serve as the Agreement Steward to a suitable separate entity. Each new version of the Agreement will be given a distinguishing version number. The Program (including Contributions) may always be distributed subject to the version of the Agreement under which it was received. In addition, after a new version of the Agreement is published, Contributor may elect to distribute the Program (including its Contributions) under the new version. Except as expressly stated in Sections 2(a) and 2(b) above, Recipient receives no rights or licenses to the intellectual property of any Contributor under this Agreement, whether expressly, by implication, estoppel or otherwise. All rights in the Program not expressly granted under this Agreement are reserved. This Agreement is governed by the laws of the State of New York and the intellectual property laws of the United States of America. No party to this Agreement will bring a legal action under this Agreement more than one year after the cause of action arose. Each party waives its rights to a jury trial in any resulting litigation. ppc64-diag-2.6.4/rules.mk0000644000000000000000000001265112313010662013541 0ustar rootroot# # Common Makefile definitions # PWD = $(shell echo `pwd`) INSTALL = /usr/bin/install DOXYGEN = `which doxygen` # Name of the rpm spec file SPECFILENAME = ppc64-diag.spec # resolves the root directory at which this build is occuring ROOT_DIR = \ $(shell \ while [[ `pwd` != "/" ]]; \ do \ if [[ -f `pwd`/$(SPECFILENAME) ]]; \ then \ echo `pwd`; \ break; \ fi; \ cd ..; \ done;) # Full path to the rpm specfile SPECFILE = $(ROOT_DIR)/$(SPECFILENAME) # Find the correct command to build RPM's RPM = \ $(shell \ if [[ -a /bin/rpmbuild ]]; then \ echo "/bin/rpmbuild"; \ elif [[ -a /usr/bin/rpmbuild ]]; then \ echo "/usr/bin/rpmbuild"; \ elif [[ -a /bin/rpm ]]; then \ echo "/bin/rpm"; \ elif [[ -a /usr/bin/rpm ]]; then \ echo "/usr/bin/rpmbuild"; \ else \ echo "rpm seems to be non-existant"; \ fi;) # Pull the version, release and project name info from the spec file VERSION := $(shell echo `grep "Version:" $(SPECFILE) | cut -f2`) RELEASE := $(shell echo `grep "Release:" $(SPECFILE) | cut -f2`) PROJECT := $(shell echo `grep "Name:" $(SPECFILE) | cut -f2`) # Generate the Major, Minor and Revision numbers from the version VERSION_LIST := $(subst ., ,$(VERSION)) MAJOR_NO := $(word 1,$(VERSION_LIST)) MINOR_NO := $(word 2,$(VERSION_LIST)) REVISION_NO := $(word 3,$(VERSION_LIST)) # Set this if you want to install to a base directory other than / DESTDIR ?= # Standard base directory names BIN_DIR = /usr/bin SBIN_DIR = /usr/sbin LIB_DIR = /usr/lib INC_DIR = /usr/include DOC_DIR = /usr/share/doc/packages/$(PROJECT) MAN_DIR = /usr/share/man/man8 # Shipdir is where we put all the files to build an rpm SHIPDIR = /tmp/$(PROJECT)-buildroot # Source tarball name and build directory TARBALL = $(PROJECT)-$(VERSION).tar.gz TARBALL_FILES = Makefile rules.mk COPYRIGHT $(SPECFILENAME) TB_DIR = $(PROJECT)-$(VERSION) COM_DIR = common # Build a tarball of the source code BUILD_TARBALL = \ $(shell \ echo CVS > ./ignore; \ mkdir $(TB_DIR); \ cp -R $(COM_DIR) $(TB_DIR); \ cp -R $(SUBDIRS) $(TARBALL_FILES) $(TB_DIR); \ tar -zcf $(TARBALL) -X ./ignore $(TB_DIR);) # Current build directory WORK_DIR = $(patsubst /%,%,$(subst $(ROOT_DIR),,$(PWD))) # You should always build with -Wall CFLAGS += -Wall # Uncomment this for debug builds CFLAGS += -g -DDEBUG # Build with common directory included CFLAGS += -I $(ROOT_DIR)/$(COM_DIR) # Build with version string AM_CFLAGS = -DVERSION='"$(VERSION)"' # You should always build with -Wall CXXFLAGS += -Wall # Uncomment this for debug builds CXXFLAGS += -g -DDEBUG # Build with common directory included CXXFLAGS += -I $(ROOT_DIR)/$(COM_DIR) # Build with version string AM_CXXFLAGS = -DVERSION='"$(VERSION)"' # If you wish to have a log of installed files, define the file here INSTALL_LOG ?= $(ROOT_DIR)/install.log # # install_files - Install file(s) in the given location # # $1 - files to be installed # $2 - permissions to install file with # $3 - directory to install file to define install_files $(INSTALL) -d -m 755 $3; $(foreach f,$1, \ echo "Installing $(patsubst /%,%,$(WORK_DIR)/$f)"; \ $(INSTALL) -m $2 $f $3; \ $(if $(INSTALL_LOG),echo $3/$f >> $(INSTALL_LOG);,)) endef # # The following are wrappers for calls to install_files for # installing files in known locations (i.e. /usr/bin). The args # to each of the wrappers are the same. # # $1 - files to be installed # $2 - prefix to install path for the files # define install_bin $(call install_files,$1,755,$2/$(BIN_DIR)) endef define install_sbin $(call install_files,$1,744,$2/$(SBIN_DIR)) endef define install_lib $(call install_files,$1,755,$2/$(LIB_DIR)) endef define install_inc $(call install_files,$1,644,$2/$(INC_DIR)) endef define install_doc $(call install_files,$1,644,$2/$(DOC_DIR)) endef define install_man $(call install_files,$1,644,$2/$(MAN_DIR)) endef # # uninstall_files - Uninstall file(s) # # $1 - files to be uninstalled # $2 - the directory the files to uninstall live in define uninstall_files $(foreach f,$1, \ echo "Un-installing $(patsubst /%,%,$(WORK_DIR)/$f)"; \ rm -f $2/$f;) endef # # The following are wrappers for calls to uninstall_files for # removing files in known locations (i.e. /usr/bin). The args # to each of the wrappers are the same. # # $1 - files to be uninstalled # $2 - prefix to uninstall path for the files # define uninstall_bin $(call uninstall_files,$1,$2/$(BIN_DIR)) endef define uninstall_sbin $(call uninstall_files,$1,$2/$(SBIN_DIR)) endef define uninstall_lib $(call uninstall_files,$1,$2/$(LIB_DIR)) endef define uninstall_inc $(call uninstall_files,$1,$2/$(INC_DIR)) endef define uninstall_doc $(call uninstall_files,$1,$2/$(DOC_DIR)) endef define uninstall_man $(call uninstall_files,$1,$2/$(MAN_DIR)) endef # Define "CLEAN" as rm plus any files defined in this file that # the actual Makefile may not (or have to) know about CLEAN = @echo "" # Default target for building object files %.o: %.c @echo "CC $(WORK_DIR)/$@" @$(CC) -c $(AM_CFLAGS) $(CFLAGS) $< ppc64-diag-2.6.4/Makefile0000644000000000000000000000212512313010662013511 0ustar rootroot# # Makefile for ppc64-diag # include rules.mk .SILENT: SUBDIRS = rtas_errd diags scripts ela lpd opal_errd LICENSE = COPYRIGHT DOXYGEN_CFG = doxygen.config TARBALL_FILES += $(DOXYGEN_CFG) all: @echo "Building rtas_errd files..." @$(MAKE) -C rtas_errd @echo "Building diags files..." @$(MAKE) -C diags @echo "Building ela files..." @$(MAKE) -C ela @echo "Building lpd files..." @$(MAKE) -C lpd @echo "Building opal_errd files..." @$(MAKE) -C opal_errd install: all @$(call install_files,$(LICENSE),644,$(DESTDIR)/usr/share/doc/packages/ppc64-diag) @$(foreach d,$(SUBDIRS), $(MAKE) -C $d install;) uninstall: @$(call uninstall_files,$(LICENSE),644,$(DESTDIR)/usr/share/doc/packages/ppc64-diag) @$(foreach d,$(SUBDIRS), $(MAKE) -C $d uninstall;) rpm: all @echo "Creating rpm..." @export DESTDIR=$(SHIPDIR); $(MAKE) install @$(RPM) -bb ppc64-diag.spec @rm -rf $(SHIPDIR) tarball: clean @echo "Creating source tarball..." @$(BUILD_TARBALL) doc: $(DOXYGEN_CFG) @$(DOXYGEN) $(DOXYGEN_CFG) clean: @$(foreach d,$(SUBDIRS), $(MAKE) -C $d clean;) @$(CLEAN) $(SHIPDIR) $(TARBALL) doc ppc64-diag-2.6.4/opal_errd/0000755000000000000000000000000012313010662014020 5ustar rootrootppc64-diag-2.6.4/opal_errd/extract_opal_dump.c0000644000000000000000000001610012313010662017674 0ustar rootroot/** * @file extract_opal_dump.c * @brief Command to extract a platform dump on PowerNV platform * and copy it to the filesystem * * Copyright (C) 2014 IBM Corporation */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define DEFAULT_SYSFS_PATH "/sys" #define DEFAULT_OUTPUT_DIR "/var/log/dump" int opt_ack_dump = 1; int opt_wait = 0; char *opt_sysfs = DEFAULT_SYSFS_PATH; char *opt_output_dir = DEFAULT_OUTPUT_DIR; static void help(const char* argv0) { fprintf(stderr, "%s help:\n", argv0); fprintf(stderr, "\n"); fprintf(stderr, "-A - Don't acknowledge dump\n"); fprintf(stderr, "-s dir - sysfs directory (default %s)\n", DEFAULT_SYSFS_PATH); fprintf(stderr, "-o dir - directory to save dumps (default %s)\n", DEFAULT_OUTPUT_DIR); fprintf(stderr, "-w - wait for a dump\n"); fprintf(stderr, "-h - help (this message)\n"); } #define DUMP_HDR_PREFIX_OFFSET 0x16 /* Prefix size in dump header */ #define DUMP_HDR_FNAME_OFFSET 0x18 /* Suggested filename in dump header */ #define DUMP_MAX_FNAME_LEN 48 /* Including .PARTIAL */ static void dump_get_file_name(char *buf, int bsize, char *dfile, uint16_t *prefix_size) { if (bsize >= DUMP_HDR_PREFIX_OFFSET + sizeof(uint16_t)) *prefix_size = be16toh(*(uint16_t *)(buf + DUMP_HDR_PREFIX_OFFSET)); if (bsize >= DUMP_HDR_FNAME_OFFSET + DUMP_MAX_FNAME_LEN) strncpy(dfile, buf + DUMP_HDR_FNAME_OFFSET, DUMP_MAX_FNAME_LEN); else strcpy(dfile, "platform.dumpid.PARTIAL"); dfile[DUMP_MAX_FNAME_LEN - 1] = '\0'; } static void ack_dump(const char* dump_dir_path) { char ack_file[PATH_MAX]; int fd; int rc; snprintf(ack_file, sizeof(ack_file), "%s/acknowledge", dump_dir_path); fd = open(ack_file, O_WRONLY); if (fd == -1) { syslog(LOG_ERR, "Failed to acknowledge platform dump: %s" " (%d:%s)\n", ack_file, errno, strerror(errno)); return; } rc = write(fd, "ack\n", 4); if (rc != 4) { syslog(LOG_ERR, "Failed to acknowledge platform dump: %s" " (%d:%s)\n", ack_file, errno, strerror(errno)); return; } close(fd); } static int process_dump(const char* dump_dir_path, const char *output_dir) { int in_fd = -1; int out_fd = -1; int dir_fd = -1; char dump_path[PATH_MAX]; char final_dump_path[PATH_MAX]; char *buf; size_t bufsz; struct stat sbuf; int ret = -1; ssize_t sz = 0; ssize_t readsz = 0; char outfname[DUMP_MAX_FNAME_LEN]; uint16_t prefix_size; int rc; snprintf(dump_path, sizeof(dump_path), "%s/dump", dump_dir_path); if (stat(dump_path,&sbuf) == -1) return -1; bufsz = sbuf.st_size; buf = (char*)malloc(bufsz); in_fd = open(dump_path, O_RDONLY); if (in_fd == -1) { syslog(LOG_ERR, "Failed to open platform dump: %s (%d:%s)\n", dump_path, errno, strerror(errno)); goto err; } do { readsz = read(in_fd, buf+sz, bufsz-sz); if (readsz == -1) { syslog(LOG_ERR, "Failed to read platform dump: %s " "(%d:%s)\n", dump_path, errno, strerror(errno)); goto err; } sz += readsz; } while(sz != bufsz); dump_get_file_name(buf, bufsz, outfname, &prefix_size); snprintf(dump_path, sizeof(dump_path), "%s/%s.tmp", output_dir, outfname); snprintf(final_dump_path, sizeof(dump_path), "%s/%s", output_dir, outfname); out_fd = open(dump_path, O_WRONLY|O_CREAT|O_EXCL, S_IRUSR|S_IRGRP); if (out_fd == -1) { syslog(LOG_ERR, "Failed to write platform dump: %s (%d:%s)\n", dump_path, errno, strerror(errno)); goto err; } sz = write(out_fd, buf, bufsz); if (sz != bufsz) { syslog(LOG_ERR, "Failed to write platform dump: %s (%d:%s)\n", dump_path, errno, strerror(errno)); unlink(dump_path); goto err; } dir_fd = open(output_dir, O_RDONLY|O_DIRECTORY); rc = fsync(out_fd); if (rc == -1) { syslog(LOG_ERR, "Failed to sync platform dump: %s (%d:%s)\n", dump_path, errno, strerror(errno)); goto err; } rc = rename(dump_path, final_dump_path); if (rc == -1) { syslog(LOG_ERR, "Failed to rename platform dump %s to %s" "(%d: %s)\n", dump_path, final_dump_path, errno, strerror(errno)); goto err; } rc = fsync(dir_fd); if (rc == -1) { syslog(LOG_ERR, "Failed to sync platform dump directory: %s" " (%d:%s)\n", output_dir, errno, strerror(errno)); } syslog(LOG_NOTICE, "New platform dump available. File: %s/%s\n", output_dir, outfname); ret = 0; err: if (in_fd != -1) close(in_fd); if (out_fd != -1) close(out_fd); if (dir_fd != -1) close(dir_fd); free(buf); return ret; } static int find_and_process_dumps(const char *opal_dump_dir, const char *output_dir) { int rc; int retval= 0; struct dirent **namelist; struct dirent *dirent; char dump_path[PATH_MAX]; int is_dir= 0; struct stat sbuf; int n; int i; n = scandir(opal_dump_dir, &namelist, NULL, alphasort); if (n < 0) return -1; for (i = 0; i < n; i++) { dirent = namelist[i]; if (dirent->d_name[0] == '.') { free(namelist[i]); continue; } snprintf(dump_path, sizeof(dump_path), "%s/%s", opal_dump_dir, dirent->d_name); is_dir = 0; if (dirent->d_type == DT_DIR) { is_dir = 1; } else { /* Fall back to stat() */ rc = stat(dump_path, &sbuf); if (S_ISDIR(sbuf.st_mode)) { is_dir = 1; } } if (is_dir) { rc = process_dump(dump_path, output_dir); if (rc != 0 && retval == 0) retval = -1; if (rc == 0 && retval >= 0) retval++; if (opt_ack_dump) ack_dump(dump_path); } free(namelist[i]); } free(namelist); return retval; } int main(int argc, char *argv[]) { int opt; char sysfs_path[PATH_MAX]; int rc; int fd; fd_set exceptfds; struct stat s; while ((opt = getopt(argc, argv, "As:o:wh")) != -1) { switch (opt) { case 'A': opt_ack_dump = 0; break; case 's': opt_sysfs = optarg; break; case 'o': opt_output_dir = optarg; break; case 'w': opt_wait = 1; break; case 'h': help(argv[0]); exit(EXIT_SUCCESS); default: help(argv[0]); exit(EXIT_FAILURE); } } setlogmask(LOG_UPTO(LOG_NOTICE)); openlog("OPAL_DUMP", LOG_CONS | LOG_PID | LOG_NDELAY | LOG_PERROR, LOG_LOCAL1); snprintf(sysfs_path, sizeof(sysfs_path), "%s/firmware/opal/dump", opt_sysfs); rc = stat(sysfs_path, &s); if (rc != 0) { syslog(LOG_ERR, "Error accessing sysfs: %s (%d: %s)\n", sysfs_path, errno, strerror(errno)); exit(EXIT_FAILURE); } rc = stat(opt_output_dir, &s); if (rc != 0) { syslog(LOG_ERR, "Error accessing output dir: %s (%d: %s)\n", opt_output_dir, errno, strerror(errno)); exit(EXIT_FAILURE); } start: rc = find_and_process_dumps(sysfs_path, opt_output_dir); if (rc == 0 && opt_wait) { fd = open(sysfs_path, O_RDONLY|O_DIRECTORY); if (fd < 0) exit(EXIT_FAILURE); FD_ZERO(&exceptfds); FD_SET(fd, &exceptfds); rc = select(fd+1, NULL, NULL, &exceptfds, NULL); if (rc == -1) exit(EXIT_FAILURE); close(fd); goto start; } closelog(); if (rc < 0) exit(EXIT_FAILURE); return 0; } ppc64-diag-2.6.4/opal_errd/test-opal_errd.result0000644000000000000000000000144212313010662020205 0ustar rootrootELOG[XXXX]: LID[1]::SRC[TESTSRC1]::Not Applicable::Informational Error::No service action required ELOG[XXXX]: LID[2]::SRC[TESTSRC2]::Processor, including internal cache::Recoverable Error::Service action and call home required ELOG[XXXX]: LID[3]::SRC[TESTSRC3]::Platform Firmware::Predictive Error::Service action and call home required ELOG[XXXX]: LID[50000004]::SRC[TESTSRC4]::Software::Unrecoverable Error::Service action and call home required ELOG[XXXX]: LID[5]::SRC[TESTSRC5]::Not Applicable::NONE::Service action and call home required ELOG[XXXX]: LID[50000006]::SRC[CALLHOME]::Power/Cooling System::NONE::No service action required ELOG[XXXX]: LID[5055ed2e]::SRC[B182950C]::Platform Firmware::Informational Error::No service action required platform 22a3594fc4dcca31256e21ca65fa044a platform ppc64-diag-2.6.4/opal_errd/test-opal-elog-parse0000755000000000000000000000331612313010662017715 0ustar rootroot#!/bin/bash SYSFS=`mktemp -d --tmpdir opal-elog-parse.sysfs.XXXXXXXXXX` OUT=`mktemp -d --tmpdir opal-elog-parse.log.XXXXXXXXXX` LOG=`mktemp --tmpdir opal-elog-parse.out.XXXXXXXXXX` cp -pr sysfs-test/* $SYSFS/ echo 'test-opal-elog-parse' > $LOG ./opal_errd -s $SYSFS -o $OUT/platform -D -e /bin/true 2>&1 \ | sed -e 's/ELOG\[[0-9]*\]/ELOG[XXXX]/' >> $LOG ./opal-elog-parse/opal-elog-parse -l -f $OUT/platform &>> $LOG 1>&2 # First 3 elogs are completely synthesized and not *entirely* according # to spec, but useful in testing. ./opal-elog-parse/opal-elog-parse -d 1 -f $OUT/platform &>> $LOG 1>&2 R=$? if [ $R -ne 234 ]; then echo 'FAIL:' $R; exit $R fi ./opal-elog-parse/opal-elog-parse -d 2 -f $SYSFS/firmware/opal/elog/0x02/raw &>> $LOG 1>&2 R=$? if [ $R -ne 234 ]; then echo 'FAIL:' $R; exit $R fi ./opal-elog-parse/opal-elog-parse -d 3 -f $SYSFS/firmware/opal/elog/0x03/raw &>> $LOG 1>&2 R=$? if [ $R -ne 234 ]; then echo 'FAIL:' $R; exit $R fi # Next log entry is from FSP A, so has 0x50 ./opal-elog-parse/opal-elog-parse -d 0x50000004 -f $SYSFS/firmware/opal/elog/0x04/raw &>> $LOG 1>&2 R=$? if [ $R -ne 0 ]; then echo 'FAIL:' $R; exit $R fi # Simualted log with a Call Hom esection ./opal-elog-parse/opal-elog-parse -d 0x50000006 -f $SYSFS/firmware/opal/elog/0x06/raw &>> $LOG 1>&2 R=$? if [ $R -ne 0 ]; then echo 'FAIL:' $R; exit $R fi # Our first "real" elog, this should parse 100% successfully ./opal-elog-parse/opal-elog-parse -d 0x5055ED2E -f $SYSFS/firmware/opal/elog/0x5055ED2E/raw &>> $LOG 1>&2 R=$? if [ $R -ne 0 ]; then echo 'FAIL:' $R; exit $R fi if diff -u test-opal-elog-parse.result $LOG; then rm -rf $SYSFS $OUT $LOG echo PASS; else echo FAIL; fi ppc64-diag-2.6.4/opal_errd/test-opal-elog-parse.result0000644000000000000000000001527212313010662021233 0ustar rootroottest-opal-elog-parse ELOG[XXXX]: LID[1]::SRC[TESTSRC1]::Not Applicable::Informational Error::No service action required ELOG[XXXX]: LID[2]::SRC[TESTSRC2]::Processor, including internal cache::Recoverable Error::Service action and call home required ELOG[XXXX]: LID[3]::SRC[TESTSRC3]::Platform Firmware::Predictive Error::Service action and call home required ELOG[XXXX]: LID[50000004]::SRC[TESTSRC4]::Software::Unrecoverable Error::Service action and call home required ELOG[XXXX]: LID[5]::SRC[TESTSRC5]::Not Applicable::NONE::Service action and call home required ELOG[XXXX]: LID[50000006]::SRC[CALLHOME]::Power/Cooling System::NONE::No service action required ELOG[XXXX]: LID[5055ed2e]::SRC[B182950C]::Platform Firmware::Informational Error::No service action required |------------------------------------------------------------------------------| | Entry Id SRC Date Subsystem Event Severity | |------------------------------------------------------------------------------| | 0x00000001 TESTSRC1 0-00-00 00:00:00 0x 0 Informational Event | | 0x00000002 TESTSRC2 0-00-00 00:00:00 0x1a Recoverable Error | | 0x00000003 TESTSRC3 2014-03-13 13:01:56 0x80 Predictive Error | | 0x50000004 TESTSRC4 2000-12-31 10:14:44 0x99 Unrecoverable Error | | 0x00000005 TESTSRC5 0-00-00 00:00:00 0xff NONE | | 0x50000006 CALLHOME 2014-03-14 14:37:00 0x63 NONE | | 0x5055ED2E B182950C 2014-02-18 06:43:54 0x82 Informational Event | |------------------------------------------------------------------------------| Read Completed ERROR parse_section_header: section header is corrupt. Length < 8 bytes and must be at least 8 bytes to include the length of itself. Id 0x00 Length 0 Version 0 Subtype 0 Component ID: 0 ERROR parse_section_header: section header is corrupt. Length < 8 bytes and must be at least 8 bytes to include the length of itself. Id 0x00 Length 0 Version 0 Subtype 0 Component ID: 0 |-------------------------------------------------------------| | Private Header | |-------------------------------------------------------------| Section ID : PH Section Length : 0x0030 (48) Version : 0 UNKNOWN VERSION Sub_type : 0 Component ID : 0 Create Date & Time : 0-00-00 | 00:00:00 Commit Date & Time : 0-00-00 | 00:00:00 Creator ID : Unknown Creator Subsystem Name : 0 Platform Log ID : 0 Log Entry ID : 2 ERROR parse_section_header: section header is corrupt. Length < 8 bytes and must be at least 8 bytes to include the length of itself. Id 0x00 Length 0 Version 0 Subtype 0 Component ID: 0 |-------------------------------------------------------------| | Private Header | |-------------------------------------------------------------| Section ID : PH Section Length : 0x0030 (48) Version : 1 Sub_type : 0 Component ID : 0 Create Date & Time : 2014-03-12 | 14:24:12 Commit Date & Time : 2014-03-13 | 13:01:56 Creator ID : Unknown Creator Subsystem Name : 0 Platform Log ID : 0 Log Entry ID : 3 |-------------------------------------------------------------| | Private Header | |-------------------------------------------------------------| Section ID : PH Section Length : 0x0030 (48) Version : 1 Sub_type : 0 Component ID : 0 Create Date & Time : 1994-01-01 | 01:02:03 Commit Date & Time : 2000-12-31 | 10:14:44 Creator ID : OPAL Creator Subsystem Name : 0 Platform Log ID : b0010203 Log Entry ID : 50000004 |-------------------------------------------------------------| | Private Header | |-------------------------------------------------------------| Section ID : PH Section Length : 0x0030 (48) Version : 1 Sub_type : 0 Component ID : 0 Create Date & Time : 2014-03-14 | 14:36:66 Commit Date & Time : 2014-03-14 | 14:37:00 Creator ID : OPAL Creator Subsystem Name : 0 Platform Log ID : b0040506 Log Entry ID : 50000006 |-------------------------------------------------------------| | Call Home Log Comment | |-------------------------------------------------------------| Section ID : CH Section Length : 23 Version : 0 Sub_type : 0 Component ID : 0 Call Home Comment : call home comment goes here |-------------------------------------------------------------| | Private Header | |-------------------------------------------------------------| Section ID : PH Section Length : 0x0030 (48) Version : 1 Sub_type : 0 Component ID : 9500 Create Date & Time : 2014-02-18 | 06:43:54 Commit Date & Time : 2014-02-18 | 06:43:54 Creator ID : Service Processor Creator Subsystem Name : 0 Platform Log ID : 5055ed2e Log Entry ID : 5055ed2e |-------------------------------------------------------------| | User Header | |-------------------------------------------------------------| Section ID : UH Section Length : 18 Version : 1 Sub_type : 0 Component ID : 9500 Subsystem ID : Platform Firmware Event Data : 3 Event Type : Miscellaneous, informational only. Event Severity : Informational or non-error event. Action Flag : Unknown action flag (0x00006000). |-------------------------------------------------------------| | Primary Reference | |-------------------------------------------------------------| Section ID : PS Section Length : 50 Version : 1 Sub_type : 1 Component ID : 9500 SRC Version : 2 flags : 0 SRC Length : 48 Primary Reference Code : B182950C Hex Words 2 - 5 : 020000f0 2b2c0e10 c103a401 000000ff Hex Words 6 - 9 : 00000042 e8ca2c00 00000000 00000000 |-------------------------------------------------------------| | Extended User Header | |-------------------------------------------------------------| Section ID : EH Section Length : 60 Version : 1 Sub_type : 0 Component ID : 3100 Machine Type Model : 8246-L2D Serial Number : 060E8EA Server Firmware Release Version : ZL770_057 Firmware subsystem Driver Version : b1126p_1320.770 Event Common reference Time (UTC): 0-00-00 | 00:00:00 Symptom ID : B182950C_2B2C0E10 |-------------------------------------------------------------| | Machine Type/Model & Serial Number | |-------------------------------------------------------------| Section ID : MT Section Length : 1c Version : 1 Sub_type : 0 Component ID : 3100 Machine Type Model : 8246-L2D Serial Number : 060E8EA |-------------------------------------------------------------| ppc64-diag-2.6.4/opal_errd/test-extract_opal_dump0000755000000000000000000000113212313010662020432 0ustar rootroot#!/bin/bash SYSFS=`mktemp -d --tmpdir extract_opal_dump_sysfs.XXXXXXXXXX` OUT=`mktemp -d --tmpdir extract_opal_dump.XXXXXXXXXX` OUTERR=`mktemp --tmpdir extract_opal_dump.stderr.XXXXXXXXXX` LOG=`mktemp --tmpdir extract_opal_dump.out.XXXXXXXXXX` cp -pr sysfs-test/* $SYSFS/ ./extract_opal_dump -s $SYSFS -o $OUT 2> $OUTERR echo 'test-extract_opal_dump' > $LOG cat $OUTERR | sed -e 's%/tmp/.*/%%;s/OPAL_DUMP\[[0-9]*\]/OPAL_DUMP[XXXX]/' >> $LOG ls -1 $OUT >> $LOG (cd $OUT; md5sum *) >> $LOG if diff -u test-extract_opal_dump.result $LOG; then rm -rf $SYSFS $OUT $LOG echo PASS; else echo FAIL; fi ppc64-diag-2.6.4/opal_errd/sysfs-test/0000755000000000000000000000000012313010662016144 5ustar rootrootppc64-diag-2.6.4/opal_errd/sysfs-test/firmware/0000755000000000000000000000000012313010662017760 5ustar rootrootppc64-diag-2.6.4/opal_errd/sysfs-test/firmware/opal/0000755000000000000000000000000012313010662020713 5ustar rootrootppc64-diag-2.6.4/opal_errd/sysfs-test/firmware/opal/elog/0000755000000000000000000000000012313010662021641 5ustar rootrootppc64-diag-2.6.4/opal_errd/sysfs-test/firmware/opal/elog/0x5055ED2E/0000755000000000000000000000000012313010662023107 5ustar rootrootppc64-diag-2.6.4/opal_errd/sysfs-test/firmware/opal/elog/0x5055ED2E/raw0000644000000000000000000004000012313010662023615 0ustar rootrootPH0• CT CTE PUí.PUí.UH•‚•`PSP• Hð+,Á¤ÿBèÊ,B182950C EH`18246-L2D060E8EAZL770_057b1126p_1320.770B182950C_2B2C0E10UDœ1 /opt/fips/bin/mboxmainprocessfips770/b1126p_1320.770ådMT18246-L2D060E8EAUDl 1(BMBOXJddœ&—?:² Ç COÃæàU• BèÊ,•PUí. $LOG ./opal_errd -s $SYSFS -o $OUT/platform -D -e /bin/true 2>&1 \ | sed -e 's/ELOG\[[0-9]*\]/ELOG[XXXX]/' > $LOG ls -1 $OUT >> $LOG (cd $OUT; md5sum *) >> $LOG if diff -u test-opal_errd.result $LOG; then rm -rf $SYSFS $OUT $LOG echo PASS; else echo FAIL; fi ppc64-diag-2.6.4/opal_errd/opal_errd.c0000644000000000000000000002531412313010662016140 0ustar rootroot/** * @file elog-daemon.c * @brief Daemon to read/parse OPAL error/events * * Copyright (C) 2014 IBM Corporation */ /* * This file supports * 1. Reading OPAL platform logs from sysfs * 2. Writing OPAL platform logs to /var/log/platform * 3. ACK platform log * 4. Parsing required fields from log and write to syslog */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define DEFAULT_SYSFS_PATH "/sys" #define DEFAULT_OUTPUT_FILE "/var/log/platform" #define DEFAULT_EXTRACT_DUMP_CMD "/usr/sbin/extract_opal_dump" char *opt_sysfs = DEFAULT_SYSFS_PATH; char *opt_output = DEFAULT_OUTPUT_FILE; int opt_daemon = 1; int opt_watch = 1; char *opt_extract_opal_dump_cmd = DEFAULT_EXTRACT_DUMP_CMD; /* * As per PEL v6 (defined in PAPR spec) fixed offset for * error log information. */ #define OPAL_ERROR_LOG_MAX 16384 #define ELOG_ID_SIZE 4 #define ELOG_SRC_SIZE 8 #define ELOG_ID_OFFESET 0x2c #define ELOG_DATE_OFFSET 0x8 #define ELOG_TIME_OFFSET 0xc #define ELOG_SRC_OFFSET 0x78 #define ELOG_SEVERITY_OFFSET 0x3a #define ELOG_SUBSYSTEM_OFFSET 0x38 #define ELOG_ACTION_OFFSET 0x42 /* Severity of the log */ #define OPAL_INFORMATION_LOG 0x00 #define OPAL_RECOVERABLE_LOG 0x10 #define OPAL_PREDICTIVE_LOG 0x20 #define OPAL_UNRECOVERABLE_LOG 0x40 #define ELOG_ACTION_FLAG 0xa8000000 volatile int terminate; /* Parse required fields from error log */ static int parse_log(char *buffer) { uint32_t logid; char src[ELOG_SRC_SIZE+1]; uint8_t severity; uint8_t subsysid; uint32_t action; char *parse = "NONE"; char *parse_action = "NONE"; char *failingsubsys = "Not Applicable"; logid = be32toh(*(uint32_t*)(buffer + ELOG_ID_OFFESET)); memcpy(src, (buffer + ELOG_SRC_OFFSET), ELOG_SRC_SIZE); src[ELOG_SRC_SIZE] = '\0'; subsysid = buffer[ELOG_SUBSYSTEM_OFFSET]; severity = buffer[ELOG_SEVERITY_OFFSET]; switch (severity) { case OPAL_INFORMATION_LOG: parse = "Informational Error"; break; case OPAL_RECOVERABLE_LOG: parse = "Recoverable Error"; break; case OPAL_PREDICTIVE_LOG: parse = "Predictive Error"; break; case OPAL_UNRECOVERABLE_LOG: parse = "Unrecoverable Error"; break; } action = be32toh(*(uint32_t *)(buffer + ELOG_ACTION_OFFSET)); if (action == ELOG_ACTION_FLAG) parse_action = "Service action and call home required"; else parse_action = "No service action required"; if ((subsysid >= 0x10) && (subsysid <= 0x1F)) failingsubsys = "Processor, including internal cache"; else if ((subsysid >= 0x20) && (subsysid <= 0x2F)) failingsubsys = "Memory, including external cache"; else if ((subsysid >= 0x30) && (subsysid <= 0x3F)) failingsubsys = "I/O (hub, bridge, bus"; else if ((subsysid >= 0x40) && (subsysid <= 0x4F)) failingsubsys = "I/O adapter, device and peripheral"; else if ((subsysid >= 0x50) && (subsysid <= 0x5F)) failingsubsys = "CEC Hardware"; else if ((subsysid >= 0x60) && (subsysid <= 0x6F)) failingsubsys = "Power/Cooling System"; else if ((subsysid >= 0x70) && (subsysid <= 0x79)) failingsubsys = "Other Subsystems"; else if ((subsysid >= 0x7A) && (subsysid <= 0x7F)) failingsubsys = "Surveillance Error"; else if ((subsysid >= 0x80) && (subsysid <= 0x8F)) failingsubsys = "Platform Firmware"; else if ((subsysid >= 0x90) && (subsysid <= 0x9F)) failingsubsys = "Software"; else if ((subsysid >= 0xA0) && (subsysid <= 0xAF)) failingsubsys = "External Environment"; syslog(LOG_NOTICE, "LID[%x]::SRC[%s]::%s::%s::%s\n", logid, src, failingsubsys, parse, parse_action); return 0; } /** * Check platform dump * * FIXME: * Presently we are calling dump extractor for every error/event. * We have to parse the error/event and call dump extractor only * for dump available event. */ static void check_platform_dump(void) { int rc; struct stat sbuf; if (stat(opt_extract_opal_dump_cmd, &sbuf) < 0) { syslog(LOG_NOTICE, "The command \"%s\" does not exist.\n", opt_extract_opal_dump_cmd); return; } rc = system(opt_extract_opal_dump_cmd); if (rc) { syslog(LOG_NOTICE, "Failed to execute platform dump " "extractor (%s).\n", opt_extract_opal_dump_cmd); return; } } static int ack_elog(const char *elog_path) { char ack_file[PATH_MAX]; int fd; int rc; snprintf(ack_file, sizeof(ack_file), "%s/acknowledge", elog_path); fd = open(ack_file, O_WRONLY); if (fd == -1) { syslog(LOG_ERR, "Failed to acknowledge elog: %s" " (%d:%s)\n", ack_file, errno, strerror(errno)); return -1; } rc = write(fd, "ack\n", 4); if (rc != 4) { syslog(LOG_ERR, "Failed to acknowledge elog: %s" " (%d:%s)\n", ack_file, errno, strerror(errno)); return -1; } close(fd); return 0; } static int process_elog(const char *elog_path) { int in_fd = -1; int out_fd = -1; int dir_fd = -1; char elog_raw_path[PATH_MAX]; char *buf; size_t bufsz; struct stat sbuf; int ret = -1; ssize_t sz = 0; ssize_t readsz = 0; int rc; char *opt_output_dir = strdup(opt_output); char outbuf[OPAL_ERROR_LOG_MAX]; size_t outbufsz = OPAL_ERROR_LOG_MAX; snprintf(elog_raw_path, sizeof(elog_raw_path), "%s/raw", elog_path); if (stat(elog_raw_path, &sbuf) == -1) return -1; bufsz = sbuf.st_size; buf = (char*)malloc(bufsz); in_fd = open(elog_raw_path, O_RDONLY); if (in_fd == -1) { syslog(LOG_ERR, "Failed to open elog: %s (%d:%s)\n", elog_raw_path, errno, strerror(errno)); goto err; } do { readsz = read(in_fd, buf+sz, bufsz-sz); if (readsz == -1) { syslog(LOG_ERR, "Failed to read elog: %s (%d:%s)\n", elog_raw_path, errno, strerror(errno)); goto err; } sz += readsz; } while(sz != bufsz); out_fd = open(opt_output, O_WRONLY | O_APPEND | O_CREAT, S_IRUSR | S_IWUSR | S_IRGRP); if (out_fd == -1) { syslog(LOG_ERR, "Failed to write elog: %s (%d:%s)\n", opt_output, errno, strerror(errno)); goto err; } assert(bufsz <= outbufsz); memset(outbuf, 0, outbufsz); memcpy(outbuf, buf, bufsz); sz = write(out_fd, outbuf, outbufsz); if (sz != outbufsz) { syslog(LOG_ERR, "Failed to write platform dump: %s (%d:%s)\n", opt_output, errno, strerror(errno)); goto err; } dir_fd = open(dirname(opt_output_dir), O_RDONLY|O_DIRECTORY); rc = fsync(out_fd); if (rc == -1) { syslog(LOG_ERR, "Failed to sync elog: %s (%d:%s)\n", opt_output, errno, strerror(errno)); goto err; } rc = fsync(dir_fd); if (rc == -1) { syslog(LOG_ERR, "Failed to sync platform elog directory: %s" " (%d:%s)\n", opt_output, errno, strerror(errno)); } check_platform_dump(); parse_log(buf); ret = 0; err: if (in_fd != -1) close(in_fd); if (out_fd != -1) close(out_fd); if (dir_fd != -1) close(dir_fd); free(opt_output_dir); free(buf); return ret; } /* Read logs from opal sysfs interface */ static int find_and_read_elog_events(const char *elog_dir) { int rc = 0; struct dirent **namelist; struct dirent *dirent; char elog_path[PATH_MAX]; int is_dir = 0; struct stat sbuf; int retval = 0; int n; int i; n = scandir(elog_dir, &namelist, NULL, alphasort); if (n < 0) return -1; for (i = 0; i < n; i++) { dirent = namelist[i]; if (dirent->d_name[0] == '.') { free(namelist[i]); continue; } snprintf(elog_path, sizeof(elog_path), "%s/%s", elog_dir, dirent->d_name); is_dir = 0; if (dirent->d_type == DT_DIR) { is_dir = 1; } else { /* Fall back to stat() */ rc = stat(elog_path, &sbuf); if (S_ISDIR(sbuf.st_mode)) { is_dir = 1; } } if (is_dir) { rc = process_elog(elog_path); if (rc != 0 && retval == 0) retval = -1; if (rc == 0 && retval >= 0) retval++; ack_elog(elog_path); } free(namelist[i]); } free(namelist); return retval; } static void help(const char* argv0) { fprintf(stderr, "%s help:\n\n", argv0); fprintf(stderr, "-e cmd - path to extract_opal_dump (default %s)\n", DEFAULT_EXTRACT_DUMP_CMD); fprintf(stderr, "-o file - output log entries to file (default %s)\n", DEFAULT_OUTPUT_FILE); fprintf(stderr, "-s dir - path to sysfs (default %s)\n", DEFAULT_SYSFS_PATH); fprintf(stderr, "-D - don't daemonize, just run once.\n"); fprintf(stderr, "-w - watch for new events (default when daemon)\n"); fprintf(stderr, "-h - help (this message)\n"); } int main(int argc, char *argv[]) { int rc = 0; int opt; char sysfs_path[PATH_MAX]; struct stat s; int inotifyfd; char inotifybuf[sizeof(struct inotify_event) + NAME_MAX + 1]; fd_set fds; struct timeval tv; int r; int log_options; while ((opt = getopt(argc, argv, "De:ho:s:w")) != -1) { switch (opt) { case 'D': opt_daemon = 0; opt_watch = 0; break; case 'w': opt_daemon = 0; opt_watch = 1; break; case 'o': opt_output = optarg; break; case 'e': opt_extract_opal_dump_cmd = optarg; break; case 's': opt_sysfs = optarg; break; case 'h': help(argv[0]); exit(EXIT_SUCCESS); default: help(argv[0]); exit(EXIT_FAILURE); } } /* syslog initialization */ setlogmask(LOG_UPTO(LOG_NOTICE)); log_options = LOG_CONS | LOG_PID | LOG_NDELAY; if (!opt_daemon) log_options |= LOG_PERROR; openlog("ELOG", log_options, LOG_LOCAL1); snprintf(sysfs_path, sizeof(sysfs_path), "%s/firmware/opal/elog", opt_sysfs); rc = stat(sysfs_path, &s); if (rc != 0) { syslog(LOG_ERR, "Error accessing sysfs: %s (%d: %s)\n", sysfs_path, errno, strerror(errno)); exit(EXIT_FAILURE); } inotifyfd = inotify_init(); if (inotifyfd == -1) { syslog(LOG_ERR, "Error setting up inotify (%d:%s)\n", errno, strerror(errno)); exit(EXIT_FAILURE); } rc = inotify_add_watch(inotifyfd, sysfs_path, IN_CREATE); if (rc == -1) { syslog(LOG_ERR, "Error adding inotify watch for %s (%d: %s)\n", sysfs_path, errno, strerror(errno)); exit(EXIT_FAILURE); } /* Convert the opal_errd process to a daemon. */ if (opt_daemon) { rc = daemon(0, 0); if (rc) { syslog(LOG_NOTICE, "Cannot daemonize opal_errd, " "opal_errd cannot continue.\n"); closelog(); return rc; } } /* Read error/event log until we get termination signal */ while (!terminate) { find_and_read_elog_events(sysfs_path); if (!opt_watch) { terminate = 1; } else { /* We don't care about the content of the inotify * event, we'll just scan the directory anyway */ FD_ZERO(&fds); FD_SET(inotifyfd, &fds); tv.tv_sec = 1; tv.tv_usec = 0; r = select(inotifyfd+1, &fds, NULL, NULL, &tv); if (r > 0 && FD_ISSET(inotifyfd, &fds)) read(inotifyfd, inotifybuf, sizeof(inotifybuf)); } } close(inotifyfd); closelog(); return rc; } ppc64-diag-2.6.4/opal_errd/Makefile0000644000000000000000000000146612313010662015467 0ustar rootroot# # Makefile for ppc64-diag/opal_errd # include ../rules.mk CMDS = opal_errd extract_opal_dump OPAL_ERRD_OBJS = opal_errd.o OPAL_DUMP_OBJS = extract_opal_dump.o SUBDIRS = opal-elog-parse all: $(CMDS) @$(foreach d,$(SUBDIRS), $(MAKE) -C $d;) opal_errd: $(OPAL_ERRD_OBJS) @echo "LD $(WORK_DIR)/$@" $(CC) $(CFLAGS) -o $@ $^ $(OPAL_ERRD_LIBS) extract_opal_dump: $(OPAL_DUMP_OBJS) @echo "LD $(WORK_DIR)/$@" $(CC) $(CFLAGS) -o $@ $^ $(OPAL_DUMP_LIBS) install: all @$(call install_sbin,$(CMDS),$(DESTDIR)) @$(foreach d,$(SUBDIRS), $(MAKE) -C $d install;) uninstall: @$(call uninstall_sbin,$(CMDS),$(DESTDIR)) @$(foreach d,$(SUBDIRS), $(MAKE) -C $d uninstall;) clean: @echo "Cleaning up $(WORK_DIR) files..." @rm -rf $(CMDS) $(OPAL_ERRD_OBJS) $(OPAL_DUMP_OBJS) @$(foreach d,$(SUBDIRS), $(MAKE) -C $d clean;) ppc64-diag-2.6.4/opal_errd/test-extract_opal_dump.result0000644000000000000000000000042712313010662021752 0ustar rootroottest-extract_opal_dump OPAL_DUMP[XXXX]: New platform dump available. File: platform.0x01 OPAL_DUMP[XXXX]: New platform dump available. File: platform.0x02 platform.0x01 platform.0x02 29844c8201be956c51b28de87202adef platform.0x01 3a4acb624f600f7dd437bcd612bd2729 platform.0x02 ppc64-diag-2.6.4/opal_errd/opal-elog-parse/0000755000000000000000000000000012313010662017007 5ustar rootrootppc64-diag-2.6.4/opal_errd/opal-elog-parse/libopalevents.h0000644000000000000000000001327312313010662022035 0ustar rootroot#ifndef _H_OPAL_EVENTS #define _H_OPAL_EVENTS #include #include #define OPAL_SYS_MODEL_LEN 8 #define OPAL_SYS_SERIAL_LEN 12 #define OPAL_VER_LEN 16 #ifndef __packed #define __packed __attribute__((packed)) #endif /* This comes in BCD for some reason, we convert it in parsing */ struct opal_datetime { uint16_t year; uint8_t month; uint8_t day; uint8_t hour; uint8_t minutes; uint8_t seconds; uint8_t hundredths; } __packed; /* Error log section header */ struct opal_v6_hdr { char id[2]; uint16_t length; /* section length */ uint8_t version; /* section version */ uint8_t subtype; /* section sub-type id */ uint16_t component_id; /* component id of section creator */ } __packed; struct opal_mt_struct { char model[OPAL_SYS_MODEL_LEN]; char serial_no[OPAL_SYS_SERIAL_LEN]; } __packed; /* opal MTMS section */ struct opal_mtms_scn { struct opal_v6_hdr v6hdr; struct opal_mt_struct mt; } __packed; /* Extended header section */ struct opal_eh_scn { struct opal_v6_hdr v6hdr; struct opal_mt_struct mt; char opal_release_version[OPAL_VER_LEN]; // Null terminated char opal_subsys_version[OPAL_VER_LEN]; // Null terminated uint32_t reserved_0; struct opal_datetime event_ref_datetime; uint16_t reserved_1; uint8_t reserved_2; uint8_t opal_symid_len; char opalsymid[0]; // variable sized } __packed; /* Extended header section */ struct opal_ch_scn { struct opal_v6_hdr v6hdr; #define OPAL_CH_COMMENT_MAX_LEN 144 char comment[0]; // varsized up to 144 byte null terminated } __packed; struct id_msg{ int id; const char *msg; }; struct sev_type{ int sev; const char *desc; }; #define MAX_EVENT sizeof(usr_hdr_event_type)/sizeof(struct id_msg) #define MAX_SEV sizeof(usr_hdr_severity)/sizeof(struct sev_type) #define EVENT_TYPE \ {0x01, " Miscellaneous, informational only."},\ {0x08, " Dump notification."},\ {0x10, " Previously reported error has been corrected by system."},\ {0x20, " System resources manually deconfigured by user."}, \ {0x21, " System resources deconfigured by system due to prior error event."}, \ {0x22, " Resource deallocation event notification."}, \ {0x30, " Customer environmental problem has returned to normal."}, \ {0x40, " Concurrent maintenance event."}, \ {0x60, " Capacity upgrade event."}, \ {0x70, " Resource sparing event."}, \ {0x80, " Dynamic reconfiguration event."}, \ {0xD0, " Normal system/platform shutdown or powered off."}, \ {0xE0, " Platform powered off by user without normal shutdown."}, \ {0, " Not applicable."} #define SEVERITY_TYPE \ {0x00, " Informational or non-error event."}, \ {0x10, " Recovered error, general."}, \ {0x20, " Predictive error, general."}, \ {0x21, " Predictive error, degraded performance."}, \ {0x22, " Predictive error, fault may be corrected after platform re-IPL."} /* Primary SRC section */ struct opal_src_scn { struct opal_v6_hdr v6hdr; uint8_t version; uint8_t flags; uint8_t reserved_0; uint8_t wordcount; uint16_t reserved_1; uint16_t srclength; uint32_t ext_refcode2; uint32_t ext_refcode3; uint32_t ext_refcode4; uint32_t ext_refcode5; uint32_t ext_refcode6; uint32_t ext_refcode7; uint32_t ext_refcode8; uint32_t ext_refcode9; #define OPAL_SRC_SCN_PRIMARY_REFCODE_LEN 32 char primary_refcode[OPAL_SRC_SCN_PRIMARY_REFCODE_LEN]; /* Optional subsection header * TODO: should be struct as there could be several */ /* uint8_t subscn_id; * uint8_t subscn_flags; * uint16_t subscn_length; */ /* and the subsection of length subscn_length would go here */ /* but we currently don't parse it */ } __packed; /* Private Header section */ struct opal_priv_hdr_scn { struct opal_v6_hdr v6hdr; struct opal_datetime create_datetime; struct opal_datetime commit_datetime; uint8_t creator_id; /* subsystem component id */ #define OPAL_PH_CREAT_SERVICE_PROC 'E' #define OPAL_PH_CREAT_HYPERVISOR 'H' #define OPAL_PH_CREAT_POWER_CONTROL 'W' #define OPAL_PH_CREAT_PARTITION_FW 'L' uint8_t reserved0; uint8_t reserved1; uint8_t scn_count; /* number of sections in log */ uint32_t reserved2; uint32_t creator_subid_hi; uint32_t creator_subid_lo; uint32_t plid; /* platform log id */ uint32_t log_entry_id; /* Unique log entry id */ } __packed; /* user header section */ struct opal_usr_hdr_scn { struct opal_v6_hdr v6hdr; uint8_t subsystem_id; /**< subsystem id */ uint8_t event_data; uint8_t event_severity; uint8_t event_type; /**< error/event severity */ #define OPAL_UH_TYPE_NA 0x00 #define OPAL_UH_TYPE_INFO_ONLY 0x01 #define OPAL_UH_TYPE_DUMP_NOTIFICATION 0x08 #define OPAL_UH_TYPE_PREVIOUSLY_REPORTED 0x10 #define OPAL_UH_TYPE_DECONFIG_USER 0x20 #define OPAL_UH_TYPE_DECONFIG_SYSTEM 0x21 #define OPAL_UH_TYPE_DECONFIG_NOTICE 0x22 #define OPAL_UH_TYPE_RETURN_TO_NORMAL 0x30 #define OPAL_UH_TYPE_CONCURRENT_MAINT 0x40 #define OPAL_UH_TYPE_CAPACITY_UPGRADE 0x60 #define OPAL_UH_TYPE_RESOURCE_SPARING 0x70 #define OPAL_UH_TYPE_DYNAMIC_RECONFIG 0x80 #define OPAL_UH_TYPE_NORMAL_SHUTDOWN 0xD0 #define OPAL_UH_TYPE_ABNORMAL_SHUTDOWN 0xE0 uint32_t reserved1; uint8_t problem_domain; uint8_t problem_vector; uint16_t action; /**< erro action code */ #define OPAL_UH_ACTION_SERVICE 0x8000 #define OPAL_UH_ACTION_HIDDEN 0x4000 #define OPAL_UH_ACTION_REPORT_EXTERNALLY 0x2000 #define OPAL_UH_ACTION_HMC_ONLY 0x1000 #define OPAL_UH_ACTION_CALL_HOME 0x0800 #define OPAL_UH_ACTION_ISO_INCOMPLETE 0x0400 uint32_t reserved2; } __packed; extern int parse_opal_event(char *, int); extern struct opal_datetime parse_opal_datetime(const struct opal_datetime); #endif ppc64-diag-2.6.4/opal_errd/opal-elog-parse/opal-elog-parse.c0000644000000000000000000001420012313010662022137 0ustar rootroot/* * @file opal_errd_parse.c * Copyright (C) 2014 IBM Corporation */ #include #include #include #include #include #include #include #include #include #include "libopalevents.h" #define DEFAULT_opt_platform_log "/var/log/platform" char *opt_platform_log = DEFAULT_opt_platform_log; int opt_display_all = 0; #define ELOG_ID_OFFSET 0x2c #define ELOG_COMMIT_TIME_OFFSET 0x10 #define ELOG_SRC_OFFSET 0x78 #define ELOG_SUBSYS_ID_OFFSET 0x38 #define ELOG_SEVERITY_OFFSET 0x3a #define OPAL_ERROR_LOG_MAX 16384 #define ELOG_ACTION_OFFSET 0x42 #define ELOG_ACTION_FLAG 0xa8000000 /* Severity of the log */ #define OPAL_INFORMATION_LOG 0x00 #define OPAL_RECOVERABLE_LOG 0x10 #define OPAL_PREDICTIVE_LOG 0x20 #define OPAL_UNRECOVERABLE_LOG 0x40 static int platform_log_fd = -1; void print_usage(char *command) { printf("Usage: %s { -d | -a | -l | -s | -h } [ -f file ]\n" "\t-d: Display error log entry details\n" "\t-a: Display all error log entry details\n" "\t-l: list all error logs\n" "\t-s: list all call home logs\n" "\t-f file: use file as platform log file (default %s)\n" "\t-h: print the usage\n", command, DEFAULT_opt_platform_log); } /* parse error log entry passed by user */ int elogdisplayentry(uint32_t eid) { uint32_t logid; int len = 0; int ret = 0; static int pos; char buffer[OPAL_ERROR_LOG_MAX]; platform_log_fd = open(opt_platform_log, O_RDONLY); if (platform_log_fd <= 0) { fprintf(stderr, "Could not open error log file : %s (%s).\n " "The error log parse tool cannot continue and will " "exit.\n", opt_platform_log, strerror(errno)); close(platform_log_fd); return -1; } while (lseek(platform_log_fd, pos, 0) >= 0) { memset(buffer, 0, sizeof(buffer)); len = read(platform_log_fd, (char *)buffer, OPAL_ERROR_LOG_MAX); if (len == 0) { printf ("Read Completed\n"); break; } else if (len < 0) { fprintf(stderr, "Read Platform log failed\n"); ret = -1; break; } pos = pos + len; logid = be32toh(*(uint32_t*)(buffer+ELOG_ID_OFFSET)); if (opt_display_all || logid == eid) { ret = parse_opal_event(buffer, len); if (!opt_display_all) break; } } close(platform_log_fd); return ret; } /* list all the error logs */ int eloglist(uint32_t service_flag) { int len = 0, ret = 0; char *parse; uint32_t logid; char src[8]; char buffer[OPAL_ERROR_LOG_MAX]; char severity; static int pos; uint32_t action; platform_log_fd = open(opt_platform_log, O_RDONLY); if (platform_log_fd <= 0) { fprintf(stderr, "Could not open error log file : %s (%s).\n " "The error log parse tool cannot continue and will " "exit.\n", opt_platform_log, strerror(errno)); close(platform_log_fd); return -1; } printf("|------------------------------------------------------------------------------|\n"); printf("| Entry Id SRC Date Subsystem Event Severity |\n"); printf("|------------------------------------------------------------------------------|\n"); while (lseek(platform_log_fd, pos, 0) >= 0) { struct opal_datetime date_time_in, date_time_out; uint8_t subsys; memset(buffer, 0, sizeof(buffer)); len = read(platform_log_fd, (char *)buffer, OPAL_ERROR_LOG_MAX); if (len == 0) { printf("|------------------------------------------------------------------------------|\n"); printf("Read Completed\n"); break; } else if (len < 0) { fprintf(stderr, "Read Platform log failed\n"); ret = -1; break; } pos = pos + len; logid = be32toh(*(uint32_t*)(buffer+ELOG_ID_OFFSET)); memcpy(src, (buffer + ELOG_SRC_OFFSET), sizeof(src)); severity = buffer[ELOG_SEVERITY_OFFSET]; action = be32toh(*(uint32_t *)(buffer + ELOG_ACTION_OFFSET)); switch (severity) { case OPAL_INFORMATION_LOG: parse = "Informational Event"; break; case OPAL_RECOVERABLE_LOG: parse = "Recoverable Error"; break; case OPAL_PREDICTIVE_LOG: parse = "Predictive Error"; break; case OPAL_UNRECOVERABLE_LOG: parse = "Unrecoverable Error"; break; default: parse = "NONE"; break; } date_time_in = *(const struct opal_datetime *)(buffer + ELOG_COMMIT_TIME_OFFSET); date_time_out = parse_opal_datetime(date_time_in); subsys = buffer[ELOG_SUBSYS_ID_OFFSET]; if (service_flag != 1) printf("| 0x%08X %8.8s %4u-%02u-%02u %02u:%02u:%02u 0x%2x %-22.22s |\n", logid, src, date_time_out.year, date_time_out.month, date_time_out.day, date_time_out.hour, date_time_out.minutes, date_time_out.seconds, subsys, parse); else if ((action == ELOG_ACTION_FLAG) && (service_flag == 1)) /* list only service action logs */ printf("| 0x%08X %8.8s %4u-%02u-%02u %02u:%02u:%02u 0x%2x %-22.22s |\n", logid, src, date_time_out.year, date_time_out.month, date_time_out.day, date_time_out.hour, date_time_out.minutes, date_time_out.seconds, subsys, parse); } close(platform_log_fd); return ret; } int main(int argc, char *argv[]) { uint32_t eid = 0; int opt = 0, ret = 0; int arg_cnt = 0; char do_operation = '\0'; const char *eid_opt; while ((opt = getopt(argc, argv, "ad:lshf:")) != -1) { switch (opt) { case 'd': eid_opt = optarg; /* fallthrough */ case 'l': case 's': arg_cnt++; do_operation = opt; break; case 'a': arg_cnt++; opt_display_all = 1; do_operation = opt; break; case 'f': opt_platform_log = optarg; break; case 'h': print_usage(argv[0]); exit(EXIT_SUCCESS); default: print_usage(argv[0]); exit(EXIT_FAILURE); } } if (argc == 1) { fprintf(stderr, "No parameters are specified\n"); print_usage(argv[0]); ret = -1; } if (arg_cnt > 1) { fprintf(stderr, "Only one operation (-d | -a | -l | -s) " "can be selected at any one time.\n"); print_usage(argv[0]); return -1; } switch (do_operation) { case 'l': ret = eloglist(0); break; case 'd': eid = strtoul(eid_opt, 0, 0); /* fallthrough */ case 'a': ret = elogdisplayentry(eid); break; case 's': ret = eloglist(1); break; default: ret = -1; break; } return ret; } ppc64-diag-2.6.4/opal_errd/opal-elog-parse/Makefile0000644000000000000000000000071112313010662020446 0ustar rootroot# # Makefile for ppc64-diag/opal_errd/opal_elog_parse # include ../../rules.mk CMDS = opal-elog-parse OPAL_ELOG_OBJS = get-opal-event.o opal-elog-parse.o all: $(CMDS) opal-elog-parse: $(OPAL_ELOG_OBJS) @echo "LD $(WORK_DIR)/$@" $(CC) $(CFLAGS) -o $@ $^ install: all @$(call install_sbin,$(CMDS),$(DESTDIR)) uninstall: @$(call uninstall_sbin,$(CMDS),$(DESTDIR)) clean: @echo "Cleaning up $(WORK_DIR) files..." @rm -rf $(CMDS) $(OPAL_ELOG_OBJS) ppc64-diag-2.6.4/opal_errd/opal-elog-parse/get-opal-event.c0000644000000000000000000004670312313010662022014 0ustar rootroot#include #include #include #include #include #include #include #include "libopalevents.h" struct id_msg usr_hdr_event_type[] = { EVENT_TYPE }; struct sev_type usr_hdr_severity[] = { SEVERITY_TYPE }; int print_usr_hdr_action(struct opal_usr_hdr_scn *usrhdr) { printf("Action Flag :"); switch (usrhdr->action) { case 0xa800: printf(" Service Action"); if (usrhdr->action & 0x4000) printf(" hidden error"); if (usrhdr->action & 0x0800) printf(" call home"); printf(" Required.\n"); break; case 0x2000: printf(" Report Externally, "); if (usrhdr->action & 0x1000) printf("HMC only\n"); else printf("HMC and Hypervisor\n"); break; case 0x0400: printf(" Error isolation incomplete,\n" "further analysis required.\n"); break; case 0x0000: break; default: printf(" Unknown action flag (0x%08x).\n", usrhdr->action); } return 0; } int print_usr_hdr_event_data(struct opal_usr_hdr_scn *usrhdr) { int i; printf("Event Data : %x\n", usrhdr->event_data); printf("Event Type :"); for (i = 0; i < MAX_EVENT; i++) { if (usrhdr->event_type == usr_hdr_event_type[i].id) { printf("%s\n", usr_hdr_event_type[i].msg); break; } } printf("Event Severity :"); for (i = 0; i < MAX_SEV; i++) { if (usrhdr->event_severity == usr_hdr_severity[i].sev) { printf("%s\n", usr_hdr_severity[i].desc); break; } } return 0; } int print_usr_hdr_subsystem_id(struct opal_usr_hdr_scn *usrhdr) { unsigned int id = usrhdr->subsystem_id; printf("|-------------------------------------------------------------|\n"); printf("| User Header |\n"); printf("|-------------------------------------------------------------|\n"); printf("Section ID : %c%c\n", usrhdr->v6hdr.id[0], usrhdr->v6hdr.id[1]); printf("Section Length : %x\n", usrhdr->v6hdr.length); printf("Version : %x\n", usrhdr->v6hdr.version); printf("Sub_type : %x\n", usrhdr->v6hdr.subtype); printf("Component ID : %x\n", usrhdr->v6hdr.component_id); printf("Subsystem ID :"); if ((id >= 0x10) && (id <= 0x1F)) printf(" Processor, including internal cache\n"); else if ((id >= 0x20) && (id <= 0x2F)) printf(" Memory, including external cache\n"); else if ((id >= 0x30) && (id <= 0x3F)) printf(" I/O hub, bridge, bus\n"); else if ((id >= 0x40) && (id <= 0x4F)) printf(" I/O adapter, device and peripheral\n"); else if ((id >= 0x50) && (id <= 0x5F)) printf(" CEC Hardware\n"); else if ((id >= 0x60) && (id <= 0x6F)) printf(" Power/Cooling System\n"); else if ((id >= 0x70) && (id <= 0x79)) printf(" Other Subsystems\n"); else if ((id >= 0x7A) && (id <= 0x7F)) printf(" Surveillance Error\n"); else if ((id >= 0x80) && (id <= 0x8F)) printf(" Platform Firmware\n"); else if ((id >= 0x90) && (id <= 0x9F)) printf(" Software)\n"); else if ((id >= 0xA0) && (id <= 0xAF)) printf(" External Environment\n"); else printf("\n"); return 0; } int print_src_refcode(struct opal_src_scn *src) { char primary_refcode_display[OPAL_SRC_SCN_PRIMARY_REFCODE_LEN+1]; memcpy(primary_refcode_display, src->primary_refcode, OPAL_SRC_SCN_PRIMARY_REFCODE_LEN); primary_refcode_display[OPAL_SRC_SCN_PRIMARY_REFCODE_LEN] = '\0'; printf("Primary Reference Code : %s", primary_refcode_display); printf("\n"); printf("Hex Words 2 - 5 : %08x %08x %08x %08x\n", src->ext_refcode2, src->ext_refcode3, src->ext_refcode4, src->ext_refcode5); printf("Hex Words 6 - 9 : %08x %08x %08x %08x\n", src->ext_refcode6, src->ext_refcode7, src->ext_refcode8, src->ext_refcode9); return 0; } int print_mt_scn(struct opal_mtms_scn *mtms) { char model[OPAL_SYS_MODEL_LEN+1]; char serial_no[OPAL_SYS_SERIAL_LEN+1]; memcpy(model, mtms->mt.model, OPAL_SYS_MODEL_LEN); model[OPAL_SYS_MODEL_LEN] = '\0'; memcpy(serial_no, mtms->mt.serial_no, OPAL_SYS_SERIAL_LEN); model[OPAL_SYS_SERIAL_LEN] = '\0'; printf("|-------------------------------------------------------------|\n"); printf("| Machine Type/Model & Serial Number |\n"); printf("|-------------------------------------------------------------|\n"); printf("Section ID : %c%c\n", mtms->v6hdr.id[0], mtms->v6hdr.id[1]); printf("Section Length : %x\n", mtms->v6hdr.length); printf("Version : %x\n", mtms->v6hdr.version); printf("Sub_type : %x\n", mtms->v6hdr.subtype); printf("Component ID : %x\n", mtms->v6hdr.component_id); printf("Machine Type Model : %s\n", model); printf("Serial Number : %s\n", serial_no); printf("|-------------------------------------------------------------|\n\n"); return 0; } int print_opal_src_scn(struct opal_src_scn *src) { printf("|-------------------------------------------------------------|\n"); printf("| Primary Reference |\n"); printf("|-------------------------------------------------------------|\n"); printf("Section ID : %c%c\n", src->v6hdr.id[0], src->v6hdr.id[1]); printf("Section Length : %x\n", src->v6hdr.length); printf("Version : %x\n", src->v6hdr.version); printf("Sub_type : %x\n", src->v6hdr.subtype); printf("Component ID : %x\n", src->v6hdr.component_id); printf("SRC Version : %x\n", src->version); printf("flags : %x\n", src->flags); printf("SRC Length : %x\n", src->srclength); print_src_refcode(src); return 0; } int print_opal_usr_hdr_scn(struct opal_usr_hdr_scn *usrhdr) { print_usr_hdr_subsystem_id(usrhdr); print_usr_hdr_event_data(usrhdr); print_usr_hdr_action(usrhdr); return 0; } int print_opal_priv_hdr_scn(struct opal_priv_hdr_scn *privhdr) { printf("|-------------------------------------------------------------|\n"); printf("| Private Header |\n"); printf("|-------------------------------------------------------------|\n"); printf("Section ID : %c%c\n", privhdr->v6hdr.id[0], privhdr->v6hdr.id[1]); printf("Section Length : 0x%04x (%u)\n", privhdr->v6hdr.length, privhdr->v6hdr.length); printf("Version : %x", privhdr->v6hdr.version); if (privhdr->v6hdr.version != 1) printf(" UNKNOWN VERSION"); printf("\nSub_type : %x\n", privhdr->v6hdr.subtype); printf("Component ID : %x\n", privhdr->v6hdr.component_id); printf("Create Date & Time : %4u-%02u-%02u | %02u:%02u:%02u\n", privhdr->create_datetime.year, privhdr->create_datetime.month, privhdr->create_datetime.day, privhdr->create_datetime.hour, privhdr->create_datetime.minutes, privhdr->create_datetime.seconds); printf("Commit Date & Time : %4u-%02u-%02u | %02u:%02u:%02u\n", privhdr->commit_datetime.year, privhdr->commit_datetime.month, privhdr->commit_datetime.day, privhdr->commit_datetime.hour, privhdr->commit_datetime.minutes, privhdr->commit_datetime.seconds); printf("Creator ID :"); switch (privhdr->creator_id) { case 'C': printf(" Hardware Management Console\n"); break; case 'E': printf(" Service Processor\n"); break; case 'H': printf(" PHYP\n"); break; case 'W': printf(" Power Control\n"); break; case 'L': printf(" Partition Firmware\n"); break; case 'S': printf(" SLIC\n"); break; case 'B': printf(" Hostboot\n"); break; case 'T': printf(" OCC\n"); break; case 'M': printf(" I/O Drawer\n"); break; case 'K': printf(" OPAL\n"); break; default: printf(" Unknown\n"); break; } printf("Creator Subsystem Name : %x\n", privhdr->creator_subid_hi); printf("Platform Log ID : %x\n", privhdr->plid); printf("Log Entry ID : %x\n", privhdr->log_entry_id); return 0; } int print_eh_scn(struct opal_eh_scn *eh) { char model[OPAL_SYS_MODEL_LEN+1]; char serial_no[OPAL_SYS_SERIAL_LEN+1]; memcpy(model, eh->mt.model, OPAL_SYS_MODEL_LEN); model[OPAL_SYS_MODEL_LEN] = '\0'; memcpy(serial_no, eh->mt.serial_no, OPAL_SYS_SERIAL_LEN); model[OPAL_SYS_SERIAL_LEN] = '\0'; printf("|-------------------------------------------------------------|\n"); printf("| Extended User Header |\n"); printf("|-------------------------------------------------------------|\n"); printf("Section ID : %c%c\n", eh->v6hdr.id[0], eh->v6hdr.id[1]); printf("Section Length : %x\n", eh->v6hdr.length); printf("Version : %x\n", eh->v6hdr.version); printf("Sub_type : %x\n", eh->v6hdr.subtype); printf("Component ID : %x\n", eh->v6hdr.component_id); printf("Machine Type Model : %s\n", model); printf("Serial Number : %s\n", serial_no); printf("Server Firmware Release Version : %s\n", eh->opal_release_version); printf("Firmware subsystem Driver Version : %s\n", eh->opal_subsys_version); printf("Event Common reference Time (UTC): " "%4u-%02u-%02u | %02u:%02u:%02u\n", eh->event_ref_datetime.year, eh->event_ref_datetime.month, eh->event_ref_datetime.day, eh->event_ref_datetime.hour, eh->event_ref_datetime.minutes, eh->event_ref_datetime.seconds); if (eh->opal_symid_len) printf("Symptom ID : %s\n", eh->opalsymid); return 0; } static int print_ch_scn(struct opal_ch_scn *ch) { printf("|-------------------------------------------------------------|\n"); printf("| Call Home Log Comment |\n"); printf("|-------------------------------------------------------------|\n"); printf("Section ID : %c%c\n", ch->v6hdr.id[0], ch->v6hdr.id[1]); printf("Section Length : %x\n", ch->v6hdr.length); printf("Version : %x\n", ch->v6hdr.version); printf("Sub_type : %x\n", ch->v6hdr.subtype); printf("Component ID : %x\n", ch->v6hdr.component_id); printf("Call Home Comment : %s\n", ch->comment); return 0; } /* parse MTMS section of the log */ int parse_mt_scn(const struct opal_v6_hdr *hdr, const char *buf, int buflen) { struct opal_mtms_scn mt; struct opal_mtms_scn *bufmt = (struct opal_mtms_scn*)buf; if (buflen < sizeof(struct opal_mtms_scn)) { fprintf(stderr, "%s: corrupted, expected length %lu, got %u\n", __func__, sizeof(struct opal_mtms_scn), buflen); return -EINVAL; } if (hdr->length != sizeof(struct opal_mtms_scn)) { fprintf(stderr, "%s: section header length disagrees with spec" ". section header length %u, spec: %lu\n", __func__, hdr->length, sizeof(struct opal_mtms_scn)); return -EINVAL; } mt.v6hdr = *hdr; memcpy(mt.mt.model, bufmt->mt.model, OPAL_SYS_MODEL_LEN); memcpy(mt.mt.serial_no, bufmt->mt.serial_no, OPAL_SYS_SERIAL_LEN); print_mt_scn(&mt); return 0; } /* parse SRC section of the log */ int parse_src_scn(const struct opal_v6_hdr *hdr, const char *buf, int buflen) { struct opal_src_scn src; struct opal_src_scn *bufsrc = (struct opal_src_scn*)buf; if (buflen < sizeof(struct opal_src_scn)) { fprintf(stderr, "%s: corrupted, expected length %lu, got %u\n", __func__, sizeof(struct opal_src_scn), buflen); return -EINVAL; } /* header length can be > sizeof() as is variable sized section */ if (hdr->length < sizeof(struct opal_src_scn)) { fprintf(stderr, "%s: section header length less than min size " ". section header length %u, min size: %lu\n", __func__, hdr->length, sizeof(struct opal_src_scn)); return -EINVAL; } src.v6hdr = *hdr; src.version = bufsrc->version; src.flags = bufsrc->flags; src.wordcount = bufsrc->wordcount; src.srclength = be16toh(bufsrc->srclength); src.ext_refcode2 = be32toh(bufsrc->ext_refcode2); src.ext_refcode3 = be32toh(bufsrc->ext_refcode3); src.ext_refcode4 = be32toh(bufsrc->ext_refcode4); src.ext_refcode5 = be32toh(bufsrc->ext_refcode5); src.ext_refcode6 = be32toh(bufsrc->ext_refcode6); src.ext_refcode7 = be32toh(bufsrc->ext_refcode7); src.ext_refcode8 = be32toh(bufsrc->ext_refcode8); src.ext_refcode9 = be32toh(bufsrc->ext_refcode9); memcpy(src.primary_refcode, bufsrc->primary_refcode, OPAL_SRC_SCN_PRIMARY_REFCODE_LEN); print_opal_src_scn(&src); return 0; } static uint16_t from_bcd16(uint16_t bcd) { return (bcd & 0x000f) + ((bcd & 0x00f0) >> 4) * 10 + ((bcd & 0x0f00) >> 8) * 100 + ((bcd & 0xf000) >> 12) * 1000; } static uint8_t from_bcd8(uint8_t bcd) { return (bcd & 0x0f) + ((bcd & 0xf0) >> 4) * 10; } struct opal_datetime parse_opal_datetime(const struct opal_datetime in) { struct opal_datetime out; out.year = from_bcd16(be16toh(in.year)); out.month = from_bcd8(in.month); out.day = from_bcd8(in.day); out.hour = from_bcd8(in.hour); out.minutes = from_bcd8(in.minutes); out.seconds = from_bcd8(in.seconds); out.hundredths = from_bcd8(in.hundredths); return out; } /* parse private header scn */ int parse_priv_hdr_scn(struct opal_priv_hdr_scn *privhdr, const struct opal_v6_hdr *hdr, const char *buf, int buflen) { struct opal_priv_hdr_scn *bufhdr = (struct opal_priv_hdr_scn*)buf; if (buflen < sizeof(struct opal_priv_hdr_scn)) { fprintf(stderr, "%s: corrupted, expected length %lu, got %u\n", __func__, sizeof(struct opal_priv_hdr_scn), buflen); return -EINVAL; } if (hdr->length != sizeof(struct opal_priv_hdr_scn)) { fprintf(stderr, "%s: section header length disagrees with spec" ". section header length %u, spec: %lu\n", __func__, hdr->length, sizeof(struct opal_priv_hdr_scn)); return -EINVAL; } privhdr->v6hdr = *hdr; privhdr->create_datetime = parse_opal_datetime(bufhdr->create_datetime); privhdr->commit_datetime = parse_opal_datetime(bufhdr->commit_datetime); privhdr->creator_id = bufhdr->creator_id; privhdr->scn_count = bufhdr->scn_count; // FIXME: are these ASCII? Need spec clarification privhdr->creator_subid_hi = bufhdr->creator_subid_hi; privhdr->creator_subid_lo = bufhdr->creator_subid_lo; privhdr->plid = be32toh(bufhdr->plid); privhdr->log_entry_id = be32toh(bufhdr->log_entry_id); print_opal_priv_hdr_scn(privhdr); return 0; } /* parse_usr_hdr_scn */ int parse_usr_hdr_scn(const struct opal_v6_hdr *hdr, const char *buf, int buflen) { struct opal_usr_hdr_scn usrhdr; struct opal_usr_hdr_scn *bufhdr = (struct opal_usr_hdr_scn*)buf; if (buflen < sizeof(struct opal_usr_hdr_scn)) { fprintf(stderr, "%s: corrupted, expected length %lu, got %u\n", __func__, sizeof(struct opal_usr_hdr_scn), buflen); return -EINVAL; } if (hdr->length != sizeof(struct opal_usr_hdr_scn)) { fprintf(stderr, "%s: section header length disagrees with spec" ". section header length %u, spec: %lu\n", __func__, hdr->length, sizeof(struct opal_usr_hdr_scn)); return -EINVAL; } usrhdr.v6hdr = *hdr; usrhdr.subsystem_id = bufhdr->subsystem_id; usrhdr.event_data = bufhdr->event_data; usrhdr.event_severity = bufhdr->event_severity; usrhdr.event_type = bufhdr->event_type; usrhdr.problem_domain = bufhdr->problem_domain; usrhdr.problem_vector = bufhdr->problem_vector; usrhdr.action = be16toh(bufhdr->action); print_opal_usr_hdr_scn(&usrhdr); return 0; } /* Extended User Header Section */ static int parse_eh_scn(struct opal_v6_hdr *hdr, const char *buf, int buflen) { struct opal_eh_scn *eh; struct opal_eh_scn *bufeh = (struct opal_eh_scn*)buf; eh = (struct opal_eh_scn*) malloc(hdr->length); if (!eh) return -ENOMEM; if (buflen < sizeof(struct opal_eh_scn)) { fprintf(stderr, "%s: corrupted, expected length >= %lu, got %u\n", __func__, sizeof(struct opal_eh_scn), buflen); return -EINVAL; } eh->v6hdr = *hdr; memcpy(eh->mt.model, bufeh->mt.model, OPAL_SYS_MODEL_LEN); memcpy(eh->mt.serial_no, bufeh->mt.serial_no, OPAL_SYS_SERIAL_LEN); /* these are meant to be null terimnated strings, so should be safe */ strcpy(eh->opal_release_version, bufeh->opal_release_version); strcpy(eh->opal_subsys_version, bufeh->opal_subsys_version); eh->event_ref_datetime = parse_opal_datetime(bufeh->event_ref_datetime); eh->opal_symid_len = bufeh->opal_symid_len; strcpy(eh->opalsymid, bufeh->opalsymid); print_eh_scn(eh); return 0; } /* Call Home Section */ static int parse_ch_scn(struct opal_v6_hdr *hdr, const char *buf, int buflen) { struct opal_ch_scn *ch; struct opal_ch_scn *bufch = (struct opal_ch_scn*)buf; ch = (struct opal_ch_scn*) malloc(hdr->length); if (!ch) return -ENOMEM; if (buflen < sizeof(struct opal_ch_scn)) { fprintf(stderr, "%s: corrupted, expected length >= %lu, got %u\n", __func__, sizeof(struct opal_ch_scn), buflen); return -EINVAL; } ch->v6hdr = *hdr; strncpy(ch->comment, bufch->comment, OPAL_CH_COMMENT_MAX_LEN); print_ch_scn(ch); return 0; } static int parse_section_header(struct opal_v6_hdr *hdr, const char *buf, int buflen) { if (buflen < 8) { fprintf(stderr, "ERROR %s: section header is too small, " "is meant to be 8 bytes, only %u found.\n", __func__, buflen); return -EINVAL; } const struct opal_v6_hdr* bufhdr = (struct opal_v6_hdr*)buf; assert(sizeof(struct opal_v6_hdr) == 8); memcpy(hdr->id, bufhdr->id, 2); hdr->length = be16toh(bufhdr->length); hdr->version = bufhdr->version; hdr->subtype = bufhdr->subtype; hdr->component_id = be16toh(bufhdr->component_id); if (hdr->length < 8) { fprintf(stderr, "ERROR %s: section header is corrupt. " "Length < 8 bytes and must be at least 8 bytes " "to include the length of itself. " "Id 0x%x%x Length %u Version %u Subtype %u " "Component ID: %u\n", __func__, hdr->id[0], hdr->id[1], hdr->length, hdr->version, hdr->subtype, hdr->component_id); return -EINVAL; } return 0; } /* parse all required sections of the log */ int parse_opal_event(char *buf, int buflen) { int rc; struct opal_v6_hdr hdr; struct opal_priv_hdr_scn ph; int i; char *start = buf; int nrsections = 0; while (buflen) { rc = parse_section_header(&hdr, buf, buflen); if (rc < 0) return rc; if (nrsections == 0 && strncmp(hdr.id, "PH", 2)) { fprintf(stderr, "ERROR %s: First section should be " "platform header, instead is 0x%02x%02x\n", __func__, hdr.id[0], hdr.id[1]); rc = -1; break; } nrsections++; if (strncmp(hdr.id, "PH", 2) == 0) { parse_priv_hdr_scn(&ph, &hdr, buf, buflen); } else if (strncmp(hdr.id, "UH", 2) == 0) { // fixme required parse_usr_hdr_scn(&hdr, buf, buflen); } else if (strncmp(hdr.id, "PS", 2) == 0) { // FIXME sometimes required parse_src_scn(&hdr, buf, buflen); } else if (strncmp(hdr.id, "EH", 2) == 0) { parse_eh_scn(&hdr, buf, buflen); } else if (strncmp(hdr.id, "MT", 2) == 0) { // FIXME: required parse_mt_scn(&hdr, buf, buflen); } else if (strncmp(hdr.id, "SS", 2) == 0) { // FIXME } else if (strncmp(hdr.id, "DH", 2) == 0) { // FIXME } else if (strncmp(hdr.id, "SW", 2) == 0) { // FIXME } else if (strncmp(hdr.id, "LP", 2) == 0) { // FIXME } else if (strncmp(hdr.id, "LR", 2) == 0) { // FIXME } else if (strncmp(hdr.id, "HM", 2) == 0) { // FIXME } else if (strncmp(hdr.id, "EP", 2) == 0) { // FIXME } else if (strncmp(hdr.id, "IE", 2) == 0) { // FIXME } else if (strncmp(hdr.id, "MI", 2) == 0) { // FIXME } else if (strncmp(hdr.id, "CH", 2) == 0) { parse_ch_scn(&hdr, buf, buflen); } else if (strncmp(hdr.id, "UD", 2) == 0) { // FIXME } else if (strncmp(hdr.id, "EI", 2) == 0) { // FIXME } else if (strncmp(hdr.id, "ED", 2) == 0) { // FIXME } else { printf("Unknown section header: %c%c at %lu:\n", hdr.id[0], hdr.id[1], buf-start); printf("Length: %u (incl 8 byte header)\n", hdr.length); printf("Hex:\n"); for (i = 8; i < hdr.length; i++) { printf("0x%02x ", *(buf+i)); if (i % 16) printf("\n"); } printf("Text (. = unprintable):\n"); for (i = 8; i < hdr.length; i++) { printf("%c", (isgraph(*(buf+i)) | isspace(*(buf+i))) ? *(buf+i) : '.'); } } buf+= hdr.length; if (nrsections == ph.scn_count) break; } return 0; } ppc64-diag-2.6.4/lpd/0000755000000000000000000000000012313010662012630 5ustar rootrootppc64-diag-2.6.4/lpd/lp_util.h0000644000000000000000000000060212313010662014447 0ustar rootroot/** * Copyright (C) 2012 IBM Corporation * See 'COPYRIGHT' for License of this code. */ #ifndef LP_UTIL_H #define LP_UTIL_H #include "lp_diag.h" extern char *fgets_nonl(char *, int, FILE *); extern int read_vpd_from_lsvpd(struct dev_vpd *, const char *); extern struct dev_vpd *read_device_vpd(const char *); extern void free_device_vpd(struct dev_vpd *); #endif /* LP_UTIL_H */ ppc64-diag-2.6.4/lpd/lp_diag.h0000644000000000000000000000707312313010662014407 0ustar rootroot/** * Copyright (C) 2012 IBM Corporation * See 'COPYRIGHT' for License of this code. */ #ifndef LP_DIAG_H #define LP_DIAG_H #include /* Definations for indicator operating mode */ #define GUIDING_LIGHT_MODE 0x01 #define LIGHT_PATH_MODE 0x02 /* Definations for RTAS indicator call token values */ #define IDENT_INDICATOR 9007 #define ATTN_INDICATOR 9006 #define INDICATOR_TYPE(x) (((x) == IDENT_INDICATOR) ? "identification" \ : "attention") /* Defination for type of indicator call */ #define DYNAMIC_INDICATOR 0xFFFFFFFF /* Definations for indicator type */ #define TYPE_ALL 0 #define TYPE_RTAS 1 #define TYPE_SES 2 #define TYPE_OS 3 #define TYPE_EOL 4 /* Indicator state */ #define INDICATOR_SAME -1 #define INDICATOR_ON 1 #define INDICATOR_OFF 0 /* Buffer size */ #define BUF_SIZE 4096 #define LP_ERROR_LOG_MAX 4096 /* Debug defination */ #define dbg(_f, _a...) _dbg("%s(): "_f, __FUNCTION__, ##_a) /* Log file size */ #define KILOBYTE 1024 #define LP_ERRD_LOGSZ (KILOBYTE * KILOBYTE) /* External variables */ extern uint32_t operating_mode; extern char *program_name; extern char *lp_event_log_file; extern int lp_event_log_fd; extern char *lp_error_log_file; extern int lp_error_log_fd; #define DEV_LENGTH 64 #define VPD_LENGTH 128 #define LOCATION_LENGTH 128 /* device vpd data */ struct dev_vpd { char dev[DEV_LENGTH]; char location[LOCATION_LENGTH]; char mtm[VPD_LENGTH]; char sn[VPD_LENGTH]; char pn[VPD_LENGTH]; char fru[VPD_LENGTH]; char ds[VPD_LENGTH]; struct dev_vpd *next; }; /* Indicator list - * * Note : * The order of the fields in loc_code is important! * First three fields must be first, and in this order. * These fields are used for RTAS-controlled indicators. * Fields after this point can be reordered. */ struct loc_code { uint32_t length; /* includes null terminator (RTAS) */ char code[LOCATION_LENGTH]; /* location code */ uint32_t index; /* RTAS index, if RTAS indicator */ uint32_t type; /* one of TYPE_ defines */ int state; /* identify indicator status */ char dev[DEV_LENGTH]; /* device name to interact with*/ char devname[DEV_LENGTH]; /* like sda, sdb etc */ char mtm[VPD_LENGTH]; /* Model */ char sn[VPD_LENGTH]; /* Serial Number */ char pn[VPD_LENGTH]; /* Part Number */ char fru[VPD_LENGTH]; /* FRU number */ char ds[VPD_LENGTH]; /* Display name */ struct loc_code *next; }; /* files.c */ int init_files(void); void close_files(void); void _dbg(const char *, ...); void log_msg(const char *, ...); int indicator_log_write(const char *, ...); /* indicator.c */ int check_operating_mode(void); int get_indicator_list(int, struct loc_code **); int get_indicator_state(int , struct loc_code *, int *); int set_indicator_state(int , struct loc_code *, int); void get_all_indicator_state(int , struct loc_code *); void set_all_indicator_state(int , struct loc_code *, int); int enable_check_log_indicator(void); int disable_check_log_indicator(void); void fill_indicators_vpd(struct loc_code *); void free_indicator_list(struct loc_code *); int device_supported(const char *, const char *); int enclosure_supported(const char *); int truncate_loc_code(char *); struct loc_code *get_indicator_for_loc_code(struct loc_code *, const char *); int get_loc_code_for_dev(const char *, char *, int); /* servicelog.c */ int get_service_event(int, struct sl_event **); int get_all_open_service_event(struct sl_event **); int get_repair_event(int, struct sl_event **); int print_service_event(struct sl_event *); #endif /* LP_DIAG_H */ ppc64-diag-2.6.4/lpd/servicelog.c0000644000000000000000000000432012313010662015135 0ustar rootroot/** * @file servicelog.c * @brief Read servicelog database * * Copyright (C) 2012 IBM Corporation * See 'COPYRIGHT' for License of this code. * * @author Vasant Hegde */ #include #include #include "lp_diag.h" /* Query string should be same as "match" field in notification script. * see scripts/lp_diag_setup script. */ #define SERVICELOG_QUERY_LEN 128 #define SERVICELOG_QUERY_STRING "disposition>=1 and severity>=4 and " \ "serviceable=1" /** * get_servicelog_event - Retrieve servicelog event(s) * * @query servicelog event query * @event servicelog event structure * * Returns : * 0 on success, !0 on failure */ static int get_servicelog_event(char *query, struct sl_event **event) { int rc; struct servicelog *slog; rc = servicelog_open(&slog, 0); if (rc) { log_msg("Error opening servicelog db: %s", strerror(rc)); return rc; } rc = servicelog_event_query(slog, query, event); if (rc) log_msg("Error reading servicelog db :%s", servicelog_error(slog)); /* close database */ servicelog_close(slog); return rc; } /** * get_service_event - Get service event */ int get_service_event(int event_id, struct sl_event **event) { char query[SERVICELOG_QUERY_LEN]; snprintf(query, SERVICELOG_QUERY_LEN, "id=%d", event_id); return get_servicelog_event(query, event); } /** * get_all_open_service_event - Get all open serviceable event */ int get_all_open_service_event(struct sl_event **event) { int len; char query[SERVICELOG_QUERY_LEN]; len = snprintf(query, SERVICELOG_QUERY_LEN, SERVICELOG_QUERY_STRING); snprintf(query + len, SERVICELOG_QUERY_LEN - len, " and closed=0"); return get_servicelog_event(query, event); } /** * get_repair_event - Get repair event */ int get_repair_event(int repair_id, struct sl_event **event) { int len; char query[SERVICELOG_QUERY_LEN]; len = snprintf(query, SERVICELOG_QUERY_LEN, SERVICELOG_QUERY_STRING); snprintf(query + len, SERVICELOG_QUERY_LEN - len, " and repair=%d", repair_id); return get_servicelog_event(query, event); } /** * print_service_event - Print servicelog event */ int print_service_event(struct sl_event *event) { return servicelog_event_print(stdout, event, 1); } ppc64-diag-2.6.4/lpd/indicator.c0000644000000000000000000002275312313010662014761 0ustar rootroot/** * @file indicator.c * @brief Indicator manipulation routines * * Copyright (C) 2012 IBM Corporation * See 'COPYRIGHT' for License of this code. * * @author Vasant Hegde */ #include #include #include #include #include #include #include #include "lp_diag.h" #include "lp_util.h" #include "indicator_ses.h" #include "indicator_rtas.h" /* Note: * At present, we do not support all SES enclosures/devices. Consider * removing device_supported() and enclosure_supported() once we * have Light Path support for all enclosures/devices. */ /* List of all Light Path supported enclosures */ static struct { char *model; } supported_ses_enclosure[] = { {"5888"}, /* Bluehawk */ {"EDR1"}, /* Bluehawk */ {NULL} }; /* List of all Light Path supported devices */ static struct { char *subsystem; char *driver; } os_supported_device[] = { {"net", "cxgb3"}, /* Chelsio network card*/ {"net", "e1000e"}, /* Intel network card*/ {NULL, NULL} }; /** * device_supported - Check Light Path support for device * * @subsystem subsystem * @driver kernel driver * * Returns : * 1 if device is supported / 0 if device is not supported */ int device_supported(const char *subsystem, const char *driver) { int i; if (!subsystem || !driver) return 0; for (i = 0; os_supported_device[i].driver; i++) if (!strcmp(os_supported_device[i].subsystem, subsystem) && !strcmp(os_supported_device[i].driver, driver)) return 1; return 0; } /** * enclosure_supported - Check Light Path support for enclosure * * @model enclosure model * * Returns : * 1 if enclosure is supported / 0 if enclosure is not supported */ int enclosure_supported(const char *model) { int i; if (!model) return 0; for (i = 0; supported_ses_enclosure[i].model; i++) if (!strcmp(supported_ses_enclosure[i].model, model)) return 1; return 0; } /** * get_indicator_state - Retrieve the current state for an indicator * * Call the appropriate routine for retrieving indicator values based on the * type of indicator. * * @indicator identification or attention indicator * @loc location code of the sensor * @state return location for the sensor state * * Returns : * indicator return code */ int get_indicator_state(int indicator, struct loc_code *loc, int *state) { switch (loc->type) { case TYPE_RTAS: return get_rtas_sensor(indicator, loc, state); case TYPE_SES: return get_ses_indicator(indicator, loc, state); default: break; } return -1; } /** * set_indicator_state - Set an indicator to a new state (on or off) * * Call the appropriate routine for setting indicators based on the type * of indicator. * * @indicator identification or attention indicator * @loc location code of rtas indicator * @new_value value to update indicator to * * Returns : * indicator return code */ int set_indicator_state(int indicator, struct loc_code *loc, int new_value) { switch (loc->type) { case TYPE_RTAS: return set_rtas_indicator(indicator, loc, new_value); case TYPE_SES: return set_ses_indicator(indicator, loc, new_value); default: break; } return -1; } /** * get_all_indicator_state - Get all indicators current state * * @indicator identification or attention indicator * @loc location code structure * * Returns : * nothing */ void get_all_indicator_state(int indicator, struct loc_code *loc) { int rc; int state; while (loc) { rc = get_indicator_state(indicator, loc, &state); if (rc) /* failed to get indicator state */ loc->state = -1; else loc->state = state; loc = loc->next; } } /** * set_all_indicator_state - Sets all indicators state * * @indicator identification or attention indicator * @loc location code structure * @new_value INDICATOR_ON/INDICATOR_OFF * * Returns : * 0 on success, !0 on failure */ void set_all_indicator_state(int indicator, struct loc_code *loc, int new_value) { int state; int rc; struct loc_code *encl = &loc[0]; while (loc) { rc = get_indicator_state(indicator, loc, &state); if (rc || state != new_value) set_indicator_state(indicator, loc, new_value); loc = loc->next; } /* If enclosure identify indicator is turned ON explicitly, * then turning OFF all components identify indicator inside * enclosure does not turn OFF enclosure identify indicator. */ if (encl && indicator == IDENT_INDICATOR && new_value == INDICATOR_OFF) set_indicator_state(indicator, encl, new_value); } /** * check_operating_mode - Gets the service indicator operating mode * * Note: There is no defined property in PAPR+ to determine the indicator * operating mode. There is some work being done to get property * into PAPR. When that is done we will check for that property. * * At present, we will query RTAS fault indicators. It should return * at least one fault indicator, that is check log indicator. If only * one indicator is returned, then Guiding Light mode else Light Path * mode. * * Returns : * operating mode value */ int check_operating_mode(void) { int rc; struct loc_code *list = NULL; rc = get_rtas_indices(ATTN_INDICATOR, &list); if (rc) return -1; if (!list) /* failed */ return -1; else if (!list->next) operating_mode = GUIDING_LIGHT_MODE; else operating_mode = LIGHT_PATH_MODE; free_indicator_list(list); return 0; } /** * enable_check_log_indicator - Enable check log indicator * * Returns : * 0 on sucess, !0 on failure */ int enable_check_log_indicator(void) { int rc; struct loc_code *list = NULL; struct loc_code *clocation; rc = get_rtas_indices(ATTN_INDICATOR, &list); if (rc) return rc; /** * The first location code returned by get_rtas_indices RTAS call * is check log indicator. */ clocation = &list[0]; rc = set_indicator_state(ATTN_INDICATOR, clocation, INDICATOR_ON); free_indicator_list(list); return rc; } /** * disable_check_log_indicator - Disable check log indicator * * Returns : * 0 on sucess, !0 on failure */ int disable_check_log_indicator(void) { int rc; struct loc_code *list = NULL; struct loc_code *clocation; rc = get_rtas_indices(ATTN_INDICATOR, &list); if (rc) return rc; /** * The first location code returned by get_rtas_indices RTAS call * is check log indicator. */ clocation = &list[0]; rc = set_indicator_state(ATTN_INDICATOR, clocation, INDICATOR_OFF); free_indicator_list(list); return rc; } /** * get_indicator_list - Build indicator list of given type * * @indicator identification or attention indicator * @list loc_code structure * * Returns : * 0 on success, !0 otherwise */ int get_indicator_list(int indicator, struct loc_code **list) { int rc; /* Get RTAS indicator list */ rc = get_rtas_indices(indicator, list); if (rc) return rc; /* FRU fault indicators are not supported in Guiding Light mode */ if (indicator == ATTN_INDICATOR && operating_mode == GUIDING_LIGHT_MODE) return rc; /* SES indicators */ get_ses_indices(indicator, list); return rc; } /** * get_loc_code_for_dev - Get location code for the given device * * @device device name * @location output location code * @locsize location code size * * Returns : * 0 on success / -1 on failure */ int get_loc_code_for_dev(const char *device, char *location, int locsize) { struct dev_vpd vpd; memset(&vpd, 0, sizeof(struct dev_vpd)); if (device && !read_vpd_from_lsvpd(&vpd, device)) { if (location && vpd.location[0] != '\0') { strncpy(location, vpd.location, locsize); return 0; } } return -1; } /** * get_indicator_for_loc_code - Compare device location code with indicator list * * @list indicator list * @location device location code * * Returns : * on success, loc_code structure * on failure, NULL */ struct loc_code * get_indicator_for_loc_code(struct loc_code *list, const char *location) { while (list) { if (!strcmp(list->code, location)) return list; list = list->next; } return NULL; } /** * truncate_loc_code - Truncate the last few characters of a location code * * Truncates the last few characters off of a location code; if an * indicator doesn't exist at the orignal location, perhaps one exists * at a location closer to the CEC. * * @loccode location code to truncate * * Returns : * 1 - successful truncation / 0 - could not be truncated further */ int truncate_loc_code(char *loccode) { int i; for (i = strlen(loccode) - 1; i >= 0; i--) { if (loccode[i] == '-') { loccode[i] = '\0'; return 1; /* successfully truncated */ } } return 0; } /** * free_indicator_list - Free loc_code structure * * @loc list to free * * Return : * nothing */ void free_indicator_list(struct loc_code *loc) { struct loc_code *tmp = loc; while (loc) { tmp = loc; loc = loc->next; free(tmp); } } /** * fill_indicators_vpd - Fill indicators vpd data */ void fill_indicators_vpd(struct loc_code *list) { struct dev_vpd vpd; struct loc_code *curr; for (curr = list; curr; curr = curr->next) { /* zero out the vpd structure */ memset(&vpd, 0, sizeof(struct dev_vpd)); if (read_vpd_from_lsvpd(&vpd, curr->code)) return; strncpy(curr->devname, vpd.dev, DEV_LENGTH); strncpy(curr->mtm, vpd.mtm, VPD_LENGTH); strncpy(curr->sn, vpd.sn, VPD_LENGTH); strncpy(curr->pn, vpd.pn, VPD_LENGTH); strncpy(curr->fru, vpd.fru, VPD_LENGTH); /* retain existing DS */ if (curr->ds[0] == '\0') strncpy(curr->ds, vpd.ds, VPD_LENGTH); } } /** * is_enclosure_loc_code - */ int is_enclosure_loc_code(struct loc_code *loc) { if (strchr(loc->code, '-') == NULL) return 1; return 0; } ppc64-diag-2.6.4/lpd/man/0000755000000000000000000000000012313010662013403 5ustar rootrootppc64-diag-2.6.4/lpd/man/lp_diag.80000644000000000000000000000165212313010662015077 0ustar rootroot.\" .\" Copyright (C) 2012 International Business Machines .\" Author : Vasant Hegde .\" .TH LP_DIAG 8 "Dec 2012" Linux "PowerLinux Service Tools" .SH NAME lp_diag - Light Path Diagnostics .SH SYNOPSIS .nf lp_diag [\fB-V\fR] [\fB-h\fR] .fi .SH DESCRIPTION .P The \fBlp_diag\fR utility is used to view and manipulate the service indicators (LEDs). It provides curses based interface. Using \fBlp_diag\fR one can perform below tasks : Set System Attention Indicator to NORMAL Set ALL Identify Indicator to NORMAL List all identify indicators along with their current status (on or off) Modify identify indicator(s) state (on or off) .B lp_diag currently supports a limited number of device drivers and SES enclosures. .SH OPTIONS .TP .B \-V Display the version of the command and exit. .TP .B \-h Print the usage message and exit. .SH "SEE ALSO" .BR usysident (8), .BR usysattn (8) ppc64-diag-2.6.4/lpd/man/usysattn.80000644000000000000000000000420312313010662015365 0ustar rootroot.\" .\" Copyright (C) 2004, 2012 International Business Machines .\" .\" Note: .\" This man page is moved from powerpc-util package to here. .\" Author : Michael Strosaker .\" Updates: Vasant Hegde .\" .TH USYSATTN 8 "Dec 2012" Linux "PowerLinux Service Tools" .SH NAME usysattn, usysfault \- operate system attention and fault indicators .SH SYNOPSIS .nf \fB/usr/sbin/usysattn \fR[\fB-l \fI\fR [\fB-s normal\fR] [\fB-t\fR]] [\fB-V\fR] [\fB-h\fR] \fB/usr/sbin/usysfault \fR[\fB-l \fI\fR [\fB-s normal\fR] [\fB-t\fR]] [\fB-V\fR] [\fB-h\fR] .fi .SH DESCRIPTION .P The \fIusysattn\fR utility is used to view and manipulate the system attention and fault indicators (LEDs) on IBM Power Systems servers. The first location code displayed by \fIusysattn\fR is system attention indicator and rest of the location codes are fault indicators. These indicators are turned on automatically when a serviceable event is received. These identifiers are specified by location code. .P When run without arguments, \fIusysattn\fR will print a list of all the fault indicators on the system along with their current status (on or off). The \fB\-l\fR option can be used to specify a particular indicator. If \fB\-l\fR is the only argument, the status of that indicator will be printed. If \fB\-s\fR \fInormal\fR is specified along with the \fB\-l\fR argument, the indicator will be turned off. .P .B NOTE: Ensure that there are no outstanding service actions to be taken on this system before turning off the system attention indicator. .SH OPTIONS .TP .B \-l \fIlocation_code Specify the location code of the indicator. .TP .B \-s normal Must be used with the \fB\-l\fR option; turns the specified indicator off. .TP .B \-t Truncate the location code if necessary. If an indicator is not available at the specified location, this option will continuously trim the last clause off of the location code in an attempt to find an indicator near the device. .TP .B \-V Display the version of the command and exit. .TP .B \-h Print the usage message and exit. .SH "SEE ALSO" .BR lp_diag (8), .BR usysident (8) ppc64-diag-2.6.4/lpd/man/usysfault.80000644000000000000000000000013112313010662015526 0ustar rootroot.\" .\" Copyright (C) 2004, 2012 International Business Machines .\" .so man8/usysattn.8 ppc64-diag-2.6.4/lpd/man/Makefile0000644000000000000000000000063512313010662015047 0ustar rootroot# # Makefile for lpd/man # .SILENT: include ../../rules.mk MANPAGES = lp_diag.8 usysattn.8 usysident.8 usysfault.8 C_MANPAGES = lp_diag.8.gz usysattn.8.gz usysident.8.gz usysfault.8.gz all: $(MANPAGES) install: all @$(call install_man,$(MANPAGES),$(DESTDIR)) for file in $(MANPAGES) ; do \ gzip -f $(DESTDIR)/$(MAN_DIR)/$$file ;\ done uninstall: @$(call uninstall_man,$(C_MANPAGES),$(DESTDIR)) clean: ppc64-diag-2.6.4/lpd/man/usysident.80000644000000000000000000000422212313010662015523 0ustar rootroot.\" .\" Copyright (C) 2004, 2012 International Business Machines .\" .\" Note: .\" This man page is moved from powerpc-util package to here. .\" Author : Michael Strosaker .\" Updates: Vasant Hegde .\" .TH USYSIDENT 8 "Dec 2012" Linux "PowerLinux Service Tools" .SH NAME usysident \- operate device identification indicators .SH SYNOPSIS .nf \fB/usr/sbin/usysident \fR[\fB-l \fI\fR [\fB-s normal\fR|\fBidentify\fR] [\fB-t\fR]] \fB/usr/sbin/usysident \fR[\fB-d \fI\fR [\fB-s normal\fR|\fBidentify\fR] [\fB-t\fR]] \fB/usr/sbin/usysident \fR[\fB-V\fR] \fB/usr/sbin/usysident \fR[\fB-h\fR] .fi .SH DESCRIPTION .P The \fIusysident\fR utility is used to view and manipulate the indicators (LEDs) that identify certain devices on IBM Power Systems servers. These identifiers are specified by location code; location codes can be retrieved by running lscfg. .P When run without arguments, \fIusysident\fR will print a list of all of the identification indicators on the system along with their current status (on or off). The \fB\-l\fR or \fB\-d\fR options can be used to specify a particular indicator, by location code or logical device name respectively. If \fB\-l\fR or \fB\-d\fR is the only argument, the status of that indicator will be printed. If the \fB\-s\fR argument is specified in addition, the indicator may be turned on or off. .SH OPTIONS .TP \fB\-l \fIlocation_code Specify the location code of the indicator. .TP \fB\-d \fIdev_name Specify the name of the device to be identified (e.g. eth0, sda). .TP \fB\-s \fR{\fBnormal\fR|\fBidentify\fR} Must be used with the \fB\-l\fR or \fB\-d\fR option; \fB\-s normal\fR will turn the indicator off, while \fB\-s identify\fR will turn the indicator on. .TP .B \-t Truncate the location code if necessary. If an indicator is not available at the specified location, this option will continuously trim the last clause off of the location code in an attempt to find an indicator near the device. .TP .B \-V Display the version of the command and exit. .TP .B \-h Print the usage message and exit. .SH "SEE ALSO" .BR lp_diag (8), .BR usysattn (8), .BR lscfg (8) ppc64-diag-2.6.4/lpd/lp_diag.c0000644000000000000000000006556612313010662014415 0ustar rootroot/** * @file lp_diag.c * @brief Light Path Diagnostics * * Copyright (C) 2012 IBM Corporation * See 'COPYRIGHT' for License of this code. * * @author Vasant Hegde */ #include #include #include #include #include #include #include #include #include #include #include "platform.c" #include "lp_diag.h" #include "lp_util.h" /* FRU callout priority as defined in PAPR+ * * Note: Order of the priority is important! */ #define FRU_CALLOUT_PRIORITY "HMABCL" /* Servicelog command string */ #define SERVICELOG_EVENT_CMD \ "Run \"/usr/bin/servicelog --query=\"id=%d\"\" for full details." #define SERVICELOG_REPAIR_CMD \ "Run \"/usr/bin/servicelog --query=\"repair=%d\"\" for full details." /* loop */ #define for_each_callout(callout, callouts) \ for (callout = callouts; callout; callout = callout->next) #define for_each_event(e, events) \ for (e = events; e; e = e->next) #define for_each_fru(fru, frus) \ for (fru = frus; fru; fru = fru->next) /* Row number for the menu begin */ #define BEGIN_Y 5 #define ENTER 10 /* FRU location code */ struct fru { char location[LOCATION_LENGTH]; struct fru *next; }; /* Global variables for LPD UI */ int nlines; char *cur_state; char *prev_state; static int startup_window(); /** * set_attn_indicator - Enable/disable system attention indicator * * @attn_loc attn location * @new_state indicator state * * @Returns : * 0 on success, !0 on failure */ static int set_attn_indicator(struct loc_code *attn_loc, int new_state) { int rc; int state; rc = get_indicator_state(ATTN_INDICATOR, attn_loc, &state); if (rc || state != new_state) { rc = set_indicator_state(ATTN_INDICATOR, attn_loc, new_state); if (rc) indicator_log_write("System Attention Indicator :" "Unable to %s", new_state ? "enable" : "disable"); else indicator_log_write("System Attention Indicator : %s", new_state ? "ON" : "OFF"); } return rc; } /** * set_fault_indicator - Enable/disable location fault indicator * * @loc location code * @new_state indicator state * * @Returns : * 0 on success, !0 on failure */ static int set_fault_indicator(struct loc_code *loc, int new_state) { int rc; int state; rc = get_indicator_state(ATTN_INDICATOR, loc, &state); if (rc || state != new_state) { rc = set_indicator_state(ATTN_INDICATOR, loc, new_state); if (rc) indicator_log_write("%s : Unable to %s fault indicator", loc->code, new_state ? "enable" : "disable"); else indicator_log_write("%s : Fault : %s", loc->code, new_state ? "ON" : "OFF"); } return rc; } /** * service_event_supported - Validate the event type and supported device * * @event sl_event structure * @event_type service event type * * Returns : * 1 on success / 0 on failure */ static int service_event_supported(struct sl_event *event) { struct sl_data_os *os; struct sl_data_enclosure *enclosure; /* we handle OS and Enclosure events only */ switch (event->type) { case SL_TYPE_OS: os = event->addl_data; if (!device_supported(os->subsystem, os->driver)) { log_msg("Unsupported device driver : %s", os->driver); return 0; } break; case SL_TYPE_ENCLOSURE: enclosure = event->addl_data; if (!enclosure_supported(enclosure->enclosure_model)) { log_msg("Unsupported Enclosure model : %s", enclosure->enclosure_model); return 0; } break; case SL_TYPE_BMC: case SL_TYPE_RTAS: case SL_TYPE_BASIC: default: return 0; } return 1; } /** * free_fru_loc_code - Free location code list * * @frus fru list * * Returns : * nothing */ static void free_fru_loc_code(struct fru *frus) { struct fru *temp = frus; while (frus) { temp = frus; frus = frus->next; free(temp); } } /** * get_fru_indicator - get FRU indicator location code * * Truncates the last few characters off of a location code; * if fault indicator doesn't exist at the original location, * perhaps one exists at the location closer to the CEC. * * Returns: * loc_code structure on success, NULL on failure */ static struct loc_code * get_fru_indicator(struct loc_code *list, char *location, int *truncated) { struct loc_code *loc_led; retry: loc_led = get_indicator_for_loc_code(list, location); if (!loc_led) { /* No indicator at original location */ if (truncate_loc_code(location)) { *truncated = 1; goto retry; } return NULL; } return loc_led; } /** * build_callout_loc_code - Build location code list * * @event sl_event * @list loc_code structure * @frus fru list * @attn_state attention indicator state * * Returns : * fru loc list, on success / NULL, on failure */ static struct fru * build_callout_loc_code(struct sl_event *event, struct loc_code *list, struct fru *frus, int *attn_state) { int found; int truncated = 0; char location[LOCATION_LENGTH]; struct fru *fru; struct sl_callout *callout; struct loc_code *loc_led; if (!event->callouts) { /* Empty callout */ *attn_state = 1; return frus; } for_each_callout(callout, event->callouts) { /* valid loc code ? */ if (!callout->location || !strcmp(callout->location, "")) { *attn_state = 1; continue; } /* get FRUs nearest fault indicator */ strncpy(location, callout->location, LOCATION_LENGTH); loc_led = get_fru_indicator(list, location, &truncated); if (!loc_led) { /* No indicator found for the given loc code */ *attn_state = 1; continue; } found = 0; for_each_fru(fru, frus) /* location is added to callout list ? */ if (!strcmp(fru->location, location)) { found = 1; break; } if (!found) { /* Add location code to fru list */ fru = frus; if (fru) while (fru->next) fru = fru->next; if (!fru) { fru = (struct fru *)malloc(sizeof (struct fru)); frus = fru; } else { fru->next = (struct fru *)malloc(sizeof (struct fru)); fru = fru->next; } if (!fru) { log_msg("Out of memory"); free_fru_loc_code(frus); return NULL; } memset(fru, 0, sizeof(struct fru)); strncpy(fru->location, location, LOCATION_LENGTH); } } return frus; } /** * event_fru_callout - Parse the FRU callout list and enable * location indicator * * @callouts sl_callouts structure * @list loc_code list * @fru_priority FRU callout priority * @attn_on Attention indicator state * * @Returns : * 1 on success / 0 on failure */ static int event_fru_callout(struct sl_callout *callouts, struct loc_code *list, char fru_priority, int *attn_on) { int rc = 0; int truncated = 0; char location[LOCATION_LENGTH]; struct sl_callout *callout; struct loc_code *loc_led = NULL; /* Go over callout list */ for_each_callout(callout, callouts) { if (callout->priority != fru_priority) continue; /* valid location code ? */ if (!callout->location || !strcmp(callout->location, "")) { indicator_log_write("Empty location code in callout"); *attn_on = 1; continue; } /* get FRUs nearest fault indicator */ strncpy(location, callout->location, LOCATION_LENGTH); loc_led = get_fru_indicator(list, location, &truncated); if (!loc_led) { /* No indicator found for the given loc code */ *attn_on = 1; indicator_log_write("%s does not have fault indicator", callout->location); indicator_log_write("Could not truncate and get " "location code closer to CEC"); continue; } if (truncated) { indicator_log_write("%s does not have fault indicator", callout->location); indicator_log_write("Truncated location : %s", location); } rc = set_fault_indicator(loc_led, INDICATOR_ON); } return rc; } /** * repair_fru_callout - Disable indicator * * @fru FRU location code * @list loc_code list * @attn_disable Attention indicator state * * @Returns : * 1 on success / 0 on failure */ static int repair_fru_callout(struct fru *fru, struct loc_code *list, int *attn_disable) { int rc = 0; struct loc_code *loc_led = NULL; loc_led = get_indicator_for_loc_code(list, fru->location); if (loc_led) rc = set_fault_indicator(loc_led, INDICATOR_OFF); else { indicator_log_write("%s does not have fault indicator", fru->location); *attn_disable = 1; } return rc; } /** * parse_service_event - Analyze events and enable LED if required * * @event_id servicelog event ID * * Returns : * 0 on success, !0 on failure */ static int parse_service_event(int event_id) { int i; int rc; int attn_on = 0; struct sl_event *event = NULL; struct loc_code *list = NULL; struct loc_code *attn_loc; log_msg("Service event ID = %d", event_id); /* get servicelog event */ rc = get_service_event(event_id, &event); if (rc) return rc; if (!event) { log_msg("Unable to read service event"); return -1; } if (!service_event_supported(event)) { rc = 0; /* return success */ goto event_out; } indicator_log_write("---- Service event begin ----"); /* build indicator list */ rc = get_indicator_list(ATTN_INDICATOR, &list); if (rc) { log_msg("Unable to retrieve fault indicators"); indicator_log_write("Unable to retrieve fault indicators"); goto indicator_out; } /* First loc code is system attention indicator */ attn_loc = &list[0]; if (operating_mode == LIGHT_PATH_MODE) { if (event->callouts) /* Run over FRU callout priority in order and * enable fault indicator */ for (i = 0; FRU_CALLOUT_PRIORITY[i]; i++) rc = event_fru_callout(event->callouts, list, FRU_CALLOUT_PRIORITY[i], &attn_on); else { /* No callout list, enable check log indicator */ indicator_log_write("Empty callout list"); attn_on = 1; } if (attn_on) /* check log indicator */ rc = set_attn_indicator(attn_loc, INDICATOR_ON); } else { log_msg("Guiding Light mode"); rc = set_attn_indicator(attn_loc, INDICATOR_ON); } if (rc) log_msg("Unable to enable fault indicator"); /* free indicator list */ free_indicator_list(list); indicator_out: indicator_log_write(SERVICELOG_EVENT_CMD, event_id); indicator_log_write("---- Service event end ----"); event_out: /* free up servicelog event */ servicelog_event_free(event); return rc; } /** * parse_repair_event - Analyse the servicelog repair events and * disable indicator if required * * @repair_id servicelog repair ID * * Returns : * 0 on sucess, !0 on failure */ static int parse_repair_event(int repair_id) { int rc; int loc_match; int attn_disable = 0; int attn_keep = 0; struct fru *r_fru = NULL; struct fru *r_frus = NULL; struct fru *o_fru = NULL; struct fru *o_frus = NULL; struct sl_event *repair_events = NULL; struct sl_event *open_events = NULL; struct sl_event *repair; struct sl_event *event; struct loc_code *attn_loc; struct loc_code *list = NULL; log_msg("Repair event ID = %d", repair_id); /* get servicelog repair events */ rc = get_repair_event(repair_id, &repair_events); if (rc) return rc; /* get_repair_event returns success, even if particular * repair event didn't close any serviceable event(s). */ if (!repair_events) { log_msg("Repair event %d did not close any service event(s)", repair_id); return 0; } rc = get_all_open_service_event(&open_events); if (rc) goto repair_out; indicator_log_write("---- Repair event begin ----"); /* build indicator list */ rc = get_indicator_list(ATTN_INDICATOR, &list); if (rc) { log_msg("Unable to retrieve fault indicators"); goto event_out; } /* First loc code is system attention indicator */ attn_loc = &list[0]; if (operating_mode == LIGHT_PATH_MODE) { for_each_event(repair, repair_events) { if (!service_event_supported(repair)) continue; r_frus = build_callout_loc_code(repair, list, r_frus, &attn_disable); } for_each_event(event, open_events) { if (!service_event_supported(event)) continue; o_frus = build_callout_loc_code(event, list, o_frus, &attn_keep); } for_each_fru(r_fru, r_frus) { loc_match = 0; for_each_fru(o_fru, o_frus) { /* Do not disable fault indicator, if there * exists an open serviceable event(s) with * that location code. */ if (!strcmp(r_fru->location, o_fru->location)) { loc_match = 1; break; } } if (loc_match) continue; rc = repair_fru_callout(r_fru, list, &attn_disable); } if (!attn_keep && attn_disable) rc = set_attn_indicator(attn_loc, INDICATOR_OFF); } else { log_msg("Guiding Light mode"); if (!open_events) /* No more open events */ rc = set_attn_indicator(attn_loc, INDICATOR_OFF); } if (rc) log_msg("Unable to disable fault indicator"); /* free indicator list */ free_indicator_list(list); event_out: indicator_log_write(SERVICELOG_REPAIR_CMD, repair_id); indicator_log_write("---- Repair event end ----"); servicelog_event_free(open_events); repair_out: servicelog_event_free(repair_events); return rc; } /* UI_help - Print the help message for each selection * * @my_menu list of identify and attention indicators * */ static void UI_help(MENU *my_menu) { int x, y; int c; const char *desc = NULL; ITEM *cur; WINDOW *my_text_win; WINDOW *my_help_win; char *help1 = "This selection will turn all Identify Indicators\n" "off."; char *help2 = "This selection will turn System Attention\nIndicator" " off."; char *help3 = "This selection will toggle the Identify Indicator " "state.\n\n" "If a '+' appears to the left of this selection,\n" "the transaction is waiting to be committed.\n\n" "If an 'I' appears to the left of this selection,\nthe" " Identify Indicator is currently in the \n'identify'" " state.\n\n" "If an 'I' does not appear to the left of this\n" "selection, the Identify Indicator is currently\nin " "the 'normal' state."; getmaxyx(stdscr, y, x); my_help_win = newwin(18, 55, y - 19, (x - 55)/2); my_text_win = newwin(15, 50, y - 17, (x - 50)/2); keypad(my_text_win, TRUE); box(my_help_win, 0, 0); wborder(my_help_win, '|', '|', '-', '-', '+', '+', '+', '+'); wrefresh(my_help_win); mvwprintw(my_text_win, 14, 0, "F3=Cancel\t\tEnter"); wrefresh(my_text_win); cur = current_item(my_menu); desc = item_description(cur); if (!desc) return; if (!strcmp(desc, "ident")) mvwprintw(my_text_win, 0, 0, help1); else if (!strcmp(desc, "attn")) mvwprintw(my_text_win, 0, 0, help2); else mvwprintw(my_text_win, 0, 0, help3); wrefresh(my_text_win); while ((c = wgetch(my_text_win))) { if (c == KEY_F(3) || c == ENTER) break; } delwin(my_text_win); delwin(my_help_win); touchwin(stdscr); wrefresh(stdscr); endwin(); } /* UI_make_selection - Select a particular indicator * * @my_menu_win window associated with my_menu * @my_menu list of identify and attention indicators * */ static void UI_make_selection(WINDOW *my_menu_win, MENU *my_menu) { int index; int i; int x, y; ITEM *cur; const char *desc = NULL; cur = current_item(my_menu); index = item_index(cur); desc = item_description(cur); getyx(my_menu_win, y, x); if (desc && !strcmp(desc, "ident")) { for (i = 0; i < item_count(my_menu); i++) if (cur_state[i] == 'I') { prev_state[i] = 'I'; cur_state[i] = '+'; } for (i = 0; i < nlines; i++) mvaddch(i + BEGIN_Y, 0, cur_state[i]); } else if (cur_state[index] == '+') { cur_state[index] = prev_state[index]; mvaddch(y + BEGIN_Y, 0, cur_state[index]); } else { prev_state[index] = cur_state[index]; cur_state[index] = '+'; mvaddch(y + BEGIN_Y, 0, cur_state[index]); } refresh(); } /* UI_commit - commits the changes made to the indicator states * * @my_menu_win window associated with my_menu * @my_menu list of identify and attention indicators * @ident_list list of identify indicators * @attn_list list of system attention and fault indicators * */ static void UI_commit(WINDOW *my_menu_win, MENU *my_menu, struct loc_code *ident_list, struct loc_code *attn_list) { int ident; int index; int i, j; int err = 0; int x, y; int rc; int c; char *name; const char *desc = NULL; ITEM **items; ITEM *cur; WINDOW *my_help_win; struct loc_code *loc; getmaxyx(stdscr, y, x); my_help_win = newwin(6, 55, y - 7, (x - 55)/2); keypad(my_help_win, TRUE); box(my_help_win, 0, 0); wborder(my_help_win, '|', '|', '-', '-', '+', '+', '+', '+'); items = menu_items(my_menu); for (i = 0; i < item_count(my_menu); i++) { desc = item_description(items[i]); if (!desc) { if (cur_state[i] == '+') { cur_state[i] = prev_state[i]; err = 1; } continue; } if (!strcmp(desc, "loc")) { name = (char *)item_name(items[i]); loc = get_indicator_for_loc_code(ident_list, name); rc = get_indicator_state(IDENT_INDICATOR, loc, &ident); if (rc) { if (cur_state[i] == '+') { cur_state[i] = prev_state[i]; err = 1; } continue; } } if (cur_state[i] == '+') { mvwprintw(my_help_win, 2, 8, "Processing data ..."); wrefresh(my_help_win); if (!strcmp(desc, "attn")) { rc = set_attn_indicator(&attn_list[0], INDICATOR_OFF); cur_state[i] = ' '; if (rc) err = 1; } else { rc = set_indicator_state(IDENT_INDICATOR, loc, ident ? INDICATOR_OFF : INDICATOR_ON); if (rc) { err = 1; cur_state[i] = ident? 'I' : ' '; continue; } cur_state[i] = ident ? ' ' : 'I'; indicator_log_write("%s : Identify : %s", loc->code, ident? "OFF" : "ON"); } } else if (!strcmp(desc, "loc")) { cur_state[i] = ident? 'I' : ' '; } } cur = current_item(my_menu); index = item_index(cur); getyx(my_menu_win, y, x); for (i = index - y, j = 0; i < index - y + nlines; i++, j++) mvaddch(j + BEGIN_Y, 0, cur_state[i]); refresh(); if (err) { mvwprintw(my_help_win, 2, 4, "Commit failed for one " "or more selections."); mvwprintw(my_help_win, 4, 10, "F3=Cancel\t\tEnter"); while ((c = wgetch(my_help_win))) { if (c == ENTER || c == KEY_F(3)) break; } wrefresh(my_help_win); } delwin(my_help_win); touchwin(my_menu_win); touchwin(stdscr); wrefresh(stdscr); wrefresh(my_menu_win); } /* UI_update_indicator - Updates the state of the indicator when * the selected item changes * * @my_menu_win window associated with my_menu * @my_menu list of identify and attention indicators * */ static void UI_update_indicator(WINDOW *my_menu_win, MENU *my_menu) { int index; int i, j; int x, y; int count; ITEM *cur; cur = current_item(my_menu); index = item_index(cur); count = item_count(my_menu); getyx(my_menu_win, y, x); if (count > nlines) { move(BEGIN_Y - 1, 0); clrtoeol(); if (index - y == 0) printw("[TOP]"); else printw("[MORE .. %d]", index - y); move(nlines + BEGIN_Y, 0); clrtoeol(); if (index - y == count - nlines) printw("[BOTTOM]"); else printw("[MORE .. %d]", count - (index - y + nlines)); } for (i = index - y, j = 0; i < index - y + nlines; i++, j++) mvaddch(j + BEGIN_Y, 0, cur_state[i]); refresh(); } /* UI_cleanup - release memory for states, my_items and menu * * @my_menu list of identify and attention indicators * @my_items items associated with menu * */ static void UI_cleanup(MENU *my_menu, ITEM **my_items) { int i; free(cur_state); free(prev_state); unpost_menu(my_menu); free_menu(my_menu); for (i = 0; i < item_count(my_menu); i++) free_item(my_items[i]); free(my_items); } void resize_handler(int sig) { } /* create_menu - Prints the list of location codes and allows * the user to modify the state of the indicator * * @ident_list list of identify indicators * @attn_list list of system attention and fault indicators * * Returns : * 0 on success and !0 on failure */ static int create_menu(struct loc_code *ident_list, struct loc_code *attn_list) { int x, y; int i = 0; int c; int rc; int ident; int length = 0; int count; struct loc_code *cur; WINDOW *my_menu_win; MENU *my_menu; ITEM **my_items; getmaxyx(stdscr, y, x); nlines = y - 13; if (ident_list) for(cur = ident_list; cur; cur = cur->next) length++; if (attn_list) length += 3; else length += 2; cur_state = (char *)malloc(length); prev_state = (char *)malloc(length); my_items = (ITEM **)calloc(length, sizeof(ITEM *)); if (!cur_state || !prev_state || !my_items) { log_msg("Out of memory"); return -1; } if (ident_list) { my_items[i] = new_item("Set ALL Identify " "Indicator to NORMAL", "ident"); cur_state[i] = ' '; i++; mvprintw(0, 0, "SYSTEM IDENTIFY INDICATOR"); mvprintw(2, 0, "Determining system capabilities"); mvprintw(4, 0, "Please stand by."); refresh(); } if (attn_list) { my_items[i] = new_item("Set System Attention " "Indicator to NORMAL", "attn"); cur_state[i] = ' '; i++; } for (cur = ident_list, i; cur; cur = cur->next, i++) { /* Determine the identify indicator state */ rc = get_indicator_state(IDENT_INDICATOR, cur, &ident); if (rc) cur_state[i] = ' '; else cur_state[i] = ident ? 'I' : ' '; my_items[i] = new_item(cur->code, "loc"); } my_items[i] = (ITEM *)NULL; clear(); if (!ident_list && attn_list) mvprintw(0, 0, "ATTENTION INDICATOR"); else if (attn_list) mvprintw(0, 0, "IDENTIFY AND ATTENTION INDICATORS"); else mvprintw(0, 0, "IDENTIFY INDICATORS"); mvprintw(2, 0, "Make selection(s), use Commit to continue"); mvprintw(LINES - 3, 0, "F1=Help\t\t\tF4=List\t\t\tF7=Commit\t\t\t" "F10=Exit\nF3=Previous Menu"); my_menu = new_menu((ITEM **)my_items); menu_opts_off(my_menu, O_SHOWDESC); menu_opts_off(my_menu, O_ONEVALUE); my_menu_win = newwin(nlines, 70, BEGIN_Y , 1); keypad(my_menu_win, TRUE); set_menu_win(my_menu, my_menu_win); set_menu_format(my_menu, nlines, 1); set_menu_mark(my_menu, " "); post_menu(my_menu); count = item_count(my_menu); if (count > nlines) { mvprintw(BEGIN_Y - 1, 0, "[TOP]"); mvprintw(nlines + BEGIN_Y, 0, "[MORE .. %d]", count - nlines); } else { nlines = count; } for (i = 0; i < nlines; i++) mvaddch(i + BEGIN_Y, 0, cur_state[i]); refresh(); while ((c = wgetch(my_menu_win)) != KEY_F(10)) { switch (c) { case KEY_F(1): UI_help(my_menu); touchwin(my_menu_win); break; case KEY_DOWN: menu_driver(my_menu, REQ_DOWN_ITEM); UI_update_indicator(my_menu_win, my_menu); break; case KEY_UP: menu_driver(my_menu, REQ_UP_ITEM); UI_update_indicator(my_menu_win, my_menu); break; case KEY_PPAGE: menu_driver(my_menu, REQ_SCR_UPAGE); UI_update_indicator(my_menu_win, my_menu); break; case KEY_NPAGE: menu_driver(my_menu, REQ_SCR_DPAGE); UI_update_indicator(my_menu_win, my_menu); break; case ENTER: UI_make_selection(my_menu_win, my_menu); break; case KEY_F(7): UI_commit(my_menu_win, my_menu, ident_list, attn_list); break; case KEY_F(3): clear(); UI_cleanup(my_menu, my_items); startup_window(); return 0; } wrefresh(my_menu_win); } UI_cleanup(my_menu, my_items); return 0; } /* startup_window - Explain the Lightpath instructions and details * * Returns: * 0 on success !0 on error */ static int startup_window(void) { int x, y; int c; int rc, rv; struct loc_code *attn_list = NULL; struct loc_code *ident_list = NULL; char *msg1 = "This program contains service indicator tasks. " "This should be\nused to view and manipulate the" " service indicators (LEDs)."; char *msg2 = "Several keys are used to control the procedures:\n" "- The Enter key continues the procedure or" " performs an action.\n" "- The cursor keys are used to select an option.\n"; initscr(); cbreak(); noecho(); keypad(stdscr, TRUE); signal(SIGWINCH, resize_handler); getmaxyx(stdscr, y, x); if (y < 24 || x < 80) { endwin(); fprintf(stderr, "Light Path Diagnostics requires minimum " "of 24 line by 80 column display.\nCheck " "the window size and try again.\n"); return -1; } rc = get_indicator_list(ATTN_INDICATOR, &attn_list); if (rc) log_msg("Unable to get system attention indicator"); rv = get_indicator_list(IDENT_INDICATOR, &ident_list); if (rv) log_msg("Unable to get identify indicators"); if (rc && rv) { endwin(); fprintf(stderr, "System does not support service indicators\n"); return rc; } mvprintw(0, 0, "SERVICE INDICATORS VERSION %s", VERSION); mvprintw(2, 0, msg1); mvprintw(5, 0, msg2); mvprintw(9, 0, "Press the F3 key to exit or press Enter to continue."); while ((c = getch()) != KEY_F(3)) { if (c == ENTER) { clear(); rc = create_menu(ident_list, attn_list); break; } } free_indicator_list(attn_list); free_indicator_list(ident_list); endwin(); return rc; } /** * print_usage - Print the usage statement */ static void print_usage(const char *cmd) { fprintf(stdout, "Usage:\n" "\t%s [-V] [-h]\n", cmd); fprintf(stdout, "\nOptions:\n"); fprintf(stdout, "\t-V: Print the version of the command\n"); fprintf(stdout, "\t-h: Print this message\n"); } /* lp_diag command line arguments */ #define LP_DIAG_ARGS "e:r:hV" /* Options to be passed to getopt_long function */ static struct option longopts[] = { {"event", required_argument, NULL, 'e'}, {"repair", required_argument, NULL, 'r'}, {"help", no_argument, NULL, 'h'}, {"version", no_argument, NULL, 'V'}, {0, 0, 0, 0} }; /** * main - */ int main(int argc, char *argv[]) { int c; int rc = 0; int event_flag = 0; int repair_flag = 0; int event_id = 0; int repair_id = 0; int platform = 0; char *next_char; platform = get_platform(); if (platform != PLATFORM_PSERIES_LPAR) { fprintf(stderr, "%s is not supported on the %s platform\n", argv[0], __power_platform_name(platform)); return 1; } opterr = 0; while ((c = getopt_long(argc, argv, LP_DIAG_ARGS, longopts, NULL)) != EOF) { switch (c) { case 'e': event_flag = 1; event_id = (int)strtoul(optarg, &next_char, 10); if (optarg[0] == '\0' || *next_char != '\0' || event_id <= 0) { print_usage(argv[0]); exit(1); } break; case 'r': repair_flag = 1; repair_id = (int)strtoul(optarg, &next_char, 10); if (optarg[0] == '\0' || *next_char != '\0' || repair_id <= 0) { print_usage(argv[0]); exit(1); } break; case 'V': fprintf(stdout, "%s %s\n", argv[0], VERSION); fflush(stdout); exit(0); case 'h': print_usage(argv[0]); exit(0); case '?': default: print_usage(argv[0]); exit(1); } } if (geteuid() != 0) { dbg("%s: Requires superuser privileges.", argv[0]); exit(1); } if (optind < argc) { dbg("Unrecognized argument : %s", argv[optind]); print_usage(argv[0]); exit(1); } if (event_flag && repair_flag) { dbg("The -e and -r options cannot be used together\n"); print_usage(argv[0]); exit(1); } /* initialize */ program_name = argv[0]; rc = init_files(); if (rc) goto cleanup; /* Light Path operating mode */ rc = check_operating_mode(); if (rc) goto cleanup; if (argc < 2) { log_msg("Starting LPD UI"); rc = startup_window(); } if (event_flag) { log_msg("Service event analysis"); rc = parse_service_event(event_id); } if (repair_flag) { log_msg("Repair event analysis"); rc = parse_repair_event(repair_id); } cleanup: log_msg("%s exiting", program_name); close_files(); exit(rc); } ppc64-diag-2.6.4/lpd/scripts/0000755000000000000000000000000012313010662014317 5ustar rootrootppc64-diag-2.6.4/lpd/scripts/lp_diag_setup0000755000000000000000000000570412313010662017072 0ustar rootroot#!/usr/bin/perl -I /etc/ppc64-diag # @file lp_diag_setup # @brief Register/unregister Light Path notification tools # with servicelog # # Copyright (C) 2012 IBM Corporation # See 'COPYRIGHT' for License of this code. # # @author Vasant Hegde use Getopt::Long; sub usage { print "$0 {--register | --unregister} [--verbose]\n"; print " --register: register notification tools with servicelog\n"; print " --unregister: unregister servicelog notification tools\n"; print " --verbose: display verbose output\n"; } sub run_cmd { my $cmd = @_[0]; $redirect = " >/dev/null 2>&1"; if ($flag_verbose) { $redirect = ""; print " *** Running: $cmd\n"; } system("$cmd$redirect"); my $exit_status = $? >> 8; if ($flag_verbose) { print " *** Exit Status: $exit_status\n"; } return $exit_status; } sub servicelog_id { my $cmd = @_[0]; # read the servicelog_notify output for the Servicelog ID @sl_out = `/usr/bin/servicelog_notify --list --command=\"$cmd\"`; foreach $line (@sl_out) { chomp($line); $pos = index($line, "Servicelog ID:"); if ($pos >= 0) { $sl_id = substr($line, 14); # trim leading whitespace $sl_id =~ s/^\s+//; return $sl_id; } } return "?"; } sub register { my $cmd = @_[0]->[0]; my $sl_args = @_[0]->[1]; my $rc; $rc = run_cmd("/usr/bin/servicelog_notify --list --command=\"$cmd\""); if ($rc == 1) { # command not currently registered; register it now $rc = run_cmd("/usr/bin/servicelog_notify --add ". "--command=\"$cmd\" $sl_args"); } } sub unregister { my $cmd = @_[0]->[0]; my $sl_args = @_[0]->[1]; my $rc; $rc = run_cmd("/usr/bin/servicelog_notify --remove ". "--command=\"$cmd\""); } @notification_tools = ( ["/etc/ppc64-diag/lp_diag_notify -e", "--match='disposition>=1 and severity>=4 and serviceable=1' ". "--type=EVENT --method=num_arg"], ["/etc/ppc64-diag/lp_diag_notify -r", "--type=REPAIR --method=num_arg"], ); Getopt::Long::Configure("bundling"); GetOptions("register|r"=>\$flag_register, "unregister|u"=>\$flag_unregister, "help|h"=>\$flag_help, "verbose|v"=>\$flag_verbose, "<>"=>\&bad_arg) or usage(), exit(1); if ($flag_help) { usage(); exit (0); } if ($flag_register and $flag_unregister) { print "Only one of --register and --unregister should be specified.\n"; usage(); exit (1); } if (!$flag_register and !$flag_unregister) { print "One of --register or --unregister must be specified.\n"; usage(); exit (1); } my $count = 0; if ($flag_register) { foreach $tool (@notification_tools) { register($tool); $count++; } print "Registered $count tools with servicelog:\n\n"; foreach $tool (@notification_tools) { system("/usr/bin/servicelog_notify --list ". "--command=\"".$tool->[0]."\""); print "\n"; } } if ($flag_unregister) { foreach $tool (@notification_tools) { unregister($tool); $count++; } print "Unregistered $count notification tools from servicelog.\n"; } exit (0); ppc64-diag-2.6.4/lpd/scripts/Makefile0000644000000000000000000000042112313010662015754 0ustar rootroot# # Makefile for lpd/scripts # include ../../rules.mk SCRIPTS = lp_diag_setup lp_diag_notify all: $(SCRIPTS) install: all @$(call install_files,$(SCRIPTS),744,$(DESTDIR)/etc/ppc64-diag) uninstall: @$(call uninstall_files,$(SCRIPTS),$(DESTDIR)/etc/ppc64-diag) clean: ppc64-diag-2.6.4/lpd/scripts/lp_diag_notify0000755000000000000000000000225512313010662017240 0ustar rootroot#!/usr/bin/perl -I /etc/ppc64-diag # @file lp_diag_notify # # This script is to be registered with servicelog as a notification tool. # It calls Light Path Diagnostics (lp_diag) tool for error analysis and # enabling/disabling fault LED's. # # Copyright (C) 2012 IBM Corporation # See 'COPYRIGHT' for License of this code. # # @author Vasant Hegde use Getopt::Long; sub usage { print "$0 {[--event|e ] | [--repair|r ]}\n"; print " --event |e: Service event ID\n"; print " --repair|r: Repair event ID\n"; } my $id = 0; my $command = "/usr/sbin/lp_diag"; Getopt::Long::Configure("bundling"); GetOptions("event|e=i" =>\$event, "repair|r=i" =>\$repair, "help|h"=>\$flag_help) or usage(), exit(1); if ($flag_help) { usage(); exit(0); } if ($event && $repair) { print "The options -e and -r cannot be used together.\n"; usage(); exit(1); } if (!$event && !$repair) { print "One of -e or -r must be specified.\n"; usage(); exit(1); } if ($event) { $command .= " -e $event"; } elsif ($repair) { $command .= " -r $repair"; } else { usage(); exit(1); } #print("command =", $command); system("$command\n"); exit (0); ppc64-diag-2.6.4/lpd/lp_util.c0000644000000000000000000000662612313010662014456 0ustar rootroot/** * @file lp_util.c * @brief Light Path utility * * Copyright (C) 2012 IBM Corporation * See 'COPYRIGHT' for License of this code. * * @author Vasant Hegde */ #include #include #include #include #include #include #include #include "lp_diag.h" /** * fgets_nonl - Read a line and strip the newline. */ char * fgets_nonl(char *buf, int size, FILE *s) { char *nl; if (!fgets(buf, size, s)) return NULL; nl = strchr(buf, '\n'); if (nl == NULL) return NULL; *nl = '\0'; return buf; } /** * skip_space - */ static char * skip_space(const char *pos) { pos = strchr(pos, ' '); if (!pos) return NULL; while (*pos == ' ') pos++; return (char *)pos; } /** * read_vpd_from_lsvpd - Retrieve vpd data * * Returns : * 0 on success, !0 on failure */ int read_vpd_from_lsvpd(struct dev_vpd *vpd, const char *device) { char buf[128]; char *pos; FILE *fp; /* use lsvpd to find the device vpd */ snprintf(buf, 128, "lsvpd -l %s 2>/dev/null", device); fp = popen(buf, "r"); if (fp == NULL) { log_msg("Unable to retrieve the vpd for \"%s\". " "Ensure that lsvpd package is installed.", device); return -1; } while (fgets_nonl(buf, 128, fp) != NULL) { if ((pos = strstr(buf, "*TM")) != NULL) { if (!(pos = skip_space(pos))) continue; strncpy(vpd->mtm, pos, VPD_LENGTH); } else if ((pos = strstr(buf, "*YL")) != NULL) { if (!(pos = skip_space(pos))) continue; strncpy(vpd->location, pos, LOCATION_LENGTH); } else if ((pos = strstr(buf, "*DS")) != NULL) { if (!(pos = skip_space(pos))) continue; strncpy(vpd->ds, pos, VPD_LENGTH); } else if ((pos = strstr(buf, "*SN")) != NULL) { if (!(pos = skip_space(pos))) continue; strncpy(vpd->sn, pos, VPD_LENGTH); } else if ((pos = strstr(buf, "PN")) != NULL) { if (!(pos = skip_space(pos))) continue; strncpy(vpd->pn, pos, VPD_LENGTH); } else if ((pos = strstr(buf, "*FN")) != NULL) { if (!(pos = skip_space(pos))) continue; strncpy(vpd->fru, pos, VPD_LENGTH); } } pclose(fp); return 0; } /** * free_device_vpd - free vpd structure */ void free_device_vpd(struct dev_vpd *vpd) { struct dev_vpd *tmp; while (vpd) { tmp = vpd; vpd = vpd->next; free(tmp); } } /** * read_device_vpd - * * @path /sys path * * Returns : * vpd structure on success / NULL on failure */ struct dev_vpd * read_device_vpd(const char *path) { DIR *dir; struct dirent *dirent; struct dev_vpd *vpd = NULL; struct dev_vpd *curr = NULL; dir = opendir(path); if (!dir) { if (errno != ENOENT) log_msg("Unable to open directory : %s", path); return NULL; } while ((dirent = readdir(dir)) != NULL) { if (!strcmp(dirent->d_name, ".") || !strcmp(dirent->d_name, "..")) continue; if (!curr) { curr = (struct dev_vpd *)malloc(sizeof (struct dev_vpd)); vpd = curr; } else { curr->next = (struct dev_vpd *)malloc(sizeof (struct dev_vpd)); curr = curr->next; } if (!curr) { log_msg("Out of memory"); free_device_vpd(vpd); closedir(dir); return NULL; } /* zero out the vpd structure */ memset(curr, 0, sizeof(struct dev_vpd)); /* device name */ strncpy(curr->dev, dirent->d_name, DEV_LENGTH); if (read_vpd_from_lsvpd(curr, dirent->d_name)) { free_device_vpd(vpd); closedir(dir); return NULL; } } closedir(dir); return vpd; } ppc64-diag-2.6.4/lpd/files.c0000644000000000000000000001576112313010662014110 0ustar rootroot/** * @file files.c * @brief File manipulation routines * * Copyright (C) 2012 IBM Corporation * See 'COPYRIGHT' for License of this code. * * @author Vasant Hegde */ #include #include #include #include #include #include #include #include #include #include #include "lp_diag.h" /* Program name */ char *program_name; /* Indicator event log file/descriptor */ char *lp_event_log_file = "/var/log/indicators"; int lp_event_log_fd = -1; /* Log file/descriptor */ char *lp_error_log_file = "/var/log/lp_diag.log"; int lp_error_log_fd = -1; /** * reformat_msg - Re-format a log message to wrap at 80 characters * * In order to ease the formatting of messages in the lp_diag this * will automatically format the messages to wrap at 80 characters. * * @msg buffer containing the message to re-format * @size message size * * Returns : * new buffer length */ static int reformat_msg(char *msg, int size) { char buf[LP_ERROR_LOG_MAX]; char *pos; char *next; char temp; char temp2; int len = strlen(msg); if (len > LP_ERROR_LOG_MAX) /* Insufficient temporary buffer size */ return len; if (len > (size - size / 80 + 1)) /* Worst case target size */ return len; if (len < 80) { /* no need to reformat */ msg[len++] = '\n'; return len; } memset(buf, 0, LP_ERROR_LOG_MAX); /* first copy the msg into our buffer */ memcpy(buf, msg, len); /* zero out the old buffer */ msg[0] = '\0'; pos = buf; while (strlen(pos) > 80) { next = pos + 80; do { if (*next == ' ') *next = '\n'; if (*next == '\n') { temp = *(next + 1); *(next + 1) = '\0'; strcat(msg, pos); *(next + 1) = temp; pos = next + 1; break; } next--; } while (next > pos); if (next == pos) { /* word is longer than line length */ next = pos + 79; temp = *next; temp2 = *(next + 1); *next = '\n'; *(next + 1) = '\0'; strcat(msg, pos); *next = temp; *(next + 1) = temp2; pos = next; } } /* while loop end */ strcat(msg, pos); len = strlen(msg); msg[len++] = '\n'; return len; } /** * insert_time - Insert current date and time */ static int insert_time(char *buf, int size) { int len; time_t cal; cal = time(NULL); len = snprintf(buf, size, "%s", ctime(&cal)); len--; /* remove new line character */ return len; } /** * _dbg - Write debug messages to stdout * * Provide utility to print debug statements if the debug flag * is specified. * * @fmt format string to printf() * @... additional argument */ void _dbg(const char *fmt, ...) { #ifdef LPD_DEBUG int len = 0; char buf[LP_ERROR_LOG_MAX]; va_list ap; va_start(ap, fmt); len = snprintf(buf, LP_ERROR_LOG_MAX, "DEBUG: "); len += vsnprintf(buf + len, LP_ERROR_LOG_MAX - len, fmt, ap); if (len < 0 || len >= LP_ERROR_LOG_MAX) return; /* Insufficient buffer size */ va_end(ap); fprintf(stdout, buf); fprintf(stdout, "\n"); fflush(stdout); #endif } /** * log_msg - Write log message into lp_diag log file * * @fmt format string to printf() * @... additional argument */ void log_msg(const char *fmt, ...) { int rc; int len = 0; char buf[LP_ERROR_LOG_MAX]; va_list ap; #ifndef LPD_DEBUG /* In order to make testing easier we will not print time in * debug version of lp_diag. */ len = insert_time(buf, LP_ERROR_LOG_MAX); len += snprintf(buf + len, LP_ERROR_LOG_MAX - len, ": "); #endif /* Add the actual message */ va_start(ap, fmt); len += vsnprintf(buf + len, LP_ERROR_LOG_MAX - len, fmt, ap); if (len < 0 || len >= LP_ERROR_LOG_MAX) { dbg("Insufficient buffer size"); return; } va_end(ap); /* Add ending punctuation */ len += snprintf(buf + len, LP_ERROR_LOG_MAX - len, "."); if (lp_error_log_fd == -1) { dbg("Log file \"%s\" is not available", lp_error_log_file); _dbg(buf); return; } _dbg(buf); /* reformat the new message */ len = reformat_msg(buf, LP_ERROR_LOG_MAX); rc = write(lp_error_log_fd, buf, len); if (rc == -1) dbg("Write to log file \"%s\" failed", lp_error_log_file); } /** * indicator_log_write - write indicate events to log file * * @fmt format string to printf() * @... additional argument to printf() * * Returns : * return code from write() call */ int indicator_log_write(const char *fmt, ...) { int len; int rc = 0; char buf[LP_ERROR_LOG_MAX]; va_list ap; if (lp_event_log_fd == -1) { log_msg("Indicator event log file \"%s\" is not available", lp_event_log_file); return -1; } /* Add time */ len = insert_time(buf, LP_ERROR_LOG_MAX); len += snprintf(buf + len, LP_ERROR_LOG_MAX - len, ": %s : ", program_name); va_start(ap, fmt); len += vsnprintf(buf + len, LP_ERROR_LOG_MAX - len, fmt, ap); if (len < 0 || len >= LP_ERROR_LOG_MAX) { log_msg("Insufficient buffer size"); return -1; } va_end(ap); /* Add ending punctuation */ len += snprintf(buf + len, LP_ERROR_LOG_MAX - len, "\n"); rc = write(lp_event_log_fd, buf, len); if (rc == -1) log_msg("Write to indicator event log file \"%s\" failed", lp_event_log_file); return rc; } /** * rotate_log_file - Check log file size and rotate if required. * * @lp_log_file log file name * * Returns : * nothing */ static void rotate_log_file(const char *lp_log_file) { int rc; char cmd_buf[128]; char lp_log_file0[64]; struct stat sbuf; rc = stat(lp_log_file, &sbuf); if (rc == -1) { dbg("Cannot stat log file to rotate logs"); return; } if (sbuf.st_size > LP_ERRD_LOGSZ) { _dbg("Rotating log file : %s", lp_log_file); snprintf(lp_log_file0, sizeof(lp_log_file0), "%s0", lp_log_file); snprintf(cmd_buf, sizeof(cmd_buf), "rm -f %s; mv %s %s", lp_log_file0, lp_log_file, lp_log_file0); rc = system(cmd_buf); if (rc == -1) { dbg("An error occured during the rotation of log " "file:\n cmd = %s", cmd_buf); _dbg("Exit status : %d", WEXITSTATUS(rc)); } } } /** * init_files - Open log files * * Returns : * 0 on sucess, !0 on failure */ int init_files(void) { int rc = 0; /* lp_diag log file */ if (lp_error_log_fd != 1) { /* 1 = stdout */ rotate_log_file(lp_error_log_file); lp_error_log_fd = open(lp_error_log_file, O_RDWR | O_CREAT | O_APPEND, S_IRUSR | S_IWUSR | S_IRGRP); if (lp_error_log_fd == -1) dbg("Could not open log file \"%s\"", lp_error_log_file); } /* open event log file */ lp_event_log_fd = open(lp_event_log_file, O_RDWR | O_CREAT | O_APPEND, S_IRUSR | S_IWUSR | S_IRGRP); if (lp_event_log_fd == -1) { log_msg("Could not open indicator event log file \"%s\"", lp_event_log_file); return -1; } return rc; } /** * close_files - Close all the files used by lp_diag * * Perform any file cleanup (i.e. close()) and possibly free()'ing * buffers needed by log_diag before exiting. * * Returns : * nothing */ void close_files(void) { if (lp_error_log_fd > 1) /* don't close stdout */ close(lp_error_log_fd); if (lp_event_log_fd != -1) close(lp_event_log_fd); } ppc64-diag-2.6.4/lpd/test/0000755000000000000000000000000012313010662013607 5ustar rootrootppc64-diag-2.6.4/lpd/test/lpd_ela_test.sh0000755000000000000000000002021612313010662016606 0ustar rootroot#!/bin/bash ################################################################################ # Light Path Diagnostics Test cases # # Note: # - This script wipes out servicelog database and deletes some of # important log files. *Do not* run this script on production # environment. # # USAGE: ./lpd_ela_test.sh # # Author Vasant Hegde # ################################################################################ TEST_GROUP="Power Diagnostics" TEST_SCENARIO="Light Path Diagnostics" # Takes the name of the script before the "." and composes log filenames SCRIPT_NAME=$(basename "$0" | cut -f 1 -d ".") LOG_DIR=`pwd` EXECUTION_LOG="$LOG_DIR/$SCRIPT_NAME.log" ERROR_LOG="$LOG_DIR/$SCRIPT_NAME.err" TMP_DIR="/var/tmp/ras" mkdir -p $TMP_DIR MESSAGE_FILE="$TMP_DIR/messages" TMP_FILE="$TMP_DIR/$SCRIPT_NAME.tmp" # Initializing the variable that will determine PASS or FAILURE for the script IS_FAILED=0 ################################################################################ # init_logs () # Purpose : Clean up old logs and start the new execution ones # Parametrs : None # Returns : 0 ################################################################################ init_logs () { # mkdir -p $LOG_DIR rm -f $EXECUTION_LOG $ERROR_LOG touch $EXECUTION_LOG $ERROR_LOG return 0 } ################################################################################ # print_log () # Purpose : Takes the first argument, prints to stdout and to the script # log # Parameters : None # Returns : 0 ################################################################################ print_log () { echo $1 | tee -a $EXECUTION_LOG return 0 } ################################################################################ # exec_log () # Purpose : Executes the command passed as the first argument, prints to # stdout and to the script log # Parameters : String with the command you want to execute, log and check # exit code # Returns : Same of the command passed as a parameter ################################################################################ exec_log () { print_log "Output of the command $1:" eval $1 1>&2 >$TMP_FILE EXIT_CODE=$? cat $TMP_FILE | tee -a $EXECUTION_LOG rm -f $TMP_FILE if [ $EXIT_CODE != 0 ]; then print_log "ERROR: Command $1 ended abnormally with exit code $EXIT_CODE." print_log "Please verify." | tee -a $ERROR_LOG IS_FAILED=1 fi return $EXIT_CODE } ################################################################################ # clean_servicelog () # Purpose : Truncate the servicelog database, and below files # /var/log/platform # /var/spool/mail/root # /var/log/lp_diag.log # /var/log/indicators # Parameters : None # Returns : The exit code of the servicelog command ################################################################################ clean_servicelog () { exec_log "servicelog_manage --truncate events --force" SLOG_EXIT=$? truncate -s 0 /var/log/platform truncate -s 0 /var/spool/mail/root truncate -s 0 /var/log/lp_diag.log truncate -s 0 /var/log/indicators return $SLOG_EXIT } ################################################################################ # print_log_header () # Purpose : Initializes the execution log truncating it # (tee without -a flag) # Parameters : None # Returns : 0 ################################################################################ print_log_header () { cat << TEXT | tee $EXECUTION_LOG $(date +'%d/%m/%y %H:%M') ******************************************************************************** * PowerLinux RAS Testcase * $TEST_GROUP * $TEST_SCENARIO ******************************************************************************** TEXT return 0 } ################################################################################ # print_log_footer () # Purpose : Checks whether the testcase ended successfuly and prints # its status # Parameters : None # Returns : 0 ################################################################################ print_log_footer () { if [ $IS_FAILED = 0 ]; then TEST_STATUS='PASS' else TEST_STATUS='FAILED' print_log "Showing testcase errors:" exec_log "cat $ERROR_LOG" fi cat << TEXT | tee -a $EXECUTION_LOG ******************************************************************************** * PowerLinux RAS Testcase * $TEST_GROUP * $TEST_SCENARIO * Test status: $TEST_STATUS ******************************************************************************** $(date +'%d/%m/%y %H:%M') TEXT return 0 } ################################################################################ # validate_lpd_tool () # Purpose : Check Light Path command and registeration scripts # Parameters : None # Returns : 0 ################################################################################ validate_lpd_tool () { if [ ! -x /usr/sbin/lp_diag ] then print_log "lp_diag command does not exist. " print_log "Install ppc64-diag package\n" IS_FAILED=1 fi event=`servicelog_notify -l |grep "lp_diag_notify \-e"` if [ "$event" == "" ] then print_log "Service event notification script is not registered\n" IS_FAILED=1 fi event=`servicelog_notify -l |grep "lp_diag_notify \-r"` if [ "$event" == "" ] then print_log "Repair event notification script is not registered\n" IS_FAILED=1 fi } ################################################################################ # check_fault_indicator () # Purpose : Check fault indicator status # Parameters : ON/OFF # Returns : 0 ################################################################################ check_fault_indicator () { location=`servicelog --dump |grep "Location" | awk 'BEGIN{FS=":";}{print $2}'` location=`echo $location | sed 's/ *$//g'` if [ "$location" == "" ] then print_log "Empty location code in service event" location=`usysattn | head -1 | awk '{print $1}'` fi state=`echo $1 | awk '{print tolower($0)}'` led=`usysattn -l $location -t | tail -1` if [ "$led" != "$state" ] then print_log "Unable to modify fault indicator" IS_FAILED=1 return fi indicator=`grep "$1" /var/log/indicators | awk 'BEGIN{FS=":";}{print $5}'` print_log "$indicator = $led" } ################################################################################ # close_service_event () # Purpose : Close serviceable event # Parameters : None # Returns : 0 ################################################################################ close_service_event () { procedure=`servicelog --dump |grep "Procedure Id" | awk 'BEGIN{FS=":";}{print $2}'` procedure=`echo $procedure | sed 's/ *$//g'` location=`servicelog --dump |grep "Location" | awk 'BEGIN{FS=":";}{print $2}'` location=`echo $location | sed 's/ *$//g'` exec_log "log_repair_action -q -l \"$location\" -p \"$procedure\"" } # Validate input file if [ "$1" != "" ] then if [ -e $1 ] then INPUT_FILE=$1 fi fi if [ "$INPUT_FILE" == "" ] then echo "Usage : $0 " exit 1 fi # Initializing test case logs init_logs # Printing log header print_log_header print_log "1 - Checking lpd tools" validate_lpd_tool print_log "2 - Creating messages file" cp $INPUT_FILE $MESSAGE_FILE print_log "3 - Running explain_syslog" exec_log "explain_syslog -m $MESSAGE_FILE" MESSAGE=$(explain_syslog -m $MESSAGE_FILE | grep "unrecognized message" ) if [ "$MESSAGE" = "" ]; then print_log "explain_syslog successfull" else print_log "ERROR: explain_syslog does not explain the message" | tee -a $ERROR_LOG IS_FAILED=1 fi print_log "4 - Clearing servicelog events" clean_servicelog print_log "5 - Running syslog_to_svclog - Injecting serviceable event" exec_log "syslog_to_svclog -m $MESSAGE_FILE" print_log "6 - Checking events in servicelog" exec_log "servicelog --dump" sleep 2 # Wait for lp_diag to close log file print_log "7 - Checking fault indicator status" check_fault_indicator "ON" print_log "8 - Close service event" close_service_event sleep 2 # Wait for lp_diag to close log file print_log "9 - Checking fault indicator status" check_fault_indicator "OFF" print_log_footer exit $IS_FAILED ppc64-diag-2.6.4/lpd/test/ledtool.c0000644000000000000000000000512312313010662015416 0ustar rootroot/** * @file ledtool.c * @brief Light Path Diagnostics testing tool * * Copyright (C) 2012 IBM Corporation * See 'COPYRIGHT' for License of this code. * * @author Vasant Hegde */ #include #include #include #include "lp_diag.h" /** * enable_fault_indicator - Enable fault indicator for the given loc code */ int enable_fault_indicator(char *loccode) { int rc = 0; int truncated = 0; struct loc_code *list = NULL; struct loc_code *loc_led = NULL; rc = get_indicator_list(ATTN_INDICATOR, &list); if (!list) return -1; if (loccode == NULL) { /* attn indicator */ loc_led = &list[0]; } else { retry: loc_led = get_indicator_for_loc_code(list, loccode); if (!loc_led) { if (truncate_loc_code(loccode)) { truncated = 1; goto retry; } fprintf(stderr, "There is no fault indicator at " "location code %s\n", loccode); free_indicator_list(list); return 0; } } if (truncated) fprintf(stderr, "Truncated location code = %s\n", loccode); rc = set_indicator_state(ATTN_INDICATOR, loc_led, 1); if (rc == 0) { if (loccode == NULL) indicator_log_write("System Attention Indicator : ON"); else indicator_log_write("%s : Fault : ON", loc_led->code); fprintf(stderr, "%s : \[on]\n", loc_led->code); } else fprintf(stderr, "Unable to enable fault indicator\n"); free_indicator_list(list); return rc; } void print_usage(char *progname) { fprintf(stdout, "Enable system attention/fault indicators.\n" "\nUsage : %s -f []\n" "\t-f : Fault indicator\n" "\t-h : Print this usage message and exit\n" "\n\tloc_code : Indicator location code\n", progname); } /* ledtool command line arguments */ #define LED_TOOL_ARGS "fh" /* main */ int main(int argc, char **argv) { int rc = 0; int c; int fault = 0; char *loccode = NULL; opterr = 0; while ((c = getopt(argc, argv, LED_TOOL_ARGS)) != -1 ) { switch (c) { case 'f': fault = 1; break; case 'h': print_usage(argv[0]); exit(0); default: print_usage(argv[0]); exit(1); } } if (optind < argc) loccode = argv[optind++]; if (optind < argc) { print_usage(argv[0]); exit(1); } if (!fault) { print_usage(argv[0]); exit(1); } program_name = argv[0]; lp_error_log_fd = 1; /* log message to stdout */ rc = init_files(); if (rc) { fprintf(stderr, "Unable to open log file.\n"); exit (1); } /* Light Path operating mode */ if (check_operating_mode() != 0) { close_files(); exit(1); } /* enable fault indicator */ rc = enable_fault_indicator(loccode); close_files(); exit(rc); } ppc64-diag-2.6.4/lpd/test/e1000e_message0000644000000000000000000000010712313010662016126 0ustar rootrootSep 21 09:42:10 eagle3 kernel: e1000e 0001:00:01.0: RX DMA map failed ppc64-diag-2.6.4/lpd/test/e1000e_message20000644000000000000000000000010712313010662016210 0ustar rootrootSep 21 09:42:10 eagle3 kernel: e1000e 0000:00:01.0: RX DMA map failed ppc64-diag-2.6.4/lpd/test/Makefile0000644000000000000000000000161012313010662015245 0ustar rootroot# # Makefile for lp/test # .SILENT: include ../../rules.mk CMDS = ledtool sesdevices INCLUDE = -I.. CFLAGS = -g -DDEBUG $(INCLUDE) AM_CFLAGS = -DVERSION='"$(VERSION)"' LPD_DIR = $(ROOT_DIR)/lpd COMMON_OBJS = ../files.o ../lp_util.o ../indicator_ses.o \ ../indicator_rtas.o ../indicator.o ../servicelog.o LED_TOOL_OBJS = ledtool.o SES_TOOL_OBJS = sesdevices.o LED_TOOL_LIBS = -lrtas -lrtasevent -lservicelog -lsqlite3 LICENSE = COPYRIGHT all: $(CMDS) ledtool: $(LED_TOOL_OBJS) @echo "LD $(WORK_DIR)/$@" $(CC) $(CFLAGS) $(COMMON_OBJS) -o $@ $^ $(LED_TOOL_LIBS) sesdevices: $(SES_TOOL_OBJS) @echo "LD $(WORK_DIR)/$@" $(CC) $(CFLAGS) $(COMMON_OBJS) -o $@ $^ $(LED_TOOL_LIBS) install: all @$(call install_sbin,$(CMDS),$(DESTDIR)) uninstall: @$(call uninstall_sbin,$(CMDS),$(DESTDIR)) clean: @echo "Cleaning up lpd test files..." @rm -rf $(SES_TOOL_OBJS) $(LED_TOOL_OBJS) $(CMDS) ppc64-diag-2.6.4/lpd/test/sesdevices.c0000644000000000000000000000423612313010662016115 0ustar rootroot/** * @file sesdevices.c * @brief List all Light Path Daignostics supported SES enclosures * * Copyright (C) 2012 IBM Corporation * See 'COPYRIGHT' for License of this code. * * @author Vasant Hegde */ #include #include #include #include #include #include "lp_diag.h" #include "lp_util.h" /* SES sys path */ #define SCSI_SES_PATH "/sys/class/enclosure" /* List of all Light Path supported enclosures */ static struct { char *mtm; } supported_enclosure[] = { {"5888"}, /* Bluehawk */ {"EDR1"}, /* Bluehawk */ {NULL} }; /* trim ESM/ERM part */ static void trim_location_code(struct dev_vpd *vpd) { char *hyphen; hyphen = strchr(vpd->location, '-'); if (hyphen && (!strcmp(hyphen, "-P1-C1") || !strcmp(hyphen, "-P1-C2"))) *hyphen = '\0'; } int main() { int i; int count = 0; char path[128]; DIR *dir; struct dirent *dirent; struct dev_vpd *vpd = NULL; struct dev_vpd *v1; vpd = read_device_vpd(SCSI_SES_PATH); if (!vpd) return 0; for (v1 = vpd; v1; v1 = v1->next) { /* remove ESM/ERM part of location code */ trim_location_code(v1); /* read sg name */ snprintf(path, 128, "%s/%s/device/scsi_generic", SCSI_SES_PATH, v1->dev); dir = opendir(path); if (!dir) { fprintf(stderr, "Unable to open directory : %s\n", path); continue; } /* fill sg device name */ while ((dirent = readdir(dir)) != NULL) { if (!strcmp(dirent->d_name, ".") || !strcmp(dirent->d_name, "..")) continue; strncpy(v1->dev, dirent->d_name, DEV_LENGTH); } closedir(dir); } for (v1 = vpd; v1; v1 = v1->next) for (i = 0; supported_enclosure[i].mtm; i++) if (!strcmp(v1->mtm, supported_enclosure[i].mtm)) { count++; fprintf(stdout, "\n"); fprintf(stdout, "SCSI Device : %s\n", v1->dev); fprintf(stdout, "Model : %s\n", v1->mtm); fprintf(stdout, "Location Code : %s\n", v1->location); fprintf(stdout, "Serial Number : %s\n", v1->sn); } if (count == 0) fprintf(stderr, "System does not have Light Path supported " "SES enclosure(s).\n"); free_device_vpd(vpd); return 0; } ppc64-diag-2.6.4/lpd/indicator_ses.c0000644000000000000000000002140212313010662015621 0ustar rootroot/** * @file indicator_ses.c * @brief SES indicator manipulation routines * * Copyright (C) 2012 IBM Corporation * See 'COPYRIGHT' for License of this code. * * @author Vasant Hegde */ #include #include #include #include #include #include "lp_diag.h" #include "lp_util.h" /* SES LED command name */ #define SCSI_INDICATOR_CMD "/usr/sbin/encl_led" /* SES sys path */ #define SCSI_SES_PATH "/sys/class/enclosure" /* * Some versions of iprconfig/lscfg report the location code of the ESM/ERM * -- e.g., UEDR1.001.G12W34S-P1-C1. For our purposes, we usually don't want * the -P1-C1. (Don't trim location codes for disks and such.) * * TODO: This adjustment is appropriate for Bluehawks. Need to understand * what, if anything, needs to be done for other (e.g. Pearl) enclosures. */ static void trim_location_code(struct dev_vpd *vpd) { char *hyphen; hyphen = strchr(vpd->location, '-'); if (hyphen && (!strcmp(hyphen, "-P1-C1") || !strcmp(hyphen, "-P1-C2"))) *hyphen = '\0'; } /** * read_ses_vpd - Read SES device vpd data * * Returns : * vpd structure on success, NULL on failure */ static struct dev_vpd * read_ses_vpd(void) { char path[128]; DIR *dir; struct dirent *dirent; struct dev_vpd *vpd = NULL; struct dev_vpd *v1; /* get enclosure vpd data */ vpd = read_device_vpd(SCSI_SES_PATH); if (!vpd) return NULL; for (v1 = vpd; v1; v1 = v1->next) { /* remove ESM/ERM part of location code */ trim_location_code(v1); /* read sg name */ snprintf(path, 128, "%s/%s/device/scsi_generic", SCSI_SES_PATH, v1->dev); dir = opendir(path); if (!dir) { log_msg("Unable to open directory : %s", path); continue; } /* fill sg device name */ while ((dirent = readdir(dir)) != NULL) { if (!strcmp(dirent->d_name, ".") || !strcmp(dirent->d_name, "..")) continue; strncpy(v1->dev, dirent->d_name, DEV_LENGTH); } closedir(dir); } return vpd; } /** * Helper functions to parse encl_led command output SES LED's. * * Ex : * Listing the particular enclosure indicator list: * encl_led -v -l sgN [component] : * fault ident location description * off off P1-E1 left power supply * off off P1-E2 right power supply * * Modify fault/identify indicator. * encl_led -{i|f} {on|off} sgN [component] */ /** * get_relative_fru_location - split location code * * Get FRU location code relative to the enclosure location code. * Ex : If an enclosure has location code U5888.001.G123789, and one * of its diks has a full location code U5888.001.G123789-P1-D1, * then relatvie FRU location code would be P1-D1. * */ static char * get_relative_fru_location(const char *loccode) { char *fru_loc; fru_loc = strchr(loccode, '-'); if (!fru_loc) return NULL; fru_loc++; /* skip - */ return fru_loc; } /** * get_ses_fru_desc - Parse SES FRU description * * Returns : * FRU description on success, NULL on failure */ static char * get_ses_fru_desc(char *buf) { if (!buf) return NULL; while (*buf == ' ') buf++; return buf; } /** * get_ses_fru_location - Parse SES FRU location * * Returns : * Relative FRU location code on success, NULL on failure */ static char * get_ses_fru_location(char *buf) { char *fru; char *space; fru = strchr(buf, 'P'); if (!fru) { fru = strchr(buf, '-'); /* Enclosure location code */ if (!fru) return NULL; } space = strchr(fru, ' '); if (!space) return NULL; *space = '\0'; return fru; } /** * get_ses_fru_identify_state - Get FRU identify indicator state * * Returns : * Indicator state on success, -1 on failure */ static int get_ses_fru_identify_state(const char *buf) { char *fault; char *ident; fault = strchr(buf, 'o'); if (!fault) return -1; fault++; ident = strchr(fault, 'o'); if (!ident) return -1; return !strncmp(ident, "on", 2); } /** * get_ses_fru_fault_state - Get FRU fault indicator state * * Returns : * Indicator state on success, -1 on failure */ static int get_ses_fru_fault_state(const char *buf) { char *fault; fault = strchr(buf, 'o'); if (!fault) return -1; return !strncmp(fault, "on", 2); } /** * ses_indicator_list - Build SES indicator list for the given enclosure * * @list loc_code structure * @vpd dev_vpd structure * * Returns : * 0 on success, !0 on failure */ static int ses_indicator_list(struct loc_code **list, struct dev_vpd *vpd) { char cmd[128]; char buf[128]; char *desc; char *fru_loc; FILE *fp; struct loc_code *curr = *list; snprintf(cmd, 128, "%s -v -l %s 2> /dev/null", SCSI_INDICATOR_CMD, vpd->dev); fp = popen(cmd, "r"); if (fp == NULL) { log_msg("Unable to get enclosure indicator list. " "Ensure that encl_led command is installed."); return -1; } if (curr) while (curr->next) curr = curr->next; while (fgets_nonl(buf, 128, fp) != NULL) { fru_loc = get_ses_fru_location(buf); if (!fru_loc) continue; /* Advance buffer to parse description field */ desc = get_ses_fru_desc(fru_loc + strlen(fru_loc) + 1); if (!curr) { curr = (struct loc_code *)malloc(sizeof (struct loc_code)); *list = curr; } else { curr->next = (struct loc_code *)malloc(sizeof (struct loc_code)); curr = curr->next; } if (!curr) { log_msg("Out of memory"); /* Read until pipe becomes empty */ while (fgets_nonl(buf, 128, fp) != NULL) ; pclose(fp); return -1; } memset(curr, 0, sizeof(struct loc_code)); /* fill loc_code structure */ strncpy(curr->code, vpd->location, LOCATION_LENGTH); if (strcmp(fru_loc, "-")) { /* Components */ strncat(curr->code, "-", LOCATION_LENGTH - strlen(curr->code) - 1); strncat(curr->code, fru_loc, LOCATION_LENGTH - strlen(curr->code) - 1); } curr->length = strlen(curr->code) + 1; curr->type = TYPE_SES; /* We need to keep track of the sg device. */ strncpy(curr->dev, vpd->dev, DEV_LENGTH); /* lsvpd does not provide vpd data for components like power * supply inside enclosure. Lets keep the display name. */ if (desc) snprintf(curr->ds, VPD_LENGTH, "Enclosure %s : %s", vpd->dev, desc); } pclose(fp); return 0; } /** * get_ses_indices - Get SES indicator list * * @loc loc_code structure * * Returns : * none */ void get_ses_indices(int indicator, struct loc_code **list) { int vpd_matched; struct dev_vpd *vpd; struct dev_vpd *v1; struct dev_vpd *v2; vpd = read_ses_vpd(); if (!vpd) return; /* Some of the enclosures can be represented by multiple sg devices. * Make sure we don't duplicate the location code for such devices. * Ex: A Bluehawk can be represented by 4 different sg devices. */ for (v1 = vpd; v1; v1 = v1->next) { if (!enclosure_supported(v1->mtm)) continue; vpd_matched = 0; for (v2 = v1->next; v2; v2 = v2->next) { if (!enclosure_supported(v2->mtm)) continue; if (!strcmp(v1->location, v2->location)) { vpd_matched = 1; break; } } if (!vpd_matched && v1->location[0] != '\0') if (ses_indicator_list(list, v1)) { free_device_vpd(vpd); return; } } free_device_vpd(vpd); return; } /** * get_ses_indicator - get SES indicator state * * @loc loc_code structure * @state return ses indicator state of given loc * * Returns * 0 on success / -1 on failure */ int get_ses_indicator(int indicator, struct loc_code *loc, int *state) { int fru_found = 0; char cmd[128]; char buf[128]; char *fru_loc; char *fru; FILE *fp; fru_loc = get_relative_fru_location(loc->code); if (!fru_loc) /* Enclosure location code */ fru_loc = "-"; snprintf(cmd, 128, "%s -l %s %s 2> /dev/null", SCSI_INDICATOR_CMD, loc->dev, fru_loc); fp = popen(cmd, "r"); if (fp == NULL) { log_msg("Unable to get enclosure LED status. " "Ensure that encl_led command is installed."); return -1; } while (fgets_nonl(buf, 128, fp) != NULL) { if (fru_found) /* read until pipe becomes empty*/ continue; fru = get_ses_fru_location(buf); if (fru && !strcmp(fru_loc, fru)) { fru_found = 1; if (indicator == IDENT_INDICATOR) *state = get_ses_fru_identify_state(buf); else *state = get_ses_fru_fault_state(buf); } } pclose(fp); if (!fru_found) return -1; return 0; } /** * set_ses_indicator - Set SES indicators * * @loc loc_code structure * @state value to update indicator to * * Returns : * ioctl call return code */ int set_ses_indicator(int indicator, struct loc_code *loc, int new_value) { char cmd[128]; char *fru_loc; fru_loc = get_relative_fru_location(loc->code); if (!fru_loc) /* Enclosure location code */ fru_loc = "-"; if (loc->dev[0] == '\0') return -1; snprintf(cmd, 128, "%s %s %s %s %s 2>&1 > /dev/null", SCSI_INDICATOR_CMD, indicator == IDENT_INDICATOR ? "-i" : "-f", new_value == INDICATOR_ON ? "on" : "off", loc->dev, fru_loc); return system(cmd); } ppc64-diag-2.6.4/lpd/indicator_ses.h0000644000000000000000000000060112313010662015624 0ustar rootroot/** * Copyright (C) 2012 IBM Corporation * See 'COPYRIGHT' for License of this code. */ #ifndef INDICATOR_SES_H #define INDICATOR_SES_H #include "lp_diag.h" /* SES support */ extern void get_ses_indices(int, struct loc_code **); extern int get_ses_indicator(int, struct loc_code *, int *); extern int set_ses_indicator(int, struct loc_code *, int); #endif /* INDICATOR_SES_H */ ppc64-diag-2.6.4/lpd/Makefile0000644000000000000000000000202412313010662014266 0ustar rootroot# # Makefile for lpd # include ../rules.mk CMDS = lp_diag usysident usysattn COMMON_OBJS = files.o lp_util.o indicator_ses.o indicator_rtas.o indicator.o LP_DIAG_OBJS = servicelog.o lp_diag.o USYSIDENT_OBJS = usysident.o COMMON_LIBS = -lrtas -lrtasevent -lservicelog -lsqlite3 LP_DIAG_LIBS = -lncurses -lmenu LICENSE = COPYRIGHT SUBDIRS = scripts man all: $(CMDS) lp_diag: $(LP_DIAG_OBJS) $(COMMON_OBJS) @echo "LD $(WORK_DIR)/$@" $(CC) $(CFLAGS) -o $@ $^ $(COMMON_LIBS) $(LP_DIAG_LIBS) usysident: $(USYSIDENT_OBJS) $(COMMON_OBJS) @echo "LD $(WORK_DIR)/$@" $(CC) $(CFLAGS) -o $@ $^ $(COMMON_LIBS) usysattn: $(USYSIDENT_OBJS) $(COMMON_OBJS) @echo "LD $(WORK_DIR)/$@" $(CC) $(CFLAGS) -o $@ $^ $(COMMON_LIBS) install: all @$(call install_sbin,$(CMDS),$(DESTDIR)) @$(foreach d,$(SUBDIRS), $(MAKE) -C $d install;) uninstall: @$(call uninstall_sbin,$(CMDS),$(DESTDIR)) @$(foreach d,$(SUBDIRS), $(MAKE) -C $d uninstall;) clean: @echo "Cleaning up lpd files..." @rm -rf $(CMDS) $(COMMON_OBJS) $(LP_DIAG_OBJS) $(USYSIDENT_OBJS) ppc64-diag-2.6.4/lpd/README0000644000000000000000000000156512313010662013517 0ustar rootrootLight Path Diangostics : ======================= Light Path Diagnostics allows system engineers and administrators to easily and quickly diagnose hardware problems on the IBM servers. Light Path Diagnostics on PowerLinux constantly monitors for serviceable events and enables/disable fault indicators as required. Further documentation for each of these utilities is available in their corresponding man pages. lp_diag: light path diagnostics -------- UI to view and modify the indicator status. usysident: identification indicator utility --------- A utility to view the status of device identification indicators (LEDs), and to turn the indicators on and off. usysattn, usysfault: attention indicator utility ------------------- A utility to view the status of the system attention and fault indicators (LEDs), and to turn the indicators off after an event has been serviced. ppc64-diag-2.6.4/lpd/usysident.c0000644000000000000000000002350712313010662015032 0ustar rootroot/** * @file usysident.c * @brief usysident/usysattn/usysfault * * Copyright (C) 2012 IBM Corporation * See 'COPYRIGHT' for License of this code. * * @author Vasant Hegde * * @Note: * This file is the re-implementation of original usysident.c * file in powerpc-utils package. * @author Michael Strosaker * **/ #include #include #include #include #include #include #include #include #include "platform.c" #include "lp_diag.h" #define CMD_LINE_OPTIONS "d:l:s:-:thV" #define CMD_IDENTIFY "usysident" #define CMD_FAULT "usysfault" #define CMD_ATTN "usysattn" /* print indicator state */ #define print_indicator_state(loc) \ fprintf(stdout, "%s\t [%s]\n", loc->code, loc->state ? "on" : "off") /* Log indicator status */ #define indicator_log_state(indicator, loc, state) \ if (indicator == ATTN_INDICATOR && !strchr(loc, '-')) \ indicator_log_write("System Attention Indicator : %s", \ state == INDICATOR_ON ? "ON" : "OFF"); \ else \ indicator_log_write("%s : %s : %s", loc, \ indicator == IDENT_INDICATOR ? \ "Identify" : "Fault", \ state == INDICATOR_ON ? "ON" : "OFF"); /** * print_usage - Print the usage statement */ static void print_usage(const char *cmd) { if (strstr(cmd, CMD_IDENTIFY)) { fprintf(stdout, "Usage:\n" " %s [-l [-s {identify|normal}][-t]]\n" " %s [-d [-s {identify|normal}][-t]]\n" " %s [-V]\n" " %s [-h]\n\n", cmd, cmd, cmd, cmd); fprintf(stdout, "Options:\n" " -l Indicator location code\n" " -d Device name\n" " -s identify Turn on device/location identify indicator\n" " -s normal Turn off device/location identify indicator\n" " -t Truncate loc code if necessary\n" " -V Print the version of the command\n" " -h Print this message and exit\n"); } else { fprintf(stdout, "Usage:\n" " %s [-l [-s normal][-t]]\n" " %s [-V]\n" " %s [-h]\n\n", cmd, cmd, cmd); fprintf(stdout, "Options:\n" " -l Indicator location code\n" " -s normal Turn off location fault indicator\n" " -t Truncate loc code if necessary\n" " -V Print the version of the command\n" " -h Print this message\n"); } } /** * main - */ int main(int argc, char **argv) { int c; int state; int index; int indicator; int rc = 0; int trunc = 0; int truncated = 0; int platform = 0; char temp[LOCATION_LENGTH]; char dloc[LOCATION_LENGTH]; char *dvalue = NULL; char *lvalue = NULL; char *svalue = NULL; char *othervalue = NULL; struct loc_code *current; struct loc_code *list = NULL; platform = get_platform(); if (platform != PLATFORM_PSERIES_LPAR) { fprintf(stderr, "%s is not supported on the %s platform\n", argv[0], __power_platform_name(platform)); return 1; } opterr = 0; while ((c = getopt(argc, argv, CMD_LINE_OPTIONS)) != -1) { switch (c) { case 'd': /* Device name */ dvalue = optarg; break; case 'l': /* Location code */ lvalue = optarg; break; case 's': /* Enable/disable */ svalue = optarg; break; case '-': /* All location code */ othervalue = optarg; break; case 't': /* truncate location code */ trunc = 1; break; case 'V': fprintf(stdout, "%s %s\n", argv[0], VERSION); fflush(stdout); return 0; case 'h': print_usage(argv[0]); return 0; case '?': if (isprint(optopt)) fprintf(stderr, "Unrecognized option: -%c\n\n", optopt); else fprintf(stderr, "Unrecognized option character %x\n\n", optopt); print_usage(argv[0]); return 1; default: print_usage(argv[0]); return 1; } } /* Option checking */ for (index = optind; index < argc; index++) { fprintf(stderr, "Unrecognized argument : %s\n\n", argv[index]); print_usage(argv[0]); return 1; } if (dvalue && !strstr(argv[0], CMD_IDENTIFY)) { fprintf(stderr, "Unrecognized option: -d\n\n"); print_usage(argv[0]); return 1; } if (dvalue && lvalue) { fprintf(stderr, "The -d and -l options cannot be used together.\n\n"); print_usage(argv[0]); return 1; } if (svalue && strstr(argv[0], CMD_IDENTIFY)) { if (!strcmp(svalue, "identify")) c = INDICATOR_ON; else if (!strcmp(svalue, "normal")) c = INDICATOR_OFF; else { fprintf(stderr, "The -s option must be either " "\"identify\" or \"normal\".\n\n"); print_usage(argv[0]); return 1; } } if (svalue && (strstr(argv[0], CMD_FAULT) || strstr(argv[0], CMD_ATTN))) { if (!strcmp(svalue, "normal")) c = INDICATOR_OFF; else { fprintf(stderr, "The -s option must be \"normal\".\n\n"); print_usage(argv[0]); return 1; } } if (svalue && !(dvalue || lvalue)) { if (strstr(argv[0], CMD_IDENTIFY)) fprintf(stderr, "The -s option requires the -d or -l " "option to also be used.\n\n"); else fprintf(stderr, "The -s option requires the -l " "option to also be used.\n\n"); print_usage(argv[0]); return 1; } if (svalue && geteuid() != 0) { fprintf(stderr, "%s: Turning indicator on/off requires " "superuser privileges.\n\n", argv[0]); return 1; } if (trunc && !(dvalue || lvalue)) { if (strstr(argv[0], CMD_IDENTIFY)) fprintf(stderr, "The -t option requires the -d or -l " "option to also be used.\n\n"); else fprintf(stderr, "The -t option requires the -l " "option to also be used.\n\n"); print_usage(argv[0]); return 1; } if (othervalue && strstr(argv[0], CMD_IDENTIFY)) { if (!strcmp(othervalue, "all-on")) c = INDICATOR_ON; else if (!strcmp(othervalue, "all-off")) c = INDICATOR_OFF; else { fprintf(stderr, "Unrecognized option: --%s\n\n", othervalue); print_usage(argv[0]); return 1; } } if (othervalue && (strstr(argv[0], CMD_ATTN) || strstr(argv[0], CMD_FAULT))) { if (!strcmp(othervalue, "all-off")) c = INDICATOR_OFF; else { fprintf(stderr, "Unrecognized option: --%s\n\n", othervalue); print_usage(argv[0]); return 1; } } if (othervalue && argc > 2) { fprintf(stderr, "\"--%s\" cannot be used with any other options.\n\n", othervalue); print_usage(argv[0]); return 1; } if (strstr(argv[0], CMD_IDENTIFY)) indicator = IDENT_INDICATOR; else if (strstr(argv[0], CMD_FAULT) || strstr(argv[0], CMD_ATTN)) indicator = ATTN_INDICATOR; else return 1; /* initialize */ program_name = argv[0]; lp_error_log_fd = 1; /* log message to stdout */ rc = init_files(); if (rc) { fprintf(stderr, "Unable to open log file.\n"); return 1; } /* Light Path operating mode */ if (indicator == ATTN_INDICATOR) { rc = check_operating_mode(); if (rc) return rc; } /* get indicator list */ rc = get_indicator_list(indicator, &list); if (rc) goto file_cleanup; if (argc == 1) { current = list; while (current) { /* get and print all indicators current state */ rc = get_indicator_state(indicator, current, &state); if (rc) /* failed to get indicator state */ current->state = -1; else current->state = state; print_indicator_state(current); current = current->next; } } /* Turn on/off indicator based on device name */ if (dvalue) { if (get_loc_code_for_dev(dvalue, dloc, LOCATION_LENGTH) != 0) { fprintf(stderr, "\"%s\" is not a valid device or " "it does not have location code.\n", dvalue); rc = 2; } else { lvalue = dloc; fprintf(stdout, "%s is at location code %s.\n", dvalue, lvalue); } } /* Turn on/off indicator based on location code */ if (lvalue) { strncpy(temp, lvalue, LOCATION_LENGTH); retry: current = get_indicator_for_loc_code(list, lvalue); if (!current) { if (trunc) { if (truncate_loc_code(lvalue)) { truncated = 1; goto retry; } } fprintf(stdout, "There is no %s indicator at location " "code %s.\n", INDICATOR_TYPE(indicator), temp); rc = 1; } else { /* Found location code */ if (truncated) fprintf(stdout, "Truncated location code : " "%s\n", lvalue); if (svalue) { rc = get_indicator_state(indicator, current, &state); if (rc || state != c) { rc = set_indicator_state(indicator, current, c); if (rc) goto indicator_cleanup; indicator_log_state(indicator, current->code, c); } } rc = get_indicator_state(indicator, current, &state); if (!rc) { if (dvalue) fprintf(stdout, "%s\t[%s]\n", lvalue, state ? "on" : "off"); else fprintf(stdout, "%s\n", state ? "on" : "off"); } } /* if-else end */ } /* lvalue end */ /* Turn on/off all indicators */ if (othervalue) { current = list; while (current) { rc = get_indicator_state(indicator, current, &state); if (rc) /* failed to get indicator state */ current->state = -1; else current->state = state; if (state != c) { set_indicator_state(indicator, current, c); rc = get_indicator_state(indicator, current, &state); if (rc) /* failed to get indicator state */ current->state = -1; else current->state = state; } print_indicator_state(current); current = current->next; } /* If enclosure ident indicator is turned ON explicitly, * then turning OFF all components ident indicator inside * enclosure does not turn OFF enclosure ident indicator. */ if (indicator == IDENT_INDICATOR && c == INDICATOR_OFF) set_indicator_state(indicator, &list[0], c); indicator_log_write("All %s Indicators : %s", indicator == IDENT_INDICATOR ? "Identify" : "Fault", c == INDICATOR_ON ? "ON" : "OFF"); } indicator_cleanup: free_indicator_list(list); file_cleanup: close_files(); return rc; } ppc64-diag-2.6.4/lpd/indicator_rtas.h0000644000000000000000000000056112313010662016010 0ustar rootroot/** * Copyright (C) 2012 IBM Corporation * See 'COPYRIGHT' for License of this code. */ #ifndef INDICATOR_RTAS_H #define INDICATOR_RTAS_H #include "lp_diag.h" extern int get_rtas_indices(int, struct loc_code **); extern int get_rtas_sensor(int, struct loc_code *, int *); extern int set_rtas_indicator(int, struct loc_code *, int); #endif /* INDICATOR_RTAS_H */ ppc64-diag-2.6.4/lpd/indicator_rtas.c0000644000000000000000000001621012313010662016001 0ustar rootroot/** * @file indicator_rtas.c * @brief RTAS indicator manipulation routines * * Copyright (C) 2012 IBM Corporation * See 'COPYRIGHT' for License of this code. * * @author Vasant Hegde */ #include #include #include #include #include #include "lp_diag.h" #include "lp_util.h" /* RTAS error buffer size */ #define RTAS_ERROR_BUF_SIZE 64 /* Indicator operating mode */ uint32_t operating_mode; /** * parse_work_area - Parse the working buffer * * @loc list to add new data to * @buf working area to parse * * Returns : * pointer to new loc_code list */ static struct loc_code * parse_rtas_workarea(struct loc_code *loc, const char *buf) { int i; int num = *(int *)buf; struct loc_code *curr = loc; if (curr) while (curr->next) curr = curr->next; buf += sizeof(uint32_t); for (i = 0; i < num; i++) { if (!curr) { curr = (struct loc_code *)malloc(sizeof(struct loc_code)); loc = curr; } else { curr->next = (struct loc_code *)malloc(sizeof(struct loc_code)); curr = curr->next; } if (!curr) { log_msg("Out of memory"); /* free up previously allocated memory */ free_indicator_list(loc); return NULL; } memset(curr, 0, sizeof(struct loc_code)); curr->index = *(uint32_t *)buf; buf += sizeof(uint32_t); curr->length = *(uint32_t *)buf; buf += sizeof(uint32_t); strncpy(curr->code, buf, curr->length); buf += curr->length; curr->code[curr->length] = '\0'; curr->length = strlen(curr->code) + 1; curr->type = TYPE_RTAS; curr->next = NULL; } return loc; } /** * librtas_error - Check for librtas specific return codes * * @Note: * librtas_error is based on librtas_error.c in powerpc-util package. * @author Nathan Fontenot * * This will check the error value for a librtas specific return code * and fill in the buffer with the appropraite error message. * * @error return code from librtas * @buf buffer to fill with error string * @size size of "buffer" * * Returns : * nothing */ static void librtas_error(int error, char *buf, size_t size) { switch (error) { case RTAS_KERNEL_INT: snprintf(buf, size, "No kernel interface to firmware"); break; case RTAS_KERNEL_IMP: snprintf(buf, size, "No kernel implementation of function"); break; case RTAS_PERM: snprintf(buf, size, "Non-root caller"); break; case RTAS_NO_MEM: snprintf(buf, size, "Out of heap memory"); break; case RTAS_NO_LOWMEM: snprintf(buf, size, "Kernel out of low memory"); break; case RTAS_FREE_ERR: snprintf(buf, size, "Attempt to free nonexistant RMO buffer"); break; case RTAS_TIMEOUT: snprintf(buf, size, "RTAS delay exceeded specified timeout"); break; case RTAS_IO_ASSERT: snprintf(buf, size, "Unexpected librtas I/O error"); break; case RTAS_UNKNOWN_OP: snprintf(buf, size, "No firmware implementation of function"); break; default: snprintf(buf, size, "Unknown librtas error %d", error); } } /** * get_rtas_list - Gets rtas indicator list * * @indicator identification or attention indicator * @loc pointer to loc_code structure * * Returns : * rtas call return value */ int get_rtas_indices(int indicator, struct loc_code **loc) { int rc; int index = 1; int next_index; char workarea[BUF_SIZE]; char err_buf[RTAS_ERROR_BUF_SIZE]; struct loc_code *list = NULL; do { rc = rtas_get_indices(0, indicator, workarea, BUF_SIZE, index, &next_index); switch (rc) { case 1: /* more data available */ index = next_index; /* fall through */ case 0: /* success */ list = parse_rtas_workarea(list, workarea); if (!list) return -99; /* Out of heap memory */ break; case -1: /* hardware error */ log_msg("Hardware error retrieving indicator indices"); free_indicator_list(list); break; case RTAS_UNKNOWN_OP: /* Yes, this is a librtas return code but it should * be treated the same as a -3 return code, both * indicate that functionality is not supported */ librtas_error(rc, err_buf, RTAS_ERROR_BUF_SIZE); /* fall through */ case -3: /* indicator type not supported. */ log_msg("The %s indicators are not supported " "on this system", INDICATOR_TYPE(indicator)); if (rc == RTAS_UNKNOWN_OP) log_msg(",\n%s", err_buf); free_indicator_list(list); break; case -4: /* list changed; start over */ free_indicator_list(list); list = NULL; index = 1; break; default: librtas_error(rc, err_buf, RTAS_ERROR_BUF_SIZE); log_msg("Could not retrieve data for %s " "indicators,\n%s", INDICATOR_TYPE(indicator), err_buf); free_indicator_list(list); break; } } while ((rc == 1) || (rc == -4)); *loc = list; return rc; } /** * get_rtas_sensor - Retrieve a sensor value from rtas * * Call the rtas_get_sensor or rtas_get_dynamic_sensor librtas calls, * depending on whether the index indicates that the sensor is dynamic. * * @indicator identification or attention indicator * @loc location code of the sensor * @state return sensor state for the given loc * * Returns : * rtas call return code */ int get_rtas_sensor(int indicator, struct loc_code *loc, int *state) { int rc; char err_buf[RTAS_ERROR_BUF_SIZE]; if (loc->index == DYNAMIC_INDICATOR) rc = rtas_get_dynamic_sensor(indicator, (void *)loc, state); else rc = rtas_get_sensor(indicator, loc->index, state); switch (rc) { case 0: /*success */ break; case -1: log_msg("Hardware error retrieving the indicator at %s", loc->code); break; case -2: log_msg("Busy while retrieving indicator at %s. " "Try again later", loc->code); break; case -3: log_msg("The indicator at %s is not implemented", loc->code); break; default: librtas_error(rc, err_buf, RTAS_ERROR_BUF_SIZE); log_msg("Could not get %ssensor %s indicators,\n%s", (loc->index == DYNAMIC_INDICATOR) ? "dynamic " : "", INDICATOR_TYPE(indicator), err_buf); break; } return rc; } /** * set_rtas_indicator - Set rtas indicator * * Call the rtas_set_indicator or rtas_set_dynamic_indicator librtas calls, * depending on whether the index indicates that the indicator is dynamic. * * @indicator identification or attention indicator * @loc location code of rtas indicator * @new_value value to update indicator to * * Returns : * rtas call return code */ int set_rtas_indicator(int indicator, struct loc_code *loc, int new_value) { int rc; char err_buf[RTAS_ERROR_BUF_SIZE]; if (loc->index == DYNAMIC_INDICATOR) rc = rtas_set_dynamic_indicator(indicator, new_value, (void *)loc); else rc = rtas_set_indicator(indicator, loc->index, new_value); switch (rc) { case 0: /*success */ break; case -1: log_msg("Hardware error while setting the indicator at %s", loc->code); break; case -2: log_msg("Busy while setting the indicator at %s. " "Try again later", loc->code); break; case -3: log_msg("The indicator at %s is not implemented", loc->code); break; default: librtas_error(rc, err_buf, RTAS_ERROR_BUF_SIZE); log_msg("Could not set %ssensor %s indicators,\n%s", (loc->index == DYNAMIC_INDICATOR) ? "dynamic " : "", INDICATOR_TYPE(indicator), err_buf); break; } return rc; } ppc64-diag-2.6.4/ela/0000755000000000000000000000000012313010662012612 5ustar rootrootppc64-diag-2.6.4/ela/event_lex.l0000644000000000000000000000315712313010662014766 0ustar rootroot%{ /* * Tokenizer for event catalog * * Copyright (C) International Business Machines Corp., 2009 * */ #define CATALOGS_IMPLEMENTATION #include "catalogs.h" #include "ev.tab.h" #include #include #include #include extern EventCtlgParser event_ctlg_parser; static EventCtlgParser *pc = &event_ctlg_parser; %} %option noyywrap %% action { return KW_ACTION; } class { return KW_CLASS; } copy { return KW_COPY; } description { return KW_DESCRIPTION; } devspec { return KW_DEVSPEC; } exception { return KW_EXCEPTION; } file { return KW_FILE; } filter { return KW_FILTER; } message { return KW_MESSAGE; } priority { return KW_PRIORITY; } refcode { return KW_REFCODE; } regex { return KW_REGEX; } sl_severity { return KW_SL_SEVERITY; } subsystem { return KW_SUBSYSTEM; } type { return KW_TYPE; } [_A-Za-z][A-Za-z0-9_]* { char *name; if (! (name = strdup((const char*)yytext)) ) { perror("strdup"); return ERRTOK; } evlval.sval = name; return TK_NAME; } \" { char *s = pc->get_string(1); if (!s) return ERRTOK; evlval.sval = s; return TK_STRING; } \{\{ { char *s = pc->get_text_block(); if (!s) return ERRTOK; evlval.sval = s; return TK_TEXTBLOCK; } [ \t\r] ; /* Skip white space. */ \n { pc->lineno++; } "/*" { if (pc->skip_comment() < 0) return ERRTOK; } . { return yytext[0]; /* Pass through any other characters. */ } %% /* unput is a macro, but we need a function pointer. */ static void unput_func(int c) { unput(c); } void EventCtlgParser::init_lex(void) { YY_FLUSH_BUFFER; yyrestart(file); lineno = 1; p_input = yyinput; p_unput = unput_func; } ppc64-diag-2.6.4/ela/message_catalog/0000755000000000000000000000000012313010662015730 5ustar rootrootppc64-diag-2.6.4/ela/message_catalog/ixgb0000644000000000000000000001554012313010662016611 0ustar rootrootsubsystem: net file: "drivers/net/ixgb/ixgb_main.c" message[chatter]: netif_info "Intel(R) PRO/10GbE Network Connection\n" message[defensive]: netif_err "Unable to allocate interrupt Error: %d\n" message[defensive]: netif_err "ixgb_init_hw failed\n" message[defensive]: netif_err "The EEPROM Checksum Is Not Valid\n" message[defensive]: netif_err "Invalid MAC Address\n" message[defensive]: netif_err "unsupported device id\n" message[defensive]: netif_err "Unable to allocate transmit descriptor ring memory\n" message[defensive]: netif_err "Unable to allocate transmit descriptor memory\n" message[defensive]: netif_err "Unable to allocate receive descriptor ring\n" message[defensive]: netif_err "Unable to allocate receive descriptors\n" message[defensive]: netif_err "Invalid MTU setting %d\n" message[defensive]: netif_err "Cannot re-enable PCI device after reset\n" message[defensive]: netif_err "After reset, the EEPROM checksum is not valid\n" message[defensive]: netif_err "After reset, invalid MAC address\n" message[defensive]: dev_err "TX DMA map failed\n" message[defensive]: printk err "ixgb: No usable DMA configuration, aborting\n" message[chatter]: printk err "ixgb: %s NIC Link is Up 10 Gbps Full Duplex, Flow Control: %s\n" message[chatter]: printk err "ixgb: %s NIC Link is Down\n" file: "drivers/net/ixgb/ixgb_param.c" message[chatter]: printk err "Invalid %s specified (%i) %s\n" message[chatter]: printk err "Warning: no configuration for board #%i\n" message[chatter]: printk info "Using defaults for all values\n" message[chatter]: printk info "Ignoring RxFCHighThresh when no RxFC\n" message[chatter]: printk info "Ignoring RxFCLowThresh when no RxFC\n" message[chatter]: printk info "Ignoring FCReqTimeout when no RxFC\n" file: "drivers/net/ixgbe/ixgbe_main.c" message[chatter]: dev_info "MAC: %d, PHY: %d, SFP+: %d, PBA No: %06x-%03x\n" message[chatter]: dev_info "MAC: %d, PHY: %d, PBA No: %06x-%03x\n" message[chatter]: dev_info "Intel(R) 10 Gigabit Network Connection\n" message[chatter]: dev_warn "PCI-Express bandwidth available for this card is not sufficient for optimal performance.\n" message[chatter]: dev_warn "For optimal performance a x8 PCI-Express slot is required.\n" message[defensive]: dev_err "master disable timed out\n" message[defensive]: dev_err "Hardware Error: %d\n" message[defensive]: dev_err "EEPROM initialization failed\n" message[defensive]: dev_err "TX DMA map failed\n" message[defensive]: dev_err "No usable DMA configuration, aborting\n" message[defensive]: dev_err "pci_request_selected_regions failed 0x%x\n" message[defensive]: dev_err "HW Init failed: %d\n" message[defensive]: dev_err "The EEPROM Checksum Is Not Valid\n" message[defensive]: dev_err "invalid MAC address\n" message[defensive]: dev_err "pci_cleanup_aer_uncorrect_error_status failed 0x%0x\n" message[defensive]: printk err "ixgbe: Cannot enable PCI device from suspend\n" message[defensive]: printk err "ixgbe: Cannot initialize interrupts for device\n" message[chatter]: printk err "ixgbe: %s NIC Link is Up %s, Flow Control: %s\n" message[chatter]: printk err "ixgbe: %s NIC Link is Down\n" file: "drivers/net/ixgbe/ixgbe_sriov.c" message[defensive]: printk err "Error receiving message from VF\n" file: "drivers/net/ixgbe/ixgbe_82598.c" message[defensive]: hw_dbg "Flow control param set incorrectly\n" message[defensive]: hw_dbg "Autonegotiation did not complete.\n" message[defensive]: hw_dbg "Link was indicated but link is down\n" message[defensive]: hw_dbg "PCI-E Master disable polling has failed.\n" message[defensive]: hw_dbg "Reset polling failed to complete.\n" message[defensive]: hw_dbg "RAR index %d is out of range.\n" message[defensive]: hw_dbg "EEPROM read did not pass.\n" file: "drivers/net/ixgbe/ixgbe_82599.c" message[defensive]: hw_dbg "Autoneg did not complete.\n" message[defensive]: hw_dbg "ixgbe_setup_mac_link_smartspeed.\n" message[defensive]: hw_dbg "PCI-E Master disable polling has failed.\n" message[defensive]: hw_dbg "Reset polling failed to complete.\n" message[defensive]: hw_dbg "RAR index %d is out of range.\n" message[defensive]: hw_dbg "RAR index %d is out of range.\n" message[defensive]: hw_dbg "No space in VLVF.\n" message[defensive]: hw_dbg "Flow Director previous command isn't complete, aborting table re-initialization. \n" message[defensive]: hw_dbg "Flow Director Signature poll time exceeded!\n" message[defensive]: hw_dbg "Flow Director Perfect poll time exceeded!\n" message[defensive]: hw_dbg "Error on l4type input\n" message[defensive]: hw_dbg "Rx unit being enabled before security path fully disabled. Continuing with init.\n" file: "drivers/net/ixgbe/ ixgbe_common.c" message[defensive]: hw_dbg "NVM Read Error\n" message[defensive]: hw_dbg "PCI-E Master disable polling has failed.\n" message[defensive]: hw_dbg "Eeprom read timed out\n" message[defensive]: hw_dbg "Could not acquire EEPROM grant\n" message[defensive]: hw_dbg "SPI EEPROM Status error\n" message[defensive]: hw_dbg "EEPROM read failed\n" message[defensive]: hw_dbg "RAR index %d is out of range.\n" message[defensive]: hw_dbg "Overriding MAC Address in RAR[0]\n" message[defensive]: hw_dbg "Clearing RAR[1-%d]\n" message[defensive]: hw_dbg "Added a secondary address to RAR[%d]\n" message[defensive]: hw_dbg "ixgbe_add_uc_addr Complete\n" message[defensive]: hw_dbg "Clearing RAR[1-%d]\n" message[defensive]: hw_dbg "ixgbe_update_uc_addr_list_generic Complete\n" message[defensive]: hw_dbg "MC filter type param set incorrectly\n" message[defensive]: hw_dbg "ixgbe_update_mc_addr_list_generic Complete\n" message[defensive]: hw_dbg "Flow control param set incorrectly\n" message[defensive]: hw_dbg "Invalid packet buffer number [%d], expected range is 0-7\n" message[defensive]: hw_dbg "Invalid water mark configuration\n" message[defensive]: hw_dbg "ixgbe_fc_rx_pause not valid in strict IEEE mode\n" message[defensive]: hw_dbg "Driver can't access resource, GSSR timeout.\n" file: "drivers/net/ixgbe/ixgbe_phy.c" message[defensive]: hw_dbg "PHY address command did not complete.\n" message[defensive]: hw_dbg "PHY read command didn't complete\n" message[defensive]: hw_dbg "PHY address cmd didn't complete\n" message[defensive]: hw_dbg "PHY address cmd didn't complete\n" message[defensive]: hw_dbg "PHY reset did not complete.\n" message[defensive]: hw_dbg "Bad control value\n" message[defensive]: hw_dbg "Bad control type\n" message[defensive]: hw_dbg "SFP+ module not supported\n" message[defensive]: hw_dbg "SFP+ module not supported\n" message[defensive]: hw_dbg "No matching SFP+ module found\n" message[defensive]: hw_dbg "I2C byte read error - Retrying.\n" message[defensive]: hw_dbg "I2C byte read error.\n" message[defensive]: hw_dbg "I2C byte write error - Retrying.\n" message[defensive]: hw_dbg "I2C byte write error.\n" message[defensive]: hw_dbg "I2C ack was not received.\n" message[defensive]: hw_dbg "I2C data was not set to %X\n" message[defensive]: hw_dbg "Error - I2C data was not set to %X.\n" ppc64-diag-2.6.4/ela/message_catalog/qla2xxx0000644000000000000000000011066612313010662017274 0ustar rootrootsubsystem: scsi file: "drivers/scsi/qla2xxx/qla_attr.c" message: qla_printk KERN_INFO "Firmware dump cleared on (%ld).\n" description {{ Previous firmware dump was cleared from memory. }} action {{ None recommended. }} class: firmware type: info refcode: "" message: qla_printk KERN_WARNING "Raw firmware dump ready for read on (%ld).\n" description {{ Firmware dump now ready to be read. }} action {{ None recommended. }} class: firmware type: info refcode: "" message: qla_printk KERN_ERR "HBA not online, failing NVRAM update.\n" description {{ Application tried to write to NVRAM of adapter that is offline. }} action {{ None recommended. }} class: hardware sl_severity: warning refcode: "" message: qla_printk KERN_ERR "Unable to allocate memory for optrom retrieval (%x).\n" description {{ System has low memory. }} action {{ None recommended. }} class: software sl_severity: warning refcode: "" message: qla_printk KERN_ERR "Invalid start region 0x%x/0x%x.\n" description {{ Invalid starting address of option rom memory. }} action {{ None recommended. }} class: software sl_severity: warning refcode: "" message: qla_printk KERN_ERR "Unable to allocate memory for optrom update (%x).\n" description {{ System has low memory. }} action {{ None recommended. }} class: software sl_severity: warning refcode: "" message: qla_printk KERN_ERR "HBA not online, failing flash update.\n" description {{ Application tried to write to flash memory of adapter that is offline. }} action {{ None recommended. }} class: hardware sl_severity: warning refcode: "" message: qla_printk KERN_ERR "HBA not online, failing VPD update.\n" description {{ Application tried to write to vital product data of adapter that is offline. }} action {{ None recommended. }} class: hardware sl_severity: warning refcode: "" message: qla_printk KERN_ERR "Unable to allocate memory for VPD information update.\n" description {{ System has low memory. }} action {{ None recommended. }} class: software sl_severity: warning refcode: "" message: qla_printk KERN_ERR "Unable to allocate memory for SFP read-data.\n" description {{ System has low memory. }} action {{ None recommended. }} class: software sl_severity: warning refcode: "" message: qla_printk KERN_ERR "Unable to read SFP data (%x/%x/%x).\n" description {{ Firmware did not return any information for requested SFP data. }} action {{ None recommended. }} class: software sl_severity: warning refcode: "" message: qla_printk KERN_INFO "Issuing ISP reset on (%ld).\n" description {{ Debug ASIC reset. }} action {{ None recommended. }} class: software type: info refcode: "" message: qla_printk KERN_INFO "Issuing MPI reset on (%ld).\n" description {{ Debug reset of 81xx MP firmware. }} action {{ None recommended. }} class: software type: info refcode: "" message: qla_printk KERN_ERR "MPI reset failed on (%ld).\n" description {{ MPI firmware reset failed during loopback test. }} action {{ None recommended. }} class: software sl_severity: warning refcode: "" message: qla_printk KERN_ERR "Unable to allocate memory for XGMAC read-data.\n" description {{ System has low memory. }} action {{ None recommended. }} class: software sl_severity: warning refcode: "" message: qla_printk KERN_ERR "Unable to read XGMAC data (%x).\n" description {{ Unable to ethernet transmission statistics. }} action {{ None recommended. }} class: software sl_severity: warning refcode: "" message: qla_printk KERN_ERR "Unable to allocate memory for DCBX TLV read-data.\n" description {{ System has low memory. }} action {{ None recommended. }} class: software sl_severity: warning refcode: "" message: qla_printk KERN_ERR "Unable to read DCBX TLV data (%x).\n" description {{ Unable to read data center bridging type-length-value data. }} action {{ None recommended. }} class: software sl_severity: warning refcode: "" message: qla_printk KERN_ERR "Unable to create sysfs %s binary attribute (%d).\n" description {{ Error creating sysfs attribute. }} action {{ None recommended. }} class: software sl_severity: warning refcode: "" message: qla_printk KERN_WARNING "Abort ISP active -- ignoring beacon request.\n" description {{ Request to blink beacon ignored. }} action {{ None recommended. }} class: software sl_severity: warning refcode: "" message: qla_printk KERN_INFO "VP entry id %d assigned.\n" description {{ Virtual port index of new NPIV port. }} action {{ None recommended. }} class: software type: info refcode: "" message: qla_printk KERN_WARNING "Can't create request queue for vp_idx:%d\n" description {{ Could not create a separate request queue for new virtual port. }} action {{ None recommended. }} class: software sl_severity: warning refcode: "" message: qla_printk KERN_WARNING "Queue delete failed.\n" description {{ Could not delete request queue specific to a virtual port being deleted. }} action {{ None recommended. }} class: software sl_severity: warning refcode: "" message: qla_printk KERN_INFO "vport %d deleted\n" description {{ Virtual port successfully deleted. }} action {{ None recommended. }} class: software type: info refcode: "" file: "drivers/scsi/qla2xxx/qla_bsg.c" message: qla_printk KERN_ERR "MPI reset failed on (%ld).\n" description {{ MPI firmware reset failed during loopback test. }} action {{ None recommended. }} class: software sl_severity: warning refcode: "" file: "drivers/scsi/qla2xxx/qla_dbg.c" message: qla_printk KERN_ERR "Failed to dump firmware (%x)!!!\n" description {{ Procedure to produce a firmware dump failed. }} action {{ None recommended. }} class: software sl_severity: warning refcode: "" message: qla_printk KERN_INFO "Firmware dump saved to temp buffer (%ld/%p).\n" description {{ Procedure to produce firmware dump succeeded and is ready for retrieval. }} action {{ None recommended. }} class: software type: info refcode: "" message: qla_printk KERN_ERR "No buffer available for dump!!!\n" description {{ Memory buffer for firmware dump was never allocated. }} action {{ None recommended. }} class: software sl_severity: warning refcode: "" file: "drivers/scsi/qla2xxx/qla_dfs.c" message: qla_printk KERN_ERR "DebugFS: Unable to disable FCE (%d).\n" description {{ Error flushing fibre channel event buffer. }} action {{ None recommended. }} class: software sl_severity: warning refcode: "" message: qla_printk KERN_ERR "DebugFS: Unable to reinitialize FCE (%d).\n" description {{ Error reinitializing trace when ending a trace session. }} action {{ None recommended. }} class: software sl_severity: warning refcode: "" message: qla_printk KERN_ERR "DebugFS: Unable to create root directory.\n" description {{ Unable to create the qla2xxx directory in the debugFS filesystem. }} action {{ None recommended. }} class: software sl_severity: warning refcode: "" message: qla_printk KERN_ERR "DebugFS: Unable to create ha directory.\n" description {{ Unable to create a directory for this adapter in DebugFS. }} action {{ None recommended. }} class: software sl_severity: warning refcode: "" message: qla_printk KERN_ERR "DebugFS: Unable to fce node.\n" description {{ Unable to create fibre channel event node in DebugFS. }} action {{ None recommended. }} class: software sl_severity: warning refcode: "" file: "drivers/scsi/qla2xxx/qla_init.c" message: qla_printk KERN_WARNING "Configuring PCI space...\n" description {{ Driver is configuring PCI configuration registers. }} action {{ None recommended. }} class: software type: info refcode: "" message: qla_printk KERN_INFO "Configure NVRAM parameters...\n" description {{ Driver is reading NVRAM parameters and configuring driver settings with them. }} action {{ None recommended. }} class: software type: info refcode: "" message: qla_printk KERN_WARNING "Masking HBA WWPN %02x%02x%02x%02x%02x%02x%02x%02x (via NVRAM).\n" description {{ Masking this HBA from operating system based on NVRAM parameters. }} action {{ None recommended. }} class: software sl_severity: warning refcode: "" message: qla_printk KERN_INFO "Verifying loaded RISC code...\n" description {{ Verifying that the firmware image is valid. }} action {{ None recommended. }} class: software type: info refcode: "" message: qla_printk KERN_ERR "Unable to configure ISP84XX.\n" description {{ Error configuring 84xx CNA specific settings. }} action {{ None recommended. }} class: software sl_severity: warning refcode: "" message: qla_printk KERN_ERR "Unable to initialize ISP84XX.\n" description {{ Error initializing 84xx CNA specific firmware. }} action {{ None recommended. }} class: software sl_severity: warning refcode: "" message: qla_printk KERN_WARNING "RISC CODE NOT loaded\n" description {{ Not loading firmware from flash memory. }} action {{ None recommended. }} class: software sl_severity: warning refcode: "" message: qla_printk KERN_ERR "Wrong product ID = 0x%x,0x%x,0x%x\n" description {{ Bad product ID detected for 1Gb/s or 2Gb/s adapter. }} action {{ None recommended. }} class: software sl_severity: warning refcode: "" message: qla_printk KERN_ERR "Failed mailbox send register test\n" description {{ Register communication test for adapter failed. }} action {{ None recommended. }} class: software sl_severity: warning refcode: "" message: qla_printk KERN_WARNING "Firmware dump previously allocated.\n" description {{ Memory for a firmware dump has already been allocated. }} action {{ None recommended. }} class: software sl_severity: warning refcode: "" message: qla_printk KERN_ERR "Unable to allocate (%d KB) for FCE.\n" description {{ System has low memory. }} action {{ None recommended. }} class: software sl_severity: warning refcode: "" message: qla_printk KERN_ERR "Unable to initialize FCE (%d).\n" description {{ Mailbox command to initialize the fibre channel event buffer. }} action {{ None recommended. }} class: software sl_severity: warning refcode: "" message: qla_printk KERN_INFO "Allocated (%d KB) for FCE...\n" description {{ Information about how much memory was allocated for the fibre channel event buffer. }} action {{ None recommended. }} class: software type: info refcode: "" message: qla_printk KERN_ERR "Unable to allocate (%d KB) for EFT.\n" description {{ System has low memory. }} action {{ None recommended. }} class: software sl_severity: warning refcode: "" message: qla_printk KERN_ERR "Unable to initialize EFT (%d).\n" description {{ Mailbox command to initialize the event trace buffer failed. }} action {{ None recommended. }} class: software sl_severity: warning refcode: "" message: qla_printk KERN_INFO "Allocated (%d KB) for EFT...\n" description {{ Information about how much memory was allocated for the event trace buffer. }} action {{ None recommended. }} class: software type: info refcode: "" message: qla_printk KERN_ERR "Unable to allocate (%d KB) for firmware dump!!!\n" description {{ System has low memory. }} action {{ None recommended. }} class: software sl_severity: warning refcode: "" message: qla_printk KERN_INFO "Allocated (%d KB) for firmware dump...\n" description {{ Informational about how much memory was allocated for firmware dump. }} action {{ None recommended. }} class: software type: info refcode: "" message: qla_printk KERN_ERR "Unsupported FAC firmware (%d.%02d.%02d).\n" description {{ Error getting information about flash access commands. }} action {{ None recommended. }} class: software sl_severity: warning refcode: "" message: qla_printk KERN_ERR "Unable to update Serial Link options (%x).\n" description {{ Error setting link parameters. }} action {{ None recommended. }} class: software sl_severity: warning refcode: "" message: qla_printk KERN_WARNING "MSIX Handshake Disable Mode turned on\n" description {{ No MSI-X handshaking needed for this adapter. }} action {{ None recommended. }} class: software sl_severity: warning refcode: "" message: qla_printk KERN_INFO "Waiting for LIP to complete...\n" description {{ Waiting for link to stabilize. }} action {{ None recommended. }} class: software type: info refcode: "" message: qla_printk KERN_INFO "scsi(%ld): Waiting for LIP to complete...\n" description {{ Waiting for link to stabilize. }} action {{ None recommended. }} class: software type: info refcode: "" message: qla_printk KERN_WARNING "Cable is unplugged...\n" description {{ Adapter not connected to another physical port. }} action {{ None recommended. }} class: hardware sl_severity: warning refcode: "" message: qla_printk KERN_ERR "ERROR -- Unable to get host loop ID.\n" description {{ Could not get handle for local port. }} action {{ None recommended. }} class: software sl_severity: warning refcode: "" message: qla_printk KERN_ERR "Cannot get topology - retrying.\n" description {{ Error getting connection type. }} action {{ None recommended. }} class: software sl_severity: warning refcode: "" message: qla_printk KERN_WARNING "Topology - %s, Host Loop address 0x%x\n" description {{ Local port handle. }} action {{ None recommended. }} class: software sl_severity: warning refcode: "" message: qla_printk KERN_ERR "Inconsistent NVRAM detected: checksum=0x%x id=%c version=0x%x.\n" description {{ NVRAM signature was invalid. }} action {{ None recommended. }} class: software sl_severity: warning refcode: "" message: qla_printk KERN_ERR "Falling back to functioning (yet invalid -- WWPN) defaults.\n" description {{ Using driver default NVRAM settings. }} action {{ None recommended. }} class: software sl_severity: warning refcode: "" message: qla_printk KERN_WARNING "ZIO mode %d enabled; timer delay (%d us).\n" description {{ Zero interrupt i/o enabled. }} action {{ None recommended. }} class: software sl_severity: warning refcode: "" message: qla_printk KERN_ERR "Unable to allocate fc remote port!\n" description {{ FC transport could not create remote port object. }} action {{ None recommended. }} class: software sl_severity: warning refcode: "" message: qla_printk KERN_ERR "SNS scan failed -- assuming zero-entry result...\n" description {{ All name server queries failed. }} action {{ None recommended. }} class: software sl_severity: warning refcode: "" message: qla_printk KERN_WARNING "Performing ISP error recovery - ha= %p.\n" description {{ About to perform an ASIC reset. }} action {{ None recommended. }} class: software sl_severity: warning refcode: "" message: qla_printk KERN_ERR "ISP error recovery failed - board disabled\n" description {{ ASIC reset failed so the adapter is being disabled. }} action {{ None recommended. }} class: software sl_severity: warning refcode: "" message: qla_printk KERN_ERR "qla2x00_abort_isp: **** FAILED ****\n" description {{ ASIC reset failed. }} action {{ None recommended. }} class: software sl_severity: warning refcode: "" message: qla_printk KERN_WARNING "FW: Loading from flash (%x)...\n" description {{ Firmware is loading from onboard flash memory. }} action {{ None recommended. }} class: software sl_severity: warning refcode: "" message: qla_printk KERN_ERR "Unable to verify integrity of flash firmware image! Firmware data: %08x %08x %08x %08x!\n" description {{ Firmware image from onboard flash memory is invalid. }} action {{ None recommended. }} class: software sl_severity: warning refcode: "" message: qla_printk KERN_ERR "[ERROR] Failed to load segment %d of firmware\n" description {{ Error copying firmware image to onboard RAM. }} action {{ None recommended. }} class: firmware sl_severity: warning refcode: "" message: qla_printk KERN_ERR "Firmware image unavailable.\n" description {{ Retrieving firmware image via request_firmware failed. }} action {{ None recommended. }} class: firmware sl_severity: warning refcode: "" message: qla_printk KERN_ERR "Unable to verify integrity of firmware image (%Zd)!\n" description {{ Firmware image retrieved via request_firmware is invalid. }} action {{ None recommended. }} class: firmware sl_severity: warning refcode: "" message: qla_printk KERN_ERR "Unable to verify integrity of firmware image!\n" description {{ Firmware image retrieved via request_firmware is invalid. }} action {{ None recommended. }} class: firmware sl_severity: warning refcode: "" message: qla_printk KERN_WARNING "FW: Loading via request-firmware...\n" description {{ Firmware image was retrieved via request_firmware. }} action {{ None recommended. }} class: firmware sl_severity: warning refcode: "" message: qla_printk KERN_WARNING "FW: Attempting to fallback to golden firmware...\n" description {{ Falling back to golden firmware for 81xx adapter. }} action {{ None recommended. }} class: firmware sl_severity: warning refcode: "" message: qla_printk KERN_ERR "FW: Please update operational firmware...\n" description {{ The operational firmware image of a 81xx adapter is corrupt and needs to be reloaded. }} action {{ None recommended. }} class: firmware sl_severity: warning refcode: "" message: qla_printk KERN_ERR "Attempting retry of stop-firmware command...\n" description {{ Trying orderly shutdown of firmware. }} action {{ None recommended. }} class: firmware sl_severity: warning refcode: "" file: "drivers/scsi/qla2xxx/qla_isr.c" message: qla_printk KERN_ERR "Parity error -- HCCR=%x, Dumping firmware!\n" description {{ A parity error was detected in a register or onboard RAM so perform a ASIC reset. }} action {{ None recommended. }} class: firmware sl_severity: warning refcode: "" message: qla_printk KERN_ERR "RISC paused -- HCCR=%x, Dumping firmware!\n" description {{ The ASIC was frozen so perform a reset of the ASIC. }} action {{ None recommended. }} class: firmware sl_severity: warning refcode: "" message: qla_printk KERN_ERR "IDC failed to post ACK.\n" description {{ Driver failed to ACK 81xx inter-driver communication event. }} action {{ None recommended. }} class: unknown sl_severity: warning refcode: "" message: qla_printk KERN_ERR "ISP System Error - mbx1=%xh mbx2=%xh mbx3=%xh mbx7=%xh.\n" description {{ An internal system error occurred. }} action {{ None recommended. }} class: software sl_severity: warning refcode: "" message: qla_printk KERN_ERR "Unrecoverable Hardware Error: adapter marked OFFLINE!\n" description {{ An internal parity error occurred and the adapter may need to be replaced. }} action {{ None recommended. }} class: hardware sl_severity: warning refcode: "" message: qla_printk KERN_ERR "ISP Request Transfer Error (%x).\n" description {{ Error transferring data from request queue. }} action {{ None recommended. }} class: unknown sl_severity: warning refcode: "" message: qla_printk KERN_ERR "ISP Response Transfer Error.\n" description {{ Error transferring data from firmware to host response queue. }} action {{ None recommended. }} class: unknown sl_severity: warning refcode: "" message: qla_printk KERN_WARNING "LIP occurred (%x).\n" description {{ Fibre channel LIP occurred on the link. }} action {{ None recommended. }} class: unknown sl_severity: warning refcode: "" message: qla_printk KERN_WARNING "LOOP UP detected (%s Gbps).\n" description {{ Local port link is up. }} action {{ None recommended. }} class: unknown sl_severity: warning refcode: "" message: qla_printk KERN_WARNING "LOOP DOWN detected (%x %x %x %x).\n" description {{ Local port link is down. }} action {{ None recommended. }} class: unknown sl_severity: warning refcode: "" message: qla_printk KERN_WARNING "LIP reset occurred (%x).\n" description {{ Fibre channel LIP reset occurred. }} action {{ None recommended. }} class: unknown sl_severity: warning refcode: "" message: qla_printk KERN_WARNING "Configuration change detected: value=%x.\n" description {{ There was a change in the connection status of the local port. }} action {{ None recommended. }} class: unknown sl_severity: warning refcode: "" message: qla_printk KERN_ERR "Alert 84XX: panic recovery %04x %04x\n" description {{ Internal panic recovered on a 84xx adapter. }} action {{ None recommended. }} class: unknown sl_severity: warning refcode: "" message: qla_printk KERN_ERR "Alert 84XX: firmware version %x\n" description {{ Unknown asynchronous event from 84xx adapter. }} action {{ None recommended. }} class: firmware sl_severity: warning refcode: "" message: qla_printk KERN_ERR "Alert 84xx: Invalid Alert %04x %04x %04x\n" description {{ Unknown asynchronous event from 84xx adapter. }} action {{ None recommended. }} class: unknown sl_severity: warning refcode: "" message: qla_printk KERN_ERR "Invalid SCSI completion handle %d.\n" description {{ Command completion is for invalid command. }} action {{ None recommended. }} class: software sl_severity: warning refcode: "" message: qla_printk KERN_ERR "Invalid ISP SCSI completion handle\n" description {{ Command completion is for invalid command. }} action {{ None recommended. }} class: software sl_severity: warning refcode: "" message: qla_printk KERN_ERR "%s: Invalid completion handle (%x).\n" description {{ Command completion is for invalid command. }} action {{ None recommended. }} class: software sl_severity: warning refcode: "" message: qla_printk KERN_ERR "%s: Invalid completion handle (%x) -- timed-out.\n" description {{ SCSI layer has already timed out command. }} action {{ None recommended. }} class: software sl_severity: warning refcode: "" message: qla_printk KERN_ERR "%s: SRB handle (%x) mismatch %x.\n" description {{ Command completion is for invalid command. }} action {{ None recommended. }} class: software sl_severity: warning refcode: "" message: qla_printk KERN_WARNING "Command is NULL: already returned to OS (sp=%p)\n" description {{ Command already completed back to SCSI layer. }} action {{ None recommended. }} class: software sl_severity: warning refcode: "" message: qla_printk KERN_ERR "Error entry - invalid handle\n" description {{ Error status entry is invalid. }} action {{ None recommended. }} class: software sl_severity: warning refcode: "" message: qla_printk KERN_ERR "Additional code -- 0x55AA.\n" description {{ Extra debug information from checking the ASIC when it is frozen. }} action {{ None recommended. }} class: software sl_severity: warning refcode: "" message: qla_printk KERN_WARNING "MSI-X: Failed to enable support -- %d/%d Retry with %d vectors\n" description {{ System could not give us the number of MSI-X vectors request so retry with less. }} action {{ None recommended. }} class: software sl_severity: warning refcode: "" message: qla_printk KERN_WARNING "MSI-X: Failed to enable support, giving up -- %d/%d\n" description {{ Could not enable MSI-X support for this adapter. }} action {{ None recommended. }} class: software sl_severity: warning refcode: "" message: qla_printk KERN_ERR "MSI-X: Unable to register handler -- %x/%d.\n" description {{ Unable to register a specific MSI-X handler callback. }} action {{ None recommended. }} class: software sl_severity: warning refcode: "" message: qla_printk KERN_ERR "MSI-X: Falling back-to INTa mode -- %d.\n" description {{ Could not enable MSI so falling back to INTx for interrupt handling. }} action {{ None recommended. }} class: software sl_severity: warning refcode: "" message: qla_printk KERN_ERR "Failed to reserve interrupt %d already in use.\n" description {{ Could not reserve INTx IRQ. }} action {{ None recommended. }} class: software sl_severity: warning refcode: "" file: "drivers/scsi/qla2xxx/qla_mbx.c" message: qla_printk KERN_ERR "Mailbox command timeout occurred. Scheduling ISP abort. eeh_busy: 0x%x\n" description {{ Mailbox command to firmware timed out, reset ASIC. }} action {{ None recommended. }} class: firmware sl_severity: warning refcode: "" message: qla_printk KERN_ERR "Mailbox command timeout occurred. Issuing ISP abort.\n" description {{ Mailbox command to firmware timed out, reset ASIC. }} action {{ None recommended. }} class: firmware sl_severity: warning refcode: "" file: "drivers/scsi/qla2xxx/qla_mid.c" message: qla_printk KERN_ERR "Couldn't delete req que %d\n" description {{ Couldn't delete a request queue associated with a virtual port. }} action {{ None recommended. }} class: unknown sl_severity: warning refcode: "" message: qla_printk KERN_ERR "Couldn't delete rsp que %d\n" description {{ Couldn't delete a response queue associated with a virtual port. }} action {{ None recommended. }} class: software sl_severity: warning refcode: "" message: qla_printk KERN_ERR "could not allocate memory for request que\n" description {{ System has low memory. }} action {{ None recommended. }} class: software sl_severity: warning refcode: "" message: qla_printk KERN_ERR "Memory Allocation failed - request_ring\n" description {{ Coherant DMA memory allocation failed. }} action {{ None recommended. }} class: software sl_severity: warning refcode: "" message: qla_printk KERN_ERR "No resources to create additional request queue\n" description {{ Adapter has no more resources to create another request queue. }} action {{ None recommended. }} class: unknown sl_severity: warning refcode: "" message: qla_printk KERN_ERR "qla25xx_create_req_que failed\n" description {{ Failed to create a new request queue (beyond the base request queue). }} action {{ None recommended. }} class: unknown sl_severity: warning refcode: "" message: qla_printk KERN_ERR "could not allocate memory for response que\n" description {{ System has low memory. }} action {{ None recommended. }} class: unknown sl_severity: warning refcode: "" message: qla_printk KERN_ERR "Memory Allocation failed - response_ring\n" description {{ Coherant DMA memory allocation failed. }} action {{ None recommended. }} class: unknown sl_severity: warning refcode: "" message: qla_printk KERN_ERR "No resources to create additional response queue\n" description {{ Adapter has no more resources to create another response queue. }} action {{ None recommended. }} class: unknown sl_severity: warning refcode: "" message: qla_printk KERN_WARNING "msix not enabled\n" description {{ Adapter is not using MSI-X. }} action {{ None recommended. }} class: unknown sl_severity: warning refcode: "" message: qla_printk KERN_ERR "qla25xx_create_rsp_que failed\n" description {{ Failed to create a new response queue (beyond the base response queue). }} action {{ None recommended. }} class: software sl_severity: warning refcode: "" file: "drivers/scsi/qla2xxx/qla_os.c" message: qla_printk KERN_ERR "Unable to allocate memory for request queue ptrs\n" description {{ System low on memory. }} action {{ None recommended. }} class: software sl_severity: warning refcode: "" message: qla_printk KERN_ERR "Unable to allocate memory for response queue ptrs\n" description {{ System low on memory. }} action {{ None recommended. }} class: software sl_severity: warning refcode: "" message: qla_printk KERN_WARNING "Firmware is not multi-queue capable\n" description {{ The firmware for this adapter is not capable of multiple request or response queues. }} action {{ None recommended. }} class: firmware sl_severity: warning refcode: "" message: qla_printk KERN_ERR "Can't create request queue\n" description {{ A request to create a new request queue could not be fulfilled. }} action {{ None recommended. }} class: software sl_severity: warning refcode: "" message: qla_printk KERN_ERR "Response Queue create failed\n" description {{ A request to create a new response queue failed. }} action {{ None recommended. }} class: software sl_severity: warning refcode: "" message: qla_printk KERN_ERR "scsi(%ld:%d:%d): Abort handler timed out -- %lx\n" description {{ A request to abort a command timed out. }} action {{ None recommended. }} class: software sl_severity: warning refcode: "" message: qla_printk KERN_ERR "scsi(%ld:%d:%d): Abort command issued -- %d %lx %x.\n" description {{ A request to abort a command was issued from the SCSI layer. }} action {{ None recommended. }} class: software sl_severity: warning refcode: "" message: qla_printk KERN_INFO "scsi(%ld:%d:%d): %s RESET ISSUED.\n" description {{ A reset of a LUN was requested by the SCSI layer. }} action {{ None recommended. }} class: software type: info refcode: "" message: qla_printk KERN_INFO "scsi(%ld:%d:%d): %s RESET SUCCEEDED.\n" description {{ LUN reset succeeded. }} action {{ None recommended. }} class: software type: info refcode: "" message: qla_printk KERN_ERR "scsi(%ld:%d:%d): %s RESET FAILED: %s.\n" description {{ LUN reset failed. }} action {{ None recommended. }} class: software sl_severity: warning refcode: "" message: qla_printk KERN_INFO "scsi(%ld:%d:%d): BUS RESET ISSUED.\n" description {{ A bus reset was requested by the SCSI layer. }} action {{ None recommended. }} class: software type: info refcode: "" message: qla_printk KERN_INFO "qla2xxx_eh_bus_reset reset succeeded.\n" description {{ bus reset succeeded. }} action {{ None recommended. }} class: software type: info refcode: "" message: qla_printk KERN_INFO "scsi(%ld:%d:%d): ADAPTER RESET ISSUED.\n" description {{ A reset of the adapter was requested by the SCSI layer. }} action {{ None recommended. }} class: software type: info refcode: "" message: qla_printk KERN_INFO "qla2xxx_eh_host_reset reset succeeded.\n" description {{ Adapter reset succeeded. }} action {{ None recommended. }} class: software type: info refcode: "" message: qla_printk KERN_ERR "Failed to reserve PIO/MMIO regions (%s)\n" description {{ PCI layer could not reserve device resources. }} action {{ None recommended. }} class: software sl_severity: warning refcode: "" message: qla_printk KERN_ERR "Invalid PCI I/O region size (%s)...\n" description {{ PCI I/O memory region for this adapter is an invalid size. }} action {{ None recommended. }} class: software sl_severity: warning refcode: "" message: qla_printk KERN_WARNING "region #0 not a PIO resource (%s)...\n" description {{ Memory region 0 on the adapter is not a port I/O resource. }} action {{ None recommended. }} class: software sl_severity: warning refcode: "" message: qla_printk KERN_ERR "region #1 not an MMIO resource (%s), aborting\n" description {{ Memory region 1 on the adapter isn't a memory-mapped I/O resource so abort configuration. }} action {{ None recommended. }} class: software sl_severity: warning refcode: "" message: qla_printk KERN_ERR "Invalid PCI mem region size (%s), aborting\n" description {{ The memory-mapped I/O region of the adapter is an invalid size so abort configuration. }} action {{ None recommended. }} class: software sl_severity: warning refcode: "" message: qla_printk KERN_ERR "cannot remap MMIO (%s), aborting\n" description {{ ioremap() operation to map device memory into the kernel address space failed so abort configuration. }} action {{ None recommended. }} class: software sl_severity: warning refcode: "" message: qla_printk KERN_INFO "MSI-X vector count: %d\n" description {{ Number of MSI-X vectors for this adapter. }} action {{ None recommended. }} class: software type: info refcode: "" message: qla_printk KERN_WARNING "BAR 3 not enabled\n" description {{ This adapter is not capable of multiple request and response queues. }} action {{ None recommended. }} class: software sl_severity: warning refcode: "" message: qla_printk KERN_INFO "Found an ISP%04X, irq %d, iobase 0x%p\n" description {{ Information about adapter just found in probe routine. }} action {{ None recommended. }} class: software type: info refcode: "" message: qla_printk KERN_ERR "[ERROR] Failed to allocate memory for adapter\n" description {{ System has low memory. }} action {{ None recommended. }} class: software sl_severity: warning refcode: "" message: qla_printk KERN_ERR "[ERROR] Failed to allocate memory for scsi_host\n" description {{ System has low memory. }} action {{ None recommended. }} class: software sl_severity: warning refcode: "" message: qla_printk KERN_ERR "[ERROR] Failed to allocate memory for queue pointers\n" description {{ System has low memory. }} action {{ None recommended. }} class: software sl_severity: warning refcode: "" message: qla_printk KERN_ERR "Failed to initialize adapter\n" description {{ Error starting firmware. }} action {{ None recommended. }} class: software sl_severity: warning refcode: "" message: qla_printk KERN_WARNING "Can't create queues, falling back to single queue mode\n" description {{ Setting up multiqueue mode failed so fall back to a single request and response queue. }} action {{ None recommended. }} class: software sl_severity: warning refcode: "" message: qla_printk KERN_ERR "Unable to start DPC thread!\n" description {{ Could not start deferred procedure kernel thread. }} action {{ None recommended. }} class: software sl_severity: warning refcode: "" message: qla_printk KERN_INFO " QLogic Fibre Channel HBA Driver: %s QLogic %s - %s ISP%04X: %s @ %s hdma%c, host#=%ld, fw=%s\n" description {{ Info about adapter just configured. }} action {{ None recommended. }} class: software type: info refcode: "" message: qla_printk KERN_ERR "Unable to allocate memory for rsp\n" description {{ System low on memory. }} action {{ None recommended. }} class: software sl_severity: warning refcode: "" message: qla_printk KERN_ERR "Unable to allocate memory for rsp_ring\n" description {{ System low on memory. }} action {{ None recommended. }} class: software sl_severity: warning refcode: "" message: qla_printk KERN_ERR "Unable to allocate memory for npiv info\n" description {{ System low on memory. }} action {{ None recommended. }} class: software sl_severity: warning refcode: "" message: qla_printk KERN_ERR "qla2x00_do_dpc: dpc_flags: %lx\n" description {{ Allocating Scsi_host struct from SCSI layer failed. }} action {{ None recommended. }} class: software sl_severity: warning refcode: "" message: qla_printk KERN_ERR "Loop down - aborting ISP.\n" description {{ Local port has been down for over 4 minutes, reset ASIC. }} action {{ None recommended. }} class: software sl_severity: warning refcode: "" message: qla_printk KERN_ERR "RISC paused -- mmio_enabled, Dumping firmware!\n" description {{ ASIC is frozen after a AER recovery so perform a firware dump. }} action {{ None recommended. }} class: software sl_severity: warning refcode: "" message: qla_printk KERN_ERR "Can't re-enable PCI device after reset.\n" description {{ Adapter failed to restart after a PCIe slot reset. }} action {{ None recommended. }} class: software sl_severity: warning refcode: "" message: qla_printk KERN_ERR "the device failed to resume I/O from slot/link_reset\n" description {{ Adapter failed to restart after AER recovery. }} action {{ None recommended. }} class: software sl_severity: warning refcode: "" file: "drivers/scsi/qla2xxx/qla_sup.c" message: qla_printk KERN_ERR "Inconsistent FLTL detected: checksum=0x%x.\n" description {{ Firmware Layout Table signature not valid. }} action {{ None recommended. }} class: software sl_severity: warning refcode: "" message: qla_printk KERN_ERR "NPIV-Config: Failed to create vport [%02x]: wwpn=%llx wwnn=%llx.\n" description {{ Predefined virtual port stored in flash could not be created. }} action {{ None recommended. }} class: software sl_severity: warning refcode: "" message: qla_printk KERN_ERR "Unable to allocate memory for optrom burst write (%x KB).\n" description {{ Coherant DMA memory allocation failed. }} action {{ None recommended. }} class: software sl_severity: warning refcode: "" message: qla_printk KERN_ERR "Unable to unprotect flash for update.\n" description {{ Turning off write-protection for onboard flash memory failed. }} action {{ None recommended. }} class: software sl_severity: warning refcode: "" message: qla_printk KERN_WARNING "Unable to burst-write optrom segment (%x/%x/%llx).\n" description {{ Cannot use fast flash write method so use slower method. }} action {{ None recommended. }} class: software sl_severity: warning refcode: "" message: qla_printk KERN_ERR "Unable to protect flash after update.\n" description {{ Reenable of write protection for onboard flash memory failed. }} action {{ None recommended. }} class: software sl_severity: warning refcode: "" message: qla_printk KERN_ERR "Unable to update fw options (beacon on).\n" description {{ Unable to set beacon blinking functionality. }} action {{ None recommended. }} class: software sl_severity: warning refcode: "" message: qla_printk KERN_ERR "Unable to update fw options (beacon off).\n" description {{ Unable to turn off beacon blinking functionality. }} action {{ None recommended. }} class: software sl_severity: warning refcode: "" message: qla_printk KERN_ERR "Unable to get fw options (beacon off).\n" description {{ Unable to read firmware options for this adapter. }} action {{ None recommended. }} class: software sl_severity: warning refcode: "" message: qla_printk KERN_ERR "Unable to allocate memory for optrom burst read (%x KB).\n" description {{ Coherant DMA memory allocation failed. }} action {{ None recommended. }} class: software sl_severity: warning refcode: "" message: qla_printk KERN_WARNING "Unable to burst-read optrom segment (%x/%x/%llx).Reverting to slow-read\n" description {{ Cannot use fast flash read method so use slower method. }} action {{ None recommended. }} class: software sl_severity: warning refcode: "" ppc64-diag-2.6.4/ela/message_catalog/ipr0000644000000000000000000010162612313010662016453 0ustar rootrootsubsystem: scsi file: "drivers/scsi/ipr.c" message[defensive]: dev_err "Failed to save PCI-X command register\n" message[defensive]: dev_err "Failed to setup PCI-X command register\n" message[defensive]: dev_err "Host RCB failed with IOASC: 0x%08X\n" /***** * Skipping all of the following because they report additional info * subsequent to "real" error messages. 979: ipr_hcam_err(hostrcb, "%s VPID/SN: %s\n" 998: ipr_err("Vendor/Product ID: %s\n" 1002: ipr_err(" Serial Number: %s\n" 1018: ipr_hcam_err(hostrcb, "%s WWN: %08X%08X\n" 1032: ipr_err(" WWN: %08X%08X\n" 1050: ipr_err("-----Current Configuration-----\n" 1051: ipr_err("Cache Directory Card Information:\n" 1053: ipr_err("Adapter Card Information:\n" 1056: ipr_err("-----Expected Configuration-----\n" 1057: ipr_err("Cache Directory Card Information:\n" 1059: ipr_err("Adapter Card Information:\n" 1062: ipr_err("Additional IOA Data: %08X %08X %08X\n" 1082: ipr_err("-----Current Configuration-----\n" 1083: ipr_err("Cache Directory Card Information:\n" 1085: ipr_err("Adapter Card Information:\n" 1088: ipr_err("-----Expected Configuration-----\n" 1089: ipr_err("Cache Directory Card Information:\n" 1091: ipr_err("Adapter Card Information:\n" 1094: ipr_err("Additional IOA Data: %08X %08X %08X\n" 1118: ipr_err("Device Errors Detected/Logged: %d/%d\n" 1126: ipr_phys_res_err(ioa_cfg, dev_entry->dev_res_addr, "Device %d", i + 1); 1129: ipr_err("-----New Device Information-----\n" 1132: ipr_err("Cache Directory Card Information:\n" 1135: ipr_err("Adapter Card Information:\n" 1158: ipr_err("Device Errors Detected/Logged: %d/%d\n" 1166: ipr_phys_res_err(ioa_cfg, dev_entry->dev_res_addr, "Device %d", i + 1); 1169: ipr_err("-----New Device Information-----\n" 1172: ipr_err("Cache Directory Card Information:\n" 1175: ipr_err("Adapter Card Information:\n" 1178: ipr_err("Additional IOA Data: %08X %08X %08X %08X %08X\n" 1207: ipr_err("RAID %s Array Configuration: %d:%d:%d:%d\n" 1225: ipr_err("Exposed Array Member %d:\n" 1227: ipr_err("Array Member %d:\n" 1230: ipr_phys_res_err(ioa_cfg, array_entry->dev_res_addr, "Current Location"); 1231: ipr_phys_res_err(ioa_cfg, array_entry->expected_dev_res_addr, "Expected Location"); 1258: ipr_err("RAID %s Array Configuration: %d:%d:%d:%d\n" 1274: ipr_err("Exposed Array Member %d:\n" 1276: ipr_err("Array Member %d:\n" 1280: ipr_phys_res_err(ioa_cfg, array_entry->dev_res_addr, "Current Location"); 1281: ipr_phys_res_err(ioa_cfg, array_entry->expected_dev_res_addr, "Expected Location"); 1313: ipr_err("%08X: %08X %08X %08X %08X\n" *****/ /***** * Omitting these because they could report any of a number of errors. 1338: ipr_hcam_err(hostrcb, "%s [PRC: %08X]\n" 1364: ipr_hcam_err(hostrcb, "%s [PRC: %08X]\n" *****/ /***** * Skipping all of the following because they report additional info * subsequent to "real" error messages. 1417: ipr_hcam_err(hostrcb, "%s %s: IOA Port=%d\n" 1421: ipr_hcam_err(hostrcb, "%s %s: IOA Port=%d, Phy=%d\n" 1425: ipr_hcam_err(hostrcb, "%s %s: IOA Port=%d, Cascade=%d\n" 1429: ipr_hcam_err(hostrcb, "%s %s: IOA Port=%d, Cascade=%d, Phy=%d\n" 1437: ipr_err("Path state=%02X IOA Port=%d Cascade=%d Phy=%d\n" 1509: ipr_hcam_err(hostrcb, "%s %s: Phy=%d, Link rate=%s, WWN=%08X%08X\n" 1515: ipr_hcam_err(hostrcb, "%s %s: Link rate=%s, WWN=%08X%08X\n" 1520: ipr_hcam_err(hostrcb, "%s %s: Phy=%d, Link rate=%s, " 1526: ipr_hcam_err(hostrcb, "%s %s: Cascade=%d, Link rate=%s, " 1532: ipr_hcam_err(hostrcb, "%s %s: Cascade=%d, Phy=%d, Link rate=%s " 1543: ipr_hcam_err(hostrcb, "Path element=%02X: Cascade=%d Phy=%d Link rate=%s " *****/ /***** * Omitting this because it could report any of a number of errors. 1567: ipr_hcam_err(hostrcb, "%s\n" *****/ message[defensive]: dev_err "Error notifications lost\n" message[defensive]: dev_err "Host RCB failed with IOASC: 0x%08X\n" message[defensive]: dev_err "Adapter being reset due to command timeout.\n" message[defensive]: dev_err "Adapter timed out transitioning to operational.\n" message[defensive]: dev_err "IOA dump long data transfer timeout\n" message[defensive]: dev_err "IOA dump short data transfer timeout\n" message[defensive]: dev_err "Invalid dump table format: %lx\n" message[defensive]: dev_err "Dump of IOA initiated\n" message[defensive]: dev_err "Dump of IOA failed. Dump table not valid: %d, %X.\n" message[defensive]: dev_err "Dump of IOA completed.\n" message[chatter]: dev_info "%s adapter write cache.\n" message[defensive]: dev_err "Microcode download already in progress\n" message[defensive]: dev_err "Failed to map microcode download buffer!\n" message[defensive]: dev_err "Firmware file %s not found\n" message[defensive]: dev_err "Invalid microcode buffer\n" message[defensive]: dev_err "Microcode buffer allocation failed\n" message[defensive]: dev_err "Microcode buffer copy to DMA buffer failed\n" message[defensive]: ipr_err "Dump memory allocation failed\n" message[defensive]: dev_err "Adapter being reset as a result of error recovery.\n" message[defensive]: scmd_printk KERN_ERR "Resetting device\n" message[defensive]: sdev_printk KERN_ERR "Abort timed out. Resetting bus.\n" message[defensive]: scmd_printk KERN_ERR "Aborting command: %02X\n" message[defensive]: dev_err "Permanent IOA failure. 0x%08X\n" message[defensive]: dev_err "Invalid response handle from IOA\n" message[defensive]: dev_err "pci_map_sg failed!\n" message[defensive]: scmd_printk KERN_ERR "Request Sense failed with IOASC: 0x%08X\n" /***** * Skipping the following because they report additional info * subsequent to "real" error messages. 4568: ipr_err("IOASA Dump:\n" 4571: ipr_err("%08X: %08X %08X %08X %08X\n" *****/ message[chatter]: dev_info "IOA initialized.\n" message[defensive]: dev_err "Term power is absent on scsi bus %d\n" message[defensive]: dev_err "Invalid resource address reported: 0x%08X\n" message[defensive]: dev_err "0x%02X failed with IOASC: 0x%08X\n" message[defensive]: dev_err "Microcode download required\n" message[defensive]: dev_err "Too many devices attached\n" message[chatter]: dev_info "Adapter firmware version: %02X%02X%02X%02X\n" message[chatter]: dev_info "Starting IOA initialization sequence.\n" message[chatter]: dev_info "Initializing IOA.\n" message[defensive]: dev_err "IOA unit check with no data\n" message[defensive]: dev_err "IOA taken offline - error recovery failed\n" message[defensive]: dev_dbg "ioa_cfg adx: 0x%p\n" message[defensive]: dev_err "Adapter not supported in this hardware configuration.\n" message[defensive]: dev_err "Can not assign irq %d\n" message[chatter]: dev_info "IRQ assigned: %d\n" message[chatter]: dev_info "MSI test failed. Falling back to LSI.\n" message[chatter]: dev_info "MSI test succeeded.\n" message[defensive]: dev_err "Cannot enable adapter\n" message[chatter]: dev_info "Found IOA with IRQ: %d\n" message[defensive]: dev_err "call to scsi_host_alloc failed!\n" message[defensive]: dev_err "Unknown adapter chipset 0x%04X 0x%04X\n" message[defensive]: dev_err "Couldn't register memory range of registers\n" message[defensive]: dev_err "Couldn't map memory range of registers\n" message[defensive]: dev_err "Failed to set PCI DMA mask\n" message[defensive]: dev_err "Write of cache line size failed\n" message[chatter]: dev_info "MSI enabled with IRQ: %d\n" message[chatter]: dev_info "Cannot enable MSI.\n" message[defensive]: dev_err "Failed to save PCI config space\n" message[defensive]: dev_err "Couldn't allocate enough memory for device driver!\n" message[defensive]: dev_err "Couldn't register IRQ %d! rc=%d\n" message[chatter]: ipr_info "IBM Power RAID SCSI Device Driver version: %s %s\n" /***** ***** The rest of this catlog was generated automatically from ***** ipr_error_table[]. *****/ message: ipr_hcam_err "FFF9: Device sector reassign successful\n" description {{ Device sector reassign successful. }} action {{ None required }} class: software type: info refcode: "" message: ipr_hcam_err "FFF7: Media error recovered by device rewrite procedures\n" description {{ Media error recovered by device rewrite procedures. }} action {{ None required }} class: unknown type: info refcode: "" message: ipr_hcam_err "7001: IOA sector reassignment successful\n" description {{ IOA sector reassignment successful }} action {{ If three 7001 messages have occurred for the same disk drive location, then exchange the failing items in the Failing Items list one at a time. If the problem is not resolved, perform “MAP 3351†on page 104 of the SAS Reference Guide - http://publib.boulder.ibm.com/infocenter/powersys/v3r1m5/topic/p7ebk/p7ebk.pdf }} class: unknown sl_severity: error refcode: "" message: ipr_hcam_err "FFF9: Soft media error. Sector reassignment recommended\n" description {{ Soft media error. Sector reassignment recommended. }} action {{ None required }} class: software type: info refcode: "" message: ipr_hcam_err "FFF7: Media error recovered by IOA rewrite procedures\n" description {{ Media error recovered by IOA rewrite procedures. }} action {{ None required }} class: unknown type: info refcode: "" message: ipr_hcam_err "FF3D: Soft PCI bus error recovered by the IOA\n" description {{ Soft PCI bus error recovered by the IOA. }} action {{ If 10 FF3D messages have occurred for the same I/O Adapter physical location within a week, then exchange the failing items in the Failing Items list one at a time. }} class: hardware sl_severity: error refcode: "" message: ipr_res_err "FFF6: Device hardware error recovered by the IOA\n" description {{ Device hardware error recovered by the IOA. }} action {{ None required }} class: hardware type: info refcode: "" message: ipr_hcam_err "FFF6: Device hardware error recovered by the IOA\n" description {{ Device hardware error recovered by the IOA. }} action {{ None required }} class: hardware type: info refcode: "" message: ipr_hcam_err "FFF6: Device hardware error recovered by the device\n" description {{ Device hardware error recovered by the device. }} action {{ None required }} class: hardware type: info refcode: "" message: ipr_res_err "FF3D: Soft IOA error recovered by the IOA\n" description {{ Soft IOA error recovered by the IOA. }} action {{ If 10 FF3D messages have occurred for the same I/O Adapter physical location within a week, then exchange the failing items in the Failing Items list one at a time. }} class: unknown sl_severity: error refcode:"" message: ipr_hcam_err "FF3D: Soft IOA error recovered by the IOA\n" description {{ Soft IOA error recovered by the IOA. }} action {{ If 10 FF3D messages have occurred for the same I/O Adapter physical location within a week, then exchange the failing items in the Failing Items list one at a time. }} class: unknown type: info refcode: "" message: ipr_hcam_err "FFFA: Undefined device response recovered by the IOA\n" description {{ Undefined device response recovered by the IOA. }} action {{ If 10 FFFA messages have occurred for the same disk drive location in a one-week time period, then exchange the failing items in the Failing Items list one at a time. If the problem is not resolved, perform “MAP 3351†on page 104 of the SAS Reference Guide - http://publib.boulder.ibm.com/infocenter/powersys/v3r1m5/topic/p7ebk/p7ebk.pdf }} class: unknown sl_severity: error refcode: "" message: ipr_hcam_err "FFF6: Failure prediction threshold exceeded\n" description {{ Failure prediction threshold exceeded. }} action {{ Exchange the failing items in the Failing Items list one at a time. If the problem is not resolved, perform “MAP 3351†on page 104 of the SAS Reference Guide - http://publib.boulder.ibm.com/infocenter/powersys/v3r1m5/topic/p7ebk/p7ebk.pdf }} class: unknown type: info refcode: "" message: ipr_hcam_err "8009: Impending cache battery pack failure\n" description {{ Impending cache battery pack failure. }} action {{ Perform “MAP 3300†on page 90 of the SAS Reference Guide - http://publib.boulder.ibm.com/infocenter/powersys/v3r1m5/topic/p7ebk/p7ebk.pdf }} class: hardware sl_severity: error refcode: "" message: ipr_hcam_err "3020: Storage subsystem configuration error\n" description {{ Storage subsystem configuration error. }} action {{ Perform “MAP 3350†on page 101 of the SAS Reference Guide - http://publib.boulder.ibm.com/infocenter/powersys/v3r1m5/topic/p7ebk/p7ebk.pdf }} class: software sl_severity: error refcode: "" message: ipr_hcam_err "FFF3: Disk media format bad\n" description {{ Disk media format bad. }} action {{ Perform “MAP 3335†on page 97 of the SAS Reference Guide - http://publib.boulder.ibm.com/infocenter/powersys/v3r1m5/topic/p7ebk/p7ebk.pdf }} class: hardware sl_severity: error refcode: "" message: ipr_hcam_err "3002: Addressed device failed to respond to selection\n" description {{ Addressed device failed to respond to selection. }} action {{ Exchange the failing items in the Failing Items list one at a time. If the problem is not resolved, perform “MAP 3351†on page 104 of the SAS Reference Guide - http://publib.boulder.ibm.com/infocenter/powersys/v3r1m5/topic/p7ebk/p7ebk.pdf }} class: hardware sl_severity: error refcode: "" message: ipr_res_err "3100: Device bus error\n" description {{ Device bus error. }} action {{ A SAS fabric error occurred. Perform “MAP 3350†on page 101 of the SAS Reference Guide - http://publib.boulder.ibm.com/infocenter/powersys/v3r1m5/topic/p7ebk/p7ebk.pdf }} class: hardware sl_severity: error refcode: "" message: ipr_hcam_err "3100: Device bus error\n" description {{ Device bus error. }} action {{ A SAS fabric error occurred. Perform “MAP 3350†on page 101 of the SAS Reference Guide - http://publib.boulder.ibm.com/infocenter/powersys/v3r1m5/topic/p7ebk/p7ebk.pdf }} class: hardware sl_severity: error refcode: "" message: ipr_hcam_err "3109: IOA timed out a device command\n" description {{ IOA timed out a device command. }} action {{ Perform “MAP 3350†on page 101 of the SAS Reference Guide - http://publib.boulder.ibm.com/infocenter/powersys/v3r1m5/topic/p7ebk/p7ebk.pdf }} class: unknown sl_severity: error refcode: "" message: ipr_hcam_err "4100: Hard device bus fabric error\n" description {{ Hard device bus fabric error. }} action {{ Perform “MAP 3352†on page 105 of the SAS Reference Guide - http://publib.boulder.ibm.com/infocenter/powersys/v3r1m5/topic/p7ebk/p7ebk.pdf }} class: unknown sl_severity: error refcode: "" message: ipr_hcam_err "9000: IOA reserved area data check\n" description {{ IOA reserved area data check. }} action {{ Perform “MAP 3390†on page 106 of the SAS Reference Guide - http://publib.boulder.ibm.com/infocenter/powersys/v3r1m5/topic/p7ebk/p7ebk.pdf }} class: software type: info refcode: "" message: ipr_hcam_err "9001: IOA reserved area invalid data pattern\n" description {{ IOA reserved area invalid data pattern. }} action {{ Perform “MAP 3337†on page 98 of the SAS Reference Guide - http://publib.boulder.ibm.com/infocenter/powersys/v3r1m5/topic/p7ebk/p7ebk.pdf }} class: unknown sl_severity: error refcode: "" message: ipr_hcam_err "9002: IOA reserved area LRC error\n" description {{ IOA reserved area LRC error. }} action {{ Perform “MAP 3390†on page 106 of the SAS Reference Guide - http://publib.boulder.ibm.com/infocenter/powersys/v3r1m5/topic/p7ebk/p7ebk.pdf }} class: unknown sl_severity: error refcode: "" message: ipr_hcam_err "102E: Out of alternate sectors for disk storage\n" description {{ Out of alternate sectors for disk storage. }} action {{ Exchange the failing items in the Failing Items list one at a time. If the problem is not resolved, perform MAP 3351 on page 104 of the SAS Reference Guide - http://publib.boulder.ibm.com/infocenter/powersys/v3r1m5/topic/p7ebk/p7ebk.pdf }} class: unknown sl_severity: error refcode: "" message: ipr_res_err "FFF4: Data transfer underlength error\n" description {{ Data transfer underlength error. }} action{{ Exchange the failing items in the Failing Items list one at a time. If the problem is not resolved, perform “MAP 3351†on page 104 of the SAS Reference Guide - http://publib.boulder.ibm.com/infocenter/powersys/v3r1m5/topic/p7ebk/p7ebk.pdf }} class: unknown sl_severity: error refcode: "" message: ipr_hcam_err "FFF4: Data transfer underlength error\n" description {{ Data transfer underlength error. }} action {{ Exchange the failing items in the Failing Items list one at a time. If the problem is not resolved, perform “MAP 3351†on page 104 of the SAS Reference Guide - http://publib.boulder.ibm.com/infocenter/powersys/v3r1m5/topic/p7ebk/p7ebk.pdf }} class: unknown sl_severity: error refcode: "" message: ipr_res_err "FFF4: Data transfer overlength error\n" description {{ Data transfer overlength error. }} action {{ Exchange the failing items in the Failing Items list one at a time. If the problem is not resolved, perform “MAP 3351†on page 104 of the SAS Reference Guide - http://publib.boulder.ibm.com/infocenter/powersys/v3r1m5/topic/p7ebk/p7ebk.pdf }} class: software sl_severity: error refcode: "" message: ipr_hcam_err "FFF4: Data transfer overlength error\n" description {{ Data transfer overlength error. }} action {{ Exchange the failing items in the Failing Items list one at a time. If the problem is not resolved, perform “MAP 3351†on page 104 of the SAS Reference Guide - http://publib.boulder.ibm.com/infocenter/powersys/v3r1m5/topic/p7ebk/p7ebk.pdf }} class: unknown sl_severity: error refcode: "" message: ipr_hcam_err "3400: Logical unit failure\n" description {{ Device, I/O Adapter, Any device on I/O bus, Signal cables. }} action {{ Exchange the failing items in the Failing Items list one at a time. }} class: hardware sl_severity: error refcode: "" message: ipr_hcam_err "FFF4: Device microcode is corrupt\n" description {{ Device microcode is corrupt. }} action {{ Exchange the failing items in the Failing Items list one at a time. If the problem is not resolved, perform “MAP 3351†on page 104 of the SAS Reference Guide - http://publib.boulder.ibm.com/infocenter/powersys/v3r1m5/topic/p7ebk/p7ebk.pdf }} class: unknown sl_severity: error refcode: "" message: ipr_res_err "8150: PCI bus error\n" description {{ PCI bus error. }} action {{ If two errors have occurred for the same I/O adapter in 24 hours, exchange the failing items in the Failing Items list one at a time. }} class: hardware sl_severity: error refcode: "" message: ipr_hcam_err "8150: PCI bus error\n" description {{ PCI bus error. }} action {{ If two errors have occurred for the same I/O adapter in 24 hours, exchange the failing items in the Failing Items list one at a time. }} class: hardware sl_severity: error refcode: "" message: ipr_res_err "FFF4: Disk device problem\n" description {{ Disk device problem. }} action {{ Exchange the failing items in the Failing Items list one at a time. If the problem is not resolved, perform “MAP 3351†on page 104 of the SAS Reference Guide - http://publib.boulder.ibm.com/infocenter/powersys/v3r1m5/topic/p7ebk/p7ebk.pdf }} class: hardware sl_severity: error refcode: "" message: ipr_hcam_err "FFF4: Disk device problem\n" description {{ Disk device problem. }} action {{ Exchange the failing items in the Failing Items list one at a time. If the problem is not resolved, perform “MAP 3351†on page 104 of the SAS Reference Guide - http://publib.boulder.ibm.com/infocenter/powersys/v3r1m5/topic/p7ebk/p7ebk.pdf }} class: hardware sl_severity: error refcode: "" message: ipr_res_err "8150: Permanent IOA failure\n" description {{ Permanent IOA failure. }} action {{ Exchange the failing items in the Failing Items list one at a time. }} class: unknown sl_severity: error refcode: "" message: ipr_hcam_err "8150: Permanent IOA failure\n" description {{ Permanent IOA failure. }} action {{ Exchange the failing items in the Failing Items list one at a time. }} class: unknown sl_severity: error refcode: "" message: ipr_hcam_err "3010: Disk device returned wrong response to IOA\n" description {{ Disk device returned wrong response to IOA. }} action {{ Exchange the failing items in the Failing Items list one at a time. If the problem is not resolved, perform “MAP 3351†on page 104 of the SAS Reference Guide - http://publib.boulder.ibm.com/infocenter/powersys/v3r1m5/topic/p7ebk/p7ebk.pdf }} class: unknown sl_severity: error refcode: "" message: ipr_hcam_err "8151: IOA microcode error\n" description {{ IOA microcode error. }} action {{ Update adapter microcode. See “Updating the controller microcode†on page 63 of the SAS Reference Guide - http://publib.boulder.ibm.com/infocenter/powersys/v3r1m5/topic/p7ebk/p7ebk.pdf If the problem is not resolved, exchange the failing items in the Failing Items list one at a time. }} class: unknown sl_severity: error refcode:"" message: ipr_hcam_err "8157: IOA error requiring IOA reset to recover\n" description {{ IOA error requiring IOA reset to recover. }} action {{ If two 8157 messages have occurred for the same I/O adapter location, exchange the failing items in the Failing Items list one at a time. }} class: unknown sl_severity: error refcode: "" message: ipr_hcam_err "8008: A permanent cache battery pack failure occurred\n" description {{ A permanent cache battery pack failure occurred. }} action {{ Perform “MAP 3300†on page 90 of the SAS Reference Guide - http://publib.boulder.ibm.com/infocenter/powersys/v3r1m5/topic/p7ebk/p7ebk.pdf }} class: hardware sl_severity: error refcode: "" message: ipr_hcam_err "9090: Disk unit has been modified after the last known status\n" description {{ Disk unit has been modified after the last known status. }} action {{ Perform “MAP 3333†on page 95 of the SAS Reference Guide - http://publib.boulder.ibm.com/infocenter/powersys/v3r1m5/topic/p7ebk/p7ebk.pdf }} class: hardware sl_severity: warning refcode: "" message: ipr_hcam_err "9081: IOA detected device error\n" description {{ IOA detected device error. }} action {{ Exchange the failing items in the Failing Items list one at a time. }} class: unknown sl_severity: error refcode: "" message: ipr_hcam_err "9082: IOA detected device error\n" description {{ IOA detected device error. }} action {{ Exchange the failing items in the Failing Items list one at a time. }} class: unknown sl_severity: error refcode: "" message: ipr_hcam_err "9091: Incorrect hardware configuration change has been detected\n" description {{ Incorrect hardware configuration change has been detected. }} action {{ Perform “MAP 3333†on page 95 of the SAS Reference Guide - http://publib.boulder.ibm.com/infocenter/powersys/v3r1m5/topic/p7ebk/p7ebk.pdf }} class: hardware sl_severity: error refcode: "" message: ipr_hcam_err "4010: Incorrect connection between cascaded expanders\n" description {{ Incorrect connection between cascaded expanders. }} action {{ Perform “MAP 3342†on page 99 of the SAS Reference Guide - http://publib.boulder.ibm.com/infocenter/powersys/v3r1m5/topic/p7ebk/p7ebk.pdf }} class: hardware sl_severity: error refcode: "" message: ipr_hcam_err "4020: Connections exceed IOA design limits\n" description {{ Connections exceed IOA design limits. }} action {{ Perform “MAP 3343†on page 99 of the SAS Reference Guide - http://publib.boulder.ibm.com/infocenter/powersys/v3r1m5/topic/p7ebk/p7ebk.pdf }} class: unknown sl_severity: error refcode: "" message: ipr_hcam_err "4030: Incorrect multipath connection\n" description {{ Incorrect multipath connection. }} action {{ Perform “MAP 3344†on page 100 of the SAS Reference Guide - http://publib.boulder.ibm.com/infocenter/powersys/v3r1m5/topic/p7ebk/p7ebk.pdf }} class: hardware sl_severity: error refcode: "" message: ipr_hcam_err "4110: Unsupported enclosure function\n" description {{ Unsupported enclosure function. }} action {{ Perform “MAP 3345†on page 100 of the SAS Reference Guide - http://publib.boulder.ibm.com/infocenter/powersys/v3r1m5/topic/p7ebk/p7ebk.pdf }} class: unknown sl_severity: error refcode: "" message: ipr_hcam_err "FFF4: Command to logical unit failed\n" description {{ Command to logical unit failed. }} action {{ Exchange the failing items in the Failing Items list one at a time. If the problem is not resolved, perform “MAP 3351†on page 104 of the SAS Reference Guide - http://publib.boulder.ibm.com/infocenter/powersys/v3r1m5/topic/p7ebk/p7ebk.pdf }} class: unknown sl_severity: error refcode: "" message: ipr_hcam_err "9031: Array protection temporarily suspended, protection resuming\n" description {{ Array protection temporarily suspended, protection resuming. }} action {{ Perform “MAP 3310†on page 91 of the SAS Reference Guide - http://publib.boulder.ibm.com/infocenter/powersys/v3r1m5/topic/p7ebk/p7ebk.pdf }} class: unknown type: info refcode: "" message: ipr_hcam_err "9040: Array protection temporarily suspended, protection resuming\n" description {{ Array protection temporarily suspended, protection resuming. }} action {{ No action required. The array is synching. Wait until the synch is complete. }} class: unknown type: info refcode: "" message: ipr_hcam_err "3020: IOA detected a SCSI bus configuration error\n" description {{ IOA detected a SCSI bus configuration error. }} action {{ Perform “MAP 3350†on page 101 of the SAS Reference Guide - http://publib.boulder.ibm.com/infocenter/powersys/v3r1m5/topic/p7ebk/p7ebk.pdf }} class: unknown sl_severity: error refcode: "" message: ipr_hcam_err "4040: Incomplete multipath connection between IOA and enclosure\n" description {{ Incomplete multipath connection between IOA and enclosure. }} action {{ Perform “MAP 3344†on page 100 of the SAS Reference Guide - http://publib.boulder.ibm.com/infocenter/powersys/v3r1m5/topic/p7ebk/p7ebk.pdf }} class: unknown sl_severity: error refcode: "" message: ipr_hcam_err "4041: Incomplete multipath connection between enclosure and device\n" description {{ Incomplete multipath connection between enclosure and device. }} action {{ Perform “MAP 3346†on page 100 of the SAS Reference Guide - http://publib.boulder.ibm.com/infocenter/powersys/v3r1m5/topic/p7ebk/p7ebk.pdf }} class: unknown sl_severity: error refcode: "" message: ipr_hcam_err "9075: Incomplete multipath connection between IOA and remote IOA\n" description {{ Incomplete multipath connection between IOA and remote IOA. }} action {{ Perform “MAP 3349†on page 101 of the SAS Reference Guide - http://publib.boulder.ibm.com/infocenter/powersys/v3r1m5/topic/p7ebk/p7ebk.pdf }} class: unknown sl_severity: error refcode: "" message: ipr_hcam_err "4050: Enclosure does not support a required multipath function\n" description {{ Enclosure does not support a required multipath function. }} action {{ Perform “MAP 3348†on page 101 of the SAS Reference Guide - http://publib.boulder.ibm.com/infocenter/powersys/v3r1m5/topic/p7ebk/p7ebk.pdf }} class: unknown sl_severity: error refcode: "" message: ipr_hcam_err "9041: Array protection temporarily suspended\n" description {{ Array protection temporarily suspended. }} action {{ Background array parity checking detected and errors corrected. Perform “MAP 3390†on page 106 of the SAS Reference Guide - http://publib.boulder.ibm.com/infocenter/powersys/v3r1m5/topic/p7ebk/p7ebk.pdf }} class: unknown sl_severity: warning refcode: "" message: ipr_hcam_err "9042: Corrupt array parity detected on specified device\n" description {{ Corrupt array parity detected on specified device. }} action {{ Perform “MAP 3390†on page 106 of the SAS Reference Guide - http://publib.boulder.ibm.com/infocenter/powersys/v3r1m5/topic/p7ebk/p7ebk.pdf }} class: unknown sl_severity: error refcode: "" message: ipr_hcam_err "9030: Array no longer protected due to missing or failed disk unit\n" description {{ Array no longer protected due to missing or failed disk unit. }} action {{ Perform “MAP 3310†on page 91 of the SAS Reference Guide - http://publib.boulder.ibm.com/infocenter/powersys/v3r1m5/topic/p7ebk/p7ebk.pdf }} class: unknown sl_severity: error refcode: "" message: ipr_hcam_err "9032: Array exposed but still protected\n" description {{ Array exposed but still protected. }} action {{ Perform “MAP 3310†on page 91 of the SAS Reference Guide - http://publib.boulder.ibm.com/infocenter/powersys/v3r1m5/topic/p7ebk/p7ebk.pdf }} class: unknown sl_severity: error refcode: "" message: ipr_hcam_err "4061: Multipath redundancy level got better\n" description {{ Multipath redundancy level got better. }} action {{ None required }} class: unknown type: info refcode: "" message: ipr_hcam_err "4060: Multipath redundancy level got worse\n" description {{ Multipath redundancy level got worse. }} action {{ Perform “MAP 3353†on page 106 of the SAS Reference Guide - http://publib.boulder.ibm.com/infocenter/powersys/v3r1m5/topic/p7ebk/p7ebk.pdf }} class: unknown sl_severity: error refcode: "" message: ipr_hcam_err "9008: IOA does not support functions expected by devices\n" description {{ IOA does not support functions expected by devices. }} action {{ Perform “MAP 3330†on page 94 of the SAS Reference Guide - http://publib.boulder.ibm.com/infocenter/powersys/v3r1m5/topic/p7ebk/p7ebk.pdf }} class: unknown sl_severity: warning refcode: "" message: ipr_hcam_err "9020: Array missing 2 or more devices with only 1 device present\n" description {{ Array missing 2 or more devices with only 1 device present. }} action {{ Perform “MAP 3311†on page 92 of the SAS Reference Guide - http://publib.boulder.ibm.com/infocenter/powersys/v3r1m5/topic/p7ebk/p7ebk.pdf }} class: hardware sl_severity: error refcode: "" message: ipr_hcam_err "9021: Array missing 2 or more devices with 2 or more devices present\n" description {{ Array missing 2 or more devices with 2 or more devices present. }} action {{ Perform “MAP 3311†on page 92 of the SAS Reference Guide - http://publib.boulder.ibm.com/infocenter/powersys/v3r1m5/topic/p7ebk/p7ebk.pdf }} class: hardware sl_severity: error refcode: "" message: ipr_hcam_err "9022: Exposed array is missing a required device\n" description {{ Exposed array is missing a required device. }} action {{ Perform “MAP 3311†on page 92 of the SAS Reference Guide - http://publib.boulder.ibm.com/infocenter/powersys/v3r1m5/topic/p7ebk/p7ebk.pdf }} class: hardware sl_severity: error refcode: "" message: ipr_hcam_err "9023: Array member(s) not at required physical locations\n" description {{ Array member(s) not at required physical locations. }} action {{ Perform “MAP 3312†on page 93 of the SAS Reference Guide - http://publib.boulder.ibm.com/infocenter/powersys/v3r1m5/topic/p7ebk/p7ebk.pdf }} class: hardware sl_severity: error refcode: "" message: ipr_hcam_err "9024: Array not functional due to present hardware configuration\n" description {{ Array not functional due to present hardware configuration. }} action {{ Perform “MAP 3390†on page 106 of the SAS Reference Guide - http://publib.boulder.ibm.com/infocenter/powersys/v3r1m5/topic/p7ebk/p7ebk.pdf }} class: hardware sl_severity: error refcode: "" message: ipr_hcam_err "9054: IOA resources not available due to previous problems\n" description {{ IOA resources not available due to previous problems. }} action {{ Perform “MAP 3321†on page 94 of the SAS Reference Guide - http://publib.boulder.ibm.com/infocenter/powersys/v3r1m5/topic/p7ebk/p7ebk.pdf }} class: unknown sl_severity: error refcode: "" message: ipr_hcam_err "9092: Disk unit requires initialization before use\n" description {{ Disk unit requires initialization before use. }} action {{ Perform “MAP 3334†on page 96 of the SAS Reference Guide - http://publib.boulder.ibm.com/infocenter/powersys/v3r1m5/topic/p7ebk/p7ebk.pdf }} class: unknown sl_severity: error refcode: "" message: ipr_hcam_err "9029: Incorrect hardware configuration change has been detected\n" description {{ Incorrect hardware configuration change has been detected. }} action {{ Perform “MAP 3390†on page 106 of the SAS Reference Guide - http://publib.boulder.ibm.com/infocenter/powersys/v3r1m5/topic/p7ebk/p7ebk.pdf }} class: hardware sl_severity: error refcode: "" message: ipr_hcam_err "9060: One or more disk pairs are missing from an array\n" description {{ One or more disk pairs are missing from an array. }} action {{ Perform “MAP 3311†on page 92 of the SAS Reference Guide - http://publib.boulder.ibm.com/infocenter/powersys/v3r1m5/topic/p7ebk/p7ebk.pdf }} class: hardware sl_severity: error refcode: "" message: ipr_hcam_err "9061: One or more disks are missing from an array\n" description {{ One or more disks are missing from an array. }} action {{ Perform “MAP 3311†on page 92 of the SAS Reference Guide - http://publib.boulder.ibm.com/infocenter/powersys/v3r1m5/topic/p7ebk/p7ebk.pdf }} class: hardware sl_severity: error refcode: "" message: ipr_hcam_err "9062: One or more disks are missing from an array\n" description {{ One or more disks are missing from an array. }} action {{ Perform “MAP 3311†on page 92 of the SAS Reference Guide - http://publib.boulder.ibm.com/infocenter/powersys/v3r1m5/topic/p7ebk/p7ebk.pdf }} class: hardware sl_severity: error refcode: "" message: ipr_hcam_err "9063: Maximum number of functional arrays has been exceeded\n" description {{ Maximum number of functional arrays has been exceeded. }} action {{ Perform “MAP 3390†on page 106 of the SAS Reference Guide - http://publib.boulder.ibm.com/infocenter/powersys/v3r1m5/topic/p7ebk/p7ebk.pdf }} class: hardware sl_severity: error refcode: "" ppc64-diag-2.6.4/ela/message_catalog/reporters0000644000000000000000000001233512313010662017704 0ustar rootroot/* * The reporters catalog. A reporter is a function or macro that's * used to log a message to syslog. Such macros typically prepend * a prefix (e.g., specifying the driver and/or device) and may specify * a severity level. This catalog captures that information. */ reporter: printk source: kernel reporter: dev_printk source: kernel aliases: dev_emerg(emerg) dev_alert(alert) dev_crit(crit) dev_err(err) dev_warn(warning) dev_notice(notice) dev_info(info) dev_dbg(debug) prefix_format: "%s %s: " prefix_args: driver device reporter: pr_err(err) source: kernel aliases: pr_emerg(emerg) pr_alert(alert) pr_crit(crit) pr_warning(warning) pr_notice(notice) pr_info(info) pr_debug(debug) prefix_format: "%s: " prefix_args: component device_arg: none /* used by cxgb3 driver */ reporter: CH_MSG source: kernel aliases: CH_DBG(debug) CH_ERR(err) CH_WARN(warning) CH_ALERT(alert) prefix_format: "cxgb3 %s: " prefix_args: adapter device_arg: adapter /* used by GPFS */ reporter: mmfs_pathfail(info) source: user prefix_format: "mmfs: Error=MMFS_PDISK_PATHFAIL, ID=%s, Tag=%s:%s: Location=%s, FRU=%s, WWID=%s, RecoveryGroup=%s, %s=%s, Pdisk=%s, Device=%s" prefix_args: id tag message location fru wwid recoverygroup empty declusteredarray pdisk device /* used by GPFS */ reporter: mmfs_failed(info) source: user prefix_format: "mmfs: Error=MMFS_PDISK_FAILED, ID=%s, Tag=%s:%s: Location=%s, FRU=%s, WWID=%s, RecoveryGroup=%s, DeclusteredArray=%s, Pdisk=%s, PdiskState=%s" prefix_args: id tag message location fru wwid recoverygroup declusteredarray pdisk pdiskstate device_arg: none /* used by GPFS */ reporter: mmfs_recovered(info) source: user prefix_format: "mmfs: Error=MMFS_PDISK_RECOVERED, ID=%s, Tag=%s:%s: Location=%s, FRU=%s, WWID=%s, RecoveryGroup=%s, DeclusteredArray=%s, Pdisk=%s" prefix_args: id tag message location fru wwid recoverygroup declusteredarray pdisk device_arg: none /*used by GPFS */ reporter: mmfs_replace(err) source: user prefix_format: "mmfs: Error=MMFS_REPLACE_PDISK, ID=%s, Tag=%s:%s: Location=%s, FRU=%s, WWID=%s, RecoveryGroup=%s, DeclusteredArray=%s, Pdisk=%s, Priority=%s, PdiskState=%s" prefix_args: id tag message location fru wwid recoverygroup declusteredarray pdisk priority pdiskstate device_arg: none /*used by GPFS */ reporter: mmfs_rebuild(err) source: user prefix_format: "mmfs: Error=MMFS_REBUILD_FAILED, ID=%s, Tag=%s:%s: RecoveryGroup=%s, DeclusteredArray=%s, RemainingRedundancy=%s" prefix_args: id tag mesage recoverygroup declusteredarray remainingredundancy device_arg: none /* used by e1000e driver */ reporter: e_printk source: kernel aliases: e_dbg(debug) e_info(info) e_notice(notice) e_warn(warning) e_err(err) prefix_format: "%s: %s: " prefix_args: device netdev /* used by e1000e driver */ reporter: hw_dbg(debug) source: kernel prefix_format: "%s: " prefix_args: netdev device_arg: netdev /* used by ipr driver */ reporter: ipr_ra_printk source: kernel /* * The "device" parameter logged by ipr_ra_printk() (and thus by ipr_ra_err() * and ipr_res_err()) is actually %d:%d:%d:%d -- host:bus:target:lun -- but * this together is taken as the device ID. * * ipr_hcam_err() can call ipr_ra_err() or dev_err(). What's the format * of the device ID when dev_err() is called, and which driver name is * reported? */ aliases: ipr_ra_err(err) ipr_res_err(err) ipr_hcam_err(err) prefix_format: "ipr: %s: " prefix_args: device /* used by ipr driver */ reporter: ipr_err(err) source: kernel aliases: ipr_info(info) ipr_dbg(debug) prefix_format: "ipr: " /* used by lpfc driver */ reporter: lpfc_printf_vlog source: kernel prefix_format: "lpfc %s: %d:(%d):%d " prefix_args: device FCBoardno vpi messageno /* used by lpfc driver */ reporter: lpfc_printf_log source: kernel prefix_format: "lpfc %s: %d:%d " prefix_args: device FCBoardno messageno /* used by qla2xxx driver -- calls dev_printk */ reporter: qla_printk source:kernel prefix_format: "qla2xxx %s: " prefix_args: device /* for ixgb device driver */ /* 3 prefix args */ reporter: netdev_printk3 source: kernel aliases: netdev_info3(info) netdev_err3(err) prefix_format: "%s %s: %s: " prefix_args: driver device netdev device_arg: netdev /* 1 prefix arg */ reporter: netdev_printk1 source: kernel aliases: netdev_info1(info) netdev_err1(err) prefix_format: "%s: " prefix_args: netdev device_arg: netdev /* 0 prefix args */ reporter: netdev_printk0 source: kernel aliases: netdev_info0(info) netdev_err0(err) prefix_format: "(NULL net_device): " meta_reporter: netif_info variants: netdev_info3 netdev_info1 netdev_info0 meta_reporter: netif_err variants: netdev_err3 netdev_err1 netdev_err0 /* from include/scsi/scsi_device.h -- just calls dev_printk */ reporter: sdev_printk source: kernel prefix_format: "%s %s: " prefix_args: driver device /* * from include/scsi/scsi_device.h * scmd_printk() can produce either of two message formats. If there's an * rq_disk associated with the request, the name of the disk is appended to * the message prefix. Otherwise it's equivalent to sdev_printk. So we * list scmd_printk as a meta-reporter that maps to either sdev_printk or * to the scmd_printk_disk pseudo-reporter. */ reporter: scmd_printk_disk source: kernel prefix_format: "%s %s: [%s] " prefix_args: driver device disk meta_reporter: scmd_printk variants: sdev_printk scmd_printk_disk ppc64-diag-2.6.4/ela/message_catalog/exceptions0000644000000000000000000000524312313010662020040 0ustar rootroot/* * The exceptions catalog. Can also be thought of as the "fallbacks" * catalog, since it provides a convenient shorthand for classifying * messages that we don't have explicit advice for. * * Given these fallbacks, there's very little excuse for excluding * any of your driver's messages from the catalog. * * Note that there's no exception type specifically for messages * that you deem self-explanatory. If it's a self-explanatory, * low-severity message (e.g., notice, info, debug), label it * "chatter". Otherwise it probably warrants a servicelog record, * so you need to provide the appropriate info. */ exception: chatter description {{ This message is logged as part of normal operations. }} action {{ No action required. }} exception: redundant description {{ No explanation is provided for this message because it typically accompanies one or more other messages for which explanations are provided. }} action {{ Refer to explanations for other messages logged at about the same time. If no such explanations can be found, please report this situation to your service provider. }} exception: fragment description {{ This line is the second or subsequent line in a multi-line message. }} action {{ Refer to explanations for messages logged previously at about the same time. }} /* * Use this for those defensive printks used to log failures that you * never expect to see. */ exception: defensive description {{ This message is not expected to be logged during normal operation or any anticipated failure scenario. No explanation is currently available. }} action {{ Refer to explanations of related messages, if any. Report this situation to your service provider. }} /* * Typically used with printks associated with ENOMEM failures. * A special case of "defensive" printks. */ exception: enomem description {{ This message typically indicates that the system is low on memory. }} action {{ Free up memory and retry the failed operation, or add memory to your system. }} exception: unknown description {{ We don't know why this message was logged. }} action {{ Refer to explanations of related messages, if any. Report this situation to your service provider. }} /* * Used to match messages that appear to come from our driver, but * are missing from our driver's message catalog. Typical usage: * message[catchall]: printk any "cxgb3 %s\n" * message[catchall]: printk any "cxgb3: %s\n" */ exception: catchall description {{ There is no match for this message in the message catalog. The message catalog may be out of sync with the related system software. }} action {{ Refer to explanations of related messages, if any. Report this situation to your service provider. }} ppc64-diag-2.6.4/ela/message_catalog/gpfs0000755000000000000000000000215712313010662016622 0ustar rootrootsubsystem: gpfs message: mmfs_failed "\n" description {{ A disk has failed or is not responding. The filesystem is still operational. }} action {{ Ignore }} class: software sl_severity: warning refcode: "" message: mmfs_pathfail "\n" description {{ A path to a disk is no longer usable. Probable cause: SAS adapter, cable, port expander or disk carrier. }} action {{ Ignore }} class: software sl_severity: warning refcode: "" message: mmfs_recovered "\n" description {{ A disk previously reported as not responding has been found and is working. }} action {{ Ignore }} class: software sl_severity: warning refcode: "" message: mmfs_replace "\n" description {{ The disk replacement threshold has been met for the given failed disk. The disk must be replaced. }} action {{ Notify administrator. }} class: software sl_severity: error refcode: "EF000001" message: mmfs_rebuild "\n" description {{ There is not enough available spare space to reestablish full redundancy in a declustered array. Customer may be in danger of data loss. }} action {{ Notify administrator. }} class: software sl_severity: error refcode: "EF000002" ppc64-diag-2.6.4/ela/message_catalog/lpfc0000644000000000000000000032546712313010662016620 0ustar rootrootsubsystem:net message: lpfc_printf_log KERN_WARNING "Abort outstanding I/O on NPort x%x\n" description {{ All outstanding I/Os are cleaned up on the specified remote NPort. DATA: (1) nlp_flag (2) nlp_state (3) nlp_rpi }} action {{ No action needed, informational. }} class: software type: info refcode: "" message: lpfc_printf_log KERN_WARNING "Active Mailbox cleared - mailbox timeout exiting\n" description {{ The mailbox timeout handler has determined that the driver is in the process of completing this mailbox command. }} action {{ No action needed, informational. }} class: software type: info refcode: "" message: lpfc_printf_log KERN_ERR "Adapter failed init, mbxCmd x%x READ_SPARM mbxStatus x%x\n" description {{ Adapter initialization failed when issuing a READ_SPARM mailbox command. }} action {{ This error could indicate a hardware or firmware problem. If the problem persists, report the error to Technical Support. }} class: unknown sl_severity: error refcode: "" message: lpfc_printf_log KERN_ERR "Adapter failed to get Option ROM version status x%x\n" description {{ The driver could not read the HBA’s option ROM. }} action {{ Reset the HBA. Ensure the adapter’s firmware is current. }} class: unknown sl_severity: error refcode: "" message: lpfc_printf_log KERN_ERR "Adapter failed to init, chipset, status reg x%x, FW Data: A8 x%x AC x%x\n" description {{ The adapter failed during powerup diagnostics after it was reset. }} action {{ This error could indicate a hardware or firmware problem.If the problem persists, report the error to Technical Support. }} class: unknown sl_severity: error refcode: "" message: lpfc_printf_log KERN_ERR "Adapter failed to init. Data: x%x x%x x%x\n" description {{ An error occurred when processing queue related tags for an HBA in a particular slot. DATA: (1) mbxCommand (2) mbxStatus (3) hbaqno }} action {{ Software driver error. If this problem persists, report these errors to Technical Support. }} class: unknown sl_severity: error refcode: "" message: lpfc_printf_log KERN_ERR "Adapter failed to init, mbxCmd x%x CONFIG_PORT, mbxStatus x%x Data: x%x\n" description {{ Adapter initialization failed when issuing a CONFIG_PORT mailbox command. DATA: (1) hbainit }} action {{ This error could indicate a hardware or firmware problem. Update the firmware. If the problem persists, report the error to Technical Support. }} class: unknown sl_severity: error refcode: "" message: lpfc_printf_log KERN_ERR "Adapter failed to init, mbxCmd x%x INIT_LINK, mbxStatus x%x\n" description {{ Adapter initialization failed when issuing an INIT_LINK mailbox command. }} action {{ This error could indicate a hardware or firmware problem. Update the firmware.If the problem persists,report the error to Technical Support. }} class: unknown sl_severity: error refcode: "" message: lpfc_printf_log KERN_ERR "Adapter failed to init, mbxCmd x%x READ_CONFIG, mbxStatus x%x\n" description {{ Adapter initialization failed when issuing a READ_CONFIG mailbox command. }} action {{ This error could indicate a hardware or firmware problem. Update the firmware.If the problem persists,report the error to Technical Support. }} class: unknown sl_severity: error refcode: "" message: lpfc_printf_log KERN_ERR "Adapter failed to init, mbxCmd x%x READ_REV, mbxStatus x%x\n" description {{ Adapter initialization failed when issuing a READ_REV mailbox command. }} action {{ This error could indicate a hardware or firmware problem. Update the firmware.If the problem persists,report the error to Technical Support. }} class: unknown sl_severity: error refcode: "" message: lpfc_printf_log KERN_ERR "Adapter failed to init, READ_REV has missing revision information.\n" description {{ A firmware revision initialization error was detected. }} action {{ This error could indicate a hardware or firmware problem. Update the firmware.If the problem persists,report the error to Technical Support. }} class: unknown sl_severity: error refcode: "" message: lpfc_printf_log KERN_ERR "Adapter failed to init, timeout, status reg x%x, FW Data: A8 x%x AC x%x\n" description {{ The adapter failed during powerup diagnostics after it was reset. }} action {{ This error could indicate a hardware or firmware problem.If the problem persists, report the error to Technical Support. }} class: unknown sl_severity: error refcode: "" message: lpfc_printf_log KERN_ERR "Adapter failed to issue ASYNCEVT_ENABLE mbox status x%x\n" description {{ The mailbox command to enable an asynchronous event notification failed. }} action {{ Ensure the adapter firmware is current. Reload the driver. }} class: firmware sl_severity: error refcode: "" message: lpfc_printf_log KERN_ERR "Adapter failed to issue DOWN_LINK mbox command rc 0x%x\n" description {{ The driver was unable to issue the Down Link Mailbox command. }} action {{ None required }} class: software sl_severity: warning refcode: "" message: lpfc_printf_log KERN_ERR "Adapter Hardware Error Data: x%x x%x x%x\n" description {{ The driver received an interrupt indicating a possible hardware problem. Data: (1) status (2) status1 (3) status2 }} action {{ This error could indicate a hardware or firmware problem. If the problem persists, report the error to Technical Support. }} class: unknown sl_severity: error refcode: "" message: lpfc_printf_log KERN_ERR "Adapter heartbeat failure, taking this port offline.\n" description {{ The Heartbeat mailbox command failed. }} action {{ Ensure the adapter firmware is current. Reload the driver. }} class: firmware sl_severity: error refcode: "" message: lpfc_printf_log KERN_ERR "Adapter is very hot, please take corrective action. temperature : %d Celsius\n" description {{ Adapter temperature is above normal range. DATA: Temperature in Celsius }} action {{ Shutdown and remove the HBA. Contact Technical Support. }} class: hardware sl_severity: error refcode: "" message: lpfc_printf_log KERN_ERR "Adapter Link is disabled.\n" description {{ The adapterl link has been disabled. }} action {{ None required }} class: unknown sl_severity: warning refcode: "" message: lpfc_printf_log KERN_INFO "Adapter temperature is OK now. temperature : %d Celsius\n" description {{ Adapter temperature has reverted to normal range. DATA: Temperature in Celsius }} action {{ No action needed, informational. }} class: hardware type: info refcode: "" message: lpfc_printf_log KERN_ERR "ADD_FCF_RECORD mailbox failed with status 0x%x\n" description {{ The mailbox command to add the FCF record has failed. }} action {{ None required }} class: software sl_severity: warning refcode: "" message: lpfc_printf_log KERN_ERR "ADD_FCF_RECORD mailbox failed with status x%x add_status x%x\n" description {{ The mailbox command to add the FCF record has failed. }} action {{ None required }} class: software sl_severity: warning refcode: "" message: lpfc_printf_log KERN_ERR "Bad hbq tag. Data: x%x x%x\n" description {{ An error occurred when processing queue related tags for an HBA in a particular slot. DATA: (1) tag (2) buffer_count }} action {{ Software driver error. If this problem persists, report these errors to Technical Support. }} class: software sl_severity: error refcode: "" message: lpfc_printf_log KERN_WARNING "Block sgl registration required DMA size (%d) great than a page\n" description {{ The request to post SGL pages does not fit on a page. }} action {{ No action needed, informational. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_log KERN_INFO "Bring Adapter offline\n" description {{ The FC driver has received a request to bring the adapter offline. This may occur when running lputil. }} action {{ No action needed, informational. }} class: software type: info refcode: "" message: lpfc_printf_log KERN_INFO "Bring Adapter online\n" description {{ The FC driver has received a request to bring the adapter online. This may occur when running lputil. }} action {{ No action needed, informational. }} class: software type: info refcode: "" message: lpfc_printf_log KERN_ERR "Cannot find virtual addr for buffer tag on ring %d Data x%lx x%p x%p x%x\n" description {{ DMA buffer is not available for this unsolicited command. DATA: (1) tag (2) next (3) prev (4) postbufq_cnt }} action {{ None required. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_log KERN_ERR "Cannot find virtual addr for mapped buf on ring %d Data x%llx x%p x%p x%x\n" description {{ The driver cannot find the specified buffer in its mapping table. Thus it cannot find the virtual address needed to access the data. DATA: (1) phys (2) next (3) prev (4) postbufq_cnt }} action {{ This error could indicate a software driver or firmware problem. If the problem persists report these errors to Technical Support. }} class: software sl_severity: error refcode: "" message: lpfc_printf_log KERN_ERR "Cannot re-enable interrupt after slot reset.\n" description {{ The driver was not able to enable the interrupt after an HBA reset. }} action {{ Unload and reload the driver. }} class: software sl_severity: error refcode: "" message: lpfc_printf_log KERN_ERR "Clear Virtual Link Received for VPI 0x%x tag 0x%x\n" description {{ A Clear virtual link was received from the Fabric for this VPI. }} action {{ None required. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_log KERN_WARNING "Config MSI mailbox command failed, mbxCmd x%x, mbxStatus x%x\n" description {{ The mailbox command sent to the firmware to configure the HBA to use MSI-X has failed. }} action {{ Ensure the hardware platform supports MSI-X. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_log KERN_ERR "Config Port initialization error, mbxCmd x%x READ_NVPARM, mbxStatus x%x\n" description {{ A read nvparams mailbox command failed during port configuration. }} action {{ This error could indicate a software driver, firmware or hardware problem. Report these errors to Technical Support. }} class: unknown sl_severity: error refcode: "" message: lpfc_printf_log KERN_ERR "Config region 23 has bad signature\n" description {{ Configuration region 23 has an invalid signature. }} action {{ None required. }} class: unknown sl_severity: warning refcode: "" message: lpfc_printf_log KERN_ERR "Config region 23 has bad version\n" description {{ The driver was unable to read Config Region 23 because it is an invalid version. }} action {{ None required. }} class: unknown sl_severity: warning refcode: "" message: lpfc_printf_log KERN_ERR "Could not manually add FCF record 0, status %d\n" description {{ Could not add FCF record to the FCF list. }} action {{ None required. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_log KERN_ERR "CQ_CREATE mailbox failed with status x%x add_status x%x, mbx status x%x\n" description {{ The mailbox command sent to create the completion queue has failed. }} action {{ None required. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_log KERN_ERR "CQ_DESTROY mailbox failed with status x%x add_status x%x, mbx status x%x\n" description {{ The mailbox command sent to delete the completion queue has failed. }} action {{ None required. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_log KERN_ERR "Create VPORT failed: Cannot get instance number\n" description {{ The driver failed to allocate resources for an adapter and could not assign an instance number. }} action {{ Software driver error. If this problem persists, report these errors to Technical Support. }} class: software sl_severity: error refcode: "" message: lpfc_printf_log KERN_ERR "Create VPORT failed: Max VPORTs (%d) exceeded\n" description {{ The driver failed to create a port because the maximum number of port supported by the driver will be exceeded. DATA: (1) max_vpi }} action {{ No Action. The driver can not create any more VPorts. }} class: software sl_severity: error refcode: "" message: lpfc_printf_log KERN_ERR "Create VPORT failed: NPIV is not enabled: SLImode:%d\n" description {{ The driver failed to create a port because the HBA was in wrong mode or was not capable of NPIV. DATA: (1) sli_rev }} action {{ Load the driver with npiv enabled on an HBA that supports SLI-3. }} class: software sl_severity: error refcode: "" message: lpfc_printf_log KERN_ERR "Create VPORT failed: vpi x%x\n" description {{ The driver failed to create a port and had to eliminate all its resources. DATA: (1) vpi }} action {{ Software driver error. If this problem persists, report these errors to Technical Support. }} class: software sl_severity: error refcode: "" message: lpfc_printf_log KERN_ERR "CT command failed to delete objects on fabric\n" description {{ A command issued to the fabric to delete an associated resource for an object such as for a port, failed. }} action {{ Software driver error. If this problem persists, report these errors to Technical Support. }} class: software sl_severity: error refcode: "" message: lpfc_printf_log KERN_ERR "Deferred Adapter Hardware Error Data: x%x x%x x%x\n" description {{ An adapter hardware error was sent to the driver. DATA: (1) work_hs, (2) work_status[0], (3) work_status[1] }} action {{ Perform a dump using hbacmd. }} class: hardware sl_severity: error refcode: "" message: lpfc_printf_log KERN_ERR "DEL FCF of default FCF Index failed mbx status x%x, status x%x add_status x%x\n" description {{ The mailbox command to delete the FCF record has failed. }} action {{ None required. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_log KERN_ERR "Dropped frame rctl:%s type:%s\n" description {{ An unsupported frame was received by the port and dropped. DATA: (1) rctl_names[fc_hdr->fh_r_ctl], (2) type_names[fc_hdr->fh_type] }} action {{ None required. }} class: software sl_severity: error refcode: "" message: lpfc_printf_log KERN_INFO "ELS complete with no corresponding cmdiocb: iotag (%d)\n" description {{ The completion that the ISR is handling cannot find a tag associated with the IOTAG }} action {{ No action needed, informational. }} class: software type: info refcode: "" message: lpfc_printf_log KERN_ERR "EQ_CREATE mailbox failed with status x%x add_status x%x, mbx status x%x\n" description {{ The mailbox command sent to create the event queue has failed. }} action {{ None required. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_log KERN_ERR "EQ_DESTROY mailbox failed with status x%x add_status x%x, mbx status x%x\n" description {{ The mailbox command sent to delete the event queue has failed. }} action {{ None required. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_log KERN_ERR "Error Could not grow rpi count\n" description {{ An error occurred because the RPI count could not be increased. }} action {{ None required. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_log KERN_ERR "Error %d during queue setup.\n" description {{ Could not set up all the queues that driver requires to exchange IOs with the HBA. }} action {{ Reload the driver. }} class: software sl_severity: error refcode: "" message: lpfc_printf_log KERN_ERR "Error %d during rpi post operation\n" description {{ The driver was trying to post pages to the firmware to keep target login information and encountered a failure. }} action {{ Unload and reload the driver. }} class: software sl_severity: error refcode: "" message: lpfc_printf_log KERN_WARNING "Error %d during scsi sgl post operation\n" description {{ The SGL entries could not be registered with the HBA. }} action {{ Reset the HBA using hbacmd. }} class: hardware sl_severity: warning refcode: "" message: lpfc_printf_log KERN_ERR "Error %d during sgl post operation\n" description {{ The SGL post operation failed. }} action {{ None required. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_log KERN_ERR "Error %d parsing vpd. Using defaults.\n" description {{ Could not parse the VPD data, so the driver is using the default values. }} action {{ None required. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_log KERN_ERR "Error %d posting all rpi headers\n" description {{ The RPI headers could not be posted to the firmware. }} action {{ None required. }} class: firmware sl_severity: warning refcode: "" message: lpfc_printf_log KERN_ERR "Error during rpi post operation\n" description {{ The driver was trying to post pages to the firmware to be used to keep target login information and encountered a failure. }} action {{ Unload and reload the driver. }} class: firmware sl_severity: error refcode: "" message: lpfc_printf_log KERN_ERR "Failed allocate fast-path FCP CQ (%d)\n" description {{ The completion queue event for the fast path could not be allocated. }} action {{ Unload and reload the driver. }} class: unknown sl_severity: error refcode: "" message: lpfc_printf_log KERN_ERR "Failed allocate memory for fast-path CQ record array\n" description {{ Failed to allocate memory for the fast-path EQ record array. }} action {{ None required. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_log KERN_ERR "Failed allocate memory for fast-path EQ record array\n" description {{ Failed to allocate memory for the fast-path EQ record array. }} action {{ None required. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_log KERN_ERR "Failed allocate memory for fast-path per-EQ handle array\n" description {{ Failed to allocate memory for the fast-path per-EQ handle array. }} action {{ None required. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_log KERN_ERR "Failed allocate memory for fast-path WQ record array\n" description {{ Failed to allocate memory for the fast-path EQ record array. }} action {{ None required. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_log KERN_ERR "Failed allocate memory for msi-x interrupt vector entries\n" description {{ The driver was unable to allocate memory during initialization of the MSI-X interrupt array. }} action {{ None required. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_log KERN_ERR "Failed allocate slow-path ELS CQ\n" description {{ Failed allocate slow-path ELS CQ. }} action {{ None required. }} class: software sl_severity: error refcode: "" message: lpfc_printf_log KERN_ERR "Failed allocate slow-path ELS WQ\n" description {{ Failed to allocate slow-path ELS WQ. }} action {{ None required. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_log KERN_ERR "Failed allocate slow-path EQ\n" description {{ The event queue for the slow path was not allocated. }} action {{ Unload and reload the driver. }} class: software sl_severity: error refcode: "" message: lpfc_printf_log KERN_WARNING "Failed allocate slow-path mailbox CQ\n" description {{ Failed to allocate slow-path mailbox CQ. }} action {{ None required. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_log KERN_ERR "Failed to allocate CQ_EVENT entry\n" description {{ The asynchronous event handler was not able to allocate an event queue entry to which to transfer the asynchronous event. }} action {{ This could be a V-LINK clear from the switch or a fatal error from the firmware. Perform a dump from the OneCommand Manager application. }} class: software sl_severity: error refcode: "" message: lpfc_printf_log KERN_ERR "Failed to allocate IOTAG.last IOTAG is %d\n" description {{ The driver cannot allocate an IoTag. Display the last value used. }} action {{ This message indicates the adapter HBA I/O queue is full. Typically this happens when heavy I/O is running on a low-end (3 digit) adapter. We suggest you upgrade to a higher-end adapter. }} class: software sl_severity: error refcode: "" message: lpfc_printf_log KERN_ERR "Failed to allocate mbox cmd memory\n" description {{ Mailbox allocation error. }} action {{ None required. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_log KERN_ERR "Failed to allocate mbox for ADD_FCF cmd\n" description {{ Failed to allocate mailbox for ADD_FCF command. }} action {{ None required. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_log KERN_ERR "Failed to allocate mbox for query firmware config cmd\n" description {{ Failed to allocate mailbox memory. }} action {{ None required. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_log KERN_ERR "Failed to allocate mbox for READ_FCF cmd\n" description {{ Failed to allocate mbox for READ_FCF command. }} action {{ None required. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_log KERN_ERR "Failed to allocate memory for ELS XRI management array of size %d.\n" description {{ Initialization failed to allocate memory for the ELS XRI management array. }} action {{ None required. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_log KERN_ERR "Failed to allocate memory for SCSI XRI management array of size %d.\n" description {{ Initialization could not allocate memory to hold the XRIs. }} action {{ None required. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_log KERN_ERR "Failed to allocate non-embedded SGE array.\n" description {{ Failed to allocate the non-embedded SGE array. }} action {{ None required. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_log KERN_ERR "Failed to allocate sysfs attr\n" description {{ Initialization failed to sysfs attribute. }} action {{ None required. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_log KERN_INFO "Failed to allocate XRI.last XRITAG is %d Max XRI is %d, Used XRI is %d\n" description {{ All XRIs are in use. }} action {{ No action needed, informational. }} class: software type: info refcode: "" message: lpfc_printf_log KERN_ERR "Failed to create scsi host.\n" description {{ Initialization failed to create SCSI host. }} action {{ None required. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_log KERN_ERR "Failed to enable interrupt.\n" description {{ The driver failed to start the interrupt. }} action {{ Unload and reload the driver. }} class: software sl_severity: error refcode: "" message: lpfc_printf_log KERN_ERR "Failed to enable pci device.\n" description {{ Failed to enable PCI device during initialization. }} action {{ None required. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_log KERN_ERR "Failed to get the non-embedded SGE virtual address\n" description {{ The READ_FCF_RECORD mailbox command could not retrieve the Scatter Gather Entry that was requested. }} action {{ None required. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_log KERN_ERR "Failed to initialize iocb list.\n" description {{ Driver resource initialization failed. }} action {{ None required. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_log KERN_ERR "Failed to initialize rpi headers.\n" description {{ Failed to initialize RPI headers. }} action {{ None required. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_log KERN_ERR "Failed to initialize sgl list.\n" description {{ Failed to initialize SGL list during initialization. }} action {{ None required. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_log KERN_ERR "Failed to read FCoE parameters\n" description {{ The driver failed to read FCoE parameters. }} action {{ None required. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_log KERN_ERR "Failed to set up driver resource.\n" description {{ Driver resource initialization failed. }} action {{ None required. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_log KERN_ERR "Failed to set up hba\n" description {{ Initialization failed to set up the HBA. }} action {{ None required. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_log KERN_ERR "Failed to set up pci memory space.\n" description {{ PCI initialization failed. }} action {{ None required. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_log KERN_WARNING "Failure HBA POST Status: sta_reg=0x%x, perr=x%x, sfi=x%x, nip=x%x, ipc=x%x, xrom=x%x, dl=x%x, pstatus=x%x\n" description {{ The HBA’s power on self test has failed. }} action {{ None required. }} class: software type: info refcode: "" message: lpfc_printf_log KERN_INFO "Fast-path wqe consume event carries miss-matched qid: wcqe-qid=x%x\n" description {{ The consumed entry does not have the fast path’s queueID. }} action {{ No action needed, informational. }} class: software type: info refcode: "" message: lpfc_printf_log KERN_ERR "FCF disconnected from network index 0x%x tag 0x%x\n" description {{ The FCF has disconnected from the network. }} action {{ None required. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_log KERN_ERR "FCF Table full count 0x%x tag 0x%x\n" description {{ The FCF table is full. }} action {{ None required. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_log KERN_ERR "FCoE Function not supported by firmware. Function mode = %08x\n" description {{ FCoE is not supported by this firmware. }} action {{ Use the OneCommand Manager application to update to the latest firmware. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_log KERN_INFO "FCP cmdiocb not callback function iotag: (%d)\n" description {{ The IOCB found for this iotag does not have a completion handler set in it. }} action {{ No action needed, informational. }} class: software type: info refcode: "" message: lpfc_printf_log KERN_INFO "FCP complete error: status=x%x, hw_status=x%x, total_data_specified=%d, parameter=x%x, word3=x%x\n" description {{ Logs the FCP failure. Status and parameter are equivalent to ulpStatus and ulpWord[4]. }} action {{ No action needed, informational. }} class: software type: info refcode: "" message: lpfc_printf_log KERN_INFO "FCP complete with no corresponding cmdiocb: iotag (%d)\n" description {{ There was no IOCB on the in-progress list that matched this iotag. }} action {{ No action needed, informational. }} class: software type: info refcode: "" message: lpfc_printf_log KERN_INFO "Feature Mismatch Data: x%08x %08x x%x x%x x%x\n" description {{ The features passed in to the driver as module parameters do not match what the firmware can do. Setting to default values. }} action {{ No action needed, informational. }} class: software type: info refcode: "" message: lpfc_printf_log KERN_INFO "Find ndlp returned NULL for oxid:x%x SID:x%x\n" description {{ Could not find the node for this DID. }} action {{ No action needed, informational. }} class: software type: info refcode: "" message: lpfc_printf_log KERN_ERR "HBA not supporting SLI-3 or later SLI Revision: 0x%x\n" description {{ The HBA does not support SLI-3 or SLI-4. }} action {{ This HBA does not support msi. Set lpfc_use_msi=0. }} class: software sl_severity: error refcode: "" message: lpfc_printf_log KERN_ERR "HBA Unrecoverable error: uerr_lo_reg=0x%x, uerr_hi_reg=0x%x, ue_mask_lo_reg=0x%x, ue_mask_hi_reg=0x%x\n" description {{ The HBA has notified the driver that it has encountered an unrecoverable error. }} action {{ A dump from the OneCommand Manager application should be taken. Then, the driver should be unloaded and reloaded. }} class: software sl_severity: error refcode: "" message: lpfc_printf_log KERN_ERR "HBQ %d: local_hbqGetIdx %u is > than hbqp->entry_count %u\n" description {{ An error occurred when processing queue related to an HBA in a particular slot. DATA: (1) hbqno (2) local_hbqGetIdx (3) entry_count }} action {{ Software driver error. If this problem persists, report these errors to Technical Support. }} class: software sl_severity: error refcode: "" message: lpfc_printf_log KERN_ERR "Ignoring ELS cmd tag x%x completion Data: x%x x%x x%x\n" description {{ This ELS command was aborted. DATA: (1) ulpStatus (2) ulpWord[4] (3) ulpTimeout }} action {{ None required. }} class: software sl_severity: error refcode: "" message: lpfc_printf_log KERN_INFO "Ignoring unsolicited CT No HBQ status = x%x\n" description {{ Received an unsolicited ct command without a BDE. }} action {{ No action needed, informational. }} class: software type: info refcode: "" message: lpfc_printf_log KERN_INFO "Ignoring unsolicted CT HBQ Size:%d status = x%x\n" description {{ Received an unsolicited ct command with an invalid size. DATA: ulpStatus }} action {{ No action needed, informational. }} class: software type: info refcode: "" message: lpfc_printf_log KERN_ERR "INIT VPI Mailbox failed status %d, mbxStatus x%x\n" description {{ The INIT VPI mailbox command has failed. }} action {{ None required. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_log KERN_ERR "Invalid asynchrous event code: x%x\n" description {{ The asynchronous event code that the firmware passed to the driver is invalid. }} action {{ None required. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_log KERN_ERR "Invalid command 0x%x\n" description {{ The IOCB command is invalid. }} action {{ None required. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_log KERN_ERR "Invalid completion queue type (%d)\n" description {{ The event queue entry is not for a mailbox or a work queue entry. }} action {{ None required. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_log KERN_ERR "Invalid CT %x command 0x%x\n" description {{ Invalid Command-Type in the IOCB is not supported. }} action {{ None required. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_log KERN_ERR "Invalid device group (x%x)\n" description {{ While unloading the driver, the driver detect a PCI device that it should not have claimed. }} action {{ None required. }} class: hardware sl_severity: warning refcode: "" message: lpfc_printf_log KERN_ERR "Invalid HBA PCI-device group: 0x%x\n" description {{ Invalid HBA PCI-device group detected. }} action {{ None required. }} class: hardware sl_severity: warning refcode: "" message: lpfc_printf_log KERN_ERR "Invalid link-attention link speed: x%x\n" description {{ The link speed reported in the link attention interrupt is invalid. }} action {{ Check the switch configuration. }} class: hardware sl_severity: error refcode: "" message: lpfc_printf_log KERN_ERR "Invalid link attention type: x%x\n" description {{ The READ_LA mailbox command has returned an invalid link type. }} action {{ None required. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_log KERN_ERR "Invalid link fault code: x%x\n" description {{ The attempt to read the link attention register has returned an unknown value. }} action {{ None required. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_log KERN_ERR "Invalid param:\n" description {{ SLI-4: The post SGL function was passed an invalid XRI }} action {{ None required. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_log KERN_ERR "Invalid SLI revision (%d)\n" description {{ While processing a host attention or unrecoverable error, the driver detected an invalid SLI revision. }} action {{ None required. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_log KERN_INFO "Invalid speed for this board: Reset link speed to auto: x%x\n" description {{ The driver is reinitializing the link speed to auto-detect. }} action {{ No action needed, informational. }} class: software type: info refcode: "" message: lpfc_printf_log KERN_ERR "Invalid work queue CQE subtype (x%x)\n" description {{ Invalid work queue CQE. }} action {{ None required. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_log KERN_INFO "IOCB wait issue failed, Data x%x\n" description {{ The LPFC driver failed to issue an IOCB. DATA:(1) retval }} action {{ No action needed, informational. }} class: software type: info refcode: "" message: lpfc_printf_log KERN_ERR "IOCB wake NOT set, Data x%x x%lx\n" description {{ The completion handler associated with the IOCB was never called. DATA:(1) timeout (2) timeleft/jiffies }} action {{ This error could indicate a software driver, firmware or hardware problem.If the problem persists,report the error to Technical Support. }} class: unknown sl_severity: error refcode: "" message: lpfc_printf_log KERN_WARNING "IOCB wake signaled\n" description {{ The IOCB completed successfully. }} action {{ No action needed, informational. }} class: software type: info refcode: "" message: lpfc_printf_log KERN_ERR "IOCB x%x failed. No vport\n" description {{ An IOCB command could not be communicated because there was no VPort associated with the mailbox command. DATA: (1) ulpCommand }} action {{ Software driver error. If this problem persists, report these errors to Technical Support. }} class: software sl_severity: error refcode: "" message: lpfc_printf_log KERN_ERR "iotag x%x is out off range: max iotag (x%x)\n" description {{ The IOCB lookup cannot be performed because the iocb_tag is out of range. }} action {{ None required. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_log KERN_ERR "iotag x%x is out off range: max iotag x%x wd0 x%x\n" description {{ The IoTag in the completed IOCB is out of range. }} action {{ This error could indicate a software driver, firmware or hardware problem. Report these errors to Technical Support. }} class: unknown sl_severity: error refcode: "" message: lpfc_printf_log KERN_ERR "LATT: Cannot issue READ_LA: Data:%d\n" description {{ The link attention handler could not issue a READ_LA mailbox command. }} action {{ None required. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_log KERN_ERR "Link Down Event x%x received Data: x%x x%x x%x\n" description {{ A link down event was received. DATA: (1) fc_eventTag (2) hba_state (3) fc_flag }} action {{ If numerous link events are occurring, check the physical connections to the Fibre Channel network. }} class: hardware sl_severity: error refcode: "" message: lpfc_printf_log KERN_ERR "Link Up Event in loop back mode x%x received Data: x%x x%x x%x x%x\n" description {{ Link up notification; configured for loopback. DATA: (1) fc_eventTag (2) granted_AL_PA (3) UlnkSpeed (4) alpa_map[0] }} action {{ None required. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_log KERN_ERR "Link Up Event npiv not supported in loop topology\n" description {{ NPIV is not supported in loop topology. }} action {{ None required. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_log KERN_ERR "Loopback test did not receive expected data length. actual length 0x%x expected length 0x%x\n" description {{ The loopback test did not receive the same amount of data that it transmitted. }} action {{ None required. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_log KERN_ERR "lpfc_create_static_vport bad information header 0x%x 0x%x\n" description {{ Invalid information header; the signature or revision is invalid. }} action {{ None required. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_log KERN_ERR "lpfc_create_static_vport failed to allocate mailbox memory\n" description {{ Failed to allocate mailbox memory for VPort creation. }} action {{ None required. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_log KERN_ERR "lpfc_create_static_vport failed to allocate vport_info\n" description {{ Failed to allocate vport_info. }} action {{ None required. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_log KERN_ERR "lpfc_create_static_vport failed to create vport\n" description {{ Failed to create vport }} action {{ None required. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_log KERN_ERR "lpfc_create_static_vport failed to issue dump mailbox command ret 0x%x status 0x%x\n" description {{ Failed to issue a dump mailbox command for statis VPort creation. }} action {{ None required. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_log KERN_ERR "lpfc_dump_fcoe_param: memory allocation failed\n" description {{ Memory allocation has failed. }} action {{ None required. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_log KERN_ERR "lpfc_dump_static_vport: memory allocation failed\n" description {{ Failed to allocate mailbox memory. }} action {{ None required. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_log KERN_ERR "lpfc_sli_read_serdes_param failed to allocate mailbox memory\n" description {{ Failed to allocate mailbox memory. }} action {{ None required. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_log KERN_WARNING "lpfc_soft_wwpn attribute set failed to reinit adapter - %d\n" description {{ The adapter failed to restart after setting a new WWPN. }} action {{ Perform a dump using the hbacmd. }} class: hardware sl_severity: warning refcode: "" message: lpfc_printf_log KERN_ERR "Mailbox failed , mbxCmd x%x READ_CONFIG, mbxStatus x%x\n" description {{ The READ_CONFIG mailbox command failed. }} action {{ None required. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_log KERN_INFO "mbox: Issued mailbox cmd 0x%x while in stopped state.\n" description {{ Only the dump mailbox command and reset HBA mailbox command are allowed when in the stopped state. }} action {{ No action needed, informational. }} class: software type: info refcode: "" message: lpfc_printf_log KERN_ERR "Mbox x%x failed, no vport\n" description {{ The vport field of this mailbox command was not completed. }} action {{ None required. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_log KERN_ERR "Menlo Maint Mode Link up Event x%x rcvd Data: x%x x%x x%x\n" description {{ The link is up in maintenance mode; only management commands are allowed. DATA: (1) fc_eventTag (2) port_state (3) vport fc_flag }} action {{ None required. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_log KERN_ERR "Miss-matched fast-path completion queue identifier: eqcqid=%d, fcpcqid=%d\n" description {{ The CQID in the event queue entry does not match the fcp_cqid that was passed into the routine. }} action {{ None required. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_log KERN_ERR "MQ_CREATE mailbox failed with status x%x add_status x%x, mbx status x%x\n" description {{ The mailbox command sent to create the mailbox queue has failed. }} action {{ None required. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_log KERN_ERR "MQ_DESTROY mailbox failed with status x%x add_status x%x, mbx status x%x\n" description {{ The mailbox command sent to delete the mailbox queue has failed. }} action {{ None required. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_log KERN_WARNING "MSI request_irq failed (%d)\n" description {{ The request_irq kernel API has failed. }} action {{ Set lpfc_use_msi = 0. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_log KERN_WARNING "MSI-X fast-path request_irq failed (%d)\n" description {{ The driver received an error for the request_irq_call. }} action {{ Unload and reload the driver. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_log KERN_INFO "MSI-X interrupt with no EQE\n" description {{ SLI-4 HBA interrupt on the slow path but there is no associated EQE. }} action {{ No action needed, informational. }} class: software type: info refcode: "" message: lpfc_printf_log KERN_WARNING "MSI-X slow-path request_irq failed (%d)\n" description {{ The kernel API to request an IRQ has failed. }} action {{ Use module parameter lpfc_use_msi = 0 (IntX). }} class: software sl_severity: warning refcode: "" message: lpfc_printf_log KERN_INFO "ndlp null for oxid %x SID %x\n" description {{ The Node value for this SID is not in the node list. }} action {{ No action needed, informational. }} class: software type: info refcode: "" message: lpfc_printf_log KERN_INFO "New FCF found index 0x%x tag 0x%x\n" description {{ The driver has detected a new FCF in the SAN. DATA: (1) macqe_fcoe->fcf_index (2) acqe_fcoe->event_tag }} action {{ No action needed, informational. }} class: hardware type: info refcode: "" message: lpfc_printf_log KERN_ERR "No entry from fast-path completion queue fcpcqid=%d\n" description {{ There were no completions in the completion queue referenced by fcpcqid. }} action {{ None required. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_log KERN_ERR "No entry from the CQ: identifier (x%x), type (%d)\n" description {{ There was no completion queue event for this event queue entry. }} action {{ None required. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_log KERN_WARNING "NOP mailbox command failed status x%x add_status x%x mbx status x%x\n" description {{ The NOP mailbox command failed. }} action {{ None required. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_log KERN_ERR "No room left for SCSI XRI allocation: max_xri=%d, els_xri=%d\n" description {{ The number of allocated XRIs has reached the max_xri value. }} action {{ None required. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_log KERN_INFO "No support for fcpi mode.\n" description {{ Could not configure the port to run in FCP initiator mode. }} action {{ No action needed, informational. }} class: software type: info refcode: "" message: lpfc_printf_log KERN_ERR "Not a valid fast-path completion event: majorcode=x%x, minorcode=x%x\n" description {{ The major or minor code in the Event Queue field is not valid. }} action {{ None required. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_log KERN_ERR "Not a valid slow-path completion event: majorcode=x%x, minorcode=x%x\n" description {{ SLI-4: The EQE is not valid. }} action {{ None required. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_log KERN_ERR "Not a valid WCQE code: x%x\n" description {{ The completion queue handler detected an invalid type. }} action {{ None required. }} class: software sl_severity: error refcode: "" message: lpfc_printf_log KERN_ERR "Not configured for supporting MSI-X cfg_use_msi: 0x%x\n" description {{ The lpfc_use_msi module parameter should have been set to 2. }} action {{ Set module parameter lpfc_use_msi = 2. }} class: software sl_severity: error refcode: "" message: lpfc_printf_log KERN_ERR "NPIV enabled: Override lpfc_sli_mode parameter (%d) to auto (0).\n" description {{ The lpfc_enable_npiv and lpfc_sli_mode driver parameter settings conflict. The HBA must be configured for SLI-3 mode to support NPIV. DATA: (1) lpfc_sli_mode }} action {{ This is an informational message that indicates that the lpfc_enable_npiv and lpfc_sli_mod parameter settings are not compatible. Resolve the parameter conflict by setting the SLI mode to 0 or 3 or, if SLI-2 mode is required then disable NPIV. }} class: software sl_severity: error refcode: "" message: lpfc_printf_log KERN_ERR "Only Limited Edition cmd Format supported 0x%x\n" description {{ The SGL pages could not be unregistered from the firmware. }} action {{ None required. }} class: firmware sl_severity: warning refcode: "" message: lpfc_printf_log KERN_INFO "Outstanding IO when bringing Adapter offline\n" description {{ IO is still pending while attempting to stop the driver. }} action {{ No action needed, informational. }} class: software type: info refcode: "" message: lpfc_printf_log KERN_INFO "PCI enable MSI mode success.\n" description {{ MSI has been enabled for the port. }} action {{ No action needed, informational. }} class: software type: info refcode: "" message: lpfc_printf_log KERN_ERR "PM resume Failed to enable interrupt\n" description {{ The PCI resume (hotplug) could not get an interrupt vector. }} action {{ Unload and reload the driver. }} class: software sl_severity: error refcode: "" message: lpfc_printf_log KERN_ERR "PM resume failed to start worker thread: error=x%x.\n" description {{ The PCI resume (hotplug) could not start the worker thread for the driver. }} action {{ Unload and reload the driver. }} class: software sl_severity: error refcode: "" message: lpfc_printf_log KERN_ERR "POST_RPI_HDR mailbox failed with status x%x add_status x%x, mbx status x%x\n" description {{ The mailbox command sent to post the RPUI header pages to the firmware has failed. }} action {{ None required. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_log KERN_ERR "POST_SGL_BLOCK mailbox command failed status x%x add_status x%x mbx status x%x\n" description {{ The mailbox command sent to post the SGL pages to the firmware has failed. }} action {{ None required. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_log KERN_ERR "POST_SGL mailbox failed with status x%x add_status x%x, mbx status x%x\n" description {{ The mailbox command sent to post the SGL pages to the firmware has failed. }} action {{ None required. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_log KERN_ERR "Query Firmware Config failed mbx status x%x, status x%x add_status x%x\n" description {{ Could not read the firmware configuration. }} action {{ None required. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_log KERN_ERR "rc should be MBX_SUCCESS\n" description {{ The next mailbox command on the mailbox queue has failed. }} action {{ None required. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_log KERN_ERR "rc should have been MBX_BUSY\n" description {{ Attempting to unregister a default RPI from an interrupt context and the mailbox state is not busy. }} action {{ None required. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_log KERN_ERR "Read FCF record failed 0x%x\n" description {{ Could not read the FCF record from the firmware. }} action {{ None required. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_log KERN_ERR "READ_FCF_RECORD Indicates empty FCF table.\n" description {{ The driver requested the firmware provide a list of FCF entries to connect to and the firmware responded that the FCF table is empty. }} action {{ None required. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_log KERN_ERR "READ_FCF_RECORD mailbox failed with status x%x add_status x%x, mbx\n" description {{ The READ_FCF_RECORD mailbox command failed. }} action {{ None required. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_log KERN_WARNING "READ_LA mbox error x%x state x%x\n" description {{ The driver cannot determine what type of link event occurred. }} action {{ If numerous link events are occurring, check the physical connections to the Fibre Channel network. May indicate a possible hardware or firmware problem. }} class: hardware sl_severity: warning refcode: "" message: lpfc_printf_log KERN_ERR "READ_REV Error. SLI Level %d FCoE enabled %d\n" description {{ This SLI-4 only HBA setup function was called for a non-SLI-4 device. }} action {{ None required. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_log KERN_ERR "READ_SPARAM command failed status %d, mbxStatus x%x\n" description {{ The READ_SPARAM mailbox command has failed during initialization. The HBA has been set to error state. }} action {{ Take a dump with hbacmd and then try reloading the driver. }} class: software sl_severity: error refcode: "" message: lpfc_printf_log KERN_WARNING "READ_SPARAM: no buffers\n" description {{ The driver attempted to issue a READ_SPARAM mailbox command to the HBA, but there were no buffers available. }} action {{ This message indicates: (1) Kernel virtual memory is depleted. Check that the system meets minimum RAM requirements for the Emulex Fibre Channel adapter. Try closing other applications to freesome memory. (2) A possible driver buffer management problem. If the problem persists, report the error to Technical Support. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_log KERN_ERR "Receive Frame Truncated!!\n" description {{ The receive unsolicited handler detected a truncated frame. }} action {{ None required. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_log KERN_WARNING "Re-establishing Link Data: x%x x%x x%x\n" description {{ The driver detected a condition in which it had to re-initialize the link. DATA: (1) status (2) status1 (3) status2 }} action {{ If numerous link events are occurring, check the physical connections to the Fibre Channel network. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_log KERN_WARNING "REG_LOGIN: no buffers, VPI:%d DID:x%x, flag x%x\n" description {{ The driver attempted to issue a REG_LOGIN mailbox command to the HBA, but there were no buffers available. DATA: (1) Did (2) flag }} action {{ This message indicates: (1) Kernel virtual memory is depleted. Check that the system meets minimum RAM requirements for the Emulex Fibre Channel adapter. Try closing other applications to free some memory. (2) A possible driver buffer management problem. If the problem persists, report the error to Technical Support. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_log KERN_ERR "REMOVE_ALL_SGL_PAGES mailbox failed with status x%x add_status x%x, mbx status x%x\n" description {{ The mailbox command sent to delete the SGL pages from the firmware has failed. }} action {{ None required. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_log KERN_INFO "Reset HBA Data: x%x x%x\n" description {{ An HBA has been reset. DATA: (1) hba_state (2) sli_flag }} action {{ No action needed, informational. }} class: software type: info refcode: "" message: lpfc_printf_log KERN_ERR "Resetting board due to mailbox timeout\n" description {{ A mailbox command failed to complete. The driver is resetting the port. }} action {{ If the mailbox command fails again, set the lpfc_log_verbose to LOG_MBOX and retry. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_log KERN_INFO "Restart HBA Data: x%x x%x\n" description {{ The driver has been told to restart the HBA }} action {{ No action required, informational message. }} class: software type: info refcode: "" message: lpfc_printf_log KERN_ERR "Ring %d Cannot find buffer for an unsolicited iocb. tag 0x%x\n" description {{ There are no more pre-allocated buffers available to handle unsolicited buffers. }} action {{ Ensure this port is not being managed by multiple ports. }} class: software sl_severity: error refcode: "" message: lpfc_printf_log KERN_ERR "Ring %d handler: Failed to allocate iocb Rctl x%x Type x%x received\n" description {{ The driver was unable to allocate memory to send a query config mailbox command }} action {{ None required. }} class: software sl_severity: error refcode: "" message: lpfc_printf_log KERN_ERR "Ring %d handler: portRspPut %d is bigger than rsp ring %d\n" description {{ The port rsp ring put index is larger than the size of the rsp ring. }} action {{ This error could indicate a software driver, firmware or hardware problem. Report these errors to Technical Support. }} class: unknown sl_severity: error refcode: "" message: lpfc_printf_log KERN_ERR "Ring %d handler: unexpected ASYNC_STATUS evt_code 0x%x\n" description {{ The HBA received an asynchronous event that was not a temperature event. }} action {{ None required. }} class: hardware sl_severity: error refcode: "" message: lpfc_printf_log KERN_ERR "Ring %d handler: unexpected completion IoTag x%x Data: x%x x%x x%x x%x\n" description {{ The driver could not find a matching command for the completion received on the specified ring. DATA: (1) ulpStatus (2) ulpWord[4] (3) ulpCommand (4) ulpContext }} action {{ This error could indicate a firmware or hardware problem. Report these errors to Technical Support. }} class: unknown sl_severity: error refcode: "" message: lpfc_printf_log KERN_ERR "Ring %d handler: unexpected Rctl x%x Type x%x received\n" description {{ The Rctl/Type of a received frame did not match any for the configured masks for the specified ring. }} action {{ This error could indicate a software driver, firmware or hardware problem. Report these errors to Technical Support. }} class: unknown sl_severity: error refcode: "" message: lpfc_printf_log KERN_ERR "Ring %d issue: portCmdGet %d is bigger than cmd ring %d\n" description {{ The port cmd ring get index is greater than the size of cmd ring. }} action {{ This error could indicate a software driver, firmware or hardware problem. Report these errors to Technical Support. }} class: unknown sl_severity: error refcode: "" message: lpfc_printf_log KERN_ERR "RQ_CREATE mailbox failed with status x%x add_status x%x, mbx status x%x\n" description {{ The mailbox command sent to create the receive queue has failed. }} action {{ None required. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_log KERN_ERR "RQ_DESTROY mailbox failed with status x%x add_status x%x, mbx status x%x\n" description {{ The mailbox command sent to delete the work queue has failed. }} action {{ None required. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_log KERN_WARNING "Rsp Ring %d error: IOCB Data: x%x x%x x%x x%x x%x x%x x%x x%x\n" description {{ An IOCB error has occurred on the specified ring. DATA: (1) ulpWord[0] (2) ulpWord[1] (3) ulpWord[2] (4) ulpWord[3] (5) ulpWord[4] (6) ulpWord[5] (7) irsp+6 (8) irsp+7 }} action {{ If the problem persists, check the targets. If the targets are okay, report the error to Technical Support. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_log KERN_INFO "Rsp Ring %d error: IOCB Data: x%x x%x x%x x%x x%x x%x x%x x%x x%x x%x x%x x%x x%x x%x x%x x%x\n" description {{ The firmware has returned an error for this IOCB. DATA: (1) (2) }} action {{ No action needed, informational. }} class: firmware type: info refcode: "" message: lpfc_printf_log KERN_ERR "SLI4 Adapter Hardware Error Data: x%x x%x\n" description {{ The HBA has encountered an unrecoverable error. }} action {{ Use hbacmd to retrieve a dump file. }} class: hardware sl_severity: error refcode: "" message: lpfc_printf_log KERN_ERR "SLI_CONFIG_SPECIAL mailbox failed with status x%x\n" description {{ Mailbox command failed. }} action {{ Ensure the adapter’s firmware is current. Unload and reload the driver. }} class: firmware sl_severity: error refcode: "" message: lpfc_printf_log KERN_ERR "SLI_FUNCTION_RESET mailbox failed with status x%x add_status x%x, mbx status x%x\n" description {{ Mailbox command failed. }} action {{ Reset the HBA. }} class: hardware sl_severity: error refcode: "" message: lpfc_printf_log KERN_ERR "Slow-path CQ identifier (%d) does not exist:\n" description {{ The Completion Queue ID passed in the Event Queue entry does not reference a valid completion queue. }} action {{ None required. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_log KERN_INFO "Slow-path wqe consume event carries miss-matched qid: wcqe-qid=x%x, sp-qid=x%x\n" description {{ The consumed entry does not have the slow path’s queueID. }} action {{ No action needed, informational. }} class: software type: info refcode: "" message: lpfc_printf_log KERN_ERR "The lpfc_dmabuf allocation failed\n" description {{ The asynchronous link event handler could not allocate a mailbox command to issue the READ_LA (read link attention) mailbox command. }} action {{ None required. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_log KERN_ERR "The mboxq allocation failed\n" description {{ The asynchronous link event handler could not allocate a mailbox command to issue the READ_LA (read link attention) mailbox command. }} action {{ None required. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_log KERN_ERR "The mbuf allocation failed\n" description {{ The asynchronous link event handler could not allocate DMA-able memory for the READ_LA mailbox command. }} action {{ None required. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_log KERN_ERR "There is pending active mailbox cmd\n" description {{ The mailbox commands have overlapped. This command should have been added to the mailbox queue. }} action {{ None required. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_log KERN_ERR "The SLI4 DCBX asynchronous event is not handled yet\n" description {{ The SLI-4 DCBX asynchronous event is not handled yet. }} action {{ None required. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_log KERN_ERR "Unable to allocate memory for issuing MBOX_CONFIG_MSI command\n" description {{ Mailbox memory pool allocation error. }} action {{ None required. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_log KERN_ERR "Unable to allocate memory for issuing NOP mailbox command\n" description {{ Memory allocation for this mailbox command has failed. }} action {{ None required. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_log KERN_ERR "Unable to allocate memory for issuing SLI_CONFIG_SPECIAL mailbox command\n" description {{ Mailbox memory pool allocation error. }} action {{ None required. }} class: unknown sl_severity: warning refcode: "" message: lpfc_printf_log KERN_ERR "Unable to allocate memory for issuing SLI_FUNCTION_RESET mailbox command\n" description {{ Mailbox memory pool allocation error. }} action {{ None required. }} class: unknown sl_severity: warning refcode: "" message: lpfc_printf_log KERN_ERR "Unable to deregister pages from HBA: %x\n" description {{ The SGL pages could not be unregistered from the firmware. }} action {{ None required. }} class: firmware sl_severity: warning refcode: "" message: lpfc_printf_log KERN_ERR "Unable to select SLI-3. Not supported by adapter.\n" description {{ The HBA is not capable of operating in a given mode. }} action {{ SLI-3 mode is only available on some HBAs. Do not attempt to force the SLI mode to 3 on HBAs that do not support SLI-3 mode. This is an informational message. HBAs that do not support SLI-3 will be configured to run in SLI-2 mode, but it is recommended to use the auto setting (0). }} class: software sl_severity: error refcode: "" message: lpfc_printf_log KERN_ERR "Unknown FCoE event type 0x%x event tag 0x%x\n" description {{ The firmware has detected an unknown FCoE event. }} action {{ Check the FCoE switch configuration and the HBA DCBX mode. }} class: software sl_severity: error refcode: "" message: lpfc_printf_log KERN_ERR "Unknown IOCB command Data: x%x x%x x%x x%x\n" description {{ Received an unknown IOCB command completion. DATA: (1) ulpCommand (2) ulpStatus (3) ulpIoTag (4) ulpContext }} action {{ This error could indicate a software driver or firmware problem. If these problems persist, report these errors to Technical Support. }} class: software sl_severity: error refcode: "" message: lpfc_printf_log KERN_ERR "Unknown IOCB command Data: x%x, x%x x%x x%x x%x\n" description {{ eceived an unknown IOCB command completion. DATA: (1) type (2) ulpCommand (3) ulpStatus (4) ulpIoTag (5) ulpContext }} action {{ This error could indicate a software driver or firmware problem. If these problems persist, report these errors to Technical Support. }} class: software sl_severity: error refcode: "" message: lpfc_printf_log KERN_ERR "Unrecognized lpfc_sli_mode parameter: %d.\n" description {{ The user has attempted to set the SLI mode to an invalid value. The only valid values for the SLI mode are 0, 2, and 3. DATA: (1) lpfc_sli_mode }} action {{ The lpfc_sli_mode driver parameter setting must be corrected. Valid values are 0, 2, and 3. }} class: software sl_severity: error refcode: "" message: lpfc_printf_log KERN_ERR "UNREG_FCFI issue mbox failed\n" description {{ Could not issue the UNREG_FCFI mailbox command. }} action {{ None required. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_log KERN_ERR "UNREG_FCFI mbox allocation failed HBA state x%x\n" description {{ allocation for the UNREG_FCFI mailbox command has failed. }} action {{ None required. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_log KERN_ERR "UNREG_FCFI mbox allocation failed\n" description {{ Failed to allocate mailbox memory. }} action {{ None required. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_log KERN_ERR "UNREG_FCFI mbxStatus error x%x HBA state x%x\n" description {{ The Unregister FCFI mailbox failed. }} action {{ None required. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_log KERN_ERR "Unregister FCFI command failed status %d, mbxStatus x%x\n" description {{ The driver was unable to unregister the FCFI from the firmware. }} action {{ None required. }} class: unknown sl_severity: warning refcode: "" message: lpfc_printf_log KERN_ERR "UNREG_VFI issue mbox failed rc x%x HBA state x%x\n" description {{ Could not issue the UNREG_VFI mailbox command. }} action {{ None required. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_log KERN_ERR "UNREG_VFI mbox allocation failed HBA state x%x\n" description {{ Could not allocate memory for UNREG_VFI mailbox command. }} action {{ None required. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_log KERN_ERR "UNREG_VFI mbxStatus error x%x HBA state x%x\n" description {{ The Unregister VFI mailbox command failed. }} action {{ None required. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_log KERN_ERR "Unsupported CQ count. (%d)\n" description {{ Cannot create an completion queue of this size. }} action {{ None required. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_log KERN_ERR "Unsupported EQ count. (%d)\n" description {{ Cannot create an event queue of this size. }} action {{ None required. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_log KERN_ERR "Unsupported MQ count. (%d)\n" description {{ Cannot create MQ of this size. }} action {{ None required. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_log KERN_ERR "Unsupported RQ count. (%d)\n" description {{ The receive queue ring can only be 512, 1024, 2048, or 4096. }} action {{ None required. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_log KERN_INFO "Vital Product Data: x%x x%x x%x x%x\n" description {{ Vital product data (VPD) contained in the HBA flash. DATA: (1) vpd[0] (2) vpd[1] (3) vpd[2] (4) vpd[3] }} action {{ No action needed, informational. }} class: software type: info refcode: "" message: lpfc_printf_log KERN_WARNING "VPD not present on adapter, mbxCmd x%x DUMP VPD, mbxStatus x%x\n" description {{ The DUMP_VPD mailbox command failed. }} action {{ This error could indicate a hardware or firmware problem. If the problem persists, report the error to Technical Support. }} class: unknown sl_severity: warning refcode: "" message: lpfc_printf_log KERN_ERR "Wakeup on signal: rc=x%x\n" description {{ A signal other than the LPFC_DATA_READY was received on the worker thread. }} action {{ Unload and reload the driver. }} class: software sl_severity: error refcode: "" message: lpfc_printf_log KERN_ERR "WQ_CREATE mailbox failed with status x%x add_status x%x, mbx status x%x\n" description {{ The mailbox command sent to create the work queue has failed. }} action {{ None required. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_log KERN_ERR "WQ_DESTROY mailbox failed with status x%x add_status x%x, mbx status x%x\n" description {{ The mailbox command sent to delete the work queue has failed. }} action {{ None required. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_vlog KERN_INFO "Abort outstanding I/O on NPort x%x Data: x%x x%x x%x\n" description {{ All outstanding I/Os are cleaned up on the specified remote NPort. DATA: (1) nlp_flag (2) nlp_state (3) nlp_rpi }} action {{ No action needed, informational. }} class: software type: info refcode: "" message: lpfc_printf_vlog KERN_INFO "ACC to LOGO completes to NPort x%x Data: x%x x%x x%x\n" description {{ The driver received a LOGO from a remote NPort and successfully issued an ACC response. DATA: (1) nlp_flag (2) nlp_state (3) nlp_rpi }} action {{ No action needed, informational. }} class: software type: info refcode: "" message: lpfc_printf_vlog KERN_INFO "ADISC completes to NPort x%x Data: x%x x%x x%x x%x x%x\n" description {{ The HBA performed a ADISC into a remote NPort. DATA: (1) ulpStatus (2) ulpWord[4] (3) ulpTimeout (4) disc (5) num_disc_nodes }} action {{ No action needed, informational. }} class: software type: info refcode: "" message: lpfc_printf_vlog KERN_INFO "Allocation request of %d command buffers did not succeed. Allocated %d buffers.\n" description {{ The allocation request for the specified command buffers did not succeed. However,the specified number of buffers has been allocated. }} action {{ No action needed, informational. }} class: software type: info refcode: "" message: lpfc_printf_vlog KERN_INFO "Allocation request of %d command buffers will exceed max of %d. Reducing allocation request to %d.\n" description {{ The number of command buffers requested will exceed the maximum so a smaller quantity will be allocated. }} action {{ No action needed, informational. }} class: software type: info refcode: "" message: lpfc_printf_vlog KERN_ERR "An FLOGI ELS command x%x was received from DID x%x in Loop Mode\n" description {{ While in Loop Mode an unknown or unsupported ELS command was received. }} action {{ Check device DID. }} class: software sl_severity: error refcode: "" message: lpfc_printf_vlog KERN_INFO "At limitation of %d preallocated command buffers\n" description {{ The maximum number of command buffers have already been allocated. }} action {{ No action needed, informational. }} class: software type: info refcode: "" message: lpfc_printf_vlog KERN_ERR "Bus Reset on target %d failed\n" description {{ The bus reset for the specified target failed. }} action {{ None required. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_vlog KERN_INFO "Cancel Discovery Timer state x%x Data: x%x x%x x%x\n" description {{ Cancel the device discovery / RSCN rescue timer. DATA: (1) fc_flag (2) fc_plogi_cnt (3) fc_adisc_cnt }} action {{ No action needed, informational. }} class: software type: info refcode: "" message: lpfc_printf_vlog KERN_ERR "Cannot issue NameServer login\n" description {{ Could not issue an ELS PLOGI to the nameserver DID. }} action {{ Check the port connection and the switch configuration. }} class: unknown sl_severity: error refcode: "" message: lpfc_printf_vlog KERN_ERR "Cannot issue Register Fabric login: Err %d\n" description {{ Could not issue the fabric reg login, the err value is unique for each possible failure. }} action {{ None required. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_vlog KERN_ERR "Cannot Register NameServer login\n" description {{ Either a memory allocation issue or an invalid parameter was sent to the REG_LOGIN. }} action {{ At least one message (0142 0121 0133 0134 0135) should precede this message. }} class: software sl_severity: error refcode: "" message: lpfc_printf_vlog KERN_INFO "Cleanup node for NPort x%x Data: x%x x%x x%x\n" description {{ The driver node table entry for a remote NPort was removed. DATA: (1) nlp_flag (2) nlp_state (3) nlp_rpi }} action {{ No action needed, informational. }} class: software type: info refcode: "" message: lpfc_printf_vlog KERN_ERR "CLEAR_LA mbxStatus error x%x hba state x%x\n" description {{ The driver issued a CLEAR_LA mbox command to the HBA that failed. }} action {{ This error could indicate a firmware or hardware problem. Report these errors to Technical Support. }} class: unknown sl_severity: error refcode: "" message: lpfc_printf_vlog KERN_ERR "CLEAR LA timeout\n" description {{ The driver issued a CLEAR_LA that never completed. }} action {{ None required. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_vlog KERN_ERR "CONFIG_LINK bad hba state x%x\n" description {{ A CONFIG_LINK mbox command completed and the driver was not in the right state. }} action {{ Software driver error. If this problem persists, report these errors to Technical Support. }} class: software sl_severity: error refcode: "" message: lpfc_printf_vlog KERN_ERR "CONFIG_LINK mbxStatus error x%x HBA state x%x\n" description {{ The driver issued a CONFIG_LINK mbox command to the HBA that failed. }} action {{ This error could indicate a firmware or hardware problem. Report these errors to Technical Support. }} class: unknown sl_severity: error refcode: "" message: lpfc_printf_vlog KERN_INFO "Continue discovery with %d ADISCs to go Data: x%x x%x x%x\n" description {{ A device discovery is in progress. DATA: (1) fc_adisc_cnt (2) fc_flag (3) phba->hba_state }} action {{ No action needed, informational. }} class: software type: info refcode: "" message: lpfc_printf_vlog KERN_INFO "Continue discovery with %d PLOGIs to go Data: x%x x%x x%x\n" description {{ Device discovery is in progress. DATA: (1) fc_plogi_cnt (2) fc_flag (3) phba->hba_state }} action {{ No action needed, informational. }} class: software type: info refcode: "" message: lpfc_printf_vlog KERN_ERR "Could not issue unreg_did (default rpis) status %d\n" description {{ Attempt to unregister rpi failed. }} action {{ Software driver error. If this problem persists, report these errors to Technical Support. }} class: software sl_severity: error refcode: "" message: lpfc_printf_vlog KERN_ERR "Could not issue unreg_login(all_rpis) status %d\n" description {{ The unreg_login cannot be issued. }} action {{ None required. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_vlog KERN_ERR "Could not issue unreg_vpi\n" description {{ Driver attempt to unregister vpi failed. }} action {{ Software driver error. If this problem persists, report these errors to Technical Support. }} class: software sl_severity: error refcode: "" message: lpfc_printf_vlog KERN_ERR "Create VPORT failed. Cannot get sparam\n" description {{ The port could not be created because it could not be initialized possibly due to unavailable resources. }} action {{ Software driver error. If this problem persists, report these errors to Technical Support. }} class: software sl_severity: error refcode: "" message: lpfc_printf_vlog KERN_ERR "Create VPORT failed. Duplicate WWN on HBA\n" description {{ The port could not be created because it would duplicate an existing WWNN HBA address. The resources for the port had to be discarded. }} action {{ Provide a WWN that is unique. }} class: software sl_severity: error refcode: "" message: lpfc_printf_vlog KERN_ERR "Create VPORT failed. Invalid WWN format\n" description {{ The port could not be created due to an invalid WWNN or WWPN format. }} action {{ Provide a valid WWN when creating Vports. }} class: software sl_severity: error refcode: "" message: lpfc_printf_vlog KERN_ERR "Create VPORT Interrupted.\n" description {{ The port creation process was unexpectedly interrupted at a critical time and the operation was unsuccessful. }} action {{ The process was interrupted while creating a VPort. Retry the command. }} class: software sl_severity: error refcode: "" message: lpfc_printf_vlog KERN_WARNING "Create vport work array FAILED: cannot do scsi_host_get\n" description {{ The driver was unable to get a reference to a SCSI host. }} action {{ Software driver error. If this problem persists, report these errors to Technical Support. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_vlog KERN_INFO "CT Request completes, latt %d, ulpStatus x%x CmdRsp x%x, Context x%x, Tag x%x\n" description {{ A RFT request that was sent to the fabric completed. DATA: (1) latt (2) ulpStatus (3) CmdRsp (4) Context (5) Tag }} action {{ No action needed, informational. }} class: software type: info refcode: "" message: lpfc_printf_vlog KERN_INFO "Deferred RSCN Data: x%x x%x x%x\n" description {{ The driver has received multiple RSCNs and has deferred the processing of the most recent RSCN. DATA: (1) fc_rscn_id_cnt (2) fc_flag (3) hba_state }} action {{ No action needed, informational. }} class: software type: info refcode: "" message: lpfc_printf_vlog KERN_INFO "Device Discovery completes\n" description {{ This indicates successful completion of device (re)discovery after a link up. }} action {{ No action needed, informational. }} class: software type: info refcode: "" message: lpfc_printf_vlog KERN_ERR "Device Discovery completion error\n" description {{ This indicates that an uncorrectable error was encountered during device (re)discovery after a link up. Fibre Channel devices will not be accessible if this message is displayed. }} action {{ Reboot the system. If the problem persists, report the error to Technical Support. Run with verbose mode on for more details. }} class: unknown sl_severity: error refcode: "" message: lpfc_printf_vlog KERN_ERR "Device Reset rport failure: rdata x%p\n" description {{ The reset of the Rport failed. }} action {{ None required. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_vlog KERN_ERR "Discovery Mailbox error: state: 0x%x : %p %p\n" description {{ Either the driver could not allocate resources or it could not send sparam_mbox or cfglink_mbox. DATA: (1) address of sparam_mbox command (2) address of cfglink_mbox command }} action {{ Attempt to unload and reload the driver when it is convenient. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_vlog KERN_ERR "Dropping received ELS cmd Data: x%x x%x x%x\n" description {{ The driver decided to drop an ELS Response ring entry. DATA: (1) ulpStatus (2) ulpWord[4] (3) ulpTimeout }} action {{ This error could indicate a software driver or firmware problem. If problems persist report these errors to Technical Support. }} class: software sl_severity: error refcode: "" message: lpfc_printf_vlog KERN_INFO "DSM in event x%x on NPort x%x in state %d Data: x%x\n" description {{ The driver Discovery State Machine is processing an event. DATA: (1) nlp_flag }} action {{ No action needed, informational. }} class: software type: info refcode: "" message: lpfc_printf_vlog KERN_INFO "DSM out state %d on NPort free\n" description {{ The driver Discovery State Machine completed processing an event. DATA: (1) nlp_flag }} action {{ No action needed, informational. }} class: software type: info refcode: "" message: lpfc_printf_vlog KERN_INFO "DSM out state %d on NPort x%x Data: x%x\n" description {{ The driver Discovery State Machine completed processing an event. DATA: (1) nlp_flag }} action {{ No action needed, informational. }} class: software type: info refcode: "" message: lpfc_printf_vlog KERN_INFO "ELS cmd tag x%x completes Data: x%x x%x x%x\n" description {{ The specific ELS command was completed by the firmware. DATA: (1) ulpStatus (2) ulpWord[4] (3) ulpTimeout }} action {{ No action needed, informational. }} class: software type: info refcode: "" message: lpfc_printf_vlog KERN_INFO "ELS command x%x received from NPORT x%x Data: x%x\n" description {{ Received the specific ELS command from a remote NPort. DATA: (1) hba_state }} action {{ No action needed, informational. }} class: software type: info refcode: "" message: lpfc_printf_vlog KERN_INFO "ELS response tag x%x completes Data: x%x x%x x%x x%x x%x x%x x%x\n" description {{ The specific ELS response was completed by the firmware. DATA: (1) ulpStatus (2) ulpWord[4] (3) ulptimeout (4) nlp_DID (5) nlp_flag (6) nlp_state (7) nlp_rpi }} action {{ No action needed, informational. }} class: firmware type: info refcode: "" message: lpfc_printf_vlog KERN_ERR "ELS rsp: Cannot issue reg_login for x%x Data: x%x x%x x%x\n" description {{ REG_LOGIN mailbox command failed. DATA: (1) nlp_DID (2) nlp_state (3) nlp_flag (4) nlp_rpi }} action {{ None required. }} class: software sl_severity: error refcode: "" message: lpfc_printf_vlog KERN_ERR "ELS timeout Data: x%x x%x x%x x%x\n" description {{ An ELS IOCB command was posted to a ring and did not complete within ULP timeout seconds. DATA: (1) elscmd (2) remote_id (3) ulpcommand (4) ulpIoTag }} action {{ If no ELS command is going through the adapter, reboot the system; If problem persists, contact Technical Support. }} class: unknown sl_severity: error refcode: "" message: lpfc_printf_vlog KERN_INFO "Fabric does not support NPIV - configuring single port mode.\n" description {{ The fabric reports no support for NPIV upon FLOGI. }} action {{ No action needed, informational. }} class: software type: info refcode: "" message: lpfc_printf_vlog KERN_ERR "Failed to allocate init_vpi mailbox\n" description {{ Failed to allocate init_vpi mailbox\n. }} action {{ None required. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_vlog KERN_ERR "Failed to allocate memory for ELS event\n" description {{ Memory could not be allocated to send the ELS event to the FC transport. }} action {{ None required. }} class: software sl_severity: error refcode: "" message: lpfc_printf_vlog KERN_ERR "Failed to allocate memory for LOGO event\n" description {{ Memory could not be allocated to send the LOGO event to the FC transport. }} action {{ None required. }} class: software sl_severity: error refcode: "" message: lpfc_printf_vlog KERN_ERR "Failed to allocate memory for RSCN event\n" description {{ Memory could not be allocated to send the RSCN event to the management application. }} action {{ None required. }} class: software sl_severity: error refcode: "" message: lpfc_printf_vlog KERN_ERR "Failed to issue INIT_VPI mailbox command\n" description {{ Failed to INIT_VPI. }} action {{ None required. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_vlog KERN_ERR "Failed to issue init_vpi mailbox\n" description {{ The driver was unable to send an initialize VPI mailbox command. }} action {{ None required. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_vlog KERN_WARNING "FAN timeout\n" description {{ A link up event was received without the login bit set, so the driver waits E_D_TOV for the Fabric to send a FAN. If no FAN if received, a FLOGI will be sent after the timeout. }} action {{ None required. The driver recovers from this condition by issuing a FLOGI to the fabric. }} class: hardware sl_severity: warning refcode: "" message: lpfc_printf_vlog KERN_INFO "FARP-REQ received from DID x%x\n" description {{ An unsolicited FARP request was received. }} action {{ No action needed, informational. }} class: software type: info refcode: "" message: lpfc_printf_vlog KERN_WARNING "FCP cmd x%x failed <%d/%d> status: x%x result: x%x Data: x%x x%x\n" description {{ The specified device failed an FCP command. DATA: (1) ulpContext (2) iotag }} action {{ Check the state of the target in question. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_vlog KERN_WARNING "FCP command x%x failed: x%x SNS x%x x%x Data: x%x x%x x%x x%x x%x\n" description {{ The FCP command failed with a response error. DATA: (1) resp_info (2) scsi_status (3) ResId (4) SnsLen (5) RspLen (6)rspInfo3 }} action {{ Check the state of the target in question. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_vlog KERN_INFO "FCP command x%x residual overrun error. Data: x%x x%x\n" description {{ A residual overrun error has occurred while processing the specified FCP command. DATA: (1) request_bufflen (2) resid }} action {{ No action needed, informational. }} class: software type: info refcode: "" message: lpfc_printf_vlog KERN_INFO "FCP command x%x residual underrun converted to error Data: x%x x%x x%x\n" description {{ The driver converted this underrun condition to an error based on the underflow field in the SCSI command. DATA: (1) len (2) resid (3) underflow }} action {{ No action needed, informational. }} class: software type: info refcode: "" message: lpfc_printf_vlog KERN_INFO "FCP Read Check Error and Underrun Data: x%x x%x x%x x%x\n" description {{ HBA reported under run from storage array. DATA: (1) vpi (2) fcpDI (3) res_id (4) fcpi_parm }} action {{ No action needed, informational. }} class: software type: info refcode: "" message: lpfc_printf_vlog KERN_WARNING "FCP Read Check Error Data: x%x x%x x%x x%x\n" description {{ The issued FCP command returned a read check error. DATA: (1) fcpDl (2) rspResId (3) fcpi_parm (4) cmd[0] }} action {{ Check the state of the target in question. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_vlog KERN_INFO "FCP Read Underrun, expected %d, residual %d Data: x%x x%x x%x\n" description {{ An FCP device provided less data than was requested. DATA: (1) fcpi_parm (2) cmnd[0] (3) underflow }} action {{ No action needed, informational. }} class: software type: info refcode: "" message: lpfc_printf_vlog KERN_ERR "FDISC failed. (%d/%d)\n" description {{ DATA: lsRjtError }} action {{ Reconfigure the switch to support more NPIV logins. If problem persists, contact Technical Support. }} class: unknown sl_severity: error refcode: "" message: lpfc_printf_vlog KERN_ERR "FDISC Failed (x%x).\n" description {{ DATA: lsRjtError }} action {{ Reconfigure the switch to support more NPIV logins. If problem persists, contact Technical Support. }} class: unknown sl_severity: error refcode: "" message: lpfc_printf_vlog KERN_INFO "FDMI Request Data: x%x x%x x%x\n" description {{ The driver is sending an FDMI request to the fabric. DATA: (1) fc_flag (2) hba_state (3) cmdcode }} action {{ No action needed, informational. }} class: unknown type: info refcode: "" message: lpfc_printf_vlog KERN_WARNING "FDMI rsp failed Data: x%x\n" description {{ An error response was received to FDMI request. DATA:(1) SWAP_DATA16(fdmi_cmd) }} action {{ The fabric does not support FDMI, check fabric configuration. }} class: unknown sl_severity: warning refcode: "" message: lpfc_printf_vlog KERN_INFO "FIND node did x%x NOT FOUND.\n" description {{ The driver was searching for a node table entry based on the DID and the entry was not found. DATA: (1) order }} action {{ No action needed, informational. }} class: software type: info refcode: "" message: lpfc_printf_vlog KERN_INFO "FLOGI completes successfully Data: x%x x%x x%x x%x\n" description {{ An ELS FLOGI command that was sent to the fabric succeeded. DATA: (1) ulpWord[4] (2) e_d_tov (3) r_a_tov (4) edtovResolution }} action {{ No action needed, informational. }} class: unknown type: info refcode: "" message: lpfc_printf_vlog KERN_INFO "FLOGI failure Data: x%x x%x x%x\n" description {{ An ELS FLOGI command that was sent to the fabric failed. DATA: (1) ulpStatus (2) ulpWord[4] (3) ulpTimeout }} action {{ No action needed, informational. }} class: unknown type: info refcode: "" message: lpfc_printf_vlog KERN_INFO "FLOGI NPIV supported, response data 0x%x\n" description {{ The fabric reports support for NPIV upon FLOGI. DATA: (1) response_multiple_NPort }} action {{ No action needed, informational. }} class: unknown type: info refcode: "" message: lpfc_printf_vlog KERN_ERR "GID_FT Query error: 0x%x 0x%x\n" description {{ The GID_FT CT request for the nameserver has failed. }} action {{ Check the switch configuration. }} class: unknown sl_severity: error refcode: "" message: lpfc_printf_vlog KERN_ERR "Ignoring change to nodev_tmo because devloss_tmo is set.\n" description {{ Attempting to change the nodev timeout when the devloss has already been set. }} action {{ None required. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_vlog KERN_ERR "Ignoring nodev_tmo module parameter because devloss_tmo is set.\n" description {{ Both module parameters (nodev and devloss) were set so the driver is ignoring the nodev parameter. }} action {{ Only one of these parameters must be set. }} class: software sl_severity: error refcode: "" message: lpfc_printf_vlog KERN_ERR "Illegal State Transition: node x%x event x%x, state x%x Data: x%x x%x\n" description {{ The current node state does not have a handler for this event. DATA: (1) nlp_rpi (2) nlp_flag }} action {{ Verify that all targets are still visible to the SCSI mid-layer. }} class: unknown sl_severity: error refcode: "" message: lpfc_printf_vlog KERN_ERR "Init VPI mailbox failed 0x%x\n" description {{ The Initialize VPI mailbox command failed. }} action {{ None required. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_vlog KERN_ERR "Invalid response length: tgt x%x lun x%x cmnd x%x rsplen x%x\n" description {{ The response length for this FCP command is not supported. }} action {{ None required. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_vlog KERN_INFO "Iodone <%d/%d> cmd %p, error x%x SNS x%x x%x Data: x%x x%x\n" description {{ This error indicates that the Fibre Channel driver is returning a SCSI command to the SCSI layer in error or with sense data. DATA: (1) retry (2) resid }} action {{ No action needed, informational. }} class: software type: info refcode: "" message: lpfc_printf_vlog KERN_ERR "I/O flush failure for context %s : cnt x%x\n" description {{ The I/O flush to the {LUN TARGET or HOST] has failed. }} action {{ None required. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_vlog KERN_ERR "Issue FDISC: Cannot send IOCB\n" description {{ Unable to send the fabric IOCB. }} action {{ None required. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_vlog KERN_ERR "Issue FDISC: no IOCB\n" description {{ All of the pre-allocated IOCBs are in use. }} action {{ None required. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_vlog KERN_WARNING "Issue FDMI request failed Data: x%x\n" description {{ Cannot issue an FDMI request to the HBA. DATA: (1) cmdcode }} action {{ No action needed, informational. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_vlog KERN_INFO "Issue GEN REQ IOCB to NPORT x%x Data: x%x x%x\n" description {{ Issue a GEN REQ IOCB for remote NPORT. These are typically used for CT request. DATA: (1) ulpIoTag (2) hba_state }} action {{ No action needed, informational. }} class: software type: info refcode: "" message: lpfc_printf_vlog KERN_ERR "Issue NameServer Req x%x err %d Data: x%x x%x\n" description {{ The driver was not able to send the nameserver CT command. DATA: (1) vports fc_flag (2) vports fc_rscn_id_cn }} action {{ Check the port and switch configurations. }} class: software sl_severity: error refcode: "" message: lpfc_printf_vlog KERN_ERR "Issue Register VFI failed: Err %d\n" description {{ The driver could not register the Virtual Fabric Index for the FCFI. }} action {{ Check the switch and port configurations. }} class: software sl_severity: error refcode: "" message: lpfc_printf_vlog KERN_INFO "LOGO completes to NPort x%x Data: x%x x%x x%x x%x\n" description {{ The HBA performed a LOGO to a remote NPort. DATA: (1) ulpStatus (2) ulpWord[4] (3) ulpTimeout (4) num_disc_nodes }} action {{ No action needed, informational. }} class: software type: info refcode: "" message: lpfc_printf_vlog KERN_ERR "lpfc_alloc_bucket failed to allocate statistical data buffer DID 0x%x\n" description {{ Memory allocation failed for node’s statistical data. }} action {{ None required. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_vlog KERN_INFO "lpfc_cleanup_node: ndlp:x%p usgmap:x%x refcnt:%d\n" description {{ Node clean-up wascalled to prepare the node for release. }} action {{ No action needed, informational. }} class: software type: info refcode: "" message: lpfc_printf_vlog KERN_ERR "lpfc_devloss_tmo attribute cannot be set to %d, allowed range is [%d, %d]\n" description {{ Attempt to set the devloss timeout value is outside the allowed range. }} action {{ Set the devloss timeout between the minimum and maximum devloss range. }} class: software sl_severity: error refcode: "" message: lpfc_printf_vlog KERN_WARNING "lpfc_enable_node: ndlp:x%p usgmap:x%x refcnt:%d\n" description {{ Enable node was attempted on an inactive node. }} action {{ No action needed, informational. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_vlog KERN_WARNING "lpfc_nlp_get: ndlp:x%p usgmap:x%x refcnt:%d\n" description {{ A kref_get was attempted on a node that was being released. }} action {{ No action needed, informational. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_vlog KERN_WARNING "lpfc_nlp_put: ndlp:x%p usgmap:x%x refcnt:%d\n" description {{ A kref_put was called again after the node was already inactive. }} action {{ No action needed, informational. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_vlog KERN_ERR "lpfc_nlp_state_cleanup failed to allocate statistical data buffer DID 0x%x\n" description {{ Memory allocation failed for node’s statistical data. }} action {{ None required. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_vlog KERN_ERR "lpfc_nodev_tmo attribute cannot be set to %d, allowed range is [%d, %d]\n" description {{ The attempt to set the devloss timeout value failed because the value is out of the allowable range. }} action {{ Use a value between the minimum and maximum values. }} class: software sl_severity: error refcode: "" message: lpfc_printf_vlog KERN_ERR "lpfc_restrict_login attribute cannot be set to %d, allowed range is [0, 1]\n" description {{ The module parameter lpfc_restrict_login can only be set to 0 (off) or 1 (on). }} action {{ Set lpfc_restrict_login=[0,1]. }} class: software sl_severity: error refcode: "" message: lpfc_printf_vlog KERN_ERR "lpfc_restrict_login must be 0 for Physical ports.\n" description {{ Attempt to set the restrict login parameter to something other than on or off. }} action {{ Use 0 (Off) or 1 (On). }} class: software sl_severity: error refcode: "" message: lpfc_printf_vlog KERN_ERR "NameServer GFF Rsp x%x Error (%d %d) Data: x%x x%x\n" description {{ The nameServer GFF CT request failed. DATA: (1) vports fc_flag (2) vports fc_rscn_id_cnt }} action {{ Check the port and switch configurations. }} class: hardware sl_severity: error refcode: "" message: lpfc_printf_vlog KERN_ERR "NameServer login: node freed\n" description {{ The enable mode failed to free up the nameserver login. }} action {{ None required. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_vlog KERN_ERR "NameServer login: no memory\n" description {{ Could not allocate memory for the NDLP structure. }} action {{ None required. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_vlog KERN_ERR "NameServer Query timeout Data: x%x x%x\n" description {{ Node authentication timeout, node Discovery timeout. A NameServer Query to the Fabric or discovery of reported remote NPorts is not acknowledged within R_A_TOV. DATA: (1) fc_ns_retry (2) fc_max_ns_retry }} action {{ Check Fabric configuration. The driver recovers from this and continues with device discovery. }} class: unknown sl_severity: error refcode: "" message: lpfc_printf_vlog KERN_ERR "NameServer Rsp Data: x%x\n" description {{ The driver received a NameServer response containing a status error. DATA: (1) CommandResponse.bits.CmdRsp (2) ReasonCode (3) Explanation (4) fc_flag }} action {{ Check the fabric configuration. The driver recovers from this and continues with device discovery. }} class: unknown sl_severity: error refcode: "" message: lpfc_printf_vlog KERN_ERR "Node Authentication timeout\n" description {{ The driver has lost track of what NPORTs are being authenticated. }} action {{ None required. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_vlog KERN_ERR "Nodelist not empty\n" description {{ Driver unloaded or hotplug detected a node still in use. }} action {{ None required. }} class: unknown sl_severity: warning refcode: "" message: lpfc_printf_vlog KERN_ERR "No NPIV Fabric support\n" description {{ The driver was unable to create an NPIV Vport because it is not supported by the attached fabric. DATA: (1) rctl_names[fc_hdr->fh_r_ctl], (2) type_names[fc_hdr->fh_type]) }} action {{ Reconfigure the switch to support NPIV. }} class: software sl_severity: error refcode: "" message: lpfc_printf_vlog KERN_ERR "No retry ELS command x%x to remote NPORT x%x Retried:%d Error:x%x/%x\n" description {{ (1) ulpStatus (2) ulpWord[4] }} action {{ None required. }} class: software sl_severity: error refcode: "" message: lpfc_printf_vlog KERN_ERR "NS cmd %x Error (%d %d)\n" description {{ The nameServer CT request failed. }} action {{ Check the port and switch configurations. }} class: software sl_severity: error refcode: "" message: lpfc_printf_vlog KERN_ERR "Pending Link Event during Discovery: State x%x\n" description {{ Received link event during discovery. Causes discovery restart. }} action {{ None required unless problem persists. If persistent check cabling. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_vlog KERN_ERR "PLOGI: cannot format reg_login Data: x%x x%x x%x x%x\n" description {{ Could not allocate an RPI or DMA buffer for the mailbox command. DATA: (1) nlp_DID (2) nlp_state (3) nlp_flag (4) nlp_rpi }} action {{ None required. }} class: software sl_severity: error refcode: "" message: lpfc_printf_vlog KERN_ERR "PLOGI: cannot issue reg_login Data: x%x x%x x%x x%x\n" description {{ The ELS PLOGI mailbox command has failed. DATA: (1) nlp_DID 92) nlp_state (3) nlp_flag (4) nlp_rpi }} action {{ Check the port and switch configuration. }} class: software sl_severity: error refcode: "" message: lpfc_printf_vlog KERN_INFO "PLOGI chkparm OK Data: x%x x%x x%x x%x\n" description {{ Received a PLOGI from a remote NPORT and its Fibre Channel service parameters match this HBA. Request can be accepted. DATA: (1) nlp_DID (2) nlp_state (3) nlp_flag (4) nlp_Rpi }} action {{ No action needed, informational. }} class: software type: info refcode: "" message: lpfc_printf_vlog KERN_INFO "PLOGI completes to NPort x%x Data: x%x x%x x%x x%x x%x\n" description {{ The HBA performed a PLOGI into a remote NPort. DATA: (1) ulpStatus (2) ulpWord[4] (3) ulpTimeout (4)disc (5) num_disc_nodes }} action {{ No action needed, informational. }} class: software type: info refcode: "" message: lpfc_printf_vlog KERN_ERR "PLOGI completes to NPort x%x with no ndlp. Data: x%x x%x x%x\n" description {{ A PLOGI has completed for which there is no NDLP. DATA: (1) ulpStatus (2) ulpWord[4] }} action {{ None required. }} class: software sl_severity: error refcode: "" message: lpfc_printf_vlog KERN_ERR "PLOGI: no memory for reg_login Data: x%x x%x x%x x%x\n" description {{ Memory allocation error. DATA: (1) nlp_DID (2) nlp_state (3) nlp_flag (4) nlp_rpi }} action {{ Memory allocation error. Check system resources. Unload unused modules. }} class: software sl_severity: error refcode: "" message: lpfc_printf_vlog KERN_ERR "PLOGI Reject: invalid nname\n" description {{ Invalid node WWN provided. }} action {{ None required. }} class: software sl_severity: error refcode: "" message: lpfc_printf_vlog KERN_ERR "PLOGI RSP: Invalid WWN.\n" description {{ The PLOGI sent to the port by a remote port had an invalid WWN. }} action {{ None required. }} class: software sl_severity: error refcode: "" message: lpfc_printf_vlog KERN_INFO "PRLI completes to NPort x%x Data: x%x x%x x%x x%x\n" description {{ The HBA performed a PRLI into a remote NPort. DATA: (1) ulpStatus (2) ulpWord[4] (3) ulpTimeout (4) num_disc_nodes }} action {{ No action needed, informational. }} class: software type: info refcode: "" message: lpfc_printf_vlog KERN_INFO "Process x%x NameServer Rsp Data: x%x x%x x%x\n" description {{ The driver received a NameServer response. DATA: (1) nlp_flag (2) fc_flag (3) fc_rscn_id_cnt }} action {{ No action needed, informational. }} class: software type: info refcode: "" message: lpfc_printf_vlog KERN_ERR "READ_SPARAM mbxStatus error x%x hba state x%x>\n" description {{ The driver issued a READ_SPARAM mbox command to the HBA that failed. }} action {{ This error could indicate a firmware or hardware problem. Report these errors to Technical Support. }} class: unknown sl_severity: error refcode: "" message: lpfc_printf_vlog KERN_INFO "ReDiscovery RSCN Data: x%x x%x x%x\n" description {{ The number / type of RSCNs has forced the driver to go to the nameserver and rediscover all NPORTs. DATA: (1) fc_rscn_id_cnt (2) fc_flag (3) hba_state }} action {{ No action needed, informational. }} class: software type: info refcode: "" message: lpfc_printf_vlog KERN_ERR "REG_FCFI mbxStatus error x%x HBA state x%x\n" description {{ The REG_FCFI mailbox command has failed. }} action {{ None required. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_vlog KERN_ERR "Register Fabric login error: 0x%x\n" description {{ The REG_LOGIN for the fabric has failed. }} action {{ Check the port connection and the switch configuration. }} class: software sl_severity: error refcode: "" message: lpfc_printf_vlog KERN_ERR "Register NameServer error: 0x%x\n" description {{ The REG_LOGIN mailbox command has failed for the nameserver. }} action {{ Check the switch configuration }} class: software sl_severity: error refcode: "" message: lpfc_printf_vlog KERN_ERR "Register VPI: Can't send mbox\n" description {{ Could not issue the REG_LOGIN command for this VPort. }} action {{ None required. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_vlog KERN_ERR "Register VPI: no memory\n" description {{ Could not allocate memory for the REG_LOGIN mailbox command. }} action {{ None required. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_vlog KERN_ERR "RegLogin failed Data: x%x x%x x%x\n" description {{ The firmware returned a failure for the specified RegLogin. DATA: (1) Did (2) mbxStatus (3) hbaState }} action {{ This message indicates that the firmware could not do RegLogin for the specified Did. There may be a limitation on how many nodes an HBA can see. }} class: firmware sl_severity: error refcode: "" message: lpfc_printf_vlog KERN_ERR "REG_VFI mbxStatus error x%x HBA state x%x\n" description {{ The REG_VFI mailbox command has failed. }} action {{ None required. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_vlog KERN_INFO "Retry ELS command x%x to remote NPORT x%x Data: x%x x%x\n" description {{ The driver is retrying the specific ELS command. DATA: (1) retry (2) delay }} action {{ No action needed, informational. }} class: software type: info refcode: "" message: lpfc_printf_vlog KERN_INFO "RSCN processed Data: x%x x%x x%x x%x\n" description {{ An RSCN ELS command was received from a fabric and processed. DATA: (1) fc_flag (2) cnt (3) fc_rscn_id_cnt (4) hba_state }} action {{ No action needed, informational. }} class: software type: info refcode: "" message: lpfc_printf_vlog KERN_INFO "RSCN received Data: x%x x%x x%x x%x\n" description {{ An RSCN ELS command was received from a fabric. DATA: (1) fc_flag (2) payload_len (3) *lp (4)fc_rscn_id_cnt }} action {{ No action needed, informational. }} class: software type: info refcode: "" message: lpfc_printf_vlog KERN_ERR "RSCN timeout Data: x%x x%x\n" description {{ The driver has lost track of what NPORTs have RSCNs pending. DATA: (1) fc_ns_retry (2) lpfc_max_ns_retry }} action {{ None required. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_vlog KERN_ERR "SCSI layer issued Bus Reset Data: x%x\n" description {{ The SCSI layer is requesting the driver to abort all I/Os to all targets on this HBA. DATA: (1) ret }} action {{ Check the state of the targets in question. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_vlog KERN_ERR "Signal aborted mbxCmd x%x\n" description {{ A pending mailbox command was aborted because the thread received a signal. }} action {{ You should retry the attempted command. }} class: software sl_severity: error refcode: "" message: lpfc_printf_vlog KERN_INFO "Skip x%x NameServer Rsp Data: x%x x%x\n" description {{ The driver received a NameServer response. DATA: (1) size (2) fc_flag (3) fc_rscn_id_cnt (4)no_rscn_id_cnt }} action {{ No action needed, informational. }} class: software type: info refcode: "" message: lpfc_printf_vlog KERN_INFO "Start Discovery hba state x%x Data: x%x x%x x%x\n" description {{ Device discovery / rediscovery after FLOGI, FAN or RSCN has started. DATA: (1) fc_flag (2) fc_plogi_cnt (3) fc_adisc_cnt }} action {{ No action needed, informational. }} class: software type: info refcode: "" message: lpfc_printf_vlog KERN_INFO "Start Discovery Timer state x%x Data: x%x x%lx x%x x%x\n" description {{ Start the device discovery / RSCN rescue timer. DATA: (1) tmo (2) fc_disctmo (3) fc_plogi_cnt (4) fc_adisc_cnt }} action {{ No action needed, informational. }} class: software type: info refcode: "" message: lpfc_printf_vlog KERN_ERR "Target Reset rport failure: rdata x%p\n" description {{ The reset of the target failed. }} action {{ None required. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_vlog KERN_ERR "Timeout while waiting for NameServer login\n" description {{ Our login request to the NameServer was not acknowledged within RATOV. }} action {{ Check the fabric configuration. The driver recovers from this and continues with device discovery. }} class: software sl_severity: error refcode: "" message: lpfc_printf_vlog KERN_ERR "TMF %s to TGT %d LUN %d failed (%d, %d)\n" description {{ The task management command failed. }} action {{ None required. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_vlog KERN_ERR "Unexpected discovery timeout, vport State x%x\n" description {{ The discovery process has timed out. }} action {{ Verify that all targets are still visible. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_vlog KERN_ERR "Unexpected timeout, hba link state x%x\n" description {{ Discovery has timed out and the HBA state is not ready. }} action {{ None required. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_vlog KERN_ERR "Unknown ELS command x%x received from NPORT x%x\n" description {{ Received an unsupported ELS command from a remote NPORT. }} action {{ Check remote NPORT for potential problem. }} class: software sl_severity: error refcode: "" message: lpfc_printf_vlog KERN_INFO "Vport Created.\n" description {{ This message is displayed to indicate that a port was created in the system. It is displayed at this level to ensure it is always appears at all log levels. }} action {{ None required. }} class: software type: info refcode: "" message: lpfc_printf_vlog KERN_ERR "Vport Disabled.\n" description {{ The port had to be disabled in the system. }} action {{ None required. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_vlog KERN_ERR "vport_delete failed: Cannot delete physical host\n" description {{ An attempt to delete a port failed because it was to delete a physical port and not a virtual port. Only VPorts on physical ports can be deleted on an NPIV system. }} action {{ Software driver error. If this problem persists, report these errors to Technical Support. }} class: software sl_severity: error refcode: "" message: lpfc_printf_vlog KERN_ERR "vport_delete failed: Cannot delete static vport.\n" description {{ Static VPorts cannot be deleted. }} action {{ None required. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_vlog KERN_ERR "Vport Deleted.\n" description {{ A Vport was deleted. }} action {{ None required. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_vlog KERN_ERR "Vport discovery quiesce Wait: state x%x fc_flags x%x num_nodes x%x, waiting 1000 msecs total wait msecs x%x\n" description {{ Could not pause discovery on this VPort. }} action {{ None required. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_vlog KERN_ERR "Vport Enabled.\n" description {{ The port had to be enabled after possible recovery from some errors. }} action {{ None required. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_vlog KERN_ERR "VPort failed init, mbxCmd x%x READ_SPARM mbxStatus x%x, rc = x%x\n" description {{ A pending mailbox command issued to initialize port, failed. DATA: (1) mbxCommand (2) mbxStatus (3) rc }} action {{ Software driver error. If this problem persists, report these errors to Technical Support. }} class: software sl_severity: error refcode: "" message: lpfc_printf_vlog KERN_INFO "Xmit ADISC ACC response iotag x%x xri: x%x, did x%x, nlp_flag x%x, nlp_state x%x rpi x%x\n" description {{ An ADISC ACC response for the specified IO tag has been sent. DATA: (1) xri (for SLI-4) (2) ulpContext (3) nlp_DID (4) nlp_flag (5) nlp_state (6) nlp_rpi }} action {{ No action needed, informational. }} class: software type: info refcode: "" message: lpfc_printf_vlog KERN_INFO "Xmit ELS ACC response tag x%x, XRI: x%x, DID: x%x, nlp_flag: x%x nlp_state: x%x RPI: x%x\n" description {{ An ELS accept response for the specified IO tag has been sent. DATA: (1) ulpContext (2) nlp_DID (3) nlp_flag (4) nlp_state (5) nlp_rpi }} action {{ No action needed, informational. }} class: software type: info refcode: "" message: lpfc_printf_vlog KERN_INFO "Xmit ELS command x%x to remote NPORT x%x I/O tag: x%x, port state: x%x\n" description {{ Xmit ELS command to remote NPORT. DATA: (1) icmd->ulpIoTag (2) hba_state }} action {{ No action needed, informational. }} class: software type: info refcode: "" message: lpfc_printf_vlog KERN_INFO "Xmit ELS response x%x to remote NPORT x%x I/O tag: x%x, size: x%x\n" description {{ Xmit ELS response to remote NPORT. DATA: (1) icmd->ulpIoTag (2) size }} action {{ No action needed, informational. }} class: software type: info refcode: "" message: lpfc_printf_vlog KERN_INFO "Xmit ELS RJT x%x response tag x%x xri x%x, did x%x, nlp_flag x%x, nlp_state x%x, rpi x%x\n" description {{ An ELS reject response with the specified error for the specified IO tag has been sent. DATA: (1) xri (for SLI-4) (2) ulpContext (3) nlp_DID (4) nlp_flag (5) nlp_state (6) nlp_rpi }} action {{ No action needed, informational. }} class: software type: info refcode: "" message: lpfc_printf_vlog KERN_INFO "Xmit ELS RPL ACC response tag x%x xri x%x, did x%x, nlp_flag x%x, nlp_state x%x, rpi x%x\n" description {{ An RPL ACC response for the specified IO tag has been sent. DATA: (1) xri (for SLI-4) (2) ulpContext (3) nlp_DID (4) nlp_flag (5) nlp_state (6) nlp_rpi }} action {{ No action needed, informational. }} class: software type: info refcode: "" message: lpfc_printf_vlog KERN_INFO "Xmit ELS RPS ACC response tag x%x xri x%x, did x%x, nlp_flag x%x, nlp_state x%x, rpi x%x\n" description {{ An RPS ACC response for the specified IO tag has been sent. DATA: (1) xri (for SLI-4) (2) ulpContext (3) nlp_DID (4) nlp_flag (5) nlp_state (6) nlp_rpi }} action {{ No action needed, informational. }} class: software type: info refcode: "" message: lpfc_printf_vlog KERN_INFO "Xmit PRLI ACC response tag x%x xri x%x, did x%x, nlp_flag x%x, nlp_state x%x, rpi x%x\n" description {{ A PRLI ACC response for the specified IO tag has been sent. DATA: (1) xri (for SLI-4) (2) ulpContext (3) nlp_DID (4) nlp_flag (5) nlp_state (6) nlp_rpi }} action {{ No action needed, informational. }} class: software type: info refcode: "" message: lpfc_printf_vlog KERN_INFO "Xmit RNID ACC response tag x%x xri x%x\n" description {{ A RNID ACC response for the specified IO tag has been sent. DATA: (1) ulpContext }} action {{ No action needed, informational. }} class: software type: info refcode: "" ppc64-diag-2.6.4/ela/message_catalog/e1000e0000644000000000000000000007731012313010662016555 0ustar rootrootsubsystem: net devspec(device) = "/sys/bus/pci/devices/$device/devspec" devspec(netdev) = "/sys/class/net/$netdev/device/devspec" @copy diags_eeprom_replace {{ 1. Execute diagnostics on the adapter, using "ethtool -t". 2. Check the EEPROM level on the failing adapter. 3. Replace the adapter. }} /* Where do they see the errno they should check against errno.h? */ /* Note: e1000e kernel driver files have been moved from drivers/net/e1000e to * drivers/net/ethernet/intel/e1000e folder. */ file: "drivers/net/ethernet/intel/e1000e/82571.c" /* * Note: hw_dbg is now e_dbg since * kernel commit 3bb99fe226ead584a4db674dab546689f705201f * * Skip debug code. * e_dbg "Error getting PHY ID\n" * e_dbg "PHY ID unknown: type = 0x%08x\n" * e_dbg "Please update your 82571 Bootagent\n" * e_dbg "Driver can't access device - SMBI bit is set.\n" * e_dbg "Driver can't access the NVM\n" * e_dbg "Driver can't access the PHY\n" * e_dbg "nvm parameter(s) out of bounds\n" * e_dbg "MNG configuration cycle has not completed.\n" * e_dbg "PCI-E Master disable polling has failed.\n" * e_dbg "Masking off all interrupts\n" * e_dbg "Cannot acquire MDIO ownership\n" * e_dbg "Issuing a global reset to MAC\n" * e_dbg "Error initializing identification LED\n" * e_dbg "Initializing the IEEE VLAN\n" * e_dbg "Zeroing the MTA\n" * e_dbg "AN_UP -> AN_PROG\n" * e_dbg "FORCED_UP -> AN_PROG\n" * e_dbg "AN_PROG -> AN_UP\n" * e_dbg "AN_PROG -> DOWN\n" * e_dbg "Error config flow control\n" * e_dbg "AN_PROG -> FORCED_UP\n" * e_dbg "DOWN -> AN_PROG\n" * e_dbg "ANYSTATE -> DOWN\n" * e_dbg "ANYSTATE -> DOWN\n" * e_dbg "ANYSTATE -> AN_PROG\n" * e_dbg "NVM Read Error\n" */ file: "drivers/net/ethernet/intel/e1000e/80003es2lan.c" /* * e_dbg "Driver can't access resource, SW_FW_SYNC timeout.\n" * e_dbg "MNG configuration cycle has not completed.\n" * e_dbg "GG82563 PSCR: %X\n" * e_dbg "Waiting for forced speed/duplex link on GG82563 phy.\n" * e_dbg "PCI-E Master disable polling has failed.\n" * e_dbg "Masking off all interrupts\n" * e_dbg "Issuing a global reset to MAC\n" * e_dbg "Error initializing identification LED\n" * e_dbg "Initializing the IEEE VLAN\n" * e_dbg "Zeroing the MTA\n" * e_dbg "Error Resetting the PHY\n" */ file: "drivers/net/ethernet/intel/e1000e/ethtool.c" message: e_err "Unsupported Speed/Duplex configuration\n" description {{ Using the "ethtool -s" command, an attempt has been made to configure an incompatible combination of speed and duplex parameters. In particular, the only combination available for fiber is 1000 Mbps, full duplex. }} action {{ Specify a speed/duplex combination that is supported by your adapter and driver. }} class: software type: config refcode: "UnsupportSpeed/Duplex" /* dup: e_err "Unsupported Speed/Duplex configuration\n" */ message: e_err "Cannot change link characteristics when SoL/IDER is active.\n" description {{ Using the "ethtool -s" command, an attempt has been made to change link settings while a PHY (physical layer device) reset is blocked by firmware. }} action {{ 1. Try again later. 2. Execute diagnostics on the adapter, using "ethtool -t". }} class: hardware type: temp refcode: "BLKRstPHY" message: e_err "forcing MDI/MDI-X state is not supported when link speed and/or duplex are forced\n" description {{ MDI setting is only allowed when autoneg enabled because some hardware doesn't allow MDI setting when speed or duplex is forced. }} action {{ 1. Enable autoneg to allow MDI setting. 2. Dont force speed and/or duplex. }} class: hardware type: temp refcode: "MDIreqAutoneg" message[chatter]: e_info "TSO is %s\n" message[defensive]: e_err "pattern test reg %04X failed: got 0x%08X expected 0x%08X\n" message[defensive]: e_err "set/check reg %04X test failed: got 0x%08X expected 0x%08X\n" message: e_err "failed STATUS register test got: 0x%08X expected: 0x%08X\n" description {{ An adapter self-test, run with "ethtool -t ... offline", has failed reading the STATUS register. }} action {{ Run "ethtool -d" to obtain a register dump, and contact your service provider. }} class: hardware type: temp refcode: "RegTestFail" message[chatter]: e_info "testing %s interrupt\n" message: e_err "Cannot setup 1Gbps loopback.\n" description {{ Workaround: K1 must be disabled for stable 1Gbps operation 82577/8 must acquire h/w semaphore before workaround. }} action {{ 1. Re-try after some time. (?) 2. TBD }} class: hardware type: temp refcode: "AcqHwSemaphore" message: e_err "Cannot do PHY loopback test when SoL/IDER is active.\n" description {{ In an adapter self-test, run with the "ethtool -t ... offline" command, a loopback test has been cancelled because a PHY (physical layer device) reset is blocked by firmware. }} action {{ 1. Try again later. 2. In the absence of any other problem reports, it's probably OK to ignore this failure. }} class: hardware type: temp refcode: "BLKRstPHY" message[chatter]: e_info "offline testing starting\n" message[chatter]: e_info "online testing starting\n" message[defensive]: e_err "Interface does not support directed (unicast) frame wake-up packets\n" file: "drivers/net/ethernet/intel/e1000e/ich8lan.c" /* * e_dbg "Failed to initialize PHY flow\n" * e_dbg "Required LANPHYPC toggle blocked by ME\n" * e_dbg "Toggling LANPHYPC\n" * e_dbg "Cannot determine PHY addr. Erroring out\n" * e_dbg "ERROR: Flash registers not mapped\n" * e_dbg "Error configuring flow control\n" * e_dbg "contention for Phy access\n" * e_dbg "SW has already locked the resource.\n" * e_dbg "Failed to acquire the semaphore, FW or HW has it: FWSM=0x%8.8x EXTCNF_CTRL=0x%8.8x)\n" * e_dbg "Semaphore unexpectedly released by sw/fw/hw\n" * e_dbg "SHRA[%d] might be locked by ME - FWSM=0x%8.8x\n" * e_dbg "Failed to write receive address at index %d\n" * e_dbg "Unsupported SMB frequency in PHY\n" * e_dbg "SW/FW/HW has locked the resource for too long.\n" * e_dbg "Failed to acquire the semaphore.\n" * e_dbg "IFE PMC: %X\n" * e_dbg "Waiting for forced speed/duplex link on IFE phy.\n" * e_dbg "Link taking longer than expected.\n" * e_dbg "LAN_INIT_DONE not set, increase timeout\n" * e_dbg "Phy info is only valid if link is up\n" * e_dbg "Unable to determine valid NVM bank via EEC - reading flash signature\n" * e_dbg "ERROR: No valid NVM bank present\n" * e_dbg "nvm parameter(s) out of bounds\n" * e_dbg "Could not detect valid bank, assuming bank 0\n" * e_dbg "NVM read error: %d\n" * e_dbg "Flash descriptor invalid. SW Sequencing must be used." sic * e_dbg "Flash controller busy, cannot get access" sic * e_dbg "Timeout error - flash cycle did not complete." sic * e_dbg "nvm parameter(s) out of bounds\n" * e_dbg "Could not detect valid bank, assuming bank 0\n" * e_dbg "Flash commit failed.\n" * e_dbg "NVM update error: %d\n" * e_dbg "Timeout error - flash cycle did not complete." sic * e_dbg "Retrying Byte %2.2X at offset %u\n" * e_dbg "NVM Read Error\n" * e_dbg "PCI-E Master disable polling has failed.\n" * e_dbg "Masking off all interrupts\n" * e_dbg "Issuing a global reset to ich8lan\n" * e_dbg "Auto Read Done did not complete\n" * e_dbg "Error initializing identification LED\n" * e_dbg "Zeroing the MTA\n" * e_dbg "After fix-ups FlowControl is now = %x\n" * e_dbg "Workaround applies to ICH8 only.\n" * e_dbg "Failed to init PHY flow ret_val=%d\n" * e_dbg "Failed to setup iRST\n" * e_dbg "Error %d in resume workarounds\n" * e_dbg "Auto Read Done did not complete\n" * e_dbg "PHY Reset Asserted not set - needs delay\n" * e_dbg "EEPROM not present\n" */ file: "drivers/net/ethernet/intel/e1000e/mac.c" /* * e_dbg "Programming MAC Address into RAR[0]\n" * e_dbg "Clearing RAR[1-%u]\n" */ message[defensive]: printk KERN_ERR "multicast array memory allocation failed\n" /* * e_dbg "Hash value = 0x%03X\n" */ message: e_dbg "Error configuring flow control\n" description {{ After detecting a link change, the driver failed to reconfigure and restore the flow-control parameters. The failure was probably either in autonegotiation or in forcing the desired speed and duplex parameters. }} action {{ Run the ethtool command (e.g., "ethtool eth0") to check the adapter's speed/duplex and flow-control settings. }} class: hardware sl_severity: warning refcode: "ErrCfgFC" message: e_dbg "NOT RXing /C/, disable AutoNeg and force link.\n" /* Wen has: "NOT RXing, disable AutoNeg and force link" */ description {{ Autonegotiation with the adapter's link partner has failed, or the link partner is not trying to autonegotiate. The adapter will treat the link as up. }} action {{ 1. Verify that the adapter's cable to the network is plugged in. 2. Run the ethtool command (e.g., "ethtool eth0") to verify that autonegotiation is enabled. }} class: software sl_severity: warning refcode: "ErrCfgFC" /* * e_dbg "Ignoring Alternate Mac Address with MC bit set\n" * e_dbg "Error configuring flow control\n" * e_dbg "RXing /C/, enable AutoNeg and stop forcing link.\n" * dup: e_dbg "NOT RXing /C/, disable AutoNeg and force link.\n" * dup: e_dbg "Error configuring flow control\n" * dup: e_dbg "RXing /C/, enable AutoNeg and stop forcing link.\n" * e_dbg "SERDES: Link up - forced.\n" * e_dbg "SERDES: Link down - force failed.\n" * e_dbg "SERDES: Link up - autoneg completed sucessfully.\n" * e_dbg "SERDES: Link down - invalidcodewords detected in autoneg.\n" * e_dbg "SERDES: Link down - no sync.\n" * e_dbg "SERDES: Link down - autoneg failed\n" */ message: e_dbg "NVM Read Error\n" description {{ In an attempt to set the adapters's default flow control setting, a read from the adapter's EEPROM failed. }} action {{ @paste diags_eeprom_replace }} class: hardware sl_severity: warning refcode: "BF778E00" /* * e_dbg "After fix-ups FlowControl is now = %x\n" * e_dbg "Initializing the Flow Control address, type and timer regs\n" */ message: e_dbg "Flow control param set incorrectly\n" description {{ For a copper or forced fiber connection, the driver tried to adjust the flow-control setting, but the current setting is in error. }} action {{ 1. Run diagnostics using the "ethtool -t" command. 2. Check the flow-control settings in drivers/net/e1000e/param.c in the kernel source. [I don't see any mention of flow control in param.c] 3. Check the EEPROM level on the failing adapter. }} class: software sl_severity: warning refcode: "FCParaWrong" /* * e_dbg "Never got a valid link from auto-neg!!!\n" */ message: e_dbg "Error while checking for link\n" description {{ After autonegotiation failed, the adapter attempted to force the link up, but that also failed; no signal was detected. }} action {{ 1. Run diagnostics using the "ethtool -t" command. [And then what?] }} class: software sl_severity: warning refcode: "FCParaWrong" /* * e_dbg "Valid Link Found\n" * e_dbg "Auto-negotiation enabled\n" * e_dbg "No signal detected\n" * e_dbg "hw->fc.current_mode = %u\n" * dup: e_dbg "Flow control param set incorrectly\n" */ message: e_dbg "Error forcing flow control settings\n" description {{ For a copper or forced fiber connection, the driver's attempt to adjust the flow-control setting failed. }} action {{ 1. Run diagnostics using the "ethtool -t" command. 2. Check the flow-control settings in drivers/net/e1000e/param.c in the kernel source. [I don't see any mention of flow control in param.c] 3. Check the EEPROM level on the failing adapter. }} class: software sl_severity: warning refcode: "ErrForceFC" /* * e_dbg "Copper PHY and Auto Neg has not completed.\n" * e_dbg "Flow Control = FULL.\r\n" * e_dbg "Flow Control = RX PAUSE frames only.\r\n" * e_dbg "Flow Control = Tx PAUSE frames only.\r\n" * e_dbg "Flow Control = Rx PAUSE frames only.\r\n" * e_dbg "Flow Control = NONE.\r\n" */ message: e_dbg "Error getting link speed and duplex\n" description {{ After establishing a link, the adapter failed to obtain the link speed and duplex. }} action {{ Run the ethtool command (e.g., "ethtool eth0") to check the adapter's speed/duplex and flow-control settings. }} class: software sl_severity: warning refcode: "ErrSpeedDlx" /* * dup: e_dbg "Error forcing flow control settings\n" * e_dbg "1000 Mbs, "); sic * e_dbg "100 Mbs, "); sic * e_dbg "10 Mbs, "); sic * e_dbg "Full Duplex\n" * e_dbg "Half Duplex\n" */ message: e_dbg "Driver can't access device - SMBI bit is set.\n" description {{ The driver could not obtain exclusive access to the PHY (physical layer device) and/or NVM (non-volatile memory) as needed. }} action {{ @paste diags_eeprom_replace }} class: software sl_severity: warning refcode: "SMBIset" message: e_dbg "Driver can't access the NVM\n" description {{ The driver could not obtain exclusive access to the PHY (physical layer device) and/or NVM (non-volatile memory) as needed. }} action {{ @paste diags_eeprom_replace }} class: hardware type: perm refcode: "ErrAcessNVM" message: e_dbg "Auto read by HW from NVM has not completed.\n" description {{ The driver timed out while preparing to access the adapter's non-volatile memory. }} action {{ @paste diags_eeprom_replace }} class: hardware type: perm refcode: "AutoReadFail" /* * e_dbg "NVM Read Error\n" * e_dbg "Master requests are pending.\n" * e_dbg "Not in Adaptive IFS mode!\n" */ message: e_dbg "Could not acquire NVM grant\n" description {{ While preparing to write to the adapter's non-volatile memory, the driver timed out trying to obtain exclusive access. }} action {{ 1. Run the "ethtool -i" command to check the adapter's firmware version. 2. Check the level of the adapter's EEPROM or NVRAM. [How do you do that? What do you do with this info once you have it?] 3. Replace the adapter. }} class: hardware type: perm refcode: "GrantNVMFail" message: e_dbg "SPI NVM Status error\n" description {{ While preparing to read or write the adapter's EEPROM, the driver timed out trying to read a status register. }} action {{ @paste diags_eeprom_replace }} class: hardware type: perm refcode: "SPINVMErr" message: e_dbg "nvm parameter(s) out of bounds\n" description {{ An attempt to read or write the adapter's EEPROM failed, apparently due to an internal error or hardware error. }} action {{ @paste diags_eeprom_replace }} class: hardware type: perm refcode: "ErrCfgNVM" /* * dup: e_dbg "nvm parameter(s) out of bounds\n" * dup: e_dbg "NVM Read Error\n" * dup: e_dbg "NVM Read Error\n" * dup: e_dbg "NVM Read Error\n" * dup: e_dbg "NVM Read Error\n" * e_dbg "NVM Checksum Invalid\n" */ message: e_dbg "NVM Read Error while updating checksum.\n" description {{ At attempt to read the adapter's EEPROM (in order to compute a new checksum) failed. }} action {{ 1. Run the "ethtool -i" command to check the adapter's firmware version. 2. Check the level of the adapter's EEPROM or NVRAM. [How do you do that? What do you do with this info once you have it?] }} class: hardware type: perm refcode: "ReadNVMFail" message: e_dbg "NVM Write Error while updating checksum.\n" description {{ An attempt to write a new EEPROM checksum failed. }} action {{ 1. Run the "ethtool -i" command to check the adapter's firmware version. 2. Check the level of the adapter's EEPROM or NVRAM. [How do you do that? What do you do with this info once you have it?] }} class: hardware type: perm refcode: "WriteNVMFail" /* * e_dbg "E1000_HOST_EN bit disabled.\n" * e_dbg "Previous command timeout failed .\n" * e_dbg "NVM Read Error\n" * e_dbg "NVM Read Error\n" */ file: "drivers/net/ethernet/intel/e1000e/netdev.c" message: dev_err "RX DMA map failed\n" description {{ The driver failed to create a DMA mapping for the adapter's receive buffer. }} action {{ 1. Reduce your current use of DMA mappings. [How?] 2. Delay bringing up the network interface; try again later. 3. Reboot the system. }} class: software sl_severity: error refcode: "RxDMAFail" message[defensive]: dev_err "RX DMA page map failed\n" /* duplicate: dev_err "RX DMA map failed\n" */ /* e_dbg "%s: Receive packet consumed multiple buffers\n" */ message[defensive]: e_err "Detected Tx Unit Hang:\n" /* e_dbg "%s: Packet Split buffers didn't pick up the full packet\n" */ /* e_dbg "%s: Last part of the packet spanning multiple descriptors\n" */ /* e_dbg "failed to enable jumbo frame workaround mode\n" */ message[defensive]: e_err "ME firmware caused invalid RDT - resetting\n" message[defensive]: e_err "ME firmware caused invalid TDT - resetting\n" /* See desc in kernel commit c6e7f51e73c1bc6044bce989ec503ef2e4758d55 */ message[defensive]: e_err "Detected Hardware Unit Hang:\n" /* Kernel commit: 41cec6f1160c110bd69597c2a5611b46e8287801 */ message: e_err "Try turning off Tx pause (flow control) via ethtool\n" description {{ There is a known issue in the 82577 and 82578 device that can cause a hang in the device hardware during traffic stress; the current workaround in the driver is to disable transmit flow control by default. }} action {{ 1. Try turning off Tx pause (flow control) via ethtool 2. Re-try after disabling transmit flow control }} class: software type: config refcode: "DisableFlowCtrl" message[defensive]: e_err "pskb_may_pull failed.\n" message: e_err "Failed to initialize MSI-X interrupts. Falling back to MSI interrupts.\n" description {{ MSI-X interrupts could not be enabled for this adapter, because either the kernel or the hardware doesn't support MSI-X mode. The driver will try to use MSI mode. }} action {{ 1. Execute diagnostics on the adapter, using "ethtool -t". 2. Verify that the adapter hardware and firmware support MSI-X mode. 3. Verify that the kernel supports MSI-X mode. }} class: software type: config refcode: "EnableMSIXFailed" message: e_err "Failed to initialize MSI interrupts. Falling back to legacy interrupts.\n" description {{ MSI interrupts could not be enabled for this adapter, because either the kernel or the hardware doesn't support MSI mode. The driver will try to use LSI mode. }} action {{ 1. Execute diagnostics on the adapter, using "ethtool -t". 2. Verify that the adapter hardware and firmware support MSI mode. 3. Verify that the kernel supports MSI mode. }} class: software type: config refcode: "EnableMSIFailed" message: e_err "Unable to allocate interrupt, Error: %d\n" description {{ While bringing up a network interface, the driver failed to configure interrupts for this adapter. }} action {{ 1. Find the error code in errno.h to determine the reason for the error. 2. Execute diagnostics on the adapter, using "ethtool -t". }} class: software sl_severity: error refcode: "ReqItrFail" message: e_err "Unable to allocate memory for the transmit descriptor ring\n" description {{ While bringing up a network interface, the driver failed to allocate memory for the transmit descriptor ring, probably because the system is low on memory. }} action {{ 1. With the ethtool command (-g and -G options), reduce the size of the adapter's transmit descriptor ring. 2. Free up memory and retry the failed operation. 3. Add memory to your system. }} class: software sl_severity: error refcode: "TxDMemFail" message: e_err "Unable to allocate memory for the receive descriptor ring\n" description {{ While bringing up a network interface, the driver failed to allocate memory for the receive descriptor ring, probably because the system is low on memory. }} action {{ 1. With the ethtool command (-g and -G options), reduce the size of the adapter's receive descriptor ring. 2. Free up memory and retry the failed operation. 3. Add memory to your system. }} class: software sl_severity: error refcode: "RxDMemFail" message: e_err "Unable to allocate memory for queues\n" description {{ While bringing up a network interface, the driver failed to allocate memory for the transmit and receive queues, probably because the system is low on memory. }} action {{ 1. With the ethtool command (-g and -G options), reduce the size of the adapter's transmit and/or descriptor rings. 2. Free up memory and retry the failed operation. 3. Add memory to your system. }} class: software sl_severity: error refcode: "QueueMemFail" message: e_err "Hardware Error\n" description {{ While bringing up a network interface, the driver failed to initialize the identification LED or failed to set up link and flow control. This is a non-fatal error. }} action {{ 1. Execute diagnostics on the adapter, using "ethtool -t". 2. Check the cable connections. }} class: hardware sl_severity: warning refcode: "HrdErr" /* e_dbg "%s: icr is %08X\n" */ message[chatter]: e_info "MSI interrupt test failed!\n" /* e_dbg "%s: MSI interrupt test succeeded!\n" */ message: e_warn "MSI interrupt test failed, using legacy interrupt.\n" description {{ One of the tests run via the "ethtool -t" command failed. MSI interrupt mode is not available, so the driver will try to use LSI mode. }} action {{ 1. Find the error code in errno.h to determine the reason for the error. 2. Verify that the adapter hardware and firmware support MSI mode. 3. Verify that the kernel supports MSI mode. }} class: software sl_severity: warning refcode: "MSIFailed" /* dup: e_info "MSI interrupt test failed, using legacy interrupt.\n" */ /* TODO: Is the explanation provided by Wen (#18) correct? */ message[defensive]: e_err "Interrupt allocation failed\n" message[defensive]: e_warn "Unable to create IPMI pass-through filter\n" message: e_warn "Error reading PHY register\n" description {{ This is only a warning message. }} action {{ No action necessary. }} class: software sl_severity: warning refcode: "ErrPHY" message[chatter]: printk KERN_INFO "e1000e: %s NIC Link is Up %d Mbps %s, Flow Control: %s\n" message[chatter]: e_info "Gigabit has been disabled, downgrading speed\n" message[chatter]: e_info "Autonegotiated half duplex but link partner cannot autoneg. Try forcing full duplex if link gets many collisions.\n" message[chatter]: e_info "10/100 speed: disabling TSO\n" message[chatter]: printk KERN_INFO "e1000e: %s NIC Link is Down\n" message[defensive]: e_warn "checksum_partial proto=%x!\n" message: dev_err "TX DMA map failed\n" description {{ The driver failed to create a DMA mapping for the adapter's transmit buffer. }} action {{ 1. Reduce your current use of DMA mappings. [How?] 2. Delay bringing up the network interface; try again later. 3. Reboot the system. }} class: software sl_severity: error refcode: "TxDMAFail" message[defensive]: e_err "__pskb_pull_tail failed.\n" message: e_err "Reset adapter\n" description {{ An unexpected reset has been called because of some unexpected behaviour. }} action {{ Reset (restart?) the network interface. }} class: software type: config refcode: "ResetAdapter" message: e_err "Jumbo Frames not supported.\n" description {{ The configured MTU size is appropriate for Jumbo Frames; however, the adapter doesn't support Jumbo Frames. The default size for Jumbo Frames is 9234 bytes. }} action {{ Use the ifconfig command to set the MTU value to within the proper range. }} class: software type: config refcode: "JmbFrames" message: e_err "Unsupported MTU setting\n" description {{ Different adapters support different ranges for the MTU (maximum transmit unit) parameter. A system administrator has apparently configured an MTU value that is too small or too big. }} action {{ Use the ifconfig command to set the MTU value to within the proper range. }} class: software type: config refcode: "badMtu" message: e_err "Jumbo Frames not supported on this device when CRC stripping is disabled.\n" description {{ Jumbo frames on 82579 and newer devcies requires CRC be stripped. }} action {{ Enable CRC stripping on this device. }} class: software type: config refcode: "JmbFramesCRCStrip" message[chatter]: e_info "changing MTU from %d to %d\n" message[defensive]: e_err "Could not acquire PHY\n" message[defensive]: e_err "Could not read PHY page 769\n" message[defensive]: e_err "Could not set PHY Host Wakeup bit\n" message[defensive]: dev_warn "Disabling L1 ASPM\n" message[defensive]: dev_err "Cannot enable PCI device from suspend\n" message[chatter]: e_info "PHY Wakeup cause - %s\n" message[chatter]: e_info "MAC Wakeup cause - %s\n" message[defensive]: dev_err "Cannot re-enable PCI device after reset.\n" message: dev_err "can't bring device back up after reset\n" description {{ This error happens during Enhanced Error Handling (EEH) on the PowerPC platform. During error recovery, the attempt to resume normal operation after a PCI bus reset failed. }} action {{ 1. Obtain a dump of the kernel stack and registers, and report the problem to your service provider. [How do you obtain a strack trace that's relevant to this problem?] 2. On a PowerPC platform, you can use the hotplug command to attempt to recover the adapter, rather than rebooting the Linux partition. [Where is the hotplug command documented? Under what circumstances SHOULD you reboot the partition?] }} class: software sl_severity: error refcode: "AEREnfail" message[chatter]: e_info "(PCI Express:2.5GB/s:%s) %pM\n" message[chatter]: e_info "Intel(R) PRO/%s Network Connection\n" message[chatter]: e_info "MAC: %d, PHY: %d, PBA No: %06x-%03x\n" message[defensive]: dev_warn "Warning: detected DSPD enabled in EEPROM\n" message[defensive]: dev_warn "Warning: detected ASPM enabled in EEPROM\n" message: dev_err "No usable DMA configuration, aborting\n" description {{ Unable to enable DMA for either 32 or 64 bits with device_mask. The device driver couldn't continue to initialize the adapter because the adapter couldn't perform DMA properly on the system. [Explain device_mask, or omit the ref to it.] }} action {{ 1. Reboot Linux. 2. Verify that your kernel supports DMA mode for data transfer. [How? Is DMA support configurable?] }} class: software sl_severity: error refcode: "noDmaCfg" message: dev_err "pci_enable_pcie_error_reporting failed 0x%x\n" /* Note: Wen has this as "pci_enable_error_reporting failed\n" */ description {{ This is a non-fatal error. The driver unsuccessfully attempted to enable AER on the adapter. This error means either the system doesn't support AER or the adapter doesn't support AER. The driver will continue to initialize the adapter. }} action {{ 1. Verify that your Linux kernel supports AER. 2. Verify that your adapter supports AER. }} class: software sl_severity: warning refcode: "AEREnfail" message: e_info "PHY reset is blocked due to SOL/IDER session.\n" description {{ The reset of the PHY (physical layer device) is blocked, but the driver continues to initialize the adapter. }} action {{ No action required. }} class: software type: info refcode: "PhyRstBlk" message: e_err "The NVM Checksum Is Not Valid\n" description {{ The driver has given up trying to initialize the adapter because the adapter's EEPROM checksum is incorrect. }} action {{ @paste diags_eeprom_replace }} class: hardware type: perm refcode: "BF778E00" priority: H /* dup: dev_err "The NVM Checksum Is Not Valid\n" */ message: e_err "NVM Read Error while reading MAC address\n" description {{ The driver was unable to read the MAC address from the adapter's EEPROM. }} action {{ @paste diags_eeprom_replace }} class: software sl_severity: warning refcode: "RdMAC" /* dup: dev_err "NVM Read Error while reading MAC address\n" */ message: e_err "Invalid MAC Address: %pM\n" description {{ The MAC address read from the adapter's EEPROM is not a valid Ethernet address. }} action {{ @paste diags_eeprom_replace }} class: hardware type: perm refcode: "BF778E00" priority: H /* dup: dev_err "Invalid MAC Address: %pM\n" */ message: dev_err "pci_disable_pcie_error_reporting failed 0x%x\n" /* Note: Wen has this as "pci_disable_error_reporting failed\n" */ description {{ This is a non-fatal error. The driver unsuccessfully attempted to disable AER on the adapter. This error means either the system doesn't support AER or the adapter doesn't support AER. }} action {{ Verify that the adapter supports AER. If it doesn't, don't try to enable or disable AER for it. [How can the customer affect this?] }} class: software sl_severity: warning refcode: "AERDisfail" message[chatter]: printk KERN_INFO "%s: Intel(R) PRO/1000 Network Driver - %s\n" message[chatter]: printk KERN_INFO "%s: Copyright (c) 1999-2008 Intel Corporation.\n" file: "drivers/net/ethernet/intel/e1000e/param.c" message[chatter]: e_info "%s Enabled\n" message[chatter]: e_info "%s Disabled\n" message[chatter]: e_info "%s set to %i\n" /* Omit this: it would match everything. e_info "%s\n" */ message[chatter]: e_info "Invalid %s value specified (%i) %s\n" message: e_notice "Warning: no configuration for board #%i\n" description {{ The number of network adapters in the system that are associated with the e1000e driver exceeds E1000_MAX_NIC, as defined in e1000_param.c of the driver source. }} action {{ Change E1000_MAX_NIC in e1000_param.c and rebuild the driver. ["(ii) Change the startup module parameter." How would this work? It appears that E1000_MAX_NIC is a compile-time constant.] }} class: software type: config refcode: "noBoard" message[defensive]: e_notice "Using defaults for all values\n" message[chatter]: dev_info "%s set to default %d\n" message[chatter]: e_info "%s turned off\n" message[chatter]: e_info "%s set to dynamic mode\n" message[chatter]: e_info "%s set to dynamic conservative mode\n" message[chatter]: dev_info "%s set to simplified (2000-8000 ints) mode\n" file: "drivers/net/ethernet/intel/e1000e/phy.c" /* * e_dbg "PHY Address %d is out of range\n" * e_dbg "MDI Read did not complete\n" * e_dbg "MDI Error\n" * e_dbg "PHY Address %d is out of range\n" * e_dbg "MDI Write did not complete\n" * e_dbg "MDI Error\n" * e_dbg "Setting page 0x%x\n" * e_dbg "Error committing the PHY changes\n" * e_dbg "Error resetting the PHY.\n" * e_dbg "Error Disabling LPLU D0\n" * e_dbg "autoneg_advertised %x\n" * e_dbg "Advertise 10mb Half duplex\n" * e_dbg "Advertise 10mb Full duplex\n" * e_dbg "Advertise 100mb Half duplex\n" * e_dbg "Advertise 100mb Full duplex\n" * e_dbg "Advertise 1000mb Half duplex request denied!\n" * e_dbg "Advertise 1000mb Full duplex\n" * e_dbg "Flow control param set incorrectly\n" * e_dbg "Auto-Neg Advertising %x\n" * e_dbg "Reconfiguring auto-neg advertisement params\n" * e_dbg "Error Setting up Auto-Negotiation\n" * e_dbg "Restarting Auto-Neg\n" * e_dbg "Error while waiting for autoneg to complete\n" * e_dbg "Forcing Speed and Duplex\n" * e_dbg "Error Forcing Speed and Duplex\n" * e_dbg "Valid link established!!!\n" * e_dbg "Unable to establish link!!!\n" * e_dbg "IGP PSCR: %X\n" * e_dbg "Waiting for forced speed/duplex link on IGP phy.\n" * e_dbg "Link taking longer than expected.\n" * e_dbg "M88E1000 PSCR: %X\n" * e_dbg "Waiting for forced speed/duplex link on M88 phy.\n" * e_dbg "Link taking longer than expected.\n" * e_dbg "IFE PMC: %X\n" * e_dbg "Waiting for forced speed/duplex link on IFE phy.\n" * e_dbg "Link taking longer than expected.\n" * e_dbg "Half Duplex\n" * e_dbg "Full Duplex\n" * e_dbg "Forcing 100mb\n" * e_dbg "Forcing 10mb\n" * e_dbg "Phy info is only valid for copper media\n" * e_dbg "Phy info is only valid if link is up\n" * e_dbg "Phy info is only valid if link is up\n" * e_dbg "Running IGP 3 PHY init script\n" * e_dbg "Could not set Port Control page\n" * e_dbg "Could not read PHY register %d.%d\n" * e_dbg "Could not write PHY register %d.%d\n" * e_dbg "Could not set Port Control page\n" * e_dbg "Could not restore PHY register %d.%d\n" * e_dbg "Attempting to access page %d while gig enabled.\n" * e_dbg "Could not enable PHY wakeup reg access\n" * e_dbg "Accessing PHY page %d reg 0x%x\n" * e_dbg "Could not write address opcode to page %d\n" * e_dbg "Could not access PHY reg %d.%d\n" * e_dbg "reading PHY page %d (or 0x%x shifted) reg 0x%x\n" * e_dbg "writing PHY page %d (or 0x%x shifted) reg 0x%x\n" * e_dbg "Could not write the Address Offset port register\n" * e_dbg "Could not access the Data port register\n" * e_dbg "Attempting to access page 800 while gig enabled\n" * e_dbg "Could not acquire PHY\n" * e_dbg "Could not write PHY the HV address register\n" * e_dbg "Could not read data value from HV data register\n" * e_dbg "I82577_PHY_CTRL_2: %X\n" * e_dbg "Waiting for forced speed/duplex link on 82577 phy\n" * e_dbg "Link taking longer than expected.\n" * e_dbg "Phy info is only valid if link is up\n" */ ppc64-diag-2.6.4/ela/message_catalog/with_regex/0000755000000000000000000000000012313010662020075 5ustar rootrootppc64-diag-2.6.4/ela/message_catalog/with_regex/ixgb0000644000000000000000000004127112313010662020756 0ustar rootrootsubsystem: net file: "drivers/net/ixgb/ixgb_main.c" message[chatter]: netif_info "Intel(R) PRO/10GbE Network Connection\n" regex netdev_info3 "^([[:print:]]*) ([[:print:]]*): ([[:print:]]*): Intel\\(R\\) PRO/10GbE Network Connection$" regex netdev_info1 "^([[:print:]]*): Intel\\(R\\) PRO/10GbE Network Connection$" regex netdev_info0 "^\\(NULL net_device\\): Intel\\(R\\) PRO/10GbE Network Connection$" message[defensive]: netif_err "Unable to allocate interrupt Error: %d\n" regex netdev_err3 "^([[:print:]]*) ([[:print:]]*): ([[:print:]]*): Unable to allocate interrupt Error: ([-]\?[0-9]{1,})$" regex netdev_err1 "^([[:print:]]*): Unable to allocate interrupt Error: ([-]\?[0-9]{1,})$" regex netdev_err0 "^\\(NULL net_device\\): Unable to allocate interrupt Error: [-]\?[0-9]{1,}$" message[defensive]: netif_err "ixgb_init_hw failed\n" regex netdev_err3 "^([[:print:]]*) ([[:print:]]*): ([[:print:]]*): ixgb_init_hw failed$" regex netdev_err1 "^([[:print:]]*): ixgb_init_hw failed$" regex netdev_err0 "^\\(NULL net_device\\): ixgb_init_hw failed$" message[defensive]: netif_err "The EEPROM Checksum Is Not Valid\n" regex netdev_err3 "^([[:print:]]*) ([[:print:]]*): ([[:print:]]*): The EEPROM Checksum Is Not Valid$" regex netdev_err1 "^([[:print:]]*): The EEPROM Checksum Is Not Valid$" regex netdev_err0 "^\\(NULL net_device\\): The EEPROM Checksum Is Not Valid$" message[defensive]: netif_err "Invalid MAC Address\n" regex netdev_err3 "^([[:print:]]*) ([[:print:]]*): ([[:print:]]*): Invalid MAC Address$" regex netdev_err1 "^([[:print:]]*): Invalid MAC Address$" regex netdev_err0 "^\\(NULL net_device\\): Invalid MAC Address$" message[defensive]: netif_err "unsupported device id\n" regex netdev_err3 "^([[:print:]]*) ([[:print:]]*): ([[:print:]]*): unsupported device id$" regex netdev_err1 "^([[:print:]]*): unsupported device id$" regex netdev_err0 "^\\(NULL net_device\\): unsupported device id$" message[defensive]: netif_err "Unable to allocate transmit descriptor ring memory\n" regex netdev_err3 "^([[:print:]]*) ([[:print:]]*): ([[:print:]]*): Unable to allocate transmit descriptor ring memory$" regex netdev_err1 "^([[:print:]]*): Unable to allocate transmit descriptor ring memory$" regex netdev_err0 "^\\(NULL net_device\\): Unable to allocate transmit descriptor ring memory$" message[defensive]: netif_err "Unable to allocate transmit descriptor memory\n" regex netdev_err3 "^([[:print:]]*) ([[:print:]]*): ([[:print:]]*): Unable to allocate transmit descriptor memory$" regex netdev_err1 "^([[:print:]]*): Unable to allocate transmit descriptor memory$" regex netdev_err0 "^\\(NULL net_device\\): Unable to allocate transmit descriptor memory$" message[defensive]: netif_err "Unable to allocate receive descriptor ring\n" regex netdev_err3 "^([[:print:]]*) ([[:print:]]*): ([[:print:]]*): Unable to allocate receive descriptor ring$" regex netdev_err1 "^([[:print:]]*): Unable to allocate receive descriptor ring$" regex netdev_err0 "^\\(NULL net_device\\): Unable to allocate receive descriptor ring$" message[defensive]: netif_err "Unable to allocate receive descriptors\n" regex netdev_err3 "^([[:print:]]*) ([[:print:]]*): ([[:print:]]*): Unable to allocate receive descriptors$" regex netdev_err1 "^([[:print:]]*): Unable to allocate receive descriptors$" regex netdev_err0 "^\\(NULL net_device\\): Unable to allocate receive descriptors$" message[defensive]: netif_err "Invalid MTU setting %d\n" regex netdev_err3 "^([[:print:]]*) ([[:print:]]*): ([[:print:]]*): Invalid MTU setting ([-]\?[0-9]{1,})$" regex netdev_err1 "^([[:print:]]*): Invalid MTU setting ([-]\?[0-9]{1,})$" regex netdev_err0 "^\\(NULL net_device\\): Invalid MTU setting [-]\?[0-9]{1,}$" message[defensive]: netif_err "Cannot re-enable PCI device after reset\n" regex netdev_err3 "^([[:print:]]*) ([[:print:]]*): ([[:print:]]*): Cannot re-enable PCI device after reset$" regex netdev_err1 "^([[:print:]]*): Cannot re-enable PCI device after reset$" regex netdev_err0 "^\\(NULL net_device\\): Cannot re-enable PCI device after reset$" message[defensive]: netif_err "After reset, the EEPROM checksum is not valid\n" regex netdev_err3 "^([[:print:]]*) ([[:print:]]*): ([[:print:]]*): After reset, the EEPROM checksum is not valid$" regex netdev_err1 "^([[:print:]]*): After reset, the EEPROM checksum is not valid$" regex netdev_err0 "^\\(NULL net_device\\): After reset, the EEPROM checksum is not valid$" message[defensive]: netif_err "After reset, invalid MAC address\n" regex netdev_err3 "^([[:print:]]*) ([[:print:]]*): ([[:print:]]*): After reset, invalid MAC address$" regex netdev_err1 "^([[:print:]]*): After reset, invalid MAC address$" regex netdev_err0 "^\\(NULL net_device\\): After reset, invalid MAC address$" message[defensive]: dev_err "TX DMA map failed\n" regex dev_err "^([[:print:]]*) ([[:print:]]*): TX DMA map failed$" message[defensive]: printk err "ixgb: No usable DMA configuration, aborting\n" regex printk "^ixgb: No usable DMA configuration, aborting$" message[chatter]: printk err "ixgb: %s NIC Link is Up 10 Gbps Full Duplex, Flow Control: %s\n" regex printk "^ixgb: [[:print:]]* NIC Link is Up 10 Gbps Full Duplex, Flow Control: [[:print:]]*$" message[chatter]: printk err "ixgb: %s NIC Link is Down\n" regex printk "^ixgb: [[:print:]]* NIC Link is Down$" file: "drivers/net/ixgb/ixgb_param.c" message[chatter]: printk err "Invalid %s specified (%i) %s\n" regex printk "^Invalid [[:print:]]* specified \\([-]\?[0-9]{1,}\\) [[:print:]]*$" message[chatter]: printk err "Warning: no configuration for board #%i\n" regex printk "^Warning: no configuration for board #[-]\?[0-9]{1,}$" message[chatter]: printk info "Using defaults for all values\n" regex printk "^Using defaults for all values$" message[chatter]: printk info "Ignoring RxFCHighThresh when no RxFC\n" regex printk "^Ignoring RxFCHighThresh when no RxFC$" message[chatter]: printk info "Ignoring RxFCLowThresh when no RxFC\n" regex printk "^Ignoring RxFCLowThresh when no RxFC$" message[chatter]: printk info "Ignoring FCReqTimeout when no RxFC\n" regex printk "^Ignoring FCReqTimeout when no RxFC$" file: "drivers/net/ixgbe/ixgbe_main.c" message[chatter]: dev_info "MAC: %d, PHY: %d, SFP+: %d, PBA No: %06x-%03x\n" regex dev_info "^([[:print:]]*) ([[:print:]]*): MAC: ([-]\?[0-9]{1,}), PHY: ([-]\?[0-9]{1,}), SFP\\+: ([-]\?[0-9]{1,}), PBA No: ([0]{0,5}[0-9a-f]{1,})-([0]{0,2}[0-9a-f]{1,})$" message[chatter]: dev_info "MAC: %d, PHY: %d, PBA No: %06x-%03x\n" regex dev_info "^([[:print:]]*) ([[:print:]]*): MAC: ([-]\?[0-9]{1,}), PHY: ([-]\?[0-9]{1,}), PBA No: ([0]{0,5}[0-9a-f]{1,})-([0]{0,2}[0-9a-f]{1,})$" message[chatter]: dev_info "Intel(R) 10 Gigabit Network Connection\n" regex dev_info "^([[:print:]]*) ([[:print:]]*): Intel\\(R\\) 10 Gigabit Network Connection$" message[chatter]: dev_warn "PCI-Express bandwidth available for this card is not sufficient for optimal performance.\n" regex dev_warn "^([[:print:]]*) ([[:print:]]*): PCI-Express bandwidth available for this card is not sufficient for optimal performance\\.$" message[chatter]: dev_warn "For optimal performance a x8 PCI-Express slot is required.\n" regex dev_warn "^([[:print:]]*) ([[:print:]]*): For optimal performance a x8 PCI-Express slot is required\\.$" message[defensive]: dev_err "master disable timed out\n" regex dev_err "^([[:print:]]*) ([[:print:]]*): master disable timed out$" message[defensive]: dev_err "Hardware Error: %d\n" regex dev_err "^([[:print:]]*) ([[:print:]]*): Hardware Error: ([-]\?[0-9]{1,})$" message[defensive]: dev_err "EEPROM initialization failed\n" regex dev_err "^([[:print:]]*) ([[:print:]]*): EEPROM initialization failed$" message[defensive]: dev_err "TX DMA map failed\n" regex dev_err "^([[:print:]]*) ([[:print:]]*): TX DMA map failed$" message[defensive]: dev_err "No usable DMA configuration, aborting\n" regex dev_err "^([[:print:]]*) ([[:print:]]*): No usable DMA configuration, aborting$" message[defensive]: dev_err "pci_request_selected_regions failed 0x%x\n" regex dev_err "^([[:print:]]*) ([[:print:]]*): pci_request_selected_regions failed 0x([0-9a-f]{1,})$" message[defensive]: dev_err "HW Init failed: %d\n" regex dev_err "^([[:print:]]*) ([[:print:]]*): HW Init failed: ([-]\?[0-9]{1,})$" message[defensive]: dev_err "The EEPROM Checksum Is Not Valid\n" regex dev_err "^([[:print:]]*) ([[:print:]]*): The EEPROM Checksum Is Not Valid$" message[defensive]: dev_err "invalid MAC address\n" regex dev_err "^([[:print:]]*) ([[:print:]]*): invalid MAC address$" message[defensive]: dev_err "pci_cleanup_aer_uncorrect_error_status failed 0x%0x\n" regex dev_err "^([[:print:]]*) ([[:print:]]*): pci_cleanup_aer_uncorrect_error_status failed 0x([0-9a-f]{1,})$" message[defensive]: printk err "ixgbe: Cannot enable PCI device from suspend\n" regex printk "^ixgbe: Cannot enable PCI device from suspend$" message[defensive]: printk err "ixgbe: Cannot initialize interrupts for device\n" regex printk "^ixgbe: Cannot initialize interrupts for device$" message[chatter]: printk err "ixgbe: %s NIC Link is Up %s, Flow Control: %s\n" regex printk "^ixgbe: [[:print:]]* NIC Link is Up [[:print:]]*, Flow Control: [[:print:]]*$" message[chatter]: printk err "ixgbe: %s NIC Link is Down\n" regex printk "^ixgbe: [[:print:]]* NIC Link is Down$" file: "drivers/net/ixgbe/ixgbe_sriov.c" message[defensive]: printk err "Error receiving message from VF\n" regex printk "^Error receiving message from VF$" file: "drivers/net/ixgbe/ixgbe_82598.c" message[defensive]: hw_dbg "Flow control param set incorrectly\n" regex hw_dbg "^([[:print:]]*): Flow control param set incorrectly$" message[defensive]: hw_dbg "Autonegotiation did not complete.\n" regex hw_dbg "^([[:print:]]*): Autonegotiation did not complete\\.$" message[defensive]: hw_dbg "Link was indicated but link is down\n" regex hw_dbg "^([[:print:]]*): Link was indicated but link is down$" message[defensive]: hw_dbg "PCI-E Master disable polling has failed.\n" regex hw_dbg "^([[:print:]]*): PCI-E Master disable polling has failed\\.$" message[defensive]: hw_dbg "Reset polling failed to complete.\n" regex hw_dbg "^([[:print:]]*): Reset polling failed to complete\\.$" message[defensive]: hw_dbg "RAR index %d is out of range.\n" regex hw_dbg "^([[:print:]]*): RAR index ([-]\?[0-9]{1,}) is out of range\\.$" message[defensive]: hw_dbg "EEPROM read did not pass.\n" regex hw_dbg "^([[:print:]]*): EEPROM read did not pass\\.$" file: "drivers/net/ixgbe/ixgbe_82599.c" message[defensive]: hw_dbg "Autoneg did not complete.\n" regex hw_dbg "^([[:print:]]*): Autoneg did not complete\\.$" message[defensive]: hw_dbg "ixgbe_setup_mac_link_smartspeed.\n" regex hw_dbg "^([[:print:]]*): ixgbe_setup_mac_link_smartspeed\\.$" message[defensive]: hw_dbg "PCI-E Master disable polling has failed.\n" regex hw_dbg "^([[:print:]]*): PCI-E Master disable polling has failed\\.$" message[defensive]: hw_dbg "Reset polling failed to complete.\n" regex hw_dbg "^([[:print:]]*): Reset polling failed to complete\\.$" message[defensive]: hw_dbg "RAR index %d is out of range.\n" regex hw_dbg "^([[:print:]]*): RAR index ([-]\?[0-9]{1,}) is out of range\\.$" message[defensive]: hw_dbg "RAR index %d is out of range.\n" regex hw_dbg "^([[:print:]]*): RAR index ([-]\?[0-9]{1,}) is out of range\\.$" message[defensive]: hw_dbg "No space in VLVF.\n" regex hw_dbg "^([[:print:]]*): No space in VLVF\\.$" message[defensive]: hw_dbg "Flow Director previous command isn't complete, aborting table re-initialization. \n" regex hw_dbg "^([[:print:]]*): Flow Director previous command isn't complete, aborting table re-initialization\\. $" message[defensive]: hw_dbg "Flow Director Signature poll time exceeded!\n" regex hw_dbg "^([[:print:]]*): Flow Director Signature poll time exceeded!$" message[defensive]: hw_dbg "Flow Director Perfect poll time exceeded!\n" regex hw_dbg "^([[:print:]]*): Flow Director Perfect poll time exceeded!$" message[defensive]: hw_dbg "Error on l4type input\n" regex hw_dbg "^([[:print:]]*): Error on l4type input$" message[defensive]: hw_dbg "Rx unit being enabled before security path fully disabled. Continuing with init.\n" regex hw_dbg "^([[:print:]]*): Rx unit being enabled before security path fully disabled\\. Continuing with init\\.$" file: "drivers/net/ixgbe/ ixgbe_common.c" message[defensive]: hw_dbg "NVM Read Error\n" regex hw_dbg "^([[:print:]]*): NVM Read Error$" message[defensive]: hw_dbg "PCI-E Master disable polling has failed.\n" regex hw_dbg "^([[:print:]]*): PCI-E Master disable polling has failed\\.$" message[defensive]: hw_dbg "Eeprom read timed out\n" regex hw_dbg "^([[:print:]]*): Eeprom read timed out$" message[defensive]: hw_dbg "Could not acquire EEPROM grant\n" regex hw_dbg "^([[:print:]]*): Could not acquire EEPROM grant$" message[defensive]: hw_dbg "SPI EEPROM Status error\n" regex hw_dbg "^([[:print:]]*): SPI EEPROM Status error$" message[defensive]: hw_dbg "EEPROM read failed\n" regex hw_dbg "^([[:print:]]*): EEPROM read failed$" message[defensive]: hw_dbg "RAR index %d is out of range.\n" regex hw_dbg "^([[:print:]]*): RAR index ([-]\?[0-9]{1,}) is out of range\\.$" message[defensive]: hw_dbg "Overriding MAC Address in RAR[0]\n" regex hw_dbg "^([[:print:]]*): Overriding MAC Address in RAR\\[0]$" message[defensive]: hw_dbg "Clearing RAR[1-%d]\n" regex hw_dbg "^([[:print:]]*): Clearing RAR\\[1-([-]\?[0-9]{1,})]$" message[defensive]: hw_dbg "Added a secondary address to RAR[%d]\n" regex hw_dbg "^([[:print:]]*): Added a secondary address to RAR\\[([-]\?[0-9]{1,})]$" message[defensive]: hw_dbg "ixgbe_add_uc_addr Complete\n" regex hw_dbg "^([[:print:]]*): ixgbe_add_uc_addr Complete$" message[defensive]: hw_dbg "Clearing RAR[1-%d]\n" regex hw_dbg "^([[:print:]]*): Clearing RAR\\[1-([-]\?[0-9]{1,})]$" message[defensive]: hw_dbg "ixgbe_update_uc_addr_list_generic Complete\n" regex hw_dbg "^([[:print:]]*): ixgbe_update_uc_addr_list_generic Complete$" message[defensive]: hw_dbg "MC filter type param set incorrectly\n" regex hw_dbg "^([[:print:]]*): MC filter type param set incorrectly$" message[defensive]: hw_dbg "ixgbe_update_mc_addr_list_generic Complete\n" regex hw_dbg "^([[:print:]]*): ixgbe_update_mc_addr_list_generic Complete$" message[defensive]: hw_dbg "Flow control param set incorrectly\n" regex hw_dbg "^([[:print:]]*): Flow control param set incorrectly$" message[defensive]: hw_dbg "Invalid packet buffer number [%d], expected range is 0-7\n" regex hw_dbg "^([[:print:]]*): Invalid packet buffer number \\[([-]\?[0-9]{1,})], expected range is 0-7$" message[defensive]: hw_dbg "Invalid water mark configuration\n" regex hw_dbg "^([[:print:]]*): Invalid water mark configuration$" message[defensive]: hw_dbg "ixgbe_fc_rx_pause not valid in strict IEEE mode\n" regex hw_dbg "^([[:print:]]*): ixgbe_fc_rx_pause not valid in strict IEEE mode$" message[defensive]: hw_dbg "Driver can't access resource, GSSR timeout.\n" regex hw_dbg "^([[:print:]]*): Driver can't access resource, GSSR timeout\\.$" file: "drivers/net/ixgbe/ixgbe_phy.c" message[defensive]: hw_dbg "PHY address command did not complete.\n" regex hw_dbg "^([[:print:]]*): PHY address command did not complete\\.$" message[defensive]: hw_dbg "PHY read command didn't complete\n" regex hw_dbg "^([[:print:]]*): PHY read command didn't complete$" message[defensive]: hw_dbg "PHY address cmd didn't complete\n" regex hw_dbg "^([[:print:]]*): PHY address cmd didn't complete$" message[defensive]: hw_dbg "PHY address cmd didn't complete\n" regex hw_dbg "^([[:print:]]*): PHY address cmd didn't complete$" message[defensive]: hw_dbg "PHY reset did not complete.\n" regex hw_dbg "^([[:print:]]*): PHY reset did not complete\\.$" message[defensive]: hw_dbg "Bad control value\n" regex hw_dbg "^([[:print:]]*): Bad control value$" message[defensive]: hw_dbg "Bad control type\n" regex hw_dbg "^([[:print:]]*): Bad control type$" message[defensive]: hw_dbg "SFP+ module not supported\n" regex hw_dbg "^([[:print:]]*): SFP\\+ module not supported$" message[defensive]: hw_dbg "SFP+ module not supported\n" regex hw_dbg "^([[:print:]]*): SFP\\+ module not supported$" message[defensive]: hw_dbg "No matching SFP+ module found\n" regex hw_dbg "^([[:print:]]*): No matching SFP\\+ module found$" message[defensive]: hw_dbg "I2C byte read error - Retrying.\n" regex hw_dbg "^([[:print:]]*): I2C byte read error - Retrying\\.$" message[defensive]: hw_dbg "I2C byte read error.\n" regex hw_dbg "^([[:print:]]*): I2C byte read error\\.$" message[defensive]: hw_dbg "I2C byte write error - Retrying.\n" regex hw_dbg "^([[:print:]]*): I2C byte write error - Retrying\\.$" message[defensive]: hw_dbg "I2C byte write error.\n" regex hw_dbg "^([[:print:]]*): I2C byte write error\\.$" message[defensive]: hw_dbg "I2C ack was not received.\n" regex hw_dbg "^([[:print:]]*): I2C ack was not received\\.$" message[defensive]: hw_dbg "I2C data was not set to %X\n" regex hw_dbg "^([[:print:]]*): I2C data was not set to ([0-9A-F]{1,})$" message[defensive]: hw_dbg "Error - I2C data was not set to %X.\n" regex hw_dbg "^([[:print:]]*): Error - I2C data was not set to ([0-9A-F]{1,})\\.$" ppc64-diag-2.6.4/ela/message_catalog/with_regex/qla2xxx0000644000000000000000000015217312313010662021440 0ustar rootrootsubsystem: scsi file: "drivers/scsi/qla2xxx/qla_attr.c" message: qla_printk KERN_INFO "Firmware dump cleared on (%ld).\n" regex qla_printk "^qla2xxx ([[:print:]]*): Firmware dump cleared on \\(([-]\?[0-9]{1,})\\)\\.$" description {{ Previous firmware dump was cleared from memory. }} action {{ None recommended. }} class: firmware type: info refcode: "" message: qla_printk KERN_WARNING "Raw firmware dump ready for read on (%ld).\n" regex qla_printk "^qla2xxx ([[:print:]]*): Raw firmware dump ready for read on \\(([-]\?[0-9]{1,})\\)\\.$" description {{ Firmware dump now ready to be read. }} action {{ None recommended. }} class: firmware type: info refcode: "" message: qla_printk KERN_ERR "HBA not online, failing NVRAM update.\n" regex qla_printk "^qla2xxx ([[:print:]]*): HBA not online, failing NVRAM update\\.$" description {{ Application tried to write to NVRAM of adapter that is offline. }} action {{ None recommended. }} class: hardware sl_severity: warning refcode: "" message: qla_printk KERN_ERR "Unable to allocate memory for optrom retrieval (%x).\n" regex qla_printk "^qla2xxx ([[:print:]]*): Unable to allocate memory for optrom retrieval \\(([0-9a-f]{1,})\\)\\.$" description {{ System has low memory. }} action {{ None recommended. }} class: software sl_severity: warning refcode: "" message: qla_printk KERN_ERR "Invalid start region 0x%x/0x%x.\n" regex qla_printk "^qla2xxx ([[:print:]]*): Invalid start region 0x([0-9a-f]{1,})/0x([0-9a-f]{1,})\\.$" description {{ Invalid starting address of option rom memory. }} action {{ None recommended. }} class: software sl_severity: warning refcode: "" message: qla_printk KERN_ERR "Unable to allocate memory for optrom update (%x).\n" regex qla_printk "^qla2xxx ([[:print:]]*): Unable to allocate memory for optrom update \\(([0-9a-f]{1,})\\)\\.$" description {{ System has low memory. }} action {{ None recommended. }} class: software sl_severity: warning refcode: "" message: qla_printk KERN_ERR "HBA not online, failing flash update.\n" regex qla_printk "^qla2xxx ([[:print:]]*): HBA not online, failing flash update\\.$" description {{ Application tried to write to flash memory of adapter that is offline. }} action {{ None recommended. }} class: hardware sl_severity: warning refcode: "" message: qla_printk KERN_ERR "HBA not online, failing VPD update.\n" regex qla_printk "^qla2xxx ([[:print:]]*): HBA not online, failing VPD update\\.$" description {{ Application tried to write to vital product data of adapter that is offline. }} action {{ None recommended. }} class: hardware sl_severity: warning refcode: "" message: qla_printk KERN_ERR "Unable to allocate memory for VPD information update.\n" regex qla_printk "^qla2xxx ([[:print:]]*): Unable to allocate memory for VPD information update\\.$" description {{ System has low memory. }} action {{ None recommended. }} class: software sl_severity: warning refcode: "" message: qla_printk KERN_ERR "Unable to allocate memory for SFP read-data.\n" regex qla_printk "^qla2xxx ([[:print:]]*): Unable to allocate memory for SFP read-data\\.$" description {{ System has low memory. }} action {{ None recommended. }} class: software sl_severity: warning refcode: "" message: qla_printk KERN_ERR "Unable to read SFP data (%x/%x/%x).\n" regex qla_printk "^qla2xxx ([[:print:]]*): Unable to read SFP data \\(([0-9a-f]{1,})/([0-9a-f]{1,})/([0-9a-f]{1,})\\)\\.$" description {{ Firmware did not return any information for requested SFP data. }} action {{ None recommended. }} class: software sl_severity: warning refcode: "" message: qla_printk KERN_INFO "Issuing ISP reset on (%ld).\n" regex qla_printk "^qla2xxx ([[:print:]]*): Issuing ISP reset on \\(([-]\?[0-9]{1,})\\)\\.$" description {{ Debug ASIC reset. }} action {{ None recommended. }} class: software type: info refcode: "" message: qla_printk KERN_INFO "Issuing MPI reset on (%ld).\n" regex qla_printk "^qla2xxx ([[:print:]]*): Issuing MPI reset on \\(([-]\?[0-9]{1,})\\)\\.$" description {{ Debug reset of 81xx MP firmware. }} action {{ None recommended. }} class: software type: info refcode: "" message: qla_printk KERN_ERR "MPI reset failed on (%ld).\n" regex qla_printk "^qla2xxx ([[:print:]]*): MPI reset failed on \\(([-]\?[0-9]{1,})\\)\\.$" description {{ MPI firmware reset failed during loopback test. }} action {{ None recommended. }} class: software sl_severity: warning refcode: "" message: qla_printk KERN_ERR "Unable to allocate memory for XGMAC read-data.\n" regex qla_printk "^qla2xxx ([[:print:]]*): Unable to allocate memory for XGMAC read-data\\.$" description {{ System has low memory. }} action {{ None recommended. }} class: software sl_severity: warning refcode: "" message: qla_printk KERN_ERR "Unable to read XGMAC data (%x).\n" regex qla_printk "^qla2xxx ([[:print:]]*): Unable to read XGMAC data \\(([0-9a-f]{1,})\\)\\.$" description {{ Unable to ethernet transmission statistics. }} action {{ None recommended. }} class: software sl_severity: warning refcode: "" message: qla_printk KERN_ERR "Unable to allocate memory for DCBX TLV read-data.\n" regex qla_printk "^qla2xxx ([[:print:]]*): Unable to allocate memory for DCBX TLV read-data\\.$" description {{ System has low memory. }} action {{ None recommended. }} class: software sl_severity: warning refcode: "" message: qla_printk KERN_ERR "Unable to read DCBX TLV data (%x).\n" regex qla_printk "^qla2xxx ([[:print:]]*): Unable to read DCBX TLV data \\(([0-9a-f]{1,})\\)\\.$" description {{ Unable to read data center bridging type-length-value data. }} action {{ None recommended. }} class: software sl_severity: warning refcode: "" message: qla_printk KERN_ERR "Unable to create sysfs %s binary attribute (%d).\n" regex qla_printk "^qla2xxx ([[:print:]]*): Unable to create sysfs ([[:print:]]*) binary attribute \\(([-]\?[0-9]{1,})\\)\\.$" description {{ Error creating sysfs attribute. }} action {{ None recommended. }} class: software sl_severity: warning refcode: "" message: qla_printk KERN_WARNING "Abort ISP active -- ignoring beacon request.\n" regex qla_printk "^qla2xxx ([[:print:]]*): Abort ISP active -- ignoring beacon request\\.$" description {{ Request to blink beacon ignored. }} action {{ None recommended. }} class: software sl_severity: warning refcode: "" message: qla_printk KERN_INFO "VP entry id %d assigned.\n" regex qla_printk "^qla2xxx ([[:print:]]*): VP entry id ([-]\?[0-9]{1,}) assigned\\.$" description {{ Virtual port index of new NPIV port. }} action {{ None recommended. }} class: software type: info refcode: "" message: qla_printk KERN_WARNING "Can't create request queue for vp_idx:%d\n" regex qla_printk "^qla2xxx ([[:print:]]*): Can't create request queue for vp_idx:([-]\?[0-9]{1,})$" description {{ Could not create a separate request queue for new virtual port. }} action {{ None recommended. }} class: software sl_severity: warning refcode: "" message: qla_printk KERN_WARNING "Queue delete failed.\n" regex qla_printk "^qla2xxx ([[:print:]]*): Queue delete failed\\.$" description {{ Could not delete request queue specific to a virtual port being deleted. }} action {{ None recommended. }} class: software sl_severity: warning refcode: "" message: qla_printk KERN_INFO "vport %d deleted\n" regex qla_printk "^qla2xxx ([[:print:]]*): vport ([-]\?[0-9]{1,}) deleted$" description {{ Virtual port successfully deleted. }} action {{ None recommended. }} class: software type: info refcode: "" file: "drivers/scsi/qla2xxx/qla_bsg.c" message: qla_printk KERN_ERR "MPI reset failed on (%ld).\n" regex qla_printk "^qla2xxx ([[:print:]]*): MPI reset failed on \\(([-]\?[0-9]{1,})\\)\\.$" description {{ MPI firmware reset failed during loopback test. }} action {{ None recommended. }} class: software sl_severity: warning refcode: "" file: "drivers/scsi/qla2xxx/qla_dbg.c" message: qla_printk KERN_ERR "Failed to dump firmware (%x)!!!\n" regex qla_printk "^qla2xxx ([[:print:]]*): Failed to dump firmware \\(([0-9a-f]{1,})\\)!!!$" description {{ Procedure to produce a firmware dump failed. }} action {{ None recommended. }} class: software sl_severity: warning refcode: "" message: qla_printk KERN_INFO "Firmware dump saved to temp buffer (%ld/%p).\n" regex qla_printk "^qla2xxx ([[:print:]]*): Firmware dump saved to temp buffer \\(([-]\?[0-9]{1,})/(\\(null\\)|([0]{0,7}[0-9a-f]{1,}))\\)\\.$" description {{ Procedure to produce firmware dump succeeded and is ready for retrieval. }} action {{ None recommended. }} class: software type: info refcode: "" message: qla_printk KERN_ERR "No buffer available for dump!!!\n" regex qla_printk "^qla2xxx ([[:print:]]*): No buffer available for dump!!!$" description {{ Memory buffer for firmware dump was never allocated. }} action {{ None recommended. }} class: software sl_severity: warning refcode: "" file: "drivers/scsi/qla2xxx/qla_dfs.c" message: qla_printk KERN_ERR "DebugFS: Unable to disable FCE (%d).\n" regex qla_printk "^qla2xxx ([[:print:]]*): DebugFS: Unable to disable FCE \\(([-]\?[0-9]{1,})\\)\\.$" description {{ Error flushing fibre channel event buffer. }} action {{ None recommended. }} class: software sl_severity: warning refcode: "" message: qla_printk KERN_ERR "DebugFS: Unable to reinitialize FCE (%d).\n" regex qla_printk "^qla2xxx ([[:print:]]*): DebugFS: Unable to reinitialize FCE \\(([-]\?[0-9]{1,})\\)\\.$" description {{ Error reinitializing trace when ending a trace session. }} action {{ None recommended. }} class: software sl_severity: warning refcode: "" message: qla_printk KERN_ERR "DebugFS: Unable to create root directory.\n" regex qla_printk "^qla2xxx ([[:print:]]*): DebugFS: Unable to create root directory\\.$" description {{ Unable to create the qla2xxx directory in the debugFS filesystem. }} action {{ None recommended. }} class: software sl_severity: warning refcode: "" message: qla_printk KERN_ERR "DebugFS: Unable to create ha directory.\n" regex qla_printk "^qla2xxx ([[:print:]]*): DebugFS: Unable to create ha directory\\.$" description {{ Unable to create a directory for this adapter in DebugFS. }} action {{ None recommended. }} class: software sl_severity: warning refcode: "" message: qla_printk KERN_ERR "DebugFS: Unable to fce node.\n" regex qla_printk "^qla2xxx ([[:print:]]*): DebugFS: Unable to fce node\\.$" description {{ Unable to create fibre channel event node in DebugFS. }} action {{ None recommended. }} class: software sl_severity: warning refcode: "" file: "drivers/scsi/qla2xxx/qla_init.c" message: qla_printk KERN_WARNING "Configuring PCI space...\n" regex qla_printk "^qla2xxx ([[:print:]]*): Configuring PCI space\\.\\.\\.$" description {{ Driver is configuring PCI configuration registers. }} action {{ None recommended. }} class: software type: info refcode: "" message: qla_printk KERN_INFO "Configure NVRAM parameters...\n" regex qla_printk "^qla2xxx ([[:print:]]*): Configure NVRAM parameters\\.\\.\\.$" description {{ Driver is reading NVRAM parameters and configuring driver settings with them. }} action {{ None recommended. }} class: software type: info refcode: "" message: qla_printk KERN_WARNING "Masking HBA WWPN %02x%02x%02x%02x%02x%02x%02x%02x (via NVRAM).\n" regex qla_printk "^qla2xxx ([[:print:]]*): Masking HBA WWPN ([0]{0,1}[0-9a-f]{1,})([0]{0,1}[0-9a-f]{1,})([0]{0,1}[0-9a-f]{1,})([0]{0,1}[0-9a-f]{1,})([0]{0,1}[0-9a-f]{1,})([0]{0,1}[0-9a-f]{1,})([0]{0,1}[0-9a-f]{1,})([0]{0,1}[0-9a-f]{1,}) \\(via NVRAM\\)\\.$" description {{ Masking this HBA from operating system based on NVRAM parameters. }} action {{ None recommended. }} class: software sl_severity: warning refcode: "" message: qla_printk KERN_INFO "Verifying loaded RISC code...\n" regex qla_printk "^qla2xxx ([[:print:]]*): Verifying loaded RISC code\\.\\.\\.$" description {{ Verifying that the firmware image is valid. }} action {{ None recommended. }} class: software type: info refcode: "" message: qla_printk KERN_ERR "Unable to configure ISP84XX.\n" regex qla_printk "^qla2xxx ([[:print:]]*): Unable to configure ISP84XX\\.$" description {{ Error configuring 84xx CNA specific settings. }} action {{ None recommended. }} class: software sl_severity: warning refcode: "" message: qla_printk KERN_ERR "Unable to initialize ISP84XX.\n" regex qla_printk "^qla2xxx ([[:print:]]*): Unable to initialize ISP84XX\\.$" description {{ Error initializing 84xx CNA specific firmware. }} action {{ None recommended. }} class: software sl_severity: warning refcode: "" message: qla_printk KERN_WARNING "RISC CODE NOT loaded\n" regex qla_printk "^qla2xxx ([[:print:]]*): RISC CODE NOT loaded$" description {{ Not loading firmware from flash memory. }} action {{ None recommended. }} class: software sl_severity: warning refcode: "" message: qla_printk KERN_ERR "Wrong product ID = 0x%x,0x%x,0x%x\n" regex qla_printk "^qla2xxx ([[:print:]]*): Wrong product ID = 0x([0-9a-f]{1,}),0x([0-9a-f]{1,}),0x([0-9a-f]{1,})$" description {{ Bad product ID detected for 1Gb/s or 2Gb/s adapter. }} action {{ None recommended. }} class: software sl_severity: warning refcode: "" message: qla_printk KERN_ERR "Failed mailbox send register test\n" regex qla_printk "^qla2xxx ([[:print:]]*): Failed mailbox send register test$" description {{ Register communication test for adapter failed. }} action {{ None recommended. }} class: software sl_severity: warning refcode: "" message: qla_printk KERN_WARNING "Firmware dump previously allocated.\n" regex qla_printk "^qla2xxx ([[:print:]]*): Firmware dump previously allocated\\.$" description {{ Memory for a firmware dump has already been allocated. }} action {{ None recommended. }} class: software sl_severity: warning refcode: "" message: qla_printk KERN_ERR "Unable to allocate (%d KB) for FCE.\n" regex qla_printk "^qla2xxx ([[:print:]]*): Unable to allocate \\(([-]\?[0-9]{1,}) KB\\) for FCE\\.$" description {{ System has low memory. }} action {{ None recommended. }} class: software sl_severity: warning refcode: "" message: qla_printk KERN_ERR "Unable to initialize FCE (%d).\n" regex qla_printk "^qla2xxx ([[:print:]]*): Unable to initialize FCE \\(([-]\?[0-9]{1,})\\)\\.$" description {{ Mailbox command to initialize the fibre channel event buffer. }} action {{ None recommended. }} class: software sl_severity: warning refcode: "" message: qla_printk KERN_INFO "Allocated (%d KB) for FCE...\n" regex qla_printk "^qla2xxx ([[:print:]]*): Allocated \\(([-]\?[0-9]{1,}) KB\\) for FCE\\.\\.\\.$" description {{ Information about how much memory was allocated for the fibre channel event buffer. }} action {{ None recommended. }} class: software type: info refcode: "" message: qla_printk KERN_ERR "Unable to allocate (%d KB) for EFT.\n" regex qla_printk "^qla2xxx ([[:print:]]*): Unable to allocate \\(([-]\?[0-9]{1,}) KB\\) for EFT\\.$" description {{ System has low memory. }} action {{ None recommended. }} class: software sl_severity: warning refcode: "" message: qla_printk KERN_ERR "Unable to initialize EFT (%d).\n" regex qla_printk "^qla2xxx ([[:print:]]*): Unable to initialize EFT \\(([-]\?[0-9]{1,})\\)\\.$" description {{ Mailbox command to initialize the event trace buffer failed. }} action {{ None recommended. }} class: software sl_severity: warning refcode: "" message: qla_printk KERN_INFO "Allocated (%d KB) for EFT...\n" regex qla_printk "^qla2xxx ([[:print:]]*): Allocated \\(([-]\?[0-9]{1,}) KB\\) for EFT\\.\\.\\.$" description {{ Information about how much memory was allocated for the event trace buffer. }} action {{ None recommended. }} class: software type: info refcode: "" message: qla_printk KERN_ERR "Unable to allocate (%d KB) for firmware dump!!!\n" regex qla_printk "^qla2xxx ([[:print:]]*): Unable to allocate \\(([-]\?[0-9]{1,}) KB\\) for firmware dump!!!$" description {{ System has low memory. }} action {{ None recommended. }} class: software sl_severity: warning refcode: "" message: qla_printk KERN_INFO "Allocated (%d KB) for firmware dump...\n" regex qla_printk "^qla2xxx ([[:print:]]*): Allocated \\(([-]\?[0-9]{1,}) KB\\) for firmware dump\\.\\.\\.$" description {{ Informational about how much memory was allocated for firmware dump. }} action {{ None recommended. }} class: software type: info refcode: "" message: qla_printk KERN_ERR "Unsupported FAC firmware (%d.%02d.%02d).\n" regex qla_printk "^qla2xxx ([[:print:]]*): Unsupported FAC firmware \\(([-]\?[0-9]{1,})\\.([-]\?[0]{0,1}[0-9]{1,})\\.([-]\?[0]{0,1}[0-9]{1,})\\)\\.$" description {{ Error getting information about flash access commands. }} action {{ None recommended. }} class: software sl_severity: warning refcode: "" message: qla_printk KERN_ERR "Unable to update Serial Link options (%x).\n" regex qla_printk "^qla2xxx ([[:print:]]*): Unable to update Serial Link options \\(([0-9a-f]{1,})\\)\\.$" description {{ Error setting link parameters. }} action {{ None recommended. }} class: software sl_severity: warning refcode: "" message: qla_printk KERN_WARNING "MSIX Handshake Disable Mode turned on\n" regex qla_printk "^qla2xxx ([[:print:]]*): MSIX Handshake Disable Mode turned on$" description {{ No MSI-X handshaking needed for this adapter. }} action {{ None recommended. }} class: software sl_severity: warning refcode: "" message: qla_printk KERN_INFO "Waiting for LIP to complete...\n" regex qla_printk "^qla2xxx ([[:print:]]*): Waiting for LIP to complete\\.\\.\\.$" description {{ Waiting for link to stabilize. }} action {{ None recommended. }} class: software type: info refcode: "" message: qla_printk KERN_INFO "scsi(%ld): Waiting for LIP to complete...\n" regex qla_printk "^qla2xxx ([[:print:]]*): scsi\\(([-]\?[0-9]{1,})\\): Waiting for LIP to complete\\.\\.\\.$" description {{ Waiting for link to stabilize. }} action {{ None recommended. }} class: software type: info refcode: "" message: qla_printk KERN_WARNING "Cable is unplugged...\n" regex qla_printk "^qla2xxx ([[:print:]]*): Cable is unplugged\\.\\.\\.$" description {{ Adapter not connected to another physical port. }} action {{ None recommended. }} class: hardware sl_severity: warning refcode: "" message: qla_printk KERN_ERR "ERROR -- Unable to get host loop ID.\n" regex qla_printk "^qla2xxx ([[:print:]]*): ERROR -- Unable to get host loop ID\\.$" description {{ Could not get handle for local port. }} action {{ None recommended. }} class: software sl_severity: warning refcode: "" message: qla_printk KERN_ERR "Cannot get topology - retrying.\n" regex qla_printk "^qla2xxx ([[:print:]]*): Cannot get topology - retrying\\.$" description {{ Error getting connection type. }} action {{ None recommended. }} class: software sl_severity: warning refcode: "" message: qla_printk KERN_WARNING "Topology - %s, Host Loop address 0x%x\n" regex qla_printk "^qla2xxx ([[:print:]]*): Topology - ([[:print:]]*), Host Loop address 0x([0-9a-f]{1,})$" description {{ Local port handle. }} action {{ None recommended. }} class: software sl_severity: warning refcode: "" message: qla_printk KERN_ERR "Inconsistent NVRAM detected: checksum=0x%x id=%c version=0x%x.\n" regex qla_printk "^qla2xxx ([[:print:]]*): Inconsistent NVRAM detected: checksum=0x([0-9a-f]{1,}) id=([[:print:]]) version=0x([0-9a-f]{1,})\\.$" description {{ NVRAM signature was invalid. }} action {{ None recommended. }} class: software sl_severity: warning refcode: "" message: qla_printk KERN_ERR "Falling back to functioning (yet invalid -- WWPN) defaults.\n" regex qla_printk "^qla2xxx ([[:print:]]*): Falling back to functioning \\(yet invalid -- WWPN\\) defaults\\.$" description {{ Using driver default NVRAM settings. }} action {{ None recommended. }} class: software sl_severity: warning refcode: "" message: qla_printk KERN_WARNING "ZIO mode %d enabled; timer delay (%d us).\n" regex qla_printk "^qla2xxx ([[:print:]]*): ZIO mode ([-]\?[0-9]{1,}) enabled; timer delay \\(([-]\?[0-9]{1,}) us\\)\\.$" description {{ Zero interrupt i/o enabled. }} action {{ None recommended. }} class: software sl_severity: warning refcode: "" message: qla_printk KERN_ERR "Unable to allocate fc remote port!\n" regex qla_printk "^qla2xxx ([[:print:]]*): Unable to allocate fc remote port!$" description {{ FC transport could not create remote port object. }} action {{ None recommended. }} class: software sl_severity: warning refcode: "" message: qla_printk KERN_ERR "SNS scan failed -- assuming zero-entry result...\n" regex qla_printk "^qla2xxx ([[:print:]]*): SNS scan failed -- assuming zero-entry result\\.\\.\\.$" description {{ All name server queries failed. }} action {{ None recommended. }} class: software sl_severity: warning refcode: "" message: qla_printk KERN_WARNING "Performing ISP error recovery - ha= %p.\n" regex qla_printk "^qla2xxx ([[:print:]]*): Performing ISP error recovery - ha= (\\(null\\)|([0]{0,7}[0-9a-f]{1,}))\\.$" description {{ About to perform an ASIC reset. }} action {{ None recommended. }} class: software sl_severity: warning refcode: "" message: qla_printk KERN_ERR "ISP error recovery failed - board disabled\n" regex qla_printk "^qla2xxx ([[:print:]]*): ISP error recovery failed - board disabled$" description {{ ASIC reset failed so the adapter is being disabled. }} action {{ None recommended. }} class: software sl_severity: warning refcode: "" message: qla_printk KERN_ERR "qla2x00_abort_isp: **** FAILED ****\n" regex qla_printk "^qla2xxx ([[:print:]]*): qla2x00_abort_isp: \\*\\*\\*\\* FAILED \\*\\*\\*\\*$" description {{ ASIC reset failed. }} action {{ None recommended. }} class: software sl_severity: warning refcode: "" message: qla_printk KERN_WARNING "FW: Loading from flash (%x)...\n" regex qla_printk "^qla2xxx ([[:print:]]*): FW: Loading from flash \\(([0-9a-f]{1,})\\)\\.\\.\\.$" description {{ Firmware is loading from onboard flash memory. }} action {{ None recommended. }} class: software sl_severity: warning refcode: "" message: qla_printk KERN_ERR "Unable to verify integrity of flash firmware image! Firmware data: %08x %08x %08x %08x!\n" regex qla_printk "^qla2xxx ([[:print:]]*): Unable to verify integrity of flash firmware image! Firmware data: ([0]{0,7}[0-9a-f]{1,}) ([0]{0,7}[0-9a-f]{1,}) ([0]{0,7}[0-9a-f]{1,}) ([0]{0,7}[0-9a-f]{1,})!$" description {{ Firmware image from onboard flash memory is invalid. }} action {{ None recommended. }} class: software sl_severity: warning refcode: "" message: qla_printk KERN_ERR "[ERROR] Failed to load segment %d of firmware\n" regex qla_printk "^qla2xxx ([[:print:]]*): \\[ERROR] Failed to load segment ([-]\?[0-9]{1,}) of firmware$" description {{ Error copying firmware image to onboard RAM. }} action {{ None recommended. }} class: firmware sl_severity: warning refcode: "" message: qla_printk KERN_ERR "Firmware image unavailable.\n" regex qla_printk "^qla2xxx ([[:print:]]*): Firmware image unavailable\\.$" description {{ Retrieving firmware image via request_firmware failed. }} action {{ None recommended. }} class: firmware sl_severity: warning refcode: "" message: qla_printk KERN_ERR "Unable to verify integrity of firmware image (%Zd)!\n" regex qla_printk "^qla2xxx ([[:print:]]*): Unable to verify integrity of firmware image \\(([-]\?[0-9]{1,})\\)!$" description {{ Firmware image retrieved via request_firmware is invalid. }} action {{ None recommended. }} class: firmware sl_severity: warning refcode: "" message: qla_printk KERN_ERR "Unable to verify integrity of firmware image!\n" regex qla_printk "^qla2xxx ([[:print:]]*): Unable to verify integrity of firmware image!$" description {{ Firmware image retrieved via request_firmware is invalid. }} action {{ None recommended. }} class: firmware sl_severity: warning refcode: "" message: qla_printk KERN_WARNING "FW: Loading via request-firmware...\n" regex qla_printk "^qla2xxx ([[:print:]]*): FW: Loading via request-firmware\\.\\.\\.$" description {{ Firmware image was retrieved via request_firmware. }} action {{ None recommended. }} class: firmware sl_severity: warning refcode: "" message: qla_printk KERN_WARNING "FW: Attempting to fallback to golden firmware...\n" regex qla_printk "^qla2xxx ([[:print:]]*): FW: Attempting to fallback to golden firmware\\.\\.\\.$" description {{ Falling back to golden firmware for 81xx adapter. }} action {{ None recommended. }} class: firmware sl_severity: warning refcode: "" message: qla_printk KERN_ERR "FW: Please update operational firmware...\n" regex qla_printk "^qla2xxx ([[:print:]]*): FW: Please update operational firmware\\.\\.\\.$" description {{ The operational firmware image of a 81xx adapter is corrupt and needs to be reloaded. }} action {{ None recommended. }} class: firmware sl_severity: warning refcode: "" message: qla_printk KERN_ERR "Attempting retry of stop-firmware command...\n" regex qla_printk "^qla2xxx ([[:print:]]*): Attempting retry of stop-firmware command\\.\\.\\.$" description {{ Trying orderly shutdown of firmware. }} action {{ None recommended. }} class: firmware sl_severity: warning refcode: "" file: "drivers/scsi/qla2xxx/qla_isr.c" message: qla_printk KERN_ERR "Parity error -- HCCR=%x, Dumping firmware!\n" regex qla_printk "^qla2xxx ([[:print:]]*): Parity error -- HCCR=([0-9a-f]{1,}), Dumping firmware!$" description {{ A parity error was detected in a register or onboard RAM so perform a ASIC reset. }} action {{ None recommended. }} class: firmware sl_severity: warning refcode: "" message: qla_printk KERN_ERR "RISC paused -- HCCR=%x, Dumping firmware!\n" regex qla_printk "^qla2xxx ([[:print:]]*): RISC paused -- HCCR=([0-9a-f]{1,}), Dumping firmware!$" description {{ The ASIC was frozen so perform a reset of the ASIC. }} action {{ None recommended. }} class: firmware sl_severity: warning refcode: "" message: qla_printk KERN_ERR "IDC failed to post ACK.\n" regex qla_printk "^qla2xxx ([[:print:]]*): IDC failed to post ACK\\.$" description {{ Driver failed to ACK 81xx inter-driver communication event. }} action {{ None recommended. }} class: unknown sl_severity: warning refcode: "" message: qla_printk KERN_ERR "ISP System Error - mbx1=%xh mbx2=%xh mbx3=%xh mbx7=%xh.\n" regex qla_printk "^qla2xxx ([[:print:]]*): ISP System Error - mbx1=([0-9a-f]{1,})h mbx2=([0-9a-f]{1,})h mbx3=([0-9a-f]{1,})h mbx7=([0-9a-f]{1,})h\\.$" description {{ An internal system error occurred. }} action {{ None recommended. }} class: software sl_severity: warning refcode: "" message: qla_printk KERN_ERR "Unrecoverable Hardware Error: adapter marked OFFLINE!\n" regex qla_printk "^qla2xxx ([[:print:]]*): Unrecoverable Hardware Error: adapter marked OFFLINE!$" description {{ An internal parity error occurred and the adapter may need to be replaced. }} action {{ None recommended. }} class: hardware sl_severity: warning refcode: "" message: qla_printk KERN_ERR "ISP Request Transfer Error (%x).\n" regex qla_printk "^qla2xxx ([[:print:]]*): ISP Request Transfer Error \\(([0-9a-f]{1,})\\)\\.$" description {{ Error transferring data from request queue. }} action {{ None recommended. }} class: unknown sl_severity: warning refcode: "" message: qla_printk KERN_ERR "ISP Response Transfer Error.\n" regex qla_printk "^qla2xxx ([[:print:]]*): ISP Response Transfer Error\\.$" description {{ Error transferring data from firmware to host response queue. }} action {{ None recommended. }} class: unknown sl_severity: warning refcode: "" message: qla_printk KERN_WARNING "LIP occurred (%x).\n" regex qla_printk "^qla2xxx ([[:print:]]*): LIP occurred \\(([0-9a-f]{1,})\\)\\.$" description {{ Fibre channel LIP occurred on the link. }} action {{ None recommended. }} class: unknown sl_severity: warning refcode: "" message: qla_printk KERN_WARNING "LOOP UP detected (%s Gbps).\n" regex qla_printk "^qla2xxx ([[:print:]]*): LOOP UP detected \\(([[:print:]]*) Gbps\\)\\.$" description {{ Local port link is up. }} action {{ None recommended. }} class: unknown sl_severity: warning refcode: "" message: qla_printk KERN_WARNING "LOOP DOWN detected (%x %x %x %x).\n" regex qla_printk "^qla2xxx ([[:print:]]*): LOOP DOWN detected \\(([0-9a-f]{1,}) ([0-9a-f]{1,}) ([0-9a-f]{1,}) ([0-9a-f]{1,})\\)\\.$" description {{ Local port link is down. }} action {{ None recommended. }} class: unknown sl_severity: warning refcode: "" message: qla_printk KERN_WARNING "LIP reset occurred (%x).\n" regex qla_printk "^qla2xxx ([[:print:]]*): LIP reset occurred \\(([0-9a-f]{1,})\\)\\.$" description {{ Fibre channel LIP reset occurred. }} action {{ None recommended. }} class: unknown sl_severity: warning refcode: "" message: qla_printk KERN_WARNING "Configuration change detected: value=%x.\n" regex qla_printk "^qla2xxx ([[:print:]]*): Configuration change detected: value=([0-9a-f]{1,})\\.$" description {{ There was a change in the connection status of the local port. }} action {{ None recommended. }} class: unknown sl_severity: warning refcode: "" message: qla_printk KERN_ERR "Alert 84XX: panic recovery %04x %04x\n" regex qla_printk "^qla2xxx ([[:print:]]*): Alert 84XX: panic recovery ([0]{0,3}[0-9a-f]{1,}) ([0]{0,3}[0-9a-f]{1,})$" description {{ Internal panic recovered on a 84xx adapter. }} action {{ None recommended. }} class: unknown sl_severity: warning refcode: "" message: qla_printk KERN_ERR "Alert 84XX: firmware version %x\n" regex qla_printk "^qla2xxx ([[:print:]]*): Alert 84XX: firmware version ([0-9a-f]{1,})$" description {{ Unknown asynchronous event from 84xx adapter. }} action {{ None recommended. }} class: firmware sl_severity: warning refcode: "" message: qla_printk KERN_ERR "Alert 84xx: Invalid Alert %04x %04x %04x\n" regex qla_printk "^qla2xxx ([[:print:]]*): Alert 84xx: Invalid Alert ([0]{0,3}[0-9a-f]{1,}) ([0]{0,3}[0-9a-f]{1,}) ([0]{0,3}[0-9a-f]{1,})$" description {{ Unknown asynchronous event from 84xx adapter. }} action {{ None recommended. }} class: unknown sl_severity: warning refcode: "" message: qla_printk KERN_ERR "Invalid SCSI completion handle %d.\n" regex qla_printk "^qla2xxx ([[:print:]]*): Invalid SCSI completion handle ([-]\?[0-9]{1,})\\.$" description {{ Command completion is for invalid command. }} action {{ None recommended. }} class: software sl_severity: warning refcode: "" message: qla_printk KERN_ERR "Invalid ISP SCSI completion handle\n" regex qla_printk "^qla2xxx ([[:print:]]*): Invalid ISP SCSI completion handle$" description {{ Command completion is for invalid command. }} action {{ None recommended. }} class: software sl_severity: warning refcode: "" message: qla_printk KERN_ERR "%s: Invalid completion handle (%x).\n" regex qla_printk "^qla2xxx ([[:print:]]*): ([[:print:]]*): Invalid completion handle \\(([0-9a-f]{1,})\\)\\.$" description {{ Command completion is for invalid command. }} action {{ None recommended. }} class: software sl_severity: warning refcode: "" message: qla_printk KERN_ERR "%s: Invalid completion handle (%x) -- timed-out.\n" regex qla_printk "^qla2xxx ([[:print:]]*): ([[:print:]]*): Invalid completion handle \\(([0-9a-f]{1,})\\) -- timed-out\\.$" description {{ SCSI layer has already timed out command. }} action {{ None recommended. }} class: software sl_severity: warning refcode: "" message: qla_printk KERN_ERR "%s: SRB handle (%x) mismatch %x.\n" regex qla_printk "^qla2xxx ([[:print:]]*): ([[:print:]]*): SRB handle \\(([0-9a-f]{1,})\\) mismatch ([0-9a-f]{1,})\\.$" description {{ Command completion is for invalid command. }} action {{ None recommended. }} class: software sl_severity: warning refcode: "" message: qla_printk KERN_WARNING "Command is NULL: already returned to OS (sp=%p)\n" regex qla_printk "^qla2xxx ([[:print:]]*): Command is NULL: already returned to OS \\(sp=(\\(null\\)|([0]{0,7}[0-9a-f]{1,}))\\)$" description {{ Command already completed back to SCSI layer. }} action {{ None recommended. }} class: software sl_severity: warning refcode: "" message: qla_printk KERN_ERR "Error entry - invalid handle\n" regex qla_printk "^qla2xxx ([[:print:]]*): Error entry - invalid handle$" description {{ Error status entry is invalid. }} action {{ None recommended. }} class: software sl_severity: warning refcode: "" message: qla_printk KERN_ERR "Additional code -- 0x55AA.\n" regex qla_printk "^qla2xxx ([[:print:]]*): Additional code -- 0x55AA\\.$" description {{ Extra debug information from checking the ASIC when it is frozen. }} action {{ None recommended. }} class: software sl_severity: warning refcode: "" message: qla_printk KERN_WARNING "MSI-X: Failed to enable support -- %d/%d Retry with %d vectors\n" regex qla_printk "^qla2xxx ([[:print:]]*): MSI-X: Failed to enable support -- ([-]\?[0-9]{1,})/([-]\?[0-9]{1,}) Retry with ([-]\?[0-9]{1,}) vectors$" description {{ System could not give us the number of MSI-X vectors request so retry with less. }} action {{ None recommended. }} class: software sl_severity: warning refcode: "" message: qla_printk KERN_WARNING "MSI-X: Failed to enable support, giving up -- %d/%d\n" regex qla_printk "^qla2xxx ([[:print:]]*): MSI-X: Failed to enable support, giving up -- ([-]\?[0-9]{1,})/([-]\?[0-9]{1,})$" description {{ Could not enable MSI-X support for this adapter. }} action {{ None recommended. }} class: software sl_severity: warning refcode: "" message: qla_printk KERN_ERR "MSI-X: Unable to register handler -- %x/%d.\n" regex qla_printk "^qla2xxx ([[:print:]]*): MSI-X: Unable to register handler -- ([0-9a-f]{1,})/([-]\?[0-9]{1,})\\.$" description {{ Unable to register a specific MSI-X handler callback. }} action {{ None recommended. }} class: software sl_severity: warning refcode: "" message: qla_printk KERN_ERR "MSI-X: Falling back-to INTa mode -- %d.\n" regex qla_printk "^qla2xxx ([[:print:]]*): MSI-X: Falling back-to INTa mode -- ([-]\?[0-9]{1,})\\.$" description {{ Could not enable MSI so falling back to INTx for interrupt handling. }} action {{ None recommended. }} class: software sl_severity: warning refcode: "" message: qla_printk KERN_ERR "Failed to reserve interrupt %d already in use.\n" regex qla_printk "^qla2xxx ([[:print:]]*): Failed to reserve interrupt ([-]\?[0-9]{1,}) already in use\\.$" description {{ Could not reserve INTx IRQ. }} action {{ None recommended. }} class: software sl_severity: warning refcode: "" file: "drivers/scsi/qla2xxx/qla_mbx.c" message: qla_printk KERN_ERR "Mailbox command timeout occurred. Scheduling ISP abort. eeh_busy: 0x%x\n" regex qla_printk "^qla2xxx ([[:print:]]*): Mailbox command timeout occurred\\. Scheduling ISP abort\\. eeh_busy: 0x([0-9a-f]{1,})$" description {{ Mailbox command to firmware timed out, reset ASIC. }} action {{ None recommended. }} class: firmware sl_severity: warning refcode: "" message: qla_printk KERN_ERR "Mailbox command timeout occurred. Issuing ISP abort.\n" regex qla_printk "^qla2xxx ([[:print:]]*): Mailbox command timeout occurred\\. Issuing ISP abort\\.$" description {{ Mailbox command to firmware timed out, reset ASIC. }} action {{ None recommended. }} class: firmware sl_severity: warning refcode: "" file: "drivers/scsi/qla2xxx/qla_mid.c" message: qla_printk KERN_ERR "Couldn't delete req que %d\n" regex qla_printk "^qla2xxx ([[:print:]]*): Couldn't delete req que ([-]\?[0-9]{1,})$" description {{ Couldn't delete a request queue associated with a virtual port. }} action {{ None recommended. }} class: unknown sl_severity: warning refcode: "" message: qla_printk KERN_ERR "Couldn't delete rsp que %d\n" regex qla_printk "^qla2xxx ([[:print:]]*): Couldn't delete rsp que ([-]\?[0-9]{1,})$" description {{ Couldn't delete a response queue associated with a virtual port. }} action {{ None recommended. }} class: software sl_severity: warning refcode: "" message: qla_printk KERN_ERR "could not allocate memory for request que\n" regex qla_printk "^qla2xxx ([[:print:]]*): could not allocate memory for request que$" description {{ System has low memory. }} action {{ None recommended. }} class: software sl_severity: warning refcode: "" message: qla_printk KERN_ERR "Memory Allocation failed - request_ring\n" regex qla_printk "^qla2xxx ([[:print:]]*): Memory Allocation failed - request_ring$" description {{ Coherant DMA memory allocation failed. }} action {{ None recommended. }} class: software sl_severity: warning refcode: "" message: qla_printk KERN_ERR "No resources to create additional request queue\n" regex qla_printk "^qla2xxx ([[:print:]]*): No resources to create additional request queue$" description {{ Adapter has no more resources to create another request queue. }} action {{ None recommended. }} class: unknown sl_severity: warning refcode: "" message: qla_printk KERN_ERR "qla25xx_create_req_que failed\n" regex qla_printk "^qla2xxx ([[:print:]]*): qla25xx_create_req_que failed$" description {{ Failed to create a new request queue (beyond the base request queue). }} action {{ None recommended. }} class: unknown sl_severity: warning refcode: "" message: qla_printk KERN_ERR "could not allocate memory for response que\n" regex qla_printk "^qla2xxx ([[:print:]]*): could not allocate memory for response que$" description {{ System has low memory. }} action {{ None recommended. }} class: unknown sl_severity: warning refcode: "" message: qla_printk KERN_ERR "Memory Allocation failed - response_ring\n" regex qla_printk "^qla2xxx ([[:print:]]*): Memory Allocation failed - response_ring$" description {{ Coherant DMA memory allocation failed. }} action {{ None recommended. }} class: unknown sl_severity: warning refcode: "" message: qla_printk KERN_ERR "No resources to create additional response queue\n" regex qla_printk "^qla2xxx ([[:print:]]*): No resources to create additional response queue$" description {{ Adapter has no more resources to create another response queue. }} action {{ None recommended. }} class: unknown sl_severity: warning refcode: "" message: qla_printk KERN_WARNING "msix not enabled\n" regex qla_printk "^qla2xxx ([[:print:]]*): msix not enabled$" description {{ Adapter is not using MSI-X. }} action {{ None recommended. }} class: unknown sl_severity: warning refcode: "" message: qla_printk KERN_ERR "qla25xx_create_rsp_que failed\n" regex qla_printk "^qla2xxx ([[:print:]]*): qla25xx_create_rsp_que failed$" description {{ Failed to create a new response queue (beyond the base response queue). }} action {{ None recommended. }} class: software sl_severity: warning refcode: "" file: "drivers/scsi/qla2xxx/qla_os.c" message: qla_printk KERN_ERR "Unable to allocate memory for request queue ptrs\n" regex qla_printk "^qla2xxx ([[:print:]]*): Unable to allocate memory for request queue ptrs$" description {{ System low on memory. }} action {{ None recommended. }} class: software sl_severity: warning refcode: "" message: qla_printk KERN_ERR "Unable to allocate memory for response queue ptrs\n" regex qla_printk "^qla2xxx ([[:print:]]*): Unable to allocate memory for response queue ptrs$" description {{ System low on memory. }} action {{ None recommended. }} class: software sl_severity: warning refcode: "" message: qla_printk KERN_WARNING "Firmware is not multi-queue capable\n" regex qla_printk "^qla2xxx ([[:print:]]*): Firmware is not multi-queue capable$" description {{ The firmware for this adapter is not capable of multiple request or response queues. }} action {{ None recommended. }} class: firmware sl_severity: warning refcode: "" message: qla_printk KERN_ERR "Can't create request queue\n" regex qla_printk "^qla2xxx ([[:print:]]*): Can't create request queue$" description {{ A request to create a new request queue could not be fulfilled. }} action {{ None recommended. }} class: software sl_severity: warning refcode: "" message: qla_printk KERN_ERR "Response Queue create failed\n" regex qla_printk "^qla2xxx ([[:print:]]*): Response Queue create failed$" description {{ A request to create a new response queue failed. }} action {{ None recommended. }} class: software sl_severity: warning refcode: "" message: qla_printk KERN_ERR "scsi(%ld:%d:%d): Abort handler timed out -- %lx\n" regex qla_printk "^qla2xxx ([[:print:]]*): scsi\\(([-]\?[0-9]{1,}):([-]\?[0-9]{1,}):([-]\?[0-9]{1,})\\): Abort handler timed out -- ([0-9a-f]{1,})$" description {{ A request to abort a command timed out. }} action {{ None recommended. }} class: software sl_severity: warning refcode: "" message: qla_printk KERN_ERR "scsi(%ld:%d:%d): Abort command issued -- %d %lx %x.\n" regex qla_printk "^qla2xxx ([[:print:]]*): scsi\\(([-]\?[0-9]{1,}):([-]\?[0-9]{1,}):([-]\?[0-9]{1,})\\): Abort command issued -- ([-]\?[0-9]{1,}) ([0-9a-f]{1,}) ([0-9a-f]{1,})\\.$" description {{ A request to abort a command was issued from the SCSI layer. }} action {{ None recommended. }} class: software sl_severity: warning refcode: "" message: qla_printk KERN_INFO "scsi(%ld:%d:%d): %s RESET ISSUED.\n" regex qla_printk "^qla2xxx ([[:print:]]*): scsi\\(([-]\?[0-9]{1,}):([-]\?[0-9]{1,}):([-]\?[0-9]{1,})\\): ([[:print:]]*) RESET ISSUED\\.$" description {{ A reset of a LUN was requested by the SCSI layer. }} action {{ None recommended. }} class: software type: info refcode: "" message: qla_printk KERN_INFO "scsi(%ld:%d:%d): %s RESET SUCCEEDED.\n" regex qla_printk "^qla2xxx ([[:print:]]*): scsi\\(([-]\?[0-9]{1,}):([-]\?[0-9]{1,}):([-]\?[0-9]{1,})\\): ([[:print:]]*) RESET SUCCEEDED\\.$" description {{ LUN reset succeeded. }} action {{ None recommended. }} class: software type: info refcode: "" message: qla_printk KERN_ERR "scsi(%ld:%d:%d): %s RESET FAILED: %s.\n" regex qla_printk "^qla2xxx ([[:print:]]*): scsi\\(([-]\?[0-9]{1,}):([-]\?[0-9]{1,}):([-]\?[0-9]{1,})\\): ([[:print:]]*) RESET FAILED: ([[:print:]]*)\\.$" description {{ LUN reset failed. }} action {{ None recommended. }} class: software sl_severity: warning refcode: "" message: qla_printk KERN_INFO "scsi(%ld:%d:%d): BUS RESET ISSUED.\n" regex qla_printk "^qla2xxx ([[:print:]]*): scsi\\(([-]\?[0-9]{1,}):([-]\?[0-9]{1,}):([-]\?[0-9]{1,})\\): BUS RESET ISSUED\\.$" description {{ A bus reset was requested by the SCSI layer. }} action {{ None recommended. }} class: software type: info refcode: "" message: qla_printk KERN_INFO "qla2xxx_eh_bus_reset reset succeeded.\n" regex qla_printk "^qla2xxx ([[:print:]]*): qla2xxx_eh_bus_reset reset succeeded\\.$" description {{ bus reset succeeded. }} action {{ None recommended. }} class: software type: info refcode: "" message: qla_printk KERN_INFO "scsi(%ld:%d:%d): ADAPTER RESET ISSUED.\n" regex qla_printk "^qla2xxx ([[:print:]]*): scsi\\(([-]\?[0-9]{1,}):([-]\?[0-9]{1,}):([-]\?[0-9]{1,})\\): ADAPTER RESET ISSUED\\.$" description {{ A reset of the adapter was requested by the SCSI layer. }} action {{ None recommended. }} class: software type: info refcode: "" message: qla_printk KERN_INFO "qla2xxx_eh_host_reset reset succeeded.\n" regex qla_printk "^qla2xxx ([[:print:]]*): qla2xxx_eh_host_reset reset succeeded\\.$" description {{ Adapter reset succeeded. }} action {{ None recommended. }} class: software type: info refcode: "" message: qla_printk KERN_ERR "Failed to reserve PIO/MMIO regions (%s)\n" regex qla_printk "^qla2xxx ([[:print:]]*): Failed to reserve PIO/MMIO regions \\(([[:print:]]*)\\)$" description {{ PCI layer could not reserve device resources. }} action {{ None recommended. }} class: software sl_severity: warning refcode: "" message: qla_printk KERN_ERR "Invalid PCI I/O region size (%s)...\n" regex qla_printk "^qla2xxx ([[:print:]]*): Invalid PCI I/O region size \\(([[:print:]]*)\\)\\.\\.\\.$" description {{ PCI I/O memory region for this adapter is an invalid size. }} action {{ None recommended. }} class: software sl_severity: warning refcode: "" message: qla_printk KERN_WARNING "region #0 not a PIO resource (%s)...\n" regex qla_printk "^qla2xxx ([[:print:]]*): region #0 not a PIO resource \\(([[:print:]]*)\\)\\.\\.\\.$" description {{ Memory region 0 on the adapter is not a port I/O resource. }} action {{ None recommended. }} class: software sl_severity: warning refcode: "" message: qla_printk KERN_ERR "region #1 not an MMIO resource (%s), aborting\n" regex qla_printk "^qla2xxx ([[:print:]]*): region #1 not an MMIO resource \\(([[:print:]]*)\\), aborting$" description {{ Memory region 1 on the adapter isn't a memory-mapped I/O resource so abort configuration. }} action {{ None recommended. }} class: software sl_severity: warning refcode: "" message: qla_printk KERN_ERR "Invalid PCI mem region size (%s), aborting\n" regex qla_printk "^qla2xxx ([[:print:]]*): Invalid PCI mem region size \\(([[:print:]]*)\\), aborting$" description {{ The memory-mapped I/O region of the adapter is an invalid size so abort configuration. }} action {{ None recommended. }} class: software sl_severity: warning refcode: "" message: qla_printk KERN_ERR "cannot remap MMIO (%s), aborting\n" regex qla_printk "^qla2xxx ([[:print:]]*): cannot remap MMIO \\(([[:print:]]*)\\), aborting$" description {{ ioremap() operation to map device memory into the kernel address space failed so abort configuration. }} action {{ None recommended. }} class: software sl_severity: warning refcode: "" message: qla_printk KERN_INFO "MSI-X vector count: %d\n" regex qla_printk "^qla2xxx ([[:print:]]*): MSI-X vector count: ([-]\?[0-9]{1,})$" description {{ Number of MSI-X vectors for this adapter. }} action {{ None recommended. }} class: software type: info refcode: "" message: qla_printk KERN_WARNING "BAR 3 not enabled\n" regex qla_printk "^qla2xxx ([[:print:]]*): BAR 3 not enabled$" description {{ This adapter is not capable of multiple request and response queues. }} action {{ None recommended. }} class: software sl_severity: warning refcode: "" message: qla_printk KERN_INFO "Found an ISP%04X, irq %d, iobase 0x%p\n" regex qla_printk "^qla2xxx ([[:print:]]*): Found an ISP([0]{0,3}[0-9A-F]{1,}), irq ([-]\?[0-9]{1,}), iobase 0x(\\(null\\)|([0]{0,7}[0-9a-f]{1,}))$" description {{ Information about adapter just found in probe routine. }} action {{ None recommended. }} class: software type: info refcode: "" message: qla_printk KERN_ERR "[ERROR] Failed to allocate memory for adapter\n" regex qla_printk "^qla2xxx ([[:print:]]*): \\[ERROR] Failed to allocate memory for adapter$" description {{ System has low memory. }} action {{ None recommended. }} class: software sl_severity: warning refcode: "" message: qla_printk KERN_ERR "[ERROR] Failed to allocate memory for scsi_host\n" regex qla_printk "^qla2xxx ([[:print:]]*): \\[ERROR] Failed to allocate memory for scsi_host$" description {{ System has low memory. }} action {{ None recommended. }} class: software sl_severity: warning refcode: "" message: qla_printk KERN_ERR "[ERROR] Failed to allocate memory for queue pointers\n" regex qla_printk "^qla2xxx ([[:print:]]*): \\[ERROR] Failed to allocate memory for queue pointers$" description {{ System has low memory. }} action {{ None recommended. }} class: software sl_severity: warning refcode: "" message: qla_printk KERN_ERR "Failed to initialize adapter\n" regex qla_printk "^qla2xxx ([[:print:]]*): Failed to initialize adapter$" description {{ Error starting firmware. }} action {{ None recommended. }} class: software sl_severity: warning refcode: "" message: qla_printk KERN_WARNING "Can't create queues, falling back to single queue mode\n" regex qla_printk "^qla2xxx ([[:print:]]*): Can't create queues, falling back to single queue mode$" description {{ Setting up multiqueue mode failed so fall back to a single request and response queue. }} action {{ None recommended. }} class: software sl_severity: warning refcode: "" message: qla_printk KERN_ERR "Unable to start DPC thread!\n" regex qla_printk "^qla2xxx ([[:print:]]*): Unable to start DPC thread!$" description {{ Could not start deferred procedure kernel thread. }} action {{ None recommended. }} class: software sl_severity: warning refcode: "" message: qla_printk KERN_INFO " QLogic Fibre Channel HBA Driver: %s QLogic %s - %s ISP%04X: %s @ %s hdma%c, host#=%ld, fw=%s\n" regex qla_printk "^qla2xxx ([[:print:]]*): QLogic Fibre Channel HBA Driver: ([[:print:]]*) QLogic ([[:print:]]*) - ([[:print:]]*) ISP([0]{0,3}[0-9A-F]{1,}): ([[:print:]]*) @ ([[:print:]]*) hdma([[:print:]]), host#=([-]\?[0-9]{1,}), fw=([[:print:]]*)$" description {{ Info about adapter just configured. }} action {{ None recommended. }} class: software type: info refcode: "" message: qla_printk KERN_ERR "Unable to allocate memory for rsp\n" regex qla_printk "^qla2xxx ([[:print:]]*): Unable to allocate memory for rsp$" description {{ System low on memory. }} action {{ None recommended. }} class: software sl_severity: warning refcode: "" message: qla_printk KERN_ERR "Unable to allocate memory for rsp_ring\n" regex qla_printk "^qla2xxx ([[:print:]]*): Unable to allocate memory for rsp_ring$" description {{ System low on memory. }} action {{ None recommended. }} class: software sl_severity: warning refcode: "" message: qla_printk KERN_ERR "Unable to allocate memory for npiv info\n" regex qla_printk "^qla2xxx ([[:print:]]*): Unable to allocate memory for npiv info$" description {{ System low on memory. }} action {{ None recommended. }} class: software sl_severity: warning refcode: "" message: qla_printk KERN_ERR "qla2x00_do_dpc: dpc_flags: %lx\n" regex qla_printk "^qla2xxx ([[:print:]]*): qla2x00_do_dpc: dpc_flags: ([0-9a-f]{1,})$" description {{ Allocating Scsi_host struct from SCSI layer failed. }} action {{ None recommended. }} class: software sl_severity: warning refcode: "" message: qla_printk KERN_ERR "Loop down - aborting ISP.\n" regex qla_printk "^qla2xxx ([[:print:]]*): Loop down - aborting ISP\\.$" description {{ Local port has been down for over 4 minutes, reset ASIC. }} action {{ None recommended. }} class: software sl_severity: warning refcode: "" message: qla_printk KERN_ERR "RISC paused -- mmio_enabled, Dumping firmware!\n" regex qla_printk "^qla2xxx ([[:print:]]*): RISC paused -- mmio_enabled, Dumping firmware!$" description {{ ASIC is frozen after a AER recovery so perform a firware dump. }} action {{ None recommended. }} class: software sl_severity: warning refcode: "" message: qla_printk KERN_ERR "Can't re-enable PCI device after reset.\n" regex qla_printk "^qla2xxx ([[:print:]]*): Can't re-enable PCI device after reset\\.$" description {{ Adapter failed to restart after a PCIe slot reset. }} action {{ None recommended. }} class: software sl_severity: warning refcode: "" message: qla_printk KERN_ERR "the device failed to resume I/O from slot/link_reset\n" regex qla_printk "^qla2xxx ([[:print:]]*): the device failed to resume I/O from slot/link_reset$" description {{ Adapter failed to restart after AER recovery. }} action {{ None recommended. }} class: software sl_severity: warning refcode: "" file: "drivers/scsi/qla2xxx/qla_sup.c" message: qla_printk KERN_ERR "Inconsistent FLTL detected: checksum=0x%x.\n" regex qla_printk "^qla2xxx ([[:print:]]*): Inconsistent FLTL detected: checksum=0x([0-9a-f]{1,})\\.$" description {{ Firmware Layout Table signature not valid. }} action {{ None recommended. }} class: software sl_severity: warning refcode: "" message: qla_printk KERN_ERR "NPIV-Config: Failed to create vport [%02x]: wwpn=%llx wwnn=%llx.\n" regex qla_printk "^qla2xxx ([[:print:]]*): NPIV-Config: Failed to create vport \\[([0]{0,1}[0-9a-f]{1,})]: wwpn=([0-9a-f]{1,}) wwnn=([0-9a-f]{1,})\\.$" description {{ Predefined virtual port stored in flash could not be created. }} action {{ None recommended. }} class: software sl_severity: warning refcode: "" message: qla_printk KERN_ERR "Unable to allocate memory for optrom burst write (%x KB).\n" regex qla_printk "^qla2xxx ([[:print:]]*): Unable to allocate memory for optrom burst write \\(([0-9a-f]{1,}) KB\\)\\.$" description {{ Coherant DMA memory allocation failed. }} action {{ None recommended. }} class: software sl_severity: warning refcode: "" message: qla_printk KERN_ERR "Unable to unprotect flash for update.\n" regex qla_printk "^qla2xxx ([[:print:]]*): Unable to unprotect flash for update\\.$" description {{ Turning off write-protection for onboard flash memory failed. }} action {{ None recommended. }} class: software sl_severity: warning refcode: "" message: qla_printk KERN_WARNING "Unable to burst-write optrom segment (%x/%x/%llx).\n" regex qla_printk "^qla2xxx ([[:print:]]*): Unable to burst-write optrom segment \\(([0-9a-f]{1,})/([0-9a-f]{1,})/([0-9a-f]{1,})\\)\\.$" description {{ Cannot use fast flash write method so use slower method. }} action {{ None recommended. }} class: software sl_severity: warning refcode: "" message: qla_printk KERN_ERR "Unable to protect flash after update.\n" regex qla_printk "^qla2xxx ([[:print:]]*): Unable to protect flash after update\\.$" description {{ Reenable of write protection for onboard flash memory failed. }} action {{ None recommended. }} class: software sl_severity: warning refcode: "" message: qla_printk KERN_ERR "Unable to update fw options (beacon on).\n" regex qla_printk "^qla2xxx ([[:print:]]*): Unable to update fw options \\(beacon on\\)\\.$" description {{ Unable to set beacon blinking functionality. }} action {{ None recommended. }} class: software sl_severity: warning refcode: "" message: qla_printk KERN_ERR "Unable to update fw options (beacon off).\n" regex qla_printk "^qla2xxx ([[:print:]]*): Unable to update fw options \\(beacon off\\)\\.$" description {{ Unable to turn off beacon blinking functionality. }} action {{ None recommended. }} class: software sl_severity: warning refcode: "" message: qla_printk KERN_ERR "Unable to get fw options (beacon off).\n" regex qla_printk "^qla2xxx ([[:print:]]*): Unable to get fw options \\(beacon off\\)\\.$" description {{ Unable to read firmware options for this adapter. }} action {{ None recommended. }} class: software sl_severity: warning refcode: "" message: qla_printk KERN_ERR "Unable to allocate memory for optrom burst read (%x KB).\n" regex qla_printk "^qla2xxx ([[:print:]]*): Unable to allocate memory for optrom burst read \\(([0-9a-f]{1,}) KB\\)\\.$" description {{ Coherant DMA memory allocation failed. }} action {{ None recommended. }} class: software sl_severity: warning refcode: "" message: qla_printk KERN_WARNING "Unable to burst-read optrom segment (%x/%x/%llx).Reverting to slow-read\n" regex qla_printk "^qla2xxx ([[:print:]]*): Unable to burst-read optrom segment \\(([0-9a-f]{1,})/([0-9a-f]{1,})/([0-9a-f]{1,})\\)\\.Reverting to slow-read$" description {{ Cannot use fast flash read method so use slower method. }} action {{ None recommended. }} class: software sl_severity: warning refcode: "" ppc64-diag-2.6.4/ela/message_catalog/with_regex/ipr0000644000000000000000000013224312313010662020617 0ustar rootrootsubsystem: scsi file: "drivers/scsi/ipr.c" message[defensive]: dev_err "Failed to save PCI-X command register\n" regex dev_err "^([[:print:]]*) ([[:print:]]*): Failed to save PCI-X command register$" message[defensive]: dev_err "Failed to setup PCI-X command register\n" regex dev_err "^([[:print:]]*) ([[:print:]]*): Failed to setup PCI-X command register$" message[defensive]: dev_err "Host RCB failed with IOASC: 0x%08X\n" regex dev_err "^([[:print:]]*) ([[:print:]]*): Host RCB failed with IOASC: 0x([0]{0,7}[0-9A-F]{1,})$" /***** * Skipping all of the following because they report additional info * subsequent to "real" error messages. 979: ipr_hcam_err(hostrcb, "%s VPID/SN: %s\n" 998: ipr_err("Vendor/Product ID: %s\n" 1002: ipr_err(" Serial Number: %s\n" 1018: ipr_hcam_err(hostrcb, "%s WWN: %08X%08X\n" 1032: ipr_err(" WWN: %08X%08X\n" 1050: ipr_err("-----Current Configuration-----\n" 1051: ipr_err("Cache Directory Card Information:\n" 1053: ipr_err("Adapter Card Information:\n" 1056: ipr_err("-----Expected Configuration-----\n" 1057: ipr_err("Cache Directory Card Information:\n" 1059: ipr_err("Adapter Card Information:\n" 1062: ipr_err("Additional IOA Data: %08X %08X %08X\n" 1082: ipr_err("-----Current Configuration-----\n" 1083: ipr_err("Cache Directory Card Information:\n" 1085: ipr_err("Adapter Card Information:\n" 1088: ipr_err("-----Expected Configuration-----\n" 1089: ipr_err("Cache Directory Card Information:\n" 1091: ipr_err("Adapter Card Information:\n" 1094: ipr_err("Additional IOA Data: %08X %08X %08X\n" 1118: ipr_err("Device Errors Detected/Logged: %d/%d\n" 1126: ipr_phys_res_err(ioa_cfg, dev_entry->dev_res_addr, "Device %d", i + 1); 1129: ipr_err("-----New Device Information-----\n" 1132: ipr_err("Cache Directory Card Information:\n" 1135: ipr_err("Adapter Card Information:\n" 1158: ipr_err("Device Errors Detected/Logged: %d/%d\n" 1166: ipr_phys_res_err(ioa_cfg, dev_entry->dev_res_addr, "Device %d", i + 1); 1169: ipr_err("-----New Device Information-----\n" 1172: ipr_err("Cache Directory Card Information:\n" 1175: ipr_err("Adapter Card Information:\n" 1178: ipr_err("Additional IOA Data: %08X %08X %08X %08X %08X\n" 1207: ipr_err("RAID %s Array Configuration: %d:%d:%d:%d\n" 1225: ipr_err("Exposed Array Member %d:\n" 1227: ipr_err("Array Member %d:\n" 1230: ipr_phys_res_err(ioa_cfg, array_entry->dev_res_addr, "Current Location"); 1231: ipr_phys_res_err(ioa_cfg, array_entry->expected_dev_res_addr, "Expected Location"); 1258: ipr_err("RAID %s Array Configuration: %d:%d:%d:%d\n" 1274: ipr_err("Exposed Array Member %d:\n" 1276: ipr_err("Array Member %d:\n" 1280: ipr_phys_res_err(ioa_cfg, array_entry->dev_res_addr, "Current Location"); 1281: ipr_phys_res_err(ioa_cfg, array_entry->expected_dev_res_addr, "Expected Location"); 1313: ipr_err("%08X: %08X %08X %08X %08X\n" *****/ /***** * Omitting these because they could report any of a number of errors. 1338: ipr_hcam_err(hostrcb, "%s [PRC: %08X]\n" 1364: ipr_hcam_err(hostrcb, "%s [PRC: %08X]\n" *****/ /***** * Skipping all of the following because they report additional info * subsequent to "real" error messages. 1417: ipr_hcam_err(hostrcb, "%s %s: IOA Port=%d\n" 1421: ipr_hcam_err(hostrcb, "%s %s: IOA Port=%d, Phy=%d\n" 1425: ipr_hcam_err(hostrcb, "%s %s: IOA Port=%d, Cascade=%d\n" 1429: ipr_hcam_err(hostrcb, "%s %s: IOA Port=%d, Cascade=%d, Phy=%d\n" 1437: ipr_err("Path state=%02X IOA Port=%d Cascade=%d Phy=%d\n" 1509: ipr_hcam_err(hostrcb, "%s %s: Phy=%d, Link rate=%s, WWN=%08X%08X\n" 1515: ipr_hcam_err(hostrcb, "%s %s: Link rate=%s, WWN=%08X%08X\n" 1520: ipr_hcam_err(hostrcb, "%s %s: Phy=%d, Link rate=%s, " 1526: ipr_hcam_err(hostrcb, "%s %s: Cascade=%d, Link rate=%s, " 1532: ipr_hcam_err(hostrcb, "%s %s: Cascade=%d, Phy=%d, Link rate=%s " 1543: ipr_hcam_err(hostrcb, "Path element=%02X: Cascade=%d Phy=%d Link rate=%s " *****/ /***** * Omitting this because it could report any of a number of errors. 1567: ipr_hcam_err(hostrcb, "%s\n" *****/ message[defensive]: dev_err "Error notifications lost\n" regex dev_err "^([[:print:]]*) ([[:print:]]*): Error notifications lost$" message[defensive]: dev_err "Host RCB failed with IOASC: 0x%08X\n" regex dev_err "^([[:print:]]*) ([[:print:]]*): Host RCB failed with IOASC: 0x([0]{0,7}[0-9A-F]{1,})$" message[defensive]: dev_err "Adapter being reset due to command timeout.\n" regex dev_err "^([[:print:]]*) ([[:print:]]*): Adapter being reset due to command timeout\\.$" message[defensive]: dev_err "Adapter timed out transitioning to operational.\n" regex dev_err "^([[:print:]]*) ([[:print:]]*): Adapter timed out transitioning to operational\\.$" message[defensive]: dev_err "IOA dump long data transfer timeout\n" regex dev_err "^([[:print:]]*) ([[:print:]]*): IOA dump long data transfer timeout$" message[defensive]: dev_err "IOA dump short data transfer timeout\n" regex dev_err "^([[:print:]]*) ([[:print:]]*): IOA dump short data transfer timeout$" message[defensive]: dev_err "Invalid dump table format: %lx\n" regex dev_err "^([[:print:]]*) ([[:print:]]*): Invalid dump table format: ([0-9a-f]{1,})$" message[defensive]: dev_err "Dump of IOA initiated\n" regex dev_err "^([[:print:]]*) ([[:print:]]*): Dump of IOA initiated$" message[defensive]: dev_err "Dump of IOA failed. Dump table not valid: %d, %X.\n" regex dev_err "^([[:print:]]*) ([[:print:]]*): Dump of IOA failed\\. Dump table not valid: ([-]\?[0-9]{1,}), ([0-9A-F]{1,})\\.$" message[defensive]: dev_err "Dump of IOA completed.\n" regex dev_err "^([[:print:]]*) ([[:print:]]*): Dump of IOA completed\\.$" message[chatter]: dev_info "%s adapter write cache.\n" regex dev_info "^([[:print:]]*) ([[:print:]]*): ([[:print:]]*) adapter write cache\\.$" message[defensive]: dev_err "Microcode download already in progress\n" regex dev_err "^([[:print:]]*) ([[:print:]]*): Microcode download already in progress$" message[defensive]: dev_err "Failed to map microcode download buffer!\n" regex dev_err "^([[:print:]]*) ([[:print:]]*): Failed to map microcode download buffer!$" message[defensive]: dev_err "Firmware file %s not found\n" regex dev_err "^([[:print:]]*) ([[:print:]]*): Firmware file ([[:print:]]*) not found$" message[defensive]: dev_err "Invalid microcode buffer\n" regex dev_err "^([[:print:]]*) ([[:print:]]*): Invalid microcode buffer$" message[defensive]: dev_err "Microcode buffer allocation failed\n" regex dev_err "^([[:print:]]*) ([[:print:]]*): Microcode buffer allocation failed$" message[defensive]: dev_err "Microcode buffer copy to DMA buffer failed\n" regex dev_err "^([[:print:]]*) ([[:print:]]*): Microcode buffer copy to DMA buffer failed$" message[defensive]: ipr_err "Dump memory allocation failed\n" regex ipr_err "^ipr: Dump memory allocation failed$" message[defensive]: dev_err "Adapter being reset as a result of error recovery.\n" regex dev_err "^([[:print:]]*) ([[:print:]]*): Adapter being reset as a result of error recovery\\.$" message[defensive]: scmd_printk KERN_ERR "Resetting device\n" regex sdev_printk "^([[:print:]]*) ([[:print:]]*): Resetting device$" regex scmd_printk_disk "^([[:print:]]*) ([[:print:]]*): \\[([[:print:]]*)] Resetting device$" message[defensive]: sdev_printk KERN_ERR "Abort timed out. Resetting bus.\n" regex sdev_printk "^([[:print:]]*) ([[:print:]]*): Abort timed out\\. Resetting bus\\.$" message[defensive]: scmd_printk KERN_ERR "Aborting command: %02X\n" regex sdev_printk "^([[:print:]]*) ([[:print:]]*): Aborting command: ([0]{0,1}[0-9A-F]{1,})$" regex scmd_printk_disk "^([[:print:]]*) ([[:print:]]*): \\[([[:print:]]*)] Aborting command: ([0]{0,1}[0-9A-F]{1,})$" message[defensive]: dev_err "Permanent IOA failure. 0x%08X\n" regex dev_err "^([[:print:]]*) ([[:print:]]*): Permanent IOA failure\\. 0x([0]{0,7}[0-9A-F]{1,})$" message[defensive]: dev_err "Invalid response handle from IOA\n" regex dev_err "^([[:print:]]*) ([[:print:]]*): Invalid response handle from IOA$" message[defensive]: dev_err "pci_map_sg failed!\n" regex dev_err "^([[:print:]]*) ([[:print:]]*): pci_map_sg failed!$" message[defensive]: scmd_printk KERN_ERR "Request Sense failed with IOASC: 0x%08X\n" regex sdev_printk "^([[:print:]]*) ([[:print:]]*): Request Sense failed with IOASC: 0x([0]{0,7}[0-9A-F]{1,})$" regex scmd_printk_disk "^([[:print:]]*) ([[:print:]]*): \\[([[:print:]]*)] Request Sense failed with IOASC: 0x([0]{0,7}[0-9A-F]{1,})$" /***** * Skipping the following because they report additional info * subsequent to "real" error messages. 4568: ipr_err("IOASA Dump:\n" 4571: ipr_err("%08X: %08X %08X %08X %08X\n" *****/ message[chatter]: dev_info "IOA initialized.\n" regex dev_info "^([[:print:]]*) ([[:print:]]*): IOA initialized\\.$" message[defensive]: dev_err "Term power is absent on scsi bus %d\n" regex dev_err "^([[:print:]]*) ([[:print:]]*): Term power is absent on scsi bus ([-]\?[0-9]{1,})$" message[defensive]: dev_err "Invalid resource address reported: 0x%08X\n" regex dev_err "^([[:print:]]*) ([[:print:]]*): Invalid resource address reported: 0x([0]{0,7}[0-9A-F]{1,})$" message[defensive]: dev_err "0x%02X failed with IOASC: 0x%08X\n" regex dev_err "^([[:print:]]*) ([[:print:]]*): 0x([0]{0,1}[0-9A-F]{1,}) failed with IOASC: 0x([0]{0,7}[0-9A-F]{1,})$" message[defensive]: dev_err "Microcode download required\n" regex dev_err "^([[:print:]]*) ([[:print:]]*): Microcode download required$" message[defensive]: dev_err "Too many devices attached\n" regex dev_err "^([[:print:]]*) ([[:print:]]*): Too many devices attached$" message[chatter]: dev_info "Adapter firmware version: %02X%02X%02X%02X\n" regex dev_info "^([[:print:]]*) ([[:print:]]*): Adapter firmware version: ([0]{0,1}[0-9A-F]{1,})([0]{0,1}[0-9A-F]{1,})([0]{0,1}[0-9A-F]{1,})([0]{0,1}[0-9A-F]{1,})$" message[chatter]: dev_info "Starting IOA initialization sequence.\n" regex dev_info "^([[:print:]]*) ([[:print:]]*): Starting IOA initialization sequence\\.$" message[chatter]: dev_info "Initializing IOA.\n" regex dev_info "^([[:print:]]*) ([[:print:]]*): Initializing IOA\\.$" message[defensive]: dev_err "IOA unit check with no data\n" regex dev_err "^([[:print:]]*) ([[:print:]]*): IOA unit check with no data$" message[defensive]: dev_err "IOA taken offline - error recovery failed\n" regex dev_err "^([[:print:]]*) ([[:print:]]*): IOA taken offline - error recovery failed$" message[defensive]: dev_dbg "ioa_cfg adx: 0x%p\n" regex dev_dbg "^([[:print:]]*) ([[:print:]]*): ioa_cfg adx: 0x(\\(null\\)|([0]{0,7}[0-9a-f]{1,}))$" message[defensive]: dev_err "Adapter not supported in this hardware configuration.\n" regex dev_err "^([[:print:]]*) ([[:print:]]*): Adapter not supported in this hardware configuration\\.$" message[defensive]: dev_err "Can not assign irq %d\n" regex dev_err "^([[:print:]]*) ([[:print:]]*): Can not assign irq ([-]\?[0-9]{1,})$" message[chatter]: dev_info "IRQ assigned: %d\n" regex dev_info "^([[:print:]]*) ([[:print:]]*): IRQ assigned: ([-]\?[0-9]{1,})$" message[chatter]: dev_info "MSI test failed. Falling back to LSI.\n" regex dev_info "^([[:print:]]*) ([[:print:]]*): MSI test failed\\. Falling back to LSI\\.$" message[chatter]: dev_info "MSI test succeeded.\n" regex dev_info "^([[:print:]]*) ([[:print:]]*): MSI test succeeded\\.$" message[defensive]: dev_err "Cannot enable adapter\n" regex dev_err "^([[:print:]]*) ([[:print:]]*): Cannot enable adapter$" message[chatter]: dev_info "Found IOA with IRQ: %d\n" regex dev_info "^([[:print:]]*) ([[:print:]]*): Found IOA with IRQ: ([-]\?[0-9]{1,})$" message[defensive]: dev_err "call to scsi_host_alloc failed!\n" regex dev_err "^([[:print:]]*) ([[:print:]]*): call to scsi_host_alloc failed!$" message[defensive]: dev_err "Unknown adapter chipset 0x%04X 0x%04X\n" regex dev_err "^([[:print:]]*) ([[:print:]]*): Unknown adapter chipset 0x([0]{0,3}[0-9A-F]{1,}) 0x([0]{0,3}[0-9A-F]{1,})$" message[defensive]: dev_err "Couldn't register memory range of registers\n" regex dev_err "^([[:print:]]*) ([[:print:]]*): Couldn't register memory range of registers$" message[defensive]: dev_err "Couldn't map memory range of registers\n" regex dev_err "^([[:print:]]*) ([[:print:]]*): Couldn't map memory range of registers$" message[defensive]: dev_err "Failed to set PCI DMA mask\n" regex dev_err "^([[:print:]]*) ([[:print:]]*): Failed to set PCI DMA mask$" message[defensive]: dev_err "Write of cache line size failed\n" regex dev_err "^([[:print:]]*) ([[:print:]]*): Write of cache line size failed$" message[chatter]: dev_info "MSI enabled with IRQ: %d\n" regex dev_info "^([[:print:]]*) ([[:print:]]*): MSI enabled with IRQ: ([-]\?[0-9]{1,})$" message[chatter]: dev_info "Cannot enable MSI.\n" regex dev_info "^([[:print:]]*) ([[:print:]]*): Cannot enable MSI\\.$" message[defensive]: dev_err "Failed to save PCI config space\n" regex dev_err "^([[:print:]]*) ([[:print:]]*): Failed to save PCI config space$" message[defensive]: dev_err "Couldn't allocate enough memory for device driver!\n" regex dev_err "^([[:print:]]*) ([[:print:]]*): Couldn't allocate enough memory for device driver!$" message[defensive]: dev_err "Couldn't register IRQ %d! rc=%d\n" regex dev_err "^([[:print:]]*) ([[:print:]]*): Couldn't register IRQ ([-]\?[0-9]{1,})! rc=([-]\?[0-9]{1,})$" message[chatter]: ipr_info "IBM Power RAID SCSI Device Driver version: %s %s\n" regex ipr_info "^ipr: IBM Power RAID SCSI Device Driver version: [[:print:]]* [[:print:]]*$" /***** ***** The rest of this catlog was generated automatically from ***** ipr_error_table[]. *****/ message: ipr_hcam_err "FFF9: Device sector reassign successful\n" regex ipr_hcam_err "^ipr: ([[:print:]]*): FFF9: Device sector reassign successful$" description {{ Device sector reassign successful. }} action {{ None required }} class: software type: info refcode: "" message: ipr_hcam_err "FFF7: Media error recovered by device rewrite procedures\n" regex ipr_hcam_err "^ipr: ([[:print:]]*): FFF7: Media error recovered by device rewrite procedures$" description {{ Media error recovered by device rewrite procedures. }} action {{ None required }} class: unknown type: info refcode: "" message: ipr_hcam_err "7001: IOA sector reassignment successful\n" regex ipr_hcam_err "^ipr: ([[:print:]]*): 7001: IOA sector reassignment successful$" description {{ IOA sector reassignment successful }} action {{ If three 7001 messages have occurred for the same disk drive location, then exchange the failing items in the Failing Items list one at a time. If the problem is not resolved, perform “MAP 3351†on page 104 of the SAS Reference Guide - http://publib.boulder.ibm.com/infocenter/powersys/v3r1m5/topic/p7ebk/p7ebk.pdf }} class: unknown sl_severity: error refcode: "" message: ipr_hcam_err "FFF9: Soft media error. Sector reassignment recommended\n" regex ipr_hcam_err "^ipr: ([[:print:]]*): FFF9: Soft media error\\. Sector reassignment recommended$" description {{ Soft media error. Sector reassignment recommended. }} action {{ None required }} class: software type: info refcode: "" message: ipr_hcam_err "FFF7: Media error recovered by IOA rewrite procedures\n" regex ipr_hcam_err "^ipr: ([[:print:]]*): FFF7: Media error recovered by IOA rewrite procedures$" description {{ Media error recovered by IOA rewrite procedures. }} action {{ None required }} class: unknown type: info refcode: "" message: ipr_hcam_err "FF3D: Soft PCI bus error recovered by the IOA\n" regex ipr_hcam_err "^ipr: ([[:print:]]*): FF3D: Soft PCI bus error recovered by the IOA$" description {{ Soft PCI bus error recovered by the IOA. }} action {{ If 10 FF3D messages have occurred for the same I/O Adapter physical location within a week, then exchange the failing items in the Failing Items list one at a time. }} class: hardware sl_severity: error refcode: "" message: ipr_res_err "FFF6: Device hardware error recovered by the IOA\n" regex ipr_res_err "^ipr: ([[:print:]]*): FFF6: Device hardware error recovered by the IOA$" description {{ Device hardware error recovered by the IOA. }} action {{ None required }} class: hardware type: info refcode: "" message: ipr_hcam_err "FFF6: Device hardware error recovered by the IOA\n" regex ipr_hcam_err "^ipr: ([[:print:]]*): FFF6: Device hardware error recovered by the IOA$" description {{ Device hardware error recovered by the IOA. }} action {{ None required }} class: hardware type: info refcode: "" message: ipr_hcam_err "FFF6: Device hardware error recovered by the device\n" regex ipr_hcam_err "^ipr: ([[:print:]]*): FFF6: Device hardware error recovered by the device$" description {{ Device hardware error recovered by the device. }} action {{ None required }} class: hardware type: info refcode: "" message: ipr_res_err "FF3D: Soft IOA error recovered by the IOA\n" regex ipr_res_err "^ipr: ([[:print:]]*): FF3D: Soft IOA error recovered by the IOA$" description {{ Soft IOA error recovered by the IOA. }} action {{ If 10 FF3D messages have occurred for the same I/O Adapter physical location within a week, then exchange the failing items in the Failing Items list one at a time. }} class: unknown sl_severity: error refcode:"" message: ipr_hcam_err "FF3D: Soft IOA error recovered by the IOA\n" regex ipr_hcam_err "^ipr: ([[:print:]]*): FF3D: Soft IOA error recovered by the IOA$" description {{ Soft IOA error recovered by the IOA. }} action {{ If 10 FF3D messages have occurred for the same I/O Adapter physical location within a week, then exchange the failing items in the Failing Items list one at a time. }} class: unknown type: info refcode: "" message: ipr_hcam_err "FFFA: Undefined device response recovered by the IOA\n" regex ipr_hcam_err "^ipr: ([[:print:]]*): FFFA: Undefined device response recovered by the IOA$" description {{ Undefined device response recovered by the IOA. }} action {{ If 10 FFFA messages have occurred for the same disk drive location in a one-week time period, then exchange the failing items in the Failing Items list one at a time. If the problem is not resolved, perform “MAP 3351†on page 104 of the SAS Reference Guide - http://publib.boulder.ibm.com/infocenter/powersys/v3r1m5/topic/p7ebk/p7ebk.pdf }} class: unknown sl_severity: error refcode: "" message: ipr_hcam_err "FFF6: Failure prediction threshold exceeded\n" regex ipr_hcam_err "^ipr: ([[:print:]]*): FFF6: Failure prediction threshold exceeded$" description {{ Failure prediction threshold exceeded. }} action {{ Exchange the failing items in the Failing Items list one at a time. If the problem is not resolved, perform “MAP 3351†on page 104 of the SAS Reference Guide - http://publib.boulder.ibm.com/infocenter/powersys/v3r1m5/topic/p7ebk/p7ebk.pdf }} class: unknown type: info refcode: "" message: ipr_hcam_err "8009: Impending cache battery pack failure\n" regex ipr_hcam_err "^ipr: ([[:print:]]*): 8009: Impending cache battery pack failure$" description {{ Impending cache battery pack failure. }} action {{ Perform “MAP 3300†on page 90 of the SAS Reference Guide - http://publib.boulder.ibm.com/infocenter/powersys/v3r1m5/topic/p7ebk/p7ebk.pdf }} class: hardware sl_severity: error refcode: "" message: ipr_hcam_err "3020: Storage subsystem configuration error\n" regex ipr_hcam_err "^ipr: ([[:print:]]*): 3020: Storage subsystem configuration error$" description {{ Storage subsystem configuration error. }} action {{ Perform “MAP 3350†on page 101 of the SAS Reference Guide - http://publib.boulder.ibm.com/infocenter/powersys/v3r1m5/topic/p7ebk/p7ebk.pdf }} class: software sl_severity: error refcode: "" message: ipr_hcam_err "FFF3: Disk media format bad\n" regex ipr_hcam_err "^ipr: ([[:print:]]*): FFF3: Disk media format bad$" description {{ Disk media format bad. }} action {{ Perform “MAP 3335†on page 97 of the SAS Reference Guide - http://publib.boulder.ibm.com/infocenter/powersys/v3r1m5/topic/p7ebk/p7ebk.pdf }} class: hardware sl_severity: error refcode: "" message: ipr_hcam_err "3002: Addressed device failed to respond to selection\n" regex ipr_hcam_err "^ipr: ([[:print:]]*): 3002: Addressed device failed to respond to selection$" description {{ Addressed device failed to respond to selection. }} action {{ Exchange the failing items in the Failing Items list one at a time. If the problem is not resolved, perform “MAP 3351†on page 104 of the SAS Reference Guide - http://publib.boulder.ibm.com/infocenter/powersys/v3r1m5/topic/p7ebk/p7ebk.pdf }} class: hardware sl_severity: error refcode: "" message: ipr_res_err "3100: Device bus error\n" regex ipr_res_err "^ipr: ([[:print:]]*): 3100: Device bus error$" description {{ Device bus error. }} action {{ A SAS fabric error occurred. Perform “MAP 3350†on page 101 of the SAS Reference Guide - http://publib.boulder.ibm.com/infocenter/powersys/v3r1m5/topic/p7ebk/p7ebk.pdf }} class: hardware sl_severity: error refcode: "" message: ipr_hcam_err "3100: Device bus error\n" regex ipr_hcam_err "^ipr: ([[:print:]]*): 3100: Device bus error$" description {{ Device bus error. }} action {{ A SAS fabric error occurred. Perform “MAP 3350†on page 101 of the SAS Reference Guide - http://publib.boulder.ibm.com/infocenter/powersys/v3r1m5/topic/p7ebk/p7ebk.pdf }} class: hardware sl_severity: error refcode: "" message: ipr_hcam_err "3109: IOA timed out a device command\n" regex ipr_hcam_err "^ipr: ([[:print:]]*): 3109: IOA timed out a device command$" description {{ IOA timed out a device command. }} action {{ Perform “MAP 3350†on page 101 of the SAS Reference Guide - http://publib.boulder.ibm.com/infocenter/powersys/v3r1m5/topic/p7ebk/p7ebk.pdf }} class: unknown sl_severity: error refcode: "" message: ipr_hcam_err "4100: Hard device bus fabric error\n" regex ipr_hcam_err "^ipr: ([[:print:]]*): 4100: Hard device bus fabric error$" description {{ Hard device bus fabric error. }} action {{ Perform “MAP 3352†on page 105 of the SAS Reference Guide - http://publib.boulder.ibm.com/infocenter/powersys/v3r1m5/topic/p7ebk/p7ebk.pdf }} class: unknown sl_severity: error refcode: "" message: ipr_hcam_err "9000: IOA reserved area data check\n" regex ipr_hcam_err "^ipr: ([[:print:]]*): 9000: IOA reserved area data check$" description {{ IOA reserved area data check. }} action {{ Perform “MAP 3390†on page 106 of the SAS Reference Guide - http://publib.boulder.ibm.com/infocenter/powersys/v3r1m5/topic/p7ebk/p7ebk.pdf }} class: software type: info refcode: "" message: ipr_hcam_err "9001: IOA reserved area invalid data pattern\n" regex ipr_hcam_err "^ipr: ([[:print:]]*): 9001: IOA reserved area invalid data pattern$" description {{ IOA reserved area invalid data pattern. }} action {{ Perform “MAP 3337†on page 98 of the SAS Reference Guide - http://publib.boulder.ibm.com/infocenter/powersys/v3r1m5/topic/p7ebk/p7ebk.pdf }} class: unknown sl_severity: error refcode: "" message: ipr_hcam_err "9002: IOA reserved area LRC error\n" regex ipr_hcam_err "^ipr: ([[:print:]]*): 9002: IOA reserved area LRC error$" description {{ IOA reserved area LRC error. }} action {{ Perform “MAP 3390†on page 106 of the SAS Reference Guide - http://publib.boulder.ibm.com/infocenter/powersys/v3r1m5/topic/p7ebk/p7ebk.pdf }} class: unknown sl_severity: error refcode: "" message: ipr_hcam_err "102E: Out of alternate sectors for disk storage\n" regex ipr_hcam_err "^ipr: ([[:print:]]*): 102E: Out of alternate sectors for disk storage$" description {{ Out of alternate sectors for disk storage. }} action {{ Exchange the failing items in the Failing Items list one at a time. If the problem is not resolved, perform MAP 3351 on page 104 of the SAS Reference Guide - http://publib.boulder.ibm.com/infocenter/powersys/v3r1m5/topic/p7ebk/p7ebk.pdf }} class: unknown sl_severity: error refcode: "" message: ipr_res_err "FFF4: Data transfer underlength error\n" regex ipr_res_err "^ipr: ([[:print:]]*): FFF4: Data transfer underlength error$" description {{ Data transfer underlength error. }} action{{ Exchange the failing items in the Failing Items list one at a time. If the problem is not resolved, perform “MAP 3351†on page 104 of the SAS Reference Guide - http://publib.boulder.ibm.com/infocenter/powersys/v3r1m5/topic/p7ebk/p7ebk.pdf }} class: unknown sl_severity: error refcode: "" message: ipr_hcam_err "FFF4: Data transfer underlength error\n" regex ipr_hcam_err "^ipr: ([[:print:]]*): FFF4: Data transfer underlength error$" description {{ Data transfer underlength error. }} action {{ Exchange the failing items in the Failing Items list one at a time. If the problem is not resolved, perform “MAP 3351†on page 104 of the SAS Reference Guide - http://publib.boulder.ibm.com/infocenter/powersys/v3r1m5/topic/p7ebk/p7ebk.pdf }} class: unknown sl_severity: error refcode: "" message: ipr_res_err "FFF4: Data transfer overlength error\n" regex ipr_res_err "^ipr: ([[:print:]]*): FFF4: Data transfer overlength error$" description {{ Data transfer overlength error. }} action {{ Exchange the failing items in the Failing Items list one at a time. If the problem is not resolved, perform “MAP 3351†on page 104 of the SAS Reference Guide - http://publib.boulder.ibm.com/infocenter/powersys/v3r1m5/topic/p7ebk/p7ebk.pdf }} class: software sl_severity: error refcode: "" message: ipr_hcam_err "FFF4: Data transfer overlength error\n" regex ipr_hcam_err "^ipr: ([[:print:]]*): FFF4: Data transfer overlength error$" description {{ Data transfer overlength error. }} action {{ Exchange the failing items in the Failing Items list one at a time. If the problem is not resolved, perform “MAP 3351†on page 104 of the SAS Reference Guide - http://publib.boulder.ibm.com/infocenter/powersys/v3r1m5/topic/p7ebk/p7ebk.pdf }} class: unknown sl_severity: error refcode: "" message: ipr_hcam_err "3400: Logical unit failure\n" regex ipr_hcam_err "^ipr: ([[:print:]]*): 3400: Logical unit failure$" description {{ Device, I/O Adapter, Any device on I/O bus, Signal cables. }} action {{ Exchange the failing items in the Failing Items list one at a time. }} class: hardware sl_severity: error refcode: "" message: ipr_hcam_err "FFF4: Device microcode is corrupt\n" regex ipr_hcam_err "^ipr: ([[:print:]]*): FFF4: Device microcode is corrupt$" description {{ Device microcode is corrupt. }} action {{ Exchange the failing items in the Failing Items list one at a time. If the problem is not resolved, perform “MAP 3351†on page 104 of the SAS Reference Guide - http://publib.boulder.ibm.com/infocenter/powersys/v3r1m5/topic/p7ebk/p7ebk.pdf }} class: unknown sl_severity: error refcode: "" message: ipr_res_err "8150: PCI bus error\n" regex ipr_res_err "^ipr: ([[:print:]]*): 8150: PCI bus error$" description {{ PCI bus error. }} action {{ If two errors have occurred for the same I/O adapter in 24 hours, exchange the failing items in the Failing Items list one at a time. }} class: hardware sl_severity: error refcode: "" message: ipr_hcam_err "8150: PCI bus error\n" regex ipr_hcam_err "^ipr: ([[:print:]]*): 8150: PCI bus error$" description {{ PCI bus error. }} action {{ If two errors have occurred for the same I/O adapter in 24 hours, exchange the failing items in the Failing Items list one at a time. }} class: hardware sl_severity: error refcode: "" message: ipr_res_err "FFF4: Disk device problem\n" regex ipr_res_err "^ipr: ([[:print:]]*): FFF4: Disk device problem$" description {{ Disk device problem. }} action {{ Exchange the failing items in the Failing Items list one at a time. If the problem is not resolved, perform “MAP 3351†on page 104 of the SAS Reference Guide - http://publib.boulder.ibm.com/infocenter/powersys/v3r1m5/topic/p7ebk/p7ebk.pdf }} class: hardware sl_severity: error refcode: "" message: ipr_hcam_err "FFF4: Disk device problem\n" regex ipr_hcam_err "^ipr: ([[:print:]]*): FFF4: Disk device problem$" description {{ Disk device problem. }} action {{ Exchange the failing items in the Failing Items list one at a time. If the problem is not resolved, perform “MAP 3351†on page 104 of the SAS Reference Guide - http://publib.boulder.ibm.com/infocenter/powersys/v3r1m5/topic/p7ebk/p7ebk.pdf }} class: hardware sl_severity: error refcode: "" message: ipr_res_err "8150: Permanent IOA failure\n" regex ipr_res_err "^ipr: ([[:print:]]*): 8150: Permanent IOA failure$" description {{ Permanent IOA failure. }} action {{ Exchange the failing items in the Failing Items list one at a time. }} class: unknown sl_severity: error refcode: "" message: ipr_hcam_err "8150: Permanent IOA failure\n" regex ipr_hcam_err "^ipr: ([[:print:]]*): 8150: Permanent IOA failure$" description {{ Permanent IOA failure. }} action {{ Exchange the failing items in the Failing Items list one at a time. }} class: unknown sl_severity: error refcode: "" message: ipr_hcam_err "3010: Disk device returned wrong response to IOA\n" regex ipr_hcam_err "^ipr: ([[:print:]]*): 3010: Disk device returned wrong response to IOA$" description {{ Disk device returned wrong response to IOA. }} action {{ Exchange the failing items in the Failing Items list one at a time. If the problem is not resolved, perform “MAP 3351†on page 104 of the SAS Reference Guide - http://publib.boulder.ibm.com/infocenter/powersys/v3r1m5/topic/p7ebk/p7ebk.pdf }} class: unknown sl_severity: error refcode: "" message: ipr_hcam_err "8151: IOA microcode error\n" regex ipr_hcam_err "^ipr: ([[:print:]]*): 8151: IOA microcode error$" description {{ IOA microcode error. }} action {{ Update adapter microcode. See “Updating the controller microcode†on page 63 of the SAS Reference Guide - http://publib.boulder.ibm.com/infocenter/powersys/v3r1m5/topic/p7ebk/p7ebk.pdf If the problem is not resolved, exchange the failing items in the Failing Items list one at a time. }} class: unknown sl_severity: error refcode:"" message: ipr_hcam_err "8157: IOA error requiring IOA reset to recover\n" regex ipr_hcam_err "^ipr: ([[:print:]]*): 8157: IOA error requiring IOA reset to recover$" description {{ IOA error requiring IOA reset to recover. }} action {{ If two 8157 messages have occurred for the same I/O adapter location, exchange the failing items in the Failing Items list one at a time. }} class: unknown sl_severity: error refcode: "" message: ipr_hcam_err "8008: A permanent cache battery pack failure occurred\n" regex ipr_hcam_err "^ipr: ([[:print:]]*): 8008: A permanent cache battery pack failure occurred$" description {{ A permanent cache battery pack failure occurred. }} action {{ Perform “MAP 3300†on page 90 of the SAS Reference Guide - http://publib.boulder.ibm.com/infocenter/powersys/v3r1m5/topic/p7ebk/p7ebk.pdf }} class: hardware sl_severity: error refcode: "" message: ipr_hcam_err "9090: Disk unit has been modified after the last known status\n" regex ipr_hcam_err "^ipr: ([[:print:]]*): 9090: Disk unit has been modified after the last known status$" description {{ Disk unit has been modified after the last known status. }} action {{ Perform “MAP 3333†on page 95 of the SAS Reference Guide - http://publib.boulder.ibm.com/infocenter/powersys/v3r1m5/topic/p7ebk/p7ebk.pdf }} class: hardware sl_severity: warning refcode: "" message: ipr_hcam_err "9081: IOA detected device error\n" regex ipr_hcam_err "^ipr: ([[:print:]]*): 9081: IOA detected device error$" description {{ IOA detected device error. }} action {{ Exchange the failing items in the Failing Items list one at a time. }} class: unknown sl_severity: error refcode: "" message: ipr_hcam_err "9082: IOA detected device error\n" regex ipr_hcam_err "^ipr: ([[:print:]]*): 9082: IOA detected device error$" description {{ IOA detected device error. }} action {{ Exchange the failing items in the Failing Items list one at a time. }} class: unknown sl_severity: error refcode: "" message: ipr_hcam_err "9091: Incorrect hardware configuration change has been detected\n" regex ipr_hcam_err "^ipr: ([[:print:]]*): 9091: Incorrect hardware configuration change has been detected$" description {{ Incorrect hardware configuration change has been detected. }} action {{ Perform “MAP 3333†on page 95 of the SAS Reference Guide - http://publib.boulder.ibm.com/infocenter/powersys/v3r1m5/topic/p7ebk/p7ebk.pdf }} class: hardware sl_severity: error refcode: "" message: ipr_hcam_err "4010: Incorrect connection between cascaded expanders\n" regex ipr_hcam_err "^ipr: ([[:print:]]*): 4010: Incorrect connection between cascaded expanders$" description {{ Incorrect connection between cascaded expanders. }} action {{ Perform “MAP 3342†on page 99 of the SAS Reference Guide - http://publib.boulder.ibm.com/infocenter/powersys/v3r1m5/topic/p7ebk/p7ebk.pdf }} class: hardware sl_severity: error refcode: "" message: ipr_hcam_err "4020: Connections exceed IOA design limits\n" regex ipr_hcam_err "^ipr: ([[:print:]]*): 4020: Connections exceed IOA design limits$" description {{ Connections exceed IOA design limits. }} action {{ Perform “MAP 3343†on page 99 of the SAS Reference Guide - http://publib.boulder.ibm.com/infocenter/powersys/v3r1m5/topic/p7ebk/p7ebk.pdf }} class: unknown sl_severity: error refcode: "" message: ipr_hcam_err "4030: Incorrect multipath connection\n" regex ipr_hcam_err "^ipr: ([[:print:]]*): 4030: Incorrect multipath connection$" description {{ Incorrect multipath connection. }} action {{ Perform “MAP 3344†on page 100 of the SAS Reference Guide - http://publib.boulder.ibm.com/infocenter/powersys/v3r1m5/topic/p7ebk/p7ebk.pdf }} class: hardware sl_severity: error refcode: "" message: ipr_hcam_err "4110: Unsupported enclosure function\n" regex ipr_hcam_err "^ipr: ([[:print:]]*): 4110: Unsupported enclosure function$" description {{ Unsupported enclosure function. }} action {{ Perform “MAP 3345†on page 100 of the SAS Reference Guide - http://publib.boulder.ibm.com/infocenter/powersys/v3r1m5/topic/p7ebk/p7ebk.pdf }} class: unknown sl_severity: error refcode: "" message: ipr_hcam_err "FFF4: Command to logical unit failed\n" regex ipr_hcam_err "^ipr: ([[:print:]]*): FFF4: Command to logical unit failed$" description {{ Command to logical unit failed. }} action {{ Exchange the failing items in the Failing Items list one at a time. If the problem is not resolved, perform “MAP 3351†on page 104 of the SAS Reference Guide - http://publib.boulder.ibm.com/infocenter/powersys/v3r1m5/topic/p7ebk/p7ebk.pdf }} class: unknown sl_severity: error refcode: "" message: ipr_hcam_err "9031: Array protection temporarily suspended, protection resuming\n" regex ipr_hcam_err "^ipr: ([[:print:]]*): 9031: Array protection temporarily suspended, protection resuming$" description {{ Array protection temporarily suspended, protection resuming. }} action {{ Perform “MAP 3310†on page 91 of the SAS Reference Guide - http://publib.boulder.ibm.com/infocenter/powersys/v3r1m5/topic/p7ebk/p7ebk.pdf }} class: unknown type: info refcode: "" message: ipr_hcam_err "9040: Array protection temporarily suspended, protection resuming\n" regex ipr_hcam_err "^ipr: ([[:print:]]*): 9040: Array protection temporarily suspended, protection resuming$" description {{ Array protection temporarily suspended, protection resuming. }} action {{ No action required. The array is synching. Wait until the synch is complete. }} class: unknown type: info refcode: "" message: ipr_hcam_err "3020: IOA detected a SCSI bus configuration error\n" regex ipr_hcam_err "^ipr: ([[:print:]]*): 3020: IOA detected a SCSI bus configuration error$" description {{ IOA detected a SCSI bus configuration error. }} action {{ Perform “MAP 3350†on page 101 of the SAS Reference Guide - http://publib.boulder.ibm.com/infocenter/powersys/v3r1m5/topic/p7ebk/p7ebk.pdf }} class: unknown sl_severity: error refcode: "" message: ipr_hcam_err "4040: Incomplete multipath connection between IOA and enclosure\n" regex ipr_hcam_err "^ipr: ([[:print:]]*): 4040: Incomplete multipath connection between IOA and enclosure$" description {{ Incomplete multipath connection between IOA and enclosure. }} action {{ Perform “MAP 3344†on page 100 of the SAS Reference Guide - http://publib.boulder.ibm.com/infocenter/powersys/v3r1m5/topic/p7ebk/p7ebk.pdf }} class: unknown sl_severity: error refcode: "" message: ipr_hcam_err "4041: Incomplete multipath connection between enclosure and device\n" regex ipr_hcam_err "^ipr: ([[:print:]]*): 4041: Incomplete multipath connection between enclosure and device$" description {{ Incomplete multipath connection between enclosure and device. }} action {{ Perform “MAP 3346†on page 100 of the SAS Reference Guide - http://publib.boulder.ibm.com/infocenter/powersys/v3r1m5/topic/p7ebk/p7ebk.pdf }} class: unknown sl_severity: error refcode: "" message: ipr_hcam_err "9075: Incomplete multipath connection between IOA and remote IOA\n" regex ipr_hcam_err "^ipr: ([[:print:]]*): 9075: Incomplete multipath connection between IOA and remote IOA$" description {{ Incomplete multipath connection between IOA and remote IOA. }} action {{ Perform “MAP 3349†on page 101 of the SAS Reference Guide - http://publib.boulder.ibm.com/infocenter/powersys/v3r1m5/topic/p7ebk/p7ebk.pdf }} class: unknown sl_severity: error refcode: "" message: ipr_hcam_err "4050: Enclosure does not support a required multipath function\n" regex ipr_hcam_err "^ipr: ([[:print:]]*): 4050: Enclosure does not support a required multipath function$" description {{ Enclosure does not support a required multipath function. }} action {{ Perform “MAP 3348†on page 101 of the SAS Reference Guide - http://publib.boulder.ibm.com/infocenter/powersys/v3r1m5/topic/p7ebk/p7ebk.pdf }} class: unknown sl_severity: error refcode: "" message: ipr_hcam_err "9041: Array protection temporarily suspended\n" regex ipr_hcam_err "^ipr: ([[:print:]]*): 9041: Array protection temporarily suspended$" description {{ Array protection temporarily suspended. }} action {{ Background array parity checking detected and errors corrected. Perform “MAP 3390†on page 106 of the SAS Reference Guide - http://publib.boulder.ibm.com/infocenter/powersys/v3r1m5/topic/p7ebk/p7ebk.pdf }} class: unknown sl_severity: warning refcode: "" message: ipr_hcam_err "9042: Corrupt array parity detected on specified device\n" regex ipr_hcam_err "^ipr: ([[:print:]]*): 9042: Corrupt array parity detected on specified device$" description {{ Corrupt array parity detected on specified device. }} action {{ Perform “MAP 3390†on page 106 of the SAS Reference Guide - http://publib.boulder.ibm.com/infocenter/powersys/v3r1m5/topic/p7ebk/p7ebk.pdf }} class: unknown sl_severity: error refcode: "" message: ipr_hcam_err "9030: Array no longer protected due to missing or failed disk unit\n" regex ipr_hcam_err "^ipr: ([[:print:]]*): 9030: Array no longer protected due to missing or failed disk unit$" description {{ Array no longer protected due to missing or failed disk unit. }} action {{ Perform “MAP 3310†on page 91 of the SAS Reference Guide - http://publib.boulder.ibm.com/infocenter/powersys/v3r1m5/topic/p7ebk/p7ebk.pdf }} class: unknown sl_severity: error refcode: "" message: ipr_hcam_err "9032: Array exposed but still protected\n" regex ipr_hcam_err "^ipr: ([[:print:]]*): 9032: Array exposed but still protected$" description {{ Array exposed but still protected. }} action {{ Perform “MAP 3310†on page 91 of the SAS Reference Guide - http://publib.boulder.ibm.com/infocenter/powersys/v3r1m5/topic/p7ebk/p7ebk.pdf }} class: unknown sl_severity: error refcode: "" message: ipr_hcam_err "4061: Multipath redundancy level got better\n" regex ipr_hcam_err "^ipr: ([[:print:]]*): 4061: Multipath redundancy level got better$" description {{ Multipath redundancy level got better. }} action {{ None required }} class: unknown type: info refcode: "" message: ipr_hcam_err "4060: Multipath redundancy level got worse\n" regex ipr_hcam_err "^ipr: ([[:print:]]*): 4060: Multipath redundancy level got worse$" description {{ Multipath redundancy level got worse. }} action {{ Perform “MAP 3353†on page 106 of the SAS Reference Guide - http://publib.boulder.ibm.com/infocenter/powersys/v3r1m5/topic/p7ebk/p7ebk.pdf }} class: unknown sl_severity: error refcode: "" message: ipr_hcam_err "9008: IOA does not support functions expected by devices\n" regex ipr_hcam_err "^ipr: ([[:print:]]*): 9008: IOA does not support functions expected by devices$" description {{ IOA does not support functions expected by devices. }} action {{ Perform “MAP 3330†on page 94 of the SAS Reference Guide - http://publib.boulder.ibm.com/infocenter/powersys/v3r1m5/topic/p7ebk/p7ebk.pdf }} class: unknown sl_severity: warning refcode: "" message: ipr_hcam_err "9020: Array missing 2 or more devices with only 1 device present\n" regex ipr_hcam_err "^ipr: ([[:print:]]*): 9020: Array missing 2 or more devices with only 1 device present$" description {{ Array missing 2 or more devices with only 1 device present. }} action {{ Perform “MAP 3311†on page 92 of the SAS Reference Guide - http://publib.boulder.ibm.com/infocenter/powersys/v3r1m5/topic/p7ebk/p7ebk.pdf }} class: hardware sl_severity: error refcode: "" message: ipr_hcam_err "9021: Array missing 2 or more devices with 2 or more devices present\n" regex ipr_hcam_err "^ipr: ([[:print:]]*): 9021: Array missing 2 or more devices with 2 or more devices present$" description {{ Array missing 2 or more devices with 2 or more devices present. }} action {{ Perform “MAP 3311†on page 92 of the SAS Reference Guide - http://publib.boulder.ibm.com/infocenter/powersys/v3r1m5/topic/p7ebk/p7ebk.pdf }} class: hardware sl_severity: error refcode: "" message: ipr_hcam_err "9022: Exposed array is missing a required device\n" regex ipr_hcam_err "^ipr: ([[:print:]]*): 9022: Exposed array is missing a required device$" description {{ Exposed array is missing a required device. }} action {{ Perform “MAP 3311†on page 92 of the SAS Reference Guide - http://publib.boulder.ibm.com/infocenter/powersys/v3r1m5/topic/p7ebk/p7ebk.pdf }} class: hardware sl_severity: error refcode: "" message: ipr_hcam_err "9023: Array member(s) not at required physical locations\n" regex ipr_hcam_err "^ipr: ([[:print:]]*): 9023: Array member\\(s\\) not at required physical locations$" description {{ Array member(s) not at required physical locations. }} action {{ Perform “MAP 3312†on page 93 of the SAS Reference Guide - http://publib.boulder.ibm.com/infocenter/powersys/v3r1m5/topic/p7ebk/p7ebk.pdf }} class: hardware sl_severity: error refcode: "" message: ipr_hcam_err "9024: Array not functional due to present hardware configuration\n" regex ipr_hcam_err "^ipr: ([[:print:]]*): 9024: Array not functional due to present hardware configuration$" description {{ Array not functional due to present hardware configuration. }} action {{ Perform “MAP 3390†on page 106 of the SAS Reference Guide - http://publib.boulder.ibm.com/infocenter/powersys/v3r1m5/topic/p7ebk/p7ebk.pdf }} class: hardware sl_severity: error refcode: "" message: ipr_hcam_err "9054: IOA resources not available due to previous problems\n" regex ipr_hcam_err "^ipr: ([[:print:]]*): 9054: IOA resources not available due to previous problems$" description {{ IOA resources not available due to previous problems. }} action {{ Perform “MAP 3321†on page 94 of the SAS Reference Guide - http://publib.boulder.ibm.com/infocenter/powersys/v3r1m5/topic/p7ebk/p7ebk.pdf }} class: unknown sl_severity: error refcode: "" message: ipr_hcam_err "9092: Disk unit requires initialization before use\n" regex ipr_hcam_err "^ipr: ([[:print:]]*): 9092: Disk unit requires initialization before use$" description {{ Disk unit requires initialization before use. }} action {{ Perform “MAP 3334†on page 96 of the SAS Reference Guide - http://publib.boulder.ibm.com/infocenter/powersys/v3r1m5/topic/p7ebk/p7ebk.pdf }} class: unknown sl_severity: error refcode: "" message: ipr_hcam_err "9029: Incorrect hardware configuration change has been detected\n" regex ipr_hcam_err "^ipr: ([[:print:]]*): 9029: Incorrect hardware configuration change has been detected$" description {{ Incorrect hardware configuration change has been detected. }} action {{ Perform “MAP 3390†on page 106 of the SAS Reference Guide - http://publib.boulder.ibm.com/infocenter/powersys/v3r1m5/topic/p7ebk/p7ebk.pdf }} class: hardware sl_severity: error refcode: "" message: ipr_hcam_err "9060: One or more disk pairs are missing from an array\n" regex ipr_hcam_err "^ipr: ([[:print:]]*): 9060: One or more disk pairs are missing from an array$" description {{ One or more disk pairs are missing from an array. }} action {{ Perform “MAP 3311†on page 92 of the SAS Reference Guide - http://publib.boulder.ibm.com/infocenter/powersys/v3r1m5/topic/p7ebk/p7ebk.pdf }} class: hardware sl_severity: error refcode: "" message: ipr_hcam_err "9061: One or more disks are missing from an array\n" regex ipr_hcam_err "^ipr: ([[:print:]]*): 9061: One or more disks are missing from an array$" description {{ One or more disks are missing from an array. }} action {{ Perform “MAP 3311†on page 92 of the SAS Reference Guide - http://publib.boulder.ibm.com/infocenter/powersys/v3r1m5/topic/p7ebk/p7ebk.pdf }} class: hardware sl_severity: error refcode: "" message: ipr_hcam_err "9062: One or more disks are missing from an array\n" regex ipr_hcam_err "^ipr: ([[:print:]]*): 9062: One or more disks are missing from an array$" description {{ One or more disks are missing from an array. }} action {{ Perform “MAP 3311†on page 92 of the SAS Reference Guide - http://publib.boulder.ibm.com/infocenter/powersys/v3r1m5/topic/p7ebk/p7ebk.pdf }} class: hardware sl_severity: error refcode: "" message: ipr_hcam_err "9063: Maximum number of functional arrays has been exceeded\n" regex ipr_hcam_err "^ipr: ([[:print:]]*): 9063: Maximum number of functional arrays has been exceeded$" description {{ Maximum number of functional arrays has been exceeded. }} action {{ Perform “MAP 3390†on page 106 of the SAS Reference Guide - http://publib.boulder.ibm.com/infocenter/powersys/v3r1m5/topic/p7ebk/p7ebk.pdf }} class: hardware sl_severity: error refcode: "" ppc64-diag-2.6.4/ela/message_catalog/with_regex/gpfs0000755000000000000000000000465612313010662020775 0ustar rootrootsubsystem: gpfs message: mmfs_failed "\n" regex mmfs_failed "^mmfs: Error=MMFS_PDISK_FAILED, ID=([[:print:]]*), Tag=([[:print:]]*):([[:print:]]*): Location=([[:print:]]*), FRU=([[:print:]]*), WWID=([[:print:]]*), RecoveryGroup=([[:print:]]*), DeclusteredArray=([[:print:]]*), Pdisk=([[:print:]]*), PdiskState=([[:print:]]*)$" description {{ A disk has failed or is not responding. The filesystem is still operational. }} action {{ Ignore }} class: software sl_severity: warning refcode: "" message: mmfs_pathfail "\n" regex mmfs_pathfail "^mmfs: Error=([[:print:]]*), ID=([[:print:]]*), Tag=([[:print:]]*):([[:print:]]*): Location=([[:print:]]*), FRU=([[:print:]]*), WWID=([[:print:]]*), RecoveryGroup=([[:print:]]*), ([[:print:]]*)=([[:print:]]*), Pdisk=([[:print:]]*), Device=([[:print:]]*)$" description {{ A path to a disk is no longer usable. Probable cause: SAS adapter, cable, port expander or disk carrier. }} action {{ Ignore }} class: software sl_severity: warning refcode: "" message: mmfs_recovered "\n" regex mmfs_recovered "^mmfs: Error=MMFS_PDISK_RECOVERED, ID=([[:print:]]*), Tag=([[:print:]]*):([[:print:]]*): Location=([[:print:]]*), FRU=([[:print:]]*), WWID=([[:print:]]*), RecoveryGroup=([[:print:]]*), DeclusteredArray=([[:print:]]*), Pdisk=([[:print:]]*)$" description {{ A disk previously reported as not responding has been found and is working. }} action {{ Ignore }} class: software sl_severity: warning refcode: "" message: mmfs_replace "\n" regex mmfs_replace "^mmfs: Error=MMFS_REPLACE_PDISK, ID=([[:print:]]*), Tag=([[:print:]]*):([[:print:]]*): Location=([[:print:]]*), FRU=([[:print:]]*), WWID=([[:print:]]*), RecoveryGroup=([[:print:]]*), DeclusteredArray=([[:print:]]*), Pdisk=([[:print:]]*), Priority=([[:print:]]*), PdiskState=([[:print:]]*)$" description {{ The disk replacement threshold has been met for the given failed disk. The disk must be replaced. }} action {{ Notify administrator. }} class: software sl_severity: error refcode: "EF000001" message: mmfs_rebuild "\n" regex mmfs_rebuild "^mmfs: Error=MMFS_REBUILD_FAILED, ID=([[:print:]]*), Tag=([[:print:]]*):([[:print:]]*): RecoveryGroup=([[:print:]]*), DeclusteredArray=([[:print:]]*), RemainingRedundancy=([[:print:]]*)$" description {{ There is not enough available spare space to reestablish full redundancy in a declustered array. Customer may be in danger of data loss. }} action {{ Notify administrator. }} class: software sl_severity: error refcode: "EF000002" ppc64-diag-2.6.4/ela/message_catalog/with_regex/lpfc0000644000000000000000000051752412313010662020762 0ustar rootrootsubsystem:net message: lpfc_printf_log KERN_WARNING "Abort outstanding I/O on NPort x%x\n" regex lpfc_printf_log "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):([-]\?[0-9]{1,}) Abort outstanding I/O on NPort x([0-9a-f]{1,})$" description {{ All outstanding I/Os are cleaned up on the specified remote NPort. DATA: (1) nlp_flag (2) nlp_state (3) nlp_rpi }} action {{ No action needed, informational. }} class: software type: info refcode: "" message: lpfc_printf_log KERN_WARNING "Active Mailbox cleared - mailbox timeout exiting\n" regex lpfc_printf_log "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):([-]\?[0-9]{1,}) Active Mailbox cleared - mailbox timeout exiting$" description {{ The mailbox timeout handler has determined that the driver is in the process of completing this mailbox command. }} action {{ No action needed, informational. }} class: software type: info refcode: "" message: lpfc_printf_log KERN_ERR "Adapter failed init, mbxCmd x%x READ_SPARM mbxStatus x%x\n" regex lpfc_printf_log "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):([-]\?[0-9]{1,}) Adapter failed init, mbxCmd x([0-9a-f]{1,}) READ_SPARM mbxStatus x([0-9a-f]{1,})$" description {{ Adapter initialization failed when issuing a READ_SPARM mailbox command. }} action {{ This error could indicate a hardware or firmware problem. If the problem persists, report the error to Technical Support. }} class: unknown sl_severity: error refcode: "" message: lpfc_printf_log KERN_ERR "Adapter failed to get Option ROM version status x%x\n" regex lpfc_printf_log "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):([-]\?[0-9]{1,}) Adapter failed to get Option ROM version status x([0-9a-f]{1,})$" description {{ The driver could not read the HBA’s option ROM. }} action {{ Reset the HBA. Ensure the adapter’s firmware is current. }} class: unknown sl_severity: error refcode: "" message: lpfc_printf_log KERN_ERR "Adapter failed to init, chipset, status reg x%x, FW Data: A8 x%x AC x%x\n" regex lpfc_printf_log "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):([-]\?[0-9]{1,}) Adapter failed to init, chipset, status reg x([0-9a-f]{1,}), FW Data: A8 x([0-9a-f]{1,}) AC x([0-9a-f]{1,})$" description {{ The adapter failed during powerup diagnostics after it was reset. }} action {{ This error could indicate a hardware or firmware problem.If the problem persists, report the error to Technical Support. }} class: unknown sl_severity: error refcode: "" message: lpfc_printf_log KERN_ERR "Adapter failed to init. Data: x%x x%x x%x\n" regex lpfc_printf_log "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):([-]\?[0-9]{1,}) Adapter failed to init\\. Data: x([0-9a-f]{1,}) x([0-9a-f]{1,}) x([0-9a-f]{1,})$" description {{ An error occurred when processing queue related tags for an HBA in a particular slot. DATA: (1) mbxCommand (2) mbxStatus (3) hbaqno }} action {{ Software driver error. If this problem persists, report these errors to Technical Support. }} class: unknown sl_severity: error refcode: "" message: lpfc_printf_log KERN_ERR "Adapter failed to init, mbxCmd x%x CONFIG_PORT, mbxStatus x%x Data: x%x\n" regex lpfc_printf_log "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):([-]\?[0-9]{1,}) Adapter failed to init, mbxCmd x([0-9a-f]{1,}) CONFIG_PORT, mbxStatus x([0-9a-f]{1,}) Data: x([0-9a-f]{1,})$" description {{ Adapter initialization failed when issuing a CONFIG_PORT mailbox command. DATA: (1) hbainit }} action {{ This error could indicate a hardware or firmware problem. Update the firmware. If the problem persists, report the error to Technical Support. }} class: unknown sl_severity: error refcode: "" message: lpfc_printf_log KERN_ERR "Adapter failed to init, mbxCmd x%x INIT_LINK, mbxStatus x%x\n" regex lpfc_printf_log "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):([-]\?[0-9]{1,}) Adapter failed to init, mbxCmd x([0-9a-f]{1,}) INIT_LINK, mbxStatus x([0-9a-f]{1,})$" description {{ Adapter initialization failed when issuing an INIT_LINK mailbox command. }} action {{ This error could indicate a hardware or firmware problem. Update the firmware.If the problem persists,report the error to Technical Support. }} class: unknown sl_severity: error refcode: "" message: lpfc_printf_log KERN_ERR "Adapter failed to init, mbxCmd x%x READ_CONFIG, mbxStatus x%x\n" regex lpfc_printf_log "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):([-]\?[0-9]{1,}) Adapter failed to init, mbxCmd x([0-9a-f]{1,}) READ_CONFIG, mbxStatus x([0-9a-f]{1,})$" description {{ Adapter initialization failed when issuing a READ_CONFIG mailbox command. }} action {{ This error could indicate a hardware or firmware problem. Update the firmware.If the problem persists,report the error to Technical Support. }} class: unknown sl_severity: error refcode: "" message: lpfc_printf_log KERN_ERR "Adapter failed to init, mbxCmd x%x READ_REV, mbxStatus x%x\n" regex lpfc_printf_log "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):([-]\?[0-9]{1,}) Adapter failed to init, mbxCmd x([0-9a-f]{1,}) READ_REV, mbxStatus x([0-9a-f]{1,})$" description {{ Adapter initialization failed when issuing a READ_REV mailbox command. }} action {{ This error could indicate a hardware or firmware problem. Update the firmware.If the problem persists,report the error to Technical Support. }} class: unknown sl_severity: error refcode: "" message: lpfc_printf_log KERN_ERR "Adapter failed to init, READ_REV has missing revision information.\n" regex lpfc_printf_log "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):([-]\?[0-9]{1,}) Adapter failed to init, READ_REV has missing revision information\\.$" description {{ A firmware revision initialization error was detected. }} action {{ This error could indicate a hardware or firmware problem. Update the firmware.If the problem persists,report the error to Technical Support. }} class: unknown sl_severity: error refcode: "" message: lpfc_printf_log KERN_ERR "Adapter failed to init, timeout, status reg x%x, FW Data: A8 x%x AC x%x\n" regex lpfc_printf_log "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):([-]\?[0-9]{1,}) Adapter failed to init, timeout, status reg x([0-9a-f]{1,}), FW Data: A8 x([0-9a-f]{1,}) AC x([0-9a-f]{1,})$" description {{ The adapter failed during powerup diagnostics after it was reset. }} action {{ This error could indicate a hardware or firmware problem.If the problem persists, report the error to Technical Support. }} class: unknown sl_severity: error refcode: "" message: lpfc_printf_log KERN_ERR "Adapter failed to issue ASYNCEVT_ENABLE mbox status x%x\n" regex lpfc_printf_log "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):([-]\?[0-9]{1,}) Adapter failed to issue ASYNCEVT_ENABLE mbox status x([0-9a-f]{1,})$" description {{ The mailbox command to enable an asynchronous event notification failed. }} action {{ Ensure the adapter firmware is current. Reload the driver. }} class: firmware sl_severity: error refcode: "" message: lpfc_printf_log KERN_ERR "Adapter failed to issue DOWN_LINK mbox command rc 0x%x\n" regex lpfc_printf_log "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):([-]\?[0-9]{1,}) Adapter failed to issue DOWN_LINK mbox command rc 0x([0-9a-f]{1,})$" description {{ The driver was unable to issue the Down Link Mailbox command. }} action {{ None required }} class: software sl_severity: warning refcode: "" message: lpfc_printf_log KERN_ERR "Adapter Hardware Error Data: x%x x%x x%x\n" regex lpfc_printf_log "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):([-]\?[0-9]{1,}) Adapter Hardware Error Data: x([0-9a-f]{1,}) x([0-9a-f]{1,}) x([0-9a-f]{1,})$" description {{ The driver received an interrupt indicating a possible hardware problem. Data: (1) status (2) status1 (3) status2 }} action {{ This error could indicate a hardware or firmware problem. If the problem persists, report the error to Technical Support. }} class: unknown sl_severity: error refcode: "" message: lpfc_printf_log KERN_ERR "Adapter heartbeat failure, taking this port offline.\n" regex lpfc_printf_log "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):([-]\?[0-9]{1,}) Adapter heartbeat failure, taking this port offline\\.$" description {{ The Heartbeat mailbox command failed. }} action {{ Ensure the adapter firmware is current. Reload the driver. }} class: firmware sl_severity: error refcode: "" message: lpfc_printf_log KERN_ERR "Adapter is very hot, please take corrective action. temperature : %d Celsius\n" regex lpfc_printf_log "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):([-]\?[0-9]{1,}) Adapter is very hot, please take corrective action\\. temperature : ([-]\?[0-9]{1,}) Celsius$" description {{ Adapter temperature is above normal range. DATA: Temperature in Celsius }} action {{ Shutdown and remove the HBA. Contact Technical Support. }} class: hardware sl_severity: error refcode: "" message: lpfc_printf_log KERN_ERR "Adapter Link is disabled.\n" regex lpfc_printf_log "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):([-]\?[0-9]{1,}) Adapter Link is disabled\\.$" description {{ The adapterl link has been disabled. }} action {{ None required }} class: unknown sl_severity: warning refcode: "" message: lpfc_printf_log KERN_INFO "Adapter temperature is OK now. temperature : %d Celsius\n" regex lpfc_printf_log "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):([-]\?[0-9]{1,}) Adapter temperature is OK now\\. temperature : ([-]\?[0-9]{1,}) Celsius$" description {{ Adapter temperature has reverted to normal range. DATA: Temperature in Celsius }} action {{ No action needed, informational. }} class: hardware type: info refcode: "" message: lpfc_printf_log KERN_ERR "ADD_FCF_RECORD mailbox failed with status 0x%x\n" regex lpfc_printf_log "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):([-]\?[0-9]{1,}) ADD_FCF_RECORD mailbox failed with status 0x([0-9a-f]{1,})$" description {{ The mailbox command to add the FCF record has failed. }} action {{ None required }} class: software sl_severity: warning refcode: "" message: lpfc_printf_log KERN_ERR "ADD_FCF_RECORD mailbox failed with status x%x add_status x%x\n" regex lpfc_printf_log "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):([-]\?[0-9]{1,}) ADD_FCF_RECORD mailbox failed with status x([0-9a-f]{1,}) add_status x([0-9a-f]{1,})$" description {{ The mailbox command to add the FCF record has failed. }} action {{ None required }} class: software sl_severity: warning refcode: "" message: lpfc_printf_log KERN_ERR "Bad hbq tag. Data: x%x x%x\n" regex lpfc_printf_log "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):([-]\?[0-9]{1,}) Bad hbq tag\\. Data: x([0-9a-f]{1,}) x([0-9a-f]{1,})$" description {{ An error occurred when processing queue related tags for an HBA in a particular slot. DATA: (1) tag (2) buffer_count }} action {{ Software driver error. If this problem persists, report these errors to Technical Support. }} class: software sl_severity: error refcode: "" message: lpfc_printf_log KERN_WARNING "Block sgl registration required DMA size (%d) great than a page\n" regex lpfc_printf_log "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):([-]\?[0-9]{1,}) Block sgl registration required DMA size \\(([-]\?[0-9]{1,})\\) great than a page$" description {{ The request to post SGL pages does not fit on a page. }} action {{ No action needed, informational. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_log KERN_INFO "Bring Adapter offline\n" regex lpfc_printf_log "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):([-]\?[0-9]{1,}) Bring Adapter offline$" description {{ The FC driver has received a request to bring the adapter offline. This may occur when running lputil. }} action {{ No action needed, informational. }} class: software type: info refcode: "" message: lpfc_printf_log KERN_INFO "Bring Adapter online\n" regex lpfc_printf_log "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):([-]\?[0-9]{1,}) Bring Adapter online$" description {{ The FC driver has received a request to bring the adapter online. This may occur when running lputil. }} action {{ No action needed, informational. }} class: software type: info refcode: "" message: lpfc_printf_log KERN_ERR "Cannot find virtual addr for buffer tag on ring %d Data x%lx x%p x%p x%x\n" regex lpfc_printf_log "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):([-]\?[0-9]{1,}) Cannot find virtual addr for buffer tag on ring ([-]\?[0-9]{1,}) Data x([0-9a-f]{1,}) x(\\(null\\)|([0]{0,7}[0-9a-f]{1,})) x(\\(null\\)|([0]{0,7}[0-9a-f]{1,})) x([0-9a-f]{1,})$" description {{ DMA buffer is not available for this unsolicited command. DATA: (1) tag (2) next (3) prev (4) postbufq_cnt }} action {{ None required. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_log KERN_ERR "Cannot find virtual addr for mapped buf on ring %d Data x%llx x%p x%p x%x\n" regex lpfc_printf_log "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):([-]\?[0-9]{1,}) Cannot find virtual addr for mapped buf on ring ([-]\?[0-9]{1,}) Data x([0-9a-f]{1,}) x(\\(null\\)|([0]{0,7}[0-9a-f]{1,})) x(\\(null\\)|([0]{0,7}[0-9a-f]{1,})) x([0-9a-f]{1,})$" description {{ The driver cannot find the specified buffer in its mapping table. Thus it cannot find the virtual address needed to access the data. DATA: (1) phys (2) next (3) prev (4) postbufq_cnt }} action {{ This error could indicate a software driver or firmware problem. If the problem persists report these errors to Technical Support. }} class: software sl_severity: error refcode: "" message: lpfc_printf_log KERN_ERR "Cannot re-enable interrupt after slot reset.\n" regex lpfc_printf_log "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):([-]\?[0-9]{1,}) Cannot re-enable interrupt after slot reset\\.$" description {{ The driver was not able to enable the interrupt after an HBA reset. }} action {{ Unload and reload the driver. }} class: software sl_severity: error refcode: "" message: lpfc_printf_log KERN_ERR "Clear Virtual Link Received for VPI 0x%x tag 0x%x\n" regex lpfc_printf_log "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):([-]\?[0-9]{1,}) Clear Virtual Link Received for VPI 0x([0-9a-f]{1,}) tag 0x([0-9a-f]{1,})$" description {{ A Clear virtual link was received from the Fabric for this VPI. }} action {{ None required. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_log KERN_WARNING "Config MSI mailbox command failed, mbxCmd x%x, mbxStatus x%x\n" regex lpfc_printf_log "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):([-]\?[0-9]{1,}) Config MSI mailbox command failed, mbxCmd x([0-9a-f]{1,}), mbxStatus x([0-9a-f]{1,})$" description {{ The mailbox command sent to the firmware to configure the HBA to use MSI-X has failed. }} action {{ Ensure the hardware platform supports MSI-X. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_log KERN_ERR "Config Port initialization error, mbxCmd x%x READ_NVPARM, mbxStatus x%x\n" regex lpfc_printf_log "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):([-]\?[0-9]{1,}) Config Port initialization error, mbxCmd x([0-9a-f]{1,}) READ_NVPARM, mbxStatus x([0-9a-f]{1,})$" description {{ A read nvparams mailbox command failed during port configuration. }} action {{ This error could indicate a software driver, firmware or hardware problem. Report these errors to Technical Support. }} class: unknown sl_severity: error refcode: "" message: lpfc_printf_log KERN_ERR "Config region 23 has bad signature\n" regex lpfc_printf_log "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):([-]\?[0-9]{1,}) Config region 23 has bad signature$" description {{ Configuration region 23 has an invalid signature. }} action {{ None required. }} class: unknown sl_severity: warning refcode: "" message: lpfc_printf_log KERN_ERR "Config region 23 has bad version\n" regex lpfc_printf_log "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):([-]\?[0-9]{1,}) Config region 23 has bad version$" description {{ The driver was unable to read Config Region 23 because it is an invalid version. }} action {{ None required. }} class: unknown sl_severity: warning refcode: "" message: lpfc_printf_log KERN_ERR "Could not manually add FCF record 0, status %d\n" regex lpfc_printf_log "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):([-]\?[0-9]{1,}) Could not manually add FCF record 0, status ([-]\?[0-9]{1,})$" description {{ Could not add FCF record to the FCF list. }} action {{ None required. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_log KERN_ERR "CQ_CREATE mailbox failed with status x%x add_status x%x, mbx status x%x\n" regex lpfc_printf_log "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):([-]\?[0-9]{1,}) CQ_CREATE mailbox failed with status x([0-9a-f]{1,}) add_status x([0-9a-f]{1,}), mbx status x([0-9a-f]{1,})$" description {{ The mailbox command sent to create the completion queue has failed. }} action {{ None required. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_log KERN_ERR "CQ_DESTROY mailbox failed with status x%x add_status x%x, mbx status x%x\n" regex lpfc_printf_log "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):([-]\?[0-9]{1,}) CQ_DESTROY mailbox failed with status x([0-9a-f]{1,}) add_status x([0-9a-f]{1,}), mbx status x([0-9a-f]{1,})$" description {{ The mailbox command sent to delete the completion queue has failed. }} action {{ None required. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_log KERN_ERR "Create VPORT failed: Cannot get instance number\n" regex lpfc_printf_log "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):([-]\?[0-9]{1,}) Create VPORT failed: Cannot get instance number$" description {{ The driver failed to allocate resources for an adapter and could not assign an instance number. }} action {{ Software driver error. If this problem persists, report these errors to Technical Support. }} class: software sl_severity: error refcode: "" message: lpfc_printf_log KERN_ERR "Create VPORT failed: Max VPORTs (%d) exceeded\n" regex lpfc_printf_log "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):([-]\?[0-9]{1,}) Create VPORT failed: Max VPORTs \\(([-]\?[0-9]{1,})\\) exceeded$" description {{ The driver failed to create a port because the maximum number of port supported by the driver will be exceeded. DATA: (1) max_vpi }} action {{ No Action. The driver can not create any more VPorts. }} class: software sl_severity: error refcode: "" message: lpfc_printf_log KERN_ERR "Create VPORT failed: NPIV is not enabled: SLImode:%d\n" regex lpfc_printf_log "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):([-]\?[0-9]{1,}) Create VPORT failed: NPIV is not enabled: SLImode:([-]\?[0-9]{1,})$" description {{ The driver failed to create a port because the HBA was in wrong mode or was not capable of NPIV. DATA: (1) sli_rev }} action {{ Load the driver with npiv enabled on an HBA that supports SLI-3. }} class: software sl_severity: error refcode: "" message: lpfc_printf_log KERN_ERR "Create VPORT failed: vpi x%x\n" regex lpfc_printf_log "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):([-]\?[0-9]{1,}) Create VPORT failed: vpi x([0-9a-f]{1,})$" description {{ The driver failed to create a port and had to eliminate all its resources. DATA: (1) vpi }} action {{ Software driver error. If this problem persists, report these errors to Technical Support. }} class: software sl_severity: error refcode: "" message: lpfc_printf_log KERN_ERR "CT command failed to delete objects on fabric\n" regex lpfc_printf_log "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):([-]\?[0-9]{1,}) CT command failed to delete objects on fabric$" description {{ A command issued to the fabric to delete an associated resource for an object such as for a port, failed. }} action {{ Software driver error. If this problem persists, report these errors to Technical Support. }} class: software sl_severity: error refcode: "" message: lpfc_printf_log KERN_ERR "Deferred Adapter Hardware Error Data: x%x x%x x%x\n" regex lpfc_printf_log "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):([-]\?[0-9]{1,}) Deferred Adapter Hardware Error Data: x([0-9a-f]{1,}) x([0-9a-f]{1,}) x([0-9a-f]{1,})$" description {{ An adapter hardware error was sent to the driver. DATA: (1) work_hs, (2) work_status[0], (3) work_status[1] }} action {{ Perform a dump using hbacmd. }} class: hardware sl_severity: error refcode: "" message: lpfc_printf_log KERN_ERR "DEL FCF of default FCF Index failed mbx status x%x, status x%x add_status x%x\n" regex lpfc_printf_log "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):([-]\?[0-9]{1,}) DEL FCF of default FCF Index failed mbx status x([0-9a-f]{1,}), status x([0-9a-f]{1,}) add_status x([0-9a-f]{1,})$" description {{ The mailbox command to delete the FCF record has failed. }} action {{ None required. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_log KERN_ERR "Dropped frame rctl:%s type:%s\n" regex lpfc_printf_log "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):([-]\?[0-9]{1,}) Dropped frame rctl:([[:print:]]*) type:([[:print:]]*)$" description {{ An unsupported frame was received by the port and dropped. DATA: (1) rctl_names[fc_hdr->fh_r_ctl], (2) type_names[fc_hdr->fh_type] }} action {{ None required. }} class: software sl_severity: error refcode: "" message: lpfc_printf_log KERN_INFO "ELS complete with no corresponding cmdiocb: iotag (%d)\n" regex lpfc_printf_log "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):([-]\?[0-9]{1,}) ELS complete with no corresponding cmdiocb: iotag \\(([-]\?[0-9]{1,})\\)$" description {{ The completion that the ISR is handling cannot find a tag associated with the IOTAG }} action {{ No action needed, informational. }} class: software type: info refcode: "" message: lpfc_printf_log KERN_ERR "EQ_CREATE mailbox failed with status x%x add_status x%x, mbx status x%x\n" regex lpfc_printf_log "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):([-]\?[0-9]{1,}) EQ_CREATE mailbox failed with status x([0-9a-f]{1,}) add_status x([0-9a-f]{1,}), mbx status x([0-9a-f]{1,})$" description {{ The mailbox command sent to create the event queue has failed. }} action {{ None required. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_log KERN_ERR "EQ_DESTROY mailbox failed with status x%x add_status x%x, mbx status x%x\n" regex lpfc_printf_log "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):([-]\?[0-9]{1,}) EQ_DESTROY mailbox failed with status x([0-9a-f]{1,}) add_status x([0-9a-f]{1,}), mbx status x([0-9a-f]{1,})$" description {{ The mailbox command sent to delete the event queue has failed. }} action {{ None required. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_log KERN_ERR "Error Could not grow rpi count\n" regex lpfc_printf_log "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):([-]\?[0-9]{1,}) Error Could not grow rpi count$" description {{ An error occurred because the RPI count could not be increased. }} action {{ None required. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_log KERN_ERR "Error %d during queue setup.\n" regex lpfc_printf_log "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):([-]\?[0-9]{1,}) Error ([-]\?[0-9]{1,}) during queue setup\\.$" description {{ Could not set up all the queues that driver requires to exchange IOs with the HBA. }} action {{ Reload the driver. }} class: software sl_severity: error refcode: "" message: lpfc_printf_log KERN_ERR "Error %d during rpi post operation\n" regex lpfc_printf_log "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):([-]\?[0-9]{1,}) Error ([-]\?[0-9]{1,}) during rpi post operation$" description {{ The driver was trying to post pages to the firmware to keep target login information and encountered a failure. }} action {{ Unload and reload the driver. }} class: software sl_severity: error refcode: "" message: lpfc_printf_log KERN_WARNING "Error %d during scsi sgl post operation\n" regex lpfc_printf_log "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):([-]\?[0-9]{1,}) Error ([-]\?[0-9]{1,}) during scsi sgl post operation$" description {{ The SGL entries could not be registered with the HBA. }} action {{ Reset the HBA using hbacmd. }} class: hardware sl_severity: warning refcode: "" message: lpfc_printf_log KERN_ERR "Error %d during sgl post operation\n" regex lpfc_printf_log "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):([-]\?[0-9]{1,}) Error ([-]\?[0-9]{1,}) during sgl post operation$" description {{ The SGL post operation failed. }} action {{ None required. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_log KERN_ERR "Error %d parsing vpd. Using defaults.\n" regex lpfc_printf_log "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):([-]\?[0-9]{1,}) Error ([-]\?[0-9]{1,}) parsing vpd\\. Using defaults\\.$" description {{ Could not parse the VPD data, so the driver is using the default values. }} action {{ None required. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_log KERN_ERR "Error %d posting all rpi headers\n" regex lpfc_printf_log "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):([-]\?[0-9]{1,}) Error ([-]\?[0-9]{1,}) posting all rpi headers$" description {{ The RPI headers could not be posted to the firmware. }} action {{ None required. }} class: firmware sl_severity: warning refcode: "" message: lpfc_printf_log KERN_ERR "Error during rpi post operation\n" regex lpfc_printf_log "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):([-]\?[0-9]{1,}) Error during rpi post operation$" description {{ The driver was trying to post pages to the firmware to be used to keep target login information and encountered a failure. }} action {{ Unload and reload the driver. }} class: firmware sl_severity: error refcode: "" message: lpfc_printf_log KERN_ERR "Failed allocate fast-path FCP CQ (%d)\n" regex lpfc_printf_log "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):([-]\?[0-9]{1,}) Failed allocate fast-path FCP CQ \\(([-]\?[0-9]{1,})\\)$" description {{ The completion queue event for the fast path could not be allocated. }} action {{ Unload and reload the driver. }} class: unknown sl_severity: error refcode: "" message: lpfc_printf_log KERN_ERR "Failed allocate memory for fast-path CQ record array\n" regex lpfc_printf_log "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):([-]\?[0-9]{1,}) Failed allocate memory for fast-path CQ record array$" description {{ Failed to allocate memory for the fast-path EQ record array. }} action {{ None required. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_log KERN_ERR "Failed allocate memory for fast-path EQ record array\n" regex lpfc_printf_log "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):([-]\?[0-9]{1,}) Failed allocate memory for fast-path EQ record array$" description {{ Failed to allocate memory for the fast-path EQ record array. }} action {{ None required. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_log KERN_ERR "Failed allocate memory for fast-path per-EQ handle array\n" regex lpfc_printf_log "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):([-]\?[0-9]{1,}) Failed allocate memory for fast-path per-EQ handle array$" description {{ Failed to allocate memory for the fast-path per-EQ handle array. }} action {{ None required. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_log KERN_ERR "Failed allocate memory for fast-path WQ record array\n" regex lpfc_printf_log "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):([-]\?[0-9]{1,}) Failed allocate memory for fast-path WQ record array$" description {{ Failed to allocate memory for the fast-path EQ record array. }} action {{ None required. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_log KERN_ERR "Failed allocate memory for msi-x interrupt vector entries\n" regex lpfc_printf_log "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):([-]\?[0-9]{1,}) Failed allocate memory for msi-x interrupt vector entries$" description {{ The driver was unable to allocate memory during initialization of the MSI-X interrupt array. }} action {{ None required. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_log KERN_ERR "Failed allocate slow-path ELS CQ\n" regex lpfc_printf_log "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):([-]\?[0-9]{1,}) Failed allocate slow-path ELS CQ$" description {{ Failed allocate slow-path ELS CQ. }} action {{ None required. }} class: software sl_severity: error refcode: "" message: lpfc_printf_log KERN_ERR "Failed allocate slow-path ELS WQ\n" regex lpfc_printf_log "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):([-]\?[0-9]{1,}) Failed allocate slow-path ELS WQ$" description {{ Failed to allocate slow-path ELS WQ. }} action {{ None required. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_log KERN_ERR "Failed allocate slow-path EQ\n" regex lpfc_printf_log "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):([-]\?[0-9]{1,}) Failed allocate slow-path EQ$" description {{ The event queue for the slow path was not allocated. }} action {{ Unload and reload the driver. }} class: software sl_severity: error refcode: "" message: lpfc_printf_log KERN_WARNING "Failed allocate slow-path mailbox CQ\n" regex lpfc_printf_log "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):([-]\?[0-9]{1,}) Failed allocate slow-path mailbox CQ$" description {{ Failed to allocate slow-path mailbox CQ. }} action {{ None required. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_log KERN_ERR "Failed to allocate CQ_EVENT entry\n" regex lpfc_printf_log "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):([-]\?[0-9]{1,}) Failed to allocate CQ_EVENT entry$" description {{ The asynchronous event handler was not able to allocate an event queue entry to which to transfer the asynchronous event. }} action {{ This could be a V-LINK clear from the switch or a fatal error from the firmware. Perform a dump from the OneCommand Manager application. }} class: software sl_severity: error refcode: "" message: lpfc_printf_log KERN_ERR "Failed to allocate IOTAG.last IOTAG is %d\n" regex lpfc_printf_log "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):([-]\?[0-9]{1,}) Failed to allocate IOTAG\\.last IOTAG is ([-]\?[0-9]{1,})$" description {{ The driver cannot allocate an IoTag. Display the last value used. }} action {{ This message indicates the adapter HBA I/O queue is full. Typically this happens when heavy I/O is running on a low-end (3 digit) adapter. We suggest you upgrade to a higher-end adapter. }} class: software sl_severity: error refcode: "" message: lpfc_printf_log KERN_ERR "Failed to allocate mbox cmd memory\n" regex lpfc_printf_log "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):([-]\?[0-9]{1,}) Failed to allocate mbox cmd memory$" description {{ Mailbox allocation error. }} action {{ None required. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_log KERN_ERR "Failed to allocate mbox for ADD_FCF cmd\n" regex lpfc_printf_log "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):([-]\?[0-9]{1,}) Failed to allocate mbox for ADD_FCF cmd$" description {{ Failed to allocate mailbox for ADD_FCF command. }} action {{ None required. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_log KERN_ERR "Failed to allocate mbox for query firmware config cmd\n" regex lpfc_printf_log "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):([-]\?[0-9]{1,}) Failed to allocate mbox for query firmware config cmd$" description {{ Failed to allocate mailbox memory. }} action {{ None required. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_log KERN_ERR "Failed to allocate mbox for READ_FCF cmd\n" regex lpfc_printf_log "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):([-]\?[0-9]{1,}) Failed to allocate mbox for READ_FCF cmd$" description {{ Failed to allocate mbox for READ_FCF command. }} action {{ None required. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_log KERN_ERR "Failed to allocate memory for ELS XRI management array of size %d.\n" regex lpfc_printf_log "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):([-]\?[0-9]{1,}) Failed to allocate memory for ELS XRI management array of size ([-]\?[0-9]{1,})\\.$" description {{ Initialization failed to allocate memory for the ELS XRI management array. }} action {{ None required. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_log KERN_ERR "Failed to allocate memory for SCSI XRI management array of size %d.\n" regex lpfc_printf_log "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):([-]\?[0-9]{1,}) Failed to allocate memory for SCSI XRI management array of size ([-]\?[0-9]{1,})\\.$" description {{ Initialization could not allocate memory to hold the XRIs. }} action {{ None required. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_log KERN_ERR "Failed to allocate non-embedded SGE array.\n" regex lpfc_printf_log "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):([-]\?[0-9]{1,}) Failed to allocate non-embedded SGE array\\.$" description {{ Failed to allocate the non-embedded SGE array. }} action {{ None required. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_log KERN_ERR "Failed to allocate sysfs attr\n" regex lpfc_printf_log "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):([-]\?[0-9]{1,}) Failed to allocate sysfs attr$" description {{ Initialization failed to sysfs attribute. }} action {{ None required. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_log KERN_INFO "Failed to allocate XRI.last XRITAG is %d Max XRI is %d, Used XRI is %d\n" regex lpfc_printf_log "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):([-]\?[0-9]{1,}) Failed to allocate XRI\\.last XRITAG is ([-]\?[0-9]{1,}) Max XRI is ([-]\?[0-9]{1,}), Used XRI is ([-]\?[0-9]{1,})$" description {{ All XRIs are in use. }} action {{ No action needed, informational. }} class: software type: info refcode: "" message: lpfc_printf_log KERN_ERR "Failed to create scsi host.\n" regex lpfc_printf_log "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):([-]\?[0-9]{1,}) Failed to create scsi host\\.$" description {{ Initialization failed to create SCSI host. }} action {{ None required. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_log KERN_ERR "Failed to enable interrupt.\n" regex lpfc_printf_log "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):([-]\?[0-9]{1,}) Failed to enable interrupt\\.$" description {{ The driver failed to start the interrupt. }} action {{ Unload and reload the driver. }} class: software sl_severity: error refcode: "" message: lpfc_printf_log KERN_ERR "Failed to enable pci device.\n" regex lpfc_printf_log "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):([-]\?[0-9]{1,}) Failed to enable pci device\\.$" description {{ Failed to enable PCI device during initialization. }} action {{ None required. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_log KERN_ERR "Failed to get the non-embedded SGE virtual address\n" regex lpfc_printf_log "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):([-]\?[0-9]{1,}) Failed to get the non-embedded SGE virtual address$" description {{ The READ_FCF_RECORD mailbox command could not retrieve the Scatter Gather Entry that was requested. }} action {{ None required. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_log KERN_ERR "Failed to initialize iocb list.\n" regex lpfc_printf_log "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):([-]\?[0-9]{1,}) Failed to initialize iocb list\\.$" description {{ Driver resource initialization failed. }} action {{ None required. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_log KERN_ERR "Failed to initialize rpi headers.\n" regex lpfc_printf_log "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):([-]\?[0-9]{1,}) Failed to initialize rpi headers\\.$" description {{ Failed to initialize RPI headers. }} action {{ None required. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_log KERN_ERR "Failed to initialize sgl list.\n" regex lpfc_printf_log "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):([-]\?[0-9]{1,}) Failed to initialize sgl list\\.$" description {{ Failed to initialize SGL list during initialization. }} action {{ None required. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_log KERN_ERR "Failed to read FCoE parameters\n" regex lpfc_printf_log "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):([-]\?[0-9]{1,}) Failed to read FCoE parameters$" description {{ The driver failed to read FCoE parameters. }} action {{ None required. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_log KERN_ERR "Failed to set up driver resource.\n" regex lpfc_printf_log "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):([-]\?[0-9]{1,}) Failed to set up driver resource\\.$" description {{ Driver resource initialization failed. }} action {{ None required. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_log KERN_ERR "Failed to set up hba\n" regex lpfc_printf_log "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):([-]\?[0-9]{1,}) Failed to set up hba$" description {{ Initialization failed to set up the HBA. }} action {{ None required. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_log KERN_ERR "Failed to set up pci memory space.\n" regex lpfc_printf_log "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):([-]\?[0-9]{1,}) Failed to set up pci memory space\\.$" description {{ PCI initialization failed. }} action {{ None required. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_log KERN_WARNING "Failure HBA POST Status: sta_reg=0x%x, perr=x%x, sfi=x%x, nip=x%x, ipc=x%x, xrom=x%x, dl=x%x, pstatus=x%x\n" regex lpfc_printf_log "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):([-]\?[0-9]{1,}) Failure HBA POST Status: sta_reg=0x([0-9a-f]{1,}), perr=x([0-9a-f]{1,}), sfi=x([0-9a-f]{1,}), nip=x([0-9a-f]{1,}), ipc=x([0-9a-f]{1,}), xrom=x([0-9a-f]{1,}), dl=x([0-9a-f]{1,}), pstatus=x([0-9a-f]{1,})$" description {{ The HBA’s power on self test has failed. }} action {{ None required. }} class: software type: info refcode: "" message: lpfc_printf_log KERN_INFO "Fast-path wqe consume event carries miss-matched qid: wcqe-qid=x%x\n" regex lpfc_printf_log "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):([-]\?[0-9]{1,}) Fast-path wqe consume event carries miss-matched qid: wcqe-qid=x([0-9a-f]{1,})$" description {{ The consumed entry does not have the fast path’s queueID. }} action {{ No action needed, informational. }} class: software type: info refcode: "" message: lpfc_printf_log KERN_ERR "FCF disconnected from network index 0x%x tag 0x%x\n" regex lpfc_printf_log "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):([-]\?[0-9]{1,}) FCF disconnected from network index 0x([0-9a-f]{1,}) tag 0x([0-9a-f]{1,})$" description {{ The FCF has disconnected from the network. }} action {{ None required. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_log KERN_ERR "FCF Table full count 0x%x tag 0x%x\n" regex lpfc_printf_log "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):([-]\?[0-9]{1,}) FCF Table full count 0x([0-9a-f]{1,}) tag 0x([0-9a-f]{1,})$" description {{ The FCF table is full. }} action {{ None required. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_log KERN_ERR "FCoE Function not supported by firmware. Function mode = %08x\n" regex lpfc_printf_log "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):([-]\?[0-9]{1,}) FCoE Function not supported by firmware\\. Function mode = ([0]{0,7}[0-9a-f]{1,})$" description {{ FCoE is not supported by this firmware. }} action {{ Use the OneCommand Manager application to update to the latest firmware. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_log KERN_INFO "FCP cmdiocb not callback function iotag: (%d)\n" regex lpfc_printf_log "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):([-]\?[0-9]{1,}) FCP cmdiocb not callback function iotag: \\(([-]\?[0-9]{1,})\\)$" description {{ The IOCB found for this iotag does not have a completion handler set in it. }} action {{ No action needed, informational. }} class: software type: info refcode: "" message: lpfc_printf_log KERN_INFO "FCP complete error: status=x%x, hw_status=x%x, total_data_specified=%d, parameter=x%x, word3=x%x\n" regex lpfc_printf_log "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):([-]\?[0-9]{1,}) FCP complete error: status=x([0-9a-f]{1,}), hw_status=x([0-9a-f]{1,}), total_data_specified=([-]\?[0-9]{1,}), parameter=x([0-9a-f]{1,}), word3=x([0-9a-f]{1,})$" description {{ Logs the FCP failure. Status and parameter are equivalent to ulpStatus and ulpWord[4]. }} action {{ No action needed, informational. }} class: software type: info refcode: "" message: lpfc_printf_log KERN_INFO "FCP complete with no corresponding cmdiocb: iotag (%d)\n" regex lpfc_printf_log "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):([-]\?[0-9]{1,}) FCP complete with no corresponding cmdiocb: iotag \\(([-]\?[0-9]{1,})\\)$" description {{ There was no IOCB on the in-progress list that matched this iotag. }} action {{ No action needed, informational. }} class: software type: info refcode: "" message: lpfc_printf_log KERN_INFO "Feature Mismatch Data: x%08x %08x x%x x%x x%x\n" regex lpfc_printf_log "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):([-]\?[0-9]{1,}) Feature Mismatch Data: x([0]{0,7}[0-9a-f]{1,}) ([0]{0,7}[0-9a-f]{1,}) x([0-9a-f]{1,}) x([0-9a-f]{1,}) x([0-9a-f]{1,})$" description {{ The features passed in to the driver as module parameters do not match what the firmware can do. Setting to default values. }} action {{ No action needed, informational. }} class: software type: info refcode: "" message: lpfc_printf_log KERN_INFO "Find ndlp returned NULL for oxid:x%x SID:x%x\n" regex lpfc_printf_log "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):([-]\?[0-9]{1,}) Find ndlp returned NULL for oxid:x([0-9a-f]{1,}) SID:x([0-9a-f]{1,})$" description {{ Could not find the node for this DID. }} action {{ No action needed, informational. }} class: software type: info refcode: "" message: lpfc_printf_log KERN_ERR "HBA not supporting SLI-3 or later SLI Revision: 0x%x\n" regex lpfc_printf_log "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):([-]\?[0-9]{1,}) HBA not supporting SLI-3 or later SLI Revision: 0x([0-9a-f]{1,})$" description {{ The HBA does not support SLI-3 or SLI-4. }} action {{ This HBA does not support msi. Set lpfc_use_msi=0. }} class: software sl_severity: error refcode: "" message: lpfc_printf_log KERN_ERR "HBA Unrecoverable error: uerr_lo_reg=0x%x, uerr_hi_reg=0x%x, ue_mask_lo_reg=0x%x, ue_mask_hi_reg=0x%x\n" regex lpfc_printf_log "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):([-]\?[0-9]{1,}) HBA Unrecoverable error: uerr_lo_reg=0x([0-9a-f]{1,}), uerr_hi_reg=0x([0-9a-f]{1,}), ue_mask_lo_reg=0x([0-9a-f]{1,}), ue_mask_hi_reg=0x([0-9a-f]{1,})$" description {{ The HBA has notified the driver that it has encountered an unrecoverable error. }} action {{ A dump from the OneCommand Manager application should be taken. Then, the driver should be unloaded and reloaded. }} class: software sl_severity: error refcode: "" message: lpfc_printf_log KERN_ERR "HBQ %d: local_hbqGetIdx %u is > than hbqp->entry_count %u\n" regex lpfc_printf_log "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):([-]\?[0-9]{1,}) HBQ ([-]\?[0-9]{1,}): local_hbqGetIdx ([0-9]{1,}) is > than hbqp->entry_count ([0-9]{1,})$" description {{ An error occurred when processing queue related to an HBA in a particular slot. DATA: (1) hbqno (2) local_hbqGetIdx (3) entry_count }} action {{ Software driver error. If this problem persists, report these errors to Technical Support. }} class: software sl_severity: error refcode: "" message: lpfc_printf_log KERN_ERR "Ignoring ELS cmd tag x%x completion Data: x%x x%x x%x\n" regex lpfc_printf_log "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):([-]\?[0-9]{1,}) Ignoring ELS cmd tag x([0-9a-f]{1,}) completion Data: x([0-9a-f]{1,}) x([0-9a-f]{1,}) x([0-9a-f]{1,})$" description {{ This ELS command was aborted. DATA: (1) ulpStatus (2) ulpWord[4] (3) ulpTimeout }} action {{ None required. }} class: software sl_severity: error refcode: "" message: lpfc_printf_log KERN_INFO "Ignoring unsolicited CT No HBQ status = x%x\n" regex lpfc_printf_log "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):([-]\?[0-9]{1,}) Ignoring unsolicited CT No HBQ status = x([0-9a-f]{1,})$" description {{ Received an unsolicited ct command without a BDE. }} action {{ No action needed, informational. }} class: software type: info refcode: "" message: lpfc_printf_log KERN_INFO "Ignoring unsolicted CT HBQ Size:%d status = x%x\n" regex lpfc_printf_log "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):([-]\?[0-9]{1,}) Ignoring unsolicted CT HBQ Size:([-]\?[0-9]{1,}) status = x([0-9a-f]{1,})$" description {{ Received an unsolicited ct command with an invalid size. DATA: ulpStatus }} action {{ No action needed, informational. }} class: software type: info refcode: "" message: lpfc_printf_log KERN_ERR "INIT VPI Mailbox failed status %d, mbxStatus x%x\n" regex lpfc_printf_log "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):([-]\?[0-9]{1,}) INIT VPI Mailbox failed status ([-]\?[0-9]{1,}), mbxStatus x([0-9a-f]{1,})$" description {{ The INIT VPI mailbox command has failed. }} action {{ None required. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_log KERN_ERR "Invalid asynchrous event code: x%x\n" regex lpfc_printf_log "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):([-]\?[0-9]{1,}) Invalid asynchrous event code: x([0-9a-f]{1,})$" description {{ The asynchronous event code that the firmware passed to the driver is invalid. }} action {{ None required. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_log KERN_ERR "Invalid command 0x%x\n" regex lpfc_printf_log "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):([-]\?[0-9]{1,}) Invalid command 0x([0-9a-f]{1,})$" description {{ The IOCB command is invalid. }} action {{ None required. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_log KERN_ERR "Invalid completion queue type (%d)\n" regex lpfc_printf_log "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):([-]\?[0-9]{1,}) Invalid completion queue type \\(([-]\?[0-9]{1,})\\)$" description {{ The event queue entry is not for a mailbox or a work queue entry. }} action {{ None required. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_log KERN_ERR "Invalid CT %x command 0x%x\n" regex lpfc_printf_log "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):([-]\?[0-9]{1,}) Invalid CT ([0-9a-f]{1,}) command 0x([0-9a-f]{1,})$" description {{ Invalid Command-Type in the IOCB is not supported. }} action {{ None required. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_log KERN_ERR "Invalid device group (x%x)\n" regex lpfc_printf_log "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):([-]\?[0-9]{1,}) Invalid device group \\(x([0-9a-f]{1,})\\)$" description {{ While unloading the driver, the driver detect a PCI device that it should not have claimed. }} action {{ None required. }} class: hardware sl_severity: warning refcode: "" message: lpfc_printf_log KERN_ERR "Invalid HBA PCI-device group: 0x%x\n" regex lpfc_printf_log "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):([-]\?[0-9]{1,}) Invalid HBA PCI-device group: 0x([0-9a-f]{1,})$" description {{ Invalid HBA PCI-device group detected. }} action {{ None required. }} class: hardware sl_severity: warning refcode: "" message: lpfc_printf_log KERN_ERR "Invalid link-attention link speed: x%x\n" regex lpfc_printf_log "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):([-]\?[0-9]{1,}) Invalid link-attention link speed: x([0-9a-f]{1,})$" description {{ The link speed reported in the link attention interrupt is invalid. }} action {{ Check the switch configuration. }} class: hardware sl_severity: error refcode: "" message: lpfc_printf_log KERN_ERR "Invalid link attention type: x%x\n" regex lpfc_printf_log "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):([-]\?[0-9]{1,}) Invalid link attention type: x([0-9a-f]{1,})$" description {{ The READ_LA mailbox command has returned an invalid link type. }} action {{ None required. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_log KERN_ERR "Invalid link fault code: x%x\n" regex lpfc_printf_log "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):([-]\?[0-9]{1,}) Invalid link fault code: x([0-9a-f]{1,})$" description {{ The attempt to read the link attention register has returned an unknown value. }} action {{ None required. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_log KERN_ERR "Invalid param:\n" regex lpfc_printf_log "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):([-]\?[0-9]{1,}) Invalid param:$" description {{ SLI-4: The post SGL function was passed an invalid XRI }} action {{ None required. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_log KERN_ERR "Invalid SLI revision (%d)\n" regex lpfc_printf_log "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):([-]\?[0-9]{1,}) Invalid SLI revision \\(([-]\?[0-9]{1,})\\)$" description {{ While processing a host attention or unrecoverable error, the driver detected an invalid SLI revision. }} action {{ None required. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_log KERN_INFO "Invalid speed for this board: Reset link speed to auto: x%x\n" regex lpfc_printf_log "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):([-]\?[0-9]{1,}) Invalid speed for this board: Reset link speed to auto: x([0-9a-f]{1,})$" description {{ The driver is reinitializing the link speed to auto-detect. }} action {{ No action needed, informational. }} class: software type: info refcode: "" message: lpfc_printf_log KERN_ERR "Invalid work queue CQE subtype (x%x)\n" regex lpfc_printf_log "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):([-]\?[0-9]{1,}) Invalid work queue CQE subtype \\(x([0-9a-f]{1,})\\)$" description {{ Invalid work queue CQE. }} action {{ None required. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_log KERN_INFO "IOCB wait issue failed, Data x%x\n" regex lpfc_printf_log "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):([-]\?[0-9]{1,}) IOCB wait issue failed, Data x([0-9a-f]{1,})$" description {{ The LPFC driver failed to issue an IOCB. DATA:(1) retval }} action {{ No action needed, informational. }} class: software type: info refcode: "" message: lpfc_printf_log KERN_ERR "IOCB wake NOT set, Data x%x x%lx\n" regex lpfc_printf_log "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):([-]\?[0-9]{1,}) IOCB wake NOT set, Data x([0-9a-f]{1,}) x([0-9a-f]{1,})$" description {{ The completion handler associated with the IOCB was never called. DATA:(1) timeout (2) timeleft/jiffies }} action {{ This error could indicate a software driver, firmware or hardware problem.If the problem persists,report the error to Technical Support. }} class: unknown sl_severity: error refcode: "" message: lpfc_printf_log KERN_WARNING "IOCB wake signaled\n" regex lpfc_printf_log "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):([-]\?[0-9]{1,}) IOCB wake signaled$" description {{ The IOCB completed successfully. }} action {{ No action needed, informational. }} class: software type: info refcode: "" message: lpfc_printf_log KERN_ERR "IOCB x%x failed. No vport\n" regex lpfc_printf_log "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):([-]\?[0-9]{1,}) IOCB x([0-9a-f]{1,}) failed\\. No vport$" description {{ An IOCB command could not be communicated because there was no VPort associated with the mailbox command. DATA: (1) ulpCommand }} action {{ Software driver error. If this problem persists, report these errors to Technical Support. }} class: software sl_severity: error refcode: "" message: lpfc_printf_log KERN_ERR "iotag x%x is out off range: max iotag (x%x)\n" regex lpfc_printf_log "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):([-]\?[0-9]{1,}) iotag x([0-9a-f]{1,}) is out off range: max iotag \\(x([0-9a-f]{1,})\\)$" description {{ The IOCB lookup cannot be performed because the iocb_tag is out of range. }} action {{ None required. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_log KERN_ERR "iotag x%x is out off range: max iotag x%x wd0 x%x\n" regex lpfc_printf_log "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):([-]\?[0-9]{1,}) iotag x([0-9a-f]{1,}) is out off range: max iotag x([0-9a-f]{1,}) wd0 x([0-9a-f]{1,})$" description {{ The IoTag in the completed IOCB is out of range. }} action {{ This error could indicate a software driver, firmware or hardware problem. Report these errors to Technical Support. }} class: unknown sl_severity: error refcode: "" message: lpfc_printf_log KERN_ERR "LATT: Cannot issue READ_LA: Data:%d\n" regex lpfc_printf_log "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):([-]\?[0-9]{1,}) LATT: Cannot issue READ_LA: Data:([-]\?[0-9]{1,})$" description {{ The link attention handler could not issue a READ_LA mailbox command. }} action {{ None required. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_log KERN_ERR "Link Down Event x%x received Data: x%x x%x x%x\n" regex lpfc_printf_log "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):([-]\?[0-9]{1,}) Link Down Event x([0-9a-f]{1,}) received Data: x([0-9a-f]{1,}) x([0-9a-f]{1,}) x([0-9a-f]{1,})$" description {{ A link down event was received. DATA: (1) fc_eventTag (2) hba_state (3) fc_flag }} action {{ If numerous link events are occurring, check the physical connections to the Fibre Channel network. }} class: hardware sl_severity: error refcode: "" message: lpfc_printf_log KERN_ERR "Link Up Event in loop back mode x%x received Data: x%x x%x x%x x%x\n" regex lpfc_printf_log "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):([-]\?[0-9]{1,}) Link Up Event in loop back mode x([0-9a-f]{1,}) received Data: x([0-9a-f]{1,}) x([0-9a-f]{1,}) x([0-9a-f]{1,}) x([0-9a-f]{1,})$" description {{ Link up notification; configured for loopback. DATA: (1) fc_eventTag (2) granted_AL_PA (3) UlnkSpeed (4) alpa_map[0] }} action {{ None required. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_log KERN_ERR "Link Up Event npiv not supported in loop topology\n" regex lpfc_printf_log "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):([-]\?[0-9]{1,}) Link Up Event npiv not supported in loop topology$" description {{ NPIV is not supported in loop topology. }} action {{ None required. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_log KERN_ERR "Loopback test did not receive expected data length. actual length 0x%x expected length 0x%x\n" regex lpfc_printf_log "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):([-]\?[0-9]{1,}) Loopback test did not receive expected data length\\. actual length 0x([0-9a-f]{1,}) expected length 0x([0-9a-f]{1,})$" description {{ The loopback test did not receive the same amount of data that it transmitted. }} action {{ None required. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_log KERN_ERR "lpfc_create_static_vport bad information header 0x%x 0x%x\n" regex lpfc_printf_log "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):([-]\?[0-9]{1,}) lpfc_create_static_vport bad information header 0x([0-9a-f]{1,}) 0x([0-9a-f]{1,})$" description {{ Invalid information header; the signature or revision is invalid. }} action {{ None required. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_log KERN_ERR "lpfc_create_static_vport failed to allocate mailbox memory\n" regex lpfc_printf_log "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):([-]\?[0-9]{1,}) lpfc_create_static_vport failed to allocate mailbox memory$" description {{ Failed to allocate mailbox memory for VPort creation. }} action {{ None required. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_log KERN_ERR "lpfc_create_static_vport failed to allocate vport_info\n" regex lpfc_printf_log "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):([-]\?[0-9]{1,}) lpfc_create_static_vport failed to allocate vport_info$" description {{ Failed to allocate vport_info. }} action {{ None required. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_log KERN_ERR "lpfc_create_static_vport failed to create vport\n" regex lpfc_printf_log "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):([-]\?[0-9]{1,}) lpfc_create_static_vport failed to create vport$" description {{ Failed to create vport }} action {{ None required. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_log KERN_ERR "lpfc_create_static_vport failed to issue dump mailbox command ret 0x%x status 0x%x\n" regex lpfc_printf_log "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):([-]\?[0-9]{1,}) lpfc_create_static_vport failed to issue dump mailbox command ret 0x([0-9a-f]{1,}) status 0x([0-9a-f]{1,})$" description {{ Failed to issue a dump mailbox command for statis VPort creation. }} action {{ None required. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_log KERN_ERR "lpfc_dump_fcoe_param: memory allocation failed\n" regex lpfc_printf_log "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):([-]\?[0-9]{1,}) lpfc_dump_fcoe_param: memory allocation failed$" description {{ Memory allocation has failed. }} action {{ None required. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_log KERN_ERR "lpfc_dump_static_vport: memory allocation failed\n" regex lpfc_printf_log "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):([-]\?[0-9]{1,}) lpfc_dump_static_vport: memory allocation failed$" description {{ Failed to allocate mailbox memory. }} action {{ None required. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_log KERN_ERR "lpfc_sli_read_serdes_param failed to allocate mailbox memory\n" regex lpfc_printf_log "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):([-]\?[0-9]{1,}) lpfc_sli_read_serdes_param failed to allocate mailbox memory$" description {{ Failed to allocate mailbox memory. }} action {{ None required. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_log KERN_WARNING "lpfc_soft_wwpn attribute set failed to reinit adapter - %d\n" regex lpfc_printf_log "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):([-]\?[0-9]{1,}) lpfc_soft_wwpn attribute set failed to reinit adapter - ([-]\?[0-9]{1,})$" description {{ The adapter failed to restart after setting a new WWPN. }} action {{ Perform a dump using the hbacmd. }} class: hardware sl_severity: warning refcode: "" message: lpfc_printf_log KERN_ERR "Mailbox failed , mbxCmd x%x READ_CONFIG, mbxStatus x%x\n" regex lpfc_printf_log "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):([-]\?[0-9]{1,}) Mailbox failed , mbxCmd x([0-9a-f]{1,}) READ_CONFIG, mbxStatus x([0-9a-f]{1,})$" description {{ The READ_CONFIG mailbox command failed. }} action {{ None required. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_log KERN_INFO "mbox: Issued mailbox cmd 0x%x while in stopped state.\n" regex lpfc_printf_log "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):([-]\?[0-9]{1,}) mbox: Issued mailbox cmd 0x([0-9a-f]{1,}) while in stopped state\\.$" description {{ Only the dump mailbox command and reset HBA mailbox command are allowed when in the stopped state. }} action {{ No action needed, informational. }} class: software type: info refcode: "" message: lpfc_printf_log KERN_ERR "Mbox x%x failed, no vport\n" regex lpfc_printf_log "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):([-]\?[0-9]{1,}) Mbox x([0-9a-f]{1,}) failed, no vport$" description {{ The vport field of this mailbox command was not completed. }} action {{ None required. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_log KERN_ERR "Menlo Maint Mode Link up Event x%x rcvd Data: x%x x%x x%x\n" regex lpfc_printf_log "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):([-]\?[0-9]{1,}) Menlo Maint Mode Link up Event x([0-9a-f]{1,}) rcvd Data: x([0-9a-f]{1,}) x([0-9a-f]{1,}) x([0-9a-f]{1,})$" description {{ The link is up in maintenance mode; only management commands are allowed. DATA: (1) fc_eventTag (2) port_state (3) vport fc_flag }} action {{ None required. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_log KERN_ERR "Miss-matched fast-path completion queue identifier: eqcqid=%d, fcpcqid=%d\n" regex lpfc_printf_log "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):([-]\?[0-9]{1,}) Miss-matched fast-path completion queue identifier: eqcqid=([-]\?[0-9]{1,}), fcpcqid=([-]\?[0-9]{1,})$" description {{ The CQID in the event queue entry does not match the fcp_cqid that was passed into the routine. }} action {{ None required. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_log KERN_ERR "MQ_CREATE mailbox failed with status x%x add_status x%x, mbx status x%x\n" regex lpfc_printf_log "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):([-]\?[0-9]{1,}) MQ_CREATE mailbox failed with status x([0-9a-f]{1,}) add_status x([0-9a-f]{1,}), mbx status x([0-9a-f]{1,})$" description {{ The mailbox command sent to create the mailbox queue has failed. }} action {{ None required. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_log KERN_ERR "MQ_DESTROY mailbox failed with status x%x add_status x%x, mbx status x%x\n" regex lpfc_printf_log "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):([-]\?[0-9]{1,}) MQ_DESTROY mailbox failed with status x([0-9a-f]{1,}) add_status x([0-9a-f]{1,}), mbx status x([0-9a-f]{1,})$" description {{ The mailbox command sent to delete the mailbox queue has failed. }} action {{ None required. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_log KERN_WARNING "MSI request_irq failed (%d)\n" regex lpfc_printf_log "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):([-]\?[0-9]{1,}) MSI request_irq failed \\(([-]\?[0-9]{1,})\\)$" description {{ The request_irq kernel API has failed. }} action {{ Set lpfc_use_msi = 0. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_log KERN_WARNING "MSI-X fast-path request_irq failed (%d)\n" regex lpfc_printf_log "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):([-]\?[0-9]{1,}) MSI-X fast-path request_irq failed \\(([-]\?[0-9]{1,})\\)$" description {{ The driver received an error for the request_irq_call. }} action {{ Unload and reload the driver. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_log KERN_INFO "MSI-X interrupt with no EQE\n" regex lpfc_printf_log "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):([-]\?[0-9]{1,}) MSI-X interrupt with no EQE$" description {{ SLI-4 HBA interrupt on the slow path but there is no associated EQE. }} action {{ No action needed, informational. }} class: software type: info refcode: "" message: lpfc_printf_log KERN_WARNING "MSI-X slow-path request_irq failed (%d)\n" regex lpfc_printf_log "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):([-]\?[0-9]{1,}) MSI-X slow-path request_irq failed \\(([-]\?[0-9]{1,})\\)$" description {{ The kernel API to request an IRQ has failed. }} action {{ Use module parameter lpfc_use_msi = 0 (IntX). }} class: software sl_severity: warning refcode: "" message: lpfc_printf_log KERN_INFO "ndlp null for oxid %x SID %x\n" regex lpfc_printf_log "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):([-]\?[0-9]{1,}) ndlp null for oxid ([0-9a-f]{1,}) SID ([0-9a-f]{1,})$" description {{ The Node value for this SID is not in the node list. }} action {{ No action needed, informational. }} class: software type: info refcode: "" message: lpfc_printf_log KERN_INFO "New FCF found index 0x%x tag 0x%x\n" regex lpfc_printf_log "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):([-]\?[0-9]{1,}) New FCF found index 0x([0-9a-f]{1,}) tag 0x([0-9a-f]{1,})$" description {{ The driver has detected a new FCF in the SAN. DATA: (1) macqe_fcoe->fcf_index (2) acqe_fcoe->event_tag }} action {{ No action needed, informational. }} class: hardware type: info refcode: "" message: lpfc_printf_log KERN_ERR "No entry from fast-path completion queue fcpcqid=%d\n" regex lpfc_printf_log "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):([-]\?[0-9]{1,}) No entry from fast-path completion queue fcpcqid=([-]\?[0-9]{1,})$" description {{ There were no completions in the completion queue referenced by fcpcqid. }} action {{ None required. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_log KERN_ERR "No entry from the CQ: identifier (x%x), type (%d)\n" regex lpfc_printf_log "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):([-]\?[0-9]{1,}) No entry from the CQ: identifier \\(x([0-9a-f]{1,})\\), type \\(([-]\?[0-9]{1,})\\)$" description {{ There was no completion queue event for this event queue entry. }} action {{ None required. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_log KERN_WARNING "NOP mailbox command failed status x%x add_status x%x mbx status x%x\n" regex lpfc_printf_log "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):([-]\?[0-9]{1,}) NOP mailbox command failed status x([0-9a-f]{1,}) add_status x([0-9a-f]{1,}) mbx status x([0-9a-f]{1,})$" description {{ The NOP mailbox command failed. }} action {{ None required. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_log KERN_ERR "No room left for SCSI XRI allocation: max_xri=%d, els_xri=%d\n" regex lpfc_printf_log "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):([-]\?[0-9]{1,}) No room left for SCSI XRI allocation: max_xri=([-]\?[0-9]{1,}), els_xri=([-]\?[0-9]{1,})$" description {{ The number of allocated XRIs has reached the max_xri value. }} action {{ None required. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_log KERN_INFO "No support for fcpi mode.\n" regex lpfc_printf_log "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):([-]\?[0-9]{1,}) No support for fcpi mode\\.$" description {{ Could not configure the port to run in FCP initiator mode. }} action {{ No action needed, informational. }} class: software type: info refcode: "" message: lpfc_printf_log KERN_ERR "Not a valid fast-path completion event: majorcode=x%x, minorcode=x%x\n" regex lpfc_printf_log "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):([-]\?[0-9]{1,}) Not a valid fast-path completion event: majorcode=x([0-9a-f]{1,}), minorcode=x([0-9a-f]{1,})$" description {{ The major or minor code in the Event Queue field is not valid. }} action {{ None required. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_log KERN_ERR "Not a valid slow-path completion event: majorcode=x%x, minorcode=x%x\n" regex lpfc_printf_log "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):([-]\?[0-9]{1,}) Not a valid slow-path completion event: majorcode=x([0-9a-f]{1,}), minorcode=x([0-9a-f]{1,})$" description {{ SLI-4: The EQE is not valid. }} action {{ None required. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_log KERN_ERR "Not a valid WCQE code: x%x\n" regex lpfc_printf_log "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):([-]\?[0-9]{1,}) Not a valid WCQE code: x([0-9a-f]{1,})$" description {{ The completion queue handler detected an invalid type. }} action {{ None required. }} class: software sl_severity: error refcode: "" message: lpfc_printf_log KERN_ERR "Not configured for supporting MSI-X cfg_use_msi: 0x%x\n" regex lpfc_printf_log "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):([-]\?[0-9]{1,}) Not configured for supporting MSI-X cfg_use_msi: 0x([0-9a-f]{1,})$" description {{ The lpfc_use_msi module parameter should have been set to 2. }} action {{ Set module parameter lpfc_use_msi = 2. }} class: software sl_severity: error refcode: "" message: lpfc_printf_log KERN_ERR "NPIV enabled: Override lpfc_sli_mode parameter (%d) to auto (0).\n" regex lpfc_printf_log "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):([-]\?[0-9]{1,}) NPIV enabled: Override lpfc_sli_mode parameter \\(([-]\?[0-9]{1,})\\) to auto \\(0\\)\\.$" description {{ The lpfc_enable_npiv and lpfc_sli_mode driver parameter settings conflict. The HBA must be configured for SLI-3 mode to support NPIV. DATA: (1) lpfc_sli_mode }} action {{ This is an informational message that indicates that the lpfc_enable_npiv and lpfc_sli_mod parameter settings are not compatible. Resolve the parameter conflict by setting the SLI mode to 0 or 3 or, if SLI-2 mode is required then disable NPIV. }} class: software sl_severity: error refcode: "" message: lpfc_printf_log KERN_ERR "Only Limited Edition cmd Format supported 0x%x\n" regex lpfc_printf_log "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):([-]\?[0-9]{1,}) Only Limited Edition cmd Format supported 0x([0-9a-f]{1,})$" description {{ The SGL pages could not be unregistered from the firmware. }} action {{ None required. }} class: firmware sl_severity: warning refcode: "" message: lpfc_printf_log KERN_INFO "Outstanding IO when bringing Adapter offline\n" regex lpfc_printf_log "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):([-]\?[0-9]{1,}) Outstanding IO when bringing Adapter offline$" description {{ IO is still pending while attempting to stop the driver. }} action {{ No action needed, informational. }} class: software type: info refcode: "" message: lpfc_printf_log KERN_INFO "PCI enable MSI mode success.\n" regex lpfc_printf_log "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):([-]\?[0-9]{1,}) PCI enable MSI mode success\\.$" description {{ MSI has been enabled for the port. }} action {{ No action needed, informational. }} class: software type: info refcode: "" message: lpfc_printf_log KERN_ERR "PM resume Failed to enable interrupt\n" regex lpfc_printf_log "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):([-]\?[0-9]{1,}) PM resume Failed to enable interrupt$" description {{ The PCI resume (hotplug) could not get an interrupt vector. }} action {{ Unload and reload the driver. }} class: software sl_severity: error refcode: "" message: lpfc_printf_log KERN_ERR "PM resume failed to start worker thread: error=x%x.\n" regex lpfc_printf_log "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):([-]\?[0-9]{1,}) PM resume failed to start worker thread: error=x([0-9a-f]{1,})\\.$" description {{ The PCI resume (hotplug) could not start the worker thread for the driver. }} action {{ Unload and reload the driver. }} class: software sl_severity: error refcode: "" message: lpfc_printf_log KERN_ERR "POST_RPI_HDR mailbox failed with status x%x add_status x%x, mbx status x%x\n" regex lpfc_printf_log "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):([-]\?[0-9]{1,}) POST_RPI_HDR mailbox failed with status x([0-9a-f]{1,}) add_status x([0-9a-f]{1,}), mbx status x([0-9a-f]{1,})$" description {{ The mailbox command sent to post the RPUI header pages to the firmware has failed. }} action {{ None required. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_log KERN_ERR "POST_SGL_BLOCK mailbox command failed status x%x add_status x%x mbx status x%x\n" regex lpfc_printf_log "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):([-]\?[0-9]{1,}) POST_SGL_BLOCK mailbox command failed status x([0-9a-f]{1,}) add_status x([0-9a-f]{1,}) mbx status x([0-9a-f]{1,})$" description {{ The mailbox command sent to post the SGL pages to the firmware has failed. }} action {{ None required. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_log KERN_ERR "POST_SGL mailbox failed with status x%x add_status x%x, mbx status x%x\n" regex lpfc_printf_log "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):([-]\?[0-9]{1,}) POST_SGL mailbox failed with status x([0-9a-f]{1,}) add_status x([0-9a-f]{1,}), mbx status x([0-9a-f]{1,})$" description {{ The mailbox command sent to post the SGL pages to the firmware has failed. }} action {{ None required. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_log KERN_ERR "Query Firmware Config failed mbx status x%x, status x%x add_status x%x\n" regex lpfc_printf_log "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):([-]\?[0-9]{1,}) Query Firmware Config failed mbx status x([0-9a-f]{1,}), status x([0-9a-f]{1,}) add_status x([0-9a-f]{1,})$" description {{ Could not read the firmware configuration. }} action {{ None required. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_log KERN_ERR "rc should be MBX_SUCCESS\n" regex lpfc_printf_log "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):([-]\?[0-9]{1,}) rc should be MBX_SUCCESS$" description {{ The next mailbox command on the mailbox queue has failed. }} action {{ None required. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_log KERN_ERR "rc should have been MBX_BUSY\n" regex lpfc_printf_log "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):([-]\?[0-9]{1,}) rc should have been MBX_BUSY$" description {{ Attempting to unregister a default RPI from an interrupt context and the mailbox state is not busy. }} action {{ None required. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_log KERN_ERR "Read FCF record failed 0x%x\n" regex lpfc_printf_log "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):([-]\?[0-9]{1,}) Read FCF record failed 0x([0-9a-f]{1,})$" description {{ Could not read the FCF record from the firmware. }} action {{ None required. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_log KERN_ERR "READ_FCF_RECORD Indicates empty FCF table.\n" regex lpfc_printf_log "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):([-]\?[0-9]{1,}) READ_FCF_RECORD Indicates empty FCF table\\.$" description {{ The driver requested the firmware provide a list of FCF entries to connect to and the firmware responded that the FCF table is empty. }} action {{ None required. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_log KERN_ERR "READ_FCF_RECORD mailbox failed with status x%x add_status x%x, mbx\n" regex lpfc_printf_log "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):([-]\?[0-9]{1,}) READ_FCF_RECORD mailbox failed with status x([0-9a-f]{1,}) add_status x([0-9a-f]{1,}), mbx$" description {{ The READ_FCF_RECORD mailbox command failed. }} action {{ None required. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_log KERN_WARNING "READ_LA mbox error x%x state x%x\n" regex lpfc_printf_log "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):([-]\?[0-9]{1,}) READ_LA mbox error x([0-9a-f]{1,}) state x([0-9a-f]{1,})$" description {{ The driver cannot determine what type of link event occurred. }} action {{ If numerous link events are occurring, check the physical connections to the Fibre Channel network. May indicate a possible hardware or firmware problem. }} class: hardware sl_severity: warning refcode: "" message: lpfc_printf_log KERN_ERR "READ_REV Error. SLI Level %d FCoE enabled %d\n" regex lpfc_printf_log "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):([-]\?[0-9]{1,}) READ_REV Error\\. SLI Level ([-]\?[0-9]{1,}) FCoE enabled ([-]\?[0-9]{1,})$" description {{ This SLI-4 only HBA setup function was called for a non-SLI-4 device. }} action {{ None required. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_log KERN_ERR "READ_SPARAM command failed status %d, mbxStatus x%x\n" regex lpfc_printf_log "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):([-]\?[0-9]{1,}) READ_SPARAM command failed status ([-]\?[0-9]{1,}), mbxStatus x([0-9a-f]{1,})$" description {{ The READ_SPARAM mailbox command has failed during initialization. The HBA has been set to error state. }} action {{ Take a dump with hbacmd and then try reloading the driver. }} class: software sl_severity: error refcode: "" message: lpfc_printf_log KERN_WARNING "READ_SPARAM: no buffers\n" regex lpfc_printf_log "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):([-]\?[0-9]{1,}) READ_SPARAM: no buffers$" description {{ The driver attempted to issue a READ_SPARAM mailbox command to the HBA, but there were no buffers available. }} action {{ This message indicates: (1) Kernel virtual memory is depleted. Check that the system meets minimum RAM requirements for the Emulex Fibre Channel adapter. Try closing other applications to freesome memory. (2) A possible driver buffer management problem. If the problem persists, report the error to Technical Support. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_log KERN_ERR "Receive Frame Truncated!!\n" regex lpfc_printf_log "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):([-]\?[0-9]{1,}) Receive Frame Truncated!!$" description {{ The receive unsolicited handler detected a truncated frame. }} action {{ None required. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_log KERN_WARNING "Re-establishing Link Data: x%x x%x x%x\n" regex lpfc_printf_log "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):([-]\?[0-9]{1,}) Re-establishing Link Data: x([0-9a-f]{1,}) x([0-9a-f]{1,}) x([0-9a-f]{1,})$" description {{ The driver detected a condition in which it had to re-initialize the link. DATA: (1) status (2) status1 (3) status2 }} action {{ If numerous link events are occurring, check the physical connections to the Fibre Channel network. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_log KERN_WARNING "REG_LOGIN: no buffers, VPI:%d DID:x%x, flag x%x\n" regex lpfc_printf_log "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):([-]\?[0-9]{1,}) REG_LOGIN: no buffers, VPI:([-]\?[0-9]{1,}) DID:x([0-9a-f]{1,}), flag x([0-9a-f]{1,})$" description {{ The driver attempted to issue a REG_LOGIN mailbox command to the HBA, but there were no buffers available. DATA: (1) Did (2) flag }} action {{ This message indicates: (1) Kernel virtual memory is depleted. Check that the system meets minimum RAM requirements for the Emulex Fibre Channel adapter. Try closing other applications to free some memory. (2) A possible driver buffer management problem. If the problem persists, report the error to Technical Support. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_log KERN_ERR "REMOVE_ALL_SGL_PAGES mailbox failed with status x%x add_status x%x, mbx status x%x\n" regex lpfc_printf_log "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):([-]\?[0-9]{1,}) REMOVE_ALL_SGL_PAGES mailbox failed with status x([0-9a-f]{1,}) add_status x([0-9a-f]{1,}), mbx status x([0-9a-f]{1,})$" description {{ The mailbox command sent to delete the SGL pages from the firmware has failed. }} action {{ None required. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_log KERN_INFO "Reset HBA Data: x%x x%x\n" regex lpfc_printf_log "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):([-]\?[0-9]{1,}) Reset HBA Data: x([0-9a-f]{1,}) x([0-9a-f]{1,})$" description {{ An HBA has been reset. DATA: (1) hba_state (2) sli_flag }} action {{ No action needed, informational. }} class: software type: info refcode: "" message: lpfc_printf_log KERN_ERR "Resetting board due to mailbox timeout\n" regex lpfc_printf_log "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):([-]\?[0-9]{1,}) Resetting board due to mailbox timeout$" description {{ A mailbox command failed to complete. The driver is resetting the port. }} action {{ If the mailbox command fails again, set the lpfc_log_verbose to LOG_MBOX and retry. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_log KERN_INFO "Restart HBA Data: x%x x%x\n" regex lpfc_printf_log "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):([-]\?[0-9]{1,}) Restart HBA Data: x([0-9a-f]{1,}) x([0-9a-f]{1,})$" description {{ The driver has been told to restart the HBA }} action {{ No action required, informational message. }} class: software type: info refcode: "" message: lpfc_printf_log KERN_ERR "Ring %d Cannot find buffer for an unsolicited iocb. tag 0x%x\n" regex lpfc_printf_log "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):([-]\?[0-9]{1,}) Ring ([-]\?[0-9]{1,}) Cannot find buffer for an unsolicited iocb\\. tag 0x([0-9a-f]{1,})$" description {{ There are no more pre-allocated buffers available to handle unsolicited buffers. }} action {{ Ensure this port is not being managed by multiple ports. }} class: software sl_severity: error refcode: "" message: lpfc_printf_log KERN_ERR "Ring %d handler: Failed to allocate iocb Rctl x%x Type x%x received\n" regex lpfc_printf_log "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):([-]\?[0-9]{1,}) Ring ([-]\?[0-9]{1,}) handler: Failed to allocate iocb Rctl x([0-9a-f]{1,}) Type x([0-9a-f]{1,}) received$" description {{ The driver was unable to allocate memory to send a query config mailbox command }} action {{ None required. }} class: software sl_severity: error refcode: "" message: lpfc_printf_log KERN_ERR "Ring %d handler: portRspPut %d is bigger than rsp ring %d\n" regex lpfc_printf_log "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):([-]\?[0-9]{1,}) Ring ([-]\?[0-9]{1,}) handler: portRspPut ([-]\?[0-9]{1,}) is bigger than rsp ring ([-]\?[0-9]{1,})$" description {{ The port rsp ring put index is larger than the size of the rsp ring. }} action {{ This error could indicate a software driver, firmware or hardware problem. Report these errors to Technical Support. }} class: unknown sl_severity: error refcode: "" message: lpfc_printf_log KERN_ERR "Ring %d handler: unexpected ASYNC_STATUS evt_code 0x%x\n" regex lpfc_printf_log "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):([-]\?[0-9]{1,}) Ring ([-]\?[0-9]{1,}) handler: unexpected ASYNC_STATUS evt_code 0x([0-9a-f]{1,})$" description {{ The HBA received an asynchronous event that was not a temperature event. }} action {{ None required. }} class: hardware sl_severity: error refcode: "" message: lpfc_printf_log KERN_ERR "Ring %d handler: unexpected completion IoTag x%x Data: x%x x%x x%x x%x\n" regex lpfc_printf_log "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):([-]\?[0-9]{1,}) Ring ([-]\?[0-9]{1,}) handler: unexpected completion IoTag x([0-9a-f]{1,}) Data: x([0-9a-f]{1,}) x([0-9a-f]{1,}) x([0-9a-f]{1,}) x([0-9a-f]{1,})$" description {{ The driver could not find a matching command for the completion received on the specified ring. DATA: (1) ulpStatus (2) ulpWord[4] (3) ulpCommand (4) ulpContext }} action {{ This error could indicate a firmware or hardware problem. Report these errors to Technical Support. }} class: unknown sl_severity: error refcode: "" message: lpfc_printf_log KERN_ERR "Ring %d handler: unexpected Rctl x%x Type x%x received\n" regex lpfc_printf_log "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):([-]\?[0-9]{1,}) Ring ([-]\?[0-9]{1,}) handler: unexpected Rctl x([0-9a-f]{1,}) Type x([0-9a-f]{1,}) received$" description {{ The Rctl/Type of a received frame did not match any for the configured masks for the specified ring. }} action {{ This error could indicate a software driver, firmware or hardware problem. Report these errors to Technical Support. }} class: unknown sl_severity: error refcode: "" message: lpfc_printf_log KERN_ERR "Ring %d issue: portCmdGet %d is bigger than cmd ring %d\n" regex lpfc_printf_log "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):([-]\?[0-9]{1,}) Ring ([-]\?[0-9]{1,}) issue: portCmdGet ([-]\?[0-9]{1,}) is bigger than cmd ring ([-]\?[0-9]{1,})$" description {{ The port cmd ring get index is greater than the size of cmd ring. }} action {{ This error could indicate a software driver, firmware or hardware problem. Report these errors to Technical Support. }} class: unknown sl_severity: error refcode: "" message: lpfc_printf_log KERN_ERR "RQ_CREATE mailbox failed with status x%x add_status x%x, mbx status x%x\n" regex lpfc_printf_log "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):([-]\?[0-9]{1,}) RQ_CREATE mailbox failed with status x([0-9a-f]{1,}) add_status x([0-9a-f]{1,}), mbx status x([0-9a-f]{1,})$" description {{ The mailbox command sent to create the receive queue has failed. }} action {{ None required. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_log KERN_ERR "RQ_DESTROY mailbox failed with status x%x add_status x%x, mbx status x%x\n" regex lpfc_printf_log "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):([-]\?[0-9]{1,}) RQ_DESTROY mailbox failed with status x([0-9a-f]{1,}) add_status x([0-9a-f]{1,}), mbx status x([0-9a-f]{1,})$" description {{ The mailbox command sent to delete the work queue has failed. }} action {{ None required. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_log KERN_WARNING "Rsp Ring %d error: IOCB Data: x%x x%x x%x x%x x%x x%x x%x x%x\n" regex lpfc_printf_log "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):([-]\?[0-9]{1,}) Rsp Ring ([-]\?[0-9]{1,}) error: IOCB Data: x([0-9a-f]{1,}) x([0-9a-f]{1,}) x([0-9a-f]{1,}) x([0-9a-f]{1,}) x([0-9a-f]{1,}) x([0-9a-f]{1,}) x([0-9a-f]{1,}) x([0-9a-f]{1,})$" description {{ An IOCB error has occurred on the specified ring. DATA: (1) ulpWord[0] (2) ulpWord[1] (3) ulpWord[2] (4) ulpWord[3] (5) ulpWord[4] (6) ulpWord[5] (7) irsp+6 (8) irsp+7 }} action {{ If the problem persists, check the targets. If the targets are okay, report the error to Technical Support. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_log KERN_INFO "Rsp Ring %d error: IOCB Data: x%x x%x x%x x%x x%x x%x x%x x%x x%x x%x x%x x%x x%x x%x x%x x%x\n" regex lpfc_printf_log "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):([-]\?[0-9]{1,}) Rsp Ring ([-]\?[0-9]{1,}) error: IOCB Data: x([0-9a-f]{1,}) x([0-9a-f]{1,}) x([0-9a-f]{1,}) x([0-9a-f]{1,}) x([0-9a-f]{1,}) x([0-9a-f]{1,}) x([0-9a-f]{1,}) x([0-9a-f]{1,}) x([0-9a-f]{1,}) x([0-9a-f]{1,})$" description {{ The firmware has returned an error for this IOCB. DATA: (1) (2) }} action {{ No action needed, informational. }} class: firmware type: info refcode: "" message: lpfc_printf_log KERN_ERR "SLI4 Adapter Hardware Error Data: x%x x%x\n" regex lpfc_printf_log "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):([-]\?[0-9]{1,}) SLI4 Adapter Hardware Error Data: x([0-9a-f]{1,}) x([0-9a-f]{1,})$" description {{ The HBA has encountered an unrecoverable error. }} action {{ Use hbacmd to retrieve a dump file. }} class: hardware sl_severity: error refcode: "" message: lpfc_printf_log KERN_ERR "SLI_CONFIG_SPECIAL mailbox failed with status x%x\n" regex lpfc_printf_log "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):([-]\?[0-9]{1,}) SLI_CONFIG_SPECIAL mailbox failed with status x([0-9a-f]{1,})$" description {{ Mailbox command failed. }} action {{ Ensure the adapter’s firmware is current. Unload and reload the driver. }} class: firmware sl_severity: error refcode: "" message: lpfc_printf_log KERN_ERR "SLI_FUNCTION_RESET mailbox failed with status x%x add_status x%x, mbx status x%x\n" regex lpfc_printf_log "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):([-]\?[0-9]{1,}) SLI_FUNCTION_RESET mailbox failed with status x([0-9a-f]{1,}) add_status x([0-9a-f]{1,}), mbx status x([0-9a-f]{1,})$" description {{ Mailbox command failed. }} action {{ Reset the HBA. }} class: hardware sl_severity: error refcode: "" message: lpfc_printf_log KERN_ERR "Slow-path CQ identifier (%d) does not exist:\n" regex lpfc_printf_log "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):([-]\?[0-9]{1,}) Slow-path CQ identifier \\(([-]\?[0-9]{1,})\\) does not exist:$" description {{ The Completion Queue ID passed in the Event Queue entry does not reference a valid completion queue. }} action {{ None required. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_log KERN_INFO "Slow-path wqe consume event carries miss-matched qid: wcqe-qid=x%x, sp-qid=x%x\n" regex lpfc_printf_log "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):([-]\?[0-9]{1,}) Slow-path wqe consume event carries miss-matched qid: wcqe-qid=x([0-9a-f]{1,}), sp-qid=x([0-9a-f]{1,})$" description {{ The consumed entry does not have the slow path’s queueID. }} action {{ No action needed, informational. }} class: software type: info refcode: "" message: lpfc_printf_log KERN_ERR "The lpfc_dmabuf allocation failed\n" regex lpfc_printf_log "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):([-]\?[0-9]{1,}) The lpfc_dmabuf allocation failed$" description {{ The asynchronous link event handler could not allocate a mailbox command to issue the READ_LA (read link attention) mailbox command. }} action {{ None required. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_log KERN_ERR "The mboxq allocation failed\n" regex lpfc_printf_log "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):([-]\?[0-9]{1,}) The mboxq allocation failed$" description {{ The asynchronous link event handler could not allocate a mailbox command to issue the READ_LA (read link attention) mailbox command. }} action {{ None required. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_log KERN_ERR "The mbuf allocation failed\n" regex lpfc_printf_log "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):([-]\?[0-9]{1,}) The mbuf allocation failed$" description {{ The asynchronous link event handler could not allocate DMA-able memory for the READ_LA mailbox command. }} action {{ None required. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_log KERN_ERR "There is pending active mailbox cmd\n" regex lpfc_printf_log "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):([-]\?[0-9]{1,}) There is pending active mailbox cmd$" description {{ The mailbox commands have overlapped. This command should have been added to the mailbox queue. }} action {{ None required. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_log KERN_ERR "The SLI4 DCBX asynchronous event is not handled yet\n" regex lpfc_printf_log "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):([-]\?[0-9]{1,}) The SLI4 DCBX asynchronous event is not handled yet$" description {{ The SLI-4 DCBX asynchronous event is not handled yet. }} action {{ None required. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_log KERN_ERR "Unable to allocate memory for issuing MBOX_CONFIG_MSI command\n" regex lpfc_printf_log "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):([-]\?[0-9]{1,}) Unable to allocate memory for issuing MBOX_CONFIG_MSI command$" description {{ Mailbox memory pool allocation error. }} action {{ None required. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_log KERN_ERR "Unable to allocate memory for issuing NOP mailbox command\n" regex lpfc_printf_log "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):([-]\?[0-9]{1,}) Unable to allocate memory for issuing NOP mailbox command$" description {{ Memory allocation for this mailbox command has failed. }} action {{ None required. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_log KERN_ERR "Unable to allocate memory for issuing SLI_CONFIG_SPECIAL mailbox command\n" regex lpfc_printf_log "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):([-]\?[0-9]{1,}) Unable to allocate memory for issuing SLI_CONFIG_SPECIAL mailbox command$" description {{ Mailbox memory pool allocation error. }} action {{ None required. }} class: unknown sl_severity: warning refcode: "" message: lpfc_printf_log KERN_ERR "Unable to allocate memory for issuing SLI_FUNCTION_RESET mailbox command\n" regex lpfc_printf_log "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):([-]\?[0-9]{1,}) Unable to allocate memory for issuing SLI_FUNCTION_RESET mailbox command$" description {{ Mailbox memory pool allocation error. }} action {{ None required. }} class: unknown sl_severity: warning refcode: "" message: lpfc_printf_log KERN_ERR "Unable to deregister pages from HBA: %x\n" regex lpfc_printf_log "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):([-]\?[0-9]{1,}) Unable to deregister pages from HBA: ([0-9a-f]{1,})$" description {{ The SGL pages could not be unregistered from the firmware. }} action {{ None required. }} class: firmware sl_severity: warning refcode: "" message: lpfc_printf_log KERN_ERR "Unable to select SLI-3. Not supported by adapter.\n" regex lpfc_printf_log "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):([-]\?[0-9]{1,}) Unable to select SLI-3\\. Not supported by adapter\\.$" description {{ The HBA is not capable of operating in a given mode. }} action {{ SLI-3 mode is only available on some HBAs. Do not attempt to force the SLI mode to 3 on HBAs that do not support SLI-3 mode. This is an informational message. HBAs that do not support SLI-3 will be configured to run in SLI-2 mode, but it is recommended to use the auto setting (0). }} class: software sl_severity: error refcode: "" message: lpfc_printf_log KERN_ERR "Unknown FCoE event type 0x%x event tag 0x%x\n" regex lpfc_printf_log "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):([-]\?[0-9]{1,}) Unknown FCoE event type 0x([0-9a-f]{1,}) event tag 0x([0-9a-f]{1,})$" description {{ The firmware has detected an unknown FCoE event. }} action {{ Check the FCoE switch configuration and the HBA DCBX mode. }} class: software sl_severity: error refcode: "" message: lpfc_printf_log KERN_ERR "Unknown IOCB command Data: x%x x%x x%x x%x\n" regex lpfc_printf_log "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):([-]\?[0-9]{1,}) Unknown IOCB command Data: x([0-9a-f]{1,}) x([0-9a-f]{1,}) x([0-9a-f]{1,}) x([0-9a-f]{1,})$" description {{ Received an unknown IOCB command completion. DATA: (1) ulpCommand (2) ulpStatus (3) ulpIoTag (4) ulpContext }} action {{ This error could indicate a software driver or firmware problem. If these problems persist, report these errors to Technical Support. }} class: software sl_severity: error refcode: "" message: lpfc_printf_log KERN_ERR "Unknown IOCB command Data: x%x, x%x x%x x%x x%x\n" regex lpfc_printf_log "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):([-]\?[0-9]{1,}) Unknown IOCB command Data: x([0-9a-f]{1,}), x([0-9a-f]{1,}) x([0-9a-f]{1,}) x([0-9a-f]{1,}) x([0-9a-f]{1,})$" description {{ eceived an unknown IOCB command completion. DATA: (1) type (2) ulpCommand (3) ulpStatus (4) ulpIoTag (5) ulpContext }} action {{ This error could indicate a software driver or firmware problem. If these problems persist, report these errors to Technical Support. }} class: software sl_severity: error refcode: "" message: lpfc_printf_log KERN_ERR "Unrecognized lpfc_sli_mode parameter: %d.\n" regex lpfc_printf_log "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):([-]\?[0-9]{1,}) Unrecognized lpfc_sli_mode parameter: ([-]\?[0-9]{1,})\\.$" description {{ The user has attempted to set the SLI mode to an invalid value. The only valid values for the SLI mode are 0, 2, and 3. DATA: (1) lpfc_sli_mode }} action {{ The lpfc_sli_mode driver parameter setting must be corrected. Valid values are 0, 2, and 3. }} class: software sl_severity: error refcode: "" message: lpfc_printf_log KERN_ERR "UNREG_FCFI issue mbox failed\n" regex lpfc_printf_log "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):([-]\?[0-9]{1,}) UNREG_FCFI issue mbox failed$" description {{ Could not issue the UNREG_FCFI mailbox command. }} action {{ None required. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_log KERN_ERR "UNREG_FCFI mbox allocation failed HBA state x%x\n" regex lpfc_printf_log "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):([-]\?[0-9]{1,}) UNREG_FCFI mbox allocation failed HBA state x([0-9a-f]{1,})$" description {{ allocation for the UNREG_FCFI mailbox command has failed. }} action {{ None required. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_log KERN_ERR "UNREG_FCFI mbox allocation failed\n" regex lpfc_printf_log "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):([-]\?[0-9]{1,}) UNREG_FCFI mbox allocation failed$" description {{ Failed to allocate mailbox memory. }} action {{ None required. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_log KERN_ERR "UNREG_FCFI mbxStatus error x%x HBA state x%x\n" regex lpfc_printf_log "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):([-]\?[0-9]{1,}) UNREG_FCFI mbxStatus error x([0-9a-f]{1,}) HBA state x([0-9a-f]{1,})$" description {{ The Unregister FCFI mailbox failed. }} action {{ None required. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_log KERN_ERR "Unregister FCFI command failed status %d, mbxStatus x%x\n" regex lpfc_printf_log "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):([-]\?[0-9]{1,}) Unregister FCFI command failed status ([-]\?[0-9]{1,}), mbxStatus x([0-9a-f]{1,})$" description {{ The driver was unable to unregister the FCFI from the firmware. }} action {{ None required. }} class: unknown sl_severity: warning refcode: "" message: lpfc_printf_log KERN_ERR "UNREG_VFI issue mbox failed rc x%x HBA state x%x\n" regex lpfc_printf_log "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):([-]\?[0-9]{1,}) UNREG_VFI issue mbox failed rc x([0-9a-f]{1,}) HBA state x([0-9a-f]{1,})$" description {{ Could not issue the UNREG_VFI mailbox command. }} action {{ None required. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_log KERN_ERR "UNREG_VFI mbox allocation failed HBA state x%x\n" regex lpfc_printf_log "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):([-]\?[0-9]{1,}) UNREG_VFI mbox allocation failed HBA state x([0-9a-f]{1,})$" description {{ Could not allocate memory for UNREG_VFI mailbox command. }} action {{ None required. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_log KERN_ERR "UNREG_VFI mbxStatus error x%x HBA state x%x\n" regex lpfc_printf_log "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):([-]\?[0-9]{1,}) UNREG_VFI mbxStatus error x([0-9a-f]{1,}) HBA state x([0-9a-f]{1,})$" description {{ The Unregister VFI mailbox command failed. }} action {{ None required. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_log KERN_ERR "Unsupported CQ count. (%d)\n" regex lpfc_printf_log "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):([-]\?[0-9]{1,}) Unsupported CQ count\\. \\(([-]\?[0-9]{1,})\\)$" description {{ Cannot create an completion queue of this size. }} action {{ None required. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_log KERN_ERR "Unsupported EQ count. (%d)\n" regex lpfc_printf_log "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):([-]\?[0-9]{1,}) Unsupported EQ count\\. \\(([-]\?[0-9]{1,})\\)$" description {{ Cannot create an event queue of this size. }} action {{ None required. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_log KERN_ERR "Unsupported MQ count. (%d)\n" regex lpfc_printf_log "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):([-]\?[0-9]{1,}) Unsupported MQ count\\. \\(([-]\?[0-9]{1,})\\)$" description {{ Cannot create MQ of this size. }} action {{ None required. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_log KERN_ERR "Unsupported RQ count. (%d)\n" regex lpfc_printf_log "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):([-]\?[0-9]{1,}) Unsupported RQ count\\. \\(([-]\?[0-9]{1,})\\)$" description {{ The receive queue ring can only be 512, 1024, 2048, or 4096. }} action {{ None required. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_log KERN_INFO "Vital Product Data: x%x x%x x%x x%x\n" regex lpfc_printf_log "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):([-]\?[0-9]{1,}) Vital Product Data: x([0-9a-f]{1,}) x([0-9a-f]{1,}) x([0-9a-f]{1,}) x([0-9a-f]{1,})$" description {{ Vital product data (VPD) contained in the HBA flash. DATA: (1) vpd[0] (2) vpd[1] (3) vpd[2] (4) vpd[3] }} action {{ No action needed, informational. }} class: software type: info refcode: "" message: lpfc_printf_log KERN_WARNING "VPD not present on adapter, mbxCmd x%x DUMP VPD, mbxStatus x%x\n" regex lpfc_printf_log "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):([-]\?[0-9]{1,}) VPD not present on adapter, mbxCmd x([0-9a-f]{1,}) DUMP VPD, mbxStatus x([0-9a-f]{1,})$" description {{ The DUMP_VPD mailbox command failed. }} action {{ This error could indicate a hardware or firmware problem. If the problem persists, report the error to Technical Support. }} class: unknown sl_severity: warning refcode: "" message: lpfc_printf_log KERN_ERR "Wakeup on signal: rc=x%x\n" regex lpfc_printf_log "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):([-]\?[0-9]{1,}) Wakeup on signal: rc=x([0-9a-f]{1,})$" description {{ A signal other than the LPFC_DATA_READY was received on the worker thread. }} action {{ Unload and reload the driver. }} class: software sl_severity: error refcode: "" message: lpfc_printf_log KERN_ERR "WQ_CREATE mailbox failed with status x%x add_status x%x, mbx status x%x\n" regex lpfc_printf_log "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):([-]\?[0-9]{1,}) WQ_CREATE mailbox failed with status x([0-9a-f]{1,}) add_status x([0-9a-f]{1,}), mbx status x([0-9a-f]{1,})$" description {{ The mailbox command sent to create the work queue has failed. }} action {{ None required. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_log KERN_ERR "WQ_DESTROY mailbox failed with status x%x add_status x%x, mbx status x%x\n" regex lpfc_printf_log "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):([-]\?[0-9]{1,}) WQ_DESTROY mailbox failed with status x([0-9a-f]{1,}) add_status x([0-9a-f]{1,}), mbx status x([0-9a-f]{1,})$" description {{ The mailbox command sent to delete the work queue has failed. }} action {{ None required. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_vlog KERN_INFO "Abort outstanding I/O on NPort x%x Data: x%x x%x x%x\n" regex lpfc_printf_vlog "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):\\(([-]\?[0-9]{1,})\\):([-]\?[0-9]{1,}) Abort outstanding I/O on NPort x([0-9a-f]{1,}) Data: x([0-9a-f]{1,}) x([0-9a-f]{1,}) x([0-9a-f]{1,})$" description {{ All outstanding I/Os are cleaned up on the specified remote NPort. DATA: (1) nlp_flag (2) nlp_state (3) nlp_rpi }} action {{ No action needed, informational. }} class: software type: info refcode: "" message: lpfc_printf_vlog KERN_INFO "ACC to LOGO completes to NPort x%x Data: x%x x%x x%x\n" regex lpfc_printf_vlog "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):\\(([-]\?[0-9]{1,})\\):([-]\?[0-9]{1,}) ACC to LOGO completes to NPort x([0-9a-f]{1,}) Data: x([0-9a-f]{1,}) x([0-9a-f]{1,}) x([0-9a-f]{1,})$" description {{ The driver received a LOGO from a remote NPort and successfully issued an ACC response. DATA: (1) nlp_flag (2) nlp_state (3) nlp_rpi }} action {{ No action needed, informational. }} class: software type: info refcode: "" message: lpfc_printf_vlog KERN_INFO "ADISC completes to NPort x%x Data: x%x x%x x%x x%x x%x\n" regex lpfc_printf_vlog "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):\\(([-]\?[0-9]{1,})\\):([-]\?[0-9]{1,}) ADISC completes to NPort x([0-9a-f]{1,}) Data: x([0-9a-f]{1,}) x([0-9a-f]{1,}) x([0-9a-f]{1,}) x([0-9a-f]{1,}) x([0-9a-f]{1,})$" description {{ The HBA performed a ADISC into a remote NPort. DATA: (1) ulpStatus (2) ulpWord[4] (3) ulpTimeout (4) disc (5) num_disc_nodes }} action {{ No action needed, informational. }} class: software type: info refcode: "" message: lpfc_printf_vlog KERN_INFO "Allocation request of %d command buffers did not succeed. Allocated %d buffers.\n" regex lpfc_printf_vlog "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):\\(([-]\?[0-9]{1,})\\):([-]\?[0-9]{1,}) Allocation request of ([-]\?[0-9]{1,}) command buffers did not succeed\\. Allocated ([-]\?[0-9]{1,}) buffers\\.$" description {{ The allocation request for the specified command buffers did not succeed. However,the specified number of buffers has been allocated. }} action {{ No action needed, informational. }} class: software type: info refcode: "" message: lpfc_printf_vlog KERN_INFO "Allocation request of %d command buffers will exceed max of %d. Reducing allocation request to %d.\n" regex lpfc_printf_vlog "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):\\(([-]\?[0-9]{1,})\\):([-]\?[0-9]{1,}) Allocation request of ([-]\?[0-9]{1,}) command buffers will exceed max of ([-]\?[0-9]{1,})\\. Reducing allocation request to ([-]\?[0-9]{1,})\\.$" description {{ The number of command buffers requested will exceed the maximum so a smaller quantity will be allocated. }} action {{ No action needed, informational. }} class: software type: info refcode: "" message: lpfc_printf_vlog KERN_ERR "An FLOGI ELS command x%x was received from DID x%x in Loop Mode\n" regex lpfc_printf_vlog "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):\\(([-]\?[0-9]{1,})\\):([-]\?[0-9]{1,}) An FLOGI ELS command x([0-9a-f]{1,}) was received from DID x([0-9a-f]{1,}) in Loop Mode$" description {{ While in Loop Mode an unknown or unsupported ELS command was received. }} action {{ Check device DID. }} class: software sl_severity: error refcode: "" message: lpfc_printf_vlog KERN_INFO "At limitation of %d preallocated command buffers\n" regex lpfc_printf_vlog "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):\\(([-]\?[0-9]{1,})\\):([-]\?[0-9]{1,}) At limitation of ([-]\?[0-9]{1,}) preallocated command buffers$" description {{ The maximum number of command buffers have already been allocated. }} action {{ No action needed, informational. }} class: software type: info refcode: "" message: lpfc_printf_vlog KERN_ERR "Bus Reset on target %d failed\n" regex lpfc_printf_vlog "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):\\(([-]\?[0-9]{1,})\\):([-]\?[0-9]{1,}) Bus Reset on target ([-]\?[0-9]{1,}) failed$" description {{ The bus reset for the specified target failed. }} action {{ None required. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_vlog KERN_INFO "Cancel Discovery Timer state x%x Data: x%x x%x x%x\n" regex lpfc_printf_vlog "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):\\(([-]\?[0-9]{1,})\\):([-]\?[0-9]{1,}) Cancel Discovery Timer state x([0-9a-f]{1,}) Data: x([0-9a-f]{1,}) x([0-9a-f]{1,}) x([0-9a-f]{1,})$" description {{ Cancel the device discovery / RSCN rescue timer. DATA: (1) fc_flag (2) fc_plogi_cnt (3) fc_adisc_cnt }} action {{ No action needed, informational. }} class: software type: info refcode: "" message: lpfc_printf_vlog KERN_ERR "Cannot issue NameServer login\n" regex lpfc_printf_vlog "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):\\(([-]\?[0-9]{1,})\\):([-]\?[0-9]{1,}) Cannot issue NameServer login$" description {{ Could not issue an ELS PLOGI to the nameserver DID. }} action {{ Check the port connection and the switch configuration. }} class: unknown sl_severity: error refcode: "" message: lpfc_printf_vlog KERN_ERR "Cannot issue Register Fabric login: Err %d\n" regex lpfc_printf_vlog "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):\\(([-]\?[0-9]{1,})\\):([-]\?[0-9]{1,}) Cannot issue Register Fabric login: Err ([-]\?[0-9]{1,})$" description {{ Could not issue the fabric reg login, the err value is unique for each possible failure. }} action {{ None required. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_vlog KERN_ERR "Cannot Register NameServer login\n" regex lpfc_printf_vlog "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):\\(([-]\?[0-9]{1,})\\):([-]\?[0-9]{1,}) Cannot Register NameServer login$" description {{ Either a memory allocation issue or an invalid parameter was sent to the REG_LOGIN. }} action {{ At least one message (0142 0121 0133 0134 0135) should precede this message. }} class: software sl_severity: error refcode: "" message: lpfc_printf_vlog KERN_INFO "Cleanup node for NPort x%x Data: x%x x%x x%x\n" regex lpfc_printf_vlog "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):\\(([-]\?[0-9]{1,})\\):([-]\?[0-9]{1,}) Cleanup node for NPort x([0-9a-f]{1,}) Data: x([0-9a-f]{1,}) x([0-9a-f]{1,}) x([0-9a-f]{1,})$" description {{ The driver node table entry for a remote NPort was removed. DATA: (1) nlp_flag (2) nlp_state (3) nlp_rpi }} action {{ No action needed, informational. }} class: software type: info refcode: "" message: lpfc_printf_vlog KERN_ERR "CLEAR_LA mbxStatus error x%x hba state x%x\n" regex lpfc_printf_vlog "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):\\(([-]\?[0-9]{1,})\\):([-]\?[0-9]{1,}) CLEAR_LA mbxStatus error x([0-9a-f]{1,}) hba state x([0-9a-f]{1,})$" description {{ The driver issued a CLEAR_LA mbox command to the HBA that failed. }} action {{ This error could indicate a firmware or hardware problem. Report these errors to Technical Support. }} class: unknown sl_severity: error refcode: "" message: lpfc_printf_vlog KERN_ERR "CLEAR LA timeout\n" regex lpfc_printf_vlog "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):\\(([-]\?[0-9]{1,})\\):([-]\?[0-9]{1,}) CLEAR LA timeout$" description {{ The driver issued a CLEAR_LA that never completed. }} action {{ None required. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_vlog KERN_ERR "CONFIG_LINK bad hba state x%x\n" regex lpfc_printf_vlog "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):\\(([-]\?[0-9]{1,})\\):([-]\?[0-9]{1,}) CONFIG_LINK bad hba state x([0-9a-f]{1,})$" description {{ A CONFIG_LINK mbox command completed and the driver was not in the right state. }} action {{ Software driver error. If this problem persists, report these errors to Technical Support. }} class: software sl_severity: error refcode: "" message: lpfc_printf_vlog KERN_ERR "CONFIG_LINK mbxStatus error x%x HBA state x%x\n" regex lpfc_printf_vlog "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):\\(([-]\?[0-9]{1,})\\):([-]\?[0-9]{1,}) CONFIG_LINK mbxStatus error x([0-9a-f]{1,}) HBA state x([0-9a-f]{1,})$" description {{ The driver issued a CONFIG_LINK mbox command to the HBA that failed. }} action {{ This error could indicate a firmware or hardware problem. Report these errors to Technical Support. }} class: unknown sl_severity: error refcode: "" message: lpfc_printf_vlog KERN_INFO "Continue discovery with %d ADISCs to go Data: x%x x%x x%x\n" regex lpfc_printf_vlog "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):\\(([-]\?[0-9]{1,})\\):([-]\?[0-9]{1,}) Continue discovery with ([-]\?[0-9]{1,}) ADISCs to go Data: x([0-9a-f]{1,}) x([0-9a-f]{1,}) x([0-9a-f]{1,})$" description {{ A device discovery is in progress. DATA: (1) fc_adisc_cnt (2) fc_flag (3) phba->hba_state }} action {{ No action needed, informational. }} class: software type: info refcode: "" message: lpfc_printf_vlog KERN_INFO "Continue discovery with %d PLOGIs to go Data: x%x x%x x%x\n" regex lpfc_printf_vlog "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):\\(([-]\?[0-9]{1,})\\):([-]\?[0-9]{1,}) Continue discovery with ([-]\?[0-9]{1,}) PLOGIs to go Data: x([0-9a-f]{1,}) x([0-9a-f]{1,}) x([0-9a-f]{1,})$" description {{ Device discovery is in progress. DATA: (1) fc_plogi_cnt (2) fc_flag (3) phba->hba_state }} action {{ No action needed, informational. }} class: software type: info refcode: "" message: lpfc_printf_vlog KERN_ERR "Could not issue unreg_did (default rpis) status %d\n" regex lpfc_printf_vlog "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):\\(([-]\?[0-9]{1,})\\):([-]\?[0-9]{1,}) Could not issue unreg_did \\(default rpis\\) status ([-]\?[0-9]{1,})$" description {{ Attempt to unregister rpi failed. }} action {{ Software driver error. If this problem persists, report these errors to Technical Support. }} class: software sl_severity: error refcode: "" message: lpfc_printf_vlog KERN_ERR "Could not issue unreg_login(all_rpis) status %d\n" regex lpfc_printf_vlog "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):\\(([-]\?[0-9]{1,})\\):([-]\?[0-9]{1,}) Could not issue unreg_login\\(all_rpis\\) status ([-]\?[0-9]{1,})$" description {{ The unreg_login cannot be issued. }} action {{ None required. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_vlog KERN_ERR "Could not issue unreg_vpi\n" regex lpfc_printf_vlog "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):\\(([-]\?[0-9]{1,})\\):([-]\?[0-9]{1,}) Could not issue unreg_vpi$" description {{ Driver attempt to unregister vpi failed. }} action {{ Software driver error. If this problem persists, report these errors to Technical Support. }} class: software sl_severity: error refcode: "" message: lpfc_printf_vlog KERN_ERR "Create VPORT failed. Cannot get sparam\n" regex lpfc_printf_vlog "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):\\(([-]\?[0-9]{1,})\\):([-]\?[0-9]{1,}) Create VPORT failed\\. Cannot get sparam$" description {{ The port could not be created because it could not be initialized possibly due to unavailable resources. }} action {{ Software driver error. If this problem persists, report these errors to Technical Support. }} class: software sl_severity: error refcode: "" message: lpfc_printf_vlog KERN_ERR "Create VPORT failed. Duplicate WWN on HBA\n" regex lpfc_printf_vlog "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):\\(([-]\?[0-9]{1,})\\):([-]\?[0-9]{1,}) Create VPORT failed\\. Duplicate WWN on HBA$" description {{ The port could not be created because it would duplicate an existing WWNN HBA address. The resources for the port had to be discarded. }} action {{ Provide a WWN that is unique. }} class: software sl_severity: error refcode: "" message: lpfc_printf_vlog KERN_ERR "Create VPORT failed. Invalid WWN format\n" regex lpfc_printf_vlog "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):\\(([-]\?[0-9]{1,})\\):([-]\?[0-9]{1,}) Create VPORT failed\\. Invalid WWN format$" description {{ The port could not be created due to an invalid WWNN or WWPN format. }} action {{ Provide a valid WWN when creating Vports. }} class: software sl_severity: error refcode: "" message: lpfc_printf_vlog KERN_ERR "Create VPORT Interrupted.\n" regex lpfc_printf_vlog "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):\\(([-]\?[0-9]{1,})\\):([-]\?[0-9]{1,}) Create VPORT Interrupted\\.$" description {{ The port creation process was unexpectedly interrupted at a critical time and the operation was unsuccessful. }} action {{ The process was interrupted while creating a VPort. Retry the command. }} class: software sl_severity: error refcode: "" message: lpfc_printf_vlog KERN_WARNING "Create vport work array FAILED: cannot do scsi_host_get\n" regex lpfc_printf_vlog "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):\\(([-]\?[0-9]{1,})\\):([-]\?[0-9]{1,}) Create vport work array FAILED: cannot do scsi_host_get$" description {{ The driver was unable to get a reference to a SCSI host. }} action {{ Software driver error. If this problem persists, report these errors to Technical Support. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_vlog KERN_INFO "CT Request completes, latt %d, ulpStatus x%x CmdRsp x%x, Context x%x, Tag x%x\n" regex lpfc_printf_vlog "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):\\(([-]\?[0-9]{1,})\\):([-]\?[0-9]{1,}) CT Request completes, latt ([-]\?[0-9]{1,}), ulpStatus x([0-9a-f]{1,}) CmdRsp x([0-9a-f]{1,}), Context x([0-9a-f]{1,}), Tag x([0-9a-f]{1,})$" description {{ A RFT request that was sent to the fabric completed. DATA: (1) latt (2) ulpStatus (3) CmdRsp (4) Context (5) Tag }} action {{ No action needed, informational. }} class: software type: info refcode: "" message: lpfc_printf_vlog KERN_INFO "Deferred RSCN Data: x%x x%x x%x\n" regex lpfc_printf_vlog "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):\\(([-]\?[0-9]{1,})\\):([-]\?[0-9]{1,}) Deferred RSCN Data: x([0-9a-f]{1,}) x([0-9a-f]{1,}) x([0-9a-f]{1,})$" description {{ The driver has received multiple RSCNs and has deferred the processing of the most recent RSCN. DATA: (1) fc_rscn_id_cnt (2) fc_flag (3) hba_state }} action {{ No action needed, informational. }} class: software type: info refcode: "" message: lpfc_printf_vlog KERN_INFO "Device Discovery completes\n" regex lpfc_printf_vlog "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):\\(([-]\?[0-9]{1,})\\):([-]\?[0-9]{1,}) Device Discovery completes$" description {{ This indicates successful completion of device (re)discovery after a link up. }} action {{ No action needed, informational. }} class: software type: info refcode: "" message: lpfc_printf_vlog KERN_ERR "Device Discovery completion error\n" regex lpfc_printf_vlog "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):\\(([-]\?[0-9]{1,})\\):([-]\?[0-9]{1,}) Device Discovery completion error$" description {{ This indicates that an uncorrectable error was encountered during device (re)discovery after a link up. Fibre Channel devices will not be accessible if this message is displayed. }} action {{ Reboot the system. If the problem persists, report the error to Technical Support. Run with verbose mode on for more details. }} class: unknown sl_severity: error refcode: "" message: lpfc_printf_vlog KERN_ERR "Device Reset rport failure: rdata x%p\n" regex lpfc_printf_vlog "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):\\(([-]\?[0-9]{1,})\\):([-]\?[0-9]{1,}) Device Reset rport failure: rdata x(\\(null\\)|([0]{0,7}[0-9a-f]{1,}))$" description {{ The reset of the Rport failed. }} action {{ None required. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_vlog KERN_ERR "Discovery Mailbox error: state: 0x%x : %p %p\n" regex lpfc_printf_vlog "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):\\(([-]\?[0-9]{1,})\\):([-]\?[0-9]{1,}) Discovery Mailbox error: state: 0x([0-9a-f]{1,}) : (\\(null\\)|([0]{0,7}[0-9a-f]{1,})) (\\(null\\)|([0]{0,7}[0-9a-f]{1,}))$" description {{ Either the driver could not allocate resources or it could not send sparam_mbox or cfglink_mbox. DATA: (1) address of sparam_mbox command (2) address of cfglink_mbox command }} action {{ Attempt to unload and reload the driver when it is convenient. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_vlog KERN_ERR "Dropping received ELS cmd Data: x%x x%x x%x\n" regex lpfc_printf_vlog "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):\\(([-]\?[0-9]{1,})\\):([-]\?[0-9]{1,}) Dropping received ELS cmd Data: x([0-9a-f]{1,}) x([0-9a-f]{1,}) x([0-9a-f]{1,})$" description {{ The driver decided to drop an ELS Response ring entry. DATA: (1) ulpStatus (2) ulpWord[4] (3) ulpTimeout }} action {{ This error could indicate a software driver or firmware problem. If problems persist report these errors to Technical Support. }} class: software sl_severity: error refcode: "" message: lpfc_printf_vlog KERN_INFO "DSM in event x%x on NPort x%x in state %d Data: x%x\n" regex lpfc_printf_vlog "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):\\(([-]\?[0-9]{1,})\\):([-]\?[0-9]{1,}) DSM in event x([0-9a-f]{1,}) on NPort x([0-9a-f]{1,}) in state ([-]\?[0-9]{1,}) Data: x([0-9a-f]{1,})$" description {{ The driver Discovery State Machine is processing an event. DATA: (1) nlp_flag }} action {{ No action needed, informational. }} class: software type: info refcode: "" message: lpfc_printf_vlog KERN_INFO "DSM out state %d on NPort free\n" regex lpfc_printf_vlog "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):\\(([-]\?[0-9]{1,})\\):([-]\?[0-9]{1,}) DSM out state ([-]\?[0-9]{1,}) on NPort free$" description {{ The driver Discovery State Machine completed processing an event. DATA: (1) nlp_flag }} action {{ No action needed, informational. }} class: software type: info refcode: "" message: lpfc_printf_vlog KERN_INFO "DSM out state %d on NPort x%x Data: x%x\n" regex lpfc_printf_vlog "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):\\(([-]\?[0-9]{1,})\\):([-]\?[0-9]{1,}) DSM out state ([-]\?[0-9]{1,}) on NPort x([0-9a-f]{1,}) Data: x([0-9a-f]{1,})$" description {{ The driver Discovery State Machine completed processing an event. DATA: (1) nlp_flag }} action {{ No action needed, informational. }} class: software type: info refcode: "" message: lpfc_printf_vlog KERN_INFO "ELS cmd tag x%x completes Data: x%x x%x x%x\n" regex lpfc_printf_vlog "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):\\(([-]\?[0-9]{1,})\\):([-]\?[0-9]{1,}) ELS cmd tag x([0-9a-f]{1,}) completes Data: x([0-9a-f]{1,}) x([0-9a-f]{1,}) x([0-9a-f]{1,})$" description {{ The specific ELS command was completed by the firmware. DATA: (1) ulpStatus (2) ulpWord[4] (3) ulpTimeout }} action {{ No action needed, informational. }} class: software type: info refcode: "" message: lpfc_printf_vlog KERN_INFO "ELS command x%x received from NPORT x%x Data: x%x\n" regex lpfc_printf_vlog "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):\\(([-]\?[0-9]{1,})\\):([-]\?[0-9]{1,}) ELS command x([0-9a-f]{1,}) received from NPORT x([0-9a-f]{1,}) Data: x([0-9a-f]{1,})$" description {{ Received the specific ELS command from a remote NPort. DATA: (1) hba_state }} action {{ No action needed, informational. }} class: software type: info refcode: "" message: lpfc_printf_vlog KERN_INFO "ELS response tag x%x completes Data: x%x x%x x%x x%x x%x x%x x%x\n" regex lpfc_printf_vlog "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):\\(([-]\?[0-9]{1,})\\):([-]\?[0-9]{1,}) ELS response tag x([0-9a-f]{1,}) completes Data: x([0-9a-f]{1,}) x([0-9a-f]{1,}) x([0-9a-f]{1,}) x([0-9a-f]{1,}) x([0-9a-f]{1,}) x([0-9a-f]{1,}) x([0-9a-f]{1,})$" description {{ The specific ELS response was completed by the firmware. DATA: (1) ulpStatus (2) ulpWord[4] (3) ulptimeout (4) nlp_DID (5) nlp_flag (6) nlp_state (7) nlp_rpi }} action {{ No action needed, informational. }} class: firmware type: info refcode: "" message: lpfc_printf_vlog KERN_ERR "ELS rsp: Cannot issue reg_login for x%x Data: x%x x%x x%x\n" regex lpfc_printf_vlog "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):\\(([-]\?[0-9]{1,})\\):([-]\?[0-9]{1,}) ELS rsp: Cannot issue reg_login for x([0-9a-f]{1,}) Data: x([0-9a-f]{1,}) x([0-9a-f]{1,}) x([0-9a-f]{1,})$" description {{ REG_LOGIN mailbox command failed. DATA: (1) nlp_DID (2) nlp_state (3) nlp_flag (4) nlp_rpi }} action {{ None required. }} class: software sl_severity: error refcode: "" message: lpfc_printf_vlog KERN_ERR "ELS timeout Data: x%x x%x x%x x%x\n" regex lpfc_printf_vlog "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):\\(([-]\?[0-9]{1,})\\):([-]\?[0-9]{1,}) ELS timeout Data: x([0-9a-f]{1,}) x([0-9a-f]{1,}) x([0-9a-f]{1,}) x([0-9a-f]{1,})$" description {{ An ELS IOCB command was posted to a ring and did not complete within ULP timeout seconds. DATA: (1) elscmd (2) remote_id (3) ulpcommand (4) ulpIoTag }} action {{ If no ELS command is going through the adapter, reboot the system; If problem persists, contact Technical Support. }} class: unknown sl_severity: error refcode: "" message: lpfc_printf_vlog KERN_INFO "Fabric does not support NPIV - configuring single port mode.\n" regex lpfc_printf_vlog "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):\\(([-]\?[0-9]{1,})\\):([-]\?[0-9]{1,}) Fabric does not support NPIV - configuring single port mode\\.$" description {{ The fabric reports no support for NPIV upon FLOGI. }} action {{ No action needed, informational. }} class: software type: info refcode: "" message: lpfc_printf_vlog KERN_ERR "Failed to allocate init_vpi mailbox\n" regex lpfc_printf_vlog "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):\\(([-]\?[0-9]{1,})\\):([-]\?[0-9]{1,}) Failed to allocate init_vpi mailbox$" description {{ Failed to allocate init_vpi mailbox\n. }} action {{ None required. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_vlog KERN_ERR "Failed to allocate memory for ELS event\n" regex lpfc_printf_vlog "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):\\(([-]\?[0-9]{1,})\\):([-]\?[0-9]{1,}) Failed to allocate memory for ELS event$" description {{ Memory could not be allocated to send the ELS event to the FC transport. }} action {{ None required. }} class: software sl_severity: error refcode: "" message: lpfc_printf_vlog KERN_ERR "Failed to allocate memory for LOGO event\n" regex lpfc_printf_vlog "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):\\(([-]\?[0-9]{1,})\\):([-]\?[0-9]{1,}) Failed to allocate memory for LOGO event$" description {{ Memory could not be allocated to send the LOGO event to the FC transport. }} action {{ None required. }} class: software sl_severity: error refcode: "" message: lpfc_printf_vlog KERN_ERR "Failed to allocate memory for RSCN event\n" regex lpfc_printf_vlog "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):\\(([-]\?[0-9]{1,})\\):([-]\?[0-9]{1,}) Failed to allocate memory for RSCN event$" description {{ Memory could not be allocated to send the RSCN event to the management application. }} action {{ None required. }} class: software sl_severity: error refcode: "" message: lpfc_printf_vlog KERN_ERR "Failed to issue INIT_VPI mailbox command\n" regex lpfc_printf_vlog "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):\\(([-]\?[0-9]{1,})\\):([-]\?[0-9]{1,}) Failed to issue INIT_VPI mailbox command$" description {{ Failed to INIT_VPI. }} action {{ None required. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_vlog KERN_ERR "Failed to issue init_vpi mailbox\n" regex lpfc_printf_vlog "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):\\(([-]\?[0-9]{1,})\\):([-]\?[0-9]{1,}) Failed to issue init_vpi mailbox$" description {{ The driver was unable to send an initialize VPI mailbox command. }} action {{ None required. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_vlog KERN_WARNING "FAN timeout\n" regex lpfc_printf_vlog "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):\\(([-]\?[0-9]{1,})\\):([-]\?[0-9]{1,}) FAN timeout$" description {{ A link up event was received without the login bit set, so the driver waits E_D_TOV for the Fabric to send a FAN. If no FAN if received, a FLOGI will be sent after the timeout. }} action {{ None required. The driver recovers from this condition by issuing a FLOGI to the fabric. }} class: hardware sl_severity: warning refcode: "" message: lpfc_printf_vlog KERN_INFO "FARP-REQ received from DID x%x\n" regex lpfc_printf_vlog "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):\\(([-]\?[0-9]{1,})\\):([-]\?[0-9]{1,}) FARP-REQ received from DID x([0-9a-f]{1,})$" description {{ An unsolicited FARP request was received. }} action {{ No action needed, informational. }} class: software type: info refcode: "" message: lpfc_printf_vlog KERN_WARNING "FCP cmd x%x failed <%d/%d> status: x%x result: x%x Data: x%x x%x\n" regex lpfc_printf_vlog "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):\\(([-]\?[0-9]{1,})\\):([-]\?[0-9]{1,}) FCP cmd x([0-9a-f]{1,}) failed <([-]\?[0-9]{1,})/([-]\?[0-9]{1,})> status: x([0-9a-f]{1,}) result: x([0-9a-f]{1,}) Data: x([0-9a-f]{1,}) x([0-9a-f]{1,})$" description {{ The specified device failed an FCP command. DATA: (1) ulpContext (2) iotag }} action {{ Check the state of the target in question. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_vlog KERN_WARNING "FCP command x%x failed: x%x SNS x%x x%x Data: x%x x%x x%x x%x x%x\n" regex lpfc_printf_vlog "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):\\(([-]\?[0-9]{1,})\\):([-]\?[0-9]{1,}) FCP command x([0-9a-f]{1,}) failed: x([0-9a-f]{1,}) SNS x([0-9a-f]{1,}) x([0-9a-f]{1,}) Data: x([0-9a-f]{1,}) x([0-9a-f]{1,}) x([0-9a-f]{1,}) x([0-9a-f]{1,}) x([0-9a-f]{1,})$" description {{ The FCP command failed with a response error. DATA: (1) resp_info (2) scsi_status (3) ResId (4) SnsLen (5) RspLen (6)rspInfo3 }} action {{ Check the state of the target in question. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_vlog KERN_INFO "FCP command x%x residual overrun error. Data: x%x x%x\n" regex lpfc_printf_vlog "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):\\(([-]\?[0-9]{1,})\\):([-]\?[0-9]{1,}) FCP command x([0-9a-f]{1,}) residual overrun error\\. Data: x([0-9a-f]{1,}) x([0-9a-f]{1,})$" description {{ A residual overrun error has occurred while processing the specified FCP command. DATA: (1) request_bufflen (2) resid }} action {{ No action needed, informational. }} class: software type: info refcode: "" message: lpfc_printf_vlog KERN_INFO "FCP command x%x residual underrun converted to error Data: x%x x%x x%x\n" regex lpfc_printf_vlog "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):\\(([-]\?[0-9]{1,})\\):([-]\?[0-9]{1,}) FCP command x([0-9a-f]{1,}) residual underrun converted to error Data: x([0-9a-f]{1,}) x([0-9a-f]{1,}) x([0-9a-f]{1,})$" description {{ The driver converted this underrun condition to an error based on the underflow field in the SCSI command. DATA: (1) len (2) resid (3) underflow }} action {{ No action needed, informational. }} class: software type: info refcode: "" message: lpfc_printf_vlog KERN_INFO "FCP Read Check Error and Underrun Data: x%x x%x x%x x%x\n" regex lpfc_printf_vlog "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):\\(([-]\?[0-9]{1,})\\):([-]\?[0-9]{1,}) FCP Read Check Error and Underrun Data: x([0-9a-f]{1,}) x([0-9a-f]{1,}) x([0-9a-f]{1,}) x([0-9a-f]{1,})$" description {{ HBA reported under run from storage array. DATA: (1) vpi (2) fcpDI (3) res_id (4) fcpi_parm }} action {{ No action needed, informational. }} class: software type: info refcode: "" message: lpfc_printf_vlog KERN_WARNING "FCP Read Check Error Data: x%x x%x x%x x%x\n" regex lpfc_printf_vlog "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):\\(([-]\?[0-9]{1,})\\):([-]\?[0-9]{1,}) FCP Read Check Error Data: x([0-9a-f]{1,}) x([0-9a-f]{1,}) x([0-9a-f]{1,}) x([0-9a-f]{1,})$" description {{ The issued FCP command returned a read check error. DATA: (1) fcpDl (2) rspResId (3) fcpi_parm (4) cmd[0] }} action {{ Check the state of the target in question. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_vlog KERN_INFO "FCP Read Underrun, expected %d, residual %d Data: x%x x%x x%x\n" regex lpfc_printf_vlog "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):\\(([-]\?[0-9]{1,})\\):([-]\?[0-9]{1,}) FCP Read Underrun, expected ([-]\?[0-9]{1,}), residual ([-]\?[0-9]{1,}) Data: x([0-9a-f]{1,}) x([0-9a-f]{1,}) x([0-9a-f]{1,})$" description {{ An FCP device provided less data than was requested. DATA: (1) fcpi_parm (2) cmnd[0] (3) underflow }} action {{ No action needed, informational. }} class: software type: info refcode: "" message: lpfc_printf_vlog KERN_ERR "FDISC failed. (%d/%d)\n" regex lpfc_printf_vlog "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):\\(([-]\?[0-9]{1,})\\):([-]\?[0-9]{1,}) FDISC failed\\. \\(([-]\?[0-9]{1,})/([-]\?[0-9]{1,})\\)$" description {{ DATA: lsRjtError }} action {{ Reconfigure the switch to support more NPIV logins. If problem persists, contact Technical Support. }} class: unknown sl_severity: error refcode: "" message: lpfc_printf_vlog KERN_ERR "FDISC Failed (x%x).\n" regex lpfc_printf_vlog "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):\\(([-]\?[0-9]{1,})\\):([-]\?[0-9]{1,}) FDISC Failed \\(x([0-9a-f]{1,})\\)\\.$" description {{ DATA: lsRjtError }} action {{ Reconfigure the switch to support more NPIV logins. If problem persists, contact Technical Support. }} class: unknown sl_severity: error refcode: "" message: lpfc_printf_vlog KERN_INFO "FDMI Request Data: x%x x%x x%x\n" regex lpfc_printf_vlog "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):\\(([-]\?[0-9]{1,})\\):([-]\?[0-9]{1,}) FDMI Request Data: x([0-9a-f]{1,}) x([0-9a-f]{1,}) x([0-9a-f]{1,})$" description {{ The driver is sending an FDMI request to the fabric. DATA: (1) fc_flag (2) hba_state (3) cmdcode }} action {{ No action needed, informational. }} class: unknown type: info refcode: "" message: lpfc_printf_vlog KERN_WARNING "FDMI rsp failed Data: x%x\n" regex lpfc_printf_vlog "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):\\(([-]\?[0-9]{1,})\\):([-]\?[0-9]{1,}) FDMI rsp failed Data: x([0-9a-f]{1,})$" description {{ An error response was received to FDMI request. DATA:(1) SWAP_DATA16(fdmi_cmd) }} action {{ The fabric does not support FDMI, check fabric configuration. }} class: unknown sl_severity: warning refcode: "" message: lpfc_printf_vlog KERN_INFO "FIND node did x%x NOT FOUND.\n" regex lpfc_printf_vlog "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):\\(([-]\?[0-9]{1,})\\):([-]\?[0-9]{1,}) FIND node did x([0-9a-f]{1,}) NOT FOUND\\.$" description {{ The driver was searching for a node table entry based on the DID and the entry was not found. DATA: (1) order }} action {{ No action needed, informational. }} class: software type: info refcode: "" message: lpfc_printf_vlog KERN_INFO "FLOGI completes successfully Data: x%x x%x x%x x%x\n" regex lpfc_printf_vlog "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):\\(([-]\?[0-9]{1,})\\):([-]\?[0-9]{1,}) FLOGI completes successfully Data: x([0-9a-f]{1,}) x([0-9a-f]{1,}) x([0-9a-f]{1,}) x([0-9a-f]{1,})$" description {{ An ELS FLOGI command that was sent to the fabric succeeded. DATA: (1) ulpWord[4] (2) e_d_tov (3) r_a_tov (4) edtovResolution }} action {{ No action needed, informational. }} class: unknown type: info refcode: "" message: lpfc_printf_vlog KERN_INFO "FLOGI failure Data: x%x x%x x%x\n" regex lpfc_printf_vlog "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):\\(([-]\?[0-9]{1,})\\):([-]\?[0-9]{1,}) FLOGI failure Data: x([0-9a-f]{1,}) x([0-9a-f]{1,}) x([0-9a-f]{1,})$" description {{ An ELS FLOGI command that was sent to the fabric failed. DATA: (1) ulpStatus (2) ulpWord[4] (3) ulpTimeout }} action {{ No action needed, informational. }} class: unknown type: info refcode: "" message: lpfc_printf_vlog KERN_INFO "FLOGI NPIV supported, response data 0x%x\n" regex lpfc_printf_vlog "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):\\(([-]\?[0-9]{1,})\\):([-]\?[0-9]{1,}) FLOGI NPIV supported, response data 0x([0-9a-f]{1,})$" description {{ The fabric reports support for NPIV upon FLOGI. DATA: (1) response_multiple_NPort }} action {{ No action needed, informational. }} class: unknown type: info refcode: "" message: lpfc_printf_vlog KERN_ERR "GID_FT Query error: 0x%x 0x%x\n" regex lpfc_printf_vlog "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):\\(([-]\?[0-9]{1,})\\):([-]\?[0-9]{1,}) GID_FT Query error: 0x([0-9a-f]{1,}) 0x([0-9a-f]{1,})$" description {{ The GID_FT CT request for the nameserver has failed. }} action {{ Check the switch configuration. }} class: unknown sl_severity: error refcode: "" message: lpfc_printf_vlog KERN_ERR "Ignoring change to nodev_tmo because devloss_tmo is set.\n" regex lpfc_printf_vlog "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):\\(([-]\?[0-9]{1,})\\):([-]\?[0-9]{1,}) Ignoring change to nodev_tmo because devloss_tmo is set\\.$" description {{ Attempting to change the nodev timeout when the devloss has already been set. }} action {{ None required. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_vlog KERN_ERR "Ignoring nodev_tmo module parameter because devloss_tmo is set.\n" regex lpfc_printf_vlog "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):\\(([-]\?[0-9]{1,})\\):([-]\?[0-9]{1,}) Ignoring nodev_tmo module parameter because devloss_tmo is set\\.$" description {{ Both module parameters (nodev and devloss) were set so the driver is ignoring the nodev parameter. }} action {{ Only one of these parameters must be set. }} class: software sl_severity: error refcode: "" message: lpfc_printf_vlog KERN_ERR "Illegal State Transition: node x%x event x%x, state x%x Data: x%x x%x\n" regex lpfc_printf_vlog "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):\\(([-]\?[0-9]{1,})\\):([-]\?[0-9]{1,}) Illegal State Transition: node x([0-9a-f]{1,}) event x([0-9a-f]{1,}), state x([0-9a-f]{1,}) Data: x([0-9a-f]{1,}) x([0-9a-f]{1,})$" description {{ The current node state does not have a handler for this event. DATA: (1) nlp_rpi (2) nlp_flag }} action {{ Verify that all targets are still visible to the SCSI mid-layer. }} class: unknown sl_severity: error refcode: "" message: lpfc_printf_vlog KERN_ERR "Init VPI mailbox failed 0x%x\n" regex lpfc_printf_vlog "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):\\(([-]\?[0-9]{1,})\\):([-]\?[0-9]{1,}) Init VPI mailbox failed 0x([0-9a-f]{1,})$" description {{ The Initialize VPI mailbox command failed. }} action {{ None required. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_vlog KERN_ERR "Invalid response length: tgt x%x lun x%x cmnd x%x rsplen x%x\n" regex lpfc_printf_vlog "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):\\(([-]\?[0-9]{1,})\\):([-]\?[0-9]{1,}) Invalid response length: tgt x([0-9a-f]{1,}) lun x([0-9a-f]{1,}) cmnd x([0-9a-f]{1,}) rsplen x([0-9a-f]{1,})$" description {{ The response length for this FCP command is not supported. }} action {{ None required. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_vlog KERN_INFO "Iodone <%d/%d> cmd %p, error x%x SNS x%x x%x Data: x%x x%x\n" regex lpfc_printf_vlog "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):\\(([-]\?[0-9]{1,})\\):([-]\?[0-9]{1,}) Iodone <([-]\?[0-9]{1,})/([-]\?[0-9]{1,})> cmd (\\(null\\)|([0]{0,7}[0-9a-f]{1,})), error x([0-9a-f]{1,}) SNS x([0-9a-f]{1,}) x([0-9a-f]{1,}) Data: x([0-9a-f]{1,}) x([0-9a-f]{1,})$" description {{ This error indicates that the Fibre Channel driver is returning a SCSI command to the SCSI layer in error or with sense data. DATA: (1) retry (2) resid }} action {{ No action needed, informational. }} class: software type: info refcode: "" message: lpfc_printf_vlog KERN_ERR "I/O flush failure for context %s : cnt x%x\n" regex lpfc_printf_vlog "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):\\(([-]\?[0-9]{1,})\\):([-]\?[0-9]{1,}) I/O flush failure for context ([[:print:]]*) : cnt x([0-9a-f]{1,})$" description {{ The I/O flush to the {LUN TARGET or HOST] has failed. }} action {{ None required. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_vlog KERN_ERR "Issue FDISC: Cannot send IOCB\n" regex lpfc_printf_vlog "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):\\(([-]\?[0-9]{1,})\\):([-]\?[0-9]{1,}) Issue FDISC: Cannot send IOCB$" description {{ Unable to send the fabric IOCB. }} action {{ None required. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_vlog KERN_ERR "Issue FDISC: no IOCB\n" regex lpfc_printf_vlog "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):\\(([-]\?[0-9]{1,})\\):([-]\?[0-9]{1,}) Issue FDISC: no IOCB$" description {{ All of the pre-allocated IOCBs are in use. }} action {{ None required. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_vlog KERN_WARNING "Issue FDMI request failed Data: x%x\n" regex lpfc_printf_vlog "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):\\(([-]\?[0-9]{1,})\\):([-]\?[0-9]{1,}) Issue FDMI request failed Data: x([0-9a-f]{1,})$" description {{ Cannot issue an FDMI request to the HBA. DATA: (1) cmdcode }} action {{ No action needed, informational. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_vlog KERN_INFO "Issue GEN REQ IOCB to NPORT x%x Data: x%x x%x\n" regex lpfc_printf_vlog "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):\\(([-]\?[0-9]{1,})\\):([-]\?[0-9]{1,}) Issue GEN REQ IOCB to NPORT x([0-9a-f]{1,}) Data: x([0-9a-f]{1,}) x([0-9a-f]{1,})$" description {{ Issue a GEN REQ IOCB for remote NPORT. These are typically used for CT request. DATA: (1) ulpIoTag (2) hba_state }} action {{ No action needed, informational. }} class: software type: info refcode: "" message: lpfc_printf_vlog KERN_ERR "Issue NameServer Req x%x err %d Data: x%x x%x\n" regex lpfc_printf_vlog "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):\\(([-]\?[0-9]{1,})\\):([-]\?[0-9]{1,}) Issue NameServer Req x([0-9a-f]{1,}) err ([-]\?[0-9]{1,}) Data: x([0-9a-f]{1,}) x([0-9a-f]{1,})$" description {{ The driver was not able to send the nameserver CT command. DATA: (1) vports fc_flag (2) vports fc_rscn_id_cn }} action {{ Check the port and switch configurations. }} class: software sl_severity: error refcode: "" message: lpfc_printf_vlog KERN_ERR "Issue Register VFI failed: Err %d\n" regex lpfc_printf_vlog "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):\\(([-]\?[0-9]{1,})\\):([-]\?[0-9]{1,}) Issue Register VFI failed: Err ([-]\?[0-9]{1,})$" description {{ The driver could not register the Virtual Fabric Index for the FCFI. }} action {{ Check the switch and port configurations. }} class: software sl_severity: error refcode: "" message: lpfc_printf_vlog KERN_INFO "LOGO completes to NPort x%x Data: x%x x%x x%x x%x\n" regex lpfc_printf_vlog "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):\\(([-]\?[0-9]{1,})\\):([-]\?[0-9]{1,}) LOGO completes to NPort x([0-9a-f]{1,}) Data: x([0-9a-f]{1,}) x([0-9a-f]{1,}) x([0-9a-f]{1,}) x([0-9a-f]{1,})$" description {{ The HBA performed a LOGO to a remote NPort. DATA: (1) ulpStatus (2) ulpWord[4] (3) ulpTimeout (4) num_disc_nodes }} action {{ No action needed, informational. }} class: software type: info refcode: "" message: lpfc_printf_vlog KERN_ERR "lpfc_alloc_bucket failed to allocate statistical data buffer DID 0x%x\n" regex lpfc_printf_vlog "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):\\(([-]\?[0-9]{1,})\\):([-]\?[0-9]{1,}) lpfc_alloc_bucket failed to allocate statistical data buffer DID 0x([0-9a-f]{1,})$" description {{ Memory allocation failed for node’s statistical data. }} action {{ None required. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_vlog KERN_INFO "lpfc_cleanup_node: ndlp:x%p usgmap:x%x refcnt:%d\n" regex lpfc_printf_vlog "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):\\(([-]\?[0-9]{1,})\\):([-]\?[0-9]{1,}) lpfc_cleanup_node: ndlp:x(\\(null\\)|([0]{0,7}[0-9a-f]{1,})) usgmap:x([0-9a-f]{1,}) refcnt:([-]\?[0-9]{1,})$" description {{ Node clean-up wascalled to prepare the node for release. }} action {{ No action needed, informational. }} class: software type: info refcode: "" message: lpfc_printf_vlog KERN_ERR "lpfc_devloss_tmo attribute cannot be set to %d, allowed range is [%d, %d]\n" regex lpfc_printf_vlog "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):\\(([-]\?[0-9]{1,})\\):([-]\?[0-9]{1,}) lpfc_devloss_tmo attribute cannot be set to ([-]\?[0-9]{1,}), allowed range is \\[([-]\?[0-9]{1,}), ([-]\?[0-9]{1,})]$" description {{ Attempt to set the devloss timeout value is outside the allowed range. }} action {{ Set the devloss timeout between the minimum and maximum devloss range. }} class: software sl_severity: error refcode: "" message: lpfc_printf_vlog KERN_WARNING "lpfc_enable_node: ndlp:x%p usgmap:x%x refcnt:%d\n" regex lpfc_printf_vlog "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):\\(([-]\?[0-9]{1,})\\):([-]\?[0-9]{1,}) lpfc_enable_node: ndlp:x(\\(null\\)|([0]{0,7}[0-9a-f]{1,})) usgmap:x([0-9a-f]{1,}) refcnt:([-]\?[0-9]{1,})$" description {{ Enable node was attempted on an inactive node. }} action {{ No action needed, informational. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_vlog KERN_WARNING "lpfc_nlp_get: ndlp:x%p usgmap:x%x refcnt:%d\n" regex lpfc_printf_vlog "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):\\(([-]\?[0-9]{1,})\\):([-]\?[0-9]{1,}) lpfc_nlp_get: ndlp:x(\\(null\\)|([0]{0,7}[0-9a-f]{1,})) usgmap:x([0-9a-f]{1,}) refcnt:([-]\?[0-9]{1,})$" description {{ A kref_get was attempted on a node that was being released. }} action {{ No action needed, informational. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_vlog KERN_WARNING "lpfc_nlp_put: ndlp:x%p usgmap:x%x refcnt:%d\n" regex lpfc_printf_vlog "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):\\(([-]\?[0-9]{1,})\\):([-]\?[0-9]{1,}) lpfc_nlp_put: ndlp:x(\\(null\\)|([0]{0,7}[0-9a-f]{1,})) usgmap:x([0-9a-f]{1,}) refcnt:([-]\?[0-9]{1,})$" description {{ A kref_put was called again after the node was already inactive. }} action {{ No action needed, informational. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_vlog KERN_ERR "lpfc_nlp_state_cleanup failed to allocate statistical data buffer DID 0x%x\n" regex lpfc_printf_vlog "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):\\(([-]\?[0-9]{1,})\\):([-]\?[0-9]{1,}) lpfc_nlp_state_cleanup failed to allocate statistical data buffer DID 0x([0-9a-f]{1,})$" description {{ Memory allocation failed for node’s statistical data. }} action {{ None required. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_vlog KERN_ERR "lpfc_nodev_tmo attribute cannot be set to %d, allowed range is [%d, %d]\n" regex lpfc_printf_vlog "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):\\(([-]\?[0-9]{1,})\\):([-]\?[0-9]{1,}) lpfc_nodev_tmo attribute cannot be set to ([-]\?[0-9]{1,}), allowed range is \\[([-]\?[0-9]{1,}), ([-]\?[0-9]{1,})]$" description {{ The attempt to set the devloss timeout value failed because the value is out of the allowable range. }} action {{ Use a value between the minimum and maximum values. }} class: software sl_severity: error refcode: "" message: lpfc_printf_vlog KERN_ERR "lpfc_restrict_login attribute cannot be set to %d, allowed range is [0, 1]\n" regex lpfc_printf_vlog "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):\\(([-]\?[0-9]{1,})\\):([-]\?[0-9]{1,}) lpfc_restrict_login attribute cannot be set to ([-]\?[0-9]{1,}), allowed range is \\[0, 1]$" description {{ The module parameter lpfc_restrict_login can only be set to 0 (off) or 1 (on). }} action {{ Set lpfc_restrict_login=[0,1]. }} class: software sl_severity: error refcode: "" message: lpfc_printf_vlog KERN_ERR "lpfc_restrict_login must be 0 for Physical ports.\n" regex lpfc_printf_vlog "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):\\(([-]\?[0-9]{1,})\\):([-]\?[0-9]{1,}) lpfc_restrict_login must be 0 for Physical ports\\.$" description {{ Attempt to set the restrict login parameter to something other than on or off. }} action {{ Use 0 (Off) or 1 (On). }} class: software sl_severity: error refcode: "" message: lpfc_printf_vlog KERN_ERR "NameServer GFF Rsp x%x Error (%d %d) Data: x%x x%x\n" regex lpfc_printf_vlog "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):\\(([-]\?[0-9]{1,})\\):([-]\?[0-9]{1,}) NameServer GFF Rsp x([0-9a-f]{1,}) Error \\(([-]\?[0-9]{1,}) ([-]\?[0-9]{1,})\\) Data: x([0-9a-f]{1,}) x([0-9a-f]{1,})$" description {{ The nameServer GFF CT request failed. DATA: (1) vports fc_flag (2) vports fc_rscn_id_cnt }} action {{ Check the port and switch configurations. }} class: hardware sl_severity: error refcode: "" message: lpfc_printf_vlog KERN_ERR "NameServer login: node freed\n" regex lpfc_printf_vlog "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):\\(([-]\?[0-9]{1,})\\):([-]\?[0-9]{1,}) NameServer login: node freed$" description {{ The enable mode failed to free up the nameserver login. }} action {{ None required. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_vlog KERN_ERR "NameServer login: no memory\n" regex lpfc_printf_vlog "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):\\(([-]\?[0-9]{1,})\\):([-]\?[0-9]{1,}) NameServer login: no memory$" description {{ Could not allocate memory for the NDLP structure. }} action {{ None required. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_vlog KERN_ERR "NameServer Query timeout Data: x%x x%x\n" regex lpfc_printf_vlog "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):\\(([-]\?[0-9]{1,})\\):([-]\?[0-9]{1,}) NameServer Query timeout Data: x([0-9a-f]{1,}) x([0-9a-f]{1,})$" description {{ Node authentication timeout, node Discovery timeout. A NameServer Query to the Fabric or discovery of reported remote NPorts is not acknowledged within R_A_TOV. DATA: (1) fc_ns_retry (2) fc_max_ns_retry }} action {{ Check Fabric configuration. The driver recovers from this and continues with device discovery. }} class: unknown sl_severity: error refcode: "" message: lpfc_printf_vlog KERN_ERR "NameServer Rsp Data: x%x\n" regex lpfc_printf_vlog "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):\\(([-]\?[0-9]{1,})\\):([-]\?[0-9]{1,}) NameServer Rsp Data: x([0-9a-f]{1,})$" description {{ The driver received a NameServer response containing a status error. DATA: (1) CommandResponse.bits.CmdRsp (2) ReasonCode (3) Explanation (4) fc_flag }} action {{ Check the fabric configuration. The driver recovers from this and continues with device discovery. }} class: unknown sl_severity: error refcode: "" message: lpfc_printf_vlog KERN_ERR "Node Authentication timeout\n" regex lpfc_printf_vlog "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):\\(([-]\?[0-9]{1,})\\):([-]\?[0-9]{1,}) Node Authentication timeout$" description {{ The driver has lost track of what NPORTs are being authenticated. }} action {{ None required. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_vlog KERN_ERR "Nodelist not empty\n" regex lpfc_printf_vlog "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):\\(([-]\?[0-9]{1,})\\):([-]\?[0-9]{1,}) Nodelist not empty$" description {{ Driver unloaded or hotplug detected a node still in use. }} action {{ None required. }} class: unknown sl_severity: warning refcode: "" message: lpfc_printf_vlog KERN_ERR "No NPIV Fabric support\n" regex lpfc_printf_vlog "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):\\(([-]\?[0-9]{1,})\\):([-]\?[0-9]{1,}) No NPIV Fabric support$" description {{ The driver was unable to create an NPIV Vport because it is not supported by the attached fabric. DATA: (1) rctl_names[fc_hdr->fh_r_ctl], (2) type_names[fc_hdr->fh_type]) }} action {{ Reconfigure the switch to support NPIV. }} class: software sl_severity: error refcode: "" message: lpfc_printf_vlog KERN_ERR "No retry ELS command x%x to remote NPORT x%x Retried:%d Error:x%x/%x\n" regex lpfc_printf_vlog "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):\\(([-]\?[0-9]{1,})\\):([-]\?[0-9]{1,}) No retry ELS command x([0-9a-f]{1,}) to remote NPORT x([0-9a-f]{1,}) Retried:([-]\?[0-9]{1,}) Error:x([0-9a-f]{1,})/([0-9a-f]{1,})$" description {{ (1) ulpStatus (2) ulpWord[4] }} action {{ None required. }} class: software sl_severity: error refcode: "" message: lpfc_printf_vlog KERN_ERR "NS cmd %x Error (%d %d)\n" regex lpfc_printf_vlog "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):\\(([-]\?[0-9]{1,})\\):([-]\?[0-9]{1,}) NS cmd ([0-9a-f]{1,}) Error \\(([-]\?[0-9]{1,}) ([-]\?[0-9]{1,})\\)$" description {{ The nameServer CT request failed. }} action {{ Check the port and switch configurations. }} class: software sl_severity: error refcode: "" message: lpfc_printf_vlog KERN_ERR "Pending Link Event during Discovery: State x%x\n" regex lpfc_printf_vlog "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):\\(([-]\?[0-9]{1,})\\):([-]\?[0-9]{1,}) Pending Link Event during Discovery: State x([0-9a-f]{1,})$" description {{ Received link event during discovery. Causes discovery restart. }} action {{ None required unless problem persists. If persistent check cabling. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_vlog KERN_ERR "PLOGI: cannot format reg_login Data: x%x x%x x%x x%x\n" regex lpfc_printf_vlog "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):\\(([-]\?[0-9]{1,})\\):([-]\?[0-9]{1,}) PLOGI: cannot format reg_login Data: x([0-9a-f]{1,}) x([0-9a-f]{1,}) x([0-9a-f]{1,}) x([0-9a-f]{1,})$" description {{ Could not allocate an RPI or DMA buffer for the mailbox command. DATA: (1) nlp_DID (2) nlp_state (3) nlp_flag (4) nlp_rpi }} action {{ None required. }} class: software sl_severity: error refcode: "" message: lpfc_printf_vlog KERN_ERR "PLOGI: cannot issue reg_login Data: x%x x%x x%x x%x\n" regex lpfc_printf_vlog "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):\\(([-]\?[0-9]{1,})\\):([-]\?[0-9]{1,}) PLOGI: cannot issue reg_login Data: x([0-9a-f]{1,}) x([0-9a-f]{1,}) x([0-9a-f]{1,}) x([0-9a-f]{1,})$" description {{ The ELS PLOGI mailbox command has failed. DATA: (1) nlp_DID 92) nlp_state (3) nlp_flag (4) nlp_rpi }} action {{ Check the port and switch configuration. }} class: software sl_severity: error refcode: "" message: lpfc_printf_vlog KERN_INFO "PLOGI chkparm OK Data: x%x x%x x%x x%x\n" regex lpfc_printf_vlog "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):\\(([-]\?[0-9]{1,})\\):([-]\?[0-9]{1,}) PLOGI chkparm OK Data: x([0-9a-f]{1,}) x([0-9a-f]{1,}) x([0-9a-f]{1,}) x([0-9a-f]{1,})$" description {{ Received a PLOGI from a remote NPORT and its Fibre Channel service parameters match this HBA. Request can be accepted. DATA: (1) nlp_DID (2) nlp_state (3) nlp_flag (4) nlp_Rpi }} action {{ No action needed, informational. }} class: software type: info refcode: "" message: lpfc_printf_vlog KERN_INFO "PLOGI completes to NPort x%x Data: x%x x%x x%x x%x x%x\n" regex lpfc_printf_vlog "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):\\(([-]\?[0-9]{1,})\\):([-]\?[0-9]{1,}) PLOGI completes to NPort x([0-9a-f]{1,}) Data: x([0-9a-f]{1,}) x([0-9a-f]{1,}) x([0-9a-f]{1,}) x([0-9a-f]{1,}) x([0-9a-f]{1,})$" description {{ The HBA performed a PLOGI into a remote NPort. DATA: (1) ulpStatus (2) ulpWord[4] (3) ulpTimeout (4)disc (5) num_disc_nodes }} action {{ No action needed, informational. }} class: software type: info refcode: "" message: lpfc_printf_vlog KERN_ERR "PLOGI completes to NPort x%x with no ndlp. Data: x%x x%x x%x\n" regex lpfc_printf_vlog "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):\\(([-]\?[0-9]{1,})\\):([-]\?[0-9]{1,}) PLOGI completes to NPort x([0-9a-f]{1,}) with no ndlp\\. Data: x([0-9a-f]{1,}) x([0-9a-f]{1,}) x([0-9a-f]{1,})$" description {{ A PLOGI has completed for which there is no NDLP. DATA: (1) ulpStatus (2) ulpWord[4] }} action {{ None required. }} class: software sl_severity: error refcode: "" message: lpfc_printf_vlog KERN_ERR "PLOGI: no memory for reg_login Data: x%x x%x x%x x%x\n" regex lpfc_printf_vlog "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):\\(([-]\?[0-9]{1,})\\):([-]\?[0-9]{1,}) PLOGI: no memory for reg_login Data: x([0-9a-f]{1,}) x([0-9a-f]{1,}) x([0-9a-f]{1,}) x([0-9a-f]{1,})$" description {{ Memory allocation error. DATA: (1) nlp_DID (2) nlp_state (3) nlp_flag (4) nlp_rpi }} action {{ Memory allocation error. Check system resources. Unload unused modules. }} class: software sl_severity: error refcode: "" message: lpfc_printf_vlog KERN_ERR "PLOGI Reject: invalid nname\n" regex lpfc_printf_vlog "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):\\(([-]\?[0-9]{1,})\\):([-]\?[0-9]{1,}) PLOGI Reject: invalid nname$" description {{ Invalid node WWN provided. }} action {{ None required. }} class: software sl_severity: error refcode: "" message: lpfc_printf_vlog KERN_ERR "PLOGI RSP: Invalid WWN.\n" regex lpfc_printf_vlog "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):\\(([-]\?[0-9]{1,})\\):([-]\?[0-9]{1,}) PLOGI RSP: Invalid WWN\\.$" description {{ The PLOGI sent to the port by a remote port had an invalid WWN. }} action {{ None required. }} class: software sl_severity: error refcode: "" message: lpfc_printf_vlog KERN_INFO "PRLI completes to NPort x%x Data: x%x x%x x%x x%x\n" regex lpfc_printf_vlog "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):\\(([-]\?[0-9]{1,})\\):([-]\?[0-9]{1,}) PRLI completes to NPort x([0-9a-f]{1,}) Data: x([0-9a-f]{1,}) x([0-9a-f]{1,}) x([0-9a-f]{1,}) x([0-9a-f]{1,})$" description {{ The HBA performed a PRLI into a remote NPort. DATA: (1) ulpStatus (2) ulpWord[4] (3) ulpTimeout (4) num_disc_nodes }} action {{ No action needed, informational. }} class: software type: info refcode: "" message: lpfc_printf_vlog KERN_INFO "Process x%x NameServer Rsp Data: x%x x%x x%x\n" regex lpfc_printf_vlog "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):\\(([-]\?[0-9]{1,})\\):([-]\?[0-9]{1,}) Process x([0-9a-f]{1,}) NameServer Rsp Data: x([0-9a-f]{1,}) x([0-9a-f]{1,}) x([0-9a-f]{1,})$" description {{ The driver received a NameServer response. DATA: (1) nlp_flag (2) fc_flag (3) fc_rscn_id_cnt }} action {{ No action needed, informational. }} class: software type: info refcode: "" message: lpfc_printf_vlog KERN_ERR "READ_SPARAM mbxStatus error x%x hba state x%x>\n" regex lpfc_printf_vlog "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):\\(([-]\?[0-9]{1,})\\):([-]\?[0-9]{1,}) READ_SPARAM mbxStatus error x([0-9a-f]{1,}) hba state x([0-9a-f]{1,})>$" description {{ The driver issued a READ_SPARAM mbox command to the HBA that failed. }} action {{ This error could indicate a firmware or hardware problem. Report these errors to Technical Support. }} class: unknown sl_severity: error refcode: "" message: lpfc_printf_vlog KERN_INFO "ReDiscovery RSCN Data: x%x x%x x%x\n" regex lpfc_printf_vlog "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):\\(([-]\?[0-9]{1,})\\):([-]\?[0-9]{1,}) ReDiscovery RSCN Data: x([0-9a-f]{1,}) x([0-9a-f]{1,}) x([0-9a-f]{1,})$" description {{ The number / type of RSCNs has forced the driver to go to the nameserver and rediscover all NPORTs. DATA: (1) fc_rscn_id_cnt (2) fc_flag (3) hba_state }} action {{ No action needed, informational. }} class: software type: info refcode: "" message: lpfc_printf_vlog KERN_ERR "REG_FCFI mbxStatus error x%x HBA state x%x\n" regex lpfc_printf_vlog "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):\\(([-]\?[0-9]{1,})\\):([-]\?[0-9]{1,}) REG_FCFI mbxStatus error x([0-9a-f]{1,}) HBA state x([0-9a-f]{1,})$" description {{ The REG_FCFI mailbox command has failed. }} action {{ None required. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_vlog KERN_ERR "Register Fabric login error: 0x%x\n" regex lpfc_printf_vlog "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):\\(([-]\?[0-9]{1,})\\):([-]\?[0-9]{1,}) Register Fabric login error: 0x([0-9a-f]{1,})$" description {{ The REG_LOGIN for the fabric has failed. }} action {{ Check the port connection and the switch configuration. }} class: software sl_severity: error refcode: "" message: lpfc_printf_vlog KERN_ERR "Register NameServer error: 0x%x\n" regex lpfc_printf_vlog "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):\\(([-]\?[0-9]{1,})\\):([-]\?[0-9]{1,}) Register NameServer error: 0x([0-9a-f]{1,})$" description {{ The REG_LOGIN mailbox command has failed for the nameserver. }} action {{ Check the switch configuration }} class: software sl_severity: error refcode: "" message: lpfc_printf_vlog KERN_ERR "Register VPI: Can't send mbox\n" regex lpfc_printf_vlog "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):\\(([-]\?[0-9]{1,})\\):([-]\?[0-9]{1,}) Register VPI: Can't send mbox$" description {{ Could not issue the REG_LOGIN command for this VPort. }} action {{ None required. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_vlog KERN_ERR "Register VPI: no memory\n" regex lpfc_printf_vlog "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):\\(([-]\?[0-9]{1,})\\):([-]\?[0-9]{1,}) Register VPI: no memory$" description {{ Could not allocate memory for the REG_LOGIN mailbox command. }} action {{ None required. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_vlog KERN_ERR "RegLogin failed Data: x%x x%x x%x\n" regex lpfc_printf_vlog "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):\\(([-]\?[0-9]{1,})\\):([-]\?[0-9]{1,}) RegLogin failed Data: x([0-9a-f]{1,}) x([0-9a-f]{1,}) x([0-9a-f]{1,})$" description {{ The firmware returned a failure for the specified RegLogin. DATA: (1) Did (2) mbxStatus (3) hbaState }} action {{ This message indicates that the firmware could not do RegLogin for the specified Did. There may be a limitation on how many nodes an HBA can see. }} class: firmware sl_severity: error refcode: "" message: lpfc_printf_vlog KERN_ERR "REG_VFI mbxStatus error x%x HBA state x%x\n" regex lpfc_printf_vlog "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):\\(([-]\?[0-9]{1,})\\):([-]\?[0-9]{1,}) REG_VFI mbxStatus error x([0-9a-f]{1,}) HBA state x([0-9a-f]{1,})$" description {{ The REG_VFI mailbox command has failed. }} action {{ None required. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_vlog KERN_INFO "Retry ELS command x%x to remote NPORT x%x Data: x%x x%x\n" regex lpfc_printf_vlog "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):\\(([-]\?[0-9]{1,})\\):([-]\?[0-9]{1,}) Retry ELS command x([0-9a-f]{1,}) to remote NPORT x([0-9a-f]{1,}) Data: x([0-9a-f]{1,}) x([0-9a-f]{1,})$" description {{ The driver is retrying the specific ELS command. DATA: (1) retry (2) delay }} action {{ No action needed, informational. }} class: software type: info refcode: "" message: lpfc_printf_vlog KERN_INFO "RSCN processed Data: x%x x%x x%x x%x\n" regex lpfc_printf_vlog "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):\\(([-]\?[0-9]{1,})\\):([-]\?[0-9]{1,}) RSCN processed Data: x([0-9a-f]{1,}) x([0-9a-f]{1,}) x([0-9a-f]{1,}) x([0-9a-f]{1,})$" description {{ An RSCN ELS command was received from a fabric and processed. DATA: (1) fc_flag (2) cnt (3) fc_rscn_id_cnt (4) hba_state }} action {{ No action needed, informational. }} class: software type: info refcode: "" message: lpfc_printf_vlog KERN_INFO "RSCN received Data: x%x x%x x%x x%x\n" regex lpfc_printf_vlog "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):\\(([-]\?[0-9]{1,})\\):([-]\?[0-9]{1,}) RSCN received Data: x([0-9a-f]{1,}) x([0-9a-f]{1,}) x([0-9a-f]{1,}) x([0-9a-f]{1,})$" description {{ An RSCN ELS command was received from a fabric. DATA: (1) fc_flag (2) payload_len (3) *lp (4)fc_rscn_id_cnt }} action {{ No action needed, informational. }} class: software type: info refcode: "" message: lpfc_printf_vlog KERN_ERR "RSCN timeout Data: x%x x%x\n" regex lpfc_printf_vlog "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):\\(([-]\?[0-9]{1,})\\):([-]\?[0-9]{1,}) RSCN timeout Data: x([0-9a-f]{1,}) x([0-9a-f]{1,})$" description {{ The driver has lost track of what NPORTs have RSCNs pending. DATA: (1) fc_ns_retry (2) lpfc_max_ns_retry }} action {{ None required. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_vlog KERN_ERR "SCSI layer issued Bus Reset Data: x%x\n" regex lpfc_printf_vlog "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):\\(([-]\?[0-9]{1,})\\):([-]\?[0-9]{1,}) SCSI layer issued Bus Reset Data: x([0-9a-f]{1,})$" description {{ The SCSI layer is requesting the driver to abort all I/Os to all targets on this HBA. DATA: (1) ret }} action {{ Check the state of the targets in question. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_vlog KERN_ERR "Signal aborted mbxCmd x%x\n" regex lpfc_printf_vlog "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):\\(([-]\?[0-9]{1,})\\):([-]\?[0-9]{1,}) Signal aborted mbxCmd x([0-9a-f]{1,})$" description {{ A pending mailbox command was aborted because the thread received a signal. }} action {{ You should retry the attempted command. }} class: software sl_severity: error refcode: "" message: lpfc_printf_vlog KERN_INFO "Skip x%x NameServer Rsp Data: x%x x%x\n" regex lpfc_printf_vlog "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):\\(([-]\?[0-9]{1,})\\):([-]\?[0-9]{1,}) Skip x([0-9a-f]{1,}) NameServer Rsp Data: x([0-9a-f]{1,}) x([0-9a-f]{1,})$" description {{ The driver received a NameServer response. DATA: (1) size (2) fc_flag (3) fc_rscn_id_cnt (4)no_rscn_id_cnt }} action {{ No action needed, informational. }} class: software type: info refcode: "" message: lpfc_printf_vlog KERN_INFO "Start Discovery hba state x%x Data: x%x x%x x%x\n" regex lpfc_printf_vlog "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):\\(([-]\?[0-9]{1,})\\):([-]\?[0-9]{1,}) Start Discovery hba state x([0-9a-f]{1,}) Data: x([0-9a-f]{1,}) x([0-9a-f]{1,}) x([0-9a-f]{1,})$" description {{ Device discovery / rediscovery after FLOGI, FAN or RSCN has started. DATA: (1) fc_flag (2) fc_plogi_cnt (3) fc_adisc_cnt }} action {{ No action needed, informational. }} class: software type: info refcode: "" message: lpfc_printf_vlog KERN_INFO "Start Discovery Timer state x%x Data: x%x x%lx x%x x%x\n" regex lpfc_printf_vlog "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):\\(([-]\?[0-9]{1,})\\):([-]\?[0-9]{1,}) Start Discovery Timer state x([0-9a-f]{1,}) Data: x([0-9a-f]{1,}) x([0-9a-f]{1,}) x([0-9a-f]{1,}) x([0-9a-f]{1,})$" description {{ Start the device discovery / RSCN rescue timer. DATA: (1) tmo (2) fc_disctmo (3) fc_plogi_cnt (4) fc_adisc_cnt }} action {{ No action needed, informational. }} class: software type: info refcode: "" message: lpfc_printf_vlog KERN_ERR "Target Reset rport failure: rdata x%p\n" regex lpfc_printf_vlog "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):\\(([-]\?[0-9]{1,})\\):([-]\?[0-9]{1,}) Target Reset rport failure: rdata x(\\(null\\)|([0]{0,7}[0-9a-f]{1,}))$" description {{ The reset of the target failed. }} action {{ None required. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_vlog KERN_ERR "Timeout while waiting for NameServer login\n" regex lpfc_printf_vlog "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):\\(([-]\?[0-9]{1,})\\):([-]\?[0-9]{1,}) Timeout while waiting for NameServer login$" description {{ Our login request to the NameServer was not acknowledged within RATOV. }} action {{ Check the fabric configuration. The driver recovers from this and continues with device discovery. }} class: software sl_severity: error refcode: "" message: lpfc_printf_vlog KERN_ERR "TMF %s to TGT %d LUN %d failed (%d, %d)\n" regex lpfc_printf_vlog "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):\\(([-]\?[0-9]{1,})\\):([-]\?[0-9]{1,}) TMF ([[:print:]]*) to TGT ([-]\?[0-9]{1,}) LUN ([-]\?[0-9]{1,}) failed \\(([-]\?[0-9]{1,}), ([-]\?[0-9]{1,})\\)$" description {{ The task management command failed. }} action {{ None required. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_vlog KERN_ERR "Unexpected discovery timeout, vport State x%x\n" regex lpfc_printf_vlog "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):\\(([-]\?[0-9]{1,})\\):([-]\?[0-9]{1,}) Unexpected discovery timeout, vport State x([0-9a-f]{1,})$" description {{ The discovery process has timed out. }} action {{ Verify that all targets are still visible. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_vlog KERN_ERR "Unexpected timeout, hba link state x%x\n" regex lpfc_printf_vlog "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):\\(([-]\?[0-9]{1,})\\):([-]\?[0-9]{1,}) Unexpected timeout, hba link state x([0-9a-f]{1,})$" description {{ Discovery has timed out and the HBA state is not ready. }} action {{ None required. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_vlog KERN_ERR "Unknown ELS command x%x received from NPORT x%x\n" regex lpfc_printf_vlog "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):\\(([-]\?[0-9]{1,})\\):([-]\?[0-9]{1,}) Unknown ELS command x([0-9a-f]{1,}) received from NPORT x([0-9a-f]{1,})$" description {{ Received an unsupported ELS command from a remote NPORT. }} action {{ Check remote NPORT for potential problem. }} class: software sl_severity: error refcode: "" message: lpfc_printf_vlog KERN_INFO "Vport Created.\n" regex lpfc_printf_vlog "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):\\(([-]\?[0-9]{1,})\\):([-]\?[0-9]{1,}) Vport Created\\.$" description {{ This message is displayed to indicate that a port was created in the system. It is displayed at this level to ensure it is always appears at all log levels. }} action {{ None required. }} class: software type: info refcode: "" message: lpfc_printf_vlog KERN_ERR "Vport Disabled.\n" regex lpfc_printf_vlog "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):\\(([-]\?[0-9]{1,})\\):([-]\?[0-9]{1,}) Vport Disabled\\.$" description {{ The port had to be disabled in the system. }} action {{ None required. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_vlog KERN_ERR "vport_delete failed: Cannot delete physical host\n" regex lpfc_printf_vlog "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):\\(([-]\?[0-9]{1,})\\):([-]\?[0-9]{1,}) vport_delete failed: Cannot delete physical host$" description {{ An attempt to delete a port failed because it was to delete a physical port and not a virtual port. Only VPorts on physical ports can be deleted on an NPIV system. }} action {{ Software driver error. If this problem persists, report these errors to Technical Support. }} class: software sl_severity: error refcode: "" message: lpfc_printf_vlog KERN_ERR "vport_delete failed: Cannot delete static vport.\n" regex lpfc_printf_vlog "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):\\(([-]\?[0-9]{1,})\\):([-]\?[0-9]{1,}) vport_delete failed: Cannot delete static vport\\.$" description {{ Static VPorts cannot be deleted. }} action {{ None required. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_vlog KERN_ERR "Vport Deleted.\n" regex lpfc_printf_vlog "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):\\(([-]\?[0-9]{1,})\\):([-]\?[0-9]{1,}) Vport Deleted\\.$" description {{ A Vport was deleted. }} action {{ None required. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_vlog KERN_ERR "Vport discovery quiesce Wait: state x%x fc_flags x%x num_nodes x%x, waiting 1000 msecs total wait msecs x%x\n" regex lpfc_printf_vlog "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):\\(([-]\?[0-9]{1,})\\):([-]\?[0-9]{1,}) Vport discovery quiesce Wait: state x([0-9a-f]{1,}) fc_flags x([0-9a-f]{1,}) num_nodes x([0-9a-f]{1,}), waiting 1000 msecs total wait msecs x([0-9a-f]{1,})$" description {{ Could not pause discovery on this VPort. }} action {{ None required. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_vlog KERN_ERR "Vport Enabled.\n" regex lpfc_printf_vlog "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):\\(([-]\?[0-9]{1,})\\):([-]\?[0-9]{1,}) Vport Enabled\\.$" description {{ The port had to be enabled after possible recovery from some errors. }} action {{ None required. }} class: software sl_severity: warning refcode: "" message: lpfc_printf_vlog KERN_ERR "VPort failed init, mbxCmd x%x READ_SPARM mbxStatus x%x, rc = x%x\n" regex lpfc_printf_vlog "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):\\(([-]\?[0-9]{1,})\\):([-]\?[0-9]{1,}) VPort failed init, mbxCmd x([0-9a-f]{1,}) READ_SPARM mbxStatus x([0-9a-f]{1,}), rc = x([0-9a-f]{1,})$" description {{ A pending mailbox command issued to initialize port, failed. DATA: (1) mbxCommand (2) mbxStatus (3) rc }} action {{ Software driver error. If this problem persists, report these errors to Technical Support. }} class: software sl_severity: error refcode: "" message: lpfc_printf_vlog KERN_INFO "Xmit ADISC ACC response iotag x%x xri: x%x, did x%x, nlp_flag x%x, nlp_state x%x rpi x%x\n" regex lpfc_printf_vlog "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):\\(([-]\?[0-9]{1,})\\):([-]\?[0-9]{1,}) Xmit ADISC ACC response iotag x([0-9a-f]{1,}) xri: x([0-9a-f]{1,}), did x([0-9a-f]{1,}), nlp_flag x([0-9a-f]{1,}), nlp_state x([0-9a-f]{1,}) rpi x([0-9a-f]{1,})$" description {{ An ADISC ACC response for the specified IO tag has been sent. DATA: (1) xri (for SLI-4) (2) ulpContext (3) nlp_DID (4) nlp_flag (5) nlp_state (6) nlp_rpi }} action {{ No action needed, informational. }} class: software type: info refcode: "" message: lpfc_printf_vlog KERN_INFO "Xmit ELS ACC response tag x%x, XRI: x%x, DID: x%x, nlp_flag: x%x nlp_state: x%x RPI: x%x\n" regex lpfc_printf_vlog "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):\\(([-]\?[0-9]{1,})\\):([-]\?[0-9]{1,}) Xmit ELS ACC response tag x([0-9a-f]{1,}), XRI: x([0-9a-f]{1,}), DID: x([0-9a-f]{1,}), nlp_flag: x([0-9a-f]{1,}) nlp_state: x([0-9a-f]{1,}) RPI: x([0-9a-f]{1,})$" description {{ An ELS accept response for the specified IO tag has been sent. DATA: (1) ulpContext (2) nlp_DID (3) nlp_flag (4) nlp_state (5) nlp_rpi }} action {{ No action needed, informational. }} class: software type: info refcode: "" message: lpfc_printf_vlog KERN_INFO "Xmit ELS command x%x to remote NPORT x%x I/O tag: x%x, port state: x%x\n" regex lpfc_printf_vlog "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):\\(([-]\?[0-9]{1,})\\):([-]\?[0-9]{1,}) Xmit ELS command x([0-9a-f]{1,}) to remote NPORT x([0-9a-f]{1,}) I/O tag: x([0-9a-f]{1,}), port state: x([0-9a-f]{1,})$" description {{ Xmit ELS command to remote NPORT. DATA: (1) icmd->ulpIoTag (2) hba_state }} action {{ No action needed, informational. }} class: software type: info refcode: "" message: lpfc_printf_vlog KERN_INFO "Xmit ELS response x%x to remote NPORT x%x I/O tag: x%x, size: x%x\n" regex lpfc_printf_vlog "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):\\(([-]\?[0-9]{1,})\\):([-]\?[0-9]{1,}) Xmit ELS response x([0-9a-f]{1,}) to remote NPORT x([0-9a-f]{1,}) I/O tag: x([0-9a-f]{1,}), size: x([0-9a-f]{1,})$" description {{ Xmit ELS response to remote NPORT. DATA: (1) icmd->ulpIoTag (2) size }} action {{ No action needed, informational. }} class: software type: info refcode: "" message: lpfc_printf_vlog KERN_INFO "Xmit ELS RJT x%x response tag x%x xri x%x, did x%x, nlp_flag x%x, nlp_state x%x, rpi x%x\n" regex lpfc_printf_vlog "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):\\(([-]\?[0-9]{1,})\\):([-]\?[0-9]{1,}) Xmit ELS RJT x([0-9a-f]{1,}) response tag x([0-9a-f]{1,}) xri x([0-9a-f]{1,}), did x([0-9a-f]{1,}), nlp_flag x([0-9a-f]{1,}), nlp_state x([0-9a-f]{1,}), rpi x([0-9a-f]{1,})$" description {{ An ELS reject response with the specified error for the specified IO tag has been sent. DATA: (1) xri (for SLI-4) (2) ulpContext (3) nlp_DID (4) nlp_flag (5) nlp_state (6) nlp_rpi }} action {{ No action needed, informational. }} class: software type: info refcode: "" message: lpfc_printf_vlog KERN_INFO "Xmit ELS RPL ACC response tag x%x xri x%x, did x%x, nlp_flag x%x, nlp_state x%x, rpi x%x\n" regex lpfc_printf_vlog "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):\\(([-]\?[0-9]{1,})\\):([-]\?[0-9]{1,}) Xmit ELS RPL ACC response tag x([0-9a-f]{1,}) xri x([0-9a-f]{1,}), did x([0-9a-f]{1,}), nlp_flag x([0-9a-f]{1,}), nlp_state x([0-9a-f]{1,}), rpi x([0-9a-f]{1,})$" description {{ An RPL ACC response for the specified IO tag has been sent. DATA: (1) xri (for SLI-4) (2) ulpContext (3) nlp_DID (4) nlp_flag (5) nlp_state (6) nlp_rpi }} action {{ No action needed, informational. }} class: software type: info refcode: "" message: lpfc_printf_vlog KERN_INFO "Xmit ELS RPS ACC response tag x%x xri x%x, did x%x, nlp_flag x%x, nlp_state x%x, rpi x%x\n" regex lpfc_printf_vlog "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):\\(([-]\?[0-9]{1,})\\):([-]\?[0-9]{1,}) Xmit ELS RPS ACC response tag x([0-9a-f]{1,}) xri x([0-9a-f]{1,}), did x([0-9a-f]{1,}), nlp_flag x([0-9a-f]{1,}), nlp_state x([0-9a-f]{1,}), rpi x([0-9a-f]{1,})$" description {{ An RPS ACC response for the specified IO tag has been sent. DATA: (1) xri (for SLI-4) (2) ulpContext (3) nlp_DID (4) nlp_flag (5) nlp_state (6) nlp_rpi }} action {{ No action needed, informational. }} class: software type: info refcode: "" message: lpfc_printf_vlog KERN_INFO "Xmit PRLI ACC response tag x%x xri x%x, did x%x, nlp_flag x%x, nlp_state x%x, rpi x%x\n" regex lpfc_printf_vlog "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):\\(([-]\?[0-9]{1,})\\):([-]\?[0-9]{1,}) Xmit PRLI ACC response tag x([0-9a-f]{1,}) xri x([0-9a-f]{1,}), did x([0-9a-f]{1,}), nlp_flag x([0-9a-f]{1,}), nlp_state x([0-9a-f]{1,}), rpi x([0-9a-f]{1,})$" description {{ A PRLI ACC response for the specified IO tag has been sent. DATA: (1) xri (for SLI-4) (2) ulpContext (3) nlp_DID (4) nlp_flag (5) nlp_state (6) nlp_rpi }} action {{ No action needed, informational. }} class: software type: info refcode: "" message: lpfc_printf_vlog KERN_INFO "Xmit RNID ACC response tag x%x xri x%x\n" regex lpfc_printf_vlog "^lpfc ([[:print:]]*): ([-]\?[0-9]{1,}):\\(([-]\?[0-9]{1,})\\):([-]\?[0-9]{1,}) Xmit RNID ACC response tag x([0-9a-f]{1,}) xri x([0-9a-f]{1,})$" description {{ A RNID ACC response for the specified IO tag has been sent. DATA: (1) ulpContext }} action {{ No action needed, informational. }} class: software type: info refcode: "" ppc64-diag-2.6.4/ela/message_catalog/with_regex/e1000e0000644000000000000000000012044412313010662020717 0ustar rootrootsubsystem: net devspec(device) = "/sys/bus/pci/devices/$device/devspec" devspec(netdev) = "/sys/class/net/$netdev/device/devspec" @copy diags_eeprom_replace {{ 1. Execute diagnostics on the adapter, using "ethtool -t". 2. Check the EEPROM level on the failing adapter. 3. Replace the adapter. }} /* Where do they see the errno they should check against errno.h? */ /* Note: e1000e kernel driver files have been moved from drivers/net/e1000e to * drivers/net/ethernet/intel/e1000e folder. */ file: "drivers/net/ethernet/intel/e1000e/82571.c" /* * Note: hw_dbg is now e_dbg since * kernel commit 3bb99fe226ead584a4db674dab546689f705201f * * Skip debug code. * e_dbg "Error getting PHY ID\n" * e_dbg "PHY ID unknown: type = 0x%08x\n" * e_dbg "Please update your 82571 Bootagent\n" * e_dbg "Driver can't access device - SMBI bit is set.\n" * e_dbg "Driver can't access the NVM\n" * e_dbg "Driver can't access the PHY\n" * e_dbg "nvm parameter(s) out of bounds\n" * e_dbg "MNG configuration cycle has not completed.\n" * e_dbg "PCI-E Master disable polling has failed.\n" * e_dbg "Masking off all interrupts\n" * e_dbg "Cannot acquire MDIO ownership\n" * e_dbg "Issuing a global reset to MAC\n" * e_dbg "Error initializing identification LED\n" * e_dbg "Initializing the IEEE VLAN\n" * e_dbg "Zeroing the MTA\n" * e_dbg "AN_UP -> AN_PROG\n" * e_dbg "FORCED_UP -> AN_PROG\n" * e_dbg "AN_PROG -> AN_UP\n" * e_dbg "AN_PROG -> DOWN\n" * e_dbg "Error config flow control\n" * e_dbg "AN_PROG -> FORCED_UP\n" * e_dbg "DOWN -> AN_PROG\n" * e_dbg "ANYSTATE -> DOWN\n" * e_dbg "ANYSTATE -> DOWN\n" * e_dbg "ANYSTATE -> AN_PROG\n" * e_dbg "NVM Read Error\n" */ file: "drivers/net/ethernet/intel/e1000e/80003es2lan.c" /* * e_dbg "Driver can't access resource, SW_FW_SYNC timeout.\n" * e_dbg "MNG configuration cycle has not completed.\n" * e_dbg "GG82563 PSCR: %X\n" * e_dbg "Waiting for forced speed/duplex link on GG82563 phy.\n" * e_dbg "PCI-E Master disable polling has failed.\n" * e_dbg "Masking off all interrupts\n" * e_dbg "Issuing a global reset to MAC\n" * e_dbg "Error initializing identification LED\n" * e_dbg "Initializing the IEEE VLAN\n" * e_dbg "Zeroing the MTA\n" * e_dbg "Error Resetting the PHY\n" */ file: "drivers/net/ethernet/intel/e1000e/ethtool.c" message: e_err "Unsupported Speed/Duplex configuration\n" regex e_err "^([[:print:]]*): ([[:print:]]*): Unsupported Speed/Duplex configuration$" description {{ Using the "ethtool -s" command, an attempt has been made to configure an incompatible combination of speed and duplex parameters. In particular, the only combination available for fiber is 1000 Mbps, full duplex. }} action {{ Specify a speed/duplex combination that is supported by your adapter and driver. }} class: software type: config refcode: "UnsupportSpeed/Duplex" /* dup: e_err "Unsupported Speed/Duplex configuration\n" */ message: e_err "Cannot change link characteristics when SoL/IDER is active.\n" regex e_err "^([[:print:]]*): ([[:print:]]*): Cannot change link characteristics when SoL/IDER is active\\.$" description {{ Using the "ethtool -s" command, an attempt has been made to change link settings while a PHY (physical layer device) reset is blocked by firmware. }} action {{ 1. Try again later. 2. Execute diagnostics on the adapter, using "ethtool -t". }} class: hardware type: temp refcode: "BLKRstPHY" message: e_err "forcing MDI/MDI-X state is not supported when link speed and/or duplex are forced\n" regex e_err "^([[:print:]]*): ([[:print:]]*): forcing MDI/MDI-X state is not supported when link speed and/or duplex are forced$" description {{ MDI setting is only allowed when autoneg enabled because some hardware doesn't allow MDI setting when speed or duplex is forced. }} action {{ 1. Enable autoneg to allow MDI setting. 2. Dont force speed and/or duplex. }} class: hardware type: temp refcode: "MDIreqAutoneg" message[chatter]: e_info "TSO is %s\n" regex e_info "^([[:print:]]*): ([[:print:]]*): TSO is ([[:print:]]*)$" message[defensive]: e_err "pattern test reg %04X failed: got 0x%08X expected 0x%08X\n" regex e_err "^([[:print:]]*): ([[:print:]]*): pattern test reg ([0]{0,3}[0-9A-F]{1,}) failed: got 0x([0]{0,7}[0-9A-F]{1,}) expected 0x([0]{0,7}[0-9A-F]{1,})$" message[defensive]: e_err "set/check reg %04X test failed: got 0x%08X expected 0x%08X\n" regex e_err "^([[:print:]]*): ([[:print:]]*): set/check reg ([0]{0,3}[0-9A-F]{1,}) test failed: got 0x([0]{0,7}[0-9A-F]{1,}) expected 0x([0]{0,7}[0-9A-F]{1,})$" message: e_err "failed STATUS register test got: 0x%08X expected: 0x%08X\n" regex e_err "^([[:print:]]*): ([[:print:]]*): failed STATUS register test got: 0x([0]{0,7}[0-9A-F]{1,}) expected: 0x([0]{0,7}[0-9A-F]{1,})$" description {{ An adapter self-test, run with "ethtool -t ... offline", has failed reading the STATUS register. }} action {{ Run "ethtool -d" to obtain a register dump, and contact your service provider. }} class: hardware type: temp refcode: "RegTestFail" message[chatter]: e_info "testing %s interrupt\n" regex e_info "^([[:print:]]*): ([[:print:]]*): testing ([[:print:]]*) interrupt$" message: e_err "Cannot setup 1Gbps loopback.\n" regex e_err "^([[:print:]]*): ([[:print:]]*): Cannot setup 1Gbps loopback\\.$" description {{ Workaround: K1 must be disabled for stable 1Gbps operation 82577/8 must acquire h/w semaphore before workaround. }} action {{ 1. Re-try after some time. (?) 2. TBD }} class: hardware type: temp refcode: "AcqHwSemaphore" message: e_err "Cannot do PHY loopback test when SoL/IDER is active.\n" regex e_err "^([[:print:]]*): ([[:print:]]*): Cannot do PHY loopback test when SoL/IDER is active\\.$" description {{ In an adapter self-test, run with the "ethtool -t ... offline" command, a loopback test has been cancelled because a PHY (physical layer device) reset is blocked by firmware. }} action {{ 1. Try again later. 2. In the absence of any other problem reports, it's probably OK to ignore this failure. }} class: hardware type: temp refcode: "BLKRstPHY" message[chatter]: e_info "offline testing starting\n" regex e_info "^([[:print:]]*): ([[:print:]]*): offline testing starting$" message[chatter]: e_info "online testing starting\n" regex e_info "^([[:print:]]*): ([[:print:]]*): online testing starting$" message[defensive]: e_err "Interface does not support directed (unicast) frame wake-up packets\n" regex e_err "^([[:print:]]*): ([[:print:]]*): Interface does not support directed \\(unicast\\) frame wake-up packets$" file: "drivers/net/ethernet/intel/e1000e/ich8lan.c" /* * e_dbg "Failed to initialize PHY flow\n" * e_dbg "Required LANPHYPC toggle blocked by ME\n" * e_dbg "Toggling LANPHYPC\n" * e_dbg "Cannot determine PHY addr. Erroring out\n" * e_dbg "ERROR: Flash registers not mapped\n" * e_dbg "Error configuring flow control\n" * e_dbg "contention for Phy access\n" * e_dbg "SW has already locked the resource.\n" * e_dbg "Failed to acquire the semaphore, FW or HW has it: FWSM=0x%8.8x EXTCNF_CTRL=0x%8.8x)\n" * e_dbg "Semaphore unexpectedly released by sw/fw/hw\n" * e_dbg "SHRA[%d] might be locked by ME - FWSM=0x%8.8x\n" * e_dbg "Failed to write receive address at index %d\n" * e_dbg "Unsupported SMB frequency in PHY\n" * e_dbg "SW/FW/HW has locked the resource for too long.\n" * e_dbg "Failed to acquire the semaphore.\n" * e_dbg "IFE PMC: %X\n" * e_dbg "Waiting for forced speed/duplex link on IFE phy.\n" * e_dbg "Link taking longer than expected.\n" * e_dbg "LAN_INIT_DONE not set, increase timeout\n" * e_dbg "Phy info is only valid if link is up\n" * e_dbg "Unable to determine valid NVM bank via EEC - reading flash signature\n" * e_dbg "ERROR: No valid NVM bank present\n" * e_dbg "nvm parameter(s) out of bounds\n" * e_dbg "Could not detect valid bank, assuming bank 0\n" * e_dbg "NVM read error: %d\n" * e_dbg "Flash descriptor invalid. SW Sequencing must be used." sic * e_dbg "Flash controller busy, cannot get access" sic * e_dbg "Timeout error - flash cycle did not complete." sic * e_dbg "nvm parameter(s) out of bounds\n" * e_dbg "Could not detect valid bank, assuming bank 0\n" * e_dbg "Flash commit failed.\n" * e_dbg "NVM update error: %d\n" * e_dbg "Timeout error - flash cycle did not complete." sic * e_dbg "Retrying Byte %2.2X at offset %u\n" * e_dbg "NVM Read Error\n" * e_dbg "PCI-E Master disable polling has failed.\n" * e_dbg "Masking off all interrupts\n" * e_dbg "Issuing a global reset to ich8lan\n" * e_dbg "Auto Read Done did not complete\n" * e_dbg "Error initializing identification LED\n" * e_dbg "Zeroing the MTA\n" * e_dbg "After fix-ups FlowControl is now = %x\n" * e_dbg "Workaround applies to ICH8 only.\n" * e_dbg "Failed to init PHY flow ret_val=%d\n" * e_dbg "Failed to setup iRST\n" * e_dbg "Error %d in resume workarounds\n" * e_dbg "Auto Read Done did not complete\n" * e_dbg "PHY Reset Asserted not set - needs delay\n" * e_dbg "EEPROM not present\n" */ file: "drivers/net/ethernet/intel/e1000e/mac.c" /* * e_dbg "Programming MAC Address into RAR[0]\n" * e_dbg "Clearing RAR[1-%u]\n" */ message[defensive]: printk KERN_ERR "multicast array memory allocation failed\n" regex printk "^multicast array memory allocation failed$" /* * e_dbg "Hash value = 0x%03X\n" */ message: e_dbg "Error configuring flow control\n" regex e_dbg "^([[:print:]]*): ([[:print:]]*): Error configuring flow control$" description {{ After detecting a link change, the driver failed to reconfigure and restore the flow-control parameters. The failure was probably either in autonegotiation or in forcing the desired speed and duplex parameters. }} action {{ Run the ethtool command (e.g., "ethtool eth0") to check the adapter's speed/duplex and flow-control settings. }} class: hardware sl_severity: warning refcode: "ErrCfgFC" message: e_dbg "NOT RXing /C/, disable AutoNeg and force link.\n" regex e_dbg "^([[:print:]]*): ([[:print:]]*): NOT RXing /C/, disable AutoNeg and force link\\.$" /* Wen has: "NOT RXing, disable AutoNeg and force link" */ description {{ Autonegotiation with the adapter's link partner has failed, or the link partner is not trying to autonegotiate. The adapter will treat the link as up. }} action {{ 1. Verify that the adapter's cable to the network is plugged in. 2. Run the ethtool command (e.g., "ethtool eth0") to verify that autonegotiation is enabled. }} class: software sl_severity: warning refcode: "ErrCfgFC" /* * e_dbg "Ignoring Alternate Mac Address with MC bit set\n" * e_dbg "Error configuring flow control\n" * e_dbg "RXing /C/, enable AutoNeg and stop forcing link.\n" * dup: e_dbg "NOT RXing /C/, disable AutoNeg and force link.\n" * dup: e_dbg "Error configuring flow control\n" * dup: e_dbg "RXing /C/, enable AutoNeg and stop forcing link.\n" * e_dbg "SERDES: Link up - forced.\n" * e_dbg "SERDES: Link down - force failed.\n" * e_dbg "SERDES: Link up - autoneg completed sucessfully.\n" * e_dbg "SERDES: Link down - invalidcodewords detected in autoneg.\n" * e_dbg "SERDES: Link down - no sync.\n" * e_dbg "SERDES: Link down - autoneg failed\n" */ message: e_dbg "NVM Read Error\n" regex e_dbg "^([[:print:]]*): ([[:print:]]*): NVM Read Error$" description {{ In an attempt to set the adapters's default flow control setting, a read from the adapter's EEPROM failed. }} action {{ @paste diags_eeprom_replace }} class: hardware sl_severity: warning refcode: "BF778E00" /* * e_dbg "After fix-ups FlowControl is now = %x\n" * e_dbg "Initializing the Flow Control address, type and timer regs\n" */ message: e_dbg "Flow control param set incorrectly\n" regex e_dbg "^([[:print:]]*): ([[:print:]]*): Flow control param set incorrectly$" description {{ For a copper or forced fiber connection, the driver tried to adjust the flow-control setting, but the current setting is in error. }} action {{ 1. Run diagnostics using the "ethtool -t" command. 2. Check the flow-control settings in drivers/net/e1000e/param.c in the kernel source. [I don't see any mention of flow control in param.c] 3. Check the EEPROM level on the failing adapter. }} class: software sl_severity: warning refcode: "FCParaWrong" /* * e_dbg "Never got a valid link from auto-neg!!!\n" */ message: e_dbg "Error while checking for link\n" regex e_dbg "^([[:print:]]*): ([[:print:]]*): Error while checking for link$" description {{ After autonegotiation failed, the adapter attempted to force the link up, but that also failed; no signal was detected. }} action {{ 1. Run diagnostics using the "ethtool -t" command. [And then what?] }} class: software sl_severity: warning refcode: "FCParaWrong" /* * e_dbg "Valid Link Found\n" * e_dbg "Auto-negotiation enabled\n" * e_dbg "No signal detected\n" * e_dbg "hw->fc.current_mode = %u\n" * dup: e_dbg "Flow control param set incorrectly\n" */ message: e_dbg "Error forcing flow control settings\n" regex e_dbg "^([[:print:]]*): ([[:print:]]*): Error forcing flow control settings$" description {{ For a copper or forced fiber connection, the driver's attempt to adjust the flow-control setting failed. }} action {{ 1. Run diagnostics using the "ethtool -t" command. 2. Check the flow-control settings in drivers/net/e1000e/param.c in the kernel source. [I don't see any mention of flow control in param.c] 3. Check the EEPROM level on the failing adapter. }} class: software sl_severity: warning refcode: "ErrForceFC" /* * e_dbg "Copper PHY and Auto Neg has not completed.\n" * e_dbg "Flow Control = FULL.\r\n" * e_dbg "Flow Control = RX PAUSE frames only.\r\n" * e_dbg "Flow Control = Tx PAUSE frames only.\r\n" * e_dbg "Flow Control = Rx PAUSE frames only.\r\n" * e_dbg "Flow Control = NONE.\r\n" */ message: e_dbg "Error getting link speed and duplex\n" regex e_dbg "^([[:print:]]*): ([[:print:]]*): Error getting link speed and duplex$" description {{ After establishing a link, the adapter failed to obtain the link speed and duplex. }} action {{ Run the ethtool command (e.g., "ethtool eth0") to check the adapter's speed/duplex and flow-control settings. }} class: software sl_severity: warning refcode: "ErrSpeedDlx" /* * dup: e_dbg "Error forcing flow control settings\n" * e_dbg "1000 Mbs, "); sic * e_dbg "100 Mbs, "); sic * e_dbg "10 Mbs, "); sic * e_dbg "Full Duplex\n" * e_dbg "Half Duplex\n" */ message: e_dbg "Driver can't access device - SMBI bit is set.\n" regex e_dbg "^([[:print:]]*): ([[:print:]]*): Driver can't access device - SMBI bit is set\\.$" description {{ The driver could not obtain exclusive access to the PHY (physical layer device) and/or NVM (non-volatile memory) as needed. }} action {{ @paste diags_eeprom_replace }} class: software sl_severity: warning refcode: "SMBIset" message: e_dbg "Driver can't access the NVM\n" regex e_dbg "^([[:print:]]*): ([[:print:]]*): Driver can't access the NVM$" description {{ The driver could not obtain exclusive access to the PHY (physical layer device) and/or NVM (non-volatile memory) as needed. }} action {{ @paste diags_eeprom_replace }} class: hardware type: perm refcode: "ErrAcessNVM" message: e_dbg "Auto read by HW from NVM has not completed.\n" regex e_dbg "^([[:print:]]*): ([[:print:]]*): Auto read by HW from NVM has not completed\\.$" description {{ The driver timed out while preparing to access the adapter's non-volatile memory. }} action {{ @paste diags_eeprom_replace }} class: hardware type: perm refcode: "AutoReadFail" /* * e_dbg "NVM Read Error\n" * e_dbg "Master requests are pending.\n" * e_dbg "Not in Adaptive IFS mode!\n" */ message: e_dbg "Could not acquire NVM grant\n" regex e_dbg "^([[:print:]]*): ([[:print:]]*): Could not acquire NVM grant$" description {{ While preparing to write to the adapter's non-volatile memory, the driver timed out trying to obtain exclusive access. }} action {{ 1. Run the "ethtool -i" command to check the adapter's firmware version. 2. Check the level of the adapter's EEPROM or NVRAM. [How do you do that? What do you do with this info once you have it?] 3. Replace the adapter. }} class: hardware type: perm refcode: "GrantNVMFail" message: e_dbg "SPI NVM Status error\n" regex e_dbg "^([[:print:]]*): ([[:print:]]*): SPI NVM Status error$" description {{ While preparing to read or write the adapter's EEPROM, the driver timed out trying to read a status register. }} action {{ @paste diags_eeprom_replace }} class: hardware type: perm refcode: "SPINVMErr" message: e_dbg "nvm parameter(s) out of bounds\n" regex e_dbg "^([[:print:]]*): ([[:print:]]*): nvm parameter\\(s\\) out of bounds$" description {{ An attempt to read or write the adapter's EEPROM failed, apparently due to an internal error or hardware error. }} action {{ @paste diags_eeprom_replace }} class: hardware type: perm refcode: "ErrCfgNVM" /* * dup: e_dbg "nvm parameter(s) out of bounds\n" * dup: e_dbg "NVM Read Error\n" * dup: e_dbg "NVM Read Error\n" * dup: e_dbg "NVM Read Error\n" * dup: e_dbg "NVM Read Error\n" * e_dbg "NVM Checksum Invalid\n" */ message: e_dbg "NVM Read Error while updating checksum.\n" regex e_dbg "^([[:print:]]*): ([[:print:]]*): NVM Read Error while updating checksum\\.$" description {{ At attempt to read the adapter's EEPROM (in order to compute a new checksum) failed. }} action {{ 1. Run the "ethtool -i" command to check the adapter's firmware version. 2. Check the level of the adapter's EEPROM or NVRAM. [How do you do that? What do you do with this info once you have it?] }} class: hardware type: perm refcode: "ReadNVMFail" message: e_dbg "NVM Write Error while updating checksum.\n" regex e_dbg "^([[:print:]]*): ([[:print:]]*): NVM Write Error while updating checksum\\.$" description {{ An attempt to write a new EEPROM checksum failed. }} action {{ 1. Run the "ethtool -i" command to check the adapter's firmware version. 2. Check the level of the adapter's EEPROM or NVRAM. [How do you do that? What do you do with this info once you have it?] }} class: hardware type: perm refcode: "WriteNVMFail" /* * e_dbg "E1000_HOST_EN bit disabled.\n" * e_dbg "Previous command timeout failed .\n" * e_dbg "NVM Read Error\n" * e_dbg "NVM Read Error\n" */ file: "drivers/net/ethernet/intel/e1000e/netdev.c" message: dev_err "RX DMA map failed\n" regex dev_err "^([[:print:]]*) ([[:print:]]*): RX DMA map failed$" description {{ The driver failed to create a DMA mapping for the adapter's receive buffer. }} action {{ 1. Reduce your current use of DMA mappings. [How?] 2. Delay bringing up the network interface; try again later. 3. Reboot the system. }} class: software sl_severity: error refcode: "RxDMAFail" message[defensive]: dev_err "RX DMA page map failed\n" regex dev_err "^([[:print:]]*) ([[:print:]]*): RX DMA page map failed$" /* duplicate: dev_err "RX DMA map failed\n" */ /* e_dbg "%s: Receive packet consumed multiple buffers\n" */ message[defensive]: e_err "Detected Tx Unit Hang:\n" regex e_err "^([[:print:]]*): ([[:print:]]*): Detected Tx Unit Hang:$" /* e_dbg "%s: Packet Split buffers didn't pick up the full packet\n" */ /* e_dbg "%s: Last part of the packet spanning multiple descriptors\n" */ /* e_dbg "failed to enable jumbo frame workaround mode\n" */ message[defensive]: e_err "ME firmware caused invalid RDT - resetting\n" regex e_err "^([[:print:]]*): ([[:print:]]*): ME firmware caused invalid RDT - resetting$" message[defensive]: e_err "ME firmware caused invalid TDT - resetting\n" regex e_err "^([[:print:]]*): ([[:print:]]*): ME firmware caused invalid TDT - resetting$" /* See desc in kernel commit c6e7f51e73c1bc6044bce989ec503ef2e4758d55 */ message[defensive]: e_err "Detected Hardware Unit Hang:\n" regex e_err "^([[:print:]]*): ([[:print:]]*): Detected Hardware Unit Hang:$" /* Kernel commit: 41cec6f1160c110bd69597c2a5611b46e8287801 */ message: e_err "Try turning off Tx pause (flow control) via ethtool\n" regex e_err "^([[:print:]]*): ([[:print:]]*): Try turning off Tx pause \\(flow control\\) via ethtool$" description {{ There is a known issue in the 82577 and 82578 device that can cause a hang in the device hardware during traffic stress; the current workaround in the driver is to disable transmit flow control by default. }} action {{ 1. Try turning off Tx pause (flow control) via ethtool 2. Re-try after disabling transmit flow control }} class: software type: config refcode: "DisableFlowCtrl" message[defensive]: e_err "pskb_may_pull failed.\n" regex e_err "^([[:print:]]*): ([[:print:]]*): pskb_may_pull failed\\.$" message: e_err "Failed to initialize MSI-X interrupts. Falling back to MSI interrupts.\n" regex e_err "^([[:print:]]*): ([[:print:]]*): Failed to initialize MSI-X interrupts\\. Falling back to MSI interrupts\\.$" description {{ MSI-X interrupts could not be enabled for this adapter, because either the kernel or the hardware doesn't support MSI-X mode. The driver will try to use MSI mode. }} action {{ 1. Execute diagnostics on the adapter, using "ethtool -t". 2. Verify that the adapter hardware and firmware support MSI-X mode. 3. Verify that the kernel supports MSI-X mode. }} class: software type: config refcode: "EnableMSIXFailed" message: e_err "Failed to initialize MSI interrupts. Falling back to legacy interrupts.\n" regex e_err "^([[:print:]]*): ([[:print:]]*): Failed to initialize MSI interrupts\\. Falling back to legacy interrupts\\.$" description {{ MSI interrupts could not be enabled for this adapter, because either the kernel or the hardware doesn't support MSI mode. The driver will try to use LSI mode. }} action {{ 1. Execute diagnostics on the adapter, using "ethtool -t". 2. Verify that the adapter hardware and firmware support MSI mode. 3. Verify that the kernel supports MSI mode. }} class: software type: config refcode: "EnableMSIFailed" message: e_err "Unable to allocate interrupt, Error: %d\n" regex e_err "^([[:print:]]*): ([[:print:]]*): Unable to allocate interrupt, Error: ([-]\?[0-9]{1,})$" description {{ While bringing up a network interface, the driver failed to configure interrupts for this adapter. }} action {{ 1. Find the error code in errno.h to determine the reason for the error. 2. Execute diagnostics on the adapter, using "ethtool -t". }} class: software sl_severity: error refcode: "ReqItrFail" message: e_err "Unable to allocate memory for the transmit descriptor ring\n" regex e_err "^([[:print:]]*): ([[:print:]]*): Unable to allocate memory for the transmit descriptor ring$" description {{ While bringing up a network interface, the driver failed to allocate memory for the transmit descriptor ring, probably because the system is low on memory. }} action {{ 1. With the ethtool command (-g and -G options), reduce the size of the adapter's transmit descriptor ring. 2. Free up memory and retry the failed operation. 3. Add memory to your system. }} class: software sl_severity: error refcode: "TxDMemFail" message: e_err "Unable to allocate memory for the receive descriptor ring\n" regex e_err "^([[:print:]]*): ([[:print:]]*): Unable to allocate memory for the receive descriptor ring$" description {{ While bringing up a network interface, the driver failed to allocate memory for the receive descriptor ring, probably because the system is low on memory. }} action {{ 1. With the ethtool command (-g and -G options), reduce the size of the adapter's receive descriptor ring. 2. Free up memory and retry the failed operation. 3. Add memory to your system. }} class: software sl_severity: error refcode: "RxDMemFail" message: e_err "Unable to allocate memory for queues\n" regex e_err "^([[:print:]]*): ([[:print:]]*): Unable to allocate memory for queues$" description {{ While bringing up a network interface, the driver failed to allocate memory for the transmit and receive queues, probably because the system is low on memory. }} action {{ 1. With the ethtool command (-g and -G options), reduce the size of the adapter's transmit and/or descriptor rings. 2. Free up memory and retry the failed operation. 3. Add memory to your system. }} class: software sl_severity: error refcode: "QueueMemFail" message: e_err "Hardware Error\n" regex e_err "^([[:print:]]*): ([[:print:]]*): Hardware Error$" description {{ While bringing up a network interface, the driver failed to initialize the identification LED or failed to set up link and flow control. This is a non-fatal error. }} action {{ 1. Execute diagnostics on the adapter, using "ethtool -t". 2. Check the cable connections. }} class: hardware sl_severity: warning refcode: "HrdErr" /* e_dbg "%s: icr is %08X\n" */ message[chatter]: e_info "MSI interrupt test failed!\n" regex e_info "^([[:print:]]*): ([[:print:]]*): MSI interrupt test failed!$" /* e_dbg "%s: MSI interrupt test succeeded!\n" */ message: e_warn "MSI interrupt test failed, using legacy interrupt.\n" regex e_warn "^([[:print:]]*): ([[:print:]]*): MSI interrupt test failed, using legacy interrupt\\.$" description {{ One of the tests run via the "ethtool -t" command failed. MSI interrupt mode is not available, so the driver will try to use LSI mode. }} action {{ 1. Find the error code in errno.h to determine the reason for the error. 2. Verify that the adapter hardware and firmware support MSI mode. 3. Verify that the kernel supports MSI mode. }} class: software sl_severity: warning refcode: "MSIFailed" /* dup: e_info "MSI interrupt test failed, using legacy interrupt.\n" */ /* TODO: Is the explanation provided by Wen (#18) correct? */ message[defensive]: e_err "Interrupt allocation failed\n" regex e_err "^([[:print:]]*): ([[:print:]]*): Interrupt allocation failed$" message[defensive]: e_warn "Unable to create IPMI pass-through filter\n" regex e_warn "^([[:print:]]*): ([[:print:]]*): Unable to create IPMI pass-through filter$" message: e_warn "Error reading PHY register\n" regex e_warn "^([[:print:]]*): ([[:print:]]*): Error reading PHY register$" description {{ This is only a warning message. }} action {{ No action necessary. }} class: software sl_severity: warning refcode: "ErrPHY" message[chatter]: printk KERN_INFO "e1000e: %s NIC Link is Up %d Mbps %s, Flow Control: %s\n" regex printk "^e1000e: [[:print:]]* NIC Link is Up [-]\?[0-9]{1,} Mbps [[:print:]]*, Flow Control: [[:print:]]*$" message[chatter]: e_info "Gigabit has been disabled, downgrading speed\n" regex e_info "^([[:print:]]*): ([[:print:]]*): Gigabit has been disabled, downgrading speed$" message[chatter]: e_info "Autonegotiated half duplex but link partner cannot autoneg. Try forcing full duplex if link gets many collisions.\n" regex e_info "^([[:print:]]*): ([[:print:]]*): Autonegotiated half duplex but link partner cannot autoneg\\. Try forcing full duplex if link gets many collisions\\.$" message[chatter]: e_info "10/100 speed: disabling TSO\n" regex e_info "^([[:print:]]*): ([[:print:]]*): 10/100 speed: disabling TSO$" message[chatter]: printk KERN_INFO "e1000e: %s NIC Link is Down\n" regex printk "^e1000e: [[:print:]]* NIC Link is Down$" message[defensive]: e_warn "checksum_partial proto=%x!\n" regex e_warn "^([[:print:]]*): ([[:print:]]*): checksum_partial proto=([0-9a-f]{1,})!$" message: dev_err "TX DMA map failed\n" regex dev_err "^([[:print:]]*) ([[:print:]]*): TX DMA map failed$" description {{ The driver failed to create a DMA mapping for the adapter's transmit buffer. }} action {{ 1. Reduce your current use of DMA mappings. [How?] 2. Delay bringing up the network interface; try again later. 3. Reboot the system. }} class: software sl_severity: error refcode: "TxDMAFail" message[defensive]: e_err "__pskb_pull_tail failed.\n" regex e_err "^([[:print:]]*): ([[:print:]]*): __pskb_pull_tail failed\\.$" message: e_err "Reset adapter\n" regex e_err "^([[:print:]]*): ([[:print:]]*): Reset adapter$" description {{ An unexpected reset has been called because of some unexpected behaviour. }} action {{ Reset (restart?) the network interface. }} class: software type: config refcode: "ResetAdapter" message: e_err "Jumbo Frames not supported.\n" regex e_err "^([[:print:]]*): ([[:print:]]*): Jumbo Frames not supported\\.$" description {{ The configured MTU size is appropriate for Jumbo Frames; however, the adapter doesn't support Jumbo Frames. The default size for Jumbo Frames is 9234 bytes. }} action {{ Use the ifconfig command to set the MTU value to within the proper range. }} class: software type: config refcode: "JmbFrames" message: e_err "Unsupported MTU setting\n" regex e_err "^([[:print:]]*): ([[:print:]]*): Unsupported MTU setting$" description {{ Different adapters support different ranges for the MTU (maximum transmit unit) parameter. A system administrator has apparently configured an MTU value that is too small or too big. }} action {{ Use the ifconfig command to set the MTU value to within the proper range. }} class: software type: config refcode: "badMtu" message: e_err "Jumbo Frames not supported on this device when CRC stripping is disabled.\n" regex e_err "^([[:print:]]*): ([[:print:]]*): Jumbo Frames not supported on this device when CRC stripping is disabled\\.$" description {{ Jumbo frames on 82579 and newer devcies requires CRC be stripped. }} action {{ Enable CRC stripping on this device. }} class: software type: config refcode: "JmbFramesCRCStrip" message[chatter]: e_info "changing MTU from %d to %d\n" regex e_info "^([[:print:]]*): ([[:print:]]*): changing MTU from ([-]\?[0-9]{1,}) to ([-]\?[0-9]{1,})$" message[defensive]: e_err "Could not acquire PHY\n" regex e_err "^([[:print:]]*): ([[:print:]]*): Could not acquire PHY$" message[defensive]: e_err "Could not read PHY page 769\n" regex e_err "^([[:print:]]*): ([[:print:]]*): Could not read PHY page 769$" message[defensive]: e_err "Could not set PHY Host Wakeup bit\n" regex e_err "^([[:print:]]*): ([[:print:]]*): Could not set PHY Host Wakeup bit$" message[defensive]: dev_warn "Disabling L1 ASPM\n" regex dev_warn "^([[:print:]]*) ([[:print:]]*): Disabling L1 ASPM$" message[defensive]: dev_err "Cannot enable PCI device from suspend\n" regex dev_err "^([[:print:]]*) ([[:print:]]*): Cannot enable PCI device from suspend$" message[chatter]: e_info "PHY Wakeup cause - %s\n" regex e_info "^([[:print:]]*): ([[:print:]]*): PHY Wakeup cause - ([[:print:]]*)$" message[chatter]: e_info "MAC Wakeup cause - %s\n" regex e_info "^([[:print:]]*): ([[:print:]]*): MAC Wakeup cause - ([[:print:]]*)$" message[defensive]: dev_err "Cannot re-enable PCI device after reset.\n" regex dev_err "^([[:print:]]*) ([[:print:]]*): Cannot re-enable PCI device after reset\\.$" message: dev_err "can't bring device back up after reset\n" regex dev_err "^([[:print:]]*) ([[:print:]]*): can't bring device back up after reset$" description {{ This error happens during Enhanced Error Handling (EEH) on the PowerPC platform. During error recovery, the attempt to resume normal operation after a PCI bus reset failed. }} action {{ 1. Obtain a dump of the kernel stack and registers, and report the problem to your service provider. [How do you obtain a strack trace that's relevant to this problem?] 2. On a PowerPC platform, you can use the hotplug command to attempt to recover the adapter, rather than rebooting the Linux partition. [Where is the hotplug command documented? Under what circumstances SHOULD you reboot the partition?] }} class: software sl_severity: error refcode: "AEREnfail" message[chatter]: e_info "(PCI Express:2.5GB/s:%s) %pM\n" regex e_info "^([[:print:]]*): ([[:print:]]*): \\(PCI Express:2\\.5GB/s:([[:print:]]*)\\) (\\(null\\)|([0-9a-fA-F]{2}:){5}[0-9a-fA-F]{2})$" message[chatter]: e_info "Intel(R) PRO/%s Network Connection\n" regex e_info "^([[:print:]]*): ([[:print:]]*): Intel\\(R\\) PRO/([[:print:]]*) Network Connection$" message[chatter]: e_info "MAC: %d, PHY: %d, PBA No: %06x-%03x\n" regex e_info "^([[:print:]]*): ([[:print:]]*): MAC: ([-]\?[0-9]{1,}), PHY: ([-]\?[0-9]{1,}), PBA No: ([0]{0,5}[0-9a-f]{1,})-([0]{0,2}[0-9a-f]{1,})$" message[defensive]: dev_warn "Warning: detected DSPD enabled in EEPROM\n" regex dev_warn "^([[:print:]]*) ([[:print:]]*): Warning: detected DSPD enabled in EEPROM$" message[defensive]: dev_warn "Warning: detected ASPM enabled in EEPROM\n" regex dev_warn "^([[:print:]]*) ([[:print:]]*): Warning: detected ASPM enabled in EEPROM$" message: dev_err "No usable DMA configuration, aborting\n" regex dev_err "^([[:print:]]*) ([[:print:]]*): No usable DMA configuration, aborting$" description {{ Unable to enable DMA for either 32 or 64 bits with device_mask. The device driver couldn't continue to initialize the adapter because the adapter couldn't perform DMA properly on the system. [Explain device_mask, or omit the ref to it.] }} action {{ 1. Reboot Linux. 2. Verify that your kernel supports DMA mode for data transfer. [How? Is DMA support configurable?] }} class: software sl_severity: error refcode: "noDmaCfg" message: dev_err "pci_enable_pcie_error_reporting failed 0x%x\n" regex dev_err "^([[:print:]]*) ([[:print:]]*): pci_enable_pcie_error_reporting failed 0x([0-9a-f]{1,})$" /* Note: Wen has this as "pci_enable_error_reporting failed\n" */ description {{ This is a non-fatal error. The driver unsuccessfully attempted to enable AER on the adapter. This error means either the system doesn't support AER or the adapter doesn't support AER. The driver will continue to initialize the adapter. }} action {{ 1. Verify that your Linux kernel supports AER. 2. Verify that your adapter supports AER. }} class: software sl_severity: warning refcode: "AEREnfail" message: e_info "PHY reset is blocked due to SOL/IDER session.\n" regex e_info "^([[:print:]]*): ([[:print:]]*): PHY reset is blocked due to SOL/IDER session\\.$" description {{ The reset of the PHY (physical layer device) is blocked, but the driver continues to initialize the adapter. }} action {{ No action required. }} class: software type: info refcode: "PhyRstBlk" message: e_err "The NVM Checksum Is Not Valid\n" regex e_err "^([[:print:]]*): ([[:print:]]*): The NVM Checksum Is Not Valid$" description {{ The driver has given up trying to initialize the adapter because the adapter's EEPROM checksum is incorrect. }} action {{ @paste diags_eeprom_replace }} class: hardware type: perm refcode: "BF778E00" priority: H /* dup: dev_err "The NVM Checksum Is Not Valid\n" */ message: e_err "NVM Read Error while reading MAC address\n" regex e_err "^([[:print:]]*): ([[:print:]]*): NVM Read Error while reading MAC address$" description {{ The driver was unable to read the MAC address from the adapter's EEPROM. }} action {{ @paste diags_eeprom_replace }} class: software sl_severity: warning refcode: "RdMAC" /* dup: dev_err "NVM Read Error while reading MAC address\n" */ message: e_err "Invalid MAC Address: %pM\n" regex e_err "^([[:print:]]*): ([[:print:]]*): Invalid MAC Address: (\\(null\\)|([0-9a-fA-F]{2}:){5}[0-9a-fA-F]{2})$" description {{ The MAC address read from the adapter's EEPROM is not a valid Ethernet address. }} action {{ @paste diags_eeprom_replace }} class: hardware type: perm refcode: "BF778E00" priority: H /* dup: dev_err "Invalid MAC Address: %pM\n" */ message: dev_err "pci_disable_pcie_error_reporting failed 0x%x\n" regex dev_err "^([[:print:]]*) ([[:print:]]*): pci_disable_pcie_error_reporting failed 0x([0-9a-f]{1,})$" /* Note: Wen has this as "pci_disable_error_reporting failed\n" */ description {{ This is a non-fatal error. The driver unsuccessfully attempted to disable AER on the adapter. This error means either the system doesn't support AER or the adapter doesn't support AER. }} action {{ Verify that the adapter supports AER. If it doesn't, don't try to enable or disable AER for it. [How can the customer affect this?] }} class: software sl_severity: warning refcode: "AERDisfail" message[chatter]: printk KERN_INFO "%s: Intel(R) PRO/1000 Network Driver - %s\n" regex printk "^[[:print:]]*: Intel\\(R\\) PRO/1000 Network Driver - [[:print:]]*$" message[chatter]: printk KERN_INFO "%s: Copyright (c) 1999-2008 Intel Corporation.\n" regex printk "^[[:print:]]*: Copyright \\(c\\) 1999-2008 Intel Corporation\\.$" file: "drivers/net/ethernet/intel/e1000e/param.c" message[chatter]: e_info "%s Enabled\n" regex e_info "^([[:print:]]*): ([[:print:]]*): ([[:print:]]*) Enabled$" message[chatter]: e_info "%s Disabled\n" regex e_info "^([[:print:]]*): ([[:print:]]*): ([[:print:]]*) Disabled$" message[chatter]: e_info "%s set to %i\n" regex e_info "^([[:print:]]*): ([[:print:]]*): ([[:print:]]*) set to ([-]\?[0-9]{1,})$" /* Omit this: it would match everything. e_info "%s\n" */ message[chatter]: e_info "Invalid %s value specified (%i) %s\n" regex e_info "^([[:print:]]*): ([[:print:]]*): Invalid ([[:print:]]*) value specified \\(([-]\?[0-9]{1,})\\) ([[:print:]]*)$" message: e_notice "Warning: no configuration for board #%i\n" regex e_notice "^([[:print:]]*): ([[:print:]]*): Warning: no configuration for board #([-]\?[0-9]{1,})$" description {{ The number of network adapters in the system that are associated with the e1000e driver exceeds E1000_MAX_NIC, as defined in e1000_param.c of the driver source. }} action {{ Change E1000_MAX_NIC in e1000_param.c and rebuild the driver. ["(ii) Change the startup module parameter." How would this work? It appears that E1000_MAX_NIC is a compile-time constant.] }} class: software type: config refcode: "noBoard" message[defensive]: e_notice "Using defaults for all values\n" regex e_notice "^([[:print:]]*): ([[:print:]]*): Using defaults for all values$" message[chatter]: dev_info "%s set to default %d\n" regex dev_info "^([[:print:]]*) ([[:print:]]*): ([[:print:]]*) set to default ([-]\?[0-9]{1,})$" message[chatter]: e_info "%s turned off\n" regex e_info "^([[:print:]]*): ([[:print:]]*): ([[:print:]]*) turned off$" message[chatter]: e_info "%s set to dynamic mode\n" regex e_info "^([[:print:]]*): ([[:print:]]*): ([[:print:]]*) set to dynamic mode$" message[chatter]: e_info "%s set to dynamic conservative mode\n" regex e_info "^([[:print:]]*): ([[:print:]]*): ([[:print:]]*) set to dynamic conservative mode$" message[chatter]: dev_info "%s set to simplified (2000-8000 ints) mode\n" regex dev_info "^([[:print:]]*) ([[:print:]]*): ([[:print:]]*) set to simplified \\(2000-8000 ints\\) mode$" file: "drivers/net/ethernet/intel/e1000e/phy.c" /* * e_dbg "PHY Address %d is out of range\n" * e_dbg "MDI Read did not complete\n" * e_dbg "MDI Error\n" * e_dbg "PHY Address %d is out of range\n" * e_dbg "MDI Write did not complete\n" * e_dbg "MDI Error\n" * e_dbg "Setting page 0x%x\n" * e_dbg "Error committing the PHY changes\n" * e_dbg "Error resetting the PHY.\n" * e_dbg "Error Disabling LPLU D0\n" * e_dbg "autoneg_advertised %x\n" * e_dbg "Advertise 10mb Half duplex\n" * e_dbg "Advertise 10mb Full duplex\n" * e_dbg "Advertise 100mb Half duplex\n" * e_dbg "Advertise 100mb Full duplex\n" * e_dbg "Advertise 1000mb Half duplex request denied!\n" * e_dbg "Advertise 1000mb Full duplex\n" * e_dbg "Flow control param set incorrectly\n" * e_dbg "Auto-Neg Advertising %x\n" * e_dbg "Reconfiguring auto-neg advertisement params\n" * e_dbg "Error Setting up Auto-Negotiation\n" * e_dbg "Restarting Auto-Neg\n" * e_dbg "Error while waiting for autoneg to complete\n" * e_dbg "Forcing Speed and Duplex\n" * e_dbg "Error Forcing Speed and Duplex\n" * e_dbg "Valid link established!!!\n" * e_dbg "Unable to establish link!!!\n" * e_dbg "IGP PSCR: %X\n" * e_dbg "Waiting for forced speed/duplex link on IGP phy.\n" * e_dbg "Link taking longer than expected.\n" * e_dbg "M88E1000 PSCR: %X\n" * e_dbg "Waiting for forced speed/duplex link on M88 phy.\n" * e_dbg "Link taking longer than expected.\n" * e_dbg "IFE PMC: %X\n" * e_dbg "Waiting for forced speed/duplex link on IFE phy.\n" * e_dbg "Link taking longer than expected.\n" * e_dbg "Half Duplex\n" * e_dbg "Full Duplex\n" * e_dbg "Forcing 100mb\n" * e_dbg "Forcing 10mb\n" * e_dbg "Phy info is only valid for copper media\n" * e_dbg "Phy info is only valid if link is up\n" * e_dbg "Phy info is only valid if link is up\n" * e_dbg "Running IGP 3 PHY init script\n" * e_dbg "Could not set Port Control page\n" * e_dbg "Could not read PHY register %d.%d\n" * e_dbg "Could not write PHY register %d.%d\n" * e_dbg "Could not set Port Control page\n" * e_dbg "Could not restore PHY register %d.%d\n" * e_dbg "Attempting to access page %d while gig enabled.\n" * e_dbg "Could not enable PHY wakeup reg access\n" * e_dbg "Accessing PHY page %d reg 0x%x\n" * e_dbg "Could not write address opcode to page %d\n" * e_dbg "Could not access PHY reg %d.%d\n" * e_dbg "reading PHY page %d (or 0x%x shifted) reg 0x%x\n" * e_dbg "writing PHY page %d (or 0x%x shifted) reg 0x%x\n" * e_dbg "Could not write the Address Offset port register\n" * e_dbg "Could not access the Data port register\n" * e_dbg "Attempting to access page 800 while gig enabled\n" * e_dbg "Could not acquire PHY\n" * e_dbg "Could not write PHY the HV address register\n" * e_dbg "Could not read data value from HV data register\n" * e_dbg "I82577_PHY_CTRL_2: %X\n" * e_dbg "Waiting for forced speed/duplex link on 82577 phy\n" * e_dbg "Link taking longer than expected.\n" * e_dbg "Phy info is only valid if link is up\n" */ ppc64-diag-2.6.4/ela/message_catalog/with_regex/cxgb30000644000000000000000000005102312313010662021027 0ustar rootrootsubsystem: net devspec(device) = "/sys/bus/pci/devices/$device/devspec" filter: driver = "cxgb3" /* * This text is used repeatedly, so make it paste-able. * We also need to explain what to do with the info we get from #1 and #2. */ @copy version_diags_replace {{ 1. Run the "ethtool -i" command to determine the driver software level. 2. Execute diagnostics on the adapter, using "ethtool -t". 3. Replace the adapter board. }} /* cxgb3 kernel driver files have moved from drivers/net/cxgb3 to * drivers/net/ethernet/chelsio/cxgb3. */ file: " drivers/net/ethernet/chelsio/cxgb3/ael1002.c" message[defensive]: CH_WARN "PHY %u i2c read of dev.addr %#x.%#x timed out\n" regex CH_WARN "^cxgb3 ([[:print:]]*): PHY ([0-9]{1,}) i2c read of dev\\.addr (0x[0-9a-f]{1,})\\.(0x[0-9a-f]{1,}) timed out$" file: "drivers/net/ethernet/chelsio/cxgb3/aq100x.c" message[defensive]: CH_WARN "PHY%d: reset failed (0x%x).\n" regex CH_WARN "^cxgb3 ([[:print:]]*): PHY([-]\?[0-9]{1,}): reset failed \\(0x([0-9a-f]{1,})\\)\\.$" message[defensive]: CH_WARN "PHY%d: reset failed (0x%x, 0x%x).\n" regex CH_WARN "^cxgb3 ([[:print:]]*): PHY([-]\?[0-9]{1,}): reset failed \\(0x([0-9a-f]{1,}), 0x([0-9a-f]{1,})\\)\\.$" message[defensive]: CH_WARN "PHY%d: reset timed out (0x%x).\n" regex CH_WARN "^cxgb3 ([[:print:]]*): PHY([-]\?[0-9]{1,}): reset timed out \\(0x([0-9a-f]{1,})\\)\\.$" message[defensive]: CH_WARN "PHY%d: reset took %ums\n" regex CH_WARN "^cxgb3 ([[:print:]]*): PHY([-]\?[0-9]{1,}): reset took ([0-9]{1,})ms$" message[defensive]: CH_WARN "PHY%d: unsupported firmware %d\n" regex CH_WARN "^cxgb3 ([[:print:]]*): PHY([-]\?[0-9]{1,}): unsupported firmware ([-]\?[0-9]{1,})$" message[defensive]: CH_WARN "PHY%d does not start in low power mode.\n" regex CH_WARN "^cxgb3 ([[:print:]]*): PHY([-]\?[0-9]{1,}) does not start in low power mode\\.$" message[defensive]: CH_WARN "PHY%d: incorrect XAUI settings (0x%x, 0x%x).\n" regex CH_WARN "^cxgb3 ([[:print:]]*): PHY([-]\?[0-9]{1,}): incorrect XAUI settings \\(0x([0-9a-f]{1,}), 0x([0-9a-f]{1,})\\)\\.$" file: "drivers/net/ethernet/chelsio/cxgb3/cxgb3_main.c" message[chatter]: printk KERN_INFO "%s: link down\n" regex printk "^[[:print:]]*: link down$" message[chatter]: printk KERN_INFO "%s: link up, %s, %s-duplex\n" regex printk "^[[:print:]]*: link up, [[:print:]]*, [[:print:]]*-duplex$" message[chatter]: printk KERN_INFO "%s: PHY module unplugged\n" regex printk "^[[:print:]]*: PHY module unplugged$" message[chatter]: printk KERN_INFO "%s: %s PHY module inserted\n" regex printk "^[[:print:]]*: [[:print:]]* PHY module inserted$" message[defensive]: CH_ERR "firmware image too large %u, expected %d\n" regex CH_ERR "^cxgb3 ([[:print:]]*): firmware image too large ([0-9]{1,}), expected ([-]\?[0-9]{1,})$" message[defensive]: CH_ERR "corrupted firmware image, checksum %u\n" regex CH_ERR "^cxgb3 ([[:print:]]*): corrupted firmware image, checksum ([0-9]{1,})$" message: dev_err "could not upgrade firmware: unable to load %s\n" regex dev_err "^([[:print:]]*) ([[:print:]]*): could not upgrade firmware: unable to load ([[:print:]]*)$" description {{ The firmware on the adapter doesn't match what the driver requires. }} action {{ Verify that /lib/firmware/cxgb3 contains the correct firmware. [Where do they get the correct firmware?] [Re: your recommended action: Under what circumstances should you verify the driver software level, execute diagnostics, and/or replace the adapter?] }} class: software type: temp refcode: "cxgb3007" message[chatter]: dev_info "successful upgrade to firmware %d.%d.%d\n" regex dev_info "^([[:print:]]*) ([[:print:]]*): successful upgrade to firmware ([-]\?[0-9]{1,})\\.([-]\?[0-9]{1,})\\.([-]\?[0-9]{1,})$" message: dev_err "failed to upgrade to firmware %d.%d.%d\n" regex dev_err "^([[:print:]]*) ([[:print:]]*): failed to upgrade to firmware ([-]\?[0-9]{1,})\\.([-]\?[0-9]{1,})\\.([-]\?[0-9]{1,})$" description {{ The adapter contains the wrong firmware version, so the driver tried to update the firmware to the version stored in /lib/firmware/cxgb3. This update failed. }} action {{ Verify that /lib/firmware/cxgb3 contains the correct firmware. [Under what circumstances should you verify the driver software level, execute diagnostics, and/or replace the adapter?] }} class: software type: temp refcode: "cxgb3008" message: dev_err "could not load TP SRAM: unable to load %s\n" regex dev_err "^([[:print:]]*) ([[:print:]]*): could not load TP SRAM: unable to load ([[:print:]]*)$" description {{ The adapter contains the wrong microcode version, so the driver tried to update the TP SRAM to the version stored in /lib/firmware. This update failed. }} action {{ @paste version_diags_replace [Why don't we advise verifying that the correct microcode is in /lib/firmware?] }} class: software type: temp refcode: "cxgb3009" message[chatter]: dev_info "successful update of protocol engine to %d.%d.%d\n" regex dev_info "^([[:print:]]*) ([[:print:]]*): successful update of protocol engine to ([-]\?[0-9]{1,})\\.([-]\?[0-9]{1,})\\.([-]\?[0-9]{1,})$" /* This is reported right before the next message. */ message[redundant]: dev_err "failed to update of protocol engine %d.%d.%d\n" regex dev_err "^([[:print:]]*) ([[:print:]]*): failed to update of protocol engine ([-]\?[0-9]{1,})\\.([-]\?[0-9]{1,})\\.([-]\?[0-9]{1,})$" message: dev_err "loading protocol SRAM failed\n" regex dev_err "^([[:print:]]*) ([[:print:]]*): loading protocol SRAM failed$" description {{ The required version of microcode could not be written to the adapter. }} action {{ @paste version_diags_replace }} /* Shouldn't this be hardware/perm? */ class: software type: temp refcode: "cxgb3010" message: CH_WARN "FW upgrade to %d.%d.%d %s\n" regex CH_WARN "^cxgb3 ([[:print:]]*): FW upgrade to ([-]\?[0-9]{1,})\\.([-]\?[0-9]{1,})\\.([-]\?[0-9]{1,}) ([[:print:]]*)$" description {{ The adapter's firmware is out of sync with the driver. The driver will attempt to load the correct version of firmware into the adapter. }} action {{ Refer to subsequent messages to determine whether the firmware upgrade was successful. }} class: software type: info message: CH_WARN "TP upgrade to %d.%d.%d %s\n" regex CH_WARN "^cxgb3 ([[:print:]]*): TP upgrade to ([-]\?[0-9]{1,})\\.([-]\?[0-9]{1,})\\.([-]\?[0-9]{1,}) ([[:print:]]*)$" description {{ The adapter's microcode is out of sync with the driver. The driver will attempt to load the correct version of microcode into the adapter. }} action {{ Refer to subsequent messages to determine whether the microcode upgrade was successful. }} class: software type: info /* This next one can result from ENOMEM. */ message: CH_ERR "failed to bind qsets, err %d\n" regex CH_ERR "^cxgb3 ([[:print:]]*): failed to bind qsets, err ([-]\?[0-9]{1,})$" description {{ The adapter failed to start up correctly, possibly due to a low-memory condition. }} action {{ Free up memory and retry the failed operation, or add memory to your system. If the problem persists, try the following: @paste version_diags_replace }} class: software type: perm refcode: "cxgb3011" message[defensive]: CH_ERR "request_irq failed, err %d\n" regex CH_ERR "^cxgb3 ([[:print:]]*): request_irq failed, err ([-]\?[0-9]{1,})$" message[defensive]: dev_dbg "cannot create sysfs group\n" regex dev_dbg "^([[:print:]]*) ([[:print:]]*): cannot create sysfs group$" message[defensive]: printk KERN_WARNING "Could not initialize offload capabilities\n" regex printk "^Could not initialize offload capabilities$" message[defensive]: dev_err "Cannot re-enable PCI device after reset.\n" regex dev_err "^([[:print:]]*) ([[:print:]]*): Cannot re-enable PCI device after reset\\.$" message[defensive]: dev_err "can't bring device back up after reset\n" regex dev_err "^([[:print:]]*) ([[:print:]]*): can't bring device back up after reset$" message[defensive]: CH_ALERT "adapter reset %s\n" regex CH_ALERT "^cxgb3 ([[:print:]]*): adapter reset ([[:print:]]*)$" message: CH_ALERT "encountered fatal error, operation suspended\n" regex CH_ALERT "^cxgb3 ([[:print:]]*): encountered fatal error, operation suspended$" description {{ Adapter goes to recovery. [What does that mean?] }} action {{ @paste version_diags_replace }} class: software type: temp refcode: "cxgb3005" message[defensive]: CH_ALERT "FW status: 0x%x, 0x%x, 0x%x, 0x%x\n" regex CH_ALERT "^cxgb3 ([[:print:]]*): FW status: 0x([0-9a-f]{1,}), 0x([0-9a-f]{1,}), 0x([0-9a-f]{1,}), 0x([0-9a-f]{1,})$" message[defensive]: CH_ALERT "adapter recovering, PEX ERR 0x%x\n" regex CH_ALERT "^cxgb3 ([[:print:]]*): adapter recovering, PEX ERR 0x([0-9a-f]{1,})$" message[chatter]: dev_info "Port %d using %d queue sets.\n" regex dev_info "^([[:print:]]*) ([[:print:]]*): Port ([-]\?[0-9]{1,}) using ([-]\?[0-9]{1,}) queue sets\\.$" message[chatter]: printk KERN_INFO "%s: %s %s %sNIC (rev %d) %s%s\n" regex printk "^[[:print:]]*: [[:print:]]* [[:print:]]* [[:print:]]*NIC \\(rev [-]\?[0-9]{1,}\\) [[:print:]]*[[:print:]]*$" message[chatter]: printk KERN_INFO "%s: %uMB CM, %uMB PMTX, %uMB PMRX, S/N: %s\n" regex printk "^[[:print:]]*: [0-9]{1,}MB CM, [0-9]{1,}MB PMTX, [0-9]{1,}MB PMRX, S/N: [[:print:]]*$" message[chatter]: printk KERN_INFO "%s - version %s\n" regex printk "^[[:print:]]* - version [[:print:]]*$" /* Replaced DRV_NAME with "cxgb3" in this next one. */ message: printk KERN_ERR "cxgb3: cannot initialize work queue\n" regex printk "^cxgb3: cannot initialize work queue$" description {{ The driver could not initialize a work queue while probing for devices, probably because of a low-memory condition. }} action {{ Free up memory and retry the failed operation, or add memory to your system. }} class: hardware type: perm priority: H refcode: "cxgb3001" message[chatter]: dev_info "cannot obtain PCI resources\n" regex dev_info "^([[:print:]]*) ([[:print:]]*): cannot obtain PCI resources$" message: dev_err "cannot enable PCI device\n" regex dev_err "^([[:print:]]*) ([[:print:]]*): cannot enable PCI device$" description {{ Can't enable PCI IO and memory resources for this adapter }} action {{ @paste version_diags_replace }} class: hardware type: perm priority: H refcode: "cxgb3002" message: dev_err "unable to obtain 64-bit DMA for coherent allocations\n" regex dev_err "^([[:print:]]*) ([[:print:]]*): unable to obtain 64-bit DMA for coherent allocations$" description {{ Cannot obtain 64-bit DMA allocations for this adapter now. }} action {{ @paste version_diags_replace }} class: hardware type: perm priority: H refcode: "cxgb3003" message[defensive]: dev_err "no usable DMA configuration\n" regex dev_err "^([[:print:]]*) ([[:print:]]*): no usable DMA configuration$" message[defensive]: dev_err "cannot allocate nofail buffer\n" regex dev_err "^([[:print:]]*) ([[:print:]]*): cannot allocate nofail buffer$" message: dev_err "cannot map device registers\n" regex dev_err "^([[:print:]]*) ([[:print:]]*): cannot map device registers$" description {{ Couldn't map device registers for MMIO registers access. }} action {{ @paste version_diags_replace }} class: hardware type: perm priority: H refcode: "cxgb3004" message[defensive]: dev_warn "cannot register net device %s, skipping\n" regex dev_warn "^([[:print:]]*) ([[:print:]]*): cannot register net device ([[:print:]]*), skipping$" message[defensive]: dev_err "could not register any net devices\n" regex dev_err "^([[:print:]]*) ([[:print:]]*): could not register any net devices$" file: "drivers/net/ethernet/chelsio/cxgb3/cxgb3_offload.c" message[chatter]: printk KERN_INFO "%s, iscsi set MaxRxData to 16224 (0x%x).\n" regex printk "^[[:print:]]*, iscsi set MaxRxData to 16224 \\(0x[0-9a-f]{1,}\\)\\.$" message[chatter]: printk KERN_INFO "%s, setting iscsi pgsz 0x%x, %u,%u,%u,%u.\n" regex printk "^[[:print:]]*, setting iscsi pgsz 0x[0-9a-f]{1,}, [0-9]{1,},[0-9]{1,},[0-9]{1,},[0-9]{1,}\\.$" message[defensive]: printk KERN_ERR "Unexpected SMT_WRITE_RPL status %u for entry %u\n" regex printk "^Unexpected SMT_WRITE_RPL status [0-9]{1,} for entry [0-9]{1,}$" message[defensive]: printk KERN_ERR "Unexpected L2T_WRITE_RPL status %u for entry %u\n" regex printk "^Unexpected L2T_WRITE_RPL status [0-9]{1,} for entry [0-9]{1,}$" message[defensive]: printk KERN_ERR "Unexpected RTE_WRITE_RPL status %u for entry %u\n" regex printk "^Unexpected RTE_WRITE_RPL status [0-9]{1,} for entry [0-9]{1,}$" message[defensive]: printk KERN_ERR "%s: received clientless CPL command 0x%x\n" regex printk "^[[:print:]]*: received clientless CPL command 0x[0-9a-f]{1,}$" /* dup: printk KERN_ERR "%s: received clientless CPL command 0x%x\n" */ /* dup: printk KERN_ERR "%s: received clientless CPL command 0x%x\n" */ message[defensive]: printk default "%s: passive open TID %u too large\n" regex printk "^[[:print:]]*: passive open TID [0-9]{1,} too large$" /* dup: printk KERN_ERR "%s: received clientless CPL command 0x%x\n" */ message[enomem]: printk default "do_abort_req_rss: couldn't get skb!\n" regex printk "^do_abort_req_rss: couldn't get skb!$" message[defensive]: printk default "%s: active establish TID %u too large\n" regex printk "^[[:print:]]*: active establish TID [0-9]{1,} too large$" /* dup: printk KERN_ERR "%s: received clientless CPL command 0x%x\n" */ /* dup: printk KERN_ERR "%s: received clientless CPL command 0x%x\n" */ message[defensive]: printk KERN_ERR "%s: received bad CPL command 0x%x\n" regex printk "^[[:print:]]*: received bad CPL command 0x[0-9a-f]{1,}$" message[defensive]: printk KERN_ERR "T3C: handler registration for opcode %x failed\n" regex printk "^T3C: handler registration for opcode [0-9a-f]{1,} failed$" message[defensive]: printk KERN_ERR "%s: CPL message (opcode %u) had unknown TID %u\n" regex printk "^[[:print:]]*: CPL message \\(opcode [0-9]{1,}\\) had unknown TID [0-9]{1,}$" message[enomem]: printk KERN_ERR "%s: cannot allocate skb!\n" regex printk "^[[:print:]]*: cannot allocate skb!$" message[defensive]: printk KERN_WARNING "%s: Redirect to non-offload device ignored.\n" regex printk "^[[:print:]]*: Redirect to non-offload device ignored\\.$" message[defensive]: printk KERN_WARNING "%s: Redirect to different offload device ignored.\n" regex printk "^[[:print:]]*: Redirect to different offload device ignored\\.$" message[defensive]: printk KERN_ERR "%s: couldn't allocate new l2t entry!\n" regex printk "^[[:print:]]*: couldn't allocate new l2t entry!$" file: "drivers/net/ethernet/chelsio/cxgb3/mc5.c" message[defensive]: CH_ERR "MC5 timeout writing to TCAM address 0x%x\n" regex CH_ERR "^cxgb3 ([[:print:]]*): MC5 timeout writing to TCAM address 0x([0-9a-f]{1,})$" message[defensive]: CH_ERR "TCAM reset timed out\n" regex CH_ERR "^cxgb3 ([[:print:]]*): TCAM reset timed out$" message[defensive]: CH_ERR "Unsupported TCAM type %d\n" regex CH_ERR "^cxgb3 ([[:print:]]*): Unsupported TCAM type ([-]\?[0-9]{1,})$" message[defensive]: CH_ALERT "MC5 parity error\n" regex CH_ALERT "^cxgb3 ([[:print:]]*): MC5 parity error$" message[defensive]: CH_ALERT "MC5 request queue parity error\n" regex CH_ALERT "^cxgb3 ([[:print:]]*): MC5 request queue parity error$" message[defensive]: CH_ALERT "MC5 dispatch queue parity error\n" regex CH_ALERT "^cxgb3 ([[:print:]]*): MC5 dispatch queue parity error$" file: "drivers/net/ethernet/chelsio/cxgb3/sge.c" message[defensive]: dev_err "%s: Tx ring %u full while queue awake!\n" regex dev_err "^([[:print:]]*) ([[:print:]]*): ([[:print:]]*): Tx ring ([0-9]{1,}) full while queue awake!$" message[defensive]: CH_ALERT "SGE parity error (0x%x)\n" regex CH_ALERT "^cxgb3 ([[:print:]]*): SGE parity error \\(0x([0-9a-f]{1,})\\)$" message[defensive]: CH_ALERT "SGE framing error (0x%x)\n" regex CH_ALERT "^cxgb3 ([[:print:]]*): SGE framing error \\(0x([0-9a-f]{1,})\\)$" message[defensive]: CH_ALERT "SGE response queue credit overflow\n" regex CH_ALERT "^cxgb3 ([[:print:]]*): SGE response queue credit overflow$" message[defensive]: CH_ALERT "packet delivered to disabled response queue (0x%x)\n" regex CH_ALERT "^cxgb3 ([[:print:]]*): packet delivered to disabled response queue \\(0x([0-9a-f]{1,})\\)$" message[defensive]: CH_ALERT "SGE dropped %s priority doorbell\n" regex CH_ALERT "^cxgb3 ([[:print:]]*): SGE dropped ([[:print:]]*) priority doorbell$" message[defensive]: CH_ALERT "free list queue 0 initialization failed\n" regex CH_ALERT "^cxgb3 ([[:print:]]*): free list queue 0 initialization failed$" message[defensive]: CH_WARN "free list queue 0 enabled with %d credits\n" regex CH_WARN "^cxgb3 ([[:print:]]*): free list queue 0 enabled with ([-]\?[0-9]{1,}) credits$" message[defensive]: CH_WARN "free list queue 1 enabled with %d credits\n" regex CH_WARN "^cxgb3 ([[:print:]]*): free list queue 1 enabled with ([-]\?[0-9]{1,}) credits$" file: "drivers/net/ethernet/chelsio/cxgb3/t3_hw.c" message[defensive]: CH_ERR "reading EEPROM address 0x%x failed\n" regex CH_ERR "^cxgb3 ([[:print:]]*): reading EEPROM address 0x([0-9a-f]{1,}) failed$" message[defensive]: CH_ERR "write to EEPROM address 0x%x failed\n" regex CH_ERR "^cxgb3 ([[:print:]]*): write to EEPROM address 0x([0-9a-f]{1,}) failed$" message[defensive]: CH_ERR "found wrong TP version (%u.%u), driver compiled for version %d.%d\n" regex CH_ERR "^cxgb3 ([[:print:]]*): found wrong TP version \\(([0-9]{1,})\\.([0-9]{1,})\\), driver compiled for version ([-]\?[0-9]{1,})\\.([-]\?[0-9]{1,})$" message[defensive]: CH_ERR "corrupted protocol SRAM image, checksum %u\n" regex CH_ERR "^cxgb3 ([[:print:]]*): corrupted protocol SRAM image, checksum ([0-9]{1,})$" message[defensive]: CH_WARN "found old FW minor version(%u.%u), driver compiled for version %u.%u\n" regex CH_WARN "^cxgb3 ([[:print:]]*): found old FW minor version\\(([0-9]{1,})\\.([0-9]{1,})\\), driver compiled for version ([0-9]{1,})\\.([0-9]{1,})$" message[defensive]: CH_WARN "found newer FW version(%u.%u), driver compiled for version %u.%u\n" regex CH_WARN "^cxgb3 ([[:print:]]*): found newer FW version\\(([0-9]{1,})\\.([0-9]{1,})\\), driver compiled for version ([0-9]{1,})\\.([0-9]{1,})$" message[defensive]: CH_ERR "corrupted firmware image, checksum %u\n" regex CH_ERR "^cxgb3 ([[:print:]]*): corrupted firmware image, checksum ([0-9]{1,})$" message[defensive]: CH_ERR "firmware download failed, error %d\n" regex CH_ERR "^cxgb3 ([[:print:]]*): firmware download failed, error ([-]\?[0-9]{1,})$" message[defensive]: CH_ALERT "%s (0x%x)\n" regex CH_ALERT "^cxgb3 ([[:print:]]*): ([[:print:]]*) \\(0x([0-9a-f]{1,})\\)$" message[defensive]: CH_WARN "%s (0x%x)\n" regex CH_WARN "^cxgb3 ([[:print:]]*): ([[:print:]]*) \\(0x([0-9a-f]{1,})\\)$" message[defensive]: CH_ALERT "PEX error code 0x%x\n" regex CH_ALERT "^cxgb3 ([[:print:]]*): PEX error code 0x([0-9a-f]{1,})$" message[defensive]: CH_WARN "%s MC7 correctable error at addr 0x%x, data 0x%x 0x%x 0x%x\n" regex CH_WARN "^cxgb3 ([[:print:]]*): ([[:print:]]*) MC7 correctable error at addr 0x([0-9a-f]{1,}), data 0x([0-9a-f]{1,}) 0x([0-9a-f]{1,}) 0x([0-9a-f]{1,})$" message[defensive]: CH_ALERT "%s MC7 uncorrectable error at addr 0x%x, data 0x%x 0x%x 0x%x\n" regex CH_ALERT "^cxgb3 ([[:print:]]*): ([[:print:]]*) MC7 uncorrectable error at addr 0x([0-9a-f]{1,}), data 0x([0-9a-f]{1,}) 0x([0-9a-f]{1,}) 0x([0-9a-f]{1,})$" message[defensive]: CH_ALERT "%s MC7 parity error 0x%x\n" regex CH_ALERT "^cxgb3 ([[:print:]]*): ([[:print:]]*) MC7 parity error 0x([0-9a-f]{1,})$" message[defensive]: CH_ALERT "%s MC7 address error: 0x%x\n" regex CH_ALERT "^cxgb3 ([[:print:]]*): ([[:print:]]*) MC7 address error: 0x([0-9a-f]{1,})$" message[defensive]: CH_ALERT "port%d: MAC TX FIFO parity error\n" regex CH_ALERT "^cxgb3 ([[:print:]]*): port([-]\?[0-9]{1,}): MAC TX FIFO parity error$" message[defensive]: CH_ALERT "port%d: MAC RX FIFO parity error\n" regex CH_ALERT "^cxgb3 ([[:print:]]*): port([-]\?[0-9]{1,}): MAC RX FIFO parity error$" message[defensive]: CH_ERR "TP initialization timed out\n" regex CH_ERR "^cxgb3 ([[:print:]]*): TP initialization timed out$" message[defensive]: CH_ERR "MAC calibration failed\n" regex CH_ERR "^cxgb3 ([[:print:]]*): MAC calibration failed$" message[defensive]: CH_ERR "write to MC7 register 0x%x timed out\n" regex CH_ERR "^cxgb3 ([[:print:]]*): write to MC7 register 0x([0-9a-f]{1,}) timed out$" message[defensive]: CH_ERR "%s MC7 calibration timed out\n" regex CH_ERR "^cxgb3 ([[:print:]]*): ([[:print:]]*) MC7 calibration timed out$" message[defensive]: CH_ERR "%s MC7 BIST timed out\n" regex CH_ERR "^cxgb3 ([[:print:]]*): ([[:print:]]*) MC7 BIST timed out$" message[defensive]: CH_ERR "uP initialization timed out\n" regex CH_ERR "^cxgb3 ([[:print:]]*): uP initialization timed out$" message[defensive]: CH_ALERT "Invalid port type index %d\n" regex CH_ALERT "^cxgb3 ([[:print:]]*): Invalid port type index ([-]\?[0-9]{1,})$" file: "drivers/net/ethernet/chelsio/cxgb3/xgmac.c" message[defensive]: CH_ERR "MAC %d XAUI SERDES CMU lock failed\n" regex CH_ERR "^cxgb3 ([[:print:]]*): MAC ([-]\?[0-9]{1,}) XAUI SERDES CMU lock failed$" message[defensive]: CH_ERR "MAC %d Rx fifo drain failed\n" regex CH_ERR "^cxgb3 ([[:print:]]*): MAC ([-]\?[0-9]{1,}) Rx fifo drain failed$" ppc64-diag-2.6.4/ela/message_catalog/cxgb30000644000000000000000000002673512313010662016676 0ustar rootrootsubsystem: net devspec(device) = "/sys/bus/pci/devices/$device/devspec" filter: driver = "cxgb3" /* * This text is used repeatedly, so make it paste-able. * We also need to explain what to do with the info we get from #1 and #2. */ @copy version_diags_replace {{ 1. Run the "ethtool -i" command to determine the driver software level. 2. Execute diagnostics on the adapter, using "ethtool -t". 3. Replace the adapter board. }} /* cxgb3 kernel driver files have moved from drivers/net/cxgb3 to * drivers/net/ethernet/chelsio/cxgb3. */ file: " drivers/net/ethernet/chelsio/cxgb3/ael1002.c" message[defensive]: CH_WARN "PHY %u i2c read of dev.addr %#x.%#x timed out\n" file: "drivers/net/ethernet/chelsio/cxgb3/aq100x.c" message[defensive]: CH_WARN "PHY%d: reset failed (0x%x).\n" message[defensive]: CH_WARN "PHY%d: reset failed (0x%x, 0x%x).\n" message[defensive]: CH_WARN "PHY%d: reset timed out (0x%x).\n" message[defensive]: CH_WARN "PHY%d: reset took %ums\n" message[defensive]: CH_WARN "PHY%d: unsupported firmware %d\n" message[defensive]: CH_WARN "PHY%d does not start in low power mode.\n" message[defensive]: CH_WARN "PHY%d: incorrect XAUI settings (0x%x, 0x%x).\n" file: "drivers/net/ethernet/chelsio/cxgb3/cxgb3_main.c" message[chatter]: printk KERN_INFO "%s: link down\n" message[chatter]: printk KERN_INFO "%s: link up, %s, %s-duplex\n" message[chatter]: printk KERN_INFO "%s: PHY module unplugged\n" message[chatter]: printk KERN_INFO "%s: %s PHY module inserted\n" message[defensive]: CH_ERR "firmware image too large %u, expected %d\n" message[defensive]: CH_ERR "corrupted firmware image, checksum %u\n" message: dev_err "could not upgrade firmware: unable to load %s\n" description {{ The firmware on the adapter doesn't match what the driver requires. }} action {{ Verify that /lib/firmware/cxgb3 contains the correct firmware. [Where do they get the correct firmware?] [Re: your recommended action: Under what circumstances should you verify the driver software level, execute diagnostics, and/or replace the adapter?] }} class: software type: temp refcode: "cxgb3007" message[chatter]: dev_info "successful upgrade to firmware %d.%d.%d\n" message: dev_err "failed to upgrade to firmware %d.%d.%d\n" description {{ The adapter contains the wrong firmware version, so the driver tried to update the firmware to the version stored in /lib/firmware/cxgb3. This update failed. }} action {{ Verify that /lib/firmware/cxgb3 contains the correct firmware. [Under what circumstances should you verify the driver software level, execute diagnostics, and/or replace the adapter?] }} class: software type: temp refcode: "cxgb3008" message: dev_err "could not load TP SRAM: unable to load %s\n" description {{ The adapter contains the wrong microcode version, so the driver tried to update the TP SRAM to the version stored in /lib/firmware. This update failed. }} action {{ @paste version_diags_replace [Why don't we advise verifying that the correct microcode is in /lib/firmware?] }} class: software type: temp refcode: "cxgb3009" message[chatter]: dev_info "successful update of protocol engine to %d.%d.%d\n" /* This is reported right before the next message. */ message[redundant]: dev_err "failed to update of protocol engine %d.%d.%d\n" message: dev_err "loading protocol SRAM failed\n" description {{ The required version of microcode could not be written to the adapter. }} action {{ @paste version_diags_replace }} /* Shouldn't this be hardware/perm? */ class: software type: temp refcode: "cxgb3010" message: CH_WARN "FW upgrade to %d.%d.%d %s\n" description {{ The adapter's firmware is out of sync with the driver. The driver will attempt to load the correct version of firmware into the adapter. }} action {{ Refer to subsequent messages to determine whether the firmware upgrade was successful. }} class: software type: info message: CH_WARN "TP upgrade to %d.%d.%d %s\n" description {{ The adapter's microcode is out of sync with the driver. The driver will attempt to load the correct version of microcode into the adapter. }} action {{ Refer to subsequent messages to determine whether the microcode upgrade was successful. }} class: software type: info /* This next one can result from ENOMEM. */ message: CH_ERR "failed to bind qsets, err %d\n" description {{ The adapter failed to start up correctly, possibly due to a low-memory condition. }} action {{ Free up memory and retry the failed operation, or add memory to your system. If the problem persists, try the following: @paste version_diags_replace }} class: software type: perm refcode: "cxgb3011" message[defensive]: CH_ERR "request_irq failed, err %d\n" message[defensive]: dev_dbg "cannot create sysfs group\n" message[defensive]: printk KERN_WARNING "Could not initialize offload capabilities\n" message[defensive]: dev_err "Cannot re-enable PCI device after reset.\n" message[defensive]: dev_err "can't bring device back up after reset\n" message[defensive]: CH_ALERT "adapter reset %s\n" message: CH_ALERT "encountered fatal error, operation suspended\n" description {{ Adapter goes to recovery. [What does that mean?] }} action {{ @paste version_diags_replace }} class: software type: temp refcode: "cxgb3005" message[defensive]: CH_ALERT "FW status: 0x%x, 0x%x, 0x%x, 0x%x\n" message[defensive]: CH_ALERT "adapter recovering, PEX ERR 0x%x\n" message[chatter]: dev_info "Port %d using %d queue sets.\n" message[chatter]: printk KERN_INFO "%s: %s %s %sNIC (rev %d) %s%s\n" message[chatter]: printk KERN_INFO "%s: %uMB CM, %uMB PMTX, %uMB PMRX, S/N: %s\n" message[chatter]: printk KERN_INFO "%s - version %s\n" /* Replaced DRV_NAME with "cxgb3" in this next one. */ message: printk KERN_ERR "cxgb3: cannot initialize work queue\n" description {{ The driver could not initialize a work queue while probing for devices, probably because of a low-memory condition. }} action {{ Free up memory and retry the failed operation, or add memory to your system. }} class: hardware type: perm priority: H refcode: "cxgb3001" message[chatter]: dev_info "cannot obtain PCI resources\n" message: dev_err "cannot enable PCI device\n" description {{ Can't enable PCI IO and memory resources for this adapter }} action {{ @paste version_diags_replace }} class: hardware type: perm priority: H refcode: "cxgb3002" message: dev_err "unable to obtain 64-bit DMA for coherent allocations\n" description {{ Cannot obtain 64-bit DMA allocations for this adapter now. }} action {{ @paste version_diags_replace }} class: hardware type: perm priority: H refcode: "cxgb3003" message[defensive]: dev_err "no usable DMA configuration\n" message[defensive]: dev_err "cannot allocate nofail buffer\n" message: dev_err "cannot map device registers\n" description {{ Couldn't map device registers for MMIO registers access. }} action {{ @paste version_diags_replace }} class: hardware type: perm priority: H refcode: "cxgb3004" message[defensive]: dev_warn "cannot register net device %s, skipping\n" message[defensive]: dev_err "could not register any net devices\n" file: "drivers/net/ethernet/chelsio/cxgb3/cxgb3_offload.c" message[chatter]: printk KERN_INFO "%s, iscsi set MaxRxData to 16224 (0x%x).\n" message[chatter]: printk KERN_INFO "%s, setting iscsi pgsz 0x%x, %u,%u,%u,%u.\n" message[defensive]: printk KERN_ERR "Unexpected SMT_WRITE_RPL status %u for entry %u\n" message[defensive]: printk KERN_ERR "Unexpected L2T_WRITE_RPL status %u for entry %u\n" message[defensive]: printk KERN_ERR "Unexpected RTE_WRITE_RPL status %u for entry %u\n" message[defensive]: printk KERN_ERR "%s: received clientless CPL command 0x%x\n" /* dup: printk KERN_ERR "%s: received clientless CPL command 0x%x\n" */ /* dup: printk KERN_ERR "%s: received clientless CPL command 0x%x\n" */ message[defensive]: printk default "%s: passive open TID %u too large\n" /* dup: printk KERN_ERR "%s: received clientless CPL command 0x%x\n" */ message[enomem]: printk default "do_abort_req_rss: couldn't get skb!\n" message[defensive]: printk default "%s: active establish TID %u too large\n" /* dup: printk KERN_ERR "%s: received clientless CPL command 0x%x\n" */ /* dup: printk KERN_ERR "%s: received clientless CPL command 0x%x\n" */ message[defensive]: printk KERN_ERR "%s: received bad CPL command 0x%x\n" message[defensive]: printk KERN_ERR "T3C: handler registration for opcode %x failed\n" message[defensive]: printk KERN_ERR "%s: CPL message (opcode %u) had unknown TID %u\n" message[enomem]: printk KERN_ERR "%s: cannot allocate skb!\n" message[defensive]: printk KERN_WARNING "%s: Redirect to non-offload device ignored.\n" message[defensive]: printk KERN_WARNING "%s: Redirect to different offload device ignored.\n" message[defensive]: printk KERN_ERR "%s: couldn't allocate new l2t entry!\n" file: "drivers/net/ethernet/chelsio/cxgb3/mc5.c" message[defensive]: CH_ERR "MC5 timeout writing to TCAM address 0x%x\n" message[defensive]: CH_ERR "TCAM reset timed out\n" message[defensive]: CH_ERR "Unsupported TCAM type %d\n" message[defensive]: CH_ALERT "MC5 parity error\n" message[defensive]: CH_ALERT "MC5 request queue parity error\n" message[defensive]: CH_ALERT "MC5 dispatch queue parity error\n" file: "drivers/net/ethernet/chelsio/cxgb3/sge.c" message[defensive]: dev_err "%s: Tx ring %u full while queue awake!\n" message[defensive]: CH_ALERT "SGE parity error (0x%x)\n" message[defensive]: CH_ALERT "SGE framing error (0x%x)\n" message[defensive]: CH_ALERT "SGE response queue credit overflow\n" message[defensive]: CH_ALERT "packet delivered to disabled response queue (0x%x)\n" message[defensive]: CH_ALERT "SGE dropped %s priority doorbell\n" message[defensive]: CH_ALERT "free list queue 0 initialization failed\n" message[defensive]: CH_WARN "free list queue 0 enabled with %d credits\n" message[defensive]: CH_WARN "free list queue 1 enabled with %d credits\n" file: "drivers/net/ethernet/chelsio/cxgb3/t3_hw.c" message[defensive]: CH_ERR "reading EEPROM address 0x%x failed\n" message[defensive]: CH_ERR "write to EEPROM address 0x%x failed\n" message[defensive]: CH_ERR "found wrong TP version (%u.%u), driver compiled for version %d.%d\n" message[defensive]: CH_ERR "corrupted protocol SRAM image, checksum %u\n" message[defensive]: CH_WARN "found old FW minor version(%u.%u), driver compiled for version %u.%u\n" message[defensive]: CH_WARN "found newer FW version(%u.%u), driver compiled for version %u.%u\n" message[defensive]: CH_ERR "corrupted firmware image, checksum %u\n" message[defensive]: CH_ERR "firmware download failed, error %d\n" message[defensive]: CH_ALERT "%s (0x%x)\n" message[defensive]: CH_WARN "%s (0x%x)\n" message[defensive]: CH_ALERT "PEX error code 0x%x\n" message[defensive]: CH_WARN "%s MC7 correctable error at addr 0x%x, data 0x%x 0x%x 0x%x\n" message[defensive]: CH_ALERT "%s MC7 uncorrectable error at addr 0x%x, data 0x%x 0x%x 0x%x\n" message[defensive]: CH_ALERT "%s MC7 parity error 0x%x\n" message[defensive]: CH_ALERT "%s MC7 address error: 0x%x\n" message[defensive]: CH_ALERT "port%d: MAC TX FIFO parity error\n" message[defensive]: CH_ALERT "port%d: MAC RX FIFO parity error\n" message[defensive]: CH_ERR "TP initialization timed out\n" message[defensive]: CH_ERR "MAC calibration failed\n" message[defensive]: CH_ERR "write to MC7 register 0x%x timed out\n" message[defensive]: CH_ERR "%s MC7 calibration timed out\n" message[defensive]: CH_ERR "%s MC7 BIST timed out\n" message[defensive]: CH_ERR "uP initialization timed out\n" message[defensive]: CH_ALERT "Invalid port type index %d\n" file: "drivers/net/ethernet/chelsio/cxgb3/xgmac.c" message[defensive]: CH_ERR "MAC %d XAUI SERDES CMU lock failed\n" message[defensive]: CH_ERR "MAC %d Rx fifo drain failed\n" ppc64-diag-2.6.4/ela/reporter_lex.l0000644000000000000000000000247612313010662015512 0ustar rootroot%{ /* * Tokenizer for reporters catalog * * Copyright (C) International Business Machines Corp., 2009, 2010 * */ #define CATALOGS_IMPLEMENTATION #include "catalogs.h" #include "rr.tab.h" #include #include extern ReporterCtlgParser reporter_ctlg_parser; static ReporterCtlgParser *pc = &reporter_ctlg_parser; %} %option noyywrap %% aliases { return KW_ALIASES; } device_arg { return KW_DEVICE_ARG; } meta_reporter { return KW_META_REPORTER; } prefix_args { return KW_PREFIX_ARGS; } prefix_format { return KW_PREFIX_FORMAT; } reporter { return KW_REPORTER; } source { return KW_SOURCE; } variants { return KW_VARIANTS; } [_A-Za-z][A-Za-z0-9_]* { char *name; if (! (name = strdup((const char*)yytext)) ) { perror("strdup"); return ERRTOK; } rrlval.sval = name; return TK_NAME; } \" { char *s = pc->get_string(1); if (!s) return ERRTOK; rrlval.sval = s; return TK_STRING; } [ \t\r] ; /* Skip white space. */ \n { pc->lineno++; } "/*" { if (pc->skip_comment() < 0) return ERRTOK; } . { return yytext[0]; /* Pass through any other characters. */ } %% /* unput is a macro, but we need a function pointer. */ static void unput_func(int c) { unput(c); } void ReporterCtlgParser::init_lex(void) { YY_FLUSH_BUFFER; yyrestart(file); lineno = 1; p_input = yyinput; p_unput = unput_func; } ppc64-diag-2.6.4/ela/add_regex.cpp0000644000000000000000000000157212313010662015245 0ustar rootrootusing namespace std; #include #include #include #include "catalogs.h" extern "C" { #include "platform.c" } static const char *progname; static void usage(void) { cerr << "usage: " << progname << " [-C catalog_dir]" << endl; exit(1); } int main(int argc, char **argv) { const char *catalog_dir = ELA_CATALOG_DIR; int c; int platform = 0; progname = argv[0]; platform = get_platform(); if (platform != PLATFORM_PSERIES_LPAR) { cerr << progname << ": is not supported on the " << __power_platform_name(platform) << " platform" << endl; exit(1); } opterr = 0; while ((c = getopt(argc, argv, "C:")) != -1) { switch (c) { case 'C': catalog_dir = optarg; break; case '?': usage(); } } if (optind != argc) usage(); regex_text_policy = RGXTXT_WRITE; if (EventCatalog::parse(catalog_dir) != 0) exit(2); exit(0); } ppc64-diag-2.6.4/ela/event_gram.y0000644000000000000000000001203012313010662015127 0ustar rootroot%{ /* * Grammars for events catalog and exceptions catalog * * Copyright (C) International Business Machines Corp., 2009 * */ #define CATALOGS_IMPLEMENTATION #include #include "catalogs.h" extern EventCtlgParser event_ctlg_parser; static EventCtlgParser *pc = &event_ctlg_parser; extern EventCatalog event_catalog; static SyslogEvent *event; static EventCtlgFile *driver; extern ExceptionCatalog exception_catalog; /* Why doesn't yacc declare this? */ extern int yylex(void); void yyerror(const char *s); %} /* Note: Tokens of type sval are all strdup-ed. */ %union { int ival; /* keyword, punctuation */ char *sval; /* string, name, text block */ SyslogEvent *event; EventCtlgFile *driver; MessageFilter *filter; } %token KW_ACTION KW_CLASS KW_COPY KW_DESCRIPTION %token KW_DEVSPEC KW_EXCEPTION KW_FILE KW_FILTER %token KW_MESSAGE KW_PRIORITY KW_REFCODE KW_REGEX %token KW_SL_SEVERITY KW_SUBSYSTEM KW_TYPE %token TK_STRING TK_NAME TK_TEXTBLOCK %token ERRTOK %type catalog_file driver_file exceptions_file %type header exception %type subsystem_stmt %type filter_expr %type entry %type message_stmt message_exception_stmt %type description_stmt action_stmt exception_stmt %% catalog_file : driver_file | exceptions_file ; driver_file : header entries ; header : subsystem_stmt optional_header_stmts { event_catalog.register_driver($1); $$ = 0; /* avoid yacc warning */ } ; subsystem_stmt : KW_SUBSYSTEM ':' TK_NAME { driver = new EventCtlgFile(pc->pathname, $3); $$ = driver; free($3); } optional_header_stmts: header_stmts | /* NULL */ ; header_stmts : header_stmt | header_stmts header_stmt ; header_stmt : copy | devspec_stmt | filter_stmt ; copy : '@' KW_COPY TK_NAME TK_TEXTBLOCK { driver->add_text_copy($3, $4); free($3); free($4); } ; devspec_stmt : KW_DEVSPEC '(' TK_NAME ')' '=' TK_STRING { driver->add_devspec($3, $6); free($3); free($6); } ; filter_stmt : KW_FILTER ':' filter_expr { driver->add_filter($3); } ; filter_expr : TK_NAME '=' TK_STRING { $$ = new MessageFilter($1, '=', $3); free($1); free($3); } ; entries : entry_or_file | entries entry_or_file ; entry_or_file : entry { event_catalog.register_event($1); } | file_stmt ; file_stmt : KW_FILE ':' TK_STRING { driver->set_source_file($3); free($3); } ; entry : message_stmt optional_regex_stmts explanation { $$ = $1; } | message_exception_stmt optional_regex_stmts | error { $$ = NULL; } ; message_stmt : KW_MESSAGE ':' TK_NAME TK_STRING { event = new SyslogEvent($3, "", $4, driver); $$ = event; free($3); free($4); } | KW_MESSAGE ':' TK_NAME TK_NAME TK_STRING { event = new SyslogEvent($3, $4, $5, driver); $$ = event; free($3); free($4); free($5); } ; optional_regex_stmts : regex_stmts | /* NULL */ ; regex_stmts : regex_stmt | regex_stmts regex_stmt ; regex_stmt : KW_REGEX TK_NAME TK_STRING { event->set_regex($2, $3); free($2); free($3); } ; explanation : addl_stmts | exception_stmt { event->except($1); free($1); } ; /* * message[defensive]: printk "failed to set up thing\n" * is shorthand for * message: printk "failed to set up thing\n" exception: defensive */ message_exception_stmt: KW_MESSAGE '[' TK_NAME ']' ':' TK_NAME TK_STRING { event = new SyslogEvent($6, "", $7, driver); $$ = event; event->except($3); free($3); free($6); free($7); } | KW_MESSAGE '[' TK_NAME ']' ':' TK_NAME TK_NAME TK_STRING { event = new SyslogEvent($6, $7, $8, driver); $$ = event; event->except($3); free($3); free($6); free($7); free($8); } ; addl_stmts : addl_stmt | addl_stmts addl_stmt ; addl_stmt: description_stmt { event->set_description($1); free($1); // $$ = 0; } | action_stmt { event->set_action($1); free($1); // $$ = 0; } | class_stmt | type_stmt | sl_severity_stmt | priority_stmt | refcode_stmt ; exception_stmt : KW_EXCEPTION ':' TK_NAME { $$ = $3; } ; description_stmt : KW_DESCRIPTION TK_TEXTBLOCK { $$ = $2; } ; action_stmt : KW_ACTION TK_TEXTBLOCK { $$ = $2; } ; class_stmt : KW_CLASS ':' TK_NAME { event->set_class($3); free($3); } ; type_stmt : KW_TYPE ':' TK_NAME { event->set_type($3); free($3); } sl_severity_stmt : KW_SL_SEVERITY ':' TK_NAME { event->set_sl_severity($3); free($3); } priority_stmt : KW_PRIORITY ':' TK_NAME { event->set_priority($3); free($3); } refcode_stmt : KW_REFCODE ':' TK_STRING { event->set_refcode($3); free($3); } exceptions_file : exception | exceptions_file exception ; exception : exception_stmt description_stmt action_stmt { exception_catalog.add(pc, $1, $2, $3); free($1); free($2); free($3); $$ = 0; } ; %% /* AKA everror() */ void yyerror(const char *s) { fprintf(stderr, "%s:%d: %s\n", pc->pathname, pc->lineno, s); } ppc64-diag-2.6.4/ela/reporter_gram.y0000644000000000000000000000636312313010662015664 0ustar rootroot%{ /* * Grammar for reporters catalog * * Copyright (C) International Business Machines Corp., 2009 * */ #define CATALOGS_IMPLEMENTATION #include #include "catalogs.h" extern ReporterCtlgParser reporter_ctlg_parser; static ReporterCtlgParser *pc = &reporter_ctlg_parser; extern ReporterCatalog reporter_catalog; static Reporter *reporter; static MetaReporter *meta_reporter; static vector *name_list; static vector *alias_list; /* Why doesn't yacc declare this? */ extern int yylex(void); void yyerror(const char *s); %} /* Note: Tokens of type sval are all strdup-ed. */ %union { int ival; /* keyword, punctuation */ char *sval; /* string, name */ Reporter *reporter; MetaReporter *meta_reporter; vector *name_list; ReporterAlias *alias; vector *alias_list; } %token KW_ALIASES KW_META_REPORTER KW_PREFIX_ARGS KW_PREFIX_FORMAT %token KW_REPORTER KW_SOURCE KW_VARIANTS KW_DEVICE_ARG %token TK_STRING TK_NAME %token ERRTOK %type reporter_entry reporter_stmt %type meta_reporter_entry meta_reporter_stmt %type source_stmt %type name_list %type name_and_lvl %type alias_list %% catalog : entry | catalog entry ; entry : reporter_entry { reporter_catalog.register_reporter($1); } | meta_reporter_entry { reporter_catalog.register_meta_reporter($1); } | error ; reporter_entry : reporter_stmt source_stmt aliases_stmt prefix_format_stmt prefix_args_stmt device_arg_stmt { $$ = $1; } ; meta_reporter_entry : meta_reporter_stmt variants_stmt { $$ = $1; } ; meta_reporter_stmt : KW_META_REPORTER ':' TK_NAME { meta_reporter = new MetaReporter($3); free($3); $$ = meta_reporter; } ; variants_stmt : KW_VARIANTS ':' name_list { meta_reporter->set_variant_names($3); } ; reporter_stmt : KW_REPORTER ':' name_and_lvl { reporter = new Reporter($3); $$ = reporter; } ; source_stmt : KW_SOURCE ':' TK_NAME { reporter->set_source($3); free($3); } ; name_list : TK_NAME { name_list = new vector(); name_list->push_back($1); $$ = name_list; free($1); } | name_list TK_NAME { name_list->push_back($2); $$ = name_list; free($2); } ; name_and_lvl : TK_NAME { $$ = new ReporterAlias($1); free($1); } | TK_NAME '(' TK_NAME ')' { $$ = new ReporterAlias($1, $3); free($1); free($3); } ; alias_list : name_and_lvl { alias_list = new vector(); alias_list->push_back($1); $$ = alias_list; } | alias_list name_and_lvl { alias_list->push_back($2); $$ = alias_list; } ; aliases_stmt : KW_ALIASES ':' alias_list { reporter->set_aliases($3); } | /*NULL*/ ; prefix_format_stmt : KW_PREFIX_FORMAT ':' TK_STRING { reporter->set_prefix_format($3); free($3); } | /*NULL*/ ; prefix_args_stmt : KW_PREFIX_ARGS ':' name_list { reporter->set_prefix_args($3); } | /*NULL*/ ; device_arg_stmt : KW_DEVICE_ARG ':' TK_NAME { reporter->set_device_arg($3); free($3); } | /*NULL*/ ; %% /* AKA rrerror() */ void yyerror(const char *s) { fprintf(stderr, "%s:%d: %s\n", pc->pathname, pc->lineno, s); } ppc64-diag-2.6.4/ela/date.c0000644000000000000000000000644412313010662013703 0ustar rootroot#define _XOPEN_SOURCE #include #include #include #include typedef enum { false, true } bool; static int cur_year = 0; // year - 1900 static time_t end_of_cur_year; // January 1 00:00:00 of next year /* Called at beginning of time and each time a new year begins. */ static void compute_cur_year(time_t now) { struct tm tm; localtime_r(&now, &tm); cur_year = tm.tm_year; tm.tm_mon = 0; tm.tm_mday = 1; tm.tm_year++; tm.tm_hour = 0; tm.tm_min = 0; tm.tm_sec = 0; tm.tm_isdst = -1; end_of_cur_year = mktime(&tm); } /* * Call strptime() to parse the date string starting at start, according * to fmt. * * The year defaults to either this year or last year -- whatever will * yield a date in the preceding 12 months. If yr_in_fmt == true, * it's assumed that fmt will provide the year, and that'll be used * instead of the default. * * If end isn't NULL, *end is set pointing to the next character after * the parsed date string. Returns the date as a time_t. * * If the string can't be parsed according to fmt, *end is unchanged * and 0 is returned. */ time_t parse_date(const char *start, char **end, const char *fmt, bool yr_in_fmt) { struct tm tm; time_t now, date; char *date_end; if (!yr_in_fmt) { now = time(NULL); if (!cur_year || difftime(now, end_of_cur_year) >= 0) compute_cur_year(now); } memset(&tm, 0, sizeof(tm)); tm.tm_isdst = -1; tm.tm_year = cur_year; date_end = strptime(start, fmt, &tm); if (date_end == NULL) return (time_t) 0; if (tm.tm_year < 69) { /* year < 1969. Mistook hour for year? */ return (time_t) 0; } date = mktime(&tm); if (!yr_in_fmt && difftime(date, now) > 0) { /* Date is in future. Assume it's from last year. */ tm.tm_isdst = -1; tm.tm_year--; date = mktime(&tm); } if (end) *end = date_end; return date; } time_t parse_syslog_date(const char *start, char **end) { return parse_date(start, end, "%b %d %T", false); } struct date_fmt { const char *fmt; bool has_year; }; /* Order is important: try longest match first. */ static struct date_fmt day_fmts[] = { { "%b %d %Y", true }, // Jan 15 2010 { "%b %d", false }, { "%Y-%m-%d", true }, // 2010-1-15 { "%d %b %Y", true }, // 15 Jan 2010 { "%d %b", false }, { NULL, false } }; static struct date_fmt time_fmts[] = { { "%T %Y", true }, { "%T", false }, { "%H:%M %Y", true }, { "%H:%M", false }, { "", false }, { NULL, false } }; /* * Parse the date and time pointed to by start, trying all valid * combinations of date and time formats from the above lists. * See parse_date() for more semantics. */ time_t parse_syslogish_date(const char *start, char **end) { time_t t; struct date_fmt *day, *time; char fmt[100]; for (day = day_fmts; day->fmt; day++) { for (time = time_fmts; time->fmt; time++) { if (day->has_year && time->has_year) continue; (void) strcpy(fmt, day->fmt); if (time->fmt[0] != '\0') { (void) strcat(fmt, " "); (void) strcat(fmt, time->fmt); } t = parse_date(start, end, fmt, (day->has_year || time->has_year)); if (t) return t; } } return 0; } #ifdef TEST main() { time_t t; char line[100]; while (fgets(line, 100, stdin)) { t = parse_syslogish_date(line, NULL); if (!t) printf("no match\n"); else printf("%s", ctime(&t)); } exit(0); } #endif /* TEST */ ppc64-diag-2.6.4/ela/Makefile0000644000000000000000000000437312313010662014261 0ustar rootroot# ## Makefile for ppc64-diag/ela # include ../rules.mk CMDS = explain_syslog add_regex syslog_to_svclog CATALOG = message_catalog/cxgb3 message_catalog/e1000e \ message_catalog/exceptions message_catalog/reporters \ message_catalog/gpfs CATALOG_REGEX = message_catalog/with_regex/cxgb3 \ message_catalog/with_regex/e1000e \ message_catalog/with_regex/gpfs MANPAGES = doc/explain_syslog.8.gz doc/syslog_to_svclog.8.gz COMMON_OBJS = rr.tab.o lex.rr.o ev.tab.o lex.ev.o date.o ES_OBJS = explain_syslog.o catalogs.o $(COMMON_OBJS) SS_OBJS = syslog_to_svclog.o catalogs.o $(COMMON_OBJS) AR_OBJS = add_regex.o catalogs.o $(COMMON_OBJS) SS_LIBS = -lservicelog -lvpd -lvpd_cxx -lsqlite3 -lrtasevent all: $(CMDS) $(CATALOG) $(CATALOG_REGEX) explain_syslog: $(ES_OBJS) @echo "LD $(WORK_DIR)/$@" $(CXX) $(CXXFLAGS) -o $@ $^ syslog_to_svclog: $(SS_OBJS) @echo "LD $(WORK_DIR)/$@" $(CXX) $(CXXFLAGS) -o $@ $^ $(SS_LIBS) add_regex: $(AR_OBJS) @echo "LD $(WORK_DIR)/$@" $(CXX) $(CXXFLAGS) -o $@ $^ rr.tab.o: rr.tab.c rr.tab.h catalogs.h $(CXX) $(CPPFLAGS) $(CXXFLAGS) -c rr.tab.c ev.tab.o: ev.tab.c ev.tab.h catalogs.h $(CXX) $(CPPFLAGS) $(CXXFLAGS) -c ev.tab.c rr.tab.c: rr.tab.h ev.tab.c: ev.tab.h rr.tab.h: reporter_gram.y yacc -dl -b rr -p rr reporter_gram.y ev.tab.h: event_gram.y yacc -dl -b ev -p ev event_gram.y lex.rr.o: lex.rr.c rr.tab.h catalogs.h $(CXX) $(CPPFLAGS) $(CXXFLAGS) -c lex.rr.c lex.ev.o: lex.ev.c ev.tab.h catalogs.h $(CXX) $(CPPFLAGS) $(CXXFLAGS) -c lex.ev.c lex.rr.c: reporter_lex.l flex -Prr reporter_lex.l lex.ev.c: event_lex.l flex -Pev event_lex.l catalogs.o: catalogs.h install: all @$(call install_sbin,$(CMDS),$(DESTDIR)) @$(call install_files,$(CATALOG),744,$(DESTDIR)/etc/ppc64-diag/message_catalog) @$(call install_files,$(CATALOG_REGEX),744,$(DESTDIR)/etc/ppc64-diag/message_catalog/with_regex) @$(call install_man,$(MANPAGES),$(DESTDIR)) $(INSTALL) -d -m 755 $(DESTDIR)/var/log/ppc64-diag clean: @rm -rf $(CMDS) *.o lex.*.c *.tab.c *.tab.h uninstall: @$(call uninstall_sbin,$(CMDS),$(DESTDIR)) @$(call uninstall_files,$(CATALOG),$(DESTDIR)/etc/ppc64-diag/) @$(call uninstall_files,$(CATALOG_REGEX),$(DESTDIR)/etc/ppc64-diag/) @$(call uninstall_man,$(MANPAGES),$(DESTDIR)/usr/share/man/man8) ppc64-diag-2.6.4/ela/README0000644000000000000000000000370412313010662013476 0ustar rootrootHere's code to match lines from syslog output to selected messages from device drivers, and take appropriate action. For the explain_syslog program, the "appropriate action" is to report the matching line and format string, plus advice in the form of "description" and "action" text blocks. catalogs.cpp catalogs.h date.c event_gram.y event_lex.l reporter_gram.y reporter_lex.l These files implement the lexer, parser, and C++ classes for the reporter and message/event catalogs. message_catalog/ This directory contains a sample reporter catalog and some sample message-catalog files. message_catalog/with_regex/ This directory contains copies of the message-catalog files from message_catalog/, augmented by add_regex to include the regular expression(s) associated with each message statement. These are the message-catalog files that explain_syslog and syslog_to_svclog actually read. msgs This file contains a smattering of syslog messages, some of which match the patterns in the message catalog. explain_syslog.cpp This C++ program uses the aforementioned C++ classes to read the message catalog, then reads lines from syslog and prints description and action advice for each line matching a pattern in the message catalog. Typical usage, when testing: $ (cd ../lib; make) $ make $ ./explain_syslog [-d] -C message_catalog < msgs -d specifies debug output, including a dump of the message-catalog data structures. syslog_to_svclog.cpp This C++ program uses the aforementioned C++ classes to read the message catalog, then reads lines from syslog, and for each error or warning message matching one in the message catalog, logs an event to servicelog. This works only on powerpc, and only if you have the needed dependencies installed (libservicelog, libvpd, libvpd_cxx, and libsqlite). See the man page. doc/ man pages for explain_syslog and syslog_to_svclog add_regex.cpp This C++ program creates message_catalog/with_regex/* (which see) from message_catalog/*. ppc64-diag-2.6.4/ela/syslog_to_svclog.cpp0000644000000000000000000004654612313010662016734 0ustar rootrootusing namespace std; #include #include #include #include #include #include #include #include #include #include #include /* * This is needed for RTAS_FRUID_COMP_* (callout type, which Mike S. thinks * is largely ignored). */ #include #include #include #include #include #include #include #include #include #include using namespace lsvpd; #include "catalogs.h" #include extern "C" { #include "platform.c" } #define SYSLOG_PATH "/var/log/messages" #define LAST_EVENT_PATH "/var/log/ppc64-diag/last_syslog_event" #define LAST_EVENT_PATH_BAK LAST_EVENT_PATH ".bak" static const char *progname; static bool debug = 0; static time_t begin_date = 0, end_date = 0; static const char *catalog_dir = ELA_CATALOG_DIR; static const char *msg_path = NULL; static FILE *msg_file = stdin; static bool follow = false, follow_default = false; static string last_msg_matched; // read from LAST_EVENT_PATH static bool skipping_old_messages; extern ReporterCatalog reporter_catalog; extern EventCatalog event_catalog; static servicelog *slog = NULL; static void usage_message(FILE *out) { fprintf(out, "usage: %s [-b date] [-e date | -F] [-m msgfile | -M]\n" "\t[-C catalog_dir] [-h] [-d]\n", progname); } static void usage(void) { usage_message(stderr); exit(1); } /* * Convert a C++ string to a strdup-ed C string, or a NULL pointer. * If -d is specified, don't return any NULL pointers, because we're * going to call servicelog_event_print(), and that doesn't handle * NULLs well. */ static char * svclog_string(const string& s, bool force=false) { if (s.empty()) { if (debug || force) return strdup("none"); return NULL; } return strdup(s.c_str()); } /* * Used, in debug mode, to ensure we don't pass any null char pointers to * servicelog_event_print(). */ static char * fake_val(const char *valname) { return strdup(valname); } /* Stuff for querying the Vital Product Data (VPD) database starts here. */ static System *vpd_root = NULL; static bool vpd_uptodate_flag = false; static bool vpd_up_to_date(void) { return vpd_uptodate_flag; } static System * collect_vpd(void) { VpdRetriever *vpd = NULL; /* Either succeed or give up forever. */ vpd_uptodate_flag = true; try { vpd = new VpdRetriever(); } catch (exception& e) { cerr << progname << ": VpdRetriever constructor threw exception" << endl; return NULL; } try { vpd_root = vpd->getComponentTree(); } catch (VpdException& ve) { cerr << progname << ": getComponentTree() failed: " << ve.what() << endl; vpd_root = NULL; } delete vpd; if (!vpd_root) { cerr << progname << ": getComponentTree() returned null root" << endl; } return vpd_root; } /* * Recursive search for the Component with the specificed location code, * among the specified list of Components, which are the children of the * System root or of a Component. Recursion is a bit weird because a * System is not a Component. */ static Component * get_device_by_location_code(const vector& components, const string& location_code) { vector::const_iterator i, end; for (i = components.begin(), end = components.end(); i != end; i++) { Component *c = *i; if (c->getPhysicalLocation() == location_code) return c; else { Component *k = get_device_by_location_code( c->getLeaves(), location_code); if (k) return k; } } return NULL; } static Component * get_device_by_location_code(const System *root, const string& location_code) { if (root) return get_device_by_location_code(root->getLeaves(), location_code); return NULL; } static ssize_t read_thing_from_file(const char *path, char *buf, size_t bufsz) { int fd; ssize_t nbytes; fd = open(path, O_RDONLY); if (fd < 0) return -1; nbytes = read(fd, buf, bufsz); close(fd); return nbytes; } /* * Try to find the /sys/.../devspec node associated with the device * that this syslog message is about. That node contains the pathname * of the directory in /proc/device-tree for that device. (The * pathname is not null- or newline-terminated.) The device's * (null-terminated) location code is in the file ibm,loc-code in * that directory. Using the location code, we look up the other * Vital Product Data for that device, as required to fill out the callout. * * Return 0 on (at least partial) success. Caller has nulled out the * various members we might populate. */ static int populate_callout_from_vpd(SyslogEvent *sys, SyslogMessage *msg, struct sl_event *svc, struct sl_callout *callout) { #define PROC_DEVICE_TREE_DIR "/proc/device-tree" #define LOCATION_CODE_FILE "/ibm,loc-code" int result; char dev_tree_path[PATH_MAX]; char *next, *end = dev_tree_path + PATH_MAX; char location_code[1000]; ssize_t nbytes; result = msg->set_devspec_path(sys); if (result != 0) return result; next = dev_tree_path; (void) strcpy(next, PROC_DEVICE_TREE_DIR); next += strlen(PROC_DEVICE_TREE_DIR); /* /proc/device-tree^ */ nbytes = read_thing_from_file(msg->devspec_path.c_str(), next, end - next); if (nbytes <= 0) return -1; /* /proc/device-tree^/xxx/yyy -- typically NOT newline-terminated */ if (!strncmp(next, "none\n", 5)) return -1; next += nbytes; /* /proc/device-tree/xxx/yyy^ */ if ((unsigned)(end - next) < sizeof(LOCATION_CODE_FILE)) return -1; strcpy(next, LOCATION_CODE_FILE); /* /proc/device-tree/xxx/yyy^/ibm,loc-code */ nbytes = read_thing_from_file(dev_tree_path, location_code, 1000); if (nbytes < 0 || nbytes >= 1000) return -1; if (!vpd_up_to_date()) vpd_root = collect_vpd(); if (!vpd_root) return -1; Component *device = get_device_by_location_code(vpd_root, location_code); if (!device) return -1; callout->location = svclog_string(location_code); callout->fru = svclog_string(device->getFRU()); callout->serial = svclog_string(device->getSerialNumber()); const DataItem *ccin = device->getDeviceSpecific("CC"); callout->ccin = svclog_string(ccin ? ccin->getValue() : ""); return 0; } /* End of VPD query functions */ static bool is_informational_event(SyslogEvent *sys) { int severity = sys->get_severity(); if (severity == LOG_DEBUG || severity == LOG_INFO) return true; /* Don't log catch-all events. */ if (severity == LOG_SEV_UNKNOWN || severity == LOG_SEV_ANY) return true; if (sys->sl_severity == SL_SEV_DEBUG || sys->sl_severity == SL_SEV_INFO) return true; if (sys->err_type == SYTY_INFO) return true; return false; } /* * Use the servicelog severity if it's specified. Otherwise estimate it * from the syslog severity and error type. */ static uint8_t get_svclog_severity(SyslogEvent *sys) { if (sys->sl_severity != 0) return sys->sl_severity; switch (sys->get_severity()) { case LOG_DEBUG: return SL_SEV_DEBUG; case LOG_NOTICE: case LOG_INFO: return SL_SEV_INFO; case LOG_WARNING: return SL_SEV_WARNING; default: /* * If we get here, the syslog error level is at least LOG_ERR. */ switch (sys->err_type) { case SYTY_PERM: case SYTY_CONFIG: case SYTY_PEND: case SYTY_PERF: case SYTY_UNKNOWN: return SL_SEV_ERROR; case SYTY_BOGUS: case SYTY_TEMP: return SL_SEV_WARNING; case SYTY_INFO: return SL_SEV_INFO; } } /* NOTREACHED */ return 0; } static int get_svclog_disposition(SyslogEvent *sys) { if (sys->sl_severity != 0) { // sl_severity provided in lieu of err_type if (sys->sl_severity >= SL_SEV_ERROR_LOCAL) return SL_DISP_UNRECOVERABLE; else return SL_DISP_RECOVERABLE; } switch (sys->err_type) { case SYTY_PERM: case SYTY_CONFIG: case SYTY_PEND: return SL_DISP_UNRECOVERABLE; case SYTY_TEMP: case SYTY_INFO: case SYTY_BOGUS: return SL_DISP_RECOVERABLE; case SYTY_PERF: return SL_DISP_BYPASSED; case SYTY_UNKNOWN: /* LOG_EMERG = 0, LOG_DEBUG = 7 */ return (sys->get_severity() <= LOG_ERR ? SL_DISP_UNRECOVERABLE : SL_DISP_RECOVERABLE); } /* NOTREACHED */ return 0; } static uint32_t get_svclog_callout_type(SyslogEvent *sys) { /* err_type is valid only if sl_severity not specified */ if (sys->sl_severity == 0 && sys->err_type == SYTY_CONFIG) return RTAS_FRUID_COMP_CONFIG_ERROR; if (sys->err_class == SYCL_HARDWARE) return RTAS_FRUID_COMP_HARDWARE; return RTAS_FRUID_COMP_CODE; } /* We couldn't find VPD for the device. Provide null values. */ static void zap_callout_vpd(struct sl_callout *callout) { callout->location = svclog_string(""); callout->fru = svclog_string(""); callout->serial = svclog_string(""); callout->ccin = svclog_string(""); } static void create_svclog_callout(SyslogEvent *sys, SyslogMessage *msg, struct sl_event *svc, struct sl_callout *callout) { memset(callout, 0, sizeof(*callout)); callout->priority = sys->priority; callout->type = get_svclog_callout_type(sys); callout->procedure = strdup("see explain_syslog"); if (populate_callout_from_vpd(sys, msg, svc, callout) != 0) zap_callout_vpd(callout); svc->callouts = callout; } static void create_addl_data(SyslogEvent *sys, SyslogMessage *msg, struct sl_event *svc, struct sl_data_os *os) { memset(os, 0, sizeof(*os)); /* version set by servicelog_event_log() */ if (debug) os->version = fake_val("version"); os->subsystem = svclog_string(sys->driver->subsystem, true); os->driver = svclog_string(sys->driver->name, true); os->device = svclog_string(msg->get_device_id(sys->matched_variant), true); svc->addl_data = (struct sl_data_os*) os; } /* * servicelog can't handle apostrophes in inserted text strings, so * replace them with back-quotes. */ static void sanitize_syslog_line(string& s) { size_t pos, len = s.length(); for (pos = 0; pos < len; pos++) { if (s[pos] == '\'') s[pos] = '`'; } } static int log_event(SyslogEvent *sys, SyslogMessage *msg) { struct sl_event *svc; struct sl_callout *callout; struct sl_data_os *os_data; string description,action; svc = (struct sl_event*) malloc(sizeof(*svc)); callout = (struct sl_callout*) malloc(sizeof(*callout)); os_data = (struct sl_data_os*) malloc(sizeof(*os_data)); if (!svc || !callout || !os_data) { free(svc); free(callout); free(os_data); cerr << "Failed to log servicelog event: out of memory." << endl; } memset(svc, 0, sizeof(*svc)); /* next, id set by servicelog_event_log() */ (void) time(&svc->time_event); /* time_last_update set by servicelog_event_log() */ svc->type = SL_TYPE_OS; svc->severity = get_svclog_severity(sys); /* * platform, machine_serial, machine_model, nodename set by * servicelog_event_log() */ if (debug) { svc->platform = fake_val("platform"); svc->machine_serial = fake_val("mserial"); svc->machine_model = fake_val("model"); svc->nodename = fake_val("nodename"); } svc->refcode = svclog_string(sys->refcode); string msg_line = msg->line; sanitize_syslog_line(msg_line); description = sys->description; action = sys->action; svc->description = svclog_string("Message forwarded from syslog:\n" + msg_line + "\n Description: " + description + "\n Action: " + action ); svc->serviceable = (svc->severity >= SL_SEV_ERROR_LOCAL); svc->predictive = (sys->err_type == SYTY_PEND || sys->err_type == SYTY_PERF || sys->err_type == SYTY_UNKNOWN || sys->err_type == SYTY_TEMP); svc->disposition = get_svclog_disposition(sys); svc->call_home_status = (svc->serviceable ? SL_CALLHOME_CANDIDATE : SL_CALLHOME_NONE); svc->closed = 0; /* repair set by servicelog_event_log() */ create_svclog_callout(sys, msg, svc, callout); svc->raw_data_len = 0; svc->raw_data = NULL; create_addl_data(sys, msg, svc, os_data); int result = 0; if (debug) servicelog_event_print(stdout, svc, 1); else result = servicelog_event_log(slog, svc, NULL); if (result != 0) { cerr << "servicelog_event_log() failed, returning " << result << endl; cerr << servicelog_error(slog) << endl; } servicelog_event_free(svc); return result; } static time_t parse_date_arg(const char *date_str, const char *arg_name) { char *date_end = NULL; time_t t = parse_syslogish_date(date_str, &date_end); if (!t || *date_end != '\0') { cerr << "unrecognized date format for " << arg_name << " option" << endl; exit(1); } return t; } /* Note: Call this only with skipping_old_messages == true. */ static bool is_old_message(const char *line) { time_t t = parse_syslog_date(line, NULL); if (!t || difftime(t, begin_date) < 0) return true; if (t == begin_date && !last_msg_matched.empty()) { if (line == last_msg_matched) /* This is the last one we have to skip. */ skipping_old_messages = false; return true; } skipping_old_messages = false; return false; } /* Rename @path to @path_bak, and write @data to new file called @path. */ static void safe_overwrite(const string& data, const string& path, const string& path_bak) { const char *cpath = path.c_str(); const char *cpath_bak = path_bak.c_str(); if (rename(cpath, cpath_bak) != 0) { if (errno != ENOENT) { if (debug) { string msg = "Can't rename " + path + " to " + path_bak; perror(msg.c_str()); } return; } } FILE *f = fopen(cpath, "w"); if (!f) { if (debug) perror(cpath); goto recover; } if (fputs(data.c_str(), f) == EOF) { if (debug) perror(cpath); goto recover; } fclose(f); return; recover: if (rename(cpath_bak, cpath) != 0 && debug) { string msg = "Can't recover " + path + " from " + path_bak; perror(msg.c_str()); } } static void remember_matched_event(const string& msg) { if (msg_path && !strcmp(msg_path, SYSLOG_PATH)) safe_overwrite(msg, LAST_EVENT_PATH, LAST_EVENT_PATH_BAK); } static void compute_begin_date(void) { if (msg_path && !strcmp(msg_path, SYSLOG_PATH)) { /* * Read the saved copy of the last syslog message we matched. * Use that message's date as the begin date, and don't * match any events before or at that line in the message file. */ FILE *f = fopen(LAST_EVENT_PATH, "r"); if (!f) { if (errno != ENOENT && debug) perror(LAST_EVENT_PATH); return; } char line[256]; if (fgets(line, 256, f)) { last_msg_matched = line; begin_date = parse_syslog_date(line, NULL); } if (!begin_date) { fprintf(stderr, "Cannot read date from %s\n", LAST_EVENT_PATH); exit(3); } fclose(f); } } /* * Read msg_path by piping it through tail -F. This returns the result of * the popen() call. */ static FILE * tail_message_file(void) { /* * Avoid stuff like popen("tail -F ... file; rm -rf /", "r") * when nasty msg_path = 'file; rm -rf /'. To be extra safe, * we enclose the pathname in quotes. */ const char *bad_chars = ";|'"; if (strpbrk(msg_path, bad_chars)) { fprintf(stderr, "message pathname must not contain any of" " these characters: %s\n", bad_chars); return NULL; } /* * tail -F will get us past interruptions injected by logrotate * and such, but we require that the message file exist when we * start up. */ int fd = open(msg_path, O_RDONLY); if (fd < 0) { perror(msg_path); return NULL; } close(fd); string tail_command = string("/usr/bin/tail -F -n +0 -s 2 '") + msg_path + "'"; FILE *p = popen(tail_command.c_str(), "r"); if (!p) { perror(tail_command.c_str()); return NULL; } return p; } static FILE * open_message_file(void) { if (follow) return tail_message_file(); FILE *f = fopen(msg_path, "r"); if (!f) perror(msg_path); return f; } static void close_message_file(void) { if (msg_file) { if (follow) { if (pclose(msg_file) != 0) perror("tail -F of message file"); } else fclose(msg_file); } } static void print_help(void) { usage_message(stdout); printf( "-b begin_time\tIgnore messages with timestamps prior to begin_time.\n" "-C catalog_dir\tUse message catalog in catalog_dir. Defaults to\n" "\t\t\t/etc/ppc64-diag/message_catalog.\n" "-d\t\tPrint debugging output on stderr.\n" "-e end_time\tStop upon reading message with timestamp after end_time.\n" "-F\t\tDon't stop at EOF; process newly logged messages as they occur.\n" "-h\t\tPrint this help text and exit.\n" "-m message_file\tRead syslog messages from message_file, not stdin.\n" "-M\t\tRead syslog messages from /var/log/messages.\n" ); } int main(int argc, char **argv) { int c, result; int args_seen[0x100] = { 0 }; int platform = 0; progname = argv[0]; platform = get_platform(); if (platform != PLATFORM_PSERIES_LPAR) { cerr << progname << ": is not supported on the " << __power_platform_name(platform) << " platform" << endl; exit(1); } opterr = 0; while ((c = getopt(argc, argv, "b:C:de:Fhm:M")) != -1) { if (isalpha(c)) args_seen[c]++; switch (c) { case 'b': begin_date = parse_date_arg(optarg, "-b"); break; case 'C': catalog_dir = optarg; break; case 'd': debug = true; break; case 'e': end_date = parse_date_arg(optarg, "-e"); break; case 'F': follow = true; break; case 'h': print_help(); exit(0); case 'm': msg_path = optarg; break; case 'M': msg_path = SYSLOG_PATH; follow_default = true; break; case '?': usage(); } } if (optind != argc) usage(); for (c = 0; c < 0x100; c++) { if (args_seen[c] > 1) { cerr << progname << ": duplicate " << (char) c << " args" << endl; usage(); } } if (args_seen['m'] && args_seen['M']) usage(); if (follow && !msg_path) { cerr << progname << ": cannot specify -F when messages come" " from stdin" << endl; exit(1); } if (end_date && follow) { cerr << progname << ": cannot specify both -e and -F" << endl; exit(1); } if (begin_date && end_date && difftime(begin_date, end_date) > 0) { // Note: ctime stupidly appends a newline. cerr << progname << ": end date = " << ctime(&end_date) << "precedes begin date = " << ctime(&begin_date) << endl; exit(1); } /* follow defaults to true for /var/log/messages, false for others. */ if (!end_date && !follow) follow = follow_default; if (!begin_date) compute_begin_date(); if (msg_path) { msg_file = open_message_file(); if (!msg_file) { perror(msg_path); exit(1); } } if (EventCatalog::parse(catalog_dir) != 0) { close_message_file(); exit(2); } result = servicelog_open(&slog, 0); if (result != 0) { cerr << "servicelog_open() failed, returning " << result << endl; close_message_file(); exit(3); } #define LINESZ 512 char line[LINESZ]; skipping_old_messages = (begin_date != 0); vector::iterator ie; while (fgets(line, LINESZ, msg_file)) { if (!strchr(line, '\n')) { /* * syslog-ng "Log statistics" messages can be very * long, so don't complain about such monstrosities * by default. */ if (debug) cerr << "message truncated to " << LINESZ-1 << " characters!" << endl; line[LINESZ-2] = '\n'; line[LINESZ-1] = '\0'; } if (skipping_old_messages && is_old_message(line)) continue; SyslogMessage msg(line); if (!msg.parsed) { if (debug) cerr << "unparsed message: " << line; continue; } if (end_date && difftime(msg.date, end_date) > 0) break; for (ie = event_catalog.events.begin(); ie < event_catalog.events.end(); ie++) { SyslogEvent *event = *ie; if (event->match(&msg, true)) { remember_matched_event(line); if (!event->exception_msg && !is_informational_event(event)) log_event(event, &msg); break; } } } servicelog_close(slog); close_message_file(); exit(0); } ppc64-diag-2.6.4/ela/catalogs.h0000644000000000000000000002534312313010662014567 0ustar rootroot#ifndef _CATALOGS_H #define _CATALOGS_H /* * Catalogs: reporters and events/messages, and parsers therefor * * Copyright (C) International Business Machines Corp., 2009, 2010 * */ using namespace std; #include #include #include #include #include #include #include #include #include #define ELA_CATALOG_DIR "/etc/ppc64-diag/message_catalog" class Parser { protected: virtual void init_lex() = 0; // defined in .l file // yacc-generated parser -- AKA yyparse() int (*parse)(); // flex-generated [yy]input() and unput(). // input and unput can be magic names in lex.*.c files, so avoid // them here. int (*p_input)(); void (*p_unput)(int); void (*error)(const char *s); int semantic_errors; int get_octal_escape(const char *digits, int isCharConst); int get_char_escape(char c); void collect_octal_digits(char *digits, char firstDigit); public: Parser(); const char *pathname; FILE *file; int lineno; int parse_file(const string& path); void semantic_error(const string& msg); /* public because they're called by the lexical analyzers. */ char *get_string(int quoted); int skip_comment(); char *get_text_block(); }; extern Parser *cur_parser; /* Parses the reporters catalog */ class ReporterCtlgParser : public Parser { protected: virtual void init_lex(); // defined in .l file public: ReporterCtlgParser(); }; /* Parses a file in the message catalog, yielding an EventCtlgFile */ class EventCtlgParser : public Parser { protected: virtual void init_lex(); // defined in .l file public: EventCtlgParser(); }; struct NameValuePair { const char *name; int value; }; class MemberSet { protected: set seen; Parser *parser; public: void tally(void *addr, const string& name); void require(void *addr, const string& name); MemberSet(Parser *p) { parser = p; } }; extern int nvp_lookup(string name, NameValuePair *nvp, string member); extern string nvp_lookup_value(int value, NameValuePair *nvp); extern string severity_name(int sev); class Reporter; class ReporterCatalog; /* e.g., dev_err is an alias for dev_printk. */ class ReporterAlias { friend ostream& operator<<(ostream& os, const ReporterAlias& ra); public: Reporter *reporter; string name; #define LOG_SEV_UNKNOWN 8 #define LOG_SEV_ANY 9 /* used only for catchall-ish messages */ int severity; /* LOG_EMERG ... LOG_DEBUG or unknown or any */ ReporterAlias(const string& nm, const string& sev = "unknown"); }; /* * A Reporter is a function or macro like dev_printk or pr_err that * is used to report an event. Different Reporters supply different * prefixes. */ class Reporter { friend class ReporterCatalog; friend ostream& operator<<(ostream& os, const Reporter& r); protected: MemberSet members; Parser *parser; bool prefix_arg_exists(const string& arg); public: string name; ReporterAlias *base_alias; vector *aliases; bool from_kernel; string prefix_format; vector *prefix_args; string device_arg; Reporter(ReporterAlias *ra); void set_source(const string& source); void set_aliases(vector *alist); void set_prefix_format(const string& format); void set_prefix_args(vector *args); void set_device_arg(const string& arg); void validate(void); }; /* * In some cases, the macro used to log a message may produce either * of two (or more) prefix formats. Such a macro is represented by * a MetaReporter, which maps to two or more ReporterAliases, each * representing a prefix format. */ class MetaReporter { friend class ReporterCatalog; friend ostream& operator<<(ostream& os, const MetaReporter& mr); protected: MemberSet members; Parser *parser; vector *variant_names; void handle_nested_meta_reporter(MetaReporter *mr); public: string name; vector variants; MetaReporter(const string& nm); void set_variant_names(vector *vnames); void validate(ReporterCatalog *catalog); }; class ReporterCatalog { public: vector rlist; vector mrlist; map rmap; map mrmap; void register_reporter(Reporter*); void register_meta_reporter(MetaReporter*); void register_alias(ReporterAlias *ra, Reporter*); ReporterAlias *find(const string& name); MetaReporter *find_meta_reporter(const string& name); }; class EventCtlgFile; class SyslogEvent; class SyslogMessage; class CatalogCopy; class ExceptionMsg { public: string type; string description; string action; ExceptionMsg(const string& ty, const string& desc, const string &act) { type = ty; description = desc; action = act; } }; class ExceptionCatalog { protected: map exceptions; public: void add(Parser *parser, const string& type, const string& description, const string &action); ExceptionMsg *find(const string& type); }; enum ErrorClass { SYCL_HARDWARE, SYCL_SOFTWARE, SYCL_FIRMWARE, SYCL_UNKNOWN }; enum ErrorType { SYTY_PERM=1, SYTY_TEMP, SYTY_CONFIG, SYTY_PEND, SYTY_PERF, SYTY_INFO, SYTY_UNKNOWN, SYTY_BOGUS=0 }; #ifndef SL_SEV_FATAL /* defines for sl_event.severity */ #define SL_SEV_FATAL 7 #define SL_SEV_ERROR 6 #define SL_SEV_ERROR_LOCAL 5 #define SL_SEV_WARNING 4 #define SL_SEV_EVENT 3 #define SL_SEV_INFO 2 #define SL_SEV_DEBUG 1 #endif /* * This contains the information necessary to match a SyslogMessage to a * SyslogEvent. Typically, there is just one per SyslogEvent. But if the * ReporterAlias named in the message statement is actually a MetaReporter, * then a MatchVariant is created for each of the MetaReporter's * ReporterAliases. */ class MatchVariant { friend class SyslogEvent; protected: // string regex_text; int resolve_severity(int msg_severity); void compute_regex_text(void); void compile_regex(void); public: string regex_text; ReporterAlias *reporter_alias; int severity; // from ReporterAlias regex_t regex; SyslogEvent *parent; MatchVariant(ReporterAlias *ra, int msg_severity, SyslogEvent *pa); bool match(SyslogMessage*, bool get_prefix_args); void report(ostream& os, bool sole_variant); void set_regex(const string& rgxtxt); }; /* A message/event from the message catalog */ class SyslogEvent { friend class MatchVariant; friend ostream& operator<<(ostream& os, const SyslogEvent& e); protected: Parser *parser; MemberSet members; vector match_variants; string paste_copies(const string &text); void mk_match_variants(const string& rp, const string& sev); public: string reporter_name; // Could be a reporter, alias, or meta-reporter MatchVariant *matched_variant; // set by match() bool from_kernel; EventCtlgFile *driver; string format; string escaped_format; /* e.g., newline replaced with slash, n */ string *source_file; string description; string action; ErrorClass err_class; // err_type or sl_severity, not both ErrorType err_type; int sl_severity; // one of SL_SEV_* string refcode; char priority; ExceptionMsg *exception_msg; SyslogEvent(const string& rpt, const string& sev, const string& fmt, EventCtlgFile *drv); void set_description(const string& s); void set_action(const string& s); void set_class(const string& s); void set_type(const string& s); void set_sl_severity(const string& s); void set_refcode(const string& s); void set_priority(const string& s); void set_regex(const string& rpt, const string& rgxtxt); void except(const string& reason); void verify_complete(void); MatchVariant *match(SyslogMessage*, bool get_prefix_args); int get_severity(void); }; /* Maps a string such as device ID to the corresponding /sys/.../devspec file */ class DevspecMacro { protected: string name; // e.g., device, netdev, adapter string prefix; // /sys/... string suffix; // .../devspec public: DevspecMacro(const string& nm, const string& path); string get_devspec_path(const string& device_id); bool valid; }; /* * Typically used to filter out messages from other drivers, by looking * at the "driver" arg of the message prefix. */ class MessageFilter { protected: string arg_name; string arg_value; public: MessageFilter(const string& name, int op, const string& value); bool message_passes_filter(SyslogMessage *msg); }; /* * Contains the header information for a particular catalog file (which * typically represents a particular driver) */ class EventCtlgFile { public: string pathname; string name; // driver name, from pathname string subsystem; map text_copies; map devspec_macros; vector filters; /* not strictly needed, but handy if we ever want to do destructors */ vector source_files; string *cur_source_file; EventCtlgFile(const string& path, const string& subsys); void add_text_copy(const string& name, const string& text); string find_text_copy(const string& name); void set_source_file(const string& path); void add_devspec(const string& nm, const string& path); DevspecMacro *find_devspec(const string& name); void add_filter(MessageFilter *filter); bool message_passes_filters(SyslogMessage *msg); }; /* * The overall event/message catalog, comprising all the EventCtlgFiles * in the directory */ class EventCatalog { protected: vector drivers; public: vector events; EventCatalog() {} static int parse(const string& directory); void register_driver(EventCtlgFile *driver); void register_event(SyslogEvent *event); }; /* A line of text logged by syslog */ class SyslogMessage { public: string line; bool parsed; time_t date; string hostname; bool from_kernel; string message; map prefix_args; string devspec_path; // path to devspec node in /sys SyslogMessage(const string& s); string echo(void); int set_devspec_path(SyslogEvent *event); string get_device_id(MatchVariant *mv); }; /* * regex_text_policy = RGXTXT_WRITE adds regex_text statements to * the message catalogs. */ enum regex_text_policy { RGXTXT_COMPUTE, /* Compute regex_text from format string */ RGXTXT_WRITE, /* ... and also write it out to catalog file */ RGXTXT_READ /* Read regex_text from catalog file */ }; extern regex_text_policy regex_text_policy; class CatalogCopy { protected: FILE *orig_file; FILE *copy_file; string orig_path; string copy_path; int last_line_copied; // in orig_file int copy_through(int line_nr); public: bool valid; CatalogCopy(const string& rd_path, const string& wr_path); ~CatalogCopy(); void inject_text(const string& text, int line_nr); void finish_copy(void); }; extern string indent_text_block(const string& s1, size_t nspaces); extern "C" { extern time_t parse_date(const char *start, char **end, const char *fmt, bool yr_in_fmt); extern time_t parse_syslog_date(const char *start, char **end); extern time_t parse_syslogish_date(const char *start, char **end); } #endif /* _CATALOGS_H */ ppc64-diag-2.6.4/ela/catalogs.cpp0000644000000000000000000011761112313010662015122 0ustar rootroot/* * event/message and reporter catalogs for syslog analysis * * Copyright (C) International Business Machines Corp., 2009 * */ using namespace std; #include #include #include #include #include #include #include #include #include #include #include #include #include #include "catalogs.h" #include enum regex_text_policy regex_text_policy = RGXTXT_READ; static CatalogCopy *catalog_copy = NULL; ReporterCtlgParser reporter_ctlg_parser; extern int rrparse(); extern void rrerror(const char *s); ReporterCatalog reporter_catalog; EventCtlgParser event_ctlg_parser; extern int evparse(void); extern void everror(const char *s); EventCatalog event_catalog; ExceptionCatalog exception_catalog; Parser *cur_parser = NULL; Parser::Parser() { pathname = NULL; file = NULL; } int Parser::parse_file(const string& path) { int result; cur_parser = this; pathname = strdup(path.c_str()); file = fopen(pathname, "r"); if (!file) { fprintf(stderr, "can't open catalog file\n"); perror(pathname); return -1; } init_lex(); result = parse(); if (semantic_errors > 0) result = semantic_errors; fclose(file); return result; } void Parser::semantic_error(const string& msg) { error(msg.c_str()); semantic_errors++; } #define MYEOF '\0' /* * Collect the 1-to-3-digit octal number following a \. * If is_char_const is true, we're accumulating a char constant, so we flag * an error if there are excess digits. * Returns value > UCHAR_MAX if there's an error. */ int Parser::get_octal_escape(const char *digits, int is_char_const) { int n = 0; int nDigits = 0; const char *c; for (c = digits; '0' <= *c && *c <= '7'; c++) { n *= 8; n += *c - '0'; if (++nDigits == 3 && !is_char_const) { return n; } else if (nDigits > 3 && is_char_const) { return UCHAR_MAX+1; } } return n; } int Parser::get_char_escape(char c) { switch (c) { case '\'': return '\''; case '\"': return '\"'; case '\?': return '\?'; case '\\': return '\\'; case 'a': return '\a'; case 'b': return '\b'; case 'f': return '\f'; case 'n': return '\n'; case 'r': return '\r'; case 't': return '\t'; case 'v': return '\v'; case '\n': return -1; default: return c; } } /* * Return a version of s that contains only printable characters, by * converting non-printing characters to \ escapes. */ string add_escapes(const string& s) { int i; string es; int slen = s.length(); for (i = 0; i < slen; i++) { char c = s[i]; switch (c) { case '\\': es += "\\\\"; break; case '\"': es += "\\\""; break; case '\?': es += "\\?"; break; case '\a': es += "\\a"; break; case '\b': es += "\\b"; break; case '\f': es += "\\f"; break; case '\n': es += "\\n"; break; case '\r': es += "\\r"; break; case '\t': es += "\\t"; break; case '\v': es += "\\v"; break; default: if (isprint(c)) { es += c; } else { char octal_esc[4]; sprintf(octal_esc, "\\%o", (unsigned char) c); es += octal_esc; } break; } } return es; } void Parser::collect_octal_digits(char *digits, char first_digit) { int nDigits = 1; int c; digits[0] = first_digit; while (nDigits <= 3) { c = p_input(); if ('0' <= c && c <= '7') { digits[nDigits++] = c; } else { p_unput(c); break; } } digits[nDigits] = '\0'; } #define MAXSTRLEN (10*1024) #define STRSLOP 10 /* e.g., to handle a multibyte character at the end */ static char strbuf[MAXSTRLEN+STRSLOP]; /* * We have eaten the leading " in a quoted string. Collect the characters * of the string into strbuf, and then return a strdup-ed copy of the string. * We end after eating the terminating ". */ char * Parser::get_string(int quoted) { int nc = 0; int c; int end_of_string = (quoted ? '\"' : MYEOF); for (;;) { c = p_input(); if (c == end_of_string) { break; } else if (c == MYEOF) { /* EOF in middle of quoted string. */ return 0; } else if (c == '\\') { /* Collect and decode the escape sequence. */ c = p_input(); if (c == MYEOF) { /* End of input */ if (quoted) { return 0; } else { /* Allow \ as the last character. */ strbuf[nc++] = '\\'; break; } } else if ('0' <= c && c <= '7') { char digits[3+1]; collect_octal_digits(digits, c); strbuf[nc++] = get_octal_escape(digits, 0); } else { int ce = get_char_escape(c); /* Elide escaped newlines (ce == -1). */ if (ce == -1) { lineno++; } else { strbuf[nc++] = ce; } } } else { if (c == '\n') { lineno++; } strbuf[nc++] = c; } if (nc > MAXSTRLEN) { return 0; } } strbuf[nc] = '\0'; return strdup(strbuf); } /* * We have already eaten the leading / and *. Skip past the trailing * and /. */ int Parser::skip_comment() { int c; int orig_lineno = lineno; while ((c = p_input()) != MYEOF) { if (c == '\n') { lineno++; } /* Correctly handle multiple *s followed by /. */ check_star: while (c == '*') { c = p_input(); if (c == '/') { /* End of comment */ return 0; } else if (c == MYEOF) { /* EOF after a '*'. */ return -1; } else if (c == '\n') { lineno++; } } /* This is just to warn about nested comments. */ while (c == '/') { c = p_input(); if (c == '*') { fprintf(stderr, "%s:%d: warning: comment here" " nested inside comment starting at" " line %d\n", pathname, lineno, orig_lineno); goto check_star; } else if (c == MYEOF) { return -1; } else if (c == '\n') { lineno++; } } } /* End of file */ return -1; } /* * We've eaten the leading {{ in a text block. Collect the characters * of the block into strbuf, and then return a strdup-ed copy of the string. * We end after eating the terminating }}. Leading and trailing space * characters, including newlines, are stripped off. */ char * Parser::get_text_block(void) { int nc = 0; int c; int last_non_space = -1; for (;;) { c = p_input(); if (c == 0) { /* EOF in middle of text block */ return NULL; } else if (isspace(c)) { if (c == '\n') lineno++; if (last_non_space >= 0) strbuf[nc++] = c; } else { if (c == '}') { c = p_input(); if (c == '}') { /* End of block */ break; } else { /* Lone } */ p_unput(c); c = '}'; } } last_non_space = nc; strbuf[nc++] = c; } if (nc > MAXSTRLEN) return NULL; } if (last_non_space < 0) return strdup(""); strbuf[last_non_space+1] = '\0'; return strdup(strbuf); } ReporterCtlgParser::ReporterCtlgParser() : Parser() { parse = rrparse; error = rrerror; } EventCtlgParser::EventCtlgParser() : Parser() { parse = evparse; error = everror; } void MemberSet::tally(void *addr, const string& name) { if (seen.find(addr) == seen.end()) seen.insert(addr); else parser->semantic_error(name + " statement seen multiple times" " in same catalog entry."); } void MemberSet::require(void *addr, const string& name) { if (seen.find(addr) == seen.end()) parser->semantic_error(name + " statement required but missing."); } int nvp_lookup(string name, NameValuePair *nvp, string member) { const char *nm = name.c_str(); int i; for (i = 0; nvp[i].name != NULL; i++) { if (!strcmp(nm, nvp[i].name)) return nvp[i].value; } cur_parser->semantic_error("unrecognized value for " + member + ": " + name); return nvp[i].value; } string nvp_lookup_value(int value, NameValuePair *nvp) { int i; for (i = 0; nvp[i].name != NULL; i++) { if (nvp[i].value == value) return string(nvp[i].name); } return "badval"; } static struct NameValuePair severity_nvp[] = { { "emerg", LOG_EMERG }, { "alert", LOG_ALERT }, { "crit", LOG_CRIT }, { "err", LOG_ERR }, { "warning", LOG_WARNING }, { "notice", LOG_NOTICE }, { "info", LOG_INFO }, { "debug", LOG_DEBUG }, { "unknown", LOG_SEV_UNKNOWN }, { "any", LOG_SEV_ANY }, { "KERN_EMERG", LOG_EMERG }, { "KERN_ALERT", LOG_ALERT }, { "KERN_CRIT", LOG_CRIT }, { "KERN_ERR", LOG_ERR }, { "KERN_WARNING", LOG_WARNING }, { "KERN_NOTICE", LOG_NOTICE }, { "KERN_INFO", LOG_INFO }, { "KERN_DEBUG", LOG_DEBUG }, { "LOG_EMERG", LOG_EMERG }, { "LOG_ALERT", LOG_ALERT }, { "LOG_CRIT", LOG_CRIT }, { "LOG_ERR", LOG_ERR }, { "LOG_WARNING", LOG_WARNING }, { "LOG_NOTICE", LOG_NOTICE }, { "LOG_INFO", LOG_INFO }, { "LOG_DEBUG", LOG_DEBUG }, { NULL, LOG_SEV_UNKNOWN } }; string severity_name(int sev) { return nvp_lookup_value(sev, severity_nvp); } ReporterAlias::ReporterAlias(const string& nm, const string& sev) { reporter = NULL; name = nm; severity = nvp_lookup(sev, severity_nvp, "severity level"); } ostream& operator<<(ostream& os, const ReporterAlias& ra) { os << ra.name << '(' << severity_name(ra.severity) << ')'; return os; } static struct NameValuePair source_nvp[] = { { "kernel", 1 }, { "user", 0 }, { NULL, 1 } }; Reporter::Reporter(ReporterAlias *ra) : members(&reporter_ctlg_parser) { name = ra->name; base_alias = ra; aliases = NULL; from_kernel = false; prefix_format = ""; prefix_args = NULL; device_arg = ""; parser = &reporter_ctlg_parser; } void Reporter::set_source(const string& source) { members.tally(&from_kernel, "source"); from_kernel = nvp_lookup(source, source_nvp, "source"); } void Reporter::set_aliases(vector *alist) { members.tally(&aliases, "aliases"); if (!aliases) aliases = alist; } void Reporter::set_prefix_format(const string& format) { members.tally(&prefix_format, "prefix_format"); prefix_format = format; } void Reporter::set_prefix_args(vector *args) { members.tally(&prefix_args, "prefix_args"); if (!prefix_args) prefix_args = args; } bool Reporter::prefix_arg_exists(const string& arg) { if (!prefix_args) return false; vector::iterator it; for (it = prefix_args->begin(); it < prefix_args->end(); it++) { if (*it == arg) return true; } return false; } void Reporter::set_device_arg(const string& arg) { members.tally(&device_arg, "device_arg"); device_arg = arg; if (arg != "none") { if (!prefix_arg_exists(arg)) parser->semantic_error("device_arg " + arg + " not in prefix_args"); } } void Reporter::validate(void) { if (device_arg == "") { if (prefix_args) { if (prefix_arg_exists("device")) device_arg = "device"; else parser->semantic_error( "No \"device\" arg in prefix_args, " "so device_arg statement must specify " "a prefix arg or none."); } else device_arg = "none"; } } static void cout_name_list(ostream& os, const vector *list) { if (list) { vector::const_iterator it; for (it = list->begin(); it < list->end(); it++) os << " " << *it; } else os << " [NONE]"; } static void cout_alias_list(ostream& os, const vector *list) { if (list) { vector::const_iterator it; for (it = list->begin(); it < list->end(); it++) os << " " << **it; } else os << " [NONE]"; } ostream& operator<<(ostream& os, const Reporter& r) { os << "reporter: " << *(r.base_alias) << endl; os << "source: " << (r.from_kernel ? "kernel" : "user") << endl; os << "aliases:"; cout_alias_list(os, r.aliases); os << endl; os << "prefix_format: \"" << r.prefix_format << "\"" << endl; os << "prefix_args:"; cout_name_list(os, r.prefix_args); os << endl; os << "device_arg: " << r.device_arg << endl; return os; } MetaReporter::MetaReporter(const string& nm) : members(&reporter_ctlg_parser) { name = nm; parser = &reporter_ctlg_parser; variant_names = NULL; } ostream& operator<<(ostream& os, const MetaReporter& mr) { os << "meta_reporter: " << mr.name << endl; os << "variants:"; cout_alias_list(os, &mr.variants); os << endl; return os; } void MetaReporter::set_variant_names(vector *vnames) { members.tally(&variant_names, "variants"); if (!variant_names) variant_names = vnames; } /* * This MetaReporter's variant_names list contains the name of a previously * defined MetaReporter, mr. Copy mr's variants list into this's. (A * MetaReporter's variants list is always ReporterAliases, never MetaReporters.) * * Note that it's possible to get the same ReporterAlias multiple times in * the same MetaReporter's variants list (e.g., if multiple nested * MetaReporters refer to it), but that won't break anything. */ void MetaReporter::handle_nested_meta_reporter(MetaReporter *mr) { vector::iterator it; for (it = mr->variants.begin(); it < mr->variants.end(); it++) variants.push_back(*it); } void MetaReporter::validate(ReporterCatalog *catalog) { members.require(&variant_names, "variants"); if (!variant_names) return; vector::iterator it; set names_seen; for (it = variant_names->begin(); it < variant_names->end(); it++) { string vname = *it; if (names_seen.find(vname) != names_seen.end()) { parser->semantic_error( "duplicate name in variants list:" + vname); continue; } names_seen.insert(vname); ReporterAlias *ra = catalog->find(vname); if (ra) { variants.push_back(ra); } else { MetaReporter *mr = catalog->find_meta_reporter(vname); if (mr) handle_nested_meta_reporter(mr); else parser->semantic_error("unknown reporter: " + vname); } } /* Make sure all variants are consistent about necessary stuff. */ bool first_variant = true; bool from_kernel = true; vector::iterator rit; for (rit = variants.begin(); rit < variants.end(); rit++) { ReporterAlias *ra = *rit; if (first_variant) { from_kernel = ra->reporter->from_kernel; first_variant = false; } else if (ra->reporter->from_kernel != from_kernel) parser->semantic_error("meta_reporter variants " "can't be from both kernel and user space."); } } void ReporterCatalog::register_reporter(Reporter* r) { if (!r) /* called as a result of a syntax error */ return; rlist.push_back(r); register_alias(r->base_alias, r); if (r->aliases) { vector::iterator it; for (it = r->aliases->begin(); it < r->aliases->end(); it++) register_alias(*it, r); } r->validate(); } void ReporterCatalog::register_meta_reporter(MetaReporter *mr) { if (!mr) return; mr->validate(this); if (find(mr->name) || find_meta_reporter(mr->name)) { cur_parser->semantic_error( "meta_reporter name already in use: " + mr->name); } else { mrmap[mr->name] = mr; mrlist.push_back(mr); } } void ReporterCatalog::register_alias(ReporterAlias *ra, Reporter *reporter) { /* * To avoid the possibility of a mapping to a Reporter that * has been deleted due to a syntax error, we don't register * aliases until the Reporter entry has been successfully * parsed. This may mean that on a duplicate, the error * message's line number is slightly off. NBD. */ ra->reporter = reporter; ReporterAlias *dup = find(ra->name); if (dup) cur_parser->semantic_error("duplicate reporter name: " + ra->name); else rmap[ra->name] = ra; } ReporterAlias * ReporterCatalog::find(const string& name) { map::iterator it = rmap.find(name); if (it == rmap.end()) return NULL; return it->second; } MetaReporter * ReporterCatalog::find_meta_reporter(const string& name) { map::iterator it = mrmap.find(name); if (it == mrmap.end()) return NULL; return it->second; } void ExceptionCatalog::add(Parser *pc, const string& type, const string& description, const string &action) { if (find(type) == NULL) exceptions[type] = new ExceptionMsg(type, description, action); else pc->semantic_error("multiple entries for exception " + type); } ExceptionMsg * ExceptionCatalog::find(const string& type) { map::iterator it = exceptions.find(type); if (it == exceptions.end()) return NULL; return it->second; } /* * The severity should be implied by the reporter (alias) or specified * explicitly in the message statement, but not both. * * Report bogus severity name in message stmt in any case. */ int MatchVariant::resolve_severity(int msg_severity) { int reporter_sev, sev; sev = reporter_sev = reporter_alias->severity; if (reporter_sev == LOG_SEV_UNKNOWN && msg_severity == LOG_SEV_UNKNOWN) parent->parser->semantic_error("message statement must specify" " severity because reporter " + reporter_alias->name + " does not."); else if (reporter_sev != LOG_SEV_UNKNOWN && msg_severity != LOG_SEV_UNKNOWN) { parent->parser->semantic_error("reporter " + reporter_alias->name + " specifies severity, so message statement" + " should not."); if (reporter_sev != msg_severity) parent->parser->semantic_error("severity specified by" " message statement conflicts with" " severity specified by reporter " + reporter_alias->name); } else if (reporter_sev == LOG_SEV_UNKNOWN) sev = msg_severity; return sev; } void SyslogEvent::mk_match_variants(const string& rp, const string& sev_name) { int msg_severity; if (!sev_name.compare("")) msg_severity = LOG_SEV_UNKNOWN; else if (!sev_name.compare("default")) /* * Some printks don't include a KERN_* prefix. printk() * uses default_message_loglevel in those cases. For all * practical purposes, that's KERN_WARNING. */ msg_severity = LOG_WARNING; else msg_severity = nvp_lookup(sev_name, severity_nvp, "severity level"); ReporterAlias *ra = reporter_catalog.find(rp); if (ra) { match_variants.push_back(new MatchVariant(ra, msg_severity, this)); } else { MetaReporter *mr = reporter_catalog.find_meta_reporter(rp); if (mr) { vector::iterator it; for (it = mr->variants.begin(); it != mr->variants.end(); it++) match_variants.push_back(new MatchVariant(*it, msg_severity, this)); } else { parser->semantic_error("logging function not found in" " reporter catalog: " + rp); } } } SyslogEvent::SyslogEvent(const string& rp, const string& sev, const string& fmt, EventCtlgFile *drv) : members(&event_ctlg_parser) { parser = &event_ctlg_parser; driver = drv; source_file = driver->cur_source_file; format = fmt; escaped_format = add_escapes(format); reporter_name = rp; mk_match_variants(rp, sev); err_type = SYTY_BOGUS; // zero sl_severity = 0; priority = 'L'; exception_msg = NULL; from_kernel = false; if (match_variants.size() > 0) { MatchVariant *first = match_variants.front(); from_kernel = first->reporter_alias->reporter->from_kernel; } } /* * POSIX recommends that portable programs use regex patterns less than 256 * characters. */ #define REGEX_MAXLEN 256 /* * Form the full format string by prepending the reporter's prefix; * generate the corresponding regular-expression text, and compile * the regex. * * If the associated Reporter supplies prefix args (e.g., dev_err * provides driver and device), create and compile the regular expression * such that the values of the prefix args can be extracted from a * matching message using regexec's pmatch feature. * * Failures are logged as parser semantic errors. * * NOTE: compute_regex_text() has been split off from compile_regex() * now that regex_text can be read in from the catalog. */ void MatchVariant::compute_regex_text(void) { int get_prefix_args = 0; FILE *in; char regex_cstr[REGEX_MAXLEN]; Reporter *reporter = reporter_alias->reporter; string full_format = reporter->prefix_format + parent->format; size_t nl = full_format.find_last_of('\n'); // Strip trailing newline. if (nl) { if (full_format.substr(nl+1) != "") parent->parser->semantic_error( "in format string, newline is not last"); full_format = full_format.substr(0, nl); } if (reporter->prefix_args && reporter->prefix_args->size() > 0) get_prefix_args = 1; std::stringstream command; command << "regex_converter " << REGEX_MAXLEN << " " << "\""; command << full_format << "\" " << get_prefix_args; std::string tmp = command.str(); const char* cstr = tmp.c_str(); if (!(in = popen(cstr, "r"))) { parent->parser->semantic_error("cannot create regex text," "regex_converter may not be installed"); return; } fgets(regex_cstr,REGEX_MAXLEN, in); pclose(in); if (!strcmp(regex_cstr, "regex parser failure")) { parent->parser->semantic_error( "cannot create regex text from format"); return; } regex_text = regex_cstr; nl = regex_text.find_last_of('\n'); // Strip trailing newline. if (nl) { regex_text = regex_text.substr(0, nl); } // Change expr to ^expr$ so we match only the full message. regex_text = "^" + regex_text + "$"; } void MatchVariant::compile_regex(void) { int result; int regcomp_flags = REG_EXTENDED | REG_NEWLINE; Reporter *reporter = reporter_alias->reporter; if (!reporter->prefix_args || reporter->prefix_args->size() == 0) regcomp_flags |= REG_NOSUB; result = regcomp(®ex, regex_text.c_str(), regcomp_flags); if (result != 0) { char reason[200]; (void) regerror(result, ®ex, reason, 200); parent->parser->semantic_error("cannot compile regex: " + string(reason)); } } void SyslogEvent::except(const string& reason) { exception_msg = exception_catalog.find(reason); if (!exception_msg) parser->semantic_error("unknown exception type: " + reason); } string SyslogEvent::paste_copies(const string &text) { string s = text; string paste = "@paste "; size_t i = 0; while (i < s.length()) { i = s.find(paste, i); if (i == string::npos) break; size_t j, start = i + paste.length(); size_t end = s.length(); for (j = start; j < end; j++) { char c = s.at(j); if (!isalpha(c) && !isdigit(c) && c != '_') break; } /* j points to the first character after the name. */ if (j == start) { parser->semantic_error("malformed @paste"); return s; } string name = s.substr(start, j-start); string copy = driver->find_text_copy(name); if (copy == "") { parser->semantic_error( "cannot find text copy to paste: " + name); return s; } s.replace(i, j-i, copy); i = j; } return s; } void SyslogEvent::set_description(const string& desc) { members.tally(&description, "description"); description = paste_copies(desc); } void SyslogEvent::set_action(const string& act) { members.tally(&action, "action"); action = paste_copies(act); } static struct NameValuePair class_nvp[] = { { "unknown", SYCL_UNKNOWN }, { "hardware", SYCL_HARDWARE }, { "software", SYCL_SOFTWARE }, { "firmware", SYCL_FIRMWARE }, { NULL, SYCL_UNKNOWN } }; void SyslogEvent::set_class(const string& cls) { members.tally(&err_class, "class"); err_class = (ErrorClass) nvp_lookup(cls, class_nvp, "class"); } static struct NameValuePair type_nvp[] = { { "unknown", SYTY_UNKNOWN }, { "perm", SYTY_PERM }, { "temp", SYTY_TEMP }, { "config", SYTY_CONFIG }, { "pend", SYTY_PEND }, { "perf", SYTY_PERF }, { "info", SYTY_INFO }, { NULL, SYTY_UNKNOWN } }; void SyslogEvent::set_type(const string& ty) { members.tally(&err_type, "type"); err_type = (ErrorType) nvp_lookup(ty, type_nvp, "type"); } static struct NameValuePair sl_severity_nvp[] = { { "debug", SL_SEV_DEBUG }, { "info", SL_SEV_INFO }, { "event", SL_SEV_EVENT }, { "warning", SL_SEV_WARNING }, { "error_local", SL_SEV_ERROR_LOCAL }, { "error", SL_SEV_ERROR }, { "fatal", SL_SEV_FATAL }, { NULL, 0 } }; void SyslogEvent::set_sl_severity(const string& s) { members.tally(&sl_severity, "sl_severity"); sl_severity = nvp_lookup(s, sl_severity_nvp, "sl_severity"); } void SyslogEvent::set_refcode(const string& s) { members.tally(&refcode, "refcode"); refcode = s; } static struct NameValuePair priority_nvp[] = { { "H", 'H' }, { "M", 'M' }, { "A", 'A' }, { "B", 'B' }, { "C", 'C' }, { "L", 'L' }, { NULL, '\0' } }; void SyslogEvent::set_priority(const string& s) { members.tally(&priority, "priority"); priority = (char) nvp_lookup(s, priority_nvp, "priority"); } void SyslogEvent::verify_complete(void) { if (!exception_msg) { members.require(&description, "description"); members.require(&action, "action"); members.require(&err_class, "class"); if ((err_type && sl_severity) || (!err_type && !sl_severity)) { parser->semantic_error("You must specify either " "type or sl_severity, but not both."); } } vector::iterator it; for (it = match_variants.begin(); it != match_variants.end(); it++) { if ((*it)->regex_text.empty()) parser->semantic_error("Catalog doesn't provide regex" " for this message (reporter " + (*it)->reporter_alias->name + ") and it can't be computed."); } } void SyslogEvent::set_regex(const string& rpt, const string& rgxtxt) { vector::iterator it; for (it = match_variants.begin(); it != match_variants.end(); it++) { if ((*it)->reporter_alias->name == rpt) { (*it)->set_regex(rgxtxt); return; } } parser->semantic_error("regex statement: reporter " + rpt + + " is not associated with this message."); } /* * If msg matches the regular expression of one of the events's MatchVariants, * set this->matched_variant to that MatchVariant, and return a pointer to it. * If get_prefix_args is true, also populate msg->prefix_args. Return NULL, * and set this->matched_variant=NULL, if no match. */ MatchVariant * SyslogEvent::match(SyslogMessage *msg, bool get_prefix_args) { matched_variant = NULL; assert(msg); if (!msg->parsed) return NULL; if (msg->from_kernel != from_kernel) return NULL; vector::iterator it; for (it = match_variants.begin(); it < match_variants.end(); it++) { if ((*it)->match(msg, get_prefix_args)) { matched_variant = *it; break; } } return matched_variant; } int SyslogEvent::get_severity(void) { if (matched_variant) return matched_variant->severity; if (match_variants.size() > 0) { MatchVariant *first = match_variants.front(); return first->severity; } return LOG_SEV_UNKNOWN; } /* * Called by SyslogEvent::match() to test this variant. */ bool MatchVariant::match(SyslogMessage *msg, bool get_prefix_args) { bool result; size_t nr_prefix_args, nmatch; regmatch_t *pmatch; Reporter *reporter = reporter_alias->reporter; if (get_prefix_args && reporter->prefix_args) { nr_prefix_args = reporter->prefix_args->size(); nmatch = nr_prefix_args + 1; pmatch = new regmatch_t[nmatch]; } else { nr_prefix_args = 0; nmatch = 0; pmatch = NULL; } result = regexec(®ex, msg->message.c_str(), nmatch, pmatch, 0); if (result != 0) { if (pmatch) delete[] pmatch; return 0; } if (nr_prefix_args > 0) { unsigned int i; for (i = 0; i < nr_prefix_args; i++) { /* pmatch[0] matches the whole line. */ regmatch_t *subex = &pmatch[i+1]; string arg_name = reporter->prefix_args->at(i); msg->prefix_args[arg_name] = msg->message.substr(subex->rm_so, subex->rm_eo - subex->rm_so); } delete[] pmatch; if (!parent->driver->message_passes_filters(msg)) { /* Message is from a different driver, perhaps. */ msg->prefix_args.clear(); return 0; } } return 1; } MatchVariant::MatchVariant(ReporterAlias *ra, int msg_severity, SyslogEvent *pa) { assert(pa); assert(ra); parent = pa; reporter_alias = ra; severity = resolve_severity(msg_severity); if (regex_text_policy != RGXTXT_READ) { compute_regex_text(); compile_regex(); if (catalog_copy) { string regex_stmt = "regex " + ra->name + " \"" + add_escapes(regex_text) + "\"\n"; catalog_copy->inject_text(regex_stmt, cur_parser->lineno); } } } void MatchVariant::set_regex(const string& rgxtxt) { if (regex_text_policy == RGXTXT_READ) { regex_text = rgxtxt; compile_regex(); } else if (regex_text_policy == RGXTXT_WRITE) { static bool reported = false; if (!reported) { cur_parser->semantic_error("Adding regex statements " "to file that already has them."); reported = true; } } } void MatchVariant::report(ostream& os, bool sole_variant) { string indent; if (sole_variant) { indent = ""; } else { // Need to distinguish this variant from the others. os << "variant: " << reporter_alias->name << endl; indent = " "; } os << indent << "regex_text: " << regex_text << endl; os << indent << "severity: " << severity_name(severity) << endl; } ostream& operator<<(ostream& os, const SyslogEvent& e) { os << "message: " << e.reporter_name << " \"" << e.escaped_format << "\"" << endl; bool sole_variant = (e.match_variants.size() == 1); vector::const_iterator it; for (it = e.match_variants.begin(); it < e.match_variants.end(); it++) (*it)->report(os, sole_variant); os << "subsystem: " << e.driver->subsystem << endl; if (e.source_file) os << "file: " << "\"" << *(e.source_file) << "\"" << endl; if (e.exception_msg) { os << "exception: " << e.exception_msg->type << endl; return os; } os << "description {{" << endl; os << e.description << endl << "}}" << endl; os << "action {{" << endl; os << e.action << endl << "}}" << endl; os << "class: " << nvp_lookup_value(e.err_class, class_nvp) << endl; if (e.err_type) os << "type: " << nvp_lookup_value(e.err_type, type_nvp) << endl; else os << "sl_severity: " << nvp_lookup_value(e.sl_severity, sl_severity_nvp) << endl; if (e.priority != '\0') os << "priority: " << e.priority << endl; os << "refcode: \"" << e.refcode << "\"" << endl; return os; } MessageFilter::MessageFilter(const string& name, int op, const string& value) { if (op != '=') cur_parser->semantic_error("filter op must be '='"); arg_name = name; arg_value = value; } /* * If msg has a prefix arg named arg_name (e.g., reporter), then that * arg's value must be arg_value to pass the filter. */ bool MessageFilter::message_passes_filter(SyslogMessage *msg) { map::iterator it = msg->prefix_args.find(arg_name); return (it == msg->prefix_args.end() || it->second == arg_value); } EventCtlgFile::EventCtlgFile(const string& path, const string& subsys) { pathname = path; subsystem = subsys; cur_source_file = NULL; size_t last_slash = pathname.rfind("/"); if (last_slash == string::npos) name = pathname; else name = pathname.substr(last_slash+1); } void EventCtlgFile::add_text_copy(const string& name, const string& text) { if (find_text_copy(name) != "") cur_parser->semantic_error("duplicate name for text copy: " + name); else text_copies[name] = text; } string EventCtlgFile::find_text_copy(const string& name) { map::iterator it = text_copies.find(name); if (it == text_copies.end()) return ""; return it->second; } DevspecMacro * EventCtlgFile::find_devspec(const string& name) { map::iterator it = devspec_macros.find(name); if (it == devspec_macros.end()) return NULL; return it->second; } void EventCtlgFile::add_devspec(const string& nm, const string& path) { DevspecMacro *dm = new DevspecMacro(nm, path); if (!dm->valid) delete dm; else if (find_devspec(nm)) { cur_parser->semantic_error("duplicate devspec entry for " + nm); delete dm; } else devspec_macros[nm] = dm; } void EventCtlgFile::add_filter(MessageFilter *filter) { filters.push_back(filter); } bool EventCtlgFile::message_passes_filters(SyslogMessage *msg) { vector::iterator it; for (it = filters.begin(); it != filters.end(); it++) { if (!(*it)->message_passes_filter(msg)) return false; } return true; } void EventCtlgFile::set_source_file(const string& path) { cur_source_file = new string(path); source_files.push_back(cur_source_file); } DevspecMacro::DevspecMacro(const string& nm, const string& path) { valid = false; name = nm; string embedded_name = "/$" + nm + "/"; size_t pos1 = path.find(embedded_name); if (pos1 == string::npos) { cur_parser->semantic_error("could not find $" + nm + " component of " + path); return; } size_t pos2 = path.rfind("/devspec"); if (pos2 == string::npos || pos2+strlen("/devspec") != path.length()) { cur_parser->semantic_error("devspec is not final component of " + path); return; } prefix = path.substr(0, pos1 + 1); suffix = path.substr(pos1 + embedded_name.length() - 1); valid = true; } string DevspecMacro::get_devspec_path(const string& device_id) { if (!valid) return ""; return prefix + device_id + suffix; } /* * Parse all the catalog files in the specified directory, populating * reporter_catalog, exceptions catalog, and event_catalog. */ int EventCatalog::parse(const string& directory) { string path; string dir_w_regex, event_ctlg_dir; int result; DIR *d; struct dirent *dent; path = directory + "/reporters"; result = reporter_ctlg_parser.parse_file(path); if (result != 0) return result; path = directory + "/exceptions"; result = event_ctlg_parser.parse_file(path); if (result != 0) return result; dir_w_regex = directory + "/with_regex"; if (regex_text_policy == RGXTXT_READ) event_ctlg_dir = dir_w_regex; else event_ctlg_dir = directory; d = opendir(event_ctlg_dir.c_str()); if (!d) { perror(event_ctlg_dir.c_str()); return -1; } while ((dent = readdir(d)) != NULL) { string name = dent->d_name; if (name == "reporters" || name == "exceptions") continue; path = event_ctlg_dir + "/" + name; /* Skip directories and such. */ struct stat st; if (stat(path.c_str(), &st) != 0) { perror(path.c_str()); continue; } if (!S_ISREG(st.st_mode)) continue; if (regex_text_policy == RGXTXT_WRITE) { /* * As we parse this catalog, emit a copy of it that * adds a regex statement for each computed regex. * We assume that dir_w_regex has been created and * has appropriate permissions. */ catalog_copy = new CatalogCopy(path, dir_w_regex + "/" + name); result |= event_ctlg_parser.parse_file(path); catalog_copy->finish_copy(); delete catalog_copy; catalog_copy = NULL; } else result |= event_ctlg_parser.parse_file(path); } (void) closedir(d); return result; } void EventCatalog::register_driver(EventCtlgFile *driver) { if (driver) drivers.push_back(driver); } void EventCatalog::register_event(SyslogEvent *event) { if (event) { events.push_back(event); event->verify_complete(); } } // regex to match "[%5lu.%06lu] ", as used by printk() static const char *printk_timestamp_regex_text = // "^\\[[ ]{0,4}[0-9]{1,}\\.[0]{0,5}[0-9]{1,}] "; "^\\[[ ]{0,4}[0-9]{1,}\\.[0-9]{6}] "; static regex_t printk_timestamp_regex; static bool printk_timestamp_regex_computed = false; static void compute_printk_timestamp_regex(void) { int result = regcomp(&printk_timestamp_regex, printk_timestamp_regex_text, REG_EXTENDED | REG_NOSUB | REG_NEWLINE); if (result != 0) { char reason[100]; (void) regerror(result, &printk_timestamp_regex, reason, 100); fprintf(stderr, "Internal error: can't compile regular " "expression for printk timestamp:\n%s\n", reason); exit(2); } printk_timestamp_regex_computed = true; } /* * If the message begins with what looks like a timestamp emitted by printk() * under the CONFIG_PRINTK_TIME option, skip past that. Return a pointer to * where the message seems to start. */ static const char* skip_printk_timestamp(const char *msg) { if (!printk_timestamp_regex_computed) compute_printk_timestamp_regex(); if (msg[0] == '[' && regexec(&printk_timestamp_regex, msg, 0, NULL, 0) == 0) { msg = strstr(msg, "] "); assert(msg); msg += 2; } return msg; } SyslogMessage::SyslogMessage(const string& s) { line = s; parsed = false; char *s2 = strdup(s.c_str()); assert(s2); char *saveptr = NULL; char *date_end, *host, *prefix, *colon_space, *final_nul; /* Zap newline, if any. */ char *nl = strchr(s2, '\n'); if (nl) { if (strcmp(nl, "\n") != 0) { fprintf(stderr, "multi-line string passed to " "SyslogMessage constructor\n"); goto done; } *nl = '\0'; } final_nul = s2 + strlen(s2); /* ": " should divide the prefix from the message. */ colon_space = strstr(s2, ": "); if (!colon_space) { /* * Could be a line like * "Sep 21 11:56:10 myhost last message repeated 3 times" * which we currently ignore. */ goto done; } /* Assume the date is the first 3 words, and the hostname is the 4th. */ date = parse_syslog_date(s2, &date_end); if (!date) goto done; host = strtok_r(date_end, " ", &saveptr); if (!host) goto done; hostname = host; /* * Careful here. If the message is not from the kernel, the prefix * could be multiple words -- e.g., gconfd messages. */ prefix = strtok_r(NULL, " ", &saveptr); if (!prefix || prefix > colon_space) goto done; if (!strcmp(prefix, "kernel:")) { from_kernel = true; message = skip_printk_timestamp(colon_space + 2); } else { /* * For non-kernel messages, the message includes the prefix. * So the last strtok_r() call probably replaced a space with * a null character in our message. Fix that. */ from_kernel = false; char *nul = prefix + strlen(prefix); if (nul < final_nul) *nul = ' '; message = prefix; } parsed = true; done: free(s2); } string SyslogMessage::echo(void) { char cdate[32]; struct tm tm; (void) localtime_r(&date, &tm); (void) strftime(cdate, 32, "%b %d %T", &tm); string sdate(cdate); if (from_kernel) return sdate + " " + hostname + " kernel: " + message; else return sdate + " " + hostname + " " + message; } /* * Compute the path to the /sys/.../devspec node for the device (if any) * specified in this message. We assume that this message has been * matched to the specified event. Returns 0 if this->devspec_path is * successfully set, or -1 otherwise. */ int SyslogMessage::set_devspec_path(SyslogEvent *event) { EventCtlgFile *driver; if (!event) return -1; driver = event->driver; if (!driver || driver->devspec_macros.size() == 0) return -1; if (prefix_args.size() == 0) return -1; /* * Iterate through the driver's devspec macros, trying to find * a prefix arg in this message that will plug in. Use the * first match we find. */ map::iterator it; for (it = driver->devspec_macros.begin(); it != driver->devspec_macros.end(); it++) { string name = it->first; map::iterator arg = prefix_args.find(name); if (arg != prefix_args.end()) { DevspecMacro *dm = it->second; devspec_path = dm->get_devspec_path(arg->second); return 0; } } return -1; } /* Get the device ID from the (matched) message. */ string SyslogMessage::get_device_id(MatchVariant *mv) { if (!mv) return ""; Reporter *reporter = mv->reporter_alias->reporter; if (reporter->device_arg == "none") return ""; return prefix_args[reporter->device_arg]; } CatalogCopy::CatalogCopy(const string& rd_path, const string& wr_path) { valid = false; orig_file = NULL; copy_file = NULL; orig_path = rd_path; copy_path = wr_path; orig_file = fopen(orig_path.c_str(), "r"); if (!orig_file) { fprintf(stderr, "can't open catalog file\n"); perror(orig_path.c_str()); return; } copy_file = fopen(copy_path.c_str(), "w"); if (!copy_file) { fprintf(stderr, "can't open new catalog file\n"); perror(copy_path.c_str()); return; } last_line_copied = 0; valid = true; } /* * Copy lines from orig_file to copy_file 'til we've copied through * line line_nr in orig_file. Returns 0 if all lines copied, EOF * otherwise. A negative line_nr says copy through EOF (and return EOF). */ int CatalogCopy::copy_through(int line_nr) { int copied; char buf[1024]; // Longer lines are OK. if (line_nr < 0) line_nr = 1000*1000; copied = last_line_copied; while (copied < line_nr && fgets(buf, 1024, orig_file)) { fputs(buf, copy_file); if (strchr(buf, '\n')) copied++; } last_line_copied = copied; return (last_line_copied == line_nr ? 0 : EOF); } /* * Copy through line line_nr in orig_file, then append text, which is * assumed to end in a newline, if appropriate. */ void CatalogCopy::inject_text(const string& text, int line_nr) { if (!valid) return; if (copy_through(line_nr) == EOF) { fprintf(stderr, "%s truncated at line %d\n", orig_path.c_str(), last_line_copied); valid = false; } fputs(text.c_str(), copy_file); } void CatalogCopy::finish_copy(void) { if (valid) (void) copy_through(-1); } CatalogCopy::~CatalogCopy() { if (orig_file) fclose(orig_file); if (copy_file) fclose(copy_file); } string indent_text_block(const string& s1, size_t nspaces) { if (nspaces == 0) return s1; string s2 = s1; size_t pos = 0, skip_nl = 0; do { s2.insert(pos + skip_nl, nspaces, ' '); pos += nspaces + skip_nl; skip_nl = 1; } while ((pos = s2.find_first_of('\n', pos)) != string::npos); return s2; } ppc64-diag-2.6.4/ela/doc/0000755000000000000000000000000012313010662013357 5ustar rootrootppc64-diag-2.6.4/ela/doc/explain_syslog.8.gz0000644000000000000000000000174612313010662017137 0ustar rootroot‹ödMexplain_syslog.8UÛnã6}çW ü䱜d‹EžšxF­‘íb´4’ØJ¢@R¹ýøÎP²­¤AšðÍ™9sxæ¢`=ÁzÃÉLtýdT–;/çôÏÔÚH§tg'§'ì&‚Õ5L[Î.›Mô-š-~‚Ï0˜KçÞi3U50ø¢dViëT +­ K¡Ñ5Ü\̧ëBªjcŸl¡3AwÝE‰ÖÊ ­ˆ¾Ý,–Q‰àžŠï|·mEÂ328U¢¸ƒÎ€lÀ*é®E°5»˜’M]žMª µ†ù!|Â>±t’rme–üpL—h~™F“Ûp¹ 7b•ã+lc]–²JÀ L,¸ÁÖ«Ta²c̆ ¦²)9i°.QÕѱxÈ)lsÝ =H-†Hµ)¥ƒÚ褉 hûÄל½ÍšˆDb©«@\i( £P’EQdœ£¹ÏŸè¸)±r„Ô%ØY:Ž_yXmTEdeÕ*ß1Ç ‘ϘÝVn i,B+ËAµ¡L2æ€À˸ð R±WK±N/©¸ët ë4<Ô—.DH­eöä,<(—­“em)£¢ç:M¼íµ"B„Ájï ©&]ª^É9×W‹¯)Aïóè=o‚§ÒCW>PÖ;ŒÑÅ㺎?}%4ã]×íp‚ƒ„ó-YNÙ6YÆêéÆÕBê4¦çã]¿G™:4žØ.êmUò§‹>:_B|T®Ç¥ì¸ô‡ŠCo©Ý_6¤F—/FÀ·¾ª¬c¶ßß¿ Ö*}/͘L㽩mªU8ŸF«‹ù2òõIuQè–v/K7G¤Iǽ™UêO?NÔï·/Îý&á¢+—ó!‘O¼YBxBé÷ ‘³rç¬KóOÖÒéîN¬‡XYp W¸…Ó3¿:áôãù‡“W±ß‚ƒ^â]0Çì1þ1"å¹õ9=ƒýOœÈÂÿÈ6bwè΄ɕ}?1–jt6"~žÛù Ñ£¶O¡Ò>#ÍÝ¡­^ÛWÒZZr¶ÝÜ„‡6P½Ölw¥ñlmàsüóÝâ½ O˜,ýÚ®¼øºº^ÜŠ_r+ÞÜ?«~ÁJYGÃ>üýöøccµ-Z˜G˜èêåo2 I·þ­£ùÌü÷Â`Ö$Q04ägÅÜÚeÏMÿr|(h·Šhó…öH<ôH‘ÂLƒDªð‡çœø5WálqÑÿeÝhkùb›zŒA4ÂÅ,Z ü8·D7No,š{#S~¦áÁ ÃGâovׇçÃppc64-diag-2.6.4/ela/doc/syslog_to_svclog.8.gz0000644000000000000000000000254212313010662017471 0ustar rootroot‹ödMsyslog_to_svclog.8VmoÛ6þÎ_qð'g°•ôE‘OKÝdõÇFä®(êÀ %Jb'‘I9ñ°¿;ê5©d’€¡îŽŸ»{ŽÁfÄ‚ÍƳ˜éò`dš9˜Xà¦Ô†;©¼>{uFf,X‚ðkx½üe»^nÃßg¸‚÷0ZpeÞl×RU0ú(yª´u2‚µÖ¹EçðÜ\,.™=Ø\§[§·vá ¦@ëm(„µ<œ+Ì^F·½wøõf¹ ç! >ÀÓ ìín¦;Ìa'R©¶N‚ÝAóAСâzûïzóŠÝ±`gZç‚lÛDæÝ¢3#›ˆ;NÇÇÒô_²~S\Düñ2œÝÎWëùò†­3qx¤‹‚«Œà1Þ:`KÉDЏÅ„ƱHx•»šKu2a÷™Dêm¦«<Æ{ƒT>D¢MÁ”FÇU„vÚîÏYÌE¡UÀ®´Á1F.•@#ôBÏ(à ðîüXGU!”ÃHÍí—†‰ÉÑ«á/FQ öèK¨[ }^côßq+&ÀÑ´DÀ¥‘܉€­¥Œxžž‰­U~€{n”T)‰Â¼Ï †Ð÷vpL˜Òb±«R@K©j¦°ÌyÞù,X±/™P”ëÓ=7§èzÚ~eÒ>¢€’scÁ¥røKTæÒ9Lâ(çÖM×QXOz¤;Ó;tâÙ"ó:5T]5È\<È9KXà¶ÚYñgE ÂÓW‘À³^Ç·•õ@ˆïËí`eJ†ÒmOêÒ ×ÕöqÆš#î¥Ë #include #include #include #include #include #include #include #include "catalogs.h" extern "C" { #include "platform.c" } static const char *progname; bool debug = 0; extern ReporterCatalog reporter_catalog; extern EventCatalog event_catalog; static void usage_message(FILE *out) { fprintf(out, "usage: %s [-b date] [-e date] [-m msgfile | -M]\n" "\t[-C catalog_dir] [-h] [-d]\n", progname); } static void usage(void) { usage_message(stderr); exit(1); } static void report_event(SyslogEvent *event, SyslogMessage *msg, const char *line) { MatchVariant *mv = event->matched_variant; Reporter *reporter = mv->reporter_alias->reporter; cout << endl << line; cout << "matches: " << event->reporter_name << " \"" << event->escaped_format << "\"" << endl; size_t nr_prefix_args = msg->prefix_args.size(); if (nr_prefix_args > 0) { unsigned int i; for (i = 0; i < nr_prefix_args; i++) { string arg_name = reporter->prefix_args->at(i); if (i > 0) cout << " "; cout << arg_name << "=" << msg->prefix_args[arg_name]; } cout << endl; if (msg->set_devspec_path(event) == 0) cout << "devspec: " << msg->devspec_path << endl; } cout << "subsystem: " << event->driver->subsystem << endl; cout << "severity: " << severity_name(mv->severity) << endl; if (event->source_file) cout << "file: " << "\"" << *(event->source_file) << "\"" << endl; ExceptionMsg *em = event->exception_msg; string description, action; if (em) { description = em->description; action = em->action; } else { description = event->description; action = event->action; } cout << "description:" << endl << indent_text_block(description, 2) << endl; cout << "action:" << endl << indent_text_block(action, 2) << endl; } static time_t parse_date_arg(const char *date_str, const char *arg_name) { char *date_end = NULL; time_t t = parse_syslogish_date(date_str, &date_end); if (!t || *date_end != '\0') { cerr << "unrecognized date format for " << arg_name << " option" << endl; exit(1); } return t; } static void print_help(void) { usage_message(stdout); printf( "-b begin_time\tIgnore messages with timestamps prior to begin_time.\n" "-C catalog_dir\tUse message catalog in catalog_dir. Defaults to\n" "\t\t\t/etc/ppc64-diag/message_catalog.\n" "-d\t\tPrint debugging output on stderr.\n" "-e end_time\tStop upon reading message with timestamp after end_time.\n" "-h\t\tPrint this help text and exit.\n" "-m message_file\tRead syslog messages from message_file, not stdin.\n" "-M\t\tRead syslog messages from /var/log/messages.\n" ); } int main(int argc, char **argv) { int c; int platform = 0; time_t begin_date = 0, end_date = 0; const char *catalog_dir = ELA_CATALOG_DIR; const char *msg_path = NULL; FILE *msg_file = stdin; vector::iterator ie; progname = argv[0]; platform = get_platform(); if (platform != PLATFORM_PSERIES_LPAR) { cerr << progname << ": is not supported on the " << __power_platform_name(platform) << " platform" << endl; exit(1); } opterr = 0; while ((c = getopt(argc, argv, "b:C:de:hm:M")) != -1) { switch (c) { case 'b': begin_date = parse_date_arg(optarg, "-b"); break; case 'C': catalog_dir = optarg; break; case 'd': debug = true; break; case 'e': end_date = parse_date_arg(optarg, "-e"); break; case 'h': print_help(); exit(0); case 'm': msg_path = optarg; break; case 'M': msg_path = "/var/log/messages"; break; case '?': usage(); } } if (optind != argc) usage(); if (msg_path) { msg_file = fopen(msg_path, "r"); if (!msg_file) { perror(msg_path); exit(2); } } if (EventCatalog::parse(catalog_dir) != 0) exit(2); if (debug) { vector::iterator ir; for (ir = reporter_catalog.rlist.begin(); ir < reporter_catalog.rlist.end(); ir++) { cout << "-----" << endl; cout << **ir; } vector::iterator imr; for (imr = reporter_catalog.mrlist.begin(); imr < reporter_catalog.mrlist.end(); imr++) { cout << "-----" << endl; cout << **imr; } for (ie = event_catalog.events.begin(); ie < event_catalog.events.end(); ie++) { cout << "-----" << endl; cout << **ie; } } #define LINESZ 256 char line[LINESZ]; int skipped = 0; bool prev_line_truncated = false, cur_line_truncated; while (fgets(line, LINESZ, msg_file)) { if (strchr(line, '\n')) cur_line_truncated = false; else { /* * syslog-ng "Log statistics" messages can be very * long, so don't complain about such monstrosities * by default. */ if (debug) cerr << "message truncated to " << LINESZ-1 << " characters!" << endl; line[LINESZ-2] = '\n'; line[LINESZ-1] = '\0'; cur_line_truncated = true; } bool skip_fragment = prev_line_truncated; prev_line_truncated = cur_line_truncated; if (skip_fragment) continue; SyslogMessage msg(line); if (!msg.parsed) { if (debug) cerr << "unparsed message: " << line; skipped++; continue; } if (begin_date && difftime(msg.date, begin_date) < 0) continue; if (end_date && difftime(msg.date, end_date) > 0) { /* * We used to break here (i.e., skip all the rest * of the lines in the file). But timestamps in * syslog files sometimes jump backward, so it's * possible to find lines in the desired timeframe * even after we hit lines that are beyond it. */ continue; } SyslogEvent *unreported_exception = NULL; bool reported = false; for (ie = event_catalog.events.begin(); ie < event_catalog.events.end(); ie++) { SyslogEvent *event = *ie; if (event->exception_msg && (reported || unreported_exception)) { /* * We've already matched an event, so * don't bother trying to match exception * catch-alls. */ continue; } if (event->match(&msg, true)) { if (skipped > 0) { cout << endl << "[Skipped " << skipped << " unrecognized messages]" << endl; skipped = 0; } if (event->exception_msg) unreported_exception = event; else { report_event(event, &msg, line); reported = true; } } } if (!reported) { if (unreported_exception) report_event(unreported_exception, &msg, line); else skipped++; } } if (skipped > 0) cout << endl << "[Skipped " << skipped << " unrecognized messages]" << endl; exit(0); } ppc64-diag-2.6.4/scripts/0000755000000000000000000000000012313010662013540 5ustar rootrootppc64-diag-2.6.4/scripts/servevent_parse.pl0000755000000000000000000000177212313010662017322 0ustar rootroot# # Copyright 2007 IBM Corporation # # parse_se # Parses serviceable event data that is stored in servicelog. The data should # be made available on stdin. # # First return value: a hash containing all the variables in the serviceable # event except for FRU callouts # Second return value: an array containing all the FRU callouts; each # element contains a space-separated callout description sub parse_se { my %se_vars = (); my @callouts = (); while () { chomp; $pos = index($_, ":"); if ($pos > 0) { $tag = substr($_, 0, $pos); $value = substr($_, $pos+2); } else { $tag = $_; $value = ""; } if ($tag eq "Callout") { ($p1, $p2, $p3, $p4, $p5, $p6, $p7, $p8) = split /\s/, $value; push(@callouts, "$p1 $p2 $p3 $p4 $p5 $p6 $p7 $p8"); } elsif (substr($tag, 0, 8) eq "AddlWord") { $se_vars{$tag} = sprintf("%08X", hex(lc($value))); } else { $se_vars{$tag} = $value; } } return (\%se_vars, \@callouts); } 1; ppc64-diag-2.6.4/scripts/opal_errd0000755000000000000000000000463212313010662015442 0ustar rootroot#! /bin/sh # # System startup script for opal_errd daemon # # Copyright (C) 2014 IBM Corporation # # Description: Starts opal_errd daemon to retrieve platform errors # and performs error log analysis. # Return values: # 0 Success # 1 Unspecified error # 2 Invalid argument(s) # 3 Unimplemented feature # 4 Insufficient privileges # 5 Daemon not installed # 6 Daemon not configured # 7 Daemon not running # 8 - 199 Reserved ### BEGIN INIT INFO # Provides: opal_errd # Required-Start: $local_fs $syslog $time # Required-Stop: # Default-Start: 2 3 5 # Default-Stop: 0 1 4 6 # Short-Description: Daemon to retrieve platform errors/events # Description: Starts opal_errd daemon to retrieve platform errors, # parse the error and log to syslog. ### END INIT INFO # Command path OE_BIN=/usr/sbin/opal_errd test -x $OE_BIN || exit 5 # This daemon runs only on PowerNV platform platform=`cat /proc/cpuinfo | grep platform | awk '{print $3}'` if [ ! -e "/sys/firmware/opal/elog" ]; then echo "opal_errd daemon is not supported on the $platform platform" exit 0 fi if [[ -f /etc/rc.status ]]; then . /etc/rc.status rc_reset INSSERV=1 else . /etc/rc.d/init.d/functions INSSERV=0 fi opal_errd_start() { if [[ $INSSERV -eq 1 ]]; then startproc $OE_BIN rc_status -v else daemon $OE_BIN pid=`pidof opal_errd` if [[ -n "$pid" ]]; then echo $pid > /var/run/opal_errd.pid touch /var/lock/subsys/opal_errd fi fi } opal_errd_stop() { if [[ $INSSERV -eq 1 ]]; then killproc -TERM $OE_BIN rc_status -v else killproc opal_errd -TERM rm -f /var/lock/subsys/opal_errd rm -f /var/run/opal_errd.pid echo fi } opal_errd_status() { if [[ $INSSERV -eq 1 ]]; then checkproc $OE_BIN rc_status -v else status opal_errd fi } opal_errd_reload() { pid=`pidof opal_errd` if [[ -n "$pid" ]]; then kill -HUP $pid fi } case "$1" in start) echo -n "Starting opal_errd daemon: " opal_errd_start ;; stop) echo -n "Stopping opal_errd daemon: " opal_errd_stop ;; restart) # Stop and restart the service echo -n "Restarting opal_errd daemon: " opal_errd_stop opal_errd_start if [[ $INSSERV -eq 1 ]]; then rc_status fi ;; reload) # Reload the config echo -n "Reload opal_errd daemon: " opal_errd_reload ;; status) opal_errd_status ;; *) echo "Usage: $0 {start|stop|status|restart|reload}" exit 1 ;; esac if [[ $INSSERV -eq 1 ]]; then rc_exit else exit 0 fi ppc64-diag-2.6.4/scripts/ppc64_diag_migrate0000755000000000000000000000225212313010662017117 0ustar rootroot#! /usr/bin/perl -I /etc/ppc64-diag # # This script is to be registered with servicelog as a notification tool. It # is responsible for performing whatever actions may be necessary following # the migration of a partition from one system to another. # # It is only invoked when an event with a refcode of #MIGRATE is logged. # The DLPAR/virtualization tools automatically log such an event just after # a partition is migrated to a new system. # # Copyright (C) 2008 IBM Corporation # # Update the VPD database with the dynamic VPD of the new system system("vpdupdate >/dev/null 2>&1"); # Force RMC to detect new management servers (HMCs, etc.) system("/usr/sbin/rsct/bin/refrsrc IBM.ManagementServer >/dev/null 2>&1"); # We should consider having this script go through and close # any open serviceable events that are only applicable to the # old hardware. That opens up a few new questions, though: # Do we reopen those events if the partition is migrated back # to the old system? What if there was a repair action on # that old system which would fix one of the serviceable events # that we are trying to reopen? We'll skip it for now in favor # of manual cleanup, if necessary. ppc64-diag-2.6.4/scripts/ppc64_diag_mkrsrc0000755000000000000000000001551512313010662016776 0ustar rootroot#! /usr/bin/perl -I /etc/ppc64-diag # # This script is to be registered with servicelog as a notification tool. It # is responsible for creating a new IBM.ServiceEvent RMC resource when a # new serviceable event is logged in servicelog. The ServiceRM resource # manager will cause the event to be reported to a managing Service Focal # Point (SFP, on a managing HMC or IVM partition). If ServiceRM is not # installed, this script will do nothing. # # Ideally, ServiceRM should register itself with servicelog when it is # installed, so that we don't have to check if it is installed every time a # serviceable event is logged, but this will do for the time being. # # Copyright (C) 2005, 2007 IBM Corporation # require "/etc/ppc64-diag/servevent_parse.pl"; # Check to make sure that devices.chrp.base.ServiceRM is installed $check = `/bin/rpm -q devices.chrp.base.ServiceRM 2>/dev/null`; if (index($check, "ServiceRM-") == -1) { print "ServiceRM is not installed.\n"; # exit 1; } # Wait for rmcd to start $running = 0; $running = 1; $count = 0; do { $check = `ps -e | grep rmcd 2>/dev/null`; if (index($check, "rmcd") >= 0) { $running = 1; } if ($running == 0) { $count++; sleep 5; } } while ($running == 0 && $count < 36); # wait about 3 minutes if ($running == 0) { print "Timed out waiting for RMC daemon to start.\n"; exit 1; } # Parse the serviceable event data retrieved from stdin ($se_vars, $frus) = parse_se(); # Set call home candidate, error code, error text, and NLS support variables # Call Home Candidate: # always no for menugoals # always yes for SRNs # otherwise, check the action flag $error_text = $se_vars->{"Description"}; $nls_support = "{\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\"}"; if (substr($se_vars->{"RefCode"}, 0, 1) eq "#") { # this is a menugoal $call_home_candidate = "No"; $error_code = $se_vars->{"RefCode"}; } else { # this is an SRC or SRN if ((length($se_vars->{"RefCode"}) == 8) && (index($se_vars->{"RefCode"}, '-') == -1)) { # this is an SRC $error_code = ""; $call_home_candidate = "Yes"; } else { # this is an SRN $error_code = $se_vars->{"RefCode"}; $call_home_candidate = "Yes"; } } # Retrieve hostname from /etc/HOSTNAME; store both fully qualified and short $host_name = `hostname 2>/dev/null`; if (index($host_name, ".") == -1) { $host_name = `hostname -f 2>/dev/null`; } chomp $host_name; $partition_name = (split(/\./, $host_name))[0]; # Retrieve partition ID from /proc/device-tree/ibm,partition-no if (-e "/proc/device-tree/ibm,partition-no") { $partition_no = `od -An -td /proc/device-tree/ibm,partition-no | sed "s/\\s//g" 2>/dev/null`; chomp $partition_no; if (length($partition_no) == 0) { $partition_no = "000".$partition_no } elsif (length($partition_no) == 1) { $partition_no = "00".$partition_no } elsif (length($partition_no) == 2) { $partition_no = "0".$partition_no } } else { $partition_no = "000"; } # Retrieve CEC MTMS from /proc/device-tree/model and /proc/device-tree/system-id $cec_machinetype = `cat /proc/device-tree/model | cut -c5- 2>/dev/null`; chomp $cec_machinetype; chop $cec_machinetype; $cec_machineserial = `cat /proc/device-tree/system-id | cut -c7- 2>/dev/null`; chomp $cec_machineserial; chop $cec_machineserial; # Retrieve OS description $os = "Linux"; if (-e "/etc/SuSE-release") { $os .= " (Novell/SuSE)"; } elsif (-e "/etc/redhat-release") { $os .= " (RedHat)"; } # Determine if ibm,converged-loc-code property applies $level = ""; if (-e "/proc/device-tree/ibm,converged-loc-codes") { $level = "Level=\"ibm,converged-loc-codes\" "; } # Retrieve Extended Error Data (EED) mkdir "/tmp/diagSEsnap", 0775; $general_eed_file = "/tmp/diagSEsnap/snapH.tar.gz"; system("/usr/sbin/snap -o $general_eed_file 2>/dev/null 1>&2"); $cstop_eed_file = ""; # Retrieve cluster MTMS if on a cluster $cluster_mt = ""; $cluster_ms = ""; if (-e "/usr/lib/lscmtms") { $cluster_mtms = `/usr/lib/lscmtms 2>/dev/null`; # output of lscmtms is in the following form: "MT: MS:" # anything, including spaces, can be between < and >; a space # precedes the MS: tag $start = index($cluster_mtms, "MT:<"); if ($start >= 0) { $start += 4; $end = index($cluster_mtms, ">", $start); $cluster_mt = substr($cluster_mtms, $start, $end-$start); } $start = index($cluster_mtms, "MS:<"); if ($start >= 0) { $start += 4; $end = index($cluster_mtms, ">", $start); $cluster_ms = substr($cluster_mtms, $start, $end-$start); } } $cluster_buffer = "{\\\"$cluster_mt\\\",\\\"$cluster_ms\\\"}"; # Create mkrsrc command line $nodes = "Nodes=\"{[\\\"OS\\\",{\\\"$cec_machinetype\\\"},". "{\\\"$cec_machineserial\\\"},". "\\\"".$se_vars->{"MachineType"}."\\\",". "\\\"".$se_vars->{"MachineSerial"}."\\\",". "\\\"$error_code\\\",\\\"".$error_text."\\\",". "\\\"$reporting_loc_code\\\",\\\"$partition_no\\\",". "\\\"$partition_name\\\",\\\"$host_name\\\",\\\"$os\\\",". "\\\"".$se_vars->{"LogTime"}."\\\",\\\"$last_time\\\",". "\\\"$err_log_resource\\\",". "".$se_vars->{"ServicelogID"}.",0,". "\\\"$general_eed_file\\\",\\\"$cstop_eed_file\\\",0,". "{\\\"\\\"},{\\\"\\\"},{\\\"\\\"},{\\\"\\\"},{\\\"\\\"},". "{\\\"\\\"},{\\\"\\\"},{\\\"\\\"},{\\\"\\\"},{\\\"\\\"},". "$nls_support,$cluster_buffer]}\""; $sysrefcode = "SystemRefCode=\"".substr($se_vars->{"RefCode"}, 0, 8). $se_vars->{"AddlWord0"}.$se_vars->{"AddlWord1"}. $se_vars->{"AddlWord2"}.$se_vars->{"AddlWord3"}. $se_vars->{"AddlWord4"}.$se_vars->{"AddlWord5"}. $se_vars->{"AddlWord6"}.$se_vars->{"AddlWord7"}."\""; $fru_list = "FRUList=\"{"; $first_fru = 1; foreach $fru (@$frus) { if ($first_fru == 0) { $fru_list .= ","; } $first_fru = 0; # FRUList data: # index 1: PartNum # index 5: RefCode # index 12: LocCode (array of size 1) # index 13: CCIN # index 14: FRUSerialNum # index 15: FRUClass (integer value) # index 16: ReplacementGroup (aka Priority) $fru_list .= "["; @data = split / /, $fru; # data[0]=priority, data[1]=type, data[2]=procedure, # data[3]=location, data[4]=p/n, data[5]=s/n, data[6]=ccin $fru_list .= "\\\"\\\",\\\"".$data[4]."\\\",\\\"\\\",\\\"\\\",". "\\\"\\\",\\\"\\\",{},{},\\\"\\\",\\\"\\\",\\\"\\\",". "\\\"\\\",{\\\"".$data[3]."\\\"},\\\"".$data[6]."\\\",". "\\\"".$data[5]."\\\",".$data[1].",\\\"".$data[0]. "\\\""; $fru_list .= "]"; } $fru_list .= "}\""; $command = "/usr/bin/mkrsrc IBM.ServiceEvent $level". "CallHomeCandidate=\"$call_home_candidate\" $nodes $sysrefcode"; if ($first_fru == 0) { $command .= " $fru_list"; } if (defined $se_vars->{"PlatformID"}) { $command .= " PlatformLogID=".hex(lc($se_vars->{"PlatformID"})); } if (defined $se_vars->{"CreatorID"}) { $command .= " CreatorID=\"".$se_vars->{"CreatorID"}."\""; } if (defined $se_vars->{"SubsystemID"}) { $command .= " SubsystemID=".hex(lc($se_vars->{"SubsystemID"})); } if (defined $se_vars->{"EventSeverity"}) { $command .= " EventSeverity=".hex(lc($se_vars->{"EventSeverity"})); } system("$command\n"); exit 0; ppc64-diag-2.6.4/scripts/ppc64_diag_servagent0000755000000000000000000001050512313010662017465 0ustar rootroot#! /usr/bin/perl -I /etc/ppc64-diag # # This script is to be registered with servicelog as a notification tool. It # is responsible for invoking Electronic Service Agent in response to a # serviceable event, if eSA is installed on the system. If eSA is not # installed, the script will do nothing. # # Ideally, eSA should register itself with servicelog when it is installed, # so that we don't have to check if it is installed every time a serviceable # event is logged, but this will do for the time being. # # Copyright (C) 2007 IBM Corporation # require "/etc/ppc64-diag/servevent_parse.pl"; if (!-e "/usr/svcagent/bin/callsa2") { # eSA is not installed; exit quietly exit 0; } ($se_vars, $frus) = parse_se(); @lines = (); # Determine if the partition is HMC-attached $slot = 0; while ($slot < 16) { @hmc = `/usr/sbin/serv_config -e hmc$slot`; if (@hmc[0] ne "\n") { push(@lines, "HMC_Attached:"); last; } $slot = $slot + 1; } $val = $se_vars->{"EventTime"}; push(@lines, "Date/Time: $val"); $error_code = $se_vars->{"RefCode"}; # trim leadng and tailing whitespace $error_code =~ s/^\s+//; $error_code =~ s/\s+$//; $error_text = $se_vars->{"Description"}; if (substr($se_vars->{"RefCode"}, 0, 1) eq "#") { # this is a menugoal $error_code = substr($se_vars->{"RefCode"}, 1); push(@lines, "Menu Number: $error_code"); push(@lines, "Menu Text: $error_text"); push(@lines, "End Menu Text"); } else { # this is an SRC or SRN if ((length($error_code) == 8) && (index($error_code, '-') == -1)) { # this is an SRC $src = substr($se_vars->{"RefCode"}, 0, 8). $se_vars->{"AddlWord0"}.$se_vars->{"AddlWord1"}. $se_vars->{"AddlWord2"}.$se_vars->{"AddlWord3"}. $se_vars->{"AddlWord4"}.$se_vars->{"AddlWord5"}. $se_vars->{"AddlWord6"}.$se_vars->{"AddlWord7"}; push(@lines, "SRN_SRC: $src"); $val = sprintf("0X%X", hex($se_vars->{"AddlWord0"})); push(@lines, "Refc2: $val"); $val = sprintf("0X%X", hex($se_vars->{"AddlWord1"})); push(@lines, "Refc3: $val"); $val = sprintf("0X%X", hex($se_vars->{"AddlWord2"})); push(@lines, "Refc4: $val"); $val = sprintf("0X%X", hex($se_vars->{"AddlWord3"})); push(@lines, "Refc5: $val"); $val = sprintf("0X%X", hex($se_vars->{"AddlWord4"})); push(@lines, "Refc6: $val"); $val = sprintf("0X%X", hex($se_vars->{"AddlWord5"})); push(@lines, "Refc7: $val"); $val = sprintf("0X%X", hex($se_vars->{"AddlWord6"})); push(@lines, "Refc8: $val"); $val = sprintf("0X%X", hex($se_vars->{"AddlWord7"})); push(@lines, "Refc9: $val"); push(@lines, "Text: $error_text"); $val = uc($se_vars->{"PlatformID"}); push(@lines, "PlatformId: $val"); $val = $se_vars->{"CreatorID"}; push(@lines, "CreatorId: $val"); $val = uc($se_vars->{"SubsystemID"}); push(@lines, "SubSystemId: $val"); $val = uc($se_vars->{"RTASSeverity"}); push(@lines, "EventSeverity: $val"); $val = uc($se_vars->{"ActionFlags"}); push(@lines, "ActionFlags: $val"); foreach $fru (@$frus) { @data = split / /, $fru; # data[0]=priority, data[1]=type, data[2]=procedure, # data[3]=location, data[4]=p/n, data[5]=s/n, # data[6]=ccin, data[7]=repair_key $f = $data[0]." ".$data[1]." ".$data[2]." ".$data[3]. " ".$data[4]." ".$data[5]." ".$data[6]; push(@lines, "FRU_SRC(priority,type,procedure,". "location,p/n,s/n,ccin): $f"); } } else { # this is an SRN push(@lines, "SRN: $error_code"); push(@lines, "Text: $error_text"); foreach $fru (@$frus) { @data = split / /, $fru; # data[0]=priority, data[1]=type, data[2]=procedure, # data[3]=location, data[4]=p/n, data[5]=s/n, # data[6]=ccin, data[7]=repair_key $f = $data[3]." ".$data[4]." ".$data[2]; push(@lines, "FRU(Location,FRU p/n,Ref-code): $f"); } } } if (defined $se_vars->{"MachineType"}) { $val = $se_vars->{"MachineType"}; push(@lines, "Failing Device Enclosure Type-Model: $val"); } if (defined $se_vars->{"MachineSerial"}) { $val = $se_vars->{"MachineSerial"}; push(@lines, "Failing Device Enclosure Serial: $val"); } $val = $se_vars->{"ServicelogID"}; push(@lines, "ServiceLogId: $val"); $val = $se_vars->{"KernelID"}; push(@lines, "Error Log Sequence Number: $val"); if (!open(SA_PROG, "| /usr/svcagent/bin/callsa2")) { print("Could not run /usr/svcagent/bin/callsa2 to notify ". "Service Agent\n"); exit 1; } else { foreach $line (@lines) { print(SA_PROG "$line\n"); } close(SA_PROG); } exit 0; ppc64-diag-2.6.4/scripts/ppc64-diag.config0000644000000000000000000000252212313010662016566 0ustar rootroot# /etc/ppc64-diag/ppc64-diag.config # PowerLinux Platform Diagnostics configuration # After modifying this file, send a HUP signal to rtas_errd to have it # reprocess the file and pick up any modifications. This can be accomplished # by running "/etc/init.d/rtas_errd reload", or by running "kill -HUP ", # where is the process ID of rtas_errd. # Automatic deconfiguration settings # The system will refuse to drop below these specified minimums, regardless # of any requests to do so (due to predictive hardware failures). Note that # the system may experience unscheduled downtime should it refuse to # deallocate resources due to a predictive failure. MinProcessors=1 # must be 1 or greater MinEntitledCapacity=5 # must be 5 or greater # System dump configuration variables # These indicate where dump information that is provided by the platform # should be stored. These dumps include processor scan ring dumps, hypervisor # dumps, service processor dumps, power subsystem dumps, etc. ScanlogDumpPath=/var/log PlatformDumpPath=/var/log/dump # OS Auto Restart Policy # The AutoRestartPolicy variable indicates whether the system should # automatically restart after a crash. Set this policy to 1 to tell the # firmware to automatically restart the system/partition, or to 0 to # inhibit the restart. AutoRestartPolicy=1 ppc64-diag-2.6.4/scripts/rtas_errd0000755000000000000000000000544112313010662015457 0ustar rootroot#! /bin/sh # # System startup script for rtas_errd daemon # # Copyright (C) 2005 IBM Corporation # # Return values: # 0 success # 1 unspecified error # 2 invalid argument(s) # 3 unimplemented feature # 4 insufficient privileges # 5 daemon not installed # 6 daemon not configured # 7 daemon not running # 8 - 199 reserved # ### BEGIN INIT INFO # Provides: rtas_errd # Required-Start: $local_fs $syslog $time # Required-Stop: # Default-Start: 2 3 5 # Default-Stop: 0 1 4 6 # Short-Description: Daemon to retrieve platform errors # Description: Starts rtas_errd daemon to retrieve platform errors # and perform error log analysis. ### END INIT INFO # This daemon runs only on PowerVM platform platform=`cat /proc/cpuinfo | grep platform | awk '{print $3}'` if [ ! -e "/proc/ppc64/rtas/error_log" ]; then echo "rtas_errd daemon is not supported on the $platform platform" exit 0 fi RE_BIN=/usr/sbin/rtas_errd test -x $RE_BIN || exit 5 if [[ -f /etc/rc.status ]]; then . /etc/rc.status rc_reset INSSERV=1 else . /etc/rc.d/init.d/functions INSSERV=0 fi case "$1" in start) if test ! -d /var/cache/ppc64-diag.registered ; then echo "registering ppc64-diag with system" rm -f /var/cache/ppc64-diag.registered mkdir -v /var/cache/ppc64-diag.registered /etc/ppc64-diag/ppc64_diag_setup --register fi echo -n "Starting rtas_errd (platform error handling) daemon: " if [[ $INSSERV -eq 1 ]]; then startproc $RE_BIN rc_status -v else daemon $RE_BIN pid=`pidof rtas_errd` if [[ -n "$pid" ]]; then echo $pid > /var/run/rtas_errd.pid touch /var/lock/subsys/rtas_errd fi echo fi ;; stop) echo -n "Stopping rtas_errd (platform error handling) daemon: " if [[ $INSSERV -eq 1 ]]; then killproc -TERM $RE_BIN rc_status -v else killproc rtas_errd -TERM rm -f /var/lock/subsys/rtas_errd rm -f /var/run/rtas_errd.pid echo fi ;; try-restart) # Restart only if the service was active before. $0 status >/dev/null && $0 restart if [[ $INSSERV -eq 1 ]]; then rc_status fi ;; restart) # Stop and restart the service $0 stop $0 start if [[ $INSSERV -eq 1 ]]; then rc_status fi ;; force-reload) # Reload the config pid=`pidof rtas_errd` if [[ -n "$pid" ]]; then kill -HUP $pid fi ;; reload) # Reload the config pid=`pidof rtas_errd` if [[ -n "$pid" ]]; then kill -HUP $pid fi ;; status) if [[ $INSSERV -eq 1 ]]; then checkproc $RE_BIN rc_status -v else status rtas_errd fi ;; probe) exit 3 ;; *) echo "Usage: $0 {start|stop|status|try-restart|restart|force-reload|reload|probe}" exit 1 ;; esac if [[ $INSSERV -eq 1 ]]; then rc_exit else exit 0 fi ppc64-diag-2.6.4/scripts/Makefile0000644000000000000000000000127612313010662015206 0ustar rootroot# # Makefile for ppc64-diag/scripts # include ../rules.mk SCRIPTS = ppc64_diag_setup ppc64_diag_mkrsrc ppc64_diag_notify \ ppc64_diag_migrate servevent_parse.pl INIT_FILES = rtas_errd opal_errd CFG_FILES = ppc64-diag.config all: $(SCRIPTS) $(INIT_FILES) $(CFG_FILES) install: all @$(call install_files,$(SCRIPTS),744,$(DESTDIR)/etc/ppc64-diag) @$(call install_files,$(INIT_FILES),755,$(DESTDIR)/etc/init.d) @$(call install_files,$(CFG_FILES),644,$(DESTDIR)/etc/ppc64-diag) uninstall: @$(call uninstall_files,$(SCRIPTS),$(DESTDIR)/etc/ppc64-diag) @$(call uninstall_files,$(INIT_FILES),$(DESTDIR)/etc/init.d) @$(call uninstall_files,$(CFG_FILES),$(DESTDIR)/etc/ppc64-diag) clean: ppc64-diag-2.6.4/scripts/ppc64_diag_setup0000755000000000000000000000562012313010662016631 0ustar rootroot#! /usr/bin/perl # # Copyright (C) 2007 IBM Corporation # use Getopt::Long; sub usage { print "$0 {--register | --unregister} [--verbose]\n"; print " --register: register notification tools with servicelog\n"; print " --unregister: unregister servicelog notification tools\n"; print " --verbose: display verbose output\n"; exit(0); } sub run_cmd { my $cmd = @_[0]; $redirect = " >/dev/null 2>&1"; if ($flag_verbose) { $redirect = ""; print " *** Running: $cmd\n"; } system("$cmd$redirect"); my $exit_status = $? >> 8; if ($flag_verbose) { print " *** Exit Status: $exit_status\n"; } return $exit_status; } sub servicelog_id { my $cmd = @_[0]; # read the servicelog_notify output for the Servicelog ID @sl_out = `/usr/bin/servicelog_notify --list --command=\"$cmd\"`; foreach $line (@sl_out) { chomp($line); $pos = index($line, "Servicelog ID:"); if ($pos >= 0) { $sl_id = substr($line, 14); # trim leading whitespace $sl_id =~ s/^\s+//; return $sl_id; } } return "?"; } sub register { my $cmd = @_[0]->[0]; my $sl_args = @_[0]->[1]; my $rc; $rc = run_cmd("/usr/bin/servicelog_notify --list --command=\"$cmd\""); if ($rc == 1) { # command not currently registered; register it now $rc = run_cmd("/usr/bin/servicelog_notify --add ". "--command=\"$cmd\" $sl_args"); } } sub unregister { my $cmd = @_[0]->[0]; my $sl_args = @_[0]->[1]; my $rc; $rc = run_cmd("/usr/bin/servicelog_notify --remove ". "--command=\"$cmd\""); } @notification_tools = ( ["/etc/ppc64-diag/ppc64_diag_notify -q -e root -l /var/log/platform", "--match='serviceable=1' ". "--type=EVENT --method=pairs_stdin"], ["/etc/ppc64-diag/ppc64_diag_mkrsrc", "--match='serviceable=1' ". "--type=EVENT --method=pairs_stdin"], ["/etc/ppc64-diag/ppc64_diag_migrate", "--match=\'refcode=\"#MIGRATE\" and serviceable=0\' ". "--type=EVENT --method=pairs_stdin"], ); Getopt::Long::Configure("bundling"); GetOptions("register|r"=>\$flag_register, "unregister|u"=>\$flag_unregister, "help|h"=>\$flag_help, "verbose|v"=>\$flag_verbose, "<>"=>\&bad_arg) or usage(); usage() if $flag_help; if ($flag_register and $flag_unregister) { print "Only one of --register and --unregister should be specified.\n"; usage(); exit 1; } if (!$flag_register and !$flag_unregister) { print "One of --register or --unregister must be specified.\n"; usage(); exit 1; } my $count = 0; if ($flag_register) { foreach $tool (@notification_tools) { register($tool); $count++; } print "Registered $count tools with servicelog:\n\n"; foreach $tool (@notification_tools) { system("/usr/bin/servicelog_notify --list ". "--command=\"".$tool->[0]."\""); print "\n"; } } if ($flag_unregister) { foreach $tool (@notification_tools) { unregister($tool); $count++; } print "Unregistered $count notification tools from servicelog.\n"; } exit 0; ppc64-diag-2.6.4/scripts/ppc64_diag_notify0000755000000000000000000001235412313010662017003 0ustar rootroot#! /usr/bin/perl -I /etc/ppc64-diag # # This script is to be registered with servicelog as a notification tool. It # is responsible for sending out e-mail notifications of new ppc64 platform # events, and for writing event details to /var/log/platform. # # Copyright (C) 2005, 2007 IBM Corporation # use Getopt::Long; require "/etc/ppc64-diag/servevent_parse.pl"; sub usage { print "$0 [OPTIONS]\n"; print " --email: send notification to the specified addresses\n"; print " (comma-separated)\n"; print " --quiet: do not print notification to stdout\n"; print " --syslog: print notification to /var/log/messages\n"; print " --log: print notification to specified log file\n"; exit(0); } @lines = ( "-----------------------------------------------------------------------", "" ); Getopt::Long::Configure("bundling"); GetOptions("email|e=s"=>\$flag_email, "quiet|q"=>\$flag_quiet, "help|h"=>\$flag_help, "log|l=s"=>\$flag_logfile, "syslog|s"=>\$flag_syslog, "<>"=>\&bad_arg) or usage(); usage() if $flag_help; ($se_vars, $frus) = parse_se(); if ($se_vars->{"Serviceable"} eq "1") { push(@lines, "Automatic Error Log Analysis has detected a problem."); } else { push(@lines, "Informational Event"); } push(@lines, ""); # Generate the message text @lines[1] = $se_vars->{"LogTime"}; if (defined $se_vars->{"RefCode"}) { push(@lines, "The Service Request Number(s)/Probable Cause(s)"); push(@lines, "(causes are listed in descending order of probability):"); push(@lines, ""); @description_lines = split(/\|/, $se_vars->{"Description"}); if (substr($se_vars->{"RefCode"}, 0, 1) eq '#') { push(@lines, substr($se_vars->{"RefCode"}, 0, 8)); } else { $description_lines[0] = substr($se_vars->{"RefCode"}, 0, 8) . ": " . $description_lines[0]; } push(@lines, @description_lines); push(@lines, ""); } if (($se_vars->{"Serviceable"} eq "1") && defined $se_vars->{"AddlWord0"} && defined $se_vars->{"AddlWord1"} && defined $se_vars->{"AddlWord2"} && defined $se_vars->{"AddlWord3"} && defined $se_vars->{"AddlWord4"} && defined $se_vars->{"AddlWord5"} && defined $se_vars->{"AddlWord6"} && defined $se_vars->{"AddlWord7"}) { push(@lines, "Additional words 2-".$se_vars->{"AddlWord0"}. " 3-".$se_vars->{"AddlWord1"}." 4-".$se_vars->{"AddlWord2"}. " 5-".$se_vars->{"AddlWord3"}); push(@lines, " 6-".$se_vars->{"AddlWord4"}. " 7-".$se_vars->{"AddlWord5"}." 8-".$se_vars->{"AddlWord6"}. " 9-".$se_vars->{"AddlWord7"}); push(@lines, ""); } foreach $fru (@$frus) { @data = split / /, $fru; # ela event reports procedure ID as "see explain_syslog" if ($data[2] eq "see") { push(@lines, "Priority: ".shift(@data)." Type: ".shift(@data). " Procedure Id: ".shift(@data)." ".shift(@data)); } else { push(@lines, "Priority: ".shift(@data)." Type: ".shift(@data). " Procedure Id: ".shift(@data)); } push(@lines, "Location: ".shift(@data)." FRU: ".shift(@data). " Serial: ".shift(@data)." CCIN: ".shift(@data)); push(@lines, ""); } push(@lines, "Reference: servicelog event number ". $se_vars->{"ServicelogID"}.", platform log event number ". $se_vars->{"KernelID"}); push(@lines, "Run \"/usr/bin/servicelog --query=\"id=". $se_vars->{"ServicelogID"}."\" \" for full details."); # Print to stdout, if appropriate if (!$flag_quiet) { foreach $line (@lines) { print("$line\n"); } } # Write to a log file, if appropriate if ($flag_logfile) { if (! open(LOGFILE, ">> $flag_logfile")) { print("Could not open $flag_logfile"); } else { foreach $line (@lines) { print(LOGFILE "ppc64-diag: $line\n"); } close(LOGFILE); } } # Write to syslog, if appropriate if ($flag_syslog) { if (!open(LOGPROG, "| logger -p local4.warning -t ppc64-diag")) { print("Could not run logger to notify syslog\n"); } else { foreach $line (@lines) { print(LOGPROG "$line\n"); } close(LOGPROG); } } if ($se_vars->{"Serviceable"} eq "0") { exit 0; } push(@lines, "This message is logged to ".$flag_logfile."."); # Send out e-mail notifications, if appropriate if ($flag_email) { $hostname = `hostname`; chomp $hostname; $subject = "$hostname: serviceable platform event logged"; if (open(MAILLIST, "< /etc/ppc64-diag/mail_list")) { while () { chomp; $pos = index($_, "#"); if ($pos == 0) { # the line starts with a hash next; } elsif ($pos > 0) { # trim off everything past the hash $mailid = substr($_, 0, $pos); } elsif ($pos == -1) { $mailid = $_; } # trim leadng and tailing whitespace $mailid =~ s/^\s+//; $mailid =~ s/\s+$//; if ($mailid ne "") { push(@maillist, $mailid); } } } if (scalar(@maillist) == 0) { # mail to the root group unless results were sent to an HMC if (!$hmc) { $rootgroup = `grep ^root: /etc/group | cut -f4 -d:`; chomp($rootgroup); # $rootgroup is a comma-separated list if ($rootgroup ne "") { @maillist = split /,/, $rootgroup; } } } push(@maillist, "root"); while ($maillist[0] eq "") { shift @maillist; } if (scalar(@maillist) > 0) { if (!open(MAILPROG, "| mail -n -s \"$subject\" ". join(",", @maillist))) { print("Could not run mail to deliver notifications\n"); } else { foreach $line (@lines) { print(MAILPROG "$line\n"); } close(MAILPROG); } } } ppc64-diag-2.6.4/diags/0000755000000000000000000000000012313010662013140 5ustar rootrootppc64-diag-2.6.4/diags/bluehawk.h0000644000000000000000000002526012313010662015120 0ustar rootroot/* Copyright (C) 2012 IBM Corporation */ #ifndef __BLUEHAWK_H__ #define __BLUEHAWK_H__ #include #define NR_DISKS_PER_BLUEHAWK 30 enum element_status_code { ES_UNSUPPORTED, /* invalid status */ ES_OK, ES_CRITICAL, /* usually valid */ ES_NONCRITICAL, /* usually valid */ ES_UNRECOVERABLE, /* invalid status */ ES_NOT_INSTALLED, ES_UNKNOWN, /* usually invalid */ ES_NOT_AVAILABLE, /* usually invalid */ ES_NO_ACCESS_ALLOWED, /* invalid status */ ES_EOL /* end of list of status codes */ }; struct element_status_byte0 { uint8_t reserved1:1; /* = 0 */ uint8_t prdfail:1; /* not implemented */ uint8_t disabled:1; /* not implemented */ uint8_t swap:1; uint8_t status:4; /* 0/1 or element_status_code */ }; struct overall_disk_status_byte1 { uint8_t device_environment:3; /* = 010b */ uint8_t slot_address:5; }; struct disk_element_status_byte1 { uint8_t hot_swap:1; /* = 1 */ uint8_t slot_address:7; }; struct disk_status { /* from 4.3.5 and 4.3.6 */ struct element_status_byte0 byte0; /* Overall status = worst status of all disks. */ union { struct overall_disk_status_byte1 overall_status; struct disk_element_status_byte1 element_status; } byte1; uint8_t app_client_bypassed_a:1; uint8_t do_not_remove:1; uint8_t enclosure_bypassed_a:1; uint8_t enclosure_bypassed_b:1; uint8_t ready_to_insert:1; uint8_t rmv:1; uint8_t ident:1; uint8_t report:1; uint8_t app_client_bypassed_b:1; uint8_t fault_sensed:1; uint8_t fail:1; /* AKA fault_reqstd */ uint8_t device_off:1; uint8_t bypassed_a:1; uint8_t bypassed_b:1; uint8_t device_bypassed_a:1; uint8_t device_bypassed_b:1; }; struct enclosure_status { /* from 4.3.7 */ struct element_status_byte0 byte0; /* status is always 1. */ uint8_t ident:1; uint8_t reserved2:7; uint8_t reserved3:6; uint8_t fail:1; /* AKA failure_indication */ uint8_t warning_indication:1; uint8_t reserved4:6; uint8_t failure_requested:1; uint8_t warning_requested:1; }; struct esm_status { /* from 4.3.8, 4.3.9 */ struct element_status_byte0 byte0; /* Overall status is TBD. */ uint8_t ident:1; uint8_t fail:1; uint8_t reserved2:6; uint8_t reserved3:7; uint8_t report:1; uint8_t hot_swap:1; uint8_t reserved4:7; }; struct temperature_sensor_status { /* from 4.3.10, 4.3.11 */ struct element_status_byte0 byte0; /* Overall status is TBD. */ uint8_t ident:1; uint8_t reserved2:7; uint8_t temperature; uint8_t reserved3:4; uint8_t ot_failure:1; uint8_t ot_warning:1; uint8_t ut_failure:1; uint8_t ut_warning:1; }; struct temperature_sensor_set { struct temperature_sensor_status croc; struct temperature_sensor_status ppc; struct temperature_sensor_status expander; struct temperature_sensor_status ambient[2]; struct temperature_sensor_status power_supply[2]; }; struct fan_status { /* from 4.3.12, 4.3.13 */ struct element_status_byte0 byte0; /* Overall status is 0 or 1??? */ uint16_t ident:1; uint16_t reserved2:4; uint16_t fan_speed:11; uint8_t hot_swap:1; uint8_t fail:1; uint8_t rqsted_on:1; uint8_t off:1; uint8_t reserved3:1; uint8_t speed_code:3; } __attribute__((packed)); struct fan_set { struct fan_status power_supply; struct fan_status fan_element[4]; }; struct power_supply_status { /* from 4.3.14, 4.3.15 */ struct element_status_byte0 byte0; /* Overall status is TBD. */ uint8_t ident:1; uint8_t reserved2:7; uint8_t reserved3:4; uint8_t dc_over_voltage:1; uint8_t dc_under_voltage:1; uint8_t dc_over_current:1; uint8_t reserved4:1; uint8_t hot_swap:1; uint8_t fail:1; uint8_t rqsted_on:1; uint8_t off:1; uint8_t ovrtmp_fail:1; uint8_t temp_warn:1; uint8_t ac_fail:1; uint8_t dc_fail:1; }; struct voltage_sensor_status { /* from 4.3.16, 4.3.17 */ struct element_status_byte0 byte0; /* Overall status is TBD. */ uint8_t ident:1; uint8_t reserved2:3; uint8_t warn_over:1; uint8_t warn_under:1; uint8_t crit_over:1; uint8_t crit_under:1; int16_t voltage; }; struct voltage_sensor_set { struct voltage_sensor_status sensor_12V; struct voltage_sensor_status sensor_3_3VA; }; struct sas_connector_status { /* from 4.3.18, 4.3.19 */ struct element_status_byte0 byte0; uint8_t ident:1; uint8_t connector_type:7; /* = 5 */ uint8_t connector_physical_link; /* = 0xff */ uint8_t reserved2:1; uint8_t fail:1; uint8_t reserved3:6; }; struct scc_controller_overall_status { /* from 4.3.20 */ struct element_status_byte0 byte0; uint8_t ident:1; uint8_t fail:1; uint8_t reserved2:6; uint8_t reserved3; uint8_t reserved4; }; struct scc_controller_element_status { /* from 4.3.21 */ struct element_status_byte0 byte0; uint8_t ident:1; uint8_t fail:1; uint8_t reserved2:6; uint8_t reserved3:7; uint8_t report:1; uint8_t reserved4; }; struct midplane_status { /* from 4.3.22, 4.3.23 */ struct element_status_byte0 byte0; uint8_t ident:1; uint8_t fail:1; uint8_t reserved2:6; uint8_t reserved3; uint8_t reserved4; }; /* * Note: This data structure matches the layout described in v0.7 of * the Bluehawk SAS Expander Specification, Table 4.16, ... Status * Diagnostic Page, and the element counts in Table 4.15, Configuration * Diagnostic Page. */ struct bluehawk_diag_page2 { uint8_t page_code; uint8_t reserved1:3; uint8_t invop:1; uint8_t info:1; uint8_t non_crit:1; uint8_t crit:1; uint8_t unrecov:1; uint16_t page_length; uint32_t generation_code; struct disk_status overall_disk_status; struct disk_status disk_status[NR_DISKS_PER_BLUEHAWK]; struct enclosure_status overall_enclosure_status; struct enclosure_status enclosure_element_status; struct esm_status overall_esm_status; struct esm_status esm_status[2]; /* L and R, AKA A and B */ struct temperature_sensor_status overall_temp_sensor_status; struct temperature_sensor_set temp_sensor_sets[2]; /* L and R */ struct fan_status overall_fan_status; struct fan_set fan_sets[2]; /* L and R */ struct power_supply_status overall_power_status; struct power_supply_status ps_status[2]; /* PS0=L, PS1=R */ struct voltage_sensor_status overall_voltage_status; struct voltage_sensor_set voltage_sensor_sets[2]; /* PS0, PS1 */ struct sas_connector_status overall_sas_connector_status; struct sas_connector_status sas_connector_status[4]; /* 1L,2L,1R,2R*/ struct scc_controller_overall_status overall_scc_controller_status; struct scc_controller_element_status scc_controller_status[2]; /* L, R*/ struct midplane_status overall_midplane_status; struct midplane_status midplane_element_status; } __attribute__((packed)); /* Diagnostic page 2 layout for SEND DIAGNOSTIC command */ struct common_ctrl { uint8_t select:1; uint8_t prdfail:1; uint8_t disable:1; uint8_t rst_swap:1; uint8_t reserved1:4; }; struct disk_ctrl { struct common_ctrl common_ctrl; uint8_t reserved2; uint8_t reserved3:1; uint8_t do_not_remove:1; uint8_t reserved4:1; uint8_t rqst_missing:1; uint8_t rqst_insert:1; uint8_t rqst_remove:1; uint8_t rqst_ident:1; uint8_t reserved5:1; uint8_t reserved6:2; uint8_t rqst_fail:1; /* AKA rqst_fault */ uint8_t device_off:1; uint8_t enable_byp_a:1; uint8_t enable_byp_b:1; uint8_t reserved7:2; }; struct enclosure_ctrl { struct common_ctrl common_ctrl; uint8_t rqst_ident:1; uint8_t reserved2:7; uint8_t reserved3; uint8_t reserved4:6; uint8_t rqst_fail:1; uint8_t rqst_warn:1; }; struct esm_ctrl { struct common_ctrl common_ctrl; uint8_t rqst_ident:1; uint8_t rqst_fail:1; uint8_t reserved2:6; uint8_t reserved3:7; uint8_t select_element:1; uint8_t reserved4; }; struct fan_ctrl { struct common_ctrl common_ctrl; uint8_t rqst_ident:1; uint8_t reserved2:7; uint8_t reserved3; uint8_t reserved4:1; uint8_t rqst_fail:1; uint8_t rqst_on:1; uint8_t reserved5:2; uint8_t requested_speed_code:3; }; struct fan_ctrl_set { struct fan_ctrl power_supply; struct fan_ctrl fan_element[4]; }; struct power_supply_ctrl { struct common_ctrl common_ctrl; uint8_t rqst_ident:1; uint8_t reserved2:7; uint8_t reserved3; uint8_t reserved4:1; uint8_t rqst_fail:1; uint8_t reserved5:6; }; /* Same format as power_supply_ctrl */ struct sas_connector_ctrl { struct common_ctrl common_ctrl; uint8_t rqst_ident:1; uint8_t reserved2:7; uint8_t reserved3; uint8_t reserved4:1; uint8_t rqst_fail:1; uint8_t reserved5:6; }; struct scc_controller_ctrl { struct common_ctrl common_ctrl; uint8_t rqst_ident:1; uint8_t rqst_fail:1; uint8_t reserved2:6; uint16_t reserved3; }; /* Same format as scc_controller_ctrl */ struct midplane_ctrl { struct common_ctrl common_ctrl; uint8_t rqst_ident:1; uint8_t rqst_fail:1; uint8_t reserved2:6; uint16_t reserved3; }; struct bluehawk_ctrl_page2 { uint8_t page_code; uint8_t reserved1:4; uint8_t info:1; uint8_t non_crit:1; uint8_t crit:1; uint8_t unrecov:1; uint16_t page_length; uint32_t generation_code; struct disk_ctrl overall_disk_ctrl; struct disk_ctrl disk_ctrl[NR_DISKS_PER_BLUEHAWK]; struct enclosure_ctrl overall_enclosure_ctrl; struct enclosure_ctrl enclosure_element_ctrl; struct esm_ctrl overall_esm_ctrl; struct esm_ctrl esm_ctrl[2]; /* L and R, AKA A and B */ unsigned char temperature_sensor_ctrl[60]; /* per spec 56, all zeroes */ struct fan_ctrl overall_fan_ctrl; struct fan_ctrl_set fan_sets[2]; /* L and R */ struct power_supply_ctrl overall_power_ctrl; struct power_supply_ctrl ps_ctrl[2]; /* PS0=L, PS1=R */ unsigned char voltage_sensor_ctrl[20]; /* all zeroes */ struct sas_connector_ctrl overall_sas_connector_ctrl; struct sas_connector_ctrl sas_connector_ctrl[4]; /* 1L,1R,2L,2R */ struct scc_controller_ctrl overall_scc_controller_ctrl; struct scc_controller_ctrl scc_controller_ctrl[2]; /* L, R */ struct midplane_ctrl overall_midplane_ctrl; struct midplane_ctrl midplane_element_ctrl; } __attribute__((packed)); /* Obtains VPD for esm (page 1), midplane (page 5) via INQUIRY command */ struct vpd_page { uint8_t peripheral_qualifier; uint8_t page_code; uint8_t reserved1; uint8_t page_length; uint8_t ascii_length; char fn[3]; /* "FN " */ char fru_number[8]; uint8_t reserved2; char sn[3]; /* "SN " */ char serial_number[12]; uint8_t reserved3; char cc[3]; /* "CC " */ char model_number[4]; /* CCIN */ uint8_t reserved4; char fl[3]; /* "FL " */ char fru_label[5]; uint8_t reserved5; }; struct power_supply_descriptor { uint16_t descriptor_length; char fn[3]; /* "FN " */ char fru_number[8]; char sn[3]; /* "SN " */ char serial_number[12]; char vendor[12]; char date_of_manufacture[12]; char fl[3]; /* "FL " */ char fru_label[5]; } __attribute__((packed)); /* Obtains VPD for power supplies (page 7) via RECEIVE_DIAGNOSTIC command */ struct element_descriptor_page { char ignored1[1074]; struct power_supply_descriptor ps0_vpd; uint16_t reserved; struct power_supply_descriptor ps1_vpd; char ignored2[137]; } __attribute__((packed)); #endif /* __BLUEHAWK_H__ */ ppc64-diag-2.6.4/diags/encl_led.c0000644000000000000000000001341512313010662015055 0ustar rootroot/* * Copyright (C) 2012 IBM Corporation */ #include #include #include #include #include #include #include #include #include #include "encl_util.h" #include "encl_led.h" #include "platform.c" static struct { char *mtm; int (*list_leds)(const char *, const char *, int); int (*set_led)(const char *, const char *, int, int, int); } encl_list[] = { {"5888", bluehawk_list_leds, bluehawk_set_led}, /* Bluehawk enclosure */ {"EDR1", bluehawk_list_leds, bluehawk_set_led}, /* Bluehawk enclosure */ {NULL, NULL} }; const char *progname; static struct option long_options[] = { { "fault", required_argument, NULL, 'f' }, { "help", no_argument, NULL, 'h' }, { "ident", required_argument, NULL, 'i' }, { "list", no_argument, NULL, 'l' }, { "verbose", no_argument, NULL, 'v' }, { "version", no_argument, NULL, 'V' }, { 0, 0, 0, 0} }; static void usage(void) { fprintf(stderr, "Usage: %s { -l | settings } [-v] enclosure [ component ]\n" "\t-l | --list : report settings\n" "\t-v | --verbose : verbose report\n" "\t-V | --version : print the version of the command " "and exit\n" "\t-h | --help : print this usage message and exit\n" "\tsettings: [ -f on|off ] [ -i on|off ]\n" "\t -f | --fault: turn component's fault LED element on/off.\n" "\t -i | --ident: turn component's ident LED element on/off.\n" "\tenclosure: sgN device name or location code of enclosure\n" "\tcomponent: component's location sub-code -- e.g., P1-E2\n", progname); } #define DEVSG_MAXLEN 32 int open_sg_device(const char *encl) { char dev_sg[DEVSG_MAXLEN]; int fd; snprintf(dev_sg, DEVSG_MAXLEN, "/dev/%s", encl); fd = open(dev_sg, O_RDWR); if (fd < 0) perror(dev_sg); return fd; } /** * Get SCSI generic device name for the given location code. * * Returns : * 0 on success / -1 on failure */ static int loc_code_device(const char *loccode, char *sg, int sg_size) { int rc, found = 0; char buf[128], cmd[128]; char *dev; FILE *fp; snprintf(cmd, 128, "lsvpd -l %s", loccode); fp = popen(cmd, "r"); if (fp == NULL) { fprintf(stderr, "Could not obtain the sg device details." " Ensure that lsvpd is installed.\n"); return -1; } while (fgets_nonl(buf, 128, fp) != NULL) { if (found) /* read until pipe becomes empty*/ continue; /* Handle both old and new formats. */ if (strstr(buf, "/dev/sg") || strstr(buf, "*AX sg")) { dev = strstr(buf, "sg"); /* validate sg device */ rc = valid_enclosure_device(dev); if (rc) continue; strncpy(sg, dev, sg_size); found = 1; } } pclose(fp); if (found) return 0; return -1; } /** * Get SCSI generic device name * * @encl sg device name or location code * @sg sg dev name * @sg_size sizeof(sg) * * Returns : * 0 on success / -1 on failure */ static int enclosure_dev_name(const char *encl, char *sg, int sg_size) { if (!strncmp(encl, "sg", 2) && strlen(encl) < DEVSG_MAXLEN - 6) { strncpy(sg, encl, sg_size); return valid_enclosure_device(sg); } return loc_code_device(encl, sg, sg_size); } static void too_many_settings(void) { fprintf(stderr, "%s: cannot set fault or ident multiple times.\n", progname); exit(1); } static int parse_on_off(const char *on_off) { if (!strcmp(on_off, "on")) return LED_ON; else if (!strcmp(on_off, "off")) return LED_OFF; fprintf(stderr, "%s: expected 'on' or 'off'; saw '%s'.\n", progname, on_off); exit(1); } int main(int argc, char **argv) { int rc, option_index, i; int platform = 0; int list_opt = 0, verbose = 0, found = 0; int fault_setting = LED_SAME, ident_setting = LED_SAME; const char *enclosure = NULL, *component = NULL; char sg[128]; struct dev_vpd vpd; progname = argv[0]; platform = get_platform(); if (platform != PLATFORM_PSERIES_LPAR) { fprintf(stderr, "%s is not supported on the %s platform\n", argv[0], __power_platform_name(platform)); exit(1); } for (;;) { option_index = 0; rc = getopt_long(argc, argv, "f:hi:lvV", long_options, &option_index); if (rc == -1) break; switch (rc) { case 'f': if (fault_setting != LED_SAME) too_many_settings(); fault_setting = parse_on_off(optarg); break; case 'h': usage(); exit(0); case 'i': if (ident_setting != LED_SAME) too_many_settings(); ident_setting = parse_on_off(optarg); break; case 'l': list_opt = 1; break; case 'v': verbose = 1; break; case 'V': printf("%s %s\n", argv[0], VERSION); exit(0); case '?': default: usage(); exit(1); } } if (optind < argc) enclosure = argv[optind++]; else { usage(); exit(1); } if (optind < argc) component = argv[optind++]; if (optind < argc) { usage(); exit(1); } if (!list_opt && fault_setting == LED_SAME && ident_setting == LED_SAME) { usage(); exit(1); } /* Get sg dev name for the given sg/location code */ memset(sg, 0, sizeof(sg)); if (enclosure_dev_name(enclosure, sg, sizeof(sg)) != 0) exit(1); /* Get enclosure type as "Machine Type" from VPD. */ memset(&vpd, 0, sizeof(vpd)); if (read_vpd_from_lscfg(&vpd, sg) != 0) exit(1); for (i = 0; encl_list[i].mtm; i++) if (!strcmp(vpd.mtm, encl_list[i].mtm)) { found = 1; break; } if (!found) { fprintf(stderr, "No indicator support for device type/model :" " %s\n", vpd.mtm); exit(0); } if (list_opt) { if (fault_setting != LED_SAME || ident_setting != LED_SAME) { usage(); exit(1); } if (encl_list[i].list_leds(sg, component, verbose) != 0) exit(2); } else { if (geteuid() != 0) { fprintf(stderr, "%s: Turning LEDs on/off requires " "superuser privileges.\n", progname); exit(1); } if (encl_list[i].set_led(sg, component, fault_setting, ident_setting, verbose) != 0) exit(2); } exit(0); } ppc64-diag-2.6.4/diags/encl_util.c0000644000000000000000000001442612313010662015271 0ustar rootroot/* * Copyright (C) 2012 IBM Corporation */ #include #include #include #include #include #include #include #include #include #include "encl_util.h" struct sense_data_t { uint8_t error_code; uint8_t segment_numb; uint8_t sense_key; uint8_t info[4]; uint8_t add_sense_len; uint8_t cmd_spec_info[4]; uint8_t add_sense_code; uint8_t add_sense_code_qual; uint8_t field_rep_unit_code; uint8_t sense_key_spec[3]; uint8_t add_sense_bytes[0]; }; /** * do_ses_cmd * @brief Make the necessary sg ioctl() to do the indicated SES command * * @param fd a file descriptor to the appropriate /dev/sg file * @param cmd the command code -- e.g., SEND_DIAGNOSTIC * @param page_nr the SES page number to be read or written -- 0 for write * @param flags flags for the second byte of the SCSI command buffer * @param cmd_len length in bytes of relevant data in SCSI command buffer * @paran dxfer_direction SG_DXFER_FROM_DEV or SG_DXFER_TO_DEV * @param buf the contents of the page * @param buf_len the length of the previous parameter * @return 0 on success, -EIO on invalid I/O status, or CHECK_CONDITION */ int do_ses_cmd(int fd, uint8_t cmd, uint8_t page_nr, uint8_t flags, uint8_t cmd_len, int dxfer_direction, void *buf, int buf_len) { unsigned char scsi_cmd_buf[16] = { cmd, flags, page_nr, (buf_len >> 8) & 0xff, /* most significant byte */ buf_len & 0xff, /* least significant byte */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; struct sense_data_t sense_data; sg_io_hdr_t hdr; int i, rc; for (i = 0; i < 3; i++) { memset(&hdr, 0, sizeof(hdr)); memset(&sense_data, 0, sizeof(struct sense_data_t)); hdr.interface_id = 'S'; hdr.dxfer_direction = dxfer_direction; hdr.cmd_len = cmd_len; hdr.mx_sb_len = sizeof(sense_data); hdr.iovec_count = 0; /* scatter gather not necessary */ hdr.dxfer_len = buf_len; hdr.dxferp = buf; hdr.cmdp = scsi_cmd_buf; hdr.sbp = (unsigned char *)&sense_data; hdr.timeout = 120 * 1000; /* set timeout to 2 minutes */ hdr.flags = 0; hdr.pack_id = 0; hdr.usr_ptr = 0; rc = ioctl(fd, SG_IO, &hdr); if ((rc == 0) && (hdr.masked_status == CHECK_CONDITION)) rc = CHECK_CONDITION; else if ((rc == 0) && (hdr.host_status || hdr.driver_status)) rc = -EIO; if (rc == 0 || hdr.host_status == 1) break; } return rc; } int get_diagnostic_page(int fd, uint8_t cmd, uint8_t page_nr, void *buf, int buf_len) { return do_ses_cmd(fd, cmd, page_nr, 0x1, 16, SG_DXFER_FROM_DEV, buf, buf_len); } /* Read a line and strip the newline. */ char * fgets_nonl(char *buf, int size, FILE *s) { char *nl; if (!fgets(buf, size, s)) return NULL; nl = strchr(buf, '\n'); if (nl == NULL) return NULL; *nl = '\0'; return buf; } /* * Find at least 2 consecutive periods after pos, skip to the end of that * set of periods, and return a pointer to the next character. * * For example, if pos points at the 'S' in * Serial Number.............24099050 * return a pointer to the '2'. * * Return NULL if there aren't 2 consecutive periods. */ static char * skip_dots(const char *pos) { pos = strstr(pos, ".."); if (!pos) return NULL; while (*pos == '.') pos++; return (char *) pos; } /* * Some versions of iprconfig/lscfg report the location code of the ESM/ERM * -- e.g., UEDR1.001.G12W34S-P1-C1. For our purposes, we usually don't want * the -P1-C1. (Don't trim location codes for disks and such.) * * TODO: This adjustment is appropriate for Bluehawks. Need to understand * what, if anything, needs to be done for (e.g.) Pearl enclosures. */ void trim_location_code(struct dev_vpd *vpd) { char *hyphen; strcpy(vpd->location, vpd->full_loc); hyphen = strchr(vpd->location, '-'); if (hyphen && (!strcmp(hyphen, "-P1-C1") || !strcmp(hyphen, "-P1-C2"))) *hyphen = '\0'; } /* * Get enclosure type, etc. for sgN device. Caller has nulled out vpd * fields. */ int read_vpd_from_lscfg(struct dev_vpd *vpd, const char *sg) { char buf[128], *pos; FILE *fp; /* use lscfg to find the MTM and location for the specified device */ snprintf(buf, 128, "lscfg -vl %s", sg); fp = popen(buf, "r"); if (fp == NULL) { fprintf(stderr, "Unable to retrieve the MTM or location code. " "Ensure that lsvpd is installed.\n\n"); return -1; } while (fgets_nonl(buf, 128, fp) != NULL) { if ((pos = strstr(buf, "Machine Type")) != NULL) { if (!(pos = skip_dots(pos))) continue; strncpy(vpd->mtm, pos, 128); } else if ((pos = strstr(buf, "Device Specific.(YL)")) != NULL) { /* Old-style label for YL */ if (!(pos = skip_dots(pos))) continue; strncpy(vpd->full_loc, pos, 128); } else if ((pos = strstr(buf, "Location Code")) != NULL) { /* Newer label for YL */ if (!(pos = skip_dots(pos))) continue; strncpy(vpd->full_loc, pos, 128); } else if ((pos = strstr(buf, "Serial Number")) != NULL) { if (!(pos = skip_dots(pos))) continue; strncpy(vpd->sn, pos, 128); } else if ((pos = strstr(buf, "..FN ")) != NULL) { pos += 5; while (*pos == ' ') pos++; strncpy(vpd->fru, pos, 128); } } trim_location_code(vpd); pclose(fp); return 0; } /* * Validate sg device. * * Note: * /sys/class/enclosure//device/scsi_generic/ dir * will have the 'scsi' generic name of the device. * * Returns: 0 on valid enclosure device, -1 on invalid enclosure device. */ int valid_enclosure_device(const char *sg) { struct dirent *edirent, *sdirent; DIR *edir, *sdir; char path[128]; edir = opendir(SCSI_SES_PATH); if (!edir) { fprintf(stderr, "System does not have SCSI enclsoure(s).\n"); return -1; } /* loop over all enclosures */ while ((edirent = readdir(edir)) != NULL) { if (!strcmp(edirent->d_name, ".") || !strcmp(edirent->d_name, "..")) continue; snprintf(path, 128, "%s/%s/device/scsi_generic", SCSI_SES_PATH, edirent->d_name); sdir = opendir(path); if (!sdir) continue; while ((sdirent = readdir(sdir)) != NULL) { if (!strcmp(sdirent->d_name, ".") || !strcmp(sdirent->d_name, "..")) continue; /* found sg device */ if (!strcmp(sdirent->d_name, sg)) goto out; } closedir(sdir); } closedir(edir); fprintf(stderr, "%s is not a valid enclosure device\n", sg); return -1; out: closedir(sdir); closedir(edir); return 0; } ppc64-diag-2.6.4/diags/diag_encl.h0000644000000000000000000000133412313010662015217 0ustar rootroot/* Copyright (C) 2009, 2012 IBM Corporation */ #ifndef _DIAG_ENCL_H #define _DIAG_ENCL_H #include struct cmd_opts { int cmp_prev; /* -c */ int leds; /* -l */ int serv_event; /* -s */ int verbose; /* -v */ char *fake_path; /* -f */ char *prev_path; /* for -c */ }; extern struct cmd_opts cmd_opts; int print_raw_data(FILE *, char *, int); void add_callout(struct sl_callout **, char, uint32_t, char *, char *, char *, char *, char *); uint32_t servevent(char *, int, char *, struct dev_vpd *, struct sl_callout *); int get_diagnostic_page(int, uint8_t, uint8_t, void *, int); int diag_7031_D24_T24(int, struct dev_vpd *); int diag_bluehawk(int, struct dev_vpd *); #endif /* _DIAG_ENCL_H */ ppc64-diag-2.6.4/diags/bluehawk.c0000644000000000000000000006506612313010662015123 0ustar rootroot/* Copyright (C) 2012 IBM Corporation */ #include #include #include #include #include #include #include #include "encl_util.h" #include "diag_encl.h" #include "bluehawk.h" /* SRN Format : * for SAS : 2667-xxx */ /* SAS SRN */ #define SAS_SRN 0x2667 /* SAS SES Reported Fail Indicator */ #define CRIT_PS 0x125 #define CRIT_FAN 0x135 #define CRIT_ESM 0x155 #define CRIT_EN 0x175 #define DEVICE_CONFIG_ERROR 0x201 #define ENCLOSURE_OPEN_FAILURE 0x202 #define ENQUIRY_DATA_FAIL 0x203 #define MEDIA_BAY 0x210 #define VOLTAGE_THRESHOLD 0x239 #define PS_TEMP_THRESHOLD 0x145 #define TEMP_THRESHOLD 0x246 /* Build SRN */ #define build_srn(srn, element) \ sprintf(srn, "%03X-%03X", SAS_SRN, element) static struct bluehawk_diag_page2 dp; static struct bluehawk_diag_page2 prev_dp; /* for -c */ static struct bluehawk_ctrl_page2 ctrl_page; /* for -l */ static int poked_leds; static int have_prev_dp; static int read_page2_from_file(struct bluehawk_diag_page2 *pg, const char *path, int complain_if_missing) { FILE *f; f = fopen(path, "r"); if (!f) { if (complain_if_missing || errno != ENOENT) perror(path); return -1; } if (fread(pg, sizeof(*pg), 1, f) != 1) { perror(path); fclose(f); return -2; } fclose(f); return 0; } static int write_page2_to_file(const struct bluehawk_diag_page2 *pg, const char *path) { FILE *f; f = fopen(path, "w"); if (!f) { perror(path); return -1; } if (fwrite(pg, sizeof(*pg), 1, f) != 1) { perror(path); fclose(f); return -2; } fclose(f); return 0; } #define CHK_IDENT_LED(s) if ((s)->ident) printf(" | IDENT_LED") #define CHK_FAULT_LED(s) if ((s)->fail) printf(" | FAULT_LED") static int status_is_valid(enum element_status_code sc, enum element_status_code valid_codes[]) { enum element_status_code *v; for (v = valid_codes; *v < ES_EOL; v++) if (sc == *v) return 1; return 0; } static const char * status_string(enum element_status_code sc, enum element_status_code valid_codes[]) { static char invalid_msg[40]; /* So we're not reentrant. */ if (!status_is_valid(sc, valid_codes)) { sprintf(invalid_msg, "(UNEXPECTED_STATUS_CODE=%u)", sc); return invalid_msg; } switch (sc) { default: case ES_UNSUPPORTED: return "UNSUPPORTED"; case ES_OK: return "ok"; case ES_CRITICAL: return "CRITICAL_FAULT"; case ES_NONCRITICAL: return "NON_CRITICAL_FAULT"; case ES_UNRECOVERABLE: return "UNRECOVERABLE_FAULT"; case ES_NOT_INSTALLED: return "(empty)"; case ES_UNKNOWN: return "UNKNOWN"; case ES_NOT_AVAILABLE: return "NOT_AVAILABLE"; case ES_NO_ACCESS_ALLOWED: return "NO_ACCESS_ALLOWED"; } /*NOTREACHED*/ } static void print_drive_status(struct disk_status *s) { enum element_status_code sc = (enum element_status_code) s->byte0.status; static enum element_status_code valid_codes[] = { ES_OK, ES_CRITICAL, ES_NONCRITICAL, ES_NOT_INSTALLED, ES_EOL }; printf("%s", status_string(sc, valid_codes)); if (s->ready_to_insert) printf(" | INSERT"); if (s->rmv) printf(" | REMOVE"); if (s->app_client_bypassed_a) printf(" | APP_CLIENT_BYPASSED_A"); if (s->app_client_bypassed_b) printf(" | APP_CLIENT_BYPASSED_B"); if (s->bypassed_a) printf(" | BYPASSED_A"); if (s->bypassed_b) printf(" | BYPASSED_B"); CHK_IDENT_LED(s); CHK_FAULT_LED(s); printf("\n"); } static void print_power_supply_status(struct power_supply_status *s) { enum element_status_code sc = (enum element_status_code) s->byte0.status; static enum element_status_code valid_codes[] = { ES_OK, ES_CRITICAL, ES_NONCRITICAL, ES_NOT_INSTALLED, ES_EOL }; printf("%s", status_string(sc, valid_codes)); if (s->dc_fail) printf(" | DC_FAIL"); if (s->dc_over_voltage) printf(" | DC_OVER_VOLTAGE"); if (s->dc_under_voltage) printf(" | DC_UNDER_VOLTAGE"); if (s->dc_over_current) printf(" | DC_OVER_CURRENT"); if (s->ac_fail) printf(" | AC_FAIL"); CHK_IDENT_LED(s); CHK_FAULT_LED(s); printf("\n"); } static void print_voltage_sensor_status(struct voltage_sensor_status *s) { enum element_status_code sc = (enum element_status_code) s->byte0.status; static enum element_status_code valid_codes[] = { ES_OK, ES_CRITICAL, ES_NONCRITICAL, ES_NOT_INSTALLED, ES_UNKNOWN, ES_EOL }; printf("%s", status_string(sc, valid_codes)); if (s->warn_over) printf(" | NON_CRITICAL_OVER_VOLTAGE"); if (s->warn_under) printf(" | NON_CRITICAL_UNDER_VOLTAGE"); if (s->crit_over) printf(" | CRITICAL_OVER_VOLTAGE"); if (s->crit_under) printf(" | CRITICAL_UNDER_VOLTAGE"); if (cmd_opts.verbose) /* between +327.67 to -327.68 */ printf(" | VOLTAGE = %.2f volts", s->voltage / 100.0); printf("\n"); } static void print_fan_status(struct fan_status *s) { const char *speed[] = { "Fan at lowest speed", "Fan at 1-16% of highest speed", "Fan at 17-33% of highest speed", "Fan at 34-49% of highest speed", "Fan at 50-66% of highest speed", "Fan at 67-83% of highest speed", "Fan at 84-99% of highest speed", "Fan at highest speed" }; enum element_status_code sc = (enum element_status_code) s->byte0.status; static enum element_status_code valid_codes[] = { ES_OK, ES_CRITICAL, ES_NONCRITICAL, ES_NOT_INSTALLED, ES_UNKNOWN, ES_EOL }; printf("%s", status_string(sc, valid_codes)); CHK_IDENT_LED(s); CHK_FAULT_LED(s); if (cmd_opts.verbose) printf(" | %s", speed[s->speed_code]); printf("\n"); } static void print_temp_sensor_status(struct temperature_sensor_status *s) { enum element_status_code sc = (enum element_status_code) s->byte0.status; static enum element_status_code valid_codes[] = { ES_OK, ES_CRITICAL, ES_NONCRITICAL, ES_NOT_INSTALLED, ES_UNKNOWN, ES_EOL }; printf("%s", status_string(sc, valid_codes)); if (s->ot_failure) printf(" | OVER_TEMPERATURE_FAILURE"); if (s->ot_warning) printf(" | OVER_TEMPERATURE_WARNING"); if (cmd_opts.verbose) /* between -19 and +235 degrees Celsius */ printf(" | TEMPERATURE = %dC", s->temperature - 20); printf("\n"); } static void print_enclosure_status(struct enclosure_status *s) { enum element_status_code sc = (enum element_status_code) s->byte0.status; /* Note: Deviation from spec V0.7 * Spec author says below are valid state */ static enum element_status_code valid_codes[] = { ES_OK, ES_CRITICAL, ES_NONCRITICAL, ES_EOL }; printf("%s", status_string(sc, valid_codes)); if (s->failure_requested) printf(" | FAILURE_REQUESTED"); CHK_IDENT_LED(s); CHK_FAULT_LED(s); printf("\n"); } static void print_esm_status(struct esm_status *s) { enum element_status_code sc = (enum element_status_code) s->byte0.status; static enum element_status_code valid_codes[] = { ES_OK, ES_CRITICAL, ES_NOT_INSTALLED, ES_EOL }; printf("%s", status_string(sc, valid_codes)); CHK_IDENT_LED(s); CHK_FAULT_LED(s); printf("\n"); } static void print_sas_connector_status(struct sas_connector_status *s) { enum element_status_code sc = (enum element_status_code) s->byte0.status; static enum element_status_code valid_codes[] = { ES_OK, ES_NONCRITICAL, ES_NOT_INSTALLED, ES_EOL }; printf("%s", status_string(sc, valid_codes)); CHK_IDENT_LED(s); CHK_FAULT_LED(s); printf("\n"); } static void print_scc_controller_status(struct scc_controller_element_status *s) { enum element_status_code sc = (enum element_status_code) s->byte0.status; static enum element_status_code valid_codes[] = { ES_OK, ES_CRITICAL, ES_NOT_INSTALLED, ES_NOT_AVAILABLE, ES_EOL }; printf("%s", status_string(sc, valid_codes)); if (s->report) printf(" | REPORT"); CHK_IDENT_LED(s); CHK_FAULT_LED(s); printf("\n"); } static void print_midplane_status(struct midplane_status *s) { enum element_status_code sc = (enum element_status_code) s->byte0.status; static enum element_status_code valid_codes[] = { ES_OK, ES_CRITICAL, ES_EOL }; printf("%s", status_string(sc, valid_codes)); CHK_IDENT_LED(s); CHK_FAULT_LED(s); printf("\n"); } /* Helper functions for reporting faults to servicelog start here. */ static char * strzcpy(char *dest, const char *src, size_t n) { memcpy(dest, src, n); dest[n] = '\0'; return dest; } /* * Factor new status into the composite status cur. A missing element * (ES_NOT_INSTALLED) is ignored. A non-critical status is less severe * than critical. Otherwise assume that an increasing value of * element_status_code indicates an increasing severity. Return the more * severe of new and cur. */ enum element_status_code worse_element_status(enum element_status_code cur, enum element_status_code new) { if (new == ES_OK || new == ES_NOT_INSTALLED) return cur; if ((cur == ES_OK || cur == ES_NONCRITICAL) && new > ES_OK) return new; return cur; } /* * Calculate the composite status for the nel elements starting at * address first_element. We exploit the fact that every status element * is 4 bytes and starts with an element_status_byte0 struct. */ enum element_status_code composite_status(const void *first_element, int nel) { int i; const char *el = (const char *)first_element; enum element_status_code s = ES_OK; const struct element_status_byte0 *new_byte0; for (i = 0; i < nel; i++, el += 4) { new_byte0 = (const struct element_status_byte0 *) el; s = worse_element_status(s, (enum element_status_code) new_byte0->status); } return s; } static int status_worsened(enum element_status_code old, enum element_status_code new) { return (worse_element_status(old, new) != old); } /* * b is the address of a status byte 0 in dp (i.e., the status page we just * read from the SES). If prev_dp has been populated, compare the old and * new status, and return 1 if the new status is worse, 0 otherwise. If * prev_dp isn't valid, return 1. */ static int element_status_reportable(const struct element_status_byte0 *new) { ptrdiff_t offset; struct element_status_byte0 *old; if (!have_prev_dp) return 1; offset = ((char *) new) - ((char *) &dp); old = (struct element_status_byte0 *) (((char *) &prev_dp) + offset); return status_worsened((enum element_status_code) old->status, (enum element_status_code) new->status); } /* * If the status byte indicates a fault that needs to be reported, return * the appropriate servicelog status and start the description text * accordingly. Else return 0. */ static uint8_t svclog_status(enum element_status_code sc, char *crit) { if (sc == ES_CRITICAL) { strcpy(crit, "Critical"); return SL_SEV_ERROR; } else if (sc == ES_NONCRITICAL) { strcpy(crit, "Non-critical"); return SL_SEV_WARNING; } else return 0; } static uint8_t svclog_element_status(struct element_status_byte0 *b, char *crit) { if (!element_status_reportable(b)) return 0; return svclog_status(b->status, crit); } /* * Like element_status_reportable(), except we return 1 if the status of any * of the nel elements has worsened. */ static int composite_status_reportable(const void *first_element, int nel) { int i; const char *el = (const char *) first_element; if (!have_prev_dp) return 1; for (i = 0; i < nel; i++, el += 4) { if (element_status_reportable( (const struct element_status_byte0 *) el)) return 1; } return 0; } static uint8_t svclog_composite_status(const void *first_element, int nel, char *crit) { if (!composite_status_reportable(first_element, nel)) return 0; return svclog_status(composite_status(first_element, nel), crit); } /* Add a callout with just the location code */ static void add_location_callout(struct sl_callout **callouts, char *location) { add_callout(callouts, 'M', 0, NULL, location, NULL, NULL, NULL); } /* 1 = have VPD for power supplies; -1 = failed to get it. */ static int have_ps_vpd; static struct element_descriptor_page edp; /* for power supply VPD */ /* Create a callout for power supply i (i = 0 or 1). */ static void create_ps_callout(struct sl_callout **callouts, char *location, unsigned int i, int fd) { if (fd < 0) have_ps_vpd = -1; if (!have_ps_vpd) { int result = get_diagnostic_page(fd, RECEIVE_DIAGNOSTIC, 7, &edp, sizeof(edp)); if (result == 0) have_ps_vpd = 1; else have_ps_vpd = -1; } if (have_ps_vpd == 1) { struct power_supply_descriptor *ps_vpd[] = { &edp.ps0_vpd, &edp.ps1_vpd }; char fru_number[8+1]; char serial_number[12+1]; strzcpy(fru_number, ps_vpd[i]->fru_number, 8); strzcpy(serial_number, ps_vpd[i]->serial_number, 12); add_callout(callouts, 'M', 0, NULL, location, fru_number, serial_number, NULL); } else add_location_callout(callouts, location); } static void add_callout_from_vpd_page(struct sl_callout **callouts, char *location, struct vpd_page *vpd) { char fru_number[8+1]; char serial_number[12+1]; char ccin[4+1]; strzcpy(fru_number, vpd->fru_number, 8); strzcpy(serial_number, vpd->serial_number, 12); strzcpy(ccin, vpd->model_number, 4); add_callout(callouts, 'M', 0, NULL, location, fru_number, serial_number, ccin); } /* 1 = have VPD for a warhawk; -1 = failed to get it. */ static int have_wh_vpd; static struct vpd_page whp; /* for warhawk VPD */ /* * The fru_label should be "P1-C1" or "P1-C2" (without the terminating null). * i is 0 or 1. */ static int wh_location_match(int i, const char *fru_label) { return ('0'+i+1 == fru_label[4]); } /* * Create a callout for warhawk i (left=0, right=1). VPD page 1 contains VPD * for only one of the warhawks. If it's the wrong one, just do without the * VPD. * * TODO: Figure out how to get VPD for the other warhawk by inquiring via a * different sg device. */ static void create_wh_callout(struct sl_callout **callouts, char *location, unsigned int i, int fd) { if (fd < 0) have_wh_vpd = -1; if (!have_wh_vpd) { int result = get_diagnostic_page(fd, INQUIRY, 1, &whp, sizeof(whp)); if (result == 0) have_wh_vpd = 1; else have_wh_vpd = -1; } if (have_wh_vpd == 1 && wh_location_match(i, whp.fru_label)) add_callout_from_vpd_page(callouts, location, &whp); else add_location_callout(callouts, location); } /* midplane callout, with VPD from page 5 */ static void create_mp_callout(struct sl_callout **callouts, char *location, int fd) { struct vpd_page mp; int result = -1; if (fd >= 0) result = get_diagnostic_page(fd, INQUIRY, 5, &mp, sizeof(mp)); if (result == 0) add_callout_from_vpd_page(callouts, location, &mp); else add_location_callout(callouts, location); } static int report_faults_to_svclog(struct dev_vpd *vpd, int fd) { char location[128+32], *loc_suffix; char description[512], crit[32]; char srn[16]; unsigned int i; int sev; char run_diag_encl[] = " Run diag_encl for more detailed status," " and refer to the system service documentation for guidance."; char ref_svc_doc[] = " Refer to the system service documentation for guidance."; struct sl_callout *callouts; const char *left_right[] = { "left", "right" }; have_ps_vpd = 0; have_wh_vpd = 0; strcpy(location, vpd->location); loc_suffix = location + strlen(location); if (cmd_opts.cmp_prev) { int rc = read_page2_from_file(&prev_dp, cmd_opts.prev_path, 0); have_prev_dp = (rc == 0); } /* disk drives */ for (i = 0; i < NR_DISKS_PER_BLUEHAWK; i++) { sev = svclog_element_status(&dp.disk_status[i].byte0, crit); if (sev == 0) continue; sprintf(description, "%s fault in RAID enclosure disk %u.%s", crit, i+1, run_diag_encl); sprintf(loc_suffix, "-P1-D%u", i+1); callouts = NULL; /* VPD for disk drives is not available from the SES. */ add_location_callout(&callouts, location); servevent("none", sev, description, vpd, callouts); } /* power supplies */ for (i = 0; i < 2; i++) { sev = svclog_element_status(&dp.ps_status[i].byte0, crit); if (sev == 0) continue; sprintf(description, "%s fault in %s power supply in RAID enclosure.%s", crit, left_right[i], run_diag_encl); sprintf(loc_suffix, "-P1-E%u", i+1); build_srn(srn, CRIT_PS); callouts = NULL; create_ps_callout(&callouts, location, i, fd); servevent(srn, sev, description, vpd, callouts); } /* voltage sensors */ for (i = 0; i < 2; i++) { sev = svclog_composite_status(&dp.voltage_sensor_sets[i], 2, crit); if (sev == 0) continue; sprintf(description, "%s fault associated with %s power supply in RAID" " enclosure: voltage sensor(s) reporting voltage(s)" " out of range.%s", crit, left_right[i], run_diag_encl); sprintf(loc_suffix, "-P1-E%u", i+1); build_srn(srn, VOLTAGE_THRESHOLD); callouts = NULL; create_ps_callout(&callouts, location, i, fd); servevent(srn, sev, description, vpd, callouts); } /* power-supply fans -- lump with power supplies, not fan assemblies */ for (i = 0; i < 2; i++) { sev = svclog_element_status(&dp.fan_sets[i].power_supply.byte0, crit); if (sev == 0) continue; sprintf(description, "%s fault in fan for %s power supply in RAID" " enclosure.%s", crit, left_right[i], run_diag_encl); sprintf(loc_suffix, "-P1-E%u", i+1); build_srn(srn, CRIT_PS); callouts = NULL; create_ps_callout(&callouts, location, i, fd); servevent(srn, sev, description, vpd, callouts); } /* fan assemblies */ for (i = 0; i < 2; i++) { /* 4 fans for each fan assembly */ sev = svclog_composite_status(&dp.fan_sets[i].fan_element, 4, crit); if (sev == 0) continue; sprintf(description, "%s fault in %s fan assembly in RAID enclosure.%s", crit, left_right[i], run_diag_encl); sprintf(loc_suffix, "-P1-C%u-A1", i+1); build_srn(srn, CRIT_FAN); callouts = NULL; /* VPD for fan assemblies is not available from the SES. */ add_location_callout(&callouts, location); servevent(srn, sev, description, vpd, callouts); } /* power-supply temperature sensors -- lump with power supplies */ for (i = 0; i < 2; i++) { /* 2 sensors for each power supply */ sev = svclog_composite_status( &dp.temp_sensor_sets[i].power_supply, 2, crit); if (sev == 0) continue; sprintf(description, "%s fault associated with %s power supply in RAID" " enclosure: temperature sensor(s) reporting" " temperature(s) out of range.%s", crit, left_right[i], run_diag_encl); sprintf(loc_suffix, "-P1-E%u", i+1); build_srn(srn, PS_TEMP_THRESHOLD); callouts = NULL; create_ps_callout(&callouts, location, i, fd); servevent(srn, sev, description, vpd, callouts); } /* temp sensors, except for those associated with power supplies */ for (i = 0; i < 2; i++) { /* 5 sensors: croc, ppc, expander, 2*ambient */ sev = svclog_composite_status(&dp.temp_sensor_sets[i], 5, crit); if (sev == 0) continue; sprintf(description, "%s fault associated with %s side of RAID enclosure:" " temperature sensor(s) reporting temperature(s) out" " of range.%s", crit, left_right[i], run_diag_encl); /* Not the power supply, so assume the warhawk. */ sprintf(loc_suffix, "-P1-C%u", i+1); build_srn(srn, TEMP_THRESHOLD); callouts = NULL; create_wh_callout(&callouts, location, i, fd); servevent(srn, sev, description, vpd, callouts); } /* ERM/ESM electronics */ for (i = 0; i < 2; i++) { sev = svclog_element_status(&dp.esm_status[i].byte0, crit); if (sev == 0) continue; sprintf(description, "%s electronics fault in %s Enclosure RAID Module.%s", crit, left_right[i], ref_svc_doc); sprintf(loc_suffix, "-P1-C%u", i+1); build_srn(srn, CRIT_ESM); callouts = NULL; create_wh_callout(&callouts, location, i, fd); servevent(srn, sev, description, vpd, callouts); } /* SAS connectors */ for (i = 0; i < 4; i++) { unsigned int t = i%2 + 1, lr = i/2; sev = svclog_element_status(&dp.sas_connector_status[i].byte0, crit); if (sev == 0) continue; sprintf(description, "%s fault in SAS connector T%u of %s RAID Enclosure" " Module.%s", crit, t, left_right[lr], ref_svc_doc); sprintf(loc_suffix, "-P1-C%u-T%u", lr+1, t); callouts = NULL; /* No VPD for SAS connectors in the SES. */ add_location_callout(&callouts, location); servevent("none", sev, description, vpd, callouts); } /* PCIe controllers */ for (i = 0; i < 2; i++) { sev = svclog_element_status(&dp.scc_controller_status[i].byte0, crit); if (sev == 0) continue; sprintf(description, "%s fault in PCIe controller for %s RAID Enclosure " "Module.%s", crit, left_right[i], ref_svc_doc); sprintf(loc_suffix, "-P1-C%u-T3", i+1); callouts = NULL; /* No VPD for PCIe controllers in the SES. */ add_location_callout(&callouts, location); servevent("none", sev, description, vpd, callouts); } /* midplane */ sev = svclog_element_status(&dp.midplane_element_status.byte0, crit); if (sev != 0) { sprintf(description, "%s fault in midplane of RAID enclosure.%s", crit, ref_svc_doc); strcpy(loc_suffix, "-P1"); callouts = NULL; create_mp_callout(&callouts, location, fd); servevent("none", sev, description, vpd, callouts); } return write_page2_to_file(&dp, cmd_opts.prev_path); } /* * If the indicated status element reports a fault, turn on the fault component * of the LED if it's not already on. Keep the identify LED element unchanged. */ #define FAULT_LED(ctrl_element, status_element) \ do { \ enum element_status_code sc = dp.status_element.byte0.status; \ if (!dp.status_element.fail && \ (sc == ES_CRITICAL || sc == ES_NONCRITICAL || \ sc == ES_UNRECOVERABLE)) { \ ctrl_page.ctrl_element.common_ctrl.select = 1; \ ctrl_page.ctrl_element.rqst_fail = 1; \ ctrl_page.ctrl_element.rqst_ident = dp.status_element.ident; \ poked_leds++; \ } \ } while (0) static int turn_on_fault_leds(int fd) { int i; memset(&ctrl_page, 0, sizeof(ctrl_page)); poked_leds = 0; /* disk drives */ for (i = 0; i < NR_DISKS_PER_BLUEHAWK; i++) FAULT_LED(disk_ctrl[i], disk_status[i]); /* power supplies */ for (i = 0; i < 2; i++) FAULT_LED(ps_ctrl[i], ps_status[i]); /* No LEDs for voltage sensors */ /* fan assemblies */ for (i = 0; i < 2; i++) { enum element_status_code sc = composite_status(&dp.fan_sets[i], 5); if (sc != ES_OK && sc != ES_NOT_INSTALLED) FAULT_LED(fan_sets[i].fan_element[0], fan_sets[i].fan_element[0]); } /* No LEDs for temperature sensors */ /* ERM/ESM electronics */ for (i = 0; i < 2; i++) FAULT_LED(esm_ctrl[i], esm_status[i]); /* SAS connectors */ for (i = 0; i < 4; i++) FAULT_LED(sas_connector_ctrl[i], sas_connector_status[i]); /* PCIe controllers */ for (i = 0; i < 2; i++) FAULT_LED(scc_controller_ctrl[i], scc_controller_status[i]); /* midplane */ FAULT_LED(midplane_element_ctrl, midplane_element_status); if (poked_leds) { int result; ctrl_page.page_code = 2; ctrl_page.page_length = sizeof(ctrl_page) - 4; ctrl_page.generation_code = 0; result = do_ses_cmd(fd, SEND_DIAGNOSTIC, 0, 0x10, 6, SG_DXFER_TO_DEV, &ctrl_page, sizeof(ctrl_page)); if (result != 0) { perror("ioctl - SEND_DIAGNOSTIC"); fprintf(stderr, "result = %d\n", result); fprintf(stderr, "failed to set LED(s) via SES\n"); return -1; } } return 0; } /* @return 0 for success, 1 for failure */ int diag_bluehawk(int fd, struct dev_vpd *vpd) { int i; static const char *power_supply_names[] = { "PS0 (Left)", "PS1 (Right)" }; static const char *fan_set_names[] = { "Left Fan Assembly", "Right Fan Assembly", }; static const char *temp_sensor_set_names[] = { "Left", "Right" }; static const char *esm_names[] = { "Left", "Right" }; static const char *sas_connector_names[] = { "Left - T1", "Left - T2", "Right - T1", "Right - T2" }; static const char *scc_controller_names[] = { "Left", "Right" }; int rc; if (cmd_opts.fake_path) { rc = read_page2_from_file(&dp, cmd_opts.fake_path, 1); fd = -1; } else rc = get_diagnostic_page(fd, RECEIVE_DIAGNOSTIC, 2, (void *)&dp, (int) sizeof(dp)); if (rc != 0) { fprintf(stderr, "Failed to read SES diagnostic page; " "cannot report status.\n"); return 1; } printf(" Overall Status: "); if (dp.crit) { printf("CRITICAL_FAULT"); if (dp.non_crit) printf(" | NON_CRITICAL_FAULT"); } else if (dp.non_crit) printf("NON_CRITICAL_FAULT"); else printf("ok"); printf("\n\n Drive Status\n"); for (i = 0; i < NR_DISKS_PER_BLUEHAWK; i++) { struct disk_status *ds = &dp.disk_status[i]; printf(" Disk %02d (Slot %02d): ", i+1, ds->byte1.element_status.slot_address); print_drive_status(ds); } printf("\n Power Supply Status\n"); for (i = 0; i < 2; i++) { printf(" %s: ", power_supply_names[i]); print_power_supply_status(&dp.ps_status[i]); printf(" 12V: "); print_voltage_sensor_status( &dp.voltage_sensor_sets[i].sensor_12V); printf(" 3.3VA: "); print_voltage_sensor_status( &dp.voltage_sensor_sets[i].sensor_3_3VA); } printf("\n Fan Status\n"); for (i = 0; i < 2; i++) { int j; printf(" %s:\n", fan_set_names[i]); printf(" Power Supply: "); print_fan_status(&dp.fan_sets[i].power_supply); for (j = 0; j < 4; j++) { printf(" Fan Element %d: ", j); print_fan_status(&dp.fan_sets[i].fan_element[j]); } } printf("\n Temperature Sensors\n"); for (i = 0; i < 2; i++) { int j; struct temperature_sensor_set *tss = &dp.temp_sensor_sets[i]; printf(" %s:\n", temp_sensor_set_names[i]); printf(" CRoC: "); print_temp_sensor_status(&tss->croc); printf(" PPC: "); print_temp_sensor_status(&tss->ppc); printf(" Expander: "); print_temp_sensor_status(&tss->expander); for (j = 0; j < 2; j++) { printf(" Ambient %d: ", j); print_temp_sensor_status(&tss->ambient[j]); } for (j = 0; j < 2; j++) { printf(" Power Supply %d: ", j); print_temp_sensor_status(&tss->power_supply[j]); } } printf("\n Enclosure Status: "); print_enclosure_status(&dp.enclosure_element_status); printf("\n ERM Electronics Status\n"); for (i = 0; i < 2; i++) { printf(" %s: ", esm_names[i]); print_esm_status(&dp.esm_status[i]); } printf("\n SAS Connector Status\n"); for (i = 0; i < 4; i++) { printf(" %s: ", sas_connector_names[i]); print_sas_connector_status(&dp.sas_connector_status[i]); } printf("\n PCIe Controller Status\n"); for (i = 0; i < 2; i++) { printf(" %s: ", scc_controller_names[i]); print_scc_controller_status(&dp.scc_controller_status[i]); } printf("\n Midplane Status: "); print_midplane_status(&dp.midplane_element_status); if (cmd_opts.verbose) { printf("\n\nRaw diagnostic page:\n"); print_raw_data(stdout, (char *) &dp, sizeof(dp)); } /* * Report faults to servicelog, and turn on LEDs as appropriate. * LED status reported previously may not be accurate after we * do this, but the alternative is to report faults first and then * read the diagnostic page a second time. And unfortunately, the * changes to LED settings don't always show up immediately in * the next query of the SES. */ if (cmd_opts.serv_event) { rc = report_faults_to_svclog(vpd, fd); if (rc != 0) return 1; } /* -l is not supported for fake path */ if (fd != -1 && cmd_opts.leds) rc = turn_on_fault_leds(fd); return (rc != 0); } ppc64-diag-2.6.4/diags/test/0000755000000000000000000000000012313010662014117 5ustar rootrootppc64-diag-2.6.4/diags/test/bh_mk_healthy.c0000644000000000000000000000055212313010662017063 0ustar rootroot#include #include #include "bluehawk.h" #include "test_utils.h" extern struct bluehawk_diag_page2 healthy_page; /* healthy pg2 for bluehawk */ int main(int argc, char **argv) { if (argc != 2) { fprintf(stderr, "usage: %s pathname\n", argv[0]); exit(1); } if (write_page2_to_file(&healthy_page, argv[1]) != 0) exit(2); exit(0); } ppc64-diag-2.6.4/diags/test/bh_mk_hot_power.c0000644000000000000000000000251412313010662017433 0ustar rootroot#include #include #include #include "bluehawk.h" #include "test_utils.h" #define TEMPERATURE_OFFSET 20 extern struct bluehawk_diag_page2 healthy_page; static struct bluehawk_diag_page2 page; int main(int argc, char **argv) { int i; struct power_supply_status *ps; struct voltage_sensor_status *vs; struct fan_status *fs; struct temperature_sensor_status *ts; if (argc != 2) { fprintf(stderr, "usage: %s pathname\n", argv[0]); exit(1); } memcpy(&page, &healthy_page, sizeof(page)); page.non_crit = 1; ps = &page.ps_status[1]; ps->byte0.status = ES_NONCRITICAL; ps->dc_over_voltage = 1; ps->fail = 1; roll_up_power_supply_status(&page); vs = &page.voltage_sensor_sets[1].sensor_12V; vs->byte0.status = ES_NONCRITICAL; vs->warn_over = 1; roll_up_voltage_sensor_status(&page); fs = &page.fan_sets[1].power_supply; fs->byte0.status = ES_NONCRITICAL; fs->fail = 1; fs->speed_code = 1; roll_up_fan_status(&page); for (i = 0; i < 2; i++) { ts = &page.temp_sensor_sets[1].power_supply[i]; ts->byte0.status = ES_NONCRITICAL; ts->ot_warning = 1; ts->temperature = TEMPERATURE_OFFSET + 60; // 60 deg C } roll_up_temperature_sensor_status(&page); page.overall_temp_sensor_status.temperature = mean_temperature(&page); if (write_page2_to_file(&page, argv[1]) != 0) exit(2); exit(0); } ppc64-diag-2.6.4/diags/test/bh_dump_pg2.c0000644000000000000000000000571612313010662016462 0ustar rootroot#include #include #include #include #include #include #include #include #include #include #include #include "bluehawk.h" #include "test_utils.h" /* from diag_encl.h */ struct sense_data_t { uint8_t error_code; uint8_t segment_numb; uint8_t sense_key; uint8_t info[4]; uint8_t add_sense_len; uint8_t cmd_spec_info[4]; uint8_t add_sense_code; uint8_t add_sense_code_qual; uint8_t field_rep_unit_code; uint8_t sense_key_spec[3]; uint8_t add_sense_bytes[0]; }; /* from diag_encl.c */ /** * get_diagnostic_page * @brief Make the necessary sg ioctl() to retrieve a diagnostic page * * @param fd a file descriptor to the appropriate /dev/sg file * @param diag_page the page to be retrieved * @param buf a buffer to contain the contents of the diagnostic page * @param buf_len the length of the previous parameter * @return 0 on success, -EIO on invalid I/O status, or CHECK_CONDITION */ int get_diagnostic_page(int fd, int diag_page, void *buf, int buf_len) { unsigned char scsi_cmd_buf[16] = { RECEIVE_DIAGNOSTIC, 0x01, /* set PCV bit to 1 */ diag_page, /* page to be retrieved */ (buf_len >> 8) & 0xff, /* most significant byte */ buf_len & 0xff, /* least significant byte */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; struct sense_data_t sense_data; sg_io_hdr_t hdr; int i, rc; for (i = 0; i < 3; i++) { memset(&hdr, 0, sizeof(hdr)); memset(&sense_data, 0, sizeof(struct sense_data_t)); hdr.interface_id = 'S'; hdr.dxfer_direction = SG_DXFER_FROM_DEV; hdr.cmd_len = 16; hdr.mx_sb_len = sizeof(sense_data); hdr.iovec_count = 0; /* scatter gather not necessary */ hdr.dxfer_len = buf_len; hdr.dxferp = buf; hdr.cmdp = scsi_cmd_buf; hdr.sbp = (unsigned char *)&sense_data; hdr.timeout = 120 * 1000; /* set timeout to 2 minutes */ hdr.flags = 0; hdr.pack_id = 0; hdr.usr_ptr = 0; rc = ioctl(fd, SG_IO, &hdr); if ((rc == 0) && (hdr.masked_status == CHECK_CONDITION)) rc = CHECK_CONDITION; else if ((rc == 0) && (hdr.host_status || hdr.driver_status)) rc = -EIO; if (rc == 0 || hdr.host_status == 1) break; } return rc; } /* Dump bluehawk enclosure pg2 */ int main(int argc, char **argv) { char *sg; char dev_sg[20]; char *path; int fd; struct bluehawk_diag_page2 dp; int result; if (argc != 3) { fprintf(stderr, "usage: %s sgN output_file\n", argv[0]); exit(1); } sg = argv[1]; path = argv[2]; if (strncmp(sg, "sg", 2) != 0 || strlen(sg) > 6) { fprintf(stderr, "bad format of sg arg\n"); exit(2); } sprintf(dev_sg, "/dev/%s", sg); fd = open(dev_sg, O_RDWR); if (fd < 0) { perror(dev_sg); exit(3); } result = get_diagnostic_page(fd, 2, &dp, sizeof(dp)); if (result != 0) { perror("get_diagnostic_page"); exit(4); } if (write_page2_to_file(&dp, path) != 0) exit(5); exit(0); } ppc64-diag-2.6.4/diags/test/bh_healthy.c0000644000000000000000000001215512313010662016376 0ustar rootroot#include "bluehawk.h" /* * Note: Initializing struct members to zero is not strictly necessary, * but we explicitly initialize all members that can take on meaningful * values. All other members are unsupported by the SES implementation. */ #define HEALTHY_STATUS_BYTE0 { .swap = 0, .status = 1 } #define HEALTHY_DISK(n) { \ .byte0 = HEALTHY_STATUS_BYTE0, \ .byte1.element_status = { .hot_swap = 1, .slot_address = n }, \ .app_client_bypassed_a = 0, \ .ready_to_insert = 0, \ .rmv = 0, \ .ident = 0, \ .app_client_bypassed_b = 0, \ .fail = 0, \ .bypassed_a = 0, \ .bypassed_b = 0, \ } #define HEALTHY_ENCLOSURE { \ .byte0 = HEALTHY_STATUS_BYTE0, \ .ident = 0, \ .fail = 0, \ .failure_requested = 0 \ } #define HEALTHY_ESM { \ .byte0 = HEALTHY_STATUS_BYTE0, \ .ident = 0, \ .fail = 0, \ .hot_swap = 1, \ } #define ROOM_TEMPERATURE 20 #define TEMPERATURE_OFFSET 20 #define HEALTHY_TEMP_SENSOR(temp) { \ .byte0 = HEALTHY_STATUS_BYTE0, \ .temperature = (temp + TEMPERATURE_OFFSET), \ .ot_failure = 0, \ .ot_warning = 0 \ } #define ROOM_TEMP_SENSOR HEALTHY_TEMP_SENSOR(ROOM_TEMPERATURE) #define HEALTHY_TEMP_SENSOR_SET { \ .croc = ROOM_TEMP_SENSOR, \ .ppc = ROOM_TEMP_SENSOR, \ .expander = ROOM_TEMP_SENSOR, \ .ambient = { \ ROOM_TEMP_SENSOR, \ ROOM_TEMP_SENSOR \ }, \ .power_supply = { \ ROOM_TEMP_SENSOR, \ ROOM_TEMP_SENSOR \ } \ } #define HEALTHY_FAN_SPEED_CODE 0x3 /* Just a guess */ #define HEALTHY_FAN(spdcd) { \ .byte0 = HEALTHY_STATUS_BYTE0, \ .ident = 0, \ .hot_swap = 1, \ .fail = 0, \ .speed_code = spdcd \ } #define HEALTHY_FAN_SET(spdcd) { \ .power_supply = HEALTHY_FAN(spdcd), \ .fan_element = { \ HEALTHY_FAN(spdcd), \ HEALTHY_FAN(spdcd), \ HEALTHY_FAN(spdcd), \ HEALTHY_FAN(spdcd) \ } \ } #define HEALTHY_POWER_SUPPLY { \ .byte0 = HEALTHY_STATUS_BYTE0, \ .ident = 0, \ .dc_over_voltage = 0, \ .dc_under_voltage = 0, \ .dc_over_current = 0, \ .hot_swap = 1, \ .fail = 0, \ .ovrtmp_fail = 0, \ .ac_fail = 0, \ .dc_fail = 0, \ } #define HEALTHY_VOLTAGE_12V 1200 #define HEALTHY_VOLTAGE_3_3V 350 #define HEALTHY_VOLTAGE_SENSOR(volts) { \ .byte0 = HEALTHY_STATUS_BYTE0, \ .warn_over = 0, \ .warn_under = 0, \ .crit_over = 0, \ .crit_under = 0, \ .voltage = volts \ } #define HEALTHY_VOLTAGE_SENSOR_SET { \ HEALTHY_VOLTAGE_SENSOR(HEALTHY_VOLTAGE_12V), \ HEALTHY_VOLTAGE_SENSOR(HEALTHY_VOLTAGE_3_3V) \ } #define HEALTHY_SAS_CONNECTOR { \ .byte0 = HEALTHY_STATUS_BYTE0, \ .ident = 0, \ .connector_type = 5, \ .connector_physical_link = 0xff, \ .fail = 0 \ } #define HEALTHY_SCC_CONTROLLER_OVERALL { \ .byte0 = HEALTHY_STATUS_BYTE0, \ .ident = 0, \ .fail = 0 \ } #define HEALTHY_SCC_CONTROLLER { \ .byte0 = HEALTHY_STATUS_BYTE0, \ .ident = 0, \ .fail = 0, \ .report = 0 \ } #define HEALTHY_MIDPLANE(stat) { \ .byte0 = { .swap = 0, .status = stat }, \ .ident = 0, \ .fail = 0 \ } struct bluehawk_diag_page2 healthy_page = { .page_code = 2, .non_crit = 0, .crit = 0, .page_length = 0x144, .generation_code = 0, .overall_disk_status = { .byte0 = HEALTHY_STATUS_BYTE0, .byte1.overall_status = { .device_environment = 2, .slot_address = 0 }, .ready_to_insert = 0, .rmv = 0, .ident = 0, .report = 0, .fail = 0 }, .disk_status = { [0] = HEALTHY_DISK(0), [1] = HEALTHY_DISK(1), [2] = HEALTHY_DISK(2), [3] = HEALTHY_DISK(3), [4] = HEALTHY_DISK(4), [5] = HEALTHY_DISK(5), [6] = HEALTHY_DISK(6), [7] = HEALTHY_DISK(7), [8] = HEALTHY_DISK(8), [9] = HEALTHY_DISK(9), [10] = HEALTHY_DISK(10), [11] = HEALTHY_DISK(11), [12] = HEALTHY_DISK(12), [13] = HEALTHY_DISK(13), [14] = HEALTHY_DISK(14), [15] = HEALTHY_DISK(15), [16] = HEALTHY_DISK(16), [17] = HEALTHY_DISK(17), [18] = HEALTHY_DISK(18), [19] = HEALTHY_DISK(19), [20] = HEALTHY_DISK(20), [21] = HEALTHY_DISK(21), [22] = HEALTHY_DISK(22), [23] = HEALTHY_DISK(23), [24] = HEALTHY_DISK(24), [25] = HEALTHY_DISK(25), [26] = HEALTHY_DISK(26), [27] = HEALTHY_DISK(27), [28] = HEALTHY_DISK(28), [29] = HEALTHY_DISK(29) }, .overall_enclosure_status = HEALTHY_ENCLOSURE, .enclosure_element_status = HEALTHY_ENCLOSURE, .overall_esm_status = HEALTHY_ESM, .esm_status = { HEALTHY_ESM, HEALTHY_ESM }, .overall_temp_sensor_status = ROOM_TEMP_SENSOR, .temp_sensor_sets = { HEALTHY_TEMP_SENSOR_SET, HEALTHY_TEMP_SENSOR_SET }, .overall_fan_status = HEALTHY_FAN(0), // speed code undefined here .fan_sets = { HEALTHY_FAN_SET(HEALTHY_FAN_SPEED_CODE), HEALTHY_FAN_SET(HEALTHY_FAN_SPEED_CODE) }, .overall_power_status = HEALTHY_POWER_SUPPLY, .ps_status = { HEALTHY_POWER_SUPPLY, HEALTHY_POWER_SUPPLY }, .overall_voltage_status = HEALTHY_VOLTAGE_SENSOR(0), .voltage_sensor_sets = { HEALTHY_VOLTAGE_SENSOR_SET, HEALTHY_VOLTAGE_SENSOR_SET }, .overall_sas_connector_status = HEALTHY_SAS_CONNECTOR, .sas_connector_status = { HEALTHY_SAS_CONNECTOR, HEALTHY_SAS_CONNECTOR, HEALTHY_SAS_CONNECTOR, HEALTHY_SAS_CONNECTOR }, .overall_scc_controller_status = HEALTHY_SCC_CONTROLLER_OVERALL, .scc_controller_status = { HEALTHY_SCC_CONTROLLER, HEALTHY_SCC_CONTROLLER }, .overall_midplane_status = HEALTHY_MIDPLANE(0), .midplane_element_status = HEALTHY_MIDPLANE(1) }; ppc64-diag-2.6.4/diags/test/test_utils.h0000644000000000000000000000250012313010662016464 0ustar rootroot#ifndef __TEST_UTILS_H__ #define __TEST_UTILS_H__ #include "bluehawk.h" extern enum element_status_code add_element_status(enum element_status_code cur, const struct element_status_byte0 *byte0); extern enum element_status_code composite_status(const void* first_element, int nel); extern enum element_status_code roll_up_disk_status( const struct bluehawk_diag_page2 *pg); extern enum element_status_code roll_up_esm_status( const struct bluehawk_diag_page2 *pg); extern enum element_status_code roll_up_temperature_sensor_status( const struct bluehawk_diag_page2 *pg); extern enum element_status_code roll_up_fan_status( const struct bluehawk_diag_page2 *pg); extern enum element_status_code roll_up_power_supply_status( const struct bluehawk_diag_page2 *pg); extern enum element_status_code roll_up_voltage_sensor_status( const struct bluehawk_diag_page2 *pg); extern enum element_status_code roll_up_sas_connector_status( const struct bluehawk_diag_page2 *pg); /* Is this valid? */ extern enum element_status_code roll_up_scc_controller_status( const struct bluehawk_diag_page2 *pg); extern unsigned int mean_temperature(const struct bluehawk_diag_page2 *pg); extern int write_page2_to_file(const struct bluehawk_diag_page2 *pg, const char *path); #endif /* __TEST_UTILS_H__ */ ppc64-diag-2.6.4/diags/test/sg8.vpd0000644000000000000000000000005012313010662015326 0ustar rootroot5888 U5888.001.G123789 sn12345 fru67890 ppc64-diag-2.6.4/diags/test/test_utils.c0000644000000000000000000000571612313010662016473 0ustar rootroot#include #include #include #include "bluehawk.h" /* * Factor byte0->status into the composite status cur. A missing element * (ES_NOT_INSTALLED) is ignored. A non-critical status is less severe * than critical. Otherwise assume that an increasing value of * element_status_code indicates and increasing severity. Return the more * severe of byte0->status and cur. */ enum element_status_code add_element_status(enum element_status_code cur, const struct element_status_byte0 *byte0) { enum element_status_code s = (enum element_status_code) byte0->status; if (s == ES_OK || s == ES_NOT_INSTALLED) return cur; if ((cur == ES_OK || cur == ES_NONCRITICAL) && s > ES_OK) return s; return cur; } /* * Calculate the composite status for the nel elements starting at * address first_element. We exploit the fact that every status element * is 4 bytes and starts with an element_status_byte0 struct. */ enum element_status_code composite_status(const void* first_element, int nel) { int i; const char *el = (const char*) first_element; enum element_status_code s = ES_OK; for (i = 0; i < nel; i++, el += 4) s = add_element_status(s, (const struct element_status_byte0*) el); return s; } enum element_status_code roll_up_disk_status(const struct bluehawk_diag_page2 *pg) { return composite_status(&pg->disk_status, NR_DISKS_PER_BLUEHAWK); } enum element_status_code roll_up_esm_status(const struct bluehawk_diag_page2 *pg) { return composite_status(&pg->esm_status, 2); } enum element_status_code roll_up_temperature_sensor_status(const struct bluehawk_diag_page2 *pg) { return composite_status(&pg->temp_sensor_sets, 2 * 7); } enum element_status_code roll_up_fan_status(const struct bluehawk_diag_page2 *pg) { return composite_status(&pg->fan_sets, 2 * 5); } enum element_status_code roll_up_power_supply_status(const struct bluehawk_diag_page2 *pg) { return composite_status(&pg->ps_status, 2); } enum element_status_code roll_up_voltage_sensor_status(const struct bluehawk_diag_page2 *pg) { return composite_status(&pg->voltage_sensor_sets, 2 * 2); } enum element_status_code roll_up_sas_connector_status(const struct bluehawk_diag_page2 *pg) { return composite_status(&pg->sas_connector_status, 4); } /* Is this valid? */ enum element_status_code roll_up_scc_controller_status(const struct bluehawk_diag_page2 *pg) { return composite_status(&pg->scc_controller_status, 2); } unsigned int mean_temperature(const struct bluehawk_diag_page2 *pg) { struct temperature_sensor_status *sensors = (struct temperature_sensor_status *) &pg->temp_sensor_sets; int sum = 0; int i; for (i = 0; i < 2*7; i++) sum += sensors[i].temperature; return sum / (2*7); } int write_page2_to_file(const struct bluehawk_diag_page2 *pg, const char *path) { FILE *f; f = fopen(path, "w"); if (!f) { perror(path); return -1; } if (fwrite(pg, sizeof(*pg), 1, f) != 1) { perror(path); fclose(f); return -2; } fclose(f); return 0; } ppc64-diag-2.6.4/diags/test/bh_structs.c0000644000000000000000000000425012313010662016444 0ustar rootroot/* Copyright (C) 2009, 2012 IBM Corporation */ #include #include #include #include "bluehawk.h" #define szp(x) printf(#x " %zu\n", sizeof(struct x)) #define ofs(m) printf(#m " %lu\n", (unsigned long) &((struct bluehawk_diag_page2*)0)->m) #define ofc(m) printf(#m " %lu\n", (unsigned long) &((struct bluehawk_ctrl_page2*)0)->m) /* dump bhluehawk element structure details */ int main() { szp(element_status_byte0); szp(overall_disk_status_byte1); szp(disk_element_status_byte1); szp(disk_status); szp(enclosure_status); szp(esm_status); szp(temperature_sensor_status); szp(temperature_sensor_set); szp(fan_status); szp(fan_set); szp(power_supply_status); szp(voltage_sensor_status); szp(voltage_sensor_set); szp(sas_connector_status); szp(scc_controller_overall_status); szp(scc_controller_element_status); szp(midplane_status); szp(bluehawk_diag_page2); printf("\n"); ofs(overall_disk_status); ofs(disk_status); ofs(overall_enclosure_status); ofs(enclosure_element_status); ofs(overall_esm_status); ofs(esm_status); ofs(overall_temp_sensor_status); ofs(temp_sensor_sets); ofs(overall_fan_status); ofs(fan_sets); ofs(overall_power_status); ofs(ps_status); ofs(overall_voltage_status); ofs(voltage_sensor_sets); ofs(overall_sas_connector_status); ofs(sas_connector_status); ofs(overall_scc_controller_status); ofs(scc_controller_status); ofs(overall_midplane_status); ofs(midplane_element_status); printf("\n"); szp(common_ctrl); szp(disk_ctrl); szp(enclosure_ctrl); szp(esm_ctrl); szp(fan_ctrl); szp(fan_ctrl_set); szp(power_supply_ctrl); szp(sas_connector_ctrl); szp(scc_controller_ctrl); szp(midplane_ctrl); szp(bluehawk_ctrl_page2); printf("\n"); ofc(overall_disk_ctrl); ofc(disk_ctrl); ofc(overall_enclosure_ctrl); ofc(enclosure_element_ctrl); ofc(overall_esm_ctrl); ofc(esm_ctrl); ofc(temperature_sensor_ctrl); ofc(overall_fan_ctrl); ofc(fan_sets); ofc(overall_power_ctrl); ofc(ps_ctrl); ofc(voltage_sensor_ctrl); ofc(overall_sas_connector_ctrl); ofc(sas_connector_ctrl); ofc(overall_scc_controller_ctrl); ofc(scc_controller_ctrl); ofc(overall_midplane_ctrl); ofc(midplane_element_ctrl); exit(0); } ppc64-diag-2.6.4/diags/test/bh_vpd.c0000644000000000000000000001042212313010662015524 0ustar rootroot#include #include #include #include #include #include #include #include #include #include #include #include "bluehawk.h" /* from diag_encl.h */ struct sense_data_t { uint8_t error_code; uint8_t segment_numb; uint8_t sense_key; uint8_t info[4]; uint8_t add_sense_len; uint8_t cmd_spec_info[4]; uint8_t add_sense_code; uint8_t add_sense_code_qual; uint8_t field_rep_unit_code; uint8_t sense_key_spec[3]; uint8_t add_sense_bytes[0]; }; /* based on diag_encl.c's get_diagnostic_page */ /** * get_vpd_page * @brief Make the necessary sg ioctl() to retrieve a VPD page * * @param fd a file descriptor to the appropriate /dev/sg file * @param vpd_page the page to be retrieved * @param buf a buffer to contain the contents of the diagnostic page * @param buf_len the length of the previous parameter * @return 0 on success, -EIO on invalid I/O status, or CHECK_CONDITION */ int get_vpd_page(int fd, char command, char page_nr, void *buf, int buf_len) { unsigned char scsi_cmd_buf[16] = { command, 0x01, /* set EVPD bit to 1 */ page_nr, /* page to be retrieved */ (buf_len >> 8) & 0xff, /* most significant byte */ buf_len & 0xff, /* least significant byte */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; struct sense_data_t sense_data; sg_io_hdr_t hdr; int i, rc; for (i = 0; i < 3; i++) { memset(&hdr, 0, sizeof(hdr)); memset(&sense_data, 0, sizeof(struct sense_data_t)); hdr.interface_id = 'S'; hdr.dxfer_direction = SG_DXFER_FROM_DEV; hdr.cmd_len = 16; hdr.mx_sb_len = sizeof(sense_data); hdr.iovec_count = 0; /* scatter gather not necessary */ hdr.dxfer_len = buf_len; hdr.dxferp = buf; hdr.cmdp = scsi_cmd_buf; hdr.sbp = (unsigned char *)&sense_data; hdr.timeout = 120 * 1000; /* set timeout to 2 minutes */ hdr.flags = 0; hdr.pack_id = 0; hdr.usr_ptr = 0; rc = ioctl(fd, SG_IO, &hdr); if ((rc == 0) && (hdr.masked_status == CHECK_CONDITION)) rc = CHECK_CONDITION; else if ((rc == 0) && (hdr.host_status || hdr.driver_status)) rc = -EIO; if (rc == 0 || hdr.host_status == 1) break; } return rc; } static char * strzcpy(char *dest, const char *src, size_t n) { memcpy(dest, src, n); dest[n] = '\0'; return dest; } int main(int argc, char **argv) { char *sg; char dev_sg[20]; int fd; struct vpd_page vp; struct element_descriptor_page edp; int result; char temp[20]; if (argc != 2) { fprintf(stderr, "usage: %s sgN\n", argv[0]); exit(1); } sg = argv[1]; if (strncmp(sg, "sg", 2) != 0 || strlen(sg) > 6) { fprintf(stderr, "bad format of sg arg\n"); exit(2); } sprintf(dev_sg, "/dev/%s", sg); fd = open(dev_sg, O_RDWR); if (fd < 0) { perror(dev_sg); exit(3); } printf("ESM/ERM:\n"); result = get_vpd_page(fd, INQUIRY, 1, &vp, sizeof(vp)); if (result != 0) { perror("get_vpd_page"); fprintf(stderr, "result = %d\n", result); exit(4); } printf("FN=%s\n", strzcpy(temp, vp.fru_number, 8)); printf("SN=%s\n", strzcpy(temp, vp.serial_number, 12)); printf("CC=%s\n", strzcpy(temp, vp.model_number, 4)); printf("FL=%s\n", strzcpy(temp, vp.fru_label, 5)); printf("\nmidplane:\n"); result = get_vpd_page(fd, INQUIRY, 5, &vp, sizeof(vp)); if (result != 0) { perror("get_vpd_page"); fprintf(stderr, "result = %d\n", result); exit(4); } printf("FN=%s\n", strzcpy(temp, vp.fru_number, 8)); printf("SN=%s\n", strzcpy(temp, vp.serial_number, 12)); printf("CC=%s\n", strzcpy(temp, vp.model_number, 4)); printf("FL=%s\n", strzcpy(temp, vp.fru_label, 5)); memset(&edp, 0, sizeof(edp)); printf("\npower supply 0:\n"); result = get_vpd_page(fd, RECEIVE_DIAGNOSTIC, 7, &edp, sizeof(edp)); if (result != 0) { perror("get_vpd_page"); fprintf(stderr, "result = %d\n", result); exit(5); } printf("FN=%s\n", strzcpy(temp, edp.ps0_vpd.fru_number, 8)); printf("SN=%s\n", strzcpy(temp, edp.ps0_vpd.serial_number, 12)); printf("FL=%s\n", strzcpy(temp, edp.ps0_vpd.fru_label, 5)); printf("\npower supply 1:\n"); printf("FN=%s\n", strzcpy(temp, edp.ps1_vpd.fru_number, 8)); printf("SN=%s\n", strzcpy(temp, edp.ps1_vpd.serial_number, 12)); printf("FL=%s\n", strzcpy(temp, edp.ps1_vpd.fru_label, 5)); exit(0); } ppc64-diag-2.6.4/diags/test/Makefile0000644000000000000000000000174712313010662015570 0ustar rootroot# # Makefile for ppc64-diag/diags/test # PROGS = bh_structs bh_mk_healthy bh_mk_hot_power bh_dump_pg2 bh_vpd SAMPLE_PAGES = bh_healthy.pg2 bh_hot_power.pg2 CFLAGS = -g -Wall INCLUDE = -I.. all: $(PROGS) $(SAMPLE_PAGES) bh_mk_healthy: bh_mk_healthy.o test_utils.o bh_healthy.o $(CC) $(CFLAGS) $(INCLUDE) -o bh_mk_healthy bh_mk_healthy.o test_utils.o bh_healthy.o bh_mk_hot_power: bh_mk_hot_power.o test_utils.o bh_healthy.o $(CC) $(CFLAGS) $(INCLUDE) -o bh_mk_hot_power bh_mk_hot_power.o test_utils.o bh_healthy.o bh_structs: bh_structs.o $(CC) $(CFLAGS) $(INCLUDE) -o bh_structs bh_structs.o bh_healthy.pg2: bh_mk_healthy ./bh_mk_healthy bh_healthy.pg2 bh_hot_power.pg2: bh_mk_hot_power ./bh_mk_hot_power bh_hot_power.pg2 bh_dump_pg2: bh_dump_pg2.o test_utils.o $(CC) $(CFLAGS) $(INCLUDE) -o bh_dump_pg2 bh_dump_pg2.o test_utils.o bh_vpd: bh_vpd.o $(CC) $(CFLAGS) $(INCLUDE) -o bh_vpd bh_vpd.o %.o: %.c $(CC) $(CFLAGS) $(INCLUDE) -c $< clean: rm -f $(PROGS) *.o $(SAMPLE_PAGES) ppc64-diag-2.6.4/diags/test/README0000644000000000000000000000126112313010662014777 0ustar rootrootTo create a .pg2 file that represents an entirely healthy Bluehawk, run: $ make $ ./bh_mk_healthy xxx.pg2 To create a .pg2 file that represents (sort of) a Bluehawk with an overheating power supply, run: $ make $ ./bh_mk_hot_power xxx.pg2 You can simulate other problems by writing programs similar to mk_hot_power.c. When you feed such a file to diag_encl using the -f option, remember that you also need to provide a .vpd file. Just copy sg8.vpd and rename it. To create .pg2 file from Bluehawk enclosure, run: $ make $ ./bh_dump_pg2 To dump the Bluehawk vpd data, run: $ make $ bh_vpd To dump the Bluehawk structure size, run : $ make $ bh_structs ppc64-diag-2.6.4/diags/bluehawk_led.c0000644000000000000000000002103012313010662015726 0ustar rootroot/* * Copyright (C) 2012 IBM Corporation */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include "encl_util.h" #include "encl_led.h" #include "bluehawk.h" enum bh_component_type { BHC_ENCLOSURE, BHC_MIDPLANE, BHC_DISK, BHC_POWER_SUPPLY, BHC_ERM, BHC_PCI_CONTROLLER, BHC_SAS_CONNECTOR, BHC_FAN_ASSEMBLY }; /* * It'd be nicer to do all this with functions, but different components * have their fail, ident, rqst_fail, and rqst_ident bits in different * locations. */ #define SET_LED(cp, dp, fault, idnt, ctrl_element, status_element) \ do { \ (cp)->ctrl_element.common_ctrl.select = 1; \ (cp)->ctrl_element.rqst_fail = (fault == LED_SAME ? \ (dp)->status_element.fail : fault); \ (cp)->ctrl_element.rqst_ident = (idnt == LED_SAME ? \ (dp)->status_element.ident : idnt); \ } while (0) static void check_range(unsigned int n, unsigned int min, unsigned int max, const char *lc) { if (n < min || n > max) { fprintf(stderr, "%s: number %u out of range in location code %s\n", progname, n, lc); exit(1); } } static int decode_component_loc(const char *loc, enum bh_component_type *type, unsigned int *index) { unsigned int n, n2; char g; /* catch trailing garbage */ if (!loc || !strcmp(loc, "-")) { *type = BHC_ENCLOSURE; *index = 0; } else if (!strcmp(loc, "P1")) { *type = BHC_MIDPLANE; *index = 0; } else if (sscanf(loc, "P1-D%u%c", &n, &g) == 1) { check_range(n, 1, 30, loc); *type = BHC_DISK; *index = n - 1; } else if (sscanf(loc, "P1-C%u%c", &n, &g) == 1) { check_range(n, 1, 2, loc); *type = BHC_ERM; *index = n-1; } else if (sscanf(loc, "P1-E%u%c", &n, &g) == 1) { check_range(n, 1, 2, loc); *type = BHC_POWER_SUPPLY; *index = n-1; } else if (sscanf(loc, "P1-C%u-T%u%c", &n, &n2, &g) == 2) { check_range(n, 1, 2, loc); if (n2 == 3) { *type = BHC_PCI_CONTROLLER; *index = n-1; } else { check_range(n2, 1, 2, loc); *type = BHC_SAS_CONNECTOR; *index = (n-1)*2 + (n2-1); } } else if (sscanf(loc, "P1-C%u-A%u%c", &n, &n2, &g) == 2) { check_range(n, 1, 2, loc); check_range(n2, 1, 1, loc); *type = BHC_FAN_ASSEMBLY; *index = n-1; } else { fprintf(stderr, "%s: unrecognized location code: %s\n", progname, loc); return -1; } return 0; } static const char *on_off_string[] = { "off", "on" }; #define REPORT_COMPONENT(dp, element, fault, idnt, loc_code, desc, verbose) \ do { \ printf("%-5s %-5s %-9s", \ on_off_string[fault == LED_SAME ? dp->element.fail : fault], \ on_off_string[idnt == LED_SAME ? dp->element.ident : idnt], \ loc_code); \ if (verbose) \ printf(" %s", desc); \ printf("\n"); \ } while (0) static void report_component(struct bluehawk_diag_page2 *dp, int fault, int ident, enum bh_component_type type, unsigned int i, int verbose) { char loc_code[16]; char desc[64]; static const char *left_right[] = { "left", "right" }; switch (type) { case BHC_ENCLOSURE: REPORT_COMPONENT(dp, enclosure_element_status, fault, ident, "-", "enclosure", verbose); break; case BHC_MIDPLANE: REPORT_COMPONENT(dp, midplane_element_status, fault, ident, "P1", "midplane", verbose); break; case BHC_DISK: sprintf(loc_code, "P1-D%u", i+1); sprintf(desc, "disk %u", i+1); REPORT_COMPONENT(dp, disk_status[i], fault, ident, loc_code, desc, verbose); break; case BHC_POWER_SUPPLY: sprintf(loc_code, "P1-E%u", i+1); sprintf(desc, "%s power supply", left_right[i]); REPORT_COMPONENT(dp, ps_status[i], fault, ident, loc_code, desc, verbose); break; case BHC_ERM: sprintf(loc_code, "P1-C%u", i+1); sprintf(desc, "%s Enclosure RAID Module", left_right[i]); REPORT_COMPONENT(dp, esm_status[i], fault, ident, loc_code, desc, verbose); break; case BHC_PCI_CONTROLLER: sprintf(loc_code, "P1-C%u-T3", i+1); sprintf(desc, "%s PCIe controller", left_right[i]); REPORT_COMPONENT(dp, scc_controller_status[i], fault, ident, loc_code, desc, verbose); break; case BHC_SAS_CONNECTOR: sprintf(loc_code, "P1-C%u-T%u", (i/2)+1, (i%2)+1); sprintf(desc, "%s SAS connector T%d", left_right[i/2], (i%2)+1); REPORT_COMPONENT(dp, sas_connector_status[i], fault, ident, loc_code, desc, verbose); break; case BHC_FAN_ASSEMBLY: sprintf(loc_code, "P1-C%u-A1", i+1); sprintf(desc, "%s fan assembly", left_right[i]); REPORT_COMPONENT(dp, fan_sets[i].fan_element[0], fault, ident, loc_code, desc, verbose); break; default: fprintf(stderr, "%s internal error: unexpected component type %u\n", progname, type); exit(3); } } static void report_component_from_ses(struct bluehawk_diag_page2 *dp, enum bh_component_type type, unsigned int i, int verbose) { report_component(dp, LED_SAME, LED_SAME, type, i, verbose); } int bluehawk_list_leds(const char *enclosure, const char *component, int verbose) { int fd, rc; struct bluehawk_diag_page2 dp; fd = open_sg_device(enclosure); if (fd < 0) return -1; rc = get_diagnostic_page(fd, RECEIVE_DIAGNOSTIC, 2, &dp, sizeof(dp)); if (rc != 0) { fprintf(stderr, "%s: cannot read diagnostic page from SES for %s\n", progname, enclosure); return -1; } printf("fault ident location description\n"); if (component) { unsigned int cindex; enum bh_component_type ctype; rc = decode_component_loc(component, &ctype, &cindex); if (rc != 0) return -1; report_component_from_ses(&dp, ctype, cindex, verbose); } else { unsigned int i; report_component_from_ses(&dp, BHC_ENCLOSURE, 0, verbose); report_component_from_ses(&dp, BHC_MIDPLANE, 0, verbose); for (i = 0; i < NR_DISKS_PER_BLUEHAWK; i++) report_component_from_ses(&dp, BHC_DISK, i, verbose); for (i = 0; i < 2; i++) report_component_from_ses(&dp, BHC_POWER_SUPPLY, i, verbose); for (i = 0; i < 2; i++) report_component_from_ses(&dp, BHC_ERM, i, verbose); for (i = 0; i < 2; i++) report_component_from_ses(&dp, BHC_PCI_CONTROLLER, i, verbose); for (i = 0; i < 4; i++) report_component_from_ses(&dp, BHC_SAS_CONNECTOR, i, verbose); for (i = 0; i < 2; i++) report_component_from_ses(&dp, BHC_FAN_ASSEMBLY, i, verbose); } return 0; } int bluehawk_set_led(const char *enclosure, const char *component, int fault, int ident, int verbose) { int fd, rc; unsigned int index; enum bh_component_type type; struct bluehawk_diag_page2 dp; struct bluehawk_ctrl_page2 cp; fd = open_sg_device(enclosure); if (fd < 0) return -1; rc = decode_component_loc(component, &type, &index); if (rc != 0) return -1; if (fault == LED_SAME || ident == LED_SAME) { memset(&dp, 0, sizeof(dp)); rc = get_diagnostic_page(fd, RECEIVE_DIAGNOSTIC, 2, &dp, sizeof(dp)); if (rc != 0) { fprintf(stderr, "%s: cannot read diagnostic page" " from SES for %s\n", progname, enclosure); return -1; } } memset(&cp, 0, sizeof(cp)); switch (type) { case BHC_ENCLOSURE: if (fault == LED_ON) { fprintf(stderr, "%s: Cannot directly enable enclosure" " fault indicator", enclosure); return -1; } SET_LED(&cp, &dp, fault, ident, enclosure_element_ctrl, enclosure_element_status); break; case BHC_MIDPLANE: SET_LED(&cp, &dp, fault, ident, midplane_element_ctrl, midplane_element_status); break; case BHC_DISK: SET_LED(&cp, &dp, fault, ident, disk_ctrl[index], disk_status[index]); break; case BHC_POWER_SUPPLY: SET_LED(&cp, &dp, fault, ident, ps_ctrl[index], ps_status[index]); break; case BHC_ERM: SET_LED(&cp, &dp, fault, ident, esm_ctrl[index], esm_status[index]); break; case BHC_PCI_CONTROLLER: SET_LED(&cp, &dp, fault, ident, scc_controller_ctrl[index], scc_controller_status[index]); break; case BHC_SAS_CONNECTOR: SET_LED(&cp, &dp, fault, ident, sas_connector_ctrl[index], sas_connector_status[index]); break; case BHC_FAN_ASSEMBLY: SET_LED(&cp, &dp, fault, ident, fan_sets[index].fan_element[0], fan_sets[index].fan_element[0]); break; default: fprintf(stderr, "%s internal error: unexpected component type %u\n", progname, type); exit(3); } cp.page_code = 2; cp.page_length = sizeof(cp) - 4; cp.generation_code = 0; rc = do_ses_cmd(fd, SEND_DIAGNOSTIC, 0, 0x10, 6, SG_DXFER_TO_DEV, &cp, sizeof(cp)); if (rc != 0) { fprintf(stderr, "%s: failed to set LED(s) via SES for %s.\n", progname, enclosure); exit(2); } if (verbose) report_component(&dp, fault, ident, type, index, verbose); return 0; } ppc64-diag-2.6.4/diags/Makefile0000644000000000000000000000217512313010662014605 0ustar rootroot# # Makefile for ppc64-diag/diags # include ../rules.mk PROGS = diag_encl encl_led DIAG_ENCL_OBJS = diag_encl.o 7031_D24_T24.o bluehawk.o encl_util.o DIAG_ENCL_LIBS = -lservicelog -lsqlite3 -lrtasevent ENCL_LED_OBJS = encl_led.o encl_util.o bluehawk_led.o SUBDIRS = doc DOXYGEN_CFG = doxygen.config all: $(PROGS) diag_encl: $(DIAG_ENCL_OBJS) @echo "LD $(WORK_DIR)/$@" @$(CC) $(CFLAGS) -o $@ $^ $(DIAG_ENCL_LIBS) encl_led: $(ENCL_LED_OBJS) @echo "LD $(WORK_DIR)/$@" @$(CC) $(CFLAGS) -o $@ $^ diag_encl.o: encl_util.h diag_encl.h 7031_D24_T24.o: diag_encl.h bluehawk.o: encl_util.h bluehawk.h diag_encl.h encl_util.o: encl_util.h encl_led.o: encl_util.h bluehawk.h install: all @$(call install_sbin,diag_encl,$(DESTDIR)) @$(call install_sbin,encl_led,$(DESTDIR)) @$(foreach d,$(SUBDIRS), $(MAKE) -C $d install) uninstall: @$(call uninstall_sbin,diag_encl,$(DESTDIR)) @$(call uninstall_sbin,encl_led,$(DESTDIR)) @$(foreach d,$(SUBDIRS), $(MAKE) -C $d uninstall) doc: $(DOXYGEN_CFG) @echo "Creating doxygen docs for diag_encl" @$(DOXYGEN) $(DOXYGEN_CFG) clean: @echo "Cleaning up $(WORK_DIR) files..." @rm -rf $(PROGS) *.o ppc64-diag-2.6.4/diags/encl_led.h0000644000000000000000000000054212313010662015057 0ustar rootroot/* Copyright (C) 2012 IBM Corporation */ #ifndef _ENCL_LED_H #define _ENCL_LED_H #define LED_SAME -1 #define LED_OFF 0 #define LED_ON 1 extern const char *progname; int open_sg_device(const char *); int bluehawk_list_leds(const char *, const char *, int); int bluehawk_set_led(const char *, const char *, int, int, int); #endif /* _ENCL_LED_H */ ppc64-diag-2.6.4/diags/diag_encl.c0000644000000000000000000003373712313010662015226 0ustar rootroot/* Copyright (C) 2009, 2012 IBM Corporation */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "encl_util.h" #include "diag_encl.h" #include "platform.c" static struct option long_options[] = { {"cmp_prev", no_argument, NULL, 'c'}, {"fake", required_argument, NULL, 'f'}, {"help", no_argument, NULL, 'h'}, {"leds", no_argument, NULL, 'l'}, {"serv_event", no_argument, NULL, 's'}, {"verbose", no_argument, NULL, 'v'}, {"version", no_argument, NULL, 'V'}, {0, 0, 0, 0} }; struct cmd_opts cmd_opts; static struct { char *mtm; int (*func)(int, struct dev_vpd *); } encl_diags[] = { {"7031-D24/T24", diag_7031_D24_T24}, /* Pearl enclosure */ {"5888", diag_bluehawk}, /* Bluehawk enclosure */ {"EDR1", diag_bluehawk}, /* Bluehawk enclosure */ {NULL, NULL}, }; /** * print_usage * @brief Print the usage message for this command * * @param name the name of this executable */ static void print_usage(const char *name) { printf("Usage: %s [-h] [-V] [-s [-c][-l]] [-v] [-f ]" " []\n" "\n\t-h: print this help message\n" "\t-s: generate serviceable events for any failures and\n" "\t write events to the servicelog\n" "\t-c: compare with previous status; report only new failures\n" "\t-l: turn on fault LEDs for serviceable events\n" "\t-v: verbose output\n" "\t-V: print the version of the command and exit\n" "\t-f: for testing, read SES data from path.pg2 and VPD\n" "\t from path.vpd\n" "\t: the sg device on which to operate, such\n" "\t as sg7; if not specified, all such\n" "\t devices will be diagnosed\n", name); } /** * print_raw_data * @brief Dump a section of raw data * * @param ostream stream to which output should be written * @param data pointer to data to dump * @param data_len length of data to dump * @return number of bytes written */ int print_raw_data(FILE *ostream, char *data, int data_len) { char *h, *a; char *end = data + data_len; unsigned int offset = 0; int i, j; int len = 0; len += fprintf(ostream, "\n"); h = a = data; while (h < end) { /* print offset */ len += fprintf(ostream, "0x%04x: ", offset); offset += 16; /* print hex */ for (i = 0; i < 4; i++) { for (j = 0; j < 4; j++) { if (h < end) len += fprintf(ostream, "%02x", *h++); else len += fprintf(ostream, " "); } len += fprintf(ostream, " "); } /* print ascii */ len += fprintf(ostream, " ["); for (i = 0; i < 16; i++) { if (a <= end) { if ((*a >= ' ') && (*a <= '~')) len += fprintf(ostream, "%c", *a); else len += fprintf(ostream, "."); a++; } else len += fprintf(ostream, " "); } len += fprintf(ostream, "]\n"); } return len; } /** * add_callout * @brief Create a new sl_callout struct * * @param callouts address of pointer to callout list * @param priority callout priority * @param type callout type * @param proc_id callout procedure ID * @param location callout location code * @param fru callout FRU number * @param sn callout FRU serial number * @param ccin callout FRU ccin */ void add_callout(struct sl_callout **callouts, char priority, uint32_t type, char *proc_id, char *location, char *fru, char *sn, char *ccin) { struct sl_callout *c; if (*callouts == NULL) { *callouts = (struct sl_callout *)malloc(sizeof (struct sl_callout)); c = *callouts; } else { c = *callouts; while (c->next != NULL) c = c->next; c->next = (struct sl_callout *)malloc(sizeof (struct sl_callout)); c = c->next; } if (c == NULL) { fprintf(stderr, "Out of memory\n"); return; } memset(c, 0, sizeof(struct sl_callout)); c->priority = priority; c->type = type; if (proc_id) { c->procedure = (char *)malloc(strlen(proc_id) + 1); strcpy(c->procedure, proc_id); } if (location) { c->location = (char *)malloc(strlen(location) + 1); strcpy(c->location, location); } if (fru) { c->fru = (char *)malloc(strlen(fru) + 1); strcpy(c->fru, fru); } if (sn) { c->serial = (char *)malloc(strlen(sn) + 1); strcpy(c->serial, sn); } if (ccin) { c->ccin = (char *)malloc(strlen(ccin) + 1); strcpy(c->ccin, ccin); } } /** * servevent * @brief Generate a serviceable event and an entry to the servicelog * * @param refcode the SRN or SRC for the serviceable event * @param sev the severity of the event * @param text the description of the serviceable event * @param vpd a structure containing the VPD of the target * @param callouts a linked list of FRU callouts * @return key of the new servicelog entry */ uint32_t servevent(char *refcode, int sev, char *text, struct dev_vpd *vpd, struct sl_callout *callouts) { struct servicelog *slog; struct sl_event *entry = NULL; struct sl_data_enclosure *encl = NULL; uint64_t key; int rc; if ((refcode == NULL) || (text == NULL) || (vpd == NULL)) return 0; entry = (struct sl_event *)malloc(sizeof(struct sl_event)); if (entry == NULL) { fprintf(stderr, "Out of memory\n"); return 0; } memset(entry, 0, sizeof(struct sl_event)); encl = (struct sl_data_enclosure *)malloc( sizeof(struct sl_data_enclosure)); if (encl == NULL) { fprintf(stderr, "Out of memory\n"); return 0; } memset(encl, 0, sizeof(struct sl_data_enclosure)); entry->addl_data = encl; entry->time_event = time(NULL); entry->type = SL_TYPE_ENCLOSURE; entry->severity = sev; entry->disposition = SL_DISP_UNRECOVERABLE; entry->serviceable = 1; entry->call_home_status = SL_CALLHOME_CANDIDATE; entry->description = (char *)malloc(strlen(text) + 1); strcpy(entry->description, text); entry->refcode = (char *)malloc(strlen(refcode) + 1); strcpy(entry->refcode, refcode); encl->enclosure_model = (char *)malloc(strlen(vpd->mtm) + 1); strcpy(encl->enclosure_model, vpd->mtm); encl->enclosure_serial = (char *)malloc(strlen(vpd->sn) + 1); strcpy(encl->enclosure_serial, vpd->sn); entry->callouts = callouts; rc = servicelog_open(&slog, 0); if (rc != 0) { fprintf(stderr, servicelog_error(slog)); return 0; } rc = servicelog_event_log(slog, entry, &key); servicelog_event_free(entry); servicelog_close(slog); if (rc != 0) { fprintf(stderr, servicelog_error(slog)); return 0; } return key; } /* * Given pg2_path = /some/file.pg2, extract the needed VPD values from * /some/file.vpd. */ static int read_fake_vpd(struct dev_vpd *vpd, const char *pg2_path) { char *vpd_path, *dot; char *result; FILE *f; vpd_path = strdup(pg2_path); assert(vpd_path); dot = strrchr(vpd_path, '.'); assert(dot && !strcmp(dot, ".pg2")); strcpy(dot, ".vpd"); f = fopen(vpd_path, "r"); if (!f) { perror(vpd_path); free(vpd_path); return -1; } result = fgets_nonl(vpd->mtm, 128, f); if (!result) goto missing_vpd; result = fgets_nonl(vpd->full_loc, 128, f); if (!result) goto missing_vpd; result = fgets_nonl(vpd->sn, 128, f); if (!result) goto missing_vpd; result = fgets_nonl(vpd->fru, 128, f); if (!result) goto missing_vpd; fclose(f); free(vpd_path); trim_location_code(vpd); return 0; missing_vpd: fprintf(stderr, "%s lacks acceptable mtm, location code, serial number," " and FRU number.\n", vpd_path); fclose(f); free(vpd_path); return -1; } #define DIAG_ENCL_PREV_PAGES_DIR "/etc/ppc64-diag/ses_pages/" static void make_prev_path(const char *encl_loc) { free(cmd_opts.prev_path); cmd_opts.prev_path = (char *) malloc(sizeof(DIAG_ENCL_PREV_PAGES_DIR) + strlen(encl_loc) + 4); strcpy(cmd_opts.prev_path, DIAG_ENCL_PREV_PAGES_DIR); strcat(cmd_opts.prev_path, encl_loc); strcat(cmd_opts.prev_path, ".pg2"); } static void free_dev_vpd(struct dev_vpd *vpd) { struct dev_vpd *tmp; while (vpd) { tmp = vpd; vpd = vpd->next; free(tmp); } } /* * enclosure_maint_mode * @brief Check the state of SCSI enclosure * * Returns: * -1 on failure * 1 if sg is offline * 0 if sg is running */ static int enclosure_maint_mode(const char *sg) { char devsg[128], sgstate[128]; FILE *fp; snprintf(devsg, 128, "/sys/class/scsi_generic/%s/device/state", sg); fp = fopen(devsg, "r"); if (!fp) { perror(devsg); fprintf(stderr, "Unable to open enclosure " "state file : %s\n", devsg); return -1; } if (fgets_nonl(sgstate, 128, fp) == NULL) { fprintf(stderr, "Unable to read the state of " "enclosure device : %s\n", sg); fclose(fp); return -1; } /* Check device state */ if (!strcmp(sgstate, "offline")) { fprintf(stderr, "Enclosure \"%s\" is offline." " Cannot run diagnostics.\n", sg); fclose(fp); return 1; } fclose(fp); return 0; } /** * diagnose * @brief Diagnose a specific SCSI generic enclosure * * @param sg the SCSI generic device to diagnose (e.g. "sg7") * @return 0 for no failure, 1 if there is a failure on the enclosure */ static int diagnose(const char *sg, struct dev_vpd **diagnosed) { int rc = 0, fd, found = 0, i; char devsg[128]; struct dev_vpd *vpd = NULL; struct dev_vpd *v; /* Validate sg device */ rc = valid_enclosure_device(sg); if (rc) return -1; printf("DIAGNOSING %s\n", sg); vpd = (struct dev_vpd *)malloc(sizeof(struct dev_vpd)); if (vpd == NULL) { fprintf(stderr, "Out of memory\n"); return 1; } memset(vpd, 0, sizeof(struct dev_vpd)); if (cmd_opts.fake_path) rc = read_fake_vpd(vpd, cmd_opts.fake_path); else rc = read_vpd_from_lscfg(vpd, sg); if (vpd->mtm[0] == '\0') { fprintf(stderr, "Unable to find machine type/model for %s\n", sg); goto error_out; } if (cmd_opts.serv_event && vpd->location[0] == '\0') { fprintf(stderr, "Unable to find location code for %s; needed " "for -s\n", sg); goto error_out; } if (rc != 0) fprintf(stderr, "Warning: unable to find all relevant VPD for " "%s\n", sg); printf("\tModel : %s\n\tLocation : %s\n\n", vpd->mtm, vpd->full_loc); for (i = 0; encl_diags[i].mtm; i++) { if (!strcmp(vpd->mtm, encl_diags[i].mtm)) { for (v = *diagnosed; v; v = v->next) { if (!strcmp(v->location, vpd->location)) { printf("\t(Enclosure already diagnosed)\n\n"); free(vpd); return 0; } } /* fake patch ? */ if (cmd_opts.fake_path) fd = -1; else { /* Skip diagnostics if the enclosure is * temporarily disabled for maintenance. */ if (enclosure_maint_mode(sg)) goto error_out; /* Open sg device */ snprintf(devsg, 128, "/dev/%s", sg); fd = open(devsg, O_RDWR); if (fd <= 1) { fprintf(stderr, "Unable to open %s\n\n", devsg); goto error_out; } } /* diagnose */ if (cmd_opts.serv_event) make_prev_path(vpd->location); found = 1; rc += encl_diags[i].func(fd, vpd); if (fd != -1) close(fd); break; } } if (found) { vpd->next = *diagnosed; *diagnosed = vpd; } else { free(vpd); fprintf(stderr, "\tUnable to diagnose devices of machine " "type/model: %s\n\n", vpd->mtm); } return rc; error_out: free(vpd); return 1; } int main(int argc, char *argv[]) { int failure = 0, option_index, rc; int platform = 0; char path[128]; DIR *edir, *sdir; struct dirent *sdirent, *edirent; struct dev_vpd *diagnosed = NULL; platform = get_platform(); if (platform != PLATFORM_PSERIES_LPAR) { fprintf(stderr, "%s is not supported on the %s platform\n", argv[0], __power_platform_name(platform)); return -1; } memset(&cmd_opts, 0, sizeof(cmd_opts)); for (;;) { option_index = 0; rc = getopt_long(argc, argv, "cf:hlsvV", long_options, &option_index); if (rc == -1) break; switch (rc) { case 'c': cmd_opts.cmp_prev = 1; break; case 'f': if (cmd_opts.fake_path) { fprintf(stderr, "Multiple -f options not " "supported.\n"); return -1; } cmd_opts.fake_path = optarg; break; case 'h': print_usage(argv[0]); return 0; case 'l': cmd_opts.leds = 1; break; case 's': cmd_opts.serv_event = 1; break; case 'v': cmd_opts.verbose = 1; break; case 'V': printf("%s %s\n", argv[0], VERSION); return 0; case '?': print_usage(argv[0]); return -1; default: /* Shouldn't get here. */ fprintf(stderr, "huh?\n"); print_usage(argv[0]); return -1; } } if (cmd_opts.cmp_prev && !cmd_opts.serv_event) { fprintf(stderr, "No -c option without -s\n"); return -1; } if (cmd_opts.leds && !cmd_opts.serv_event) { fprintf(stderr, "No -l option without -s\n"); return -1; } if ((cmd_opts.serv_event || cmd_opts.leds) && geteuid() != 0) { fprintf(stderr, "-s and -l options require superuser " "privileges\n"); return -1; } if (cmd_opts.fake_path) { const char *dot = strrchr(cmd_opts.fake_path, '.'); if (!dot || strcmp(dot, ".pg2") != 0) { fprintf(stderr, "Name of file with fake diagnostic " "data must end in '.pg2'.\n"); return -1; } if (optind + 1 != argc) { fprintf(stderr, "Please specify an sg device with the " "-f pathname. It need not be an " "enclosure.\n"); return -1; } failure += diagnose(argv[optind++], &diagnosed); } else if (optind < argc) { while (optind < argc) failure += diagnose(argv[optind++], &diagnosed); } else { edir = opendir(SCSI_SES_PATH); if (!edir) { fprintf(stderr, "System does not have SCSI enclsoure(s).\n"); return -1; } /* loop over all enclosures */ while ((edirent = readdir(edir)) != NULL) { if (!strcmp(edirent->d_name, ".") || !strcmp(edirent->d_name, "..")) continue; snprintf(path, 128, "%s/%s/device/scsi_generic", SCSI_SES_PATH, edirent->d_name); sdir = opendir(path); if (!sdir) continue; while ((sdirent = readdir(sdir)) != NULL) { if (!strcmp(sdirent->d_name, ".") || !strcmp(sdirent->d_name, "..")) continue; /* run diagnostics */ failure += diagnose(sdirent->d_name, &diagnosed); } closedir(sdir); } /* outer while loop */ closedir(edir); } free(cmd_opts.prev_path); free_dev_vpd(diagnosed); return failure; } ppc64-diag-2.6.4/diags/7031_D24_T24.c0000644000000000000000000003155712313010662014753 0ustar rootroot/* Copyright (C) 2009, 2012 IBM Corporation */ #include #include #include #include #include "encl_util.h" #include "diag_encl.h" #define OK 0 #define EMPTY -1 #define FAULT_CRITICAL 1 #define FAULT_NONCRITICAL 2 #define CRIT_PS 0x120 #define CRIT_FAN 0x130 #define CRIT_REPEATER 0x150 #define CRIT_VPD 0x160 #define UNRECOVER_PS 0x220 #define UNRECOVER_FAN 0x230 #define REDUNDANT 0x310 #define NONCRIT_PS 0x320 #define NONCRIT_FAN 0x330 struct pearl_diag_page2 { uint32_t page_code:8; uint32_t health_status:8; uint32_t page_length:16; uint32_t reserved:32; uint32_t drive_status_overall:32; uint32_t drive_status1:32; uint32_t drive_status2:32; uint32_t drive_status3:32; uint32_t drive_status4:32; uint32_t drive_status5:32; uint32_t drive_status6:32; uint32_t power_status_overall:32; uint32_t power_status1:32; uint32_t power_status2:32; uint32_t fan_status_overall:32; uint32_t fan_status1:32; uint32_t fan_status2:32; uint32_t fan_status3:32; uint32_t repeater_status:32; uint32_t vpd_card_status:32; }; /** * get_enclosure_scsi_id * @brief Retrieve the SCSI ID for the Pearl enclosure * * @param dp the diagnostic page from the enclosure * @return the SCSI ID of the enclosure */ static int get_enclosure_scsi_id(struct pearl_diag_page2 *dp) { return ((dp->repeater_status & 0x000F0000) >> 16); } /** * print_drive status * @brief Print the status of a drive in the enclosure * * @param status the status of the drive from the diagnostic page * @return OK, EMPTY, FAULT_NONCRITICAL, or FAULT_CRITICAL */ static int print_drive_status(uint32_t status) { int fail = 0, printed = 0, rc = OK; if ((status & 0x0F000000) == 0x05000000) { printf("(empty) "); rc = EMPTY; } else if ((status & 0x40000000) || (status & 0x00000040) || (status & 0x00000020)) fail = 1; else printf("ok "); if (status & 0x40000000) { printf("PREDICTIVE_FAIL"); rc = FAULT_NONCRITICAL; printed = 1; } if (status & 0x00000040) { if (printed) printf (" | "); printf("FAULT_SENSED"); rc = FAULT_CRITICAL; printed = 1; } if (status & 0x00000020) { if (printed) printf (" | "); printf("FAULT_REQUESTED"); rc = FAULT_CRITICAL; printed = 1; } if (status & 0x00000800) { if (printed) printf (" | "); printf("INSERT"); printed = 1; } if (status & 0x00000400) { if (printed) printf (" | "); printf("REMOVE"); printed = 1; } if (status & 0x00000200) { if (printed) printf (" | "); printf("IDENTIFY"); printed = 1; } printf("\n"); return rc; } /** * print_ps_fan status * @brief Print the status of a power supply or fan in the enclosure * * @param status the status of the part from the diagnostic page * @return OK, EMPTY, FAULT_NONCRITICAL, or FAULT_CRITICAL */ static int print_ps_fan_status(uint32_t status) { int fail = 0, rc = OK; if ((status & 0x0F000000) == 0x01000000) printf("ok "); else if ((status & 0x0F000000) == 0x02000000) { printf("CRITICAL_FAULT"); rc = FAULT_CRITICAL; fail = 1; } else if ((status & 0x0F000000) == 0x03000000) { printf("NON_CRITICAL_FAULT"); rc = FAULT_NONCRITICAL; fail = 1; } else if ((status & 0x0F000000) == 0x05000000) { printf("(empty) "); rc = EMPTY; } if (status & 0x00000200) { if (fail) printf(" | "); printf("IDENTIFY"); } printf("\n"); return rc; } /** * print_repeater_status * @brief Print the status of the repeater and SCSI connectors in the enclosure * * @param status the status of the repeater from the diagnostic page * @return OK or FAULT_CRITICAL */ static int print_repeater_status(uint32_t status) { int printed = 0, fail = 0, rc = OK; if ((status & 0x0F000000) == 0x01000000) printf("ok "); else if ((status & 0x0F000000) == 0x02000000) { printf("CRITICAL_FAULT"); rc = FAULT_CRITICAL; fail = 1; printed = 1; } if (status & 0x00000040) { if (printed) printf (" | "); printf("FAULT_SENSED"); printed = 1; } if (status & 0x00000020) { if (printed) printf (" | "); printf("FAULT_REQUESTED"); printed = 1; } if (status & 0x00000400) { if (printed) printf(" | "); printf("DRAWER_IDENTIFY"); printed = 1; } if (status & 0x00000200) { if (printed) printf(" | "); printf("REPEATER_IDENTIFY"); printed = 1; } printf("\n\n SCSI Connector Status"); printf("\n Connector 1: "); if (((status & 0x0000000C) >> 2) == 0x00) printf("(empty)"); else if (((status & 0x0000000C) >> 2) == 0x01) printf("Connector installed. Cable not present."); else if (((status & 0x0000000C) >> 2) == 0x03) printf("ok"); printf("\n Connector 2: "); if ((status & 0x00000003) == 0x00) printf("(empty)"); else if ((status & 0x00000003) == 0x01) printf("Connector installed. Cable not present."); else if ((status & 0x00000003) == 0x03) printf("ok"); printf("\n"); return rc; } /** * print_vpd_card status * @brief Print the status of the VPD card in the enclosure * * @param status the status of the VPD card from the diagnostic page * @return OK or FAULT_CRITICAL */ static int print_vpd_card_status(uint32_t status) { int fail = 0, rc = OK; if ((status & 0x0F000000) == 0x01000000) printf("ok "); else if ((status & 0x0F000000) == 0x02000000) { printf("CRITICAL_FAULT"); rc = FAULT_CRITICAL; fail = 1; } if (status & 0x00000200) { if (fail) printf(" | "); printf("IDENTIFY"); } printf("\n"); return rc; } /** * pearl_servevent * @brief Generate a serviceable event for a fault found on a Pearl enclosure * * @param failtype the type of failure (CRIT_PS, REDUNDANT, etc) * @param devnum the number of the failed devices (e.g. 2 for the 2nd fan) * @param interface the SCSI ID of the enclosure * @param vpd structure containing the VPD of the enclosure */ static void pearl_servevent(int failtype, int devnum, int interface, struct dev_vpd *vpd) { char srn[16], *desc; struct sl_callout *callouts = NULL; int sev = SL_SEV_INFO; if (failtype == REDUNDANT) devnum = 1; /* build up the SRN */ snprintf(srn, 16, "807-%03X", failtype + ((devnum - 1) * 4) + (interface - 1)); switch(failtype) { case CRIT_PS: desc = "A critical power supply failure has occurred. " "Refer to the system service documentation for more " "information."; sev = SL_SEV_ERROR; break; case CRIT_FAN: desc = "A critical fan failure has occurred. " "Refer to the system service documentation for more " "information."; sev = SL_SEV_ERROR; break; case CRIT_REPEATER: desc = "A critical repeater card failure has occurred. " "Refer to the system service documentation for more " "information."; sev = SL_SEV_ERROR; break; case CRIT_VPD: desc = "A critical vpd module failure has occurred. " "Refer to the system service documentation for more " "information."; sev = SL_SEV_ERROR; break; case UNRECOVER_PS: desc = "An unrecoverable power supply failure has occurred. " "Refer to the system service documentation for more " "information."; sev = SL_SEV_ERROR; break; case UNRECOVER_FAN: desc = "An unrecoverable fan failure has occurred. " "Refer to the system service documentation for more " "information."; sev = SL_SEV_ERROR; break; case REDUNDANT: desc = "There is a redundant power supply or fan failure. " "Refer to the system service documentation for more " "information."; sev = SL_SEV_WARNING; break; case NONCRIT_PS: desc = "A non-critical power supply failure has occurred. " "Refer to the system service documentation for more " "information."; sev = SL_SEV_WARNING; break; case NONCRIT_FAN: desc = "A non-critical fan failure has occurred. " "Refer to the system service documentation for more " "information."; sev = SL_SEV_WARNING; break; default: desc = "Unknown failure."; break; } add_callout(&callouts, ' ', 0, "n/a", vpd->location, vpd->fru, "", ""); servevent(srn, sev, desc, vpd, callouts); return; } /** * diag_7031_D24_T24 * @brief Diagnose an enclosure with MTM 7031-D24/T24 (a.k.a. Pearl) * * @param fd a file descriptor to the SCSI generic file (e.g. /dev/sg7) * @param vpd structure containing the VPD of the enclosure * @return 0 if no faults were found, or 1 if faults were found */ int diag_7031_D24_T24(int fd, struct dev_vpd *vpd) { struct pearl_diag_page2 dp; int failure = 0, rc, encl_id; int buf_len = sizeof(dp); int ps1, ps2, fan1, fan2, fan3, rpt, vpd_card; if (cmd_opts.fake_path) { fprintf(stderr, "No support for -f option with " "enclosure type %s\n", vpd->mtm); return 1; } /* Usage warning and continue diagnostics */ if (cmd_opts.cmp_prev || cmd_opts.leds) fprintf(stderr, "Option(s) ignored : No support for -c or -l " "options with enclosure type %s\n", vpd->mtm); /* the necessary data is on diagnostic page 2 */ rc = get_diagnostic_page(fd, RECEIVE_DIAGNOSTIC, 2, (void *)&dp, buf_len); encl_id = get_enclosure_scsi_id(&dp); printf(" Enclosure SCSI ID: %d\n", encl_id); printf(" Overall Status: "); if (dp.health_status == 0) printf("ok"); if (dp.health_status & 0x02) printf("CRITICAL_FAULT"); else if (dp.health_status & 0x04) printf("NON_CRITICAL_FAULT"); else if (dp.health_status & 0x06) printf("CRITICAL_FAULT | NON_CRITICAL_FAULT"); printf("\n\n Drive Status\n"); printf(" Slot SCSI ID %02d: ", (dp.drive_status1 & 0x000F0000)>>16); rc = print_drive_status(dp.drive_status1); printf(" Slot SCSI ID %02d: ", (dp.drive_status2 & 0x000F0000)>>16); rc = print_drive_status(dp.drive_status2); printf(" Slot SCSI ID %02d: ", (dp.drive_status3 & 0x000F0000)>>16); rc = print_drive_status(dp.drive_status3); printf(" Slot SCSI ID %02d: ", (dp.drive_status4 & 0x000F0000)>>16); rc = print_drive_status(dp.drive_status4); printf(" Slot SCSI ID %02d: ", (dp.drive_status5 & 0x000F0000)>>16); rc = print_drive_status(dp.drive_status5); printf(" Slot SCSI ID %02d: ", (dp.drive_status6 & 0x000F0000)>>16); rc = print_drive_status(dp.drive_status6); printf("\n Power Supply Status\n"); printf(" Power Supply 1: "); ps1 = print_ps_fan_status(dp.power_status1); printf(" Power Supply 2: "); ps2 = print_ps_fan_status(dp.power_status2); printf("\n Fan Status\n"); printf(" Fan 1: "); fan1 = print_ps_fan_status(dp.fan_status1); printf(" Fan 2: "); fan2 = print_ps_fan_status(dp.fan_status2); printf(" Fan 3: "); fan3 = print_ps_fan_status(dp.fan_status3); printf("\n Repeater Status: "); rpt = print_repeater_status(dp.repeater_status); printf("\n VPD Card Status: "); vpd_card = print_vpd_card_status(dp.vpd_card_status); if (cmd_opts.verbose) { printf("\n\nRaw diagnostic page:\n"); print_raw_data(stdout, (char *)&dp, buf_len); } printf("\n"); if ((ps1 > 0) || (ps2 > 0) || (fan1 > 0) || (fan2 > 0) || (fan3 > 0) || (rpt > 0) || (vpd_card > 0)) failure = 1; if (failure && cmd_opts.serv_event) { /* Generate serviceable event(s) */ /* Check power supply 1 */ if (ps1 == FAULT_CRITICAL) { if (ps2 != OK) pearl_servevent(CRIT_PS, 1, encl_id, vpd); else pearl_servevent(REDUNDANT, 1, encl_id, vpd); } else if (ps1 == FAULT_NONCRITICAL) { if (ps2 != OK) pearl_servevent(NONCRIT_PS, 1, encl_id, vpd); else pearl_servevent(REDUNDANT, 1, encl_id, vpd); } /* Check power supply 2 */ if (ps2 == FAULT_CRITICAL) { if (ps1 != OK) pearl_servevent(CRIT_PS, 2, encl_id, vpd); else pearl_servevent(REDUNDANT, 2, encl_id, vpd); } else if (ps2 == FAULT_NONCRITICAL) { if (ps1 != OK) pearl_servevent(NONCRIT_PS, 2, encl_id, vpd); else pearl_servevent(REDUNDANT, 2, encl_id, vpd); } /* Check fan 1 */ if (fan1 == FAULT_CRITICAL) { if ((fan2 != OK) || (fan3 != OK)) pearl_servevent(CRIT_FAN, 1, encl_id, vpd); else pearl_servevent(REDUNDANT, 1, encl_id, vpd); } else if (fan1 == FAULT_NONCRITICAL) { if ((fan2 != OK) || (fan3 != OK)) pearl_servevent(NONCRIT_FAN, 1, encl_id, vpd); else pearl_servevent(REDUNDANT, 1, encl_id, vpd); } /* Check fan 2 */ if (fan2 == FAULT_CRITICAL) { if ((fan1 != OK) || (fan3 != OK)) pearl_servevent(CRIT_FAN, 2, encl_id, vpd); else pearl_servevent(REDUNDANT, 2, encl_id, vpd); } else if (fan2 == FAULT_NONCRITICAL) { if ((fan1 != OK) || (fan3 != OK)) pearl_servevent(NONCRIT_FAN, 2, encl_id, vpd); else pearl_servevent(REDUNDANT, 2, encl_id, vpd); } /* Check fan 3 */ if (fan3 == FAULT_CRITICAL) { if ((fan1 != OK) || (fan2 != OK)) pearl_servevent(CRIT_FAN, 3, encl_id, vpd); else pearl_servevent(REDUNDANT, 3, encl_id, vpd); } else if (fan3 == FAULT_NONCRITICAL) { if ((fan1 != OK) || (fan2 != OK)) pearl_servevent(NONCRIT_FAN, 3, encl_id, vpd); else pearl_servevent(REDUNDANT, 3, encl_id, vpd); } /* Check repeater card */ if (rpt == FAULT_CRITICAL) { pearl_servevent(CRIT_REPEATER, 1, encl_id, vpd); } /* Check VPD card */ if (vpd_card == FAULT_CRITICAL) { pearl_servevent(CRIT_VPD, 1, encl_id, vpd); } } return failure; } ppc64-diag-2.6.4/diags/doc/0000755000000000000000000000000012313010662013705 5ustar rootrootppc64-diag-2.6.4/diags/doc/diag_encl.8.gz0000644000000000000000000000172212313010662016324 0ustar rootroot‹áÌIPdiag_encl.8•UKoã6¾óW |‰ 8B›Ó- $¶ÑU‘MŒÈ(PÔAI#‹ˆDª$%¯ö×w†’Ÿé¥‡8ä<¿ùf8жm'°0MoÕ¾ô0]Ìàá§Ÿ ~úFbÛ+½2šÍD´ù Ëøñ÷Ýêeñ _`òG[õÁ|ÏJ·ßa²6´Ãy©ä^çUc*GþÉWxyü¶9©v¨³ î!Ì’E k-º`üõòºNâDDºÛâéì¸-Þþ&ÁöÞÑ †cFÇ÷áXññ}”w|Ï›ÿº-âFú’$Q³ ÑoƒÞíI£Ù$Š¢÷ëŒ÷÷ZG\úVSbÕ°8*TÀ½\%‹·x½‰__ĦD=ÁÉ\d¦®¥ÎÁ"±ëøÁyé[¦·NZeèJ–ѨýIÃ$‰IS7×`¦ …9¤=›P®Ü´È±S‚–5F".@›3àÜÙy²ªn[Ú4x3@ìÇZHòc‰h}S[k-ᥱpm3”'¡Rµ"kÐm¢åRÎ |ßP¯/éÐZcA Ýù€Ó”¶Õ3³×êëÈ? œ¿ºiT6kqž Š.tEÛí°#tÜ©·ÂõPȶâ6Œe’ÑV™=äÒËT:ŽŒ™]ÇÌêf×Xì."]C–’RP•0%·Rv)¡¯jCŠÌ*z ²š §45‹TÒy𪾛ƒt`[ å˱Ñ@U Óð½ÀX]c¬0g&ÄÆö¡ÆÖj2˜ tN½Hw Þ£;®©ÌdDŠ ñbÿè¼øèÚ¸ŸŒÒ;¡2&3Ð:Xî„“@ÍkÆLIš%w1\l²?‹Þòn žæ'+«év¨|K–ìµÚIˆu/ÀöH¹ Í9¸=h¶™ м™ÇcP& ¢Ç0;A ³ Êé3/J%†À¡$Ùƒ«ÊR‡Ø Ü9Qlé+5Z‹sRüòÖ(%ì%1«ûw¢Ö V(ü:ð¦_‡„ýÒ¥€UÁ §*åÜ!­>–ÉØïßO&“äêjœü:¾þîÝä‡!#}aRÔ ßá.…«q²J©ÿ6ZŽGÓëÑÍxÈ«&ÁúW­¤FÖQǧbÁ“©V¢+$ÐÀ†N¬ ¶ ÷qú RD)4•1Ž|;Íø q uË¡E(ø‘¡ʢsA¹õ¢ÅGÙ’L¼, ÇS.Qª)w¶Æç§©lÕf­çt`[m·È *Ùy_‡5, :Qr\Áâ¥ì¨ — –¤Wc+pi×s÷•’´È$Rº!4GRަ ´h3 [„K©Ó u ­ê5¾²6œ„) üPŸ²{¬«b+hµuì¥pAM>$pkQõ$v÷ýå.¾2Ô4¨´©Ùkù7¡ÕÒέ{C%£ IåÕÆSïyš ç$õñÂÛÕ°_<¬g?²™Ž„ò¨üÉñ—©¼óÈ:ê„ ›„§4#Ž Ûóϧ9xuån® wdv¶óbÚ¥˜„‡ã!¼«øhÌÛ–Ô»×IÌÃQFe¬K@ïõ’…-Cjÿ`8zǰ®Á†VŠös{ÂÖZoÜ™ÐÛ§©._úøóò¾êÓ[C€A-}ȇ:oΊ‹áZ} hšÚ‡~€ƒ°[ÅXZ³«°Ùµ­¶“ÊÊwü?~áï°1ä']©PD¤67¼šòYvñò>^.TÉHÜ}*Ç÷H µLÿOþÿ |Tä ppc64-diag-2.6.4/diags/doc/Makefile0000644000000000000000000000040412313010662015343 0ustar rootroot# # Makefile for ppc64-diag/diags/doc # include ../../rules.mk MANPAGES = diag_encl.8.gz encl_led.8.gz DOXYGEN_CFG = doxygen.config all: install: all @$(call install_man,$(MANPAGES),$(DESTDIR)) uninstall: @$(call uninstall_man,$(MANPAGES),$(DESTDIR)) ppc64-diag-2.6.4/diags/encl_util.h0000644000000000000000000000156012313010662015271 0ustar rootroot/* * Copyright (C) 2012 IBM Corporation */ #ifndef _ENCL_UTIL_H #define _ENCL_UTIL_H #include /* SES sys path */ #define SCSI_SES_PATH "/sys/class/enclosure" /* device vpd */ struct dev_vpd { char mtm[128]; char location[128]; /* like full_loc, but truncated at '-' */ char full_loc[128]; char sn[128]; char fru[128]; struct dev_vpd *next; }; extern int do_ses_cmd(int fd, uint8_t cmd, uint8_t page_nr, uint8_t flags, uint8_t cmd_len, int dxfer_direction, void *buf, int buf_len); extern int get_diagnostic_page(int fd, uint8_t cmd, uint8_t page_nr, void *buf, int buf_len); extern char *fgets_nonl(char *buf, int size, FILE *s); extern int read_vpd_from_lscfg(struct dev_vpd *vpd, const char *sg); extern void trim_location_code(struct dev_vpd *vpd); extern int valid_enclosure_device(const char *sg); #endif /* _ENCL_UTIL_H */ ppc64-diag-2.6.4/rtas_errd/0000755000000000000000000000000012313010662014036 5ustar rootrootppc64-diag-2.6.4/rtas_errd/fru_prev6.h0000644000000000000000000000357112313010662016133 0ustar rootroot/** * @file fru_prev6.h * * Copyright (C) 2008 IBM Corporation */ #ifndef _H_FRU_PREV6 #define _H_FRU_PREV6 #define NAMESIZE 16 #define LOCSIZE 80 #define MAXFRUS 4 #define ERRD1 4 #define ERRD2 5 /* * A fru_callout_pre_v6 represents a field replaceable unit callout that * is associated with an RTAS event (prior to version 6, which is handled * differently). * * conf confidence (probability) associated with the FRU callout. * * fname device name or configuration database keyword associated * with the field replaceable unit that is being reported. * * floc location associated with fname */ struct fru_callout_pre_v6{ int conf; /* probability of failure */ char fname[NAMESIZE]; /* FRU name */ char floc[LOCSIZE]; /* location of fname */ short fmsg; /* text message number for fname */ }; /* * An event_description_pre_v6 struct represents the outcome of the * analysis of an RTAS event (prior to version 6 events, which are * handled differently). * * flags indicates the type of error description being added to the * system. The following values are defined. * * ERRD1 The Error Description identifies the * resource that failed, its parent, and any cables * needed to attach the resource to its parent. * * ERRD2 Similar to ERRD1, but does not include the * parent resource. * * sn source number of the failure. * * rcode reason code associated with the failure. * * rmsg message number of the reason code text. * * frus an array identifying the field replaceable unit callouts * associated with this event. */ struct event_description_pre_v6 { char dname[NAMESIZE]; /* device name */ short flags; short sn; /* source number of the failure */ short rcode; /* reason code for the failure */ char *rmsg; /* failure description */ struct fru_callout_pre_v6 frus[MAXFRUS]; }; #endif ppc64-diag-2.6.4/rtas_errd/hotplug.c0000644000000000000000000000662012313010662015670 0ustar rootroot/** * @file hotplug.c * * Copyright (C) 2013 IBM Corporation */ #include #include #include #include #include #include #include #include "rtas_errd.h" #define DRMGR_PROGRAM "/usr/sbin/drmgr" #define DRMGR_PROGRAM_NOPATH "drmgr" void handle_hotplug_event(struct event *re) { struct rtas_event_hdr *rtas_hdr = re->rtas_hdr; struct rtas_hotplug_scn *hotplug; pid_t child; int status, rc; char drc_index[11]; char *drmgr_args[] = { DRMGR_PROGRAM_NOPATH, "-c", NULL, NULL, NULL, NULL, NULL, "-d4", "-V", NULL}; /* Retrieve Hotplug section */ if (rtas_hdr->version >= 6) { hotplug = rtas_get_hotplug_scn(re->rtas_event); /* Build drmgr argument list */ dbg("Build drmgr command\n"); switch (hotplug->type) { case RTAS_HP_TYPE_PCI: drmgr_args[2] = "pci"; drmgr_args[6] = "-n"; break; default: dbg("Unknown or unsupported hotplug type %d\n", hotplug->type); return; } switch (hotplug->action) { case RTAS_HP_ACTION_ADD: drmgr_args[3] = "-a"; break; case RTAS_HP_ACTION_REMOVE: drmgr_args[3] = "-r"; break; default: dbg("Unknown hotplug action %d\n", hotplug->action); return; } switch (hotplug->identifier) { case RTAS_HP_ID_DRC_INDEX: drmgr_args[4] = "-s"; snprintf(drc_index, 11, "%#x", hotplug->u1.drc_index); drmgr_args[5] = drc_index; break; default: dbg("Unknown or unsupported hotplug identifier %d\n", hotplug->identifier); return; } dbg("run: %s %s %s %s %s %s %s\n", drmgr_args[0], drmgr_args[1], drmgr_args[2], drmgr_args[3], drmgr_args[4], drmgr_args[5], drmgr_args[6]); /* invoke drmgr */ dbg("Invoke drmgr command\n"); child = fork(); if (child == -1) { log_msg(NULL, "%s cannot be run to handle a hotplug event, %s", DRMGR_PROGRAM, strerror(errno)); return; } else if (child == 0) { /* child process */ rc = execv(DRMGR_PROGRAM, drmgr_args); /* shouldn't get here */ log_msg(NULL, "Couldn not exec %s in response to hotplug event, %s", DRMGR_PROGRAM, strerror(errno)); exit(1); } child = waitpid(child, &status, 0); dbg("drmgr call exited with %d\n", WEXITSTATUS(status)); } } ppc64-diag-2.6.4/rtas_errd/dchrp.h0000644000000000000000000002063612313010662015316 0ustar rootroot/** * @file dchrp.h * * Copyright (C) 2005 IBM Corporation */ #ifndef _H_DCHRP #define _H_DCHRP /* * Error log identifiers that are built as follows: * * bit number: * 3322222222221111111111 * 10987654321098765432109876543210 * -------------------------------- * 0000 * ---- * | -------- * | | * | | -------- * | | | -------- * | | | | * | | | if cpu, mem, post or io format * | | | extended log byte 12 * | | | if epow format * | | | extended log byte 15 * | | | if sp format * | | | extended log byte 16 * | | | * | | if mem, post or io format * | | extended log byte 13 * | | if sp format * | | extended log byte 17 * | | if epow format * | | extended log byte 16 * | | * | if sp format * | extended log byte 18 * | if epow format * | extended log byte 17 * | * extended log byte 2, bits 4:7 * * * and each ID is labeled xxxByybz where xxx= format,yy=byte #,z=bit # * and Byybz is repeated as often as necessary * */ #define CPUB12b0 0x01000080 #define CPUB12b1 0x01000040 #define CPUB12b2 0x01000020 #define CPUB12b3 0x01000010 #define CPUB12b4 0x01000008 #define CPUB12b5 0x01000004 #define CPUB12b6 0x01000002 #define CPUB12b7 0x01000001 #define CPUALLZERO 0x01000000 #define MEMB12b0 0x02000080 #define MEMB12b1 0x02000040 #define MEMB12b2 0x02000020 #define MEMB12b3 0x02000010 #define MEMB12b4 0x02000008 #define MEMB12b4B13b3 0x02001008 #define MEMB12b5 0x02000004 #define MEMB12b6 0x02000002 #define MEMB12b7 0x02000001 #define MEMB13b0 0x02008000 #define MEMB13b1 0x02004000 #define MEMB13b2 0x02002000 #define MEMB13b3 0x02001000 #define MEMB13b4 0x02000800 #define MEMALLZERO 0x02000000 #define IOB12b0 0x03000080 #define IOB12b1 0x03000040 #define IOB12b2 0x03000020 #define IOB12b3 0x03000010 #define IOB12b3B13b2 0x03002010 #define IOB12b4 0x03000008 #define IOB12b5 0x03000004 #define IOB12b6 0x03000002 #define IOB12b7 0x03000001 #define IOB12b5B13b0 0x03008004 #define IOB12b6B13b0 0x03008002 #define IOB12b7B13b0 0x03008001 #define IOB12b5B13b1 0x03004004 #define IOB12b6B13b1 0x03004002 #define IOB12b7B13b1 0x03004001 #define IOB12b5B13b2 0x03002004 #define IOB12b6B13b2 0x03002002 #define IOB12b7B13b2 0x03002001 #define IOB12b6B13b3 0x03001002 #define IOB13b4 0x03000800 #define IOB13b5 0x03000400 #define IOB13b6 0x03000200 #define IOB13b7 0x03000100 #define IOALLZERO 0x03000000 #define POSTALLZERO 0x04000000 #define POSTB12b0 0x04000080 #define POSTB12b1 0x04000040 #define POSTB12b2 0x04000020 #define POSTB12b3 0x04000010 #define POSTB12b4 0x04000008 #define POSTB12b5 0x04000004 #define POSTB12b6 0x04000002 #define POSTB12b7 0x04000001 #define POSTB13b0 0x04008000 #define POSTB13b1 0x04004000 #define POSTB13b2 0x04002000 #define POSTB13b3 0x04001000 #define POSTB13b4 0x04000800 #define POSTB13b5 0x04000400 #define POSTB13b7 0x04000100 #define EPOWB1501 0x05000001 #define EPOWB1501B16b2b4 0x05002801 #define EPOWB1502 0x05000002 #define EPOWB1502B16b4 0x05000802 #define EPOWB1503 0x05000003 #define EPOWB1503B16b23 0x05003003 #define EPOWB1503B16b3 0x05001003 #define EPOWB1504 0x05000004 #define EPOWB1505 0x05000005 #define EPOWB1505B16b1B17b1 0x05404005 #define EPOWB1505B16b1B17b2 0x05204005 #define EPOWB1505B16b1B17b3 0x05104005 #define EPOWB1502B16b4B17b2 0x05200802 #define EPOWB1502B16b1b4B17b2 0x05204802 #define EPOWB1507 0x05000007 #define SPB16b0 0x0D000080 #define SPB16b1 0x0D000040 #define SPB16b2 0x0D000020 #define SPB16b3 0x0D000010 #define SPB16b4 0x0D000008 #define SPB16b5 0x0D000004 #define SPB16b6 0x0D000002 #define SPB16b7 0x0D000001 #define SPB17b0 0x0D008000 #define SPB17b1 0x0D004000 #define SPB17b2 0x0D002000 #define SPB17b3 0x0D001000 #define SPB17b4 0x0D000800 #define SPB17b5 0x0D000400 #define SPB17b6 0x0D000200 #define SPB17b7 0x0D000100 #define SPB18b0 0x0D800000 #define SPB18b1 0x0D400000 #define SPB18b2 0x0D200000 #define SPB18b3 0x0D100000 #define SPB18b4 0x0D080000 #define SPB18b5 0x0D040000 #define SPB18b6 0x0D020000 #define SPB18b7 0x0D010000 #define EPOWLOGB16b0 0x05008000 #define LOGB16b4 0x00000800 #define EPOWLOG 0x05000000 #define SPLOG 0x0D000000 /* * Bits analyzed in Version 2 EPOW logs. */ #define EPOWB16b0 0x00008000 #define EPOWB16b1 0x00004000 #define EPOWB16b2 0x00002000 #define EPOWB16b3 0x00001000 #define EPOWB16b2b3 0x00003000 #define EPOWB16b4 0x00000800 #define EPOWB17b0 0x00800000 #define EPOWB17b1 0x00400000 #define EPOWB17b2 0x00200000 #define EPOWB17b3 0x00100000 #define EPOWB17b4 0x00080000 /* * Extened EPOW codes, found after the location codes. The sensor nibble * is ignored. */ #define XEPOW1n11 0x1011 #define XEPOW1n64 0x1064 #define XEPOW2n32 0x2032 #define XEPOW2n52 0x2052 #define XEPOW3n21 0x3021 #define XEPOW3n73 0x3073 #define IGNORE_SENSOR_MASK 0xF0FF /* * PCI EPOW Register values for bits 13:15 */ #define PCIEPOW111 0x00070000 #define PCIEPOW100 0x00040000 #define PCIEPOW011 0x00030000 #define PCIEPOW010 0x00020000 #define PCIEPOW001 0x00010000 #define PCIEPOWMASK 0x00070000 #define CRITHI 13 #define CRITLO 9 #define WARNHI 12 #define WARNLO 10 #define NORMAL 11 #define GS_SUCCESS 0 #define THERM 3 #define POWER 9004 #define VOLT 9002 #define FAN 9001 /* * Offsets into the chrp error log */ #define I_EXTENDED 8 /* index to extended error log */ #define I_BYTE0 0 + I_EXTENDED /* contains predicative error bit */ #define I_BYTE1 1 + I_EXTENDED /* has platform specific error bit */ #define I_FORMAT 2 + I_EXTENDED /* to log format indicator */ #define I_BYTE3 3 + I_EXTENDED /* has modifier bits */ #define I_BYTE12 12+ I_EXTENDED /* to bytes describing error, where */ #define I_BYTE13 13+ I_EXTENDED /* most formats use bytes 12 & 13 */ #define I_BYTE15 15+ I_EXTENDED /* for epow errors */ #define I_BYTE16 16+ I_EXTENDED /* for sp errors */ #define I_BYTE17 17+ I_EXTENDED /* for sp errors */ #define I_BYTE18 18+ I_EXTENDED /* for sp errors */ #define I_BYTE19 19+ I_EXTENDED /* for sp errors */ #define I_BYTE24 24+ I_EXTENDED /* for repair pending bit */ #define I_BYTE28 28+ I_EXTENDED /* for sp errors */ #define I_CPU 13+ I_EXTENDED /* to for physical cpu number */ #define I_POSTCODE 26+ I_EXTENDED /* to post error code */ #define I_FWREV 30+ I_EXTENDED /* to firmware revision level */ #define I_IBM 40+ I_EXTENDED /* to IBM id for location codes */ #define I_TOKEN 20+I_EXTENDED #define I_INDEX 24+I_EXTENDED #define I_STATUS 32+I_EXTENDED #define IGNORE_SENSOR_MASK 0xF0FF /* for extended epow, a 2 byte value */ #define SENSOR_MASK 0x0F00 #define EXT_EPOW_REG_ID 0x3031 /* ascii for 01 */ #define SRC_REG_ID_02 0x3032 /* Ascii for 02 */ #define PCI_EPOW_REG_ID 0x3033 #define SRC_REG_ID_04 0x3034 /* Ascii for 04 */ /* Structure to describe i/o device from i/o detected chrp log */ struct device_ela { int status; /* 0=no data;1=bus only;2=device ok */ char bus; char devfunc; short deviceid; short vendorid; char revisionid; char slot; char name[NAMESIZE]; char busname[NAMESIZE]; char loc[LOCSIZE]; short led; }; #define DEVICE_NONE 0 #define DEVICE_BUS 1 #define DEVICE_OK 2 #define FIRST_LOC 1 /* mode for first location code */ #define NEXT_LOC 2 /* mode for next location code */ #define FIRST_REG 1 /* mode for first register data */ #define NEXT_REG 2 /* mode for next register data */ #define LOC_HIDE_CHAR '>' /* special meaning in location code buffer */ /* Return codes from get_cpu_frus */ #define RC_INVALID 0 #define RC_PLANAR 1 #define RC_PLANAR_CPU 2 #define RC_PLANAR_2CPU 3 #define MAXREFCODES 5 #define REFCODE_REASON_CUST 0x880 /* * The following name is a flag for the diag controller to format * the error description into a "special" SRN, i.e. containing refcodes */ #define REFCODE_FNAME "REF-CODE" #define MAX_MENUGOAL_SIZE 2000 #endif ppc64-diag-2.6.4/rtas_errd/convert_dt_node_props.c0000644000000000000000000003073112313010662020605 0ustar rootroot/** * @file convert_dt_node_props.c * * Copyright (C) 2005 IBM Corporation */ #include #include #include #include #include #include #include #include #include #include #include "platform.c" #define MAX_IRQ_SERVERS_PER_CPU 16 static struct option long_options[] = { {"context", required_argument, NULL, 'c'}, {"from", required_argument, NULL, 'f'}, {"to", required_argument, NULL, 't'}, {"help", no_argument, NULL, 'h'}, {0,0,0,0} }; int cpu_interruptserver_to_drcindex(uint32_t, uint32_t *); int cpu_drcindex_to_drcname(uint32_t, char *, int); int cpu_drcindex_to_interruptserver(uint32_t, uint32_t *, int); int cpu_drcname_to_drcindex(char *, uint32_t *); void print_usage(char *command) { printf ("Usage: %s --context --from --to \n" "\t--context: currently, must be cpu\n" "\t--from and --to: allowed values for and :\n" "\t\tinterrupt-server\n\t\tdrc-index\n\t\tdrc-name\n" "\tif is a drc-index or interrupt-server, it can be\n" "\tspecified in decimal, hex (with a leading 0x), or octal\n" "\t(with a leading 0); if it is a drc-name, it should be\n" "\tspecified as a string in double quotes\n\n", command); return; } /** * mem_drcindex_to_drcname * @brief converts drcindex of mem type to drcname * * @param drc_idx - drc index whose drc name is to be found. * @param drc_name - buffer for drc_name * @param buf_size - size of buffer. */ static int mem_drcindex_to_drcname(uint32_t drc_idx, char *drc_name, int buf_size) { int fd, offset=0, found=0; uint32_t index; uint8_t ch; if ((fd = open("/proc/device-tree/ibm,drc-indexes", O_RDONLY)) < 0) { fprintf(stderr, "error opening /proc/device-tree/" "ibm,drc-indexes"); return 0; } /* skip the first one; it indicates how many are in the file */ read(fd, &index, 4); while ((read(fd, &index, 4)) != 0) { if (index == drc_idx) { found = 1; break; } offset++; } close(fd); if (found) { if ((fd = open("/proc/device-tree/ibm,drc-names", O_RDONLY)) < 0) { fprintf(stderr, "error opening /proc/device-tree/" "ibm,drc-names"); return 0; } /* skip the first one; it indicates how many are in the file */ read(fd, &index, 4); while (offset > 0) { /* skip to (and one past) the next null char */ do { if ((read(fd, &ch, 1)) != 1) { close(fd); return 0; } } while (ch != 0); offset--; } /* copy the drc-name at the current location to the buffer */ while ((read(fd, &ch, 1)) == 1) { if (offset+1 == buf_size) { drc_name[offset] = '\0'; break; } drc_name[offset++] = ch; if (ch == 0) break; } } close(fd); return found; } int main(int argc, char *argv[]) { int option_index, rc, i; int platform = 0; char *context=NULL, *from=NULL, *to=NULL; uint32_t interruptserver, drcindex; unsigned long drc_tmp_idx; uint32_t intservs_array[MAX_IRQ_SERVERS_PER_CPU]; char drcname[20]; platform = get_platform(); switch (platform) { case PLATFORM_UNKNOWN: case PLATFORM_POWERKVM: fprintf(stderr, "%s: is not supported on the %s platform\n", argv[0], __power_platform_name(platform)); return -1; } for (;;) { option_index = 0; rc = getopt_long(argc, argv, "hc:f:t:", long_options, &option_index); if (rc == -1) break; switch (rc) { case 'h': print_usage(argv[0]); return 0; case 'c': /* context */ context = optarg; break; case 'f': /* from */ from = optarg; break; case 't': /* to */ to = optarg; break; case '?': print_usage(argv[0]); return -1; break; default: printf("huh?\n"); break; } } if (!context) { fprintf(stderr, "--context not specified\n"); return 1; } if (!from) { fprintf(stderr, "--from not specified\n"); return 2; } if (!to) { fprintf(stderr, "--to not specified\n"); return 3; } /* * In the cpu context, we can convert between drc name, drc index, * and interrupt server (AKA logical CPU ID). */ if (!strcmp(context, "cpu")) { if (!strcmp(from, "interrupt-server")) { interruptserver = strtol(argv[argc-1], NULL, 0); if (!strcmp(to, "drc-index")) { if (!cpu_interruptserver_to_drcindex( interruptserver, &drcindex)) { fprintf(stderr, "could not find the " "drc-index corresponding to " "interrupt-server 0x%08x\n", interruptserver); return 4; } printf("0x%08x\n", drcindex); } else if (!strcmp(to, "drc-name")) { if (!cpu_interruptserver_to_drcindex( interruptserver, &drcindex)) { fprintf(stderr, "could not find the " "drc-index corresponding to " "interrupt-server 0x%08x\n", interruptserver); return 4; } if (!cpu_drcindex_to_drcname(drcindex, drcname, 20)) { fprintf(stderr, "could not find the " "drc-name corresponding to " "drc-index 0x%08x\n", drcindex); return 4; } printf("%s\n", drcname); } else { fprintf(stderr, "invalid --to flag: %s\n", to); return 3; } } else if (!strcmp(from, "drc-index")) { drcindex = strtol(argv[argc-1], NULL, 0); if (!strcmp(to, "drc-name")) { if (!cpu_drcindex_to_drcname(drcindex, drcname, 20)) { fprintf(stderr, "could not find the " "drc-name corresponding to " "drc-index 0x%08x\n", drcindex); return 4; } printf("%s\n", drcname); } else if (!strcmp(to, "interrupt-server")) { rc = cpu_drcindex_to_interruptserver(drcindex, intservs_array, MAX_IRQ_SERVERS_PER_CPU); if (!rc) { fprintf(stderr, "could not find the " "interrupt-server corresponding" " to drc-index 0x%08x\n", drcindex); return 4; } if (rc > MAX_IRQ_SERVERS_PER_CPU) fprintf(stderr, "warning: only the " "first %d servers in the list " "of %d were returned; increase " "MAX_IRQ_SERVERS_PER_CPU to " "retrieve the entire list\n", MAX_IRQ_SERVERS_PER_CPU, rc); i = 0; while (i < rc) printf("0x%08x\n", intservs_array[i++]); } else { fprintf(stderr, "invalid --to flag: %s\n", to); return 3; } } else if (!strcmp(from, "drc-name")) { strncpy(drcname, argv[argc-1], 20); if (!strcmp(to, "drc-index")) { if (!cpu_drcname_to_drcindex(drcname, &drcindex)) { fprintf(stderr, "could not find the " "drc-index corresponding to " "drc-name %s\n", drcname); return 4; } printf("0x%08x\n", drcindex); } else if (!strcmp(to, "interrupt-server")) { if (!cpu_drcname_to_drcindex(drcname, &drcindex)) { fprintf(stderr, "could not find the " "drc-index corresponding to " "drc-name %s\n", drcname); return 4; } rc = cpu_drcindex_to_interruptserver(drcindex, intservs_array, MAX_IRQ_SERVERS_PER_CPU); if (!rc) { fprintf(stderr, "could not find the " "interrupt-server corresponding" " to drc-index 0x%08x\n", drcindex); return 4; } if (rc > MAX_IRQ_SERVERS_PER_CPU) fprintf(stderr, "warning: only the " "first %d servers in the list " "of %d were returned; increase " "MAX_IRQ_SERVERS_PER_CPU to " "retrieve the entire list\n", MAX_IRQ_SERVERS_PER_CPU, rc); i = 0; while (i < rc) printf("0x%08x\n", intservs_array[i++]); } else { fprintf(stderr, "invalid --to flag: %s\n", to); return 3; } } else { fprintf(stderr, "invalid --from flag: %s\n", from); return 2; } } else if (!strcmp(context, "mem")) { if (!strcmp(from, "drc-index")) { drc_tmp_idx = strtoul(argv[argc-1], NULL, 0); if (!strcmp(to, "drc-name")) { if (!mem_drcindex_to_drcname(drc_tmp_idx, drcname, 20)) { fprintf(stderr, "could not find the " "drc-name corresponding to " "drc-index 0x%08x\n", drcindex); return 4; } printf("%s\n", drcname); } } else { fprintf(stderr, "invalid --to flag: %s\n", to); return 3; } } else { fprintf(stderr, "invalid --context flag: %s\n", context); return 1; } return 0; } int cpu_interruptserver_to_drcindex(uint32_t int_serv, uint32_t *drc_idx) { DIR *dir; struct dirent *entry; int found=0, fd; char buffer[1024]; uint32_t temp; dir = opendir("/proc/device-tree/cpus"); while ((entry = readdir(dir)) != NULL) { if (!strncmp(entry->d_name, "PowerPC,POWER", 13)) { snprintf(buffer, 1024, "/proc/device-tree/cpus/%s/" "ibm,ppc-interrupt-server#s", entry->d_name); if ((fd = open(buffer, O_RDONLY)) < 0) { fprintf(stderr, "error opening %s\n", buffer); goto cleanup; } while ((read(fd, &temp, 4)) != 0) { if (temp == int_serv) { close(fd); snprintf(buffer, 1024, "/proc/device-" "tree/cpus/%s/ibm,my-drc-index", entry->d_name); if ((fd = open(buffer, O_RDONLY)) < 0) { fprintf(stderr, "error opening" " %s\n", buffer); goto cleanup; } if ((read(fd, drc_idx, 4)) == 4) found = 1; close(fd); break; } } close(fd); } } cleanup: closedir(dir); return found; } int cpu_drcindex_to_drcname(uint32_t drc_idx, char *drc_name, int buf_size) { int fd, offset=0, found=0; uint32_t index; uint8_t ch; if ((fd = open("/proc/device-tree/cpus/ibm,drc-indexes", O_RDONLY)) < 0) { fprintf(stderr, "error opening /proc/device-tree/cpus/" "ibm,drc-indexes"); return 0; } /* skip the first one; it indicates how many are in the file */ read(fd, &index, 4); while ((read(fd, &index, 4)) != 0) { if (index == drc_idx) { found = 1; break; } offset++; } close(fd); if (found) { if ((fd = open("/proc/device-tree/cpus/ibm,drc-names", O_RDONLY)) < 0) { fprintf(stderr, "error opening /proc/device-tree/cpus/" "ibm,drc-names"); return 0; } /* skip the first one; it indicates how many are in the file */ read(fd, &index, 4); while (offset > 0) { /* skip to (and one past) the next null char */ do { if ((read(fd, &ch, 1)) != 1) { close(fd); return 0; } } while (ch != 0); offset--; } /* copy the drc-name at the current location to the buffer */ while ((read(fd, &ch, 1)) == 1) { if (offset+1 == buf_size) { drc_name[offset] = '\0'; break; } drc_name[offset++] = ch; if (ch == 0) break; } } close(fd); return found; } /* returns # of interrupt-server numbers found, rather than a boolean value */ int cpu_drcindex_to_interruptserver(uint32_t drc_idx, uint32_t *int_servs, int array_elements) { DIR *dir; struct dirent *entry; int fd, found=0; char buffer[1024]; uint32_t temp; dir = opendir("/proc/device-tree/cpus"); while ((entry = readdir(dir)) != NULL) { if (!strncmp(entry->d_name, "PowerPC,POWER", 13)) { snprintf(buffer, 1024, "/proc/device-tree/cpus/%s/" "ibm,my-drc-index", entry->d_name); if ((fd = open(buffer, O_RDONLY)) < 0) { fprintf(stderr, "error opening %s\n", buffer); closedir(dir); return 0; } while ((read(fd, &temp, 4)) != 0) { if (temp == drc_idx) { close(fd); snprintf(buffer, 1024, "/proc/device-" "tree/cpus/%s/" "ibm,ppc-interrupt-server#s", entry->d_name); if ((fd = open(buffer, O_RDONLY)) < 0) { fprintf(stderr, "error opening" " %s\n", buffer); closedir(dir); return 0; } while ((read(fd, &temp, 4)) == 4) { if (found <= array_elements) int_servs[found] = temp; found++; } break; } } close(fd); } } return found; } int cpu_drcname_to_drcindex(char *drc_name, uint32_t *drc_idx) { int fd, offset=0, found=0, i, rc; uint32_t index; uint8_t ch; char buffer[64]; if ((fd = open("/proc/device-tree/cpus/ibm,drc-names", O_RDONLY)) < 0) { fprintf(stderr, "error opening /proc/device-tree/cpus/" "ibm,drc-names"); return 0; } /* skip the first one; it indicates how many are in the file */ read(fd, &index, 4); do { i = 0; while ((rc = read(fd, &ch, 1)) == 1) { buffer[i++] = ch; if (ch == 0) break; } if (!strcmp(buffer, drc_name)) { found = 1; break; } offset++; } while (rc); close(fd); if (found) { if ((fd = open("/proc/device-tree/cpus/ibm,drc-indexes", O_RDONLY)) < 0) { fprintf(stderr, "error opening /proc/device-tree/cpus/" "ibm,drc-indexes"); return 0; } /* skip the first one; it indicates how many are in the file */ read(fd, &index, 4); while (offset > 0) { if ((read(fd, &index, 4)) != 4) { close(fd); return 0; } offset--; } if ((read(fd, drc_idx, 4)) != 4) found = 0; } close(fd); return found; } ppc64-diag-2.6.4/rtas_errd/rtas_errd.c0000644000000000000000000002657412313010662016205 0ustar rootroot/** * @file rtas_errd.c * @brief Main entry point for rtas_errd. * * Copyright (C) 2004 IBM Corporation */ #include #include #include #include #include #include #include #include #include #include #include #include "rtas_errd.h" #include "platform.c" /** * @var debug * @brief Debug level to run at for rtas_errd daemon */ int debug = 0; #ifdef DEBUG /** * @var no_drmgr * @brief specifies if the '--nodrmgr' flag was specified */ int no_drmgr = 0; /** * @var db_dir * @brief Specify an alternate path for the servicelog files */ char *db_dir = NULL; #else const char *db_dir = NULL; #endif /** * @var slog * @brief servicelog struct for libservicelog use */ struct servicelog *slog = NULL; /** * daemonize * @brief daemonize rtas_errd * * Convert the rtas_errd process to a daemon. */ static void daemonize(void) { pid_t pid; int i; /* Fork a child process to be the real daemon */ pid = fork(); if (pid < 0) goto daemonize_error; else if (pid != 0) exit(0); /* bye-bye parent */ /* make ourselves the session leader */ pid = setsid(); if (pid == -1) goto daemonize_error; /* change to a safe dir */ chdir("/"); /* clear file mode mask */ umask(0); /* Close all file descriptors we have open and reopen descriptors * 0-2 to redirect to /dev/null */ for (i = getdtablesize(); i >= 0; --i) close(i); i = open("/dev/null", O_RDWR); dup(i); dup(i); return; daemonize_error: /* use fprintf here, the rtas_errd log file has not been set up yet */ fprintf(stderr, "Cannot daemonize rtas_errd, check system process " "usage.\nrtas_errd cannot continue.\n"); exit(1); } /** * handle_rtas_event * @brief Main routine for processing RTAS events. * * @param event RTAS event structure to be handled */ int handle_rtas_event(struct event *event) { int rc = 0; struct rtas_event_exthdr *exthdr; dbg("Handling RTAS event %d", event->seq_num); /* * check to determine if this is a platform dump notification, * which requires the dump to be copied to the OS; this must * be done before the error log is written to disk, because * the log will be updated with the path to the dump */ dbg("Entering check_patform_dump()"); check_platform_dump(event); /* write the event to the platform file */ rc = print_rtas_event(event); if (rc <= 0) { log_msg(event, "Could not write RTAS event %d to log file %s", event->seq_num, platform_log); log_msg(event, "Rtas_errd is exiting to preserve the current " "RTAS event in nvram due to a failed write to %s", platform_log); return -1; } switch (event->rtas_hdr->type) { case RTAS_HDR_TYPE_CACHE_PARITY: case RTAS_HDR_TYPE_RESOURCE_DEALLOC: dbg("Entering handle_resource_dealloc()"); handle_resource_dealloc(event); break; case RTAS_HDR_TYPE_EPOW: dbg("Entering check_epow()"); if (check_epow(event) <= 0) { dbg("Recevied EPOW 0 (all is normal) event"); return 0; } break; case RTAS_HDR_TYPE_PLATFORM_ERROR: case RTAS_HDR_TYPE_PLATFORM_INFO: dbg("Entering check_eeh()"); check_eeh(event); break; case RTAS_HDR_TYPE_DUMP_NOTIFICATION: /* handled above in check_platform_dump()*/ break; case RTAS_HDR_TYPE_PRRN: dbg("Entering PRRN handler"); handle_prrn_event(event); /* Nothing left to do for PRRN Events, there is no exthdr * for these events and they are not a serviceable event * and as such do not need to be logged. */ return 0; case RTAS_HDR_TYPE_HOTPLUG: dbg("Entering Hotplug handler"); handle_hotplug_event(event); break; default: /* Nothing to do for this event */ break; } exthdr = rtas_get_event_exthdr_scn(event->rtas_event); if (exthdr == NULL) { log_msg(event, "Could not retrieve extended event data"); return 0; } if (event->rtas_hdr->severity == RTAS_HDR_SEV_ALREADY_REPORTED) event->flags |= RE_ALREADY_REPORTED; if (exthdr->recoverable) event->flags |= RE_RECOVERED_ERROR; if (exthdr->predictive) event->flags |= RE_PREDICTIVE; if (event->rtas_hdr->version == 6) process_v6(event); else process_pre_v6(event); /* Log the event in the servicelog DB */ log_event(event); #if 0 if (event->flags & RE_ALREADY_REPORTED) { platform_log_write("Event %d has already been reported, for " "further details see\n", event->seq_num); platform_log_write("the previous report of this error or the" "servicelog.\n"); } if (event->flags & RE_RECOVERED_ERROR) { platform_log_write("Event %d is a recovered error " "notification, further details are\n", event->seq_num); platform_log_write("available in the servicelog.\n"); } #endif return 0; } /** * read_rtas_event * @brief Main routine to retrieve RTAS events from the kernel * * Responsable for reading RTAS events from the kernel (via /proc) * and calling handle_rtas_event() to process the event. */ int read_rtas_events() { struct event event = {0}; ssize_t len; int retries = 0; memset(&event, 0, sizeof(event)); while (1) { /* * Passing a reference to re to the read routine is correct. * see rtas_errd.h for details. */ len = read_proc_error_log((char *)&event, RTAS_ERROR_LOG_MAX); if (len <= 0) { retries++; if (retries >= 3) { log_msg(NULL, "Could not read error log file"); return -1; } continue; } retries = 0; event.rtas_event = parse_rtas_event(event.event_buf, len); if (event.rtas_event == NULL) { log_msg(&event, "Could not parse RTAS event"); return -1; } event.rtas_hdr = rtas_get_event_hdr_scn(event.rtas_event); if (event.rtas_hdr == NULL) { log_msg(&event, "Could not retrieve event header"); cleanup_rtas_event(event.rtas_event); return -1; } event.length = event.rtas_event->event_length; if (scanlog != NULL) event.flags |= RE_SCANLOG_AVAIL; dbg("Received RTAS event %d", event.seq_num); /* * Mark ourselves as not being able to handle SIGHUP * signals while handling the RTAS event */ d_cfg.flags &= ~RE_CFG_RECFG_SAFE; handle_rtas_event(&event); d_cfg.flags |= RE_CFG_RECFG_SAFE; if (d_cfg.flags & RE_CFG_RECEIVED_SIGHUP) { diag_cfg(1, &cfg_log); d_cfg.flags &= ~RE_CFG_RECEIVED_SIGHUP; } /* cleanup the RTAS event */ if (event.loc_codes != NULL) free(event.loc_codes); free_diag_vpd(&event); cleanup_rtas_event(event.rtas_event); memset(&event, 0, sizeof(event)); #ifdef DEBUG /* * If we are reading a fake rtas event from a test file * we only want to read it once */ if (testing_finished) break; #endif } return 0; } static struct option longopts[] = { { .name = "debug", .has_arg = 0, .flag = NULL, .val = 'd' }, #ifdef DEBUG { .name = "epowfile", .has_arg = 1, .flag = NULL, .val = 'e' }, { .name = "file", .has_arg = 1, .flag = NULL, .val = 'f' }, { .name = "logfile", .has_arg = 1, .flag = NULL, .val = 'l' }, { .name = "msgsfile", .has_arg = 1, .flag = NULL, .val = 'm' }, { .name = "nodrmgr", .has_arg = 0, .flag = NULL, .val = 'R' }, { .name = "platformfile", .has_arg = 1, .flag = NULL, .val = 'p' }, { .name = "scenario", .has_arg = 1, .flag = NULL, .val = 's' }, #endif { .name = NULL, .has_arg = 0, .flag = NULL, .val = 0 } }; /** * main * * The main purpose of main() for the rtas_errd daemon is to parse * any command line options to the daemon, setup any signal handlers * and initialize all files needed for operation. */ int main(int argc, char *argv[]) { struct sigaction sigact; int rc = 0; int c; #ifdef DEBUG int f_flag = 0, s_flag = 0; #endif int platform = 0; platform = get_platform(); switch (platform) { case PLATFORM_UNKNOWN: case PLATFORM_POWERKVM: fprintf(stderr, "%s: is not supported on the %s platform\n", argv[0], __power_platform_name(platform)); return -1; } while ((c = getopt_long(argc, argv, RTAS_ERRD_ARGS, longopts, NULL)) != EOF) { switch(c) { case 'd': debug++; break; #ifdef DEBUG case 'c': /* ppc64-diag config file */ config_file = optarg; break; case 'e': /* EPOW update file */ epow_status_file = optarg; break; case 'f': /* RTAS test event */ if (s_flag) { dbg("Only use the -f or -s flag"); goto error_out; } f_flag++; proc_error_log1 = optarg; proc_error_log2 = NULL; break; case 'l': /* debug rtas_errd.log file */ rtas_errd_log = optarg; break; case 'm': /* debug messages file */ messages_log = optarg; break; case 'p': /* debug platform file */ platform_log = optarg; break; case 's': /* RTAS test scenario */ if (f_flag) { dbg("Only use the -f or -s flag"); goto error_out; } s_flag++; scenario_file = optarg; break; case 'R': /* No drmgr */ no_drmgr = 1; break; #endif default: return -1; } } /* * The debug option can be specified multiple times which will * indicate the debug level to set for librtas. * rtas_set_debug(1) if debug level >= 2, * rtas_set_debug(2) if debug level >= 3, ... */ if (debug - 1) rtas_set_debug(debug - 1); if (! debug) daemonize(); /* Initialize all the files used by rtas_errd */ rc = init_files(); if (rc) goto error_out; /* Set up a signal handler for SIGALRM to handle EPOW events */ sigact.sa_handler = (void *)epow_timer_handler; sigemptyset(&sigact.sa_mask); sigact.sa_flags = SA_RESTART; if (sigaction(SIGALRM, &sigact, NULL)) { log_msg(NULL, "Could not initialize signal handler for " "certian EPOW events (SIGALRM), %s", strerror(errno)); goto error_out; } /* Set up a signal handler for SIGHUP to re-read the config file */ sigact.sa_handler = (void *)sighup_handler; sigemptyset(&sigact.sa_mask); sigact.sa_flags = SA_RESTART; if (sigaction(SIGHUP, &sigact, NULL)) { log_msg(NULL, "Could not initialize signal handler for " "re-reading the ppc64-diag config file (SIGHUP), %s", strerror(errno)); } /* Ignore SIGPIPE */ sigact.sa_handler = SIG_IGN; sigemptyset(&sigact.sa_mask); sigact.sa_flags = SA_RESTART; if (sigaction(SIGPIPE, &sigact, NULL)) { log_msg(NULL, "Cannot ignore SIGPIPE, %s", strerror(errno)); } /* Set up a signal handler for SIGCHLD to handle terminating children */ setup_sigchld_handler(); /* Read any configuration options from the config file */ rc = diag_cfg(1, &cfg_log); if (rc) goto error_out; /* Open the servicelog database */ rc = servicelog_open(&slog, 0); if (rc) { log_msg(NULL, "Could not open the servicelog database, events " "will only be written to /var/log/platform.\n%s\n", strerror(rc)); slog = NULL; } /* update the RTAS events from /var/log/messages */ update_rtas_msgs(); #if 0 /* * Get amount of filesystem space (in bytes) to reserve for * platform dumps via the ibm,get-system-parameter RTAS call. */ rc = rtas_get_sysparm (TOKEN_PLATDUMP_MAXSIZE, 10, data); if (rc != 0) { log_msg(NULL, "Librtas returned an error code: %d" "The minimum amount of space to reserve for " "platform dumps could not be established", rc); return; } #endif #if 0 /* * Check to see if a new scanlog dump is available; if so, copy it to * the filesystem and associate the dump with the first error processed. */ check_scanlog_dump(); #endif rc = read_rtas_events(); error_out: errno = 0; log_msg(NULL, "The rtas_errd daemon is exiting"); close_files(); if (slog != NULL) servicelog_close(slog); return rc; } ppc64-diag-2.6.4/rtas_errd/servicelog.c0000644000000000000000000001345312313010662016352 0ustar rootroot/** * @file servicelog.c * @brief Routines for inserting records into the servicelog database. * * Copyright (C) 2005 IBM Corporation */ #include #include #include #include #include #include #include #include #include #include "rtas_errd.h" #define bcd_4b_toint(x) ( ((((x) & 0xf000) >> 12) * 1000) + \ ((((x) & 0xf00) >> 8) * 100) + \ ((((x) & 0xf0) >> 4) * 10) + \ ((((x) & 0xf)))) #define bcd_2b_toint(x) ( ((((x) & 0xf0) >> 4) * 10) + \ ((((x) & 0xf)))) /** * get_event_date * @brief Retrieve the timestamp from an event * * @param event the event from which to retrieve the timestamp * @return the timestamp as time since Epoch, or 0 on failure */ time_t get_event_date(struct event *event) { struct rtas_time *time = NULL; struct rtas_date *date = NULL; if (event->rtas_hdr->version == 6) { struct rtas_priv_hdr_scn *privhdr; privhdr = rtas_get_priv_hdr_scn(event->rtas_event); if (privhdr == NULL) { log_msg(event, "Could not parse RTAS event to " "initialize servicelog timestamp."); } else { time = &privhdr->time; date = &privhdr->date; } } else { struct rtas_event_exthdr *exthdr; exthdr = rtas_get_event_exthdr_scn(event->rtas_event); if (exthdr == NULL) { log_msg(event, "Could not parse RTAS event to " "initialize servicelog timestamp."); } else { time = &exthdr->time; date = &exthdr->date; } } if (time != NULL) { struct tm tm = {0}; tm.tm_year = bcd_4b_toint(date->year) - 1900; tm.tm_mon = bcd_2b_toint(date->month) - 1; tm.tm_mday = bcd_2b_toint(date->day); tm.tm_hour = bcd_2b_toint(time->hour); tm.tm_min = bcd_2b_toint(time->minutes); tm.tm_sec = bcd_2b_toint(time->seconds); tm.tm_isdst = -1; return mktime(&tm); } return 0; } /** * servicelog_sev * @brief convert RTAS severity to servicelog severity * * @param rtas_sev RTAS severity to be converted * @return servicelog severity number, SL_SEV_INFO if unknown severity */ int servicelog_sev(int rtas_sev) { switch (rtas_sev) { case 0: /* NO_ERROR */ return SL_SEV_INFO; case 1: /* EVENT */ return SL_SEV_EVENT; case 2: /* WARNING */ return SL_SEV_WARNING; case 3: /* ERROR_SYNC */ return SL_SEV_ERROR; case 4: /* ERROR */ return SL_SEV_ERROR; case 5: /* FATAL */ return SL_SEV_FATAL; case 6: /* ALREADY_REPORTED */ return SL_SEV_INFO; } return SL_SEV_INFO; } /** * add_callout * @brief Add a new FRU callout to the list for this event * * @param event event to which to add the callout * @param pri priority * @param type type * @param proc procedure ID * @param loc location code * @param pn FRU part number * @param sn FRU serial number * @param ccin FRU ccin */ void add_callout(struct event *event, char pri, int type, char *proc, char *loc, char *pn, char *sn, char *ccin) { struct sl_callout *callout = event->sl_entry->callouts; if (!callout) { event->sl_entry->callouts = (struct sl_callout *)malloc( sizeof(*callout)); callout = event->sl_entry->callouts; } else { while (callout->next) callout = callout->next; callout->next = (struct sl_callout *)malloc(sizeof(*callout)); callout = callout->next; } if (!callout) return; memset(callout, 0, sizeof(*callout)); callout->priority = pri; callout->type = type; if (proc) { callout->procedure = (char *)malloc(strlen(proc) + 1); strncpy(callout->procedure, proc, strlen(proc) + 1); } if (loc) { callout->location = (char *)malloc(strlen(loc) + 1); strncpy(callout->location, loc, strlen(loc) + 1); } if (pn) { callout->fru = (char *)malloc(strlen(pn) + 1); strncpy(callout->fru, pn, strlen(pn) + 1); } if (sn) { callout->serial = (char *)malloc(strlen(sn) + 1); strncpy(callout->serial, sn, strlen(sn) + 1); } if (ccin) { callout->ccin = (char *)malloc(strlen(ccin) + 1); strncpy(callout->ccin, ccin, strlen(ccin) + 1); } return; } /** * log_event * @brief log the event in the servicelog DB * * @param event RTAS event structure */ void log_event(struct event *event) { struct rtas_dump_scn *scn_dump; uint64_t key; int rc, txtlen; /* If the DB isn't available, do nothing */ if (slog == NULL) return; if (event->sl_entry == NULL) { log_msg(event, "ELA did not generate any data to be logged " "for this event."); return; } if (event->flags & RE_PLATDUMP_AVAIL) { if ((scn_dump = rtas_get_dump_scn(event->rtas_event)) != NULL) { char filename[41]; uint64_t dump_size = 0; memset(filename, 0, 41); memcpy(filename, scn_dump->os_id, scn_dump->id_len); dump_size = scn_dump->size_hi; dump_size <<= 32; dump_size |= scn_dump->size_lo; snprintf(event->addl_text, ADDL_TEXT_MAX, "A platform " "dump was generated and downloaded to the " "filesystem (%llu bytes):\n%s%s", (long long unsigned int)dump_size, d_cfg.platform_dump_path, filename); } } /* Append any additional text to the output of the analysis */ txtlen = strlen(event->addl_text); if (txtlen > 0) { if (event->sl_entry->description) { char *new_desc; int new_len; new_len = strlen(event->sl_entry->description) + txtlen + 3; new_desc = (char *)malloc(new_len); snprintf(new_desc, new_len, "%s\n\n%s", event->sl_entry->description, event->addl_text); free(event->sl_entry->description); event->sl_entry->description = new_desc; } else { event->sl_entry->description = (char *)malloc(txtlen+1); snprintf(event->sl_entry->description, txtlen, event->addl_text); } } /* Log the event in the servicelog */ rc = servicelog_event_log(slog, event->sl_entry, &key); servicelog_event_free(event->sl_entry); if (rc) log_msg(event, "Could not log event to servicelog.\n%s\n", servicelog_error(slog)); else log_msg(event, "servicelog key %llu", key); } ppc64-diag-2.6.4/rtas_errd/rtas_errd.h0000644000000000000000000001024212313010662016173 0ustar rootroot/** * @file rtas_errd.h * @brief Main header for rtas_errd * * Copyright (C) 2004 IBM Corporation. */ #ifndef _RTAS_ERRD_H #define _RTAS_ERRD_H #include #include #include #include "fru_prev6.h" #include "config.h" extern char *platform_log; extern char *messages_log; extern char *proc_error_log1; extern char *proc_error_log2; extern char *rtas_errd_log; extern char *rtas_errd_log0; extern char *test_file; #ifdef DEBUG extern char *scenario_file; extern int testing_finished; extern int no_drmgr; /** * @def RTAS_ERRD_ARGS * @brief DEBUG args for rtas_errd */ #define RTAS_ERRD_ARGS "c:de:f:l:m:p:s:" #else /** * @def RTAS_ERRD_ARGS * @brief standard args for rtas_errd */ #define RTAS_ERRD_ARGS "d" #endif extern int platform_log_fd; extern int debug; extern char *scanlog; extern struct servicelog *slog; #define RTAS_ERROR_LOG_MAX 4096 #define ADDL_TEXT_MAX 256 #ifndef MAX #define MAX(x,y) ((x) > (y) ? (x) : (y)) #endif #define TRUE 1 #define FALSE 0 /* Structure containing error log entries for a device. */ struct errdata { unsigned sequence; /* sequence # of entry */ unsigned time_stamp; /* entry timestamp */ unsigned err_id; /* error id code */ }; struct diag_vpd { char *ds; /* displayable message */ char *yl; /* location code */ char *fn; /* fru part number */ char *sn; /* fru serial number */ char *se; /* enclosure serial number */ char *tm; /* enclosure model number */ }; /** * @struct event * @brief struct to track and handle RTAS events in rtas_errd. * * NOTE: The first two items in this struct (seq_num and event_buf) * must remain as the first two items and in the same order. Otherwise * reading events from /proc will break. The read from /proc returns * the event number followed by the actual event itself. */ struct event { int seq_num; /**< Number assigned by kernel */ char event_buf[RTAS_ERROR_LOG_MAX]; int length; /**< RTAS event length (bytes) */ struct rtas_event_hdr *rtas_hdr; /**< RTAS event header */ /**< data read in from proc_erro log */ unsigned int flags; /**< rtas_Event flags */ char *loc_codes; char addl_text[ADDL_TEXT_MAX]; struct errdata errdata; struct diag_vpd diag_vpd; struct rtas_event *rtas_event; struct sl_event *sl_entry; }; /* flags for struct event */ #define RE_SCANLOG_AVAIL 0x00000001 #define RE_SERVICEABLE 0x00000002 #define RE_PLATDUMP_AVAIL 0x00000004 #define RE_PREDICTIVE 0x00000008 #define RE_HMC_TAGGED 0x40000000 #define RE_ALREADY_REPORTED 0x20000000 #define RE_RECOVERED_ERROR 0x10000000 extern char *epow_status_file; /* files.c */ #define dbg(_f, _a...) _dbg("%s(): "_f, __FUNCTION__, ##_a) void log_msg(struct event *, char *, ...); void cfg_log(char *, ...); int init_files(void); void close_files(void); void _dbg(const char *, ...); int print_rtas_event(struct event *); int platform_log_write(char *, ...); void update_epow_status_file(int); int read_proc_error_log(char *, int); /* dump.c */ void check_scanlog_dump(void); void check_platform_dump(struct event *); /* eeh.c */ void check_eeh(struct event *); /* guard.c */ void handle_resource_dealloc(struct event *); /* rtas_errd.c */ int handle_rtas_event(struct event *); /* update.c */ void update_rtas_msgs(void); /* ela.c */ int process_pre_v6(struct event *); int get_error_fmt(struct event *); /* v6ela.c */ int process_v6(struct event *); /* diag_support.c */ char *get_dt_status(char *); char *diag_get_fru_pn(struct event *, char *); void free_diag_vpd(struct event *); /* menugoal.c */ int menugoal(struct event *, char *); /* epow.c */ void epow_timer_handler(int, siginfo_t, void *); int check_epow(struct event *); /* servicelog.c */ time_t get_event_date(struct event *event); int servicelog_sev(int rtas_sev); void add_callout(struct event *event, char pri, int type, char *proc, char *loc, char *pn, char *sn, char *ccin); void log_event(struct event *); /* signal.c */ void sighup_handler(int, siginfo_t, void *); void restore_sigchld_default(void); void setup_sigchld_handler(void); /* prrn.c */ void handle_prrn_event(struct event *); /* hotplug.c */ void handle_hotplug_event(struct event *); #endif /* _RTAS_ERRD_H */ ppc64-diag-2.6.4/rtas_errd/ela.c0000644000000000000000000023747412313010662014764 0ustar rootroot/** * @file ela.c * * Copyright (C) 2005 IBM Corporation */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "fru_prev6.h" #include "dchrp.h" #include "dchrp_frus.h" #include "rtas_errd.h" #include "ela_msg.h" /* Function prototypes */ static int analyze_io_bus_error(struct event *, int, int); static int get_error_type(struct event *, int); static int report_srn(struct event *, int, struct event_description_pre_v6 *); static char *get_loc_code(struct event *, int, int *); static int report_menugoal(struct event *, char *, ...); static int report_io_error_frus(struct event *, int, struct event_description_pre_v6 *, struct device_ela *, struct device_ela *); static int get_cpu_frus(struct event *); static int process_v1_epow(struct event *, int); static int process_v2_epow(struct event *, int); static int process_v3_epow(struct event *, int, int); static int sensor_epow(struct event *, int, int); static void unknown_epow_ela(struct event *, int); static int process_v2_sp(struct event *, int); static int process_v3_logs(struct event *, int); static int convert_symptom(struct event *, int, int, char **); static int process_refcodes(struct event *, short *, int); extern char *optarg; /* Macro to determine if there location codes in the buffer */ #define LOC_CODES_OK ((event->loc_codes != NULL) && strlen(event->loc_codes)) /* Global saved io error type with Bridge Connection bits. */ int io_error_type = 0; #define IO_BRIDGE_MASK 0x0FFF0FFF /* mask off byte 13, bits 0-3 */ /* of error_type to get io_error_type */ #define PTABLE_SIZE 4 int pct_index = 0; int percent_table[2][PTABLE_SIZE+1][PTABLE_SIZE] = { {{0,0,0,0}, {100,0,0,0}, {67,33,0,0}, {50,30,20,0}, {40,30,20,10}}, {{0,0,0,0}, {100,0,0,0}, {50,50,0,0}, {33,33,33,0}, {25,25,25,25}} }; /* * Table to hold ref codes from the error log entry prior * to filling out the error description. */ short rctab[MAXREFCODES+1]; /* * And a "shadow" table to hold number of location codes per ref code */ char rctabloc[MAXREFCODES+1]; char * get_tod() { time_t t; time(&t); return (asctime(localtime(&t))); } /** * convert_bcd * @brief Convert decimal number to hex number * * Converts num into hex number that will display as decimal. * i.e. binary 0x1010 becomes 0x10000 * A 10 * * @param num decimal number to convert * @returns converted number */ static int convert_bcd(int num) { char tempnum[10]; sprintf(tempnum, "%d", num); num = strtol(tempnum, NULL, 16); return num; } /** * get_refcode * */ static char * get_refcode(struct event_description_pre_v6 *event, int index) { static char rfc[80]; if (strcmp(event->frus[index].fname, "REF-CODE") == 0) { sprintf(rfc, "%04hX%04hX", event->frus[index].fmsg, event->frus[index].conf); dbg("reference code \"%s\"", rfc); return rfc; } return NULL; } /** * add_more_descrs * */ int add_more_descrs(struct event *event, struct event_description_pre_v6 *ptr) { int i, rc = 0; char *frupn = NULL; char *refcode; char na[] = "n/a"; i = 0; while (i < MAXFRUS && ptr->frus[i].conf != 0) { if (ptr->frus[i].floc[0]) frupn = diag_get_fru_pn(event, ptr->frus[i].floc); else strcpy(ptr->frus[i].floc, na); if (frupn == NULL) frupn = na; refcode = get_refcode(ptr, i); if (refcode == NULL) refcode = na; add_callout(event, ' ', 0, refcode, ptr->frus[i].floc, frupn, NULL, NULL); dbg("loc = \"%s\",\nfrupn = \"%s\",\nrefcode = \"%s\"", ptr->frus[i].floc, frupn, refcode); i++; } return rc; } /** * set_srn_and_callouts * @brief Determines the SRN and creates callout structs * * Note that the sl_entry struct in event struct (1st parameter) must be * allocated before calling this routing. * * @param event the event on which to operate * @param ptr the description of the event as established by ELA * @param post_error 0 if not a post error; post error code otherwise * @return 0 on success, -1 on failure. */ int set_srn_and_callouts(struct event *event, struct event_description_pre_v6 *ptr, unsigned post_error) { char srn[80]; int i; char *frupn = NULL; char *refcode; char na[] = "n/a"; dbg("pre-v6 event: flags = %d, sn = %d, rcode = %d, rmsg = %d\n" "dname = \"%s\"", ptr->flags, ptr->sn, ptr->rcode, ptr->rmsg, ptr->dname); if (post_error == 0) snprintf(srn, 80, "%03hX-%03hX", ptr->sn, ptr->rcode); else snprintf(srn, 80, "%0X", post_error); event->sl_entry->refcode = (char *)malloc(strlen(srn)+1); strncpy(event->sl_entry->refcode, srn, strlen(srn)+1); dbg("SRN: \"%s\"", event->sl_entry->refcode); i = 0; while (i < MAXFRUS && ptr->frus[i].conf != 0) { if (ptr->frus[i].floc[0]) frupn = diag_get_fru_pn(event, ptr->frus[i].floc); else strcpy(ptr->frus[i].floc, na); if (frupn == NULL) frupn = na; refcode = get_refcode(ptr, i); if (refcode == NULL) refcode = na; dbg("formatting fru list \"%s\", frupn = \"%s\"\n" "refcode = \"%s\"", ptr->frus[i].floc, frupn, refcode); add_callout(event, ' ', 0, refcode, ptr->frus[i].floc, frupn, NULL, NULL); i++; } return 0; } /** * add_cpu_id * * Adds the physical cpu id number to the logical name procx for an * event that calls out a processor. * * @returns 0 if valid cpuid was added to the event data * @returns 1 if invalid cpuid was input, so event data changed to proc0 */ int add_cpu_id(struct event_description_pre_v6 *ptr, int fru_num, int cpuid) { int rc = 0; if (cpuid > 0) cpuid--; /* physical cpu id indexed from 1 */ else { cpuid = 0; rc = 1; } /* Stuff the cpuid in for the 'x' of "procx" */ ptr->frus[fru_num].fname[4] = '0' + cpuid; /* Set the fru name is not in the db */ ptr->frus[fru_num].fname[0] = '\0'; return rc; } /** * set_fru_percentages * * Sets the fru percentages (probablity of failure) from the global * table that is based on the number of FRUs. Used for unknown events * and post errors when want to report the physical location codes * from RTAS. */ void set_fru_percentages(struct event_description_pre_v6 *event, int nfrus) { int *percent; int i; if (nfrus > MAXFRUS) nfrus = MAXFRUS; if (nfrus < PTABLE_SIZE) percent = percent_table[pct_index][nfrus]; else percent = percent_table[pct_index][PTABLE_SIZE]; i = 0; while (i < nfrus) { event->frus[i].conf = *(percent + i); i++; } while (i < MAXFRUS) { event->frus[i].conf = 0; i++; } return; } /** * get_register_data * * Look in the product specific area of the CHRP error log for the * register data. The format of the vendor specific area is: * "IBM" NULL location_code_string NULL register_data * where register_data begins on a 4 byte boundary and is (any number of): * length (2 bytes, which includes the length) id (2 bytes) * and register (length - 4). * The register_data is terminated by length = 2, i.e. no id and no data. * * RETURNS: * NULL if register for id is not found * Otherwise an integer pointer to the data portion (not the length * or id) of the register data, and rlen is set to the length of the * data returned. */ int * get_register_data(struct event *event, int rid, int *rlen) { char *p, *q; char *end; int length_id; int length; int id; int *rdata; *rlen = 0; rdata = NULL; end = event->event_buf + event->length; /* Find start of register data fields * look for location code id and string */ if ((p = strstr(&event->event_buf[I_IBM], "IBM")) != NULL) { q = p + strlen(p) + 1; /* step over "IBM" */ /* * The location codes are padded to end on 4 byte * boundary. So look for NULL as last byte of 4 bytes. */ while ((*(int *)q & 0xFF && q < end)) q += 4; p = q + 4; /* points to 1st register data field */ /* Make sure pointing to meaningful data */ if (p >= end) return NULL; } else /* There is no register data */ return NULL; /* Look at each register data field until * the requested id is found. * */ do { length_id = *(int *)p; /* 2 bytes length, 2 bytes id */ length = length_id >> 16; dbg("found register data in log, length = 0x%x", length); /* Make sure pointing can reach meaningful data */ if (length <= 0) return NULL; id = length_id & 0xFFFF; dbg("id = 0x%x", id); p += sizeof(int); /* next 4 bytes after length_id */ length -= 2; /* subtract the length of the length */ if (length > 0) { /* is there data to inspect? */ length -= 2; /* subtract the length of the id */ if (id == rid) { /* This is the requested register */ *rlen = length; rdata = (int *)p; break; /* found, so out of loop */ } else { /* Not it, so ignore this register data */ p = p + length; } } /* nothing found, and going beyond the data */ if (p >= end) return NULL; } while (length > 0); return rdata; } /* * Data to manage the EPOW reset error log entries. */ struct epow_reset { struct epow_reset *next; unsigned err_type; int valid_reset; uint err_sequence; uint err_id; }; static struct epow_reset *epow_reset_list = NULL; /** * save_epow_reset * * If this is Auto ELA, go ahead and search for the original EPOW this * one is reseting. If not Auto ELA, save the reset for reference when * the original EPOW is processed. * * RETURNS: * 1 if diagnostic conclusion, * otherwise 0, unless an error, then -1. * */ int save_epow_reset(struct event *event, int error_type) { struct epow_reset *new_reset; new_reset = (struct epow_reset *)malloc(sizeof(*new_reset)); if (new_reset == NULL) return -1; new_reset->err_type = error_type; new_reset->valid_reset = 1; new_reset->err_sequence = event->errdata.sequence; new_reset->err_id = event->errdata.err_id; /* Add to the front of the list */ new_reset->next = epow_reset_list; epow_reset_list = new_reset; return 0; } /** * has_epow_reset * * Determine if this error (the input) has been reset by an earilier * EPOW reset. * * RETURNS: * 1 if diagnostic conclusion, * otherwise 0. unless an error, then -1. */ int has_epow_reset(struct event *event, int error_type) { struct epow_reset *erptr; uint corrected_seq; erptr = epow_reset_list; /* Search for an occurance of the error_type */ while (erptr != NULL) { if (erptr->err_type == (error_type & 0xFFFFFF00)) { /* found a match */ erptr->valid_reset = 0; /* don't report again */ /* Store the sequence number of the EPOW_SUS_CHRP. This sequence number is used in the menugoal text. */ corrected_seq = event->errdata.sequence; /* Link the menugoal with the sequence number and error ID of the EPOW_RES_CHRP. */ event->errdata.sequence = erptr->err_sequence; event->errdata.err_id = erptr->err_id; report_menugoal(event, MSGMENUG202, corrected_seq); return 1; } erptr = erptr->next; } return 0; } /** * process_epow * * @brief Determine the version of the EPOW error log and process accordingly. * */ int process_epow(struct event *event, int error_type) { int rc = 0; if ((error_type & 0xFF000000) == EPOWLOG) { if ((error_type & 0x0F) == 0) { /* This is an EPOW reset, so save it */ /* and go to the next (older) error */ rc = save_epow_reset(event, error_type); } else if ((rc = has_epow_reset(event, error_type))) { /* this error has been reset */ /* continue */ } else if (event->event_buf[0] == 0x01) { /* Version 1 EPOW Log */ rc = process_v1_epow(event, error_type); } else /* Version 2 EPOW Log */ rc = process_v2_epow(event, error_type); } return rc; } /** * process_pre_v6 * @brief Handle older (pre-v6) style events * * @param event the event to be parsed * @return always returns 0 */ int process_pre_v6(struct event *event) { int error_fmt; int error_type; char *loc; int cpuid; struct event_description_pre_v6 *e_desc; int fru_index; struct device_ela sigdev; struct device_ela sendev; int sid, sed; int post_error_code; int i; short *refc; int rlen; int deconfig_error = 0; int predictive_error = 0; int repair_pending = 0; int rc; int loc_mode; int ignore_fru; char *devtree = NULL; char target[80]; struct rtas_event_exthdr *exthdr; dbg("Processing pre-v6 event"); /* Reset for this analysis */ if (event->loc_codes != NULL) { free(event->loc_codes); event->loc_codes = NULL; } exthdr = rtas_get_event_exthdr_scn(event->rtas_event); if (exthdr == NULL) { log_msg(event, "Could not retrieve extended event data"); return 0; } /* create and populate an entry to be logged to servicelog */ event->sl_entry = (struct sl_event *)malloc(sizeof(struct sl_event)); memset(event->sl_entry, 0, sizeof(struct sl_event)); event->sl_entry->time_event = get_event_date(event); event->sl_entry->type = SL_TYPE_BASIC; event->sl_entry->severity = servicelog_sev(event->rtas_hdr->severity); event->sl_entry->serviceable = 1; exthdr = rtas_get_event_exthdr_scn(event->rtas_event); if (exthdr) { if (exthdr->predictive) event->sl_entry->predictive = 1; if (exthdr->recoverable) event->sl_entry->disposition = SL_DISP_RECOVERABLE; else if (exthdr->unrecoverable_bypassed) event->sl_entry->disposition = SL_DISP_BYPASSED; else if (exthdr->unrecoverable) event->sl_entry->disposition = SL_DISP_UNRECOVERABLE; } event->sl_entry->raw_data_len = event->length; event->sl_entry->raw_data = (unsigned char *)malloc(event->length); memcpy(event->sl_entry->raw_data, event->event_buf, event->length); deconfig_error = exthdr->unrecoverable_bypassed; predictive_error = exthdr->predictive; dbg("CHRP log data: recovered_error = 0x%x, deconfigured_error = 0x%x\n" "predictive_error = 0x%x", exthdr->recoverable, deconfig_error, predictive_error); /* * Look for the "IBM" vendor tag at end of chrp error log. * Copy location code string into re->loc_codes. */ if ((loc = strstr((char *)&event->event_buf[I_IBM], "IBM")) != NULL) { /* loc code is a null terminated string beginning at loc + 4 */ if (strlen(loc + 4)) { event->loc_codes = (char *)malloc(strlen(loc+4)+1); if (event->loc_codes == NULL) return 0; strcpy(event->loc_codes, (loc + 4)); } } /* * First, see if there is any SRC data with the "02" id. * If so, create an error description from the ref. codes. */ refc = (short *)get_register_data(event, SRC_REG_ID_02, &rlen); if (refc != NULL) { process_refcodes(event, refc, rlen); return 0; } /* Otherwise process the sympton bits in the CHRP error log. */ io_error_type = 0; error_fmt = get_error_fmt(event); error_type = get_error_type(event, error_fmt); dbg("CHRP log data: error_fmt = 0x%x, error_type = 0x%x, \n" "io_error_type = 0x%x", error_fmt, error_type, io_error_type); /* * Any predictive, unrecoverable error-degraded mode error will be * reported in V3 style SRN, regardless of error log format, so * check for it here. */ if (deconfig_error && predictive_error) { /* * Make sure the FRUs in this log have not already been * deconfigured by the platform. Search the device tree for * deconfigured status for all FRUs listed in this error log. * Should only be one FRU, but will handle multiple FRUs. Only * if all FRUs are deconfigured, is this error log ignored. */ loc_mode = FIRST_LOC; ignore_fru = FALSE; while ((loc = get_loc_code(event, loc_mode, NULL)) != NULL) { loc_mode = NEXT_LOC; if (devtree == NULL) devtree = get_dt_status(NULL); if (devtree) { sprintf(target, "%s fail-offline", loc); if (strstr(devtree, target)) { /* found FRU and status in devtree */ /* can ignore this fru */ ignore_fru = TRUE; continue; } else { /* fru not disabled */ /* can not ignore this error log */ ignore_fru = FALSE; break; } } } if (ignore_fru == TRUE) return 0; /* FRUs have not been disabled by the platform */ v3_errdscr[0].sn = SN_V3ELA + error_fmt; v3_errdscr[0].sn |= 0x010; /* encode the predictive/deferred bit */ v3_errdscr[0].rcode = 0x500; v3_errdscr[0].rmsg = PREDICT_UNRECOV; if (error_fmt == RTAS_EXTHDR_FMT_CPU) { /* check if the "repair pending an IPL" bit is set */ repair_pending = event->event_buf[I_BYTE24] & 0x80; if (repair_pending) { v3_errdscr[0].rcode = 0x560; v3_errdscr[0].rmsg = PREDICT_REPAIR_PENDING; } } report_srn(event, 0, v3_errdscr); return 0; } else if (deconfig_error && error_fmt == RTAS_EXTHDR_FMT_IBM_SP && event->loc_codes != NULL) { /* * An error was found and the resource has been * deconfigured to bypass the error. */ report_srn(event, 0, &bypass_errdscr[0]); return 0; } if ( ! process_v3_logs(event, error_type) && /* v3 and beyond */ ! process_epow(event, error_type) && /* v1 and v2 EPOWs */ ! process_v2_sp(event, error_type)) { if (predictive_error) fru_index = 1; else fru_index = 0; /* all POST and version 1 non-EPOW error logs */ switch (error_type) { case CPUB12b0: /* CPU internal error */ cpuid = event->event_buf[I_CPU]; e_desc = &cpu610[fru_index]; add_cpu_id(e_desc, 0, cpuid); report_srn(event, 0, e_desc); break; case CPUB12b1: /* CPU internal cache error */ cpuid = event->event_buf[I_CPU]; e_desc = &cpu611[fru_index]; add_cpu_id(e_desc, 0, cpuid); report_srn(event, 0, e_desc); break; case CPUB12b2: /* L2 cache parity or multi-bit ECC error */ e_desc = &cpu612[fru_index]; report_srn(event, 0, e_desc); break; case CPUB12b3: /* L2 cache ECC single-bit error */ report_srn(event, 0, &cpu613[fru_index]); break; case CPUB12b4: /* TO error waiting for memory controller */ report_srn(event, 0, &cpu614[0]); break; case CPUB12b5: /* Time-out error waiting for I/O */ report_srn(event, 0, &cpu615[0]); break; case CPUB12b6: /* Address/Data parity error on Processor bus */ case CPUB12b7: /* Transfer error on Processor bus */ /* * The RTAS frus can be planar,cpu,[cpu] in any order. * The err descriptions require planar,cpu,[cpu], so * parse location codes to determine which error * descriptions then arrange RTAS data to fit * error description. */ rc = get_cpu_frus(event); if (rc == RC_PLANAR) { if (error_type == CPUB12b6) e_desc = &cpu710[0]; else e_desc = &cpu713[0]; report_srn(event, 0, e_desc); } else if (rc == RC_PLANAR_CPU) { if (error_type == CPUB12b6) e_desc = &cpu711[0]; else e_desc = &cpu714[0]; report_srn(event, 0, e_desc); } else if (rc == RC_PLANAR_2CPU) { if (error_type == CPUB12b6) e_desc = &cpu712[0]; else e_desc = &cpu715[0]; report_srn(event, 0, e_desc); } else { report_srn(event, 0, &cpu619[0]); } break; case CPUALLZERO:/* Unknown error detected by CPU Error log */ case MEMALLZERO:/* Unknown error detected by mem. controller */ case IOALLZERO: /* Unknown error detected by I/O device */ if (error_type == CPUALLZERO) e_desc = &cpu619[0]; else if (error_type == MEMALLZERO) e_desc = &mem629[0]; else e_desc = &io639[0]; report_srn(event, 0, e_desc); break; case MEMB12b0: /* Uncorrectable Memory Error */ /* log didn't contain dimm element # */ /* or dimm type is unknown, then */ /* check memory status */ report_srn(event, 0, &memtest600[0]); break; case MEMB12b1: /* ECC correctable error */ case MEMB12b2: /* Correctable error threshold exceeded */ pct_index = 1; /* * log didn't contain dimm element # or dimm type is * unknown, then check memory status */ report_srn(event, 0, &memtest600[0]); pct_index = 0; break; case MEMB12b3: /* Memory Controller internal error */ report_srn(event, 0, &mem624[0]); break; case MEMB12b4: /* Memory Address (Bad addr going to memory) */ report_srn(event, 0, &mem625[0]); break; case MEMB12b4B13b3: /* I/O Bridge T/O and Bad Memory Address */ report_menugoal(event, MSGMENUG174); return 0; break; case MEMB12b5: /* Memory Data (Bad data going to memory) */ report_srn(event, 0, &mem626[0]); break; case MEMB12b6: /* Memory bus/switch internal error */ /* memory bus/switch not yet implemented. */ break; case MEMB12b7: /* Memory time-out error */ report_srn(event, 0, &mem627[0]); break; case MEMB13b0: /* Processor Bus parity error */ add_cpu_id(&mem722[0], 0, 0); /* * calling out processor, but don't know which * one, so default to proc0 and let location * code point out failing proc */ report_srn(event, 0, &mem722[0]); break; case MEMB13b1: /* Processor time-out error */ add_cpu_id(&mem628[0], 0, 0); /* * calling out processor, but don't know which * one, so default to proc0 and let location * code point out failing proc */ report_srn(event, 0, &mem628[0]); break; case MEMB13b2: /* Processor bus Transfer error */ add_cpu_id(&mem723[0], 0, 0); /* * calling out processor, but don't know which * one, so default to proc0 and let location * code point out failing proc */ report_srn(event, 0, &mem723[0]); break; case MEMB13b3: /* I/O Host Bridge time-out error */ report_srn(event, 0, &mem724[0]); break; case MEMB13b4: /* I/O Host Bridge address/data parity error */ report_srn(event, 0, &mem725[0]); break; case IOB12b0: /* I/O Bus Address Parity Error */ case IOB12b1: /* I/O Bus Data Parity Error */ case IOB12b2: /* I/O Time-out error */ /* Version 1 and 2 look the same here. */ analyze_io_bus_error(event, 1, error_type); break; case IOB12b3: /* I/O Device Internal Error */ if (io_error_type == IOB12b3B13b2) { /* Int Err, bridge conn. to i/o exp. bus */ report_srn(event, 0, &io634[fru_index]); break; /* out of switch statement */ } e_desc = &io832[0]; sid = 0; sed = 0; if (sid == 0) { e_desc->rcode = sigdev.led; } else if (sed == 0) { e_desc->rcode = sendev.led; } else { /* isolated only to pci bus */ e_desc->rcode = 0x2C9; } report_srn(event, 0, e_desc); break; case IOB12b4: /* I/O Error on non-PCI bus */ report_srn(event, 0, &io730[0]); break; case IOB12b5: /* Mezzanine/Processor Bus Addr. Parity Error */ if (io_error_type == IOB12b5B13b1) { /* Mezzanine/Proc. Bus Addr. Parity Error */ report_srn(event, 0, &io733[fru_index]); break; } if (io_error_type == IOB12b5B13b2) { /* Mezzanine/Proc. Bus Addr. Parity Error */ report_srn(event, 0, &io770[fru_index]); break; } /* Default for IOB12b5, including IOB12b5B13b0. */ report_srn(event, 0, &io731[fru_index]); break; case IOB12b6: /* Mezzanine/Processor Bus Data Parity Error */ if (io_error_type == IOB12b6B13b1) { /* Mezzanine/Proc. Bus Data Parity Error */ report_srn(event, 0, &io734[fru_index]); break; } if (io_error_type == IOB12b6B13b2) { /* Mezzanine/Proc. Bus Addr. Parity Error */ report_srn(event, 0, &io771[fru_index]); break; } if (io_error_type == IOB12b6B13b3) { /* Err detected by i/o exp. bus controller */ report_srn(event, 0, &io773[fru_index]); break; } /* Default for IOB12b6, including IOB12b6B13b0. */ report_srn(event, 0, &io732[fru_index]); break; case IOB12b7: /* Mezzanine/Processor Bus Time-out Error */ if (io_error_type == IOB12b7B13b1) { /* Mezzanine/Processor Bus Time-out Error */ report_srn(event, 0, &io736[fru_index]); break; } if (io_error_type == IOB12b7B13b2) { /* Mezzanine/Proc. Bus Addr. Parity Error */ report_srn(event, 0, &io772[fru_index]); break; } /* Default for IOB12b7, including IOB12b7B13b0. */ report_srn(event, 0, &io735[fru_index]); break; case IOB13b4: /* I/O Expansion Bus Parity Error */ report_srn(event, 0, &io630[fru_index]); break; case IOB13b5: /* I/O Expansion Bus Time-out Error */ report_srn(event, 0, &io631[fru_index]); break; case IOB13b6: /* I/O Expansion Bus Connection Failure */ report_srn(event, 0, &io632[fru_index]); break; case IOB13b7: /* I/O Expansion Bus Connection Failure */ report_srn(event, 0, &io633[fru_index]); break; case SPB16b0: /* T.O. communication response from SP */ report_srn(event, 0, &sp740[0]); break; case SPB16b1: /* I/O (I2C) general bus error */ report_srn(event, 0, &sp640[0]); break; case SPB16b2: /* Secondary I/O (I2C) general bus error */ report_srn(event, 0, &sp641[0]); break; case SPB16b3: /* Internal Service Processor memory error */ report_srn(event, 0, &sp642[0]); break; case SPB16b4: /* SP error accessing special registers */ report_srn(event, 0, &sp741[0]); break; case SPB16b5: /* SP reports unknown communication error */ report_srn(event, 0, &sp742[0]); break; case SPB16b6: /* Internal Service Processor firmware error */ report_srn(event, 0, &sp643[0]); break; case SPB16b7: /* Other internal SP hardware error */ report_srn(event, 0, &sp644[0]); break; case SPB17b0: /* SP error accessing VPD EEPROM */ report_srn(event, 0, &sp743[0]); break; case SPB17b1: /* SP error accessing Operator Panel */ report_srn(event, 0, &sp744[0]); break; case SPB17b2: /* SP error accessing Power Controller */ report_srn(event, 0, &sp745[0]); break; case SPB17b3: /* SP error accessing Fan Sensor */ report_srn(event, 0, &sp746[0]); break; case SPB17b4: /* SP error accessing Thermal Sensor */ report_srn(event, 0, &sp747[0]); break; case SPB17b5: /* SP error accessing Voltage Sensor */ report_srn(event, 0, &sp748[0]); break; case SPB18b0: /* SP error accessing serial port */ report_srn(event, 0, &sp749[0]); break; case SPB18b1: /* SP error accessing NVRAM */ report_srn(event, 0, &sp750[0]); break; case SPB18b2: /* SP error accessing RTC/TOD */ report_srn(event, 0, &sp751[0]); break; case SPB18b3: /* SP error accessing JTAG/COP controller */ report_srn(event, 0, &sp752[0]); break; case SPB18b4: /* SP detect error with tod battery */ report_srn(event, 0, &sp753[0]); break; case SPB18b7: /* SP reboot system due to surv. time-out */ report_srn(event, 0, &sp760[0]); break; case POSTALLZERO: case POSTB12b0: /* Firmware error, revision level %s */ case POSTB12b1: /* Configuration error */ case POSTB12b2: /* CPU POST error */ case POSTB12b3: /* Memory POST error */ case POSTB12b4: /* I/O Subsystem POST error */ case POSTB12b5: /* Keyboard POST error */ case POSTB12b6: /* Mouse POST error */ case POSTB12b7: /* Graphic Adapter/Display POST error */ case POSTB13b0: /* Diskette Initial Program Load error */ case POSTB13b1: /* Drive Controller IPL error */ case POSTB13b2: /* CD-ROM Initial Program Load error */ case POSTB13b3: /* Hard disk Initial Program Load error */ case POSTB13b4: /* Network Initial Program Load error */ case POSTB13b5: /* Other Initial Program Load error */ case POSTB13b7: /* Self-test error in FW extended diagnostics */ /* All of the post error processing goes here. */ e_desc = &post[0]; e_desc->sn = -2; /* have to reset after insert_errdscr */ e_desc->rcode = 0; post_error_code = *(int *)&event->event_buf[I_POSTCODE]; /* Add any (upto 4) chrp location codes from the log */ loc = get_loc_code(event, FIRST_LOC, NULL); i = 0; while (loc && i < 4) { strcpy(e_desc->frus[i++].floc, loc); loc = get_loc_code(event, NEXT_LOC, NULL); } set_fru_percentages(e_desc, i); if (set_srn_and_callouts(event, e_desc, post_error_code)) return -1; break; } } return 0; } /** * analyze_io_bus_error * @brief Analyze the io bus errors, i.e. IOB12b0, IOB12b1, or IOB12b2. */ static int analyze_io_bus_error(struct event *event, int version, int error_type) { struct event_description_pre_v6 *e_desc; int fru_index; struct device_ela sigdev; struct device_ela sendev; int sid, sed; int rc = 0; /* * if this is version 3 or beyond, and there is a physical location * code in the log, then just return for SRN encoding */ if (version >= 3 && LOC_CODES_OK) return 0; if (error_type == IOB12b0) fru_index = 0; else if (error_type == IOB12b1) fru_index = 1; else if (error_type == IOB12b2) fru_index = 2; else return 0; /* can't analyze this error type */ sid = 0; sed = 0; if (sid == 0 && sed == 0) { /* check if a device is parent (the bus) of the other device */ if ( ! strcmp(sigdev.busname, sendev.name)|| ! strcmp(sendev.busname, sigdev.name) ) { e_desc = &io9CC[fru_index]; report_io_error_frus(event, SN9CC, e_desc, &sigdev, &sendev); rc = 1; } else { /* 2 devices from error log */ e_desc = &io833[fru_index]; report_io_error_frus(event, 0x833, e_desc, &sigdev, &sendev); rc = 1; } } else if (sid == 0 || sed == 0) { /* 1 device only */ e_desc = &io9CC[fru_index]; report_io_error_frus(event, SN9CC, e_desc, &sigdev, &sendev); rc = 1; } else { /* bus only */ e_desc = &iobusonly[fru_index]; report_io_error_frus(event, SN9CC, e_desc, &sigdev, &sendev); rc = 1; } return rc; } /** * get_error_fmt * @brief Extract the error log format indicator from the chrp error log. * * @return An integer that is the error log format indicator. */ int get_error_fmt(struct event *event) { return (event->event_buf[I_FORMAT] & 0x0F); } /** * get_error_type * * Uses the error format to return the error bits as an unique * constant for each error. * * @return The error format and error bits as an unique integer. */ static int get_error_type(struct event *event, int fmt) { int error_type; switch (fmt) { case RTAS_EXTHDR_FMT_IBM_SP: error_type = fmt << 24 | event->event_buf[I_BYTE18] << 16 | event->event_buf[I_BYTE17] << 8 | event->event_buf[I_BYTE16]; break; case RTAS_EXTHDR_FMT_EPOW: error_type = fmt << 24 | event->event_buf[I_BYTE17] << 16 | event->event_buf[I_BYTE16] << 8 | (event->event_buf[I_BYTE15] & 0x0F); break; case RTAS_EXTHDR_FMT_CPU: error_type = fmt << 24 | event->event_buf[I_BYTE12]; break; case RTAS_EXTHDR_FMT_IO: /* * First, get the complete io error type, which * includes some info bits. */ io_error_type = fmt << 24 | event->event_buf[I_BYTE13] << 8 | event->event_buf[I_BYTE12]; /* But, return just the sympton bits. */ error_type = io_error_type & IO_BRIDGE_MASK; break; default: error_type = fmt << 24 | event->event_buf[I_BYTE13] << 8 | event->event_buf[I_BYTE12]; } return error_type; } /** * report_srn */ int report_srn(struct event *event, int nlocs, struct event_description_pre_v6 *e_desc) { int i; char *loc; short save_sn; int numLocCodes; /* used in case there are more FRUs than MAXFRUS */ struct event_description_pre_v6 *temp_event; save_sn = e_desc->sn; /* save before insert_errdscr */ /* Add the chrp location codes if nlocs != 0 */ for (i = 0; i < nlocs; i++) { if (i == 0) loc = get_loc_code(event, FIRST_LOC, NULL); else loc = get_loc_code(event, NEXT_LOC, NULL); if (loc) strcpy(e_desc->frus[i].floc, loc); else break; } if (nlocs == 0) { /* * Build a error description that contains a fru for * each of the physical location codes. */ loc = get_loc_code(event, FIRST_LOC, &numLocCodes); i = 0; while (i < MAXFRUS) { if (loc != NULL) { strcpy(e_desc->frus[i].floc, loc); loc = get_loc_code(event, NEXT_LOC, NULL); } e_desc->frus[i].fmsg = 36; i++; } set_fru_percentages(e_desc, numLocCodes); } e_desc->sn = save_sn; if (set_srn_and_callouts(event, e_desc, 0)) return -1; /* if loc is not null, then there are more FRUs than MAXFRUS */ while (loc != NULL) { i = 0; numLocCodes = numLocCodes - MAXFRUS; /* allocate space for more FRUs */ temp_event = (struct event_description_pre_v6 *) calloc(1, sizeof(struct event_description_pre_v6)); /* copy everything over from the original event */ strcpy(temp_event->dname, e_desc->dname); temp_event->flags = e_desc->flags; temp_event->sn = e_desc->sn; temp_event->rcode = e_desc->rcode; temp_event->rmsg = e_desc->rmsg; /* Prepare to add more FRUs */ while (i < MAXFRUS) { if (loc != NULL) { strcpy(temp_event->frus[i].floc, loc); loc = get_loc_code(event, NEXT_LOC, NULL); } temp_event->frus[i].fmsg = 36; i++; } set_fru_percentages(temp_event, numLocCodes); temp_event->sn = save_sn; /* Log additional error descriptions */ if (add_more_descrs(event, temp_event)) return -1; free(temp_event); } event->sl_entry->call_home_status = SL_CALLHOME_CANDIDATE; event->sl_entry->description = (char *)malloc(strlen(e_desc->rmsg)+1); strcpy(event->sl_entry->description, e_desc->rmsg); dbg("srn: \"%s\"", event->sl_entry->refcode); return 0; } /** * get_loc_code * * Gets a physical location codes from the chrp error log. This is * called to get either the first location code or the next location * code. When called to get the first location code, the number of * location codes present in the log is returned. * * The string of location codes is null terminated. However a special * character, ">", means that the location codes that follow should not * be reported to the user via diagnostics. Therefore, processing of * location codes will stop at the first occurance of ">" or a null * terminator. * * RETURNS: * If nlocs is not NULL, returns the count of location codes in the buffer. * NULL if location code not found. * Otherwise a pointer to location code string. * */ char * get_loc_code(struct event *event, int mode, int *nlocs) { char *loc; int prev_space = 0; static char *copyLCB = NULL; static char *save_copyLCB = NULL; static char *start_loc = NULL; /* start or next pointer for loc code */ static char *end_loc = NULL; /* end of location code buffer */ if (! LOC_CODES_OK) { if (nlocs) *nlocs = 0; return NULL; } if (mode == FIRST_LOC) { if (save_copyLCB) { /* throw away the previous allocation of buffer */ /* even though not used up by get next calls */ free(save_copyLCB); copyLCB = NULL; } copyLCB = (char *)malloc(strlen(event->loc_codes) + 1); if (copyLCB == NULL) return NULL; save_copyLCB = copyLCB; strcpy(copyLCB, event->loc_codes); start_loc = copyLCB; /* Force processing to stop at special "Hide" character */ loc = strchr(copyLCB, LOC_HIDE_CHAR); if (loc != NULL) *loc = 0; end_loc = copyLCB + strlen(copyLCB); /* * The number of location codes is determined by the number * of (non-consecutive) spaces in the log, i.e. * 1 space = 2 location codes */ if (nlocs != NULL) { loc = copyLCB; if (*loc) { *nlocs = 0; /* nothing found until !space */ prev_space = 1; /* handle leading spaces */ while (*loc) { if (*loc == ' ') { if (! prev_space) *nlocs = *nlocs + 1; prev_space = 1; } else prev_space = 0; loc++; } if (! prev_space) /* count last location code */ *nlocs = *nlocs + 1; } else *nlocs = 0; /* null means no loc. codes */ } } loc = start_loc; if (loc < end_loc && *loc != 0x0) { /* loc is the start of a location code */ /* use start_loc to find end of location code string */ /* find 1st occurance of null or blank, the loc. code delimit */ while (*loc == ' ') loc++; /* skip leading blanks */ start_loc = loc; while (*start_loc && *start_loc != ' ') start_loc++; *start_loc = 0x0; /* terminate loc string */ start_loc++; /* ready for next call */ return loc; /* return loc */ } else { return NULL; } } /** * get_ext_epow * @brief Get the extended epow status bytes from the chrp log. * * The extended epow data is 2 bytes stored as the MSB of an integer. * * @return the extended epow register from the vendor specific area. */ int get_ext_epow(struct event *event) { int *extepow; int extepowlen; extepow = get_register_data(event, EXT_EPOW_REG_ID, &extepowlen); if (extepow == NULL) return 0; /* I have 0xaabbccdd */ /* I want 0x0000aabb */ return (*extepow >> 16); } /** * get_fan_number */ int get_fan_number(int ext_epow) { int fan; fan = ext_epow & SENSOR_MASK; fan = fan >> 8; return fan; } /** * report_menugoal * @brief Report a menu goal with optional variable substitution into the text. * * The second paramater must always be the menu number (as an uint). * * @returns Always returns 0 */ int report_menugoal(struct event *event, char *fmt, ...) { va_list argp; int offset; char buffer[MAX_MENUGOAL_SIZE], *msg, menu_num_str[20]; int rlen; short *refc; unsigned refcode; buffer[0]='\0'; va_start(argp, fmt); offset = sprintf(buffer, fmt, argp); va_end(argp); if (strlen(buffer)) { /* * There is a menugoal. If this menugoal is from ELA, * check if a ref. code exists in the error log. */ if (event->errdata.sequence) { refc = (short *)get_register_data(event, SRC_REG_ID_04, &rlen); if (refc) { int msglen; /* There is a refcode; append to the menugoal */ refcode = *(uint *)refc; msglen = strlen(MSGMENUG_REFC) + 2 * sizeof(refcode) + 1; if (strlen(buffer) + msglen < MAX_MENUGOAL_SIZE) { offset += sprintf(buffer + offset, MSGMENUG_REFC, refcode); } /* * Check if there are location codes * supporting the refcode */ if (LOC_CODES_OK) { /* * append to menugoal as * supporting data */ msglen = strlen(MSGMENUG_LOC) + strlen(event->loc_codes) + 1; if (strlen(buffer) + msglen < MAX_MENUGOAL_SIZE) { offset += sprintf( buffer + offset, MSGMENUG_LOC, event->loc_codes); } } } } snprintf(menu_num_str, 20, "#%d", atoi(buffer)); event->sl_entry->refcode = (char *)malloc( strlen(menu_num_str)+1); strcpy(event->sl_entry->refcode, menu_num_str); msg = strchr(buffer, ' ') + 1; event->sl_entry->description = (char *)malloc(strlen(msg)+1); strcpy(event->sl_entry->description, msg); dbg("menugoal: number = %s, message = \"%s\"", menu_num_str, msg); } return 0; } /** * report_io_error_frus * * Build error description for i/o detected errors. The number of frus is * determined by the number of devices returned in the error log. */ int report_io_error_frus(struct event *event, int sn, struct event_description_pre_v6 *e_desc, struct device_ela *sig, struct device_ela *sen) { char *loc; int i; char *p; int swap_locs = 0; if (sig->status == DEVICE_OK && sen->status == DEVICE_OK) { /* 2 devices returned from error log */ /* if one is non integrated, use it for the srn */ /* otherwise if one is not a bridge device use if the for srn */ if (sen->slot != 0) { e_desc->rcode = sen->led; strcpy(e_desc->frus[0].fname, sen->name); strcpy(e_desc->frus[1].fname, sig->name); if (sn == 0x833) strcpy(e_desc->frus[2].fname, sen->busname); } else if (sig->slot != 0) { e_desc->rcode = sig->led; strcpy(e_desc->frus[0].fname, sig->name); strcpy(e_desc->frus[1].fname, sen->name); if (sn == 0x833) strcpy(e_desc->frus[2].fname, sig->busname); swap_locs = 1; /* f/w list the sender 1st in log */ } else if (sen->devfunc != 0 || sig->devfunc == 0) { e_desc->rcode = sen->led; strcpy(e_desc->frus[0].fname, sen->name); strcpy(e_desc->frus[1].fname, sig->name); if (sn == 0x833) strcpy(e_desc->frus[2].fname, sen->busname); } else { e_desc->rcode = sig->led; strcpy(e_desc->frus[0].fname, sig->name); strcpy(e_desc->frus[1].fname, sen->name); if (sn == 0x833) strcpy(e_desc->frus[2].fname, sig->busname); swap_locs = 1; /* f/w list the sender 1st in log */ } } else if (sig->status == DEVICE_OK) { /* 1 device returned from error log */ e_desc->rcode = sig->led; strcpy(e_desc->frus[0].fname, sig->name); strcpy(e_desc->frus[1].fname, sig->busname); swap_locs = 1; /* f/w list the sender 1st in log */ } else if (sen->status == DEVICE_OK) { /* 1 device returned from error log */ e_desc->rcode = sen->led; strcpy(e_desc->frus[0].fname, sen->name); strcpy(e_desc->frus[1].fname, sen->busname); } else { if (sig->status == DEVICE_BUS) { strcpy(e_desc->frus[0].fname, sig->busname); p = sig->busname; swap_locs = 1; /* f/w list the sender 1st in log */ } else { strcpy(e_desc->frus[0].fname, sen->busname); p = sen->busname; } /* Convert number in busname, i.e. pcixx, */ /* where xx is 0 to 99, */ /* to integer 1xx for the reason code. */ while (! isdigit (*p) && *p != 0) p++; e_desc->rcode = atoi(p) + 0x100; } /* * Add any chrp location code from the log */ loc = get_loc_code(event, FIRST_LOC, NULL); i = 0; while (loc && i < 2) { /* this error description is for 2 frus */ /* * For the case when the signaling device is non-integrated, * the location codes must be swapped. */ if (swap_locs) { if (i == 0) { /* 1st loc code goes in 2nd fru */ /* but also puting loc in 1st fru */ /* in case there is only 1 loc. */ strcpy(e_desc->frus[0].floc, loc); strcpy(e_desc->frus[1].floc, loc); } else if ( i == 1 ) { /* 2nd loc code goes in 1st fru */ strcpy(e_desc->frus[0].floc, loc); } } else { /* Here if not swap_locs */ strcpy(e_desc->frus[i].floc, loc); } i++; loc = get_loc_code(event, NEXT_LOC, NULL); } if (i) set_fru_percentages(e_desc, i); if (set_srn_and_callouts(event, e_desc, 0)) return -1; return 0; } /* Its a planar if P and (not - and not /) */ #define is_planar(x) (x != NULL && strchr(x, 'P') && (!strchr(x,'-') && !strchr( x,'/'))) /* Its a CPU if 'C' */ #define is_cpu(x) (x != NULL && strchr(x, 'C')) #define is_not_fru(x) (x == NULL || strlen(x) == 0) /** * get_cpu_frus * * Gets the RTAS generated FRUs from a CPU detected error log * and arranges the frus to match the awaiting error description. * This should be called for CPUB12Bb6 and CPUB12b7 errors. * * OUTPUTS: The location code buffer is rearranged if necessary. * * RETURNS: RC_INVALID - if invalid or unknown combination of frus * RC_PLANAR - if only a planar fru is found * RC_PLANAR_CPU - if a planar and a CPU fru are found * RC_PLANAR_2CPU -if a planar and 2 CPUs frus are found */ static int get_cpu_frus(struct event *event) { char *buf; char *loc1 = NULL, *loc2 = NULL, *loc3 = NULL; int nlocs = 0; int rc = RC_INVALID; buf = (char *)malloc(strlen(event->loc_codes)+4); if (buf == NULL) return 0; loc1 = buf; strcpy(loc1, get_loc_code(event, FIRST_LOC, &nlocs)); if (nlocs < 1) { free(buf); return rc; } if (nlocs > 1) { loc2 = loc1 + strlen(loc1) + 1; strcpy(loc2, get_loc_code(event, NEXT_LOC, NULL)); } if ( nlocs > 2 ) { loc3 = loc2 + strlen(loc2) + 1; strcpy(loc3, get_loc_code(event, NEXT_LOC, NULL)); } if (is_planar(loc1)) { if (is_not_fru(loc2)) rc = RC_PLANAR; else if (is_cpu(loc2)) { if (is_not_fru(loc3)) rc = RC_PLANAR_CPU; else if (is_cpu(loc3)) rc = RC_PLANAR_2CPU; } } else if (is_cpu(loc1)) { if (is_planar(loc2)) { if (is_not_fru(loc3)) { /* Rearrange locs as loc2, loc1 */ if (event->loc_codes != NULL) free(event->loc_codes); event->loc_codes = (char *) malloc(strlen(loc1) + strlen(loc2) + 2); if (event->loc_codes == NULL) return 0; sprintf(event->loc_codes, "%s %s", loc2, loc1); rc = RC_PLANAR_CPU; } else if (is_cpu(loc3)) { /* Rearrange loc as loc2, loc1, loc3 */ if (event->loc_codes != NULL) free(event->loc_codes); event->loc_codes = (char *) malloc(strlen(loc1) + strlen(loc2) + strlen(loc3) + 3); if (event->loc_codes == NULL) return 0; sprintf(event->loc_codes, "%s %s %s", loc2, loc1, loc3); rc = RC_PLANAR_2CPU; } } } free(buf); return rc; } /** * process_v1_epow * @brief Analyze the Version 1 EPOW error log. * * INPUTS: * The encoded error type. * * RETURNS: * 1 if diagnostic conclusion, * otherwise 0. */ int process_v1_epow(struct event *event, int error_type) { int rc = 1; int class; int ext_epow; int ext_epow_nofan; int fan_num; /* * The following EPOW error logs found in CHRP, Ver. 1 * error logs. */ class = error_type & 0xFF; ext_epow = get_ext_epow(event); ext_epow_nofan = ext_epow & IGNORE_SENSOR_MASK; if (ext_epow == 0) { if (class == 5) { /* System shutdown due loss of AC power */ report_srn(event, 0, epow812); } else { /* This error log is unknow to ELA */ unknown_epow_ela(event, class); rc = -1; } } else switch (ext_epow_nofan) { case XEPOW1n11: /* Fan turning slow */ fan_num = get_fan_number(ext_epow); report_srn(event, 0, epow800); break; case XEPOW1n64: /* Fan stop was detected */ fan_num = get_fan_number(ext_epow); report_srn(event, 0, epow801); break; case XEPOW2n32: /* Over voltage condition */ report_srn(event, 0, epow810); break; case XEPOW2n52: /* Under voltage condition */ report_srn(event, 0, epow811); break; case XEPOW3n21: /* Over temperature condition */ report_srn(event, 0, epow820); break; case XEPOW3n73: /* Shutdown over max temp. */ report_srn(event, 0, epow821); break; default: /* This error log is unknow to ELA */ unknown_epow_ela(event, class); rc = -1; } return rc; } /** * loss_power_MG * * Displays the menu goal used for a Loss of Power EPOW. * Used by both V2 and V3 EPOW ELA. */ void loss_power_MG(struct event *event) { if (LOC_CODES_OK) report_menugoal(event, MSGMENUG150, event->loc_codes); else report_menugoal(event, MSGMENUG151); } /** * manual_power_off_MG * * Displays the menu goal used for Manual activation of power off button. * Used by both V2 and V3 EPOW ELA. */ void manual_power_off_MG(struct event *event) { /* need the timestamp from the error log */ /* need the error log sequence number */ /* and report this as a menugoal */ report_menugoal(event, MSGMENUG162, event->errdata.time_stamp, event->errdata.sequence); } /** * process_v2_epow * @brief Analyze the Version 2 and Version 3 EPOW error logs. * * @returns 1 if diagnostic conclusion, otherwise 0. */ int process_v2_epow(struct event *event, int error_type) { int rc = 1; int class; int *reg, rlen, ext_epow; class = error_type & 0xFF; /* * Look for an EPOW detected by a defined sensor. */ if (error_type & EPOWB16b0) rc = sensor_epow(event, error_type, 2); else if (error_type & EPOWB16b1) { /* look for power fault epow */ /* look for extended debug data in case necessary */ reg = get_register_data(event, PCI_EPOW_REG_ID, &rlen); if (reg) ext_epow = *reg & PCIEPOWMASK; if (error_type & EPOWB17b0) { /* unspecified cause for power fault */ /* report SRN only if frus in error log */ if (class < 3) { if (LOC_CODES_OK) report_srn(event, 0, epow809); else report_menugoal(event, MSGMENUG175); } else { if (LOC_CODES_OK) report_srn(event, 0, epow824); else report_menugoal(event, MSGMENUG175); } } else if (error_type & EPOWB17b1) { /* loss of power source */ /* first checking system specific data */ if (ext_epow == PCIEPOW111) /* AC power to entire system */ report_srn(event, 0, epow813); else if (ext_epow == PCIEPOW100) /* AC power to CEC */ report_srn(event, 0, epow814); else if (ext_epow == PCIEPOW011) /* AC power to I/O Rack */ report_srn(event, 0, epow815); else /* here if no system specific data */ loss_power_MG(event); } else if (error_type & EPOWB17b2) { /* internal power supply failure */ if (ext_epow == PCIEPOW001) /* 3/4 ps in I/O rack */ report_srn(event, 0, epow816); else if (ext_epow == PCIEPOW010) /* 1/4 ps in I/O rack */ report_srn(event, 0, epow817); else if (error_type & EPOWB16b4) { report_srn(event, 0, epow819red); } else report_srn(event, 0, epow819); } else if (error_type & EPOWB17b3) /* manual power off via op panel */ manual_power_off_MG(event); else { /* Reserved bits in EPOW log */ /* This error log is unknow to ELA */ unknown_epow_ela(event, class); rc = -1; } } else if (error_type & EPOWB16b2) { if (error_type & EPOWB16b4) { /* Loss of redundant fan */ report_srn(event, 0, epow652820); } else if (error_type & EPOWB16b3) { /* System shutdown - thermal & fan */ report_srn(event, 0, epow822); } else { if (class < 3) report_srn(event, 0, epow802); else report_srn(event, 0, epow823); } } else if (error_type & EPOWB16b3) { /* look for Over temperature conditions */ /* Over temperature condition */ report_srn(event, 0, epow821); } else if (error_type & EPOWB16b4) { /* look for loss of redundancy, without any other indication */ /* Loss of redundant power supply */ report_srn(event, 0, epow652810); } else /* This error log is unknown */ unknown_epow_ela(event, class); rc = -1; return rc; } /** * sensor_epow * * Analysis EPOW error logs that were detected by a defined sensor. * The resulting error description is different depending on the error log * version. Supports version 2 and 3. * * INPUTS: * The encoded error type. * * @returns 1 if diagnostic conclusion, otherwise 0. * */ int sensor_epow(struct event *event, int error_type, int version) { int class, token, index, redundancy, status; struct event_description_pre_v6 *e_desc; char sensor_name [256]; char fru_name[256]; int rc = 1; class = error_type & 0xFF; token = *(int*)&event->event_buf[I_TOKEN]; index = *(int*)&event->event_buf[I_INDEX]; redundancy = (error_type & LOGB16b4); status = *(int*)&event->event_buf[I_STATUS]; dbg("EPOW class = %d, token = %d, index = %d", class, token, index); switch (token) { case FAN: if (version == 3) { e_desc = v3_errdscr; e_desc->rcode = 0x10; } else { e_desc = fan_epow; e_desc->rcode = 0x830; } break; case VOLT: sprintf(fru_name, "%s", F_POWER_SUPPLY); sprintf(sensor_name, F_EPOW_ONE, F_VOLT_SEN_2, index + 1); if (version == 3) { e_desc = v3_errdscr; e_desc->rcode = 0x30; } else { e_desc = volt_epow; strcpy(e_desc->frus[0].fname, fru_name); strcpy(e_desc->frus[1].fname, sensor_name); e_desc->rcode = 0x831; } break; case THERM: sprintf(sensor_name, F_EPOW_ONE, F_THERM_SEN, index + 1); if (version == 3) { e_desc = v3_errdscr; e_desc->rcode = 0x50; } else { e_desc = therm_epow; strcpy(e_desc->frus[0].fname, sensor_name); e_desc->rcode = 0x832; } break; case POWER: sprintf(fru_name, F_EPOW_ONE, F_POWER_SUPPLY, index + 1); sprintf(sensor_name, "%s", F_POW_SEN); if (version == 3) { e_desc = v3_errdscr; e_desc->rcode = 0x70; } else { e_desc = pow_epow; strcpy(e_desc->frus[0].fname, fru_name); strcpy(e_desc->frus[1].fname, sensor_name); e_desc->rcode = 0x833; } break; default: if (version == 3) { e_desc = v3_errdscr; e_desc->rcode = 0x90; } else { e_desc = unknown_epow; e_desc->rcode += 0x839; } break; } if (version != 3) e_desc->sn = 0x651; if (redundancy) { if (version == 3) e_desc->sn |= 0x010; else e_desc->sn = 0x652; switch (token) { case FAN: if (version == 3) e_desc->rcode = 0x110; e_desc->rmsg = MSGRED_FAN; break; case POWER: if (version == 3) e_desc->rcode = 0x120; e_desc->rmsg = MSGRED_POWER; break; default: if (version == 3) e_desc->rcode = 0x130; e_desc->rmsg = MSGRED_UNK; break; } } else { switch (status) { case CRITHI: case CRITLO: switch (token) { case FAN: e_desc->rmsg = MSGCRIT_FAN; if (version == 3) { if (class > 2) { e_desc->rcode = 0x20; e_desc->rmsg = MSGCRIT_FAN_SHUT; } } break; case VOLT: e_desc->rmsg = MSGCRIT_VOLT; if (version == 3) { if (class > 2) { e_desc->rcode = 0x40; e_desc->rmsg = MSGCRIT_VOLT_SHUT; } } break; case THERM: e_desc->rmsg = MSGCRIT_THERM; if (version == 3) { if (class > 2) { e_desc->rcode = 0x60; e_desc->rmsg = MSGCRIT_THERM_SHUT; } } break; case POWER: e_desc->rmsg = MSGCRIT_POWER; if (version == 3) { if (class > 2) { e_desc->rcode = 0x80; e_desc->rmsg = MSGCRIT_POWER_SHUT; } } break; default: e_desc->rmsg = MSGCRIT_UNK; if (version == 3) { if (class > 2) { e_desc->rcode = 0x100; e_desc->rmsg = MSGCRIT_UNK_SHUT; } } break; } break; case WARNHI: case WARNLO: if (version == 3) e_desc->sn += 0x10; else e_desc->rcode += 0x10; switch (token) { case FAN: e_desc->rmsg = MSGWARN_FAN; break; case VOLT: e_desc->rmsg = MSGCRIT_VOLT; break; case THERM: e_desc->rmsg = MSGCRIT_THERM; break; case POWER: e_desc->rmsg = MSGCRIT_POWER; break; default: e_desc->rmsg = MSGCRIT_UNK; break; } break; default: if (status == NORMAL || status == GS_SUCCESS) return 0; /* ignore; not error */ else { /* here if error log indicates error */ /* from get-sensor-status */ if (LOC_CODES_OK) report_menugoal(event, MSGMENUG152, event->loc_codes); else report_menugoal(event, MSGMENUG153); return 0; /* don't report err */ } break; } } if (version != 3) /* adds any location codes from log */ report_srn(event, 0, e_desc); /* * Version 3 will be reported after return because there is more to * add to event */ return rc; } /** * unknown_epow_ela * * Makes a diagnostic conclusion, i.e. menu goal, for an error log that * is unknown to ELA for any of the following: * - non-product specific Version 1 logs * - unknown register debug data in log * - (thought to be) reserved bits set in log * * INPUTS: * the EPOW class */ void unknown_epow_ela(struct event *event, int class) { if (class < 3) { if (LOC_CODES_OK) report_menugoal(event, MSGMENUG156, event->loc_codes); else report_menugoal(event, MSGMENUG157); } else if ( class == 3 ) { if (LOC_CODES_OK) report_menugoal(event, MSGMENUG158, event->loc_codes, get_tod()); else report_menugoal(event, MSGMENUG159, get_tod); } else { if (LOC_CODES_OK) report_menugoal(event, MSGMENUG160, event->loc_codes); else report_menugoal(event, MSGMENUG161); } } /** * process_v2_sp * @brief Analyze the Version 2 SP error logs. * * INPUTS: * The encoded error type. * * @returns 1 if diagnostic conclusion, otherwise 0. */ int process_v2_sp(struct event *event, int error_type) { if (event->event_buf[0] != 0x02) return 0; /* not a version 2 log */ if ((error_type & 0xFF000000) != SPLOG) return 0; /* not a SP log */ if (event->event_buf[I_BYTE19] & 0x80) { /* Byte 19, bit 0 */ report_srn(event, 0, sp754); return 1; } dbg("Found unknown version 2 SP log"); return 0; } /** * process_v3_logs * @brief Analyze the Version 3 and beyond error logs. * * INPUTS: * The encoded error type. * * @returns 1 if diagnostic conclusion, otherwise 0. */ int process_v3_logs(struct event *event, int error_type) { int version; int platform_specific; int predictive; int replace_all; int concurrent; int sw_also; int format_type; int errdscr_ready = 0; int seqn; char *msg; version = event->event_buf[0]; if (version < 0x03) return 0; /* not a version 3 or beyond log */ /* Does log contain platform specific error code? */ platform_specific = event->event_buf[I_BYTE1] & 0x80; if (platform_specific) { /* get the error code nibble */ platform_specific = event->event_buf[I_BYTE1] & 0x0F; platform_error[0].rcode += platform_specific; report_srn(event, 0, platform_error); /* reset rcode to be correct for additional errors */ platform_error[0].rcode -= platform_specific; return 1; } /* Get error format type from log */ format_type = (error_type & 0xFF000000) >> 24; /* Treat POST detected errors as Version 1. */ if (format_type == RTAS_EXTHDR_FMT_POST) return 0; /* Encode the log format type into the SRN */ v3_errdscr[0].sn = SN_V3ELA + format_type; /* If predictive error, then modify source number */ predictive = event->event_buf[I_BYTE0] & 0x08; if (format_type == RTAS_EXTHDR_FMT_EPOW) { /* if ok, errdscr needs only modifier bits */ errdscr_ready = process_v3_epow(event, error_type, version); if (errdscr_ready == 2) return 1; /* refcode, so skip the rest */ } else { /* Convert symptom bits to sequence number. */ seqn = convert_symptom(event, format_type, predictive, &msg); if (seqn == 0x100) /* a menugoal was used in lieu of a SRN */ return 1; v3_errdscr[0].rcode = (seqn << 4); v3_errdscr[0].rmsg = msg; if (seqn == 0xFF) { /* Check for SRC (ref-code) data */ short *refc; int rlen; refc = (short *)get_register_data(event, SRC_REG_ID_04, &rlen); if (refc != NULL) { process_refcodes(event, refc, rlen); return 1; } /* Don't modify the SRN any further because of */ /* unknown symptom bits or error log format. */ report_srn(event, 0, v3_errdscr); return 1; } errdscr_ready = 1; } /* Ok to continue encoding the SRN. */ if (predictive) v3_errdscr[0].sn |= 0x010; /* Get other modifiers from the error log header */ /* replace all frus in list */ replace_all = event->event_buf[I_BYTE3] & 0x20; /* repair as system running */ concurrent = event->event_buf[I_BYTE3] & 0x40; /* sw also a probable cause */ sw_also = event->event_buf[I_BYTE3] & 0x80; while (sw_also) { /* using while statement so can break out if canceled */ /* further analysis needed for s/w also as a cause */ report_menugoal(event, MSGMENUG171); break; } /* Combine repair modifiers to nibble for the reason code. */ v3_errdscr[0].rcode += ((sw_also + concurrent + replace_all) >> 5); if (errdscr_ready > 0) report_srn(event, 0, v3_errdscr); return 1; } /** * convert_symptom * * FUNCTION: * Converts the symptom bits into a unique sequence number for the * error log format, and finds the reason code message for the SRN. * * INPUTS: * format_type - the format of the error log * predictive - flag used to determine type of message * * OUTPUTS: * The message number of the reason code message. * predictive indicates whether the SRN should reflect deferred repair. * * RETURNS: * The BCD sequence number, 0 to 0x99 for encoding into a SRN. * * If there is any error, the sequence number returned will be 0xFF. * The error could be unknown unknow error log format. * Unknown symptom bits will be defaulted to ALL ZEROS in the * symptom bits, which will be sequence number 0. * * 0x100 will be returned if a menugoal, or another SRN type was * displayed in lieu of encoding a SRN. * */ #define NCPUSYMPTOMS 9 #define NMEMSYMPTOMS 17 #define NIOSYMPTOMS 17 #define NSPSYMPTOMS 33 #define NSPSYMPTOMS_ADDITIONAL 9 int convert_symptom(struct event *event, int format_type, int predictive, char **msg) { int seqn; int sbits; int signature; int msg_index; int error_type; /* Look up tables for sequence number to reason code messages. */ int cpu_log_sig[NCPUSYMPTOMS] = {0x00, 0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01}; char *cpu_log[NCPUSYMPTOMS][2]= { { MSGCPUALLZERO, DEFER_MSGALLZERO}, { MSGCPUB12b0, DEFER_MSGCPUB12b0}, { MSGCPUB12b1, DEFER_MSGCPUB12b1}, { MSGCPUB12b2, DEFER_MSGCPUB12b2}, { MSGCPUB12b3, DEFER_MSGCPUB12b3}, { MSGCPUB12b4, DEFER_MSGCPUB12b4}, { MSGCPUB12b5, DEFER_MSGCPUB12b5}, { MSGCPUB12b6, DEFER_MSGCPUB12b6}, { MSGCPUB12b7, DEFER_MSGCPUB12b7} }; int mem_log_sig[NMEMSYMPTOMS] = {0x0000, 0x8000, 0x4000, 0x2000, 0x1000, 0x0800, 0x0400, 0x0200, 0x0100, 0x0080, 0x0040, 0x0020, 0x0010, 0x0008, 0x0004, 0x0002, 0x0001}; char *mem_log[NMEMSYMPTOMS][2] = { { MSGMEMALLZERO, DEFER_MSGALLZERO}, { MSGMEMB12b0, DEFER_MSGMEMB12b0}, { MSGMEMB12b1, DEFER_MSGMEMB12b1}, { MSGMEMB12b2, DEFER_MSGMEMB12b2}, { MSGMEMB12b3, DEFER_MSGMEMB12b3}, { MSGMEMB12b4, DEFER_MSGMEMB12b4}, { MSGMEMB12b5, DEFER_MSGMEMB12b5}, { MSGMEMB12b6, DEFER_MSGMEMB12b6}, { MSGMEMB12b7, DEFER_MSGMEMB12b7}, { MSGMEMB13b0, DEFER_MSGMEMB13b0}, { MSGMEMB13b1, DEFER_MSGMEMB13b1}, { MSGMEMB13b2, DEFER_MSGMEMB13b2}, { MSGMEMB13b3, DEFER_MSGMEMB13b3}, { MSGMEMB13b4, DEFER_MSGMEMB13b4}, { MSGRESERVED, DEFER_MSGRESERVED}, { MSGMEMB13b6, DEFER_MSGMEMB13b6}, { MSGMEMB13b7, DEFER_MSGMEMB13b7}, }; /* I/O Byte 13, bits 0-2 are describtions */ /* that are masked off the symptom bits. */ int io_log_sig[NIOSYMPTOMS] = {0x0000, 0x8000, 0x4000, 0x2000, 0x1000, 0x0800, 0x0400, 0x0410, 0x0200, 0x0210, 0x0100, 0x0110, 0x0010, 0x0008, 0x0004, 0x0002, 0x0001}; char * io_log[NIOSYMPTOMS][3] = { { MSGIOALLZERO, DEFER_MSGALLZERO}, { MSGIOB12b0, DEFER_MSGIOB12b0}, { MSGIOB12b1, DEFER_MSGIOB12b1}, { MSGIOB12b2, DEFER_MSGIOB12b2}, { MSGIOB12b3, DEFER_MSGIOB12b3}, { MSGIOB12b4, DEFER_MSGIOB12b4}, { MSGIOB12b5, DEFER_MSGIOB12b5}, { MSGIOB12b5B13b3, DEFER_MSGIOB12b5B13b3}, { MSGIOB12b6, DEFER_MSGIOB12b6}, { MSGIOB12b6B13b3, DEFER_MSGIOB12b6B13b3}, { MSGIOB12b7, DEFER_MSGIOB12b7}, { MSGIOB12b7B13b3, DEFER_MSGIOB12b7B13b3}, { MSGIOB13b3, DEFER_MSGIOB13b3}, { MSGIOB13b4, DEFER_MSGIOB13b4}, { MSGIOB13b5, DEFER_MSGIOB13b5}, { MSGIOB13b6, DEFER_MSGIOB13b6}, { MSGIOB13b7, DEFER_MSGIOB13b7}, }; int sp_log_sig[NSPSYMPTOMS] = { 0x00000000, 0x80000000, 0x40000000, 0x20000000, 0x10000000, 0x08000000, 0x04000000, 0x02000000, 0x01000000, 0x00800000, 0x00400000, 0x00200000, 0x00100000, 0x00080000, 0x00040000, 0x00020000, 0x00010000, 0x00008000, 0x00004000, 0x00002000, 0x00001000, 0x00000800, 0x00000400, 0x00000200, 0x00000100, 0x00000080, 0x00000040, 0x00000020, 0x00000010, 0x00000008, 0x00000004, 0x00000002, 0x00000001}; char *sp_log[NSPSYMPTOMS][2] = { { MSGSPALLZERO, DEFER_MSGALLZERO}, { MSGSPB16b0, DEFER_MSGSPB16b0}, { MSGSPB16b1, DEFER_MSGSPB16b1}, { MSGSPB16b2, DEFER_MSGSPB16b2}, { MSGSPB16b3, DEFER_MSGSPB16b3}, { MSGSPB16b4, DEFER_MSGSPB16b4}, { MSGSPB16b5, DEFER_MSGSPB16b5}, { MSGSPB16b6, DEFER_MSGSPB16b6}, { MSGSPB16b7, DEFER_MSGSPB16b7}, { MSGSPB17b0, DEFER_MSGSPB17b0}, { MSGSPB17b1, DEFER_MSGSPB17b1}, { MSGSPB17b2, DEFER_MSGSPB17b2}, { MSGSPB17b3, DEFER_MSGSPB17b3}, { MSGSPB17b4, DEFER_MSGSPB17b4}, { MSGSPB17b5, DEFER_MSGSPB17b5}, { MSGRESERVED,DEFER_MSGRESERVED}, { MSGRESERVED,DEFER_MSGRESERVED}, { MSGSPB18b0, DEFER_MSGSPB18b0}, { MSGSPB18b1, DEFER_MSGSPB18b1}, { MSGSPB18b2, DEFER_MSGSPB18b2}, { MSGSPB18b3, DEFER_MSGSPB18b3}, { MSGSPB18b4, DEFER_MSGSPB18b4}, { MSGRESERVED,DEFER_MSGRESERVED}, { MSGSPB18b6, DEFER_MSGSPB18b6}, { MSGSPB18b7, DEFER_MSGSPB18b7}, { MSGSPB19b0, DEFER_MSGSPB19b0}, { MSGSPB19b1, DEFER_MSGSPB19b1}, { MSGRESERVED, DEFER_MSGRESERVED}, { MSGRESERVED, DEFER_MSGRESERVED}, { MSGSPB19b4, DEFER_MSGSPB19b4}, { MSGSPB19b5, DEFER_MSGSPB19b5}, { MSGSPB19b6, DEFER_MSGSPB19b6}, { MSGRESERVED, DEFER_MSGRESERVED}, }; int sp_log_additional_sig[NSPSYMPTOMS_ADDITIONAL] = {0x00, 0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01}; char *sp_log_additional[NSPSYMPTOMS_ADDITIONAL][2] = { { MSGSPALLZERO, DEFER_MSGALLZERO}, { MSGSPB28b0, DEFER_MSGSPB28b0}, { MSGSPB28b1, DEFER_MSGSPB28b1}, { MSGSPB28b2, DEFER_MSGSPB28b2}, { MSGSPB28b3, DEFER_MSGSPB28b3}, { MSGSPB28b4, DEFER_MSGSPB28b4}, { MSGSPB28b5, DEFER_MSGSPB28b5}, { MSGSPB28b6, DEFER_MSGSPB28b6}, { MSGSPB28b7, DEFER_MSGSPB28b7}, }; *msg = NULL; seqn = 1; msg_index = 0; if (predictive) msg_index = 1; switch (format_type) { case RTAS_EXTHDR_FMT_CPU: sbits = event->event_buf[I_BYTE12]; while (seqn < NCPUSYMPTOMS) { signature = cpu_log_sig[seqn]; if ((sbits & signature) == signature) break; seqn++; } if (seqn == NCPUSYMPTOMS) seqn = 0; *msg = cpu_log[seqn][msg_index]; break; case RTAS_EXTHDR_FMT_MEMORY: sbits = (event->event_buf[I_BYTE12] << 8) | event->event_buf[I_BYTE13]; while (seqn < NMEMSYMPTOMS) { signature = mem_log_sig[seqn]; if ((sbits & signature) == signature) break; seqn++; } if (seqn == NMEMSYMPTOMS) seqn = 0; *msg = mem_log[seqn][msg_index]; break; case RTAS_EXTHDR_FMT_IO: /* first check for io bus error that isolates */ /* only to a bus, i.e. produces SRN 9CC-1xx */ error_type = get_error_type(event, format_type); if (analyze_io_bus_error(event, 3, error_type)) { return 0x100; } sbits = (event->event_buf[I_BYTE12] << 8) | event->event_buf[I_BYTE13]; sbits &= 0x0FF1F; while (seqn < NIOSYMPTOMS) { signature = io_log_sig[seqn]; if ((sbits & signature) == signature) break; seqn++; } if (seqn == NIOSYMPTOMS) seqn = 0; *msg = io_log[seqn][msg_index]; break; case RTAS_EXTHDR_FMT_IBM_SP: sbits =((event->event_buf[I_BYTE16] << 24) | (event->event_buf[I_BYTE17] << 16) | (event->event_buf[I_BYTE18] << 8 ) | event->event_buf[I_BYTE19]); if (sbits) { while (seqn < NSPSYMPTOMS) { signature = sp_log_sig[seqn]; if ((sbits & signature) == signature) break; seqn++; } if (seqn >= NSPSYMPTOMS) seqn = 0; *msg = sp_log[seqn][msg_index]; break; } else { /* use additional symptom bits */ sbits = event->event_buf[I_BYTE28]; if (!sbits) { seqn = 0; *msg = sp_log_additional[seqn][msg_index]; } else { while ((seqn < NSPSYMPTOMS_ADDITIONAL)) { signature = sp_log_additional_sig[seqn]; if ((sbits & signature) == signature) break; seqn++; } if (seqn >= NSPSYMPTOMS_ADDITIONAL) { seqn = 0; *msg = sp_log_additional[seqn][msg_index]; } else { *msg = sp_log_additional[seqn][msg_index]; seqn += (NSPSYMPTOMS - 1); /* after original symptom bits */ } } break; } default: /* * Should not get here unless the format is * unsupported for Version 3 logs. It would * be an architecture violation by RTAS. * * Assign a sequence number of FF and a * message that indicates the error log is * unknown, and the SRN will be undocumented. * The SRN will look like: * A00-FF0 */ seqn = 0xFF; *msg = MSG_UNKNOWN_V3; return seqn; } /* convert sequence number to BCD */ seqn = convert_bcd(seqn); return seqn; } /** * process_v3_epow * @brief Analyze Versions 3 and beyond EPOW error logs. * * INPUTS: * The encoded error type. * The version of the RPA error log format. * * OUTPUTS: * Fills in the v3_errdscr or reports SRN with refcodes. * * RETURNS: * 1 if errdscr is ready, * 2 if refcode was reported * otherwise 0, i.e. a menu goal was reported instead. * */ /* * This macro will process any "04" tagged debug data for Ref Codes, * contained in a Version 4 or greater RPA error log. The intend is * to call out the ref codes, unless the analysis would be a menugoal only. * For a menugoal, any ref code will be appended to the menugoal for * reference if the problem can not be solved by report_menugoal. */ #define PROCESS_V4_REFCODE \ if (version > 3 && \ (refc = (short *)get_register_data(event, SRC_REG_ID_04, &rlen)) != NULL )\ { \ process_refcodes(event, refc, rlen); \ return 2; \ } int process_v3_epow(struct event *event, int error_type, int version) { int rc = 1; int class; int rlen; short *refc; class = error_type & 0xFF; if (class == 0) { /* * This is an EPOW reset, so save it and go to the next * (older) error */ save_epow_reset(event, error_type); return 0; } else if (has_epow_reset(event, error_type)) { /* this error has been reset */ return 0; /* continue */ } v3_errdscr[0].rcode = 0; v3_errdscr[0].rmsg = MSGEPOWALLZERO; /* Look for an EPOW detected by a defined sensor. */ if (error_type & EPOWB16b0) { PROCESS_V4_REFCODE /* returns if callout is refcode */ rc = sensor_epow(event, error_type, version); } else if (error_type & EPOWB16b1) { /* look for power fault epow */ if (error_type & EPOWB17b0) { /* unspecified cause for power fault */ PROCESS_V4_REFCODE /* returns if callout is refcode */ v3_errdscr[0].rcode = 0x140; if (class < 3) { v3_errdscr[0].sn |= 0x10; v3_errdscr[0].rmsg = MSGEPOWB17b0C12; } else { v3_errdscr[0].rmsg = MSGEPOWB17b0C37; } } else if (error_type & EPOWB17b1) { if (error_type & EPOWB16b4) { /* loss of redundant input */ report_menugoal(event, MSGMENUG204); rc = 0; } else if (class == 2 && version == 4) { /* this is Version 4, so refer to * possible battery backup */ report_menugoal(event, MSGMENUG205); rc = 0; } else { /* loss of power source */ loss_power_MG(event); rc = 0; } } else if (error_type & EPOWB17b2) { /* internal power supply failure */ PROCESS_V4_REFCODE /* returns if callout is refcode */ v3_errdscr[0].rcode = 0x160; if (error_type & EPOWB16b4) { v3_errdscr[0].sn |= 0x10; v3_errdscr[0].rcode = 0x170; v3_errdscr[0].rmsg = MSGEPOWB17b2RED; } else if ( class < 3 ) { v3_errdscr[0].sn |= 0x10; v3_errdscr[0].rmsg = MSGEPOWB17b2C12; } else { v3_errdscr[0].rmsg = MSGEPOWB17b2C37; } } else if (error_type & EPOWB17b3) { /* manual power off via op panel */ manual_power_off_MG(event); rc = 0; } else if (error_type & EPOWB17b4) { /* internal battery failure */ PROCESS_V4_REFCODE /* returns if callout is refcode */ v3_errdscr[0].rcode = 0x240; v3_errdscr[0].rmsg = MSGEPOWB16b1B17b4; if (class < 3) v3_errdscr[0].sn |= 0x10; } else { /* Reserved bits in EPOW log */ /* This error log is unknow to ELA */ PROCESS_V4_REFCODE /* returns if callout is refcode */ unknown_epow_ela(event, class); rc = 0; } } else if (error_type & EPOWB16b2) { /* look for fan failures */ if (error_type & EPOWB16b4) { /* Loss of redundant fan */ PROCESS_V4_REFCODE /* returns if callout is refcode */ v3_errdscr[0].sn |= 0x10; v3_errdscr[0].rcode = 0x200; v3_errdscr[0].rmsg = MSGEPOW1501B16b4; } else if (error_type & EPOWB16b3) { /* look for Over temperature and fan failure */ /* System shutdown - thermal & fan */ PROCESS_V4_REFCODE /* returns if callout is refcode */ v3_errdscr[0].rcode = 0x220; v3_errdscr[0].rmsg = MSGEPOWB16b23; if (class < 3) { v3_errdscr[0].sn |= 0x10; v3_errdscr[0].rmsg = MSGEPOWB16b2b3; } } else { PROCESS_V4_REFCODE /* returns if callout is refcode */ v3_errdscr[0].rcode = 0x190; if (class < 3) { v3_errdscr[0].sn |= 0x10; v3_errdscr[0].rmsg = MSGEPOWB16b2C12; } else { v3_errdscr[0].rmsg = MSGEPOWB16b2C37; } } } else if (error_type & EPOWB16b3) { /* look for Over temperature conditions */ if (class == 1) { /* over temp. warning */ report_menugoal(event, MSGMENUG102); rc = 0; } else { /* Over temperature condition */ PROCESS_V4_REFCODE /* returns if callout is refcode */ v3_errdscr[0].rcode = 0x210; v3_errdscr[0].rmsg = MSGXEPOW3n73; if (class < 3) { v3_errdscr[0].rmsg = MSGEPOWB16b3; v3_errdscr[0].sn |= 0x10; } } } else if (error_type & EPOWB16b4) { /* look for loss of redundancy, without any other indication */ if (error_type & EPOWB17b1) { report_menugoal(event, MSGMENUG204); rc = 0; } else { /* Loss of redundant power supply */ PROCESS_V4_REFCODE /* returns if callout is refcode */ v3_errdscr[0].sn |= 0x10; v3_errdscr[0].rcode = 0x230; v3_errdscr[0].rmsg = MSGEPOW1502B16b4; } } else { /* This error log is unknow to ELA */ PROCESS_V4_REFCODE /* returns if callout is refcode */ unknown_epow_ela(event, class); rc = 0; } return rc; } /** * clear_edesc_struct * * Clear the frus out of the event description. This allows the caller to * recycle the same event to report more than 4 frus. */ void clear_edesc_struct(struct event_description_pre_v6 *event) { int k; for (k = 0; k < MAXFRUS; k++) { event->frus[k].conf = 0; event->frus[k].fmsg = 0; strcpy(event->frus[k].floc, ""); strcpy(event->frus[k].fname, ""); } return; } /** * make_refcode_errdscr * * The first time this function is called for a given error log entry, * this function will call adderrdscr and save_davars_ela. Subsequent * calls to this function for the same error log entry result in * add_more_descrs being called. * * INPUTS: * Pointer to an erro description containing the information to be logged * Pointer to an integer flag that allows this function to know * whether or not it has already been called for this error log entry. * * OUTPUTS: * Pointer to an integer flag that allows this function to know * whether or not it has already been called for this error log entry. * * RETURNS: * 0 if the errdscr information was added successfully. * -1 if adderrdscr or add_more_descrs failed. */ int make_refcode_errdscr(struct event *event, struct event_description_pre_v6 *e_desc, int *adderrdscr_called) { int rc = 0; if (! (*adderrdscr_called)) { *adderrdscr_called = 1; if (set_srn_and_callouts(event, e_desc, 0)) rc = -1; /* adderrdscr error. */ } else { if (add_more_descrs(event, e_desc)) rc = -1; /* add_more_descrs error. */ } return rc; } int process_refcodes(struct event *event, short *refc, int rlen) { int i, j; short src_type; int one2one; char *lcc; int predictive_error = 0; struct event_description_pre_v6 *e_desc; char *loc; int nlocs; int adderrdscr_called = 0; /* * refc points to SRC data in the error log, that looks like: * byte: 0 2 4 6 8 10 12 14 16 18 * data: B4xx RRR1 xxxx xxxx xxxx xxxx RRR2 RRR3 RRR4 RRR5 * byte: 20 22 24 26 28 30 32 34 36 38 * data: xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx L1L2 L3L4 * byte: 40 42 * data: L500 0000 * where xx is don't care for ELA, and RRRn are the ref codes. * * L1-L5 are the number of location codes corresponding to * ref codes RRR1-RRR5. If Ln = 0 then ref code 'n' does not * have any location codes, otherwise, for each ref code, the * next 'n' location codes should be extract and reported with * the ref. code. * * Extract the SRC type, that is, the 1st 2 bytes of the * register data. * * Extract the ref codes and save in rctab. Compare against * any previously reported ref code group. Do not report the * same identical group of ref codes again. * * Concerning location codes, when comparing ref code groups, * I am assuming it is sufficient to compare only the number * of location codes per ref code. The exposure is the same * ref code has the same number of location codes, but * different locations. * * If rlen == 36, then location codes are 1-1 correlated. * If rlen == 44, then location codes are not 1-1 correlated, * and the table rctabloc is used. */ src_type = *refc; /* SRC type */ if (rlen == 36) one2one = 1; /* refc 1-1 with loc codes */ else one2one = 0; /* Ceate/use shadow table b/c not 1-1 */ dbg("reg data rlen = %d, one2one = %d", rlen, one2one); if (! one2one) /* point to start of loc. code counts */ lcc = (char *)refc + 36; refc++; /* refc now is RRR1, which must be defined. */ rctab[0] = 1; /* holds number of ref codes in group */ rctab[1] = *refc; dbg("SRC: type = 0x%x, ref code = 0x%x", src_type, *refc); if (! one2one) { rctabloc[0] = 0; /* not used */ rctabloc[1] = *lcc; /* num of loc codes for first ref code */ dbg("number of loc codes = 0x%x", *lcc); lcc++; /* next loc code count */ } /* * Put the rest of the ref codes into the table. * Stop when a ref. code is zero. */ refc += 5; /* now refc points to RRR2 */ while (*refc && rctab[0] < MAXREFCODES) { rctab[0]++; /* increment count of ref codes */ rctab[rctab[0]] = *refc; dbg("ref code = 0x%x", *refc); refc++; /* pointer to next ref code */ if (! one2one) { rctabloc[rctab[0]] = *lcc; dbg("number of loc codes = 0x%x", *lcc); lcc++; /* next loc code count */ } } dbg("ref code count = 0x%x", rctab[0]); /* Here to report an SRN using group of ref codes. */ e_desc = &cec_src[0]; /* flag predictive errors */ predictive_error = event->event_buf[I_BYTE0] & 0x08; if (predictive_error) e_desc->sn = 0x652; else e_desc->sn = 0x651; e_desc->rcode = REFCODE_REASON_CUST; if (predictive_error) e_desc->rmsg = DEFER_MSGREFCODE_CUST; else e_desc->rmsg = MSGREFCODE_CUST; loc = get_loc_code(event, FIRST_LOC, NULL); i = 0; /* counts ref codes in event */ j = -1; /* counts frus added to event, will incr. to use */ /* Clear frus in case this is the second time through. */ clear_edesc_struct(e_desc); /* While there are ref codes to add to this event */ while (i < rctab[0]) { /* Make sure there is room in the event. */ j++; if (j == MAXFRUS) { /* This error description structure is full. Log the * info and then clear out the structure. */ if (make_refcode_errdscr(event, e_desc, &adderrdscr_called)) return -1; clear_edesc_struct(e_desc); j = 0; } /* * Put the ref code into the fru's confidence field * And the src type into the fru's fmsg, and lastly, * flag the controller by setting fname to a "special" * string, i.e. "REF-CODE". */ e_desc->frus[j].conf = rctab[i+1]; e_desc->frus[j].fmsg = src_type; strcpy(e_desc->frus[j].fname, REFCODE_FNAME); /* Check if there are any location codes? */ if (one2one) nlocs = 1; else nlocs = rctabloc[i+1]; while (nlocs) { /* Put loc code into fru */ if (loc != NULL) strcpy(e_desc->frus[j].floc, loc); else e_desc->frus[j].floc[0] = '\0'; /* Get ready with next location code */ loc = get_loc_code(event, NEXT_LOC, NULL); nlocs--; if (nlocs) { /* * More loc codes means add another * fru with same ref code */ j++; if (j == MAXFRUS) { /* This err descr structure is full. * Log the info and then clear * out the structure. */ if (make_refcode_errdscr(event, e_desc, &adderrdscr_called)) return -1; clear_edesc_struct(e_desc); j = 0; } /* Repeat the ref code */ e_desc->frus[j].conf = rctab[i+1]; e_desc->frus[j].fmsg = src_type; strcpy(e_desc->frus[j].fname, REFCODE_FNAME); } } i++; /* Look for next ref code */ } if (make_refcode_errdscr(event, e_desc, &adderrdscr_called)) return -1; /* End of processing SRC data */ return 1; } ppc64-diag-2.6.4/rtas_errd/dchrp_frus.h0000644000000000000000000012715312313010662016357 0ustar rootroot/** * @file dchrp_frus.h * * Copyright (C) 2005, 2008 IBM Corporation */ #ifndef _H_DCHRP_FRUS #define _H_DCHRP_FRUS #include "ela_msg.h" /* * In the following #defines, x is the probability (confidence) that this * callout represents the actual failure */ #define FRU_MEMORY_CONTROLLER(x) { x, "", " ", 1} #define FRU_PROCESSOR(x) { x, "procx", " ", 127} #define FRU_L2CACHE(x) { x, "L2Cache0", " ", 33} #define FRU_MISSING_L2(x) { x, "L2Cache0", " ", 33} #define FRU_HOST_BRIDGE(x) { x, "", " ", 2} #define FRU_SYSTEM_BUS_CONNECTOR(x) { x, "", " ", 192} #define FRU_MEMORY_MODULE(x) { x, "Memory module", " ", 4} #define FRU_MEMORY_CARD(x) { x, "", " ", 5} #define FRU_MEZZANINE_BUS(x) { x, "", " ", 7} #define FRU_PCI_DEVICE(x) { x, "", " ", 3} #define FRU_PCI_BUS(x) { x, "", " ", 192} #define FRU_ISA_DEVICE(x) { x, "", " ", 8} #define FRU_ISA_BRIDGE(x) { x, "", " ", 9} #define FRU_ISA_BUS(x) { x, "", " ", 10} #define FRU_MEZZANINE_BUS_ARBITER(x) { x, "", " ", 11} #define FRU_SERVICE_PROCESSOR(x) { x, "", " ", 12} #define FRU_SP_SYSTEM_INTERFACE(x) { x, "", " ", 13} #define FRU_SP_PRIMARY_BUS(x) { x, "", " ", 14} #define FRU_SP_SECONDARY_BUS(x) { x, "", " ", 15} #define FRU_VPD_MODULE(x) { x, "", " ", 16} #define FRU_POWER_CONTROLLER(x) { x, "", " ", 18} #define FRU_FAN_SENSOR(x) { x, "Fan Sensor", " ", 19} #define FRU_THERMAL_SENSOR(x) { x, "Sensor", " ", 20} #define FRU_VOLTAGE_SENSOR(x) { x, "Sensor", " ", 21} #define FRU_POWER_SENSOR(x) { x, "sensor", " ", 179} #define FRU_SERIAL_PORT_CONTROLLER(x) { x, "", " ", 22} #define FRU_NVRAM(x) { x, "", " ", 23} #define FRU_RTC_TOD(x) { x, "", " ", 24} #define FRU_JTAG(x) { x, "", " ", 25} #define FRU_SOFTWARE(x) { x, "", " ", 26} #define FRU_HARDWARE(x) { x, "", " ", 27} #define FRU_FAN(x) { x, "Fan", " ", 28} #define FRU_POWER_SUPPLY(x) { x, "", " ", 29} #define FRU_BATTERY(x) { x, "", " ", 30} #define FRU_IO_EXPANSION_UNIT(x) { x, "", " ", 128} #define FRU_IO_EXPANSION_BUS(x) { x, "", " ", 129} #define FRU_34_POWER_SUPPLY(x) { x, "", " ", 130} #define FRU_14_POWER_SUPPLY(x) { x, "", " ", 131} #define FRU_RIO_BRIDGE(x) { x, "", " ", 185} #define FRU_RTASFRU(x) { x, "", " ", 192} #define FRU_OPERATOR_PANEL(x) { x, "", " ", 213} #define FRU_IO_PLANAR(x) { x, "", " ", 31} /* * If there are two entries for a given failure, the first should be * used in the case of an actual failure, and the second should be used * in the case of a predictive failure (i.e. the repair can be deferred) * * Some of the io??? failures have three entries. */ struct event_description_pre_v6 cpu610[] = /* CPU internal error */ { { "", ERRD1, 0x651, 0x610, MSGCPUB12b0, { FRU_PROCESSOR(100) } }, { "", ERRD1, 0x652, 0x610, DEFER_MSGCPUB12b0, { FRU_PROCESSOR(100) } } }; struct event_description_pre_v6 cpu611[] = /* CPU internal cache error */ { { "", ERRD1, 0x651, 0x611, MSGCPUB12b1, { FRU_PROCESSOR(100) } }, { "", ERRD1, 0x652, 0x611, DEFER_MSGCPUB12b1, { FRU_PROCESSOR(100) } } }; struct event_description_pre_v6 cpu612[] = /* L2 cache parity or mult-bit ecc error */ { { "", ERRD1, 0x651, 0x612, MSGCPUB12b2, { FRU_L2CACHE(100) } }, { "", ERRD1, 0x652, 0x612, DEFER_MSGCPUB12b2, { FRU_L2CACHE(100) } } }; struct event_description_pre_v6 cpu613[] = /* L2 cache ECC single-bit error */ { { "", ERRD1, 0x651, 0x613, MSGCPUB12b3, { FRU_L2CACHE(100) } }, { "", ERRD1, 0x652, 0x613, DEFER_MSGCPUB12b3, { FRU_L2CACHE(100) } } }; struct event_description_pre_v6 cpu614[] = /* Time-out error waiting for mem controller */ { { "", ERRD1, 0x651, 0x614, MSGCPUB12b4, { FRU_MEMORY_CONTROLLER(100) } } }; struct event_description_pre_v6 cpu615[] = /* Time-out error waiting for I/O */ { { "", ERRD1, 0x651, 0x615, MSGCPUB12b5, { FRU_HOST_BRIDGE(100) } } }; struct event_description_pre_v6 cpu619[] = /* Unknown error in CPU Error log */ { { "", ERRD1, 0x651, 0x619, MSGCPUALLZERO, { { 0, "", "", 36}, { 0, "", "", 36}, { 0, "", "", 36}, { 0, "", "", 36} } } }; struct event_description_pre_v6 cpu710[] = /* Address/Data parity error on Processor bus */ { { "", ERRD1, 0x651, 0x710, MSGCPUB12b6, { FRU_RTASFRU(60), FRU_SYSTEM_BUS_CONNECTOR(40) } } }; struct event_description_pre_v6 cpu711[] = /* Address/Data parity error on Processor bus */ { { "", ERRD1, 0x651, 0x711, MSGCPUB12b6, { FRU_RTASFRU(40), FRU_RTASFRU(35), FRU_SYSTEM_BUS_CONNECTOR(25) } } }; struct event_description_pre_v6 cpu712[] = /* Address/Data parity error on Processor bus */ { { "", ERRD1, 0x651, 0x712, MSGCPUB12b6, { FRU_RTASFRU(40), FRU_RTASFRU(25), FRU_RTASFRU(25), FRU_SYSTEM_BUS_CONNECTOR(10) } } }; struct event_description_pre_v6 cpu713[] = /* Transfer error on Processor bus */ { { "", ERRD1, 0x651, 0x713, MSGCPUB12b7, { FRU_RTASFRU(60), FRU_SYSTEM_BUS_CONNECTOR(40) } } }; struct event_description_pre_v6 cpu714[] = /* Transfer error on Processor bus */ { { "", ERRD1, 0x651, 0x714, MSGCPUB12b7, { FRU_RTASFRU(40), FRU_RTASFRU(35), FRU_SYSTEM_BUS_CONNECTOR(25) } } }; struct event_description_pre_v6 cpu715[] = /* Transfer error on Processor bus */ { { "", ERRD1, 0x651, 0x715, MSGCPUB12b7, { FRU_RTASFRU(40), FRU_RTASFRU(25), FRU_RTASFRU(25), FRU_SYSTEM_BUS_CONNECTOR(10) } } }; struct event_description_pre_v6 mem720[] = /* Uncorrectable Memory Error */ { { "", ERRD1, 0x651, 0x720, MSGMEMB12b0, { FRU_MEMORY_MODULE(85), FRU_MEMORY_CARD(10), FRU_MEMORY_CONTROLLER(5) } } }; struct event_description_pre_v6 mem721[] = /* Uncorrectable Memory Error */ { { "", ERRD1, 0x651, 0x721, MSGMEMB12b0, { FRU_MEMORY_MODULE(85), FRU_MEMORY_CARD(10), FRU_MEMORY_CONTROLLER(5) } } }; struct event_description_pre_v6 mem780[] = /* Uncorrectable Memory Error */ { { "", ERRD1, 0x651, 0x780, MSGMEMB12b0, { FRU_MEMORY_MODULE(85), FRU_MEMORY_CARD(10), FRU_MEMORY_CONTROLLER(5) } } }; struct event_description_pre_v6 mem781[] = /* Uncorrectable Memory Error */ { { "", ERRD1, 0x651, 0x781, MSGMEMB12b0, { FRU_MEMORY_MODULE(85), FRU_MEMORY_CARD(10), FRU_MEMORY_CONTROLLER(5) } } }; struct event_description_pre_v6 mem782[] = /* Uncorrectable Memory Error */ { { "", ERRD1, 0x651, 0x782, MSGMEMB12b0, { FRU_MEMORY_CARD(90), FRU_MEMORY_CONTROLLER(10) } } }; struct event_description_pre_v6 mem783[] = /* Uncorrectable Memory Error */ { { "", ERRD1, 0x651, 0x783, MSGMEMB12b0, { FRU_MEMORY_CARD(90), FRU_MEMORY_CONTROLLER(10) } } }; struct event_description_pre_v6 mem784[] = /* Uncorrectable Memory Error */ { { "", ERRD1, 0x651, 0x784, MSGMEMB12b0, { FRU_MEMORY_CARD(90), FRU_MEMORY_CONTROLLER(10) } } }; struct event_description_pre_v6 mem785[] = /* Uncorrectable Memory Error */ { { "", ERRD1, 0x651, 0x785, MSGMEMB12b0, { FRU_MEMORY_CARD(90), FRU_MEMORY_CONTROLLER(10) } } }; struct event_description_pre_v6 mem786[] = /* Uncorrectable Memory Error */ { { "", ERRD1, 0x651, 0x786, MSGMEMB12b0, { FRU_MEMORY_CARD(90), FRU_MEMORY_CONTROLLER(10) } } }; struct event_description_pre_v6 mem787[] = /* Uncorrectable Memory Error */ { { "", ERRD1, 0x651, 0x787, MSGMEMB12b0, { FRU_MEMORY_CARD(90), FRU_MEMORY_CONTROLLER(10) } } }; struct event_description_pre_v6 mem788[] = /* Uncorrectable Memory Error */ { { "", ERRD1, 0x651, 0x788, MSGMEMB12b0, { FRU_MEMORY_CARD(90), FRU_MEMORY_CONTROLLER(10) } } }; struct event_description_pre_v6 mem789[] = /* Uncorrectable Memory Error */ { { "", ERRD1, 0x651, 0x789, MSGMEMB12b0, { FRU_MEMORY_CARD(90), FRU_MEMORY_CONTROLLER(10) } } }; struct event_description_pre_v6 mem78A[] = /* Uncorrectable Memory Error */ { { "", ERRD1, 0x651, 0x78A, MSGMEMB12b0, { FRU_MEMORY_CARD(90), FRU_MEMORY_CONTROLLER(10) } } }; struct event_description_pre_v6 mem78B[] = /* Uncorrectable Memory Error */ { { "", ERRD1, 0x651, 0x78B, MSGMEMB12b0, { FRU_MEMORY_CARD(90), FRU_MEMORY_CONTROLLER(10) } } }; struct event_description_pre_v6 mem78C[] = /* Uncorrectable Memory Error */ { { "", ERRD1, 0x651, 0x78C, MSGMEMB12b0, { FRU_MEMORY_CARD(90), FRU_MEMORY_CONTROLLER(10) } } }; struct event_description_pre_v6 mem620[] = /* ECC correctable error */ { { "", ERRD1, 0x651, 0x620, MSGMEMB12b1, { FRU_MEMORY_MODULE(100), /* Pct to be adjusted later */ FRU_MEMORY_MODULE(0), FRU_MEMORY_MODULE(0), FRU_MEMORY_MODULE(0) } } }; struct event_description_pre_v6 mem621[] = /* ECC correctable error */ { { "", ERRD1, 0x651, 0x621, MSGMEMB12b1, { FRU_MEMORY_MODULE(100), /* Pct to be adjusted later */ FRU_MEMORY_MODULE(0), FRU_MEMORY_MODULE(0), FRU_MEMORY_MODULE(0) } } }; struct event_description_pre_v6 mem622[] = /* Correctable error threshold exceeded */ { { "", ERRD1, 0x651, 0x622, MSGMEMB12b2, { FRU_MEMORY_MODULE(100), /* Pct to be adjusted later */ FRU_MEMORY_MODULE(0), FRU_MEMORY_MODULE(0), FRU_MEMORY_MODULE(0) } }, { "", ERRD1, 0x652, 0x622, DEFER_MSGMEMB12b2, { FRU_MEMORY_MODULE(100), /* Pct to be adjusted later */ FRU_MEMORY_MODULE(0), FRU_MEMORY_MODULE(0), FRU_MEMORY_MODULE(0) } } }; struct event_description_pre_v6 mem623[] = /* Correctable error threshold exceeded */ { { "", ERRD1, 0x651, 0x623, MSGMEMB12b2, { FRU_MEMORY_MODULE(100), /* Pct to be adjusted later */ FRU_MEMORY_MODULE(0), FRU_MEMORY_MODULE(0), FRU_MEMORY_MODULE(0) } }, { "", ERRD1, 0x652, 0x623, DEFER_MSGMEMB12b2, { FRU_MEMORY_MODULE(100), /* Pct to be adjusted later */ FRU_MEMORY_MODULE(0), FRU_MEMORY_MODULE(0), FRU_MEMORY_MODULE(0) } } }; struct event_description_pre_v6 mem624[] = /* Memory Controller internal error */ { { "", ERRD1, 0x651, 0x624, MSGMEMB12b3, { FRU_MEMORY_CONTROLLER(100) } } }; struct event_description_pre_v6 mem625[] = /* Memory Address (Bad address to memory) */ { { "", ERRD1, 0x651, 0x625, MSGMEMB12b4, { FRU_MEMORY_CONTROLLER(100) } } }; struct event_description_pre_v6 mem626[] = /* Memory Data error (Bad data to memory) */ { { "", ERRD1, 0x651, 0x626, MSGMEMB12b5, { FRU_MEMORY_CONTROLLER(100) } } }; struct event_description_pre_v6 mem627[] = /* Memory time-out error */ { { "", ERRD1, 0x651, 0x627, MSGMEMB12b7, { FRU_MEMORY_CONTROLLER(100) } } }; struct event_description_pre_v6 mem628[] = /* Processor time-out error */ { { "", ERRD1, 0x651, 0x628, MSGMEMB13b1, { FRU_PROCESSOR(100) } } }; struct event_description_pre_v6 mem629[] = /* Unknown error detected by mem. controller */ { { "", ERRD1, 0x651, 0x629, MSGMEMALLZERO, { { 0, "", "", 36}, { 0, "", "", 36}, { 0, "", "", 36}, { 0, "", "", 36} } } }; struct event_description_pre_v6 io630[] = /* I/O Expansion Bus Parity Error */ { { "", ERRD1, 0x651, 0x630, MSGIOB13b4, { FRU_IO_EXPANSION_UNIT(100) } }, { "", ERRD1, 0x652, 0x630, DEFER_MSGIOB13b4, { FRU_IO_EXPANSION_UNIT(100) } } }; struct event_description_pre_v6 io631[] = /* I/O Expansion Bus Time-out Error */ { { "", ERRD1, 0x651, 0x631, MSGIOB13b5, { FRU_IO_EXPANSION_UNIT(100) } }, { "", ERRD1, 0x652, 0x631, DEFER_MSGIOB13b5, { FRU_IO_EXPANSION_UNIT(100) } } }; struct event_description_pre_v6 io632[] = /* I/O Expansion Bus Connect Failure */ { { "", ERRD1, 0x651, 0x632, MSGIOB13b6, { FRU_IO_EXPANSION_BUS(70), FRU_IO_EXPANSION_UNIT(20), FRU_RIO_BRIDGE(10) } }, { "", ERRD1, 0x652, 0x632, DEFER_MSGIOB13b6, { FRU_IO_EXPANSION_BUS(70), FRU_IO_EXPANSION_UNIT(20), FRU_RIO_BRIDGE(10) } } }; struct event_description_pre_v6 io633[] = /* I/O Expansion Unit not in operationg state.*/ { { "", ERRD1, 0x651, 0x633, MSGIOB13b7, { FRU_IO_EXPANSION_UNIT(70), FRU_IO_EXPANSION_BUS(30) } }, { "", ERRD1, 0x652, 0x633, DEFER_MSGIOB13b7, { FRU_IO_EXPANSION_UNIT(70), FRU_IO_EXPANSION_BUS(30) } } }; struct event_description_pre_v6 io634[] = /* Int Error, bridge conn. to i/o exp. bus */ { { "", ERRD1, 0x651, 0x634, MSGIOB12b3, { FRU_IO_EXPANSION_UNIT(100) } }, { "", ERRD1, 0x652, 0x634, DEFER_MSGIOB12b3, { FRU_IO_EXPANSION_UNIT(100) } } }; struct event_description_pre_v6 mem650[] = /* ECC correctable error */ { { "", ERRD1, 0x651, 0x650, MSGMEMB12b1, { FRU_MEMORY_MODULE(100), /* Pct to be adjusted later */ FRU_MEMORY_MODULE(0), FRU_MEMORY_MODULE(0), FRU_MEMORY_MODULE(0) } } }; struct event_description_pre_v6 mem651[] = /* ECC correctable error */ { { "", ERRD1, 0x651, 0x651, MSGMEMB12b1, { FRU_MEMORY_MODULE(100), /* Pct to be adjusted later */ FRU_MEMORY_MODULE(0), FRU_MEMORY_MODULE(0), FRU_MEMORY_MODULE(0) } } }; struct event_description_pre_v6 mem652[] = /* ECC correctable error */ { { "", ERRD1, 0x651, 0x652, MSGMEMB12b1, { FRU_MEMORY_MODULE(100), /* Pct to be adjusted later */ FRU_MEMORY_MODULE(0), FRU_MEMORY_MODULE(0), FRU_MEMORY_MODULE(0) } } }; struct event_description_pre_v6 mem653[] = /* ECC correctable error */ { { "", ERRD1, 0x651, 0x653, MSGMEMB12b1, { FRU_MEMORY_MODULE(100), /* Pct to be adjusted later */ FRU_MEMORY_MODULE(0), FRU_MEMORY_MODULE(0), FRU_MEMORY_MODULE(0) } } }; struct event_description_pre_v6 mem654[] = /* ECC correctable error */ { { "", ERRD1, 0x651, 0x654, MSGMEMB12b1, { FRU_MEMORY_MODULE(100), /* Pct to be adjusted later */ FRU_MEMORY_MODULE(0), FRU_MEMORY_MODULE(0), FRU_MEMORY_MODULE(0) } } }; struct event_description_pre_v6 mem655[] = /* ECC correctable error */ { { "", ERRD1, 0x651, 0x655, MSGMEMB12b1, { FRU_MEMORY_MODULE(100), /* Pct to be adjusted later */ FRU_MEMORY_MODULE(0), FRU_MEMORY_MODULE(0), FRU_MEMORY_MODULE(0) } } }; struct event_description_pre_v6 mem656[] = /* ECC correctable error */ { { "", ERRD1, 0x651, 0x656, MSGMEMB12b1, { FRU_MEMORY_MODULE(100), /* Pct to be adjusted later */ FRU_MEMORY_MODULE(0), FRU_MEMORY_MODULE(0), FRU_MEMORY_MODULE(0) } } }; struct event_description_pre_v6 mem657[] = /* ECC correctable error */ { { "", ERRD1, 0x651, 0x657, MSGMEMB12b1, { FRU_MEMORY_MODULE(100), /* Pct to be adjusted later */ FRU_MEMORY_MODULE(0), FRU_MEMORY_MODULE(0), FRU_MEMORY_MODULE(0) } } }; struct event_description_pre_v6 mem658[] = /* ECC correctable error */ { { "", ERRD1, 0x651, 0x658, MSGMEMB12b1, { FRU_MEMORY_MODULE(100), /* Pct to be adjusted later */ FRU_MEMORY_MODULE(0), FRU_MEMORY_MODULE(0), FRU_MEMORY_MODULE(0) } } }; struct event_description_pre_v6 mem659[] = /* ECC correctable error */ { { "", ERRD1, 0x651, 0x659, MSGMEMB12b1, { FRU_MEMORY_MODULE(100), /* Pct to be adjusted later */ FRU_MEMORY_MODULE(0), FRU_MEMORY_MODULE(0), FRU_MEMORY_MODULE(0) } } }; struct event_description_pre_v6 mem65A[] = /* ECC correctable error */ { { "", ERRD1, 0x651, 0x65A, MSGMEMB12b1, { FRU_MEMORY_MODULE(100), /* Pct to be adjusted later */ FRU_MEMORY_MODULE(0), FRU_MEMORY_MODULE(0), FRU_MEMORY_MODULE(0) } } }; struct event_description_pre_v6 mem65B[] = /* ECC correctable error */ { { "", ERRD1, 0x651, 0x65B, MSGMEMB12b1, { FRU_MEMORY_MODULE(100), /* Pct to be adjusted later */ FRU_MEMORY_MODULE(0), FRU_MEMORY_MODULE(0), FRU_MEMORY_MODULE(0) } } }; struct event_description_pre_v6 mem65C[] = /* ECC correctable error */ { { "", ERRD1, 0x651, 0x65C, MSGMEMB12b1, { FRU_MEMORY_MODULE(100), /* Pct to be adjusted later */ FRU_MEMORY_MODULE(0), FRU_MEMORY_MODULE(0), FRU_MEMORY_MODULE(0) } } }; struct event_description_pre_v6 mem660[] = /* Correctable error threshold exceeded */ { { "", ERRD1, 0x651, 0x660, MSGMEMB12b2, { FRU_MEMORY_MODULE(100), /* Pct to be adjusted later */ FRU_MEMORY_MODULE(0), FRU_MEMORY_MODULE(0), FRU_MEMORY_MODULE(0) } }, { "", ERRD1, 0x652, 0x660, DEFER_MSGMEMB12b2, { FRU_MEMORY_MODULE(100), /* Pct to be adjusted later */ FRU_MEMORY_MODULE(0), FRU_MEMORY_MODULE(0), FRU_MEMORY_MODULE(0) } } }; struct event_description_pre_v6 mem661[] = /* Correctable error threshold exceeded */ { { "", ERRD1, 0x651, 0x661, MSGMEMB12b2, { FRU_MEMORY_MODULE(100), /* Pct to be adjusted later */ FRU_MEMORY_MODULE(0), FRU_MEMORY_MODULE(0), FRU_MEMORY_MODULE(0) } }, { "", ERRD1, 0x652, 0x661, DEFER_MSGMEMB12b2, { FRU_MEMORY_MODULE(100), /* Pct to be adjusted later */ FRU_MEMORY_MODULE(0), FRU_MEMORY_MODULE(0), FRU_MEMORY_MODULE(0) } } }; struct event_description_pre_v6 mem662[] = /* Correctable error threshold exceeded */ { { "", ERRD1, 0x651, 0x662, MSGMEMB12b2, { FRU_MEMORY_MODULE(100), /* Pct to be adjusted later */ FRU_MEMORY_MODULE(0), FRU_MEMORY_MODULE(0), FRU_MEMORY_MODULE(0) } }, { "", ERRD1, 0x652, 0x662, DEFER_MSGMEMB12b2, { FRU_MEMORY_MODULE(100), /* Pct to be adjusted later */ FRU_MEMORY_MODULE(0), FRU_MEMORY_MODULE(0), FRU_MEMORY_MODULE(0) } } }; struct event_description_pre_v6 mem663[] = /* Correctable error threshold exceeded */ { { "", ERRD1, 0x651, 0x663, MSGMEMB12b2, { FRU_MEMORY_MODULE(100), /* Pct to be adjusted later */ FRU_MEMORY_MODULE(0), FRU_MEMORY_MODULE(0), FRU_MEMORY_MODULE(0) } }, { "", ERRD1, 0x652, 0x663, DEFER_MSGMEMB12b2, { FRU_MEMORY_MODULE(100), /* Pct to be adjusted later */ FRU_MEMORY_MODULE(0), FRU_MEMORY_MODULE(0), FRU_MEMORY_MODULE(0) } } }; struct event_description_pre_v6 mem664[] = /* Correctable error threshold exceeded */ { { "", ERRD1, 0x651, 0x664, MSGMEMB12b2, { FRU_MEMORY_MODULE(100), /* Pct to be adjusted later */ FRU_MEMORY_MODULE(0), FRU_MEMORY_MODULE(0), FRU_MEMORY_MODULE(0) } }, { "", ERRD1, 0x652, 0x664, DEFER_MSGMEMB12b2, { FRU_MEMORY_MODULE(100), /* Pct to be adjusted later */ FRU_MEMORY_MODULE(0), FRU_MEMORY_MODULE(0), FRU_MEMORY_MODULE(0) } } }; struct event_description_pre_v6 mem665[] = /* Correctable error threshold exceeded */ { { "", ERRD1, 0x651, 0x665, MSGMEMB12b2, { FRU_MEMORY_MODULE(100), /* Pct to be adjusted later */ FRU_MEMORY_MODULE(0), FRU_MEMORY_MODULE(0), FRU_MEMORY_MODULE(0) } }, { "", ERRD1, 0x652, 0x665, DEFER_MSGMEMB12b2, { FRU_MEMORY_MODULE(100), /* Pct to be adjusted later */ FRU_MEMORY_MODULE(0), FRU_MEMORY_MODULE(0), FRU_MEMORY_MODULE(0) } } }; struct event_description_pre_v6 mem666[] = /* Correctable error threshold exceeded */ { { "", ERRD1, 0x651, 0x666, MSGMEMB12b2, { FRU_MEMORY_MODULE(100), /* Pct to be adjusted later */ FRU_MEMORY_MODULE(0), FRU_MEMORY_MODULE(0), FRU_MEMORY_MODULE(0) } }, { "", ERRD1, 0x652, 0x666, DEFER_MSGMEMB12b2, { FRU_MEMORY_MODULE(100), /* Pct to be adjusted later */ FRU_MEMORY_MODULE(0), FRU_MEMORY_MODULE(0), FRU_MEMORY_MODULE(0) } } }; struct event_description_pre_v6 mem667[] = /* Correctable error threshold exceeded */ { { "", ERRD1, 0x651, 0x667, MSGMEMB12b2, { FRU_MEMORY_MODULE(100), /* Pct to be adjusted later */ FRU_MEMORY_MODULE(0), FRU_MEMORY_MODULE(0), FRU_MEMORY_MODULE(0) } }, { "", ERRD1, 0x652, 0x667, DEFER_MSGMEMB12b2, { FRU_MEMORY_MODULE(100), /* Pct to be adjusted later */ FRU_MEMORY_MODULE(0), FRU_MEMORY_MODULE(0), FRU_MEMORY_MODULE(0) } } }; struct event_description_pre_v6 mem668[] = /* Correctable error threshold exceeded */ { { "", ERRD1, 0x651, 0x668, MSGMEMB12b2, { FRU_MEMORY_MODULE(100), /* Pct to be adjusted later */ FRU_MEMORY_MODULE(0), FRU_MEMORY_MODULE(0), FRU_MEMORY_MODULE(0) } }, { "", ERRD1, 0x652, 0x668, DEFER_MSGMEMB12b2, { FRU_MEMORY_MODULE(100), /* Pct to be adjusted later */ FRU_MEMORY_MODULE(0), FRU_MEMORY_MODULE(0), FRU_MEMORY_MODULE(0) } } }; struct event_description_pre_v6 mem669[] = /* Correctable error threshold exceeded */ { { "", ERRD1, 0x651, 0x669, MSGMEMB12b2, { FRU_MEMORY_MODULE(100), /* Pct to be adjusted later */ FRU_MEMORY_MODULE(0), FRU_MEMORY_MODULE(0), FRU_MEMORY_MODULE(0) } }, { "", ERRD1, 0x652, 0x669, DEFER_MSGMEMB12b2, { FRU_MEMORY_MODULE(100), /* Pct to be adjusted later */ FRU_MEMORY_MODULE(0), FRU_MEMORY_MODULE(0), FRU_MEMORY_MODULE(0) } } }; struct event_description_pre_v6 mem66A[] = /* Correctable error threshold exceeded */ { { "", ERRD1, 0x651, 0x66A, MSGMEMB12b2, { FRU_MEMORY_MODULE(100), /* Pct to be adjusted later */ FRU_MEMORY_MODULE(0), FRU_MEMORY_MODULE(0), FRU_MEMORY_MODULE(0) } }, { "", ERRD1, 0x652, 0x66A, DEFER_MSGMEMB12b2, { FRU_MEMORY_MODULE(100), /* Pct to be adjusted later */ FRU_MEMORY_MODULE(0), FRU_MEMORY_MODULE(0), FRU_MEMORY_MODULE(0) } } }; struct event_description_pre_v6 mem66B[] = /* Correctable error threshold exceeded */ { { "", ERRD1, 0x651, 0x66B, MSGMEMB12b2, { FRU_MEMORY_MODULE(100), /* Pct to be adjusted later */ FRU_MEMORY_MODULE(0), FRU_MEMORY_MODULE(0), FRU_MEMORY_MODULE(0) } }, { "", ERRD1, 0x652, 0x66B, DEFER_MSGMEMB12b2, { FRU_MEMORY_MODULE(100), /* Pct to be adjusted later */ FRU_MEMORY_MODULE(0), FRU_MEMORY_MODULE(0), FRU_MEMORY_MODULE(0) } } }; struct event_description_pre_v6 mem66C[] = /* Correctable error threshold exceeded */ { { "", ERRD1, 0x651, 0x66C, MSGMEMB12b2, { FRU_MEMORY_MODULE(100), /* Pct to be adjusted later */ FRU_MEMORY_MODULE(0), FRU_MEMORY_MODULE(0), FRU_MEMORY_MODULE(0) } }, { "", ERRD1, 0x652, 0x66C, DEFER_MSGMEMB12b2, { FRU_MEMORY_MODULE(100), /* Pct to be adjusted later */ FRU_MEMORY_MODULE(0), FRU_MEMORY_MODULE(0), FRU_MEMORY_MODULE(0) } } }; struct event_description_pre_v6 memtest670[] = /* Missing or bad memory */ { { "", ERRD1, 0x651, 0x670, MSG_MISSING_MEM, { FRU_MEMORY_MODULE(90), FRU_MEMORY_CARD(10) } } }; struct event_description_pre_v6 memtest671[] = /* Missing or bad memory */ { { "", ERRD1, 0x651, 0x671, MSG_MISSING_MEM, { FRU_MEMORY_MODULE(90), FRU_MEMORY_CARD(10) } } }; struct event_description_pre_v6 memtest672[] = /* Missing or bad memory */ { { "", ERRD1, 0x651, 0x672, MSG_MISSING_MEM, { FRU_MEMORY_MODULE(100) } } }; struct event_description_pre_v6 memtest673[] = /* Missing or bad memory */ { { "", ERRD1, 0x651, 0x673, MSG_MISSING_MEM, { FRU_MEMORY_MODULE(100) } } }; struct event_description_pre_v6 memtest674[] = /* Missing or bad memory */ { { "", ERRD1, 0x651, 0x674, MSG_MISSING_MEM, { FRU_MEMORY_MODULE(100) } } }; struct event_description_pre_v6 memtest675[] = /* Missing or bad memory */ { { "", ERRD1, 0x651, 0x675, MSG_MISSING_MEM, { FRU_MEMORY_MODULE(100) } } }; struct event_description_pre_v6 memtest676[] = /* Missing or bad memory */ { { "", ERRD1, 0x651, 0x676, MSG_MISSING_MEM, { FRU_MEMORY_MODULE(100) } } }; struct event_description_pre_v6 memtest677[] = /* Missing or bad memory */ { { "", ERRD1, 0x651, 0x677, MSG_MISSING_MEM, { FRU_MEMORY_MODULE(100) } } }; struct event_description_pre_v6 memtest678[] = /* Missing or bad memory */ { { "", ERRD1, 0x651, 0x678, MSG_MISSING_MEM, { FRU_MEMORY_MODULE(100) } } }; struct event_description_pre_v6 memtest679[] = /* Missing or bad memory */ { { "", ERRD1, 0x651, 0x679, MSG_MISSING_MEM, { FRU_MEMORY_MODULE(90), FRU_MEMORY_CARD(10) } } }; struct event_description_pre_v6 memtest67A[] = /* Missing or bad memory */ { { "", ERRD1, 0x651, 0x67A, MSG_MISSING_MEM, { FRU_MEMORY_MODULE(90), FRU_MEMORY_CARD(10) } } }; struct event_description_pre_v6 mem67B[] = /* Failed memory module */ { { "", ERRD1, 0x651, 0x67B, MSG_MISSING_MEM, { FRU_MEMORY_MODULE(90), FRU_MEMORY_CARD(10) } } }; struct event_description_pre_v6 mem67C[] = /* Failed memory module */ { { "", ERRD1, 0x651, 0x67C, MSG_MISSING_MEM, { FRU_MEMORY_MODULE(90), FRU_MEMORY_CARD(10) } } }; struct event_description_pre_v6 mem722[] = /* Processor Bus parity error */ { { "", ERRD1, 0x651, 0x722, MSGMEMB13b0, { FRU_PROCESSOR(40), FRU_SYSTEM_BUS_CONNECTOR(35), FRU_MEMORY_CONTROLLER(25) } } }; struct event_description_pre_v6 mem723[] = /* Processor bus Transfer error */ { { "", ERRD1, 0x651, 0x723, MSGMEMB13b2, { FRU_PROCESSOR(40), FRU_SYSTEM_BUS_CONNECTOR(35), FRU_MEMORY_CONTROLLER(25) } } }; struct event_description_pre_v6 mem724[] = /* I/O Host Bridge time-out error */ { { "", ERRD1, 0x651, 0x724, MSGMEMB13b3, { FRU_HOST_BRIDGE(40), FRU_MEZZANINE_BUS(35), FRU_MEMORY_CONTROLLER(25) } } }; struct event_description_pre_v6 mem725[] = /* I/O Host Bridge address/data parity error */ { { "", ERRD1, 0x651, 0x725, MSGMEMB13b4, { FRU_HOST_BRIDGE(40), FRU_MEZZANINE_BUS(35), FRU_MEMORY_CONTROLLER(25) } } }; struct event_description_pre_v6 mem726[] = /* I/O Host Bridge and Bad Memory Address */ { { "", ERRD1, 0x651, 0x726, MSGMEMB12b4B13b3, } }; struct event_description_pre_v6 io833[] = { { "", ERRD1, 0x833, 0x0, MSGIOB12b0, /* I/O Bus Address Parity Error */ { { 40, "", " ", 192}, /* the fru name will be inserted, as will the */ /* reason code, which will be the led of the device */ FRU_PCI_DEVICE(35), FRU_PCI_BUS(25) } }, { "", ERRD1, 0x833, 0x0, MSGIOB12b1, /* I/O Bus Data Parity Error */ { { 40, "", " ", 192}, /* the fru name will be inserted, as will the */ /* reason code, which will be the led of the device */ FRU_PCI_DEVICE(35), FRU_PCI_BUS(25) } }, { "", ERRD1, 0x833, 0x0, MSGIOB12b2, /* I/O Time-out error */ { { 40, "", " ", 192}, /* the fru name will be inserted, as will the */ /* reason code, which will be the led of the device */ FRU_PCI_DEVICE(35), FRU_PCI_BUS(25) } } }; #define SN9CC 0x9aa /* 9CC was assigned, so internally I must */ /* use 9AA. The DIMB should read 9CC-xxx */ struct event_description_pre_v6 io9CC[] = { { "", ERRD1, SN9CC, 0x0, MSGIOB12b0, /* I/O Bus Address Parity Error */ { { 60, "", " ", 192}, /* the fru name will be inserted, as will the */ /* reason code, which will be the led of the device */ FRU_PCI_BUS(40) } }, { "", ERRD1, SN9CC, 0x0, MSGIOB12b1, /* I/O Bus Data Parity Error */ { { 60, "", " ", 192}, /* the fru name will be inserted, as will the */ /* reason code, which will be the led of the device */ FRU_PCI_BUS(40) } }, { "", ERRD1, SN9CC, 0x0, MSGIOB12b2, /* I/O Time-out error */ { { 60, "", " ", 192}, /* the fru name will be inserted, as will the */ /* reason code, which will be the led of the device */ FRU_PCI_BUS(40) } } }; struct event_description_pre_v6 iobusonly[] = { { "", ERRD1, SN9CC, 0x0, MSGIOB12b0, /* I/O Bus Address Parity Error */ { FRU_PCI_BUS(100) } }, { "", ERRD1, SN9CC, 0x0, MSGIOB12b1, /* I/O Bus Data Parity Error */ { FRU_PCI_BUS(100) } }, { "", ERRD1, SN9CC, 0x0, MSGIOB12b2, /* I/O Time-out error */ { FRU_PCI_BUS(100) } } }; struct event_description_pre_v6 io832[] = /* I/O Device Internal Error */ { { "", ERRD1, 0x832, 0x0, MSGIOB12b3, { { 100, "", " ", 192} /* the fru name will be inserted, as will the */ /* reason code, which will be the led of the device */ } } }; struct event_description_pre_v6 io639[] = /* Unknown error detected by I/O device */ { { "", ERRD1, 0x651, 0x639, MSGIOALLZERO, { { 0, "", "", 36}, { 0, "", "", 36}, { 0, "", "", 36}, { 0, "", "", 36} } } }; struct event_description_pre_v6 io730[] = /* I/O Error on non-PCI bus */ { { "", ERRD1, 0x651, 0x730, MSGIOB12b4, { FRU_ISA_BUS(100) } } }; struct event_description_pre_v6 io731[] = /* Mezzanine/Processor Bus Addr. Parity Error */ { { "", ERRD1, 0x651, 0x731, MSGIOB12b5, { FRU_MEZZANINE_BUS(60), FRU_HOST_BRIDGE(40) } }, { "", ERRD1, 0x652, 0x731, DEFER_MSGIOB12b5, { FRU_MEZZANINE_BUS(60), FRU_HOST_BRIDGE(40) } } }; struct event_description_pre_v6 io732[] = /* Mezzanine/Processor Bus Data Parity Error */ { { "", ERRD1, 0x651, 0x732, MSGIOB12b6, { FRU_MEZZANINE_BUS(60), FRU_HOST_BRIDGE(40) } }, { "", ERRD1, 0x652, 0x732, DEFER_MSGIOB12b6, { FRU_MEZZANINE_BUS(60), FRU_HOST_BRIDGE(40) } } }; struct event_description_pre_v6 io733[] = /* Mezzanine/Processor Bus Addr. Parity Error */ { { "", ERRD1, 0x651, 0x733, MSGIOB12b5, { FRU_MEMORY_CONTROLLER(40), FRU_MEZZANINE_BUS(35), FRU_HOST_BRIDGE(25) } }, { "", ERRD1, 0x652, 0x733, DEFER_MSGIOB12b5, { FRU_MEMORY_CONTROLLER(40), FRU_MEZZANINE_BUS(35), FRU_HOST_BRIDGE(25) } } }; struct event_description_pre_v6 io734[] = /* Mezzanine/Processor Bus Data Parity Error */ { { "", ERRD1, 0x651, 0x734, MSGIOB12b6, { FRU_MEMORY_CONTROLLER(40), FRU_MEZZANINE_BUS(35), FRU_HOST_BRIDGE(25) } }, { "", ERRD1, 0x652, 0x734, DEFER_MSGIOB12b6, { FRU_MEMORY_CONTROLLER(40), FRU_MEZZANINE_BUS(35), FRU_HOST_BRIDGE(25) } } }; struct event_description_pre_v6 io735[] = /* Mezzanine/Processor Bus Time-out Error */ { { "", ERRD1, 0x651, 0x735, MSGIOB12b7, { FRU_MEZZANINE_BUS_ARBITER(60), FRU_HOST_BRIDGE(40) } }, { "", ERRD1, 0x652, 0x735, DEFER_MSGIOB12b7, { FRU_MEZZANINE_BUS_ARBITER(60), FRU_HOST_BRIDGE(40) } } }; struct event_description_pre_v6 io736[] = /* Mezzanine/Processor Bus Time-out Error */ { { "", ERRD1, 0x651, 0x736, MSGIOB12b7, { FRU_MEZZANINE_BUS_ARBITER(40), FRU_HOST_BRIDGE(35), FRU_MEMORY_CONTROLLER(25) } }, { "", ERRD1, 0x652, 0x736, DEFER_MSGIOB12b7, { FRU_MEZZANINE_BUS_ARBITER(40), FRU_HOST_BRIDGE(35), FRU_MEMORY_CONTROLLER(25) } } }; struct event_description_pre_v6 sp740[] = /* T.O. on communication response from SP */ { { "", ERRD1, 0x651, 0x740, MSGSPB16b0, { FRU_SERVICE_PROCESSOR(60), FRU_SP_SYSTEM_INTERFACE(40) } } }; struct event_description_pre_v6 sp640[] = /* I/O (I2C) general bus error */ { { "", ERRD1, 0x651, 0x640, MSGSPB16b1, { FRU_SP_PRIMARY_BUS(100) } } }; struct event_description_pre_v6 sp641[] = /* Secondary I/O (I2C) general bus error */ { { "", ERRD1, 0x651, 0x641, MSGSPB16b2, { FRU_SP_SECONDARY_BUS(100) } } }; struct event_description_pre_v6 sp642[] = /* Internal Service Processor memory error */ { { "", ERRD1, 0x651, 0x642, MSGSPB16b3, { FRU_SERVICE_PROCESSOR(100) } } }; struct event_description_pre_v6 sp741[] = /* SP error accessing special registers */ { { "", ERRD1, 0x651, 0x741, MSGSPB16b4, { FRU_SERVICE_PROCESSOR(60), FRU_SP_SYSTEM_INTERFACE(40) } } }; struct event_description_pre_v6 sp742[] = /* SP reports unknown communication error */ { { "", ERRD1, 0x651, 0x742, MSGSPB16b5, { FRU_SERVICE_PROCESSOR(60), FRU_SP_SYSTEM_INTERFACE(40) } } }; struct event_description_pre_v6 sp643[] = /* Internal Service Processor firmware error */ { { "", ERRD1, 0x651, 0x643, MSGSPB16b6, { FRU_SERVICE_PROCESSOR(100) } } }; struct event_description_pre_v6 sp644[] = /* Other internal SP hardware error */ { { "", ERRD1, 0x651, 0x644, MSGSPB16b7, { FRU_SERVICE_PROCESSOR(100) } } }; struct event_description_pre_v6 sp743[] = /* SP error accessing VPD EEPROM */ { { "", ERRD1, 0x651, 0x743, MSGSPB17b0, { FRU_VPD_MODULE(75), FRU_SP_PRIMARY_BUS(25) } } }; struct event_description_pre_v6 sp744[] = /* SP error accessing Operator Panel */ { { "", ERRD1, 0x651, 0x744, MSGSPB17b1, { FRU_OPERATOR_PANEL(75), FRU_SP_PRIMARY_BUS(25) } } }; struct event_description_pre_v6 sp745[] = /* SP error accessing Power Controller */ { { "", ERRD1, 0x651, 0x745, MSGSPB17b2, { FRU_POWER_CONTROLLER(75), FRU_SP_PRIMARY_BUS(25) } } }; struct event_description_pre_v6 sp746[] = /* SP error accessing Fan Sensor */ { { "", ERRD1, 0x651, 0x746, MSGSPB17b3, { FRU_FAN_SENSOR(75), FRU_SP_PRIMARY_BUS(25) } } }; struct event_description_pre_v6 sp747[] = /* SP error accessing Thermal Sensor */ { { "", ERRD1, 0x651, 0x747, MSGSPB17b4, { FRU_THERMAL_SENSOR(75), FRU_SP_PRIMARY_BUS(25) } } }; struct event_description_pre_v6 sp748[] = /* SP error accessing Voltage Sensor */ { { "", ERRD1, 0x651, 0x748, MSGSPB17b5, { FRU_VOLTAGE_SENSOR(75), FRU_SP_PRIMARY_BUS(25) } } }; struct event_description_pre_v6 sp749[] = /* SP error accessing serial port */ { { "", ERRD1, 0x651, 0x749, MSGSPB18b0, { FRU_SERIAL_PORT_CONTROLLER(75), FRU_SP_SYSTEM_INTERFACE(25) } } }; struct event_description_pre_v6 sp750[] = /* SP error accessing NVRAM */ { { "", ERRD1, 0x651, 0x750, MSGSPB18b1, { FRU_NVRAM(75), FRU_SP_SYSTEM_INTERFACE(25) } } }; struct event_description_pre_v6 sp751[] = /* SP error accessing RTC/TOD clock */ { { "", ERRD1, 0x651, 0x751, MSGSPB18b2, { FRU_RTC_TOD(75), FRU_SP_SYSTEM_INTERFACE(25) } } }; struct event_description_pre_v6 sp752[] = /* SP error accessing JTAG/COP controller */ { { "", ERRD1, 0x651, 0x752, MSGSPB18b3, { FRU_JTAG(75), FRU_SP_SYSTEM_INTERFACE(25) } } }; struct event_description_pre_v6 sp753[] = /* SP detect error with tod battery */ { { "", ERRD1, 0x651, 0x753, MSGSPB18b4, { FRU_BATTERY(75), FRU_SP_SYSTEM_INTERFACE(25) } } }; struct event_description_pre_v6 sp754[] = /* SP detect SPCN link failure */ { { "", ERRD1, 0x651, 0x754, MSGSPB19b0, } }; struct event_description_pre_v6 sp760[] = /* SP reboot system due to surveillance T.O. */ { { "", ERRD1, 0x651, 0x760, MSGSPB18b7, { FRU_SOFTWARE(60), FRU_HARDWARE(40) } } }; struct event_description_pre_v6 io770[] = /* Mezzanine/Processor Bus Addr. Parity Error */ { { "", ERRD1, 0x651, 0x770, MSGIOB12b5, { FRU_MEZZANINE_BUS(40), FRU_HOST_BRIDGE(35), FRU_IO_EXPANSION_BUS(25) } }, { "", ERRD1, 0x652, 0x770, DEFER_MSGIOB12b5, { FRU_MEZZANINE_BUS(40), FRU_HOST_BRIDGE(35), FRU_IO_EXPANSION_BUS(25) } } }; struct event_description_pre_v6 io771[] = /* Mezzanine/Processor Bus Data Parity Error */ { { "", ERRD1, 0x651, 0x771, MSGIOB12b6, { FRU_MEZZANINE_BUS(40), FRU_HOST_BRIDGE(35), FRU_IO_EXPANSION_BUS(25) } }, { "", ERRD1, 0x652, 0x771, DEFER_MSGIOB12b6, { FRU_MEZZANINE_BUS(40), FRU_HOST_BRIDGE(35), FRU_IO_EXPANSION_BUS(25) } } }; struct event_description_pre_v6 io772[] = /* Mezzanine/Processor Bus Time-out Error */ { { "", ERRD1, 0x651, 0x772, MSGIOB12b7, { FRU_MEZZANINE_BUS(40), FRU_HOST_BRIDGE(35), FRU_MEZZANINE_BUS_ARBITER(25) } }, { "", ERRD1, 0x652, 0x772, DEFER_MSGIOB12b7, { FRU_MEZZANINE_BUS(40), FRU_HOST_BRIDGE(35), FRU_MEZZANINE_BUS_ARBITER(25) } } }; struct event_description_pre_v6 io773[] = /* Err detected by i/o exp. bus controller */ { { "", ERRD1, 0x651, 0x773, MSGIOB12b6, { FRU_RIO_BRIDGE(100) } }, { "", ERRD1, 0x652, 0x773, DEFER_MSGIOB12b6, { FRU_RIO_BRIDGE(100) } } }; struct event_description_pre_v6 epow800[] = /* Fan is turning slower than expected */ { { "", ERRD1, 0x651, 0x800, MSGXEPOW1n11, { FRU_FAN(60), FRU_FAN_SENSOR(40) } } }; struct event_description_pre_v6 epow801[] = /* Fan stop was detected */ { { "", ERRD1, 0x651, 0x801, MSGXEPOW1n64, { FRU_FAN(60), FRU_FAN_SENSOR(40) } } }; struct event_description_pre_v6 epow802[] = /* Fan failure */ { { "", ERRD1, 0x651, 0x802, MSGEPOWB16b2C12 } }; struct event_description_pre_v6 epow809[] = /* Power fault due to unspecified cause */ { { "", ERRD1, 0x651, 0x809, MSGEPOWB17b0C12 } }; struct event_description_pre_v6 epow810[] = /* Over voltage condition was detected */ { { "", ERRD1, 0x651, 0x810, MSGXEPOW2n32, { FRU_POWER_SUPPLY(60), FRU_VOLTAGE_SENSOR(40) } } }; struct event_description_pre_v6 epow811[] = /* Under voltage condition was detected */ { { "", ERRD1, 0x651, 0x811, MSGXEPOW2n52, { FRU_POWER_SUPPLY(60), FRU_VOLTAGE_SENSOR(40) } } }; struct event_description_pre_v6 epow812[] = /* System shutdown due to loss of power */ { { "", ERRD1, 0x651, 0x812, MSGEPOWB1505, { FRU_POWER_SUPPLY(100) } } }; struct event_description_pre_v6 epow813[] = /* System shutdown due to loss of power to site*/ { { "", ERRD1, 0x651, 0x813, MSGEPOWPCI111 } }; struct event_description_pre_v6 epow814[] = /* System shutdown due to loss of power to CEC */ { { "", ERRD1, 0x651, 0x814, MSGEPOWPCI100 } }; struct event_description_pre_v6 epow815[] = /* System shutdown due to loss of power to I/O Rack */ { { "", ERRD1, 0x651, 0x815, MSGEPOWPCI011, { FRU_34_POWER_SUPPLY(50), FRU_14_POWER_SUPPLY(50) } } }; struct event_description_pre_v6 epow816[] = /* Power fault due to internal power supply */ { { "", ERRD1, 0x651, 0x816, MSGEPOWPCI001, { FRU_34_POWER_SUPPLY(100) } } }; struct event_description_pre_v6 epow817[] = /* Power fault due to internal power supply */ { { "", ERRD1, 0x651, 0x817, MSGEPOWPCI010, { FRU_14_POWER_SUPPLY(100) } } }; struct event_description_pre_v6 epow818[] = /* Power fault due to power-off request */ { { "", ERRD1, 0x651, 0x818, MSGEPOWB16b1B17b3 } }; struct event_description_pre_v6 epow819[] = /* Power fault due to internal power supply */ { { "", ERRD1, 0x651, 0x819, MSGEPOWPCI001, { FRU_RTASFRU(100) } } }; struct event_description_pre_v6 epow819red[] = /* Power fault due to internal redundant PS */ { { "", ERRD1, 0x652, 0x819, MSGEPOWB17b2RED } }; struct event_description_pre_v6 epow820[] = /* Over temperature condition was detected */ { { "", ERRD1, 0x651, 0x820, MSGXEPOW3n21, { FRU_THERMAL_SENSOR(100) } } }; struct event_description_pre_v6 epow821[] = /* System shutdown due to over max temp. */ { { "", ERRD1, 0x651, 0x821, MSGXEPOW3n73, { FRU_THERMAL_SENSOR(100) } } }; struct event_description_pre_v6 epow822[] = /* System shutdown due to thermal and fan fail */ { { "", ERRD1, 0x651, 0x822, MSGEPOWB16b23 } }; struct event_description_pre_v6 epow823[] = /* System shutdown due to fan failure */ { { "", ERRD1, 0x651, 0x823, MSGEPOWB16b2C37 } }; struct event_description_pre_v6 epow824[] = /* System shutdown:Power fault-unspecified cause*/ { { "", ERRD1, 0x651, 0x824, MSGEPOWB17b0C37 } }; struct event_description_pre_v6 epow652810[] = /* Loss of redundant power supply. */ { { "", ERRD1, 0x652, 0x810, MSGEPOW1502B16b4 } }; struct event_description_pre_v6 epow652820[] = /* Loss of redundant cec blower. */ { { "", ERRD1, 0x652, 0x820, MSGEPOW1501B16b4 } }; struct event_description_pre_v6 post[] = /* POST 8 digit code */ { { "", ERRD1, -2, 0x0, MSGPOSTALL, /* -2 = DAVars has 8 digit hex code */ { { 0, "", "", 36}, { 0, "", "", 36}, { 0, "", "", 36}, { 0, "", "", 36} } } }; struct event_description_pre_v6 postfw[] = /* POST 8 digit code that is fw error*/ { { "", ERRD1, -2, 0x0, MSGPOSTALL, /* -2 = DAVars has 8 digit hex code */ { { 50, " ", " ", 35}, { 50, " ", " ", 34} } } }; struct event_description_pre_v6 memtest600[] = /* Uncorrectable/unsupported memory */ { { "", ERRD1, 0x651, 0x600, MSG_UNSUPPORTED_MEM, { FRU_MEMORY_MODULE(100) } }, { "", ERRD1, 0x652, 0x600, DEFER_MSG_UNSUPPORTED_MEM, { FRU_MEMORY_MODULE(100) } } }; struct event_description_pre_v6 memtest601[] = /* Missing or bad memory */ { { "", ERRD1, 0x651, 0x601, MSG_MISSING_MEM, { FRU_MEMORY_MODULE(100) } } }; struct event_description_pre_v6 memtest602[] = /* Missing or bad memory */ { { "", ERRD1, 0x651, 0x602, MSG_MISSING_MEM, { FRU_MEMORY_MODULE(90), FRU_MEMORY_CARD(10) } } }; struct event_description_pre_v6 memtest603[] = /* Missing or bad memory */ { { "", ERRD1, 0x651, 0x603, MSG_MISSING_MEM, { FRU_MEMORY_MODULE(90), FRU_MEMORY_CARD(10) } } }; struct event_description_pre_v6 l2test608[] = /* Bad L2 Cache */ { { "", ERRD1, 0x651, 0x608, MSG_BAD_L2, { FRU_L2CACHE(100) } } }; struct event_description_pre_v6 l2test609[] = /* Missing L2 Cache */ { { "", ERRD1, 0x651, 0x609, MSG_MISSING_L2, { FRU_MISSING_L2(100) } } }; /* * Source Number to match dresid and DIMB */ struct event_description_pre_v6 optest140[] = /* Op panel display test failed */ { { "", ERRD1, 0x651, 0x140, MSG_OP_PANEL_FAIL, { FRU_OPERATOR_PANEL(95), FRU_IO_PLANAR(5) } } }; /* * Event that is filled with ref. codes (in conf. field) and location * codes. The SRN will be formatted differently because the conf. * value is greater than 100. */ struct event_description_pre_v6 cec_src[] = /* SRC and ref. codes from CEC */ { { "", ERRD1, 0x651, 0, "", { { 0, "", "", 0}, { 0, "", "", 0}, { 0, "", "", 0}, { 0, "", "", 0} } } }; struct event_description_pre_v6 fan_epow[] = /* SRN for fan epow */ { { "", ERRD1, 0x651, 0, "", { FRU_FAN(60), FRU_FAN_SENSOR(40) } } }; struct event_description_pre_v6 volt_epow[] = /* SRN for voltage sensor epow */ { { "", ERRD1, 0x651, 0, "", { FRU_POWER_SUPPLY(60), FRU_VOLTAGE_SENSOR(40) } } }; struct event_description_pre_v6 therm_epow[] = /* SRN for thermal sensor epow */ { { "", ERRD1, 0x651, 0, "", { FRU_THERMAL_SENSOR(100) } } }; struct event_description_pre_v6 pow_epow[] = /* SRN for power epow */ { { "", ERRD1, 0x651, 0, "", { FRU_POWER_SUPPLY(60), FRU_POWER_SENSOR(40) } } }; struct event_description_pre_v6 unknown_epow[] = /* SRN for unknown epow */ { { "", ERRD1, 0x651, 0, "", { { 100, "", "", 180} } } }; /* Version 3 error descriptions */ struct event_description_pre_v6 platform_error[] = /* SRN for platform specific error */ { { "", ERRD1, 0x651, 0x900, MSG_PLATFORM_ERROR, { { 0, "", "", 0}, { 0, "", "", 0}, { 0, "", "", 0}, { 0, "", "", 0} } } }; #define SN_V3ELA 0xA00 /* source number for V3 ELA */ struct event_description_pre_v6 v3_errdscr[] = /* SRN for V3 error logs */ { { "", ERRD1, SN_V3ELA, 0, "", { { 0, "", "", 0}, { 0, "", "", 0}, { 0, "", "", 0}, { 0, "", "", 0} } } }; struct event_description_pre_v6 dt_errdscr[] = /* SRN for deconfig resources in device tree */ { { "", ERRD1, 0xA10, 0x200, FAIL_BY_PLATFORM, { { 100, "", "", 0}, } } }; struct event_description_pre_v6 bypass_errdscr[] = /* SRN for deconfig resource from error log */ { { "", ERRD1, 0xA10, 0x100, MSG_BYPASS, { { 100, "", "", 0}, } } }; #endif ppc64-diag-2.6.4/rtas_errd/eeh.c0000644000000000000000000000604012313010662014743 0ustar rootroot/* * @file eeh.c * @brief Routine to handle EEH notification RTAS events * * Copyright (C) 2004 IBM Corporation */ #include #include #include #include "rtas_errd.h" /** * @struct event_desc * @brief Definition for a SRC value and its corresponding description. */ struct event_desc { char *src_code; char *desc; }; /** * @var event_descs * @brief Array of event_desc structs for the SRC values to search * in an EEH related RTAS event. */ struct event_desc event_descs[] = { {"BA188001", "EEH recovered a failing I/O adapter"}, {"BA188002", "EEH could not recover the failed I/O adapter"}, {"BA180010", "PCI probe error, bridge in freeze state"}, {"BA180011", "PCI bridge probe error, bridge is not usable"}, {"BA180012", "PCI device runtime error, bridge in freeze state"}, {NULL, NULL} }; /** * check_eeh * @brief Check a RTAS event for EEH event notification. * * Parse a RTAS event to see if this is an EEH event notification. * If so, then update the platform log file with additional * information about the EEH event. * * @param event pointer to the RTAS event */ void check_eeh(struct event *event) { struct rtas_event_hdr *rtas_hdr = event->rtas_hdr; struct rtas_priv_hdr_scn *privhdr; struct rtas_src_scn *src; int index = 0; if (rtas_hdr->version != 6) { return; } src = rtas_get_src_scn(event->rtas_event); if (src == NULL) { log_msg(event, "Could not retrieve SRC section to check for " "an EEH event, skipping"); return; } /* * Check for a known EEH event described above in the * events description array. */ while (event_descs[index].src_code != NULL) { if (strncmp((char *)src->primary_refcode, event_descs[index].src_code, 8) == 0) break; index++; } if (event_descs[index].src_code == NULL) return; /* * Write the EEH Event notification out to /var/log/platform * Please trust the compiler to get this right */ platform_log_write("EEH Event Notification\n"); privhdr = rtas_get_priv_hdr_scn(event->rtas_event); if (privhdr == NULL) { log_msg(event, "Could not retrieve the RTAS Event information " "to report EEH failure date/time"); platform_log_write("Could not retrieve RTAS Event Date/Time\n"); } else { platform_log_write("%02x/%02x/%04x %02x:%02x:%02x\n", privhdr->date.month, privhdr->date.day, privhdr->date.year, privhdr->time.hour, privhdr->time.minutes, privhdr->time.seconds); } platform_log_write("Event SRC Code: %s\n", event_descs[index].src_code); platform_log_write(" %s\n", event_descs[index].desc); if (src->fru_scns != NULL) { struct rtas_fru_scn *fru = src->fru_scns; platform_log_write(" Device Location Code: %s\n", fru->loc_code); snprintf(event->addl_text, ADDL_TEXT_MAX, "%s, Location %s", event_descs[index].desc, fru->loc_code); } else { platform_log_write(" No Device Location Code provided.\n"); snprintf(event->addl_text, ADDL_TEXT_MAX, "%s, no " "location code provided", event_descs[index].desc); } return; } ppc64-diag-2.6.4/rtas_errd/diag_support.c0000644000000000000000000002061212313010662016703 0ustar rootroot/** * @file diag_support.c * * Copyright (C) 2005, 2008 IBM Corporation */ #include #include #include #include #include #include #include #include #include "rtas_errd.h" #define CMD_LSVPD "lsvpd" char target_status[80]; void free_diag_vpd(struct event *event) { if (event->diag_vpd.ds != NULL) { free(event->diag_vpd.ds); event->diag_vpd.ds = NULL; } if (event->diag_vpd.yl != NULL) { free(event->diag_vpd.yl); event->diag_vpd.yl = NULL; } if (event->diag_vpd.fn != NULL) { free(event->diag_vpd.fn); event->diag_vpd.fn = NULL; } if (event->diag_vpd.sn != NULL) { free(event->diag_vpd.sn); event->diag_vpd.sn = NULL; } if (event->diag_vpd.se != NULL) { free(event->diag_vpd.se); event->diag_vpd.se = NULL; } if (event->diag_vpd.tm != NULL) { free(event->diag_vpd.tm); event->diag_vpd.tm = NULL; } } /* * Execute the 'lsvpd' command and open a pipe to read the data */ static int lsvpd_init(FILE **fp) { char cmd[128]; dbg("start lsvpd_init"); sprintf(cmd, "%s 2>/dev/null", CMD_LSVPD); *fp = popen(cmd, "r"); if (!*fp) { perror("popen"); dbg("lsvpd_init failed popen (%s)", CMD_LSVPD); return -1; } dbg("end lsvpd_init"); return 0; } /* * Close the open a pipe on 'lsvpd'. */ static int lsvpd_term(FILE *fp) { int rc = 0; char line[512]; /* If pipe was opened read all vpd */ /* entries until pipe is empty. */ if (fp) { while (fgets(line, sizeof(line), fp)); rc = pclose(fp); } return rc; } /* * Read the next lsvpd keyword, value pair */ static int lsvpd_read(struct event *event, FILE *fp) { int rc = 1; char line[512]; dbg("start lsvpd_read"); if (!fp) return rc; /* clear all residual data */ free_diag_vpd(event); while (fgets(line, sizeof(line), fp)) { if (line[strlen(line) - 1] == '\n') line[strlen(line) - 1] = '\0'; if (! strncmp(line, "*DS", 3)) { event->diag_vpd.ds = (char *)malloc(strlen (line) + 1); if (event->diag_vpd.ds == NULL) return rc; strcpy(event->diag_vpd.ds, &line[4]); dbg("found DS: \"%s\"", event->diag_vpd.ds); } if (! strncmp(line, "*YL", 3)) { event->diag_vpd.yl = (char *)malloc(strlen (line) + 1); if (event->diag_vpd.yl == NULL) return rc; strcpy(event->diag_vpd.yl, &line[4]); dbg("found YL: \"%s\"", event->diag_vpd.yl); } if (! strncmp(line, "*FN", 3)) { event->diag_vpd.fn = (char *)malloc(strlen (line) + 1); if (event->diag_vpd.fn == NULL) return rc; strcpy(event->diag_vpd.fn, &line[4]); dbg("found FN: \"%s\"", event->diag_vpd.fn); } if (! strncmp(line, "*SN", 3)) { event->diag_vpd.sn = (char *)malloc(strlen (line) + 1); if (event->diag_vpd.sn == NULL) return rc; strcpy(event->diag_vpd.sn, &line[4]); dbg("found SN: \"%s\"", event->diag_vpd.sn); } if (! strncmp(line, "*SE", 3)) { event->diag_vpd.se = (char *)malloc(strlen (line) + 1); if (event->diag_vpd.se == NULL) return rc; strcpy(event->diag_vpd.se, &line[4]); dbg("found SE: \"%s\"", event->diag_vpd.se); } if (! strncmp(line, "*TM", 3)) { event->diag_vpd.tm = (char *)malloc(strlen (line) + 1); if (event->diag_vpd.tm == NULL) return rc; strcpy(event->diag_vpd.tm, &line[4]); dbg("found TM: \"%s\"", event->diag_vpd.tm); } if (! strncmp(line, "*FC", 3)) { /* start of next record */ dbg("found FC - start next record"); return 0; } } dbg("end lsvpd_read"); return 1; } int get_diag_vpd(struct event *event, char *phyloc) { int rc = 0; FILE *fp = NULL; dbg("start get_diag_vpd"); if (event->diag_vpd.yl != NULL) free_diag_vpd(event); /* sigchld_handler() messes up pclose(). */ restore_sigchld_default(); if (lsvpd_init(&fp) != 0) { setup_sigchld_handler(); return 1; } while (event->diag_vpd.yl == NULL || strcmp(event->diag_vpd.yl, phyloc)) { if (lsvpd_read(event, fp)) { dbg("end get_diag_vpd, failure"); rc = lsvpd_term(fp); setup_sigchld_handler(); return 1; } } rc = lsvpd_term(fp); if (rc) dbg("end get_diag_vpd, pclose failure"); else dbg("end get_diag_vpd, success"); setup_sigchld_handler(); return rc; } char * get_dt_status(char *dev) { FILE *fp1, *fp2; char loc_file[80]; char target[80]; char *ptr; char command[]="/usr/bin/find /proc/device-tree -name status -print > /tmp/get_dt_files"; if (system(command) != 0) { fprintf(stderr, "get_dt_status find command failed\n"); return NULL; } /* results of the find command */ fp1 = fopen("/tmp/get_dt_files", "r"); if (fp1 == 0) { fprintf(stderr, "open failed on /tmp/get_dt_files\n"); return NULL; } while (fscanf (fp1, "%s", loc_file) != EOF) { dbg("read from /tmp/get_dt_files, \"%s\"", loc_file); /* read the status in case this is the one */ fp2 = fopen(loc_file, "r"); if (fp2 == 0) { fprintf(stderr, "open failed on %s\n", loc_file); return NULL; } if (fscanf(fp2, "%s", target_status)) { dbg("target_status = \"%s\", loc_file = \"%s\"", target_status, loc_file); } else { fprintf(stderr, "read failed on %s\n", loc_file); return NULL; } fclose(fp2); /* read the loc-code file to determine if found dev */ ptr = strstr(loc_file, "status"); strcpy(ptr, "ibm,loc-code"); fp2 = fopen(loc_file, "r"); if (fp2 == 0) { fprintf(stderr, "open failed on %s\n", loc_file); return NULL; } if (fscanf(fp2, "%s", target)) { dbg("target = \"%s\", loc_file = \"%s\"", target, loc_file); if (strcmp(dev, target) == 0) { dbg("status = \"%s\"", target_status); return target_status; } fclose (fp2); } else { fprintf(stderr, "read failed on %s\n", loc_file); return NULL; } } fclose(fp1); fprintf(stderr, "error: status NOT FOUND\n"); return NULL; } /** * is_integrated * @brief This function determines if the device is an integrated device or not. * * RETURNS: * 0 - Not integrated * 1 - Is integrated * -1 - System error obtaining data * */ int is_integrated(char *phy_loc) { int rc; int index = -1; dbg("phy_loc = \"%s\"", phy_loc); rc = 0; index = strlen(phy_loc); /* Start at the end of the location code looking for */ /* a slash or a dash. If the beginning of the */ /* location code is reached without finding either, */ /* then the resource is not integrated. */ while (index > 0) { if (phy_loc[index] == '/') { dbg("found slash, resource may be integrated"); index--; /* Now find planar. Only allowable */ /* characters between here and 'P' */ /* are numerics and '.' */ while (index >= 0) { if (phy_loc[index] == 'P') { rc = 1; break; } else if (phy_loc[index] == '.') index--; else if (phy_loc[index] >= '0' && phy_loc[index] <= '9') index--; else { rc = 0; break; } } break; } if (phy_loc[index] == '-') { dbg("found dash, so resource is not integrated"); rc = 0; break; } index--; } /* while index > 0 */ return rc; } /** * get_base_loc * * FUNCTION: Reduce the given location code to the base physical FRU, thus * removing the extended functional location information. Currently * this works for CHRP physical location codes, but will need to * updated for converged location codes. */ void get_base_loc(char *phyloc, char *base) { /* Char by char copy until reaching a slash ('/) or the end */ while (*phyloc != 0 && *phyloc != '/') { *base = *phyloc; base++; phyloc++; } /* Now the terminating null */ *base = 0; } /** * diag_fru_pn_by_ploc * * Returns the FRU part number from VPD, as defined by the "FN" vpd keyword, * for the FRU given by the physical location code * * RETURNS: * 0 if not found information. * 1 if found information. * -1 if error found during search */ char * diag_get_fru_pn(struct event *event, char *phyloc) { char baseloc[80]; if (is_integrated(phyloc)) { /* Use the base location code */ get_base_loc(phyloc, baseloc); if (get_diag_vpd(event, baseloc)) return NULL; if (event->diag_vpd.fn == NULL) /* not found for base loc. code */ return NULL; } else { /* not integrated */ if (get_diag_vpd(event, phyloc)) return NULL; if (event->diag_vpd.fn == NULL) /* not found */ return NULL; } /* found for given location code */ return event->diag_vpd.fn; } ppc64-diag-2.6.4/rtas_errd/doxygen.config0000644000000000000000000013425012313010662016707 0ustar rootroot# Doxyfile 1.3.8 # This file describes the settings to be used by the documentation system # doxygen (www.doxygen.org) for a project # # All text after a hash (#) is considered a comment and will be ignored # The format is: # TAG = value [value, ...] # For lists items can also be appended using: # TAG += value [value, ...] # Values that contain spaces should be placed between quotes (" ") #--------------------------------------------------------------------------- # Project related configuration options #--------------------------------------------------------------------------- # The PROJECT_NAME tag is a single word (or a sequence of words surrounded # by quotes) that should identify the project. PROJECT_NAME = rtas_errd # The PROJECT_NUMBER tag can be used to enter a project or revision number. # This could be handy for archiving the generated documentation or # if some version control system is used. PROJECT_NUMBER = # The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) # base path where the generated documentation will be put. # If a relative path is entered, it will be relative to the location # where doxygen was started. If left blank the current directory will be used. OUTPUT_DIRECTORY = doc # If the CREATE_SUBDIRS tag is set to YES, then doxygen will create # 4096 sub-directories (in 2 levels) under the output directory of each output # format and will distribute the generated files over these directories. # Enabling this option can be useful when feeding doxygen a huge amount of source # files, where putting all generated files in the same directory would otherwise # cause performance problems for the file system. CREATE_SUBDIRS = NO # The OUTPUT_LANGUAGE tag is used to specify the language in which all # documentation generated by doxygen is written. Doxygen will use this # information to generate all constant output in the proper language. # The default language is English, other supported languages are: # Brazilian, Catalan, Chinese, Chinese-Traditional, Croatian, Czech, Danish, # Dutch, Finnish, French, German, Greek, Hungarian, Italian, Japanese, # Japanese-en (Japanese with English messages), Korean, Korean-en, Norwegian, # Polish, Portuguese, Romanian, Russian, Serbian, Slovak, Slovene, Spanish, # Swedish, and Ukrainian. OUTPUT_LANGUAGE = English # This tag can be used to specify the encoding used in the generated output. # The encoding is not always determined by the language that is chosen, # but also whether or not the output is meant for Windows or non-Windows users. # In case there is a difference, setting the USE_WINDOWS_ENCODING tag to YES # forces the Windows encoding (this is the default for the Windows binary), # whereas setting the tag to NO uses a Unix-style encoding (the default for # all platforms other than Windows). USE_WINDOWS_ENCODING = NO # If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will # include brief member descriptions after the members that are listed in # the file and class documentation (similar to JavaDoc). # Set to NO to disable this. BRIEF_MEMBER_DESC = YES # If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend # the brief description of a member or function before the detailed description. # Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the # brief descriptions will be completely suppressed. REPEAT_BRIEF = NO # This tag implements a quasi-intelligent brief description abbreviator # that is used to form the text in various listings. Each string # in this list, if found as the leading text of the brief description, will be # stripped from the text and the result after processing the whole list, is used # as the annotated text. Otherwise, the brief description is used as-is. If left # blank, the following values are used ("$name" is automatically replaced with the # name of the entity): "The $name class" "The $name widget" "The $name file" # "is" "provides" "specifies" "contains" "represents" "a" "an" "the" ABBREVIATE_BRIEF = # If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then # Doxygen will generate a detailed section even if there is only a brief # description. ALWAYS_DETAILED_SEC = NO # If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all inherited # members of a class in the documentation of that class as if those members were # ordinary class members. Constructors, destructors and assignment operators of # the base classes will not be shown. INLINE_INHERITED_MEMB = NO # If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full # path before files name in the file list and in the header files. If set # to NO the shortest path that makes the file name unique will be used. FULL_PATH_NAMES = YES # If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag # can be used to strip a user-defined part of the path. Stripping is # only done if one of the specified strings matches the left-hand part of # the path. The tag can be used to show relative paths in the file list. # If left blank the directory from which doxygen is run is used as the # path to strip. STRIP_FROM_PATH = # The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of # the path mentioned in the documentation of a class, which tells # the reader which header file to include in order to use a class. # If left blank only the name of the header file containing the class # definition is used. Otherwise one should specify the include paths that # are normally passed to the compiler using the -I flag. STRIP_FROM_INC_PATH = # If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter # (but less readable) file names. This can be useful is your file systems # doesn't support long names like on DOS, Mac, or CD-ROM. SHORT_NAMES = NO # If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen # will interpret the first line (until the first dot) of a JavaDoc-style # comment as the brief description. If set to NO, the JavaDoc # comments will behave just like the Qt-style comments (thus requiring an # explicit @brief command for a brief description. JAVADOC_AUTOBRIEF = NO # The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen # treat a multi-line C++ special comment block (i.e. a block of //! or /// # comments) as a brief description. This used to be the default behaviour. # The new default is to treat a multi-line C++ comment block as a detailed # description. Set this tag to YES if you prefer the old behaviour instead. MULTILINE_CPP_IS_BRIEF = NO # If the DETAILS_AT_TOP tag is set to YES then Doxygen # will output the detailed description near the top, like JavaDoc. # If set to NO, the detailed description appears after the member # documentation. DETAILS_AT_TOP = NO # If the INHERIT_DOCS tag is set to YES (the default) then an undocumented # member inherits the documentation from any documented member that it # re-implements. INHERIT_DOCS = YES # If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC # tag is set to YES, then doxygen will reuse the documentation of the first # member in the group (if any) for the other members of the group. By default # all members of a group must be documented explicitly. DISTRIBUTE_GROUP_DOC = NO # The TAB_SIZE tag can be used to set the number of spaces in a tab. # Doxygen uses this value to replace tabs by spaces in code fragments. TAB_SIZE = 8 # This tag can be used to specify a number of aliases that acts # as commands in the documentation. An alias has the form "name=value". # For example adding "sideeffect=\par Side Effects:\n" will allow you to # put the command \sideeffect (or @sideeffect) in the documentation, which # will result in a user-defined paragraph with heading "Side Effects:". # You can put \n's in the value part of an alias to insert newlines. ALIASES = # Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C sources # only. Doxygen will then generate output that is more tailored for C. # For instance, some of the names that are used will be different. The list # of all members will be omitted, etc. OPTIMIZE_OUTPUT_FOR_C = YES # Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java sources # only. Doxygen will then generate output that is more tailored for Java. # For instance, namespaces will be presented as packages, qualified scopes # will look different, etc. OPTIMIZE_OUTPUT_JAVA = NO # Set the SUBGROUPING tag to YES (the default) to allow class member groups of # the same type (for instance a group of public functions) to be put as a # subgroup of that type (e.g. under the Public Functions section). Set it to # NO to prevent subgrouping. Alternatively, this can be done per class using # the \nosubgrouping command. SUBGROUPING = NO #--------------------------------------------------------------------------- # Build related configuration options #--------------------------------------------------------------------------- # If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in # documentation are documented, even if no documentation was available. # Private class members and static file members will be hidden unless # the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES EXTRACT_ALL = YES # If the EXTRACT_PRIVATE tag is set to YES all private members of a class # will be included in the documentation. EXTRACT_PRIVATE = NO # If the EXTRACT_STATIC tag is set to YES all static members of a file # will be included in the documentation. EXTRACT_STATIC = YES # If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) # defined locally in source files will be included in the documentation. # If set to NO only classes defined in header files are included. EXTRACT_LOCAL_CLASSES = YES # This flag is only useful for Objective-C code. When set to YES local # methods, which are defined in the implementation section but not in # the interface are included in the documentation. # If set to NO (the default) only methods in the interface are included. EXTRACT_LOCAL_METHODS = NO # If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all # undocumented members of documented classes, files or namespaces. # If set to NO (the default) these members will be included in the # various overviews, but no documentation section is generated. # This option has no effect if EXTRACT_ALL is enabled. HIDE_UNDOC_MEMBERS = NO # If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all # undocumented classes that are normally visible in the class hierarchy. # If set to NO (the default) these classes will be included in the various # overviews. This option has no effect if EXTRACT_ALL is enabled. HIDE_UNDOC_CLASSES = NO # If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all # friend (class|struct|union) declarations. # If set to NO (the default) these declarations will be included in the # documentation. HIDE_FRIEND_COMPOUNDS = NO # If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any # documentation blocks found inside the body of a function. # If set to NO (the default) these blocks will be appended to the # function's detailed documentation block. HIDE_IN_BODY_DOCS = NO # The INTERNAL_DOCS tag determines if documentation # that is typed after a \internal command is included. If the tag is set # to NO (the default) then the documentation will be excluded. # Set it to YES to include the internal documentation. INTERNAL_DOCS = NO # If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate # file names in lower-case letters. If set to YES upper-case letters are also # allowed. This is useful if you have classes or files whose names only differ # in case and if your file system supports case sensitive file names. Windows # and Mac users are advised to set this option to NO. CASE_SENSE_NAMES = YES # If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen # will show members with their full class and namespace scopes in the # documentation. If set to YES the scope will be hidden. HIDE_SCOPE_NAMES = NO # If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen # will put a list of the files that are included by a file in the documentation # of that file. SHOW_INCLUDE_FILES = YES # If the INLINE_INFO tag is set to YES (the default) then a tag [inline] # is inserted in the documentation for inline members. INLINE_INFO = YES # If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen # will sort the (detailed) documentation of file and class members # alphabetically by member name. If set to NO the members will appear in # declaration order. SORT_MEMBER_DOCS = YES # If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the # brief documentation of file, namespace and class members alphabetically # by member name. If set to NO (the default) the members will appear in # declaration order. SORT_BRIEF_DOCS = NO # If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be # sorted by fully-qualified names, including namespaces. If set to # NO (the default), the class list will be sorted only by class name, # not including the namespace part. # Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. # Note: This option applies only to the class list, not to the # alphabetical list. SORT_BY_SCOPE_NAME = NO # The GENERATE_TODOLIST tag can be used to enable (YES) or # disable (NO) the todo list. This list is created by putting \todo # commands in the documentation. GENERATE_TODOLIST = YES # The GENERATE_TESTLIST tag can be used to enable (YES) or # disable (NO) the test list. This list is created by putting \test # commands in the documentation. GENERATE_TESTLIST = YES # The GENERATE_BUGLIST tag can be used to enable (YES) or # disable (NO) the bug list. This list is created by putting \bug # commands in the documentation. GENERATE_BUGLIST = YES # The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or # disable (NO) the deprecated list. This list is created by putting # \deprecated commands in the documentation. GENERATE_DEPRECATEDLIST= YES # The ENABLED_SECTIONS tag can be used to enable conditional # documentation sections, marked by \if sectionname ... \endif. ENABLED_SECTIONS = # The MAX_INITIALIZER_LINES tag determines the maximum number of lines # the initial value of a variable or define consists of for it to appear in # the documentation. If the initializer consists of more lines than specified # here it will be hidden. Use a value of 0 to hide initializers completely. # The appearance of the initializer of individual variables and defines in the # documentation can be controlled using \showinitializer or \hideinitializer # command in the documentation regardless of this setting. MAX_INITIALIZER_LINES = 30 # Set the SHOW_USED_FILES tag to NO to disable the list of files generated # at the bottom of the documentation of classes and structs. If set to YES the # list will mention the files that were used to generate the documentation. SHOW_USED_FILES = YES #--------------------------------------------------------------------------- # configuration options related to warning and progress messages #--------------------------------------------------------------------------- # The QUIET tag can be used to turn on/off the messages that are generated # by doxygen. Possible values are YES and NO. If left blank NO is used. QUIET = NO # The WARNINGS tag can be used to turn on/off the warning messages that are # generated by doxygen. Possible values are YES and NO. If left blank # NO is used. WARNINGS = YES # If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings # for undocumented members. If EXTRACT_ALL is set to YES then this flag will # automatically be disabled. WARN_IF_UNDOCUMENTED = YES # If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for # potential errors in the documentation, such as not documenting some # parameters in a documented function, or documenting parameters that # don't exist or using markup commands wrongly. WARN_IF_DOC_ERROR = YES # The WARN_FORMAT tag determines the format of the warning messages that # doxygen can produce. The string should contain the $file, $line, and $text # tags, which will be replaced by the file and line number from which the # warning originated and the warning text. WARN_FORMAT = "$file:$line: $text" # The WARN_LOGFILE tag can be used to specify a file to which warning # and error messages should be written. If left blank the output is written # to stderr. WARN_LOGFILE = #--------------------------------------------------------------------------- # configuration options related to the input files #--------------------------------------------------------------------------- # The INPUT tag can be used to specify the files and/or directories that contain # documented source files. You may enter file names like "myfile.cpp" or # directories like "/usr/src/myproject". Separate the files or directories # with spaces. INPUT = # If the value of the INPUT tag contains directories, you can use the # FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp # and *.h) to filter out the source-files in the directories. If left # blank the following patterns are tested: # *.c *.cc *.cxx *.cpp *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh *.hxx *.hpp # *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm FILE_PATTERNS = # The RECURSIVE tag can be used to turn specify whether or not subdirectories # should be searched for input files as well. Possible values are YES and NO. # If left blank NO is used. RECURSIVE = NO # The EXCLUDE tag can be used to specify files and/or directories that should # excluded from the INPUT source files. This way you can easily exclude a # subdirectory from a directory tree whose root is specified with the INPUT tag. EXCLUDE = # The EXCLUDE_SYMLINKS tag can be used select whether or not files or directories # that are symbolic links (a Unix filesystem feature) are excluded from the input. EXCLUDE_SYMLINKS = NO # If the value of the INPUT tag contains directories, you can use the # EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude # certain files from those directories. EXCLUDE_PATTERNS = # The EXAMPLE_PATH tag can be used to specify one or more files or # directories that contain example code fragments that are included (see # the \include command). EXAMPLE_PATH = # If the value of the EXAMPLE_PATH tag contains directories, you can use the # EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp # and *.h) to filter out the source-files in the directories. If left # blank all files are included. EXAMPLE_PATTERNS = # If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be # searched for input files to be used with the \include or \dontinclude # commands irrespective of the value of the RECURSIVE tag. # Possible values are YES and NO. If left blank NO is used. EXAMPLE_RECURSIVE = NO # The IMAGE_PATH tag can be used to specify one or more files or # directories that contain image that are included in the documentation (see # the \image command). IMAGE_PATH = # The INPUT_FILTER tag can be used to specify a program that doxygen should # invoke to filter for each input file. Doxygen will invoke the filter program # by executing (via popen()) the command , where # is the value of the INPUT_FILTER tag, and is the name of an # input file. Doxygen will then use the output that the filter program writes # to standard output. If FILTER_PATTERNS is specified, this tag will be # ignored. INPUT_FILTER = # The FILTER_PATTERNS tag can be used to specify filters on a per file pattern # basis. Doxygen will compare the file name with each pattern and apply the # filter if there is a match. The filters are a list of the form: # pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further # info on how filters are used. If FILTER_PATTERNS is empty, INPUT_FILTER # is applied to all files. FILTER_PATTERNS = # If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using # INPUT_FILTER) will be used to filter the input files when producing source # files to browse (i.e. when SOURCE_BROWSER is set to YES). FILTER_SOURCE_FILES = NO #--------------------------------------------------------------------------- # configuration options related to source browsing #--------------------------------------------------------------------------- # If the SOURCE_BROWSER tag is set to YES then a list of source files will # be generated. Documented entities will be cross-referenced with these sources. # Note: To get rid of all source code in the generated output, make sure also # VERBATIM_HEADERS is set to NO. SOURCE_BROWSER = NO # Setting the INLINE_SOURCES tag to YES will include the body # of functions and classes directly in the documentation. INLINE_SOURCES = NO # Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct # doxygen to hide any special comment blocks from generated source code # fragments. Normal C and C++ comments will always remain visible. STRIP_CODE_COMMENTS = YES # If the REFERENCED_BY_RELATION tag is set to YES (the default) # then for each documented function all documented # functions referencing it will be listed. REFERENCED_BY_RELATION = YES # If the REFERENCES_RELATION tag is set to YES (the default) # then for each documented function all documented entities # called/used by that function will be listed. REFERENCES_RELATION = YES # If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen # will generate a verbatim copy of the header file for each class for # which an include is specified. Set to NO to disable this. VERBATIM_HEADERS = YES #--------------------------------------------------------------------------- # configuration options related to the alphabetical class index #--------------------------------------------------------------------------- # If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index # of all compounds will be generated. Enable this if the project # contains a lot of classes, structs, unions or interfaces. ALPHABETICAL_INDEX = NO # If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then # the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns # in which this list will be split (can be a number in the range [1..20]) COLS_IN_ALPHA_INDEX = 5 # In case all classes in a project start with a common prefix, all # classes will be put under the same header in the alphabetical index. # The IGNORE_PREFIX tag can be used to specify one or more prefixes that # should be ignored while generating the index headers. IGNORE_PREFIX = #--------------------------------------------------------------------------- # configuration options related to the HTML output #--------------------------------------------------------------------------- # If the GENERATE_HTML tag is set to YES (the default) Doxygen will # generate HTML output. GENERATE_HTML = YES # The HTML_OUTPUT tag is used to specify where the HTML docs will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `html' will be used as the default path. HTML_OUTPUT = html # The HTML_FILE_EXTENSION tag can be used to specify the file extension for # each generated HTML page (for example: .htm,.php,.asp). If it is left blank # doxygen will generate files with .html extension. HTML_FILE_EXTENSION = .html # The HTML_HEADER tag can be used to specify a personal HTML header for # each generated HTML page. If it is left blank doxygen will generate a # standard header. HTML_HEADER = # The HTML_FOOTER tag can be used to specify a personal HTML footer for # each generated HTML page. If it is left blank doxygen will generate a # standard footer. HTML_FOOTER = # The HTML_STYLESHEET tag can be used to specify a user-defined cascading # style sheet that is used by each HTML page. It can be used to # fine-tune the look of the HTML output. If the tag is left blank doxygen # will generate a default style sheet. Note that doxygen will try to copy # the style sheet file to the HTML output directory, so don't put your own # stylesheet in the HTML output directory as well, or it will be erased! HTML_STYLESHEET = # If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes, # files or namespaces will be aligned in HTML using tables. If set to # NO a bullet list will be used. HTML_ALIGN_MEMBERS = YES # If the GENERATE_HTMLHELP tag is set to YES, additional index files # will be generated that can be used as input for tools like the # Microsoft HTML help workshop to generate a compressed HTML help file (.chm) # of the generated HTML documentation. GENERATE_HTMLHELP = NO # If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can # be used to specify the file name of the resulting .chm file. You # can add a path in front of the file if the result should not be # written to the html output directory. CHM_FILE = # If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can # be used to specify the location (absolute path including file name) of # the HTML help compiler (hhc.exe). If non-empty doxygen will try to run # the HTML help compiler on the generated index.hhp. HHC_LOCATION = # If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag # controls if a separate .chi index file is generated (YES) or that # it should be included in the master .chm file (NO). GENERATE_CHI = NO # If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag # controls whether a binary table of contents is generated (YES) or a # normal table of contents (NO) in the .chm file. BINARY_TOC = NO # The TOC_EXPAND flag can be set to YES to add extra items for group members # to the contents of the HTML help documentation and to the tree view. TOC_EXPAND = NO # The DISABLE_INDEX tag can be used to turn on/off the condensed index at # top of each HTML page. The value NO (the default) enables the index and # the value YES disables it. DISABLE_INDEX = NO # This tag can be used to set the number of enum values (range [1..20]) # that doxygen will group on one line in the generated HTML documentation. ENUM_VALUES_PER_LINE = 4 # If the GENERATE_TREEVIEW tag is set to YES, a side panel will be # generated containing a tree-like index structure (just like the one that # is generated for HTML Help). For this to work a browser that supports # JavaScript, DHTML, CSS and frames is required (for instance Mozilla 1.0+, # Netscape 6.0+, Internet explorer 5.0+, or Konqueror). Windows users are # probably better off using the HTML help feature. GENERATE_TREEVIEW = NO # If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be # used to set the initial width (in pixels) of the frame in which the tree # is shown. TREEVIEW_WIDTH = 250 #--------------------------------------------------------------------------- # configuration options related to the LaTeX output #--------------------------------------------------------------------------- # If the GENERATE_LATEX tag is set to YES (the default) Doxygen will # generate Latex output. GENERATE_LATEX = YES # The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `latex' will be used as the default path. LATEX_OUTPUT = latex # The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be # invoked. If left blank `latex' will be used as the default command name. LATEX_CMD_NAME = latex # The MAKEINDEX_CMD_NAME tag can be used to specify the command name to # generate index for LaTeX. If left blank `makeindex' will be used as the # default command name. MAKEINDEX_CMD_NAME = makeindex # If the COMPACT_LATEX tag is set to YES Doxygen generates more compact # LaTeX documents. This may be useful for small projects and may help to # save some trees in general. COMPACT_LATEX = NO # The PAPER_TYPE tag can be used to set the paper type that is used # by the printer. Possible values are: a4, a4wide, letter, legal and # executive. If left blank a4wide will be used. PAPER_TYPE = a4wide # The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX # packages that should be included in the LaTeX output. EXTRA_PACKAGES = # The LATEX_HEADER tag can be used to specify a personal LaTeX header for # the generated latex document. The header should contain everything until # the first chapter. If it is left blank doxygen will generate a # standard header. Notice: only use this tag if you know what you are doing! LATEX_HEADER = # If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated # is prepared for conversion to pdf (using ps2pdf). The pdf file will # contain links (just like the HTML output) instead of page references # This makes the output suitable for online browsing using a pdf viewer. PDF_HYPERLINKS = NO # If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of # plain latex in the generated Makefile. Set this option to YES to get a # higher quality PDF documentation. USE_PDFLATEX = NO # If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode. # command to the generated LaTeX files. This will instruct LaTeX to keep # running if errors occur, instead of asking the user for help. # This option is also used when generating formulas in HTML. LATEX_BATCHMODE = NO # If LATEX_HIDE_INDICES is set to YES then doxygen will not # include the index chapters (such as File Index, Compound Index, etc.) # in the output. LATEX_HIDE_INDICES = NO #--------------------------------------------------------------------------- # configuration options related to the RTF output #--------------------------------------------------------------------------- # If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output # The RTF output is optimized for Word 97 and may not look very pretty with # other RTF readers or editors. GENERATE_RTF = NO # The RTF_OUTPUT tag is used to specify where the RTF docs will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `rtf' will be used as the default path. RTF_OUTPUT = rtf # If the COMPACT_RTF tag is set to YES Doxygen generates more compact # RTF documents. This may be useful for small projects and may help to # save some trees in general. COMPACT_RTF = NO # If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated # will contain hyperlink fields. The RTF file will # contain links (just like the HTML output) instead of page references. # This makes the output suitable for online browsing using WORD or other # programs which support those fields. # Note: wordpad (write) and others do not support links. RTF_HYPERLINKS = NO # Load stylesheet definitions from file. Syntax is similar to doxygen's # config file, i.e. a series of assignments. You only have to provide # replacements, missing definitions are set to their default value. RTF_STYLESHEET_FILE = # Set optional variables used in the generation of an rtf document. # Syntax is similar to doxygen's config file. RTF_EXTENSIONS_FILE = #--------------------------------------------------------------------------- # configuration options related to the man page output #--------------------------------------------------------------------------- # If the GENERATE_MAN tag is set to YES (the default) Doxygen will # generate man pages GENERATE_MAN = NO # The MAN_OUTPUT tag is used to specify where the man pages will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `man' will be used as the default path. MAN_OUTPUT = man # The MAN_EXTENSION tag determines the extension that is added to # the generated man pages (default is the subroutine's section .3) MAN_EXTENSION = .3 # If the MAN_LINKS tag is set to YES and Doxygen generates man output, # then it will generate one additional man file for each entity # documented in the real man page(s). These additional files # only source the real man page, but without them the man command # would be unable to find the correct page. The default is NO. MAN_LINKS = NO #--------------------------------------------------------------------------- # configuration options related to the XML output #--------------------------------------------------------------------------- # If the GENERATE_XML tag is set to YES Doxygen will # generate an XML file that captures the structure of # the code including all documentation. GENERATE_XML = NO # The XML_OUTPUT tag is used to specify where the XML pages will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `xml' will be used as the default path. XML_OUTPUT = xml # The XML_SCHEMA tag can be used to specify an XML schema, # which can be used by a validating XML parser to check the # syntax of the XML files. XML_SCHEMA = # The XML_DTD tag can be used to specify an XML DTD, # which can be used by a validating XML parser to check the # syntax of the XML files. XML_DTD = # If the XML_PROGRAMLISTING tag is set to YES Doxygen will # dump the program listings (including syntax highlighting # and cross-referencing information) to the XML output. Note that # enabling this will significantly increase the size of the XML output. XML_PROGRAMLISTING = YES #--------------------------------------------------------------------------- # configuration options for the AutoGen Definitions output #--------------------------------------------------------------------------- # If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will # generate an AutoGen Definitions (see autogen.sf.net) file # that captures the structure of the code including all # documentation. Note that this feature is still experimental # and incomplete at the moment. GENERATE_AUTOGEN_DEF = NO #--------------------------------------------------------------------------- # configuration options related to the Perl module output #--------------------------------------------------------------------------- # If the GENERATE_PERLMOD tag is set to YES Doxygen will # generate a Perl module file that captures the structure of # the code including all documentation. Note that this # feature is still experimental and incomplete at the # moment. GENERATE_PERLMOD = NO # If the PERLMOD_LATEX tag is set to YES Doxygen will generate # the necessary Makefile rules, Perl scripts and LaTeX code to be able # to generate PDF and DVI output from the Perl module output. PERLMOD_LATEX = NO # If the PERLMOD_PRETTY tag is set to YES the Perl module output will be # nicely formatted so it can be parsed by a human reader. This is useful # if you want to understand what is going on. On the other hand, if this # tag is set to NO the size of the Perl module output will be much smaller # and Perl will parse it just the same. PERLMOD_PRETTY = YES # The names of the make variables in the generated doxyrules.make file # are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. # This is useful so different doxyrules.make files included by the same # Makefile don't overwrite each other's variables. PERLMOD_MAKEVAR_PREFIX = #--------------------------------------------------------------------------- # Configuration options related to the preprocessor #--------------------------------------------------------------------------- # If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will # evaluate all C-preprocessor directives found in the sources and include # files. ENABLE_PREPROCESSING = YES # If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro # names in the source code. If set to NO (the default) only conditional # compilation will be performed. Macro expansion can be done in a controlled # way by setting EXPAND_ONLY_PREDEF to YES. MACRO_EXPANSION = NO # If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES # then the macro expansion is limited to the macros specified with the # PREDEFINED and EXPAND_AS_PREDEFINED tags. EXPAND_ONLY_PREDEF = NO # If the SEARCH_INCLUDES tag is set to YES (the default) the includes files # in the INCLUDE_PATH (see below) will be search if a #include is found. SEARCH_INCLUDES = YES # The INCLUDE_PATH tag can be used to specify one or more directories that # contain include files that are not input files but should be processed by # the preprocessor. INCLUDE_PATH = # You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard # patterns (like *.h and *.hpp) to filter out the header-files in the # directories. If left blank, the patterns specified with FILE_PATTERNS will # be used. INCLUDE_FILE_PATTERNS = # The PREDEFINED tag can be used to specify one or more macro names that # are defined before the preprocessor is started (similar to the -D option of # gcc). The argument of the tag is a list of macros of the form: name # or name=definition (no spaces). If the definition and the = are # omitted =1 is assumed. PREDEFINED = # If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then # this tag can be used to specify a list of macro names that should be expanded. # The macro definition that is found in the sources will be used. # Use the PREDEFINED tag if you want to use a different macro definition. EXPAND_AS_DEFINED = # If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then # doxygen's preprocessor will remove all function-like macros that are alone # on a line, have an all uppercase name, and do not end with a semicolon. Such # function macros are typically used for boiler-plate code, and will confuse the # parser if not removed. SKIP_FUNCTION_MACROS = YES #--------------------------------------------------------------------------- # Configuration::additions related to external references #--------------------------------------------------------------------------- # The TAGFILES option can be used to specify one or more tagfiles. # Optionally an initial location of the external documentation # can be added for each tagfile. The format of a tag file without # this location is as follows: # TAGFILES = file1 file2 ... # Adding location for the tag files is done as follows: # TAGFILES = file1=loc1 "file2 = loc2" ... # where "loc1" and "loc2" can be relative or absolute paths or # URLs. If a location is present for each tag, the installdox tool # does not have to be run to correct the links. # Note that each tag file must have a unique name # (where the name does NOT include the path) # If a tag file is not located in the directory in which doxygen # is run, you must also specify the path to the tagfile here. TAGFILES = # When a file name is specified after GENERATE_TAGFILE, doxygen will create # a tag file that is based on the input files it reads. GENERATE_TAGFILE = # If the ALLEXTERNALS tag is set to YES all external classes will be listed # in the class index. If set to NO only the inherited external classes # will be listed. ALLEXTERNALS = NO # If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed # in the modules index. If set to NO, only the current project's groups will # be listed. EXTERNAL_GROUPS = YES # The PERL_PATH should be the absolute path and name of the perl script # interpreter (i.e. the result of `which perl'). PERL_PATH = /usr/bin/perl #--------------------------------------------------------------------------- # Configuration options related to the dot tool #--------------------------------------------------------------------------- # If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will # generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base or # super classes. Setting the tag to NO turns the diagrams off. Note that this # option is superseded by the HAVE_DOT option below. This is only a fallback. It is # recommended to install and use dot, since it yields more powerful graphs. CLASS_DIAGRAMS = YES # If set to YES, the inheritance and collaboration graphs will hide # inheritance and usage relations if the target is undocumented # or is not a class. HIDE_UNDOC_RELATIONS = YES # If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is # available from the path. This tool is part of Graphviz, a graph visualization # toolkit from AT&T and Lucent Bell Labs. The other options in this section # have no effect if this option is set to NO (the default) HAVE_DOT = NO # If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen # will generate a graph for each documented class showing the direct and # indirect inheritance relations. Setting this tag to YES will force the # the CLASS_DIAGRAMS tag to NO. CLASS_GRAPH = YES # If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen # will generate a graph for each documented class showing the direct and # indirect implementation dependencies (inheritance, containment, and # class references variables) of the class with other documented classes. COLLABORATION_GRAPH = YES # If the UML_LOOK tag is set to YES doxygen will generate inheritance and # collaboration diagrams in a style similar to the OMG's Unified Modeling # Language. UML_LOOK = NO # If set to YES, the inheritance and collaboration graphs will show the # relations between templates and their instances. TEMPLATE_RELATIONS = NO # If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT # tags are set to YES then doxygen will generate a graph for each documented # file showing the direct and indirect include dependencies of the file with # other documented files. INCLUDE_GRAPH = YES # If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and # HAVE_DOT tags are set to YES then doxygen will generate a graph for each # documented header file showing the documented files that directly or # indirectly include this file. INCLUDED_BY_GRAPH = YES # If the CALL_GRAPH and HAVE_DOT tags are set to YES then doxygen will # generate a call dependency graph for every global function or class method. # Note that enabling this option will significantly increase the time of a run. # So in most cases it will be better to enable call graphs for selected # functions only using the \callgraph command. CALL_GRAPH = NO # If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen # will graphical hierarchy of all classes instead of a textual one. GRAPHICAL_HIERARCHY = YES # The DOT_IMAGE_FORMAT tag can be used to set the image format of the images # generated by dot. Possible values are png, jpg, or gif # If left blank png will be used. DOT_IMAGE_FORMAT = png # The tag DOT_PATH can be used to specify the path where the dot tool can be # found. If left blank, it is assumed the dot tool can be found on the path. DOT_PATH = # The DOTFILE_DIRS tag can be used to specify one or more directories that # contain dot files that are included in the documentation (see the # \dotfile command). DOTFILE_DIRS = # The MAX_DOT_GRAPH_WIDTH tag can be used to set the maximum allowed width # (in pixels) of the graphs generated by dot. If a graph becomes larger than # this value, doxygen will try to truncate the graph, so that it fits within # the specified constraint. Beware that most browsers cannot cope with very # large images. MAX_DOT_GRAPH_WIDTH = 1024 # The MAX_DOT_GRAPH_HEIGHT tag can be used to set the maximum allows height # (in pixels) of the graphs generated by dot. If a graph becomes larger than # this value, doxygen will try to truncate the graph, so that it fits within # the specified constraint. Beware that most browsers cannot cope with very # large images. MAX_DOT_GRAPH_HEIGHT = 1024 # The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the # graphs generated by dot. A depth value of 3 means that only nodes reachable # from the root by following a path via at most 3 edges will be shown. Nodes that # lay further from the root node will be omitted. Note that setting this option to # 1 or 2 may greatly reduce the computation time needed for large code bases. Also # note that a graph may be further truncated if the graph's image dimensions are # not sufficient to fit the graph (see MAX_DOT_GRAPH_WIDTH and MAX_DOT_GRAPH_HEIGHT). # If 0 is used for the depth value (the default), the graph is not depth-constrained. MAX_DOT_GRAPH_DEPTH = 0 # If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will # generate a legend page explaining the meaning of the various boxes and # arrows in the dot generated graphs. GENERATE_LEGEND = YES # If the DOT_CLEANUP tag is set to YES (the default) Doxygen will # remove the intermediate dot files that are used to generate # the various graphs. DOT_CLEANUP = YES #--------------------------------------------------------------------------- # Configuration::additions related to the search engine #--------------------------------------------------------------------------- # The SEARCHENGINE tag specifies whether or not a search engine should be # used. If set to NO the values of all tags below this one will be ignored. SEARCHENGINE = NO ppc64-diag-2.6.4/rtas_errd/ela_msg.h0000644000000000000000000021451012313010662015621 0ustar rootroot/** * @file ela_msg.h * * Copyright (C) 2005 IBM Corporation */ #ifndef _H_RPA_ELA_MSG #define _H_RPA_ELA_MSG #define F_POWER_SUPPLY "Power Supply" #define MSGCPUB12b0 "CPU internal error" #define MSGCPUB12b5 "Time-out error waiting for I/O" #define MSGCPUALLZERO "An error has been detected by the CPU. The error " \ "log indicates the following physical FRU location(s) as the probable "\ "cause(s)." #define MSGMEMB12b0 "Uncorrectable Memory Error" #define MSGMEMB12b1 "ECC correctable error" #define MSGMEMB12b2 "Correctable error threshold exceeded" #define MSGMEMB12b5 "Memory Data error (Bad data going to memory)" #define MSGMEMB12b6 "Memory bus/switch internal error" #define MSGMEMB12b7 "Memory time-out error" #define MSGMEMB13b3 "I/O Host Bridge time-out error" #define MSGMEMB13b4 "I/O Host Bridge address/data parity error" #define MSGMEMALLZERO "An error has been detected by the memory controller. " \ "The error log indicates the following physical FRU location(s) as the " \ "probable cause(s)." #define MSGIOB12b0 "I/O Bus Address Parity Error" #define MSGIOB12b1 "I/O Bus Data Parity Error" #define MSGIOB12b4 "I/O Error on ISA bus" #define MSGIOB12b5 "Intermediate or System Bus Address Parity Error" #define MSGIOB12b6 "Intermediate or System Bus Data Parity Error" #define MSGIOB12b7 "Intermediate or System Bus Time-out Error" #define MSGIOALLZERO "An error has been detected by the I/O. The error " \ "log indicates the following physical FRU location(s) as the probable " \ "cause(s)." #define MSGSPB16b0 "Time-out on communication response from Service Processor" #define MSGSPB16b1 "I/O general bus error" #define MSGSPB16b2 "Secondary I/O general bus error" #define MSGSPB16b3 "Internal Service Processor memory error" #define MSGSPB16b4 "Service Processor error accessing special registers" #define MSGSPB16b5 "Service Processor reports unknown communication error" #define MSGSPB16b7 "Other internal Service Processor hardware error" #define MSGSPB17b0 "Service Processor error accessing Vital Product Data EEPROM" #define MSGSPB17b1 "Service Processor error accessing Operator Panel" #define MSGSPB17b2 "Service Processor error accessing Power Controller" #define MSGSPB17b3 "Service Processor error accessing Fan Sensor" #define MSGSPB17b4 "Service Processor error accessing Thermal Sensor" #define MSGSPB17b5 "Service Processor error accessing Voltage Sensor" #define MSGSPB18b0 "Service Processor error accessing serial port" #define MSGSPB18b2 "Service Processor error accessing " \ "Real-Time Clock/Time-of-day clock" #define MSGSPB18b4 "Service Processor detects loss of voltage from the battery" #define MSGXEPOW1n11 "Fan is turning slower than expected" #define MSGXEPOW1n64 "Fan stop was detected" #define MSGXEPOW2n32 "Over voltage condition was detected" #define MSGXEPOW2n52 "Under voltage condition was detected" #define MSGXEPOW3n21 "Over temperature condition was detected" #define MSGXEPOW3n73 "System shutdown due to over maximum temperature condition" #define MSGEPOWB1505 "System shutdown due to: 1) Loss of AC power,\n " \ "2) Power button was pushed without proper system\n" \ "shutdown, 3) Power supply failure." #define MSG_UNSUPPORTED_MEM "Uncorrectable memory or unsupported memory" #define MSG_MISSING_MEM "Missing or bad memory" #define MSG_BAD_L2 "Bad L2 Cache" #define MSG_MISSING_L2 "Missing L2 cache" #define MSGMENUG102 "651102 "\ "A non-critical system cooling problem has been detected.\n" \ "The system temperature appears to be above the expected range.\n"\ "Check for elevated room temperatures, restricted air flow\n"\ "around the system or any system covers that are opened.\n"\ "If no problem is found, contact your service provider." #define MSGIOB13b4 "I/O Expansion Bus Parity Error." #define MSGIOB13b5 "I/O Expansion Bus Time-out Error." #define MSGIOB13b6 "I/O Expansion Bus Connection Failure." #define MSGIOB13b7 "I/O Expansion Unit not in an operating state." #define MSGEPOWPCI111 "System shutdown due to loss of AC Power to the site." #define MSGEPOWPCI100 "CEC Rack shutdown due to: 1) Loss of AC power " \ "to the CEC Rack,\n" \ "2) Open or disconnected SPCN cable between racks\n" \ "3) AC module, Bulk power, regulator or SPCN card failure." #define MSGEPOWPCI011 "I/O Rack shutdown due to: 1) Loss of AC power " \ "to the I/O Rack,\n" \ "2) Open or disconnected SPCN cable between racks,\n" \ "3) Power supply failure." #define MSGEPOWPCI001 "Power fault due to internal power supply failure." #define MSGEPOWPCI010 "Power fault due to internal power supply failure." #define MSGEPOWB16b1B17b3 "Power fault due to manual activation of " \ "power-off op-panel request." #define MSGEPOWB16b23 "System shutdown due to over temperature condition " \ "and fan failure. Use the physical FRU location(s) as the probable " \ "cause(s)." #define MSGEPOW1502B16b4 "Non-critical power problem, loss of redundant " \ "power supply. Use the physical FRU location(s) as the probable cause(s)." #define MSGEPOW1501B16b4 "Non-critical cooling problem, loss of redundant " \ "fan. Use the physical FRU location(s) as the probable cause(s)." #define MSGCRIT_FAN "Sensor indicates a fan has failed." #define MSGCRIT_VOLT "Sensor indicates a voltage is outside the normal range." #define MSGCRIT_THERM "Sensor indicates an abnormally high internal temperature." #define MSGCRIT_POWER "Sensor indicates a power supply has failed." #define MSGCRIT_UNK "Sensor indicates a FRU has failed." #define MSGWARN_FAN "Sensor indicates a fan is turning too slowly." #define MSGRED_FAN "Sensor detected a redundant fan failure." #define MSGRED_POWER "Sensor detected a redundant power supply failure." #define MSGRED_UNK "Sensor detected a redundant FRU failure." #define F_EPOW_ONE "%1$s %2$d" #define F_VOLT_SEN_2 "Volt Sensor" #define F_THERM_SEN "Temp sensor" #define F_POW_SEN "PS sensor" #define MSGREFCODE_CUST "" \ "The CEC or SPCN reported an error. Report the SRN and the following reference and physical location codes to your service provider." #define DEFER_MSGREFCODE_CUST ""\ "The CEC or SPCN reported a non-critical error. Report the SRN and the following reference and physical location codes to your service provider." #define MSGMENUG150 "651150 ANALYZING SYSTEM ERROR LOG\n" \ "A loss of power was detected by one or more\n" \ "devices with the following physical location codes:\n\n" \ "%s\n\n" \ "Check for the following:\n" \ " 1. Loose or disconnected power source connections.\n" \ " 2. Loss of site power.\n" \ " 3. For multiple enclosure systems, loose or\n" \ " disconnected power and signal connections\n" \ " between enclosures.\n\n" \ "If the cause cannot be determined from the list above,\n" \ "then replace the FRUs identified by the physical\n" \ "locations given above. Refer to the System Service Guide." #define MSGMENUG151 "651151 ANALYZING SYSTEM ERROR LOG\n "\ "A loss of power was detected.\n\n" \ "Check for the following:\n" \ " 1. Loose or disconnected power source connections.\n" \ " 2. Loss of site power.\n" \ " 3. For multiple enclosure systems, loose or\n" \ " disconnected power and/or signal connections\n" \ " between enclosures." #define MSGMENUG152 "651152 ANALYZING SYSTEM ERROR LOG\n" \ "Environmental sensor analysis is reporting an unknown\n" \ "status, with the following physical location codes.\n\n%s\n\n" \ "Run the Display System Environmental Sensors Service Aid." #define MSGMENUG153 "651153 ANALYZING SYSTEM ERROR LOG\n" \ "Environmental sensor analysis is reporting an unknown\n" \ "status. Run the Display System Environmental Sensors Service Aid." #define MSGMENUG156 "651156 ANALYZING SYSTEM ERROR LOG\n" \ "A non-critical environmental and power warning was logged.\n" \ "The following physical location codes were reported:\n\n%s" #define MSGMENUG157 "651157 ANALYZING SYSTEM ERROR LOG\n" \ "A non-critical environmental and power warning was logged." #define MSGMENUG158 "651158 ANALYZING SYSTEM ERROR LOG\n "\ "A critical environmental and power warning was logged.\n" \ "The following physical location codes were reported:\n" \ "\n%s\n\n%s\n\nThe system will shutdown in 10 minutes." #define MSGMENUG159 "651159 ANALYZING SYSTEM ERROR LOG\n" \ "A critical environmental and power warning was logged.\n" \ "\n%s\n\nThe system will shutdown in 10 minutes." #define MSGMENUG160 "651160 ANALYZING SYSTEM ERROR LOG\n" \ "A system shutdown occured due to a critical \n" \ "environmental and power warning.\n" \ "The following physical location codes were reported:\n\n%s" #define MSGMENUG161 "651161 ANALYZING SYSTEM ERROR LOG\n" \ "A system shutdown occured due to a critical \n" \ "environmental and power warning." #define MSGEPOWB17b0C12 "Power fault due to unspecified cause." #define MSGEPOWB17b0C37 "System shutdown due to power fault with unspecified cause." #define MSGEPOWB16b2C12 "Fan failure. Use the physical FRU location(s) as the probable cause(s)." #define MSGEPOWB16b2C37 "System shutdown due to fan failure. Use the physical FRU location(s) as the probable cause(s)." #define MSGEPOWB17b2RED "Power fault due to internal redundant power supply failure." #define MSG_OP_PANEL_FAIL "Display character test failed." #define F_OP_PANEL "character display logic" #define MSGMENUG162 "651162 ANALYZING SYSTEM ERROR LOG\n" \ "An error was logged on %s" \ "that indicates the Power-off button was pressed \n" \ "without performing a proper shutdown.\n" \ "To remove this error from the error log, execute\n" \ "the following command from the command line.\n\n" \ " errclear -l %d 0" #define DEFER_MSG_UNSUPPORTED_MEM ""\ "A non-critical error has been detected: "\ "Uncorrectable memory or unsupported memory." #define DEFER_MSGCPUB12b0 "A non-critical error has been detected: "\ "CPU internal error." #define DEFER_MSGMEMB12b0 "A non-critical error has been detected: "\ "Uncorrectable Memory Error." #define DEFER_MSGMEMB12b1 "A non-critical error has been detected: "\ "ECC correctable error." #define DEFER_MSGMEMB12b2 "A non-critical error has been detected: "\ "Correctable error threshold exceeded." #define DEFER_MSGIOB13b4 "A non-critical error has been detected: "\ "I/O Expansion Bus Parity Error." #define DEFER_MSGIOB13b5 "A non-critical error has been detected: "\ "I/O Expansion Bus Time-out Error." #define DEFER_MSGIOB13b6 "A non-critical error has been detected: "\ "I/O Expansion Bus Connection Failure." #define DEFER_MSGIOB13b7 "A non-critical error has been detected: "\ "I/O Expansion Unit not in an operating state." #define DEFER_MSGIOB12b5 "A non-critical error has been detected: "\ "Intermediate or System Bus Address Parity Error." #define DEFER_MSGIOB12b6 "A non-critical error has been detected: "\ "Intermediate or System Bus Data Parity Error." #define DEFER_MSGIOB12b7 "A non-critical error has been detected: "\ "Intermediate or System Bus Time-out Error." #define MSGPOSTALL "Refer to the Error Code to FRU Index in the system service guide." #define MSGCPUB12b1 "CPU internal cache or cache controller error" #define DEFER_MSGCPUB12b1 "A non-critical error has been detected: "\ "CPU internal cache or cache controller error." #define MSGCPUB12b2 "External cache parity or multi-bit ECC error" #define DEFER_MSGCPUB12b2 "A non-critical error has been detected: "\ "External cache parity or multi-bit ECC error." #define MSGCPUB12b3 "External cache ECC single-bit error" #define DEFER_MSGCPUB12b3 "A non-critical error has been detected: "\ "External cache ECC single-bit error." #define MSGIOB12b3 "I/O bridge/device internal error" #define DEFER_MSGIOB12b3 "A non-critical error has been detected: "\ "I/O bridge/device internal error" #define MSG_PLATFORM_ERROR "Platform specific error. Refer to the System " \ "Service Guide for this system unit." #define DEFER_MSGALLZERO "A non-critical error has been detected. The error " \ "log indicates the following physical FRU location(s) as the probable " \ "cause(s)." #define MSGCPUB12b4 "System bus time-out error" #define DEFER_MSGCPUB12b4 "A non-critical error has been detected: " \ "System bus time-out error." #define DEFER_MSGCPUB12b5 "A non-critical error has been detected: " \ "Time-out error waiting for I/O." #define MSGCPUB12b6 "System bus parity error" #define DEFER_MSGCPUB12b6 "A non-critical error has been detected: "\ "System bus parity error." #define MSGCPUB12b7 "System bus protocol/transfer error" #define DEFER_MSGCPUB12b7 "A non-critical error has been detected: "\ "System bus protocol/transfer error." #define MSGMEMB12b3 "Memory Controller subsystem internal error" #define DEFER_MSGMEMB12b3 "A non-critical error has been detected: "\ "Memory Controller subsystem internal error." #define MSGMEMB12b4 "Memory Address Error (Invalid address or access attempt)" #define DEFER_MSGMEMB12b4 "A non-critical error has been detected: " \ "Memory Address (Bad address going to memory)." #define DEFER_MSGMEMB12b5 "A non-critical error has been detected: "\ "Memory Data error (Bad data going to memory)." #define DEFER_MSGMEMB12b6 "A non-critical error has been detected: "\ "Memory bus/switch internal error." #define DEFER_MSGMEMB12b7 "A non-critical error has been detected: "\ "Memory time-out error." #define MSGMEMB13b0 "System bus parity error" #define DEFER_MSGMEMB13b0 "A non-critical error has been detected: "\ "System bus parity error." #define MSGMEMB13b1 "System bus time-out error" #define DEFER_MSGMEMB13b1 "A non-critical error has been detected: " \ "System bus time-out error." #define MSGMEMB13b2 "System bus protocol/transfer error" #define DEFER_MSGMEMB13b2 "A non-critical error has been detected: " \ "System bus protocol/transfer error." #define DEFER_MSGMEMB13b3 "A non-critical error has been detected: " \ "I/O Host Bridge time-out error." #define DEFER_MSGMEMB13b4 "A non-critical error has been detected: "\ "I/O Host Bridge address/data parity error." #define MSGMEMB13b6 "System support function error." #define DEFER_MSGMEMB13b6 "A non-critical error has been detected: "\ "System support function error." #define MSGMEMB13b7 "System bus internal hardware/switch error." #define DEFER_MSGMEMB13b7 "A non-critical error has been detected: "\ "System bus internal hardware/switch error." #define DEFER_MSGIOB12b0 "A non-critical error has been detected: "\ "I/O Bus Address Parity Error" #define DEFER_MSGIOB12b1 "A non-critical error has been detected: "\ "I/O Bus Data Parity Error" #define MSGIOB12b2 "I/O bus time-out, access, or other error" #define DEFER_MSGIOB12b2 "A non-critical error has been detected: " \ "I/O Bus time-out, access or other error" #define DEFER_MSGIOB12b4 "A non-critical error has been detected: "\ "I/O Error on ISA bus" #define MSG_UNKNOWN_V3 "Error log analysis is unable to determine the " \ "error. The error log indicates the following physical FRU location(s) " \ "as the probable cause(s)." #define MSGCRIT_FAN_SHUT "System shutdown due to a fan failure." #define MSGCRIT_VOLT_SHUT "System shutdown due to voltage outside the " \ "normal range." #define MSGCRIT_THERM_SHUT "System shutdown due to an abnormally high " \ "internal temperature." #define MSGCRIT_POWER_SHUT "System shutdown due to a power supply failure." #define MSGSPB19b0 "Power Control Network general connection failure." #define DEFER_MSGSPB19b0 "A non-critical error has been detected: "\ "Power Control Network general connection failure." #define MSGSPB19b1 "Power Control Network node failure." #define DEFER_MSGSPB19b1 "A non-critical error has been detected: "\ "Power Control Network node failure." #define MSGSPB19b4 "Service Processor error accessing Power Control Network." #define DEFER_MSGSPB19b4 "A non-critical error has been detected: "\ "Service Processor error accessing Power Control Network." #define MSGRESERVED "Error with reserved description." #define DEFER_MSGRESERVED "A non-critical error has been detected: "\ "Error with reserved description." #define MSGCRIT_UNK_SHUT "System shutdown due to FRU that has failed." #define MSGIOB12b5B13b3 "System bus address parity error" #define DEFER_MSGIOB12b5B13b3 "A non-critical error has been detected: " \ "System bus address parity error" #define MSGIOB12b6B13b3 "System bus data parity error" #define DEFER_MSGIOB12b6B13b3 "A non-critical error has been detected: " \ "System bus data parity error" #define MSGIOB12b7B13b3 "System bus time-out error" #define DEFER_MSGIOB12b7B13b3 "A non-critical error has been detected: " \ "System bus time-out error" #define MSGIOB13b3 "Error on system bus" #define DEFER_MSGIOB13b3 "A non-critical error has been detected: "\ "Error on system bus" #define MSGEPOWALLZERO "An environmental and power warning has been detected. "\ "The error log indicates the following physical FRU location(s) as the " \ "probable cause(s)." #define MSGEPOWB16b2 "Fan failure" #define MSGEPOWB17b2C12 "Internal power supply failure" #define MSGEPOWB17b2C37 "System shutdown due to internal power supply failure" #define MSGEPOWB16b3 "Over temperature condition" #define MSGEPOWB16b2b3 "Over temperature and fan failure" #define MSGSPALLZERO "An error has been detected by the Service Processor. " \ "The error log indicates the following physical FRU location(s) as the " \ "probable cause(s)." #define DEFER_MSGSPB16b0 "A non-critical error has been detected: " \ "Time-out on communication response from Service Processor" #define DEFER_MSGSPB16b1 "A non-critical error has been detected: " \ "I/O general bus error" #define DEFER_MSGSPB16b2 "A non-critical error has been detected: " \ "Secondary I/O general bus error" #define DEFER_MSGSPB16b3 "A non-critical error has been detected: " \ "internal Service Processor memory error" #define DEFER_MSGSPB16b4 "A non-critical error has been detected: " \ "Service Processor error accessing special registers" #define DEFER_MSGSPB16b5 "A non-critical error has been detected: " \ "Service Processor reports unknown communication error" #define DEFER_MSGSPB16b7 "A non-critical error has been detected: " \ "Other internal Service Processor hardware error" #define DEFER_MSGSPB17b0 "A non-critical error has been detected: " \ "Service Processor error accessing Vital Product Data EEPROM" #define DEFER_MSGSPB17b1 "A non-critical error has been detected: " \ "Service Processor error accessing Operator Panel" #define DEFER_MSGSPB17b2 "A non-critical error has been detected: " \ "Service Processor error accessing Power Controller" #define DEFER_MSGSPB17b3 "A non-critical error has been detected: " \ "Service Processor error accessing Fan Sensor" #define DEFER_MSGSPB17b4 "A non-critical error has been detected: " \ "Service Processor error accessing Thermal Sensor" #define DEFER_MSGSPB17b5 "A non-critical error has been detected: " \ "Service Processor error accessing Voltage Sensor" #define DEFER_MSGSPB18b0 "A non-critical error has been detected: " \ "Service Processor error accessing serial port" #define MSGSPB18b1 "Service Processor detected NVRAM error" #define DEFER_MSGSPB18b1 "A non-critical error has been detected: " \ "Service Processor detected NVRAM error" #define DEFER_MSGSPB18b2 "A non-critical error has been detected: " \ "Service Processor error accessing Real-Time Clock/Time-of-day clock" #define DEFER_MSGSPB18b4 "A non-critical error has been detected: " \ "Service Processor detects loss of voltage from the battery" #define MSGSPB18b7 "Service Processor detected a surveillance time-out" #define DEFER_MSGSPB18b7 "A non-critical error has been detected: " \ "Service Processor detected a surveillance time-out" #define MSGMENUG171 "651171 ANALYZING SYSTEM ERROR LOG\n" \ "A problem was logged that could be either hardware, software\n" \ "or firmware. If new software or firmware has been recently\n" \ "installed, check if there are any known problems. To further\n" \ "analyze the problem, enter the following command from the\n" \ "command line.\n\n" \ " diag -ed sysplanar0" #define PREDICT_UNRECOV "Recoverable errors on resource indicate trend " \ "toward unrecoverable error. However the resource could not be " \ "deconfigured and is still in use." #define FAIL_BY_PLATFORM "Resource was marked failed by the platform. "\ "System is operating in degraded mode." #define MSGMEMB12b4B13b3 "I/O Host Bridge Time-out caused by software" #define MSGMENUG174 "651174 ANALYZING SYSTEM ERROR LOG\n" \ "Error log analysis indicates an I/O Host Bridge time-out\n" \ "that was caused by software. This error is caused by an\n" \ "attempt to access an invalid I/O device address. Contact\n" \ "the software support structure for assistance if needed.\n" #define MSGMENUG175 "651175 ANALYZING SYSTEM ERROR LOG\n" \ "Error log analysis indicates a power fault that was\n" \ "caused by either using the Power-off button without \n" \ "performing a proper shutdown, or a loss of power to \nthe system.\n" #define MSGSPB16b6 "Internal Service Processor firmware error or incorrect " \ "version" #define DEFER_MSGSPB16b6 "A non-critical error has been detected: "\ "Internal Service Processor firmware error or incorrect version" #define MSGSPB18b3 "Service Processor error accessing Scan controller/hardware" #define DEFER_MSGSPB18b3 "A non-critical error has been detected: "\ "Service Processor error accessing Scan controller/hardware" #define MSGSPB18b6 "Loss of heart beat from Service Processor" #define DEFER_MSGSPB18b6 "A non-critical error has been detected: " \ "Loss of heart beat from Service Processor" #define MSGSPB19b5 "Non-supported hardware" #define DEFER_MSGSPB19b5 "A non-critical error has been detected: "\ "Non-supported hardware" #define MSGSPB19b6 "Error detected while handling an attention/interrupt " \ "from the system hardware" #define DEFER_MSGSPB19b6 "A non-critical error has been detected: " \ "Error detected while handling an attention/interrupt from the " \ "system hardware" #define MSGSPB28b1 "Wire Test Error" #define DEFER_MSGSPB28b1 "A non-critical error has been detected: "\ "Wire Test Error" #define MSGSPB28b2 "Mainstore or Cache IPL Diagnositc Error" #define DEFER_MSGSPB28b2 "A non-critical error has been detected: " \ "Mainstore or Cache IPL Diagnositc Error" #define MSGSPB28b3 "Other IPL Diagnostic Error" #define DEFER_MSGSPB28b3 "A non-critical error has been detected: "\ "Other IPL Diagnostic Error" #define MSGSPB28b4 "Clock or PLL Error" #define DEFER_MSGSPB28b4 "A non-critical error has been detected: "\ "Clock or PLL Error" #define MSGSPB28b5 "Hardware Scan or Initialization Error" #define DEFER_MSGSPB28b5 "A non-critical error has been detected: "\ "Hardware Scan or Initialization Error" #define MSGSPB28b6 "Chip ID Verification Error" #define DEFER_MSGSPB28b6 "A non-critical error has been detected: " \ "Chip ID Verification Error" #define MSGSPB28b7 "FRU Presence/Detect Error (Mis-Plugged)" #define DEFER_MSGSPB28b7 "A non-critical error has been detected: " \ "FRU Presence/Detect Error (Mis-Plugged)" #define MSGEPOWB16b1B17b4 "Power fault specifically due to internal " \ "battery failure" #define MSGMENUG202 "651202 ANALYZING SYSTEM ERROR LOG\n" \ "An environmental problem has been corrected and is \n" \ "no longer a problem. The problem that was corrected \n" \ "can be viewed by using the command:\n" \ "\t errpt -a -l %d" #define MSGMENUG203 "651203 ANALYZING SYSTEM ERROR LOG\n" \ "An environmental problem has been corrected and is no longer a problem." #define MSGMENUG204 "651204 ANALYZING SYSTEM ERROR LOG\n" \ "A loss of redundancy on input power was detected.\n\n" \ "Check for the following:\n" \ " 1. Loose or disconnected power source connections.\n" \ " 2. Loss of the power source.\n" \ " 3. For multiple enclosure systems, loose or\n" \ " disconnected power and/or signal connections\n" \ " between enclosures." #define MSGSPB28b0 "Array or Logic Built in Self Test Error" #define DEFER_MSGSPB28b0 "A non-critical error has been detected: " \ "Array or Logic Built in Self Test Error" #define PREDICT_REPAIR_PENDING "Recoverable errors on a resource indicate " \ "a potential for an unrecoverable error. The resource cannot be " \ "deconfigured and is still in use. The problem may be corrected by "\ "array bit steering. Use map 0235." #define MSGMENUG205 "651205 ANALYZING SYSTEM ERROR LOG\n" \ "The system lost input power.\n\n" \ "If the system has battery backup and input power is\n" \ "not restored, then the system will lose all power in\n" \ "a few minutes. Take the necessary precautions with\n" \ "running applications for a system shut down due to\n" \ "loss of power.\n\n" \ "If the system does not have battery backup, then this\n" \ "message is displayed after power has already been\n" \ "restored and your system rebooted successfully.\n\n" \ "Check the following for the cause of lost input power:\n" \ " 1. Loose or disconnected power source connections.\n" \ " 2. Loss of site power.\n" \ " 3. For multiple enclosure systems, loose or\n" \ " disconnected power and/or signal connections\n "\ " between enclosures." #define MSG_BYPASS "The following resource is unavailable due to an error. "\ "System is operating in degraded mode." #define MSGMENUG_REFC "\n\nSupporting data:\nRef. Code:\t%X" #define MSGMENUG_LOC "\nLocation Codes:\t%s" #define MSGMENUG206 "651206 ANALYZING SYSTEM ERROR LOG\n" \ "The system shutdown because the battery backup\n" \ "lost power. The system was running on battery\n" \ "backup because of loss of input power." #define MSGMENUGPEL_ERROR "651300 ANALYZING SYSTEM ERROR LOG\n" \ "\nThe platform reports the following error:\n\n" #define MSGMENUG_SRC "\n\nSupporting data:\n\nSRC: %s\n" #define MSGMENUG_PRIORITY "Priority: %c %s\n" #define MSGMENUG_FRU "FRU: %s" #define MSGMENUG_EXT_FRU "External FRU: %s" #define MSGMENUG_CODEFRU "Code FRU Procedure: %s" #define MSGMENUG_EXT_CODEFRU "External Code FRU Procedure: %s" #define MSGMENUG_TOOL_FRU "Tool FRU: %s" #define MSGMENUG_SYM_FRU "Symbolic FRU Id: %s" #define MSGMENUG_CFG "Configuration Procedure Id: %s" #define MSGMENUG_MAINT "Maintenance Procedure Id: %s" #define MSGMENUG_RESERVED "Reserved FRU Type: %s" #define MSGMENUG_SERIAL " Serial Number: %s" #define MSGMENUG_CCIN " CCIN: %s" #define MSGMENUG_LOCATION "\nLocation: %s\n" #define MSGMENUGPEL_EVENT "651301 ANALYZING PLATFORM EVENT\n\n" #define V6_INVALID_SUBID "Invalid subsystem ID, cannot determine message." #define V6_RESERVED_SUBID "Reserved subsystem ID, cannot determine message." #define V6_ER_10_00 "Processor subsystem including internal cache " \ "Informational (non-error) Event. Refer to the system service " \ "documentation for more information." #define V6_ER_10_10 "Processor subsystem including internal cache " \ "Recovered Error, general. Refer to the system service documentation " \ "for more information." #define V6_ER_10_20 "Processor subsystem including internal cache " \ "Predictive Error, general. Refer to the system service documentation " \ "for more information." #define V6_ER_10_21 "Processor subsystem including internal cache " \ "Predictive Error, degraded performance. Refer to the system service " \ "documentation for more information." #define V6_ER_10_22 "Processor subsystem including internal cache " \ "Predictive Error, fault may be corrected after platform re-IPL. "\ "Refer to the system service documentation for more information." #define V6_ER_10_23 "Processor subsystem including internal cache " \ "Predictive Error, fault may be corrected after IPL, degraded " \ "performance. Refer to the system service documentation for more " \ "information." #define V6_ER_10_24 "Processor subsystem including internal cache " \ "Predictive Error, loss of redundancy. Refer to the system service " \ "documentation for more information." #define V6_ER_10_40 "Processor subsystem including internal cache " \ "Unrecovered Error, general. Refer to the system service documentation " \ "for more information." #define V6_ER_10_41 "Processor subsystem including internal cache " \ "Unrecovered Error, bypassed with degraded performance. " \ "Refer to the system service documentation for more information." #define V6_ER_10_44 "Processor subsystem including internal cache " \ "Unrecovered Error, bypassed with loss of redundancy. "\ "Refer to the system service documentation for more information." #define V6_ER_10_45 "Processor subsystem including internal cache " \ "Unrecovered Error, bypassed with loss of redundancy and performance. "\ "Refer to the system service documentation for more information." #define V6_ER_10_48 "Processor subsystem including internal cache " \ "Unrecovered Error, bypassed with loss of function. Refer to the " \ "system service documentation for more information." #define V6_ER_10_60 "Processor subsystem including internal cache " \ "Error on diagnostic test, general. Refer to the system service " \ "documentation for more information." #define V6_ER_10_61 "Processor subsystem including internal cache " \ "Error on diagnostic test, resource may produce incorrect result. "\ "Refer to the system service documentation for more information." #define V6_ER_20_00 "Memory subsystem including external cache " \ "Informational (non-error) Event. "\ "Refer to the system service documentation for more information." #define V6_ER_20_10 "Memory subsystem including external cache " \ "Recovered Error, general. "\ "Refer to the system service documentation for more information." #define V6_ER_20_20 "Memory subsystem including external cache " \ "Predictive Error, general. " \ "Refer to the system service documentation for more information." #define V6_ER_20_21 "Memory subsystem including external cache " \ "Predictive Error, degraded performance. "\ "Refer to the system service documentation for more information." #define V6_ER_20_22 "Memory subsystem including external cache " \ "Predictive Error, fault may be corrected after platform re-IPL. "\ "Refer to the system service documentation for more information." #define V6_ER_20_23 "Memory subsystem including external cache " \ "Predictive Error, fault may be corrected after IPL, degraded " \ "performance. Refer to the system service documentation for more " \ "information." #define V6_ER_20_24 "Memory subsystem including external cache " \ "Predictive Error, loss of redundancy. "\ "Refer to the system service documentation for more information." #define V6_ER_20_40 "Memory subsystem including external cache " \ "Unrecovered Error, general. "\ "Refer to the system service documentation for more information." #define V6_ER_20_41 "Memory subsystem including external cache " \ "Unrecovered Error, bypassed with degraded performance. " \ "Refer to the system service documentation for more information." #define V6_ER_20_44 "Memory subsystem including external cache " \ "Unrecovered Error, bypassed with loss of redundancy. " \ "Refer to the system service documentation for more information." #define V6_ER_20_45 "Memory subsystem including external cache " \ "Unrecovered Error, bypassed with loss of redundancy and performance. " \ "Refer to the system service documentation for more information." #define V6_ER_20_48 "Memory subsystem including external cache " \ "Unrecovered Error, bypassed with loss of function. " \ "Refer to the system service documentation for more information." #define V6_ER_20_60 "Memory subsystem including external cache " \ "Error on diagnostic test, general. " \ "Refer to the system service documentation for more information." #define V6_ER_20_61 "Memory subsystem including external cache Error on " \ "diagnostic test, resource may produce incorrect result. "\ "Refer to the system service documentation for more information." #define V6_ER_30_00 "I/O subsystem (hub, bridge, bus) Informational " \ "(non-error) Event. " \ "Refer to the system service documentation for more information." #define V6_ER_30_10 "I/O subsystem (hub, bridge, bus) Recovered " \ "Error, general. " \ "Refer to the system service documentation for more information." #define V6_ER_30_20 "I/O subsystem (hub, bridge, bus) Predictive " \ "Error, general. " \ "Refer to the system service documentation for more information." #define V6_ER_30_21 "I/O subsystem (hub, bridge, bus) Predictive Error, " \ "degraded performance. " \ "Refer to the system service documentation for more information." #define V6_ER_30_22 "I/O subsystem (hub, bridge, bus) Predictive Error, " \ "fault may be corrected after platform re-IPL. " \ "Refer to the system service documentation for more information." #define V6_ER_30_23 "I/O subsystem (hub, bridge, bus) Predictive Error, " \ "fault may be corrected after IPL, degraded performance. "\ "Refer to the system service documentation for more information." #define V6_ER_30_24 "I/O subsystem (hub, bridge, bus) Predictive Error, " \ "loss of redundancy. " \ "Refer to the system service documentation for more information." #define V6_ER_30_40 "I/O subsystem (hub, bridge, bus) Unrecovered Error, " \ "general. " \ "Refer to the system service documentation for more information." #define V6_ER_30_41 "I/O subsystem (hub, bridge, bus) Unrecovered Error, " \ "bypassed with degraded performance. " \ "Refer to the system service documentation for more information." #define V6_ER_30_44 "I/O subsystem (hub, bridge, bus) Unrecovered Error, " \ "bypassed with loss of redundancy. "\ "Refer to the system service documentation for more information." #define V6_ER_30_45 "I/O subsystem (hub, bridge, bus) Unrecovered Error, " \ "bypassed with loss of redundancy and performance. " \ "Refer to the system service documentation for more information." #define V6_ER_30_48 "I/O subsystem (hub, bridge, bus) Unrecovered Error, " \ "bypassed with loss of function. " \ "Refer to the system service documentation for more information." #define V6_ER_30_60 "I/O subsystem (hub, bridge, bus) Error on " \ "diagnostic test, general. " \ "Refer to the system service documentation for more information." #define V6_ER_30_61 "I/O subsystem (hub, bridge, bus) Error on " \ "diagnostic test, resource may produce incorrect result. " \ "Refer to the system service documentation for more information." #define V6_ER_40_00 "I/O adapter, device and peripheral Informational " \ "(non-error) Event. " \ "Refer to the system service documentation for more information." #define V6_ER_40_10 "I/O adapter, device and peripheral Recovered Error, " \ "general. "\ "Refer to the system service documentation for more information." #define V6_ER_40_20 "I/O adapter, device and peripheral Predictive Error, " \ "general. "\ "Refer to the system service documentation for more information." #define V6_ER_40_21 "I/O adapter, device and peripheral Predictive Error, " \ "degraded performance. " \ "Refer to the system service documentation for more information." #define V6_ER_40_22 "I/O adapter, device and peripheral Predictive Error, " \ "fault may be corrected after platform re-IPL. "\ "Refer to the system service documentation for more information." #define V6_ER_40_23 "I/O adapter, device and peripheral Predictive Error, " \ "fault may be corrected after IPL, degraded performance. " \ "Refer to the system service documentation for more information." #define V6_ER_40_24 "I/O adapter, device and peripheral Predictive Error, " \ "loss of redundancy. "\ "Refer to the system service documentation for more information." #define V6_ER_40_40 "I/O adapter, device and peripheral Unrecovered Error, " \ "general. "\ "Refer to the system service documentation for more information." #define V6_ER_40_41 "I/O adapter, device and peripheral Unrecovered Error, " \ "bypassed with degraded performance. "\ "Refer to the system service documentation for more information." #define V6_ER_40_44 "I/O adapter, device and peripheral Unrecovered Error, " \ "bypassed with loss of redundancy. "\ "Refer to the system service documentation for more information." #define V6_ER_40_45 "I/O adapter, device and peripheral Unrecovered Error, " \ "bypassed with loss of redundancy and performance. " \ "Refer to the system service documentation for more information." #define V6_ER_40_48 "I/O adapter, device and peripheral Unrecovered Error, " \ "bypassed with loss of function. " \ "Refer to the system service documentation for more information." #define V6_ER_40_60 "I/O adapter, device and peripheral Error on diagnostic " \ "test, general. "\ "Refer to the system service documentation for more information." #define V6_ER_40_61 "I/O adapter, device and peripheral Error on diagnostic " \ "test, resource may produce incorrect result. " \ "Refer to the system service documentation for more information." #define V6_ER_50_00 "CEC hardware Informational (non-error) Event. "\ "Refer to the system service documentation for more information." #define V6_ER_50_10 "CEC hardware Recovered Error, general. " \ "Refer to the system service documentation for more information." #define V6_ER_50_20 "CEC hardware Predictive Error, general. " \ "Refer to the system service documentation for more information." #define V6_ER_50_21 "CEC hardware Predictive Error, degraded performance. " \ "Refer to the system service documentation for more information." #define V6_ER_50_22 "CEC hardware Predictive Error, fault may be " \ "corrected after platform re-IPL. " \ "Refer to the system service documentation for more information." #define V6_ER_50_23 "CEC hardware Predictive Error, fault may be " \ "corrected after IPL, degraded performance. "\ "Refer to the system service documentation for more information." #define V6_ER_50_24 "CEC hardware Predictive Error, loss of redundancy. " \ "Refer to the system service documentation for more information." #define V6_ER_50_40 "CEC hardware Unrecovered Error, general. " \ "Refer to the system service documentation for more information." #define V6_ER_50_41 "CEC hardware Unrecovered Error, bypassed with " \ "degraded performance. " \ "Refer to the system service documentation for more information." #define V6_ER_50_44 "CEC hardware Unrecovered Error, bypassed with " \ "loss of redundancy. "\ "Refer to the system service documentation for more information." #define V6_ER_50_45 "CEC hardware Unrecovered Error, bypassed with " \ "loss of redundancy and performance. " \ "Refer to the system service documentation for more information." #define V6_ER_50_48 "CEC hardware Unrecovered Error, bypassed with " \ "loss of function. " \ "Refer to the system service documentation for more information." #define V6_ER_50_60 "CEC hardware Error on diagnostic test, general. " \ "Refer to the system service documentation for more information." #define V6_ER_50_61 "CEC hardware Error on diagnostic test, resource " \ "may produce incorrect result. " \ "Refer to the system service documentation for more information." #define V6_ER_60_00 "Power/Cooling subsystem Informational (non-error) Event."\ "Refer to the system service documentation for more information." #define V6_ER_60_10 "Power/Cooling subsystem Recovered Error, general. " \ "Refer to the system service documentation for more information." #define V6_ER_60_20 "Power/Cooling subsystem Predictive Error, general. " \ "Refer to the system service documentation for more information." #define V6_ER_60_21 "Power/Cooling subsystem Predictive Error, " \ "degraded performance. "\ "Refer to the system service documentation for more information." #define V6_ER_60_22 "Power/Cooling subsystem Predictive Error, " \ "fault may be corrected after platform re-IPL. " \ "Refer to the system service documentation for more information." #define V6_ER_60_23 "Power/Cooling subsystem Predictive Error, " \ "fault may be corrected after IPL, degraded performance. "\ "Refer to the system service documentation for more information." #define V6_ER_60_24 "Power/Cooling subsystem Predictive Error, " \ "loss of redundancy. " \ "Refer to the system service documentation for more information." #define V6_ER_60_40 "Power/Cooling subsystem Unrecovered Error, general. "\ "Refer to the system service documentation for more information." #define V6_ER_60_41 "Power/Cooling subsystem Unrecovered Error, " \ "bypassed with degraded performance. " \ "Refer to the system service documentation for more information." #define V6_ER_60_44 "Power/Cooling subsystem Unrecovered Error, " \ "bypassed with loss of redundancy. "\ "Refer to the system service documentation for more information." #define V6_ER_60_45 "Power/Cooling subsystem Unrecovered Error, " \ "bypassed with loss of redundancy and performance. " \ "Refer to the system service documentation for more information." #define V6_ER_60_48 "Power/Cooling subsystem Unrecovered Error, " \ "bypassed with loss of function. "\ "Refer to the system service documentation for more information." #define V6_ER_60_60 "Power/Cooling subsystem Error on diagnostic test, " \ "general. "\ "Refer to the system service documentation for more information." #define V6_ER_60_61 "Power/Cooling subsystem Error on diagnostic test, " \ "resource may produce incorrect result. " \ "Refer to the system service documentation for more information." #define V6_ER_70_00 "Other subsystem Informational (non-error) Event. " \ "Refer to the system service documentation for more information." #define V6_ER_70_10 "Other subsystem Recovered Error, general. " \ "Refer to the system service documentation for more information." #define V6_ER_70_20 "Other subsystem Predictive Error, general. " \ "Refer to the system service documentation for more information." #define V6_ER_70_21 "Other subsystem Predictive Error, degraded performance."\ "Refer to the system service documentation for more information." #define V6_ER_70_22 "Other subsystem Predictive Error, " \ "fault may be corrected after platform re-IPL. " \ "Refer to the system service documentation for more information." #define V6_ER_70_23 "Other subsystem Predictive Error, " \ "fault may be corrected after IPL, degraded performance. "\ "Refer to the system service documentation for more information." #define V6_ER_70_24 "Other subsystem Predictive Error, loss of redundancy. "\ "Refer to the system service documentation for more information." #define V6_ER_70_40 "Other subsystem Unrecovered Error, general. " \ "Refer to the system service documentation for more information." #define V6_ER_70_41 "Other subsystem Unrecovered Error, " \ "bypassed with degraded performance. "\ "Refer to the system service documentation for more information." #define V6_ER_70_44 "Other subsystem Unrecovered Error, " \ "bypassed with loss of redundancy. " \ "Refer to the system service documentation for more information." #define V6_ER_70_45 "Other subsystem Unrecovered Error, " \ "bypassed with loss of redundancy and performance. "\ "Refer to the system service documentation for more information." #define V6_ER_70_48 "Other subsystem Unrecovered Error, " \ "bypassed with loss of function. " \ "Refer to the system service documentation for more information." #define V6_ER_70_60 "Other subsystem Error on diagnostic test, general. " \ "Refer to the system service documentation for more information." #define V6_ER_70_61 "Other subsystem Error on diagnostic test, " \ "resource may produce incorrect result. " \ "Refer to the system service documentation for more information." #define V6_ER_7A_00 "Surveillance Error Informational (non-error) Event. "\ "Refer to the system service documentation for more information." #define V6_ER_7A_10 "Surveillance Error Recovered Error, general. "\ "Refer to the system service documentation for more information." #define V6_ER_7A_20 "Surveillance Error Predictive Error, general. " \ "Refer to the system service documentation for more information." #define V6_ER_7A_21 "Surveillance Error Predictive Error, " \ "degraded performance. " \ "Refer to the system service documentation for more information." #define V6_ER_7A_22 "Surveillance Error Predictive Error, " \ "fault may be corrected after platform re-IPL. " \ "Refer to the system service documentation for more information." #define V6_ER_7A_23 "Surveillance Error Predictive Error, " \ "fault may be corrected after IPL, degraded performance. " \ "Refer to the system service documentation for more information." #define V6_ER_7A_24 "Surveillance Error Predictive Error, " \ "loss of redundancy. " \ "Refer to the system service documentation for more information." #define V6_ER_7A_40 "Surveillance Error Unrecovered Error, general. " \ "Refer to the system service documentation for more information." #define V6_ER_7A_41 "Surveillance Error Unrecovered Error, " \ "bypassed with degraded performance. " \ "Refer to the system service documentation for more information." #define V6_ER_7A_44 "Surveillance Error Unrecovered Error, " \ "bypassed with loss of redundancy. "\ "Refer to the system service documentation for more information." #define V6_ER_7A_45 "Surveillance Error Unrecovered Error, " \ "bypassed with loss of redundancy and performance. " \ "Refer to the system service documentation for more information." #define V6_ER_7A_48 "Surveillance Error Unrecovered Error, " \ "bypassed with loss of function. " \ "Refer to the system service documentation for more information." #define V6_ER_7A_60 "Surveillance Error Error on diagnostic test, general. " \ "Refer to the system service documentation for more information." #define V6_ER_7A_61 "Surveillance Error Error on diagnostic test, " \ "resource may produce incorrect result. " \ "Refer to the system service documentation for more information." #define V6_ER_80_00 "Platform Firmware Informational (non-error) Event. " \ "Refer to the system service documentation for more information." #define V6_ER_80_10 "Platform Firmware Recovered Error, general. " \ "Refer to the system service documentation for more information." #define V6_ER_80_20 "Platform Firmware Predictive Error, general. " \ "Refer to the system service documentation for more information." #define V6_ER_80_21 "Platform Firmware Predictive Error, " \ "degraded performance. " \ "Refer to the system service documentation for more information." #define V6_ER_80_22 "Platform Firmware Predictive Error, " \ "fault may be corrected after platform re-IPL. " \ "Refer to the system service documentation for more information." #define V6_ER_80_23 "Platform Firmware Predictive Error, " \ "fault may be corrected after IPL, degraded performance. " \ "Refer to the system service documentation for more information." #define V6_ER_80_24 "Platform Firmware Predictive Error, loss of redundancy. "\ "Refer to the system service documentation for more information." #define V6_ER_80_40 "Platform Firmware Unrecovered Error, general. " \ "Refer to the system service documentation for more information." #define V6_ER_80_41 "Platform Firmware Unrecovered Error, " \ "bypassed with degraded performance. " \ "Refer to the system service documentation for more information." #define V6_ER_80_44 "Platform Firmware Unrecovered Error, " \ "bypassed with loss of redundancy. " \ "Refer to the system service documentation for more information." #define V6_ER_80_45 "Platform Firmware Unrecovered Error, " \ "bypassed with loss of redundancy and performance. " \ "Refer to the system service documentation for more information." #define V6_ER_80_48 "Platform Firmware Unrecovered Error, " \ "bypassed with loss of function. " \ "Refer to the system service documentation for more information." #define V6_ER_80_60 "Platform Firmware Error on diagnostic test, general. " \ "Refer to the system service documentation for more information." #define V6_ER_80_61 "Platform Firmware Error on diagnostic test, " \ "resource may produce incorrect result. " \ "Refer to the system service documentation for more information." #define V6_ER_90_00 "Software Informational (non-error) Event. " \ "Refer to the system service documentation for more information." #define V6_ER_90_10 "Software Recovered Error, general. " \ "Refer to the system service documentation for more information." #define V6_ER_90_20 "Software Predictive Error, general. " \ "Refer to the system service documentation for more information." #define V6_ER_90_21 "Software Predictive Error, degraded performance. " \ "Refer to the system service documentation for more information." #define V6_ER_90_22 "Software Predictive Error, " \ "fault may be corrected after platform re-IPL. " \ "Refer to the system service documentation for more information." #define V6_ER_90_23 "Software Predictive Error, " \ "fault may be corrected after IPL, degraded performance. " \ "Refer to the system service documentation for more information." #define V6_ER_90_24 "Software Predictive Error, loss of redundancy. " \ "Refer to the system service documentation for more information." #define V6_ER_90_40 "Software Unrecovered Error, general. " \ "Refer to the system service documentation for more information." #define V6_ER_90_41 "Software Unrecovered Error, " \ "bypassed with degraded performance. " \ "Refer to the system service documentation for more information." #define V6_ER_90_44 "Software Unrecovered Error, "\ "bypassed with loss of redundancy. " \ "Refer to the system service documentation for more information." #define V6_ER_90_45 "Software Unrecovered Error, " \ "bypassed with loss of redundancy and performance. " \ "Refer to the system service documentation for more information." #define V6_ER_90_48 "Software Unrecovered Error, " \ "bypassed with loss of function. " \ "Refer to the system service documentation for more information." #define V6_ER_90_60 "Software Error on diagnostic test, general. "\ "Refer to the system service documentation for more information." #define V6_ER_90_61 "Software Error on diagnostic test, " \ "resource may produce incorrect result. " \ "Refer to the system service documentation for more information." #define V6_ER_A0_00 "External environment Informational (non-error) Event. "\ "Refer to the system service documentation for more information." #define V6_ER_A0_10 "External environment Recovered Error, general. " \ "Refer to the system service documentation for more information." #define V6_ER_A0_20 "External environment Predictive Error, general. " \ "Refer to the system service documentation for more information." #define V6_ER_A0_21 "External environment Predictive Error, " \ "degraded performance. "\ "Refer to the system service documentation for more information." #define V6_ER_A0_22 "External environment Predictive Error, " \ "fault may be corrected after platform re-IPL. " \ "Refer to the system service documentation for more information." #define V6_ER_A0_23 "External environment Predictive Error, " \ "fault may be corrected after IPL, degraded performance. " \ "Refer to the system service documentation for more information." #define V6_ER_A0_24 "External environment Predictive Error, " \ "loss of redundancy. " \ "Refer to the system service documentation for more information." #define V6_ER_A0_40 "External environment Unrecovered Error, general. " \ "Refer to the system service documentation for more information." #define V6_ER_A0_41 "External environment Unrecovered Error, " \ "bypassed with degraded performance. " \ "Refer to the system service documentation for more information." #define V6_ER_A0_44 "External environment Unrecovered Error, " \ "bypassed with loss of redundancy. " \ "Refer to the system service documentation for more information." #define V6_ER_A0_45 "External environment Unrecovered Error, " \ "bypassed with loss of redundancy and performance. " \ "Refer to the system service documentation for more information." #define V6_ER_A0_48 "External environment Unrecovered Error, " \ "bypassed with loss of function. " \ "Refer to the system service documentation for more information." #define V6_ER_A0_60 "External environment Error on diagnostic test, general. "\ "Refer to the system service documentation for more information." #define V6_ER_A0_61 "External environment Error on diagnostic test, " \ "resource may produce incorrect result. " \ "Refer to the system service documentation for more information." #define V6_ER_B0_00 "Reserved Informational (non-error) Event. " \ "Refer to the system service documentation for more information." #define V6_ER_B0_10 "Reserved Recovered Error, general. " \ "Refer to the system service documentation for more information." #define V6_ER_B0_20 "Reserved Predictive Error, general. " \ "Refer to the system service documentation for more information." #define V6_ER_B0_21 "Reserved Predictive Error, degraded performance. " \ "Refer to the system service documentation for more information." #define V6_ER_B0_22 "Reserved Predictive Error, " \ "fault may be corrected after platform re-IPL. " \ "Refer to the system service documentation for more information." #define V6_ER_B0_23 "Reserved Predictive Error, " \ "fault may be corrected after IPL, degraded performance. " \ "Refer to the system service documentation for more information." #define V6_ER_B0_24 "Reserved Predictive Error, loss of redundancy. "\ "Refer to the system service documentation for more information." #define V6_ER_B0_40 "Reserved Unrecovered Error, general. " \ "Refer to the system service documentation for more information." #define V6_ER_B0_41 "Reserved Unrecovered Error, " \ "bypassed with degraded performance. " \ "Refer to the system service documentation for more information." #define V6_ER_B0_44 "Reserved Unrecovered Error, " \ "bypassed with loss of redundancy. " \ "Refer to the system service documentation for more information." #define V6_ER_B0_45 "Reserved Unrecovered Error, " \ "bypassed with loss of redundancy and performance. " \ "Refer to the system service documentation for more information." #define V6_ER_B0_48 "Reserved Unrecovered Error, " \ "bypassed with loss of function. " \ "Refer to the system service documentation for more information." #define V6_ER_B0_60 "Reserved Error on diagnostic test, general. " \ "Refer to the system service documentation for more information." #define V6_ER_B0_61 "Reserved Error on diagnostic test, " \ "resource may produce incorrect result. " \ "Refer to the system service documentation for more information." #define V6_EV_10_00 "Processor subsystem including internal cache Not " \ "applicable." #define V6_EV_10_01 "Processor subsystem including internal cache " \ "Miscellaneous, Information Only." #define V6_EV_10_08 "Processor subsystem including internal cache " \ "Dump Notification." #define V6_EV_10_10 "Processor subsystem including internal cache " \ "Previously reported error has been corrected by the system." #define V6_EV_10_20 "Processor subsystem including internal cache " \ "System resources manually deconfigured by user." #define V6_EV_10_21 "Processor subsystem including internal cache " \ "System resources deconfigured by system due to prior error event." #define V6_EV_10_22 "Processor subsystem including internal cache " \ "Resource deallocation event notification." #define V6_EV_10_30 "Processor subsystem including internal cache " \ "Customer environmental problem has returned to normal." #define V6_EV_10_40 "Processor subsystem including internal cache " \ "Concurrent Maintenance Event." #define V6_EV_10_60 "Processor subsystem including internal cache " \ "Capacity Upgrade Event." #define V6_EV_10_70 "Processor subsystem including internal cache " \ "Resource Sparing Event." #define V6_EV_10_80 "Processor subsystem including internal cache " \ "Dynamic Reconfiguration Event." #define V6_EV_10_D0 "Processor subsystem including internal cache " \ "Normal system/platform shutdown or powered off." #define V6_EV_10_E0 "Processor subsystem including internal cache " \ "Platform powered off by user with normal shutdown." #define V6_EV_20_00 "Memory subsystem including external cache " \ "Not applicable." #define V6_EV_20_01 "Memory subsystem including external cache " \ "Miscellaneous, Information Only." #define V6_EV_20_08 "Memory subsystem including external cache " \ "Dump Notification." #define V6_EV_20_10 "Memory subsystem including external cache " \ "Previously reported error has been corrected by the system." #define V6_EV_20_20 "Memory subsystem including external cache " \ "System resources manually deconfigured by user." #define V6_EV_20_21 "Memory subsystem including external cache " \ "System resources deconfigured by system due to prior error event." #define V6_EV_20_22 "Memory subsystem including external cache " \ "Resource deallocation event notification." #define V6_EV_20_30 "Memory subsystem including external cache " \ "Customer environmental problem has returned to normal." #define V6_EV_20_40 "Memory subsystem including external cache " \ "Concurrent Maintenance Event." #define V6_EV_20_60 "Memory subsystem including external cache " \ "Capacity Upgrade Event." #define V6_EV_20_70 "Memory subsystem including external cache " \ "Resource Sparing Event." #define V6_EV_20_80 "Memory subsystem including external cache " \ "Dynamic Reconfiguration Event." #define V6_EV_20_D0 "Memory subsystem including external cache " \ "Normal system/platform shutdown or powered off." #define V6_EV_20_E0 "Memory subsystem including external cache " \ "Platform powered off by user with normal shutdown." #define V6_EV_30_00 "I/O subsystem (hub, bridge, bus) Not applicable." #define V6_EV_30_01 "I/O subsystem (hub, bridge, bus) " \ "Miscellaneous, Information Only." #define V6_EV_30_08 "I/O subsystem (hub, bridge, bus) " \ "Dump Notification." #define V6_EV_30_10 "I/O subsystem (hub, bridge, bus) " \ "Previously reported error has been corrected by the system." #define V6_EV_30_20 "I/O subsystem (hub, bridge, bus) " \ "System resources manually deconfigured by user." #define V6_EV_30_21 "I/O subsystem (hub, bridge, bus) " \ "System resources deconfigured by system due to prior error event." #define V6_EV_30_22 "I/O subsystem (hub, bridge, bus) " \ "Resource deallocation event notification." #define V6_EV_30_30 "I/O subsystem (hub, bridge, bus) " \ "Customer environmental problem has returned to normal." #define V6_EV_30_40 "I/O subsystem (hub, bridge, bus) " \ "Concurrent Maintenance Event." #define V6_EV_30_60 "I/O subsystem (hub, bridge, bus) Capacity Upgrade Event." #define V6_EV_30_70 "I/O subsystem (hub, bridge, bus) Resource Sparing Event." #define V6_EV_30_80 "I/O subsystem (hub, bridge, bus) " \ "Dynamic Reconfiguration Event." #define V6_EV_30_D0 "I/O subsystem (hub, bridge, bus) " \ "Normal system/platform shutdown or powered off." #define V6_EV_30_E0 "I/O subsystem (hub, bridge, bus) " \ "Platform powered off by user with normal shutdown." #define V6_EV_40_00 "I/O adapter, device and peripheral Not applicable." #define V6_EV_40_01 "I/O adapter, device and peripheral " \ "Miscellaneous, Information Only." #define V6_EV_40_08 "I/O adapter, device and peripheral " \ "Dump Notification." #define V6_EV_40_10 "I/O adapter, device and peripheral " \ "Previously reported error has been corrected by the system." #define V6_EV_40_20 "I/O adapter, device and peripheral " \ "System resources manually deconfigured by user." #define V6_EV_40_21 "I/O adapter, device and peripheral " \ "System resources deconfigured by system due to prior error event." #define V6_EV_40_22 "I/O adapter, device and peripheral " \ "Resource deallocation event notification." #define V6_EV_40_30 "I/O adapter, device and peripheral " \ "Customer environmental problem has returned to normal." #define V6_EV_40_40 "I/O adapter, device and peripheral " \ "Concurrent Maintenance Event." #define V6_EV_40_60 "I/O adapter, device and peripheral " \ "Capacity Upgrade Event." #define V6_EV_40_70 "I/O adapter, device and peripheral " \ "Resource Sparing Event." #define V6_EV_40_80 "I/O adapter, device and peripheral " \ "Dynamic Reconfiguration Event." #define V6_EV_40_D0 "I/O adapter, device and peripheral " \ "Normal system/platform shutdown or powered off." #define V6_EV_40_E0 "I/O adapter, device and peripheral " \ "Platform powered off by user with normal shutdown." #define V6_EV_50_00 "CEC hardware Not applicable." #define V6_EV_50_01 "CEC hardware Miscellaneous, Information Only." #define V6_EV_50_08 "CEC hardware Dump Notification." #define V6_EV_50_10 "CEC hardware " \ "Previously reported error has been corrected by the system." #define V6_EV_50_20 "CEC hardware " \ "System resources manually deconfigured by user." #define V6_EV_50_21 "CEC hardware " \ "System resources deconfigured by system due to prior error event." #define V6_EV_50_22 "CEC hardware Resource deallocation event notification." #define V6_EV_50_30 "CEC hardware " \ "Customer environmental problem has returned to normal." #define V6_EV_50_40 "CEC hardware Concurrent Maintenance Event." #define V6_EV_50_60 "CEC hardware Capacity Upgrade Event." #define V6_EV_50_70 "CEC hardware Resource Sparing Event." #define V6_EV_50_80 "CEC hardware Dynamic Reconfiguration Event." #define V6_EV_50_D0 "CEC hardware " \ "Normal system/platform shutdown or powered off." #define V6_EV_50_E0 "CEC hardware " \ "Platform powered off by user with normal shutdown." #define V6_EV_60_00 "Power/Cooling subsystem Not applicable." #define V6_EV_60_01 "Power/Cooling subsystem Miscellaneous, Information Only." #define V6_EV_60_08 "Power/Cooling subsystem Dump Notification." #define V6_EV_60_10 "Power/Cooling subsystem " \ "Previously reported error has been corrected by the system." #define V6_EV_60_20 "Power/Cooling subsystem " \ "System resources manually deconfigured by user." #define V6_EV_60_21 "Power/Cooling subsystem " \ "System resources deconfigured by system due to prior error event." #define V6_EV_60_22 "Power/Cooling subsystem " \ "Resource deallocation event notification." #define V6_EV_60_30 "Power/Cooling subsystem " \ "Customer environmental problem has returned to normal." #define V6_EV_60_40 "Power/Cooling subsystem Concurrent Maintenance Event." #define V6_EV_60_60 "Power/Cooling subsystem Capacity Upgrade Event." #define V6_EV_60_70 "Power/Cooling subsystem Resource Sparing Event." #define V6_EV_60_80 "Power/Cooling subsystem Dynamic Reconfiguration Event." #define V6_EV_60_D0 "Power/Cooling subsystem " \ "Normal system/platform shutdown or powered off." #define V6_EV_60_E0 "Power/Cooling subsystem " \ "Platform powered off by user with normal shutdown." #define V6_EV_70_00 "Other subsystem Not applicable." #define V6_EV_70_01 "Other subsystem Miscellaneous, Information Only." #define V6_EV_70_08 "Other subsystem Dump Notification." #define V6_EV_70_10 "Other subsystem " \ "Previously reported error has been corrected by the system." #define V6_EV_70_20 "Other subsystem " \ "System resources manually deconfigured by user." #define V6_EV_70_21 "Other subsystem " \ "System resources deconfigured by system due to prior error event." #define V6_EV_70_22 "Other subsystem Resource deallocation event notification." #define V6_EV_70_30 "Other subsystem " \ "Customer environmental problem has returned to normal." #define V6_EV_70_40 "Other subsystem Concurrent Maintenance Event." #define V6_EV_70_60 "Other subsystem Capacity Upgrade Event." #define V6_EV_70_70 "Other subsystem Resource Sparing Event." #define V6_EV_70_80 "Other subsystem Dynamic Reconfiguration Event." #define V6_EV_70_D0 "Other subsystem " \ "Normal system/platform shutdown or powered off." #define V6_EV_70_E0 "Other subsystem " \ "Platform powered off by user with normal shutdown." #define V6_EV_7A_00 "Surveillance Error Not applicable." #define V6_EV_7A_01 "Surveillance Error Miscellaneous, Information Only." #define V6_EV_7A_08 "Surveillance Error Dump Notification." #define V6_EV_7A_10 "Surveillance Error " \ "Previously reported error has been corrected by the system." #define V6_EV_7A_20 "Surveillance Error " \ "System resources manually deconfigured by user." #define V6_EV_7A_21 "Surveillance Error " \ "System resources deconfigured by system due to prior error event." #define V6_EV_7A_22 "Surveillance Error " \ "Resource deallocation event notification." #define V6_EV_7A_30 "Surveillance Error " \ "Customer environmental problem has returned to normal." #define V6_EV_7A_40 "Surveillance Error Concurrent Maintenance Event." #define V6_EV_7A_60 "Surveillance Error Capacity Upgrade Event." #define V6_EV_7A_70 "Surveillance Error Resource Sparing Event." #define V6_EV_7A_80 "Surveillance Error Dynamic Reconfiguration Event." #define V6_EV_7A_D0 "Surveillance Error " \ "Normal system/platform shutdown or powered off." #define V6_EV_7A_E0 "Surveillance Error " \ "Platform powered off by user with normal shutdown." #define V6_EV_80_00 "Platform Firmware Not applicable." #define V6_EV_80_01 "Platform Firmware Miscellaneous, Information Only." #define V6_EV_80_08 "Platform Firmware Dump Notification." #define V6_EV_80_10 "Platform Firmware " \ "Previously reported error has been corrected by the system." #define V6_EV_80_20 "Platform Firmware " \ "System resources manually deconfigured by user." #define V6_EV_80_21 "Platform Firmware " \ "System resources deconfigured by system due to prior error event." #define V6_EV_80_22 "Platform Firmware " \ "Resource deallocation event notification." #define V6_EV_80_30 "Platform Firmware " \ "Customer environmental problem has returned to normal." #define V6_EV_80_40 "Platform Firmware Concurrent Maintenance Event." #define V6_EV_80_60 "Platform Firmware Capacity Upgrade Event." #define V6_EV_80_70 "Platform Firmware Resource Sparing Event." #define V6_EV_80_80 "Platform Firmware Dynamic Reconfiguration Event." #define V6_EV_80_D0 "Platform Firmware " \ "Normal system/platform shutdown or powered off." #define V6_EV_80_E0 "Platform Firmware " \ "Platform powered off by user with normal shutdown." #define V6_EV_90_00 "Software Not applicable." #define V6_EV_90_01 "Software Miscellaneous, Information Only." #define V6_EV_90_08 "Software Dump Notification." #define V6_EV_90_10 "Software " \ "Previously reported error has been corrected by the system." #define V6_EV_90_20 "Software " \ "System resources manually deconfigured by user." #define V6_EV_90_21 "Software " \ "System resources deconfigured by system due to prior error event." #define V6_EV_90_22 "Software Resource deallocation event notification." #define V6_EV_90_30 "Software " \ "Customer environmental problem has returned to normal." #define V6_EV_90_40 "Software Concurrent Maintenance Event." #define V6_EV_90_60 "Software Capacity Upgrade Event." #define V6_EV_90_70 "Software Resource Sparing Event." #define V6_EV_90_80 "Software Dynamic Reconfiguration Event." #define V6_EV_90_D0 "Software Normal system/platform shutdown or powered off." #define V6_EV_90_E0 "Software " \ "Platform powered off by user with normal shutdown." #define V6_EV_A0_00 "External environment Not applicable." #define V6_EV_A0_01 "External environment Miscellaneous, Information Only." #define V6_EV_A0_08 "External environment Dump Notification." #define V6_EV_A0_10 "External environment " \ "Previously reported error has been corrected by the system." #define V6_EV_A0_20 "External environment " \ "System resources manually deconfigured by user." #define V6_EV_A0_21 "External environment " \ "System resources deconfigured by system due to prior error event." #define V6_EV_A0_22 "External environment " \ "Resource deallocation event notification." #define V6_EV_A0_30 "External environment " \ "Customer environmental problem has returned to normal." #define V6_EV_A0_40 "External environment Concurrent Maintenance Event." #define V6_EV_A0_60 "External environment Capacity Upgrade Event." #define V6_EV_A0_70 "External environment Resource Sparing Event." #define V6_EV_A0_80 "External environment Dynamic Reconfiguration Event." #define V6_EV_A0_D0 "External environment " \ "Normal system/platform shutdown or powered off." #define V6_EV_A0_E0 "External environment " \ "Platform powered off by user with normal shutdown." #define V6_EV_B0_00 "Reserved Not applicable." #define V6_EV_B0_01 "Reserved Miscellaneous, Information Only." #define V6_EV_B0_08 "Reserved Dump Notification." #define V6_EV_B0_10 "Reserved " \ "Previously reported error has been corrected by the system." #define V6_EV_B0_20 "Reserved System resources manually deconfigured by user." #define V6_EV_B0_21 "Reserved " \ "System resources deconfigured by system due to prior error event." #define V6_EV_B0_22 "Reserved Resource deallocation event notification." #define V6_EV_B0_30 "Reserved " \ "Customer environmental problem has returned to normal." #define V6_EV_B0_40 "Reserved Concurrent Maintenance Event." #define V6_EV_B0_60 "Reserved Capacity Upgrade Event." #define V6_EV_B0_70 "Reserved Resource Sparing Event." #define V6_EV_B0_80 "Reserved Dynamic Reconfiguration Event." #define V6_EV_B0_D0 "Reserved Normal system/platform shutdown or powered off." #define V6_EV_B0_E0 "Reserved " \ "Platform powered off by user with normal shutdown." #endif ppc64-diag-2.6.4/rtas_errd/rc.powerfail0000755000000000000000000002226512313010662016366 0ustar rootroot#!/bin/sh # # Copyright (C) 2005 IBM Corporation # # This is a customizable file for responding to EPOW (Environmental and Power # Warning) events. These events are issued in response to various # environmental conditions such as power or temperature problems, or fan # failures. # # When this script is executed, the /var/log/epow_status file will contain a # number indicating the current status of the system. The following is a list # of values that may appear in that file: # # Status Description Action # ------ ----------- ------ # 0 Normal state no action # 1 Loss of Primary Power 4 ms to shutdown* # 2 Power Supply Failure 4 ms to shutdown* # 3 Manual Power-Off Switch Activated 4 ms to shutdown* # 4 Thermal High 20 seconds to shutdown # 5 Primary Fan Failure 20 seconds to shutdown # 6 Secondary Fan Failure 10 minutes to shutdown # 7 Battery Backup 10 minutes to shutdown # 8 Non-Critical Cooling Problem no action # 9 Non-Critical Power Problem no action # 10 (v6) Normal system shutdown initiate an OS shutdown # 11 (v6) Loss of critical functions initiate an OS shutdown # # * this script is not likely to be invoked in this short timespan # # In the more severe cases, there will not be enough time to invoke this # script (or update the epow_status file, for that matter). A 20-second # warning indicates that the machine should be shut down immediately; power # will be automatically removed in 20 seconds. A 10-minute warning indicates # that a less severe problem exists; the epow_status file will be updated every # 5 seconds. If the status improves to "no action", there is no need to shut # down; otherwise, the system should be shut down within 10 minutes. # # The exit status of this script is as follows: # # Status Description # ------ ----------- # 0 system condition is normal, no shutdown is necessary # 1 system is shutting down or halting # 2 halt -fn failed # 3 shutdown -hF now failed # 4 reached the end of the script, which should never occur # 5 script entered an undefined state # # Current EPOW sensor information may also be obtained from reading # /proc/ppc64/rtas/sensors. # # The rtas_errd daemon must be running for this script to be invoked and for the # epow_status file to be updated. msg="" detail="" status=0 # # notify() # # This function walls the following information to all attached terminals: #