aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorArend van Spriel <arend@broadcom.com>2013-04-05 04:57:54 -0400
committerJohn W. Linville <linville@tuxdriver.com>2013-04-08 15:28:48 -0400
commitdeb09280cd72ceb8b0679490f076d0e9f30dd456 (patch)
treeff8049302ee06d88343df9ff70735e4bf76d94a8
parent5b57af6ef7d087f58b2603796f594659f3978bff (diff)
brcmfmac: only use ifidx from BDC header in brcmf_rx_frames()
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>
-rw-r--r--drivers/net/wireless/brcm80211/brcmfmac/dhd_linux.c9
-rw-r--r--drivers/net/wireless/brcm80211/brcmfmac/fweh.c6
-rw-r--r--drivers/net/wireless/brcm80211/brcmfmac/fweh.h6
3 files changed, 7 insertions, 14 deletions
diff --git a/drivers/net/wireless/brcm80211/brcmfmac/dhd_linux.c b/drivers/net/wireless/brcm80211/brcmfmac/dhd_linux.c
index e68500bb63e7..763a84eba216 100644
--- a/drivers/net/wireless/brcm80211/brcmfmac/dhd_linux.c
+++ b/drivers/net/wireless/brcm80211/brcmfmac/dhd_linux.c
@@ -323,13 +323,8 @@ void brcmf_rx_frames(struct device *dev, struct sk_buff_head *skb_list)
323 /* Strip header, count, deliver upward */ 323 /* Strip header, count, deliver upward */
324 skb_pull(skb, ETH_HLEN); 324 skb_pull(skb, ETH_HLEN);
325 325
326 /* Process special event packets and then discard them */ 326 /* Process special event packets */
327 brcmf_fweh_process_skb(drvr, skb, &ifidx); 327 brcmf_fweh_process_skb(drvr, skb);
328
329 if (drvr->iflist[ifidx]) {
330 ifp = drvr->iflist[ifidx];
331 ifp->ndev->last_rx = jiffies;
332 }
333 328
334 if (!(ifp->ndev->flags & IFF_UP)) { 329 if (!(ifp->ndev->flags & IFF_UP)) {
335 brcmu_pkt_buf_free_skb(skb); 330 brcmu_pkt_buf_free_skb(skb);
diff --git a/drivers/net/wireless/brcm80211/brcmfmac/fweh.c b/drivers/net/wireless/brcm80211/brcmfmac/fweh.c
index 51ba13d243a5..5a64280e6485 100644
--- a/drivers/net/wireless/brcm80211/brcmfmac/fweh.c
+++ b/drivers/net/wireless/brcm80211/brcmfmac/fweh.c
@@ -407,13 +407,12 @@ int brcmf_fweh_activate_events(struct brcmf_if *ifp)
407 * 407 *
408 * @drvr: driver information object. 408 * @drvr: driver information object.
409 * @event_packet: event packet to process. 409 * @event_packet: event packet to process.
410 * @ifidx: index of the firmware interface (may change).
411 * 410 *
412 * If the packet buffer contains a firmware event message it will 411 * If the packet buffer contains a firmware event message it will
413 * dispatch the event to a registered handler (using worker). 412 * dispatch the event to a registered handler (using worker).
414 */ 413 */
415void brcmf_fweh_process_event(struct brcmf_pub *drvr, 414void brcmf_fweh_process_event(struct brcmf_pub *drvr,
416 struct brcmf_event *event_packet, u8 *ifidx) 415 struct brcmf_event *event_packet)
417{ 416{
418 enum brcmf_fweh_event_code code; 417 enum brcmf_fweh_event_code code;
419 struct brcmf_fweh_info *fweh = &drvr->fweh; 418 struct brcmf_fweh_info *fweh = &drvr->fweh;
@@ -425,7 +424,6 @@ void brcmf_fweh_process_event(struct brcmf_pub *drvr,
425 /* get event info */ 424 /* get event info */
426 code = get_unaligned_be32(&event_packet->msg.event_type); 425 code = get_unaligned_be32(&event_packet->msg.event_type);
427 datalen = get_unaligned_be32(&event_packet->msg.datalen); 426 datalen = get_unaligned_be32(&event_packet->msg.datalen);
428 *ifidx = event_packet->msg.ifidx;
429 data = &event_packet[1]; 427 data = &event_packet[1];
430 428
431 if (code >= BRCMF_E_LAST) 429 if (code >= BRCMF_E_LAST)
@@ -442,7 +440,7 @@ void brcmf_fweh_process_event(struct brcmf_pub *drvr,
442 return; 440 return;
443 441
444 event->code = code; 442 event->code = code;
445 event->ifidx = *ifidx; 443 event->ifidx = event_packet->msg.ifidx;
446 444
447 /* use memcpy to get aligned event message */ 445 /* use memcpy to get aligned event message */
448 memcpy(&event->emsg, &event_packet->msg, sizeof(event->emsg)); 446 memcpy(&event->emsg, &event_packet->msg, sizeof(event->emsg));
diff --git a/drivers/net/wireless/brcm80211/brcmfmac/fweh.h b/drivers/net/wireless/brcm80211/brcmfmac/fweh.h
index 8c39b51dcccf..6ec5db9c60a5 100644
--- a/drivers/net/wireless/brcm80211/brcmfmac/fweh.h
+++ b/drivers/net/wireless/brcm80211/brcmfmac/fweh.h
@@ -187,10 +187,10 @@ void brcmf_fweh_unregister(struct brcmf_pub *drvr,
187 enum brcmf_fweh_event_code code); 187 enum brcmf_fweh_event_code code);
188int brcmf_fweh_activate_events(struct brcmf_if *ifp); 188int brcmf_fweh_activate_events(struct brcmf_if *ifp);
189void brcmf_fweh_process_event(struct brcmf_pub *drvr, 189void brcmf_fweh_process_event(struct brcmf_pub *drvr,
190 struct brcmf_event *event_packet, u8 *ifidx); 190 struct brcmf_event *event_packet);
191 191
192static inline void brcmf_fweh_process_skb(struct brcmf_pub *drvr, 192static inline void brcmf_fweh_process_skb(struct brcmf_pub *drvr,
193 struct sk_buff *skb, u8 *ifidx) 193 struct sk_buff *skb)
194{ 194{
195 struct brcmf_event *event_packet; 195 struct brcmf_event *event_packet;
196 u8 *data; 196 u8 *data;
@@ -213,7 +213,7 @@ static inline void brcmf_fweh_process_skb(struct brcmf_pub *drvr,
213 if (usr_stype != BCMILCP_BCM_SUBTYPE_EVENT) 213 if (usr_stype != BCMILCP_BCM_SUBTYPE_EVENT)
214 return; 214 return;
215 215
216 brcmf_fweh_process_event(drvr, event_packet, ifidx); 216 brcmf_fweh_process_event(drvr, event_packet);
217} 217}
218 218
219#endif /* FWEH_H_ */ 219#endif /* FWEH_H_ */