From mboxrd@z Thu Jan 1 00:00:00 1970 From: Alexander Kurz Subject: [PATCH v3 2/2] net: usb: asix88179_178a: de-duplicate code Date: Mon, 2 Apr 2018 07:43:49 +0000 Message-ID: <20180402074349.12010-2-akurz@blala.de> References: <20180402074349.12010-1-akurz@blala.de> Cc: "Andrew F . Davis" , Marc Zyngier , linux-usb@vger.kernel.org, netdev@vger.kernel.org, Freddy Xin , Alexander Kurz To: "David S . Miller" Return-path: Received: from vs10.datenmanufaktur-hosting.net ([185.138.26.202]:50708 "EHLO vs81.iboxed.net" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1754219AbeDBHoO (ORCPT ); Mon, 2 Apr 2018 03:44:14 -0400 In-Reply-To: <20180402074349.12010-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 | 137 ++++++++++------------------------------- 1 file changed, 31 insertions(+), 106 deletions(-) diff --git a/drivers/net/usb/ax88179_178a.c b/drivers/net/usb/ax88179_178a.c index a6ef75907ae9..fea4c7b877cc 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_bind_or_reset(struct usbnet *dev, bool 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_bind_or_reset(dev, false); +} + static void ax88179_unbind(struct usbnet *dev, struct usb_interface *intf) { u16 tmp16; @@ -1530,94 +1542,7 @@ static int ax88179_link_reset(struct usbnet *dev) static int ax88179_reset(struct usbnet *dev) { - u8 buf[5]; - u16 *tmp16; - u8 *tmp; - struct ax88179_data *ax179_data = (struct ax88179_data *)dev->data; - struct ethtool_eee eee_data; - - tmp16 = (u16 *)buf; - tmp = (u8 *)buf; - - /* Power up ethernet PHY */ - *tmp16 = 0; - ax88179_write_cmd(dev, AX_ACCESS_MAC, AX_PHYPWR_RSTCTL, 2, 2, tmp16); - - *tmp16 = AX_PHYPWR_RSTCTL_IPRL; - ax88179_write_cmd(dev, AX_ACCESS_MAC, AX_PHYPWR_RSTCTL, 2, 2, tmp16); - msleep(200); - - *tmp = AX_CLK_SELECT_ACS | AX_CLK_SELECT_BCS; - ax88179_write_cmd(dev, AX_ACCESS_MAC, AX_CLK_SELECT, 1, 1, tmp); - msleep(100); - - /* Ethernet PHY Auto Detach*/ - ax88179_auto_detach(dev, 0); - - ax88179_read_cmd(dev, AX_ACCESS_MAC, AX_NODE_ID, ETH_ALEN, ETH_ALEN, - dev->net->dev_addr); - - /* RX bulk configuration */ - memcpy(tmp, &AX88179_BULKIN_SIZE[0], 5); - ax88179_write_cmd(dev, AX_ACCESS_MAC, AX_RX_BULKIN_QCTRL, 5, 5, tmp); - - dev->rx_urb_size = 1024 * 20; - - *tmp = 0x34; - ax88179_write_cmd(dev, AX_ACCESS_MAC, AX_PAUSE_WATERLVL_LOW, 1, 1, tmp); - - *tmp = 0x52; - ax88179_write_cmd(dev, AX_ACCESS_MAC, AX_PAUSE_WATERLVL_HIGH, - 1, 1, tmp); - - dev->net->features |= NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM | - NETIF_F_RXCSUM; - - dev->net->hw_features |= NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM | - NETIF_F_RXCSUM; - - /* Enable checksum offload */ - *tmp = AX_RXCOE_IP | AX_RXCOE_TCP | AX_RXCOE_UDP | - AX_RXCOE_TCPV6 | AX_RXCOE_UDPV6; - ax88179_write_cmd(dev, AX_ACCESS_MAC, AX_RXCOE_CTL, 1, 1, tmp); - - *tmp = AX_TXCOE_IP | AX_TXCOE_TCP | AX_TXCOE_UDP | - AX_TXCOE_TCPV6 | AX_TXCOE_UDPV6; - ax88179_write_cmd(dev, AX_ACCESS_MAC, AX_TXCOE_CTL, 1, 1, tmp); - - /* Configure RX control register => start operation */ - *tmp16 = AX_RX_CTL_DROPCRCERR | AX_RX_CTL_IPE | AX_RX_CTL_START | - AX_RX_CTL_AP | AX_RX_CTL_AMALL | AX_RX_CTL_AB; - ax88179_write_cmd(dev, AX_ACCESS_MAC, AX_RX_CTL, 2, 2, tmp16); - - *tmp = AX_MONITOR_MODE_PMETYPE | AX_MONITOR_MODE_PMEPOL | - AX_MONITOR_MODE_RWMP; - ax88179_write_cmd(dev, AX_ACCESS_MAC, AX_MONITOR_MOD, 1, 1, tmp); - - /* Configure default medium type => giga */ - *tmp16 = AX_MEDIUM_RECEIVE_EN | AX_MEDIUM_TXFLOW_CTRLEN | - AX_MEDIUM_RXFLOW_CTRLEN | AX_MEDIUM_FULL_DUPLEX | - AX_MEDIUM_GIGAMODE; - ax88179_write_cmd(dev, AX_ACCESS_MAC, AX_MEDIUM_STATUS_MODE, - 2, 2, tmp16); - - ax88179_led_setting(dev); - - ax179_data->eee_enabled = 0; - ax179_data->eee_active = 0; - - ax88179_disable_eee(dev); - - ax88179_ethtool_get_eee(dev, &eee_data); - eee_data.advertised = 0; - ax88179_ethtool_set_eee(dev, &eee_data); - - /* Restart autoneg */ - mii_nway_restart(&dev->mii); - - usbnet_link_change(dev, 0, 0); - - return 0; + return ax88179_bind_or_reset(dev, true); } static int ax88179_stop(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: [v3,2/2] net: usb: asix88179_178a: de-duplicate code From: Alexander Kurz Message-Id: <20180402074349.12010-2-akurz@blala.de> Date: Mon, 2 Apr 2018 07:43:49 +0000 To: "David S . Miller" Cc: "Andrew F . Davis" , Marc Zyngier , linux-usb@vger.kernel.org, netdev@vger.kernel.org, Freddy Xin , Alexander Kurz List-ID: UmVtb3ZlIHRoZSBkdXBsaWNhdGVkIGNvZGUgZm9yIGFzaXg4ODE3OV8xNzhhIGJpbmQgYW5kIHJl c2V0IG1ldGhvZHMuCgpTaWduZWQtb2ZmLWJ5OiBBbGV4YW5kZXIgS3VyeiA8YWt1cnpAYmxhbGEu ZGU+Ci0tLQogZHJpdmVycy9uZXQvdXNiL2F4ODgxNzlfMTc4YS5jIHwgMTM3ICsrKysrKysrKyst LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAxIGZpbGUgY2hhbmdlZCwgMzEgaW5zZXJ0 aW9ucygrKSwgMTA2IGRlbGV0aW9ucygtKQoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3VzYi9h eDg4MTc5XzE3OGEuYyBiL2RyaXZlcnMvbmV0L3VzYi9heDg4MTc5XzE3OGEuYwppbmRleCBhNmVm NzU5MDdhZTkuLmZlYTRjN2I4NzdjYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvdXNiL2F4ODgx NzlfMTc4YS5jCisrKyBiL2RyaXZlcnMvbmV0L3VzYi9heDg4MTc5XzE3OGEuYwpAQCAtMTIyMyw3 ICsxMjIzLDcgQEAgc3RhdGljIGludCBheDg4MTc5X2xlZF9zZXR0aW5nKHN0cnVjdCB1c2JuZXQg KmRldikKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBheDg4MTc5X2JpbmQoc3RydWN0IHVz Ym5ldCAqZGV2LCBzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZikKK3N0YXRpYyBpbnQgYXg4ODE3 OV9iaW5kX29yX3Jlc2V0KHN0cnVjdCB1c2JuZXQgKmRldiwgYm9vbCBkb19yZXNldCkKIHsKIAl1 OCBidWZbNV07CiAJdTE2ICp0bXAxNjsKQEAgLTEyMzEsMTIgKzEyMzEsMTEgQEAgc3RhdGljIGlu dCBheDg4MTc5X2JpbmQoc3RydWN0IHVzYm5ldCAqZGV2LCBzdHJ1Y3QgdXNiX2ludGVyZmFjZSAq aW50ZikKIAlzdHJ1Y3QgYXg4ODE3OV9kYXRhICpheDE3OV9kYXRhID0gKHN0cnVjdCBheDg4MTc5 X2RhdGEgKilkZXYtPmRhdGE7CiAJc3RydWN0IGV0aHRvb2xfZWVlIGVlZV9kYXRhOwogCi0JdXNi bmV0X2dldF9lbmRwb2ludHMoZGV2LCBpbnRmKTsKLQogCXRtcDE2ID0gKHUxNiAqKWJ1ZjsKIAl0 bXAgPSAodTggKilidWY7CiAKLQltZW1zZXQoYXgxNzlfZGF0YSwgMCwgc2l6ZW9mKCpheDE3OV9k YXRhKSk7CisJaWYgKCFkb19yZXNldCkKKwkJbWVtc2V0KGF4MTc5X2RhdGEsIDAsIHNpemVvZigq YXgxNzlfZGF0YSkpOwogCiAJLyogUG93ZXIgdXAgZXRoZXJuZXQgUEhZICovCiAJKnRtcDE2ID0g MDsKQEAgLTEyNDksOSArMTI0OCwxMyBAQCBzdGF0aWMgaW50IGF4ODgxNzlfYmluZChzdHJ1Y3Qg dXNibmV0ICpkZXYsIHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmKQogCWF4ODgxNzlfd3JpdGVf Y21kKGRldiwgQVhfQUNDRVNTX01BQywgQVhfQ0xLX1NFTEVDVCwgMSwgMSwgdG1wKTsKIAltc2xl ZXAoMTAwKTsKIAorCWlmIChkb19yZXNldCkKKwkJYXg4ODE3OV9hdXRvX2RldGFjaChkZXYsIDAp OworCiAJYXg4ODE3OV9yZWFkX2NtZChkZXYsIEFYX0FDQ0VTU19NQUMsIEFYX05PREVfSUQsIEVU SF9BTEVOLAogCQkJIEVUSF9BTEVOLCBkZXYtPm5ldC0+ZGV2X2FkZHIpOwotCW1lbWNweShkZXYt Pm5ldC0+cGVybV9hZGRyLCBkZXYtPm5ldC0+ZGV2X2FkZHIsIEVUSF9BTEVOKTsKKwlpZiAoIWRv X3Jlc2V0KQorCQltZW1jcHkoZGV2LT5uZXQtPnBlcm1fYWRkciwgZGV2LT5uZXQtPmRldl9hZGRy LCBFVEhfQUxFTik7CiAKIAkvKiBSWCBidWxrIGNvbmZpZ3VyYXRpb24gKi8KIAltZW1jcHkodG1w LCAmQVg4ODE3OV9CVUxLSU5fU0laRVswXSwgNSk7CkBAIC0xMjY2LDE5ICsxMjY5LDIxIEBAIHN0 YXRpYyBpbnQgYXg4ODE3OV9iaW5kKHN0cnVjdCB1c2JuZXQgKmRldiwgc3RydWN0IHVzYl9pbnRl cmZhY2UgKmludGYpCiAJYXg4ODE3OV93cml0ZV9jbWQoZGV2LCBBWF9BQ0NFU1NfTUFDLCBBWF9Q QVVTRV9XQVRFUkxWTF9ISUdILAogCQkJICAxLCAxLCB0bXApOwogCi0JZGV2LT5uZXQtPm5ldGRl dl9vcHMgPSAmYXg4ODE3OV9uZXRkZXZfb3BzOwotCWRldi0+bmV0LT5ldGh0b29sX29wcyA9ICZh eDg4MTc5X2V0aHRvb2xfb3BzOwotCWRldi0+bmV0LT5uZWVkZWRfaGVhZHJvb20gPSA4OwotCWRl di0+bmV0LT5tYXhfbXR1ID0gNDA4ODsKLQotCS8qIEluaXRpYWxpemUgTUlJIHN0cnVjdHVyZSAq LwotCWRldi0+bWlpLmRldiA9IGRldi0+bmV0OwotCWRldi0+bWlpLm1kaW9fcmVhZCA9IGF4ODgx NzlfbWRpb19yZWFkOwotCWRldi0+bWlpLm1kaW9fd3JpdGUgPSBheDg4MTc5X21kaW9fd3JpdGU7 Ci0JZGV2LT5taWkucGh5X2lkX21hc2sgPSAweGZmOwotCWRldi0+bWlpLnJlZ19udW1fbWFzayA9 IDB4ZmY7Ci0JZGV2LT5taWkucGh5X2lkID0gMHgwMzsKLQlkZXYtPm1paS5zdXBwb3J0c19nbWlp ID0gMTsKKwlpZiAoIWRvX3Jlc2V0KSB7CisJCWRldi0+bmV0LT5uZXRkZXZfb3BzID0gJmF4ODgx NzlfbmV0ZGV2X29wczsKKwkJZGV2LT5uZXQtPmV0aHRvb2xfb3BzID0gJmF4ODgxNzlfZXRodG9v bF9vcHM7CisJCWRldi0+bmV0LT5uZWVkZWRfaGVhZHJvb20gPSA4OworCQlkZXYtPm5ldC0+bWF4 X210dSA9IDQwODg7CisKKwkJLyogSW5pdGlhbGl6ZSBNSUkgc3RydWN0dXJlICovCisJCWRldi0+ bWlpLmRldiA9IGRldi0+bmV0OworCQlkZXYtPm1paS5tZGlvX3JlYWQgPSBheDg4MTc5X21kaW9f cmVhZDsKKwkJZGV2LT5taWkubWRpb193cml0ZSA9IGF4ODgxNzlfbWRpb193cml0ZTsKKwkJZGV2 LT5taWkucGh5X2lkX21hc2sgPSAweGZmOworCQlkZXYtPm1paS5yZWdfbnVtX21hc2sgPSAweGZm OworCQlkZXYtPm1paS5waHlfaWQgPSAweDAzOworCQlkZXYtPm1paS5zdXBwb3J0c19nbWlpID0g MTsKKwl9CiAKIAlkZXYtPm5ldC0+ZmVhdHVyZXMgfD0gTkVUSUZfRl9JUF9DU1VNIHwgTkVUSUZf Rl9JUFY2X0NTVU0gfAogCQkJICAgICAgTkVUSUZfRl9SWENTVU07CkBAIC0xMzMwLDYgKzEzMzUs MTMgQEAgc3RhdGljIGludCBheDg4MTc5X2JpbmQoc3RydWN0IHVzYm5ldCAqZGV2LCBzdHJ1Y3Qg dXNiX2ludGVyZmFjZSAqaW50ZikKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGludCBheDg4MTc5 X2JpbmQoc3RydWN0IHVzYm5ldCAqZGV2LCBzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZikKK3sK Kwl1c2JuZXRfZ2V0X2VuZHBvaW50cyhkZXYsIGludGYpOworCisJcmV0dXJuIGF4ODgxNzlfYmlu ZF9vcl9yZXNldChkZXYsIGZhbHNlKTsKK30KKwogc3RhdGljIHZvaWQgYXg4ODE3OV91bmJpbmQo c3RydWN0IHVzYm5ldCAqZGV2LCBzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZikKIHsKIAl1MTYg dG1wMTY7CkBAIC0xNTMwLDk0ICsxNTQyLDcgQEAgc3RhdGljIGludCBheDg4MTc5X2xpbmtfcmVz ZXQoc3RydWN0IHVzYm5ldCAqZGV2KQogCiBzdGF0aWMgaW50IGF4ODgxNzlfcmVzZXQoc3RydWN0 IHVzYm5ldCAqZGV2KQogewotCXU4IGJ1Zls1XTsKLQl1MTYgKnRtcDE2OwotCXU4ICp0bXA7Ci0J c3RydWN0IGF4ODgxNzlfZGF0YSAqYXgxNzlfZGF0YSA9IChzdHJ1Y3QgYXg4ODE3OV9kYXRhICop ZGV2LT5kYXRhOwotCXN0cnVjdCBldGh0b29sX2VlZSBlZWVfZGF0YTsKLQotCXRtcDE2ID0gKHUx NiAqKWJ1ZjsKLQl0bXAgPSAodTggKilidWY7Ci0KLQkvKiBQb3dlciB1cCBldGhlcm5ldCBQSFkg Ki8KLQkqdG1wMTYgPSAwOwotCWF4ODgxNzlfd3JpdGVfY21kKGRldiwgQVhfQUNDRVNTX01BQywg QVhfUEhZUFdSX1JTVENUTCwgMiwgMiwgdG1wMTYpOwotCi0JKnRtcDE2ID0gQVhfUEhZUFdSX1JT VENUTF9JUFJMOwotCWF4ODgxNzlfd3JpdGVfY21kKGRldiwgQVhfQUNDRVNTX01BQywgQVhfUEhZ UFdSX1JTVENUTCwgMiwgMiwgdG1wMTYpOwotCW1zbGVlcCgyMDApOwotCi0JKnRtcCA9IEFYX0NM S19TRUxFQ1RfQUNTIHwgQVhfQ0xLX1NFTEVDVF9CQ1M7Ci0JYXg4ODE3OV93cml0ZV9jbWQoZGV2 LCBBWF9BQ0NFU1NfTUFDLCBBWF9DTEtfU0VMRUNULCAxLCAxLCB0bXApOwotCW1zbGVlcCgxMDAp OwotCi0JLyogRXRoZXJuZXQgUEhZIEF1dG8gRGV0YWNoKi8KLQlheDg4MTc5X2F1dG9fZGV0YWNo KGRldiwgMCk7Ci0KLQlheDg4MTc5X3JlYWRfY21kKGRldiwgQVhfQUNDRVNTX01BQywgQVhfTk9E RV9JRCwgRVRIX0FMRU4sIEVUSF9BTEVOLAotCQkJIGRldi0+bmV0LT5kZXZfYWRkcik7Ci0KLQkv KiBSWCBidWxrIGNvbmZpZ3VyYXRpb24gKi8KLQltZW1jcHkodG1wLCAmQVg4ODE3OV9CVUxLSU5f U0laRVswXSwgNSk7Ci0JYXg4ODE3OV93cml0ZV9jbWQoZGV2LCBBWF9BQ0NFU1NfTUFDLCBBWF9S WF9CVUxLSU5fUUNUUkwsIDUsIDUsIHRtcCk7Ci0KLQlkZXYtPnJ4X3VyYl9zaXplID0gMTAyNCAq IDIwOwotCi0JKnRtcCA9IDB4MzQ7Ci0JYXg4ODE3OV93cml0ZV9jbWQoZGV2LCBBWF9BQ0NFU1Nf TUFDLCBBWF9QQVVTRV9XQVRFUkxWTF9MT1csIDEsIDEsIHRtcCk7Ci0KLQkqdG1wID0gMHg1MjsK LQlheDg4MTc5X3dyaXRlX2NtZChkZXYsIEFYX0FDQ0VTU19NQUMsIEFYX1BBVVNFX1dBVEVSTFZM X0hJR0gsCi0JCQkgIDEsIDEsIHRtcCk7Ci0KLQlkZXYtPm5ldC0+ZmVhdHVyZXMgfD0gTkVUSUZf Rl9JUF9DU1VNIHwgTkVUSUZfRl9JUFY2X0NTVU0gfAotCQkJICAgICAgTkVUSUZfRl9SWENTVU07 Ci0KLQlkZXYtPm5ldC0+aHdfZmVhdHVyZXMgfD0gTkVUSUZfRl9JUF9DU1VNIHwgTkVUSUZfRl9J UFY2X0NTVU0gfAotCQkJCSBORVRJRl9GX1JYQ1NVTTsKLQotCS8qIEVuYWJsZSBjaGVja3N1bSBv ZmZsb2FkICovCi0JKnRtcCA9IEFYX1JYQ09FX0lQIHwgQVhfUlhDT0VfVENQIHwgQVhfUlhDT0Vf VURQIHwKLQkgICAgICAgQVhfUlhDT0VfVENQVjYgfCBBWF9SWENPRV9VRFBWNjsKLQlheDg4MTc5 X3dyaXRlX2NtZChkZXYsIEFYX0FDQ0VTU19NQUMsIEFYX1JYQ09FX0NUTCwgMSwgMSwgdG1wKTsK LQotCSp0bXAgPSBBWF9UWENPRV9JUCB8IEFYX1RYQ09FX1RDUCB8IEFYX1RYQ09FX1VEUCB8Ci0J ICAgICAgIEFYX1RYQ09FX1RDUFY2IHwgQVhfVFhDT0VfVURQVjY7Ci0JYXg4ODE3OV93cml0ZV9j bWQoZGV2LCBBWF9BQ0NFU1NfTUFDLCBBWF9UWENPRV9DVEwsIDEsIDEsIHRtcCk7Ci0KLQkvKiBD b25maWd1cmUgUlggY29udHJvbCByZWdpc3RlciA9PiBzdGFydCBvcGVyYXRpb24gKi8KLQkqdG1w MTYgPSBBWF9SWF9DVExfRFJPUENSQ0VSUiB8IEFYX1JYX0NUTF9JUEUgfCBBWF9SWF9DVExfU1RB UlQgfAotCQkgQVhfUlhfQ1RMX0FQIHwgQVhfUlhfQ1RMX0FNQUxMIHwgQVhfUlhfQ1RMX0FCOwot CWF4ODgxNzlfd3JpdGVfY21kKGRldiwgQVhfQUNDRVNTX01BQywgQVhfUlhfQ1RMLCAyLCAyLCB0 bXAxNik7Ci0KLQkqdG1wID0gQVhfTU9OSVRPUl9NT0RFX1BNRVRZUEUgfCBBWF9NT05JVE9SX01P REVfUE1FUE9MIHwKLQkgICAgICAgQVhfTU9OSVRPUl9NT0RFX1JXTVA7Ci0JYXg4ODE3OV93cml0 ZV9jbWQoZGV2LCBBWF9BQ0NFU1NfTUFDLCBBWF9NT05JVE9SX01PRCwgMSwgMSwgdG1wKTsKLQot CS8qIENvbmZpZ3VyZSBkZWZhdWx0IG1lZGl1bSB0eXBlID0+IGdpZ2EgKi8KLQkqdG1wMTYgPSBB WF9NRURJVU1fUkVDRUlWRV9FTiB8IEFYX01FRElVTV9UWEZMT1dfQ1RSTEVOIHwKLQkJIEFYX01F RElVTV9SWEZMT1dfQ1RSTEVOIHwgQVhfTUVESVVNX0ZVTExfRFVQTEVYIHwKLQkJIEFYX01FRElV TV9HSUdBTU9ERTsKLQlheDg4MTc5X3dyaXRlX2NtZChkZXYsIEFYX0FDQ0VTU19NQUMsIEFYX01F RElVTV9TVEFUVVNfTU9ERSwKLQkJCSAgMiwgMiwgdG1wMTYpOwotCi0JYXg4ODE3OV9sZWRfc2V0 dGluZyhkZXYpOwotCi0JYXgxNzlfZGF0YS0+ZWVlX2VuYWJsZWQgPSAwOwotCWF4MTc5X2RhdGEt PmVlZV9hY3RpdmUgPSAwOwotCi0JYXg4ODE3OV9kaXNhYmxlX2VlZShkZXYpOwotCi0JYXg4ODE3 OV9ldGh0b29sX2dldF9lZWUoZGV2LCAmZWVlX2RhdGEpOwotCWVlZV9kYXRhLmFkdmVydGlzZWQg PSAwOwotCWF4ODgxNzlfZXRodG9vbF9zZXRfZWVlKGRldiwgJmVlZV9kYXRhKTsKLQotCS8qIFJl c3RhcnQgYXV0b25lZyAqLwotCW1paV9ud2F5X3Jlc3RhcnQoJmRldi0+bWlpKTsKLQotCXVzYm5l dF9saW5rX2NoYW5nZShkZXYsIDAsIDApOwotCi0JcmV0dXJuIDA7CisJcmV0dXJuIGF4ODgxNzlf YmluZF9vcl9yZXNldChkZXYsIHRydWUpOwogfQogCiBzdGF0aWMgaW50IGF4ODgxNzlfc3RvcChz dHJ1Y3QgdXNibmV0ICpkZXYpCg==