get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 17144,
    "url": "http://patches.dpdk.org/api/patches/17144/?format=api",
    "web_url": "http://patches.dpdk.org/project/dpdk/patch/1479740470-6723-50-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-50-git-send-email-arybchenko@solarflare.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/1479740470-6723-50-git-send-email-arybchenko@solarflare.com",
    "date": "2016-11-21T15:01:03",
    "name": "[dpdk-dev,49/56] net/sfc: implement Rx queue start and stop operations",
    "commit_ref": null,
    "pull_url": null,
    "state": "changes-requested",
    "archived": true,
    "hash": "45456deac04dcaad15348ace142a0490577ee061",
    "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-50-git-send-email-arybchenko@solarflare.com/mbox/",
    "series": [],
    "comments": "http://patches.dpdk.org/api/patches/17144/comments/",
    "check": "warning",
    "checks": "http://patches.dpdk.org/api/patches/17144/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 90609D5D4;\n\tMon, 21 Nov 2016 16:03:33 +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 B6E093977\n\tfor <dev@dpdk.org>; Mon, 21 Nov 2016 16:01:40 +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\t45c03385.0.1541303.00-2347.3424242.nbfkord-smmo02.seg.att.com\n\t(envelope-from <arybchenko@solarflare.com>); \n\tMon, 21 Nov 2016 15:01:40 +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:22 -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:22 -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\tuALF1Lcn007245 for <dev@dpdk.org>; Mon, 21 Nov 2016 15:01:21 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\tuALF1J3e006765 for <dev@dpdk.org>; Mon, 21 Nov 2016 15:01:21 GMT"
        ],
        "X-MXL-Hash": "58330c54268ce0e9-43f997bd5ff07da1903f10bf8464ea5b84eaa170",
        "From": "Andrew Rybchenko <arybchenko@solarflare.com>",
        "To": "<dev@dpdk.org>",
        "Date": "Mon, 21 Nov 2016 15:01:03 +0000",
        "Message-ID": "<1479740470-6723-50-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=zAlzCLoU7-uyqBI12]",
            "[2gA:9 a=Mu070EE48oES_R6w:21 a=vUm1UXvefizFtZKp:21 a=PA03WX]",
            "[8tBzeizutn5_OT:22]"
        ],
        "X-Spam": "[F=0.2325865469; CM=0.500; S=0.232(2015072901)]",
        "X-MAIL-FROM": "<arybchenko@solarflare.com>",
        "X-SOURCE-IP": "[12.187.104.26]",
        "Subject": "[dpdk-dev] [PATCH 49/56] net/sfc: implement Rx queue start and stop\n\toperations",
        "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": "These functions should set the queue state in dev->data->rx_queue_state\narray.\n\nReviewed-by: Andy Moreton <amoreton@solarflare.com>\nSigned-off-by: Andrew Rybchenko <arybchenko@solarflare.com>\n---\n drivers/net/sfc/efx/sfc.c       |   8 ++\n drivers/net/sfc/efx/sfc_ev.c    |  23 +++-\n drivers/net/sfc/efx/sfc_rx.c    | 297 ++++++++++++++++++++++++++++++++++++++++\n drivers/net/sfc/efx/sfc_rx.h    |  20 +++\n drivers/net/sfc/efx/sfc_tweak.h |  44 ++++++\n 5 files changed, 386 insertions(+), 6 deletions(-)\n create mode 100644 drivers/net/sfc/efx/sfc_tweak.h",
    "diff": "diff --git a/drivers/net/sfc/efx/sfc.c b/drivers/net/sfc/efx/sfc.c\nindex c0f48a8..1c0f59d 100644\n--- a/drivers/net/sfc/efx/sfc.c\n+++ b/drivers/net/sfc/efx/sfc.c\n@@ -271,10 +271,17 @@ sfc_start(struct sfc_adapter *sa)\n \tif (rc != 0)\n \t\tgoto fail_port_start;\n \n+\trc = sfc_rx_start(sa);\n+\tif (rc != 0)\n+\t\tgoto fail_rx_start;\n+\n \tsa->state = SFC_ADAPTER_STARTED;\n \tsfc_log_init(sa, \"done\");\n \treturn 0;\n \n+fail_rx_start:\n+\tsfc_port_stop(sa);\n+\n fail_port_start:\n \tsfc_ev_stop(sa);\n \n@@ -313,6 +320,7 @@ sfc_stop(struct sfc_adapter *sa)\n \n \tsa->state = SFC_ADAPTER_STOPPING;\n \n+\tsfc_rx_stop(sa);\n \tsfc_port_stop(sa);\n \tsfc_ev_stop(sa);\n \tsfc_intr_stop(sa);\ndiff --git a/drivers/net/sfc/efx/sfc_ev.c b/drivers/net/sfc/efx/sfc_ev.c\nindex 8e2fc94..6750bfb 100644\n--- a/drivers/net/sfc/efx/sfc_ev.c\n+++ b/drivers/net/sfc/efx/sfc_ev.c\n@@ -37,6 +37,7 @@\n #include \"sfc_debug.h\"\n #include \"sfc_log.h\"\n #include \"sfc_ev.h\"\n+#include \"sfc_rx.h\"\n \n \n /* Initial delay when waiting for event queue init complete event */\n@@ -112,20 +113,30 @@ static boolean_t\n sfc_ev_rxq_flush_done(void *arg, uint32_t rxq_hw_index)\n {\n \tstruct sfc_evq *evq = arg;\n+\tstruct sfc_rxq *rxq;\n \n-\tsfc_err(evq->sa, \"EVQ %u unexpected Rx flush done event\",\n-\t\tevq->evq_index);\n-\treturn B_TRUE;\n+\trxq = evq->rxq;\n+\tSFC_ASSERT(rxq != NULL);\n+\tSFC_ASSERT(rxq->hw_index == rxq_hw_index);\n+\tSFC_ASSERT(rxq->evq == evq);\n+\tsfc_rx_qflush_done(rxq);\n+\n+\treturn B_FALSE;\n }\n \n static boolean_t\n sfc_ev_rxq_flush_failed(void *arg, uint32_t rxq_hw_index)\n {\n \tstruct sfc_evq *evq = arg;\n+\tstruct sfc_rxq *rxq;\n \n-\tsfc_err(evq->sa, \"EVQ %u unexpected Rx flush failed event\",\n-\t\tevq->evq_index);\n-\treturn B_TRUE;\n+\trxq = evq->rxq;\n+\tSFC_ASSERT(rxq != NULL);\n+\tSFC_ASSERT(rxq->hw_index == rxq_hw_index);\n+\tSFC_ASSERT(rxq->evq == evq);\n+\tsfc_rx_qflush_failed(rxq);\n+\n+\treturn B_FALSE;\n }\n \n static boolean_t\ndiff --git a/drivers/net/sfc/efx/sfc_rx.c b/drivers/net/sfc/efx/sfc_rx.c\nindex 0e1e399..8e82ee0 100644\n--- a/drivers/net/sfc/efx/sfc_rx.c\n+++ b/drivers/net/sfc/efx/sfc_rx.c\n@@ -27,12 +27,261 @@\n  * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n  */\n \n+#include <rte_mempool.h>\n+\n #include \"efx.h\"\n \n #include \"sfc.h\"\n #include \"sfc_log.h\"\n #include \"sfc_ev.h\"\n #include \"sfc_rx.h\"\n+#include \"sfc_tweak.h\"\n+\n+/*\n+ * Maximum number of Rx queue flush attempt in the case of failure or\n+ * flush timeout\n+ */\n+#define\tSFC_RX_QFLUSH_ATTEMPTS\t\t(3)\n+\n+/*\n+ * Time to wait between event queue polling attempts when waiting for Rx\n+ * queue flush done or failed events.\n+ */\n+#define\tSFC_RX_QFLUSH_POLL_WAIT_MS\t(1)\n+\n+/*\n+ * Maximum number of event queue polling attempts when wating for Rx queue\n+ * flush done or failed events. It defines Rx queue flush attempt timeout\n+ * together with SFC_RX_QFLUSH_POLL_WAIT_MS.\n+ */\n+#define\tSFC_RX_QFLUSH_POLL_ATTEMPTS\t(2000)\n+\n+void\n+sfc_rx_qflush_done(struct sfc_rxq *rxq)\n+{\n+\trxq->state |= SFC_RXQ_FLUSHED;\n+\trxq->state &= ~SFC_RXQ_FLUSHING;\n+}\n+\n+void\n+sfc_rx_qflush_failed(struct sfc_rxq *rxq)\n+{\n+\trxq->state |= SFC_RXQ_FLUSH_FAILED;\n+\trxq->state &= ~SFC_RXQ_FLUSHING;\n+}\n+\n+static void\n+sfc_rx_qrefill(struct sfc_rxq *rxq)\n+{\n+\tunsigned int free_space;\n+\tunsigned int bulks;\n+\tvoid *objs[SFC_RX_REFILL_BULK];\n+\tefsys_dma_addr_t addr[RTE_DIM(objs)];\n+\tunsigned int added = rxq->added;\n+\tunsigned int id;\n+\tunsigned int i;\n+\tstruct sfc_rx_sw_desc *rxd;\n+\tstruct rte_mbuf *m;\n+\tuint8_t port_id = rxq->port_id;\n+\n+\tfree_space = EFX_RXQ_LIMIT(rxq->ptr_mask + 1) -\n+\t\t(added - rxq->completed);\n+\tbulks = free_space / RTE_DIM(objs);\n+\n+\tid = added & rxq->ptr_mask;\n+\twhile (bulks-- > 0) {\n+\t\tif (rte_mempool_get_bulk(rxq->refill_mb_pool, objs,\n+\t\t\t\t\t RTE_DIM(objs)) < 0) {\n+\t\t\t/*\n+\t\t\t * It is hardly a safe way to increment counter\n+\t\t\t * from different contexts, but all PMDs do it.\n+\t\t\t */\n+\t\t\trxq->evq->sa->eth_dev->data->rx_mbuf_alloc_failed +=\n+\t\t\t\tRTE_DIM(objs);\n+\t\t\tbreak;\n+\t\t}\n+\n+\t\tfor (i = 0; i < RTE_DIM(objs);\n+\t\t     ++i, id = (id + 1) & rxq->ptr_mask) {\n+\t\t\tm = objs[i];\n+\n+\t\t\trxd = &rxq->sw_desc[id];\n+\t\t\trxd->mbuf = m;\n+\n+\t\t\trte_mbuf_refcnt_set(m, 1);\n+\t\t\tm->data_off = RTE_PKTMBUF_HEADROOM;\n+\t\t\tm->next = NULL;\n+\t\t\tm->nb_segs = 1;\n+\t\t\tm->port = port_id;\n+\n+\t\t\taddr[i] = rte_pktmbuf_mtophys(m);\n+\t\t}\n+\n+\t\tefx_rx_qpost(rxq->common, addr, rxq->buf_size,\n+\t\t\t     RTE_DIM(objs), rxq->completed, added);\n+\t\tadded += RTE_DIM(objs);\n+\t}\n+\n+\t/* Push doorbell if something is posted */\n+\tif (rxq->added != added) {\n+\t\trxq->added = added;\n+\t\tefx_rx_qpush(rxq->common, added, &rxq->pushed);\n+\t}\n+}\n+\n+static void\n+sfc_rx_qpurge(struct sfc_rxq *rxq)\n+{\n+\tunsigned int i;\n+\tstruct sfc_rx_sw_desc *rxd;\n+\n+\tfor (i = rxq->completed; i != rxq->added; ++i) {\n+\t\trxd = &rxq->sw_desc[i & rxq->ptr_mask];\n+\t\trte_mempool_put(rxq->refill_mb_pool, rxd->mbuf);\n+\t\trxd->mbuf = NULL;\n+\t}\n+}\n+\n+static void\n+sfc_rx_qflush(struct sfc_adapter *sa, unsigned int sw_index)\n+{\n+\tstruct sfc_rxq *rxq;\n+\tunsigned int retry_count;\n+\tunsigned int wait_count;\n+\n+\trxq = sa->rxq_info[sw_index].rxq;\n+\tSFC_ASSERT(rxq->state & SFC_RXQ_STARTED);\n+\n+\t/*\n+\t * Retry Rx queue flushing in the case of flush failed or\n+\t * timeout. In the worst case it can delay for 6 seconds.\n+\t */\n+\tfor (retry_count = 0;\n+\t     ((rxq->state & SFC_RXQ_FLUSHED) == 0) &&\n+\t     (retry_count < SFC_RX_QFLUSH_ATTEMPTS);\n+\t     ++retry_count) {\n+\t\tif (efx_rx_qflush(rxq->common) != 0) {\n+\t\t\trxq->state |= SFC_RXQ_FLUSH_FAILED;\n+\t\t\tbreak;\n+\t\t}\n+\t\trxq->state &= ~SFC_RXQ_FLUSH_FAILED;\n+\t\trxq->state |= SFC_RXQ_FLUSHING;\n+\n+\t\t/*\n+\t\t * Wait for Rx queue flush done or failed event at least\n+\t\t * SFC_RX_QFLUSH_POLL_WAIT_MS milliseconds and not more\n+\t\t * than 2 seconds (SFC_RX_QFLUSH_POLL_WAIT_MS multiplied\n+\t\t * by SFC_RX_QFLUSH_POLL_ATTEMPTS).\n+\t\t */\n+\t\twait_count = 0;\n+\t\tdo {\n+\t\t\trte_delay_ms(SFC_RX_QFLUSH_POLL_WAIT_MS);\n+\t\t\tsfc_ev_qpoll(rxq->evq);\n+\t\t} while ((rxq->state & SFC_RXQ_FLUSHING) &&\n+\t\t\t (wait_count++ < SFC_RX_QFLUSH_POLL_ATTEMPTS));\n+\n+\t\tif (rxq->state & SFC_RXQ_FLUSHING)\n+\t\t\tsfc_err(sa, \"RxQ %u flush timed out\", sw_index);\n+\n+\t\tif (rxq->state & SFC_RXQ_FLUSH_FAILED)\n+\t\t\tsfc_err(sa, \"RxQ %u flush failed\", sw_index);\n+\n+\t\tif (rxq->state & SFC_RXQ_FLUSHED)\n+\t\t\tsfc_info(sa, \"RxQ %u flushed\", sw_index);\n+\t}\n+\n+\tsfc_rx_qpurge(rxq);\n+}\n+\n+int\n+sfc_rx_qstart(struct sfc_adapter *sa, unsigned int sw_index)\n+{\n+\tstruct sfc_rxq_info *rxq_info;\n+\tstruct sfc_rxq *rxq;\n+\tstruct sfc_evq *evq;\n+\tint rc;\n+\n+\tsfc_log_init(sa, \"sw_index=%u\", sw_index);\n+\n+\tSFC_ASSERT(sw_index < sa->rxq_count);\n+\n+\trxq_info = &sa->rxq_info[sw_index];\n+\trxq = rxq_info->rxq;\n+\tSFC_ASSERT(rxq->state == SFC_RXQ_INITIALIZED);\n+\n+\tevq = rxq->evq;\n+\n+\trc = sfc_ev_qstart(sa, evq->evq_index);\n+\tif (rc != 0)\n+\t\tgoto fail_ev_qstart;\n+\n+\trc = efx_rx_qcreate(sa->nic, rxq->hw_index, 0, rxq_info->type,\n+\t\t\t    &rxq->mem, rxq_info->entries,\n+\t\t\t    0 /* not used on EF10 */, evq->common,\n+\t\t\t    &rxq->common);\n+\tif (rc != 0)\n+\t\tgoto fail_rx_qcreate;\n+\n+\tefx_rx_qenable(rxq->common);\n+\n+\trxq->pending = rxq->completed = rxq->added = rxq->pushed = 0;\n+\n+\trxq->state |= SFC_RXQ_STARTED;\n+\n+\tsfc_rx_qrefill(rxq);\n+\n+\tif (sw_index == 0) {\n+\t\trc = efx_mac_filter_default_rxq_set(sa->nic, rxq->common,\n+\t\t\t\t\t\t    B_FALSE);\n+\t\tif (rc != 0)\n+\t\t\tgoto fail_mac_filter_default_rxq_set;\n+\t}\n+\n+\t/* It seems to be used by DPDK for debug purposes only ('rte_ether') */\n+\tsa->eth_dev->data->rx_queue_state[sw_index] =\n+\t\tRTE_ETH_QUEUE_STATE_STARTED;\n+\n+\treturn 0;\n+\n+fail_mac_filter_default_rxq_set:\n+\tsfc_rx_qflush(sa, sw_index);\n+\n+fail_rx_qcreate:\n+\tsfc_ev_qstop(sa, evq->evq_index);\n+\n+fail_ev_qstart:\n+\treturn rc;\n+}\n+\n+void\n+sfc_rx_qstop(struct sfc_adapter *sa, unsigned int sw_index)\n+{\n+\tstruct sfc_rxq_info *rxq_info;\n+\tstruct sfc_rxq *rxq;\n+\n+\tsfc_log_init(sa, \"sw_index=%u\", sw_index);\n+\n+\tSFC_ASSERT(sw_index < sa->rxq_count);\n+\n+\trxq_info = &sa->rxq_info[sw_index];\n+\trxq = rxq_info->rxq;\n+\tSFC_ASSERT(rxq->state & SFC_RXQ_STARTED);\n+\n+\t/* It seems to be used by DPDK for debug purposes only ('rte_ether') */\n+\tsa->eth_dev->data->rx_queue_state[sw_index] =\n+\t\tRTE_ETH_QUEUE_STATE_STOPPED;\n+\n+\tif (sw_index == 0)\n+\t\tefx_mac_filter_default_rxq_clear(sa->nic);\n+\n+\tsfc_rx_qflush(sa, sw_index);\n+\n+\trxq->state = SFC_RXQ_INITIALIZED;\n+\n+\tefx_rx_qdestroy(rxq->common);\n+\n+\tsfc_ev_qstop(sa, rxq->evq->evq_index);\n+}\n \n static int\n sfc_rx_qcheck_conf(struct sfc_adapter *sa,\n@@ -243,6 +492,7 @@ sfc_rx_qinit(struct sfc_adapter *sa, unsigned int sw_index,\n \trxq->refill_mb_pool = mb_pool;\n \trxq->buf_size = buf_size;\n \trxq->hw_index = sw_index;\n+\trxq->port_id = sa->eth_dev->data->port_id;\n \n \trxq->state = SFC_RXQ_INITIALIZED;\n \n@@ -288,6 +538,53 @@ sfc_rx_qfini(struct sfc_adapter *sa, unsigned int sw_index)\n \trte_free(rxq);\n }\n \n+int\n+sfc_rx_start(struct sfc_adapter *sa)\n+{\n+\tint sw_index;\n+\tint rc;\n+\n+\tsfc_log_init(sa, \"rxq_count=%u\", sa->rxq_count);\n+\n+\trc = efx_rx_init(sa->nic);\n+\tif (rc != 0)\n+\t\tgoto fail_rx_init;\n+\n+\tfor (sw_index = 0; sw_index < sa->rxq_count; ++sw_index) {\n+\t\trc = sfc_rx_qstart(sa, sw_index);\n+\t\tif (rc != 0)\n+\t\t\tgoto fail_rx_qstart;\n+\t}\n+\n+\treturn 0;\n+\n+fail_rx_qstart:\n+\twhile (--sw_index >= 0)\n+\t\tsfc_rx_qstop(sa, sw_index);\n+\n+\tefx_rx_fini(sa->nic);\n+\n+fail_rx_init:\n+\tsfc_log_init(sa, \"failed %d\", rc);\n+\treturn rc;\n+}\n+\n+void\n+sfc_rx_stop(struct sfc_adapter *sa)\n+{\n+\tint sw_index;\n+\n+\tsfc_log_init(sa, \"rxq_count=%u\", sa->rxq_count);\n+\n+\tsw_index = sa->rxq_count;\n+\twhile (--sw_index >= 0) {\n+\t\tif (sa->rxq_info[sw_index].rxq != NULL)\n+\t\t\tsfc_rx_qstop(sa, sw_index);\n+\t}\n+\n+\tefx_rx_fini(sa->nic);\n+}\n+\n static int\n sfc_rx_qinit_info(struct sfc_adapter *sa, unsigned int sw_index)\n {\ndiff --git a/drivers/net/sfc/efx/sfc_rx.h b/drivers/net/sfc/efx/sfc_rx.h\nindex 3e24434..1004a84 100644\n--- a/drivers/net/sfc/efx/sfc_rx.h\n+++ b/drivers/net/sfc/efx/sfc_rx.h\n@@ -57,6 +57,14 @@ struct sfc_rx_sw_desc {\n enum sfc_rxq_state_bit {\n \tSFC_RXQ_INITIALIZED_BIT = 0,\n #define\tSFC_RXQ_INITIALIZED\t(1 << SFC_RXQ_INITIALIZED_BIT)\n+\tSFC_RXQ_STARTED_BIT,\n+#define\tSFC_RXQ_STARTED\t\t(1 << SFC_RXQ_STARTED_BIT)\n+\tSFC_RXQ_FLUSHING_BIT,\n+#define\tSFC_RXQ_FLUSHING\t(1 << SFC_RXQ_FLUSHING_BIT)\n+\tSFC_RXQ_FLUSHED_BIT,\n+#define\tSFC_RXQ_FLUSHED\t\t(1 << SFC_RXQ_FLUSHED_BIT)\n+\tSFC_RXQ_FLUSH_FAILED_BIT,\n+#define\tSFC_RXQ_FLUSH_FAILED\t(1 << SFC_RXQ_FLUSH_FAILED_BIT)\n };\n \n /**\n@@ -69,8 +77,13 @@ struct sfc_rxq {\n \tstruct sfc_rx_sw_desc\t*sw_desc;\n \tunsigned int\t\tstate;\n \tunsigned int\t\tptr_mask;\n+\tunsigned int\t\tpending;\n+\tunsigned int\t\tcompleted;\n \n \t/* Used on refill */\n+\tunsigned int\t\tadded;\n+\tunsigned int\t\tpushed;\n+\tuint8_t\t\t\tport_id;\n \tuint16_t\t\tbuf_size;\n \tstruct rte_mempool\t*refill_mb_pool;\n \tefx_rxq_t\t\t*common;\n@@ -105,12 +118,19 @@ struct sfc_rxq_info {\n \n int sfc_rx_init(struct sfc_adapter *sa);\n void sfc_rx_fini(struct sfc_adapter *sa);\n+int sfc_rx_start(struct sfc_adapter *sa);\n+void sfc_rx_stop(struct sfc_adapter *sa);\n \n int sfc_rx_qinit(struct sfc_adapter *sa, unsigned int rx_queue_id,\n \t\t uint16_t nb_rx_desc, unsigned int socket_id,\n \t\t const struct rte_eth_rxconf *rx_conf,\n \t\t struct rte_mempool *mb_pool);\n void sfc_rx_qfini(struct sfc_adapter *sa, unsigned int sw_index);\n+int sfc_rx_qstart(struct sfc_adapter *sa, unsigned int sw_index);\n+void sfc_rx_qstop(struct sfc_adapter *sa, unsigned int sw_index);\n+\n+void sfc_rx_qflush_done(struct sfc_rxq *rxq);\n+void sfc_rx_qflush_failed(struct sfc_rxq *rxq);\n \n #ifdef __cplusplus\n }\ndiff --git a/drivers/net/sfc/efx/sfc_tweak.h b/drivers/net/sfc/efx/sfc_tweak.h\nnew file mode 100644\nindex 0000000..24cb9f4\n--- /dev/null\n+++ b/drivers/net/sfc/efx/sfc_tweak.h\n@@ -0,0 +1,44 @@\n+/*-\n+ * Copyright (c) 2016 Solarflare Communications Inc.\n+ * All rights reserved.\n+ *\n+ * This software was jointly developed between OKTET Labs (under contract\n+ * for Solarflare) and Solarflare Communications, Inc.\n+ *\n+ * Redistribution and use in source and binary forms, with or without\n+ * modification, are permitted provided that the following conditions are met:\n+ *\n+ * 1. Redistributions of source code must retain the above copyright notice,\n+ *    this list of conditions and the following disclaimer.\n+ * 2. Redistributions in binary form must reproduce the above copyright notice,\n+ *    this list of conditions and the following disclaimer in the documentation\n+ *    and/or other materials provided with the distribution.\n+ *\n+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,\n+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\n+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR\n+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\n+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;\n+ * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,\n+ * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n+ */\n+\n+#ifndef _SFC_TWEAK_H_\n+#define\t_SFC_TWEAK_H_\n+\n+/*\n+ * The header is intended to collect defines/constants which could be\n+ * tweaked to improve the PMD performance characteristics depending on\n+ * the usecase or requirements (CPU load, packet rate, latency).\n+ */\n+\n+/**\n+ * Number of Rx descriptors in the bulk submitted on Rx ring refill.\n+ */\n+#define\tSFC_RX_REFILL_BULK\t(RTE_CACHE_LINE_SIZE / sizeof(efx_qword_t))\n+\n+#endif /* _SFC_TWEAK_H_ */\n",
    "prefixes": [
        "dpdk-dev",
        "49/56"
    ]
}