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);