Date: Sun, 4 Mar 2018 11:38:12 -0800 From: Thomas Skibo <thomasskibo@yahoo.com> To: freebsd-arm@freebsd.org Subject: Panic in spi driver Message-ID: <838BFE5B-61CD-4EC4-BB4F-8124B5B3AF9F@yahoo.com>
index | next in thread | raw e-mail
[-- Attachment #1 --] I’m developing a qspi driver for Zynq/Zedboard and running into a problem that might affect other spi drivers. When my driver does its attach, it triggers the attach of the flash driver, dev/flash/mx25l.c, through spibus. In turn, the flash driver attempts to read the flash device ident by calling back to my driver’s transfer function. My driver initiates the transfer and then sleeps on its lock with a timeout (mtx_sleep(…, 2 * hz)). That panics the system: “panic: timed sleep before timers are working”. I’ve attached the stack backtrace. I loosely based my driver on bcm2835_spi.c which also sleeps with a timeout in its transfer function. I tried greping through a few other spi drivers and noticed dev/intel/spi.c does it too. Okay, before I hit send, I noticed that the other flash driver, at45d.c, uses some hook to do a delayed attach with the comment “We’ll see what kind of flash we have later…”. Maybe mx25l.c needs something like this. My other idea is to create a “fast transfer” function that doesn’t use interrupts to be used for trivial transfers. That would take care of the IDENT and READ_STATUS commands that happen in the flash driver’s attach routine. It might be a nice optimization too. —Thomas [-- Attachment #2 --] .... spi0: <Zynq Quad-SPI Flash Controller> mem 0xd000-0xdfff irq 13 on simplebus1 spibus0: <OFW SPI bus> on spi0 mx25l0: <M25Pxx Flash Family> at cs 0 mode 0 on spibus0 panic: timed sleep before timers are working cpuid = 0 time = 1 KDB: stack backtrace: db_trace_self() at db_trace_self pc = 0xc04cef94 lr = 0xc0097da0 (db_trace_self_wrapper+0x30) sp = 0xc0913938 fp = 0xc0913a50 db_trace_self_wrapper() at db_trace_self_wrapper+0x30 pc = 0xc0097da0 lr = 0xc01e7394 (vpanic+0x154) sp = 0xc0913a58 fp = 0xc0913a78 r4 = 0x00000100 r5 = 0x00000001 r6 = 0xc05540f8 r7 = 0xc06789f0 vpanic() at vpanic+0x154 pc = 0xc01e7394 lr = 0xc01e742c (kproc_shutdown) sp = 0xc0913a80 fp = 0xc0913a84 r4 = 0x00000000 r5 = 0x00000001 r6 = 0xc30b6c80 r7 = 0xc30b6c80 r8 = 0xc06f6660 r9 = 0x00000001 r10 = 0xfffffdb0 kproc_shutdown() at kproc_shutdown pc = 0xc01e742c lr = 0xc023e184 (sleepq_timeout) sp = 0xc0913a8c fp = 0xc0913ad8 r4 = 0xc01e742c r5 = 0xc0913a8c sleepq_timeout() at sleepq_timeout pc = 0xc023e184 lr = 0xc01f211c (_sleep+0x320) sp = 0xc0913ae0 fp = 0xc0913b40 r4 = 0x00000001 r5 = 0xc30b6c80 r6 = 0xfffffdb0 r7 = 0xc3070904 r8 = 0xc065f780 r10 = 0x00000001 _sleep() at _sleep+0x320 pc = 0xc01f211c lr = 0xc0502024 (zy7_qspi_transfer+0x17c) sp = 0xc0913b48 fp = 0xc0913b80 r4 = 0xfffffdb0 r5 = 0xc3070900 r6 = 0xc30b6c80 r7 = 0xc3070904 r8 = 0x00000000 r9 = 0xc3070880 r10 = 0xc0913b90 zy7_qspi_transfer() at zy7_qspi_transfer+0x17c pc = 0xc0502024 lr = 0xc009ed70 (mx25l_attach+0xe4) sp = 0xc0913b88 fp = 0xc0913bd8 r4 = 0x00000000 r5 = 0x00000000 r6 = 0xc30b5400 r7 = 0xc30b5380 r8 = 0xc30b5400 r9 = 0xc3070880 r10 = 0xc30b5450 mx25l_attach() at mx25l_attach+0xe4 pc = 0xc009ed70 lr = 0xc0220f8c (device_attach+0x468) sp = 0xc0913be0 fp = 0xc0913c28 r4 = 0xc30b5400 r5 = 0xc30b5380 r6 = 0xc30b5438 r7 = 0x00000000 r8 = 0xc0554c3d r9 = 0xc022506c device_attach() at device_attach+0x468 pc = 0xc0220f8c lr = 0xc0220a88 (device_probe_and_attach+0x8c) sp = 0xc0913c30 fp = 0xc0913c48 r4 = 0xc30b5400 r5 = 0xc2ec6920 r6 = 0x3e0d8f29 r7 = 0xc0913c64 r8 = 0xc2ebe340 r9 = 0x00000000 r10 = 0xc0913c68 device_probe_and_attach() at device_probe_and_attach+0x8c pc = 0xc0220a88 lr = 0xc022231c (bus_generic_attach+0x1c) sp = 0xc0913c50 fp = 0xc0913c58 r4 = 0xc30b5400 r5 = 0x00000000 r6 = 0xc0532cdc r10 = 0xc0913c68 bus_generic_attach() at bus_generic_attach+0x1c pc = 0xc022231c lr = 0xc00c71b4 (ofw_spibus_attach+0x1e4) sp = 0xc0913c60 fp = 0xc0913c88 r4 = 0xc0634708 r10 = 0xc0913c68 ofw_spibus_attach() at ofw_spibus_attach+0x1e4 pc = 0xc00c71b4 lr = 0xc0220f8c (device_attach+0x468) sp = 0xc0913c90 fp = 0xc0913cd8 r4 = 0xc30b5380 r5 = 0xc30b6c80 r6 = 0xc30b53b8 r7 = 0x00000000 r8 = 0xc0554c3d r9 = 0xc022506c r10 = 0xc30b53d0 device_attach() at device_attach+0x468 pc = 0xc0220f8c lr = 0xc0220a88 (device_probe_and_attach+0x8c) sp = 0xc0913ce0 fp = 0xc0913cf8 r4 = 0xc30b5380 r5 = 0xc2ec6920 r6 = 0x3e0d8f29 r7 = 0xc3070900 r8 = 0xc30b6cd0 r9 = 0xc01f4fb4 r10 = 0xc30b6c80 device_probe_and_attach() at device_probe_and_attach+0x8c pc = 0xc0220a88 lr = 0xc022231c (bus_generic_attach+0x1c) sp = 0xc0913d00 fp = 0xc0913d08 r4 = 0xc30b5380 r5 = 0x00000000 r6 = 0xd2b789c0 r10 = 0xc30b6c80 bus_generic_attach() at bus_generic_attach+0x1c pc = 0xc022231c lr = 0xc0501cb8 (zy7_qspi_attach+0x440) sp = 0xc0913d10 fp = 0xc0913d58 r4 = 0xc051fe8f r10 = 0xc30b6c80 zy7_qspi_attach() at zy7_qspi_attach+0x440 pc = 0xc0501cb8 lr = 0xc0220f8c (device_attach+0x468) sp = 0xc0913d60 fp = 0xc0913da8 r4 = 0xc30b6c80 r5 = 0xc30b7680 r6 = 0xc30b6cb8 r7 = 0x00000000 r8 = 0xc0554c3d r9 = 0xc022506c r10 = 0xc30b6cd0 device_attach() at device_attach+0x468 pc = 0xc0220f8c lr = 0xc0220a88 (device_probe_and_attach+0x8c) sp = 0xc0913db0 fp = 0xc0913dc8 r4 = 0xc30b6c80 r5 = 0xc2ec6920 r6 = 0x3e0d8f29 r7 = 0x00000000 r8 = 0xc0688af4 r9 = 0xc06f744c r10 = 0xc06f6a28 device_probe_and_attach() at device_probe_and_attach+0x8c pc = 0xc0220a88 lr = 0xc0222940 (bus_generic_new_pass+0xe8) sp = 0xc0913dd0 fp = 0xc0913de8 r4 = 0xc30b6c80 r5 = 0xc062b0b4 r6 = 0xc0659b3c r10 = 0xc06f6a28 bus_generic_new_pass() at bus_generic_new_pass+0xe8 pc = 0xc0222940 lr = 0xc0222930 (bus_generic_new_pass+0xd8) sp = 0xc0913df0 fp = 0xc0913e08 r4 = 0xc30b7680 r5 = 0xc062b0b4 r6 = 0xc062182c r7 = 0x00000000 r8 = 0xc0688af4 r10 = 0xc06f6a28 bus_generic_new_pass() at bus_generic_new_pass+0xd8 pc = 0xc0222930 lr = 0xc0222930 (bus_generic_new_pass+0xd8) sp = 0xc0913e10 fp = 0xc0913e28 r4 = 0xc30b7780 r5 = 0xc062b0b4 r6 = 0xc0650600 r7 = 0x00000000 r8 = 0xc0688af4 r10 = 0xc06f6a28 bus_generic_new_pass() at bus_generic_new_pass+0xd8 pc = 0xc0222930 lr = 0xc0222930 (bus_generic_new_pass+0xd8) sp = 0xc0913e30 fp = 0xc0913e48 r4 = 0xc30b7900 r5 = 0xc062b0b4 r6 = 0xc30b7b00 r7 = 0x00000000 r8 = 0xc0688af4 r10 = 0xc06f6a28 bus_generic_new_pass() at bus_generic_new_pass+0xd8 pc = 0xc0222930 lr = 0xc021e568 (bus_set_pass+0x94) sp = 0xc0913e50 fp = 0xc0913e68 r4 = 0xc2ec6680 r5 = 0xc062b0b4 r6 = 0xc30b7b00 r7 = 0xc0688af4 r8 = 0x7fffffff r10 = 0xc06f6a28 bus_set_pass() at bus_set_pass+0x94 pc = 0xc021e568 lr = 0xc01847e0 (mi_startup+0x18c) sp = 0xc0913e70 fp = 0xc0913e90 r4 = 0xc06f6b24 r5 = 0x00000001 r6 = 0xc058b084 r7 = 0x00000000 r8 = 0xc06f6b20 r9 = 0xc058bb48 mi_startup() at mi_startup+0x18c pc = 0xc01847e0 lr = 0xc00002c4 (_start+0x144) sp = 0xc0913e98 fp = 0x00000000 r4 = 0xc00003f8 r5 = 0xc0710000 r6 = 0x01059480 r7 = 0x00c52078 r8 = 0xc0823000 r9 = 0x0000000a r10 = 0x0000000a _start() at _start+0x144 pc = 0xc00002c4 lr = 0xc00002c4 (_start+0x144) sp = 0xc0913e98 fp = 0x00000000 KDB: enter: panic [ thread pid 0 tid 100000 ] Stopped at $d.3: ldrb r15, [r15, r15, ror r15]! db>home | help
Want to link to this message? Use this
URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?838BFE5B-61CD-4EC4-BB4F-8124B5B3AF9F>
