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>
This commit is contained in:
parent
90d03ff71b
commit
c4fdb05696
2 changed files with 15 additions and 3 deletions
|
@ -140,6 +140,8 @@ struct brcmf_event_msg {
|
||||||
__be32 datalen;
|
__be32 datalen;
|
||||||
u8 addr[ETH_ALEN];
|
u8 addr[ETH_ALEN];
|
||||||
char ifname[IFNAMSIZ];
|
char ifname[IFNAMSIZ];
|
||||||
|
u8 ifidx;
|
||||||
|
u8 bsscfgidx;
|
||||||
} __packed;
|
} __packed;
|
||||||
|
|
||||||
struct brcm_ethhdr {
|
struct brcm_ethhdr {
|
||||||
|
|
|
@ -3321,18 +3321,28 @@ static struct brcmf_cfg80211_event_q *brcmf_deq_event(
|
||||||
|
|
||||||
static s32
|
static s32
|
||||||
brcmf_enq_event(struct brcmf_cfg80211_priv *cfg_priv, u32 event,
|
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;
|
struct brcmf_cfg80211_event_q *e;
|
||||||
s32 err = 0;
|
s32 err = 0;
|
||||||
ulong flags;
|
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)
|
if (!e)
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
|
|
||||||
e->etype = event;
|
e->etype = event;
|
||||||
memcpy(&e->emsg, msg, sizeof(struct brcmf_event_msg));
|
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);
|
spin_lock_irqsave(&cfg_priv->evt_q_lock, flags);
|
||||||
list_add_tail(&e->evt_q_list, &cfg_priv->evt_q_list);
|
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);
|
u32 event_type = be32_to_cpu(e->event_type);
|
||||||
struct brcmf_cfg80211_priv *cfg_priv = ndev_to_cfg(ndev);
|
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);
|
schedule_work(&cfg_priv->event_work);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue