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