Re: [PATCH] Add support for Marvell 88e1111S and 88e1145

2006-11-14 Thread Jeff Garzik

Andy Fleming wrote:

This patch requires the new support for configurable PHY
interfaces.

Changes include:
* New support for 88e1145
* New support for 88e111s
* Fixing 88e1101 driver to not match non-88e1101 PHYs
* Increases in feature support across Marvell PHY product line
* Fixes a bunch of whitespace issues found by Lindent

Signed-off-by: Andrew Fleming [EMAIL PROTECTED]


applied.

As your email subject line is copied directly into the kernel changelog, 
please indicate the area of the kernel you are patching as a prefix 
(read http://linux.yyz.us/patch-format.html)  Example:


Subject: PHY: Add support for Marvell 88eS and 88e1145


-
To unsubscribe from this list: send the line unsubscribe netdev in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH] Add support for Marvell 88e1111S and 88e1145

2006-11-07 Thread Andy Fleming
This patch requires the new support for configurable PHY
interfaces.

Changes include:
* New support for 88e1145
* New support for 88e111s
* Fixing 88e1101 driver to not match non-88e1101 PHYs
* Increases in feature support across Marvell PHY product line
* Fixes a bunch of whitespace issues found by Lindent

Signed-off-by: Andrew Fleming [EMAIL PROTECTED]
---
 drivers/net/phy/marvell.c |  156 ++---
 1 files changed, 144 insertions(+), 12 deletions(-)

diff --git a/drivers/net/phy/marvell.c b/drivers/net/phy/marvell.c
index 0ad2532..5320ab9 100644
--- a/drivers/net/phy/marvell.c
+++ b/drivers/net/phy/marvell.c
@@ -43,6 +43,19 @@ #define MII_M1011_IMASK  0x12
 #define MII_M1011_IMASK_INIT   0x6400
 #define MII_M1011_IMASK_CLEAR  0x
 
+#define MII_M1011_PHY_SCR  0x10
+#define MII_M1011_PHY_SCR_AUTO_CROSS   0x0060
+
+#define MII_M1145_PHY_EXT_CR   0x14
+#define MII_M1145_RGMII_RX_DELAY   0x0080
+#define MII_M1145_RGMII_TX_DELAY   0x0002
+
+#define M1145_DEV_FLAGS_RESISTANCE 0x0001
+
+#define MII_M_PHY_LED_CONTROL  0x18
+#define MII_M_PHY_LED_DIRECT   0x4100
+#define MII_M_PHY_LED_COMBINE  0x411c
+
 MODULE_DESCRIPTION(Marvell PHY driver);
 MODULE_AUTHOR(Andy Fleming);
 MODULE_LICENSE(GPL);
@@ -64,7 +77,7 @@ static int marvell_config_intr(struct ph
 {
int err;
 
-   if(phydev-interrupts == PHY_INTERRUPT_ENABLED)
+   if (phydev-interrupts == PHY_INTERRUPT_ENABLED)
err = phy_write(phydev, MII_M1011_IMASK, MII_M1011_IMASK_INIT);
else
err = phy_write(phydev, MII_M1011_IMASK, MII_M1011_IMASK_CLEAR);
@@ -104,34 +117,153 @@ static int marvell_config_aneg(struct ph
if (err  0)
return err;
 
+   err = phy_write(phydev, MII_M1011_PHY_SCR,
+   MII_M1011_PHY_SCR_AUTO_CROSS);
+   if (err  0)
+   return err;
+
+   err = phy_write(phydev, MII_M_PHY_LED_CONTROL,
+   MII_M_PHY_LED_DIRECT);
+   if (err  0)
+   return err;
 
err = genphy_config_aneg(phydev);
 
return err;
 }
 
+static int m88e1145_config_init(struct phy_device *phydev)
+{
+   int err;
+
+   /* Take care of errata E0  E1 */
+   err = phy_write(phydev, 0x1d, 0x001b);
+   if (err  0)
+   return err;
+
+   err = phy_write(phydev, 0x1e, 0x418f);
+   if (err  0)
+   return err;
+
+   err = phy_write(phydev, 0x1d, 0x0016);
+   if (err  0)
+   return err;
+
+   err = phy_write(phydev, 0x1e, 0xa2da);
+   if (err  0)
+   return err;
+
+   if (phydev-interface == PHY_INTERFACE_MODE_RGMII) {
+   int temp = phy_read(phydev, MII_M1145_PHY_EXT_CR);
+   if (temp  0)
+   return temp;
+
+   temp |= (MII_M1145_RGMII_RX_DELAY | MII_M1145_RGMII_TX_DELAY);
+
+   err = phy_write(phydev, MII_M1145_PHY_EXT_CR, temp);
+   if (err  0)
+   return err;
+
+   if (phydev-dev_flags  M1145_DEV_FLAGS_RESISTANCE) {
+   err = phy_write(phydev, 0x1d, 0x0012);
+   if (err  0)
+   return err;
+
+   temp = phy_read(phydev, 0x1e);
+   if (temp  0)
+   return temp;
+
+   temp = 0xf03f;
+   temp |= 2  9; /* 36 ohm */
+   temp |= 2  6; /* 39 ohm */
+
+   err = phy_write(phydev, 0x1e, temp);
+   if (err  0)
+   return err;
+
+   err = phy_write(phydev, 0x1d, 0x3);
+   if (err  0)
+   return err;
+
+   err = phy_write(phydev, 0x1e, 0x8000);
+   if (err  0)
+   return err;
+   }
+   }
+
+   return 0;
+}
 
 static struct phy_driver m88e1101_driver = {
-   .phy_id = 0x01410c00,
-   .phy_id_mask= 0xff00,
-   .name   = Marvell 88E1101,
-   .features   = PHY_GBIT_FEATURES,
-   .flags  = PHY_HAS_INTERRUPT,
-   .config_aneg= marvell_config_aneg,
-   .read_status= genphy_read_status,
-   .ack_interrupt  = marvell_ack_interrupt,
-   .config_intr= marvell_config_intr,
-   .driver = { .owner = THIS_MODULE,},
+   .phy_id = 0x01410c60,
+   .phy_id_mask = 0xfff0,
+   .name = Marvell 88E1101,
+   .features = PHY_GBIT_FEATURES,
+   .flags = PHY_HAS_INTERRUPT,
+   .config_aneg = marvell_config_aneg,
+   .read_status = genphy_read_status,
+   .ack_interrupt = marvell_ack_interrupt,
+   .config_intr = marvell_config_intr,
+   .driver = {.owner = THIS_MODULE,},