* [PATCH v2 1/2] net: phy: smsc: Move SMSC PHY constants to <linux/smscphy.h> @ 2012-01-03 23:36 Javier Martinez Canillas 2012-01-03 23:36 ` [PATCH v2 2/2] net/smsc911x: Check if PHY is in operational mode before software reset Javier Martinez Canillas 2012-01-04 1:24 ` [PATCH v2 1/2] net: phy: smsc: Move SMSC PHY constants to <linux/smscphy.h> David Miller 0 siblings, 2 replies; 4+ messages in thread From: Javier Martinez Canillas @ 2012-01-03 23:36 UTC (permalink / raw) To: David Miller Cc: steve.glendinning, eballetbo, ben, netdev, Javier Martinez Canillas SMSC generation 4 LAN chips integrate an IEEE 802.3 ethernet physical layer. The ethernet driver for this family of devices needs to access the SMSC PHY registers and bit-fields. So, this patch moves these constants to a place where it can be used for both the PHY and LAN drivers. Signed-off-by: Javier Martinez Canillas <javier@dowhile0.org> --- v2: Remove the GPL license from the file since are only trivial defines. drivers/net/ethernet/smsc/smsc911x.h | 4 ++++ drivers/net/phy/smsc.c | 21 +-------------------- include/linux/smscphy.h | 25 +++++++++++++++++++++++++ 3 files changed, 30 insertions(+), 20 deletions(-) create mode 100644 include/linux/smscphy.h diff --git a/drivers/net/ethernet/smsc/smsc911x.h b/drivers/net/ethernet/smsc/smsc911x.h index 8d67aac..938ecf2 100644 --- a/drivers/net/ethernet/smsc/smsc911x.h +++ b/drivers/net/ethernet/smsc/smsc911x.h @@ -401,4 +401,8 @@ #include <asm/smsc911x.h> #endif +#ifdef CONFIG_SMSC_PHY +#include <linux/smscphy.h> +#endif + #endif /* __SMSC911X_H__ */ diff --git a/drivers/net/phy/smsc.c b/drivers/net/phy/smsc.c index 342505c..fc3e7e9 100644 --- a/drivers/net/phy/smsc.c +++ b/drivers/net/phy/smsc.c @@ -22,26 +22,7 @@ #include <linux/ethtool.h> #include <linux/phy.h> #include <linux/netdevice.h> - -#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 */ -#define MII_LAN83C185_ISF_INT3 (1<<3) /* Auto-Negotiation LP Ack */ -#define MII_LAN83C185_ISF_INT4 (1<<4) /* Link Down */ -#define MII_LAN83C185_ISF_INT5 (1<<5) /* Remote Fault Detected */ -#define MII_LAN83C185_ISF_INT6 (1<<6) /* Auto-Negotiation complete */ -#define MII_LAN83C185_ISF_INT7 (1<<7) /* ENERGYON */ - -#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_INT7) - -#define MII_LAN83C185_EDPWRDOWN (1 << 13) /* EDPWRDOWN */ +#include <linux/smscphy.h> static int smsc_phy_config_intr(struct phy_device *phydev) { diff --git a/include/linux/smscphy.h b/include/linux/smscphy.h new file mode 100644 index 0000000..ce718cb --- /dev/null +++ b/include/linux/smscphy.h @@ -0,0 +1,25 @@ +#ifndef __LINUX_SMSCPHY_H__ +#define __LINUX_SMSCPHY_H__ + +#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 */ +#define MII_LAN83C185_ISF_INT3 (1<<3) /* Auto-Negotiation LP Ack */ +#define MII_LAN83C185_ISF_INT4 (1<<4) /* Link Down */ +#define MII_LAN83C185_ISF_INT5 (1<<5) /* Remote Fault Detected */ +#define MII_LAN83C185_ISF_INT6 (1<<6) /* Auto-Negotiation complete */ +#define MII_LAN83C185_ISF_INT7 (1<<7) /* ENERGYON */ + +#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_INT7) + +#define MII_LAN83C185_EDPWRDOWN (1 << 13) /* EDPWRDOWN */ +#define MII_LAN83C185_ENERGYON (1 << 1) /* ENERGYON */ + +#endif /* __LINUX_SMSCPHY_H__ */ -- 1.7.4.1 ^ permalink raw reply related [flat|nested] 4+ messages in thread
* [PATCH v2 2/2] net/smsc911x: Check if PHY is in operational mode before software reset 2012-01-03 23:36 [PATCH v2 1/2] net: phy: smsc: Move SMSC PHY constants to <linux/smscphy.h> Javier Martinez Canillas @ 2012-01-03 23:36 ` Javier Martinez Canillas 2012-01-04 1:24 ` David Miller 2012-01-04 1:24 ` [PATCH v2 1/2] net: phy: smsc: Move SMSC PHY constants to <linux/smscphy.h> David Miller 1 sibling, 1 reply; 4+ messages in thread From: Javier Martinez Canillas @ 2012-01-03 23:36 UTC (permalink / raw) To: David Miller Cc: steve.glendinning, eballetbo, ben, netdev, Javier Martinez Canillas SMSC LAN generation 4 chips integrate an IEEE 802.3 ethernet physical layer. The PHY driver for this integrated chip enable an energy detect power-down mode. When the PHY is in a power-down mode, it prevents the MAC portion chip to be software reseted. That means that if we compile the kernel with the configuration option SMSC_PHY enabled and try to bring the network interface up without an cable plug-ed the PHY will be in a low power mode and the software reset will fail returning -EIO to user-space: root@igep00x0:~# ifconfig eth0 up ifconfig: SIOCSIFFLAGS: Input/output error This patch disable the energy detect power-down mode before trying to software reset the LAN chip and re-enables after it was reseted successfully. Signed-off-by: Javier Martinez Canillas <javier@dowhile0.org> --- v2: Use correct style for multi-line comments. drivers/net/ethernet/smsc/smsc911x.c | 92 ++++++++++++++++++++++++++++++++++ 1 files changed, 92 insertions(+), 0 deletions(-) diff --git a/drivers/net/ethernet/smsc/smsc911x.c b/drivers/net/ethernet/smsc/smsc911x.c index 8843071..8485c3c 100644 --- a/drivers/net/ethernet/smsc/smsc911x.c +++ b/drivers/net/ethernet/smsc/smsc911x.c @@ -1243,10 +1243,92 @@ static void smsc911x_rx_multicast_update_workaround(struct smsc911x_data *pdata) spin_unlock(&pdata->mac_lock); } +static int smsc911x_phy_disable_energy_detect(struct smsc911x_data *pdata) +{ + int rc = 0; + + if (!pdata->phy_dev) + return rc; + + rc = phy_read(pdata->phy_dev, MII_LAN83C185_CTRL_STATUS); + + if (rc < 0) { + SMSC_WARN(pdata, drv, "Failed reading PHY control reg"); + return rc; + } + + /* + * If energy is detected the PHY is already awake so is not necessary + * to disable the energy detect power-down mode. + */ + if ((rc & MII_LAN83C185_EDPWRDOWN) && + !(rc & MII_LAN83C185_ENERGYON)) { + /* Disable energy detect mode for this SMSC Transceivers */ + rc = phy_write(pdata->phy_dev, MII_LAN83C185_CTRL_STATUS, + rc & (~MII_LAN83C185_EDPWRDOWN)); + + if (rc < 0) { + SMSC_WARN(pdata, drv, "Failed writing PHY control reg"); + return rc; + } + + mdelay(1); + } + + return 0; +} + +static int smsc911x_phy_enable_energy_detect(struct smsc911x_data *pdata) +{ + int rc = 0; + + if (!pdata->phy_dev) + return rc; + + rc = phy_read(pdata->phy_dev, MII_LAN83C185_CTRL_STATUS); + + if (rc < 0) { + SMSC_WARN(pdata, drv, "Failed reading PHY control reg"); + return rc; + } + + /* Only enable if energy detect mode is already disabled */ + if (!(rc & MII_LAN83C185_EDPWRDOWN)) { + mdelay(100); + /* Enable energy detect mode for this SMSC Transceivers */ + rc = phy_write(pdata->phy_dev, MII_LAN83C185_CTRL_STATUS, + rc | MII_LAN83C185_EDPWRDOWN); + + if (rc < 0) { + SMSC_WARN(pdata, drv, "Failed writing PHY control reg"); + return rc; + } + + mdelay(1); + } + return 0; +} + static int smsc911x_soft_reset(struct smsc911x_data *pdata) { unsigned int timeout; unsigned int temp; + int ret; + + /* + * LAN9210/LAN9211/LAN9220/LAN9221 chips have an internal PHY that + * are initialized in a Energy Detect Power-Down mode that prevents + * the MAC chip to be software reseted. So we have to wakeup the PHY + * before. + */ + if (pdata->generation == 4) { + ret = smsc911x_phy_disable_energy_detect(pdata); + + if (ret) { + SMSC_WARN(pdata, drv, "Failed to wakeup the PHY chip"); + return ret; + } + } /* Reset the LAN911x */ smsc911x_reg_write(pdata, HW_CFG, HW_CFG_SRST_); @@ -1260,6 +1342,16 @@ static int smsc911x_soft_reset(struct smsc911x_data *pdata) SMSC_WARN(pdata, drv, "Failed to complete reset"); return -EIO; } + + if (pdata->generation == 4) { + ret = smsc911x_phy_enable_energy_detect(pdata); + + if (ret) { + SMSC_WARN(pdata, drv, "Failed to wakeup the PHY chip"); + return ret; + } + } + return 0; } -- 1.7.4.1 ^ permalink raw reply related [flat|nested] 4+ messages in thread
* Re: [PATCH v2 2/2] net/smsc911x: Check if PHY is in operational mode before software reset 2012-01-03 23:36 ` [PATCH v2 2/2] net/smsc911x: Check if PHY is in operational mode before software reset Javier Martinez Canillas @ 2012-01-04 1:24 ` David Miller 0 siblings, 0 replies; 4+ messages in thread From: David Miller @ 2012-01-04 1:24 UTC (permalink / raw) To: javier; +Cc: steve.glendinning, eballetbo, ben, netdev From: Javier Martinez Canillas <javier@dowhile0.org> Date: Wed, 4 Jan 2012 00:36:19 +0100 > SMSC LAN generation 4 chips integrate an IEEE 802.3 ethernet physical layer. > The PHY driver for this integrated chip enable an energy detect power-down mode. > When the PHY is in a power-down mode, it prevents the MAC portion chip to be > software reseted. > > That means that if we compile the kernel with the configuration option SMSC_PHY > enabled and try to bring the network interface up without an cable plug-ed the > PHY will be in a low power mode and the software reset will fail returning -EIO > to user-space: > > root@igep00x0:~# ifconfig eth0 up > ifconfig: SIOCSIFFLAGS: Input/output error > > This patch disable the energy detect power-down mode before trying to software > reset the LAN chip and re-enables after it was reseted successfully. > > Signed-off-by: Javier Martinez Canillas <javier@dowhile0.org> Applied. ^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [PATCH v2 1/2] net: phy: smsc: Move SMSC PHY constants to <linux/smscphy.h> 2012-01-03 23:36 [PATCH v2 1/2] net: phy: smsc: Move SMSC PHY constants to <linux/smscphy.h> Javier Martinez Canillas 2012-01-03 23:36 ` [PATCH v2 2/2] net/smsc911x: Check if PHY is in operational mode before software reset Javier Martinez Canillas @ 2012-01-04 1:24 ` David Miller 1 sibling, 0 replies; 4+ messages in thread From: David Miller @ 2012-01-04 1:24 UTC (permalink / raw) To: javier; +Cc: steve.glendinning, eballetbo, ben, netdev From: Javier Martinez Canillas <javier@dowhile0.org> Date: Wed, 4 Jan 2012 00:36:18 +0100 > SMSC generation 4 LAN chips integrate an IEEE 802.3 ethernet physical layer. > The ethernet driver for this family of devices needs to access the SMSC PHY > registers and bit-fields. > > So, this patch moves these constants to a place where it can be used for both > the PHY and LAN drivers. > > Signed-off-by: Javier Martinez Canillas <javier@dowhile0.org> Applied. ^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2012-01-04 1:24 UTC | newest] Thread overview: 4+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2012-01-03 23:36 [PATCH v2 1/2] net: phy: smsc: Move SMSC PHY constants to <linux/smscphy.h> Javier Martinez Canillas 2012-01-03 23:36 ` [PATCH v2 2/2] net/smsc911x: Check if PHY is in operational mode before software reset Javier Martinez Canillas 2012-01-04 1:24 ` David Miller 2012-01-04 1:24 ` [PATCH v2 1/2] net: phy: smsc: Move SMSC PHY constants to <linux/smscphy.h> David Miller
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).