99#include <linux/can.h>
1010#include <linux/can/dev.h>
1111#include <linux/can/error.h>
12+ #include <linux/err.h>
1213#include <linux/ethtool.h>
1314#include <linux/module.h>
1415#include <linux/netdevice.h>
@@ -274,6 +275,7 @@ struct esd_usb {
274275 int net_count ;
275276 u32 version ;
276277 int rxinitdone ;
278+ int in_usb_disconnect ;
277279 void * rxbuf [ESD_USB_MAX_RX_URBS ];
278280 dma_addr_t rxbuf_dma [ESD_USB_MAX_RX_URBS ];
279281};
@@ -480,7 +482,7 @@ static void esd_usb_tx_done_msg(struct esd_usb_net_priv *priv,
480482static void esd_usb_read_bulk_callback (struct urb * urb )
481483{
482484 struct esd_usb * dev = urb -> context ;
483- int retval ;
485+ int err ;
484486 int pos = 0 ;
485487 int i ;
486488
@@ -496,7 +498,7 @@ static void esd_usb_read_bulk_callback(struct urb *urb)
496498
497499 default :
498500 dev_info (dev -> udev -> dev .parent ,
499- "Rx URB aborted (%d )\n" , urb -> status );
501+ "Rx URB aborted (%pe )\n" , ERR_PTR ( urb -> status ) );
500502 goto resubmit_urb ;
501503 }
502504
@@ -539,15 +541,15 @@ static void esd_usb_read_bulk_callback(struct urb *urb)
539541 urb -> transfer_buffer , ESD_USB_RX_BUFFER_SIZE ,
540542 esd_usb_read_bulk_callback , dev );
541543
542- retval = usb_submit_urb (urb , GFP_ATOMIC );
543- if (retval == - ENODEV ) {
544+ err = usb_submit_urb (urb , GFP_ATOMIC );
545+ if (err == - ENODEV ) {
544546 for (i = 0 ; i < dev -> net_count ; i ++ ) {
545547 if (dev -> nets [i ])
546548 netif_device_detach (dev -> nets [i ]-> netdev );
547549 }
548- } else if (retval ) {
550+ } else if (err ) {
549551 dev_err (dev -> udev -> dev .parent ,
550- "failed resubmitting read bulk urb: %d \n" , retval );
552+ "failed resubmitting read bulk urb: %pe \n" , ERR_PTR ( err ) );
551553 }
552554}
553555
@@ -572,7 +574,7 @@ static void esd_usb_write_bulk_callback(struct urb *urb)
572574 return ;
573575
574576 if (urb -> status )
575- netdev_info (netdev , "Tx URB aborted (%d )\n" , urb -> status );
577+ netdev_info (netdev , "Tx URB aborted (%pe )\n" , ERR_PTR ( urb -> status ) );
576578
577579 netif_trans_update (netdev );
578580}
@@ -758,7 +760,7 @@ static int esd_usb_start(struct esd_usb_net_priv *priv)
758760 if (err == - ENODEV )
759761 netif_device_detach (netdev );
760762 if (err )
761- netdev_err (netdev , "couldn't start device: %d \n" , err );
763+ netdev_err (netdev , "couldn't start device: %pe \n" , ERR_PTR ( err ) );
762764
763765 kfree (msg );
764766 return err ;
@@ -800,7 +802,6 @@ static int esd_usb_open(struct net_device *netdev)
800802 /* finally start device */
801803 err = esd_usb_start (priv );
802804 if (err ) {
803- netdev_warn (netdev , "couldn't start device: %d\n" , err );
804805 close_candev (netdev );
805806 return err ;
806807 }
@@ -923,7 +924,7 @@ static netdev_tx_t esd_usb_start_xmit(struct sk_buff *skb,
923924 if (err == - ENODEV )
924925 netif_device_detach (netdev );
925926 else
926- netdev_warn (netdev , "failed tx_urb %d \n" , err );
927+ netdev_warn (netdev , "failed tx_urb %pe \n" , ERR_PTR ( err ) );
927928
928929 goto releasebuf ;
929930 }
@@ -947,10 +948,11 @@ static netdev_tx_t esd_usb_start_xmit(struct sk_buff *skb,
947948 return ret ;
948949}
949950
950- static int esd_usb_close (struct net_device * netdev )
951+ /* Stop interface */
952+ static int esd_usb_stop (struct esd_usb_net_priv * priv )
951953{
952- struct esd_usb_net_priv * priv = netdev_priv (netdev );
953954 union esd_usb_msg * msg ;
955+ int err ;
954956 int i ;
955957
956958 msg = kmalloc (sizeof (* msg ), GFP_KERNEL );
@@ -964,27 +966,45 @@ static int esd_usb_close(struct net_device *netdev)
964966 msg -> filter .option = ESD_USB_ID_ENABLE ; /* start with segment 0 */
965967 for (i = 0 ; i <= ESD_USB_MAX_ID_SEGMENT ; i ++ )
966968 msg -> filter .mask [i ] = 0 ;
967- if (esd_usb_send_msg (priv -> usb , msg ) < 0 )
968- netdev_err (netdev , "sending idadd message failed\n" );
969+ err = esd_usb_send_msg (priv -> usb , msg );
970+ if (err < 0 ) {
971+ netdev_err (priv -> netdev , "sending idadd message failed: %pe\n" , ERR_PTR (err ));
972+ goto bail ;
973+ }
969974
970975 /* set CAN controller to reset mode */
971976 msg -> hdr .len = sizeof (struct esd_usb_set_baudrate_msg ) / sizeof (u32 ); /* # of 32bit words */
972977 msg -> hdr .cmd = ESD_USB_CMD_SETBAUD ;
973978 msg -> setbaud .net = priv -> index ;
974979 msg -> setbaud .rsvd = 0 ;
975980 msg -> setbaud .baud = cpu_to_le32 (ESD_USB_NO_BAUDRATE );
976- if (esd_usb_send_msg (priv -> usb , msg ) < 0 )
977- netdev_err (netdev , "sending setbaud message failed\n" );
981+ err = esd_usb_send_msg (priv -> usb , msg );
982+ if (err < 0 )
983+ netdev_err (priv -> netdev , "sending setbaud message failed: %pe\n" , ERR_PTR (err ));
984+
985+ bail :
986+ kfree (msg );
987+
988+ return err ;
989+ }
990+
991+ static int esd_usb_close (struct net_device * netdev )
992+ {
993+ struct esd_usb_net_priv * priv = netdev_priv (netdev );
994+ int err = 0 ;
995+
996+ if (!priv -> usb -> in_usb_disconnect ) {
997+ /* It's moot to try this in usb_disconnect()! */
998+ err = esd_usb_stop (priv );
999+ }
9781000
9791001 priv -> can .state = CAN_STATE_STOPPED ;
9801002
9811003 netif_stop_queue (netdev );
9821004
9831005 close_candev (netdev );
9841006
985- kfree (msg );
986-
987- return 0 ;
1007+ return err ;
9881008}
9891009
9901010static const struct net_device_ops esd_usb_netdev_ops = {
@@ -1251,14 +1271,14 @@ static int esd_usb_probe_one_net(struct usb_interface *intf, int index)
12511271
12521272 err = register_candev (netdev );
12531273 if (err ) {
1254- dev_err (& intf -> dev , "couldn't register CAN device: %d \n" , err );
1274+ dev_err (& intf -> dev , "couldn't register CAN device: %pe \n" , ERR_PTR ( err ) );
12551275 free_candev (netdev );
12561276 err = - ENOMEM ;
12571277 goto done ;
12581278 }
12591279
12601280 dev -> nets [index ] = priv ;
1261- netdev_info (netdev , "device %s registered\n" , netdev -> name );
1281+ netdev_info (netdev , "registered\n" );
12621282
12631283done :
12641284 return err ;
@@ -1354,9 +1374,11 @@ static void esd_usb_disconnect(struct usb_interface *intf)
13541374 usb_set_intfdata (intf , NULL );
13551375
13561376 if (dev ) {
1377+ dev -> in_usb_disconnect = 1 ;
13571378 for (i = 0 ; i < dev -> net_count ; i ++ ) {
13581379 if (dev -> nets [i ]) {
13591380 netdev = dev -> nets [i ]-> netdev ;
1381+ netdev_info (netdev , "unregister\n" );
13601382 unregister_netdev (netdev );
13611383 free_candev (netdev );
13621384 }
0 commit comments