]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/blame - releases/2.6.33.4/acpi-dmi-init_set_sci_en_on_resume-for-multiple-lenovo-thinkpads.patch
4.9-stable patches
[thirdparty/kernel/stable-queue.git] / releases / 2.6.33.4 / acpi-dmi-init_set_sci_en_on_resume-for-multiple-lenovo-thinkpads.patch
CommitLineData
117d7c07
GKH
1From 07bedca29b0973f36a6b6db36936deed367164ed Mon Sep 17 00:00:00 2001
2From: Alex Chiang <achiang@canonical.com>
3Date: Tue, 20 Apr 2010 08:03:14 -0600
4Subject: ACPI: DMI init_set_sci_en_on_resume for multiple Lenovo ThinkPads
5
6From: Alex Chiang <achiang@canonical.com>
7
8commit 07bedca29b0973f36a6b6db36936deed367164ed upstream.
9
10Multiple Lenovo ThinkPad models with Intel Core i5/i7 CPUs can
11successfully suspend/resume once, and then hang on the second s/r
12cycle.
13
14We got confirmation that this was due to a BIOS defect. The BIOS
15did not properly set SCI_EN coming out of S3. The BIOS guys
16hinted that The Other Leading OS ignores the fact that hardware
17owns the bit and sets it manually.
18
19In any case, an existing DMI table exists for machines where this
20defect is a known problem. Lenovo promise to fix their BIOS, but
21for folks who either won't or can't upgrade their BIOS, allow
22Linux to workaround the issue.
23
24https://bugzilla.kernel.org/show_bug.cgi?id=15407
25https://bugs.launchpad.net/ubuntu/+source/linux/+bug/532374
26
27Confirmed by numerous testers in the launchpad bug that using
28acpi_sleep=sci_force_enable fixes the issue. We add the machines
29to acpisleep_dmi_table[] to automatically enable this workaround.
30
31Cc: Colin King <colin.king@canonical.com>
32Signed-off-by: Alex Chiang <achiang@canonical.com>
33Signed-off-by: Len Brown <len.brown@intel.com>
34Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
35
36---
37 drivers/acpi/sleep.c | 120 +++++++++++++++++++++++++++++++++++++++++++++++++++
38 1 file changed, 120 insertions(+)
39
40--- a/drivers/acpi/sleep.c
41+++ b/drivers/acpi/sleep.c
42@@ -450,6 +450,126 @@ static struct dmi_system_id __initdata a
43 },
44 },
45 {
46+ .callback = init_set_sci_en_on_resume,
47+ .ident = "Lenovo ThinkPad T410",
48+ .matches = {
49+ DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
50+ DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad T410"),
51+ },
52+ },
53+ {
54+ .callback = init_set_sci_en_on_resume,
55+ .ident = "Lenovo ThinkPad T510",
56+ .matches = {
57+ DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
58+ DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad T510"),
59+ },
60+ },
61+ {
62+ .callback = init_set_sci_en_on_resume,
63+ .ident = "Lenovo ThinkPad W510",
64+ .matches = {
65+ DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
66+ DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad W510"),
67+ },
68+ },
69+ {
70+ .callback = init_set_sci_en_on_resume,
71+ .ident = "Lenovo ThinkPad X201",
72+ .matches = {
73+ DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
74+ DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad X201"),
75+ },
76+ },
77+ {
78+ .callback = init_set_sci_en_on_resume,
79+ .ident = "Lenovo ThinkPad X201",
80+ .matches = {
81+ DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
82+ DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad X201s"),
83+ },
84+ },
85+ {
86+ .callback = init_set_sci_en_on_resume,
87+ .ident = "Lenovo ThinkPad T410",
88+ .matches = {
89+ DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
90+ DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad T410"),
91+ },
92+ },
93+ {
94+ .callback = init_set_sci_en_on_resume,
95+ .ident = "Lenovo ThinkPad T510",
96+ .matches = {
97+ DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
98+ DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad T510"),
99+ },
100+ },
101+ {
102+ .callback = init_set_sci_en_on_resume,
103+ .ident = "Lenovo ThinkPad W510",
104+ .matches = {
105+ DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
106+ DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad W510"),
107+ },
108+ },
109+ {
110+ .callback = init_set_sci_en_on_resume,
111+ .ident = "Lenovo ThinkPad X201",
112+ .matches = {
113+ DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
114+ DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad X201"),
115+ },
116+ },
117+ {
118+ .callback = init_set_sci_en_on_resume,
119+ .ident = "Lenovo ThinkPad X201",
120+ .matches = {
121+ DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
122+ DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad X201s"),
123+ },
124+ },
125+ {
126+ .callback = init_set_sci_en_on_resume,
127+ .ident = "Lenovo ThinkPad T410",
128+ .matches = {
129+ DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
130+ DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad T410"),
131+ },
132+ },
133+ {
134+ .callback = init_set_sci_en_on_resume,
135+ .ident = "Lenovo ThinkPad T510",
136+ .matches = {
137+ DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
138+ DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad T510"),
139+ },
140+ },
141+ {
142+ .callback = init_set_sci_en_on_resume,
143+ .ident = "Lenovo ThinkPad W510",
144+ .matches = {
145+ DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
146+ DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad W510"),
147+ },
148+ },
149+ {
150+ .callback = init_set_sci_en_on_resume,
151+ .ident = "Lenovo ThinkPad X201",
152+ .matches = {
153+ DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
154+ DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad X201"),
155+ },
156+ },
157+ {
158+ .callback = init_set_sci_en_on_resume,
159+ .ident = "Lenovo ThinkPad X201",
160+ .matches = {
161+ DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
162+ DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad X201s"),
163+ },
164+ },
165+ {
166 .callback = init_old_suspend_ordering,
167 .ident = "Panasonic CF51-2L",
168 .matches = {