summaryrefslogtreecommitdiffstats
path: root/sys/dev/sdmmc
diff options
context:
space:
mode:
authorblambert <blambert@openbsd.org>2010-08-24 14:52:23 +0000
committerblambert <blambert@openbsd.org>2010-08-24 14:52:23 +0000
commit9de6240f73c2a69fc0b2a579cbfe23bba9d566ed (patch)
tree594294bc12de104a163005cdee19aefbe4dfae0e /sys/dev/sdmmc
parentlegibility fixes: (diff)
downloadwireguard-openbsd-9de6240f73c2a69fc0b2a579cbfe23bba9d566ed.tar.xz
wireguard-openbsd-9de6240f73c2a69fc0b2a579cbfe23bba9d566ed.zip
lockmgr -> rwlock conversion
and with this, my adventure in sdmmc-land is over bikeshed is still banana-shaped ok oga@
Diffstat (limited to 'sys/dev/sdmmc')
-rw-r--r--sys/dev/sdmmc/sbt.c12
-rw-r--r--sys/dev/sdmmc/sdmmc.c57
-rw-r--r--sys/dev/sdmmc/sdmmc_cis.c6
-rw-r--r--sys/dev/sdmmc/sdmmc_io.c58
-rw-r--r--sys/dev/sdmmc/sdmmc_mem.c20
-rw-r--r--sys/dev/sdmmc/sdmmc_scsi.c6
-rw-r--r--sys/dev/sdmmc/sdmmcvar.h10
7 files changed, 84 insertions, 85 deletions
diff --git a/sys/dev/sdmmc/sbt.c b/sys/dev/sdmmc/sbt.c
index 107d7b8435f..bc62c4b1bb1 100644
--- a/sys/dev/sdmmc/sbt.c
+++ b/sys/dev/sdmmc/sbt.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: sbt.c,v 1.16 2010/08/19 17:54:12 jasper Exp $ */
+/* $OpenBSD: sbt.c,v 1.17 2010/08/24 14:52:23 blambert Exp $ */
/*
* Copyright (c) 2007 Uwe Stuehler <uwe@openbsd.org>
@@ -308,7 +308,7 @@ sbt_read_packet(struct sbt_softc *sc, u_char *buf, size_t *lenp)
}
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. */
@@ -319,14 +319,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;
@@ -349,10 +349,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? */
diff --git a/sys/dev/sdmmc/sdmmc.c b/sys/dev/sdmmc/sdmmc.c
index bb67e6e21e1..a8801c2bc48 100644
--- a/sys/dev/sdmmc/sdmmc.c
+++ b/sys/dev/sdmmc/sdmmc.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: sdmmc.c,v 1.23 2010/08/19 17:54:12 jasper Exp $ */
+/* $OpenBSD: sdmmc.c,v 1.24 2010/08/24 14:52:23 blambert Exp $ */
/*
* Copyright (c) 2006 Uwe Stuehler <uwe@openbsd.org>
@@ -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>
@@ -111,7 +112,7 @@ sdmmc_attach(struct device *parent, struct device *self, void *aux)
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)
@@ -198,9 +199,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);
}
/*
@@ -268,9 +269,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);
}
}
}
@@ -283,7 +284,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);
/*
@@ -320,11 +321,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);
}
/*
@@ -336,7 +337,7 @@ sdmmc_card_detach(struct sdmmc_softc *sc, int flags)
{
struct sdmmc_function *sf, *sfnext;
- SDMMC_ASSERT_LOCKED(sc);
+ rw_assert_wrlock(&sc->sc_lock);
DPRINTF(1,("%s: detach card\n", DEVNAME(sc)));
@@ -371,7 +372,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
@@ -422,7 +423,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);
@@ -441,7 +442,7 @@ sdmmc_set_bus_power(struct sdmmc_softc *sc, u_int32_t host_ocr,
{
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));
@@ -489,7 +490,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))
@@ -516,7 +517,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) {
@@ -555,7 +556,7 @@ sdmmc_app_command(struct sdmmc_softc *sc, struct sdmmc_command *cmd)
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;
@@ -586,7 +587,7 @@ sdmmc_mmc_command(struct sdmmc_softc *sc, struct sdmmc_command *cmd)
{
int error;
- SDMMC_ASSERT_LOCKED(sc);
+ rw_assert_wrlock(&sc->sc_lock);
sdmmc_chip_exec_command(sc->sct, sc->sch, cmd);
@@ -608,7 +609,7 @@ sdmmc_go_idle_state(struct sdmmc_softc *sc)
{
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;
@@ -627,7 +628,7 @@ sdmmc_send_if_cond(struct sdmmc_softc *sc, uint32_t card_ocr)
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);
@@ -654,7 +655,7 @@ sdmmc_set_relative_addr(struct sdmmc_softc *sc,
{
struct sdmmc_command cmd;
- SDMMC_ASSERT_LOCKED(sc);
+ rw_assert_wrlock(&sc->sc_lock);
bzero(&cmd, sizeof cmd);
@@ -685,15 +686,15 @@ sdmmc_set_bus_width(struct sdmmc_function *sf)
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;
}
@@ -702,7 +703,7 @@ sdmmc_set_bus_width(struct sdmmc_function *sf)
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;
}
@@ -712,7 +713,7 @@ sdmmc_select_card(struct sdmmc_softc *sc, struct sdmmc_function *sf)
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)) {
@@ -780,12 +781,12 @@ sdmmc_ioctl(struct device *self, u_long request, caddr_t addr)
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;
@@ -814,7 +815,7 @@ sdmmc_dump_command(struct sdmmc_softc *sc, struct sdmmc_command *cmd)
{
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,
diff --git a/sys/dev/sdmmc/sdmmc_cis.c b/sys/dev/sdmmc/sdmmc_cis.c
index 66a9a6c4e00..bc00b2ba1e2 100644
--- a/sys/dev/sdmmc/sdmmc_cis.c
+++ b/sys/dev/sdmmc/sdmmc_cis.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: sdmmc_cis.c,v 1.4 2010/08/19 17:54:12 jasper Exp $ */
+/* $OpenBSD: sdmmc_cis.c,v 1.5 2010/08/24 14:52:23 blambert Exp $ */
/*
* Copyright (c) 2006 Uwe Stuehler <uwe@openbsd.org>
@@ -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, struct sdmmc_cis *cis)
u_int8_t tplcode;
u_int8_t tpllen;
- SDMMC_ASSERT_LOCKED(sf->sc);
+ rw_assert_wrlock(&sf->sc->sc_lock);
bzero(cis, sizeof *cis);
diff --git a/sys/dev/sdmmc/sdmmc_io.c b/sys/dev/sdmmc/sdmmc_io.c
index 815aac6beb8..b7137efb08e 100644
--- a/sys/dev/sdmmc/sdmmc_io.c
+++ b/sys/dev/sdmmc/sdmmc_io.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: sdmmc_io.c,v 1.18 2010/08/19 17:54:12 jasper Exp $ */
+/* $OpenBSD: sdmmc_io.c,v 1.19 2010/08/24 14:52:23 blambert Exp $ */
/*
* Copyright (c) 2006 Uwe Stuehler <uwe@openbsd.org>
@@ -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_function *sf)
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_function *sf)
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_function *sf)
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 *sc, struct sdmmc_function *sf,
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 *sc, struct sdmmc_function *sf,
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 *sc, struct sdmmc_function *sf,
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 *sf, int reg)
{
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 *sf, int reg)
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 *sf, int reg)
{
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 *sf, int reg)
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 *sf, int reg)
{
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 *sf, int reg)
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_function *sf, int reg, u_char *data,
{
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_function *sf, int reg, u_char *data,
{
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, struct sdmmc_function *sf,
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 *sc, u_int32_t ocr, u_int32_t *ocrp)
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 *sf)
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 *sf)
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);
}
/*
diff --git a/sys/dev/sdmmc/sdmmc_mem.c b/sys/dev/sdmmc/sdmmc_mem.c
index d135fb6b334..eb87d33ea4b 100644
--- a/sys/dev/sdmmc/sdmmc_mem.c
+++ b/sys/dev/sdmmc/sdmmc_mem.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: sdmmc_mem.c,v 1.15 2010/08/19 17:54:12 jasper Exp $ */
+/* $OpenBSD: sdmmc_mem.c,v 1.16 2010/08/24 14:52:23 blambert Exp $ */
/*
* Copyright (c) 2006 Uwe Stuehler <uwe@openbsd.org>
@@ -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, struct sdmmc_function *sf)
{
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_softc *sc, u_int32_t ocr,
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_softc *sc, struct sdmmc_function *sf)
{
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_function *sf, int blkno, u_char *data,
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_function *sf, int blkno, u_char *data,
} 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_function *sf, int blkno, u_char *data,
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_function *sf, int blkno, u_char *data,
} while (!ISSET(MMC_R1(cmd.c_resp), MMC_R1_READY_FOR_DATA));
err:
- SDMMC_UNLOCK(sc);
+ rw_exit(&sc->sc_lock);
return error;
}
diff --git a/sys/dev/sdmmc/sdmmc_scsi.c b/sys/dev/sdmmc/sdmmc_scsi.c
index de146606a9a..2393278b082 100644
--- a/sys/dev/sdmmc/sdmmc_scsi.c
+++ b/sys/dev/sdmmc/sdmmc_scsi.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: sdmmc_scsi.c,v 1.24 2010/08/19 17:54:12 jasper Exp $ */
+/* $OpenBSD: sdmmc_scsi.c,v 1.25 2010/08/24 14:52:23 blambert Exp $ */
/*
* Copyright (c) 2006 Uwe Stuehler <uwe@openbsd.org>
@@ -97,7 +97,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);
@@ -159,7 +159,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)
diff --git a/sys/dev/sdmmc/sdmmcvar.h b/sys/dev/sdmmc/sdmmcvar.h
index 169ac764677..3b59d39fc8a 100644
--- a/sys/dev/sdmmc/sdmmcvar.h
+++ b/sys/dev/sdmmc/sdmmcvar.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: sdmmcvar.h,v 1.17 2010/08/19 17:54:12 jasper Exp $ */
+/* $OpenBSD: sdmmcvar.h,v 1.18 2010/08/24 14:52:23 blambert Exp $ */
/*
* Copyright (c) 2006 Uwe Stuehler <uwe@openbsd.org>
@@ -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 *);