diff options
| author | Vuong Nguyen <Vuong.Nguyen@Sun.COM> | 2009-10-12 12:21:08 -0400 |
|---|---|---|
| committer | Vuong Nguyen <Vuong.Nguyen@Sun.COM> | 2009-10-12 12:21:08 -0400 |
| commit | a643d9fdf6f49293abc965d6cf38a68ad0cb2534 (patch) | |
| tree | 701d01ad738c08b148d7ab5340a1206af5161116 | |
| parent | 1c3a0e9dd9f5bb14378d99eee9ed261ce24fc4d3 (diff) | |
| download | illumos-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.c | 15 |
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, |
