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:
David Sidrane 2020-08-18 12:21:35 -07:00 committed by Xiang Xiao
parent 1d97b2ecee
commit e21dd68755

View File

@ -2245,6 +2245,7 @@ static ssize_t mmcsd_read(FAR struct inode *inode, unsigned char *buffer,
#elif defined(CONFIG_MMCSD_MULTIBLOCK_DISABLE)
/* Read each block using only the single block transfer method */
ret = nsectors;
endsector = startsector + nsectors - 1;
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",
(unsigned long)startsector, nsectors, priv->blocksize);
ret = mmcsd_takesem(priv);
if (ret < 0)
if (nsectors > 0)
{
return (ssize_t)ret;
}
#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 = mmcsd_takesem(priv);
if (ret < 0)
{
ret = nread;
break;
return (ssize_t)ret;
}
/* 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
/* Use either the single- or multiple-block transfer method */
/* Use either the single- or multiple-block transfer method */
if (nsectors == 1)
{
ret = mmcsd_writesingle(priv, buffer, startsector);
}
else
{
ret = mmcsd_writemultiple(priv, buffer, startsector, nsectors);
}
if (nsectors == 1)
{
ret = mmcsd_writesingle(priv, buffer, startsector);
}
else
{
ret = mmcsd_writemultiple(priv, buffer, startsector, nsectors);
}
#endif
mmcsd_givesem(priv);
mmcsd_givesem(priv);
}
/* On success, return the number of blocks written */