|
|
@@ -1505,12 +1505,20 @@ static const char *ata_err_string(unsigned int err_mask)
|
|
|
unsigned int ata_read_log_page(struct ata_device *dev, u8 log,
|
|
|
u8 page, void *buf, unsigned int sectors)
|
|
|
{
|
|
|
+ unsigned long ap_flags = dev->link->ap->flags;
|
|
|
struct ata_taskfile tf;
|
|
|
unsigned int err_mask;
|
|
|
bool dma = false;
|
|
|
|
|
|
DPRINTK("read log page - log 0x%x, page 0x%x\n", log, page);
|
|
|
|
|
|
+ /*
|
|
|
+ * Return error without actually issuing the command on controllers
|
|
|
+ * which e.g. lockup on a read log page.
|
|
|
+ */
|
|
|
+ if (ap_flags & ATA_FLAG_NO_LOG_PAGE)
|
|
|
+ return AC_ERR_DEV;
|
|
|
+
|
|
|
retry:
|
|
|
ata_tf_init(dev, &tf);
|
|
|
if (dev->dma_mode && ata_id_has_read_log_dma_ext(dev->id) &&
|