{"id":815499,"url":"http://patchwork.ozlabs.org/api/patches/815499/?format=json","web_url":"http://patchwork.ozlabs.org/project/netdev/patch/1505825158-8192-4-git-send-email-razvan.stefanescu@nxp.com/","project":{"id":7,"url":"http://patchwork.ozlabs.org/api/projects/7/?format=json","name":"Linux network development","link_name":"netdev","list_id":"netdev.vger.kernel.org","list_email":"netdev@vger.kernel.org","web_url":null,"scm_url":null,"webscm_url":null,"list_archive_url":"","list_archive_url_format":"","commit_url_format":""},"msgid":"<1505825158-8192-4-git-send-email-razvan.stefanescu@nxp.com>","list_archive_url":null,"date":"2017-09-19T12:45:55","name":"[RESEND,3/6] staging: fsl-dpaa2/ethsw: Add ethtool support","commit_ref":null,"pull_url":null,"state":"not-applicable","archived":true,"hash":"f19d63a5f844c0019b1785cd9a9f3ce08432ebb5","submitter":{"id":72391,"url":"http://patchwork.ozlabs.org/api/people/72391/?format=json","name":"Razvan Stefanescu","email":"razvan.stefanescu@nxp.com"},"delegate":{"id":34,"url":"http://patchwork.ozlabs.org/api/users/34/?format=json","username":"davem","first_name":"David","last_name":"Miller","email":"davem@davemloft.net"},"mbox":"http://patchwork.ozlabs.org/project/netdev/patch/1505825158-8192-4-git-send-email-razvan.stefanescu@nxp.com/mbox/","series":[{"id":3864,"url":"http://patchwork.ozlabs.org/api/series/3864/?format=json","web_url":"http://patchwork.ozlabs.org/project/netdev/list/?series=3864","date":"2017-09-19T12:45:58","name":"staging: Introduce DPAA2 Ethernet Switch driver","version":1,"mbox":"http://patchwork.ozlabs.org/series/3864/mbox/"}],"comments":"http://patchwork.ozlabs.org/api/patches/815499/comments/","check":"pending","checks":"http://patchwork.ozlabs.org/api/patches/815499/checks/","tags":{},"related":[],"headers":{"Return-Path":"<netdev-owner@vger.kernel.org>","X-Original-To":"patchwork-incoming@ozlabs.org","Delivered-To":"patchwork-incoming@ozlabs.org","Authentication-Results":["ozlabs.org;\n\tspf=none (mailfrom) smtp.mailfrom=vger.kernel.org\n\t(client-ip=209.132.180.67; helo=vger.kernel.org;\n\tenvelope-from=netdev-owner@vger.kernel.org;\n\treceiver=<UNKNOWN>)","spf=fail (sender IP is 192.88.168.50)\n\tsmtp.mailfrom=nxp.com; nxp.com; dkim=none (message not signed)\n\theader.d=none;nxp.com; dmarc=fail action=none header.from=nxp.com;"],"Received":["from vger.kernel.org (vger.kernel.org [209.132.180.67])\n\tby ozlabs.org (Postfix) with ESMTP id 3xxN366D3Lz9s7c\n\tfor <patchwork-incoming@ozlabs.org>;\n\tTue, 19 Sep 2017 22:48:34 +1000 (AEST)","(majordomo@vger.kernel.org) by vger.kernel.org via listexpand\n\tid S1751915AbdISMsC (ORCPT <rfc822;patchwork-incoming@ozlabs.org>);\n\tTue, 19 Sep 2017 08:48:02 -0400","from mail-co1nam03on0053.outbound.protection.outlook.com\n\t([104.47.40.53]:22272\n\t\"EHLO NAM03-CO1-obe.outbound.protection.outlook.com\"\n\trhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP\n\tid S1751803AbdISMqN (ORCPT <rfc822;netdev@vger.kernel.org>);\n\tTue, 19 Sep 2017 08:46:13 -0400","from CY1PR03CA0010.namprd03.prod.outlook.com (10.174.128.20) by\n\tBN3PR03MB2355.namprd03.prod.outlook.com (10.166.74.150) with\n\tMicrosoft SMTP Server (version=TLS1_2,\n\tcipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P256) id\n\t15.20.56.11; Tue, 19 Sep 2017 12:46:11 +0000","from BN1BFFO11FD030.protection.gbl (2a01:111:f400:7c10::1:136) by\n\tCY1PR03CA0010.outlook.office365.com (2603:10b6:600::20) with\n\tMicrosoft SMTP Server (version=TLS1_2,\n\tcipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P256) id\n\t15.20.56.8 via Frontend Transport; Tue, 19 Sep 2017 12:46:11 +0000","from tx30smr01.am.freescale.net (192.88.168.50) by\n\tBN1BFFO11FD030.mail.protection.outlook.com (10.58.144.93) with\n\tMicrosoft SMTP Server (version=TLS1_0,\n\tcipher=TLS_RSA_WITH_AES_256_CBC_SHA) id 15.20.35.14\n\tvia Frontend Transport; Tue, 19 Sep 2017 12:46:11 +0000","from fsr-ub1464-140.ea.freescale.net\n\t(fsr-ub1464-140.ea.freescale.net [10.171.73.107])\n\tby tx30smr01.am.freescale.net (8.14.3/8.14.0) with ESMTP id\n\tv8JCjwWh016741; Tue, 19 Sep 2017 05:46:08 -0700"],"Received-SPF":"Fail (protection.outlook.com: domain of nxp.com does not\n\tdesignate 192.88.168.50 as permitted sender)\n\treceiver=protection.outlook.com; \n\tclient-ip=192.88.168.50; helo=tx30smr01.am.freescale.net;","From":"Razvan Stefanescu <razvan.stefanescu@nxp.com>","To":"<gregkh@linuxfoundation.org>","CC":"<devel@driverdev.osuosl.org>, <linux-kernel@vger.kernel.org>,\n\t<netdev@vger.kernel.org>, <agraf@suse.de>, <arnd@arndb.de>,\n\t<alexandru.marginean@nxp.com>, <bogdan.purcareata@nxp.com>,\n\t<ruxandra.radulescu@nxp.com>, <laurentiu.tudor@nxp.com>,\n\t<stuyoder@gmail.com>","Subject":"[RESEND PATCH 3/6] staging: fsl-dpaa2/ethsw: Add ethtool support","Date":"Tue, 19 Sep 2017 15:45:55 +0300","Message-ID":"<1505825158-8192-4-git-send-email-razvan.stefanescu@nxp.com>","X-Mailer":"git-send-email 1.9.1","In-Reply-To":"<1505825158-8192-1-git-send-email-razvan.stefanescu@nxp.com>","References":"<1505825158-8192-1-git-send-email-razvan.stefanescu@nxp.com>","X-EOPAttributedMessage":"0","X-Matching-Connectors":"131502987715419998;\n\t(91ab9b29-cfa4-454e-5278-08d120cd25b8); ()","X-Forefront-Antispam-Report":"CIP:192.88.168.50; IPV:NLI; CTRY:US; EFV:NLI;\n\tSFV:NSPM;\n\tSFS:(10009020)(6009001)(7966004)(336005)(376002)(346002)(39860400002)(39380400002)(2980300002)(1109001)(1110001)(339900001)(199003)(189002)(104016004)(76176999)(50986999)(85426001)(189998001)(77096006)(5003940100001)(8676002)(81156014)(8936002)(81166006)(50226002)(356003)(97736004)(8656003)(305945005)(68736007)(2906002)(105606002)(36756003)(50466002)(2351001)(316002)(33646002)(16586007)(106466001)(48376002)(47776003)(498600001)(4326008)(6916009)(54906002)(53936002)(39060400002)(7416002)(5660300001)(6666003)(2950100002)(86362001)(2004002)(217873001);\n\tDIR:OUT; SFP:1101; SCL:1; SRVR:BN3PR03MB2355;\n\tH:tx30smr01.am.freescale.net; FPR:; SPF:Fail;\n\tPTR:InfoDomainNonexistent; A:1; MX:1; LANG:en; ","X-Microsoft-Exchange-Diagnostics":["1; BN1BFFO11FD030;\n\t1:g2+Q2ezEcdOoLRf8EXJebUL99jKD9qyOYv71b26jECmiZrQIlrq8YhCpsy9S7TRIq/6XIs1FReAttXFg6sUwENpvNLW7QNjcMyO4cqFIZgk7+cn5IvnEazRm6TgD4+Jr","1; BN3PR03MB2355;\n\t3:v3h3oquki0ZCHenbeWYzrpbD9Qb7qH447byshcPbPO2S3b1nVl+5ZO5VSS+9E6QUoMa3VmWiBp2wQxCMhiWtA9zfS3BMvprPBfLz89BajigQqeTJZCSmD71/PW++eccXlJeAGAA2MRAUnRxHZ1bcxPZ6A87mxmUMGtHpMYVc4FN4I9PVdU/UCdNycOcBW7Ht0buqM4S/3UoepnsFjvMQOjya9cZNQbSxkPvkIuYKNfVIbpT6ZLt+x3ppKFSUZpwsSQ1gxJkLU49IfrZ3JZyC2AjVnUtjOXqi8T+Br31LUjUK0VL1W9L+1scklmKqRMcxphwkKl+jzXMYsDP+239jeMnFxviIbIyElzhxK4lJMJg=;\n\t25:M2Zy2suLvV8OtTePdqlgZHb6MfrsgxTMMDFC76USZYh0tJChyP/kVs8PzavQGV92e2wBtyvLBNzYTUhkUtH3iL/d67xFyV78epD8ebv4hugsYpe4nbQWz/meKGFKbv0GgZHhjrIjRCHuB0mbmE2z5FROI1WZvgk1vyA0a7nwEUoPVcotjkLB7NdBiuji63dFvcvFn7wfxLPwqQLy6piHlfJDty6VEdKxuyNrFsWheIQ2XlQs7yCPDknmPA3DLGmsWun8ltwC9LCECBml2D6RpYZSTbQGSoHEMjen21YrSEzoMz1NSFwK4QWjS+ipVWmwFiKq9NvedlHzHmQX2yCdkA==","1; BN3PR03MB2355;\n\t31:m8fTGvHg7Vi2AkbHekw52MiGhyDOWTgF6tRS9b76Rsvx772km310RDTCUuG7Hk4qrsLEQkKuZ/XRF2OkU7UturSyEo4G/KhbwYCuVjbbx0VHzBR5f1ud77oWvihSn6fIlzGUXDJJdkRMZu1obesc5NUZZ7SV8/l1dmgYdi9fqPBUTYxqm+F45jCOz+2s2HNOqBzap0funpua1025jp4RIqBxpI9zKnuQKp7sqJVBP0g=;\n\t4:7jETORJTShDa/G/kf+L/4xHpACmfIiFGeEZ5E/9OARAtZFTgIVkhgSaiVRvEXXQDzwrHs+wnG0IdI9U+JSyNoALftkSAy4WyWP+V+eAUFQtgy/GBbRzTtbWavdHYVHNQH5hGctVdTmRWGopURdq3KaH0a8QCYPA8DjlwkU64yD4Njm2oZ0rAAUH8V1BDlWwRdpp4s8JXyCJsMOwM8fvpoIS0ruiNrTfr8TMo/QN+Ob4f8ntmj0m7FOp5z0plrwR6DxIBFMbqasKzNNzcuPxxwjBCb+m91j3sNgnHlXgZrAPICIz1nXE0tEbJzoWe1PbfcVWBOckKyMQJ+YJnvVCr8Q==","1; BN3PR03MB2355;\n\t23:NGWBXnazjKvk4Mw5Gvb4uAI4pnIDH6ySAdpNQxvnGP9a7rCSRaf78hJRUBFpniO3cM8LtzHK4ZfGsqB4ZNQTJRUcNahFvVcPE3A03ZurvhtNbZIK7+2240haxAYfITRZzd6TMWRrLDnR0wlFYnu0wkNtWrTy6EmvDInIWFF8YI5a5fqDXDGz4ByvzGUje6sLsjFcrfKfEZ+Qamd+Skk3uf0p3sBGWzOBX68O7DsqIkxVbj4wjOWip29rRUVamrmGm8LILLNEil7rDkdMz3L8yg3Ilki35azamRbNs3gEQgHSdVl3wlS/BQPnGPOt7MixQOUJi06zsWOYfAJymrvNsPAmxKtmIDhXlsXgncW1ypibUAbTLNldCgH6LvBYh/LCtfDJJ2ln3rTH/XLuJy+gVZQHcpGNVgNVlPvuBWPp/EbjwiPcVw1jkT7dws0fGe7E5hOl4iMxB/KU5pAtLZnJN156lEx7fkMC0WRs2fwDbqyfi5XO8alkq6KbgU4W1qJviGvDolj9qA8DWNPj4Iy69vEoB3Nh6fHggKOzmmUWBJf0/BbbB5OC8Ll/rvlPmt4LCCcucfiFRDGb6S5U9cB1WQJMzVfRzGVRuAyP17+zpAzVxhyObrjWnpFwBJB+evP79qVNEmEO4Hosfct08gQmyuZ1POKY0Eh0IPenTOpFC72pWWexBAAXdokiHzxJFaqrd0WWIHjwr2GudaEU4uuKcmNGB3Vp5CBtp55rWPm09sX2NWbgwWiYMPaWIv1Qb1+7G+LC271bFWyNP6veo7Y5XtTZKgyIdCdW+3oCyGMh4L9G67JWKqg85myaH76DwZBZ1s9QPhfucgxtwN/vGBEuDWDFirlP8npdum4lsIOOhl8BD9JYr2nDBNn8SoDhXSybFhtZwdRyBgMZbowZLFBleE6+TWac9ppBY/fUD9guthVubRsr5hOC1ZSFgUOJoCaO2oT5hZHX4yf3YjHDAsdh16ui6wgqG745jP90RW2Dpyisvbpa8wjk7LEFBIhjZ0H2kTxnWIov7cyQOf+onDEp1db9X28ROtkLKUSVRLFQI75RJP1c0gnjU7RhAoni7P5MzklaFKy7wb779kM9WCS0viUjOgl8KNI+iok8Epx0qrrAzhVpB6RZZdcHbaUQluJnPM7GixQX0pxQUxm4pooFG4D4DjQbNdfJldW0UgmF74YClgGckVa8zkg6FHBfDKjgVQn67YTnBLj0uuz5DIEYuOIt6Pobnm0tu8a8sE8GFwWiX/EWmR2gZf6/Xsg0xcup","1; BN3PR03MB2355;\n\t6:oltFd5G27zoCHVjJJH4aBFV+w9r0k6106ni+hVsGcU/fv8hhw1JGxOUeIYSLH29Ttv5NooiFOg0O4dEBACGm02v2k3/wxrrTNUbLoK8tqyWq9KzY8w44Cd0FruO2VS9h/B6GGuPdpKX6kytKU3ZW1A09hh2pNtXz2QNjU+xD82fM9zYPCONkmRx0uJhpsknxvCDdXhElKXUNXsHJwcq85BWxg6VANfMj5/CG9RB+guMQeA+VyVzTfnk2No1tjC0N2/rAEyfhzJGtEn8BaiZm5HnDpG8xgKYwqHfDMXRfsniF6J62bZO+z+x/HYe1RaRuUo3JdYMgvXQOJ2GEjS4Xgw==;\n\t5:CRvHDsGIEo0jG3PeKpWRwWfV4VcNhFVat/Ra859FUbHoHaZ55stymEMGWM/TRESwlpRuWJue5/gD/R9ycK5NYJAAR6gsfBaXDK6HyI7I/6314y8Tpk4hWbR6Pd/H7bSJfGTBXvFcmNY4s56AFMRKKg==;\n\t24:c5Db4+fUABs9amXGRMCGOEg2zhCKYF9Zx38I+ry8iZ+OnLQ3rDvwBCBXeZI54DKI250vTfjpsvfbfIZncUPazFg9u5NbDLBfufuQDb14hX8=;\n\t7:9qr85kRpJXVY/bYEzEGrpkaRWVLj9fN2d9knn/PxmF0HwK8oAcZz1DSTr4wkgOMFiFAYB9qiC5GEChRyHBwyWx6xAAUD8vqXD/+TsG8tv3Hg0pLIdjh9nxHTZPWy/e1tN8lbOzyeYZ7zbmQvxyLk7996+FPV0BpdNPhJ35e0clOBFDALEjSAcGc2aPVb+xjnoATaIBX6xreC5axIqVhwBMvXGjl40Mm9YjqJ/zRwJ5A="],"MIME-Version":"1.0","Content-Type":"text/plain","X-MS-PublicTrafficType":"Email","X-MS-Office365-Filtering-Correlation-Id":"0045ebc9-653d-4e18-bdfd-08d4ff5c6822","X-Microsoft-Antispam":"UriScan:; BCL:0; PCL:0;\n\tRULEID:(300000500095)(300135000095)(300000501095)(300135300095)(22001)(300000502095)(300135100095)(300000503095)(300135400095)(2017052603199)(201703131430075)(201703131517081)(300000504095)(300135200095)(300000505095)(300135600095)(300000506095)(300135500095);\n\tSRVR:BN3PR03MB2355; ","X-MS-TrafficTypeDiagnostic":"BN3PR03MB2355:","X-Exchange-Antispam-Report-Test":"UriScan:(185117386973197)(275809806118684); ","X-Microsoft-Antispam-PRVS":"<BN3PR03MB23555B80EA8FA548C0587AD3E6600@BN3PR03MB2355.namprd03.prod.outlook.com>","X-Exchange-Antispam-Report-CFA-Test":"BCL:0; PCL:0;\n\tRULEID:(100000700101)(100105000095)(100000701101)(100105300095)(100000702101)(100105100095)(6095135)(2401047)(5005006)(8121501046)(3002001)(100000703101)(100105400095)(10201501046)(93006095)(93001095)(6055026)(6096035)(201703131430075)(201703131433075)(201703131441075)(201703131448075)(201703161259150)(20161123561025)(20161123563025)(20161123556025)(20161123565025)(20161123559100)(201708071742011)(100000704101)(100105200095)(100000705101)(100105500095);\n\tSRVR:BN3PR03MB2355; BCL:0; PCL:0;\n\tRULEID:(100000800101)(100110000095)(100000801101)(100110300095)(100000802101)(100110100095)(100000803101)(100110400095)(400006)(100000804101)(100110200095)(100000805101)(100110500095);\n\tSRVR:BN3PR03MB2355; ","X-Forefront-PRVS":"04359FAD81","SpamDiagnosticOutput":"1:99","SpamDiagnosticMetadata":"NSPM","X-MS-Exchange-CrossTenant-OriginalArrivalTime":"19 Sep 2017 12:46:11.3079\n\t(UTC)","X-MS-Exchange-CrossTenant-Id":"5afe0b00-7697-4969-b663-5eab37d5f47e","X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp":"TenantId=5afe0b00-7697-4969-b663-5eab37d5f47e;\n\tIp=[192.88.168.50]; Helo=[tx30smr01.am.freescale.net]","X-MS-Exchange-CrossTenant-FromEntityHeader":"HybridOnPrem","X-MS-Exchange-Transport-CrossTenantHeadersStamped":"BN3PR03MB2355","Sender":"netdev-owner@vger.kernel.org","Precedence":"bulk","List-ID":"<netdev.vger.kernel.org>","X-Mailing-List":"netdev@vger.kernel.org"},"content":"Add driver information, link details and hardware statistics to be\nreported via ethtool -S.\n\nSigned-off-by: Razvan Stefanescu <razvan.stefanescu@nxp.com>\n---\n drivers/staging/fsl-dpaa2/ethsw/Makefile        |   2 +-\n drivers/staging/fsl-dpaa2/ethsw/dpsw-cmd.h      |  13 ++\n drivers/staging/fsl-dpaa2/ethsw/dpsw.c          |  32 ++++\n drivers/staging/fsl-dpaa2/ethsw/dpsw.h          |  32 ++++\n drivers/staging/fsl-dpaa2/ethsw/ethsw-ethtool.c | 207 ++++++++++++++++++++++++\n drivers/staging/fsl-dpaa2/ethsw/ethsw.c         |   3 +\n drivers/staging/fsl-dpaa2/ethsw/ethsw.h         |   3 +\n 7 files changed, 291 insertions(+), 1 deletion(-)\n create mode 100644 drivers/staging/fsl-dpaa2/ethsw/ethsw-ethtool.c","diff":"diff --git a/drivers/staging/fsl-dpaa2/ethsw/Makefile b/drivers/staging/fsl-dpaa2/ethsw/Makefile\nindex a6d72d1..de92cd9 100644\n--- a/drivers/staging/fsl-dpaa2/ethsw/Makefile\n+++ b/drivers/staging/fsl-dpaa2/ethsw/Makefile\n@@ -4,4 +4,4 @@\n \n obj-$(CONFIG_FSL_DPAA2_ETHSW) += dpaa2-ethsw.o\n \n-dpaa2-ethsw-objs := ethsw.o dpsw.o\n+dpaa2-ethsw-objs := ethsw.o ethsw-ethtool.o dpsw.o\ndiff --git a/drivers/staging/fsl-dpaa2/ethsw/dpsw-cmd.h b/drivers/staging/fsl-dpaa2/ethsw/dpsw-cmd.h\nindex ddfd820..06b71122 100644\n--- a/drivers/staging/fsl-dpaa2/ethsw/dpsw-cmd.h\n+++ b/drivers/staging/fsl-dpaa2/ethsw/dpsw-cmd.h\n@@ -74,6 +74,8 @@\n #define DPSW_CMDID_IF_SET_FLOODING          DPSW_CMD_ID(0x047)\n #define DPSW_CMDID_IF_SET_BROADCAST         DPSW_CMD_ID(0x048)\n \n+#define DPSW_CMDID_IF_SET_LINK_CFG          DPSW_CMD_ID(0x04C)\n+\n #define DPSW_CMDID_VLAN_ADD                 DPSW_CMD_ID(0x060)\n #define DPSW_CMDID_VLAN_ADD_IF              DPSW_CMD_ID(0x061)\n #define DPSW_CMDID_VLAN_ADD_IF_UNTAGGED     DPSW_CMD_ID(0x062)\n@@ -262,6 +264,17 @@ struct dpsw_cmd_if_set_max_frame_length {\n \t__le16 frame_length;\n };\n \n+struct dpsw_cmd_if_set_link_cfg {\n+\t/* cmd word 0 */\n+\t__le16 if_id;\n+\tu8 pad[6];\n+\t/* cmd word 1 */\n+\t__le32 rate;\n+\t__le32 pad1;\n+\t/* cmd word 2 */\n+\t__le64 options;\n+};\n+\n struct dpsw_cmd_if_get_link_state {\n \t__le16 if_id;\n };\ndiff --git a/drivers/staging/fsl-dpaa2/ethsw/dpsw.c b/drivers/staging/fsl-dpaa2/ethsw/dpsw.c\nindex f36b92b..601172a 100644\n--- a/drivers/staging/fsl-dpaa2/ethsw/dpsw.c\n+++ b/drivers/staging/fsl-dpaa2/ethsw/dpsw.c\n@@ -383,6 +383,38 @@ int dpsw_get_attributes(struct fsl_mc_io *mc_io,\n }\n \n /**\n+ * dpsw_if_set_link_cfg() - Set the link configuration.\n+ * @mc_io:\tPointer to MC portal's I/O object\n+ * @cmd_flags:\tCommand flags; one or more of 'MC_CMD_FLAG_'\n+ * @token:\tToken of DPSW object\n+ * @if_id:\tInterface id\n+ * @cfg:\tLink configuration\n+ *\n+ * Return:\t'0' on Success; Error code otherwise.\n+ */\n+int dpsw_if_set_link_cfg(struct fsl_mc_io *mc_io,\n+\t\t\t u32 cmd_flags,\n+\t\t\t u16 token,\n+\t\t\t u16 if_id,\n+\t\t\t struct dpsw_link_cfg *cfg)\n+{\n+\tstruct mc_command cmd = { 0 };\n+\tstruct dpsw_cmd_if_set_link_cfg *cmd_params;\n+\n+\t/* prepare command */\n+\tcmd.header = mc_encode_cmd_header(DPSW_CMDID_IF_SET_LINK_CFG,\n+\t\t\t\t\t  cmd_flags,\n+\t\t\t\t\t  token);\n+\tcmd_params = (struct dpsw_cmd_if_set_link_cfg *)cmd.params;\n+\tcmd_params->if_id = cpu_to_le16(if_id);\n+\tcmd_params->rate = cpu_to_le32(cfg->rate);\n+\tcmd_params->options = cpu_to_le64(cfg->options);\n+\n+\t/* send command to mc*/\n+\treturn mc_send_command(mc_io, &cmd);\n+}\n+\n+/**\n  * dpsw_if_get_link_state - Return the link state\n  * @mc_io:\tPointer to MC portal's I/O object\n  * @cmd_flags:\tCommand flags; one or more of 'MC_CMD_FLAG_'\ndiff --git a/drivers/staging/fsl-dpaa2/ethsw/dpsw.h b/drivers/staging/fsl-dpaa2/ethsw/dpsw.h\nindex e9c2906..5feadc2 100644\n--- a/drivers/staging/fsl-dpaa2/ethsw/dpsw.h\n+++ b/drivers/staging/fsl-dpaa2/ethsw/dpsw.h\n@@ -245,6 +245,38 @@ enum dpsw_action {\n };\n \n /**\n+ * Enable auto-negotiation\n+ */\n+#define DPSW_LINK_OPT_AUTONEG\t\t0x0000000000000001ULL\n+/**\n+ * Enable half-duplex mode\n+ */\n+#define DPSW_LINK_OPT_HALF_DUPLEX\t0x0000000000000002ULL\n+/**\n+ * Enable pause frames\n+ */\n+#define DPSW_LINK_OPT_PAUSE\t\t0x0000000000000004ULL\n+/**\n+ * Enable a-symmetric pause frames\n+ */\n+#define DPSW_LINK_OPT_ASYM_PAUSE\t0x0000000000000008ULL\n+\n+/**\n+ * struct dpsw_link_cfg - Structure representing DPSW link configuration\n+ * @rate: Rate\n+ * @options: Mask of available options; use 'DPSW_LINK_OPT_<X>' values\n+ */\n+struct dpsw_link_cfg {\n+\tu32 rate;\n+\tu64 options;\n+};\n+\n+int dpsw_if_set_link_cfg(struct fsl_mc_io *mc_io,\n+\t\t\t u32 cmd_flags,\n+\t\t\t u16 token,\n+\t\t\t u16 if_id,\n+\t\t\t struct dpsw_link_cfg *cfg);\n+/**\n  * struct dpsw_link_state - Structure representing DPSW link state\n  * @rate: Rate\n  * @options: Mask of available options; use 'DPSW_LINK_OPT_<X>' values\ndiff --git a/drivers/staging/fsl-dpaa2/ethsw/ethsw-ethtool.c b/drivers/staging/fsl-dpaa2/ethsw/ethsw-ethtool.c\nnew file mode 100644\nindex 0000000..dcd49d2\n--- /dev/null\n+++ b/drivers/staging/fsl-dpaa2/ethsw/ethsw-ethtool.c\n@@ -0,0 +1,207 @@\n+/* Copyright 2014-2016 Freescale Semiconductor Inc.\n+ * Copyright 2017 NXP\n+ *\n+ * Redistribution and use in source and binary forms, with or without\n+ * modification, are permitted provided that the following conditions are met:\n+ *     * Redistributions of source code must retain the above copyright\n+ *\t notice, this list of conditions and the following disclaimer.\n+ *     * Redistributions in binary form must reproduce the above copyright\n+ *\t notice, this list of conditions and the following disclaimer in the\n+ *\t documentation and/or other materials provided with the distribution.\n+ *     * Neither the name of the above-listed copyright holders nor the\n+ *\t names of any contributors may be used to endorse or promote products\n+ *\t derived from this software without specific prior written permission.\n+ *\n+ *\n+ * ALTERNATIVELY, this software may be distributed under the terms of the\n+ * GNU General Public License (\"GPL\") as published by the Free Software\n+ * Foundation, either version 2 of that License or (at your option) any\n+ * later version.\n+ *\n+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE\n+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\n+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\n+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n+ * POSSIBILITY OF SUCH DAMAGE.\n+ */\n+\n+#include \"ethsw.h\"\n+\n+static struct {\n+\tenum dpsw_counter id;\n+\tchar name[ETH_GSTRING_LEN];\n+} ethsw_ethtool_counters[] =  {\n+\t{DPSW_CNT_ING_FRAME,\t\t\"rx frames\"},\n+\t{DPSW_CNT_ING_BYTE,\t\t\"rx bytes\"},\n+\t{DPSW_CNT_ING_FLTR_FRAME,\t\"rx filtered frames\"},\n+\t{DPSW_CNT_ING_FRAME_DISCARD,\t\"rx discarded frames\"},\n+\t{DPSW_CNT_ING_BCAST_FRAME,\t\"rx b-cast frames\"},\n+\t{DPSW_CNT_ING_BCAST_BYTES,\t\"rx b-cast bytes\"},\n+\t{DPSW_CNT_ING_MCAST_FRAME,\t\"rx m-cast frames\"},\n+\t{DPSW_CNT_ING_MCAST_BYTE,\t\"rx m-cast bytes\"},\n+\t{DPSW_CNT_EGR_FRAME,\t\t\"tx frames\"},\n+\t{DPSW_CNT_EGR_BYTE,\t\t\"tx bytes\"},\n+\t{DPSW_CNT_EGR_FRAME_DISCARD,\t\"tx discarded frames\"},\n+\n+};\n+\n+#define ETHSW_NUM_COUNTERS\tARRAY_SIZE(ethsw_ethtool_counters)\n+\n+static void ethsw_get_drvinfo(struct net_device *netdev,\n+\t\t\t      struct ethtool_drvinfo *drvinfo)\n+{\n+\tstruct ethsw_port_priv *port_priv = netdev_priv(netdev);\n+\tu16 version_major, version_minor;\n+\tint err;\n+\n+\tstrlcpy(drvinfo->driver, KBUILD_MODNAME, sizeof(drvinfo->driver));\n+\tstrlcpy(drvinfo->version, ethsw_drv_version, sizeof(drvinfo->version));\n+\n+\terr = dpsw_get_api_version(port_priv->ethsw_data->mc_io, 0,\n+\t\t\t\t   &version_major,\n+\t\t\t\t   &version_minor);\n+\tif (err)\n+\t\tstrlcpy(drvinfo->fw_version, \"N/A\",\n+\t\t\tsizeof(drvinfo->fw_version));\n+\telse\n+\t\tsnprintf(drvinfo->fw_version, sizeof(drvinfo->fw_version),\n+\t\t\t \"%u.%u\", version_major, version_minor);\n+\n+\tstrlcpy(drvinfo->bus_info, dev_name(netdev->dev.parent->parent),\n+\t\tsizeof(drvinfo->bus_info));\n+}\n+\n+static int\n+ethsw_get_link_ksettings(struct net_device *netdev,\n+\t\t\t struct ethtool_link_ksettings *link_ksettings)\n+{\n+\tstruct ethsw_port_priv *port_priv = netdev_priv(netdev);\n+\tstruct dpsw_link_state state = {0};\n+\tint err = 0;\n+\n+\terr = dpsw_if_get_link_state(port_priv->ethsw_data->mc_io, 0,\n+\t\t\t\t     port_priv->ethsw_data->dpsw_handle,\n+\t\t\t\t     port_priv->idx,\n+\t\t\t\t     &state);\n+\tif (err) {\n+\t\tnetdev_err(netdev, \"ERROR %d getting link state\", err);\n+\t\tgoto out;\n+\t}\n+\n+\t/* At the moment, we have no way of interrogating the DPMAC\n+\t * from the DPSW side or there may not exist a DPMAC at all.\n+\t * Report only autoneg state, duplexity and speed.\n+\t */\n+\tif (state.options & DPSW_LINK_OPT_AUTONEG)\n+\t\tlink_ksettings->base.autoneg = AUTONEG_ENABLE;\n+\tif (!(state.options & DPSW_LINK_OPT_HALF_DUPLEX))\n+\t\tlink_ksettings->base.duplex = DUPLEX_FULL;\n+\tlink_ksettings->base.speed = state.rate;\n+\n+out:\n+\treturn err;\n+}\n+\n+static int\n+ethsw_set_link_ksettings(struct net_device *netdev,\n+\t\t\t const struct ethtool_link_ksettings *link_ksettings)\n+{\n+\tstruct ethsw_port_priv *port_priv = netdev_priv(netdev);\n+\tstruct dpsw_link_cfg cfg = {0};\n+\tint err = 0;\n+\n+\tnetdev_dbg(netdev, \"Setting link parameters...\");\n+\n+\t/* Due to a temporary MC limitation, the DPSW port must be down\n+\t * in order to be able to change link settings. Taking steps to let\n+\t * the user know that.\n+\t */\n+\tif (netif_running(netdev)) {\n+\t\tnetdev_info(netdev, \"Sorry, interface must be brought down first.\\n\");\n+\t\treturn -EACCES;\n+\t}\n+\n+\tcfg.rate = link_ksettings->base.speed;\n+\tif (link_ksettings->base.autoneg == AUTONEG_ENABLE)\n+\t\tcfg.options |= DPSW_LINK_OPT_AUTONEG;\n+\telse\n+\t\tcfg.options &= ~DPSW_LINK_OPT_AUTONEG;\n+\tif (link_ksettings->base.duplex  == DUPLEX_HALF)\n+\t\tcfg.options |= DPSW_LINK_OPT_HALF_DUPLEX;\n+\telse\n+\t\tcfg.options &= ~DPSW_LINK_OPT_HALF_DUPLEX;\n+\n+\terr = dpsw_if_set_link_cfg(port_priv->ethsw_data->mc_io, 0,\n+\t\t\t\t   port_priv->ethsw_data->dpsw_handle,\n+\t\t\t\t   port_priv->idx,\n+\t\t\t\t   &cfg);\n+\tif (err)\n+\t\t/* ethtool will be loud enough if we return an error; no point\n+\t\t * in putting our own error message on the console by default\n+\t\t */\n+\t\tnetdev_dbg(netdev, \"ERROR %d setting link cfg\", err);\n+\n+\treturn err;\n+}\n+\n+static int ethsw_ethtool_get_sset_count(struct net_device *dev, int sset)\n+{\n+\tswitch (sset) {\n+\tcase ETH_SS_STATS:\n+\t\treturn ETHSW_NUM_COUNTERS;\n+\tdefault:\n+\t\treturn -EOPNOTSUPP;\n+\t}\n+}\n+\n+static void ethsw_ethtool_get_strings(struct net_device *netdev,\n+\t\t\t\t      u32 stringset, u8 *data)\n+{\n+\tint i;\n+\n+\tswitch (stringset) {\n+\tcase ETH_SS_STATS:\n+\t\tfor (i = 0; i < ETHSW_NUM_COUNTERS; i++)\n+\t\t\tmemcpy(data + i * ETH_GSTRING_LEN,\n+\t\t\t       ethsw_ethtool_counters[i].name, ETH_GSTRING_LEN);\n+\t\tbreak;\n+\t}\n+}\n+\n+static void ethsw_ethtool_get_stats(struct net_device *netdev,\n+\t\t\t\t    struct ethtool_stats *stats,\n+\t\t\t\t    u64 *data)\n+{\n+\tstruct ethsw_port_priv *port_priv = netdev_priv(netdev);\n+\tint i, err;\n+\n+\tmemset(data, 0,\n+\t       sizeof(u64) * ETHSW_NUM_COUNTERS);\n+\n+\tfor (i = 0; i < ETHSW_NUM_COUNTERS; i++) {\n+\t\terr = dpsw_if_get_counter(port_priv->ethsw_data->mc_io, 0,\n+\t\t\t\t\t  port_priv->ethsw_data->dpsw_handle,\n+\t\t\t\t\t  port_priv->idx,\n+\t\t\t\t\t  ethsw_ethtool_counters[i].id,\n+\t\t\t\t\t  &data[i]);\n+\t\tif (err)\n+\t\t\tnetdev_err(netdev, \"dpsw_if_get_counter[%s] err %d\\n\",\n+\t\t\t\t   ethsw_ethtool_counters[i].name, err);\n+\t}\n+}\n+\n+const struct ethtool_ops ethsw_port_ethtool_ops = {\n+\t.get_drvinfo\t\t= ethsw_get_drvinfo,\n+\t.get_link\t\t= ethtool_op_get_link,\n+\t.get_link_ksettings\t= ethsw_get_link_ksettings,\n+\t.set_link_ksettings\t= ethsw_set_link_ksettings,\n+\t.get_strings\t\t= ethsw_ethtool_get_strings,\n+\t.get_ethtool_stats\t= ethsw_ethtool_get_stats,\n+\t.get_sset_count\t\t= ethsw_ethtool_get_sset_count,\n+};\ndiff --git a/drivers/staging/fsl-dpaa2/ethsw/ethsw.c b/drivers/staging/fsl-dpaa2/ethsw/ethsw.c\nindex ae86078..12bf88a 100644\n--- a/drivers/staging/fsl-dpaa2/ethsw/ethsw.c\n+++ b/drivers/staging/fsl-dpaa2/ethsw/ethsw.c\n@@ -44,6 +44,8 @@\n \n static struct workqueue_struct *ethsw_owq;\n \n+const char ethsw_drv_version[] = \"0.1\";\n+\n /* Minimal supported DPSW version */\n #define DPSW_MIN_VER_MAJOR\t\t8\n #define DPSW_MIN_VER_MINOR\t\t0\n@@ -1389,6 +1391,7 @@ static int ethsw_probe_port(struct ethsw_core *ethsw, u16 port_idx)\n \n \tSET_NETDEV_DEV(port_netdev, dev);\n \tport_netdev->netdev_ops = &ethsw_port_ops;\n+\tport_netdev->ethtool_ops = &ethsw_port_ethtool_ops;\n \tport_netdev->switchdev_ops = &ethsw_port_switchdev_ops;\n \n \t/* Set MTU limits */\ndiff --git a/drivers/staging/fsl-dpaa2/ethsw/ethsw.h b/drivers/staging/fsl-dpaa2/ethsw/ethsw.h\nindex 8c1d645..ba53cc5 100644\n--- a/drivers/staging/fsl-dpaa2/ethsw/ethsw.h\n+++ b/drivers/staging/fsl-dpaa2/ethsw/ethsw.h\n@@ -57,6 +57,9 @@\n #define ETHSW_MAX_FRAME_LENGTH\t(DPAA2_MFL - VLAN_ETH_HLEN - ETH_FCS_LEN)\n #define ETHSW_L2_MAX_FRM(mtu)\t((mtu) + VLAN_ETH_HLEN + ETH_FCS_LEN)\n \n+extern const char ethsw_drv_version[];\n+extern const struct ethtool_ops ethsw_port_ethtool_ops;\n+\n struct ethsw_core;\n \n /* Per port private data */\n","prefixes":["RESEND","3/6"]}