get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

GET /api/patches/136832/?format=api
HTTP 200 OK
Allow: GET, PUT, PATCH, HEAD, OPTIONS
Content-Type: application/json
Vary: Accept

{
    "id": 136832,
    "url": "http://patches.dpdk.org/api/patches/136832/?format=api",
    "web_url": "http://patches.dpdk.org/project/dpdk/patch/20240215124856.26797-8-rnagadheeraj@marvell.com/",
    "project": {
        "id": 1,
        "url": "http://patches.dpdk.org/api/projects/1/?format=api",
        "name": "DPDK",
        "link_name": "dpdk",
        "list_id": "dev.dpdk.org",
        "list_email": "dev@dpdk.org",
        "web_url": "http://core.dpdk.org",
        "scm_url": "git://dpdk.org/dpdk",
        "webscm_url": "http://git.dpdk.org/dpdk",
        "list_archive_url": "https://inbox.dpdk.org/dev",
        "list_archive_url_format": "https://inbox.dpdk.org/dev/{}",
        "commit_url_format": ""
    },
    "msgid": "<20240215124856.26797-8-rnagadheeraj@marvell.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/20240215124856.26797-8-rnagadheeraj@marvell.com",
    "date": "2024-02-15T12:48:56",
    "name": "[v3,7/7] compress/nitrox: add stateful request support",
    "commit_ref": null,
    "pull_url": null,
    "state": "superseded",
    "archived": true,
    "hash": "e87109a2203a9f20b46fefa1eae17bad29c8ab03",
    "submitter": {
        "id": 1365,
        "url": "http://patches.dpdk.org/api/people/1365/?format=api",
        "name": "Nagadheeraj Rottela",
        "email": "rnagadheeraj@marvell.com"
    },
    "delegate": {
        "id": 6690,
        "url": "http://patches.dpdk.org/api/users/6690/?format=api",
        "username": "akhil",
        "first_name": "akhil",
        "last_name": "goyal",
        "email": "gakhil@marvell.com"
    },
    "mbox": "http://patches.dpdk.org/project/dpdk/patch/20240215124856.26797-8-rnagadheeraj@marvell.com/mbox/",
    "series": [
        {
            "id": 31117,
            "url": "http://patches.dpdk.org/api/series/31117/?format=api",
            "web_url": "http://patches.dpdk.org/project/dpdk/list/?series=31117",
            "date": "2024-02-15T12:48:49",
            "name": "add Nitrox compress device support",
            "version": 1,
            "mbox": "http://patches.dpdk.org/series/31117/mbox/"
        }
    ],
    "comments": "http://patches.dpdk.org/api/patches/136832/comments/",
    "check": "warning",
    "checks": "http://patches.dpdk.org/api/patches/136832/checks/",
    "tags": {},
    "related": [],
    "headers": {
        "Return-Path": "<dev-bounces@dpdk.org>",
        "X-Original-To": "patchwork@inbox.dpdk.org",
        "Delivered-To": "patchwork@inbox.dpdk.org",
        "Received": [
            "from mails.dpdk.org (mails.dpdk.org [217.70.189.124])\n\tby inbox.dpdk.org (Postfix) with ESMTP id 03F4D43B12;\n\tThu, 15 Feb 2024 13:50:17 +0100 (CET)",
            "from mails.dpdk.org (localhost [127.0.0.1])\n\tby mails.dpdk.org (Postfix) with ESMTP id 94FF14341D;\n\tThu, 15 Feb 2024 13:49:37 +0100 (CET)",
            "from mx0b-0016f401.pphosted.com (mx0a-0016f401.pphosted.com\n [67.231.148.174])\n by mails.dpdk.org (Postfix) with ESMTP id A1E5D43427\n for <dev@dpdk.org>; Thu, 15 Feb 2024 13:49:35 +0100 (CET)",
            "from pps.filterd (m0045849.ppops.net [127.0.0.1])\n by mx0a-0016f401.pphosted.com (8.17.1.24/8.17.1.24) with ESMTP id\n 41FACUXC012571; Thu, 15 Feb 2024 04:49:34 -0800",
            "from dc5-exch02.marvell.com ([199.233.59.182])\n by mx0a-0016f401.pphosted.com (PPS) with ESMTPS id 3w9gncgdsj-1\n (version=TLSv1.2 cipher=ECDHE-RSA-AES256-SHA384 bits=256 verify=NOT);\n Thu, 15 Feb 2024 04:49:34 -0800 (PST)",
            "from DC5-EXCH02.marvell.com (10.69.176.39) by DC5-EXCH02.marvell.com\n (10.69.176.39) with Microsoft SMTP Server (TLS) id 15.0.1497.48;\n Thu, 15 Feb 2024 04:49:32 -0800",
            "from hyd1399.caveonetworks.com.com (10.69.176.80) by\n DC5-EXCH02.marvell.com (10.69.176.39) with Microsoft SMTP Server id\n 15.0.1497.48 via Frontend Transport; Thu, 15 Feb 2024 04:49:31 -0800"
        ],
        "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed; d=marvell.com; h=\n from:to:cc:subject:date:message-id:in-reply-to:references\n :mime-version:content-transfer-encoding:content-type; s=\n pfpt0220; bh=BHvJ8YYptT0aGvsJLSoA5vVDG8zxuXBLPbf/AdXeJDM=; b=ZTc\n 9dXNLvv7K7QhCQu3wtXq49VV3pR1xT1E2izUj0YA+9Tj9M0wcBHb5VUXtj1rtnNf\n qhBBzwGHAmuihXYSPyzUzeS0Ua+ckpBNjX1WYylERqiTQ3I/XxDUYpm43oN7Ar64\n /lSkNEJCZgYjii+SxctZ41zMpo7W+YJYs4U0xAjQr0FuO61vLkC6qa1lVvrMpeBQ\n ArBd1d19IHUv+aspMVnSOfCxao+DfZF912icw30HUEhFJAnnQc50U4e/GwOqMKA4\n BT5XpLbwFALfyJEmMfkk3xJozO7UEnjHs0Wv6hs0H5gqLRvIeZKaVLW+yJjgIO9o\n aertVFXMubD1EFFjjKg==",
        "From": "Nagadheeraj Rottela <rnagadheeraj@marvell.com>",
        "To": "<gakhil@marvell.com>, <fanzhang.oss@gmail.com>, <ashishg@marvell.com>",
        "CC": "<dev@dpdk.org>, Nagadheeraj Rottela <rnagadheeraj@marvell.com>",
        "Subject": "[PATCH v3 7/7] compress/nitrox: add stateful request support",
        "Date": "Thu, 15 Feb 2024 18:18:56 +0530",
        "Message-ID": "<20240215124856.26797-8-rnagadheeraj@marvell.com>",
        "X-Mailer": "git-send-email 2.42.0",
        "In-Reply-To": "<20240215124856.26797-1-rnagadheeraj@marvell.com>",
        "References": "<20240215124856.26797-1-rnagadheeraj@marvell.com>",
        "MIME-Version": "1.0",
        "Content-Transfer-Encoding": "8bit",
        "Content-Type": "text/plain",
        "X-Proofpoint-ORIG-GUID": "WemsStw5QghnY1T1GWXIQbcOR6nIu9Gc",
        "X-Proofpoint-GUID": "WemsStw5QghnY1T1GWXIQbcOR6nIu9Gc",
        "X-Proofpoint-Virus-Version": "vendor=baseguard\n engine=ICAP:2.0.272,Aquarius:18.0.1011,Hydra:6.0.619,FMLib:17.11.176.26\n definitions=2024-02-15_12,2024-02-14_01,2023-05-22_02",
        "X-BeenThere": "dev@dpdk.org",
        "X-Mailman-Version": "2.1.29",
        "Precedence": "list",
        "List-Id": "DPDK patches and discussions <dev.dpdk.org>",
        "List-Unsubscribe": "<https://mails.dpdk.org/options/dev>,\n <mailto:dev-request@dpdk.org?subject=unsubscribe>",
        "List-Archive": "<http://mails.dpdk.org/archives/dev/>",
        "List-Post": "<mailto:dev@dpdk.org>",
        "List-Help": "<mailto:dev-request@dpdk.org?subject=help>",
        "List-Subscribe": "<https://mails.dpdk.org/listinfo/dev>,\n <mailto:dev-request@dpdk.org?subject=subscribe>",
        "Errors-To": "dev-bounces@dpdk.org"
    },
    "content": "Implement enqueue and dequeue burst operations for stateful request\nsupport.\n\nSigned-off-by: Nagadheeraj Rottela <rnagadheeraj@marvell.com>\n---\n drivers/compress/nitrox/nitrox_comp.c        |  98 +++-\n drivers/compress/nitrox/nitrox_comp.h        |   1 +\n drivers/compress/nitrox/nitrox_comp_reqmgr.c | 555 ++++++++++++++++---\n drivers/compress/nitrox/nitrox_comp_reqmgr.h |   8 +\n 4 files changed, 581 insertions(+), 81 deletions(-)",
    "diff": "diff --git a/drivers/compress/nitrox/nitrox_comp.c b/drivers/compress/nitrox/nitrox_comp.c\nindex 1fd1b12a18..97d2c4a0e8 100644\n--- a/drivers/compress/nitrox/nitrox_comp.c\n+++ b/drivers/compress/nitrox/nitrox_comp.c\n@@ -32,7 +32,9 @@ static const struct rte_compressdev_capabilities\n \t\t\t\t      RTE_COMP_FF_SHAREABLE_PRIV_XFORM |\n \t\t\t\t      RTE_COMP_FF_OOP_SGL_IN_SGL_OUT |\n \t\t\t\t      RTE_COMP_FF_OOP_SGL_IN_LB_OUT |\n-\t\t\t\t      RTE_COMP_FF_OOP_LB_IN_SGL_OUT,\n+\t\t\t\t      RTE_COMP_FF_OOP_LB_IN_SGL_OUT |\n+\t\t\t\t      RTE_COMP_FF_STATEFUL_COMPRESSION |\n+\t\t\t\t      RTE_COMP_FF_STATEFUL_DECOMPRESSION,\n \t\t.window_size = {\n \t\t\t.min = NITROX_COMP_WINDOW_SIZE_MIN,\n \t\t\t.max = NITROX_COMP_WINDOW_SIZE_MAX,\n@@ -334,6 +336,13 @@ static int nitrox_comp_private_xform_create(struct rte_compressdev *dev,\n \t\tgoto err_exit;\n \t}\n \n+\tnxform->context = NULL;\n+\tnxform->history_window = NULL;\n+\tnxform->window_size = 0;\n+\tnxform->hlen = 0;\n+\tnxform->exn = 0;\n+\tnxform->exbits = 0;\n+\tnxform->bf = true;\n \treturn 0;\n err_exit:\n \tmemset(nxform, 0, sizeof(*nxform));\n@@ -357,6 +366,74 @@ static int nitrox_comp_private_xform_free(struct rte_compressdev *dev,\n \treturn 0;\n }\n \n+static int nitrox_comp_stream_free(struct rte_compressdev *dev, void *stream)\n+{\n+\tstruct nitrox_comp_xform *nxform = stream;\n+\n+\tif (unlikely(nxform == NULL))\n+\t\treturn -EINVAL;\n+\n+\trte_free(nxform->history_window);\n+\tnxform->history_window = NULL;\n+\trte_free(nxform->context);\n+\tnxform->context = NULL;\n+\treturn nitrox_comp_private_xform_free(dev, stream);\n+}\n+\n+static int nitrox_comp_stream_create(struct rte_compressdev *dev,\n+\t\t\tconst struct rte_comp_xform *xform, void **stream)\n+{\n+\tint err;\n+\tstruct nitrox_comp_xform *nxform;\n+\tstruct nitrox_comp_device *comp_dev = dev->data->dev_private;\n+\n+\terr = nitrox_comp_private_xform_create(dev, xform, stream);\n+\tif (unlikely(err))\n+\t\treturn err;\n+\n+\tnxform = *stream;\n+\tif (xform->type == RTE_COMP_COMPRESS) {\n+\t\tuint8_t window_size = xform->compress.window_size;\n+\n+\t\tif (unlikely(window_size < NITROX_COMP_WINDOW_SIZE_MIN ||\n+\t\t\t      window_size > NITROX_COMP_WINDOW_SIZE_MAX)) {\n+\t\t\tNITROX_LOG(ERR, \"Invalid window size %d\\n\",\n+\t\t\t\t   window_size);\n+\t\t\treturn -EINVAL;\n+\t\t}\n+\n+\t\tif (window_size == NITROX_COMP_WINDOW_SIZE_MAX)\n+\t\t\tnxform->window_size = NITROX_CONSTANTS_MAX_SEARCH_DEPTH;\n+\t\telse\n+\t\t\tnxform->window_size = RTE_BIT32(window_size);\n+\t} else {\n+\t\tnxform->window_size = NITROX_DEFAULT_DEFLATE_SEARCH_DEPTH;\n+\t}\n+\n+\tnxform->history_window = rte_zmalloc_socket(NULL, nxform->window_size,\n+\t\t\t\t\t8, comp_dev->xform_pool->socket_id);\n+\tif (unlikely(nxform->history_window == NULL)) {\n+\t\terr = -ENOMEM;\n+\t\tgoto err_exit;\n+\t}\n+\n+\tif (xform->type == RTE_COMP_COMPRESS)\n+\t\treturn 0;\n+\n+\tnxform->context = rte_zmalloc_socket(NULL,\n+\t\t\t\t\tNITROX_DECOMP_CTX_SIZE, 8,\n+\t\t\t\t\tcomp_dev->xform_pool->socket_id);\n+\tif (unlikely(nxform->context == NULL)) {\n+\t\terr = -ENOMEM;\n+\t\tgoto err_exit;\n+\t}\n+\n+\treturn 0;\n+err_exit:\n+\tnitrox_comp_stream_free(dev, *stream);\n+\treturn err;\n+}\n+\n static int nitrox_enq_single_op(struct nitrox_qp *qp, struct rte_comp_op *op)\n {\n \tstruct nitrox_softreq *sr;\n@@ -371,8 +448,12 @@ static int nitrox_enq_single_op(struct nitrox_qp *qp, struct rte_comp_op *op)\n \t\treturn err;\n \t}\n \n-\tnitrox_qp_enqueue(qp, nitrox_comp_instr_addr(sr), sr);\n-\treturn 0;\n+\tif (op->status == RTE_COMP_OP_STATUS_SUCCESS)\n+\t\terr = nitrox_qp_enqueue_sr(qp, sr);\n+\telse\n+\t\tnitrox_qp_enqueue(qp, nitrox_comp_instr_addr(sr), sr);\n+\n+\treturn err;\n }\n \n static uint16_t nitrox_comp_dev_enq_burst(void *queue_pair,\n@@ -382,6 +463,7 @@ static uint16_t nitrox_comp_dev_enq_burst(void *queue_pair,\n \tstruct nitrox_qp *qp = queue_pair;\n \tuint16_t free_slots = 0;\n \tuint16_t cnt = 0;\n+\tuint16_t dbcnt = 0;\n \tbool err = false;\n \n \tfree_slots = nitrox_qp_free_count(qp);\n@@ -393,9 +475,12 @@ static uint16_t nitrox_comp_dev_enq_burst(void *queue_pair,\n \t\t\terr = true;\n \t\t\tbreak;\n \t\t}\n+\n+\t\tif (ops[cnt]->status != RTE_COMP_OP_STATUS_SUCCESS)\n+\t\t\tdbcnt++;\n \t}\n \n-\tnitrox_ring_dbell(qp, cnt);\n+\tnitrox_ring_dbell(qp, dbcnt);\n \tqp->stats.enqueued_count += cnt;\n \tif (unlikely(err))\n \t\tqp->stats.enqueue_err_count++;\n@@ -458,8 +543,8 @@ static struct rte_compressdev_ops nitrox_compressdev_ops = {\n \n \t\t.private_xform_create\t= nitrox_comp_private_xform_create,\n \t\t.private_xform_free\t= nitrox_comp_private_xform_free,\n-\t\t.stream_create\t\t= NULL,\n-\t\t.stream_free\t\t= NULL\n+\t\t.stream_create\t\t= nitrox_comp_stream_create,\n+\t\t.stream_free\t\t= nitrox_comp_stream_free,\n };\n \n int\n@@ -517,4 +602,3 @@ nitrox_comp_pmd_destroy(struct nitrox_device *ndev)\n \tndev->comp_dev = NULL;\n \treturn 0;\n }\n-\ndiff --git a/drivers/compress/nitrox/nitrox_comp.h b/drivers/compress/nitrox/nitrox_comp.h\nindex e49debaf6b..83e5902076 100644\n--- a/drivers/compress/nitrox/nitrox_comp.h\n+++ b/drivers/compress/nitrox/nitrox_comp.h\n@@ -8,6 +8,7 @@\n #define COMPRESSDEV_NAME_NITROX_PMD\tcompress_nitrox\n #define NITROX_DECOMP_CTX_SIZE 2048\n #define NITROX_CONSTANTS_MAX_SEARCH_DEPTH 31744\n+#define NITROX_DEFAULT_DEFLATE_SEARCH_DEPTH 32768\n #define NITROX_COMP_WINDOW_SIZE_MIN 1\n #define NITROX_COMP_WINDOW_SIZE_MAX 15\n #define NITROX_COMP_LEVEL_LOWEST_START 1\ndiff --git a/drivers/compress/nitrox/nitrox_comp_reqmgr.c b/drivers/compress/nitrox/nitrox_comp_reqmgr.c\nindex 5ad1a4439a..a3a6588132 100644\n--- a/drivers/compress/nitrox/nitrox_comp_reqmgr.c\n+++ b/drivers/compress/nitrox/nitrox_comp_reqmgr.c\n@@ -5,11 +5,13 @@\n #include <rte_compressdev_pmd.h>\n #include <rte_errno.h>\n #include <rte_malloc.h>\n+#include <rte_hexdump.h>\n \n #include \"nitrox_comp_reqmgr.h\"\n #include \"nitrox_logs.h\"\n #include \"rte_comp.h\"\n \n+#define NITROX_INSTR_BUFFER_DEBUG 0\n #define NITROX_ZIP_SGL_COUNT 16\n #define NITROX_ZIP_MAX_ZPTRS 2048\n #define NITROX_ZIP_MAX_DATASIZE ((1 << 24) - 1)\n@@ -307,10 +309,222 @@ struct nitrox_softreq {\n \tstruct rte_comp_op *op;\n \tstruct nitrox_sgtable src;\n \tstruct nitrox_sgtable dst;\n-\tstruct nitrox_comp_xform xform;\n \tuint64_t timeout;\n };\n \n+#if NITROX_INSTR_BUFFER_DEBUG\n+static void nitrox_dump_databuf(const char *name, struct rte_mbuf *m,\n+\t\t\t\tuint32_t off, uint32_t datalen)\n+{\n+\tuint32_t mlen;\n+\n+\tif (!rte_log_can_log(nitrox_logtype, RTE_LOG_DEBUG))\n+\t\treturn;\n+\n+\tfor (; m && off > rte_pktmbuf_data_len(m); m = m->next)\n+\t\toff -= rte_pktmbuf_data_len(m);\n+\n+\tmlen = rte_pktmbuf_data_len(m) - off;\n+\tif (datalen <= mlen)\n+\t\tmlen = datalen;\n+\n+\trte_hexdump(stderr, name, rte_pktmbuf_mtod_offset(m, char *, off),\n+\t\t    mlen);\n+\tfor (m = m->next; m && datalen; m = m->next) {\n+\t\tmlen = rte_pktmbuf_data_len(m) < datalen ?\n+\t\t\trte_pktmbuf_data_len(m) : datalen;\n+\t\trte_hexdump(stderr, name, rte_pktmbuf_mtod(m, char *), mlen);\n+\t}\n+\n+\tfprintf(stderr, \"\\n\");\n+}\n+\n+static void nitrox_dump_zip_instr(struct nitrox_zip_instr *instr,\n+\t\t\t\t  union nitrox_zip_zptr *hptr_arr,\n+\t\t\t\t  union nitrox_zip_zptr *iptr_arr,\n+\t\t\t\t  union nitrox_zip_zptr *optr_arr)\n+{\n+\tuint64_t value;\n+\tint i = 0;\n+\n+\tif (!rte_log_can_log(nitrox_logtype, RTE_LOG_DEBUG))\n+\t\treturn;\n+\n+\tfprintf(stderr, \"\\nZIP instruction..(%p)\\n\", instr);\n+\tfprintf(stderr, \"\\tWORD0 = 0x%016\"PRIx64\"\\n\", instr->w0.u64);\n+\tfprintf(stderr, \"\\t\\tTOL        = %d\\n\", instr->w0.tol);\n+\tfprintf(stderr, \"\\t\\tEXNUM      = %d\\n\", instr->w0.exn);\n+\tfprintf(stderr, \"\\t\\tEXBITS     = %x\\n\", instr->w0.exbits);\n+\tfprintf(stderr, \"\\t\\tCA         = %d\\n\", instr->w0.ca);\n+\tfprintf(stderr, \"\\t\\tSF         = %d\\n\", instr->w0.sf);\n+\tfprintf(stderr, \"\\t\\tSS         = %d\\n\", instr->w0.ss);\n+\tfprintf(stderr, \"\\t\\tCC         = %d\\n\", instr->w0.cc);\n+\tfprintf(stderr, \"\\t\\tEF         = %d\\n\", instr->w0.ef);\n+\tfprintf(stderr, \"\\t\\tBF         = %d\\n\", instr->w0.bf);\n+\tfprintf(stderr, \"\\t\\tCO         = %d\\n\", instr->w0.co);\n+\tfprintf(stderr, \"\\t\\tDS         = %d\\n\", instr->w0.ds);\n+\tfprintf(stderr, \"\\t\\tDG         = %d\\n\", instr->w0.dg);\n+\tfprintf(stderr, \"\\t\\tHG         = %d\\n\", instr->w0.hg);\n+\tfprintf(stderr, \"\\n\");\n+\n+\tfprintf(stderr, \"\\tWORD1 = 0x%016\"PRIx64\"\\n\", instr->w1.u64);\n+\tfprintf(stderr, \"\\t\\tHL         = %d\\n\", instr->w1.hl);\n+\tfprintf(stderr, \"\\t\\tADLERCRC32 = 0x%08x\\n\", instr->w1.adlercrc32);\n+\tfprintf(stderr, \"\\n\");\n+\n+\tvalue = instr->w2.cptr;\n+\tfprintf(stderr, \"\\tWORD2 = 0x%016\"PRIx64\"\\n\", instr->w2.u64);\n+\tfprintf(stderr, \"\\t\\tCPTR = 0x%11\"PRIx64\"\\n\", value);\n+\tfprintf(stderr, \"\\n\");\n+\n+\tvalue = instr->w3.hptr;\n+\tfprintf(stderr, \"\\tWORD3 = 0x%016\"PRIx64\"\\n\", instr->w3.u64);\n+\tfprintf(stderr, \"\\t\\tHLEN       = %d\\n\", instr->w3.hlen);\n+\tfprintf(stderr, \"\\t\\tHPTR = 0x%11\"PRIx64\"\\n\", value);\n+\n+\tif (instr->w0.hg && hptr_arr) {\n+\t\tfor (i = 0; i < instr->w3.hlen; i++) {\n+\t\t\tvalue = hptr_arr[i].s.addr;\n+\t\t\tfprintf(stderr, \"\\t\\t\\tZPTR[%d] : Length = %d Addr = 0x%11\"PRIx64\"\\n\",\n+\t\t\t\t     i, hptr_arr[i].s.length, value);\n+\t\t}\n+\t}\n+\n+\tfprintf(stderr, \"\\n\");\n+\n+\tvalue = instr->w4.iptr;\n+\tfprintf(stderr, \"\\tWORD4 = 0x%016\"PRIx64\"\\n\", instr->w4.u64);\n+\tfprintf(stderr, \"\\t\\tILEN       = %d\\n\", instr->w4.ilen);\n+\tfprintf(stderr, \"\\t\\tIPTR       = 0x%11\"PRIx64\"\\n\", value);\n+\tif (instr->w0.dg && iptr_arr) {\n+\t\tfor (i = 0; i < instr->w4.ilen; i++) {\n+\t\t\tvalue = iptr_arr[i].s.addr;\n+\t\t\tfprintf(stderr, \"\\t\\t\\tZPTR[%d] : Length = %d Addr = 0x%11\"PRIx64\"\\n\",\n+\t\t\t\t     i, iptr_arr[i].s.length, value);\n+\t\t}\n+\t}\n+\n+\tfprintf(stderr, \"\\n\");\n+\n+\tvalue = instr->w5.optr;\n+\tfprintf(stderr, \"\\tWORD5 = 0x%016\"PRIx64\"\\n\", instr->w5.u64);\n+\tfprintf(stderr, \"\\t\\t OLEN = %d\\n\", instr->w5.olen);\n+\tfprintf(stderr, \"\\t\\t OPTR = 0x%11\"PRIx64\"\\n\", value);\n+\tif (instr->w0.ds && optr_arr) {\n+\t\tfor (i = 0; i < instr->w5.olen; i++) {\n+\t\t\tvalue = optr_arr[i].s.addr;\n+\t\t\tfprintf(stderr, \"\\t\\t\\tZPTR[%d] : Length = %d Addr = 0x%11\"PRIx64\"\\n\",\n+\t\t\t\t     i, optr_arr[i].s.length, value);\n+\t\t}\n+\t}\n+\n+\tfprintf(stderr, \"\\n\");\n+\n+\tvalue = instr->w6.rptr;\n+\tfprintf(stderr, \"\\tWORD6 = 0x%016\"PRIx64\"\\n\", instr->w6.u64);\n+\tfprintf(stderr, \"\\t\\tRPTR = 0x%11\"PRIx64\"\\n\", value);\n+\tfprintf(stderr, \"\\n\");\n+\n+\tfprintf(stderr, \"\\tWORD7 = 0x%016\"PRIx64\"\\n\", instr->w7.u64);\n+\tfprintf(stderr, \"\\t\\tGRP        = %x\\n\", instr->w7.grp);\n+\tfprintf(stderr, \"\\t\\tADDR_MSB   = 0x%5x\\n\", instr->w7.addr_msb);\n+\tfprintf(stderr, \"\\n\");\n+}\n+\n+static void nitrox_dump_zip_result(struct nitrox_zip_instr *instr,\n+\t\t\t\t   struct nitrox_zip_result *result)\n+{\n+\tif (!rte_log_can_log(nitrox_logtype, RTE_LOG_DEBUG))\n+\t\treturn;\n+\n+\tfprintf(stderr, \"ZIP result..(instr %p)\\n\", instr);\n+\tfprintf(stderr, \"\\tWORD0 = 0x%016\"PRIx64\"\\n\", result->w0.u64);\n+\tfprintf(stderr, \"\\t\\tCRC32          = 0x%8x\\n\", result->w0.crc32);\n+\tfprintf(stderr, \"\\t\\tADLER32        = 0x%8x\\n\", result->w0.adler32);\n+\tfprintf(stderr, \"\\n\");\n+\n+\tfprintf(stderr, \"\\tWORD1 = 0x%016\"PRIx64\"\\n\", result->w1.u64);\n+\tfprintf(stderr, \"\\t\\tTBYTESWRITTEN  = %u\\n\", result->w1.tbyteswritten);\n+\tfprintf(stderr, \"\\t\\tTBYTESREAD     = %u\\n\", result->w1.tbytesread);\n+\tfprintf(stderr, \"\\n\");\n+\n+\tfprintf(stderr, \"\\tWORD2 = 0x%016\"PRIx64\"\\n\", result->w2.u64);\n+\tfprintf(stderr, \"\\t\\tTBITS          = %u\\n\", result->w2.tbits);\n+\tfprintf(stderr, \"\\t\\tEXN            = %d\\n\", result->w2.exn);\n+\tfprintf(stderr, \"\\t\\tEBITS          = %x\\n\", result->w2.exbits);\n+\tfprintf(stderr, \"\\t\\tEF             = %d\\n\", result->w2.ef);\n+\tfprintf(stderr, \"\\t\\tCOMPCODE       = 0x%2x\\n\", result->w2.compcode);\n+\tfprintf(stderr, \"\\n\");\n+}\n+#else\n+#define nitrox_dump_databuf(name, m, off, datalen)\n+#define nitrox_dump_zip_instr(instr, hptr_arr, iptr_arr, optr_arr)\n+#define nitrox_dump_zip_result(instr, result)\n+#endif\n+\n+static int handle_zero_length_compression(struct nitrox_softreq *sr,\n+\t\t\t\t\t  struct nitrox_comp_xform *xform)\n+{\n+\tunion {\n+\t\tuint32_t num;\n+\t\tuint8_t bytes[4];\n+\t} fblk;\n+\tuint32_t dstlen, rlen;\n+\tstruct rte_mbuf *m;\n+\tuint32_t off;\n+\tuint32_t mlen;\n+\tuint32_t i = 0;\n+\tuint8_t *ptr;\n+\n+\tfblk.num = xform->exn ? (xform->exbits & 0x7F) : 0;\n+\tfblk.num |= (0x3 << xform->exn);\n+\tmemset(&sr->zip_res, 0, sizeof(sr->zip_res));\n+\tsr->zip_res.w1.tbytesread = xform->hlen;\n+\tsr->zip_res.w1.tbyteswritten = 2;\n+\tsr->zip_res.w2.ef = 1;\n+\tif (xform->exn == 7)\n+\t\tsr->zip_res.w1.tbyteswritten++;\n+\n+\trlen = sr->zip_res.w1.tbyteswritten;\n+\tdstlen = rte_pktmbuf_pkt_len(sr->op->m_dst) - sr->op->dst.offset;\n+\tif (unlikely(dstlen < rlen))\n+\t\treturn -EIO;\n+\n+\toff = sr->op->dst.offset;\n+\tfor (m = sr->op->m_dst; m && off > rte_pktmbuf_data_len(m); m = m->next)\n+\t\toff -= rte_pktmbuf_data_len(m);\n+\n+\tif (unlikely(!m))\n+\t\treturn -EIO;\n+\n+\tmlen = rte_pktmbuf_data_len(m) - off;\n+\tif (rlen <= mlen)\n+\t\tmlen = rlen;\n+\n+\tptr = rte_pktmbuf_mtod_offset(m, uint8_t *, off);\n+\tmemcpy(ptr, fblk.bytes, mlen);\n+\ti += mlen;\n+\trlen -= mlen;\n+\tfor (m = m->next; m && rlen; m = m->next) {\n+\t\tmlen = rte_pktmbuf_data_len(m) < rlen ?\n+\t\t\trte_pktmbuf_data_len(m) : rlen;\n+\t\tptr = rte_pktmbuf_mtod(m, uint8_t *);\n+\t\tmemcpy(ptr, &fblk.bytes[i], mlen);\n+\t\ti += mlen;\n+\t\trlen -= mlen;\n+\t}\n+\n+\tif (unlikely(rlen != 0))\n+\t\treturn -EIO;\n+\n+\tsr->zip_res.w2.compcode = NITROX_CC_SUCCESS;\n+\tsr->op->status = RTE_COMP_OP_STATUS_SUCCESS;\n+\tsr->zip_res.w0.u64 = rte_cpu_to_be_64(sr->zip_res.w0.u64);\n+\tsr->zip_res.w1.u64 = rte_cpu_to_be_64(sr->zip_res.w1.u64);\n+\tsr->zip_res.w2.u64 = rte_cpu_to_be_64(sr->zip_res.w2.u64);\n+\treturn 0;\n+}\n+\n static int create_sglist_from_mbuf(struct nitrox_sgtable *sgtbl,\n \t\t\t\t   struct rte_mbuf *mbuf, uint32_t off,\n \t\t\t\t   uint32_t datalen, uint8_t extra_segs,\n@@ -398,10 +612,12 @@ static int create_sglist_from_mbuf(struct nitrox_sgtable *sgtbl,\n \treturn 0;\n }\n \n-static int softreq_init(struct nitrox_softreq *sr)\n+static int softreq_init(struct nitrox_softreq *sr,\n+\t\t\tstruct nitrox_comp_xform *xform)\n {\n \tstruct rte_mempool *mp;\n \tint err;\n+\tbool need_decomp_threshold;\n \n \tmp = rte_mempool_from_obj(sr);\n \tif (unlikely(mp == NULL))\n@@ -413,15 +629,17 @@ static int softreq_init(struct nitrox_softreq *sr)\n \tif (unlikely(err))\n \t\treturn err;\n \n+\tneed_decomp_threshold = (sr->op->op_type == RTE_COMP_OP_STATELESS &&\n+\t\t\t\t xform->op == NITROX_COMP_OP_DECOMPRESS);\n \terr = create_sglist_from_mbuf(&sr->dst, sr->op->m_dst,\n \t\t\tsr->op->dst.offset,\n \t\t\trte_pktmbuf_pkt_len(sr->op->m_dst) - sr->op->dst.offset,\n-\t\t\t(sr->xform.op == NITROX_COMP_OP_DECOMPRESS) ? 1 : 0,\n+\t\t\tneed_decomp_threshold ? 1 : 0,\n \t\t\tmp->socket_id);\n \tif (unlikely(err))\n \t\treturn err;\n \n-\tif (sr->xform.op == NITROX_COMP_OP_DECOMPRESS) {\n+\tif (need_decomp_threshold) {\n \t\tstruct nitrox_zip_iova_addr zip_addr;\n \t\tint i;\n \n@@ -459,12 +677,12 @@ static void nitrox_zip_instr_to_b64(struct nitrox_softreq *sr)\n \tinstr->w7.u64 = rte_cpu_to_be_64(instr->w7.u64);\n }\n \n-static int process_zip_stateless(struct nitrox_softreq *sr)\n+static int process_zip_request(struct nitrox_softreq *sr)\n {\n \tstruct nitrox_zip_instr *instr;\n \tstruct nitrox_comp_xform *xform;\n \tstruct nitrox_zip_iova_addr zip_addr;\n-\tuint64_t iptr_msb, optr_msb, rptr_msb;\n+\tuint64_t iptr_msb, optr_msb, rptr_msb, cptr_msb, hptr_msb;\n \tint err;\n \n \txform = sr->op->private_xform;\n@@ -473,7 +691,14 @@ static int process_zip_stateless(struct nitrox_softreq *sr)\n \t\treturn -EINVAL;\n \t}\n \n-\tif (unlikely(xform->op == NITROX_COMP_OP_COMPRESS &&\n+\tif (unlikely(sr->op->op_type == RTE_COMP_OP_STATEFUL &&\n+\t\t     xform->op == NITROX_COMP_OP_COMPRESS &&\n+\t\t     sr->op->flush_flag == RTE_COMP_FLUSH_FINAL &&\n+\t\t     sr->op->src.length == 0))\n+\t\treturn handle_zero_length_compression(sr, xform);\n+\n+\tif (unlikely(sr->op->op_type == RTE_COMP_OP_STATELESS &&\n+\t\t     xform->op == NITROX_COMP_OP_COMPRESS &&\n \t\t     sr->op->flush_flag != RTE_COMP_FLUSH_FULL &&\n \t\t     sr->op->flush_flag != RTE_COMP_FLUSH_FINAL)) {\n \t\tNITROX_LOG(ERR, \"Invalid flush flag %d in stateless op\\n\",\n@@ -481,8 +706,7 @@ static int process_zip_stateless(struct nitrox_softreq *sr)\n \t\treturn -EINVAL;\n \t}\n \n-\tsr->xform = *xform;\n-\terr = softreq_init(sr);\n+\terr = softreq_init(sr, xform);\n \tif (unlikely(err))\n \t\treturn err;\n \n@@ -490,10 +714,11 @@ static int process_zip_stateless(struct nitrox_softreq *sr)\n \tmemset(instr, 0, sizeof(*instr));\n \t/* word 0 */\n \tinstr->w0.tol = sr->dst.total_bytes;\n-\tinstr->w0.exn = 0;\n-\tinstr->w0.exbits = 0;\n+\tinstr->w0.exn = xform->exn;\n+\tinstr->w0.exbits = xform->exbits;\n \tinstr->w0.ca = 0;\n \tif (xform->op == NITROX_COMP_OP_DECOMPRESS ||\n+\t    sr->op->flush_flag == RTE_COMP_FLUSH_SYNC ||\n \t    sr->op->flush_flag == RTE_COMP_FLUSH_FULL)\n \t\tinstr->w0.sf = 1;\n \telse\n@@ -501,13 +726,12 @@ static int process_zip_stateless(struct nitrox_softreq *sr)\n \n \tinstr->w0.ss = xform->level;\n \tinstr->w0.cc = xform->algo;\n-\tif (xform->op == NITROX_COMP_OP_COMPRESS &&\n-\t    sr->op->flush_flag == RTE_COMP_FLUSH_FINAL)\n+\tif (sr->op->flush_flag == RTE_COMP_FLUSH_FINAL)\n \t\tinstr->w0.ef = 1;\n \telse\n \t\tinstr->w0.ef = 0;\n \n-\tinstr->w0.bf = 1;\n+\tinstr->w0.bf = xform->bf;\n \tinstr->w0.co = xform->op;\n \tif (sr->dst.filled_sgls > 1)\n \t\tinstr->w0.ds = 1;\n@@ -522,8 +746,11 @@ static int process_zip_stateless(struct nitrox_softreq *sr)\n \tinstr->w0.hg = 0;\n \n \t/* word 1 */\n-\tinstr->w1.hl = 0;\n-\tif (sr->op->input_chksum != 0)\n+\tinstr->w1.hl = xform->hlen;\n+\tif (sr->op->op_type == RTE_COMP_OP_STATEFUL && !xform->bf)\n+\t\tinstr->w1.adlercrc32 = xform->chksum;\n+\telse if (sr->op->op_type == RTE_COMP_OP_STATELESS &&\n+\t\t sr->op->input_chksum != 0)\n \t\tinstr->w1.adlercrc32 = sr->op->input_chksum;\n \telse if (xform->chksum_type == NITROX_CHKSUM_TYPE_ADLER32)\n \t\tinstr->w1.adlercrc32 = 1;\n@@ -531,11 +758,23 @@ static int process_zip_stateless(struct nitrox_softreq *sr)\n \t\tinstr->w1.adlercrc32 = 0;\n \n \t/* word 2 */\n-\tinstr->w2.cptr = 0;\n+\tif (xform->context)\n+\t\tzip_addr.u64 = rte_malloc_virt2iova(xform->context);\n+\telse\n+\t\tzip_addr.u64 = 0;\n+\n+\tinstr->w2.cptr = zip_addr.zda.addr;\n+\tcptr_msb = zip_addr.zda.addr_msb;\n \n \t/* word 3 */\n-\tinstr->w3.hlen = 0;\n-\tinstr->w3.hptr = 0;\n+\tinstr->w3.hlen = xform->hlen;\n+\tif (xform->history_window)\n+\t\tzip_addr.u64 = rte_malloc_virt2iova(xform->history_window);\n+\telse\n+\t\tzip_addr.u64 = 0;\n+\n+\tinstr->w3.hptr = zip_addr.zda.addr;\n+\thptr_msb = zip_addr.zda.addr_msb;\n \n \t/* word 4 */\n \tif (sr->src.filled_sgls == 1) {\n@@ -568,7 +807,9 @@ static int process_zip_stateless(struct nitrox_softreq *sr)\n \tinstr->w6.rptr = zip_addr.zda.addr;\n \trptr_msb = zip_addr.zda.addr_msb;\n \n-\tif (iptr_msb != optr_msb || iptr_msb != rptr_msb) {\n+\tif (unlikely(iptr_msb != optr_msb || iptr_msb != rptr_msb ||\n+\t    (xform->history_window && (iptr_msb != hptr_msb)) ||\n+\t    (xform->context && (iptr_msb != cptr_msb)))) {\n \t\tNITROX_LOG(ERR, \"addr_msb is not same for all addresses\\n\");\n \t\treturn -ENOTSUP;\n \t}\n@@ -577,32 +818,20 @@ static int process_zip_stateless(struct nitrox_softreq *sr)\n \tinstr->w7.addr_msb = iptr_msb;\n \tinstr->w7.grp = 0;\n \n+\tnitrox_dump_zip_instr(instr, NULL, sr->src.sgl, sr->dst.sgl);\n+\tnitrox_dump_databuf(\"IN\", sr->op->m_src, sr->op->src.offset,\n+\t\t\t    sr->op->src.length);\n \tnitrox_zip_instr_to_b64(sr);\n \treturn 0;\n }\n \n-static int process_zip_request(struct nitrox_softreq *sr)\n-{\n-\tint err;\n-\n-\tswitch (sr->op->op_type) {\n-\tcase RTE_COMP_OP_STATELESS:\n-\t\terr = process_zip_stateless(sr);\n-\t\tbreak;\n-\tdefault:\n-\t\terr = -EINVAL;\n-\t\tbreak;\n-\t}\n-\n-\treturn err;\n-}\n-\n int\n nitrox_process_comp_req(struct rte_comp_op *op, struct nitrox_softreq *sr)\n {\n \tint err;\n \n \tsr->op = op;\n+\tsr->op->status = RTE_COMP_OP_STATUS_NOT_PROCESSED;\n \terr = process_zip_request(sr);\n \tif (unlikely(err))\n \t\tgoto err_exit;\n@@ -628,55 +857,239 @@ static struct nitrox_zip_result zip_result_to_cpu64(struct nitrox_zip_result *r)\n \treturn out_res;\n }\n \n-int\n-nitrox_check_comp_req(struct nitrox_softreq *sr, struct rte_comp_op **op)\n+static int post_process_zip_stateless(struct nitrox_softreq *sr,\n+\t\t\t\t      struct nitrox_comp_xform *xform,\n+\t\t\t\t      struct nitrox_zip_result *zip_res)\n {\n-\tstruct nitrox_zip_result zip_res;\n \tint output_unused_bytes;\n-\tint err = 0;\n-\n-\tzip_res = zip_result_to_cpu64(&sr->zip_res);\n-\tif (zip_res.w2.compcode == NITROX_CC_NOTDONE) {\n-\t\tif (rte_get_timer_cycles() >= sr->timeout) {\n-\t\t\tNITROX_LOG(ERR, \"Op timedout\\n\");\n-\t\t\tsr->op->status = RTE_COMP_OP_STATUS_ERROR;\n-\t\t\terr = -ETIMEDOUT;\n-\t\t\tgoto exit;\n-\t\t} else {\n-\t\t\treturn -EAGAIN;\n-\t\t}\n-\t}\n \n-\tif (unlikely(zip_res.w2.compcode != NITROX_CC_SUCCESS)) {\n+\tif (unlikely(zip_res->w2.compcode != NITROX_CC_SUCCESS)) {\n \t\tstruct rte_comp_op *op = sr->op;\n \n-\t\tNITROX_LOG(ERR, \"Op dequeue error 0x%x\\n\",\n-\t\t\t   zip_res.w2.compcode);\n-\t\tif (zip_res.w2.compcode == NITROX_CC_STOP ||\n-\t\t    zip_res.w2.compcode == NITROX_CC_DTRUNC)\n+\t\tNITROX_LOG(ERR, \"Dequeue error 0x%x\\n\",\n+\t\t\t   zip_res->w2.compcode);\n+\t\tif (zip_res->w2.compcode == NITROX_CC_STOP ||\n+\t\t    zip_res->w2.compcode == NITROX_CC_DTRUNC)\n \t\t\top->status = RTE_COMP_OP_STATUS_OUT_OF_SPACE_TERMINATED;\n \t\telse\n \t\t\top->status = RTE_COMP_OP_STATUS_ERROR;\n \n \t\top->consumed = 0;\n \t\top->produced = 0;\n-\t\terr = -EFAULT;\n-\t\tgoto exit;\n+\t\treturn -EFAULT;\n \t}\n \n-\toutput_unused_bytes = sr->dst.total_bytes - zip_res.w1.tbyteswritten;\n-\tif (unlikely(sr->xform.op == NITROX_COMP_OP_DECOMPRESS &&\n+\toutput_unused_bytes = sr->dst.total_bytes - zip_res->w1.tbyteswritten;\n+\tif (unlikely(xform->op == NITROX_COMP_OP_DECOMPRESS &&\n \t\t     output_unused_bytes < NITROX_ZIP_MAX_ONFSIZE)) {\n \t\tNITROX_LOG(ERR, \"TOL %d, Total bytes written %d\\n\",\n-\t\t\t   sr->dst.total_bytes, zip_res.w1.tbyteswritten);\n+\t\t\t   sr->dst.total_bytes, zip_res->w1.tbyteswritten);\n \t\tsr->op->status = RTE_COMP_OP_STATUS_OUT_OF_SPACE_TERMINATED;\n \t\tsr->op->consumed = 0;\n \t\tsr->op->produced = sr->dst.total_bytes - NITROX_ZIP_MAX_ONFSIZE;\n-\t\terr = -EIO;\n-\t\tgoto exit;\n+\t\treturn -EIO;\n+\t}\n+\n+\tif (xform->chksum_type == NITROX_CHKSUM_TYPE_CRC32)\n+\t\tsr->op->output_chksum = zip_res->w0.crc32;\n+\telse if (xform->chksum_type == NITROX_CHKSUM_TYPE_ADLER32)\n+\t\tsr->op->output_chksum = zip_res->w0.adler32;\n+\n+\tsr->op->consumed = RTE_MIN(sr->op->src.length,\n+\t\t\t\t   (uint32_t)zip_res->w1.tbytesread);\n+\tsr->op->produced = zip_res->w1.tbyteswritten;\n+\tsr->op->status = RTE_COMP_OP_STATUS_SUCCESS;\n+\treturn 0;\n+}\n+\n+static int update_history(struct rte_mbuf *mbuf, uint32_t off, uint16_t datalen,\n+\t\t\t   uint8_t *dst)\n+{\n+\tstruct rte_mbuf *m;\n+\tuint32_t mlen;\n+\tuint16_t copied = 0;\n+\n+\tfor (m = mbuf; m && off > rte_pktmbuf_data_len(m); m = m->next)\n+\t\toff -= rte_pktmbuf_data_len(m);\n+\n+\tif (unlikely(!m)) {\n+\t\tNITROX_LOG(ERR, \"Failed to update history. Invalid mbuf\\n\");\n+\t\treturn -EINVAL;\n+\t}\n+\n+\tmlen = rte_pktmbuf_data_len(m) - off;\n+\tif (datalen <= mlen)\n+\t\tmlen = datalen;\n+\n+\tmemcpy(&dst[copied], rte_pktmbuf_mtod_offset(m, char *, off), mlen);\n+\tcopied += mlen;\n+\tdatalen -= mlen;\n+\tfor (m = m->next; m && datalen; m = m->next) {\n+\t\tmlen = rte_pktmbuf_data_len(m) < datalen ?\n+\t\t\trte_pktmbuf_data_len(m) : datalen;\n+\t\tmemcpy(&dst[copied], rte_pktmbuf_mtod(m, char *), mlen);\n+\t\tcopied += mlen;\n+\t\tdatalen -= mlen;\n+\t}\n+\n+\tif (unlikely(datalen != 0)) {\n+\t\tNITROX_LOG(ERR, \"Failed to update history. Invalid datalen\\n\");\n+\t\treturn -EINVAL;\n+\t}\n+\n+\treturn 0;\n+}\n+\n+static void reset_nitrox_xform(struct nitrox_comp_xform *xform)\n+{\n+\txform->hlen = 0;\n+\txform->exn = 0;\n+\txform->exbits = 0;\n+\txform->bf = true;\n+}\n+\n+static int post_process_zip_stateful(struct nitrox_softreq *sr,\n+\t\t\t\t     struct nitrox_comp_xform *xform,\n+\t\t\t\t     struct nitrox_zip_result *zip_res)\n+{\n+\tuint32_t bytesread = 0;\n+\tuint32_t chksum = 0;\n+\n+\tif (unlikely(zip_res->w2.compcode == NITROX_CC_DTRUNC)) {\n+\t\tsr->op->consumed = 0;\n+\t\tsr->op->produced = 0;\n+\t\txform->hlen = 0;\n+\t\tsr->op->status = RTE_COMP_OP_STATUS_OUT_OF_SPACE_RECOVERABLE;\n+\t\tNITROX_LOG(ERR, \"Dequeue compress DTRUNC error\\n\");\n+\t\treturn 0;\n+\t} else if (unlikely(zip_res->w2.compcode == NITROX_CC_STOP)) {\n+\t\tsr->op->status = RTE_COMP_OP_STATUS_OUT_OF_SPACE_RECOVERABLE;\n+\t\tNITROX_LOG(NOTICE, \"Dequeue decompress dynamic STOP\\n\");\n+\t} else if (zip_res->w2.compcode == NITROX_CC_SUCCESS) {\n+\t\tsr->op->status = RTE_COMP_OP_STATUS_SUCCESS;\n+\t} else {\n+\t\txform->hlen = 0;\n+\t\txform->exn = 0;\n+\t\txform->exbits = 0;\n+\t\txform->bf = true;\n+\t\tsr->op->status = RTE_COMP_OP_STATUS_ERROR;\n+\t\tNITROX_LOG(ERR, \"Dequeue error 0x%x\\n\",\n+\t\t\t   zip_res->w2.compcode);\n+\t\treturn -EFAULT;\n+\t}\n+\n+\tif (xform->op == NITROX_COMP_OP_COMPRESS) {\n+\t\tif (zip_res->w1.tbytesread < xform->hlen) {\n+\t\t\tNITROX_LOG(ERR, \"Invalid bytesread\\n\");\n+\t\t\treset_nitrox_xform(xform);\n+\t\t\tsr->op->status = RTE_COMP_OP_STATUS_ERROR;\n+\t\t\treturn -EFAULT;\n+\t\t}\n+\n+\t\tbytesread = zip_res->w1.tbytesread - xform->hlen;\n+\t} else {\n+\t\tbytesread = RTE_MIN(sr->op->src.length,\n+\t\t\t\t    (uint32_t)zip_res->w1.tbytesread);\n+\t}\n+\n+\tif ((xform->op == NITROX_COMP_OP_COMPRESS &&\n+\t    (sr->op->flush_flag == RTE_COMP_FLUSH_NONE ||\n+\t    sr->op->flush_flag == RTE_COMP_FLUSH_SYNC)) ||\n+\t    (xform->op == NITROX_COMP_OP_DECOMPRESS && !zip_res->w2.ef)) {\n+\t\tstruct rte_mbuf *mbuf;\n+\t\tuint32_t pktlen, m_off;\n+\t\tint err;\n+\n+\t\tif (xform->op == NITROX_COMP_OP_COMPRESS) {\n+\t\t\tmbuf = sr->op->m_src;\n+\t\t\tpktlen = bytesread;\n+\t\t\tm_off = sr->op->src.offset;\n+\t\t} else {\n+\t\t\tmbuf = sr->op->m_dst;\n+\t\t\tpktlen = zip_res->w1.tbyteswritten;\n+\t\t\tm_off = sr->op->dst.offset;\n+\t\t}\n+\n+\t\tif (pktlen >= xform->window_size) {\n+\t\t\tm_off += pktlen - xform->window_size;\n+\t\t\terr = update_history(mbuf, m_off, xform->window_size,\n+\t\t\t\t       xform->history_window);\n+\t\t\txform->hlen = xform->window_size;\n+\t\t} else if ((xform->hlen + pktlen) <= xform->window_size) {\n+\t\t\terr = update_history(mbuf, m_off, pktlen,\n+\t\t\t\t       &xform->history_window[xform->hlen]);\n+\t\t\txform->hlen += pktlen;\n+\t\t} else {\n+\t\t\tuint16_t shift_off, shift_len;\n+\n+\t\t\tshift_off = pktlen + xform->hlen - xform->window_size;\n+\t\t\tshift_len = xform->hlen - shift_off;\n+\t\t\tmemmove(xform->history_window,\n+\t\t\t\t&xform->history_window[shift_off],\n+\t\t\t\tshift_len);\n+\t\t\terr = update_history(mbuf, m_off, pktlen,\n+\t\t\t\t       &xform->history_window[shift_len]);\n+\t\t\txform->hlen = xform->window_size;\n+\n+\t\t}\n+\n+\t\tif (unlikely(err)) {\n+\t\t\tsr->op->status = RTE_COMP_OP_STATUS_ERROR;\n+\t\t\treturn err;\n+\t\t}\n+\n+\t\tif (xform->op == NITROX_COMP_OP_COMPRESS) {\n+\t\t\txform->exn = zip_res->w2.exn;\n+\t\t\txform->exbits = zip_res->w2.exbits;\n+\t\t}\n+\n+\t\txform->bf = false;\n+\t} else {\n+\t\treset_nitrox_xform(xform);\n \t}\n \n-\tif (sr->xform.op == NITROX_COMP_OP_COMPRESS &&\n+\tif (xform->chksum_type == NITROX_CHKSUM_TYPE_CRC32)\n+\t\tchksum = zip_res->w0.crc32;\n+\telse if (xform->chksum_type == NITROX_CHKSUM_TYPE_ADLER32)\n+\t\tchksum = zip_res->w0.adler32;\n+\n+\tif (xform->bf)\n+\t\tsr->op->output_chksum = chksum;\n+\telse\n+\t\txform->chksum = chksum;\n+\n+\tsr->op->consumed = bytesread;\n+\tsr->op->produced = zip_res->w1.tbyteswritten;\n+\treturn 0;\n+}\n+\n+int\n+nitrox_check_comp_req(struct nitrox_softreq *sr, struct rte_comp_op **op)\n+{\n+\tstruct nitrox_zip_result zip_res;\n+\tstruct nitrox_comp_xform *xform;\n+\tint err = 0;\n+\n+\tzip_res = zip_result_to_cpu64(&sr->zip_res);\n+\tif (zip_res.w2.compcode == NITROX_CC_NOTDONE) {\n+\t\tif (rte_get_timer_cycles() >= sr->timeout) {\n+\t\t\tNITROX_LOG(ERR, \"Op timedout\\n\");\n+\t\t\tsr->op->status = RTE_COMP_OP_STATUS_ERROR;\n+\t\t\terr = -ETIMEDOUT;\n+\t\t\tgoto exit;\n+\t\t} else {\n+\t\t\treturn -EAGAIN;\n+\t\t}\n+\t}\n+\n+\txform = sr->op->private_xform;\n+\tif (sr->op->op_type == RTE_COMP_OP_STATELESS)\n+\t\terr = post_process_zip_stateless(sr, xform, &zip_res);\n+\telse\n+\t\terr = post_process_zip_stateful(sr, xform, &zip_res);\n+\n+\tif (sr->op->status == RTE_COMP_OP_STATUS_SUCCESS &&\n+\t    xform->op == NITROX_COMP_OP_COMPRESS &&\n \t    sr->op->flush_flag == RTE_COMP_FLUSH_FINAL &&\n \t    zip_res.w2.exn) {\n \t\tuint32_t datalen = zip_res.w1.tbyteswritten;\n@@ -696,17 +1109,11 @@ nitrox_check_comp_req(struct nitrox_softreq *sr, struct rte_comp_op **op)\n \t\t*last_byte = zip_res.w2.exbits & 0xFF;\n \t}\n \n-\tsr->op->consumed = zip_res.w1.tbytesread;\n-\tsr->op->produced = zip_res.w1.tbyteswritten;\n-\tif (sr->xform.chksum_type == NITROX_CHKSUM_TYPE_CRC32)\n-\t\tsr->op->output_chksum = zip_res.w0.crc32;\n-\telse if (sr->xform.chksum_type == NITROX_CHKSUM_TYPE_ADLER32)\n-\t\tsr->op->output_chksum = zip_res.w0.adler32;\n-\n-\tsr->op->status = RTE_COMP_OP_STATUS_SUCCESS;\n-\terr = 0;\n exit:\n \t*op = sr->op;\n+\tnitrox_dump_zip_result(&sr->instr, &zip_res);\n+\tnitrox_dump_databuf(\"OUT after\", sr->op->m_dst, sr->op->dst.offset,\n+\t\tsr->op->produced);\n \treturn err;\n }\n \ndiff --git a/drivers/compress/nitrox/nitrox_comp_reqmgr.h b/drivers/compress/nitrox/nitrox_comp_reqmgr.h\nindex 07c65f0d5e..f0cd1eb8fd 100644\n--- a/drivers/compress/nitrox/nitrox_comp_reqmgr.h\n+++ b/drivers/compress/nitrox/nitrox_comp_reqmgr.h\n@@ -37,6 +37,14 @@ struct nitrox_comp_xform {\n \tenum nitrox_comp_algo algo;\n \tenum nitrox_comp_level level;\n \tenum nitrox_chksum_type chksum_type;\n+\tuint8_t *context;\n+\tuint8_t *history_window;\n+\tuint32_t chksum;\n+\tuint16_t window_size;\n+\tuint16_t hlen;\n+\tuint8_t exn;\n+\tuint8_t exbits;\n+\tbool bf;\n };\n \n int nitrox_process_comp_req(struct rte_comp_op *op, struct nitrox_softreq *sr);\n",
    "prefixes": [
        "v3",
        "7/7"
    ]
}