libata: improve HPA error handling

There's no point in retrying and eventually failing device detection
when the device rejects READ_NATIVE_MAX[_EXT]. Disable HPA unlocking
if READ_NATIVE_MAX[_EXT] is rejected as done when SET_MAX[_EXT] is
rejected.

This allows some old drives to work even if they aren't blacklisted.

Signed-off-by: Tejun Heo <htejun@gmail.com>
Signed-off-by: Jeff Garzik <jeff@garzik.org>

authored by Tejun Heo and committed by Jeff Garzik dda7aba1 1ffc151f

+4 -4
+4 -4
drivers/ata/libata-core.c
··· 1416 /* read native max address */ 1417 rc = ata_read_native_max_address(dev, &native_sectors); 1418 if (rc) { 1419 - /* If HPA isn't going to be unlocked, skip HPA 1420 - * resizing from the next try. 1421 */ 1422 - if (!ata_ignore_hpa) { 1423 ata_dev_printk(dev, KERN_WARNING, "HPA support seems " 1424 - "broken, will skip HPA handling\n"); 1425 dev->horkage |= ATA_HORKAGE_BROKEN_HPA; 1426 1427 /* we can continue if device aborted the command */
··· 1416 /* read native max address */ 1417 rc = ata_read_native_max_address(dev, &native_sectors); 1418 if (rc) { 1419 + /* If device aborted the command or HPA isn't going to 1420 + * be unlocked, skip HPA resizing. 1421 */ 1422 + if (rc == -EACCES || !ata_ignore_hpa) { 1423 ata_dev_printk(dev, KERN_WARNING, "HPA support seems " 1424 + "broken, skipping HPA handling\n"); 1425 dev->horkage |= ATA_HORKAGE_BROKEN_HPA; 1426 1427 /* we can continue if device aborted the command */