diff options
author | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2010-06-24 07:54:15 +0000 |
---|---|---|
committer | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2010-06-24 07:54:15 +0000 |
commit | d290bbb5b2b8ddb53d9ed025205d9c37b1c90edf (patch) | |
tree | 14f3d4e02c604546bf2fc0456042a4733336317d /c/src | |
parent | 2010-06-23 Joel Sherrill <joel.sherrilL@OARcorp.com> (diff) | |
download | rtems-d290bbb5b2b8ddb53d9ed025205d9c37b1c90edf.tar.bz2 |
2010-06-24 Arnout Vandecappelle <arnout@mind.be>
PR 1586/misc
* libchip/i2c/spi-sd-card.h, libchip/i2c/spi-sd-card.c: Add retries to
SD card accesses.
Diffstat (limited to 'c/src')
-rw-r--r-- | c/src/ChangeLog | 6 | ||||
-rw-r--r-- | c/src/libchip/i2c/spi-sd-card.c | 20 | ||||
-rw-r--r-- | c/src/libchip/i2c/spi-sd-card.h | 1 |
3 files changed, 24 insertions, 3 deletions
diff --git a/c/src/ChangeLog b/c/src/ChangeLog index 2de3e8fe4d..6a63aa2952 100644 --- a/c/src/ChangeLog +++ b/c/src/ChangeLog @@ -1,3 +1,9 @@ +2010-06-24 Arnout Vandecappelle <arnout@mind.be> + + PR 1586/misc + * libchip/i2c/spi-sd-card.h, libchip/i2c/spi-sd-card.c: Add retries to + SD card accesses. + 2010-06-22 Arnout Vandecappelle <arnout@mind.be> PR 1580/misc diff --git a/c/src/libchip/i2c/spi-sd-card.c b/c/src/libchip/i2c/spi-sd-card.c index 6f88b585d1..c395554178 100644 --- a/c/src/libchip/i2c/spi-sd-card.c +++ b/c/src/libchip/i2c/spi-sd-card.c @@ -1236,15 +1236,26 @@ static int sd_card_disk_ioctl( rtems_disk_device *dd, uint32_t req, void *arg) rtems_device_minor_number minor = rtems_disk_get_minor_number( dd); sd_card_driver_entry *e = &sd_card_driver_table [minor]; rtems_blkdev_request *r = (rtems_blkdev_request *) arg; + int (*f)( sd_card_driver_entry *, rtems_blkdev_request *); + uint32_t retries = e->retries; + int result; + switch (r->req) { case RTEMS_BLKDEV_REQ_READ: - return sd_card_disk_block_read( e, r); + f = sd_card_disk_block_read; + break; case RTEMS_BLKDEV_REQ_WRITE: - return sd_card_disk_block_write( e, r); + f = sd_card_disk_block_write; + break; default: errno = EINVAL; return -1; } + do { + result = f( e, r); + } while (retries-- > 0 && result != 0); + return result; + } else if (req == RTEMS_BLKIO_CAPABILITIES) { *(uint32_t *) arg = RTEMS_BLKDEV_CAP_MULTISECTOR_CONT; return 0; @@ -1265,9 +1276,12 @@ static rtems_status_code sd_card_disk_init( rtems_device_major_number major, rte for (minor = 0; minor < sd_card_driver_table_size; ++minor) { sd_card_driver_entry *e = &sd_card_driver_table [minor]; dev_t dev = rtems_filesystem_make_dev_t( major, minor); + uint32_t retries = e->retries; /* Initialize SD Card */ - sc = sd_card_init( e); + do { + sc = sd_card_init( e); + } while (retries-- > 0 && sc != RTEMS_SUCCESSFUL); RTEMS_CHECK_SC( sc, "Initialize SD Card"); /* Create disk device */ diff --git a/c/src/libchip/i2c/spi-sd-card.h b/c/src/libchip/i2c/spi-sd-card.h index fecd89cbc6..a88475fcf2 100644 --- a/c/src/libchip/i2c/spi-sd-card.h +++ b/c/src/libchip/i2c/spi-sd-card.h @@ -69,6 +69,7 @@ typedef struct { bool busy; bool verbose; bool schedule_if_busy; + uint32_t retries; } sd_card_driver_entry; extern sd_card_driver_entry sd_card_driver_table []; |