From: Mauro Carvalho Chehab <mchehab@redhat.com>
To: Linux Media Mailing List <linux-media@vger.kernel.org>
Subject: [PATCH] tm6000: Properly set alternate when preparing to stream
Date: Mon, 26 Apr 2010 11:24:18 -0300 [thread overview]
Message-ID: <4BD5A212.10104@redhat.com> (raw)
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: Mauro Carvalho Chehab <mchehab@redhat.com>
--
Cheers,
Mauro
diff --git a/drivers/staging/tm6000/tm6000-cards.c b/drivers/staging/tm6000/tm6000-cards.c
index f795a3e..a7e9556 100644
--- a/drivers/staging/tm6000/tm6000-cards.c
+++ b/drivers/staging/tm6000/tm6000-cards.c
@@ -634,21 +634,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,
- char *msgtype,
- struct usb_host_endpoint *curr_e,
- unsigned int *maxsize,
- struct usb_host_endpoint **ep )
+static void get_max_endpoint(struct usb_device *udev,
+ struct usb_host_interface *alt,
+ char *msgtype,
+ struct usb_host_endpoint *curr_e,
+ 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);
@@ -743,24 +746,28 @@ 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,
- &dev->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,
- &dev->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,
- &dev->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,
- &dev->isoc_out);
+ get_max_endpoint(usbdev,
+ &interface->altsetting[i],
+ "ISOC OUT", e,
+ &dev->isoc_out);
}
break;
}
@@ -775,7 +782,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;
diff --git a/drivers/staging/tm6000/tm6000-video.c b/drivers/staging/tm6000/tm6000-video.c
index c53de47..96358b2 100644
--- a/drivers/staging/tm6000/tm6000-video.c
+++ b/drivers/staging/tm6000/tm6000-video.c
@@ -149,7 +149,8 @@ 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);
- memset(outp, 0, (*buf)->vb.size);
+ if (outp)
+ memset(outp, 0, (*buf)->vb.size);
return;
}
@@ -282,7 +283,8 @@ static int copy_packet(struct urb *urb, u32 header, u8 **ptr, u8 *endp,
start_line=line;
last_field=field;
}
- last_line=line;
+ if (cmd == TM6000_URB_MSG_VIDEO)
+ last_line = line;
pktsize = TM6000_URB_MSG_LEN;
} else {
@@ -614,14 +616,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;
@@ -651,8 +657,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++) {
@@ -680,7 +685,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;
diff --git a/drivers/staging/tm6000/tm6000.h b/drivers/staging/tm6000/tm6000.h
index 7aeded8..13d5a3e 100644
--- a/drivers/staging/tm6000/tm6000.h
+++ b/drivers/staging/tm6000/tm6000.h
@@ -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 */
@@ -185,9 +192,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;
next reply other threads:[~2010-04-26 14:24 UTC|newest]
Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top
2010-04-26 14:24 Mauro Carvalho Chehab [this message]
2010-04-26 15:25 ` [PATCH] tm6000: Properly set alternate when preparing to stream Stefan Ringel
2010-04-28 8:37 ` Bee Hock Goh
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=4BD5A212.10104@redhat.com \
--to=mchehab@redhat.com \
--cc=linux-media@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.