patch-2.4.21 linux-2.4.21/drivers/usb/usb.c
Next file: linux-2.4.21/drivers/usb/usbkbd.c
Previous file: linux-2.4.21/drivers/usb/usb-uhci.h
Back to the patch index
Back to the overall index
- Lines: 83
- Date:
2003-06-13 07:51:37.000000000 -0700
- Orig file:
linux-2.4.20/drivers/usb/usb.c
- Orig date:
2002-11-28 15:53:15.000000000 -0800
diff -urN linux-2.4.20/drivers/usb/usb.c linux-2.4.21/drivers/usb/usb.c
@@ -782,7 +782,7 @@
* cases, we know no other thread can recycle our address, since we must
* already have been serialized enough to prevent that.
*/
-static void call_policy (char *verb, struct usb_device *dev)
+static void call_policy_interface (char *verb, struct usb_device *dev, int interface)
{
char *argv [3], **envp, *buf, *scratch;
int i = 0, value;
@@ -861,20 +861,14 @@
dev->descriptor.bDeviceSubClass,
dev->descriptor.bDeviceProtocol) + 1;
if (dev->descriptor.bDeviceClass == 0) {
- int alt = dev->actconfig->interface [0].act_altsetting;
+ int alt = dev->actconfig->interface [interface].act_altsetting;
- /* a simple/common case: one config, one interface, one driver
- * with current altsetting being a reasonable setting.
- * everything needs a smart agent and usbdevfs; or can rely on
- * device-specific binding policies.
- */
envp [i++] = scratch;
scratch += sprintf (scratch, "INTERFACE=%d/%d/%d",
- dev->actconfig->interface [0].altsetting [alt].bInterfaceClass,
- dev->actconfig->interface [0].altsetting [alt].bInterfaceSubClass,
- dev->actconfig->interface [0].altsetting [alt].bInterfaceProtocol)
+ dev->actconfig->interface [interface].altsetting [alt].bInterfaceClass,
+ dev->actconfig->interface [interface].altsetting [alt].bInterfaceSubClass,
+ dev->actconfig->interface [interface].altsetting [alt].bInterfaceProtocol)
+ 1;
- /* INTERFACE-0, INTERFACE-1, ... ? */
}
envp [i++] = 0;
/* assert: (scratch - buf) < sizeof buf */
@@ -889,6 +883,14 @@
dbg ("kusbd policy returned 0x%x", value);
}
+static void call_policy (char *verb, struct usb_device *dev)
+{
+ int i;
+ for (i = 0; i < dev->actconfig->bNumInterfaces; i++) {
+ call_policy_interface (verb, dev, i);
+ }
+}
+
#else
static inline void
@@ -1003,7 +1005,7 @@
struct urb *urb;
urb = (struct urb *)kmalloc(sizeof(struct urb) + iso_packets * sizeof(struct iso_packet_descriptor),
- in_interrupt() ? GFP_ATOMIC : GFP_KERNEL);
+ /* pessimize to prevent deadlocks */ GFP_ATOMIC);
if (!urb) {
err("alloc_urb: kmalloc failed");
return NULL;
@@ -1785,17 +1787,17 @@
* These are the actual routines to send
* and receive control messages.
*/
-#ifdef CONFIG_USB_LONG_TIMEOUT
-#define GET_TIMEOUT 4
-#else
-#define GET_TIMEOUT 3
-#endif
-#define SET_TIMEOUT 3
+
+/* USB spec identifies 5 second timeouts.
+ * Some devices (MGE Ellipse UPSes, etc) need it, too.
+ */
+#define GET_TIMEOUT 5
+#define SET_TIMEOUT 5
int usb_set_address(struct usb_device *dev)
{
return usb_control_msg(dev, usb_snddefctrl(dev), USB_REQ_SET_ADDRESS,
- 0, dev->devnum, 0, NULL, 0, HZ * GET_TIMEOUT);
+ 0, dev->devnum, 0, NULL, 0, HZ * SET_TIMEOUT);
}
int usb_get_descriptor(struct usb_device *dev, unsigned char type, unsigned char index, void *buf, int size)
FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen (who was at: slshen@lbl.gov)