diff options
author | Mark Haywood <Mark.Haywood@Sun.COM> | 2009-06-02 15:03:55 -0400 |
---|---|---|
committer | Mark Haywood <Mark.Haywood@Sun.COM> | 2009-06-02 15:03:55 -0400 |
commit | 67bdf3b0f9c03ddb09508476025689fb2ca68f45 (patch) | |
tree | 3c610da81ee06b1f3b7fe6e8a198f05fc7e4f3f1 /usr/src/uts/common/io/cpudrv.c | |
parent | 870ad75a2b67a92c3449d93b4fef8a0baa982b4a (diff) | |
download | illumos-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.c | 16 |
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)) { |