cx88-dvb: Fix Oops in case i2c bus failed to register
A message that is not in the archive (sent off-list or not yet received): [email protected]
In message <[email protected]>, Matthias Schwarzott wrote:
Hiya.
Quoted 13 lines
Hi!
@Mauro: Please pull this patch
There already is an report at kernel bugzilla about this issue:
http://bugzilla.kernel.org/show_bug.cgi?id=9455When enabling extra checks for the i2c-bus of cx88 based cards by loading
i2c_algo_bitwith bit_test=1 this may trigger an oops when loadingcx88_dvb.This is caused by the extra check code that detects that the sda-line is stuck high and thus does not register the i2c-bus.
Quoted 6 lines
cx88-dvb however does not check if the i2c-bus is valid and just uses
core->i2c_adapto attach dvb frontend modules. This leads to an oops at the first call toi2c_transfer:# modprobe i2c_algo_bit bit_test=1 # modprobe cx8802
Thanks for this information. If you don't mind, would you let me utilise this fix in another way?
I have been auditing MFE additions and I need to change something elsewhere and can see an alternative to to bailing out in dvb_register?
Thanks
Quoted 124 lines
cx88/2: cx2388x MPEG-TS Driver Manager version 0.0.6 loaded cx88[0]: quirk:
PCIPCI_NATOMA-- set TBFX
cx88[0]: subsystem: 0070:9202, board: Hauppauge Nova-S-Plus DVB-S [card=37,autodetected], frontend(s): 1
cx88[0]: TV tuner type 4, Radio tuner type -1
cx88[0]: SDA stuck high!
cx88[0]: i2c register FAILED
input: cx88 IR (Hauppauge Nova-S-Plus as /class/input/input5 cx88[0]/2: cx2388x 8802 Driver Manager
cx88-mpeg driver manager 0000:00:10.2: enabling device (0154 -> 0156) cx88-mpeg driver manager 0000:00:10.2: PCI INT A -> Link[LNKD] -> GSI 9 (level, low) -> IRQ 9
cx88[0]/2: found at 0000:00:10.2, rev: 5, irq: 9, latency: 64, mmio:0xfb000000cx8802_probe()allocating 1 frontend(s)
cx88/2: cx2388x dvb driver version 0.0.6 loaded
cx88/2: registering cx8802 driver, type: dvb access: shared cx88[0]/2: subsystem: 0070:9202, board: Hauppauge Nova-S-Plus DVB-S [card=37] cx88[0]/2: cx2388x based DVB/ATSC cardBUG: unable to handle kernel NULL pointer dereference at 00000000 IP: [<e084d4ef>] :i2c_core:i2c_transfer+0x1f/0x80 *pde = 00000000 Modules linked in: cx88_dvb(+) cx8802 cx88xx ir_common i2c_algo_bit tveeprom
videobuf_dvbbtcx_risc
mga drm ipv6 fscpos eeprom nfsd exportfs stv0299b2c2_flexcop_pcib2c2_flexcopcx24123 s5h1420 ves1x93dvb_ttpcidvb_coresaa7146_vvsaa7146videobuf_dma_sgvideobuf_corevideodevv4l1_compatttpci_eepromlirc_seriallirc_devusbhid rtcuhci_hcd8139tooi2c_piix4i2c_coreusbcore evdev
Pid: 4249, comm: modprobe Not tainted (2.6.27-gentoo #3)
EIP: 0060:[<e084d4ef>] EFLAGS: 00010296 CPU: 0
EIP is ati2c_transfer+0x1f/0x80[i2c_core]
EAX: 00000000 EBX:ffffffa1ECX: 00000002 EDX:d6c71e3c
ESI:d80cd050EDI:d8093c00EBP:d6c71e20ESP:d6c71e0c
DS: 007b ES: 007b FS: 0000 GS: 0033 SS: 0068---[ end trace b32d87d0f0db1832 ]---I added a check for i2c registration success before attaching frontends.
Signed-off-by Matthias Schwarzott <[email protected]>--Boundary-00=_seaAJIF74ESp9Id
Content-Type: text/x-diff;
charset="iso 8859-15";
name="cx88-dvb-oops-i2c.diff"
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment;filename="cx88-dvb-oops-i2c.diff"cx88-dvb: Fix Oops in case i2c bus failed to register
When enabling extra checks for the i2c-bus of cx88 based cards by loading
i2c_algo_bitwith bit_test=1 this may trigger an oops when loadingcx88_dvb.This is caused by the extra check code that detects that the sda-line is stuck high and thus does not register the i2c-bus.
cx88-dvb however does not check if the i2c-bus is valid and just uses
core->i2c_adapto attach dvb frontend modules. This leads to an oops at the first call toi2c_transfer:# modprobe i2c_algo_bit bit_test=1 # modprobe cx8802cx88/2: cx2388x MPEG-TS Driver Manager version 0.0.6 loaded
cx88[0]: quirk:PCIPCI_NATOMA-- set TBFX
cx88[0]: subsystem: 0070:9202, board: Hauppauge Nova-S-Plus DVB-S [card=37,autodetected], frontend(s): 1 cx88[0]: TV tuner type 4, Radio tuner type -1
cx88[0]: SDA stuck high!
cx88[0]: i2c register FAILED
input: cx88 IR (Hauppauge Nova-S-Plus as /class/input/input5
cx88[0]/2: cx2388x 8802 Driver Manager
cx88-mpeg driver manager 0000:00:10.2: enabling device (0154 -> 0156)
cx88-mpeg driver manager 0000:00:10.2: PCI INT A -> Link[LNKD] -> GSI 9 (level, low) -> IRQ 9 cx88[0]/2: found at 0000:00:10.2, rev: 5, irq: 9, latency: 64, mmio:0xfb000000cx8802_probe()allocating 1 frontend(s)
cx88/2: cx2388x dvb driver version 0.0.6 loaded
cx88/2: registering cx8802 driver, type: dvb access: shared
cx88[0]/2: subsystem: 0070:9202, board: Hauppauge Nova-S-Plus DVB-S [card=37] cx88[0]/2: cx2388x based DVB/ATSC cardBUG: unable to handle kernel NULL pointer dereference at 00000000 IP: [<e084d4ef>] :i2c_core:i2c_transfer+0x1f/0x80 *pde = 00000000 Modules linked in: cx88_dvb(+) cx8802 cx88xx ir_common i2c_algo_bit tveeprom videobuf_dvb btcx_riscmga drm ipv6 fscpos eeprom nfsd exportfs stv0299
b2c2_flexcop_pcib2c2_flexcopcx24123 s5h1420 ves1x93dvb_ttpcidvb_coresaa7146_vvsaa7146videobuf_dma_sgvideobuf_corevideodevv4l1_compatttpci_eepromlirc_seriallirc_devusbhid rtcuhci_hcd8139tooi2c_piix4i2c_coreusbcore evdev
Pid: 4249, comm: modprobe Not tainted (2.6.27-gentoo #3)
EIP: 0060:[<e084d4ef>] EFLAGS: 00010296 CPU: 0
EIP is ati2c_transfer+0x1f/0x80[i2c_core]
EAX: 00000000 EBX:ffffffa1ECX: 00000002 EDX:d6c71e3c
ESI:d80cd050EDI:d8093c00EBP:d6c71e20ESP:d6c71e0c
DS: 007b ES: 007b FS: 0000 GS: 0033 SS: 0068---[ end trace b32d87d0f0db1832 ]---I added a check for i2c registration success before attaching frontends.
Signed-off-by Matthias Schwarzott <[email protected]>Index:
v4l-dvb/linux/drivers/media/video/cx88/cx88-dvb.c
===================================================================linux/drivers/media/video/cx88/cx88-dvb.c +5
-1@@ -605,6 +605,11 @@ static int dvb_register(struct cx8802_destruct videobuf_dvb_frontend *fe0, *fe1 =NULL ;int mfe_shared =0 ;/* bus not shared by default */ +if (0 != core->i2c_rc) { +printk (KERN_ERR "%s/2: no i2c-bus available, cannot attach dvb drivers\n" , core->name); + goto frontend_detach; + } +/* Get the first frontend */ fe0 =videobuf_dvb_get_frontend (&dev->frontends,1 );if (!fe0) --Boundary-00=_seaAJIF74ESp9IdContent-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline
Quoted 7 lines
_______________________________________________
linux-dvb mailing list
[email protected]
http://www.linuxtv.org/cgi-bin/mailman/listinfo/linux-dvb
--Boundary-00=_seaAJIF74ESp9Id--
--
// /
{:)==={ Darron Broad <[email protected]>
\\ \
_______________________________________________
linux-dvb mailing list
[email protected]
http://www.linuxtv.org/cgi-bin/mailman/listinfo/linux-dvb