Module Name: src Committed By: nonaka Date: Sun Feb 13 06:43:52 UTC 2011
Modified Files: src/sys/dev/marvell: mvsdio.c src/sys/dev/sdmmc: sdmmc.c sdmmc_io.c sdmmc_mem.c sdmmcreg.h sdmmcvar.h Log Message: - Don't switch MMC high-speed timing, if host controller isn't supported. - Only check EXT_CSD STRUCTURE version when CSD version is 3. - initialize width at sdmmc_function_alloc(). To generate a diff of this commit: cvs rdiff -u -r1.3 -r1.4 src/sys/dev/marvell/mvsdio.c cvs rdiff -u -r1.7 -r1.8 src/sys/dev/sdmmc/sdmmc.c cvs rdiff -u -r1.5 -r1.6 src/sys/dev/sdmmc/sdmmc_io.c \ src/sys/dev/sdmmc/sdmmcreg.h cvs rdiff -u -r1.15 -r1.16 src/sys/dev/sdmmc/sdmmc_mem.c cvs rdiff -u -r1.9 -r1.10 src/sys/dev/sdmmc/sdmmcvar.h Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/dev/marvell/mvsdio.c diff -u src/sys/dev/marvell/mvsdio.c:1.3 src/sys/dev/marvell/mvsdio.c:1.4 --- src/sys/dev/marvell/mvsdio.c:1.3 Sat Feb 5 15:45:21 2011 +++ src/sys/dev/marvell/mvsdio.c Sun Feb 13 06:43:51 2011 @@ -1,4 +1,4 @@ -/* $NetBSD: mvsdio.c,v 1.3 2011/02/05 15:45:21 nonaka Exp $ */ +/* $NetBSD: mvsdio.c,v 1.4 2011/02/13 06:43:51 nonaka Exp $ */ /* * Copyright (c) 2010 KIYOHARA Takashi * All rights reserved. @@ -25,7 +25,7 @@ * POSSIBILITY OF SUCH DAMAGE. */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: mvsdio.c,v 1.3 2011/02/05 15:45:21 nonaka Exp $"); +__KERNEL_RCSID(0, "$NetBSD: mvsdio.c,v 1.4 2011/02/13 06:43:51 nonaka Exp $"); #include "opt_mvsdio.h" @@ -239,7 +239,7 @@ saa.saa_clkmin = 100; /* XXXX: 100 kHz from SheevaPlug LSP */ saa.saa_clkmax = MVSDIO_MAX_CLOCK; saa.saa_caps = SMC_CAPS_AUTO_STOP | SMC_CAPS_4BIT_MODE | SMC_CAPS_DMA | - SMC_CAPS_SD_HIGHSPEED; + SMC_CAPS_SD_HIGHSPEED | SMC_CAPS_MMC_HIGHSPEED; #ifndef MVSDIO_CARD_DETECT saa.saa_caps |= SMC_CAPS_POLL_CARD_DET; #endif Index: src/sys/dev/sdmmc/sdmmc.c diff -u src/sys/dev/sdmmc/sdmmc.c:1.7 src/sys/dev/sdmmc/sdmmc.c:1.8 --- src/sys/dev/sdmmc/sdmmc.c:1.7 Sat Feb 5 15:45:21 2011 +++ src/sys/dev/sdmmc/sdmmc.c Sun Feb 13 06:43:51 2011 @@ -1,4 +1,4 @@ -/* $NetBSD: sdmmc.c,v 1.7 2011/02/05 15:45:21 nonaka Exp $ */ +/* $NetBSD: sdmmc.c,v 1.8 2011/02/13 06:43:51 nonaka Exp $ */ /* $OpenBSD: sdmmc.c,v 1.18 2009/01/09 10:58:38 jsg Exp $ */ /* @@ -50,7 +50,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: sdmmc.c,v 1.7 2011/02/05 15:45:21 nonaka Exp $"); +__KERNEL_RCSID(0, "$NetBSD: sdmmc.c,v 1.8 2011/02/13 06:43:51 nonaka Exp $"); #include <sys/param.h> #include <sys/device.h> @@ -576,6 +576,7 @@ sf->cis.manufacturer = SDMMC_VENDOR_INVALID; sf->cis.product = SDMMC_PRODUCT_INVALID; sf->cis.function = SDMMC_FUNCTION_INVALID; + sf->width = 1; if (ISSET(sc->sc_flags, SMF_MEM_MODE) && ISSET(sc->sc_caps, SMC_CAPS_DMA) && Index: src/sys/dev/sdmmc/sdmmc_io.c diff -u src/sys/dev/sdmmc/sdmmc_io.c:1.5 src/sys/dev/sdmmc/sdmmc_io.c:1.6 --- src/sys/dev/sdmmc/sdmmc_io.c:1.5 Thu Oct 7 12:40:34 2010 +++ src/sys/dev/sdmmc/sdmmc_io.c Sun Feb 13 06:43:52 2011 @@ -1,4 +1,4 @@ -/* $NetBSD: sdmmc_io.c,v 1.5 2010/10/07 12:40:34 kiyohara Exp $ */ +/* $NetBSD: sdmmc_io.c,v 1.6 2011/02/13 06:43:52 nonaka Exp $ */ /* $OpenBSD: sdmmc_io.c,v 1.10 2007/09/17 01:33:33 krw Exp $ */ /* @@ -20,7 +20,7 @@ /* Routines for SD I/O cards. */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: sdmmc_io.c,v 1.5 2010/10/07 12:40:34 kiyohara Exp $"); +__KERNEL_RCSID(0, "$NetBSD: sdmmc_io.c,v 1.6 2011/02/13 06:43:52 nonaka Exp $"); #include <sys/param.h> #include <sys/kernel.h> @@ -194,7 +194,6 @@ SDMMC_LOCK(sc); if (sf->number == 0) { - sf->width = 1; reg = sdmmc_io_read_1(sf, SD_IO_CCCR_CAPABILITY); if (!(reg & CCCR_CAPS_LSC) || (reg & CCCR_CAPS_4BLS)) { sdmmc_io_write_1(sf, SD_IO_CCCR_BUS_WIDTH, Index: src/sys/dev/sdmmc/sdmmcreg.h diff -u src/sys/dev/sdmmc/sdmmcreg.h:1.5 src/sys/dev/sdmmc/sdmmcreg.h:1.6 --- src/sys/dev/sdmmc/sdmmcreg.h:1.5 Thu Oct 7 12:24:23 2010 +++ src/sys/dev/sdmmc/sdmmcreg.h Sun Feb 13 06:43:52 2011 @@ -1,4 +1,4 @@ -/* $NetBSD: sdmmcreg.h,v 1.5 2010/10/07 12:24:23 kiyohara Exp $ */ +/* $NetBSD: sdmmcreg.h,v 1.6 2011/02/13 06:43:52 nonaka Exp $ */ /* $OpenBSD: sdmmcreg.h,v 1.4 2009/01/09 10:55:22 jsg Exp $ */ /* @@ -162,14 +162,15 @@ /* MMC R2 response (CSD) */ #define MMC_CSD_CSDVER(resp) MMC_RSP_BITS((resp), 126, 2) -#define MMC_CSD_CSDVER_1_0 1 -#define MMC_CSD_CSDVER_2_0 2 +#define MMC_CSD_CSDVER_1_0 0 +#define MMC_CSD_CSDVER_1_1 1 +#define MMC_CSD_CSDVER_1_2 2 /* MMC 4.1 - 4.2 - 4.3 */ #define MMC_CSD_MMCVER(resp) MMC_RSP_BITS((resp), 122, 4) #define MMC_CSD_MMCVER_1_0 0 /* MMC 1.0 - 1.2 */ #define MMC_CSD_MMCVER_1_4 1 /* MMC 1.4 */ #define MMC_CSD_MMCVER_2_0 2 /* MMC 2.0 - 2.2 */ #define MMC_CSD_MMCVER_3_1 3 /* MMC 3.1 - 3.3 */ -#define MMC_CSD_MMCVER_4_0 4 /* MMC 4 */ +#define MMC_CSD_MMCVER_4_0 4 /* MMC 4.1 - 4.2 - 4.3 */ #define MMC_CSD_TAAC(resp) MMC_RSP_BITS((resp), 112, 8) #define MMC_CSD_TAAC_MANT(resp) MMC_RSP_BITS((resp), 115, 4) #define MMC_CSD_TAAC_EXP(resp) MMC_RSP_BITS((resp), 112, 3) Index: src/sys/dev/sdmmc/sdmmc_mem.c diff -u src/sys/dev/sdmmc/sdmmc_mem.c:1.15 src/sys/dev/sdmmc/sdmmc_mem.c:1.16 --- src/sys/dev/sdmmc/sdmmc_mem.c:1.15 Sat Feb 5 15:45:21 2011 +++ src/sys/dev/sdmmc/sdmmc_mem.c Sun Feb 13 06:43:52 2011 @@ -1,4 +1,4 @@ -/* $NetBSD: sdmmc_mem.c,v 1.15 2011/02/05 15:45:21 nonaka Exp $ */ +/* $NetBSD: sdmmc_mem.c,v 1.16 2011/02/13 06:43:52 nonaka Exp $ */ /* $OpenBSD: sdmmc_mem.c,v 1.10 2009/01/09 10:55:22 jsg Exp $ */ /* @@ -46,7 +46,7 @@ /* Routines for SD/MMC memory cards. */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: sdmmc_mem.c,v 1.15 2011/02/05 15:45:21 nonaka Exp $"); +__KERNEL_RCSID(0, "$NetBSD: sdmmc_mem.c,v 1.16 2011/02/13 06:43:52 nonaka Exp $"); #include <sys/param.h> #include <sys/kernel.h> @@ -342,8 +342,7 @@ csd->tran_speed = speed_exponent[e] * speed_mantissa[m] / 10; } else { csd->csdver = MMC_CSD_CSDVER(resp); - if (csd->csdver != MMC_CSD_CSDVER_1_0 && - csd->csdver != MMC_CSD_CSDVER_2_0) { + if (csd->csdver == MMC_CSD_CSDVER_1_0) { aprint_error_dev(sc->sc_dev, "unknown MMC CSD structure version 0x%x\n", csd->csdver); @@ -618,8 +617,6 @@ return error; } sf->width = 4; - } else { - sf->width = 1; } if (sf->scr.sd_spec >= SCR_SD_SPEC_VER_1_10 && @@ -688,9 +685,11 @@ aprint_error_dev(sc->sc_dev, "can't read EXT_CSD\n"); return error; } - if (ext_csd[EXT_CSD_STRUCTURE] > EXT_CSD_STRUCTURE_VER_1_2) { + if ((sf->csd.csdver == 3) && + (ext_csd[EXT_CSD_STRUCTURE] > EXT_CSD_STRUCTURE_VER_1_2)) { aprint_error_dev(sc->sc_dev, - "unrecognised future version\n"); + "unrecognised future version (%d)\n", + ext_csd[EXT_CSD_STRUCTURE]); return error; } hs_timing = 0; @@ -702,7 +701,19 @@ case EXT_CSD_CARD_TYPE_52M | EXT_CSD_CARD_TYPE_26M: sf->csd.tran_speed = 52000; /* 52MHz */ hs_timing = 1; + break; + default: + aprint_error_dev(sc->sc_dev, + "unknwon CARD_TYPE: 0x%x\n", + ext_csd[EXT_CSD_CARD_TYPE]); + return error; + } + + if (!ISSET(sc->sc_caps, SMC_CAPS_MMC_HIGHSPEED)) { + hs_timing = 0; + } + if (hs_timing) { error = sdmmc_mem_mmc_switch(sf, EXT_CSD_CMD_SET_NORMAL, EXT_CSD_HS_TIMING, hs_timing); if (error) { @@ -710,14 +721,8 @@ "can't change high speed\n"); return error; } - break; - - default: - aprint_error_dev(sc->sc_dev, - "unknwon CARD_TYPE: 0x%x\n", - ext_csd[EXT_CSD_CARD_TYPE]); - return error; } + if (sc->sc_busclk > sf->csd.tran_speed) sc->sc_busclk = sf->csd.tran_speed; error = @@ -727,6 +732,7 @@ "can't change bus clock\n"); return error; } + if (hs_timing) { error = sdmmc_mem_send_cxd_data(sc, MMC_SEND_EXT_CSD, ext_csd, sizeof(ext_csd)); @@ -778,7 +784,6 @@ "can't change bus clock\n"); return error; } - sf->width = 1; } return 0; @@ -993,6 +998,9 @@ BUS_DMASYNC_POSTREAD); } memcpy(data, ptr, datalen); +#ifdef SDMMC_DEBUG + sdmmc_dump_data("CXD", data, datalen); +#endif } out: Index: src/sys/dev/sdmmc/sdmmcvar.h diff -u src/sys/dev/sdmmc/sdmmcvar.h:1.9 src/sys/dev/sdmmc/sdmmcvar.h:1.10 --- src/sys/dev/sdmmc/sdmmcvar.h:1.9 Sat Feb 5 15:45:21 2011 +++ src/sys/dev/sdmmc/sdmmcvar.h Sun Feb 13 06:43:52 2011 @@ -1,4 +1,4 @@ -/* $NetBSD: sdmmcvar.h,v 1.9 2011/02/05 15:45:21 nonaka Exp $ */ +/* $NetBSD: sdmmcvar.h,v 1.10 2011/02/13 06:43:52 nonaka Exp $ */ /* $OpenBSD: sdmmcvar.h,v 1.13 2009/01/09 10:55:22 jsg Exp $ */ /* @@ -220,6 +220,7 @@ #define SMC_CAPS_8BIT_MODE 0x0040 /* 8-bits data bus width */ #define SMC_CAPS_MULTI_SEG_DMA 0x0080 /* multiple segment DMA transfer */ #define SMC_CAPS_SD_HIGHSPEED 0x0100 /* SD high-speed timing */ +#define SMC_CAPS_MMC_HIGHSPEED 0x0200 /* MMC high-speed timing */ /* function */ int sc_function_count; /* number of I/O functions (SDIO) */