Patchwork phy: SMSC device Energy Detect power-down mode

login
register
mail settings
Submitter Giuseppe CAVALLARO
Date Dec. 16, 2009, 7:28 a.m.
Message ID <1260948498-28544-1-git-send-email-peppe.cavallaro@st.com>
Download mbox | patch
Permalink /patch/41240/
State Changes Requested
Delegated to: David Miller
Headers show

Comments

Giuseppe CAVALLARO - Dec. 16, 2009, 7:28 a.m.
SMSC Ethernet Transceivers (LAN88710, LAN8710, LAN8720, LAN8187,
LAN8700, LAN83C185) provide a mechanism to conserve power when
the device is not connected to an active link partner
(Energy Detect Mode).
So this patch enables the Energy Detect power-down mode
for these Transceivers.

Signed-off-by: Giuseppe Cavallaro <peppe.cavallaro@st.com>
---
 drivers/net/phy/smsc.c |   16 ++++++++++++++--
 1 files changed, 14 insertions(+), 2 deletions(-)
David Miller - Dec. 26, 2009, 2:38 a.m.
From: Giuseppe CAVALLARO <peppe.cavallaro@st.com>
Date: Wed, 16 Dec 2009 08:28:18 +0100

> SMSC Ethernet Transceivers (LAN88710, LAN8710, LAN8720, LAN8187,
> LAN8700, LAN83C185) provide a mechanism to conserve power when
> the device is not connected to an active link partner
> (Energy Detect Mode).
> So this patch enables the Energy Detect power-down mode
> for these Transceivers.
> 
> Signed-off-by: Giuseppe Cavallaro <peppe.cavallaro@st.com>

Both phy_read() and phy_write() can return errors, you must check
for them.  The rest of this driver does this properly.

--
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Giuseppe CAVALLARO - Jan. 4, 2010, 10:01 a.m.
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

Hi David,

David Miller wrote:
> From: Giuseppe CAVALLARO <peppe.cavallaro@st.com>
> Date: Wed, 16 Dec 2009 08:28:18 +0100
> 
>> SMSC Ethernet Transceivers (LAN88710, LAN8710, LAN8720, LAN8187,
>> LAN8700, LAN83C185) provide a mechanism to conserve power when
>> the device is not connected to an active link partner
>> (Energy Detect Mode).
>> So this patch enables the Energy Detect power-down mode
>> for these Transceivers.
>>
>> Signed-off-by: Giuseppe Cavallaro <peppe.cavallaro@st.com>
> 
> Both phy_read() and phy_write() can return errors, you must check
> for them.  The rest of this driver does this properly.

I'm resending the patch with this fixed.
Thanks,
Peppe
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.9 (GNU/Linux)
Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org

iEYEARECAAYFAktBvGUACgkQ2Xo3j31MSSLA/gCfRSXQ7i/GEiZjPAHV4ZUxoxM5
YTUAoIPTXQ82zgsjj3q1gSdn1vY0G/dr
=fJnv
-----END PGP SIGNATURE-----
--
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Patch

diff --git a/drivers/net/phy/smsc.c b/drivers/net/phy/smsc.c
index 5123bb9..209e4cb 100644
--- a/drivers/net/phy/smsc.c
+++ b/drivers/net/phy/smsc.c
@@ -25,6 +25,7 @@ 
 
 #define MII_LAN83C185_ISF 29 /* Interrupt Source Flags */
 #define MII_LAN83C185_IM  30 /* Interrupt Mask */
+#define MII_LAN83C185_CTRL_STATUS	17 /* Mode/Status Register */
 
 #define MII_LAN83C185_ISF_INT1 (1<<1) /* Auto-Negotiation Page Received */
 #define MII_LAN83C185_ISF_INT2 (1<<2) /* Parallel Detection Fault */
@@ -37,8 +38,10 @@ 
 #define MII_LAN83C185_ISF_INT_ALL (0x0e)
 
 #define MII_LAN83C185_ISF_INT_PHYLIB_EVENTS \
-	(MII_LAN83C185_ISF_INT6 | MII_LAN83C185_ISF_INT4)
+	(MII_LAN83C185_ISF_INT6 | MII_LAN83C185_ISF_INT4 | \
+	 MII_LAN83C185_ISF_INT7)
 
+#define MII_LAN83C185_EDPWRDOWN	(1 << 13) /* EDPWRDOWN */
 
 static int smsc_phy_config_intr(struct phy_device *phydev)
 {
@@ -59,9 +62,18 @@  static int smsc_phy_ack_interrupt(struct phy_device *phydev)
 
 static int smsc_phy_config_init(struct phy_device *phydev)
 {
+	int rc = phy_read(phydev, MII_LAN83C185_CTRL_STATUS);
+	/* Enable energy detect mode for this SMSC Transceivers */
+	rc |= MII_LAN83C185_EDPWRDOWN;
+	phy_write(phydev, MII_LAN83C185_CTRL_STATUS, rc);
+
 	return smsc_phy_ack_interrupt (phydev);
 }
 
+static int lan911x_config_init(struct phy_device *phydev)
+{
+	return smsc_phy_ack_interrupt(phydev);
+}
 
 static struct phy_driver lan83c185_driver = {
 	.phy_id		= 0x0007c0a0, /* OUI=0x00800f, Model#=0x0a */
@@ -147,7 +159,7 @@  static struct phy_driver lan911x_int_driver = {
 	/* basic functions */
 	.config_aneg	= genphy_config_aneg,
 	.read_status	= genphy_read_status,
-	.config_init	= smsc_phy_config_init,
+	.config_init	= lan911x_config_init,
 
 	/* IRQ related */
 	.ack_interrupt	= smsc_phy_ack_interrupt,