aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/wireless/wl12xx/event.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/net/wireless/wl12xx/event.c')
-rw-r--r--drivers/net/wireless/wl12xx/event.c21
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
32void wl1271_pspoll_work(struct work_struct *work) 32void 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);
66out: 71out:
67 mutex_unlock(&wl->mutex); 72 mutex_unlock(&wl->mutex);
68}; 73};
69 74
70static void wl1271_event_pspoll_delivery_fail(struct wl1271 *wl) 75static 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
99static int wl1271_event_ps_report(struct wl1271 *wl, 105static 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
218static int wl1271_event_process(struct wl1271 *wl, struct event_mailbox *mbox) 225static 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");