diff options
Diffstat (limited to 'drivers/net/wireless/wl12xx/event.c')
-rw-r--r-- | drivers/net/wireless/wl12xx/event.c | 21 |
1 files changed, 15 insertions, 6 deletions
diff --git a/drivers/net/wireless/wl12xx/event.c b/drivers/net/wireless/wl12xx/event.c index 7e3ff808feef..af4cef366a3e 100644 --- a/drivers/net/wireless/wl12xx/event.c +++ b/drivers/net/wireless/wl12xx/event.c | |||
@@ -31,12 +31,16 @@ | |||
31 | 31 | ||
32 | void wl1271_pspoll_work(struct work_struct *work) | 32 | void wl1271_pspoll_work(struct work_struct *work) |
33 | { | 33 | { |
34 | struct ieee80211_vif *vif; | ||
35 | struct wl12xx_vif *wlvif; | ||
34 | struct delayed_work *dwork; | 36 | struct delayed_work *dwork; |
35 | struct wl1271 *wl; | 37 | struct wl1271 *wl; |
36 | int ret; | 38 | int ret; |
37 | 39 | ||
38 | dwork = container_of(work, struct delayed_work, work); | 40 | dwork = container_of(work, struct delayed_work, work); |
39 | wl = container_of(dwork, struct wl1271, pspoll_work); | 41 | wl = container_of(dwork, struct wl1271, pspoll_work); |
42 | vif = wl->vif; /* TODO: move work into vif struct */ | ||
43 | wlvif = wl12xx_vif_to_data(vif); | ||
40 | 44 | ||
41 | wl1271_debug(DEBUG_EVENT, "pspoll work"); | 45 | wl1271_debug(DEBUG_EVENT, "pspoll work"); |
42 | 46 | ||
@@ -60,14 +64,16 @@ void wl1271_pspoll_work(struct work_struct *work) | |||
60 | if (ret < 0) | 64 | if (ret < 0) |
61 | goto out; | 65 | goto out; |
62 | 66 | ||
63 | wl1271_ps_set_mode(wl, STATION_POWER_SAVE_MODE, wl->basic_rate, true); | 67 | wl1271_ps_set_mode(wl, STATION_POWER_SAVE_MODE, wlvif->basic_rate, |
68 | true); | ||
64 | 69 | ||
65 | wl1271_ps_elp_sleep(wl); | 70 | wl1271_ps_elp_sleep(wl); |
66 | out: | 71 | out: |
67 | mutex_unlock(&wl->mutex); | 72 | mutex_unlock(&wl->mutex); |
68 | }; | 73 | }; |
69 | 74 | ||
70 | static void wl1271_event_pspoll_delivery_fail(struct wl1271 *wl) | 75 | static void wl1271_event_pspoll_delivery_fail(struct wl1271 *wl, |
76 | struct wl12xx_vif *wlvif) | ||
71 | { | 77 | { |
72 | int delay = wl->conf.conn.ps_poll_recovery_period; | 78 | int delay = wl->conf.conn.ps_poll_recovery_period; |
73 | int ret; | 79 | int ret; |
@@ -80,7 +86,7 @@ static void wl1271_event_pspoll_delivery_fail(struct wl1271 *wl) | |||
80 | /* force active mode receive data from the AP */ | 86 | /* force active mode receive data from the AP */ |
81 | if (test_bit(WL1271_FLAG_PSM, &wl->flags)) { | 87 | if (test_bit(WL1271_FLAG_PSM, &wl->flags)) { |
82 | ret = wl1271_ps_set_mode(wl, STATION_ACTIVE_MODE, | 88 | ret = wl1271_ps_set_mode(wl, STATION_ACTIVE_MODE, |
83 | wl->basic_rate, true); | 89 | wlvif->basic_rate, true); |
84 | if (ret < 0) | 90 | if (ret < 0) |
85 | return; | 91 | return; |
86 | set_bit(WL1271_FLAG_PSPOLL_FAILURE, &wl->flags); | 92 | set_bit(WL1271_FLAG_PSPOLL_FAILURE, &wl->flags); |
@@ -97,6 +103,7 @@ static void wl1271_event_pspoll_delivery_fail(struct wl1271 *wl) | |||
97 | } | 103 | } |
98 | 104 | ||
99 | static int wl1271_event_ps_report(struct wl1271 *wl, | 105 | static int wl1271_event_ps_report(struct wl1271 *wl, |
106 | struct wl12xx_vif *wlvif, | ||
100 | struct event_mailbox *mbox, | 107 | struct event_mailbox *mbox, |
101 | bool *beacon_loss) | 108 | bool *beacon_loss) |
102 | { | 109 | { |
@@ -118,7 +125,7 @@ static int wl1271_event_ps_report(struct wl1271 *wl, | |||
118 | if (wl->psm_entry_retry < total_retries) { | 125 | if (wl->psm_entry_retry < total_retries) { |
119 | wl->psm_entry_retry++; | 126 | wl->psm_entry_retry++; |
120 | ret = wl1271_ps_set_mode(wl, STATION_POWER_SAVE_MODE, | 127 | ret = wl1271_ps_set_mode(wl, STATION_POWER_SAVE_MODE, |
121 | wl->basic_rate, true); | 128 | wlvif->basic_rate, true); |
122 | } else { | 129 | } else { |
123 | wl1271_info("No ack to nullfunc from AP."); | 130 | wl1271_info("No ack to nullfunc from AP."); |
124 | wl->psm_entry_retry = 0; | 131 | wl->psm_entry_retry = 0; |
@@ -217,6 +224,8 @@ static void wl1271_event_mbox_dump(struct event_mailbox *mbox) | |||
217 | 224 | ||
218 | static int wl1271_event_process(struct wl1271 *wl, struct event_mailbox *mbox) | 225 | static int wl1271_event_process(struct wl1271 *wl, struct event_mailbox *mbox) |
219 | { | 226 | { |
227 | struct ieee80211_vif *vif = wl->vif; /* TODO: get as param */ | ||
228 | struct wl12xx_vif *wlvif = wl12xx_vif_to_data(vif); | ||
220 | int ret; | 229 | int ret; |
221 | u32 vector; | 230 | u32 vector; |
222 | bool beacon_loss = false; | 231 | bool beacon_loss = false; |
@@ -276,13 +285,13 @@ static int wl1271_event_process(struct wl1271 *wl, struct event_mailbox *mbox) | |||
276 | 285 | ||
277 | if ((vector & PS_REPORT_EVENT_ID) && !is_ap) { | 286 | if ((vector & PS_REPORT_EVENT_ID) && !is_ap) { |
278 | wl1271_debug(DEBUG_EVENT, "PS_REPORT_EVENT"); | 287 | wl1271_debug(DEBUG_EVENT, "PS_REPORT_EVENT"); |
279 | ret = wl1271_event_ps_report(wl, mbox, &beacon_loss); | 288 | ret = wl1271_event_ps_report(wl, wlvif, mbox, &beacon_loss); |
280 | if (ret < 0) | 289 | if (ret < 0) |
281 | return ret; | 290 | return ret; |
282 | } | 291 | } |
283 | 292 | ||
284 | if ((vector & PSPOLL_DELIVERY_FAILURE_EVENT_ID) && !is_ap) | 293 | if ((vector & PSPOLL_DELIVERY_FAILURE_EVENT_ID) && !is_ap) |
285 | wl1271_event_pspoll_delivery_fail(wl); | 294 | wl1271_event_pspoll_delivery_fail(wl, wlvif); |
286 | 295 | ||
287 | if (vector & RSSI_SNR_TRIGGER_0_EVENT_ID) { | 296 | if (vector & RSSI_SNR_TRIGGER_0_EVENT_ID) { |
288 | wl1271_debug(DEBUG_EVENT, "RSSI_SNR_TRIGGER_0_EVENT"); | 297 | wl1271_debug(DEBUG_EVENT, "RSSI_SNR_TRIGGER_0_EVENT"); |