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 25C57C3A5A8 for ; Mon, 2 Sep 2019 13:02:43 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id F126B217F4 for ; Mon, 2 Sep 2019 13:02:42 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=vdorst.com header.i=@vdorst.com header.b="az5UkfxB" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1730057AbfIBNCl (ORCPT ); Mon, 2 Sep 2019 09:02:41 -0400 Received: from mx.0dd.nl ([5.2.79.48]:35072 "EHLO mx.0dd.nl" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1730048AbfIBNCk (ORCPT ); Mon, 2 Sep 2019 09:02:40 -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 88FF95FBAB; Mon, 2 Sep 2019 15:02:35 +0200 (CEST) Authentication-Results: mx.0dd.nl; dkim=pass (2048-bit key) header.d=vdorst.com header.i=@vdorst.com header.b="az5UkfxB"; dkim-atps=neutral Received: from pc-rene.vdorst.com (pc-rene.vdorst.com [192.168.2.232]) by mail.vdorst.com (Postfix) with ESMTPA id 466261DB401A; Mon, 2 Sep 2019 15:02:35 +0200 (CEST) DKIM-Filter: OpenDKIM Filter v2.11.0 mail.vdorst.com 466261DB401A DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=vdorst.com; s=default; t=1567429355; bh=f9WqKZUCC1IscPa4l+rg5ZDVraoOS3GhoWyxkIj1AVk=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=az5UkfxBuHD+yYDkVg2J5E3rnSrDl99dhx+QZ/Svsm2KMG2bzxBUCrXBmM6QzkQfH DVU3LsP6CFL3smaluN1R6NhnRauOGBlvMuXXE+uYoB22YckL2bTpXOh4RuFboeIdEZ 4wq9TJKTn2SCoL18pNvwf6I/FdCv7QCRb0TCd+FKQDah9uZiQ8YHWEjpJt3vSZHXIi b7EjfqV2L5UasbP62UqhmpkBN1etwJ5zxehF22DJF//bGzAO4BLkU3QUuv5VP+Ci8/ U4EsUjj5QDKO49xGkEd2s3dGbeYNHXYrHfGYdBYa/IGBw15LbNi6FVnaMxycfz8Jq7 IT6tJ/hltM/JQ== From: =?UTF-8?q?Ren=C3=A9=20van=20Dorst?= To: Sean Wang , Andrew Lunn , Vivien Didelot , Florian Fainelli , "David S . Miller" , Matthias Brugger Cc: netdev@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-mediatek@lists.infradead.org, Russell King , John Crispin , linux-mips@vger.kernel.org, Frank Wunderlich , =?UTF-8?q?Ren=C3=A9=20van=20Dorst?= , Russell King Subject: [PATCH net-next v3 1/3] net: dsa: mt7530: Convert to PHYLINK API Date: Mon, 2 Sep 2019 15:02:24 +0200 Message-Id: <20190902130226.26845-2-opensource@vdorst.com> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20190902130226.26845-1-opensource@vdorst.com> References: <20190902130226.26845-1-opensource@vdorst.com> 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 Convert mt7530 to PHYLINK API Signed-off-by: René van Dorst Tested-by: Frank Wunderlich Acked-by: Russell King --- v2->v3: * No change * Add tags acked-by and tested-by v1->v2: * Refactor "unsupported" phy_interface part in mt7530_phylink_mac_validate() suggested by Russell King * Report and return when phylink tries to use autoneg_inband in mt7530_phylink_mac_config() suggested by Russell King * Refactor port 6 setup in mt7530_phylink_mac_config() rfc->v1: * Renamed P5_MODE_* to P5_INTF_SEL_*. fits the function more * Convert if-statement for speed bits to a switch suggested by Daniel Santos * Refactor flow_control pause bits and don't use state->link in mt7530_phylink_mac_config() suggested by Russell King * Move MAC tx/rx en/disable to mt7530_phylink_mac_link_up/down() suggested by Russell King * Always support PHY_INTERFACE_MODE_NA in mt7530_phylink_validate() suggested by Russell King * Added phylink_set_port_modes() in mt7530_phylink_validate() suggested by Russell King * Remove dev_err on the end of mt7530_phylink_mac_config() suggested by Russell King drivers/net/dsa/mt7530.c | 266 +++++++++++++++++++++++++++++---------- drivers/net/dsa/mt7530.h | 32 +++-- 2 files changed, 211 insertions(+), 87 deletions(-) diff --git a/drivers/net/dsa/mt7530.c b/drivers/net/dsa/mt7530.c index c48e29486b10..ecc13b57e619 100644 --- a/drivers/net/dsa/mt7530.c +++ b/drivers/net/dsa/mt7530.c @@ -13,7 +13,7 @@ #include #include #include -#include +#include #include #include #include @@ -633,63 +633,6 @@ mt7530_get_sset_count(struct dsa_switch *ds, int port, int sset) return ARRAY_SIZE(mt7530_mib); } -static void mt7530_adjust_link(struct dsa_switch *ds, int port, - struct phy_device *phydev) -{ - struct mt7530_priv *priv = ds->priv; - - if (phy_is_pseudo_fixed_link(phydev)) { - dev_dbg(priv->dev, "phy-mode for master device = %x\n", - phydev->interface); - - /* Setup TX circuit incluing relevant PAD and driving */ - mt7530_pad_clk_setup(ds, phydev->interface); - - if (priv->id == ID_MT7530) { - /* Setup RX circuit, relevant PAD and driving on the - * host which must be placed after the setup on the - * device side is all finished. - */ - mt7623_pad_clk_setup(ds); - } - } else { - u16 lcl_adv = 0, rmt_adv = 0; - u8 flowctrl; - u32 mcr = PMCR_USERP_LINK | PMCR_FORCE_MODE; - - switch (phydev->speed) { - case SPEED_1000: - mcr |= PMCR_FORCE_SPEED_1000; - break; - case SPEED_100: - mcr |= PMCR_FORCE_SPEED_100; - break; - } - - if (phydev->link) - mcr |= PMCR_FORCE_LNK; - - if (phydev->duplex) { - mcr |= PMCR_FORCE_FDX; - - if (phydev->pause) - rmt_adv = LPA_PAUSE_CAP; - if (phydev->asym_pause) - rmt_adv |= LPA_PAUSE_ASYM; - - lcl_adv = linkmode_adv_to_lcl_adv_t( - phydev->advertising); - flowctrl = mii_resolve_flowctrl_fdx(lcl_adv, rmt_adv); - - if (flowctrl & FLOW_CTRL_TX) - mcr |= PMCR_TX_FC_EN; - if (flowctrl & FLOW_CTRL_RX) - mcr |= PMCR_RX_FC_EN; - } - mt7530_write(priv, MT7530_PMCR_P(port), mcr); - } -} - static int mt7530_cpu_port_enable(struct mt7530_priv *priv, int port) @@ -698,9 +641,6 @@ mt7530_cpu_port_enable(struct mt7530_priv *priv, mt7530_write(priv, MT7530_PVC_P(port), PORT_SPEC_TAG); - /* Setup the MAC by default for the cpu port */ - mt7530_write(priv, MT7530_PMCR_P(port), PMCR_CPUP_LINK); - /* Disable auto learning on the cpu port */ mt7530_set(priv, MT7530_PSC_P(port), SA_DIS); @@ -731,9 +671,6 @@ mt7530_port_enable(struct dsa_switch *ds, int port, mutex_lock(&priv->reg_mutex); - /* Setup the MAC for the user port */ - mt7530_write(priv, MT7530_PMCR_P(port), PMCR_USERP_LINK); - /* Allow the user port gets connected to the cpu port and also * restore the port matrix if the port is the member of a certain * bridge. @@ -742,7 +679,7 @@ mt7530_port_enable(struct dsa_switch *ds, int port, priv->ports[port].enable = true; mt7530_rmw(priv, MT7530_PCR_P(port), PCR_MATRIX_MASK, priv->ports[port].pm); - mt7530_port_set_status(priv, port, 1); + mt7530_port_set_status(priv, port, 0); mutex_unlock(&priv->reg_mutex); @@ -1232,10 +1169,10 @@ static int mt7530_setup(struct dsa_switch *ds) { struct mt7530_priv *priv = ds->priv; - int ret, i; - u32 id, val; - struct device_node *dn; struct mt7530_dummy_poll p; + struct device_node *dn; + u32 id, val; + int ret, i; /* The parent node of master netdev which holds the common system * controller also is the container for two GMACs nodes representing @@ -1305,6 +1242,8 @@ mt7530_setup(struct dsa_switch *ds) val |= MHWTRAP_MANUAL; mt7530_write(priv, MT7530_MHWTRAP, val); + priv->p6_interface = PHY_INTERFACE_MODE_NA; + /* Enable and reset MIB counters */ mt7530_mib_reset(ds); @@ -1329,6 +1268,191 @@ mt7530_setup(struct dsa_switch *ds) return 0; } +static void mt7530_phylink_mac_config(struct dsa_switch *ds, int port, + unsigned int mode, + const struct phylink_link_state *state) +{ + struct mt7530_priv *priv = ds->priv; + u32 mcr_cur, mcr_new; + + switch (port) { + case 0: /* Internal phy */ + case 1: + case 2: + case 3: + case 4: + if (state->interface != PHY_INTERFACE_MODE_GMII) + return; + break; + /* case 5: Port 5 is not supported! */ + case 6: /* 1st cpu port */ + if (priv->p6_interface == state->interface) + break; + + if (state->interface != PHY_INTERFACE_MODE_RGMII && + state->interface != PHY_INTERFACE_MODE_TRGMII) + return; + + /* Setup TX circuit incluing relevant PAD and driving */ + mt7530_pad_clk_setup(ds, state->interface); + + if (priv->id == ID_MT7530) { + /* Setup RX circuit, relevant PAD and driving on the + * host which must be placed after the setup on the + * device side is all finished. + */ + mt7623_pad_clk_setup(ds); + } + + priv->p6_interface = state->interface; + break; + default: + dev_err(ds->dev, "%s: unsupported port: %i\n", __func__, port); + return; + } + + if (phylink_autoneg_inband(mode)) { + dev_err(ds->dev, "%s: in-band negotiation unsupported\n", + __func__); + return; + } + + mcr_cur = mt7530_read(priv, MT7530_PMCR_P(port)); + mcr_new = mcr_cur; + mcr_new &= ~(PMCR_FORCE_SPEED_1000 | PMCR_FORCE_SPEED_100 | + PMCR_FORCE_FDX | PMCR_TX_FC_EN | PMCR_RX_FC_EN); + mcr_new |= PMCR_IFG_XMIT(1) | PMCR_MAC_MODE | PMCR_BACKOFF_EN | + PMCR_BACKPR_EN | PMCR_FORCE_MODE | PMCR_FORCE_LNK; + + switch (state->speed) { + case SPEED_1000: + mcr_new |= PMCR_FORCE_SPEED_1000; + break; + case SPEED_100: + mcr_new |= PMCR_FORCE_SPEED_100; + break; + } + if (state->duplex == DUPLEX_FULL) { + mcr_new |= PMCR_FORCE_FDX; + if (state->pause & MLO_PAUSE_TX) + mcr_new |= PMCR_TX_FC_EN; + if (state->pause & MLO_PAUSE_RX) + mcr_new |= PMCR_RX_FC_EN; + } + + if (mcr_new != mcr_cur) + mt7530_write(priv, MT7530_PMCR_P(port), mcr_new); +} + +static void mt7530_phylink_mac_link_down(struct dsa_switch *ds, int port, + unsigned int mode, + phy_interface_t interface) +{ + struct mt7530_priv *priv = ds->priv; + + mt7530_port_set_status(priv, port, 0); +} + +static void mt7530_phylink_mac_link_up(struct dsa_switch *ds, int port, + unsigned int mode, + phy_interface_t interface, + struct phy_device *phydev) +{ + struct mt7530_priv *priv = ds->priv; + + mt7530_port_set_status(priv, port, 1); +} + +static void mt7530_phylink_validate(struct dsa_switch *ds, int port, + unsigned long *supported, + struct phylink_link_state *state) +{ + __ETHTOOL_DECLARE_LINK_MODE_MASK(mask) = { 0, }; + + switch (port) { + case 0: /* Internal phy */ + case 1: + case 2: + case 3: + case 4: + if (state->interface != PHY_INTERFACE_MODE_NA && + state->interface != PHY_INTERFACE_MODE_GMII) + goto unsupported; + break; + /* case 5: Port 5 not supported! */ + case 6: /* 1st cpu port */ + if (state->interface != PHY_INTERFACE_MODE_NA && + state->interface != PHY_INTERFACE_MODE_RGMII && + state->interface != PHY_INTERFACE_MODE_TRGMII) + goto unsupported; + break; + default: + dev_err(ds->dev, "%s: unsupported port: %i\n", __func__, port); +unsupported: + linkmode_zero(supported); + return; + } + + phylink_set_port_modes(mask); + phylink_set(mask, Autoneg); + + if (state->interface != PHY_INTERFACE_MODE_TRGMII) { + phylink_set(mask, 10baseT_Half); + phylink_set(mask, 10baseT_Full); + phylink_set(mask, 100baseT_Half); + phylink_set(mask, 100baseT_Full); + phylink_set(mask, 1000baseT_Half); + } + + phylink_set(mask, 1000baseT_Full); + + phylink_set(mask, Pause); + phylink_set(mask, Asym_Pause); + + linkmode_and(supported, supported, mask); + linkmode_and(state->advertising, state->advertising, mask); +} + +static int +mt7530_phylink_mac_link_state(struct dsa_switch *ds, int port, + struct phylink_link_state *state) +{ + struct mt7530_priv *priv = ds->priv; + u32 pmsr; + + if (port < 0 || port >= MT7530_NUM_PORTS) + return -EINVAL; + + pmsr = mt7530_read(priv, MT7530_PMSR_P(port)); + + state->link = (pmsr & PMSR_LINK); + state->an_complete = state->link; + state->duplex = !!(pmsr & PMSR_DPX); + + switch (pmsr & PMSR_SPEED_MASK) { + case PMSR_SPEED_10: + state->speed = SPEED_10; + break; + case PMSR_SPEED_100: + state->speed = SPEED_100; + break; + case PMSR_SPEED_1000: + state->speed = SPEED_1000; + break; + default: + state->speed = SPEED_UNKNOWN; + break; + } + + state->pause &= ~(MLO_PAUSE_RX | MLO_PAUSE_TX); + if (pmsr & PMSR_RX_FC) + state->pause |= MLO_PAUSE_RX; + if (pmsr & PMSR_TX_FC) + state->pause |= MLO_PAUSE_TX; + + return 1; +} + static const struct dsa_switch_ops mt7530_switch_ops = { .get_tag_protocol = mtk_get_tag_protocol, .setup = mt7530_setup, @@ -1337,7 +1461,6 @@ static const struct dsa_switch_ops mt7530_switch_ops = { .phy_write = mt7530_phy_write, .get_ethtool_stats = mt7530_get_ethtool_stats, .get_sset_count = mt7530_get_sset_count, - .adjust_link = mt7530_adjust_link, .port_enable = mt7530_port_enable, .port_disable = mt7530_port_disable, .port_stp_state_set = mt7530_stp_state_set, @@ -1350,6 +1473,11 @@ static const struct dsa_switch_ops mt7530_switch_ops = { .port_vlan_prepare = mt7530_port_vlan_prepare, .port_vlan_add = mt7530_port_vlan_add, .port_vlan_del = mt7530_port_vlan_del, + .phylink_validate = mt7530_phylink_validate, + .phylink_mac_link_state = mt7530_phylink_mac_link_state, + .phylink_mac_config = mt7530_phylink_mac_config, + .phylink_mac_link_down = mt7530_phylink_mac_link_down, + .phylink_mac_link_up = mt7530_phylink_mac_link_up, }; static const struct of_device_id mt7530_of_match[] = { diff --git a/drivers/net/dsa/mt7530.h b/drivers/net/dsa/mt7530.h index bfac90f48102..107dd04acede 100644 --- a/drivers/net/dsa/mt7530.h +++ b/drivers/net/dsa/mt7530.h @@ -198,26 +198,20 @@ enum mt7530_vlan_port_attr { #define PMCR_FORCE_SPEED_100 BIT(2) #define PMCR_FORCE_FDX BIT(1) #define PMCR_FORCE_LNK BIT(0) -#define PMCR_COMMON_LINK (PMCR_IFG_XMIT(1) | PMCR_MAC_MODE | \ - PMCR_BACKOFF_EN | PMCR_BACKPR_EN | \ - PMCR_TX_EN | PMCR_RX_EN | \ - PMCR_TX_FC_EN | PMCR_RX_FC_EN) -#define PMCR_CPUP_LINK (PMCR_COMMON_LINK | PMCR_FORCE_MODE | \ - PMCR_FORCE_SPEED_1000 | \ - PMCR_FORCE_FDX | \ - PMCR_FORCE_LNK) -#define PMCR_USERP_LINK PMCR_COMMON_LINK -#define PMCR_FIXED_LINK (PMCR_IFG_XMIT(1) | PMCR_MAC_MODE | \ - PMCR_FORCE_MODE | PMCR_TX_EN | \ - PMCR_RX_EN | PMCR_BACKPR_EN | \ - PMCR_BACKOFF_EN | \ - PMCR_FORCE_SPEED_1000 | \ - PMCR_FORCE_FDX | \ - PMCR_FORCE_LNK) -#define PMCR_FIXED_LINK_FC (PMCR_FIXED_LINK | \ - PMCR_TX_FC_EN | PMCR_RX_FC_EN) +#define PMCR_SPEED_MASK (PMCR_FORCE_SPEED_100 | \ + PMCR_FORCE_SPEED_1000) #define MT7530_PMSR_P(x) (0x3008 + (x) * 0x100) +#define PMSR_EEE1G BIT(7) +#define PMSR_EEE100M BIT(6) +#define PMSR_RX_FC BIT(5) +#define PMSR_TX_FC BIT(4) +#define PMSR_SPEED_1000 BIT(3) +#define PMSR_SPEED_100 BIT(2) +#define PMSR_SPEED_10 0x00 +#define PMSR_SPEED_MASK (PMSR_SPEED_100 | PMSR_SPEED_1000) +#define PMSR_DPX BIT(1) +#define PMSR_LINK BIT(0) /* Register for MIB */ #define MT7530_PORT_MIB_COUNTER(x) (0x4000 + (x) * 0x100) @@ -423,6 +417,7 @@ struct mt7530_port { * @ports: Holding the state among ports * @reg_mutex: The lock for protecting among process accessing * registers + * @p6_interface Holding the current port 6 interface */ struct mt7530_priv { struct device *dev; @@ -435,6 +430,7 @@ struct mt7530_priv { struct gpio_desc *reset; unsigned int id; bool mcm; + phy_interface_t p6_interface; struct mt7530_port ports[MT7530_NUM_PORTS]; /* protect among processes for registers access*/ -- 2.20.1 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=DKIMWL_WL_HIGH,DKIM_SIGNED, DKIM_VALID,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH,MAILING_LIST_MULTI, SIGNED_OFF_BY,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED,USER_AGENT_GIT autolearn=ham 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 4796BC3A59E for ; Mon, 2 Sep 2019 13:03:30 +0000 (UTC) Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 123D32168B for ; Mon, 2 Sep 2019 13:03:30 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=lists.infradead.org header.i=@lists.infradead.org header.b="UntafgxK"; dkim=fail reason="signature verification failed" (2048-bit key) header.d=vdorst.com header.i=@vdorst.com header.b="az5UkfxB" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 123D32168B Authentication-Results: mail.kernel.org; dmarc=fail (p=reject dis=none) header.from=vdorst.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=linux-arm-kernel-bounces+infradead-linux-arm-kernel=archiver.kernel.org@lists.infradead.org DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20170209; h=Sender: Content-Transfer-Encoding:Content-Type:Cc:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:MIME-Version:References:In-Reply-To: Message-Id:Date:Subject:To:From:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=G7bZ2I2Xgs13bQSzQSnkw0OYeqTYHTqLRnq7UWQ5qr8=; b=UntafgxKraOa4m kwcBo7f+3afKQYBAIVeD72uR1j1pmUSOum2/D1IQOtQBn1ANyqhBBDfMG1QYlKv3QEstVg+mt44ab P8TES6uB5lTowJBvB7tmm866AbW7mFcRVUUSajhVvE8smqtI2PQnhW8sp3+BfVsBnzIU3BNfA3xD/ rtfxF/HIfBewqgyiXEfhsFpBYD0+z9O50P/ik8iYgM7pDooKo5FgRe7nX3BeKNrqkkmKkN/YpWuKR B7MMGySx9XEKzw1XkmcP1H2tuxqQCDYBuv9mREHNK0fhqh0pgHODwBUqsMsUP92V+IHBX43b2V1pj GugmpculHBpUlewaSAng==; Received: from localhost ([127.0.0.1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.92 #3 (Red Hat Linux)) id 1i4lzN-0000l4-Qh; Mon, 02 Sep 2019 13:03:22 +0000 Received: from mx.0dd.nl ([5.2.79.48]) by bombadil.infradead.org with esmtp (Exim 4.92 #3 (Red Hat Linux)) id 1i4lyk-00005M-Gy; Mon, 02 Sep 2019 13:02:45 +0000 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 88FF95FBAB; Mon, 2 Sep 2019 15:02:35 +0200 (CEST) Authentication-Results: mx.0dd.nl; dkim=pass (2048-bit key) header.d=vdorst.com header.i=@vdorst.com header.b="az5UkfxB"; dkim-atps=neutral Received: from pc-rene.vdorst.com (pc-rene.vdorst.com [192.168.2.232]) by mail.vdorst.com (Postfix) with ESMTPA id 466261DB401A; Mon, 2 Sep 2019 15:02:35 +0200 (CEST) DKIM-Filter: OpenDKIM Filter v2.11.0 mail.vdorst.com 466261DB401A DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=vdorst.com; s=default; t=1567429355; bh=f9WqKZUCC1IscPa4l+rg5ZDVraoOS3GhoWyxkIj1AVk=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=az5UkfxBuHD+yYDkVg2J5E3rnSrDl99dhx+QZ/Svsm2KMG2bzxBUCrXBmM6QzkQfH DVU3LsP6CFL3smaluN1R6NhnRauOGBlvMuXXE+uYoB22YckL2bTpXOh4RuFboeIdEZ 4wq9TJKTn2SCoL18pNvwf6I/FdCv7QCRb0TCd+FKQDah9uZiQ8YHWEjpJt3vSZHXIi b7EjfqV2L5UasbP62UqhmpkBN1etwJ5zxehF22DJF//bGzAO4BLkU3QUuv5VP+Ci8/ U4EsUjj5QDKO49xGkEd2s3dGbeYNHXYrHfGYdBYa/IGBw15LbNi6FVnaMxycfz8Jq7 IT6tJ/hltM/JQ== From: =?UTF-8?q?Ren=C3=A9=20van=20Dorst?= To: Sean Wang , Andrew Lunn , Vivien Didelot , Florian Fainelli , "David S . Miller" , Matthias Brugger Subject: [PATCH net-next v3 1/3] net: dsa: mt7530: Convert to PHYLINK API Date: Mon, 2 Sep 2019 15:02:24 +0200 Message-Id: <20190902130226.26845-2-opensource@vdorst.com> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20190902130226.26845-1-opensource@vdorst.com> References: <20190902130226.26845-1-opensource@vdorst.com> MIME-Version: 1.0 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20190902_060242_850981_8F72861F X-CRM114-Status: GOOD ( 19.87 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Frank Wunderlich , netdev@vger.kernel.org, linux-mips@vger.kernel.org, Russell King , =?UTF-8?q?Ren=C3=A9=20van=20Dorst?= , Russell King , linux-mediatek@lists.infradead.org, John Crispin , linux-arm-kernel@lists.infradead.org Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+infradead-linux-arm-kernel=archiver.kernel.org@lists.infradead.org Q29udmVydCBtdDc1MzAgdG8gUEhZTElOSyBBUEkKClNpZ25lZC1vZmYtYnk6IFJlbsOpIHZhbiBE b3JzdCA8b3BlbnNvdXJjZUB2ZG9yc3QuY29tPgpUZXN0ZWQtYnk6IEZyYW5rIFd1bmRlcmxpY2gg PGZyYW5rLXdAcHVibGljLWZpbGVzLmRlPgpBY2tlZC1ieTogUnVzc2VsbCBLaW5nIDxybWsra2Vy bmVsQGFybWxpbnV4Lm9yZy51az4KLS0tCnYyLT52MzoKKiBObyBjaGFuZ2UKKiBBZGQgdGFncyBh Y2tlZC1ieSBhbmQgdGVzdGVkLWJ5CnYxLT52MjoKKiBSZWZhY3RvciAidW5zdXBwb3J0ZWQiIHBo eV9pbnRlcmZhY2UgcGFydCBpbgogIG10NzUzMF9waHlsaW5rX21hY192YWxpZGF0ZSgpIHN1Z2dl c3RlZCBieSBSdXNzZWxsIEtpbmcKKiBSZXBvcnQgYW5kIHJldHVybiB3aGVuIHBoeWxpbmsgdHJp ZXMgdG8gdXNlIGF1dG9uZWdfaW5iYW5kIGluCiAgbXQ3NTMwX3BoeWxpbmtfbWFjX2NvbmZpZygp IHN1Z2dlc3RlZCBieSBSdXNzZWxsIEtpbmcKKiBSZWZhY3RvciBwb3J0IDYgc2V0dXAgaW4gbXQ3 NTMwX3BoeWxpbmtfbWFjX2NvbmZpZygpCnJmYy0+djE6CiogUmVuYW1lZCBQNV9NT0RFXyogdG8g UDVfSU5URl9TRUxfKi4gZml0cyB0aGUgZnVuY3Rpb24gbW9yZQoqIENvbnZlcnQgaWYtc3RhdGVt ZW50IGZvciBzcGVlZCBiaXRzIHRvIGEgc3dpdGNoIHN1Z2dlc3RlZCBieQogIERhbmllbCBTYW50 b3MKKiBSZWZhY3RvciBmbG93X2NvbnRyb2wgcGF1c2UgYml0cyBhbmQgZG9uJ3QgdXNlIHN0YXRl LT5saW5rIGluCiAgbXQ3NTMwX3BoeWxpbmtfbWFjX2NvbmZpZygpIHN1Z2dlc3RlZCBieSBSdXNz ZWxsIEtpbmcKKiBNb3ZlIE1BQyB0eC9yeCBlbi9kaXNhYmxlIHRvIG10NzUzMF9waHlsaW5rX21h Y19saW5rX3VwL2Rvd24oKQogIHN1Z2dlc3RlZCBieSBSdXNzZWxsIEtpbmcKKiBBbHdheXMgc3Vw cG9ydCBQSFlfSU5URVJGQUNFX01PREVfTkEgaW4gbXQ3NTMwX3BoeWxpbmtfdmFsaWRhdGUoKQog IHN1Z2dlc3RlZCBieSBSdXNzZWxsIEtpbmcKKiBBZGRlZCBwaHlsaW5rX3NldF9wb3J0X21vZGVz KCkgaW4gbXQ3NTMwX3BoeWxpbmtfdmFsaWRhdGUoKSBzdWdnZXN0ZWQKICBieSBSdXNzZWxsIEtp bmcKKiBSZW1vdmUgZGV2X2VyciBvbiB0aGUgZW5kIG9mIG10NzUzMF9waHlsaW5rX21hY19jb25m aWcoKSBzdWdnZXN0ZWQgYnkKICBSdXNzZWxsIEtpbmcKCiBkcml2ZXJzL25ldC9kc2EvbXQ3NTMw LmMgfCAyNjYgKysrKysrKysrKysrKysrKysrKysrKysrKysrKystLS0tLS0tLS0tCiBkcml2ZXJz L25ldC9kc2EvbXQ3NTMwLmggfCAgMzIgKysrLS0KIDIgZmlsZXMgY2hhbmdlZCwgMjExIGluc2Vy dGlvbnMoKyksIDg3IGRlbGV0aW9ucygtKQoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2RzYS9t dDc1MzAuYyBiL2RyaXZlcnMvbmV0L2RzYS9tdDc1MzAuYwppbmRleCBjNDhlMjk0ODZiMTAuLmVj YzEzYjU3ZTYxOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZHNhL210NzUzMC5jCisrKyBiL2Ry aXZlcnMvbmV0L2RzYS9tdDc1MzAuYwpAQCAtMTMsNyArMTMsNyBAQAogI2luY2x1ZGUgPGxpbnV4 L29mX21kaW8uaD4KICNpbmNsdWRlIDxsaW51eC9vZl9uZXQuaD4KICNpbmNsdWRlIDxsaW51eC9v Zl9wbGF0Zm9ybS5oPgotI2luY2x1ZGUgPGxpbnV4L3BoeS5oPgorI2luY2x1ZGUgPGxpbnV4L3Bo eWxpbmsuaD4KICNpbmNsdWRlIDxsaW51eC9yZWdtYXAuaD4KICNpbmNsdWRlIDxsaW51eC9yZWd1 bGF0b3IvY29uc3VtZXIuaD4KICNpbmNsdWRlIDxsaW51eC9yZXNldC5oPgpAQCAtNjMzLDYzICs2 MzMsNiBAQCBtdDc1MzBfZ2V0X3NzZXRfY291bnQoc3RydWN0IGRzYV9zd2l0Y2ggKmRzLCBpbnQg cG9ydCwgaW50IHNzZXQpCiAJcmV0dXJuIEFSUkFZX1NJWkUobXQ3NTMwX21pYik7CiB9CiAKLXN0 YXRpYyB2b2lkIG10NzUzMF9hZGp1c3RfbGluayhzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMsIGludCBw b3J0LAotCQkJICAgICAgIHN0cnVjdCBwaHlfZGV2aWNlICpwaHlkZXYpCi17Ci0Jc3RydWN0IG10 NzUzMF9wcml2ICpwcml2ID0gZHMtPnByaXY7Ci0KLQlpZiAocGh5X2lzX3BzZXVkb19maXhlZF9s aW5rKHBoeWRldikpIHsKLQkJZGV2X2RiZyhwcml2LT5kZXYsICJwaHktbW9kZSBmb3IgbWFzdGVy IGRldmljZSA9ICV4XG4iLAotCQkJcGh5ZGV2LT5pbnRlcmZhY2UpOwotCi0JCS8qIFNldHVwIFRY IGNpcmN1aXQgaW5jbHVpbmcgcmVsZXZhbnQgUEFEIGFuZCBkcml2aW5nICovCi0JCW10NzUzMF9w YWRfY2xrX3NldHVwKGRzLCBwaHlkZXYtPmludGVyZmFjZSk7Ci0KLQkJaWYgKHByaXYtPmlkID09 IElEX01UNzUzMCkgewotCQkJLyogU2V0dXAgUlggY2lyY3VpdCwgcmVsZXZhbnQgUEFEIGFuZCBk cml2aW5nIG9uIHRoZQotCQkJICogaG9zdCB3aGljaCBtdXN0IGJlIHBsYWNlZCBhZnRlciB0aGUg c2V0dXAgb24gdGhlCi0JCQkgKiBkZXZpY2Ugc2lkZSBpcyBhbGwgZmluaXNoZWQuCi0JCQkgKi8K LQkJCW10NzYyM19wYWRfY2xrX3NldHVwKGRzKTsKLQkJfQotCX0gZWxzZSB7Ci0JCXUxNiBsY2xf YWR2ID0gMCwgcm10X2FkdiA9IDA7Ci0JCXU4IGZsb3djdHJsOwotCQl1MzIgbWNyID0gUE1DUl9V U0VSUF9MSU5LIHwgUE1DUl9GT1JDRV9NT0RFOwotCi0JCXN3aXRjaCAocGh5ZGV2LT5zcGVlZCkg ewotCQljYXNlIFNQRUVEXzEwMDA6Ci0JCQltY3IgfD0gUE1DUl9GT1JDRV9TUEVFRF8xMDAwOwot CQkJYnJlYWs7Ci0JCWNhc2UgU1BFRURfMTAwOgotCQkJbWNyIHw9IFBNQ1JfRk9SQ0VfU1BFRURf MTAwOwotCQkJYnJlYWs7Ci0JCX0KLQotCQlpZiAocGh5ZGV2LT5saW5rKQotCQkJbWNyIHw9IFBN Q1JfRk9SQ0VfTE5LOwotCi0JCWlmIChwaHlkZXYtPmR1cGxleCkgewotCQkJbWNyIHw9IFBNQ1Jf Rk9SQ0VfRkRYOwotCi0JCQlpZiAocGh5ZGV2LT5wYXVzZSkKLQkJCQlybXRfYWR2ID0gTFBBX1BB VVNFX0NBUDsKLQkJCWlmIChwaHlkZXYtPmFzeW1fcGF1c2UpCi0JCQkJcm10X2FkdiB8PSBMUEFf UEFVU0VfQVNZTTsKLQotCQkJbGNsX2FkdiA9IGxpbmttb2RlX2Fkdl90b19sY2xfYWR2X3QoCi0J CQkJcGh5ZGV2LT5hZHZlcnRpc2luZyk7Ci0JCQlmbG93Y3RybCA9IG1paV9yZXNvbHZlX2Zsb3dj dHJsX2ZkeChsY2xfYWR2LCBybXRfYWR2KTsKLQotCQkJaWYgKGZsb3djdHJsICYgRkxPV19DVFJM X1RYKQotCQkJCW1jciB8PSBQTUNSX1RYX0ZDX0VOOwotCQkJaWYgKGZsb3djdHJsICYgRkxPV19D VFJMX1JYKQotCQkJCW1jciB8PSBQTUNSX1JYX0ZDX0VOOwotCQl9Ci0JCW10NzUzMF93cml0ZShw cml2LCBNVDc1MzBfUE1DUl9QKHBvcnQpLCBtY3IpOwotCX0KLX0KLQogc3RhdGljIGludAogbXQ3 NTMwX2NwdV9wb3J0X2VuYWJsZShzdHJ1Y3QgbXQ3NTMwX3ByaXYgKnByaXYsCiAJCSAgICAgICBp bnQgcG9ydCkKQEAgLTY5OCw5ICs2NDEsNiBAQCBtdDc1MzBfY3B1X3BvcnRfZW5hYmxlKHN0cnVj dCBtdDc1MzBfcHJpdiAqcHJpdiwKIAltdDc1MzBfd3JpdGUocHJpdiwgTVQ3NTMwX1BWQ19QKHBv cnQpLAogCQkgICAgIFBPUlRfU1BFQ19UQUcpOwogCi0JLyogU2V0dXAgdGhlIE1BQyBieSBkZWZh dWx0IGZvciB0aGUgY3B1IHBvcnQgKi8KLQltdDc1MzBfd3JpdGUocHJpdiwgTVQ3NTMwX1BNQ1Jf UChwb3J0KSwgUE1DUl9DUFVQX0xJTkspOwotCiAJLyogRGlzYWJsZSBhdXRvIGxlYXJuaW5nIG9u IHRoZSBjcHUgcG9ydCAqLwogCW10NzUzMF9zZXQocHJpdiwgTVQ3NTMwX1BTQ19QKHBvcnQpLCBT QV9ESVMpOwogCkBAIC03MzEsOSArNjcxLDYgQEAgbXQ3NTMwX3BvcnRfZW5hYmxlKHN0cnVjdCBk c2Ffc3dpdGNoICpkcywgaW50IHBvcnQsCiAKIAltdXRleF9sb2NrKCZwcml2LT5yZWdfbXV0ZXgp OwogCi0JLyogU2V0dXAgdGhlIE1BQyBmb3IgdGhlIHVzZXIgcG9ydCAqLwotCW10NzUzMF93cml0 ZShwcml2LCBNVDc1MzBfUE1DUl9QKHBvcnQpLCBQTUNSX1VTRVJQX0xJTkspOwotCiAJLyogQWxs b3cgdGhlIHVzZXIgcG9ydCBnZXRzIGNvbm5lY3RlZCB0byB0aGUgY3B1IHBvcnQgYW5kIGFsc28K IAkgKiByZXN0b3JlIHRoZSBwb3J0IG1hdHJpeCBpZiB0aGUgcG9ydCBpcyB0aGUgbWVtYmVyIG9m IGEgY2VydGFpbgogCSAqIGJyaWRnZS4KQEAgLTc0Miw3ICs2NzksNyBAQCBtdDc1MzBfcG9ydF9l bmFibGUoc3RydWN0IGRzYV9zd2l0Y2ggKmRzLCBpbnQgcG9ydCwKIAlwcml2LT5wb3J0c1twb3J0 XS5lbmFibGUgPSB0cnVlOwogCW10NzUzMF9ybXcocHJpdiwgTVQ3NTMwX1BDUl9QKHBvcnQpLCBQ Q1JfTUFUUklYX01BU0ssCiAJCSAgIHByaXYtPnBvcnRzW3BvcnRdLnBtKTsKLQltdDc1MzBfcG9y dF9zZXRfc3RhdHVzKHByaXYsIHBvcnQsIDEpOworCW10NzUzMF9wb3J0X3NldF9zdGF0dXMocHJp diwgcG9ydCwgMCk7CiAKIAltdXRleF91bmxvY2soJnByaXYtPnJlZ19tdXRleCk7CiAKQEAgLTEy MzIsMTAgKzExNjksMTAgQEAgc3RhdGljIGludAogbXQ3NTMwX3NldHVwKHN0cnVjdCBkc2Ffc3dp dGNoICpkcykKIHsKIAlzdHJ1Y3QgbXQ3NTMwX3ByaXYgKnByaXYgPSBkcy0+cHJpdjsKLQlpbnQg cmV0LCBpOwotCXUzMiBpZCwgdmFsOwotCXN0cnVjdCBkZXZpY2Vfbm9kZSAqZG47CiAJc3RydWN0 IG10NzUzMF9kdW1teV9wb2xsIHA7CisJc3RydWN0IGRldmljZV9ub2RlICpkbjsKKwl1MzIgaWQs IHZhbDsKKwlpbnQgcmV0LCBpOwogCiAJLyogVGhlIHBhcmVudCBub2RlIG9mIG1hc3RlciBuZXRk ZXYgd2hpY2ggaG9sZHMgdGhlIGNvbW1vbiBzeXN0ZW0KIAkgKiBjb250cm9sbGVyIGFsc28gaXMg dGhlIGNvbnRhaW5lciBmb3IgdHdvIEdNQUNzIG5vZGVzIHJlcHJlc2VudGluZwpAQCAtMTMwNSw2 ICsxMjQyLDggQEAgbXQ3NTMwX3NldHVwKHN0cnVjdCBkc2Ffc3dpdGNoICpkcykKIAl2YWwgfD0g TUhXVFJBUF9NQU5VQUw7CiAJbXQ3NTMwX3dyaXRlKHByaXYsIE1UNzUzMF9NSFdUUkFQLCB2YWwp OwogCisJcHJpdi0+cDZfaW50ZXJmYWNlID0gUEhZX0lOVEVSRkFDRV9NT0RFX05BOworCiAJLyog RW5hYmxlIGFuZCByZXNldCBNSUIgY291bnRlcnMgKi8KIAltdDc1MzBfbWliX3Jlc2V0KGRzKTsK IApAQCAtMTMyOSw2ICsxMjY4LDE5MSBAQCBtdDc1MzBfc2V0dXAoc3RydWN0IGRzYV9zd2l0Y2gg KmRzKQogCXJldHVybiAwOwogfQogCitzdGF0aWMgdm9pZCBtdDc1MzBfcGh5bGlua19tYWNfY29u ZmlnKHN0cnVjdCBkc2Ffc3dpdGNoICpkcywgaW50IHBvcnQsCisJCQkJICAgICAgdW5zaWduZWQg aW50IG1vZGUsCisJCQkJICAgICAgY29uc3Qgc3RydWN0IHBoeWxpbmtfbGlua19zdGF0ZSAqc3Rh dGUpCit7CisJc3RydWN0IG10NzUzMF9wcml2ICpwcml2ID0gZHMtPnByaXY7CisJdTMyIG1jcl9j dXIsIG1jcl9uZXc7CisKKwlzd2l0Y2ggKHBvcnQpIHsKKwljYXNlIDA6IC8qIEludGVybmFsIHBo eSAqLworCWNhc2UgMToKKwljYXNlIDI6CisJY2FzZSAzOgorCWNhc2UgNDoKKwkJaWYgKHN0YXRl LT5pbnRlcmZhY2UgIT0gUEhZX0lOVEVSRkFDRV9NT0RFX0dNSUkpCisJCQlyZXR1cm47CisJCWJy ZWFrOworCS8qIGNhc2UgNTogUG9ydCA1IGlzIG5vdCBzdXBwb3J0ZWQhICovCisJY2FzZSA2OiAv KiAxc3QgY3B1IHBvcnQgKi8KKwkJaWYgKHByaXYtPnA2X2ludGVyZmFjZSA9PSBzdGF0ZS0+aW50 ZXJmYWNlKQorCQkJYnJlYWs7CisKKwkJaWYgKHN0YXRlLT5pbnRlcmZhY2UgIT0gUEhZX0lOVEVS RkFDRV9NT0RFX1JHTUlJICYmCisJCSAgICBzdGF0ZS0+aW50ZXJmYWNlICE9IFBIWV9JTlRFUkZB Q0VfTU9ERV9UUkdNSUkpCisJCQlyZXR1cm47CisKKwkJLyogU2V0dXAgVFggY2lyY3VpdCBpbmNs dWluZyByZWxldmFudCBQQUQgYW5kIGRyaXZpbmcgKi8KKwkJbXQ3NTMwX3BhZF9jbGtfc2V0dXAo ZHMsIHN0YXRlLT5pbnRlcmZhY2UpOworCisJCWlmIChwcml2LT5pZCA9PSBJRF9NVDc1MzApIHsK KwkJCS8qIFNldHVwIFJYIGNpcmN1aXQsIHJlbGV2YW50IFBBRCBhbmQgZHJpdmluZyBvbiB0aGUK KwkJCSAqIGhvc3Qgd2hpY2ggbXVzdCBiZSBwbGFjZWQgYWZ0ZXIgdGhlIHNldHVwIG9uIHRoZQor CQkJICogZGV2aWNlIHNpZGUgaXMgYWxsIGZpbmlzaGVkLgorCQkJICovCisJCQltdDc2MjNfcGFk X2Nsa19zZXR1cChkcyk7CisJCX0KKworCQlwcml2LT5wNl9pbnRlcmZhY2UgPSBzdGF0ZS0+aW50 ZXJmYWNlOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlkZXZfZXJyKGRzLT5kZXYsICIlczogdW5z dXBwb3J0ZWQgcG9ydDogJWlcbiIsIF9fZnVuY19fLCBwb3J0KTsKKwkJcmV0dXJuOworCX0KKwor CWlmIChwaHlsaW5rX2F1dG9uZWdfaW5iYW5kKG1vZGUpKSB7CisJCWRldl9lcnIoZHMtPmRldiwg IiVzOiBpbi1iYW5kIG5lZ290aWF0aW9uIHVuc3VwcG9ydGVkXG4iLAorCQkJX19mdW5jX18pOwor CQlyZXR1cm47CisJfQorCisJbWNyX2N1ciA9IG10NzUzMF9yZWFkKHByaXYsIE1UNzUzMF9QTUNS X1AocG9ydCkpOworCW1jcl9uZXcgPSBtY3JfY3VyOworCW1jcl9uZXcgJj0gfihQTUNSX0ZPUkNF X1NQRUVEXzEwMDAgfCBQTUNSX0ZPUkNFX1NQRUVEXzEwMCB8CisJCSAgICAgUE1DUl9GT1JDRV9G RFggfCBQTUNSX1RYX0ZDX0VOIHwgUE1DUl9SWF9GQ19FTik7CisJbWNyX25ldyB8PSBQTUNSX0lG R19YTUlUKDEpIHwgUE1DUl9NQUNfTU9ERSB8IFBNQ1JfQkFDS09GRl9FTiB8CisJCSAgIFBNQ1Jf QkFDS1BSX0VOIHwgUE1DUl9GT1JDRV9NT0RFIHwgUE1DUl9GT1JDRV9MTks7CisKKwlzd2l0Y2gg KHN0YXRlLT5zcGVlZCkgeworCWNhc2UgU1BFRURfMTAwMDoKKwkJbWNyX25ldyB8PSBQTUNSX0ZP UkNFX1NQRUVEXzEwMDA7CisJCWJyZWFrOworCWNhc2UgU1BFRURfMTAwOgorCQltY3JfbmV3IHw9 IFBNQ1JfRk9SQ0VfU1BFRURfMTAwOworCQlicmVhazsKKwl9CisJaWYgKHN0YXRlLT5kdXBsZXgg PT0gRFVQTEVYX0ZVTEwpIHsKKwkJbWNyX25ldyB8PSBQTUNSX0ZPUkNFX0ZEWDsKKwkJaWYgKHN0 YXRlLT5wYXVzZSAmIE1MT19QQVVTRV9UWCkKKwkJCW1jcl9uZXcgfD0gUE1DUl9UWF9GQ19FTjsK KwkJaWYgKHN0YXRlLT5wYXVzZSAmIE1MT19QQVVTRV9SWCkKKwkJCW1jcl9uZXcgfD0gUE1DUl9S WF9GQ19FTjsKKwl9CisKKwlpZiAobWNyX25ldyAhPSBtY3JfY3VyKQorCQltdDc1MzBfd3JpdGUo cHJpdiwgTVQ3NTMwX1BNQ1JfUChwb3J0KSwgbWNyX25ldyk7Cit9CisKK3N0YXRpYyB2b2lkIG10 NzUzMF9waHlsaW5rX21hY19saW5rX2Rvd24oc3RydWN0IGRzYV9zd2l0Y2ggKmRzLCBpbnQgcG9y dCwKKwkJCQkJIHVuc2lnbmVkIGludCBtb2RlLAorCQkJCQkgcGh5X2ludGVyZmFjZV90IGludGVy ZmFjZSkKK3sKKwlzdHJ1Y3QgbXQ3NTMwX3ByaXYgKnByaXYgPSBkcy0+cHJpdjsKKworCW10NzUz MF9wb3J0X3NldF9zdGF0dXMocHJpdiwgcG9ydCwgMCk7Cit9CisKK3N0YXRpYyB2b2lkIG10NzUz MF9waHlsaW5rX21hY19saW5rX3VwKHN0cnVjdCBkc2Ffc3dpdGNoICpkcywgaW50IHBvcnQsCisJ CQkJICAgICAgIHVuc2lnbmVkIGludCBtb2RlLAorCQkJCSAgICAgICBwaHlfaW50ZXJmYWNlX3Qg aW50ZXJmYWNlLAorCQkJCSAgICAgICBzdHJ1Y3QgcGh5X2RldmljZSAqcGh5ZGV2KQoreworCXN0 cnVjdCBtdDc1MzBfcHJpdiAqcHJpdiA9IGRzLT5wcml2OworCisJbXQ3NTMwX3BvcnRfc2V0X3N0 YXR1cyhwcml2LCBwb3J0LCAxKTsKK30KKworc3RhdGljIHZvaWQgbXQ3NTMwX3BoeWxpbmtfdmFs aWRhdGUoc3RydWN0IGRzYV9zd2l0Y2ggKmRzLCBpbnQgcG9ydCwKKwkJCQkgICAgdW5zaWduZWQg bG9uZyAqc3VwcG9ydGVkLAorCQkJCSAgICBzdHJ1Y3QgcGh5bGlua19saW5rX3N0YXRlICpzdGF0 ZSkKK3sKKwlfX0VUSFRPT0xfREVDTEFSRV9MSU5LX01PREVfTUFTSyhtYXNrKSA9IHsgMCwgfTsK KworCXN3aXRjaCAocG9ydCkgeworCWNhc2UgMDogLyogSW50ZXJuYWwgcGh5ICovCisJY2FzZSAx OgorCWNhc2UgMjoKKwljYXNlIDM6CisJY2FzZSA0OgorCQlpZiAoc3RhdGUtPmludGVyZmFjZSAh PSBQSFlfSU5URVJGQUNFX01PREVfTkEgJiYKKwkJICAgIHN0YXRlLT5pbnRlcmZhY2UgIT0gUEhZ X0lOVEVSRkFDRV9NT0RFX0dNSUkpCisJCQlnb3RvIHVuc3VwcG9ydGVkOworCQlicmVhazsKKwkv KiBjYXNlIDU6IFBvcnQgNSBub3Qgc3VwcG9ydGVkISAqLworCWNhc2UgNjogLyogMXN0IGNwdSBw b3J0ICovCisJCWlmIChzdGF0ZS0+aW50ZXJmYWNlICE9IFBIWV9JTlRFUkZBQ0VfTU9ERV9OQSAm JgorCQkgICAgc3RhdGUtPmludGVyZmFjZSAhPSBQSFlfSU5URVJGQUNFX01PREVfUkdNSUkgJiYK KwkJICAgIHN0YXRlLT5pbnRlcmZhY2UgIT0gUEhZX0lOVEVSRkFDRV9NT0RFX1RSR01JSSkKKwkJ CWdvdG8gdW5zdXBwb3J0ZWQ7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWRldl9lcnIoZHMtPmRl diwgIiVzOiB1bnN1cHBvcnRlZCBwb3J0OiAlaVxuIiwgX19mdW5jX18sIHBvcnQpOwordW5zdXBw b3J0ZWQ6CisJCWxpbmttb2RlX3plcm8oc3VwcG9ydGVkKTsKKwkJcmV0dXJuOworCX0KKworCXBo eWxpbmtfc2V0X3BvcnRfbW9kZXMobWFzayk7CisJcGh5bGlua19zZXQobWFzaywgQXV0b25lZyk7 CisKKwlpZiAoc3RhdGUtPmludGVyZmFjZSAhPSBQSFlfSU5URVJGQUNFX01PREVfVFJHTUlJKSB7 CisJCXBoeWxpbmtfc2V0KG1hc2ssIDEwYmFzZVRfSGFsZik7CisJCXBoeWxpbmtfc2V0KG1hc2ss IDEwYmFzZVRfRnVsbCk7CisJCXBoeWxpbmtfc2V0KG1hc2ssIDEwMGJhc2VUX0hhbGYpOworCQlw aHlsaW5rX3NldChtYXNrLCAxMDBiYXNlVF9GdWxsKTsKKwkJcGh5bGlua19zZXQobWFzaywgMTAw MGJhc2VUX0hhbGYpOworCX0KKworCXBoeWxpbmtfc2V0KG1hc2ssIDEwMDBiYXNlVF9GdWxsKTsK KworCXBoeWxpbmtfc2V0KG1hc2ssIFBhdXNlKTsKKwlwaHlsaW5rX3NldChtYXNrLCBBc3ltX1Bh dXNlKTsKKworCWxpbmttb2RlX2FuZChzdXBwb3J0ZWQsIHN1cHBvcnRlZCwgbWFzayk7CisJbGlu a21vZGVfYW5kKHN0YXRlLT5hZHZlcnRpc2luZywgc3RhdGUtPmFkdmVydGlzaW5nLCBtYXNrKTsK K30KKworc3RhdGljIGludAorbXQ3NTMwX3BoeWxpbmtfbWFjX2xpbmtfc3RhdGUoc3RydWN0IGRz YV9zd2l0Y2ggKmRzLCBpbnQgcG9ydCwKKwkJCSAgICAgIHN0cnVjdCBwaHlsaW5rX2xpbmtfc3Rh dGUgKnN0YXRlKQoreworCXN0cnVjdCBtdDc1MzBfcHJpdiAqcHJpdiA9IGRzLT5wcml2OworCXUz MiBwbXNyOworCisJaWYgKHBvcnQgPCAwIHx8IHBvcnQgPj0gTVQ3NTMwX05VTV9QT1JUUykKKwkJ cmV0dXJuIC1FSU5WQUw7CisKKwlwbXNyID0gbXQ3NTMwX3JlYWQocHJpdiwgTVQ3NTMwX1BNU1Jf UChwb3J0KSk7CisKKwlzdGF0ZS0+bGluayA9IChwbXNyICYgUE1TUl9MSU5LKTsKKwlzdGF0ZS0+ YW5fY29tcGxldGUgPSBzdGF0ZS0+bGluazsKKwlzdGF0ZS0+ZHVwbGV4ID0gISEocG1zciAmIFBN U1JfRFBYKTsKKworCXN3aXRjaCAocG1zciAmIFBNU1JfU1BFRURfTUFTSykgeworCWNhc2UgUE1T Ul9TUEVFRF8xMDoKKwkJc3RhdGUtPnNwZWVkID0gU1BFRURfMTA7CisJCWJyZWFrOworCWNhc2Ug UE1TUl9TUEVFRF8xMDA6CisJCXN0YXRlLT5zcGVlZCA9IFNQRUVEXzEwMDsKKwkJYnJlYWs7CisJ Y2FzZSBQTVNSX1NQRUVEXzEwMDA6CisJCXN0YXRlLT5zcGVlZCA9IFNQRUVEXzEwMDA7CisJCWJy ZWFrOworCWRlZmF1bHQ6CisJCXN0YXRlLT5zcGVlZCA9IFNQRUVEX1VOS05PV047CisJCWJyZWFr OworCX0KKworCXN0YXRlLT5wYXVzZSAmPSB+KE1MT19QQVVTRV9SWCB8IE1MT19QQVVTRV9UWCk7 CisJaWYgKHBtc3IgJiBQTVNSX1JYX0ZDKQorCQlzdGF0ZS0+cGF1c2UgfD0gTUxPX1BBVVNFX1JY OworCWlmIChwbXNyICYgUE1TUl9UWF9GQykKKwkJc3RhdGUtPnBhdXNlIHw9IE1MT19QQVVTRV9U WDsKKworCXJldHVybiAxOworfQorCiBzdGF0aWMgY29uc3Qgc3RydWN0IGRzYV9zd2l0Y2hfb3Bz IG10NzUzMF9zd2l0Y2hfb3BzID0gewogCS5nZXRfdGFnX3Byb3RvY29sCT0gbXRrX2dldF90YWdf cHJvdG9jb2wsCiAJLnNldHVwCQkJPSBtdDc1MzBfc2V0dXAsCkBAIC0xMzM3LDcgKzE0NjEsNiBA QCBzdGF0aWMgY29uc3Qgc3RydWN0IGRzYV9zd2l0Y2hfb3BzIG10NzUzMF9zd2l0Y2hfb3BzID0g ewogCS5waHlfd3JpdGUJCT0gbXQ3NTMwX3BoeV93cml0ZSwKIAkuZ2V0X2V0aHRvb2xfc3RhdHMJ PSBtdDc1MzBfZ2V0X2V0aHRvb2xfc3RhdHMsCiAJLmdldF9zc2V0X2NvdW50CQk9IG10NzUzMF9n ZXRfc3NldF9jb3VudCwKLQkuYWRqdXN0X2xpbmsJCT0gbXQ3NTMwX2FkanVzdF9saW5rLAogCS5w b3J0X2VuYWJsZQkJPSBtdDc1MzBfcG9ydF9lbmFibGUsCiAJLnBvcnRfZGlzYWJsZQkJPSBtdDc1 MzBfcG9ydF9kaXNhYmxlLAogCS5wb3J0X3N0cF9zdGF0ZV9zZXQJPSBtdDc1MzBfc3RwX3N0YXRl X3NldCwKQEAgLTEzNTAsNiArMTQ3MywxMSBAQCBzdGF0aWMgY29uc3Qgc3RydWN0IGRzYV9zd2l0 Y2hfb3BzIG10NzUzMF9zd2l0Y2hfb3BzID0gewogCS5wb3J0X3ZsYW5fcHJlcGFyZQk9IG10NzUz MF9wb3J0X3ZsYW5fcHJlcGFyZSwKIAkucG9ydF92bGFuX2FkZAkJPSBtdDc1MzBfcG9ydF92bGFu X2FkZCwKIAkucG9ydF92bGFuX2RlbAkJPSBtdDc1MzBfcG9ydF92bGFuX2RlbCwKKwkucGh5bGlu a192YWxpZGF0ZQk9IG10NzUzMF9waHlsaW5rX3ZhbGlkYXRlLAorCS5waHlsaW5rX21hY19saW5r X3N0YXRlID0gbXQ3NTMwX3BoeWxpbmtfbWFjX2xpbmtfc3RhdGUsCisJLnBoeWxpbmtfbWFjX2Nv bmZpZwk9IG10NzUzMF9waHlsaW5rX21hY19jb25maWcsCisJLnBoeWxpbmtfbWFjX2xpbmtfZG93 bgk9IG10NzUzMF9waHlsaW5rX21hY19saW5rX2Rvd24sCisJLnBoeWxpbmtfbWFjX2xpbmtfdXAJ PSBtdDc1MzBfcGh5bGlua19tYWNfbGlua191cCwKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qg b2ZfZGV2aWNlX2lkIG10NzUzMF9vZl9tYXRjaFtdID0gewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9u ZXQvZHNhL210NzUzMC5oIGIvZHJpdmVycy9uZXQvZHNhL210NzUzMC5oCmluZGV4IGJmYWM5MGY0 ODEwMi4uMTA3ZGQwNGFjZWRlIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9kc2EvbXQ3NTMwLmgK KysrIGIvZHJpdmVycy9uZXQvZHNhL210NzUzMC5oCkBAIC0xOTgsMjYgKzE5OCwyMCBAQCBlbnVt IG10NzUzMF92bGFuX3BvcnRfYXR0ciB7CiAjZGVmaW5lICBQTUNSX0ZPUkNFX1NQRUVEXzEwMAkJ QklUKDIpCiAjZGVmaW5lICBQTUNSX0ZPUkNFX0ZEWAkJCUJJVCgxKQogI2RlZmluZSAgUE1DUl9G T1JDRV9MTksJCQlCSVQoMCkKLSNkZWZpbmUgIFBNQ1JfQ09NTU9OX0xJTksJCShQTUNSX0lGR19Y TUlUKDEpIHwgUE1DUl9NQUNfTU9ERSB8IFwKLQkJCQkJIFBNQ1JfQkFDS09GRl9FTiB8IFBNQ1Jf QkFDS1BSX0VOIHwgXAotCQkJCQkgUE1DUl9UWF9FTiB8IFBNQ1JfUlhfRU4gfCBcCi0JCQkJCSBQ TUNSX1RYX0ZDX0VOIHwgUE1DUl9SWF9GQ19FTikKLSNkZWZpbmUgIFBNQ1JfQ1BVUF9MSU5LCQkJ KFBNQ1JfQ09NTU9OX0xJTksgfCBQTUNSX0ZPUkNFX01PREUgfCBcCi0JCQkJCSBQTUNSX0ZPUkNF X1NQRUVEXzEwMDAgfCBcCi0JCQkJCSBQTUNSX0ZPUkNFX0ZEWCB8IFwKLQkJCQkJIFBNQ1JfRk9S Q0VfTE5LKQotI2RlZmluZSAgUE1DUl9VU0VSUF9MSU5LCQlQTUNSX0NPTU1PTl9MSU5LCi0jZGVm aW5lICBQTUNSX0ZJWEVEX0xJTksJCShQTUNSX0lGR19YTUlUKDEpIHwgUE1DUl9NQUNfTU9ERSB8 IFwKLQkJCQkJIFBNQ1JfRk9SQ0VfTU9ERSB8IFBNQ1JfVFhfRU4gfCBcCi0JCQkJCSBQTUNSX1JY X0VOIHwgUE1DUl9CQUNLUFJfRU4gfCBcCi0JCQkJCSBQTUNSX0JBQ0tPRkZfRU4gfCBcCi0JCQkJ CSBQTUNSX0ZPUkNFX1NQRUVEXzEwMDAgfCBcCi0JCQkJCSBQTUNSX0ZPUkNFX0ZEWCB8IFwKLQkJ CQkJIFBNQ1JfRk9SQ0VfTE5LKQotI2RlZmluZSBQTUNSX0ZJWEVEX0xJTktfRkMJCShQTUNSX0ZJ WEVEX0xJTksgfCBcCi0JCQkJCSBQTUNSX1RYX0ZDX0VOIHwgUE1DUl9SWF9GQ19FTikKKyNkZWZp bmUgIFBNQ1JfU1BFRURfTUFTSwkJKFBNQ1JfRk9SQ0VfU1BFRURfMTAwIHwgXAorCQkJCQkgUE1D Ul9GT1JDRV9TUEVFRF8xMDAwKQogCiAjZGVmaW5lIE1UNzUzMF9QTVNSX1AoeCkJCSgweDMwMDgg KyAoeCkgKiAweDEwMCkKKyNkZWZpbmUgIFBNU1JfRUVFMUcJCQlCSVQoNykKKyNkZWZpbmUgIFBN U1JfRUVFMTAwTQkJCUJJVCg2KQorI2RlZmluZSAgUE1TUl9SWF9GQwkJCUJJVCg1KQorI2RlZmlu ZSAgUE1TUl9UWF9GQwkJCUJJVCg0KQorI2RlZmluZSAgUE1TUl9TUEVFRF8xMDAwCQlCSVQoMykK KyNkZWZpbmUgIFBNU1JfU1BFRURfMTAwCQkJQklUKDIpCisjZGVmaW5lICBQTVNSX1NQRUVEXzEw CQkJMHgwMAorI2RlZmluZSAgUE1TUl9TUEVFRF9NQVNLCQkoUE1TUl9TUEVFRF8xMDAgfCBQTVNS X1NQRUVEXzEwMDApCisjZGVmaW5lICBQTVNSX0RQWAkJCUJJVCgxKQorI2RlZmluZSAgUE1TUl9M SU5LCQkJQklUKDApCiAKIC8qIFJlZ2lzdGVyIGZvciBNSUIgKi8KICNkZWZpbmUgTVQ3NTMwX1BP UlRfTUlCX0NPVU5URVIoeCkJKDB4NDAwMCArICh4KSAqIDB4MTAwKQpAQCAtNDIzLDYgKzQxNyw3 IEBAIHN0cnVjdCBtdDc1MzBfcG9ydCB7CiAgKiBAcG9ydHM6CQlIb2xkaW5nIHRoZSBzdGF0ZSBh bW9uZyBwb3J0cwogICogQHJlZ19tdXRleDoJCVRoZSBsb2NrIGZvciBwcm90ZWN0aW5nIGFtb25n IHByb2Nlc3MgYWNjZXNzaW5nCiAgKgkJCXJlZ2lzdGVycworICogQHA2X2ludGVyZmFjZQlIb2xk aW5nIHRoZSBjdXJyZW50IHBvcnQgNiBpbnRlcmZhY2UKICAqLwogc3RydWN0IG10NzUzMF9wcml2 IHsKIAlzdHJ1Y3QgZGV2aWNlCQkqZGV2OwpAQCAtNDM1LDYgKzQzMCw3IEBAIHN0cnVjdCBtdDc1 MzBfcHJpdiB7CiAJc3RydWN0IGdwaW9fZGVzYwkqcmVzZXQ7CiAJdW5zaWduZWQgaW50CQlpZDsK IAlib29sCQkJbWNtOworCXBoeV9pbnRlcmZhY2VfdAkJcDZfaW50ZXJmYWNlOwogCiAJc3RydWN0 IG10NzUzMF9wb3J0CXBvcnRzW01UNzUzMF9OVU1fUE9SVFNdOwogCS8qIHByb3RlY3QgYW1vbmcg cHJvY2Vzc2VzIGZvciByZWdpc3RlcnMgYWNjZXNzKi8KLS0gCjIuMjAuMQoKCl9fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCmxpbnV4LWFybS1rZXJuZWwgbWFp bGluZyBsaXN0CmxpbnV4LWFybS1rZXJuZWxAbGlzdHMuaW5mcmFkZWFkLm9yZwpodHRwOi8vbGlz dHMuaW5mcmFkZWFkLm9yZy9tYWlsbWFuL2xpc3RpbmZvL2xpbnV4LWFybS1rZXJuZWwK