On Wed, 2003-01-15 at 08:58, Greg KH wrote: > On Wed, Jan 15, 2003 at 01:54:22AM +0000, oliverthered wrote: > > > > > > 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.) > > Ok, a few comments. It looks like you are trying to do multiple things > with this patch. Mind sending a few different ones, one per change? > > Also, the formatting of the for loops and the if statements at the end > of the patch is all wrong, please clean that up. > > thanks, > > greg k-h
Ok, i've split the patches, and fixed & used usb_epnum_to_ep instead of putting all the code in proc_submiturb. Three patches attached (i'll find a mail client that doesn't wrap lines) usb.c.epnumto.patch: This patch insures that usb_epnum_to_ep uses act_setting when looking for an endpoint. devio.c.findintfep.patch This patch insures that findintfep uses act_setting when looking for an endpoint. devio.c.submiturb.patch This patches proc_submiturb so that the interval for ISO urb's is taken from the requested urb endpoint. Changes to usb_epnum_to_ep and usb_epnum_to_ep will break drivers that require an alt_setting other than 0 but fail to call setinterface. changes to usb_epnum_to_ep will unpredictable results if the patch to usb_epnum_to_ep isn't applied and there are ISO alt_settings with different intervals.
--- 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-15 13:25:13.000000000 +0000 @@ -405,7 +405,7 @@ static int findintfep(struct usb_device *dev, unsigned int ep) { - unsigned int i, j, e; + unsigned int i, e; struct usb_interface *iface; struct usb_host_interface *alts; struct usb_endpoint_descriptor *endpt; @@ -414,14 +414,13 @@ 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]; - for (e = 0; e < alts->desc.bNumEndpoints; e++) { - endpt = &alts->endpoint[e].desc; - if (endpt->bEndpointAddress == ep) - return i; - } + alts = &iface->altsetting[iface->act_altsetting]; + for (e = 0; e < alts->desc.bNumEndpoints; e++) { + endpt = &alts->endpoint[e].desc; + if (endpt->bEndpointAddress == ep) + return i; } + } return -ENOENT; }
--- 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-15 13:24:21.000000000 +0000 @@ -854,6 +854,10 @@ return -EINVAL; } uurb.buffer_length = totlen; + if(!(ep_desc = usb_epnum_to_ep_desc(ps->dev, uurb.endpoint))) + return -ENOENT; + interval = ep_desc->bInterval; + break; case USBDEVFS_URB_TYPE_INTERRUPT:
--- linux-2.5.54/drivers/usb/core/usb.c 2003-01-02 03:22:04.000000000 +0000 +++ /usr/src/linux/drivers/usb/core/usb.c 2003-01-15 02:21:46.000000000 +0000 @@ -256,16 +256,17 @@ int i, j, k; for (i = 0; i < dev->actconfig->desc.bNumInterfaces; i++) - for (j = 0; j < dev->actconfig->interface[i].num_altsetting; j++) - for (k = 0; k < dev->actconfig->interface[i] - .altsetting[j].desc.bNumEndpoints; k++) - if (epnum == dev->actconfig->interface[i] - .altsetting[j].endpoint[k] - .desc.bEndpointAddress) - return &dev->actconfig->interface[i] - .altsetting[j].endpoint[k] - .desc; - + { + j=dev->actconfig->interface[i].act_altsetting; + for (k = 0; k < dev->actconfig->interface[i] + .altsetting[j].desc.bNumEndpoints; k++) + if (epnum == dev->actconfig->interface[i] + .altsetting[j].endpoint[k] + .desc.bEndpointAddress) + return &dev->actconfig->interface[i] + .altsetting[j].endpoint[k] + .desc; + } return NULL; }