get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 87869,
    "url": "http://patches.dpdk.org/api/patches/87869/?format=api",
    "web_url": "http://patches.dpdk.org/project/dpdk/patch/20210211141620.12482-15-hemant.agrawal@nxp.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": "<20210211141620.12482-15-hemant.agrawal@nxp.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/20210211141620.12482-15-hemant.agrawal@nxp.com",
    "date": "2021-02-11T14:16:14",
    "name": "[v2,14/20] net/dpaa2: optionally enable error queues",
    "commit_ref": null,
    "pull_url": null,
    "state": "superseded",
    "archived": true,
    "hash": "272f5241515f0954a141d24251f69b1bfecfa7f4",
    "submitter": {
        "id": 477,
        "url": "http://patches.dpdk.org/api/people/477/?format=api",
        "name": "Hemant Agrawal",
        "email": "hemant.agrawal@nxp.com"
    },
    "delegate": {
        "id": 319,
        "url": "http://patches.dpdk.org/api/users/319/?format=api",
        "username": "fyigit",
        "first_name": "Ferruh",
        "last_name": "Yigit",
        "email": "ferruh.yigit@amd.com"
    },
    "mbox": "http://patches.dpdk.org/project/dpdk/patch/20210211141620.12482-15-hemant.agrawal@nxp.com/mbox/",
    "series": [
        {
            "id": 15239,
            "url": "http://patches.dpdk.org/api/series/15239/?format=api",
            "web_url": "http://patches.dpdk.org/project/dpdk/list/?series=15239",
            "date": "2021-02-11T14:16:00",
            "name": "NXP DPAAx ethernet PMD changes",
            "version": 2,
            "mbox": "http://patches.dpdk.org/series/15239/mbox/"
        }
    ],
    "comments": "http://patches.dpdk.org/api/patches/87869/comments/",
    "check": "success",
    "checks": "http://patches.dpdk.org/api/patches/87869/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 8125DA054A;\n\tThu, 11 Feb 2021 15:30:00 +0100 (CET)",
            "from [217.70.189.124] (localhost [127.0.0.1])\n\tby mails.dpdk.org (Postfix) with ESMTP id 11C4A1CC5A3;\n\tThu, 11 Feb 2021 15:28:19 +0100 (CET)",
            "from inva020.nxp.com (inva020.nxp.com [92.121.34.13])\n by mails.dpdk.org (Postfix) with ESMTP id AB7F51CC564\n for <dev@dpdk.org>; Thu, 11 Feb 2021 15:28:05 +0100 (CET)",
            "from inva020.nxp.com (localhost [127.0.0.1])\n by inva020.eu-rdc02.nxp.com (Postfix) with ESMTP id 8E0781A0613;\n Thu, 11 Feb 2021 15:28:05 +0100 (CET)",
            "from invc005.ap-rdc01.nxp.com (invc005.ap-rdc01.nxp.com\n [165.114.16.14])\n by inva020.eu-rdc02.nxp.com (Postfix) with ESMTP id 231821A05D6;\n Thu, 11 Feb 2021 15:28:04 +0100 (CET)",
            "from bf-netperf1.ap.freescale.net (bf-netperf1.ap.freescale.net\n [10.232.133.63])\n by invc005.ap-rdc01.nxp.com (Postfix) with ESMTP id 7502F40326;\n Thu, 11 Feb 2021 15:28:02 +0100 (CET)"
        ],
        "From": "Hemant Agrawal <hemant.agrawal@nxp.com>",
        "To": "dev@dpdk.org,\n\tferruh.yigit@intel.com",
        "Date": "Thu, 11 Feb 2021 19:46:14 +0530",
        "Message-Id": "<20210211141620.12482-15-hemant.agrawal@nxp.com>",
        "X-Mailer": "git-send-email 2.17.1",
        "In-Reply-To": "<20210211141620.12482-1-hemant.agrawal@nxp.com>",
        "References": "<20210120142723.14090-1-hemant.agrawal@nxp.com>\n <20210211141620.12482-1-hemant.agrawal@nxp.com>",
        "X-Virus-Scanned": "ClamAV using ClamSMTP",
        "Subject": "[dpdk-dev] [PATCH v2 14/20] net/dpaa2: optionally enable error\n queues",
        "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",
        "Sender": "\"dev\" <dev-bounces@dpdk.org>"
    },
    "content": "From: Nipun Gupta <nipun.gupta@nxp.com>\n\nIn case error packets are received by the ethernet interface,\nthis patch enables the receival of packets on the error queue,\nprinting the error and the error packet.\n\nto enable, use the dev_arg as : fslmc:dpni.1,drv_error_queue=1\n\nSigned-off-by: Nipun Gupta <nipun.gupta@nxp.com>\nAcked-by: Hemant Agrawal <hemant.agrawal@nxp.com>\n---\n doc/guides/nics/dpaa2.rst               |  7 ++\n drivers/bus/fslmc/portal/dpaa2_hw_pvt.h |  1 +\n drivers/net/dpaa2/dpaa2_ethdev.c        | 67 +++++++++++++++--\n drivers/net/dpaa2/dpaa2_ethdev.h        |  5 +-\n drivers/net/dpaa2/dpaa2_rxtx.c          | 97 ++++++++++++++++++++++++-\n 5 files changed, 169 insertions(+), 8 deletions(-)",
    "diff": "diff --git a/doc/guides/nics/dpaa2.rst b/doc/guides/nics/dpaa2.rst\nindex 4eec8fcdd9..1e698bfbd8 100644\n--- a/doc/guides/nics/dpaa2.rst\n+++ b/doc/guides/nics/dpaa2.rst\n@@ -488,6 +488,13 @@ for details.\n   In this mode tx conf queues need to be polled to free the buffers.\n   e.g. ``fslmc:dpni.1,drv_tx_conf=1``\n \n+* Use dev arg option  ``drv_error_queue=1`` to enable Packets in Error queue.\n+  DPAA2 hardware drops the error packet in hardware. This option enables the\n+  hardware to not drop the error packet and let the driver dump the error\n+  packets, so that user can check what is wrong with those packets.\n+   e.g. ``fslmc:dpni.1,drv_error_queue=1``\n+\n+\n Enabling logs\n -------------\n \ndiff --git a/drivers/bus/fslmc/portal/dpaa2_hw_pvt.h b/drivers/bus/fslmc/portal/dpaa2_hw_pvt.h\nindex 0f15750b6c..037c841ef5 100644\n--- a/drivers/bus/fslmc/portal/dpaa2_hw_pvt.h\n+++ b/drivers/bus/fslmc/portal/dpaa2_hw_pvt.h\n@@ -314,6 +314,7 @@ enum qbman_fd_format {\n #define DPAA2_GET_FD_FLC(fd) \\\n \t(((uint64_t)((fd)->simple.flc_hi) << 32) + (fd)->simple.flc_lo)\n #define DPAA2_GET_FD_ERR(fd)   ((fd)->simple.ctrl & 0x000000FF)\n+#define DPAA2_GET_FD_FA_ERR(fd)   ((fd)->simple.ctrl & 0x00000040)\n #define DPAA2_GET_FLE_OFFSET(fle) (((fle)->fin_bpid_offset & 0x0FFF0000) >> 16)\n #define DPAA2_SET_FLE_SG_EXT(fle) ((fle)->fin_bpid_offset |= (uint64_t)1 << 29)\n #define DPAA2_IS_SET_FLE_SG_EXT(fle)\t\\\ndiff --git a/drivers/net/dpaa2/dpaa2_ethdev.c b/drivers/net/dpaa2/dpaa2_ethdev.c\nindex 4b3eb7f5c9..412f970800 100644\n--- a/drivers/net/dpaa2/dpaa2_ethdev.c\n+++ b/drivers/net/dpaa2/dpaa2_ethdev.c\n@@ -32,6 +32,7 @@\n #define DRIVER_LOOPBACK_MODE \"drv_loopback\"\n #define DRIVER_NO_PREFETCH_MODE \"drv_no_prefetch\"\n #define DRIVER_TX_CONF \"drv_tx_conf\"\n+#define DRIVER_ERROR_QUEUE  \"drv_err_queue\"\n #define CHECK_INTERVAL         100  /* 100ms */\n #define MAX_REPEAT_TIME        90   /* 9s (90 * 100ms) in total */\n \n@@ -71,6 +72,9 @@ bool dpaa2_enable_ts[RTE_MAX_ETHPORTS];\n uint64_t dpaa2_timestamp_rx_dynflag;\n int dpaa2_timestamp_dynfield_offset = -1;\n \n+/* Enable error queue */\n+bool dpaa2_enable_err_queue;\n+\n struct rte_dpaa2_xstats_name_off {\n \tchar name[RTE_ETH_XSTATS_NAME_SIZE];\n \tuint8_t page_id; /* dpni statistics page id */\n@@ -391,6 +395,25 @@ dpaa2_alloc_rx_tx_queues(struct rte_eth_dev *dev)\n \t\t\tgoto fail;\n \t}\n \n+\tif (dpaa2_enable_err_queue) {\n+\t\tpriv->rx_err_vq = rte_zmalloc(\"dpni_rx_err\",\n+\t\t\tsizeof(struct dpaa2_queue), 0);\n+\n+\t\tdpaa2_q = (struct dpaa2_queue *)priv->rx_err_vq;\n+\t\tdpaa2_q->q_storage = rte_malloc(\"err_dq_storage\",\n+\t\t\t\t\tsizeof(struct queue_storage_info_t) *\n+\t\t\t\t\tRTE_MAX_LCORE,\n+\t\t\t\t\tRTE_CACHE_LINE_SIZE);\n+\t\tif (!dpaa2_q->q_storage)\n+\t\t\tgoto fail;\n+\n+\t\tmemset(dpaa2_q->q_storage, 0,\n+\t\t       sizeof(struct queue_storage_info_t));\n+\t\tfor (i = 0; i < RTE_MAX_LCORE; i++)\n+\t\t\tif (dpaa2_alloc_dq_storage(&dpaa2_q->q_storage[i]))\n+\t\t\t\tgoto fail;\n+\t}\n+\n \tfor (i = 0; i < priv->nb_tx_queues; i++) {\n \t\tmc_q->eth_data = dev->data;\n \t\tmc_q->flow_id = 0xffff;\n@@ -458,6 +481,14 @@ dpaa2_alloc_rx_tx_queues(struct rte_eth_dev *dev)\n \t\trte_free(dpaa2_q->q_storage);\n \t\tpriv->rx_vq[i--] = NULL;\n \t}\n+\n+\tif (dpaa2_enable_err_queue) {\n+\t\tdpaa2_q = (struct dpaa2_queue *)priv->rx_err_vq;\n+\t\tif (dpaa2_q->q_storage)\n+\t\t\tdpaa2_free_dq_storage(dpaa2_q->q_storage);\n+\t\trte_free(dpaa2_q->q_storage);\n+\t}\n+\n \trte_free(mc_q);\n \treturn -1;\n }\n@@ -1163,11 +1194,31 @@ dpaa2_dev_start(struct rte_eth_dev *dev)\n \t\tdpaa2_q->fqid = qid.fqid;\n \t}\n \n-\t/*checksum errors, send them to normal path and set it in annotation */\n-\terr_cfg.errors = DPNI_ERROR_L3CE | DPNI_ERROR_L4CE;\n-\terr_cfg.errors |= DPNI_ERROR_PHE;\n+\tif (dpaa2_enable_err_queue) {\n+\t\tret = dpni_get_queue(dpni, CMD_PRI_LOW, priv->token,\n+\t\t\t\t     DPNI_QUEUE_RX_ERR, 0, 0, &cfg, &qid);\n+\t\tif (ret) {\n+\t\t\tDPAA2_PMD_ERR(\"Error getting rx err flow information: err=%d\",\n+\t\t\t\t\t\tret);\n+\t\t\treturn ret;\n+\t\t}\n+\t\tdpaa2_q = (struct dpaa2_queue *)priv->rx_err_vq;\n+\t\tdpaa2_q->fqid = qid.fqid;\n+\t\tdpaa2_q->eth_data = dev->data;\n \n-\terr_cfg.error_action = DPNI_ERROR_ACTION_CONTINUE;\n+\t\terr_cfg.errors =  DPNI_ERROR_DISC;\n+\t\terr_cfg.error_action = DPNI_ERROR_ACTION_SEND_TO_ERROR_QUEUE;\n+\t} else {\n+\t\t/* checksum errors, send them to normal path\n+\t\t * and set it in annotation\n+\t\t */\n+\t\terr_cfg.errors = DPNI_ERROR_L3CE | DPNI_ERROR_L4CE;\n+\n+\t\t/* if packet with parse error are not to be dropped */\n+\t\terr_cfg.errors |= DPNI_ERROR_PHE;\n+\n+\t\terr_cfg.error_action = DPNI_ERROR_ACTION_CONTINUE;\n+\t}\n \terr_cfg.set_frame_annotation = true;\n \n \tret = dpni_set_errors_behavior(dpni, CMD_PRI_LOW,\n@@ -2624,6 +2675,11 @@ dpaa2_dev_init(struct rte_eth_dev *eth_dev)\n \t\tDPAA2_PMD_INFO(\"TX_CONF Enabled\");\n \t}\n \n+\tif (dpaa2_get_devargs(dev->devargs, DRIVER_ERROR_QUEUE)) {\n+\t\tdpaa2_enable_err_queue = 1;\n+\t\tDPAA2_PMD_INFO(\"Enable error queue\");\n+\t}\n+\n \t/* Allocate memory for hardware structure for queues */\n \tret = dpaa2_alloc_rx_tx_queues(eth_dev);\n \tif (ret) {\n@@ -2863,5 +2919,6 @@ RTE_PMD_REGISTER_DPAA2(net_dpaa2, rte_dpaa2_pmd);\n RTE_PMD_REGISTER_PARAM_STRING(net_dpaa2,\n \t\tDRIVER_LOOPBACK_MODE \"=<int> \"\n \t\tDRIVER_NO_PREFETCH_MODE \"=<int>\"\n-\t\tDRIVER_TX_CONF \"=<int>\");\n+\t\tDRIVER_TX_CONF \"=<int>\"\n+\t\tDRIVER_ERROR_QUEUE \"=<int>\");\n RTE_LOG_REGISTER(dpaa2_logtype_pmd, pmd.net.dpaa2, NOTICE);\ndiff --git a/drivers/net/dpaa2/dpaa2_ethdev.h b/drivers/net/dpaa2/dpaa2_ethdev.h\nindex becdb50055..28341178e4 100644\n--- a/drivers/net/dpaa2/dpaa2_ethdev.h\n+++ b/drivers/net/dpaa2/dpaa2_ethdev.h\n@@ -1,7 +1,7 @@\n /* SPDX-License-Identifier: BSD-3-Clause\n  *\n  *   Copyright (c) 2015-2016 Freescale Semiconductor, Inc. All rights reserved.\n- *   Copyright 2016-2020 NXP\n+ *   Copyright 2016-2021 NXP\n  *\n  */\n \n@@ -117,6 +117,8 @@ extern enum rte_filter_type dpaa2_filter_type;\n \n extern const struct rte_tm_ops dpaa2_tm_ops;\n \n+extern bool dpaa2_enable_err_queue;\n+\n #define IP_ADDRESS_OFFSET_INVALID (-1)\n \n struct dpaa2_key_info {\n@@ -154,6 +156,7 @@ struct dpaa2_dev_priv {\n \tvoid *tx_vq[MAX_TX_QUEUES];\n \tstruct dpaa2_bp_list *bp_list; /**<Attached buffer pool list */\n \tvoid *tx_conf_vq[MAX_TX_QUEUES];\n+\tvoid *rx_err_vq;\n \tuint8_t flags; /*dpaa2 config flags */\n \tuint8_t max_mac_filters;\n \tuint8_t max_vlan_filters;\ndiff --git a/drivers/net/dpaa2/dpaa2_rxtx.c b/drivers/net/dpaa2/dpaa2_rxtx.c\nindex 7deba3aed3..f40369e2c3 100644\n--- a/drivers/net/dpaa2/dpaa2_rxtx.c\n+++ b/drivers/net/dpaa2/dpaa2_rxtx.c\n@@ -14,6 +14,7 @@\n #include <rte_memcpy.h>\n #include <rte_string_fns.h>\n #include <rte_dev.h>\n+#include <rte_hexdump.h>\n \n #include <rte_fslmc.h>\n #include <fslmc_vfio.h>\n@@ -550,6 +551,93 @@ eth_copy_mbuf_to_fd(struct rte_mbuf *mbuf,\n return 0;\n }\n \n+static void\n+dump_err_pkts(struct dpaa2_queue *dpaa2_q)\n+{\n+\t/* Function receive frames for a given device and VQ */\n+\tstruct qbman_result *dq_storage;\n+\tuint32_t fqid = dpaa2_q->fqid;\n+\tint ret, num_rx = 0, num_pulled;\n+\tuint8_t pending, status;\n+\tstruct qbman_swp *swp;\n+\tconst struct qbman_fd *fd;\n+\tstruct qbman_pull_desc pulldesc;\n+\tstruct rte_eth_dev_data *eth_data = dpaa2_q->eth_data;\n+\tuint32_t lcore_id = rte_lcore_id();\n+\tvoid *v_addr, *hw_annot_addr;\n+\tstruct dpaa2_fas *fas;\n+\n+\tif (unlikely(!DPAA2_PER_LCORE_DPIO)) {\n+\t\tret = dpaa2_affine_qbman_swp();\n+\t\tif (ret) {\n+\t\t\tDPAA2_PMD_ERR(\"Failed to allocate IO portal, tid: %d\\n\",\n+\t\t\t\trte_gettid());\n+\t\t\treturn;\n+\t\t}\n+\t}\n+\tswp = DPAA2_PER_LCORE_PORTAL;\n+\n+\tdq_storage = dpaa2_q->q_storage[lcore_id].dq_storage[0];\n+\tqbman_pull_desc_clear(&pulldesc);\n+\tqbman_pull_desc_set_fq(&pulldesc, fqid);\n+\tqbman_pull_desc_set_storage(&pulldesc, dq_storage,\n+\t\t\t(size_t)(DPAA2_VADDR_TO_IOVA(dq_storage)), 1);\n+\tqbman_pull_desc_set_numframes(&pulldesc, dpaa2_dqrr_size);\n+\n+\twhile (1) {\n+\t\tif (qbman_swp_pull(swp, &pulldesc)) {\n+\t\t\tDPAA2_PMD_DP_DEBUG(\"VDQ command is not issued.QBMAN is busy\\n\");\n+\t\t\t/* Portal was busy, try again */\n+\t\t\tcontinue;\n+\t\t}\n+\t\tbreak;\n+\t}\n+\n+\t/* Check if the previous issued command is completed. */\n+\twhile (!qbman_check_command_complete(dq_storage))\n+\t\t;\n+\n+\tnum_pulled = 0;\n+\tpending = 1;\n+\tdo {\n+\t\t/* Loop until the dq_storage is updated with\n+\t\t * new token by QBMAN\n+\t\t */\n+\t\twhile (!qbman_check_new_result(dq_storage))\n+\t\t\t;\n+\n+\t\t/* Check whether Last Pull command is Expired and\n+\t\t * setting Condition for Loop termination\n+\t\t */\n+\t\tif (qbman_result_DQ_is_pull_complete(dq_storage)) {\n+\t\t\tpending = 0;\n+\t\t\t/* Check for valid frame. */\n+\t\t\tstatus = qbman_result_DQ_flags(dq_storage);\n+\t\t\tif (unlikely((status &\n+\t\t\t\tQBMAN_DQ_STAT_VALIDFRAME) == 0))\n+\t\t\t\tcontinue;\n+\t\t}\n+\t\tfd = qbman_result_DQ_fd(dq_storage);\n+\t\tv_addr = DPAA2_IOVA_TO_VADDR(DPAA2_GET_FD_ADDR(fd));\n+\t\thw_annot_addr = (void *)((size_t)v_addr + DPAA2_FD_PTA_SIZE);\n+\t\tfas = hw_annot_addr;\n+\n+\t\tDPAA2_PMD_ERR(\"\\n\\n[%d] error packet on port[%d]:\"\n+\t\t\t\" fd_off: %d, fd_err: %x, fas_status: %x\",\n+\t\t\trte_lcore_id(), eth_data->port_id,\n+\t\t\tDPAA2_GET_FD_OFFSET(fd), DPAA2_GET_FD_ERR(fd),\n+\t\t\tfas->status);\n+\t\trte_hexdump(stderr, \"Error packet\", v_addr,\n+\t\t\tDPAA2_GET_FD_OFFSET(fd) + DPAA2_GET_FD_LEN(fd));\n+\n+\t\tdq_storage++;\n+\t\tnum_rx++;\n+\t\tnum_pulled++;\n+\t} while (pending);\n+\n+\tdpaa2_q->err_pkts += num_rx;\n+}\n+\n /* This function assumes that caller will be keep the same value for nb_pkts\n  * across calls per queue, if that is not the case, better use non-prefetch\n  * version of rx call.\n@@ -570,9 +658,10 @@ dpaa2_dev_prefetch_rx(void *queue, struct rte_mbuf **bufs, uint16_t nb_pkts)\n \tstruct qbman_pull_desc pulldesc;\n \tstruct queue_storage_info_t *q_storage = dpaa2_q->q_storage;\n \tstruct rte_eth_dev_data *eth_data = dpaa2_q->eth_data;\n-#if defined(RTE_LIBRTE_IEEE1588)\n \tstruct dpaa2_dev_priv *priv = eth_data->dev_private;\n-#endif\n+\n+\tif (unlikely(dpaa2_enable_err_queue))\n+\t\tdump_err_pkts(priv->rx_err_vq);\n \n \tif (unlikely(!DPAA2_PER_LCORE_ETHRX_DPIO)) {\n \t\tret = dpaa2_affine_qbman_ethrx_swp();\n@@ -807,6 +896,10 @@ dpaa2_dev_rx(void *queue, struct rte_mbuf **bufs, uint16_t nb_pkts)\n \tconst struct qbman_fd *fd;\n \tstruct qbman_pull_desc pulldesc;\n \tstruct rte_eth_dev_data *eth_data = dpaa2_q->eth_data;\n+\tstruct dpaa2_dev_priv *priv = eth_data->dev_private;\n+\n+\tif (unlikely(dpaa2_enable_err_queue))\n+\t\tdump_err_pkts(priv->rx_err_vq);\n \n \tif (unlikely(!DPAA2_PER_LCORE_DPIO)) {\n \t\tret = dpaa2_affine_qbman_swp();\n",
    "prefixes": [
        "v2",
        "14/20"
    ]
}