Skip to contentSkip to conversation

WOL for sis900

PATCH In review Malte Schröder 4 participants 8 messages Oct 30, 2004 – Nov 10, 2004

Subsystems (2)
lore
Share & tools
lore
#0 lore raw

PATCH 1/1 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

Signature · 5 lines
---------------------------------------
Malte Schröder
[email protected]
ICQ# 68121508
---------------------------------------
net/sis900.c renamed from net/sis900.c.orig +14 -0
@@ -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);
net/sis900.h renamed from net/sis900.h.orig +19 -0
@@ -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
#2 lore raw
Quoted 7 lines · Jeff Garzik
Quoted 4 lines · Malte Schröder

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.

2) Please use ethtool to enable/disable WOL. No need for a module option.

Attached is a first try at this wol via ethtool thing. I don't think to have got it right, but here it is.

I tried to test WoL on my laptop, obvioulsy it didn't work, but I don't even know if I have the hardware support for it.
On this page:
http://www.sis.com/products/connectivity/900.htm
it says that the magic packet feature is optional.

I would really like to have some way to check if WoL is supported by the hardware before thinking to include this. I didn't find any documentation of some use for this.

Finally, I have never realized the sorry state of sis900 wrt ethtool, I'll try to get some more support...

The attached patch is against clean 2.6.9 and is NOT for inclusion.

Signature · 3 lines
------------------------------
Daniele Venzano
Web: http://teg.homeunix.org
sis900.c +34 -0
Index: sis900.c
===================================================================
@@ -120,6 +120,7 @@
 } mii_chip_table[] = {
 	{ "SiS 900 Internal MII PHY", 		0x001d, 0x8000, LAN },
 	{ "SiS 7014 Physical Layer Solution", 	0x0016, 0xf830, LAN },
+	{ "Altimata AC101LF PHY",               0x0022, 0x5520, LAN },
 	{ "AMD 79C901 10BASE-T PHY",  		0x0000, 0x6B70, LAN },
 	{ "AMD 79C901 HomePNA PHY",		0x0000, 0x6B90, HOME},
 	{ "ICS LAN PHY",			0x0015, 0xF440, LAN },
@@ -1903,8 +1904,41 @@
 	strcpy (info->bus_info, pci_name(sis_priv->pci_dev));
 }
 
+static int sis900_set_wol(struct net_device *net_dev, struct ethtool_wolinfo *wol)
+{
+	struct sis900_private *sis_priv = net_dev->priv;
+	long ioaddr = net_dev->base_addr;
+	u32 cfgpmcsr;
+	
+	if (wol->wolopts & WAKE_MAGIC) {
+		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 if (wol->wolopts) {
+		return -EINVAL;
+	} else {
+		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, ioaddr + pmctrl);
+	}
+
+	return 0;
+}
+
+static void sis900_get_wol(struct net_device *net_dev, struct ethtool_wolinfo *wol)
+{
+	long ioaddr = net_dev->base_addr;
+
+	if (inl(ioaddr + pmctrl) & MAGICPKT, ioaddr + pmctrl)
+		wol->wolopts |= WAKE_MAGIC;
+}
+
 static struct ethtool_ops sis900_ethtool_ops = {
 	.get_drvinfo =		sis900_get_drvinfo,
+	.get_wol =		sis900_get_wol,
+	.set_wol =		sis900_set_wol,	
 };
 
 /**
sis900.h +19 -0
Index: sis900.h
===================================================================
@@ -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
#3 lore raw
Quoted 20 lines · Daniele Venzano
Quoted 7 lines · Jeff Garzik
Quoted 3 lines · Malte Schröder

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.

2) Please use ethtool to enable/disable WOL. No need for a module option.

Attached is a first try at this wol via ethtool thing. I don't think to have got it right, but here it is.

I tried to test WoL on my laptop, obvioulsy it didn't work, but I don't even know if I have the hardware support for it.
On this page:
http://www.sis.com/products/connectivity/900.htm
it says that the magic packet feature is optional.

Quoted 8 lines

I would really like to have some way to check if WoL is supported by the hardware before thinking to include this. I didn't find any documentation of some use for this.

Finally, I have never realized the sorry state of sis900 wrt ethtool, I'll try to get some more support...

The attached patch is against clean 2.6.9 and is NOT for inclusion.

I just tried your patch and it works for me :) My sis900 is on-board component of the sis746 chipset.

Signature · 5 lines
---------------------------------------
Malte Schröder
[email protected]
ICQ# 68121508
---------------------------------------
#4 lore raw
In reply to Malte Schröder
Quoted 4 lines · Malte Schröder

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.

Want to change the MODULE_PARM to new-style module_param() calls, too?

Thanks,
Rusty.

Signature · 1 line
A bad analogy is like a leaky screwdriver -- Richard Braakman
#5 lore raw
Quoted 8 lines · Rusty Russell
Quoted 3 lines · Malte Schröder

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.

Want to change the MODULE_PARM to new-style module_param() calls, too?

Since I don't exactly know what this means and currently don't have the time to find out I don't think so.
And if WoL should be done using ethtool, my patch should be ignored and the one of Daniele Venzano (posted to [email protected]) should be considered.

(Will gather some more background information before posting a patch next time ;) )

Greets :)

Quoted 3 lines

Thanks,
Rusty.

Signature · 5 lines
---------------------------------------
Malte Schröder
[email protected]
ICQ# 68121508
---------------------------------------
#6 lore raw
In reply to Rusty Russell
Quoted 7 lines · Rusty Russell
Quoted 4 lines · Malte Schröder

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.

Want to change the MODULE_PARM to new-style module_param() calls, too?

Just added to the TODO list ;-)
I'm acting as maintainer for the sis900 driver and the list of the TODO os growing at an awesome speed.

What I'm really lacking is some piece of technical documentation for the chip. The WoL support depends on this, because I don't know how to check for the hardware support for it.
For now I'll make available my patch on the sis900 page[1] that uses ethtool and seems to work.

[1] http://teg.homeunix.org/sis900.html

Signature · 3 lines
-----------------------------
Daniele Venzano
Web: http://teg.homeunix.org