diff options
author | Mark Einon <mark.einon@gmail.com> | 2011-08-29 18:42:41 +0100 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@suse.de> | 2011-08-29 11:20:11 -0700 |
commit | 0f18f767e5f9a4c5a9fa976df168d0f3e33c91da (patch) | |
tree | bfacaee798f727e0e8af84fcb24f51f822aee927 /drivers/staging/et131x/et1310_phy.c | |
parent | fca7737f5c4bdf11f5a62bf7d79c9c60f15ceaff (diff) | |
download | op-kernel-dev-0f18f767e5f9a4c5a9fa976df168d0f3e33c91da.zip op-kernel-dev-0f18f767e5f9a4c5a9fa976df168d0f3e33c91da.tar.gz |
staging: et131x: Use phy-device, mii_bus and ethtool_ops
Adding some basic ethtool ops and supporting functionality using a phy device.
Signed-off-by: Mark Einon <mark.einon@gmail.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
Diffstat (limited to 'drivers/staging/et131x/et1310_phy.c')
-rw-r--r-- | drivers/staging/et131x/et1310_phy.c | 45 |
1 files changed, 38 insertions, 7 deletions
diff --git a/drivers/staging/et131x/et1310_phy.c b/drivers/staging/et131x/et1310_phy.c index 21e0704..5e21a18 100644 --- a/drivers/staging/et131x/et1310_phy.c +++ b/drivers/staging/et131x/et1310_phy.c @@ -1,6 +1,6 @@ /* * Agere Systems Inc. - * 10/100/1000 Base-T Ethernet Driver for the ET1301 and ET131x series MACs + * 10/100/1000 Base-T Ethernet Driver for the ET1310 and ET131x series MACs * * Copyright * 2005 Agere Systems Inc. * All rights reserved. @@ -82,6 +82,7 @@ #include <linux/if_arp.h> #include <linux/ioport.h> #include <linux/random.h> +#include <linux/phy.h> #include "et1310_phy.h" @@ -93,6 +94,40 @@ #include "et131x.h" +int et131x_mdio_read(struct mii_bus *bus, int phy_addr, int reg) +{ + struct net_device *netdev = bus->priv; + struct et131x_adapter *adapter = netdev_priv(netdev); + u16 value; + int ret; + + ret = et131x_phy_mii_read(adapter, phy_addr, reg, &value); + + if (ret < 0) + return ret; + else + return value; +} + +int et131x_mdio_write(struct mii_bus *bus, int phy_addr, int reg, u16 value) +{ + struct net_device *netdev = bus->priv; + struct et131x_adapter *adapter = netdev_priv(netdev); + + /* mii_write always uses the same phy_addr, xcvr_addr */ + return et131x_mii_write(adapter, reg, value); +} + +int et131x_mdio_reset(struct mii_bus *bus) +{ + struct net_device *netdev = bus->priv; + struct et131x_adapter *adapter = netdev_priv(netdev); + + et1310_phy_reset(adapter); + + return 0; +} + /** * et131x_phy_mii_read - Read from the PHY through the MII Interface on the MAC * @adapter: pointer to our private adapter structure @@ -107,7 +142,7 @@ int et131x_phy_mii_read(struct et131x_adapter *adapter, u8 xcvr_addr, { struct mac_regs __iomem *mac = &adapter->regs->mac; int status = 0; - u32 delay; + u32 delay = 0; u32 mii_addr; u32 mii_cmd; u32 mii_indicator; @@ -124,9 +159,6 @@ int et131x_phy_mii_read(struct et131x_adapter *adapter, u8 xcvr_addr, /* Set up the register we need to read from on the correct PHY */ writel(MII_ADDR(xcvr_addr, xcvr_reg), &mac->mii_mgmt_addr); - /* Kick the read cycle off */ - delay = 0; - writel(0x1, &mac->mii_mgmt_cmd); do { @@ -176,7 +208,7 @@ int et131x_mii_write(struct et131x_adapter *adapter, u8 xcvr_reg, u16 value) struct mac_regs __iomem *mac = &adapter->regs->mac; int status = 0; u8 xcvr_addr = adapter->stats.xcvr_addr; - u32 delay; + u32 delay = 0; u32 mii_addr; u32 mii_cmd; u32 mii_indicator; @@ -195,7 +227,6 @@ int et131x_mii_write(struct et131x_adapter *adapter, u8 xcvr_reg, u16 value) /* Add the value to write to the registers to the mac */ writel(value, &mac->mii_mgmt_ctrl); - delay = 0; do { udelay(50); |