Hi,
Back in May in this mailing list there were few messages describing a problem
with Twinhan Alpha USB2 DVB-T (the old device, not the new one with the same
brand name which doesn't work at all in Linux, yet) device. Couple people
reported (including me) that this device had problems in Linux VDR application.
DVB-T TV picture works great with the device, for a while. Every now and then
the device starts to throw "usb in went wrong" and/or "usb out went wrong"
error messages in dmesg log. After the the whole system started to crawl and
didn't recover until the device was disconnected and re-connected in USB port
(well, that breaks VDR app so it had to be restarted also).
The problem could be related to VIA EPIA mini-itx boards (I have Epia M10000
board) because on www.vdr-portal.de (in LinVDR forum section) some other people
were reporting the same problem and at least one of them had EPIA board also.
Finally I have found a solution in my hardware setup. It required small
modification in drivers/media/dvb/dvb-usb/vp7045.c Kernel module (Twinhan
alpha2 uses dvb-usb-vp7045 module). If some of you have the same problem then
maybe attached diff patch works for you too.
I don't know too much about Linux DVB API and dvb arhitechture there so the
diff is just a hack. There could be easier or better solution available also.
The attached diff is probably useful only for in those scenarios where this
issue is giving "show stopper" problems.
Here is copy-paste of the post I did in
http://www.vdr-portal.de/board/thread.php?threadid=61812&page=2 forum post.
- Mike N
----------
Hello,This is an old topic but just wanted to share experiences and findings. I
had this same issue "usb out went wrong" with Epia M10000 board and Twinhan
Alpha USB2 DVB-T tuner.Mozard seems to have Epia board also and having the same
kind of errors, so could be that something is non-standard in Epia USB
ports."Mr. Google" didn't have an answer to this problem, only few hits to
pages describing the same problem. I have built Epia based VDR and eventually I
got frustrated enough to look more closely into this problem.The good news is
that at least in my hardware combination I have found a solution. Maybe it
helps in your situation also.I tracked down the problem into Kernel
dvb-usb-vp7045 module and "hack fix" modification in the corresponding vp7045.c
source file did the trick in my system (requires kernel module
re-compilation).The problem was the "usb-in" error came always first and after
that it started to throw "usb out went wrong" errors. I hardly ever recovered
from that error until Twinhan device was disconnected and re-connected in USB
port. The exact error code from failed usb command was always ETIMEDOUT (110),
so the command didn't complete properly in USB device.I have Linux 2.6.21.1
kernel but I think the module I modifed is pretty much the same in more recent
kernels too (and few steps older also).I modified
"linux-2.6.21.1/drivers/media/dvb/dvb-usb/vp7045.c" source file in a following
way:- From line 22 begins "int vp7045_usb_op" function- Few lines below in this
function there are two usb_control_msg function calls (the first one is out and
second one in usb command).- I added simple FOR loop to re-try the USB-IN
command few times if the error code was timeout error (and increasing timeout
value each time just in case until command succeeds).This "re-send the command"
fix does the magic in my Epia. Jihuuu! I still get "usb in went wrong" every
now and then but the driver automatically recovers from it within few secs so I
don't even notice it if I don't look at dmesg log outputs.If you have problems
with "usb OUT went wrong" situations in a way where IN command never failed at
first then maybe similar "re-try" and timeout increase fixes that too. But, in
my case I noticed that the first error message was always "usb in went wrong"
and only after that it started to throw "usb out went wrong".Please see the
attached diff path file for a more detailed code lines. This is "hack fix" so
defintely backup the original vp7045.c file before appyling the patch.Hopefully
this hack fix works for you also. For me it works great.- Mike
_________________________________________________________________
Connect to the next generation of MSN Messenger
http://imagine-msn.com/messenger/launch80/default.aspx?locale=en-us&source=wlmailtagline
diff -Naur old/vp7045.c new/vp7045.c
--- old/vp7045.c 2007-11-04 22:19:39.000000000 +0200
+++ new/vp7045.c 2007-11-04 22:20:40.000000000 +0200
@@ -21,6 +21,7 @@
int vp7045_usb_op(struct dvb_usb_device *d, u8 cmd, u8 *out, int outlen, u8
*in, int inlen, int msec)
{
+ int usbResult, idx; /* Hack fix to usb went wrong */
int ret = 0;
u8 inbuf[12] = { 0 }, outbuf[20] = { 0 };
@@ -52,10 +53,28 @@
msleep(msec);
+/* Hack fix: Removed code below and replaced with re-try looping
if (usb_control_msg(d->udev,
usb_rcvctrlpipe(d->udev,0),
TH_COMMAND_IN, USB_TYPE_VENDOR | USB_DIR_IN, 0, 0,
inbuf, 12, 2000) != 12) {
+*/
+
+ /* Hack fix: If usb-in fails in timeout error then try to recover from
it */
+ /* by re-sending the command. This seem to fix the problem with some
hardware */
+ for (idx = 0; idx < 3; idx++) {
+ usbResult = usb_control_msg(d->udev,
+ usb_rcvctrlpipe(d->udev,0),
+ TH_COMMAND_IN, USB_TYPE_VENDOR | USB_DIR_IN, 0, 0,
+ inbuf, 12, 2000 + (idx * 1000));
+
+ /* If usb-in succeeded (12 bytes) or not timed out error then
do not re-try */
+ if(usbResult == 12 || usbResult != -ETIMEDOUT) break;
+
+ err("USB control message 'in' went wrong. Trying to recover
(retry idx=%d).", idx);
+ }
+
+ if (usbResult != 12) {
err("USB control message 'in' went wrong.");
ret = -EIO;
goto unlock;
_______________________________________________
linux-dvb mailing list
linux-dvb@linuxtv.org
http://www.linuxtv.org/cgi-bin/mailman/listinfo/linux-dvb