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

Warner Losh imp at FreeBSD.org
Sun Oct 12 07:24:31 UTC 2008


Author: imp
Date: Sun Oct 12 07:24:31 2008
New Revision: 183774
URL: http://svn.freebsd.org/changeset/base/183774

Log:
  Print the cards natural size.
  Move nested tertiary operator expressions into their own function.
  Remove extra blank line.
  cache sd->disk in 'd' to make the code easier to read.

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

Modified: head/sys/dev/mmc/mmcsd.c
==============================================================================
--- head/sys/dev/mmc/mmcsd.c	Sun Oct 12 06:58:03 2008	(r183773)
+++ head/sys/dev/mmc/mmcsd.c	Sun Oct 12 07:24:31 2008	(r183774)
@@ -93,6 +93,9 @@ static int mmcsd_close(struct disk *dp);
 static void mmcsd_strategy(struct bio *bp);
 static void mmcsd_task(void *arg);
 
+static const char *mmcsd_card_name(device_t dev);
+static int mmcsd_bus_bit_width(device_t dev);
+
 #define MMCSD_LOCK(_sc)		mtx_lock(&(_sc)->sc_mtx)
 #define	MMCSD_UNLOCK(_sc)	mtx_unlock(&(_sc)->sc_mtx)
 #define MMCSD_LOCK_INIT(_sc) \
@@ -115,34 +118,46 @@ static int
 mmcsd_attach(device_t dev)
 {
 	struct mmcsd_softc *sc;
+	struct disk *d;
+	intmax_t mb;
+	char unit;
 
 	sc = device_get_softc(dev);
 	sc->dev = dev;
 	MMCSD_LOCK_INIT(sc);
 
-	sc->disk = disk_alloc();
-	sc->disk->d_open = mmcsd_open;
-	sc->disk->d_close = mmcsd_close;
-	sc->disk->d_strategy = mmcsd_strategy;
-	// sc->disk->d_dump = mmcsd_dump;	Need polling mmc layer
-	sc->disk->d_name = "mmcsd";
-	sc->disk->d_drv1 = sc;
-	sc->disk->d_maxsize = MAXPHYS;		/* Maybe ask bridge? */
-	sc->disk->d_sectorsize = mmc_get_sector_size(dev);
-	sc->disk->d_mediasize = mmc_get_media_size(dev) *
-	    mmc_get_sector_size(dev);
-	sc->disk->d_unit = device_get_unit(dev);
-	
-	device_printf(dev, "%juMB <%s Memory Card>%s at %s %dMHz/%dbit\n",
-	    sc->disk->d_mediasize / 1048576,
-	    (mmc_get_card_type(dev) == mode_mmc)?"MMC":
-	    (mmc_get_high_cap(dev)?"SDHC":"SD"),
-	    mmc_get_read_only(dev)?" (read-only)":"",
-	    device_get_nameunit(device_get_parent(sc->dev)),
-	    mmc_get_tran_speed(dev)/1000000,
-	    (mmc_get_bus_width(dev) == bus_width_1)?1:
-	    ((mmc_get_bus_width(dev) == bus_width_4)?4:8));
-	disk_create(sc->disk, DISK_VERSION);
+	d = sc->disk = disk_alloc();
+	d->d_open = mmcsd_open;
+	d->d_close = mmcsd_close;
+	d->d_strategy = mmcsd_strategy;
+	// d->d_dump = mmcsd_dump;	Need polling mmc layer
+	d->d_name = "mmcsd";
+	d->d_drv1 = sc;
+	d->d_maxsize = MAXPHYS;		/* Maybe ask bridge? */
+	d->d_sectorsize = mmc_get_sector_size(dev);
+	d->d_mediasize = mmc_get_media_size(dev) * d->d_sectorsize;
+	d->d_unit = device_get_unit(dev);
+	/*
+	 * Display in most natural units.  There's no cards < 1MB.
+	 * The SD standard goes to 2GiB, but the data format supports
+	 * up to 4GiB and some card makers push it up to this limit.
+	 * The SDHC standard only goes to 32GiB (the data format in
+	 * SDHC is good to 2TiB however, which isn't too ugly at
+	 * 2048GiBm, so we note it in passing here and don't add the
+	 * code to print TiB).
+	 */
+	mb = d->d_mediasize >> 20;	/* 1MiB == 1 << 20 */
+	unit = 'M';
+	if (mb > 1024) {		/* 1GiB = 1024 MiB */
+		unit = 'G';
+		mb /= 1024;
+	}
+	device_printf(dev, "%ju%cB <%s Memory Card>%s at %s %dMHz/%dbit\n",
+	    mb, unit, mmcsd_card_name(dev),
+	    mmc_get_read_only(dev) ? " (read-only)" : "",
+	    device_get_nameunit(device_get_parent(dev)),
+	    mmc_get_tran_speed(dev) / 1000000, mmcsd_bus_bit_width(dev));
+	disk_create(d, DISK_VERSION);
 	bioq_init(&sc->bio_queue);
 
 	sc->running = 1;
@@ -306,6 +321,26 @@ mmcsd_task(void *arg)
 	kproc_exit(0);
 }
 
+static const char *
+mmcsd_card_name(device_t dev)
+{
+	if (mmc_get_card_type(dev) == mode_mmc)
+		return ("MMC");
+	if (mmc_get_high_cap(dev))
+		return ("SDHC");
+	return ("SD");
+}
+
+static int
+mmcsd_bus_bit_width(device_t dev)
+{
+	if (mmc_get_bus_width(dev) == bus_width_1)
+		return (1);
+	if (mmc_get_bus_width(dev) == bus_width_4)
+		return (4);
+	return (8);
+}
+
 static device_method_t mmcsd_methods[] = {
 	DEVMETHOD(device_probe, mmcsd_probe),
 	DEVMETHOD(device_attach, mmcsd_attach),
@@ -320,5 +355,4 @@ static driver_t mmcsd_driver = {
 };
 static devclass_t mmcsd_devclass;
 
-
 DRIVER_MODULE(mmcsd, mmc, mmcsd_driver, mmcsd_devclass, 0, 0);


More information about the svn-src-head mailing list