Sophie

Sophie

distrib > Scientific%20Linux > 5x > x86_64 > by-pkgid > 27922b4260f65d317aabda37e42bbbff > files > 773

kernel-2.6.18-238.el5.src.rpm

From: Mauro Carvalho Chehab <mchehab@redhat.com>
Date: Tue, 28 Sep 2010 14:34:13 -0400
Subject: [edac] i7300_edac: properly detect channel on CE errors
Message-id: <20100928113413.3bdf04a1@pedra>
Patchwork-id: 28450
O-Subject: [PATCH RHEL5 19/27] i7300_edac: Properly detect channel on CE errors
Bugzilla: 487428
RH-Acked-by: Prarit Bhargava <prarit@redhat.com>

Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
Signed-off-by: Jarod Wilson <jarod@redhat.com>

diff --git a/drivers/edac/i7300_edac.c b/drivers/edac/i7300_edac.c
index a06db65..a85a8e5 100644
--- a/drivers/edac/i7300_edac.c
+++ b/drivers/edac/i7300_edac.c
@@ -101,7 +101,6 @@
   #define IS_SINGLE_MODE(mca)		((mca) & (1 << 14))
 
 #define TOLM			0x6C
-#define REDMEMB			0x7C
 
 #define MIR0			0x80
 #define MIR1			0x84
@@ -279,6 +278,9 @@ static const char *ferr_global_lo_name[] = {
 
 #define REDMEMA		0xdc
 
+#define REDMEMB		0x7c
+  #define IS_SECOND_CH(v)	((v) * (1 << 17))
+
 #define RECMEMA		0xe0
   #define RECMEMA_BANK(v)	(((v) >> 12) & 7)
   #define RECMEMA_RANK(v)	(((v) >> 8) & 15)
@@ -414,7 +416,7 @@ static void i7300_process_fbd_error(struct mem_ctl_info *mci)
 	struct i7300_pvt *pvt;
 	u32 errnum, value;
 	u16 val16;
-	unsigned branch, bank, rank, cas, ras;
+	unsigned branch, channel, bank, rank, cas, ras;
 	u32 syndrome;
 
 	unsigned long errors;
@@ -488,12 +490,19 @@ static void i7300_process_fbd_error(struct mem_ctl_info *mci)
 		cas = RECMEMB_CAS(value);
 		ras = RECMEMB_RAS(value);
 
+		pci_read_config_dword(pvt->pci_dev_16_1_fsb_addr_map,
+				     REDMEMB, &value);
+
+		channel = (branch << 1);
+		if (IS_SECOND_CH(value))
+			channel++;
+
 		/* Form out message */
 		snprintf(pvt->tmp_prt_buffer, PAGE_SIZE,
-			"Corrected error (Branch=%d (channel %d or %d), "
+			"Corrected error (Branch=%d, Channel %d), "
 			" DRAM-Bank=%d %s "
 			"RAS=%d CAS=%d, CE Err=0x%lx, Syndrome=0x%08x(%s))",
-			branch, branch << 1, (branch << 1) + 1,
+			branch, channel,
 			bank,
 			is_wr ? "RDWR" : "RD",
 			ras, cas,
@@ -505,7 +514,7 @@ static void i7300_process_fbd_error(struct mem_ctl_info *mci)
 		 *	 Currently, we don't know how to identify the right
 		 *	 channel.
 		 */
-		edac_mc_handle_fbd_ce(mci, rank, branch << 1,
+		edac_mc_handle_fbd_ce(mci, rank, channel,
 				      pvt->tmp_prt_buffer);
 	}
 	return;