aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMohamed Abbas <mabbas@linux.intel.com>2008-04-03 19:05:24 -0400
committerJohn W. Linville <linville@tuxdriver.com>2008-04-08 16:44:42 -0400
commit03d29c684917860f90f897565b297c4aba713e0b (patch)
treee2084248721b540fcaa468b4c0c2d2961e03c6b8
parentfe00b5a5b7e29180e427e58b3d0a185d1dd3f105 (diff)
iwlwifi: fix rfkill memory error
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>
-rw-r--r--drivers/net/wireless/iwlwifi/iwl-core.c7
-rw-r--r--drivers/net/wireless/iwlwifi/iwl-rfkill.c31
-rw-r--r--drivers/net/wireless/iwlwifi/iwl-rfkill.h2
3 files changed, 22 insertions, 18 deletions
diff --git a/drivers/net/wireless/iwlwifi/iwl-core.c b/drivers/net/wireless/iwlwifi/iwl-core.c
index f12230780555..d8a226e68ed1 100644
--- a/drivers/net/wireless/iwlwifi/iwl-core.c
+++ b/drivers/net/wireless/iwlwifi/iwl-core.c
@@ -256,9 +256,13 @@ EXPORT_SYMBOL(iwl_setup);
256int iwlcore_low_level_notify(struct iwl_priv *priv, 256int iwlcore_low_level_notify(struct iwl_priv *priv,
257 enum iwlcore_card_notify notify) 257 enum iwlcore_card_notify notify)
258{ 258{
259 int ret;
259 switch (notify) { 260 switch (notify) {
260 case IWLCORE_INIT_EVT: 261 case IWLCORE_INIT_EVT:
261 iwl_rfkill_init(priv); 262 ret = iwl_rfkill_init(priv);
263 if (ret)
264 IWL_ERROR("Unable to initialize RFKILL system. "
265 "Ignoring error: %d\n", ret);
262 break; 266 break;
263 case IWLCORE_START_EVT: 267 case IWLCORE_START_EVT:
264 break; 268 break;
@@ -266,7 +270,6 @@ int iwlcore_low_level_notify(struct iwl_priv *priv,
266 break; 270 break;
267 case IWLCORE_REMOVE_EVT: 271 case IWLCORE_REMOVE_EVT:
268 iwl_rfkill_unregister(priv); 272 iwl_rfkill_unregister(priv);
269 iwl_rfkill_free(priv);
270 break; 273 break;
271 } 274 }
272 275
diff --git a/drivers/net/wireless/iwlwifi/iwl-rfkill.c b/drivers/net/wireless/iwlwifi/iwl-rfkill.c
index 308d69b18404..8f38c24491cd 100644
--- a/drivers/net/wireless/iwlwifi/iwl-rfkill.c
+++ b/drivers/net/wireless/iwlwifi/iwl-rfkill.c
@@ -75,8 +75,10 @@ int iwl_rfkill_init(struct iwl_priv *priv)
75 75
76 BUG_ON(device == NULL); 76 BUG_ON(device == NULL);
77 77
78 IWL_DEBUG_RF_KILL("Initializing RFKILL.\n");
78 priv->rfkill_mngr.rfkill = rfkill_allocate(device, RFKILL_TYPE_WLAN); 79 priv->rfkill_mngr.rfkill = rfkill_allocate(device, RFKILL_TYPE_WLAN);
79 if (!priv->rfkill_mngr.rfkill) { 80 if (!priv->rfkill_mngr.rfkill) {
81 IWL_ERROR("Unable to allocate rfkill device.\n");
80 ret = -ENOMEM; 82 ret = -ENOMEM;
81 goto error; 83 goto error;
82 } 84 }
@@ -92,6 +94,7 @@ int iwl_rfkill_init(struct iwl_priv *priv)
92 94
93 priv->rfkill_mngr.input_dev = input_allocate_device(); 95 priv->rfkill_mngr.input_dev = input_allocate_device();
94 if (!priv->rfkill_mngr.input_dev) { 96 if (!priv->rfkill_mngr.input_dev) {
97 IWL_ERROR("Unable to allocate rfkill input device.\n");
95 ret = -ENOMEM; 98 ret = -ENOMEM;
96 goto freed_rfkill; 99 goto freed_rfkill;
97 } 100 }
@@ -105,27 +108,35 @@ int iwl_rfkill_init(struct iwl_priv *priv)
105 set_bit(KEY_WLAN, priv->rfkill_mngr.input_dev->keybit); 108 set_bit(KEY_WLAN, priv->rfkill_mngr.input_dev->keybit);
106 109
107 ret = rfkill_register(priv->rfkill_mngr.rfkill); 110 ret = rfkill_register(priv->rfkill_mngr.rfkill);
108 if (ret) 111 if (ret) {
112 IWL_ERROR("Unable to register rfkill: %d\n", ret);
109 goto free_input_dev; 113 goto free_input_dev;
114 }
110 115
111 ret = input_register_device(priv->rfkill_mngr.input_dev); 116 ret = input_register_device(priv->rfkill_mngr.input_dev);
112 if (ret) 117 if (ret) {
118 IWL_ERROR("Unable to register rfkill input device: %d\n", ret);
113 goto unregister_rfkill; 119 goto unregister_rfkill;
120 }
114 121
122 IWL_DEBUG_RF_KILL("RFKILL initialization complete.\n");
115 return ret; 123 return ret;
116 124
117unregister_rfkill: 125unregister_rfkill:
118 rfkill_unregister(priv->rfkill_mngr.rfkill); 126 rfkill_unregister(priv->rfkill_mngr.rfkill);
127 priv->rfkill_mngr.rfkill = NULL;
119 128
120free_input_dev: 129free_input_dev:
121 input_free_device(priv->rfkill_mngr.input_dev); 130 input_free_device(priv->rfkill_mngr.input_dev);
122 priv->rfkill_mngr.input_dev = NULL; 131 priv->rfkill_mngr.input_dev = NULL;
123 132
124freed_rfkill: 133freed_rfkill:
125 rfkill_free(priv->rfkill_mngr.rfkill); 134 if (priv->rfkill_mngr.rfkill != NULL)
135 rfkill_free(priv->rfkill_mngr.rfkill);
126 priv->rfkill_mngr.rfkill = NULL; 136 priv->rfkill_mngr.rfkill = NULL;
127 137
128error: 138error:
139 IWL_DEBUG_RF_KILL("RFKILL initialization complete.\n");
129 return ret; 140 return ret;
130} 141}
131EXPORT_SYMBOL(iwl_rfkill_init); 142EXPORT_SYMBOL(iwl_rfkill_init);
@@ -138,19 +149,11 @@ void iwl_rfkill_unregister(struct iwl_priv *priv)
138 149
139 if (priv->rfkill_mngr.rfkill) 150 if (priv->rfkill_mngr.rfkill)
140 rfkill_unregister(priv->rfkill_mngr.rfkill); 151 rfkill_unregister(priv->rfkill_mngr.rfkill);
141}
142EXPORT_SYMBOL(iwl_rfkill_unregister);
143 152
144 153 priv->rfkill_mngr.input_dev = NULL;
145void iwl_rfkill_free(struct iwl_priv *priv) 154 priv->rfkill_mngr.rfkill = NULL;
146{
147 if (priv->rfkill_mngr.input_dev)
148 input_free_device(priv->rfkill_mngr.input_dev);
149
150 if (priv->rfkill_mngr.rfkill)
151 rfkill_free(priv->rfkill_mngr.rfkill);
152} 155}
153EXPORT_SYMBOL(iwl_rfkill_free); 156EXPORT_SYMBOL(iwl_rfkill_unregister);
154 157
155/* set rf-kill to the right state. */ 158/* set rf-kill to the right state. */
156void iwl_rfkill_set_hw_state(struct iwl_priv *priv) 159void iwl_rfkill_set_hw_state(struct iwl_priv *priv)
diff --git a/drivers/net/wireless/iwlwifi/iwl-rfkill.h b/drivers/net/wireless/iwlwifi/iwl-rfkill.h
index a5cbc5ab45d9..e7aa51a1db18 100644
--- a/drivers/net/wireless/iwlwifi/iwl-rfkill.h
+++ b/drivers/net/wireless/iwlwifi/iwl-rfkill.h
@@ -41,12 +41,10 @@ struct iwl_rfkill_mngr {
41}; 41};
42 42
43void iwl_rfkill_set_hw_state(struct iwl_priv *priv); 43void iwl_rfkill_set_hw_state(struct iwl_priv *priv);
44void iwl_rfkill_free(struct iwl_priv *priv);
45void iwl_rfkill_unregister(struct iwl_priv *priv); 44void iwl_rfkill_unregister(struct iwl_priv *priv);
46int iwl_rfkill_init(struct iwl_priv *priv); 45int iwl_rfkill_init(struct iwl_priv *priv);
47#else 46#else
48static inline void iwl_rfkill_set_hw_state(struct iwl_priv *priv) {} 47static inline void iwl_rfkill_set_hw_state(struct iwl_priv *priv) {}
49static inline void iwl_rfkill_free(struct iwl_priv *priv) {}
50static inline void iwl_rfkill_unregister(struct iwl_priv *priv) {} 48static inline void iwl_rfkill_unregister(struct iwl_priv *priv) {}
51static inline int iwl_rfkill_init(struct iwl_priv *priv) { return 0; } 49static inline int iwl_rfkill_init(struct iwl_priv *priv) { return 0; }
52#endif 50#endif