]> rtime.felk.cvut.cz Git - sojka/nv-tegra/linux-3.10.git/commitdiff
net: wireless: bcmdhd: Fix PM struck at 0 on AGO origin/rel-st8-l-r1-shieldtablet8 daily-2014.11.28.0_rel-st8-l-r1-partner-shieldtablet8
authorShital Jaju <shital.jaju@broadcom.com>
Tue, 18 Nov 2014 10:40:48 +0000 (16:10 +0530)
committerTodd Poynter <tpoynter@nvidia.com>
Wed, 19 Nov 2014 05:25:42 +0000 (21:25 -0800)
Issue: wlan0 interface power save got disable and
not restored on AGO create and delete within 10sec.

Reason: On AGO creation PM of wlan0 and AGO is disabled
for 10sec to renew the DHCP and this is not restored
properly on AGO remove case.

Solution: Restore the wlan0 power save on AGO delete.

Bug 200016171

Change-Id: I4b255ed5326a01fbd52e6d745e6bec6824279b55
(cherry picked from commit d72e363c0f260d2a2a66cf0f5f56516b855b3b91)
(cherry picked from commit f076ee07bfcffddff699d9b5a639351811dc7b45)
(cherry picked from commit 6940491929ad67170b861dab3a338b7d220cef22)
Signed-off-by: Mohan Thadikamalla <mohant@nvidia.com>
Reviewed-on: http://git-master/r/604752
(cherry picked from commit a71a6c0e827e18c41de34b3bbbd1546d7efdb44f)
Reviewed-on: http://git-master/r/605032
GVS: Gerrit_Virtual_Submit
Reviewed-by: Todd Poynter <tpoynter@nvidia.com>
Tested-by: Todd Poynter <tpoynter@nvidia.com>
drivers/net/wireless/bcmdhd/wl_cfg80211.c

index bf05aca7f253914fef32e3fec8128f286fa26158..6a131c291630cd44f0dede7928538435fd48af99 100644 (file)
@@ -9287,6 +9287,8 @@ static s32 wl_notifier_change_state(struct wl_priv *wl, struct net_info *_net_in
 
                        }
                        for_each_ndev(wl, iter, next) {
+                               if (!wl_get_drv_status(wl, CONNECTED, iter->ndev))
+                                       continue;
                                if ((err = wldev_ioctl(iter->ndev, WLC_SET_PM, &pm,
                                        sizeof(pm), true)) != 0) {
                                        if (err == -ENODEV)
@@ -9309,7 +9311,25 @@ static s32 wl_notifier_change_state(struct wl_priv *wl, struct net_info *_net_in
                         */
                        pm = PM_OFF;
                        down_read(&wl->netif_sem);
+                       if (!_net_info->pm_block) {
+                               for_each_ndev(wl, iter, next) {
+                                       if (iter->pm_restore)
+                                               continue;
+                                       /* Save the current power mode */
+                                       err = wldev_ioctl(iter->ndev, WLC_GET_PM, &iter->pm,
+                                                       sizeof(iter->pm), false);
+                                       WL_DBG(("%s:power save %s\n", iter->ndev->name,
+                                                               iter->pm ? "enabled" : "disabled"));
+                                       if (!err && iter->pm) {
+                                               iter->pm_restore = true;
+                                       }
+
+                               }
+                       }
+
                        for_each_ndev(wl, iter, next) {
+                               if (!wl_get_drv_status(wl, CONNECTED, iter->ndev))
+                                       continue;
                                if ((err = wldev_ioctl(iter->ndev, WLC_SET_PM, &pm,
                                        sizeof(pm), true)) != 0) {
                                        if (err == -ENODEV)