* Re: [linux-dvb] [PATCH] cx88-dvb: Fix order of frontend allocations (Re: current v4l-dvb - cannot access /dev/dvb/: No such file or directory)
[not found] ` <1231719484.10277.4.camel@palomino.walls.org>
@ 2009-01-12 10:40 ` Pierre Gronlier
2009-01-12 16:18 ` Mika Laitio
2009-01-12 19:12 ` John Donoghue
2 siblings, 0 replies; 4+ messages in thread
From: Pierre Gronlier @ 2009-01-12 10:40 UTC (permalink / raw)
To: linux-dvb; +Cc: linux-dvb, linux-media
Andy Walls wrote:
> On Fri, 2009-01-09 at 15:40 +0300, Goga777 wrote:
>> hI
>>
>> With today v4l-dvb I couldn't run my hvr4000 card on 2.6.27 kernel
>
>
>> [ 14.555162] cx88/2: cx2388x dvb driver version 0.0.6 loaded
>> [ 14.555231] cx88/2: registering cx8802 driver, type: dvb access: shared
>> [ 14.555303] cx88[0]/2: subsystem: 0070:6900, board: Hauppauge WinTV-HVR4000 DVB-S/S2/T/Hybrid [card=68]
>> [ 14.555374] cx88[0]/2: cx2388x based DVB/ATSC card
>> [ 14.555446] BUG: unable to handle kernel NULL pointer dereference at 00000000
>> [ 14.555560] IP: [<c02e6bff>] __mutex_lock_common+0x3c/0xe4
>> [ 14.555652] *pde = 00000000
>> [ 14.555735] Oops: 0002 [#1] SMP
>> [ 14.555851] Modules linked in: cx88_dvb(+) cx88_vp3054_i2c videobuf_dvb wm8775 dvb_core tuner_simple tuner_types snd_seq_dummy tda9887 snd_seq_oss(+) snd_intel8x0(+) tda8290 snd_seq_midi snd_seq_midi_event snd_ac97_codec cx88_alsa(+) snd_seq ac97_bus snd_pcm_oss snd_mixer_oss snd_pcm snd_rawmidi snd_timer tuner snd_seq_device psmouse snd serio_raw ivtv(+) cx8800 cx8802 cx88xx soundcore cx2341x ir_common ns558 i2c_i801 v4l2_common videodev i2c_algo_bit gameport v4l1_compat snd_page_alloc tveeprom pcspkr floppy videobuf_dma_sg videobuf_core btcx_risc i2c_core parport_pc parport button intel_agp agpgart shpchp pci_hotplug rng_core iTCO_wdt sd_mod evdev usbhid hid ff_memless ext3 jbd mbcache ide_cd_mod cdrom ide_disk ata_piix libata dock 8139too usb_storage scsi_mod piix 8139cp mii ide_co
> re uhci_hcd ehci_hcd usbcore thermal processor fan thermal_sys
>> [ 14.557013]
>> [ 14.557013] Pid: 2310, comm: modprobe Not tainted (2.6.27.1-custom-default1 #1)
>> [ 14.557013] EIP: 0060:[<c02e6bff>] EFLAGS: 00010246 CPU: 1
>> [ 14.557013] EIP is at __mutex_lock_common+0x3c/0xe4
>> [ 14.557013] EAX: de653e98 EBX: de739118 ECX: de739120 EDX: 00000000
>> [ 14.557013] ESI: dd4209e0 EDI: de73911c EBP: de653eb0 ESP: de653e88
>> [ 14.557013] DS: 007b ES: 007b FS: 00d8 GS: 0033 SS: 0068
>> [ 14.557013] Process modprobe (pid: 2310, ti=de652000 task=dd4209e0 task.ti=de652000)
>> [ 14.557013] Stack: 3535352e 5d343733 00000002 de739120 de739120 00000000 c044a6c0 de739110
>> [ 14.557013] de739118 00000001 de653ebc c02e6d38 c02e6b88 de653ec4 c02e6b88 de653ed8
>> [ 14.557013] e1ac7115 de6a9000 00000001 00000000 de653f0c e1aeca62 de739004 de739000
>> [ 14.557013] Call Trace:
>> [ 14.557013] [<c02e6d38>] ? __mutex_lock_slowpath+0x17/0x1a
>> [ 14.557013] [<c02e6b88>] ? mutex_lock+0x12/0x14
>> [ 14.557013] [<c02e6b88>] ? mutex_lock+0x12/0x14
>> [ 14.557013] [<e1ac7115>] ? videobuf_dvb_get_frontend+0x19/0x40 [videobuf_dvb]
>> [ 14.557013] [<e1aeca62>] ? cx8802_dvb_probe+0xc9/0x1945 [cx88_dvb]
>> [ 14.557013] [<e09ee41e>] ? cx8802_register_driver+0xbd/0x1ac [cx8802]
>> [ 14.557013] [<e09ee467>] ? cx8802_register_driver+0x106/0x1ac [cx8802]
>> [ 14.557013] [<e1aee37f>] ? dvb_init+0x22/0x27 [cx88_dvb]
>> [ 14.557013] [<c0101132>] ? _stext+0x42/0x11a
>> [ 14.557013] [<e1aee35d>] ? dvb_init+0x0/0x27 [cx88_dvb]
>> [ 14.557013] [<c013d2ca>] ? __blocking_notifier_call_chain+0xe/0x51
>> [ 14.557013] [<c014970b>] ? sys_init_module+0x8c/0x17d
>> [ 14.557013] [<c0103b42>] ? syscall_call+0x7/0xb
>> [ 14.557013] [<c013007b>] ? round_jiffies_relative+0x14/0x16
>> [ 14.557013] =======================
>> [ 14.557013] Code: 78 04 89 f8 89 55 e0 64 8b 35 00 30 3f c0 e8 2e 0c 00 00 8d 43 08 89 45 e4 8b 53 0c 8d 45 e8 8b 4d e4 89 43 0c 89 4d e8 89 55 ec <89> 02 89 75 f0 83 c8 ff 87 03 48 74 55 8a 45 e0 8b 4d e0 83 e0
>> [ 14.557013] EIP: [<c02e6bff>] __mutex_lock_common+0x3c/0xe4 SS:ESP 0068:de653e88
>> [ 14.565211] ---[ end trace 94d8b014e067ac7b ]---
>
>
> I don't have the hardware to test with. Please try this patch.
>
> Regards,
> Andy
>
Hi
I got the same error on my box with a hvr4000 and tt3200.
This path solved this issue for me.
--
pierre
>
> Signed-off-by: Andy Walls <awalls@radix.net>
>
> diff -r a28c39659c25 linux/drivers/media/video/cx88/cx88-dvb.c
> --- a/linux/drivers/media/video/cx88/cx88-dvb.c Sat Jan 10 16:04:45 2009 -0500
> +++ b/linux/drivers/media/video/cx88/cx88-dvb.c Sun Jan 11 19:13:10 2009 -0500
> @@ -621,33 +621,40 @@ static struct stv0288_config tevii_tuner
> .set_ts_params = cx24116_set_ts_param,
> };
>
> +static int cx8802_alloc_frontends(struct cx8802_dev *dev)
> +{
> + struct cx88_core *core = dev->core;
> + struct videobuf_dvb_frontend *fe = NULL;
> + int i;
> +
> + mutex_init(&dev->frontends.lock);
> + INIT_LIST_HEAD(&dev->frontends.felist);
> +
> + if (!core->board.num_frontends)
> + return -ENODEV;
> +
> + printk(KERN_INFO "%s() allocating %d frontend(s)\n", __func__,
> + core->board.num_frontends);
> + for (i = 1; i <= core->board.num_frontends; i++) {
> + fe = videobuf_dvb_alloc_frontend(&dev->frontends, i);
> + if (!fe) {
> + printk(KERN_ERR "%s() failed to alloc\n", __func__);
> + videobuf_dvb_dealloc_frontends(&dev->frontends);
> + return -ENOMEM;
> + }
> + }
> + return 0;
> +}
> +
> static int dvb_register(struct cx8802_dev *dev)
> {
> struct cx88_core *core = dev->core;
> struct videobuf_dvb_frontend *fe0, *fe1 = NULL;
> int mfe_shared = 0; /* bus not shared by default */
> - int i;
>
> if (0 != core->i2c_rc) {
> printk(KERN_ERR "%s/2: no i2c-bus available, cannot attach dvb drivers\n", core->name);
> goto frontend_detach;
> - }
> -
> - if (!core->board.num_frontends)
> - return -EINVAL;
> -
> - mutex_init(&dev->frontends.lock);
> - INIT_LIST_HEAD(&dev->frontends.felist);
> -
> - printk(KERN_INFO "%s() allocating %d frontend(s)\n", __func__,
> - core->board.num_frontends);
> - for (i = 1; i <= core->board.num_frontends; i++) {
> - fe0 = videobuf_dvb_alloc_frontend(&dev->frontends, i);
> - if (!fe0) {
> - printk(KERN_ERR "%s() failed to alloc\n", __func__);
> - videobuf_dvb_dealloc_frontends(&dev->frontends);
> - goto frontend_detach;
> - }
> }
>
> /* Get the first frontend */
> @@ -1253,6 +1260,8 @@ static int cx8802_dvb_probe(struct cx880
> struct cx88_core *core = drv->core;
> struct cx8802_dev *dev = drv->core->dvbdev;
> int err;
> + struct videobuf_dvb_frontend *fe;
> + int i;
>
> dprintk( 1, "%s\n", __func__);
> dprintk( 1, " ->being probed by Card=%d Name=%s, PCI %02x:%02x\n",
> @@ -1268,39 +1277,34 @@ static int cx8802_dvb_probe(struct cx880
> /* If vp3054 isn't enabled, a stub will just return 0 */
> err = vp3054_i2c_probe(dev);
> if (0 != err)
> - goto fail_probe;
> + goto fail_core;
>
> /* dvb stuff */
> printk(KERN_INFO "%s/2: cx2388x based DVB/ATSC card\n", core->name);
> dev->ts_gen_cntrl = 0x0c;
>
> + err = cx8802_alloc_frontends(dev);
> + if (err)
> + goto fail_core;
> +
> err = -ENODEV;
> - if (core->board.num_frontends) {
> - struct videobuf_dvb_frontend *fe;
> - int i;
> -
> - for (i = 1; i <= core->board.num_frontends; i++) {
> - fe = videobuf_dvb_get_frontend(&core->dvbdev->frontends, i);
> - if (fe == NULL) {
> - printk(KERN_ERR "%s() failed to get frontend(%d)\n",
> + for (i = 1; i <= core->board.num_frontends; i++) {
> + fe = videobuf_dvb_get_frontend(&core->dvbdev->frontends, i);
> + if (fe == NULL) {
> + printk(KERN_ERR "%s() failed to get frontend(%d)\n",
> __func__, i);
> - goto fail_probe;
> - }
> - videobuf_queue_sg_init(&fe->dvb.dvbq, &dvb_qops,
> + goto fail_probe;
> + }
> + videobuf_queue_sg_init(&fe->dvb.dvbq, &dvb_qops,
> &dev->pci->dev, &dev->slock,
> V4L2_BUF_TYPE_VIDEO_CAPTURE,
> V4L2_FIELD_TOP,
> sizeof(struct cx88_buffer),
> dev);
> - /* init struct videobuf_dvb */
> - fe->dvb.name = dev->core->name;
> - }
> - } else {
> - /* no frontends allocated */
> - printk(KERN_ERR "%s/2 .num_frontends should be non-zero\n",
> - core->name);
> - goto fail_core;
> + /* init struct videobuf_dvb */
> + fe->dvb.name = dev->core->name;
> }
> +
> err = dvb_register(dev);
> if (err)
> /* frontends/adapter de-allocated in dvb_register */
>
>
>
> --
> To unsubscribe from this list: send the line "unsubscribe linux-media" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at http://vger.kernel.org/majordomo-info.html
>
_______________________________________________
linux-dvb users mailing list
For V4L/DVB development, please use instead linux-media@vger.kernel.org
linux-dvb@linuxtv.org
http://www.linuxtv.org/cgi-bin/mailman/listinfo/linux-dvb
^ permalink raw reply [flat|nested] 4+ messages in thread* Re: [linux-dvb] [PATCH] cx88-dvb: Fix order of frontend allocations (Re: current v4l-dvb - cannot access /dev/dvb/: No such file or directory)
[not found] ` <1231719484.10277.4.camel@palomino.walls.org>
2009-01-12 10:40 ` [linux-dvb] [PATCH] cx88-dvb: Fix order of frontend allocations (Re: current v4l-dvb - cannot access /dev/dvb/: No such file or directory) Pierre Gronlier
@ 2009-01-12 16:18 ` Mika Laitio
2009-01-12 19:12 ` John Donoghue
2 siblings, 0 replies; 4+ messages in thread
From: Mika Laitio @ 2009-01-12 16:18 UTC (permalink / raw)
To: Andy Walls; +Cc: Goga777, linux-dvb, linux-media
[-- Attachment #1: Type: TEXT/PLAIN, Size: 5709 bytes --]
> I don't have the hardware to test with. Please try this patch.
Hi
I tested the patch and it helped me to get the drivers back to normal
state! My system has hvr-1300 and hvr-4000 and only 1 lnb without diseq.
I am using 2.6.27.7 kernel and I did two test runs.
- First I build the current drivers in http://linuxtv.org/hg/v4l-dvb/
(revision http://linuxtv.org/hg/v4l-dvb/rev/036cad8c8b51)
With this driver version linux failed to boot at all.
- Then I merged your patch by hand on top of this v4l-dvb version
and I got the drivers back to normal version.
With vdr-1.6.0 I was able to tune both the dvb-t channels from hvr-1300
and dvb-s channels from hvr-4000. This vdr 1.6.0 uses old non
S2API/backward compatibility layer of the drivers. I attach your patch
just in case, as I did the merge by hand.
There is still some problem either within the S2API implementation itself
for the HVR-4000 or in the way how VDR-1.7.1, 1.7.2 and 1.7.3
uses S2API because I have not been able to use these newer VDR versions
that use S2API for tuning to S/S2 channels. Technotrend TT S2 3200 users
are however able to use these same VDR versions for tuning to S/S2
channels.
DVB-T channels from hvr-1300 tunes ok with vdr-1.7.3.
I have tested this multiple different versions of D2API drivers both from
the liplianis tree, stock drivers in 2.6.28 kernel and v4l-dvb tree.
Mika
>
> Signed-off-by: Andy Walls <awalls@radix.net>
>
> diff -r a28c39659c25 linux/drivers/media/video/cx88/cx88-dvb.c
> --- a/linux/drivers/media/video/cx88/cx88-dvb.c Sat Jan 10 16:04:45 2009 -0500
> +++ b/linux/drivers/media/video/cx88/cx88-dvb.c Sun Jan 11 19:13:10 2009 -0500
> @@ -621,33 +621,40 @@ static struct stv0288_config tevii_tuner
> .set_ts_params = cx24116_set_ts_param,
> };
>
> +static int cx8802_alloc_frontends(struct cx8802_dev *dev)
> +{
> + struct cx88_core *core = dev->core;
> + struct videobuf_dvb_frontend *fe = NULL;
> + int i;
> +
> + mutex_init(&dev->frontends.lock);
> + INIT_LIST_HEAD(&dev->frontends.felist);
> +
> + if (!core->board.num_frontends)
> + return -ENODEV;
> +
> + printk(KERN_INFO "%s() allocating %d frontend(s)\n", __func__,
> + core->board.num_frontends);
> + for (i = 1; i <= core->board.num_frontends; i++) {
> + fe = videobuf_dvb_alloc_frontend(&dev->frontends, i);
> + if (!fe) {
> + printk(KERN_ERR "%s() failed to alloc\n", __func__);
> + videobuf_dvb_dealloc_frontends(&dev->frontends);
> + return -ENOMEM;
> + }
> + }
> + return 0;
> +}
> +
> static int dvb_register(struct cx8802_dev *dev)
> {
> struct cx88_core *core = dev->core;
> struct videobuf_dvb_frontend *fe0, *fe1 = NULL;
> int mfe_shared = 0; /* bus not shared by default */
> - int i;
>
> if (0 != core->i2c_rc) {
> printk(KERN_ERR "%s/2: no i2c-bus available, cannot attach dvb drivers\n", core->name);
> goto frontend_detach;
> - }
> -
> - if (!core->board.num_frontends)
> - return -EINVAL;
> -
> - mutex_init(&dev->frontends.lock);
> - INIT_LIST_HEAD(&dev->frontends.felist);
> -
> - printk(KERN_INFO "%s() allocating %d frontend(s)\n", __func__,
> - core->board.num_frontends);
> - for (i = 1; i <= core->board.num_frontends; i++) {
> - fe0 = videobuf_dvb_alloc_frontend(&dev->frontends, i);
> - if (!fe0) {
> - printk(KERN_ERR "%s() failed to alloc\n", __func__);
> - videobuf_dvb_dealloc_frontends(&dev->frontends);
> - goto frontend_detach;
> - }
> }
>
> /* Get the first frontend */
> @@ -1253,6 +1260,8 @@ static int cx8802_dvb_probe(struct cx880
> struct cx88_core *core = drv->core;
> struct cx8802_dev *dev = drv->core->dvbdev;
> int err;
> + struct videobuf_dvb_frontend *fe;
> + int i;
>
> dprintk( 1, "%s\n", __func__);
> dprintk( 1, " ->being probed by Card=%d Name=%s, PCI %02x:%02x\n",
> @@ -1268,39 +1277,34 @@ static int cx8802_dvb_probe(struct cx880
> /* If vp3054 isn't enabled, a stub will just return 0 */
> err = vp3054_i2c_probe(dev);
> if (0 != err)
> - goto fail_probe;
> + goto fail_core;
>
> /* dvb stuff */
> printk(KERN_INFO "%s/2: cx2388x based DVB/ATSC card\n", core->name);
> dev->ts_gen_cntrl = 0x0c;
>
> + err = cx8802_alloc_frontends(dev);
> + if (err)
> + goto fail_core;
> +
> err = -ENODEV;
> - if (core->board.num_frontends) {
> - struct videobuf_dvb_frontend *fe;
> - int i;
> -
> - for (i = 1; i <= core->board.num_frontends; i++) {
> - fe = videobuf_dvb_get_frontend(&core->dvbdev->frontends, i);
> - if (fe == NULL) {
> - printk(KERN_ERR "%s() failed to get frontend(%d)\n",
> + for (i = 1; i <= core->board.num_frontends; i++) {
> + fe = videobuf_dvb_get_frontend(&core->dvbdev->frontends, i);
> + if (fe == NULL) {
> + printk(KERN_ERR "%s() failed to get frontend(%d)\n",
> __func__, i);
> - goto fail_probe;
> - }
> - videobuf_queue_sg_init(&fe->dvb.dvbq, &dvb_qops,
> + goto fail_probe;
> + }
> + videobuf_queue_sg_init(&fe->dvb.dvbq, &dvb_qops,
> &dev->pci->dev, &dev->slock,
> V4L2_BUF_TYPE_VIDEO_CAPTURE,
> V4L2_FIELD_TOP,
> sizeof(struct cx88_buffer),
> dev);
> - /* init struct videobuf_dvb */
> - fe->dvb.name = dev->core->name;
> - }
> - } else {
> - /* no frontends allocated */
> - printk(KERN_ERR "%s/2 .num_frontends should be non-zero\n",
> - core->name);
> - goto fail_core;
> + /* init struct videobuf_dvb */
> + fe->dvb.name = dev->core->name;
> }
> +
> err = dvb_register(dev);
> if (err)
> /* frontends/adapter de-allocated in dvb_register */
>
>
>
>
> _______________________________________________
> linux-dvb users mailing list
> For V4L/DVB development, please use instead linux-media@vger.kernel.org
> linux-dvb@linuxtv.org
> http://www.linuxtv.org/cgi-bin/mailman/listinfo/linux-dvb
>
[-- Attachment #2: cx88-dvb frontend allocation fix from Andy Walls --]
[-- Type: TEXT/PLAIN, Size: 4160 bytes --]
diff -Naur v4l-dvb/linux/drivers/media/video/cx88/cx88-dvb.c v4l-dvb-patched/linux/drivers/media/video/cx88/cx88-dvb.c
--- v4l-dvb/linux/drivers/media/video/cx88/cx88-dvb.c 2009-01-12 17:55:21.000000000 +0200
+++ v4l-dvb-patched/linux/drivers/media/video/cx88/cx88-dvb.c 2009-01-12 17:55:49.000000000 +0200
@@ -621,35 +621,42 @@
.set_ts_params = cx24116_set_ts_param,
};
+static int cx8802_alloc_frontends(struct cx8802_dev *dev)
+{
+ struct cx88_core *core = dev->core;
+ struct videobuf_dvb_frontend *fe = NULL;
+ int i;
+
+ mutex_init(&dev->frontends.lock);
+ INIT_LIST_HEAD(&dev->frontends.felist);
+
+ if (!core->board.num_frontends)
+ return -ENODEV;
+
+ printk(KERN_INFO "%s() allocating %d frontend(s)\n", __func__,
+ core->board.num_frontends);
+ for (i = 1; i <= core->board.num_frontends; i++) {
+ fe = videobuf_dvb_alloc_frontend(&dev->frontends, i);
+ if (!fe) {
+ printk(KERN_ERR "%s() failed to alloc\n", __func__);
+ videobuf_dvb_dealloc_frontends(&dev->frontends);
+ return -ENOMEM;
+ }
+ }
+ return 0;
+}
+
static int dvb_register(struct cx8802_dev *dev)
{
struct cx88_core *core = dev->core;
struct videobuf_dvb_frontend *fe0, *fe1 = NULL;
int mfe_shared = 0; /* bus not shared by default */
- int i;
if (0 != core->i2c_rc) {
printk(KERN_ERR "%s/2: no i2c-bus available, cannot attach dvb drivers\n", core->name);
goto frontend_detach;
}
- if (!core->board.num_frontends)
- return -EINVAL;
-
- mutex_init(&dev->frontends.lock);
- INIT_LIST_HEAD(&dev->frontends.felist);
-
- printk(KERN_INFO "%s() allocating %d frontend(s)\n", __func__,
- core->board.num_frontends);
- for (i = 1; i <= core->board.num_frontends; i++) {
- fe0 = videobuf_dvb_alloc_frontend(&dev->frontends, i);
- if (!fe0) {
- printk(KERN_ERR "%s() failed to alloc\n", __func__);
- videobuf_dvb_dealloc_frontends(&dev->frontends);
- goto frontend_detach;
- }
- }
-
/* Get the first frontend */
fe0 = videobuf_dvb_get_frontend(&dev->frontends, 1);
if (!fe0)
@@ -1253,6 +1260,8 @@
struct cx88_core *core = drv->core;
struct cx8802_dev *dev = drv->core->dvbdev;
int err;
+ struct videobuf_dvb_frontend *fe;
+ int i;
dprintk( 1, "%s\n", __func__);
dprintk( 1, " ->being probed by Card=%d Name=%s, PCI %02x:%02x\n",
@@ -1268,39 +1277,34 @@
/* If vp3054 isn't enabled, a stub will just return 0 */
err = vp3054_i2c_probe(dev);
if (0 != err)
- goto fail_probe;
+ goto fail_core;
/* dvb stuff */
printk(KERN_INFO "%s/2: cx2388x based DVB/ATSC card\n", core->name);
dev->ts_gen_cntrl = 0x0c;
+ err = cx8802_alloc_frontends(dev);
+ if (err)
+ goto fail_core;
+
err = -ENODEV;
- if (core->board.num_frontends) {
- struct videobuf_dvb_frontend *fe;
- int i;
-
- for (i = 1; i <= core->board.num_frontends; i++) {
- fe = videobuf_dvb_get_frontend(&core->dvbdev->frontends, i);
- if (fe == NULL) {
- printk(KERN_ERR "%s() failed to get frontend(%d)\n",
+ for (i = 1; i <= core->board.num_frontends; i++) {
+ fe = videobuf_dvb_get_frontend(&core->dvbdev->frontends, i);
+ if (fe == NULL) {
+ printk(KERN_ERR "%s() failed to get frontend(%d)\n",
__func__, i);
- goto fail_probe;
- }
- videobuf_queue_sg_init(&fe->dvb.dvbq, &dvb_qops,
+ goto fail_probe;
+ }
+ videobuf_queue_sg_init(&fe->dvb.dvbq, &dvb_qops,
&dev->pci->dev, &dev->slock,
V4L2_BUF_TYPE_VIDEO_CAPTURE,
V4L2_FIELD_TOP,
sizeof(struct cx88_buffer),
dev);
- /* init struct videobuf_dvb */
- fe->dvb.name = dev->core->name;
- }
- } else {
- /* no frontends allocated */
- printk(KERN_ERR "%s/2 .num_frontends should be non-zero\n",
- core->name);
- goto fail_core;
+ /* init struct videobuf_dvb */
+ fe->dvb.name = dev->core->name;
}
+
err = dvb_register(dev);
if (err)
/* frontends/adapter de-allocated in dvb_register */
^ permalink raw reply [flat|nested] 4+ messages in thread* Re: [linux-dvb] [PATCH] cx88-dvb: Fix order of frontend allocations (Re: current v4l-dvb - cannot access /dev/dvb/: No such file or directory)
[not found] ` <1231719484.10277.4.camel@palomino.walls.org>
2009-01-12 10:40 ` [linux-dvb] [PATCH] cx88-dvb: Fix order of frontend allocations (Re: current v4l-dvb - cannot access /dev/dvb/: No such file or directory) Pierre Gronlier
2009-01-12 16:18 ` Mika Laitio
@ 2009-01-12 19:12 ` John Donoghue
2 siblings, 0 replies; 4+ messages in thread
From: John Donoghue @ 2009-01-12 19:12 UTC (permalink / raw)
To: linux-dvb
On Sun, 2009-01-11 at 19:18 -0500, Andy Walls wrote:
>
>
> I don't have the hardware to test with. Please try this patch.
>
> Regards,
> Andy
>
>
> Signed-off-by: Andy Walls <awalls@radix.net>
>
> diff -r a28c39659c25 linux/drivers/media/video/cx88/cx88-dvb.c
> --- a/linux/drivers/media/video/cx88/cx88-dvb.c Sat Jan 10 16:04:45 2009 -0500
> +++ b/linux/drivers/media/video/cx88/cx88-dvb.c Sun Jan 11 19:13:10 2009 -0500
> @@ -621,33 +621,40 @@ static struct stv0288_config tevii_tuner
> .set_ts_params = cx24116_set_ts_param,
> };
>
> +static int cx8802_alloc_frontends(struct cx8802_dev *dev)
> +{
> + struct cx88_core *core = dev->core;
> + struct videobuf_dvb_frontend *fe = NULL;
> + int i;
> +
> + mutex_init(&dev->frontends.lock);
> + INIT_LIST_HEAD(&dev->frontends.felist);
> +
> + if (!core->board.num_frontends)
> + return -ENODEV;
> +
> + printk(KERN_INFO "%s() allocating %d frontend(s)\n", __func__,
> + core->board.num_frontends);
> + for (i = 1; i <= core->board.num_frontends; i++) {
> + fe = videobuf_dvb_alloc_frontend(&dev->frontends, i);
> + if (!fe) {
> + printk(KERN_ERR "%s() failed to alloc\n", __func__);
> + videobuf_dvb_dealloc_frontends(&dev->frontends);
> + return -ENOMEM;
> + }
> + }
> + return 0;
> +}
> +
> static int dvb_register(struct cx8802_dev *dev)
> {
> struct cx88_core *core = dev->core;
> struct videobuf_dvb_frontend *fe0, *fe1 = NULL;
> int mfe_shared = 0; /* bus not shared by default */
> - int i;
>
> if (0 != core->i2c_rc) {
> printk(KERN_ERR "%s/2: no i2c-bus available, cannot attach dvb drivers\n", core->name);
> goto frontend_detach;
> - }
> -
> - if (!core->board.num_frontends)
> - return -EINVAL;
> -
> - mutex_init(&dev->frontends.lock);
> - INIT_LIST_HEAD(&dev->frontends.felist);
> -
> - printk(KERN_INFO "%s() allocating %d frontend(s)\n", __func__,
> - core->board.num_frontends);
> - for (i = 1; i <= core->board.num_frontends; i++) {
> - fe0 = videobuf_dvb_alloc_frontend(&dev->frontends, i);
> - if (!fe0) {
> - printk(KERN_ERR "%s() failed to alloc\n", __func__);
> - videobuf_dvb_dealloc_frontends(&dev->frontends);
> - goto frontend_detach;
> - }
> }
>
> /* Get the first frontend */
> @@ -1253,6 +1260,8 @@ static int cx8802_dvb_probe(struct cx880
> struct cx88_core *core = drv->core;
> struct cx8802_dev *dev = drv->core->dvbdev;
> int err;
> + struct videobuf_dvb_frontend *fe;
> + int i;
>
> dprintk( 1, "%s\n", __func__);
> dprintk( 1, " ->being probed by Card=%d Name=%s, PCI %02x:%02x\n",
> @@ -1268,39 +1277,34 @@ static int cx8802_dvb_probe(struct cx880
> /* If vp3054 isn't enabled, a stub will just return 0 */
> err = vp3054_i2c_probe(dev);
> if (0 != err)
> - goto fail_probe;
> + goto fail_core;
>
> /* dvb stuff */
> printk(KERN_INFO "%s/2: cx2388x based DVB/ATSC card\n", core->name);
> dev->ts_gen_cntrl = 0x0c;
>
> + err = cx8802_alloc_frontends(dev);
> + if (err)
> + goto fail_core;
> +
> err = -ENODEV;
> - if (core->board.num_frontends) {
> - struct videobuf_dvb_frontend *fe;
> - int i;
> -
> - for (i = 1; i <= core->board.num_frontends; i++) {
> - fe = videobuf_dvb_get_frontend(&core->dvbdev->frontends, i);
> - if (fe == NULL) {
> - printk(KERN_ERR "%s() failed to get frontend(%d)\n",
> + for (i = 1; i <= core->board.num_frontends; i++) {
> + fe = videobuf_dvb_get_frontend(&core->dvbdev->frontends, i);
> + if (fe == NULL) {
> + printk(KERN_ERR "%s() failed to get frontend(%d)\n",
> __func__, i);
> - goto fail_probe;
> - }
> - videobuf_queue_sg_init(&fe->dvb.dvbq, &dvb_qops,
> + goto fail_probe;
> + }
> + videobuf_queue_sg_init(&fe->dvb.dvbq, &dvb_qops,
> &dev->pci->dev, &dev->slock,
> V4L2_BUF_TYPE_VIDEO_CAPTURE,
> V4L2_FIELD_TOP,
> sizeof(struct cx88_buffer),
> dev);
> - /* init struct videobuf_dvb */
> - fe->dvb.name = dev->core->name;
> - }
> - } else {
> - /* no frontends allocated */
> - printk(KERN_ERR "%s/2 .num_frontends should be non-zero\n",
> - core->name);
> - goto fail_core;
> + /* init struct videobuf_dvb */
> + fe->dvb.name = dev->core->name;
> }
> +
> err = dvb_register(dev);
> if (err)
> /* frontends/adapter de-allocated in dvb_register */
>
>
>
>
> _______________________________________________
> linux-dvb users mailing list
> For V4L/DVB development, please use instead linux-media@vger.kernel.org
> linux-dvb@linuxtv.org
> http://www.linuxtv.org/cgi-bin/mailman/listinfo/linux-dvb
>
Andy,
Many thanks for the patch, which works for me on a Hauppauge
WinTV-Nova-S-Plus with both 2.6.27-7 and 2.6.27-9. I had been getting
the oops with 2.6.27-9 only.
Your earlier message mentioned dvb_init() being called twice and running
concurrently. I don't believe this is happening. It appears twice on
the kernel call trace, because it has called both printk and
cx8802_register_driver, and neither of these calls has yet completed.
Regards,
John
_______________________________________________
linux-dvb users mailing list
For V4L/DVB development, please use instead linux-media@vger.kernel.org
linux-dvb@linuxtv.org
http://www.linuxtv.org/cgi-bin/mailman/listinfo/linux-dvb
^ permalink raw reply [flat|nested] 4+ messages in thread