From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752020AbdLFOJn (ORCPT ); Wed, 6 Dec 2017 09:09:43 -0500 Received: from us01smtprelay-2.synopsys.com ([198.182.60.111]:36210 "EHLO smtprelay.synopsys.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751453AbdLFOJj (ORCPT ); Wed, 6 Dec 2017 09:09:39 -0500 Date: Wed, 6 Dec 2017 18:08:12 +0400 From: Gevorg Sahakyan Subject: [PATCH] usb: dwc2: Fix TxFIFOn sizes and total TxFIFO size issues To: John Youn , Felipe Balbi , "Greg Kroah-Hartman" , , CC: Minas Harutyunyan , Gevorg Sahakyan MIME-Version: 1.0 Content-Type: text/plain Message-ID: <815f6b31-ae88-42c0-8ef5-f53cf20591a9@US01WEHTC1.internal.synopsys.com> X-Originating-IP: [10.13.184.19] Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org In host mode reading from DPTXSIZn returning invalid value in dwc2_check_param_tx_fifo_sizes function. In total TxFIFO size calculations unnecessarily reducing by ep_info. hw->total_fifo_size can be fully allocated for FIFO's. Added num_dev_in_eps member in dwc2_hw_params structure to save number of IN EPs. Added g_tx_fifo_size array in dwc2_hw_params structure to store power on reset values of DPTXSIZn registers in forced device mode. Updated dwc2_hsotg_tx_fifo_count() function to get TxFIFO count from num_dev_in_eps. Updated dwc2_get_dev_hwparams() function to store DPTXFSIZn in g_tx_fifo_size array. dwc2_get_host/dev_hwparams() functions call moved after num_dev_in_eps set from hwcfg4. Modified dwc2_check_param_tx_fifo_sizes() function to check TxFIFOn sizes based on g_tx_fifo_size array. Removed ep_info subtraction during calculation of tx_addr_max in dwc2_hsotg_tx_fifo_total_depth() function. Also removed dwc2_hsotg_ep_info_size() function as no more need. Signed-off-by: Gevorg Sahakyan Signed-off-by: Minas Harutyunyan --- drivers/usb/dwc2/core.h | 4 ++++ drivers/usb/dwc2/gadget.c | 42 ++---------------------------------------- drivers/usb/dwc2/params.c | 29 +++++++++++++++++++---------- 3 files changed, 25 insertions(+), 50 deletions(-) diff --git a/drivers/usb/dwc2/core.h b/drivers/usb/dwc2/core.h index 0f0c21cf0192..48aa5b4587e8 100644 --- a/drivers/usb/dwc2/core.h +++ b/drivers/usb/dwc2/core.h @@ -537,6 +537,7 @@ struct dwc2_core_params { * 2 - Internal DMA * @power_optimized Are power optimizations enabled? * @num_dev_ep Number of device endpoints available + * @num_dev_in_eps Number of device IN endpoints available * @num_dev_perio_in_ep Number of device periodic IN endpoints * available * @dev_token_q_depth Device Mode IN Token Sequence Learning Queue @@ -565,6 +566,7 @@ struct dwc2_core_params { * 2 - 8 or 16 bits * @snpsid: Value from SNPSID register * @dev_ep_dirs: Direction of device endpoints (GHWCFG1) + * @g_tx_fifo_size[] Power-on values of TxFIFO sizes */ struct dwc2_hw_params { unsigned op_mode:3; @@ -586,12 +588,14 @@ struct dwc2_hw_params { unsigned fs_phy_type:2; unsigned i2c_enable:1; unsigned num_dev_ep:4; + unsigned num_dev_in_eps : 4; unsigned num_dev_perio_in_ep:4; unsigned total_fifo_size:16; unsigned power_optimized:1; unsigned utmi_phy_data_width:2; u32 snpsid; u32 dev_ep_dirs; + u32 g_tx_fifo_size[MAX_EPS_CHANNELS]; }; /* Size of control and EP0 buffers */ diff --git a/drivers/usb/dwc2/gadget.c b/drivers/usb/dwc2/gadget.c index 66be52bde8da..edc1f26e627e 100644 --- a/drivers/usb/dwc2/gadget.c +++ b/drivers/usb/dwc2/gadget.c @@ -195,55 +195,18 @@ int dwc2_hsotg_tx_fifo_count(struct dwc2_hsotg *hsotg) { if (hsotg->hw_params.en_multiple_tx_fifo) /* In dedicated FIFO mode we need count of IN EPs */ - return (dwc2_readl(hsotg->regs + GHWCFG4) & - GHWCFG4_NUM_IN_EPS_MASK) >> GHWCFG4_NUM_IN_EPS_SHIFT; + return hsotg->hw_params.num_dev_in_eps; else /* In shared FIFO mode we need count of Periodic IN EPs */ return hsotg->hw_params.num_dev_perio_in_ep; } -/** - * dwc2_hsotg_ep_info_size - return Endpoint Info Control block size in DWORDs - */ -static int dwc2_hsotg_ep_info_size(struct dwc2_hsotg *hsotg) -{ - int val = 0; - int i; - u32 ep_dirs; - - /* - * Don't need additional space for ep info control registers in - * slave mode. - */ - if (!using_dma(hsotg)) { - dev_dbg(hsotg->dev, "Buffer DMA ep info size 0\n"); - return 0; - } - - /* - * Buffer DMA mode - 1 location per endpoit - * Descriptor DMA mode - 4 locations per endpoint - */ - ep_dirs = hsotg->hw_params.dev_ep_dirs; - - for (i = 0; i <= hsotg->hw_params.num_dev_ep; i++) { - val += ep_dirs & 3 ? 1 : 2; - ep_dirs >>= 2; - } - - if (using_desc_dma(hsotg)) - val = val * 4; - - return val; -} - /** * dwc2_hsotg_tx_fifo_total_depth - return total FIFO depth available for * device mode TX FIFOs */ int dwc2_hsotg_tx_fifo_total_depth(struct dwc2_hsotg *hsotg) { - int ep_info_size; int addr; int tx_addr_max; u32 np_tx_fifo_size; @@ -252,8 +215,7 @@ int dwc2_hsotg_tx_fifo_total_depth(struct dwc2_hsotg *hsotg) hsotg->params.g_np_tx_fifo_size); /* Get Endpoint Info Control block size in DWORDs. */ - ep_info_size = dwc2_hsotg_ep_info_size(hsotg); - tx_addr_max = hsotg->hw_params.total_fifo_size - ep_info_size; + tx_addr_max = hsotg->hw_params.total_fifo_size; addr = hsotg->params.g_rx_fifo_size + np_tx_fifo_size; if (tx_addr_max <= addr) diff --git a/drivers/usb/dwc2/params.c b/drivers/usb/dwc2/params.c index 9c3ff66a2eb8..90d482c16094 100644 --- a/drivers/usb/dwc2/params.c +++ b/drivers/usb/dwc2/params.c @@ -484,8 +484,7 @@ static void dwc2_check_param_tx_fifo_sizes(struct dwc2_hsotg *hsotg) } for (fifo = 1; fifo <= fifo_count; fifo++) { - dptxfszn = (dwc2_readl(hsotg->regs + DPTXFSIZN(fifo)) & - FIFOSIZE_DEPTH_MASK) >> FIFOSIZE_DEPTH_SHIFT; + dptxfszn = hsotg->hw_params.g_tx_fifo_size[fifo]; if (hsotg->params.g_tx_fifo_size[fifo] < min || hsotg->params.g_tx_fifo_size[fifo] > dptxfszn) { @@ -604,6 +603,7 @@ static void dwc2_get_dev_hwparams(struct dwc2_hsotg *hsotg) { struct dwc2_hw_params *hw = &hsotg->hw_params; u32 gnptxfsiz; + int fifo, fifo_count; if (hsotg->dr_mode == USB_DR_MODE_HOST) return; @@ -612,6 +612,14 @@ static void dwc2_get_dev_hwparams(struct dwc2_hsotg *hsotg) gnptxfsiz = dwc2_readl(hsotg->regs + GNPTXFSIZ); + fifo_count = dwc2_hsotg_tx_fifo_count(hsotg); + + for (fifo = 1; fifo <= fifo_count; fifo++) { + hw->g_tx_fifo_size[fifo] = + (dwc2_readl(hsotg->regs + DPTXFSIZN(fifo)) & + FIFOSIZE_DEPTH_MASK) >> FIFOSIZE_DEPTH_SHIFT; + } + hw->dev_nperio_tx_fifo_size = (gnptxfsiz & FIFOSIZE_DEPTH_MASK) >> FIFOSIZE_DEPTH_SHIFT; } @@ -653,14 +661,6 @@ int dwc2_get_hwparams(struct dwc2_hsotg *hsotg) hwcfg4 = dwc2_readl(hsotg->regs + GHWCFG4); grxfsiz = dwc2_readl(hsotg->regs + GRXFSIZ); - /* - * Host specific hardware parameters. Reading these parameters - * requires the controller to be in host mode. The mode will - * be forced, if necessary, to read these values. - */ - dwc2_get_host_hwparams(hsotg); - dwc2_get_dev_hwparams(hsotg); - /* hwcfg1 */ hw->dev_ep_dirs = hwcfg1; @@ -703,6 +703,8 @@ int dwc2_get_hwparams(struct dwc2_hsotg *hsotg) hw->en_multiple_tx_fifo = !!(hwcfg4 & GHWCFG4_DED_FIFO_EN); hw->num_dev_perio_in_ep = (hwcfg4 & GHWCFG4_NUM_DEV_PERIO_IN_EP_MASK) >> GHWCFG4_NUM_DEV_PERIO_IN_EP_SHIFT; + hw->num_dev_in_eps = (hwcfg4 & GHWCFG4_NUM_IN_EPS_MASK) >> + GHWCFG4_NUM_IN_EPS_SHIFT; hw->dma_desc_enable = !!(hwcfg4 & GHWCFG4_DESC_DMA); hw->power_optimized = !!(hwcfg4 & GHWCFG4_POWER_OPTIMIZ); hw->utmi_phy_data_width = (hwcfg4 & GHWCFG4_UTMI_PHY_DATA_WIDTH_MASK) >> @@ -711,6 +713,13 @@ int dwc2_get_hwparams(struct dwc2_hsotg *hsotg) /* fifo sizes */ hw->rx_fifo_size = (grxfsiz & GRXFSIZ_DEPTH_MASK) >> GRXFSIZ_DEPTH_SHIFT; + /* + * Host specific hardware parameters. Reading these parameters + * requires the controller to be in host mode. The mode will + * be forced, if necessary, to read these values. + */ + dwc2_get_host_hwparams(hsotg); + dwc2_get_dev_hwparams(hsotg); return 0; } -- 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: usb: dwc2: Fix TxFIFOn sizes and total TxFIFO size issues From: Gevorg Sahakyan Message-Id: <815f6b31-ae88-42c0-8ef5-f53cf20591a9@US01WEHTC1.internal.synopsys.com> Date: Wed, 6 Dec 2017 18:08:12 +0400 To: John Youn , Felipe Balbi , Greg Kroah-Hartman , linux-usb@vger.kernel.org, linux-kernel@vger.kernel.org Cc: Minas Harutyunyan , Gevorg Sahakyan List-ID: SW4gaG9zdCBtb2RlIHJlYWRpbmcgZnJvbSBEUFRYU0labiByZXR1cm5pbmcgaW52YWxpZCB2YWx1 ZSBpbgpkd2MyX2NoZWNrX3BhcmFtX3R4X2ZpZm9fc2l6ZXMgZnVuY3Rpb24uCgpJbiB0b3RhbCBU eEZJRk8gc2l6ZSBjYWxjdWxhdGlvbnMgdW5uZWNlc3NhcmlseSByZWR1Y2luZyBieSBlcF9pbmZv Lgpody0+dG90YWxfZmlmb19zaXplIGNhbiBiZSBmdWxseSBhbGxvY2F0ZWQgZm9yIEZJRk8ncy4K CkFkZGVkIG51bV9kZXZfaW5fZXBzIG1lbWJlciBpbiBkd2MyX2h3X3BhcmFtcyBzdHJ1Y3R1cmUg dG8gc2F2ZSBudW1iZXIKb2YgSU4gRVBzLgoKQWRkZWQgZ190eF9maWZvX3NpemUgYXJyYXkgaW4g ZHdjMl9od19wYXJhbXMgc3RydWN0dXJlIHRvIHN0b3JlIHBvd2VyIG9uCnJlc2V0IHZhbHVlcyBv ZiBEUFRYU0labiByZWdpc3RlcnMgaW4gZm9yY2VkIGRldmljZSBtb2RlLgoKVXBkYXRlZCBkd2My X2hzb3RnX3R4X2ZpZm9fY291bnQoKSBmdW5jdGlvbiB0byBnZXQgVHhGSUZPIGNvdW50IGZyb20K bnVtX2Rldl9pbl9lcHMuCgpVcGRhdGVkIGR3YzJfZ2V0X2Rldl9od3BhcmFtcygpIGZ1bmN0aW9u IHRvIHN0b3JlIERQVFhGU0labiBpbgpnX3R4X2ZpZm9fc2l6ZSBhcnJheS4KCmR3YzJfZ2V0X2hv c3QvZGV2X2h3cGFyYW1zKCkgZnVuY3Rpb25zIGNhbGwgbW92ZWQgYWZ0ZXIgbnVtX2Rldl9pbl9l cHMKc2V0IGZyb20gaHdjZmc0LgoKTW9kaWZpZWQgZHdjMl9jaGVja19wYXJhbV90eF9maWZvX3Np emVzKCkgZnVuY3Rpb24gdG8gY2hlY2sgVHhGSUZPbgpzaXplcyBiYXNlZCBvbiBnX3R4X2ZpZm9f c2l6ZSBhcnJheS4KClJlbW92ZWQgZXBfaW5mbyBzdWJ0cmFjdGlvbiBkdXJpbmcgY2FsY3VsYXRp b24gb2YgdHhfYWRkcl9tYXggaW4KZHdjMl9oc290Z190eF9maWZvX3RvdGFsX2RlcHRoKCkgZnVu Y3Rpb24uIEFsc28gcmVtb3ZlZApkd2MyX2hzb3RnX2VwX2luZm9fc2l6ZSgpIGZ1bmN0aW9uIGFz IG5vIG1vcmUgbmVlZC4KClNpZ25lZC1vZmYtYnk6IEdldm9yZyBTYWhha3lhbiA8c2FoYWt5YW5A c3lub3BzeXMuY29tPgpTaWduZWQtb2ZmLWJ5OiBNaW5hcyBIYXJ1dHl1bnlhbiA8aG1pbmFzQHN5 bm9wc3lzLmNvbT4KLS0tCiBkcml2ZXJzL3VzYi9kd2MyL2NvcmUuaCAgIHwgIDQgKysrKwogZHJp dmVycy91c2IvZHdjMi9nYWRnZXQuYyB8IDQyICsrLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLQogZHJpdmVycy91c2IvZHdjMi9wYXJhbXMuYyB8IDI5ICsrKysrKysrKysr KysrKysrKystLS0tLS0tLS0tCiAzIGZpbGVzIGNoYW5nZWQsIDI1IGluc2VydGlvbnMoKyksIDUw IGRlbGV0aW9ucygtKQoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2R3YzIvY29yZS5oIGIvZHJp dmVycy91c2IvZHdjMi9jb3JlLmgKaW5kZXggMGYwYzIxY2YwMTkyLi40OGFhNWI0NTg3ZTggMTAw NjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2R3YzIvY29yZS5oCisrKyBiL2RyaXZlcnMvdXNiL2R3YzIv Y29yZS5oCkBAIC01MzcsNiArNTM3LDcgQEAgc3RydWN0IGR3YzJfY29yZV9wYXJhbXMgewogICog ICAgICAgICAgICAgICAgICAgICAgIDIgLSBJbnRlcm5hbCBETUEKICAqIEBwb3dlcl9vcHRpbWl6 ZWQgICAgIEFyZSBwb3dlciBvcHRpbWl6YXRpb25zIGVuYWJsZWQ/CiAgKiBAbnVtX2Rldl9lcCAg ICAgICAgICBOdW1iZXIgb2YgZGV2aWNlIGVuZHBvaW50cyBhdmFpbGFibGUKKyAqIEBudW1fZGV2 X2luX2VwcyAgICAgIE51bWJlciBvZiBkZXZpY2UgSU4gZW5kcG9pbnRzIGF2YWlsYWJsZQogICog QG51bV9kZXZfcGVyaW9faW5fZXAgTnVtYmVyIG9mIGRldmljZSBwZXJpb2RpYyBJTiBlbmRwb2lu dHMKICAqICAgICAgICAgICAgICAgICAgICAgIGF2YWlsYWJsZQogICogQGRldl90b2tlbl9xX2Rl cHRoICAgRGV2aWNlIE1vZGUgSU4gVG9rZW4gU2VxdWVuY2UgTGVhcm5pbmcgUXVldWUKQEAgLTU2 NSw2ICs1NjYsNyBAQCBzdHJ1Y3QgZHdjMl9jb3JlX3BhcmFtcyB7CiAgKiAgICAgICAgICAgICAg ICAgICAgICAgMiAtIDggb3IgMTYgYml0cwogICogQHNucHNpZDogICAgICAgICAgICAgVmFsdWUg ZnJvbSBTTlBTSUQgcmVnaXN0ZXIKICAqIEBkZXZfZXBfZGlyczogICAgICAgIERpcmVjdGlvbiBv ZiBkZXZpY2UgZW5kcG9pbnRzIChHSFdDRkcxKQorICogQGdfdHhfZmlmb19zaXplW10JUG93ZXIt b24gdmFsdWVzIG9mIFR4RklGTyBzaXplcwogICovCiBzdHJ1Y3QgZHdjMl9od19wYXJhbXMgewog CXVuc2lnbmVkIG9wX21vZGU6MzsKQEAgLTU4NiwxMiArNTg4LDE0IEBAIHN0cnVjdCBkd2MyX2h3 X3BhcmFtcyB7CiAJdW5zaWduZWQgZnNfcGh5X3R5cGU6MjsKIAl1bnNpZ25lZCBpMmNfZW5hYmxl OjE7CiAJdW5zaWduZWQgbnVtX2Rldl9lcDo0OworCXVuc2lnbmVkIG51bV9kZXZfaW5fZXBzIDog NDsKIAl1bnNpZ25lZCBudW1fZGV2X3BlcmlvX2luX2VwOjQ7CiAJdW5zaWduZWQgdG90YWxfZmlm b19zaXplOjE2OwogCXVuc2lnbmVkIHBvd2VyX29wdGltaXplZDoxOwogCXVuc2lnbmVkIHV0bWlf cGh5X2RhdGFfd2lkdGg6MjsKIAl1MzIgc25wc2lkOwogCXUzMiBkZXZfZXBfZGlyczsKKwl1MzIg Z190eF9maWZvX3NpemVbTUFYX0VQU19DSEFOTkVMU107CiB9OwogCiAvKiBTaXplIG9mIGNvbnRy b2wgYW5kIEVQMCBidWZmZXJzICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9kd2MyL2dhZGdl dC5jIGIvZHJpdmVycy91c2IvZHdjMi9nYWRnZXQuYwppbmRleCA2NmJlNTJiZGU4ZGEuLmVkYzFm MjZlNjI3ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvZHdjMi9nYWRnZXQuYworKysgYi9kcml2 ZXJzL3VzYi9kd2MyL2dhZGdldC5jCkBAIC0xOTUsNTUgKzE5NSwxOCBAQCBpbnQgZHdjMl9oc290 Z190eF9maWZvX2NvdW50KHN0cnVjdCBkd2MyX2hzb3RnICpoc290ZykKIHsKIAlpZiAoaHNvdGct Pmh3X3BhcmFtcy5lbl9tdWx0aXBsZV90eF9maWZvKQogCQkvKiBJbiBkZWRpY2F0ZWQgRklGTyBt b2RlIHdlIG5lZWQgY291bnQgb2YgSU4gRVBzICovCi0JCXJldHVybiAoZHdjMl9yZWFkbChoc290 Zy0+cmVncyArIEdIV0NGRzQpICAmCi0JCQlHSFdDRkc0X05VTV9JTl9FUFNfTUFTSykgPj4gR0hX Q0ZHNF9OVU1fSU5fRVBTX1NISUZUOworCQlyZXR1cm4gaHNvdGctPmh3X3BhcmFtcy5udW1fZGV2 X2luX2VwczsKIAllbHNlCiAJCS8qIEluIHNoYXJlZCBGSUZPIG1vZGUgd2UgbmVlZCBjb3VudCBv ZiBQZXJpb2RpYyBJTiBFUHMgKi8KIAkJcmV0dXJuIGhzb3RnLT5od19wYXJhbXMubnVtX2Rldl9w ZXJpb19pbl9lcDsKIH0KIAotLyoqCi0gKiBkd2MyX2hzb3RnX2VwX2luZm9fc2l6ZSAtIHJldHVy biBFbmRwb2ludCBJbmZvIENvbnRyb2wgYmxvY2sgc2l6ZSBpbiBEV09SRHMKLSAqLwotc3RhdGlj IGludCBkd2MyX2hzb3RnX2VwX2luZm9fc2l6ZShzdHJ1Y3QgZHdjMl9oc290ZyAqaHNvdGcpCi17 Ci0JaW50IHZhbCA9IDA7Ci0JaW50IGk7Ci0JdTMyIGVwX2RpcnM7Ci0KLQkvKgotCSAqIERvbid0 IG5lZWQgYWRkaXRpb25hbCBzcGFjZSBmb3IgZXAgaW5mbyBjb250cm9sIHJlZ2lzdGVycyBpbgot CSAqIHNsYXZlIG1vZGUuCi0JICovCi0JaWYgKCF1c2luZ19kbWEoaHNvdGcpKSB7Ci0JCWRldl9k YmcoaHNvdGctPmRldiwgIkJ1ZmZlciBETUEgZXAgaW5mbyBzaXplIDBcbiIpOwotCQlyZXR1cm4g MDsKLQl9Ci0KLQkvKgotCSAqIEJ1ZmZlciBETUEgbW9kZSAtIDEgbG9jYXRpb24gcGVyIGVuZHBv aXQKLQkgKiBEZXNjcmlwdG9yIERNQSBtb2RlIC0gNCBsb2NhdGlvbnMgcGVyIGVuZHBvaW50Ci0J ICovCi0JZXBfZGlycyA9IGhzb3RnLT5od19wYXJhbXMuZGV2X2VwX2RpcnM7Ci0KLQlmb3IgKGkg PSAwOyBpIDw9IGhzb3RnLT5od19wYXJhbXMubnVtX2Rldl9lcDsgaSsrKSB7Ci0JCXZhbCArPSBl cF9kaXJzICYgMyA/IDEgOiAyOwotCQllcF9kaXJzID4+PSAyOwotCX0KLQotCWlmICh1c2luZ19k ZXNjX2RtYShoc290ZykpCi0JCXZhbCA9IHZhbCAqIDQ7Ci0KLQlyZXR1cm4gdmFsOwotfQotCiAv KioKICAqIGR3YzJfaHNvdGdfdHhfZmlmb190b3RhbF9kZXB0aCAtIHJldHVybiB0b3RhbCBGSUZP IGRlcHRoIGF2YWlsYWJsZSBmb3IKICAqIGRldmljZSBtb2RlIFRYIEZJRk9zCiAgKi8KIGludCBk d2MyX2hzb3RnX3R4X2ZpZm9fdG90YWxfZGVwdGgoc3RydWN0IGR3YzJfaHNvdGcgKmhzb3RnKQog ewotCWludCBlcF9pbmZvX3NpemU7CiAJaW50IGFkZHI7CiAJaW50IHR4X2FkZHJfbWF4OwogCXUz MiBucF90eF9maWZvX3NpemU7CkBAIC0yNTIsOCArMjE1LDcgQEAgaW50IGR3YzJfaHNvdGdfdHhf Zmlmb190b3RhbF9kZXB0aChzdHJ1Y3QgZHdjMl9oc290ZyAqaHNvdGcpCiAJCQkJaHNvdGctPnBh cmFtcy5nX25wX3R4X2ZpZm9fc2l6ZSk7CiAKIAkvKiBHZXQgRW5kcG9pbnQgSW5mbyBDb250cm9s IGJsb2NrIHNpemUgaW4gRFdPUkRzLiAqLwotCWVwX2luZm9fc2l6ZSA9IGR3YzJfaHNvdGdfZXBf aW5mb19zaXplKGhzb3RnKTsKLQl0eF9hZGRyX21heCA9IGhzb3RnLT5od19wYXJhbXMudG90YWxf Zmlmb19zaXplIC0gZXBfaW5mb19zaXplOworCXR4X2FkZHJfbWF4ID0gaHNvdGctPmh3X3BhcmFt cy50b3RhbF9maWZvX3NpemU7CiAKIAlhZGRyID0gaHNvdGctPnBhcmFtcy5nX3J4X2ZpZm9fc2l6 ZSArIG5wX3R4X2ZpZm9fc2l6ZTsKIAlpZiAodHhfYWRkcl9tYXggPD0gYWRkcikKZGlmZiAtLWdp dCBhL2RyaXZlcnMvdXNiL2R3YzIvcGFyYW1zLmMgYi9kcml2ZXJzL3VzYi9kd2MyL3BhcmFtcy5j CmluZGV4IDljM2ZmNjZhMmViOC4uOTBkNDgyYzE2MDk0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Vz Yi9kd2MyL3BhcmFtcy5jCisrKyBiL2RyaXZlcnMvdXNiL2R3YzIvcGFyYW1zLmMKQEAgLTQ4NCw4 ICs0ODQsNyBAQCBzdGF0aWMgdm9pZCBkd2MyX2NoZWNrX3BhcmFtX3R4X2ZpZm9fc2l6ZXMoc3Ry dWN0IGR3YzJfaHNvdGcgKmhzb3RnKQogCX0KIAogCWZvciAoZmlmbyA9IDE7IGZpZm8gPD0gZmlm b19jb3VudDsgZmlmbysrKSB7Ci0JCWRwdHhmc3puID0gKGR3YzJfcmVhZGwoaHNvdGctPnJlZ3Mg KyBEUFRYRlNJWk4oZmlmbykpICYKLQkJCUZJRk9TSVpFX0RFUFRIX01BU0spID4+IEZJRk9TSVpF X0RFUFRIX1NISUZUOworCQlkcHR4ZnN6biA9IGhzb3RnLT5od19wYXJhbXMuZ190eF9maWZvX3Np emVbZmlmb107CiAKIAkJaWYgKGhzb3RnLT5wYXJhbXMuZ190eF9maWZvX3NpemVbZmlmb10gPCBt aW4gfHwKIAkJICAgIGhzb3RnLT5wYXJhbXMuZ190eF9maWZvX3NpemVbZmlmb10gPiAgZHB0eGZz em4pIHsKQEAgLTYwNCw2ICs2MDMsNyBAQCBzdGF0aWMgdm9pZCBkd2MyX2dldF9kZXZfaHdwYXJh bXMoc3RydWN0IGR3YzJfaHNvdGcgKmhzb3RnKQogewogCXN0cnVjdCBkd2MyX2h3X3BhcmFtcyAq aHcgPSAmaHNvdGctPmh3X3BhcmFtczsKIAl1MzIgZ25wdHhmc2l6OworCWludCBmaWZvLCBmaWZv X2NvdW50OwogCiAJaWYgKGhzb3RnLT5kcl9tb2RlID09IFVTQl9EUl9NT0RFX0hPU1QpCiAJCXJl dHVybjsKQEAgLTYxMiw2ICs2MTIsMTQgQEAgc3RhdGljIHZvaWQgZHdjMl9nZXRfZGV2X2h3cGFy YW1zKHN0cnVjdCBkd2MyX2hzb3RnICpoc290ZykKIAogCWducHR4ZnNpeiA9IGR3YzJfcmVhZGwo aHNvdGctPnJlZ3MgKyBHTlBUWEZTSVopOwogCisJZmlmb19jb3VudCA9IGR3YzJfaHNvdGdfdHhf Zmlmb19jb3VudChoc290Zyk7CisKKwlmb3IgKGZpZm8gPSAxOyBmaWZvIDw9IGZpZm9fY291bnQ7 IGZpZm8rKykgeworCQlody0+Z190eF9maWZvX3NpemVbZmlmb10gPQorCQkJKGR3YzJfcmVhZGwo aHNvdGctPnJlZ3MgKyBEUFRYRlNJWk4oZmlmbykpICYKKwkJCUZJRk9TSVpFX0RFUFRIX01BU0sp ID4+IEZJRk9TSVpFX0RFUFRIX1NISUZUOworCX0KKwogCWh3LT5kZXZfbnBlcmlvX3R4X2ZpZm9f c2l6ZSA9IChnbnB0eGZzaXogJiBGSUZPU0laRV9ERVBUSF9NQVNLKSA+PgogCQkJCSAgICAgICBG SUZPU0laRV9ERVBUSF9TSElGVDsKIH0KQEAgLTY1MywxNCArNjYxLDYgQEAgaW50IGR3YzJfZ2V0 X2h3cGFyYW1zKHN0cnVjdCBkd2MyX2hzb3RnICpoc290ZykKIAlod2NmZzQgPSBkd2MyX3JlYWRs KGhzb3RnLT5yZWdzICsgR0hXQ0ZHNCk7CiAJZ3J4ZnNpeiA9IGR3YzJfcmVhZGwoaHNvdGctPnJl Z3MgKyBHUlhGU0laKTsKIAotCS8qCi0JICogSG9zdCBzcGVjaWZpYyBoYXJkd2FyZSBwYXJhbWV0 ZXJzLiBSZWFkaW5nIHRoZXNlIHBhcmFtZXRlcnMKLQkgKiByZXF1aXJlcyB0aGUgY29udHJvbGxl ciB0byBiZSBpbiBob3N0IG1vZGUuIFRoZSBtb2RlIHdpbGwKLQkgKiBiZSBmb3JjZWQsIGlmIG5l Y2Vzc2FyeSwgdG8gcmVhZCB0aGVzZSB2YWx1ZXMuCi0JICovCi0JZHdjMl9nZXRfaG9zdF9od3Bh cmFtcyhoc290Zyk7Ci0JZHdjMl9nZXRfZGV2X2h3cGFyYW1zKGhzb3RnKTsKLQogCS8qIGh3Y2Zn MSAqLwogCWh3LT5kZXZfZXBfZGlycyA9IGh3Y2ZnMTsKIApAQCAtNzAzLDYgKzcwMyw4IEBAIGlu dCBkd2MyX2dldF9od3BhcmFtcyhzdHJ1Y3QgZHdjMl9oc290ZyAqaHNvdGcpCiAJaHctPmVuX211 bHRpcGxlX3R4X2ZpZm8gPSAhIShod2NmZzQgJiBHSFdDRkc0X0RFRF9GSUZPX0VOKTsKIAlody0+ bnVtX2Rldl9wZXJpb19pbl9lcCA9IChod2NmZzQgJiBHSFdDRkc0X05VTV9ERVZfUEVSSU9fSU5f RVBfTUFTSykgPj4KIAkJCQkgIEdIV0NGRzRfTlVNX0RFVl9QRVJJT19JTl9FUF9TSElGVDsKKwlo dy0+bnVtX2Rldl9pbl9lcHMgPSAoaHdjZmc0ICYgR0hXQ0ZHNF9OVU1fSU5fRVBTX01BU0spID4+ CisJCQkgICAgIEdIV0NGRzRfTlVNX0lOX0VQU19TSElGVDsKIAlody0+ZG1hX2Rlc2NfZW5hYmxl ID0gISEoaHdjZmc0ICYgR0hXQ0ZHNF9ERVNDX0RNQSk7CiAJaHctPnBvd2VyX29wdGltaXplZCA9 ICEhKGh3Y2ZnNCAmIEdIV0NGRzRfUE9XRVJfT1BUSU1JWik7CiAJaHctPnV0bWlfcGh5X2RhdGFf d2lkdGggPSAoaHdjZmc0ICYgR0hXQ0ZHNF9VVE1JX1BIWV9EQVRBX1dJRFRIX01BU0spID4+CkBA IC03MTEsNiArNzEzLDEzIEBAIGludCBkd2MyX2dldF9od3BhcmFtcyhzdHJ1Y3QgZHdjMl9oc290 ZyAqaHNvdGcpCiAJLyogZmlmbyBzaXplcyAqLwogCWh3LT5yeF9maWZvX3NpemUgPSAoZ3J4ZnNp eiAmIEdSWEZTSVpfREVQVEhfTUFTSykgPj4KIAkJCQlHUlhGU0laX0RFUFRIX1NISUZUOworCS8q CisJICogSG9zdCBzcGVjaWZpYyBoYXJkd2FyZSBwYXJhbWV0ZXJzLiBSZWFkaW5nIHRoZXNlIHBh cmFtZXRlcnMKKwkgKiByZXF1aXJlcyB0aGUgY29udHJvbGxlciB0byBiZSBpbiBob3N0IG1vZGUu IFRoZSBtb2RlIHdpbGwKKwkgKiBiZSBmb3JjZWQsIGlmIG5lY2Vzc2FyeSwgdG8gcmVhZCB0aGVz ZSB2YWx1ZXMuCisJICovCisJZHdjMl9nZXRfaG9zdF9od3BhcmFtcyhoc290Zyk7CisJZHdjMl9n ZXRfZGV2X2h3cGFyYW1zKGhzb3RnKTsKIAogCXJldHVybiAwOwogfQo=