linux/drivers/staging
Gianluca Gennari f8f7be019a [media] as102: map URB DMA addresses in the driver
On a set-top-box based on the Broadcom 7405 SoC (MIPS), the Abilis as102 driver
causes a kernel oops while trying to map the URB stream buffers DMA addresses:

CPU 0 Unable to handle kernel paging request at virtual address 007b9900,
epc == 80010cc4, ra == 8039d108

Call Trace:
[<80010cc4>] mips_dma_map_page+0x14/0x108
[<8039d108>] usb_hcd_map_urb_for_dma+0x338/0x4a8
[<8039d540>] usb_hcd_submit_urb+0x2c8/0x8cc
[<e13655d8>] as102_submit_urb_stream+0x64/0xc8 [dvb_as102]
[<e1365680>] as102_usb_start_stream+0x44/0x80 [dvb_as102]
[<e1363628>] as102_dvb_dmx_start_feed+0xb4/0x17c [dvb_as102]
[<803e20f4>] dmx_ts_feed_start_filtering+0x5c/0x134
[<803de454>] dvb_dmxdev_start_feed+0xd4/0x158
[<803dff28>] dvb_dmxdev_filter_start+0x2b8/0x448
[<803e07ac>] dvb_demux_do_ioctl+0x2a0/0x654
[<803ddc8c>] dvb_usercopy+0x124/0x204
[<800d5284>] do_vfs_ioctl+0xa0/0x6c0
[<800d58e8>] sys_ioctl+0x44/0xa8
[<8000ecfc>] stack_done+0x20/0x40

On other boxes based on older SoCs (7401) this doesn't happen, so it looks like
a bug in the kernel specific to MIPS SMP. This issue has been reproduced on
several kernel versions from 2.6.18 to 3.1.0.

Since the base DMA address and the offsets are known, it is possible to map
the DMA addresses of the URB buffers directly in the driver. This workaround
fixes the problem and has been tested on both MIPS and x86 CPUs with success.

By the way, with this fix the driver works perfectly fine on the set-top-box:
both UHF and VHF frequencies are tuned without problems, and zapping is quite
fast. SNR and signal strength reports seems to work fine, too.

The only remaining problem (on both the PC and the set-top-box) is that after
a soft reboot the device is not recognized again by the kernel. It requires
a power cycle (or a manual unplug/replug) to be recognized again. So probably
the device state is not reset properly at shut-down.

Signed-off-by: Gianluca Gennari <gennarone@gmail.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
2012-03-08 09:00:00 -03:00
..
android Staging: android: fixed 80 characters warnings in lowmemorykiller.c 2011-12-22 13:33:57 -08:00
asus_oled Staging: asus_oled: Fixed use of obsolete function. 2011-11-26 18:13:54 -08:00
bcm Merge branch 'staging-next' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/staging 2012-01-09 12:18:17 -08:00
comedi module_param: make bool parameters really bool (drivers & misc) 2012-01-13 09:32:20 +10:30
cptm1217
crystalhd staging: crystalhd: bc_dts_defs.h: Fix up coding style 2011-12-16 10:54:15 -08:00
cxt1e1 Merge branch 'staging-next' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/staging 2012-01-09 12:18:17 -08:00
echo
et131x staging: et131x: Revert changes from previous commit 2011-12-08 15:03:11 -08:00
frontier Merge branch 'staging-next' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/staging 2012-01-09 12:18:17 -08:00
ft1000 Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jikos/trivial 2012-01-08 13:21:22 -08:00
gma500 Merge branch 'drm-core-next' of git://people.freedesktop.org/~airlied/linux 2012-01-10 11:04:36 -08:00
hv Staging: hv: storvsc: Fix a bug in create_bounce_buffer() 2011-12-08 14:59:47 -08:00
iio Merge branch 'staging-next' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/staging 2012-01-09 12:18:17 -08:00
keucr Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jikos/trivial 2012-01-08 13:21:22 -08:00
line6 staging: line6: fixed ALSA/PCM interaction 2011-12-09 19:26:09 -08:00
media [media] as102: map URB DMA addresses in the driver 2012-03-08 09:00:00 -03:00
mei staging/mei: add watchdog device registration wrappers 2011-12-22 13:46:16 -08:00
nvec staging: nvec: add device tree support 2011-11-26 17:17:14 -08:00
octeon MIPS: Octeon: Move some Ethernet support files out of staging. 2011-12-07 22:03:28 +00:00
olpc_dcon Staging: olpc_dcon.c: obsolete use of strict_stroul 2011-12-08 15:01:49 -08:00
omapdrm drm/omap: GEM, deal with cache 2011-12-22 13:46:15 -08:00
panel
phison staging/phison: Convert pci_table entries to PCI_DEVICE (if PCI_ANY_ID is used) 2011-11-28 04:24:32 +09:00
pohmelfs vfs: switch ->show_options() to struct dentry * 2012-01-06 23:19:54 -05:00
quatech_usb2 module_param: make bool parameters really bool (drivers & misc) 2012-01-13 09:32:20 +10:30
quickstart
rtl8187se Merge branch 'staging-next' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/staging 2011-10-26 15:39:02 +02:00
rtl8192e staging/rtl8192e: Register against lib80211 2011-12-22 13:48:59 -08:00
rtl8192u Staging: rtl8192u: remove api.c file 2011-11-26 16:25:54 -08:00
rtl8712 Merge branch 'staging-next' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/staging 2012-01-09 12:18:17 -08:00
rts5139 Merge branch 'staging-next' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/staging 2012-01-09 12:18:17 -08:00
rts_pstor Merge branch 'master' into pm-sleep 2011-12-21 21:59:45 +01:00
sbe-2t3e3
sep Merge branch 'staging-next' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/staging 2012-01-09 12:18:17 -08:00
serial m68k/serial: Remove obsolete IRQ_FLG_* users 2011-11-26 16:22:27 -08:00
serqt_usb2 module_param: make bool parameters really bool (drivers & misc) 2012-01-13 09:32:20 +10:30
slicoss staging: slicoss depends on NET 2011-11-18 15:00:48 -08:00
sm7xx staging/sm7xx: Convert pci_table entries to PCI_DEVICE (if PCI_ANY_ID is used) 2011-11-28 04:24:32 +09:00
speakup module_param: make bool parameters really bool (drivers & misc) 2012-01-13 09:32:20 +10:30
ste_rmi4
tidspbridge Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jikos/trivial 2012-01-08 13:21:22 -08:00
usbip staging: usbip: removed unused definitions from header 2011-12-22 13:40:03 -08:00
vme module_param: make bool parameters really bool (drivers & misc) 2012-01-13 09:32:20 +10:30
vt6655 staging: vt6655: integer overflows in private_ioctl() 2011-11-30 19:29:40 +09:00
vt6656 Merge branch 'staging-next' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/staging 2012-01-09 12:18:17 -08:00
winbond USB: convert drivers/staging/* to use module_usb_driver() 2011-11-18 09:42:11 -08:00
wlags49_h2 Merge branch 'staging-next' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/staging 2012-01-09 12:18:17 -08:00
wlags49_h25 Staging: wlags49_h25: Makefile: remove unneeded stuff 2011-10-18 13:36:04 -07:00
wlan-ng USB: convert drivers/staging/* to use module_usb_driver() 2011-11-18 09:42:11 -08:00
xgifb staging: xgifb: enable forcecrt2type as a module parameter 2011-12-08 12:26:09 -08:00
zcache Staging: zcache: Fix calls to obsolete function 2011-11-26 18:13:55 -08:00
zram Staging: zram: Add a missing GFP_KERNEL specifier in zram_init_device() 2011-12-08 14:59:48 -08:00
Kconfig Staging: lttng: remove from the drivers/staging/ tree 2011-12-08 15:25:56 -08:00
Makefile Staging: lttng: remove from the drivers/staging/ tree 2011-12-08 15:25:56 -08:00
staging.c