Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 6ae635c4 authored by Mauro Carvalho Chehab's avatar Mauro Carvalho Chehab
Browse files

V4L/DVB: tm6000: Properly set alternate when preparing to stream



Although the code is getting the better alternates, it is not really using
it. Get the interface/alternate numbers and use it where needed.

This patch implements also one small fix at the last_line set, as
proposed by Bee Hock Goh <behock@gmail.com>.

Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@redhat.com>
parent 1ebf2c7f
Loading
Loading
Loading
Loading
+29 −22
Original line number Diff line number Diff line
@@ -650,21 +650,24 @@ err:
/* high bandwidth multiplier, as encoded in highspeed endpoint descriptors */
#define hb_mult(wMaxPacketSize) (1 + (((wMaxPacketSize) >> 11) & 0x03))

static void get_max_endpoint (  struct usb_device *usbdev,
static void get_max_endpoint(struct usb_device *udev,
			     struct usb_host_interface *alt,
			     char *msgtype,
			     struct usb_host_endpoint *curr_e,
				unsigned int *maxsize,
				struct usb_host_endpoint **ep  )
			     struct tm6000_endpoint *tm_ep)
{
	u16 tmp = le16_to_cpu(curr_e->desc.wMaxPacketSize);
	unsigned int size = tmp & 0x7ff;

	if (usbdev->speed == USB_SPEED_HIGH)
	if (udev->speed == USB_SPEED_HIGH)
		size = size * hb_mult (tmp);

	if (size>*maxsize) {
		*ep = curr_e;
		*maxsize = size;
	if (size > tm_ep->maxsize) {
		tm_ep->endp = curr_e;
		tm_ep->maxsize = size;
		tm_ep->bInterfaceNumber = alt->desc.bInterfaceNumber;
		tm_ep->bAlternateSetting = alt->desc.bAlternateSetting;

		printk("tm6000: %s endpoint: 0x%02x (max size=%u bytes)\n",
					msgtype, curr_e->desc.bEndpointAddress,
					size);
@@ -760,23 +763,27 @@ static int tm6000_usb_probe(struct usb_interface *interface,
			switch (e->desc.bmAttributes) {
			case USB_ENDPOINT_XFER_BULK:
				if (!dir_out) {
					get_max_endpoint (usbdev, "Bulk IN", e,
							&dev->max_bulk_in,
					get_max_endpoint(usbdev,
							 &interface->altsetting[i],
							 "Bulk IN", e,
							 &dev->bulk_in);
				} else {
					get_max_endpoint (usbdev, "Bulk OUT", e,
							&dev->max_bulk_out,
					get_max_endpoint(usbdev,
							 &interface->altsetting[i],
							 "Bulk OUT", e,
							 &dev->bulk_out);
				}
				break;
			case USB_ENDPOINT_XFER_ISOC:
				if (!dir_out) {
					get_max_endpoint (usbdev, "ISOC IN", e,
							&dev->max_isoc_in,
					get_max_endpoint(usbdev,
							 &interface->altsetting[i],
							 "ISOC IN", e,
							 &dev->isoc_in);
				} else {
					get_max_endpoint (usbdev, "ISOC OUT", e,
							&dev->max_isoc_out,
					get_max_endpoint(usbdev,
							 &interface->altsetting[i],
							 "ISOC OUT", e,
							 &dev->isoc_out);
				}
				break;
@@ -792,7 +799,7 @@ static int tm6000_usb_probe(struct usb_interface *interface,
		interface->altsetting->desc.bInterfaceNumber);

/* check if the the device has the iso in endpoint at the correct place */
	if (!dev->isoc_in) {
	if (!dev->isoc_in.endp) {
		printk("tm6000: probing error: no IN ISOC endpoint!\n");
		rc= -ENODEV;

+1 −1
Original line number Diff line number Diff line
@@ -108,7 +108,7 @@ int tm6000_start_stream(struct tm6000_core *dev)
		return -ENOMEM;
	}

	pipe = usb_rcvbulkpipe(dev->udev, dev->bulk_in->desc.bEndpointAddress
	pipe = usb_rcvbulkpipe(dev->udev, dev->bulk_in.endp->desc.bEndpointAddress
							  & USB_ENDPOINT_NUMBER_MASK);

	size = usb_maxpacket(dev->udev, pipe, usb_pipeout(pipe));
+13 −8
Original line number Diff line number Diff line
@@ -151,6 +151,7 @@ static inline void get_next_buf(struct tm6000_dmaqueue *dma_q,

	/* Cleans up buffer - Usefull for testing for frame/URB loss */
	outp = videobuf_to_vmalloc(&(*buf)->vb);
	if (outp)
		memset(outp, 0, (*buf)->vb.size);

	return;
@@ -284,6 +285,7 @@ static int copy_packet(struct urb *urb, u32 header, u8 **ptr, u8 *endp,
			start_line=line;
			last_field=field;
		}
		if (cmd == TM6000_URB_MSG_VIDEO)
			last_line = line;

		pktsize = TM6000_URB_MSG_LEN;
@@ -616,14 +618,18 @@ static int tm6000_prepare_isoc(struct tm6000_core *dev, unsigned int framesize)
	/* De-allocates all pending stuff */
	tm6000_uninit_isoc(dev);

	usb_set_interface(dev->udev,
			  dev->isoc_in.bInterfaceNumber,
			  dev->isoc_in.bAlternateSetting);

	pipe = usb_rcvisocpipe(dev->udev,
			       dev->isoc_in->desc.bEndpointAddress &
			       dev->isoc_in.endp->desc.bEndpointAddress &
			       USB_ENDPOINT_NUMBER_MASK);

	size = usb_maxpacket(dev->udev, pipe, usb_pipeout(pipe));

	if (size > dev->max_isoc_in)
		size = dev->max_isoc_in;
	if (size > dev->isoc_in.maxsize)
		size = dev->isoc_in.maxsize;

	dev->isoc_ctl.max_pkt_size = size;

@@ -653,8 +659,7 @@ static int tm6000_prepare_isoc(struct tm6000_core *dev, unsigned int framesize)
	dprintk(dev, V4L2_DEBUG_QUEUE, "Allocating %d x %d packets"
		    " (%d bytes) of %d bytes each to handle %u size\n",
		    max_packets, num_bufs, sb_size,
		    dev->max_isoc_in, size);

		    dev->isoc_in.maxsize, size);

	/* allocate urbs and transfer buffers */
	for (i = 0; i < dev->isoc_ctl.num_bufs; i++) {
@@ -682,7 +687,7 @@ static int tm6000_prepare_isoc(struct tm6000_core *dev, unsigned int framesize)
		usb_fill_bulk_urb(urb, dev->udev, pipe,
				  dev->isoc_ctl.transfer_buffer[i], sb_size,
				  tm6000_irq_callback, dma_q);
		urb->interval = dev->isoc_in->desc.bInterval;
		urb->interval = dev->isoc_in.endp->desc.bInterval;
		urb->number_of_packets = max_packets;
		urb->transfer_flags = URB_ISO_ASAP | URB_NO_TRANSFER_DMA_MAP;

+8 −3
Original line number Diff line number Diff line
@@ -132,6 +132,13 @@ struct tm6000_dvb {
	struct mutex		mutex;
};

struct tm6000_endpoint {
	struct usb_host_endpoint	*endp;
	__u8				bInterfaceNumber;
	__u8				bAlternateSetting;
	unsigned			maxsize;
};

struct tm6000_core {
	/* generic device properties */
	char				name[30];	/* name (including minor) of the device */
@@ -186,9 +193,7 @@ struct tm6000_core {
	/* usb transfer */
	struct usb_device		*udev;		/* the usb device */

	struct usb_host_endpoint	*bulk_in, *bulk_out, *isoc_in, *isoc_out;
	unsigned int			max_bulk_in, max_bulk_out;
	unsigned int			max_isoc_in, max_isoc_out;
	struct tm6000_endpoint		bulk_in, bulk_out, isoc_in, isoc_out;

	/* scaler!=0 if scaler is active*/
	int				scaler;