diff options
-rw-r--r-- | firmware/drivers/fat.c | 16 |
1 files changed, 9 insertions, 7 deletions
diff --git a/firmware/drivers/fat.c b/firmware/drivers/fat.c index d9aecd8cb0..4bf76bf8ef 100644 --- a/firmware/drivers/fat.c +++ b/firmware/drivers/fat.c | |||
@@ -1861,9 +1861,8 @@ static int transfer( unsigned int start, int count, char* buf, bool write ) | |||
1861 | { | 1861 | { |
1862 | int rc; | 1862 | int rc; |
1863 | 1863 | ||
1864 | start += fat_bpb.startsector; /* offset by partition location */ | 1864 | LDEBUGF("transfer(s=%x, c=%x, %s)\n", |
1865 | 1865 | start+ fat_bpb.startsector, count, write?"write":"read"); | |
1866 | LDEBUGF("transfer(s=%x, c=%x, %s)\n",start, count, write?"write":"read"); | ||
1867 | if (write) { | 1866 | if (write) { |
1868 | unsigned int firstallowed; | 1867 | unsigned int firstallowed; |
1869 | #ifdef HAVE_FAT16SUPPORT | 1868 | #ifdef HAVE_FAT16SUPPORT |
@@ -1873,12 +1872,15 @@ static int transfer( unsigned int start, int count, char* buf, bool write ) | |||
1873 | #endif | 1872 | #endif |
1874 | firstallowed = fat_bpb.firstdatasector; | 1873 | firstallowed = fat_bpb.firstdatasector; |
1875 | 1874 | ||
1876 | if (start < firstallowed + fat_bpb.startsector) | 1875 | if (start < firstallowed) |
1877 | panicf("Writing before data\n"); | 1876 | panicf("Write %d before data\n", firstallowed - start); |
1878 | rc = ata_write_sectors(start, count, buf); | 1877 | if (start + count > fat_bpb.totalsectors) |
1878 | panicf("Write %d after data\n", | ||
1879 | start + count - fat_bpb.totalsectors); | ||
1880 | rc = ata_write_sectors(start + fat_bpb.startsector, count, buf); | ||
1879 | } | 1881 | } |
1880 | else | 1882 | else |
1881 | rc = ata_read_sectors(start, count, buf); | 1883 | rc = ata_read_sectors(start + fat_bpb.startsector, count, buf); |
1882 | if (rc < 0) { | 1884 | if (rc < 0) { |
1883 | DEBUGF( "transfer() - Couldn't %s sector %x" | 1885 | DEBUGF( "transfer() - Couldn't %s sector %x" |
1884 | " (error code %d)\n", | 1886 | " (error code %d)\n", |