diff --git a/target/linux/brcm47xx/patches-3.10/780-tg3-phylib.patch b/target/linux/brcm47xx/patches-3.10/780-tg3-phylib.patch
deleted file mode 100644
index 726be2a06720545872295bcf532e66b0436b967a..0000000000000000000000000000000000000000
--- a/target/linux/brcm47xx/patches-3.10/780-tg3-phylib.patch
+++ /dev/null
@@ -1,14 +0,0 @@
---- a/drivers/net/ethernet/broadcom/tg3.c
-+++ b/drivers/net/ethernet/broadcom/tg3.c
-@@ -17176,8 +17176,10 @@ static int tg3_init_one(struct pci_dev *
- 			tg3_flag_set(tp, FLUSH_POSTED_WRITES);
- 		if (ssb_gige_one_dma_at_once(pdev))
- 			tg3_flag_set(tp, ONE_DMA_AT_ONCE);
--		if (ssb_gige_have_roboswitch(pdev))
-+		if (ssb_gige_have_roboswitch(pdev)) {
-+			tg3_flag_set(tp, USE_PHYLIB);
- 			tg3_flag_set(tp, ROBOSWITCH);
-+		}
- 		if (ssb_gige_is_rgmii(pdev))
- 			tg3_flag_set(tp, RGMII_MODE);
- 	}
diff --git a/target/linux/brcm47xx/patches-3.10/790-tg3-phylib.patch b/target/linux/brcm47xx/patches-3.10/790-tg3-phylib.patch
new file mode 100644
index 0000000000000000000000000000000000000000..4a7b116745a279d83d77f60b0a8c674b1f4d60df
--- /dev/null
+++ b/target/linux/brcm47xx/patches-3.10/790-tg3-phylib.patch
@@ -0,0 +1,227 @@
+--- a/drivers/net/ethernet/broadcom/tg3.c
++++ b/drivers/net/ethernet/broadcom/tg3.c
+@@ -1367,7 +1367,7 @@ static int tg3_mdio_read(struct mii_bus
+ 
+ 	spin_lock_bh(&tp->lock);
+ 
+-	if (tg3_readphy(tp, reg, &val))
++	if (__tg3_readphy(tp, mii_id, reg, &val))
+ 		val = -EIO;
+ 
+ 	spin_unlock_bh(&tp->lock);
+@@ -1382,7 +1382,7 @@ static int tg3_mdio_write(struct mii_bus
+ 
+ 	spin_lock_bh(&tp->lock);
+ 
+-	if (tg3_writephy(tp, reg, val))
++	if (__tg3_writephy(tp, mii_id, reg, val))
+ 		ret = -EIO;
+ 
+ 	spin_unlock_bh(&tp->lock);
+@@ -1400,7 +1400,7 @@ static void tg3_mdio_config_5785(struct
+ 	u32 val;
+ 	struct phy_device *phydev;
+ 
+-	phydev = tp->mdio_bus->phy_map[TG3_PHY_MII_ADDR];
++	phydev = tp->mdio_bus->phy_map[tp->phy_addr];
+ 	switch (phydev->drv->phy_id & phydev->drv->phy_id_mask) {
+ 	case PHY_ID_BCM50610:
+ 	case PHY_ID_BCM50610M:
+@@ -1505,6 +1505,13 @@ static int tg3_mdio_init(struct tg3 *tp)
+ 				    TG3_CPMU_PHY_STRAP_IS_SERDES;
+ 		if (is_serdes)
+ 			tp->phy_addr += 7;
++	} else if (tg3_flag(tp, IS_SSB_CORE)) {
++		int addr;
++
++		addr = ssb_gige_get_phyaddr(tp->pdev);
++		if (addr < 0)
++			return addr;
++		tp->phy_addr = addr;
+ 	} else
+ 		tp->phy_addr = TG3_PHY_MII_ADDR;
+ 
+@@ -1525,7 +1532,7 @@ static int tg3_mdio_init(struct tg3 *tp)
+ 	tp->mdio_bus->read     = &tg3_mdio_read;
+ 	tp->mdio_bus->write    = &tg3_mdio_write;
+ 	tp->mdio_bus->reset    = &tg3_mdio_reset;
+-	tp->mdio_bus->phy_mask = ~(1 << TG3_PHY_MII_ADDR);
++	tp->mdio_bus->phy_mask = ~(1 << tp->phy_addr);
+ 	tp->mdio_bus->irq      = &tp->mdio_irq[0];
+ 
+ 	for (i = 0; i < PHY_MAX_ADDR; i++)
+@@ -1546,7 +1553,7 @@ static int tg3_mdio_init(struct tg3 *tp)
+ 		return i;
+ 	}
+ 
+-	phydev = tp->mdio_bus->phy_map[TG3_PHY_MII_ADDR];
++	phydev = tp->mdio_bus->phy_map[tp->phy_addr];
+ 
+ 	if (!phydev || !phydev->drv) {
+ 		dev_warn(&tp->pdev->dev, "No PHY devices\n");
+@@ -1963,7 +1970,7 @@ static void tg3_setup_flow_control(struc
+ 	u32 old_tx_mode = tp->tx_mode;
+ 
+ 	if (tg3_flag(tp, USE_PHYLIB))
+-		autoneg = tp->mdio_bus->phy_map[TG3_PHY_MII_ADDR]->autoneg;
++		autoneg = tp->mdio_bus->phy_map[tp->phy_addr]->autoneg;
+ 	else
+ 		autoneg = tp->link_config.autoneg;
+ 
+@@ -1999,7 +2006,7 @@ static void tg3_adjust_link(struct net_d
+ 	u8 oldflowctrl, linkmesg = 0;
+ 	u32 mac_mode, lcl_adv, rmt_adv;
+ 	struct tg3 *tp = netdev_priv(dev);
+-	struct phy_device *phydev = tp->mdio_bus->phy_map[TG3_PHY_MII_ADDR];
++	struct phy_device *phydev = tp->mdio_bus->phy_map[tp->phy_addr];
+ 
+ 	spin_lock_bh(&tp->lock);
+ 
+@@ -2088,7 +2095,7 @@ static int tg3_phy_init(struct tg3 *tp)
+ 	/* Bring the PHY back to a known state. */
+ 	tg3_bmcr_reset(tp);
+ 
+-	phydev = tp->mdio_bus->phy_map[TG3_PHY_MII_ADDR];
++	phydev = tp->mdio_bus->phy_map[tp->phy_addr];
+ 
+ 	/* Attach the MAC to the PHY. */
+ 	phydev = phy_connect(tp->dev, dev_name(&phydev->dev),
+@@ -2115,7 +2122,7 @@ static int tg3_phy_init(struct tg3 *tp)
+ 				      SUPPORTED_Asym_Pause);
+ 		break;
+ 	default:
+-		phy_disconnect(tp->mdio_bus->phy_map[TG3_PHY_MII_ADDR]);
++		phy_disconnect(tp->mdio_bus->phy_map[tp->phy_addr]);
+ 		return -EINVAL;
+ 	}
+ 
+@@ -2133,7 +2140,7 @@ static void tg3_phy_start(struct tg3 *tp
+ 	if (!(tp->phy_flags & TG3_PHYFLG_IS_CONNECTED))
+ 		return;
+ 
+-	phydev = tp->mdio_bus->phy_map[TG3_PHY_MII_ADDR];
++	phydev = tp->mdio_bus->phy_map[tp->phy_addr];
+ 
+ 	if (tp->phy_flags & TG3_PHYFLG_IS_LOW_POWER) {
+ 		tp->phy_flags &= ~TG3_PHYFLG_IS_LOW_POWER;
+@@ -2153,13 +2160,13 @@ static void tg3_phy_stop(struct tg3 *tp)
+ 	if (!(tp->phy_flags & TG3_PHYFLG_IS_CONNECTED))
+ 		return;
+ 
+-	phy_stop(tp->mdio_bus->phy_map[TG3_PHY_MII_ADDR]);
++	phy_stop(tp->mdio_bus->phy_map[tp->phy_addr]);
+ }
+ 
+ static void tg3_phy_fini(struct tg3 *tp)
+ {
+ 	if (tp->phy_flags & TG3_PHYFLG_IS_CONNECTED) {
+-		phy_disconnect(tp->mdio_bus->phy_map[TG3_PHY_MII_ADDR]);
++		phy_disconnect(tp->mdio_bus->phy_map[tp->phy_addr]);
+ 		tp->phy_flags &= ~TG3_PHYFLG_IS_CONNECTED;
+ 	}
+ }
+@@ -3985,7 +3992,7 @@ static int tg3_power_down_prepare(struct
+ 			struct phy_device *phydev;
+ 			u32 phyid, advertising;
+ 
+-			phydev = tp->mdio_bus->phy_map[TG3_PHY_MII_ADDR];
++			phydev = tp->mdio_bus->phy_map[tp->phy_addr];
+ 
+ 			tp->phy_flags |= TG3_PHYFLG_IS_LOW_POWER;
+ 
+@@ -11769,7 +11776,7 @@ static int tg3_get_settings(struct net_d
+ 		struct phy_device *phydev;
+ 		if (!(tp->phy_flags & TG3_PHYFLG_IS_CONNECTED))
+ 			return -EAGAIN;
+-		phydev = tp->mdio_bus->phy_map[TG3_PHY_MII_ADDR];
++		phydev = tp->mdio_bus->phy_map[tp->phy_addr];
+ 		return phy_ethtool_gset(phydev, cmd);
+ 	}
+ 
+@@ -11836,7 +11843,7 @@ static int tg3_set_settings(struct net_d
+ 		struct phy_device *phydev;
+ 		if (!(tp->phy_flags & TG3_PHYFLG_IS_CONNECTED))
+ 			return -EAGAIN;
+-		phydev = tp->mdio_bus->phy_map[TG3_PHY_MII_ADDR];
++		phydev = tp->mdio_bus->phy_map[tp->phy_addr];
+ 		return phy_ethtool_sset(phydev, cmd);
+ 	}
+ 
+@@ -11993,7 +12000,7 @@ static int tg3_nway_reset(struct net_dev
+ 	if (tg3_flag(tp, USE_PHYLIB)) {
+ 		if (!(tp->phy_flags & TG3_PHYFLG_IS_CONNECTED))
+ 			return -EAGAIN;
+-		r = phy_start_aneg(tp->mdio_bus->phy_map[TG3_PHY_MII_ADDR]);
++		r = phy_start_aneg(tp->mdio_bus->phy_map[tp->phy_addr]);
+ 	} else {
+ 		u32 bmcr;
+ 
+@@ -12109,7 +12116,7 @@ static int tg3_set_pauseparam(struct net
+ 		u32 newadv;
+ 		struct phy_device *phydev;
+ 
+-		phydev = tp->mdio_bus->phy_map[TG3_PHY_MII_ADDR];
++		phydev = tp->mdio_bus->phy_map[tp->phy_addr];
+ 
+ 		if (!(phydev->supported & SUPPORTED_Pause) ||
+ 		    (!(phydev->supported & SUPPORTED_Asym_Pause) &&
+@@ -13543,7 +13550,7 @@ static int tg3_ioctl(struct net_device *
+ 		struct phy_device *phydev;
+ 		if (!(tp->phy_flags & TG3_PHYFLG_IS_CONNECTED))
+ 			return -EAGAIN;
+-		phydev = tp->mdio_bus->phy_map[TG3_PHY_MII_ADDR];
++		phydev = tp->mdio_bus->phy_map[tp->phy_addr];
+ 		return phy_mii_ioctl(phydev, ifr, cmd);
+ 	}
+ 
+@@ -17176,8 +17183,10 @@ static int tg3_init_one(struct pci_dev *
+ 			tg3_flag_set(tp, FLUSH_POSTED_WRITES);
+ 		if (ssb_gige_one_dma_at_once(pdev))
+ 			tg3_flag_set(tp, ONE_DMA_AT_ONCE);
+-		if (ssb_gige_have_roboswitch(pdev))
++		if (ssb_gige_have_roboswitch(pdev)) {
++			tg3_flag_set(tp, USE_PHYLIB);
+ 			tg3_flag_set(tp, ROBOSWITCH);
++		}
+ 		if (ssb_gige_is_rgmii(pdev))
+ 			tg3_flag_set(tp, RGMII_MODE);
+ 	}
+@@ -17447,7 +17456,7 @@ static int tg3_init_one(struct pci_dev *
+ 
+ 	if (tp->phy_flags & TG3_PHYFLG_IS_CONNECTED) {
+ 		struct phy_device *phydev;
+-		phydev = tp->mdio_bus->phy_map[TG3_PHY_MII_ADDR];
++		phydev = tp->mdio_bus->phy_map[tp->phy_addr];
+ 		netdev_info(dev,
+ 			    "attached PHY driver [%s] (mii_bus:phy_addr=%s)\n",
+ 			    phydev->drv->name, dev_name(&phydev->dev));
+--- a/include/linux/ssb/ssb_driver_gige.h
++++ b/include/linux/ssb/ssb_driver_gige.h
+@@ -108,6 +108,16 @@ static inline int ssb_gige_get_macaddr(s
+ 	return 0;
+ }
+ 
++/* Get the device phy address */
++static inline int ssb_gige_get_phyaddr(struct pci_dev *pdev)
++{
++	struct ssb_gige *dev = pdev_to_ssb_gige(pdev);
++	if (!dev)
++		return -ENODEV;
++
++	return dev->dev->bus->sprom.et0phyaddr;
++}
++
+ extern int ssb_gige_pcibios_plat_dev_init(struct ssb_device *sdev,
+ 					  struct pci_dev *pdev);
+ extern int ssb_gige_map_irq(struct ssb_device *sdev,
+@@ -174,6 +184,10 @@ static inline int ssb_gige_get_macaddr(s
+ {
+ 	return -ENODEV;
+ }
++static inline int ssb_gige_get_phyaddr(struct pci_dev *pdev)
++{
++	return -ENODEV;
++}
+ 
+ #endif /* CONFIG_SSB_DRIVER_GIGE */
+ #endif /* LINUX_SSB_DRIVER_GIGE_H_ */