<html xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40"><head><meta name=Generator content="Microsoft Word 15 (filtered medium)"><style><!--
/* Font Definitions */
@font-face
        {font-family:Helvetica;
        panose-1:2 11 6 4 2 2 2 2 2 4;}
@font-face
        {font-family:Courier;
        panose-1:2 7 4 9 2 2 5 2 4 4;}
@font-face
        {font-family:"Tms Rmn";
        panose-1:2 2 6 3 4 5 5 2 3 4;}
@font-face
        {font-family:Helv;
        panose-1:2 11 6 4 2 2 2 3 2 4;}
@font-face
        {font-family:"New York";
        panose-1:2 4 5 3 6 5 6 2 3 4;}
@font-face
        {font-family:System;
        panose-1:0 0 0 0 0 0 0 0 0 0;}
@font-face
        {font-family:Wingdings;
        panose-1:5 0 0 0 0 0 0 0 0 0;}
@font-face
        {font-family:"MS Mincho";
        panose-1:2 2 6 9 4 2 5 8 3 4;}
@font-face
        {font-family:Batang;
        panose-1:2 3 6 0 0 1 1 1 1 1;}
@font-face
        {font-family:SimSun;
        panose-1:2 1 6 0 3 1 1 1 1 1;}
@font-face
        {font-family:PMingLiU;
        panose-1:2 2 5 0 0 0 0 0 0 0;}
@font-face
        {font-family:"MS Gothic";
        panose-1:2 11 6 9 7 2 5 8 2 4;}
@font-face
        {font-family:Dotum;
        panose-1:2 11 6 0 0 1 1 1 1 1;}
@font-face
        {font-family:SimHei;
        panose-1:2 1 6 9 6 1 1 1 1 1;}
@font-face
        {font-family:MingLiU;
        panose-1:2 2 5 9 0 0 0 0 0 0;}
@font-face
        {font-family:Mincho;
        panose-1:2 2 6 9 4 3 5 8 3 5;}
@font-face
        {font-family:Gulim;
        panose-1:2 11 6 0 0 1 1 1 1 1;}
@font-face
        {font-family:Century;
        panose-1:2 4 6 4 5 5 5 2 3 4;}
@font-face
        {font-family:"Angsana New";
        panose-1:2 2 6 3 5 4 5 2 3 4;}
@font-face
        {font-family:"Cordia New";
        panose-1:2 11 3 4 2 2 2 2 2 4;}
@font-face
        {font-family:Mangal;
        panose-1:2 4 5 3 5 2 3 3 2 2;}
@font-face
        {font-family:Latha;
        panose-1:2 11 6 4 2 2 2 2 2 4;}
@font-face
        {font-family:Sylfaen;
        panose-1:1 10 5 2 5 3 6 3 3 3;}
@font-face
        {font-family:Vrinda;
        panose-1:2 11 5 2 4 2 4 2 2 3;}
@font-face
        {font-family:Raavi;
        panose-1:2 11 5 2 4 2 4 2 2 3;}
@font-face
        {font-family:Shruti;
        panose-1:2 11 5 2 4 2 4 2 2 3;}
@font-face
        {font-family:Sendnya;
        panose-1:0 0 4 0 0 0 0 0 0 0;}
@font-face
        {font-family:Gautami;
        panose-1:2 11 5 2 4 2 4 2 2 3;}
@font-face
        {font-family:Tunga;
        panose-1:2 11 5 2 4 2 4 2 2 3;}
@font-face
        {font-family:"Estrangelo Edessa";
        panose-1:3 8 6 0 0 0 0 0 0 0;}
@font-face
        {font-family:"Cambria Math";
        panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
        {font-family:"Arial Unicode MS";
        panose-1:2 11 6 4 2 2 2 2 2 4;}
@font-face
        {font-family:"Calibri Light";
        panose-1:2 15 3 2 2 2 4 3 2 4;}
@font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}
@font-face
        {font-family:"Segoe UI";
        panose-1:2 11 5 2 4 2 4 2 2 3;}
@font-face
        {font-family:Tahoma;
        panose-1:2 11 6 4 3 5 4 4 2 4;}
@font-face
        {font-family:pp-sans-big-light;}
@font-face
        {font-family:Consolas;
        panose-1:2 11 6 9 2 2 4 3 2 4;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0cm;
        margin-bottom:.0001pt;
        font-size:12.0pt;
        font-family:"Times New Roman",serif;}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:blue;
        text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
        {mso-style-priority:99;
        color:purple;
        text-decoration:underline;}
p
        {mso-style-priority:99;
        mso-margin-top-alt:auto;
        margin-right:0cm;
        mso-margin-bottom-alt:auto;
        margin-left:0cm;
        font-size:12.0pt;
        font-family:"Times New Roman",serif;}
span.EmailStyle18
        {mso-style-type:personal;
        font-family:"Calibri",sans-serif;
        color:#1F497D;}
span.EmailStyle19
        {mso-style-type:personal;
        font-family:"Calibri",sans-serif;
        color:#1F497D;}
span.EmailStyle20
        {mso-style-type:personal-compose;
        font-family:"Calibri",sans-serif;
        color:windowtext;}
span.msoIns
        {mso-style-type:export-only;
        mso-style-name:"";
        text-decoration:underline;
        color:teal;}
span.msoDel
        {mso-style-type:export-only;
        mso-style-name:"";
        text-decoration:line-through;
        color:red;}
.MsoChpDefault
        {mso-style-type:export-only;
        font-size:10.0pt;}
@page WordSection1
        {size:612.0pt 792.0pt;
        margin:70.85pt 70.85pt 2.0cm 70.85pt;}
div.WordSection1
        {page:WordSection1;}
--></style></head><body lang=DE link=blue vlink=purple><div class=WordSection1><p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1F497D;mso-fareast-language:EN-US'>Und nochmal hallo,<o:p></o:p></span></p><p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1F497D;mso-fareast-language:EN-US'><o:p> </o:p></span></p><p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1F497D;mso-fareast-language:EN-US'>ich habe gerade mal aus der Hüfte mit den Patches für OpenWrt gespielt und könnte mir vorstellen, dass man das auf die drei im Anhang reduzieren könnte. Ich habe natürlich keine Ahnung, ob das so wirklich funktioniert.<o:p></o:p></span></p><p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1F497D;mso-fareast-language:EN-US'><o:p> </o:p></span></p><p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1F497D;mso-fareast-language:EN-US'>Nur als Diskussionsanregung, vll. kann ja jemand den Stab aufnehmen und weitermachen.<o:p></o:p></span></p><p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1F497D;mso-fareast-language:EN-US'><o:p> </o:p></span></p><p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1F497D;mso-fareast-language:EN-US'>Grüße<o:p></o:p></span></p><p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1F497D;mso-fareast-language:EN-US'><o:p> </o:p></span></p><p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1F497D;mso-fareast-language:EN-US'>Adrian<o:p></o:p></span></p><p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1F497D;mso-fareast-language:EN-US'><o:p> </o:p></span></p><div style='border:none;border-left:solid blue 1.5pt;padding:0cm 0cm 0cm 4.0pt'><div><div style='border:none;border-top:solid #E1E1E1 1.0pt;padding:3.0pt 0cm 0cm 0cm'><p class=MsoNormal><b><span lang=EN-US style='font-size:11.0pt;font-family:"Calibri",sans-serif'>From:</span></b><span lang=EN-US style='font-size:11.0pt;font-family:"Calibri",sans-serif'> franken-dev [mailto:franken-dev-bounces@freifunk.net] <b>On Behalf Of </b>mail@adrianschmutzler.de<br><b>Sent:</b> Freitag, 30. November 2018 00:52<br><b>To:</b> 'Christian Dresel' <fff@chrisi01.de>; franken-dev@freifunk.net<br><b>Subject:</b> RE: [PATCH] Add support for Fritzbox 4040<o:p></o:p></span></p></div></div><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1F497D;mso-fareast-language:EN-US'>Hallo Christian,<o:p></o:p></span></p><p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1F497D;mso-fareast-language:EN-US'><o:p> </o:p></span></p><p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1F497D;mso-fareast-language:EN-US'>das ist alles sehr komisch. Im ersten Patch baut der Typ irgendwelchen C-Code, nur um dann den Patch auf linux-4.9.34/drivers/net/ethernet/qualcomm/Kconfig anzuwenden, obwohl das Target Kernel 4.14 hat.<o:p></o:p></span></p><p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1F497D;mso-fareast-language:EN-US'><o:p> </o:p></span></p><p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1F497D;mso-fareast-language:EN-US'>Im zweiten Patch wird dann auch unheimlich viel im Kreis geschoben, was auch andere Geräte betrifft. Das wirkt auf mich sehr wirr und nicht allzu durchdacht. Auf mich wirkt das eher so, als ob es reichen würde, die Zeile<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US style='font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1F497D;mso-fareast-language:EN-US'>ucidef_set_interfaces_lan_wan "eth0" "eth1"<o:p></o:p></span></p><p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1F497D;mso-fareast-language:EN-US'>zu entfernen und die Switch-Konfiguration <o:p></o:p></span></p><p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1F497D;mso-fareast-language:EN-US'>"0@eth0" "1:lan" "2:lan" "3:lan" "4:lan" "5:wan"<o:p></o:p></span></p><p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1F497D;mso-fareast-language:EN-US'>zu verwenden.<o:p></o:p></span></p><p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1F497D;mso-fareast-language:EN-US'><o:p> </o:p></span></p><p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1F497D;mso-fareast-language:EN-US'>Danach fängt er plötzlich an, im network file die mac-Adresse zu setzen, was da nicht hingehört.<o:p></o:p></span></p><p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1F497D;mso-fareast-language:EN-US'><o:p> </o:p></span></p><p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1F497D;mso-fareast-language:EN-US'>Relevant für uns ist dann lediglich noch <o:p></o:p></span></p><p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1F497D;mso-fareast-language:EN-US'><o:p> </o:p></span></p><p class=MsoNormal><span lang=EN-US style='font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1F497D;mso-fareast-language:EN-US'>target/linux/ipq40xx/patches-4.14/715-ar40xx-Enable-QinQ-on-the-switch.patch<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US style='font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1F497D;mso-fareast-language:EN-US'><o:p> </o:p></span></p><p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1F497D;mso-fareast-language:EN-US'>ganz am Ende von Patch Nr. 2. Das wirkt auf mich aber auch eher so, als ob irgendwas auskommentiert wurde, was man durch Setzen der entsprechenden Optionen auch ordentlich hätte gemacht werden können.<o:p></o:p></span></p><p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1F497D;mso-fareast-language:EN-US'><o:p> </o:p></span></p><p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1F497D;mso-fareast-language:EN-US'>Ich denke, dass man 1. mindestens die verwendeten Patches deutlich eindampfen kann, wenn nicht sogar 2. das bei OpenWRT als PR gleich richtig reparieren kann.<o:p></o:p></span></p><p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1F497D;mso-fareast-language:EN-US'><o:p> </o:p></span></p><p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1F497D;mso-fareast-language:EN-US'>Ggf. kann da dann auch jemand weiterhelfen, der mehr davon versteht als ich.<o:p></o:p></span></p><p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1F497D;mso-fareast-language:EN-US'><o:p> </o:p></span></p><p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1F497D;mso-fareast-language:EN-US'>Soweit erstmal mein Eindruck; ich fürchte, ich brauche auch so ein Ding.<o:p></o:p></span></p><p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1F497D;mso-fareast-language:EN-US'><o:p> </o:p></span></p><p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1F497D;mso-fareast-language:EN-US'>Grüße<o:p></o:p></span></p><p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1F497D;mso-fareast-language:EN-US'><o:p> </o:p></span></p><p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1F497D;mso-fareast-language:EN-US'>Adrian<o:p></o:p></span></p><p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1F497D;mso-fareast-language:EN-US'><o:p> </o:p></span></p><div><div style='border:none;border-top:solid #E1E1E1 1.0pt;padding:3.0pt 0cm 0cm 0cm'><p class=MsoNormal><b><span lang=EN-US style='font-size:11.0pt;font-family:"Calibri",sans-serif'>From:</span></b><span lang=EN-US style='font-size:11.0pt;font-family:"Calibri",sans-serif'> Christian Dresel [<a href="mailto:fff@chrisi01.de">mailto:fff@chrisi01.de</a>] <br><b>Sent:</b> Mittwoch, 28. November 2018 14:41<br><b>To:</b> Adrian Schmutzler <<a href="mailto:mail@adrianschmutzler.de">mail@adrianschmutzler.de</a>>; <a href="mailto:franken-dev@freifunk.net">franken-dev@freifunk.net</a><br><b>Subject:</b> Re: [PATCH] Add support for Fritzbox 4040<o:p></o:p></span></p></div></div><p class=MsoNormal><o:p> </o:p></p><p><span style='font-family:"Calibri",sans-serif'>hi</span> <o:p></o:p></p><p><span style='font-family:"Calibri",sans-serif'>Am 28.11.18 um 14:35 schrieb Adrian Schmutzler:</span> <br><span style='font-family:"Calibri",sans-serif'>> Hallo Christian,</span> <br><span style='font-family:"Calibri",sans-serif'>> </span><br><span style='font-family:"Calibri",sans-serif'>>> -----Original Message-----</span> <br><span style='font-family:"Calibri",sans-serif'>>> From: franken-dev [<a href="mailto:franken-dev-bounces@freifunk.net">mailto:franken-dev-bounces@freifunk.net</a>] On Behalf Of</span> <br><span style='font-family:"Calibri",sans-serif'>>> Christian Dresel</span> <br><span style='font-family:"Calibri",sans-serif'>>> Sent: Sonntag, 25. November 2018 10:11</span> <br><span style='font-family:"Calibri",sans-serif'>>> To: <a href="mailto:franken-dev@freifunk.net">franken-dev@freifunk.net</a></span> <br><span style='font-family:"Calibri",sans-serif'>>> Subject: [PATCH] Add support for Fritzbox 4040</span> <br><span style='font-family:"Calibri",sans-serif'>>></span> <br><span style='font-family:"Calibri",sans-serif'>>> Add a new target ipq40xx</span> <br><span style='font-family:"Calibri",sans-serif'>>> We need the following patches to use VLANs</span> <br><span style='font-family:"Calibri",sans-serif'>>> <a href="https://github.com/chunkeey/LEDE-">https://github.com/chunkeey/LEDE-</a></span> <br><span style='font-family:"Calibri",sans-serif'>>> IPQ40XX/commit/465fd7c8e131ec49563d8d7e0502fb5e13dc2124</span> <br><span style='font-family:"Calibri",sans-serif'>>> <a href="https://github.com/chunkeey/LEDE-">https://github.com/chunkeey/LEDE-</a></span> <br><span style='font-family:"Calibri",sans-serif'>>> IPQ40XX/commit/f28a3fbebe976414aa62650c25f2298e58d3c306</span> <br><span style='font-family:"Calibri",sans-serif'>> </span><br><span style='font-family:"Calibri",sans-serif'>> das kann OpenWRT nicht selber?</span> <o:p></o:p></p><p><span style='font-family:"Calibri",sans-serif'>nein, OpenWRT erzeugt ein eth0 (war glaub ich alle 4 gelben Ports,</span> <br><span style='font-family:"Calibri",sans-serif'>konnte man nicht auftrennen) und eth1 (war glaub ich WAN vllt. auch</span> <br><span style='font-family:"Calibri",sans-serif'>genau andersrum, da bin ich mir eben unsicher). VLANs sind mit dem</span> <br><span style='font-family:"Calibri",sans-serif'>ipq40xx target ohne diesen Treiber nicht möglich (hab ich getestet, ging</span> <br><span style='font-family:"Calibri",sans-serif'>wirklich nicht). Dieser Treiber führt dann ganz normal VLANs (wie man es</span> <br><span style='font-family:"Calibri",sans-serif'>vom ar71xx target kennt) ein so das OpenWRT sein normales eth0.1</span> <br><span style='font-family:"Calibri",sans-serif'>(Client) und eth0.2 (WAN) erzeugt und auch unser configurenetwork ganz</span> <br><span style='font-family:"Calibri",sans-serif'>normal mit klar kommt und das eth0.3 (Batman) erzeugen kann.</span> <o:p></o:p></p><p><span style='font-family:"Calibri",sans-serif'>mfg</span> <o:p></o:p></p><p><span style='font-family:"Calibri",sans-serif'>Christian</span> <o:p></o:p></p><p style='margin-bottom:0cm;margin-bottom:.0001pt'><span style='font-family:"Calibri",sans-serif'>> </span><br><span style='font-family:"Calibri",sans-serif'>> Grüße</span> <br><span style='font-family:"Calibri",sans-serif'>> </span><br><span style='font-family:"Calibri",sans-serif'>> Adrian</span> <br><span style='font-family:"Calibri",sans-serif'>> </span><br><span style='font-family:"Calibri",sans-serif'>>></span> <br><span style='font-family:"Calibri",sans-serif'>>> Signed-off-by: Christian Dresel <<a href="mailto:fff@chrisi01.de">fff@chrisi01.de</a>></span> <br><span style='font-family:"Calibri",sans-serif'>>> ---</span> <br><span style='font-family:"Calibri",sans-serif'>>>  bsp/ipq40xx.bsp                                    |    6 +</span> <br><span style='font-family:"Calibri",sans-serif'>>>  bsp/ipq40xx/.config                                |   22 +</span> <br><span style='font-family:"Calibri",sans-serif'>>>  .../0006-ipq40xx-ipqess-ethernet-driver.patch      | 2178</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++++++++++++++++++++</span> <br><span style='font-family:"Calibri",sans-serif'>>>  .../openwrt/0007-ipqess-integration.patch          |  207 ++</span> <br><span style='font-family:"Calibri",sans-serif'>>>  .../openwrt/0008-Enable-QinQ-on-the-switch.patch   |  106 +</span> <br><span style='font-family:"Calibri",sans-serif'>>>  build_patches/openwrt/0009-enable-IPQ_ESS.patch    |   23 +</span> <br><span style='font-family:"Calibri",sans-serif'>>>  buildscript                                        |    6 +-</span> <br><span style='font-family:"Calibri",sans-serif'>>>  .../files/etc/uci-defaults/50-fff-boardname        |    3 +</span> <br><span style='font-family:"Calibri",sans-serif'>>>  .../fff-network/ipq40xx/network.avm_fritzbox-4040  |    8 +</span> <br><span style='font-family:"Calibri",sans-serif'>>>  .../fff/fff-sysupgrade/files/etc/sysupgrade.sh     |    3 +</span> <br><span style='font-family:"Calibri",sans-serif'>>>  10 files changed, 2559 insertions(+), 3 deletions(-)</span> <br><span style='font-family:"Calibri",sans-serif'>>>  create mode 100644 bsp/ipq40xx.bsp</span> <br><span style='font-family:"Calibri",sans-serif'>>>  create mode 100644 bsp/ipq40xx/.config</span> <br><span style='font-family:"Calibri",sans-serif'>>>  create mode 100644 build_patches/openwrt/0006-ipq40xx-ipqess-ethernet-</span> <br><span style='font-family:"Calibri",sans-serif'>>> driver.patch</span> <br><span style='font-family:"Calibri",sans-serif'>>>  create mode 100644 build_patches/openwrt/0007-ipqess-integration.patch</span> <br><span style='font-family:"Calibri",sans-serif'>>>  create mode 100644 build_patches/openwrt/0008-Enable-QinQ-on-the-</span> <br><span style='font-family:"Calibri",sans-serif'>>> switch.patch</span> <br><span style='font-family:"Calibri",sans-serif'>>>  create mode 100644 build_patches/openwrt/0009-enable-IPQ_ESS.patch</span> <br><span style='font-family:"Calibri",sans-serif'>>>  create mode 100644 src/packages/fff/fff-</span> <br><span style='font-family:"Calibri",sans-serif'>>> network/ipq40xx/network.avm_fritzbox-4040</span> <br><span style='font-family:"Calibri",sans-serif'>>></span> <br><span style='font-family:"Calibri",sans-serif'>>> diff --git a/bsp/ipq40xx.bsp b/bsp/ipq40xx.bsp</span> <br><span style='font-family:"Calibri",sans-serif'>>> new file mode 100644</span> <br><span style='font-family:"Calibri",sans-serif'>>> index 0000000..eac5759</span> <br><span style='font-family:"Calibri",sans-serif'>>> --- /dev/null</span> <br><span style='font-family:"Calibri",sans-serif'>>> +++ b/bsp/ipq40xx.bsp</span> <br><span style='font-family:"Calibri",sans-serif'>>> @@ -0,0 +1,6 @@</span> <br><span style='font-family:"Calibri",sans-serif'>>> +machine=ipq40xx</span> <br><span style='font-family:"Calibri",sans-serif'>>> +chipset=ipq40xx</span> <br><span style='font-family:"Calibri",sans-serif'>>> +subtarget=generic</span> <br><span style='font-family:"Calibri",sans-serif'>>> +target=$builddir/$machine</span> <br><span style='font-family:"Calibri",sans-serif'>>> +images=("openwrt-${chipset}-avm_fritzbox-4040-squashfs-sysupgrade.bin"</span> <br><span style='font-family:"Calibri",sans-serif'>>> +        )</span> <br><span style='font-family:"Calibri",sans-serif'>>> diff --git a/bsp/ipq40xx/.config b/bsp/ipq40xx/.config</span> <br><span style='font-family:"Calibri",sans-serif'>>> new file mode 100644</span> <br><span style='font-family:"Calibri",sans-serif'>>> index 0000000..b923e3d</span> <br><span style='font-family:"Calibri",sans-serif'>>> --- /dev/null</span> <br><span style='font-family:"Calibri",sans-serif'>>> +++ b/bsp/ipq40xx/.config</span> <br><span style='font-family:"Calibri",sans-serif'>>> @@ -0,0 +1,22 @@</span> <br><span style='font-family:"Calibri",sans-serif'>>> +# Generated using "./buildscript config openwrt".</span> <br><span style='font-family:"Calibri",sans-serif'>>> +# Do no edit manually</span> <br><span style='font-family:"Calibri",sans-serif'>>> +#</span> <br><span style='font-family:"Calibri",sans-serif'>>> +CONFIG_TARGET_ipq40xx=y</span> <br><span style='font-family:"Calibri",sans-serif'>>> +CONFIG_TARGET_MULTI_PROFILE=y</span> <br><span style='font-family:"Calibri",sans-serif'>>> +CONFIG_TARGET_DEVICE_ipq40xx_DEVICE_avm_fritzbox-4040=y</span> <br><span style='font-family:"Calibri",sans-serif'>>> +CONFIG_TARGET_DEVICE_ipq40xx_DEVICE_avm_fritzbox-4040=y</span> <br><span style='font-family:"Calibri",sans-serif'>>> +CONFIG_BUSYBOX_CUSTOM=y</span> <br><span style='font-family:"Calibri",sans-serif'>>> +# CONFIG_TARGET_ipq806x_DEVICE_compex_wpq864 is not set</span> <br><span style='font-family:"Calibri",sans-serif'>>> +# CONFIG_TARGET_ipq806x_DEVICE_linksys_ea8500 is not set</span> <br><span style='font-family:"Calibri",sans-serif'>>> +# CONFIG_TARGET_ipq806x_DEVICE_nec_wg2600hp is not set</span> <br><span style='font-family:"Calibri",sans-serif'>>> +# CONFIG_TARGET_ipq806x_DEVICE_netgear_d7800 is not set</span> <br><span style='font-family:"Calibri",sans-serif'>>> +# CONFIG_TARGET_ipq806x_DEVICE_netgear_r7500 is not set</span> <br><span style='font-family:"Calibri",sans-serif'>>> +# CONFIG_TARGET_ipq806x_DEVICE_netgear_r7500v2 is not set</span> <br><span style='font-family:"Calibri",sans-serif'>>> +# CONFIG_TARGET_ipq806x_DEVICE_netgear_r7800 is not set</span> <br><span style='font-family:"Calibri",sans-serif'>>> +# CONFIG_TARGET_ipq806x_DEVICE_qcom_ipq8064-ap148 is not set</span> <br><span style='font-family:"Calibri",sans-serif'>>> +# CONFIG_TARGET_ipq806x_DEVICE_qcom_ipq8064-ap148-legacy is not set</span> <br><span style='font-family:"Calibri",sans-serif'>>> +# CONFIG_TARGET_ipq806x_DEVICE_qcom_ipq8064-db149 is not set</span> <br><span style='font-family:"Calibri",sans-serif'>>> +# CONFIG_TARGET_ipq806x_DEVICE_tplink_c2600 is not set</span> <br><span style='font-family:"Calibri",sans-serif'>>> +# CONFIG_TARGET_ipq806x_DEVICE_tplink_vr2600v is not set</span> <br><span style='font-family:"Calibri",sans-serif'>>> +# CONFIG_TARGET_ipq806x_DEVICE_zyxel_nbg6817 is not set</span> <br><span style='font-family:"Calibri",sans-serif'>>> +# CONFIG_TARGET_ipq806x_Default is not set</span> <br><span style='font-family:"Calibri",sans-serif'>>> \ No newline at end of file</span> <br><span style='font-family:"Calibri",sans-serif'>>> diff --git a/build_patches/openwrt/0006-ipq40xx-ipqess-ethernet-driver.patch</span> <br><span style='font-family:"Calibri",sans-serif'>>> b/build_patches/openwrt/0006-ipq40xx-ipqess-ethernet-driver.patch</span> <br><span style='font-family:"Calibri",sans-serif'>>> new file mode 100644</span> <br><span style='font-family:"Calibri",sans-serif'>>> index 0000000..41a0f66</span> <br><span style='font-family:"Calibri",sans-serif'>>> --- /dev/null</span> <br><span style='font-family:"Calibri",sans-serif'>>> +++ b/build_patches/openwrt/0006-ipq40xx-ipqess-ethernet-driver.patch</span> <br><span style='font-family:"Calibri",sans-serif'>>> @@ -0,0 +1,2178 @@</span> <br><span style='font-family:"Calibri",sans-serif'>>> +From 465fd7c8e131ec49563d8d7e0502fb5e13dc2124 Mon Sep 17 00:00:00 2001</span> <br><span style='font-family:"Calibri",sans-serif'>>> +From: John Crispin <<a href="mailto:john@phrozen.org">john@phrozen.org</a>></span> <br><span style='font-family:"Calibri",sans-serif'>>> +Date: Sun, 18 Nov 2018 20:30:48 +0100</span> <br><span style='font-family:"Calibri",sans-serif'>>> +Subject: [PATCH 1/2] ipq40xx: ipqess ethernet driver</span> <br><span style='font-family:"Calibri",sans-serif'>>> +</span> <br><span style='font-family:"Calibri",sans-serif'>>> +modified John Crispin's essedma replacement driver.</span> <br><span style='font-family:"Calibri",sans-serif'>>> +</span> <br><span style='font-family:"Calibri",sans-serif'>>> +Fouled-up-by: Christian Lamparter <<a href="mailto:chunkeey@gmail.com">chunkeey@gmail.com</a>></span> <br><span style='font-family:"Calibri",sans-serif'>>> +---</span> <br><span style='font-family:"Calibri",sans-serif'>>> + .../drivers/net/ethernet/qualcomm/ipqess.c         | 1206</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++++++++++++++++++++</span> <br><span style='font-family:"Calibri",sans-serif'>>> + .../drivers/net/ethernet/qualcomm/ipqess.h         |  568 +++++++++</span> <br><span style='font-family:"Calibri",sans-serif'>>> + .../drivers/net/ethernet/qualcomm/ipqess_ethtool.c |  191 ++++</span> <br><span style='font-family:"Calibri",sans-serif'>>> + .../linux/ipq40xx/patches-4.14/999-0-ipqess.patch  |  167 +++</span> <br><span style='font-family:"Calibri",sans-serif'>>> + 4 files changed, 2132 insertions(+)</span> <br><span style='font-family:"Calibri",sans-serif'>>> + create mode 100644 target/linux/ipq40xx/files-</span> <br><span style='font-family:"Calibri",sans-serif'>>> 4.14/drivers/net/ethernet/qualcomm/ipqess.c</span> <br><span style='font-family:"Calibri",sans-serif'>>> + create mode 100644 target/linux/ipq40xx/files-</span> <br><span style='font-family:"Calibri",sans-serif'>>> 4.14/drivers/net/ethernet/qualcomm/ipqess.h</span> <br><span style='font-family:"Calibri",sans-serif'>>> + create mode 100644 target/linux/ipq40xx/files-</span> <br><span style='font-family:"Calibri",sans-serif'>>> 4.14/drivers/net/ethernet/qualcomm/ipqess_ethtool.c</span> <br><span style='font-family:"Calibri",sans-serif'>>> + create mode 100644 target/linux/ipq40xx/patches-4.14/999-0-ipqess.patch</span> <br><span style='font-family:"Calibri",sans-serif'>>> +</span> <br><span style='font-family:"Calibri",sans-serif'>>> +diff --git a/target/linux/ipq40xx/files-</span> <br><span style='font-family:"Calibri",sans-serif'>>> 4.14/drivers/net/ethernet/qualcomm/ipqess.c b/target/linux/ipq40xx/files-</span> <br><span style='font-family:"Calibri",sans-serif'>>> 4.14/drivers/net/ethernet/qualcomm/ipqess.c</span> <br><span style='font-family:"Calibri",sans-serif'>>> +new file mode 100644</span> <br><span style='font-family:"Calibri",sans-serif'>>> +index 0000000000..affe403fea</span> <br><span style='font-family:"Calibri",sans-serif'>>> +--- /dev/null</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++++ b/target/linux/ipq40xx/files-</span> <br><span style='font-family:"Calibri",sans-serif'>>> 4.14/drivers/net/ethernet/qualcomm/ipqess.c</span> <br><span style='font-family:"Calibri",sans-serif'>>> +@@ -0,0 +1,1206 @@</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++/*</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++ * Copyright (c) 2014 - 2017, The Linux Foundation. All rights reserved.</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++ *</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++ * Permission to use, copy, modify, and/or distribute this software for</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++ * any purpose with or without fee is hereby granted, provided that the</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++ * above copyright notice and this permission notice appear in all copies.</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL</span> <br><span style='font-family:"Calibri",sans-serif'>>> WARRANTIES</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES</span> <br><span style='font-family:"Calibri",sans-serif'>>> OF</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE</span> <br><span style='font-family:"Calibri",sans-serif'>>> LIABLE FOR</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY</span> <br><span style='font-family:"Calibri",sans-serif'>>> DAMAGES</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,</span> <br><span style='font-family:"Calibri",sans-serif'>>> WHETHER IN AN</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,</span> <br><span style='font-family:"Calibri",sans-serif'>>> ARISING OUT</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++ * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS</span> <br><span style='font-family:"Calibri",sans-serif'>>> SOFTWARE.</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++ */</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#include <linux/if_vlan.h></span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#include <linux/interrupt.h></span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#include <linux/module.h></span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#include <linux/of.h></span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#include <linux/of_net.h></span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#include <linux/of_mdio.h></span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#include <linux/of_device.h></span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#include <linux/platform_device.h></span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#include <linux/phy.h></span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#include <linux/skbuff.h></span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#include <linux/vmalloc.h></span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#include <net/checksum.h></span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#include <net/ip6_checksum.h></span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#include "ipqess.h"</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#define IPQESS_RRD_SIZE            16</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#define IPQESS_NEXT_IDX(X, Y)  (((X) + 1) & ((Y) - 1))</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#define IPQESS_TX_DMA_BUF_LEN      0x3fff</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++static void ipqess_w32(struct ipqess *ess, u32 reg, u32 val)</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++{</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   __raw_writel(val, ess->hw_addr + reg);</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++}</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++static u32 ipqess_r32(struct ipqess *ess, u16 reg)</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++{</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   return __raw_readl(ess->hw_addr + reg);</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++}</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++static void ipqess_m32(struct ipqess *ess, u32 mask, u32 val, u16 reg)</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++{</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   u32 _val = ipqess_r32(ess, reg);</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   _val &= ~mask;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   _val |= val;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   ipqess_w32(ess, reg, _val);</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++}</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++static int ipqess_tx_ring_alloc(struct ipqess *ess)</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++{</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   int i;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   for (i = 0; i < IPQESS_NETDEV_QUEUES; i++) {</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++           u16 idx;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++           ess->tx_ring[i].ess = ess;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++           ess->tx_ring[i].idx = i * 4;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++           ess->tx_ring[i].count = IPQESS_TX_RING_SIZE;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++           ess->tx_ring[i].nq = netdev_get_tx_queue(ess->netdev, i);</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++           ess->tx_ring[i].buf = devm_kzalloc(&ess->pdev->dev,</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++                   sizeof(struct ipqess_buf) * IPQESS_TX_RING_SIZE,</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++                   GFP_KERNEL);</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++           if (!ess->tx_ring[i].buf) {</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++                   netdev_err(ess->netdev, "buffer alloc of tx ring failed");</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++                   return -ENOMEM;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++           }</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++           ess->tx_ring[i].hw_desc = dmam_alloc_coherent(&ess->pdev-</span> <br><span style='font-family:"Calibri",sans-serif'>>>> dev,</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++                   sizeof(struct ipqess_tx_desc) * IPQESS_TX_RING_SIZE,</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++                   &ess->tx_ring[i].dma, GFP_KERNEL);</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++           if (!ess->tx_ring[i].hw_desc) {</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++                   netdev_err(ess->netdev, "descriptor allocation for tx</span> <br><span style='font-family:"Calibri",sans-serif'>>> ring failed");</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++                   return -ENOMEM;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++           }</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++           ipqess_w32(ess, IPQESS_REG_TPD_BASE_ADDR_Q(ess-</span> <br><span style='font-family:"Calibri",sans-serif'>>>> tx_ring[i].idx),</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++                    (u32)ess->tx_ring[i].dma);</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++           idx = ipqess_r32(ess, IPQESS_REG_TPD_IDX_Q(ess-</span> <br><span style='font-family:"Calibri",sans-serif'>>>> tx_ring[i].idx));</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++           idx >>= IPQESS_TPD_CONS_IDX_SHIFT;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++           idx &= 0xffff;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++           ess->tx_ring[i].head = ess->tx_ring[i].tail = idx;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++           ipqess_m32(ess, IPQESS_TPD_PROD_IDX_MASK <<</span> <br><span style='font-family:"Calibri",sans-serif'>>> IPQESS_TPD_PROD_IDX_SHIFT,</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++                    idx, IPQESS_REG_TPD_IDX_Q(ess->tx_ring[i].idx));</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++           ipqess_w32(ess, IPQESS_REG_TX_SW_CONS_IDX_Q(ess-</span> <br><span style='font-family:"Calibri",sans-serif'>>>> tx_ring[i].idx), idx);</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++           ipqess_w32(ess, IPQESS_REG_TPD_RING_SIZE,</span> <br><span style='font-family:"Calibri",sans-serif'>>> IPQESS_TX_RING_SIZE);</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   }</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   ipqess_m32(ess, 0, BIT(IPQESS_LOAD_PTR_SHIFT),</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++            IPQESS_REG_TX_SRAM_PART);</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   return 0;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++}</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++static int ipqess_tx_unmap_and_free(struct device *dev, struct ipqess_buf</span> <br><span style='font-family:"Calibri",sans-serif'>>> *buf)</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++{</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   int len = 0;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   if (buf->flags & IPQESS_DESC_SINGLE)</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++           dma_unmap_single(dev, buf->dma, buf->length,</span> <br><span style='font-family:"Calibri",sans-serif'>>> DMA_TO_DEVICE);</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   else if (buf->flags & IPQESS_DESC_PAGE)</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++           dma_unmap_page(dev, buf->dma, buf->length,</span> <br><span style='font-family:"Calibri",sans-serif'>>> DMA_TO_DEVICE);</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   if (buf->flags & IPQESS_DESC_LAST) {</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++           len = buf->skb->len;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++           dev_kfree_skb_any(buf->skb);</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   }</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   buf->flags = 0;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   return len;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++}</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++static void ipqess_tx_ring_free(struct ipqess *ess)</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++{</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   int i;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   for (i = 0; i < IPQESS_NETDEV_QUEUES; i++) {</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++           int j;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++           if (ess->tx_ring[i].hw_desc)</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++                   continue;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++           for (j = 0; j < IPQESS_TX_RING_SIZE; j++) {</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++                   struct ipqess_buf *buf = &ess->tx_ring[i].buf[j];</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++                   ipqess_tx_unmap_and_free(&ess->pdev->dev, buf);</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++           }</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++           ess->tx_ring[i].buf = NULL;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   }</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++}</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++static int ipqess_rx_buf_prepare(struct ipqess_buf *buf,</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   struct ipqess_rx_ring *rx_ring)</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++{</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   buf->dma = dma_map_single(&rx_ring->ess->pdev->dev, buf->skb-</span> <br><span style='font-family:"Calibri",sans-serif'>>>> data,</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++                             IPQESS_RX_HEAD_BUFF_SIZE,</span> <br><span style='font-family:"Calibri",sans-serif'>>> DMA_FROM_DEVICE);</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   if (dma_mapping_error(&rx_ring->ess->pdev->dev, buf->dma)) {</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++           WARN_ONCE(0, "IPQESS DMA mapping failed for linear address</span> <br><span style='font-family:"Calibri",sans-serif'>>> %x", buf->dma);</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++           dev_kfree_skb_any(buf->skb);</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++           buf->skb = NULL;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++           /* TODO: which return code */</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++           return -EINVAL;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   }</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   buf->length = IPQESS_RX_HEAD_BUFF_SIZE;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   rx_ring->hw_desc[rx_ring->head] = (void *)buf->dma;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   rx_ring->head = (rx_ring->head + 1) % IPQESS_RX_RING_SIZE;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   ipqess_m32(rx_ring->ess, IPQESS_RFD_PROD_IDX_BITS,</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++            (rx_ring->head + IPQESS_RX_RING_SIZE - 1) %</span> <br><span style='font-family:"Calibri",sans-serif'>>> IPQESS_RX_RING_SIZE,</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++            IPQESS_REG_RFD_IDX_Q(rx_ring->idx));</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   return 0;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++}</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++static int ipqess_rx_buf_alloc_napi(struct ipqess_rx_ring *rx_ring)</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++{</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   struct ipqess_buf *buf = &rx_ring->buf[rx_ring->head];</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   buf->skb = napi_alloc_skb(&rx_ring->napi_rx,</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++           IPQESS_RX_HEAD_BUFF_SIZE);</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   if (!buf->skb)</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++           return -ENOMEM;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   return ipqess_rx_buf_prepare(buf, rx_ring);</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++}</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++static int ipqess_rx_buf_alloc(struct ipqess_rx_ring *rx_ring)</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++{</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   struct ipqess_buf *buf = &rx_ring->buf[rx_ring->head];</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   buf->skb = netdev_alloc_skb_ip_align(rx_ring->ess->netdev,</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++           IPQESS_RX_HEAD_BUFF_SIZE);</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   if (!buf->skb)</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++           return -ENOMEM;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   return ipqess_rx_buf_prepare(buf, rx_ring);</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++}</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++static void ipqess_refill_work(struct work_struct *work)</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++{</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   struct ipqess_rx_ring *rx_ring = container_of(work,</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++           struct ipqess_rx_ring, refill_work);</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   int refill = 0;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   /* don't let this loop by accident. */</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   while (atomic_dec_and_test(&rx_ring->refill_count)) {</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++           if (ipqess_rx_buf_alloc(rx_ring)) {</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++                   refill++;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++                   dev_dbg(&rx_ring->ess->pdev->dev,</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++                           "Not all buffers was reallocated");</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++           }</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   }</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   if (refill || atomic_read(&rx_ring->refill_count)) {</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++           atomic_add(refill, &rx_ring->refill_count);</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++           schedule_work(&rx_ring->refill_work);</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   }</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++}</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++static int ipqess_rx_ring_alloc(struct ipqess *ess)</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++{</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   int i;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   for (i = 0; i < IPQESS_NETDEV_QUEUES; i++) {</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++           int j;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++           ess->rx_ring[i].ess = ess;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++           ess->rx_ring[i].idx = i;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++           ess->rx_ring[i].buf = devm_kzalloc(&ess->pdev->dev,</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++                   sizeof(struct ipqess_buf) * IPQESS_RX_RING_SIZE,</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++                   GFP_KERNEL);</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++           if (!ess->rx_ring[i].buf)</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++                   return -ENOMEM;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++           ess->rx_ring[i].hw_desc = dmam_alloc_coherent(&ess->pdev-</span> <br><span style='font-family:"Calibri",sans-serif'>>>> dev,</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++                   sizeof(struct ipqess_rx_desc) * IPQESS_RX_RING_SIZE,</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++                   &ess->rx_ring[i].dma, GFP_KERNEL);</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++           if (!ess->rx_ring[i].hw_desc)</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++                   return -ENOMEM;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++           for (j = 0; j < IPQESS_RX_RING_SIZE; j++)</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++                   if (ipqess_rx_buf_alloc(&ess->rx_ring[i]) < 0)</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++                           return -ENOMEM;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++           INIT_WORK(&ess->rx_ring[i].refill_work, ipqess_refill_work);</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++           ipqess_w32(ess, IPQESS_REG_RFD_BASE_ADDR_Q(i),</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++                    (u32)(ess->rx_ring[i].dma));</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   }</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   ipqess_w32(ess, IPQESS_REG_RX_DESC0,</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++            (IPQESS_RX_HEAD_BUFF_SIZE << IPQESS_RX_BUF_SIZE_SHIFT)</span> <br><span style='font-family:"Calibri",sans-serif'>>> |</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++            (IPQESS_RX_RING_SIZE << IPQESS_RFD_RING_SIZE_SHIFT));</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   return 0;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++}</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++static void ipqess_rx_ring_free(struct ipqess *ess)</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++{</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   int i;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   for (i = 0, i = 0; i < IPQESS_NETDEV_QUEUES; i++) {</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++           int j;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++           for (j = 0; j < IPQESS_RX_RING_SIZE; j++) {</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++                   dma_unmap_single(&ess->pdev->dev,</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++                                    ess->rx_ring[i].buf[j].dma,</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++                                    ess->rx_ring[i].buf[j].length,</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++                                    DMA_FROM_DEVICE);</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++                   dev_kfree_skb_any(ess->rx_ring[i].buf[j].skb);</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++           }</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++           atomic_set(&ess->rx_ring[i].refill_count, 0);</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++           cancel_work_sync(&ess->rx_ring[i].refill_work);</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   }</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++}</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++static struct net_device_stats *ipqess_get_stats(struct net_device *netdev)</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++{</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   struct ipqess *ess = netdev_priv(netdev);</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   uint32_t *p;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   int i;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   u32 stat;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   spin_lock(&ess->stats_lock);</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   p = (uint32_t *)&(ess->ipqessstats);</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   for (i = 0; i < IPQESS_MAX_TX_QUEUE; i++) {</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++           stat = ipqess_r32(ess, IPQESS_REG_TX_STAT_PKT_Q(i));</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++           *p += stat;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++           p++;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   }</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   for (i = 0; i < IPQESS_MAX_TX_QUEUE; i++) {</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++           stat = ipqess_r32(ess, IPQESS_REG_TX_STAT_BYTE_Q(i));</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++           *p += stat;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++           p++;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   }</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   for (i = 0; i < IPQESS_MAX_RX_QUEUE; i++) {</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++           stat = ipqess_r32(ess, IPQESS_REG_RX_STAT_PKT_Q(i));</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++           *p += stat;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++           p++;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   }</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   for (i = 0; i < IPQESS_MAX_RX_QUEUE; i++) {</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++           stat = ipqess_r32(ess, IPQESS_REG_RX_STAT_BYTE_Q(i));</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++           *p += stat;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++           p++;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   }</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   spin_unlock(&ess->stats_lock);</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   return &ess->stats;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++}</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++static void ipqess_adjust_link(struct net_device *netdev)</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++{</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   if (netdev->phydev->link)</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++           netif_carrier_on(netdev);</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   else</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++           netif_carrier_off(netdev);</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++}</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++static int ipqess_phy_connect_node(struct ipqess *ess,</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++                            struct device_node *phy_node)</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++{</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   struct phy_device *phydev;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   int phy_mode;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   phy_mode = of_get_phy_mode(phy_node);</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   if (phy_mode < 0) {</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++           dev_err(&ess->netdev->dev, "incorrect phy-mode %d\n",</span> <br><span style='font-family:"Calibri",sans-serif'>>> phy_mode);</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++           return -EINVAL;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   }</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   phydev = of_phy_connect(ess->netdev, phy_node,</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++                           ipqess_adjust_link, 0, phy_mode);</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   if (!phydev) {</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++           dev_err(&ess->netdev->dev, "could not connect to PHY\n");</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++           return -ENODEV;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   }</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   dev_info(&ess->netdev->dev,</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++            "connected to PHY at %s [uid=%08x, driver=%s]\n",</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++            phydev_name(phydev), phydev->phy_id,</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++            phydev->drv->name);</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   return 0;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++}</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++static int ipqess_phy_connect(struct net_device *netdev)</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++{</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   struct ipqess *ess = netdev_priv(netdev);</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   struct device_node *np;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   np = of_parse_phandle(ess->of_node, "phy-handle", 0);</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   if (!np && of_phy_is_fixed_link(ess->of_node))</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++           if (!of_phy_register_fixed_link(ess->of_node))</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++                   np = of_node_get(ess->of_node);</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   if (!np)</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++           return -ENODEV;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   switch (of_get_phy_mode(np)) {</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   case PHY_INTERFACE_MODE_SGMII:</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++           break;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   default:</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++           goto err_phy;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   }</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   if (ipqess_phy_connect_node(ess, np))</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++           goto err_phy;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   netdev->phydev->autoneg = AUTONEG_ENABLE;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   netdev->phydev->speed = 0;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   netdev->phydev->duplex = 0;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   if (of_phy_is_fixed_link(ess->of_node))</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++           netdev->phydev->supported |=</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++                   SUPPORTED_Pause | SUPPORTED_Asym_Pause;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   netdev->phydev->supported &= PHY_GBIT_FEATURES |</span> <br><span style='font-family:"Calibri",sans-serif'>>> SUPPORTED_Pause |</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++                   SUPPORTED_Asym_Pause;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   netdev->phydev->advertising = netdev->phydev->supported |</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++           ADVERTISED_Autoneg;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   phy_start_aneg(netdev->phydev);</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   of_node_put(np);</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   return 0;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++err_phy:</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   if (of_phy_is_fixed_link(ess->of_node))</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++           of_phy_deregister_fixed_link(ess->of_node);</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   of_node_put(np);</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   dev_err(&netdev->dev, "%s: invalid phy\n", __func__);</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   return -EINVAL;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++}</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++static int ipqess_rx_poll(struct ipqess_rx_ring *rx_ring, int budget)</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++{</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   u32 length = 0, num_desc, tail;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   int done = 0;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   tail = ipqess_r32(rx_ring->ess, IPQESS_REG_RFD_IDX_Q(rx_ring->idx));</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   tail >>= IPQESS_RFD_CONS_IDX_SHIFT;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   tail &= IPQESS_RFD_CONS_IDX_MASK;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   while (done < budget) {</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++           struct sk_buff *skb;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++           struct ipqess_rx_desc *rd;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++           if (rx_ring->tail == tail)</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++                   break;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++           skb = rx_ring->buf[rx_ring->tail].skb;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++           dma_unmap_single(&rx_ring->ess->pdev->dev,</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++                            rx_ring->buf[rx_ring->tail].dma,</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++                            rx_ring->buf[rx_ring->tail].length,</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++                            DMA_FROM_DEVICE);</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++           rd = (struct ipqess_rx_desc *)skb->data;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++           num_desc = rd->rrd1 & IPQESS_RRD_NUM_RFD_MASK;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++           length = rd->rrd6 & IPQESS_RRD_PKT_SIZE_MASK;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++           rx_ring->tail = IPQESS_NEXT_IDX(rx_ring->tail,</span> <br><span style='font-family:"Calibri",sans-serif'>>> IPQESS_RX_RING_SIZE);</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++           skb_reserve(skb, IPQESS_RRD_SIZE);</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++           if (num_desc > 1) {</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++                   /* can we use build_skb here ? */</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++                   struct sk_buff *skb_prev = NULL;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++                   int size_remaining;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++                   int i;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++                   skb->data_len = 0;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++                   skb->tail += (IPQESS_RX_HEAD_BUFF_SIZE -</span> <br><span style='font-family:"Calibri",sans-serif'>>> IPQESS_RRD_SIZE);</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++                   skb->len = skb->truesize = length;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++                   size_remaining = length - (IPQESS_RX_HEAD_BUFF_SIZE</span> <br><span style='font-family:"Calibri",sans-serif'>>> - IPQESS_RRD_SIZE);</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++                   for (i = 1; i < num_desc; i++) {</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++                           /* TODO: use build_skb ? */</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++                           struct sk_buff *skb_temp = rx_ring-</span> <br><span style='font-family:"Calibri",sans-serif'>>>> buf[rx_ring->tail].skb;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++                           dma_unmap_single(&rx_ring->ess->pdev->dev,</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++                                            rx_ring->buf[rx_ring->tail].dma,</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++                                            rx_ring->buf[rx_ring-</span> <br><span style='font-family:"Calibri",sans-serif'>>>> tail].length,</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++                                            DMA_FROM_DEVICE);</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++                           skb_put(skb_temp, min(size_remaining,</span> <br><span style='font-family:"Calibri",sans-serif'>>> IPQESS_RX_HEAD_BUFF_SIZE));</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++                           if (skb_prev)</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++                                   skb_prev->next = rx_ring->buf[rx_ring-</span> <br><span style='font-family:"Calibri",sans-serif'>>>> tail].skb;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++                           else</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++                                   skb_shinfo(skb)->frag_list = rx_ring-</span> <br><span style='font-family:"Calibri",sans-serif'>>>> buf[rx_ring->tail].skb;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++                           skb_prev = rx_ring->buf[rx_ring->tail].skb;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++                           rx_ring->buf[rx_ring->tail].skb->next = NULL;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++                           skb->data_len += rx_ring->buf[rx_ring->tail].skb-</span> <br><span style='font-family:"Calibri",sans-serif'>>>> len;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++                           size_remaining -= rx_ring->buf[rx_ring-</span> <br><span style='font-family:"Calibri",sans-serif'>>>> tail].skb->len;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++                           rx_ring->tail = IPQESS_NEXT_IDX(rx_ring->tail,</span> <br><span style='font-family:"Calibri",sans-serif'>>> IPQESS_RX_RING_SIZE);</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++                   }</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++           } else {</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++                   skb_put(skb, length);</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++           }</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++           skb->dev = rx_ring->ess->netdev;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++           skb->protocol = eth_type_trans(skb, rx_ring->ess->netdev);</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++           skb_record_rx_queue(skb, rx_ring->idx);</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++           if (rd->rrd6 & IPQESS_RRD_CSUM_FAIL_MASK)</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++                   skb_checksum_none_assert(skb);</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++           else</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++                   skb->ip_summed = CHECKSUM_UNNECESSARY;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++           if (rd->rrd7 & IPQESS_RRD_CVLAN) {</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++                   __vlan_hwaccel_put_tag(skb, htons(ETH_P_8021Q), rd-</span> <br><span style='font-family:"Calibri",sans-serif'>>>> rrd4);</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++           } else if (rd->rrd1 & IPQESS_RRD_SVLAN) {</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++                   __vlan_hwaccel_put_tag(skb, htons(ETH_P_8021AD),</span> <br><span style='font-family:"Calibri",sans-serif'>>> rd->rrd4);</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++           }</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++           napi_gro_receive(&rx_ring->napi_rx, skb);</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++           /* TODO: do we need to have these here ? */</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++           rx_ring->ess->stats.rx_packets++;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++           rx_ring->ess->stats.rx_bytes += length;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++           done++;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++           while (num_desc) {</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++                   if (ipqess_rx_buf_alloc_napi(rx_ring)) {</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++                           schedule_work(&rx_ring->refill_work);</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++                           atomic_add(num_desc, &rx_ring->refill_count);</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++                           break;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++                   }</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++                   num_desc--;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++           }</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   }</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   ipqess_w32(rx_ring->ess, IPQESS_REG_RX_SW_CONS_IDX_Q(rx_ring-</span> <br><span style='font-family:"Calibri",sans-serif'>>>> idx),</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++            rx_ring->tail);</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   return done;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++}</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++static int ipqess_tx_complete(struct ipqess_tx_ring *tx_ring, int budget)</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++{</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   u32 tail;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   int done = 0;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   int total = 0, ret;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   tail = ipqess_r32(tx_ring->ess, IPQESS_REG_TPD_IDX_Q(tx_ring->idx));</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   tail >>= IPQESS_TPD_CONS_IDX_SHIFT;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   tail &= IPQESS_TPD_CONS_IDX_MASK;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   while ((tx_ring->tail != tail) && (done < budget)) {</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++           //pr_info("freeing txq:%d tail:%d tailbuf:%p\n", tx_ring->idx,</span> <br><span style='font-family:"Calibri",sans-serif'>>> tx_ring->tail, &tx_ring->buf[tx_ring->tail]);</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++           ret = ipqess_tx_unmap_and_free(&tx_ring->ess->pdev->dev,</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++                                  &tx_ring->buf[tx_ring->tail]);</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++           tx_ring->tail = IPQESS_NEXT_IDX(tx_ring->tail, tx_ring->count);</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++           if (ret) {</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++                   total += ret;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++                   done++;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++           }</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   }</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   ipqess_w32(tx_ring->ess,</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++            IPQESS_REG_TX_SW_CONS_IDX_Q(tx_ring->idx),</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++            tx_ring->tail);</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   if (netif_tx_queue_stopped(tx_ring->nq)) {</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++           printk("S %d\n", tx_ring->idx);</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++           netif_tx_wake_queue(tx_ring->nq);</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   }</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   netdev_tx_completed_queue(tx_ring->nq, done, total);</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   return done;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++}</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++static int ipqess_tx_napi(struct napi_struct *napi, int budget)</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++{</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   struct ipqess_tx_ring *tx_ring = container_of(napi, struct</span> <br><span style='font-family:"Calibri",sans-serif'>>> ipqess_tx_ring,</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++                                               napi_tx);</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   u32 reg_data;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   u32 shadow_tx_status;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   int work_done = 0;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   struct queue *queue = &tx_ring->ess->queue[tx_ring->idx / 4];</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   reg_data = ipqess_r32(tx_ring->ess, IPQESS_REG_TX_ISR);</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   queue->tx_status |= reg_data & BIT(tx_ring->idx);</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   shadow_tx_status = queue->tx_status;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   work_done = ipqess_tx_complete(tx_ring, budget);</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   ipqess_w32(tx_ring->ess, IPQESS_REG_TX_ISR, shadow_tx_status);</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   if (likely(work_done < budget)) {</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++           napi_complete(napi);</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++           ipqess_w32(tx_ring->ess,</span> <br><span style='font-family:"Calibri",sans-serif'>>> IPQESS_REG_TX_INT_MASK_Q(tx_ring->idx), 0x1);</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   }</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   return work_done;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++}</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++static int ipqess_rx_napi(struct napi_struct *napi, int budget)</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++{</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   struct ipqess_rx_ring *rx_ring = container_of(napi, struct</span> <br><span style='font-family:"Calibri",sans-serif'>>> ipqess_rx_ring,</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++                                               napi_rx);</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   struct ipqess *ess = rx_ring->ess;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   int remain_budget = budget;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   int rx_done;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   u32 rx_mask = BIT(rx_ring->idx << IPQESS_RX_PER_CPU_MASK_SHIFT);</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   u32 status;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++poll_again:</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   ipqess_w32(ess, IPQESS_REG_RX_ISR, rx_mask);</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   rx_done = ipqess_rx_poll(rx_ring, remain_budget);</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   if (rx_done == remain_budget)</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++           return budget;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   status = ipqess_r32(ess, IPQESS_REG_RX_ISR);</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   if (status & rx_mask) {</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++           remain_budget -= rx_done;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++           goto poll_again;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   }</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   napi_complete(napi);</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   ipqess_w32(ess, IPQESS_REG_RX_INT_MASK_Q(rx_ring->idx), 0x1);</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   return rx_done + budget - remain_budget;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++}</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++static irqreturn_t ipqess_interrupt_tx(int irq, void *priv)</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++{</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   struct ipqess_tx_ring *tx_ring = (struct ipqess_tx_ring *) priv;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   if (likely(napi_schedule_prep(&tx_ring->napi_tx))) {</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++           __napi_schedule(&tx_ring->napi_tx);</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++           ipqess_w32(tx_ring->ess,</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++                    IPQESS_REG_TX_INT_MASK_Q(tx_ring->idx),</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++                    0x0);</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   }</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   return IRQ_HANDLED;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++}</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++static irqreturn_t ipqess_interrupt_rx(int irq, void *priv)</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++{</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   struct ipqess_rx_ring *rx_ring = (struct ipqess_rx_ring *) priv;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   if (likely(napi_schedule_prep(&rx_ring->napi_rx))) {</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++           __napi_schedule(&rx_ring->napi_rx);</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++           ipqess_w32(rx_ring->ess,</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++                    IPQESS_REG_RX_INT_MASK_Q(rx_ring->idx),</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++                    0x0);</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   }</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   return IRQ_HANDLED;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++}</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++static void ipqess_irq_enable(struct ipqess *ess)</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++{</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   int i;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   ipqess_w32(ess, IPQESS_REG_RX_ISR, 0xff);</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   ipqess_w32(ess, IPQESS_REG_TX_ISR, 0xffff);</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   for (i = 0; i < IPQESS_NETDEV_QUEUES; i++) {</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++           ipqess_w32(ess, IPQESS_REG_RX_INT_MASK_Q(i), 1);</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++           ipqess_w32(ess, IPQESS_REG_TX_INT_MASK_Q(i), 1);</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   }</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++}</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++static void ipqess_irq_disable(struct ipqess *ess)</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++{</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   int i;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   for (i = 0; i < IPQESS_NETDEV_QUEUES; i++) {</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++           ipqess_w32(ess, IPQESS_REG_RX_INT_MASK_Q(i), 0);</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++           ipqess_w32(ess, IPQESS_REG_TX_INT_MASK_Q(i), 0);</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   }</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++}</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++static int __init ipqess_init(struct net_device *netdev)</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++{</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   struct ipqess *ess = netdev_priv(netdev);</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   const char *mac_addr;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   mac_addr = of_get_mac_address(ess->of_node);</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   if (mac_addr)</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++           ether_addr_copy(netdev->dev_addr, mac_addr);</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   if (!is_valid_ether_addr(netdev->dev_addr)) {</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++           random_ether_addr(netdev->dev_addr);</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++           dev_err(&netdev->dev, "generated random MAC address</span> <br><span style='font-family:"Calibri",sans-serif'>>> %pM\n",</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++                   netdev->dev_addr);</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++           netdev->addr_assign_type = NET_ADDR_RANDOM;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   }</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   return ipqess_phy_connect(netdev);</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++}</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++static void ipqess_uninit(struct net_device *netdev)</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++{</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   struct ipqess *ess = netdev_priv(netdev);</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   phy_disconnect(netdev->phydev);</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   if (of_phy_is_fixed_link(ess->of_node))</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++           of_phy_deregister_fixed_link(ess->of_node);</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++}</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++static int ipqess_open(struct net_device *netdev)</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++{</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   struct ipqess *ess = netdev_priv(netdev);</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   int i;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   for (i = 0; i < IPQESS_NETDEV_QUEUES; i++) {</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++           napi_enable(&ess->tx_ring[i].napi_tx);</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++           napi_enable(&ess->rx_ring[i].napi_rx);</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   }</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   ipqess_irq_enable(ess);</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   phy_start(ess->netdev->phydev);</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   netif_tx_start_all_queues(netdev);</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   return 0;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++}</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++static int ipqess_stop(struct net_device *netdev)</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++{</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   struct ipqess *ess = netdev_priv(netdev);</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   int i;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   netif_tx_stop_all_queues(netdev);</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   phy_stop(netdev->phydev);</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   ipqess_irq_disable(ess);</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   for (i = 0; i < IPQESS_NETDEV_QUEUES; i++) {</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++           napi_disable(&ess->tx_ring[i].napi_tx);</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++           napi_disable(&ess->rx_ring[i].napi_rx);</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   }</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   return 0;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++}</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++static int ipqess_do_ioctl(struct net_device *netdev, struct ifreq *ifr, int cmd)</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++{</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   switch (cmd) {</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   case SIOCGMIIPHY:</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   case SIOCGMIIREG:</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   case SIOCSMIIREG:</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++           return phy_mii_ioctl(netdev->phydev, ifr, cmd);</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   default:</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++           break;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   }</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   return -EOPNOTSUPP;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++}</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++static inline u16 ipqess_tx_desc_available(struct ipqess_tx_ring *tx_ring)</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++{</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   u16 count = 0;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   if (tx_ring->tail <= tx_ring->head)</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++           count = IPQESS_TX_RING_SIZE;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   count += tx_ring->tail - tx_ring->head - 1;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   return count;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++}</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++static inline int ipqess_cal_txd_req(struct sk_buff *skb)</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++{</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   int i, nfrags;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   struct skb_frag_struct *frag;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   nfrags = 1;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   if (skb_is_gso(skb)) {</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++           for (i = 0; i < skb_shinfo(skb)->nr_frags; i++) {</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++                   frag = &skb_shinfo(skb)->frags[i];</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++                   nfrags += DIV_ROUND_UP(frag->size,</span> <br><span style='font-family:"Calibri",sans-serif'>>> IPQESS_TX_DMA_BUF_LEN);</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++           }</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   } else {</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++           nfrags += skb_shinfo(skb)->nr_frags;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   }</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   return nfrags; // DIV_ROUND_UP(nfrags, 2);</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++}</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++static struct ipqess_buf *ipqess_get_tx_buffer(struct ipqess_tx_ring</span> <br><span style='font-family:"Calibri",sans-serif'>>> *tx_ring,</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++                                          struct ipqess_tx_desc *desc)</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++{</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   return &tx_ring->buf[desc - (struct ipqess_tx_desc *)tx_ring-</span> <br><span style='font-family:"Calibri",sans-serif'>>>> hw_desc];</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++}</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++static struct ipqess_tx_desc *ipqess_tx_desc_next(struct ipqess_tx_ring</span> <br><span style='font-family:"Calibri",sans-serif'>>> *tx_ring)</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++{</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   struct ipqess_tx_desc *desc;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   desc = (&((struct ipqess_tx_desc *)(tx_ring->hw_desc))[tx_ring-</span> <br><span style='font-family:"Calibri",sans-serif'>>>> head]);</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   tx_ring->head = IPQESS_NEXT_IDX(tx_ring->head, tx_ring->count);</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   return desc;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++}</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++static void ipqess_rollback_tx(struct ipqess *eth,</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++                       struct ipqess_tx_desc *first_desc, int queue_id)</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++{</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   struct ipqess_tx_ring *tx_ring = &eth->tx_ring[queue_id / 4];</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   struct ipqess_buf *buf;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   struct ipqess_tx_desc *desc = NULL;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   u16 start_index, index;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   start_index = first_desc - (struct ipqess_tx_desc *)(tx_ring->hw_desc);</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   index = start_index;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   while (index != tx_ring->head) {</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++           desc = (&((struct ipqess_tx_desc *)(tx_ring->hw_desc))[index]);</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++           buf = &tx_ring->buf[index];</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++           ipqess_tx_unmap_and_free(&eth->pdev->dev, buf);</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++           memset(desc, 0, sizeof(struct ipqess_tx_desc));</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++           if (++index == tx_ring->count)</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++                   index = 0;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   }</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   tx_ring->head = start_index;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++}</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++static int ipqess_tx_map_and_fill(struct ipqess_tx_ring *tx_ring, struct</span> <br><span style='font-family:"Calibri",sans-serif'>>> sk_buff *skb)</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++{</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   struct ipqess_buf *buf = NULL;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   struct platform_device *pdev = tx_ring->ess->pdev;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   struct ipqess_tx_desc *desc = NULL, *first_desc = NULL;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   u32 word1 = 0, word3 = 0, lso_word1 = 0, svlan_tag = 0;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   u16 len, lso_len = 0;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   int i = 0;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   if (skb_is_gso(skb)) {</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++           if (skb_shinfo(skb)->gso_type & SKB_GSO_TCPV4) {</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++                   lso_word1 |= IPQESS_TPD_IPV4_EN;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++                   ip_hdr(skb)->check = 0;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++                   tcp_hdr(skb)->check =</span> <br><span style='font-family:"Calibri",sans-serif'>>> ~csum_tcpudp_magic(ip_hdr(skb)->saddr,</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++                           ip_hdr(skb)->daddr, 0, IPPROTO_TCP, 0);</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++           } else if (skb_shinfo(skb)->gso_type & SKB_GSO_TCPV6) {</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++                   lso_word1 |= IPQESS_TPD_LSO_V2_EN;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++                   ipv6_hdr(skb)->payload_len = 0;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++                   tcp_hdr(skb)->check =</span> <br><span style='font-family:"Calibri",sans-serif'>>> ~csum_ipv6_magic(&ipv6_hdr(skb)->saddr,</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++                           &ipv6_hdr(skb)->daddr, 0, IPPROTO_TCP, 0);</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++           }</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++           lso_word1 |= IPQESS_TPD_LSO_EN |</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++                        ((skb_shinfo(skb)->gso_size &</span> <br><span style='font-family:"Calibri",sans-serif'>>> IPQESS_TPD_MSS_MASK) << IPQESS_TPD_MSS_SHIFT) |</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++                        (skb_transport_offset(skb) <<</span> <br><span style='font-family:"Calibri",sans-serif'>>> IPQESS_TPD_HDR_SHIFT);</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   } else if (likely(skb->ip_summed == CHECKSUM_PARTIAL)) {</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++                   u8 css, cso;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++                   cso = skb_checksum_start_offset(skb);</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++                   css = cso + skb->csum_offset;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++                   word1 |= (IPQESS_TPD_CUSTOM_CSUM_EN);</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++                   word1 |= (cso >> 1) << IPQESS_TPD_HDR_SHIFT;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++                   word1 |= ((css >> 1) <<</span> <br><span style='font-family:"Calibri",sans-serif'>>> IPQESS_TPD_CUSTOM_CSUM_SHIFT);</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   }</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   if (skb_vlan_tag_present(skb)) {</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++           switch (skb->vlan_proto) {</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++           case htons(ETH_P_8021Q):</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++                   word3 |= BIT(IPQESS_TX_INS_CVLAN);</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++                   word3 |= skb_vlan_tag_get(skb) <<</span> <br><span style='font-family:"Calibri",sans-serif'>>> IPQESS_TX_CVLAN_TAG_SHIFT;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++                   break;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++           case htons(ETH_P_8021AD):</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++                   word1 |= BIT(IPQESS_TX_INS_SVLAN);</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++                   svlan_tag = skb_vlan_tag_get(skb) <<</span> <br><span style='font-family:"Calibri",sans-serif'>>> IPQESS_TX_SVLAN_TAG_SHIFT;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++                   break;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++           default:</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++                   dev_err(&pdev->dev, "no ctag or stag present\n");</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++                   goto vlan_tag_error;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++           }</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   }</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++        if (skb->protocol == htons(ETH_P_PPP_SES))</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++                word1 |= IPQESS_TPD_PPPOE_EN;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   word3 |= 0x3e << IPQESS_TPD_PORT_BITMAP_SHIFT;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   len = skb_headlen(skb);</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   first_desc = desc = ipqess_tx_desc_next(tx_ring);</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   if (lso_word1 & IPQESS_TPD_LSO_V2_EN) {</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++           desc->addr = cpu_to_le16(skb->len);</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++           desc->word1 = word1 | lso_word1;</span> <o:p></o:p></p><p style='margin:0cm;margin-bottom:.0001pt'><span style='font-family:"Calibri",sans-serif'>>> ++           desc->svlan_tag = svlan_tag;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++           desc->word3 = word3;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++           desc = ipqess_tx_desc_next(tx_ring);</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   }</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   buf = ipqess_get_tx_buffer(tx_ring, desc);</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   if (lso_word1)</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++           buf->length = lso_len;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   else</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++           buf->length = len;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   buf->dma = dma_map_single(&pdev->dev,</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++                           skb->data, len, DMA_TO_DEVICE);</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   if (dma_mapping_error(&pdev->dev, buf->dma))</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++           goto dma_error;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   desc->addr = cpu_to_le32(buf->dma);</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   desc->len  = cpu_to_le16(len);</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   buf->flags |= IPQESS_DESC_SINGLE;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   desc->word1 = word1 | lso_word1;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   desc->svlan_tag = svlan_tag;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   desc->word3 = word3;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   while (i < skb_shinfo(skb)->nr_frags) {</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++           skb_frag_t *frag = &skb_shinfo(skb)->frags[i];</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++           len = skb_frag_size(frag);</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++           desc = ipqess_tx_desc_next(tx_ring);</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++           buf = ipqess_get_tx_buffer(tx_ring, desc);</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++           buf->length = len;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++           buf->flags |= IPQESS_DESC_PAGE;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++           buf->dma = skb_frag_dma_map(&pdev->dev, frag, 0, len,</span> <br><span style='font-family:"Calibri",sans-serif'>>> DMA_TO_DEVICE);</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++           if (dma_mapping_error(NULL, buf->dma))</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++                   goto dma_error;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++           desc->addr = cpu_to_le32(buf->dma);</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++           desc->len  = cpu_to_le16(len);</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++           desc->svlan_tag = svlan_tag;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++           desc->word1 = word1 | lso_word1;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++           desc->word3 = word3;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++           i++;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   }</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   desc->word1 |= 1 << IPQESS_TPD_EOP_SHIFT;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   buf->skb = skb;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   buf->flags |= IPQESS_DESC_LAST;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   return 0;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++dma_error:</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   ipqess_rollback_tx(tx_ring->ess, first_desc, tx_ring->idx);</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   dev_err(&pdev->dev, "TX DMA map failed\n");</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++vlan_tag_error:</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   return -ENOMEM;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++}</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++static netdev_tx_t ipqess_xmit(struct sk_buff *skb,</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++                        struct net_device *netdev)</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++{</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   struct ipqess *ess = netdev_priv(netdev);</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   struct ipqess_tx_ring *tx_ring;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   int tx_num;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   int ret;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   tx_ring = &ess->tx_ring[skb_get_queue_mapping(skb)];</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   tx_num = ipqess_cal_txd_req(skb);</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   if (ipqess_tx_desc_available(tx_ring) <= tx_num) {</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++           printk("s %d %x\n", tx_ring->idx, ipqess_r32(tx_ring->ess,</span> <br><span style='font-family:"Calibri",sans-serif'>>> IPQESS_REG_TX_INT_MASK_Q(tx_ring->idx)));</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++           netif_tx_stop_queue(tx_ring->nq);</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++           ipqess_w32(tx_ring->ess,</span> <br><span style='font-family:"Calibri",sans-serif'>>> IPQESS_REG_TX_INT_MASK_Q(tx_ring->idx), 0x1);</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++           return NETDEV_TX_BUSY;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   }</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   ret = ipqess_tx_map_and_fill(tx_ring, skb);</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   if (ret) {</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++           dev_kfree_skb_any(skb);</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++           ess->stats.tx_errors++;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++           goto err_out;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   }</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   ess->stats.tx_packets++;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   ess->stats.tx_bytes += skb->len;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   netdev_tx_sent_queue(tx_ring->nq, skb->len);</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   if (!skb->xmit_more || netif_xmit_stopped(tx_ring->nq))</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++           ipqess_m32(ess,</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++                    IPQESS_TPD_PROD_IDX_BITS,</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++                    tx_ring->head,</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++                    IPQESS_REG_TPD_IDX_Q(tx_ring->idx));</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++err_out:</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   return NETDEV_TX_OK;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++}</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++static int ipqess_set_mac_address(struct net_device *netdev, void *p)</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++{</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   int ret = eth_mac_addr(netdev, p);</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   struct ipqess *ess = netdev_priv(netdev);</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   const char *macaddr = netdev->dev_addr;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   if (ret)</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++           return ret;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++// spin_lock_bh(&mac->hw->page_lock);</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   ipqess_w32(ess, IPQESS_REG_MAC_CTRL1,</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++            (macaddr[0] << 8) | macaddr[1]);</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   ipqess_w32(ess, IPQESS_REG_MAC_CTRL0,</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++            (macaddr[2] << 24) | (macaddr[3] << 16) |</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++            (macaddr[4] << 8) | macaddr[5]);</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++// spin_unlock_bh(&mac->hw->page_lock);</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   return 0;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++}</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++static const struct net_device_ops ipqess_axi_netdev_ops = {</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   .ndo_init               = ipqess_init,</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   .ndo_uninit             = ipqess_uninit,</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   .ndo_open               = ipqess_open,</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   .ndo_stop               = ipqess_stop,</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   .ndo_do_ioctl           = ipqess_do_ioctl,</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   .ndo_start_xmit         = ipqess_xmit,</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   .ndo_get_stats          = ipqess_get_stats,</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   .ndo_set_mac_address    = ipqess_set_mac_address,</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++};</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++static void ipqess_reset(struct ipqess *ess)</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++{</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   int i;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   /* disable all IRQs */</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   for (i = 0; i < IPQESS_NETDEV_QUEUES; i++) {</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++           ipqess_w32(ess, IPQESS_REG_RX_INT_MASK_Q(i), 0x0);</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++           ipqess_w32(ess, IPQESS_REG_TX_INT_MASK_Q(i), 0x0);</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   }</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   ipqess_w32(ess, IPQESS_REG_MISC_IMR, 0);</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   ipqess_w32(ess, IPQESS_REG_WOL_IMR, 0);</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   /* clear the IRQ status registers */</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   ipqess_w32(ess, IPQESS_REG_RX_ISR, 0xff);</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   ipqess_w32(ess, IPQESS_REG_TX_ISR, 0xffff);</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   ipqess_w32(ess, IPQESS_REG_MISC_ISR, 0x1fff);</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   ipqess_w32(ess, IPQESS_REG_WOL_ISR, 0x1);</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   ipqess_w32(ess, IPQESS_REG_WOL_CTRL, 0);</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   /* disable RX and TX queues */</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   ipqess_m32(ess, IPQESS_RXQ_CTRL_EN, 0, IPQESS_REG_RXQ_CTRL);</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   ipqess_m32(ess, IPQESS_TXQ_CTRL_TXQ_EN, 0,</span> <br><span style='font-family:"Calibri",sans-serif'>>> IPQESS_REG_TXQ_CTRL);</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++}</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++static int ipqess_hw_init(struct ipqess *ess)</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++{</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   int i, err;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   ipqess_reset(ess);</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   ipqess_m32(ess, BIT(IPQESS_INTR_SW_IDX_W_TYP_SHIFT),</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++            IPQESS_INTR_SW_IDX_W_TYPE <<</span> <br><span style='font-family:"Calibri",sans-serif'>>> IPQESS_INTR_SW_IDX_W_TYP_SHIFT,</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++            IPQESS_REG_INTR_CTRL);</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   ipqess_w32(ess, IPQESS_REG_RX_ISR, 0xff);</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   ipqess_w32(ess, IPQESS_REG_TX_ISR, 0xffff);</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   /* enable IRQ delay slot */</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   ipqess_w32(ess, IPQESS_REG_IRQ_MODRT_TIMER_INIT,</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++            (IPQESS_TX_IMT << IPQESS_IRQ_MODRT_TX_TIMER_SHIFT) |</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++            (IPQESS_RX_IMT << IPQESS_IRQ_MODRT_RX_TIMER_SHIFT));</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   /* Configure the TX Queue bursting */</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   ipqess_w32(ess, IPQESS_REG_TXQ_CTRL,</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++            (IPQESS_TPD_BURST <<</span> <br><span style='font-family:"Calibri",sans-serif'>>> IPQESS_TXQ_NUM_TPD_BURST_SHIFT) |</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++            (IPQESS_TXF_BURST << IPQESS_TXQ_TXF_BURST_NUM_SHIFT)</span> <br><span style='font-family:"Calibri",sans-serif'>>> |</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++            IPQESS_TXQ_CTRL_TPD_BURST_EN);</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   /* Set RSS type */</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   ipqess_w32(ess, IPQESS_REG_RSS_TYPE,</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++            IPQESS_RSS_TYPE_IPV4TCP | IPQESS_RSS_TYPE_IPV6_TCP |</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++            IPQESS_RSS_TYPE_IPV4_UDP | IPQESS_RSS_TYPE_IPV6UDP |</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++            IPQESS_RSS_TYPE_IPV4 | IPQESS_RSS_TYPE_IPV6);</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   /* Set RFD ring burst and threshold */</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   ipqess_w32(ess, IPQESS_REG_RX_DESC1,</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++           (IPQESS_RFD_BURST << IPQESS_RXQ_RFD_BURST_NUM_SHIFT)</span> <br><span style='font-family:"Calibri",sans-serif'>>> |</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++           (IPQESS_RFD_THR << IPQESS_RXQ_RFD_PF_THRESH_SHIFT) |</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++           (IPQESS_RFD_LTHR <<</span> <br><span style='font-family:"Calibri",sans-serif'>>> IPQESS_RXQ_RFD_LOW_THRESH_SHIFT));</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   /* Set Rx FIFO</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++    * - threshold to start to DMA data to host</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++    * - remove vlan bit</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++    */</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   ipqess_w32(ess, IPQESS_REG_RXQ_CTRL,</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++            IPQESS_FIFO_THRESH_128_BYTE |</span> <br><span style='font-family:"Calibri",sans-serif'>>> IPQESS_RXQ_CTRL_RMV_VLAN);</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   err = ipqess_rx_ring_alloc(ess);</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   if (err)</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++           return err;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   err = ipqess_tx_ring_alloc(ess);</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   if (err)</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++           return err;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   /* Disable TX FIFO low watermark and high watermark */</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   ipqess_w32(ess, IPQESS_REG_TXF_WATER_MARK, 0);</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   /* Configure RSS indirection table.</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++    * 128 hash will be configured in the following</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++    * pattern: hash{0,1,2,3} = {Q0,Q2,Q4,Q6} respectively</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++    * and so on</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++    */</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   for (i = 0; i < IPQESS_NUM_IDT; i++)</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++           ipqess_w32(ess, IPQESS_REG_RSS_IDT(i),</span> <br><span style='font-family:"Calibri",sans-serif'>>> IPQESS_RSS_IDT_VALUE);</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   /* Configure load balance mapping table.</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++    * 4 table entry will be configured according to the</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++    * following pattern: load_balance{0,1,2,3} = {Q0,Q1,Q3,Q4}</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++    * respectively.</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++    */</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   ipqess_w32(ess, IPQESS_REG_LB_RING, IPQESS_LB_REG_VALUE);</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   /* Configure Virtual queue for Tx rings</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++    * User can also change this value runtime through</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++    * a sysctl</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++    */</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   ipqess_w32(ess, IPQESS_REG_VQ_CTRL0, IPQESS_VQ_REG_VALUE);</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   ipqess_w32(ess, IPQESS_REG_VQ_CTRL1, IPQESS_VQ_REG_VALUE);</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   /* Configure Max AXI Burst write size to 128 bytes*/</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   ipqess_w32(ess, IPQESS_REG_AXIW_CTRL_MAXWRSIZE,</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++            IPQESS_AXIW_MAXWRSIZE_VALUE);</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   /* Enable All 16 tx and 8 rx irq mask */</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   ipqess_m32(ess, 0, IPQESS_TXQ_CTRL_TXQ_EN,</span> <br><span style='font-family:"Calibri",sans-serif'>>> IPQESS_REG_TXQ_CTRL);</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   ipqess_m32(ess, 0, IPQESS_RXQ_CTRL_EN, IPQESS_REG_RXQ_CTRL);</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   return 0;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++}</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++static void ipqess_cleanup(struct ipqess *ess)</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++{</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   ipqess_reset(ess);</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   unregister_netdev(ess->netdev);</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   ipqess_tx_ring_free(ess);</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   ipqess_rx_ring_free(ess);</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   free_netdev(ess->netdev);</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++}</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++static int ipqess_axi_probe(struct platform_device *pdev)</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++{</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   struct ipqess *ess;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   struct net_device *netdev;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   struct resource *res;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   int i, err = 0;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   netdev = alloc_etherdev_mqs(sizeof(struct ipqess),</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++                               IPQESS_NETDEV_QUEUES,</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++                               IPQESS_NETDEV_QUEUES);</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   if (!netdev)</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++           return -ENODEV;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   ess = netdev_priv(netdev);</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   memset(ess, 0, sizeof(struct ipqess));</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   ess->netdev = netdev;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   ess->pdev = pdev;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   ess->of_node = pdev->dev.of_node;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   spin_lock_init(&ess->stats_lock);</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   SET_NETDEV_DEV(netdev, &pdev->dev);</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   platform_set_drvdata(pdev, netdev);</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   res = platform_get_resource(pdev, IORESOURCE_MEM, 0);</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   ess->hw_addr = devm_ioremap_resource(&pdev->dev, res);</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   if (IS_ERR(ess->hw_addr)) {</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++           err = PTR_ERR(ess->hw_addr);</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++           goto err_out;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   }</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   for (i = 0; i < IPQESS_MAX_TX_QUEUE; i++)</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++           ess->tx_irq[i] = platform_get_irq(pdev, i);</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   for (i = 0; i < IPQESS_MAX_RX_QUEUE; i++)</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++           ess->rx_irq[i] = platform_get_irq(pdev, i +</span> <br><span style='font-family:"Calibri",sans-serif'>>> IPQESS_MAX_TX_QUEUE);</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   netdev->netdev_ops = &ipqess_axi_netdev_ops;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   netdev->features = NETIF_F_HW_CSUM | NETIF_F_RXCSUM |</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++                      NETIF_F_HW_VLAN_CTAG_RX |</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++                      NETIF_F_HW_VLAN_CTAG_TX |</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++                      NETIF_F_TSO | NETIF_F_TSO6 |</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++                      NETIF_F_GRO | NETIF_F_SG;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   netdev->hw_features = NETIF_F_HW_CSUM | NETIF_F_RXCSUM |</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++                         NETIF_F_HW_VLAN_CTAG_RX |</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++                         NETIF_F_HW_VLAN_CTAG_TX | NETIF_F_SG |</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++                         NETIF_F_TSO | NETIF_F_TSO6 |</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++                         NETIF_F_GRO;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   netdev->vlan_features = NETIF_F_HW_CSUM | NETIF_F_SG |</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++                           NETIF_F_TSO | NETIF_F_TSO6 |</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++                           NETIF_F_GRO;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   netdev->wanted_features = NETIF_F_HW_CSUM | NETIF_F_SG |</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++                             NETIF_F_TSO | NETIF_F_TSO6 |</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++                             NETIF_F_GRO;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   netdev->watchdog_timeo = 5 * HZ;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   netdev->base_addr = (u32) ess->hw_addr;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   netdev->max_mtu = 9000;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   netdev->gso_max_segs = IPQESS_TX_RING_SIZE / 2;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   ipqess_set_ethtool_ops(netdev);</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   err = register_netdev(netdev);</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   if (err)</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++           goto err_out;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   err = ipqess_hw_init(ess);</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   if (err)</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++           goto err_out;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   for (i = 0; i < IPQESS_NETDEV_QUEUES; i++) {</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++           netif_napi_add(netdev,</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++                          &ess->tx_ring[i].napi_tx,</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++                          ipqess_tx_napi, 64);</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++           netif_napi_add(netdev,</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++                          &ess->rx_ring[i].napi_rx,</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++                          ipqess_rx_napi, 64);</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++           ess->queue[i].ess = ess;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++           ess->queue[i].idx = i;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++           err = devm_request_irq(&ess->netdev->dev,</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++                   ess->tx_irq[i << IPQESS_TX_CPU_START_SHIFT],</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++                   ipqess_interrupt_tx, 0, "ipqess TX", &ess->tx_ring[i]);</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++           if (err)</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++                   goto err_out;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++           err = devm_request_irq(&ess->netdev->dev,</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++                   ess->rx_irq[i << IPQESS_RX_CPU_START_SHIFT],</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++                   ipqess_interrupt_rx, 0, "ipqess RX", &ess->rx_ring[i]);</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++           if (err)</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++                   goto err_out;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   }</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   return 0;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++err_out:</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   ipqess_cleanup(ess);</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   return err;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++}</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++static int ipqess_axi_remove(struct platform_device *pdev)</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++{</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   const struct net_device *netdev = platform_get_drvdata(pdev);</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   struct ipqess *ess = netdev_priv(netdev);</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   ipqess_cleanup(ess);</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   return 0;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++}</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++static const struct of_device_id ipqess_of_mtable[] = {</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   {.compatible = "qcom,ess-edma" },</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   {}</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++};</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++MODULE_DEVICE_TABLE(of, ipqess_of_mtable);</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++static struct platform_driver ipqess_axi_driver = {</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   .driver = {</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++           .name    = "ess-edma",</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++           .of_match_table = ipqess_of_mtable,</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   },</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   .probe    = ipqess_axi_probe,</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   .remove   = ipqess_axi_remove,</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++};</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++module_platform_driver(ipqess_axi_driver);</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++MODULE_AUTHOR("Qualcomm Atheros Inc");</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++MODULE_AUTHOR("John Crispin <<a href="mailto:john@phrozen.org">john@phrozen.org</a>>");</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++MODULE_LICENSE("GPL");</span> <br><span style='font-family:"Calibri",sans-serif'>>> +diff --git a/target/linux/ipq40xx/files-</span> <br><span style='font-family:"Calibri",sans-serif'>>> 4.14/drivers/net/ethernet/qualcomm/ipqess.h b/target/linux/ipq40xx/files-</span> <br><span style='font-family:"Calibri",sans-serif'>>> 4.14/drivers/net/ethernet/qualcomm/ipqess.h</span> <br><span style='font-family:"Calibri",sans-serif'>>> +new file mode 100644</span> <br><span style='font-family:"Calibri",sans-serif'>>> +index 0000000000..a988bbca07</span> <br><span style='font-family:"Calibri",sans-serif'>>> +--- /dev/null</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++++ b/target/linux/ipq40xx/files-</span> <br><span style='font-family:"Calibri",sans-serif'>>> 4.14/drivers/net/ethernet/qualcomm/ipqess.h</span> <br><span style='font-family:"Calibri",sans-serif'>>> +@@ -0,0 +1,568 @@</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++/*</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++ * Copyright (c) 2014 - 2016, The Linux Foundation. All rights reserved.</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++ *</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++ * Permission to use, copy, modify, and/or distribute this software for</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++ * any purpose with or without fee is hereby granted, provided that the</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++ * above copyright notice and this permission notice appear in all copies.</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL</span> <br><span style='font-family:"Calibri",sans-serif'>>> WARRANTIES</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES</span> <br><span style='font-family:"Calibri",sans-serif'>>> OF</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE</span> <br><span style='font-family:"Calibri",sans-serif'>>> LIABLE FOR</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY</span> <br><span style='font-family:"Calibri",sans-serif'>>> DAMAGES</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,</span> <br><span style='font-family:"Calibri",sans-serif'>>> WHETHER IN AN</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,</span> <br><span style='font-family:"Calibri",sans-serif'>>> ARISING OUT</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++ * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS</span> <br><span style='font-family:"Calibri",sans-serif'>>> SOFTWARE.</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++ */</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#ifndef _IPQESS_H_</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#define _IPQESS_H_</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#define IPQESS_CPU_CORES_SUPPORTED 4</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#define IPQESS_MAX_PORTID_SUPPORTED 5</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#define IPQESS_MAX_VLAN_SUPPORTED</span> <br><span style='font-family:"Calibri",sans-serif'>>> IPQESS_MAX_PORTID_SUPPORTED</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#define IPQESS_MAX_PORTID_BITMAP_INDEX</span> <br><span style='font-family:"Calibri",sans-serif'>>> (IPQESS_MAX_PORTID_SUPPORTED + 1)</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#define IPQESS_MAX_PORTID_BITMAP_SUPPORTED 0x1f    /* 0001_1111 =</span> <br><span style='font-family:"Calibri",sans-serif'>>> 0x1f */</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#define IPQESS_MAX_NETDEV_PER_QUEUE 4 /* 3 Netdev per queue, 1</span> <br><span style='font-family:"Calibri",sans-serif'>>> space for indexing */</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#define IPQESS_NETDEV_QUEUES       4</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#define IPQESS_TPD_EOP_SHIFT 31</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#define IPQESS_PORT_ID_SHIFT 12</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#define IPQESS_PORT_ID_MASK 0x7</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++/* tpd word 3 bit 18-28 */</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#define IPQESS_TPD_PORT_BITMAP_SHIFT 18</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#define IPQESS_TPD_FROM_CPU_SHIFT 25</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#define IPQESS_RX_RING_SIZE 128</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#define IPQESS_RX_HEAD_BUFF_SIZE 1540</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#define IPQESS_TX_RING_SIZE 128</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#define IPQESS_MAX_RX_QUEUE 8</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#define IPQESS_MAX_TX_QUEUE 16</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++/* Configurations */</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#define IPQESS_INTR_CLEAR_TYPE 0</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#define IPQESS_INTR_SW_IDX_W_TYPE 0</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#define IPQESS_FIFO_THRESH_TYPE 0</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#define IPQESS_RSS_TYPE 0</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#define IPQESS_RX_IMT 0x0020</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#define IPQESS_TX_IMT 0x0050</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#define IPQESS_TPD_BURST 5</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#define IPQESS_TXF_BURST 0x100</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#define IPQESS_RFD_BURST 8</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#define IPQESS_RFD_THR 16</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#define IPQESS_RFD_LTHR 0</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++/* RX/TX per CPU based mask/shift */</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#define IPQESS_TX_PER_CPU_MASK 0xF</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#define IPQESS_RX_PER_CPU_MASK 0x3</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#define IPQESS_TX_PER_CPU_MASK_SHIFT 0x2</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#define IPQESS_RX_PER_CPU_MASK_SHIFT 0x1</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#define IPQESS_TX_CPU_START_SHIFT 0x2</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#define IPQESS_RX_CPU_START_SHIFT 0x1</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++/* Flags used in transmit direction */</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#define IPQESS_HW_CHECKSUM 0x00000001</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#define IPQESS_VLAN_TX_TAG_INSERT_FLAG 0x00000002</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#define IPQESS_VLAN_TX_TAG_INSERT_DEFAULT_FLAG 0x00000004</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#define IPQESS_DESC_LAST 0x1</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#define IPQESS_DESC_SINGLE 0x2</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#define IPQESS_DESC_PAGE 0x4</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#define IPQESS_DESC_PAGELIST 0x8</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#define IPQESS_DESC_SKB_NONE 0x10</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#define IPQESS_DESC_SKB_REUSE 0x20</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#define IPQESS_MAX_SKB_FRAGS (MAX_SKB_FRAGS + 1)</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++/* Ethtool specific list of IPQESS supported features */</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#define IPQESS_SUPPORTED_FEATURES (SUPPORTED_10baseT_Half \</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++                                   | SUPPORTED_10baseT_Full \</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++                                   | SUPPORTED_100baseT_Half \</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++                                   | SUPPORTED_100baseT_Full \</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++                                   | SUPPORTED_1000baseT_Full)</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++/* Receive side Atheros Header */</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#define IPQESS_RX_ATH_HDR_VERSION 0x2</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#define IPQESS_RX_ATH_HDR_VERSION_SHIFT 14</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#define IPQESS_RX_ATH_HDR_PRIORITY_SHIFT 11</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#define IPQESS_RX_ATH_PORT_TYPE_SHIFT 6</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#define IPQESS_RX_ATH_HDR_RSTP_PORT_TYPE 0x4</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++/* Transmit side Atheros Header */</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#define IPQESS_TX_ATH_HDR_PORT_BITMAP_MASK 0x7F</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#define IPQESS_TX_ATH_HDR_FROM_CPU_MASK 0x80</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#define IPQESS_TX_ATH_HDR_FROM_CPU_SHIFT 7</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#define IPQESS_TXQ_START_CORE0 8</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#define IPQESS_TXQ_START_CORE1 12</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#define IPQESS_TXQ_START_CORE2 0</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#define IPQESS_TXQ_START_CORE3 4</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#define IPQESS_TXQ_IRQ_MASK_CORE0 0x0F00</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#define IPQESS_TXQ_IRQ_MASK_CORE1 0xF000</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#define IPQESS_TXQ_IRQ_MASK_CORE2 0x000F</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#define IPQESS_TXQ_IRQ_MASK_CORE3 0x00F0</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#define IPQESS_ETH_HDR_LEN 12</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#define IPQESS_ETH_TYPE_MASK 0xFFFF</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#define IPQESS_RX_BUFFER_WRITE 16</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#define IPQESS_RFD_AVAIL_THR 80</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#define IPQESS_GMAC_NO_MDIO_PHY    PHY_MAX_ADDR</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++extern int ssdk_rfs_ipct_rule_set(__be32 ip_src, __be32 ip_dst,</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++                             __be16 sport, __be16 dport,</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++                             uint8_t proto, u16 loadbalance, bool action);</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++struct ipqesstool_statistics {</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   u32 tx_q0_pkt;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   u32 tx_q1_pkt;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   u32 tx_q2_pkt;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   u32 tx_q3_pkt;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   u32 tx_q4_pkt;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   u32 tx_q5_pkt;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   u32 tx_q6_pkt;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   u32 tx_q7_pkt;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   u32 tx_q8_pkt;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   u32 tx_q9_pkt;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   u32 tx_q10_pkt;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   u32 tx_q11_pkt;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   u32 tx_q12_pkt;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   u32 tx_q13_pkt;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   u32 tx_q14_pkt;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   u32 tx_q15_pkt;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   u32 tx_q0_byte;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   u32 tx_q1_byte;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   u32 tx_q2_byte;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   u32 tx_q3_byte;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   u32 tx_q4_byte;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   u32 tx_q5_byte;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   u32 tx_q6_byte;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   u32 tx_q7_byte;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   u32 tx_q8_byte;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   u32 tx_q9_byte;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   u32 tx_q10_byte;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   u32 tx_q11_byte;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   u32 tx_q12_byte;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   u32 tx_q13_byte;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   u32 tx_q14_byte;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   u32 tx_q15_byte;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   u32 rx_q0_pkt;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   u32 rx_q1_pkt;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   u32 rx_q2_pkt;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   u32 rx_q3_pkt;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   u32 rx_q4_pkt;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   u32 rx_q5_pkt;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   u32 rx_q6_pkt;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   u32 rx_q7_pkt;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   u32 rx_q0_byte;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   u32 rx_q1_byte;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   u32 rx_q2_byte;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   u32 rx_q3_byte;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   u32 rx_q4_byte;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   u32 rx_q5_byte;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   u32 rx_q6_byte;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   u32 rx_q7_byte;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   u32 tx_desc_error;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++};</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++struct ipqess_tx_desc {</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   __le16  len;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   __le16  svlan_tag;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   __le32  word1;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   __le32  addr;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   __le32  word3;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++};</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++struct ipqess_rx_desc {</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   u16 rrd0;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   u16 rrd1;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   u16 rrd2;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   u16 rrd3;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   u16 rrd4;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   u16 rrd5;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   u16 rrd6;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   u16 rrd7;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++};</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++struct ipqess_buf {</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   struct sk_buff *skb;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   dma_addr_t dma;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   u16 length;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   u32 flags;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++};</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++struct queue {</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   u32 idx;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   u32 tx_mask;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   u32 tx_status;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   u32 tx_start;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   struct ipqess *ess;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++};</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++struct ipqess_tx_ring {</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   u32 idx;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   struct ipqess *ess;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   struct napi_struct napi_tx;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   struct netdev_queue *nq;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   void *hw_desc;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   struct ipqess_buf *buf;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   int netdev_bmp;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   u16 count;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   dma_addr_t dma;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   u16 head;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   u16 tail;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++};</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++struct ipqess_rx_ring {</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   u32 idx;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   struct ipqess *ess;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   struct napi_struct napi_rx;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   void **hw_desc;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   struct ipqess_buf *buf;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   struct work_struct refill_work;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   atomic_t refill_count;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   dma_addr_t dma;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   u16 head;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   u16 tail;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++};</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++struct ipqess {</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   struct net_device *netdev;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   void __iomem *hw_addr;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   struct device_node *of_node;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   struct ipqess_tx_ring tx_ring[IPQESS_NETDEV_QUEUES];</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   struct ipqess_rx_ring rx_ring[IPQESS_NETDEV_QUEUES];</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   struct platform_device *pdev;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   struct ipqesstool_statistics ipqessstats;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   u32 tx_irq[16];</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   u32 rx_irq[8];</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   u32 from_cpu;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   struct queue queue[CONFIG_NR_CPUS];</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   spinlock_t stats_lock;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   struct net_device_stats stats;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   u32 flags;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   unsigned long state_flags;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++};</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++void ipqess_set_ethtool_ops(struct net_device *netdev);</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++/* register definition */</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#define IPQESS_REG_MAS_CTRL 0x0</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#define IPQESS_REG_TIMEOUT_CTRL 0x004</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#define IPQESS_REG_DBG0 0x008</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#define IPQESS_REG_DBG1 0x00C</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#define IPQESS_REG_SW_CTRL0 0x100</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#define IPQESS_REG_SW_CTRL1 0x104</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++/* Interrupt Status Register */</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#define IPQESS_REG_RX_ISR 0x200</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#define IPQESS_REG_TX_ISR 0x208</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#define IPQESS_REG_MISC_ISR 0x210</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#define IPQESS_REG_WOL_ISR 0x218</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#define IPQESS_MISC_ISR_RX_URG_Q(x) (1 << x)</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#define IPQESS_MISC_ISR_AXIR_TIMEOUT 0x00000100</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#define IPQESS_MISC_ISR_AXIR_ERR 0x00000200</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#define IPQESS_MISC_ISR_TXF_DEAD 0x00000400</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#define IPQESS_MISC_ISR_AXIW_ERR 0x00000800</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#define IPQESS_MISC_ISR_AXIW_TIMEOUT 0x00001000</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#define IPQESS_WOL_ISR 0x00000001</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++/* Interrupt Mask Register */</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#define IPQESS_REG_MISC_IMR 0x214</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#define IPQESS_REG_WOL_IMR 0x218</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#define IPQESS_RX_IMR_NORMAL_MASK 0x1</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#define IPQESS_TX_IMR_NORMAL_MASK 0x1</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#define IPQESS_MISC_IMR_NORMAL_MASK 0x80001FFF</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#define IPQESS_WOL_IMR_NORMAL_MASK 0x1</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++/* Edma receive consumer index */</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#define IPQESS_REG_RX_SW_CONS_IDX_Q(x) (0x220 + ((x) << 3)) /* x is the</span> <br><span style='font-family:"Calibri",sans-serif'>>> queue id */</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++/* Edma transmit consumer index */</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#define IPQESS_REG_TX_SW_CONS_IDX_Q(x) (0x240 + ((x) << 2)) /* x is the</span> <br><span style='font-family:"Calibri",sans-serif'>>> queue id */</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++/* IRQ Moderator Initial Timer Register */</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#define IPQESS_REG_IRQ_MODRT_TIMER_INIT 0x280</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#define IPQESS_IRQ_MODRT_TIMER_MASK 0xFFFF</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#define IPQESS_IRQ_MODRT_RX_TIMER_SHIFT 0</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#define IPQESS_IRQ_MODRT_TX_TIMER_SHIFT 16</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++/* Interrupt Control Register */</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#define IPQESS_REG_INTR_CTRL 0x284</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#define IPQESS_INTR_CLR_TYP_SHIFT 0</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#define IPQESS_INTR_SW_IDX_W_TYP_SHIFT 1</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#define IPQESS_INTR_CLEAR_TYPE_W1 0</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#define IPQESS_INTR_CLEAR_TYPE_R 1</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++/* RX Interrupt Mask Register */</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#define IPQESS_REG_RX_INT_MASK_Q(x) (0x300 + ((x) << 3)) /* x = queue id</span> <br><span style='font-family:"Calibri",sans-serif'>>> */</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++/* TX Interrupt mask register */</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#define IPQESS_REG_TX_INT_MASK_Q(x) (0x340 + ((x) << 2)) /* x = queue id</span> <br><span style='font-family:"Calibri",sans-serif'>>> */</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++/* Load Ptr Register</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++ * Software sets this bit after the initialization of the head and tail</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++ */</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#define IPQESS_REG_TX_SRAM_PART 0x400</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#define IPQESS_LOAD_PTR_SHIFT 16</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++/* TXQ Control Register */</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#define IPQESS_REG_TXQ_CTRL 0x404</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#define IPQESS_TXQ_CTRL_IP_OPTION_EN 0x10</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#define IPQESS_TXQ_CTRL_TXQ_EN 0x20</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#define IPQESS_TXQ_CTRL_ENH_MODE 0x40</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#define IPQESS_TXQ_CTRL_LS_8023_EN 0x80</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#define IPQESS_TXQ_CTRL_TPD_BURST_EN 0x100</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#define IPQESS_TXQ_CTRL_LSO_BREAK_EN 0x200</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#define IPQESS_TXQ_NUM_TPD_BURST_MASK 0xF</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#define IPQESS_TXQ_TXF_BURST_NUM_MASK 0xFFFF</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#define IPQESS_TXQ_NUM_TPD_BURST_SHIFT 0</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#define IPQESS_TXQ_TXF_BURST_NUM_SHIFT 16</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#define    IPQESS_REG_TXF_WATER_MARK 0x408 /* In 8-bytes */</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#define IPQESS_TXF_WATER_MARK_MASK 0x0FFF</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#define IPQESS_TXF_LOW_WATER_MARK_SHIFT 0</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#define IPQESS_TXF_HIGH_WATER_MARK_SHIFT 16</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#define IPQESS_TXQ_CTRL_BURST_MODE_EN 0x80000000</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++/* WRR Control Register */</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#define IPQESS_REG_WRR_CTRL_Q0_Q3 0x40c</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#define IPQESS_REG_WRR_CTRL_Q4_Q7 0x410</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#define IPQESS_REG_WRR_CTRL_Q8_Q11 0x414</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#define IPQESS_REG_WRR_CTRL_Q12_Q15 0x418</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++/* Weight round robin(WRR), it takes queue as input, and computes</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++ * starting bits where we need to write the weight for a particular</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++ * queue</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++ */</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#define IPQESS_WRR_SHIFT(x) (((x) * 5) % 20)</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++/* Tx Descriptor Control Register */</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#define IPQESS_REG_TPD_RING_SIZE 0x41C</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#define IPQESS_TPD_RING_SIZE_SHIFT 0</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#define IPQESS_TPD_RING_SIZE_MASK 0xFFFF</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++/* Transmit descriptor base address */</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#define IPQESS_REG_TPD_BASE_ADDR_Q(x) (0x420 + ((x) << 2)) /* x =</span> <br><span style='font-family:"Calibri",sans-serif'>>> queue id */</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++/* TPD Index Register */</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#define IPQESS_REG_TPD_IDX_Q(x) (0x460 + ((x) << 2)) /* x = queue id */</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#define IPQESS_TPD_PROD_IDX_BITS 0x0000FFFF</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#define IPQESS_TPD_CONS_IDX_BITS 0xFFFF0000</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#define IPQESS_TPD_PROD_IDX_MASK 0xFFFF</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#define IPQESS_TPD_CONS_IDX_MASK 0xFFFF</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#define IPQESS_TPD_PROD_IDX_SHIFT 0</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#define IPQESS_TPD_CONS_IDX_SHIFT 16</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++/* TX Virtual Queue Mapping Control Register */</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#define IPQESS_REG_VQ_CTRL0 0x4A0</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#define IPQESS_REG_VQ_CTRL1 0x4A4</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++/* Virtual QID shift, it takes queue as input, and computes</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++ * Virtual QID position in virtual qid control register</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++ */</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#define IPQESS_VQ_ID_SHIFT(i) (((i) * 3) % 24)</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++/* Virtual Queue Default Value */</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#define IPQESS_VQ_REG_VALUE 0x240240</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++/* Tx side Port Interface Control Register */</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#define IPQESS_REG_PORT_CTRL 0x4A8</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#define IPQESS_PAD_EN_SHIFT 15</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++/* Tx side VLAN Configuration Register */</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#define IPQESS_REG_VLAN_CFG 0x4AC</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#define IPQESS_TX_CVLAN 16</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#define IPQESS_TX_INS_CVLAN 17</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#define IPQESS_TX_CVLAN_TAG_SHIFT 0</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#define IPQESS_TX_SVLAN 14</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#define IPQESS_TX_INS_SVLAN 15</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#define IPQESS_TX_SVLAN_TAG_SHIFT 16</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++/* Tx Queue Packet Statistic Register */</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#define IPQESS_REG_TX_STAT_PKT_Q(x) (0x700 + ((x) << 3)) /* x = queue id</span> <br><span style='font-family:"Calibri",sans-serif'>>> */</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#define IPQESS_TX_STAT_PKT_MASK 0xFFFFFF</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++/* Tx Queue Byte Statistic Register */</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#define IPQESS_REG_TX_STAT_BYTE_Q(x) (0x704 + ((x) << 3)) /* x = queue id</span> <br><span style='font-family:"Calibri",sans-serif'>>> */</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++/* Load Balance Based Ring Offset Register */</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#define IPQESS_REG_LB_RING 0x800</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#define IPQESS_LB_RING_ENTRY_MASK 0xff</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#define IPQESS_LB_RING_ID_MASK 0x7</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#define IPQESS_LB_RING_PROFILE_ID_MASK 0x3</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#define IPQESS_LB_RING_ENTRY_BIT_OFFSET 8</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#define IPQESS_LB_RING_ID_OFFSET 0</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#define IPQESS_LB_RING_PROFILE_ID_OFFSET 3</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#define IPQESS_LB_REG_VALUE 0x6040200</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++/* Load Balance Priority Mapping Register */</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#define IPQESS_REG_LB_PRI_START 0x804</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#define IPQESS_REG_LB_PRI_END 0x810</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#define IPQESS_LB_PRI_REG_INC 4</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#define IPQESS_LB_PRI_ENTRY_BIT_OFFSET 4</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#define IPQESS_LB_PRI_ENTRY_MASK 0xf</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++/* RSS Priority Mapping Register */</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#define IPQESS_REG_RSS_PRI 0x820</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#define IPQESS_RSS_PRI_ENTRY_MASK 0xf</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#define IPQESS_RSS_RING_ID_MASK 0x7</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#define IPQESS_RSS_PRI_ENTRY_BIT_OFFSET 4</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++/* RSS Indirection Register */</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#define IPQESS_REG_RSS_IDT(x) (0x840 + ((x) << 2)) /* x = No. of indirection</span> <br><span style='font-family:"Calibri",sans-serif'>>> table */</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#define IPQESS_NUM_IDT 16</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#define IPQESS_RSS_IDT_VALUE 0x64206420</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++/* Default RSS Ring Register */</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#define IPQESS_REG_DEF_RSS 0x890</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#define IPQESS_DEF_RSS_MASK 0x7</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++/* RSS Hash Function Type Register */</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#define IPQESS_REG_RSS_TYPE 0x894</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#define IPQESS_RSS_TYPE_NONE 0x01</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#define IPQESS_RSS_TYPE_IPV4TCP 0x02</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#define IPQESS_RSS_TYPE_IPV6_TCP 0x04</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#define IPQESS_RSS_TYPE_IPV4_UDP 0x08</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#define IPQESS_RSS_TYPE_IPV6UDP 0x10</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#define IPQESS_RSS_TYPE_IPV4 0x20</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#define IPQESS_RSS_TYPE_IPV6 0x40</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#define IPQESS_RSS_HASH_MODE_MASK 0x7f</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#define IPQESS_REG_RSS_HASH_VALUE 0x8C0</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#define IPQESS_REG_RSS_TYPE_RESULT 0x8C4</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#define IPQESS_HASH_TYPE_START 0</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#define IPQESS_HASH_TYPE_END 5</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#define IPQESS_HASH_TYPE_SHIFT 12</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#define IPQESS_RFS_FLOW_ENTRIES 1024</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#define IPQESS_RFS_FLOW_ENTRIES_MASK (IPQESS_RFS_FLOW_ENTRIES -</span> <br><span style='font-family:"Calibri",sans-serif'>>> 1)</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#define IPQESS_RFS_EXPIRE_COUNT_PER_CALL 128</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++/* RFD Base Address Register */</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#define IPQESS_REG_RFD_BASE_ADDR_Q(x) (0x950 + ((x) << 3)) /* x =</span> <br><span style='font-family:"Calibri",sans-serif'>>> queue id */</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++/* RFD Index Register */</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#define IPQESS_REG_RFD_IDX_Q(x) (0x9B0 + ((x) << 3))</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#define IPQESS_RFD_PROD_IDX_BITS 0x00000FFF</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#define IPQESS_RFD_CONS_IDX_BITS 0x0FFF0000</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#define IPQESS_RFD_PROD_IDX_MASK 0xFFF</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#define IPQESS_RFD_CONS_IDX_MASK 0xFFF</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#define IPQESS_RFD_PROD_IDX_SHIFT 0</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#define IPQESS_RFD_CONS_IDX_SHIFT 16</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++/* Rx Descriptor Control Register */</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#define IPQESS_REG_RX_DESC0 0xA10</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#define IPQESS_RFD_RING_SIZE_MASK 0xFFF</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#define IPQESS_RX_BUF_SIZE_MASK 0xFFFF</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#define IPQESS_RFD_RING_SIZE_SHIFT 0</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#define IPQESS_RX_BUF_SIZE_SHIFT 16</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#define IPQESS_REG_RX_DESC1 0xA14</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#define IPQESS_RXQ_RFD_BURST_NUM_MASK 0x3F</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#define IPQESS_RXQ_RFD_PF_THRESH_MASK 0x1F</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#define IPQESS_RXQ_RFD_LOW_THRESH_MASK 0xFFF</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#define IPQESS_RXQ_RFD_BURST_NUM_SHIFT 0</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#define IPQESS_RXQ_RFD_PF_THRESH_SHIFT 8</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#define IPQESS_RXQ_RFD_LOW_THRESH_SHIFT 16</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++/* RXQ Control Register */</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#define IPQESS_REG_RXQ_CTRL 0xA18</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#define IPQESS_FIFO_THRESH_TYPE_SHIF 0</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#define IPQESS_FIFO_THRESH_128_BYTE 0x0</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#define IPQESS_FIFO_THRESH_64_BYTE 0x1</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#define IPQESS_RXQ_CTRL_RMV_VLAN 0x00000002</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#define IPQESS_RXQ_CTRL_EN 0x0000FF00</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++/* AXI Burst Size Config */</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#define IPQESS_REG_AXIW_CTRL_MAXWRSIZE 0xA1C</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#define IPQESS_AXIW_MAXWRSIZE_VALUE 0x0</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++/* Rx Statistics Register */</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#define IPQESS_REG_RX_STAT_BYTE_Q(x) (0xA30 + ((x) << 2)) /* x = queue</span> <br><span style='font-family:"Calibri",sans-serif'>>> id */</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#define IPQESS_REG_RX_STAT_PKT_Q(x) (0xA50 + ((x) << 2)) /* x = queue id</span> <br><span style='font-family:"Calibri",sans-serif'>>> */</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++/* WoL Pattern Length Register */</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#define IPQESS_REG_WOL_PATTERN_LEN0 0xC00</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#define IPQESS_WOL_PT_LEN_MASK 0xFF</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#define IPQESS_WOL_PT0_LEN_SHIFT 0</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#define IPQESS_WOL_PT1_LEN_SHIFT 8</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#define IPQESS_WOL_PT2_LEN_SHIFT 16</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#define IPQESS_WOL_PT3_LEN_SHIFT 24</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#define IPQESS_REG_WOL_PATTERN_LEN1 0xC04</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#define IPQESS_WOL_PT4_LEN_SHIFT 0</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#define IPQESS_WOL_PT5_LEN_SHIFT 8</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#define IPQESS_WOL_PT6_LEN_SHIFT 16</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++/* WoL Control Register */</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#define IPQESS_REG_WOL_CTRL 0xC08</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#define IPQESS_WOL_WK_EN 0x00000001</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#define IPQESS_WOL_MG_EN 0x00000002</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#define IPQESS_WOL_PT0_EN 0x00000004</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#define IPQESS_WOL_PT1_EN 0x00000008</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#define IPQESS_WOL_PT2_EN 0x00000010</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#define IPQESS_WOL_PT3_EN 0x00000020</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#define IPQESS_WOL_PT4_EN 0x00000040</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#define IPQESS_WOL_PT5_EN 0x00000080</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#define IPQESS_WOL_PT6_EN 0x00000100</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++/* MAC Control Register */</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#define IPQESS_REG_MAC_CTRL0 0xC20</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#define IPQESS_REG_MAC_CTRL1 0xC24</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++/* WoL Pattern Register */</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#define IPQESS_REG_WOL_PATTERN_START 0x5000</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#define IPQESS_PATTERN_PART_REG_OFFSET 0x40</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++/* TX descriptor fields */</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#define IPQESS_TPD_HDR_SHIFT 0</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#define IPQESS_TPD_PPPOE_EN 0x00000100</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#define IPQESS_TPD_IP_CSUM_EN 0x00000200</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#define IPQESS_TPD_TCP_CSUM_EN 0x0000400</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#define IPQESS_TPD_UDP_CSUM_EN 0x00000800</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#define IPQESS_TPD_CUSTOM_CSUM_EN 0x00000C00</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#define IPQESS_TPD_LSO_EN 0x00001000</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#define IPQESS_TPD_LSO_V2_EN 0x00002000</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#define IPQESS_TPD_IPV4_EN 0x00010000</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#define IPQESS_TPD_MSS_MASK 0x1FFF</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#define IPQESS_TPD_MSS_SHIFT 18</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#define IPQESS_TPD_CUSTOM_CSUM_SHIFT 18</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++/* RRD descriptor fields */</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#define IPQESS_RRD_NUM_RFD_MASK 0x000F</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#define IPQESS_RRD_PKT_SIZE_MASK 0x3FFF</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#define IPQESS_RRD_SRC_PORT_NUM_MASK 0x4000</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#define IPQESS_RRD_SVLAN 0x8000</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#define IPQESS_RRD_FLOW_COOKIE_MASK 0x07FF;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#define IPQESS_RRD_PKT_SIZE_MASK 0x3FFF</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#define IPQESS_RRD_CSUM_FAIL_MASK 0xC000</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#define IPQESS_RRD_CVLAN 0x0001</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#define IPQESS_RRD_DESC_VALID 0x8000</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#define IPQESS_RRD_PRIORITY_SHIFT 4</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#define IPQESS_RRD_PRIORITY_MASK 0x7</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#define IPQESS_RRD_PORT_TYPE_SHIFT 7</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#define IPQESS_RRD_PORT_TYPE_MASK 0x1F</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#endif</span> <br><span style='font-family:"Calibri",sans-serif'>>> +diff --git a/target/linux/ipq40xx/files-</span> <br><span style='font-family:"Calibri",sans-serif'>>> 4.14/drivers/net/ethernet/qualcomm/ipqess_ethtool.c</span> <br><span style='font-family:"Calibri",sans-serif'>>> b/target/linux/ipq40xx/files-</span> <br><span style='font-family:"Calibri",sans-serif'>>> 4.14/drivers/net/ethernet/qualcomm/ipqess_ethtool.c</span> <br><span style='font-family:"Calibri",sans-serif'>>> +new file mode 100644</span> <br><span style='font-family:"Calibri",sans-serif'>>> +index 0000000000..0b75904d48</span> <br><span style='font-family:"Calibri",sans-serif'>>> +--- /dev/null</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++++ b/target/linux/ipq40xx/files-</span> <br><span style='font-family:"Calibri",sans-serif'>>> 4.14/drivers/net/ethernet/qualcomm/ipqess_ethtool.c</span> <br><span style='font-family:"Calibri",sans-serif'>>> +@@ -0,0 +1,191 @@</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++/*</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++ * Copyright (c) 2015 - 2016, The Linux Foundation. All rights reserved.</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++ *</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++ * Permission to use, copy, modify, and/or distribute this software for</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++ * any purpose with or without fee is hereby granted, provided that the</span> <o:p></o:p></p><p style='margin-top:0cm'><span style='font-family:"Calibri",sans-serif'>>> ++ * above copyright notice and this permission notice appear in all copies.</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL</span> <br><span style='font-family:"Calibri",sans-serif'>>> WARRANTIES</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES</span> <br><span style='font-family:"Calibri",sans-serif'>>> OF</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE</span> <br><span style='font-family:"Calibri",sans-serif'>>> LIABLE FOR</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY</span> <br><span style='font-family:"Calibri",sans-serif'>>> DAMAGES</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,</span> <br><span style='font-family:"Calibri",sans-serif'>>> WHETHER IN AN</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,</span> <br><span style='font-family:"Calibri",sans-serif'>>> ARISING OUT</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++ * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS</span> <br><span style='font-family:"Calibri",sans-serif'>>> SOFTWARE.</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++ */</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#include <linux/ethtool.h></span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#include <linux/netdevice.h></span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#include <linux/string.h></span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#include <linux/phy.h></span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#include "ipqess.h"</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++struct ipqesstool_stats {</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   uint8_t string[ETH_GSTRING_LEN];</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   uint32_t offset;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++};</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#define IPQESS_STAT(m)    offsetof(struct ipqesstool_statistics, m)</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++#define DRVINFO_LEN        32</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++static const struct ipqesstool_stats ipqess_stats[] = {</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   {"tx_q0_pkt", IPQESS_STAT(tx_q0_pkt)},</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   {"tx_q1_pkt", IPQESS_STAT(tx_q1_pkt)},</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   {"tx_q2_pkt", IPQESS_STAT(tx_q2_pkt)},</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   {"tx_q3_pkt", IPQESS_STAT(tx_q3_pkt)},</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   {"tx_q4_pkt", IPQESS_STAT(tx_q4_pkt)},</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   {"tx_q5_pkt", IPQESS_STAT(tx_q5_pkt)},</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   {"tx_q6_pkt", IPQESS_STAT(tx_q6_pkt)},</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   {"tx_q7_pkt", IPQESS_STAT(tx_q7_pkt)},</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   {"tx_q8_pkt", IPQESS_STAT(tx_q8_pkt)},</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   {"tx_q9_pkt", IPQESS_STAT(tx_q9_pkt)},</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   {"tx_q10_pkt", IPQESS_STAT(tx_q10_pkt)},</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   {"tx_q11_pkt", IPQESS_STAT(tx_q11_pkt)},</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   {"tx_q12_pkt", IPQESS_STAT(tx_q12_pkt)},</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   {"tx_q13_pkt", IPQESS_STAT(tx_q13_pkt)},</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   {"tx_q14_pkt", IPQESS_STAT(tx_q14_pkt)},</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   {"tx_q15_pkt", IPQESS_STAT(tx_q15_pkt)},</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   {"tx_q0_byte", IPQESS_STAT(tx_q0_byte)},</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   {"tx_q1_byte", IPQESS_STAT(tx_q1_byte)},</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   {"tx_q2_byte", IPQESS_STAT(tx_q2_byte)},</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   {"tx_q3_byte", IPQESS_STAT(tx_q3_byte)},</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   {"tx_q4_byte", IPQESS_STAT(tx_q4_byte)},</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   {"tx_q5_byte", IPQESS_STAT(tx_q5_byte)},</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   {"tx_q6_byte", IPQESS_STAT(tx_q6_byte)},</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   {"tx_q7_byte", IPQESS_STAT(tx_q7_byte)},</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   {"tx_q8_byte", IPQESS_STAT(tx_q8_byte)},</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   {"tx_q9_byte", IPQESS_STAT(tx_q9_byte)},</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   {"tx_q10_byte", IPQESS_STAT(tx_q10_byte)},</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   {"tx_q11_byte", IPQESS_STAT(tx_q11_byte)},</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   {"tx_q12_byte", IPQESS_STAT(tx_q12_byte)},</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   {"tx_q13_byte", IPQESS_STAT(tx_q13_byte)},</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   {"tx_q14_byte", IPQESS_STAT(tx_q14_byte)},</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   {"tx_q15_byte", IPQESS_STAT(tx_q15_byte)},</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   {"rx_q0_pkt", IPQESS_STAT(rx_q0_pkt)},</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   {"rx_q1_pkt", IPQESS_STAT(rx_q1_pkt)},</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   {"rx_q2_pkt", IPQESS_STAT(rx_q2_pkt)},</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   {"rx_q3_pkt", IPQESS_STAT(rx_q3_pkt)},</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   {"rx_q4_pkt", IPQESS_STAT(rx_q4_pkt)},</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   {"rx_q5_pkt", IPQESS_STAT(rx_q5_pkt)},</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   {"rx_q6_pkt", IPQESS_STAT(rx_q6_pkt)},</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   {"rx_q7_pkt", IPQESS_STAT(rx_q7_pkt)},</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   {"rx_q0_byte", IPQESS_STAT(rx_q0_byte)},</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   {"rx_q1_byte", IPQESS_STAT(rx_q1_byte)},</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   {"rx_q2_byte", IPQESS_STAT(rx_q2_byte)},</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   {"rx_q3_byte", IPQESS_STAT(rx_q3_byte)},</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   {"rx_q4_byte", IPQESS_STAT(rx_q4_byte)},</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   {"rx_q5_byte", IPQESS_STAT(rx_q5_byte)},</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   {"rx_q6_byte", IPQESS_STAT(rx_q6_byte)},</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   {"rx_q7_byte", IPQESS_STAT(rx_q7_byte)},</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   {"tx_desc_error", IPQESS_STAT(tx_desc_error)},</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++};</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++static int ipqess_get_strset_count(struct net_device *netdev, int sset)</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++{</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   switch (sset) {</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   case ETH_SS_STATS:</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++           return ARRAY_SIZE(ipqess_stats);</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   default:</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++           netdev_dbg(netdev, "%s: Invalid string set", __func__);</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++           return -EOPNOTSUPP;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   }</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++}</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++static void ipqess_get_strings(struct net_device *netdev, uint32_t stringset,</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++                          uint8_t *data)</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++{</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   uint8_t *p = data;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   uint32_t i;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   switch (stringset) {</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   case ETH_SS_STATS:</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++           for (i = 0; i < ARRAY_SIZE(ipqess_stats); i++) {</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++                   memcpy(p, ipqess_stats[i].string,</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++                          min((size_t)ETH_GSTRING_LEN,</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++                          strlen(ipqess_stats[i].string) + 1));</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++                   p += ETH_GSTRING_LEN;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++           }</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++           break;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   }</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++}</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++static void ipqess_get_drvinfo(struct net_device *dev,</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++                          struct ethtool_drvinfo *info)</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++{</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   strlcpy(info->driver, "qca_ipqess", DRVINFO_LEN);</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   strlcpy(info->bus_info, "axi", ETHTOOL_BUSINFO_LEN);</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++}</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++static int ipqess_get_settings(struct net_device *netdev,</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++                          struct ethtool_cmd *ecmd)</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++{</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   struct phy_device *phydev = NULL;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   uint16_t phyreg;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   phydev = netdev->phydev;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   ecmd->advertising = phydev->advertising;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   ecmd->autoneg = phydev->autoneg;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   ecmd->speed = phydev->speed;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   ecmd->duplex = phydev->duplex;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   ecmd->phy_address = phydev->mdio.addr;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   phyreg = (uint16_t)phy_read(netdev->phydev, MII_LPA);</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   if (phyreg & LPA_10HALF)</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++           ecmd->lp_advertising |= ADVERTISED_10baseT_Half;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   if (phyreg & LPA_10FULL)</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++           ecmd->lp_advertising |= ADVERTISED_10baseT_Full;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   if (phyreg & LPA_100HALF)</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++           ecmd->lp_advertising |= ADVERTISED_100baseT_Half;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   if (phyreg & LPA_100FULL)</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++           ecmd->lp_advertising |= ADVERTISED_100baseT_Full;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   phyreg = (uint16_t)phy_read(netdev->phydev, MII_STAT1000);</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   if (phyreg & LPA_1000HALF)</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++           ecmd->lp_advertising |= ADVERTISED_1000baseT_Half;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   if (phyreg & LPA_1000FULL)</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++           ecmd->lp_advertising |= ADVERTISED_1000baseT_Full;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   return 0;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++}</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++static int ipqess_set_settings(struct net_device *netdev,</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++                        struct ethtool_cmd *ecmd)</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++{</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   struct phy_device *phydev = NULL;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   phydev = netdev->phydev;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   phydev->advertising = ecmd->advertising;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   phydev->autoneg = ecmd->autoneg;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   phydev->speed = ethtool_cmd_speed(ecmd);</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   phydev->duplex = ecmd->duplex;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   genphy_config_aneg(phydev);</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   return 0;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++}</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++static void ipqess_get_ringparam(struct net_device *netdev,</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++                          struct ethtool_ringparam *ring)</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++{</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   ring->tx_max_pending = IPQESS_TX_RING_SIZE;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   ring->rx_max_pending = IPQESS_RX_RING_SIZE;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++}</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++static const struct ethtool_ops ipqesstool_ops = {</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   .get_drvinfo = &ipqess_get_drvinfo,</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   .get_link = &ethtool_op_get_link,</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   .get_settings = &ipqess_get_settings,</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   .set_settings = &ipqess_set_settings,</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   .get_strings = &ipqess_get_strings,</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   .get_sset_count = &ipqess_get_strset_count,</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   .get_ringparam = ipqess_get_ringparam,</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++};</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++void ipqess_set_ethtool_ops(struct net_device *netdev)</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++{</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   netdev->ethtool_ops = &ipqesstool_ops;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++}</span> <br><span style='font-family:"Calibri",sans-serif'>>> +diff --git a/target/linux/ipq40xx/patches-4.14/999-0-ipqess.patch</span> <br><span style='font-family:"Calibri",sans-serif'>>> b/target/linux/ipq40xx/patches-4.14/999-0-ipqess.patch</span> <br><span style='font-family:"Calibri",sans-serif'>>> +new file mode 100644</span> <br><span style='font-family:"Calibri",sans-serif'>>> +index 0000000000..c0ffe6f052</span> <br><span style='font-family:"Calibri",sans-serif'>>> +--- /dev/null</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++++ b/target/linux/ipq40xx/patches-4.14/999-0-ipqess.patch</span> <br><span style='font-family:"Calibri",sans-serif'>>> +@@ -0,0 +1,167 @@</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++Index: linux-4.9.34/drivers/net/ethernet/qualcomm/Kconfig</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++===========================================================</span> <br><span style='font-family:"Calibri",sans-serif'>>> ========</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++--- linux-4.9.34.orig/drivers/net/ethernet/qualcomm/Kconfig</span> <br><span style='font-family:"Calibri",sans-serif'>>> +++++ linux-4.9.34/drivers/net/ethernet/qualcomm/Kconfig</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++@@ -15,6 +15,15 @@ config NET_VENDOR_QUALCOMM</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++ if NET_VENDOR_QUALCOMM</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> +++config IPQ_ESS</span> <br><span style='font-family:"Calibri",sans-serif'>>> +++  tristate "Qualcomm Atheros IPQ ESS support"</span> <br><span style='font-family:"Calibri",sans-serif'>>> +++  depends on OF</span> <br><span style='font-family:"Calibri",sans-serif'>>> +++  ---help---</span> <br><span style='font-family:"Calibri",sans-serif'>>> +++    This SPI protocol driver supports the Qualcomm Atheros QCA7000.</span> <br><span style='font-family:"Calibri",sans-serif'>>> +++</span> <br><span style='font-family:"Calibri",sans-serif'>>> +++    To compile this driver as a module, choose M here. The module</span> <br><span style='font-family:"Calibri",sans-serif'>>> +++    will be called qcaspi.</span> <br><span style='font-family:"Calibri",sans-serif'>>> +++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++ config QCA7000</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   tristate "Qualcomm Atheros QCA7000 support"</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   depends on SPI_MASTER && OF</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++Index: linux-4.9.34/drivers/net/ethernet/qualcomm/Makefile</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++===========================================================</span> <br><span style='font-family:"Calibri",sans-serif'>>> ========</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++--- linux-4.9.34.orig/drivers/net/ethernet/qualcomm/Makefile</span> <br><span style='font-family:"Calibri",sans-serif'>>> +++++ linux-4.9.34/drivers/net/ethernet/qualcomm/Makefile</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++@@ -2,6 +2,9 @@</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++ # Makefile for the Qualcomm network device drivers.</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++ #</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> +++obj-$(CONFIG_IPQ_ESS) += ipq_ess.o</span> <br><span style='font-family:"Calibri",sans-serif'>>> +++ipq_ess-objs := ipqess.o ipqess_ethtool.o</span> <br><span style='font-family:"Calibri",sans-serif'>>> +++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++ obj-$(CONFIG_QCA7000) += qca_7k_common.o</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++ obj-$(CONFIG_QCA7000_SPI) += qcaspi.o</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++ qcaspi-objs := qca_7k.o qca_debug.o qca_spi.o</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++Index: linux-4.9.34/arch/arm/boot/dts/qcom-ipq4019.dtsi</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++===========================================================</span> <br><span style='font-family:"Calibri",sans-serif'>>> ========</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++--- linux-4.9.34.orig/arch/arm/boot/dts/qcom-ipq4019.dtsi</span> <br><span style='font-family:"Calibri",sans-serif'>>> +++++ linux-4.9.34/arch/arm/boot/dts/qcom-ipq4019.dtsi</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++@@ -44,8 +44,7 @@</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++           spi1 = &spi_1;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++           i2c0 = &i2c_0;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++           i2c1 = &i2c_1;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++-          ethernet0 = &gmac0;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++-          ethernet1 = &gmac1;</span> <br><span style='font-family:"Calibri",sans-serif'>>> +++          ethernet0 = &gmac;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   };</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   cpus {</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++@@ -389,6 +388,53 @@</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++                   status = "disabled";</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++           };</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> +++          gmac: edma@c080000 {</span> <br><span style='font-family:"Calibri",sans-serif'>>> +++                  compatible = "qcom,ess-edma";</span> <br><span style='font-family:"Calibri",sans-serif'>>> +++                  reg = <0xc080000 0x8000>;</span> <br><span style='font-family:"Calibri",sans-serif'>>> +++                  interrupts = <GIC_SPI  65 IRQ_TYPE_EDGE_RISING>,</span> <br><span style='font-family:"Calibri",sans-serif'>>> +++                               <GIC_SPI  66 IRQ_TYPE_EDGE_RISING>,</span> <br><span style='font-family:"Calibri",sans-serif'>>> +++                               <GIC_SPI  67 IRQ_TYPE_EDGE_RISING>,</span> <br><span style='font-family:"Calibri",sans-serif'>>> +++                               <GIC_SPI  68 IRQ_TYPE_EDGE_RISING>,</span> <br><span style='font-family:"Calibri",sans-serif'>>> +++                               <GIC_SPI  69 IRQ_TYPE_EDGE_RISING>,</span> <br><span style='font-family:"Calibri",sans-serif'>>> +++                               <GIC_SPI  79 IRQ_TYPE_EDGE_RISING>,</span> <br><span style='font-family:"Calibri",sans-serif'>>> +++                               <GIC_SPI  71 IRQ_TYPE_EDGE_RISING>,</span> <br><span style='font-family:"Calibri",sans-serif'>>> +++                               <GIC_SPI  72 IRQ_TYPE_EDGE_RISING>,</span> <br><span style='font-family:"Calibri",sans-serif'>>> +++                               <GIC_SPI  73 IRQ_TYPE_EDGE_RISING>,</span> <br><span style='font-family:"Calibri",sans-serif'>>> +++                               <GIC_SPI  74 IRQ_TYPE_EDGE_RISING>,</span> <br><span style='font-family:"Calibri",sans-serif'>>> +++                               <GIC_SPI  75 IRQ_TYPE_EDGE_RISING>,</span> <br><span style='font-family:"Calibri",sans-serif'>>> +++                               <GIC_SPI  76 IRQ_TYPE_EDGE_RISING>,</span> <br><span style='font-family:"Calibri",sans-serif'>>> +++                               <GIC_SPI  77 IRQ_TYPE_EDGE_RISING>,</span> <br><span style='font-family:"Calibri",sans-serif'>>> +++                               <GIC_SPI  78 IRQ_TYPE_EDGE_RISING>,</span> <br><span style='font-family:"Calibri",sans-serif'>>> +++                               <GIC_SPI  79 IRQ_TYPE_EDGE_RISING>,</span> <br><span style='font-family:"Calibri",sans-serif'>>> +++                               <GIC_SPI  80 IRQ_TYPE_EDGE_RISING>,</span> <br><span style='font-family:"Calibri",sans-serif'>>> +++                               <GIC_SPI 240 IRQ_TYPE_EDGE_RISING>,</span> <br><span style='font-family:"Calibri",sans-serif'>>> +++                               <GIC_SPI 241 IRQ_TYPE_EDGE_RISING>,</span> <br><span style='font-family:"Calibri",sans-serif'>>> +++                               <GIC_SPI 242 IRQ_TYPE_EDGE_RISING>,</span> <br><span style='font-family:"Calibri",sans-serif'>>> +++                               <GIC_SPI 243 IRQ_TYPE_EDGE_RISING>,</span> <br><span style='font-family:"Calibri",sans-serif'>>> +++                               <GIC_SPI 244 IRQ_TYPE_EDGE_RISING>,</span> <br><span style='font-family:"Calibri",sans-serif'>>> +++                               <GIC_SPI 245 IRQ_TYPE_EDGE_RISING>,</span> <br><span style='font-family:"Calibri",sans-serif'>>> +++                               <GIC_SPI 246 IRQ_TYPE_EDGE_RISING>,</span> <br><span style='font-family:"Calibri",sans-serif'>>> +++                               <GIC_SPI 247 IRQ_TYPE_EDGE_RISING>,</span> <br><span style='font-family:"Calibri",sans-serif'>>> +++                               <GIC_SPI 248 IRQ_TYPE_EDGE_RISING>,</span> <br><span style='font-family:"Calibri",sans-serif'>>> +++                               <GIC_SPI 249 IRQ_TYPE_EDGE_RISING>,</span> <br><span style='font-family:"Calibri",sans-serif'>>> +++                               <GIC_SPI 250 IRQ_TYPE_EDGE_RISING>,</span> <br><span style='font-family:"Calibri",sans-serif'>>> +++                               <GIC_SPI 251 IRQ_TYPE_EDGE_RISING>,</span> <br><span style='font-family:"Calibri",sans-serif'>>> +++                               <GIC_SPI 252 IRQ_TYPE_EDGE_RISING>,</span> <br><span style='font-family:"Calibri",sans-serif'>>> +++                               <GIC_SPI 253 IRQ_TYPE_EDGE_RISING>,</span> <br><span style='font-family:"Calibri",sans-serif'>>> +++                               <GIC_SPI 254 IRQ_TYPE_EDGE_RISING>,</span> <br><span style='font-family:"Calibri",sans-serif'>>> +++                               <GIC_SPI 255 IRQ_TYPE_EDGE_RISING>;</span> <br><span style='font-family:"Calibri",sans-serif'>>> +++</span> <br><span style='font-family:"Calibri",sans-serif'>>> +++                  status = "disabled";</span> <br><span style='font-family:"Calibri",sans-serif'>>> +++</span> <br><span style='font-family:"Calibri",sans-serif'>>> +++                  phy-mode = "sgmii";</span> <br><span style='font-family:"Calibri",sans-serif'>>> +++</span> <br><span style='font-family:"Calibri",sans-serif'>>> +++                  fixed-link {</span> <br><span style='font-family:"Calibri",sans-serif'>>> +++                          speed = <1000>;</span> <br><span style='font-family:"Calibri",sans-serif'>>> +++                          full-duplex;</span> <br><span style='font-family:"Calibri",sans-serif'>>> +++                          pause;</span> <br><span style='font-family:"Calibri",sans-serif'>>> +++                  };</span> <br><span style='font-family:"Calibri",sans-serif'>>> +++          };</span> <br><span style='font-family:"Calibri",sans-serif'>>> +++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++           pcie0: pci@40000000 {</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++                   compatible = "qcom,pcie-ipq4019";</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++                   reg =  <0x40000000 0xf1d</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++@@ -462,64 +508,6 @@</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++                   status = "disabled";</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++           };</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++-          edma@c080000 {</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++-                  compatible = "qcom,ess-edma";</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++-                  reg = <0xc080000 0x8000>;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++-                  qcom,page-mode = <0>;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++-                  qcom,rx_head_buf_size = <1540>;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++-                  qcom,mdio_supported;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++-                  qcom,poll_required = <1>;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++-                  qcom,num_gmac = <2>;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++-                  interrupts = <0  65 IRQ_TYPE_EDGE_RISING</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++-                                0  66 IRQ_TYPE_EDGE_RISING</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++-                                0  67 IRQ_TYPE_EDGE_RISING</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++-                                0  68 IRQ_TYPE_EDGE_RISING</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++-                                0  69 IRQ_TYPE_EDGE_RISING</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++-                                0  70 IRQ_TYPE_EDGE_RISING</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++-                                0  71 IRQ_TYPE_EDGE_RISING</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++-                                0  72 IRQ_TYPE_EDGE_RISING</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++-                                0  73 IRQ_TYPE_EDGE_RISING</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++-                                0  74 IRQ_TYPE_EDGE_RISING</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++-                                0  75 IRQ_TYPE_EDGE_RISING</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++-                                0  76 IRQ_TYPE_EDGE_RISING</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++-                                0  77 IRQ_TYPE_EDGE_RISING</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++-                                0  78 IRQ_TYPE_EDGE_RISING</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++-                                0  79 IRQ_TYPE_EDGE_RISING</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++-                                0  80 IRQ_TYPE_EDGE_RISING</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++-                                0 240 IRQ_TYPE_EDGE_RISING</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++-                                0 241 IRQ_TYPE_EDGE_RISING</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++-                                0 242 IRQ_TYPE_EDGE_RISING</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++-                                0 243 IRQ_TYPE_EDGE_RISING</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++-                                0 244 IRQ_TYPE_EDGE_RISING</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++-                                0 245 IRQ_TYPE_EDGE_RISING</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++-                                0 246 IRQ_TYPE_EDGE_RISING</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++-                                0 247 IRQ_TYPE_EDGE_RISING</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++-                                0 248 IRQ_TYPE_EDGE_RISING</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++-                                0 249 IRQ_TYPE_EDGE_RISING</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++-                                0 250 IRQ_TYPE_EDGE_RISING</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++-                                0 251 IRQ_TYPE_EDGE_RISING</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++-                                0 252 IRQ_TYPE_EDGE_RISING</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++-                                0 253 IRQ_TYPE_EDGE_RISING</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++-                                0 254 IRQ_TYPE_EDGE_RISING</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++-                                0 255 IRQ_TYPE_EDGE_RISING>;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++-</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++-                  status = "disabled";</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++-</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++-                  gmac0: gmac0 {</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++-                          local-mac-address = [00 00 00 00 00 00];</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++-                          vlan_tag = <1 0x1f>;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++-                  };</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++-</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++-                  gmac1: gmac1 {</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++-                          local-mac-address = [00 00 00 00 00 00];</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++-                          qcom,phy_mdio_addr = <4>;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++-                          qcom,poll_required = <1>;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++-                          qcom,forced_speed = <1000>;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++-                          qcom,forced_duplex = <1>;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++-                          vlan_tag = <2 0x20>;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++-                  };</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++-          };</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++-</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++           usb3_ss_phy: ssphy@9a000 {</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++                   compatible = "qca,uni-ssphy";</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++                   reg = <0x9a000 0x800>;</span> <br><span style='font-family:"Calibri",sans-serif'>>> +--</span> <br><span style='font-family:"Calibri",sans-serif'>>> +2.11.0</span> <br><span style='font-family:"Calibri",sans-serif'>>> +</span> <br><span style='font-family:"Calibri",sans-serif'>>> diff --git a/build_patches/openwrt/0007-ipqess-integration.patch</span> <br><span style='font-family:"Calibri",sans-serif'>>> b/build_patches/openwrt/0007-ipqess-integration.patch</span> <br><span style='font-family:"Calibri",sans-serif'>>> new file mode 100644</span> <br><span style='font-family:"Calibri",sans-serif'>>> index 0000000..3a6b91f</span> <br><span style='font-family:"Calibri",sans-serif'>>> --- /dev/null</span> <br><span style='font-family:"Calibri",sans-serif'>>> +++ b/build_patches/openwrt/0007-ipqess-integration.patch</span> <br><span style='font-family:"Calibri",sans-serif'>>> @@ -0,0 +1,207 @@</span> <br><span style='font-family:"Calibri",sans-serif'>>> +From 63fcc7024ae7cb989d1817dc1eeb128f702548bf Mon Sep 17 00:00:00 2001</span> <br><span style='font-family:"Calibri",sans-serif'>>> +From: Christian Dresel <fff@chrisi01.de></span> <br><span style='font-family:"Calibri",sans-serif'>>> +Date: Sat, 24 Nov 2018 17:22:23 +0100</span> <br><span style='font-family:"Calibri",sans-serif'>>> +Subject: [PATCH] ipqess integration</span> <br><span style='font-family:"Calibri",sans-serif'>>> +</span> <br><span style='font-family:"Calibri",sans-serif'>>> +Signed-off-by: Christian Dresel <fff@chrisi01.de></span> <br><span style='font-family:"Calibri",sans-serif'>>> +</span> <br><span style='font-family:"Calibri",sans-serif'>>> +rebase</span> <br><span style='font-family:"Calibri",sans-serif'>>> +</span> <br><span style='font-family:"Calibri",sans-serif'>>> +Signed-off-by: Christian Dresel <fff@chrisi01.de></span> <br><span style='font-family:"Calibri",sans-serif'>>> +---</span> <br><span style='font-family:"Calibri",sans-serif'>>> + target/linux/ipq40xx/base-files/etc/board.d/01_leds   |  2 +-</span> <br><span style='font-family:"Calibri",sans-serif'>>> + .../linux/ipq40xx/base-files/etc/board.d/02_network   | 13 +++++++++++--</span> <br><span style='font-family:"Calibri",sans-serif'>>> + .../files-4.14/arch/arm/boot/dts/qcom-ipq4018-a42.dts | 16 ----------------</span> <br><span style='font-family:"Calibri",sans-serif'>>> + .../arch/arm/boot/dts/qcom-ipq4018-jalapeno.dts       | 14 --------------</span> <br><span style='font-family:"Calibri",sans-serif'>>> + .../files-4.14/arch/arm/boot/dts/qcom-ipq4019-a62.dts |  8 --------</span> <br><span style='font-family:"Calibri",sans-serif'>>> + .../arch/arm/boot/dts/qcom-ipq4028-wpj428.dts         | 16 ----------------</span> <br><span style='font-family:"Calibri",sans-serif'>>> + .../arch/arm/boot/dts/qcom-ipq4029-mr33.dts           | 19 +++++++++----------</span> <br><span style='font-family:"Calibri",sans-serif'>>> + 7 files changed, 21 insertions(+), 67 deletions(-)</span> <br><span style='font-family:"Calibri",sans-serif'>>> +</span> <br><span style='font-family:"Calibri",sans-serif'>>> +diff --git a/target/linux/ipq40xx/base-files/etc/board.d/01_leds</span> <br><span style='font-family:"Calibri",sans-serif'>>> b/target/linux/ipq40xx/base-files/etc/board.d/01_leds</span> <br><span style='font-family:"Calibri",sans-serif'>>> +index fcba2aea54..ceec20d99a 100755</span> <br><span style='font-family:"Calibri",sans-serif'>>> +--- a/target/linux/ipq40xx/base-files/etc/board.d/01_leds</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++++ b/target/linux/ipq40xx/base-files/etc/board.d/01_leds</span> <br><span style='font-family:"Calibri",sans-serif'>>> +@@ -20,7 +20,7 @@ asus,rt-ac58u)</span> <br><span style='font-family:"Calibri",sans-serif'>>> +    ;;</span> <br><span style='font-family:"Calibri",sans-serif'>>> + avm,fritzbox-4040)</span> <br><span style='font-family:"Calibri",sans-serif'>>> +    ucidef_set_led_wlan "wlan" "WLAN" "fritz4040:green:wlan" "phy0tpt"</span> <br><span style='font-family:"Calibri",sans-serif'>>> "phy1tpt"</span> <br><span style='font-family:"Calibri",sans-serif'>>> +-   ucidef_set_led_netdev "wan" "WAN" "fritz4040:green:wan" "eth1"</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   ucidef_set_led_switch "wan" "WAN" "fritz4040:green:wan" "switch0"</span> <br><span style='font-family:"Calibri",sans-serif'>>> "0x20"</span> <br><span style='font-family:"Calibri",sans-serif'>>> +    ucidef_set_led_switch "lan" "LAN" "fritz4040:green:lan" "switch0"</span> <br><span style='font-family:"Calibri",sans-serif'>>> "0x1e"</span> <br><span style='font-family:"Calibri",sans-serif'>>> +    ;;</span> <br><span style='font-family:"Calibri",sans-serif'>>> + glinet,gl-b1300)</span> <br><span style='font-family:"Calibri",sans-serif'>>> +diff --git a/target/linux/ipq40xx/base-files/etc/board.d/02_network</span> <br><span style='font-family:"Calibri",sans-serif'>>> b/target/linux/ipq40xx/base-files/etc/board.d/02_network</span> <br><span style='font-family:"Calibri",sans-serif'>>> +index 03e0c0e16c..7c84139d11 100755</span> <br><span style='font-family:"Calibri",sans-serif'>>> +--- a/target/linux/ipq40xx/base-files/etc/board.d/02_network</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++++ b/target/linux/ipq40xx/base-files/etc/board.d/02_network</span> <br><span style='font-family:"Calibri",sans-serif'>>> +@@ -26,9 +26,8 @@ asus,rt-ac58u)</span> <br><span style='font-family:"Calibri",sans-serif'>>> +    ucidef_set_interface_macaddr "wan" "$wan_mac_addr"</span> <br><span style='font-family:"Calibri",sans-serif'>>> +    ;;</span> <br><span style='font-family:"Calibri",sans-serif'>>> + avm,fritzbox-4040)</span> <br><span style='font-family:"Calibri",sans-serif'>>> +-   ucidef_set_interfaces_lan_wan "eth0" "eth1"</span> <br><span style='font-family:"Calibri",sans-serif'>>> +    ucidef_add_switch "switch0" \</span> <br><span style='font-family:"Calibri",sans-serif'>>> +-           "0u@eth0" "1:lan" "2:lan" "3:lan" "4:lan"</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++           "0@eth0" "1:lan:4" "2:lan:3" "3:lan:2" "4:lan:1" "5:wan"</span> <br><span style='font-family:"Calibri",sans-serif'>>> +    ;;</span> <br><span style='font-family:"Calibri",sans-serif'>>> + compex,wpj428)</span> <br><span style='font-family:"Calibri",sans-serif'>>> +    ucidef_set_interface_lan "eth0 eth1"</span> <br><span style='font-family:"Calibri",sans-serif'>>> +@@ -53,6 +52,16 @@ zyxel,wre6606)</span> <br><span style='font-family:"Calibri",sans-serif'>>> +    ;;</span> <br><span style='font-family:"Calibri",sans-serif'>>> + esac</span> <br><span style='font-family:"Calibri",sans-serif'>>> +</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++case "$board" in</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++avm,fritzbox-4040)</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   lan_mac=$(fritz_tffs -b -n maca -i $(find_mtd_part "tffs1"))</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   wan_mac=$(fritz_tffs -b -n macb -i $(find_mtd_part "tffs1"))</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   ;;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++esac</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++[ -n "$lan_mac" ] && ucidef_set_interface_macaddr "lan" "$lan_mac"</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++[ -n "$wan_mac" ] && ucidef_set_interface_macaddr "wan" "$wan_mac"</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> + board_config_flush</span> <br><span style='font-family:"Calibri",sans-serif'>>> +</span> <br><span style='font-family:"Calibri",sans-serif'>>> + exit 0</span> <br><span style='font-family:"Calibri",sans-serif'>>> +diff --git a/target/linux/ipq40xx/files-4.14/arch/arm/boot/dts/qcom-ipq4018-</span> <br><span style='font-family:"Calibri",sans-serif'>>> a42.dts b/target/linux/ipq40xx/files-4.14/arch/arm/boot/dts/qcom-ipq4018-</span> <br><span style='font-family:"Calibri",sans-serif'>>> a42.dts</span> <br><span style='font-family:"Calibri",sans-serif'>>> +index 20330afc66..f0fb05a801 100644</span> <br><span style='font-family:"Calibri",sans-serif'>>> +--- a/target/linux/ipq40xx/files-4.14/arch/arm/boot/dts/qcom-ipq4018-a42.dts</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++++ b/target/linux/ipq40xx/files-4.14/arch/arm/boot/dts/qcom-ipq4018-</span> <br><span style='font-family:"Calibri",sans-serif'>>> a42.dts</span> <br><span style='font-family:"Calibri",sans-serif'>>> +@@ -185,22 +185,6 @@</span> <br><span style='font-family:"Calibri",sans-serif'>>> +    status = "okay";</span> <br><span style='font-family:"Calibri",sans-serif'>>> + };</span> <br><span style='font-family:"Calibri",sans-serif'>>> +</span> <br><span style='font-family:"Calibri",sans-serif'>>> +-&gmac0 {</span> <br><span style='font-family:"Calibri",sans-serif'>>> +-   qcom,phy_mdio_addr = <4>;</span> <br><span style='font-family:"Calibri",sans-serif'>>> +-   qcom,poll_required = <1>;</span> <br><span style='font-family:"Calibri",sans-serif'>>> +-   qcom,forced_speed = <1000>;</span> <br><span style='font-family:"Calibri",sans-serif'>>> +-   qcom,forced_duplex = <1>;</span> <br><span style='font-family:"Calibri",sans-serif'>>> +-   vlan_tag = <2 0x20>;</span> <br><span style='font-family:"Calibri",sans-serif'>>> +-};</span> <br><span style='font-family:"Calibri",sans-serif'>>> +-</span> <br><span style='font-family:"Calibri",sans-serif'>>> +-&gmac1 {</span> <br><span style='font-family:"Calibri",sans-serif'>>> +-   qcom,phy_mdio_addr = <3>;</span> <br><span style='font-family:"Calibri",sans-serif'>>> +-   qcom,poll_required = <1>;</span> <br><span style='font-family:"Calibri",sans-serif'>>> +-   qcom,forced_speed = <1000>;</span> <br><span style='font-family:"Calibri",sans-serif'>>> +-   qcom,forced_duplex = <1>;</span> <br><span style='font-family:"Calibri",sans-serif'>>> +-   vlan_tag = <1 0x10>;</span> <br><span style='font-family:"Calibri",sans-serif'>>> +-};</span> <br><span style='font-family:"Calibri",sans-serif'>>> +-</span> <br><span style='font-family:"Calibri",sans-serif'>>> + &usb2_hs_phy {</span> <br><span style='font-family:"Calibri",sans-serif'>>> +    status = "okay";</span> <br><span style='font-family:"Calibri",sans-serif'>>> + };</span> <br><span style='font-family:"Calibri",sans-serif'>>> +diff --git a/target/linux/ipq40xx/files-4.14/arch/arm/boot/dts/qcom-ipq4018-</span> <br><span style='font-family:"Calibri",sans-serif'>>> jalapeno.dts b/target/linux/ipq40xx/files-4.14/arch/arm/boot/dts/qcom-</span> <br><span style='font-family:"Calibri",sans-serif'>>> ipq4018-jalapeno.dts</span> <br><span style='font-family:"Calibri",sans-serif'>>> +index ee203b0f1e..fd871f2985 100644</span> <br><span style='font-family:"Calibri",sans-serif'>>> +--- a/target/linux/ipq40xx/files-4.14/arch/arm/boot/dts/qcom-ipq4018-</span> <br><span style='font-family:"Calibri",sans-serif'>>> jalapeno.dts</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++++ b/target/linux/ipq40xx/files-4.14/arch/arm/boot/dts/qcom-ipq4018-</span> <br><span style='font-family:"Calibri",sans-serif'>>> jalapeno.dts</span> <br><span style='font-family:"Calibri",sans-serif'>>> +@@ -230,20 +230,6 @@</span> <br><span style='font-family:"Calibri",sans-serif'>>> +    status = "okay";</span> <br><span style='font-family:"Calibri",sans-serif'>>> + };</span> <br><span style='font-family:"Calibri",sans-serif'>>> +</span> <br><span style='font-family:"Calibri",sans-serif'>>> +-&gmac0 {</span> <br><span style='font-family:"Calibri",sans-serif'>>> +-   qcom,poll_required = <1>;</span> <br><span style='font-family:"Calibri",sans-serif'>>> +-   qcom,poll_required_dynamic = <1>;</span> <br><span style='font-family:"Calibri",sans-serif'>>> +-   qcom,phy_mdio_addr = <3>;</span> <br><span style='font-family:"Calibri",sans-serif'>>> +-   vlan_tag = <1 0x10>;</span> <br><span style='font-family:"Calibri",sans-serif'>>> +-};</span> <br><span style='font-family:"Calibri",sans-serif'>>> +-</span> <br><span style='font-family:"Calibri",sans-serif'>>> +-&gmac1 {</span> <br><span style='font-family:"Calibri",sans-serif'>>> +-   qcom,poll_required = <1>;</span> <br><span style='font-family:"Calibri",sans-serif'>>> +-   qcom,poll_required_dynamic = <1>;</span> <br><span style='font-family:"Calibri",sans-serif'>>> +-   qcom,phy_mdio_addr = <4>;</span> <br><span style='font-family:"Calibri",sans-serif'>>> +-   vlan_tag = <2 0x20>;</span> <br><span style='font-family:"Calibri",sans-serif'>>> +-};</span> <br><span style='font-family:"Calibri",sans-serif'>>> +-</span> <br><span style='font-family:"Calibri",sans-serif'>>> + &wifi0 {</span> <br><span style='font-family:"Calibri",sans-serif'>>> +    status = "okay";</span> <br><span style='font-family:"Calibri",sans-serif'>>> +    qcom,ath10k-calibration-variant = "8devices-Jalapeno";</span> <br><span style='font-family:"Calibri",sans-serif'>>> +diff --git a/target/linux/ipq40xx/files-4.14/arch/arm/boot/dts/qcom-ipq4019-</span> <br><span style='font-family:"Calibri",sans-serif'>>> a62.dts b/target/linux/ipq40xx/files-4.14/arch/arm/boot/dts/qcom-ipq4019-</span> <br><span style='font-family:"Calibri",sans-serif'>>> a62.dts</span> <br><span style='font-family:"Calibri",sans-serif'>>> +index dd6d6bd775..8e0f6f4e0c 100644</span> <br><span style='font-family:"Calibri",sans-serif'>>> +--- a/target/linux/ipq40xx/files-4.14/arch/arm/boot/dts/qcom-ipq4019-a62.dts</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++++ b/target/linux/ipq40xx/files-4.14/arch/arm/boot/dts/qcom-ipq4019-</span> <br><span style='font-family:"Calibri",sans-serif'>>> a62.dts</span> <br><span style='font-family:"Calibri",sans-serif'>>> +@@ -195,14 +195,6 @@</span> <br><span style='font-family:"Calibri",sans-serif'>>> +    status = "okay";</span> <br><span style='font-family:"Calibri",sans-serif'>>> + };</span> <br><span style='font-family:"Calibri",sans-serif'>>> +</span> <br><span style='font-family:"Calibri",sans-serif'>>> +-&gmac0 {</span> <br><span style='font-family:"Calibri",sans-serif'>>> +-   qcom,phy_mdio_addr = <3>;</span> <br><span style='font-family:"Calibri",sans-serif'>>> +-   qcom,poll_required = <1>;</span> <br><span style='font-family:"Calibri",sans-serif'>>> +-   qcom,forced_speed = <1000>;</span> <br><span style='font-family:"Calibri",sans-serif'>>> +-   qcom,forced_duplex = <1>;</span> <br><span style='font-family:"Calibri",sans-serif'>>> +-   vlan_tag = <1 0x10>;</span> <br><span style='font-family:"Calibri",sans-serif'>>> +-};</span> <br><span style='font-family:"Calibri",sans-serif'>>> +-</span> <br><span style='font-family:"Calibri",sans-serif'>>> + &usb2_hs_phy {</span> <br><span style='font-family:"Calibri",sans-serif'>>> +    status = "okay";</span> <br><span style='font-family:"Calibri",sans-serif'>>> + };</span> <br><span style='font-family:"Calibri",sans-serif'>>> +diff --git a/target/linux/ipq40xx/files-4.14/arch/arm/boot/dts/qcom-ipq4028-</span> <br><span style='font-family:"Calibri",sans-serif'>>> wpj428.dts b/target/linux/ipq40xx/files-4.14/arch/arm/boot/dts/qcom-ipq4028-</span> <br><span style='font-family:"Calibri",sans-serif'>>> wpj428.dts</span> <br><span style='font-family:"Calibri",sans-serif'>>> +index f9f0f96ae9..79d0d22ab7 100644</span> <br><span style='font-family:"Calibri",sans-serif'>>> +--- a/target/linux/ipq40xx/files-4.14/arch/arm/boot/dts/qcom-ipq4028-</span> <br><span style='font-family:"Calibri",sans-serif'>>> wpj428.dts</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++++ b/target/linux/ipq40xx/files-4.14/arch/arm/boot/dts/qcom-ipq4028-</span> <br><span style='font-family:"Calibri",sans-serif'>>> wpj428.dts</span> <br><span style='font-family:"Calibri",sans-serif'>>> +@@ -233,22 +233,6 @@</span> <br><span style='font-family:"Calibri",sans-serif'>>> +    status = "okay";</span> <br><span style='font-family:"Calibri",sans-serif'>>> + };</span> <br><span style='font-family:"Calibri",sans-serif'>>> +</span> <br><span style='font-family:"Calibri",sans-serif'>>> +-&gmac0 {</span> <br><span style='font-family:"Calibri",sans-serif'>>> +-   qcom,phy_mdio_addr = <4>;</span> <br><span style='font-family:"Calibri",sans-serif'>>> +-   qcom,poll_required = <1>;</span> <br><span style='font-family:"Calibri",sans-serif'>>> +-   qcom,forced_speed = <1000>;</span> <br><span style='font-family:"Calibri",sans-serif'>>> +-   qcom,forced_duplex = <1>;</span> <br><span style='font-family:"Calibri",sans-serif'>>> +-   vlan_tag = <2 0x20>;</span> <br><span style='font-family:"Calibri",sans-serif'>>> +-};</span> <br><span style='font-family:"Calibri",sans-serif'>>> +-</span> <br><span style='font-family:"Calibri",sans-serif'>>> +-&gmac1 {</span> <br><span style='font-family:"Calibri",sans-serif'>>> +-   qcom,phy_mdio_addr = <3>;</span> <br><span style='font-family:"Calibri",sans-serif'>>> +-   qcom,poll_required = <1>;</span> <br><span style='font-family:"Calibri",sans-serif'>>> +-   qcom,forced_speed = <1000>;</span> <br><span style='font-family:"Calibri",sans-serif'>>> +-   qcom,forced_duplex = <1>;</span> <br><span style='font-family:"Calibri",sans-serif'>>> +-   vlan_tag = <1 0x10>;</span> <br><span style='font-family:"Calibri",sans-serif'>>> +-};</span> <br><span style='font-family:"Calibri",sans-serif'>>> +-</span> <br><span style='font-family:"Calibri",sans-serif'>>> + &usb3_ss_phy {</span> <br><span style='font-family:"Calibri",sans-serif'>>> +    status = "okay";</span> <br><span style='font-family:"Calibri",sans-serif'>>> + };</span> <br><span style='font-family:"Calibri",sans-serif'>>> +diff --git a/target/linux/ipq40xx/files-4.14/arch/arm/boot/dts/qcom-ipq4029-</span> <br><span style='font-family:"Calibri",sans-serif'>>> mr33.dts b/target/linux/ipq40xx/files-4.14/arch/arm/boot/dts/qcom-ipq4029-</span> <br><span style='font-family:"Calibri",sans-serif'>>> mr33.dts</span> <br><span style='font-family:"Calibri",sans-serif'>>> +index 0be1960655..c913b3c354 100644</span> <br><span style='font-family:"Calibri",sans-serif'>>> +--- a/target/linux/ipq40xx/files-4.14/arch/arm/boot/dts/qcom-ipq4029-</span> <br><span style='font-family:"Calibri",sans-serif'>>> mr33.dts</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++++ b/target/linux/ipq40xx/files-4.14/arch/arm/boot/dts/qcom-ipq4029-</span> <br><span style='font-family:"Calibri",sans-serif'>>> mr33.dts</span> <br><span style='font-family:"Calibri",sans-serif'>>> +@@ -97,14 +97,19 @@</span> <br><span style='font-family:"Calibri",sans-serif'>>> +</span> <br><span style='font-family:"Calibri",sans-serif'>>> +            ess-switch@c000000 {</span> <br><span style='font-family:"Calibri",sans-serif'>>> +                    switch_mac_mode = <0x3>; /* mac mode for RGMII</span> <br><span style='font-family:"Calibri",sans-serif'>>> RMII */</span> <br><span style='font-family:"Calibri",sans-serif'>>> +-                   switch_lan_bmp = <0x0>; /* lan port bitmap */</span> <br><span style='font-family:"Calibri",sans-serif'>>> +-                   switch_wan_bmp = <0x10>; /* wan port bitmap */</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++                   mdio {</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++                           #address-cells = <1>;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++                           #size-cells = <0>;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++                           phy: phy4@4 {</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++                                   reg = <4>;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++                           };</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++                   };</span> <br><span style='font-family:"Calibri",sans-serif'>>> +            };</span> <br><span style='font-family:"Calibri",sans-serif'>>> +</span> <br><span style='font-family:"Calibri",sans-serif'>>> +            edma@c080000 {</span> <br><span style='font-family:"Calibri",sans-serif'>>> +-                   qcom,single-phy;</span> <br><span style='font-family:"Calibri",sans-serif'>>> +-                   qcom,num_gmac = <1>;</span> <br><span style='font-family:"Calibri",sans-serif'>>> +                    phy-mode = "rgmii-rxid";</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++                   phy-handle = <&phy>;</span> <br><span style='font-family:"Calibri",sans-serif'>>> +                    status = "okay";</span> <br><span style='font-family:"Calibri",sans-serif'>>> +            };</span> <br><span style='font-family:"Calibri",sans-serif'>>> +    };</span> <br><span style='font-family:"Calibri",sans-serif'>>> +@@ -138,12 +143,6 @@</span> <br><span style='font-family:"Calibri",sans-serif'>>> +    status = "okay";</span> <br><span style='font-family:"Calibri",sans-serif'>>> + };</span> <br><span style='font-family:"Calibri",sans-serif'>>> +</span> <br><span style='font-family:"Calibri",sans-serif'>>> +-&gmac0 {</span> <br><span style='font-family:"Calibri",sans-serif'>>> +-   qcom,phy_mdio_addr = <1>;</span> <br><span style='font-family:"Calibri",sans-serif'>>> +-   qcom,poll_required = <1>;</span> <br><span style='font-family:"Calibri",sans-serif'>>> +-   vlan_tag = <0 0x20>;</span> <br><span style='font-family:"Calibri",sans-serif'>>> +-};</span> <br><span style='font-family:"Calibri",sans-serif'>>> +-</span> <br><span style='font-family:"Calibri",sans-serif'>>> + &i2c_0 {</span> <br><span style='font-family:"Calibri",sans-serif'>>> +    pinctrl-0 = <&i2c_0_pins>;</span> <br><span style='font-family:"Calibri",sans-serif'>>> +    pinctrl-names = "default";</span> <br><span style='font-family:"Calibri",sans-serif'>>> +--</span> <br><span style='font-family:"Calibri",sans-serif'>>> +2.11.0</span> <br><span style='font-family:"Calibri",sans-serif'>>> +</span> <br><span style='font-family:"Calibri",sans-serif'>>> diff --git a/build_patches/openwrt/0008-Enable-QinQ-on-the-switch.patch</span> <br><span style='font-family:"Calibri",sans-serif'>>> b/build_patches/openwrt/0008-Enable-QinQ-on-the-switch.patch</span> <br><span style='font-family:"Calibri",sans-serif'>>> new file mode 100644</span> <br><span style='font-family:"Calibri",sans-serif'>>> index 0000000..8e9ce77</span> <br><span style='font-family:"Calibri",sans-serif'>>> --- /dev/null</span> <br><span style='font-family:"Calibri",sans-serif'>>> +++ b/build_patches/openwrt/0008-Enable-QinQ-on-the-switch.patch</span> <br><span style='font-family:"Calibri",sans-serif'>>> @@ -0,0 +1,106 @@</span> <br><span style='font-family:"Calibri",sans-serif'>>> +From 57f78fa2d1d5175ce3e55c3e786b7a768eb0e56f Mon Sep 17 00:00:00 2001</span> <br><span style='font-family:"Calibri",sans-serif'>>> +From: Christian Dresel <fff@chrisi01.de></span> <br><span style='font-family:"Calibri",sans-serif'>>> +Date: Sat, 24 Nov 2018 00:28:58 +0100</span> <br><span style='font-family:"Calibri",sans-serif'>>> +Subject: [PATCH] Enable-QinQ-on-the-switch</span> <br><span style='font-family:"Calibri",sans-serif'>>> +</span> <br><span style='font-family:"Calibri",sans-serif'>>> +Signed-off-by: Christian Dresel <fff@chrisi01.de></span> <br><span style='font-family:"Calibri",sans-serif'>>> +---</span> <br><span style='font-family:"Calibri",sans-serif'>>> + .../715-ar40xx-Enable-QinQ-on-the-switch.patch     | 86</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++++++++++++++++++++++</span> <br><span style='font-family:"Calibri",sans-serif'>>> + 1 file changed, 86 insertions(+)</span> <br><span style='font-family:"Calibri",sans-serif'>>> + create mode 100644 target/linux/ipq40xx/patches-4.14/715-ar40xx-Enable-</span> <br><span style='font-family:"Calibri",sans-serif'>>> QinQ-on-the-switch.patch</span> <br><span style='font-family:"Calibri",sans-serif'>>> +</span> <br><span style='font-family:"Calibri",sans-serif'>>> +diff --git a/target/linux/ipq40xx/patches-4.14/715-ar40xx-Enable-QinQ-on-the-</span> <br><span style='font-family:"Calibri",sans-serif'>>> switch.patch b/target/linux/ipq40xx/patches-4.14/715-ar40xx-Enable-QinQ-on-</span> <br><span style='font-family:"Calibri",sans-serif'>>> the-switch.patch</span> <br><span style='font-family:"Calibri",sans-serif'>>> +new file mode 100644</span> <br><span style='font-family:"Calibri",sans-serif'>>> +index 0000000000..c8edcbf5bc</span> <br><span style='font-family:"Calibri",sans-serif'>>> +--- /dev/null</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++++ b/target/linux/ipq40xx/patches-4.14/715-ar40xx-Enable-QinQ-on-the-</span> <br><span style='font-family:"Calibri",sans-serif'>>> switch.patch</span> <br><span style='font-family:"Calibri",sans-serif'>>> +@@ -0,0 +1,86 @@</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++From: Sven Eckelmann <sven@narfation.org></span> <br><span style='font-family:"Calibri",sans-serif'>>> ++Date: Fri, 17 Mar 2017 11:04:50 +0100</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++Subject: [PATCH] ar40xx: Enable QinQ on the switch</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++The switch used in by IPQ40xx is using VLANs by default to select the</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++outgoing port. It was therefore not possible to sent or receive 802.1q</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++tagged frames over the CPU port. This can be allowed by changing the port</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++configuration and lookup configuration.</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++The resulting VLAN-tagged frames send or received by the CPU will therefore</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++look like QinQ frames. The outer VLAN tag is the port-VLAN of the port from</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++which the data was received or towards which the data has to be sent. The</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++inner VLAN tag (when it exists) is the VLAN which was configrued on top of</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++the ethernet device.</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++---</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++diff --git a/drivers/net/phy/ar40xx.c b/drivers/net/phy/ar40xx.c</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++--- a/drivers/net/phy/ar40xx.c</span> <br><span style='font-family:"Calibri",sans-serif'>>> +++++ b/drivers/net/phy/ar40xx.c</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++@@ -1246,6 +1246,10 @@ ar40xx_init_globals(struct ar40xx_priv *priv)</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   t = (AR40XX_PORT0_FC_THRESH_ON_DFLT << 16) |</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++         AR40XX_PORT0_FC_THRESH_OFF_DFLT;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   ar40xx_write(priv, AR40XX_REG_PORT_FLOWCTRL_THRESH(0), t);</span> <br><span style='font-family:"Calibri",sans-serif'>>> +++</span> <br><span style='font-family:"Calibri",sans-serif'>>> +++  /* set service tag to 802.1q */</span> <br><span style='font-family:"Calibri",sans-serif'>>> +++  //t = ETH_P_8021Q | AR40XX_ESS_SERVICE_TAG_STAG;</span> <br><span style='font-family:"Calibri",sans-serif'>>> +++  //ar40xx_write(priv, AR40XX_ESS_SERVICE_TAG, t);</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++ }</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++ static void</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++@@ -1571,7 +1575,11 @@ ar40xx_setup_port(struct ar40xx_priv *priv, int</span> <br><span style='font-family:"Calibri",sans-serif'>>> port, u32 members)</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   u32 pvid = priv->vlan_id[priv->pvid[port]];</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   if (priv->vlan) {</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++-          egress = AR40XX_PORT_VLAN1_OUT_MODE_UNMOD;</span> <br><span style='font-family:"Calibri",sans-serif'>>> +++          //if (priv->vlan_tagged & BIT(port))</span> <br><span style='font-family:"Calibri",sans-serif'>>> +++          //      egress = AR40XX_PORT_VLAN1_OUT_MODE_TAG;</span> <br><span style='font-family:"Calibri",sans-serif'>>> +++          //else</span> <br><span style='font-family:"Calibri",sans-serif'>>> +++                  egress = AR40XX_PORT_VLAN1_OUT_MODE_UNMOD;</span> <br><span style='font-family:"Calibri",sans-serif'>>> +++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++           ingress = AR40XX_IN_SECURE;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   } else {</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++           egress = AR40XX_PORT_VLAN1_OUT_MODE_UNTOUCH;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++@@ -1582,8 +1590,17 @@ ar40xx_setup_port(struct ar40xx_priv *priv, int</span> <br><span style='font-family:"Calibri",sans-serif'>>> port, u32 members)</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   t |= pvid << AR40XX_PORT_VLAN0_DEF_CVID_S;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   ar40xx_write(priv, AR40XX_REG_PORT_VLAN0(port), t);</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++-  t = AR40XX_PORT_VLAN1_PORT_VLAN_PROP;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++-  t |= egress << AR40XX_PORT_VLAN1_OUT_MODE_S;</span> <br><span style='font-family:"Calibri",sans-serif'>>> +++  t = egress << AR40XX_PORT_VLAN1_OUT_MODE_S;</span> <br><span style='font-family:"Calibri",sans-serif'>>> +++</span> <br><span style='font-family:"Calibri",sans-serif'>>> +++  ///* set CPU port to core port */</span> <br><span style='font-family:"Calibri",sans-serif'>>> +++  //if (port == 0)</span> <br><span style='font-family:"Calibri",sans-serif'>>> +++  //      t |= AR40XX_PORT_VLAN1_CORE_PORT;</span> <br><span style='font-family:"Calibri",sans-serif'>>> +++</span> <br><span style='font-family:"Calibri",sans-serif'>>> +++  //if (priv->vlan_tagged & BIT(port))</span> <br><span style='font-family:"Calibri",sans-serif'>>> +++          t |= AR40XX_PORT_VLAN1_PORT_VLAN_PROP;</span> <br><span style='font-family:"Calibri",sans-serif'>>> +++  //else</span> <br><span style='font-family:"Calibri",sans-serif'>>> +++  //      t |= AR40XX_PORT_VLAN1_PORT_TLS_MODE;</span> <br><span style='font-family:"Calibri",sans-serif'>>> +++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   ar40xx_write(priv, AR40XX_REG_PORT_VLAN1(port), t);</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++   t = members;</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++diff --git a/drivers/net/phy/ar40xx.h b/drivers/net/phy/ar40xx.h</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++--- a/drivers/net/phy/ar40xx.h</span> <br><span style='font-family:"Calibri",sans-serif'>>> +++++ b/drivers/net/phy/ar40xx.h</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++@@ -151,6 +151,9 @@ struct ar40xx_mib_desc {</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++ #define   AR40XX_MIB_FUNC_NO_OP           0x0</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++ #define   AR40XX_MIB_FUNC_FLUSH           0x1</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> +++#define AR40XX_ESS_SERVICE_TAG            0x48</span> <br><span style='font-family:"Calibri",sans-serif'>>> +++#define AR40XX_ESS_SERVICE_TAG_STAG       BIT(17)</span> <br><span style='font-family:"Calibri",sans-serif'>>> +++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++ #define AR40XX_REG_PORT_STATUS(_i)                (0x07c + (_i) * 4)</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++ #define   AR40XX_PORT_SPEED                       BITS(0, 2)</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++ #define   AR40XX_PORT_STATUS_SPEED_S      0</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++@@ -179,6 +182,8 @@ struct ar40xx_mib_desc {</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++ #define   AR40XX_PORT_VLAN0_DEF_CVID_S            16</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++ #define AR40XX_REG_PORT_VLAN1(_i)         (0x424 + (_i) * 0x8)</span> <br><span style='font-family:"Calibri",sans-serif'>>> +++#define   AR40XX_PORT_VLAN1_CORE_PORT             BIT(9)</span> <br><span style='font-family:"Calibri",sans-serif'>>> +++#define   AR40XX_PORT_VLAN1_PORT_TLS_MODE BIT(7)</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++ #define   AR40XX_PORT_VLAN1_PORT_VLAN_PROP        BIT(6)</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++ #define   AR40XX_PORT_VLAN1_OUT_MODE              BITS(12, 2)</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++ #define   AR40XX_PORT_VLAN1_OUT_MODE_S            12</span> <br><span style='font-family:"Calibri",sans-serif'>>> +--</span> <br><span style='font-family:"Calibri",sans-serif'>>> +2.11.0</span> <br><span style='font-family:"Calibri",sans-serif'>>> +</span> <br><span style='font-family:"Calibri",sans-serif'>>> diff --git a/build_patches/openwrt/0009-enable-IPQ_ESS.patch</span> <br><span style='font-family:"Calibri",sans-serif'>>> b/build_patches/openwrt/0009-enable-IPQ_ESS.patch</span> <br><span style='font-family:"Calibri",sans-serif'>>> new file mode 100644</span> <br><span style='font-family:"Calibri",sans-serif'>>> index 0000000..8471930</span> <br><span style='font-family:"Calibri",sans-serif'>>> --- /dev/null</span> <br><span style='font-family:"Calibri",sans-serif'>>> +++ b/build_patches/openwrt/0009-enable-IPQ_ESS.patch</span> <br><span style='font-family:"Calibri",sans-serif'>>> @@ -0,0 +1,23 @@</span> <br><span style='font-family:"Calibri",sans-serif'>>> +From a9373adae4503b84c73d1f095b26683ac5e7063b Mon Sep 17 00:00:00 2001</span> <br><span style='font-family:"Calibri",sans-serif'>>> +From: Christian Dresel <fff@chrisi01.de></span> <br><span style='font-family:"Calibri",sans-serif'>>> +Date: Sat, 24 Nov 2018 23:34:58 +0100</span> <br><span style='font-family:"Calibri",sans-serif'>>> +Subject: [PATCH] enable IPQ_ESS</span> <br><span style='font-family:"Calibri",sans-serif'>>> +</span> <br><span style='font-family:"Calibri",sans-serif'>>> +Signed-off-by: Christian Dresel <fff@chrisi01.de></span> <br><span style='font-family:"Calibri",sans-serif'>>> +---</span> <br><span style='font-family:"Calibri",sans-serif'>>> + target/linux/ipq40xx/config-4.14 | 1 +</span> <br><span style='font-family:"Calibri",sans-serif'>>> + 1 file changed, 1 insertion(+)</span> <br><span style='font-family:"Calibri",sans-serif'>>> +</span> <br><span style='font-family:"Calibri",sans-serif'>>> +diff --git a/target/linux/ipq40xx/config-4.14 b/target/linux/ipq40xx/config-4.14</span> <br><span style='font-family:"Calibri",sans-serif'>>> +index fa52d58bed..184e8fd5fb 100644</span> <br><span style='font-family:"Calibri",sans-serif'>>> +--- a/target/linux/ipq40xx/config-4.14</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++++ b/target/linux/ipq40xx/config-4.14</span> <br><span style='font-family:"Calibri",sans-serif'>>> +@@ -482,3 +482,4 @@ CONFIG_ZBOOT_ROM_BSS=0</span> <br><span style='font-family:"Calibri",sans-serif'>>> + CONFIG_ZBOOT_ROM_TEXT=0</span> <br><span style='font-family:"Calibri",sans-serif'>>> + CONFIG_ZLIB_DEFLATE=y</span> <br><span style='font-family:"Calibri",sans-serif'>>> + CONFIG_ZLIB_INFLATE=y</span> <br><span style='font-family:"Calibri",sans-serif'>>> ++CONFIG_IPQ_ESS=y</span> <br><span style='font-family:"Calibri",sans-serif'>>> +\ No newline at end of file</span> <br><span style='font-family:"Calibri",sans-serif'>>> +--</span> <br><span style='font-family:"Calibri",sans-serif'>>> +2.11.0</span> <br><span style='font-family:"Calibri",sans-serif'>>> +</span> <br><span style='font-family:"Calibri",sans-serif'>>> diff --git a/buildscript b/buildscript</span> <br><span style='font-family:"Calibri",sans-serif'>>> index f8d435c..df82a36 100755</span> <br><span style='font-family:"Calibri",sans-serif'>>> --- a/buildscript</span> <br><span style='font-family:"Calibri",sans-serif'>>> +++ b/buildscript</span> <br><span style='font-family:"Calibri",sans-serif'>>> @@ -279,10 +279,10 @@ cp_firmware() {</span> <br><span style='font-family:"Calibri",sans-serif'>>>          filename_build=${filename_build//tiny/t}</span> <br><span style='font-family:"Calibri",sans-serif'>>>          cp "$target/bin/targets/${chipset}/${subtarget}/$image"</span> <br><span style='font-family:"Calibri",sans-serif'>>> "./bin/$filename_build"</span> <br><span style='font-family:"Calibri",sans-serif'>>></span> <br><span style='font-family:"Calibri",sans-serif'>>> -        for region in "" "-eu" "-us"; do</span> <br><span style='font-family:"Calibri",sans-serif'>>> -            image_factory=${image/sysupgrade/factory$region}</span> <br><span style='font-family:"Calibri",sans-serif'>>> +        for factory in "factory" "factory-eu" "factory-us" "eva"; do</span> <br><span style='font-family:"Calibri",sans-serif'>>> +            image_factory=${image/sysupgrade/$factory}</span> <br><span style='font-family:"Calibri",sans-serif'>>>              if [[ -f "$target/bin/targets/${chipset}/${subtarget}/$image_factory" ]];</span> <br><span style='font-family:"Calibri",sans-serif'>>> then</span> <br><span style='font-family:"Calibri",sans-serif'>>> -              filename_build_factory=${filename_build/sysupgrade/factory$region}</span> <br><span style='font-family:"Calibri",sans-serif'>>> +              filename_build_factory=${filename_build/sysupgrade/$factory}</span> <br><span style='font-family:"Calibri",sans-serif'>>>                if [ ${#image_factory} -lt ${#filename_build_factory} ]; then</span> <br><span style='font-family:"Calibri",sans-serif'>>>                  echo "Warning: The factory image file name</span> <br><span style='font-family:"Calibri",sans-serif'>>> (${filename_build_factory}) is longer than the OpenWrt one, which might lead</span> <br><span style='font-family:"Calibri",sans-serif'>>> to incompatibility with the stock firmware."</span> <br><span style='font-family:"Calibri",sans-serif'>>>                fi</span> <br><span style='font-family:"Calibri",sans-serif'>>> diff --git a/src/packages/fff/fff-boardname/files/etc/uci-defaults/50-fff-</span> <br><span style='font-family:"Calibri",sans-serif'>>> boardname b/src/packages/fff/fff-boardname/files/etc/uci-defaults/50-fff-</span> <br><span style='font-family:"Calibri",sans-serif'>>> boardname</span> <br><span style='font-family:"Calibri",sans-serif'>>> index ee9c3d3..75f8ee8 100644</span> <br><span style='font-family:"Calibri",sans-serif'>>> --- a/src/packages/fff/fff-boardname/files/etc/uci-defaults/50-fff-boardname</span> <br><span style='font-family:"Calibri",sans-serif'>>> +++ b/src/packages/fff/fff-boardname/files/etc/uci-defaults/50-fff-boardname</span> <br><span style='font-family:"Calibri",sans-serif'>>> @@ -70,6 +70,9 @@ case "$BOARD" in</span> <br><span style='font-family:"Calibri",sans-serif'>>>      archer-c7)</span> <br><span style='font-family:"Calibri",sans-serif'>>>          BOARD=archer-c7-v2</span> <br><span style='font-family:"Calibri",sans-serif'>>>          ;;</span> <br><span style='font-family:"Calibri",sans-serif'>>> +    avm,fritzbox-4040)</span> <br><span style='font-family:"Calibri",sans-serif'>>> +        BOARD=avm_fritzbox-4040</span> <br><span style='font-family:"Calibri",sans-serif'>>> +        ;;</span> <br><span style='font-family:"Calibri",sans-serif'>>>  esac</span> <br><span style='font-family:"Calibri",sans-serif'>>></span> <br><span style='font-family:"Calibri",sans-serif'>>>  uci set board.model.name=$BOARD</span> <br><span style='font-family:"Calibri",sans-serif'>>> diff --git a/src/packages/fff/fff-network/ipq40xx/network.avm_fritzbox-4040</span> <br><span style='font-family:"Calibri",sans-serif'>>> b/src/packages/fff/fff-network/ipq40xx/network.avm_fritzbox-4040</span> <br><span style='font-family:"Calibri",sans-serif'>>> new file mode 100644</span> <br><span style='font-family:"Calibri",sans-serif'>>> index 0000000..80ec186</span> <br><span style='font-family:"Calibri",sans-serif'>>> --- /dev/null</span> <br><span style='font-family:"Calibri",sans-serif'>>> +++ b/src/packages/fff/fff-network/ipq40xx/network.avm_fritzbox-4040</span> <br><span style='font-family:"Calibri",sans-serif'>>> @@ -0,0 +1,8 @@</span> <br><span style='font-family:"Calibri",sans-serif'>>> +WANDEV=eth0</span> <br><span style='font-family:"Calibri",sans-serif'>>> +SWITCHDEV=eth0</span> <br><span style='font-family:"Calibri",sans-serif'>>> +CLIENT_PORTS="3 4 0t"</span> <br><span style='font-family:"Calibri",sans-serif'>>> +WAN_PORTS="5 0t"</span> <br><span style='font-family:"Calibri",sans-serif'>>> +BATMAN_PORTS="1 2 0t"</span> <br><span style='font-family:"Calibri",sans-serif'>>> +</span> <br><span style='font-family:"Calibri",sans-serif'>>> +ROUTERMAC=$(cat /sys/class/net/eth0/address)</span> <br><span style='font-family:"Calibri",sans-serif'>>> +</span> <br><span style='font-family:"Calibri",sans-serif'>>> diff --git a/src/packages/fff/fff-sysupgrade/files/etc/sysupgrade.sh</span> <br><span style='font-family:"Calibri",sans-serif'>>> b/src/packages/fff/fff-sysupgrade/files/etc/sysupgrade.sh</span> <br><span style='font-family:"Calibri",sans-serif'>>> index 87ac48a..6241514 100755</span> <br><span style='font-family:"Calibri",sans-serif'>>> --- a/src/packages/fff/fff-sysupgrade/files/etc/sysupgrade.sh</span> <br><span style='font-family:"Calibri",sans-serif'>>> +++ b/src/packages/fff/fff-sysupgrade/files/etc/sysupgrade.sh</span> <br><span style='font-family:"Calibri",sans-serif'>>> @@ -19,6 +19,9 @@ case $BOARD in</span> <br><span style='font-family:"Calibri",sans-serif'>>>      tl-wdr4900-v1 )</span> <br><span style='font-family:"Calibri",sans-serif'>>>          SOC="mpc85xx-g"</span> <br><span style='font-family:"Calibri",sans-serif'>>>          ;;</span> <br><span style='font-family:"Calibri",sans-serif'>>> +    avm_fritzbox-4040 )</span> <br><span style='font-family:"Calibri",sans-serif'>>> +        SOC="ipq40xx"</span> <br><span style='font-family:"Calibri",sans-serif'>>> +        ;;</span> <br><span style='font-family:"Calibri",sans-serif'>>>      * )</span> <br><span style='font-family:"Calibri",sans-serif'>>>          SOC="ar71xx-t"</span> <br><span style='font-family:"Calibri",sans-serif'>>>          ;;</span> <br><span style='font-family:"Calibri",sans-serif'>>> --</span> <br><span style='font-family:"Calibri",sans-serif'>>> 2.11.0</span> <o:p></o:p></p><div style='border:none;border-left:solid blue 1.5pt;padding:0cm 0cm 0cm 4.0pt'><p class=MsoNormal style='margin-bottom:12.0pt'><o:p> </o:p></p></div></div></div></body></html>