/* forward reference to make our lives easier */
static struct usb_driver usblp_driver;
-static DECLARE_MUTEX(usblp_sem); /* locks the existence of usblp's */
/*
* Functions for usblp control messages.
if (minor < 0)
return -ENODEV;
- down (&usblp_sem);
+ lock_kernel();
retval = -ENODEV;
intf = usb_find_interface(&usblp_driver, minor);
}
}
out:
- up (&usblp_sem);
+ unlock_kernel();
return retval;
}
static void usblp_unlink_urbs(struct usblp *usblp)
{
- usb_kill_urb(usblp->writeurb);
+ usb_unlink_urb(usblp->writeurb);
if (usblp->bidir)
- usb_kill_urb(usblp->readurb);
+ usb_unlink_urb(usblp->readurb);
}
static int usblp_release(struct inode *inode, struct file *file)
{
struct usblp *usblp = file->private_data;
- down (&usblp_sem);
+ down (&usblp->sem);
usblp->used = 0;
if (usblp->present) {
usblp_unlink_urbs(usblp);
+ up(&usblp->sem);
} else /* finish cleanup from disconnect */
usblp_cleanup (usblp);
- up (&usblp_sem);
return 0;
}
BUG ();
}
- down (&usblp_sem);
down (&usblp->sem);
+ lock_kernel();
usblp->present = 0;
usb_set_intfdata (intf, NULL);
usblp->writebuf, usblp->writeurb->transfer_dma);
usb_buffer_free (usblp->dev, USBLP_BUF_SIZE,
usblp->readbuf, usblp->readurb->transfer_dma);
- up (&usblp->sem);
if (!usblp->used)
usblp_cleanup (usblp);
- up (&usblp_sem);
+ else /* cleanup later, on release */
+ up (&usblp->sem);
+ unlock_kernel();
}
static struct usb_device_id usblp_ids [] = {