get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 16931,
    "url": "https://patches.dpdk.org/api/patches/16931/?format=api",
    "web_url": "https://patches.dpdk.org/project/dpdk/patch/1478250651-37307-2-git-send-email-qiming.yang@intel.com/",
    "project": {
        "id": 1,
        "url": "https://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": "<1478250651-37307-2-git-send-email-qiming.yang@intel.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/1478250651-37307-2-git-send-email-qiming.yang@intel.com",
    "date": "2016-11-04T09:10:51",
    "name": "[dpdk-dev,v4,2/2] net/i40e: fix VF bonded device link down",
    "commit_ref": null,
    "pull_url": null,
    "state": "accepted",
    "archived": true,
    "hash": "112a95138d5b04b393649fc0dbfcfe85f957de9f",
    "submitter": {
        "id": 522,
        "url": "https://patches.dpdk.org/api/people/522/?format=api",
        "name": "Qiming Yang",
        "email": "qiming.yang@intel.com"
    },
    "delegate": {
        "id": 10,
        "url": "https://patches.dpdk.org/api/users/10/?format=api",
        "username": "bruce",
        "first_name": "Bruce",
        "last_name": "Richardson",
        "email": "bruce.richardson@intel.com"
    },
    "mbox": "https://patches.dpdk.org/project/dpdk/patch/1478250651-37307-2-git-send-email-qiming.yang@intel.com/mbox/",
    "series": [],
    "comments": "https://patches.dpdk.org/api/patches/16931/comments/",
    "check": "warning",
    "checks": "https://patches.dpdk.org/api/patches/16931/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 59D0547CD;\n\tFri,  4 Nov 2016 10:14:18 +0100 (CET)",
            "from mga07.intel.com (mga07.intel.com [134.134.136.100])\n\tby dpdk.org (Postfix) with ESMTP id 65BFB293C\n\tfor <dev@dpdk.org>; Fri,  4 Nov 2016 10:13:48 +0100 (CET)",
            "from orsmga004.jf.intel.com ([10.7.209.38])\n\tby orsmga105.jf.intel.com with ESMTP; 04 Nov 2016 02:13:47 -0700",
            "from dpdk1.bj.intel.com ([172.16.182.84])\n\tby orsmga004.jf.intel.com with ESMTP; 04 Nov 2016 02:13:46 -0700"
        ],
        "X-ExtLoop1": "1",
        "X-IronPort-AV": "E=Sophos;i=\"5.31,442,1473145200\"; d=\"scan'208\";a=\"27711675\"",
        "From": "Qiming Yang <qiming.yang@intel.com>",
        "To": "dev@dpdk.org",
        "Cc": "jingjing.wu@intel.com, bruce.richardson@intel.com,\n\tQiming Yang <qiming.yang@intel.com>",
        "Date": "Fri,  4 Nov 2016 17:10:51 +0800",
        "Message-Id": "<1478250651-37307-2-git-send-email-qiming.yang@intel.com>",
        "X-Mailer": "git-send-email 2.5.5",
        "In-Reply-To": "<1478250651-37307-1-git-send-email-qiming.yang@intel.com>",
        "References": "<1477628339-5816-2-git-send-email-qiming.yang@intel.com>\n\t<1478250651-37307-1-git-send-email-qiming.yang@intel.com>",
        "Subject": "[dpdk-dev] [PATCH v4 2/2] net/i40e: fix VF bonded device link down",
        "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": "If VF device is used as slave of a bond device, it will be polled\nperiodically through alarm. Interrupt is involved here. And then\nVF will send I40E_VIRTCHNL_OP_GET_LINK_STAT message to\nPF to query the status. The response is handled by interrupt\ncallback. Interrupt is involved here again. That's why bond\ndevice cannot bring up.\n\nThis patch removes I40E_VIRTCHNL_OP_GET_LINK_STAT\nmessage. Link status in VF driver will be updated when PF driver\nnotify it, and VF stores this link status locally. VF driver just\nreturns the local status when being required.\n\nFixes: 4861cde46116 (\"i40e: new poll mode driver\")\n\nSigned-off-by: Qiming Yang <qiming.yang@intel.com>\nAcked-by: Jingjing Wu <jingjing.wu@intel.com>\n---\n v3 changes:\n * resolved the conflict with other changes, rework based\n   on version: 16.11-rc2\n v4 changes:\n *fixed compilation error with icc\n\n drivers/net/i40e/i40e_ethdev.c    | 22 ++++++++++-\n drivers/net/i40e/i40e_ethdev.h    |  4 +-\n drivers/net/i40e/i40e_ethdev_vf.c | 81 +++++++++++++--------------------------\n drivers/net/i40e/i40e_pf.c        | 33 ++++++++--------\n drivers/net/i40e/i40e_pf.h        |  3 +-\n 5 files changed, 67 insertions(+), 76 deletions(-)",
    "diff": "diff --git a/drivers/net/i40e/i40e_ethdev.c b/drivers/net/i40e/i40e_ethdev.c\nindex 078c581..fbaec23 100644\n--- a/drivers/net/i40e/i40e_ethdev.c\n+++ b/drivers/net/i40e/i40e_ethdev.c\n@@ -5441,6 +5441,24 @@ i40e_dev_handle_vfr_event(struct rte_eth_dev *dev)\n }\n \n static void\n+i40e_notify_all_vfs_link_status(struct rte_eth_dev *dev)\n+{\n+\tstruct i40e_pf *pf = I40E_DEV_PRIVATE_TO_PF(dev->data->dev_private);\n+\tstruct i40e_virtchnl_pf_event event;\n+\tint i;\n+\n+\tevent.event = I40E_VIRTCHNL_EVENT_LINK_CHANGE;\n+\tevent.event_data.link_event.link_status =\n+\t\tdev->data->dev_link.link_status;\n+\tevent.event_data.link_event.link_speed =\n+\t\t(enum i40e_aq_link_speed)dev->data->dev_link.link_speed;\n+\n+\tfor (i = 0; i < pf->vf_num; i++)\n+\t\ti40e_pf_host_send_msg_to_vf(&pf->vfs[i], I40E_VIRTCHNL_OP_EVENT,\n+\t\t\t\tI40E_SUCCESS, (uint8_t *)&event, sizeof(event));\n+}\n+\n+static void\n i40e_dev_handle_aq_msg(struct rte_eth_dev *dev)\n {\n \tstruct i40e_hw *hw = I40E_DEV_PRIVATE_TO_HW(dev->data->dev_private);\n@@ -5478,9 +5496,11 @@ i40e_dev_handle_aq_msg(struct rte_eth_dev *dev)\n \t\t\tbreak;\n \t\tcase i40e_aqc_opc_get_link_status:\n \t\t\tret = i40e_dev_link_update(dev, 0);\n-\t\t\tif (!ret)\n+\t\t\tif (!ret) {\n+\t\t\t\ti40e_notify_all_vfs_link_status(dev);\n \t\t\t\t_rte_eth_dev_callback_process(dev,\n \t\t\t\t\tRTE_ETH_EVENT_INTR_LSC, NULL);\n+\t\t\t}\n \t\t\tbreak;\n \t\tdefault:\n \t\t\tPMD_DRV_LOG(ERR, \"Request %u is not supported yet\",\ndiff --git a/drivers/net/i40e/i40e_ethdev.h b/drivers/net/i40e/i40e_ethdev.h\nindex 24b8580..298cef4 100644\n--- a/drivers/net/i40e/i40e_ethdev.h\n+++ b/drivers/net/i40e/i40e_ethdev.h\n@@ -609,7 +609,9 @@ int i40e_hash_filter_inset_select(struct i40e_hw *hw,\n \t\t\t     struct rte_eth_input_set_conf *conf);\n int i40e_fdir_filter_inset_select(struct i40e_pf *pf,\n \t\t\t     struct rte_eth_input_set_conf *conf);\n-\n+int i40e_pf_host_send_msg_to_vf(struct i40e_pf_vf *vf, uint32_t opcode,\n+\t\t\t\tuint32_t retval, uint8_t *msg,\n+\t\t\t\tuint16_t msglen);\n void i40e_rxq_info_get(struct rte_eth_dev *dev, uint16_t queue_id,\n \tstruct rte_eth_rxq_info *qinfo);\n void i40e_txq_info_get(struct rte_eth_dev *dev, uint16_t queue_id,\ndiff --git a/drivers/net/i40e/i40e_ethdev_vf.c b/drivers/net/i40e/i40e_ethdev_vf.c\nindex 4b835cb..aa306d6 100644\n--- a/drivers/net/i40e/i40e_ethdev_vf.c\n+++ b/drivers/net/i40e/i40e_ethdev_vf.c\n@@ -126,8 +126,6 @@ static void i40evf_dev_promiscuous_enable(struct rte_eth_dev *dev);\n static void i40evf_dev_promiscuous_disable(struct rte_eth_dev *dev);\n static void i40evf_dev_allmulticast_enable(struct rte_eth_dev *dev);\n static void i40evf_dev_allmulticast_disable(struct rte_eth_dev *dev);\n-static int i40evf_get_link_status(struct rte_eth_dev *dev,\n-\t\t\t\t  struct rte_eth_link *link);\n static int i40evf_init_vlan(struct rte_eth_dev *dev);\n static int i40evf_dev_rx_queue_start(struct rte_eth_dev *dev,\n \t\t\t\t     uint16_t rx_queue_id);\n@@ -1084,31 +1082,6 @@ i40evf_del_vlan(struct rte_eth_dev *dev, uint16_t vlanid)\n \treturn err;\n }\n \n-static int\n-i40evf_get_link_status(struct rte_eth_dev *dev, struct rte_eth_link *link)\n-{\n-\tstruct i40e_vf *vf = I40EVF_DEV_PRIVATE_TO_VF(dev->data->dev_private);\n-\tint err;\n-\tstruct vf_cmd_info args;\n-\tstruct rte_eth_link *new_link;\n-\n-\targs.ops = (enum i40e_virtchnl_ops)I40E_VIRTCHNL_OP_GET_LINK_STAT;\n-\targs.in_args = NULL;\n-\targs.in_args_size = 0;\n-\targs.out_buffer = vf->aq_resp;\n-\targs.out_size = I40E_AQ_BUF_SZ;\n-\terr = i40evf_execute_vf_cmd(dev, &args);\n-\tif (err) {\n-\t\tPMD_DRV_LOG(ERR, \"fail to execute command OP_GET_LINK_STAT\");\n-\t\treturn err;\n-\t}\n-\n-\tnew_link = (struct rte_eth_link *)args.out_buffer;\n-\t(void)rte_memcpy(link, new_link, sizeof(*link));\n-\n-\treturn 0;\n-}\n-\n static const struct rte_pci_id pci_id_i40evf_map[] = {\n \t{ RTE_PCI_DEVICE(I40E_INTEL_VENDOR_ID, I40E_DEV_ID_VF) },\n \t{ RTE_PCI_DEVICE(I40E_INTEL_VENDOR_ID, I40E_DEV_ID_VF_HV) },\n@@ -2146,35 +2119,33 @@ i40evf_dev_link_update(struct rte_eth_dev *dev,\n \t * DPDK pf host provide interfacet to acquire link status\n \t * while Linux driver does not\n \t */\n-\tif (vf->version_major == I40E_DPDK_VERSION_MAJOR)\n-\t\ti40evf_get_link_status(dev, &new_link);\n-\telse {\n-\t\t/* Linux driver PF host */\n-\t\tswitch (vf->link_speed) {\n-\t\tcase I40E_LINK_SPEED_100MB:\n-\t\t\tnew_link.link_speed = ETH_SPEED_NUM_100M;\n-\t\t\tbreak;\n-\t\tcase I40E_LINK_SPEED_1GB:\n-\t\t\tnew_link.link_speed = ETH_SPEED_NUM_1G;\n-\t\t\tbreak;\n-\t\tcase I40E_LINK_SPEED_10GB:\n-\t\t\tnew_link.link_speed = ETH_SPEED_NUM_10G;\n-\t\t\tbreak;\n-\t\tcase I40E_LINK_SPEED_20GB:\n-\t\t\tnew_link.link_speed = ETH_SPEED_NUM_20G;\n-\t\t\tbreak;\n-\t\tcase I40E_LINK_SPEED_40GB:\n-\t\t\tnew_link.link_speed = ETH_SPEED_NUM_40G;\n-\t\t\tbreak;\n-\t\tdefault:\n-\t\t\tnew_link.link_speed = ETH_SPEED_NUM_100M;\n-\t\t\tbreak;\n-\t\t}\n-\t\t/* full duplex only */\n-\t\tnew_link.link_duplex = ETH_LINK_FULL_DUPLEX;\n-\t\tnew_link.link_status = vf->link_up ? ETH_LINK_UP :\n-\t\t\t\t\t\t     ETH_LINK_DOWN;\n+\n+\t/* Linux driver PF host */\n+\tswitch (vf->link_speed) {\n+\tcase I40E_LINK_SPEED_100MB:\n+\t\tnew_link.link_speed = ETH_SPEED_NUM_100M;\n+\t\tbreak;\n+\tcase I40E_LINK_SPEED_1GB:\n+\t\tnew_link.link_speed = ETH_SPEED_NUM_1G;\n+\t\tbreak;\n+\tcase I40E_LINK_SPEED_10GB:\n+\t\tnew_link.link_speed = ETH_SPEED_NUM_10G;\n+\t\tbreak;\n+\tcase I40E_LINK_SPEED_20GB:\n+\t\tnew_link.link_speed = ETH_SPEED_NUM_20G;\n+\t\tbreak;\n+\tcase I40E_LINK_SPEED_40GB:\n+\t\tnew_link.link_speed = ETH_SPEED_NUM_40G;\n+\t\tbreak;\n+\tdefault:\n+\t\tnew_link.link_speed = ETH_SPEED_NUM_100M;\n+\t\tbreak;\n \t}\n+\t/* full duplex only */\n+\tnew_link.link_duplex = ETH_LINK_FULL_DUPLEX;\n+\tnew_link.link_status = vf->link_up ? ETH_LINK_UP :\n+\t\t\t\t\t     ETH_LINK_DOWN;\n+\n \ti40evf_dev_atomic_write_link_status(dev, &new_link);\n \n \treturn 0;\ndiff --git a/drivers/net/i40e/i40e_pf.c b/drivers/net/i40e/i40e_pf.c\nindex d5b2d45..ddfc140 100644\n--- a/drivers/net/i40e/i40e_pf.c\n+++ b/drivers/net/i40e/i40e_pf.c\n@@ -250,7 +250,7 @@ i40e_pf_host_vf_reset(struct i40e_pf_vf *vf, bool do_hw_reset)\n \treturn ret;\n }\n \n-static int\n+int\n i40e_pf_host_send_msg_to_vf(struct i40e_pf_vf *vf,\n \t\t\t    uint32_t opcode,\n \t\t\t    uint32_t retval,\n@@ -847,18 +847,6 @@ i40e_pf_host_process_cmd_get_stats(struct i40e_pf_vf *vf)\n \treturn I40E_SUCCESS;\n }\n \n-static void\n-i40e_pf_host_process_cmd_get_link_status(struct i40e_pf_vf *vf)\n-{\n-\tstruct rte_eth_dev *dev = I40E_VSI_TO_ETH_DEV(vf->pf->main_vsi);\n-\n-\t/* Update link status first to acquire latest link change */\n-\ti40e_dev_link_update(dev, 1);\n-\ti40e_pf_host_send_msg_to_vf(vf, I40E_VIRTCHNL_OP_GET_LINK_STAT,\n-\t\tI40E_SUCCESS, (uint8_t *)&dev->data->dev_link,\n-\t\t\t\tsizeof(struct rte_eth_link));\n-}\n-\n static int\n i40e_pf_host_process_cmd_cfg_vlan_offload(\n \t\t\t\t\tstruct i40e_pf_vf *vf,\n@@ -909,6 +897,20 @@ send_msg:\n \treturn ret;\n }\n \n+static void\n+i40e_notify_vf_link_status(struct rte_eth_dev *dev, struct i40e_pf_vf *vf)\n+{\n+\tstruct i40e_virtchnl_pf_event event;\n+\n+\tevent.event = I40E_VIRTCHNL_EVENT_LINK_CHANGE;\n+\tevent.event_data.link_event.link_status =\n+\t\tdev->data->dev_link.link_status;\n+\tevent.event_data.link_event.link_speed =\n+\t\t(enum i40e_aq_link_speed)dev->data->dev_link.link_speed;\n+\ti40e_pf_host_send_msg_to_vf(vf, I40E_VIRTCHNL_OP_EVENT,\n+\t\tI40E_SUCCESS, (uint8_t *)&event, sizeof(event));\n+}\n+\n void\n i40e_pf_host_handle_vf_msg(struct rte_eth_dev *dev,\n \t\t\t   uint16_t abs_vf_id, uint32_t opcode,\n@@ -964,6 +966,7 @@ i40e_pf_host_handle_vf_msg(struct rte_eth_dev *dev,\n \tcase I40E_VIRTCHNL_OP_ENABLE_QUEUES:\n \t\tPMD_DRV_LOG(INFO, \"OP_ENABLE_QUEUES received\");\n \t\ti40e_pf_host_process_cmd_enable_queues(vf, msg, msglen);\n+\t\ti40e_notify_vf_link_status(dev, vf);\n \t\tbreak;\n \tcase I40E_VIRTCHNL_OP_DISABLE_QUEUES:\n \t\tPMD_DRV_LOG(INFO, \"OP_DISABLE_QUEUE received\");\n@@ -993,10 +996,6 @@ i40e_pf_host_handle_vf_msg(struct rte_eth_dev *dev,\n \t\tPMD_DRV_LOG(INFO, \"OP_GET_STATS received\");\n \t\ti40e_pf_host_process_cmd_get_stats(vf);\n \t\tbreak;\n-\tcase I40E_VIRTCHNL_OP_GET_LINK_STAT:\n-\t\tPMD_DRV_LOG(INFO, \"OP_GET_LINK_STAT received\");\n-\t\ti40e_pf_host_process_cmd_get_link_status(vf);\n-\t\tbreak;\n \tcase I40E_VIRTCHNL_OP_CFG_VLAN_OFFLOAD:\n \t\tPMD_DRV_LOG(INFO, \"OP_CFG_VLAN_OFFLOAD received\");\n \t\ti40e_pf_host_process_cmd_cfg_vlan_offload(vf, msg, msglen);\ndiff --git a/drivers/net/i40e/i40e_pf.h b/drivers/net/i40e/i40e_pf.h\nindex 9c01829..cddc45c 100644\n--- a/drivers/net/i40e/i40e_pf.h\n+++ b/drivers/net/i40e/i40e_pf.h\n@@ -59,9 +59,8 @@ enum i40e_virtchnl_ops_dpdk {\n \t * Keep some gap between Linux PF commands and\n \t * DPDK PF extended commands.\n \t */\n-\tI40E_VIRTCHNL_OP_GET_LINK_STAT = I40E_VIRTCHNL_OP_VERSION +\n+\tI40E_VIRTCHNL_OP_CFG_VLAN_OFFLOAD = I40E_VIRTCHNL_OP_VERSION +\n \t\t\t\t\t\tI40E_DPDK_OFFSET,\n-\tI40E_VIRTCHNL_OP_CFG_VLAN_OFFLOAD,\n \tI40E_VIRTCHNL_OP_CFG_VLAN_PVID,\n \tI40E_VIRTCHNL_OP_CONFIG_VSI_QUEUES_EXT,\n };\n",
    "prefixes": [
        "dpdk-dev",
        "v4",
        "2/2"
    ]
}