summaryrefslogtreecommitdiff
path: root/usr/src/uts/common/io/cpudrv.c
diff options
context:
space:
mode:
authorMark Haywood <Mark.Haywood@Sun.COM>2009-06-02 15:03:55 -0400
committerMark Haywood <Mark.Haywood@Sun.COM>2009-06-02 15:03:55 -0400
commit67bdf3b0f9c03ddb09508476025689fb2ca68f45 (patch)
tree3c610da81ee06b1f3b7fe6e8a198f05fc7e4f3f1 /usr/src/uts/common/io/cpudrv.c
parent870ad75a2b67a92c3449d93b4fef8a0baa982b4a (diff)
downloadillumos-joyent-67bdf3b0f9c03ddb09508476025689fb2ca68f45.tar.gz
6841256 CPU PM fails after suspend on Lenovo T61
Diffstat (limited to 'usr/src/uts/common/io/cpudrv.c')
-rw-r--r--usr/src/uts/common/io/cpudrv.c16
1 files changed, 10 insertions, 6 deletions
diff --git a/usr/src/uts/common/io/cpudrv.c b/usr/src/uts/common/io/cpudrv.c
index 8314c5df43..5888d96a1e 100644
--- a/usr/src/uts/common/io/cpudrv.c
+++ b/usr/src/uts/common/io/cpudrv.c
@@ -853,7 +853,8 @@ cpudrv_comp_create(cpudrv_devstate_t *cpudsp)
/*
* Marks a component busy and calls pm_raise_power().
*/
-#define CPUDRV_MONITOR_PM_BUSY_AND_RAISE(dip, cpudsp, cpupm, new_level) { \
+#define CPUDRV_MONITOR_PM_BUSY_AND_RAISE(dip, cpudsp, cpupm, new_spd) { \
+ int ret; \
/* \
* Mark driver and PM framework busy first so framework doesn't try \
* to bring CPU to lower speed when we need to be at higher speed. \
@@ -862,13 +863,16 @@ cpudrv_comp_create(cpudrv_devstate_t *cpudsp)
mutex_exit(&(cpudsp)->lock); \
DPRINTF(D_PM_MONITOR, ("cpudrv_monitor: instance %d: " \
"pm_raise_power called to %d\n", ddi_get_instance((dip)), \
- (new_level))); \
- if (pm_raise_power((dip), CPUDRV_COMP_NUM, (new_level)) != \
- DDI_SUCCESS) { \
+ (new_spd->pm_level))); \
+ ret = pm_raise_power((dip), CPUDRV_COMP_NUM, (new_spd->pm_level)); \
+ if (ret != DDI_SUCCESS) { \
cmn_err(CE_WARN, "cpudrv_monitor: instance %d: can't " \
"raise CPU power level", ddi_get_instance((dip))); \
} \
mutex_enter(&(cpudsp)->lock); \
+ if (ret == DDI_SUCCESS && cpudsp->cpudrv_pm.cur_spd == NULL) { \
+ cpudsp->cpudrv_pm.cur_spd = new_spd; \
+ } \
}
/*
@@ -974,7 +978,7 @@ cpudrv_monitor(void *arg)
DPRINTF(D_PM_MONITOR, ("cpudrv_monitor: instance %d: "
"cur_spd is unknown\n", ddi_get_instance(dip)));
CPUDRV_MONITOR_PM_BUSY_AND_RAISE(dip, cpudsp, cpupm,
- CPUDRV_TOPSPEED(cpupm)->pm_level);
+ CPUDRV_TOPSPEED(cpupm));
/*
* We just changed the speed. Wait till at least next
* call to this routine before proceeding ahead.
@@ -1079,7 +1083,7 @@ cpudrv_monitor(void *arg)
} else {
new_spd = cur_spd->up_spd;
CPUDRV_MONITOR_PM_BUSY_AND_RAISE(dip, cpudsp, cpupm,
- new_spd->pm_level);
+ new_spd);
}
} else if ((user_cnt <= cur_spd->user_lwm) &&
(idle_cnt >= cur_spd->idle_hwm) || !CPU_ACTIVE(cpudsp->cp)) {