}
static bool uvc_alloc_urb_buffer(struct uvc_streaming *stream,
- struct uvc_urb *uvc_urb, gfp_t gfp_flags)
+ struct uvc_urb *uvc_urb, unsigned int size,
+ gfp_t gfp_flags)
{
struct usb_device *udev = stream->dev->udev;
- uvc_urb->buffer = usb_alloc_noncoherent(udev, stream->urb_size,
- gfp_flags, &uvc_urb->dma,
+ uvc_urb->buffer = usb_alloc_noncoherent(udev, size, gfp_flags,
+ &uvc_urb->dma,
uvc_stream_dir(stream),
&uvc_urb->sgt);
return !!uvc_urb->buffer;
/* Retry allocations until one succeed. */
for (; npackets > 0; npackets /= 2) {
- stream->urb_size = psize * npackets;
+ unsigned int urb_size = psize * npackets;
for (i = 0; i < UVC_URBS; ++i) {
struct uvc_urb *uvc_urb = &stream->uvc_urb[i];
- if (!uvc_alloc_urb_buffer(stream, uvc_urb, gfp_flags)) {
+ if (!uvc_alloc_urb_buffer(stream, uvc_urb, urb_size,
+ gfp_flags)) {
uvc_free_urb_buffers(stream);
break;
}
uvc_dbg(stream->dev, VIDEO,
"Allocated %u URB buffers of %ux%u bytes each\n",
UVC_URBS, npackets, psize);
+ stream->urb_size = urb_size;
return npackets;
}
}
uvc_dbg(stream->dev, VIDEO,
"Failed to allocate URB buffers (%u bytes per packet)\n",
psize);
- stream->urb_size = 0;
return 0;
}