|
@@ -34,6 +34,7 @@
|
|
/* Extended Registers */
|
|
/* Extended Registers */
|
|
#define DP83867_CFG4 0x0031
|
|
#define DP83867_CFG4 0x0031
|
|
#define DP83867_RGMIICTL 0x0032
|
|
#define DP83867_RGMIICTL 0x0032
|
|
|
|
+#define DP83867_STRAP_STS1 0x006E
|
|
#define DP83867_RGMIIDCTL 0x0086
|
|
#define DP83867_RGMIIDCTL 0x0086
|
|
#define DP83867_IO_MUX_CFG 0x0170
|
|
#define DP83867_IO_MUX_CFG 0x0170
|
|
|
|
|
|
@@ -58,9 +59,13 @@
|
|
#define DP83867_RGMII_TX_CLK_DELAY_EN BIT(1)
|
|
#define DP83867_RGMII_TX_CLK_DELAY_EN BIT(1)
|
|
#define DP83867_RGMII_RX_CLK_DELAY_EN BIT(0)
|
|
#define DP83867_RGMII_RX_CLK_DELAY_EN BIT(0)
|
|
|
|
|
|
|
|
+/* STRAP_STS1 bits */
|
|
|
|
+#define DP83867_STRAP_STS1_RESERVED BIT(11)
|
|
|
|
+
|
|
/* PHY CTRL bits */
|
|
/* PHY CTRL bits */
|
|
#define DP83867_PHYCR_FIFO_DEPTH_SHIFT 14
|
|
#define DP83867_PHYCR_FIFO_DEPTH_SHIFT 14
|
|
#define DP83867_PHYCR_FIFO_DEPTH_MASK (3 << 14)
|
|
#define DP83867_PHYCR_FIFO_DEPTH_MASK (3 << 14)
|
|
|
|
+#define DP83867_PHYCR_RESERVED_MASK BIT(11)
|
|
|
|
|
|
/* RGMIIDCTL bits */
|
|
/* RGMIIDCTL bits */
|
|
#define DP83867_RGMII_TX_CLK_DELAY_SHIFT 4
|
|
#define DP83867_RGMII_TX_CLK_DELAY_SHIFT 4
|
|
@@ -192,7 +197,7 @@ static int dp83867_of_init(struct phy_device *phydev)
|
|
static int dp83867_config_init(struct phy_device *phydev)
|
|
static int dp83867_config_init(struct phy_device *phydev)
|
|
{
|
|
{
|
|
struct dp83867_private *dp83867;
|
|
struct dp83867_private *dp83867;
|
|
- int ret, val;
|
|
|
|
|
|
+ int ret, val, bs;
|
|
u16 delay;
|
|
u16 delay;
|
|
|
|
|
|
if (!phydev->priv) {
|
|
if (!phydev->priv) {
|
|
@@ -215,6 +220,22 @@ static int dp83867_config_init(struct phy_device *phydev)
|
|
return val;
|
|
return val;
|
|
val &= ~DP83867_PHYCR_FIFO_DEPTH_MASK;
|
|
val &= ~DP83867_PHYCR_FIFO_DEPTH_MASK;
|
|
val |= (dp83867->fifo_depth << DP83867_PHYCR_FIFO_DEPTH_SHIFT);
|
|
val |= (dp83867->fifo_depth << DP83867_PHYCR_FIFO_DEPTH_SHIFT);
|
|
|
|
+
|
|
|
|
+ /* The code below checks if "port mirroring" N/A MODE4 has been
|
|
|
|
+ * enabled during power on bootstrap.
|
|
|
|
+ *
|
|
|
|
+ * Such N/A mode enabled by mistake can put PHY IC in some
|
|
|
|
+ * internal testing mode and disable RGMII transmission.
|
|
|
|
+ *
|
|
|
|
+ * In this particular case one needs to check STRAP_STS1
|
|
|
|
+ * register's bit 11 (marked as RESERVED).
|
|
|
|
+ */
|
|
|
|
+
|
|
|
|
+ bs = phy_read_mmd_indirect(phydev, DP83867_STRAP_STS1,
|
|
|
|
+ DP83867_DEVADDR);
|
|
|
|
+ if (bs & DP83867_STRAP_STS1_RESERVED)
|
|
|
|
+ val &= ~DP83867_PHYCR_RESERVED_MASK;
|
|
|
|
+
|
|
ret = phy_write(phydev, MII_DP83867_PHYCTRL, val);
|
|
ret = phy_write(phydev, MII_DP83867_PHYCTRL, val);
|
|
if (ret)
|
|
if (ret)
|
|
return ret;
|
|
return ret;
|