PERFORCE change 106792 for review

Warner Losh imp at FreeBSD.org
Wed Sep 27 12:29:02 PDT 2006


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

Change 106792 by imp at imp_lighthouse on 2006/09/27 19:28:45

	more

Affected files ...

.. //depot/projects/arm/src/sys/dev/mmc/mmc.c#6 edit
.. //depot/projects/arm/src/sys/dev/mmc/mmcreg.h#7 edit

Differences ...

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

@@ -46,6 +46,8 @@
 	struct intr_config_hook config_intrhook;
 };
 
+#define CMD_RETRIES	3
+
 /* bus entry points */
 static int mmc_probe(device_t dev);
 static int mmc_attach(device_t dev);
@@ -184,10 +186,12 @@
 	mmcbr_update_ios(dev);
 	mmc_ms_delay(1);
 
+	memset(&cmd, 0, sizeof(cmd));
 	cmd.opcode = MMC_GO_IDLE_STATE;
 	cmd.arg = 0;
 	cmd.flags = MMC_RSP_NONE | MMC_CMD_BC;
 	mmc_wait_for_cmd(sc, &cmd, 0);
+	printf("GO_IDLE returns %d\n", cmd.error);
 	mmc_ms_delay(1);
 
 	mmcbr_set_chip_select(dev, cs_dontcare);
@@ -196,17 +200,53 @@
 }
 
 static int
-mmc_send_app_op_cond(struct mmc_softc *sc, uint32_t rca, uint32_t *ocr)
+mmc_send_app_op_cond(struct mmc_softc *sc, uint32_t ocr, uint32_t *rocr)
 {
-	// XXX write me
-	return EIO;
+	struct mmc_command cmd;
+	int err = MMC_ERR_NONE, i;
+
+	memset(&cmd, 0, sizeof(cmd));
+	cmd.opcode = ACMD_SD_SEND_OP_COND;
+	cmd.arg = ocr;
+	cmd.flags = MMC_RSP_R3 | MMC_CMD_BCR;
+
+	for (i = 0; i < 100; i++) {
+		err = mmc_wait_for_cmd(sc, &cmd, CMD_RETRIES);
+		if (err != MMC_ERR_NONE)
+			break;
+		if ((cmd.resp[0] & MMC_OCR_CARD_BUSY) || ocr == 0)
+			break;
+		err = MMC_ERR_TIMEOUT;
+		mmc_ms_delay(10);
+	}
+	if (rocr && err == MMC_ERR_NONE)
+		*rocr = cmd.resp[0];
+	return err;
 }
 
 static int
-mmc_send_op_cond(struct mmc_softc *sc, uint32_t rca, uint32_t *ocr)
+mmc_send_op_cond(struct mmc_softc *sc, uint32_t ocr, uint32_t *rocr)
 {
-	// XXX write me
-	return EIO;
+	struct mmc_command cmd;
+	int err = MMC_ERR_NONE, i;
+
+	memset(&cmd, 0, sizeof(cmd));
+	cmd.opcode = MMC_SEND_OP_COND;
+	cmd.arg = ocr;
+	cmd.flags = MMC_RSP_R3 | MMC_CMD_BCR;
+
+	for (i = 0; i < 100; i++) {
+		err = mmc_wait_for_cmd(sc, &cmd, CMD_RETRIES);
+		if (err != MMC_ERR_NONE)
+			break;
+		if ((cmd.resp[0] & MMC_OCR_CARD_BUSY) || ocr == 0)
+			break;
+		err = MMC_ERR_TIMEOUT;
+		mmc_ms_delay(10);
+	}
+	if (rocr && err == MMC_ERR_NONE)
+		*rocr = cmd.resp[0];
+	return err;
 }
 
 static void

==== //depot/projects/arm/src/sys/dev/mmc/mmcreg.h#7 (text+ko) ====

@@ -201,7 +201,9 @@
 /* in SD 2.0 spec, bits 8-14 are now marked reserved */
 /* Low voltage in SD2.0 spec is bit 7, TBD voltage */
 /* Low voltage in MC 3.31 spec is bit 7, 1.65-1.95V */
-/* Linux has defines for lower bits down to 0, for reasons unknown */
+/* Linux has defines for lower bits down to 0, which were defined in prior */
+/* specs to MMC 3.31.  3.31 redefined them to be reserved and also said that */
+/* cards had to support the 2.7-3.6V. */
 #define MMC_OCR_LOW_VOLTAGE (1u << 7)	/* Low Voltage Range -- tbd */
 #define	MMC_OCR_200_210	(1U << 8)	/* Vdd voltage 2.00 ~ 2.10 */
 #define	MMC_OCR_210_220	(1U << 9)	/* Vdd voltage 2.10 ~ 2.20 */


More information about the p4-projects mailing list