13 #include <linux/kernel.h>
14 #include <linux/device.h>
15 #include <linux/errno.h>
16 #include <linux/usb/ch9.h>
29 uvc_video_encode_header(
struct uvc_video *video,
struct uvc_buffer *
buf,
35 if (buf->
buf.bytesused - video->queue.buf_used <= len - 2)
42 uvc_video_encode_data(
struct uvc_video *video,
struct uvc_buffer *buf,
50 mem = queue->mem + buf->
buf.m.offset + queue->
buf_used;
51 nbytes =
min((
unsigned int)len, buf->
buf.bytesused - queue->
buf_used);
60 uvc_video_encode_bulk(
struct usb_request *
req,
struct uvc_video *video,
64 int len = video->req_size;
68 if (video->payload_size == 0) {
69 ret = uvc_video_encode_header(video, buf, mem, len);
70 video->payload_size +=
ret;
76 len =
min((
int)(video->max_payload_size - video->payload_size), len);
77 ret = uvc_video_encode_data(video, buf, mem, len);
79 video->payload_size +=
ret;
82 req->
length = video->req_size - len;
83 req->
zero = video->payload_size == video->max_payload_size;
85 if (buf->
buf.bytesused == video->queue.buf_used) {
86 video->queue.buf_used = 0;
91 video->payload_size = 0;
94 if (video->payload_size == video->max_payload_size ||
95 buf->
buf.bytesused == video->queue.buf_used)
96 video->payload_size = 0;
100 uvc_video_encode_isoc(
struct usb_request *req,
struct uvc_video *video,
103 void *mem = req->
buf;
104 int len = video->req_size;
108 ret = uvc_video_encode_header(video, buf, mem, len);
113 ret = uvc_video_encode_data(video, buf, mem, len);
116 req->
length = video->req_size - len;
118 if (buf->
buf.bytesused == video->queue.buf_used) {
119 video->queue.buf_used = 0;
163 struct uvc_video *video = req->
context;
183 buf = uvc_queue_head(&video->queue);
185 spin_unlock_irqrestore(&video->queue.irqlock, flags);
189 video->encode(req, video, buf);
191 if ((ret = usb_ep_queue(ep, req,
GFP_ATOMIC)) < 0) {
194 spin_unlock_irqrestore(&video->queue.irqlock, flags);
197 spin_unlock_irqrestore(&video->queue.irqlock, flags);
204 spin_unlock_irqrestore(&video->req_lock, flags);
208 uvc_video_free_requests(
struct uvc_video *video)
212 for (i = 0; i < UVC_NUM_REQUESTS; ++
i) {
214 usb_ep_free_request(video->ep, video->req[i]);
215 video->req[
i] =
NULL;
218 if (video->req_buffer[i]) {
219 kfree(video->req_buffer[i]);
220 video->req_buffer[
i] =
NULL;
224 INIT_LIST_HEAD(&video->req_free);
230 uvc_video_alloc_requests(
struct uvc_video *video)
237 for (i = 0; i < UVC_NUM_REQUESTS; ++
i) {
239 if (video->req_buffer[i] ==
NULL)
242 video->req[
i] = usb_ep_alloc_request(video->ep,
GFP_KERNEL);
243 if (video->req[i] ==
NULL)
246 video->req[
i]->buf = video->req_buffer[
i];
247 video->req[
i]->length = 0;
249 video->req[
i]->complete = uvc_video_complete;
250 video->req[
i]->context = video;
255 video->req_size = video->ep->maxpacket;
259 uvc_video_free_requests(video);
274 uvc_video_pump(
struct uvc_video *video)
290 if (list_empty(&video->req_free)) {
291 spin_unlock_irqrestore(&video->req_lock, flags);
297 spin_unlock_irqrestore(&video->req_lock, flags);
303 buf = uvc_queue_head(&video->queue);
305 spin_unlock_irqrestore(&video->queue.irqlock, flags);
309 video->encode(req, video, buf);
312 if ((ret = usb_ep_queue(video->ep, req,
GFP_KERNEL)) < 0) {
314 usb_ep_set_halt(video->ep);
315 spin_unlock_irqrestore(&video->queue.irqlock, flags);
318 spin_unlock_irqrestore(&video->queue.irqlock, flags);
323 spin_unlock_irqrestore(&video->req_lock, flags);
336 if (video->ep ==
NULL) {
343 for (i = 0; i < UVC_NUM_REQUESTS; ++
i)
344 usb_ep_dequeue(video->ep, video->req[i]);
346 uvc_video_free_requests(video);
354 if ((ret = uvc_video_alloc_requests(video)) < 0)
357 if (video->max_payload_size) {
358 video->encode = uvc_video_encode_bulk;
359 video->payload_size = 0;
361 video->encode = uvc_video_encode_isoc;
363 return uvc_video_pump(video);
372 INIT_LIST_HEAD(&video->req_free);
379 video->imagesize = 320 * 240 * 2;