ahci: fix CAP.NP and PI handling
authorTejun Heo <htejun@gmail.com>
Wed, 6 Feb 2008 06:13:51 +0000 (15:13 +0900)
committerJeff Garzik <jeff@garzik.org>
Wed, 6 Feb 2008 11:59:27 +0000 (06:59 -0500)
commit837f5f8fb98d4357d49e9631c9ee2815f3c328ca
tree25c24b611fd66b0599d8145716513339d42a7bb3
parentf351b2d638c3cb0b95adde3549b7bfaf3f991dfa
ahci: fix CAP.NP and PI handling

AHCI uses CAP.NP to indicate the number of ports and PI to tell which
ports are enabled.  The only requirement is that the number of ports
indicated by CAP.NP should equal or be higher than the number of
enabled ports in PI.

CAP.NP and PI carry duplicate information and there have been some
interesting cases.  Some early AHCI controllers didn't set PI at all
and just implement from port 0 to CAP.NP.  An ICH8 board which wired
four out of six available ports had 3 (4 ports) for CAP.NP and 0x33
for PI.  While ESB2 has less bits set in PI than the value in CAP.NP.

Till now, ahci driver assumed that PI is invalid if it doesn't match
CAP.NP exactly.  This violates AHCI standard and the driver ends up
accessing unmimplemented ports on ESB2.

This patch updates CAP.NP and PI handling such that PI can have less
number of bits set than indicated in CAP.NP and the highest port is
determined as the maximum port of what CAP.NP and PI indicate.

Signed-off-by: Tejun Heo <htejun@gmail.com>
Cc: Jan Beulich <jbeulich@novell.com>
Signed-off-by: Jeff Garzik <jeff@garzik.org>
drivers/ata/ahci.c