[PATCH] WOL for sis900

From: Malte Schröder
Date: Sat Oct 30 2004 - 10:54:29 EST


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@xxxxxx
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

Attachment: signature.asc
Description: OpenPGP digital signature