PHY: Add support for the M88E1121R Marvell chip.
authorSergei Poselenov <sposelenov@emcraft.com>
Fri, 6 Jun 2008 13:52:44 +0000 (15:52 +0200)
committerBen Warren <biggerbadderben@gmail.com>
Wed, 3 Sep 2008 04:18:14 +0000 (21:18 -0700)
Signed-off-by: Yuri Tikhonov <yur@emcraft.com>
Signed-off-by: Sergei Poselenov <sposelenov@emcraft.com>
Signed-off-by: Ben Warren <biggerbadderben@gmail.com>
drivers/net/tsec.c
drivers/net/tsec.h

index 6e0f2c6..e50d516 100644 (file)
@@ -1157,6 +1157,54 @@ struct phy_info phy_info_M88E1118 = {
                },
 };
 
+/*
+ *  Since to access LED register we need do switch the page, we
+ * do LED configuring in the miim_read-like function as follows
+ */
+uint mii_88E1121_set_led (uint mii_reg, struct tsec_private *priv)
+{
+       uint pg;
+
+       /* Switch the page to access the led register */
+       pg = read_phy_reg(priv, MIIM_88E1121_PHY_PAGE);
+       write_phy_reg(priv, MIIM_88E1121_PHY_PAGE, MIIM_88E1121_PHY_LED_PAGE);
+
+       /* Configure leds */
+       write_phy_reg(priv, MIIM_88E1121_PHY_LED_CTRL,
+                     MIIM_88E1121_PHY_LED_DEF);
+
+       /* Restore the page pointer */
+       write_phy_reg(priv, MIIM_88E1121_PHY_PAGE, pg);
+       return 0;
+}
+
+struct phy_info phy_info_M88E1121R = {
+       0x01410cb,
+       "Marvell 88E1121R",
+       4,
+       (struct phy_cmd[]){     /* config */
+                          /* Reset and configure the PHY */
+                          {MIIM_CONTROL, MIIM_CONTROL_RESET, NULL},
+                          {MIIM_GBIT_CONTROL, MIIM_GBIT_CONTROL_INIT, NULL},
+                          {MIIM_ANAR, MIIM_ANAR_INIT, NULL},
+                          /* Configure leds */
+                          {MIIM_88E1121_PHY_LED_CTRL, miim_read,
+                           &mii_88E1121_set_led},
+                          {MIIM_CONTROL, MIIM_CONTROL_INIT, &mii_cr_init},
+                          {miim_end,}
+                          },
+       (struct phy_cmd[]){     /* startup */
+                          /* Status is read once to clear old link state */
+                          {MIIM_STATUS, miim_read, NULL},
+                          {MIIM_STATUS, miim_read, &mii_parse_sr},
+                          {MIIM_STATUS, miim_read, &mii_parse_link},
+                          {miim_end,}
+                          },
+       (struct phy_cmd[]){     /* shutdown */
+                          {miim_end,}
+                          },
+};
+
 static unsigned int m88e1145_setmode(uint mii_reg, struct tsec_private *priv)
 {
        uint mii_data = read_phy_reg(priv, mii_reg);
@@ -1522,6 +1570,7 @@ struct phy_info *phy_info[] = {
        &phy_info_M88E1011S,
        &phy_info_M88E1111S,
        &phy_info_M88E1118,
+       &phy_info_M88E1121R,
        &phy_info_M88E1145,
        &phy_info_M88E1149S,
        &phy_info_dm9161,
index 6a2338b..fee5934 100644 (file)
 #define MIIM_88E1111_PHY_LED_DIRECT    0x4100
 #define MIIM_88E1111_PHY_LED_COMBINE   0x411C
 
+/* 88E1121 PHY LED Control Register */
+#define MIIM_88E1121_PHY_LED_CTRL      16
+#define MIIM_88E1121_PHY_LED_PAGE      3
+#define MIIM_88E1121_PHY_LED_DEF       0x0030
+
+#define MIIM_88E1121_PHY_PAGE          22
+
 /* 88E1145 Extended PHY Specific Control Register */
 #define MIIM_88E1145_PHY_EXT_CR 20
 #define MIIM_M88E1145_RGMII_RX_DELAY   0x0080