svn commit: r338280 - head/sys/dev/mmc

Marius Strobl marius at FreeBSD.org
Thu Aug 23 21:26:59 UTC 2018


Author: marius
Date: Thu Aug 23 21:26:58 2018
New Revision: 338280
URL: https://svnweb.freebsd.org/changeset/base/338280

Log:
  - Use le32dec(9) for decoding EXT_CSD values where it makes sense. [1]
  - Locally cache some instance variable values in mmc_discover_cards()
    in order to improve the code readability a bit.
  
  Obtained from:	NetBSD [1]

Modified:
  head/sys/dev/mmc/mmc.c
  head/sys/dev/mmc/mmcsd.c

Modified: head/sys/dev/mmc/mmc.c
==============================================================================
--- head/sys/dev/mmc/mmc.c	Thu Aug 23 21:24:22 2018	(r338279)
+++ head/sys/dev/mmc/mmc.c	Thu Aug 23 21:26:58 2018	(r338280)
@@ -1586,10 +1586,12 @@ mmc_discover_cards(struct mmc_softc *sc)
 	uint32_t raw_cid[4];
 	struct mmc_ivars *ivar = NULL;
 	const struct mmc_quirk *quirk;
+	const uint8_t *ext_csd;
 	device_t child;
 	int err, host_caps, i, newcard;
 	uint32_t resp, sec_count, status;
 	uint16_t rca = 2;
+	uint8_t card_type;
 
 	host_caps = mmcbr_get_caps(sc->dev);
 	if (bootverbose || mmc_debug)
@@ -1786,11 +1788,9 @@ mmc_discover_cards(struct mmc_softc *sc)
 				    "Error reading EXT_CSD %d\n", err);
 				goto free_ivar;
 			}
+			ext_csd = ivar->raw_ext_csd;
 			/* Handle extended capacity from EXT_CSD */
-			sec_count = ivar->raw_ext_csd[EXT_CSD_SEC_CNT] +
-			    (ivar->raw_ext_csd[EXT_CSD_SEC_CNT + 1] << 8) +
-			    (ivar->raw_ext_csd[EXT_CSD_SEC_CNT + 2] << 16) +
-			    (ivar->raw_ext_csd[EXT_CSD_SEC_CNT + 3] << 24);
+			sec_count = le32dec(&ext_csd[EXT_CSD_SEC_CNT]);
 			if (sec_count != 0) {
 				ivar->sec_count = sec_count;
 				ivar->high_cap = 1;
@@ -1798,65 +1798,56 @@ mmc_discover_cards(struct mmc_softc *sc)
 			/* Find maximum supported bus width. */
 			ivar->bus_width = mmc_test_bus_width(sc);
 			/* Get device speeds beyond normal mode. */
-			if ((ivar->raw_ext_csd[EXT_CSD_CARD_TYPE] &
-			    EXT_CSD_CARD_TYPE_HS_52) != 0) {
+			card_type = ext_csd[EXT_CSD_CARD_TYPE];
+			if ((card_type & EXT_CSD_CARD_TYPE_HS_52) != 0) {
 				setbit(&ivar->timings, bus_timing_hs);
 				ivar->hs_tran_speed = MMC_TYPE_HS_52_MAX;
-			} else if ((ivar->raw_ext_csd[EXT_CSD_CARD_TYPE] &
-			    EXT_CSD_CARD_TYPE_HS_26) != 0) {
+			} else if ((card_type & EXT_CSD_CARD_TYPE_HS_26) != 0) {
 				setbit(&ivar->timings, bus_timing_hs);
 				ivar->hs_tran_speed = MMC_TYPE_HS_26_MAX;
 			}
-			if ((ivar->raw_ext_csd[EXT_CSD_CARD_TYPE] &
-			    EXT_CSD_CARD_TYPE_DDR_52_1_2V) != 0 &&
+			if ((card_type & EXT_CSD_CARD_TYPE_DDR_52_1_2V) != 0 &&
 			    (host_caps & MMC_CAP_SIGNALING_120) != 0) {
 				setbit(&ivar->timings, bus_timing_mmc_ddr52);
 				setbit(&ivar->vccq_120, bus_timing_mmc_ddr52);
 			}
-			if ((ivar->raw_ext_csd[EXT_CSD_CARD_TYPE] &
-			    EXT_CSD_CARD_TYPE_DDR_52_1_8V) != 0 &&
+			if ((card_type & EXT_CSD_CARD_TYPE_DDR_52_1_8V) != 0 &&
 			    (host_caps & MMC_CAP_SIGNALING_180) != 0) {
 				setbit(&ivar->timings, bus_timing_mmc_ddr52);
 				setbit(&ivar->vccq_180, bus_timing_mmc_ddr52);
 			}
-			if ((ivar->raw_ext_csd[EXT_CSD_CARD_TYPE] &
-			    EXT_CSD_CARD_TYPE_HS200_1_2V) != 0 &&
+			if ((card_type & EXT_CSD_CARD_TYPE_HS200_1_2V) != 0 &&
 			    (host_caps & MMC_CAP_SIGNALING_120) != 0) {
 				setbit(&ivar->timings, bus_timing_mmc_hs200);
 				setbit(&ivar->vccq_120, bus_timing_mmc_hs200);
 			}
-			if ((ivar->raw_ext_csd[EXT_CSD_CARD_TYPE] &
-			    EXT_CSD_CARD_TYPE_HS200_1_8V) != 0 &&
+			if ((card_type & EXT_CSD_CARD_TYPE_HS200_1_8V) != 0 &&
 			    (host_caps & MMC_CAP_SIGNALING_180) != 0) {
 				setbit(&ivar->timings, bus_timing_mmc_hs200);
 				setbit(&ivar->vccq_180, bus_timing_mmc_hs200);
 			}
-			if ((ivar->raw_ext_csd[EXT_CSD_CARD_TYPE] &
-			    EXT_CSD_CARD_TYPE_HS400_1_2V) != 0 &&
+			if ((card_type & EXT_CSD_CARD_TYPE_HS400_1_2V) != 0 &&
 			    (host_caps & MMC_CAP_SIGNALING_120) != 0 &&
 			    ivar->bus_width == bus_width_8) {
 				setbit(&ivar->timings, bus_timing_mmc_hs400);
 				setbit(&ivar->vccq_120, bus_timing_mmc_hs400);
 			}
-			if ((ivar->raw_ext_csd[EXT_CSD_CARD_TYPE] &
-			    EXT_CSD_CARD_TYPE_HS400_1_8V) != 0 &&
+			if ((card_type & EXT_CSD_CARD_TYPE_HS400_1_8V) != 0 &&
 			    (host_caps & MMC_CAP_SIGNALING_180) != 0 &&
 			    ivar->bus_width == bus_width_8) {
 				setbit(&ivar->timings, bus_timing_mmc_hs400);
 				setbit(&ivar->vccq_180, bus_timing_mmc_hs400);
 			}
-			if ((ivar->raw_ext_csd[EXT_CSD_CARD_TYPE] &
-			    EXT_CSD_CARD_TYPE_HS400_1_2V) != 0 &&
-			    (ivar->raw_ext_csd[EXT_CSD_STROBE_SUPPORT] &
+			if ((card_type & EXT_CSD_CARD_TYPE_HS400_1_2V) != 0 &&
+			    (ext_csd[EXT_CSD_STROBE_SUPPORT] &
 			    EXT_CSD_STROBE_SUPPORT_EN) != 0 &&
 			    (host_caps & MMC_CAP_SIGNALING_120) != 0 &&
 			    ivar->bus_width == bus_width_8) {
 				setbit(&ivar->timings, bus_timing_mmc_hs400es);
 				setbit(&ivar->vccq_120, bus_timing_mmc_hs400es);
 			}
-			if ((ivar->raw_ext_csd[EXT_CSD_CARD_TYPE] &
-			    EXT_CSD_CARD_TYPE_HS400_1_8V) != 0 &&
-			    (ivar->raw_ext_csd[EXT_CSD_STROBE_SUPPORT] &
+			if ((card_type & EXT_CSD_CARD_TYPE_HS400_1_8V) != 0 &&
+			    (ext_csd[EXT_CSD_STROBE_SUPPORT] &
 			    EXT_CSD_STROBE_SUPPORT_EN) != 0 &&
 			    (host_caps & MMC_CAP_SIGNALING_180) != 0 &&
 			    ivar->bus_width == bus_width_8) {
@@ -1868,13 +1859,13 @@ mmc_discover_cards(struct mmc_softc *sc)
 			 * units of 10 ms), defaulting to 500 ms.
 			 */
 			ivar->cmd6_time = 500 * 1000;
-			if (ivar->raw_ext_csd[EXT_CSD_REV] >= 6)
+			if (ext_csd[EXT_CSD_REV] >= 6)
 				ivar->cmd6_time = 10 *
-				    ivar->raw_ext_csd[EXT_CSD_GEN_CMD6_TIME];
+				    ext_csd[EXT_CSD_GEN_CMD6_TIME];
 			/* Handle HC erase sector size. */
-			if (ivar->raw_ext_csd[EXT_CSD_ERASE_GRP_SIZE] != 0) {
+			if (ext_csd[EXT_CSD_ERASE_GRP_SIZE] != 0) {
 				ivar->erase_sector = 1024 *
-				    ivar->raw_ext_csd[EXT_CSD_ERASE_GRP_SIZE];
+				    ext_csd[EXT_CSD_ERASE_GRP_SIZE];
 				err = mmc_switch(sc->dev, sc->dev, ivar->rca,
 				    EXT_CSD_CMD_SET_NORMAL,
 				    EXT_CSD_ERASE_GRP_DEF,
@@ -1890,7 +1881,7 @@ mmc_discover_cards(struct mmc_softc *sc)
 		}
 
 		mmc_decode_cid_mmc(ivar->raw_cid, &ivar->cid,
-		    ivar->raw_ext_csd[EXT_CSD_REV] >= 5);
+		    ext_csd[EXT_CSD_REV] >= 5);
 
 child_common:
 		for (quirk = &mmc_quirks[0]; quirk->mid != 0x0; quirk++) {

Modified: head/sys/dev/mmc/mmcsd.c
==============================================================================
--- head/sys/dev/mmc/mmcsd.c	Thu Aug 23 21:24:22 2018	(r338279)
+++ head/sys/dev/mmc/mmcsd.c	Thu Aug 23 21:26:58 2018	(r338280)
@@ -61,6 +61,7 @@ __FBSDID("$FreeBSD$");
 #include <sys/bio.h>
 #include <sys/bus.h>
 #include <sys/conf.h>
+#include <sys/endian.h>
 #include <sys/fcntl.h>
 #include <sys/ioccom.h>
 #include <sys/kernel.h>
@@ -312,10 +313,7 @@ mmcsd_attach(device_t dev)
 	 * disabled.
 	 */
 	if (rev >= 6 && mmcsd_cache != 0) {
-		size = ext_csd[EXT_CSD_CACHE_SIZE] |
-		    ext_csd[EXT_CSD_CACHE_SIZE + 1] << 8 |
-		    ext_csd[EXT_CSD_CACHE_SIZE + 2] << 16 |
-		    ext_csd[EXT_CSD_CACHE_SIZE + 3] << 24;
+		size = le32dec(&ext_csd[EXT_CSD_CACHE_SIZE]);
 		if (bootverbose)
 			device_printf(dev, "cache size %juKB\n", size);
 		if (size > 0) {
@@ -361,10 +359,8 @@ mmcsd_attach(device_t dev)
 		size *= erase_size * wp_size;
 		if (size != mmc_get_media_size(dev) * sector_size) {
 			sc->enh_size = size;
-			sc->enh_base = (ext_csd[EXT_CSD_ENH_START_ADDR] +
-			    (ext_csd[EXT_CSD_ENH_START_ADDR + 1] << 8) +
-			    (ext_csd[EXT_CSD_ENH_START_ADDR + 2] << 16) +
-			    (ext_csd[EXT_CSD_ENH_START_ADDR + 3] << 24)) *
+			sc->enh_base =
+			    le32dec(&ext_csd[EXT_CSD_ENH_START_ADDR]) *
 			    (sc->high_cap == 0 ? MMC_SECTOR_SIZE : 1);
 		} else if (bootverbose)
 			device_printf(dev,


More information about the svn-src-head mailing list