kernel BUG at drivers/net/wireless/libertas/if_sdio.c:229

Dan Williams dcbw at redhat.com
Tue Oct 5 16:06:55 EDT 2010


On Tue, 2010-10-05 at 13:54 +0200, Sven Neumann wrote:
> Hi,
> 
> we are running an embedded system here based on the PXA300 platform
> using a Marvell WLAN adapter accessed via SDIO. We are using Linux
> 2.6.34.7 for a while now and things have worked smoothly. Now I've tried
> changed the kernel configuration from CONFIG_PREEMPT_NONE to
> CONFIG_PREEMPT and since this change we are hitting this bug quite
> frequently:
> 
> [  209.294552] kernel BUG at drivers/net/wireless/libertas/if_sdio.c:229!
> [  209.301073] Unable to handle kernel NULL pointer dereference at virtual address 00000000
> [  209.309111] pgd = c0004000
> [  209.311793] [00000000] *pgd=00000000
> [  209.315339] Internal error: Oops: 817 [#1] PREEMPT
> [  209.320091] last sysfs file: /sys/devices/platform/spi_gpio.0/spi0.2/value
> [  209.326914] Modules linked in: eeti_ts libertas_sdio libertas pxamci ds2760_battery w1_ds2760 wire
> [  209.335820] CPU: 0    Not tainted  (2.6.34.7 #1)
> [  209.340410] PC is at __bug+0x1c/0x28
> [  209.343956] LR is at __bug+0x18/0x28
> [  209.347510] pc : [<c0048f6c>]    lr : [<c0048f68>]    psr: 60000093
> [  209.347520] sp : c77fdf60  ip : 00004759  fp : c77fc000
> [  209.358912] r10: c7ff6800  r9 : 7fffffff  r8 : c77fdf70
> [  209.364100] r7 : 80000013  r6 : c76a4200  r5 : c7720000  r4 : 00000001
> [  209.370577] r3 : 00000000  r2 : 00000001  r1 : 60000093  r0 : 00000050
> [  209.377059] Flags: nZCv  IRQs off  FIQs on  Mode SVC_32  ISA ARM  Segment kernel
> [  209.384407] Control: 0000397f  Table: a6810018  DAC: 00000035
> [  209.390109] Process ksdioirqd/mmc0 (pid: 1084, stack limit = 0xc77fc278)
> [  209.396761] Stack: (0xc77fdf60 to 0xc77fe000)
> [  209.401095] df60: c77fdf70 bf041104 00100100 00000000 00000000 00000000 00000000 00000001
> [  209.409227] df80: c7ff6600 00000000 c7ff6800 c0275828 00000000 c77fdfa7 c7ff6784 00000001
> [  209.417360] dfa0: 00000001 027fdfd4 c741ddfc c77fdfd4 c741ddfc c7ff6600 c0275734 00000000
> [  209.425492] dfc0: 00000000 00000000 00000000 c006ff08 00000000 00000000 c77fdfd8 c77fdfd8
> [  209.433615] dfe0: 00000000 00000000 00000000 00000000 00000000 c0046a08 00000000 00000000
> [  209.441772] [<c0048f6c>] (__bug+0x1c/0x28) from [<bf041104>] (if_sdio_interrupt+0x224/0x3b8 [libertas_sdio])
> [  209.451575] [<bf041104>] (if_sdio_interrupt+0x224/0x3b8 [libertas_sdio]) from [<c0275828>] (sdio_irq_thread+0xf4/0x218)
> [  209.462312] [<c0275828>] (sdio_irq_thread+0xf4/0x218) from [<c006ff08>] (kthread+0x78/0x80)
> [  209.470640] [<c006ff08>] (kthread+0x78/0x80) from [<c0046a08>] (kernel_thread_exit+0x0/0x8)
> [  209.478943] Code: e1a01000 e59f000c eb0d38b5 e3a03000 (e5833000) 
> [  209.485163] ---[ end trace 7a8a5d2e4fa6d6fa ]---
> [  209.489765] note: ksdioirqd/mmc0[1084] exited with preempt_count 1
> 
> 
> Is this a known problem? Has anyone else tried using libertas-sdio with
> a preemptible kernel?

Not that I know of.  Can you put some printks into the driver in
if_sdio.c around the memcpy() here?

	priv->resp_len[i] = size;
+       printk(KERN_INFO "%s: priv %p, buffer %p\n", __func__, priv, buffer);
	memcpy(priv->resp_buf[i], buffer, size);

just to see which part of that is NULL.

Dan




More information about the libertas-dev mailing list