summaryrefslogtreecommitdiff
path: root/meta-bsp/vuduo2/recipes/linux/linux-vuplus-3.13.5/brcm_s3_wol.patch
blob: 1eca800fa4695b1d496ea824f41efea7a3da94db (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
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;