Search Linux Wireless

RE: [PATCHv2 0/5] Runtime PM support for wlcore

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



> 
> >
> > Here's a modified version of your patch, does that put wlcore to
> > idle with wowlan during suspend for you?
> >
> 
> Still no joy.
> It suspends/resumes ok but leaves the firmware disabled from entering ELP.

Spent some time on it today and looks like adding calls to pm_generic_runtime_suspend ()
And pm_generic_runtime_resume is helping and all seems to work well.
See the modified version of your patch below.
Let me know what you think.

Best Regards,
Eyal

8< ------------------------------
diff --git a/drivers/net/wireless/ti/wlcore/main.c
b/drivers/net/wireless/ti/wlcore/main.c
index 4c297aa..9859e5a 100644
--- a/drivers/net/wireless/ti/wlcore/main.c
+++ b/drivers/net/wireless/ti/wlcore/main.c
@@ -1001,24 +1001,6 @@ static int wlcore_fw_wakeup(struct wl1271 *wl)
     return wlcore_raw_write32(wl, HW_ACCESS_ELP_CTRL_REG, ELPCTRL_WAKE_UP);
 }

-static int wlcore_fw_sleep(struct wl1271 *wl)
-{
-    int ret;
-
-    mutex_lock(&wl->mutex);
-    ret = wlcore_raw_write32(wl, HW_ACCESS_ELP_CTRL_REG, ELPCTRL_SLEEP);
-    if (ret < 0) {
-        wl12xx_queue_recovery_work(wl);
-        goto out;
-    }
-    set_bit(WL1271_FLAG_IN_ELP, &wl->flags);
-out:
-    mutex_unlock(&wl->mutex);
-    mdelay(WL1271_SUSPEND_SLEEP);
-
-    return 0;
-}
-
 static int wl1271_setup(struct wl1271 *wl)
 {
     wl->raw_fw_status = kzalloc(wl->fw_status_len, GFP_KERNEL);
@@ -1742,6 +1724,7 @@ static int wl1271_op_suspend(struct ieee80211_hw *hw,
 {
     struct wl1271 *wl = hw->priv;
     struct wl12xx_vif *wlvif;
+    unsigned long flags;
     int ret;

     wl1271_debug(DEBUG_MAC80211, "mac80211 suspend wow=%d", !!wow);
@@ -1800,19 +1783,6 @@ static int wl1271_op_suspend(struct ieee80211_hw *hw,
     /* flush any remaining work */
     wl1271_debug(DEBUG_MAC80211, "flushing remaining works");

-    /*
-     * disable and re-enable interrupts in order to flush
-     * the threaded_irq
-     */
-    wlcore_disable_interrupts(wl);
-
-    /*
-     * set suspended flag to avoid triggering a new threaded_irq
-     * work. no need for spinlock as interrupts are disabled.
-     */
-    set_bit(WL1271_FLAG_SUSPENDED, &wl->flags);
-
-    wlcore_enable_interrupts(wl);
     flush_work(&wl->tx_work);

     /*
@@ -1822,13 +1792,14 @@ static int wl1271_op_suspend(struct ieee80211_hw *hw,
     cancel_delayed_work(&wl->tx_watchdog_work);

     /*
-     * Use an immediate call for allowing the firmware to go into power
-     * save during suspend.
-     * Using a workque for this last write was only hapenning on resume
-     * leaving the firmware with power save disabled during suspend,
-     * while consuming full power during wowlan suspend.
+     * set suspended flag to avoid triggering a new threaded_irq
+     * work.
      */
-    wlcore_fw_sleep(wl);
+    spin_lock_irqsave(&wl->wl_lock, flags);
+    set_bit(WL1271_FLAG_SUSPENDED, &wl->flags);
+    spin_unlock_irqrestore(&wl->wl_lock, flags);
+
+    pm_generic_runtime_suspend(wl->dev);

     return 0;
 }
@@ -1845,6 +1816,8 @@ static int wl1271_op_resume(struct ieee80211_hw *hw)
              wl->wow_enabled);
     WARN_ON(!wl->wow_enabled);

+    pm_generic_runtime_resume(wl->dev);
+
     /*
      * re-enable irq_work enqueuing, and call irq_work directly if
      * there is a pending work.




[Index of Archives]     [Linux Host AP]     [ATH6KL]     [Linux Wireless Personal Area Network]     [Linux Bluetooth]     [Wireless Regulations]     [Linux Netdev]     [Kernel Newbies]     [Linux Kernel]     [IDE]     [Git]     [Netfilter]     [Bugtraq]     [Yosemite Hiking]     [MIPS Linux]     [ARM Linux]     [Linux RAID]

  Powered by Linux