From 5f1fde8b26f12b2691b7527d0e70a72962f4c71f Mon Sep 17 00:00:00 2001 From: Bartlomiej Zolnierkiewicz Date: Wed, 6 Aug 2003 20:16:45 -0700 Subject: [PATCH] [PATCH] capacity related fixes From Andries.Brouwer@cwi.nl: - store capacities in sector_t - add generic sectors_to_MB() helper to ide-disk.c - fix drive->bios_cyls calculation (limiting it to 65535) for disks --- drivers/ide/ide-cd.c | 2 +- drivers/ide/ide-disk.c | 36 ++++++++++++++++++++++++++---------- drivers/ide/ide-floppy.c | 2 +- drivers/ide/ide.c | 4 ++-- include/linux/ide.h | 4 ++-- 5 files changed, 32 insertions(+), 16 deletions(-) diff --git a/drivers/ide/ide-cd.c b/drivers/ide/ide-cd.c index aa69a15d4bbcc..1e999b0a8df50 100644 --- a/drivers/ide/ide-cd.c +++ b/drivers/ide/ide-cd.c @@ -3228,7 +3228,7 @@ int ide_cdrom_setup (ide_drive_t *drive) } static -unsigned long ide_cdrom_capacity (ide_drive_t *drive) +sector_t ide_cdrom_capacity (ide_drive_t *drive) { unsigned long capacity; diff --git a/drivers/ide/ide-disk.c b/drivers/ide/ide-disk.c index 55435d039cc76..cdaf4ce335218 100644 --- a/drivers/ide/ide-disk.c +++ b/drivers/ide/ide-disk.c @@ -1066,6 +1066,13 @@ static unsigned long long idedisk_set_max_address_ext(ide_drive_t *drive, unsign #endif /* CONFIG_IDEDISK_STROKE */ +static unsigned long long sectors_to_MB(unsigned long long n) +{ + n <<= 9; /* make it bytes */ + do_div(n, 1000000); /* make it MB */ + return n; +} + /* * Tests if the drive supports Host Protected Area feature. * Returns true if supported, false otherwise. @@ -1166,7 +1173,7 @@ static void init_idedisk_capacity (ide_drive_t *drive) } } -static unsigned long idedisk_capacity (ide_drive_t *drive) +static sector_t idedisk_capacity (ide_drive_t *drive) { if (drive->id->cfs_enable_2 & 0x0400) return (drive->capacity48 - drive->sect0); @@ -1565,7 +1572,7 @@ static ide_startstop_t idedisk_start_power_step (ide_drive_t *drive, struct requ static void idedisk_setup (ide_drive_t *drive) { struct hd_driveid *id = drive->id; - unsigned long capacity; + unsigned long long capacity; idedisk_add_settings(drive); @@ -1629,14 +1636,23 @@ static void idedisk_setup (ide_drive_t *drive) * by correcting bios_cyls: */ capacity = idedisk_capacity (drive); - if ((capacity >= (drive->bios_cyl * drive->bios_sect * drive->bios_head)) && - (!drive->forced_geom) && drive->bios_sect && drive->bios_head) - drive->bios_cyl = (capacity / drive->bios_sect) / drive->bios_head; - printk (KERN_INFO "%s: %ld sectors", drive->name, capacity); - - /* Give size in megabytes (MB), not mebibytes (MiB). */ - /* We compute the exact rounded value, avoiding overflow. */ - printk (" (%ld MB)", (capacity - capacity/625 + 974)/1950); + if (!drive->forced_geom && drive->bios_sect && drive->bios_head) { + unsigned int cap0 = capacity; /* truncate to 32 bits */ + unsigned int cylsz, cyl; + + if (cap0 != capacity) + drive->bios_cyl = 65535; + else { + cylsz = drive->bios_sect * drive->bios_head; + cyl = cap0 / cylsz; + if (cyl > 65535) + cyl = 65535; + if (cyl > drive->bios_cyl) + drive->bios_cyl = cyl; + } + } + printk(KERN_INFO "%s: %llu sectors (%llu MB)", + drive->name, capacity, sectors_to_MB(capacity)); /* Only print cache size when it was specified */ if (id->buf_size) diff --git a/drivers/ide/ide-floppy.c b/drivers/ide/ide-floppy.c index 2c14e13668bc1..112dc8b8676d9 100644 --- a/drivers/ide/ide-floppy.c +++ b/drivers/ide/ide-floppy.c @@ -1626,7 +1626,7 @@ static int idefloppy_get_format_progress(ide_drive_t *drive, int *arg) /* * Return the current floppy capacity to ide.c. */ -static unsigned long idefloppy_capacity (ide_drive_t *drive) +static sector_t idefloppy_capacity (ide_drive_t *drive) { idefloppy_floppy_t *floppy = drive->driver_data; unsigned long capacity = floppy->blocks * floppy->bs_factor; diff --git a/drivers/ide/ide.c b/drivers/ide/ide.c index 3bcb7b08ceca8..b40f8b1822970 100644 --- a/drivers/ide/ide.c +++ b/drivers/ide/ide.c @@ -351,7 +351,7 @@ int ide_system_bus_speed (void) * current_capacity() returns the capacity (in sectors) of a drive * according to its current geometry/LBA settings. */ -unsigned long current_capacity (ide_drive_t *drive) +sector_t current_capacity (ide_drive_t *drive) { if (!drive->present) return 0; @@ -2410,7 +2410,7 @@ static void default_pre_reset (ide_drive_t *drive) { } -static unsigned long default_capacity (ide_drive_t *drive) +static sector_t default_capacity (ide_drive_t *drive) { return 0x7fffffff; } diff --git a/include/linux/ide.h b/include/linux/ide.h index ae1459a53dd06..5ef14369efd29 100644 --- a/include/linux/ide.h +++ b/include/linux/ide.h @@ -1226,7 +1226,7 @@ typedef struct ide_driver_s { ide_startstop_t (*abort)(ide_drive_t *, const char *); int (*ioctl)(ide_drive_t *, struct inode *, struct file *, unsigned int, unsigned long); void (*pre_reset)(ide_drive_t *); - unsigned long (*capacity)(ide_drive_t *); + sector_t (*capacity)(ide_drive_t *); ide_startstop_t (*special)(ide_drive_t *); ide_proc_entry_t *proc; int (*attach)(ide_drive_t *); @@ -1359,7 +1359,7 @@ extern int ide_wait_stat(ide_startstop_t *, ide_drive_t *, u8, u8, unsigned long /* * Return the current idea about the total capacity of this drive. */ -extern unsigned long current_capacity (ide_drive_t *drive); +extern sector_t current_capacity (ide_drive_t *drive); /* * Start a reset operation for an IDE interface. -- 2.53.0