From db2d9abcfa58e376093e441f245487bbcef95db6 Mon Sep 17 00:00:00 2001 From: Gregory Nutt Date: Sun, 15 Mar 2015 09:35:48 -0600 Subject: [PATCH] SAMA5: Fix a bug in SAMA5 HSMCI. The bitfield mask and shift values were reversed resulting in a trashed value for the number of blocks in the BLOCKR register. This was sufficient to prevent DMA writes from working. --- arch/arm/src/sama5/sam_hsmci.c | 3 ++- arch/arm/src/samv7/sam_hsmci.c | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/arch/arm/src/sama5/sam_hsmci.c b/arch/arm/src/sama5/sam_hsmci.c index c1a7e92d35d..1dea391edbf 100644 --- a/arch/arm/src/sama5/sam_hsmci.c +++ b/arch/arm/src/sama5/sam_hsmci.c @@ -3010,8 +3010,9 @@ static int sam_dmasendsetup(FAR struct sdio_dev_s *dev, */ regval = sam_getreg(priv, SAM_HSMCI_BLKR_OFFSET); - nblocks = ((regval & HSMCI_BLKR_BCNT_SHIFT) >> HSMCI_BLKR_BCNT_SHIFT); + nblocks = ((regval & HSMCI_BLKR_BCNT_MASK) >> HSMCI_BLKR_BCNT_SHIFT); blocksize = ((regval & HSMCI_BLKR_BLKLEN_MASK) >> HSMCI_BLKR_BLKLEN_SHIFT); + DEBUGASSERT(nblocks > 0 && blocksize > 0 && (blocksize & 3) == 0); /* Physical address of the HSCMI source register, either the TDR (for diff --git a/arch/arm/src/samv7/sam_hsmci.c b/arch/arm/src/samv7/sam_hsmci.c index 5db631f12a2..634f2127aa2 100644 --- a/arch/arm/src/samv7/sam_hsmci.c +++ b/arch/arm/src/samv7/sam_hsmci.c @@ -2935,8 +2935,9 @@ static int sam_dmasendsetup(FAR struct sdio_dev_s *dev, */ regval = sam_getreg(priv, SAM_HSMCI_BLKR_OFFSET); - nblocks = ((regval & HSMCI_BLKR_BCNT_SHIFT) >> HSMCI_BLKR_BCNT_SHIFT); + nblocks = ((regval & HSMCI_BLKR_BCNT_MASK) >> HSMCI_BLKR_BCNT_SHIFT); blocksize = ((regval & HSMCI_BLKR_BLKLEN_MASK) >> HSMCI_BLKR_BLKLEN_SHIFT); + DEBUGASSERT(nblocks > 0 && blocksize > 0 && (blocksize & 3) == 0); /* Physical address of the HSCMI source register, either the TDR (for