On Mon, 14 Aug 2006 [EMAIL PROTECTED] wrote: > The driver I'm talking about is the snd-usb-audio. If the world would > be perfect there would only be a single standard compliant driver for > all usb audio devices. But as we all now it isn't. This is the reason > why there are a lot of quirks and other special functions in this > driver to support special hardware. The Fast Trak I'm talking about is > not (yet) included but it has as similar behaviour like the Audiophile > USB. This is configured by supplying option to the module through > parameters. > > > > > > The decision of whether to use 16-bit or 24-bit audio should be made by > > the user, not by the kernel. By changing the driver the way you want, you > > would prevent people from using the device in 16-bit mode. > > This is not right because all altsets from the configuration 1 are > also included in configuration 2. This is the reason why I think > switching the configuration in the driver would do no harm.
I see. It sounds like a bad design. If all the altsettings from config 1 are also present in config 2, why does config 1 exist at all? > > Assuming you > > really want to do that, it wouldn't be too hard to add support for > > allowing a driver to change device configurations. > > How would I do that? Try the patch below. (Note: I haven't tested it.) Alan Stern Index: usb-2.6/include/linux/usb.h =================================================================== --- usb-2.6.orig/include/linux/usb.h +++ usb-2.6/include/linux/usb.h @@ -1112,6 +1112,9 @@ extern int usb_clear_halt(struct usb_dev extern int usb_reset_configuration(struct usb_device *dev); extern int usb_set_interface(struct usb_device *dev, int ifnum, int alternate); +/* this request isn't really synchronous, but it belongs with the others */ +extern int usb_driver_set_configuration(struct usb_device *udev, int config); + /* * timeouts, in milliseconds, used for sending/receiving control messages * they typically complete within a few frames (msec) after they're issued Index: usb-2.6/drivers/usb/core/message.c =================================================================== --- usb-2.6.orig/drivers/usb/core/message.c +++ usb-2.6/drivers/usb/core/message.c @@ -1493,6 +1493,63 @@ free_interfaces: return 0; } +struct set_config_request { + struct usb_device *udev; + int config; + struct work_struct work; +}; + +/* Worker routine for usb_driver_set_configuration() */ +static void driver_set_config_work(void *_req) +{ + struct set_config_request *req = _req; + + usb_lock_device(req->udev); + usb_set_configuration(req->udev, req->config); + usb_unlock_device(req->udev); + usb_put_dev(req->udev); + kfree(req); +} + +/** + * usb_driver_set_configuration - Provide a way for drivers to change device configurations + * @dev: the device whose configuration is being updated + * @configuration: the configuration being chosen. + * Context: In process context, must be able to sleep + * + * Device interface drivers are not allowed to change device configurations. + * This because changing configurations will destroy the interface the driver + * is bound to and create new ones; it would be like a floppy-disk driver + * telling the computer to replace the floppy-disk drive with a tape drive! + * + * Still, in certain specialized circumstances the need may arise. This + * routine gets around the normal restriction by using a work thread to + * submit the change-config request. + * + * Returns 0 if the request was succesfully queued, error code otherwise. + */ +int usb_driver_set_configuration(struct usb_device *udev, int config) +{ + struct set_config_request *req; + int rc; + + req = kmalloc(sizeof(*req), GFP_KERNEL); + if (!req) + return -ENOMEM; + req->udev = udev; + req->config = config; + INIT_WORK(&req->work, driver_set_config_work, req); + + usb_get_dev(udev); + rc = schedule_work(&req->work); + if (rc) { + usb_put_dev(udev); + kfree(req); + } + return rc; +} +EXPORT_SYMBOL_GPL(usb_driver_set_configuration); + // synchronous request completion model EXPORT_SYMBOL(usb_control_msg); EXPORT_SYMBOL(usb_bulk_msg); ------------------------------------------------------------------------- Using Tomcat but need to do more? Need to support web services, security? Get stuff done quickly with pre-integrated technology to make your job easier Download IBM WebSphere Application Server v.1.0.1 based on Apache Geronimo http://sel.as-us.falkag.net/sel?cmd=lnk&kid=120709&bid=263057&dat=121642 _______________________________________________ linux-usb-devel@lists.sourceforge.net To unsubscribe, use the last form field at: https://lists.sourceforge.net/lists/listinfo/linux-usb-devel