--- x/drivers/media/rc/imon.c +++ i/drivers/media/rc/imon.c @@ -536,7 +536,7 @@ static int display_open(struct inode *in mutex_lock(&ictx->lock); - if (!ictx->display_supported) { + if (ictx->disconnected || !ictx->display_supported) { pr_err("display not supported by device\n"); retval = -ENODEV; } else if (ictx->display_isopen) { @@ -598,6 +598,10 @@ static int send_packet(struct imon_conte int retval = 0; struct usb_ctrlrequest *control_req = NULL; + if (ictx->disconnected) + return -ENODEV; + if (ictx->tx.busy) + return -EBUSY; /* Check if we need to use control or interrupt urb */ if (!ictx->tx_control) { pipe = usb_sndintpipe(ictx->usbdev_intf0, @@ -655,6 +659,7 @@ static int send_packet(struct imon_conte } mutex_lock(&ictx->lock); + ictx->tx.busy = false; retval = ictx->tx.status; if (retval) pr_err_ratelimited("packet tx failed (%d)\n", retval); @@ -2498,7 +2503,9 @@ static void imon_disconnect(struct usb_i int ifnum; ictx = usb_get_intfdata(interface); + mutex_lock(&ictx->lock); ictx->disconnected = true; + mutex_unlock(&ictx->lock); dev = ictx->dev; ifnum = interface->cur_altsetting->desc.bInterfaceNumber;