From patchwork Mon May 21 21:59:02 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Tom Lendacky X-Patchwork-Id: 917889 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="p8958XVv"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 40qXjz4lnkz9s16 for ; Tue, 22 May 2018 07:59:19 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1754639AbeEUV7R (ORCPT ); Mon, 21 May 2018 17:59:17 -0400 Received: from mail-cys01nam02on0073.outbound.protection.outlook.com ([104.47.37.73]:55968 "EHLO NAM02-CY1-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1754075AbeEUV7L (ORCPT ); Mon, 21 May 2018 17:59:11 -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=p8958XVvGDBlyPZt9/k27BndOoUCO1El3l/ZVOYk6cSkIdycxCYh6Ghu47S0e/6EfppokwKkPla2VvEGz7Tt54scPjwk2idobXNOfsCqkmRjM5ZcPwlVhNiFpBS2/nyUMyJtZ4aWZ4mdn9JPkxlAY3C/CROJQoA9uU+ZdVY3Aio= Received: from tlendack-t1.amdoffice.net (165.204.77.1) by DM2PR12MB0170.namprd12.prod.outlook.com (2a01:111:e400:50ce::21) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P256) id 15.20.776.16; Mon, 21 May 2018 21:59:05 +0000 From: Tom Lendacky Subject: [PATCH net-next 05/12] amd-xgbe: Add ethtool support to retrieve SFP module info To: netdev@vger.kernel.org Cc: David Miller Date: Mon, 21 May 2018 16:59:02 -0500 Message-ID: <20180521215902.8135.25029.stgit@tlendack-t1.amdoffice.net> In-Reply-To: <20180521215818.8135.83100.stgit@tlendack-t1.amdoffice.net> References: <20180521215818.8135.83100.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: SN4PR0201CA0020.namprd02.prod.outlook.com (2603:10b6:803:2b::30) To DM2PR12MB0170.namprd12.prod.outlook.com (2a01:111:e400:50ce::21) 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:DM2PR12MB0170; X-Microsoft-Exchange-Diagnostics: 1; DM2PR12MB0170; 3:YhiMSR2dA9kRfVyB7xflMILi71W5II8ZaoLPkbl2FqWUkB2f0AcSymW70HUUEam20eDTmSvLdO7l3ZREf/oKyXmSCsh0BqqJeIZs1wLzfnHvRp02hcffn+c1pRood8iSjJy8gjdpvJwg0YPvnnqVkKeGSLJChU46kJFOXI/J9BgTG2oJzU13+ZT+C18PxcwQd/tyNwUiWc6mzLOTLl25RESA0o9ga4CQWGVhhVMMWI8otPJe4rtmLgUY3xUb6XA1; 25:pZiPuCsCKzv4RnFVYG4cJpCB2QE2IbSA6DNwuxVen1/BP5X85AoJRTmh5xItZLlaI6j7Fd7eXTWAgbREYpNuIlrb5R9UXatZ//JLdXDrvv4nFTYVSLe+A15r7r/B7U2WGygsHLV95eOkLG9Vi9BBm8cVEjuZXlNttvyLNa0q6oXufVr7J5DGC3MDVyqorbvm0loLBWxEtYA2mJP9nGjMi6dCdwfEGYp1TanfwQRxluh3o8WdXwqtM2JD/D19ZEjCfq1EPdaBhU4VTRbmqHb+NDDdX4yHkCxELBvGOrJBagLzDcB06jXynfmbhwpzQKUNrhiqs1WPpfo0dsBV+MCAhg==; 31:dp8dZyp2x4ItWeDMyL4d/BaBjZzxlZYVQGvqp5Pc0vfvEzDcnRw9FP4P/gYERuTwmvBrtlPJOaxzVjYBgEsk3x1pVt6+oYXG7EVL+FRXKfMCI8H22LmKSk2FIuqoxKOlyQdsb4ANEktTZSsURbP0ZgC54tgUAnrupjhsVkXEWgwYE+xYkod5Vd+jFml1/L1xXNs239AV0lEwxT3QpUFnvyaAfpLS59gKxXlX6p8dMic= X-MS-TrafficTypeDiagnostic: DM2PR12MB0170: Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=Thomas.Lendacky@amd.com; X-Microsoft-Exchange-Diagnostics: 1; DM2PR12MB0170; 20:39HjA5kgC7nnLUshv3HEVQVaeFGZPkUf5sJhVLT0wgMKWTBmFFWz2HwUgZ7FQ2eOgTQfRndGQ81I8gImHRxrETNdbpcU24EBLL54GB2kW3tSh+f0NHUcIHe1OQUl6xElIbxwWSCuvO8w8yz3a4abfSMNMfiwNB0CtQ1XOIEcPOyAZ/rjR0jy1bwZHURx9WHf8+1p28YKndN9yGVHb/0crpSHixBt4gk6RHFdcFDnR9v1DeytKv1/KYjty6aXg6lXbTbNDcNA8dAGli7k56icD+l1NI/oNrTnL9u5IQ7BEhLz6sjCZyrNkeqNfgiZKlUruNc8ayihpxmia0uN/LPX6SBeqrWiTRdk9xJaI5pc8pZ2B2JkF4WAgQE05DDRKhLRGPsjWekB5iIdRdNRfoGSqYXcgqMvqnK9PZezdoA/7XMmYKXdln78apB9TkmN7cYgmg44QzNeNWiPYG9/93hzHk9DIsnFvRxD12zz2PwwMl1TzApit8jwiKaQGQLwro2V; 4:l4FkuLy8IWMDLkmvFWQCTxgs7OfyeYZTldqBORuwloelKw+jrsigwSrsX9ei+6Lkiv26jUeogmYu0fwa94IjAKxWz+6C9WKDuB/Yh+q7/ylJ9jzoahKH/9cS8q6tJ3kbzB+oe30IAYRX3GZdOOzQzbQttesZRwW6nubqDPgoiQ+TaaHiHLyhF2aF710f60TZNdnAgfb2vfmL2sXXhVFqIYfHez9Ef+hG9lbOstdaYqwnZNF5PUn5RpI4B0+xZYkX7Keu8kz1O6ZUbGNMlz/Xca4e95xPVXIKV1HhGrJHQvfThqRpRbqFcM59BX5i35CI 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)(5005006)(8121501046)(3002001)(10201501046)(93006095)(93001095)(3231254)(944501410)(52105095)(6055026)(149027)(150027)(6041310)(20161123560045)(20161123558120)(20161123562045)(201703131423095)(201702281528075)(20161123555045)(201703061421075)(201703061406153)(20161123564045)(6072148)(201708071742011)(7699016); SRVR:DM2PR12MB0170; BCL:0; PCL:0; RULEID:; SRVR:DM2PR12MB0170; X-Forefront-PRVS: 06793E740F X-Forefront-Antispam-Report: SFV:NSPM; SFS:(10009020)(396003)(39380400002)(39860400002)(346002)(376002)(366004)(199004)(189003)(486006)(81156014)(55016002)(26005)(1076002)(5660300001)(186003)(16526019)(53416004)(66066001)(7696005)(23676004)(47776003)(2486003)(81166006)(8676002)(52116002)(2906002)(386003)(6506007)(59450400001)(76176011)(97736004)(4326008)(476003)(50466002)(6916009)(6666003)(2361001)(2351001)(956004)(69596002)(105586002)(97746001)(106356001)(58126008)(72206003)(478600001)(575784001)(9686003)(86362001)(53936002)(8936002)(446003)(7736002)(6116002)(103116003)(3846002)(25786009)(68736007)(316002)(11346002)(305945005)(230700001); DIR:OUT; SFP:1101; SCL:1; SRVR:DM2PR12MB0170; H:tlendack-t1.amdoffice.net; FPR:; SPF:None; LANG:en; PTR:InfoNoRecords; A:1; MX:1; Received-SPF: None (protection.outlook.com: amd.com does not designate permitted sender hosts) X-Microsoft-Exchange-Diagnostics: =?utf-8?q?1=3BDM2PR12MB0170=3B23=3A14Pl?= =?utf-8?q?F8uSWTEiFnQ0Bl7JXh5cs7DR+O2viwE8Kdkup0Vnk3r1I9+68e8/IagV?= =?utf-8?q?MgOzQKtRQJ0RCm+S8wjriHBNhcysql2U5cfOWJ4SEg3FmtDV4/R53Hxr?= =?utf-8?q?c05P9AEoji2v67nZXEUzcVh3qyyPKbqkfpL9zfX/TikCH9PxbSNLvaoE?= =?utf-8?q?6NcljvK1l9tUgnIDeblMjJmYw3H3NvMxsjAl7TqLuKJNECFfF8xOYMlb?= =?utf-8?q?Iec7JbW52rHHecCUVhMk97ynEtN69KU9ZFb3CtH2/XIEfCILRd4g3jvJ?= =?utf-8?q?40fHEi1bmTOzBufIL1jZMz48Vn2nY5b2iVdY9WysvYFsA+TE6T37pz56?= =?utf-8?q?pVB/XSfo2lwEgKPmtBKX1AmsA0x0uGMHbFA0TRilB8S9U5EdQcETizjb?= =?utf-8?q?7R3+9QtF6hbCkKb3dT/Ov4M+r9AG1uK47FRSWqVT39Nqk0TvcgYg6Brq?= =?utf-8?q?Zbd/9bUA0f1k6KP064inWwe8JUUA3C664rWaN15gH1QSryY7Z6Owcv0u?= =?utf-8?q?HtwGmAWcfNZPNhMWhAis3B6+9k/sEzPjc6Aml3IMVLReTfqCp4uy3OhY?= =?utf-8?q?mXL+SccFztVlDZzVzG3vzzxMz6t+xosDoQzkPfXbcA8cztrjzxHPSKzO?= =?utf-8?q?KCs5ap33v966eZLkFBsww6EVpZ3WYTf/IMhU/tCqefQC8iOsMNKFbXuH?= =?utf-8?q?/UTpkDFlzq0GrMD1IMc4PrjSLPtpATUQt6QtVQMhdqAk5ZGMHlHFGCR2?= =?utf-8?q?VXDZAxdz4VPuQRb0w0bVx/JasAjNDM3O84AA0z9xpXpkWs8sN3qfWu/i?= =?utf-8?q?uwHDGwpaFHJ3UrGvLtmZy1alC06y0tDzdV/Rp40noc4w2wGRH8Oqec0X?= =?utf-8?q?lV9re69fe2MFoJiywJzCBslIdCEj+C+hBm9G5wWSwERhFHIaDb+bd5P7?= =?utf-8?q?hKZQGbLY22qNgNi63JICLTi5INkj5nHOHOywypID2k+FQy34Uzl9iqHl?= =?utf-8?q?orQVR5QoHtx8R72qtal9VGPMlJu6U8njfRUHUqICS/v2PvFS2oqv+fVY?= =?utf-8?q?1C5sA1IBHxxlK0T+kaA/Ac040M5ELAOvfJtVdMUV7d69yXEDXOKY3n5e?= =?utf-8?q?V65CSq1Vn54o9B7iHzJnGPtn59wRIHl80eifgJH5ufJeR/XlxKMUWXMC?= =?utf-8?q?/8jnEuB7uatoGFQEJDT9WKIMiMyELx+fldIBsFJVPM9R4PwLirdVLknq?= =?utf-8?q?AyPibuRHTVKenRVuL7Rv4poXHwzbSCuehCLYZ3Ebg8Bk41fOKU6K/c7T?= =?utf-8?q?KHGcIzJYBDQ2PFlZhTdMZVwiiBVXr2R/gTs5k0LZHNtf42CUgeR7UD2u?= =?utf-8?q?Zy6qUzYSvBxe9r5ZBtYMzqdywp6aDGEkbtMxV4YZR0tKIOhmlIhXmuEl?= =?utf-8?q?BqLWztzyKZGtJDIB7oiMzCWxFlnO69PsEOE8d90=3D?= X-Microsoft-Antispam-Message-Info: CRxezn99iDKwYlfju0WAehwkAds/GdsgFF8P3mHoSZt9DzO6KWZo4h6g5L0StvM2qNuSBC7rNwF1yaGHaPhPK/nmBN4UcuD0Sya9/fnBfY3BYKs7oeUbXwpdHY0dPtQOl5LkbVFCfRqeweuzHbWALT77aEMgFaElxt4WlZ51VsQxKwwM5xagyaKDHf1ZJIi5 X-Microsoft-Exchange-Diagnostics: 1; DM2PR12MB0170; 6:lrktO0gUa+4pFjkCv2apfSL+hsr/OVJPgNdiqzHFNdTMGGVmnwDT+6We8RmmBpCnkitxEvk5BP3B0q4vjHHwON8t73h7a6Bw2aY0fm6PER+WqU/TYxGv42KFm/khDa+I+RhPkXnxeslVAGAvTUyBQF4LrnSz3yJ+FTZogYcuIgeAojSoOFgw6i5SBagtz9eIvQw7okWLg5uio+Q3tNSQJAfQyXofMSnuAzE+x1Wn5GXf+kF8NC60lIvJcNDUK0y+31t6snoD6/ymxdTqOXQyzpYrU28LeTwl2jLJKmSbvDyLVfJgolIBkZG2kQV6FOtUktdtBUMzqJ/pZKJzNNeBE5IaNEQW/wBYbYZx0WvMcrqknlHNHdQNBUWB8P67xmSz9ZT4TsuOOMcz7UTCj8gDZk7BbhAbOARjnNDusL/97Qmcp4bw/l6XZrynzjohCpEU/uFE0ZxhCUJlvKrC/YfqeQ==; 5:ZiSg7eoYVAr1EY6bOvxn2AWsR8Jz84yi5v02jfa6MdtvM4OfbH8CH9PhvrNJtOBwhMsquUuy5saI6ZxotvMFIONZeY82jeLscCPuVyKUhTtLtvPAfTWy0WAQGkZc71TNctwXQChnYYQwwT273mvrJovE0BO6aiWllg08AFMtrO8=; 24:Yo2zAk/js0gDEB5N76dtt1/hd8Shx5EtdXyMNYYerRK0ucM9A62JtifrkxZbnOrlR8vTWDYOqc7rwwvub1ZkGgJyky9a/IHGpzBm4/Ewk+8= SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1; DM2PR12MB0170; 7:YO7bo5Vw9sgv3BtCRyPJxa7IiX6Crhm0o2zL2txbZCkYOVN5uCouQwdXdaCYelKLRqaa1K2IUb53BSDVmbNB5OBNZWQrOwjiSDxxFZ5ejVeT66t8TiWWgG+pFhKeTkQBnXbpWlK2LVVuPLkbNoQJ08GsLekeGBfWo6j8EpsBTaO+ceMh+k1D+AjcFpTqJy/FTno0eJumHcB6ASDN6GrnROg0jGRGOcG6FPl+oXT++GAdaVAD6lAmcliry7IH4Mlu; 20:uDNcKBD6PznZzVM8Gh5WBr0wcYh0ruY7+lrWQqa4j314rOijRQ5l/jQlfD40fkyEkOgjIIeqo0xISugQFTVG9jcyoWw933MWQwDkxuqL+YczawS5KTK9TMZrPtlV2bJpIbxbwVjBsvw4WxNXDsyLIY+UJFHKjcVVj4W7dMOVFzo+tn/3M8WLcdeiWyxfwK0inF6IVR1CPE3Yvg39ars587waYVMC8s5crhSo5BfzE2FG9mlVeviyTq+SXF/Zc/rk X-MS-Office365-Filtering-Correlation-Id: 894e9a3d-8255-42d9-cc7b-08d5bf66128c X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 21 May 2018 21:59:05.9236 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 894e9a3d-8255-42d9-cc7b-08d5bf66128c X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 3dd8961f-e488-4e60-8e11-a82d994e183d X-MS-Exchange-Transport-CrossTenantHeadersStamped: DM2PR12MB0170 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; };