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=-15.3 required=3.0 tests=BAYES_00, HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER,INCLUDES_PATCH, MAILING_LIST_MULTI,NICE_REPLY_A,SPF_HELO_NONE,SPF_PASS,USER_AGENT_SANE_1 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 AD4C0C433ED for ; Sun, 2 May 2021 11:11:58 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 7BE0161208 for ; Sun, 2 May 2021 11:11:58 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231934AbhEBLMs (ORCPT ); Sun, 2 May 2021 07:12:48 -0400 Received: from mx2.suse.de ([195.135.220.15]:39102 "EHLO mx2.suse.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231468AbhEBLMs (ORCPT ); Sun, 2 May 2021 07:12:48 -0400 X-Virus-Scanned: by amavisd-new at test-mx.suse.de Received: from relay2.suse.de (unknown [195.135.221.27]) by mx2.suse.de (Postfix) with ESMTP id E675DAF83; Sun, 2 May 2021 11:11:55 +0000 (UTC) Subject: Re: [RFC PATCH v4 03/27] qed: Add qed-NVMeTCP personality To: Shai Malin , netdev@vger.kernel.org, linux-nvme@lists.infradead.org, sagi@grimberg.me, hch@lst.de, axboe@fb.com, kbusch@kernel.org Cc: "David S . Miller davem @ davemloft . net --cc=Jakub Kicinski" , aelior@marvell.com, mkalderon@marvell.com, okulkarni@marvell.com, pkushwaha@marvell.com, malin1024@gmail.com References: <20210429190926.5086-1-smalin@marvell.com> <20210429190926.5086-4-smalin@marvell.com> From: Hannes Reinecke Message-ID: <6b933b6e-684a-fc58-8db6-4404806ab114@suse.de> Date: Sun, 2 May 2021 13:11:54 +0200 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:78.0) Gecko/20100101 Thunderbird/78.8.0 MIME-Version: 1.0 In-Reply-To: <20210429190926.5086-4-smalin@marvell.com> Content-Type: text/plain; charset=utf-8; format=flowed Content-Language: en-US Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org On 4/29/21 9:09 PM, Shai Malin wrote: > From: Omkar Kulkarni > > This patch adds qed NVMeTCP personality in order to support the NVMeTCP > qed functionalities and manage the HW device shared resources. > The same design is used with Eth (qede), RDMA(qedr), iSCSI (qedi) and > FCoE (qedf). > > Acked-by: Igor Russkikh > Signed-off-by: Prabhakar Kushwaha > Signed-off-by: Omkar Kulkarni > Signed-off-by: Shai Malin > Signed-off-by: Michal Kalderon > Signed-off-by: Ariel Elior > --- > drivers/net/ethernet/qlogic/qed/qed.h | 3 ++ > drivers/net/ethernet/qlogic/qed/qed_cxt.c | 32 ++++++++++++++ > drivers/net/ethernet/qlogic/qed/qed_cxt.h | 1 + > drivers/net/ethernet/qlogic/qed/qed_dev.c | 44 ++++++++++++++++--- > drivers/net/ethernet/qlogic/qed/qed_hsi.h | 3 +- > drivers/net/ethernet/qlogic/qed/qed_ll2.c | 31 ++++++++----- > drivers/net/ethernet/qlogic/qed/qed_mcp.c | 3 ++ > drivers/net/ethernet/qlogic/qed/qed_mng_tlv.c | 3 +- > drivers/net/ethernet/qlogic/qed/qed_ooo.c | 5 ++- > .../net/ethernet/qlogic/qed/qed_sp_commands.c | 1 + > 10 files changed, 108 insertions(+), 18 deletions(-) > > diff --git a/drivers/net/ethernet/qlogic/qed/qed.h b/drivers/net/ethernet/qlogic/qed/qed.h > index 91d4635009ab..7ae648c4edba 100644 > --- a/drivers/net/ethernet/qlogic/qed/qed.h > +++ b/drivers/net/ethernet/qlogic/qed/qed.h > @@ -200,6 +200,7 @@ enum qed_pci_personality { > QED_PCI_ETH, > QED_PCI_FCOE, > QED_PCI_ISCSI, > + QED_PCI_NVMETCP, > QED_PCI_ETH_ROCE, > QED_PCI_ETH_IWARP, > QED_PCI_ETH_RDMA, > @@ -285,6 +286,8 @@ struct qed_hw_info { > ((dev)->hw_info.personality == QED_PCI_FCOE) > #define QED_IS_ISCSI_PERSONALITY(dev) \ > ((dev)->hw_info.personality == QED_PCI_ISCSI) > +#define QED_IS_NVMETCP_PERSONALITY(dev) \ > + ((dev)->hw_info.personality == QED_PCI_NVMETCP) > So you have a distinct PCI personality for NVMe-oF, but not for the protocol? Strange. Why don't you have a distinct NVMe-oF protocol ID? > /* Resource Allocation scheme results */ > u32 resc_start[QED_MAX_RESC]; > diff --git a/drivers/net/ethernet/qlogic/qed/qed_cxt.c b/drivers/net/ethernet/qlogic/qed/qed_cxt.c > index 0a22f8ce9a2c..6cef75723e38 100644 > --- a/drivers/net/ethernet/qlogic/qed/qed_cxt.c > +++ b/drivers/net/ethernet/qlogic/qed/qed_cxt.c > @@ -2106,6 +2106,30 @@ int qed_cxt_set_pf_params(struct qed_hwfn *p_hwfn, u32 rdma_tasks) > } > break; > } > + case QED_PCI_NVMETCP: > + { > + struct qed_nvmetcp_pf_params *p_params; > + > + p_params = &p_hwfn->pf_params.nvmetcp_pf_params; > + > + if (p_params->num_cons && p_params->num_tasks) { > + qed_cxt_set_proto_cid_count(p_hwfn, > + PROTOCOLID_NVMETCP, > + p_params->num_cons, > + 0); > + > + qed_cxt_set_proto_tid_count(p_hwfn, > + PROTOCOLID_NVMETCP, > + QED_CTX_NVMETCP_TID_SEG, > + 0, > + p_params->num_tasks, > + true); > + } else { > + DP_INFO(p_hwfn->cdev, > + "NvmeTCP personality used without setting params!\n"); > + } > + break; > + } > default: > return -EINVAL; > } > @@ -2132,6 +2156,10 @@ int qed_cxt_get_tid_mem_info(struct qed_hwfn *p_hwfn, > proto = PROTOCOLID_ISCSI; > seg = QED_CXT_ISCSI_TID_SEG; > break; > + case QED_PCI_NVMETCP: > + proto = PROTOCOLID_NVMETCP; > + seg = QED_CTX_NVMETCP_TID_SEG; > + break; > default: > return -EINVAL; > } > @@ -2458,6 +2486,10 @@ int qed_cxt_get_task_ctx(struct qed_hwfn *p_hwfn, > proto = PROTOCOLID_ISCSI; > seg = QED_CXT_ISCSI_TID_SEG; > break; > + case QED_PCI_NVMETCP: > + proto = PROTOCOLID_NVMETCP; > + seg = QED_CTX_NVMETCP_TID_SEG; > + break; > default: > return -EINVAL; > } > diff --git a/drivers/net/ethernet/qlogic/qed/qed_cxt.h b/drivers/net/ethernet/qlogic/qed/qed_cxt.h > index 056e79620a0e..8f1a77cb33f6 100644 > --- a/drivers/net/ethernet/qlogic/qed/qed_cxt.h > +++ b/drivers/net/ethernet/qlogic/qed/qed_cxt.h > @@ -51,6 +51,7 @@ int qed_cxt_get_tid_mem_info(struct qed_hwfn *p_hwfn, > struct qed_tid_mem *p_info); > > #define QED_CXT_ISCSI_TID_SEG PROTOCOLID_ISCSI > +#define QED_CTX_NVMETCP_TID_SEG PROTOCOLID_NVMETCP > #define QED_CXT_ROCE_TID_SEG PROTOCOLID_ROCE > #define QED_CXT_FCOE_TID_SEG PROTOCOLID_FCOE > enum qed_cxt_elem_type { > diff --git a/drivers/net/ethernet/qlogic/qed/qed_dev.c b/drivers/net/ethernet/qlogic/qed/qed_dev.c > index d2f5855b2ea7..d3f8cc42d07e 100644 > --- a/drivers/net/ethernet/qlogic/qed/qed_dev.c > +++ b/drivers/net/ethernet/qlogic/qed/qed_dev.c > @@ -37,6 +37,7 @@ > #include "qed_sriov.h" > #include "qed_vf.h" > #include "qed_rdma.h" > +#include "qed_nvmetcp.h" > > static DEFINE_SPINLOCK(qm_lock); > > @@ -667,7 +668,8 @@ qed_llh_set_engine_affin(struct qed_hwfn *p_hwfn, struct qed_ptt *p_ptt) > } > > /* Storage PF is bound to a single engine while L2 PF uses both */ > - if (QED_IS_FCOE_PERSONALITY(p_hwfn) || QED_IS_ISCSI_PERSONALITY(p_hwfn)) > + if (QED_IS_FCOE_PERSONALITY(p_hwfn) || QED_IS_ISCSI_PERSONALITY(p_hwfn) || > + QED_IS_NVMETCP_PERSONALITY(p_hwfn)) > eng = cdev->fir_affin ? QED_ENG1 : QED_ENG0; > else /* L2_PERSONALITY */ > eng = QED_BOTH_ENG; > @@ -1164,6 +1166,9 @@ void qed_llh_remove_mac_filter(struct qed_dev *cdev, > if (!test_bit(QED_MF_LLH_MAC_CLSS, &cdev->mf_bits)) > goto out; > > + if (QED_IS_NVMETCP_PERSONALITY(p_hwfn)) > + return; > + > ether_addr_copy(filter.mac.addr, mac_addr); > rc = qed_llh_shadow_remove_filter(cdev, ppfid, &filter, &filter_idx, > &ref_cnt); > @@ -1381,6 +1386,11 @@ void qed_resc_free(struct qed_dev *cdev) > qed_ooo_free(p_hwfn); > } > > + if (p_hwfn->hw_info.personality == QED_PCI_NVMETCP) { > + qed_nvmetcp_free(p_hwfn); > + qed_ooo_free(p_hwfn); > + } > + > if (QED_IS_RDMA_PERSONALITY(p_hwfn) && rdma_info) { > qed_spq_unregister_async_cb(p_hwfn, rdma_info->proto); > qed_rdma_info_free(p_hwfn); > @@ -1423,6 +1433,7 @@ static u32 qed_get_pq_flags(struct qed_hwfn *p_hwfn) > flags |= PQ_FLAGS_OFLD; > break; > case QED_PCI_ISCSI: > + case QED_PCI_NVMETCP: > flags |= PQ_FLAGS_ACK | PQ_FLAGS_OOO | PQ_FLAGS_OFLD; > break; > case QED_PCI_ETH_ROCE: > @@ -2269,6 +2280,12 @@ int qed_resc_alloc(struct qed_dev *cdev) > PROTOCOLID_ISCSI, > NULL); > n_eqes += 2 * num_cons; > + } else if (p_hwfn->hw_info.personality == QED_PCI_NVMETCP) { > + num_cons = > + qed_cxt_get_proto_cid_count(p_hwfn, > + PROTOCOLID_NVMETCP, > + NULL); > + n_eqes += 2 * num_cons; > } > > if (n_eqes > 0xFFFF) { > @@ -2313,6 +2330,15 @@ int qed_resc_alloc(struct qed_dev *cdev) > goto alloc_err; > } > > + if (p_hwfn->hw_info.personality == QED_PCI_NVMETCP) { > + rc = qed_nvmetcp_alloc(p_hwfn); > + if (rc) > + goto alloc_err; > + rc = qed_ooo_alloc(p_hwfn); > + if (rc) > + goto alloc_err; > + } > + > if (QED_IS_RDMA_PERSONALITY(p_hwfn)) { > rc = qed_rdma_info_alloc(p_hwfn); > if (rc) > @@ -2393,6 +2419,11 @@ void qed_resc_setup(struct qed_dev *cdev) > qed_iscsi_setup(p_hwfn); > qed_ooo_setup(p_hwfn); > } > + > + if (p_hwfn->hw_info.personality == QED_PCI_NVMETCP) { > + qed_nvmetcp_setup(p_hwfn); > + qed_ooo_setup(p_hwfn); > + } > } > } > > @@ -2854,7 +2885,8 @@ static int qed_hw_init_pf(struct qed_hwfn *p_hwfn, > > /* Protocol Configuration */ > STORE_RT_REG(p_hwfn, PRS_REG_SEARCH_TCP_RT_OFFSET, > - (p_hwfn->hw_info.personality == QED_PCI_ISCSI) ? 1 : 0); > + ((p_hwfn->hw_info.personality == QED_PCI_ISCSI) || > + (p_hwfn->hw_info.personality == QED_PCI_NVMETCP)) ? 1 : 0); > STORE_RT_REG(p_hwfn, PRS_REG_SEARCH_FCOE_RT_OFFSET, > (p_hwfn->hw_info.personality == QED_PCI_FCOE) ? 1 : 0); > STORE_RT_REG(p_hwfn, PRS_REG_SEARCH_ROCE_RT_OFFSET, 0); > @@ -3531,7 +3563,7 @@ static void qed_hw_set_feat(struct qed_hwfn *p_hwfn) > RESC_NUM(p_hwfn, > QED_CMDQS_CQS)); > > - if (QED_IS_ISCSI_PERSONALITY(p_hwfn)) > + if (QED_IS_ISCSI_PERSONALITY(p_hwfn) || QED_IS_NVMETCP_PERSONALITY(p_hwfn)) > feat_num[QED_ISCSI_CQ] = min_t(u32, sb_cnt.cnt, > RESC_NUM(p_hwfn, > QED_CMDQS_CQS)); > @@ -3734,7 +3766,8 @@ int qed_hw_get_dflt_resc(struct qed_hwfn *p_hwfn, > break; > case QED_BDQ: > if (p_hwfn->hw_info.personality != QED_PCI_ISCSI && > - p_hwfn->hw_info.personality != QED_PCI_FCOE) > + p_hwfn->hw_info.personality != QED_PCI_FCOE && > + p_hwfn->hw_info.personality != QED_PCI_NVMETCP) > *p_resc_num = 0; > else > *p_resc_num = 1; > @@ -3755,7 +3788,8 @@ int qed_hw_get_dflt_resc(struct qed_hwfn *p_hwfn, > *p_resc_start = 0; > else if (p_hwfn->cdev->num_ports_in_engine == 4) > *p_resc_start = p_hwfn->port_id; > - else if (p_hwfn->hw_info.personality == QED_PCI_ISCSI) > + else if (p_hwfn->hw_info.personality == QED_PCI_ISCSI || > + p_hwfn->hw_info.personality == QED_PCI_NVMETCP) > *p_resc_start = p_hwfn->port_id; > else if (p_hwfn->hw_info.personality == QED_PCI_FCOE) > *p_resc_start = p_hwfn->port_id + 2; > diff --git a/drivers/net/ethernet/qlogic/qed/qed_hsi.h b/drivers/net/ethernet/qlogic/qed/qed_hsi.h > index 24472f6a83c2..9c9ec8f53ef8 100644 > --- a/drivers/net/ethernet/qlogic/qed/qed_hsi.h > +++ b/drivers/net/ethernet/qlogic/qed/qed_hsi.h > @@ -12148,7 +12148,8 @@ struct public_func { > #define FUNC_MF_CFG_PROTOCOL_ISCSI 0x00000010 > #define FUNC_MF_CFG_PROTOCOL_FCOE 0x00000020 > #define FUNC_MF_CFG_PROTOCOL_ROCE 0x00000030 > -#define FUNC_MF_CFG_PROTOCOL_MAX 0x00000030 > +#define FUNC_MF_CFG_PROTOCOL_NVMETCP 0x00000040 > +#define FUNC_MF_CFG_PROTOCOL_MAX 0x00000040 > > #define FUNC_MF_CFG_MIN_BW_MASK 0x0000ff00 > #define FUNC_MF_CFG_MIN_BW_SHIFT 8 > diff --git a/drivers/net/ethernet/qlogic/qed/qed_ll2.c b/drivers/net/ethernet/qlogic/qed/qed_ll2.c > index 49783f365079..88bfcdcd4a4c 100644 > --- a/drivers/net/ethernet/qlogic/qed/qed_ll2.c > +++ b/drivers/net/ethernet/qlogic/qed/qed_ll2.c > @@ -960,7 +960,8 @@ static int qed_sp_ll2_rx_queue_start(struct qed_hwfn *p_hwfn, > > if (test_bit(QED_MF_LL2_NON_UNICAST, &p_hwfn->cdev->mf_bits) && > p_ramrod->main_func_queue && conn_type != QED_LL2_TYPE_ROCE && > - conn_type != QED_LL2_TYPE_IWARP) { > + conn_type != QED_LL2_TYPE_IWARP && > + (!QED_IS_NVMETCP_PERSONALITY(p_hwfn))) { > p_ramrod->mf_si_bcast_accept_all = 1; > p_ramrod->mf_si_mcast_accept_all = 1; > } else { > @@ -1049,6 +1050,8 @@ static int qed_sp_ll2_tx_queue_start(struct qed_hwfn *p_hwfn, > case QED_LL2_TYPE_OOO: > if (p_hwfn->hw_info.personality == QED_PCI_ISCSI) > p_ramrod->conn_type = PROTOCOLID_ISCSI; > + else if (p_hwfn->hw_info.personality == QED_PCI_NVMETCP) > + p_ramrod->conn_type = PROTOCOLID_NVMETCP; > else > p_ramrod->conn_type = PROTOCOLID_IWARP; > break; > @@ -1634,7 +1637,8 @@ int qed_ll2_establish_connection(void *cxt, u8 connection_handle) > if (rc) > goto out; > > - if (!QED_IS_RDMA_PERSONALITY(p_hwfn)) > + if (!QED_IS_RDMA_PERSONALITY(p_hwfn) && > + !QED_IS_NVMETCP_PERSONALITY(p_hwfn)) > qed_wr(p_hwfn, p_ptt, PRS_REG_USE_LIGHT_L2, 1); > > qed_ll2_establish_connection_ooo(p_hwfn, p_ll2_conn); > @@ -2376,7 +2380,8 @@ static int qed_ll2_start_ooo(struct qed_hwfn *p_hwfn, > static bool qed_ll2_is_storage_eng1(struct qed_dev *cdev) > { > return (QED_IS_FCOE_PERSONALITY(QED_LEADING_HWFN(cdev)) || > - QED_IS_ISCSI_PERSONALITY(QED_LEADING_HWFN(cdev))) && > + QED_IS_ISCSI_PERSONALITY(QED_LEADING_HWFN(cdev)) || > + QED_IS_NVMETCP_PERSONALITY(QED_LEADING_HWFN(cdev))) && > (QED_AFFIN_HWFN(cdev) != QED_LEADING_HWFN(cdev)); > } > > @@ -2402,11 +2407,13 @@ static int qed_ll2_stop(struct qed_dev *cdev) > > if (cdev->ll2->handle == QED_LL2_UNUSED_HANDLE) > return 0; > + if (!QED_IS_NVMETCP_PERSONALITY(p_hwfn)) > + qed_llh_remove_mac_filter(cdev, 0, cdev->ll2_mac_address); > > qed_llh_remove_mac_filter(cdev, 0, cdev->ll2_mac_address); > eth_zero_addr(cdev->ll2_mac_address); > > - if (QED_IS_ISCSI_PERSONALITY(p_hwfn)) > + if (QED_IS_ISCSI_PERSONALITY(p_hwfn) || QED_IS_NVMETCP_PERSONALITY(p_hwfn)) > qed_ll2_stop_ooo(p_hwfn); > > /* In CMT mode, LL2 is always started on engine 0 for a storage PF */ > @@ -2442,6 +2449,7 @@ static int __qed_ll2_start(struct qed_hwfn *p_hwfn, > conn_type = QED_LL2_TYPE_FCOE; > break; > case QED_PCI_ISCSI: > + case QED_PCI_NVMETCP: > conn_type = QED_LL2_TYPE_ISCSI; > break; > case QED_PCI_ETH_ROCE: > @@ -2567,7 +2575,7 @@ static int qed_ll2_start(struct qed_dev *cdev, struct qed_ll2_params *params) > } > } > > - if (QED_IS_ISCSI_PERSONALITY(p_hwfn)) { > + if (QED_IS_ISCSI_PERSONALITY(p_hwfn) || QED_IS_NVMETCP_PERSONALITY(p_hwfn)) { > DP_VERBOSE(cdev, QED_MSG_STORAGE, "Starting OOO LL2 queue\n"); > rc = qed_ll2_start_ooo(p_hwfn, params); > if (rc) { > @@ -2576,10 +2584,13 @@ static int qed_ll2_start(struct qed_dev *cdev, struct qed_ll2_params *params) > } > } > > - rc = qed_llh_add_mac_filter(cdev, 0, params->ll2_mac_address); > - if (rc) { > - DP_NOTICE(cdev, "Failed to add an LLH filter\n"); > - goto err3; > + if (!QED_IS_NVMETCP_PERSONALITY(p_hwfn)) { > + rc = qed_llh_add_mac_filter(cdev, 0, params->ll2_mac_address); > + if (rc) { > + DP_NOTICE(cdev, "Failed to add an LLH filter\n"); > + goto err3; > + } > + > } > > ether_addr_copy(cdev->ll2_mac_address, params->ll2_mac_address); > @@ -2587,7 +2598,7 @@ static int qed_ll2_start(struct qed_dev *cdev, struct qed_ll2_params *params) > return 0; > > err3: > - if (QED_IS_ISCSI_PERSONALITY(p_hwfn)) > + if (QED_IS_ISCSI_PERSONALITY(p_hwfn) || QED_IS_NVMETCP_PERSONALITY(p_hwfn)) > qed_ll2_stop_ooo(p_hwfn); > err2: > if (b_is_storage_eng1) > diff --git a/drivers/net/ethernet/qlogic/qed/qed_mcp.c b/drivers/net/ethernet/qlogic/qed/qed_mcp.c > index cd882c453394..4387292c37e2 100644 > --- a/drivers/net/ethernet/qlogic/qed/qed_mcp.c > +++ b/drivers/net/ethernet/qlogic/qed/qed_mcp.c > @@ -2446,6 +2446,9 @@ qed_mcp_get_shmem_proto(struct qed_hwfn *p_hwfn, > case FUNC_MF_CFG_PROTOCOL_ISCSI: > *p_proto = QED_PCI_ISCSI; > break; > + case FUNC_MF_CFG_PROTOCOL_NVMETCP: > + *p_proto = QED_PCI_NVMETCP; > + break; > case FUNC_MF_CFG_PROTOCOL_FCOE: > *p_proto = QED_PCI_FCOE; > break; > diff --git a/drivers/net/ethernet/qlogic/qed/qed_mng_tlv.c b/drivers/net/ethernet/qlogic/qed/qed_mng_tlv.c > index 3e3192a3ad9b..6190adf965bc 100644 > --- a/drivers/net/ethernet/qlogic/qed/qed_mng_tlv.c > +++ b/drivers/net/ethernet/qlogic/qed/qed_mng_tlv.c > @@ -1306,7 +1306,8 @@ int qed_mfw_process_tlv_req(struct qed_hwfn *p_hwfn, struct qed_ptt *p_ptt) > } > > if ((tlv_group & QED_MFW_TLV_ISCSI) && > - p_hwfn->hw_info.personality != QED_PCI_ISCSI) { > + p_hwfn->hw_info.personality != QED_PCI_ISCSI && > + p_hwfn->hw_info.personality != QED_PCI_NVMETCP) { > DP_VERBOSE(p_hwfn, QED_MSG_SP, > "Skipping iSCSI TLVs for non-iSCSI function\n"); > tlv_group &= ~QED_MFW_TLV_ISCSI; > diff --git a/drivers/net/ethernet/qlogic/qed/qed_ooo.c b/drivers/net/ethernet/qlogic/qed/qed_ooo.c > index 88353aa404dc..d37bb2463f98 100644 > --- a/drivers/net/ethernet/qlogic/qed/qed_ooo.c > +++ b/drivers/net/ethernet/qlogic/qed/qed_ooo.c > @@ -16,7 +16,7 @@ > #include "qed_ll2.h" > #include "qed_ooo.h" > #include "qed_cxt.h" > - > +#include "qed_nvmetcp.h" > static struct qed_ooo_archipelago > *qed_ooo_seek_archipelago(struct qed_hwfn *p_hwfn, > struct qed_ooo_info > @@ -85,6 +85,9 @@ int qed_ooo_alloc(struct qed_hwfn *p_hwfn) > case QED_PCI_ISCSI: > proto = PROTOCOLID_ISCSI; > break; > + case QED_PCI_NVMETCP: > + proto = PROTOCOLID_NVMETCP; > + break; > case QED_PCI_ETH_RDMA: > case QED_PCI_ETH_IWARP: > proto = PROTOCOLID_IWARP; > diff --git a/drivers/net/ethernet/qlogic/qed/qed_sp_commands.c b/drivers/net/ethernet/qlogic/qed/qed_sp_commands.c > index aa71adcf31ee..60b3876387a9 100644 > --- a/drivers/net/ethernet/qlogic/qed/qed_sp_commands.c > +++ b/drivers/net/ethernet/qlogic/qed/qed_sp_commands.c > @@ -385,6 +385,7 @@ int qed_sp_pf_start(struct qed_hwfn *p_hwfn, > p_ramrod->personality = PERSONALITY_FCOE; > break; > case QED_PCI_ISCSI: > + case QED_PCI_NVMETCP: > p_ramrod->personality = PERSONALITY_ISCSI; > break; > case QED_PCI_ETH_ROCE: > As indicated, I do find this mix of 'nvmetcp is nearly iscsi' a bit strange. I would have preferred to have distinct types for nvmetcp. Cheers, Hannes -- Dr. Hannes Reinecke Kernel Storage Architect hare@suse.de +49 911 74053 688 SUSE Software Solutions GmbH, Maxfeldstr. 5, 90409 Nürnberg HRB 36809 (AG Nürnberg), Geschäftsführer: Felix Imendörffer 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=-15.9 required=3.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER, INCLUDES_PATCH,MAILING_LIST_MULTI,NICE_REPLY_A,SPF_HELO_NONE,SPF_PASS, USER_AGENT_SANE_1 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 EB7D8C433ED for ; Sun, 2 May 2021 11:12:21 +0000 (UTC) Received: from desiato.infradead.org (desiato.infradead.org [90.155.92.199]) (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 300A5613B3 for ; Sun, 2 May 2021 11:12:21 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 300A5613B3 Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=suse.de Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=linux-nvme-bounces+linux-nvme=archiver.kernel.org@lists.infradead.org DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=desiato.20200630; h=Sender:Content-Type: Content-Transfer-Encoding:List-Subscribe:List-Help:List-Post:List-Archive: List-Unsubscribe:List-Id:In-Reply-To:MIME-Version:Date:Message-ID:From: References:Cc:To:Subject:Reply-To:Content-ID:Content-Description:Resent-Date: Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Owner; bh=OpBxvGvD6R6Q0yj7AAbSX/3KudmK9zF2TYMee56ntIM=; b=NP+sTq3gfc4xT/t2gobVCep5X jiyY7vorOevIOFplUaZdt65YtJUyz1mX/y5D/Ml3pOtTsAqJH6ap3b1Jjv1gK6UZET3AMBDdATm0Y 20BW+JRzvjs2Bc6jSdNAAWzcOciCJjdd936ctTcf+AI09MPegzuyHHi2G9hfgw2coEhzymnpCbRwE sJDjUxdXrWz4WLk+w+VXKA8nrK45rQaaofcL8rVPKuu1QOhUIt4rA4aBNIiqQiF3kOgE+1Z/tdGR1 XcV/YCLGc4acytkMtrSNGOvzEF36dBqB8t5QVjwckbbwPRwX+4n7JR9tt5Vm7EfnFRuo9zWozj/0I s3Nx+d7GA==; Received: from localhost ([::1] helo=desiato.infradead.org) by desiato.infradead.org with esmtp (Exim 4.94 #2 (Red Hat Linux)) id 1ldA15-00Bea9-SU; Sun, 02 May 2021 11:12:04 +0000 Received: from bombadil.infradead.org ([2607:7c80:54:e::133]) by desiato.infradead.org with esmtps (Exim 4.94 #2 (Red Hat Linux)) id 1ldA13-00Bea3-Iv for linux-nvme@desiato.infradead.org; Sun, 02 May 2021 11:12:02 +0000 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=infradead.org; s=bombadil.20210309; h=Content-Transfer-Encoding: Content-Type:In-Reply-To:MIME-Version:Date:Message-ID:From:References:Cc:To: Subject:Sender:Reply-To:Content-ID:Content-Description; bh=GAMDu7s4mJVnN4DmEGnFXRj8+Yl9jcOaRgkdUlnu6Vw=; b=aVqJPud6PMHP77d+sPKKSODARW fjzggdCaZYGsxKoO8x1RIY3+5YM75KI3GIY0Lk3n+exJQ73UoRzLa7VZiEi96m4D9r01X0ixY0B7E jeHP6IQQkftWsQ+qsSzHR4WceLBuXnll+3bAYlbcHjmrQokj7gsEzJKlUqsEg3Mj8Fb1PRjAvu3Te JEfCLklvQ01zaTgGG6oyCwOJZyjNFOzPZyxL9PQQZUWo53fwGn472gG7/lPK9Je+cY3woYc5h7t4t lTxSBc8Omr9NGCu0aCH9Sz89DFoSXnTi7ybxAFOcn6Y3ylC4P6iw6RfxiksBc0myy/Z3TshKAm9j/ rf29pEiA==; Received: from mx2.suse.de ([195.135.220.15]) by bombadil.infradead.org with esmtps (Exim 4.94 #2 (Red Hat Linux)) id 1ldA0z-002UY6-MV for linux-nvme@lists.infradead.org; Sun, 02 May 2021 11:12:00 +0000 X-Virus-Scanned: by amavisd-new at test-mx.suse.de Received: from relay2.suse.de (unknown [195.135.221.27]) by mx2.suse.de (Postfix) with ESMTP id E675DAF83; Sun, 2 May 2021 11:11:55 +0000 (UTC) Subject: Re: [RFC PATCH v4 03/27] qed: Add qed-NVMeTCP personality To: Shai Malin , netdev@vger.kernel.org, linux-nvme@lists.infradead.org, sagi@grimberg.me, hch@lst.de, axboe@fb.com, kbusch@kernel.org Cc: "David S . Miller davem @ davemloft . net --cc=Jakub Kicinski" , aelior@marvell.com, mkalderon@marvell.com, okulkarni@marvell.com, pkushwaha@marvell.com, malin1024@gmail.com References: <20210429190926.5086-1-smalin@marvell.com> <20210429190926.5086-4-smalin@marvell.com> From: Hannes Reinecke Message-ID: <6b933b6e-684a-fc58-8db6-4404806ab114@suse.de> Date: Sun, 2 May 2021 13:11:54 +0200 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:78.0) Gecko/20100101 Thunderbird/78.8.0 MIME-Version: 1.0 In-Reply-To: <20210429190926.5086-4-smalin@marvell.com> Content-Language: en-US X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20210502_041158_066883_E9533290 X-CRM114-Status: GOOD ( 28.58 ) X-BeenThere: linux-nvme@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Transfer-Encoding: base64 Content-Type: text/plain; charset="utf-8"; Format="flowed" Sender: "Linux-nvme" Errors-To: linux-nvme-bounces+linux-nvme=archiver.kernel.org@lists.infradead.org T24gNC8yOS8yMSA5OjA5IFBNLCBTaGFpIE1hbGluIHdyb3RlOgo+IEZyb206IE9ta2FyIEt1bGth cm5pIDxva3Vsa2FybmlAbWFydmVsbC5jb20+Cj4gCj4gVGhpcyBwYXRjaCBhZGRzIHFlZCBOVk1l VENQIHBlcnNvbmFsaXR5IGluIG9yZGVyIHRvIHN1cHBvcnQgdGhlIE5WTWVUQ1AKPiBxZWQgZnVu Y3Rpb25hbGl0aWVzIGFuZCBtYW5hZ2UgdGhlIEhXIGRldmljZSBzaGFyZWQgcmVzb3VyY2VzLgo+ IFRoZSBzYW1lIGRlc2lnbiBpcyB1c2VkIHdpdGggRXRoIChxZWRlKSwgUkRNQShxZWRyKSwgaVND U0kgKHFlZGkpIGFuZAo+IEZDb0UgKHFlZGYpLgo+IAo+IEFja2VkLWJ5OiBJZ29yIFJ1c3NraWto IDxpcnVzc2tpa2hAbWFydmVsbC5jb20+Cj4gU2lnbmVkLW9mZi1ieTogUHJhYmhha2FyIEt1c2h3 YWhhIDxwa3VzaHdhaGFAbWFydmVsbC5jb20+Cj4gU2lnbmVkLW9mZi1ieTogT21rYXIgS3Vsa2Fy bmkgPG9rdWxrYXJuaUBtYXJ2ZWxsLmNvbT4KPiBTaWduZWQtb2ZmLWJ5OiBTaGFpIE1hbGluIDxz bWFsaW5AbWFydmVsbC5jb20+Cj4gU2lnbmVkLW9mZi1ieTogTWljaGFsIEthbGRlcm9uIDxta2Fs ZGVyb25AbWFydmVsbC5jb20+Cj4gU2lnbmVkLW9mZi1ieTogQXJpZWwgRWxpb3IgPGFlbGlvckBt YXJ2ZWxsLmNvbT4KPiAtLS0KPiAgIGRyaXZlcnMvbmV0L2V0aGVybmV0L3Fsb2dpYy9xZWQvcWVk LmggICAgICAgICB8ICAzICsrCj4gICBkcml2ZXJzL25ldC9ldGhlcm5ldC9xbG9naWMvcWVkL3Fl ZF9jeHQuYyAgICAgfCAzMiArKysrKysrKysrKysrKwo+ICAgZHJpdmVycy9uZXQvZXRoZXJuZXQv cWxvZ2ljL3FlZC9xZWRfY3h0LmggICAgIHwgIDEgKwo+ICAgZHJpdmVycy9uZXQvZXRoZXJuZXQv cWxvZ2ljL3FlZC9xZWRfZGV2LmMgICAgIHwgNDQgKysrKysrKysrKysrKysrKy0tLQo+ICAgZHJp dmVycy9uZXQvZXRoZXJuZXQvcWxvZ2ljL3FlZC9xZWRfaHNpLmggICAgIHwgIDMgKy0KPiAgIGRy aXZlcnMvbmV0L2V0aGVybmV0L3Fsb2dpYy9xZWQvcWVkX2xsMi5jICAgICB8IDMxICsrKysrKysr LS0tLS0KPiAgIGRyaXZlcnMvbmV0L2V0aGVybmV0L3Fsb2dpYy9xZWQvcWVkX21jcC5jICAgICB8 ICAzICsrCj4gICBkcml2ZXJzL25ldC9ldGhlcm5ldC9xbG9naWMvcWVkL3FlZF9tbmdfdGx2LmMg fCAgMyArLQo+ICAgZHJpdmVycy9uZXQvZXRoZXJuZXQvcWxvZ2ljL3FlZC9xZWRfb29vLmMgICAg IHwgIDUgKystCj4gICAuLi4vbmV0L2V0aGVybmV0L3Fsb2dpYy9xZWQvcWVkX3NwX2NvbW1hbmRz LmMgfCAgMSArCj4gICAxMCBmaWxlcyBjaGFuZ2VkLCAxMDggaW5zZXJ0aW9ucygrKSwgMTggZGVs ZXRpb25zKC0pCj4gCj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3Fsb2dpYy9x ZWQvcWVkLmggYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9xbG9naWMvcWVkL3FlZC5oCj4gaW5kZXgg OTFkNDYzNTAwOWFiLi43YWU2NDhjNGVkYmEgMTAwNjQ0Cj4gLS0tIGEvZHJpdmVycy9uZXQvZXRo ZXJuZXQvcWxvZ2ljL3FlZC9xZWQuaAo+ICsrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3Fsb2dp Yy9xZWQvcWVkLmgKPiBAQCAtMjAwLDYgKzIwMCw3IEBAIGVudW0gcWVkX3BjaV9wZXJzb25hbGl0 eSB7Cj4gICAJUUVEX1BDSV9FVEgsCj4gICAJUUVEX1BDSV9GQ09FLAo+ICAgCVFFRF9QQ0lfSVND U0ksCj4gKwlRRURfUENJX05WTUVUQ1AsCj4gICAJUUVEX1BDSV9FVEhfUk9DRSwKPiAgIAlRRURf UENJX0VUSF9JV0FSUCwKPiAgIAlRRURfUENJX0VUSF9SRE1BLAo+IEBAIC0yODUsNiArMjg2LDgg QEAgc3RydWN0IHFlZF9od19pbmZvIHsKPiAgIAkoKGRldiktPmh3X2luZm8ucGVyc29uYWxpdHkg PT0gUUVEX1BDSV9GQ09FKQo+ICAgI2RlZmluZSBRRURfSVNfSVNDU0lfUEVSU09OQUxJVFkoZGV2 KQkJCQkJXAo+ICAgCSgoZGV2KS0+aHdfaW5mby5wZXJzb25hbGl0eSA9PSBRRURfUENJX0lTQ1NJ KQo+ICsjZGVmaW5lIFFFRF9JU19OVk1FVENQX1BFUlNPTkFMSVRZKGRldikJCQkJCVwKPiArCSgo ZGV2KS0+aHdfaW5mby5wZXJzb25hbGl0eSA9PSBRRURfUENJX05WTUVUQ1ApCj4gICAKU28geW91 IGhhdmUgYSBkaXN0aW5jdCBQQ0kgcGVyc29uYWxpdHkgZm9yIE5WTWUtb0YsIGJ1dCBub3QgZm9y IHRoZSAKcHJvdG9jb2w/IFN0cmFuZ2UuCldoeSBkb24ndCB5b3UgaGF2ZSBhIGRpc3RpbmN0IE5W TWUtb0YgcHJvdG9jb2wgSUQ/Cgo+ICAgCS8qIFJlc291cmNlIEFsbG9jYXRpb24gc2NoZW1lIHJl c3VsdHMgKi8KPiAgIAl1MzIJCQkJcmVzY19zdGFydFtRRURfTUFYX1JFU0NdOwo+IGRpZmYgLS1n aXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9xbG9naWMvcWVkL3FlZF9jeHQuYyBiL2RyaXZlcnMv bmV0L2V0aGVybmV0L3Fsb2dpYy9xZWQvcWVkX2N4dC5jCj4gaW5kZXggMGEyMmY4Y2U5YTJjLi42 Y2VmNzU3MjNlMzggMTAwNjQ0Cj4gLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvcWxvZ2ljL3Fl ZC9xZWRfY3h0LmMKPiArKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9xbG9naWMvcWVkL3FlZF9j eHQuYwo+IEBAIC0yMTA2LDYgKzIxMDYsMzAgQEAgaW50IHFlZF9jeHRfc2V0X3BmX3BhcmFtcyhz dHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwgdTMyIHJkbWFfdGFza3MpCj4gICAJCX0KPiAgIAkJYnJl YWs7Cj4gICAJfQo+ICsJY2FzZSBRRURfUENJX05WTUVUQ1A6Cj4gKwl7Cj4gKwkJc3RydWN0IHFl ZF9udm1ldGNwX3BmX3BhcmFtcyAqcF9wYXJhbXM7Cj4gKwo+ICsJCXBfcGFyYW1zID0gJnBfaHdm bi0+cGZfcGFyYW1zLm52bWV0Y3BfcGZfcGFyYW1zOwo+ICsKPiArCQlpZiAocF9wYXJhbXMtPm51 bV9jb25zICYmIHBfcGFyYW1zLT5udW1fdGFza3MpIHsKPiArCQkJcWVkX2N4dF9zZXRfcHJvdG9f Y2lkX2NvdW50KHBfaHdmbiwKPiArCQkJCQkJICAgIFBST1RPQ09MSURfTlZNRVRDUCwKPiArCQkJ CQkJICAgIHBfcGFyYW1zLT5udW1fY29ucywKPiArCQkJCQkJICAgIDApOwo+ICsKPiArCQkJcWVk X2N4dF9zZXRfcHJvdG9fdGlkX2NvdW50KHBfaHdmbiwKPiArCQkJCQkJICAgIFBST1RPQ09MSURf TlZNRVRDUCwKPiArCQkJCQkJICAgIFFFRF9DVFhfTlZNRVRDUF9USURfU0VHLAo+ICsJCQkJCQkg ICAgMCwKPiArCQkJCQkJICAgIHBfcGFyYW1zLT5udW1fdGFza3MsCj4gKwkJCQkJCSAgICB0cnVl KTsKPiArCQl9IGVsc2Ugewo+ICsJCQlEUF9JTkZPKHBfaHdmbi0+Y2RldiwKPiArCQkJCSJOdm1l VENQIHBlcnNvbmFsaXR5IHVzZWQgd2l0aG91dCBzZXR0aW5nIHBhcmFtcyFcbiIpOwo+ICsJCX0K PiArCQlicmVhazsKPiArCX0KPiAgIAlkZWZhdWx0Ogo+ICAgCQlyZXR1cm4gLUVJTlZBTDsKPiAg IAl9Cj4gQEAgLTIxMzIsNiArMjE1NiwxMCBAQCBpbnQgcWVkX2N4dF9nZXRfdGlkX21lbV9pbmZv KHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLAo+ICAgCQlwcm90byA9IFBST1RPQ09MSURfSVNDU0k7 Cj4gICAJCXNlZyA9IFFFRF9DWFRfSVNDU0lfVElEX1NFRzsKPiAgIAkJYnJlYWs7Cj4gKwljYXNl IFFFRF9QQ0lfTlZNRVRDUDoKPiArCQlwcm90byA9IFBST1RPQ09MSURfTlZNRVRDUDsKPiArCQlz ZWcgPSBRRURfQ1RYX05WTUVUQ1BfVElEX1NFRzsKPiArCQlicmVhazsKPiAgIAlkZWZhdWx0Ogo+ ICAgCQlyZXR1cm4gLUVJTlZBTDsKPiAgIAl9Cj4gQEAgLTI0NTgsNiArMjQ4NiwxMCBAQCBpbnQg cWVkX2N4dF9nZXRfdGFza19jdHgoc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sCj4gICAJCXByb3Rv ID0gUFJPVE9DT0xJRF9JU0NTSTsKPiAgIAkJc2VnID0gUUVEX0NYVF9JU0NTSV9USURfU0VHOwo+ ICAgCQlicmVhazsKPiArCWNhc2UgUUVEX1BDSV9OVk1FVENQOgo+ICsJCXByb3RvID0gUFJPVE9D T0xJRF9OVk1FVENQOwo+ICsJCXNlZyA9IFFFRF9DVFhfTlZNRVRDUF9USURfU0VHOwo+ICsJCWJy ZWFrOwo+ICAgCWRlZmF1bHQ6Cj4gICAJCXJldHVybiAtRUlOVkFMOwo+ICAgCX0KPiBkaWZmIC0t Z2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvcWxvZ2ljL3FlZC9xZWRfY3h0LmggYi9kcml2ZXJz L25ldC9ldGhlcm5ldC9xbG9naWMvcWVkL3FlZF9jeHQuaAo+IGluZGV4IDA1NmU3OTYyMGEwZS4u OGYxYTc3Y2IzM2Y2IDEwMDY0NAo+IC0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3Fsb2dpYy9x ZWQvcWVkX2N4dC5oCj4gKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvcWxvZ2ljL3FlZC9xZWRf Y3h0LmgKPiBAQCAtNTEsNiArNTEsNyBAQCBpbnQgcWVkX2N4dF9nZXRfdGlkX21lbV9pbmZvKHN0 cnVjdCBxZWRfaHdmbiAqcF9od2ZuLAo+ICAgCQkJICAgICBzdHJ1Y3QgcWVkX3RpZF9tZW0gKnBf aW5mbyk7Cj4gICAKPiAgICNkZWZpbmUgUUVEX0NYVF9JU0NTSV9USURfU0VHCVBST1RPQ09MSURf SVNDU0kKPiArI2RlZmluZSBRRURfQ1RYX05WTUVUQ1BfVElEX1NFRyBQUk9UT0NPTElEX05WTUVU Q1AKPiAgICNkZWZpbmUgUUVEX0NYVF9ST0NFX1RJRF9TRUcJUFJPVE9DT0xJRF9ST0NFCj4gICAj ZGVmaW5lIFFFRF9DWFRfRkNPRV9USURfU0VHCVBST1RPQ09MSURfRkNPRQo+ICAgZW51bSBxZWRf Y3h0X2VsZW1fdHlwZSB7Cj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3Fsb2dp Yy9xZWQvcWVkX2Rldi5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvcWxvZ2ljL3FlZC9xZWRfZGV2 LmMKPiBpbmRleCBkMmY1ODU1YjJlYTcuLmQzZjhjYzQyZDA3ZSAxMDA2NDQKPiAtLS0gYS9kcml2 ZXJzL25ldC9ldGhlcm5ldC9xbG9naWMvcWVkL3FlZF9kZXYuYwo+ICsrKyBiL2RyaXZlcnMvbmV0 L2V0aGVybmV0L3Fsb2dpYy9xZWQvcWVkX2Rldi5jCj4gQEAgLTM3LDYgKzM3LDcgQEAKPiAgICNp bmNsdWRlICJxZWRfc3Jpb3YuaCIKPiAgICNpbmNsdWRlICJxZWRfdmYuaCIKPiAgICNpbmNsdWRl ICJxZWRfcmRtYS5oIgo+ICsjaW5jbHVkZSAicWVkX252bWV0Y3AuaCIKPiAgIAo+ICAgc3RhdGlj IERFRklORV9TUElOTE9DSyhxbV9sb2NrKTsKPiAgIAo+IEBAIC02NjcsNyArNjY4LDggQEAgcWVk X2xsaF9zZXRfZW5naW5lX2FmZmluKHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLCBzdHJ1Y3QgcWVk X3B0dCAqcF9wdHQpCj4gICAJfQo+ICAgCj4gICAJLyogU3RvcmFnZSBQRiBpcyBib3VuZCB0byBh IHNpbmdsZSBlbmdpbmUgd2hpbGUgTDIgUEYgdXNlcyBib3RoICovCj4gLQlpZiAoUUVEX0lTX0ZD T0VfUEVSU09OQUxJVFkocF9od2ZuKSB8fCBRRURfSVNfSVNDU0lfUEVSU09OQUxJVFkocF9od2Zu KSkKPiArCWlmIChRRURfSVNfRkNPRV9QRVJTT05BTElUWShwX2h3Zm4pIHx8IFFFRF9JU19JU0NT SV9QRVJTT05BTElUWShwX2h3Zm4pIHx8Cj4gKwkgICAgUUVEX0lTX05WTUVUQ1BfUEVSU09OQUxJ VFkocF9od2ZuKSkKPiAgIAkJZW5nID0gY2Rldi0+ZmlyX2FmZmluID8gUUVEX0VORzEgOiBRRURf RU5HMDsKPiAgIAllbHNlCQkJLyogTDJfUEVSU09OQUxJVFkgKi8KPiAgIAkJZW5nID0gUUVEX0JP VEhfRU5HOwo+IEBAIC0xMTY0LDYgKzExNjYsOSBAQCB2b2lkIHFlZF9sbGhfcmVtb3ZlX21hY19m aWx0ZXIoc3RydWN0IHFlZF9kZXYgKmNkZXYsCj4gICAJaWYgKCF0ZXN0X2JpdChRRURfTUZfTExI X01BQ19DTFNTLCAmY2Rldi0+bWZfYml0cykpCj4gICAJCWdvdG8gb3V0Owo+ICAgCj4gKwlpZiAo UUVEX0lTX05WTUVUQ1BfUEVSU09OQUxJVFkocF9od2ZuKSkKPiArCQlyZXR1cm47Cj4gKwo+ICAg CWV0aGVyX2FkZHJfY29weShmaWx0ZXIubWFjLmFkZHIsIG1hY19hZGRyKTsKPiAgIAlyYyA9IHFl ZF9sbGhfc2hhZG93X3JlbW92ZV9maWx0ZXIoY2RldiwgcHBmaWQsICZmaWx0ZXIsICZmaWx0ZXJf aWR4LAo+ICAgCQkJCQkgICZyZWZfY250KTsKPiBAQCAtMTM4MSw2ICsxMzg2LDExIEBAIHZvaWQg cWVkX3Jlc2NfZnJlZShzdHJ1Y3QgcWVkX2RldiAqY2RldikKPiAgIAkJCXFlZF9vb29fZnJlZShw X2h3Zm4pOwo+ICAgCQl9Cj4gICAKPiArCQlpZiAocF9od2ZuLT5od19pbmZvLnBlcnNvbmFsaXR5 ID09IFFFRF9QQ0lfTlZNRVRDUCkgewo+ICsJCQlxZWRfbnZtZXRjcF9mcmVlKHBfaHdmbik7Cj4g KwkJCXFlZF9vb29fZnJlZShwX2h3Zm4pOwo+ICsJCX0KPiArCj4gICAJCWlmIChRRURfSVNfUkRN QV9QRVJTT05BTElUWShwX2h3Zm4pICYmIHJkbWFfaW5mbykgewo+ICAgCQkJcWVkX3NwcV91bnJl Z2lzdGVyX2FzeW5jX2NiKHBfaHdmbiwgcmRtYV9pbmZvLT5wcm90byk7Cj4gICAJCQlxZWRfcmRt YV9pbmZvX2ZyZWUocF9od2ZuKTsKPiBAQCAtMTQyMyw2ICsxNDMzLDcgQEAgc3RhdGljIHUzMiBx ZWRfZ2V0X3BxX2ZsYWdzKHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuKQo+ICAgCQlmbGFncyB8PSBQ UV9GTEFHU19PRkxEOwo+ICAgCQlicmVhazsKPiAgIAljYXNlIFFFRF9QQ0lfSVNDU0k6Cj4gKwlj YXNlIFFFRF9QQ0lfTlZNRVRDUDoKPiAgIAkJZmxhZ3MgfD0gUFFfRkxBR1NfQUNLIHwgUFFfRkxB R1NfT09PIHwgUFFfRkxBR1NfT0ZMRDsKPiAgIAkJYnJlYWs7Cj4gICAJY2FzZSBRRURfUENJX0VU SF9ST0NFOgo+IEBAIC0yMjY5LDYgKzIyODAsMTIgQEAgaW50IHFlZF9yZXNjX2FsbG9jKHN0cnVj dCBxZWRfZGV2ICpjZGV2KQo+ICAgCQkJCQkJCVBST1RPQ09MSURfSVNDU0ksCj4gICAJCQkJCQkJ TlVMTCk7Cj4gICAJCQluX2VxZXMgKz0gMiAqIG51bV9jb25zOwo+ICsJCX0gZWxzZSBpZiAocF9o d2ZuLT5od19pbmZvLnBlcnNvbmFsaXR5ID09IFFFRF9QQ0lfTlZNRVRDUCkgewo+ICsJCQludW1f Y29ucyA9Cj4gKwkJCSAgICBxZWRfY3h0X2dldF9wcm90b19jaWRfY291bnQocF9od2ZuLAo+ICsJ CQkJCQkJUFJPVE9DT0xJRF9OVk1FVENQLAo+ICsJCQkJCQkJTlVMTCk7Cj4gKwkJCW5fZXFlcyAr PSAyICogbnVtX2NvbnM7Cj4gICAJCX0KPiAgIAo+ICAgCQlpZiAobl9lcWVzID4gMHhGRkZGKSB7 Cj4gQEAgLTIzMTMsNiArMjMzMCwxNSBAQCBpbnQgcWVkX3Jlc2NfYWxsb2Moc3RydWN0IHFlZF9k ZXYgKmNkZXYpCj4gICAJCQkJZ290byBhbGxvY19lcnI7Cj4gICAJCX0KPiAgIAo+ICsJCWlmIChw X2h3Zm4tPmh3X2luZm8ucGVyc29uYWxpdHkgPT0gUUVEX1BDSV9OVk1FVENQKSB7Cj4gKwkJCXJj ID0gcWVkX252bWV0Y3BfYWxsb2MocF9od2ZuKTsKPiArCQkJaWYgKHJjKQo+ICsJCQkJZ290byBh bGxvY19lcnI7Cj4gKwkJCXJjID0gcWVkX29vb19hbGxvYyhwX2h3Zm4pOwo+ICsJCQlpZiAocmMp Cj4gKwkJCQlnb3RvIGFsbG9jX2VycjsKPiArCQl9Cj4gKwo+ICAgCQlpZiAoUUVEX0lTX1JETUFf UEVSU09OQUxJVFkocF9od2ZuKSkgewo+ICAgCQkJcmMgPSBxZWRfcmRtYV9pbmZvX2FsbG9jKHBf aHdmbik7Cj4gICAJCQlpZiAocmMpCj4gQEAgLTIzOTMsNiArMjQxOSwxMSBAQCB2b2lkIHFlZF9y ZXNjX3NldHVwKHN0cnVjdCBxZWRfZGV2ICpjZGV2KQo+ICAgCQkJcWVkX2lzY3NpX3NldHVwKHBf aHdmbik7Cj4gICAJCQlxZWRfb29vX3NldHVwKHBfaHdmbik7Cj4gICAJCX0KPiArCj4gKwkJaWYg KHBfaHdmbi0+aHdfaW5mby5wZXJzb25hbGl0eSA9PSBRRURfUENJX05WTUVUQ1ApIHsKPiArCQkJ cWVkX252bWV0Y3Bfc2V0dXAocF9od2ZuKTsKPiArCQkJcWVkX29vb19zZXR1cChwX2h3Zm4pOwo+ ICsJCX0KPiAgIAl9Cj4gICB9Cj4gICAKPiBAQCAtMjg1NCw3ICsyODg1LDggQEAgc3RhdGljIGlu dCBxZWRfaHdfaW5pdF9wZihzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwKPiAgIAo+ICAgCS8qIFBy b3RvY29sIENvbmZpZ3VyYXRpb24gKi8KPiAgIAlTVE9SRV9SVF9SRUcocF9od2ZuLCBQUlNfUkVH X1NFQVJDSF9UQ1BfUlRfT0ZGU0VULAo+IC0JCSAgICAgKHBfaHdmbi0+aHdfaW5mby5wZXJzb25h bGl0eSA9PSBRRURfUENJX0lTQ1NJKSA/IDEgOiAwKTsKPiArCQkgICAgICgocF9od2ZuLT5od19p bmZvLnBlcnNvbmFsaXR5ID09IFFFRF9QQ0lfSVNDU0kpIHx8Cj4gKwkJCSAocF9od2ZuLT5od19p bmZvLnBlcnNvbmFsaXR5ID09IFFFRF9QQ0lfTlZNRVRDUCkpID8gMSA6IDApOwo+ICAgCVNUT1JF X1JUX1JFRyhwX2h3Zm4sIFBSU19SRUdfU0VBUkNIX0ZDT0VfUlRfT0ZGU0VULAo+ICAgCQkgICAg IChwX2h3Zm4tPmh3X2luZm8ucGVyc29uYWxpdHkgPT0gUUVEX1BDSV9GQ09FKSA/IDEgOiAwKTsK PiAgIAlTVE9SRV9SVF9SRUcocF9od2ZuLCBQUlNfUkVHX1NFQVJDSF9ST0NFX1JUX09GRlNFVCwg MCk7Cj4gQEAgLTM1MzEsNyArMzU2Myw3IEBAIHN0YXRpYyB2b2lkIHFlZF9od19zZXRfZmVhdChz dHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbikKPiAgIAkJCQkJICAgICAgIFJFU0NfTlVNKHBfaHdmbiwK PiAgIAkJCQkJCQlRRURfQ01EUVNfQ1FTKSk7Cj4gICAKPiAtCWlmIChRRURfSVNfSVNDU0lfUEVS U09OQUxJVFkocF9od2ZuKSkKPiArCWlmIChRRURfSVNfSVNDU0lfUEVSU09OQUxJVFkocF9od2Zu KSB8fCBRRURfSVNfTlZNRVRDUF9QRVJTT05BTElUWShwX2h3Zm4pKQo+ICAgCQlmZWF0X251bVtR RURfSVNDU0lfQ1FdID0gbWluX3QodTMyLCBzYl9jbnQuY250LAo+ICAgCQkJCQkgICAgICAgUkVT Q19OVU0ocF9od2ZuLAo+ICAgCQkJCQkJCVFFRF9DTURRU19DUVMpKTsKPiBAQCAtMzczNCw3ICsz NzY2LDggQEAgaW50IHFlZF9od19nZXRfZGZsdF9yZXNjKHN0cnVjdCBxZWRfaHdmbiAqcF9od2Zu LAo+ICAgCQlicmVhazsKPiAgIAljYXNlIFFFRF9CRFE6Cj4gICAJCWlmIChwX2h3Zm4tPmh3X2lu Zm8ucGVyc29uYWxpdHkgIT0gUUVEX1BDSV9JU0NTSSAmJgo+IC0JCSAgICBwX2h3Zm4tPmh3X2lu Zm8ucGVyc29uYWxpdHkgIT0gUUVEX1BDSV9GQ09FKQo+ICsJCSAgICBwX2h3Zm4tPmh3X2luZm8u cGVyc29uYWxpdHkgIT0gUUVEX1BDSV9GQ09FICYmCj4gKwkJCXBfaHdmbi0+aHdfaW5mby5wZXJz b25hbGl0eSAhPSBRRURfUENJX05WTUVUQ1ApCj4gICAJCQkqcF9yZXNjX251bSA9IDA7Cj4gICAJ CWVsc2UKPiAgIAkJCSpwX3Jlc2NfbnVtID0gMTsKPiBAQCAtMzc1NSw3ICszNzg4LDggQEAgaW50 IHFlZF9od19nZXRfZGZsdF9yZXNjKHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLAo+ICAgCQkJKnBf cmVzY19zdGFydCA9IDA7Cj4gICAJCWVsc2UgaWYgKHBfaHdmbi0+Y2Rldi0+bnVtX3BvcnRzX2lu X2VuZ2luZSA9PSA0KQo+ICAgCQkJKnBfcmVzY19zdGFydCA9IHBfaHdmbi0+cG9ydF9pZDsKPiAt CQllbHNlIGlmIChwX2h3Zm4tPmh3X2luZm8ucGVyc29uYWxpdHkgPT0gUUVEX1BDSV9JU0NTSSkK PiArCQllbHNlIGlmIChwX2h3Zm4tPmh3X2luZm8ucGVyc29uYWxpdHkgPT0gUUVEX1BDSV9JU0NT SSB8fAo+ICsJCQkgcF9od2ZuLT5od19pbmZvLnBlcnNvbmFsaXR5ID09IFFFRF9QQ0lfTlZNRVRD UCkKPiAgIAkJCSpwX3Jlc2Nfc3RhcnQgPSBwX2h3Zm4tPnBvcnRfaWQ7Cj4gICAJCWVsc2UgaWYg KHBfaHdmbi0+aHdfaW5mby5wZXJzb25hbGl0eSA9PSBRRURfUENJX0ZDT0UpCj4gICAJCQkqcF9y ZXNjX3N0YXJ0ID0gcF9od2ZuLT5wb3J0X2lkICsgMjsKPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9u ZXQvZXRoZXJuZXQvcWxvZ2ljL3FlZC9xZWRfaHNpLmggYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9x bG9naWMvcWVkL3FlZF9oc2kuaAo+IGluZGV4IDI0NDcyZjZhODNjMi4uOWM5ZWM4ZjUzZWY4IDEw MDY0NAo+IC0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3Fsb2dpYy9xZWQvcWVkX2hzaS5oCj4g KysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvcWxvZ2ljL3FlZC9xZWRfaHNpLmgKPiBAQCAtMTIx NDgsNyArMTIxNDgsOCBAQCBzdHJ1Y3QgcHVibGljX2Z1bmMgewo+ICAgI2RlZmluZSBGVU5DX01G X0NGR19QUk9UT0NPTF9JU0NTSSAgICAgICAgICAgICAgMHgwMDAwMDAxMAo+ICAgI2RlZmluZSBG VU5DX01GX0NGR19QUk9UT0NPTF9GQ09FICAgICAgICAgICAgICAgMHgwMDAwMDAyMAo+ICAgI2Rl ZmluZSBGVU5DX01GX0NGR19QUk9UT0NPTF9ST0NFICAgICAgICAgICAgICAgMHgwMDAwMDAzMAo+ IC0jZGVmaW5lIEZVTkNfTUZfQ0ZHX1BST1RPQ09MX01BWAkweDAwMDAwMDMwCj4gKyNkZWZpbmUg RlVOQ19NRl9DRkdfUFJPVE9DT0xfTlZNRVRDUCAgICAweDAwMDAwMDQwCj4gKyNkZWZpbmUgRlVO Q19NRl9DRkdfUFJPVE9DT0xfTUFYCTB4MDAwMDAwNDAKPiAgIAo+ICAgI2RlZmluZSBGVU5DX01G X0NGR19NSU5fQldfTUFTSwkJMHgwMDAwZmYwMAo+ICAgI2RlZmluZSBGVU5DX01GX0NGR19NSU5f QldfU0hJRlQJOAo+IGRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9xbG9naWMvcWVk L3FlZF9sbDIuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3Fsb2dpYy9xZWQvcWVkX2xsMi5jCj4g aW5kZXggNDk3ODNmMzY1MDc5Li44OGJmY2RjZDRhNGMgMTAwNjQ0Cj4gLS0tIGEvZHJpdmVycy9u ZXQvZXRoZXJuZXQvcWxvZ2ljL3FlZC9xZWRfbGwyLmMKPiArKysgYi9kcml2ZXJzL25ldC9ldGhl cm5ldC9xbG9naWMvcWVkL3FlZF9sbDIuYwo+IEBAIC05NjAsNyArOTYwLDggQEAgc3RhdGljIGlu dCBxZWRfc3BfbGwyX3J4X3F1ZXVlX3N0YXJ0KHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLAo+ICAg Cj4gICAJaWYgKHRlc3RfYml0KFFFRF9NRl9MTDJfTk9OX1VOSUNBU1QsICZwX2h3Zm4tPmNkZXYt Pm1mX2JpdHMpICYmCj4gICAJICAgIHBfcmFtcm9kLT5tYWluX2Z1bmNfcXVldWUgJiYgY29ubl90 eXBlICE9IFFFRF9MTDJfVFlQRV9ST0NFICYmCj4gLQkgICAgY29ubl90eXBlICE9IFFFRF9MTDJf VFlQRV9JV0FSUCkgewo+ICsJICAgIGNvbm5fdHlwZSAhPSBRRURfTEwyX1RZUEVfSVdBUlAgJiYK PiArCQkoIVFFRF9JU19OVk1FVENQX1BFUlNPTkFMSVRZKHBfaHdmbikpKSB7Cj4gICAJCXBfcmFt cm9kLT5tZl9zaV9iY2FzdF9hY2NlcHRfYWxsID0gMTsKPiAgIAkJcF9yYW1yb2QtPm1mX3NpX21j YXN0X2FjY2VwdF9hbGwgPSAxOwo+ICAgCX0gZWxzZSB7Cj4gQEAgLTEwNDksNiArMTA1MCw4IEBA IHN0YXRpYyBpbnQgcWVkX3NwX2xsMl90eF9xdWV1ZV9zdGFydChzdHJ1Y3QgcWVkX2h3Zm4gKnBf aHdmbiwKPiAgIAljYXNlIFFFRF9MTDJfVFlQRV9PT086Cj4gICAJCWlmIChwX2h3Zm4tPmh3X2lu Zm8ucGVyc29uYWxpdHkgPT0gUUVEX1BDSV9JU0NTSSkKPiAgIAkJCXBfcmFtcm9kLT5jb25uX3R5 cGUgPSBQUk9UT0NPTElEX0lTQ1NJOwo+ICsJCWVsc2UgaWYgKHBfaHdmbi0+aHdfaW5mby5wZXJz b25hbGl0eSA9PSBRRURfUENJX05WTUVUQ1ApCj4gKwkJCXBfcmFtcm9kLT5jb25uX3R5cGUgPSBQ Uk9UT0NPTElEX05WTUVUQ1A7Cj4gICAJCWVsc2UKPiAgIAkJCXBfcmFtcm9kLT5jb25uX3R5cGUg PSBQUk9UT0NPTElEX0lXQVJQOwo+ICAgCQlicmVhazsKPiBAQCAtMTYzNCw3ICsxNjM3LDggQEAg aW50IHFlZF9sbDJfZXN0YWJsaXNoX2Nvbm5lY3Rpb24odm9pZCAqY3h0LCB1OCBjb25uZWN0aW9u X2hhbmRsZSkKPiAgIAlpZiAocmMpCj4gICAJCWdvdG8gb3V0Owo+ICAgCj4gLQlpZiAoIVFFRF9J U19SRE1BX1BFUlNPTkFMSVRZKHBfaHdmbikpCj4gKwlpZiAoIVFFRF9JU19SRE1BX1BFUlNPTkFM SVRZKHBfaHdmbikgJiYKPiArCSAgICAhUUVEX0lTX05WTUVUQ1BfUEVSU09OQUxJVFkocF9od2Zu KSkKPiAgIAkJcWVkX3dyKHBfaHdmbiwgcF9wdHQsIFBSU19SRUdfVVNFX0xJR0hUX0wyLCAxKTsK PiAgIAo+ICAgCXFlZF9sbDJfZXN0YWJsaXNoX2Nvbm5lY3Rpb25fb29vKHBfaHdmbiwgcF9sbDJf Y29ubik7Cj4gQEAgLTIzNzYsNyArMjM4MCw4IEBAIHN0YXRpYyBpbnQgcWVkX2xsMl9zdGFydF9v b28oc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sCj4gICBzdGF0aWMgYm9vbCBxZWRfbGwyX2lzX3N0 b3JhZ2VfZW5nMShzdHJ1Y3QgcWVkX2RldiAqY2RldikKPiAgIHsKPiAgIAlyZXR1cm4gKFFFRF9J U19GQ09FX1BFUlNPTkFMSVRZKFFFRF9MRUFESU5HX0hXRk4oY2RldikpIHx8Cj4gLQkJUUVEX0lT X0lTQ1NJX1BFUlNPTkFMSVRZKFFFRF9MRUFESU5HX0hXRk4oY2RldikpKSAmJgo+ICsJCVFFRF9J U19JU0NTSV9QRVJTT05BTElUWShRRURfTEVBRElOR19IV0ZOKGNkZXYpKSB8fAo+ICsJCVFFRF9J U19OVk1FVENQX1BFUlNPTkFMSVRZKFFFRF9MRUFESU5HX0hXRk4oY2RldikpKSAmJgo+ICAgCQko UUVEX0FGRklOX0hXRk4oY2RldikgIT0gUUVEX0xFQURJTkdfSFdGTihjZGV2KSk7Cj4gICB9Cj4g ICAKPiBAQCAtMjQwMiwxMSArMjQwNywxMyBAQCBzdGF0aWMgaW50IHFlZF9sbDJfc3RvcChzdHJ1 Y3QgcWVkX2RldiAqY2RldikKPiAgIAo+ICAgCWlmIChjZGV2LT5sbDItPmhhbmRsZSA9PSBRRURf TEwyX1VOVVNFRF9IQU5ETEUpCj4gICAJCXJldHVybiAwOwo+ICsJaWYgKCFRRURfSVNfTlZNRVRD UF9QRVJTT05BTElUWShwX2h3Zm4pKQo+ICsJCXFlZF9sbGhfcmVtb3ZlX21hY19maWx0ZXIoY2Rl diwgMCwgY2Rldi0+bGwyX21hY19hZGRyZXNzKTsKPiAgIAo+ICAgCXFlZF9sbGhfcmVtb3ZlX21h Y19maWx0ZXIoY2RldiwgMCwgY2Rldi0+bGwyX21hY19hZGRyZXNzKTsKPiAgIAlldGhfemVyb19h ZGRyKGNkZXYtPmxsMl9tYWNfYWRkcmVzcyk7Cj4gICAKPiAtCWlmIChRRURfSVNfSVNDU0lfUEVS U09OQUxJVFkocF9od2ZuKSkKPiArCWlmIChRRURfSVNfSVNDU0lfUEVSU09OQUxJVFkocF9od2Zu KSB8fCBRRURfSVNfTlZNRVRDUF9QRVJTT05BTElUWShwX2h3Zm4pKQo+ICAgCQlxZWRfbGwyX3N0 b3Bfb29vKHBfaHdmbik7Cj4gICAKPiAgIAkvKiBJbiBDTVQgbW9kZSwgTEwyIGlzIGFsd2F5cyBz dGFydGVkIG9uIGVuZ2luZSAwIGZvciBhIHN0b3JhZ2UgUEYgKi8KPiBAQCAtMjQ0Miw2ICsyNDQ5 LDcgQEAgc3RhdGljIGludCBfX3FlZF9sbDJfc3RhcnQoc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4s Cj4gICAJCWNvbm5fdHlwZSA9IFFFRF9MTDJfVFlQRV9GQ09FOwo+ICAgCQlicmVhazsKPiAgIAlj YXNlIFFFRF9QQ0lfSVNDU0k6Cj4gKwljYXNlIFFFRF9QQ0lfTlZNRVRDUDoKPiAgIAkJY29ubl90 eXBlID0gUUVEX0xMMl9UWVBFX0lTQ1NJOwo+ICAgCQlicmVhazsKPiAgIAljYXNlIFFFRF9QQ0lf RVRIX1JPQ0U6Cj4gQEAgLTI1NjcsNyArMjU3NSw3IEBAIHN0YXRpYyBpbnQgcWVkX2xsMl9zdGFy dChzdHJ1Y3QgcWVkX2RldiAqY2Rldiwgc3RydWN0IHFlZF9sbDJfcGFyYW1zICpwYXJhbXMpCj4g ICAJCX0KPiAgIAl9Cj4gICAKPiAtCWlmIChRRURfSVNfSVNDU0lfUEVSU09OQUxJVFkocF9od2Zu KSkgewo+ICsJaWYgKFFFRF9JU19JU0NTSV9QRVJTT05BTElUWShwX2h3Zm4pIHx8IFFFRF9JU19O Vk1FVENQX1BFUlNPTkFMSVRZKHBfaHdmbikpIHsKPiAgIAkJRFBfVkVSQk9TRShjZGV2LCBRRURf TVNHX1NUT1JBR0UsICJTdGFydGluZyBPT08gTEwyIHF1ZXVlXG4iKTsKPiAgIAkJcmMgPSBxZWRf bGwyX3N0YXJ0X29vbyhwX2h3Zm4sIHBhcmFtcyk7Cj4gICAJCWlmIChyYykgewo+IEBAIC0yNTc2 LDEwICsyNTg0LDEzIEBAIHN0YXRpYyBpbnQgcWVkX2xsMl9zdGFydChzdHJ1Y3QgcWVkX2RldiAq Y2Rldiwgc3RydWN0IHFlZF9sbDJfcGFyYW1zICpwYXJhbXMpCj4gICAJCX0KPiAgIAl9Cj4gICAK PiAtCXJjID0gcWVkX2xsaF9hZGRfbWFjX2ZpbHRlcihjZGV2LCAwLCBwYXJhbXMtPmxsMl9tYWNf YWRkcmVzcyk7Cj4gLQlpZiAocmMpIHsKPiAtCQlEUF9OT1RJQ0UoY2RldiwgIkZhaWxlZCB0byBh ZGQgYW4gTExIIGZpbHRlclxuIik7Cj4gLQkJZ290byBlcnIzOwo+ICsJaWYgKCFRRURfSVNfTlZN RVRDUF9QRVJTT05BTElUWShwX2h3Zm4pKSB7Cj4gKwkJcmMgPSBxZWRfbGxoX2FkZF9tYWNfZmls dGVyKGNkZXYsIDAsIHBhcmFtcy0+bGwyX21hY19hZGRyZXNzKTsKPiArCQlpZiAocmMpIHsKPiAr CQkJRFBfTk9USUNFKGNkZXYsICJGYWlsZWQgdG8gYWRkIGFuIExMSCBmaWx0ZXJcbiIpOwo+ICsJ CQlnb3RvIGVycjM7Cj4gKwkJfQo+ICsKPiAgIAl9Cj4gICAKPiAgIAlldGhlcl9hZGRyX2NvcHko Y2Rldi0+bGwyX21hY19hZGRyZXNzLCBwYXJhbXMtPmxsMl9tYWNfYWRkcmVzcyk7Cj4gQEAgLTI1 ODcsNyArMjU5OCw3IEBAIHN0YXRpYyBpbnQgcWVkX2xsMl9zdGFydChzdHJ1Y3QgcWVkX2RldiAq Y2Rldiwgc3RydWN0IHFlZF9sbDJfcGFyYW1zICpwYXJhbXMpCj4gICAJcmV0dXJuIDA7Cj4gICAK PiAgIGVycjM6Cj4gLQlpZiAoUUVEX0lTX0lTQ1NJX1BFUlNPTkFMSVRZKHBfaHdmbikpCj4gKwlp ZiAoUUVEX0lTX0lTQ1NJX1BFUlNPTkFMSVRZKHBfaHdmbikgfHwgUUVEX0lTX05WTUVUQ1BfUEVS U09OQUxJVFkocF9od2ZuKSkKPiAgIAkJcWVkX2xsMl9zdG9wX29vbyhwX2h3Zm4pOwo+ICAgZXJy MjoKPiAgIAlpZiAoYl9pc19zdG9yYWdlX2VuZzEpCj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0 L2V0aGVybmV0L3Fsb2dpYy9xZWQvcWVkX21jcC5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvcWxv Z2ljL3FlZC9xZWRfbWNwLmMKPiBpbmRleCBjZDg4MmM0NTMzOTQuLjQzODcyOTJjMzdlMiAxMDA2 NDQKPiAtLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9xbG9naWMvcWVkL3FlZF9tY3AuYwo+ICsr KyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3Fsb2dpYy9xZWQvcWVkX21jcC5jCj4gQEAgLTI0NDYs NiArMjQ0Niw5IEBAIHFlZF9tY3BfZ2V0X3NobWVtX3Byb3RvKHN0cnVjdCBxZWRfaHdmbiAqcF9o d2ZuLAo+ICAgCWNhc2UgRlVOQ19NRl9DRkdfUFJPVE9DT0xfSVNDU0k6Cj4gICAJCSpwX3Byb3Rv ID0gUUVEX1BDSV9JU0NTSTsKPiAgIAkJYnJlYWs7Cj4gKwljYXNlIEZVTkNfTUZfQ0ZHX1BST1RP Q09MX05WTUVUQ1A6Cj4gKwkJKnBfcHJvdG8gPSBRRURfUENJX05WTUVUQ1A7Cj4gKwkJYnJlYWs7 Cj4gICAJY2FzZSBGVU5DX01GX0NGR19QUk9UT0NPTF9GQ09FOgo+ICAgCQkqcF9wcm90byA9IFFF RF9QQ0lfRkNPRTsKPiAgIAkJYnJlYWs7Cj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVy bmV0L3Fsb2dpYy9xZWQvcWVkX21uZ190bHYuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3Fsb2dp Yy9xZWQvcWVkX21uZ190bHYuYwo+IGluZGV4IDNlMzE5MmEzYWQ5Yi4uNjE5MGFkZjk2NWJjIDEw MDY0NAo+IC0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3Fsb2dpYy9xZWQvcWVkX21uZ190bHYu Ywo+ICsrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3Fsb2dpYy9xZWQvcWVkX21uZ190bHYuYwo+ IEBAIC0xMzA2LDcgKzEzMDYsOCBAQCBpbnQgcWVkX21md19wcm9jZXNzX3Rsdl9yZXEoc3RydWN0 IHFlZF9od2ZuICpwX2h3Zm4sIHN0cnVjdCBxZWRfcHR0ICpwX3B0dCkKPiAgIAl9Cj4gICAKPiAg IAlpZiAoKHRsdl9ncm91cCAmIFFFRF9NRldfVExWX0lTQ1NJKSAmJgo+IC0JICAgIHBfaHdmbi0+ aHdfaW5mby5wZXJzb25hbGl0eSAhPSBRRURfUENJX0lTQ1NJKSB7Cj4gKwkgICAgcF9od2ZuLT5o d19pbmZvLnBlcnNvbmFsaXR5ICE9IFFFRF9QQ0lfSVNDU0kgJiYKPiArCQlwX2h3Zm4tPmh3X2lu Zm8ucGVyc29uYWxpdHkgIT0gUUVEX1BDSV9OVk1FVENQKSB7Cj4gICAJCURQX1ZFUkJPU0UocF9o d2ZuLCBRRURfTVNHX1NQLAo+ICAgCQkJICAgIlNraXBwaW5nIGlTQ1NJIFRMVnMgZm9yIG5vbi1p U0NTSSBmdW5jdGlvblxuIik7Cj4gICAJCXRsdl9ncm91cCAmPSB+UUVEX01GV19UTFZfSVNDU0k7 Cj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3Fsb2dpYy9xZWQvcWVkX29vby5j IGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvcWxvZ2ljL3FlZC9xZWRfb29vLmMKPiBpbmRleCA4ODM1 M2FhNDA0ZGMuLmQzN2JiMjQ2M2Y5OCAxMDA2NDQKPiAtLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5l dC9xbG9naWMvcWVkL3FlZF9vb28uYwo+ICsrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3Fsb2dp Yy9xZWQvcWVkX29vby5jCj4gQEAgLTE2LDcgKzE2LDcgQEAKPiAgICNpbmNsdWRlICJxZWRfbGwy LmgiCj4gICAjaW5jbHVkZSAicWVkX29vby5oIgo+ICAgI2luY2x1ZGUgInFlZF9jeHQuaCIKPiAt Cj4gKyNpbmNsdWRlICJxZWRfbnZtZXRjcC5oIgo+ICAgc3RhdGljIHN0cnVjdCBxZWRfb29vX2Fy Y2hpcGVsYWdvCj4gICAqcWVkX29vb19zZWVrX2FyY2hpcGVsYWdvKHN0cnVjdCBxZWRfaHdmbiAq cF9od2ZuLAo+ICAgCQkJICBzdHJ1Y3QgcWVkX29vb19pbmZvCj4gQEAgLTg1LDYgKzg1LDkgQEAg aW50IHFlZF9vb29fYWxsb2Moc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4pCj4gICAJY2FzZSBRRURf UENJX0lTQ1NJOgo+ICAgCQlwcm90byA9IFBST1RPQ09MSURfSVNDU0k7Cj4gICAJCWJyZWFrOwo+ ICsJY2FzZSBRRURfUENJX05WTUVUQ1A6Cj4gKwkJcHJvdG8gPSBQUk9UT0NPTElEX05WTUVUQ1A7 Cj4gKwkJYnJlYWs7Cj4gICAJY2FzZSBRRURfUENJX0VUSF9SRE1BOgo+ICAgCWNhc2UgUUVEX1BD SV9FVEhfSVdBUlA6Cj4gICAJCXByb3RvID0gUFJPVE9DT0xJRF9JV0FSUDsKPiBkaWZmIC0tZ2l0 IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvcWxvZ2ljL3FlZC9xZWRfc3BfY29tbWFuZHMuYyBiL2Ry aXZlcnMvbmV0L2V0aGVybmV0L3Fsb2dpYy9xZWQvcWVkX3NwX2NvbW1hbmRzLmMKPiBpbmRleCBh YTcxYWRjZjMxZWUuLjYwYjM4NzYzODdhOSAxMDA2NDQKPiAtLS0gYS9kcml2ZXJzL25ldC9ldGhl cm5ldC9xbG9naWMvcWVkL3FlZF9zcF9jb21tYW5kcy5jCj4gKysrIGIvZHJpdmVycy9uZXQvZXRo ZXJuZXQvcWxvZ2ljL3FlZC9xZWRfc3BfY29tbWFuZHMuYwo+IEBAIC0zODUsNiArMzg1LDcgQEAg aW50IHFlZF9zcF9wZl9zdGFydChzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwKPiAgIAkJcF9yYW1y b2QtPnBlcnNvbmFsaXR5ID0gUEVSU09OQUxJVFlfRkNPRTsKPiAgIAkJYnJlYWs7Cj4gICAJY2Fz ZSBRRURfUENJX0lTQ1NJOgo+ICsJY2FzZSBRRURfUENJX05WTUVUQ1A6Cj4gICAJCXBfcmFtcm9k LT5wZXJzb25hbGl0eSA9IFBFUlNPTkFMSVRZX0lTQ1NJOwo+ICAgCQlicmVhazsKPiAgIAljYXNl IFFFRF9QQ0lfRVRIX1JPQ0U6Cj4gCkFzIGluZGljYXRlZCwgSSBkbyBmaW5kIHRoaXMgbWl4IG9m ICdudm1ldGNwIGlzIG5lYXJseSBpc2NzaScgYSBiaXQgCnN0cmFuZ2UuIEkgd291bGQgaGF2ZSBw cmVmZXJyZWQgdG8gaGF2ZSBkaXN0aW5jdCB0eXBlcyBmb3IgbnZtZXRjcC4KCkNoZWVycywKCkhh bm5lcwotLSAKRHIuIEhhbm5lcyBSZWluZWNrZSAgICAgICAgICAgICAgICBLZXJuZWwgU3RvcmFn ZSBBcmNoaXRlY3QKaGFyZUBzdXNlLmRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKzQ5 IDkxMSA3NDA1MyA2ODgKU1VTRSBTb2Z0d2FyZSBTb2x1dGlvbnMgR21iSCwgTWF4ZmVsZHN0ci4g NSwgOTA0MDkgTsO8cm5iZXJnCkhSQiAzNjgwOSAoQUcgTsO8cm5iZXJnKSwgR2VzY2jDpGZ0c2bD vGhyZXI6IEZlbGl4IEltZW5kw7ZyZmZlcgoKX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX18KTGludXgtbnZtZSBtYWlsaW5nIGxpc3QKTGludXgtbnZtZUBsaXN0 cy5pbmZyYWRlYWQub3JnCmh0dHA6Ly9saXN0cy5pbmZyYWRlYWQub3JnL21haWxtYW4vbGlzdGlu Zm8vbGludXgtbnZtZQo=