From patchwork Mon Sep 17 05:43:32 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Manlunas, Felix" X-Patchwork-Id: 970394 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="CbE3uURV"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 42DFRZ1926z9sCS for ; Mon, 17 Sep 2018 15:43:54 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728225AbeIQLJe (ORCPT ); Mon, 17 Sep 2018 07:09:34 -0400 Received: from mail-eopbgr690084.outbound.protection.outlook.com ([40.107.69.84]:9632 "EHLO NAM04-CO1-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1727944AbeIQLJd (ORCPT ); Mon, 17 Sep 2018 07:09:33 -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:X-MS-Exchange-SenderADCheck; bh=W/qGs0VJ8vhw2fQ7B8BIu0zrTJnYbP4DGn4SHaADuPY=; b=CbE3uURVUo5maqMiOZx9IKngZKj8rqBPVhsv70m/LYNHEl0gz83muLBIZojOdULyN8Yt1H0k1bU6nMgdEHZR/LBkLTchYI8UwuyLIwHNazTP3wbr5yO3Mg0NOKV5O6lPRhwrQVu5MUu/mTm/wdHncMwUNcJGhLngbjnqdkPledw= Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=Felix.Manlunas@cavium.com; Received: from localhost (50.233.148.155) by BN6PR07MB2818.namprd07.prod.outlook.com (2603:10b6:404:40::12) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.1143.18; Mon, 17 Sep 2018 05:43:36 +0000 Date: Sun, 16 Sep 2018 22:43:32 -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: Add the features to show FEC settings and set FEC settings Message-ID: <20180917054332.GA1693@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.155] X-ClientProxiedBy: MWHPR2201CA0073.namprd22.prod.outlook.com (2603:10b6:301:5e::26) To BN6PR07MB2818.namprd07.prod.outlook.com (2603:10b6:404:40::12) X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: c21988b1-590b-4478-bece-08d61c608386 X-Microsoft-Antispam: BCL:0; PCL:0; RULEID:(7020095)(4652040)(8989137)(4534165)(4627221)(201703031133081)(201702281549075)(8990107)(5600074)(711020)(2017052603328)(7153060)(7193020); SRVR:BN6PR07MB2818; X-Microsoft-Exchange-Diagnostics: 1; BN6PR07MB2818; 3:44Sy/LJMvishFXVzydh44nyKgCxGBoRbrY5+QpFuVcHlCnAVmLjWuCMz/ez7ZufrBlzF59X9ESJJ4fw2RJgF9LLSpkUfFwayTGwdhw5Cr4CqH6q1IoXNJc0yIfB2QFwGBRh3Q7LAqVeMbBl6qF/tcnsyep+UWoR1LupwrUF+OTLOZVZt3h0op6fEUHuQVa8XQQBJQdp3ndythQhGO7K5K6iHKSoStLYzzlahJc8vpZy2C+zDdYoYOo/LbgILk1Hg; 25:RBm++lpnI6n2PDEQVtdmInwuWG1Te/Oi4O4pIrk8MVoFQqk11boVN07FNNBKQ0Dx9GDE36s+lhqI1Jal8HH/hWWJGOlNqoSgFgqUX7yvER6hkKIy7ATIuo6kUH4eGiYlHdK9oJCaRhemi+Z15/+dcmuS6Zya5tu8tUdlvWN761LUYZOXVPwgtrum6YLS6sTDoYiHmhvqeFDHuahuj5UFoVHQUDIm68F61J67xpmsGdefM7TqFhS2GI6zE3VCTXjviC20UuWKGA/UbY+KzGHwWGH9lUl2EAn7mqYEeYaspaFGoY4UIoIKDdsVJyH13kuHyY+Lstq1RCNyE07mIr1qMA==; 31:5ejxwhrl0AQNlnN5JX9Vq2JDwSgzc8qfe/bIGtW/2xBYNcJI+47KCuSAZ6g5YIEJ5161nGvqBRCifLEFOOguJZcw3nvEuwBDh6KPXFEpUpf/b5ZZzKG9yPxjMoj06zroOs0byVqfUkHNpu4tPT4iWrcBivs6lPyOwX6afZDheF7euNjYQh8bZAc56jBug0uRB/vZI/HPNAAom72x+48nCF4Mjay10dwIToX3iSAIdi8= X-MS-TrafficTypeDiagnostic: BN6PR07MB2818: X-Microsoft-Exchange-Diagnostics: 1; BN6PR07MB2818; 20:7Twdx7IuUjEjz91yIGCbX0DBkIAJh29fo02hHfcIqVgeFP98p5NqKe9n2gbCAIa6RPKLoWO1fkYguKfI29kWX5AaeEG56cGzPaDJO+nYyKOvGgUN+fQc2FKKbygjmNDOEqJ1n/zP+4cLPj7LpirWuWiZExNtRMwWOsV1scF+JTJPnM51p1WArQDSn3eswlFRHYvdQDM7GH5XF39bPVnAkR+Y9V7+upn/dSd0lQ1H6MKO6x6IqIFvX2qPcI1RJ7Rgm5PPzU0e0UUhlEPpcIq3fM3xq4dWAwmhzlTOTqpm6ltronjcHiBZEKZLe982NgYDqcCT/6KTYVa9ajsgngIEbzqCAhe5PoE9s0ovd5Zt4XK/JClHOR9/QSCTd62DVi38NA5KQfUPALy+hlqsyYsoxPEMkXoe+0SCq8IuZeOWQxPVOjAs2MxHTY85f29TC1rbE3LEur357QBCnE9JacCY3YXPpQeTsN5N0VZcmnK6IfYq51ZCg+wJLEboA9/Sr9la; 4:pfpvNiCahoLCdrqD1hBsltEg1mI9kxLOFQqzkyRwlAEttdWFidtdDJyKGsapwVKyWtJ33kEOXKG1/ZFTFitFgsMtRJEnC6KmO4oqokQL43mNm7YR7O0c+9r0R6kmgHQDWTIkBB648HuFl7P9YXjRu8EgpGwHQCW3fAilmvOz2M6KbVLCBNG98w0i/zLZSOSnZxRqTGCx2OS9i+Tgij2nCKWLzUdxJfaAPvljjeaDJ/WRYi/3iCjoBPSG5SfQgHjp1/s1HmPAPN09NkFfjGVJww== X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:; X-MS-Exchange-SenderADCheck: 1 X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(8211001083)(6040522)(2401047)(8121501046)(5005006)(3002001)(3231355)(944501410)(52105095)(93006095)(93001095)(10201501046)(149027)(150027)(6041310)(20161123564045)(20161123558120)(20161123562045)(201703131423095)(201702281528075)(20161123555045)(201703061421075)(201703061406153)(20161123560045)(201708071742011)(7699050); SRVR:BN6PR07MB2818; BCL:0; PCL:0; RULEID:; SRVR:BN6PR07MB2818; X-Forefront-PRVS: 0798146F16 X-Forefront-Antispam-Report: SFV:NSPM; SFS:(10009020)(6069001)(346002)(136003)(396003)(39850400004)(366004)(376002)(189003)(199004)(8936002)(81156014)(50466002)(81166006)(8676002)(72206003)(4326008)(25786009)(107886003)(6486002)(478600001)(53936002)(97736004)(68736007)(2351001)(386003)(16526019)(186003)(26005)(76506005)(47776003)(2361001)(476003)(956004)(2906002)(66066001)(105586002)(44832011)(106356001)(23726003)(6116002)(305945005)(3846002)(33656002)(86362001)(575784001)(5660300001)(316002)(6666003)(6916009)(1076002)(486006)(7736002)(6496006)(16586007)(52116002)(14444005)(58126008)(18370500001); DIR:OUT; SFP:1101; SCL:1; SRVR:BN6PR07MB2818; H:localhost; FPR:; SPF:None; LANG:en; PTR:InfoNoRecords; MX:1; A:1; Received-SPF: None (protection.outlook.com: cavium.com does not designate permitted sender hosts) X-Microsoft-Exchange-Diagnostics: 1; BN6PR07MB2818; 23:ZHmYuiyU56UFoWxU0zCd0WoqUrJzSLTpWdOI8OyFZy9rrNjyblU1p6VpQDTwuvy+3Wn1wG+2MIDRb8U09sd0YhQDgEa+cHaFsVdnxBlwsSbUgoyZThId5IuLaQKB7fHEEG1buyygI7nI2SgDkEys3dYmc4oG2p07LgpQdDvv/CIBNFm50CpV/g4G8XVGUFtB7YcW0GZHW9OyTZIPXVQL/Hj2VlJ/1wqzhj2szvRdiytRuWIS8EeKNyQenHMizjqgKG8mrLrjHfm6A7RDK07GxnU32FUYJXR35csniwq16RaHcjTztoKUCC9mAO3idzWGNHFHZEYtV/yEDtOGm+jegWshCiztB0WHY+fmmEPRqAODB8BDXXShGG7DC4n7K5qQ3JMqAhwU9fivnlT26m/ff6rLzBnhdAKFf4mq1WoaJo9Iw4RaAOkntpwkEb8C3MLrzKyKwCLPbQH3aucVyAzr9qlRKdV2j0uiOrn5nGfcl04ZhbJ2mKClfB1QCNytc5noaa6CQW8i3DCKBvyYSM/nABxOZZ3OzPhp+cvQ5uE0ShcVKy8of/5zp1/15KfHR6RgoDlZak1WLayyXXOlgkWhaEVUQuHyKjO6uxahyx31j7KvinljSuh6BYroch2tRMFTiLXrcPlQCOvdKVB3YMLvhVW4CggTwvwhTu2b7f+2SGHF+XZ/705MJ8gTQPg/vPryodrDBRdShr6CnEgkzZfn3667PI58bKmrCd1k8JKXL6bxXOvy2UoGkmrLaZAww7lkhHxt1cfVEkIZRleizkMh0ZOnNAxRWmvk1bATnLcOoMuejeQHqUyZjXehNqb2GlTs7AAN5QNW5skaKlOumGOknWweu4wXvVEgjD0wyNzkAVNCgbTq7C8pqSfVTTGnwkMyaECBLC9nsU0keDshX0BGwGqrQvDCg5T83SIJu1XLHhwKLTwnFTdnMIZi67lQNbhXlvkNc4usWmX98PPP+h7Vj0zA1ydtBNCY6XIkPR9T4jqIbzn5DXR/SNfpk+ff5R/EKWVRkVWDt5EdDRTotFBO/HF+Qq4KVlHMBdk9YjmTi2DgMcT8qgmasqTGH5QXCAvjDihdoOFYJcOMhcS5ByFv9sqI2LPD5B0frhxaoRFcbhcXIyyW0RZCu7qKiqrPbyfBnGT1mvWeyJDjca8k4t3cJb5LXChNkWTmoT331r2Ym34e/1+GCLjIIpZbnXibHI1gtwTEU1rZHW5eXPn6aNF6gNh4rjNUhmLnfiWIChGmYrcZjZQ801X9wppRe13SZLDTn17wcIMBb63J0T0+TPtV0Q== X-Microsoft-Antispam-Message-Info: dsaWH1VTcEB2K1Y6edMYt8I/Q2ZySZ/YyWrS4Hs+s0CQaesVQ1WsVa/Vv2JKq7TH+nk6TMEwN+JMv86Xr8/Ox479iQpWSBfRtaWXWIfcg/aPqIcCJOk/xSGHdUcRUQ7/YJR7MMRix/H96fqBdG/oVpYoVEvI70zMuYNCKIKeRgJKe2q2bMrng/iyflcIQIj6SzPI05gYZyt6bjUPA4wmdj9U+VIVYl3zKA6/R94R6m7gUf4DRTCJynGcfCgQfeKrW1VsfbLV5VXEmvfAo3iKezCkUbObbYyzg4fb5QzItBJWQMkuYZwYcurpDbuN98TuuoG5+FKed/fC7VKpQylCXez3rOaTXJKd4N4r+b7FGE8= X-Microsoft-Exchange-Diagnostics: 1; BN6PR07MB2818; 6:CI2TCZOsUmUk+8EX+b339AclLaerUPbtCe7jkWgdFqaKrOsfkjMU3a5sQVJ456gBJJVNsa/8izdQZA1Dc2NE4uyKvkxMTc/3vU5g7pIPFzud7/hneWg9nR0CZLJDZzJOKiRDA/dlKebIB4BIlE2JU3tqtY80EHUnGJpkGGEP5OGUYUMxup6R5Gfxc4eDKRS3CLjNnYHZCcaw440Ns0k8ysNozcYfdlukuwVmgZ6IfebO3Qn15nhTMr1gDpSYgACUjYTtcnilMcjy/7yYJYwMuQyLYahSaVpxP2W9XvMhQTY6Z/IOtdragJ0BZs9T1V6lk+KcqL8lREIRjdNLbqBTE6SIIxmVqti1S8M3+OUs8SB5YYEIdPmBhXTtHnQOt2UaSORvqd0/RaDS6LY8WsLGX6Qd2J+hFetoINinL2Rl1gKbPAqftKT0LyRxBSQIcWK7z3TA6Alzy7fl6wXuD191lA==; 5:qBv0jBAnsDVqqPEEwdkgc5E2fX7MiugijyAK4VNMHyro9q5TcPF2xKLFl9YcCW8xffvnzhMru8cD/9fROWgNSBDzwL1mC02tHzOpTvaUJmdh7zSFIR05k/5ia0gCCoYw+WjJqwcDK875cSoa+pjgRtFkDcwgwqoLjHNpnvSz+tA=; 7:SW6fTCTU5lk1JsVxioeAQW7rLCGpXvxXb/QH/Z/6g7tQT6KipaG8zNGHLz1Kpvxdz5v98URVH5wPbSgSHO+0/NELlL1fWhkSKYvGinLIwKxwzt6qXnQhcGVeZp8fuJcwEVqrkfGW71US9uxjIbM776JsmkO15xoHfnkBj8v/sSi49u9bBa6VBXjr5wJwIFcOLrmaED1qu4FydvotNQauK5KPpTFB0Foo1ATjs4wGh4JP61KFjaH7IORU6kaAvdG8 SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-OriginatorOrg: cavium.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 17 Sep 2018 05:43:36.6095 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: c21988b1-590b-4478-bece-08d61c608386 X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 711e4ccf-2e9b-4bcf-a551-4094005b6194 X-MS-Exchange-Transport-CrossTenantHeadersStamped: BN6PR07MB2818 Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org From: Weilin Chang 1. Add functions for get_fecparam and set_fecparam. 2. Modify lio_get_link_ksettings to display FEC setting. Signed-off-by: Weilin Chang Acked-by: Derek Chickles Signed-off-by: Felix Manlunas --- drivers/net/ethernet/cavium/liquidio/lio_core.c | 148 +++++++++++++++++++++ drivers/net/ethernet/cavium/liquidio/lio_ethtool.c | 76 ++++++++++- drivers/net/ethernet/cavium/liquidio/lio_main.c | 8 ++ .../net/ethernet/cavium/liquidio/liquidio_common.h | 5 + .../net/ethernet/cavium/liquidio/octeon_device.h | 2 + .../net/ethernet/cavium/liquidio/octeon_network.h | 7 +- 6 files changed, 243 insertions(+), 3 deletions(-) diff --git a/drivers/net/ethernet/cavium/liquidio/lio_core.c b/drivers/net/ethernet/cavium/liquidio/lio_core.c index 52b32b8..eb96b06 100644 --- a/drivers/net/ethernet/cavium/liquidio/lio_core.c +++ b/drivers/net/ethernet/cavium/liquidio/lio_core.c @@ -1654,3 +1654,151 @@ int liquidio_get_speed(struct lio *lio) return retval; } + +int liquidio_set_fec(struct lio *lio, int on_off) +{ + struct oct_nic_seapi_resp *resp; + struct octeon_soft_command *sc; + struct octeon_device *oct; + union octnet_cmd *ncmd; + int retval; + u32 var; + + oct = lio->oct_dev; + + if (oct->props[lio->ifidx].fec == on_off) + return 0; + + if (!OCTEON_CN23XX_PF(oct)) { + dev_err(&oct->pci_dev->dev, "%s: SET FEC only for PF\n", + __func__); + return -1; + } + + if (oct->speed_boot != 25) { + dev_err(&oct->pci_dev->dev, + "Set FEC only when link speed is 25G during insmod\n"); + return -1; + } + + sc = octeon_alloc_soft_command(oct, OCTNET_CMD_SIZE, + sizeof(struct oct_nic_seapi_resp), 0); + + ncmd = sc->virtdptr; + resp = sc->virtrptr; + memset(resp, 0, sizeof(struct oct_nic_seapi_resp)); + + init_completion(&sc->complete); + sc->sc_status = OCTEON_REQUEST_PENDING; + + ncmd->u64 = 0; + ncmd->s.cmd = SEAPI_CMD_FEC_SET; + ncmd->s.param1 = on_off; + /* SEAPI_CMD_FEC_DISABLE(0) or SEAPI_CMD_FEC_RS(1) */ + + 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); + + retval = octeon_send_soft_command(oct, sc); + if (retval == IQ_SEND_FAILED) { + dev_info(&oct->pci_dev->dev, "Failed to send soft command\n"); + octeon_free_soft_command(oct, sc); + return -EIO; + } + + retval = wait_for_sc_completion_timeout(oct, sc, 0); + if (retval) + return (-EIO); + + var = be32_to_cpu(resp->fec_setting); + resp->fec_setting = var; + if (var != on_off) { + dev_err(&oct->pci_dev->dev, + "Setting failed fec= %x, expect %x\n", + var, on_off); + oct->props[lio->ifidx].fec = var; + if (resp->fec_setting == SEAPI_CMD_FEC_SET_RS) + oct->props[lio->ifidx].fec = 1; + else + oct->props[lio->ifidx].fec = 0; + } + + WRITE_ONCE(sc->caller_is_done, true); + + if (oct->props[lio->ifidx].fec != + oct->props[lio->ifidx].fec_boot) { + dev_dbg(&oct->pci_dev->dev, + "Reloade driver to chang fec to %s\n", + oct->props[lio->ifidx].fec ? "on" : "off"); + } + + return retval; +} + +int liquidio_get_fec(struct lio *lio) +{ + struct oct_nic_seapi_resp *resp; + struct octeon_soft_command *sc; + struct octeon_device *oct; + union octnet_cmd *ncmd; + int retval; + u32 var; + + oct = lio->oct_dev; + + sc = octeon_alloc_soft_command(oct, OCTNET_CMD_SIZE, + sizeof(struct oct_nic_seapi_resp), 0); + if (!sc) + return -ENOMEM; + + ncmd = sc->virtdptr; + resp = sc->virtrptr; + memset(resp, 0, sizeof(struct oct_nic_seapi_resp)); + + init_completion(&sc->complete); + sc->sc_status = OCTEON_REQUEST_PENDING; + + ncmd->u64 = 0; + ncmd->s.cmd = SEAPI_CMD_FEC_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); + + retval = octeon_send_soft_command(oct, sc); + if (retval == IQ_SEND_FAILED) { + dev_info(&oct->pci_dev->dev, + "%s: Failed to send soft command\n", __func__); + octeon_free_soft_command(oct, sc); + return -EIO; + } + + retval = wait_for_sc_completion_timeout(oct, sc, 0); + if (retval) + return retval; + + var = be32_to_cpu(resp->fec_setting); + resp->fec_setting = var; + if (resp->fec_setting == SEAPI_CMD_FEC_SET_RS) + oct->props[lio->ifidx].fec = 1; + else + oct->props[lio->ifidx].fec = 0; + + WRITE_ONCE(sc->caller_is_done, true); + + if (oct->props[lio->ifidx].fec != + oct->props[lio->ifidx].fec_boot) { + dev_dbg(&oct->pci_dev->dev, + "Reloade driver to chang fec to %s\n", + oct->props[lio->ifidx].fec ? "on" : "off"); + } + + return retval; +} diff --git a/drivers/net/ethernet/cavium/liquidio/lio_ethtool.c b/drivers/net/ethernet/cavium/liquidio/lio_ethtool.c index 9e53cdb..4c3925a 100644 --- a/drivers/net/ethernet/cavium/liquidio/lio_ethtool.c +++ b/drivers/net/ethernet/cavium/liquidio/lio_ethtool.c @@ -244,6 +244,7 @@ static int lio_get_link_ksettings(struct net_device *netdev, 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"); + ecmd->base.transceiver = XCVR_EXTERNAL; } else { dev_err(&oct->pci_dev->dev, "Unknown link interface mode: %d\n", linfo->link.s.if_mode); @@ -277,10 +278,12 @@ static int lio_get_link_ksettings(struct net_device *netdev, 10000baseCR_Full); } - if (oct->no_speed_setting == 0) + if (oct->no_speed_setting == 0) { liquidio_get_speed(lio); - else + liquidio_get_fec(lio); + } else { oct->speed_setting = 25; + } if (oct->speed_setting == 10) { ethtool_link_ksettings_add_link_mode @@ -304,6 +307,24 @@ static int lio_get_link_ksettings(struct net_device *netdev, (ecmd, advertising, 25000baseCR_Full); } + + if (oct->no_speed_setting) + break; + + ethtool_link_ksettings_add_link_mode + (ecmd, supported, FEC_RS); + ethtool_link_ksettings_add_link_mode + (ecmd, supported, FEC_NONE); + /*FEC_OFF*/ + if (oct->props[lio->ifidx].fec == 1) { + /* ETHTOOL_FEC_RS */ + ethtool_link_ksettings_add_link_mode + (ecmd, advertising, FEC_RS); + } else { + /* ETHTOOL_FEC_OFF */ + ethtool_link_ksettings_add_link_mode + (ecmd, advertising, FEC_NONE); + } } else { /* VF */ if (linfo->link.s.speed == 10000) { ethtool_link_ksettings_add_link_mode @@ -3029,9 +3050,60 @@ static int lio_set_priv_flags(struct net_device *netdev, u32 flags) return 0; } +static int lio_get_fecparam(struct net_device *netdev, + struct ethtool_fecparam *fec) +{ + struct lio *lio = GET_LIO(netdev); + struct octeon_device *oct = lio->oct_dev; + + fec->active_fec = ETHTOOL_FEC_NONE; + fec->fec = ETHTOOL_FEC_NONE; + + if (oct->subsystem_id == OCTEON_CN2350_25GB_SUBSYS_ID || + oct->subsystem_id == OCTEON_CN2360_25GB_SUBSYS_ID) { + if (oct->no_speed_setting == 1) + return 0; + + liquidio_get_fec(lio); + fec->fec = (ETHTOOL_FEC_RS | ETHTOOL_FEC_OFF); + if (oct->props[lio->ifidx].fec == 1) + fec->active_fec = ETHTOOL_FEC_RS; + else + fec->active_fec = ETHTOOL_FEC_OFF; + } + + return 0; +} + +static int lio_set_fecparam(struct net_device *netdev, + struct ethtool_fecparam *fec) +{ + struct lio *lio = GET_LIO(netdev); + struct octeon_device *oct = lio->oct_dev; + + if (oct->subsystem_id == OCTEON_CN2350_25GB_SUBSYS_ID || + oct->subsystem_id == OCTEON_CN2360_25GB_SUBSYS_ID) { + if (oct->no_speed_setting == 1) + return -EOPNOTSUPP; + + if (fec->fec & ETHTOOL_FEC_OFF) + liquidio_set_fec(lio, 0); + else if (fec->fec & ETHTOOL_FEC_RS) + liquidio_set_fec(lio, 1); + else + return -EOPNOTSUPP; + } else { + return -EOPNOTSUPP; + } + + return 0; +} + static const struct ethtool_ops lio_ethtool_ops = { .get_link_ksettings = lio_get_link_ksettings, .set_link_ksettings = lio_set_link_ksettings, + .get_fecparam = lio_get_fecparam, + .set_fecparam = lio_set_fecparam, .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 0aba1f7..f42c1b0 100644 --- a/drivers/net/ethernet/cavium/liquidio/lio_main.c +++ b/drivers/net/ethernet/cavium/liquidio/lio_main.c @@ -3761,6 +3761,14 @@ static int setup_nic_devices(struct octeon_device *octeon_dev) octeon_dev->speed_setting = 10; } octeon_dev->speed_boot = octeon_dev->speed_setting; + + /* don't read FEC setting if unsupported by f/w (see above) */ + if (octeon_dev->speed_boot == 25 && + !octeon_dev->no_speed_setting) { + liquidio_get_fec(lio); + octeon_dev->props[lio->ifidx].fec_boot = + octeon_dev->props[lio->ifidx].fec; + } } devlink = devlink_alloc(&liquidio_devlink_ops, diff --git a/drivers/net/ethernet/cavium/liquidio/liquidio_common.h b/drivers/net/ethernet/cavium/liquidio/liquidio_common.h index 8fcb07d..a5e0e9f 100644 --- a/drivers/net/ethernet/cavium/liquidio/liquidio_common.h +++ b/drivers/net/ethernet/cavium/liquidio/liquidio_common.h @@ -260,6 +260,11 @@ static inline void add_sg_size(struct octeon_sg_entry *sg_entry, #define OCTNET_CMD_FAIL 0x1 +#define SEAPI_CMD_FEC_SET 0x0 +#define SEAPI_CMD_FEC_SET_DISABLE 0x0 +#define SEAPI_CMD_FEC_SET_RS 0x1 +#define SEAPI_CMD_FEC_GET 0x1 + #define SEAPI_CMD_SPEED_SET 0x2 #define SEAPI_CMD_SPEED_GET 0x3 diff --git a/drivers/net/ethernet/cavium/liquidio/octeon_device.h b/drivers/net/ethernet/cavium/liquidio/octeon_device.h index 881e40d..3d01d36 100644 --- a/drivers/net/ethernet/cavium/liquidio/octeon_device.h +++ b/drivers/net/ethernet/cavium/liquidio/octeon_device.h @@ -316,6 +316,8 @@ struct octdev_props { * device pointer (used for OS specific calls). */ int rx_on; + int fec; + int fec_boot; int napi_enabled; int gmxport; struct net_device *netdev; diff --git a/drivers/net/ethernet/cavium/liquidio/octeon_network.h b/drivers/net/ethernet/cavium/liquidio/octeon_network.h index beb3eec..50201fc 100644 --- a/drivers/net/ethernet/cavium/liquidio/octeon_network.h +++ b/drivers/net/ethernet/cavium/liquidio/octeon_network.h @@ -84,7 +84,10 @@ struct oct_nic_stats_ctrl { struct oct_nic_seapi_resp { u64 rh; - u32 speed; + union { + u32 fec_setting; + u32 speed; + }; u64 status; }; @@ -236,6 +239,8 @@ 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); +int liquidio_get_fec(struct lio *lio); +int liquidio_set_fec(struct lio *lio, int on_off); /** * \brief Net device change_mtu