Skip to content

Commit

Permalink
brcmfmac: only use ifidx from BDC header in brcmf_rx_frames()
Browse files Browse the repository at this point in the history
In brcmf_rx_frames() the call to brcmf_fweh_process_skb() could
change the ifidx using information in the event data. This is
only different to the BDC ifidx for IF ADD event. However, the
creation of the new interface is deferred to event worker so
it does not exist. After brcmf_fweh_process_skb() it is only
used to set statistics.

Reviewed-by: Hante Meuleman <meuleman@broadcom.com>
Reviewed-by: Pieter-Paul Giesberts <pieterpg@broadcom.com>
Signed-off-by: Arend van Spriel <arend@broadcom.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
  • Loading branch information
Arend van Spriel authored and John W. Linville committed Apr 8, 2013
1 parent 5b57af6 commit deb0928
Show file tree
Hide file tree
Showing 3 changed files with 7 additions and 14 deletions.
9 changes: 2 additions & 7 deletions drivers/net/wireless/brcm80211/brcmfmac/dhd_linux.c
Original file line number Diff line number Diff line change
Expand Up @@ -323,13 +323,8 @@ void brcmf_rx_frames(struct device *dev, struct sk_buff_head *skb_list)
/* Strip header, count, deliver upward */
skb_pull(skb, ETH_HLEN);

/* Process special event packets and then discard them */
brcmf_fweh_process_skb(drvr, skb, &ifidx);

if (drvr->iflist[ifidx]) {
ifp = drvr->iflist[ifidx];
ifp->ndev->last_rx = jiffies;
}
/* Process special event packets */
brcmf_fweh_process_skb(drvr, skb);

if (!(ifp->ndev->flags & IFF_UP)) {
brcmu_pkt_buf_free_skb(skb);
Expand Down
6 changes: 2 additions & 4 deletions drivers/net/wireless/brcm80211/brcmfmac/fweh.c
Original file line number Diff line number Diff line change
Expand Up @@ -407,13 +407,12 @@ int brcmf_fweh_activate_events(struct brcmf_if *ifp)
*
* @drvr: driver information object.
* @event_packet: event packet to process.
* @ifidx: index of the firmware interface (may change).
*
* If the packet buffer contains a firmware event message it will
* dispatch the event to a registered handler (using worker).
*/
void brcmf_fweh_process_event(struct brcmf_pub *drvr,
struct brcmf_event *event_packet, u8 *ifidx)
struct brcmf_event *event_packet)
{
enum brcmf_fweh_event_code code;
struct brcmf_fweh_info *fweh = &drvr->fweh;
Expand All @@ -425,7 +424,6 @@ void brcmf_fweh_process_event(struct brcmf_pub *drvr,
/* get event info */
code = get_unaligned_be32(&event_packet->msg.event_type);
datalen = get_unaligned_be32(&event_packet->msg.datalen);
*ifidx = event_packet->msg.ifidx;
data = &event_packet[1];

if (code >= BRCMF_E_LAST)
Expand All @@ -442,7 +440,7 @@ void brcmf_fweh_process_event(struct brcmf_pub *drvr,
return;

event->code = code;
event->ifidx = *ifidx;
event->ifidx = event_packet->msg.ifidx;

/* use memcpy to get aligned event message */
memcpy(&event->emsg, &event_packet->msg, sizeof(event->emsg));
Expand Down
6 changes: 3 additions & 3 deletions drivers/net/wireless/brcm80211/brcmfmac/fweh.h
Original file line number Diff line number Diff line change
Expand Up @@ -187,10 +187,10 @@ 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,
struct brcmf_event *event_packet, u8 *ifidx);
struct brcmf_event *event_packet);

static inline void brcmf_fweh_process_skb(struct brcmf_pub *drvr,
struct sk_buff *skb, u8 *ifidx)
struct sk_buff *skb)
{
struct brcmf_event *event_packet;
u8 *data;
Expand All @@ -213,7 +213,7 @@ static inline void brcmf_fweh_process_skb(struct brcmf_pub *drvr,
if (usr_stype != BCMILCP_BCM_SUBTYPE_EVENT)
return;

brcmf_fweh_process_event(drvr, event_packet, ifidx);
brcmf_fweh_process_event(drvr, event_packet);
}

#endif /* FWEH_H_ */

0 comments on commit deb0928

Please sign in to comment.