From patchwork Wed May 23 16:39:47 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Tom Lendacky X-Patchwork-Id: 919188 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="alHX75oB"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 40rdXn3X9Fz9s19 for ; Thu, 24 May 2018 02:40:09 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S933768AbeEWQkF (ORCPT ); Wed, 23 May 2018 12:40:05 -0400 Received: from mail-by2nam01on0056.outbound.protection.outlook.com ([104.47.34.56]:14016 "EHLO NAM01-BY2-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S933648AbeEWQjx (ORCPT ); Wed, 23 May 2018 12:39: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=J72rf28v9CitbDr9j3vZTQolgvDMttXwI7jxGeCmICQ=; b=alHX75oBnZhNSy6bLNF7S3+1MWEVHtHAN5vgjT7kC2GsPmF79lsfXD6QC8oGScFzcqQltHTGlz6Kk6i/YW6QfL6alaDsPzcerTtrcWU8atwk8LcYLNAtau5LsY99U5zod9ZvENGibKGmIaHT4rC+7mfwl10HvNyYyCPfBZ+UBTY= Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=Thomas.Lendacky@amd.com; Received: from tlendack-t1.amdoffice.net (165.204.77.1) by DM2PR12MB0169.namprd12.prod.outlook.com (2a01:111:e400:50ce::20) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P256) id 15.20.776.16; Wed, 23 May 2018 16:39:51 +0000 From: Tom Lendacky Subject: [PATCH net-next v2 12/12] amd-xgbe: Improve SFP 100Mbps auto-negotiation To: netdev@vger.kernel.org Cc: David Miller Date: Wed, 23 May 2018 11:39:47 -0500 Message-ID: <20180523163947.31625.63665.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: SN4PR0601CA0018.namprd06.prod.outlook.com (2603:10b6:803:2f::28) To DM2PR12MB0169.namprd12.prod.outlook.com (2a01:111:e400:50ce::20) X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-HT: Tenant X-Microsoft-Antispam: UriScan:; BCL:0; PCL:0; RULEID:(7020095)(4652020)(5600026)(4534165)(4627221)(201703031133081)(201702281549075)(48565401081)(2017052603328)(7153060)(7193020); SRVR:DM2PR12MB0169; X-Microsoft-Exchange-Diagnostics: 1; DM2PR12MB0169; 3:F/UgCOVvfxdcK8KzdhvmGuIxEgqzkrKmsx/8b7HYAT18iJor8vO+J1MWD52Oy8If0cBJE548B4hm9qTYsnVte7RqzAt1bvvNljGGct2lmxNo0ywuAJ+owhqUxWdHLTm0ebK9C5Jv+7G5PScIgz0rWDu3+CrfjM6e/1/OKanG03byqvqBdMkjNS4253vVk4LaK4Its+LAvZnS3N86r3tdgGDDwXYiTvAJShozXmR4jT4aKxd0kjApBQ5hURi6Sgnm; 25:/SGzxsaeXKJzvH4+0EQBb07KTZ7SfRMgNcXsNdEm6qUvQNFjYhEjFU1Vs04Ai8miYutsY+1/j1Zcki2n6olZe7BbAkYgn2GGd8QnbJVTk04PWrWTLGP2HGuTsa4TnjJEXHNxRmrfQueg0U59aUfwQfWihCJ0MULtGaFpmkVY72JSEiqYt3vmA3ELp8D8Le3DFcNcx1ueLYPukDT5RSX1nK8j0eJgwB4IoVStsojb9iwuOZDOMsUziLZKUT8ZWE/KlC7k6g1YFSFy4kgHrOUoylKSdboErnAXD2CMd6WYcoo6v3XvJAJ96nCDP5+zSSfE1IMgoiKo0wIdH8425LV9gQ==; 31:luyEQE0aob2Gxa9QsWS7HdvVLct1SZ0EQhnt0yt8sT/tAiHUHmFb4aDvzvkAWuTIph1jFPVaSnSY4r0I4z7IV8ev+8UgmjQGtUcaenKRrMtyqCpFiTUyb3/fz2bg7pm7wdqo+juMUf/b9O3fSZ6Cow9O3amG+I/Yvy6GAMLbjnaUFFwqcRk7MGx1HgEtELKKnnUVdtCO0LO+B65iipf1NpjJo8jJ/rm054pz35L3xPI= X-MS-TrafficTypeDiagnostic: DM2PR12MB0169: X-Microsoft-Exchange-Diagnostics: 1; DM2PR12MB0169; 20:tr41LaWUsRB5Sx+Vlq4UYYZfwY3fAMrqyhnXEC2yNcGPu8kwa7ze2dthrTrpH+jlIUE5RE1W64mMSCtc/A9zRKMFhaqanSE63+fg7QdHI3dkjk1sShS8zopIKYn63FqUKxhZjEUgea3rnJCGpgYY2re2wKt95EcvV2ipw5HTzH1a5BGzeHMW0mBpTjWtw9VJwZGu7nzo94SSjxtZ8hPEC9nk+aE1VCGnhNBQDM2YntQ7J/+IHPwde51yGS9P/4Eb4dLdvjNBlAbCtSBDQkbqSG1aG8YSGFP9148QKKYVa/sqT3d7rSwITQV9Q483+sV/Ukkqfah66/Una6CYUz8wet89TFQbdgSrHSW4QPIopZ7ka6YWrIJXOh65CCyEJZJuHcxbMNLRKDC/VQQOguBi60z6So+LlC5304P5WVGsm25SPw1ByPUpdCC9xLMfYdmpUX11hmWlwe3/WX8J/wDceZKCVJlRQ+Yl5v2DItmlg8SgKX44b/YpFyl7Lz+k2oV4; 4:OB6pN1YAVOxr7jPuVu/wOLt8b4/FC4hDqydNCB8FUCrgagtmcs9emSXHsJBZV/tyGswHHIkd4066Qbz+YMP91pwBGGsJKdW7DA+AhdZZ2Wi96xRhFU3MYeFJ0QNu5N1NmExm2yh39nNAQTxiv05L0pLfjNKaUhSOBIWrGRN3UlEFY9GbGUCmfLppdt57adsRjSzriMDZLx9Kn4r0wjmG3Uz0fH0AoYe0RUpWuUN+ETizxhxwC9kouRo/w+Q0Fkzy3NyE/MlsLeHpIrLtNbknCoUuLaPf8W232+sWUYlAah/OdmYbgVAvED2oh1hgR2Z0 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)(3231254)(944501410)(52105095)(93006095)(93001095)(6055026)(149027)(150027)(6041310)(20161123564045)(20161123560045)(20161123558120)(20161123562045)(201703131423095)(201702281528075)(20161123555045)(201703061421075)(201703061406153)(6072148)(201708071742011)(7699016); SRVR:DM2PR12MB0169; BCL:0; PCL:0; RULEID:; SRVR:DM2PR12MB0169; X-Forefront-PRVS: 06818431B9 X-Forefront-Antispam-Report: SFV:NSPM; SFS:(10009020)(396003)(346002)(39380400002)(366004)(376002)(39860400002)(199004)(189003)(55016002)(386003)(6116002)(86362001)(8676002)(8936002)(230700001)(23676004)(7696005)(5660300001)(2486003)(6916009)(76176011)(52116002)(69596002)(305945005)(3846002)(6506007)(47776003)(6666003)(1076002)(68736007)(66066001)(7736002)(103116003)(58126008)(59450400001)(105586002)(446003)(316002)(81166006)(26005)(81156014)(9686003)(97736004)(2361001)(106356001)(11346002)(97746001)(53416004)(956004)(50466002)(478600001)(72206003)(2351001)(186003)(16526019)(476003)(486006)(53936002)(2906002)(25786009)(4326008); DIR:OUT; SFP:1101; SCL:1; SRVR:DM2PR12MB0169; 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=3BDM2PR12MB0169=3B23=3AVFDC?= =?utf-8?q?Twm7uONyqgRGrd9Mf38r+Ls6plBHlXezRg58DJw7z8fMKBleVpqKDLwR?= =?utf-8?q?5/6X6mYvx3YDtLSDADLu3cP+vnDRdcVfEB5WX95dzPXcXnBEHGhSMAA5?= =?utf-8?q?OQwZtUvMz6OkPMCymiWMQQ8+i5h25z2jP6KRohNHjrobQwIAVeOi9hiK?= =?utf-8?q?jw5YMbGXgqhI6itsC0ifBJRhhAk+NOfyaeJNEeCLHKlw8riezcPywpaR?= =?utf-8?q?wRPuL/ZgQdhhvfLrPJgrnubKg1NeyNKZ+K1WrQLnt6ZbaDx8+8Ftr5Zq?= =?utf-8?q?pb7eDkyKtOvaPN/QVJFYYdxBMzaNypTclut6iwlnEuGmSqWK2IVSQ6d8?= =?utf-8?q?udMSwFZ5WOdU8og1or2/zl/zj12dB7nwNYT/17r3ciedYlIwrMu3Mezx?= =?utf-8?q?u1xrFAse+RUGvFQvUGo5kPZqdGPFE5XcE3yS73X0mtNcywEVI2InESsn?= =?utf-8?q?ysVkSkO3REmzRQLi0CTS/txWcitiYscAWj9aI0E54aUv/MZG9bffilPe?= =?utf-8?q?vLAxt8BBEnNKfyqrhkuSTwgAQf9Ty3Ir/MOm0rKGLkxiC/Diad5LGS+9?= =?utf-8?q?ThLhgGyMe0wYkcB0zFTXrl4NPWj2Pkmf3w166b7Xwcf04vIZJgLorQWK?= =?utf-8?q?ESLZunD2JlOG5rwJGMUS/AlvkprgRT0wrV33RmGGQaKcNkKShGQlBYLS?= =?utf-8?q?943g1cHQ2Z7PIq5tzzulYnPE0UjhS1NPADx0rm+Kstix+4MwSAkkQBUD?= =?utf-8?q?+i1+5Ly4VK8L/kD21Vux//77wxZ/KagQeTTdbbrRaLF4fxxAMQA39Vtr?= =?utf-8?q?9cjcQqjrk+iPF04MGd9zIhNsXEi2Sqpt+ZKdu26/Gb00pq9xHqTS8LnX?= =?utf-8?q?LVaL1V45TIX31QFIMgj1nT1Qjmnsi1X6ONHVIVuulbht4OvnjW1flCtp?= =?utf-8?q?fAxuTdjyCfKCIGpOD6mPaALd9BjV2C2CGO7GwMM75c5CoUjAOJXWBbjD?= =?utf-8?q?hc5zxIiP/2JNk8otAQ7oMJQqOHOA2rgelWnZxafPqqPV7iQSHS/tl5Zg?= =?utf-8?q?LMgBIM+AiAQS0ha+rV3UVT/hOgSeIlb5Ba5cQ4gccGDXMOLEbtED7AYa?= =?utf-8?q?ECo1CPqMrVBlsmstPD8TnbBTxfZ5XSWGL8bDHbNJjTTEzr3Ax1X65s3C?= =?utf-8?q?3bDK46bP+78CijfgBjPBy4l5l6dw0bzOG5eR8vm7ETY6RiauixADqRSD?= =?utf-8?q?AG+l+GfzHvKT8J4n641/P13rhGnhIGzTeoMTe+m4vdCUpdr7c2Qm8XOR?= =?utf-8?q?kjf9cPHmThk6RXlQqP7NbnQqZ8hqRHfuWOYo2TPNe1tF09FETCGMxSZS?= =?utf-8?q?zFvjCLaZpsXZ38je8t1d43eS9U523nXyUX/4vmOzDL5+M/nbVU094ZVm?= =?utf-8?q?uijGKoYpR4Qv5YQUAQ=3D=3D?= X-Microsoft-Antispam-Message-Info: 9sRpw7eGIx5OQX8qCMMZbsmcQWnu4nyRBcLkG4yQrdmqtXl4lv00AmMhwYQLNompe1DKrVwQ8F/L8hboGAjGybAOCW7T9oGIJf65H6CoSYFWBXIRHsL+omBjYgOiF2z9m6AsICbBJSo3aknMTrKFcFGAxDTqQ+9GsTc+GgkQRnB3E+96kOqNZGyw91g/Rc1r X-Microsoft-Exchange-Diagnostics: 1; DM2PR12MB0169; 6:8iLG+PhWQKok6rdZzaOrkKZ8YTbnjhqBefRtScvIk17FvcIIfxsaDB9RRUCCCzcwF8mK9/zsfEv4dCg96xxSU8D9b+6FXd5eWRE1UBIehRKkN2iZx8W0Qvfz6eiGHoEUzpWKNXI7P5TwY/ZlD/r0M7BMnL6EpJc6HErVSgVOQqoRCNUPeNZKayUcpUsU+q+7LFs6cC4pd2tDmSIzhWsVYD2rPU/03Me2mpjCu86h39beUV72Nt8PBpCz1VO3NoncvwZa6Nf5OAJ5qtvqiDAHeuLruxvvLOrjzEfzdMu/MUy127HpSvStG954rtl8FCJUWJaqWUMVyvScBs3AnjwbibxjdNZeYaCdfpsgvNGvdilsBgvl56PgKWFx/WV6Wkda+bOm56lkanPfAtSh55+fEgOKm0o5xyAU9xSbSMULCRcLI0ZiaohxqiVICuC/ikDZrPRMcq5GUunvw+VlR4OX+g==; 5:6W3qYcb7q9Pu4AxVl8Fkh/iQnR9ZCH543+qIkWEGG1xr7pdjZxrGNUkBLg7bVbxoiJvTSRYcwX8WaRLPlPTmhvd0YwW8vTaXiYGHfNHVp45KqIiFzccZB0re4I8Pf7twYyl7Sz+7bOwwkm1+9cPmHo+3xBUF6H9R+WKVR1aTDuU=; 24:d/QB6voh+QmTQPMkkufTdLgFHL2fjacR8VSNuonloHmgG2QUBGT0+1o34RiWU6ffWw/YkVRdZVldb9YBcnZsSu3I1vGQ4rC0Jy6boknKQX8= SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1; DM2PR12MB0169; 7:qXZZz/BVFvNoSMYhYu1clygD6IPgdsiibjAjS7+EU9iW3IrAH5Z3XbHoLXorE00dAHU1xdkyb+SQfbP3QpPvlD4aiqc8QIlf7I+KLwpuuAPHy9/T42cie8bFt+azT0D9RpKLiKX9ixvoCjwkZNNsx5Qe63Wo9LY4D7KRs1ixqpxQF2kQj5F5thc3o/V2oOsG9I6U+Zh1l9MYWprnwbr09CdKrcvFDr2382mSgXgWOd7DKEV5TF8KainK3nJQ/zJk; 20:466m0OFIlAKKo5NsQcGzeB79gv0RADz86zAHWBAG4sQkwP1etzBzknXnK0V4MmVopbVZ4QUT8lWKydr08eA+Cys6/uecpg5IvHqUNqaxjc1tvEDpx/ufqDINMQHCEyGWnwZR/Jl73xCfrnW/QRcnpZs3wUrIboG1GjnUMZ++2rDmEcuVdhioQ/t45xErch4FPydEyUU+brD7h/jVebt2fHpvR4j48/8Xcy7CcGUQsN7Hp40Lv3v3+RPvkpxYab1t X-MS-Office365-Filtering-Correlation-Id: 6ff4b6fe-fb68-4215-b0e0-08d5c0cbce33 X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 23 May 2018 16:39:51.0837 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 6ff4b6fe-fb68-4215-b0e0-08d5c0cbce33 X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 3dd8961f-e488-4e60-8e11-a82d994e183d X-MS-Exchange-Transport-CrossTenantHeadersStamped: DM2PR12MB0169 Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org After changing speed to 100Mbps as a result of auto-negotiation (AN), some 10/100/1000Mbps SFPs indicate a successful link (no faults or loss of signal), but cannot successfully transmit or receive data. These SFPs required an extra auto-negotiation (AN) after the speed change in order to operate properly. Add a quirk for these SFPs so that if the outcome of the AN actually results in changing to a new speed, re-initiate AN at that new speed. Signed-off-by: Tom Lendacky --- drivers/net/ethernet/amd/xgbe/xgbe-mdio.c | 77 +++++++++++++++------------ drivers/net/ethernet/amd/xgbe/xgbe-phy-v2.c | 6 ++ drivers/net/ethernet/amd/xgbe/xgbe.h | 1 3 files changed, 50 insertions(+), 34 deletions(-) diff --git a/drivers/net/ethernet/amd/xgbe/xgbe-mdio.c b/drivers/net/ethernet/amd/xgbe/xgbe-mdio.c index 450b89c..4b5d625 100644 --- a/drivers/net/ethernet/amd/xgbe/xgbe-mdio.c +++ b/drivers/net/ethernet/amd/xgbe/xgbe-mdio.c @@ -331,13 +331,15 @@ static void xgbe_switch_mode(struct xgbe_prv_data *pdata) xgbe_change_mode(pdata, pdata->phy_if.phy_impl.switch_mode(pdata)); } -static void xgbe_set_mode(struct xgbe_prv_data *pdata, +static bool xgbe_set_mode(struct xgbe_prv_data *pdata, enum xgbe_mode mode) { if (mode == xgbe_cur_mode(pdata)) - return; + return false; xgbe_change_mode(pdata, mode); + + return true; } static bool xgbe_use_mode(struct xgbe_prv_data *pdata, @@ -1178,21 +1180,23 @@ static int xgbe_phy_config_fixed(struct xgbe_prv_data *pdata) return 0; } -static int __xgbe_phy_config_aneg(struct xgbe_prv_data *pdata) +static int __xgbe_phy_config_aneg(struct xgbe_prv_data *pdata, bool set_mode) { int ret; + mutex_lock(&pdata->an_mutex); + set_bit(XGBE_LINK_INIT, &pdata->dev_state); pdata->link_check = jiffies; ret = pdata->phy_if.phy_impl.an_config(pdata); if (ret) - return ret; + goto out; if (pdata->phy.autoneg != AUTONEG_ENABLE) { ret = xgbe_phy_config_fixed(pdata); if (ret || !pdata->kr_redrv) - return ret; + goto out; netif_dbg(pdata, link, pdata->netdev, "AN redriver support\n"); } else { @@ -1202,24 +1206,27 @@ static int __xgbe_phy_config_aneg(struct xgbe_prv_data *pdata) /* Disable auto-negotiation interrupt */ disable_irq(pdata->an_irq); - /* Start auto-negotiation in a supported mode */ - if (xgbe_use_mode(pdata, XGBE_MODE_KR)) { - xgbe_set_mode(pdata, XGBE_MODE_KR); - } else if (xgbe_use_mode(pdata, XGBE_MODE_KX_2500)) { - xgbe_set_mode(pdata, XGBE_MODE_KX_2500); - } else if (xgbe_use_mode(pdata, XGBE_MODE_KX_1000)) { - xgbe_set_mode(pdata, XGBE_MODE_KX_1000); - } else if (xgbe_use_mode(pdata, XGBE_MODE_SFI)) { - xgbe_set_mode(pdata, XGBE_MODE_SFI); - } else if (xgbe_use_mode(pdata, XGBE_MODE_X)) { - xgbe_set_mode(pdata, XGBE_MODE_X); - } else if (xgbe_use_mode(pdata, XGBE_MODE_SGMII_1000)) { - xgbe_set_mode(pdata, XGBE_MODE_SGMII_1000); - } else if (xgbe_use_mode(pdata, XGBE_MODE_SGMII_100)) { - xgbe_set_mode(pdata, XGBE_MODE_SGMII_100); - } else { - enable_irq(pdata->an_irq); - return -EINVAL; + if (set_mode) { + /* Start auto-negotiation in a supported mode */ + if (xgbe_use_mode(pdata, XGBE_MODE_KR)) { + xgbe_set_mode(pdata, XGBE_MODE_KR); + } else if (xgbe_use_mode(pdata, XGBE_MODE_KX_2500)) { + xgbe_set_mode(pdata, XGBE_MODE_KX_2500); + } else if (xgbe_use_mode(pdata, XGBE_MODE_KX_1000)) { + xgbe_set_mode(pdata, XGBE_MODE_KX_1000); + } else if (xgbe_use_mode(pdata, XGBE_MODE_SFI)) { + xgbe_set_mode(pdata, XGBE_MODE_SFI); + } else if (xgbe_use_mode(pdata, XGBE_MODE_X)) { + xgbe_set_mode(pdata, XGBE_MODE_X); + } else if (xgbe_use_mode(pdata, XGBE_MODE_SGMII_1000)) { + xgbe_set_mode(pdata, XGBE_MODE_SGMII_1000); + } else if (xgbe_use_mode(pdata, XGBE_MODE_SGMII_100)) { + xgbe_set_mode(pdata, XGBE_MODE_SGMII_100); + } else { + enable_irq(pdata->an_irq); + ret = -EINVAL; + goto out; + } } /* Disable and stop any in progress auto-negotiation */ @@ -1239,16 +1246,7 @@ static int __xgbe_phy_config_aneg(struct xgbe_prv_data *pdata) xgbe_an_init(pdata); xgbe_an_restart(pdata); - return 0; -} - -static int xgbe_phy_config_aneg(struct xgbe_prv_data *pdata) -{ - int ret; - - mutex_lock(&pdata->an_mutex); - - ret = __xgbe_phy_config_aneg(pdata); +out: if (ret) set_bit(XGBE_LINK_ERR, &pdata->dev_state); else @@ -1259,6 +1257,16 @@ static int xgbe_phy_config_aneg(struct xgbe_prv_data *pdata) return ret; } +static int xgbe_phy_config_aneg(struct xgbe_prv_data *pdata) +{ + return __xgbe_phy_config_aneg(pdata, true); +} + +static int xgbe_phy_reconfig_aneg(struct xgbe_prv_data *pdata) +{ + return __xgbe_phy_config_aneg(pdata, false); +} + static bool xgbe_phy_aneg_done(struct xgbe_prv_data *pdata) { return (pdata->an_result == XGBE_AN_COMPLETE); @@ -1315,7 +1323,8 @@ static void xgbe_phy_status_result(struct xgbe_prv_data *pdata) pdata->phy.duplex = DUPLEX_FULL; - xgbe_set_mode(pdata, mode); + if (xgbe_set_mode(pdata, mode) && pdata->an_again) + xgbe_phy_reconfig_aneg(pdata); } static void xgbe_phy_status(struct xgbe_prv_data *pdata) diff --git a/drivers/net/ethernet/amd/xgbe/xgbe-phy-v2.c b/drivers/net/ethernet/amd/xgbe/xgbe-phy-v2.c index 194a569..3ceb4f9 100644 --- a/drivers/net/ethernet/amd/xgbe/xgbe-phy-v2.c +++ b/drivers/net/ethernet/amd/xgbe/xgbe-phy-v2.c @@ -902,6 +902,9 @@ static bool xgbe_phy_belfuse_phy_quirks(struct xgbe_prv_data *pdata) XGBE_BEL_FUSE_VENDOR, XGBE_SFP_BASE_VENDOR_NAME_LEN)) return false; + /* For Bel-Fuse, use the extra AN flag */ + pdata->an_again = 1; + if (memcmp(&sfp_eeprom->base[XGBE_SFP_BASE_VENDOR_PN], XGBE_BEL_FUSE_PARTNO, XGBE_SFP_BASE_VENDOR_PN_LEN)) return false; @@ -978,6 +981,9 @@ static int xgbe_phy_find_phy_device(struct xgbe_prv_data *pdata) if (phy_data->phydev) return 0; + /* Clear the extra AN flag */ + pdata->an_again = 0; + /* Check for the use of an external PHY */ if (phy_data->phydev_mode == XGBE_MDIO_MODE_NONE) return 0; diff --git a/drivers/net/ethernet/amd/xgbe/xgbe.h b/drivers/net/ethernet/amd/xgbe/xgbe.h index 7a412cf..47bcbcf 100644 --- a/drivers/net/ethernet/amd/xgbe/xgbe.h +++ b/drivers/net/ethernet/amd/xgbe/xgbe.h @@ -1261,6 +1261,7 @@ struct xgbe_prv_data { enum xgbe_rx kr_state; enum xgbe_rx kx_state; struct work_struct an_work; + unsigned int an_again; unsigned int an_supported; unsigned int parallel_detect; unsigned int fec_ability;