When a sdmmc device driver currently calls sdmmc_io_function_enable()
in its attach routine it will cause a 'locking against myself' panic
since the lock already has been set in the sdmmc attach path.
Therefore just check if the lock already has been set in
sdmmc_io_function_enable() fixes this.
ok?
Index: sdmmc_io.c
===================================================================
RCS file: /cvs/src/sys/dev/sdmmc/sdmmc_io.c,v
retrieving revision 1.26
diff -u -p -r1.26 sdmmc_io.c
--- sdmmc_io.c 12 May 2016 15:26:42 -0000 1.26
+++ sdmmc_io.c 31 Aug 2016 18:08:38 -0000
@@ -223,14 +223,14 @@ sdmmc_io_function_enable(struct sdmmc_fu
u_int8_t rv;
int retry = 5;
+ rw_assert_wrlock(&sc->sc_lock);
+
if (sf->number == 0)
return 0; /* FN0 is always enabled */
- rw_enter_write(&sc->sc_lock);
rv = sdmmc_io_read_1(sf0, SD_IO_CCCR_FN_ENABLE);
rv |= (1<<sf->number);
sdmmc_io_write_1(sf0, SD_IO_CCCR_FN_ENABLE, rv);
- rw_exit(&sc->sc_lock);
while (!sdmmc_io_function_ready(sf) && retry-- > 0)
tsleep(&lbolt, PPAUSE, "pause", 0);