aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlex Chiang <achiang@canonical.com>2010-04-20 10:03:14 -0400
committerGreg Kroah-Hartman <gregkh@suse.de>2010-05-12 18:03:09 -0400
commita84461fa4a30a846ac0e590e3ceea88ec10fed89 (patch)
treec8cf097342e31139f99b6e85ff1d5e4a991de710
parent9dfffb5f7f813c58de1416efbff2eb617ac73c2a (diff)
ACPI: DMI init_set_sci_en_on_resume for multiple Lenovo ThinkPads
commit 07bedca29b0973f36a6b6db36936deed367164ed upstream. Multiple Lenovo ThinkPad models with Intel Core i5/i7 CPUs can successfully suspend/resume once, and then hang on the second s/r cycle. We got confirmation that this was due to a BIOS defect. The BIOS did not properly set SCI_EN coming out of S3. The BIOS guys hinted that The Other Leading OS ignores the fact that hardware owns the bit and sets it manually. In any case, an existing DMI table exists for machines where this defect is a known problem. Lenovo promise to fix their BIOS, but for folks who either won't or can't upgrade their BIOS, allow Linux to workaround the issue. https://bugzilla.kernel.org/show_bug.cgi?id=15407 https://bugs.launchpad.net/ubuntu/+source/linux/+bug/532374 Confirmed by numerous testers in the launchpad bug that using acpi_sleep=sci_force_enable fixes the issue. We add the machines to acpisleep_dmi_table[] to automatically enable this workaround. Cc: Colin King <colin.king@canonical.com> Signed-off-by: Alex Chiang <achiang@canonical.com> Signed-off-by: Len Brown <len.brown@intel.com> Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
-rw-r--r--drivers/acpi/sleep.c120
1 files changed, 120 insertions, 0 deletions
diff --git a/drivers/acpi/sleep.c b/drivers/acpi/sleep.c
index 79d33d908b5a..8bf1bc9e4c80 100644
--- a/drivers/acpi/sleep.c
+++ b/drivers/acpi/sleep.c
@@ -450,6 +450,126 @@ static struct dmi_system_id __initdata acpisleep_dmi_table[] = {
450 }, 450 },
451 }, 451 },
452 { 452 {
453 .callback = init_set_sci_en_on_resume,
454 .ident = "Lenovo ThinkPad T410",
455 .matches = {
456 DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
457 DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad T410"),
458 },
459 },
460 {
461 .callback = init_set_sci_en_on_resume,
462 .ident = "Lenovo ThinkPad T510",
463 .matches = {
464 DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
465 DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad T510"),
466 },
467 },
468 {
469 .callback = init_set_sci_en_on_resume,
470 .ident = "Lenovo ThinkPad W510",
471 .matches = {
472 DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
473 DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad W510"),
474 },
475 },
476 {
477 .callback = init_set_sci_en_on_resume,
478 .ident = "Lenovo ThinkPad X201",
479 .matches = {
480 DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
481 DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad X201"),
482 },
483 },
484 {
485 .callback = init_set_sci_en_on_resume,
486 .ident = "Lenovo ThinkPad X201",
487 .matches = {
488 DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
489 DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad X201s"),
490 },
491 },
492 {
493 .callback = init_set_sci_en_on_resume,
494 .ident = "Lenovo ThinkPad T410",
495 .matches = {
496 DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
497 DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad T410"),
498 },
499 },
500 {
501 .callback = init_set_sci_en_on_resume,
502 .ident = "Lenovo ThinkPad T510",
503 .matches = {
504 DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
505 DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad T510"),
506 },
507 },
508 {
509 .callback = init_set_sci_en_on_resume,
510 .ident = "Lenovo ThinkPad W510",
511 .matches = {
512 DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
513 DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad W510"),
514 },
515 },
516 {
517 .callback = init_set_sci_en_on_resume,
518 .ident = "Lenovo ThinkPad X201",
519 .matches = {
520 DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
521 DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad X201"),
522 },
523 },
524 {
525 .callback = init_set_sci_en_on_resume,
526 .ident = "Lenovo ThinkPad X201",
527 .matches = {
528 DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
529 DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad X201s"),
530 },
531 },
532 {
533 .callback = init_set_sci_en_on_resume,
534 .ident = "Lenovo ThinkPad T410",
535 .matches = {
536 DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
537 DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad T410"),
538 },
539 },
540 {
541 .callback = init_set_sci_en_on_resume,
542 .ident = "Lenovo ThinkPad T510",
543 .matches = {
544 DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
545 DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad T510"),
546 },
547 },
548 {
549 .callback = init_set_sci_en_on_resume,
550 .ident = "Lenovo ThinkPad W510",
551 .matches = {
552 DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
553 DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad W510"),
554 },
555 },
556 {
557 .callback = init_set_sci_en_on_resume,
558 .ident = "Lenovo ThinkPad X201",
559 .matches = {
560 DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
561 DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad X201"),
562 },
563 },
564 {
565 .callback = init_set_sci_en_on_resume,
566 .ident = "Lenovo ThinkPad X201",
567 .matches = {
568 DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
569 DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad X201s"),
570 },
571 },
572 {
453 .callback = init_old_suspend_ordering, 573 .callback = init_old_suspend_ordering,
454 .ident = "Panasonic CF51-2L", 574 .ident = "Panasonic CF51-2L",
455 .matches = { 575 .matches = {