Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 3 Oct 2006 20:08:38 GMT
From:      Warner Losh <imp@FreeBSD.org>
To:        Perforce Change Reviews <perforce@freebsd.org>
Subject:   PERFORCE change 107211 for review
Message-ID:  <200610032008.k93K8c8Y094358@repoman.freebsd.org>

next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=107211

Change 107211 by imp@imp_lighthouse on 2006/10/03 20:07:37

	minor code motion to do less work in the no data case.
	Mask off RCRCE on CMD2 and ACMD47.

Affected files ...

.. //depot/projects/arm/src/sys/arm/at91/at91_mci.c#18 edit

Differences ...

==== //depot/projects/arm/src/sys/arm/at91/at91_mci.c#18 (text+ko) ====

@@ -328,28 +328,27 @@
 		else
 			cmdr |= MCI_CMDR_RSPTYP_48;
 	}
-	if (data) {
-		if (data->flags & MMC_DATA_READ)
-			cmdr |= MCI_CMDR_TRDIR;
-		if (data->flags & (MMC_DATA_READ | MMC_DATA_WRITE))
-			cmdr |= MCI_CMDR_TRCMD_START;
-		if (data->flags & MMC_DATA_STREAM)
-			cmdr |= MCI_CMDR_TRTYP_STREAM;
-		if (data->flags & MMC_DATA_MULTI)
-			cmdr |= MCI_CMDR_TRTYP_MULTIPLE;
-	}
 	if (cmd->opcode == MMC_STOP_TRANSMISSION)
 		cmdr |= MCI_CMDR_TRCMD_STOP;
 	if (sc->host.ios.bus_mode == opendrain)
 		cmdr |= MCI_CMDR_OPDCMD;
 	if (!data) {
+		// The no data case is fairly simple
 		at91_mci_pdc_disable(sc);
 		printf("CMDR %x ARGR %x\n", cmdr, cmd->arg);
 		WR4(sc, MCI_ARGR, cmd->arg);
 		WR4(sc, MCI_CMDR, cmdr);
 		WR4(sc, MCI_IER, MCI_SR_ERROR | MCI_SR_CMDRDY);
 		return;
-	}
+l	}
+	if (data->flags & MMC_DATA_READ)
+		cmdr |= MCI_CMDR_TRDIR;
+	if (data->flags & (MMC_DATA_READ | MMC_DATA_WRITE))
+		cmdr |= MCI_CMDR_TRCMD_START;
+	if (data->flags & MMC_DATA_STREAM)
+		cmdr |= MCI_CMDR_TRTYP_STREAM;
+	if (data->flags & MMC_DATA_MULTI)
+		cmdr |= MCI_CMDR_TRTYP_MULTIPLE;
 	// Set block size and turn on PDC mode for dma xfer and disable
 	// PDC until we're ready.
 	mr = RD4(sc, MCI_MR) & ~MCI_MR_BLKLEN;
@@ -364,9 +363,11 @@
 			if (bus_dmamap_load(sc->dmatag, sc->map, vaddr,
 				block_size, at91_mci_getaddr, &paddr, 0) != 0) {
 				if (req->cmd->flags & STOP_STARTED)
-					req->stop->error = EAGAIN;
+					req->stop->error = ERR_NO_MEMORY;
 				else
-					req->cmd->error = EAGAIN;
+					req->cmd->error = ERR_NO_MEMORY;
+				sc->req = NULL;
+				sc->curcmd = NULL;
 				req->done(req);
 				return;
 			}
@@ -396,6 +397,8 @@
 	struct mmc_request *req;
 
 	req = sc->req;
+	if (req == NULL)
+		return;
 	// assert locked
 	if (!(sc->flags & CMD_STARTED)) {
 		sc->flags |= CMD_STARTED;
@@ -498,12 +501,12 @@
 	sr = RD4(sc, MCI_SR) & RD4(sc, MCI_IMR);
 	printf("i 0x%x\n", sr);
 	cmd = sc->curcmd;
+	// Ignore CRC errors on CMD2 and ACMD47, per relevant standards
+	if (cmd->opcode == MMC_SEND_OP_COND ||
+	    cmd->opcode == ACMD_SD_SEND_OP_COND)
+		sr &= ~MCI_SR_RCRCE;
 	if (sr & MCI_SR_ERROR) {
-		// Ignore CRC errors on CMD2 and ACMD47, per relevant standards
-		if ((sr & MCI_SR_RCRCE) && (cmd->opcode == MMC_SEND_OP_COND ||
-		    cmd->opcode == ACMD_SD_SEND_OP_COND))
-			cmd->error = MMC_ERR_NONE;
-		else if (sr & (MCI_SR_RTOE | MCI_SR_DTOE))
+		if (sr & (MCI_SR_RTOE | MCI_SR_DTOE))
 			cmd->error = MMC_ERR_TIMEOUT;
 		else if (sr & (MCI_SR_RCRCE | MCI_SR_DCRCE))
 			cmd->error = MMC_ERR_BADCRC;



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200610032008.k93K8c8Y094358>