ide: ide_id_has_flush_cache_ext() -> ata_id_flush_ext_enabled()

* Add ata_id_flush_ext_enabled() inline helper to <linux/ata.h>.

* ide_id_has_flush_cache_ext() -> ata_id_flush_ext_enabled()

  The latter one also checks if the command is marked as
  supported in word 83 and validity of words 83 & 86.

Cc: Jeff Garzik <jgarzik@pobox.com>
Signed-off-by: default avatarBartlomiej Zolnierkiewicz <bzolnier@gmail.com>
parent 4b58f17d
...@@ -576,7 +576,7 @@ static void idedisk_prepare_flush(struct request_queue *q, struct request *rq) ...@@ -576,7 +576,7 @@ static void idedisk_prepare_flush(struct request_queue *q, struct request *rq)
BUG_ON(task == NULL); BUG_ON(task == NULL);
memset(task, 0, sizeof(*task)); memset(task, 0, sizeof(*task));
if (ide_id_has_flush_cache_ext(drive->id) && if (ata_id_flush_ext_enabled(drive->id) &&
(drive->capacity64 >= (1UL << 28))) (drive->capacity64 >= (1UL << 28)))
task->tf.command = ATA_CMD_FLUSH_EXT; task->tf.command = ATA_CMD_FLUSH_EXT;
else else
...@@ -653,7 +653,7 @@ static void update_ordered(ide_drive_t *drive) ...@@ -653,7 +653,7 @@ static void update_ordered(ide_drive_t *drive)
capacity = idedisk_capacity(drive); capacity = idedisk_capacity(drive);
barrier = ata_id_flush_enabled(id) && !drive->noflush && barrier = ata_id_flush_enabled(id) && !drive->noflush &&
(drive->addressing == 0 || capacity <= (1ULL << 28) || (drive->addressing == 0 || capacity <= (1ULL << 28) ||
ide_id_has_flush_cache_ext(id)); ata_id_flush_ext_enabled(id));
printk(KERN_INFO "%s: cache flushes %ssupported\n", printk(KERN_INFO "%s: cache flushes %ssupported\n",
drive->name, barrier ? "" : "not "); drive->name, barrier ? "" : "not ");
...@@ -699,7 +699,7 @@ static int do_idedisk_flushcache(ide_drive_t *drive) ...@@ -699,7 +699,7 @@ static int do_idedisk_flushcache(ide_drive_t *drive)
ide_task_t args; ide_task_t args;
memset(&args, 0, sizeof(ide_task_t)); memset(&args, 0, sizeof(ide_task_t));
if (ide_id_has_flush_cache_ext(drive->id)) if (ata_id_flush_ext_enabled(drive->id))
args.tf.command = ATA_CMD_FLUSH_EXT; args.tf.command = ATA_CMD_FLUSH_EXT;
else else
args.tf.command = ATA_CMD_FLUSH; args.tf.command = ATA_CMD_FLUSH;
......
...@@ -188,7 +188,7 @@ static ide_startstop_t ide_start_power_step(ide_drive_t *drive, struct request * ...@@ -188,7 +188,7 @@ static ide_startstop_t ide_start_power_step(ide_drive_t *drive, struct request *
ide_complete_power_step(drive, rq, 0, 0); ide_complete_power_step(drive, rq, 0, 0);
return ide_stopped; return ide_stopped;
} }
if (ide_id_has_flush_cache_ext(drive->id)) if (ata_id_flush_ext_enabled(drive->id))
args->tf.command = ATA_CMD_FLUSH_EXT; args->tf.command = ATA_CMD_FLUSH_EXT;
else else
args->tf.command = ATA_CMD_FLUSH; args->tf.command = ATA_CMD_FLUSH;
......
...@@ -574,6 +574,19 @@ static inline int ata_id_has_flush_ext(const u16 *id) ...@@ -574,6 +574,19 @@ static inline int ata_id_has_flush_ext(const u16 *id)
return id[ATA_ID_COMMAND_SET_2] & (1 << 13); return id[ATA_ID_COMMAND_SET_2] & (1 << 13);
} }
static inline int ata_id_flush_ext_enabled(const u16 *id)
{
if (ata_id_has_flush_ext(id) == 0)
return 0;
if ((id[ATA_ID_CSF_DEFAULT] & 0xC000) != 0x4000)
return 0;
/*
* some Maxtor disks have bit 13 defined incorrectly
* so check bit 10 too
*/
return (id[ATA_ID_CFS_ENABLE_2] & 0x2400) == 0x2400;
}
static inline int ata_id_has_lba48(const u16 *id) static inline int ata_id_has_lba48(const u16 *id)
{ {
if ((id[ATA_ID_COMMAND_SET_2] & 0xC000) != 0x4000) if ((id[ATA_ID_COMMAND_SET_2] & 0xC000) != 0x4000)
......
...@@ -1453,10 +1453,6 @@ extern struct mutex ide_cfg_mtx; ...@@ -1453,10 +1453,6 @@ extern struct mutex ide_cfg_mtx;
extern struct bus_type ide_bus_type; extern struct bus_type ide_bus_type;
extern struct class *ide_port_class; extern struct class *ide_port_class;
/* some Maxtor disks have bit 13 defined incorrectly so check bit 10 too */
#define ide_id_has_flush_cache_ext(id) \
(((id)[ATA_ID_CFS_ENABLE_2] & 0x2400) == 0x2400)
static inline void ide_dump_identify(u8 *id) static inline void ide_dump_identify(u8 *id)
{ {
print_hex_dump(KERN_INFO, "", DUMP_PREFIX_NONE, 16, 2, id, 512, 0); print_hex_dump(KERN_INFO, "", DUMP_PREFIX_NONE, 16, 2, id, 512, 0);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment