aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/wireless/brcm80211/brcmfmac/fweh.h
diff options
context:
space:
mode:
authorArend van Spriel <arend@broadcom.com>2012-11-14 21:46:05 -0500
committerJohn W. Linville <linville@tuxdriver.com>2012-11-16 14:28:45 -0500
commit5c36b99add5c3212b6cdb97cc206e1e3e0fa1e3c (patch)
treeef6ce3d633639ae8f09bede38f31258291f18dc1 /drivers/net/wireless/brcm80211/brcmfmac/fweh.h
parent957708f1a2d3fd41021ea0282e1cd856d23df9ca (diff)
brcmfmac: rework firmware event handling code
Handling of firmware event has been reworked into a seperate code file. The change is needed as firmware event can be received in interrupt context. Decoupling of the event handling has been lowered to allow event processing to sleep. Reviewed-by: Hante Meuleman <meuleman@broadcom.com> Reviewed-by: Pieter-Paul Giesberts <pieterpg@broadcom.com> Signed-off-by: Arend van Spriel <arend@broadcom.com> Signed-off-by: Franky Lin <frankyl@broadcom.com> Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'drivers/net/wireless/brcm80211/brcmfmac/fweh.h')
-rw-r--r--drivers/net/wireless/brcm80211/brcmfmac/fweh.h207
1 files changed, 207 insertions, 0 deletions
diff --git a/drivers/net/wireless/brcm80211/brcmfmac/fweh.h b/drivers/net/wireless/brcm80211/brcmfmac/fweh.h
new file mode 100644
index 000000000000..13bd33355951
--- /dev/null
+++ b/drivers/net/wireless/brcm80211/brcmfmac/fweh.h
@@ -0,0 +1,207 @@
1/*
2 * Copyright (c) 2012 Broadcom Corporation
3 *
4 * Permission to use, copy, modify, and/or distribute this software for any
5 * purpose with or without fee is hereby granted, provided that the above
6 * copyright notice and this permission notice appear in all copies.
7 *
8 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
9 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
10 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
11 * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
12 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
13 * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
14 * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
15 */
16
17
18#ifndef FWEH_H_
19#define FWEH_H_
20
21#include <linux/unaligned/access_ok.h>
22#include <linux/skbuff.h>
23#include <linux/if_ether.h>
24#include <linux/if.h>
25
26/* formward declarations */
27struct brcmf_pub;
28struct brcmf_if;
29struct brcmf_cfg80211_info;
30struct brcmf_event;
31
32/* firmware event codes sent by the dongle */
33enum brcmf_fweh_event_code {
34 BRCMF_E_SET_SSID = 0,
35 BRCMF_E_JOIN = 1,
36 BRCMF_E_START = 2,
37 BRCMF_E_AUTH = 3,
38 BRCMF_E_AUTH_IND = 4,
39 BRCMF_E_DEAUTH = 5,
40 BRCMF_E_DEAUTH_IND = 6,
41 BRCMF_E_ASSOC = 7,
42 BRCMF_E_ASSOC_IND = 8,
43 BRCMF_E_REASSOC = 9,
44 BRCMF_E_REASSOC_IND = 10,
45 BRCMF_E_DISASSOC = 11,
46 BRCMF_E_DISASSOC_IND = 12,
47 BRCMF_E_QUIET_START = 13,
48 BRCMF_E_QUIET_END = 14,
49 BRCMF_E_BEACON_RX = 15,
50 BRCMF_E_LINK = 16,
51 BRCMF_E_MIC_ERROR = 17,
52 BRCMF_E_NDIS_LINK = 18,
53 BRCMF_E_ROAM = 19,
54 BRCMF_E_TXFAIL = 20,
55 BRCMF_E_PMKID_CACHE = 21,
56 BRCMF_E_RETROGRADE_TSF = 22,
57 BRCMF_E_PRUNE = 23,
58 BRCMF_E_AUTOAUTH = 24,
59 BRCMF_E_EAPOL_MSG = 25,
60 BRCMF_E_SCAN_COMPLETE = 26,
61 BRCMF_E_ADDTS_IND = 27,
62 BRCMF_E_DELTS_IND = 28,
63 BRCMF_E_BCNSENT_IND = 29,
64 BRCMF_E_BCNRX_MSG = 30,
65 BRCMF_E_BCNLOST_MSG = 31,
66 BRCMF_E_ROAM_PREP = 32,
67 BRCMF_E_PFN_NET_FOUND = 33,
68 BRCMF_E_PFN_NET_LOST = 34,
69 BRCMF_E_RESET_COMPLETE = 35,
70 BRCMF_E_JOIN_START = 36,
71 BRCMF_E_ROAM_START = 37,
72 BRCMF_E_ASSOC_START = 38,
73 BRCMF_E_IBSS_ASSOC = 39,
74 BRCMF_E_RADIO = 40,
75 BRCMF_E_PSM_WATCHDOG = 41,
76 BRCMF_E_PROBREQ_MSG = 44,
77 BRCMF_E_SCAN_CONFIRM_IND = 45,
78 BRCMF_E_PSK_SUP = 46,
79 BRCMF_E_COUNTRY_CODE_CHANGED = 47,
80 BRCMF_E_EXCEEDED_MEDIUM_TIME = 48,
81 BRCMF_E_ICV_ERROR = 49,
82 BRCMF_E_UNICAST_DECODE_ERROR = 50,
83 BRCMF_E_MULTICAST_DECODE_ERROR = 51,
84 BRCMF_E_TRACE = 52,
85 BRCMF_E_IF = 54,
86 BRCMF_E_RSSI = 56,
87 BRCMF_E_PFN_SCAN_COMPLETE = 57,
88 BRCMF_E_EXTLOG_MSG = 58,
89 BRCMF_E_ACTION_FRAME = 59,
90 BRCMF_E_ACTION_FRAME_COMPLETE = 60,
91 BRCMF_E_PRE_ASSOC_IND = 61,
92 BRCMF_E_PRE_REASSOC_IND = 62,
93 BRCMF_E_CHANNEL_ADOPTED = 63,
94 BRCMF_E_AP_STARTED = 64,
95 BRCMF_E_DFS_AP_STOP = 65,
96 BRCMF_E_DFS_AP_RESUME = 66,
97 BRCMF_E_ESCAN_RESULT = 69,
98 BRCMF_E_ACTION_FRAME_OFF_CHAN_COMPLETE = 70,
99 BRCMF_E_DCS_REQUEST = 73,
100 BRCMF_E_FIFO_CREDIT_MAP = 74,
101 BRCMF_E_LAST
102};
103
104/* flags field values in struct brcmf_event_msg */
105#define BRCMF_EVENT_MSG_LINK 0x01
106#define BRCMF_EVENT_MSG_FLUSHTXQ 0x02
107#define BRCMF_EVENT_MSG_GROUP 0x04
108
109/**
110 * definitions for event packet validation.
111 */
112#define BRCMF_EVENT_OUI_OFFSET 19
113#define BRCM_OUI "\x00\x10\x18"
114#define DOT11_OUI_LEN 3
115#define BCMILCP_BCM_SUBTYPE_EVENT 1
116
117
118/**
119 * struct brcmf_event_msg - firmware event message.
120 *
121 * @version: version information.
122 * @flags: event flags.
123 * @event_code: firmware event code.
124 * @status: status information.
125 * @reason: reason code.
126 * @auth_type: authentication type.
127 * @datalen: lenght of event data buffer.
128 * @addr: ether address.
129 * @ifname: interface name.
130 * @ifidx: interface index.
131 * @bsscfgidx: bsscfg index.
132 */
133struct brcmf_event_msg {
134 u16 version;
135 u16 flags;
136 u32 event_code;
137 u32 status;
138 u32 reason;
139 s32 auth_type;
140 u32 datalen;
141 u8 addr[ETH_ALEN];
142 char ifname[IFNAMSIZ];
143 u8 ifidx;
144 u8 bsscfgidx;
145};
146
147typedef int (*brcmf_fweh_handler_t)(struct brcmf_if *ifp,
148 const struct brcmf_event_msg *evtmsg,
149 void *data);
150
151/**
152 * struct brcmf_fweh_info - firmware event handling information.
153 *
154 * @event_work: event worker.
155 * @evt_q_lock: lock for event queue protection.
156 * @event_q: event queue.
157 * @evt_handler: registered event handlers.
158 */
159struct brcmf_fweh_info {
160 struct work_struct event_work;
161 struct spinlock evt_q_lock;
162 struct list_head event_q;
163 int (*evt_handler[BRCMF_E_LAST])(struct brcmf_if *ifp,
164 const struct brcmf_event_msg *evtmsg,
165 void *data);
166};
167
168void brcmf_fweh_attach(struct brcmf_pub *drvr);
169void brcmf_fweh_detach(struct brcmf_pub *drvr);
170int brcmf_fweh_register(struct brcmf_pub *drvr, enum brcmf_fweh_event_code code,
171 int (*handler)(struct brcmf_if *ifp,
172 const struct brcmf_event_msg *evtmsg,
173 void *data));
174void brcmf_fweh_unregister(struct brcmf_pub *drvr,
175 enum brcmf_fweh_event_code code);
176int brcmf_fweh_activate_events(struct brcmf_if *ifp);
177void brcmf_fweh_process_event(struct brcmf_pub *drvr,
178 struct brcmf_event *event_packet, u8 *ifidx);
179
180static inline void brcmf_fweh_process_skb(struct brcmf_pub *drvr,
181 struct sk_buff *skb, u8 *ifidx)
182{
183 struct brcmf_event *event_packet;
184 u8 *data;
185 u16 usr_stype;
186
187 /* only process events when protocol matches */
188 if (skb->protocol != cpu_to_be16(ETH_P_LINK_CTL))
189 return;
190
191 /* check for BRCM oui match */
192 event_packet = (struct brcmf_event *)skb_mac_header(skb);
193 data = (u8 *)event_packet;
194 data += BRCMF_EVENT_OUI_OFFSET;
195 if (memcmp(BRCM_OUI, data, DOT11_OUI_LEN))
196 return;
197
198 /* final match on usr_subtype */
199 data += DOT11_OUI_LEN;
200 usr_stype = get_unaligned_be16(data);
201 if (usr_stype != BCMILCP_BCM_SUBTYPE_EVENT)
202 return;
203
204 brcmf_fweh_process_event(drvr, event_packet, ifidx);
205}
206
207#endif /* FWEH_H_ */