From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from vs10.datenmanufaktur-hosting.net ([185.138.26.202]:50622 "EHLO vs81.iboxed.net" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S935042AbeB1VfY (ORCPT ); Wed, 28 Feb 2018 16:35:24 -0500 From: Alexander Kurz To: "David S . Miller" , "Andrew F . Davis" Cc: linux-usb@vger.kernel.org, netdev@vger.kernel.org, Freddy Xin , Alexander Kurz Subject: [PATCH 2/2] net: usb: asix88179_178a: de-duplicate code Date: Wed, 28 Feb 2018 21:27:39 +0000 Message-Id: <20180228212739.5460-2-akurz@blala.de> In-Reply-To: <20180228212739.5460-1-akurz@blala.de> References: <20180228212739.5460-1-akurz@blala.de> Sender: netdev-owner@vger.kernel.org List-ID: Remove the duplicated code for asix88179_178a bind and reset methods. Signed-off-by: Alexander Kurz --- drivers/net/usb/ax88179_178a.c | 117 +++++++++++------------------------------ 1 file changed, 31 insertions(+), 86 deletions(-) diff --git a/drivers/net/usb/ax88179_178a.c b/drivers/net/usb/ax88179_178a.c index a6ef75907ae9..b1d8c2043d17 100644 --- a/drivers/net/usb/ax88179_178a.c +++ b/drivers/net/usb/ax88179_178a.c @@ -1223,7 +1223,7 @@ static int ax88179_led_setting(struct usbnet *dev) return 0; } -static int ax88179_bind(struct usbnet *dev, struct usb_interface *intf) +static int ax88179_link_bind_or_reset(struct usbnet *dev, int do_reset) { u8 buf[5]; u16 *tmp16; @@ -1231,12 +1231,11 @@ static int ax88179_bind(struct usbnet *dev, struct usb_interface *intf) struct ax88179_data *ax179_data = (struct ax88179_data *)dev->data; struct ethtool_eee eee_data; - usbnet_get_endpoints(dev, intf); - tmp16 = (u16 *)buf; tmp = (u8 *)buf; - memset(ax179_data, 0, sizeof(*ax179_data)); + if (!do_reset) + memset(ax179_data, 0, sizeof(*ax179_data)); /* Power up ethernet PHY */ *tmp16 = 0; @@ -1249,9 +1248,13 @@ static int ax88179_bind(struct usbnet *dev, struct usb_interface *intf) ax88179_write_cmd(dev, AX_ACCESS_MAC, AX_CLK_SELECT, 1, 1, tmp); msleep(100); + if (do_reset) + ax88179_auto_detach(dev, 0); + ax88179_read_cmd(dev, AX_ACCESS_MAC, AX_NODE_ID, ETH_ALEN, ETH_ALEN, dev->net->dev_addr); - memcpy(dev->net->perm_addr, dev->net->dev_addr, ETH_ALEN); + if (!do_reset) + memcpy(dev->net->perm_addr, dev->net->dev_addr, ETH_ALEN); /* RX bulk configuration */ memcpy(tmp, &AX88179_BULKIN_SIZE[0], 5); @@ -1266,19 +1269,21 @@ static int ax88179_bind(struct usbnet *dev, struct usb_interface *intf) ax88179_write_cmd(dev, AX_ACCESS_MAC, AX_PAUSE_WATERLVL_HIGH, 1, 1, tmp); - dev->net->netdev_ops = &ax88179_netdev_ops; - dev->net->ethtool_ops = &ax88179_ethtool_ops; - dev->net->needed_headroom = 8; - dev->net->max_mtu = 4088; - - /* Initialize MII structure */ - dev->mii.dev = dev->net; - dev->mii.mdio_read = ax88179_mdio_read; - dev->mii.mdio_write = ax88179_mdio_write; - dev->mii.phy_id_mask = 0xff; - dev->mii.reg_num_mask = 0xff; - dev->mii.phy_id = 0x03; - dev->mii.supports_gmii = 1; + if (!do_reset) { + dev->net->netdev_ops = &ax88179_netdev_ops; + dev->net->ethtool_ops = &ax88179_ethtool_ops; + dev->net->needed_headroom = 8; + dev->net->max_mtu = 4088; + + /* Initialize MII structure */ + dev->mii.dev = dev->net; + dev->mii.mdio_read = ax88179_mdio_read; + dev->mii.mdio_write = ax88179_mdio_write; + dev->mii.phy_id_mask = 0xff; + dev->mii.reg_num_mask = 0xff; + dev->mii.phy_id = 0x03; + dev->mii.supports_gmii = 1; + } dev->net->features |= NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM | NETIF_F_RXCSUM; @@ -1330,6 +1335,13 @@ static int ax88179_bind(struct usbnet *dev, struct usb_interface *intf) return 0; } +static int ax88179_bind(struct usbnet *dev, struct usb_interface *intf) +{ + usbnet_get_endpoints(dev, intf); + + return ax88179_link_bind_or_reset(dev, 0); +} + static void ax88179_unbind(struct usbnet *dev, struct usb_interface *intf) { u16 tmp16; @@ -1458,74 +1470,7 @@ ax88179_tx_fixup(struct usbnet *dev, struct sk_buff *skb, gfp_t flags) static int ax88179_link_reset(struct usbnet *dev) { - struct ax88179_data *ax179_data = (struct ax88179_data *)dev->data; - u8 tmp[5], link_sts; - u16 mode, tmp16, delay = HZ / 10; - u32 tmp32 = 0x40000000; - unsigned long jtimeout; - - jtimeout = jiffies + delay; - while (tmp32 & 0x40000000) { - mode = 0; - ax88179_write_cmd(dev, AX_ACCESS_MAC, AX_RX_CTL, 2, 2, &mode); - ax88179_write_cmd(dev, AX_ACCESS_MAC, AX_RX_CTL, 2, 2, - &ax179_data->rxctl); - - /*link up, check the usb device control TX FIFO full or empty*/ - ax88179_read_cmd(dev, 0x81, 0x8c, 0, 4, &tmp32); - - if (time_after(jiffies, jtimeout)) - return 0; - } - - mode = AX_MEDIUM_RECEIVE_EN | AX_MEDIUM_TXFLOW_CTRLEN | - AX_MEDIUM_RXFLOW_CTRLEN; - - ax88179_read_cmd(dev, AX_ACCESS_MAC, PHYSICAL_LINK_STATUS, - 1, 1, &link_sts); - - ax88179_read_cmd(dev, AX_ACCESS_PHY, AX88179_PHY_ID, - GMII_PHY_PHYSR, 2, &tmp16); - - if (!(tmp16 & GMII_PHY_PHYSR_LINK)) { - return 0; - } else if (GMII_PHY_PHYSR_GIGA == (tmp16 & GMII_PHY_PHYSR_SMASK)) { - mode |= AX_MEDIUM_GIGAMODE | AX_MEDIUM_EN_125MHZ; - if (dev->net->mtu > 1500) - mode |= AX_MEDIUM_JUMBO_EN; - - if (link_sts & AX_USB_SS) - memcpy(tmp, &AX88179_BULKIN_SIZE[0], 5); - else if (link_sts & AX_USB_HS) - memcpy(tmp, &AX88179_BULKIN_SIZE[1], 5); - else - memcpy(tmp, &AX88179_BULKIN_SIZE[3], 5); - } else if (GMII_PHY_PHYSR_100 == (tmp16 & GMII_PHY_PHYSR_SMASK)) { - mode |= AX_MEDIUM_PS; - - if (link_sts & (AX_USB_SS | AX_USB_HS)) - memcpy(tmp, &AX88179_BULKIN_SIZE[2], 5); - else - memcpy(tmp, &AX88179_BULKIN_SIZE[3], 5); - } else { - memcpy(tmp, &AX88179_BULKIN_SIZE[3], 5); - } - - /* RX bulk configuration */ - ax88179_write_cmd(dev, AX_ACCESS_MAC, AX_RX_BULKIN_QCTRL, 5, 5, tmp); - - dev->rx_urb_size = (1024 * (tmp[3] + 2)); - - if (tmp16 & GMII_PHY_PHYSR_FULL) - mode |= AX_MEDIUM_FULL_DUPLEX; - ax88179_write_cmd(dev, AX_ACCESS_MAC, AX_MEDIUM_STATUS_MODE, - 2, 2, &mode); - - ax179_data->eee_enabled = ax88179_chk_eee(dev); - - netif_carrier_on(dev->net); - - return 0; + return ax88179_link_bind_or_reset(dev, 1); } static int ax88179_reset(struct usbnet *dev) -- 2.11.0 From mboxrd@z Thu Jan 1 00:00:00 1970 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: base64 Subject: [2/2] net: usb: asix88179_178a: de-duplicate code From: Alexander Kurz Message-Id: <20180228212739.5460-2-akurz@blala.de> Date: Wed, 28 Feb 2018 21:27:39 +0000 To: "David S . Miller" , "Andrew F . Davis" Cc: linux-usb@vger.kernel.org, netdev@vger.kernel.org, Freddy Xin , Alexander Kurz List-ID: UmVtb3ZlIHRoZSBkdXBsaWNhdGVkIGNvZGUgZm9yIGFzaXg4ODE3OV8xNzhhIGJpbmQgYW5kIHJl c2V0IG1ldGhvZHMuCgpTaWduZWQtb2ZmLWJ5OiBBbGV4YW5kZXIgS3VyeiA8YWt1cnpAYmxhbGEu ZGU+Ci0tLQogZHJpdmVycy9uZXQvdXNiL2F4ODgxNzlfMTc4YS5jIHwgMTE3ICsrKysrKysrKysr LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAxIGZpbGUgY2hhbmdlZCwgMzEgaW5zZXJ0 aW9ucygrKSwgODYgZGVsZXRpb25zKC0pCgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvdXNiL2F4 ODgxNzlfMTc4YS5jIGIvZHJpdmVycy9uZXQvdXNiL2F4ODgxNzlfMTc4YS5jCmluZGV4IGE2ZWY3 NTkwN2FlOS4uYjFkOGMyMDQzZDE3IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC91c2IvYXg4ODE3 OV8xNzhhLmMKKysrIGIvZHJpdmVycy9uZXQvdXNiL2F4ODgxNzlfMTc4YS5jCkBAIC0xMjIzLDcg KzEyMjMsNyBAQCBzdGF0aWMgaW50IGF4ODgxNzlfbGVkX3NldHRpbmcoc3RydWN0IHVzYm5ldCAq ZGV2KQogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGF4ODgxNzlfYmluZChzdHJ1Y3QgdXNi bmV0ICpkZXYsIHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmKQorc3RhdGljIGludCBheDg4MTc5 X2xpbmtfYmluZF9vcl9yZXNldChzdHJ1Y3QgdXNibmV0ICpkZXYsIGludCBkb19yZXNldCkKIHsK IAl1OCBidWZbNV07CiAJdTE2ICp0bXAxNjsKQEAgLTEyMzEsMTIgKzEyMzEsMTEgQEAgc3RhdGlj IGludCBheDg4MTc5X2JpbmQoc3RydWN0IHVzYm5ldCAqZGV2LCBzdHJ1Y3QgdXNiX2ludGVyZmFj ZSAqaW50ZikKIAlzdHJ1Y3QgYXg4ODE3OV9kYXRhICpheDE3OV9kYXRhID0gKHN0cnVjdCBheDg4 MTc5X2RhdGEgKilkZXYtPmRhdGE7CiAJc3RydWN0IGV0aHRvb2xfZWVlIGVlZV9kYXRhOwogCi0J dXNibmV0X2dldF9lbmRwb2ludHMoZGV2LCBpbnRmKTsKLQogCXRtcDE2ID0gKHUxNiAqKWJ1ZjsK IAl0bXAgPSAodTggKilidWY7CiAKLQltZW1zZXQoYXgxNzlfZGF0YSwgMCwgc2l6ZW9mKCpheDE3 OV9kYXRhKSk7CisJaWYgKCFkb19yZXNldCkKKwkJbWVtc2V0KGF4MTc5X2RhdGEsIDAsIHNpemVv ZigqYXgxNzlfZGF0YSkpOwogCiAJLyogUG93ZXIgdXAgZXRoZXJuZXQgUEhZICovCiAJKnRtcDE2 ID0gMDsKQEAgLTEyNDksOSArMTI0OCwxMyBAQCBzdGF0aWMgaW50IGF4ODgxNzlfYmluZChzdHJ1 Y3QgdXNibmV0ICpkZXYsIHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmKQogCWF4ODgxNzlfd3Jp dGVfY21kKGRldiwgQVhfQUNDRVNTX01BQywgQVhfQ0xLX1NFTEVDVCwgMSwgMSwgdG1wKTsKIAlt c2xlZXAoMTAwKTsKIAorCWlmIChkb19yZXNldCkKKwkJYXg4ODE3OV9hdXRvX2RldGFjaChkZXYs IDApOworCiAJYXg4ODE3OV9yZWFkX2NtZChkZXYsIEFYX0FDQ0VTU19NQUMsIEFYX05PREVfSUQs IEVUSF9BTEVOLAogCQkJIEVUSF9BTEVOLCBkZXYtPm5ldC0+ZGV2X2FkZHIpOwotCW1lbWNweShk ZXYtPm5ldC0+cGVybV9hZGRyLCBkZXYtPm5ldC0+ZGV2X2FkZHIsIEVUSF9BTEVOKTsKKwlpZiAo IWRvX3Jlc2V0KQorCQltZW1jcHkoZGV2LT5uZXQtPnBlcm1fYWRkciwgZGV2LT5uZXQtPmRldl9h ZGRyLCBFVEhfQUxFTik7CiAKIAkvKiBSWCBidWxrIGNvbmZpZ3VyYXRpb24gKi8KIAltZW1jcHko dG1wLCAmQVg4ODE3OV9CVUxLSU5fU0laRVswXSwgNSk7CkBAIC0xMjY2LDE5ICsxMjY5LDIxIEBA IHN0YXRpYyBpbnQgYXg4ODE3OV9iaW5kKHN0cnVjdCB1c2JuZXQgKmRldiwgc3RydWN0IHVzYl9p bnRlcmZhY2UgKmludGYpCiAJYXg4ODE3OV93cml0ZV9jbWQoZGV2LCBBWF9BQ0NFU1NfTUFDLCBB WF9QQVVTRV9XQVRFUkxWTF9ISUdILAogCQkJICAxLCAxLCB0bXApOwogCi0JZGV2LT5uZXQtPm5l dGRldl9vcHMgPSAmYXg4ODE3OV9uZXRkZXZfb3BzOwotCWRldi0+bmV0LT5ldGh0b29sX29wcyA9 ICZheDg4MTc5X2V0aHRvb2xfb3BzOwotCWRldi0+bmV0LT5uZWVkZWRfaGVhZHJvb20gPSA4Owot CWRldi0+bmV0LT5tYXhfbXR1ID0gNDA4ODsKLQotCS8qIEluaXRpYWxpemUgTUlJIHN0cnVjdHVy ZSAqLwotCWRldi0+bWlpLmRldiA9IGRldi0+bmV0OwotCWRldi0+bWlpLm1kaW9fcmVhZCA9IGF4 ODgxNzlfbWRpb19yZWFkOwotCWRldi0+bWlpLm1kaW9fd3JpdGUgPSBheDg4MTc5X21kaW9fd3Jp dGU7Ci0JZGV2LT5taWkucGh5X2lkX21hc2sgPSAweGZmOwotCWRldi0+bWlpLnJlZ19udW1fbWFz ayA9IDB4ZmY7Ci0JZGV2LT5taWkucGh5X2lkID0gMHgwMzsKLQlkZXYtPm1paS5zdXBwb3J0c19n bWlpID0gMTsKKwlpZiAoIWRvX3Jlc2V0KSB7CisJCWRldi0+bmV0LT5uZXRkZXZfb3BzID0gJmF4 ODgxNzlfbmV0ZGV2X29wczsKKwkJZGV2LT5uZXQtPmV0aHRvb2xfb3BzID0gJmF4ODgxNzlfZXRo dG9vbF9vcHM7CisJCWRldi0+bmV0LT5uZWVkZWRfaGVhZHJvb20gPSA4OworCQlkZXYtPm5ldC0+ bWF4X210dSA9IDQwODg7CisKKwkJLyogSW5pdGlhbGl6ZSBNSUkgc3RydWN0dXJlICovCisJCWRl di0+bWlpLmRldiA9IGRldi0+bmV0OworCQlkZXYtPm1paS5tZGlvX3JlYWQgPSBheDg4MTc5X21k aW9fcmVhZDsKKwkJZGV2LT5taWkubWRpb193cml0ZSA9IGF4ODgxNzlfbWRpb193cml0ZTsKKwkJ ZGV2LT5taWkucGh5X2lkX21hc2sgPSAweGZmOworCQlkZXYtPm1paS5yZWdfbnVtX21hc2sgPSAw eGZmOworCQlkZXYtPm1paS5waHlfaWQgPSAweDAzOworCQlkZXYtPm1paS5zdXBwb3J0c19nbWlp ID0gMTsKKwl9CiAKIAlkZXYtPm5ldC0+ZmVhdHVyZXMgfD0gTkVUSUZfRl9JUF9DU1VNIHwgTkVU SUZfRl9JUFY2X0NTVU0gfAogCQkJICAgICAgTkVUSUZfRl9SWENTVU07CkBAIC0xMzMwLDYgKzEz MzUsMTMgQEAgc3RhdGljIGludCBheDg4MTc5X2JpbmQoc3RydWN0IHVzYm5ldCAqZGV2LCBzdHJ1 Y3QgdXNiX2ludGVyZmFjZSAqaW50ZikKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGludCBheDg4 MTc5X2JpbmQoc3RydWN0IHVzYm5ldCAqZGV2LCBzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZikK K3sKKwl1c2JuZXRfZ2V0X2VuZHBvaW50cyhkZXYsIGludGYpOworCisJcmV0dXJuIGF4ODgxNzlf bGlua19iaW5kX29yX3Jlc2V0KGRldiwgMCk7Cit9CisKIHN0YXRpYyB2b2lkIGF4ODgxNzlfdW5i aW5kKHN0cnVjdCB1c2JuZXQgKmRldiwgc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYpCiB7CiAJ dTE2IHRtcDE2OwpAQCAtMTQ1OCw3NCArMTQ3MCw3IEBAIGF4ODgxNzlfdHhfZml4dXAoc3RydWN0 IHVzYm5ldCAqZGV2LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBnZnBfdCBmbGFncykKIAogc3RhdGlj IGludCBheDg4MTc5X2xpbmtfcmVzZXQoc3RydWN0IHVzYm5ldCAqZGV2KQogewotCXN0cnVjdCBh eDg4MTc5X2RhdGEgKmF4MTc5X2RhdGEgPSAoc3RydWN0IGF4ODgxNzlfZGF0YSAqKWRldi0+ZGF0 YTsKLQl1OCB0bXBbNV0sIGxpbmtfc3RzOwotCXUxNiBtb2RlLCB0bXAxNiwgZGVsYXkgPSBIWiAv IDEwOwotCXUzMiB0bXAzMiA9IDB4NDAwMDAwMDA7Ci0JdW5zaWduZWQgbG9uZyBqdGltZW91dDsK LQotCWp0aW1lb3V0ID0gamlmZmllcyArIGRlbGF5OwotCXdoaWxlICh0bXAzMiAmIDB4NDAwMDAw MDApIHsKLQkJbW9kZSA9IDA7Ci0JCWF4ODgxNzlfd3JpdGVfY21kKGRldiwgQVhfQUNDRVNTX01B QywgQVhfUlhfQ1RMLCAyLCAyLCAmbW9kZSk7Ci0JCWF4ODgxNzlfd3JpdGVfY21kKGRldiwgQVhf QUNDRVNTX01BQywgQVhfUlhfQ1RMLCAyLCAyLAotCQkJCSAgJmF4MTc5X2RhdGEtPnJ4Y3RsKTsK LQotCQkvKmxpbmsgdXAsIGNoZWNrIHRoZSB1c2IgZGV2aWNlIGNvbnRyb2wgVFggRklGTyBmdWxs IG9yIGVtcHR5Ki8KLQkJYXg4ODE3OV9yZWFkX2NtZChkZXYsIDB4ODEsIDB4OGMsIDAsIDQsICZ0 bXAzMik7Ci0KLQkJaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywganRpbWVvdXQpKQotCQkJcmV0dXJu IDA7Ci0JfQotCi0JbW9kZSA9IEFYX01FRElVTV9SRUNFSVZFX0VOIHwgQVhfTUVESVVNX1RYRkxP V19DVFJMRU4gfAotCSAgICAgICBBWF9NRURJVU1fUlhGTE9XX0NUUkxFTjsKLQotCWF4ODgxNzlf cmVhZF9jbWQoZGV2LCBBWF9BQ0NFU1NfTUFDLCBQSFlTSUNBTF9MSU5LX1NUQVRVUywKLQkJCSAx LCAxLCAmbGlua19zdHMpOwotCi0JYXg4ODE3OV9yZWFkX2NtZChkZXYsIEFYX0FDQ0VTU19QSFks IEFYODgxNzlfUEhZX0lELAotCQkJIEdNSUlfUEhZX1BIWVNSLCAyLCAmdG1wMTYpOwotCi0JaWYg KCEodG1wMTYgJiBHTUlJX1BIWV9QSFlTUl9MSU5LKSkgewotCQlyZXR1cm4gMDsKLQl9IGVsc2Ug aWYgKEdNSUlfUEhZX1BIWVNSX0dJR0EgPT0gKHRtcDE2ICYgR01JSV9QSFlfUEhZU1JfU01BU0sp KSB7Ci0JCW1vZGUgfD0gQVhfTUVESVVNX0dJR0FNT0RFIHwgQVhfTUVESVVNX0VOXzEyNU1IWjsK LQkJaWYgKGRldi0+bmV0LT5tdHUgPiAxNTAwKQotCQkJbW9kZSB8PSBBWF9NRURJVU1fSlVNQk9f RU47Ci0KLQkJaWYgKGxpbmtfc3RzICYgQVhfVVNCX1NTKQotCQkJbWVtY3B5KHRtcCwgJkFYODgx NzlfQlVMS0lOX1NJWkVbMF0sIDUpOwotCQllbHNlIGlmIChsaW5rX3N0cyAmIEFYX1VTQl9IUykK LQkJCW1lbWNweSh0bXAsICZBWDg4MTc5X0JVTEtJTl9TSVpFWzFdLCA1KTsKLQkJZWxzZQotCQkJ bWVtY3B5KHRtcCwgJkFYODgxNzlfQlVMS0lOX1NJWkVbM10sIDUpOwotCX0gZWxzZSBpZiAoR01J SV9QSFlfUEhZU1JfMTAwID09ICh0bXAxNiAmIEdNSUlfUEhZX1BIWVNSX1NNQVNLKSkgewotCQlt b2RlIHw9IEFYX01FRElVTV9QUzsKLQotCQlpZiAobGlua19zdHMgJiAoQVhfVVNCX1NTIHwgQVhf VVNCX0hTKSkKLQkJCW1lbWNweSh0bXAsICZBWDg4MTc5X0JVTEtJTl9TSVpFWzJdLCA1KTsKLQkJ ZWxzZQotCQkJbWVtY3B5KHRtcCwgJkFYODgxNzlfQlVMS0lOX1NJWkVbM10sIDUpOwotCX0gZWxz ZSB7Ci0JCW1lbWNweSh0bXAsICZBWDg4MTc5X0JVTEtJTl9TSVpFWzNdLCA1KTsKLQl9Ci0KLQkv KiBSWCBidWxrIGNvbmZpZ3VyYXRpb24gKi8KLQlheDg4MTc5X3dyaXRlX2NtZChkZXYsIEFYX0FD Q0VTU19NQUMsIEFYX1JYX0JVTEtJTl9RQ1RSTCwgNSwgNSwgdG1wKTsKLQotCWRldi0+cnhfdXJi X3NpemUgPSAoMTAyNCAqICh0bXBbM10gKyAyKSk7Ci0KLQlpZiAodG1wMTYgJiBHTUlJX1BIWV9Q SFlTUl9GVUxMKQotCQltb2RlIHw9IEFYX01FRElVTV9GVUxMX0RVUExFWDsKLQlheDg4MTc5X3dy aXRlX2NtZChkZXYsIEFYX0FDQ0VTU19NQUMsIEFYX01FRElVTV9TVEFUVVNfTU9ERSwKLQkJCSAg MiwgMiwgJm1vZGUpOwotCi0JYXgxNzlfZGF0YS0+ZWVlX2VuYWJsZWQgPSBheDg4MTc5X2Noa19l ZWUoZGV2KTsKLQotCW5ldGlmX2NhcnJpZXJfb24oZGV2LT5uZXQpOwotCi0JcmV0dXJuIDA7CisJ cmV0dXJuIGF4ODgxNzlfbGlua19iaW5kX29yX3Jlc2V0KGRldiwgMSk7CiB9CiAKIHN0YXRpYyBp bnQgYXg4ODE3OV9yZXNldChzdHJ1Y3QgdXNibmV0ICpkZXYpCg==