git://git.onelab.eu
/
linux-2.6.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Merge to Fedora kernel-2.6.18-1.2224_FC5 patched with stable patch-2.6.18.1-vs2.0...
[linux-2.6.git]
/
arch
/
i386
/
kernel
/
apm.c
diff --git
a/arch/i386/kernel/apm.c
b/arch/i386/kernel/apm.c
index
df0e174
..
e7f943f
100644
(file)
--- a/
arch/i386/kernel/apm.c
+++ b/
arch/i386/kernel/apm.c
@@
-201,7
+201,6
@@
* http://www.microsoft.com/hwdev/busbios/amp_12.htm]
*/
* http://www.microsoft.com/hwdev/busbios/amp_12.htm]
*/
-#include <linux/config.h>
#include <linux/module.h>
#include <linux/poll.h>
#include <linux/module.h>
#include <linux/poll.h>
@@
-374,14
+373,14
@@
static struct {
unsigned short segment;
} apm_bios_entry;
static int clock_slowed;
unsigned short segment;
} apm_bios_entry;
static int clock_slowed;
-static int idle_threshold = DEFAULT_IDLE_THRESHOLD;
-static int idle_period = DEFAULT_IDLE_PERIOD;
+static int idle_threshold
__read_mostly
= DEFAULT_IDLE_THRESHOLD;
+static int idle_period
__read_mostly
= DEFAULT_IDLE_PERIOD;
static int set_pm_idle;
static int suspends_pending;
static int standbys_pending;
static int ignore_sys_suspend;
static int ignore_normal_resume;
static int set_pm_idle;
static int suspends_pending;
static int standbys_pending;
static int ignore_sys_suspend;
static int ignore_normal_resume;
-static int bounce_interval = DEFAULT_BOUNCE_INTERVAL;
+static int bounce_interval
__read_mostly
= DEFAULT_BOUNCE_INTERVAL;
#ifdef CONFIG_APM_RTC_IS_GMT
# define clock_cmos_diff 0
#ifdef CONFIG_APM_RTC_IS_GMT
# define clock_cmos_diff 0
@@
-390,8
+389,8
@@
static int bounce_interval = DEFAULT_BOUNCE_INTERVAL;
static long clock_cmos_diff;
static int got_clock_diff;
#endif
static long clock_cmos_diff;
static int got_clock_diff;
#endif
-static int debug;
-static int smp;
+static int debug
__read_mostly
;
+static int smp
__read_mostly
;
static int apm_disabled = -1;
#ifdef CONFIG_SMP
static int power_off;
static int apm_disabled = -1;
#ifdef CONFIG_SMP
static int power_off;
@@
-403,8
+402,8
@@
static int realmode_power_off = 1;
#else
static int realmode_power_off;
#endif
#else
static int realmode_power_off;
#endif
-static int exit_kapmd;
-static int kapmd_running;
+static int exit_kapmd
__read_mostly
;
+static int kapmd_running
__read_mostly
;
#ifdef CONFIG_APM_ALLOW_INTS
static int allow_ints = 1;
#else
#ifdef CONFIG_APM_ALLOW_INTS
static int allow_ints = 1;
#else
@@
-416,15
+415,15
@@
static DECLARE_WAIT_QUEUE_HEAD(apm_waitqueue);
static DECLARE_WAIT_QUEUE_HEAD(apm_suspend_waitqueue);
static struct apm_user * user_list;
static DEFINE_SPINLOCK(user_list_lock);
static DECLARE_WAIT_QUEUE_HEAD(apm_suspend_waitqueue);
static struct apm_user * user_list;
static DEFINE_SPINLOCK(user_list_lock);
-static
struct desc_struct
bad_bios_desc = { 0, 0x00409200 };
+static
const struct desc_struct
bad_bios_desc = { 0, 0x00409200 };
-static c
har
driver_version[] = "1.16ac"; /* no spaces */
+static c
onst char
driver_version[] = "1.16ac"; /* no spaces */
/*
* APM event names taken from the APM 1.2 specification. These are
* the message codes that the BIOS uses to tell us about events
*/
/*
* APM event names taken from the APM 1.2 specification. These are
* the message codes that the BIOS uses to tell us about events
*/
-static c
har *
apm_event_name[] = {
+static c
onst char * const
apm_event_name[] = {
"system standby",
"system suspend",
"normal resume",
"system standby",
"system suspend",
"normal resume",
@@
-540,11
+539,22
@@
static inline void apm_restore_cpus(cpumask_t mask)
* Also, we KNOW that for the non error case of apm_bios_call, there
* is no useful data returned in the low order 8 bits of eax.
*/
* Also, we KNOW that for the non error case of apm_bios_call, there
* is no useful data returned in the low order 8 bits of eax.
*/
-#define APM_DO_CLI \
- if (apm_info.allow_ints) \
- local_irq_enable(); \
- else \
- local_irq_disable();
+#define APM_DO_CLI \
+ do { \
+ if (apm_info.allow_ints) { \
+ if (irqs_disabled_flags(flags)) \
+ local_irq_enable(); \
+ } else \
+ local_irq_disable(); \
+ } while (0)
+
+#define APM_DO_STI \
+ do { \
+ if (irqs_disabled_flags(flags)) \
+ local_irq_disable(); \
+ else if (irqs_disabled()) \
+ local_irq_enable(); \
+ } while (0)
#ifdef APM_ZERO_SEGS
# define APM_DECL_SEGS \
#ifdef APM_ZERO_SEGS
# define APM_DECL_SEGS \
@@
-601,7
+611,7
@@
static u8 apm_bios_call(u32 func, u32 ebx_in, u32 ecx_in,
APM_DO_SAVE_SEGS;
apm_bios_call_asm(func, ebx_in, ecx_in, eax, ebx, ecx, edx, esi);
APM_DO_RESTORE_SEGS;
APM_DO_SAVE_SEGS;
apm_bios_call_asm(func, ebx_in, ecx_in, eax, ebx, ecx, edx, esi);
APM_DO_RESTORE_SEGS;
-
local_irq_restore(flags)
;
+
APM_DO_STI
;
gdt[0x40 / 8] = save_desc_40;
put_cpu();
apm_restore_cpus(cpus);
gdt[0x40 / 8] = save_desc_40;
put_cpu();
apm_restore_cpus(cpus);
@@
-616,7
+626,7
@@
static u8 apm_bios_call(u32 func, u32 ebx_in, u32 ecx_in,
* @ecx_in: ECX register value for BIOS call
* @eax: EAX register on return from the BIOS call
*
* @ecx_in: ECX register value for BIOS call
* @eax: EAX register on return from the BIOS call
*
- * Make a BIOS call that
does only returns one value
, or just status.
+ * Make a BIOS call that
returns one value only
, or just status.
* If there is an error, then the error code is returned in AH
* (bits 8-15 of eax) and this function returns non-zero. This is
* used for simpler BIOS operations. This call may hold interrupts
* If there is an error, then the error code is returned in AH
* (bits 8-15 of eax) and this function returns non-zero. This is
* used for simpler BIOS operations. This call may hold interrupts
@@
-645,7
+655,7
@@
static u8 apm_bios_call_simple(u32 func, u32 ebx_in, u32 ecx_in, u32 *eax)
APM_DO_SAVE_SEGS;
error = apm_bios_call_simple_asm(func, ebx_in, ecx_in, eax);
APM_DO_RESTORE_SEGS;
APM_DO_SAVE_SEGS;
error = apm_bios_call_simple_asm(func, ebx_in, ecx_in, eax);
APM_DO_RESTORE_SEGS;
-
local_irq_restore(flags)
;
+
APM_DO_STI
;
gdt[0x40 / 8] = save_desc_40;
put_cpu();
apm_restore_cpus(cpus);
gdt[0x40 / 8] = save_desc_40;
put_cpu();
apm_restore_cpus(cpus);
@@
-764,9
+774,9
@@
static int apm_do_idle(void)
int idled = 0;
int polling;
int idled = 0;
int polling;
- polling =
test_thread_flag(TIF_POLLING_NRFLA
G);
+ polling =
!!(current_thread_info()->status & TS_POLLIN
G);
if (polling) {
if (polling) {
- c
lear_thread_flag(TIF_POLLING_NRFLAG)
;
+ c
urrent_thread_info()->status &= ~TS_POLLING
;
smp_mb__after_clear_bit();
}
if (!need_resched()) {
smp_mb__after_clear_bit();
}
if (!need_resched()) {
@@
-774,7
+784,7
@@
static int apm_do_idle(void)
ret = apm_bios_call_simple(APM_FUNC_IDLE, 0, 0, &eax);
}
if (polling)
ret = apm_bios_call_simple(APM_FUNC_IDLE, 0, 0, &eax);
}
if (polling)
-
set_thread_flag(TIF_POLLING_NRFLAG)
;
+
current_thread_info()->status |= TS_POLLING
;
if (!idled)
return 0;
if (!idled)
return 0;
@@
-822,7
+832,7
@@
static void apm_do_busy(void)
#define IDLE_CALC_LIMIT (HZ * 100)
#define IDLE_LEAKY_MAX 16
#define IDLE_CALC_LIMIT (HZ * 100)
#define IDLE_LEAKY_MAX 16
-static void (*original_pm_idle)(void);
+static void (*original_pm_idle)(void)
__read_mostly
;
/**
* apm_cpu_idle - cpu idling for APM capable Linux
/**
* apm_cpu_idle - cpu idling for APM capable Linux
@@
-1063,7
+1073,8
@@
static int apm_engage_power_management(u_short device, int enable)
static int apm_console_blank(int blank)
{
static int apm_console_blank(int blank)
{
- int error, i;
+ int error = APM_NOT_ENGAGED; /* silence gcc */
+ int i;
u_short state;
static const u_short dev[3] = { 0x100, 0x1FF, 0x101 };
u_short state;
static const u_short dev[3] = { 0x100, 0x1FF, 0x101 };
@@
-1104,7
+1115,8
@@
static int queue_empty(struct apm_user *as)
static apm_event_t get_queued_event(struct apm_user *as)
{
static apm_event_t get_queued_event(struct apm_user *as)
{
- as->event_tail = (as->event_tail + 1) % APM_MAX_EVENTS;
+ if (++as->event_tail >= APM_MAX_EVENTS)
+ as->event_tail = 0;
return as->events[as->event_tail];
}
return as->events[as->event_tail];
}
@@
-1118,13
+1130,16
@@
static void queue_event(apm_event_t event, struct apm_user *sender)
for (as = user_list; as != NULL; as = as->next) {
if ((as == sender) || (!as->reader))
continue;
for (as = user_list; as != NULL; as = as->next) {
if ((as == sender) || (!as->reader))
continue;
- as->event_head = (as->event_head + 1) % APM_MAX_EVENTS;
+ if (++as->event_head >= APM_MAX_EVENTS)
+ as->event_head = 0;
+
if (as->event_head == as->event_tail) {
static int notified;
if (notified++ == 0)
printk(KERN_ERR "apm: an event queue overflowed\n");
if (as->event_head == as->event_tail) {
static int notified;
if (notified++ == 0)
printk(KERN_ERR "apm: an event queue overflowed\n");
- as->event_tail = (as->event_tail + 1) % APM_MAX_EVENTS;
+ if (++as->event_tail >= APM_MAX_EVENTS)
+ as->event_tail = 0;
}
as->events[as->event_head] = event;
if ((!as->suser) || (!as->writer))
}
as->events[as->event_head] = event;
if ((!as->suser) || (!as->writer))
@@
-1282,7
+1297,7
@@
static void standby(void)
static apm_event_t get_event(void)
{
int error;
static apm_event_t get_event(void)
{
int error;
- apm_event_t event
;
+ apm_event_t event
= APM_NO_EVENTS; /* silence gcc */
apm_eventinfo_t info;
static int notified;
apm_eventinfo_t info;
static int notified;