From 9236928f155e9e4ae19310359518cedab4e64450 Mon Sep 17 00:00:00 2001 From: Mike McCormack Date: Sun, 6 Feb 2011 22:55:52 +0900 Subject: [PATCH] staging: rtl8192e: Use spin_lock, just one exit path Signed-off-by: Mike McCormack Signed-off-by: Greg Kroah-Hartman --- drivers/staging/rtl8192e/r8192E_core.c | 26 +++++++++++--------------- 1 file changed, 11 insertions(+), 15 deletions(-) diff --git a/drivers/staging/rtl8192e/r8192E_core.c b/drivers/staging/rtl8192e/r8192E_core.c index 4f19ac483e95..29c36c489016 100644 --- a/drivers/staging/rtl8192e/r8192E_core.c +++ b/drivers/staging/rtl8192e/r8192E_core.c @@ -1977,11 +1977,10 @@ void rtl8192_hw_wakeup_wq (struct work_struct *work) static void rtl8192_hw_to_sleep(struct net_device *dev, u32 th, u32 tl) { struct r8192_priv *priv = ieee80211_priv(dev); - + u32 tmp; u32 rb = jiffies; - unsigned long flags; - spin_lock_irqsave(&priv->ps_lock,flags); + spin_lock(&priv->ps_lock); // Writing HW register with 0 equals to disable // the timer, that is not really what we want @@ -1994,28 +1993,25 @@ static void rtl8192_hw_to_sleep(struct net_device *dev, u32 th, u32 tl) // if(((tl>=rb)&& (tl-rb) <= MSECS(MIN_SLEEP_TIME)) ||((rb>tl)&& (rb-tl) < MSECS(MIN_SLEEP_TIME))) { - spin_unlock_irqrestore(&priv->ps_lock,flags); printk("too short to sleep::%x, %x, %lx\n",tl, rb, MSECS(MIN_SLEEP_TIME)); - return; + goto out_unlock; } if(((tl > rb) && ((tl-rb) > MSECS(MAX_SLEEP_TIME)))|| ((tl < rb) && (tl>MSECS(69)) && ((rb-tl) > MSECS(MAX_SLEEP_TIME)))|| ((tlMSECS(MAX_SLEEP_TIME)))) { printk("========>too long to sleep:%x, %x, %lx\n", tl, rb, MSECS(MAX_SLEEP_TIME)); - spin_unlock_irqrestore(&priv->ps_lock,flags); - return; - } - { - u32 tmp = (tl>rb)?(tl-rb):(rb-tl); - queue_delayed_work(priv->ieee80211->wq, - &priv->ieee80211->hw_wakeup_wq,tmp); - //PowerSave not supported when kernel version less 2.6.20 + goto out_unlock; } + + tmp = (tl>rb)?(tl-rb):(rb-tl); queue_delayed_work(priv->ieee80211->wq, - (void *)&priv->ieee80211->hw_sleep_wq,0); - spin_unlock_irqrestore(&priv->ps_lock,flags); + &priv->ieee80211->hw_wakeup_wq,tmp); + queue_delayed_work(priv->ieee80211->wq, + (void *)&priv->ieee80211->hw_sleep_wq,0); +out_unlock: + spin_unlock(&priv->ps_lock); } static void rtl8192_init_priv_variable(struct net_device* dev) -- 2.11.4.GIT