X-Git-Url: http://code.vuplus.com/gitweb/?p=vuplus_openvuplus_3.0;a=blobdiff_plain;f=meta-bsp%2Fvuduo2%2Frecipes%2Flinux%2Flinux-vuplus-3.13.5%2Fbrcm_s3_wol.patch;fp=meta-bsp%2Fvuduo2%2Frecipes%2Flinux%2Flinux-vuplus-3.13.5%2Fbrcm_s3_wol.patch;h=1eca800fa4695b1d496ea824f41efea7a3da94db;hp=0000000000000000000000000000000000000000;hb=0d6acda3c9daf671af6c3a8e02270bae96286cd6;hpb=5a2998f220be01927c231fee1c9f2a6c6300ce7a diff --git a/meta-bsp/vuduo2/recipes/linux/linux-vuplus-3.13.5/brcm_s3_wol.patch b/meta-bsp/vuduo2/recipes/linux/linux-vuplus-3.13.5/brcm_s3_wol.patch new file mode 100644 index 0000000..1eca800 --- /dev/null +++ b/meta-bsp/vuduo2/recipes/linux/linux-vuplus-3.13.5/brcm_s3_wol.patch @@ -0,0 +1,67 @@ +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/kernel/power/suspend.c b/kernel/power/suspend.c +index 62ee437..ffd0bb5 100644 +--- a/kernel/power/suspend.c ++++ b/kernel/power/suspend.c +@@ -167,6 +167,15 @@ void __attribute__ ((weak)) arch_suspend_enable_irqs(void) + local_irq_enable(); + } + ++void (*brcm_s3_cb)(void); ++ ++ ++void register_brcm_s3_cb(void (*cb)(void)) ++{ ++ brcm_s3_cb = cb; ++} ++EXPORT_SYMBOL(register_brcm_s3_cb); ++ + /** + * suspend_enter - Make the system enter the given sleep state. + * @state: System sleep state to enter. +@@ -211,6 +220,7 @@ static int suspend_enter(suspend_state_t state, bool *wakeup) + } + + ftrace_stop(); ++ if(brcm_s3_cb) brcm_s3_cb(); + error = disable_nonboot_cpus(); + if (error || suspend_test(TEST_CPUS)) + goto Enable_cpus;