Re: 2.4.29, e100 and a WOL packet causes keventd going mad

From: Scott Feldman
Date: Sun Jan 30 2005 - 22:47:31 EST


On Sun, 2005-01-30 at 09:18, David HÃrdeman wrote:
> I experience the same problems as reported by Michael Gernoth when
> sending a WOL-packet to computer with a e100 NIC which is already
> powered on.

I didn't look at the 2.4 case, but for 2.6, it seems e100 was enabling
PME wakeup during probe. PME shouldn't be enabled while the system is
up. I suspect the assertion of PME while the system is up is what's
causing problems. This patch moves PME wakeup enabling to either
suspend or shutdown.

David, would you give this patch a try? Make sure the system still
wakes from a magic packet if suspended or shut down, and doesn't cause
kacpid to go crazy if system is running. If it helps for 2.6, perhaps
someone can look into 2.4 to see if there is something similar going on
there.

-scott

--- linux-2.6.11-rc2/drivers/net/e100.c.orig 2005-01-30 19:13:56.850497376 -0800
+++ linux-2.6.11-rc2/drivers/net/e100.c 2005-01-30 19:26:41.154305536 -0800
@@ -1868,7 +1868,6 @@ static int e100_set_wol(struct net_devic
else
nic->flags &= ~wol_magic;

- pci_enable_wake(nic->pdev, 0, nic->flags & (wol_magic | e100_asf(nic)));
e100_exec_cb(nic, NULL, e100_configure);

return 0;
@@ -2262,8 +2261,6 @@ static int __devinit e100_probe(struct p
(nic->eeprom[eeprom_id] & eeprom_id_wol))
nic->flags |= wol_magic;

- pci_enable_wake(pdev, 0, nic->flags & (wol_magic | e100_asf(nic)));
-
strcpy(netdev->name, "eth%d");
if((err = register_netdev(netdev))) {
DPRINTK(PROBE, ERR, "Cannot register net device, aborting.\n");
@@ -2344,6 +2341,15 @@ static int e100_resume(struct pci_dev *p
}
#endif

+static void e100_shutdown(struct device *dev)
+{
+ struct pci_dev *pdev = container_of(dev, struct pci_dev, dev);
+ struct net_device *netdev = pci_get_drvdata(pdev);
+ struct nic *nic = netdev_priv(netdev);
+
+ pci_enable_wake(pdev, 0, nic->flags & (wol_magic | e100_asf(nic)));
+}
+
static struct pci_driver e100_driver = {
.name = DRV_NAME,
.id_table = e100_id_table,
@@ -2353,6 +2359,9 @@ static struct pci_driver e100_driver = {
.suspend = e100_suspend,
.resume = e100_resume,
#endif
+ .driver = {
+ .shutdown = e100_shutdown,
+ }
};

static int __init e100_init_module(void)



-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/