From patchwork Mon May 22 09:39:25 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Hemant Agrawal X-Patchwork-Id: 24441 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 9AE6120F; Mon, 22 May 2017 11:40:45 +0200 (CEST) Received: from NAM03-BY2-obe.outbound.protection.outlook.com (mail-by2nam03on0087.outbound.protection.outlook.com [104.47.42.87]) by dpdk.org (Postfix) with ESMTP id B4C4E326C for ; Mon, 22 May 2017 11:40:17 +0200 (CEST) Received: from BLUPR0301CA0040.namprd03.prod.outlook.com (10.162.113.178) by DM2PR0301MB0910.namprd03.prod.outlook.com (10.160.217.140) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256_P256) id 15.1.1101.14; Mon, 22 May 2017 09:40:15 +0000 Received: from BN1AFFO11FD010.protection.gbl (2a01:111:f400:7c10::178) by BLUPR0301CA0040.outlook.office365.com (2a01:111:e400:5259::50) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256_P256) id 15.1.1101.14 via Frontend Transport; Mon, 22 May 2017 09:40:15 +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 BN1AFFO11FD010.mail.protection.outlook.com (10.58.52.70) with Microsoft SMTP Server (version=TLS1_0, cipher=TLS_RSA_WITH_AES_256_CBC_SHA) id 15.1.1075.5 via Frontend Transport; Mon, 22 May 2017 09:40:15 +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 v4M9dk4B031538; Mon, 22 May 2017 02:40:13 -0700 From: Hemant Agrawal To: CC: , Date: Mon, 22 May 2017 15:09:25 +0530 Message-ID: <1495445969-29199-17-git-send-email-hemant.agrawal@nxp.com> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1495445969-29199-1-git-send-email-hemant.agrawal@nxp.com> References: <1494851864-26029-1-git-send-email-hemant.agrawal@nxp.com> <1495445969-29199-1-git-send-email-hemant.agrawal@nxp.com> X-EOPAttributedMessage: 0 X-Matching-Connectors: 131399196155156164; (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)(39450400003)(39850400002)(39840400002)(39380400002)(39410400002)(39400400002)(2980300002)(1109001)(1110001)(339900001)(189002)(199003)(9170700003)(53936002)(54906002)(50226002)(8656002)(47776003)(498600001)(2906002)(4326008)(8936002)(8676002)(104016004)(81166006)(85426001)(76176999)(48376002)(110136004)(50986999)(38730400002)(50466002)(6666003)(2950100002)(189998001)(86362001)(33646002)(305945005)(6916009)(5660300001)(77096006)(106466001)(5003940100001)(105606002)(36756003)(2351001)(356003); DIR:OUT; SFP:1101; SCL:1; SRVR:DM2PR0301MB0910; H:tx30smr01.am.freescale.net; FPR:; SPF:Fail; MLV:ovrnspm; MX:1; A:1; PTR:InfoDomainNonexistent; LANG:en; X-Microsoft-Exchange-Diagnostics: 1; BN1AFFO11FD010; 1:XnG+7zeS5nGTf1to61uoVZ9KoseuFr3XmnJSeCULEnQsG8w0xQegYs21czUOAwoJgPgZeEAkB4gHHNkoxs3qmmIOOca9Vx5TvV2BeUbodkcybFfBbK+3fEZenXnQt7WvBoXA7vE7uxhaqrXEsrVmbAJ6l5NnBhCZlKtByBdvdKec8Gh7gVywCrcSsk7kbuv9nQPr8CN5VLxd7M/gleqHOehw6og7BEnucsHP15FQo8rAPZLpTnRq/s6qOqFhWYJHwkGS8YJkYDOXLwC3xXcRORs0hJWIzRFNKfqyx60s666ZZho4j5JsDRLd+4kwW4pS5IrEq7VOo1tgHfs0mSKPiNJWi3gJBHdCTgG1oLMRJZQzBvHj8TRWxthH4TaZvr2h09RnyBhzdNWl+w5njhQTAXGKFKBQmIknnXGsfiMFafIeyu6D07s8AuFMhaQnq3Ez5CHFFN+zIw1Y/rurQ5O6dXiHx3tyoSIzTQt9hDUUtvoDEtk45FY3lBknlCvxg6S550LUW+FF0Z+LztZZKPjT4Ho9CXISTjk2iN5jRRIJcl4gUKEXVcAiGi3WFNzwdyIPvZfuzVk6HxlqlHZXFHudNWXHbRx4uW1yqj+JFmDIhp3HHJxTrUjNtanFokTQE+L7Deuq+oY+9y1CctNPTTzafUsePJSekHxQPkGQf/8/X41O9BgICpi3dERauMsWcMjUZPQtD8XqlTgTdH3Cgp1fN9RUXzKA6laClbS6slxEiAuhY18YYUHufVURcIi1OzUbDsjJXC0eZ6kutSUedKNQvA== MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: DM2PR0301MB0910: X-MS-Office365-Filtering-Correlation-Id: 71acb2ce-14d4-47ec-d402-08d4a0f68d0b X-Microsoft-Antispam: UriScan:; BCL:0; PCL:0; RULEID:(22001)(201703131430075)(201703131517081); SRVR:DM2PR0301MB0910; X-Microsoft-Exchange-Diagnostics: 1; DM2PR0301MB0910; 3:x2so4bBzwcUzs9aWls7R1rmRy3x2jcd0syhK2VKvWGPqhBu3oxsI6Y3S7KmXwZZ9VzPV2UUb+Ur82tZ04Lr/gf92SuR5xWYxvrxsvi7LeGFYbtE9czHcDODCSoxHKjmXHcy/wujRRzqhoxEyYSJOmd9xZvubxtpHiDc6IYV5B12T6lF2/nhBPH+nh66MCS2EKKLgpfbmgxTOLMfITYotZTfH+AAmGRmKfJIBTEqYEOKx7o9eDYn5xiE5YMRZg1ITOXOU3ARu4LnZZP6dmWkabDg6RZBwgYncMFeAPM2ZtvoPpQ3iHMHlCjPv3t12j+TfFbLIc1DN5PLH095bQptmY3aRPkaFZv1l50xqG+2rVBDnZ4yMrgpl4ngum7qCnsnvEoZ/TsnIQnyCbyYSTwB3IWMYVmUjMrQPyT5huhr2x4/aDAo8xCn7DjOMtodCypZb; 25:4L4/UliQmxvH0D8jWsKV/KNi4OW/NgO0z/Mz3Y3eJNZ+Grd1/WDOEPhqkKLcfzO30Ql1t0T8jwUFv4eO1U5gsWr4SCTGHYRPqrJ5pjFg01akWPWi4f/dVrxDqlJt5HcvD6ihS2zFlxnenCWBR59tnozQOHJ1jH5uxJ9Iwkyz7lE3s7LGjqdNnV6uvgYIFwswXo4Vfpa8jcxNxdiVO+zSJdAPnx6AJhkTG+sjjLsuTpN7JOscDz1cHtDyApGaUDezI9ibZdjKOLRy5RDXfoJYaF60m0dLuf3NgtoBXz8Pqu2X44oCjJmO0N/kDuk33N8JUXpNUN91UERiJ8xoogTgTMAN6PlPV7XSIDbNh/jaK8LtJwQNsVO35GlBzDGHg+9ojHfOrebc18Pi0UJBkvd9ZCS6tex05J5ZhRbiPNfcypbwJteC196Ay3tUZie3Lrog+d7VY0nLzDEJ7O7R8GDcs1jy7qPtD5k/NJX5z+6YUoo= X-Microsoft-Exchange-Diagnostics: 1; DM2PR0301MB0910; 31:nfHgl9r2phST1LsegR9SqfgsIbf3YhYg6Rk+XfQdY+UiyuQv5FDLq1bU4WjRPVKgT5r2XJHr4NDmJ9cdZlRQlTAoJ/Mjs+0DCcAId3kL1ZIjUuc6ckTuPDl+AA6LbKkLvUWf/QRT/ion48M4mrv2H1yXB5sHTwcfs6EZqP5yH5LmRB91jzOQM04+DrnH6wjxSspVh0yK07JU74BV1AljOiIt/O7aLPS3+PADvpgIqGlo5EE2M72nNzuPZP89g2Ci 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)(8121501046)(13015025)(13023025)(13018025)(13017025)(13024025)(5005006)(93006095)(93001095)(10201501046)(3002001)(6055026)(6096035)(20161123556025)(20161123561025)(201703131430075)(201703131448075)(201703131433075)(201703161259150)(201703151042153)(20161123559100)(20161123563025)(20161123565025); SRVR:DM2PR0301MB0910; BCL:0; PCL:0; RULEID:(400006); SRVR:DM2PR0301MB0910; X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; DM2PR0301MB0910; 4:sh5Uxeagi8gTQjELzb1PN/baD+uQh+weie/3XLC8?= +86x5e0eMgL//UiaVNwuBfZkFnku8SPdbg0JVLE7Lz4uZmG6zOs6+DGH7CsEZnB/BDXqCiCt13sGi1Alcl5PtzAU1jj0cnYkDLnwGZe/7PpTCkJOaNBSu1bEsI8hpu72Xy4GHWdritWDAL8Bd744OxjX2HmDKEcrrUispyzU0ZrSugvhRPCeH11stRRv0Vueu5BmZMFFHsnnli25fOnGOYqDcUJGiUEjszwkB5S+IpAR7PI7vlr1DBa6kofyGKa/Cikg8unR6WjN/FEZ7Hp3066wSHCChhzfl3TYFNYY/kki8ArJJaY8s7vioOzJI3Ou2uZ34zQ5EKkUS3FewO2psevHNuZlhSJxZQKCLfazVmG0nfeRMXFZdjDtBSu31YLUpOgjqnkaqE9+lL36CCZ1SODf5SWts4cKeHJ78pdN9E7x2KHGFy0KFK8LM3ylCTX0bZ0tLLmo1b8k0gh0vUylSWZ3bvCVCvgnPZcwD1YYT4Y4LEy7j61Xa67TJqNMiRmMM3bOcasUJ5k9yQ/mvLfXYoElas3deDj9S4wqmvHHGpoap3iyKu9z0jusJuDt+pTpTruN5d8bA3GJVNR7laK7ST2/IvC/2BF8p19qGq/Z/sHUQ9904yteBrMm4DnrinJZc+4A8QiV+ynytK1hJv4l6WN/gR7+X75Re6dLrp5God5OEPe5dwGVC7J2NZCLO0qAWjeORIJUsQQHgdvN5+EqAYruVyPNxMy9d4WDTB8v+ZKgF/fo8Qm7XjkRccnQU6CO6VS99xj2xsVZTwlZsG/Uw6crJT7KBIja4SVCLuqq37Nv9BLjfp+Bl8Umw5aEmIvJAmKq9/nLlGa3TMQXvJWVOnVY67iNkpI31Sg6YwJPuxvHSwhlqCvfw0FWH1EKpveuUkMfQCL15DK0MWAnCybNTkDRy99cp6NF8xx7UopIsnc8gIbVuu/+XAdOXYHZIKb70HE= X-Forefront-PRVS: 03152A99FF X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; DM2PR0301MB0910; 23:zKQ1b/8NpPBcPIsr13YG31aoc9R3aN/0YCFDPym?= B0kkvElacOBxuAHR2azKemwbwRR8Pb7d2bTJzoVbreewjtrfCEgYEijeHPdgV3/9sy/h9rdLm6WtREN5P/AvUujVSX3J8/dcFm/BGefG/c/CuXsdpKgTSn0m1tVya+wg6ZZaUdTnvGPkch88jJM4u6EqHKKkOVts3MQoS1v9Yq10eq40aicCLkNIAD4mWU2xkpoxtEba8N4KeN/ppxqhg9Gm0H8zXcVjU4xG6tGPcMLtse+bkM1VoXtz0/5rZaACphNGesAPPRyv8UTbaFDPhnecKN3ewAdudSow04g/TFRGy/yjxI0a53U72wQlYFbGXxGYIauP8CrIoI+qQpbmt7nvbUK1ftZgJpzBXKdowEmeMTovPTTEo4khEJBILRC65/FPh+5UuZntUNiCmRMsJq1xrSMSNDwurS6aBKSGQrSR4K/OMqK7Gm1rGmokS88OLrt398VIWauT5i7t+GE4TgA7k5dwLfPvPEftLK4U79jSs4MgKWW/cLVz4C2Vso/WZzCn3wTnVOnhcsBFdeT9QffCTHInOCJYmjnPWEEBMGk0c4+RjXBWHGa0q9epjC11HiVgqFwU9YhVbEdU0RfUyCRinlvecaZ6LZZ0PViM84ToygIPOMuayXRgbhWwZSJJGElLqM7KGnMQV3Y8DAyMSN0OMrS09X+hlVODpVgujrz+7BBaCnDpjS3OOm3W4gx3j5H6zFaskwiC28v1DSwTU4Lb3asBmyLoimMBGVsDO1aPwmZqjTOWe0Lx3+uZtQkudlr1lFSnzNutfCH2r27CoakFziWB6l+HrkNF5RNOGWiIlDHuo+M1NWTzJu8mGpWMx6AGG9f6OC2gSPL+jglwF1OvDH/b/kzu7kxtad+9mUOnWZZ5euBfKoeEVlg/dPXAVibOI4ja5Yk4AIW0lS3Xvp5OqwvglFS/yeHcNUz/wZRqAvcP/lhPaV7x/LCX2xmvBh7QN/veoPcOT5q36imo8rhwwdcVBP00iwFGgE1lw7JKlqsE0x2S+LT288XbHYvVudaswr+IcW9JeEP9jtR7SjhWaV0GALi39zxYDkhCXImU4TWncYoxS9doDB1emFdVqO0znK+PIHJFkF4G/hSBqA3rKOGOb5OW9VtGIpa6135v2KoJpMHtww0d2vjKJloLW0VMLi2sNBHCNWaAnwaJ4s+9dnD7KcpIDjcKVzuKb3HARlgibwteLsAMkiXGiC1mLgbM= X-Microsoft-Exchange-Diagnostics: 1; DM2PR0301MB0910; 6:1zDf1f+PfwSVT4AklThvfs8NO9/wNcP0iZvWOFNhjyRr2FGwfov4C4bitxg74BJfGlYSZhiQM4kg4f/1zxOMpKysrTnkjPaM6RJwmVP1anaEaJm5XjzGg3kA2TokR0g6TWGkJYxas8RRwizeaFmFAtLozCctjVxsU/jA6/UqOE3iAH/aa2M0rdEwBt4rTUboJJawKPLo4Tub5b2FUhOYqAdtL1g5yfnPHms1mRdO79kgmWqATlAzK1wOY2G4BI0Qj9H+nH2+e5s69OHELm8/ylD9fylz/YKHF5OLy0G8Sxuf9s/XLayGk4znQAlasD+Qbl6dm+DgUIQpjcGftPy9RoNCnpGxcpI23EIPpa/BegCf5+6jXxl9WbYmRwxlOw7W6B4Sk9OFf8TfVzeALCINzQnxa8CFbLp7vbgJhyJLe8p0ub74i4OP/VFzJ7pWGI62YnplvWQLI0MMOXGnptC3KjePKMALPWUWs72S0PVIzI4b4zCUOlbpiwksDRkKmxNCAsXO7R1RKTlH25VdRojoYA==; 5:I1maOsfG6oNbWmjgv+aSdrdXkWIhEdGdi26WYIMKAaWsjPHNElxshlKv/329m7petxHPW7k62DQGh+Z5kf4eZNnhT95LF4HgWyHFyYcqg0xECuSqxRdYQoy0PXL5fetfdq5Y65KSfcLSugO5d7BcThYR+vV5Hjvq5CSZLuzMTtj7YnI0qwShxu4wQdONRBKx; 24:H74l1D7K7TIu5+WkU2xUsRiLK2A3g95aERBXKDRV1LuJX3zcpCKVULMyn7Ky1fhM7V6rKPdfML+TSXpwJvq6igKs8zUJu9pmPrYAB7IaY1c= SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1; DM2PR0301MB0910; 7:aGYQbjwx/tQFDqLOtTWAZ9+Myq07nx5q/yCOIB5toOXCRlRzMVfVSQaaBLTzulIBIBCwwNOg7SQaba3fZlLZtsZ5fuvB3qJp76thxGXPIcI5R16viVHUB8GsYg4wCmy2Bvl7jeKIQizvP8F6iWSvs9QqPzEdjQwlIDDhrBHP/xEreuV/iYHLDwmKK8Jc3se6ejcctasCG5Lp8oggP/e0u88seuQeh02jE3d59hFnv3i8F69YrZ5U265XmLlzaJuOYJcr/7Sz+eI0l4jhPRojQQUGHy+/LQJI5u1dG2bPZ4TEqBo0WcqTfeo78UzJKQNrIqcsQ2887XYQTFD9CpMpvg== X-MS-Exchange-CrossTenant-OriginalArrivalTime: 22 May 2017 09:40:15.3284 (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: DM2PR0301MB0910 Subject: [dpdk-dev] [PATCH v3 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);\