--- /dev/null
+diff --git a/drivers/net/ethernet/broadcom/genet/bcmgenet.c b/drivers/net/ethernet/broadcom/genet/bcmgenet.c
+index c23156a..9ae22a9 100644
+--- a/drivers/net/ethernet/broadcom/genet/bcmgenet.c
++++ b/drivers/net/ethernet/broadcom/genet/bcmgenet.c
+@@ -3115,6 +3115,34 @@ static int bcmgenet_set_wol(struct net_device *dev,
+ umac->mpd_pw_ls = get_unaligned_be32(&wol->sopass[2]);
+ umac->mpd_ctrl |= MPD_PW_EN;
+ }
++ if (pDevCtrl->phyType == BRCM_PHY_TYPE_EXT_RGMII)
++ {
++ if(wol->wolopts & WAKE_MAGIC)
++ {
++ pDevCtrl->mii.mdio_write(dev, pDevCtrl->phyAddr, 0x1f, 0x0007);
++ pDevCtrl->mii.mdio_write(dev, pDevCtrl->phyAddr, 0x1e, 0x006e);
++ pDevCtrl->mii.mdio_write(dev, pDevCtrl->phyAddr, 0x15, dev->dev_addr[1]<<8 | dev->dev_addr[0]);
++ pDevCtrl->mii.mdio_write(dev, pDevCtrl->phyAddr, 0x16, dev->dev_addr[3]<<8 | dev->dev_addr[2]);
++ pDevCtrl->mii.mdio_write(dev, pDevCtrl->phyAddr, 0x17, dev->dev_addr[5]<<8 | dev->dev_addr[4]);
++ pDevCtrl->mii.mdio_write(dev, pDevCtrl->phyAddr, 0x1f, 0x0007);
++ pDevCtrl->mii.mdio_write(dev, pDevCtrl->phyAddr, 0x1e, 0x006d);
++ pDevCtrl->mii.mdio_write(dev, pDevCtrl->phyAddr, 0x16, 0x9fff);
++ pDevCtrl->mii.mdio_write(dev, pDevCtrl->phyAddr, 0x15, 0x1000);
++ pDevCtrl->mii.mdio_write(dev, pDevCtrl->phyAddr, 0x1e, 0x006d);
++ pDevCtrl->mii.mdio_write(dev, pDevCtrl->phyAddr, 0x19, 0x0001);
++ pDevCtrl->mii.mdio_write(dev, pDevCtrl->phyAddr, 0x1f, 0x0000);
++
++ }
++ else
++ {
++ pDevCtrl->mii.mdio_write(dev, pDevCtrl->phyAddr, 0x1f, 0x0007);
++ pDevCtrl->mii.mdio_write(dev, pDevCtrl->phyAddr, 0x1e, 0x006d);
++ pDevCtrl->mii.mdio_write(dev, pDevCtrl->phyAddr, 0x16, 0x9fff);
++ pDevCtrl->mii.mdio_write(dev, pDevCtrl->phyAddr, 0x15, 0x0000);
++ pDevCtrl->mii.mdio_write(dev, pDevCtrl->phyAddr, 0x1f, 0x0000);
++ }
++ }
++
+
+ device_set_wakeup_enable(&dev->dev, wol->wolopts);
+ pDevCtrl->wolopts = wol->wolopts;
+diff --git a/drivers/brcmstb/setup.c b/drivers/brcmstb/setup.c
+index 21a6e42..954b902 100644
+--- a/drivers/brcmstb/setup.c
++++ b/drivers/brcmstb/setup.c
+@@ -932,6 +932,15 @@ void brcm_machine_restart(const char *command)
+ ;
+ }
+
++void (*brcm_s3_cb)(void);
++
++
++void register_brcm_s3_cb(void (*cb)(void))
++{
++ brcm_s3_cb = cb;
++}
++EXPORT_SYMBOL(register_brcm_s3_cb);
++
+ void brcm_machine_halt(void)
+ {
+ #ifdef CONFIG_BRCM_IRW_HALT
+@@ -939,6 +948,7 @@ void brcm_machine_halt(void)
+ BDEV_WR_F_RB(SUN_TOP_CTRL_GENERAL_CTRL_1, irw_top_sw_pwroff, 0);
+ BDEV_WR_F_RB(SUN_TOP_CTRL_GENERAL_CTRL_1, irw_top_sw_pwroff, 1);
+ #endif
++ if(brcm_s3_cb) brcm_s3_cb();
+ #ifdef CONFIG_BRCM_HAS_AON
+ /* may be S3 cold boot */
+ brcm_pm_s3_cold_boot();
+