Sun Mar 13 09:12:16 2016 UTC ()
Call the second sdmmc_mem_send_if_cond() only where it's necessary.

This makes SMC_CAPS_SPI_MODE devices (currently evbsh3 only) work again.
"Maybe ok" from nonaka@.


(tsutsui)
diff -r1.50 -r1.51 src/sys/dev/sdmmc/sdmmc_mem.c

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

--- src/sys/dev/sdmmc/sdmmc_mem.c 2015/12/22 09:56:06 1.50
+++ src/sys/dev/sdmmc/sdmmc_mem.c 2016/03/13 09:12:16 1.51
@@ -1,14 +1,14 @@ @@ -1,14 +1,14 @@
1/* $NetBSD: sdmmc_mem.c,v 1.50 2015/12/22 09:56:06 mlelstv Exp $ */ 1/* $NetBSD: sdmmc_mem.c,v 1.51 2016/03/13 09:12:16 tsutsui 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.50 2015/12/22 09:56:06 mlelstv Exp $"); 48__KERNEL_RCSID(0, "$NetBSD: sdmmc_mem.c,v 1.51 2016/03/13 09:12:16 tsutsui 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
@@ -188,35 +188,34 @@ mmc_mode: @@ -188,35 +188,34 @@ mmc_mode:
188 goto out; 188 goto out;
189 } 189 }
190 } 190 }
191 191
192 /* Set the lowest voltage supported by the card and host. */ 192 /* Set the lowest voltage supported by the card and host. */
193 host_ocr = sdmmc_chip_host_ocr(sc->sc_sct, sc->sc_sch); 193 host_ocr = sdmmc_chip_host_ocr(sc->sc_sct, sc->sc_sch);
194 error = sdmmc_set_bus_power(sc, host_ocr, card_ocr); 194 error = sdmmc_set_bus_power(sc, host_ocr, card_ocr);
195 if (error) { 195 if (error) {
196 DPRINTF(("%s: couldn't supply voltage requested by card\n", 196 DPRINTF(("%s: couldn't supply voltage requested by card\n",
197 SDMMCDEVNAME(sc))); 197 SDMMCDEVNAME(sc)));
198 goto out; 198 goto out;
199 } 199 }
200 200
201 /* Tell the card(s) to enter the idle state (again). */ 
202 sdmmc_go_idle_state(sc); 
203 
204 DPRINTF(("%s: host_ocr 0x%08x\n", SDMMCDEVNAME(sc), host_ocr)); 201 DPRINTF(("%s: host_ocr 0x%08x\n", SDMMCDEVNAME(sc), host_ocr));
205 DPRINTF(("%s: card_ocr 0x%08x\n", SDMMCDEVNAME(sc), card_ocr)); 202 DPRINTF(("%s: card_ocr 0x%08x\n", SDMMCDEVNAME(sc), card_ocr));
206 203
207 host_ocr &= card_ocr; /* only allow the common voltages */ 204 host_ocr &= card_ocr; /* only allow the common voltages */
208 if (!ISSET(sc->sc_caps, SMC_CAPS_SPI_MODE)) { 205 if (!ISSET(sc->sc_caps, SMC_CAPS_SPI_MODE)) {
209 if (ISSET(sc->sc_flags, SMF_SD_MODE)) { 206 if (ISSET(sc->sc_flags, SMF_SD_MODE)) {
 207 /* Tell the card(s) to enter the idle state (again). */
 208 sdmmc_go_idle_state(sc);
210 /* Check SD Ver.2 */ 209 /* Check SD Ver.2 */
211 error = sdmmc_mem_send_if_cond(sc, 0x1aa, &card_ocr); 210 error = sdmmc_mem_send_if_cond(sc, 0x1aa, &card_ocr);
212 if (error == 0 && card_ocr == 0x1aa) 211 if (error == 0 && card_ocr == 0x1aa)
213 SET(ocr, MMC_OCR_HCS); 212 SET(ocr, MMC_OCR_HCS);
214 213
215 if (sdmmc_chip_host_ocr(sc->sc_sct, sc->sc_sch) & MMC_OCR_S18A) 214 if (sdmmc_chip_host_ocr(sc->sc_sct, sc->sc_sch) & MMC_OCR_S18A)
216 SET(ocr, MMC_OCR_S18A); 215 SET(ocr, MMC_OCR_S18A);
217 } else { 216 } else {
218 SET(ocr, MMC_OCR_ACCESS_MODE_SECTOR); 217 SET(ocr, MMC_OCR_ACCESS_MODE_SECTOR);
219 } 218 }
220 } 219 }
221 host_ocr |= ocr; 220 host_ocr |= ocr;
222 221