get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 63686,
    "url": "http://patches.dpdk.org/api/patches/63686/?format=api",
    "web_url": "http://patches.dpdk.org/project/dpdk/patch/20191209214656.27347-10-cardigliano@ntop.org/",
    "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": "<20191209214656.27347-10-cardigliano@ntop.org>",
    "list_archive_url": "https://inbox.dpdk.org/dev/20191209214656.27347-10-cardigliano@ntop.org",
    "date": "2019-12-09T21:46:48",
    "name": "[v3,09/17] net/ionic: add notifyq support",
    "commit_ref": null,
    "pull_url": null,
    "state": "superseded",
    "archived": true,
    "hash": "ca9bb994b3bd5b5a0090175d4bcccc3359e11985",
    "submitter": {
        "id": 1465,
        "url": "http://patches.dpdk.org/api/people/1465/?format=api",
        "name": "Alfredo Cardigliano",
        "email": "cardigliano@ntop.org"
    },
    "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/20191209214656.27347-10-cardigliano@ntop.org/mbox/",
    "series": [
        {
            "id": 7760,
            "url": "http://patches.dpdk.org/api/series/7760/?format=api",
            "web_url": "http://patches.dpdk.org/project/dpdk/list/?series=7760",
            "date": "2019-12-09T21:46:39",
            "name": "Introduces net/ionic PMD",
            "version": 3,
            "mbox": "http://patches.dpdk.org/series/7760/mbox/"
        }
    ],
    "comments": "http://patches.dpdk.org/api/patches/63686/comments/",
    "check": "fail",
    "checks": "http://patches.dpdk.org/api/patches/63686/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 dpdk.org (dpdk.org [92.243.14.124])\n\tby inbox.dpdk.org (Postfix) with ESMTP id 80311A04B3;\n\tMon,  9 Dec 2019 22:50:12 +0100 (CET)",
            "from [92.243.14.124] (localhost [127.0.0.1])\n\tby dpdk.org (Postfix) with ESMTP id F10621BF9B;\n\tMon,  9 Dec 2019 22:48:51 +0100 (CET)",
            "from mail.ntop.org (mail-digitalocean.ntop.org [167.99.215.164])\n by dpdk.org (Postfix) with ESMTP id C53DC5B3C\n for <dev@dpdk.org>; Mon,  9 Dec 2019 22:48:32 +0100 (CET)",
            "from devele.ntop.org (net-93-145-196-230.cust.vodafonedsl.it\n [93.145.196.230])\n by mail.ntop.org (Postfix) with ESMTPSA id 832CB41B73;\n Mon,  9 Dec 2019 22:48:32 +0100 (CET)"
        ],
        "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/simple; d=ntop.org; s=mail;\n t=1575928112; bh=IjbEa/nib1JiPEdX8qFLHIkEJK4UnTqtvxZesqjrWQE=;\n h=From:To:Cc:Subject:Date:In-Reply-To:References:From;\n b=pZ91XYLvbY3ts6f2ygKfUrldDXO2uqe65Ogzsr3I41TatDtQZ9QauJpZBfRy61o6G\n Jsgs3vOc2u+CPeQ16lSLObwYikwvuAraMmg1kKzyThqE6y0cb4Ss2TvAugZAcsBmvy\n FqiiENEAUniHQHO7N1Gl4VDSHjAZsvYRegl0KrGw=",
        "From": "Alfredo Cardigliano <cardigliano@ntop.org>",
        "To": "Alfredo Cardigliano <cardigliano@ntop.org>",
        "Cc": "dev@dpdk.org",
        "Date": "Mon,  9 Dec 2019 22:46:48 +0100",
        "Message-Id": "<20191209214656.27347-10-cardigliano@ntop.org>",
        "X-Mailer": "git-send-email 2.17.1",
        "In-Reply-To": "<20191209214656.27347-1-cardigliano@ntop.org>",
        "References": "<20191209214656.27347-1-cardigliano@ntop.org>",
        "Subject": "[dpdk-dev] [PATCH v3 09/17] net/ionic: add notifyq support",
        "X-BeenThere": "dev@dpdk.org",
        "X-Mailman-Version": "2.1.15",
        "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": "Add support for the notify queue, which is used for events\npublished by the NIC.\n\nSigned-off-by: Alfredo Cardigliano <cardigliano@ntop.org>\nReviewed-by: Shannon Nelson <snelson@pensando.io>\n---\n drivers/net/ionic/ionic.h        |   2 +\n drivers/net/ionic/ionic_ethdev.c |  97 +++++++++++++++\n drivers/net/ionic/ionic_lif.c    | 196 ++++++++++++++++++++++++++++++-\n drivers/net/ionic/ionic_lif.h    |   7 ++\n 4 files changed, 301 insertions(+), 1 deletion(-)",
    "diff": "diff --git a/drivers/net/ionic/ionic.h b/drivers/net/ionic/ionic.h\nindex 7defb5fe0..e7c8ad34b 100644\n--- a/drivers/net/ionic/ionic.h\n+++ b/drivers/net/ionic/ionic.h\n@@ -54,9 +54,11 @@ struct ionic_adapter {\n \tuint32_t nlifs;\n \tuint32_t max_ntxqs_per_lif;\n \tuint32_t max_nrxqs_per_lif;\n+\tuint32_t link_speed;\n \tuint32_t nintrs;\n \tbool intrs[IONIC_INTR_CTRL_REGS_MAX];\n \tbool is_mgmt_nic;\n+\tbool link_up;\n \tstruct rte_pci_device *pci_dev;\n \tLIST_ENTRY(ionic_adapter) pci_adapters;\n };\ndiff --git a/drivers/net/ionic/ionic_ethdev.c b/drivers/net/ionic/ionic_ethdev.c\nindex a24f6f1d9..75f5a16b9 100644\n--- a/drivers/net/ionic/ionic_ethdev.c\n+++ b/drivers/net/ionic/ionic_ethdev.c\n@@ -39,6 +39,30 @@ static LIST_HEAD(ionic_pci_adapters_list, ionic_adapter) ionic_pci_adapters =\n \t\tLIST_HEAD_INITIALIZER(ionic_pci_adapters);\n static rte_spinlock_t ionic_pci_adapters_lock = RTE_SPINLOCK_INITIALIZER;\n \n+/**\n+ * Interrupt handler triggered by NIC for handling\n+ * specific interrupt.\n+ *\n+ * @param param\n+ *  The address of parameter regsitered before.\n+ *\n+ * @return\n+ *  void\n+ */\n+static void\n+ionic_dev_interrupt_handler(void *param)\n+{\n+\tstruct ionic_adapter *adapter = (struct ionic_adapter *)param;\n+\tuint32_t i;\n+\n+\tIONIC_PRINT(DEBUG, \"->\");\n+\n+\tfor (i = 0; i < adapter->nlifs; i++) {\n+\t\tif (adapter->lifs[i])\n+\t\t\tionic_notifyq_handler(adapter->lifs[i], -1);\n+\t}\n+}\n+\n static int\n eth_ionic_dev_init(struct rte_eth_dev *eth_dev, void *init_params)\n {\n@@ -106,6 +130,70 @@ eth_ionic_dev_uninit(struct rte_eth_dev *eth_dev)\n \treturn 0;\n }\n \n+static int\n+ionic_configure_intr(struct ionic_adapter *adapter)\n+{\n+\tstruct rte_pci_device *pci_dev = adapter->pci_dev;\n+\tstruct rte_intr_handle *intr_handle = &pci_dev->intr_handle;\n+\tint err;\n+\n+\tIONIC_PRINT(DEBUG, \"Configuring %u intrs\", adapter->nintrs);\n+\n+\tif (rte_intr_efd_enable(intr_handle, adapter->nintrs)) {\n+\t\tIONIC_PRINT(ERR, \"Fail to create eventfd\");\n+\t\treturn -1;\n+\t}\n+\n+\tif (rte_intr_dp_is_en(intr_handle))\n+\t\tIONIC_PRINT(DEBUG,\n+\t\t\t\"Packet I/O interrupt on datapath is enabled\");\n+\n+\tif (!intr_handle->intr_vec) {\n+\t\tintr_handle->intr_vec = rte_zmalloc(\"intr_vec\",\n+\t\t\tadapter->nintrs * sizeof(int), 0);\n+\n+\t\tif (!intr_handle->intr_vec) {\n+\t\t\tIONIC_PRINT(ERR, \"Failed to allocate %u vectors\",\n+\t\t\t\tadapter->nintrs);\n+\t\t\treturn -ENOMEM;\n+\t\t}\n+\t}\n+\n+\terr = rte_intr_callback_register(intr_handle,\n+\t\tionic_dev_interrupt_handler,\n+\t\tadapter);\n+\n+\tif (err) {\n+\t\tIONIC_PRINT(ERR,\n+\t\t\t\"Failure registering interrupts handler (%d)\",\n+\t\t\terr);\n+\t\treturn err;\n+\t}\n+\n+\t/* enable intr mapping */\n+\terr = rte_intr_enable(intr_handle);\n+\n+\tif (err) {\n+\t\tIONIC_PRINT(ERR, \"Failure enabling interrupts (%d)\", err);\n+\t\treturn err;\n+\t}\n+\n+\treturn 0;\n+}\n+\n+static void\n+ionic_unconfigure_intr(struct ionic_adapter *adapter)\n+{\n+\tstruct rte_pci_device *pci_dev = adapter->pci_dev;\n+\tstruct rte_intr_handle *intr_handle = &pci_dev->intr_handle;\n+\n+\trte_intr_disable(intr_handle);\n+\n+\trte_intr_callback_unregister(intr_handle,\n+\t\tionic_dev_interrupt_handler,\n+\t\tadapter);\n+}\n+\n static int\n eth_ionic_pci_probe(struct rte_pci_driver *pci_drv __rte_unused,\n \t\tstruct rte_pci_device *pci_dev)\n@@ -235,6 +323,13 @@ eth_ionic_pci_probe(struct rte_pci_driver *pci_drv __rte_unused,\n \t\tadapter->nlifs++;\n \t}\n \n+\terr = ionic_configure_intr(adapter);\n+\n+\tif (err) {\n+\t\tIONIC_PRINT(ERR, \"Failed to configure interrupts\");\n+\t\tgoto err_free_adapter;\n+\t}\n+\n \trte_spinlock_lock(&ionic_pci_adapters_lock);\n \tLIST_INSERT_HEAD(&ionic_pci_adapters, adapter, pci_adapters);\n \trte_spinlock_unlock(&ionic_pci_adapters_lock);\n@@ -266,6 +361,8 @@ eth_ionic_pci_remove(struct rte_pci_device *pci_dev)\n \trte_spinlock_unlock(&ionic_pci_adapters_lock);\n \n \tif (adapter) {\n+\t\tionic_unconfigure_intr(adapter);\n+\n \t\tfor (i = 0; i < adapter->nlifs; i++) {\n \t\t\tlif = adapter->lifs[i];\n \t\t\trte_eth_dev_destroy(lif->eth_dev, eth_ionic_dev_uninit);\ndiff --git a/drivers/net/ionic/ionic_lif.c b/drivers/net/ionic/ionic_lif.c\nindex ec631b600..497b01f1f 100644\n--- a/drivers/net/ionic/ionic_lif.c\n+++ b/drivers/net/ionic/ionic_lif.c\n@@ -29,7 +29,7 @@ ionic_qcq_enable(struct ionic_qcq *qcq)\n \n \tif (qcq->flags & IONIC_QCQ_F_INTR) {\n \t\tionic_intr_mask(idev->intr_ctrl, qcq->intr.index,\n-\t\t\t\tIONIC_INTR_MASK_CLEAR);\n+\t\t\tIONIC_INTR_MASK_CLEAR);\n \t}\n \n \treturn ionic_adminq_post_wait(lif, &ctx);\n@@ -263,6 +263,28 @@ ionic_admin_qcq_alloc(struct ionic_lif *lif)\n \treturn 0;\n }\n \n+static int\n+ionic_notify_qcq_alloc(struct ionic_lif *lif)\n+{\n+\tuint32_t flags;\n+\tint err = -ENOMEM;\n+\n+\tflags = IONIC_QCQ_F_NOTIFYQ | IONIC_QCQ_F_INTR;\n+\n+\terr = ionic_qcq_alloc(lif, IONIC_QTYPE_NOTIFYQ, 0, \"notify\",\n+\t\tflags,\n+\t\tIONIC_NOTIFYQ_LENGTH,\n+\t\tsizeof(struct ionic_notifyq_cmd),\n+\t\tsizeof(union ionic_notifyq_comp),\n+\t\t0,\n+\t\tlif->kern_pid, &lif->notifyqcq);\n+\n+\tif (err)\n+\t\treturn err;\n+\n+\treturn 0;\n+}\n+\n static void *\n ionic_bus_map_dbpage(struct ionic_adapter *adapter, int page_num)\n {\n@@ -300,6 +322,17 @@ ionic_lif_alloc(struct ionic_lif *lif)\n \t\treturn -ENOMEM;\n \t}\n \n+\tIONIC_PRINT(DEBUG, \"Allocating Notify Queue\");\n+\n+\terr = ionic_notify_qcq_alloc(lif);\n+\n+\tif (err) {\n+\t\tIONIC_PRINT(ERR, \"Cannot allocate notify queue\");\n+\t\treturn err;\n+\t}\n+\n+\tIONIC_PRINT(DEBUG, \"Allocating Admin Queue\");\n+\n \tIONIC_PRINT(DEBUG, \"Allocating Admin Queue\");\n \n \terr = ionic_admin_qcq_alloc(lif);\n@@ -331,6 +364,11 @@ ionic_lif_alloc(struct ionic_lif *lif)\n void\n ionic_lif_free(struct ionic_lif *lif)\n {\n+\tif (lif->notifyqcq) {\n+\t\tionic_qcq_free(lif->notifyqcq);\n+\t\tlif->notifyqcq = NULL;\n+\t}\n+\n \tif (lif->adminqcq) {\n \t\tionic_qcq_free(lif->adminqcq);\n \t\tlif->adminqcq = NULL;\n@@ -385,6 +423,99 @@ ionic_qcq_service(struct ionic_qcq *qcq, int budget, ionic_cq_cb cb,\n \treturn work_done;\n }\n \n+static void\n+ionic_link_status_check(struct ionic_lif *lif)\n+{\n+\tstruct ionic_adapter *adapter = lif->adapter;\n+\tbool link_up;\n+\n+\tlif->state &= ~IONIC_LIF_F_LINK_CHECK_NEEDED;\n+\n+\tif (!lif->info)\n+\t\treturn;\n+\n+\tlink_up = (lif->info->status.link_status == IONIC_PORT_OPER_STATUS_UP);\n+\n+\tif ((link_up  && adapter->link_up) ||\n+\t    (!link_up && !adapter->link_up))\n+\t\treturn;\n+\n+\tif (link_up) {\n+\t\tIONIC_PRINT(DEBUG, \"Link up - %d Gbps\",\n+\t\t\tlif->info->status.link_speed);\n+\t\tadapter->link_speed = lif->info->status.link_speed;\n+\t} else {\n+\t\tIONIC_PRINT(DEBUG, \"Link down\");\n+\t}\n+\n+\tadapter->link_up = link_up;\n+}\n+\n+static bool\n+ionic_notifyq_cb(struct ionic_cq *cq, uint32_t cq_desc_index, void *cb_arg)\n+{\n+\tunion ionic_notifyq_comp *cq_desc_base = cq->base;\n+\tunion ionic_notifyq_comp *cq_desc = &cq_desc_base[cq_desc_index];\n+\tstruct ionic_lif *lif = cb_arg;\n+\n+\tIONIC_PRINT(DEBUG, \"Notifyq callback eid = %jd ecode = %d\",\n+\t\tcq_desc->event.eid, cq_desc->event.ecode);\n+\n+\t/* Have we run out of new completions to process? */\n+\tif (!(cq_desc->event.eid > lif->last_eid))\n+\t\treturn false;\n+\n+\tlif->last_eid = cq_desc->event.eid;\n+\n+\tswitch (cq_desc->event.ecode) {\n+\tcase IONIC_EVENT_LINK_CHANGE:\n+\t\tIONIC_PRINT(DEBUG,\n+\t\t\t\"Notifyq IONIC_EVENT_LINK_CHANGE eid=%jd link_status=%d link_speed=%d\",\n+\t\t\tcq_desc->event.eid,\n+\t\t\tcq_desc->link_change.link_status,\n+\t\t\tcq_desc->link_change.link_speed);\n+\n+\t\tlif->state |= IONIC_LIF_F_LINK_CHECK_NEEDED;\n+\n+\t\tbreak;\n+\tdefault:\n+\t\tIONIC_PRINT(WARNING, \"Notifyq bad event ecode=%d eid=%jd\",\n+\t\t\tcq_desc->event.ecode, cq_desc->event.eid);\n+\t\tbreak;\n+\t}\n+\n+\treturn true;\n+}\n+\n+int\n+ionic_notifyq_handler(struct ionic_lif *lif, int budget)\n+{\n+\tstruct ionic_dev *idev = &lif->adapter->idev;\n+\tstruct ionic_qcq *qcq = lif->notifyqcq;\n+\tuint32_t work_done;\n+\n+\tif (!(qcq->flags & IONIC_QCQ_F_INITED)) {\n+\t\tIONIC_PRINT(DEBUG, \"Notifyq not yet initialized\");\n+\t\treturn -1;\n+\t}\n+\n+\tionic_intr_mask(idev->intr_ctrl, qcq->intr.index,\n+\t\tIONIC_INTR_MASK_SET);\n+\n+\twork_done = ionic_qcq_service(qcq, budget, ionic_notifyq_cb, lif);\n+\n+\tif (lif->state & IONIC_LIF_F_LINK_CHECK_NEEDED)\n+\t\tionic_link_status_check(lif);\n+\n+\tionic_intr_credits(idev->intr_ctrl, qcq->intr.index,\n+\t\twork_done, IONIC_INTR_CRED_RESET_COALESCE);\n+\n+\tionic_intr_mask(idev->intr_ctrl, qcq->intr.index,\n+\t\tIONIC_INTR_MASK_CLEAR);\n+\n+\treturn 0;\n+}\n+\n static int\n ionic_lif_adminq_init(struct ionic_lif *lif)\n {\n@@ -418,6 +549,58 @@ ionic_lif_adminq_init(struct ionic_lif *lif)\n \treturn 0;\n }\n \n+static int\n+ionic_lif_notifyq_init(struct ionic_lif *lif)\n+{\n+\tstruct ionic_dev *idev = &lif->adapter->idev;\n+\tstruct ionic_qcq *qcq = lif->notifyqcq;\n+\tstruct ionic_queue *q = &qcq->q;\n+\tint err;\n+\n+\tstruct ionic_admin_ctx ctx = {\n+\t\t.pending_work = true,\n+\t\t.cmd.q_init = {\n+\t\t\t.opcode = IONIC_CMD_Q_INIT,\n+\t\t\t.lif_index = lif->index,\n+\t\t\t.type = q->type,\n+\t\t\t.index = q->index,\n+\t\t\t.flags = (IONIC_QINIT_F_IRQ | IONIC_QINIT_F_ENA),\n+\t\t\t.intr_index = qcq->intr.index,\n+\t\t\t.pid = q->pid,\n+\t\t\t.ring_size = ilog2(q->num_descs),\n+\t\t\t.ring_base = q->base_pa,\n+\t\t}\n+\t};\n+\n+\tIONIC_PRINT(DEBUG, \"notifyq_init.pid %d\", ctx.cmd.q_init.pid);\n+\tIONIC_PRINT(DEBUG, \"notifyq_init.index %d\",\n+\t\tctx.cmd.q_init.index);\n+\tIONIC_PRINT(DEBUG, \"notifyq_init.ring_base 0x%lx\",\n+\t\tctx.cmd.q_init.ring_base);\n+\tIONIC_PRINT(DEBUG, \"notifyq_init.ring_size %d\",\n+\t\tctx.cmd.q_init.ring_size);\n+\n+\terr = ionic_adminq_post_wait(lif, &ctx);\n+\tif (err)\n+\t\treturn err;\n+\n+\tq->hw_type = ctx.comp.q_init.hw_type;\n+\tq->hw_index = ctx.comp.q_init.hw_index;\n+\tq->db = NULL;\n+\n+\tIONIC_PRINT(DEBUG, \"notifyq->hw_type %d\", q->hw_type);\n+\tIONIC_PRINT(DEBUG, \"notifyq->hw_index %d\", q->hw_index);\n+\tIONIC_PRINT(DEBUG, \"notifyq->db %p\", q->db);\n+\n+\tif (qcq->flags & IONIC_QCQ_F_INTR)\n+\t\tionic_intr_mask(idev->intr_ctrl, qcq->intr.index,\n+\t\t\tIONIC_INTR_MASK_CLEAR);\n+\n+\tqcq->flags |= IONIC_QCQ_F_INITED;\n+\n+\treturn 0;\n+}\n+\n int\n ionic_lif_init(struct ionic_lif *lif)\n {\n@@ -438,9 +621,19 @@ ionic_lif_init(struct ionic_lif *lif)\n \tif (err)\n \t\treturn err;\n \n+\terr = ionic_lif_notifyq_init(lif);\n+\n+\tif (err)\n+\t\tgoto err_out_adminq_deinit;\n+\n \tlif->state |= IONIC_LIF_F_INITED;\n \n \treturn 0;\n+\n+err_out_adminq_deinit:\n+\tionic_lif_qcq_deinit(lif, lif->adminqcq);\n+\n+\treturn err;\n }\n \n void\n@@ -449,6 +642,7 @@ ionic_lif_deinit(struct ionic_lif *lif)\n \tif (!(lif->state & IONIC_LIF_F_INITED))\n \t\treturn;\n \n+\tionic_lif_qcq_deinit(lif, lif->notifyqcq);\n \tionic_lif_qcq_deinit(lif, lif->adminqcq);\n \n \tlif->state &= ~IONIC_LIF_F_INITED;\ndiff --git a/drivers/net/ionic/ionic_lif.h b/drivers/net/ionic/ionic_lif.h\nindex 96522c544..78cf92db8 100644\n--- a/drivers/net/ionic/ionic_lif.h\n+++ b/drivers/net/ionic/ionic_lif.h\n@@ -14,10 +14,12 @@\n #include \"ionic_dev.h\"\n \n #define IONIC_ADMINQ_LENGTH\t16\t/* must be a power of two */\n+#define IONIC_NOTIFYQ_LENGTH\t64\t/* must be a power of two */\n \n #define IONIC_QCQ_F_INITED\tBIT(0)\n #define IONIC_QCQ_F_SG\t\tBIT(1)\n #define IONIC_QCQ_F_INTR\tBIT(2)\n+#define IONIC_QCQ_F_NOTIFYQ\tBIT(3)\n \n /* Queue / Completion Queue */\n struct ionic_qcq {\n@@ -34,6 +36,7 @@ struct ionic_qcq {\n };\n \n #define IONIC_LIF_F_INITED\t\tBIT(0)\n+#define IONIC_LIF_F_LINK_CHECK_NEEDED\tBIT(1)\n \n #define IONIC_LIF_NAME_MAX_SZ\t\t(32)\n \n@@ -48,7 +51,9 @@ struct ionic_lif {\n \trte_spinlock_t adminq_lock;\n \trte_spinlock_t adminq_service_lock;\n \tstruct ionic_qcq *adminqcq;\n+\tstruct ionic_qcq *notifyqcq;\n \tstruct ionic_doorbell __iomem *kern_dbpage;\n+\tuint64_t last_eid;\n \tchar name[IONIC_LIF_NAME_MAX_SZ];\n \tuint32_t info_sz;\n \tstruct ionic_lif_info *info;\n@@ -83,4 +88,6 @@ void ionic_qcq_free(struct ionic_qcq *qcq);\n int ionic_qcq_enable(struct ionic_qcq *qcq);\n int ionic_qcq_disable(struct ionic_qcq *qcq);\n \n+int ionic_notifyq_handler(struct ionic_lif *lif, int budget);\n+\n #endif /* _IONIC_LIF_H_ */\n",
    "prefixes": [
        "v3",
        "09/17"
    ]
}