| ofs | hex dump | ascii |
|---|
| 0000 | 89 50 4e 47 0d 0a 1a 0a 00 00 00 0d 49 48 44 52 00 00 02 3c 00 00 01 46 08 06 00 00 00 6e 5e 45 | .PNG........IHDR...<...F.....n^E |
| 0020 | a0 00 00 00 09 70 48 59 73 00 00 0b 13 00 00 0b 13 01 00 9a 9c 18 00 00 01 d5 69 54 58 74 58 4d | .....pHYs.................iTXtXM |
| 0040 | 4c 3a 63 6f 6d 2e 61 64 6f 62 65 2e 78 6d 70 00 00 00 00 00 3c 78 3a 78 6d 70 6d 65 74 61 20 78 | L:com.adobe.xmp.....<x:xmpmeta.x |
| 0060 | 6d 6c 6e 73 3a 78 3d 22 61 64 6f 62 65 3a 6e 73 3a 6d 65 74 61 2f 22 20 78 3a 78 6d 70 74 6b 3d | mlns:x="adobe:ns:meta/".x:xmptk= |
| 0080 | 22 58 4d 50 20 43 6f 72 65 20 35 2e 31 2e 32 22 3e 0a 20 20 20 3c 72 64 66 3a 52 44 46 20 78 6d | "XMP.Core.5.1.2">....<rdf:RDF.xm |
| 00a0 | 6c 6e 73 3a 72 64 66 3d 22 68 74 74 70 3a 2f 2f 77 77 77 2e 77 33 2e 6f 72 67 2f 31 39 39 39 2f | lns:rdf="http://www.w3.org/1999/ |
| 00c0 | 30 32 2f 32 32 2d 72 64 66 2d 73 79 6e 74 61 78 2d 6e 73 23 22 3e 0a 20 20 20 20 20 20 3c 72 64 | 02/22-rdf-syntax-ns#">.......<rd |
| 00e0 | 66 3a 44 65 73 63 72 69 70 74 69 6f 6e 20 72 64 66 3a 61 62 6f 75 74 3d 22 22 0a 20 20 20 20 20 | f:Description.rdf:about=""...... |
| 0100 | 20 20 20 20 20 20 20 78 6d 6c 6e 73 3a 74 69 66 66 3d 22 68 74 74 70 3a 2f 2f 6e 73 2e 61 64 6f | .......xmlns:tiff="http://ns.ado |
| 0120 | 62 65 2e 63 6f 6d 2f 74 69 66 66 2f 31 2e 30 2f 22 3e 0a 20 20 20 20 20 20 20 20 20 3c 74 69 66 | be.com/tiff/1.0/">..........<tif |
| 0140 | 66 3a 43 6f 6d 70 72 65 73 73 69 6f 6e 3e 35 3c 2f 74 69 66 66 3a 43 6f 6d 70 72 65 73 73 69 6f | f:Compression>5</tiff:Compressio |
| 0160 | 6e 3e 0a 20 20 20 20 20 20 20 20 20 3c 74 69 66 66 3a 50 68 6f 74 6f 6d 65 74 72 69 63 49 6e 74 | n>..........<tiff:PhotometricInt |
| 0180 | 65 72 70 72 65 74 61 74 69 6f 6e 3e 32 3c 2f 74 69 66 66 3a 50 68 6f 74 6f 6d 65 74 72 69 63 49 | erpretation>2</tiff:PhotometricI |
| 01a0 | 6e 74 65 72 70 72 65 74 61 74 69 6f 6e 3e 0a 20 20 20 20 20 20 20 20 20 3c 74 69 66 66 3a 4f 72 | nterpretation>..........<tiff:Or |
| 01c0 | 69 65 6e 74 61 74 69 6f 6e 3e 31 3c 2f 74 69 66 66 3a 4f 72 69 65 6e 74 61 74 69 6f 6e 3e 0a 20 | ientation>1</tiff:Orientation>.. |
| 01e0 | 20 20 20 20 20 3c 2f 72 64 66 3a 44 65 73 63 72 69 70 74 69 6f 6e 3e 0a 20 20 20 3c 2f 72 64 66 | .....</rdf:Description>....</rdf |
| 0200 | 3a 52 44 46 3e 0a 3c 2f 78 3a 78 6d 70 6d 65 74 61 3e 0a 6d 05 0b 9e 00 00 40 00 49 44 41 54 78 | :RDF>.</x:xmpmeta>.m.....@.IDATx |
| 0220 | 01 ec 5d 07 60 16 55 b6 3e e9 21 8d 84 84 84 4e 42 ef bd 83 54 e9 d2 bb d2 ec 75 75 dd f5 ed ea | ..].`.U.>.!....NB...T.....uu.... |
| 0240 | ba 96 d5 b7 ee ae ee be b5 8b 1d 0b 2a 20 d2 7b 11 90 de 7b ef 04 08 bd a4 f7 f7 7d e7 cf 0d 3f | ............*..{...{.......}...? |
| 0260 | 31 a1 48 42 da bd 3a 99 99 3b 77 ee dc 39 33 fc f7 9b 73 be 73 8e 4b 3a 8a d8 62 25 60 25 60 25 | 1.HB..:..;w..93...s.s.K:..b%`%`% |
| 0280 | 60 25 60 25 60 25 60 25 50 84 25 e0 5a 84 ef cd de 9a 95 80 95 80 95 80 95 80 95 80 95 80 95 80 | `%`%`%`%P.%.Z................... |
| 02a0 | 4a c0 02 1e fb 22 58 09 58 09 58 09 58 09 58 09 58 09 14 79 09 58 c0 53 e4 1f b1 bd 41 2b 01 2b | J...."X.X.X.X.X.X..y.X.S....A+.+ |
| 02c0 | 01 2b 01 2b 01 2b 01 2b 01 0b 78 ec 3b 60 25 60 25 60 25 60 25 60 25 60 25 50 e4 25 e0 5e e4 ef | .+.+.+.+..x.;`%`%`%`%`%`%P.%.^.. |
| 02e0 | d0 de a0 95 40 31 95 80 b3 3f 82 f3 76 31 15 47 ae de b6 8b 8b 4b 66 7f ce db 99 95 76 c3 4a c0 | ....@1...?..v1.G.....Kf.....v.J. |
| 0300 | 4a a0 c0 49 c0 02 9e 02 f7 48 ec 80 ac 04 6e 4e 02 04 31 5c 52 53 53 75 cd b3 4c 5d d6 ed 9b eb | J..I.....H....nN..1\RSSu..L].... |
| 0320 | d1 b6 ba 55 09 10 ec 18 c0 e3 bc ed ea ea 2a 5c 9c eb 6e b5 6f db de 4a c0 4a 20 77 25 60 01 4f | ...U..........*\..n.o..J.J.w%`.O |
| 0340 | ee ca 33 5f 7b 4b 4b 4b 93 e9 d3 a7 cb 80 01 03 6e 7a 1c 4b 96 2c 91 2f bf fc 52 76 ef de 2d 65 | ..3_{KKK........nz.K.,./..Rv..-e |
| 0360 | cb 96 95 b1 63 c7 ca a0 41 83 6e fa fc bc 6e 98 92 92 a2 13 07 27 8f 89 13 27 8a b7 b7 b7 f4 eb | ....c...A.n...n......'...'...... |
| 0380 | d7 2f af 2f 5b a0 fb e7 73 36 20 c7 00 1e d6 71 9b f2 62 e1 36 0b eb 6d c9 3b 09 f0 bd 64 31 a0 | ././[...s6.....q..b.6..m.;...d1. |
| 03a0 | c7 cd cd 4d b8 38 03 1e b3 6f da e4 dd 68 6c cf 56 02 56 02 d7 93 80 05 3c d7 93 4e 21 3b f6 f1 | ...M.8...o...hl.V.V.....<..N!;.. |
| 03c0 | c7 1f cb 2b af bc 72 d3 80 e7 d3 4f 3f 95 e7 9f 7f 5e 5e 7b ed 35 79 ec b1 c7 64 f5 ea d5 f2 bb | ...+..r....O?....^^{.5y...d..... |
| 03e0 | df fd 4e 8e 1d 3b 26 cf 3e fb 6c 81 b8 fb a1 43 87 ca 3d f7 dc 23 0f 3c f0 40 e6 44 52 20 06 96 | ..N..;&.>.l....C..=..#.<.@.DR... |
| 0400 | 0f 83 20 88 31 60 87 6b b3 dd b1 63 47 05 ac 66 48 06 ec 98 7d bb ce 7b 09 64 05 33 dc 7f e3 8d | ....1`.k...cG..fH...}..{.d.3.... |
| 0420 | 37 e4 91 47 1e 51 f0 49 00 64 80 4f de 8f c6 5e c1 4a c0 4a 20 3b 09 58 c0 93 9d 54 0a 59 dd 81 | 7..G.Q.I.d.O...^.J.J.;.X...T.Y.. |
| 0440 | 03 07 a4 5d bb 76 72 fa f4 69 29 5d ba f4 35 a3 bf 74 e9 92 9c 38 71 42 ea d6 ad 7b 4d fd 85 0b | ...].vr..i)]..5..t...8qB...{M... |
| 0460 | 17 e4 7f fe e7 7f 64 d2 a4 49 d2 ad 5b 37 3d d6 b6 6d 5b a9 5c b9 b2 3c fd f4 d3 f2 cc 33 cf e8 | ......d..I..[7=..m[.\..<.....3.. |
| 0480 | 57 2a fb 5c b0 60 81 7e c1 f6 ea d5 4b 4a 95 2a a5 6d 97 2f 5f 2e cd 9a 35 93 95 2b 57 ca c5 8b | W*.\.`.~....KJ.*.m./_...5..+W... |
| 04a0 | 17 a5 4b 97 2e 12 1c 1c 2c 97 2f 5f 96 bd 7b f7 4a d5 aa 55 65 f1 e2 c5 12 18 18 28 77 df 7d b7 | ..K.....,./_..{.J..Ue......(w.}. |
| 04c0 | f6 c5 13 63 62 62 84 5a 25 16 4e d4 01 01 01 ba cd 3f eb d7 af 97 2d 5b b6 08 c7 51 a7 4e 1d d9 | ...cbb.Z%.N......?....-[...Q.N.. |
| 04e0 | bf 7f bf de d3 ce 9d 3b f5 1e 1a 37 6e ac 93 86 39 61 f3 e6 cd b2 6e dd 3a a9 54 a9 92 f4 e8 d1 | .......;...7n...9a....n.:.T..... |
| 0500 | 43 c7 78 a3 eb 9b 73 0b e3 da 00 1c ae 93 93 93 55 cb 93 94 94 a4 60 a7 75 e7 6a d2 ee 9e c6 85 | C.x...s.........U.....`.u.j..... |
| 0520 | f1 b6 8a e4 98 3f 79 63 16 fe 6d fc 22 63 c6 8c 11 77 77 77 5d 0c 28 32 5a a1 22 79 e3 f6 a6 ac | .....?yc..m."c...www].(2Z."y.... |
| 0540 | 04 0a b0 04 5c f0 35 68 23 2d 17 e0 07 74 33 43 e3 04 48 20 b1 71 e3 46 19 36 6c 98 9c 39 73 26 | ....\.5h#-...t3C..H..q.F.6l..9s& |
| 0560 | f3 34 02 9a 3f fe f1 8f 72 fc f8 f1 cc 3a 6e d0 f4 45 60 73 f4 e8 d1 6b ea 9d 77 b6 6d db a6 40 | .4..?...r....:n..E`s...k..w.m..@ |
| 0580 | a6 75 eb d6 6a ee 9a 35 6b 96 2c 5d ba 54 aa 57 af 2e 15 2a 54 50 50 53 a5 4a 15 05 2a 34 a5 d0 | .u..j..5k.,].T.W...*TPPS.J..*4.. |
| 05a0 | 2c b6 66 cd 1a 19 3e 7c b8 b6 6f d4 a8 91 7c ff fd f7 f2 d4 53 4f c9 df ff fe 77 05 2d 9d 3a 75 | ,.f...>|..o...|.....SO....w.-.:u |
| 05c0 | 92 6a d5 aa 29 30 8a 8c 8c 54 50 c4 fd b7 de 7a 4b a8 a1 a2 36 67 ce 9c 39 aa 71 22 68 a2 a6 29 | .j..)0...TP....zK...6g..9.q"h..) |
| 05e0 | 3c 3c 5c cf e7 bd f8 f9 f9 c9 eb af bf 2e ff fd ef 7f e5 e5 97 5f d6 09 85 80 88 a6 2e 9e 77 bd | <<\.................._........w. |
| 0600 | eb 3b df 5b 61 db e6 33 e6 42 39 13 ec 70 49 48 48 90 c4 c4 44 05 87 4f ff a5 ab 8c fc 4b ff c2 | .;.[a..3.B9..pIHH...D..O.....K.. |
| 0620 | 76 5b 45 76 bc c3 5b bc 26 35 2b 35 92 8f c6 7d 2c 5e 5e 5e 0a d4 3d 3c 3c 32 c1 4f 91 bd 71 7b | v[Ev..[.&5+5...},^^^..=<<2.O..q{ |
| 0640 | 63 56 02 05 58 02 d6 2d bd 00 3f 9c 9b 1d 1a bf 18 a9 29 21 18 c8 5a c8 77 a1 d6 24 6b 39 72 e4 | cV..X..-..?.......)!..Z.w..$k9r. |
| 0660 | 88 6a 73 b2 d6 3b ef bf f0 c2 0b 6a e2 9a 31 63 86 82 91 d1 a3 47 cb df fe f6 b7 cc 26 f7 dd 77 | .js..;.....j..1c.....G......&..w |
| 0680 | 9f f2 7f b6 6e dd 2a 27 4f 9e 94 43 87 0e e9 31 02 ae a9 53 a7 ca b8 71 e3 e4 bb ef be 93 79 f3 | ....n.*'O..C...1...S...q......y. |
| 06a0 | e6 69 3d cd 6d d4 f6 10 98 50 33 44 ae 10 81 ce b9 73 e7 14 bc cc 9d 3b 57 de 7e fb 6d 6d bf 70 | .i=.m....P3D.....s.....;W.~.mm.p |
| 06c0 | e1 42 e5 ea 10 34 8d 1c 39 52 08 ba 4c 39 7f fe bc bc f8 e2 8b aa dd 79 ff fd f7 65 d1 a2 45 7a | .B...4..9R..L9.........y...e..Ez |
| 06e0 | 6d 8e 93 25 a7 eb 9b f3 0b e3 da 19 ec 90 bf 63 c0 0e d7 2c f6 ab a5 e0 3d d5 64 80 53 3e 1f 2e | m..%...........c...,....=.d.S>.. |
| 0700 | 7c 66 04 ab 06 b8 16 bc d1 da 11 59 09 14 7d 09 58 93 56 11 7f c6 fc ba e4 92 b5 94 2b 57 4e 4d | |f.........Y..}.X.V.........+WNM |
| 0720 | 4f 54 f0 19 55 bb 69 43 4d 0d b5 2e 34 31 51 8b 62 4a 9b 36 6d ae d9 6f d5 aa 95 1e 22 37 81 84 | OT..U.iCM...41Q.bJ.6m..o...."7.. |
| 0740 | e7 b3 67 cf ea 3e 4d 4c dc 67 a9 58 b1 62 a6 c6 69 d5 aa 55 6a 72 1b 35 6a 94 1e a3 d6 89 9a 0a | ..g..>ML.g.X.b..i..Ujr.5j....... |
| 0760 | 6a 68 82 82 82 54 73 c4 03 d4 1a 11 fc e4 54 b6 6f df ae fd d4 ae 5d 5b 9b f0 fa 2d 5a b4 90 5d | jh...Ts.......T.o.....][...-Z..] |
| 0780 | bb 76 49 68 68 a8 9a b8 b2 bb 7e 4e fd 15 96 7a 4e 96 ce 60 27 2e 2e 4e b8 38 94 b4 16 f2 14 b4 | .vIhh.....~N...zN..`'..N.8...... |
| 07a0 | e7 c8 67 45 cd 2b 8b 31 63 19 1e 8f d9 2f 68 63 b6 e3 b1 12 28 ca 12 b0 80 a7 28 3f dd eb dc 1b | ..gE.+.1c..../hc....(.....(?.... |
| 07c0 | 39 32 d4 84 d0 0c 46 2e 8e 29 d4 bc 8c 85 a7 16 79 38 61 61 61 99 5e 3f 3c 4e 2d 4e fd fa f5 4d | 92....F..)......y8aaa.^?<N-N...M |
| 07e0 | 53 a1 8a 3e bb e2 e9 e9 99 5d b5 02 ab 9e 3d 7b 4a d7 ae 5d 33 8f fb f8 f8 64 9a 6a 0c f8 e2 9a | S..>.....]....={J..]3....d.j.... |
| 0800 | dc 9c 96 2d 5b 66 b6 73 de 28 53 a6 cc 35 e3 e2 31 8e 8d e6 3c 96 9c ae af 07 0b e1 1f a3 dd 31 | ...-[f.s.(S..5..1...<..........1 |
| 0820 | e6 2c 9a b1 a8 35 20 d8 b9 72 e5 4a a6 47 56 21 bc b5 22 3d e4 94 94 64 35 39 92 c3 43 80 c3 f7 | .,...5...r.J.GV!.."=...d59..C... |
| 0840 | 92 20 28 a7 7f 37 45 5a 18 f6 e6 ac 04 0a 80 04 ac 49 ab 00 3c 84 bc 1c 02 49 c7 cb 96 2d fb d5 | ..(..7EZ.........I..<....I...-.. |
| 0860 | 25 48 62 1e 32 64 88 7a 75 45 47 47 eb 71 12 99 9f 7b ee 39 e5 f6 f0 07 9a 26 a7 09 13 26 28 b8 | %Hb.2d.zuEGG.q...{.9.....&...&(. |
| 0880 | 20 f9 79 f2 e4 c9 ca b1 f9 55 67 37 59 d1 a1 43 07 a1 f9 ab 61 c3 86 ba 7c fe f9 e7 f2 d5 57 5f | ..y......Ug7Y..C....a...|.....W_ |
| 08a0 | 29 a1 9a 64 e8 f9 f3 e7 6b 4f bc 0e 79 3a 2c 1c 07 89 b9 ce a5 56 ad 5a 4a 86 a6 d9 8b 85 7d 52 | )..d....kO..y:,......V.ZJ.....}R |
| 08c0 | eb d3 b9 73 67 e7 66 45 66 9b 80 87 c5 00 1f ca 23 3e 3e 5e 01 8f d1 20 58 9b 56 c1 7b dc c9 c9 | ...sg.fEf.......#>>^....X.V.{... |
| 08e0 | 29 aa e1 21 38 e5 33 23 40 25 68 25 e8 31 cf b4 e0 8d da 8e c8 4a a0 e8 4a c0 6a 78 8a ee b3 d5 | )..!8.3#@%h%.1.......J..J.jx.... |
| 0900 | 3b 23 d8 c9 8e b4 cc 83 1f 7e f8 a1 3c f8 e0 83 12 12 12 a2 7c 1e 9a 98 e8 46 cb 85 85 ae e0 dd | ;#.......~..<.......|....F...... |
| 0920 | bb 77 57 53 13 35 09 34 1b f5 ee dd 5b 8f fd 96 3f 74 7f ef d3 a7 8f 9a ac f8 83 4f 2d 13 89 c8 | .wWS.5.4....[...?t.........O-... |
| 0940 | 2c ff fc e7 3f 65 f0 e0 c1 4a 50 e6 17 f1 17 5f 7c a1 f5 d4 06 bd f4 d2 4b aa 6d d2 8a 8c 3f e4 | ,...?e...JP...._|.......K.m...?. |
| 0960 | 12 f5 ef df 5f 6a d4 a8 a1 26 b1 37 df 7c 53 a8 2d 2a aa 85 f2 e2 c2 89 d3 68 78 62 63 63 85 0b | ...._j...&.7.|S.-*.......hxbcc.. |
| 0980 | 35 62 d6 a0 55 f0 9e 3c c1 0d 41 0e 4d ca d4 ee 90 58 cf 62 b5 3c 05 ef 59 d9 11 15 0f 09 58 2f | 5b..U..<..A.M....X.b.<..Y.....X/ |
| 09a0 | ad e2 f1 9c af 7b 97 24 01 d3 24 44 de 4e 89 12 25 ae 69 cb 1f e7 7d fb f6 29 29 ba 7c f9 f2 d7 | .....{.$..$D.N..%.i...}..)).|... |
| 09c0 | 1c fb 2d 3b 9c 9c 0f 1e 3c a8 a7 f2 7a ce 85 93 39 09 cc e4 17 39 17 6a 31 38 2e f2 1f 9c 0b eb | ..-;....<...z...9....9.j18...... |
| 09e0 | 49 94 26 e7 27 3b c2 b6 73 db c2 bc cd 89 93 20 87 f7 4b 80 43 d7 7b 6a e3 a8 75 a3 bc 18 3b e9 | I.&.';..s.........K.C.{j..u...;. |
| 0a00 | 99 bf 76 93 d1 2f 0e 2c cc b7 59 a4 c6 4e 2f ad 92 9e 65 e4 cf cf bf a0 da 48 86 67 e0 c2 f7 94 | ..v../.,..Y..N/...e......H.g.... |
| 0a20 | ef b2 f1 dc 2a 52 37 6d 6f c6 4a a0 80 4b c0 6a 78 0a f8 03 ba 13 c3 63 fc 1c 2e d9 15 82 0c 43 | ....*R7mo.J..K.jx......c.......C |
| 0a40 | 0e ce ee f8 ad d6 91 20 9d 15 e8 98 3e f8 15 9c 15 ec f0 58 4e 60 86 f5 0d 1a 34 30 a7 17 9a f5 | ............>......XN`....40.... |
| 0a60 | 67 9f 7d a6 a6 3a 6a b4 9c e3 10 5d ef 06 a8 dd 21 58 24 f8 e1 62 dc d2 69 2e 61 bd 2d 05 4f 02 | g.}..:j....]....!X$..b..i.a.-.O. |
| 0a80 | a9 69 a9 6a 7a e4 7b ca e7 c7 e7 66 cc 59 f6 99 15 bc e7 65 47 54 f4 25 60 39 3c 45 ff 19 db 3b | .i.jz.{....f.Y.....eGT.%`9<E...; |
| 0aa0 | 2c 60 12 20 e7 c8 98 12 c9 a3 a2 db 3e 27 c2 eb 15 1e 37 93 a5 01 3c 5c 53 2b c6 62 21 cf f5 a4 | ,`..........>'....7...<\S+.b!... |
| 0ac0 | 97 3f c7 d2 52 1d 20 87 cf 88 cf 8a 20 87 c0 c7 16 2b 01 2b 81 fc 91 80 05 3c f9 23 77 7b d5 62 | .?..R............+.+.....<.#w{.b |
| 0ae0 | 2c 01 12 b1 b9 50 4b c3 78 45 e4 35 d1 9d 9e 5c 2b 06 7b cc 5a cc 24 69 26 4c 03 7e 38 91 1a c0 | ,....PK.xE.5...\+.{.Z.$i&L.~8... |
| 0b00 | 93 f5 1c bb 9f ff 12 e0 73 e3 f3 e1 f3 e2 b3 e6 c2 3a ab dd c9 ff 67 63 47 50 3c 25 60 01 4f f1 | ........s........:....gcGP<%`.O. |
| 0b20 | 7c ee f6 ae f3 51 02 34 eb 99 d8 47 9c 0c f9 f5 4f 4e 0e 83 28 d2 83 8d 5e 68 8c 24 4d 0f bb ac | |....Q.4...G....ON..(...^h.$M... |
| 0b40 | 85 13 a6 01 3c 66 12 cd da c6 ee 17 0c 09 a4 65 68 74 f8 cc b8 98 62 01 8f 91 84 5d 5b 09 dc 59 | ....<f.........eht....b....][..Y |
| 0b60 | 09 58 0e cf 9d 95 b7 bd 1a 24 40 02 2e bd 57 b8 18 f7 6a b3 6f d6 59 eb cd 3e d7 66 02 31 1a 0f | .X.......$@...W...j.o.Y..>.f.1.. |
| 0b80 | b3 66 7d 76 db d9 d5 39 b7 bd d3 c7 49 3a 76 9e 00 cd 4b 61 b4 35 8c 81 f4 87 3f fc 41 43 04 30 | .f}v...9....I:v...Ka.5....?.AC.0 |
| 0ba0 | 17 d3 7f fe f3 1f 05 48 e6 be b9 26 48 62 21 f8 e1 f8 ad 4d cb 48 b1 e0 ac d3 f1 9c 0c a0 75 7e | .......H...&Hb!....M.H........u~ |
| 0bc0 | df 0a ce 08 ed 48 ac 04 8a 97 04 2c e0 29 00 cf 7b ed da b5 ea 69 93 dd 24 58 00 86 f7 9b 87 c0 | .....H.....,.)..{....i..$X...... |
| 0be0 | 89 d8 00 15 67 70 93 dd 7d 32 18 1b dd ca e9 c1 c2 b5 f3 e2 5c c7 6d ba ad 53 43 62 4c 43 d9 6d | ....gp..}2..........\.m..SCbLC.m |
| 0c00 | 67 57 c7 f6 a6 de ac 9d eb 9c b7 6f 74 fc 46 6d af 77 3e 5d ee 99 cb 8c 93 61 d6 42 ef 1d 6a 6e | gW.........ot.Fm.w>].....a.B..jn |
| 0c20 | e8 8e cf 0c f6 cc 2d 46 79 51 7e a6 28 c0 c1 4e 26 d8 31 07 ec ba 40 49 80 bc 2a 3e 23 f3 be 9b | ......-FyQ~.(..N&.1...@I..*>#... |
| 0c40 | 75 81 1a a4 1d 8c 95 40 31 92 80 05 3c 05 e0 61 33 19 27 63 df 14 b5 1f 44 4e fa 04 28 ce 80 c5 | u......@1...<..a3.'c....DN..(... |
| 0c60 | 00 99 ac 75 04 31 c5 a5 2c 45 02 56 ca c6 14 82 3d 4e 8c 4c c9 f1 c4 13 4f 08 53 6f 30 9a b4 29 | ...u.1..,E.V....=N.L....O.So0..) |
| 0c80 | f4 c4 62 31 40 c7 ac 59 57 d4 de 19 de 53 51 2d 7c 6e ce cf ae a8 de a7 bd 2f 2b 81 82 2a 81 e2 | ..b1@..YW....SQ-|n......./+..*.. |
| 0ca0 | 33 cb 14 d4 27 80 71 31 ca f0 43 0f 3d 54 80 47 68 87 96 9b 12 a0 76 88 40 85 6e f8 dc 66 76 79 | 3...'.q1..C.=T.Gh.....v.@.n..fvy |
| 0cc0 | 02 5e e7 04 a9 e6 7a 06 d0 98 b5 99 30 ed e4 69 24 54 f8 d6 e6 59 16 be 91 db 11 5b 09 14 6e 09 | .^....z.....0..i$T...Y.....[..n. |
| 0ce0 | 58 c0 53 b8 9f 9f 1d 7d 21 94 00 41 4e f3 e6 cd e5 f1 c7 1f d7 f4 1e d4 7a dd 6c b1 80 e7 66 25 | X.S....}!..AN...........z.l...f% |
| 0d00 | 55 10 da 5d 1b 2c c0 82 d4 82 f0 4c ec 18 8a b3 04 2c e0 29 ce 4f df de 7b be 48 e0 d5 57 5f 95 | U..].,.....L.....,.).O..{.H..W_. |
| 0d20 | 7f fc e3 1f f9 72 6d 7b 51 2b 01 2b 01 2b 81 e2 2a 01 eb 96 5e 5c 9f bc bd ef 7c 93 00 89 c9 b6 | .....rm{Q+.+.+..*...^\....|..... |
| 0d40 | 58 09 58 09 58 09 58 09 dc 59 09 58 c0 73 67 e5 6d af 66 25 60 25 60 25 60 25 60 25 60 25 90 0f | X.X.X.X..Y.X.sg.m.f%`%`%`%`%`%.. |
| 0d60 | 12 b0 80 27 1f 84 6e 2f 69 25 60 25 60 25 60 25 60 25 60 25 70 67 25 60 01 cf 9d 95 b7 bd 9a 95 | ...'..n/i%`%`%`%`%`%pg%`........ |
| 0d80 | 80 95 80 95 80 95 80 95 80 95 40 3e 48 c0 02 9e 7c 10 ba bd a4 95 80 95 80 95 80 95 80 95 80 95 | ..........@>H...|............... |
| 0da0 | c0 9d 95 80 05 3c 77 56 de f6 6a 56 02 56 02 56 02 56 02 56 02 56 02 f9 20 01 0b 78 f2 41 e8 f6 | .....<wV..jV.V.V.V.V.V.....x.A.. |
| 0dc0 | 92 56 02 56 02 56 02 56 02 56 02 56 02 77 56 02 16 f0 dc 59 79 db ab 59 09 58 09 58 09 58 09 58 | .V.V.V.V.V.V.wV....Yy..Y.X.X.X.X |
| 0de0 | 09 58 09 e4 83 04 2c e0 c9 07 a1 db 4b 5a 09 58 09 dc 58 02 53 fe f5 93 6c 5b bc ed c6 0d 6d 0b | .X....,.....KZ.X..X.S...l[....m. |
| 0e00 | 2b 01 2b 01 2b 81 9b 90 80 05 3c 37 21 24 db c4 4a c0 4a e0 ce 4b 60 f3 c2 ad 12 b9 ef c4 9d bf | +.+.+.....<7!$..J.J..K`......... |
| 0e20 | b0 bd a2 95 80 95 40 91 94 80 05 3c 45 f2 b1 da 9b b2 12 b8 73 12 60 a6 f7 c9 6f fc 28 17 4e 5e | ......@....<E.......s.`...o.(.N^ |
| 0e40 | 90 a5 df 2c 95 45 e3 97 64 5c 3c 5d 96 4e 58 26 1f 3e 36 4e c6 3d f1 b1From 2c39ddc83452c34fedc86261ed1f96d7537adfd1 Mon Sep 17 00:00:00 2001
From: John Crispin <blogic@openwrt.org>
Date: Mon, 14 Dec 2015 21:28:10 +0100
Subject: [PATCH 502/513] net-next: mediatek: add switch driver for rt3050
This driver is very basic and only provides basic init and irq support.
Switchdev support for this device will follow.
Signed-off-by: John Crispin <blogic@openwrt.org>
---
drivers/net/ethernet/mediatek/esw_rt3050.c | 640 ++++++++++++++++++++++++++++
drivers/net/ethernet/mediatek/esw_rt3050.h | 29 ++
2 files changed, 669 insertions(+)
create mode 100644 drivers/net/ethernet/mediatek/esw_rt3050.c
create mode 100644 drivers/net/ethernet/mediatek/esw_rt3050.h
--- /dev/null
+++ b/drivers/net/ethernet/mediatek/esw_rt3050.c
@@ -0,0 +1,640 @@
+/* This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * Copyright (C) 2009-2015 John Crispin <blogic@openwrt.org>
+ * Copyright (C) 2009-2015 Felix Fietkau <nbd@nbd.name>
+ * Copyright (C) 2013-2015 Michael Lee <igvtee@gmail.com>
+ */
+
+#include <linux/module.h>
+#include <linux/kernel.h>
+#include <linux/types.h>
+#include <linux/dma-mapping.h>
+#include <linux/init.h>
+#include <linux/skbuff.h>
+#include <linux/etherdevice.h>
+#include <linux/ethtool.h>
+#include <linux/platform_device.h>
+#include <linux/of_device.h>
+#include <linux/clk.h>
+#include <linux/of_net.h>
+#include <linux/of_mdio.h>
+
+#include <asm/mach-ralink/ralink_regs.h>
+
+#include "mtk_eth_soc.h"
+
+#include <linux/ioport.h>
+#include <linux/mii.h>
+
+#include <ralink_regs.h>
+
+/* HW limitations for this switch:
+ * - No large frame support (PKT_MAX_LEN at most 1536)
+ * - Can't have untagged vlan and tagged vlan on one port at the same time,
+ * though this might be possible using the undocumented PPE.
+ */
+
+#define RT305X_ESW_REG_ISR 0x00
+#define RT305X_ESW_REG_IMR 0x04
+#define RT305X_ESW_REG_FCT0 0x08
+#define RT305X_ESW_REG_PFC1 0x14
+#define RT305X_ESW_REG_ATS 0x24
+#define RT305X_ESW_REG_ATS0 0x28
+#define RT305X_ESW_REG_ATS1 0x2c
+#define RT305X_ESW_REG_ATS2 0x30
+#define RT305X_ESW_REG_PVIDC(_n) (0x40 + 4 * (_n))
+#define RT305X_ESW_REG_VLANI(_n) (0x50 + 4 * (_n))
+#define RT305X_ESW_REG_VMSC(_n) (0x70 + 4 * (_n))
+#define RT305X_ESW_REG_POA 0x80
+#define RT305X_ESW_REG_FPA 0x84
+#define RT305X_ESW_REG_SOCPC 0x8c
+#define RT305X_ESW_REG_POC0 0x90
+#define RT305X_ESW_REG_POC1 0x94
+#define RT305X_ESW_REG_POC2 0x98
+#define RT305X_ESW_REG_SGC 0x9c
+#define RT305X_ESW_REG_STRT 0xa0
+#define RT305X_ESW_REG_PCR0 0xc0
+#define RT305X_ESW_REG_PCR1 0xc4
+#define RT305X_ESW_REG_FPA2 0xc8
+#define RT305X_ESW_REG_FCT2 0xcc
+#define RT305X_ESW_REG_SGC2 0xe4
+#define RT305X_ESW_REG_P0LED 0xa4
+#define RT305X_ESW_REG_P1LED 0xa8
+#define RT305X_ESW_REG_P2LED 0xac
+#define RT305X_ESW_REG_P3LED 0xb0
+#define RT305X_ESW_REG_P4LED 0xb4
+#define RT305X_ESW_REG_PXPC(_x) (0xe8 + (4 * _x))
+#define RT305X_ESW_REG_P1PC 0xec
+#define RT305X_ESW_REG_P2PC 0xf0
+#define RT305X_ESW_REG_P3PC 0xf4
+#define RT305X_ESW_REG_P4PC 0xf8
+#define RT305X_ESW_REG_P5PC 0xfc
+
+#define RT305X_ESW_LED_LINK 0
+#define RT305X_ESW_LED_100M 1
+#define RT305X_ESW_LED_DUPLEX 2
+#define RT305X_ESW_LED_ACTIVITY 3
+#define RT305X_ESW_LED_COLLISION 4
+#define RT305X_ESW_LED_LINKACT 5
+#define RT305X_ESW_LED_DUPLCOLL 6
+#define RT305X_ESW_LED_10MACT 7
+#define RT305X_ESW_LED_100MACT 8
+/* Additional led states not in datasheet: */
+#define RT305X_ESW_LED_BLINK 10
+#define RT305X_ESW_LED_ON 12
+
+#define RT305X_ESW_LINK_S 25
+#define RT305X_ESW_DUPLEX_S 9
+#define RT305X_ESW_SPD_S 0
+
+#define RT305X_ESW_PCR0_WT_NWAY_DATA_S 16
+#define RT305X_ESW_PCR0_WT_PHY_CMD BIT(13)
+#define RT305X_ESW_PCR0_CPU_PHY_REG_S 8
+
+#define RT305X_ESW_PCR1_WT_DONE BIT(0)
+
+#define RT305X_ESW_ATS_TIMEOUT (5 * HZ)
+#define RT305X_ESW_PHY_TIMEOUT (5 * HZ)
+
+#define RT305X_ESW_PVIDC_PVID_M 0xfff
+#define RT305X_ESW_PVIDC_PVID_S 12
+
+#define RT305X_ESW_VLANI_VID_M 0xfff
+#define RT305X_ESW_VLANI_VID_S 12
+
+#define RT305X_ESW_VMSC_MSC_M 0xff
+#define RT305X_ESW_VMSC_MSC_S 8
+
+#define RT305X_ESW_SOCPC_DISUN2CPU_S 0
+#define RT305X_ESW_SOCPC_DISMC2CPU_S 8
+#define RT305X_ESW_SOCPC_DISBC2CPU_S 16
+#define RT305X_ESW_SOCPC_CRC_PADDING BIT(25)
+
+#define RT305X_ESW_POC0_EN_BP_S 0
+#define RT305X_ESW_POC0_EN_FC_S 8
+#define RT305X_ESW_POC0_DIS_RMC2CPU_S 16
+#define RT305X_ESW_POC0_DIS_PORT_M 0x7f
+#define RT305X_ESW_POC0_DIS_PORT_S 23
+
+#define RT305X_ESW_POC2_UNTAG_EN_M 0xff
+#define RT305X_ESW_POC2_UNTAG_EN_S 0
+#define RT305X_ESW_POC2_ENAGING_S 8
+#define RT305X_ESW_POC2_DIS_UC_PAUSE_S 16
+
+#define RT305X_ESW_SGC2_DOUBLE_TAG_M 0x7f
+#define RT305X_ESW_SGC2_DOUBLE_TAG_S 0
+#define RT305X_ESW_SGC2_LAN_PMAP_M 0x3f
+#define RT305X_ESW_SGC2_LAN_PMAP_S 24
+
+#define RT305X_ESW_PFC1_EN_VLAN_M 0xff
+#define RT305X_ESW_PFC1_EN_VLAN_S 16
+#define RT305X_ESW_PFC1_EN_TOS_S 24
+
+#define RT305X_ESW_VLAN_NONE 0xfff
+
+#define RT305X_ESW_GSC_BC_STROM_MASK 0x3
+#define RT305X_ESW_GSC_BC_STROM_SHIFT 4
+
+#define RT305X_ESW_GSC_LED_FREQ_MASK 0x3
+#define RT305X_ESW_GSC_LED_FREQ_SHIFT 23
+
+#define RT305X_ESW_POA_LINK_MASK 0x1f
+#define RT305X_ESW_POA_LINK_SHIFT 25
+
+#define RT305X_ESW_PORT_ST_CHG BIT(26)
+#define RT305X_ESW_PORT0 0
+#define RT305X_ESW_PORT1 1
+#define RT305X_ESW_PORT2 2
+#define RT305X_ESW_PORT3 3
+#define RT305X_ESW_PORT4 4
+#define RT305X_ESW_PORT5 5
+#define RT305X_ESW_PORT6 6
+
+#define RT305X_ESW_PMAP_LLLLLL 0x3f
+#define RT305X_ESW_PMAP_LLLLWL 0x2f
+#define RT305X_ESW_PMAP_WLLLLL 0x3e
+
+#define RT305X_ESW_PORTS_INTERNAL \
+ (BIT(RT305X_ESW_PORT0) | BIT(RT305X_ESW_PORT1) | \
+ BIT(RT305X_ESW_PORT2) | BIT(RT305X_ESW_PORT3) | \
+ BIT(RT305X_ESW_PORT4))
+
+#define RT305X_ESW_PORTS_NOCPU \
+ (RT305X_ESW_PORTS_INTERNAL | BIT(RT305X_ESW_PORT5))
+
+#define RT305X_ESW_PORTS_CPU BIT(RT305X_ESW_PORT6)
+
+#define RT305X_ESW_PORTS_ALL \
+ (RT305X_ESW_PORTS_NOCPU | RT305X_ESW_PORTS_CPU)
+
+#define RT305X_ESW_NUM_PORTS 7
+#define RT305X_ESW_NUM_LEDS 5
+
+#define RT5350_EWS_REG_LED_POLARITY 0x168
+#define RT5350_RESET_EPHY BIT(24)
+
+struct esw_port {
+ bool disable;
+ u8 led;
+};
+
+struct rt305x_esw {
+ struct device *dev;
+ void __iomem *base;
+ int irq;
+
+ /* Protects against concurrent register r/w operations. */
+ spinlock_t reg_rw_lock;
+
+ unsigned char port_map;
+ unsigned int reg_led_polarity;
+
+ struct esw_port ports[RT305X_ESW_NUM_PORTS];
+
+};
+
+static inline void esw_w32(struct rt305x_esw *esw, u32 val, unsigned reg)
+{
+ __raw_writel(val, esw->base + reg);
+}
+
+static inline u32 esw_r32(struct rt305x_esw *esw, unsigned reg)
+{
+ return __raw_readl(esw->base + reg);
+}
+
+static inline void esw_rmw_raw(struct rt305x_esw *esw, unsigned reg,
+ unsigned long mask, unsigned long val)
+{
+ unsigned long t;
+
+ t = __raw_readl(esw->base + reg) & ~mask;
+ __raw_writel(t | val, esw->base + reg);
+}
+
+static void esw_rmw(struct rt305x_esw *esw, unsigned reg,
+ unsigned long mask, unsigned long val)
+{
+ unsigned long flags;
+
+ spin_lock_irqsave(&esw->reg_rw_lock, flags);
+ esw_rmw_raw(esw, reg, mask, val);
+ spin_unlock_irqrestore(&esw->reg_rw_lock, flags);
+}
+
+static u32 rt305x_mii_write(struct rt305x_esw *esw, u32 phy_addr,
+ u32 phy_register, u32 write_data)
+{
+ unsigned long t_start = jiffies;
+ int ret = 0;
+
+ while (1) {
+ if (!(esw_r32(esw, RT305X_ESW_REG_PCR1) &
+ RT305X_ESW_PCR1_WT_DONE))
+ break;
+ if (time_after(jiffies, t_start + RT305X_ESW_PHY_TIMEOUT)) {
+ ret = 1;
+ goto out;
+ }
+ }
+
+ write_data &= 0xffff;
+ esw_w32(esw, (write_data << RT305X_ESW_PCR0_WT_NWAY_DATA_S) |
+ (phy_register << RT305X_ESW_PCR0_CPU_PHY_REG_S) |
+ (phy_addr) | RT305X_ESW_PCR0_WT_PHY_CMD,
+ RT305X_ESW_REG_PCR0);
+
+ t_start = jiffies;
+ while (1) {
+ if (esw_r32(esw, RT305X_ESW_REG_PCR1) &
+ RT305X_ESW_PCR1_WT_DONE)
+ break;
+
+ if (time_after(jiffies, t_start + RT305X_ESW_PHY_TIMEOUT)) {
+ ret = 1;
+ break;
+ }
+ }
+out:
+ if (ret)
+ dev_err(esw->dev, "ramips_eth: MDIO timeout\n");
+ return ret;
+}
+
+static unsigned esw_get_port_disable(struct rt305x_esw *esw)
+{
+ unsigned reg;
+
+ reg = esw_r32(esw, RT305X_ESW_REG_POC0);
+ return (reg >> RT305X_ESW_POC0_DIS_PORT_S) &
+ RT305X_ESW_POC0_DIS_PORT_M;
+}
+
+static void esw_hw_init(struct rt305x_esw *esw)
+{
+ int i;
+ u8 port_disable = 0;
+ u8 port_map = RT305X_ESW_PMAP_LLLLLL;
+
+ /* vodoo from original driver */
+ esw_w32(esw, 0xC8A07850, RT305X_ESW_REG_FCT0);
+ esw_w32(esw, 0x00000000, RT305X_ESW_REG_SGC2);
+ /* Port priority 1 for all ports, vlan enabled. */
+ esw_w32(esw, 0x00005555 |
+ (RT305X_ESW_PORTS_ALL << RT305X_ESW_PFC1_EN_VLAN_S),
+ RT305X_ESW_REG_PFC1);
+
+ /* Enable Back Pressure, and Flow Control */
+ esw_w32(esw, ((RT305X_ESW_PORTS_ALL << RT305X_ESW_POC0_EN_BP_S) |
+ (RT305X_ESW_PORTS_ALL << RT305X_ESW_POC0_EN_FC_S)),
+ RT305X_ESW_REG_POC0);
+
+ /* Enable Aging, and VLAN TAG removal */
+ esw_w32(esw, ((RT305X_ESW_PORTS_ALL << RT305X_ESW_POC2_ENAGING_S) |
+ (RT305X_ESW_PORTS_NOCPU << RT305X_ESW_POC2_UNTAG_EN_S)),
+ RT305X_ESW_REG_POC2);
+
+ esw_w32(esw, 0x00d6500c, RT305X_ESW_REG_FCT2);
+
+ /* 300s aging timer, max packet len 1536, broadcast storm prevention
+ * disabled, disable collision abort, mac xor48 hash, 10 packet back
+ * pressure jam, GMII disable was_transmit, back pressure disabled,
+ * 30ms led flash, unmatched IGMP as broadcast, rmc tb fault to all
+ * ports.
+ */
+ esw_w32(esw, 0x0008a301, RT305X_ESW_REG_SGC);
+
+ /* Setup SoC Port control register */
+ esw_w32(esw,
+ (RT305X_ESW_SOCPC_CRC_PADDING |
+ (RT305X_ESW_PORTS_CPU << RT305X_ESW_SOCPC_DISUN2CPU_S) |
+ (RT305X_ESW_PORTS_CPU << RT305X_ESW_SOCPC_DISMC2CPU_S) |
+ (RT305X_ESW_PORTS_CPU << RT305X_ESW_SOCPC_DISBC2CPU_S)),
+ RT305X_ESW_REG_SOCPC);
+
+ /* ext phy base addr 31, enable port 5 polling, rx/tx clock skew 1,
+ * turbo mii off, rgmi 3.3v off
+ * port5: disabled
+ * port6: enabled, gige, full-duplex, rx/tx-flow-control
+ */
+ esw_w32(esw, 0x3f502b28, RT305X_ESW_REG_FPA2);
+ esw_w32(esw, 0x00000000, RT305X_ESW_REG_FPA);
+
+ /* Force Link/Activity on ports */
+ esw_w32(esw, 0x00000005, RT305X_ESW_REG_P0LED);
+ esw_w32(esw, 0x00000005, RT305X_ESW_REG_P1LED);
+ esw_w32(esw, 0x00000005, RT305X_ESW_REG_P2LED);
+ esw_w32(esw, 0x00000005, RT305X_ESW_REG_P3LED);
+ esw_w32(esw, 0x00000005, RT305X_ESW_REG_P4LED);
+
+ /* Copy disabled port configuration from bootloader setup */
+ port_disable = esw_get_port_disable(esw);
+ for (i = 0; i < 6; i++)
+ esw->ports[i].disable = (port_disable & (1 << i)) != 0;
+
+ if (ralink_soc == RT305X_SOC_RT3352) {
+ /* reset EPHY */
+ fe_reset(RT5350_RESET_EPHY);
+
+ rt305x_mii_write(esw, 0, 31, 0x8000);
+ for (i = 0; i < 5; i++) {
+ if (esw->ports[i].disable) {
+ rt305x_mii_write(esw, i, MII_BMCR, BMCR_PDOWN);
+ } else {
+ rt305x_mii_write(esw, i, MII_BMCR,
+ BMCR_FULLDPLX |
+ BMCR_ANENABLE |
+ BMCR_SPEED100);
+ }
+ /* TX10 waveform coefficient LSB=0 disable PHY */
+ rt305x_mii_write(esw, i, 26, 0x1601);
+ /* TX100/TX10 AD/DA current bias */
+ rt305x_mii_write(esw, i, 29, 0x7016);
+ /* TX100 slew rate control */
+ rt305x_mii_write(esw, i, 30, 0x0038);
+ }
+
+ /* select global register */
+ rt305x_mii_write(esw, 0, 31, 0x0);
+ /* enlarge agcsel threshold 3 and threshold 2 */
+ rt305x_mii_write(esw, 0, 1, 0x4a40);
+ /* enlarge agcsel threshold 5 and threshold 4 */
+ rt305x_mii_write(esw, 0, 2, 0x6254);
+ /* enlarge agcsel threshold */
+ rt305x_mii_write(esw, 0, 3, 0xa17f);
+ rt305x_mii_write(esw, 0, 12, 0x7eaa);
+ /* longer TP_IDL tail length */
+ rt305x_mii_write(esw, 0, 14, 0x65);
+ /* increased squelch pulse count threshold. */
+ rt305x_mii_write(esw, 0, 16, 0x0684);
+ /* set TX10 signal amplitude threshold to minimum */
+ rt305x_mii_write(esw, 0, 17, 0x0fe0);
+ /* set squelch amplitude to higher threshold */
+ rt305x_mii_write(esw, 0, 18, 0x40ba);
+ /* tune TP_IDL tail and head waveform, enable power
+ * down slew rate control
+ */
+ rt305x_mii_write(esw, 0, 22, 0x253f);
+ /* set PLL/Receive bias current are calibrated */
+ rt305x_mii_write(esw, 0, 27, 0x2fda);
+ /* change PLL/Receive bias current to internal(RT3350) */
+ rt305x_mii_write(esw, 0, 28, 0xc410);
+ /* change PLL bias current to internal(RT3052_MP3) */
+ rt305x_mii_write(esw, 0, 29, 0x598b);
+ /* select local register */
+ rt305x_mii_write(esw, 0, 31, 0x8000);
+ } else if (ralink_soc == RT305X_SOC_RT5350) {
+ /* reset EPHY */
+ fe_reset(RT5350_RESET_EPHY);
+
+ /* set the led polarity */
+ esw_w32(esw, esw->reg_led_polarity & 0x1F,
+ RT5350_EWS_REG_LED_POLARITY);
+
+ /* local registers */
+ rt305x_mii_write(esw, 0, 31, 0x8000);
+ for (i = 0; i < 5; i++) {
+ if (esw->ports[i].disable) {
+ rt305x_mii_write(esw, i, MII_BMCR, BMCR_PDOWN);
+ } else {
+ rt305x_mii_write(esw, i, MII_BMCR,
+ BMCR_FULLDPLX |
+ BMCR_ANENABLE |
+ BMCR_SPEED100);
+ }
+ /* TX10 waveform coefficient LSB=0 disable PHY */
+ rt305x_mii_write(esw, i, 26, 0x1601);
+ /* TX100/TX10 AD/DA current bias */
+ rt305x_mii_write(esw, i, 29, 0x7015);
+ /* TX100 slew rate control */
+ rt305x_mii_write(esw, i, 30, 0x0038);
+ }
+
+ /* global registers */
+ rt305x_mii_write(esw, 0, 31, 0x0);
+ /* enlarge agcsel threshold 3 and threshold 2 */
+ rt305x_mii_write(esw, 0, 1, 0x4a40);
+ /* enlarge agcsel threshold 5 and threshold 4 */
+ rt305x_mii_write(esw, 0, 2, 0x6254);
+ /* enlarge agcsel threshold 6 */
+ rt305x_mii_write(esw, 0, 3, 0xa17f);
+ rt305x_mii_write(esw, 0, 12, 0x7eaa);
+ /* longer TP_IDL tail length */
+ rt305x_mii_write(esw, 0, 14, 0x65);
+ /* increased squelch pulse count threshold. */
+ rt305x_mii_write(esw, 0, 16, 0x0684);
+ /* set TX10 signal amplitude threshold to minimum */
+ rt305x_mii_write(esw, 0, 17, 0x0fe0);
+ /* set squelch amplitude to higher threshold */
+ rt305x_mii_write(esw, 0, 18, 0x40ba);
+ /* tune TP_IDL tail and head waveform, enable power
+ * down slew rate control
+ */
+ rt305x_mii_write(esw, 0, 22, 0x253f);
+ /* set PLL/Receive bias current are calibrated */
+ rt305x_mii_write(esw, 0, 27, 0x2fda);
+ /* change PLL/Receive bias current to internal(RT3350) */
+ rt305x_mii_write(esw, 0, 28, 0xc410);
+ /* change PLL bias current to internal(RT3052_MP3) */
+ rt305x_mii_write(esw, 0, 29, 0x598b);
+ /* select local register */
+ rt305x_mii_write(esw, 0, 31, 0x8000);
+ } else if (ralink_soc == MT762X_SOC_MT7628AN || ralink_soc == MT762X_SOC_MT7688) {
+ int i;
+
+ /* reset EPHY */
+ fe_reset(RT5350_RESET_EPHY);
+
+ rt305x_mii_write(esw, 0, 31, 0x2000); /* change G2 page */
+ rt305x_mii_write(esw, 0, 26, 0x0020);
+
+ for (i = 0; i < 5; i++) {
+ rt305x_mii_write(esw, i, 31, 0x8000);
+ rt305x_mii_write(esw, i, 0, 0x3100);
+ rt305x_mii_write(esw, i, 30, 0xa000);
+ rt305x_mii_write(esw, i, 31, 0xa000);
+ rt305x_mii_write(esw, i, 16, 0x0606);
+ rt305x_mii_write(esw, i, 23, 0x0f0e);
+ rt305x_mii_write(esw, i, 24, 0x1610);
+ rt305x_mii_write(esw, i, 30, 0x1f15);
+ rt305x_mii_write(esw, i, 28, 0x6111);
+ rt305x_mii_write(esw, i, 31, 0x2000);
+ rt305x_mii_write(esw, i, 26, 0x0000);
+ }
+
+ /* 100Base AOI setting */
+ rt305x_mii_write(esw, 0, 31, 0x5000);
+ rt305x_mii_write(esw, 0, 19, 0x004a);
+ rt305x_mii_write(esw, 0, 20, 0x015a);
+ rt305x_mii_write(esw, 0, 21, 0x00ee);
+ rt305x_mii_write(esw, 0, 22, 0x0033);
+ rt305x_mii_write(esw, 0, 23, 0x020a);
+ rt305x_mii_write(esw, 0, 24, 0x0000);
+ rt305x_mii_write(esw, 0, 25, 0x024a);
+ rt305x_mii_write(esw, 0, 26, 0x035a);
+ rt305x_mii_write(esw, 0, 27, 0x02ee);
+ rt305x_mii_write(esw, 0, 28, 0x0233);
+ rt305x_mii_write(esw, 0, 29, 0x000a);
+ rt305x_mii_write(esw, 0, 30, 0x0000);
+ } else {
+ rt305x_mii_write(esw, 0, 31, 0x8000);
+ for (i = 0; i < 5; i++) {
+ if (esw->ports[i].disable) {
+ rt305x_mii_write(esw, i, MII_BMCR, BMCR_PDOWN);
+ } else {
+ rt305x_mii_write(esw, i, MII_BMCR,
+ BMCR_FULLDPLX |
+ BMCR_ANENABLE |
+ BMCR_SPEED100);
+ }
+ /* TX10 waveform coefficient */
+ rt305x_mii_write(esw, i, 26, 0x1601);
+ /* TX100/TX10 AD/DA current bias */
+ rt305x_mii_write(esw, i, 29, 0x7058);
+ /* TX100 slew rate control */
+ rt305x_mii_write(esw, i, 30, 0x0018);
+ }
+
+ /* PHY IOT */
+ /* select global register */
+ rt305x_mii_write(esw, 0, 31, 0x0);
+ /* tune TP_IDL tail and head waveform */
+ rt305x_mii_write(esw, 0, 22, 0x052f);
+ /* set TX10 signal amplitude threshold to minimum */
+ rt305x_mii_write(esw, 0, 17, 0x0fe0);
+ /* set squelch amplitude to higher threshold */
+ rt305x_mii_write(esw, 0, 18, 0x40ba);
+ /* longer TP_IDL tail length */
+ rt305x_mii_write(esw, 0, 14, 0x65);
+ /* select local register */
+ rt305x_mii_write(esw, 0, 31, 0x8000);
+ }
+
+ if (esw->port_map)
+ port_map = esw->port_map;
+ else
+ port_map = RT305X_ESW_PMAP_LLLLLL;
+
+ /* Unused HW feature, but still nice to be consistent here...
+ * This is also exported to userspace ('lan' attribute) so it's
+ * conveniently usable to decide which ports go into the wan vlan by
+ * default.
+ */
+ esw_rmw(esw, RT305X_ESW_REG_SGC2,
+ RT305X_ESW_SGC2_LAN_PMAP_M << RT305X_ESW_SGC2_LAN_PMAP_S,
+ port_map << RT305X_ESW_SGC2_LAN_PMAP_S);
+
+ /* make the switch leds blink */
+ for (i = 0; i < RT305X_ESW_NUM_LEDS; i++)
+ esw->ports[i].led = 0x05;
+
+ /* Only unmask the port change interrupt */
+ esw_w32(esw, ~RT305X_ESW_PORT_ST_CHG, RT305X_ESW_REG_IMR);
+}
+
+static irqreturn_t esw_interrupt(int irq, void *_esw)
+{
+ struct rt305x_esw *esw = (struct rt305x_esw *)_esw;
+ u32 status;
+
+ status = esw_r32(esw, RT305X_ESW_REG_ISR);
+ if (status & RT305X_ESW_PORT_ST_CHG) {
+ u32 link = esw_r32(esw, RT305X_ESW_REG_POA);
+
+ link >>= RT305X_ESW_POA_LINK_SHIFT;
+ link &= RT305X_ESW_POA_LINK_MASK;
+ dev_info(esw->dev, "link changed 0x%02X\n", link);
+ }
+ esw_w32(esw, status, RT305X_ESW_REG_ISR);
+
+ return IRQ_HANDLED;
+}
+
+static int esw_probe(struct platform_device *pdev)
+{
+ struct resource *res = platform_get_resource(p, IORESOURCE_MEM, 0);
+ struct device_node *np = pdev->dev.of_node;
+ const __be32 *port_map, *reg_init;
+ struct rt305x_esw *esw;
+ struct resource *irq;
+ int ret;
+
+ esw = devm_kzalloc(&pdev->dev, sizeof(*esw), GFP_KERNEL);
+ if (!esw)
+ return -ENOMEM;
+
+ esw->dev = &pdev->dev;
+ esw->irq = irq->start;
+ esw->base = devm_ioremap_resource(&pdev->dev, res);
+ if (!esw->base)
+ return -EADDRNOTAVAIL;
+
+ port_map = of_get_property(np, "mediatek,portmap", NULL);
+ if (port_map)
+ esw->port_map = be32_to_cpu(*port_map);
+
+ reg_init = of_get_property(np, "mediatek,led_polarity", NULL);
+ if (reg_init)
+ esw->reg_led_polarity = be32_to_cpu(*reg_init);
+
+ platform_set_drvdata(pdev, esw);
+
+ spin_lock_init(&esw->reg_rw_lock);
+
+ esw_hw_init(esw);
+
+ ret = devm_request_irq(&pdev->dev, esw->irq, esw_interrupt, 0, "esw",
+ esw);
+
+ if (!ret) {
+ esw_w32(esw, RT305X_ESW_PORT_ST_CHG, RT305X_ESW_REG_ISR);
+ esw_w32(esw, ~RT305X_ESW_PORT_ST_CHG, RT305X_ESW_REG_IMR);
+ }
+
+ return ret;
+}
+
+static int esw_remove(struct platform_device *pdev)
+{
+ struct rt305x_esw *esw = platform_get_drvdata(pdev);
+
+ if (esw) {
+ esw_w32(esw, ~0, RT305X_ESW_REG_IMR);
+ platform_set_drvdata(pdev, NULL);
+ }
+
+ return 0;
+}
+
+static const struct of_device_id ralink_esw_match[] = {
+ { .compatible = "ralink,rt3050-esw" },
+ {},
+};
+MODULE_DEVICE_TABLE(of, ralink_esw_match);
+
+static struct platform_driver esw_driver = {
+ .probe = esw_probe,
+ .remove = esw_remove,
+ .driver = {
+ .name = "rt3050-esw",
+ .owner = THIS_MODULE,
+ .of_match_table = ralink_esw_match,
+ },
+};
+
+int __init mtk_switch_init(void)
+{
+ return platform_driver_register(&esw_driver);
+}
+
+void mtk_switch_exit(void)
+{
+ platform_driver_unregister(&esw_driver);
+}
--- /dev/null
+++ b/drivers/net/ethernet/mediatek/esw_rt3050.h
@@ -0,0 +1,29 @@
+/* This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * Copyright (C) 2009-2015 John Crispin <blogic@openwrt.org>
+ * Copyright (C) 2009-2015 Felix Fietkau <nbd@nbd.name>
+ * Copyright (C) 2013-2015 Michael Lee <igvtee@gmail.com>
+ */
+
+#ifndef _RALINK_ESW_RT3052_H__
+#define _RALINK_ESW_RT3052_H__
+
+#ifdef CONFIG_NET_MEDIATEK_ESW_RT3052
+
+int __init mtk_switch_init(void);
+void mtk_switch_exit(void);
+
+#else
+
+static inline int __init mtk_switch_init(void) { return 0; }
+static inline void mtk_switch_exit(void) { }
+
+#endif
+#endif
|