summaryrefslogtreecommitdiff
path: root/core/fs
diff options
context:
space:
mode:
authorH. Peter Anvin <hpa@linux.intel.com>2010-07-16 16:29:17 -0700
committerH. Peter Anvin <hpa@linux.intel.com>2010-07-16 16:29:17 -0700
commitbd23fe1f1d376284bf02556d84e6d6fa8111fd00 (patch)
tree6d187692a6932df58778052c8b1a67bccb562f19 /core/fs
parent055f763ca8c0eb69724cf5c1e5cb9511dce724f9 (diff)
downloadsyslinux-bd23fe1f1d376284bf02556d84e6d6fa8111fd00.tar.gz
diskio: move strict CHS start value check into chs_rdwr_sectors()
It really makes more sense in chs_rdwr_sectors()... Signed-off-by: H. Peter Anvin <hpa@linux.intel.com>
Diffstat (limited to 'core/fs')
-rw-r--r--core/fs/diskio.c24
1 files changed, 15 insertions, 9 deletions
diff --git a/core/fs/diskio.c b/core/fs/diskio.c
index cf9bf499..51f2f39d 100644
--- a/core/fs/diskio.c
+++ b/core/fs/diskio.c
@@ -9,6 +9,11 @@
#define RETRY_COUNT 6
+static inline sector_t chs_max(const struct disk *disk)
+{
+ return (disk->h * disk->s) << 10;
+}
+
static int chs_rdwr_sectors(struct disk *disk, void *buf,
sector_t lba, size_t count, bool is_write)
{
@@ -25,7 +30,7 @@ static int chs_rdwr_sectors(struct disk *disk, void *buf,
int retry;
uint32_t maxtransfer = disk->maxtransfer;
- if (lba + disk->part_start >= 1024*256*63)
+ if (lba + disk->part_start >= chs_max(disk))
return 0; /* Impossible CHS request */
memset(&ireg, 0, sizeof ireg);
@@ -227,15 +232,16 @@ static int edd_rdwr_sectors(struct disk *disk, void *buf,
* EDD-capable but aren't; the known such systems return
* error code AH=1 (invalid function), but let's not
* assume that for now.
+ *
+ * Try to fall back to CHS. If the LBA is absurd, the
+ * chs_max() test in chs_rdwr_sectors() will catch it.
*/
- if (lba < ((disk->h * disk->s) << 10)) {
- done = chs_rdwr_sectors(disk, buf, lba - disk->part_start,
- count, is_write);
- if (done == (count << sector_shift)) {
- /* Successful, assume this is a CHS disk */
- disk->rdwr_sectors = chs_rdwr_sectors;
- return done;
- }
+ done = chs_rdwr_sectors(disk, buf, lba - disk->part_start,
+ count, is_write);
+ if (done == (count << sector_shift)) {
+ /* Successful, assume this is a CHS disk */
+ disk->rdwr_sectors = chs_rdwr_sectors;
+ return done;
}
printf("EDD: Error %04x %s sector %llu\n",
oreg.eax.w[0],