diff options
-rw-r--r-- | firmware/target/arm/as3525/ata_sd_as3525.c | 27 |
1 files changed, 11 insertions, 16 deletions
diff --git a/firmware/target/arm/as3525/ata_sd_as3525.c b/firmware/target/arm/as3525/ata_sd_as3525.c index 9ef8226019..a184e9fead 100644 --- a/firmware/target/arm/as3525/ata_sd_as3525.c +++ b/firmware/target/arm/as3525/ata_sd_as3525.c | |||
@@ -122,6 +122,10 @@ static bool sd_enabled = false; | |||
122 | static struct wakeup transfer_completion_signal; | 122 | static struct wakeup transfer_completion_signal; |
123 | static volatile bool retry; | 123 | static volatile bool retry; |
124 | 124 | ||
125 | #define UNALIGNED_NUM_SECTORS 10 | ||
126 | static unsigned char aligned_buffer[UNALIGNED_NUM_SECTORS* SECTOR_SIZE] __attribute__((aligned(32))); /* align on cache line size */ | ||
127 | static unsigned char *uncached_buffer = UNCACHED_ADDR(&aligned_buffer[0]); | ||
128 | |||
125 | static inline void mci_delay(void) { int i = 0xffff; while(i--) ; } | 129 | static inline void mci_delay(void) { int i = 0xffff; while(i--) ; } |
126 | 130 | ||
127 | #ifdef HAVE_HOTSWAP | 131 | #ifdef HAVE_HOTSWAP |
@@ -571,11 +575,6 @@ static int sd_wait_for_state(const int drive, unsigned int state) | |||
571 | 575 | ||
572 | static int sd_select_bank(signed char bank) | 576 | static int sd_select_bank(signed char bank) |
573 | { | 577 | { |
574 | /* allocate card data buffer on the stack */ | ||
575 | unsigned char card_data[512 + 31]; | ||
576 | /* align it on cache line size */ | ||
577 | unsigned char *aligned_card_data = (void*)(((int)&card_data[0] + 31) & ~31); | ||
578 | unsigned char *uncached_card_data = UNCACHED_ADDR(aligned_card_data); | ||
579 | int ret; | 578 | int ret; |
580 | 579 | ||
581 | do { | 580 | do { |
@@ -596,20 +595,20 @@ static int sd_select_bank(signed char bank) | |||
596 | 595 | ||
597 | mci_delay(); | 596 | mci_delay(); |
598 | 597 | ||
599 | memset(uncached_card_data, 0, 512); | 598 | memset(uncached_buffer, 0, 512); |
600 | if(bank == -1) | 599 | if(bank == -1) |
601 | { /* enable bank switching */ | 600 | { /* enable bank switching */ |
602 | uncached_card_data[0] = 16; | 601 | uncached_buffer[0] = 16; |
603 | uncached_card_data[1] = 1; | 602 | uncached_buffer[1] = 1; |
604 | uncached_card_data[2] = 10; | 603 | uncached_buffer[2] = 10; |
605 | } | 604 | } |
606 | else | 605 | else |
607 | uncached_card_data[0] = bank; | 606 | uncached_buffer[0] = bank; |
608 | 607 | ||
609 | dma_retain(); | 608 | dma_retain(); |
610 | /* we don't use the uncached card data for DMA, because we need the | 609 | /* we don't use the uncached buffer here, because we need the |
611 | * physical memory address for DMA transfers */ | 610 | * physical memory address for DMA transfers */ |
612 | dma_enable_channel(0, aligned_card_data, MCI_FIFO(INTERNAL_AS3525), | 611 | dma_enable_channel(0, aligned_buffer, MCI_FIFO(INTERNAL_AS3525), |
613 | DMA_PERI_SD, DMAC_FLOWCTRL_PERI_MEM_TO_PERI, true, false, 0, DMA_S8, | 612 | DMA_PERI_SD, DMAC_FLOWCTRL_PERI_MEM_TO_PERI, true, false, 0, DMA_S8, |
614 | NULL); | 613 | NULL); |
615 | 614 | ||
@@ -636,10 +635,6 @@ static int sd_select_bank(signed char bank) | |||
636 | return 0; | 635 | return 0; |
637 | } | 636 | } |
638 | 637 | ||
639 | #define UNALIGNED_NUM_SECTORS 10 | ||
640 | static unsigned char aligned_buffer[UNALIGNED_NUM_SECTORS* SECTOR_SIZE] __attribute__((aligned(32))); /* align on cache line size */ | ||
641 | static unsigned char *uncached_buffer = UNCACHED_ADDR(&aligned_buffer[0]); | ||
642 | |||
643 | static int sd_transfer_sectors(IF_MV2(int drive,) unsigned long start, | 638 | static int sd_transfer_sectors(IF_MV2(int drive,) unsigned long start, |
644 | int count, void* buf, const bool write) | 639 | int count, void* buf, const bool write) |
645 | { | 640 | { |