ide: ide_id_has_flush_cache() -> ata_id_flush_enabled()

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

* ide_id_has_flush_cache() -> ata_id_flush_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 1a4e4d4d
...@@ -651,7 +651,7 @@ static void update_ordered(ide_drive_t *drive) ...@@ -651,7 +651,7 @@ static void update_ordered(ide_drive_t *drive)
* not available so we don't need to recheck that. * not available so we don't need to recheck that.
*/ */
capacity = idedisk_capacity(drive); capacity = idedisk_capacity(drive);
barrier = ide_id_has_flush_cache(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)); ide_id_has_flush_cache_ext(id));
...@@ -678,7 +678,7 @@ static int set_wcache(ide_drive_t *drive, int arg) ...@@ -678,7 +678,7 @@ static int set_wcache(ide_drive_t *drive, int arg)
if (arg < 0 || arg > 1) if (arg < 0 || arg > 1)
return -EINVAL; return -EINVAL;
if (ide_id_has_flush_cache(drive->id)) { if (ata_id_flush_enabled(drive->id)) {
memset(&args, 0, sizeof(ide_task_t)); memset(&args, 0, sizeof(ide_task_t));
args.tf.feature = arg ? args.tf.feature = arg ?
SETFEATURES_WC_ON : SETFEATURES_WC_OFF; SETFEATURES_WC_ON : SETFEATURES_WC_OFF;
...@@ -886,7 +886,7 @@ static void idedisk_setup(ide_drive_t *drive) ...@@ -886,7 +886,7 @@ static void idedisk_setup(ide_drive_t *drive)
static void ide_cacheflush_p(ide_drive_t *drive) static void ide_cacheflush_p(ide_drive_t *drive)
{ {
if (!drive->wcache || !ide_id_has_flush_cache(drive->id)) if (!drive->wcache || ata_id_flush_enabled(drive->id) == 0)
return; return;
if (do_idedisk_flushcache(drive)) if (do_idedisk_flushcache(drive))
......
...@@ -184,7 +184,7 @@ static ide_startstop_t ide_start_power_step(ide_drive_t *drive, struct request * ...@@ -184,7 +184,7 @@ static ide_startstop_t ide_start_power_step(ide_drive_t *drive, struct request *
if (drive->media != ide_disk) if (drive->media != ide_disk)
break; break;
/* Not supported? Switch to next step now. */ /* Not supported? Switch to next step now. */
if (!drive->wcache || !ide_id_has_flush_cache(drive->id)) { if (!drive->wcache || ata_id_flush_enabled(drive->id) == 0) {
ide_complete_power_step(drive, rq, 0, 0); ide_complete_power_step(drive, rq, 0, 0);
return ide_stopped; return ide_stopped;
} }
......
...@@ -558,6 +558,15 @@ static inline int ata_id_has_flush(const u16 *id) ...@@ -558,6 +558,15 @@ static inline int ata_id_has_flush(const u16 *id)
return id[ATA_ID_COMMAND_SET_2] & (1 << 12); return id[ATA_ID_COMMAND_SET_2] & (1 << 12);
} }
static inline int ata_id_flush_enabled(const u16 *id)
{
if (ata_id_has_flush(id) == 0)
return 0;
if ((id[ATA_ID_CSF_DEFAULT] & 0xC000) != 0x4000)
return 0;
return id[ATA_ID_CFS_ENABLE_2] & (1 << 12);
}
static inline int ata_id_has_flush_ext(const u16 *id) static inline int ata_id_has_flush_ext(const u16 *id)
{ {
if ((id[ATA_ID_COMMAND_SET_2] & 0xC000) != 0x4000) if ((id[ATA_ID_COMMAND_SET_2] & 0xC000) != 0x4000)
......
...@@ -1453,9 +1453,6 @@ extern struct mutex ide_cfg_mtx; ...@@ -1453,9 +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;
/* check if CACHE FLUSH command is supported (as defined in ATA-6) */
#define ide_id_has_flush_cache(id) ((id)[ATA_ID_CFS_ENABLE_2] & 0x1000)
/* some Maxtor disks have bit 13 defined incorrectly so check bit 10 too */ /* some Maxtor disks have bit 13 defined incorrectly so check bit 10 too */
#define ide_id_has_flush_cache_ext(id) \ #define ide_id_has_flush_cache_ext(id) \
(((id)[ATA_ID_CFS_ENABLE_2] & 0x2400) == 0x2400) (((id)[ATA_ID_CFS_ENABLE_2] & 0x2400) == 0x2400)
......
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