diff options
Diffstat (limited to 'firmware')
-rw-r--r-- | firmware/drivers/ata_mmc.c | 18 | ||||
-rw-r--r-- | firmware/export/ata_mmc.h | 1 |
2 files changed, 14 insertions, 5 deletions
diff --git a/firmware/drivers/ata_mmc.c b/firmware/drivers/ata_mmc.c index e27e693528..260418c694 100644 --- a/firmware/drivers/ata_mmc.c +++ b/firmware/drivers/ata_mmc.c | |||
@@ -476,6 +476,10 @@ static int initialize_card(int card_no) | |||
476 | card->r2w_factor = 1 << temp; | 476 | card->r2w_factor = 1 << temp; |
477 | card->write_timeout = card->read_timeout * card->r2w_factor; | 477 | card->write_timeout = card->read_timeout * card->r2w_factor; |
478 | 478 | ||
479 | /* card size */ | ||
480 | card->numsectors = mmc_extract_bits(card->csd, 54, 12) | ||
481 | * (1 << (mmc_extract_bits(card->csd, 78, 3)+2)); | ||
482 | |||
479 | /* switch to full speed */ | 483 | /* switch to full speed */ |
480 | setup_sci1(card->bitrate_register); | 484 | setup_sci1(card->bitrate_register); |
481 | 485 | ||
@@ -616,11 +620,10 @@ static int send_single_sector(const unsigned char *buf, int timeout) | |||
616 | return ret; | 620 | return ret; |
617 | } | 621 | } |
618 | 622 | ||
619 | int ata_read_sectors( | 623 | int ata_read_sectors(IF_MV2(int drive,) |
620 | IF_MV2(int drive,) | 624 | unsigned long start, |
621 | unsigned long start, | 625 | int incount, |
622 | int incount, | 626 | void* inbuf) |
623 | void* inbuf) | ||
624 | { | 627 | { |
625 | int ret = 0; | 628 | int ret = 0; |
626 | int i; | 629 | int i; |
@@ -639,6 +642,9 @@ int ata_read_sectors( | |||
639 | card = &card_info[current_card]; | 642 | card = &card_info[current_card]; |
640 | ret = select_card(current_card); | 643 | ret = select_card(current_card); |
641 | #endif | 644 | #endif |
645 | if (start + incount > card->numsectors) | ||
646 | panicf("Reading past end of card\n"); | ||
647 | |||
642 | if (ret == 0) | 648 | if (ret == 0) |
643 | { | 649 | { |
644 | if (incount == 1) | 650 | if (incount == 1) |
@@ -702,6 +708,8 @@ int ata_write_sectors(IF_MV2(int drive,) | |||
702 | card = &card_info[current_card]; | 708 | card = &card_info[current_card]; |
703 | ret = select_card(current_card); | 709 | ret = select_card(current_card); |
704 | #endif | 710 | #endif |
711 | if (start + count > card->numsectors) | ||
712 | panicf("Writing past end of card\n"); | ||
705 | 713 | ||
706 | if (ret == 0) | 714 | if (ret == 0) |
707 | { | 715 | { |
diff --git a/firmware/export/ata_mmc.h b/firmware/export/ata_mmc.h index 3e88b0e019..957849925b 100644 --- a/firmware/export/ata_mmc.h +++ b/firmware/export/ata_mmc.h | |||
@@ -33,6 +33,7 @@ typedef struct | |||
33 | unsigned int nsac; /* clock cycles */ | 33 | unsigned int nsac; /* clock cycles */ |
34 | unsigned int tsac; /* n * 0.1 ns */ | 34 | unsigned int tsac; /* n * 0.1 ns */ |
35 | unsigned int r2w_factor; | 35 | unsigned int r2w_factor; |
36 | unsigned int numsectors; /* size in sectors */ | ||
36 | } tCardInfo; | 37 | } tCardInfo; |
37 | 38 | ||
38 | void mmc_select_clock(int card_no); | 39 | void mmc_select_clock(int card_no); |