@@ -413,6 +413,7 @@ static void f81604_read_bulk_callback(struct urb *urb)
413413{
414414 struct f81604_can_frame * frame = urb -> transfer_buffer ;
415415 struct net_device * netdev = urb -> context ;
416+ struct f81604_port_priv * priv = netdev_priv (netdev );
416417 int ret ;
417418
418419 if (!netif_device_present (netdev ))
@@ -445,10 +446,15 @@ static void f81604_read_bulk_callback(struct urb *urb)
445446 f81604_process_rx_packet (netdev , frame );
446447
447448resubmit_urb :
449+ usb_anchor_urb (urb , & priv -> urbs_anchor );
448450 ret = usb_submit_urb (urb , GFP_ATOMIC );
451+ if (!ret )
452+ return ;
453+ usb_unanchor_urb (urb );
454+
449455 if (ret == - ENODEV )
450456 netif_device_detach (netdev );
451- else if ( ret )
457+ else
452458 netdev_err (netdev ,
453459 "%s: failed to resubmit read bulk urb: %pe\n" ,
454460 __func__ , ERR_PTR (ret ));
@@ -620,6 +626,12 @@ static void f81604_read_int_callback(struct urb *urb)
620626 netdev_info (netdev , "%s: Int URB aborted: %pe\n" , __func__ ,
621627 ERR_PTR (urb -> status ));
622628
629+ if (urb -> actual_length < sizeof (* data )) {
630+ netdev_warn (netdev , "%s: short int URB: %u < %zu\n" ,
631+ __func__ , urb -> actual_length , sizeof (* data ));
632+ goto resubmit_urb ;
633+ }
634+
623635 switch (urb -> status ) {
624636 case 0 : /* success */
625637 break ;
@@ -646,10 +658,15 @@ static void f81604_read_int_callback(struct urb *urb)
646658 f81604_handle_tx (priv , data );
647659
648660resubmit_urb :
661+ usb_anchor_urb (urb , & priv -> urbs_anchor );
649662 ret = usb_submit_urb (urb , GFP_ATOMIC );
663+ if (!ret )
664+ return ;
665+ usb_unanchor_urb (urb );
666+
650667 if (ret == - ENODEV )
651668 netif_device_detach (netdev );
652- else if ( ret )
669+ else
653670 netdev_err (netdev , "%s: failed to resubmit int urb: %pe\n" ,
654671 __func__ , ERR_PTR (ret ));
655672}
@@ -874,9 +891,27 @@ static void f81604_write_bulk_callback(struct urb *urb)
874891 if (!netif_device_present (netdev ))
875892 return ;
876893
877- if (urb -> status )
878- netdev_info (netdev , "%s: Tx URB error: %pe\n" , __func__ ,
879- ERR_PTR (urb -> status ));
894+ if (!urb -> status )
895+ return ;
896+
897+ switch (urb -> status ) {
898+ case - ENOENT :
899+ case - ECONNRESET :
900+ case - ESHUTDOWN :
901+ return ;
902+ default :
903+ break ;
904+ }
905+
906+ if (net_ratelimit ())
907+ netdev_err (netdev , "%s: Tx URB error: %pe\n" , __func__ ,
908+ ERR_PTR (urb -> status ));
909+
910+ can_free_echo_skb (netdev , 0 , NULL );
911+ netdev -> stats .tx_dropped ++ ;
912+ netdev -> stats .tx_errors ++ ;
913+
914+ netif_wake_queue (netdev );
880915}
881916
882917static void f81604_clear_reg_work (struct work_struct * work )
0 commit comments