PERFORCE change 107238 for review

Warner Losh imp at FreeBSD.org
Tue Oct 3 22:23:24 PDT 2006


http://perforce.freebsd.org/chv.cgi?CH=107238

Change 107238 by imp at imp_lighthouse on 2006/10/04 05:22:50

	Keep track of the last selected card and short-circuit any
	attempt to select the card again.  Also, never deselect the card
	unless the bus code wants the mmc bus.
	
	This should save two command round trips per I/O.  Since we're
	doing 8k transfers, this saves us 2 of the 34 commands.  Not a
	lot, but every little bit helps.

Affected files ...

.. //depot/projects/arm/src/sys/dev/mmc/mmc.c#21 edit

Differences ...

==== //depot/projects/arm/src/sys/dev/mmc/mmc.c#21 (text+ko) ====

@@ -46,6 +46,7 @@
 	struct mtx sc_mtx;
 	struct intr_config_hook config_intrhook;
 	device_t owner;
+	uint32_t last_rca;
 };
 
 /*
@@ -124,6 +125,7 @@
 {
 	struct mmc_softc *sc;
 	int err;
+	int rca;
 
 	err = MMCBR_ACQUIRE_HOST(device_get_parent(busdev), dev);
 	if (err)
@@ -136,12 +138,26 @@
 	MMC_UNLOCK(sc);
 
 	if (busdev != dev) {
-		// XXX Should do lazy selection.
-		mmc_wait_for_command(sc, MMC_SELECT_CARD,
-		    mmc_get_rca(dev) << 16, MMC_RSP_R1 | MMC_CMD_AC,
-		    NULL, CMD_RETRIES);
+		// Keep track of the last rca that we've selected.  If
+		// we're asked to do it again, don't.  We never unselect
+		// unless the bus code itself wants the mmc bus.
+		rca = mmc_get_rca(dev);
+		if (sc->last_rca != rca) {
+			mmc_wait_for_command(sc, MMC_SELECT_CARD, rca << 16,
+			    MMC_RSP_R1 | MMC_CMD_AC, NULL, CMD_RETRIES);
+			sc->last_rca = rca;
+		}
+		// XXX should set bus width here?
+	} else {
+		// If there's a card selected, stand down.
+		if (sc->last_rca != 0) {
+			mmc_wait_for_command(sc, MMC_SELECT_CARD, 0,
+			    MMC_RSP_R1 | MMC_CMD_AC, NULL, CMD_RETRIES);
+			sc->last_rca = 0;
+		}
 		// XXX should set bus width here?
 	}
+
 	return (0);
 }
 
@@ -153,11 +169,6 @@
 
 	sc = device_get_softc(busdev);
 
-	if (busdev != dev) {
-		// XXX Should do lazy deselection.
-		mmc_wait_for_command(sc, MMC_DESELECT_CARD, 0,
-		    MMC_RSP_R1 | MMC_CMD_AC, NULL, CMD_RETRIES);
-	}
 	MMC_LOCK(sc);
 	if (!sc->owner)
 		panic("mmc: releasing unowned bus.");


More information about the p4-projects mailing list