summaryrefslogtreecommitdiff
path: root/drivers/ide/ide-disk.c
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@woody.linux-foundation.org>2007-08-20 22:48:42 -0700
committerLinus Torvalds <torvalds@woody.linux-foundation.org>2007-08-20 22:48:42 -0700
commit38f061c5714265fa8481cc0b7795aa8fe81b45be (patch)
treee145112bc2ddcbd1fdd8c7d582603f253e0ef3f4 /drivers/ide/ide-disk.c
parent09d4b9aa90ab7a0ce7c266d2ea18153bf79bba33 (diff)
parentb0244a00451c1ad64bf0a51f50679f7146786780 (diff)
Merge git://git.kernel.org/pub/scm/linux/kernel/git/bart/ide-2.6
* git://git.kernel.org/pub/scm/linux/kernel/git/bart/ide-2.6: ide-disk: workaround for buggy HPA support on ST340823A (take 3) hpt34x: fix CONFIG_HPT34X_AUTODMA=n handling triflex: add missing ->dma_base check pdc202xx_old: add missing ->dma_base check pdc202xx_new: add missing ->dma_base check cs5530: add missing ->dma_base check ide: ide_config_drive_speed() bugfixes ide: add cable detection for early UDMA66 devices (take 3) ide-pmac: fix drive->init_speed reporting ide: config_drive_for_dma() fixes ide-cris: fix ->set_pio_mode method to set transfer mode on the device ide: fix hidden dependencies on CONFIG_IDE_GENERIC ide: make CONFIG_IDE_GENERIC default to N
Diffstat (limited to 'drivers/ide/ide-disk.c')
-rw-r--r--drivers/ide/ide-disk.c18
1 files changed, 18 insertions, 0 deletions
diff --git a/drivers/ide/ide-disk.c b/drivers/ide/ide-disk.c
index 5ce4216f72a2..eba1adbc1b6a 100644
--- a/drivers/ide/ide-disk.c
+++ b/drivers/ide/ide-disk.c
@@ -481,6 +481,15 @@ static inline int idedisk_supports_lba48(const struct hd_driveid *id)
&& id->lba_capacity_2;
}
+/*
+ * Some disks report total number of sectors instead of
+ * maximum sector address. We list them here.
+ */
+static const struct drive_list_entry hpa_list[] = {
+ { "ST340823A", NULL },
+ { NULL, NULL }
+};
+
static void idedisk_check_hpa(ide_drive_t *drive)
{
unsigned long long capacity, set_max;
@@ -492,6 +501,15 @@ static void idedisk_check_hpa(ide_drive_t *drive)
else
set_max = idedisk_read_native_max_address(drive);
+ if (ide_in_drive_list(drive->id, hpa_list)) {
+ /*
+ * Since we are inclusive wrt to firmware revisions do this
+ * extra check and apply the workaround only when needed.
+ */
+ if (set_max == capacity + 1)
+ set_max--;
+ }
+
if (set_max <= capacity)
return;