netdev.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH 1/2] net: phy: smsc: Move SMSC PHY constants to <linux/smscphy.h>
@ 2012-01-02 17:08 Javier Martinez Canillas
  2012-01-02 17:08 ` [PATCH 2/2] net/smsc911x: Check if PHY is in operational mode before software reset Javier Martinez Canillas
  2012-01-03 18:45 ` [PATCH 1/2] net: phy: smsc: Move SMSC PHY constants to <linux/smscphy.h> David Miller
  0 siblings, 2 replies; 7+ messages in thread
From: Javier Martinez Canillas @ 2012-01-02 17:08 UTC (permalink / raw)
  To: Steve Glendinning
  Cc: Ben Hutchings, Enric Balletbo i Serra, 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 bits.

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 <martinez.javier@gmail.com>
---
 drivers/net/ethernet/smsc/smsc911x.h |    4 +++
 drivers/net/phy/smsc.c               |   21 +----------------
 include/linux/smscphy.h              |   42 ++++++++++++++++++++++++++++++++++
 3 files changed, 47 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..c8eb7ed
--- /dev/null
+++ b/include/linux/smscphy.h
@@ -0,0 +1,42 @@
+/***************************************************************************
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+ *
+ ***************************************************************************/
+#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] 7+ messages in thread

* [PATCH 2/2] net/smsc911x: Check if PHY is in operational mode before software reset
  2012-01-02 17:08 [PATCH 1/2] net: phy: smsc: Move SMSC PHY constants to <linux/smscphy.h> Javier Martinez Canillas
@ 2012-01-02 17:08 ` Javier Martinez Canillas
  2012-01-03 18:46   ` David Miller
  2012-01-03 18:45 ` [PATCH 1/2] net: phy: smsc: Move SMSC PHY constants to <linux/smscphy.h> David Miller
  1 sibling, 1 reply; 7+ messages in thread
From: Javier Martinez Canillas @ 2012-01-02 17:08 UTC (permalink / raw)
  To: Steve Glendinning
  Cc: Ben Hutchings, Enric Balletbo i Serra, 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 <martinez.javier@gmail.com>
---
 drivers/net/ethernet/smsc/smsc911x.c |   88 ++++++++++++++++++++++++++++++++++
 1 files changed, 88 insertions(+), 0 deletions(-)

diff --git a/drivers/net/ethernet/smsc/smsc911x.c b/drivers/net/ethernet/smsc/smsc911x.c
index 8843071..2a63e11 100644
--- a/drivers/net/ethernet/smsc/smsc911x.c
+++ b/drivers/net/ethernet/smsc/smsc911x.c
@@ -1243,10 +1243,88 @@ 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 +1338,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] 7+ messages in thread

* Re: [PATCH 1/2] net: phy: smsc: Move SMSC PHY constants to <linux/smscphy.h>
  2012-01-02 17:08 [PATCH 1/2] net: phy: smsc: Move SMSC PHY constants to <linux/smscphy.h> Javier Martinez Canillas
  2012-01-02 17:08 ` [PATCH 2/2] net/smsc911x: Check if PHY is in operational mode before software reset Javier Martinez Canillas
@ 2012-01-03 18:45 ` David Miller
  2012-01-03 23:29   ` Javier Martinez Canillas
  1 sibling, 1 reply; 7+ messages in thread
From: David Miller @ 2012-01-03 18:45 UTC (permalink / raw)
  To: martinez.javier; +Cc: steve.glendinning, ben, eballetbo, netdev

From: Javier Martinez Canillas <martinez.javier@gmail.com>
Date: Mon,  2 Jan 2012 18:08:50 +0100

> +/***************************************************************************
> + *
> + * This program is free software; you can redistribute it and/or
> + * modify it under the terms of the GNU General Public License
> + * as published by the Free Software Foundation; either version 2
> + * of the License, or (at your option) any later version.
> + *
> + * This program is distributed in the hope that it will be useful,
> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
> + * GNU General Public License for more details.
> + *
> + * You should have received a copy of the GNU General Public License
> + * along with this program; if not, write to the Free Software
> + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
> + *
> + ***************************************************************************/

Come on, I normally don't get into how people do copyrights in files,
but this is a file with 13 trivial defines, and the whole kernel
source tree is explicitly GPL V2'd by the top-level COPYING file.

So this thing is over the top.

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PATCH 2/2] net/smsc911x: Check if PHY is in operational mode before software reset
  2012-01-02 17:08 ` [PATCH 2/2] net/smsc911x: Check if PHY is in operational mode before software reset Javier Martinez Canillas
@ 2012-01-03 18:46   ` David Miller
  2012-01-03 23:30     ` Javier Martinez Canillas
  0 siblings, 1 reply; 7+ messages in thread
From: David Miller @ 2012-01-03 18:46 UTC (permalink / raw)
  To: martinez.javier; +Cc: steve.glendinning, ben, eballetbo, netdev

From: Javier Martinez Canillas <martinez.javier@gmail.com>
Date: Mon,  2 Jan 2012 18:08:51 +0100

> +	/* If energy is detected the PHY is already awake so is not necessary
> +	 * to disable the energy detect power-down mode. */
 ...
> +	/* 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 */

Format these comments correctly:

	/* Like this.
	 * See?
	 */

	/* Not like this.
	 * Ok? */

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PATCH 1/2] net: phy: smsc: Move SMSC PHY constants to <linux/smscphy.h>
  2012-01-03 18:45 ` [PATCH 1/2] net: phy: smsc: Move SMSC PHY constants to <linux/smscphy.h> David Miller
@ 2012-01-03 23:29   ` Javier Martinez Canillas
  0 siblings, 0 replies; 7+ messages in thread
From: Javier Martinez Canillas @ 2012-01-03 23:29 UTC (permalink / raw)
  To: David Miller; +Cc: steve.glendinning, ben, eballetbo, netdev

On Tue, Jan 3, 2012 at 7:45 PM, David Miller <davem@davemloft.net> wrote:
> From: Javier Martinez Canillas <martinez.javier@gmail.com>
> Date: Mon,  2 Jan 2012 18:08:50 +0100
>
>> +/***************************************************************************
>> + *
>> + * This program is free software; you can redistribute it and/or
>> + * modify it under the terms of the GNU General Public License
>> + * as published by the Free Software Foundation; either version 2
>> + * of the License, or (at your option) any later version.
>> + *
>> + * This program is distributed in the hope that it will be useful,
>> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
>> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
>> + * GNU General Public License for more details.
>> + *
>> + * You should have received a copy of the GNU General Public License
>> + * along with this program; if not, write to the Free Software
>> + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
>> + *
>> + ***************************************************************************/
>
> Come on, I normally don't get into how people do copyrights in files,
> but this is a file with 13 trivial defines, and the whole kernel
> source tree is explicitly GPL V2'd by the top-level COPYING file.
>
> So this thing is over the top.

Ok, I'll remove the license from the file.

Thanks

-- 
Javier Martínez Canillas
(+34) 682 39 81 69
Barcelona, Spain

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PATCH 2/2] net/smsc911x: Check if PHY is in operational mode before software reset
  2012-01-03 18:46   ` David Miller
@ 2012-01-03 23:30     ` Javier Martinez Canillas
  2012-01-04  1:18       ` David Miller
  0 siblings, 1 reply; 7+ messages in thread
From: Javier Martinez Canillas @ 2012-01-03 23:30 UTC (permalink / raw)
  To: David Miller; +Cc: steve.glendinning, ben, eballetbo, netdev

On Tue, Jan 3, 2012 at 7:46 PM, David Miller <davem@davemloft.net> wrote:
> From: Javier Martinez Canillas <martinez.javier@gmail.com>
> Date: Mon,  2 Jan 2012 18:08:51 +0100
>
>> +     /* If energy is detected the PHY is already awake so is not necessary
>> +      * to disable the energy detect power-down mode. */
>  ...
>> +     /* 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 */
>
> Format these comments correctly:
>
>        /* Like this.
>         * See?
>         */
>
>        /* Not like this.
>         * Ok? */
>

Ok, will resend with the right style.

Besides these coding style issues, does the patch looks good to you?

Best regards,

-- 
Javier Martínez Canillas
(+34) 682 39 81 69
Barcelona, Spain

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PATCH 2/2] net/smsc911x: Check if PHY is in operational mode before software reset
  2012-01-03 23:30     ` Javier Martinez Canillas
@ 2012-01-04  1:18       ` David Miller
  0 siblings, 0 replies; 7+ messages in thread
From: David Miller @ 2012-01-04  1:18 UTC (permalink / raw)
  To: martinez.javier; +Cc: steve.glendinning, ben, eballetbo, netdev

From: Javier Martinez Canillas <martinez.javier@gmail.com>
Date: Wed, 4 Jan 2012 00:30:23 +0100

> Besides these coding style issues, does the patch looks good to you?

It looked fine.

^ permalink raw reply	[flat|nested] 7+ messages in thread

end of thread, other threads:[~2012-01-04  1:18 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2012-01-02 17:08 [PATCH 1/2] net: phy: smsc: Move SMSC PHY constants to <linux/smscphy.h> Javier Martinez Canillas
2012-01-02 17:08 ` [PATCH 2/2] net/smsc911x: Check if PHY is in operational mode before software reset Javier Martinez Canillas
2012-01-03 18:46   ` David Miller
2012-01-03 23:30     ` Javier Martinez Canillas
2012-01-04  1:18       ` David Miller
2012-01-03 18:45 ` [PATCH 1/2] net: phy: smsc: Move SMSC PHY constants to <linux/smscphy.h> David Miller
2012-01-03 23:29   ` Javier Martinez Canillas

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).