summaryrefslogtreecommitdiffstats
path: root/sys/dev/mmc/mmc.c
diff options
context:
space:
mode:
authorian <ian@FreeBSD.org>2014-07-31 16:54:54 +0000
committerian <ian@FreeBSD.org>2014-07-31 16:54:54 +0000
commit247a87cdab0fe70a30c73e81d5d634f5366f3c1e (patch)
treecabaea7ecb0221031ef5d14f345b5c38e5fb1a51 /sys/dev/mmc/mmc.c
parent3ae45206995c699d07d6d54d7ac06770461ca5ff (diff)
downloadFreeBSD-src-247a87cdab0fe70a30c73e81d5d634f5366f3c1e.zip
FreeBSD-src-247a87cdab0fe70a30c73e81d5d634f5366f3c1e.tar.gz
Export an mmc or sd card's serial number from the mmc layer as an ivar.
In the mmcsd layer use this value to populate disk->d_ident. Also set disk->d_descr to the full set of card identification info (includes vendor, model, manufacturing date, etc).
Diffstat (limited to 'sys/dev/mmc/mmc.c')
-rw-r--r--sys/dev/mmc/mmc.c11
1 files changed, 10 insertions, 1 deletions
diff --git a/sys/dev/mmc/mmc.c b/sys/dev/mmc/mmc.c
index 3d66c62..8b6e1a8 100644
--- a/sys/dev/mmc/mmc.c
+++ b/sys/dev/mmc/mmc.c
@@ -102,6 +102,7 @@ struct mmc_ivars {
uint32_t hs_tran_speed; /* Max speed in high speed mode */
uint32_t erase_sector; /* Card native erase sector size */
char card_id_string[64];/* Formatted CID info (serial, MFG, etc) */
+ char card_sn_string[16];/* Formatted serial # for disk->d_ident */
};
#define CMD_RETRIES 3
@@ -887,6 +888,9 @@ mmc_format_card_id_string(struct mmc_ivars *ivar)
* mmcsd0: 968MB <SD SD01G 8.0 SN 2686905 Mfg 08/2008 by 3 TN> at mmc0
* 22.5MHz/4bit/128-block
*
+ * Also format just the card serial number, which the mmcsd driver will
+ * use as the disk->d_ident string.
+ *
* The card_id_string in mmc_ivars is currently allocated as 64 bytes,
* and our max formatted length is currently 55 bytes if every field
* contains the largest value.
@@ -900,8 +904,10 @@ mmc_format_card_id_string(struct mmc_ivars *ivar)
snprintf(oidstr, sizeof(oidstr), "%c%c", c1, c2);
else
snprintf(oidstr, sizeof(oidstr), "0x%04x", ivar->cid.oid);
+ snprintf(ivar->card_sn_string, sizeof(ivar->card_sn_string),
+ "%08X", ivar->cid.psn);
snprintf(ivar->card_id_string, sizeof(ivar->card_id_string),
- "%s%s %s %d.%d SN %u MFG %02d/%04d by %d %s",
+ "%s%s %s %d.%d SN %08X MFG %02d/%04d by %d %s",
ivar->mode == mode_sd ? "SD" : "MMC", ivar->high_cap ? "HC" : "",
ivar->cid.pnm, ivar->cid.prv >> 4, ivar->cid.prv & 0x0f,
ivar->cid.psn, ivar->cid.mdt_month, ivar->cid.mdt_year,
@@ -1698,6 +1704,9 @@ mmc_read_ivar(device_t bus, device_t child, int which, uintptr_t *result)
case MMC_IVAR_CARD_ID_STRING:
*(char **)result = ivar->card_id_string;
break;
+ case MMC_IVAR_CARD_SN_STRING:
+ *(char **)result = ivar->card_sn_string;
+ break;
}
return (0);
}
OpenPOWER on IntegriCloud