aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorHante Meuleman <meuleman@broadcom.com>2012-09-11 15:18:47 -0400
committerJohn W. Linville <linville@tuxdriver.com>2012-09-12 14:19:15 -0400
commitc4fdb05696f315f43eb44c2a44fec1677ba47b31 (patch)
tree0526604ef8a73948ee65cf5a9aec8445ec95f5a9 /drivers
parent90d03ff71b52ba1d9d53f18c07d89566ba0263b4 (diff)
brcmfmac: Add extra data support to firmware event queueing.
Firmware events can contain extra data. This patch adds support to copy this data when it exists. Reviewed-by: Franky (Zhenhui) Lin <frankyl@broadcom.com> Reviewed-by: Arend Van Spriel <arend@broadcom.com> Reviewed-by: Pieter-Paul Giesberts <pieterpg@broadcom.com> Signed-off-by: Hante Meuleman <meuleman@broadcom.com> Signed-off-by: Arend van Spriel <arend@broadcom.com> Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/net/wireless/brcm80211/brcmfmac/dhd.h2
-rw-r--r--drivers/net/wireless/brcm80211/brcmfmac/wl_cfg80211.c16
2 files changed, 15 insertions, 3 deletions
diff --git a/drivers/net/wireless/brcm80211/brcmfmac/dhd.h b/drivers/net/wireless/brcm80211/brcmfmac/dhd.h
index 37f57088c363..9e2fb5bc932f 100644
--- a/drivers/net/wireless/brcm80211/brcmfmac/dhd.h
+++ b/drivers/net/wireless/brcm80211/brcmfmac/dhd.h
@@ -140,6 +140,8 @@ struct brcmf_event_msg {
140 __be32 datalen; 140 __be32 datalen;
141 u8 addr[ETH_ALEN]; 141 u8 addr[ETH_ALEN];
142 char ifname[IFNAMSIZ]; 142 char ifname[IFNAMSIZ];
143 u8 ifidx;
144 u8 bsscfgidx;
143} __packed; 145} __packed;
144 146
145struct brcm_ethhdr { 147struct brcm_ethhdr {
diff --git a/drivers/net/wireless/brcm80211/brcmfmac/wl_cfg80211.c b/drivers/net/wireless/brcm80211/brcmfmac/wl_cfg80211.c
index a6b382bfabd6..4553fa07afe3 100644
--- a/drivers/net/wireless/brcm80211/brcmfmac/wl_cfg80211.c
+++ b/drivers/net/wireless/brcm80211/brcmfmac/wl_cfg80211.c
@@ -3321,18 +3321,28 @@ static struct brcmf_cfg80211_event_q *brcmf_deq_event(
3321 3321
3322static s32 3322static s32
3323brcmf_enq_event(struct brcmf_cfg80211_priv *cfg_priv, u32 event, 3323brcmf_enq_event(struct brcmf_cfg80211_priv *cfg_priv, u32 event,
3324 const struct brcmf_event_msg *msg) 3324 const struct brcmf_event_msg *msg, void *data)
3325{ 3325{
3326 struct brcmf_cfg80211_event_q *e; 3326 struct brcmf_cfg80211_event_q *e;
3327 s32 err = 0; 3327 s32 err = 0;
3328 ulong flags; 3328 ulong flags;
3329 u32 data_len;
3330 u32 total_len;
3329 3331
3330 e = kzalloc(sizeof(struct brcmf_cfg80211_event_q), GFP_ATOMIC); 3332 total_len = sizeof(struct brcmf_cfg80211_event_q);
3333 if (data)
3334 data_len = be32_to_cpu(msg->datalen);
3335 else
3336 data_len = 0;
3337 total_len += data_len;
3338 e = kzalloc(total_len, GFP_ATOMIC);
3331 if (!e) 3339 if (!e)
3332 return -ENOMEM; 3340 return -ENOMEM;
3333 3341
3334 e->etype = event; 3342 e->etype = event;
3335 memcpy(&e->emsg, msg, sizeof(struct brcmf_event_msg)); 3343 memcpy(&e->emsg, msg, sizeof(struct brcmf_event_msg));
3344 if (data)
3345 memcpy(&e->edata, data, data_len);
3336 3346
3337 spin_lock_irqsave(&cfg_priv->evt_q_lock, flags); 3347 spin_lock_irqsave(&cfg_priv->evt_q_lock, flags);
3338 list_add_tail(&e->evt_q_list, &cfg_priv->evt_q_list); 3348 list_add_tail(&e->evt_q_list, &cfg_priv->evt_q_list);
@@ -3501,7 +3511,7 @@ brcmf_cfg80211_event(struct net_device *ndev,
3501 u32 event_type = be32_to_cpu(e->event_type); 3511 u32 event_type = be32_to_cpu(e->event_type);
3502 struct brcmf_cfg80211_priv *cfg_priv = ndev_to_cfg(ndev); 3512 struct brcmf_cfg80211_priv *cfg_priv = ndev_to_cfg(ndev);
3503 3513
3504 if (!brcmf_enq_event(cfg_priv, event_type, e)) 3514 if (!brcmf_enq_event(cfg_priv, event_type, e, data))
3505 schedule_work(&cfg_priv->event_work); 3515 schedule_work(&cfg_priv->event_work);
3506} 3516}
3507 3517