1 #include <net/mac80211.h>
2 #include <net/rtnetlink.h>
4 #include "ieee80211_i.h"
7 int __ieee80211_suspend(struct ieee80211_hw
*hw
)
9 struct ieee80211_local
*local
= hw_to_local(hw
);
10 struct ieee80211_sub_if_data
*sdata
;
11 struct ieee80211_if_init_conf conf
;
14 flush_workqueue(local
->hw
.workqueue
);
17 list_for_each_entry(sdata
, &local
->interfaces
, list
)
18 ieee80211_disable_keys(sdata
);
21 list_for_each_entry(sta
, &local
->sta_list
, list
) {
23 if (local
->ops
->sta_notify
) {
24 if (sdata
->vif
.type
== NL80211_IFTYPE_AP_VLAN
)
25 sdata
= container_of(sdata
->bss
,
26 struct ieee80211_sub_if_data
,
29 local
->ops
->sta_notify(hw
, &sdata
->vif
,
30 STA_NOTIFY_REMOVE
, &sta
->sta
);
34 /* remove all interfaces */
35 list_for_each_entry(sdata
, &local
->interfaces
, list
) {
37 if (sdata
->vif
.type
!= NL80211_IFTYPE_AP_VLAN
&&
38 sdata
->vif
.type
!= NL80211_IFTYPE_MONITOR
&&
39 netif_running(sdata
->dev
)) {
40 conf
.vif
= &sdata
->vif
;
41 conf
.type
= sdata
->vif
.type
;
42 conf
.mac_addr
= sdata
->dev
->dev_addr
;
43 local
->ops
->remove_interface(hw
, &conf
);
47 /* flush again, in case driver queued work */
48 flush_workqueue(local
->hw
.workqueue
);
51 if (local
->open_count
) {
52 ieee80211_led_radio(local
, false);
58 int __ieee80211_resume(struct ieee80211_hw
*hw
)
60 struct ieee80211_local
*local
= hw_to_local(hw
);
61 struct ieee80211_sub_if_data
*sdata
;
62 struct ieee80211_if_init_conf conf
;
66 /* restart hardware */
67 if (local
->open_count
) {
68 res
= local
->ops
->start(hw
);
70 ieee80211_led_radio(local
, hw
->conf
.radio_enabled
);
74 list_for_each_entry(sdata
, &local
->interfaces
, list
) {
76 if (sdata
->vif
.type
!= NL80211_IFTYPE_AP_VLAN
&&
77 sdata
->vif
.type
!= NL80211_IFTYPE_MONITOR
&&
78 netif_running(sdata
->dev
)) {
79 conf
.vif
= &sdata
->vif
;
80 conf
.type
= sdata
->vif
.type
;
81 conf
.mac_addr
= sdata
->dev
->dev_addr
;
82 res
= local
->ops
->add_interface(hw
, &conf
);
87 list_for_each_entry(sta
, &local
->sta_list
, list
) {
89 if (local
->ops
->sta_notify
) {
90 if (sdata
->vif
.type
== NL80211_IFTYPE_AP_VLAN
)
91 sdata
= container_of(sdata
->bss
,
92 struct ieee80211_sub_if_data
,
95 local
->ops
->sta_notify(hw
, &sdata
->vif
,
96 STA_NOTIFY_ADD
, &sta
->sta
);
101 list_for_each_entry(sdata
, &local
->interfaces
, list
)
102 if (netif_running(sdata
->dev
))
103 ieee80211_enable_keys(sdata
);
105 /* setup RTS threshold */
106 if (local
->ops
->set_rts_threshold
)
107 local
->ops
->set_rts_threshold(hw
, local
->rts_threshold
);
109 /* reconfigure hardware */
110 ieee80211_hw_config(local
, ~0);
112 netif_addr_lock_bh(local
->mdev
);
113 ieee80211_configure_filter(local
);
114 netif_addr_unlock_bh(local
->mdev
);