[linux-dvb] [PATCH] Multiple vp7045 DVB USB devices and lockups
Hilton
dvb at hiltonday.com
Thu Feb 2 12:06:06 CET 2006
Great, thanks Tim.. looks from my vague recollection of my prehistoric c
coding days like you're right and the problem is the function pointers -
it'd also explain the delay before the kernel falls over.
I haven't had time to play with the new firmware yet either, and am away
this weekend. I should get some time next week (assuming I can fit in
around my wife's busy recording schedules ;) to grab the latest tree and
test your patch.
I'll post feedback as soon as I've had a chance to build the new tree.
Regards,
Hilton.
Tim Davies wrote:
> Okay, I think I've kinda solved this one...
>
> The problem is in dvb-usb-dvb.c, in the dvb_usb_fe_init function. It
> has this line:
>
> d->fe_init = d->fe->ops->init; d->fe->ops->init = dvb_usb_fe_wakeup;
>
> Which essentially runs the wrapper function "dvb_usb_wakeup" instead
> of the specific driver's frontend init function "d->fe_ops_init". As
> it happens, "dvb_usb_wakeup" then calls "d->fe_init" which is set to
> the driver's frontend init function anyway. All it has is some extra
> power control stuff in it.
>
> So the problem with multiple tuners is when the second card is
> initialised, it runs that code again. This has the net effect of
> setting "d->fe_init" equal to "dvb_usb_fe_wakeup". Of course when
> this function runs on this second thread, it ends up calling itself!
> And not surprisingly, after a short delay the kernel craps out.
>
> And the same issue applies to the sleep function too.
>
> Here is my patch:
>
> diff -ur linux.orig/drivers/media/dvb/dvb-usb/dvb-usb-dvb.c
> linux/drivers/media/dvb/dvb-usb/dvb-usb-dvb.c
> --- linux.orig/drivers/media/dvb/dvb-usb/dvb-usb-dvb.c 2006-02-02
> 16:10:24.000000000 +0800
> +++ linux/drivers/media/dvb/dvb-usb/dvb-usb-dvb.c 2006-02-02
> 16:13:09.000000000 +0800
> @@ -184,8 +184,12 @@
>
> /* re-assign sleep and wakeup functions */
> if (d->fe != NULL) {
> - d->fe_init = d->fe->ops->init; d->fe->ops->init =
> dvb_usb_fe_wakeup;
> - d->fe_sleep = d->fe->ops->sleep; d->fe->ops->sleep =
> dvb_usb_fe_sleep;
> + if (d->fe->ops->init != dvb_usb_fe_wakeup) {
> + d->fe_init = d->fe->ops->init;
> d->fe->ops->init = dvb_usb_fe_wakeup;
> + }
> + if (d->fe->ops->sleep != dvb_usb_fe_sleep) {
> + d->fe_sleep = d->fe->ops->sleep;
> d->fe->ops->sleep = dvb_usb_fe_sleep;
> + }
>
> if (dvb_register_frontend(&d->dvb_adap, d->fe)) {
> err("Frontend registration failed.");
>
>
> Hilton, do you want to give it a try? It seems to work okay for me,
> although I think I have a problem with kernel preemption every so
> often. I haven't had a good look at it yet.
>
>
> Cheers,
>
> Tim.
>
>
>
> Hilton wrote:
>
>> I have a hex export of the latest EZ-USB firmware courtesy of the
>> helpful staff at DigitalNow.
>> Gonna see about compiling it and see if that helps the situation.
>> I'll post info/results once I've had a test, probably this weekend.
>>
>> Hilton.
>>
>> Tim Davies wrote:
>>
>>> Well, I had a quick play around with this:
>>>
>>> - The problem is scheduling while atomic: during the msleep in the
>>> vp7045_usb_op function (vp7045.c) initiated by the wakeup of the
>>> second frontend.
>>> - I did try turning off kernel preemption, but no change
>>> - I also tried a few hacks with the driver code, but got nothing
>>> conclusive.
>>>
>>> My config is:
>>>
>>> 2 x DigitalNow TwinDVB-T device (4 vp7045 tuners)
>>> Kernel is 2.4.15-gentoo-r1 running on a Gentoo 2005.1 system
>>> Processor is AMD64 3200+
>>> DVB drivers are the latest from CVS
>>>
>>> Not that my knowledge of Linux semaphores and USB is all that great,
>>> but wouldn't locking around the send and receive usb_control_msg
>>> (with a potentially long mdelay in between) cause problems? Is the
>>> semaphore a per-device thing?
>>>
>>> Maybe it's time for me to read up on USB drivers...
>>>
>>>
>>> Tim.
>>>
>>>
>>> Hilton wrote:
>>>
>>>> Does anyone successfully have multiple vp7045 dvb-t usb devices
>>>> working? (Twinhan Alpha II, Digitalnow TwinDVB-T, multiple Tinyusb2
>>>> devices etc)
>>>>
>>>> I also have the same problem as has been posted about over the last
>>>> few months (see quoted below from Tim Davies), with dual vp7045 usb
>>>> devices (DigitalNow TwinDVB-T device - rebadged DVICO Tinyusb 2
>>>> devices).
>>>>
>>>> This post is mostly configuration info - along with Tim's debug
>>>> output quoted below.
>>>>
>>>> Currently using Fedora Core 4's 2.6.14-1.1656_FC4 kernel, all
>>>> updates applies, and the latest cvs build of the v4l/dvb modules,
>>>> along with the dvb-usb-vp7045-01.fw firmware. I've also had the
>>>> same problem with the default 2.6.14 kernel modules, and also the
>>>> Jan 16th build of 2.6.16-RC1 kernel (yes, I've done a lot of
>>>> compiling in the last week ;)
>>>>
>>>> Both devices work fine (tested on the same hardware with Windows
>>>> XP) at the same time, so its not a usb power-rail problem.
>>>>
>>>> If anyone can help shed some light on a solution, I'd be grateful -
>>>> done a lot of reading and found a lot of people with the same
>>>> issue, but no resolution yet.
>>>>
>>>> I'm happy to test any potential solutions - or enable debug in my
>>>> current module builds to provide more specific info than is
>>>> included below. :)
>>>>
>>>> Thanks,
>>>>
>>>> Hilton.
>>>>
>>>> My dmesg output is:
>>>>
>>>> [mythtv at tv ~]$ dmesg | grep dvb
>>>> dvb-usb: found a 'Twinhan USB2.0 DVB-T receiver (TwinhanDTV
>>>> Alpha/MagicBox II)' in warm state.
>>>> dvb-usb: will pass the complete MPEG2 transport stream to the
>>>> software demuxer.
>>>> dvb-usb: MAC address: 08:ca:17:4e:bc:ff
>>>> dvb-usb: schedule remote query interval to 400 msecs.
>>>> dvb-usb: Twinhan USB2.0 DVB-T receiver (TwinhanDTV Alpha/MagicBox
>>>> II) successfully initialized and connected.
>>>> dvb-usb: found a 'Twinhan USB2.0 DVB-T receiver (TwinhanDTV
>>>> Alpha/MagicBox II)' in warm state.
>>>> dvb-usb: will pass the complete MPEG2 transport stream to the
>>>> software demuxer.
>>>> dvb-usb: MAC address: 08:ca:17:4e:b8:ff
>>>> dvb-usb: schedule remote query interval to 400 msecs.
>>>> dvb-usb: Twinhan USB2.0 DVB-T receiver (TwinhanDTV Alpha/MagicBox
>>>> II) successfully initialized and connected.
>>>> usbcore: registered new driver dvb_usb_vp7045
>>>>
>>>> My /dev/dvb is:
>>>>
>>>> [mythtv at tv ~]$ ls -laR /dev/dvb
>>>> /dev/dvb:
>>>> total 0
>>>> drwxr-xr-x 4 root root 80 Jan 21 2006 .
>>>> drwxr-xr-x 12 root root 4480 Jan 21 12:04 ..
>>>> drwxr-xr-x 2 mythtv mythtv 120 Jan 21 2006 adapter0
>>>> drwxr-xr-x 2 mythtv mythtv 120 Jan 21 2006 adapter1
>>>>
>>>> /dev/dvb/adapter0:
>>>> total 0
>>>> drwxr-xr-x 2 mythtv mythtv 120 Jan 21 2006 .
>>>> drwxr-xr-x 4 root root 80 Jan 21 2006 ..
>>>> crw-rw---- 1 mythtv mythtv 212, 4 Jan 21 2006 demux0
>>>> crw-rw---- 1 mythtv mythtv 212, 5 Jan 21 2006 dvr0
>>>> crw-rw---- 1 mythtv mythtv 212, 3 Jan 21 2006 frontend0
>>>> crw-rw---- 1 mythtv mythtv 212, 7 Jan 21 2006 net0
>>>>
>>>> /dev/dvb/adapter1:
>>>> total 0
>>>> drwxr-xr-x 2 mythtv mythtv 120 Jan 21 2006 .
>>>> drwxr-xr-x 4 root root 80 Jan 21 2006 ..
>>>> crw-rw---- 1 mythtv mythtv 212, 68 Jan 21 2006 demux0
>>>> crw-rw---- 1 mythtv mythtv 212, 69 Jan 21 2006 dvr0
>>>> crw-rw---- 1 mythtv mythtv 212, 67 Jan 21 2006 frontend0
>>>> crw-rw---- 1 mythtv mythtv 212, 71 Jan 21 2006 net0
>>>>
>>>> Performing a scan works fine for adapter0
>>>>
>>>> [mythtv at tv ~]$ scandvb files/frequency.artarmon
>>>> scanning files/frequency.artarmon
>>>> using '/dev/dvb/adapter0/frontend0' and '/dev/dvb/adapter0/demux0'
>>>> initial transponder 226500000 1 2 0 3 1 2 0
>>>> initial transponder 191625000 1 2 0 3 1 2 0
>>>> initial transponder 571500000 1 2 0 3 1 2 0
>>>> initial transponder 219500000 1 3 0 3 1 1 0
>>>> initial transponder 177500000 1 2 0 3 1 2 0
>>>> >>> tune to:
>>>> 226500000:INVERSION_AUTO:BANDWIDTH_7_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE
>>>>
>>>>
>>>> But with adapter1 (scandvb -a 1 ) I get the "using
>>>> '/dev/dvb/adapter1/frontend0' and '/dev/dvb/adapter0/demux0', then
>>>> the PC hard-locks about 15s later with not output.
>>>>
>>>> And finally, Tim's quoted debug for the same issue.
>>>>
>>>>
>>>>
>>>>> Hi,
>>>>>
>>>>> I noticed in November there was a problem running multiple Twinhan
>>>>> DTV MagicBox II devices, which causes the kernel to lock up. As
>>>>> far as I could tell, the issue was abandoned - with a copy of the
>>>>> kernel oops being needed to continue...
>>>>>
>>>>> Well, I also have multiple vp7045 based tuners (the DNTV version)
>>>>> and have the same problem. I have an excerpt of the kernel oops
>>>>> text below.
>>>>>
>>>>> Basically the problem seems to occur if any tuner apart from the
>>>>> first one is opened, and there is normally a delay (15-20sec?)
>>>>> before the crash. I am using the CVS driver from the 16/1/06 (the
>>>>> most recent).
>>>>>
>>>>> Thanks,
>>>>>
>>>>> Tim.
>>>>>
>>>>>
>>>>> Jan 16 10:39:20 mediabox
>>>>> <ffffffff88607861>{:dvb_usb:dvb_usb_fe_wakeup+65}
>>>>> <ffffffff88607861>{:dvb_usb:dvb_usb_fe_wakeup+65}
>>>>>
>>>>> ... <repeated ~100 times>
>>>>>
>>>>> Jan 16 10:39:20 mediabox
>>>>> <ffffffff88607861>{:dvb_usb:dvb_usb_fe_wakeup+65}
>>>>> <ffffffff88607861>{:dvb_usb:dvb_usb_fe_wakeup+65}
>>>>> Jan 16 10:39:20 mediabox
>>>>> <ffffffff88607861>{:dvb_usb:dvb_usb_fe_wakeup+65}
>>>>> <ffffffff8012cde4>{deactivate_task+20}
>>>>> Jan 16 10:39:20 mediabox
>>>>> <ffffffff885f7f5b>{:dvb_core:dvb_frontend_thread+219}
>>>>> Jan 16 10:39:20 mediabox <ffffffff80130031>{copy_process+4241}
>>>>> <ffffffff8010f31e>{child_rip+8}
>>>>> Jan 16 10:39:20 mediabox
>>>>> <ffffffff885f7e80>{:dvb_core:dvb_frontend_thread+0}
>>>>> Jan 16 10:39:20 mediabox <ffffffff8010f316>{child_rip+0}
>>>>> Jan 16 10:39:20 mediabox scheduling while atomic:
>>>>> kdvb-fe-1/0xffff8100/14284
>>>>> Jan 16 10:39:20 mediabox
>>>>> Jan 16 10:39:20 mediabox Call
>>>>> Trace:<ffffffff803ca99a>{schedule+122}
>>>>> <ffffffff8032dbd0>{timeout_kill+0}
>>>>> Jan 16 10:39:20 mediabox <ffffffff803cb7b4>{schedule_timeout+148}
>>>>> <ffffffff80139670>{process_timeout+0}
>>>>> Jan 16 10:39:20 mediabox <ffffffff80139a4a>{msleep+42}
>>>>> <ffffffff8860c11c>{:dvb_usb_vp7045:vp7045_usb_op+284}
>>>>> Jan 16 10:39:20 mediabox
>>>>> <ffffffff8860c3fa>{:dvb_usb_vp7045:.text.lock.vp7045+5}
>>>>> Jan 16 10:39:20 mediabox
>>>>> <ffffffff8860c24a>{:dvb_usb_vp7045:vp7045_power_ctrl+42}
>>>>> Jan 16 10:39:20 mediabox
>>>>> <ffffffff8860784c>{:dvb_usb:dvb_usb_fe_wakeup+44}
>>>>> <ffffffff88607861>{:dvb_usb:dvb_usb_fe_wakeup+65}
>>>>> Jan 16 10:39:20 mediabox
>>>>> <ffffffff88607861>{:dvb_usb:dvb_usb_fe_wakeup+65}
>>>>> <ffffffff88607861>{:dvb_usb:dvb_usb_fe_wakeup+65}
>>>>>
>>>>> ...
>>>>>
>>>>> Jan 16 10:39:20 mediabox
>>>>> <ffffffff88607861>{:dvb_usb:dvb_usb_fe_wakeup+65}
>>>>> <ffffffff88607861>{:dvb_usb:dvb_usb_fe_wakeup+65}
>>>>> Jan 16 10:39:20 mediabox
>>>>> <ffffffff88607861>{:dvb_usb:dvb_usb_fe_wakeup+65}
>>>>> <ffffffff8012cde4>{deactivate_task+20}
>>>>> Jan 16 10:39:20 mediabox
>>>>> <ffffffff885f7f5b>{:dvb_core:dvb_frontend_thread+219}
>>>>> Jan 16 10:39:20 mediabox <ffffffff80130031>{copy_process+4241}
>>>>> <ffffffff8010f31e>{child_rip+8}
>>>>> Jan 16 10:39:20 mediabox
>>>>> <ffffffff885f7e80>{:dvb_core:dvb_frontend_thread+0}
>>>>> Jan 16 10:39:20 mediabox <ffffffff8010f316>{child_rip+0}
>>>>> Jan 16 10:39:20 mediabox scheduling while atomic:
>>>>> kdvb-fe-1/0xffff8100/14284
>>>>> Jan 16 10:39:20 mediabox
>>>>> Jan 16 10:39:20 mediabox Call
>>>>> Trace:<ffffffff803ca99a>{schedule+122}
>>>>> <ffffffff803cb7b4>{schedule_timeout+148}
>>>>> Jan 16 10:39:20 mediabox <ffffffff80139670>{process_timeout+0}
>>>>> <ffffffff80139a4a>{msleep+42}
>>>>> Jan 16 10:39:20 mediabox
>>>>> <ffffffff8860c11c>{:dvb_usb_vp7045:vp7045_usb_op+284}
>>>>> Jan 16 10:39:20 mediabox
>>>>> <ffffffff8860c3fa>{:dvb_usb_vp7045:.text.lock.vp7045+5}
>>>>> Jan 16 10:39:20 mediabox
>>>>> <ffffffff8860c24a>{:dvb_usb_vp7045:vp7045_power_ctrl+42}
>>>>> Jan 16 10:39:20 mediabox 861>{:dvb_usb:dvb_usb_fe_wakeup+65}
>>>>> <ffffffff88607861>{:dvb_usb:dvb_usb_fe_wakeup+65}
>>>>> Jan 16 10:39:20 mediabox
>>>>> <ffffffff88607861>{:dvb_usb:dvb_usb_fe_wakeup+65}
>>>>> <ffffffff88607861>{:dvb_usb:dvb_usb_fe_wakeup+65}
>>>>
>>>>
More information about the linux-dvb
mailing list