From patchwork Fri May 4 02:23:25 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Manlunas, Felix" X-Patchwork-Id: 908442 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=cavium.com Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=CAVIUMNETWORKS.onmicrosoft.com header.i=@CAVIUMNETWORKS.onmicrosoft.com header.b="dMGS11Gj"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 40cbRD48Mtz9s3D for ; Fri, 4 May 2018 12:23:36 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751302AbeEDCXe (ORCPT ); Thu, 3 May 2018 22:23:34 -0400 Received: from mail-sn1nam02on0076.outbound.protection.outlook.com ([104.47.36.76]:64775 "EHLO NAM02-SN1-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1751283AbeEDCXb (ORCPT ); Thu, 3 May 2018 22:23:31 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=CAVIUMNETWORKS.onmicrosoft.com; s=selector1-cavium-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version; bh=bAFpjLgBcAupiotJpiYF7Hojum8ZNsibJXf8K9ILsI0=; b=dMGS11Gjl2OL7X0tS/jYFpPLkgoqlN3S/UHCS6mt4fqJQGH2iA0AD1AtQ8VNAQfOhMQYwdxU4lj+0nygUM8eiLyq+NNDiK0kx7zJ5Az8ADL5pMLs9iBfsGM42ASGEYjRxmWl8V9/Bu6znpRTEZa9IFXZkpDMd5DzSmGCJVnlIOM= Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=Felix.Manlunas@cavium.com; Received: from localhost (50.233.148.156) by BN7PR07MB4210.namprd07.prod.outlook.com (2603:10b6:406:b2::12) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P256) id 15.20.735.16; Fri, 4 May 2018 02:23:28 +0000 Date: Thu, 3 May 2018 19:23:25 -0700 From: Felix Manlunas To: davem@davemloft.net Cc: netdev@vger.kernel.org, raghu.vatsavayi@cavium.com, derek.chickles@cavium.com, satananda.burla@cavium.com, felix.manlunas@cavium.com, weilin.chang@cavium.com Subject: [PATCH net-next] liquidio: support use of ethtool to set link speed of CN23XX-225 cards Message-ID: <20180504022325.GA1332@felix-thinkpad.cavium.com> MIME-Version: 1.0 Content-Disposition: inline User-Agent: Mutt/1.6.1 (2016-04-27) X-Originating-IP: [50.233.148.156] X-ClientProxiedBy: BYAPR02CA0029.namprd02.prod.outlook.com (2603:10b6:a02:ee::42) To BN7PR07MB4210.namprd07.prod.outlook.com (2603:10b6:406:b2::12) X-MS-PublicTrafficType: Email X-Microsoft-Antispam: UriScan:; BCL:0; PCL:0; RULEID:(7020095)(4652020)(5600026)(4534165)(4627221)(201703031133081)(201702281549075)(2017052603328)(7153060)(7193020); SRVR:BN7PR07MB4210; X-Microsoft-Exchange-Diagnostics: 1; BN7PR07MB4210; 3:TLiGLLaCS1BOwjVFVesMR/kMOkEgKAAwAtHfOmNkKWzMMUbSFxxow5T9LUv1SUYxQNLyNARaEWQ2o+8pGpnzfJfJuMDmS13luaFCKD3WdQEtgUZ9yHpKgZhJ2UxXty9Y6cgF0vm4KFQcRRCQDv4wxaa9qNHB420l/iEcwLdKKaEHXWNekVih6/zjfi3/323/BiSHZ/JwvDwJJJVfKZ8ulr8wX+fbc93fjdqKpOvtlaQRBJBJw6CKcuPG1/ktDGv9; 25:u+eDY4w5Nbsk8OY2DA9MgfLUJVXnCZYbE1n1Z4tgQCuC3WPUpCVkmk+StdL07Pt64V7YUhX43Ubfg7VpTsG/nPyG6miH8u7F8il7/D/z6Xn5twaP7H+2u2KWHj+TWXp19TAhqpfJpZGRbqK/qJtlJVn2IZ8JdTecBP0vNLbcSHo+3Ur8IrgaFI4Fq1EO9BabbrjRRpL1d5jSTBs/1wRY1WmW2jrkArZY0zbWrvj0J7MBNkfS1ar+ul8lmds5kdnXFFaX83laLaKlABNk6mo+hYRujROhmDadkmUuoGH7kRBypC/veIFc1vzruPpkehHsVs+vCkPVUWLPSR8JTYTjPQ==; 31:QLp/0N1KL9LwjkQldWent8eRcwnhIQ2HSYP+66TuVDM+H8IPoznZVzhH/7CH2LEXBWhFnuCRhhzf1nMa+/TG4xot7BQ0LtlGFJivXYN3E6s+DWmJ0AT9GGoVKFbWtJ84cddvFE5RfKmJlDVK7rCutsy8wwZ/G5IKwubKHNixHfytTtgSNsXi2EFwaHs6BlpnFiAx8oUNMx4NXitQeIOmrityCaOhbjnLoJHwaJ+tL04= X-MS-TrafficTypeDiagnostic: BN7PR07MB4210: X-Microsoft-Exchange-Diagnostics: 1; BN7PR07MB4210; 20:YORy+LXWE3GsgRHKCCG+el13l5nfZVZU4ZdrOMTRYC/7cLcQgY4fQjZ+/OUdpEhAZWj4h0YiluK0ak181hZ33tSWdwL0tCnRSgsf/PTmiyulDLVszS8QAKCflUxPVJlBzR2kqGzGYQrSipwxrR9xnNft8jtsYhMDcnXWF4enX1r/BKPRUH8SCfFEwcISntm3ECARJPXcX3Pk4slw4iMKO+MamK8B3qqjNdcEME3Jyj2bDs5ZZDTPDfFv7pCAyOsQOU19pAB5gBGa0ym4+QpH48ReKC7RJa/t7aHH7RP50a2vfHmUSsK5C3dTTOr7dqsneSTaZWhd04E6w+C11bCdp3LOukYYwoOwgK8lmX9hZEq1fXDZqE0OPAIDBXM/g47+wj/YjWKp2kvh+8+FmQK6Htzsznx4PeqmQ171cXLQcnUGbP3jiWnvBmjkvaLIT3UUJUfdCIPlgnF/GCCFSICFkcir89HPrCEtlb0SRm4HdDL5j4IJ11tJtEyKj6lFeuN9; 4:6KM/N9ASn/EnO10mR5VzJbzygC0lZMFyG6gDVWub6V1nzupQ277RSPyLg58U7m/KD6UpsHwbrAll/wi3uHPjZv3q6s7RBRshRGVTMygY5Rvfg3uZFBiZ05ZdtFJL5Kih01qTHr1nxFUswUceUfiBUike0jKs1uQtuFtNOx9ApT0pqFYMF20KPWMvr2blsOYoberDErjvhYfc31JzQ/tbiIu/vctUVpzCKc1Fm2wYGkPM7XVzxz70yVuD2782vzDnen//KtT0J7CkeiFiYge1Og== X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:; X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(8211001083)(6040522)(2401047)(5005006)(8121501046)(93006095)(93001095)(10201501046)(3231254)(944501410)(52105095)(3002001)(6041310)(20161123558120)(20161123562045)(20161123564045)(20161123560045)(201703131423095)(201702281528075)(20161123555045)(201703061421075)(201703061406153)(6072148)(201708071742011); SRVR:BN7PR07MB4210; BCL:0; PCL:0; RULEID:; SRVR:BN7PR07MB4210; X-Forefront-PRVS: 06628F7CA4 X-Forefront-Antispam-Report: SFV:NSPM; SFS:(10009020)(6069001)(346002)(376002)(396003)(39860400002)(39380400002)(366004)(199004)(189003)(47776003)(33656002)(6666003)(2351001)(4326008)(25786009)(97736004)(72206003)(478600001)(2361001)(8676002)(305945005)(7736002)(68736007)(81156014)(86362001)(6916009)(8936002)(81166006)(107886003)(50466002)(575784001)(16526019)(186003)(6116002)(5660300001)(52116002)(316002)(58126008)(3846002)(53936002)(16586007)(1076002)(6496006)(23726003)(26005)(2906002)(386003)(44832011)(486006)(66066001)(476003)(106356001)(6486002)(59450400001)(76506005)(105586002)(956004)(18370500001); DIR:OUT; SFP:1101; SCL:1; SRVR:BN7PR07MB4210; H:localhost; FPR:; SPF:None; LANG:en; PTR:InfoNoRecords; A:1; MX:1; Received-SPF: None (protection.outlook.com: cavium.com does not designate permitted sender hosts) X-Microsoft-Exchange-Diagnostics: 1; BN7PR07MB4210; 23:xGHke56GKDoIcZl8KhqwataWibeDiQXOk+QBGecwi6GcNNNx7oKBb1HPXFfz6CGYHa2JZvO7k0YQL9OsJucprtKEjTOMwGNxQkm7/+jjrrba9AlUCTPxXxy7Nsc39wLr/S6bZA5wHGmLGPwK8jkShK+JHU/yO4GIi5OPfFt+apTUfPC7+I2E/VuHXUjRcuzp7uDMalKolcvU9mAr0SO+Z3UGlPwr7pz2agEHK+734Zs+zhgQrt2iV2PoaWNMLsNh7ADh3cbauXI/6llpTvj5BusU/C8l4sKu5l4hKP1yqCACXuP0q4cmOSwjopBi9Ave7tYPd/SyhgrTmIeW+et/JTCMc5GUX3MEoDmmkqbI8i+PtutaKujmzEe+gIqkHFTFRIhlXuu196SxBug2eXmWES+Ng8RjkT8pYMq3NlK2gw811IfGu4K/OkQnTexv/hm/hnnk2VDr5XiaRdz3WR30ckUgN0ynYIskVCB9Kr8w/BgKHogbgiAMuTWTKe4YgWfq5I2ghtAWPUZgA1jrVjZPrjm4bAtJm7PFsv87UX6YFIqP5dh5QiFCSlNpiQZNO4nkDY8z4n9fckT5O/DBQCclhfpRoUch2Qg1eF14BTvWCxlj8bBxol3RO5oWEpo1r3BbwCTbNu6bKsa/1DnMegYyzQnNdR3pbDAMSpaxBojvXuY1nUEW+76/YThkkp9QFCtM64a3/vjmh5xGtRsmFxFiaSBUuUtDKXl2NTO7W3fMWEHEJk4BHcGr/vsNzTlhGJdTRTiZvO5Rdjaio8mKu6vET9hCd8SDh5vBCUCE7Qi10M4U3ffl6XPfoFCs4bJf1trSWQ6Xdo7W6C1r3/Q0OeveWCSMdDmSNoQbOZ+P1+4wbFrUfd2Ru3E5V3yt8MkvV3yKzWEakxT9HmpzvxPR9PLnnjCaYegQe1wZlL1E5gQbvr9uMp0B21q91oyxhBMKDF8vWo9tfNWoGNxf6VB/LT0+fISfgHpXpx35XyPQ4G0rHht4LdSkVRnLlD2ESmxdzv/d7qJDtVxw1WKM0ypMxOnxGzuv9VVALumzynIkGfetidsTrgGl/SmMxbVn2pJKUxoN2MTx1XrQB18e5Qn/AUlnlmkRb2P7Zv09uyZSukMP0UlsaGunS4QMNG3SHQSunudwxgQ32kmzLNGFrHS56T23pwc3r2E6inftduRF33feoBBcOJFVQTj3ihQXsERfN3RbAdIddBL/SfTteAaA+teSyVv/j/pEVaHJTq0ihxXuKooWrUcdY3xrq/t4USCzVsH8oC7YN+xnRhUU65wtVwObPQ== X-Microsoft-Antispam-Message-Info: 1n+KFLAtIaKDt6JaErFLT4HZldBsm30/GHfjitJ69jbAjIiPSiGvXqrQI8plyjYAvbZSsYyttNqZeJbaHValV03oC4CLnqK54Oi6dfeTp8HKkF+i0ae5qoCYubIPMOKdjDsjHUe8OtPi/fM1+hee+d/lYp98Qm9LHI3sk+eWlMPSKL7Vh6rWNDS6PqHlbWnd X-Microsoft-Exchange-Diagnostics: 1; BN7PR07MB4210; 6:2H1ATQTL56o8CAKTCjALOSLiBPQrlX2lHntXvJmZm4kWjtERWcYHW+lJEYeG1pYPQMKm0b+L0Zy7GDTfRJtUbMAh+yMq2vjmW1xrIG9as9++rWxsWnYzVx7fUb7vGgNlyrsMaCpvzmN4foOMVpglNnPAO8exW80TpnnLPUo4tLhX5k/8FaoTAojt4OO958IOCCrRIWBfmDtlVTMakfs3OwulJeIVaH/1l//RG36EvYmParYWrcwojc6xNZMMFrYMB8Yw6ljTQbyrWyVKHoOEjvMh0kAXP3MW+qBiZQPiCm0PpenoBSum1YBRy3E7mLqBUTZ2fPDOoiXfZ9XOPht/ft4p7vdFzirxjeQy+sWUXo3CBbKQ2tU6tVnA9f/1UGI9rBKytdwnT3NoMwJU2nktcg0ceU32YkJJZSooTKFw85pECJWtpo+Toelph8vPKaK484wULONIOjZGRu0yoc5ATw==; 5:HSg207QtOKmGe8Vgn5nhyiLKZQ6z8Uwe5JT7dnEvX1KsXssrba+uzYzBQRDjU4OmbIADW2BmOpT3FCaGO8RwQZWbObIV9uuz3dbtuu00lUwaaQem4Hk7om7dWL9+AkRzEQpr1QnyoBEcBRmaoTGthIn2w0ZZvn0+dY5QDJkYdiA=; 24:+wMx4qg1rPzlcil+U4mckPiDRhfWAKStocrFouVYEOgthEon20V8o7xGkcMWA0JT9B8WaZtx48SjYjZH+DgjdpoS/CEghrTMRdvLIcjDu6A= SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1; BN7PR07MB4210; 7:FC4qUwxDvbpx3SK8/7wU5+dTdhf6Rmsukd74AxYKRJAP6zH60cp12HjGZADnsO0KAwJGRV58piXqGa1lxu3+gJUsrXquivQ4Igqjd+1v57PT96AEoqb3SIZ89MYiNg8VE2imcu43eBoHzj1rc5MkFG9gwR8WvzjOerZIGqM/pWmAU8ly9xLqopJBbDhcigHuei06qaeWwGeATcnzyFc9POZWLK71hDWH81YOZg6kuFRvnezw+bIU9xphgz7E6wfs X-MS-Office365-Filtering-Correlation-Id: 53eb4677-a7b4-4f62-ae6d-08d5b16605d4 X-OriginatorOrg: cavium.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 04 May 2018 02:23:28.3835 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 53eb4677-a7b4-4f62-ae6d-08d5b16605d4 X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 711e4ccf-2e9b-4bcf-a551-4094005b6194 X-MS-Exchange-Transport-CrossTenantHeadersStamped: BN7PR07MB4210 Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org From: Weilin Chang Support setting the link speed of CN23XX-225 cards (which can do 25Gbps or 10Gbps) via ethtool_ops.set_link_ksettings. Also fix the function assigned to ethtool_ops.get_link_ksettings to use the new link_ksettings api completely (instead of partially via ethtool_convert_legacy_u32_to_link_mode). Signed-off-by: Weilin Chang Acked-by: Raghu Vatsavayi Signed-off-by: Felix Manlunas --- drivers/net/ethernet/cavium/liquidio/lio_core.c | 196 +++++++++++++++++++++ drivers/net/ethernet/cavium/liquidio/lio_ethtool.c | 193 +++++++++++++++++--- drivers/net/ethernet/cavium/liquidio/lio_main.c | 20 +++ drivers/net/ethernet/cavium/liquidio/lio_vf_main.c | 5 + .../net/ethernet/cavium/liquidio/liquidio_common.h | 4 + .../net/ethernet/cavium/liquidio/octeon_device.h | 14 ++ .../net/ethernet/cavium/liquidio/octeon_network.h | 15 ++ 7 files changed, 423 insertions(+), 24 deletions(-) diff --git a/drivers/net/ethernet/cavium/liquidio/lio_core.c b/drivers/net/ethernet/cavium/liquidio/lio_core.c index 6821afc..8093c5e 100644 --- a/drivers/net/ethernet/cavium/liquidio/lio_core.c +++ b/drivers/net/ethernet/cavium/liquidio/lio_core.c @@ -1481,3 +1481,199 @@ int octnet_get_link_stats(struct net_device *netdev) return 0; } + +static void liquidio_nic_seapi_ctl_callback(struct octeon_device *oct, + u32 status, + void *buf) +{ + struct liquidio_nic_seapi_ctl_context *ctx; + struct octeon_soft_command *sc = buf; + + ctx = sc->ctxptr; + + oct = lio_get_device(ctx->octeon_id); + if (status) { + dev_err(&oct->pci_dev->dev, "%s: instruction failed. Status: %llx\n", + __func__, + CVM_CAST64(status)); + } + ctx->status = status; + complete(&ctx->complete); +} + +int liquidio_set_speed(struct lio *lio, int speed) +{ + struct liquidio_nic_seapi_ctl_context *ctx; + struct octeon_device *oct = lio->oct_dev; + struct oct_nic_seapi_resp *resp; + struct octeon_soft_command *sc; + union octnet_cmd *ncmd; + u32 ctx_size; + int retval; + u32 var; + + if (oct->speed_setting == speed) + return 0; + + if (!OCTEON_CN23XX_PF(oct)) { + dev_err(&oct->pci_dev->dev, "%s: SET SPEED only for PF\n", + __func__); + return -EOPNOTSUPP; + } + + ctx_size = sizeof(struct liquidio_nic_seapi_ctl_context); + sc = octeon_alloc_soft_command(oct, OCTNET_CMD_SIZE, + sizeof(struct oct_nic_seapi_resp), + ctx_size); + if (!sc) + return -ENOMEM; + + ncmd = sc->virtdptr; + ctx = sc->ctxptr; + resp = sc->virtrptr; + memset(resp, 0, sizeof(struct oct_nic_seapi_resp)); + + ctx->octeon_id = lio_get_device_id(oct); + ctx->status = 0; + init_completion(&ctx->complete); + + ncmd->u64 = 0; + ncmd->s.cmd = SEAPI_CMD_SPEED_SET; + ncmd->s.param1 = speed; + + octeon_swap_8B_data((u64 *)ncmd, (OCTNET_CMD_SIZE >> 3)); + + sc->iq_no = lio->linfo.txpciq[0].s.q_no; + + octeon_prepare_soft_command(oct, sc, OPCODE_NIC, + OPCODE_NIC_UBOOT_CTL, 0, 0, 0); + + sc->callback = liquidio_nic_seapi_ctl_callback; + sc->callback_arg = sc; + sc->wait_time = 5000; + + retval = octeon_send_soft_command(oct, sc); + if (retval == IQ_SEND_FAILED) { + dev_info(&oct->pci_dev->dev, "Failed to send soft command\n"); + retval = -EBUSY; + } else { + /* Wait for response or timeout */ + if (wait_for_completion_timeout(&ctx->complete, + msecs_to_jiffies(10000)) == 0) { + dev_err(&oct->pci_dev->dev, "%s: sc timeout\n", + __func__); + octeon_free_soft_command(oct, sc); + return -EINTR; + } + + retval = resp->status; + + if (retval) { + dev_err(&oct->pci_dev->dev, "%s failed, retval=%d\n", + __func__, retval); + octeon_free_soft_command(oct, sc); + return -EIO; + } + + var = be32_to_cpu((__force __be32)resp->speed); + if (var != speed) { + dev_err(&oct->pci_dev->dev, + "%s: setting failed speed= %x, expect %x\n", + __func__, var, speed); + } + + oct->speed_setting = var; + } + + octeon_free_soft_command(oct, sc); + + return retval; +} + +int liquidio_get_speed(struct lio *lio) +{ + struct liquidio_nic_seapi_ctl_context *ctx; + struct octeon_device *oct = lio->oct_dev; + struct oct_nic_seapi_resp *resp; + struct octeon_soft_command *sc; + union octnet_cmd *ncmd; + u32 ctx_size; + int retval; + + ctx_size = sizeof(struct liquidio_nic_seapi_ctl_context); + sc = octeon_alloc_soft_command(oct, OCTNET_CMD_SIZE, + sizeof(struct oct_nic_seapi_resp), + ctx_size); + if (!sc) + return -ENOMEM; + + ncmd = sc->virtdptr; + ctx = sc->ctxptr; + resp = sc->virtrptr; + memset(resp, 0, sizeof(struct oct_nic_seapi_resp)); + + ctx->octeon_id = lio_get_device_id(oct); + ctx->status = 0; + init_completion(&ctx->complete); + + ncmd->u64 = 0; + ncmd->s.cmd = SEAPI_CMD_SPEED_GET; + + octeon_swap_8B_data((u64 *)ncmd, (OCTNET_CMD_SIZE >> 3)); + + sc->iq_no = lio->linfo.txpciq[0].s.q_no; + + octeon_prepare_soft_command(oct, sc, OPCODE_NIC, + OPCODE_NIC_UBOOT_CTL, 0, 0, 0); + + sc->callback = liquidio_nic_seapi_ctl_callback; + sc->callback_arg = sc; + sc->wait_time = 5000; + + retval = octeon_send_soft_command(oct, sc); + if (retval == IQ_SEND_FAILED) { + dev_info(&oct->pci_dev->dev, "Failed to send soft command\n"); + oct->no_speed_setting = 1; + oct->speed_setting = 25; + + retval = -EBUSY; + } else { + if (wait_for_completion_timeout(&ctx->complete, + msecs_to_jiffies(10000)) == 0) { + dev_err(&oct->pci_dev->dev, "%s: sc timeout\n", + __func__); + + oct->speed_setting = 25; + oct->no_speed_setting = 1; + + octeon_free_soft_command(oct, sc); + + return -EINTR; + } + retval = resp->status; + if (retval) { + dev_err(&oct->pci_dev->dev, + "%s failed retval=%d\n", __func__, retval); + oct->no_speed_setting = 1; + oct->speed_setting = 25; + octeon_free_soft_command(oct, sc); + retval = -EIO; + } else { + u32 var; + + var = be32_to_cpu((__force __be32)resp->speed); + oct->speed_setting = var; + if (var == 0xffff) { + oct->no_speed_setting = 1; + /* unable to access boot variables + * get the default value based on the NIC type + */ + oct->speed_setting = 25; + } + } + } + + octeon_free_soft_command(oct, sc); + + return retval; +} diff --git a/drivers/net/ethernet/cavium/liquidio/lio_ethtool.c b/drivers/net/ethernet/cavium/liquidio/lio_ethtool.c index a1d8430..e2d6d42 100644 --- a/drivers/net/ethernet/cavium/liquidio/lio_ethtool.c +++ b/drivers/net/ethernet/cavium/liquidio/lio_ethtool.c @@ -230,46 +230,147 @@ static int lio_get_link_ksettings(struct net_device *netdev, struct lio *lio = GET_LIO(netdev); struct octeon_device *oct = lio->oct_dev; struct oct_link_info *linfo; - u32 supported = 0, advertising = 0; linfo = &lio->linfo; + ethtool_link_ksettings_zero_link_mode(ecmd, supported); + ethtool_link_ksettings_zero_link_mode(ecmd, advertising); + switch (linfo->link.s.phy_type) { case LIO_PHY_PORT_TP: ecmd->base.port = PORT_TP; - supported = (SUPPORTED_10000baseT_Full | - SUPPORTED_TP | SUPPORTED_Pause); - advertising = (ADVERTISED_10000baseT_Full | ADVERTISED_Pause); ecmd->base.autoneg = AUTONEG_DISABLE; + ethtool_link_ksettings_add_link_mode(ecmd, supported, TP); + ethtool_link_ksettings_add_link_mode(ecmd, supported, Pause); + ethtool_link_ksettings_add_link_mode(ecmd, supported, + 10000baseT_Full); + + ethtool_link_ksettings_add_link_mode(ecmd, advertising, Pause); + ethtool_link_ksettings_add_link_mode(ecmd, advertising, + 10000baseT_Full); + break; case LIO_PHY_PORT_FIBRE: - ecmd->base.port = PORT_FIBRE; - - if (linfo->link.s.speed == SPEED_10000) { - supported = SUPPORTED_10000baseT_Full; - advertising = ADVERTISED_10000baseT_Full; + if (linfo->link.s.if_mode == INTERFACE_MODE_XAUI || + linfo->link.s.if_mode == INTERFACE_MODE_RXAUI || + linfo->link.s.if_mode == INTERFACE_MODE_XLAUI || + linfo->link.s.if_mode == INTERFACE_MODE_XFI) { + dev_dbg(&oct->pci_dev->dev, "ecmd->base.transceiver is XCVR_EXTERNAL\n"); + } else { + dev_err(&oct->pci_dev->dev, "Unknown link interface mode: %d\n", + linfo->link.s.if_mode); } - supported |= SUPPORTED_FIBRE | SUPPORTED_Pause; - advertising |= ADVERTISED_Pause; + ecmd->base.port = PORT_FIBRE; ecmd->base.autoneg = AUTONEG_DISABLE; + ethtool_link_ksettings_add_link_mode(ecmd, supported, FIBRE); + + ethtool_link_ksettings_add_link_mode(ecmd, supported, Pause); + ethtool_link_ksettings_add_link_mode(ecmd, advertising, Pause); + if (oct->subsystem_id == OCTEON_CN2350_25GB_SUBSYS_ID || + oct->subsystem_id == OCTEON_CN2360_25GB_SUBSYS_ID) { + if (OCTEON_CN23XX_PF(oct)) { + ethtool_link_ksettings_add_link_mode + (ecmd, supported, 25000baseSR_Full); + ethtool_link_ksettings_add_link_mode + (ecmd, supported, 25000baseKR_Full); + ethtool_link_ksettings_add_link_mode + (ecmd, supported, 25000baseCR_Full); + + if (oct->no_speed_setting == 0) { + ethtool_link_ksettings_add_link_mode + (ecmd, supported, + 10000baseSR_Full); + ethtool_link_ksettings_add_link_mode + (ecmd, supported, + 10000baseKR_Full); + ethtool_link_ksettings_add_link_mode + (ecmd, supported, + 10000baseCR_Full); + } + + if (oct->no_speed_setting == 0) + liquidio_get_speed(lio); + else + oct->speed_setting = 25; + + if (oct->speed_setting == 10) { + ethtool_link_ksettings_add_link_mode + (ecmd, advertising, + 10000baseSR_Full); + ethtool_link_ksettings_add_link_mode + (ecmd, advertising, + 10000baseKR_Full); + ethtool_link_ksettings_add_link_mode + (ecmd, advertising, + 10000baseCR_Full); + } + if (oct->speed_setting == 25) { + ethtool_link_ksettings_add_link_mode + (ecmd, advertising, + 25000baseSR_Full); + ethtool_link_ksettings_add_link_mode + (ecmd, advertising, + 25000baseKR_Full); + ethtool_link_ksettings_add_link_mode + (ecmd, advertising, + 25000baseCR_Full); + } + } else { /* VF */ + if (linfo->link.s.speed == 10000) { + ethtool_link_ksettings_add_link_mode + (ecmd, supported, + 10000baseSR_Full); + ethtool_link_ksettings_add_link_mode + (ecmd, supported, + 10000baseKR_Full); + ethtool_link_ksettings_add_link_mode + (ecmd, supported, + 10000baseCR_Full); + + ethtool_link_ksettings_add_link_mode + (ecmd, advertising, + 10000baseSR_Full); + ethtool_link_ksettings_add_link_mode + (ecmd, advertising, + 10000baseKR_Full); + ethtool_link_ksettings_add_link_mode + (ecmd, advertising, + 10000baseCR_Full); + } + + if (linfo->link.s.speed == 25000) { + ethtool_link_ksettings_add_link_mode + (ecmd, supported, + 25000baseSR_Full); + ethtool_link_ksettings_add_link_mode + (ecmd, supported, + 25000baseKR_Full); + ethtool_link_ksettings_add_link_mode + (ecmd, supported, + 25000baseCR_Full); + + ethtool_link_ksettings_add_link_mode + (ecmd, advertising, + 25000baseSR_Full); + ethtool_link_ksettings_add_link_mode + (ecmd, advertising, + 25000baseKR_Full); + ethtool_link_ksettings_add_link_mode + (ecmd, advertising, + 25000baseCR_Full); + } + } + } else { + ethtool_link_ksettings_add_link_mode(ecmd, supported, + 10000baseT_Full); + ethtool_link_ksettings_add_link_mode(ecmd, advertising, + 10000baseT_Full); + } break; } - if (linfo->link.s.if_mode == INTERFACE_MODE_XAUI || - linfo->link.s.if_mode == INTERFACE_MODE_RXAUI || - linfo->link.s.if_mode == INTERFACE_MODE_XLAUI || - linfo->link.s.if_mode == INTERFACE_MODE_XFI) { - ethtool_convert_legacy_u32_to_link_mode( - ecmd->link_modes.supported, supported); - ethtool_convert_legacy_u32_to_link_mode( - ecmd->link_modes.advertising, advertising); - } else { - dev_err(&oct->pci_dev->dev, "Unknown link interface reported %d\n", - linfo->link.s.if_mode); - } - if (linfo->link.s.link_up) { ecmd->base.speed = linfo->link.s.speed; ecmd->base.duplex = linfo->link.s.duplex; @@ -281,6 +382,49 @@ static int lio_get_link_ksettings(struct net_device *netdev, return 0; } +static int lio_set_link_ksettings(struct net_device *netdev, + const struct ethtool_link_ksettings *ecmd) +{ + struct lio *lio = GET_LIO(netdev); + struct octeon_device *oct = lio->oct_dev; + struct oct_link_info *linfo; + const int speed = ecmd->base.speed; + u32 is25G = 0; + + linfo = &lio->linfo; + + if (oct->subsystem_id == OCTEON_CN2350_25GB_SUBSYS_ID || + oct->subsystem_id == OCTEON_CN2360_25GB_SUBSYS_ID) { + is25G = 1; + } else { + return -EOPNOTSUPP; + } + + if (oct->no_speed_setting) { + dev_err(&oct->pci_dev->dev, "%s: Changing speed is not supported\n", + __func__); + return -EOPNOTSUPP; + } + + if ((ecmd->base.duplex != DUPLEX_UNKNOWN && + ecmd->base.duplex != linfo->link.s.duplex) || + ecmd->base.autoneg != AUTONEG_DISABLE || + (ecmd->base.speed != 10000 && ecmd->base.speed != 25000 && + ecmd->base.speed != SPEED_UNKNOWN)) + return -EOPNOTSUPP; + + if ((oct->speed_boot == speed / 1000) && + oct->speed_boot == oct->speed_setting) + return 0; + + liquidio_set_speed(lio, speed / 1000); + + dev_dbg(&oct->pci_dev->dev, "Port speed is set to %dG\n", + oct->speed_setting); + + return 0; +} + static void lio_get_drvinfo(struct net_device *netdev, struct ethtool_drvinfo *drvinfo) { @@ -2966,6 +3110,7 @@ static int lio_set_priv_flags(struct net_device *netdev, u32 flags) static const struct ethtool_ops lio_ethtool_ops = { .get_link_ksettings = lio_get_link_ksettings, + .set_link_ksettings = lio_set_link_ksettings, .get_link = ethtool_op_get_link, .get_drvinfo = lio_get_drvinfo, .get_ringparam = lio_ethtool_get_ringparam, diff --git a/drivers/net/ethernet/cavium/liquidio/lio_main.c b/drivers/net/ethernet/cavium/liquidio/lio_main.c index ee75048..e500528 100644 --- a/drivers/net/ethernet/cavium/liquidio/lio_main.c +++ b/drivers/net/ethernet/cavium/liquidio/lio_main.c @@ -912,6 +912,9 @@ liquidio_probe(struct pci_dev *pdev, /* set linux specific device pointer */ oct_dev->pci_dev = (void *)pdev; + oct_dev->subsystem_id = pdev->subsystem_vendor | + (pdev->subsystem_device << 16); + hs = &handshake[oct_dev->octeon_id]; init_completion(&hs->init); init_completion(&hs->started); @@ -3664,6 +3667,23 @@ static int setup_nic_devices(struct octeon_device *octeon_dev) "NIC ifidx:%d Setup successful\n", i); octeon_free_soft_command(octeon_dev, sc); + + if (octeon_dev->subsystem_id == + OCTEON_CN2350_25GB_SUBSYS_ID || + octeon_dev->subsystem_id == + OCTEON_CN2360_25GB_SUBSYS_ID) { + liquidio_get_speed(lio); + + if (octeon_dev->speed_setting == 0) { + octeon_dev->speed_setting = 25; + octeon_dev->no_speed_setting = 1; + } + } else { + octeon_dev->no_speed_setting = 1; + octeon_dev->speed_setting = 10; + } + octeon_dev->speed_boot = octeon_dev->speed_setting; + } devlink = devlink_alloc(&liquidio_devlink_ops, diff --git a/drivers/net/ethernet/cavium/liquidio/lio_vf_main.c b/drivers/net/ethernet/cavium/liquidio/lio_vf_main.c index 08b682b..41b5c72 100644 --- a/drivers/net/ethernet/cavium/liquidio/lio_vf_main.c +++ b/drivers/net/ethernet/cavium/liquidio/lio_vf_main.c @@ -411,6 +411,9 @@ liquidio_vf_probe(struct pci_dev *pdev, /* set linux specific device pointer */ oct_dev->pci_dev = pdev; + oct_dev->subsystem_id = pdev->subsystem_vendor | + (pdev->subsystem_device << 16); + if (octeon_device_init(oct_dev)) { liquidio_vf_remove(pdev); return -ENOMEM; @@ -2198,6 +2201,8 @@ static int setup_nic_devices(struct octeon_device *octeon_dev) "NIC ifidx:%d Setup successful\n", i); octeon_free_soft_command(octeon_dev, sc); + + octeon_dev->no_speed_setting = 1; } return 0; diff --git a/drivers/net/ethernet/cavium/liquidio/liquidio_common.h b/drivers/net/ethernet/cavium/liquidio/liquidio_common.h index 0265704..285b248 100644 --- a/drivers/net/ethernet/cavium/liquidio/liquidio_common.h +++ b/drivers/net/ethernet/cavium/liquidio/liquidio_common.h @@ -93,6 +93,7 @@ enum octeon_tag_type { #define OPCODE_NIC_VF_REP_PKT 0x15 #define OPCODE_NIC_VF_REP_CMD 0x16 +#define OPCODE_NIC_UBOOT_CTL 0x17 #define CORE_DRV_TEST_SCATTER_OP 0xFFF5 @@ -249,6 +250,9 @@ static inline void add_sg_size(struct octeon_sg_entry *sg_entry, #define OCTNET_CMD_VLAN_FILTER_ENABLE 0x1 #define OCTNET_CMD_VLAN_FILTER_DISABLE 0x0 +#define SEAPI_CMD_SPEED_SET 0x2 +#define SEAPI_CMD_SPEED_GET 0x3 + #define LIO_CMD_WAIT_TM 100 /* RX(packets coming from wire) Checksum verification flags */ diff --git a/drivers/net/ethernet/cavium/liquidio/octeon_device.h b/drivers/net/ethernet/cavium/liquidio/octeon_device.h index 9430c0a..94a4ed88d 100644 --- a/drivers/net/ethernet/cavium/liquidio/octeon_device.h +++ b/drivers/net/ethernet/cavium/liquidio/octeon_device.h @@ -43,6 +43,13 @@ #define OCTEON_CN23XX_REV_1_1 0x01 #define OCTEON_CN23XX_REV_2_0 0x80 +/**SubsystemId for the chips */ +#define OCTEON_CN2350_10GB_SUBSYS_ID_1 0X3177d +#define OCTEON_CN2350_10GB_SUBSYS_ID_2 0X4177d +#define OCTEON_CN2360_10GB_SUBSYS_ID 0X5177d +#define OCTEON_CN2350_25GB_SUBSYS_ID 0X7177d +#define OCTEON_CN2360_25GB_SUBSYS_ID 0X6177d + /** Endian-swap modes supported by Octeon. */ enum octeon_pci_swap_mode { OCTEON_PCI_PASSTHROUGH = 0, @@ -430,6 +437,8 @@ struct octeon_device { u16 rev_id; + u32 subsystem_id; + u16 pf_num; u16 vf_num; @@ -584,6 +593,11 @@ struct octeon_device { struct lio_vf_rep_list vf_rep_list; struct devlink *devlink; enum devlink_eswitch_mode eswitch_mode; + + /* for 25G NIC speed change */ + u8 speed_boot; + u8 speed_setting; + u8 no_speed_setting; }; #define OCT_DRV_ONLINE 1 diff --git a/drivers/net/ethernet/cavium/liquidio/octeon_network.h b/drivers/net/ethernet/cavium/liquidio/octeon_network.h index 8571f11..dd3177a 100644 --- a/drivers/net/ethernet/cavium/liquidio/octeon_network.h +++ b/drivers/net/ethernet/cavium/liquidio/octeon_network.h @@ -81,6 +81,18 @@ struct oct_nic_stats_ctrl { struct net_device *netdev; }; +struct oct_nic_seapi_resp { + u64 rh; + u32 speed; + u64 status; +}; + +struct liquidio_nic_seapi_ctl_context { + int octeon_id; + u32 status; + struct completion complete; +}; + /** LiquidIO per-interface network private data */ struct lio { /** State of the interface. Rx/Tx happens only in the RUNNING state. */ @@ -230,6 +242,9 @@ void lio_delete_glists(struct lio *lio); int lio_setup_glists(struct octeon_device *oct, struct lio *lio, int num_qs); +int liquidio_get_speed(struct lio *lio); +int liquidio_set_speed(struct lio *lio, int speed); + /** * \brief Net device change_mtu * @param netdev network device