pr_err("phy(%d) write timeout : %d\n", phy, reg);
}
+static int
+jme_phyext_read(struct jme_adapter *jme, int reg)
+{
+ jme_mdio_write(jme->dev, jme->mii_if.phy_id,
+ JME_PHY_SPEC_ADDR_REG,
+ JME_PHY_SPEC_REG_READ | (reg & 0x3FFF));
+ return jme_mdio_read(jme->dev, jme->mii_if.phy_id,
+ JME_PHY_SPEC_DATA_REG);
+}
+
+static void
+jme_phyext_write(struct jme_adapter *jme, int reg, int val)
+{
+ jme_mdio_write(jme->dev, jme->mii_if.phy_id,
+ JME_PHY_SPEC_DATA_REG, val);
+ jme_mdio_write(jme->dev, jme->mii_if.phy_id,
+ JME_PHY_SPEC_ADDR_REG,
+ JME_PHY_SPEC_REG_WRITE | (reg & 0x3FFF));
+}
+
+static void
+jme_phyext_memcpy(struct jme_adapter *jme, u32 *p, int reg_nr)
+{
+ int i;
+ u16 *p16 = (u16 *)p;
+
+ for (i = 0 ; i < reg_nr ; ++i)
+ p16[i] = jme_phyext_read(jme, i);
+}
+
static inline void
jme_reset_phy_processor(struct jme_adapter *jme)
{
p32 += 0x100 >> 2;
mdio_memcpy(jme, p32, JME_PHY_REG_NR);
+
+ p32 += 0x100 >> 2;
+ jme_phyext_memcpy(jme, p32, JME_PHY_SPEC_REG_NR);
}
static int
};
#define TX_TIMEOUT (5 * HZ)
-#define JME_REG_LEN 0x500
+#define JME_REG_LEN 0x600
#define MAX_ETHERNET_JUMBO_PACKET_SIZE 9216
#if LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,23)
#define JME_PHY_TIMEOUT 100 /* 100 msec */
#define JME_PHY_REG_NR 32
+#define JME_PHY_SPEC_REG_NR 128
/*
* Global Host Control
#define BMSR_ANCOMP 0x0020
+/*
+ * For extended PHY register interface
+ */
+enum jme_phy_spec_regs {
+ JME_PHY_SPEC_ADDR_REG = 0x1E,
+ JME_PHY_SPEC_DATA_REG = 0x1F,
+};
+enum jme_phy_spec_addr_bits {
+ JME_PHY_SPEC_REG_READ = 0x4000u,
+ JME_PHY_SPEC_REG_WRITE = 0x8000u,
+};
+
/*
* Workaround
*/