From c751e1d1215f8ab523ba4521d47b3c7f163c43e3 Mon Sep 17 00:00:00 2001 From: Aditya Prayoga Date: Wed, 27 Feb 2019 14:28:15 +0800 Subject: [PATCH] Added Wake on LAN --- .../helios4-dts-add-wake-on-lan-support.patch | 23 +++ ...-mvebu-gpio-add_wake_on_gpio_support.patch | 90 +++++++++++ docs/img/wol/schematic.png | Bin 0 -> 8755 bytes docs/wol.md | 147 ++++++++++++++++++ mkdocs.yml | 1 + 5 files changed, 261 insertions(+) create mode 100644 docs/files/wol/helios4-dts-add-wake-on-lan-support.patch create mode 100644 docs/files/wol/lk4.14-mvebu-gpio-add_wake_on_gpio_support.patch create mode 100644 docs/img/wol/schematic.png create mode 100644 docs/wol.md diff --git a/docs/files/wol/helios4-dts-add-wake-on-lan-support.patch b/docs/files/wol/helios4-dts-add-wake-on-lan-support.patch new file mode 100644 index 0000000..313ec83 --- /dev/null +++ b/docs/files/wol/helios4-dts-add-wake-on-lan-support.patch @@ -0,0 +1,23 @@ +diff --git a/arch/arm/boot/dts/armada-388-helios4.dts b/arch/arm/boot/dts/armada-388-helios4.dts +index 705adfa8c..d5afbfc53 100644 +--- a/arch/arm/boot/dts/armada-388-helios4.dts ++++ b/arch/arm/boot/dts/armada-388-helios4.dts +@@ -84,6 +84,18 @@ + }; + }; + ++ gpio-keys { ++ compatible = "gpio-keys"; ++ pinctrl-0 = <µsom_phy0_int_pins>; ++ ++ wol { ++ label = "Wake-On-LAN"; ++ linux,code = ; ++ gpios = <&gpio0 18 GPIO_ACTIVE_LOW>; ++ wakeup-source; ++ }; ++ }; ++ + io-leds { + compatible = "gpio-leds"; + sata1-led { diff --git a/docs/files/wol/lk4.14-mvebu-gpio-add_wake_on_gpio_support.patch b/docs/files/wol/lk4.14-mvebu-gpio-add_wake_on_gpio_support.patch new file mode 100644 index 0000000..aa3dcf5 --- /dev/null +++ b/docs/files/wol/lk4.14-mvebu-gpio-add_wake_on_gpio_support.patch @@ -0,0 +1,90 @@ +diff --git a/drivers/gpio/gpio-mvebu.c b/drivers/gpio/gpio-mvebu.c +index 661c5a38f..a25d61d54 100644 +--- a/drivers/gpio/gpio-mvebu.c ++++ b/drivers/gpio/gpio-mvebu.c +@@ -38,6 +38,7 @@ + #include + #include + #include ++#include + #include + #include + #include +@@ -133,7 +134,7 @@ struct mvebu_gpio_chip { + struct regmap *regs; + u32 offset; + struct regmap *percpu_regs; +- int irqbase; ++ int bank_irq[4]; + struct irq_domain *domain; + int soc_variant; + +@@ -608,6 +609,33 @@ static void mvebu_gpio_irq_handler(struct irq_desc *desc) + chained_irq_exit(chip, desc); + } + ++/* ++ * Set interrupt number "irq" in the GPIO as a wake-up source. ++ * While system is running, all registered GPIO interrupts need to have ++ * wake-up enabled. When system is suspended, only selected GPIO interrupts ++ * need to have wake-up enabled. ++ * @param irq interrupt source number ++ * @param enable enable as wake-up if equal to non-zero ++ * @return This function returns 0 on success. ++ */ ++static int mvebu_gpio_set_wake_irq(struct irq_data *d, unsigned int enable) ++{ ++ struct irq_chip_generic *gc = irq_data_get_irq_chip_data(d); ++ struct mvebu_gpio_chip *mvchip = gc->private; ++ int irq; ++ int bank; ++ ++ bank = d->hwirq % 8; ++ irq = mvchip->bank_irq[bank]; ++ ++ if (enable) ++ enable_irq_wake(irq); ++ else ++ disable_irq_wake(irq); ++ ++ return 0; ++} ++ + /* + * Functions implementing the pwm_chip methods + */ +@@ -1277,7 +1305,7 @@ static int mvebu_gpio_probe(struct platform_device *pdev) + + err = irq_alloc_domain_generic_chips( + mvchip->domain, ngpios, 2, np->name, handle_level_irq, +- IRQ_NOREQUEST | IRQ_NOPROBE | IRQ_LEVEL, 0, 0); ++ IRQ_NOREQUEST | IRQ_NOPROBE | IRQ_LEVEL, 0, IRQ_GC_INIT_NESTED_LOCK); + if (err) { + dev_err(&pdev->dev, "couldn't allocate irq chips %s (DT).\n", + mvchip->chip.label); +@@ -1295,6 +1323,8 @@ static int mvebu_gpio_probe(struct platform_device *pdev) + ct->chip.irq_mask = mvebu_gpio_level_irq_mask; + ct->chip.irq_unmask = mvebu_gpio_level_irq_unmask; + ct->chip.irq_set_type = mvebu_gpio_irq_set_type; ++ ct->chip.irq_set_wake = mvebu_gpio_set_wake_irq; ++ ct->chip.flags = IRQCHIP_SET_TYPE_MASKED | IRQCHIP_MASK_ON_SUSPEND; + ct->chip.name = mvchip->chip.label; + + ct = &gc->chip_types[1]; +@@ -1303,6 +1333,8 @@ static int mvebu_gpio_probe(struct platform_device *pdev) + ct->chip.irq_mask = mvebu_gpio_edge_irq_mask; + ct->chip.irq_unmask = mvebu_gpio_edge_irq_unmask; + ct->chip.irq_set_type = mvebu_gpio_irq_set_type; ++ ct->chip.irq_set_wake = mvebu_gpio_set_wake_irq; ++ ct->chip.flags = IRQCHIP_SET_TYPE_MASKED | IRQCHIP_MASK_ON_SUSPEND; + ct->handler = handle_edge_irq; + ct->chip.name = mvchip->chip.label; + +@@ -1318,6 +1350,7 @@ static int mvebu_gpio_probe(struct platform_device *pdev) + continue; + irq_set_chained_handler_and_data(irq, mvebu_gpio_irq_handler, + mvchip); ++ mvchip->bank_irq[i] = irq; + } + + /* Some MVEBU SoCs have simple PWM support for GPIO lines */ diff --git a/docs/img/wol/schematic.png b/docs/img/wol/schematic.png new file mode 100644 index 0000000000000000000000000000000000000000..e5059eb8a17a4fe6342327b852c8d28792906d3e GIT binary patch literal 8755 zcmc(FXHXMN_iuO(@%gTQ!8H&8DEu%JZG7-3Coiz@pa17o%26~XVh zxyHZ3s2{ZstmNcfSB*!={R+(Sc=n`MbGNlO#3$j6ZCf4y@U`PM`RPqAoGSo8Dznd6 zQ*ELL01`eEuK->?ya0T9`xOXyz_3gYxE}gHBhuIFvaq!+s;xb&Fl%_+s{1xm7}WGy zMMa~D8IUlYgilRPebR^A-~XUi#W2w|IcYEk0@yQUT&x(qc=2LPfD*88^YerX5b}~l z0m!=r1w7~N-~`;F#{aiO5}2*&Dv-H(LSiEKe7s>)5$>-)=086y<$PzuQ;mF}q@<+h zRLl~$iz$>FbNtwdVH7YVy-Mb~0I+J9n3#-#?CT5R@XN-&+y8Z6egg&frl4~^;M0~i zhU}Qu>4vhY0dHL!=2#kF7YEU+H>1@qU+)KBWZ7&@!(NL;N=&_ub)YFpDVBZsQ5UYd zzw}lS$9AzaDY~oS=?ww7!?cM&Ef?F3oPZkCs}H@uK7-v8z;5;zx1jqXx!;(=a?%|h zE9pdw?#+|2D6RDMwSuHuvf$KqYje|?K|h;}^DjAcl?~&mgW3^_KhBzOc*j@07Y=gc z<^pGQF1x=+aA>ngYN9-$j7XW;{@}Czt=(qVxO*Ewq!0 z_1QCv(DO2$O30Lt9R^?H&n;&~rEv~c7+|i@2t3z$-pjzb*J~P(DL>=AGTYIp+-Yzf z3|nAw5*rZPjVv^}X)4jdNjkS5U1E!}47q6#$G{f%T?%q8+8P<~Xxew6)N8fiX2FVB z=Sjy|aI77~u8R@A7==YISMbE#xuC*ReH#_SRz0vRNL`FcP5QE4WYxbdV7|(yJ}d3M zzu9fT6lW;DyDe{zvECDQ%!;f{AEaMcH49QI(GS9uKD0V1)`buTi=j1G={g4{ZFofq z9OePdu@qKzpUf_vG&U3HT9LnTdfKe_#r1wu$p|H37g>mwVeOkh-qa`E?6 zZxWWMFKRLf7|dEK2meT=5xXP8M%zSuY&5^KY--2xb-ft9&YS*5%2nZVwy)c-Q`Eg<%NSQz{b*);fp_idhK2n-*X3+DehZ4T4mZ& zdnmSOMYghj^d*P3Lw&M;_^%cYQJ0@hO_^TDGS{yQpGowMeS|@MhdaF4_@it`8Mqiy zn5-?bt!JzPa9z^IzT&$LT5yf;O#|D9mS>ee_l!K>D3S7MBcsY_MTW#}64+x2cTqfW(6-F8E+ zv7^%YJ1fNK_2Rht3>xVw70|s&MyfT8Xh><*ROexK*hS-^KdW|kQ-B3X$#AXKEdJ?3 zbYg9hmbZ&uy~?06O*GK*tX?6H(^$%59WPbU@$9I>MaC+!COxwaq5_|04RmjOs=mpn0Xu5OeRIn&A&I@;!6;Fn zZOJODf0U~bS^kq#jw9C&wb*kUA1FQL6du@)Vq@|@YqgrVap-=)2cM?m*UO9m^SzsKz5M&RjgkoY&w-5D0W z#<#|CLXkkPT4C=L#)G=bC>kKe_FgC(d9`r@0bgEjQsMYo)85 zIe#>XyFHLf?DgTGmgdaLQ1)l1&LfZ8MUd^PTQbcXu5WzVFPq}T`27@oivs1kUFmLo zg&_yP2xmo0)51$Q8!S&@g5DqkbxlIkqaK8s-^Y&s)~IyDFiaBcRQ#H5*Vh|MXt)2G zn9y%=S2mMkt4$Migmtf88msE*o&|TI1&KkuLm?csN>qaq7U%(8v!hDYnoMHx!6EIKBWxb-pNdv64NQR%7ze)f4v<$-dIJIb#_|(uEn13 zK0OE|ZznU(a>?treWBy@7j^v1y+_l3Lp-Oe70#RN&A&>)HSLgAFp$50MS5-aSeM@~ z;;P#tk{bg~n=leZ=UiH3!rJ2Z2Jg6a>s{{mbIXU5GWZR`H=Utxq9hC;fFM6%0 zv1p@_61iJ!;fk?Pla1;2*Xe#az6#dsrK{5tfy|M^nbbfbJ}ZTfA$5n#Li|Wen39_j zO9D8N2gAcZHLuAP+m%f%&Wf4Whjm-GA~`v--|)>IOC;sZw#=z-Eqwiw7fQUIc}HK! zD)QjqDnqJ>Qk0t}KR-itVWDEw)Etvt?|n~qiSH66yjX*4uke!k8Ez*!LLwLL*ei6v z;t2@Er6XL22^?G(>>a}PQ>Ma7I`m+0V8yNlN)WDcF6Uh*CvN;1gqjawjfW4!mUL~X z=<0NtEsR2Gicc&cTk>yTkrqtT?)dL3P6i>vIi#CjXd1;9@8xP!E(V=F1HBuzlSUv? zVhW@kw>A}+##Ji!TTU#TSZ0TSA&U-|XsFSJEMz{~dGsu@+~H7B^JXq^Rr({ARLVjL-@I1V4a#-`YE?2mhF(hkOk9rGgZs7#xl-Ox+QOinj3 zhP(19=5$vE7V|eAJ@MtdTPL~yyUZE?*g^6x8q6WgRH{om!x^=p9B!^^E9h*ncN|$H!tTUeV_QDpBD`r7jpWhzs&Ckr4-UAmi z4qp}E*Icg4WJ?imgdFyypOg0DhA$mWNe;F+(P_v>$msIe?ar#9RfvJ<=dK=sFY%qh zIoC`XcnG-DPp_sI9cKNXnba-Oh$mQyz+z{ZpU2*xeWj97T3;s*ONezP7G%)c%eXF7 zd)F7g?S-ShBw4?h-hBm|ETkFF#vma=V*4hWxh!0=e3MS$*3`NM^n3E;=xNKe*kIE` zWZHcGvNrLgEt^J0zgb6%dKQQ4+|z-aU#v}R-VYc?Zt5*vV`{&Ff`I%(9=t&{dC&f4 zD5E?_oNnlY%(8pqUie=?uVwpgD$M`n-QABc!c=-Rm({RhJdfFj)%tJ2#C!NtInE?2 zrR-g(Ex^~CNRe*RLD9uQYFYK-V!9%x>zo{HHcuxXq7Y-dt2YWp+xs;e)Q3JYNTP@q zLxvt~z~Z}|dU2_I3R=#Kzgq^8$0~Q)A6a;BFCvDF3MpCe#RN)acu4Er~W}#f|Gh#5N z<^g$bbZc9*^fDrnOZ)MhiI-wy(CNk}&U&$Y?QC_K$4V$&A>NCFJ9LyhI%0GlP*xM1 za%GNugLC?wIuGjOpoW%Zp zYXS4e)>kQ&@}*?Vy+N#&2Np`Ziywte;AM-vK6!^ex@$+b>@eRw06Ib zF;&oADWN$5-Jy$%;|yQ*-!2!%;$WE5*6bz_@L7B2z+YBu0#;10SZi=H@*nB22F7YL z!k*r<-)CHLbYD*Hv=1)GeSTZ`AU=;T>7wqlGDcZ)u%*RQV*eWv`Lc-j$<8TRz^)A|#%ojT zw*}ocfc!D(o@=5Xv47~6JK{UmG}KCq)q1_RIQY}krK;EN2e=ayp~{<7?^&ydRTZyK zPMK~i>|XqtVK`_bYpUEmRw|V2E^?u%$c5}Z(?r_uuGfs}EV~7NNYbo`F2^`m?MBd% zo!0MDX((`OU7Q!9r*~0#6U~0!!i}lgY2=o*&f{9)&<@*i)-~$AT_sf6OkGlGIy?_j z+j@28<#N@A(#FE~mwjzM&%HP;KhF6Rz2>U7*N`L3DUu;!Nl1c^RdCn#%`@CE#l@nr zzHs4cc{ssQ+hlCo^s?uQR`7TvyER^y zA3{@nClW2C^FvhX=|Pq}SYi34K4w*~finM+IaI1k>lMh~)G?U@Og-iV#+VDpDM6TR z9gorzbLt1`-%6^GB%3muxCkoKkXKhUtp4OkUrV`3H6hA5{C+Ba!vxMnichvntTAO^ zZT;SMwJ|%hAisaj#d)08?DqTB1>&50!Ww>qb8cRkUDS=tNja+9XDhs5D@@DB2rtG) zbH`XXzW+tyzTzls)4M5m^B(r?IGe7E69_VP=f0YAeV5}yJk?5%_Dwpg<~_+jYfqBs zRGU;rOdnq4`td=$Wgj=Jhn=)&UrE@#U1$0gXm5B`r2Wgn+@&?&xx@1@g)dVyc$NI+ zoLde<7)JUaDZt3lE$HL-_loezBrf&5yFC*;txqK~xn{k{%O2+$n`^-3amfz} z!2Swz2_IhciywSz&S(`tkHYC)s}pIANa_t_MOcmRCK_QERw7ZS^HZhgxi`d>y~me> z8W~u*q%Za#nVY)>}1 zzY?QGxO6Ii*s!5AA{~TMK4kBL)aI8VA*0R2>iJCRp_n)3EJPqPqh$sBnVu6H3wknw z8(4VZ@JZqgxX4~a-mPE1L-+01(mQg0)pm(&`p%EL78S(}_16(aY23pROu zKJFD6{J5@{l!}+d55anJi5(4zJWYs-Eh`y&mUhKpIquz7FaF0v_P*WJz>g0GqUmp_ z3C7jpaaI#8wXu($UQlyTmCGdatT#c1-72|1Oa4UBI`v@0n+aW~q?sjy9^}S9CJn%# zoE_tXC=&#zqL33(PufO)KOL&%bQIVr8^c(**e`^n6JjH4wI{ua_Vga`1E`iy>`FhC zcW5VvOksie&10&E^7;@P%6TMfecC8T?c^@Y?L-?dHJc ziC}Lq6Wp@j`bkK(Z=8q|c6EW&9@{}IATlAx?RbC62Fe;+@fjc4tH2@xFA$&djF)o= zmWPD`Ene=cg`M=NmQg&DVCs>3p;cAcfpOXnjo-c}1tt;SX-xNar!pp1PF4Q>U4^EM zZoMzL7r5%R+}zgGo%0OvZJx^P$!@d9BMBX-eSk^Edv^|)Opu7tlz(A>IB-iy2~7Iv zWv=|jvqXY#ud{WU0d8A5SOE7_==ND`d~AKH+zrS2-{ZZ$0F-a=(-WNRa{AKxNQm3Q ztfX-IrYRzyfXA~iR4fiE*JnUAQnG3i4}lY6gKLqd4AddVpcprdPuy_<*(U~8pDo$* z)!$v1sDP#yRx&5LWuvTMoP~N}kqg1XX z4Sjb8x@-;KZTbrR91C*dd(OoW=o|k+NBu0ri}<-!?3-_kj*R76t%?H!d_fB?NSD@D zPLIRofUXM;2!2n9m00Wu%r#j4jQ+hoN3eq-)482?rr)>4t`G$v2)BgcsrBU-t6Bv{ zWck|SFk(XFK6cQBhKWjElI3jYnY1`Of7(ZDXQs(!2;z@EyTJr0ni@+v$baS0!NAB6 zxg08>hfiH)dEvU&-9kN_QV3sRSS@5d^es@2;1le56X=P3V^7^K?t{>^)q@k-i`f=` zAYA8*Y&6g5en31Q@chcjCmIIr@(68Qe!>u~oQ}ys$vXaqrU$JwF9OzRkx$(x!(>3G z^cN({^()+aE}6`p!hT^d*DFD^hg8sJKZjg2cyW79y?e7^$S$cJ^<{0pP|59=pUG+d zEkTXvztR0rw+PZ(ODTmaN~~PUlQ&m5-1H@%Hk!h&(c!CaL4(XP>Kx~<5ynoPeT3Cp z{kLDLOR_Ul<`(0FU&Zn!UhMMx5PCvVjR7)Q3?quOeS18<8^z|dAQuQwGk?y5sKyNS zUV?|X0F=>0-LUoB_x%|Sdc|j`a=3(3G}2weAD5RNuRCf~#L=puK6D4c7x3tcS?^le z(wtxC6Ied+#)W(k>w#}UWQ1BRd{tjkGTAp7*jTW7JSeN*xEIUGsS6@S*rpol-hl$X zmrvZucGIW$h<~EmeAk~xYP!dx8s<1lz9Q%+t^(R5!a`QqJ`>T^U;3s$vAhVv2Rs5D zfM!`WC|H9loLwt!GoA1sI7ZfogVo|jQLQ8V49j zk3$wcqsB6?hj8vHKh{ZlFXuujR6$3ruR1VGHH&~3H{_3@mtvKkuzM><{>=%J5Z?=e z?89bC5ged=?{0J82VN;-gSY1 zE0jy;9X$n~jl|*3Yu~mWwA*Q>J8)h&jbz~_^ikP7eQgB1Wpji1kRF~m*Z--XdCHI< zXAqnclk)WFp17zRq2|08LB4H+8Pzw^%+_GEhPMV?Y*@O7#Z|b9+kbNCl)H3{*9XKNke+AQ|xGt*$Ipe^8rkvxM$Jd=GC_CfIZuYx?8?8GD+dsEJX@*M$^BL zS-xupx!N9E|be*sXKBy+==|AO|W^4OLLl2 zF9eY@dFIR2vB(_93{84gH$XLHCiek+46mz;IZU#E6-yK{t=16shS<}?LO8b_9}3;fJflT> z3*hQCf1#rkOY7_-F!wFYv~<4Sd(Lw2uwJ_F&H1nwM&0LAHyxinBWgGB zR5}9>e(cxo9-f7_$c$>|jb>8(B{mqVSHrVPc$oT&nQi17gFJUgEC?-pY9(p=fyj`! zIs#o}mP(#*c+sbY%G+WzwCGKHXUI_7HtyFUzh2nN%o$_mhQ_}$aXF3nZRt#4cbTQ) zmw3oskbJb2RI#vbcV8ngL$&N2bcYxbt{CR)_{|VVh8Stj7MU6S4budb%IGhL?M=O= z*)oq6@a+d>xQW?^jgGx7%$^DD)%wG~KuS<&tUi&Uk4L!~kF9e^o^ zX~|Z|Xa443*TUharM_m=Dz(jvX=6)mE8^ifID*fZwUMd*zL?-f1z9`g$HZx5B1>NM zJhZ_deF|aU@Usr_2A%y{ssVy;q|CA2wiJeabS;mVz67yyPBd_=cl;%^zCVxi>i~Tg z<}8-GxWg=7wh3WVVprNcYi6S`*a7)b_Nv$tE_HtXIeMw#5XsLkatqn&x!-uaJ#;XE z9!|C7YbLeKw!62rU|R|F-(MLiwXT@Nu)S})OM7@+Awm6*g)I#qr6D_$5Qr+m#Rgy> zR*E_yywyQYwrwsGlG?w)Wl9`fdADxUUc{&54WHp3@J z4uNSIlOc1@DSSX=5i*)vXjmXdE@RMA=Vtqa6X@@$f9uvZA%0(L&CATH${7BbJVx)@ zuGPF9dDfa^I0@;E#-l2>YIR^rH_9r~DkQB34^YlULO97#gH)0e!@nCFE=rgjY)5Iq z?z~4Fg*DKbc{Z8X?C(Udv=e-0@3!VwnR-3Ro2{X$Dxm|H3Q=c&VclHc_%>I!y{F}Y zxIsgExn%HyL~#pO>jYs!bu69@m2Y}JEd#oWR6PT!xA$3LPSP&VGWsE4C*_rl;HvB! z3KN%tnfa1S%LO|zaIQvtxX8Y|Edo0=C&^dPi)Px}sNP`u%QR+WK=y*uCqX>eDN)el zTCLQ{B&u+l()60|N3uE5JDVNhHZJKxL2(U4J*X~LU_itLDXRRl`aLam_CuK*a`n~j zcSEpk85^!J4=azgDG%`n|A)u4uiF+7mrdWj1;q`%Jgd!bL2F<-E&Tgy;ys^~Jtt8- zFQ`5)TC^^jHXf)oamVBDsQLW(o8J8Y@}HAQ_~N3XqRPq(v>WPQ@K;w~KM4kd6$XqZ zy{?KcYzB-7O4yJ_C0bq3h`;!<;2C`!BiUl z-!f(;KTx&cEGfvzi%u`?e3YxvNdf~8l}NTI)W?}g zvqloM<~k=|l}W8JW(LS*d_kH_Oo~>{xGcJ_ak0r~Brgo{avYa*U@6i5-I2oSzNYk+ z(@#fq4IXkS>-;MhUleh!Uz!s%V3z3b;|^)?a>1^P=mk69wA&4c6W-t+ zPC2>;u$R0AJ?>CtIgQp%`za+c*>03*kmmWp>Br$RuBxDNQndN4YE2_s(;7~YQe1^n zJ?>!krhFnrD`VHLA{jHO(!l$0Wkw+Jg@QzUAVBjv-pEaNr^VJ((85QeGoW-WSV2zl z=&~$xId*ceX9d+%?cZyXexXu+D)}b0qK475WO~nx>iAx+h@6Sxe*8xwew&TPL9I&m zdD$0Y88GJLQx!WCY2~tKdUcqrwD1|U!q3rkLoD{EKoZ+djWt@9SSeH62TG@_vh@G< zZKa#MD{~gM*XeV)Q^^mxEjH};DRsAEJn;zsg+hXnBrOTh7H`ZK?+b{3fc_WNXb1wVbOE@8a< zGfN;7TdnyWt3LRTOe7^DGBmjjn~S9{9^UD(Q^Zg!62Qa5pQeeC6uCE-t1MTXi%%VP zTE!;IKvoU!Oye?7s;f!MOZTpn%qE?s9jY~Ftp-%e{%}4MBp`syAMfS8InOiuvW8ve ze6IJBG#UQ)f+)dr2e)YT=OnQo^U>YxXET;+509M`G2ZdKot(FRkmguatDm(-h55^I z8eFq){g0Ibi_9aPkLPIs_WoZ{BDbhR6L$XrkhuP%`u|L=!86|k7C;>Ck^($oX~=v_ TwB~OW2tZ9q>viSJcVGS&qWoZ$ literal 0 HcmV?d00001 diff --git a/docs/wol.md b/docs/wol.md new file mode 100644 index 0000000..89acf54 --- /dev/null +++ b/docs/wol.md @@ -0,0 +1,147 @@ + +![Ethernet PHY](/img/wol/schematic.png) + +The ARMADA 388 provides several waking options sourced by different peripherals to take the system out of power save modes. Some of the options are + +* Wake on GPIO + +* Wake on LAN + +Currently Helios4 use PHY interrupt and Wake on GPIO event to implement Wake on LAN. + +## Device Tree Support + +Linux provides gpio-keys driver to handle GPIO event and can be configured as wakeup source. + +``` + gpio-keys { + compatible = "gpio-keys"; + pinctrl-0 = <µsom_phy0_int_pins>; + + wol { + label = "Wake-On-LAN"; + linux,code = ; + gpios = <&gpio0 18 GPIO_ACTIVE_LOW>; + wakeup-source; + }; + }; +``` + +Device Tree Patch can be found [here](/files/wol/helios4-dts-add-wake-on-lan-support.patch) + +## Kernel Patch + +Current gpio-mvebu driver does not implement [irq_set_wake()](https://www.kernel.org/doc/html/v4.14/core-api/genericirq.html?highlight=irq_set_wake#c.irq_chip) +to support GPIO as wakeup source and properly route it to upper interrupt controller (Arm GIC). + +This will raise following issues: + +- System unable to wake up from Suspend-to-RAM + +- Kernel crash during wakeup from standby + +``` +[ 59.169436] ------------[ cut here ]------------ +[ 59.174075] WARNING: CPU: 0 PID: 1535 at kernel/irq/manage.c:623 irq_set_irq_wake+0xe4/0x11c +[ 59.182533] Unbalanced IRQ 50 wake disable +[ 59.186638] Modules linked in: lz4hc lz4hc_compress marvell_cesa zram zsmalloc lm75 pwm_fan ip_tables x_tables +[ 59.196690] CPU: 0 PID: 1535 Comm: bash Not tainted 4.14.94-mvebu+ #14 +[ 59.203234] Hardware name: Marvell Armada 380/385 (Device Tree) +[ 59.209183] [] (unwind_backtrace) from [] (show_stack+0x10/0x14) +[ 59.216955] [] (show_stack) from [] (dump_stack+0x88/0x9c) +[ 59.224204] [] (dump_stack) from [] (__warn+0xe8/0x100) +[ 59.231188] [] (__warn) from [] (warn_slowpath_fmt+0x48/0x6c) +[ 59.238696] [] (warn_slowpath_fmt) from [] (irq_set_irq_wake+0xe4/0x11c) +[ 59.247160] [] (irq_set_irq_wake) from [] (gpio_keys_resume+0xb0/0x11c) +[ 59.255537] [] (gpio_keys_resume) from [] (dpm_run_callback+0x54/0xec) +[ 59.263826] [] (dpm_run_callback) from [] (device_resume+0xcc/0x270) +[ 59.271941] [] (device_resume) from [] (dpm_resume+0x100/0x230) +[ 59.279621] [] (dpm_resume) from [] (dpm_resume_end+0xc/0x18) +[ 59.287128] [] (dpm_resume_end) from [] (suspend_devices_and_enter+0x210/0x5e0) +[ 59.296202] [] (suspend_devices_and_enter) from [] (pm_suspend+0x2f8/0x380) +[ 59.304927] [] (pm_suspend) from [] (state_store+0x70/0xcc) +[ 59.312260] [] (state_store) from [] (kernfs_fop_write+0xe8/0x1c4) +[ 59.320204] [] (kernfs_fop_write) from [] (vfs_write+0xa4/0x1b4) +[ 59.327972] [] (vfs_write) from [] (SyS_write+0x4c/0xac) +[ 59.335045] [] (SyS_write) from [] (ret_fast_syscall+0x0/0x54) +[ 59.342633] ---[ end trace c725de247edb5ce9 ]--- +[ 59.474369] ata2: SATA link down (SStatus 0 SControl 300) +[ 59.474443] ata3: SATA link down (SStatus 0 SControl 300) +[ 59.638619] ata1: SATA link down (SStatus 0 SControl 300) +[ 59.647170] ata4: SATA link up 3.0 Gbps (SStatus 123 SControl 300) +[ 60.081905] ata1: SATA link down (SStatus 0 SControl 300) +[ 60.087343] ata1: limiting SATA link speed to 1.5 Gbps +[ 60.386518] mvneta f1070000.ethernet eth0: Link is Down +[ 60.578411] ata1: SATA link up 1.5 Gbps (SStatus 113 SControl 310) +[ 61.162892] ata4.00: configured for UDMA/100 +[ 62.431232] mvneta f1070000.ethernet eth0: Link is Up - 1Gbps/Full - flow control rx/tx +[ 63.087435] ata1.00: configured for UDMA/100 +[ 63.159889] OOM killer enabled. +[ 63.164643] Restarting tasks ... done. +[ 63.181059] PM: suspend exit +``` + +- System can wake up from any GPIO interrupt without need to define as wakeup source + +To fix the issue, gpio-mvebu driver needs to be patched to implement [irq_set_wake()](https://www.kernel.org/doc/html/v4.14/core-api/genericirq.html?highlight=irq_set_wake#c.irq_chip) +and only enable interrupt on GPIO defined as wakeup source. + +Patch for Linux Kernel 4.14.x can be found [here](/files/wol/lk4.14-mvebu-gpio-add_wake_on_gpio_support.patch) + + +## Enabling WoL + +Enable the PHY to only raise interrupt when magic packet received then enter suspend mode with these commands: + + +``` +sudo ethtool -s eth0 wol g +sudo systemctl suspend +``` + +Both command has to be executed to enter suspend mode otherwise there is a risk that Helios4 will not wake up on magic packet received event. +More explaination regarding this issue on next section. + +## Limitation with Current Approach + +PHY INT pin supposed to be handled by the Ethernet controller so when there is an interrupt the driver can respond and acknowledge the interrupt. +Without this acknowledgement, the PHY INT pin will stay active and the PHY will not trigger another interrupt. + +On specific case that after user enabled the wol and magic packet received before entering suspend mode, Helios4 will not able to wake up. +The reason is PHY interrupt already triggered before entering suspend mode and no other interrupt triggered during suspend mode. +The Ethernet controller driver will reset PHY interrupt during resume and when enabling wol. +Therefore it is advised to always set wol (**sudo ethtool -s eth0 wol g**) before entering suspend. + +## Power Consumption + +Measured using Sonoff POW R2 on AC side + +| Power state | Power (Watt) | Current (Ampere) | Remarks | +|---------------|---------------|------------------|---------| +| Idle | 16.18 - 19.87 | 0.14 - 0.17 | | +| Standby | 8.24 - 8.63 | 0.09 - 0.10 | | +| Suspend | 7.46 - 7.71 | 0.07 - 0.08 | | +| Halt/Shutdown | 11.95 | 0.11 | HDDs still active, fans run on full speed | + +!!! note + * Nominal Input Voltage: 220V + * HDD: 4x WD Red 2TB (WD20EFRX) + * [I2C OLED screen](/i2c/) attached to the systems + * Variation of power consumption sometimes due to fluctutation of the input voltage + +## Thermal Issue + +Using [Batch 2 fan](/pwm/#new-fan-batch-2) + +| Power state | Temperature (°C) | Remarks | +|---------------|------------------|---------| +| Standby | 89 - 90 | Fan stopped | +| Suspend | 81 - 87 | Fan stopped | + +Using [Batch 1 fan](/pwm/#old-fan-batch-1) + +| Power state | Temperature (°C) | Remarks | +|---------------|------------------|---------| +| Standby | - | Not yet tested | +| Suspend | 74 -76 | Fan run in minimum speed | + diff --git a/mkdocs.yml b/mkdocs.yml index 70905b6..66f80ca 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -75,6 +75,7 @@ pages: - PWM (Fan) : 'pwm.md' - SDIO (SD Card) : 'sdcard.md' - SPI (NOR Flash) : 'spi.md' + - Wake-On-LAN : 'wol.md' - Development: - Armbian : 'armbian.md' - FreeBSD : 'freebsd.md'