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,
_______________________________________________
svn-src-all@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to