chelsio: Use generic MDIO definitions and mdio_mii_ioctl()
[cascardo/linux.git] / drivers / net / chelsio / subr.c
index 7adf302..2564312 100644 (file)
@@ -284,32 +284,29 @@ static void mi1_mdio_init(adapter_t *adapter, const struct board_info *bi)
 /*
  * Elmer MI1 MDIO read/write operations.
  */
-static int mi1_mdio_read(adapter_t *adapter, int phy_addr, int mmd_addr,
-                        int reg_addr, unsigned int *valp)
+static int mi1_mdio_read(struct net_device *dev, int phy_addr, int mmd_addr,
+                        u16 reg_addr)
 {
+       struct adapter *adapter = dev->ml_priv;
        u32 addr = V_MI1_REG_ADDR(reg_addr) | V_MI1_PHY_ADDR(phy_addr);
-
-       if (mmd_addr)
-               return -EINVAL;
+       unsigned int val;
 
        spin_lock(&adapter->tpi_lock);
        __t1_tpi_write(adapter, A_ELMER0_PORT0_MI1_ADDR, addr);
        __t1_tpi_write(adapter,
                        A_ELMER0_PORT0_MI1_OP, MI1_OP_DIRECT_READ);
        mi1_wait_until_ready(adapter, A_ELMER0_PORT0_MI1_OP);
-       __t1_tpi_read(adapter, A_ELMER0_PORT0_MI1_DATA, valp);
+       __t1_tpi_read(adapter, A_ELMER0_PORT0_MI1_DATA, &val);
        spin_unlock(&adapter->tpi_lock);
-       return 0;
+       return val;
 }
 
-static int mi1_mdio_write(adapter_t *adapter, int phy_addr, int mmd_addr,
-                         int reg_addr, unsigned int val)
+static int mi1_mdio_write(struct net_device *dev, int phy_addr, int mmd_addr,
+                         u16 reg_addr, u16 val)
 {
+       struct adapter *adapter = dev->ml_priv;
        u32 addr = V_MI1_REG_ADDR(reg_addr) | V_MI1_PHY_ADDR(phy_addr);
 
-       if (mmd_addr)
-               return -EINVAL;
-
        spin_lock(&adapter->tpi_lock);
        __t1_tpi_write(adapter, A_ELMER0_PORT0_MI1_ADDR, addr);
        __t1_tpi_write(adapter, A_ELMER0_PORT0_MI1_DATA, val);
@@ -324,16 +321,19 @@ static int mi1_mdio_write(adapter_t *adapter, int phy_addr, int mmd_addr,
 static const struct mdio_ops mi1_mdio_ops = {
        .init = mi1_mdio_init,
        .read = mi1_mdio_read,
-       .write = mi1_mdio_write
+       .write = mi1_mdio_write,
+       .mode_support = MDIO_SUPPORTS_C22
 };
 #endif
 
 #endif
 
-static int mi1_mdio_ext_read(adapter_t *adapter, int phy_addr, int mmd_addr,
-                            int reg_addr, unsigned int *valp)
+static int mi1_mdio_ext_read(struct net_device *dev, int phy_addr, int mmd_addr,
+                            u16 reg_addr)
 {
+       struct adapter *adapter = dev->ml_priv;
        u32 addr = V_MI1_REG_ADDR(mmd_addr) | V_MI1_PHY_ADDR(phy_addr);
+       unsigned int val;
 
        spin_lock(&adapter->tpi_lock);
 
@@ -350,14 +350,15 @@ static int mi1_mdio_ext_read(adapter_t *adapter, int phy_addr, int mmd_addr,
        mi1_wait_until_ready(adapter, A_ELMER0_PORT0_MI1_OP);
 
        /* Read the data. */
-       __t1_tpi_read(adapter, A_ELMER0_PORT0_MI1_DATA, valp);
+       __t1_tpi_read(adapter, A_ELMER0_PORT0_MI1_DATA, &val);
        spin_unlock(&adapter->tpi_lock);
-       return 0;
+       return val;
 }
 
-static int mi1_mdio_ext_write(adapter_t *adapter, int phy_addr, int mmd_addr,
-                             int reg_addr, unsigned int val)
+static int mi1_mdio_ext_write(struct net_device *dev, int phy_addr,
+                             int mmd_addr, u16 reg_addr, u16 val)
 {
+       struct adapter *adapter = dev->ml_priv;
        u32 addr = V_MI1_REG_ADDR(mmd_addr) | V_MI1_PHY_ADDR(phy_addr);
 
        spin_lock(&adapter->tpi_lock);
@@ -380,7 +381,8 @@ static int mi1_mdio_ext_write(adapter_t *adapter, int phy_addr, int mmd_addr,
 static const struct mdio_ops mi1_mdio_ext_ops = {
        .init = mi1_mdio_init,
        .read = mi1_mdio_ext_read,
-       .write = mi1_mdio_ext_write
+       .write = mi1_mdio_ext_write,
+       .mode_support = MDIO_SUPPORTS_C45 | MDIO_EMULATE_C22
 };
 
 enum {
@@ -1140,6 +1142,7 @@ int __devinit t1_init_sw_modules(adapter_t *adapter,
                               adapter->name, i);
                        goto error;
                }
+               adapter->port[i].phy->mdio.dev = adapter->port[i].dev;
 
                adapter->port[i].mac = mac = bi->gmac->create(adapter, i);
                if (!mac) {