Messages in this thread Patch in this message | | | Date | Sat, 30 Oct 2004 17:43:44 +0200 | From | Malte Schröder <> | Subject | [PATCH] WOL for sis900 |
| |
Hello, I have applied the patch from http://lkml.org/lkml/2003/7/16/88 manually to 2.6.7 (also works on 2.6.{8,9}) and have been using it since then. Attached is a diff against 2.6.9.
Greets -- --------------------------------------- Malte Schröder MalteSch@gmx.de ICQ# 68121508 ---------------------------------------
--- drivers/net/sis900.c.orig 2004-10-18 23:53:51.000000000 +0200 +++ drivers/net/sis900.c 2004-10-30 17:35:49.000000000 +0200 @@ -74,12 +74,14 @@ #define SIS900_MODULE_NAME "sis900" #define SIS900_DRV_VERSION "v1.08.07 11/02/2003" +#define SIS900_WOL_DEFAULT 0 static char version[] __devinitdata = KERN_INFO "sis900.c: " SIS900_DRV_VERSION "\n"; static int max_interrupt_work = 40; static int multicast_filter_limit = 128; +static int enable_wol = SIS900_WOL_DEFAULT; #define sis900_debug debug static int sis900_debug; @@ -182,9 +184,11 @@ MODULE_PARM(multicast_filter_limit, "i"); MODULE_PARM(max_interrupt_work, "i"); MODULE_PARM(debug, "i"); +MODULE_PARM(enable_wol, "i"); MODULE_PARM_DESC(multicast_filter_limit, "SiS 900/7016 maximum number of filtered multicast addresses"); MODULE_PARM_DESC(max_interrupt_work, "SiS 900/7016 maximum events handled per interrupt"); MODULE_PARM_DESC(debug, "SiS 900/7016 debug level (2-4)"); +MODULE_PARM_DESC(enable_wol, "Enable Wake-on-LAN support (0/1)"); static int sis900_open(struct net_device *net_dev); static int sis900_mii_probe (struct net_device * net_dev); @@ -930,6 +934,7 @@ { struct sis900_private *sis_priv = net_dev->priv; long ioaddr = net_dev->base_addr; + u32 cfgpmcsr; u8 revision; int ret; @@ -956,6 +961,15 @@ /* Workaround for EDB */ sis900_set_mode(ioaddr, HW_SPEED_10_MBPS, FDX_CAPABLE_HALF_SELECTED); + /* Enable Wake-on-LAN if requested. */ + if (enable_wol) { + pci_read_config_dword(sis_priv->pci_dev, CFGPMCSR, &cfgpmcsr); + cfgpmcsr |= PME_EN; + pci_write_config_dword(sis_priv->pci_dev, CFGPMCSR, cfgpmcsr); + outl(inl(ioaddr + pmctrl) | MAGICPKT | ALGORITHM, ioaddr + pmctrl); + } else + outl(inl(ioaddr + pmctrl) & ~MAGICPKT, ioaddr + pmctrl); + /* Enable all known interrupts by setting the interrupt mask. */ outl((RxSOVR|RxORN|RxERR|RxOK|TxURN|TxERR|TxIDLE), ioaddr + imr); outl(RxENA | inl(ioaddr + cr), ioaddr + cr); --- drivers/net/sis900.h.orig 2004-10-30 17:35:42.000000000 +0200 +++ drivers/net/sis900.h 2004-10-30 17:35:49.000000000 +0200 @@ -140,6 +140,25 @@ EEREQ = 0x00000400, EEDONE = 0x00000200, EEGNT = 0x00000100 }; +/* Wake-on-LAN support. */ +enum sis900_power_management_control_register_bits { + LINKLOSS = 0x00000001, + LINKON = 0x00000002, + MAGICPKT = 0x00000400, + ALGORITHM = 0x00000800, + FRM1EN = 0x00100000, + FRM2EN = 0x00200000, + FRM3EN = 0x00400000, + FRM1ACS = 0x01000000, + FRM2ACS = 0x02000000, + FRM3ACS = 0x04000000, + WAKEALL = 0x40000000, + GATECLK = 0x80000000 +}; + +#define CFGPMCSR 0x44 +#define PME_EN 0x100 + /* Management Data I/O (mdio) frame */ #define MIIread 0x6000 #define MIIwrite 0x5002[unhandled content-type:application/pgp-signature] | |