diff options
author | Hante Meuleman <meuleman@broadcom.com> | 2012-09-11 15:18:47 -0400 |
---|---|---|
committer | John W. Linville <linville@tuxdriver.com> | 2012-09-12 14:19:15 -0400 |
commit | c4fdb05696f315f43eb44c2a44fec1677ba47b31 (patch) | |
tree | 0526604ef8a73948ee65cf5a9aec8445ec95f5a9 /drivers | |
parent | 90d03ff71b52ba1d9d53f18c07d89566ba0263b4 (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.h | 2 | ||||
-rw-r--r-- | drivers/net/wireless/brcm80211/brcmfmac/wl_cfg80211.c | 16 |
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 | ||
145 | struct brcm_ethhdr { | 147 | struct 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 | ||
3322 | static s32 | 3322 | static s32 |
3323 | brcmf_enq_event(struct brcmf_cfg80211_priv *cfg_priv, u32 event, | 3323 | brcmf_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 | ||