forked from luck/tmp_suning_uos_patched
70a6cf749d
[ Upstream commit b062a0b9c1dc1ff63094337dccfe1568d5b62023 ]
Fix the following kernel oops in btmtksdio_interrrupt
[ 14.339134] btmtksdio_interrupt+0x28/0x54
[ 14.339139] process_sdio_pending_irqs+0x68/0x1a0
[ 14.339144] sdio_irq_work+0x40/0x70
[ 14.339154] process_one_work+0x184/0x39c
[ 14.339160] worker_thread+0x228/0x3e8
[ 14.339168] kthread+0x148/0x3ac
[ 14.339176] ret_from_fork+0x10/0x30
That happened because hdev->power_on is already called before
sdio_set_drvdata which btmtksdio_interrupt handler relies on is not
properly set up.
The details are shown as the below: hci_register_dev would run
queue_work(hdev->req_workqueue, &hdev->power_on) as WQ_HIGHPRI
workqueue_struct to complete the power-on sequeunce and thus hci_power_on
may run before sdio_set_drvdata is done in btmtksdio_probe.
The hci_dev_do_open in hci_power_on would initialize the device and enable
the interrupt and thus it is possible that btmtksdio_interrupt is being
called right before sdio_set_drvdata is filled out.
When btmtksdio_interrupt is being called and sdio_set_drvdata is not filled
, the kernel oops is going to happen because btmtksdio_interrupt access an
uninitialized pointer.
Fixes:
|
||
---|---|---|
.. | ||
ath3k.c | ||
bcm203x.c | ||
bfusb.c | ||
bluecard_cs.c | ||
bpa10x.c | ||
bt3c_cs.c | ||
btbcm.c | ||
btbcm.h | ||
btintel.c | ||
btintel.h | ||
btmrvl_debugfs.c | ||
btmrvl_drv.h | ||
btmrvl_main.c | ||
btmrvl_sdio.c | ||
btmrvl_sdio.h | ||
btmtksdio.c | ||
btmtkuart.c | ||
btqca.c | ||
btqca.h | ||
btqcomsmd.c | ||
btrsi.c | ||
btrtl.c | ||
btrtl.h | ||
btsdio.c | ||
btusb.c | ||
dtl1_cs.c | ||
h4_recv.h | ||
hci_ag6xx.c | ||
hci_ath.c | ||
hci_bcm.c | ||
hci_bcsp.c | ||
hci_h4.c | ||
hci_h5.c | ||
hci_intel.c | ||
hci_ldisc.c | ||
hci_ll.c | ||
hci_mrvl.c | ||
hci_nokia.c | ||
hci_qca.c | ||
hci_serdev.c | ||
hci_uart.h | ||
hci_vhci.c | ||
Kconfig | ||
Makefile |