aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/wireless/wl1251/event.c
diff options
context:
space:
mode:
authorKalle Valo <kvalo@adurom.com>2010-10-10 04:28:32 -0400
committerJohn W. Linville <linville@tuxdriver.com>2010-10-11 15:04:23 -0400
commit9bc6772e15d25f58c1be638031280e04514287d4 (patch)
tree4cff1bcbeb40698df1bbdff7c06cd3a089bcc205 /drivers/net/wireless/wl1251/event.c
parentf03ee1ec73d8cad07b0ef5ba6106a9fc4d179ecb (diff)
wl1251: move to it's own directory
wl1271 driver is under heavy development but on the other hand the older wl1251 driver is currently considered more as a legacy driver. To make it easier to develop wl1271 features move wl1251 to it's own directory, drivers/net/wireless/wl1251. There are no functional changes, only moving of files. One regression is that Kconfig won't be updated automatically and user needs to enable wl1251 manually with an older config file. Signed-off-by: Kalle Valo <kvalo@adurom.com> Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'drivers/net/wireless/wl1251/event.c')
-rw-r--r--drivers/net/wireless/wl1251/event.c168
1 files changed, 168 insertions, 0 deletions
diff --git a/drivers/net/wireless/wl1251/event.c b/drivers/net/wireless/wl1251/event.c
new file mode 100644
index 000000000000..712372e50a87
--- /dev/null
+++ b/drivers/net/wireless/wl1251/event.c
@@ -0,0 +1,168 @@
1/*
2 * This file is part of wl1251
3 *
4 * Copyright (c) 1998-2007 Texas Instruments Incorporated
5 * Copyright (C) 2008 Nokia Corporation
6 *
7 * This program is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU General Public License
9 * version 2 as published by the Free Software Foundation.
10 *
11 * This program is distributed in the hope that it will be useful, but
12 * WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * General Public License for more details.
15 *
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
19 * 02110-1301 USA
20 *
21 */
22
23#include "wl1251.h"
24#include "reg.h"
25#include "io.h"
26#include "event.h"
27#include "ps.h"
28
29static int wl1251_event_scan_complete(struct wl1251 *wl,
30 struct event_mailbox *mbox)
31{
32 wl1251_debug(DEBUG_EVENT, "status: 0x%x, channels: %d",
33 mbox->scheduled_scan_status,
34 mbox->scheduled_scan_channels);
35
36 if (wl->scanning) {
37 ieee80211_scan_completed(wl->hw, false);
38 wl1251_debug(DEBUG_MAC80211, "mac80211 hw scan completed");
39 wl->scanning = false;
40 }
41
42 return 0;
43}
44
45static void wl1251_event_mbox_dump(struct event_mailbox *mbox)
46{
47 wl1251_debug(DEBUG_EVENT, "MBOX DUMP:");
48 wl1251_debug(DEBUG_EVENT, "\tvector: 0x%x", mbox->events_vector);
49 wl1251_debug(DEBUG_EVENT, "\tmask: 0x%x", mbox->events_mask);
50}
51
52static int wl1251_event_process(struct wl1251 *wl, struct event_mailbox *mbox)
53{
54 int ret;
55 u32 vector;
56
57 wl1251_event_mbox_dump(mbox);
58
59 vector = mbox->events_vector & ~(mbox->events_mask);
60 wl1251_debug(DEBUG_EVENT, "vector: 0x%x", vector);
61
62 if (vector & SCAN_COMPLETE_EVENT_ID) {
63 ret = wl1251_event_scan_complete(wl, mbox);
64 if (ret < 0)
65 return ret;
66 }
67
68 if (vector & BSS_LOSE_EVENT_ID) {
69 wl1251_debug(DEBUG_EVENT, "BSS_LOSE_EVENT");
70
71 if (wl->psm_requested && wl->psm) {
72 ret = wl1251_ps_set_mode(wl, STATION_ACTIVE_MODE);
73 if (ret < 0)
74 return ret;
75 }
76 }
77
78 if (vector & SYNCHRONIZATION_TIMEOUT_EVENT_ID && wl->psm) {
79 wl1251_debug(DEBUG_EVENT, "SYNCHRONIZATION_TIMEOUT_EVENT");
80
81 /* indicate to the stack, that beacons have been lost */
82 ieee80211_beacon_loss(wl->vif);
83 }
84
85 if (vector & REGAINED_BSS_EVENT_ID) {
86 if (wl->psm_requested) {
87 ret = wl1251_ps_set_mode(wl, STATION_POWER_SAVE_MODE);
88 if (ret < 0)
89 return ret;
90 }
91 }
92
93 return 0;
94}
95
96/*
97 * Poll the mailbox event field until any of the bits in the mask is set or a
98 * timeout occurs (WL1251_EVENT_TIMEOUT in msecs)
99 */
100int wl1251_event_wait(struct wl1251 *wl, u32 mask, int timeout_ms)
101{
102 u32 events_vector, event;
103 unsigned long timeout;
104
105 timeout = jiffies + msecs_to_jiffies(timeout_ms);
106
107 do {
108 if (time_after(jiffies, timeout))
109 return -ETIMEDOUT;
110
111 msleep(1);
112
113 /* read from both event fields */
114 wl1251_mem_read(wl, wl->mbox_ptr[0], &events_vector,
115 sizeof(events_vector));
116 event = events_vector & mask;
117 wl1251_mem_read(wl, wl->mbox_ptr[1], &events_vector,
118 sizeof(events_vector));
119 event |= events_vector & mask;
120 } while (!event);
121
122 return 0;
123}
124
125int wl1251_event_unmask(struct wl1251 *wl)
126{
127 int ret;
128
129 ret = wl1251_acx_event_mbox_mask(wl, ~(wl->event_mask));
130 if (ret < 0)
131 return ret;
132
133 return 0;
134}
135
136void wl1251_event_mbox_config(struct wl1251 *wl)
137{
138 wl->mbox_ptr[0] = wl1251_reg_read32(wl, REG_EVENT_MAILBOX_PTR);
139 wl->mbox_ptr[1] = wl->mbox_ptr[0] + sizeof(struct event_mailbox);
140
141 wl1251_debug(DEBUG_EVENT, "MBOX ptrs: 0x%x 0x%x",
142 wl->mbox_ptr[0], wl->mbox_ptr[1]);
143}
144
145int wl1251_event_handle(struct wl1251 *wl, u8 mbox_num)
146{
147 struct event_mailbox mbox;
148 int ret;
149
150 wl1251_debug(DEBUG_EVENT, "EVENT on mbox %d", mbox_num);
151
152 if (mbox_num > 1)
153 return -EINVAL;
154
155 /* first we read the mbox descriptor */
156 wl1251_mem_read(wl, wl->mbox_ptr[mbox_num], &mbox,
157 sizeof(struct event_mailbox));
158
159 /* process the descriptor */
160 ret = wl1251_event_process(wl, &mbox);
161 if (ret < 0)
162 return ret;
163
164 /* then we let the firmware know it can go on...*/
165 wl1251_reg_write32(wl, ACX_REG_INTERRUPT_TRIG, INTR_TRIG_EVENT_ACK);
166
167 return 0;
168}