<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:"Cambria Math";
        panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 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-compose;
        font-family:"Calibri",sans-serif;
        color:windowtext;}
.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'>Okay, das muss man sich mal ansehen.<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 sollte auf jeden Fall ein zweiter Device-Testen; ich würde das machen, wenn mir hinterher jemand das Gerät abnimmt (ich habe im Moment noch genug Router rumliegen).<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'>Macht es Sinn das neu zu kaufen oder gibt es da sinnvolle gebrauchte?<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'> Christian Dresel [mailto:fff@chrisi01.de] <br><b>Sent:</b> Mittwoch, 28. November 2018 14:41<br><b>To:</b> Adrian Schmutzler <mail@adrianschmutzler.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><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><p class=MsoNormal style='margin-bottom:12.0pt'><o:p> </o:p></p></div></div></body></html>