linux/drivers/net/wireless/iwlwifi/iwl-fw-file.h
<<
>>
Prefs
   1/******************************************************************************
   2 *
   3 * This file is provided under a dual BSD/GPLv2 license.  When using or
   4 * redistributing this file, you may do so under either license.
   5 *
   6 * GPL LICENSE SUMMARY
   7 *
   8 * Copyright(c) 2008 - 2012 Intel Corporation. All rights reserved.
   9 *
  10 * This program is free software; you can redistribute it and/or modify
  11 * it under the terms of version 2 of the GNU General Public License as
  12 * published by the Free Software Foundation.
  13 *
  14 * This program is distributed in the hope that it will be useful, but
  15 * WITHOUT ANY WARRANTY; without even the implied warranty of
  16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  17 * General Public License for more details.
  18 *
  19 * You should have received a copy of the GNU General Public License
  20 * along with this program; if not, write to the Free Software
  21 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110,
  22 * USA
  23 *
  24 * The full GNU General Public License is included in this distribution
  25 * in the file called LICENSE.GPL.
  26 *
  27 * Contact Information:
  28 *  Intel Linux Wireless <ilw@linux.intel.com>
  29 * Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
  30 *
  31 * BSD LICENSE
  32 *
  33 * Copyright(c) 2005 - 2012 Intel Corporation. All rights reserved.
  34 * All rights reserved.
  35 *
  36 * Redistribution and use in source and binary forms, with or without
  37 * modification, are permitted provided that the following conditions
  38 * are met:
  39 *
  40 *  * Redistributions of source code must retain the above copyright
  41 *    notice, this list of conditions and the following disclaimer.
  42 *  * Redistributions in binary form must reproduce the above copyright
  43 *    notice, this list of conditions and the following disclaimer in
  44 *    the documentation and/or other materials provided with the
  45 *    distribution.
  46 *  * Neither the name Intel Corporation nor the names of its
  47 *    contributors may be used to endorse or promote products derived
  48 *    from this software without specific prior written permission.
  49 *
  50 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
  51 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
  52 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
  53 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
  54 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
  55 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
  56 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
  57 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
  58 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  59 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
  60 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  61 *****************************************************************************/
  62
  63#ifndef __iwl_fw_file_h__
  64#define __iwl_fw_file_h__
  65
  66#include <linux/netdevice.h>
  67
  68/* v1/v2 uCode file layout */
  69struct iwl_ucode_header {
  70        __le32 ver;     /* major/minor/API/serial */
  71        union {
  72                struct {
  73                        __le32 inst_size;       /* bytes of runtime code */
  74                        __le32 data_size;       /* bytes of runtime data */
  75                        __le32 init_size;       /* bytes of init code */
  76                        __le32 init_data_size;  /* bytes of init data */
  77                        __le32 boot_size;       /* bytes of bootstrap code */
  78                        u8 data[0];             /* in same order as sizes */
  79                } v1;
  80                struct {
  81                        __le32 build;           /* build number */
  82                        __le32 inst_size;       /* bytes of runtime code */
  83                        __le32 data_size;       /* bytes of runtime data */
  84                        __le32 init_size;       /* bytes of init code */
  85                        __le32 init_data_size;  /* bytes of init data */
  86                        __le32 boot_size;       /* bytes of bootstrap code */
  87                        u8 data[0];             /* in same order as sizes */
  88                } v2;
  89        } u;
  90};
  91
  92/*
  93 * new TLV uCode file layout
  94 *
  95 * The new TLV file format contains TLVs, that each specify
  96 * some piece of data. To facilitate "groups", for example
  97 * different instruction image with different capabilities,
  98 * bundled with the same init image, an alternative mechanism
  99 * is provided:
 100 * When the alternative field is 0, that means that the item
 101 * is always valid. When it is non-zero, then it is only
 102 * valid in conjunction with items of the same alternative,
 103 * in which case the driver (user) selects one alternative
 104 * to use.
 105 */
 106
 107enum iwl_ucode_tlv_type {
 108        IWL_UCODE_TLV_INVALID           = 0, /* unused */
 109        IWL_UCODE_TLV_INST              = 1,
 110        IWL_UCODE_TLV_DATA              = 2,
 111        IWL_UCODE_TLV_INIT              = 3,
 112        IWL_UCODE_TLV_INIT_DATA         = 4,
 113        IWL_UCODE_TLV_BOOT              = 5,
 114        IWL_UCODE_TLV_PROBE_MAX_LEN     = 6, /* a u32 value */
 115        IWL_UCODE_TLV_PAN               = 7,
 116        IWL_UCODE_TLV_RUNT_EVTLOG_PTR   = 8,
 117        IWL_UCODE_TLV_RUNT_EVTLOG_SIZE  = 9,
 118        IWL_UCODE_TLV_RUNT_ERRLOG_PTR   = 10,
 119        IWL_UCODE_TLV_INIT_EVTLOG_PTR   = 11,
 120        IWL_UCODE_TLV_INIT_EVTLOG_SIZE  = 12,
 121        IWL_UCODE_TLV_INIT_ERRLOG_PTR   = 13,
 122        IWL_UCODE_TLV_ENHANCE_SENS_TBL  = 14,
 123        IWL_UCODE_TLV_PHY_CALIBRATION_SIZE = 15,
 124        IWL_UCODE_TLV_WOWLAN_INST       = 16,
 125        IWL_UCODE_TLV_WOWLAN_DATA       = 17,
 126        IWL_UCODE_TLV_FLAGS             = 18,
 127        IWL_UCODE_TLV_SEC_RT            = 19,
 128        IWL_UCODE_TLV_SEC_INIT          = 20,
 129        IWL_UCODE_TLV_SEC_WOWLAN        = 21,
 130        IWL_UCODE_TLV_DEF_CALIB         = 22,
 131        IWL_UCODE_TLV_PHY_SKU           = 23,
 132};
 133
 134struct iwl_ucode_tlv {
 135        __le16 type;            /* see above */
 136        __le16 alternative;     /* see comment */
 137        __le32 length;          /* not including type/length fields */
 138        u8 data[0];
 139};
 140
 141#define IWL_TLV_UCODE_MAGIC     0x0a4c5749
 142
 143struct iwl_tlv_ucode_header {
 144        /*
 145         * The TLV style ucode header is distinguished from
 146         * the v1/v2 style header by first four bytes being
 147         * zero, as such is an invalid combination of
 148         * major/minor/API/serial versions.
 149         */
 150        __le32 zero;
 151        __le32 magic;
 152        u8 human_readable[64];
 153        __le32 ver;             /* major/minor/API/serial */
 154        __le32 build;
 155        __le64 alternatives;    /* bitmask of valid alternatives */
 156        /*
 157         * The data contained herein has a TLV layout,
 158         * see above for the TLV header and types.
 159         * Note that each TLV is padded to a length
 160         * that is a multiple of 4 for alignment.
 161         */
 162        u8 data[0];
 163};
 164
 165#endif  /* __iwl_fw_file_h__ */
 166