From patchwork Wed May 23 16:38:46 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Tom Lendacky X-Patchwork-Id: 919183 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming-netdev@ozlabs.org Delivered-To: patchwork-incoming-netdev@ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=netdev-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=none (p=none dis=none) header.from=amd.com Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=amdcloud.onmicrosoft.com header.i=@amdcloud.onmicrosoft.com header.b="FTj8Jhgp"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 40rdWl24KGz9s0q for ; Thu, 24 May 2018 02:39:15 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S933700AbeEWQjM (ORCPT ); Wed, 23 May 2018 12:39:12 -0400 Received: from mail-bl2nam02on0066.outbound.protection.outlook.com ([104.47.38.66]:13280 "EHLO NAM02-BL2-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S933572AbeEWQix (ORCPT ); Wed, 23 May 2018 12:38:53 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=amdcloud.onmicrosoft.com; s=selector1-amd-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=wvMaGSpyvPTeShhws+zhNio2x6mUT+LIiyZxcPXDPYI=; b=FTj8JhgpgMIRVHcesWLsD3T4J4+6VDkdUDXymgIPpmy5eg/WlJPNYJjz+FHmuIc7HaLDJrGgh+TyyCUddBC6ih71kJyNWTuGPeY3uQlPPFna31sDmg3LK/tDTNooked6eUiOZ2yXSqtQQwl2dtUn5yo2tmURl/03zKYLTtFlPII= Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=Thomas.Lendacky@amd.com; Received: from tlendack-t1.amdoffice.net (165.204.77.1) by CY1PR12MB0168.namprd12.prod.outlook.com (2a01:111:e400:50f6::26) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P256) id 15.20.776.11; Wed, 23 May 2018 16:38:50 +0000 From: Tom Lendacky Subject: [PATCH net-next v2 05/12] amd-xgbe: Add ethtool support to retrieve SFP module info To: netdev@vger.kernel.org Cc: David Miller Date: Wed, 23 May 2018 11:38:46 -0500 Message-ID: <20180523163846.31625.54980.stgit@tlendack-t1.amdoffice.net> In-Reply-To: <20180523163802.31625.76572.stgit@tlendack-t1.amdoffice.net> References: <20180523163802.31625.76572.stgit@tlendack-t1.amdoffice.net> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 X-Originating-IP: [165.204.77.1] X-ClientProxiedBy: SN4PR0801CA0001.namprd08.prod.outlook.com (2603:10b6:803:29::11) To CY1PR12MB0168.namprd12.prod.outlook.com (2a01:111:e400:50f6::26) X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-HT: Tenant X-Microsoft-Antispam: UriScan:; BCL:0; PCL:0; RULEID:(7020095)(4652020)(5600026)(48565401081)(4534165)(4627221)(201703031133081)(201702281549075)(2017052603328)(7153060)(7193020); SRVR:CY1PR12MB0168; X-Microsoft-Exchange-Diagnostics: 1; CY1PR12MB0168; 3:sU4NW+HjESEh0aVjJvvImZtHIiCMzf6WN+Ev5+reio0f8f+8gunVFlfov0BJKrHyFOV73RkBdkR4ry4FSw+YNHanl5H6NmOcyP3lVtTZGeLuNWaKT88Orfnajr+aosdSFJS0FwE/ha3WLxe1VWmbik/MinKDOVwd1Df4iDJxBlc/9bWTrh7rNNji53kaSCr3AN4uOcXSzDbJpS7cWMxOhKr7Gs5tMUHbMPi6o6ucduD/aUJys04iXIwnrLQGfcIp; 25:KJ/lvpUv7YNgeKudJHiDqqYBak7CEa1XywTSgDo60WsqCvnUPWJP0gxPen1uwISX69M32Jo41eW0DxNpyjDB739BQA8RG8dtETOE9emuBSWinKyUDpRkrQSp54V14hONa/7qc2n5dOzv8Uu6C/AKoLqMEg2QSrSW+T/OuNGI5Nc44XrkTdny5hkt4LuSI3xSYJewhYEas/SWvUK9I/p3DexlR84R77Z7aBhMCIgnvdmkbgHoImoM6meT/QVp1bw6BhJybIoMYSXu0nl/MomjGaojrkO1ehrse7YBcTAK89kmQ6DafVOIujH8K0+rCXWxpr7MkDfuBHIGHyD+BCv4bw==; 31:Hw4gwz04VAS7sEQNn+rZG29Wfj++gN+Eou4XtGed2jzrYzVflFzRQxWllQyLKJ56AoFcZ94xX+Mr/hdVfrmxQcsAhSjXQPFbVMcUmE9BTfABcCWCuUX6KTzlNdj+qt/qnG0dYYHfwb9vli29wBm7CipWGtnfdEK0j3Qm/UCk6PPG8N0bBsrN4ANyIluHry4J1Y2baQ2ojwsLEtGmKSY38Sx01garO1advdo8eCVE9Ss= X-MS-TrafficTypeDiagnostic: CY1PR12MB0168: X-Microsoft-Exchange-Diagnostics: 1; CY1PR12MB0168; 20:2MYOm/qpudyo2CDb/xSVt2mkmfMJd3s2RMCljbq/5lfXZpjY75r0P484Kx/SvFlq46dMTtwJCnzdVwQFMYyWFd5QIURAr6GpH2gUirJ4mQGygNnWG/1TA9/9fmCGKX496V9R8ig4K86bSmCCbyWzbPXClpbSZr3oY41xTIRf6Qr4jcTuvvsCLND2hKu0wGwA4sO+uirPQnNYBt0D6bM6CZovOTKNGbqRpjYHLlCyffK/yggUTwmEvrj0G9Y2HdQW4cm08QD2X4S2YN4IzHMrnTlX+Oe863euHVzWcDIAK0V8jaZRdq6oiElrPb2mIOd3XIfnRpwortHzXVzNBRKcrNv68WpksI4NZ2C9MsY6MYA5dH6gvb61ycqYYiJ2ueXRL3gFpGOqpr1QkDEmbVE+mP1BKeirM6+Rl4zHSeLv+A75yFHco0ItPPsLIV/fK2M51BhCRE3HsD+8IMGVcxQKO2ZsJ8mphGtoKzAnCf+T2nu47uubEpTJfkZLhf+d3Z5n; 4:l+KxUPgKW7QfGb472tAg1lvFX1osdW0myp75KBLwQ9Uq21zDbK8PyrumVMai1PCYJtxeeUldRo2TDOWQgICtZA8XvDN70fXqD8einqo+LD0gOl5C+UemK0jX1uV+VJNo4x+Nl900lRb9BfnI+m7T0Qo9AxYVRPAveKv4UUgMXrYmkuJ+v6XPztHy+kJGqyoCRrj4ZgCGFvCbaIpM9HSh6KoDPpQ8U79adJSSj/5gRWW3X2/aJJd+s4NU+1mpRj9v2U8AVcoTYEBmMgaBAgEbvZkmFK3g87D2+XKcZWEsVhV04AepeAxbiBFGBqYhMFdu X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:(767451399110); X-MS-Exchange-SenderADCheck: 1 X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(8211001083)(6040522)(2401047)(8121501046)(5005006)(3231254)(944501410)(52105095)(3002001)(93006095)(93001095)(10201501046)(6055026)(149027)(150027)(6041310)(20161123564045)(201703131423095)(201702281528075)(20161123555045)(201703061421075)(201703061406153)(20161123562045)(20161123560045)(20161123558120)(6072148)(201708071742011)(7699016); SRVR:CY1PR12MB0168; BCL:0; PCL:0; RULEID:; SRVR:CY1PR12MB0168; X-Forefront-PRVS: 06818431B9 X-Forefront-Antispam-Report: SFV:NSPM; SFS:(10009020)(346002)(376002)(396003)(39860400002)(366004)(39380400002)(189003)(199004)(446003)(72206003)(6506007)(386003)(59450400001)(106356001)(52116002)(7696005)(23676004)(6666003)(186003)(97736004)(6916009)(76176011)(16526019)(2486003)(486006)(66066001)(2906002)(575784001)(50466002)(11346002)(26005)(69596002)(476003)(105586002)(53416004)(6116002)(956004)(86362001)(47776003)(4326008)(53936002)(58126008)(2351001)(230700001)(2361001)(8676002)(3846002)(55016002)(7736002)(68736007)(5660300001)(1076002)(8936002)(478600001)(81156014)(81166006)(305945005)(103116003)(316002)(9686003)(25786009)(97746001); DIR:OUT; SFP:1101; SCL:1; SRVR:CY1PR12MB0168; H:tlendack-t1.amdoffice.net; FPR:; SPF:None; LANG:en; PTR:InfoNoRecords; MX:1; A:1; Received-SPF: None (protection.outlook.com: amd.com does not designate permitted sender hosts) X-Microsoft-Exchange-Diagnostics: =?utf-8?q?1=3BCY1PR12MB0168=3B23=3APivH?= =?utf-8?q?bSZWpawek2RpFARsLk7OfWAbAVr3g7YKS10QintR0XogtRDQvDEqZgEw?= =?utf-8?q?VMGWlhoMya1qgEOF/XtV2EtADAFNnqnIoL5Qpl/B57BtMB/fpCq6mdIv?= =?utf-8?q?sLiB1cwpzCqnvF4BeJTsVaUPV1frtx7rm6KFdrohNezep5vHt8HjxaKP?= =?utf-8?q?dW5puijr4hYneYGa33sgYU9RYTrF+AzKp2aVRIj1VYKWPQSB29xD+oPP?= =?utf-8?q?4riY1V4SIAgwM2W/q8ptDJtJNDg1dyj+v8FiPxf7/DBjCMOJUuuLdukH?= =?utf-8?q?QCe9hxrud2gu6ePQvtxUhM2XQaXsFPjTFOakAP5aACY493wwbf/0sQZu?= =?utf-8?q?8ynnruu+d1q6PKcx1ILVGthPlOWTv0RCLf/N6Z+KACb4izfaNZEW9AK1?= =?utf-8?q?RL6KVOIUyT8wqVNAvMBbKJ7COTp7VK/41DHgHsmHfsEn4r3xHtnP/115?= =?utf-8?q?GZy3bx/btSInG+EC3io1e5n16D/uOrDgF1xNo/GHHGqV1RBl9DV+OOsW?= =?utf-8?q?s2l0v2MgIRYHS4UC5HlAFbLzPK8WmvH/DJnmhVWCs53lPgX1BHStqwS/?= =?utf-8?q?sXCWP+mLT3iXQw4flaMmLgzAbvsyDEPOs7JqZV4weFfWL8bXYOfc0Mf1?= =?utf-8?q?4bLTfRGh0Qfij7z4kqc+RwVFt0jdZnE6tqo5Zdwk7U2hvzrEWDbngHBx?= =?utf-8?q?AAmKqaPDd97czLe0qdTZfjO4q4MNYylb+QqzXsCD/fSLG2BB0oDAEJgG?= =?utf-8?q?xY1Zf9FQ0y296qLl63xias9rulmYw7f1k1OzTWxarJhVjJv2IDjGstWK?= =?utf-8?q?/Iy6IqR98+OP7Oqj3nIVuzyT1/OemkQwo9up4Cv3Q/kef9kEpXDGyr+K?= =?utf-8?q?WfqXZ+bTP/R/i231GPHObw03TsKbSak2NXdtLzqzjVgc8fhbXGxlBkJk?= =?utf-8?q?TG6ry2XF9rrfNpvcBApf8zPXiB8JJNdXIVlVql/t38K6npQcIzFEoAtw?= =?utf-8?q?UFJ8ukSQS5/+ynF1o7Srgp303J7PunvcnRyKBuwh5RHHs/OeJEqg7wRc?= =?utf-8?q?9qf3chHVLy5V7kU2ICr4r9o9Wgi4jvCaYxiOTrZtutfniYX7enIzp6hH?= =?utf-8?q?QxQZoAxnDnwrpVfVQbNxF+c7LdXc++4c/RZWm2H3dgpG+o1EkUHfM0MU?= =?utf-8?q?QlfW/RDDkLqGViEz7KYxzlRI1rr9R8f934A48wWvZXls+jfanzcixA/9?= =?utf-8?q?hvgUUHBxEceBPo+Fx5d4q9gRtOmNlwhuSP/pMQYs5Q7+rPewpPdPLuxM?= =?utf-8?q?H+aeto7wsMAem8urHHNAsWFr5hyCv+tYFyhbYYIA0SIPKs9/s/6/+ljY?= =?utf-8?q?zV1OIVZoBZv/ZeERCV5wTNGmincpBM2FU0ix2WAF0XI2oAtR2n1jW7E5?= =?utf-8?q?drRKCsVuVofLHk/sO5zHy8fAJa1pEu88ZVC8tbg=3D?= X-Microsoft-Antispam-Message-Info: GvXJGu/C8B+p3EMMTuqLy0Gb7sBPNTJ6232rJgdIjnU6MG1TrCfT7QP9pC5XahGpzQ/P/aXXObQXivlTwDQOGQ9AB8MM8tSnALccYZPzVCh81eb0hp6SUxvPxNW7t7kMmL108+3ekYtyZcAnw/+rkwj0V8q8xVlKevRw+XbS4ATMEYYMwgujgtFvwMPEzMmT X-Microsoft-Exchange-Diagnostics: 1; CY1PR12MB0168; 6:IIt7sGq6TAgQNqDCh0+4H9AxUsvUzEKAQZa6l0VbSxrvIy80OZ5F33YIex4fU1UT5doe8UF2ZMbmweQq//hI/lAx5stjCUPUvEEXkhxk10v0aAestObGxT5ANEq3CXoBqiOKbetEE2O94Bd8jTwRb5OlmAVRhDEU4yA4QeqJGkXAVjhrLRSWTIOmT3WCG7bsPOIerfCM6Y1yxXKPLc5YbL8l55KLAAUB6MDfSeO+WJN8J2ygK0UIYD0AsX9mJl6LMnN9uKP92PeY42VXxmqKRypbXK/7VXwuc5VUft6r/0Co5vUlz4mrsHIEN9C91ClwuLpE2pviC37EYsxWUS8XVYNgG5wWHSUv7awnju6Ecq4plbEbiCmsLllNO/sn7YUuAmyzak33Jn+E6CoPZnE69p+o59XKqCUpU1y2XR02GwMLN6fJte49DAhlD6NMDV/ucFEftnAmDmQaaB6f/p0OzQ==; 5:IIhHKjaEgiBcGA/j2Bhd6ynExOfaIQrGNOC6m7/VRi65fv3kOZTHjKqm5SCpjBZynewm4vJqIb2PZcxBoUmxvI1EvltJg1ZpySBRXfIHrSbn1X3PuATs0exKT7DgtUL5kGxM3eAarMkpJlHVdMxYApE3yJkjo1+Vci7nQ2SSgi0=; 24:yuBFAsq+uvFhtUgQAooOxoutJotStv38IAW0R4/rmqyFxusoZ4yGkIrZCK8izut0NNo969KNYYJVumjdluH0DPw5LsuIzgnZln6gMBPW9qo= SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1; CY1PR12MB0168; 7:PYmB7tPbW+uDFznnGv4Ujy4pUOcGNI+kpmL2hVFUJ/xrnDIGpt0GXVQvXryiTv10Ti5B1jRtNhePlYYgHIMBvpJcz9g+VL7B9J8hxEkhOHQh9F5ZxE23n8kXXwEqHl+V1UX4Hl7OLE+PIO4Cq/WJofIzieKEixlhGq+V+ddyqTEOewdBdEPcWVcqO5WbTLJihoA1w3hz8F1epVd5bOvFRiJDkQRukM7aMP+gbf3JrHBkWV4djF1ZfUDjQ2ANTUXC; 20:zosfcjXaVvd0cVsbzJiKusWaJCpqhfK1KGVUzU5eDunKHzqsJxBLw/Fyal6ZpUcPtRtbDj9VS2YpkMVS1pYTSM0za/mzU9Cfi8w6YogT7SXhD6tYtae1R+3AOCNFbhaPfVq+ccYGPkAiw0uXEPNxE2qM3qrNqBQOTUbrsK/tVHftDuSG45evDJroja1RHOZs6nkyJezQtgGj3mURyxpi0iN5l0fKwMNqKRG++3ZqEZCL6xijdw8WBpviB3Dimw1H X-MS-Office365-Filtering-Correlation-Id: 5595b347-c0a3-444d-8bf0-08d5c0cbaa2c X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 23 May 2018 16:38:50.6389 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 5595b347-c0a3-444d-8bf0-08d5c0cbaa2c X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 3dd8961f-e488-4e60-8e11-a82d994e183d X-MS-Exchange-Transport-CrossTenantHeadersStamped: CY1PR12MB0168 Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org Add support to get SFP module information using ethtool. Signed-off-by: Tom Lendacky --- drivers/net/ethernet/amd/xgbe/xgbe-ethtool.c | 18 +++ drivers/net/ethernet/amd/xgbe/xgbe-mdio.c | 21 ++++ drivers/net/ethernet/amd/xgbe/xgbe-phy-v2.c | 137 ++++++++++++++++++++++++++ drivers/net/ethernet/amd/xgbe/xgbe.h | 13 ++ 4 files changed, 189 insertions(+) diff --git a/drivers/net/ethernet/amd/xgbe/xgbe-ethtool.c b/drivers/net/ethernet/amd/xgbe/xgbe-ethtool.c index ff397bb..57394b77 100644 --- a/drivers/net/ethernet/amd/xgbe/xgbe-ethtool.c +++ b/drivers/net/ethernet/amd/xgbe/xgbe-ethtool.c @@ -626,6 +626,22 @@ static int xgbe_get_ts_info(struct net_device *netdev, return 0; } +static int xgbe_get_module_info(struct net_device *netdev, + struct ethtool_modinfo *modinfo) +{ + struct xgbe_prv_data *pdata = netdev_priv(netdev); + + return pdata->phy_if.module_info(pdata, modinfo); +} + +static int xgbe_get_module_eeprom(struct net_device *netdev, + struct ethtool_eeprom *eeprom, u8 *data) +{ + struct xgbe_prv_data *pdata = netdev_priv(netdev); + + return pdata->phy_if.module_eeprom(pdata, eeprom, data); +} + static const struct ethtool_ops xgbe_ethtool_ops = { .get_drvinfo = xgbe_get_drvinfo, .get_msglevel = xgbe_get_msglevel, @@ -646,6 +662,8 @@ static int xgbe_get_ts_info(struct net_device *netdev, .get_ts_info = xgbe_get_ts_info, .get_link_ksettings = xgbe_get_link_ksettings, .set_link_ksettings = xgbe_set_link_ksettings, + .get_module_info = xgbe_get_module_info, + .get_module_eeprom = xgbe_get_module_eeprom, }; const struct ethtool_ops *xgbe_get_ethtool_ops(void) diff --git a/drivers/net/ethernet/amd/xgbe/xgbe-mdio.c b/drivers/net/ethernet/amd/xgbe/xgbe-mdio.c index 1b45cd7..9c39c72 100644 --- a/drivers/net/ethernet/amd/xgbe/xgbe-mdio.c +++ b/drivers/net/ethernet/amd/xgbe/xgbe-mdio.c @@ -126,6 +126,24 @@ #include "xgbe.h" #include "xgbe-common.h" +static int xgbe_phy_module_eeprom(struct xgbe_prv_data *pdata, + struct ethtool_eeprom *eeprom, u8 *data) +{ + if (!pdata->phy_if.phy_impl.module_eeprom) + return -ENXIO; + + return pdata->phy_if.phy_impl.module_eeprom(pdata, eeprom, data); +} + +static int xgbe_phy_module_info(struct xgbe_prv_data *pdata, + struct ethtool_modinfo *modinfo) +{ + if (!pdata->phy_if.phy_impl.module_info) + return -ENXIO; + + return pdata->phy_if.phy_impl.module_info(pdata, modinfo); +} + static void xgbe_an37_clear_interrupts(struct xgbe_prv_data *pdata) { int reg; @@ -1639,4 +1657,7 @@ void xgbe_init_function_ptrs_phy(struct xgbe_phy_if *phy_if) phy_if->phy_valid_speed = xgbe_phy_valid_speed; phy_if->an_isr = xgbe_an_combined_isr; + + phy_if->module_info = xgbe_phy_module_info; + phy_if->module_eeprom = xgbe_phy_module_eeprom; } diff --git a/drivers/net/ethernet/amd/xgbe/xgbe-phy-v2.c b/drivers/net/ethernet/amd/xgbe/xgbe-phy-v2.c index cb15caf..141bb13 100644 --- a/drivers/net/ethernet/amd/xgbe/xgbe-phy-v2.c +++ b/drivers/net/ethernet/amd/xgbe/xgbe-phy-v2.c @@ -119,6 +119,7 @@ #include #include #include +#include #include "xgbe.h" #include "xgbe-common.h" @@ -270,6 +271,15 @@ struct xgbe_sfp_eeprom { u8 vendor[32]; }; +#define XGBE_SFP_DIAGS_SUPPORTED(_x) \ + ((_x)->extd[XGBE_SFP_EXTD_SFF_8472] && \ + !((_x)->extd[XGBE_SFP_EXTD_DIAG] & XGBE_SFP_EXTD_DIAG_ADDR_CHANGE)) + +#define XGBE_SFP_EEPROM_BASE_LEN 256 +#define XGBE_SFP_EEPROM_DIAG_LEN 256 +#define XGBE_SFP_EEPROM_MAX (XGBE_SFP_EEPROM_BASE_LEN + \ + XGBE_SFP_EEPROM_DIAG_LEN) + #define XGBE_BEL_FUSE_VENDOR "BEL-FUSE " #define XGBE_BEL_FUSE_PARTNO "1GBT-SFP06 " @@ -1301,6 +1311,130 @@ static void xgbe_phy_sfp_detect(struct xgbe_prv_data *pdata) xgbe_phy_put_comm_ownership(pdata); } +static int xgbe_phy_module_eeprom(struct xgbe_prv_data *pdata, + struct ethtool_eeprom *eeprom, u8 *data) +{ + struct xgbe_phy_data *phy_data = pdata->phy_data; + u8 eeprom_addr, eeprom_data[XGBE_SFP_EEPROM_MAX]; + struct xgbe_sfp_eeprom *sfp_eeprom; + unsigned int i, j, rem; + int ret; + + rem = eeprom->len; + + if (!eeprom->len) { + ret = -EINVAL; + goto done; + } + + if ((eeprom->offset + eeprom->len) > XGBE_SFP_EEPROM_MAX) { + ret = -EINVAL; + goto done; + } + + if (phy_data->port_mode != XGBE_PORT_MODE_SFP) { + ret = -ENXIO; + goto done; + } + + if (!netif_running(pdata->netdev)) { + ret = -EIO; + goto done; + } + + if (phy_data->sfp_mod_absent) { + ret = -EIO; + goto done; + } + + ret = xgbe_phy_get_comm_ownership(pdata); + if (ret) { + ret = -EIO; + goto done; + } + + ret = xgbe_phy_sfp_get_mux(pdata); + if (ret) { + netdev_err(pdata->netdev, "I2C error setting SFP MUX\n"); + ret = -EIO; + goto put_own; + } + + /* Read the SFP serial ID eeprom */ + eeprom_addr = 0; + ret = xgbe_phy_i2c_read(pdata, XGBE_SFP_SERIAL_ID_ADDRESS, + &eeprom_addr, sizeof(eeprom_addr), + eeprom_data, XGBE_SFP_EEPROM_BASE_LEN); + if (ret) { + netdev_err(pdata->netdev, + "I2C error reading SFP EEPROM\n"); + ret = -EIO; + goto put_mux; + } + + sfp_eeprom = (struct xgbe_sfp_eeprom *)eeprom_data; + + if (XGBE_SFP_DIAGS_SUPPORTED(sfp_eeprom)) { + /* Read the SFP diagnostic eeprom */ + eeprom_addr = 0; + ret = xgbe_phy_i2c_read(pdata, XGBE_SFP_DIAG_INFO_ADDRESS, + &eeprom_addr, sizeof(eeprom_addr), + eeprom_data + XGBE_SFP_EEPROM_BASE_LEN, + XGBE_SFP_EEPROM_DIAG_LEN); + if (ret) { + netdev_err(pdata->netdev, + "I2C error reading SFP DIAGS\n"); + ret = -EIO; + goto put_mux; + } + } + + for (i = 0, j = eeprom->offset; i < eeprom->len; i++, j++) { + if ((j >= XGBE_SFP_EEPROM_BASE_LEN) && + !XGBE_SFP_DIAGS_SUPPORTED(sfp_eeprom)) + break; + + data[i] = eeprom_data[j]; + rem--; + } + +put_mux: + xgbe_phy_sfp_put_mux(pdata); + +put_own: + xgbe_phy_put_comm_ownership(pdata); + +done: + eeprom->len -= rem; + + return ret; +} + +static int xgbe_phy_module_info(struct xgbe_prv_data *pdata, + struct ethtool_modinfo *modinfo) +{ + struct xgbe_phy_data *phy_data = pdata->phy_data; + + if (phy_data->port_mode != XGBE_PORT_MODE_SFP) + return -ENXIO; + + if (!netif_running(pdata->netdev)) + return -EIO; + + if (phy_data->sfp_mod_absent) + return -EIO; + + if (XGBE_SFP_DIAGS_SUPPORTED(&phy_data->sfp_eeprom)) { + modinfo->type = ETH_MODULE_SFF_8472; + modinfo->eeprom_len = ETH_MODULE_SFF_8472_LEN; + } else { + modinfo->type = ETH_MODULE_SFF_8079; + modinfo->eeprom_len = ETH_MODULE_SFF_8079_LEN; + } + + return 0; +} + static void xgbe_phy_phydev_flowctrl(struct xgbe_prv_data *pdata) { struct ethtool_link_ksettings *lks = &pdata->phy.lks; @@ -3196,4 +3330,7 @@ void xgbe_init_function_ptrs_phy_v2(struct xgbe_phy_if *phy_if) phy_impl->kr_training_pre = xgbe_phy_kr_training_pre; phy_impl->kr_training_post = xgbe_phy_kr_training_post; + + phy_impl->module_info = xgbe_phy_module_info; + phy_impl->module_eeprom = xgbe_phy_module_eeprom; } diff --git a/drivers/net/ethernet/amd/xgbe/xgbe.h b/drivers/net/ethernet/amd/xgbe/xgbe.h index 54e43ad3..f0f455b 100644 --- a/drivers/net/ethernet/amd/xgbe/xgbe.h +++ b/drivers/net/ethernet/amd/xgbe/xgbe.h @@ -835,6 +835,7 @@ struct xgbe_hw_if { * Optional routines: * an_pre, an_post * kr_training_pre, kr_training_post + * module_info, module_eeprom */ struct xgbe_phy_impl_if { /* Perform Setup/teardown actions */ @@ -883,6 +884,12 @@ struct xgbe_phy_impl_if { /* Pre/Post KR training enablement support */ void (*kr_training_pre)(struct xgbe_prv_data *); void (*kr_training_post)(struct xgbe_prv_data *); + + /* SFP module related info */ + int (*module_info)(struct xgbe_prv_data *pdata, + struct ethtool_modinfo *modinfo); + int (*module_eeprom)(struct xgbe_prv_data *pdata, + struct ethtool_eeprom *eeprom, u8 *data); }; struct xgbe_phy_if { @@ -905,6 +912,12 @@ struct xgbe_phy_if { /* For single interrupt support */ irqreturn_t (*an_isr)(struct xgbe_prv_data *); + /* For ethtool PHY support */ + int (*module_info)(struct xgbe_prv_data *pdata, + struct ethtool_modinfo *modinfo); + int (*module_eeprom)(struct xgbe_prv_data *pdata, + struct ethtool_eeprom *eeprom, u8 *data); + /* PHY implementation specific services */ struct xgbe_phy_impl_if phy_impl; };