X-Git-Url: http://git.openwrt.org/?p=openwrt%2Fsvn-archive%2Farchive.git;a=blobdiff_plain;f=target%2Flinux%2Framips%2Ffiles%2Fdrivers%2Fnet%2Fethernet%2Fralink%2Fmdio.c;fp=target%2Flinux%2Framips%2Ffiles%2Fdrivers%2Fnet%2Fethernet%2Fralink%2Fmdio.c;h=0000000000000000000000000000000000000000;hp=62db11a699d8cdd56be0c7cf97f6aff1bd0959a3;hb=0b4ce85ee1949dff9a74cf67e2d818bf031671a5;hpb=d3d987bb6afa70c55f2c5042f8bc6dd6a902e5b5 diff --git a/target/linux/ramips/files/drivers/net/ethernet/ralink/mdio.c b/target/linux/ramips/files/drivers/net/ethernet/ralink/mdio.c deleted file mode 100644 index 62db11a699..0000000000 --- a/target/linux/ramips/files/drivers/net/ethernet/ralink/mdio.c +++ /dev/null @@ -1,275 +0,0 @@ -/* - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; version 2 of the License - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. - * - * Copyright (C) 2009-2013 John Crispin - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "ralink_soc_eth.h" -#include "mdio.h" - -static int fe_mdio_reset(struct mii_bus *bus) -{ - /* TODO */ - return 0; -} - -static void fe_phy_link_adjust(struct net_device *dev) -{ - struct fe_priv *priv = netdev_priv(dev); - unsigned long flags; - int i; - - spin_lock_irqsave(&priv->phy->lock, flags); - for (i = 0; i < 8; i++) { - if (priv->phy->phy_node[i]) { - struct phy_device *phydev = priv->phy->phy[i]; - int status_change = 0; - - if (phydev->link) - if (priv->phy->duplex[i] != phydev->duplex || - priv->phy->speed[i] != phydev->speed) - status_change = 1; - - if (phydev->link != priv->link[i]) - status_change = 1; - - switch (phydev->speed) { - case SPEED_1000: - case SPEED_100: - case SPEED_10: - priv->link[i] = phydev->link; - priv->phy->duplex[i] = phydev->duplex; - priv->phy->speed[i] = phydev->speed; - - if (status_change && priv->soc->mdio_adjust_link) - priv->soc->mdio_adjust_link(priv, i); - break; - } - } - } -} - -int fe_connect_phy_node(struct fe_priv *priv, struct device_node *phy_node) -{ - const __be32 *_port = NULL; - struct phy_device *phydev; - int phy_mode, port; - - _port = of_get_property(phy_node, "reg", NULL); - - if (!_port || (be32_to_cpu(*_port) >= 0x20)) { - pr_err("%s: invalid port id\n", phy_node->name); - return -EINVAL; - } - port = be32_to_cpu(*_port); - phy_mode = of_get_phy_mode(phy_node); - if (phy_mode < 0) { - dev_err(priv->device, "incorrect phy-mode %d\n", phy_mode); - priv->phy->phy_node[port] = NULL; - return -EINVAL; - } - - phydev = of_phy_connect(priv->netdev, phy_node, fe_phy_link_adjust, - 0, phy_mode); - if (IS_ERR(phydev)) { - dev_err(priv->device, "could not connect to PHY\n"); - priv->phy->phy_node[port] = NULL; - return PTR_ERR(phydev); - } - - phydev->supported &= PHY_GBIT_FEATURES; - phydev->advertising = phydev->supported; - phydev->no_auto_carrier_off = 1; - - dev_info(priv->device, - "connected port %d to PHY at %s [uid=%08x, driver=%s]\n", - port, dev_name(&phydev->dev), phydev->phy_id, - phydev->drv->name); - - priv->phy->phy[port] = phydev; - priv->link[port] = 0; - - return 0; -} - -static void phy_init(struct fe_priv *priv, struct phy_device *phy) -{ - phy_attach(priv->netdev, dev_name(&phy->dev), PHY_INTERFACE_MODE_MII); - - phy->autoneg = AUTONEG_ENABLE; - phy->speed = 0; - phy->duplex = 0; - phy->supported &= PHY_BASIC_FEATURES; - phy->advertising = phy->supported | ADVERTISED_Autoneg; - - phy_start_aneg(phy); -} - -static int fe_phy_connect(struct fe_priv *priv) -{ - int i; - - for (i = 0; i < 8; i++) { - if (priv->phy->phy_node[i]) { - if (!priv->phy_dev) { - priv->phy_dev = priv->phy->phy[i]; - priv->phy_flags = FE_PHY_FLAG_PORT; - } - } else if (priv->mii_bus && priv->mii_bus->phy_map[i]) { - phy_init(priv, priv->mii_bus->phy_map[i]); - if (!priv->phy_dev) { - priv->phy_dev = priv->mii_bus->phy_map[i]; - priv->phy_flags = FE_PHY_FLAG_ATTACH; - } - } - } - - return 0; -} - -static void fe_phy_disconnect(struct fe_priv *priv) -{ - unsigned long flags; - int i; - - for (i = 0; i < 8; i++) - if (priv->phy->phy_fixed[i]) { - spin_lock_irqsave(&priv->phy->lock, flags); - priv->link[i] = 0; - if (priv->soc->mdio_adjust_link) - priv->soc->mdio_adjust_link(priv, i); - spin_unlock_irqrestore(&priv->phy->lock, flags); - } else if (priv->phy->phy[i]) { - phy_disconnect(priv->phy->phy[i]); - } else if (priv->mii_bus && priv->mii_bus->phy_map[i]) { - phy_detach(priv->mii_bus->phy_map[i]); - } -} - -static void fe_phy_start(struct fe_priv *priv) -{ - unsigned long flags; - int i; - - for (i = 0; i < 8; i++) { - if (priv->phy->phy_fixed[i]) { - spin_lock_irqsave(&priv->phy->lock, flags); - priv->link[i] = 1; - if (priv->soc->mdio_adjust_link) - priv->soc->mdio_adjust_link(priv, i); - spin_unlock_irqrestore(&priv->phy->lock, flags); - } else if (priv->phy->phy[i]) { - phy_start(priv->phy->phy[i]); - } - } -} - -static void fe_phy_stop(struct fe_priv *priv) -{ - unsigned long flags; - int i; - - for (i = 0; i < 8; i++) - if (priv->phy->phy_fixed[i]) { - spin_lock_irqsave(&priv->phy->lock, flags); - priv->link[i] = 0; - if (priv->soc->mdio_adjust_link) - priv->soc->mdio_adjust_link(priv, i); - spin_unlock_irqrestore(&priv->phy->lock, flags); - } else if (priv->phy->phy[i]) { - phy_stop(priv->phy->phy[i]); - } -} - -static struct fe_phy phy_ralink = { - .connect = fe_phy_connect, - .disconnect = fe_phy_disconnect, - .start = fe_phy_start, - .stop = fe_phy_stop, -}; - -int fe_mdio_init(struct fe_priv *priv) -{ - struct device_node *mii_np; - int err; - - if (!priv->soc->mdio_read || !priv->soc->mdio_write) - return 0; - - spin_lock_init(&phy_ralink.lock); - priv->phy = &phy_ralink; - - mii_np = of_get_child_by_name(priv->device->of_node, "mdio-bus"); - if (!mii_np) { - dev_err(priv->device, "no %s child node found", "mdio-bus"); - return -ENODEV; - } - - if (!of_device_is_available(mii_np)) { - err = 0; - goto err_put_node; - } - - priv->mii_bus = mdiobus_alloc(); - if (priv->mii_bus == NULL) { - err = -ENOMEM; - goto err_put_node; - } - - priv->mii_bus->name = "mdio"; - priv->mii_bus->read = priv->soc->mdio_read; - priv->mii_bus->write = priv->soc->mdio_write; - priv->mii_bus->reset = fe_mdio_reset; - priv->mii_bus->priv = priv; - priv->mii_bus->parent = priv->device; - - snprintf(priv->mii_bus->id, MII_BUS_ID_SIZE, "%s", mii_np->name); - err = of_mdiobus_register(priv->mii_bus, mii_np); - if (err) - goto err_free_bus; - - return 0; - -err_free_bus: - kfree(priv->mii_bus); -err_put_node: - of_node_put(mii_np); - priv->mii_bus = NULL; - return err; -} - -void fe_mdio_cleanup(struct fe_priv *priv) -{ - if (!priv->mii_bus) - return; - - mdiobus_unregister(priv->mii_bus); - of_node_put(priv->mii_bus->dev.of_node); - kfree(priv->mii_bus); -}