From b58eccbbc1ba52ff314bb4b46221671247ab087c Mon Sep 17 00:00:00 2001 From: Tejun Heo Date: Fri, 11 May 2007 14:35:29 +0200 Subject: [PATCH] --- yaml --- r: 56259 b: refs/heads/master c: 54936f8b099325992f0f212a5e366fd5257c6c9c h: refs/heads/master i: 56257: 24eb89d9d50cdcff09c2354e9435506937a3f821 56255: 9d994026961f75ef5f5f912e000da9670bce1b75 v: v3 --- [refs] | 2 +- trunk/drivers/ata/libata-core.c | 22 +++++++++++++++++++++- 2 files changed, 22 insertions(+), 2 deletions(-) diff --git a/[refs] b/[refs] index 1738605d7ef8..6627ab6475b2 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: f4d6d00466ef4879e4289f18c2f59210a06a7ada +refs/heads/master: 54936f8b099325992f0f212a5e366fd5257c6c9c diff --git a/trunk/drivers/ata/libata-core.c b/trunk/drivers/ata/libata-core.c index 6ac4f32ddcc2..335ac8fb5251 100644 --- a/trunk/drivers/ata/libata-core.c +++ b/trunk/drivers/ata/libata-core.c @@ -1660,7 +1660,7 @@ int ata_dev_read_id(struct ata_device *dev, unsigned int *p_class, struct ata_taskfile tf; unsigned int err_mask = 0; const char *reason; - int tried_spinup = 0; + int may_fallback = 1, tried_spinup = 0; int rc; if (ata_msg_ctl(ap)) @@ -1704,11 +1704,31 @@ int ata_dev_read_id(struct ata_device *dev, unsigned int *p_class, return -ENOENT; } + /* Device or controller might have reported the wrong + * device class. Give a shot at the other IDENTIFY if + * the current one is aborted by the device. + */ + if (may_fallback && + (err_mask == AC_ERR_DEV) && (tf.feature & ATA_ABORTED)) { + may_fallback = 0; + + if (class == ATA_DEV_ATA) + class = ATA_DEV_ATAPI; + else + class = ATA_DEV_ATA; + goto retry; + } + rc = -EIO; reason = "I/O error"; goto err_out; } + /* Falling back doesn't make sense if ID data was read + * successfully at least once. + */ + may_fallback = 0; + swap_buf_le16(id, ATA_ID_WORDS); /* sanity check */