summaryrefslogtreecommitdiffstats
path: root/c
diff options
context:
space:
mode:
authorSebastian Huber <sebastian.huber@embedded-brains.de>2010-06-24 07:54:15 +0000
committerSebastian Huber <sebastian.huber@embedded-brains.de>2010-06-24 07:54:15 +0000
commitd290bbb5b2b8ddb53d9ed025205d9c37b1c90edf (patch)
tree14f3d4e02c604546bf2fc0456042a4733336317d /c
parent2010-06-23 Joel Sherrill <joel.sherrilL@OARcorp.com> (diff)
downloadrtems-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')
-rw-r--r--c/src/ChangeLog6
-rw-r--r--c/src/libchip/i2c/spi-sd-card.c20
-rw-r--r--c/src/libchip/i2c/spi-sd-card.h1
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 [];