diff options
author | Darren Stevens <darren@stevens-zone.net> | 2017-01-23 22:33:36 +0300 |
---|---|---|
committer | Tejun Heo <tj@kernel.org> | 2017-01-23 22:35:17 +0300 |
commit | 589d572671fe7ca342d25cde07a0e310a6912971 (patch) | |
tree | 1320912a578de647f54598f3bfbb2d6faa1c9e83 /drivers/ata/libata-sff.c | |
parent | d786b91f422c6ad4c0d9bb9c1bef2dd5008e3d9d (diff) | |
download | linux-589d572671fe7ca342d25cde07a0e310a6912971.tar.xz |
libata-sff: Don't scan disabled ports when checking for legacy mode.
libata-sff.c checks for legacy mode by testing if both primary and
secondary ports on a controller are in legacy mode and selects legacy
if either one is. However on some south bridge chips (e.g AMD
SB600/SB700) the secondary port is not wired, and when it is disabled
by setting the disable bit in the PCI header it appears as a fixed
legacy port.
Prevent incorrect detection by not testing ports that are marked as
'dummy'
tj: Addressed Sergei's review points. Other style edits.
Signed-off-by: Darren Stevens <darren@stevens-zone.net>
Signed-off-by: Tejun Heo <tj@kernel.org>
Cc: Sergei Shtylyov <sergei.shtylyov@cogentembedded.com>
Diffstat (limited to 'drivers/ata/libata-sff.c')
-rw-r--r-- | drivers/ata/libata-sff.c | 16 |
1 files changed, 13 insertions, 3 deletions
diff --git a/drivers/ata/libata-sff.c b/drivers/ata/libata-sff.c index 4441b5c5e4fb..2bd92dca3e62 100644 --- a/drivers/ata/libata-sff.c +++ b/drivers/ata/libata-sff.c @@ -2428,11 +2428,21 @@ int ata_pci_sff_activate_host(struct ata_host *host, return rc; if ((pdev->class >> 8) == PCI_CLASS_STORAGE_IDE) { - u8 tmp8, mask; + u8 tmp8, mask = 0; - /* TODO: What if one channel is in native mode ... */ + /* + * ATA spec says we should use legacy mode when one + * port is in legacy mode, but disabled ports on some + * PCI hosts appear as fixed legacy ports, e.g SB600/700 + * on which the secondary port is not wired, so + * ignore ports that are marked as 'dummy' during + * this check + */ pci_read_config_byte(pdev, PCI_CLASS_PROG, &tmp8); - mask = (1 << 2) | (1 << 0); + if (!ata_port_is_dummy(host->ports[0])) + mask |= (1 << 0); + if (!ata_port_is_dummy(host->ports[1])) + mask |= (1 << 2); if ((tmp8 & mask) != mask) legacy_mode = 1; } |