=======>kernel panic
On current vanila driver code (when running on SMP systems), panic happens
almost every time. My patch for version 2.6.31 (and 2.6.31.6 too):
@@ -36,9 +36,6 @@ static void led_turn_on(struct work_stru
if (priv->mode == NL80211_IFTYPE_UNSPECIFIED)
return ;
- /* Skip if the LED is not registered. */
- if (!led->dev)
- return;
mutex_lock(&priv->conf_mutex);
switch (led->ledpin) {
case LED_PIN_GPIO0:
@@ -74,9 +71,6 @@ static void led_turn_off(struct work_str
if (priv->mode == NL80211_IFTYPE_UNSPECIFIED)
return ;
- /* Skip if the LED is not registered. */
- if (!led->dev)
- return;
mutex_lock(&priv->conf_mutex);
switch (led->ledpin) {
case LED_PIN_GPIO0:
@@ -208,12 +202,12 @@ void rtl8187_leds_exit(struct ieee80211_
{
struct rtl8187_priv *priv = dev->priv;
- /* turn the LED off before exiting */
- queue_delayed_work(dev->workqueue, &priv->led_off, 0);
- cancel_delayed_work_sync(&priv->led_off);
- cancel_delayed_work_sync(&priv->led_on);
rtl8187_unregister_led(&priv->led_rx);
rtl8187_unregister_led(&priv->led_tx);
+ cancel_delayed_work_sync(&priv->led_on);
+ /* turn the LED off before exiting */
+ queue_delayed_work(dev->workqueue, &priv->led_off, 0);
+ flush_workqueue(dev->workqueue);
}
#endif /* def CONFIG_RTL8187_LED */