mirror of
https://github.com/apache/nuttx.git
synced 2026-05-27 19:36:35 +08:00
mmcsd_sdio:Fix breakage from 997d4 SD not functional
When CONFIG_MMCSD_MULTIBLOCK_DISABLE is lit, all SD read/write failed. The function return the number of blocks in `ret`, set on entry to nsectors. That was then wiped out by using the ret for the mmcsd_takesem. Since the code had many path setting return, the choices for the fix could have been add a new varaible or simple init it were used. I choose the latter.
This commit is contained in:
committed by
Xiang Xiao
parent
1d97b2ecee
commit
e21dd68755
+40
-35
@@ -2245,6 +2245,7 @@ static ssize_t mmcsd_read(FAR struct inode *inode, unsigned char *buffer,
|
|||||||
#elif defined(CONFIG_MMCSD_MULTIBLOCK_DISABLE)
|
#elif defined(CONFIG_MMCSD_MULTIBLOCK_DISABLE)
|
||||||
/* Read each block using only the single block transfer method */
|
/* Read each block using only the single block transfer method */
|
||||||
|
|
||||||
|
ret = nsectors;
|
||||||
endsector = startsector + nsectors - 1;
|
endsector = startsector + nsectors - 1;
|
||||||
for (sector = startsector; sector <= endsector; sector++)
|
for (sector = startsector; sector <= endsector; sector++)
|
||||||
{
|
{
|
||||||
@@ -2309,51 +2310,55 @@ static ssize_t mmcsd_write(FAR struct inode *inode,
|
|||||||
finfo("sector: %lu nsectors: %u sectorsize: %u\n",
|
finfo("sector: %lu nsectors: %u sectorsize: %u\n",
|
||||||
(unsigned long)startsector, nsectors, priv->blocksize);
|
(unsigned long)startsector, nsectors, priv->blocksize);
|
||||||
|
|
||||||
ret = mmcsd_takesem(priv);
|
if (nsectors > 0)
|
||||||
if (ret < 0)
|
|
||||||
{
|
{
|
||||||
return (ssize_t)ret;
|
ret = mmcsd_takesem(priv);
|
||||||
}
|
if (ret < 0)
|
||||||
|
|
||||||
#if defined(CONFIG_DRVR_WRITEBUFFER)
|
|
||||||
/* Write the data to the write buffer */
|
|
||||||
|
|
||||||
ret = rwb_write(&priv->rwbuffer, startsector, nsectors, buffer);
|
|
||||||
|
|
||||||
#elif defined(CONFIG_MMCSD_MULTIBLOCK_DISABLE)
|
|
||||||
/* Write each block using only the single block transfer method */
|
|
||||||
|
|
||||||
endsector = startsector + nsectors - 1;
|
|
||||||
for (sector = startsector; sector <= endsector; sector++)
|
|
||||||
{
|
|
||||||
/* Write this block from the user buffer */
|
|
||||||
|
|
||||||
ssize_t nread = mmcsd_writesingle(priv, buffer, sector);
|
|
||||||
if (nread < 0)
|
|
||||||
{
|
{
|
||||||
ret = nread;
|
return (ssize_t)ret;
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Increment the buffer pointer by the block size */
|
#if defined(CONFIG_DRVR_WRITEBUFFER)
|
||||||
|
/* Write the data to the write buffer */
|
||||||
|
|
||||||
buffer += priv->blocksize;
|
ret = rwb_write(&priv->rwbuffer, startsector, nsectors, buffer);
|
||||||
}
|
|
||||||
|
#elif defined(CONFIG_MMCSD_MULTIBLOCK_DISABLE)
|
||||||
|
/* Write each block using only the single block transfer method */
|
||||||
|
|
||||||
|
ret = nsectors;
|
||||||
|
endsector = startsector + nsectors - 1;
|
||||||
|
for (sector = startsector; sector <= endsector; sector++)
|
||||||
|
{
|
||||||
|
/* Write this block from the user buffer */
|
||||||
|
|
||||||
|
ssize_t nread = mmcsd_writesingle(priv, buffer, sector);
|
||||||
|
if (nread < 0)
|
||||||
|
{
|
||||||
|
ret = nread;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Increment the buffer pointer by the block size */
|
||||||
|
|
||||||
|
buffer += priv->blocksize;
|
||||||
|
}
|
||||||
|
|
||||||
#else
|
#else
|
||||||
/* Use either the single- or multiple-block transfer method */
|
/* Use either the single- or multiple-block transfer method */
|
||||||
|
|
||||||
if (nsectors == 1)
|
if (nsectors == 1)
|
||||||
{
|
{
|
||||||
ret = mmcsd_writesingle(priv, buffer, startsector);
|
ret = mmcsd_writesingle(priv, buffer, startsector);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
ret = mmcsd_writemultiple(priv, buffer, startsector, nsectors);
|
ret = mmcsd_writemultiple(priv, buffer, startsector, nsectors);
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
mmcsd_givesem(priv);
|
mmcsd_givesem(priv);
|
||||||
|
}
|
||||||
|
|
||||||
/* On success, return the number of blocks written */
|
/* On success, return the number of blocks written */
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user