diff options
Diffstat (limited to 'firmware/target/arm/as3525/ata_sd_as3525.c')
-rw-r--r-- | firmware/target/arm/as3525/ata_sd_as3525.c | 12 |
1 files changed, 10 insertions, 2 deletions
diff --git a/firmware/target/arm/as3525/ata_sd_as3525.c b/firmware/target/arm/as3525/ata_sd_as3525.c index 488988d430..919cd50e9d 100644 --- a/firmware/target/arm/as3525/ata_sd_as3525.c +++ b/firmware/target/arm/as3525/ata_sd_as3525.c | |||
@@ -98,6 +98,10 @@ static void init_pl180_controller(const int drive); | |||
98 | 98 | ||
99 | static tSDCardInfo card_info[NUM_VOLUMES]; | 99 | static tSDCardInfo card_info[NUM_VOLUMES]; |
100 | 100 | ||
101 | /* maximum timeouts recommanded in the SD Specification v2.00 */ | ||
102 | #define SD_MAX_READ_TIMEOUT ((AS3525_PCLK_FREQ) / 1000 * 100) /* 100 ms */ | ||
103 | #define SD_MAX_WRITE_TIMEOUT ((AS3525_PCLK_FREQ) / 1000 * 250) /* 250 ms */ | ||
104 | |||
101 | /* for compatibility */ | 105 | /* for compatibility */ |
102 | static long last_disk_activity = -1; | 106 | static long last_disk_activity = -1; |
103 | 107 | ||
@@ -595,7 +599,7 @@ static int sd_select_bank(signed char bank) | |||
595 | dma_enable_channel(0, card_data, MCI_FIFO(INTERNAL_AS3525), DMA_PERI_SD, | 599 | dma_enable_channel(0, card_data, MCI_FIFO(INTERNAL_AS3525), DMA_PERI_SD, |
596 | DMAC_FLOWCTRL_PERI_MEM_TO_PERI, true, false, 0, DMA_S8, NULL); | 600 | DMAC_FLOWCTRL_PERI_MEM_TO_PERI, true, false, 0, DMA_S8, NULL); |
597 | 601 | ||
598 | MCI_DATA_TIMER(INTERNAL_AS3525) = 0xffffffff;/* FIXME: arbitrary */ | 602 | MCI_DATA_TIMER(INTERNAL_AS3525) = SD_MAX_WRITE_TIMEOUT; |
599 | MCI_DATA_LENGTH(INTERNAL_AS3525) = 512; | 603 | MCI_DATA_LENGTH(INTERNAL_AS3525) = 512; |
600 | MCI_DATA_CTRL(INTERNAL_AS3525) = (1<<0) /* enable */ | | 604 | MCI_DATA_CTRL(INTERNAL_AS3525) = (1<<0) /* enable */ | |
601 | (0<<1) /* transfer direction */ | | 605 | (0<<1) /* transfer direction */ | |
@@ -718,7 +722,11 @@ static int sd_transfer_sectors(IF_MV2(int drive,) unsigned long start, | |||
718 | (drive == INTERNAL_AS3525) ? DMA_PERI_SD : DMA_PERI_SD_SLOT, | 722 | (drive == INTERNAL_AS3525) ? DMA_PERI_SD : DMA_PERI_SD_SLOT, |
719 | DMAC_FLOWCTRL_PERI_PERI_TO_MEM, false, true, 0, DMA_S8, NULL); | 723 | DMAC_FLOWCTRL_PERI_PERI_TO_MEM, false, true, 0, DMA_S8, NULL); |
720 | 724 | ||
721 | MCI_DATA_TIMER(drive) = 0x1000000; /* FIXME: arbitrary */ | 725 | /* FIXME : we should check if the timeouts calculated from the card's |
726 | * CSD are lower, and use them if it is the case | ||
727 | * Note : the OF doesn't seem to use them anyway */ | ||
728 | MCI_DATA_TIMER(drive) = write ? | ||
729 | SD_MAX_WRITE_TIMEOUT : SD_MAX_READ_TIMEOUT; | ||
722 | MCI_DATA_LENGTH(drive) = transfer * card_info[drive].block_size; | 730 | MCI_DATA_LENGTH(drive) = transfer * card_info[drive].block_size; |
723 | MCI_DATA_CTRL(drive) = (1<<0) /* enable */ | | 731 | MCI_DATA_CTRL(drive) = (1<<0) /* enable */ | |
724 | (!write<<1) /* transfer direction */ | | 732 | (!write<<1) /* transfer direction */ | |