kernel: bgmac: move other bgmac patches to generic
[openwrt.git] / target / linux / bcm53xx / patches-3.10 / 203-bgmac-register-phy.patch
diff --git a/target/linux/bcm53xx/patches-3.10/203-bgmac-register-phy.patch b/target/linux/bcm53xx/patches-3.10/203-bgmac-register-phy.patch
deleted file mode 100644 (file)
index 7bf66df..0000000
+++ /dev/null
@@ -1,189 +0,0 @@
---- a/drivers/net/ethernet/broadcom/bgmac.c
-+++ b/drivers/net/ethernet/broadcom/bgmac.c
-@@ -1233,27 +1233,14 @@ static int bgmac_set_mac_address(struct
- static int bgmac_ioctl(struct net_device *net_dev, struct ifreq *ifr, int cmd)
- {
-       struct bgmac *bgmac = netdev_priv(net_dev);
--      struct mii_ioctl_data *data = if_mii(ifr);
--      switch (cmd) {
--      case SIOCGMIIPHY:
--              data->phy_id = bgmac->phyaddr;
--              /* fallthru */
--      case SIOCGMIIREG:
--              if (!netif_running(net_dev))
--                      return -EAGAIN;
--              data->val_out = bgmac_phy_read(bgmac, data->phy_id,
--                                             data->reg_num & 0x1f);
--              return 0;
--      case SIOCSMIIREG:
--              if (!netif_running(net_dev))
--                      return -EAGAIN;
--              bgmac_phy_write(bgmac, data->phy_id, data->reg_num & 0x1f,
--                              data->val_in);
--              return 0;
--      default:
--              return -EOPNOTSUPP;
--      }
-+      if (!netif_running(net_dev))
-+              return -EINVAL;
-+
-+      if (!bgmac->phydev)
-+              return -EINVAL;
-+
-+      return phy_mii_ioctl(bgmac->phydev, ifr, cmd);
- }
- static const struct net_device_ops bgmac_netdev_ops = {
-@@ -1275,61 +1262,16 @@ static int bgmac_get_settings(struct net
- {
-       struct bgmac *bgmac = netdev_priv(net_dev);
--      cmd->supported = SUPPORTED_10baseT_Half |
--                       SUPPORTED_10baseT_Full |
--                       SUPPORTED_100baseT_Half |
--                       SUPPORTED_100baseT_Full |
--                       SUPPORTED_1000baseT_Half |
--                       SUPPORTED_1000baseT_Full |
--                       SUPPORTED_Autoneg;
--
--      if (bgmac->autoneg) {
--              WARN_ON(cmd->advertising);
--              if (bgmac->full_duplex) {
--                      if (bgmac->speed & BGMAC_SPEED_10)
--                              cmd->advertising |= ADVERTISED_10baseT_Full;
--                      if (bgmac->speed & BGMAC_SPEED_100)
--                              cmd->advertising |= ADVERTISED_100baseT_Full;
--                      if (bgmac->speed & BGMAC_SPEED_1000)
--                              cmd->advertising |= ADVERTISED_1000baseT_Full;
--              } else {
--                      if (bgmac->speed & BGMAC_SPEED_10)
--                              cmd->advertising |= ADVERTISED_10baseT_Half;
--                      if (bgmac->speed & BGMAC_SPEED_100)
--                              cmd->advertising |= ADVERTISED_100baseT_Half;
--                      if (bgmac->speed & BGMAC_SPEED_1000)
--                              cmd->advertising |= ADVERTISED_1000baseT_Half;
--              }
--      } else {
--              switch (bgmac->speed) {
--              case BGMAC_SPEED_10:
--                      ethtool_cmd_speed_set(cmd, SPEED_10);
--                      break;
--              case BGMAC_SPEED_100:
--                      ethtool_cmd_speed_set(cmd, SPEED_100);
--                      break;
--              case BGMAC_SPEED_1000:
--                      ethtool_cmd_speed_set(cmd, SPEED_1000);
--                      break;
--              }
--      }
--
--      cmd->duplex = bgmac->full_duplex ? DUPLEX_FULL : DUPLEX_HALF;
--
--      cmd->autoneg = bgmac->autoneg;
--
--      return 0;
-+      return phy_ethtool_gset(bgmac->phydev, cmd);
- }
--#if 0
- static int bgmac_set_settings(struct net_device *net_dev,
-                             struct ethtool_cmd *cmd)
- {
-       struct bgmac *bgmac = netdev_priv(net_dev);
--      return -1;
-+      return phy_ethtool_sset(bgmac->phydev, cmd);
- }
--#endif
- static void bgmac_get_drvinfo(struct net_device *net_dev,
-                             struct ethtool_drvinfo *info)
-@@ -1340,6 +1282,7 @@ static void bgmac_get_drvinfo(struct net
- static const struct ethtool_ops bgmac_ethtool_ops = {
-       .get_settings           = bgmac_get_settings,
-+      .set_settings           = bgmac_set_settings,
-       .get_drvinfo            = bgmac_get_drvinfo,
- };
-@@ -1358,10 +1301,36 @@ static int bgmac_mii_write(struct mii_bu
-       return bgmac_phy_write(bus->priv, mii_id, regnum, value);
- }
-+static void bgmac_adjust_link(struct net_device *dev)
-+{
-+      struct bgmac *bgmac = netdev_priv(dev);
-+      struct phy_device *phydev = bgmac->phydev;
-+      bool status_changed = 0;
-+
-+      BUG_ON(!phydev);
-+
-+      if (bgmac->old_link != phydev->link) {
-+              status_changed = 1;
-+              bgmac->old_link = phydev->link;
-+      }
-+
-+      /* reflect duplex change */
-+      if (phydev->link && (bgmac->old_duplex != phydev->duplex)) {
-+              status_changed = 1;
-+              bgmac->old_duplex = phydev->duplex;
-+      }
-+
-+      if (status_changed)
-+              phy_print_status(phydev);
-+}
-+
- static int bgmac_mii_register(struct bgmac *bgmac)
- {
-       struct mii_bus *mii_bus;
-       int i, err = 0;
-+      struct phy_device *phydev = NULL;
-+      char phy_id[MII_BUS_ID_SIZE + 3];
-+      struct net_device *net_dev = bgmac->net_dev;
-       mii_bus = mdiobus_alloc();
-       if (!mii_bus)
-@@ -1392,7 +1361,28 @@ static int bgmac_mii_register(struct bgm
-       bgmac->mii_bus = mii_bus;
--      return err;
-+      /* connect to PHY */
-+      snprintf(phy_id, sizeof(phy_id), PHY_ID_FMT,
-+               mii_bus->id, bgmac->phyaddr);
-+
-+      phydev = phy_connect(net_dev, phy_id, &bgmac_adjust_link,
-+                           PHY_INTERFACE_MODE_MII);
-+
-+      if (IS_ERR(phydev)) {
-+              netdev_err(net_dev, "could not attach PHY: %s\n", phy_id);
-+              bgmac->phyaddr = BGMAC_PHY_NOREGS;
-+              return PTR_ERR(phydev);
-+      }
-+
-+      bgmac->phydev = phydev;
-+      bgmac->old_link = 0;
-+      bgmac->old_duplex = -1;
-+      bgmac->phyaddr = phydev->addr;
-+
-+      netdev_info(net_dev, "attached PHY driver [%s] (mii_bus:phy_addr=%s)\n",
-+                  phydev->drv->name, dev_name(&phydev->dev));
-+
-+      return 0;
- err_free_irq:
-       kfree(mii_bus->irq);
---- a/drivers/net/ethernet/broadcom/bgmac.h
-+++ b/drivers/net/ethernet/broadcom/bgmac.h
-@@ -401,7 +401,10 @@ struct bgmac {
-       struct bcma_device *cmn; /* Reference to CMN core for BCM4706 */
-       struct net_device *net_dev;
-       struct napi_struct napi;
-+      struct phy_device *phydev;
-       struct mii_bus *mii_bus;
-+      int old_link;
-+      int old_duplex;
-       /* DMA */
-       struct bgmac_dma_ring tx_ring[BGMAC_MAX_TX_RINGS];