iwlwifi: check eeprom version in pci probe time
authorTomas Winkler <tomas.winkler@intel.com>
Thu, 24 Apr 2008 00:14:55 +0000 (17:14 -0700)
committerJohn W. Linville <linville@tuxdriver.com>
Wed, 7 May 2008 19:02:17 +0000 (15:02 -0400)
This patch move eeprom version checking into pci probe stage

Signed-off-by: Tomas Winkler <tomas.winkler@intel.com>
Signed-off-by: Reinette Chatre <reinette.chatre@intel.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
drivers/net/wireless/iwlwifi/iwl-4965.c
drivers/net/wireless/iwlwifi/iwl-eeprom.c
drivers/net/wireless/iwlwifi/iwl-eeprom.h
drivers/net/wireless/iwlwifi/iwl4965-base.c

index d1ddbf34b7fe5b38cd9189089c1d2a0dffe7ed69..a41a83a5f81629ae9ce4ebdd45c65438e8d80837 100644 (file)
@@ -494,6 +494,31 @@ int iwl4965_hw_rxq_stop(struct iwl_priv *priv)
        return 0;
 }
 
+/*
+ * EEPROM handlers
+ */
+
+static int iwl4965_eeprom_check_version(struct iwl_priv *priv)
+{
+       u16 eeprom_ver;
+       u16 calib_ver;
+
+       eeprom_ver = iwl_eeprom_query16(priv, EEPROM_VERSION);
+
+       calib_ver = iwl_eeprom_query16(priv, EEPROM_4965_CALIB_VERSION_OFFSET);
+
+       if (eeprom_ver < EEPROM_4965_EEPROM_VERSION ||
+           calib_ver < EEPROM_4965_TX_POWER_VERSION)
+               goto err;
+
+       return 0;
+err:
+       IWL_ERROR("Unsuported EEPROM VER=0x%x < 0x%x CALIB=0x%x < 0x%x\n",
+                 eeprom_ver, EEPROM_4965_EEPROM_VERSION,
+                 calib_ver, EEPROM_4965_TX_POWER_VERSION);
+       return -EINVAL;
+
+}
 int iwl4965_set_pwr_src(struct iwl_priv *priv, enum iwl_pwr_src src)
 {
        int ret;
@@ -763,12 +788,6 @@ int iwl4965_hw_nic_init(struct iwl_priv *priv)
 
        spin_unlock_irqrestore(&priv->lock, flags);
 
-       if (iwl_eeprom_query16(priv, EEPROM_4965_CALIB_VERSION_OFFSET) <
-               EEPROM_4965_TX_POWER_VERSION) {
-               IWL_ERROR("Older EEPROM detected!  Aborting.\n");
-               return -EINVAL;
-       }
-
        pci_read_config_byte(priv->pci_dev, PCI_LINK_CTRL, &val_link);
 
        /* disable L1 entry -- workaround for pre-B1 */
@@ -4354,6 +4373,7 @@ static struct iwl_lib_ops iwl4965_lib = {
                .verify_signature  = iwlcore_eeprom_verify_signature,
                .acquire_semaphore = iwlcore_eeprom_acquire_semaphore,
                .release_semaphore = iwlcore_eeprom_release_semaphore,
+               .check_version = iwl4965_eeprom_check_version,
                .query_addr = iwlcore_eeprom_query_addr,
        },
        .radio_kill_sw = iwl4965_radio_kill_sw,
index efd48ca27a8e6c214c378f86aec4cad87ae4f571..8bec0e32f1fcc5a226c03ec3922c062d8284db25 100644 (file)
@@ -279,6 +279,11 @@ void iwl_eeprom_free(struct iwl_priv *priv)
 }
 EXPORT_SYMBOL(iwl_eeprom_free);
 
+int iwl_eeprom_check_version(struct iwl_priv *priv)
+{
+       return priv->cfg->ops->lib->eeprom_ops.check_version(priv);
+}
+EXPORT_SYMBOL(iwl_eeprom_check_version);
 
 const u8 *iwl_eeprom_query_addr(const struct iwl_priv *priv, size_t offset)
 {
@@ -423,12 +428,6 @@ int iwl_init_channel_map(struct iwl_priv *priv)
                return 0;
        }
 
-       if (iwl_eeprom_query16(priv, EEPROM_VERSION) < 0x2f) {
-               IWL_WARNING("Unsupported EEPROM version: 0x%04X\n",
-                           iwl_eeprom_query16(priv, EEPROM_VERSION));
-               return -EINVAL;
-       }
-
        IWL_DEBUG_INFO("Initializing regulatory info from EEPROM\n");
 
        priv->channel_count =
index d5768146d02f951118cbcc322db1091696067040..57fb89d5621bf5bf6a561cda8522aedad5559d5f 100644 (file)
@@ -134,6 +134,7 @@ struct iwl_eeprom_channel {
 /* 4965 Specific */
 /* 4965 driver does not work with txpower calibration version < 5 */
 #define EEPROM_4965_TX_POWER_VERSION    (5)
+#define EEPROM_4965_EEPROM_VERSION     (0x2f)
 #define EEPROM_4965_CALIB_VERSION_OFFSET       (2*0xB6) /* 2 bytes */
 #define EEPROM_4965_CALIB_TXPOWER_OFFSET       (2*0xE8) /* 48  bytes */
 #define EEPROM_4965_BOARD_REVISION             (2*0x4F) /* 2 bytes */
@@ -322,6 +323,7 @@ struct iwl_eeprom_ops {
        int (*verify_signature) (struct iwl_priv *priv);
        int (*acquire_semaphore) (struct iwl_priv *priv);
        void (*release_semaphore) (struct iwl_priv *priv);
+       int (*check_version) (struct iwl_priv *priv);
        const u8* (*query_addr) (const struct iwl_priv *priv, size_t offset);
 };
 
@@ -329,6 +331,7 @@ struct iwl_eeprom_ops {
 void iwl_eeprom_get_mac(const struct iwl_priv *priv, u8 *mac);
 int iwl_eeprom_init(struct iwl_priv *priv);
 void iwl_eeprom_free(struct iwl_priv *priv);
+int  iwl_eeprom_check_version(struct iwl_priv *priv);
 const u8 *iwl_eeprom_query_addr(const struct iwl_priv *priv, size_t offset);
 u16 iwl_eeprom_query16(const struct iwl_priv *priv, size_t offset);
 
index 368fc9a9c2b0a610dfd7c67170decf4e3c6e8246..c532584b11e61d0523cb01319ebfb5cc10b22b8a 100644 (file)
@@ -7479,6 +7479,10 @@ static int iwl4965_pci_probe(struct pci_dev *pdev, const struct pci_device_id *e
                IWL_ERROR("Unable to init EEPROM\n");
                goto out_iounmap;
        }
+       err = iwl_eeprom_check_version(priv);
+       if (err)
+               goto out_iounmap;
+
        /* MAC Address location in EEPROM same for 3945/4965 */
        iwl_eeprom_get_mac(priv, priv->mac_addr);
        IWL_DEBUG_INFO("MAC address: %s\n", print_mac(mac, priv->mac_addr));