[PATCH 2/4] libata: Implement ATA_DEV_ZAC
Add new ATA device type for ZAC devices. Signed-off-by: Hannes Reinecke h...@suse.de --- drivers/ata/libata-core.c | 20 ++-- drivers/ata/libata-eh.c| 7 +-- drivers/ata/libata-scsi.c | 5 +++-- drivers/ata/libata-transport.c | 1 + include/linux/libata.h | 6 -- 5 files changed, 27 insertions(+), 12 deletions(-) diff --git a/drivers/ata/libata-core.c b/drivers/ata/libata-core.c index 2c4d742..5f23804 100644 --- a/drivers/ata/libata-core.c +++ b/drivers/ata/libata-core.c @@ -1044,8 +1044,8 @@ const char *sata_spd_string(unsigned int spd) * None. * * RETURNS: - * Device type, %ATA_DEV_ATA, %ATA_DEV_ATAPI, %ATA_DEV_PMP or - * %ATA_DEV_UNKNOWN the event of failure. + * Device type, %ATA_DEV_ATA, %ATA_DEV_ATAPI, %ATA_DEV_PMP, + * %ATA_DEV_ZAC, or %ATA_DEV_UNKNOWN the event of failure. */ unsigned int ata_dev_classify(u8 lbah, u8 lbam, u8 lbal) { @@ -1090,6 +1090,11 @@ unsigned int ata_dev_classify(u8 lbah, u8 lbam, u8 lbal) return ATA_DEV_SEMB; } + if ((lbam == 0xcd) (lbah == 0xab)) { + DPRINTK(found ZAC device by sig\n); + return ATA_DEV_ZAC; + } + DPRINTK(unknown device\n); return ATA_DEV_UNKNOWN; } @@ -1330,7 +1335,7 @@ static int ata_hpa_resize(struct ata_device *dev) int rc; /* do we need to do it? */ - if (dev-class != ATA_DEV_ATA || + if ((dev-class != ATA_DEV_ATA dev-class != ATA_DEV_ZAC) || !ata_id_has_lba(dev-id) || !ata_id_hpa_enabled(dev-id) || (dev-horkage ATA_HORKAGE_BROKEN_HPA)) return 0; @@ -1890,6 +1895,7 @@ retry: case ATA_DEV_SEMB: class = ATA_DEV_ATA;/* some hard drives report SEMB sig */ case ATA_DEV_ATA: + case ATA_DEV_ZAC: tf.command = ATA_CMD_ID_ATA; break; case ATA_DEV_ATAPI: @@ -1981,7 +1987,7 @@ retry: rc = -EINVAL; reason = device reports invalid type; - if (class == ATA_DEV_ATA) { + if (class == ATA_DEV_ATA || class == ATA_DEV_ZAC) { if (!ata_id_is_ata(id) !ata_id_is_cfa(id)) goto err_out; if (ap-host-flags ATA_HOST_IGNORE_ATA @@ -2016,7 +2022,8 @@ retry: goto retry; } - if ((flags ATA_READID_POSTRESET) class == ATA_DEV_ATA) { + if ((flags ATA_READID_POSTRESET) + (class == ATA_DEV_ATA || class == ATA_DEV_ZAC)) { /* * The exact sequence expected by certain pre-ATA4 drives is: * SRST RESET @@ -2281,7 +2288,7 @@ int ata_dev_configure(struct ata_device *dev) sizeof(modelbuf)); /* ATA-specific feature tests */ - if (dev-class == ATA_DEV_ATA) { + if (dev-class == ATA_DEV_ATA || dev-class == ATA_DEV_ZAC) { if (ata_id_is_cfa(id)) { /* CPRM may make this media unusable */ if (id[ATA_ID_CFA_KEY_MGMT] 1) @@ -4034,6 +4041,7 @@ int ata_dev_revalidate(struct ata_device *dev, unsigned int new_class, if (ata_class_enabled(new_class) new_class != ATA_DEV_ATA new_class != ATA_DEV_ATAPI + new_class != ATA_DEV_ZAC new_class != ATA_DEV_SEMB) { ata_dev_info(dev, class mismatch %u != %u\n, dev-class, new_class); diff --git a/drivers/ata/libata-eh.c b/drivers/ata/libata-eh.c index 6760fc4..f620c4a 100644 --- a/drivers/ata/libata-eh.c +++ b/drivers/ata/libata-eh.c @@ -1809,6 +1809,7 @@ static unsigned int ata_eh_analyze_tf(struct ata_queued_cmd *qc, switch (qc-dev-class) { case ATA_DEV_ATA: + case ATA_DEV_ZAC: if (err ATA_ICRC) qc-err_mask |= AC_ERR_ATA_BUS; if (err ATA_UNC) @@ -3791,7 +3792,8 @@ int ata_eh_recover(struct ata_port *ap, ata_prereset_fn_t prereset, struct ata_eh_context *ehc = link-eh_context; unsigned long tmp; - if (dev-class != ATA_DEV_ATA) + if (dev-class != ATA_DEV_ATA + dev-class != ATA_DEV_ZAC) continue; if (!(ehc-i.dev_action[dev-devno] ATA_EH_PARK)) @@ -3872,7 +3874,8 @@ int ata_eh_recover(struct ata_port *ap, ata_prereset_fn_t prereset, /* retry flush if necessary */ ata_for_each_dev(dev, link, ALL) { - if (dev-class != ATA_DEV_ATA) + if (dev-class != ATA_DEV_ATA + dev-class != ATA_DEV_ZAC) continue; rc = ata_eh_maybe_retry_flush(dev);
[PATCH 2/4] libata: Implement ATA_DEV_ZAC
Add new ATA device type for ZAC devices. Cc: Tejun Heo t...@kernel.org Signed-off-by: Hannes Reinecke h...@suse.de --- drivers/ata/libata-core.c | 20 ++-- drivers/ata/libata-eh.c| 7 +-- drivers/ata/libata-scsi.c | 5 +++-- drivers/ata/libata-transport.c | 1 + include/linux/libata.h | 6 -- 5 files changed, 27 insertions(+), 12 deletions(-) diff --git a/drivers/ata/libata-core.c b/drivers/ata/libata-core.c index 2c4d742..5f23804 100644 --- a/drivers/ata/libata-core.c +++ b/drivers/ata/libata-core.c @@ -1044,8 +1044,8 @@ const char *sata_spd_string(unsigned int spd) * None. * * RETURNS: - * Device type, %ATA_DEV_ATA, %ATA_DEV_ATAPI, %ATA_DEV_PMP or - * %ATA_DEV_UNKNOWN the event of failure. + * Device type, %ATA_DEV_ATA, %ATA_DEV_ATAPI, %ATA_DEV_PMP, + * %ATA_DEV_ZAC, or %ATA_DEV_UNKNOWN the event of failure. */ unsigned int ata_dev_classify(u8 lbah, u8 lbam, u8 lbal) { @@ -1090,6 +1090,11 @@ unsigned int ata_dev_classify(u8 lbah, u8 lbam, u8 lbal) return ATA_DEV_SEMB; } + if ((lbam == 0xcd) (lbah == 0xab)) { + DPRINTK(found ZAC device by sig\n); + return ATA_DEV_ZAC; + } + DPRINTK(unknown device\n); return ATA_DEV_UNKNOWN; } @@ -1330,7 +1335,7 @@ static int ata_hpa_resize(struct ata_device *dev) int rc; /* do we need to do it? */ - if (dev-class != ATA_DEV_ATA || + if ((dev-class != ATA_DEV_ATA dev-class != ATA_DEV_ZAC) || !ata_id_has_lba(dev-id) || !ata_id_hpa_enabled(dev-id) || (dev-horkage ATA_HORKAGE_BROKEN_HPA)) return 0; @@ -1890,6 +1895,7 @@ retry: case ATA_DEV_SEMB: class = ATA_DEV_ATA;/* some hard drives report SEMB sig */ case ATA_DEV_ATA: + case ATA_DEV_ZAC: tf.command = ATA_CMD_ID_ATA; break; case ATA_DEV_ATAPI: @@ -1981,7 +1987,7 @@ retry: rc = -EINVAL; reason = device reports invalid type; - if (class == ATA_DEV_ATA) { + if (class == ATA_DEV_ATA || class == ATA_DEV_ZAC) { if (!ata_id_is_ata(id) !ata_id_is_cfa(id)) goto err_out; if (ap-host-flags ATA_HOST_IGNORE_ATA @@ -2016,7 +2022,8 @@ retry: goto retry; } - if ((flags ATA_READID_POSTRESET) class == ATA_DEV_ATA) { + if ((flags ATA_READID_POSTRESET) + (class == ATA_DEV_ATA || class == ATA_DEV_ZAC)) { /* * The exact sequence expected by certain pre-ATA4 drives is: * SRST RESET @@ -2281,7 +2288,7 @@ int ata_dev_configure(struct ata_device *dev) sizeof(modelbuf)); /* ATA-specific feature tests */ - if (dev-class == ATA_DEV_ATA) { + if (dev-class == ATA_DEV_ATA || dev-class == ATA_DEV_ZAC) { if (ata_id_is_cfa(id)) { /* CPRM may make this media unusable */ if (id[ATA_ID_CFA_KEY_MGMT] 1) @@ -4034,6 +4041,7 @@ int ata_dev_revalidate(struct ata_device *dev, unsigned int new_class, if (ata_class_enabled(new_class) new_class != ATA_DEV_ATA new_class != ATA_DEV_ATAPI + new_class != ATA_DEV_ZAC new_class != ATA_DEV_SEMB) { ata_dev_info(dev, class mismatch %u != %u\n, dev-class, new_class); diff --git a/drivers/ata/libata-eh.c b/drivers/ata/libata-eh.c index 6760fc4..f620c4a 100644 --- a/drivers/ata/libata-eh.c +++ b/drivers/ata/libata-eh.c @@ -1809,6 +1809,7 @@ static unsigned int ata_eh_analyze_tf(struct ata_queued_cmd *qc, switch (qc-dev-class) { case ATA_DEV_ATA: + case ATA_DEV_ZAC: if (err ATA_ICRC) qc-err_mask |= AC_ERR_ATA_BUS; if (err ATA_UNC) @@ -3791,7 +3792,8 @@ int ata_eh_recover(struct ata_port *ap, ata_prereset_fn_t prereset, struct ata_eh_context *ehc = link-eh_context; unsigned long tmp; - if (dev-class != ATA_DEV_ATA) + if (dev-class != ATA_DEV_ATA + dev-class != ATA_DEV_ZAC) continue; if (!(ehc-i.dev_action[dev-devno] ATA_EH_PARK)) @@ -3872,7 +3874,8 @@ int ata_eh_recover(struct ata_port *ap, ata_prereset_fn_t prereset, /* retry flush if necessary */ ata_for_each_dev(dev, link, ALL) { - if (dev-class != ATA_DEV_ATA) + if (dev-class != ATA_DEV_ATA + dev-class != ATA_DEV_ZAC) continue; rc =
[PATCH 2/4] libata: Implement ATA_DEV_ZAC
Add new ATA device type for ZAC devices. Cc: Tejun Heo t...@kernel.org Signed-off-by: Hannes Reinecke h...@suse.de --- drivers/ata/libata-core.c | 20 ++-- drivers/ata/libata-eh.c| 7 +-- drivers/ata/libata-scsi.c | 5 +++-- drivers/ata/libata-transport.c | 1 + include/linux/libata.h | 6 -- 5 files changed, 27 insertions(+), 12 deletions(-) diff --git a/drivers/ata/libata-core.c b/drivers/ata/libata-core.c index 2c4d742..5f23804 100644 --- a/drivers/ata/libata-core.c +++ b/drivers/ata/libata-core.c @@ -1044,8 +1044,8 @@ const char *sata_spd_string(unsigned int spd) * None. * * RETURNS: - * Device type, %ATA_DEV_ATA, %ATA_DEV_ATAPI, %ATA_DEV_PMP or - * %ATA_DEV_UNKNOWN the event of failure. + * Device type, %ATA_DEV_ATA, %ATA_DEV_ATAPI, %ATA_DEV_PMP, + * %ATA_DEV_ZAC, or %ATA_DEV_UNKNOWN the event of failure. */ unsigned int ata_dev_classify(u8 lbah, u8 lbam, u8 lbal) { @@ -1090,6 +1090,11 @@ unsigned int ata_dev_classify(u8 lbah, u8 lbam, u8 lbal) return ATA_DEV_SEMB; } + if ((lbam == 0xcd) (lbah == 0xab)) { + DPRINTK(found ZAC device by sig\n); + return ATA_DEV_ZAC; + } + DPRINTK(unknown device\n); return ATA_DEV_UNKNOWN; } @@ -1330,7 +1335,7 @@ static int ata_hpa_resize(struct ata_device *dev) int rc; /* do we need to do it? */ - if (dev-class != ATA_DEV_ATA || + if ((dev-class != ATA_DEV_ATA dev-class != ATA_DEV_ZAC) || !ata_id_has_lba(dev-id) || !ata_id_hpa_enabled(dev-id) || (dev-horkage ATA_HORKAGE_BROKEN_HPA)) return 0; @@ -1890,6 +1895,7 @@ retry: case ATA_DEV_SEMB: class = ATA_DEV_ATA;/* some hard drives report SEMB sig */ case ATA_DEV_ATA: + case ATA_DEV_ZAC: tf.command = ATA_CMD_ID_ATA; break; case ATA_DEV_ATAPI: @@ -1981,7 +1987,7 @@ retry: rc = -EINVAL; reason = device reports invalid type; - if (class == ATA_DEV_ATA) { + if (class == ATA_DEV_ATA || class == ATA_DEV_ZAC) { if (!ata_id_is_ata(id) !ata_id_is_cfa(id)) goto err_out; if (ap-host-flags ATA_HOST_IGNORE_ATA @@ -2016,7 +2022,8 @@ retry: goto retry; } - if ((flags ATA_READID_POSTRESET) class == ATA_DEV_ATA) { + if ((flags ATA_READID_POSTRESET) + (class == ATA_DEV_ATA || class == ATA_DEV_ZAC)) { /* * The exact sequence expected by certain pre-ATA4 drives is: * SRST RESET @@ -2281,7 +2288,7 @@ int ata_dev_configure(struct ata_device *dev) sizeof(modelbuf)); /* ATA-specific feature tests */ - if (dev-class == ATA_DEV_ATA) { + if (dev-class == ATA_DEV_ATA || dev-class == ATA_DEV_ZAC) { if (ata_id_is_cfa(id)) { /* CPRM may make this media unusable */ if (id[ATA_ID_CFA_KEY_MGMT] 1) @@ -4034,6 +4041,7 @@ int ata_dev_revalidate(struct ata_device *dev, unsigned int new_class, if (ata_class_enabled(new_class) new_class != ATA_DEV_ATA new_class != ATA_DEV_ATAPI + new_class != ATA_DEV_ZAC new_class != ATA_DEV_SEMB) { ata_dev_info(dev, class mismatch %u != %u\n, dev-class, new_class); diff --git a/drivers/ata/libata-eh.c b/drivers/ata/libata-eh.c index 6760fc4..f620c4a 100644 --- a/drivers/ata/libata-eh.c +++ b/drivers/ata/libata-eh.c @@ -1809,6 +1809,7 @@ static unsigned int ata_eh_analyze_tf(struct ata_queued_cmd *qc, switch (qc-dev-class) { case ATA_DEV_ATA: + case ATA_DEV_ZAC: if (err ATA_ICRC) qc-err_mask |= AC_ERR_ATA_BUS; if (err ATA_UNC) @@ -3791,7 +3792,8 @@ int ata_eh_recover(struct ata_port *ap, ata_prereset_fn_t prereset, struct ata_eh_context *ehc = link-eh_context; unsigned long tmp; - if (dev-class != ATA_DEV_ATA) + if (dev-class != ATA_DEV_ATA + dev-class != ATA_DEV_ZAC) continue; if (!(ehc-i.dev_action[dev-devno] ATA_EH_PARK)) @@ -3872,7 +3874,8 @@ int ata_eh_recover(struct ata_port *ap, ata_prereset_fn_t prereset, /* retry flush if necessary */ ata_for_each_dev(dev, link, ALL) { - if (dev-class != ATA_DEV_ATA) + if (dev-class != ATA_DEV_ATA + dev-class != ATA_DEV_ZAC) continue; rc =