get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 17117,
    "url": "http://patches.dpdk.org/api/patches/17117/?format=api",
    "web_url": "http://patches.dpdk.org/project/dpdk/patch/1479740470-6723-21-git-send-email-arybchenko@solarflare.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": "<1479740470-6723-21-git-send-email-arybchenko@solarflare.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/1479740470-6723-21-git-send-email-arybchenko@solarflare.com",
    "date": "2016-11-21T15:00:34",
    "name": "[dpdk-dev,20/56] net/sfc: import libefx Rx scatter support",
    "commit_ref": null,
    "pull_url": null,
    "state": "changes-requested",
    "archived": true,
    "hash": "fad78b51101ab6dc569e513a93b4ad4f313ae86c",
    "submitter": {
        "id": 607,
        "url": "http://patches.dpdk.org/api/people/607/?format=api",
        "name": "Andrew Rybchenko",
        "email": "arybchenko@solarflare.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/1479740470-6723-21-git-send-email-arybchenko@solarflare.com/mbox/",
    "series": [],
    "comments": "http://patches.dpdk.org/api/patches/17117/comments/",
    "check": "warning",
    "checks": "http://patches.dpdk.org/api/patches/17117/checks/",
    "tags": {},
    "related": [],
    "headers": {
        "Return-Path": "<dev-bounces@dpdk.org>",
        "X-Original-To": "patchwork@dpdk.org",
        "Delivered-To": "patchwork@dpdk.org",
        "Received": [
            "from [92.243.14.124] (localhost [IPv6:::1])\n\tby dpdk.org (Postfix) with ESMTP id 7B7EDD4A4;\n\tMon, 21 Nov 2016 16:02:49 +0100 (CET)",
            "from nbfkord-smmo02.seg.att.com (nbfkord-smmo02.seg.att.com\n\t[209.65.160.78]) by dpdk.org (Postfix) with ESMTP id 44372377A\n\tfor <dev@dpdk.org>; Mon, 21 Nov 2016 16:01:31 +0100 (CET)",
            "from unknown [12.187.104.26]\n\tby nbfkord-smmo02.seg.att.com(mxl_mta-7.2.4-7) with SMTP id\n\ta4c03385.0.1541296.00-2309.3424196.nbfkord-smmo02.seg.att.com\n\t(envelope-from <arybchenko@solarflare.com>); \n\tMon, 21 Nov 2016 15:01:31 +0000 (UTC)",
            "from ocex03.SolarFlarecom.com (10.20.40.36) by\n\tocex03.SolarFlarecom.com (10.20.40.36) with Microsoft SMTP Server\n\t(TLS) id 15.0.1044.25; Mon, 21 Nov 2016 07:01:21 -0800",
            "from opal.uk.solarflarecom.com (10.17.10.1) by\n\tocex03.SolarFlarecom.com (10.20.40.36) with Microsoft SMTP Server\n\t(TLS) id\n\t15.0.1044.25 via Frontend Transport; Mon, 21 Nov 2016 07:01:21 -0800",
            "from uklogin.uk.solarflarecom.com (uklogin.uk.solarflarecom.com\n\t[10.17.10.10])\n\tby opal.uk.solarflarecom.com (8.13.8/8.13.8) with ESMTP id\n\tuALF1KGc007158 for <dev@dpdk.org>; Mon, 21 Nov 2016 15:01:20 GMT",
            "from uklogin.uk.solarflarecom.com (localhost.localdomain\n\t[127.0.0.1])\n\tby uklogin.uk.solarflarecom.com (8.13.8/8.13.8) with ESMTP id\n\tuALF1J3B006765 for <dev@dpdk.org>; Mon, 21 Nov 2016 15:01:20 GMT"
        ],
        "X-MXL-Hash": "58330c4b60443e53-de21d818b72f391e05e416d1ab05a57cc075832e",
        "From": "Andrew Rybchenko <arybchenko@solarflare.com>",
        "To": "<dev@dpdk.org>",
        "Date": "Mon, 21 Nov 2016 15:00:34 +0000",
        "Message-ID": "<1479740470-6723-21-git-send-email-arybchenko@solarflare.com>",
        "X-Mailer": "git-send-email 1.8.2.3",
        "In-Reply-To": "<1479740470-6723-1-git-send-email-arybchenko@solarflare.com>",
        "References": "<1479740470-6723-1-git-send-email-arybchenko@solarflare.com>",
        "MIME-Version": "1.0",
        "Content-Type": "text/plain",
        "X-AnalysisOut": [
            "[v=2.1 cv=UI/baXry c=1 sm=1 tr=0 a=8BlWFWvVlq5taO8ncb8nKg==]",
            "[:17 a=L24OOQBejmoA:10 a=zRKbQ67AAAAA:8 a=-mBzV_SXuS-sKdqJW]",
            "[wQA:9 a=uBtlDionrBNi4lxQ:21 a=PA03WX8tBzeizutn5_OT:22]"
        ],
        "X-Spam": "[F=0.4936916574; CM=0.500; S=0.493(2015072901)]",
        "X-MAIL-FROM": "<arybchenko@solarflare.com>",
        "X-SOURCE-IP": "[12.187.104.26]",
        "Subject": "[dpdk-dev] [PATCH 20/56] net/sfc: import libefx Rx scatter support",
        "X-BeenThere": "dev@dpdk.org",
        "X-Mailman-Version": "2.1.15",
        "Precedence": "list",
        "List-Id": "patches and discussions about DPDK <dev.dpdk.org>",
        "List-Unsubscribe": "<http://dpdk.org/ml/options/dev>,\n\t<mailto:dev-request@dpdk.org?subject=unsubscribe>",
        "List-Archive": "<http://dpdk.org/ml/archives/dev/>",
        "List-Post": "<mailto:dev@dpdk.org>",
        "List-Help": "<mailto:dev-request@dpdk.org?subject=help>",
        "List-Subscribe": "<http://dpdk.org/ml/listinfo/dev>,\n\t<mailto:dev-request@dpdk.org?subject=subscribe>",
        "Errors-To": "dev-bounces@dpdk.org",
        "Sender": "\"dev\" <dev-bounces@dpdk.org>"
    },
    "content": "EFSYS_OPT_RX_SCATTER should be enabled to use it.\n\nFrom Solarflare Communications Inc.\n\nSigned-off-by: Andrew Rybchenko <arybchenko@solarflare.com>\n---\n drivers/net/sfc/efx/base/ef10_impl.h |  7 +++\n drivers/net/sfc/efx/base/ef10_rx.c   | 11 +++++\n drivers/net/sfc/efx/base/efx.h       |  7 +++\n drivers/net/sfc/efx/base/efx_check.h |  7 +++\n drivers/net/sfc/efx/base/efx_ev.c    | 33 +++++++++++++\n drivers/net/sfc/efx/base/efx_impl.h  |  3 ++\n drivers/net/sfc/efx/base/efx_rx.c    | 90 ++++++++++++++++++++++++++++++++++++\n 7 files changed, 158 insertions(+)",
    "diff": "diff --git a/drivers/net/sfc/efx/base/ef10_impl.h b/drivers/net/sfc/efx/base/ef10_impl.h\nindex c778cce..eedf121 100644\n--- a/drivers/net/sfc/efx/base/ef10_impl.h\n+++ b/drivers/net/sfc/efx/base/ef10_impl.h\n@@ -573,6 +573,13 @@ extern\t__checkReturn\tefx_rc_t\n ef10_rx_init(\n \t__in\t\tefx_nic_t *enp);\n \n+#if EFSYS_OPT_RX_SCATTER\n+extern\t__checkReturn\tefx_rc_t\n+ef10_rx_scatter_enable(\n+\t__in\t\tefx_nic_t *enp,\n+\t__in\t\tunsigned int buf_size);\n+#endif\t/* EFSYS_OPT_RX_SCATTER */\n+\n \n extern\t__checkReturn\tefx_rc_t\n ef10_rx_prefix_pktlen(\ndiff --git a/drivers/net/sfc/efx/base/ef10_rx.c b/drivers/net/sfc/efx/base/ef10_rx.c\nindex 170125e..95a182b 100644\n--- a/drivers/net/sfc/efx/base/ef10_rx.c\n+++ b/drivers/net/sfc/efx/base/ef10_rx.c\n@@ -159,6 +159,17 @@ ef10_rx_init(\n \treturn (0);\n }\n \n+#if EFSYS_OPT_RX_SCATTER\n+\t__checkReturn\tefx_rc_t\n+ef10_rx_scatter_enable(\n+\t__in\t\tefx_nic_t *enp,\n+\t__in\t\tunsigned int buf_size)\n+{\n+\t_NOTE(ARGUNUSED(enp, buf_size))\n+\treturn (0);\n+}\n+#endif\t/* EFSYS_OPT_RX_SCATTER */\n+\n \n /*\n  * EF10 RX pseudo-header\ndiff --git a/drivers/net/sfc/efx/base/efx.h b/drivers/net/sfc/efx/base/efx.h\nindex 24b7c8d..bd85f0b 100644\n--- a/drivers/net/sfc/efx/base/efx.h\n+++ b/drivers/net/sfc/efx/base/efx.h\n@@ -1381,6 +1381,13 @@ extern\t\tvoid\n efx_rx_fini(\n \t__in\t\tefx_nic_t *enp);\n \n+#if EFSYS_OPT_RX_SCATTER\n+\t__checkReturn\tefx_rc_t\n+efx_rx_scatter_enable(\n+\t__in\t\tefx_nic_t *enp,\n+\t__in\t\tunsigned int buf_size);\n+#endif\t/* EFSYS_OPT_RX_SCATTER */\n+\n extern\t__checkReturn\tefx_rc_t\n efx_psuedo_hdr_pkt_length_get(\n \t__in\t\tefx_rxq_t *erp,\ndiff --git a/drivers/net/sfc/efx/base/efx_check.h b/drivers/net/sfc/efx/base/efx_check.h\nindex df46410..91a764f 100644\n--- a/drivers/net/sfc/efx/base/efx_check.h\n+++ b/drivers/net/sfc/efx/base/efx_check.h\n@@ -244,6 +244,13 @@\n # error \"RX_HDR_SPLIT is obsolete and is not supported\"\n #endif\n \n+#if EFSYS_OPT_RX_SCATTER\n+/* Support receive scatter DMA */\n+# if !(EFSYS_OPT_SIENA || EFSYS_OPT_HUNTINGTON || EFSYS_OPT_MEDFORD)\n+#  error \"RX_SCATTER requires SIENA or HUNTINGTON or MEDFORD\"\n+# endif\n+#endif /* EFSYS_OPT_RX_SCATTER */\n+\n #ifdef EFSYS_OPT_STAT_NAME\n # error \"STAT_NAME is obsolete (replaced by NAMES).\"\n #endif\ndiff --git a/drivers/net/sfc/efx/base/efx_ev.c b/drivers/net/sfc/efx/base/efx_ev.c\nindex c172a06..a667124 100644\n--- a/drivers/net/sfc/efx/base/efx_ev.c\n+++ b/drivers/net/sfc/efx/base/efx_ev.c\n@@ -646,6 +646,22 @@ siena_ev_rx_not_ok(\n \t\tEFX_EV_QSTAT_INCR(eep, EV_RX_FRM_TRUNC);\n \t\t(*flagsp) |= EFX_DISCARD;\n \n+#if EFSYS_OPT_RX_SCATTER\n+\t\t/*\n+\t\t * Lookout for payload queue ran dry errors and ignore them.\n+\t\t *\n+\t\t * Sadly for the header/data split cases, the descriptor\n+\t\t * pointer in this event refers to the header queue and\n+\t\t * therefore cannot be easily detected as duplicate.\n+\t\t * So we drop these and rely on the receive processing seeing\n+\t\t * a subsequent packet with FSF_AZ_RX_EV_SOP set to discard\n+\t\t * the partially received packet.\n+\t\t */\n+\t\tif ((EFX_QWORD_FIELD(*eqp, FSF_AZ_RX_EV_SOP) == 0) &&\n+\t\t    (EFX_QWORD_FIELD(*eqp, FSF_AZ_RX_EV_JUMBO_CONT) == 0) &&\n+\t\t    (EFX_QWORD_FIELD(*eqp, FSF_AZ_RX_EV_BYTE_CNT) == 0))\n+\t\t\tignore = B_TRUE;\n+#endif\t/* EFSYS_OPT_RX_SCATTER */\n \t}\n \n \tif (EFX_QWORD_FIELD(*eqp, FSF_AZ_RX_EV_ETH_CRC_ERR) != 0) {\n@@ -705,6 +721,10 @@ siena_ev_rx(\n \tuint32_t size;\n \tuint32_t label;\n \tboolean_t ok;\n+#if EFSYS_OPT_RX_SCATTER\n+\tboolean_t sop;\n+\tboolean_t jumbo_cont;\n+#endif\t/* EFSYS_OPT_RX_SCATTER */\n \tuint32_t hdr_type;\n \tboolean_t is_v6;\n \tuint16_t flags;\n@@ -719,6 +739,11 @@ siena_ev_rx(\n \tlabel = EFX_QWORD_FIELD(*eqp, FSF_AZ_RX_EV_Q_LABEL);\n \tok = (EFX_QWORD_FIELD(*eqp, FSF_AZ_RX_EV_PKT_OK) != 0);\n \n+#if EFSYS_OPT_RX_SCATTER\n+\tsop = (EFX_QWORD_FIELD(*eqp, FSF_AZ_RX_EV_SOP) != 0);\n+\tjumbo_cont = (EFX_QWORD_FIELD(*eqp, FSF_AZ_RX_EV_JUMBO_CONT) != 0);\n+#endif\t/* EFSYS_OPT_RX_SCATTER */\n+\n \thdr_type = EFX_QWORD_FIELD(*eqp, FSF_AZ_RX_EV_HDR_TYPE);\n \n \tis_v6 = (EFX_QWORD_FIELD(*eqp, FSF_CZ_RX_EV_IPV6_PKT) != 0);\n@@ -771,6 +796,14 @@ siena_ev_rx(\n \t\tbreak;\n \t}\n \n+#if EFSYS_OPT_RX_SCATTER\n+\t/* Report scatter and header/lookahead split buffer flags */\n+\tif (sop)\n+\t\tflags |= EFX_PKT_START;\n+\tif (jumbo_cont)\n+\t\tflags |= EFX_PKT_CONT;\n+#endif\t/* EFSYS_OPT_RX_SCATTER */\n+\n \t/* Detect errors included in the FSF_AZ_RX_EV_PKT_OK indication */\n \tif (!ok) {\n \t\tignore = siena_ev_rx_not_ok(eep, eqp, label, id, &flags);\ndiff --git a/drivers/net/sfc/efx/base/efx_impl.h b/drivers/net/sfc/efx/base/efx_impl.h\nindex a1eabcd..b7eeee7 100644\n--- a/drivers/net/sfc/efx/base/efx_impl.h\n+++ b/drivers/net/sfc/efx/base/efx_impl.h\n@@ -148,6 +148,9 @@ typedef struct efx_tx_ops_s {\n typedef struct efx_rx_ops_s {\n \tefx_rc_t\t(*erxo_init)(efx_nic_t *);\n \tvoid\t\t(*erxo_fini)(efx_nic_t *);\n+#if EFSYS_OPT_RX_SCATTER\n+\tefx_rc_t\t(*erxo_scatter_enable)(efx_nic_t *, unsigned int);\n+#endif\n \tefx_rc_t\t(*erxo_prefix_pktlen)(efx_nic_t *, uint8_t *,\n \t\t\t\t\t      uint16_t *);\n \tvoid\t\t(*erxo_qpost)(efx_rxq_t *, efsys_dma_addr_t *, size_t,\ndiff --git a/drivers/net/sfc/efx/base/efx_rx.c b/drivers/net/sfc/efx/base/efx_rx.c\nindex a2f9789..a6f4c55 100644\n--- a/drivers/net/sfc/efx/base/efx_rx.c\n+++ b/drivers/net/sfc/efx/base/efx_rx.c\n@@ -42,6 +42,13 @@ static\t\t\tvoid\n siena_rx_fini(\n \t__in\t\tefx_nic_t *enp);\n \n+#if EFSYS_OPT_RX_SCATTER\n+static\t__checkReturn\tefx_rc_t\n+siena_rx_scatter_enable(\n+\t__in\t\tefx_nic_t *enp,\n+\t__in\t\tunsigned int buf_size);\n+#endif /* EFSYS_OPT_RX_SCATTER */\n+\n static\t__checkReturn\tefx_rc_t\n siena_rx_prefix_pktlen(\n \t__in\t\tefx_nic_t *enp,\n@@ -94,6 +101,9 @@ siena_rx_qdestroy(\n static const efx_rx_ops_t __efx_rx_siena_ops = {\n \tsiena_rx_init,\t\t\t\t/* erxo_init */\n \tsiena_rx_fini,\t\t\t\t/* erxo_fini */\n+#if EFSYS_OPT_RX_SCATTER\n+\tsiena_rx_scatter_enable,\t\t/* erxo_scatter_enable */\n+#endif\n \tsiena_rx_prefix_pktlen,\t\t\t/* erxo_prefix_pktlen */\n \tsiena_rx_qpost,\t\t\t\t/* erxo_qpost */\n \tsiena_rx_qpush,\t\t\t\t/* erxo_qpush */\n@@ -108,6 +118,9 @@ static const efx_rx_ops_t __efx_rx_siena_ops = {\n static const efx_rx_ops_t __efx_rx_ef10_ops = {\n \tef10_rx_init,\t\t\t\t/* erxo_init */\n \tef10_rx_fini,\t\t\t\t/* erxo_fini */\n+#if EFSYS_OPT_RX_SCATTER\n+\tef10_rx_scatter_enable,\t\t\t/* erxo_scatter_enable */\n+#endif\n \tef10_rx_prefix_pktlen,\t\t\t/* erxo_prefix_pktlen */\n \tef10_rx_qpost,\t\t\t\t/* erxo_qpost */\n \tef10_rx_qpush,\t\t\t\t/* erxo_qpush */\n@@ -202,6 +215,29 @@ efx_rx_fini(\n \tenp->en_mod_flags &= ~EFX_MOD_RX;\n }\n \n+#if EFSYS_OPT_RX_SCATTER\n+\t__checkReturn\tefx_rc_t\n+efx_rx_scatter_enable(\n+\t__in\t\tefx_nic_t *enp,\n+\t__in\t\tunsigned int buf_size)\n+{\n+\tconst efx_rx_ops_t *erxop = enp->en_erxop;\n+\tefx_rc_t rc;\n+\n+\tEFSYS_ASSERT3U(enp->en_magic, ==, EFX_NIC_MAGIC);\n+\tEFSYS_ASSERT3U(enp->en_mod_flags, &, EFX_MOD_RX);\n+\n+\tif ((rc = erxop->erxo_scatter_enable(enp, buf_size)) != 0)\n+\t\tgoto fail1;\n+\n+\treturn (0);\n+\n+fail1:\n+\tEFSYS_PROBE1(fail1, efx_rc_t, rc);\n+\treturn (rc);\n+}\n+#endif\t/* EFSYS_OPT_RX_SCATTER */\n+\n \t\t\tvoid\n efx_rx_qpost(\n \t__in\t\tefx_rxq_t *erp,\n@@ -374,6 +410,50 @@ siena_rx_init(\n \treturn (0);\n }\n \n+#if EFSYS_OPT_RX_SCATTER\n+static\t__checkReturn\tefx_rc_t\n+siena_rx_scatter_enable(\n+\t__in\t\tefx_nic_t *enp,\n+\t__in\t\tunsigned int buf_size)\n+{\n+\tunsigned int nbuf32;\n+\tefx_oword_t oword;\n+\tefx_rc_t rc;\n+\n+\tnbuf32 = buf_size / 32;\n+\tif ((nbuf32 == 0) ||\n+\t    (nbuf32 >= (1 << FRF_BZ_RX_USR_BUF_SIZE_WIDTH)) ||\n+\t    ((buf_size % 32) != 0)) {\n+\t\trc = EINVAL;\n+\t\tgoto fail1;\n+\t}\n+\n+\tif (enp->en_rx_qcount > 0) {\n+\t\trc = EBUSY;\n+\t\tgoto fail2;\n+\t}\n+\n+\t/* Set scatter buffer size */\n+\tEFX_BAR_READO(enp, FR_AZ_RX_CFG_REG, &oword);\n+\tEFX_SET_OWORD_FIELD(oword, FRF_BZ_RX_USR_BUF_SIZE, nbuf32);\n+\tEFX_BAR_WRITEO(enp, FR_AZ_RX_CFG_REG, &oword);\n+\n+\t/* Enable scatter for packets not matching a filter */\n+\tEFX_BAR_READO(enp, FR_AZ_RX_FILTER_CTL_REG, &oword);\n+\tEFX_SET_OWORD_FIELD(oword, FRF_BZ_SCATTER_ENBL_NO_MATCH_Q, 1);\n+\tEFX_BAR_WRITEO(enp, FR_AZ_RX_FILTER_CTL_REG, &oword);\n+\n+\treturn (0);\n+\n+fail2:\n+\tEFSYS_PROBE(fail2);\n+fail1:\n+\tEFSYS_PROBE1(fail1, efx_rc_t, rc);\n+\n+\treturn (rc);\n+}\n+#endif\t/* EFSYS_OPT_RX_SCATTER */\n+\n \n #define\tEFX_RX_LFSR_HASH(_enp, _insert)\t\t\t\t\t\\\n \tdo {\t\t\t\t\t\t\t\t\\\n@@ -623,6 +703,16 @@ siena_rx_qcreate(\n \t\tjumbo = B_FALSE;\n \t\tbreak;\n \n+#if EFSYS_OPT_RX_SCATTER\n+\tcase EFX_RXQ_TYPE_SCATTER:\n+\t\tif (enp->en_family < EFX_FAMILY_SIENA) {\n+\t\t\trc = EINVAL;\n+\t\t\tgoto fail4;\n+\t\t}\n+\t\tjumbo = B_TRUE;\n+\t\tbreak;\n+#endif\t/* EFSYS_OPT_RX_SCATTER */\n+\n \tdefault:\n \t\trc = EINVAL;\n \t\tgoto fail4;\n",
    "prefixes": [
        "dpdk-dev",
        "20/56"
    ]
}