iwlwifi: store ucode version number
authorChatre, Reinette <reinette.chatre@intel.com>
Tue, 2 Dec 2008 20:14:05 +0000 (12:14 -0800)
committerJohn W. Linville <linville@tuxdriver.com>
Fri, 5 Dec 2008 14:35:55 +0000 (09:35 -0500)
We store the ucode version number as part of
iwl_priv/iwl3945_priv. This enables us to determine
if particular ucode has support for features in order
to have driver support more than one ucode API.

Signed-off-by: Reinette Chatre <reinette.chatre@intel.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
drivers/net/wireless/iwlwifi/iwl-3945-commands.h
drivers/net/wireless/iwlwifi/iwl-3945.h
drivers/net/wireless/iwlwifi/iwl-agn.c
drivers/net/wireless/iwlwifi/iwl-commands.h
drivers/net/wireless/iwlwifi/iwl-dev.h
drivers/net/wireless/iwlwifi/iwl3945-base.c

index 735891a768a20551ce755f08690108782fc6c1ae..daf99ea88e9061a2f96530f7a37be6cd55451fa5 100644 (file)
 #ifndef __iwl_3945_commands_h__
 #define __iwl_3945_commands_h__
 
+/* uCode version contains 4 values: Major/Minor/API/Serial */
+#define IWL_UCODE_MAJOR(ver)   (((ver) & 0xFF000000) >> 24)
+#define IWL_UCODE_MINOR(ver)   (((ver) & 0x00FF0000) >> 16)
+#define IWL_UCODE_API(ver)     (((ver) & 0x0000FF00) >> 8)
+#define IWL_UCODE_SERIAL(ver)  ((ver) & 0x000000FF)
+
 enum {
        REPLY_ALIVE = 0x1,
        REPLY_ERROR = 0x2,
index 2a924c10ff93b63f8a090a4dd8323d263468e4c3..972c4542e5bcd784b2bf97e9fcaf018b47b6f9ee 100644 (file)
@@ -505,7 +505,7 @@ struct fw_desc {
 
 /* uCode file layout */
 struct iwl3945_ucode {
-       __le32 ver;             /* major/minor/subminor */
+       __le32 ver;             /* major/minor/API/serial */
        __le32 inst_size;       /* bytes of runtime instructions */
        __le32 data_size;       /* bytes of runtime data */
        __le32 init_size;       /* bytes of initialization instructions */
@@ -762,6 +762,8 @@ struct iwl3945_priv {
        void __iomem *hw_base;
 
        /* uCode images, save to reload in case of failure */
+       u32 ucode_ver;                  /* ucode version, copy of
+                                          iwl3945_ucode.ver */
        struct fw_desc ucode_code;      /* runtime inst */
        struct fw_desc ucode_data;      /* runtime data original */
        struct fw_desc ucode_data_backup;       /* runtime data save/restore */
index e8368b69d8cd33acade1574da18204d8930ed5de..5912cdec33a77a77283f3c282464fe29aed11a45 100644 (file)
@@ -1575,7 +1575,7 @@ static int iwl_read_ucode(struct iwl_priv *priv)
        const char *name = priv->cfg->fw_name;
        u8 *src;
        size_t len;
-       u32 ver, inst_size, data_size, init_size, init_data_size, boot_size;
+       u32 inst_size, data_size, init_size, init_data_size, boot_size;
 
        /* Ask kernel firmware_class module to get the boot firmware off disk.
         * request_firmware() is synchronous, file is in memory on return. */
@@ -1599,14 +1599,20 @@ static int iwl_read_ucode(struct iwl_priv *priv)
        /* Data from ucode file:  header followed by uCode images */
        ucode = (void *)ucode_raw->data;
 
-       ver = le32_to_cpu(ucode->ver);
+       priv->ucode_ver = le32_to_cpu(ucode->ver);
        inst_size = le32_to_cpu(ucode->inst_size);
        data_size = le32_to_cpu(ucode->data_size);
        init_size = le32_to_cpu(ucode->init_size);
        init_data_size = le32_to_cpu(ucode->init_data_size);
        boot_size = le32_to_cpu(ucode->boot_size);
 
-       IWL_DEBUG_INFO("f/w package hdr ucode version = 0x%x\n", ver);
+       IWL_DEBUG_INFO("f/w package hdr ucode version raw = 0x%x\n",
+                      priv->ucode_ver);
+       IWL_DEBUG_INFO("f/w package hdr ucode version = %u.%u.%u.%u\n",
+                      IWL_UCODE_MAJOR(priv->ucode_ver),
+                      IWL_UCODE_MINOR(priv->ucode_ver),
+                      IWL_UCODE_API(priv->ucode_ver),
+                      IWL_UCODE_SERIAL(priv->ucode_ver));
        IWL_DEBUG_INFO("f/w package hdr runtime inst size = %u\n",
                       inst_size);
        IWL_DEBUG_INFO("f/w package hdr runtime data size = %u\n",
index 9c786db6f90bcbe36d7c37be547d6deb64869427..528bcab49d13a7450a3cb3596e22ed4f7ad3ffe8 100644 (file)
 #ifndef __iwl_commands_h__
 #define __iwl_commands_h__
 
+/* uCode version contains 4 values: Major/Minor/API/Serial */
+#define IWL_UCODE_MAJOR(ver)   (((ver) & 0xFF000000) >> 24)
+#define IWL_UCODE_MINOR(ver)   (((ver) & 0x00FF0000) >> 16)
+#define IWL_UCODE_API(ver)     (((ver) & 0x0000FF00) >> 8)
+#define IWL_UCODE_SERIAL(ver)  ((ver) & 0x000000FF)
+
 enum {
        REPLY_ALIVE = 0x1,
        REPLY_ERROR = 0x2,
index 5f6805bfec3f5e1e888cd1a5fc60576a037ae069..a19fbb5eaae4706d8847b0c6631bd6a678ab64b5 100644 (file)
@@ -462,7 +462,7 @@ struct fw_desc {
 
 /* uCode file layout */
 struct iwl_ucode {
-       __le32 ver;             /* major/minor/subminor */
+       __le32 ver;             /* major/minor/API/serial */
        __le32 inst_size;       /* bytes of runtime instructions */
        __le32 data_size;       /* bytes of runtime data */
        __le32 init_size;       /* bytes of initialization instructions */
@@ -843,6 +843,8 @@ struct iwl_priv {
        u8   rev_id;
 
        /* uCode images, save to reload in case of failure */
+       u32 ucode_ver;                  /* version of ucode, copy of
+                                          iwl_ucode.ver */
        struct fw_desc ucode_code;      /* runtime inst */
        struct fw_desc ucode_data;      /* runtime data original */
        struct fw_desc ucode_data_backup;       /* runtime data save/restore */
index 12ff1121e6dc869d58564afafb22fb0c4e1c6bd3..03ff87fbe9248977e9f661ab9ae3c178b92e40b1 100644 (file)
@@ -5302,7 +5302,7 @@ static int iwl3945_read_ucode(struct iwl3945_priv *priv)
        const char *name = priv->cfg->fw_name;
        u8 *src;
        size_t len;
-       u32 ver, inst_size, data_size, init_size, init_data_size, boot_size;
+       u32 inst_size, data_size, init_size, init_data_size, boot_size;
 
        /* Ask kernel firmware_class module to get the boot firmware off disk.
         * request_firmware() is synchronous, file is in memory on return. */
@@ -5326,14 +5326,20 @@ static int iwl3945_read_ucode(struct iwl3945_priv *priv)
        /* Data from ucode file:  header followed by uCode images */
        ucode = (void *)ucode_raw->data;
 
-       ver = le32_to_cpu(ucode->ver);
+       priv->ucode_ver = le32_to_cpu(ucode->ver);
        inst_size = le32_to_cpu(ucode->inst_size);
        data_size = le32_to_cpu(ucode->data_size);
        init_size = le32_to_cpu(ucode->init_size);
        init_data_size = le32_to_cpu(ucode->init_data_size);
        boot_size = le32_to_cpu(ucode->boot_size);
 
-       IWL_DEBUG_INFO("f/w package hdr ucode version = 0x%x\n", ver);
+       IWL_DEBUG_INFO("f/w package hdr ucode version raw = 0x%x\n",
+                      priv->ucode_ver);
+       IWL_DEBUG_INFO("f/w package hdr ucode version = %u.%u.%u.%u\n",
+                      IWL_UCODE_MAJOR(priv->ucode_ver),
+                      IWL_UCODE_MINOR(priv->ucode_ver),
+                      IWL_UCODE_API(priv->ucode_ver),
+                      IWL_UCODE_SERIAL(priv->ucode_ver));
        IWL_DEBUG_INFO("f/w package hdr runtime inst size = %u\n", inst_size);
        IWL_DEBUG_INFO("f/w package hdr runtime data size = %u\n", data_size);
        IWL_DEBUG_INFO("f/w package hdr init inst size = %u\n", init_size);