iwlwifi: fix rfkill memory error
authorMohamed Abbas <mabbas@linux.intel.com>
Thu, 3 Apr 2008 23:05:24 +0000 (16:05 -0700)
committerJohn W. Linville <linville@tuxdriver.com>
Tue, 8 Apr 2008 20:44:42 +0000 (16:44 -0400)
Do not free reference to device twice. After rfkill registration succeeds
we only need to call rfkill_unregister() and not rfkill_free().
Also add some debugging.

Signed-off-by: Mohamed Abbas <mabbas@linux.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-core.c
drivers/net/wireless/iwlwifi/iwl-rfkill.c
drivers/net/wireless/iwlwifi/iwl-rfkill.h

index f122307805557a7ee506f407df5336bcf6012204..d8a226e68ed1645a23cef1c0de7dbe7db7444124 100644 (file)
@@ -256,9 +256,13 @@ EXPORT_SYMBOL(iwl_setup);
 int iwlcore_low_level_notify(struct iwl_priv *priv,
                              enum iwlcore_card_notify notify)
 {
+       int ret;
        switch (notify) {
        case IWLCORE_INIT_EVT:
-               iwl_rfkill_init(priv);
+               ret = iwl_rfkill_init(priv);
+               if (ret)
+                       IWL_ERROR("Unable to initialize RFKILL system. "
+                                 "Ignoring error: %d\n", ret);
                break;
        case IWLCORE_START_EVT:
                break;
@@ -266,7 +270,6 @@ int iwlcore_low_level_notify(struct iwl_priv *priv,
                break;
        case IWLCORE_REMOVE_EVT:
                iwl_rfkill_unregister(priv);
-               iwl_rfkill_free(priv);
                break;
        }
 
index 308d69b184045de8f1b176a6613e887cc43badb2..8f38c24491cd06a16b08ae83b10f59c2695c73f0 100644 (file)
@@ -75,8 +75,10 @@ int iwl_rfkill_init(struct iwl_priv *priv)
 
        BUG_ON(device == NULL);
 
+       IWL_DEBUG_RF_KILL("Initializing RFKILL.\n");
        priv->rfkill_mngr.rfkill = rfkill_allocate(device, RFKILL_TYPE_WLAN);
        if (!priv->rfkill_mngr.rfkill) {
+               IWL_ERROR("Unable to allocate rfkill device.\n");
                ret = -ENOMEM;
                goto error;
        }
@@ -92,6 +94,7 @@ int iwl_rfkill_init(struct iwl_priv *priv)
 
        priv->rfkill_mngr.input_dev = input_allocate_device();
        if (!priv->rfkill_mngr.input_dev) {
+               IWL_ERROR("Unable to allocate rfkill input device.\n");
                ret = -ENOMEM;
                goto freed_rfkill;
        }
@@ -105,27 +108,35 @@ int iwl_rfkill_init(struct iwl_priv *priv)
        set_bit(KEY_WLAN, priv->rfkill_mngr.input_dev->keybit);
 
        ret = rfkill_register(priv->rfkill_mngr.rfkill);
-       if (ret)
+       if (ret) {
+               IWL_ERROR("Unable to register rfkill: %d\n", ret);
                goto free_input_dev;
+       }
 
        ret = input_register_device(priv->rfkill_mngr.input_dev);
-       if (ret)
+       if (ret) {
+               IWL_ERROR("Unable to register rfkill input device: %d\n", ret);
                goto unregister_rfkill;
+       }
 
+       IWL_DEBUG_RF_KILL("RFKILL initialization complete.\n");
        return ret;
 
 unregister_rfkill:
        rfkill_unregister(priv->rfkill_mngr.rfkill);
+       priv->rfkill_mngr.rfkill = NULL;
 
 free_input_dev:
        input_free_device(priv->rfkill_mngr.input_dev);
        priv->rfkill_mngr.input_dev = NULL;
 
 freed_rfkill:
-       rfkill_free(priv->rfkill_mngr.rfkill);
+       if (priv->rfkill_mngr.rfkill != NULL)
+               rfkill_free(priv->rfkill_mngr.rfkill);
        priv->rfkill_mngr.rfkill = NULL;
 
 error:
+       IWL_DEBUG_RF_KILL("RFKILL initialization complete.\n");
        return ret;
 }
 EXPORT_SYMBOL(iwl_rfkill_init);
@@ -138,19 +149,11 @@ void iwl_rfkill_unregister(struct iwl_priv *priv)
 
        if (priv->rfkill_mngr.rfkill)
                rfkill_unregister(priv->rfkill_mngr.rfkill);
-}
-EXPORT_SYMBOL(iwl_rfkill_unregister);
 
-
-void iwl_rfkill_free(struct iwl_priv *priv)
-{
-       if (priv->rfkill_mngr.input_dev)
-               input_free_device(priv->rfkill_mngr.input_dev);
-
-       if (priv->rfkill_mngr.rfkill)
-               rfkill_free(priv->rfkill_mngr.rfkill);
+       priv->rfkill_mngr.input_dev = NULL;
+       priv->rfkill_mngr.rfkill = NULL;
 }
-EXPORT_SYMBOL(iwl_rfkill_free);
+EXPORT_SYMBOL(iwl_rfkill_unregister);
 
 /* set rf-kill to the right state. */
 void iwl_rfkill_set_hw_state(struct iwl_priv *priv)
index a5cbc5ab45d9b859f0529dbb57b2ebae1defa32e..e7aa51a1db18f20b6e3455c7579c696fd3783d00 100644 (file)
@@ -41,12 +41,10 @@ struct iwl_rfkill_mngr {
 };
 
 void iwl_rfkill_set_hw_state(struct iwl_priv *priv);
-void iwl_rfkill_free(struct iwl_priv *priv);
 void iwl_rfkill_unregister(struct iwl_priv *priv);
 int iwl_rfkill_init(struct iwl_priv *priv);
 #else
 static inline void iwl_rfkill_set_hw_state(struct iwl_priv *priv) {}
-static inline void iwl_rfkill_free(struct iwl_priv *priv) {}
 static inline void iwl_rfkill_unregister(struct iwl_priv *priv) {}
 static inline int iwl_rfkill_init(struct iwl_priv *priv) { return 0; }
 #endif