When a single device error is detected, the device under the error is indicated
by the error bit set in the DER. There is a one to one mapping between register
bit and devices on Port multiplier(PMP) i.e. bit 0 represents PMP device 0 and
bit 1 represents PMP device 1 etc.
Current implementation treats Device error register value as device number not
set of bits representing multiple device on PMP. It is changed to consider bit
level.
No need to check for each set bit as all command is going to be aborted.
Signed-off-by: Prabhakar Kushwaha <redacted>
Signed-off-by: Ashish Kalra <redacted>
---
git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6.git (branch master)
drivers/ata/sata_fsl.c | 5 +++--
1 files changed, 3 insertions(+), 2 deletions(-)
From: David Laight <hidden> Date: 2011-02-18 08:44:36
=20
quoted hunk
+ if ((ffs(dereg)-1) < ap->nr_pmp_links) {+ /* array start from 0 */+ link =3D &ap->pmp_link[ffs(dereg)-1];
I'd only call ffs() once - it could be a slow library function.
Any comment should note that ffs() returns 0 when no bits
are set - rather than anything about array indexes.
David
+ if ((ffs(dereg)-1) < ap->nr_pmp_links) {+ /* array start from 0 */+ link =3D &ap->pmp_link[ffs(dereg)-1];
=20
I'd only call ffs() once - it could be a slow library function.
This function is called during error handling. So it won't matter.=20
Anyway, I will update the patch for singe usage of ffs().=20
Any comment should note that ffs() returns 0 when no bits are set -
rather than anything about array indexes.
=20
sata_fsl_error_intr() is called during device error.
The mentioned scenario will never comes. It can be observed via code:-
if (cereg) { --> cereg is set on command error. Means there is at least =
1 device present.
abort =3D 1;
---
---
---
/* find out the offending link and qc */
if (ap->nr_pmp_links) { --> if Port multiplier=20
---
---
if ((ffs(dereg)-1) < ap->nr_pmp_links) {
---
---
} else { --> Single device
dereg =3D ioread32(hcr_base + DE);
iowrite32(dereg, hcr_base + DE);
iowrite32(cereg, hcr_base + CE);
+ if ((ffs(dereg)-1) < ap->nr_pmp_links) {+ /* array start from 0 */+ link =3D &ap->pmp_link[ffs(dereg)-1];
=20
I'd only call ffs() once - it could be a slow library function.
This function is called during error handling. So it won't matter.=20
Anyway, I will update the patch for singe usage of ffs().=20
Any comment should note that ffs() returns 0 when no bits are set -=20
rather than anything about array indexes.
=20
sata_fsl_error_intr() is called during device error.
The mentioned scenario will never comes. It can be observed via code:-
if (cereg) { --> cereg is set on command error. Means there is at least =
1 device present.
abort =3D 1;
---
---
---
/* find out the offending link and qc */
if (ap->nr_pmp_links) { --> if Port multiplier=20
---
---
if ((ffs(dereg)-1) < ap->nr_pmp_links) {
---
---
} else { --> Single device
dereg =3D ioread32(hcr_base + DE);
iowrite32(dereg, hcr_base + DE);
iowrite32(cereg, hcr_base + CE);