On Wed, 2003-01-15 at 01:33, Greg KH wrote:
> On Tue, Jan 14, 2003 at 11:58:04PM +0000, oliverthered wrote:
> >
> > Any comments?
>
> Your patch is line wrapped, mind fixing your mailer and trying again?
see attached.
(If anyone knows how to turn line wrap off in evolution let me know.)
--
oliverthered <[EMAIL PROTECTED]>
--- linux-2.5.54/drivers/usb/core/devio.c 2003-01-02 03:22:02.000000000 +0000
+++ /usr/src/linux/drivers/usb/core/devio.c 2003-01-14 22:50:15.000000000 +0000
@@ -30,6 +30,11 @@
* Revision history
* 22.12.1999 0.1 Initial release (split from proc_usb.c)
* 04.01.2000 0.2 Turned into its own filesystem
+ * 14.01.2003 0.3 use the active alt_setting for endpoint lookup
+ * only perform lookup against interfaces that
+ * have been claimed
+ * use the endpoint interval for ISO transfers
+ *
*/
/*****************************************************************************/
@@ -403,9 +408,9 @@
return claimintf(ps, intf);
}
-static int findintfep(struct usb_device *dev, unsigned int ep)
+static int findintfep(struct usb_device *dev, unsigned int ep,unsigned long ifclaimed)
{
- unsigned int i, j, e;
+ unsigned int i, e;
struct usb_interface *iface;
struct usb_host_interface *alts;
struct usb_endpoint_descriptor *endpt;
@@ -413,15 +418,22 @@
if (ep & ~(USB_DIR_IN|0xf))
return -EINVAL;
for (i = 0; i < dev->actconfig->desc.bNumInterfaces; i++) {
+
iface = &dev->actconfig->interface[i];
- for (j = 0; j < iface->num_altsetting; j++) {
- alts = &iface->altsetting[j];
+
+ alts = &iface->altsetting[iface->act_altsetting];
+ /*
+ *Makes sure we've claimed the interface,
+ * the interface should really be explicit not implisit
+ * as more than one interface could have the same endpointaddress?
+ */
+ if(!test_bit(alts->desc.bInterfaceNumber, &ifclaimed))
+ continue;
for (e = 0; e < alts->desc.bNumEndpoints; e++) {
endpt = &alts->endpoint[e].desc;
if (endpt->bEndpointAddress == ep)
return i;
- }
- }
+ }
}
return -ENOENT;
}
@@ -454,7 +466,7 @@
switch (requesttype & USB_RECIP_MASK) {
case USB_RECIP_ENDPOINT:
- if ((ret = findintfep(ps->dev, index & 0xff)) < 0)
+ if ((ret = findintfep(ps->dev, index & 0xff,ps->ifclaimed)) < 0)
return ret;
if ((ret = checkintf(ps, ret)))
return ret;
@@ -594,7 +606,7 @@
if (copy_from_user(&bulk, (void *)arg, sizeof(bulk)))
return -EFAULT;
- if ((ret = findintfep(ps->dev, bulk.ep)) < 0)
+ if ((ret = findintfep(ps->dev, bulk.ep,ps->ifclaimed)) < 0)
return ret;
if ((ret = checkintf(ps, ret)))
return ret;
@@ -645,7 +657,7 @@
if (get_user(ep, (unsigned int *)arg))
return -EFAULT;
- if ((ret = findintfep(ps->dev, ep)) < 0)
+ if ((ret = findintfep(ps->dev, ep,ps->ifclaimed)) < 0)
return ret;
if ((ret = checkintf(ps, ret)))
return ret;
@@ -661,7 +673,7 @@
if (get_user(ep, (unsigned int *)arg))
return -EFAULT;
- if ((ret = findintfep(ps->dev, ep)) < 0)
+ if ((ret = findintfep(ps->dev, ep,ps->ifclaimed)) < 0)
return ret;
if ((ret = checkintf(ps, ret)))
return ret;
@@ -770,8 +782,9 @@
struct usb_endpoint_descriptor *ep_desc;
struct async *as;
struct usb_ctrlrequest *dr = NULL;
+ struct usb_interface* interface = NULL;
unsigned int u, totlen, isofrmlen;
- int ret, interval = 0, intf = -1;
+ int ret, interval = 0, intf = -1, epn;
if (copy_from_user(&uurb, arg, sizeof(uurb)))
return -EFAULT;
@@ -783,10 +796,12 @@
if (uurb.signr != 0 && (uurb.signr < SIGRTMIN || uurb.signr > SIGRTMAX))
return -EINVAL;
if (!(uurb.type == USBDEVFS_URB_TYPE_CONTROL && (uurb.endpoint & ~USB_ENDPOINT_DIR_MASK) == 0)) {
- if ((intf = findintfep(ps->dev, uurb.endpoint)) < 0)
- return intf;
+ if ((intf = findintfep(ps->dev, uurb.endpoint,ps->ifclaimed)) < 0)
+ return intf;
if ((ret = checkintf(ps, intf)))
return ret;
+ /*grab a pointer to the interface*/
+ interface = usb_ifnum_to_if(ps->dev,intf);
}
switch(uurb.type) {
case USBDEVFS_URB_TYPE_CONTROL:
@@ -854,13 +869,56 @@
return -EINVAL;
}
uurb.buffer_length = totlen;
+ /*
+ * set the value of the interval based upon the interval
+ * of the selected interface/alt_setting that matches
+ * the requested endpoint
+ * TODO Tidy up the code,
+ * e.g. move the lookup into a function
+ */
+ for(epn=0
+ ;epn<interface->altsetting[interface->act_altsetting]
+ .desc.bNumEndpoints
+ ;epn++){
+
+ if(interface->altsetting[interface->act_altsetting]
+ .endpoint[epn].desc.bEndpointAddress==uurb.endpoint){
+
+ interval=
+ interface->altsetting[interface->act_altsetting]
+ .endpoint[epn].desc.bInterval;
+ break;
+ }
+ }
+ if(epn==interface->altsetting[interface->act_altsetting]
+ .desc.bNumEndpoints)
+ return -ENOENT;
+
+/* interval =1;*/
break;
case USBDEVFS_URB_TYPE_INTERRUPT:
uurb.number_of_packets = 0;
- if (!(ep_desc = usb_epnum_to_ep_desc(ps->dev, uurb.endpoint)))
+
+ for(epn=0
+ ;epn<interface->altsetting[interface->act_altsetting]
+ .desc.bNumEndpoints
+ ;epn++){
+
+ if(interface->altsetting[interface->act_altsetting]
+ .endpoint[epn].desc.bEndpointAddress==uurb.endpoint){
+
+ interval=
+ interface->altsetting[interface->act_altsetting]
+ .endpoint[epn].desc.bInterval;
+ break;
+ }
+ }
+ if(epn==interface->altsetting[interface->act_altsetting]
+ .desc.bNumEndpoints)
return -ENOENT;
- interval = ep_desc->bInterval;
+
+
if (uurb.buffer_length > 16384)
return -EINVAL;
if (!access_ok((uurb.endpoint & USB_DIR_IN) ? VERIFY_WRITE : VERIFY_READ, uurb.buffer, uurb.buffer_length))