From patchwork Mon May 15 12:37:40 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Hemant Agrawal X-Patchwork-Id: 24312 X-Patchwork-Delegate: ferruh.yigit@amd.com Return-Path: X-Original-To: patchwork@dpdk.org Delivered-To: patchwork@dpdk.org Received: from [92.243.14.124] (localhost [IPv6:::1]) by dpdk.org (Postfix) with ESMTP id 5D5D57CEA; Mon, 15 May 2017 14:38:48 +0200 (CEST) Received: from NAM01-BY2-obe.outbound.protection.outlook.com (mail-by2nam01on0052.outbound.protection.outlook.com [104.47.34.52]) by dpdk.org (Postfix) with ESMTP id E6CCD29C8 for ; Mon, 15 May 2017 14:38:31 +0200 (CEST) Received: from BLUPR0301CA0001.namprd03.prod.outlook.com (2a01:111:e400:5259::11) by BL2PR03MB163.namprd03.prod.outlook.com (2a01:111:e400:c0d::19) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256_P256) id 15.1.1084.16; Mon, 15 May 2017 12:38:29 +0000 Received: from BL2FFO11FD009.protection.gbl (2a01:111:f400:7c09::190) by BLUPR0301CA0001.outlook.office365.com (2a01:111:e400:5259::11) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256_P256) id 15.1.1084.16 via Frontend Transport; Mon, 15 May 2017 12:38:29 +0000 Authentication-Results: spf=fail (sender IP is 192.88.168.50) smtp.mailfrom=nxp.com; nxp.com; dkim=none (message not signed) header.d=none;nxp.com; dmarc=fail action=none header.from=nxp.com; Received-SPF: Fail (protection.outlook.com: domain of nxp.com does not designate 192.88.168.50 as permitted sender) receiver=protection.outlook.com; client-ip=192.88.168.50; helo=tx30smr01.am.freescale.net; Received: from tx30smr01.am.freescale.net (192.88.168.50) by BL2FFO11FD009.mail.protection.outlook.com (10.173.161.15) with Microsoft SMTP Server (version=TLS1_0, cipher=TLS_RSA_WITH_AES_256_CBC_SHA) id 15.1.1075.5 via Frontend Transport; Mon, 15 May 2017 12:38:29 +0000 Received: from bf-netperf1.ap.freescale.net (bf-netperf1.ap.freescale.net [10.232.134.28]) by tx30smr01.am.freescale.net (8.14.3/8.14.0) with ESMTP id v4FCbxO5003970; Mon, 15 May 2017 05:38:28 -0700 From: Hemant Agrawal To: CC: , Date: Mon, 15 May 2017 18:07:40 +0530 Message-ID: <1494851864-26029-18-git-send-email-hemant.agrawal@nxp.com> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1494851864-26029-1-git-send-email-hemant.agrawal@nxp.com> References: <1492607395-5922-1-git-send-email-hemant.agrawal@nxp.com> <1494851864-26029-1-git-send-email-hemant.agrawal@nxp.com> X-EOPAttributedMessage: 0 X-Matching-Connectors: 131393255100024467; (91ab9b29-cfa4-454e-5278-08d120cd25b8); () X-Forefront-Antispam-Report: CIP:192.88.168.50; IPV:NLI; CTRY:US; EFV:NLI; SFV:NSPM; SFS:(10009020)(6009001)(336005)(39860400002)(39380400002)(39450400003)(39840400002)(39850400002)(39410400002)(39400400002)(2980300002)(1109001)(1110001)(339900001)(199003)(189002)(9170700003)(305945005)(5660300001)(81166006)(8676002)(8936002)(356003)(8656002)(50226002)(4326008)(104016004)(2950100002)(6916009)(6666003)(54906002)(53936002)(106466001)(36756003)(33646002)(110136004)(38730400002)(2351001)(189998001)(85426001)(50466002)(48376002)(86362001)(105606002)(76176999)(50986999)(2906002)(498600001)(68736007)(5003940100001)(77096006)(47776003); DIR:OUT; SFP:1101; SCL:1; SRVR:BL2PR03MB163; H:tx30smr01.am.freescale.net; FPR:; SPF:Fail; MLV:ovrnspm; A:1; MX:1; PTR:InfoDomainNonexistent; LANG:en; X-Microsoft-Exchange-Diagnostics: 1; BL2FFO11FD009; 1:ZJ9QYkkGY+NJsGmXOE4t1JUqpyx6nD362IvM3NkuqSbgwYCCA6Q9ma3EEaYLieFYXV5GyfEJMBSQtk8ENFSzB9rqQiYk+CAaiBNG7MsOYLXoiZTbJn4ACFqQLDfcsnOzzc/DvXADguJrV08e+BJZNisJRMTgQMvj5MwExLiFGWCIXsQ7bkxoy1+lvlh6Oja5tmZkig7s/ntre2KNIcxrB8jYqciyx526Lj+3jvepu4KQovn8bjB3LxHuJhaql6mtHOMm4P7PHSVRc/3yiSNsx1QQ2PINEPWX3+mCkgFEKVcuCbHfTk4p9ph5wkw14vB8PlVD0yqJMB1j6VW1SvKlL+uFHyAORYCWYZWxq1mK8cvv6hSuO8CyU8hySeWsjD5sCXu72gqgt7TM8eEbHHr2vsSHtDsgvvBuowE/xmB5F4Z8yobatLVXsLge/EqtXActpgtuO8NPqLaQstd1Ksprh5hweMsOJLy9y/xfA3vTNfphKraoyT/AUwu1VvYl+YKQ56jW04YeudvbJpiz3cHG+QMCmmJCfKk4bU2k9Z+ifeUC9L5ymPQ7j+Ln/BT8e//7+QcCH8bO5ISByankl2lc4CFnCE0+JQBc5yApyiBgFz1cMza/tIdG2eodVR9ZTTdI75/TXtbMbC+gs6EcaymJgKFSdCZnhCkjLfFOavMv/8PQVI3A4H4XFfHe8Z9YGjoviWE1fY4T+9VwBPyNuTYDRE/qlug1djVoK6EwyzBt+UmtqGZwkqRO0GIQke7qz/aluKIRwRD/ZjHUBBTKTabr/g== MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: abc5401a-9e4e-4a9c-2532-08d49b8f4a93 X-Microsoft-Antispam: UriScan:; BCL:0; PCL:0; RULEID:(22001)(201703131430075)(201703131517081); SRVR:BL2PR03MB163; X-Microsoft-Exchange-Diagnostics: 1; BL2PR03MB163; 3:2AI6Jj06tv39XEUN1PHialAyz3uKhFntleOQP896MSjshTSPZTFDgnHgxDl/lRS6CIIXP+CBR8iA6S3xrmbQBIPlJ8whwCOXn8Cl3BGIAcBecjOYojZhL+b9/49kkYnCl5/mO9Jr7hEGfV2zIcu9ANayTe80aOrZJSsF67+Dz94Cr8QrUn9W4UyDkQk1tCQ9DjbM6kVPu4KJiIaCnL1Ramp8JnoSQDvMtze07cijFfyZrPzqvLkx7sAbW+2nNnvjupEXYTfTqT/U942BuSFEADxOLi7gXUzFKiN+uaXhAEoDLP6fLhxOn7kbI9eQTSk7lW0DiGH9AUK9I2CcUI5R10Snt/VBLzCtBGVxGEOK8LJT8YG/mEZkujtoX+C3Bz7axUOff+Un2lYH4xEOdN7fOMCw6e2+kXO+D37Gjepdw2WVXQI05xDUFQujU7156tUx; 25:htnDcnItZcgQyJ933xv1bintHTxaSSG8V3WYJw4VfboLlqg4Ycapemh6p/YoGki+4I17vk8kJAo7/D+C60A8lJIG/TtWQoV2eCWvk5kUsCA4wr9FvK1WQ3NkXRVP9b7b9Wa9UhDqSSMYYrriJ+n+5ak3sXCFJz7zZb9/WVycN6OoU92AmKIR9K3/7aJJWvRQRvk6vKfi/xYuIemumbcCtPiX3A6FWsz6Q7muDY5DwA3h3TdULtzWU7ZjJR/lR2764eXtFEaPfIpvd/PPiAgkrdw1CAxO07C0m+qV3lmFJfSChJ++ZxTyAfceuZGfBcpZ4u0IGsAumASwrcMuY9QraVh9dRADoQadvV6lTr8gLQf+cbsbwbc0v+EWRxjvOfrCKJGtB800ESa9m4OQqEWAsWBrTaWTOd/ynLFJPNBwgEp8fOZjBoY1xAITqAMLZw1DGwolsV58UTPbzAuxSAtUDw== X-Microsoft-Exchange-Diagnostics: 1; BL2PR03MB163; 31:S8aNfU5+zTQN2vxCdq9HVbQryMIUpF6g1AauA0uEDB2oHvpFN0zzOn6rNjy+/P7SIz+UxTmJoXFxxjSc1ZkNmxI0auErvwXptud15WMkJyEfMfQ4XZ5cmciZWdx7iuH17sS3UaRsr787VIeNldmoLgAn1TbmQtjl2JyEqVuzT+59oBuCF/kgM29fYY7VEQ783LeA3diB3PHvaTjLAioXhT8u2+T32pRYtRYIrkmkh05v5ZvvHK9jgvywCRLFNnFVdQ+5z0AtUVbEhggFLiMPHe+aAMFdpjTKQ7hBWRy1D/A= X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:(185117386973197)(275809806118684); X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(6095135)(601004)(2401047)(13023025)(13018025)(8121501046)(5005006)(13024025)(13015025)(13017025)(93006095)(93001095)(3002001)(10201501046)(6055026)(6096035)(20161123565025)(20161123561025)(201703131430075)(201703131448075)(201703131433075)(201703161259150)(201703151042153)(20161123559100)(20161123563025)(20161123556025); SRVR:BL2PR03MB163; BCL:0; PCL:0; RULEID:(400006); SRVR:BL2PR03MB163; X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; BL2PR03MB163; 4:brjdfPjCfZdYZz770F1yMbqA5D7Pu2sffeWiCA0Eawf?= 39qfTvpOHNHA6iuzDkW85coYvXAlvozia1uDGRCLemjjDn6QZT3RD+npqn2qogoVWcorup/i9jY9I7ipEytMiwMAaxso3IynzzKyIFLlhfpQIOF2bOqdmuU6QqciLkJze4leYVLPTaYN91w5k9uhV+TjxoWDvUSbs8bgEzjCckJoQ9QjWebxEhPgHX6vcuse/bmMJka0XJ9hj/54nESL5NjFk0i7O0EoV+T9MB0RtgiXrAM5gGkECL0fnQVTCkLziv/fopZ3yaQaQs7kUP9xgIsIasE1Eui9sVtRGhULPQHqA1jczN0l1rSUAcOGI1qSVyieBdUiHqNWMRLKjtTJ1i6Vd5q+ib5A4MlusflMZ9v0Uc15mjd9HW7G+9QjFhSn9VZehYdx7PPtqFhu5J11a1fVNDrcgDZY/neKjl8mqMWvuRqdj0xZQLHRQFtf9NjxvbzZeTGa+NeAiUp8PZUt48v6EezL6dvp7Nr2RUu2w6Kzg2KRf7OAZcZZlt2j6oeGOzlY/BVQMt2nTROS0xabfmM86KOL3wTpMiLFJbnYWbb3278MRzzZlUYg1QlD1XdqEbSuFYvd2TRFgfFjY/taVa0OxkjoeN6SOPj1Zr91cduy9L60kH+8iNAVOlv42V5G1xalYae2cb79uZ486dGAueYUH0RArmlKudH0fiioyKEiTQvQlWVp+NbEsJw8DQb3ikc/w411dVMjMBznII1PbelSjTo7mS7xIa1H7YjCw5seoxXyxJRi0bv9KRrK7BKoBD6f7mSCSl0mOwo8RpktZ5qkJP0Y8AQgFbm2HZzpkpRPa+JEMFCfbvXe+o49I65IZ8WWGWf5utBtSsu6gwIIWZHvUGfndvuTnlkuExRN1ZenGCS12rfxe1qMYFtSrnwXmFQ9DRL8K4WSl8QBN7Uf5khqnSn6bNNbrqRjd4a2/6e789NT2PsVRCKhJxT7/nIk= X-Forefront-PRVS: 0308EE423E X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; BL2PR03MB163; 23:ZO+nV5V1bNRh8zuaCVlTUUHvMdhVvRFctBpB6swQ3X?= gz1rv5mlXduYvaIZioNAKvppXsRJGGXOwbio1e2Q1XBiPuOS43+u/IH674nEGUvLPfScFxqcpssWDjG40EjWzkhaYZKm1umsTY2CwPz99WqYgPWIGA6/Bm80nAlly/0B4hNxe35C1qBG6amSGrGRnACDtVNOFaFTg8xt6QNtnpBfHbepDib/X9uUy3gkzX0AmS5+4Ybl8k07D3HRx93t9dp+xZCNGCtd8BMFQtqXxBx2CcZ0CfEn57HpGp6rriirPRkmGSGvEv9fy6vTLgCubODeZK23aJ/qEgKWWNj6zukmIOnugMUrOWkWvmxNWLpaI315CLx1ytnhJjNoLtWVLnaLDXPSpFh8WV3OxxUJHSu4fRvH1e3CudhN02HuXAeUzx/dtrZTjzKkx7/WBmcn/RO11545UvgeJLSWwdzM/Cd+S8sCKMjJbmtfVtKFG9nniagFeT5OZpc4jqedtfnB7h0L4OJrRlJ7QBtdrBU3klD1wF5RcfMHOmmVFan00YOGBUyd6cO7Ynufv0igaRpKmu/veEoZoFBHpT1fqmjK1tPGP1Gm1Jvx12VhLH8tUnD2H5p4VS4S24gOa5xWK4o5ojOvg5K65DOhx2MqkDRCbwpSeP6S2NQNeg5mwNEUu4kevxRsT2TeiVqICbwoYtZfF0+KbCSBS6QeyPEC3Lq5aD+rPRmUkDtnFj5tTDTsxMjD1G7gApKsEoAFGFMLMzdMx9+yBuisalXN7bfieJpixRbDUBJssUOAPEPNKzpUB22AMnJvzx7LJDJZ+R5h+EG0cpANYY5IkCELcKRR2FOQoWducKUxjcs85x706y24vaXX2UewPczTuWteArFxD4YINAa8TcXsWXkdupJO7jzb/dx7UuFiJ510eVxNTi8ikni8h5ktPTUC6Xn004qaZYBSbJGGNNXQy+nTDBEaE2R+KueA9xwMIojkpWO1Q4hyGqySHP4iT6SlQlMsDMWIJa1TynvsEqubonz/CAuOkmJdv7o/biX7QcP0WOuoHvI0V6CLwNRbJ96vc9ly5OKgAf70bMKPB6J1SHg+KPjy0zVpE7L9XSy5cIyi1ZD89bAGWLNwqTROf+Dfu6sHm/GUW4Ckzv+UiRnVrsmR3fVd3QQbzy3dks9iNmVZm9V3O3LDchOXVGtER1y1mlNH9H6wUqEPWMdwduYvQ0L5MHhlTFPQb6nClfLaYOT2+eiDxRnEo71LjCKRAZb7yTsJNPKR6Vcwrz X-Microsoft-Exchange-Diagnostics: 1; BL2PR03MB163; 6:hBru3bc8JyWrputJdqRS3HAm9SViBdBUcJlVpv5uTKhPKjNMC4JGwBbLl2gpyU4wocWtZ6v5xVCFm21McG+A5ucH0q985rNdDWgbQwAH2RB0zTOLL0NvjYzsIGZ9j3hETM+0V7rJQSU7BxvTmX7etTEXhwqKblMeuzQpo7Wxo8TO0Davs3tgz/yIA0G3AZGDPSsx9lU2r6+n1Zkm+KNvOCFlmxs7A7FQ/sXsAUwwsanklzUXFJtfXzZHm5ZCeGvC3UpIogyeFibAmC2fZVbKGsV2Zw7epMmqtZPb6jz3UePhq0p2aMkdeD6CssiPkCyUCQYQhmrs+bS4ocvzfVRT9xifhqdke9HEBTrIahjmvnICYzWojAXgde/P5RhHDz+gG3yqXSaufIMtEkt9h3fwc8YDMvLVfJJi0rTR8Yk7ijhES5cp38zfHe/l0B56Y+/2CAks8OXfaJOXD+q1r+1VNfLwQQdVrvoEwUkv7hnWStFUyTBgPU4L1PQ/VpqCozHXfwy+7F5Rd91q5QQ4s7Gqbg==; 5:9l6LojJb4/NQrrxoeIsZfCBX8yvhCSg0p4j4phH4BOkYhO8uyaowXrIYmkDy4G0dRhkVpu8ZY3jiWzXTtt0psy+zKECfV4UHAXF6i6gBAbAiGv8zaS6tTJxwWxCGi3lRfNRS+0JhXiXyOw82hwniLQ8vwF3SQLG5SR+94dMIJ4WWE8cbrxOI1lqcd+dQ2+71; 24:1LplcGeBNracGiuPhXPoOFy+dZVc0A+I3H8+cBOr/AGdY7TXjrb2PWxWjYGLeHqeduugzfkm5cD4hcgAK4A4OsfjOFilC5WNk3WxBJJZ7Ts= SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1; BL2PR03MB163; 7:YYQ0S9K5cBsOQhe/+U5mYPtt20OfWBpc5UH9sZDxeKRp6TuLaG9PLUFdXLW4uMy8GtQ+Gr08I2Hi5mTryc96W92iNrr4Nmwk9Skv82dkP3HvcLduCLyX7Q9jf8XLgR6X8vZzKbpQHhXzT0d7EcoeMG5+lpd3DiXmpfqhs0AbFL3irY+W3MOln7ZqLPgGgg22KlPBDO06+yaL0oLXaa5Gkp8d+cIsKwxSvtNMb6M9VpXXBpmYHs2jKPlsBZVKtZ2gHYe0NPPmlYJLAHybMBxYhB5zU5i+eVxWPJOLbFDhs/U80pxnIa4SxslO7c6WLuqEvUtsyz2yWOApvV1XTq+/fw== X-MS-Exchange-CrossTenant-OriginalArrivalTime: 15 May 2017 12:38:29.8308 (UTC) X-MS-Exchange-CrossTenant-Id: 5afe0b00-7697-4969-b663-5eab37d5f47e X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=5afe0b00-7697-4969-b663-5eab37d5f47e; Ip=[192.88.168.50]; Helo=[tx30smr01.am.freescale.net] X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: BL2PR03MB163 Subject: [dpdk-dev] [PATCH v2 16/20] net/dpaa2: add support for flow control X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" Signed-off-by: Hemant Agrawal --- doc/guides/nics/features/dpaa2.ini | 1 + drivers/net/dpaa2/dpaa2_ethdev.c | 142 ++++++++++++++++++++++++++++++++++++ drivers/net/dpaa2/mc/dpni.c | 18 +++++ drivers/net/dpaa2/mc/fsl_dpni.h | 24 ++++++ drivers/net/dpaa2/mc/fsl_dpni_cmd.h | 8 ++ 5 files changed, 193 insertions(+) diff --git a/doc/guides/nics/features/dpaa2.ini b/doc/guides/nics/features/dpaa2.ini index 4b1e000..720c35b 100644 --- a/doc/guides/nics/features/dpaa2.ini +++ b/doc/guides/nics/features/dpaa2.ini @@ -12,6 +12,7 @@ Allmulticast mode = Y Unicast MAC filter = Y RSS hash = Y VLAN filter = Y +Flow control = Y VLAN offload = Y L3 checksum offload = Y L4 checksum offload = Y diff --git a/drivers/net/dpaa2/dpaa2_ethdev.c b/drivers/net/dpaa2/dpaa2_ethdev.c index fa9db17..edff04a 100644 --- a/drivers/net/dpaa2/dpaa2_ethdev.c +++ b/drivers/net/dpaa2/dpaa2_ethdev.c @@ -1105,6 +1105,146 @@ void dpaa2_dev_stats_reset(struct rte_eth_dev *dev) return ret; } +static int +dpaa2_flow_ctrl_get(struct rte_eth_dev *dev, struct rte_eth_fc_conf *fc_conf) +{ + int ret = -EINVAL; + struct dpaa2_dev_priv *priv; + struct fsl_mc_io *dpni; + struct dpni_link_state state = {0}; + + PMD_INIT_FUNC_TRACE(); + + priv = dev->data->dev_private; + dpni = (struct fsl_mc_io *)priv->hw; + + if (dpni == NULL || fc_conf == NULL) { + RTE_LOG(ERR, PMD, "device not configured"); + return ret; + } + + ret = dpni_get_link_state(dpni, CMD_PRI_LOW, priv->token, &state); + if (ret) { + RTE_LOG(ERR, PMD, "error: dpni_get_link_state %d", ret); + return ret; + } + + memset(fc_conf, 0, sizeof(struct rte_eth_fc_conf)); + if (state.options & DPNI_LINK_OPT_PAUSE) { + /* DPNI_LINK_OPT_PAUSE set + * if ASYM_PAUSE not set, + * RX Side flow control (handle received Pause frame) + * TX side flow control (send Pause frame) + * if ASYM_PAUSE set, + * RX Side flow control (handle received Pause frame) + * No TX side flow control (send Pause frame disabled) + */ + if (!(state.options & DPNI_LINK_OPT_ASYM_PAUSE)) + fc_conf->mode = RTE_FC_FULL; + else + fc_conf->mode = RTE_FC_RX_PAUSE; + } else { + /* DPNI_LINK_OPT_PAUSE not set + * if ASYM_PAUSE set, + * TX side flow control (send Pause frame) + * No RX side flow control (No action on pause frame rx) + * if ASYM_PAUSE not set, + * Flow control disabled + */ + if (state.options & DPNI_LINK_OPT_ASYM_PAUSE) + fc_conf->mode = RTE_FC_TX_PAUSE; + else + fc_conf->mode = RTE_FC_NONE; + } + + return ret; +} + +static int +dpaa2_flow_ctrl_set(struct rte_eth_dev *dev, struct rte_eth_fc_conf *fc_conf) +{ + int ret = -EINVAL; + struct dpaa2_dev_priv *priv; + struct fsl_mc_io *dpni; + struct dpni_link_state state = {0}; + struct dpni_link_cfg cfg = {0}; + + PMD_INIT_FUNC_TRACE(); + + priv = dev->data->dev_private; + dpni = (struct fsl_mc_io *)priv->hw; + + if (dpni == NULL) { + RTE_LOG(ERR, PMD, "dpni is NULL"); + return ret; + } + + /* It is necessary to obtain the current state before setting fc_conf + * as MC would return error in case rate, autoneg or duplex values are + * different. + */ + ret = dpni_get_link_state(dpni, CMD_PRI_LOW, priv->token, &state); + if (ret) { + RTE_LOG(ERR, PMD, "Unable to get link state (err=%d)", ret); + return -1; + } + + /* Disable link before setting configuration */ + dpaa2_dev_set_link_down(dev); + + /* Based on fc_conf, update cfg */ + cfg.rate = state.rate; + cfg.options = state.options; + + /* update cfg with fc_conf */ + switch (fc_conf->mode) { + case RTE_FC_FULL: + /* Full flow control; + * OPT_PAUSE set, ASYM_PAUSE not set + */ + cfg.options |= DPNI_LINK_OPT_PAUSE; + cfg.options &= ~DPNI_LINK_OPT_ASYM_PAUSE; + case RTE_FC_TX_PAUSE: + /* Enable RX flow control + * OPT_PAUSE not set; + * ASYM_PAUSE set; + */ + cfg.options |= DPNI_LINK_OPT_ASYM_PAUSE; + cfg.options &= ~DPNI_LINK_OPT_PAUSE; + break; + case RTE_FC_RX_PAUSE: + /* Enable TX Flow control + * OPT_PAUSE set + * ASYM_PAUSE set + */ + cfg.options |= DPNI_LINK_OPT_PAUSE; + cfg.options |= DPNI_LINK_OPT_ASYM_PAUSE; + break; + case RTE_FC_NONE: + /* Disable Flow control + * OPT_PAUSE not set + * ASYM_PAUSE not set + */ + cfg.options &= ~DPNI_LINK_OPT_PAUSE; + cfg.options &= ~DPNI_LINK_OPT_ASYM_PAUSE; + break; + default: + RTE_LOG(ERR, PMD, "Incorrect Flow control flag (%d)", + fc_conf->mode); + return -1; + } + + ret = dpni_set_link_cfg(dpni, CMD_PRI_LOW, priv->token, &cfg); + if (ret) + RTE_LOG(ERR, PMD, "Unable to set Link configuration (err=%d)", + ret); + + /* Enable link */ + dpaa2_dev_set_link_up(dev); + + return ret; +} + static struct eth_dev_ops dpaa2_ethdev_ops = { .dev_configure = dpaa2_eth_dev_configure, .dev_start = dpaa2_dev_start, @@ -1128,6 +1268,8 @@ void dpaa2_dev_stats_reset(struct rte_eth_dev *dev) .rx_queue_release = dpaa2_dev_rx_queue_release, .tx_queue_setup = dpaa2_dev_tx_queue_setup, .tx_queue_release = dpaa2_dev_tx_queue_release, + .flow_ctrl_get = dpaa2_flow_ctrl_get, + .flow_ctrl_set = dpaa2_flow_ctrl_set, .mac_addr_add = dpaa2_dev_add_mac_addr, .mac_addr_remove = dpaa2_dev_remove_mac_addr, .mac_addr_set = dpaa2_dev_set_mac_addr, diff --git a/drivers/net/dpaa2/mc/dpni.c b/drivers/net/dpaa2/mc/dpni.c index e92fe06..5e56b19 100644 --- a/drivers/net/dpaa2/mc/dpni.c +++ b/drivers/net/dpaa2/mc/dpni.c @@ -444,6 +444,24 @@ int dpni_get_qdid(struct fsl_mc_io *mc_io, return 0; } + +int dpni_set_link_cfg(struct fsl_mc_io *mc_io, + uint32_t cmd_flags, + uint16_t token, + const struct dpni_link_cfg *cfg) +{ + struct mc_command cmd = { 0 }; + + /* prepare command */ + cmd.header = mc_encode_cmd_header(DPNI_CMDID_SET_LINK_CFG, + cmd_flags, + token); + DPNI_CMD_SET_LINK_CFG(cmd, cfg); + + /* send command to mc*/ + return mc_send_command(mc_io, &cmd); +} + int dpni_get_link_state(struct fsl_mc_io *mc_io, uint32_t cmd_flags, uint16_t token, diff --git a/drivers/net/dpaa2/mc/fsl_dpni.h b/drivers/net/dpaa2/mc/fsl_dpni.h index 20ab869..fa5a134 100644 --- a/drivers/net/dpaa2/mc/fsl_dpni.h +++ b/drivers/net/dpaa2/mc/fsl_dpni.h @@ -740,6 +740,30 @@ int dpni_get_qdid(struct fsl_mc_io *mc_io, #define DPNI_LINK_OPT_ASYM_PAUSE 0x0000000000000008ULL /** + * struct - Structure representing DPNI link configuration + * @rate: Rate + * @options: Mask of available options; use 'DPNI_LINK_OPT_' values + */ +struct dpni_link_cfg { + uint32_t rate; + uint64_t options; +}; + +/** + * dpni_set_link_cfg() - set the link configuration. + * @mc_io: Pointer to MC portal's I/O object + * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' + * @token: Token of DPNI object + * @cfg: Link configuration + * + * Return: '0' on Success; Error code otherwise. + */ +int dpni_set_link_cfg(struct fsl_mc_io *mc_io, + uint32_t cmd_flags, + uint16_t token, + const struct dpni_link_cfg *cfg); + +/** * struct dpni_link_state - Structure representing DPNI link state * @rate: Rate * @options: Mask of available options; use 'DPNI_LINK_OPT_' values diff --git a/drivers/net/dpaa2/mc/fsl_dpni_cmd.h b/drivers/net/dpaa2/mc/fsl_dpni_cmd.h index 6e96271..4395aac 100644 --- a/drivers/net/dpaa2/mc/fsl_dpni_cmd.h +++ b/drivers/net/dpaa2/mc/fsl_dpni_cmd.h @@ -64,6 +64,7 @@ #define DPNI_CMDID_GET_LINK_STATE ((0x215 << 4) | (0x1)) #define DPNI_CMDID_SET_MAX_FRAME_LENGTH ((0x216 << 4) | (0x1)) #define DPNI_CMDID_GET_MAX_FRAME_LENGTH ((0x217 << 4) | (0x1)) +#define DPNI_CMDID_SET_LINK_CFG ((0x21a << 4) | (0x1)) #define DPNI_CMDID_SET_MCAST_PROMISC ((0x220 << 4) | (0x1)) #define DPNI_CMDID_GET_MCAST_PROMISC ((0x221 << 4) | (0x1)) @@ -238,6 +239,13 @@ } while (0) /* cmd, param, offset, width, type, arg_name */ +#define DPNI_CMD_SET_LINK_CFG(cmd, cfg) \ +do { \ + MC_CMD_OP(cmd, 1, 0, 32, uint32_t, cfg->rate);\ + MC_CMD_OP(cmd, 2, 0, 64, uint64_t, cfg->options);\ +} while (0) + +/* cmd, param, offset, width, type, arg_name */ #define DPNI_RSP_GET_LINK_STATE(cmd, state) \ do { \ MC_RSP_OP(cmd, 0, 32, 1, int, state->up);\