cxgb3: Use generic MDIO definitions and mdio_mii_ioctl()
[pandora-kernel.git] / drivers / net / cxgb3 / t3_hw.c
index e1bd690..1dd1637 100644 (file)
@@ -204,35 +204,33 @@ static void mi1_init(struct adapter *adap, const struct adapter_info *ai)
 /*
  * MI1 read/write operations for clause 22 PHYs.
  */
-static int t3_mi1_read(struct adapter *adapter, int phy_addr, int mmd_addr,
-                      int reg_addr, unsigned int *valp)
+static int t3_mi1_read(struct net_device *dev, int phy_addr, int mmd_addr,
+                      u16 reg_addr)
 {
+       struct port_info *pi = netdev_priv(dev);
+       struct adapter *adapter = pi->adapter;
        int ret;
        u32 addr = V_REGADDR(reg_addr) | V_PHYADDR(phy_addr);
 
-       if (mmd_addr)
-               return -EINVAL;
-
        mutex_lock(&adapter->mdio_lock);
        t3_set_reg_field(adapter, A_MI1_CFG, V_ST(M_ST), V_ST(1));
        t3_write_reg(adapter, A_MI1_ADDR, addr);
        t3_write_reg(adapter, A_MI1_OP, V_MDI_OP(2));
        ret = t3_wait_op_done(adapter, A_MI1_OP, F_BUSY, 0, MDIO_ATTEMPTS, 10);
        if (!ret)
-               *valp = t3_read_reg(adapter, A_MI1_DATA);
+               ret = t3_read_reg(adapter, A_MI1_DATA);
        mutex_unlock(&adapter->mdio_lock);
        return ret;
 }
 
-static int t3_mi1_write(struct adapter *adapter, int phy_addr, int mmd_addr,
-                    int reg_addr, unsigned int val)
+static int t3_mi1_write(struct net_device *dev, int phy_addr, int mmd_addr,
+                       u16 reg_addr, u16 val)
 {
+       struct port_info *pi = netdev_priv(dev);
+       struct adapter *adapter = pi->adapter;
        int ret;
        u32 addr = V_REGADDR(reg_addr) | V_PHYADDR(phy_addr);
 
-       if (mmd_addr)
-               return -EINVAL;
-
        mutex_lock(&adapter->mdio_lock);
        t3_set_reg_field(adapter, A_MI1_CFG, V_ST(M_ST), V_ST(1));
        t3_write_reg(adapter, A_MI1_ADDR, addr);
@@ -244,8 +242,9 @@ static int t3_mi1_write(struct adapter *adapter, int phy_addr, int mmd_addr,
 }
 
 static const struct mdio_ops mi1_mdio_ops = {
-       t3_mi1_read,
-       t3_mi1_write
+       .read = t3_mi1_read,
+       .write = t3_mi1_write,
+       .mode_support = MDIO_SUPPORTS_C22
 };
 
 /*
@@ -268,9 +267,11 @@ static int mi1_wr_addr(struct adapter *adapter, int phy_addr, int mmd_addr,
 /*
  * MI1 read/write operations for indirect-addressed PHYs.
  */
-static int mi1_ext_read(struct adapter *adapter, int phy_addr, int mmd_addr,
-                       int reg_addr, unsigned int *valp)
+static int mi1_ext_read(struct net_device *dev, int phy_addr, int mmd_addr,
+                       u16 reg_addr)
 {
+       struct port_info *pi = netdev_priv(dev);
+       struct adapter *adapter = pi->adapter;
        int ret;
 
        mutex_lock(&adapter->mdio_lock);
@@ -280,15 +281,17 @@ static int mi1_ext_read(struct adapter *adapter, int phy_addr, int mmd_addr,
                ret = t3_wait_op_done(adapter, A_MI1_OP, F_BUSY, 0,
                                      MDIO_ATTEMPTS, 10);
                if (!ret)
-                       *valp = t3_read_reg(adapter, A_MI1_DATA);
+                       ret = t3_read_reg(adapter, A_MI1_DATA);
        }
        mutex_unlock(&adapter->mdio_lock);
        return ret;
 }
 
-static int mi1_ext_write(struct adapter *adapter, int phy_addr, int mmd_addr,
-                        int reg_addr, unsigned int val)
+static int mi1_ext_write(struct net_device *dev, int phy_addr, int mmd_addr,
+                        u16 reg_addr, u16 val)
 {
+       struct port_info *pi = netdev_priv(dev);
+       struct adapter *adapter = pi->adapter;
        int ret;
 
        mutex_lock(&adapter->mdio_lock);
@@ -304,8 +307,9 @@ static int mi1_ext_write(struct adapter *adapter, int phy_addr, int mmd_addr,
 }
 
 static const struct mdio_ops mi1_mdio_ext_ops = {
-       mi1_ext_read,
-       mi1_ext_write
+       .read = mi1_ext_read,
+       .write = mi1_ext_write,
+       .mode_support = MDIO_SUPPORTS_C45 | MDIO_EMULATE_C22
 };
 
 /**
@@ -325,10 +329,10 @@ int t3_mdio_change_bits(struct cphy *phy, int mmd, int reg, unsigned int clear,
        int ret;
        unsigned int val;
 
-       ret = mdio_read(phy, mmd, reg, &val);
+       ret = t3_mdio_read(phy, mmd, reg, &val);
        if (!ret) {
                val &= ~clear;
-               ret = mdio_write(phy, mmd, reg, val | set);
+               ret = t3_mdio_write(phy, mmd, reg, val | set);
        }
        return ret;
 }
@@ -348,15 +352,16 @@ int t3_phy_reset(struct cphy *phy, int mmd, int wait)
        int err;
        unsigned int ctl;
 
-       err = t3_mdio_change_bits(phy, mmd, MII_BMCR, BMCR_PDOWN, BMCR_RESET);
+       err = t3_mdio_change_bits(phy, mmd, MDIO_CTRL1, MDIO_CTRL1_LPOWER,
+                                 MDIO_CTRL1_RESET);
        if (err || !wait)
                return err;
 
        do {
-               err = mdio_read(phy, mmd, MII_BMCR, &ctl);
+               err = t3_mdio_read(phy, mmd, MDIO_CTRL1, &ctl);
                if (err)
                        return err;
-               ctl &= BMCR_RESET;
+               ctl &= MDIO_CTRL1_RESET;
                if (ctl)
                        msleep(1);
        } while (ctl && --wait);
@@ -377,7 +382,7 @@ int t3_phy_advertise(struct cphy *phy, unsigned int advert)
        int err;
        unsigned int val = 0;
 
-       err = mdio_read(phy, 0, MII_CTRL1000, &val);
+       err = t3_mdio_read(phy, MDIO_DEVAD_NONE, MII_CTRL1000, &val);
        if (err)
                return err;
 
@@ -387,7 +392,7 @@ int t3_phy_advertise(struct cphy *phy, unsigned int advert)
        if (advert & ADVERTISED_1000baseT_Full)
                val |= ADVERTISE_1000FULL;
 
-       err = mdio_write(phy, 0, MII_CTRL1000, val);
+       err = t3_mdio_write(phy, MDIO_DEVAD_NONE, MII_CTRL1000, val);
        if (err)
                return err;
 
@@ -404,7 +409,7 @@ int t3_phy_advertise(struct cphy *phy, unsigned int advert)
                val |= ADVERTISE_PAUSE_CAP;
        if (advert & ADVERTISED_Asym_Pause)
                val |= ADVERTISE_PAUSE_ASYM;
-       return mdio_write(phy, 0, MII_ADVERTISE, val);
+       return t3_mdio_write(phy, MDIO_DEVAD_NONE, MII_ADVERTISE, val);
 }
 
 /**
@@ -427,7 +432,7 @@ int t3_phy_advertise_fiber(struct cphy *phy, unsigned int advert)
                val |= ADVERTISE_1000XPAUSE;
        if (advert & ADVERTISED_Asym_Pause)
                val |= ADVERTISE_1000XPSE_ASYM;
-       return mdio_write(phy, 0, MII_ADVERTISE, val);
+       return t3_mdio_write(phy, MDIO_DEVAD_NONE, MII_ADVERTISE, val);
 }
 
 /**
@@ -444,7 +449,7 @@ int t3_set_phy_speed_duplex(struct cphy *phy, int speed, int duplex)
        int err;
        unsigned int ctl;
 
-       err = mdio_read(phy, 0, MII_BMCR, &ctl);
+       err = t3_mdio_read(phy, MDIO_DEVAD_NONE, MII_BMCR, &ctl);
        if (err)
                return err;
 
@@ -462,30 +467,30 @@ int t3_set_phy_speed_duplex(struct cphy *phy, int speed, int duplex)
        }
        if (ctl & BMCR_SPEED1000) /* auto-negotiation required for GigE */
                ctl |= BMCR_ANENABLE;
-       return mdio_write(phy, 0, MII_BMCR, ctl);
+       return t3_mdio_write(phy, MDIO_DEVAD_NONE, MII_BMCR, ctl);
 }
 
 int t3_phy_lasi_intr_enable(struct cphy *phy)
 {
-       return mdio_write(phy, MDIO_DEV_PMA_PMD, LASI_CTRL, 1);
+       return t3_mdio_write(phy, MDIO_MMD_PMAPMD, LASI_CTRL, 1);
 }
 
 int t3_phy_lasi_intr_disable(struct cphy *phy)
 {
-       return mdio_write(phy, MDIO_DEV_PMA_PMD, LASI_CTRL, 0);
+       return t3_mdio_write(phy, MDIO_MMD_PMAPMD, LASI_CTRL, 0);
 }
 
 int t3_phy_lasi_intr_clear(struct cphy *phy)
 {
        u32 val;
 
-       return mdio_read(phy, MDIO_DEV_PMA_PMD, LASI_STAT, &val);
+       return t3_mdio_read(phy, MDIO_MMD_PMAPMD, LASI_STAT, &val);
 }
 
 int t3_phy_lasi_intr_handler(struct cphy *phy)
 {
        unsigned int status;
-       int err = mdio_read(phy, MDIO_DEV_PMA_PMD, LASI_STAT, &status);
+       int err = t3_mdio_read(phy, MDIO_MMD_PMAPMD, LASI_STAT, &status);
 
        if (err)
                return err;
@@ -3863,6 +3868,7 @@ int t3_prep_adapter(struct adapter *adapter, const struct adapter_info *ai,
                                    ai->mdio_ops);
                if (ret)
                        return ret;
+               p->phy.mdio.dev = adapter->port[i];
                mac_prep(&p->mac, adapter, j);
 
                /*
@@ -3918,7 +3924,7 @@ int t3_replay_prep_adapter(struct adapter *adapter)
                        ;
 
                pti = &port_types[adapter->params.vpd.port_type[j]];
-               ret = pti->phy_prep(&p->phy, adapter, p->phy.addr, NULL);
+               ret = pti->phy_prep(&p->phy, adapter, p->phy.mdio.prtad, NULL);
                if (ret)
                        return ret;
                p->phy.ops->power_down(&p->phy, 1);