linux-hardened/drivers/net/wireless/ti/wlcore
Uri Mashiach 9b2761cb72 wlcore/wl12xx: spi: fix oops on firmware load
The maximum chunks used by the function is
(SPI_AGGR_BUFFER_SIZE / WSPI_MAX_CHUNK_SIZE + 1).
The original commands array had space for
(SPI_AGGR_BUFFER_SIZE / WSPI_MAX_CHUNK_SIZE) commands.
When the last chunk is used (len > 4 * WSPI_MAX_CHUNK_SIZE), the last
command is stored outside the bounds of the commands array.

Oops 5 (page fault) is generated during current wl1271 firmware load
attempt:

root@debian-armhf:~# ifconfig wlan0 up
[  294.312399] Unable to handle kernel paging request at virtual address
00203fc4
[  294.320173] pgd = de528000
[  294.323028] [00203fc4] *pgd=00000000
[  294.326916] Internal error: Oops: 5 [#1] SMP ARM
[  294.331789] Modules linked in: bnep rfcomm bluetooth ipv6 arc4 wl12xx
wlcore mac80211 musb_dsps cfg80211 musb_hdrc usbcore usb_common
wlcore_spi omap_rng rng_core musb_am335x omap_wdt cpufreq_dt thermal_sys
hwmon
[  294.351838] CPU: 0 PID: 1827 Comm: ifconfig Not tainted
4.2.0-00002-g3e9ad27-dirty #78
[  294.360154] Hardware name: Generic AM33XX (Flattened Device Tree)
[  294.366557] task: dc9d6d40 ti: de550000 task.ti: de550000
[  294.372236] PC is at __spi_validate+0xa8/0x2ac
[  294.376902] LR is at __spi_sync+0x78/0x210
[  294.381200] pc : [<c049c760>]    lr : [<c049ebe0>]    psr: 60000013
[  294.381200] sp : de551998  ip : de5519d8  fp : 00200000
[  294.393242] r10: de551c8c  r9 : de5519d8  r8 : de3a9000
[  294.398730] r7 : de3a9258  r6 : de3a9400  r5 : de551a48  r4 :
00203fbc
[  294.405577] r3 : 00000000  r2 : 00000000  r1 : 00000000  r0 :
de3a9000
[  294.412420] Flags: nZCv  IRQs on  FIQs on  Mode SVC_32  ISA ARM
Segment user
[  294.419918] Control: 10c5387d  Table: 9e528019  DAC: 00000015
[  294.425954] Process ifconfig (pid: 1827, stack limit = 0xde550218)
[  294.432437] Stack: (0xde551998 to 0xde552000)

...

[  294.883613] [<c049c760>] (__spi_validate) from [<c049ebe0>]
(__spi_sync+0x78/0x210)
[  294.891670] [<c049ebe0>] (__spi_sync) from [<bf036598>]
(wl12xx_spi_raw_write+0xfc/0x148 [wlcore_spi])
[  294.901661] [<bf036598>] (wl12xx_spi_raw_write [wlcore_spi]) from
[<bf21c694>] (wlcore_boot_upload_firmware+0x1ec/0x458 [wlcore])
[  294.914038] [<bf21c694>] (wlcore_boot_upload_firmware [wlcore]) from
[<bf24532c>] (wl12xx_boot+0xc10/0xfac [wl12xx])
[  294.925161] [<bf24532c>] (wl12xx_boot [wl12xx]) from [<bf20d5cc>]
(wl1271_op_add_interface+0x5b0/0x910 [wlcore])
[  294.936364] [<bf20d5cc>] (wl1271_op_add_interface [wlcore]) from
[<bf15c4ac>] (ieee80211_do_open+0x44c/0xf7c [mac80211])
[  294.947963] [<bf15c4ac>] (ieee80211_do_open [mac80211]) from
[<c0537978>] (__dev_open+0xa8/0x110)
[  294.957307] [<c0537978>] (__dev_open) from [<c0537bf8>]
(__dev_change_flags+0x88/0x148)
[  294.965713] [<c0537bf8>] (__dev_change_flags) from [<c0537cd0>]
(dev_change_flags+0x18/0x48)
[  294.974576] [<c0537cd0>] (dev_change_flags) from [<c05a55a0>]
(devinet_ioctl+0x6b4/0x7d0)
[  294.983191] [<c05a55a0>] (devinet_ioctl) from [<c0517040>]
(sock_ioctl+0x1e4/0x2bc)
[  294.991244] [<c0517040>] (sock_ioctl) from [<c017d378>]
(do_vfs_ioctl+0x420/0x6b0)
[  294.999208] [<c017d378>] (do_vfs_ioctl) from [<c017d674>]
(SyS_ioctl+0x6c/0x7c)
[  295.006880] [<c017d674>] (SyS_ioctl) from [<c000f4c0>]
(ret_fast_syscall+0x0/0x54)
[  295.014835] Code: e1550004 e2444034 0a00007d e5953018 (e5942008)
[  295.021544] ---[ end trace 66ed188198f4e24e ]---

Signed-off-by: Uri Mashiach <uri.mashiach@compulab.co.il>
Acked-by: Igor Grinberg <grinberg@compulab.co.il>
Cc: stable@vger.kernel.org
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
2015-12-11 13:54:23 +02:00
..
acx.c wlcore: split wl12xx/wl18xx sg parameters 2015-12-11 13:10:59 +02:00
acx.h wlcore: split wl12xx/wl18xx sg parameters 2015-12-11 13:10:59 +02:00
boot.c wlcore: remove wl12xx_platform_data 2015-03-24 09:48:14 -07:00
boot.h
cmd.c wlcore: add p2p device support 2015-08-10 22:16:34 +03:00
cmd.h wlcore: add generic_cfg_feature command definitions 2015-08-10 22:16:25 +03:00
conf.h wlcore: split wl12xx/wl18xx sg parameters 2015-12-11 13:10:59 +02:00
debug.h drivers/net: Convert remaining uses of pr_warning to pr_warn 2014-09-09 20:37:08 -07:00
debugfs.c wlcore: set irq_trigger in board files instead of hiding behind a quirk 2015-03-19 14:20:50 -07:00
debugfs.h wl18xx: show rx_frames_per_rates as an array as it really is 2015-03-16 18:07:03 +02:00
event.c wlcore: add dfs master restart calls 2015-01-09 15:48:01 +02:00
event.h wlcore: support scan reports during periodic scan 2012-12-11 12:37:23 +02:00
hw_ops.h wlcore: add dfs master restart calls 2015-01-09 15:48:01 +02:00
ini.h
init.c wlcore: add p2p device support 2015-08-10 22:16:34 +03:00
init.h wlcore: add p2p device support 2015-08-10 22:16:34 +03:00
io.c
io.h wlcore: block read/writes to FW during ELP 2014-02-13 15:20:14 -05:00
Kconfig ti: unify Kconfig with other vendors 2015-11-18 14:28:31 +02:00
main.c mac80211: allow to transmit A-MSDU within A-MPDU 2015-09-22 15:21:23 +02:00
Makefile wlcore: handle smart config vendor commands 2014-07-15 15:59:56 -04:00
ps.c wl18xx: add debugfs file to emulate radar event 2015-01-09 15:47:58 +02:00
ps.h
rx.c wlcore: add antenna diversity reading comments 2015-08-06 10:20:02 +03:00
rx.h wlcore: add antenna diversity reading 2015-07-21 18:07:34 +03:00
scan.c cfg80211: consolidate passive-scan and no-ibss flags 2013-11-25 20:49:35 +01:00
scan.h wl18xx: use long intervals in sched scan 2015-08-10 22:16:21 +03:00
sdio.c wlcore: sdio: return correct error code 2015-07-21 16:54:15 +03:00
spi.c wlcore/wl12xx: spi: fix oops on firmware load 2015-12-11 13:54:23 +02:00
sysfs.c net: Replace min macro with min_t 2014-03-03 15:35:54 -05:00
sysfs.h wlcore: move sysfs handling to a separate file 2013-06-17 11:56:59 +03:00
testmode.c wlcore: fix interrogate command length 2013-10-23 09:47:40 +03:00
testmode.h mac80211: add vif to testmode cmd 2013-08-12 14:11:42 +02:00
tx.c wlcore/wl18xx/wl12xx: convert bitmaps to unsigned longs 2014-07-15 16:00:02 -04:00
tx.h wlcore: send EAPOL frames with voice priority 2014-02-13 15:20:15 -05:00
vendor_cmd.c wlcore: fix WLCORE_VENDOR_ATTR_GROUP_KEY policy 2015-01-09 15:47:49 +02:00
vendor_cmd.h wlcore/wl18xx: handle smart config events 2014-07-15 15:59:57 -04:00
wl12xx_80211.h
wlcore.h wlcore: align reg_ch_conf_last[] to 64bit 2015-09-29 10:44:27 +03:00
wlcore_i.h wlcore: add p2p device support 2015-08-10 22:16:34 +03:00