patch-2.4.23 linux-2.4.23/drivers/usb/devio.c
Next file: linux-2.4.23/drivers/usb/gadget/Config.in
Previous file: linux-2.4.23/drivers/usb/brlvger.c
Back to the patch index
Back to the overall index
- Lines: 74
- Date:
2003-11-28 10:26:20.000000000 -0800
- Orig file:
linux-2.4.22/drivers/usb/devio.c
- Orig date:
2003-06-13 07:51:36.000000000 -0700
diff -urN linux-2.4.22/drivers/usb/devio.c linux-2.4.23/drivers/usb/devio.c
@@ -1078,6 +1078,8 @@
int size;
void *buf = 0;
int retval = 0;
+ struct usb_interface *ifp = 0;
+ struct usb_driver *driver = 0;
/* get input parameters and alloc buffer */
if (copy_from_user(&ctrl, (void *) arg, sizeof (ctrl)))
@@ -1095,32 +1097,41 @@
}
}
- /* ioctl to device */
- if (ctrl.ifno < 0) {
- switch (ctrl.ioctl_code) {
- /* access/release token for issuing control messages
- * ask a particular driver to bind/unbind, ... etc
- */
- }
- retval = -ENOSYS;
-
- /* ioctl to the driver which has claimed a given interface */
- } else {
- struct usb_interface *ifp = 0;
- if (!ps->dev)
- retval = -ENODEV;
- else if (ctrl.ifno >= ps->dev->actconfig->bNumInterfaces)
- retval = -EINVAL;
+ if (!ps->dev)
+ retval = -ENODEV;
+ else if (!(ifp = usb_ifnum_to_if (ps->dev, ctrl.ifno)))
+ retval = -EINVAL;
+ else switch (ctrl.ioctl_code) {
+
+ /* disconnect kernel driver from interface, leaving it unbound. */
+ case USBDEVFS_DISCONNECT:
+ driver = ifp->driver;
+ if (driver) {
+ down (&driver->serialize);
+ dbg ("disconnect '%s' from dev %d interface %d",
+ driver->name, ps->dev->devnum, ctrl.ifno);
+ driver->disconnect (ps->dev, ifp->private_data);
+ usb_driver_release_interface (driver, ifp);
+ up (&driver->serialize);
+ } else
+ retval = -ENODATA;
+ break;
+
+ /* let kernel drivers try to (re)bind to the interface */
+ case USBDEVFS_CONNECT:
+ usb_find_interface_driver_for_ifnum (ps->dev, ctrl.ifno);
+ break;
+
+ /* talk directly to the interface's driver */
+ default:
+ driver = ifp->driver;
+ if (driver == 0 || driver->ioctl == 0)
+ retval = -ENOSYS;
else {
- if (!(ifp = usb_ifnum_to_if (ps->dev, ctrl.ifno)))
- retval = -EINVAL;
- else if (ifp->driver == 0 || ifp->driver->ioctl == 0)
- retval = -ENOSYS;
- }
- if (retval == 0)
/* ifno might usefully be passed ... */
- retval = ifp->driver->ioctl (ps->dev, ctrl.ioctl_code, buf);
+ retval = driver->ioctl (ps->dev, ctrl.ioctl_code, buf);
/* size = min_t(int, size, retval)? */
+ }
}
/* cleanup and return */
FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen (who was at: slshen@lbl.gov)