lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [thread-next>] [day] [month] [year] [list]
Message-Id: <200808281129.35611.david-b@pacbell.net>
Date:	Thu, 28 Aug 2008 11:29:35 -0700
From:	David Brownell <david-b@...bell.net>
To:	Andrew Morton <akpm@...ux-foundation.org>
Cc:	lkml <linux-kernel@...r.kernel.org>,
	Stefan Becker <Stefan.Becker@...ia.com>,
	"Rafael J. Wysocki" <rjw@...k.pl>
Subject: [patch 2.6.27-rc4] rtc-cmos: wakes again from S5

>From : Rafael J. Wysocki <rjw@...k.pl>

Update rtc-cmos shutdown handling to leave RTC alarms active,
resolving http://bugzilla.kernel.org/show_bug.cgi?id=11411 on
several boards.  There are still some systems where the ACPI event
handling doesn't cooperate.  (Possibly related to bugid 11312,
reporting the spontaneous disabling of RTC events.)

Bug 11411 reported that changes to work around some ACPI event
issues broke wake-from-S5 handling, as used for DVR applications.
(They like to power off, then wake later to record programs.)

[ yakui.zhao@...el.com: add shutdown for PNP devices ] 
[ dbrownell@...rs.sourceforge.net: update comments ]

Signed-off-by: Rafael J. Wysocki <rjw@...k.pl>
Signed-off-by: Zhao Yakui <yakui.zhao@...el.com>
Signed-off-by: Zhang Rui <rui.zhang@...el.com>
Signed-off-by: David Brownell <dbrownell@...rs.sourceforge.net>
---
 drivers/rtc/rtc-cmos.c |   24 ++++++++++++++++++++++--
 1 file changed, 22 insertions(+), 2 deletions(-)

--- g26.orig/drivers/rtc/rtc-cmos.c	2008-08-23 14:27:19.000000000 -0700
+++ g26/drivers/rtc/rtc-cmos.c	2008-08-26 15:24:19.000000000 -0700
@@ -894,7 +894,6 @@ static void __exit cmos_do_remove(struct
 static int cmos_suspend(struct device *dev, pm_message_t mesg)
 {
 	struct cmos_rtc	*cmos = dev_get_drvdata(dev);
-	int		do_wake = device_may_wakeup(dev);
 	unsigned char	tmp;
 
 	/* only the alarm might be a wakeup event source */
@@ -903,7 +902,7 @@ static int cmos_suspend(struct device *d
 	if (tmp & (RTC_PIE|RTC_AIE|RTC_UIE)) {
 		unsigned char	mask;
 
-		if (do_wake)
+		if (device_may_wakeup(dev))
 			mask = RTC_IRQMASK & ~RTC_AIE;
 		else
 			mask = RTC_IRQMASK;
@@ -933,6 +932,17 @@ static int cmos_suspend(struct device *d
 	return 0;
 }
 
+/* We want RTC alarms to wake us from e.g. ACPI G2/S5 "soft off", even
+ * after a detour through G3 "mechanical off", although the ACPI spec
+ * says wakeup should only work from G1/S4 "hibernate".  To most users,
+ * distinctions between S4 and S5 are pointless.  So when the hardware
+ * allows, don't draw that distinction.
+ */
+static inline int cmos_poweroff(struct device *dev)
+{
+	return cmos_suspend(dev, PMSG_HIBERNATE);
+}
+
 static int cmos_resume(struct device *dev)
 {
 	struct cmos_rtc	*cmos = dev_get_drvdata(dev);
@@ -983,6 +993,12 @@ static int cmos_resume(struct device *de
 #else
 #define	cmos_suspend	NULL
 #define	cmos_resume	NULL
+
+static inline int cmos_poweroff(struct device *dev)
+{
+	return -ENOSYS;
+}
+
 #endif
 
 /*----------------------------------------------------------------*/
@@ -1002,10 +1018,6 @@ static int cmos_resume(struct device *de
 static int __devinit
 cmos_pnp_probe(struct pnp_dev *pnp, const struct pnp_device_id *id)
 {
-	/* REVISIT paranoia argues for a shutdown notifier, since PNP
-	 * drivers can't provide shutdown() methods to disable IRQs.
-	 * Or better yet, fix PNP to allow those methods...
-	 */
 	if (pnp_port_start(pnp,0) == 0x70 && !pnp_irq_valid(pnp,0))
 		/* Some machines contain a PNP entry for the RTC, but
 		 * don't define the IRQ. It should always be safe to
@@ -1041,6 +1053,13 @@ static int cmos_pnp_resume(struct pnp_de
 #define	cmos_pnp_resume		NULL
 #endif
 
+static void cmos_pnp_shutdown(struct device *pdev)
+{
+	if (system_state == SYSTEM_POWER_OFF && !cmos_poweroff(pdev))
+		return;
+
+	cmos_do_shutdown();
+}
 
 static const struct pnp_device_id rtc_ids[] = {
 	{ .id = "PNP0b00", },
@@ -1060,6 +1079,10 @@ static struct pnp_driver cmos_pnp_driver
 	.flags		= PNP_DRIVER_RES_DO_NOT_CHANGE,
 	.suspend	= cmos_pnp_suspend,
 	.resume		= cmos_pnp_resume,
+	.driver		= {
+		.name	  = (char *)driver_name,
+		.shutdown = cmos_pnp_shutdown,
+	}
 };
 
 #endif	/* CONFIG_PNP */
@@ -1085,6 +1108,9 @@ static int __exit cmos_platform_remove(s
 
 static void cmos_platform_shutdown(struct platform_device *pdev)
 {
+	if (system_state == SYSTEM_POWER_OFF && !cmos_poweroff(&pdev->dev))
+		return;
+
 	cmos_do_shutdown();
 }
 
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@...r.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ