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))

Reply via email to