Fix meta-bsp structure.
[vuplus_openvuplus_3.0] / meta-bsp / recipes-kernel / linux / linux-vuplus-3.13.5 / vusolose / brcm_s3_wol.patch
diff --git a/meta-bsp/recipes-kernel/linux/linux-vuplus-3.13.5/vusolose/brcm_s3_wol.patch b/meta-bsp/recipes-kernel/linux/linux-vuplus-3.13.5/vusolose/brcm_s3_wol.patch
new file mode 100644 (file)
index 0000000..1eca800
--- /dev/null
@@ -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;