iwlwifi: Probe Flow - Performing allocation in a separate function
authorAssaf Krauss <assaf.krauss@intel.com>
Fri, 14 Mar 2008 17:38:48 +0000 (10:38 -0700)
committerJohn W. Linville <linville@tuxdriver.com>
Tue, 25 Mar 2008 20:41:51 +0000 (16:41 -0400)
Performing allocation in a separate function (previously handled in
'probe')

Signed-off-by: Assaf Krauss <assaf.krauss@intel.com>
Signed-off-by: Tomas Winkler <tomas.winkler@intel.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
drivers/net/wireless/iwlwifi/iwl-core.c
drivers/net/wireless/iwlwifi/iwl-core.h
drivers/net/wireless/iwlwifi/iwl4965-base.c

index 3a9fc90..244318a 100644 (file)
 #include <linux/kernel.h>
 #include <linux/module.h>
 #include <linux/version.h>
+#include <net/mac80211.h>
 
 struct iwl_priv; /* FIXME: remove */
 #include "iwl-debug.h"
 #include "iwl-eeprom.h"
 #include "iwl-core.h"
 
+#include "iwl-4965.h" /* FIXME: remove */
+
 MODULE_DESCRIPTION("iwl core");
 MODULE_VERSION(IWLWIFI_VERSION);
 MODULE_AUTHOR(DRV_COPYRIGHT);
@@ -44,3 +47,27 @@ MODULE_LICENSE("GPL");
 u32 iwl_debug_level;
 EXPORT_SYMBOL(iwl_debug_level);
 #endif
+
+/* This function both allocates and initializes hw and priv. */
+struct ieee80211_hw *iwl_alloc_all(struct iwl_cfg *cfg,
+               struct ieee80211_ops *hw_ops)
+{
+       struct iwl_priv *priv;
+
+       /* mac80211 allocates memory for this device instance, including
+        *   space for this driver's private structure */
+       struct ieee80211_hw *hw =
+               ieee80211_alloc_hw(sizeof(struct iwl_priv), hw_ops);
+       if (hw == NULL) {
+               IWL_ERROR("Can not allocate network device\n");
+               goto out;
+       }
+
+       priv = hw->priv;
+       priv->hw = hw;
+
+out:
+       return hw;
+}
+EXPORT_SYMBOL(iwl_alloc_all);
+
index fb4ce08..33bef1f 100644 (file)
@@ -103,4 +103,11 @@ struct iwl_cfg {
        const struct iwl_mod_params *mod_params;
 };
 
+/***************************
+ *   L i b                 *
+ ***************************/
+
+struct ieee80211_hw *iwl_alloc_all(struct iwl_cfg *cfg,
+               struct ieee80211_ops *hw_ops);
+
 #endif /* __iwl_core_h__ */
index 465918c..a8fa1bf 100644 (file)
@@ -8531,21 +8531,18 @@ static int iwl4965_pci_probe(struct pci_dev *pdev, const struct pci_device_id *e
                iwl4965_hw_ops.hw_scan = NULL;
        }
 
-       /* mac80211 allocates memory for this device instance, including
-        *   space for this driver's private structure */
-       hw = ieee80211_alloc_hw(sizeof(struct iwl_priv), &iwl4965_hw_ops);
-       if (hw == NULL) {
-               IWL_ERROR("Can not allocate network device\n");
+       hw = iwl_alloc_all(cfg, &iwl4965_hw_ops);
+       if (!hw) {
                err = -ENOMEM;
                goto out;
        }
+       priv = hw->priv;
+       /* At this point both hw and priv are allocated. */
+
        SET_IEEE80211_DEV(hw, &pdev->dev);
 
        IWL_DEBUG_INFO("*** LOAD DRIVER ***\n");
-       priv = hw->priv;
-       priv->hw = hw;
        priv->cfg = cfg;
-
        priv->pci_dev = pdev;
 
 #ifdef CONFIG_IWLWIFI_DEBUG