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=-10.1 required=3.0 tests=DKIMWL_WL_HIGH,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,INCLUDES_PATCH,MAILING_LIST_MULTI,SIGNED_OFF_BY, SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED,USER_AGENT_GIT 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 6749BC433E3 for ; Mon, 29 Jun 2020 19:06:56 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 4772520663 for ; Mon, 29 Jun 2020 19:06:56 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1593457616; bh=bU4UPg9ZXn991s7Tmq1JeQL2lH9esGDbJfRvDxOVQqE=; h=From:To:Cc:Subject:Date:In-Reply-To:References:List-ID:From; b=EG4b+Q6PQvx583LOajlK/476zBCmK5Y4xZKIP/nBfddqJQY+jwzwddSTw/JbLIRFo JBzHPUyHaL2Vi2dPiEP5+sUFhVg9DR9zrpRCeGkkvbohRm5iIu1m4EF+7tElUTMh2M h1aNlyXC9Ts6/gFc2KG/JGlLXFtNCzqmbh8aVhcw= Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1730545AbgF2TGz (ORCPT ); Mon, 29 Jun 2020 15:06:55 -0400 Received: from mail.kernel.org ([198.145.29.99]:49496 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1730498AbgF2TGt (ORCPT ); Mon, 29 Jun 2020 15:06:49 -0400 Received: from dhcp-10-100-145-180.wdl.wdc.com (unknown [199.255.45.60]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id 3D853206E2; Mon, 29 Jun 2020 19:06:47 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1593457608; bh=bU4UPg9ZXn991s7Tmq1JeQL2lH9esGDbJfRvDxOVQqE=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=l2MsGl5Ul+1VwW/wvXRcnEf8oI7FCtcCChdZ07+gbk+WzPpWn399ct6994TXyGH4m s1kNagTriDv53DBaD4WAtlQR2vOp7t74nHaegWflomNmUgOk6HYWwYrOloVaQ+3zeL nqm92E/kUdB49f/wd/EO9H9klakdPOoBbHArqvYY= From: Keith Busch To: linux-nvme@lists.infradead.org, hch@lst.de, sagi@grimberg.me, linux-block@vger.kernel.org Cc: axboe@kernel.dk, Niklas Cassel , =?UTF-8?q?Javier=20Gonz=C3=A1lez?= , "Martin K . Petersen" , Johannes Thumshirn , =?UTF-8?q?Matias=20Bj=C3=B8rling?= , Daniel Wagner Subject: [PATCHv4 3/5] nvme: implement I/O Command Sets Command Set support Date: Mon, 29 Jun 2020 12:06:39 -0700 Message-Id: <20200629190641.1986462-4-kbusch@kernel.org> X-Mailer: git-send-email 2.24.1 In-Reply-To: <20200629190641.1986462-1-kbusch@kernel.org> References: <20200629190641.1986462-1-kbusch@kernel.org> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Sender: linux-block-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-block@vger.kernel.org From: Niklas Cassel Implements support for the I/O Command Sets command set. The command set introduces a method to enumerate multiple command sets per namespace. If the command set is exposed, this method for enumeration will be used instead of the traditional method that uses the CC.CSS register command set register for command set identification. For namespaces where the Command Set Identifier is not supported or recognized, the specific namespace will not be created. Reviewed-by: Javier González Reviewed-by: Martin K. Petersen Reviewed-by: Johannes Thumshirn Reviewed-by: Matias Bjørling Reviewed-by: Daniel Wagner Signed-off-by: Niklas Cassel --- drivers/nvme/host/core.c | 53 ++++++++++++++++++++++++++++++++-------- drivers/nvme/host/nvme.h | 1 + include/linux/nvme.h | 19 ++++++++++++-- 3 files changed, 61 insertions(+), 12 deletions(-) diff --git a/drivers/nvme/host/core.c b/drivers/nvme/host/core.c index 701763910e48..b7d12eb42fd8 100644 --- a/drivers/nvme/host/core.c +++ b/drivers/nvme/host/core.c @@ -1056,8 +1056,13 @@ static int nvme_identify_ctrl(struct nvme_ctrl *dev, struct nvme_id_ctrl **id) return error; } +static bool nvme_multi_css(struct nvme_ctrl *ctrl) +{ + return (ctrl->ctrl_config & NVME_CC_CSS_MASK) == NVME_CC_CSS_CSI; +} + static int nvme_process_ns_desc(struct nvme_ctrl *ctrl, struct nvme_ns_ids *ids, - struct nvme_ns_id_desc *cur) + struct nvme_ns_id_desc *cur, bool *csi_seen) { const char *warn_str = "ctrl returned bogus length:"; void *data = cur; @@ -1087,6 +1092,15 @@ static int nvme_process_ns_desc(struct nvme_ctrl *ctrl, struct nvme_ns_ids *ids, } uuid_copy(&ids->uuid, data + sizeof(*cur)); return NVME_NIDT_UUID_LEN; + case NVME_NIDT_CSI: + if (cur->nidl != NVME_NIDT_CSI_LEN) { + dev_warn(ctrl->device, "%s %d for NVME_NIDT_CSI\n", + warn_str, cur->nidl); + return -1; + } + memcpy(&ids->csi, data + sizeof(*cur), NVME_NIDT_CSI_LEN); + *csi_seen = true; + return NVME_NIDT_CSI_LEN; default: /* Skip unknown types */ return cur->nidl; @@ -1097,10 +1111,9 @@ static int nvme_identify_ns_descs(struct nvme_ctrl *ctrl, unsigned nsid, struct nvme_ns_ids *ids) { struct nvme_command c = { }; - int status; + bool csi_seen = false; + int status, pos, len; void *data; - int pos; - int len; c.identify.opcode = nvme_admin_identify; c.identify.nsid = cpu_to_le32(nsid); @@ -1125,7 +1138,7 @@ static int nvme_identify_ns_descs(struct nvme_ctrl *ctrl, unsigned nsid, * device just because of a temporal retry-able error (such * as path of transport errors). */ - if (status > 0 && (status & NVME_SC_DNR)) + if (status > 0 && (status & NVME_SC_DNR) && !nvme_multi_css(ctrl)) status = 0; goto free_data; } @@ -1136,12 +1149,19 @@ static int nvme_identify_ns_descs(struct nvme_ctrl *ctrl, unsigned nsid, if (cur->nidl == 0) break; - len = nvme_process_ns_desc(ctrl, ids, cur); + len = nvme_process_ns_desc(ctrl, ids, cur, &csi_seen); if (len < 0) - goto free_data; + break; len += sizeof(*cur); } + + if (nvme_multi_css(ctrl) && !csi_seen) { + dev_warn(ctrl->device, "Command set not reported for nsid:%d\n", + nsid); + status = -EINVAL; + } + free_data: kfree(data); return status; @@ -1798,7 +1818,7 @@ static int nvme_report_ns_ids(struct nvme_ctrl *ctrl, unsigned int nsid, memcpy(ids->eui64, id->eui64, sizeof(id->eui64)); if (ctrl->vs >= NVME_VS(1, 2, 0)) memcpy(ids->nguid, id->nguid, sizeof(id->nguid)); - if (ctrl->vs >= NVME_VS(1, 3, 0)) + if (ctrl->vs >= NVME_VS(1, 3, 0) || nvme_multi_css(ctrl)) return nvme_identify_ns_descs(ctrl, nsid, ids); return 0; } @@ -1814,7 +1834,8 @@ static bool nvme_ns_ids_equal(struct nvme_ns_ids *a, struct nvme_ns_ids *b) { return uuid_equal(&a->uuid, &b->uuid) && memcmp(&a->nguid, &b->nguid, sizeof(a->nguid)) == 0 && - memcmp(&a->eui64, &b->eui64, sizeof(a->eui64)) == 0; + memcmp(&a->eui64, &b->eui64, sizeof(a->eui64)) == 0 && + a->csi == b->csi; } static int nvme_setup_streams_ns(struct nvme_ctrl *ctrl, struct nvme_ns *ns, @@ -1936,6 +1957,15 @@ static int __nvme_revalidate_disk(struct gendisk *disk, struct nvme_id_ns *id) if (ns->lba_shift == 0) ns->lba_shift = 9; + switch (ns->head->ids.csi) { + case NVME_CSI_NVM: + break; + default: + dev_warn(ctrl->device, "unknown csi:%d ns:%d\n", + ns->head->ids.csi, ns->head->ns_id); + return -ENODEV; + } + if ((ctrl->quirks & NVME_QUIRK_STRIPE_SIZE) && is_power_of_2(ctrl->max_hw_sectors)) iob = ctrl->max_hw_sectors; @@ -2269,7 +2299,10 @@ int nvme_enable_ctrl(struct nvme_ctrl *ctrl) ctrl->page_size = 1 << page_shift; - ctrl->ctrl_config = NVME_CC_CSS_NVM; + if (NVME_CAP_CSS(ctrl->cap) & NVME_CAP_CSS_CSI) + ctrl->ctrl_config = NVME_CC_CSS_CSI; + else + ctrl->ctrl_config = NVME_CC_CSS_NVM; ctrl->ctrl_config |= (page_shift - 12) << NVME_CC_MPS_SHIFT; ctrl->ctrl_config |= NVME_CC_AMS_RR | NVME_CC_SHN_NONE; ctrl->ctrl_config |= NVME_CC_IOSQES | NVME_CC_IOCQES; diff --git a/drivers/nvme/host/nvme.h b/drivers/nvme/host/nvme.h index 919ebaf3fdef..4aa321b16eaa 100644 --- a/drivers/nvme/host/nvme.h +++ b/drivers/nvme/host/nvme.h @@ -339,6 +339,7 @@ struct nvme_ns_ids { u8 eui64[8]; u8 nguid[16]; uuid_t uuid; + u8 csi; }; /* diff --git a/include/linux/nvme.h b/include/linux/nvme.h index 5ce51ab4c50e..81ffe5247505 100644 --- a/include/linux/nvme.h +++ b/include/linux/nvme.h @@ -132,6 +132,7 @@ enum { #define NVME_CAP_TIMEOUT(cap) (((cap) >> 24) & 0xff) #define NVME_CAP_STRIDE(cap) (((cap) >> 32) & 0xf) #define NVME_CAP_NSSRC(cap) (((cap) >> 36) & 0x1) +#define NVME_CAP_CSS(cap) (((cap) >> 37) & 0xff) #define NVME_CAP_MPSMIN(cap) (((cap) >> 48) & 0xf) #define NVME_CAP_MPSMAX(cap) (((cap) >> 52) & 0xf) @@ -162,7 +163,6 @@ enum { enum { NVME_CC_ENABLE = 1 << 0, - NVME_CC_CSS_NVM = 0 << 4, NVME_CC_EN_SHIFT = 0, NVME_CC_CSS_SHIFT = 4, NVME_CC_MPS_SHIFT = 7, @@ -170,6 +170,9 @@ enum { NVME_CC_SHN_SHIFT = 14, NVME_CC_IOSQES_SHIFT = 16, NVME_CC_IOCQES_SHIFT = 20, + NVME_CC_CSS_NVM = 0 << NVME_CC_CSS_SHIFT, + NVME_CC_CSS_CSI = 6 << NVME_CC_CSS_SHIFT, + NVME_CC_CSS_MASK = 7 << NVME_CC_CSS_SHIFT, NVME_CC_AMS_RR = 0 << NVME_CC_AMS_SHIFT, NVME_CC_AMS_WRRU = 1 << NVME_CC_AMS_SHIFT, NVME_CC_AMS_VS = 7 << NVME_CC_AMS_SHIFT, @@ -179,6 +182,8 @@ enum { NVME_CC_SHN_MASK = 3 << NVME_CC_SHN_SHIFT, NVME_CC_IOSQES = NVME_NVM_IOSQES << NVME_CC_IOSQES_SHIFT, NVME_CC_IOCQES = NVME_NVM_IOCQES << NVME_CC_IOCQES_SHIFT, + NVME_CAP_CSS_NVM = 1 << 0, + NVME_CAP_CSS_CSI = 1 << 6, NVME_CSTS_RDY = 1 << 0, NVME_CSTS_CFS = 1 << 1, NVME_CSTS_NSSRO = 1 << 4, @@ -374,6 +379,8 @@ enum { NVME_ID_CNS_CTRL = 0x01, NVME_ID_CNS_NS_ACTIVE_LIST = 0x02, NVME_ID_CNS_NS_DESC_LIST = 0x03, + NVME_ID_CNS_CS_NS = 0x05, + NVME_ID_CNS_CS_CTRL = 0x06, NVME_ID_CNS_NS_PRESENT_LIST = 0x10, NVME_ID_CNS_NS_PRESENT = 0x11, NVME_ID_CNS_CTRL_NS_LIST = 0x12, @@ -383,6 +390,10 @@ enum { NVME_ID_CNS_UUID_LIST = 0x17, }; +enum { + NVME_CSI_NVM = 0, +}; + enum { NVME_DIR_IDENTIFY = 0x00, NVME_DIR_STREAMS = 0x01, @@ -435,11 +446,13 @@ struct nvme_ns_id_desc { #define NVME_NIDT_EUI64_LEN 8 #define NVME_NIDT_NGUID_LEN 16 #define NVME_NIDT_UUID_LEN 16 +#define NVME_NIDT_CSI_LEN 1 enum { NVME_NIDT_EUI64 = 0x01, NVME_NIDT_NGUID = 0x02, NVME_NIDT_UUID = 0x03, + NVME_NIDT_CSI = 0x04, }; struct nvme_smart_log { @@ -972,7 +985,9 @@ struct nvme_identify { __u8 cns; __u8 rsvd3; __le16 ctrlid; - __u32 rsvd11[5]; + __u8 rsvd11[3]; + __u8 csi; + __u32 rsvd12[4]; }; #define NVME_IDENTIFY_DATA_SIZE 4096 -- 2.24.1 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=-10.0 required=3.0 tests=DKIMWL_WL_HIGH,DKIM_SIGNED, DKIM_VALID,INCLUDES_PATCH,MAILING_LIST_MULTI,SIGNED_OFF_BY,SPF_HELO_NONE, SPF_PASS,URIBL_BLOCKED,USER_AGENT_GIT 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 2C214C433E2 for ; Mon, 29 Jun 2020 19:06:59 +0000 (UTC) Received: from merlin.infradead.org (merlin.infradead.org [205.233.59.134]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id E951F20663 for ; Mon, 29 Jun 2020 19:06:58 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=lists.infradead.org header.i=@lists.infradead.org header.b="3US3wKJT"; dkim=fail reason="signature verification failed" (1024-bit key) header.d=kernel.org header.i=@kernel.org header.b="l2MsGl5U" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org E951F20663 Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=kernel.org 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=merlin.20170209; h=Sender:Content-Transfer-Encoding: Content-Type:Cc:List-Subscribe:List-Help:List-Post:List-Archive: List-Unsubscribe:List-Id:MIME-Version:References:In-Reply-To:Message-Id:Date: Subject:To:From:Reply-To:Content-ID:Content-Description:Resent-Date: Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Owner; bh=RpsadWzK5ALVzmovWRw7cJhgYUnvUk9D8BNf8UUu/n0=; b=3US3wKJT6VDzC9QjYOgUOjcgO VTN2A4T8lPelm2OlCZuRJkTcEaOlHqs5G4S3AGLWjgzXFUfVXOpPxriYeE4SrJCJf3CIaFGudRVTW YHhTrCSVor2z/yGsRD3841r6DTf5ea2IHqkHEEVRoiRYqEb7seAAGTnCKJAMhtTwUHSLaDdYq9GSF azUKGdKZjajcKEPsNriY1QtMxfEFlpDsPjJvEzPn/l9XX48gBan6GlM0WRwYW6PnwNRv1Ae0A0+6n eDDxs2MC0zccN/3wbJ5qvzsxbxZdxDorsMoiVikKl9nsTBOeh5bP6v3huutDSogFZu5uSpus7SQ0E N598pRXDg==; Received: from localhost ([::1] helo=merlin.infradead.org) by merlin.infradead.org with esmtp (Exim 4.92.3 #3 (Red Hat Linux)) id 1jpz7F-0006re-UA; Mon, 29 Jun 2020 19:06:54 +0000 Received: from mail.kernel.org ([198.145.29.99]) by merlin.infradead.org with esmtps (Exim 4.92.3 #3 (Red Hat Linux)) id 1jpz7A-0006pu-HH for linux-nvme@lists.infradead.org; Mon, 29 Jun 2020 19:06:49 +0000 Received: from dhcp-10-100-145-180.wdl.wdc.com (unknown [199.255.45.60]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id 3D853206E2; Mon, 29 Jun 2020 19:06:47 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1593457608; bh=bU4UPg9ZXn991s7Tmq1JeQL2lH9esGDbJfRvDxOVQqE=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=l2MsGl5Ul+1VwW/wvXRcnEf8oI7FCtcCChdZ07+gbk+WzPpWn399ct6994TXyGH4m s1kNagTriDv53DBaD4WAtlQR2vOp7t74nHaegWflomNmUgOk6HYWwYrOloVaQ+3zeL nqm92E/kUdB49f/wd/EO9H9klakdPOoBbHArqvYY= From: Keith Busch To: linux-nvme@lists.infradead.org, hch@lst.de, sagi@grimberg.me, linux-block@vger.kernel.org Subject: [PATCHv4 3/5] nvme: implement I/O Command Sets Command Set support Date: Mon, 29 Jun 2020 12:06:39 -0700 Message-Id: <20200629190641.1986462-4-kbusch@kernel.org> X-Mailer: git-send-email 2.24.1 In-Reply-To: <20200629190641.1986462-1-kbusch@kernel.org> References: <20200629190641.1986462-1-kbusch@kernel.org> MIME-Version: 1.0 X-BeenThere: linux-nvme@lists.infradead.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: axboe@kernel.dk, Niklas Cassel , Daniel Wagner , "Martin K . Petersen" , Johannes Thumshirn , =?UTF-8?q?Javier=20Gonz=C3=A1lez?= , =?UTF-8?q?Matias=20Bj=C3=B8rling?= Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Sender: "Linux-nvme" Errors-To: linux-nvme-bounces+linux-nvme=archiver.kernel.org@lists.infradead.org RnJvbTogTmlrbGFzIENhc3NlbCA8bmlrbGFzLmNhc3NlbEB3ZGMuY29tPgoKSW1wbGVtZW50cyBz dXBwb3J0IGZvciB0aGUgSS9PIENvbW1hbmQgU2V0cyBjb21tYW5kIHNldC4gVGhlIGNvbW1hbmQg c2V0CmludHJvZHVjZXMgYSBtZXRob2QgdG8gZW51bWVyYXRlIG11bHRpcGxlIGNvbW1hbmQgc2V0 cyBwZXIgbmFtZXNwYWNlLiBJZgp0aGUgY29tbWFuZCBzZXQgaXMgZXhwb3NlZCwgdGhpcyBtZXRo b2QgZm9yIGVudW1lcmF0aW9uIHdpbGwgYmUgdXNlZAppbnN0ZWFkIG9mIHRoZSB0cmFkaXRpb25h bCBtZXRob2QgdGhhdCB1c2VzIHRoZSBDQy5DU1MgcmVnaXN0ZXIgY29tbWFuZApzZXQgcmVnaXN0 ZXIgZm9yIGNvbW1hbmQgc2V0IGlkZW50aWZpY2F0aW9uLgoKRm9yIG5hbWVzcGFjZXMgd2hlcmUg dGhlIENvbW1hbmQgU2V0IElkZW50aWZpZXIgaXMgbm90IHN1cHBvcnRlZCBvcgpyZWNvZ25pemVk LCB0aGUgc3BlY2lmaWMgbmFtZXNwYWNlIHdpbGwgbm90IGJlIGNyZWF0ZWQuCgpSZXZpZXdlZC1i eTogSmF2aWVyIEdvbnrDoWxleiA8amF2aWVyLmdvbnpAc2Ftc3VuZy5jb20+ClJldmlld2VkLWJ5 OiBNYXJ0aW4gSy4gUGV0ZXJzZW4gPG1hcnRpbi5wZXRlcnNlbkBvcmFjbGUuY29tPgpSZXZpZXdl ZC1ieTogSm9oYW5uZXMgVGh1bXNoaXJuIDxqb2hhbm5lcy50aHVtc2hpcm5Ad2RjLmNvbT4KUmV2 aWV3ZWQtYnk6IE1hdGlhcyBCasO4cmxpbmcgPG1hdGlhcy5iam9ybGluZ0B3ZGMuY29tPgpSZXZp ZXdlZC1ieTogRGFuaWVsIFdhZ25lciA8ZHdhZ25lckBzdXNlLmRlPgpTaWduZWQtb2ZmLWJ5OiBO aWtsYXMgQ2Fzc2VsIDxuaWtsYXMuY2Fzc2VsQHdkYy5jb20+Ci0tLQogZHJpdmVycy9udm1lL2hv c3QvY29yZS5jIHwgNTMgKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKystLS0tLS0tLQog ZHJpdmVycy9udm1lL2hvc3QvbnZtZS5oIHwgIDEgKwogaW5jbHVkZS9saW51eC9udm1lLmggICAg IHwgMTkgKysrKysrKysrKysrLS0KIDMgZmlsZXMgY2hhbmdlZCwgNjEgaW5zZXJ0aW9ucygrKSwg MTIgZGVsZXRpb25zKC0pCgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9udm1lL2hvc3QvY29yZS5jIGIv ZHJpdmVycy9udm1lL2hvc3QvY29yZS5jCmluZGV4IDcwMTc2MzkxMGU0OC4uYjdkMTJlYjQyZmQ4 IDEwMDY0NAotLS0gYS9kcml2ZXJzL252bWUvaG9zdC9jb3JlLmMKKysrIGIvZHJpdmVycy9udm1l L2hvc3QvY29yZS5jCkBAIC0xMDU2LDggKzEwNTYsMTMgQEAgc3RhdGljIGludCBudm1lX2lkZW50 aWZ5X2N0cmwoc3RydWN0IG52bWVfY3RybCAqZGV2LCBzdHJ1Y3QgbnZtZV9pZF9jdHJsICoqaWQp CiAJcmV0dXJuIGVycm9yOwogfQogCitzdGF0aWMgYm9vbCBudm1lX211bHRpX2NzcyhzdHJ1Y3Qg bnZtZV9jdHJsICpjdHJsKQoreworCXJldHVybiAoY3RybC0+Y3RybF9jb25maWcgJiBOVk1FX0ND X0NTU19NQVNLKSA9PSBOVk1FX0NDX0NTU19DU0k7Cit9CisKIHN0YXRpYyBpbnQgbnZtZV9wcm9j ZXNzX25zX2Rlc2Moc3RydWN0IG52bWVfY3RybCAqY3RybCwgc3RydWN0IG52bWVfbnNfaWRzICpp ZHMsCi0JCXN0cnVjdCBudm1lX25zX2lkX2Rlc2MgKmN1cikKKwkJc3RydWN0IG52bWVfbnNfaWRf ZGVzYyAqY3VyLCBib29sICpjc2lfc2VlbikKIHsKIAljb25zdCBjaGFyICp3YXJuX3N0ciA9ICJj dHJsIHJldHVybmVkIGJvZ3VzIGxlbmd0aDoiOwogCXZvaWQgKmRhdGEgPSBjdXI7CkBAIC0xMDg3 LDYgKzEwOTIsMTUgQEAgc3RhdGljIGludCBudm1lX3Byb2Nlc3NfbnNfZGVzYyhzdHJ1Y3QgbnZt ZV9jdHJsICpjdHJsLCBzdHJ1Y3QgbnZtZV9uc19pZHMgKmlkcywKIAkJfQogCQl1dWlkX2NvcHko Jmlkcy0+dXVpZCwgZGF0YSArIHNpemVvZigqY3VyKSk7CiAJCXJldHVybiBOVk1FX05JRFRfVVVJ RF9MRU47CisJY2FzZSBOVk1FX05JRFRfQ1NJOgorCQlpZiAoY3VyLT5uaWRsICE9IE5WTUVfTklE VF9DU0lfTEVOKSB7CisJCQlkZXZfd2FybihjdHJsLT5kZXZpY2UsICIlcyAlZCBmb3IgTlZNRV9O SURUX0NTSVxuIiwKKwkJCQkgd2Fybl9zdHIsIGN1ci0+bmlkbCk7CisJCQlyZXR1cm4gLTE7CisJ CX0KKwkJbWVtY3B5KCZpZHMtPmNzaSwgZGF0YSArIHNpemVvZigqY3VyKSwgTlZNRV9OSURUX0NT SV9MRU4pOworCQkqY3NpX3NlZW4gPSB0cnVlOworCQlyZXR1cm4gTlZNRV9OSURUX0NTSV9MRU47 CiAJZGVmYXVsdDoKIAkJLyogU2tpcCB1bmtub3duIHR5cGVzICovCiAJCXJldHVybiBjdXItPm5p ZGw7CkBAIC0xMDk3LDEwICsxMTExLDkgQEAgc3RhdGljIGludCBudm1lX2lkZW50aWZ5X25zX2Rl c2NzKHN0cnVjdCBudm1lX2N0cmwgKmN0cmwsIHVuc2lnbmVkIG5zaWQsCiAJCXN0cnVjdCBudm1l X25zX2lkcyAqaWRzKQogewogCXN0cnVjdCBudm1lX2NvbW1hbmQgYyA9IHsgfTsKLQlpbnQgc3Rh dHVzOworCWJvb2wgY3NpX3NlZW4gPSBmYWxzZTsKKwlpbnQgc3RhdHVzLCBwb3MsIGxlbjsKIAl2 b2lkICpkYXRhOwotCWludCBwb3M7Ci0JaW50IGxlbjsKIAogCWMuaWRlbnRpZnkub3Bjb2RlID0g bnZtZV9hZG1pbl9pZGVudGlmeTsKIAljLmlkZW50aWZ5Lm5zaWQgPSBjcHVfdG9fbGUzMihuc2lk KTsKQEAgLTExMjUsNyArMTEzOCw3IEBAIHN0YXRpYyBpbnQgbnZtZV9pZGVudGlmeV9uc19kZXNj cyhzdHJ1Y3QgbnZtZV9jdHJsICpjdHJsLCB1bnNpZ25lZCBuc2lkLAogCQkgICogZGV2aWNlIGp1 c3QgYmVjYXVzZSBvZiBhIHRlbXBvcmFsIHJldHJ5LWFibGUgZXJyb3IgKHN1Y2gKIAkJICAqIGFz IHBhdGggb2YgdHJhbnNwb3J0IGVycm9ycykuCiAJCSAgKi8KLQkJaWYgKHN0YXR1cyA+IDAgJiYg KHN0YXR1cyAmIE5WTUVfU0NfRE5SKSkKKwkJaWYgKHN0YXR1cyA+IDAgJiYgKHN0YXR1cyAmIE5W TUVfU0NfRE5SKSAmJiAhbnZtZV9tdWx0aV9jc3MoY3RybCkpCiAJCQlzdGF0dXMgPSAwOwogCQln b3RvIGZyZWVfZGF0YTsKIAl9CkBAIC0xMTM2LDEyICsxMTQ5LDE5IEBAIHN0YXRpYyBpbnQgbnZt ZV9pZGVudGlmeV9uc19kZXNjcyhzdHJ1Y3QgbnZtZV9jdHJsICpjdHJsLCB1bnNpZ25lZCBuc2lk LAogCQlpZiAoY3VyLT5uaWRsID09IDApCiAJCQlicmVhazsKIAotCQlsZW4gPSBudm1lX3Byb2Nl c3NfbnNfZGVzYyhjdHJsLCBpZHMsIGN1cik7CisJCWxlbiA9IG52bWVfcHJvY2Vzc19uc19kZXNj KGN0cmwsIGlkcywgY3VyLCAmY3NpX3NlZW4pOwogCQlpZiAobGVuIDwgMCkKLQkJCWdvdG8gZnJl ZV9kYXRhOworCQkJYnJlYWs7CiAKIAkJbGVuICs9IHNpemVvZigqY3VyKTsKIAl9CisKKwlpZiAo bnZtZV9tdWx0aV9jc3MoY3RybCkgJiYgIWNzaV9zZWVuKSB7CisJCWRldl93YXJuKGN0cmwtPmRl dmljZSwgIkNvbW1hbmQgc2V0IG5vdCByZXBvcnRlZCBmb3IgbnNpZDolZFxuIiwKKwkJCSBuc2lk KTsKKwkJc3RhdHVzID0gLUVJTlZBTDsKKwl9CisKIGZyZWVfZGF0YToKIAlrZnJlZShkYXRhKTsK IAlyZXR1cm4gc3RhdHVzOwpAQCAtMTc5OCw3ICsxODE4LDcgQEAgc3RhdGljIGludCBudm1lX3Jl cG9ydF9uc19pZHMoc3RydWN0IG52bWVfY3RybCAqY3RybCwgdW5zaWduZWQgaW50IG5zaWQsCiAJ CW1lbWNweShpZHMtPmV1aTY0LCBpZC0+ZXVpNjQsIHNpemVvZihpZC0+ZXVpNjQpKTsKIAlpZiAo Y3RybC0+dnMgPj0gTlZNRV9WUygxLCAyLCAwKSkKIAkJbWVtY3B5KGlkcy0+bmd1aWQsIGlkLT5u Z3VpZCwgc2l6ZW9mKGlkLT5uZ3VpZCkpOwotCWlmIChjdHJsLT52cyA+PSBOVk1FX1ZTKDEsIDMs IDApKQorCWlmIChjdHJsLT52cyA+PSBOVk1FX1ZTKDEsIDMsIDApIHx8IG52bWVfbXVsdGlfY3Nz KGN0cmwpKQogCQlyZXR1cm4gbnZtZV9pZGVudGlmeV9uc19kZXNjcyhjdHJsLCBuc2lkLCBpZHMp OwogCXJldHVybiAwOwogfQpAQCAtMTgxNCw3ICsxODM0LDggQEAgc3RhdGljIGJvb2wgbnZtZV9u c19pZHNfZXF1YWwoc3RydWN0IG52bWVfbnNfaWRzICphLCBzdHJ1Y3QgbnZtZV9uc19pZHMgKmIp CiB7CiAJcmV0dXJuIHV1aWRfZXF1YWwoJmEtPnV1aWQsICZiLT51dWlkKSAmJgogCQltZW1jbXAo JmEtPm5ndWlkLCAmYi0+bmd1aWQsIHNpemVvZihhLT5uZ3VpZCkpID09IDAgJiYKLQkJbWVtY21w KCZhLT5ldWk2NCwgJmItPmV1aTY0LCBzaXplb2YoYS0+ZXVpNjQpKSA9PSAwOworCQltZW1jbXAo JmEtPmV1aTY0LCAmYi0+ZXVpNjQsIHNpemVvZihhLT5ldWk2NCkpID09IDAgJiYKKwkJYS0+Y3Np ID09IGItPmNzaTsKIH0KIAogc3RhdGljIGludCBudm1lX3NldHVwX3N0cmVhbXNfbnMoc3RydWN0 IG52bWVfY3RybCAqY3RybCwgc3RydWN0IG52bWVfbnMgKm5zLApAQCAtMTkzNiw2ICsxOTU3LDE1 IEBAIHN0YXRpYyBpbnQgX19udm1lX3JldmFsaWRhdGVfZGlzayhzdHJ1Y3QgZ2VuZGlzayAqZGlz aywgc3RydWN0IG52bWVfaWRfbnMgKmlkKQogCWlmIChucy0+bGJhX3NoaWZ0ID09IDApCiAJCW5z LT5sYmFfc2hpZnQgPSA5OwogCisJc3dpdGNoIChucy0+aGVhZC0+aWRzLmNzaSkgeworCWNhc2Ug TlZNRV9DU0lfTlZNOgorCQlicmVhazsKKwlkZWZhdWx0OgorCQlkZXZfd2FybihjdHJsLT5kZXZp Y2UsICJ1bmtub3duIGNzaTolZCBuczolZFxuIiwKKwkJCW5zLT5oZWFkLT5pZHMuY3NpLCBucy0+ aGVhZC0+bnNfaWQpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKIAlpZiAoKGN0cmwtPnF1aXJr cyAmIE5WTUVfUVVJUktfU1RSSVBFX1NJWkUpICYmCiAJICAgIGlzX3Bvd2VyX29mXzIoY3RybC0+ bWF4X2h3X3NlY3RvcnMpKQogCQlpb2IgPSBjdHJsLT5tYXhfaHdfc2VjdG9yczsKQEAgLTIyNjks NyArMjI5OSwxMCBAQCBpbnQgbnZtZV9lbmFibGVfY3RybChzdHJ1Y3QgbnZtZV9jdHJsICpjdHJs KQogCiAJY3RybC0+cGFnZV9zaXplID0gMSA8PCBwYWdlX3NoaWZ0OwogCi0JY3RybC0+Y3RybF9j b25maWcgPSBOVk1FX0NDX0NTU19OVk07CisJaWYgKE5WTUVfQ0FQX0NTUyhjdHJsLT5jYXApICYg TlZNRV9DQVBfQ1NTX0NTSSkKKwkJY3RybC0+Y3RybF9jb25maWcgPSBOVk1FX0NDX0NTU19DU0k7 CisJZWxzZQorCQljdHJsLT5jdHJsX2NvbmZpZyA9IE5WTUVfQ0NfQ1NTX05WTTsKIAljdHJsLT5j dHJsX2NvbmZpZyB8PSAocGFnZV9zaGlmdCAtIDEyKSA8PCBOVk1FX0NDX01QU19TSElGVDsKIAlj dHJsLT5jdHJsX2NvbmZpZyB8PSBOVk1FX0NDX0FNU19SUiB8IE5WTUVfQ0NfU0hOX05PTkU7CiAJ Y3RybC0+Y3RybF9jb25maWcgfD0gTlZNRV9DQ19JT1NRRVMgfCBOVk1FX0NDX0lPQ1FFUzsKZGlm ZiAtLWdpdCBhL2RyaXZlcnMvbnZtZS9ob3N0L252bWUuaCBiL2RyaXZlcnMvbnZtZS9ob3N0L252 bWUuaAppbmRleCA5MTllYmFmM2ZkZWYuLjRhYTMyMWIxNmVhYSAxMDA2NDQKLS0tIGEvZHJpdmVy cy9udm1lL2hvc3QvbnZtZS5oCisrKyBiL2RyaXZlcnMvbnZtZS9ob3N0L252bWUuaApAQCAtMzM5 LDYgKzMzOSw3IEBAIHN0cnVjdCBudm1lX25zX2lkcyB7CiAJdTgJZXVpNjRbOF07CiAJdTgJbmd1 aWRbMTZdOwogCXV1aWRfdAl1dWlkOworCXU4CWNzaTsKIH07CiAKIC8qCmRpZmYgLS1naXQgYS9p bmNsdWRlL2xpbnV4L252bWUuaCBiL2luY2x1ZGUvbGludXgvbnZtZS5oCmluZGV4IDVjZTUxYWI0 YzUwZS4uODFmZmU1MjQ3NTA1IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L252bWUuaAorKysg Yi9pbmNsdWRlL2xpbnV4L252bWUuaApAQCAtMTMyLDYgKzEzMiw3IEBAIGVudW0gewogI2RlZmlu ZSBOVk1FX0NBUF9USU1FT1VUKGNhcCkJKCgoY2FwKSA+PiAyNCkgJiAweGZmKQogI2RlZmluZSBO Vk1FX0NBUF9TVFJJREUoY2FwKQkoKChjYXApID4+IDMyKSAmIDB4ZikKICNkZWZpbmUgTlZNRV9D QVBfTlNTUkMoY2FwKQkoKChjYXApID4+IDM2KSAmIDB4MSkKKyNkZWZpbmUgTlZNRV9DQVBfQ1NT KGNhcCkJKCgoY2FwKSA+PiAzNykgJiAweGZmKQogI2RlZmluZSBOVk1FX0NBUF9NUFNNSU4oY2Fw KQkoKChjYXApID4+IDQ4KSAmIDB4ZikKICNkZWZpbmUgTlZNRV9DQVBfTVBTTUFYKGNhcCkJKCgo Y2FwKSA+PiA1MikgJiAweGYpCiAKQEAgLTE2Miw3ICsxNjMsNiBAQCBlbnVtIHsKIAogZW51bSB7 CiAJTlZNRV9DQ19FTkFCTEUJCT0gMSA8PCAwLAotCU5WTUVfQ0NfQ1NTX05WTQkJPSAwIDw8IDQs CiAJTlZNRV9DQ19FTl9TSElGVAk9IDAsCiAJTlZNRV9DQ19DU1NfU0hJRlQJPSA0LAogCU5WTUVf Q0NfTVBTX1NISUZUCT0gNywKQEAgLTE3MCw2ICsxNzAsOSBAQCBlbnVtIHsKIAlOVk1FX0NDX1NI Tl9TSElGVAk9IDE0LAogCU5WTUVfQ0NfSU9TUUVTX1NISUZUCT0gMTYsCiAJTlZNRV9DQ19JT0NR RVNfU0hJRlQJPSAyMCwKKwlOVk1FX0NDX0NTU19OVk0JCT0gMCA8PCBOVk1FX0NDX0NTU19TSElG VCwKKwlOVk1FX0NDX0NTU19DU0kJCT0gNiA8PCBOVk1FX0NDX0NTU19TSElGVCwKKwlOVk1FX0ND X0NTU19NQVNLCT0gNyA8PCBOVk1FX0NDX0NTU19TSElGVCwKIAlOVk1FX0NDX0FNU19SUgkJPSAw IDw8IE5WTUVfQ0NfQU1TX1NISUZULAogCU5WTUVfQ0NfQU1TX1dSUlUJPSAxIDw8IE5WTUVfQ0Nf QU1TX1NISUZULAogCU5WTUVfQ0NfQU1TX1ZTCQk9IDcgPDwgTlZNRV9DQ19BTVNfU0hJRlQsCkBA IC0xNzksNiArMTgyLDggQEAgZW51bSB7CiAJTlZNRV9DQ19TSE5fTUFTSwk9IDMgPDwgTlZNRV9D Q19TSE5fU0hJRlQsCiAJTlZNRV9DQ19JT1NRRVMJCT0gTlZNRV9OVk1fSU9TUUVTIDw8IE5WTUVf Q0NfSU9TUUVTX1NISUZULAogCU5WTUVfQ0NfSU9DUUVTCQk9IE5WTUVfTlZNX0lPQ1FFUyA8PCBO Vk1FX0NDX0lPQ1FFU19TSElGVCwKKwlOVk1FX0NBUF9DU1NfTlZNCT0gMSA8PCAwLAorCU5WTUVf Q0FQX0NTU19DU0kJPSAxIDw8IDYsCiAJTlZNRV9DU1RTX1JEWQkJPSAxIDw8IDAsCiAJTlZNRV9D U1RTX0NGUwkJPSAxIDw8IDEsCiAJTlZNRV9DU1RTX05TU1JPCQk9IDEgPDwgNCwKQEAgLTM3NCw2 ICszNzksOCBAQCBlbnVtIHsKIAlOVk1FX0lEX0NOU19DVFJMCQk9IDB4MDEsCiAJTlZNRV9JRF9D TlNfTlNfQUNUSVZFX0xJU1QJPSAweDAyLAogCU5WTUVfSURfQ05TX05TX0RFU0NfTElTVAk9IDB4 MDMsCisJTlZNRV9JRF9DTlNfQ1NfTlMJCT0gMHgwNSwKKwlOVk1FX0lEX0NOU19DU19DVFJMCQk9 IDB4MDYsCiAJTlZNRV9JRF9DTlNfTlNfUFJFU0VOVF9MSVNUCT0gMHgxMCwKIAlOVk1FX0lEX0NO U19OU19QUkVTRU5UCQk9IDB4MTEsCiAJTlZNRV9JRF9DTlNfQ1RSTF9OU19MSVNUCT0gMHgxMiwK QEAgLTM4Myw2ICszOTAsMTAgQEAgZW51bSB7CiAJTlZNRV9JRF9DTlNfVVVJRF9MSVNUCQk9IDB4 MTcsCiB9OwogCitlbnVtIHsKKwlOVk1FX0NTSV9OVk0JCQk9IDAsCit9OworCiBlbnVtIHsKIAlO Vk1FX0RJUl9JREVOVElGWQkJPSAweDAwLAogCU5WTUVfRElSX1NUUkVBTVMJCT0gMHgwMSwKQEAg LTQzNSwxMSArNDQ2LDEzIEBAIHN0cnVjdCBudm1lX25zX2lkX2Rlc2MgewogI2RlZmluZSBOVk1F X05JRFRfRVVJNjRfTEVOCTgKICNkZWZpbmUgTlZNRV9OSURUX05HVUlEX0xFTgkxNgogI2RlZmlu ZSBOVk1FX05JRFRfVVVJRF9MRU4JMTYKKyNkZWZpbmUgTlZNRV9OSURUX0NTSV9MRU4JMQogCiBl bnVtIHsKIAlOVk1FX05JRFRfRVVJNjQJCT0gMHgwMSwKIAlOVk1FX05JRFRfTkdVSUQJCT0gMHgw MiwKIAlOVk1FX05JRFRfVVVJRAkJPSAweDAzLAorCU5WTUVfTklEVF9DU0kJCT0gMHgwNCwKIH07 CiAKIHN0cnVjdCBudm1lX3NtYXJ0X2xvZyB7CkBAIC05NzIsNyArOTg1LDkgQEAgc3RydWN0IG52 bWVfaWRlbnRpZnkgewogCV9fdTgJCQljbnM7CiAJX191OAkJCXJzdmQzOwogCV9fbGUxNgkJCWN0 cmxpZDsKLQlfX3UzMgkJCXJzdmQxMVs1XTsKKwlfX3U4CQkJcnN2ZDExWzNdOworCV9fdTgJCQlj c2k7CisJX191MzIJCQlyc3ZkMTJbNF07CiB9OwogCiAjZGVmaW5lIE5WTUVfSURFTlRJRllfREFU QV9TSVpFIDQwOTYKLS0gCjIuMjQuMQoKCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fCkxpbnV4LW52bWUgbWFpbGluZyBsaXN0CkxpbnV4LW52bWVAbGlzdHMu aW5mcmFkZWFkLm9yZwpodHRwOi8vbGlzdHMuaW5mcmFkZWFkLm9yZy9tYWlsbWFuL2xpc3RpbmZv L2xpbnV4LW52bWUK