Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 368416
b: refs/heads/master
c: 8125696
h: refs/heads/master
v: v3
  • Loading branch information
Stanislaw Gruszka authored and Johannes Berg committed Mar 6, 2013
1 parent 42485b0 commit b39b1c6
Show file tree
Hide file tree
Showing 6 changed files with 70 additions and 42 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 30c97120c6c7893e5c6857a16229699b2b79dfbe
refs/heads/master: 8125696991194aacb1173b6e8196d19098b44e17
2 changes: 1 addition & 1 deletion trunk/net/mac80211/pm.c
Original file line number Diff line number Diff line change
Expand Up @@ -93,7 +93,7 @@ int __ieee80211_suspend(struct ieee80211_hw *hw, struct cfg80211_wowlan *wowlan)
return err;
} else if (err > 0) {
WARN_ON(err != 1);
local->wowlan = false;
return err;
} else {
list_for_each_entry(sdata, &local->interfaces, list)
if (ieee80211_sdata_running(sdata))
Expand Down
73 changes: 41 additions & 32 deletions trunk/net/wireless/core.c
Original file line number Diff line number Diff line change
Expand Up @@ -814,6 +814,46 @@ void cfg80211_update_iface_num(struct cfg80211_registered_device *rdev,
rdev->num_running_monitor_ifaces += num;
}

void cfg80211_leave(struct cfg80211_registered_device *rdev,
struct wireless_dev *wdev)
{
struct net_device *dev = wdev->netdev;

switch (wdev->iftype) {
case NL80211_IFTYPE_ADHOC:
cfg80211_leave_ibss(rdev, dev, true);
break;
case NL80211_IFTYPE_P2P_CLIENT:
case NL80211_IFTYPE_STATION:
mutex_lock(&rdev->sched_scan_mtx);
__cfg80211_stop_sched_scan(rdev, false);
mutex_unlock(&rdev->sched_scan_mtx);

wdev_lock(wdev);
#ifdef CONFIG_CFG80211_WEXT
kfree(wdev->wext.ie);
wdev->wext.ie = NULL;
wdev->wext.ie_len = 0;
wdev->wext.connect.auth_type = NL80211_AUTHTYPE_AUTOMATIC;
#endif
__cfg80211_disconnect(rdev, dev,
WLAN_REASON_DEAUTH_LEAVING, true);
cfg80211_mlme_down(rdev, dev);
wdev_unlock(wdev);
break;
case NL80211_IFTYPE_MESH_POINT:
cfg80211_leave_mesh(rdev, dev);
break;
case NL80211_IFTYPE_AP:
cfg80211_stop_ap(rdev, dev);
break;
default:
break;
}

wdev->beacon_interval = 0;
}

static int cfg80211_netdev_notifier_call(struct notifier_block *nb,
unsigned long state,
void *ndev)
Expand Down Expand Up @@ -882,38 +922,7 @@ static int cfg80211_netdev_notifier_call(struct notifier_block *nb,
dev->priv_flags |= IFF_DONT_BRIDGE;
break;
case NETDEV_GOING_DOWN:
switch (wdev->iftype) {
case NL80211_IFTYPE_ADHOC:
cfg80211_leave_ibss(rdev, dev, true);
break;
case NL80211_IFTYPE_P2P_CLIENT:
case NL80211_IFTYPE_STATION:
mutex_lock(&rdev->sched_scan_mtx);
__cfg80211_stop_sched_scan(rdev, false);
mutex_unlock(&rdev->sched_scan_mtx);

wdev_lock(wdev);
#ifdef CONFIG_CFG80211_WEXT
kfree(wdev->wext.ie);
wdev->wext.ie = NULL;
wdev->wext.ie_len = 0;
wdev->wext.connect.auth_type = NL80211_AUTHTYPE_AUTOMATIC;
#endif
__cfg80211_disconnect(rdev, dev,
WLAN_REASON_DEAUTH_LEAVING, true);
cfg80211_mlme_down(rdev, dev);
wdev_unlock(wdev);
break;
case NL80211_IFTYPE_MESH_POINT:
cfg80211_leave_mesh(rdev, dev);
break;
case NL80211_IFTYPE_AP:
cfg80211_stop_ap(rdev, dev);
break;
default:
break;
}
wdev->beacon_interval = 0;
cfg80211_leave(rdev, wdev);
break;
case NETDEV_DOWN:
cfg80211_update_iface_num(rdev, wdev->iftype, -1);
Expand Down
3 changes: 3 additions & 0 deletions trunk/net/wireless/core.h
Original file line number Diff line number Diff line change
Expand Up @@ -500,6 +500,9 @@ int cfg80211_validate_beacon_int(struct cfg80211_registered_device *rdev,
void cfg80211_update_iface_num(struct cfg80211_registered_device *rdev,
enum nl80211_iftype iftype, int num);

void cfg80211_leave(struct cfg80211_registered_device *rdev,
struct wireless_dev *wdev);

#define CFG80211_MAX_NUM_DIFFERENT_CHANNELS 10

#ifdef CONFIG_CFG80211_DEVELOPER_WARNINGS
Expand Down
7 changes: 4 additions & 3 deletions trunk/net/wireless/rdev-ops.h
Original file line number Diff line number Diff line change
Expand Up @@ -6,11 +6,12 @@
#include "core.h"
#include "trace.h"

static inline int rdev_suspend(struct cfg80211_registered_device *rdev)
static inline int rdev_suspend(struct cfg80211_registered_device *rdev,
struct cfg80211_wowlan *wowlan)
{
int ret;
trace_rdev_suspend(&rdev->wiphy, rdev->wowlan);
ret = rdev->ops->suspend(&rdev->wiphy, rdev->wowlan);
trace_rdev_suspend(&rdev->wiphy, wowlan);
ret = rdev->ops->suspend(&rdev->wiphy, wowlan);
trace_rdev_return_int(&rdev->wiphy, ret);
return ret;
}
Expand Down
25 changes: 20 additions & 5 deletions trunk/net/wireless/sysfs.c
Original file line number Diff line number Diff line change
Expand Up @@ -83,19 +83,34 @@ static int wiphy_uevent(struct device *dev, struct kobj_uevent_env *env)
return 0;
}

static void cfg80211_leave_all(struct cfg80211_registered_device *rdev)
{
struct wireless_dev *wdev;

list_for_each_entry(wdev, &rdev->wdev_list, list)
cfg80211_leave(rdev, wdev);
}

static int wiphy_suspend(struct device *dev, pm_message_t state)
{
struct cfg80211_registered_device *rdev = dev_to_rdev(dev);
int ret = 0;

rdev->suspend_at = get_seconds();

if (rdev->ops->suspend) {
rtnl_lock();
if (rdev->wiphy.registered)
ret = rdev_suspend(rdev);
rtnl_unlock();
rtnl_lock();
if (rdev->wiphy.registered) {
if (!rdev->wowlan)
cfg80211_leave_all(rdev);
if (rdev->ops->suspend)
ret = rdev_suspend(rdev, rdev->wowlan);
if (ret == 1) {
/* Driver refuse to configure wowlan */
cfg80211_leave_all(rdev);
ret = rdev_suspend(rdev, NULL);
}
}
rtnl_unlock();

return ret;
}
Expand Down

0 comments on commit b39b1c6

Please sign in to comment.