Commit e37ea213 authored by Ivo van Doorn's avatar Ivo van Doorn Committed by David S. Miller

rt2x00: Move start() and stop() handlers into rt2x00lib.c

suspend & resume was broken since it called rt2x00mac_start()
and rt2x00mac_stop() which would fail to execute because the
DEVICE_PRESENT flag was not set.

Move the start and stop handlers into rt2x00lib.c which are called
from rt2x00mac_start() and rt2x00mac_stop() after they have checked
the DEVICE_PRESENT flag, while suspend and resume handlers can
directly call those functions.
Signed-off-by: default avatarIvo van Doorn <IvDoorn@gmail.com>
Signed-off-by: default avatarJohn W. Linville <linville@tuxdriver.com>
parent 04267104
...@@ -1046,7 +1046,7 @@ static void rt2x00lib_free_ring_entries(struct rt2x00_dev *rt2x00dev) ...@@ -1046,7 +1046,7 @@ static void rt2x00lib_free_ring_entries(struct rt2x00_dev *rt2x00dev)
} }
} }
void rt2x00lib_uninitialize(struct rt2x00_dev *rt2x00dev) static void rt2x00lib_uninitialize(struct rt2x00_dev *rt2x00dev)
{ {
if (!__test_and_clear_bit(DEVICE_INITIALIZED, &rt2x00dev->flags)) if (!__test_and_clear_bit(DEVICE_INITIALIZED, &rt2x00dev->flags))
return; return;
...@@ -1067,7 +1067,7 @@ void rt2x00lib_uninitialize(struct rt2x00_dev *rt2x00dev) ...@@ -1067,7 +1067,7 @@ void rt2x00lib_uninitialize(struct rt2x00_dev *rt2x00dev)
rt2x00lib_free_ring_entries(rt2x00dev); rt2x00lib_free_ring_entries(rt2x00dev);
} }
int rt2x00lib_initialize(struct rt2x00_dev *rt2x00dev) static int rt2x00lib_initialize(struct rt2x00_dev *rt2x00dev)
{ {
int status; int status;
...@@ -1110,6 +1110,58 @@ exit: ...@@ -1110,6 +1110,58 @@ exit:
return status; return status;
} }
int rt2x00lib_start(struct rt2x00_dev *rt2x00dev)
{
int retval;
if (test_bit(DEVICE_STARTED, &rt2x00dev->flags))
return 0;
/*
* If this is the first interface which is added,
* we should load the firmware now.
*/
if (test_bit(DRIVER_REQUIRE_FIRMWARE, &rt2x00dev->flags)) {
retval = rt2x00lib_load_firmware(rt2x00dev);
if (retval)
return retval;
}
/*
* Initialize the device.
*/
retval = rt2x00lib_initialize(rt2x00dev);
if (retval)
return retval;
/*
* Enable radio.
*/
retval = rt2x00lib_enable_radio(rt2x00dev);
if (retval) {
rt2x00lib_uninitialize(rt2x00dev);
return retval;
}
__set_bit(DEVICE_STARTED, &rt2x00dev->flags);
return 0;
}
void rt2x00lib_stop(struct rt2x00_dev *rt2x00dev)
{
if (!test_bit(DEVICE_STARTED, &rt2x00dev->flags))
return;
/*
* Perhaps we can add something smarter here,
* but for now just disabling the radio should do.
*/
rt2x00lib_disable_radio(rt2x00dev);
__clear_bit(DEVICE_STARTED, &rt2x00dev->flags);
}
/* /*
* driver allocation handlers. * driver allocation handlers.
*/ */
...@@ -1295,7 +1347,7 @@ int rt2x00lib_suspend(struct rt2x00_dev *rt2x00dev, pm_message_t state) ...@@ -1295,7 +1347,7 @@ int rt2x00lib_suspend(struct rt2x00_dev *rt2x00dev, pm_message_t state)
* Disable radio and unitialize all items * Disable radio and unitialize all items
* that must be recreated on resume. * that must be recreated on resume.
*/ */
rt2x00mac_stop(rt2x00dev->hw); rt2x00lib_stop(rt2x00dev);
rt2x00lib_uninitialize(rt2x00dev); rt2x00lib_uninitialize(rt2x00dev);
rt2x00debug_deregister(rt2x00dev); rt2x00debug_deregister(rt2x00dev);
...@@ -1317,7 +1369,6 @@ int rt2x00lib_resume(struct rt2x00_dev *rt2x00dev) ...@@ -1317,7 +1369,6 @@ int rt2x00lib_resume(struct rt2x00_dev *rt2x00dev)
int retval; int retval;
NOTICE(rt2x00dev, "Waking up.\n"); NOTICE(rt2x00dev, "Waking up.\n");
__set_bit(DEVICE_PRESENT, &rt2x00dev->flags);
/* /*
* Open the debugfs entry. * Open the debugfs entry.
...@@ -1333,7 +1384,7 @@ int rt2x00lib_resume(struct rt2x00_dev *rt2x00dev) ...@@ -1333,7 +1384,7 @@ int rt2x00lib_resume(struct rt2x00_dev *rt2x00dev)
/* /*
* Reinitialize device and all active interfaces. * Reinitialize device and all active interfaces.
*/ */
retval = rt2x00mac_start(rt2x00dev->hw); retval = rt2x00lib_start(rt2x00dev);
if (retval) if (retval)
goto exit; goto exit;
...@@ -1348,6 +1399,11 @@ int rt2x00lib_resume(struct rt2x00_dev *rt2x00dev) ...@@ -1348,6 +1399,11 @@ int rt2x00lib_resume(struct rt2x00_dev *rt2x00dev)
rt2x00lib_config_bssid(rt2x00dev, intf->bssid); rt2x00lib_config_bssid(rt2x00dev, intf->bssid);
rt2x00lib_config_type(rt2x00dev, intf->type); rt2x00lib_config_type(rt2x00dev, intf->type);
/*
* We are ready again to receive requests from mac80211.
*/
__set_bit(DEVICE_PRESENT, &rt2x00dev->flags);
/* /*
* It is possible that during that mac80211 has attempted * It is possible that during that mac80211 has attempted
* to send frames while we were suspending or resuming. * to send frames while we were suspending or resuming.
......
...@@ -44,8 +44,8 @@ void rt2x00lib_reset_link_tuner(struct rt2x00_dev *rt2x00dev); ...@@ -44,8 +44,8 @@ void rt2x00lib_reset_link_tuner(struct rt2x00_dev *rt2x00dev);
/* /*
* Initialization handlers. * Initialization handlers.
*/ */
int rt2x00lib_initialize(struct rt2x00_dev *rt2x00dev); int rt2x00lib_start(struct rt2x00_dev *rt2x00dev);
void rt2x00lib_uninitialize(struct rt2x00_dev *rt2x00dev); void rt2x00lib_stop(struct rt2x00_dev *rt2x00dev);
/* /*
* Configuration handlers. * Configuration handlers.
......
...@@ -139,41 +139,11 @@ EXPORT_SYMBOL_GPL(rt2x00mac_tx); ...@@ -139,41 +139,11 @@ EXPORT_SYMBOL_GPL(rt2x00mac_tx);
int rt2x00mac_start(struct ieee80211_hw *hw) int rt2x00mac_start(struct ieee80211_hw *hw)
{ {
struct rt2x00_dev *rt2x00dev = hw->priv; struct rt2x00_dev *rt2x00dev = hw->priv;
int status;
if (!test_bit(DEVICE_PRESENT, &rt2x00dev->flags) || if (!test_bit(DEVICE_PRESENT, &rt2x00dev->flags))
test_bit(DEVICE_STARTED, &rt2x00dev->flags))
return 0; return 0;
/* return rt2x00lib_start(rt2x00dev);
* If this is the first interface which is added,
* we should load the firmware now.
*/
if (test_bit(DRIVER_REQUIRE_FIRMWARE, &rt2x00dev->flags)) {
status = rt2x00lib_load_firmware(rt2x00dev);
if (status)
return status;
}
/*
* Initialize the device.
*/
status = rt2x00lib_initialize(rt2x00dev);
if (status)
return status;
/*
* Enable radio.
*/
status = rt2x00lib_enable_radio(rt2x00dev);
if (status) {
rt2x00lib_uninitialize(rt2x00dev);
return status;
}
__set_bit(DEVICE_STARTED, &rt2x00dev->flags);
return 0;
} }
EXPORT_SYMBOL_GPL(rt2x00mac_start); EXPORT_SYMBOL_GPL(rt2x00mac_start);
...@@ -184,13 +154,7 @@ void rt2x00mac_stop(struct ieee80211_hw *hw) ...@@ -184,13 +154,7 @@ void rt2x00mac_stop(struct ieee80211_hw *hw)
if (!test_bit(DEVICE_PRESENT, &rt2x00dev->flags)) if (!test_bit(DEVICE_PRESENT, &rt2x00dev->flags))
return; return;
/* rt2x00lib_stop(rt2x00dev);
* Perhaps we can add something smarter here,
* but for now just disabling the radio should do.
*/
rt2x00lib_disable_radio(rt2x00dev);
__clear_bit(DEVICE_STARTED, &rt2x00dev->flags);
} }
EXPORT_SYMBOL_GPL(rt2x00mac_stop); EXPORT_SYMBOL_GPL(rt2x00mac_stop);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment