@@ -311,16 +311,17 @@ void brcmf_txflowblock(struct device *dev, bool state)
311311 brcmf_fws_bus_blocked (drvr , state );
312312}
313313
314- void brcmf_netif_rx (struct brcmf_if * ifp , struct sk_buff * skb )
314+ void brcmf_netif_rx (struct brcmf_if * ifp , struct sk_buff * skb ,
315+ bool handle_event )
315316{
316- skb -> dev = ifp -> ndev ;
317- skb -> protocol = eth_type_trans (skb , skb -> dev );
317+ skb -> protocol = eth_type_trans (skb , ifp -> ndev );
318318
319319 if (skb -> pkt_type == PACKET_MULTICAST )
320320 ifp -> stats .multicast ++ ;
321321
322322 /* Process special event packets */
323- brcmf_fweh_process_skb (ifp -> drvr , skb );
323+ if (handle_event )
324+ brcmf_fweh_process_skb (ifp -> drvr , skb );
324325
325326 if (!(ifp -> ndev -> flags & IFF_UP )) {
326327 brcmu_pkt_buf_free_skb (skb );
@@ -381,7 +382,7 @@ static void brcmf_rxreorder_process_info(struct brcmf_if *ifp, u8 *reorder_data,
381382 /* validate flags and flow id */
382383 if (flags == 0xFF ) {
383384 brcmf_err ("invalid flags...so ignore this packet\n" );
384- brcmf_netif_rx (ifp , pkt );
385+ brcmf_netif_rx (ifp , pkt , false );
385386 return ;
386387 }
387388
@@ -393,7 +394,7 @@ static void brcmf_rxreorder_process_info(struct brcmf_if *ifp, u8 *reorder_data,
393394 if (rfi == NULL ) {
394395 brcmf_dbg (INFO , "received flags to cleanup, but no flow (%d) yet\n" ,
395396 flow_id );
396- brcmf_netif_rx (ifp , pkt );
397+ brcmf_netif_rx (ifp , pkt , false );
397398 return ;
398399 }
399400
@@ -418,7 +419,7 @@ static void brcmf_rxreorder_process_info(struct brcmf_if *ifp, u8 *reorder_data,
418419 rfi = kzalloc (buf_size , GFP_ATOMIC );
419420 if (rfi == NULL ) {
420421 brcmf_err ("failed to alloc buffer\n" );
421- brcmf_netif_rx (ifp , pkt );
422+ brcmf_netif_rx (ifp , pkt , false );
422423 return ;
423424 }
424425
@@ -532,11 +533,11 @@ static void brcmf_rxreorder_process_info(struct brcmf_if *ifp, u8 *reorder_data,
532533netif_rx :
533534 skb_queue_walk_safe (& reorder_list , pkt , pnext ) {
534535 __skb_unlink (pkt , & reorder_list );
535- brcmf_netif_rx (ifp , pkt );
536+ brcmf_netif_rx (ifp , pkt , false );
536537 }
537538}
538539
539- void brcmf_rx_frame (struct device * dev , struct sk_buff * skb )
540+ void brcmf_rx_frame (struct device * dev , struct sk_buff * skb , bool handle_evnt )
540541{
541542 struct brcmf_if * ifp ;
542543 struct brcmf_bus * bus_if = dev_get_drvdata (dev );
@@ -560,7 +561,32 @@ void brcmf_rx_frame(struct device *dev, struct sk_buff *skb)
560561 if (rd -> reorder )
561562 brcmf_rxreorder_process_info (ifp , rd -> reorder , skb );
562563 else
563- brcmf_netif_rx (ifp , skb );
564+ brcmf_netif_rx (ifp , skb , handle_evnt );
565+ }
566+
567+ void brcmf_rx_event (struct device * dev , struct sk_buff * skb )
568+ {
569+ struct brcmf_if * ifp ;
570+ struct brcmf_bus * bus_if = dev_get_drvdata (dev );
571+ struct brcmf_pub * drvr = bus_if -> drvr ;
572+ int ret ;
573+
574+ brcmf_dbg (EVENT , "Enter: %s: rxp=%p\n" , dev_name (dev ), skb );
575+
576+ /* process and remove protocol-specific header */
577+ ret = brcmf_proto_hdrpull (drvr , true, skb , & ifp );
578+
579+ if (ret || !ifp || !ifp -> ndev ) {
580+ if (ret != - ENODATA && ifp )
581+ ifp -> stats .rx_errors ++ ;
582+ brcmu_pkt_buf_free_skb (skb );
583+ return ;
584+ }
585+
586+ skb -> protocol = eth_type_trans (skb , ifp -> ndev );
587+
588+ brcmf_fweh_process_skb (ifp -> drvr , skb );
589+ brcmu_pkt_buf_free_skb (skb );
564590}
565591
566592void brcmf_txfinalize (struct brcmf_if * ifp , struct sk_buff * txp , bool success )
0 commit comments