Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 114035
b: refs/heads/master
c: 95d9142
h: refs/heads/master
i:
  114033: 1873501
  114031: f483a5b
v: v3
  • Loading branch information
Jean-Francois Moine authored and Mauro Carvalho Chehab committed Oct 12, 2008
1 parent ddb2e0c commit 69d25d2
Show file tree
Hide file tree
Showing 3 changed files with 29 additions and 17 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 6b060ffea0722cfe4f5156a73a6424130d3d804a
refs/heads/master: 95d9142c8b250b2ce0e0a283fdf54d899dcc4f3e
42 changes: 27 additions & 15 deletions trunk/drivers/media/video/gspca/gspca.c
Original file line number Diff line number Diff line change
Expand Up @@ -461,25 +461,34 @@ static struct usb_host_endpoint *get_ep(struct gspca_dev *gspca_dev)
intf = usb_ifnum_to_if(gspca_dev->dev, gspca_dev->iface);
ep = NULL;
i = gspca_dev->alt; /* previous alt setting */

/* try isoc */
while (--i > 0) { /* alt 0 is unusable */
ep = alt_xfer(&intf->altsetting[i],
gspca_dev->cam.epaddr,
gspca_dev->bulk
? USB_ENDPOINT_XFER_BULK
: USB_ENDPOINT_XFER_ISOC);
USB_ENDPOINT_XFER_ISOC);
if (ep)
break;
}

/* if no isoc, try bulk */
if (ep == NULL) {
err("no transfer endpoint found");
return NULL;
ep = alt_xfer(&intf->altsetting[0],
gspca_dev->cam.epaddr,
USB_ENDPOINT_XFER_BULK);
if (ep == NULL) {
err("no transfer endpoint found");
return NULL;
}
}
PDEBUG(D_STREAM, "use alt %d ep 0x%02x",
i, ep->desc.bEndpointAddress);
ret = usb_set_interface(gspca_dev->dev, gspca_dev->iface, i);
if (ret < 0) {
err("set interface err %d", ret);
return NULL;
if (i > 0) {
ret = usb_set_interface(gspca_dev->dev, gspca_dev->iface, i);
if (ret < 0) {
err("set interface err %d", ret);
return NULL;
}
}
gspca_dev->alt = i; /* memorize the current alt setting */
return ep;
Expand All @@ -497,9 +506,10 @@ static int create_urbs(struct gspca_dev *gspca_dev,
/* calculate the packet size and the number of packets */
psize = le16_to_cpu(ep->desc.wMaxPacketSize);

/* See paragraph 5.9 / table 5-11 of the usb 2.0 spec. */
psize = (psize & 0x07ff) * (1 + ((psize >> 11) & 3));
if (!gspca_dev->bulk) {
if (gspca_dev->alt != 0) { /* isoc */

/* See paragraph 5.9 / table 5-11 of the usb 2.0 spec. */
psize = (psize & 0x07ff) * (1 + ((psize >> 11) & 3));
npkt = ISO_MAX_SIZE / psize;
if (npkt > ISO_MAX_PKT)
npkt = ISO_MAX_PKT;
Expand All @@ -508,9 +518,11 @@ static int create_urbs(struct gspca_dev *gspca_dev,
"isoc %d pkts size %d = bsize:%d",
npkt, psize, bsize);
nurbs = DEF_NURBS;
} else {
} else { /* bulk */
npkt = 0;
bsize = psize;
bsize = gspca_dev->cam. bulk_size;
if (bsize == 0)
bsize = psize;
PDEBUG(D_STREAM, "bulk bsize:%d", bsize);
nurbs = 1;
}
Expand Down Expand Up @@ -595,7 +607,7 @@ static int gspca_init_transfer(struct gspca_dev *gspca_dev)
atomic_set(&gspca_dev->nevent, 0);

/* bulk transfers are started by the subdriver */
if (gspca_dev->bulk)
if (gspca_dev->alt == 0)
break;

/* submit the URBs */
Expand Down
2 changes: 1 addition & 1 deletion trunk/drivers/media/video/gspca/gspca.h
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,7 @@ extern int gspca_debug;

/* device information - set at probe time */
struct cam {
int bulk_size; /* buffer size when image transfer by bulk */
struct v4l2_pix_format *cam_mode; /* size nmodes */
char nmodes;
__u8 epaddr;
Expand Down Expand Up @@ -144,7 +145,6 @@ struct gspca_dev {

__u8 iface; /* USB interface number */
__u8 alt; /* USB alternate setting */
__u8 bulk; /* image transfer by isoc (0) or bulk (1) */
__u8 curr_mode; /* current camera mode */
__u32 pixfmt; /* current mode parameters */
__u16 width;
Expand Down

0 comments on commit 69d25d2

Please sign in to comment.