[PATCH] e100: Fix Wake on lan related issues

Fix Wake on lan related issues

Signed-off-by: Mallikarjuna R Chilakala <mallikarjuna.chilakala@intel.com>
Signed-off-by: Ganesh Venkatesan <ganesh.venkatesan@intel.com>
Signed-off-by: John Ronciak <john.ronciak@intel.com>

authored by Malli Chilakala and committed by Jeff Garzik 6bdacb1a 0236ebb7

+28 -3
+28 -3
drivers/net/e100.c
··· 971 971 if(nic->flags & multicast_all) 972 972 config->multicast_all = 0x1; /* 1=accept, 0=no */ 973 973 974 - if(!(nic->flags & wol_magic)) 974 + /* disable WoL when up */ 975 + if(netif_running(nic->netdev) || !(nic->flags & wol_magic)) 975 976 config->magic_packet_disable = 0x1; /* 1=off, 0=on */ 976 977 977 978 if(nic->mac >= mac_82558_D101_A4) { ··· 1719 1718 return 0; 1720 1719 } 1721 1720 1721 + #ifdef CONFIG_PM 1722 1722 static int e100_asf(struct nic *nic) 1723 1723 { 1724 1724 /* ASF can be enabled from eeprom */ ··· 1728 1726 !(nic->eeprom[eeprom_config_asf] & eeprom_gcl) && 1729 1727 ((nic->eeprom[eeprom_smbus_addr] & 0xFF) != 0xFE)); 1730 1728 } 1729 + #endif 1731 1730 1732 1731 static int e100_up(struct nic *nic) 1733 1732 { ··· 1941 1938 else 1942 1939 nic->flags &= ~wol_magic; 1943 1940 1944 - pci_enable_wake(nic->pdev, 0, nic->flags & (wol_magic | e100_asf(nic))); 1945 1941 e100_exec_cb(nic, NULL, e100_configure); 1946 1942 1947 1943 return 0; ··· 2338 2336 (nic->eeprom[eeprom_id] & eeprom_id_wol)) 2339 2337 nic->flags |= wol_magic; 2340 2338 2341 - pci_enable_wake(pdev, 0, nic->flags & (wol_magic | e100_asf(nic))); 2339 + /* ack any pending wake events, disable PME */ 2340 + pci_enable_wake(pdev, 0, 0); 2342 2341 2343 2342 strcpy(netdev->name, "eth%d"); 2344 2343 if((err = register_netdev(netdev))) { ··· 2411 2408 2412 2409 pci_set_power_state(pdev, PCI_D0); 2413 2410 pci_restore_state(pdev); 2411 + /* ack any pending wake events, disable PME */ 2412 + pci_enable_wake(pdev, 0, 0); 2414 2413 if(e100_hw_init(nic)) 2415 2414 DPRINTK(HW, ERR, "e100_hw_init failed\n"); 2416 2415 ··· 2424 2419 } 2425 2420 #endif 2426 2421 2422 + 2423 + static void e100_shutdown(struct device *dev) 2424 + { 2425 + struct pci_dev *pdev = container_of(dev, struct pci_dev, dev); 2426 + struct net_device *netdev = pci_get_drvdata(pdev); 2427 + struct nic *nic = netdev_priv(netdev); 2428 + 2429 + #ifdef CONFIG_PM 2430 + pci_enable_wake(pdev, 0, nic->flags & (wol_magic | e100_asf(nic))); 2431 + #else 2432 + pci_enable_wake(pdev, 0, nic->flags & (wol_magic)); 2433 + #endif 2434 + } 2435 + 2436 + 2427 2437 static struct pci_driver e100_driver = { 2428 2438 .name = DRV_NAME, 2429 2439 .id_table = e100_id_table, ··· 2448 2428 .suspend = e100_suspend, 2449 2429 .resume = e100_resume, 2450 2430 #endif 2431 + 2432 + .driver = { 2433 + .shutdown = e100_shutdown, 2434 + } 2435 + 2451 2436 }; 2452 2437 2453 2438 static int __init e100_init_module(void)