get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 131941,
    "url": "http://patches.dpdk.org/api/patches/131941/?format=api",
    "web_url": "http://patches.dpdk.org/project/dpdk/patch/20230926103233.3956431-4-amitprakashs@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": "<20230926103233.3956431-4-amitprakashs@marvell.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/20230926103233.3956431-4-amitprakashs@marvell.com",
    "date": "2023-09-26T10:32:24",
    "name": "[v4,03/12] eventdev: create and free API for DMA adapter",
    "commit_ref": null,
    "pull_url": null,
    "state": "superseded",
    "archived": true,
    "hash": "979a268fa0b017cd23cb4b3fb9c314eb5e384654",
    "submitter": {
        "id": 2699,
        "url": "http://patches.dpdk.org/api/people/2699/?format=api",
        "name": "Amit Prakash Shukla",
        "email": "amitprakashs@marvell.com"
    },
    "delegate": {
        "id": 310,
        "url": "http://patches.dpdk.org/api/users/310/?format=api",
        "username": "jerin",
        "first_name": "Jerin",
        "last_name": "Jacob",
        "email": "jerinj@marvell.com"
    },
    "mbox": "http://patches.dpdk.org/project/dpdk/patch/20230926103233.3956431-4-amitprakashs@marvell.com/mbox/",
    "series": [
        {
            "id": 29634,
            "url": "http://patches.dpdk.org/api/series/29634/?format=api",
            "web_url": "http://patches.dpdk.org/project/dpdk/list/?series=29634",
            "date": "2023-09-26T10:32:21",
            "name": "event DMA adapter library support",
            "version": 4,
            "mbox": "http://patches.dpdk.org/series/29634/mbox/"
        }
    ],
    "comments": "http://patches.dpdk.org/api/patches/131941/comments/",
    "check": "warning",
    "checks": "http://patches.dpdk.org/api/patches/131941/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 7987742642;\n\tTue, 26 Sep 2023 12:33:16 +0200 (CEST)",
            "from mails.dpdk.org (localhost [127.0.0.1])\n\tby mails.dpdk.org (Postfix) with ESMTP id 31AB7402E8;\n\tTue, 26 Sep 2023 12:33:11 +0200 (CEST)",
            "from mx0b-0016f401.pphosted.com (mx0b-0016f401.pphosted.com\n [67.231.156.173])\n by mails.dpdk.org (Postfix) with ESMTP id 88387402E0\n for <dev@dpdk.org>; Tue, 26 Sep 2023 12:33:09 +0200 (CEST)",
            "from pps.filterd (m0045851.ppops.net [127.0.0.1])\n by mx0b-0016f401.pphosted.com (8.17.1.19/8.17.1.19) with ESMTP id\n 38Q6gkYM032209; Tue, 26 Sep 2023 03:33:09 -0700",
            "from dc5-exch01.marvell.com ([199.233.59.181])\n by mx0b-0016f401.pphosted.com (PPS) with ESMTPS id 3t9yhm0h9c-1\n (version=TLSv1.2 cipher=ECDHE-RSA-AES256-SHA384 bits=256 verify=NOT);\n Tue, 26 Sep 2023 03:33:08 -0700",
            "from DC5-EXCH02.marvell.com (10.69.176.39) by DC5-EXCH01.marvell.com\n (10.69.176.38) with Microsoft SMTP Server (TLS) id 15.0.1497.48;\n Tue, 26 Sep 2023 03:33:06 -0700",
            "from maili.marvell.com (10.69.176.80) by DC5-EXCH02.marvell.com\n (10.69.176.39) with Microsoft SMTP Server id 15.0.1497.48 via Frontend\n Transport; Tue, 26 Sep 2023 03:33:06 -0700",
            "from localhost.localdomain (unknown [10.28.36.157])\n by maili.marvell.com (Postfix) with ESMTP id F10183F70BC;\n Tue, 26 Sep 2023 03:33:01 -0700 (PDT)"
        ],
        "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed; d=marvell.com;\n h=from : to : cc :\n subject : date : message-id : in-reply-to : references : mime-version :\n content-transfer-encoding : content-type; s=pfpt0220;\n bh=YlinoGCHorOi0K0nPWOwz0luvLg0avIe3WV0JPkbWQc=;\n b=OEW/o0opfS4e+GlwFkeiR69pFy+C6X0jj457mPXMHkfobHDbF/vSWXT4uUbE1XTHmWqE\n itBu1OeAwRwFiC8pyXo4LV90aDg/jHdTodPcc1sViKdApSQ+W+D5tiWoNzJ2uPop6D1U\n rr+f+5mBCiGBEr/P8M+jlUHmERTBepslwCLKXtSKUlqgdVto6lIJUBrZlX7yFw5RiLtg\n n29EzStc/fOByBUrI1PjnzR4xPQvKIanICPD79kKlvGnWr1LsZ+gGWzocAJnz6vJFPTf\n zitQtWzeEi6n+08EDalC/5MuVpV//IyktAJGOy+j4++A/Mv4FvoRnZbwhIlgDfKv3ssd BQ==",
        "From": "Amit Prakash Shukla <amitprakashs@marvell.com>",
        "To": "Bruce Richardson <bruce.richardson@intel.com>, Jerin Jacob\n <jerinj@marvell.com>, Amit Prakash Shukla <amitprakashs@marvell.com>",
        "CC": "<dev@dpdk.org>, <fengchengwen@huawei.com>, <kevin.laatz@intel.com>,\n <conor.walsh@intel.com>, <vattunuru@marvell.com>, <g.singh@nxp.com>,\n <sachin.saxena@oss.nxp.com>, <hemant.agrawal@nxp.com>,\n <cheng1.jiang@intel.com>, <ndabilpuram@marvell.com>,\n <anoobj@marvell.com>, <mb@smartsharesystems.com>",
        "Subject": "[PATCH v4 03/12] eventdev: create and free API for DMA adapter",
        "Date": "Tue, 26 Sep 2023 16:02:24 +0530",
        "Message-ID": "<20230926103233.3956431-4-amitprakashs@marvell.com>",
        "X-Mailer": "git-send-email 2.25.1",
        "In-Reply-To": "<20230926103233.3956431-1-amitprakashs@marvell.com>",
        "References": "<20230923133449.3780841-1-amitprakashs@marvell.com>\n <20230926103233.3956431-1-amitprakashs@marvell.com>",
        "MIME-Version": "1.0",
        "Content-Transfer-Encoding": "8bit",
        "Content-Type": "text/plain",
        "X-Proofpoint-GUID": "wTa0zDphQF83RNOgicAt0h0yW2IC_TQb",
        "X-Proofpoint-ORIG-GUID": "wTa0zDphQF83RNOgicAt0h0yW2IC_TQb",
        "X-Proofpoint-Virus-Version": "vendor=baseguard\n engine=ICAP:2.0.267,Aquarius:18.0.980,Hydra:6.0.619,FMLib:17.11.176.26\n definitions=2023-09-26_07,2023-09-25_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": "Added API support to create and free DMA adapter. Create function shall be\ncalled with event device to be associated with the adapter and port\nconfiguration to setup an event port.\n\nSigned-off-by: Amit Prakash Shukla <amitprakashs@marvell.com>\n---\n config/rte_config.h                  |   1 +\n lib/eventdev/meson.build             |   1 +\n lib/eventdev/rte_event_dma_adapter.c | 335 +++++++++++++++++++++++++++\n 3 files changed, 337 insertions(+)\n create mode 100644 lib/eventdev/rte_event_dma_adapter.c",
    "diff": "diff --git a/config/rte_config.h b/config/rte_config.h\nindex 400e44e3cf..401727703f 100644\n--- a/config/rte_config.h\n+++ b/config/rte_config.h\n@@ -77,6 +77,7 @@\n #define RTE_EVENT_ETH_INTR_RING_SIZE 1024\n #define RTE_EVENT_CRYPTO_ADAPTER_MAX_INSTANCE 32\n #define RTE_EVENT_ETH_TX_ADAPTER_MAX_INSTANCE 32\n+#define RTE_EVENT_DMA_ADAPTER_MAX_INSTANCE 32\n \n /* rawdev defines */\n #define RTE_RAWDEV_MAX_DEVS 64\ndiff --git a/lib/eventdev/meson.build b/lib/eventdev/meson.build\nindex b46bbbc9aa..250abcb154 100644\n--- a/lib/eventdev/meson.build\n+++ b/lib/eventdev/meson.build\n@@ -17,6 +17,7 @@ sources = files(\n         'eventdev_private.c',\n         'eventdev_trace_points.c',\n         'rte_event_crypto_adapter.c',\n+        'rte_event_dma_adapter.c',\n         'rte_event_eth_rx_adapter.c',\n         'rte_event_eth_tx_adapter.c',\n         'rte_event_ring.c',\ndiff --git a/lib/eventdev/rte_event_dma_adapter.c b/lib/eventdev/rte_event_dma_adapter.c\nnew file mode 100644\nindex 0000000000..c7ffba1b47\n--- /dev/null\n+++ b/lib/eventdev/rte_event_dma_adapter.c\n@@ -0,0 +1,335 @@\n+/* SPDX-License-Identifier: BSD-3-Clause\n+ * Copyright (c) 2023 Marvell.\n+ */\n+\n+#include \"rte_eventdev.h\"\n+#include \"eventdev_pmd.h\"\n+#include \"rte_event_dma_adapter.h\"\n+\n+#define DMA_BATCH_SIZE 32\n+#define DMA_DEFAULT_MAX_NB 128\n+#define DMA_ADAPTER_NAME_LEN 32\n+#define DMA_ADAPTER_BUFFER_SIZE 1024\n+\n+#define DMA_ADAPTER_OPS_BUFFER_SIZE (DMA_BATCH_SIZE + DMA_BATCH_SIZE)\n+\n+#define DMA_ADAPTER_ARRAY \"event_dma_adapter_array\"\n+\n+/* Macros to check for valid adapter */\n+#define EVENT_DMA_ADAPTER_ID_VALID_OR_ERR_RET(id, retval) \\\n+\tdo { \\\n+\t\tif (!edma_adapter_valid_id(id)) { \\\n+\t\t\tRTE_EDEV_LOG_ERR(\"Invalid DMA adapter id = %d\\n\", id); \\\n+\t\t\treturn retval; \\\n+\t\t} \\\n+\t} while (0)\n+\n+/* DMA ops circular buffer */\n+struct dma_ops_circular_buffer {\n+\t/* Index of head element */\n+\tuint16_t head;\n+\n+\t/* Index of tail element */\n+\tuint16_t tail;\n+\n+\t/* Number of elements in buffer */\n+\tuint16_t count;\n+\n+\t/* Size of circular buffer */\n+\tuint16_t size;\n+\n+\t/* Pointer to hold rte_event_dma_adapter_op for processing */\n+\tstruct rte_event_dma_adapter_op **op_buffer;\n+} __rte_cache_aligned;\n+\n+/* DMA device information */\n+struct dma_device_info {\n+\t/* Number of vchans configured for a DMA device. */\n+\tuint16_t num_dma_dev_vchan;\n+} __rte_cache_aligned;\n+\n+struct event_dma_adapter {\n+\t/* Event device identifier */\n+\tuint8_t eventdev_id;\n+\n+\t/* Event port identifier */\n+\tuint8_t event_port_id;\n+\n+\t/* Adapter mode */\n+\tenum rte_event_dma_adapter_mode mode;\n+\n+\t/* Memory allocation name */\n+\tchar mem_name[DMA_ADAPTER_NAME_LEN];\n+\n+\t/* Socket identifier cached from eventdev */\n+\tint socket_id;\n+\n+\t/* Lock to serialize config updates with service function */\n+\trte_spinlock_t lock;\n+\n+\t/* DMA device structure array */\n+\tstruct dma_device_info *dma_devs;\n+\n+\t/* Circular buffer for processing DMA ops to eventdev */\n+\tstruct dma_ops_circular_buffer ebuf;\n+\n+\t/* Configuration callback for rte_service configuration */\n+\trte_event_dma_adapter_conf_cb conf_cb;\n+\n+\t/* Configuration callback argument */\n+\tvoid *conf_arg;\n+\n+\t/* Set if  default_cb is being used */\n+\tint default_cb_arg;\n+} __rte_cache_aligned;\n+\n+static struct event_dma_adapter **event_dma_adapter;\n+\n+static inline int\n+edma_adapter_valid_id(uint8_t id)\n+{\n+\treturn id < RTE_EVENT_DMA_ADAPTER_MAX_INSTANCE;\n+}\n+\n+static inline struct event_dma_adapter *\n+edma_id_to_adapter(uint8_t id)\n+{\n+\treturn event_dma_adapter ? event_dma_adapter[id] : NULL;\n+}\n+\n+static int\n+edma_array_init(void)\n+{\n+\tconst struct rte_memzone *mz;\n+\tuint32_t sz;\n+\n+\tmz = rte_memzone_lookup(DMA_ADAPTER_ARRAY);\n+\tif (mz == NULL) {\n+\t\tsz = sizeof(struct event_dma_adapter *) * RTE_EVENT_DMA_ADAPTER_MAX_INSTANCE;\n+\t\tsz = RTE_ALIGN(sz, RTE_CACHE_LINE_SIZE);\n+\n+\t\tmz = rte_memzone_reserve_aligned(DMA_ADAPTER_ARRAY, sz, rte_socket_id(), 0,\n+\t\t\t\t\t\t RTE_CACHE_LINE_SIZE);\n+\t\tif (mz == NULL) {\n+\t\t\tRTE_EDEV_LOG_ERR(\"Failed to reserve memzone : %s, err = %d\",\n+\t\t\t\t\t DMA_ADAPTER_ARRAY, rte_errno);\n+\t\t\treturn -rte_errno;\n+\t\t}\n+\t}\n+\n+\tevent_dma_adapter = mz->addr;\n+\n+\treturn 0;\n+}\n+\n+static inline int\n+edma_circular_buffer_init(const char *name, struct dma_ops_circular_buffer *buf, uint16_t sz)\n+{\n+\tbuf->op_buffer = rte_zmalloc(name, sizeof(struct rte_event_dma_adapter_op *) * sz, 0);\n+\tif (buf->op_buffer == NULL)\n+\t\treturn -ENOMEM;\n+\n+\tbuf->size = sz;\n+\n+\treturn 0;\n+}\n+\n+static inline void\n+edma_circular_buffer_free(struct dma_ops_circular_buffer *buf)\n+{\n+\trte_free(buf->op_buffer);\n+}\n+\n+static int\n+edma_default_config_cb(uint8_t id, uint8_t evdev_id, struct rte_event_dma_adapter_conf *conf,\n+\t\t       void *arg)\n+{\n+\tstruct rte_event_port_conf *port_conf;\n+\tstruct rte_event_dev_config dev_conf;\n+\tstruct event_dma_adapter *adapter;\n+\tstruct rte_eventdev *dev;\n+\tuint8_t port_id;\n+\tint started;\n+\tint ret;\n+\n+\tadapter = edma_id_to_adapter(id);\n+\tif (adapter == NULL)\n+\t\treturn -EINVAL;\n+\n+\tdev = &rte_eventdevs[adapter->eventdev_id];\n+\tdev_conf = dev->data->dev_conf;\n+\n+\tstarted = dev->data->dev_started;\n+\tif (started)\n+\t\trte_event_dev_stop(evdev_id);\n+\n+\tport_id = dev_conf.nb_event_ports;\n+\tdev_conf.nb_event_ports += 1;\n+\n+\tport_conf = arg;\n+\tif (port_conf->event_port_cfg & RTE_EVENT_PORT_CFG_SINGLE_LINK)\n+\t\tdev_conf.nb_single_link_event_port_queues += 1;\n+\n+\tret = rte_event_dev_configure(evdev_id, &dev_conf);\n+\tif (ret) {\n+\t\tRTE_EDEV_LOG_ERR(\"Failed to configure event dev %u\\n\", evdev_id);\n+\t\tif (started) {\n+\t\t\tif (rte_event_dev_start(evdev_id))\n+\t\t\t\treturn -EIO;\n+\t\t}\n+\t\treturn ret;\n+\t}\n+\n+\tret = rte_event_port_setup(evdev_id, port_id, port_conf);\n+\tif (ret) {\n+\t\tRTE_EDEV_LOG_ERR(\"Failed to setup event port %u\\n\", port_id);\n+\t\treturn ret;\n+\t}\n+\n+\tconf->event_port_id = port_id;\n+\tconf->max_nb = DMA_DEFAULT_MAX_NB;\n+\tif (started)\n+\t\tret = rte_event_dev_start(evdev_id);\n+\n+\tadapter->default_cb_arg = 1;\n+\tadapter->event_port_id = conf->event_port_id;\n+\n+\treturn ret;\n+}\n+\n+int\n+rte_event_dma_adapter_create_ext(uint8_t id, uint8_t evdev_id,\n+\t\t\t\t rte_event_dma_adapter_conf_cb conf_cb,\n+\t\t\t\t enum rte_event_dma_adapter_mode mode, void *conf_arg)\n+{\n+\tstruct rte_event_dev_info dev_info;\n+\tstruct event_dma_adapter *adapter;\n+\tchar name[DMA_ADAPTER_NAME_LEN];\n+\tstruct rte_dma_info info;\n+\tuint16_t num_dma_dev;\n+\tint socket_id;\n+\tuint8_t i;\n+\tint ret;\n+\n+\tEVENT_DMA_ADAPTER_ID_VALID_OR_ERR_RET(id, -EINVAL);\n+\tRTE_EVENTDEV_VALID_DEVID_OR_ERR_RET(evdev_id, -EINVAL);\n+\n+\tif (conf_cb == NULL)\n+\t\treturn -EINVAL;\n+\n+\tif (event_dma_adapter == NULL) {\n+\t\tret = edma_array_init();\n+\t\tif (ret)\n+\t\t\treturn ret;\n+\t}\n+\n+\tadapter = edma_id_to_adapter(id);\n+\tif (adapter != NULL) {\n+\t\tRTE_EDEV_LOG_ERR(\"ML adapter ID %d already exists!\", id);\n+\t\treturn -EEXIST;\n+\t}\n+\n+\tsocket_id = rte_event_dev_socket_id(evdev_id);\n+\tsnprintf(name, DMA_ADAPTER_NAME_LEN, \"rte_event_dma_adapter_%d\", id);\n+\tadapter = rte_zmalloc_socket(name, sizeof(struct event_dma_adapter), RTE_CACHE_LINE_SIZE,\n+\t\t\t\t     socket_id);\n+\tif (adapter == NULL) {\n+\t\tRTE_EDEV_LOG_ERR(\"Failed to get mem for event ML adapter!\");\n+\t\treturn -ENOMEM;\n+\t}\n+\n+\tif (edma_circular_buffer_init(\"edma_circular_buffer\", &adapter->ebuf,\n+\t\t\t\t      DMA_ADAPTER_BUFFER_SIZE)) {\n+\t\tRTE_EDEV_LOG_ERR(\"Failed to get memory for event adapter circular buffer\");\n+\t\trte_free(adapter);\n+\t\treturn -ENOMEM;\n+\t}\n+\n+\tret = rte_event_dev_info_get(evdev_id, &dev_info);\n+\tif (ret < 0) {\n+\t\tRTE_EDEV_LOG_ERR(\"Failed to get info for eventdev %d: %s\", evdev_id,\n+\t\t\t\t dev_info.driver_name);\n+\t\tedma_circular_buffer_free(&adapter->ebuf);\n+\t\trte_free(adapter);\n+\t\treturn ret;\n+\t}\n+\n+\tnum_dma_dev = rte_dma_count_avail();\n+\n+\tadapter->eventdev_id = evdev_id;\n+\tadapter->mode = mode;\n+\tstrcpy(adapter->mem_name, name);\n+\tadapter->socket_id = socket_id;\n+\tadapter->conf_cb = conf_cb;\n+\tadapter->conf_arg = conf_arg;\n+\tadapter->dma_devs = rte_zmalloc_socket(adapter->mem_name,\n+\t\t\t\t\t       num_dma_dev * sizeof(struct dma_device_info), 0,\n+\t\t\t\t\t       socket_id);\n+\tif (adapter->dma_devs == NULL) {\n+\t\tRTE_EDEV_LOG_ERR(\"Failed to get memory for DMA devices\\n\");\n+\t\tedma_circular_buffer_free(&adapter->ebuf);\n+\t\trte_free(adapter);\n+\t\treturn -ENOMEM;\n+\t}\n+\n+\trte_spinlock_init(&adapter->lock);\n+\tfor (i = 0; i < num_dma_dev; i++) {\n+\t\tret = rte_dma_info_get(i, &info);\n+\t\tif (ret) {\n+\t\t\tRTE_EDEV_LOG_ERR(\"Failed to get dma device info\\n\");\n+\t\t\tedma_circular_buffer_free(&adapter->ebuf);\n+\t\t\trte_free(adapter);\n+\t\t\treturn ret;\n+\t\t}\n+\n+\t\tadapter->dma_devs[i].num_dma_dev_vchan = info.nb_vchans;\n+\t}\n+\n+\tevent_dma_adapter[id] = adapter;\n+\n+\treturn 0;\n+}\n+\n+int\n+rte_event_dma_adapter_create(uint8_t id, uint8_t evdev_id, struct rte_event_port_conf *port_config,\n+\t\t\t    enum rte_event_dma_adapter_mode mode)\n+{\n+\tstruct rte_event_port_conf *pc;\n+\tint ret;\n+\n+\tif (port_config == NULL)\n+\t\treturn -EINVAL;\n+\n+\tEVENT_DMA_ADAPTER_ID_VALID_OR_ERR_RET(id, -EINVAL);\n+\n+\tpc = rte_malloc(NULL, sizeof(struct rte_event_port_conf), 0);\n+\tif (pc == NULL)\n+\t\treturn -ENOMEM;\n+\n+\trte_memcpy(pc, port_config, sizeof(struct rte_event_port_conf));\n+\tret = rte_event_dma_adapter_create_ext(id, evdev_id, edma_default_config_cb, mode, pc);\n+\tif (ret != 0)\n+\t\trte_free(pc);\n+\n+\treturn ret;\n+}\n+\n+int\n+rte_event_dma_adapter_free(uint8_t id)\n+{\n+\tstruct event_dma_adapter *adapter;\n+\n+\tEVENT_DMA_ADAPTER_ID_VALID_OR_ERR_RET(id, -EINVAL);\n+\n+\tadapter = edma_id_to_adapter(id);\n+\tif (adapter == NULL)\n+\t\treturn -EINVAL;\n+\n+\trte_free(adapter->conf_arg);\n+\trte_free(adapter->dma_devs);\n+\tedma_circular_buffer_free(&adapter->ebuf);\n+\trte_free(adapter);\n+\tevent_dma_adapter[id] = NULL;\n+\n+\treturn 0;\n+}\n",
    "prefixes": [
        "v4",
        "03/12"
    ]
}