On Tue, 19 Apr 2011, Paul Stewart wrote: > Resubmit interrupt URB if device is open. Use a flag set in > usbnet_open() to determine this state. Also kill and free > interrupt URB in usbnet_disconnect(). Generally good, but a couple of things are questionable... > Signed-off-by: Paul Stewart <pstew@xxxxxxxxxxxx> > --- > drivers/net/usb/usbnet.c | 14 ++++++++++++++ > include/linux/usb/usbnet.h | 1 + > 2 files changed, 15 insertions(+), 0 deletions(-) > > diff --git a/drivers/net/usb/usbnet.c b/drivers/net/usb/usbnet.c > index 02d25c7..c7cf4af 100644 > --- a/drivers/net/usb/usbnet.c > +++ b/drivers/net/usb/usbnet.c > @@ -643,6 +643,7 @@ static int usbnet_open (struct net_device *net) > } > } > > + set_bit(EVENT_DEV_OPEN, &dev->flags); > netif_start_queue (net); > if (netif_msg_ifup (dev)) { > char *framing; You forgot to clear this flag in usbnet_stop(). By the way, there is FLAG_AVOID_UNLINK_URBS defined in usbnet.h and used in usbnet_stop(). Is it meant to apply to the interrupt URB as well as the others? > @@ -1105,6 +1106,11 @@ void usbnet_disconnect (struct usb_interface *intf) > if (dev->driver_info->unbind) > dev->driver_info->unbind (dev, intf); > > + if (dev->interrupt) { > + usb_kill_urb(dev->interrupt); > + usb_free_urb(dev->interrupt); > + } > + usb_kill_urb and usb_free_urb include their own tests for urb == NULL; you don't need to test it here or below. > free_netdev(net); > usb_put_dev (xdev); > } > @@ -1285,6 +1291,10 @@ int usbnet_suspend (struct usb_interface *intf, pm_message_t message) > * wake the device > */ > netif_device_attach (dev->net); > + > + /* Stop interrupt URBs */ > + if (dev->interrupt) > + usb_kill_urb(dev->interrupt); > } > return 0; > } There is a subtle question here: When is the best time to kill the interrupt URB? Without knowing any of the details, I'd guess that the interrupt URB reports asynchronous events and the driver could run into trouble if one of those events occurred while everything else was turned off. This suggests that the interrupt URB should be killed as soon as possible rather than as late as possible. But maybe it doesn't matter; it all depends on the design of the driver. > @@ -1297,6 +1307,10 @@ int usbnet_resume (struct usb_interface *intf) > if (!--dev->suspend_count) > tasklet_schedule (&dev->bh); > > + /* resume interrupt URBs */ > + if (dev->interrupt && test_bit(EVENT_DEV_OPEN, &dev->flags)) > + usb_submit_urb(dev->interrupt, GFP_NOIO); > + > return 0; > } Alan Stern -- To unsubscribe from this list: send the line "unsubscribe linux-usb" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html