brcmfmac: Add extra data support to firmware event queueing.
authorHante Meuleman <meuleman@broadcom.com>
Tue, 11 Sep 2012 19:18:47 +0000 (21:18 +0200)
committerJohn W. Linville <linville@tuxdriver.com>
Wed, 12 Sep 2012 18:19:15 +0000 (14:19 -0400)
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>
drivers/net/wireless/brcm80211/brcmfmac/dhd.h
drivers/net/wireless/brcm80211/brcmfmac/wl_cfg80211.c

index 37f57088c363979192e9bb54823c41ad80075e4b..9e2fb5bc932f6b24344e7327c7f7b0fd15ae455e 100644 (file)
@@ -140,6 +140,8 @@ struct brcmf_event_msg {
        __be32 datalen;
        u8 addr[ETH_ALEN];
        char ifname[IFNAMSIZ];
+       u8 ifidx;
+       u8 bsscfgidx;
 } __packed;
 
 struct brcm_ethhdr {
index a6b382bfabd6072fed41622cdde7eca10d5b7a7d..4553fa07afe329ac3340a11d49c85784a73c9119 100644 (file)
@@ -3321,18 +3321,28 @@ static struct brcmf_cfg80211_event_q *brcmf_deq_event(
 
 static s32
 brcmf_enq_event(struct brcmf_cfg80211_priv *cfg_priv, u32 event,
-               const struct brcmf_event_msg *msg)
+               const struct brcmf_event_msg *msg, void *data)
 {
        struct brcmf_cfg80211_event_q *e;
        s32 err = 0;
        ulong flags;
+       u32 data_len;
+       u32 total_len;
 
-       e = kzalloc(sizeof(struct brcmf_cfg80211_event_q), GFP_ATOMIC);
+       total_len = sizeof(struct brcmf_cfg80211_event_q);
+       if (data)
+               data_len = be32_to_cpu(msg->datalen);
+       else
+               data_len = 0;
+       total_len += data_len;
+       e = kzalloc(total_len, GFP_ATOMIC);
        if (!e)
                return -ENOMEM;
 
        e->etype = event;
        memcpy(&e->emsg, msg, sizeof(struct brcmf_event_msg));
+       if (data)
+               memcpy(&e->edata, data, data_len);
 
        spin_lock_irqsave(&cfg_priv->evt_q_lock, flags);
        list_add_tail(&e->evt_q_list, &cfg_priv->evt_q_list);
@@ -3501,7 +3511,7 @@ brcmf_cfg80211_event(struct net_device *ndev,
        u32 event_type = be32_to_cpu(e->event_type);
        struct brcmf_cfg80211_priv *cfg_priv = ndev_to_cfg(ndev);
 
-       if (!brcmf_enq_event(cfg_priv, event_type, e))
+       if (!brcmf_enq_event(cfg_priv, event_type, e, data))
                schedule_work(&cfg_priv->event_work);
 }