Skip site navigation (1)Skip section navigation (2)
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>