Patch Detail
get:
Show a patch.
patch:
Update a patch.
put:
Update a patch.
GET /api/patches/1016227/?format=api
{ "id": 1016227, "url": "http://patchwork.ozlabs.org/api/patches/1016227/?format=api", "web_url": "http://patchwork.ozlabs.org/project/intel-wired-lan/patch/20181219180334.1104-9-anirudh.venkataramanan@intel.com/", "project": { "id": 46, "url": "http://patchwork.ozlabs.org/api/projects/46/?format=api", "name": "Intel Wired Ethernet development", "link_name": "intel-wired-lan", "list_id": "intel-wired-lan.osuosl.org", "list_email": "intel-wired-lan@osuosl.org", "web_url": "", "scm_url": "", "webscm_url": "", "list_archive_url": "", "list_archive_url_format": "", "commit_url_format": "" }, "msgid": "<20181219180334.1104-9-anirudh.venkataramanan@intel.com>", "list_archive_url": null, "date": "2018-12-19T18:03:27", "name": "[S10,08/15] ice: Rework queue manangement code for reuse", "commit_ref": null, "pull_url": null, "state": "accepted", "archived": false, "hash": "49915fab2e9269375e9560f4b58895076aa8917f", "submitter": { "id": 73601, "url": "http://patchwork.ozlabs.org/api/people/73601/?format=api", "name": "Anirudh Venkataramanan", "email": "anirudh.venkataramanan@intel.com" }, "delegate": { "id": 68, "url": "http://patchwork.ozlabs.org/api/users/68/?format=api", "username": "jtkirshe", "first_name": "Jeff", "last_name": "Kirsher", "email": "jeffrey.t.kirsher@intel.com" }, "mbox": "http://patchwork.ozlabs.org/project/intel-wired-lan/patch/20181219180334.1104-9-anirudh.venkataramanan@intel.com/mbox/", "series": [ { "id": 82906, "url": "http://patchwork.ozlabs.org/api/series/82906/?format=api", "web_url": "http://patchwork.ozlabs.org/project/intel-wired-lan/list/?series=82906", "date": "2018-12-19T18:03:28", "name": "Feature updates for ice", "version": 1, "mbox": "http://patchwork.ozlabs.org/series/82906/mbox/" } ], "comments": "http://patchwork.ozlabs.org/api/patches/1016227/comments/", "check": "pending", "checks": "http://patchwork.ozlabs.org/api/patches/1016227/checks/", "tags": {}, "related": [], "headers": { "Return-Path": "<intel-wired-lan-bounces@osuosl.org>", "X-Original-To": [ "incoming@patchwork.ozlabs.org", "intel-wired-lan@lists.osuosl.org" ], "Delivered-To": [ "patchwork-incoming@bilbo.ozlabs.org", "intel-wired-lan@lists.osuosl.org" ], "Authentication-Results": [ "ozlabs.org;\n\tspf=pass (mailfrom) smtp.mailfrom=osuosl.org\n\t(client-ip=140.211.166.138; helo=whitealder.osuosl.org;\n\tenvelope-from=intel-wired-lan-bounces@osuosl.org;\n\treceiver=<UNKNOWN>)", "ozlabs.org;\n\tdmarc=fail (p=none dis=none) header.from=intel.com" ], "Received": [ "from whitealder.osuosl.org (smtp1.osuosl.org [140.211.166.138])\n\t(using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256\n\tbits)) (No client certificate requested)\n\tby ozlabs.org (Postfix) with ESMTPS id 43KjSR2pBgz9s3Z\n\tfor <incoming@patchwork.ozlabs.org>;\n\tThu, 20 Dec 2018 05:03:51 +1100 (AEDT)", "from localhost (localhost [127.0.0.1])\n\tby whitealder.osuosl.org (Postfix) with ESMTP id 0225F86456;\n\tWed, 19 Dec 2018 18:03:50 +0000 (UTC)", "from whitealder.osuosl.org ([127.0.0.1])\n\tby localhost (.osuosl.org [127.0.0.1]) (amavisd-new, port 10024)\n\twith ESMTP id TgKT5eXxQ1iN; Wed, 19 Dec 2018 18:03:45 +0000 (UTC)", "from ash.osuosl.org (ash.osuosl.org [140.211.166.34])\n\tby whitealder.osuosl.org (Postfix) with ESMTP id D428786447;\n\tWed, 19 Dec 2018 18:03:45 +0000 (UTC)", "from hemlock.osuosl.org (smtp2.osuosl.org [140.211.166.133])\n\tby ash.osuosl.org (Postfix) with ESMTP id B76821C2A9B\n\tfor <intel-wired-lan@lists.osuosl.org>;\n\tWed, 19 Dec 2018 18:03:39 +0000 (UTC)", "from localhost (localhost [127.0.0.1])\n\tby hemlock.osuosl.org (Postfix) with ESMTP id B4CE4879FC\n\tfor <intel-wired-lan@lists.osuosl.org>;\n\tWed, 19 Dec 2018 18:03:39 +0000 (UTC)", "from hemlock.osuosl.org ([127.0.0.1])\n\tby localhost (.osuosl.org [127.0.0.1]) (amavisd-new, port 10024)\n\twith ESMTP id g8AvGcHN16Y3 for <intel-wired-lan@lists.osuosl.org>;\n\tWed, 19 Dec 2018 18:03:36 +0000 (UTC)", "from mga06.intel.com (mga06.intel.com [134.134.136.31])\n\tby hemlock.osuosl.org (Postfix) with ESMTPS id B80DD87866\n\tfor <intel-wired-lan@lists.osuosl.org>;\n\tWed, 19 Dec 2018 18:03:36 +0000 (UTC)", "from fmsmga002.fm.intel.com ([10.253.24.26])\n\tby orsmga104.jf.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384;\n\t19 Dec 2018 10:03:35 -0800", "from shasta.jf.intel.com ([10.166.241.11])\n\tby fmsmga002.fm.intel.com with ESMTP; 19 Dec 2018 10:03:35 -0800" ], "X-Virus-Scanned": [ "amavisd-new at osuosl.org", "amavisd-new at osuosl.org" ], "X-Greylist": "domain auto-whitelisted by SQLgrey-1.7.6", "X-Amp-Result": "SKIPPED(no attachment in message)", "X-Amp-File-Uploaded": "False", "X-ExtLoop1": "1", "X-IronPort-AV": "E=Sophos;i=\"5.56,373,1539673200\"; d=\"scan'208\";a=\"127400079\"", "From": "Anirudh Venkataramanan <anirudh.venkataramanan@intel.com>", "To": "intel-wired-lan@lists.osuosl.org", "Date": "Wed, 19 Dec 2018 10:03:27 -0800", "Message-Id": "<20181219180334.1104-9-anirudh.venkataramanan@intel.com>", "X-Mailer": "git-send-email 2.14.5", "In-Reply-To": "<20181219180334.1104-1-anirudh.venkataramanan@intel.com>", "References": "<20181219180334.1104-1-anirudh.venkataramanan@intel.com>", "Subject": "[Intel-wired-lan] [PATCH S10 08/15] ice: Rework queue manangement\n\tcode for reuse", "X-BeenThere": "intel-wired-lan@osuosl.org", "X-Mailman-Version": "2.1.29", "Precedence": "list", "List-Id": "Intel Wired Ethernet Linux Kernel Driver Development\n\t<intel-wired-lan.osuosl.org>", "List-Unsubscribe": "<https://lists.osuosl.org/mailman/options/intel-wired-lan>, \n\t<mailto:intel-wired-lan-request@osuosl.org?subject=unsubscribe>", "List-Archive": "<http://lists.osuosl.org/pipermail/intel-wired-lan/>", "List-Post": "<mailto:intel-wired-lan@osuosl.org>", "List-Help": "<mailto:intel-wired-lan-request@osuosl.org?subject=help>", "List-Subscribe": "<https://lists.osuosl.org/mailman/listinfo/intel-wired-lan>, \n\t<mailto:intel-wired-lan-request@osuosl.org?subject=subscribe>", "MIME-Version": "1.0", "Content-Type": "text/plain; charset=\"us-ascii\"", "Content-Transfer-Encoding": "7bit", "Errors-To": "intel-wired-lan-bounces@osuosl.org", "Sender": "\"Intel-wired-lan\" <intel-wired-lan-bounces@osuosl.org>" }, "content": "This patch reworks the queue management code to allow for reuse with the\nXDP feature (to be added in a future patch).\n\nSigned-off-by: Maciej Fijalkowski <maciej.fijalkowski@intel.com>\nSigned-off-by: Anirudh Venkataramanan <anirudh.venkataramanan@intel.com>\n---\n drivers/net/ethernet/intel/ice/ice.h | 11 ++\n drivers/net/ethernet/intel/ice/ice_lib.c | 234 ++++++++++++-----------\n drivers/net/ethernet/intel/ice/ice_lib.h | 5 +-\n drivers/net/ethernet/intel/ice/ice_main.c | 6 +-\n drivers/net/ethernet/intel/ice/ice_virtchnl_pf.c | 24 ++-\n 5 files changed, 157 insertions(+), 123 deletions(-)", "diff": "diff --git a/drivers/net/ethernet/intel/ice/ice.h b/drivers/net/ethernet/intel/ice/ice.h\nindex 8af882a2b070..ffe4ffe16912 100644\n--- a/drivers/net/ethernet/intel/ice/ice.h\n+++ b/drivers/net/ethernet/intel/ice/ice.h\n@@ -129,6 +129,17 @@ struct ice_res_tracker {\n \tu16 list[1];\n };\n \n+struct ice_qs_cfg {\n+\tstruct mutex *qs_mutex; /* will be assgined to &pf->avail_q_mutex */\n+\tunsigned long *pf_map;\n+\tunsigned long pf_map_size;\n+\tunsigned int q_count;\n+\tunsigned int scatter_count;\n+\tu16 *vsi_map;\n+\tu16 vsi_map_offset;\n+\tu8 mapping_mode;\n+};\n+\n struct ice_sw {\n \tstruct ice_pf *pf;\n \tu16 sw_id;\t\t/* switch ID for this switch */\ndiff --git a/drivers/net/ethernet/intel/ice/ice_lib.c b/drivers/net/ethernet/intel/ice/ice_lib.c\nindex 3bd24173b39c..67f01292337a 100644\n--- a/drivers/net/ethernet/intel/ice/ice_lib.c\n+++ b/drivers/net/ethernet/intel/ice/ice_lib.c\n@@ -514,109 +514,86 @@ static struct ice_vsi *ice_vsi_alloc(struct ice_pf *pf, enum ice_vsi_type type)\n }\n \n /**\n- * ice_vsi_get_qs_contig - Assign a contiguous chunk of queues to VSI\n- * @vsi: the VSI getting queues\n+ * __ice_vsi_get_qs_contig - Assign a contiguous chunk of queues to VSI\n+ * @qs_cfg: gathered variables needed for PF->VSI queues assignment\n *\n- * Return 0 on success and a negative value on error\n+ * Return 0 on success and -ENOMEM in case of no left space in PF queue bitmap\n */\n-static int ice_vsi_get_qs_contig(struct ice_vsi *vsi)\n+static int __ice_vsi_get_qs_contig(struct ice_qs_cfg *qs_cfg)\n {\n-\tstruct ice_pf *pf = vsi->back;\n-\tint offset, ret = 0;\n-\n-\tmutex_lock(&pf->avail_q_mutex);\n-\t/* look for contiguous block of queues for Tx */\n-\toffset = bitmap_find_next_zero_area(pf->avail_txqs, ICE_MAX_TXQS,\n-\t\t\t\t\t 0, vsi->alloc_txq, 0);\n-\tif (offset < ICE_MAX_TXQS) {\n-\t\tint i;\n+\tint offset, i;\n \n-\t\tbitmap_set(pf->avail_txqs, offset, vsi->alloc_txq);\n-\t\tfor (i = 0; i < vsi->alloc_txq; i++)\n-\t\t\tvsi->txq_map[i] = i + offset;\n-\t} else {\n-\t\tret = -ENOMEM;\n-\t\tvsi->tx_mapping_mode = ICE_VSI_MAP_SCATTER;\n+\tmutex_lock(qs_cfg->qs_mutex);\n+\toffset = bitmap_find_next_zero_area(qs_cfg->pf_map, qs_cfg->pf_map_size,\n+\t\t\t\t\t 0, qs_cfg->q_count, 0);\n+\tif (offset >= qs_cfg->pf_map_size) {\n+\t\tmutex_unlock(qs_cfg->qs_mutex);\n+\t\treturn -ENOMEM;\n \t}\n \n-\t/* look for contiguous block of queues for Rx */\n-\toffset = bitmap_find_next_zero_area(pf->avail_rxqs, ICE_MAX_RXQS,\n-\t\t\t\t\t 0, vsi->alloc_rxq, 0);\n-\tif (offset < ICE_MAX_RXQS) {\n-\t\tint i;\n-\n-\t\tbitmap_set(pf->avail_rxqs, offset, vsi->alloc_rxq);\n-\t\tfor (i = 0; i < vsi->alloc_rxq; i++)\n-\t\t\tvsi->rxq_map[i] = i + offset;\n-\t} else {\n-\t\tret = -ENOMEM;\n-\t\tvsi->rx_mapping_mode = ICE_VSI_MAP_SCATTER;\n-\t}\n-\tmutex_unlock(&pf->avail_q_mutex);\n+\tbitmap_set(qs_cfg->pf_map, offset, qs_cfg->q_count);\n+\tfor (i = 0; i < qs_cfg->q_count; i++)\n+\t\tqs_cfg->vsi_map[i + qs_cfg->vsi_map_offset] = i + offset;\n+\tmutex_unlock(qs_cfg->qs_mutex);\n \n-\treturn ret;\n+\treturn 0;\n }\n \n /**\n- * ice_vsi_get_qs_scatter - Assign a scattered queues to VSI\n- * @vsi: the VSI getting queues\n+ * __ice_vsi_get_qs_sc - Assign a scattered queues from PF to VSI\n+ * @qs_cfg: gathered variables needed for PF->VSI queues assignment\n *\n- * Return 0 on success and a negative value on error\n+ * Return 0 on success and -ENOMEM in case of no left space in PF queue bitmap\n */\n-static int ice_vsi_get_qs_scatter(struct ice_vsi *vsi)\n+static int __ice_vsi_get_qs_sc(struct ice_qs_cfg *qs_cfg)\n {\n-\tstruct ice_pf *pf = vsi->back;\n \tint i, index = 0;\n \n-\tmutex_lock(&pf->avail_q_mutex);\n-\n-\tif (vsi->tx_mapping_mode == ICE_VSI_MAP_SCATTER) {\n-\t\tfor (i = 0; i < vsi->alloc_txq; i++) {\n-\t\t\tindex = find_next_zero_bit(pf->avail_txqs,\n-\t\t\t\t\t\t ICE_MAX_TXQS, index);\n-\t\t\tif (index < ICE_MAX_TXQS) {\n-\t\t\t\tset_bit(index, pf->avail_txqs);\n-\t\t\t\tvsi->txq_map[i] = index;\n-\t\t\t} else {\n-\t\t\t\tgoto err_scatter_tx;\n-\t\t\t}\n-\t\t}\n-\t}\n-\n-\tif (vsi->rx_mapping_mode == ICE_VSI_MAP_SCATTER) {\n-\t\tfor (i = 0; i < vsi->alloc_rxq; i++) {\n-\t\t\tindex = find_next_zero_bit(pf->avail_rxqs,\n-\t\t\t\t\t\t ICE_MAX_RXQS, index);\n-\t\t\tif (index < ICE_MAX_RXQS) {\n-\t\t\t\tset_bit(index, pf->avail_rxqs);\n-\t\t\t\tvsi->rxq_map[i] = index;\n-\t\t\t} else {\n-\t\t\t\tgoto err_scatter_rx;\n-\t\t\t}\n-\t\t}\n+\tmutex_lock(qs_cfg->qs_mutex);\n+\tfor (i = 0; i < qs_cfg->q_count; i++) {\n+\t\tindex = find_next_zero_bit(qs_cfg->pf_map,\n+\t\t\t\t\t qs_cfg->pf_map_size, index);\n+\t\tif (index >= qs_cfg->pf_map_size)\n+\t\t\tgoto err_scatter;\n+\t\tset_bit(index, qs_cfg->pf_map);\n+\t\tqs_cfg->vsi_map[i + qs_cfg->vsi_map_offset] = index;\n \t}\n+\tmutex_unlock(qs_cfg->qs_mutex);\n \n-\tmutex_unlock(&pf->avail_q_mutex);\n \treturn 0;\n-\n-err_scatter_rx:\n-\t/* unflag any queues we have grabbed (i is failed position) */\n+err_scatter:\n \tfor (index = 0; index < i; index++) {\n-\t\tclear_bit(vsi->rxq_map[index], pf->avail_rxqs);\n-\t\tvsi->rxq_map[index] = 0;\n-\t}\n-\ti = vsi->alloc_txq;\n-err_scatter_tx:\n-\t/* i is either position of failed attempt or vsi->alloc_txq */\n-\tfor (index = 0; index < i; index++) {\n-\t\tclear_bit(vsi->txq_map[index], pf->avail_txqs);\n-\t\tvsi->txq_map[index] = 0;\n+\t\tclear_bit(qs_cfg->vsi_map[index], qs_cfg->pf_map);\n+\t\tqs_cfg->vsi_map[index + qs_cfg->vsi_map_offset] = 0;\n \t}\n+\tmutex_unlock(qs_cfg->qs_mutex);\n \n-\tmutex_unlock(&pf->avail_q_mutex);\n \treturn -ENOMEM;\n }\n \n+/**\n+ * __ice_vsi_get_qs - internal function for assigning queues from PF to VSI\n+ * tries to find contigous space at first, if not then try\n+ * with scatter approach\n+ * @qs_cfg: gathered variables needed for PF->VSI queues assignment\n+ *\n+ * Return 0 on success and -ENOMEM in case of no left space in PF queue bitmap\n+ */\n+static int __ice_vsi_get_qs(struct ice_qs_cfg *qs_cfg)\n+{\n+\tint ret = 0;\n+\n+\tret = __ice_vsi_get_qs_contig(qs_cfg);\n+\tif (ret) {\n+\t\t/* contig failed, so try with scatter approach */\n+\t\tqs_cfg->mapping_mode = ICE_VSI_MAP_SCATTER;\n+\t\tqs_cfg->q_count = min_t(u16, qs_cfg->q_count,\n+\t\t\t\t\tqs_cfg->scatter_count);\n+\t\tret = __ice_vsi_get_qs_sc(qs_cfg);\n+\t}\n+\treturn ret;\n+}\n+\n /**\n * ice_vsi_get_qs - Assign queues from PF to VSI\n * @vsi: the VSI to assign queues to\n@@ -625,25 +602,35 @@ static int ice_vsi_get_qs_scatter(struct ice_vsi *vsi)\n */\n static int ice_vsi_get_qs(struct ice_vsi *vsi)\n {\n+\tstruct ice_pf *pf = vsi->back;\n+\tstruct ice_qs_cfg tx_qs_cfg = {\n+\t\t.qs_mutex = &pf->avail_q_mutex,\n+\t\t.pf_map = pf->avail_txqs,\n+\t\t.pf_map_size = ICE_MAX_TXQS,\n+\t\t.q_count = vsi->alloc_txq,\n+\t\t.scatter_count = ICE_MAX_SCATTER_TXQS,\n+\t\t.vsi_map = vsi->txq_map,\n+\t\t.vsi_map_offset = 0,\n+\t\t.mapping_mode = vsi->tx_mapping_mode\n+\t};\n+\tstruct ice_qs_cfg rx_qs_cfg = {\n+\t\t.qs_mutex = &pf->avail_q_mutex,\n+\t\t.pf_map = pf->avail_rxqs,\n+\t\t.pf_map_size = ICE_MAX_RXQS,\n+\t\t.q_count = vsi->alloc_rxq,\n+\t\t.scatter_count = ICE_MAX_SCATTER_RXQS,\n+\t\t.vsi_map = vsi->rxq_map,\n+\t\t.vsi_map_offset = 0,\n+\t\t.mapping_mode = vsi->rx_mapping_mode\n+\t};\n \tint ret = 0;\n \n \tvsi->tx_mapping_mode = ICE_VSI_MAP_CONTIG;\n \tvsi->rx_mapping_mode = ICE_VSI_MAP_CONTIG;\n \n-\t/* NOTE: ice_vsi_get_qs_contig() will set the Rx/Tx mapping\n-\t * modes individually to scatter if assigning contiguous queues\n-\t * to Rx or Tx fails\n-\t */\n-\tret = ice_vsi_get_qs_contig(vsi);\n-\tif (ret < 0) {\n-\t\tif (vsi->tx_mapping_mode == ICE_VSI_MAP_SCATTER)\n-\t\t\tvsi->alloc_txq = max_t(u16, vsi->alloc_txq,\n-\t\t\t\t\t ICE_MAX_SCATTER_TXQS);\n-\t\tif (vsi->rx_mapping_mode == ICE_VSI_MAP_SCATTER)\n-\t\t\tvsi->alloc_rxq = max_t(u16, vsi->alloc_rxq,\n-\t\t\t\t\t ICE_MAX_SCATTER_RXQS);\n-\t\tret = ice_vsi_get_qs_scatter(vsi);\n-\t}\n+\tret = __ice_vsi_get_qs(&tx_qs_cfg);\n+\tif (!ret)\n+\t\tret = __ice_vsi_get_qs(&rx_qs_cfg);\n \n \treturn ret;\n }\n@@ -1614,11 +1601,14 @@ int ice_vsi_cfg_rxqs(struct ice_vsi *vsi)\n /**\n * ice_vsi_cfg_txqs - Configure the VSI for Tx\n * @vsi: the VSI being configured\n+ * @rings: Tx ring array to be configured\n+ * @offset: offset within vsi->txq_map\n *\n * Return 0 on success and a negative value on error\n * Configure the Tx VSI for operation.\n */\n-int ice_vsi_cfg_txqs(struct ice_vsi *vsi)\n+static int\n+ice_vsi_cfg_txqs(struct ice_vsi *vsi, struct ice_ring **rings, int offset)\n {\n \tstruct ice_aqc_add_tx_qgrp *qg_buf;\n \tstruct ice_aqc_add_txqs_perq *txq;\n@@ -1626,7 +1616,7 @@ int ice_vsi_cfg_txqs(struct ice_vsi *vsi)\n \tu8 num_q_grps, q_idx = 0;\n \tenum ice_status status;\n \tu16 buf_len, i, pf_q;\n-\tint err = 0, tc = 0;\n+\tint err = 0, tc;\n \n \tbuf_len = sizeof(struct ice_aqc_add_tx_qgrp);\n \tqg_buf = devm_kzalloc(&pf->pdev->dev, buf_len, GFP_KERNEL);\n@@ -1644,9 +1634,8 @@ int ice_vsi_cfg_txqs(struct ice_vsi *vsi)\n \t\tfor (i = 0; i < vsi->tc_cfg.tc_info[tc].qcount_tx; i++) {\n \t\t\tstruct ice_tlan_ctx tlan_ctx = { 0 };\n \n-\t\t\tpf_q = vsi->txq_map[q_idx];\n-\t\t\tice_setup_tx_ctx(vsi->tx_rings[q_idx], &tlan_ctx,\n-\t\t\t\t\t pf_q);\n+\t\t\tpf_q = vsi->txq_map[q_idx + offset];\n+\t\t\tice_setup_tx_ctx(rings[q_idx], &tlan_ctx, pf_q);\n \t\t\t/* copy context contents into the qg_buf */\n \t\t\tqg_buf->txqs[0].txq_id = cpu_to_le16(pf_q);\n \t\t\tice_set_ctx((u8 *)&tlan_ctx, qg_buf->txqs[0].txq_ctx,\n@@ -1655,7 +1644,7 @@ int ice_vsi_cfg_txqs(struct ice_vsi *vsi)\n \t\t\t/* init queue specific tail reg. It is referred as\n \t\t\t * transmit comm scheduler queue doorbell.\n \t\t\t */\n-\t\t\tvsi->tx_rings[q_idx]->tail =\n+\t\t\trings[q_idx]->tail =\n \t\t\t\tpf->hw.hw_addr + QTX_COMM_DBELL(pf_q);\n \t\t\tstatus = ice_ena_vsi_txq(vsi->port_info, vsi->idx, tc,\n \t\t\t\t\t\t num_q_grps, qg_buf, buf_len,\n@@ -1674,7 +1663,7 @@ int ice_vsi_cfg_txqs(struct ice_vsi *vsi)\n \t\t\t */\n \t\t\ttxq = &qg_buf->txqs[0];\n \t\t\tif (pf_q == le16_to_cpu(txq->txq_id))\n-\t\t\t\tvsi->tx_rings[q_idx]->txq_teid =\n+\t\t\t\trings[q_idx]->txq_teid =\n \t\t\t\t\tle32_to_cpu(txq->q_teid);\n \n \t\t\tq_idx++;\n@@ -1685,6 +1674,18 @@ int ice_vsi_cfg_txqs(struct ice_vsi *vsi)\n \treturn err;\n }\n \n+/**\n+ * ice_vsi_cfg_lan_txqs - Configure the VSI for Tx\n+ * @vsi: the VSI being configured\n+ *\n+ * Return 0 on success and a negative value on error\n+ * Configure the Tx VSI for operation.\n+ */\n+int ice_vsi_cfg_lan_txqs(struct ice_vsi *vsi)\n+{\n+\treturn ice_vsi_cfg_txqs(vsi, vsi->tx_rings, 0);\n+}\n+\n /**\n * ice_intrl_usec_to_reg - convert interrupt rate limit to register value\n * @intrl: interrupt rate limit in usecs\n@@ -1897,9 +1898,12 @@ int ice_vsi_stop_rx_rings(struct ice_vsi *vsi)\n * @vsi: the VSI being configured\n * @rst_src: reset source\n * @rel_vmvf_num: Relative id of VF/VM\n+ * @rings: Tx ring array to be stopped\n+ * @offset: offset within vsi->txq_map\n */\n-int ice_vsi_stop_tx_rings(struct ice_vsi *vsi, enum ice_disq_rst_src rst_src,\n-\t\t\t u16 rel_vmvf_num)\n+static int\n+ice_vsi_stop_tx_rings(struct ice_vsi *vsi, enum ice_disq_rst_src rst_src,\n+\t\t u16 rel_vmvf_num, struct ice_ring **rings, int offset)\n {\n \tstruct ice_pf *pf = vsi->back;\n \tstruct ice_hw *hw = &pf->hw;\n@@ -1927,19 +1931,18 @@ int ice_vsi_stop_tx_rings(struct ice_vsi *vsi, enum ice_disq_rst_src rst_src,\n \tice_for_each_txq(vsi, i) {\n \t\tu16 v_idx;\n \n-\t\tif (!vsi->tx_rings || !vsi->tx_rings[i] ||\n-\t\t !vsi->tx_rings[i]->q_vector) {\n+\t\tif (!rings || !rings[i] || !rings[i]->q_vector) {\n \t\t\terr = -EINVAL;\n \t\t\tgoto err_out;\n \t\t}\n \n-\t\tq_ids[i] = vsi->txq_map[i];\n-\t\tq_teids[i] = vsi->tx_rings[i]->txq_teid;\n+\t\tq_ids[i] = vsi->txq_map[i + offset];\n+\t\tq_teids[i] = rings[i]->txq_teid;\n \n \t\t/* clear cause_ena bit for disabled queues */\n-\t\tval = rd32(hw, QINT_TQCTL(vsi->tx_rings[i]->reg_idx));\n+\t\tval = rd32(hw, QINT_TQCTL(rings[i]->reg_idx));\n \t\tval &= ~QINT_TQCTL_CAUSE_ENA_M;\n-\t\twr32(hw, QINT_TQCTL(vsi->tx_rings[i]->reg_idx), val);\n+\t\twr32(hw, QINT_TQCTL(rings[i]->reg_idx), val);\n \n \t\t/* software is expected to wait for 100 ns */\n \t\tndelay(100);\n@@ -1947,7 +1950,7 @@ int ice_vsi_stop_tx_rings(struct ice_vsi *vsi, enum ice_disq_rst_src rst_src,\n \t\t/* trigger a software interrupt for the vector associated to\n \t\t * the queue to schedule NAPI handler\n \t\t */\n-\t\tv_idx = vsi->tx_rings[i]->q_vector->v_idx;\n+\t\tv_idx = rings[i]->q_vector->v_idx;\n \t\twr32(hw, GLINT_DYN_CTL(vsi->hw_base_vector + v_idx),\n \t\t GLINT_DYN_CTL_SWINT_TRIG_M | GLINT_DYN_CTL_INTENA_MSK_M);\n \t}\n@@ -1976,6 +1979,19 @@ int ice_vsi_stop_tx_rings(struct ice_vsi *vsi, enum ice_disq_rst_src rst_src,\n \treturn err;\n }\n \n+/**\n+ * ice_vsi_stop_lan_tx_rings - Disable lan Tx rings\n+ * @vsi: the VSI being configured\n+ * @rst_src: reset source\n+ * @rel_vmvf_num: Relative id of VF/VM\n+ */\n+int ice_vsi_stop_lan_tx_rings(struct ice_vsi *vsi,\n+\t\t\t enum ice_disq_rst_src rst_src, u16 rel_vmvf_num)\n+{\n+\treturn ice_vsi_stop_tx_rings(vsi, rst_src, rel_vmvf_num, vsi->tx_rings,\n+\t\t\t\t 0);\n+}\n+\n /**\n * ice_cfg_vlan_pruning - enable or disable VLAN pruning on the VSI\n * @vsi: VSI to enable or disable VLAN pruning on\ndiff --git a/drivers/net/ethernet/intel/ice/ice_lib.h b/drivers/net/ethernet/intel/ice/ice_lib.h\nindex 3831b4f0960a..7988a53729a9 100644\n--- a/drivers/net/ethernet/intel/ice/ice_lib.h\n+++ b/drivers/net/ethernet/intel/ice/ice_lib.h\n@@ -15,7 +15,7 @@ void ice_update_eth_stats(struct ice_vsi *vsi);\n \n int ice_vsi_cfg_rxqs(struct ice_vsi *vsi);\n \n-int ice_vsi_cfg_txqs(struct ice_vsi *vsi);\n+int ice_vsi_cfg_lan_txqs(struct ice_vsi *vsi);\n \n void ice_vsi_cfg_msix(struct ice_vsi *vsi);\n \n@@ -31,7 +31,8 @@ int ice_vsi_start_rx_rings(struct ice_vsi *vsi);\n \n int ice_vsi_stop_rx_rings(struct ice_vsi *vsi);\n \n-int ice_vsi_stop_tx_rings(struct ice_vsi *vsi, enum ice_disq_rst_src rst_src,\n+int\n+ice_vsi_stop_lan_tx_rings(struct ice_vsi *vsi, enum ice_disq_rst_src rst_src,\n \t\t\t u16 rel_vmvf_num);\n \n int ice_cfg_vlan_pruning(struct ice_vsi *vsi, bool ena);\ndiff --git a/drivers/net/ethernet/intel/ice/ice_main.c b/drivers/net/ethernet/intel/ice/ice_main.c\nindex bcf4a9326446..508644087a9b 100644\n--- a/drivers/net/ethernet/intel/ice/ice_main.c\n+++ b/drivers/net/ethernet/intel/ice/ice_main.c\n@@ -2546,7 +2546,8 @@ static int ice_vsi_cfg(struct ice_vsi *vsi)\n \t\tif (err)\n \t\t\treturn err;\n \t}\n-\terr = ice_vsi_cfg_txqs(vsi);\n+\n+\terr = ice_vsi_cfg_lan_txqs(vsi);\n \tif (!err)\n \t\terr = ice_vsi_cfg_rxqs(vsi);\n \n@@ -3040,7 +3041,8 @@ int ice_down(struct ice_vsi *vsi)\n \t}\n \n \tice_vsi_dis_irq(vsi);\n-\ttx_err = ice_vsi_stop_tx_rings(vsi, ICE_NO_RESET, 0);\n+\n+\ttx_err = ice_vsi_stop_lan_tx_rings(vsi, ICE_NO_RESET, 0);\n \tif (tx_err)\n \t\tnetdev_err(vsi->netdev,\n \t\t\t \"Failed stop Tx rings, VSI %d error %d\\n\",\ndiff --git a/drivers/net/ethernet/intel/ice/ice_virtchnl_pf.c b/drivers/net/ethernet/intel/ice/ice_virtchnl_pf.c\nindex 05ff4f910649..80b50e67cbef 100644\n--- a/drivers/net/ethernet/intel/ice/ice_virtchnl_pf.c\n+++ b/drivers/net/ethernet/intel/ice/ice_virtchnl_pf.c\n@@ -224,13 +224,15 @@ void ice_free_vfs(struct ice_pf *pf)\n \n \t/* Avoid wait time by stopping all VFs at the same time */\n \tfor (i = 0; i < pf->num_alloc_vfs; i++) {\n+\t\tstruct ice_vsi *vsi;\n+\n \t\tif (!test_bit(ICE_VF_STATE_ENA, pf->vf[i].vf_states))\n \t\t\tcontinue;\n \n+\t\tvsi = pf->vsi[pf->vf[i].lan_vsi_idx];\n \t\t/* stop rings without wait time */\n-\t\tice_vsi_stop_tx_rings(pf->vsi[pf->vf[i].lan_vsi_idx],\n-\t\t\t\t ICE_NO_RESET, i);\n-\t\tice_vsi_stop_rx_rings(pf->vsi[pf->vf[i].lan_vsi_idx]);\n+\t\tice_vsi_stop_lan_tx_rings(vsi, ICE_NO_RESET, i);\n+\t\tice_vsi_stop_rx_rings(vsi);\n \n \t\tclear_bit(ICE_VF_STATE_ENA, pf->vf[i].vf_states);\n \t}\n@@ -831,6 +833,7 @@ static bool ice_reset_vf(struct ice_vf *vf, bool is_vflr)\n {\n \tstruct ice_pf *pf = vf->pf;\n \tstruct ice_hw *hw = &pf->hw;\n+\tstruct ice_vsi *vsi;\n \tbool rsd = false;\n \tu32 reg;\n \tint i;\n@@ -843,17 +846,18 @@ static bool ice_reset_vf(struct ice_vf *vf, bool is_vflr)\n \n \tice_trigger_vf_reset(vf, is_vflr);\n \n+\tvsi = pf->vsi[vf->lan_vsi_idx];\n+\n \tif (test_bit(ICE_VF_STATE_ENA, vf->vf_states)) {\n-\t\tice_vsi_stop_tx_rings(pf->vsi[vf->lan_vsi_idx], ICE_VF_RESET,\n-\t\t\t\t vf->vf_id);\n-\t\tice_vsi_stop_rx_rings(pf->vsi[vf->lan_vsi_idx]);\n+\t\tice_vsi_stop_lan_tx_rings(vsi, ICE_VF_RESET, vf->vf_id);\n+\t\tice_vsi_stop_rx_rings(vsi);\n \t\tclear_bit(ICE_VF_STATE_ENA, vf->vf_states);\n \t} else {\n \t\t/* Call Disable LAN Tx queue AQ call even when queues are not\n \t\t * enabled. This is needed for successful completiom of VFR\n \t\t */\n-\t\tice_dis_vsi_txq(pf->vsi[vf->lan_vsi_idx]->port_info, 0,\n-\t\t\t\tNULL, NULL, ICE_VF_RESET, vf->vf_id, NULL);\n+\t\tice_dis_vsi_txq(vsi->port_info, 0, NULL, NULL, ICE_VF_RESET,\n+\t\t\t\tvf->vf_id, NULL);\n \t}\n \n \t/* poll VPGEN_VFRSTAT reg to make sure\n@@ -1614,7 +1618,7 @@ static int ice_vc_dis_qs_msg(struct ice_vf *vf, u8 *msg)\n \t\tgoto error_param;\n \t}\n \n-\tif (ice_vsi_stop_tx_rings(vsi, ICE_NO_RESET, vf->vf_id)) {\n+\tif (ice_vsi_stop_lan_tx_rings(vsi, ICE_NO_RESET, vf->vf_id)) {\n \t\tdev_err(&vsi->back->pdev->dev,\n \t\t\t\"Failed to stop tx rings on VSI %d\\n\",\n \t\t\tvsi->vsi_num);\n@@ -1784,7 +1788,7 @@ static int ice_vc_cfg_qs_msg(struct ice_vf *vf, u8 *msg)\n \tvsi->num_txq = qci->num_queue_pairs;\n \tvsi->num_rxq = qci->num_queue_pairs;\n \n-\tif (!ice_vsi_cfg_txqs(vsi) && !ice_vsi_cfg_rxqs(vsi))\n+\tif (!ice_vsi_cfg_lan_txqs(vsi) && !ice_vsi_cfg_rxqs(vsi))\n \t\taq_ret = 0;\n \telse\n \t\taq_ret = ICE_ERR_PARAM;\n", "prefixes": [ "S10", "08/15" ] }