MMC/SD SDIO: Correct return values when multiple block transfers are suppressed. From Andrew Tridgell via Lorenz Meier

This commit is contained in:
Gregory Nutt
2013-08-10 18:29:22 -06:00
parent da4cebf572
commit 97e13b33ab
2 changed files with 50 additions and 32 deletions
+4
View File
@@ -5339,3 +5339,7 @@
functional on the SAMA5 with DMA! (2013-8-10). functional on the SAMA5 with DMA! (2013-8-10).
* arch/arm/src/sam34/sam3u_periphclks.h: Correct a typo in a register * arch/arm/src/sam34/sam3u_periphclks.h: Correct a typo in a register
name (2013-8-10). name (2013-8-10).
* drivers/mmcsd/mmcsd_sdio.c: Correction for a bad return value
when multiple block SDIO transfers are suppressed. By Andrew Tridgell
via Lorenz Meier (2013-8-10).
+26 -12
View File
@@ -1,7 +1,7 @@
/**************************************************************************** /****************************************************************************
* drivers/mmcsd/mmcsd_sdio.c * drivers/mmcsd/mmcsd_sdio.c
* *
* Copyright (C) 2009-2012 Gregory Nutt. All rights reserved. * Copyright (C) 2009-2013 Gregory Nutt. All rights reserved.
* Author: Gregory Nutt <gnutt@nuttx.org> * Author: Gregory Nutt <gnutt@nuttx.org>
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without
@@ -1501,13 +1501,16 @@ static ssize_t mmcsd_reload(FAR void *dev, FAR uint8_t *buffer,
/* Read each block using only the single block transfer method */ /* Read each block using only the single block transfer method */
endblock = startblock + nblocks - 1; endblock = startblock + nblocks - 1;
ret = nblocks;
for (block = startblock; block <= endblock; block++) for (block = startblock; block <= endblock; block++)
{ {
/* Read this block into the user buffer */ /* Read this block into the user buffer */
ret = mmcsd_readsingle(priv, buffer, block); ssize_t nread = mmcsd_readsingle(priv, buffer, block);
if (ret < 0) if (nread < 0)
{ {
ret = nread;
break; break;
} }
@@ -1515,6 +1518,7 @@ static ssize_t mmcsd_reload(FAR void *dev, FAR uint8_t *buffer,
buffer += priv->blocksize; buffer += priv->blocksize;
} }
#else #else
/* Use either the single- or muliple-block transfer method */ /* Use either the single- or muliple-block transfer method */
@@ -1526,6 +1530,7 @@ static ssize_t mmcsd_reload(FAR void *dev, FAR uint8_t *buffer,
{ {
ret = mmcsd_readmultiple(priv, buffer, startblock, nblocks); ret = mmcsd_readmultiple(priv, buffer, startblock, nblocks);
} }
#endif #endif
/* On success, return the number of blocks read */ /* On success, return the number of blocks read */
@@ -1816,7 +1821,7 @@ static ssize_t mmcsd_flush(FAR void *dev, FAR const uint8_t *buffer,
size_t block; size_t block;
size_t endblock; size_t endblock;
#endif #endif
ssize_t ret; ssize_t ret = nblocks;
DEBUGASSERT(priv != NULL && buffer != NULL && nblocks > 0) DEBUGASSERT(priv != NULL && buffer != NULL && nblocks > 0)
@@ -1828,9 +1833,10 @@ static ssize_t mmcsd_flush(FAR void *dev, FAR const uint8_t *buffer,
{ {
/* Write this block from the user buffer */ /* Write this block from the user buffer */
ret = mmcsd_writesingle(priv, buffer, block); ssize_t nread = mmcsd_writesingle(priv, buffer, block);
if (ret < 0) if (nread < 0)
{ {
ret = nread;
break; break;
} }
@@ -1838,6 +1844,7 @@ static ssize_t mmcsd_flush(FAR void *dev, FAR const uint8_t *buffer,
buffer += priv->blocksize; buffer += priv->blocksize;
} }
#else #else
if (nblocks == 1) if (nblocks == 1)
{ {
@@ -1847,6 +1854,7 @@ static ssize_t mmcsd_flush(FAR void *dev, FAR const uint8_t *buffer,
{ {
ret = mmcsd_writemultiple(priv, buffer, startblock, nblocks); ret = mmcsd_writemultiple(priv, buffer, startblock, nblocks);
} }
#endif #endif
/* On success, return the number of blocks written */ /* On success, return the number of blocks written */
@@ -1923,7 +1931,7 @@ static ssize_t mmcsd_read(FAR struct inode *inode, unsigned char *buffer,
size_t sector; size_t sector;
size_t endsector; size_t endsector;
#endif #endif
ssize_t ret = 0; ssize_t ret = nsectors;
DEBUGASSERT(inode && inode->i_private); DEBUGASSERT(inode && inode->i_private);
priv = (FAR struct mmcsd_state_s *)inode->i_private; priv = (FAR struct mmcsd_state_s *)inode->i_private;
@@ -1947,9 +1955,10 @@ static ssize_t mmcsd_read(FAR struct inode *inode, unsigned char *buffer,
{ {
/* Read this sector into the user buffer */ /* Read this sector into the user buffer */
ret = mmcsd_readsingle(priv, buffer, sector); ssize_t nread = mmcsd_readsingle(priv, buffer, sector);
if (ret < 0) if (nread < 0)
{ {
ret = nread;
break; break;
} }
@@ -1957,6 +1966,7 @@ static ssize_t mmcsd_read(FAR struct inode *inode, unsigned char *buffer,
buffer += priv->blocksize; buffer += priv->blocksize;
} }
#else #else
/* Use either the single- or muliple-block transfer method */ /* Use either the single- or muliple-block transfer method */
@@ -1968,6 +1978,7 @@ static ssize_t mmcsd_read(FAR struct inode *inode, unsigned char *buffer,
{ {
ret = mmcsd_readmultiple(priv, buffer, startsector, nsectors); ret = mmcsd_readmultiple(priv, buffer, startsector, nsectors);
} }
#endif #endif
mmcsd_givesem(priv); mmcsd_givesem(priv);
} }
@@ -1995,7 +2006,7 @@ static ssize_t mmcsd_write(FAR struct inode *inode, FAR const unsigned char *buf
size_t sector; size_t sector;
size_t endsector; size_t endsector;
#endif #endif
ssize_t ret = 0; ssize_t ret = nsectors;
fvdbg("sector: %d nsectors: %d sectorsize: %d\n"); fvdbg("sector: %d nsectors: %d sectorsize: %d\n");
DEBUGASSERT(inode && inode->i_private); DEBUGASSERT(inode && inode->i_private);
@@ -2016,9 +2027,10 @@ static ssize_t mmcsd_write(FAR struct inode *inode, FAR const unsigned char *buf
{ {
/* Write this block from the user buffer */ /* Write this block from the user buffer */
ret = mmcsd_writesingle(priv, buffer, sector); ssize_t nread = mmcsd_writesingle(priv, buffer, sector);
if (ret < 0) if (nread < 0)
{ {
ret = nread;
break; break;
} }
@@ -2026,6 +2038,7 @@ static ssize_t mmcsd_write(FAR struct inode *inode, FAR const unsigned char *buf
buffer += priv->blocksize; buffer += priv->blocksize;
} }
#else #else
/* Use either the single- or multiple-block transfer method */ /* Use either the single- or multiple-block transfer method */
@@ -2037,6 +2050,7 @@ static ssize_t mmcsd_write(FAR struct inode *inode, FAR const unsigned char *buf
{ {
ret = mmcsd_writemultiple(priv, buffer, startsector, nsectors); ret = mmcsd_writemultiple(priv, buffer, startsector, nsectors);
} }
#endif #endif
mmcsd_givesem(priv); mmcsd_givesem(priv);