[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: Re: pci_set_power_state reasserting SOLVED



Hello,

I have the same problem with KDE and knemo running. Problem will go away as 
soon as knemo is closed, but I want to keep it open and monitoring the 
network card. 

It also seems to be a problem special to the "3Com Corporation 3c905 100BaseTX 
[Boomerang]" card or its driver (which does not have any power-management 
capabilities at all) as I have the same card as in this post: 
https://bugzilla.novell.com/show_bug.cgi?id=227391. But the patch there did 
not help me - so I prepared my own against kernel version 2.6.18. It should 
now check the card capabilities before any other actions or checks:

--- a/drivers/pci/pci.c	2006-09-20 05:42:06.000000000 +0200
+++ b/drivers/pci/pci.c	2007-02-11 09:54:00.000000000 +0100
@@ -303,17 +303,6 @@
 	if (state > PCI_D3hot)
 		state = PCI_D3hot;
 
-	/* Validate current state:
-	 * Can enter D0 from any state, but if we can only go deeper 
-	 * to sleep if we're already in a low power state
-	 */
-	if (state != PCI_D0 && dev->current_state > state) {
-		printk(KERN_ERR "%s(): %s: state=%d, current state=%d\n",
-			__FUNCTION__, pci_name(dev), state, dev->current_state);
-		return -EINVAL;
-	} else if (dev->current_state == state)
-		return 0;        /* we're already there */
-
 	/*
 	 * If the device or the parent bridge can't support PCI PM, ignore
 	 * the request if we're doing anything besides putting it into D0
@@ -337,6 +326,17 @@
 		return -EIO;
 	}
 
+	/* Validate current state:
+	 * Can enter D0 from any state, but if we can only go deeper 
+	 * to sleep if we're already in a low power state
+	 */
+	if (state != PCI_D0 && dev->current_state > state) {
+		printk(KERN_ERR "%s(): %s: state=%d, current state=%d\n",
+			__FUNCTION__, pci_name(dev), state, dev->current_state);
+		return -EINVAL;
+	} else if (dev->current_state == state)
+		return 0;        /* we're already there */
+
 	/* check if this device supports the desired state */
 	if (state == PCI_D1 && !(pmc & PCI_PM_CAP_D1))
 		return -EIO;


This did help me, and I hope it will help in similiar cases too.

Regards,
T. Rupf



Reply to: