Module Name: src
Committed By: mrg
Date: Sat May 17 20:44:08 UTC 2014
Modified Files:
src/sys/arch/sgimips/dev: crime.c
Log Message:
split crime_bus_reset() into crime_{cpu,mem}_reset() and only reset
the cpu or the memory upon either error, not both.
seems to make my O2 slightly less likely to hang, and matches what
the linux crime driver does.
To generate a diff of this commit:
cvs rdiff -u -r1.36 -r1.37 src/sys/arch/sgimips/dev/crime.c
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/sys/arch/sgimips/dev/crime.c
diff -u src/sys/arch/sgimips/dev/crime.c:1.36 src/sys/arch/sgimips/dev/crime.c:1.37
--- src/sys/arch/sgimips/dev/crime.c:1.36 Thu Aug 18 02:56:21 2011
+++ src/sys/arch/sgimips/dev/crime.c Sat May 17 20:44:08 2014
@@ -1,4 +1,4 @@
-/* $NetBSD: crime.c,v 1.36 2011/08/18 02:56:21 macallan Exp $ */
+/* $NetBSD: crime.c,v 1.37 2014/05/17 20:44:08 mrg Exp $ */
/*
* Copyright (c) 2004 Christopher SEKIYA
@@ -38,7 +38,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: crime.c,v 1.36 2011/08/18 02:56:21 macallan Exp $");
+__KERNEL_RCSID(0, "$NetBSD: crime.c,v 1.37 2014/05/17 20:44:08 mrg Exp $");
#include <sys/param.h>
#include <sys/device.h>
@@ -63,7 +63,9 @@ __KERNEL_RCSID(0, "$NetBSD: crime.c,v 1.
static int crime_match(device_t, struct cfdata *, void *);
static void crime_attach(device_t, device_t, void *);
-void crime_bus_reset(void);
+static void crime_mem_reset(void);
+static void crime_cpu_reset(void);
+static void crime_bus_reset(void);
void crime_watchdog_reset(void);
void crime_watchdog_disable(void);
void crime_intr(vaddr_t, uint32_t, uint32_t);
@@ -142,7 +144,8 @@ crime_attach(device_t parent, device_t s
aprint_normal(" (CRIME_ID: %" PRIu64 ")\n", crm_id);
/* reset CRIME CPU & memory error registers */
- crime_bus_reset();
+ crime_mem_reset();
+ crime_cpu_reset();
crime_watchdog_disable();
@@ -237,17 +240,17 @@ crime_intr(vaddr_t pc, uint32_t status,
CRIME_MEM_ERROR_STAT);
printf("crime: memory error address %" PRIu64
" status %" PRIu64 "\n", address << 2, stat);
- crime_bus_reset();
+ crime_mem_reset();
}
if (crime_ipending & CRIME_INT_CRMERR) {
stat = bus_space_read_8(crm_iot, crm_ioh,
CRIME_CPU_ERROR_STAT);
- printf("crime: cpu error %" PRIu64 " at"
- " address %" PRIu64 "\n", stat,
- bus_space_read_8(crm_iot, crm_ioh,
- CRIME_CPU_ERROR_ADDR));
- crime_bus_reset();
+ address = bus_space_read_8(crm_iot, crm_ioh,
+ CRIME_CPU_ERROR_ADDR) << 2;
+ printf("crime: cpu error %" PRIu64 " at address %"
+ PRIu64 "\n", stat, address);
+ crime_cpu_reset();
}
}
@@ -283,14 +286,28 @@ crime_intr_unmask(unsigned int intr)
}
void
-crime_bus_reset(void)
+crime_mem_reset(void)
{
- bus_space_write_8(crm_iot, crm_ioh, CRIME_CPU_ERROR_STAT, 0);
bus_space_write_8(crm_iot, crm_ioh, CRIME_MEM_ERROR_STAT, 0);
}
void
+crime_cpu_reset(void)
+{
+
+ bus_space_write_8(crm_iot, crm_ioh, CRIME_CPU_ERROR_STAT, 0);
+}
+
+void
+crime_bus_reset(void)
+{
+
+ crime_mem_reset();
+ crime_cpu_reset();
+}
+
+void
crime_watchdog_reset(void)
{