mirror of
https://github.com/apache/nuttx.git
synced 2026-05-30 05:16:47 +08:00
MMC/SD SDIO: Correct return values when multiple block transfers are suppressed. From Andrew Tridgell via Lorenz Meier
This commit is contained in:
@@ -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
@@ -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);
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user