From patchwork Mon May 21 22:00:15 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Tom Lendacky X-Patchwork-Id: 917894 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="5ZZdNfn4"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 40qXlK4TPtz9s16 for ; Tue, 22 May 2018 08:00:29 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1754083AbeEUWA1 (ORCPT ); Mon, 21 May 2018 18:00:27 -0400 Received: from mail-cys01nam02on0086.outbound.protection.outlook.com ([104.47.37.86]:39264 "EHLO NAM02-CY1-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1751050AbeEUWAU (ORCPT ); Mon, 21 May 2018 18:00:20 -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=5ZZdNfn4oCvUHjpo+3Jv6oav2lgZFhAhFDHFwmMy/ogNOCkGDt7YkB7dZnk4yV4qhWYHNNgVtEbX/gq5lEOXsDPB9UyhbQdtMBRyocc1nQxiikxhE/bu/oufUDr93E9ub4MkFF+YUbxhHmxiKqLGGXzB4PYFZBFTrKG3bZaIPKY= 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 22:00:18 +0000 From: Tom Lendacky Subject: [PATCH net-next 12/12] amd-xgbe: Improve SFP 100Mbps auto-negotiation To: netdev@vger.kernel.org Cc: David Miller Date: Mon, 21 May 2018 17:00:15 -0500 Message-ID: <20180521220015.8135.42302.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: SN4PR0401CA0034.namprd04.prod.outlook.com (2603:10b6:803:2a::20) 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:uFgpsnekVw+dzze1BvDXQO2Pi/VTL7XGAGvwjYua4V1EMwGKSLeq+1zc2EpHyngwvwE+e/DfNPEjQejpJQwE0+WFblu7Qfm6h+0UdR7CfCf4g0doRBSxfClzsMrsoZn8ij3uZGuHqJ9DkMjmcJR2BAPseTAQJO8GKjihEZNh+zK9wVPYyLWwcywTZ2meDdPEQBUWy/Ytj5nR7ZAIqyjK0hpOXK7b6qIYh+I5Cq3RF1EY7IT3ImzkcKyrBE8NlG8p; 25:Zrf/hn07sfeVAKplqPNza7XleiFzKCAJGkZn4r1+rACN3M4pH2lmH68BvvuLGpDZOC4z7YIw3LfabroqPW6I++Wz+GEiFELFtIHbeiiYkJBIc1N47YDyXnFULdVBWXUZNABxJQXcvKLVj2NabKTjOPuJhVf3zon5cXjo6crsuytdCaG/1k3HRayff4ErVl8hIyc74TFsuY7Ee5+vL40G/Fe8qv7DjAvp+akjTX71F+oQcPGAmlfu3tTOB1XanKNbFwDFi0PgqwYCaln5MVFn+9FIduXB058cGZLV9X0kFjsCArqIe3YJtSSp6cT93e1WlCn/aIiQu8uC/tEPCnrPjQU8L2yl1YP7Rcyogll1Ja4=; 31:SphQy4tyVQeZLnLba0628/79tvx06OaGKMrfBNYfTOwrLXGbRg/wLy5noIhlFYA+ydpFNBFNHftVjadcLoF55OPnTVNzwoGSiLmq1RH3se1hCzHitC9VfjXtIx3MDhtVwQYGjQQRfwWqEKWM5AwFkWoeXWFMComB27M92OwNV6Fv5LNJOk7JLTcaA0uVy+L6qTR1uBG3WS3NMAZQsB0yn+lFh07VdTPW8bojlOYHp6w= X-MS-TrafficTypeDiagnostic: DM2PR12MB0170: Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=Thomas.Lendacky@amd.com; X-Microsoft-Exchange-Diagnostics: 1; DM2PR12MB0170; 20:Xc7snqSku+Uj3jLi0g8KpHNISZHzqHZW4gjhQgTXlU7BBJ+6Z2ubeBldM68O/hiO44EtRYKWD9s3ar5PqHDU47deixblj6iA4cAw2jzC1ezRDbgi2FpJcr6wt3uq0D4dBop1gO4TQiqcbc2hfAOTl2tmocaMF9oV7ohpeHLsJmDpiqJCCJcul0BzQEozpfyfmKC5Y6XXa5eRc+aEBX+rgaLXM6EtUC1hixSBoybtNeXxxEtD/TlDxMG5KSYJAbLPRHY4ZYEJquiDinzn0j3VfkOTgLa6ZFRJ4uroAhLT4h2NaEReSJbS3ejFB3j6foGK6uGfsyAXkPGIskGltVesmIroe+Cu7EQ2APejHf6uTriDCzR3CocoqTM2m0Iz7pOv65MBxc8/Lxd+PxUDhYKp4bFgBHn2dE55yc8Onz4ds3eQcAzMO0/VFFG2YJmE8DOcEiwZ4dpOf9zBxp/yqu6Okhaf8oc2fq8aJoMOJoGQNN5osqautG/ImxKgRyfA5nzJ; 4:UZ0ChLvydDRilIkg5VS+X3jlazRWUr49VGrjH/MS9Sj1zl2sqihZASPtYVjHgLY+RyXS5bZU268BZQmFMmmvy4bhiaUUQM3QzdY16+a1G3ewUPf7bK5145ACloXlxyiiBAWOYhpx10JCHpRiP4xMQdYdo50mJ6xUR8GDaAQZetA1+qNhHQWNjTTr2gZ5lxHo2taC3IuOKIPJfiBnnzSCkyOceBTMmZLE+0SdN2LBkPPxGIcPfHDvb6AVahAEPobcbvoeemgU50gNYC+UzTxi0AWWXt8Oag52zw3Kdgn34HmQEWCHAVuX/OVcvULqMXCE 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)(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=3AdYta?= =?utf-8?q?3a6Jtq/iIHCFD+1CJZNnerMI4G6FYr1WQs/plRuk4NirxX4JfsYB95ga?= =?utf-8?q?3IMAEWTz7ePunRoxEYJqOpTVjxtZkbMiJd9pdfDMk4pFQMt+9GTkX6AH?= =?utf-8?q?kdLBSK55uQWP+MubXqRz2Qir2l+rWzkq7tQhlySPM8AnW2J1hWqknpkM?= =?utf-8?q?PjT/MQJ3QlB0ZcqVkiuHg2EeKO+1kFBTbk7oe01QzRpGq2vNFVLWHK0T?= =?utf-8?q?+zw/z2RzzhW3a5MKUfK2XsWjdp+4yXL8yKZrm+/uw6HWGfEZ+5A9JRLp?= =?utf-8?q?mtseBPO6SvjJl0RgUI7dbtcpWnb6WbiJbHzoovSknCUF77zFiTGqIqQc?= =?utf-8?q?IdJrmWqHwM3l4pNsvy8Phre4nrRTzBiFNJFoVXto8L4uS8H2SMKzoyPz?= =?utf-8?q?pMnDf06rwOuAi50qBOKlEcxPhPqHTJeGlkryTZYSAZitJ/8PC+pJbmEL?= =?utf-8?q?4fzrXz1WPvw475yYoUcuNUw92TlJ1oerpEv+4dnRGrOBqx6tIOIRfWMM?= =?utf-8?q?tAN8WTkPZcKuqSDy/+m6Royju6m0aPuXXfKYLxKluVAds/nIsxfcqiyD?= =?utf-8?q?QKkn2JDn4iTrCWmYOUAfsmfQ2gG9tRfu67ladXGzBDBL+O15ITd9EH8K?= =?utf-8?q?ZgDdzeznUpCD8gh2SbE/3nR9m8GQMPgKEr0zfEE5zmpXYIk8lQVGcDo8?= =?utf-8?q?T8HOC/VAWXj9lD6xmNWf8rG0cJ+i/H3v3A/AbvN5Zwa+TwLE/QQXNw/s?= =?utf-8?q?qXKadlg4DJVZwsTmcDHYf1N/oC0os1SVcxqE/Wdnpoep7z6mKjnGNDP0?= =?utf-8?q?aOnDPdXh0OaLxoT+xFru6LJHvk7r57csqEmc6OdiN+jG96Nn/X3dPiA3?= =?utf-8?q?SzSStpHFk4U3OrXrOTZvOqWrjR6V8pCQjl8FefGKOelGJHMC973k11mb?= =?utf-8?q?dwvEKKKdVplrSx+I014IPzH3xBh1cdpkGCmaw2yukQAc5TFDNVL8cwYS?= =?utf-8?q?dHgBfPj6FuFTxTFflBPVNrZWgmgtxSfhjrqJetZwpbW6dnENuzZGNygq?= =?utf-8?q?/Q46neOZkaMmTb5TyaX59fuLG6hDe98/KEXoumF+lrP1CvW6B5EbvgdI?= =?utf-8?q?ufLdB/YjYl6sgzInqiyX4GtGemXco197ak+jN0nSzqWllYI18ppI0ZkN?= =?utf-8?q?DRmlz9wIHfvaGXlCsHT55iWvZB4M0AG3jTqwNcTTAwcTO1KI4C+LJ96R?= =?utf-8?q?aoIHtauJyXWoiIatKq5mjUd/3NNddY7MCZV4PkYpNN4qM5Pt01Lr0Bl4?= =?utf-8?q?BH/GmDnJSOEJ/34Siw6q5LkDeCQ0ypZ5lA9uqEKhYdB0oqhJlAfivMLx?= =?utf-8?q?gU/sjJOkWw7QXqg5ztq/J9DfR1h6ojwb7/QhPN3Y6zkdbMZS/bHjwbi0?= =?utf-8?q?oA9Mqwns2L7Zvsb/RA=3D=3D?= X-Microsoft-Antispam-Message-Info: mwMPANuZNtBqvRtxWH8erAdjgbTJM2GxYTPPlOadXhB6Hp7n6gva+lDMFpWYC2lUVNw3qBEHshCEaHSOdR9ELhaiPqhvJfudfArE0cIlLXrmEpbZCSii3OHPcKO7cQ/Qi20Xb+2AyTnNvqbgYX2H54GpIuZNXwVhphtZQn3tQHe8Zp2SI5PXoNADMLrAcKaq X-Microsoft-Exchange-Diagnostics: 1; DM2PR12MB0170; 6:rPHqCHwQ6xs5CPgY6FtSSlvCNCX9RpVPFlVliCqmJhvk8N7JbYlk2qJoZC0Fr+Oeb3W+kENEPsZxS6KBXxU2CsdW5je7WgeJRPJpVOMQzdFOXBBbTJFI6zkgEIBS+Yye276oLEVZ2vl0e1nNQdrrcKBIB+vGhw1uVqoIxDqwq6k8pFfY43+JQpRxyzXnKxOnjP4G3Ev9kOJ5BrhSf00GpQDBnOb5b2mkP2nJIGe3eZFNn2wSFgVdNmfu2tozvPsk/AT38xy5/gfup/1j8p2xzuqVQDGrQKY5uBwW56CbIR02ztncEnb+t6+qu/zWxFq2efTRCbvsI1S+SNkZX0SCMIbsUTiYQWYkCwN4JOESRluIsZVskf10ojlXRx+A0Z65Zv6nwcgTFPMo3cj7tiFezDu52JgAJm0I6XFpojBrnEkqA1sT/jitZdo23H4r8qg/ZyVg4UlaeGqpEv9T4SybkQ==; 5:/1yEhpsLTrPjy2rFGRRg5MRjXkctK8oEvaUgbaEskNoGR0LatX98qiC/OSec6PYj0TJO9d80oP9/MhH5MrqImiyUGTNtJOjEL4nI7+TlHgotY7nMO3LWoTfEFFF5GsQleEEY2Avd9AjxIO/FosYHK+H2Ay01ut7zacFHurixFXw=; 24:gHrDOEtr9ffAA9o1NZP4Ri5M3O/Bcho+ZlRlQUMGvQWmx26AlGpsF6QYMI3K5PYP6vZDp3SvFx7INys/eGNyAXlKzrB9LGDNaiodn64p+74= SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1; DM2PR12MB0170; 7:EGRU0NkONA51gthMO+erMvW+FEBPFJZMtfzeBrazpQdH6Tw8Si4jUFmKBNyDwiYnV4fEH4LFpIgsDOTBf6cxQ2ewQAGINIDRH/A6ALdtfhuh952w8PaDOD1t1DqmHhmLJZbtt+aRsQhkCPsBXjync192KeYh+Ku5LbSy3Jshg9Ya6VE3D5YDxcIUWb2BzUtQfeLS+OV3YGImF9lcHLCeyVrokc5hWRzK8hfEw5EFK18Uo6/P920+trOfkiE1ZTWD; 20:dgT8E7gwIKxHpJy9UG7lwEAfEYC/0hrHI95hpbIn+bDYqSBk+dQ3gfJix+XCcxQQFW3MIhzOXDhuqkVPZWDG+bLKK4UI3fwpVYgCXdDycysslgMYtT26kJrRC5FdLvq5SNIyoK0E+QUqjYGBEEO4ojk7TdTtul78COQ2ozv3rqqaPzMyh2wqyCyrszQOwFnO/CsUUQZDtabC5Nkg/37PYWQsWL5VvX6EHgshyvz8zF+SnwzW1wNFRo/vuhyIuFdC X-MS-Office365-Filtering-Correlation-Id: 0061445b-010a-47bc-a0af-08d5bf663da4 X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 21 May 2018 22:00:18.2061 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 0061445b-010a-47bc-a0af-08d5bf663da4 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 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;