brcmfmac: only use ifidx from BDC header in brcmf_rx_frames()
authorArend van Spriel <arend@broadcom.com>
Fri, 5 Apr 2013 08:57:54 +0000 (10:57 +0200)
committerJohn W. Linville <linville@tuxdriver.com>
Mon, 8 Apr 2013 19:28:48 +0000 (15:28 -0400)
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>
drivers/net/wireless/brcm80211/brcmfmac/dhd_linux.c
drivers/net/wireless/brcm80211/brcmfmac/fweh.c
drivers/net/wireless/brcm80211/brcmfmac/fweh.h

index e68500bb63e70008e7f4156833d2bd0387cce963..763a84eba2164ca73a07923059f39c067a8717da 100644 (file)
@@ -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);
index 51ba13d243a5fb8053af5228e93bb9d44ebbfaff..5a64280e64850867e2a4590050f024687e28749e 100644 (file)
@@ -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;
@@ -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)
@@ -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));
index 8c39b51dcccfcead4dd00efd8f2bf572476ecbeb..6ec5db9c60a52196e2cd1273efda7d7652b031ba 100644 (file)
@@ -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;
@@ -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_ */