--- linux-2.6.22-rc6/drivers/acpi/processor_idle.c	2007-06-26 16:58:25.000000000 -0700
+++ linux-2.6.22-rc6-c3/drivers/acpi/processor_idle.c	2007-07-01 15:42:12.000000000 -0700
@@ -505,9 +505,9 @@
 	if (pr->flags.bm_check) {
 		/* bus mastering control is necessary */
 		if (!pr->flags.bm_control) {
+			/* In this case we enter C3 without bus mastering */
 			ACPI_DEBUG_PRINT((ACPI_DB_INFO,
-					  "C3 support requires bus mastering control\n"));
-			return;
+				"C3 support without bus mastering control\n"));
 		}
 	} else {
 		/*
@@ -982,8 +982,17 @@
 	 */
 	acpi_state_timer_broadcast(pr, cx, 1);
 
-	/* disable bus master */
-	if (pr->flags.bm_check) {
+        /*
+         * disable bus master
+         * bm_check implies we need ARB_DIS
+         * !bm_check implies we need cache flush
+         * bm_control implies whether we can do ARB_DIS
+         *
+         * That leaves a case where bm_check is set and bm_control is not set.
+         * In that case we cannot do much, we enter C3 without doing anything.
+         * This the other OS compatible behavior.
+         */
+        if (pr->flags.bm_check && pr->flags.bm_control) {
 		spin_lock(&c3_lock);
 			c3_cpu_count++;
 		if (c3_cpu_count == num_online_cpus()) {
@@ -994,7 +1003,7 @@
 			acpi_set_register(ACPI_BITREG_ARB_DISABLE, 1);
 		}
 		spin_unlock(&c3_lock);
-	} else {
+	} else if (!pr->flags.bm_check) {
 		/* SMP with no shared cache... Invalidate cache  */
 		ACPI_FLUSH_CPU_CACHE();
 	}
@@ -1004,7 +1013,7 @@
 	acpi_idle_do_entry(cx);
 	t2 = inl(acpi_gbl_FADT.xpm_timer_block.address);
 
-	if (pr->flags.bm_check) {
+	if (pr->flags.bm_check && pr->flags.bm_control) {
 		spin_lock(&c3_lock);
 		/* Enable bus master arbitration */
 		if (c3_cpu_count == num_online_cpus())
