summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVuong Nguyen <Vuong.Nguyen@Sun.COM>2009-10-12 12:21:08 -0400
committerVuong Nguyen <Vuong.Nguyen@Sun.COM>2009-10-12 12:21:08 -0400
commita643d9fdf6f49293abc965d6cf38a68ad0cb2534 (patch)
tree701d01ad738c08b148d7ab5340a1206af5161116
parent1c3a0e9dd9f5bb14378d99eee9ed261ce24fc4d3 (diff)
downloadillumos-joyent-a643d9fdf6f49293abc965d6cf38a68ad0cb2534.tar.gz
6886690 chipset 5100 driver causes panic in single channel mode
-rw-r--r--usr/src/uts/intel/io/intel_nb5000/intel_nb5000.c15
1 files changed, 12 insertions, 3 deletions
diff --git a/usr/src/uts/intel/io/intel_nb5000/intel_nb5000.c b/usr/src/uts/intel/io/intel_nb5000/intel_nb5000.c
index 2b78c167c3..2a7159b96b 100644
--- a/usr/src/uts/intel/io/intel_nb5000/intel_nb5000.c
+++ b/usr/src/uts/intel/io/intel_nb5000/intel_nb5000.c
@@ -1256,11 +1256,12 @@ log_nf_fbd_err(nb_regs_t *rp, int willpanic, int *interpose)
}
}
-static void
+static int
log_nf_mem_err(nb_regs_t *rp, int willpanic, int *interpose)
{
int channel, branch;
int t = 0;
+ int rt = 0;
rp->flag = NB_REG_LOG_NF_MEM;
@@ -1311,6 +1312,14 @@ log_nf_mem_err(nb_regs_t *rp, int willpanic, int *interpose)
SPCPS_WR(branch);
}
}
+ if (nb_mode == NB_MEMORY_SINGLE_CHANNEL && channel != 0) {
+ /*
+ * In the single channel mode, all dimms are on the channel 0.
+ * Invalidate this error if the channel number is invalid.
+ */
+ rt = 1;
+ }
+ return (rt);
}
static void
@@ -1332,7 +1341,7 @@ log_ferr(uint64_t ferr, uint32_t *nerrp, nb_logout_t *log, int willpanic)
log_nf_fbd_err(rp, willpanic, &interpose);
*nerrp = nerr & ~GE_NERR_FBD_NF;
} else if ((ferr & GE_MEM_NF) != 0) {
- log_nf_mem_err(rp, willpanic, &interpose);
+ spurious = log_nf_mem_err(rp, willpanic, &interpose);
*nerrp = nerr & ~GE_NERR_MEM_NF;
} else if ((ferr & (GE_FERR_FSB_FATAL | GE_FERR_FSB_NF)) != 0) {
log_fsb_err(ferr, rp, willpanic, &interpose);
@@ -1378,7 +1387,7 @@ log_nerr(uint32_t *errp, nb_logout_t *log, int willpanic)
log_nf_fbd_err(rp, willpanic, &interpose);
*errp = err & ~GE_NERR_FBD_NF;
} else if ((err & GE_NERR_MEM_NF) != 0) {
- log_nf_mem_err(rp, willpanic, &interpose);
+ spurious = log_nf_mem_err(rp, willpanic, &interpose);
*errp = err & ~GE_NERR_MEM_NF;
} else if ((err & (GE_NERR_FSB_FATAL | GE_NERR_FSB_NF)) != 0) {
log_fsb_err(GE_NERR_TO_FERR_FSB(err), rp, willpanic,