Re: [RFC 1/2] gspca: provide a mechanism to select a specific transfer endpoint

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Thu, 19 Jun 2014 16:27:59 +0200
Hans de Goede <hdegoede@xxxxxxxxxx> wrote:

> Hi Antonio,
> 
> Thanks for working on this.
> 
> On 06/04/2014 10:24 PM, Antonio Ospite wrote:
> > Add a xfer_ep_index field to struct gspca_dev, and change alt_xfer() so
> > that it accepts a parameter which represents a specific endpoint to look
> > for.
> > 
> > If a subdriver wants to specify a value for gspca_dev->xfer_ep_index it
> > can do that in its sd_config() callback.
> > 
> > Signed-off-by: Antonio Ospite <ao2@xxxxxx>
> > ---
> > 
> > I am not sure if it is OK to specify an endpoint _index_ or if it would be
> > better to specify the endpoint address directly (in Kinect 0x81 is for video
> > data and 0x82 is for depth data).
> >
> > Hans, any comment on that?
> 
> I think it would be better to use the endpoint address directly for this,
> relying on the order in which the endpoints are listed in the descriptor
> feels wrong to me.
>

I see.

If I declare the new field as __u8 (same type of a bEndpointAddress), I
could mark an invalid ep address with ~(USB_ENDPOINT_DIR_MASK | 
USB_ENDPOINT_NUMBER_MASK) in gspca_dev_probe2(), instead of using an
int set to -1; how does that sound?

> Other then that this patch looks good.
> 
> Regards,
> 
> Hans
> 
> 
> > 
> > Thanks,
> >    Antonio
> > 
> >  drivers/media/usb/gspca/gspca.c | 20 ++++++++++++++------
> >  drivers/media/usb/gspca/gspca.h |  1 +
> >  2 files changed, 15 insertions(+), 6 deletions(-)
> > 
> > diff --git a/drivers/media/usb/gspca/gspca.c b/drivers/media/usb/gspca/gspca.c
> > index f3a7ace..7e5226c 100644
> > --- a/drivers/media/usb/gspca/gspca.c
> > +++ b/drivers/media/usb/gspca/gspca.c
> > @@ -603,10 +603,13 @@ static void gspca_stream_off(struct gspca_dev *gspca_dev)
> >  }
> >  
> >  /*
> > - * look for an input transfer endpoint in an alternate setting
> > + * look for an input transfer endpoint in an alternate setting.
> > + *
> > + * If xfer_ep_index is negative, return the first valid one found, otherwise
> > + * look for exactly the one in position xfer_ep.
> >   */
> >  static struct usb_host_endpoint *alt_xfer(struct usb_host_interface *alt,
> > -					  int xfer)
> > +					  int xfer, int xfer_ep_index)
> >  {
> >  	struct usb_host_endpoint *ep;
> >  	int i, attr;
> > @@ -616,8 +619,10 @@ static struct usb_host_endpoint *alt_xfer(struct usb_host_interface *alt,
> >  		attr = ep->desc.bmAttributes & USB_ENDPOINT_XFERTYPE_MASK;
> >  		if (attr == xfer
> >  		    && ep->desc.wMaxPacketSize != 0
> > -		    && usb_endpoint_dir_in(&ep->desc))
> > +		    && usb_endpoint_dir_in(&ep->desc)
> > +		    && (xfer_ep_index < 0 || i == xfer_ep_index)) {
> >  			return ep;
> > +		}
> >  	}
> >  	return NULL;
> >  }
> > @@ -689,7 +694,7 @@ static int build_isoc_ep_tb(struct gspca_dev *gspca_dev,
> >  		found = 0;
> >  		for (j = 0; j < nbalt; j++) {
> >  			ep = alt_xfer(&intf->altsetting[j],
> > -				      USB_ENDPOINT_XFER_ISOC);
> > +				      USB_ENDPOINT_XFER_ISOC, gspca_dev->xfer_ep_index);
> >  			if (ep == NULL)
> >  				continue;
> >  			if (ep->desc.bInterval == 0) {
> > @@ -862,7 +867,8 @@ static int gspca_init_transfer(struct gspca_dev *gspca_dev)
> >  	/* if bulk or the subdriver forced an altsetting, get the endpoint */
> >  	if (gspca_dev->alt != 0) {
> >  		gspca_dev->alt--;	/* (previous version compatibility) */
> > -		ep = alt_xfer(&intf->altsetting[gspca_dev->alt], xfer);
> > +		ep = alt_xfer(&intf->altsetting[gspca_dev->alt], xfer,
> > +			      gspca_dev->xfer_ep_index);
> >  		if (ep == NULL) {
> >  			pr_err("bad altsetting %d\n", gspca_dev->alt);
> >  			return -EIO;
> > @@ -904,7 +910,8 @@ static int gspca_init_transfer(struct gspca_dev *gspca_dev)
> >  		if (!gspca_dev->cam.no_urb_create) {
> >  			PDEBUG(D_STREAM, "init transfer alt %d", alt);
> >  			ret = create_urbs(gspca_dev,
> > -				alt_xfer(&intf->altsetting[alt], xfer));
> > +				alt_xfer(&intf->altsetting[alt], xfer,
> > +					 gspca_dev->xfer_ep_index));
> >  			if (ret < 0) {
> >  				destroy_urbs(gspca_dev);
> >  				goto out;
> > @@ -2030,6 +2037,7 @@ int gspca_dev_probe2(struct usb_interface *intf,
> >  	}
> >  	gspca_dev->dev = dev;
> >  	gspca_dev->iface = intf->cur_altsetting->desc.bInterfaceNumber;
> > +	gspca_dev->xfer_ep_index = -1;
> >  
> >  	/* check if any audio device */
> >  	if (dev->actconfig->desc.bNumInterfaces != 1) {
> > diff --git a/drivers/media/usb/gspca/gspca.h b/drivers/media/usb/gspca/gspca.h
> > index 300642d..92317af 100644
> > --- a/drivers/media/usb/gspca/gspca.h
> > +++ b/drivers/media/usb/gspca/gspca.h
> > @@ -205,6 +205,7 @@ struct gspca_dev {
> >  	char memory;			/* memory type (V4L2_MEMORY_xxx) */
> >  	__u8 iface;			/* USB interface number */
> >  	__u8 alt;			/* USB alternate setting */
> > +	int xfer_ep_index;		/* index of the USB transfer endpoint */
> >  	u8 audio;			/* presence of audio device */
> >  
> >  	/* (*) These variables are proteced by both usb_lock and queue_lock,
> > 


-- 
Antonio Ospite
http://ao2.it

A: Because it messes up the order in which people normally read text.
   See http://en.wikipedia.org/wiki/Posting_style
Q: Why is top-posting such a bad thing?
--
To unsubscribe from this list: send the line "unsubscribe linux-media" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html




[Index of Archives]     [Linux Input]     [Video for Linux]     [Gstreamer Embedded]     [Mplayer Users]     [Linux USB Devel]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [Yosemite Backpacking]
  Powered by Linux