This diff changes the locking in sbt and sdmmc from the old-and-busted
lockmgr locks to the new-hotness rwlock locks. I don't have the
hardware to test this on, so anybody with sbt/sdmmc is encouraged
to give it a spin.

-Bert

-- all is achievable through the power of Robocop

Index: sbt.c
===================================================================
RCS file: /cvs/src/sys/dev/sdmmc/sbt.c,v
retrieving revision 1.15
diff -u -p -r1.15 sbt.c
--- sbt.c       2 Jul 2010 02:40:16 -0000       1.15
+++ sbt.c       30 Jul 2010 08:04:02 -0000
@@ -310,7 +310,7 @@ sbt_read_packet(struct sbt_softc *sc, u_
        }
 
 out:
-       SDMMC_LOCK(sc->sc_sf->sc);
+       rw_enter_write(&sc->sc_sf->sc->sc_lock);
        if (error) {
                if (sc->sc_rxtry >= SBT_RXTRY_MAX) {
                        /* Drop and request the next packet. */
@@ -321,14 +321,14 @@ out:
                        sc->sc_rxtry++;
                        CSR_WRITE_1(sc, SBT_REG_RPC, RPC_PCRRT);
                }
-               SDMMC_UNLOCK(sc->sc_sf->sc);
+               rw_exit(&sc->sc_sf->sc->sc_lock);
                return error;
        }
 
        /* acknowledge read packet */
        CSR_WRITE_1(sc, SBT_REG_RPC, 0);
 
-       SDMMC_UNLOCK(sc->sc_sf->sc);
+       rw_exit(&sc->sc_sf->sc->sc_lock);
 
        *lenp = len;
        return 0;
@@ -351,10 +351,10 @@ sbt_intr(void *arg)
        /* Block further SDIO interrupts; XXX not really needed? */
        s = splsdmmc();
 
-       SDMMC_LOCK(sc->sc_sf->sc);
+       rw_enter_write(&sc->sc_sf->sc->sc_lock);
        status = CSR_READ_1(sc, SBT_REG_ISTAT);
        CSR_WRITE_1(sc, SBT_REG_ICLR, status);
-       SDMMC_UNLOCK(sc->sc_sf->sc);
+       rw_exit(&sc->sc_sf->sc->sc_lock);
 
        if ((status & ISTAT_INTRD) == 0)
                return 0;       /* shared SDIO card interrupt? */
Index: sdmmc.c
===================================================================
RCS file: /cvs/src/sys/dev/sdmmc/sdmmc.c,v
retrieving revision 1.22
diff -u -p -r1.22 sdmmc.c
--- sdmmc.c     2 Jul 2010 18:05:28 -0000       1.22
+++ sdmmc.c     30 Jul 2010 08:04:02 -0000
@@ -28,6 +28,7 @@
 #include <sys/kthread.h>
 #include <sys/malloc.h>
 #include <sys/proc.h>
+#include <sys/rwlock.h>
 #include <sys/systm.h>
 
 #include <scsi/scsi_all.h>
@@ -113,7 +114,7 @@ sdmmc_attach(struct device *parent, stru
        TAILQ_INIT(&sc->sc_intrq);
        sdmmc_init_task(&sc->sc_discover_task, sdmmc_discover_task, sc);
        sdmmc_init_task(&sc->sc_intr_task, sdmmc_intr_task, sc);
-       lockinit(&sc->sc_lock, PRIBIO, DEVNAME(sc), 0, 0);
+       rw_init(&sc->sc_lock, DEVNAME(sc));
 
 #ifdef SDMMC_IOCTL
        if (bio_register(self, sdmmc_ioctl) != 0)
@@ -200,9 +201,9 @@ restart:
        splx(s);
 
        if (ISSET(sc->sc_flags, SMF_CARD_PRESENT)) {
-               SDMMC_LOCK(sc);
+               rw_enter_write(&sc->sc_lock);
                sdmmc_card_detach(sc, DETACH_FORCE);
-               SDMMC_UNLOCK(sc);
+               rw_exit(&sc->sc_lock);
        }
 
        /*
@@ -270,9 +271,9 @@ sdmmc_discover_task(void *arg)
        } else {
                if (ISSET(sc->sc_flags, SMF_CARD_PRESENT)) {
                        CLR(sc->sc_flags, SMF_CARD_PRESENT);
-                       SDMMC_LOCK(sc);
+                       rw_enter_write(&sc->sc_lock);
                        sdmmc_card_detach(sc, DETACH_FORCE);
-                       SDMMC_UNLOCK(sc);
+                       rw_exit(&sc->sc_lock);
                }
        }
 }
@@ -285,7 +286,7 @@ sdmmc_card_attach(struct sdmmc_softc *sc
 {
        DPRINTF(1,("%s: attach card\n", DEVNAME(sc)));
 
-       SDMMC_LOCK(sc);
+       rw_enter_write(&sc->sc_lock);
        CLR(sc->sc_flags, SMF_CARD_ATTACHED);
 
        /*
@@ -322,11 +323,11 @@ sdmmc_card_attach(struct sdmmc_softc *sc
                sdmmc_io_attach(sc);
 
        SET(sc->sc_flags, SMF_CARD_ATTACHED);
-       SDMMC_UNLOCK(sc);
+       rw_exit(&sc->sc_lock);
        return;
 err:
        sdmmc_card_detach(sc, DETACH_FORCE);
-       SDMMC_UNLOCK(sc);
+       rw_exit(&sc->sc_lock);
 }
 
 /*
@@ -338,7 +339,7 @@ sdmmc_card_detach(struct sdmmc_softc *sc
 {
        struct sdmmc_function *sf, *sfnext;
 
-       SDMMC_ASSERT_LOCKED(sc);
+       rw_assert_wrlock(&sc->sc_lock);
 
        DPRINTF(1,("%s: detach card\n", DEVNAME(sc)));
 
@@ -373,7 +374,7 @@ sdmmc_enable(struct sdmmc_softc *sc)
        u_int32_t host_ocr;
        int error;
 
-       SDMMC_ASSERT_LOCKED(sc);
+       rw_assert_wrlock(&sc->sc_lock);
 
        /*
         * Calculate the equivalent of the card OCR from the host
@@ -424,7 +425,7 @@ sdmmc_disable(struct sdmmc_softc *sc)
 {
        /* XXX complete commands if card is still present. */
 
-       SDMMC_ASSERT_LOCKED(sc);
+       rw_assert_wrlock(&sc->sc_lock);
 
        /* Make sure no card is still selected. */
        (void)sdmmc_select_card(sc, NULL);
@@ -443,7 +444,7 @@ sdmmc_set_bus_power(struct sdmmc_softc *
 {
        u_int32_t bit;
 
-       SDMMC_ASSERT_LOCKED(sc);
+       rw_assert_wrlock(&sc->sc_lock);
 
        /* Mask off unsupported voltage levels and select the lowest. */
        DPRINTF(1,("%s: host_ocr=%x ", DEVNAME(sc), host_ocr));
@@ -491,7 +492,7 @@ int
 sdmmc_scan(struct sdmmc_softc *sc)
 {
 
-       SDMMC_ASSERT_LOCKED(sc);
+       rw_assert_wrlock(&sc->sc_lock);
 
        /* Scan for I/O functions. */
        if (ISSET(sc->sc_flags, SMF_IO_MODE))
@@ -518,7 +519,7 @@ sdmmc_init(struct sdmmc_softc *sc)
 {
        struct sdmmc_function *sf;
 
-       SDMMC_ASSERT_LOCKED(sc);
+       rw_assert_wrlock(&sc->sc_lock);
 
        /* Initialize all identified card functions. */
        SIMPLEQ_FOREACH(sf, &sc->sf_head, sf_list) {
@@ -557,7 +558,7 @@ sdmmc_app_command(struct sdmmc_softc *sc
        struct sdmmc_command acmd;
        int error;
 
-       SDMMC_ASSERT_LOCKED(sc);
+       rw_assert_wrlock(&sc->sc_lock);
 
        bzero(&acmd, sizeof acmd);
        acmd.c_opcode = MMC_APP_CMD;
@@ -588,7 +589,7 @@ sdmmc_mmc_command(struct sdmmc_softc *sc
 {
        int error;
 
-       SDMMC_ASSERT_LOCKED(sc);
+       rw_assert_wrlock(&sc->sc_lock);
 
        sdmmc_chip_exec_command(sc->sct, sc->sch, cmd);
 
@@ -610,7 +611,7 @@ sdmmc_go_idle_state(struct sdmmc_softc *
 {
        struct sdmmc_command cmd;
 
-       SDMMC_ASSERT_LOCKED(sc);
+       rw_assert_wrlock(&sc->sc_lock);
 
        bzero(&cmd, sizeof cmd);
        cmd.c_opcode = MMC_GO_IDLE_STATE;
@@ -629,7 +630,7 @@ sdmmc_send_if_cond(struct sdmmc_softc *s
        uint8_t pat = 0x23;     /* any pattern will do here */
        uint8_t res;
 
-       SDMMC_ASSERT_LOCKED(sc);
+       rw_assert_wrlock(&sc->sc_lock);
 
        bzero(&cmd, sizeof cmd);
 
@@ -656,7 +657,7 @@ sdmmc_set_relative_addr(struct sdmmc_sof
 {
        struct sdmmc_command cmd;
 
-       SDMMC_ASSERT_LOCKED(sc);
+       rw_assert_wrlock(&sc->sc_lock);
 
        bzero(&cmd, sizeof cmd);
 
@@ -687,15 +688,15 @@ sdmmc_set_bus_width(struct sdmmc_functio
        struct sdmmc_command cmd;
        int error;
 
-       SDMMC_LOCK(sc);
+       rw_enter_write(&sc->sc_lock);
 
        if (!ISSET(sc->sc_flags, SMF_SD_MODE)) {
-               SDMMC_UNLOCK(sc);
+               rw_exit(&sc->sc_lock);
                return EOPNOTSUPP;
        }
 
        if ((error = sdmmc_select_card(sc, sf)) != 0) {
-               SDMMC_UNLOCK(sc);
+               rw_exit(&sc->sc_lock);
                return error;
        }
 
@@ -704,7 +705,7 @@ sdmmc_set_bus_width(struct sdmmc_functio
        cmd.c_arg = SD_ARG_BUS_WIDTH_4;
        cmd.c_flags = SCF_CMD_AC | SCF_RSP_R1;
        error = sdmmc_app_command(sc, &cmd);
-       SDMMC_UNLOCK(sc);
+       rw_exit(&sc->sc_lock);
        return error;
 }
 
@@ -714,7 +715,7 @@ sdmmc_select_card(struct sdmmc_softc *sc
        struct sdmmc_command cmd;
        int error;
 
-       SDMMC_ASSERT_LOCKED(sc);
+       rw_assert_wrlock(&sc->sc_lock);
 
        if (sc->sc_card == sf || (sf && sc->sc_card &&
            sc->sc_card->rca == sf->rca)) {
@@ -782,12 +783,12 @@ sdmmc_ioctl(struct device *self, u_long 
                        cmd.c_datalen = ucmd->c_datalen;
                }
 
-               SDMMC_LOCK(sc);
+               rw_enter_write(&sc->sc_lock);
                if (request == SDIOCEXECMMC)
                        error = sdmmc_mmc_command(sc, &cmd);
                else
                        error = sdmmc_app_command(sc, &cmd);
-               SDMMC_UNLOCK(sc);
+               rw_exit(&sc->sc_lock);
                if (error && !cmd.c_error)
                        cmd.c_error = error;
 
@@ -816,7 +817,7 @@ sdmmc_dump_command(struct sdmmc_softc *s
 {
        int i;
 
-       SDMMC_ASSERT_LOCKED(sc);
+       rw_assert_wrlock(&sc->sc_lock);
 
        DPRINTF(1,("%s: cmd %u arg=%#x data=%#x dlen=%d flags=%#x "
            "proc=\"%s\" (error %d)\n", DEVNAME(sc), cmd->c_opcode,
Index: sdmmc_cis.c
===================================================================
RCS file: /cvs/src/sys/dev/sdmmc/sdmmc_cis.c,v
retrieving revision 1.3
diff -u -p -r1.3 sdmmc_cis.c
--- sdmmc_cis.c 11 Nov 2009 21:59:16 -0000      1.3
+++ sdmmc_cis.c 30 Jul 2010 08:04:02 -0000
@@ -39,7 +39,7 @@ sdmmc_cisptr(struct sdmmc_function *sf)
 {
        u_int32_t cisptr = 0;
 
-       SDMMC_ASSERT_LOCKED(sf->sc);
+       rw_assert_wrlock(&sf->sc->sc_lock);
 
        /* XXX where is the per-function CIS pointer register? */
        if (sf->number != 0)
@@ -60,7 +60,7 @@ sdmmc_read_cis(struct sdmmc_function *sf
        u_int8_t tplcode;
        u_int8_t tpllen;
 
-       SDMMC_ASSERT_LOCKED(sf->sc);
+       rw_assert_wrlock(&sf->sc->sc_lock);
 
        bzero(cis, sizeof *cis);
 
Index: sdmmc_io.c
===================================================================
RCS file: /cvs/src/sys/dev/sdmmc/sdmmc_io.c,v
retrieving revision 1.17
diff -u -p -r1.17 sdmmc_io.c
--- sdmmc_io.c  11 Nov 2009 21:59:16 -0000      1.17
+++ sdmmc_io.c  30 Jul 2010 08:04:02 -0000
@@ -72,7 +72,7 @@ sdmmc_io_enable(struct sdmmc_softc *sc)
        u_int32_t host_ocr;
        u_int32_t card_ocr;
 
-       SDMMC_ASSERT_LOCKED(sc);
+       rw_assert_wrlock(&sc->sc_lock);
 
        /* Set host mode to SD "combo" card. */
        SET(sc->sc_flags, SMF_SD_MODE|SMF_IO_MODE|SMF_MEM_MODE);
@@ -136,7 +136,7 @@ sdmmc_io_scan(struct sdmmc_softc *sc)
        struct sdmmc_function *sf0, *sf;
        int i;
 
-       SDMMC_ASSERT_LOCKED(sc);
+       rw_assert_wrlock(&sc->sc_lock);
 
        sf0 = sdmmc_function_alloc(sc);
        sf0->number = 0;
@@ -171,7 +171,7 @@ sdmmc_io_scan(struct sdmmc_softc *sc)
 int
 sdmmc_io_init(struct sdmmc_softc *sc, struct sdmmc_function *sf)
 {
-       SDMMC_ASSERT_LOCKED(sc);
+       rw_assert_wrlock(&sc->sc_lock);
 
        if (sf->number == 0) {
                sdmmc_io_write_1(sf, SD_IO_CCCR_BUS_WIDTH,
@@ -201,7 +201,7 @@ sdmmc_io_function_ready(struct sdmmc_fun
        struct sdmmc_function *sf0 = sc->sc_fn0;
        u_int8_t rv;
 
-       SDMMC_ASSERT_LOCKED(sc);
+       rw_assert_wrlock(&sc->sc_lock);
 
        if (sf->number == 0)
                return 1;       /* FN0 is always ready */
@@ -226,11 +226,11 @@ sdmmc_io_function_enable(struct sdmmc_fu
        if (sf->number == 0)
                return 0;       /* FN0 is always enabled */
 
-       SDMMC_LOCK(sc);
+       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);
-       SDMMC_UNLOCK(sc);
+       rw_exit(&sc->sc_lock);
 
        while (!sdmmc_io_function_ready(sf) && retry-- > 0)
                tsleep(&lbolt, PPAUSE, "pause", 0);
@@ -248,7 +248,7 @@ sdmmc_io_function_disable(struct sdmmc_f
        struct sdmmc_function *sf0 = sc->sc_fn0;
        u_int8_t rv;
 
-       SDMMC_ASSERT_LOCKED(sc);
+       rw_assert_wrlock(&sc->sc_lock);
 
        if (sf->number == 0)
                return;         /* FN0 is always enabled */
@@ -264,7 +264,7 @@ sdmmc_io_attach(struct sdmmc_softc *sc)
        struct sdmmc_function *sf;
        struct sdmmc_attach_args saa;
 
-       SDMMC_ASSERT_LOCKED(sc);
+       rw_assert_wrlock(&sc->sc_lock);
 
        SIMPLEQ_FOREACH(sf, &sc->sf_head, sf_list) {
                if (sf->number < 1)
@@ -337,7 +337,7 @@ sdmmc_io_detach(struct sdmmc_softc *sc)
 {
        struct sdmmc_function *sf;
 
-       SDMMC_ASSERT_LOCKED(sc);
+       rw_assert_wrlock(&sc->sc_lock);
 
        SIMPLEQ_FOREACH(sf, &sc->sf_head, sf_list) {
                if (sf->child != NULL) {
@@ -356,11 +356,11 @@ sdmmc_io_rw_direct(struct sdmmc_softc *s
        struct sdmmc_command cmd;
        int error;
 
-       SDMMC_ASSERT_LOCKED(sc);
+       rw_assert_wrlock(&sc->sc_lock);
 
        /* Make sure the card is selected. */
        if ((error = sdmmc_select_card(sc, sf)) != 0) {
-               SDMMC_UNLOCK(sc);
+               rw_exit(&sc->sc_lock);
                return error;
        }
 
@@ -395,12 +395,12 @@ sdmmc_io_rw_extended(struct sdmmc_softc 
        struct sdmmc_command cmd;
        int error;
 
-       SDMMC_ASSERT_LOCKED(sc);
+       rw_assert_wrlock(&sc->sc_lock);
 
 #if 0
        /* Make sure the card is selected. */
        if ((error = sdmmc_select_card(sc, sf)) != 0) {
-               SDMMC_UNLOCK(sc);
+               rw_exit(&sc->sc_lock);
                return error;
        }
 #endif
@@ -424,7 +424,7 @@ sdmmc_io_rw_extended(struct sdmmc_softc 
                cmd.c_flags |= SCF_CMD_READ;
 
        error = sdmmc_mmc_command(sc, &cmd);
-       SDMMC_UNLOCK(sc);
+       rw_exit(&sc->sc_lock);
        return error;
 }
 
@@ -433,7 +433,7 @@ sdmmc_io_read_1(struct sdmmc_function *s
 {
        u_int8_t data = 0;
 
-       SDMMC_ASSERT_LOCKED(sf->sc);
+       rw_assert_wrlock(&sf->sc->sc_lock);
        
        (void)sdmmc_io_rw_direct(sf->sc, sf, reg, (u_char *)&data,
            SD_ARG_CMD52_READ);
@@ -443,7 +443,7 @@ sdmmc_io_read_1(struct sdmmc_function *s
 void
 sdmmc_io_write_1(struct sdmmc_function *sf, int reg, u_int8_t data)
 {
-       SDMMC_ASSERT_LOCKED(sf->sc);
+       rw_assert_wrlock(&sf->sc->sc_lock);
 
        (void)sdmmc_io_rw_direct(sf->sc, sf, reg, (u_char *)&data,
            SD_ARG_CMD52_WRITE);
@@ -454,7 +454,7 @@ sdmmc_io_read_2(struct sdmmc_function *s
 {
        u_int16_t data = 0;
        
-       SDMMC_ASSERT_LOCKED(sf->sc);
+       rw_assert_wrlock(&sf->sc->sc_lock);
 
        (void)sdmmc_io_rw_extended(sf->sc, sf, reg, (u_char *)&data, 2,
            SD_ARG_CMD53_READ | SD_ARG_CMD53_INCREMENT);
@@ -464,7 +464,7 @@ sdmmc_io_read_2(struct sdmmc_function *s
 void
 sdmmc_io_write_2(struct sdmmc_function *sf, int reg, u_int16_t data)
 {
-       SDMMC_ASSERT_LOCKED(sf->sc);
+       rw_assert_wrlock(&sf->sc->sc_lock);
 
        (void)sdmmc_io_rw_extended(sf->sc, sf, reg, (u_char *)&data, 2,
            SD_ARG_CMD53_WRITE | SD_ARG_CMD53_INCREMENT);
@@ -475,7 +475,7 @@ sdmmc_io_read_4(struct sdmmc_function *s
 {
        u_int32_t data = 0;
        
-       SDMMC_ASSERT_LOCKED(sf->sc);
+       rw_assert_wrlock(&sf->sc->sc_lock);
 
        (void)sdmmc_io_rw_extended(sf->sc, sf, reg, (u_char *)&data, 4,
            SD_ARG_CMD53_READ | SD_ARG_CMD53_INCREMENT);
@@ -485,7 +485,7 @@ sdmmc_io_read_4(struct sdmmc_function *s
 void
 sdmmc_io_write_4(struct sdmmc_function *sf, int reg, u_int32_t data)
 {
-       SDMMC_ASSERT_LOCKED(sf->sc);
+       rw_assert_wrlock(&sf->sc->sc_lock);
 
        (void)sdmmc_io_rw_extended(sf->sc, sf, reg, (u_char *)&data, 4,
            SD_ARG_CMD53_WRITE | SD_ARG_CMD53_INCREMENT);
@@ -497,7 +497,7 @@ sdmmc_io_read_multi_1(struct sdmmc_funct
 {
        int error;
 
-       SDMMC_ASSERT_LOCKED(sf->sc);
+       rw_assert_wrlock(&sf->sc->sc_lock);
 
        while (datalen > SD_ARG_CMD53_LENGTH_MAX) {
                error = sdmmc_io_rw_extended(sf->sc, sf, reg, data,
@@ -518,7 +518,7 @@ sdmmc_io_write_multi_1(struct sdmmc_func
 {
        int error;
 
-       SDMMC_ASSERT_LOCKED(sf->sc);
+       rw_assert_wrlock(&sf->sc->sc_lock);
 
        while (datalen > SD_ARG_CMD53_LENGTH_MAX) {
                error = sdmmc_io_rw_extended(sf->sc, sf, reg, data,
@@ -538,7 +538,7 @@ sdmmc_io_xchg(struct sdmmc_softc *sc, st
     int reg, u_char *datap)
 {
 
-       SDMMC_ASSERT_LOCKED(sc);
+       rw_assert_wrlock(&sc->sc_lock);
 
        return sdmmc_io_rw_direct(sc, sf, reg, datap,
            SD_ARG_CMD52_WRITE|SD_ARG_CMD52_EXCHANGE);
@@ -566,7 +566,7 @@ sdmmc_io_send_op_cond(struct sdmmc_softc
        int error;
        int i;
 
-       SDMMC_ASSERT_LOCKED(sc);
+       rw_assert_wrlock(&sc->sc_lock);
 
        /*
         * If we change the OCR value, retry the command until the OCR
@@ -605,11 +605,11 @@ sdmmc_intr_enable(struct sdmmc_function 
        struct sdmmc_function *sf0 = sc->sc_fn0;
        u_int8_t imask;
 
-       SDMMC_LOCK(sc);
+       rw_enter_write(&sc->sc_lock);
        imask = sdmmc_io_read_1(sf0, SD_IO_CCCR_INT_ENABLE);
        imask |= 1 << sf->number;
        sdmmc_io_write_1(sf0, SD_IO_CCCR_INT_ENABLE, imask);
-       SDMMC_UNLOCK(sc);
+       rw_exit(&sc->sc_lock);
 }
 
 void
@@ -619,11 +619,11 @@ sdmmc_intr_disable(struct sdmmc_function
        struct sdmmc_function *sf0 = sc->sc_fn0;
        u_int8_t imask;
 
-       SDMMC_LOCK(sc);
+       rw_enter_write(&sc->sc_lock);
        imask = sdmmc_io_read_1(sf0, SD_IO_CCCR_INT_ENABLE);
        imask &= ~(1 << sf->number);
        sdmmc_io_write_1(sf0, SD_IO_CCCR_INT_ENABLE, imask);
-       SDMMC_UNLOCK(sc);
+       rw_exit(&sc->sc_lock);
 }
 
 /*
Index: sdmmc_mem.c
===================================================================
RCS file: /cvs/src/sys/dev/sdmmc/sdmmc_mem.c,v
retrieving revision 1.14
diff -u -p -r1.14 sdmmc_mem.c
--- sdmmc_mem.c 10 Feb 2010 23:33:08 -0000      1.14
+++ sdmmc_mem.c 30 Jul 2010 08:04:02 -0000
@@ -52,7 +52,7 @@ sdmmc_mem_enable(struct sdmmc_softc *sc)
        u_int32_t host_ocr;
        u_int32_t card_ocr;
 
-       SDMMC_ASSERT_LOCKED(sc);
+       rw_assert_wrlock(&sc->sc_lock);
 
        /* Set host mode to SD "combo" card or SD memory-only. */
        SET(sc->sc_flags, SMF_SD_MODE|SMF_MEM_MODE);
@@ -122,7 +122,7 @@ sdmmc_mem_scan(struct sdmmc_softc *sc)
        int error;
        int i;
 
-       SDMMC_ASSERT_LOCKED(sc);
+       rw_assert_wrlock(&sc->sc_lock);
 
        /*
         * CMD2 is a broadcast command understood by SD cards and MMC
@@ -331,7 +331,7 @@ sdmmc_mem_init(struct sdmmc_softc *sc, s
 {
        int error = 0;
 
-       SDMMC_ASSERT_LOCKED(sc);
+       rw_assert_wrlock(&sc->sc_lock);
 
        if (sdmmc_select_card(sc, sf) != 0 ||
            sdmmc_mem_set_blocklen(sc, sf) != 0)
@@ -350,7 +350,7 @@ sdmmc_mem_send_op_cond(struct sdmmc_soft
        int error;
        int i;
 
-       SDMMC_ASSERT_LOCKED(sc);
+       rw_assert_wrlock(&sc->sc_lock);
 
        /*
         * If we change the OCR value, retry the command until the OCR
@@ -392,7 +392,7 @@ sdmmc_mem_set_blocklen(struct sdmmc_soft
 {
        struct sdmmc_command cmd;
 
-       SDMMC_ASSERT_LOCKED(sc);
+       rw_assert_wrlock(&sc->sc_lock);
 
        bzero(&cmd, sizeof cmd);
        cmd.c_opcode = MMC_SET_BLOCKLEN;
@@ -412,7 +412,7 @@ sdmmc_mem_read_block(struct sdmmc_functi
        struct sdmmc_command cmd;
        int error;
 
-       SDMMC_LOCK(sc);
+       rw_enter_write(&sc->sc_lock);
 
        if ((error = sdmmc_select_card(sc, sf)) != 0)
                goto err;
@@ -456,7 +456,7 @@ sdmmc_mem_read_block(struct sdmmc_functi
        } while (!ISSET(MMC_R1(cmd.c_resp), MMC_R1_READY_FOR_DATA));
 
 err:
-       SDMMC_UNLOCK(sc);
+       rw_exit(&sc->sc_lock);
        return error;
 }
 
@@ -468,7 +468,7 @@ sdmmc_mem_write_block(struct sdmmc_funct
        struct sdmmc_command cmd;
        int error;
 
-       SDMMC_LOCK(sc);
+       rw_enter_write(&sc->sc_lock);
 
        if ((error = sdmmc_select_card(sc, sf)) != 0)
                goto err;
@@ -511,6 +511,6 @@ sdmmc_mem_write_block(struct sdmmc_funct
        } while (!ISSET(MMC_R1(cmd.c_resp), MMC_R1_READY_FOR_DATA));
 
 err:
-       SDMMC_UNLOCK(sc);
+       rw_exit(&sc->sc_lock);
        return error;
 }
Index: sdmmc_scsi.c
===================================================================
RCS file: /cvs/src/sys/dev/sdmmc/sdmmc_scsi.c,v
retrieving revision 1.23
diff -u -p -r1.23 sdmmc_scsi.c
--- sdmmc_scsi.c        20 Jun 2010 23:05:29 -0000      1.23
+++ sdmmc_scsi.c        30 Jul 2010 08:04:02 -0000
@@ -99,7 +99,7 @@ sdmmc_scsi_attach(struct sdmmc_softc *sc
        struct sdmmc_scsi_softc *scbus;
        struct sdmmc_function *sf;
 
-       SDMMC_ASSERT_LOCKED(sc);
+       rw_assert_wrlock(&sc->sc_lock);
 
        scbus = malloc(sizeof *scbus, M_DEVBUF, M_WAITOK | M_ZERO);
 
@@ -161,7 +161,7 @@ sdmmc_scsi_detach(struct sdmmc_softc *sc
        struct sdmmc_ccb *ccb;
        int s;
 
-       SDMMC_ASSERT_LOCKED(sc);
+       rw_assert_wrlock(&sc->sc_lock);
 
        scbus = sc->sc_scsibus;
        if (scbus == NULL)
Index: sdmmcvar.h
===================================================================
RCS file: /cvs/src/sys/dev/sdmmc/sdmmcvar.h,v
retrieving revision 1.16
diff -u -p -r1.16 sdmmcvar.h
--- sdmmcvar.h  7 Apr 2009 16:35:52 -0000       1.16
+++ sdmmcvar.h  30 Jul 2010 08:04:04 -0000
@@ -20,7 +20,7 @@
 #define _SDMMCVAR_H_
 
 #include <sys/queue.h>
-#include <sys/lock.h>
+#include <sys/rwlock.h>
 
 #include <scsi/scsi_all.h>
 #include <scsi/scsiconf.h>
@@ -172,7 +172,7 @@ struct sdmmc_softc {
        TAILQ_HEAD(, sdmmc_task) sc_tskq;   /* task thread work queue */
        struct sdmmc_task sc_discover_task; /* card attach/detach task */
        struct sdmmc_task sc_intr_task; /* card interrupt task */
-       struct lock sc_lock;            /* lock around host controller */
+       struct rwlock sc_lock;          /* lock around host controller */
        void *sc_scsibus;               /* SCSI bus emulation softc */
        TAILQ_HEAD(, sdmmc_intr_handler) sc_intrq; /* interrupt handlers */
        long sc_max_xfer;               /* maximum transfer size */
@@ -189,10 +189,8 @@ struct sdmmc_attach_args {
 #define IPL_SDMMC      IPL_BIO
 #define splsdmmc()     splbio()
 
-#define SDMMC_LOCK(sc)  lockmgr(&(sc)->sc_lock, LK_EXCLUSIVE, NULL)
-#define SDMMC_UNLOCK(sc) lockmgr(&(sc)->sc_lock, LK_RELEASE, NULL)
 #define        SDMMC_ASSERT_LOCKED(sc) \
-       KASSERT(lockstatus(&((sc))->sc_lock) == LK_EXCLUSIVE)
+       rw_assert_wrlock(&(sc)->sc_lock)
 
 void   sdmmc_add_task(struct sdmmc_softc *, struct sdmmc_task *);
 void   sdmmc_del_task(struct sdmmc_task *);

Reply via email to