| 
									
										
										
										
											2012-11-14 18:46:05 -08:00
										 |  |  | /*
 | 
					
						
							|  |  |  |  * Copyright (c) 2012 Broadcom Corporation | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * Permission to use, copy, modify, and/or distribute this software for any | 
					
						
							|  |  |  |  * purpose with or without fee is hereby granted, provided that the above | 
					
						
							|  |  |  |  * copyright notice and this permission notice appear in all copies. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES | 
					
						
							|  |  |  |  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF | 
					
						
							|  |  |  |  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY | 
					
						
							|  |  |  |  * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES | 
					
						
							|  |  |  |  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION | 
					
						
							|  |  |  |  * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN | 
					
						
							|  |  |  |  * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #ifndef FWEH_H_
 | 
					
						
							|  |  |  | #define FWEH_H_
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-11-14 18:46:14 -08:00
										 |  |  | #include <asm/unaligned.h>
 | 
					
						
							| 
									
										
										
										
											2012-11-14 18:46:05 -08:00
										 |  |  | #include <linux/skbuff.h>
 | 
					
						
							|  |  |  | #include <linux/if_ether.h>
 | 
					
						
							|  |  |  | #include <linux/if.h>
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* formward declarations */ | 
					
						
							|  |  |  | struct brcmf_pub; | 
					
						
							|  |  |  | struct brcmf_if; | 
					
						
							|  |  |  | struct brcmf_cfg80211_info; | 
					
						
							|  |  |  | struct brcmf_event; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-12-05 15:25:56 +01:00
										 |  |  | /* list of firmware events */ | 
					
						
							|  |  |  | #define BRCMF_FWEH_EVENT_ENUM_DEFLIST \
 | 
					
						
							|  |  |  | 	BRCMF_ENUM_DEF(SET_SSID, 0) \ | 
					
						
							|  |  |  | 	BRCMF_ENUM_DEF(JOIN, 1) \ | 
					
						
							|  |  |  | 	BRCMF_ENUM_DEF(START, 2) \ | 
					
						
							|  |  |  | 	BRCMF_ENUM_DEF(AUTH, 3) \ | 
					
						
							|  |  |  | 	BRCMF_ENUM_DEF(AUTH_IND, 4) \ | 
					
						
							|  |  |  | 	BRCMF_ENUM_DEF(DEAUTH, 5) \ | 
					
						
							|  |  |  | 	BRCMF_ENUM_DEF(DEAUTH_IND, 6) \ | 
					
						
							|  |  |  | 	BRCMF_ENUM_DEF(ASSOC, 7) \ | 
					
						
							|  |  |  | 	BRCMF_ENUM_DEF(ASSOC_IND, 8) \ | 
					
						
							|  |  |  | 	BRCMF_ENUM_DEF(REASSOC, 9) \ | 
					
						
							|  |  |  | 	BRCMF_ENUM_DEF(REASSOC_IND, 10) \ | 
					
						
							|  |  |  | 	BRCMF_ENUM_DEF(DISASSOC, 11) \ | 
					
						
							|  |  |  | 	BRCMF_ENUM_DEF(DISASSOC_IND, 12) \ | 
					
						
							|  |  |  | 	BRCMF_ENUM_DEF(QUIET_START, 13) \ | 
					
						
							|  |  |  | 	BRCMF_ENUM_DEF(QUIET_END, 14) \ | 
					
						
							|  |  |  | 	BRCMF_ENUM_DEF(BEACON_RX, 15) \ | 
					
						
							|  |  |  | 	BRCMF_ENUM_DEF(LINK, 16) \ | 
					
						
							|  |  |  | 	BRCMF_ENUM_DEF(MIC_ERROR, 17) \ | 
					
						
							|  |  |  | 	BRCMF_ENUM_DEF(NDIS_LINK, 18) \ | 
					
						
							|  |  |  | 	BRCMF_ENUM_DEF(ROAM, 19) \ | 
					
						
							|  |  |  | 	BRCMF_ENUM_DEF(TXFAIL, 20) \ | 
					
						
							|  |  |  | 	BRCMF_ENUM_DEF(PMKID_CACHE, 21) \ | 
					
						
							|  |  |  | 	BRCMF_ENUM_DEF(RETROGRADE_TSF, 22) \ | 
					
						
							|  |  |  | 	BRCMF_ENUM_DEF(PRUNE, 23) \ | 
					
						
							|  |  |  | 	BRCMF_ENUM_DEF(AUTOAUTH, 24) \ | 
					
						
							|  |  |  | 	BRCMF_ENUM_DEF(EAPOL_MSG, 25) \ | 
					
						
							|  |  |  | 	BRCMF_ENUM_DEF(SCAN_COMPLETE, 26) \ | 
					
						
							|  |  |  | 	BRCMF_ENUM_DEF(ADDTS_IND, 27) \ | 
					
						
							|  |  |  | 	BRCMF_ENUM_DEF(DELTS_IND, 28) \ | 
					
						
							|  |  |  | 	BRCMF_ENUM_DEF(BCNSENT_IND, 29) \ | 
					
						
							|  |  |  | 	BRCMF_ENUM_DEF(BCNRX_MSG, 30) \ | 
					
						
							|  |  |  | 	BRCMF_ENUM_DEF(BCNLOST_MSG, 31) \ | 
					
						
							|  |  |  | 	BRCMF_ENUM_DEF(ROAM_PREP, 32) \ | 
					
						
							|  |  |  | 	BRCMF_ENUM_DEF(PFN_NET_FOUND, 33) \ | 
					
						
							|  |  |  | 	BRCMF_ENUM_DEF(PFN_NET_LOST, 34) \ | 
					
						
							|  |  |  | 	BRCMF_ENUM_DEF(RESET_COMPLETE, 35) \ | 
					
						
							|  |  |  | 	BRCMF_ENUM_DEF(JOIN_START, 36) \ | 
					
						
							|  |  |  | 	BRCMF_ENUM_DEF(ROAM_START, 37) \ | 
					
						
							|  |  |  | 	BRCMF_ENUM_DEF(ASSOC_START, 38) \ | 
					
						
							|  |  |  | 	BRCMF_ENUM_DEF(IBSS_ASSOC, 39) \ | 
					
						
							|  |  |  | 	BRCMF_ENUM_DEF(RADIO, 40) \ | 
					
						
							|  |  |  | 	BRCMF_ENUM_DEF(PSM_WATCHDOG, 41) \ | 
					
						
							|  |  |  | 	BRCMF_ENUM_DEF(PROBREQ_MSG, 44) \ | 
					
						
							|  |  |  | 	BRCMF_ENUM_DEF(SCAN_CONFIRM_IND, 45) \ | 
					
						
							|  |  |  | 	BRCMF_ENUM_DEF(PSK_SUP, 46) \ | 
					
						
							|  |  |  | 	BRCMF_ENUM_DEF(COUNTRY_CODE_CHANGED, 47) \ | 
					
						
							|  |  |  | 	BRCMF_ENUM_DEF(EXCEEDED_MEDIUM_TIME, 48) \ | 
					
						
							|  |  |  | 	BRCMF_ENUM_DEF(ICV_ERROR, 49) \ | 
					
						
							|  |  |  | 	BRCMF_ENUM_DEF(UNICAST_DECODE_ERROR, 50) \ | 
					
						
							|  |  |  | 	BRCMF_ENUM_DEF(MULTICAST_DECODE_ERROR, 51) \ | 
					
						
							|  |  |  | 	BRCMF_ENUM_DEF(TRACE, 52) \ | 
					
						
							|  |  |  | 	BRCMF_ENUM_DEF(IF, 54) \ | 
					
						
							| 
									
										
										
										
											2013-02-08 15:53:38 +01:00
										 |  |  | 	BRCMF_ENUM_DEF(P2P_DISC_LISTEN_COMPLETE, 55) \ | 
					
						
							| 
									
										
										
										
											2012-12-05 15:25:56 +01:00
										 |  |  | 	BRCMF_ENUM_DEF(RSSI, 56) \ | 
					
						
							|  |  |  | 	BRCMF_ENUM_DEF(PFN_SCAN_COMPLETE, 57) \ | 
					
						
							|  |  |  | 	BRCMF_ENUM_DEF(EXTLOG_MSG, 58) \ | 
					
						
							|  |  |  | 	BRCMF_ENUM_DEF(ACTION_FRAME, 59) \ | 
					
						
							|  |  |  | 	BRCMF_ENUM_DEF(ACTION_FRAME_COMPLETE, 60) \ | 
					
						
							|  |  |  | 	BRCMF_ENUM_DEF(PRE_ASSOC_IND, 61) \ | 
					
						
							|  |  |  | 	BRCMF_ENUM_DEF(PRE_REASSOC_IND, 62) \ | 
					
						
							|  |  |  | 	BRCMF_ENUM_DEF(CHANNEL_ADOPTED, 63) \ | 
					
						
							|  |  |  | 	BRCMF_ENUM_DEF(AP_STARTED, 64) \ | 
					
						
							|  |  |  | 	BRCMF_ENUM_DEF(DFS_AP_STOP, 65) \ | 
					
						
							|  |  |  | 	BRCMF_ENUM_DEF(DFS_AP_RESUME, 66) \ | 
					
						
							|  |  |  | 	BRCMF_ENUM_DEF(ESCAN_RESULT, 69) \ | 
					
						
							|  |  |  | 	BRCMF_ENUM_DEF(ACTION_FRAME_OFF_CHAN_COMPLETE, 70) \ | 
					
						
							| 
									
										
										
										
											2013-02-08 15:53:38 +01:00
										 |  |  | 	BRCMF_ENUM_DEF(PROBERESP_MSG, 71) \ | 
					
						
							|  |  |  | 	BRCMF_ENUM_DEF(P2P_PROBEREQ_MSG, 72) \ | 
					
						
							| 
									
										
										
										
											2012-12-05 15:25:56 +01:00
										 |  |  | 	BRCMF_ENUM_DEF(DCS_REQUEST, 73) \ | 
					
						
							| 
									
										
										
										
											2013-02-08 15:53:38 +01:00
										 |  |  | 	BRCMF_ENUM_DEF(FIFO_CREDIT_MAP, 74) \ | 
					
						
							| 
									
										
										
										
											2013-06-18 13:29:22 +02:00
										 |  |  | 	BRCMF_ENUM_DEF(ACTION_FRAME_RX, 75) \ | 
					
						
							| 
									
										
										
										
											2014-07-30 13:20:07 +02:00
										 |  |  | 	BRCMF_ENUM_DEF(TDLS_PEER_EVENT, 92) \ | 
					
						
							| 
									
										
										
										
											2013-09-25 13:05:40 +02:00
										 |  |  | 	BRCMF_ENUM_DEF(BCMC_CREDIT_SUPPORT, 127) \ | 
					
						
							|  |  |  | 	BRCMF_ENUM_DEF(PSTA_PRIMARY_INTF_IND, 128) | 
					
						
							| 
									
										
										
										
											2012-12-05 15:25:56 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | #define BRCMF_ENUM_DEF(id, val) \
 | 
					
						
							|  |  |  | 	BRCMF_E_##id = (val), | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-11-14 18:46:05 -08:00
										 |  |  | /* firmware event codes sent by the dongle */ | 
					
						
							|  |  |  | enum brcmf_fweh_event_code { | 
					
						
							| 
									
										
										
										
											2012-12-05 15:25:56 +01:00
										 |  |  | 	BRCMF_FWEH_EVENT_ENUM_DEFLIST | 
					
						
							| 
									
										
										
										
											2012-11-14 18:46:05 -08:00
										 |  |  | 	BRCMF_E_LAST | 
					
						
							|  |  |  | }; | 
					
						
							| 
									
										
										
										
											2012-12-05 15:25:56 +01:00
										 |  |  | #undef BRCMF_ENUM_DEF
 | 
					
						
							| 
									
										
										
										
											2012-11-14 18:46:05 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-09-25 13:05:44 +02:00
										 |  |  | #define BRCMF_EVENTING_MASK_LEN		DIV_ROUND_UP(BRCMF_E_LAST, 8)
 | 
					
						
							| 
									
										
										
										
											2013-09-25 13:05:40 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-11-14 18:46:05 -08:00
										 |  |  | /* flags field values in struct brcmf_event_msg */ | 
					
						
							|  |  |  | #define BRCMF_EVENT_MSG_LINK		0x01
 | 
					
						
							|  |  |  | #define BRCMF_EVENT_MSG_FLUSHTXQ	0x02
 | 
					
						
							|  |  |  | #define BRCMF_EVENT_MSG_GROUP		0x04
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-11-29 12:25:23 +01:00
										 |  |  | /* status field values in struct brcmf_event_msg */ | 
					
						
							|  |  |  | #define BRCMF_E_STATUS_SUCCESS			0
 | 
					
						
							|  |  |  | #define BRCMF_E_STATUS_FAIL			1
 | 
					
						
							|  |  |  | #define BRCMF_E_STATUS_TIMEOUT			2
 | 
					
						
							|  |  |  | #define BRCMF_E_STATUS_NO_NETWORKS		3
 | 
					
						
							|  |  |  | #define BRCMF_E_STATUS_ABORT			4
 | 
					
						
							|  |  |  | #define BRCMF_E_STATUS_NO_ACK			5
 | 
					
						
							|  |  |  | #define BRCMF_E_STATUS_UNSOLICITED		6
 | 
					
						
							|  |  |  | #define BRCMF_E_STATUS_ATTEMPT			7
 | 
					
						
							|  |  |  | #define BRCMF_E_STATUS_PARTIAL			8
 | 
					
						
							|  |  |  | #define BRCMF_E_STATUS_NEWSCAN			9
 | 
					
						
							|  |  |  | #define BRCMF_E_STATUS_NEWASSOC			10
 | 
					
						
							|  |  |  | #define BRCMF_E_STATUS_11HQUIET			11
 | 
					
						
							|  |  |  | #define BRCMF_E_STATUS_SUPPRESS			12
 | 
					
						
							|  |  |  | #define BRCMF_E_STATUS_NOCHANS			13
 | 
					
						
							|  |  |  | #define BRCMF_E_STATUS_CS_ABORT			15
 | 
					
						
							|  |  |  | #define BRCMF_E_STATUS_ERROR			16
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* reason field values in struct brcmf_event_msg */ | 
					
						
							|  |  |  | #define BRCMF_E_REASON_INITIAL_ASSOC		0
 | 
					
						
							|  |  |  | #define BRCMF_E_REASON_LOW_RSSI			1
 | 
					
						
							|  |  |  | #define BRCMF_E_REASON_DEAUTH			2
 | 
					
						
							|  |  |  | #define BRCMF_E_REASON_DISASSOC			3
 | 
					
						
							|  |  |  | #define BRCMF_E_REASON_BCNS_LOST		4
 | 
					
						
							|  |  |  | #define BRCMF_E_REASON_MINTXRATE		9
 | 
					
						
							|  |  |  | #define BRCMF_E_REASON_TXFAIL			10
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #define BRCMF_E_REASON_LINK_BSSCFG_DIS		4
 | 
					
						
							|  |  |  | #define BRCMF_E_REASON_FAST_ROAM_FAILED		5
 | 
					
						
							|  |  |  | #define BRCMF_E_REASON_DIRECTED_ROAM		6
 | 
					
						
							|  |  |  | #define BRCMF_E_REASON_TSPEC_REJECTED		7
 | 
					
						
							|  |  |  | #define BRCMF_E_REASON_BETTER_AP		8
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-07-30 13:20:07 +02:00
										 |  |  | #define BRCMF_E_REASON_TDLS_PEER_DISCOVERED	0
 | 
					
						
							|  |  |  | #define BRCMF_E_REASON_TDLS_PEER_CONNECTED	1
 | 
					
						
							|  |  |  | #define BRCMF_E_REASON_TDLS_PEER_DISCONNECTED	2
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-11-29 12:25:23 +01:00
										 |  |  | /* action field values for brcmf_ifevent */ | 
					
						
							|  |  |  | #define BRCMF_E_IF_ADD				1
 | 
					
						
							|  |  |  | #define BRCMF_E_IF_DEL				2
 | 
					
						
							|  |  |  | #define BRCMF_E_IF_CHANGE			3
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* flag field values for brcmf_ifevent */ | 
					
						
							|  |  |  | #define BRCMF_E_IF_FLAG_NOIF			1
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* role field values for brcmf_ifevent */ | 
					
						
							|  |  |  | #define BRCMF_E_IF_ROLE_STA			0
 | 
					
						
							|  |  |  | #define BRCMF_E_IF_ROLE_AP			1
 | 
					
						
							|  |  |  | #define BRCMF_E_IF_ROLE_WDS			2
 | 
					
						
							| 
									
										
										
										
											2014-09-12 16:19:30 +02:00
										 |  |  | #define BRCMF_E_IF_ROLE_P2P_GO			3
 | 
					
						
							|  |  |  | #define BRCMF_E_IF_ROLE_P2P_CLIENT		4
 | 
					
						
							| 
									
										
										
										
											2013-11-29 12:25:23 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-11-14 18:46:05 -08:00
										 |  |  | /**
 | 
					
						
							|  |  |  |  * definitions for event packet validation. | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | #define BRCMF_EVENT_OUI_OFFSET		19
 | 
					
						
							|  |  |  | #define BRCM_OUI			"\x00\x10\x18"
 | 
					
						
							|  |  |  | #define DOT11_OUI_LEN			3
 | 
					
						
							|  |  |  | #define BCMILCP_BCM_SUBTYPE_EVENT	1
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /**
 | 
					
						
							|  |  |  |  * struct brcmf_event_msg - firmware event message. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * @version: version information. | 
					
						
							|  |  |  |  * @flags: event flags. | 
					
						
							|  |  |  |  * @event_code: firmware event code. | 
					
						
							|  |  |  |  * @status: status information. | 
					
						
							|  |  |  |  * @reason: reason code. | 
					
						
							|  |  |  |  * @auth_type: authentication type. | 
					
						
							|  |  |  |  * @datalen: lenght of event data buffer. | 
					
						
							|  |  |  |  * @addr: ether address. | 
					
						
							|  |  |  |  * @ifname: interface name. | 
					
						
							|  |  |  |  * @ifidx: interface index. | 
					
						
							|  |  |  |  * @bsscfgidx: bsscfg index. | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | struct brcmf_event_msg { | 
					
						
							|  |  |  | 	u16 version; | 
					
						
							|  |  |  | 	u16 flags; | 
					
						
							|  |  |  | 	u32 event_code; | 
					
						
							|  |  |  | 	u32 status; | 
					
						
							|  |  |  | 	u32 reason; | 
					
						
							|  |  |  | 	s32 auth_type; | 
					
						
							|  |  |  | 	u32 datalen; | 
					
						
							|  |  |  | 	u8 addr[ETH_ALEN]; | 
					
						
							|  |  |  | 	char ifname[IFNAMSIZ]; | 
					
						
							|  |  |  | 	u8 ifidx; | 
					
						
							|  |  |  | 	u8 bsscfgidx; | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-11-29 12:25:23 +01:00
										 |  |  | struct brcmf_if_event { | 
					
						
							|  |  |  | 	u8 ifidx; | 
					
						
							|  |  |  | 	u8 action; | 
					
						
							|  |  |  | 	u8 flags; | 
					
						
							|  |  |  | 	u8 bssidx; | 
					
						
							|  |  |  | 	u8 role; | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-11-14 18:46:05 -08:00
										 |  |  | typedef int (*brcmf_fweh_handler_t)(struct brcmf_if *ifp, | 
					
						
							|  |  |  | 				    const struct brcmf_event_msg *evtmsg, | 
					
						
							|  |  |  | 				    void *data); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /**
 | 
					
						
							|  |  |  |  * struct brcmf_fweh_info - firmware event handling information. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * @event_work: event worker. | 
					
						
							|  |  |  |  * @evt_q_lock: lock for event queue protection. | 
					
						
							|  |  |  |  * @event_q: event queue. | 
					
						
							|  |  |  |  * @evt_handler: registered event handlers. | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | struct brcmf_fweh_info { | 
					
						
							|  |  |  | 	struct work_struct event_work; | 
					
						
							| 
									
										
										
										
											2012-11-29 12:45:09 -08:00
										 |  |  | 	spinlock_t evt_q_lock; | 
					
						
							| 
									
										
										
										
											2012-11-14 18:46:05 -08:00
										 |  |  | 	struct list_head event_q; | 
					
						
							|  |  |  | 	int (*evt_handler[BRCMF_E_LAST])(struct brcmf_if *ifp, | 
					
						
							|  |  |  | 					 const struct brcmf_event_msg *evtmsg, | 
					
						
							|  |  |  | 					 void *data); | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void brcmf_fweh_attach(struct brcmf_pub *drvr); | 
					
						
							|  |  |  | void brcmf_fweh_detach(struct brcmf_pub *drvr); | 
					
						
							|  |  |  | int brcmf_fweh_register(struct brcmf_pub *drvr, enum brcmf_fweh_event_code code, | 
					
						
							|  |  |  | 			int (*handler)(struct brcmf_if *ifp, | 
					
						
							|  |  |  | 				       const struct brcmf_event_msg *evtmsg, | 
					
						
							|  |  |  | 				       void *data)); | 
					
						
							|  |  |  | void brcmf_fweh_unregister(struct brcmf_pub *drvr, | 
					
						
							|  |  |  | 			   enum brcmf_fweh_event_code code); | 
					
						
							|  |  |  | int brcmf_fweh_activate_events(struct brcmf_if *ifp); | 
					
						
							|  |  |  | void brcmf_fweh_process_event(struct brcmf_pub *drvr, | 
					
						
							| 
									
										
										
										
											2013-04-05 10:57:54 +02:00
										 |  |  | 			      struct brcmf_event *event_packet); | 
					
						
							| 
									
										
										
										
											2012-11-14 18:46:05 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  | static inline void brcmf_fweh_process_skb(struct brcmf_pub *drvr, | 
					
						
							| 
									
										
										
										
											2013-04-05 10:57:54 +02:00
										 |  |  | 					  struct sk_buff *skb) | 
					
						
							| 
									
										
										
										
											2012-11-14 18:46:05 -08:00
										 |  |  | { | 
					
						
							|  |  |  | 	struct brcmf_event *event_packet; | 
					
						
							|  |  |  | 	u8 *data; | 
					
						
							|  |  |  | 	u16 usr_stype; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	/* only process events when protocol matches */ | 
					
						
							|  |  |  | 	if (skb->protocol != cpu_to_be16(ETH_P_LINK_CTL)) | 
					
						
							|  |  |  | 		return; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	/* check for BRCM oui match */ | 
					
						
							|  |  |  | 	event_packet = (struct brcmf_event *)skb_mac_header(skb); | 
					
						
							|  |  |  | 	data = (u8 *)event_packet; | 
					
						
							|  |  |  | 	data += BRCMF_EVENT_OUI_OFFSET; | 
					
						
							|  |  |  | 	if (memcmp(BRCM_OUI, data, DOT11_OUI_LEN)) | 
					
						
							|  |  |  | 		return; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	/* final match on usr_subtype */ | 
					
						
							|  |  |  | 	data += DOT11_OUI_LEN; | 
					
						
							|  |  |  | 	usr_stype = get_unaligned_be16(data); | 
					
						
							|  |  |  | 	if (usr_stype != BCMILCP_BCM_SUBTYPE_EVENT) | 
					
						
							|  |  |  | 		return; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-04-05 10:57:54 +02:00
										 |  |  | 	brcmf_fweh_process_event(drvr, event_packet); | 
					
						
							| 
									
										
										
										
											2012-11-14 18:46:05 -08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #endif /* FWEH_H_ */
 |