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=-3.8 required=3.0 tests=BAYES_00, HEADER_FROM_DIFFERENT_DOMAINS,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS autolearn=no 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 0CAF2C433DF for ; Fri, 16 Oct 2020 18:01:34 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id AEC27208E4 for ; Fri, 16 Oct 2020 18:01:33 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2390700AbgJPSBN (ORCPT ); Fri, 16 Oct 2020 14:01:13 -0400 Received: from vps0.lunn.ch ([185.16.172.187]:60142 "EHLO vps0.lunn.ch" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S2390128AbgJPSBN (ORCPT ); Fri, 16 Oct 2020 14:01:13 -0400 Received: from andrew by vps0.lunn.ch with local (Exim 4.94) (envelope-from ) id 1kTU2G-0021tA-Kf; Fri, 16 Oct 2020 20:01:00 +0200 Date: Fri, 16 Oct 2020 20:01:00 +0200 From: Andrew Lunn To: Lukasz Stelmach Cc: "David S. Miller" , Jakub Kicinski , Krzysztof Kozlowski , Kukjin Kim , Rob Herring , Russell King , jim.cromie@gmail.com, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, linux-samsung-soc@vger.kernel.org, netdev@vger.kernel.org, devicetree@vger.kernel.org, =?utf-8?Q?Bart=C5=82omiej_=C5=BBolnierkiewicz?= , Marek Szyprowski Subject: Re: [PATCH v2 2/4] net: ax88796c: ASIX AX88796C SPI Ethernet Adapter Driver Message-ID: <20201016180100.GF139700@lunn.ch> References: <20201002203641.GI3996795@lunn.ch> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: Precedence: bulk List-ID: X-Mailing-List: linux-samsung-soc@vger.kernel.org > >> +static void > >> +ax88796c_get_regs(struct net_device *ndev, struct ethtool_regs *regs, void *_p) > >> +{ > >> + struct ax88796c_device *ax_local = to_ax88796c_device(ndev); > >> + u16 *p = _p; > >> + int offset, i; > >> + > >> + memset(p, 0, AX88796C_REGDUMP_LEN); > >> + > >> + for (offset = 0; offset < AX88796C_REGDUMP_LEN; offset += 2) { > >> + if (!test_bit(offset / 2, ax88796c_no_regs_mask)) > >> + *p = AX_READ(&ax_local->ax_spi, offset); > >> + p++; > >> + } > >> + > >> + for (i = 0; i < AX88796C_PHY_REGDUMP_LEN / 2; i++) { > >> + *p = phy_read(ax_local->phydev, i); > >> + p++; > > > > Depending on the PHY, that can be dangerous. > > This is a built-in generic PHY. The chip has no lines to attach any > other external one. > > > phylib could be busy doing things with the PHY. It could be looking at > > How does phylib prevent concurrent access to a PHY? phydev->lock. All access to the PHY should go through the phylib, which will take the lock before calling into the driver. > > a different page for example. > > Different page? I was talking about the general case. A number of PHYs have more than 32 registers. So they implement pages to give access to more registers. For that to work, you need to ensure you don't have concurrent access. > > miitool(1) can give you the same functionally without the MAC driver > > doing anything, other than forwarding the IOCTL call on. > > No, I am afraid mii-tool is not able to dump registers. It should be able to. sudo mii-tool -vv eth0 Using SIOCGMIIPHY=0x8947 eth0: negotiated 1000baseT-FD flow-control, link ok registers for MII PHY 0: 1040 79ed 001c c800 0de1 c5e1 006d 0000 0000 0200 0800 0000 0000 0000 0000 2000 0000 0000 ffff 0000 0000 0400 0f00 0f00 318b 0053 31ec 8012 bf1f 0000 0000 0000 product info: vendor 00:07:32, model 0 rev 0 basic mode: autonegotiation enabled basic status: autonegotiation complete, link ok capabilities: 1000baseT-FD 100baseTx-FD 100baseTx-HD 10baseT-FD 10baseT-HD advertising: 1000baseT-FD 100baseTx-FD 100baseTx-HD 10baseT-FD 10baseT-HD flow-control link partner: 1000baseT-FD 100baseTx-FD 100baseTx-HD 10baseT-FD 10baseT-HD flow-control > >> +ax88796c_mdio_write(struct mii_bus *mdiobus, int phy_id, int loc, u16 val) > >> +{ > >> + struct ax88796c_device *ax_local = mdiobus->priv; > >> + int ret; > >> + > >> + AX_WRITE(&ax_local->ax_spi, val, P2_MDIODR); > >> + > >> + AX_WRITE(&ax_local->ax_spi, > >> + MDIOCR_RADDR(loc) | MDIOCR_FADDR(phy_id) > >> + | MDIOCR_WRITE, P2_MDIOCR); > >> + > >> + ret = read_poll_timeout(AX_READ, ret, > >> + ((ret & MDIOCR_VALID) != 0), 0, > >> + jiffies_to_usecs(HZ / 100), false, > >> + &ax_local->ax_spi, P2_MDIOCR); > >> + if (ret) > >> + return -EIO; > >> + > >> + if (loc == MII_ADVERTISE) { > >> + AX_WRITE(&ax_local->ax_spi, (BMCR_FULLDPLX | BMCR_ANRESTART | > >> + BMCR_ANENABLE | BMCR_SPEED100), P2_MDIODR); > >> + AX_WRITE(&ax_local->ax_spi, (MDIOCR_RADDR(MII_BMCR) | > >> + MDIOCR_FADDR(phy_id) | MDIOCR_WRITE), > >> + P2_MDIOCR); > >> > > > > What is this doing? > > > > Well… it turns autonegotiation when changing advertised link modes. But > this is obvious. As to why this code is here, I will honestly say — I am > not sure (Reminder: this is a vendor driver I am porting, I am more than > happy to receive any comments, thank you). Apparently it is not required > and I am willing to remove it. Please do remove it. > >> + > >> + ret = devm_register_netdev(&spi->dev, ndev); > >> + if (ret) { > >> + dev_err(&spi->dev, "failed to register a network device\n"); > >> + destroy_workqueue(ax_local->ax_work_queue); > >> + goto err; > >> + } > > > > The device is not live. If this is being used for NFS root, the kernel > > will start using it. So what sort of mess will it get into, if there > > is no PHY yet? Nothing important should happen after register_netdev(). > > > > But, with an unregistered network device ndev_owner in > phy_attach_direct() is NULL. Thus, phy_connect_direct() below fails. > > --8<---------------cut here---------------start------------->8--- > 1332 if (dev) > 1333 ndev_owner = dev->dev.parent->driver->owner; > 1334 if (ndev_owner != bus->owner && !try_module_get(bus->owner)) { > 1335 phydev_err(phydev, "failed to get the bus module\n"); > 1336 return -EIO; > 1337 } > --8<---------------cut here---------------end--------------->8--- Which is probably why most drivers actually attach the PHY in open() and detach it in close(). It can be done in probe, just look around for a driver which does and copy it. > No problem. Do you have any recommendation how to express this > > #define PSR_RESET (0 << 15) > I know it equals 0, but shows explicitly the bit number. Yes, that is useful for documentation. How about: #define PSR_NOT_RESET BIT(15) And then turn the logic around. Andrew 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=-3.8 required=3.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,HEADER_FROM_DIFFERENT_DOMAINS,MAILING_LIST_MULTI, SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED autolearn=no 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 3743EC433DF for ; Fri, 16 Oct 2020 18:03:02 +0000 (UTC) Received: from merlin.infradead.org (merlin.infradead.org [205.233.59.134]) (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 9A85820829 for ; Fri, 16 Oct 2020 18:03:01 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=lists.infradead.org header.i=@lists.infradead.org header.b="gGCg5/7Z" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 9A85820829 Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=lunn.ch Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=linux-arm-kernel-bounces+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=merlin.20170209; h=Sender:Content-Transfer-Encoding: Content-Type:Cc:List-Subscribe:List-Help:List-Post:List-Archive: List-Unsubscribe:List-Id:In-Reply-To:MIME-Version:References:Message-ID: Subject:To:From:Date:Reply-To:Content-ID:Content-Description:Resent-Date: Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Owner; bh=DD+NHgDkUUS6FuhfsQ/DMTCx1UnJeSKKqalsNs+CpEI=; b=gGCg5/7ZlW2+bUA0fGVk5EQ1u iQvCs4y16STJjtM9F33sNh3eKNEv99TyHCvfl1AwZpzNUjYyxF5zlGw0UhZcmlCHORbXmUgE3NyK0 8qELfTXqPxoYnQHXCZMH118fIrLymuEtIHq3SnNXK/j1cYIrTYOufnYCJSC4i16NgZKSpnGZRE8Mk ymiJ/Q5CYl2fw1evefLeviE579H4HpglCfoZAhrB3bl6D+k4z9Flv24q+NuIC5rgAmelWspYu36q4 A0G8kE4AzWdgQDBmL4sVEIDly74Z3uXfFcEGEPCshhqIDBtSuF5/V5mnRLjblbQupWF8XGI0X982O EN2KKY7pg==; Received: from localhost ([::1] helo=merlin.infradead.org) by merlin.infradead.org with esmtp (Exim 4.92.3 #3 (Red Hat Linux)) id 1kTU2X-0004JW-On; Fri, 16 Oct 2020 18:01:17 +0000 Received: from vps0.lunn.ch ([185.16.172.187]) by merlin.infradead.org with esmtps (Exim 4.92.3 #3 (Red Hat Linux)) id 1kTU2U-0004Ig-8K for linux-arm-kernel@lists.infradead.org; Fri, 16 Oct 2020 18:01:16 +0000 Received: from andrew by vps0.lunn.ch with local (Exim 4.94) (envelope-from ) id 1kTU2G-0021tA-Kf; Fri, 16 Oct 2020 20:01:00 +0200 Date: Fri, 16 Oct 2020 20:01:00 +0200 From: Andrew Lunn To: Lukasz Stelmach Subject: Re: [PATCH v2 2/4] net: ax88796c: ASIX AX88796C SPI Ethernet Adapter Driver Message-ID: <20201016180100.GF139700@lunn.ch> References: <20201002203641.GI3996795@lunn.ch> MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20201016_140114_328743_FC569146 X-CRM114-Status: GOOD ( 31.74 ) 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: devicetree@vger.kernel.org, linux-samsung-soc@vger.kernel.org, =?utf-8?Q?Bart=C5=82omiej_=C5=BBolnierkiewicz?= , jim.cromie@gmail.com, netdev@vger.kernel.org, Russell King , Krzysztof Kozlowski , linux-kernel@vger.kernel.org, Rob Herring , Kukjin Kim , Jakub Kicinski , "David S. Miller" , linux-arm-kernel@lists.infradead.org, Marek Szyprowski Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org PiA+PiArc3RhdGljIHZvaWQKPiA+PiArYXg4ODc5NmNfZ2V0X3JlZ3Moc3RydWN0IG5ldF9kZXZp Y2UgKm5kZXYsIHN0cnVjdCBldGh0b29sX3JlZ3MgKnJlZ3MsIHZvaWQgKl9wKQo+ID4+ICt7Cj4g Pj4gKwlzdHJ1Y3QgYXg4ODc5NmNfZGV2aWNlICpheF9sb2NhbCA9IHRvX2F4ODg3OTZjX2Rldmlj ZShuZGV2KTsKPiA+PiArCXUxNiAqcCA9IF9wOwo+ID4+ICsJaW50IG9mZnNldCwgaTsKPiA+PiAr Cj4gPj4gKwltZW1zZXQocCwgMCwgQVg4ODc5NkNfUkVHRFVNUF9MRU4pOwo+ID4+ICsKPiA+PiAr CWZvciAob2Zmc2V0ID0gMDsgb2Zmc2V0IDwgQVg4ODc5NkNfUkVHRFVNUF9MRU47IG9mZnNldCAr PSAyKSB7Cj4gPj4gKwkJaWYgKCF0ZXN0X2JpdChvZmZzZXQgLyAyLCBheDg4Nzk2Y19ub19yZWdz X21hc2spKQo+ID4+ICsJCQkqcCA9IEFYX1JFQUQoJmF4X2xvY2FsLT5heF9zcGksIG9mZnNldCk7 Cj4gPj4gKwkJcCsrOwo+ID4+ICsJfQo+ID4+ICsKPiA+PiArCWZvciAoaSA9IDA7IGkgPCBBWDg4 Nzk2Q19QSFlfUkVHRFVNUF9MRU4gLyAyOyBpKyspIHsKPiA+PiArCQkqcCA9IHBoeV9yZWFkKGF4 X2xvY2FsLT5waHlkZXYsIGkpOwo+ID4+ICsJCXArKzsKPiA+Cj4gPiBEZXBlbmRpbmcgb24gdGhl IFBIWSwgdGhhdCBjYW4gYmUgZGFuZ2Vyb3VzLgo+IAo+IFRoaXMgaXMgYSBidWlsdC1pbiBnZW5l cmljIFBIWS4gVGhlIGNoaXAgaGFzIG5vIGxpbmVzIHRvIGF0dGFjaCBhbnkKPiBvdGhlciBleHRl cm5hbCBvbmUuCj4gCj4gPiBwaHlsaWIgY291bGQgYmUgYnVzeSBkb2luZyB0aGluZ3Mgd2l0aCB0 aGUgUEhZLiBJdCBjb3VsZCBiZSBsb29raW5nIGF0Cj4gCj4gSG93IGRvZXMgcGh5bGliIHByZXZl bnQgY29uY3VycmVudCBhY2Nlc3MgdG8gYSBQSFk/IAoKcGh5ZGV2LT5sb2NrLiBBbGwgYWNjZXNz IHRvIHRoZSBQSFkgc2hvdWxkIGdvIHRocm91Z2ggdGhlIHBoeWxpYiwKd2hpY2ggd2lsbCB0YWtl IHRoZSBsb2NrIGJlZm9yZSBjYWxsaW5nIGludG8gdGhlIGRyaXZlci4KCj4gPiBhIGRpZmZlcmVu dCBwYWdlIGZvciBleGFtcGxlLgo+IAo+IERpZmZlcmVudCBwYWdlPyAKCkkgd2FzIHRhbGtpbmcg YWJvdXQgdGhlIGdlbmVyYWwgY2FzZS4gQSBudW1iZXIgb2YgUEhZcyBoYXZlIG1vcmUgdGhhbgoz MiByZWdpc3RlcnMuIFNvIHRoZXkgaW1wbGVtZW50IHBhZ2VzIHRvIGdpdmUgYWNjZXNzIHRvIG1v cmUKcmVnaXN0ZXJzLiBGb3IgdGhhdCB0byB3b3JrLCB5b3UgbmVlZCB0byBlbnN1cmUgeW91IGRv bid0IGhhdmUKY29uY3VycmVudCBhY2Nlc3MuCgo+ID4gbWlpdG9vbCgxKSBjYW4gZ2l2ZSB5b3Ug dGhlIHNhbWUgZnVuY3Rpb25hbGx5IHdpdGhvdXQgdGhlIE1BQyBkcml2ZXIKPiA+IGRvaW5nIGFu eXRoaW5nLCBvdGhlciB0aGFuIGZvcndhcmRpbmcgdGhlIElPQ1RMIGNhbGwgb24uCj4gCj4gTm8s IEkgYW0gYWZyYWlkIG1paS10b29sIGlzIG5vdCBhYmxlIHRvIGR1bXAgcmVnaXN0ZXJzLgoKSXQg c2hvdWxkIGJlIGFibGUgdG8uCgpzdWRvIG1paS10b29sIC12diBldGgwClVzaW5nIFNJT0NHTUlJ UEhZPTB4ODk0NwpldGgwOiBuZWdvdGlhdGVkIDEwMDBiYXNlVC1GRCBmbG93LWNvbnRyb2wsIGxp bmsgb2sKICByZWdpc3RlcnMgZm9yIE1JSSBQSFkgMDogCiAgICAxMDQwIDc5ZWQgMDAxYyBjODAw IDBkZTEgYzVlMSAwMDZkIDAwMDAKICAgIDAwMDAgMDIwMCAwODAwIDAwMDAgMDAwMCAwMDAwIDAw MDAgMjAwMAogICAgMDAwMCAwMDAwIGZmZmYgMDAwMCAwMDAwIDA0MDAgMGYwMCAwZjAwCiAgICAz MThiIDAwNTMgMzFlYyA4MDEyIGJmMWYgMDAwMCAwMDAwIDAwMDAKICBwcm9kdWN0IGluZm86IHZl bmRvciAwMDowNzozMiwgbW9kZWwgMCByZXYgMAogIGJhc2ljIG1vZGU6ICAgYXV0b25lZ290aWF0 aW9uIGVuYWJsZWQKICBiYXNpYyBzdGF0dXM6IGF1dG9uZWdvdGlhdGlvbiBjb21wbGV0ZSwgbGlu ayBvawogIGNhcGFiaWxpdGllczogMTAwMGJhc2VULUZEIDEwMGJhc2VUeC1GRCAxMDBiYXNlVHgt SEQgMTBiYXNlVC1GRCAxMGJhc2VULUhECiAgYWR2ZXJ0aXNpbmc6ICAxMDAwYmFzZVQtRkQgMTAw YmFzZVR4LUZEIDEwMGJhc2VUeC1IRCAxMGJhc2VULUZEIDEwYmFzZVQtSEQgZmxvdy1jb250cm9s CiAgbGluayBwYXJ0bmVyOiAxMDAwYmFzZVQtRkQgMTAwYmFzZVR4LUZEIDEwMGJhc2VUeC1IRCAx MGJhc2VULUZEIDEwYmFzZVQtSEQgZmxvdy1jb250cm9sCgo+ID4+ICtheDg4Nzk2Y19tZGlvX3dy aXRlKHN0cnVjdCBtaWlfYnVzICptZGlvYnVzLCBpbnQgcGh5X2lkLCBpbnQgbG9jLCB1MTYgdmFs KQo+ID4+ICt7Cj4gPj4gKwlzdHJ1Y3QgYXg4ODc5NmNfZGV2aWNlICpheF9sb2NhbCA9IG1kaW9i dXMtPnByaXY7Cj4gPj4gKwlpbnQgcmV0Owo+ID4+ICsKPiA+PiArCUFYX1dSSVRFKCZheF9sb2Nh bC0+YXhfc3BpLCB2YWwsIFAyX01ESU9EUik7Cj4gPj4gKwo+ID4+ICsJQVhfV1JJVEUoJmF4X2xv Y2FsLT5heF9zcGksCj4gPj4gKwkJIE1ESU9DUl9SQUREUihsb2MpIHwgTURJT0NSX0ZBRERSKHBo eV9pZCkKPiA+PiArCQkgfCBNRElPQ1JfV1JJVEUsIFAyX01ESU9DUik7Cj4gPj4gKwo+ID4+ICsJ cmV0ID0gcmVhZF9wb2xsX3RpbWVvdXQoQVhfUkVBRCwgcmV0LAo+ID4+ICsJCQkJKChyZXQgJiBN RElPQ1JfVkFMSUQpICE9IDApLCAwLAo+ID4+ICsJCQkJamlmZmllc190b191c2VjcyhIWiAvIDEw MCksIGZhbHNlLAo+ID4+ICsJCQkJJmF4X2xvY2FsLT5heF9zcGksIFAyX01ESU9DUik7Cj4gPj4g KwlpZiAocmV0KQo+ID4+ICsJCXJldHVybiAtRUlPOwo+ID4+ICsKPiA+PiArCWlmIChsb2MgPT0g TUlJX0FEVkVSVElTRSkgewo+ID4+ICsJCUFYX1dSSVRFKCZheF9sb2NhbC0+YXhfc3BpLCAoQk1D Ul9GVUxMRFBMWCB8IEJNQ1JfQU5SRVNUQVJUIHwKPiA+PiArCQkJICBCTUNSX0FORU5BQkxFIHwg Qk1DUl9TUEVFRDEwMCksIFAyX01ESU9EUik7Cj4gPj4gKwkJQVhfV1JJVEUoJmF4X2xvY2FsLT5h eF9zcGksIChNRElPQ1JfUkFERFIoTUlJX0JNQ1IpIHwKPiA+PiArCQkJICBNRElPQ1JfRkFERFIo cGh5X2lkKSB8IE1ESU9DUl9XUklURSksCj4gPj4gKwkJCSAgUDJfTURJT0NSKTsKPiA+Pgo+ID4K PiA+IFdoYXQgaXMgdGhpcyBkb2luZz8KPiA+Cj4gCj4gV2VsbOKApiBpdCB0dXJucyBhdXRvbmVn b3RpYXRpb24gd2hlbiBjaGFuZ2luZyBhZHZlcnRpc2VkIGxpbmsgbW9kZXMuIEJ1dAo+IHRoaXMg aXMgb2J2aW91cy4gQXMgdG8gd2h5IHRoaXMgY29kZSBpcyBoZXJlLCBJIHdpbGwgaG9uZXN0bHkg c2F5IOKAlCBJIGFtCj4gbm90IHN1cmUgKFJlbWluZGVyOiB0aGlzIGlzIGEgdmVuZG9yIGRyaXZl ciBJIGFtIHBvcnRpbmcsIEkgYW0gbW9yZSB0aGFuCj4gaGFwcHkgdG8gcmVjZWl2ZSBhbnkgY29t bWVudHMsIHRoYW5rIHlvdSkuIEFwcGFyZW50bHkgaXQgaXMgbm90IHJlcXVpcmVkCj4gYW5kIEkg YW0gd2lsbGluZyB0byByZW1vdmUgaXQuCgpQbGVhc2UgZG8gcmVtb3ZlIGl0LgoKPiA+PiArCj4g Pj4gKwlyZXQgPSBkZXZtX3JlZ2lzdGVyX25ldGRldigmc3BpLT5kZXYsIG5kZXYpOwo+ID4+ICsJ aWYgKHJldCkgewo+ID4+ICsJCWRldl9lcnIoJnNwaS0+ZGV2LCAiZmFpbGVkIHRvIHJlZ2lzdGVy IGEgbmV0d29yayBkZXZpY2VcbiIpOwo+ID4+ICsJCWRlc3Ryb3lfd29ya3F1ZXVlKGF4X2xvY2Fs LT5heF93b3JrX3F1ZXVlKTsKPiA+PiArCQlnb3RvIGVycjsKPiA+PiArCX0KPiA+Cj4gPiBUaGUg ZGV2aWNlIGlzIG5vdCBsaXZlLiBJZiB0aGlzIGlzIGJlaW5nIHVzZWQgZm9yIE5GUyByb290LCB0 aGUga2VybmVsCj4gPiB3aWxsIHN0YXJ0IHVzaW5nIGl0LiBTbyB3aGF0IHNvcnQgb2YgbWVzcyB3 aWxsIGl0IGdldCBpbnRvLCBpZiB0aGVyZQo+ID4gaXMgbm8gUEhZIHlldD8gTm90aGluZyBpbXBv cnRhbnQgc2hvdWxkIGhhcHBlbiBhZnRlciByZWdpc3Rlcl9uZXRkZXYoKS4KPiA+Cj4gCj4gQnV0 LCB3aXRoIGFuIHVucmVnaXN0ZXJlZCBuZXR3b3JrIGRldmljZSBuZGV2X293bmVyIGluCj4gcGh5 X2F0dGFjaF9kaXJlY3QoKSBpcyBOVUxMLiBUaHVzLCBwaHlfY29ubmVjdF9kaXJlY3QoKSBiZWxv dyBmYWlscy4KPiAKPiAtLTg8LS0tLS0tLS0tLS0tLS0tY3V0IGhlcmUtLS0tLS0tLS0tLS0tLS1z dGFydC0tLS0tLS0tLS0tLS0+OC0tLQo+ICAgIDEzMzIgICAgICAgICBpZiAoZGV2KQo+ICAgIDEz MzMgICAgICAgICAgICAgICAgIG5kZXZfb3duZXIgPSBkZXYtPmRldi5wYXJlbnQtPmRyaXZlci0+ b3duZXI7Cj4gICAgMTMzNCAgICAgICAgIGlmIChuZGV2X293bmVyICE9IGJ1cy0+b3duZXIgJiYg ICF0cnlfbW9kdWxlX2dldChidXMtPm93bmVyKSkgewo+ICAgIDEzMzUgICAgICAgICAgICAgICAg IHBoeWRldl9lcnIocGh5ZGV2LCAiZmFpbGVkIHRvIGdldCB0aGUgYnVzICBtb2R1bGVcbiIpOwo+ ICAgIDEzMzYgICAgICAgICAgICAgICAgIHJldHVybiAtRUlPOwo+ICAgIDEzMzcgICAgICAgICB9 Cj4gLS04PC0tLS0tLS0tLS0tLS0tLWN1dCBoZXJlLS0tLS0tLS0tLS0tLS0tZW5kLS0tLS0tLS0t LS0tLS0tPjgtLS0KCldoaWNoIGlzIHByb2JhYmx5IHdoeSBtb3N0IGRyaXZlcnMgYWN0dWFsbHkg YXR0YWNoIHRoZSBQSFkgaW4gb3BlbigpCmFuZCBkZXRhY2ggaXQgaW4gY2xvc2UoKS4KCkl0IGNh biBiZSBkb25lIGluIHByb2JlLCBqdXN0IGxvb2sgYXJvdW5kIGZvciBhIGRyaXZlciB3aGljaCBk b2VzIGFuZApjb3B5IGl0LgoKPiBObyBwcm9ibGVtLiBEbyB5b3UgaGF2ZSBhbnkgcmVjb21tZW5k YXRpb24gaG93IHRvIGV4cHJlc3MgdGhpcwo+IAo+ICAjZGVmaW5lIFBTUl9SRVNFVCAgKDAgPDwg MTUpCgo+IEkga25vdyBpdCBlcXVhbHMgMCwgYnV0IHNob3dzIGV4cGxpY2l0bHkgdGhlIGJpdCBu dW1iZXIuCgpZZXMsIHRoYXQgaXMgdXNlZnVsIGZvciBkb2N1bWVudGF0aW9uLiBIb3cgYWJvdXQ6 CgojZGVmaW5lIFBTUl9OT1RfUkVTRVQgQklUKDE1KQoKQW5kIHRoZW4gdHVybiB0aGUgbG9naWMg YXJvdW5kLgoKICAgIEFuZHJldwoKX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX18KbGludXgtYXJtLWtlcm5lbCBtYWlsaW5nIGxpc3QKbGludXgtYXJtLWtlcm5l bEBsaXN0cy5pbmZyYWRlYWQub3JnCmh0dHA6Ly9saXN0cy5pbmZyYWRlYWQub3JnL21haWxtYW4v bGlzdGluZm8vbGludXgtYXJtLWtlcm5lbAo=