forked from luck/tmp_suning_uos_patched
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>
This commit is contained in:
parent
d786b91f42
commit
589d572671
@ -2428,11 +2428,21 @@ int ata_pci_sff_activate_host(struct ata_host *host,
|
|||||||
return rc;
|
return rc;
|
||||||
|
|
||||||
if ((pdev->class >> 8) == PCI_CLASS_STORAGE_IDE) {
|
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);
|
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)
|
if ((tmp8 & mask) != mask)
|
||||||
legacy_mode = 1;
|
legacy_mode = 1;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user