Lines Matching +full:isoc +full:- +full:in
1 // SPDX-License-Identifier: GPL-2.0-or-later
6 * <elezegarcia--a.t--gmail.com>
10 * <rmthomas--a.t--sciolus.org>
30 case -ENOENT: in print_err_status()
33 case -ECONNRESET: in print_err_status()
36 case -ENOSR: in print_err_status()
39 case -EPIPE: in print_err_status()
42 case -EOVERFLOW: in print_err_status()
45 case -EPROTO: in print_err_status()
46 errmsg = "Bit-stuff error (bad cable?)"; in print_err_status()
48 case -EILSEQ: in print_err_status()
51 case -ETIME: in print_err_status()
71 WARN_ON(dev->isoc_ctl.buf); in stk1160_next_buffer()
73 spin_lock_irqsave(&dev->buf_lock, flags); in stk1160_next_buffer()
74 if (!list_empty(&dev->avail_bufs)) { in stk1160_next_buffer()
75 buf = list_first_entry(&dev->avail_bufs, in stk1160_next_buffer()
77 list_del(&buf->list); in stk1160_next_buffer()
79 spin_unlock_irqrestore(&dev->buf_lock, flags); in stk1160_next_buffer()
87 struct stk1160_buffer *buf = dev->isoc_ctl.buf; in stk1160_buffer_done()
89 buf->vb.sequence = dev->sequence++; in stk1160_buffer_done()
90 buf->vb.field = V4L2_FIELD_INTERLACED; in stk1160_buffer_done()
91 buf->vb.vb2_buf.timestamp = ktime_get_ns(); in stk1160_buffer_done()
93 vb2_set_plane_payload(&buf->vb.vb2_buf, 0, buf->bytesused); in stk1160_buffer_done()
94 vb2_buffer_done(&buf->vb.vb2_buf, VB2_BUF_STATE_DONE); in stk1160_buffer_done()
96 dev->isoc_ctl.buf = NULL; in stk1160_buffer_done()
103 int bytesperline = dev->width * 2; in stk1160_copy_video()
104 struct stk1160_buffer *buf = dev->isoc_ctl.buf; in stk1160_copy_video()
105 u8 *dst = buf->mem; in stk1160_copy_video()
118 len -= 4; in stk1160_copy_video()
123 linesdone = buf->pos / bytesperline; in stk1160_copy_video()
124 lineoff = buf->pos % bytesperline; /* offset in current line */ in stk1160_copy_video()
126 if (!buf->odd) in stk1160_copy_video()
133 lencopy = min(remain, bytesperline - lineoff); in stk1160_copy_video()
136 * Check if we have enough space left in the buffer. in stk1160_copy_video()
137 * In that case, we force loop exit after copy. in stk1160_copy_video()
139 offset = dst - (u8 *)buf->mem; in stk1160_copy_video()
140 if (offset > buf->length) { in stk1160_copy_video()
141 dev_warn_ratelimited(dev->dev, "out of bounds offset\n"); in stk1160_copy_video()
144 if (lencopy > buf->length - offset) { in stk1160_copy_video()
145 lencopy = buf->length - offset; in stk1160_copy_video()
160 (unsigned long)buf->mem + buf->length) { in stk1160_copy_video()
167 buf->bytesused += lencopy; in stk1160_copy_video()
168 buf->pos += lencopy; in stk1160_copy_video()
169 remain -= lencopy; in stk1160_copy_video()
181 * Check if we have enough space left in the buffer. in stk1160_copy_video()
182 * In that case, we force loop exit after copy. in stk1160_copy_video()
184 offset = dst - (u8 *)buf->mem; in stk1160_copy_video()
185 if (offset > buf->length) { in stk1160_copy_video()
186 dev_warn_ratelimited(dev->dev, "offset out of bounds\n"); in stk1160_copy_video()
189 if (lencopy > buf->length - offset) { in stk1160_copy_video()
190 lencopy = buf->length - offset; in stk1160_copy_video()
204 (unsigned long)buf->mem + buf->length) { in stk1160_copy_video()
210 remain -= lencopy; in stk1160_copy_video()
212 buf->bytesused += lencopy; in stk1160_copy_video()
213 buf->pos += lencopy; in stk1160_copy_video()
218 * Controls the isoc copy of each urb packet
230 if (urb->status < 0) { in stk1160_process_isoc()
232 print_err_status(dev, -1, urb->status); in stk1160_process_isoc()
236 for (i = 0; i < urb->number_of_packets; i++) { in stk1160_process_isoc()
237 status = urb->iso_frame_desc[i].status; in stk1160_process_isoc()
244 p = urb->transfer_buffer + urb->iso_frame_desc[i].offset; in stk1160_process_isoc()
245 len = urb->iso_frame_desc[i].actual_length; in stk1160_process_isoc()
252 * An 8-byte packet sequence means end of field. in stk1160_process_isoc()
257 * but not always 8-byte long so we don't check packet length. in stk1160_process_isoc()
265 if (dev->isoc_ctl.buf != NULL) in stk1160_process_isoc()
268 dev->isoc_ctl.buf = stk1160_next_buffer(dev); in stk1160_process_isoc()
269 if (dev->isoc_ctl.buf == NULL) in stk1160_process_isoc()
277 if (dev->isoc_ctl.buf == NULL) in stk1160_process_isoc()
285 dev->isoc_ctl.buf->odd = *p & 0x40; in stk1160_process_isoc()
286 dev->isoc_ctl.buf->pos = 0; in stk1160_process_isoc()
301 struct stk1160_urb *stk_urb = urb->context; in stk1160_isoc_irq()
302 struct stk1160 *dev = stk_urb->dev; in stk1160_isoc_irq()
305 switch (urb->status) { in stk1160_isoc_irq()
308 case -ECONNRESET: /* kill */ in stk1160_isoc_irq()
309 case -ENOENT: in stk1160_isoc_irq()
310 case -ESHUTDOWN: in stk1160_isoc_irq()
314 stk1160_err("urb error! status %d\n", urb->status); in stk1160_isoc_irq()
318 invalidate_kernel_vmap_range(stk_urb->transfer_buffer, in stk1160_isoc_irq()
319 urb->transfer_buffer_length); in stk1160_isoc_irq()
320 dma_sync_sgtable_for_cpu(dma_dev, stk_urb->sgt, DMA_FROM_DEVICE); in stk1160_isoc_irq()
325 for (i = 0; i < urb->number_of_packets; i++) { in stk1160_isoc_irq()
326 urb->iso_frame_desc[i].status = 0; in stk1160_isoc_irq()
327 urb->iso_frame_desc[i].actual_length = 0; in stk1160_isoc_irq()
330 dma_sync_sgtable_for_device(dma_dev, stk_urb->sgt, DMA_FROM_DEVICE); in stk1160_isoc_irq()
333 stk1160_err("urb re-submit failed (%d)\n", rc); in stk1160_isoc_irq()
338 * This function can't be called in atomic context
342 int i, num_bufs = dev->isoc_ctl.num_bufs; in stk1160_cancel_isoc()
356 * To kill urbs we can't be in atomic context. in stk1160_cancel_isoc()
360 usb_kill_urb(dev->isoc_ctl.urb_ctl[i].urb); in stk1160_cancel_isoc()
370 dma_vunmap_noncontiguous(dma_dev, stk_urb->transfer_buffer); in stk_free_urb()
371 dma_free_noncontiguous(dma_dev, stk_urb->urb->transfer_buffer_length, in stk_free_urb()
372 stk_urb->sgt, DMA_FROM_DEVICE); in stk_free_urb()
373 usb_free_urb(stk_urb->urb); in stk_free_urb()
375 stk_urb->transfer_buffer = NULL; in stk_free_urb()
376 stk_urb->sgt = NULL; in stk_free_urb()
377 stk_urb->urb = NULL; in stk_free_urb()
378 stk_urb->dev = NULL; in stk_free_urb()
379 stk_urb->dma = 0; in stk_free_urb()
388 int i, num_bufs = dev->isoc_ctl.num_bufs; in stk1160_free_isoc()
393 stk_free_urb(dev, &dev->isoc_ctl.urb_ctl[i]); in stk1160_free_isoc()
395 dev->isoc_ctl.num_bufs = 0; in stk1160_free_isoc()
402 * This function can't be called in atomic context
415 stk_urb->urb = usb_alloc_urb(max_packets, GFP_KERNEL); in stk1160_fill_urb()
416 if (!stk_urb->urb) in stk1160_fill_urb()
417 return -ENOMEM; in stk1160_fill_urb()
418 stk_urb->sgt = dma_alloc_noncontiguous(dma_dev, sb_size, in stk1160_fill_urb()
425 if (!stk_urb->sgt) in stk1160_fill_urb()
428 stk_urb->transfer_buffer = dma_vmap_noncontiguous(dma_dev, sb_size, in stk1160_fill_urb()
429 stk_urb->sgt); in stk1160_fill_urb()
430 if (!stk_urb->transfer_buffer) in stk1160_fill_urb()
433 stk_urb->dma = stk_urb->sgt->sgl->dma_address; in stk1160_fill_urb()
434 stk_urb->dev = dev; in stk1160_fill_urb()
437 dma_free_noncontiguous(dma_dev, sb_size, stk_urb->sgt, DMA_FROM_DEVICE); in stk1160_fill_urb()
438 stk_urb->sgt = NULL; in stk1160_fill_urb()
440 usb_free_urb(stk_urb->urb); in stk1160_fill_urb()
441 stk_urb->urb = NULL; in stk1160_fill_urb()
455 * It may be necessary to release isoc here, in stk1160_alloc_isoc()
456 * since isoc are only released on disconnection. in stk1160_alloc_isoc()
459 if (dev->isoc_ctl.num_bufs) in stk1160_alloc_isoc()
466 sb_size = max_packets * dev->max_pkt_size; in stk1160_alloc_isoc()
468 dev->isoc_ctl.buf = NULL; in stk1160_alloc_isoc()
469 dev->isoc_ctl.max_pkt_size = dev->max_pkt_size; in stk1160_alloc_isoc()
474 ret = stk1160_fill_urb(dev, &dev->isoc_ctl.urb_ctl[i], in stk1160_alloc_isoc()
479 urb = dev->isoc_ctl.urb_ctl[i].urb; in stk1160_alloc_isoc()
487 memset(dev->isoc_ctl.urb_ctl[i].transfer_buffer, 0, sb_size); in stk1160_alloc_isoc()
492 urb->dev = dev->udev; in stk1160_alloc_isoc()
493 urb->pipe = usb_rcvisocpipe(dev->udev, STK1160_EP_VIDEO); in stk1160_alloc_isoc()
494 urb->transfer_buffer = dev->isoc_ctl.urb_ctl[i].transfer_buffer; in stk1160_alloc_isoc()
495 urb->transfer_buffer_length = sb_size; in stk1160_alloc_isoc()
496 urb->complete = stk1160_isoc_irq; in stk1160_alloc_isoc()
497 urb->context = &dev->isoc_ctl.urb_ctl[i]; in stk1160_alloc_isoc()
498 urb->interval = 1; in stk1160_alloc_isoc()
499 urb->start_frame = 0; in stk1160_alloc_isoc()
500 urb->number_of_packets = max_packets; in stk1160_alloc_isoc()
501 urb->transfer_flags = URB_ISO_ASAP | URB_NO_TRANSFER_DMA_MAP; in stk1160_alloc_isoc()
502 urb->transfer_dma = dev->isoc_ctl.urb_ctl[i].dma; in stk1160_alloc_isoc()
506 urb->iso_frame_desc[j].offset = k; in stk1160_alloc_isoc()
507 urb->iso_frame_desc[j].length = in stk1160_alloc_isoc()
508 dev->isoc_ctl.max_pkt_size; in stk1160_alloc_isoc()
509 k += dev->isoc_ctl.max_pkt_size; in stk1160_alloc_isoc()
516 dev->isoc_ctl.num_bufs = num_bufs; in stk1160_alloc_isoc()
529 dev->isoc_ctl.num_bufs = i; in stk1160_alloc_isoc()
535 dev->isoc_ctl.num_bufs = i; in stk1160_alloc_isoc()
537 return -ENOMEM; in stk1160_alloc_isoc()