On Wed, Sep 19, 2012 at 01:05:13PM +0800, [email protected] wrote:
> From: Haijun Zhang <[email protected]>
>
> A-003500: False ADMA Error might be reported when ADMA is used for
> multiple block read command with Stop at Block Gap. If PROCTL[SABGREQ]
> is set when the particular block's data is received by the System side
> logic before entire block(with CRC) data is received by the SD side logic,
> and also if ADMA descriptor line is fetched at the same time,
> then DMA engine might report false ADMA error. eSDHC might not be able
> to Continue(PROCTL[CREQ]=1)after Stop at Block Gap.
> This issue will impact the eSDHC IP VVN2.3.
>
>
> Signed-off-by: Haijun Zhang <[email protected]>
> Signed-off-by: Jerry Huang <[email protected]>
> CC: Anton Vorontsov <[email protected]>
> ---
> changes for v2:
> - Invert the condition of the if statement in function workground
Hm.
[...]
> +static void esdhci_of_adma_workaround(struct sdhci_host *host, u32 intmask)
> +{
> + u32 tmp = in_be32(host->ioaddr + SDHCI_SLOT_INT_STATUS);
> +
> + tmp = (tmp & SDHCI_VENDOR_VER_MASK) >> SDHCI_VENDOR_VER_SHIFT;
> + if ((intmask & SDHCI_INT_DATA_END) &&
> + (intmask & SDHCI_INT_BLK_GAP) &&
> + (tmp == VENDOR_V_23)) {
I really don't see it inverted. :-)
What I meant was this:
static void esdhci_of_adma_workaround(struct sdhci_host *host, u32 intmask)
{
u32 vendor;
bool applicable;
dma_addr_t dmastart;
dma_addr_t dmanow;
vendor = in_be32(host->ioaddr + SDHCI_SLOT_INT_STATUS);
vendor = (vendor & SDHCI_VENDOR_VER_MASK) >> SDHCI_VENDOR_VER_SHIFT;
applicable = intmask & SDHCI_INT_DATA_END &&
intmask & SDHCI_INT_BLK_GAP &&
vendor == VENDOR_V_23;
if (!applicable)
return;
host->data->error = 0;
dmastart = sg_dma_address(host->data->sg);
dmanow = dmastart + host->data->bytes_xfered;
...
...
}
This is human-readable and there's no additional indentation.
Thanks,
Anton.
--
To unsubscribe from this list: send the line "unsubscribe linux-mmc" in
the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html