
                                ==========
                                README.TXT
                                ==========
                              
             Marvell NetXtreme Firmware Upgrade Tool for Linux
                Copyright (c) 2005-2019 Marvell Semiconductor Inc.
                        All rights reserved.



Table of Contents
=================
    1. Introduction
    2. Requirements
    3. Installation
    4. Supported Operating Systems
    5. Command Usage
    6. Exit Codes
    7. Examples
    8. Known Limitations
    9. Third Party Software License


1. Introduction:
================

LnxQlgcUpg.sh is a non-interactive shell script which can be run from a 
Linux terminal. This script can ONLY be used to upgrade the firmware components 
and it does not require user intervention.
On executing LnxQlgcUpg.sh, it automatically extracts the SDK contents and
initiate the upgrade process. On completion it displays success or failure message
to indicate final result.

lnxfwnx2 is a console application which can be run from a Linux terminal.
The application supports both command-line as well as interactive mode to interact 
with the users.
When calling the utility from another process or when using the utility 
as a command line tool, the utility will take commands from user specified
parameters and return appropriate exit code to indicate the result. 

This module is dependent on device driver and TCL libraries for firmware access.


2. Requirements:
================

     1.  Driver Versions: 
        a). For E3 controller:
            bnx2 Linux driver version 1.4.41 or above.  
         
        b). For E4 controller:
            qed  Linux driver version 8.3.4.0 or above.
            qede Linux driver version 8.3.4.0 or above.  
            qede(inbox) Linux driver version 8.33.0.20 on RHEL7.6, RHEL8.0, SLES12.4, SLES15.1 and higher

         Please refer to README.TXT of the target driver for installation instruction. 

     2.  For v2.4.1 or later
         libncurses.so.5 and libtinfo.so.5 are needed.
         Please use 'ldd lnxfwnx2' to find the dependency of these libraries.

     3. PHY Firmware can be upgraded only if the corresponding INTERFACES ARE UP.
        Please use the following command to up the interface.
        #ifconfig p6p1 up                       p6p1 => is the interface that need to be made up / down
        #ifconfig p6p1 down

3. Installation:
================
     1.  Non-interactive upgrade : No installation required
         Files required for Non-interactive upgrade:
         1)  lnxfwnx2-{arch}.sdk.tgz - SDK Package
         2)  LnxQlgcUpg.sh           - Script file
         3)  Marvell provided MBI file
         Note: LnxQlgcUpg.sh requires MBI (multi-boot image) file to be present in same folder 
               as LnxQlgcUpg.sh script file.
     
     2.  Manual mode 
         To install lnxfwnx2 SDK package. 
         a.  On terminal execute cmd 'tar -zxvf lnxfwnx2-{arch}.sdk.tgz' to untar the 
             package. 
 
             The files included in the sdk package are:
             1)  lnxfwnx2                -  This upgrade utility program
             2)  libtcl8.6.8.so          -  Dependent TCL library 
             3)  Readme.txt              -  This file.
             4)  Release.txt             -  Release Notes
             5)  qlgc_pci.ids            -  PCI ID file for adapter identification

4. Supported Operating Systems:
===============================
   OS Name                       OS Type        Hardware Platform
   ------------------------   ------------     --------------------
   * Red Hat RHEL AS/ES 7.x       64-bit            x64
   * Red Hat RHEL AS/ES 6.x       32-bit            x86
   * Red Hat RHEL AS/ES 6.x       64-bit            x64
   * Red Hat RHEL AS/ES 5.8       32-bit            x86
   * Red Hat RHEL AS/ES 5.8       64-bit            x64
   * Red Hat RHEL AS/ES 5.7       32-bit            x86
   * Red Hat RHEL AS/ES 5.7       64-bit            x64
   * Red Hat RHEL AS/ES 5.6       32-bit            x86
   * Red Hat RHEL AS/ES 5.6       64-bit            x64

   * Novell SLES 15 GA            64-bit            x64
   * Novell SLES 12 SP4/SP3/SP1   64-bit            x64
   * Novell SLES 11 SP2/SP1       32-bit            x86
   * Novell SLES 11 SP2/SP1       64-bit            x64


5. Command Usage:
=================

5.a Non-interactive upgrade
---------------------
    After installation run the shell script.

     ./LnxQlgcUpg.sh
     
    The script identifies the supported Marvell Adapters and upgrades all the firmware 
    components on all applicable adapters in a system. 

5.b Manual mode
------------------------
Notes: 
       1) Some of the commands are not supported for E4 controller. 
       2) For more information, please refer to the section 4.a.1 to view the 
          list of unavailable commands for E4.
       
Usage:
------
    lnxfwnx2 provides both command-line and interactive mode to the user.
    
    lnxfwnx2 { -all | [ID | MAC] } [Commands]
    The '-all' option applies to 'upgrade', 'restorenvram', 'cfg' and
    'factory_defaults' commands only. 

    The 'ID/MAC' option is used to select the adapter for the command to apply.
    It can be omitted if there is only one adapter in the system.

    The ID/MAC is optional for 'help', 'version', and 'dev' commands, 
    but it is required for all other commands.

    1. When '-all' is specified, 'ID' or 'MAC' cannot be specified.
       Commands 'upgrade', 'restorenvram', cfg and factory_defaults will use 
       the device information in the image to apply to all NICs that match the
       same device information. 

    2. On Linux, 'ID' is the the interface name (i.e. ethX). 

    3. 'MAC' is the MAC address name of the NIC in the system. For example, 
       '00:10:18:00:11:99' is a valid MAC address from 'ifconfig' utility. 
       Use '001018001199' as an input parameter to select the NIC.

5.b.1. Available commands:
---------------------------------------------------------------------
The following is the list of commands for E3 & E4 controllers.
    
Command Name            : General Command Description                    :  Command Support/Availability                                                                     
----------------        ---------------------------------------------     ----------------------------------
                                                                          [E3]  [E4-OOB drv]  [E4-inbox drv]
                                                                          -----  -----------   ------------
    help                : list of available commands                     : Yes       Yes          Yes
    q                   : exit the program                               : Yes       Yes          Yes
    log                 : log output to a file                           : Yes       Yes          Yes
    dev                 : select an adapter or List available adapters   : Yes       Yes          Yes
    dir                 : display file directory in NVRAM                : Yes       Yes           No
    crc                 : check/update NVRAM checksum                    : Yes       Yes           No
    prg                 : Program NVRAM with specified firmware image    : Yes        No           No
    dumpnvram           : save entire NVRAM content or MDUMP image       : Yes       Yes           No
                          to a specified file
    restorenvram        : restore entire NVRAM content from a file       : Yes        No           No
    version             : display version of this program                : Yes       Yes          Yes
    upgrade             : upgrades the firmware or bootcode              : Yes       Yes          Yes
    reset               : reset the selected NIC.                        : Yes       Yes          Yes
    -w                  : Enable/Disable WOL                             : Yes       Yes          Yes
    cfg                 : Configure NVRAM                                : Yes       Yes          Yes
    phy                 : Upgrade PHY firmware                           : Yes       Yes          Yes
    info                : Displays the general information               : Yes       Yes           No
    factory_defaults    : Restore NVM_CFG1 to factory default settings   : No        Yes          Yes
    update_cfg          : Update NVM_CFG and META firmware images        : No        Yes          Yes
    xml                 : export the firmware versions in xml file       : Yes       Yes          Yes
    vlant               : Creates an empty VLAN Table in NVRAM           : Yes        No           No
    
5.2. Command usage discription with options:
--------------------------------------------
      
    upgrade [-noreset] [-F] {-bc|-mba|-ipmi|-ump|-ncsi|-m_pn|-ib|-ib_ipv6|
        -ib_ipv4n6|-l2t|-mfw1|-mfw|-feb|-vpd|-ccm}
        [-c] [-p] {<new_image>} [<save_image>]
        This command upgrades the firmware or bootcode for
        the NetXtreme II controller.  The <new_image> specifies
        the name of the file that contains the appropriate image.
        The <save_image> specifies the name of the file to which the
        current NVRAM contents will be saved. 
        The <new_image> is a mandatory parameter, but the <save_image> is an optional parameter.
        The current NVRAM content will NOT be saved if the <save_image> is not specified.
        Use forwardslash instead of backslash when specifying file path.
        Alternatively you could also use two backslashes in the file path.
        Use file/directory paths without quotes/spaces.
        If the upgrade version is same or older than the version
        in NVRAM, upgrade will be aborted.
        The -noreset option is to skip the driver restart of the selected
        NIC after the firmware upgrade is completed.  This option is only
        valid in Command Line Mode.
        If there an error in upgrading any component of MBI image, upgrade process will be
        be aborted immediatly.
        The -F option is to force the upgrade without checking version.
            OPTION             NAME OF FIRMWARE OR BOOT IMAGE
            -bc                bootcode
            -mfw1              bootcode + NCSI firmware for BCM57712 and above
            -mfw               Upgrade MFW firmware
            -mba               MBA (PXE) code
            -l2t               L2 firmware for BCM5771x adapter
            -ipmi              IPMI management firmware
            -ump               UMP management firmware
            -ncsi              NCSI management firmware
            -m_pn              I/O module file for BCM5771x adapter
            -ib                iSCSI boot driver with IPv4 address support.
            -ib_ipv6           iSCSI boot driver with IPv6 address support.
            -ib_ipv4n6         iSCSI boot driver with IPv4 and IPv6 address support.
            -feb               FCoE boot code.
            -vpd               Extended VPD.
            -ccm               CCM firmware.
            -mbi               Monolithic Image.
        The [-c], [-p] option is valid only when "-ib/-ib_ipv6/-ib_ipv4n6" option is specified.
        The [-c] option is also valid when "-feb" option is specified.
            -c                 upgrade the iSCSI/FCoE configuration along with
                               iSCSI/FCoE boot code.
                               The '-ib', '-ib_ipv6', and '-ib_ipv4n6' will add/
                               upgrade the iSCSI configuration automatically.
                               The '-feb' will add/upgrade the FCoE configuration
                               automatically.  This option is obsolete and no longer
                               necessary.
                               This option does not have effect any more.
            -p                 upgrade the iSCSI configuration program along
                               with iSCSI boot code.  This option is obsolete and
                               no longer necessary.
        Note:
            For E4 controller, the ONLY availabe options are -mba, -mfw, -mbi.

    reset
        Reset the selected NIC.  This command is only valid in Command Line Mode.

    -w {<value>}
        The function enables or disables WOL setting.
        <value> set to '1' to enable WOL.
        <value> set to '0' to disable WOL.

    restorenvram {<filename>} [idmatch] [lic] [config [mac]] [preserve [vpd]]
        This command reads complete NVRAM image from a file and
        writes the image to NVRAM.
        Before writing the NVRAM image to adapter, verifications
        against source NVRAM image will be performed. If any verification
        failed, the image will not be written to adapter.
        <filename> is the file name of NVRAM image.
        <filename> is a mandatory parameter. Use forwardslash instead of 
        backslash when specifying <filename>. Alternatively you could also 
        use two backslashes in the file path. Use file/directory paths 
        without quotes/spaces.
        'idmatch' requests the Firmware Upgrade Tool to restore the NVRAM
        image only if the 4 IDs (vendor_id, device_id, subsystem_vendor_id,
        subsystem_device_id) in the image file match those in the device.
        'lic' means licencing information will be copied from 
        the source image, without this parameter it's preserved.
        'config' means configuration area will copy from source
        image except MAC address.
        Configuration area includes MAC address and various
        options.
        'mac' applies only when 'config' is specified.
        When 'mac' is specified, all configuration are copied
        including MAC address.
        'preserve' means all other components will be copied from
        the source image except for the parameters supplied\r\n"
        after this command.
        'vpd' is applicable with 'preserve' option.  When 'vpd' is
        specified, vpd information of nvram is preserved.

    dumpnvram {<filename>}
        Dumps the NVRAM contents or MDUMP image to the specified file.
        if "mdump" option is not specified then dump the entire NVMRAM contents 
        to specified file.
        <filename> is a mandatory parameter. Use forwardslash instead of 
        backslash when specifying <filename>. Alternatively you could also 
        use two backslashes in the file path. Use file/directory paths 
        without quotes/spaces.

    prg {-ib|-ib_ipv6|-ib_ipv4n6|-mba|-ccm} {<new_image>} [-c] [-p]
        This command programs NVRAM with the specified firmware image.
        -ib        : iSCSI boot driver with IPv4 address support.
        -ib_ipv6   : iSCSI boot driver with IPv6 address support.
        -ib_ipv4n6 : iSCSI boot driver with both IPv4 and IPv6 address support.
        -mba       : MBA firmware
        -ccm       : CCM firmware
        <new_image>: a mandatory parameter to specify the input binary file.
        -c         : force to program iSCSI configuration, only valid when
                     used with -ib, -ib_ipv6, or ip_ipv4n6 option.
        -p         : force to program iSCSI configuration utility program, only
                     valid when used with -ib, -ib_ipv6, or ip_ipv4n6 option.
        Note: 'prg' command only supports selective Marvell adapters.
              The image file for the 'prg {-ib|-ib_ipv6|-ib_ipv4n6}' command
              is required to contain ONLY valid iSCSI boot without other
              firmware directories.

    crc [-all] {-mbi} {mbi_file}
        Performs the CRC check to verify the integrity of the NVRAM.
        -all        : Performs CRC check on all the adapters present on the system.
        -mbi        : To selectively perform CRC check on selected adapters 
        <mbi_file>  : crc check will be performed on adapters supported by MBI and  
                      present on system. 
                      Above options are only available in cmd line mode.

    dir [-delete <entry>]
        Displays a listing of the firmware programmed in NVRAM.
        Delete the specified <entry> in the directory and its firmware from NVRAM.
        The <entry> can be found from 'Image' list using the 'dir' command.
        The user should use 'cfg' command to disable the management option before
        removing the management firmware.
        -all        : Displays listing of the firmware in NVRAM for all the adapters present on the system.
        -mbi        : To display listing of the firmwares in NVRAM for selected adapters
        <mbi_file>  : dir will be performed on adapters supported by MBI and present on system. 
                      Above options are only available in cmd line mode.        

    dev [<number>]
        <number> is the adapter to be selected as target device

    cfg [-noreset] {-mac <MAC address to be programmed for current selected device> | 
	     -lldpmac <LLDP MAC address to be programmed for current selected port> | 
         -mba <value> | -ipmi <value> | -ump <value> | -wol <value> | -2p5g <value> |
         -mgmt <value> | -dcbx <value> | -shadow_swim <value> |
         -sriov_hide_menu <value> | -sriov <value> | -revid_ctl <value> |
         -vf_per_pf <value> | -vpdv0 <version string> | -bar2size | -show [show_option]}
        This command programs the specified configuration into NVRAM.
        The -ipmi, -ump, and -mgmt are used to enable/disable the
        management firmware which can be one of ipmi, ump, or ncsi.
        Both "-ipmi" and "-ump" are deprecated in favor of the "-mgmt".
        The user should not enable MGMT option in the absence of the
        management firmware.

        The -noreset option is to skip the driver restart of the selected
        NIC after the 'cfg' operation is completed.  This option is only
        valid in Command Line Mode.

        -mac        : <MAC address for current selected device> is a 
                      12-digit HEX MAC address, e.g. 0010181a2b3c.
                      This option is valid for BCM57712 or later NICs.
        -lldpmac    : <LLDP MAC address for current selected port> is a 
                      12-digit HEX MAC address, e.g. 0010181a2b3c.
                      This option is valid for 579xx and QL4xxxx NICs.
        -mba        : set <value> to '1' to enable mba firmware.
                      set <value> to '0' to disable mba firmware.
                      This option is valid for BCM57712 and 578xx NICs.
        -ipmi       : set <value> to '1' to enable management firmware.
                      set <value> to '0' to disable management firmware.
                      This option is valid for BCM57712 NICs.
        -ump        : set <value> to '1' to enable management firmware.
                      set <value> to '0' to disable management firmware.
                      This option is valid for BCM57712 NICs.
        -mgmt       : set <value> to '1' to enable management firmware.
                      set <value> to '0' to disable management firmware.
                      This option is valid for BCM57712 NICs.
        -wol        : set <value> to '1' to enable wol feature.
                      set <value> to '0' to disable wol feature.
        -2p5g       : set <value> to '1' to enable 2.5G SERDES support.
                      set <value> to '0' to disable 2.5G SERDES support.
                      This option is valid for BCM5706 NIC.
        -dcbx       : For BCM57712 and 578xx NICs:
                      set <value> to '1' to enable DCBX functionality.
                      set <value> to '0' to disable DCBX functionality.
                      For 579xx and QL4xxxx NICs:
                      set <value> to '0' to disable DCBX functionality.
                      set <value> to '1' to select IEEE mode.
                      set <value> to '2' to select CEE mode.
                      set <value> to '3' to select Dynamic mode.
        -shadow_swim: set <value> to '1' to enable Shadow SWIM functionality.
                      set <value> to '0' to disable Shadow SWIM functionality.
                      This option is valid for BCM57712 or 578xx.
        -sriov_hide_menu: set <value> to '1' to hide SRIOV menu.
                      set <value> to '0' to show SRIOV menu.
                      This option is valid for BCM57712 and 578xx NICs.
        -sriov      : set <value> to '1' to enable SRIOV.
                      set <value> to '0' to disable SRIOV.
                      This option is valid for BCM57712 or later NIC.
        -vf_per_pf  : set the number of VF per PF.
                      This option is valid for BCM57712 and 578xx NICs.
        -vpdv0      : set <version string> to VPD V0 tag.
                      <version string> should be in x.y.z format.
                      This option is valid for BCM57712 or later NIC.
        -revid_ctl  : set <value> to '0' to preserve revision Id.
                      set <value> to '1' for actual revision Id.
                      set <value> to '2' to force B0.
                      set <value> to '3' to force B1.
                      This option is valid for 578xx NIC.
        -rdma_enablement    : set <value> to '0' to disable RDMA.
                      set <value> to '1' to enable RoCE.
                      set <value> to '2' to enable iWarp.
                      set <value> to '3' to enable both RoCE and iWarp.
                      This option is valid for 579xx and QL4xxxx NICs.
        -roce_priority_mode : set <value> from '0' to '7' to set ROCE priority mode.
                      This option is valid for 579xx and QL4xxxx NICs.                     
        -mba_boot_protocol  : set <value> to '0' for PXE boot.
                      set <value> to '3' for iSCSI boot.
                      set <value> to '4' for FCoE boot.
                      set <value> to '7' for None.
                      This option is valid for 579xx and QL4xxxx NICs.
        -bar2size: set <value> as per following table:
                      For 579xx based adapters:
                      0 (Disabled), 1 (64K), 2 (128K), 3 (256K),
                      4 (512K), 5 (1M), 6 (2M), 7 (4M), 8 (8M), 9 (16M),
                      10 (32M), 11 (64M), 12 (128M), 13 (256M),
                      14(512M), 15(1G)
                      For QL4xxxx based adapters:
                      0 (Disabled), 5 (1M), 6 (2M), 7 (4M), 8 (8M),
                      9 (16M), 10 (32M), 11 (64M), 12 (128M),
                      13 (256M), 14 (512M), 15 (1G)\r\n"
                      This option is valid for 579xx and QL4xxxx NICs.
        -show       : show the settings of current configuration.
                      If 'show_option' is specified, it will show the
                      setting of the specified option, 
                      <show_option> 'sriov' will display whether SRIOV is enabled or disabled
                      <show_option> 'vf_per_pf' will display VF per PF setting
                      <show_option> 'manuf_kit_ver' will display manufacture kit version
                      <show_option> 'manuf_date' will display manufacture date

    phy {-ver | -upg <filename> }
        This command can display the firmware version of external PHY or
        upgrade the PHY firmware.  After upgrading the PHY firmware, a
        system reboot is required for the new PHY firmware to become
        effective.

    -w {<value>}
        The function enables or disables WOL setting.
        <value> set to '1' to enable WOL.
        <value> set to '0' to disable WOL.

    factory_defaults
        Reset the selected NIC NVM_CFG1 to factory defaults settings.  
        This command is only valid for E4 adapters.
        Limitations of factory_defaults:
        - In the interactive mode even though factory_defaults is percieved to be executed on port
          basis but the changes will be reflected on all the ports.
        - The cmd can’t handle user changes on options which changed their type. E.g. if a user
          made a change on an option that was changed from per-port to per-function, then a new
          per-function option will be created in the new NVM_CFG1 (the pre-port option is obsolete). 
          The new per-function option will be set to its default value and not to the user’s change 
          value of the obsolete per-port option, since the tool can’t relate this option to the old 
          obsolete option.

    update_cfg [<nvm_cfg>.bin <meta>.txt]
        This command updates DEFAULT_CFG and NVM_CFG firmware in NVMRAM
        The command require both nvm_cfg image (in binary format) and meta image (in txt format)
        to update NVM_CFG and DEFAULT_CFG in NVRAM.
        This command is only valid for E4 adapters.
        - In the interactive mode even though update_cfg is perceived to be executed on port
          basis but the changes will be reflected on all the ports.
        - While upgrading NVM_CFG, the cmd automatically takes care of the options changed by the user.

    info
        This command displays the following general information. 
        
            Property Name     : Description/Comment
            -------------     ---------------------
            Temperature       : Displays temperature in Celsius for E3 and E4 adapters.
            Active SWIM       : Displays current active SWIM group for E3 adapters only.
    
    xml {xml_file_name} {mbi_file_name}
        This cmd will read the firmware versions either from NVRAM or MBI file and export to XML file
        -xml_file_name        : Name of the XML file to be created 
        -mbi_file_name        : IF valid MBI file is passed then firmware versions are read from MBI file and 
                                exported to XML ELSE firmware versions are read from NVRAM and exported to XML

    vlant {[-reset] [-delete]}
        If VLAN table is not present in NVRAM then this cmd will create an empty VLAN Table in NVRAM.
        This command is only available for E3 adapters.
        -reset                : clears all the entries in VLAN table  
        -delete               : deletes VLAN table from NVRAM 
        
6. Exit Codes:
==============

/////////////////////////////////////////////////////////////////////////
// Return codes
#define FWUPG_OK                                0   // Upgrade firmware OK
#define FWUPG_QUIT                              1   // Quit program
#define FWUPG_PARAM_ERROR                       2   // Not correct parameters
#define FWUPG_NOT_CORRECT_TARGET                3   // Not applicable to this device. 
#define FWUPG_CANNOT_READ_NVRAM                 4   // Cannot read NVRAM
#define FWUPG_FAILED_GET_NVRAM_SIZE             5   // Cannot get NVRAM size
#define FWUPG_CANNOT_GET_HANDLE                 6   // Cannot get NIC handle
#define FWUPG_ADAPTER_NOT_FOUND                 7   // Adapter not found
#define FWUPG_CANNOT_LOCK_ADAPTER               8   // Cannot lock adapter
#define FWUPG_FAILED_GET_PXE_INFO               9   // Failed to get PXE
                                                    // information
#define FWUPG_FAILED_CREATE_NVRAM_IMAGE_FILE    10  // Failed to create NVRAM
                                                    // image file
#define FWUPG_FAILED_WRITE_NVRAM_IMAGE_FILE     11  // Failed to write to
                                                    // NVRAM image file
#define FWUPG_GET_CLOSE_EVENT                   12  // Get close event
#define FWUPG_FAILED_READ_NVRAM_FILE            13  // Failed to read NVRAM
                                                    // image file
#define FWUPG_INIT_FAILED                       14  // Initialization failed
#define FWUPG_UNSUPPORTED_QLMAPI_VER            15  // QLMAPI is too old
#define FWUPG_NIC_NOT_SUPPORTED                 16  // NIC is not supported
#define FWUPG_UNKNOWN_COMMAND                   17  // Unknown command
#define FWUPG_NVRAM_WRITE_FAILED                18  // NVRAM update failed
#define FWUPG_WRONG_NVRAM_FILE_SIZE             19  // NVRAM image file size
#define FWUPG_NVRAM_IMAGE_CHKSUM_FAILED         20  // NVRAM image file
                                                    // checksum failed
#define FWUPG_NVRAM_CHKSUM_FAILED               21  // NVRAM crc or checksum failed
#define FWUPG_NVRAM_IMAGE_FILE_DEVID_MISMATCH   22  // device information or media 
                                                    // type in NVRAM image file
                                                    // does not match NIC
#define FWUPG_ASF_NOT_SUPPORTED_BY_BOOTCODE     23  // ASF is not supported by
                                                    // the bootcode firmware
#define FWUPG_ASF_NOT_SUPPORTED_BY_NIC          24  // ASF is not supported by
                                                    // the NIC hardware
#define FWUPG_DIR_FULL                          25  // No NVRAM directory entry
                                                    // available
#define FWUPG_INVALID_NVRAM_FILE                26  // Incorrect NVRAM file
                                                    // format
#define FWUPG_NVRAM_FULL                        27  // not enough NVRAM space
#define FWUPG_DIR_NOT_SUPPORTED                 28  // Directory is not
                                                    // supported by bootcode
#define FWUPG_NVRAM_CORRUPTED                   29  // NVRAM corrupted
#define FWUPG_DIR_NOT_FOUND                     30  // a directory entry is
                                                    // not found
#define FWUPG_DIR_UPDATE_FAILED                 31  // Update NVRAM directory
                                                    // failed
#define FWUPG_DIR_FOUND                         32  // a directory entry is
                                                    // found
#define FWUPG_CANNOT_READ_MEM                   33  // Cannot read NIC register
                                                    // or memory
#define FWUPG_MALLOC_ERROR                      34  // memory allocation error
#define FWUPG_FW_IMAGE_WRONG_VERSION            35  // wrong version of
                                                    // firmware image
#define FWUPG_FW_IMAGE_INVALID_ASF              36  // invalid asf image
#define FWUPG_READ_NIC_ASF_TABLE_FAILED         37  // failed to read ASF table
                                                    // from  NIC
#define FWUPG_UNSUPPORTED_NIC_ASF_TABLE         38  // version of ASF table on
                                                    // NIC is not supported
#define FWUPG_REBOOT_FAILED                     39  // unable to reboot machine
#define FWUPG_NOT_SUPPORTED_DRIVER              40  // the version of driver is
                                                    // too old
#define FWUPG_DRIVER_NOT_LOADED                 41  // driver is not loaded
#define FWUPG_FILE_TOO_BIG                      42  // file is too big
#define FWUPG_CANNOT_WRITE_MEM                  43  // Cannot write NIC
                                                    // register or memory
#define FWUPG_MGMT_FW_NOT_FOUND                 44  // Cannot find management 
                                                    // firmware
#define FWUPG_UMP_FOUND                         45  // UMP firmware exist
#define FWUPG_FAILED_TO_GET_VERINFO             46  // failed to get module
                                                    // version info
#define FWUPG_ERR_ENDOFFILE                     47  // unexpected end of file
                                                    // encountered.
#define FWUPG_INVALID_MEDIUM_TYPE               48  // The chip has an unknown
                                                    // medium type. Neither the
                                                    // board is copper nor
                                                    // serdes.
#define FWUPG_INVALID_OFFSET                    49  // invalid NVRAM offset.
#define FWUPG_FILE_ALREADY_EXISTS               50  // output file already
                                                    // exists.
#define FWUPG_NON_SELFBOOT_IMAGE                51  // Not a selfboot image.
#define FWUPG_BAD_MAGIC_VALUE                   52  // Bad magic value
#define FWUPG_BAD_PARITY_VALUE                  53  // Bad parity value
#define FWUPG_BAD_VPD_CHKSUM                    54  // Bad VPD checksum
#define FWUPG_BAD_CHIP_REV                      55  // Bad chip revision
#define FWUPG_VPD_DATA_MISSING                  56  // VPD data missing
#define FWUPG_NO_SELFBOOT                       57  // target not self boot 
                                                    // capable
#define FWUPG_LEGACY_TO_SELFBOOT                58  // Cannot upgrade firmware 
                                                    // from legacy to selfboot.
#define FWUPG_ZERO_SELFBOOT                     59  // upgfrm does not support 
                                                    // Format 0 Selfboot image 
                                                    // upgrade
#define FWUPG_UNSUPPORTED_FEATURE               60  // Feature not supported.
#define FWUPG_DIAG_FAILURE                      61  // diag failure
#define FWUPG_NO_BRCM_ADAPTER                   62  // No Marvell network 
                                                    // adapter found!
#define FWUPG_FILE_DOES_NOT_EXIST               63  // File does not exist
#define FWUPG_UMP_NOT_SUPPORTED                 64  // ump not supported
#define FWUPG_MISSING_UMP                       65  // UMP config firmware is
                                                    // not loaded in NVRAM
#define FWUPG_CFG_VER_MISMATCH                  66  // UMP config version 
                                                    // mismatch
#define FWUPG_INVALID_ISCSI_IMAGE               67  // invalid ISCSI image
#define FWUPG_INVALID_UMP_IMAGE                 68  // invalid UMP image
#define FWUPG_INVALID_MBA_IMAGE                 69  // invalid MBA image
#define FWUPG_PRG_FAILED                        70  // programming NVRAM failed
#define FWUPG_BOOTSTRAP_UPDATE_FAILED           71  // bootstrap update failed
#define FWUPG_CMD_ALL_NOT_SUPPORTED             72  // '-all' option is not 
                                                    // supported in this context
#define FWUPG_UNSUPPORTED_PLATFORM              73  // Feature not supported on 
                                                    // this platform
#define FWUPG_MAC_PARAM_ERROR                   74  // Cannot override MAC on 
                                                    // multiple NICs.
#define FWUPG_INVALID_BOOTCODE                  75  // Not a valid bootcode file
#define FWUPG_INVALID_IPMI_FILE                 76  // Not a valid ipmi file
#define FWUPG_INVALID_DUMP                      77  // Invalid dump file.
#define FWUPG_INVALID_FORMAT                    78  // Invalid image/file format.
#define FWUPG_DIR_ENTRY_MISMATCH                80  // Mismatch in directory entries
#define FWUPG_MBA_MISMATCH                      81  // MBA directory entry mismatch
#define FWUPG_UMP_MISMATCH                      82  // UMP directory entry mismatch
#define FWUPG_IPMI_MISMATCH                     83  // IPMI directory entry mismatch
#define FWUPG_ISCSI_MISMATCH                    84  // ISCSI directory entry mismatch
#define FWUPG_ASF_MISMATCH                      85  // ASF directory entry mismatch
#define FWUPG_ISCSI_NOT_SUPPORTED               86  // ISCSI is not supported.
#define FWUPG_SPECIAL_UPGRADE_REQUIRED          87  // Special upgrade is required.
#define FWUPG_MISSING_CMD                       88  // No valid command was specified.
#define FWUPG_RESERVE1                          89  // Reserved message holder.
#define FWUPG_RESERVE2                          90  // Reserved message holder.
#define FWUPG_MISSING_ASF                       91  // ASF config firmware is
                                                    // not loaded in NVRAM
#define FWUPG_MISSING_IPMI                      92  // IPMI config firmware is
                                                    // not loaded in NVRAM
#define FWUPG_MISSING_MBA                       93  // MBA config firmware is
                                                    // not loaded in NVRAM
#define FWUPG_NO_DEV_ID                         94  // No device ID in NVRAM image file
#define FWUPG_SYSTEM_REBOOT                     95  // System Reboot required
#define FWUPG_INVALID_NCSI_IMAGE                96  // invalid NCSI image
#define FWUPG_MISSING_MGMT_FW                   97  // Missing management firmware in NVRAM
#define FWUPG_INVALID_PHY_IMAGE                 98  // Invalid PHY firmware file.
#define FWUPG_DRIVER_COMMUNICATE_ERROR          99  // Error in communicating to driver
#define FWUPG_FW_EXISTING_IN_NVRAM              100 // The firmware to be programmed is existing in NVRAM
#define FWUPG_FAIL_TO_GET_MAC_ADDR              101 // Failed to read MAC ADDR from the file
#define FWUPG_MGMTFW_NOT_SUPPORTED_BY_NIC       102 // Management firmware is not supported by the NIC
#define FWUPG_IMAGE_FILE_CRC_ERROR              103 // Image file CRC error
#define FWUPG_IMAGE_FILE_SIG_ERROR              103 // Image file RSA signature error
#define FWUPG_INVALID_L2T_IMAGE                 104 // invalid L2T image
#define FWUPG_CMD_ABORTED                       105 // Command aborted
#define FWUPG_PHY_FW_CORRUPTED                  106 // PHY firmware corrupted
#define FWUPG_UNKNOWN_EXT_PHY                   107 // Unknown external PHY
#define FWUPG_CANNOT_UPGRADE_TO_DIFF_FORMAT     108 // Can't upgrade to a different format
#define FWUPG_CANNOT_READ_OTP                   109 // Can't read to OTP
#define FWUPG_CANNOT_WRITE_OTP                  110 // Can't write to OTP
#define FWUPG_FAIL_TO_CREATE_EXT_DIR_ENTRY      111 // Failed to create Extended Directory entry
#define FWUPG_INVALID_BOOTCODE_IMAGE            112 // invalid Bootcode image
#define FWUPG_INVALID_IO_MODULE_IMAGE           113 // Invalid I/O Module file.
#define FWUPG_NCSI_MISMATCH                     114 // NCSI directory entry mismatch
#define FWUPG_INVALID_FCOE_IMAGE                115 // Invalid FCoE image
#define FWUPG_FCOE_MISMATCH                     116 // FCOE directory entry mismatch
#define FWUPG_32BIT_APP_IN_WOW64                117 // Can't run 32-bit application in 64-bit platform.
#define FWUPG_IMAGE_FILE_SIG_ERROR              118 // Image file RSA signature error
#define FWUPG_32BIT_APP_IN_WOW64                119 // Can't run 32-bit application in 64-bit platform.
#define FWUPG_INVALID_MFW_IMAGE                 120 // Invalid MFW image
#define FWUPG_INVALID_CCM_IMAGE                 121 // invalid CCM image
#define FWUPG_CCM_NOT_SUPPORTED                 122 // CCM is not supported.
#define FWUPG_CCM_MISMATCH                      123 // CCM directory entry mismatch 
#define FWUPG_DIAG_TEST_NOT_SUPPORTED           124 // Specified Diagnostic tests are not supported 
#define FWUPG_DIAG_TEST_FAILED                  125 // Diagnostic test failed
#define FWUPG_INVALID_MBI_IMAGE                 126 // invalid MBI image
#define FWUPG_INVALID_MBI_LENGTH                127 // MBI length mismatch
#define FWUPG_REGISTER_TEST_FAILED              128 // Register test failed
#define FWUPG_MII_REGISTER_TEST_FAILED          129 // MII registers test failed
#define FWUPG_NVRAM_TEST_FAILED                 130 // NVRAM test failed
#define FWUPG_MEMORY_TEST_FAILED                131 // Memory test failed
#define FWUPG_TEST_INTERRUPT_FAILED             132 // Interrupt test failed
#define FWUPG_CPU_TEST_FAILED                   133 // CPU test failed
#define FWUPG_MAC_LOOPBACK_TEST_FAILED          134 // Loopback test failed
#define FWUPG_PHY_LOOPBACK_TEST_FAILED          135 // Loopback test failed
#define FWUPG_LED_TEST_FAILED                   136 // LED test failed
#define FWUPG_INVALID_HW_INIT_IMAGE             137 // Not a valid INIT_HW file
#define FWUPG_RESTORED_NIC_BACK_TO_NORMAl_STATE 138 // Restored the NIC back to normal state in the event of failed or partial MBI firware update or CRC checksum failed.
#define FWUPG_SHA256_AUTH_FAILED_ON_NVM_DUMP    139 // SHA256 authentication failed against nvm dump before restoring back to normal state.
#define FWUPG_RESTORE_FAILED                    140 // Failed to restore the NIC back to normal state.
#define FWUPG_FAILED_GET_CURRENT_TEMPERATURE    141 // Failed to get the current temperature of the NIC.
#define FWUPG_BLOCKED_AHALOM_FROM_CNA_TO_NIC    142 // Block MBI downgrade from CNA (HP12.10) to NIC (HP12.00) for HP ALOM adapters
#define FWUPG_META_PARSEING_ERROR               143 // Unable to parse META file
#define FWUPG_INVALID_OPTION                    144 // This option is not a valid option
#define FWUPG_UNSUPPORTED_OPTION                145 // This option is not available on this adapter
#define FWUPG_INVALID_OPTION_VALUE              146 // Supplied value for this NVM_CFG1 option is invalid
#define FWUPG_NO_DRVR_NVRAM_ACCESS              147 // On Linux platform only Firmware upgrade is supported with inbox driver, other NVM operations like dir,crc etc. are not supported.
#define FWUPG_READ_CONFIG_FAILED                148 // NVRAM read configuration failed.
#define FWUPG_DRIVER_NOT_INSTALLED              149 // Intermediate or miniport driver not installed.
#define FWUPG_READ_EEPROM_FAILED                150 // EPROM read failed.
#define FWUPG_WRITE_EEPROM_FAILED               151 // EPROM write failed.
#define FWUPG_NO_READ_EEPROM_PRIV               152 // No privilege to read EEPROM.
#define FWUPG_NO_WRITE_EEPROM_PRIV              153 // No privilege to read EEPROM.
#define FWUPG_NO_DIAG_ACCESS_RIGHT              154 // Application did not call QLmapiInitDiag() with successful return.
#define FWUPG_DATA_NOT_FOUND                    155 // Requested data not found.
#define FWUPG_READ_REGISTER_FAILED              156 // read register failed.
#define FWUPG_UNSUPPORTED_IOCTL                 157 // unsupported IOCTL.
#define FWUPG_DEVIO_CALL_FAILED                 158 // DeviceIoControl() failed.
#define FWUPG_FILE_OPEN_FAILED                  159 // file open failed.
#define FWUPG_UPGRADE_PHY_FW_ERROR              160 // Failed to upgrade PHY firmware.
#define FWUPG_INTERNAL_DATA_ERROR               161 // internal data error.
#define FWUPG_DEVICE_IS_NOT_UP                  162 // The device is not up and running.
#define FWUPG_LOW_SYSTEM_RESOURCES              163 // IOCTL failed due to low  system resources.
#define FWUPG_MBI_IMAGE_CHKSUM_FAILED           164 // MBI image file checksum failure
#define FWUPG_INVALID_VPD_IMAGE                 165 // Invalid VPD image in NVM
#define FWUPG_NVM_FILE_READ_ONLY                166 // Firmwares are readonly (i.e Firmware in Lockdown mode)

7. Examples:
==============
    Note:  
    The 'restorenvram' and 'upgrade' commands shall perform successfully
    for the specified adapter meeting ALL the following conditions:
    1) The device information of the adapter matches that in the image file. 
    2) The adapter currently supports the requested target firmware. 


7.1  Command Line Mode Examples:
*******************************

        'lnxfwnx2' will enter interactive mode.

        'lnxfwnx2 upgrade -bc /tmp/new_bootcode /tmp/oldBoot' will upgrade 
    bootcode for the ONLY qualified adapter found.  The adapter parameter 
    can be omitted if ONLY ONE qualified adapter is found.

        'lnxfwnx2 001018001199 upgrade -mba b57mmbae.nic /backup/oldPXE.bin'
    will upgrade PXE for the adapter with MAC 00:10:18:00:11:99.

        'lnxfwnx2 001018001199 upgrade -F -ipmi impi55
    old_image' will upgrade IPMI for the adapter with the specified MAC.

        'lnxfwnx2 -all upgrade -ipmi pt5706h6.20 /backup/saveIPMI' will 
    upgrade for all the qualified BRCM 5706 adapters that currently 
    support IPMI. When multiple applicable adapters are present, the MAC 
    address of the adapter is appended to the backup NVRAM image parameter 
    filename
    
        'lnxfwnx2 -all upgrade -F -ump /tmp/NtX2Ump.bin backupUMP' will force a 
    downgrade for all the BRCM 5706/5708 adapters with existing UMP support.  
    When multiple applicable adapters are present, the MAC address of the 
    adapter is appended to the backup NVRAM image parameter filename.

        'lnxfwnx2 -all dir -mbi ql_mbi_7148.bin' will display the listing
    of firmwares in NVMRAM for all the adapters that are supported in MBI  
    and are currently present in the system.

        'lnxfwnx2 -all dir' will display the listing of firmware in NVMRAM for
    all the adapters that currently present in the system.
    
        'lnxfwnx2 -all crc -mbi ql_mbi_7148.bin' will perform the CRC check on 
    all the adapters that are supported in MBI and are currently present in the system.

        'lnxfwnx2 -all crc' will perform CRC check on all the adapters that are 
    currently present in the system.
    
        'lnxfwnx2 -all restorenvram "/tmp/backup.bin" config' will read a 
    complete NVRAM image from file 'backup.bin' and write the image to NVRAM 
    along with its configurations.  If 'config' parameter is left out, only 
    the image is written. This will only restore NVRAM images to those with 
    matching FW, with the exception to variations in version numbers.

        'lnxfwnx2 0010181a1b1c cfg -mac 0010189d9e9f' will configure the 
    selected adapter whose current MAC address is 00:10:18:1a:1b:1c to be the 
    new MAC address 00:10:18:9d:9e:9f.

        'lnxfwnx2 0010189a9b9c cfg -ipmi 1' will enable ipmi firmware if the 
    ipmi firmware is present in the selected adapter whose current MAC address 
    is 00:10:18:9a:9b:9c.

        'lnxfwnx2 0010189a9b9c reset' will reset the selected adapter whose current
    MAC address is 00:10:18:9a:9b:9c.

        'lnxfwnx2 xml xml_name' will read the firmware versions from NVMRAM and export
    to XML.

        'lnxfwnx2 xml xml_name mbi_file' will read the firmware versions from given MBI
     file and export to XML.

7.2  Interactive Mode Examples:
*******************************

        'help' will display a list and descriptions of available commands.

        'q' will exit the utility.

        'dev' will display a list of upgradeable devices.

        'dev 0' will select device 0.

        'dir' will display a listing of the firmware programmed in NVRAM.

        'crc' will check the integrity of the NVRAM CRC.
 
        'dumpnvram /backup.bin' saves the dump file to the specified file.
    
        'restorenvram "/tmp_dir/backup.bin" config mac' 
    will include all configurations including the MAC address.  In order 
    to verify the MAC address was configured, exiting the program will be 
    necessary followed by either disabling and enabling the adapter or 
    rebooting the system.
    
        'upgrade -bc ee5706c3.19 backup5706.bin' will upgrade the boot code 
    for a BRCM 5706 adapter.

        'version' will display the version of Firmware Upgrade utility. 

        '-w 1' will enable the WOL setting on the current adapter.

        'cfg -mac 0010181a2b3c" will configure MAC address for the selected
    qualified adapter.

        'cfg -ump 0' will disable ump firmware if the ump firmware is present
    in the selected adapter.

        'cfg -show sriov' will display current setting of SRIOV in the selected 
    adapter.

        'cfg -show vf_per_pf' will display current setting of number of VF per PF
    in the selected adapter.


8. Known Limitations:
=====================

  1.  The read/write NVRAM operations and all other commands requiring NVRAM access are unable
      to perform correctly on Red Hat EL3.0 with kernel versions prior to 2.4.23.

        Due to a limitation in kernel versions prior to 2.4.23, older
        Linux distributions including Red Hat EL 3.0 may cause "firmware upgrade tool"
        not function with an error code 58.
        This problem is seen on 32-bit and 64-bit platforms with 57xx 
        family NICs loaded with tg3 driver (version >= 3.37) and 5706 
        family NICs loaded with bnx2 driver.
  
  2.  Known issue for BCM5709-based adapter:
      **************************************
      After this software is used to upgrade the firmware (including Bootcode,
      IPMI, UMP, iSCSI boot... ) in the NVRAM, the system has to be rebooted
      for the new firmware to become effective.
      The commands that require a reboot after exiting the software are
      "upgrade", "prg", and "restorenvram".

  3.  Known issue for E3 adapters running inbox drivers:
      **************************************************
	  Some of the most recent kernels (for example in SLES15/SLES15.1) has a security feature to prevent 
	  user space access to physical memory above 1MB (IIRC). Due to which "firmmare upgrade tool"
	  may not function properly. 
	  There are couple of workaround:
	  1. At boot time: Add iomem=relaxed in kernel command line during boot time.
	  2. update grub.cfg file: 
	    2.1 add iomem=relaxed at the end for GRUB_CMDLINE_LINUX_DEFAULT parameter in file 
		/etc/default/grub.cfg (based on the distro, location of grub.cfg may vary)
		2.2 run cmd grub2-mkconfig -o /boot/grub2/grub.cfg
		2.3 reboot the server to take effect
      3. To avoid the issue or extra kernel param use the latest OOB drivers.

      Note: "iomem=relaxed" workaround will not work if Secure Boot is enabled. 
             Disable Secure Boot before updating the firmware when using "iomem=relaxed" workaround.
      
  4.  "Grc Attn" and "qed_int_attentions" messages are observed while updating firmware on SLES15
      Issue is seen if qede driver 8.24.xx is installed on the SLES15 system. 
      The issue is seen when registers are accessed using ELBI method.      
      To resolve this issue please install updated out-of-box qede driver 8.37.xx or above on SLES15 
      where registers are accessed using debugfs interface.
      
  5.  Recent OS distro SLES15 SP2 when booted in secure boot mode does not allow user space applications 
      to access the debugfs nodes, due to which "firmware upgrade tool" may not function properly 
      so please disable secure Boot mode before updating the firmware.

  
9. Third Party Software License:
================================

Portions of this software contain third party code subject to the following conditions:

OpenSSL:
--------

/* ====================================================================
 * Copyright (c) 1998-2007 The OpenSSL Project.  All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 *
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer. 
 *
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in
 *    the documentation and/or other materials provided with the
 *    distribution.
 *
 * 3. All advertising materials mentioning features or use of this
 *    software must display the following acknowledgment:
 *    "This product includes software developed by the OpenSSL Project
 *    for use in the OpenSSL Toolkit. (http://www.openssl.org/)"
 *
 * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
 *    endorse or promote products derived from this software without
 *    prior written permission. For written permission, please contact
 *    openssl-core@openssl.org.
 *
 * 5. Products derived from this software may not be called "OpenSSL"
 *    nor may "OpenSSL" appear in their names without prior written
 *    permission of the OpenSSL Project.
 *
 * 6. Redistributions of any form whatsoever must retain the following
 *    acknowledgment:
 *    "This product includes software developed by the OpenSSL Project
 *    for use in the OpenSSL Toolkit (http://www.openssl.org/)"
 *
 * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
 * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE OpenSSL PROJECT OR
 * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
 * OF THE POSSIBILITY OF SUCH DAMAGE.
 * ====================================================================
 *
 * This product includes cryptographic software written by Eric Young
 * (eay@cryptsoft.com).  This product includes software written by Tim
 * Hudson (tjh@cryptsoft.com).
 *
 */

 Original SSLeay License:
 ------------------------

/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
 * All rights reserved.
 *
 * This package is an SSL implementation written
 * by Eric Young (eay@cryptsoft.com).
 * The implementation was written so as to conform with Netscapes SSL.
 *
 * This library is free for commercial and non-commercial use as long as
 * the following conditions are aheared to.  The following conditions
 * apply to all code found in this distribution, be it the RC4, RSA,
 * lhash, DES, etc., code; not just the SSL code.  The SSL documentation
 * included with this distribution is covered by the same copyright terms
 * except that the holder is Tim Hudson (tjh@cryptsoft.com).
 *
 * Copyright remains Eric Young's, and as such any Copyright notices in
 * the code are not to be removed.
 * If this package is used in a product, Eric Young should be given attribution
 * as the author of the parts of the library used.
 * This can be in the form of a textual message at program startup or
 * in documentation (online or textual) provided with the package.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 * 3. All advertising materials mentioning features or use of this software
 *    must display the following acknowledgement:
 *    "This product includes cryptographic software written by
 *     Eric Young (eay@cryptsoft.com)"
 *    The word 'cryptographic' can be left out if the rouines from the library
 *    being used are not cryptographic related :-).
 * 4. If you include any Windows specific code (or a derivative thereof) from 
 *    the apps directory (application code) you must include an acknowledgement:
 *    "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
 *
 * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 * SUCH DAMAGE.
 *
 * The licence and distribution terms for any publically available version or
 * derivative of this code cannot be changed.  i.e. this code cannot simply be
 * copied and put under another distribution licence
 * [including the GNU Public Licence.]
 */

Tcl/Tk License Terms:
---------------------

/* This software is copyrighted by the Regents of the University of California, 
 * Sun Microsystems, Inc., Scriptics Corporation, and other parties. The following 
 * terms apply to all files associated with the software unless explicitly disclaimed 
 * in individual files.
 * 
 * The authors hereby grant permission to use, copy, modify, distribute, and license 
 * this software and its documentation for any purpose, provided that existing copyright 
 * notices are retained in all copies and that this notice is included verbatim in any 
 * distributions. No written agreement, license, or royalty fee is required for any of 
 * the authorized uses. Modifications to this software may be copyrighted by their authors 
 * and need not follow the licensing terms described here, provided that the new terms 
 * are clearly indicated on the first page of each file where they apply.
 * 
 * IN NO EVENT SHALL THE AUTHORS OR DISTRIBUTORS BE LIABLE TO ANY PARTY FOR DIRECT, 
 * INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OF 
 * THIS SOFTWARE, ITS DOCUMENTATION, OR ANY DERIVATIVES THEREOF, EVEN IF THE AUTHORS 
 * HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 * 
 * THE AUTHORS AND DISTRIBUTORS SPECIFICALLY DISCLAIM ANY WARRANTIES, INCLUDING, 
 * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A 
 * PARTICULAR PURPOSE, AND NON-INFRINGEMENT. THIS SOFTWARE IS PROVIDED ON AN "AS IS" 
 * BASIS, AND THE AUTHORS AND DISTRIBUTORS HAVE NO OBLIGATION TO PROVIDE MAINTENANCE, 
 * SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
 * 
 * GOVERNMENT USE: If you are acquiring this software on behalf of the U.S. government, 
 * the Government shall have only "Restricted Rights" in the software and related 
 * documentation as defined in the Federal Acquisition Regulations (FARs) in Clause 
 * 52.227.19 (c) (2). If you are acquiring the software on behalf of the Department of Defense, 
 * the software shall be classified as "Commercial Computer Software" and the Government 
 * shall have only "Restricted Rights" as defined in Clause 252.227-7013 (c) (1) of DFARs. 
 * Notwithstanding the foregoing, the authors grant the U.S. Government and others acting 
 * in its behalf permission to use and distribute the software in accordance with the terms 
 * specified in this license. 
 */


License of Libedit library:
---------------------------
/*-
* Copyright (c) 1992, 1993
*    The Regents of the University of California.  All rights reserved.
*
* This code is derived from software contributed to Berkeley by
* Christos Zoulas of Cornell University.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
*    notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
*    notice, this list of conditions and the following disclaimer in the
*    documentation and/or other materials provided with the distribution.
* 3. Neither the name of the University nor the names of its contributors
*    may be used to endorse or promote products derived from this software
*    without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
*/

