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>