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

Reply via email to