This file contains licences pertaining to the following firmwares for
LiquidIO (c) adapters

1. lio_nic_23xx.bin, lio_210nv_nic.bin, lio_410nv_nic.bin

###########################################################################

1. lio_nic_23xx.bin, lio_210nv_nic.bin, lio_410nv_nic.bin

Copyright (c) 2018, Cavium, Inc. All rights reserved.

Software License Agreement

ANY USE, REPRODUCTION, OR DISTRIBUTION OF THE ACCOMPANYING BINARY SOFTWARE
CONSTITUTES LICENSEEE'S ACCEPTANCE OF THE TERMS AND CONDITIONS OF THIS AGREEMENT.

Licensed Software. Subject to the terms and conditions of this Agreement,
Cavium, Inc. ("Cavium") grants to Licensee a worldwide, non-exclusive, and
royalty-free license to use, reproduce, and distribute the binary software in
its complete and unmodified form as provided by Cavium.

Restrictions. Licensee must reproduce the Cavium copyright notice above with
each binary software copy. Licensee must not reverse engineer, decompile,
disassemble or modify in any way the binary software. Licensee must not use
the binary software in violation of any applicable law or regulation. This
Agreement shall automatically terminate upon Licensee's breach of any term or
condition of this Agreement in which case, Licensee shall destroy all copies of
the binary software.

Warranty Disclaimer.  THE LICENSED SOFTWARE IS OFFERED "AS IS," AND CAVIUM
GRANTS AND LICENSEE RECEIVES NO WARRANTIES OF ANY KIND, WHETHER EXPRESS,
IMPLIED, STATUTORY, OR BY COURSE OF COMMUNICATION OR DEALING WITH LICENSEE, OR
OTHERWISE.  CAVIUM AND ITS LICENSORS SPECIFICALLY DISCLAIM ANY IMPLIED
WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, TITLE, OR
NONINFRINGEMENT OF THIRD PARTY RIGHTS, CONCERNING THE LICENSED SOFTWARE,
DERIVATIVE WORKS, OR ANY DOCUMENTATION PROVIDED WITH THE FOREGOING.  WITHOUT
LIMITING THE GENERALITY OF THE FOREGOING, CAVIUM DOES NOT WARRANT THAT THE
LICENSED SOFTWARE IS ERROR-FREE OR WILL OPERATE WITHOUT INTERRUPTION, AND
CAVIUM GRANTS NO WARRANTY REGARDING ITS USE OR THE RESULTS THEREFROM, INCLUDING
ITS CORRECTNESS, ACCURACY, OR RELIABILITY.

Limitation of Liability. IN NO EVENT WILL LICENSEE, CAVIUM, OR ANY OF CAVIUM'S
LICENSORS HAVE ANY LIABILITY HEREUNDER FOR ANY INDIRECT, SPECIAL, OR
CONSEQUENTIAL DAMAGES, HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
FOR BREACH OF CONTRACT, TORT (INCLUDING NEGLIGENCE), OR OTHERWISE, ARISING OUT
OF THIS AGREEMENT, INCLUDING DAMAGES FOR LOSS OF PROFITS, OR THE COST OF
PROCUREMENT OF SUBSTITUTE GOODS, EVEN IF SUCH PARTY HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGES.

Export and Import Laws.  Licensee acknowledges and agrees that the Licensed
Software (including technical data and related technology) may be controlled by
the export control laws, rules, regulations, restrictions and national security
controls of the United States and other applicable foreign agencies (the
"Export Controls"), and agrees not export or re-export, or allow the export or
re-export of export-controlled the Licensed Software (including technical data
and related technology) or any copy, portion or direct product of the foregoing
in violation of the Export Controls. Licensee hereby represents that
(i) Licensee is not an entity or person to whom provision of the Licensed
Software (including technical data and related technology) is restricted or
prohibited by the Export Controls; and (ii) Licensee will not export, re-export
or otherwise transfer the export-controlled Licensed Software (including
technical data and related technology) in violation of U.S. sanction programs
or export control regulations to (a) any country, or  national or resident of
any country, subject to a United States trade embargo, (b) any person or entity
to whom shipment is restricted or prohibited by the Export Controls, or
(c) anyone who is engaged in activities related to the design, development,
production, or use of nuclear materials, nuclear facilities, nuclear weapons,
missiles or chemical or biological weapons.
