Patch Detail
get:
Show a patch.
patch:
Update a patch.
put:
Update a patch.
GET /api/patches/79660/?format=api
https://patches.dpdk.org/api/patches/79660/?format=api", "web_url": "https://patches.dpdk.org/project/dpdk/patch/20201005120910.189343-42-jiawenwu@trustnetic.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": "<20201005120910.189343-42-jiawenwu@trustnetic.com>", "list_archive_url": "https://inbox.dpdk.org/dev/20201005120910.189343-42-jiawenwu@trustnetic.com", "date": "2020-10-05T12:08:55", "name": "[v2,41/56] net/txgbe: add VMDq configure", "commit_ref": null, "pull_url": null, "state": "changes-requested", "archived": true, "hash": "a9a4af9eb34600d05da21e81c21aba59e84d429d", "submitter": { "id": 1932, "url": "https://patches.dpdk.org/api/people/1932/?format=api", "name": "Jiawen Wu", "email": "jiawenwu@trustnetic.com" }, "delegate": { "id": 319, "url": "https://patches.dpdk.org/api/users/319/?format=api", "username": "fyigit", "first_name": "Ferruh", "last_name": "Yigit", "email": "ferruh.yigit@amd.com" }, "mbox": "https://patches.dpdk.org/project/dpdk/patch/20201005120910.189343-42-jiawenwu@trustnetic.com/mbox/", "series": [ { "id": 12690, "url": "https://patches.dpdk.org/api/series/12690/?format=api", "web_url": "https://patches.dpdk.org/project/dpdk/list/?series=12690", "date": "2020-10-05T12:08:14", "name": "net: txgbe PMD", "version": 2, "mbox": "https://patches.dpdk.org/series/12690/mbox/" } ], "comments": "https://patches.dpdk.org/api/patches/79660/comments/", "check": "warning", "checks": "https://patches.dpdk.org/api/patches/79660/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 0A50AA04B1;\n\tMon, 5 Oct 2020 14:26:37 +0200 (CEST)", "from [92.243.14.124] (localhost [127.0.0.1])\n\tby dpdk.org (Postfix) with ESMTP id B0F701C117;\n\tMon, 5 Oct 2020 14:09:58 +0200 (CEST)", "from smtpbgau1.qq.com (smtpbgau1.qq.com [54.206.16.166])\n by dpdk.org (Postfix) with ESMTP id 1B5A81BEA9\n for <dev@dpdk.org>; Mon, 5 Oct 2020 14:09:33 +0200 (CEST)", "from localhost.localdomain.com (unknown [183.129.236.74])\n by esmtp6.qq.com (ESMTP) with\n id ; Mon, 05 Oct 2020 20:09:28 +0800 (CST)" ], "X-QQ-mid": "bizesmtp9t1601899769t63a5modc", "X-QQ-SSF": "01400000002000C0C000B00A0000000", "X-QQ-FEAT": "zee5zmTwfDO2QuQ4M/QNp7m38xHEeoiXle8EZAYaWs7u9/oSmySoW9x9GmxdZ\n rlbMRGd4BsJAGepn3KWpJpkCFfOQPsCJn69SOpSXjLvAmFUCSdI8RxAG6NHCghncTQbQamn\n nC9b84n2urvImcUaWhQjnI4wOUGNf+tlozN6NXp5KkK085omj2qMh4rFz4g9pCWcspyrAbs\n hOKLwkKbnOXjA3PXurk4NYLDioBu7BvPH1GKj9GQ5u/jzl3sTUO4pLI5HyjrqHGpJ/IUcRL\n zy/I/MlBtvzc6cqtmknUZcP5TwXx/XBawQ+06Jw343K+ik2whQTwxQfeIjyapo2ectDzjXO\n vUQrQ0zmTJuha78sxM=", "X-QQ-GoodBg": "2", "From": "Jiawen Wu <jiawenwu@trustnetic.com>", "To": "dev@dpdk.org", "Cc": "jiawenwu <jiawenwu@trustnetic.com>", "Date": "Mon, 5 Oct 2020 20:08:55 +0800", "Message-Id": "<20201005120910.189343-42-jiawenwu@trustnetic.com>", "X-Mailer": "git-send-email 2.18.4", "In-Reply-To": "<20201005120910.189343-1-jiawenwu@trustnetic.com>", "References": "<20201005120910.189343-1-jiawenwu@trustnetic.com>", "X-QQ-SENDSIZE": "520", "Feedback-ID": "bizesmtp:trustnetic.com:qybgforeign:qybgforeign7", "X-QQ-Bgrelay": "1", "Subject": "[dpdk-dev] [PATCH v2 41/56] net/txgbe: add VMDq configure", "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": "From: jiawenwu <jiawenwu@trustnetic.com>\n\nAdd multiple queue setting with VMDq.\n\nSigned-off-by: jiawenwu <jiawenwu@trustnetic.com>\n---\n doc/guides/nics/features/txgbe.ini | 1 +\n drivers/net/txgbe/txgbe_ethdev.c | 35 ++++\n drivers/net/txgbe/txgbe_ethdev.h | 2 +\n drivers/net/txgbe/txgbe_rxtx.c | 262 +++++++++++++++++++++++++++++\n 4 files changed, 300 insertions(+)", "diff": "diff --git a/doc/guides/nics/features/txgbe.ini b/doc/guides/nics/features/txgbe.ini\nindex 022e56d45..578ec05b0 100644\n--- a/doc/guides/nics/features/txgbe.ini\n+++ b/doc/guides/nics/features/txgbe.ini\n@@ -15,6 +15,7 @@ LRO = Y\n TSO = Y\n Unicast MAC filter = Y\n Multicast MAC filter = Y\n+VMDq = Y\n SR-IOV = Y\n VLAN filter = Y\n Rate limitation = Y\ndiff --git a/drivers/net/txgbe/txgbe_ethdev.c b/drivers/net/txgbe/txgbe_ethdev.c\nindex ab25086b3..7f3df1513 100644\n--- a/drivers/net/txgbe/txgbe_ethdev.c\n+++ b/drivers/net/txgbe/txgbe_ethdev.c\n@@ -946,6 +946,17 @@ txgbe_vlan_offload_set(struct rte_eth_dev *dev, int mask)\n \treturn 0;\n }\n \n+static void\n+txgbe_vmdq_vlan_hw_filter_enable(struct rte_eth_dev *dev)\n+{\n+\tstruct txgbe_hw *hw = TXGBE_DEV_HW(dev);\n+\t/* VLNCTL: enable vlan filtering and allow all vlan tags through */\n+\tuint32_t vlanctrl = rd32(hw, TXGBE_VLANCTL);\n+\n+\tvlanctrl |= TXGBE_VLANCTL_VFE; /* enable vlan filters */\n+\twr32(hw, TXGBE_VLANCTL, vlanctrl);\n+}\n+\n static int\n txgbe_check_vf_rss_rxq_num(struct rte_eth_dev *dev, uint16_t nb_rx_q)\n {\n@@ -1331,6 +1342,11 @@ txgbe_dev_start(struct rte_eth_dev *dev)\n \t\tgoto error;\n \t}\n \n+\tif (dev->data->dev_conf.rxmode.mq_mode == ETH_MQ_RX_VMDQ_ONLY) {\n+\t\t/* Enable vlan filtering for VMDq */\n+\t\ttxgbe_vmdq_vlan_hw_filter_enable(dev);\n+\t}\n+\n \t/* Restore vf rate limit */\n \tif (vfinfo != NULL) {\n \t\tfor (vf = 0; vf < pci_dev->max_vfs; vf++)\n@@ -2764,6 +2780,25 @@ txgbe_uc_all_hash_table_set(struct rte_eth_dev *dev, uint8_t on)\n \treturn 0;\n }\n \n+uint32_t\n+txgbe_convert_vm_rx_mask_to_val(uint16_t rx_mask, uint32_t orig_val)\n+{\n+\tuint32_t new_val = orig_val;\n+\n+\tif (rx_mask & ETH_VMDQ_ACCEPT_UNTAG)\n+\t\tnew_val |= TXGBE_POOLETHCTL_UTA;\n+\tif (rx_mask & ETH_VMDQ_ACCEPT_HASH_MC)\n+\t\tnew_val |= TXGBE_POOLETHCTL_MCHA;\n+\tif (rx_mask & ETH_VMDQ_ACCEPT_HASH_UC)\n+\t\tnew_val |= TXGBE_POOLETHCTL_UCHA;\n+\tif (rx_mask & ETH_VMDQ_ACCEPT_BROADCAST)\n+\t\tnew_val |= TXGBE_POOLETHCTL_BCA;\n+\tif (rx_mask & ETH_VMDQ_ACCEPT_MULTICAST)\n+\t\tnew_val |= TXGBE_POOLETHCTL_MCP;\n+\n+\treturn new_val;\n+}\n+\n static int\n txgbe_dev_rx_queue_intr_enable(struct rte_eth_dev *dev, uint16_t queue_id)\n {\ndiff --git a/drivers/net/txgbe/txgbe_ethdev.h b/drivers/net/txgbe/txgbe_ethdev.h\nindex eea8191b9..4bab7f358 100644\n--- a/drivers/net/txgbe/txgbe_ethdev.h\n+++ b/drivers/net/txgbe/txgbe_ethdev.h\n@@ -255,6 +255,8 @@ void txgbe_pf_mbx_process(struct rte_eth_dev *eth_dev);\n \n int txgbe_pf_host_configure(struct rte_eth_dev *eth_dev);\n \n+uint32_t txgbe_convert_vm_rx_mask_to_val(uint16_t rx_mask, uint32_t orig_val);\n+\n int txgbe_set_vf_rate_limit(struct rte_eth_dev *dev, uint16_t vf,\n \t\t\t uint16_t tx_rate, uint64_t q_msk);\n int txgbe_set_queue_rate_limit(struct rte_eth_dev *dev, uint16_t queue_idx,\ndiff --git a/drivers/net/txgbe/txgbe_rxtx.c b/drivers/net/txgbe/txgbe_rxtx.c\nindex 24677651a..3ce4035c6 100644\n--- a/drivers/net/txgbe/txgbe_rxtx.c\n+++ b/drivers/net/txgbe/txgbe_rxtx.c\n@@ -2566,6 +2566,146 @@ txgbe_dev_free_queues(struct rte_eth_dev *dev)\n \tdev->data->nb_tx_queues = 0;\n }\n \n+static void\n+txgbe_rss_disable(struct rte_eth_dev *dev)\n+{\n+\tstruct txgbe_hw *hw;\n+\n+\thw = TXGBE_DEV_HW(dev);\n+\n+\twr32m(hw, TXGBE_RACTL, TXGBE_RACTL_RSSENA, 0);\n+}\n+\n+#define NUM_VFTA_REGISTERS 128\n+\n+/*\n+ * VMDq only support for 10 GbE NIC.\n+ */\n+static void\n+txgbe_vmdq_rx_hw_configure(struct rte_eth_dev *dev)\n+{\n+\tstruct rte_eth_vmdq_rx_conf *cfg;\n+\tstruct txgbe_hw *hw;\n+\tenum rte_eth_nb_pools num_pools;\n+\tuint32_t mrqc, vt_ctl, vlanctrl;\n+\tuint32_t vmolr = 0;\n+\tint i;\n+\n+\tPMD_INIT_FUNC_TRACE();\n+\thw = TXGBE_DEV_HW(dev);\n+\tcfg = &dev->data->dev_conf.rx_adv_conf.vmdq_rx_conf;\n+\tnum_pools = cfg->nb_queue_pools;\n+\n+\ttxgbe_rss_disable(dev);\n+\n+\t/* enable vmdq */\n+\tmrqc = TXGBE_PORTCTL_NUMVT_64;\n+\twr32m(hw, TXGBE_PORTCTL, TXGBE_PORTCTL_NUMVT_MASK, mrqc);\n+\n+\t/* turn on virtualisation and set the default pool */\n+\tvt_ctl = TXGBE_POOLCTL_RPLEN;\n+\tif (cfg->enable_default_pool)\n+\t\tvt_ctl |= TXGBE_POOLCTL_DEFPL(cfg->default_pool);\n+\telse\n+\t\tvt_ctl |= TXGBE_POOLCTL_DEFDSA;\n+\n+\twr32(hw, TXGBE_POOLCTL, vt_ctl);\n+\n+\tfor (i = 0; i < (int)num_pools; i++) {\n+\t\tvmolr = txgbe_convert_vm_rx_mask_to_val(cfg->rx_mode, vmolr);\n+\t\twr32(hw, TXGBE_POOLETHCTL(i), vmolr);\n+\t}\n+\n+\t/* enable vlan filtering and allow all vlan tags through */\n+\tvlanctrl = rd32(hw, TXGBE_VLANCTL);\n+\tvlanctrl |= TXGBE_VLANCTL_VFE; /* enable vlan filters */\n+\twr32(hw, TXGBE_VLANCTL, vlanctrl);\n+\n+\t/* enable all vlan filters */\n+\tfor (i = 0; i < NUM_VFTA_REGISTERS; i++)\n+\t\twr32(hw, TXGBE_VLANTBL(i), UINT32_MAX);\n+\n+\t/* pool enabling for receive - 64 */\n+\twr32(hw, TXGBE_POOLRXENA(0), UINT32_MAX);\n+\tif (num_pools == ETH_64_POOLS)\n+\t\twr32(hw, TXGBE_POOLRXENA(1), UINT32_MAX);\n+\n+\t/*\n+\t * allow pools to read specific mac addresses\n+\t * In this case, all pools should be able to read from mac addr 0\n+\t */\n+\twr32(hw, TXGBE_ETHADDRIDX, 0);\n+\twr32(hw, TXGBE_ETHADDRASSL, 0xFFFFFFFF);\n+\twr32(hw, TXGBE_ETHADDRASSH, 0xFFFFFFFF);\n+\n+\t/* set up filters for vlan tags as configured */\n+\tfor (i = 0; i < cfg->nb_pool_maps; i++) {\n+\t\t/* set vlan id in VF register and set the valid bit */\n+\t\twr32(hw, TXGBE_PSRVLANIDX, i);\n+\t\twr32(hw, TXGBE_PSRVLAN, (TXGBE_PSRVLAN_EA |\n+\t\t\t\tTXGBE_PSRVLAN_VID(cfg->pool_map[i].vlan_id)));\n+\t\t/*\n+\t\t * Put the allowed pools in VFB reg. As we only have 16 or 64\n+\t\t * pools, we only need to use the first half of the register\n+\t\t * i.e. bits 0-31\n+\t\t */\n+\t\tif (((cfg->pool_map[i].pools >> 32) & UINT32_MAX) == 0)\n+\t\t\twr32(hw, TXGBE_PSRVLANPLM(0),\n+\t\t\t\t(cfg->pool_map[i].pools & UINT32_MAX));\n+\t\telse\n+\t\t\twr32(hw, TXGBE_PSRVLANPLM(1),\n+\t\t\t\t((cfg->pool_map[i].pools >> 32) & UINT32_MAX));\n+\n+\t}\n+\n+\t/* Tx General Switch Control Enables VMDQ loopback */\n+\tif (cfg->enable_loop_back) {\n+\t\twr32(hw, TXGBE_PSRCTL, TXGBE_PSRCTL_LBENA);\n+\t\tfor (i = 0; i < 64; i++)\n+\t\t\twr32m(hw, TXGBE_POOLETHCTL(i),\n+\t\t\t\tTXGBE_POOLETHCTL_LLB, TXGBE_POOLETHCTL_LLB);\n+\t}\n+\n+\ttxgbe_flush(hw);\n+}\n+\n+/*\n+ * txgbe_vmdq_tx_hw_configure - Configure general VMDq TX parameters\n+ * @hw: pointer to hardware structure\n+ */\n+static void\n+txgbe_vmdq_tx_hw_configure(struct txgbe_hw *hw)\n+{\n+\tuint32_t reg;\n+\tuint32_t q;\n+\n+\tPMD_INIT_FUNC_TRACE();\n+\t/*PF VF Transmit Enable*/\n+\twr32(hw, TXGBE_POOLTXENA(0), UINT32_MAX);\n+\twr32(hw, TXGBE_POOLTXENA(1), UINT32_MAX);\n+\n+\t/* Disable the Tx desc arbiter */\n+\treg = rd32(hw, TXGBE_ARBTXCTL);\n+\treg |= TXGBE_ARBTXCTL_DIA;\n+\twr32(hw, TXGBE_ARBTXCTL, reg);\n+\n+\twr32m(hw, TXGBE_PORTCTL, TXGBE_PORTCTL_NUMVT_MASK,\n+\t\tTXGBE_PORTCTL_NUMVT_64);\n+\n+\t/* Disable drop for all queues */\n+\tfor (q = 0; q < 128; q++) {\n+\t\tu32 val = 1 << (q % 32);\n+\t\twr32m(hw, TXGBE_QPRXDROP(q / 32), val, val);\n+\t}\n+\n+\t/* Enable the Tx desc arbiter */\n+\treg = rd32(hw, TXGBE_ARBTXCTL);\n+\treg &= ~TXGBE_ARBTXCTL_DIA;\n+\twr32(hw, TXGBE_ARBTXCTL, reg);\n+\n+\ttxgbe_flush(hw);\n+}\n+\n static int __rte_cold\n txgbe_alloc_rx_queue_mbufs(struct txgbe_rx_queue *rxq)\n {\n@@ -2597,6 +2737,120 @@ txgbe_alloc_rx_queue_mbufs(struct txgbe_rx_queue *rxq)\n \n \treturn 0;\n }\n+static int\n+txgbe_config_vf_default(struct rte_eth_dev *dev)\n+{\n+\tstruct txgbe_hw *hw = TXGBE_DEV_HW(dev);\n+\tuint32_t mrqc;\n+\n+\tmrqc = rd32(hw, TXGBE_PORTCTL);\n+\tmrqc &= ~(TXGBE_PORTCTL_NUMTC_MASK | TXGBE_PORTCTL_NUMVT_MASK);\n+\tswitch (RTE_ETH_DEV_SRIOV(dev).active) {\n+\tcase ETH_64_POOLS:\n+\t\tmrqc |= TXGBE_PORTCTL_NUMVT_64;\n+\t\tbreak;\n+\n+\tcase ETH_32_POOLS:\n+\t\tmrqc |= TXGBE_PORTCTL_NUMVT_32;\n+\t\tbreak;\n+\n+\tcase ETH_16_POOLS:\n+\t\tmrqc |= TXGBE_PORTCTL_NUMVT_16;\n+\t\tbreak;\n+\tdefault:\n+\t\tPMD_INIT_LOG(ERR,\n+\t\t\t\"invalid pool number in IOV mode\");\n+\t\treturn 0;\n+\t}\n+\n+\twr32(hw, TXGBE_PORTCTL, mrqc);\n+\n+\treturn 0;\n+}\n+\n+static int\n+txgbe_dev_mq_rx_configure(struct rte_eth_dev *dev)\n+{\n+\tif (RTE_ETH_DEV_SRIOV(dev).active == 0) {\n+\t\t/*\n+\t\t * SRIOV inactive scheme\n+\t\t * VMDq multi-queue setting\n+\t\t */\n+\t\tswitch (dev->data->dev_conf.rxmode.mq_mode) {\n+\t\tcase ETH_MQ_RX_VMDQ_ONLY:\n+\t\t\ttxgbe_vmdq_rx_hw_configure(dev);\n+\t\t\tbreak;\n+\n+\t\tcase ETH_MQ_RX_NONE:\n+\t\tdefault:\n+\t\t\t/* if mq_mode is none, disable rss mode.*/\n+\t\t\ttxgbe_rss_disable(dev);\n+\t\t\tbreak;\n+\t\t}\n+\t} else {\n+\t\t/* SRIOV active scheme\n+\t\t */\n+\t\tswitch (dev->data->dev_conf.rxmode.mq_mode) {\n+\t\tdefault:\n+\t\t\ttxgbe_config_vf_default(dev);\n+\t\t\tbreak;\n+\t\t}\n+\t}\n+\n+\treturn 0;\n+}\n+\n+static int\n+txgbe_dev_mq_tx_configure(struct rte_eth_dev *dev)\n+{\n+\tstruct txgbe_hw *hw = TXGBE_DEV_HW(dev);\n+\tuint32_t mtqc;\n+\tuint32_t rttdcs;\n+\n+\t/* disable arbiter */\n+\trttdcs = rd32(hw, TXGBE_ARBTXCTL);\n+\trttdcs |= TXGBE_ARBTXCTL_DIA;\n+\twr32(hw, TXGBE_ARBTXCTL, rttdcs);\n+\n+\tif (RTE_ETH_DEV_SRIOV(dev).active == 0) {\n+\t\t/*\n+\t\t * SRIOV inactive scheme\n+\t\t * any DCB w/o VMDq multi-queue setting\n+\t\t */\n+\t\tif (dev->data->dev_conf.txmode.mq_mode == ETH_MQ_TX_VMDQ_ONLY)\n+\t\t\ttxgbe_vmdq_tx_hw_configure(hw);\n+\t\telse {\n+\t\t\twr32m(hw, TXGBE_PORTCTL, TXGBE_PORTCTL_NUMVT_MASK, 0);\n+\t\t}\n+\t} else {\n+\t\tswitch (RTE_ETH_DEV_SRIOV(dev).active) {\n+\n+\t\t/*\n+\t\t * SRIOV active scheme\n+\t\t * FIXME if support DCB together with VMDq & SRIOV\n+\t\t */\n+\t\tcase ETH_64_POOLS:\n+\t\t\tmtqc = TXGBE_PORTCTL_NUMVT_64;\n+\t\t\tbreak;\n+\t\tcase ETH_32_POOLS:\n+\t\t\tmtqc = TXGBE_PORTCTL_NUMVT_32;\n+\t\t\tbreak;\n+\t\tcase ETH_16_POOLS:\n+\t\t\tmtqc = TXGBE_PORTCTL_NUMVT_16;\n+\t\t\tbreak;\n+\t\tdefault:\n+\t\t\tmtqc = 0;\n+\t\t\tPMD_INIT_LOG(ERR, \"invalid pool number in IOV mode\");\n+\t\t}\n+\t\twr32m(hw, TXGBE_PORTCTL, TXGBE_PORTCTL_NUMVT_MASK, mtqc);\n+\t}\n+\n+\t/* re-enable arbiter */\n+\trttdcs &= ~TXGBE_ARBTXCTL_DIA;\n+\twr32(hw, TXGBE_ARBTXCTL, rttdcs);\n+\n+\treturn 0;\n+}\n \n /**\n * txgbe_get_rscctl_maxdesc\n@@ -2930,6 +3184,11 @@ txgbe_dev_rx_init(struct rte_eth_dev *dev)\n \tif (rx_conf->offloads & DEV_RX_OFFLOAD_SCATTER)\n \t\tdev->data->scattered_rx = 1;\n \n+\t/*\n+\t * Device configured with multiple RX queues.\n+\t */\n+\ttxgbe_dev_mq_rx_configure(dev);\n+\n \t/*\n \t * Setup the Checksum Register.\n \t * Disable Full-Packet Checksum which is mutually exclusive with RSS.\n@@ -2991,6 +3250,9 @@ txgbe_dev_tx_init(struct rte_eth_dev *dev)\n \t\twr32(hw, TXGBE_TXRP(txq->reg_idx), 0);\n \t\twr32(hw, TXGBE_TXWP(txq->reg_idx), 0);\n \t}\n+\n+\t/* Device configured with multiple TX queues. */\n+\ttxgbe_dev_mq_tx_configure(dev);\n }\n \n /*\n", "prefixes": [ "v2", "41/56" ] }{ "id": 79660, "url": "