PERFORCE change 107211 for review
Warner Losh
imp at FreeBSD.org
Tue Oct 3 13:08:39 PDT 2006
http://perforce.freebsd.org/chv.cgi?CH=107211
Change 107211 by imp at 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;
More information about the p4-projects
mailing list