[PATCH] driver/FSL SATA:Fix wrong Device Error Register usage

Subsystems: libata subsystem (serial and parallel ata drivers), the rest

STALE5713d

4 messages, 3 authors, 2011-02-18 · open the first message on its own page

[PATCH] driver/FSL SATA:Fix wrong Device Error Register usage

From: Prabhakar Kushwaha <hidden>
Date: 2011-02-18 05:50:39

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(-)
diff --git a/drivers/ata/sata_fsl.c b/drivers/ata/sata_fsl.c
index 2546f38..8ad335f 100644
--- a/drivers/ata/sata_fsl.c
+++ b/drivers/ata/sata_fsl.c
@@ -1047,8 +1047,9 @@ static void sata_fsl_error_intr(struct ata_port *ap)
 			iowrite32(dereg, hcr_base + DE);
 			iowrite32(cereg, hcr_base + CE);
 
-			if (dereg < ap->nr_pmp_links) {
-				link = &ap->pmp_link[dereg];
+			if ((ffs(dereg)-1) < ap->nr_pmp_links) {
+				/* array start from 0 */
+				link = &ap->pmp_link[ffs(dereg)-1];
 				ehi = &link->eh_info;
 				qc = ata_qc_from_tag(ap, link->active_tag);
 				/*
-- 
1.7.3

RE: [PATCH] driver/FSL SATA:Fix wrong Device Error Register usage

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

RE: [PATCH] driver/FSL SATA:Fix wrong Device Error Register usage

From: Kushwaha Prabhakar-B32579 <hidden>
Date: 2011-02-18 10:00:04

Thanks David for review comments!!

Please find my reply in-lined
-----Original Message-----
From: David Laight [mailto:David.Laight@ACULAB.COM]
Sent: Friday, February 18, 2011 2:12 PM
To: Kushwaha Prabhakar-B32579; linuxppc-dev@lists.ozlabs.org
Cc: Kalra Ashish-B00888
Subject: RE: [PATCH] driver/FSL SATA:Fix wrong Device Error Register
usage
=20
=20
quoted
+			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);

RE: [PATCH] driver/FSL SATA:Fix wrong Device Error Register usage

From: Kushwaha Prabhakar-B32579 <hidden>
Date: 2011-02-18 10:17:38

Thanks David for review comments!!

Please find my reply in-lined
-----Original Message-----
From: David Laight [mailto:David.Laight@ACULAB.COM]
Sent: Friday, February 18, 2011 2:12 PM
To: Kushwaha Prabhakar-B32579; linuxppc-dev@lists.ozlabs.org
Cc: Kalra Ashish-B00888
Subject: RE: [PATCH] driver/FSL SATA:Fix wrong Device Error Register=20
usage
=20
=20
quoted
+			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);
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help