Sat Apr 29 13:21:31 2023 UTC ()
sdmmc: Only check chipset WP status for SD cards.

The sdmmc_chip_write_protect callback returns the write protect switch
status from the controller (SDWP#). This signal does not exist for eMMC;
instead, write protect is signaled using card registers (CSD). So lets
skip asking the chipset for WP status on eMMC cards for each write
request.


(jmcneill)
diff -r1.74 -r1.75 src/sys/dev/sdmmc/sdmmc_mem.c

cvs diff -r1.74 -r1.75 src/sys/dev/sdmmc/sdmmc_mem.c (expand / switch to unified diff)

--- src/sys/dev/sdmmc/sdmmc_mem.c 2021/08/03 07:54:39 1.74
+++ src/sys/dev/sdmmc/sdmmc_mem.c 2023/04/29 13:21:31 1.75
@@ -1,14 +1,14 @@ @@ -1,14 +1,14 @@
1/* $NetBSD: sdmmc_mem.c,v 1.74 2021/08/03 07:54:39 msaitoh Exp $ */ 1/* $NetBSD: sdmmc_mem.c,v 1.75 2023/04/29 13:21:31 jmcneill Exp $ */
2/* $OpenBSD: sdmmc_mem.c,v 1.10 2009/01/09 10:55:22 jsg Exp $ */ 2/* $OpenBSD: sdmmc_mem.c,v 1.10 2009/01/09 10:55:22 jsg Exp $ */
3 3
4/* 4/*
5 * Copyright (c) 2006 Uwe Stuehler <uwe@openbsd.org> 5 * Copyright (c) 2006 Uwe Stuehler <uwe@openbsd.org>
6 * 6 *
7 * Permission to use, copy, modify, and distribute this software for any 7 * Permission to use, copy, modify, and distribute this software for any
8 * purpose with or without fee is hereby granted, provided that the above 8 * purpose with or without fee is hereby granted, provided that the above
9 * copyright notice and this permission notice appear in all copies. 9 * copyright notice and this permission notice appear in all copies.
10 * 10 *
11 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 11 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
12 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 12 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
13 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 13 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
14 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 14 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
@@ -35,27 +35,27 @@ @@ -35,27 +35,27 @@
35 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 35 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
36 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 36 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
37 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 37 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
38 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 38 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
39 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 39 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
40 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 40 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
41 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 41 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
42 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 42 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
43 */ 43 */
44 44
45/* Routines for SD/MMC memory cards. */ 45/* Routines for SD/MMC memory cards. */
46 46
47#include <sys/cdefs.h> 47#include <sys/cdefs.h>
48__KERNEL_RCSID(0, "$NetBSD: sdmmc_mem.c,v 1.74 2021/08/03 07:54:39 msaitoh Exp $"); 48__KERNEL_RCSID(0, "$NetBSD: sdmmc_mem.c,v 1.75 2023/04/29 13:21:31 jmcneill Exp $");
49 49
50#ifdef _KERNEL_OPT 50#ifdef _KERNEL_OPT
51#include "opt_sdmmc.h" 51#include "opt_sdmmc.h"
52#endif 52#endif
53 53
54#include <sys/param.h> 54#include <sys/param.h>
55#include <sys/kernel.h> 55#include <sys/kernel.h>
56#include <sys/malloc.h> 56#include <sys/malloc.h>
57#include <sys/systm.h> 57#include <sys/systm.h>
58#include <sys/device.h> 58#include <sys/device.h>
59#include <sys/bitops.h> 59#include <sys/bitops.h>
60#include <sys/evcnt.h> 60#include <sys/evcnt.h>
61 61
@@ -2115,27 +2115,28 @@ out: @@ -2115,27 +2115,28 @@ out:
2115 return error; 2115 return error;
2116} 2116}
2117 2117
2118int 2118int
2119sdmmc_mem_write_block(struct sdmmc_function *sf, uint32_t blkno, u_char *data, 2119sdmmc_mem_write_block(struct sdmmc_function *sf, uint32_t blkno, u_char *data,
2120 size_t datalen) 2120 size_t datalen)
2121{ 2121{
2122 struct sdmmc_softc *sc = sf->sc; 2122 struct sdmmc_softc *sc = sf->sc;
2123 int error; 2123 int error;
2124 2124
2125 SDMMC_LOCK(sc); 2125 SDMMC_LOCK(sc);
2126 mutex_enter(&sc->sc_mtx); 2126 mutex_enter(&sc->sc_mtx);
2127 2127
2128 if (sdmmc_chip_write_protect(sc->sc_sct, sc->sc_sch)) { 2128 if (ISSET(sc->sc_flags, SMF_SD_MODE) &&
 2129 sdmmc_chip_write_protect(sc->sc_sct, sc->sc_sch)) {
2129 aprint_normal_dev(sc->sc_dev, "write-protected\n"); 2130 aprint_normal_dev(sc->sc_dev, "write-protected\n");
2130 error = EIO; 2131 error = EIO;
2131 goto out; 2132 goto out;
2132 } 2133 }
2133 2134
2134 if (ISSET(sc->sc_caps, SMC_CAPS_SINGLE_ONLY)) { 2135 if (ISSET(sc->sc_caps, SMC_CAPS_SINGLE_ONLY)) {
2135 error = sdmmc_mem_single_write_block(sf, blkno, data, datalen); 2136 error = sdmmc_mem_single_write_block(sf, blkno, data, datalen);
2136 goto out; 2137 goto out;
2137 } 2138 }
2138 2139
2139 if (!ISSET(sc->sc_caps, SMC_CAPS_DMA)) { 2140 if (!ISSET(sc->sc_caps, SMC_CAPS_DMA)) {
2140 error = sdmmc_mem_write_block_subr(sf, sc->sc_dmap, blkno, data, 2141 error = sdmmc_mem_write_block_subr(sf, sc->sc_dmap, blkno, data,
2141 datalen); 2142 datalen);