|
@@ -1043,8 +1043,8 @@ const char *sata_spd_string(unsigned int spd)
|
|
* None.
|
|
* None.
|
|
*
|
|
*
|
|
* RETURNS:
|
|
* 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(const struct ata_taskfile *tf)
|
|
unsigned int ata_dev_classify(const struct ata_taskfile *tf)
|
|
{
|
|
{
|
|
@@ -1089,6 +1089,11 @@ unsigned int ata_dev_classify(const struct ata_taskfile *tf)
|
|
return ATA_DEV_SEMB;
|
|
return ATA_DEV_SEMB;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ if ((tf->lbam == 0xcd) && (tf->lbah == 0xab)) {
|
|
|
|
+ DPRINTK("found ZAC device by sig\n");
|
|
|
|
+ return ATA_DEV_ZAC;
|
|
|
|
+ }
|
|
|
|
+
|
|
DPRINTK("unknown device\n");
|
|
DPRINTK("unknown device\n");
|
|
return ATA_DEV_UNKNOWN;
|
|
return ATA_DEV_UNKNOWN;
|
|
}
|
|
}
|
|
@@ -1329,7 +1334,7 @@ static int ata_hpa_resize(struct ata_device *dev)
|
|
int rc;
|
|
int rc;
|
|
|
|
|
|
/* do we need to do it? */
|
|
/* 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) ||
|
|
!ata_id_has_lba(dev->id) || !ata_id_hpa_enabled(dev->id) ||
|
|
(dev->horkage & ATA_HORKAGE_BROKEN_HPA))
|
|
(dev->horkage & ATA_HORKAGE_BROKEN_HPA))
|
|
return 0;
|
|
return 0;
|
|
@@ -1889,6 +1894,7 @@ retry:
|
|
case ATA_DEV_SEMB:
|
|
case ATA_DEV_SEMB:
|
|
class = ATA_DEV_ATA; /* some hard drives report SEMB sig */
|
|
class = ATA_DEV_ATA; /* some hard drives report SEMB sig */
|
|
case ATA_DEV_ATA:
|
|
case ATA_DEV_ATA:
|
|
|
|
+ case ATA_DEV_ZAC:
|
|
tf.command = ATA_CMD_ID_ATA;
|
|
tf.command = ATA_CMD_ID_ATA;
|
|
break;
|
|
break;
|
|
case ATA_DEV_ATAPI:
|
|
case ATA_DEV_ATAPI:
|
|
@@ -1980,7 +1986,7 @@ retry:
|
|
rc = -EINVAL;
|
|
rc = -EINVAL;
|
|
reason = "device reports invalid type";
|
|
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))
|
|
if (!ata_id_is_ata(id) && !ata_id_is_cfa(id))
|
|
goto err_out;
|
|
goto err_out;
|
|
if (ap->host->flags & ATA_HOST_IGNORE_ATA &&
|
|
if (ap->host->flags & ATA_HOST_IGNORE_ATA &&
|
|
@@ -2015,7 +2021,8 @@ retry:
|
|
goto 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:
|
|
* The exact sequence expected by certain pre-ATA4 drives is:
|
|
* SRST RESET
|
|
* SRST RESET
|
|
@@ -2280,7 +2287,7 @@ int ata_dev_configure(struct ata_device *dev)
|
|
sizeof(modelbuf));
|
|
sizeof(modelbuf));
|
|
|
|
|
|
/* ATA-specific feature tests */
|
|
/* 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)) {
|
|
if (ata_id_is_cfa(id)) {
|
|
/* CPRM may make this media unusable */
|
|
/* CPRM may make this media unusable */
|
|
if (id[ATA_ID_CFA_KEY_MGMT] & 1)
|
|
if (id[ATA_ID_CFA_KEY_MGMT] & 1)
|
|
@@ -4033,6 +4040,7 @@ int ata_dev_revalidate(struct ata_device *dev, unsigned int new_class,
|
|
if (ata_class_enabled(new_class) &&
|
|
if (ata_class_enabled(new_class) &&
|
|
new_class != ATA_DEV_ATA &&
|
|
new_class != ATA_DEV_ATA &&
|
|
new_class != ATA_DEV_ATAPI &&
|
|
new_class != ATA_DEV_ATAPI &&
|
|
|
|
+ new_class != ATA_DEV_ZAC &&
|
|
new_class != ATA_DEV_SEMB) {
|
|
new_class != ATA_DEV_SEMB) {
|
|
ata_dev_info(dev, "class mismatch %u != %u\n",
|
|
ata_dev_info(dev, "class mismatch %u != %u\n",
|
|
dev->class, new_class);
|
|
dev->class, new_class);
|