Lines Matching +full:super +full:- +full:frames

1 // SPDX-License-Identifier: GPL-2.0-only
4 * flexcop-usb.c - covers the USB part
8 #include "flexcop-usb.h"
9 #include "flexcop-common.h"
37 MODULE_PARM_DESC(debug, "set debugging level (1=info,ts=2,ctrl=4,i2c=8,v8mem=16 (or-able))." DEBSTA…
48 * PCI ADDRESS FORMAT: 0x71C -> 0000 0111 0001 1100 (the six bits used)
62 * - forget about this VENDOR_BUFFER_SIZE, read and write register
64 * - from now on, we don't support anything older than firm 1.00
71 struct flexcop_usb *fc_usb = fc->bus_specific; in flexcop_usb_readwrite_dw()
78 mutex_lock(&fc_usb->data_mutex); in flexcop_usb_readwrite_dw()
80 memcpy(fc_usb->data, val, sizeof(*val)); in flexcop_usb_readwrite_dw()
82 ret = usb_control_msg(fc_usb->udev, in flexcop_usb_readwrite_dw()
88 fc_usb->data, in flexcop_usb_readwrite_dw()
96 ret = -EIO; in flexcop_usb_readwrite_dw()
100 memcpy(val, fc_usb->data, sizeof(*val)); in flexcop_usb_readwrite_dw()
101 mutex_unlock(&fc_usb->data_mutex); in flexcop_usb_readwrite_dw()
106 * DKT 010817 - add support for V8 memory read/write and flash update
117 if (buflen > sizeof(fc_usb->data)) { in flexcop_usb_v8_memory_req()
119 return -EIO; in flexcop_usb_v8_memory_req()
141 return -EINVAL; in flexcop_usb_v8_memory_req()
146 mutex_lock(&fc_usb->data_mutex); in flexcop_usb_v8_memory_req()
149 memcpy(fc_usb->data, pbBuffer, buflen); in flexcop_usb_v8_memory_req()
151 ret = usb_control_msg(fc_usb->udev, pipe, in flexcop_usb_v8_memory_req()
156 fc_usb->data, in flexcop_usb_v8_memory_req()
160 ret = -EIO; in flexcop_usb_v8_memory_req()
165 memcpy(pbBuffer, fc_usb->data, buflen); in flexcop_usb_v8_memory_req()
168 mutex_unlock(&fc_usb->data_mutex); in flexcop_usb_v8_memory_req()
175 ((V8_MEMORY_PAGE_SIZE - (paddr & V8_MEMORY_PAGE_MASK)) > buflen \
176 ? buflen : (V8_MEMORY_PAGE_SIZE - (paddr & V8_MEMORY_PAGE_MASK)))
197 return -EINVAL; in flexcop_usb_memory_req()
215 len -= pagechunk; in flexcop_usb_memory_req()
222 return flexcop_usb_memory_req(fc->bus_specific, B2C2_USB_READ_V8_MEM, in flexcop_usb_get_mac_addr()
224 fc->dvb_adapter.proposed_mac, 6); in flexcop_usb_get_mac_addr()
232 struct flexcop_usb *fc_usb = i2c->fc->bus_specific; in flexcop_usb_i2c_req()
237 if (buflen > sizeof(fc_usb->data)) { in flexcop_usb_i2c_req()
239 return -EIO; in flexcop_usb_i2c_req()
246 /* DKT 020208 - add this to support special case of DiSEqC */ in flexcop_usb_i2c_req()
260 return -EINVAL; in flexcop_usb_i2c_req()
262 wValue = (func << 8) | (i2c->port << 4); in flexcop_usb_i2c_req()
270 mutex_lock(&fc_usb->data_mutex); in flexcop_usb_i2c_req()
273 memcpy(fc_usb->data, buf, buflen); in flexcop_usb_i2c_req()
275 ret = usb_control_msg(fc_usb->udev, pipe, in flexcop_usb_i2c_req()
280 fc_usb->data, in flexcop_usb_i2c_req()
285 ret = -EIO; in flexcop_usb_i2c_req()
290 memcpy(buf, fc_usb->data, buflen); in flexcop_usb_i2c_req()
293 mutex_unlock(&fc_usb->data_mutex); in flexcop_usb_i2c_req()
333 fc_usb->tmp_buffer_length, buffer_length); in flexcop_usb_process_frame()
335 if (fc_usb->tmp_buffer_length > 0) { in flexcop_usb_process_frame()
336 memcpy(fc_usb->tmp_buffer+fc_usb->tmp_buffer_length, buffer, in flexcop_usb_process_frame()
338 fc_usb->tmp_buffer_length += buffer_length; in flexcop_usb_process_frame()
339 b = fc_usb->tmp_buffer; in flexcop_usb_process_frame()
340 l = fc_usb->tmp_buffer_length; in flexcop_usb_process_frame()
352 fc_usb->fc_dev, b+2, 1); in flexcop_usb_process_frame()
356 l -= 190; in flexcop_usb_process_frame()
370 memcpy(fc_usb->tmp_buffer, b, l); in flexcop_usb_process_frame()
371 fc_usb->tmp_buffer_length = l; in flexcop_usb_process_frame()
376 struct flexcop_usb *fc_usb = urb->context; in flexcop_usb_urb_complete()
379 if (urb->actual_length > 0) in flexcop_usb_urb_complete()
381 urb->transfer_buffer_length, urb->actual_length); in flexcop_usb_urb_complete()
383 for (i = 0; i < urb->number_of_packets; i++) { in flexcop_usb_urb_complete()
384 if (urb->iso_frame_desc[i].status < 0) { in flexcop_usb_urb_complete()
386 urb->iso_frame_desc[i].status); in flexcop_usb_urb_complete()
388 if (urb->iso_frame_desc[i].actual_length > 0) { in flexcop_usb_urb_complete()
390 urb->iso_frame_desc[i].actual_length); in flexcop_usb_urb_complete()
393 urb->transfer_buffer + in flexcop_usb_urb_complete()
394 urb->iso_frame_desc[i].offset, in flexcop_usb_urb_complete()
395 urb->iso_frame_desc[i].actual_length); in flexcop_usb_urb_complete()
397 urb->iso_frame_desc[i].status = 0; in flexcop_usb_urb_complete()
398 urb->iso_frame_desc[i].actual_length = 0; in flexcop_usb_urb_complete()
413 if (fc_usb->iso_urb[i] != NULL) { in flexcop_usb_transfer_exit()
415 usb_kill_urb(fc_usb->iso_urb[i]); in flexcop_usb_transfer_exit()
416 usb_free_urb(fc_usb->iso_urb[i]); in flexcop_usb_transfer_exit()
419 usb_free_coherent(fc_usb->udev, fc_usb->buffer_size, in flexcop_usb_transfer_exit()
420 fc_usb->iso_buffer, fc_usb->dma_addr); in flexcop_usb_transfer_exit()
426 struct usb_host_interface *alt = fc_usb->uintf->cur_altsetting; in flexcop_usb_transfer_init()
431 frame_size = usb_endpoint_maxp(&alt->endpoint[0].desc); in flexcop_usb_transfer_init()
434 deb_ts("creating %d iso-urbs with %d frames each of %d bytes size = %d.\n", in flexcop_usb_transfer_init()
438 fc_usb->iso_buffer = usb_alloc_coherent(fc_usb->udev, in flexcop_usb_transfer_init()
439 bufsize, GFP_KERNEL, &fc_usb->dma_addr); in flexcop_usb_transfer_init()
440 if (fc_usb->iso_buffer == NULL) in flexcop_usb_transfer_init()
441 return -ENOMEM; in flexcop_usb_transfer_init()
443 memset(fc_usb->iso_buffer, 0, bufsize); in flexcop_usb_transfer_init()
444 fc_usb->buffer_size = bufsize; in flexcop_usb_transfer_init()
448 fc_usb->iso_urb[i] = usb_alloc_urb(B2C2_USB_FRAMES_PER_ISO, in flexcop_usb_transfer_init()
450 if (fc_usb->iso_urb[i] == NULL) { in flexcop_usb_transfer_init()
451 ret = -ENOMEM; in flexcop_usb_transfer_init()
459 struct urb *urb = fc_usb->iso_urb[i]; in flexcop_usb_transfer_init()
463 urb->dev = fc_usb->udev; in flexcop_usb_transfer_init()
464 urb->context = fc_usb; in flexcop_usb_transfer_init()
465 urb->complete = flexcop_usb_urb_complete; in flexcop_usb_transfer_init()
466 urb->pipe = B2C2_USB_DATA_PIPE; in flexcop_usb_transfer_init()
467 urb->transfer_flags = URB_ISO_ASAP; in flexcop_usb_transfer_init()
468 urb->interval = 1; in flexcop_usb_transfer_init()
469 urb->number_of_packets = B2C2_USB_FRAMES_PER_ISO; in flexcop_usb_transfer_init()
470 urb->transfer_buffer_length = frame_size * B2C2_USB_FRAMES_PER_ISO; in flexcop_usb_transfer_init()
471 urb->transfer_buffer = fc_usb->iso_buffer + buffer_offset; in flexcop_usb_transfer_init()
477 urb->iso_frame_desc[j].offset = frame_offset; in flexcop_usb_transfer_init()
478 urb->iso_frame_desc[j].length = frame_size; in flexcop_usb_transfer_init()
482 if ((ret = usb_submit_urb(fc_usb->iso_urb[i],GFP_KERNEL))) { in flexcop_usb_transfer_init()
490 flexcop_sram_set_dest(fc_usb->fc_dev, FC_SRAM_DEST_MEDIA | in flexcop_usb_transfer_init()
493 flexcop_wan_set_speed(fc_usb->fc_dev, FC_WAN_SPEED_8MBITS); in flexcop_usb_transfer_init()
494 flexcop_sram_ctrl(fc_usb->fc_dev, 1, 1, 1); in flexcop_usb_transfer_init()
508 ret = usb_set_interface(fc_usb->udev, 0, 1); in flexcop_usb_init()
514 alt = fc_usb->uintf->cur_altsetting; in flexcop_usb_init()
516 if (alt->desc.bNumEndpoints < 2) in flexcop_usb_init()
517 return -ENODEV; in flexcop_usb_init()
518 if (!usb_endpoint_is_isoc_in(&alt->endpoint[0].desc)) in flexcop_usb_init()
519 return -ENODEV; in flexcop_usb_init()
521 switch (fc_usb->udev->speed) { in flexcop_usb_init()
524 return -ENODEV; in flexcop_usb_init()
533 info("running at SUPER speed."); in flexcop_usb_init()
536 info("running at SUPER+ speed."); in flexcop_usb_init()
541 return -ENODEV; in flexcop_usb_init()
543 usb_set_intfdata(fc_usb->uintf, fc_usb); in flexcop_usb_init()
549 usb_set_intfdata(fc_usb->uintf, NULL); in flexcop_usb_exit()
562 return -ENOMEM; in flexcop_usb_probe()
566 fc_usb = fc->bus_specific; in flexcop_usb_probe()
567 fc_usb->fc_dev = fc; in flexcop_usb_probe()
568 mutex_init(&fc_usb->data_mutex); in flexcop_usb_probe()
570 fc->read_ibi_reg = flexcop_usb_read_ibi_reg; in flexcop_usb_probe()
571 fc->write_ibi_reg = flexcop_usb_write_ibi_reg; in flexcop_usb_probe()
572 fc->i2c_request = flexcop_usb_i2c_request; in flexcop_usb_probe()
573 fc->get_mac_addr = flexcop_usb_get_mac_addr; in flexcop_usb_probe()
575 fc->stream_control = flexcop_usb_stream_control; in flexcop_usb_probe()
577 fc->pid_filtering = 1; in flexcop_usb_probe()
578 fc->bus_type = FC_USB; in flexcop_usb_probe()
580 fc->dev = &udev->dev; in flexcop_usb_probe()
581 fc->owner = THIS_MODULE; in flexcop_usb_probe()
584 fc_usb->udev = udev; in flexcop_usb_probe()
585 fc_usb->uintf = intf; in flexcop_usb_probe()
613 flexcop_device_exit(fc_usb->fc_dev); in flexcop_usb_disconnect()
615 flexcop_device_kfree(fc_usb->fc_dev); in flexcop_usb_disconnect()