Skip to content

Commit 2c9684b

Browse files
Merge patch series "can: esd_usb: Fixes and improvements"
Stefan Mätje <[email protected]> says: The first patch makes some error messages also print the error code to achieve a higher significance. Removes also a duplicate message and makes the register / unregister messages symmetric. The second patch avoids emitting any error messages during the disconnect of CAN-USB devices or the driver unload. Changes in v2: - Second patch: - Convert all occurrences of error status prints to use "ERR_PTR(err)" instead of printing the decimal value of "err". - Rename retval to err in esd_usb_read_bulk_callback() to make the naming of error status variables consistent with all other functions. Link: https://patch.msgid.link/[email protected] [mkl: only take paches 4+5, which are new features, adjust cover letter accordingly] Signed-off-by: Marc Kleine-Budde <[email protected]>
2 parents 79edb88 + 37dc3ea commit 2c9684b

File tree

1 file changed

+43
-21
lines changed

1 file changed

+43
-21
lines changed

drivers/net/can/usb/esd_usb.c

Lines changed: 43 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
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,
480482
static 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

9901010
static 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

12631283
done:
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

Comments
 (0)