From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-9.8 required=3.0 tests=DKIM_SIGNED,DKIM_VALID, DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH,MAILING_LIST_MULTI, SIGNED_OFF_BY,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED,USER_AGENT_GIT autolearn=unavailable autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 24DA0C76186 for ; Wed, 24 Jul 2019 20:37:20 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id CD2C921734 for ; Wed, 24 Jul 2019 20:37:19 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=vdorst.com header.i=@vdorst.com header.b="B4Bmmk+X" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727529AbfGXUhM (ORCPT ); Wed, 24 Jul 2019 16:37:12 -0400 Received: from mx.0dd.nl ([5.2.79.48]:52796 "EHLO mx.0dd.nl" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S2387901AbfGXTYB (ORCPT ); Wed, 24 Jul 2019 15:24:01 -0400 Received: from mail.vdorst.com (mail.vdorst.com [IPv6:fd01::250]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx.0dd.nl (Postfix) with ESMTPS id A07045FD5A; Wed, 24 Jul 2019 21:23:56 +0200 (CEST) Authentication-Results: mx.0dd.nl; dkim=pass (2048-bit key) header.d=vdorst.com header.i=@vdorst.com header.b="B4Bmmk+X"; dkim-atps=neutral Received: from pc-rene.vdorst.com (pc-rene.vdorst.com [192.168.2.125]) by mail.vdorst.com (Postfix) with ESMTPA id 4FF1B1D25CF2; Wed, 24 Jul 2019 21:23:56 +0200 (CEST) DKIM-Filter: OpenDKIM Filter v2.11.0 mail.vdorst.com 4FF1B1D25CF2 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=vdorst.com; s=default; t=1563996236; bh=WqEJudWyE7slXSNqpS7bOFa0CVO/by7eq/vbdr7QicA=; h=From:To:Cc:Subject:Date:From; b=B4Bmmk+XVLNC40j0hjTvAJz35NxaC6lagJdrNeCGEyFb41qKKMQeUHNMkZ+1BsX8n rk1KXTu5pkFvSHIyW9Wo2eZskGLR8SRCDQwLm1snNNXhV/X0mhGF2Mp4hbRFF245s/ 88pFarbFQB2WPF48FO8YiTygBQYF5aSvtRnJwe6JqJcZd3JhrF0mZfPLPXJSBsP+Pb GOPTF/f703I09OaNfiaN/1utC7IUPmz+rT1S+8EUHDcHZ5j0Ww+EJLC2/1JJP6JRT0 fZkmH6eR+Q33Owd1uBiFTBftmtn5b3c1syGIXzPi6aEo/UnBBmTD+uXQS/LzsXy+Cj hmCHseb+8/mPQ== From: =?UTF-8?q?Ren=C3=A9=20van=20Dorst?= To: netdev@vger.kernel.org Cc: frank-w@public-files.de, sean.wang@mediatek.com, f.fainelli@gmail.com, linux@armlinux.org.uk, davem@davemloft.net, matthias.bgg@gmail.com, andrew@lunn.ch, vivien.didelot@gmail.com, john@phrozen.org, linux-mediatek@lists.infradead.org, linux-mips@vger.kernel.org, robh+dt@kernel.org, devicetree@vger.kernel.org, =?UTF-8?q?Ren=C3=A9=20van=20Dorst?= Subject: [PATCH net-next 1/3] net: ethernet: mediatek: Add basic PHYLINK support Date: Wed, 24 Jul 2019 21:23:40 +0200 Message-Id: <20190724192340.18978-1-opensource@vdorst.com> X-Mailer: git-send-email 2.20.1 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Sender: linux-mips-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-mips@vger.kernel.org This convert the basics to PHYLINK API. SGMII support is not in this patch. Signed-off-by: RenĂ© van Dorst Tested-by: Frank Wunderlich --- drivers/net/ethernet/mediatek/Kconfig | 2 +- drivers/net/ethernet/mediatek/mtk_eth_soc.c | 404 +++++++++++--------- drivers/net/ethernet/mediatek/mtk_eth_soc.h | 30 +- 3 files changed, 253 insertions(+), 183 deletions(-) diff --git a/drivers/net/ethernet/mediatek/Kconfig b/drivers/net/ethernet/mediatek/Kconfig index 263cd0909fe0..e20f04d17b49 100644 --- a/drivers/net/ethernet/mediatek/Kconfig +++ b/drivers/net/ethernet/mediatek/Kconfig @@ -10,7 +10,7 @@ if NET_VENDOR_MEDIATEK config NET_MEDIATEK_SOC tristate "MediaTek SoC Gigabit Ethernet support" depends on NET_VENDOR_MEDIATEK - select PHYLIB + select PHYLINK ---help--- This driver supports the gigabit ethernet MACs in the MediaTek SoC family. diff --git a/drivers/net/ethernet/mediatek/mtk_eth_soc.c b/drivers/net/ethernet/mediatek/mtk_eth_soc.c index 597e377d8f20..853929070cb3 100644 --- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c +++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c @@ -18,6 +18,7 @@ #include #include #include +#include #include "mtk_eth_soc.h" @@ -186,165 +187,219 @@ static void mtk_gmac0_rgmii_adjust(struct mtk_eth *eth, int speed) mtk_w32(eth, val, TRGMII_TCK_CTRL); } -static void mtk_phy_link_adjust(struct net_device *dev) +static void mtk_mac_config(struct phylink_config *config, unsigned int mode, + const struct phylink_link_state *state) { - struct mtk_mac *mac = netdev_priv(dev); - u16 lcl_adv = 0, rmt_adv = 0; - u8 flowctrl; - u32 mcr = MAC_MCR_MAX_RX_1536 | MAC_MCR_IPG_CFG | - MAC_MCR_FORCE_MODE | MAC_MCR_TX_EN | - MAC_MCR_RX_EN | MAC_MCR_BACKOFF_EN | - MAC_MCR_BACKPR_EN; + struct mtk_mac *mac = container_of(config, struct mtk_mac, + phylink_config); + struct mtk_eth *eth = mac->hw; - if (unlikely(test_bit(MTK_RESETTING, &mac->hw->state))) - return; + u32 ge_mode = 0, val, mcr_cur, mcr_new; + + if (mac->interface != state->interface) { + /* Setup soc pin functions */ + switch (state->interface) { + case PHY_INTERFACE_MODE_TRGMII: + if (mac->id) + goto err_phy; + if (!MTK_HAS_CAPS(mac->hw->soc->caps, + MTK_GMAC1_TRGMII)) + goto err_phy; + /* fall through */ + case PHY_INTERFACE_MODE_RGMII_TXID: + case PHY_INTERFACE_MODE_RGMII_RXID: + case PHY_INTERFACE_MODE_RGMII_ID: + case PHY_INTERFACE_MODE_RGMII: + break; + case PHY_INTERFACE_MODE_MII: + ge_mode = 1; + break; + case PHY_INTERFACE_MODE_REVMII: + ge_mode = 2; + break; + case PHY_INTERFACE_MODE_RMII: + if (mac->id) + goto err_phy; + ge_mode = 3; + break; + default: + goto err_phy; + } + + /* Setup clock for 1st gmac */ + if (!mac->id && + MTK_HAS_CAPS(mac->hw->soc->caps, MTK_GMAC1_TRGMII)) { + if (MTK_HAS_CAPS(mac->hw->soc->caps, + MTK_TRGMII_MT7621_CLK)) { + if (mt7621_gmac0_rgmii_adjust(mac->hw, + state->interface)) + goto err_phy; + } else { + if (state->interface != + PHY_INTERFACE_MODE_TRGMII) + mtk_gmac0_rgmii_adjust(mac->hw, + state->speed); + } + } - switch (dev->phydev->speed) { + /* put the gmac into the right mode */ + regmap_read(eth->ethsys, ETHSYS_SYSCFG0, &val); + val &= ~SYSCFG0_GE_MODE(SYSCFG0_GE_MASK, mac->id); + val |= SYSCFG0_GE_MODE(ge_mode, mac->id); + regmap_write(eth->ethsys, ETHSYS_SYSCFG0, val); + + mac->interface = state->interface; + } + + /* Setup gmac */ + mcr_cur = mtk_r32(mac->hw, MTK_MAC_MCR(mac->id)); + mcr_new = mcr_cur; + mcr_new &= ~(MAC_MCR_SPEED_100 | MAC_MCR_SPEED_1000 | + MAC_MCR_FORCE_DPX | MAC_MCR_FORCE_TX_FC | + MAC_MCR_FORCE_RX_FC); + mcr_new |= MAC_MCR_MAX_RX_1536 | MAC_MCR_IPG_CFG | MAC_MCR_FORCE_MODE | + MAC_MCR_BACKOFF_EN | MAC_MCR_BACKPR_EN | MAC_MCR_FORCE_LINK; + + switch (state->speed) { case SPEED_1000: - mcr |= MAC_MCR_SPEED_1000; + mcr_new |= MAC_MCR_SPEED_1000; break; case SPEED_100: - mcr |= MAC_MCR_SPEED_100; + mcr_new |= MAC_MCR_SPEED_100; break; } - - if (MTK_HAS_CAPS(mac->hw->soc->caps, MTK_GMAC1_TRGMII) && !mac->id) { - if (MTK_HAS_CAPS(mac->hw->soc->caps, MTK_TRGMII_MT7621_CLK)) { - if (mt7621_gmac0_rgmii_adjust(mac->hw, - dev->phydev->interface)) - return; - } else { - if (!mac->trgmii) - mtk_gmac0_rgmii_adjust(mac->hw, - dev->phydev->speed); - } + if (state->duplex == DUPLEX_FULL) { + mcr_new |= MAC_MCR_FORCE_DPX; + if (state->pause & MLO_PAUSE_TX) + mcr_new |= MAC_MCR_FORCE_TX_FC; + if (state->pause & MLO_PAUSE_RX) + mcr_new |= MAC_MCR_FORCE_RX_FC; } - if (dev->phydev->link) - mcr |= MAC_MCR_FORCE_LINK; + /* Only update control register when needed! */ + if (mcr_new != mcr_cur) + mtk_w32(mac->hw, mcr_new, MTK_MAC_MCR(mac->id)); - if (dev->phydev->duplex) { - mcr |= MAC_MCR_FORCE_DPX; + return; - if (dev->phydev->pause) - rmt_adv = LPA_PAUSE_CAP; - if (dev->phydev->asym_pause) - rmt_adv |= LPA_PAUSE_ASYM; +err_phy: + dev_err(eth->dev, "%s: GMAC%d mode %s not supported!\n", __func__, + mac->id, phy_modes(state->interface)); +} + +static int mtk_mac_link_state(struct phylink_config *config, + struct phylink_link_state *state) +{ + struct mtk_mac *mac = container_of(config, struct mtk_mac, + phylink_config); + u32 pmsr; - lcl_adv = linkmode_adv_to_lcl_adv_t(dev->phydev->advertising); - flowctrl = mii_resolve_flowctrl_fdx(lcl_adv, rmt_adv); + pmsr = mtk_r32(mac->hw, MTK_MAC_MSR(mac->id)); - if (flowctrl & FLOW_CTRL_TX) - mcr |= MAC_MCR_FORCE_TX_FC; - if (flowctrl & FLOW_CTRL_RX) - mcr |= MAC_MCR_FORCE_RX_FC; + state->link = (pmsr & MAC_MSR_LINK); + state->duplex = (pmsr & MAC_MSR_DPX) >> 1; - netif_dbg(mac->hw, link, dev, "rx pause %s, tx pause %s\n", - flowctrl & FLOW_CTRL_RX ? "enabled" : "disabled", - flowctrl & FLOW_CTRL_TX ? "enabled" : "disabled"); + switch (pmsr & (MAC_MSR_SPEED_1000 | MAC_MSR_SPEED_100)) { + case 0: + state->speed = SPEED_10; + break; + case MAC_MSR_SPEED_100: + state->speed = SPEED_100; + break; + case MAC_MSR_SPEED_1000: + state->speed = SPEED_1000; + break; + default: + state->speed = SPEED_UNKNOWN; + break; } - mtk_w32(mac->hw, mcr, MTK_MAC_MCR(mac->id)); + state->pause = 0; + if (pmsr & MAC_MSR_RX_FC) + state->pause |= MLO_PAUSE_RX; + if (pmsr & MAC_MSR_TX_FC) + state->pause |= MLO_PAUSE_TX; - if (!of_phy_is_fixed_link(mac->of_node)) - phy_print_status(dev->phydev); + return 1; } -static int mtk_phy_connect_node(struct mtk_eth *eth, struct mtk_mac *mac, - struct device_node *phy_node) +static void mtk_mac_an_restart(struct phylink_config *config) { - struct phy_device *phydev; - int phy_mode; + /* Do nothing */ +} - phy_mode = of_get_phy_mode(phy_node); - if (phy_mode < 0) { - dev_err(eth->dev, "incorrect phy-mode %d\n", phy_mode); - return -EINVAL; - } +static void mtk_mac_link_down(struct phylink_config *config, unsigned int mode, + phy_interface_t interface) +{ + struct mtk_mac *mac = container_of(config, struct mtk_mac, + phylink_config); - phydev = of_phy_connect(eth->netdev[mac->id], phy_node, - mtk_phy_link_adjust, 0, phy_mode); - if (!phydev) { - dev_err(eth->dev, "could not connect to PHY\n"); - return -ENODEV; - } + mtk_w32(mac->hw, 0x8000, MTK_MAC_MCR(mac->id)); +} - dev_info(eth->dev, - "connected mac %d to PHY at %s [uid=%08x, driver=%s]\n", - mac->id, phydev_name(phydev), phydev->phy_id, - phydev->drv->name); +static void mtk_mac_link_up(struct phylink_config *config, unsigned int mode, + phy_interface_t interface, + struct phy_device *phy) +{ + struct mtk_mac *mac = container_of(config, struct mtk_mac, + phylink_config); + u32 mcr; - return 0; + mcr = mtk_r32(mac->hw, MTK_MAC_MCR(mac->id)); + mcr |= MAC_MCR_TX_EN | MAC_MCR_RX_EN; + mtk_w32(mac->hw, mcr, MTK_MAC_MCR(mac->id)); } -static int mtk_phy_connect(struct net_device *dev) +static void mtk_validate(struct phylink_config *config, + unsigned long *supported, + struct phylink_link_state *state) { - struct mtk_mac *mac = netdev_priv(dev); - struct mtk_eth *eth; - struct device_node *np; - u32 val; - int err; - - eth = mac->hw; - np = of_parse_phandle(mac->of_node, "phy-handle", 0); - if (!np && of_phy_is_fixed_link(mac->of_node)) - if (!of_phy_register_fixed_link(mac->of_node)) - np = of_node_get(mac->of_node); - if (!np) - return -ENODEV; + __ETHTOOL_DECLARE_LINK_MODE_MASK(mask) = { 0, }; + struct mtk_mac *mac = container_of(config, struct mtk_mac, + phylink_config); - err = mtk_setup_hw_path(eth, mac->id, of_get_phy_mode(np)); - if (err) - goto err_phy; - - mac->ge_mode = 0; - switch (of_get_phy_mode(np)) { - case PHY_INTERFACE_MODE_TRGMII: - mac->trgmii = true; - case PHY_INTERFACE_MODE_RGMII_TXID: - case PHY_INTERFACE_MODE_RGMII_RXID: - case PHY_INTERFACE_MODE_RGMII_ID: - case PHY_INTERFACE_MODE_RGMII: - case PHY_INTERFACE_MODE_SGMII: - break; - case PHY_INTERFACE_MODE_MII: - case PHY_INTERFACE_MODE_GMII: - mac->ge_mode = 1; - break; - case PHY_INTERFACE_MODE_REVMII: - mac->ge_mode = 2; - break; - case PHY_INTERFACE_MODE_RMII: - if (!mac->id) - goto err_phy; - mac->ge_mode = 3; - break; - default: - goto err_phy; + if (state->interface != PHY_INTERFACE_MODE_NA && + state->interface != PHY_INTERFACE_MODE_MII && + !(!mac->id && state->interface == PHY_INTERFACE_MODE_TRGMII && + MTK_HAS_CAPS(mac->hw->soc->caps, MTK_TRGMII)) && + !phy_interface_mode_is_rgmii(state->interface)) { + linkmode_zero(supported); + return; } - /* put the gmac into the right mode */ - regmap_read(eth->ethsys, ETHSYS_SYSCFG0, &val); - val &= ~SYSCFG0_GE_MODE(SYSCFG0_GE_MASK, mac->id); - val |= SYSCFG0_GE_MODE(mac->ge_mode, mac->id); - regmap_write(eth->ethsys, ETHSYS_SYSCFG0, val); + phylink_set_port_modes(mask); + phylink_set(mask, Autoneg); - /* couple phydev to net_device */ - if (mtk_phy_connect_node(eth, mac, np)) - goto err_phy; - - of_node_put(np); + if (state->interface == PHY_INTERFACE_MODE_TRGMII) { + phylink_set(mask, 1000baseT_Full); + } else { + phylink_set(mask, 10baseT_Half); + phylink_set(mask, 10baseT_Full); + phylink_set(mask, 100baseT_Half); + phylink_set(mask, 100baseT_Full); + + if (state->interface != PHY_INTERFACE_MODE_MII) { + phylink_set(mask, 1000baseT_Half); + phylink_set(mask, 1000baseT_Full); + } + } - return 0; + phylink_set(mask, Pause); + phylink_set(mask, Asym_Pause); -err_phy: - if (of_phy_is_fixed_link(mac->of_node)) - of_phy_deregister_fixed_link(mac->of_node); - of_node_put(np); - dev_err(eth->dev, "%s: invalid phy\n", __func__); - return -EINVAL; + linkmode_and(supported, supported, mask); + linkmode_and(state->advertising, state->advertising, mask); } +static const struct phylink_mac_ops mtk_phylink_ops = { + .validate = mtk_validate, + .mac_link_state = mtk_mac_link_state, + .mac_an_restart = mtk_mac_an_restart, + .mac_config = mtk_mac_config, + .mac_link_down = mtk_mac_link_down, + .mac_link_up = mtk_mac_link_up, +}; + static int mtk_mdio_init(struct mtk_eth *eth) { struct device_node *mii_np; @@ -1798,6 +1853,13 @@ static int mtk_open(struct net_device *dev) { struct mtk_mac *mac = netdev_priv(dev); struct mtk_eth *eth = mac->hw; + int err = phylink_of_phy_connect(mac->phylink, mac->of_node, 0); + + if (err) { + netdev_err(dev, "%s: could not attach PHY: %d\n", __func__, + err); + return err; + } /* we run 2 netdevs on the same dma ring so we only bring it up once */ if (!refcount_read(ð->dma_refcnt)) { @@ -1815,7 +1877,7 @@ static int mtk_open(struct net_device *dev) else refcount_inc(ð->dma_refcnt); - phy_start(dev->phydev); + phylink_start(mac->phylink); netif_start_queue(dev); return 0; @@ -1849,8 +1911,11 @@ static int mtk_stop(struct net_device *dev) struct mtk_mac *mac = netdev_priv(dev); struct mtk_eth *eth = mac->hw; + phylink_stop(mac->phylink); + netif_tx_disable(dev); - phy_stop(dev->phydev); + + phylink_disconnect_phy(mac->phylink); /* only shutdown DMA if this is the last user */ if (!refcount_dec_and_test(ð->dma_refcnt)) @@ -1926,15 +1991,6 @@ static int mtk_hw_init(struct mtk_eth *eth) ethsys_reset(eth, RSTCTRL_FE); ethsys_reset(eth, RSTCTRL_PPE); - regmap_read(eth->ethsys, ETHSYS_SYSCFG0, &val); - for (i = 0; i < MTK_MAC_COUNT; i++) { - if (!eth->mac[i]) - continue; - val &= ~SYSCFG0_GE_MODE(SYSCFG0_GE_MASK, eth->mac[i]->id); - val |= SYSCFG0_GE_MODE(eth->mac[i]->ge_mode, eth->mac[i]->id); - } - regmap_write(eth->ethsys, ETHSYS_SYSCFG0, val); - if (eth->pctl) { /* Set GE2 driving and slew rate */ regmap_write(eth->pctl, GPIO_DRV_SEL10, 0xa00); @@ -1979,7 +2035,7 @@ static int mtk_hw_init(struct mtk_eth *eth) mtk_w32(eth, MTK_RX_DONE_INT, MTK_QDMA_INT_GRP2); mtk_w32(eth, 0x21021000, MTK_FE_INT_GRP); - for (i = 0; i < 2; i++) { + for (i = 0; i < MTK_MAC_COUNT; i++) { u32 val = mtk_r32(eth, MTK_GDMA_FWD_CFG(i)); /* setup the forward port to send frame to PDMA */ @@ -2031,7 +2087,7 @@ static int __init mtk_init(struct net_device *dev) dev->dev_addr); } - return mtk_phy_connect(dev); + return 0; } static void mtk_uninit(struct net_device *dev) @@ -2039,20 +2095,20 @@ static void mtk_uninit(struct net_device *dev) struct mtk_mac *mac = netdev_priv(dev); struct mtk_eth *eth = mac->hw; - phy_disconnect(dev->phydev); - if (of_phy_is_fixed_link(mac->of_node)) - of_phy_deregister_fixed_link(mac->of_node); + phylink_disconnect_phy(mac->phylink); mtk_tx_irq_disable(eth, ~0); mtk_rx_irq_disable(eth, ~0); } static int mtk_do_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd) { + struct mtk_mac *mac = netdev_priv(dev); + switch (cmd) { case SIOCGMIIPHY: case SIOCGMIIREG: case SIOCSMIIREG: - return phy_mii_ioctl(dev->phydev, ifr, cmd); + return phylink_mii_ioctl(mac->phylink, ifr, cmd); default: break; } @@ -2093,16 +2149,6 @@ static void mtk_pending_work(struct work_struct *work) eth->dev->pins->default_state); mtk_hw_init(eth); - for (i = 0; i < MTK_MAC_COUNT; i++) { - if (!eth->mac[i] || - of_phy_is_fixed_link(eth->mac[i]->of_node)) - continue; - err = phy_init_hw(eth->netdev[i]->phydev); - if (err) - dev_err(eth->dev, "%s: PHY init failed.\n", - eth->netdev[i]->name); - } - /* restart DMA and enable IRQs */ for (i = 0; i < MTK_MAC_COUNT; i++) { if (!test_bit(i, &restart)) @@ -2165,9 +2211,7 @@ static int mtk_get_link_ksettings(struct net_device *ndev, if (unlikely(test_bit(MTK_RESETTING, &mac->hw->state))) return -EBUSY; - phy_ethtool_ksettings_get(ndev->phydev, cmd); - - return 0; + return phylink_ethtool_ksettings_get(mac->phylink, cmd); } static int mtk_set_link_ksettings(struct net_device *ndev, @@ -2178,7 +2222,7 @@ static int mtk_set_link_ksettings(struct net_device *ndev, if (unlikely(test_bit(MTK_RESETTING, &mac->hw->state))) return -EBUSY; - return phy_ethtool_ksettings_set(ndev->phydev, cmd); + return phylink_ethtool_ksettings_set(mac->phylink, cmd); } static void mtk_get_drvinfo(struct net_device *dev, @@ -2212,22 +2256,10 @@ static int mtk_nway_reset(struct net_device *dev) if (unlikely(test_bit(MTK_RESETTING, &mac->hw->state))) return -EBUSY; - return genphy_restart_aneg(dev->phydev); -} - -static u32 mtk_get_link(struct net_device *dev) -{ - struct mtk_mac *mac = netdev_priv(dev); - int err; - - if (unlikely(test_bit(MTK_RESETTING, &mac->hw->state))) - return -EBUSY; - - err = genphy_update_link(dev->phydev); - if (err) - return ethtool_op_get_link(dev); + if (!mac->phylink) + return -ENOTSUPP; - return dev->phydev->link; + return phylink_ethtool_nway_reset(mac->phylink); } static void mtk_get_strings(struct net_device *dev, u32 stringset, u8 *data) @@ -2347,7 +2379,7 @@ static const struct ethtool_ops mtk_ethtool_ops = { .get_msglevel = mtk_get_msglevel, .set_msglevel = mtk_set_msglevel, .nway_reset = mtk_nway_reset, - .get_link = mtk_get_link, + .get_link = ethtool_op_get_link, .get_strings = mtk_get_strings, .get_sset_count = mtk_get_sset_count, .get_ethtool_stats = mtk_get_ethtool_stats, @@ -2375,9 +2407,10 @@ static const struct net_device_ops mtk_netdev_ops = { static int mtk_add_mac(struct mtk_eth *eth, struct device_node *np) { + struct phylink *phylink; struct mtk_mac *mac; const __be32 *_id = of_get_property(np, "reg", NULL); - int id, err; + int phy_mode, id, err; if (!_id) { dev_err(eth->dev, "missing mac id\n"); @@ -2421,6 +2454,32 @@ static int mtk_add_mac(struct mtk_eth *eth, struct device_node *np) u64_stats_init(&mac->hw_stats->syncp); mac->hw_stats->reg_offset = id * MTK_STAT_OFFSET; + /* phylink create */ + phy_mode = of_get_phy_mode(np); + if (phy_mode < 0) { + dev_err(eth->dev, "incorrect phy-mode\n"); + err = -EINVAL; + goto free_netdev; + } + + /* mac config is not set */ + mac->interface = PHY_INTERFACE_MODE_NA; + mac->mode = MLO_AN_PHY; + mac->speed = SPEED_UNKNOWN; + + mac->phylink_config.dev = ð->netdev[id]->dev; + mac->phylink_config.type = PHYLINK_NETDEV; + + phylink = phylink_create(&mac->phylink_config, + of_fwnode_handle(mac->of_node), + phy_mode, &mtk_phylink_ops); + if (IS_ERR(phylink)) { + err = PTR_ERR(phylink); + goto free_netdev; + } + + mac->phylink = phylink; + SET_NETDEV_DEV(eth->netdev[id], eth->dev); eth->netdev[id]->watchdog_timeo = 5 * HZ; eth->netdev[id]->netdev_ops = &mtk_netdev_ops; @@ -2617,6 +2676,7 @@ static int mtk_probe(struct platform_device *pdev) static int mtk_remove(struct platform_device *pdev) { struct mtk_eth *eth = platform_get_drvdata(pdev); + struct mtk_mac *mac; int i; /* stop all devices to make sure that dma is properly shut down */ @@ -2624,6 +2684,8 @@ static int mtk_remove(struct platform_device *pdev) if (!eth->netdev[i]) continue; mtk_stop(eth->netdev[i]); + mac = netdev_priv(eth->netdev[i]); + phylink_disconnect_phy(mac->phylink); } mtk_hw_deinit(eth); diff --git a/drivers/net/ethernet/mediatek/mtk_eth_soc.h b/drivers/net/ethernet/mediatek/mtk_eth_soc.h index bab94f763e2c..3bfcba9ffb58 100644 --- a/drivers/net/ethernet/mediatek/mtk_eth_soc.h +++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.h @@ -14,6 +14,7 @@ #include #include #include +#include #define MTK_QDMA_PAGE_SIZE 2048 #define MTK_MAX_RX_LENGTH 1536 @@ -320,12 +321,18 @@ #define MAC_MCR_SPEED_100 BIT(2) #define MAC_MCR_FORCE_DPX BIT(1) #define MAC_MCR_FORCE_LINK BIT(0) -#define MAC_MCR_FIXED_LINK (MAC_MCR_MAX_RX_1536 | MAC_MCR_IPG_CFG | \ - MAC_MCR_FORCE_MODE | MAC_MCR_TX_EN | \ - MAC_MCR_RX_EN | MAC_MCR_BACKOFF_EN | \ - MAC_MCR_BACKPR_EN | MAC_MCR_FORCE_RX_FC | \ - MAC_MCR_FORCE_TX_FC | MAC_MCR_SPEED_1000 | \ - MAC_MCR_FORCE_DPX | MAC_MCR_FORCE_LINK) + +/* Mac status registers */ +#define MTK_MAC_MSR(x) (0x10108 + (x * 0x100)) +#define MAC_MSR_EEE1G BIT(7) +#define MAC_MSR_EEE100M BIT(6) +#define MAC_MSR_RX_FC BIT(5) +#define MAC_MSR_TX_FC BIT(4) +#define MAC_MSR_SPEED_1000 BIT(3) +#define MAC_MSR_SPEED_100 BIT(2) +#define MAC_MSR_SPEED_MASK (MAC_MSR_SPEED_1000 | MAC_MSR_SPEED_100) +#define MAC_MSR_DPX BIT(1) +#define MAC_MSR_LINK BIT(0) /* TRGMII RXC control register */ #define TRGMII_RCK_CTRL 0x10300 @@ -815,22 +822,23 @@ struct mtk_eth { /* struct mtk_mac - the structure that holds the info about the MACs of the * SoC * @id: The number of the MAC - * @ge_mode: Interface mode kept for setup restoring + * @interface: Interface mode kept for detecting change in hw settings * @of_node: Our devicetree node * @hw: Backpointer to our main datastruture * @hw_stats: Packet statistics counter - * @trgmii Indicate if the MAC uses TRGMII connected to internal - switch */ struct mtk_mac { int id; - int ge_mode; + phy_interface_t interface; + unsigned int mode; + int speed; struct device_node *of_node; + struct phylink *phylink; + struct phylink_config phylink_config; struct mtk_eth *hw; struct mtk_hw_stats *hw_stats; __be32 hwlro_ip[MTK_MAX_LRO_IP_CNT]; int hwlro_ip_cnt; - bool trgmii; }; /* the struct describing the SoC. these are declared in the soc_xyz.c files */ -- 2.20.1 From mboxrd@z Thu Jan 1 00:00:00 1970 From: =?UTF-8?q?Ren=C3=A9=20van=20Dorst?= Subject: [PATCH net-next 1/3] net: ethernet: mediatek: Add basic PHYLINK support Date: Wed, 24 Jul 2019 21:23:40 +0200 Message-ID: <20190724192340.18978-1-opensource@vdorst.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: "Linux-mediatek" Errors-To: linux-mediatek-bounces+glpam-linux-mediatek=m.gmane.org-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r@public.gmane.org To: netdev-u79uwXL29TY76Z2rM5mHXA@public.gmane.org Cc: andrew-g2DYL2Zd6BY@public.gmane.org, f.fainelli-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org, frank-w-SipyoOjXbOMoAHOVJHB0wA@public.gmane.org, sean.wang-NuS5LvNUpcJWk0Htik3J/w@public.gmane.org, linux-I+IVW8TIWO2tmTQ+vhA3Yw@public.gmane.org, vivien.didelot-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org, =?UTF-8?q?Ren=C3=A9=20van=20Dorst?= , devicetree-u79uwXL29TY76Z2rM5mHXA@public.gmane.org, robh+dt-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org, linux-mediatek-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r@public.gmane.org, john-Pj+rj9U5foFAfugRpC6u6w@public.gmane.org, matthias.bgg-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org, linux-mips-u79uwXL29TY76Z2rM5mHXA@public.gmane.org, davem-fT/PcQaiUtIeIZ0/mPfg9Q@public.gmane.org List-Id: linux-mediatek@lists.infradead.org VGhpcyBjb252ZXJ0IHRoZSBiYXNpY3MgdG8gUEhZTElOSyBBUEkuClNHTUlJIHN1cHBvcnQgaXMg bm90IGluIHRoaXMgcGF0Y2guCgpTaWduZWQtb2ZmLWJ5OiBSZW7DqSB2YW4gRG9yc3QgPG9wZW5z b3VyY2VAdmRvcnN0LmNvbT4KVGVzdGVkLWJ5OiBGcmFuayBXdW5kZXJsaWNoIDxmcmFuay13QHB1 YmxpYy1maWxlcy5kZT4KLS0tCiBkcml2ZXJzL25ldC9ldGhlcm5ldC9tZWRpYXRlay9LY29uZmln ICAgICAgIHwgICAyICstCiBkcml2ZXJzL25ldC9ldGhlcm5ldC9tZWRpYXRlay9tdGtfZXRoX3Nv Yy5jIHwgNDA0ICsrKysrKysrKysrLS0tLS0tLS0tCiBkcml2ZXJzL25ldC9ldGhlcm5ldC9tZWRp YXRlay9tdGtfZXRoX3NvYy5oIHwgIDMwICstCiAzIGZpbGVzIGNoYW5nZWQsIDI1MyBpbnNlcnRp b25zKCspLCAxODMgZGVsZXRpb25zKC0pCgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJu ZXQvbWVkaWF0ZWsvS2NvbmZpZyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lZGlhdGVrL0tjb25m aWcKaW5kZXggMjYzY2QwOTA5ZmUwLi5lMjBmMDRkMTdiNDkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMv bmV0L2V0aGVybmV0L21lZGlhdGVrL0tjb25maWcKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQv bWVkaWF0ZWsvS2NvbmZpZwpAQCAtMTAsNyArMTAsNyBAQCBpZiBORVRfVkVORE9SX01FRElBVEVL CiBjb25maWcgTkVUX01FRElBVEVLX1NPQwogCXRyaXN0YXRlICJNZWRpYVRlayBTb0MgR2lnYWJp dCBFdGhlcm5ldCBzdXBwb3J0IgogCWRlcGVuZHMgb24gTkVUX1ZFTkRPUl9NRURJQVRFSwotCXNl bGVjdCBQSFlMSUIKKwlzZWxlY3QgUEhZTElOSwogCS0tLWhlbHAtLS0KIAkgIFRoaXMgZHJpdmVy IHN1cHBvcnRzIHRoZSBnaWdhYml0IGV0aGVybmV0IE1BQ3MgaW4gdGhlCiAJICBNZWRpYVRlayBT b0MgZmFtaWx5LgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVkaWF0ZWsvbXRr X2V0aF9zb2MuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lZGlhdGVrL210a19ldGhfc29jLmMK aW5kZXggNTk3ZTM3N2Q4ZjIwLi44NTM5MjkwNzBjYjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0 L2V0aGVybmV0L21lZGlhdGVrL210a19ldGhfc29jLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJu ZXQvbWVkaWF0ZWsvbXRrX2V0aF9zb2MuYwpAQCAtMTgsNiArMTgsNyBAQAogI2luY2x1ZGUgPGxp bnV4L3RjcC5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4 L3BpbmN0cmwvZGV2aW5mby5oPgorI2luY2x1ZGUgPGxpbnV4L3BoeWxpbmsuaD4KIAogI2luY2x1 ZGUgIm10a19ldGhfc29jLmgiCiAKQEAgLTE4NiwxNjUgKzE4NywyMTkgQEAgc3RhdGljIHZvaWQg bXRrX2dtYWMwX3JnbWlpX2FkanVzdChzdHJ1Y3QgbXRrX2V0aCAqZXRoLCBpbnQgc3BlZWQpCiAJ bXRrX3czMihldGgsIHZhbCwgVFJHTUlJX1RDS19DVFJMKTsKIH0KIAotc3RhdGljIHZvaWQgbXRr X3BoeV9saW5rX2FkanVzdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQorc3RhdGljIHZvaWQgbXRr X21hY19jb25maWcoc3RydWN0IHBoeWxpbmtfY29uZmlnICpjb25maWcsIHVuc2lnbmVkIGludCBt b2RlLAorCQkJICAgY29uc3Qgc3RydWN0IHBoeWxpbmtfbGlua19zdGF0ZSAqc3RhdGUpCiB7Ci0J c3RydWN0IG10a19tYWMgKm1hYyA9IG5ldGRldl9wcml2KGRldik7Ci0JdTE2IGxjbF9hZHYgPSAw LCBybXRfYWR2ID0gMDsKLQl1OCBmbG93Y3RybDsKLQl1MzIgbWNyID0gTUFDX01DUl9NQVhfUlhf MTUzNiB8IE1BQ19NQ1JfSVBHX0NGRyB8Ci0JCSAgTUFDX01DUl9GT1JDRV9NT0RFIHwgTUFDX01D Ul9UWF9FTiB8Ci0JCSAgTUFDX01DUl9SWF9FTiB8IE1BQ19NQ1JfQkFDS09GRl9FTiB8Ci0JCSAg TUFDX01DUl9CQUNLUFJfRU47CisJc3RydWN0IG10a19tYWMgKm1hYyA9IGNvbnRhaW5lcl9vZihj b25maWcsIHN0cnVjdCBtdGtfbWFjLAorCQkJCQkgICBwaHlsaW5rX2NvbmZpZyk7CisJc3RydWN0 IG10a19ldGggKmV0aCA9IG1hYy0+aHc7CiAKLQlpZiAodW5saWtlbHkodGVzdF9iaXQoTVRLX1JF U0VUVElORywgJm1hYy0+aHctPnN0YXRlKSkpCi0JCXJldHVybjsKKwl1MzIgZ2VfbW9kZSA9IDAs IHZhbCwgbWNyX2N1ciwgbWNyX25ldzsKKworCWlmIChtYWMtPmludGVyZmFjZSAhPSBzdGF0ZS0+ aW50ZXJmYWNlKSB7CisJCS8qIFNldHVwIHNvYyBwaW4gZnVuY3Rpb25zICovCisJCXN3aXRjaCAo c3RhdGUtPmludGVyZmFjZSkgeworCQljYXNlIFBIWV9JTlRFUkZBQ0VfTU9ERV9UUkdNSUk6CisJ CQlpZiAobWFjLT5pZCkKKwkJCQlnb3RvIGVycl9waHk7CisJCQlpZiAoIU1US19IQVNfQ0FQUyht YWMtPmh3LT5zb2MtPmNhcHMsCisJCQkJCSAgTVRLX0dNQUMxX1RSR01JSSkpCisJCQkJZ290byBl cnJfcGh5OworCQkJLyogZmFsbCB0aHJvdWdoICovCisJCWNhc2UgUEhZX0lOVEVSRkFDRV9NT0RF X1JHTUlJX1RYSUQ6CisJCWNhc2UgUEhZX0lOVEVSRkFDRV9NT0RFX1JHTUlJX1JYSUQ6CisJCWNh c2UgUEhZX0lOVEVSRkFDRV9NT0RFX1JHTUlJX0lEOgorCQljYXNlIFBIWV9JTlRFUkZBQ0VfTU9E RV9SR01JSToKKwkJCWJyZWFrOworCQljYXNlIFBIWV9JTlRFUkZBQ0VfTU9ERV9NSUk6CisJCQln ZV9tb2RlID0gMTsKKwkJCWJyZWFrOworCQljYXNlIFBIWV9JTlRFUkZBQ0VfTU9ERV9SRVZNSUk6 CisJCQlnZV9tb2RlID0gMjsKKwkJCWJyZWFrOworCQljYXNlIFBIWV9JTlRFUkZBQ0VfTU9ERV9S TUlJOgorCQkJaWYgKG1hYy0+aWQpCisJCQkJZ290byBlcnJfcGh5OworCQkJZ2VfbW9kZSA9IDM7 CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWdvdG8gZXJyX3BoeTsKKwkJfQorCisJCS8qIFNl dHVwIGNsb2NrIGZvciAxc3QgZ21hYyAqLworCQlpZiAoIW1hYy0+aWQgJiYKKwkJICAgIE1US19I QVNfQ0FQUyhtYWMtPmh3LT5zb2MtPmNhcHMsIE1US19HTUFDMV9UUkdNSUkpKSB7CisJCQlpZiAo TVRLX0hBU19DQVBTKG1hYy0+aHctPnNvYy0+Y2FwcywKKwkJCQkJIE1US19UUkdNSUlfTVQ3NjIx X0NMSykpIHsKKwkJCQlpZiAobXQ3NjIxX2dtYWMwX3JnbWlpX2FkanVzdChtYWMtPmh3LAorCQkJ CQkJCSAgICAgIHN0YXRlLT5pbnRlcmZhY2UpKQorCQkJCQlnb3RvIGVycl9waHk7CisJCQl9IGVs c2UgeworCQkJCWlmIChzdGF0ZS0+aW50ZXJmYWNlICE9CisJCQkJICAgIFBIWV9JTlRFUkZBQ0Vf TU9ERV9UUkdNSUkpCisJCQkJCW10a19nbWFjMF9yZ21paV9hZGp1c3QobWFjLT5odywKKwkJCQkJ CQkgICAgICAgc3RhdGUtPnNwZWVkKTsKKwkJCX0KKwkJfQogCi0Jc3dpdGNoIChkZXYtPnBoeWRl di0+c3BlZWQpIHsKKwkJLyogcHV0IHRoZSBnbWFjIGludG8gdGhlIHJpZ2h0IG1vZGUgKi8KKwkJ cmVnbWFwX3JlYWQoZXRoLT5ldGhzeXMsIEVUSFNZU19TWVNDRkcwLCAmdmFsKTsKKwkJdmFsICY9 IH5TWVNDRkcwX0dFX01PREUoU1lTQ0ZHMF9HRV9NQVNLLCBtYWMtPmlkKTsKKwkJdmFsIHw9IFNZ U0NGRzBfR0VfTU9ERShnZV9tb2RlLCBtYWMtPmlkKTsKKwkJcmVnbWFwX3dyaXRlKGV0aC0+ZXRo c3lzLCBFVEhTWVNfU1lTQ0ZHMCwgdmFsKTsKKworCQltYWMtPmludGVyZmFjZSA9IHN0YXRlLT5p bnRlcmZhY2U7CisJfQorCisJLyogU2V0dXAgZ21hYyAqLworCW1jcl9jdXIgPSBtdGtfcjMyKG1h Yy0+aHcsIE1US19NQUNfTUNSKG1hYy0+aWQpKTsKKwltY3JfbmV3ID0gbWNyX2N1cjsKKwltY3Jf bmV3ICY9IH4oTUFDX01DUl9TUEVFRF8xMDAgfCBNQUNfTUNSX1NQRUVEXzEwMDAgfAorCQkgICAg IE1BQ19NQ1JfRk9SQ0VfRFBYIHwgTUFDX01DUl9GT1JDRV9UWF9GQyB8CisJCSAgICAgTUFDX01D Ul9GT1JDRV9SWF9GQyk7CisJbWNyX25ldyB8PSBNQUNfTUNSX01BWF9SWF8xNTM2IHwgTUFDX01D Ul9JUEdfQ0ZHIHwgTUFDX01DUl9GT1JDRV9NT0RFIHwKKwkJICAgTUFDX01DUl9CQUNLT0ZGX0VO IHwgTUFDX01DUl9CQUNLUFJfRU4gfCBNQUNfTUNSX0ZPUkNFX0xJTks7CisKKwlzd2l0Y2ggKHN0 YXRlLT5zcGVlZCkgewogCWNhc2UgU1BFRURfMTAwMDoKLQkJbWNyIHw9IE1BQ19NQ1JfU1BFRURf MTAwMDsKKwkJbWNyX25ldyB8PSBNQUNfTUNSX1NQRUVEXzEwMDA7CiAJCWJyZWFrOwogCWNhc2Ug U1BFRURfMTAwOgotCQltY3IgfD0gTUFDX01DUl9TUEVFRF8xMDA7CisJCW1jcl9uZXcgfD0gTUFD X01DUl9TUEVFRF8xMDA7CiAJCWJyZWFrOwogCX0KLQotCWlmIChNVEtfSEFTX0NBUFMobWFjLT5o dy0+c29jLT5jYXBzLCBNVEtfR01BQzFfVFJHTUlJKSAmJiAhbWFjLT5pZCkgewotCQlpZiAoTVRL X0hBU19DQVBTKG1hYy0+aHctPnNvYy0+Y2FwcywgTVRLX1RSR01JSV9NVDc2MjFfQ0xLKSkgewot CQkJaWYgKG10NzYyMV9nbWFjMF9yZ21paV9hZGp1c3QobWFjLT5odywKLQkJCQkJCSAgICAgIGRl di0+cGh5ZGV2LT5pbnRlcmZhY2UpKQotCQkJCXJldHVybjsKLQkJfSBlbHNlIHsKLQkJCWlmICgh bWFjLT50cmdtaWkpCi0JCQkJbXRrX2dtYWMwX3JnbWlpX2FkanVzdChtYWMtPmh3LAotCQkJCQkJ ICAgICAgIGRldi0+cGh5ZGV2LT5zcGVlZCk7Ci0JCX0KKwlpZiAoc3RhdGUtPmR1cGxleCA9PSBE VVBMRVhfRlVMTCkgeworCQltY3JfbmV3IHw9IE1BQ19NQ1JfRk9SQ0VfRFBYOworCQlpZiAoc3Rh dGUtPnBhdXNlICYgTUxPX1BBVVNFX1RYKQorCQkJbWNyX25ldyB8PSBNQUNfTUNSX0ZPUkNFX1RY X0ZDOworCQlpZiAoc3RhdGUtPnBhdXNlICYgTUxPX1BBVVNFX1JYKQorCQkJbWNyX25ldyB8PSBN QUNfTUNSX0ZPUkNFX1JYX0ZDOwogCX0KIAotCWlmIChkZXYtPnBoeWRldi0+bGluaykKLQkJbWNy IHw9IE1BQ19NQ1JfRk9SQ0VfTElOSzsKKwkvKiBPbmx5IHVwZGF0ZSBjb250cm9sIHJlZ2lzdGVy IHdoZW4gbmVlZGVkISAqLworCWlmIChtY3JfbmV3ICE9IG1jcl9jdXIpCisJCW10a193MzIobWFj LT5odywgbWNyX25ldywgTVRLX01BQ19NQ1IobWFjLT5pZCkpOwogCi0JaWYgKGRldi0+cGh5ZGV2 LT5kdXBsZXgpIHsKLQkJbWNyIHw9IE1BQ19NQ1JfRk9SQ0VfRFBYOworCXJldHVybjsKIAotCQlp ZiAoZGV2LT5waHlkZXYtPnBhdXNlKQotCQkJcm10X2FkdiA9IExQQV9QQVVTRV9DQVA7Ci0JCWlm IChkZXYtPnBoeWRldi0+YXN5bV9wYXVzZSkKLQkJCXJtdF9hZHYgfD0gTFBBX1BBVVNFX0FTWU07 CitlcnJfcGh5OgorCWRldl9lcnIoZXRoLT5kZXYsICIlczogR01BQyVkIG1vZGUgJXMgbm90IHN1 cHBvcnRlZCFcbiIsIF9fZnVuY19fLAorCQltYWMtPmlkLCBwaHlfbW9kZXMoc3RhdGUtPmludGVy ZmFjZSkpOworfQorCitzdGF0aWMgaW50IG10a19tYWNfbGlua19zdGF0ZShzdHJ1Y3QgcGh5bGlu a19jb25maWcgKmNvbmZpZywKKwkJCSAgICAgIHN0cnVjdCBwaHlsaW5rX2xpbmtfc3RhdGUgKnN0 YXRlKQoreworCXN0cnVjdCBtdGtfbWFjICptYWMgPSBjb250YWluZXJfb2YoY29uZmlnLCBzdHJ1 Y3QgbXRrX21hYywKKwkJCQkJICAgcGh5bGlua19jb25maWcpOworCXUzMiBwbXNyOwogCi0JCWxj bF9hZHYgPSBsaW5rbW9kZV9hZHZfdG9fbGNsX2Fkdl90KGRldi0+cGh5ZGV2LT5hZHZlcnRpc2lu Zyk7Ci0JCWZsb3djdHJsID0gbWlpX3Jlc29sdmVfZmxvd2N0cmxfZmR4KGxjbF9hZHYsIHJtdF9h ZHYpOworCXBtc3IgPSBtdGtfcjMyKG1hYy0+aHcsIE1US19NQUNfTVNSKG1hYy0+aWQpKTsKIAot CQlpZiAoZmxvd2N0cmwgJiBGTE9XX0NUUkxfVFgpCi0JCQltY3IgfD0gTUFDX01DUl9GT1JDRV9U WF9GQzsKLQkJaWYgKGZsb3djdHJsICYgRkxPV19DVFJMX1JYKQotCQkJbWNyIHw9IE1BQ19NQ1Jf Rk9SQ0VfUlhfRkM7CisJc3RhdGUtPmxpbmsgPSAocG1zciAmIE1BQ19NU1JfTElOSyk7CisJc3Rh dGUtPmR1cGxleCA9IChwbXNyICYgTUFDX01TUl9EUFgpID4+IDE7CiAKLQkJbmV0aWZfZGJnKG1h Yy0+aHcsIGxpbmssIGRldiwgInJ4IHBhdXNlICVzLCB0eCBwYXVzZSAlc1xuIiwKLQkJCSAgZmxv d2N0cmwgJiBGTE9XX0NUUkxfUlggPyAiZW5hYmxlZCIgOiAiZGlzYWJsZWQiLAotCQkJICBmbG93 Y3RybCAmIEZMT1dfQ1RSTF9UWCA/ICJlbmFibGVkIiA6ICJkaXNhYmxlZCIpOworCXN3aXRjaCAo cG1zciAmIChNQUNfTVNSX1NQRUVEXzEwMDAgfCBNQUNfTVNSX1NQRUVEXzEwMCkpIHsKKwljYXNl IDA6CisJCXN0YXRlLT5zcGVlZCA9IFNQRUVEXzEwOworCQlicmVhazsKKwljYXNlIE1BQ19NU1Jf U1BFRURfMTAwOgorCQlzdGF0ZS0+c3BlZWQgPSBTUEVFRF8xMDA7CisJCWJyZWFrOworCWNhc2Ug TUFDX01TUl9TUEVFRF8xMDAwOgorCQlzdGF0ZS0+c3BlZWQgPSBTUEVFRF8xMDAwOworCQlicmVh azsKKwlkZWZhdWx0OgorCQlzdGF0ZS0+c3BlZWQgPSBTUEVFRF9VTktOT1dOOworCQlicmVhazsK IAl9CiAKLQltdGtfdzMyKG1hYy0+aHcsIG1jciwgTVRLX01BQ19NQ1IobWFjLT5pZCkpOworCXN0 YXRlLT5wYXVzZSA9IDA7CisJaWYgKHBtc3IgJiBNQUNfTVNSX1JYX0ZDKQorCQlzdGF0ZS0+cGF1 c2UgfD0gTUxPX1BBVVNFX1JYOworCWlmIChwbXNyICYgTUFDX01TUl9UWF9GQykKKwkJc3RhdGUt PnBhdXNlIHw9IE1MT19QQVVTRV9UWDsKIAotCWlmICghb2ZfcGh5X2lzX2ZpeGVkX2xpbmsobWFj LT5vZl9ub2RlKSkKLQkJcGh5X3ByaW50X3N0YXR1cyhkZXYtPnBoeWRldik7CisJcmV0dXJuIDE7 CiB9CiAKLXN0YXRpYyBpbnQgbXRrX3BoeV9jb25uZWN0X25vZGUoc3RydWN0IG10a19ldGggKmV0 aCwgc3RydWN0IG10a19tYWMgKm1hYywKLQkJCQlzdHJ1Y3QgZGV2aWNlX25vZGUgKnBoeV9ub2Rl KQorc3RhdGljIHZvaWQgbXRrX21hY19hbl9yZXN0YXJ0KHN0cnVjdCBwaHlsaW5rX2NvbmZpZyAq Y29uZmlnKQogewotCXN0cnVjdCBwaHlfZGV2aWNlICpwaHlkZXY7Ci0JaW50IHBoeV9tb2RlOwor CS8qIERvIG5vdGhpbmcgKi8KK30KIAotCXBoeV9tb2RlID0gb2ZfZ2V0X3BoeV9tb2RlKHBoeV9u b2RlKTsKLQlpZiAocGh5X21vZGUgPCAwKSB7Ci0JCWRldl9lcnIoZXRoLT5kZXYsICJpbmNvcnJl Y3QgcGh5LW1vZGUgJWRcbiIsIHBoeV9tb2RlKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQorc3Rh dGljIHZvaWQgbXRrX21hY19saW5rX2Rvd24oc3RydWN0IHBoeWxpbmtfY29uZmlnICpjb25maWcs IHVuc2lnbmVkIGludCBtb2RlLAorCQkJICAgICAgcGh5X2ludGVyZmFjZV90IGludGVyZmFjZSkK K3sKKwlzdHJ1Y3QgbXRrX21hYyAqbWFjID0gY29udGFpbmVyX29mKGNvbmZpZywgc3RydWN0IG10 a19tYWMsCisJCQkJCSAgIHBoeWxpbmtfY29uZmlnKTsKIAotCXBoeWRldiA9IG9mX3BoeV9jb25u ZWN0KGV0aC0+bmV0ZGV2W21hYy0+aWRdLCBwaHlfbm9kZSwKLQkJCQltdGtfcGh5X2xpbmtfYWRq dXN0LCAwLCBwaHlfbW9kZSk7Ci0JaWYgKCFwaHlkZXYpIHsKLQkJZGV2X2VycihldGgtPmRldiwg ImNvdWxkIG5vdCBjb25uZWN0IHRvIFBIWVxuIik7Ci0JCXJldHVybiAtRU5PREVWOwotCX0KKwlt dGtfdzMyKG1hYy0+aHcsIDB4ODAwMCwgTVRLX01BQ19NQ1IobWFjLT5pZCkpOworfQogCi0JZGV2 X2luZm8oZXRoLT5kZXYsCi0JCSAiY29ubmVjdGVkIG1hYyAlZCB0byBQSFkgYXQgJXMgW3VpZD0l MDh4LCBkcml2ZXI9JXNdXG4iLAotCQkgbWFjLT5pZCwgcGh5ZGV2X25hbWUocGh5ZGV2KSwgcGh5 ZGV2LT5waHlfaWQsCi0JCSBwaHlkZXYtPmRydi0+bmFtZSk7CitzdGF0aWMgdm9pZCBtdGtfbWFj X2xpbmtfdXAoc3RydWN0IHBoeWxpbmtfY29uZmlnICpjb25maWcsIHVuc2lnbmVkIGludCBtb2Rl LAorCQkJICAgIHBoeV9pbnRlcmZhY2VfdCBpbnRlcmZhY2UsCisJCQkgICAgc3RydWN0IHBoeV9k ZXZpY2UgKnBoeSkKK3sKKwlzdHJ1Y3QgbXRrX21hYyAqbWFjID0gY29udGFpbmVyX29mKGNvbmZp Zywgc3RydWN0IG10a19tYWMsCisJCQkJCSAgIHBoeWxpbmtfY29uZmlnKTsKKwl1MzIgbWNyOwog Ci0JcmV0dXJuIDA7CisJbWNyID0gbXRrX3IzMihtYWMtPmh3LCBNVEtfTUFDX01DUihtYWMtPmlk KSk7CisJbWNyIHw9IE1BQ19NQ1JfVFhfRU4gfCBNQUNfTUNSX1JYX0VOOworCW10a193MzIobWFj LT5odywgbWNyLCBNVEtfTUFDX01DUihtYWMtPmlkKSk7CiB9CiAKLXN0YXRpYyBpbnQgbXRrX3Bo eV9jb25uZWN0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCitzdGF0aWMgdm9pZCBtdGtfdmFsaWRh dGUoc3RydWN0IHBoeWxpbmtfY29uZmlnICpjb25maWcsCisJCQkgdW5zaWduZWQgbG9uZyAqc3Vw cG9ydGVkLAorCQkJIHN0cnVjdCBwaHlsaW5rX2xpbmtfc3RhdGUgKnN0YXRlKQogewotCXN0cnVj dCBtdGtfbWFjICptYWMgPSBuZXRkZXZfcHJpdihkZXYpOwotCXN0cnVjdCBtdGtfZXRoICpldGg7 Ci0Jc3RydWN0IGRldmljZV9ub2RlICpucDsKLQl1MzIgdmFsOwotCWludCBlcnI7Ci0KLQlldGgg PSBtYWMtPmh3OwotCW5wID0gb2ZfcGFyc2VfcGhhbmRsZShtYWMtPm9mX25vZGUsICJwaHktaGFu ZGxlIiwgMCk7Ci0JaWYgKCFucCAmJiBvZl9waHlfaXNfZml4ZWRfbGluayhtYWMtPm9mX25vZGUp KQotCQlpZiAoIW9mX3BoeV9yZWdpc3Rlcl9maXhlZF9saW5rKG1hYy0+b2Zfbm9kZSkpCi0JCQlu cCA9IG9mX25vZGVfZ2V0KG1hYy0+b2Zfbm9kZSk7Ci0JaWYgKCFucCkKLQkJcmV0dXJuIC1FTk9E RVY7CisJX19FVEhUT09MX0RFQ0xBUkVfTElOS19NT0RFX01BU0sobWFzaykgPSB7IDAsIH07CisJ c3RydWN0IG10a19tYWMgKm1hYyA9IGNvbnRhaW5lcl9vZihjb25maWcsIHN0cnVjdCBtdGtfbWFj LAorCQkJCQkgICBwaHlsaW5rX2NvbmZpZyk7CiAKLQllcnIgPSBtdGtfc2V0dXBfaHdfcGF0aChl dGgsIG1hYy0+aWQsIG9mX2dldF9waHlfbW9kZShucCkpOwotCWlmIChlcnIpCi0JCWdvdG8gZXJy X3BoeTsKLQotCW1hYy0+Z2VfbW9kZSA9IDA7Ci0Jc3dpdGNoIChvZl9nZXRfcGh5X21vZGUobnAp KSB7Ci0JY2FzZSBQSFlfSU5URVJGQUNFX01PREVfVFJHTUlJOgotCQltYWMtPnRyZ21paSA9IHRy dWU7Ci0JY2FzZSBQSFlfSU5URVJGQUNFX01PREVfUkdNSUlfVFhJRDoKLQljYXNlIFBIWV9JTlRF UkZBQ0VfTU9ERV9SR01JSV9SWElEOgotCWNhc2UgUEhZX0lOVEVSRkFDRV9NT0RFX1JHTUlJX0lE OgotCWNhc2UgUEhZX0lOVEVSRkFDRV9NT0RFX1JHTUlJOgotCWNhc2UgUEhZX0lOVEVSRkFDRV9N T0RFX1NHTUlJOgotCQlicmVhazsKLQljYXNlIFBIWV9JTlRFUkZBQ0VfTU9ERV9NSUk6Ci0JY2Fz ZSBQSFlfSU5URVJGQUNFX01PREVfR01JSToKLQkJbWFjLT5nZV9tb2RlID0gMTsKLQkJYnJlYWs7 Ci0JY2FzZSBQSFlfSU5URVJGQUNFX01PREVfUkVWTUlJOgotCQltYWMtPmdlX21vZGUgPSAyOwot CQlicmVhazsKLQljYXNlIFBIWV9JTlRFUkZBQ0VfTU9ERV9STUlJOgotCQlpZiAoIW1hYy0+aWQp Ci0JCQlnb3RvIGVycl9waHk7Ci0JCW1hYy0+Z2VfbW9kZSA9IDM7Ci0JCWJyZWFrOwotCWRlZmF1 bHQ6Ci0JCWdvdG8gZXJyX3BoeTsKKwlpZiAoc3RhdGUtPmludGVyZmFjZSAhPSBQSFlfSU5URVJG QUNFX01PREVfTkEgJiYKKwkgICAgc3RhdGUtPmludGVyZmFjZSAhPSBQSFlfSU5URVJGQUNFX01P REVfTUlJICYmCisJICAgICEoIW1hYy0+aWQgJiYgc3RhdGUtPmludGVyZmFjZSA9PSBQSFlfSU5U RVJGQUNFX01PREVfVFJHTUlJICYmCisJICAgICAgTVRLX0hBU19DQVBTKG1hYy0+aHctPnNvYy0+ Y2FwcywgTVRLX1RSR01JSSkpICYmCisJICAgICFwaHlfaW50ZXJmYWNlX21vZGVfaXNfcmdtaWko c3RhdGUtPmludGVyZmFjZSkpIHsKKwkJbGlua21vZGVfemVybyhzdXBwb3J0ZWQpOworCQlyZXR1 cm47CiAJfQogCi0JLyogcHV0IHRoZSBnbWFjIGludG8gdGhlIHJpZ2h0IG1vZGUgKi8KLQlyZWdt YXBfcmVhZChldGgtPmV0aHN5cywgRVRIU1lTX1NZU0NGRzAsICZ2YWwpOwotCXZhbCAmPSB+U1lT Q0ZHMF9HRV9NT0RFKFNZU0NGRzBfR0VfTUFTSywgbWFjLT5pZCk7Ci0JdmFsIHw9IFNZU0NGRzBf R0VfTU9ERShtYWMtPmdlX21vZGUsIG1hYy0+aWQpOwotCXJlZ21hcF93cml0ZShldGgtPmV0aHN5 cywgRVRIU1lTX1NZU0NGRzAsIHZhbCk7CisJcGh5bGlua19zZXRfcG9ydF9tb2RlcyhtYXNrKTsK KwlwaHlsaW5rX3NldChtYXNrLCBBdXRvbmVnKTsKIAotCS8qIGNvdXBsZSBwaHlkZXYgdG8gbmV0 X2RldmljZSAqLwotCWlmIChtdGtfcGh5X2Nvbm5lY3Rfbm9kZShldGgsIG1hYywgbnApKQotCQln b3RvIGVycl9waHk7Ci0KLQlvZl9ub2RlX3B1dChucCk7CisJaWYgKHN0YXRlLT5pbnRlcmZhY2Ug PT0gUEhZX0lOVEVSRkFDRV9NT0RFX1RSR01JSSkgeworCQlwaHlsaW5rX3NldChtYXNrLCAxMDAw YmFzZVRfRnVsbCk7CisJfSBlbHNlIHsKKwkJcGh5bGlua19zZXQobWFzaywgMTBiYXNlVF9IYWxm KTsKKwkJcGh5bGlua19zZXQobWFzaywgMTBiYXNlVF9GdWxsKTsKKwkJcGh5bGlua19zZXQobWFz aywgMTAwYmFzZVRfSGFsZik7CisJCXBoeWxpbmtfc2V0KG1hc2ssIDEwMGJhc2VUX0Z1bGwpOwor CisJCWlmIChzdGF0ZS0+aW50ZXJmYWNlICE9IFBIWV9JTlRFUkZBQ0VfTU9ERV9NSUkpIHsKKwkJ CXBoeWxpbmtfc2V0KG1hc2ssIDEwMDBiYXNlVF9IYWxmKTsKKwkJCXBoeWxpbmtfc2V0KG1hc2ss IDEwMDBiYXNlVF9GdWxsKTsKKwkJfQorCX0KIAotCXJldHVybiAwOworCXBoeWxpbmtfc2V0KG1h c2ssIFBhdXNlKTsKKwlwaHlsaW5rX3NldChtYXNrLCBBc3ltX1BhdXNlKTsKIAotZXJyX3BoeToK LQlpZiAob2ZfcGh5X2lzX2ZpeGVkX2xpbmsobWFjLT5vZl9ub2RlKSkKLQkJb2ZfcGh5X2RlcmVn aXN0ZXJfZml4ZWRfbGluayhtYWMtPm9mX25vZGUpOwotCW9mX25vZGVfcHV0KG5wKTsKLQlkZXZf ZXJyKGV0aC0+ZGV2LCAiJXM6IGludmFsaWQgcGh5XG4iLCBfX2Z1bmNfXyk7Ci0JcmV0dXJuIC1F SU5WQUw7CisJbGlua21vZGVfYW5kKHN1cHBvcnRlZCwgc3VwcG9ydGVkLCBtYXNrKTsKKwlsaW5r bW9kZV9hbmQoc3RhdGUtPmFkdmVydGlzaW5nLCBzdGF0ZS0+YWR2ZXJ0aXNpbmcsIG1hc2spOwog fQogCitzdGF0aWMgY29uc3Qgc3RydWN0IHBoeWxpbmtfbWFjX29wcyBtdGtfcGh5bGlua19vcHMg PSB7CisJLnZhbGlkYXRlID0gbXRrX3ZhbGlkYXRlLAorCS5tYWNfbGlua19zdGF0ZSA9IG10a19t YWNfbGlua19zdGF0ZSwKKwkubWFjX2FuX3Jlc3RhcnQgPSBtdGtfbWFjX2FuX3Jlc3RhcnQsCisJ Lm1hY19jb25maWcgPSBtdGtfbWFjX2NvbmZpZywKKwkubWFjX2xpbmtfZG93biA9IG10a19tYWNf bGlua19kb3duLAorCS5tYWNfbGlua191cCA9IG10a19tYWNfbGlua191cCwKK307CisKIHN0YXRp YyBpbnQgbXRrX21kaW9faW5pdChzdHJ1Y3QgbXRrX2V0aCAqZXRoKQogewogCXN0cnVjdCBkZXZp Y2Vfbm9kZSAqbWlpX25wOwpAQCAtMTc5OCw2ICsxODUzLDEzIEBAIHN0YXRpYyBpbnQgbXRrX29w ZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgbXRrX21hYyAqbWFjID0gbmV0 ZGV2X3ByaXYoZGV2KTsKIAlzdHJ1Y3QgbXRrX2V0aCAqZXRoID0gbWFjLT5odzsKKwlpbnQgZXJy ID0gcGh5bGlua19vZl9waHlfY29ubmVjdChtYWMtPnBoeWxpbmssIG1hYy0+b2Zfbm9kZSwgMCk7 CisKKwlpZiAoZXJyKSB7CisJCW5ldGRldl9lcnIoZGV2LCAiJXM6IGNvdWxkIG5vdCBhdHRhY2gg UEhZOiAlZFxuIiwgX19mdW5jX18sCisJCQkgICBlcnIpOworCQlyZXR1cm4gZXJyOworCX0KIAog CS8qIHdlIHJ1biAyIG5ldGRldnMgb24gdGhlIHNhbWUgZG1hIHJpbmcgc28gd2Ugb25seSBicmlu ZyBpdCB1cCBvbmNlICovCiAJaWYgKCFyZWZjb3VudF9yZWFkKCZldGgtPmRtYV9yZWZjbnQpKSB7 CkBAIC0xODE1LDcgKzE4NzcsNyBAQCBzdGF0aWMgaW50IG10a19vcGVuKHN0cnVjdCBuZXRfZGV2 aWNlICpkZXYpCiAJZWxzZQogCQlyZWZjb3VudF9pbmMoJmV0aC0+ZG1hX3JlZmNudCk7CiAKLQlw aHlfc3RhcnQoZGV2LT5waHlkZXYpOworCXBoeWxpbmtfc3RhcnQobWFjLT5waHlsaW5rKTsKIAlu ZXRpZl9zdGFydF9xdWV1ZShkZXYpOwogCiAJcmV0dXJuIDA7CkBAIC0xODQ5LDggKzE5MTEsMTEg QEAgc3RhdGljIGludCBtdGtfc3RvcChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogCXN0cnVjdCBt dGtfbWFjICptYWMgPSBuZXRkZXZfcHJpdihkZXYpOwogCXN0cnVjdCBtdGtfZXRoICpldGggPSBt YWMtPmh3OwogCisJcGh5bGlua19zdG9wKG1hYy0+cGh5bGluayk7CisKIAluZXRpZl90eF9kaXNh YmxlKGRldik7Ci0JcGh5X3N0b3AoZGV2LT5waHlkZXYpOworCisJcGh5bGlua19kaXNjb25uZWN0 X3BoeShtYWMtPnBoeWxpbmspOwogCiAJLyogb25seSBzaHV0ZG93biBETUEgaWYgdGhpcyBpcyB0 aGUgbGFzdCB1c2VyICovCiAJaWYgKCFyZWZjb3VudF9kZWNfYW5kX3Rlc3QoJmV0aC0+ZG1hX3Jl ZmNudCkpCkBAIC0xOTI2LDE1ICsxOTkxLDYgQEAgc3RhdGljIGludCBtdGtfaHdfaW5pdChzdHJ1 Y3QgbXRrX2V0aCAqZXRoKQogCWV0aHN5c19yZXNldChldGgsIFJTVENUUkxfRkUpOwogCWV0aHN5 c19yZXNldChldGgsIFJTVENUUkxfUFBFKTsKIAotCXJlZ21hcF9yZWFkKGV0aC0+ZXRoc3lzLCBF VEhTWVNfU1lTQ0ZHMCwgJnZhbCk7Ci0JZm9yIChpID0gMDsgaSA8IE1US19NQUNfQ09VTlQ7IGkr KykgewotCQlpZiAoIWV0aC0+bWFjW2ldKQotCQkJY29udGludWU7Ci0JCXZhbCAmPSB+U1lTQ0ZH MF9HRV9NT0RFKFNZU0NGRzBfR0VfTUFTSywgZXRoLT5tYWNbaV0tPmlkKTsKLQkJdmFsIHw9IFNZ U0NGRzBfR0VfTU9ERShldGgtPm1hY1tpXS0+Z2VfbW9kZSwgZXRoLT5tYWNbaV0tPmlkKTsKLQl9 Ci0JcmVnbWFwX3dyaXRlKGV0aC0+ZXRoc3lzLCBFVEhTWVNfU1lTQ0ZHMCwgdmFsKTsKLQogCWlm IChldGgtPnBjdGwpIHsKIAkJLyogU2V0IEdFMiBkcml2aW5nIGFuZCBzbGV3IHJhdGUgKi8KIAkJ cmVnbWFwX3dyaXRlKGV0aC0+cGN0bCwgR1BJT19EUlZfU0VMMTAsIDB4YTAwKTsKQEAgLTE5Nzks NyArMjAzNSw3IEBAIHN0YXRpYyBpbnQgbXRrX2h3X2luaXQoc3RydWN0IG10a19ldGggKmV0aCkK IAltdGtfdzMyKGV0aCwgTVRLX1JYX0RPTkVfSU5ULCBNVEtfUURNQV9JTlRfR1JQMik7CiAJbXRr X3czMihldGgsIDB4MjEwMjEwMDAsIE1US19GRV9JTlRfR1JQKTsKIAotCWZvciAoaSA9IDA7IGkg PCAyOyBpKyspIHsKKwlmb3IgKGkgPSAwOyBpIDwgTVRLX01BQ19DT1VOVDsgaSsrKSB7CiAJCXUz MiB2YWwgPSBtdGtfcjMyKGV0aCwgTVRLX0dETUFfRldEX0NGRyhpKSk7CiAKIAkJLyogc2V0dXAg dGhlIGZvcndhcmQgcG9ydCB0byBzZW5kIGZyYW1lIHRvIFBETUEgKi8KQEAgLTIwMzEsNyArMjA4 Nyw3IEBAIHN0YXRpYyBpbnQgX19pbml0IG10a19pbml0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYp CiAJCQlkZXYtPmRldl9hZGRyKTsKIAl9CiAKLQlyZXR1cm4gbXRrX3BoeV9jb25uZWN0KGRldik7 CisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyB2b2lkIG10a191bmluaXQoc3RydWN0IG5ldF9kZXZp Y2UgKmRldikKQEAgLTIwMzksMjAgKzIwOTUsMjAgQEAgc3RhdGljIHZvaWQgbXRrX3VuaW5pdChz dHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogCXN0cnVjdCBtdGtfbWFjICptYWMgPSBuZXRkZXZfcHJp dihkZXYpOwogCXN0cnVjdCBtdGtfZXRoICpldGggPSBtYWMtPmh3OwogCi0JcGh5X2Rpc2Nvbm5l Y3QoZGV2LT5waHlkZXYpOwotCWlmIChvZl9waHlfaXNfZml4ZWRfbGluayhtYWMtPm9mX25vZGUp KQotCQlvZl9waHlfZGVyZWdpc3Rlcl9maXhlZF9saW5rKG1hYy0+b2Zfbm9kZSk7CisJcGh5bGlu a19kaXNjb25uZWN0X3BoeShtYWMtPnBoeWxpbmspOwogCW10a190eF9pcnFfZGlzYWJsZShldGgs IH4wKTsKIAltdGtfcnhfaXJxX2Rpc2FibGUoZXRoLCB+MCk7CiB9CiAKIHN0YXRpYyBpbnQgbXRr X2RvX2lvY3RsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpZnJlcSAqaWZyLCBpbnQg Y21kKQogeworCXN0cnVjdCBtdGtfbWFjICptYWMgPSBuZXRkZXZfcHJpdihkZXYpOworCiAJc3dp dGNoIChjbWQpIHsKIAljYXNlIFNJT0NHTUlJUEhZOgogCWNhc2UgU0lPQ0dNSUlSRUc6CiAJY2Fz ZSBTSU9DU01JSVJFRzoKLQkJcmV0dXJuIHBoeV9taWlfaW9jdGwoZGV2LT5waHlkZXYsIGlmciwg Y21kKTsKKwkJcmV0dXJuIHBoeWxpbmtfbWlpX2lvY3RsKG1hYy0+cGh5bGluaywgaWZyLCBjbWQp OwogCWRlZmF1bHQ6CiAJCWJyZWFrOwogCX0KQEAgLTIwOTMsMTYgKzIxNDksNiBAQCBzdGF0aWMg dm9pZCBtdGtfcGVuZGluZ193b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKIAkJCQkgICAg IGV0aC0+ZGV2LT5waW5zLT5kZWZhdWx0X3N0YXRlKTsKIAltdGtfaHdfaW5pdChldGgpOwogCi0J Zm9yIChpID0gMDsgaSA8IE1US19NQUNfQ09VTlQ7IGkrKykgewotCQlpZiAoIWV0aC0+bWFjW2ld IHx8Ci0JCSAgICBvZl9waHlfaXNfZml4ZWRfbGluayhldGgtPm1hY1tpXS0+b2Zfbm9kZSkpCi0J CQljb250aW51ZTsKLQkJZXJyID0gcGh5X2luaXRfaHcoZXRoLT5uZXRkZXZbaV0tPnBoeWRldik7 Ci0JCWlmIChlcnIpCi0JCQlkZXZfZXJyKGV0aC0+ZGV2LCAiJXM6IFBIWSBpbml0IGZhaWxlZC5c biIsCi0JCQkJZXRoLT5uZXRkZXZbaV0tPm5hbWUpOwotCX0KLQogCS8qIHJlc3RhcnQgRE1BIGFu ZCBlbmFibGUgSVJRcyAqLwogCWZvciAoaSA9IDA7IGkgPCBNVEtfTUFDX0NPVU5UOyBpKyspIHsK IAkJaWYgKCF0ZXN0X2JpdChpLCAmcmVzdGFydCkpCkBAIC0yMTY1LDkgKzIyMTEsNyBAQCBzdGF0 aWMgaW50IG10a19nZXRfbGlua19rc2V0dGluZ3Moc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYsCiAJ aWYgKHVubGlrZWx5KHRlc3RfYml0KE1US19SRVNFVFRJTkcsICZtYWMtPmh3LT5zdGF0ZSkpKQog CQlyZXR1cm4gLUVCVVNZOwogCi0JcGh5X2V0aHRvb2xfa3NldHRpbmdzX2dldChuZGV2LT5waHlk ZXYsIGNtZCk7Ci0KLQlyZXR1cm4gMDsKKwlyZXR1cm4gcGh5bGlua19ldGh0b29sX2tzZXR0aW5n c19nZXQobWFjLT5waHlsaW5rLCBjbWQpOwogfQogCiBzdGF0aWMgaW50IG10a19zZXRfbGlua19r c2V0dGluZ3Moc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYsCkBAIC0yMTc4LDcgKzIyMjIsNyBAQCBz dGF0aWMgaW50IG10a19zZXRfbGlua19rc2V0dGluZ3Moc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYs CiAJaWYgKHVubGlrZWx5KHRlc3RfYml0KE1US19SRVNFVFRJTkcsICZtYWMtPmh3LT5zdGF0ZSkp KQogCQlyZXR1cm4gLUVCVVNZOwogCi0JcmV0dXJuIHBoeV9ldGh0b29sX2tzZXR0aW5nc19zZXQo bmRldi0+cGh5ZGV2LCBjbWQpOworCXJldHVybiBwaHlsaW5rX2V0aHRvb2xfa3NldHRpbmdzX3Nl dChtYWMtPnBoeWxpbmssIGNtZCk7CiB9CiAKIHN0YXRpYyB2b2lkIG10a19nZXRfZHJ2aW5mbyhz dHJ1Y3QgbmV0X2RldmljZSAqZGV2LApAQCAtMjIxMiwyMiArMjI1NiwxMCBAQCBzdGF0aWMgaW50 IG10a19ud2F5X3Jlc2V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiAJaWYgKHVubGlrZWx5KHRl c3RfYml0KE1US19SRVNFVFRJTkcsICZtYWMtPmh3LT5zdGF0ZSkpKQogCQlyZXR1cm4gLUVCVVNZ OwogCi0JcmV0dXJuIGdlbnBoeV9yZXN0YXJ0X2FuZWcoZGV2LT5waHlkZXYpOwotfQotCi1zdGF0 aWMgdTMyIG10a19nZXRfbGluayhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQotewotCXN0cnVjdCBt dGtfbWFjICptYWMgPSBuZXRkZXZfcHJpdihkZXYpOwotCWludCBlcnI7Ci0KLQlpZiAodW5saWtl bHkodGVzdF9iaXQoTVRLX1JFU0VUVElORywgJm1hYy0+aHctPnN0YXRlKSkpCi0JCXJldHVybiAt RUJVU1k7Ci0KLQllcnIgPSBnZW5waHlfdXBkYXRlX2xpbmsoZGV2LT5waHlkZXYpOwotCWlmIChl cnIpCi0JCXJldHVybiBldGh0b29sX29wX2dldF9saW5rKGRldik7CisJaWYgKCFtYWMtPnBoeWxp bmspCisJCXJldHVybiAtRU5PVFNVUFA7CiAKLQlyZXR1cm4gZGV2LT5waHlkZXYtPmxpbms7CisJ cmV0dXJuIHBoeWxpbmtfZXRodG9vbF9ud2F5X3Jlc2V0KG1hYy0+cGh5bGluayk7CiB9CiAKIHN0 YXRpYyB2b2lkIG10a19nZXRfc3RyaW5ncyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MzIgc3Ry aW5nc2V0LCB1OCAqZGF0YSkKQEAgLTIzNDcsNyArMjM3OSw3IEBAIHN0YXRpYyBjb25zdCBzdHJ1 Y3QgZXRodG9vbF9vcHMgbXRrX2V0aHRvb2xfb3BzID0gewogCS5nZXRfbXNnbGV2ZWwJCT0gbXRr X2dldF9tc2dsZXZlbCwKIAkuc2V0X21zZ2xldmVsCQk9IG10a19zZXRfbXNnbGV2ZWwsCiAJLm53 YXlfcmVzZXQJCT0gbXRrX253YXlfcmVzZXQsCi0JLmdldF9saW5rCQk9IG10a19nZXRfbGluaywK KwkuZ2V0X2xpbmsJCT0gZXRodG9vbF9vcF9nZXRfbGluaywKIAkuZ2V0X3N0cmluZ3MJCT0gbXRr X2dldF9zdHJpbmdzLAogCS5nZXRfc3NldF9jb3VudAkJPSBtdGtfZ2V0X3NzZXRfY291bnQsCiAJ LmdldF9ldGh0b29sX3N0YXRzCT0gbXRrX2dldF9ldGh0b29sX3N0YXRzLApAQCAtMjM3NSw5ICsy NDA3LDEwIEBAIHN0YXRpYyBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZV9vcHMgbXRrX25ldGRldl9v cHMgPSB7CiAKIHN0YXRpYyBpbnQgbXRrX2FkZF9tYWMoc3RydWN0IG10a19ldGggKmV0aCwgc3Ry dWN0IGRldmljZV9ub2RlICpucCkKIHsKKwlzdHJ1Y3QgcGh5bGluayAqcGh5bGluazsKIAlzdHJ1 Y3QgbXRrX21hYyAqbWFjOwogCWNvbnN0IF9fYmUzMiAqX2lkID0gb2ZfZ2V0X3Byb3BlcnR5KG5w LCAicmVnIiwgTlVMTCk7Ci0JaW50IGlkLCBlcnI7CisJaW50IHBoeV9tb2RlLCBpZCwgZXJyOwog CiAJaWYgKCFfaWQpIHsKIAkJZGV2X2VycihldGgtPmRldiwgIm1pc3NpbmcgbWFjIGlkXG4iKTsK QEAgLTI0MjEsNiArMjQ1NCwzMiBAQCBzdGF0aWMgaW50IG10a19hZGRfbWFjKHN0cnVjdCBtdGtf ZXRoICpldGgsIHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnApCiAJdTY0X3N0YXRzX2luaXQoJm1hYy0+ aHdfc3RhdHMtPnN5bmNwKTsKIAltYWMtPmh3X3N0YXRzLT5yZWdfb2Zmc2V0ID0gaWQgKiBNVEtf U1RBVF9PRkZTRVQ7CiAKKwkvKiBwaHlsaW5rIGNyZWF0ZSAqLworCXBoeV9tb2RlID0gb2ZfZ2V0 X3BoeV9tb2RlKG5wKTsKKwlpZiAocGh5X21vZGUgPCAwKSB7CisJCWRldl9lcnIoZXRoLT5kZXYs ICJpbmNvcnJlY3QgcGh5LW1vZGVcbiIpOworCQllcnIgPSAtRUlOVkFMOworCQlnb3RvIGZyZWVf bmV0ZGV2OworCX0KKworCS8qIG1hYyBjb25maWcgaXMgbm90IHNldCAqLworCW1hYy0+aW50ZXJm YWNlID0gUEhZX0lOVEVSRkFDRV9NT0RFX05BOworCW1hYy0+bW9kZSA9IE1MT19BTl9QSFk7CisJ bWFjLT5zcGVlZCA9IFNQRUVEX1VOS05PV047CisKKwltYWMtPnBoeWxpbmtfY29uZmlnLmRldiA9 ICZldGgtPm5ldGRldltpZF0tPmRldjsKKwltYWMtPnBoeWxpbmtfY29uZmlnLnR5cGUgPSBQSFlM SU5LX05FVERFVjsKKworCXBoeWxpbmsgPSBwaHlsaW5rX2NyZWF0ZSgmbWFjLT5waHlsaW5rX2Nv bmZpZywKKwkJCQkgb2ZfZndub2RlX2hhbmRsZShtYWMtPm9mX25vZGUpLAorCQkJCSBwaHlfbW9k ZSwgJm10a19waHlsaW5rX29wcyk7CisJaWYgKElTX0VSUihwaHlsaW5rKSkgeworCQllcnIgPSBQ VFJfRVJSKHBoeWxpbmspOworCQlnb3RvIGZyZWVfbmV0ZGV2OworCX0KKworCW1hYy0+cGh5bGlu ayA9IHBoeWxpbms7CisKIAlTRVRfTkVUREVWX0RFVihldGgtPm5ldGRldltpZF0sIGV0aC0+ZGV2 KTsKIAlldGgtPm5ldGRldltpZF0tPndhdGNoZG9nX3RpbWVvID0gNSAqIEhaOwogCWV0aC0+bmV0 ZGV2W2lkXS0+bmV0ZGV2X29wcyA9ICZtdGtfbmV0ZGV2X29wczsKQEAgLTI2MTcsNiArMjY3Niw3 IEBAIHN0YXRpYyBpbnQgbXRrX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiBz dGF0aWMgaW50IG10a19yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIHsKIAlz dHJ1Y3QgbXRrX2V0aCAqZXRoID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisJc3RydWN0 IG10a19tYWMgKm1hYzsKIAlpbnQgaTsKIAogCS8qIHN0b3AgYWxsIGRldmljZXMgdG8gbWFrZSBz dXJlIHRoYXQgZG1hIGlzIHByb3Blcmx5IHNodXQgZG93biAqLwpAQCAtMjYyNCw2ICsyNjg0LDgg QEAgc3RhdGljIGludCBtdGtfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiAJ CWlmICghZXRoLT5uZXRkZXZbaV0pCiAJCQljb250aW51ZTsKIAkJbXRrX3N0b3AoZXRoLT5uZXRk ZXZbaV0pOworCQltYWMgPSBuZXRkZXZfcHJpdihldGgtPm5ldGRldltpXSk7CisJCXBoeWxpbmtf ZGlzY29ubmVjdF9waHkobWFjLT5waHlsaW5rKTsKIAl9CiAKIAltdGtfaHdfZGVpbml0KGV0aCk7 CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWRpYXRlay9tdGtfZXRoX3NvYy5o IGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVkaWF0ZWsvbXRrX2V0aF9zb2MuaAppbmRleCBiYWI5 NGY3NjNlMmMuLjNiZmNiYTlmZmI1OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQv bWVkaWF0ZWsvbXRrX2V0aF9zb2MuaAorKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWRpYXRl ay9tdGtfZXRoX3NvYy5oCkBAIC0xNCw2ICsxNCw3IEBACiAjaW5jbHVkZSA8bGludXgvb2ZfbmV0 Lmg+CiAjaW5jbHVkZSA8bGludXgvdTY0X3N0YXRzX3N5bmMuaD4KICNpbmNsdWRlIDxsaW51eC9y ZWZjb3VudC5oPgorI2luY2x1ZGUgPGxpbnV4L3BoeWxpbmsuaD4KIAogI2RlZmluZSBNVEtfUURN QV9QQUdFX1NJWkUJMjA0OAogI2RlZmluZQlNVEtfTUFYX1JYX0xFTkdUSAkxNTM2CkBAIC0zMjAs MTIgKzMyMSwxOCBAQAogI2RlZmluZSBNQUNfTUNSX1NQRUVEXzEwMAlCSVQoMikKICNkZWZpbmUg TUFDX01DUl9GT1JDRV9EUFgJQklUKDEpCiAjZGVmaW5lIE1BQ19NQ1JfRk9SQ0VfTElOSwlCSVQo MCkKLSNkZWZpbmUgTUFDX01DUl9GSVhFRF9MSU5LCShNQUNfTUNSX01BWF9SWF8xNTM2IHwgTUFD X01DUl9JUEdfQ0ZHIHwgXAotCQkJCSBNQUNfTUNSX0ZPUkNFX01PREUgfCBNQUNfTUNSX1RYX0VO IHwgXAotCQkJCSBNQUNfTUNSX1JYX0VOIHwgTUFDX01DUl9CQUNLT0ZGX0VOIHwgXAotCQkJCSBN QUNfTUNSX0JBQ0tQUl9FTiB8IE1BQ19NQ1JfRk9SQ0VfUlhfRkMgfCBcCi0JCQkJIE1BQ19NQ1Jf Rk9SQ0VfVFhfRkMgfCBNQUNfTUNSX1NQRUVEXzEwMDAgfCBcCi0JCQkJIE1BQ19NQ1JfRk9SQ0Vf RFBYIHwgTUFDX01DUl9GT1JDRV9MSU5LKQorCisvKiBNYWMgc3RhdHVzIHJlZ2lzdGVycyAqLwor I2RlZmluZSBNVEtfTUFDX01TUih4KQkJKDB4MTAxMDggKyAoeCAqIDB4MTAwKSkKKyNkZWZpbmUg TUFDX01TUl9FRUUxRwkJQklUKDcpCisjZGVmaW5lIE1BQ19NU1JfRUVFMTAwTQkJQklUKDYpCisj ZGVmaW5lIE1BQ19NU1JfUlhfRkMJCUJJVCg1KQorI2RlZmluZSBNQUNfTVNSX1RYX0ZDCQlCSVQo NCkKKyNkZWZpbmUgTUFDX01TUl9TUEVFRF8xMDAwCUJJVCgzKQorI2RlZmluZSBNQUNfTVNSX1NQ RUVEXzEwMAlCSVQoMikKKyNkZWZpbmUgTUFDX01TUl9TUEVFRF9NQVNLCShNQUNfTVNSX1NQRUVE XzEwMDAgfCBNQUNfTVNSX1NQRUVEXzEwMCkKKyNkZWZpbmUgTUFDX01TUl9EUFgJCUJJVCgxKQor I2RlZmluZSBNQUNfTVNSX0xJTksJCUJJVCgwKQogCiAvKiBUUkdNSUkgUlhDIGNvbnRyb2wgcmVn aXN0ZXIgKi8KICNkZWZpbmUgVFJHTUlJX1JDS19DVFJMCQkweDEwMzAwCkBAIC04MTUsMjIgKzgy MiwyMyBAQCBzdHJ1Y3QgbXRrX2V0aCB7CiAvKiBzdHJ1Y3QgbXRrX21hYyAtCXRoZSBzdHJ1Y3R1 cmUgdGhhdCBob2xkcyB0aGUgaW5mbyBhYm91dCB0aGUgTUFDcyBvZiB0aGUKICAqCQkJU29DCiAg KiBAaWQ6CQkJVGhlIG51bWJlciBvZiB0aGUgTUFDCi0gKiBAZ2VfbW9kZTogICAgICAgICAgICBJ bnRlcmZhY2UgbW9kZSBrZXB0IGZvciBzZXR1cCByZXN0b3JpbmcKKyAqIEBpbnRlcmZhY2U6CQlJ bnRlcmZhY2UgbW9kZSBrZXB0IGZvciBkZXRlY3RpbmcgY2hhbmdlIGluIGh3IHNldHRpbmdzCiAg KiBAb2Zfbm9kZToJCU91ciBkZXZpY2V0cmVlIG5vZGUKICAqIEBodzoJCQlCYWNrcG9pbnRlciB0 byBvdXIgbWFpbiBkYXRhc3RydXR1cmUKICAqIEBod19zdGF0czoJCVBhY2tldCBzdGF0aXN0aWNz IGNvdW50ZXIKLSAqIEB0cmdtaWkJCUluZGljYXRlIGlmIHRoZSBNQUMgdXNlcyBUUkdNSUkgY29u bmVjdGVkIHRvIGludGVybmFsCi0JCQlzd2l0Y2gKICAqLwogc3RydWN0IG10a19tYWMgewogCWlu dAkJCQlpZDsKLQlpbnQJCQkJZ2VfbW9kZTsKKwlwaHlfaW50ZXJmYWNlX3QJCQlpbnRlcmZhY2U7 CisJdW5zaWduZWQgaW50CQkJbW9kZTsKKwlpbnQJCQkJc3BlZWQ7CiAJc3RydWN0IGRldmljZV9u b2RlCQkqb2Zfbm9kZTsKKwlzdHJ1Y3QgcGh5bGluawkJCSpwaHlsaW5rOworCXN0cnVjdCBwaHls aW5rX2NvbmZpZwkJcGh5bGlua19jb25maWc7CiAJc3RydWN0IG10a19ldGgJCQkqaHc7CiAJc3Ry dWN0IG10a19od19zdGF0cwkJKmh3X3N0YXRzOwogCV9fYmUzMgkJCQlod2xyb19pcFtNVEtfTUFY X0xST19JUF9DTlRdOwogCWludAkJCQlod2xyb19pcF9jbnQ7Ci0JYm9vbAkJCQl0cmdtaWk7CiB9 OwogCiAvKiB0aGUgc3RydWN0IGRlc2NyaWJpbmcgdGhlIFNvQy4gdGhlc2UgYXJlIGRlY2xhcmVk IGluIHRoZSBzb2NfeHl6LmMgZmlsZXMgKi8KLS0gCjIuMjAuMQoKCl9fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCkxpbnV4LW1lZGlhdGVrIG1haWxpbmcgbGlz dApMaW51eC1tZWRpYXRla0BsaXN0cy5pbmZyYWRlYWQub3JnCmh0dHA6Ly9saXN0cy5pbmZyYWRl YWQub3JnL21haWxtYW4vbGlzdGluZm8vbGludXgtbWVkaWF0ZWsK