From patchwork Wed Aug 29 01:51:40 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Manlunas, Felix" X-Patchwork-Id: 963204 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="ZXB8Qaba"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 420TBZ4bJlz9s4Z for ; Wed, 29 Aug 2018 11:51:50 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727129AbeH2FqN (ORCPT ); Wed, 29 Aug 2018 01:46:13 -0400 Received: from mail-eopbgr730086.outbound.protection.outlook.com ([40.107.73.86]:20024 "EHLO NAM05-DM3-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1726889AbeH2FqM (ORCPT ); Wed, 29 Aug 2018 01:46:12 -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=NCzP+9aTmfKKMUZCJtZ76rWZLEIbtDTY8DL9EUDottk=; b=ZXB8QabaZEPiAV5IO7u5WMD1GOCcLUi/juu6xeZt7V6yx2CShFVz97kCF5qOyOldjMPvAsNSgVm8MlKjzx6wok8DiX0JkR1swS8LEVtRfrzQrnnSp1uQZL+GphmRWNM5cfSk42CXOTJ+kP5rxLQAmghROl50GRldS8D81qrKuaM= Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=Felix.Manlunas@cavium.com; Received: from localhost (50.233.148.155) by CY4PR07MB2824.namprd07.prod.outlook.com (2603:10b6:903:25::14) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.1080.14; Wed, 29 Aug 2018 01:51:43 +0000 Date: Tue, 28 Aug 2018 18:51:40 -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 3/4] liquidio: change octnic_ctrl_pkt to do synchronous soft commands Message-ID: <20180829015140.GA7937@felix-thinkpad.cavium.com> References: <20180829015058.GA7898@felix-thinkpad.cavium.com> MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: <20180829015058.GA7898@felix-thinkpad.cavium.com> User-Agent: Mutt/1.6.1 (2016-04-27) X-Originating-IP: [50.233.148.155] X-ClientProxiedBy: DM5PR16CA0021.namprd16.prod.outlook.com (2603:10b6:3:c0::31) To CY4PR07MB2824.namprd07.prod.outlook.com (2603:10b6:903:25::14) X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: d10012a7-dcf0-4445-a24a-08d60d51f890 X-Microsoft-Antispam: BCL:0; PCL:0; RULEID:(7020095)(4652040)(8989137)(4534165)(4627221)(201703031133081)(201702281549075)(8990107)(5600074)(711020)(2017052603328)(7153060)(7193020); SRVR:CY4PR07MB2824; X-Microsoft-Exchange-Diagnostics: 1; CY4PR07MB2824; 3:sjw6Of9nWIiTGlaR+rpFd7fC6VehV564gj4T716juXq6sUCqnvTsdGsALI8rxSFA3vAw+Nx5j+JObi/N+YCHg/pPuFVrc8ldBJfNuHbLJ0P5oEa4Uv5+V1h0MbJt9YTUpTOmCdSSDRGBCjDjOoSKKIjCYCudBGkXgk5THthjgpFyduSKTjyrc+RvebG/Jtr6gfkT/vcd/y1QdXXzE4FsZ3IKi9ISQrjLrVlc+XfzPCF+fqM9HkBFxv2XeTGeHcun; 25:GrVYTPVjB0N8klgO06wNihWOzuCkAQ2SWX8IquT+jS474AXcT+9uN12ymLk15L+ham3tD6YKJXTy2POlZ5ME+czH1CWjgg1yMR7MSG/j93booGtlASNegDC6E51encgdoVQf+wb1tfIm+gFKhxNjdm2cbKRNfoGURWlDYSzv+96MH+Ip+EiOKSrbbuv/P673NfSo6LeoLzM0UU3o5Ho0dERYI5o0WAPiSvRsoQ9qMaJc4aYyacLg/JLUDzxWGoWpS/yJLupESh9FIvteWaN22Mi2F8pscH8gjYR2o5t+PbmLRB8LjCSnRzJJviUd5SgH/nEtB+xj6tmk3uBWczRpug==; 31:CBhLx43nrAy1HjBVplU9gvZrgzIAcGSIjEJHP52CcpzRJLNU1BvZs+12EiLCNaAY6yJbqi4xSLZZDdmcYPMZHl6KLDe7APewbIQc7OdsgsIQHfvDu7pYd8plTbzRTISspF8gsj9VwlbxvY3w1XkuxkQ/Ve1rVeH5vipu7Rz140tCkpJwyPcQop3GpTUhBVWGpTsVQuHEKJUqC6s9A4CreQLN0U9UCBS0Eckc4XDcf+w= X-MS-TrafficTypeDiagnostic: CY4PR07MB2824: X-Microsoft-Exchange-Diagnostics: 1; CY4PR07MB2824; 20:slK4qr5uq4/UtT0OORm4NYxstp4rj1Xz4jnMUOUrf/anHvUAod3rEfJI6bpiQIKVZM7TXCH3cZmkhDPqRiR7xou8WJqTK/89ayT7rj9eEP6gTfCHXnRdEF3nr1NZxs+kMd9m1n9h6xV+fRf8qfVNsSUpt3KZIlC67F7eUpfIX0NawnDV2knfMkv/iXP54gNyNc1K721tevCSGii5G+jWoW6xK8DZ7q/I9ZSJeGGA2iI61NlvMav4VPwDb8VvhaDnMtbkLQ4eZKCaVqpvgP6MC1om9VLf5ZZcIR9pJJs0G7vsxrd23q4HFPJLeMIcFGc0EB/tqpmvW7844C8MBb76mV7HkrLrt9nv0Pg6HpgG4TinqJSO6btiJkKO1O7vI7i7FWdG834NNPIHSRg1thTCp//kED74nEmAdVRnEkukJ/cK4ghJCfNEMLwBel0yk57nLg17Fa84FJ87/35DwpMc78K2F9F6QnSnoHAcvXktcv1fHP567L5DaecyLIVdUPiW; 4:zWhiXaF7XE1ihuuXaJ+KGCyhytx/fTtm+GlS2gepfsg/rQOA2bIRpOTJm/+yqAkVdKA0e+zYzwieJPbGuVV4r8DsCmR6io1NS9lcxqxP8nJ/lQQwdC/WxweSxJXHnW7cmjuz3o+Sv/5XbpZiblaJ6A0GkfCiq82pTUAsRSDURA7ng9CvRiZwCrpbxoUa4FBFskCCeVh9gh0XjJp08tu5bwyjjakHuDhzSC35XaR8G0qe1E5onUVt+cMVD/PQL6tYv3nL32k3imRf897bNP6Nrr7gSezNcLxoQeTDTPS9yDwBEtEC9md2qdfOkA8N2ahe X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:(211171220733660); X-MS-Exchange-SenderADCheck: 1 X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(8211001083)(6040522)(2401047)(5005006)(8121501046)(3231311)(944501410)(52105095)(3002001)(10201501046)(93006095)(93001095)(149027)(150027)(6041310)(20161123560045)(20161123564045)(20161123558120)(201703131423095)(201702281528075)(20161123555045)(201703061421075)(201703061406153)(20161123562045)(201708071742011)(7699016); SRVR:CY4PR07MB2824; BCL:0; PCL:0; RULEID:; SRVR:CY4PR07MB2824; X-Forefront-PRVS: 077929D941 X-Forefront-Antispam-Report: SFV:NSPM; SFS:(10009020)(6069001)(396003)(366004)(39860400002)(376002)(136003)(346002)(199004)(189003)(25786009)(6486002)(4326008)(81166006)(33656002)(2906002)(76506005)(106356001)(26005)(81156014)(2351001)(386003)(105586002)(7736002)(66066001)(8936002)(5660300001)(6916009)(50466002)(107886003)(47776003)(8676002)(16526019)(3846002)(58126008)(16586007)(86362001)(2361001)(23726003)(305945005)(1076002)(186003)(316002)(11346002)(6116002)(68736007)(956004)(53936002)(446003)(97736004)(72206003)(575784001)(44832011)(76176011)(478600001)(486006)(52116002)(476003)(14444005)(6496006)(18370500001); DIR:OUT; SFP:1101; SCL:1; SRVR:CY4PR07MB2824; 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; CY4PR07MB2824; 23:x23MfCDdRxZlNhK1+lHpaZNlt4ggZYRDKIlHCbqS7NaAsrGZc/6jHZJ0SE6dbXXZcRwCq8xvc9QgZ0pFL6p7DZRc3u8CmymocfST+dnM2Ab4UOhWzmtotiuVbEzQb4BmrHYUsGfoLBQjCtDQ07rjmSXJwEsTcIPTqN8dD9oO43JnfGIeILJ4DY1qGE9jMELjHIwZ1NJzt2SAbovcTn1ih/0dS//uQE8fiXvjCnh/BOyNk/O68mMbFis/J84d83N8KlsxHAcsj3apCT9YPz/e5rw9ecpZriqaCXuu08KS2UDK1LfRIYiC7ry/3qa5keS8O3PqrasqzWkkvNBFwqMh4OzMSCswhZlZdF0whU5S5DVO5T9/RIsldqlo3wh8KsTJAIkcBoLmGtbrwhFgs18yJBCDQAZHo8dNAqTYoxpXsau78irs/YferOAPtnjIa8i+pg2tdqWfoaTWqurfjvS941zvoUGgxkK5lYTz1GYVUcp6/a+dIh816k9ffSdmWfQK7IjSqZKyXA9A5B3+jOu8iY9sjnXBZNIBDGFVAxYbBCRLmti7pJNCzTYotC/QaQhRsBEZfn2Z2TO6k3e26c5ABBqVb6opEVGiRFOhbLGVFFjjlBSSNxo+mvcrqCC9n5EDfTELww5Pg99TBi2MvbB/7Vs3Z5YDiGmWDYGWksMBdV816/04t2ogeMkxgfqdaf1xkk4wZ2NtHEabTX4GDp+P2uSqZPoYhhV5utVt4WAnwvsjJRG/YyNGbPposQt7vZGt133h/viPZETtTzoDdoPPDJbtgi2Nuz87d3yS4/0+E+6UaNIz7jOw1aCJWYK/4HfBC9aXWtuFsDfOIMF2LokVkGeb8LD/iaVi3QII8KgnDfJZ/V6oaiN79J4aVuL5arBkTXzzR8Od3XrfUg5tBE2gZ/nE/IVDGsO6DUoPQKMDq2fgVEcF+ximvik7xbEVQJaAEXc7Sr2fR92oPdFomkeUjKzoRB2cGd/IxuRqmPQRP6GNhFYq8YHrTv41YZ321XBMpQhZskMaOyBZxtqPm7uJbglnzQumSQJrVAJEZMfqy87pGrwQ3oQPm3vSRu4SekuOrhADTEM5nq5oOMkmzUK6vRt92QgIbf64o2pbvrRdtqFagBqR9Bi4YNdB2UGMkbQQrytDYa5/vyuGQt80BUVjSse0FqM61tklcQ0U0Ba3c42pE6QfoaXzam3D6yu+minlra6hwsqVdHHV7EdTDB5LeXgHyRYmabUSiqisG8vui4I3cwO8yG66a0JU+Chc9q4VWFe1X3tR15zWuYAi6oGywvHQa7JK7bdtWR0rTdhQOZ8= X-Microsoft-Antispam-Message-Info: L5a1/iH4x0OK4xxRSLD9zUYRziBZojCN2XaIP7FnnMDq6d3p4yZIcNxom+TirMLm8L3tkalnihA9Zeg+N+o1Vxx6yTY+NoYFIfBNx9SYQpH4El0jMbVyxHgbSo2UZE2mOEm0UG2tviDTROTTYvnh6AWAr8Oq+IrvXUjX+wXCe8R8jMrGJBN8S7b6EaOvranz4LRBFI89YYe4FaLsd7MCn+1aGXoNVCHcBY3vN17kigfiGrOGthE0jMzwMU7cKQW5iF/heHZPNYIZQtMBP8f8DvxPeh3voOHsnLnO0kEl5ZFujlZ1MXSougMhgBhy5LhV1GBSbrq3GRs614CG44E717YkCzDGvMISlyOYFo/no1c= X-Microsoft-Exchange-Diagnostics: 1; CY4PR07MB2824; 6:MZugA8GTnXfhPKJK/16fEZvIAteilDZfHhdb+3d3lg2AqHlCG4zpUQmBhfcCH8JuuWmgKJLN0Q0pZFvcBaO3l54Vf0SNOF6ShAEXZ20U7NjncNsTWU5WwUh+f+geTwWx3txeCXForSEHV0pUw0NHFJav5ip002V/mO+LXj+Iaaz2OHF7TwdFrN3O1k3xvZcBTHfPnRgrj5xeK776oL4Mgfd8BF4aEJXGC7e9b1sY+wlf0feRu+G//cad+E5zcCnvBUQTeoeibvRRH8wGYvlodVedag7WtboF8SZfR/ZZHnaCBFduEPummK+Xkxxv/wjHD9w453VCKCU7/jdKkhnXJfuOjTmz8mDm0E0izlnO8IzhBWFvDvdPP30p5kDP6BGdreqiEJtt/s7xZFweZXeHudavyFrvsWtrpsxi4ckhZenIUQTiALokLP3K5oxu8hUouYE/LdJc5Njc6f8h4c5VxQ==; 5:VY5HzN6Y609LkuKsVuM0D6BF7uWsGGYlGTX183+39BFsqoQESocgUilwr930RchMCoNzzaMbg1I58g+Zl10S2rZevAFsFwZWiAxgKBPzx6yTUE+trUI9DqGDzA782gyriovoSq+Dhy0YPaLdcV3vXbGA3Sl1u/shAjSJGqqFp6c=; 7:TwT1YvmloagRKT5mUm6UfgFV3f7iwilThjtnzOBV6SBNffXO6P1ry37lShtLPRD5PFxGR12qS0lMPfVnHFDlvlAXNAxtXNVQi1LUaRXrRmjgX9jDzpuqbq106wHTqlYN0cLPGlfv9Y3XI0U7Uglovedv0IyYGk0mXIV2AFdkeeyL1aPKfFL8qLiKt+OuQxXkNztHm46cwGlRcTYXjjqf0BwHasgptfxSahUYKQjJM79kRDpBnFl18lEzHcS4vTNo SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-OriginatorOrg: cavium.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 29 Aug 2018 01:51:43.1525 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: d10012a7-dcf0-4445-a24a-08d60d51f890 X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 711e4ccf-2e9b-4bcf-a551-4094005b6194 X-MS-Exchange-Transport-CrossTenantHeadersStamped: CY4PR07MB2824 Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org 1. Change struct octnic_ctrl_pkt to support synchronous operation. 2. Change code which use structure octnic_ctrl_pkt to send sc's synchronously. Signed-off-by: Weilin Chang Signed-off-by: Felix Manlunas --- drivers/net/ethernet/cavium/liquidio/lio_core.c | 15 ++--- drivers/net/ethernet/cavium/liquidio/lio_ethtool.c | 21 ++++--- drivers/net/ethernet/cavium/liquidio/lio_main.c | 69 ++++++++++++++-------- drivers/net/ethernet/cavium/liquidio/lio_vf_main.c | 38 ++++-------- drivers/net/ethernet/cavium/liquidio/octeon_nic.c | 56 ++++++++---------- drivers/net/ethernet/cavium/liquidio/octeon_nic.h | 9 +-- 6 files changed, 98 insertions(+), 110 deletions(-) diff --git a/drivers/net/ethernet/cavium/liquidio/lio_core.c b/drivers/net/ethernet/cavium/liquidio/lio_core.c index 822ce0f..27b3655 100644 --- a/drivers/net/ethernet/cavium/liquidio/lio_core.c +++ b/drivers/net/ethernet/cavium/liquidio/lio_core.c @@ -198,14 +198,15 @@ int liquidio_set_feature(struct net_device *netdev, int cmd, u16 param1) nctrl.ncmd.s.cmd = cmd; nctrl.ncmd.s.param1 = param1; nctrl.iq_no = lio->linfo.txpciq[0].s.q_no; - nctrl.wait_time = 100; nctrl.netpndev = (u64)netdev; nctrl.cb_fn = liquidio_link_ctrl_cmd_completion; ret = octnet_send_nic_ctrl_pkt(lio->oct_dev, &nctrl); - if (ret < 0) { + if (ret) { dev_err(&oct->pci_dev->dev, "Feature change failed in core (ret: 0x%x)\n", ret); + if (ret > 0) + ret = -EIO; } return ret; } @@ -285,15 +286,7 @@ void liquidio_link_ctrl_cmd_completion(void *nctrl_ptr) struct octeon_device *oct = lio->oct_dev; u8 *mac; - if (nctrl->completion && nctrl->response_code) { - /* Signal whoever is interested that the response code from the - * firmware has arrived. - */ - WRITE_ONCE(*nctrl->response_code, nctrl->status); - complete(nctrl->completion); - } - - if (nctrl->status) + if (nctrl->sc_status) return; switch (nctrl->ncmd.s.cmd) { diff --git a/drivers/net/ethernet/cavium/liquidio/lio_ethtool.c b/drivers/net/ethernet/cavium/liquidio/lio_ethtool.c index 8e05afd..d374c44 100644 --- a/drivers/net/ethernet/cavium/liquidio/lio_ethtool.c +++ b/drivers/net/ethernet/cavium/liquidio/lio_ethtool.c @@ -472,12 +472,11 @@ lio_send_queue_count_update(struct net_device *netdev, uint32_t num_queues) nctrl.ncmd.s.param1 = num_queues; nctrl.ncmd.s.param2 = num_queues; nctrl.iq_no = lio->linfo.txpciq[0].s.q_no; - nctrl.wait_time = 100; nctrl.netpndev = (u64)netdev; nctrl.cb_fn = liquidio_link_ctrl_cmd_completion; ret = octnet_send_nic_ctrl_pkt(lio->oct_dev, &nctrl); - if (ret < 0) { + if (ret) { dev_err(&oct->pci_dev->dev, "Failed to send Queue reset command (ret: 0x%x)\n", ret); return -1; @@ -708,13 +707,13 @@ static int octnet_gpio_access(struct net_device *netdev, int addr, int val) nctrl.ncmd.s.param1 = addr; nctrl.ncmd.s.param2 = val; nctrl.iq_no = lio->linfo.txpciq[0].s.q_no; - nctrl.wait_time = 100; nctrl.netpndev = (u64)netdev; nctrl.cb_fn = liquidio_link_ctrl_cmd_completion; ret = octnet_send_nic_ctrl_pkt(lio->oct_dev, &nctrl); - if (ret < 0) { - dev_err(&oct->pci_dev->dev, "Failed to configure gpio value\n"); + if (ret) { + dev_err(&oct->pci_dev->dev, + "Failed to configure gpio value, ret=%d\n", ret); return -EINVAL; } @@ -734,13 +733,13 @@ static int octnet_id_active(struct net_device *netdev, int val) nctrl.ncmd.s.cmd = OCTNET_CMD_ID_ACTIVE; nctrl.ncmd.s.param1 = val; nctrl.iq_no = lio->linfo.txpciq[0].s.q_no; - nctrl.wait_time = 100; nctrl.netpndev = (u64)netdev; nctrl.cb_fn = liquidio_link_ctrl_cmd_completion; ret = octnet_send_nic_ctrl_pkt(lio->oct_dev, &nctrl); - if (ret < 0) { - dev_err(&oct->pci_dev->dev, "Failed to configure gpio value\n"); + if (ret) { + dev_err(&oct->pci_dev->dev, + "Failed to configure gpio value, ret=%d\n", ret); return -EINVAL; } @@ -1412,7 +1411,6 @@ lio_set_pauseparam(struct net_device *netdev, struct ethtool_pauseparam *pause) nctrl.ncmd.u64 = 0; nctrl.ncmd.s.cmd = OCTNET_CMD_SET_FLOW_CTL; nctrl.iq_no = lio->linfo.txpciq[0].s.q_no; - nctrl.wait_time = 100; nctrl.netpndev = (u64)netdev; nctrl.cb_fn = liquidio_link_ctrl_cmd_completion; @@ -1433,8 +1431,9 @@ lio_set_pauseparam(struct net_device *netdev, struct ethtool_pauseparam *pause) } ret = octnet_send_nic_ctrl_pkt(lio->oct_dev, &nctrl); - if (ret < 0) { - dev_err(&oct->pci_dev->dev, "Failed to set pause parameter\n"); + if (ret) { + dev_err(&oct->pci_dev->dev, + "Failed to set pause parameter, ret=%d\n", ret); return -EINVAL; } diff --git a/drivers/net/ethernet/cavium/liquidio/lio_main.c b/drivers/net/ethernet/cavium/liquidio/lio_main.c index 8ddc191..9c5a53d 100644 --- a/drivers/net/ethernet/cavium/liquidio/lio_main.c +++ b/drivers/net/ethernet/cavium/liquidio/lio_main.c @@ -2039,10 +2039,9 @@ static void liquidio_set_mcast_list(struct net_device *netdev) /* Apparently, any activity in this call from the kernel has to * be atomic. So we won't wait for response. */ - nctrl.wait_time = 0; ret = octnet_send_nic_ctrl_pkt(lio->oct_dev, &nctrl); - if (ret < 0) { + if (ret) { dev_err(&oct->pci_dev->dev, "DEVFLAGS change failed in core (ret: 0x%x)\n", ret); } @@ -2071,8 +2070,6 @@ static int liquidio_set_mac(struct net_device *netdev, void *p) nctrl.ncmd.s.more = 1; nctrl.iq_no = lio->linfo.txpciq[0].s.q_no; nctrl.netpndev = (u64)netdev; - nctrl.cb_fn = liquidio_link_ctrl_cmd_completion; - nctrl.wait_time = 100; nctrl.udd[0] = 0; /* The MAC Address is presented in network byte order. */ @@ -2083,6 +2080,14 @@ static int liquidio_set_mac(struct net_device *netdev, void *p) dev_err(&oct->pci_dev->dev, "MAC Address change failed\n"); return -ENOMEM; } + + if (nctrl.sc_status) { + dev_err(&oct->pci_dev->dev, + "%s: MAC Address change failed. sc return=%x\n", + __func__, nctrl.sc_status); + return -EIO; + } + memcpy(netdev->dev_addr, addr->sa_data, netdev->addr_len); memcpy(((u8 *)&lio->linfo.hw_addr) + 2, addr->sa_data, ETH_ALEN); @@ -2623,14 +2628,15 @@ static int liquidio_vlan_rx_add_vid(struct net_device *netdev, nctrl.ncmd.s.cmd = OCTNET_CMD_ADD_VLAN_FILTER; nctrl.ncmd.s.param1 = vid; nctrl.iq_no = lio->linfo.txpciq[0].s.q_no; - nctrl.wait_time = 100; nctrl.netpndev = (u64)netdev; nctrl.cb_fn = liquidio_link_ctrl_cmd_completion; ret = octnet_send_nic_ctrl_pkt(lio->oct_dev, &nctrl); - if (ret < 0) { + if (ret) { dev_err(&oct->pci_dev->dev, "Add VLAN filter failed in core (ret: 0x%x)\n", ret); + if (ret > 0) + ret = -EIO; } return ret; @@ -2651,14 +2657,15 @@ static int liquidio_vlan_rx_kill_vid(struct net_device *netdev, nctrl.ncmd.s.cmd = OCTNET_CMD_DEL_VLAN_FILTER; nctrl.ncmd.s.param1 = vid; nctrl.iq_no = lio->linfo.txpciq[0].s.q_no; - nctrl.wait_time = 100; nctrl.netpndev = (u64)netdev; nctrl.cb_fn = liquidio_link_ctrl_cmd_completion; ret = octnet_send_nic_ctrl_pkt(lio->oct_dev, &nctrl); - if (ret < 0) { + if (ret) { dev_err(&oct->pci_dev->dev, "Del VLAN filter failed in core (ret: 0x%x)\n", ret); + if (ret > 0) + ret = -EIO; } return ret; } @@ -2684,15 +2691,16 @@ static int liquidio_set_rxcsum_command(struct net_device *netdev, int command, nctrl.ncmd.s.cmd = command; nctrl.ncmd.s.param1 = rx_cmd; nctrl.iq_no = lio->linfo.txpciq[0].s.q_no; - nctrl.wait_time = 100; nctrl.netpndev = (u64)netdev; nctrl.cb_fn = liquidio_link_ctrl_cmd_completion; ret = octnet_send_nic_ctrl_pkt(lio->oct_dev, &nctrl); - if (ret < 0) { + if (ret) { dev_err(&oct->pci_dev->dev, "DEVFLAGS RXCSUM change failed in core(ret:0x%x)\n", ret); + if (ret > 0) + ret = -EIO; } return ret; } @@ -2720,15 +2728,16 @@ static int liquidio_vxlan_port_command(struct net_device *netdev, int command, nctrl.ncmd.s.more = vxlan_cmd_bit; nctrl.ncmd.s.param1 = vxlan_port; nctrl.iq_no = lio->linfo.txpciq[0].s.q_no; - nctrl.wait_time = 100; nctrl.netpndev = (u64)netdev; nctrl.cb_fn = liquidio_link_ctrl_cmd_completion; ret = octnet_send_nic_ctrl_pkt(lio->oct_dev, &nctrl); - if (ret < 0) { + if (ret) { dev_err(&oct->pci_dev->dev, "VxLAN port add/delete failed in core (ret:0x%x)\n", ret); + if (ret > 0) + ret = -EIO; } return ret; } @@ -2851,6 +2860,7 @@ static int __liquidio_set_vf_mac(struct net_device *netdev, int vfidx, struct lio *lio = GET_LIO(netdev); struct octeon_device *oct = lio->oct_dev; struct octnic_ctrl_pkt nctrl; + int ret = 0; if (!is_valid_ether_addr(mac)) return -EINVAL; @@ -2864,12 +2874,13 @@ static int __liquidio_set_vf_mac(struct net_device *netdev, int vfidx, nctrl.ncmd.s.cmd = OCTNET_CMD_CHANGE_MACADDR; /* vfidx is 0 based, but vf_num (param1) is 1 based */ nctrl.ncmd.s.param1 = vfidx + 1; - nctrl.ncmd.s.param2 = (is_admin_assigned ? 1 : 0); nctrl.ncmd.s.more = 1; nctrl.iq_no = lio->linfo.txpciq[0].s.q_no; nctrl.netpndev = (u64)netdev; - nctrl.cb_fn = liquidio_link_ctrl_cmd_completion; - nctrl.wait_time = LIO_CMD_WAIT_TM; + if (is_admin_assigned) { + nctrl.ncmd.s.param2 = true; + nctrl.cb_fn = liquidio_link_ctrl_cmd_completion; + } nctrl.udd[0] = 0; /* The MAC Address is presented in network byte order. */ @@ -2877,9 +2888,11 @@ static int __liquidio_set_vf_mac(struct net_device *netdev, int vfidx, oct->sriov_info.vf_macaddr[vfidx] = nctrl.udd[0]; - octnet_send_nic_ctrl_pkt(oct, &nctrl); + ret = octnet_send_nic_ctrl_pkt(oct, &nctrl); + if (ret > 0) + ret = -EIO; - return 0; + return ret; } static int liquidio_set_vf_mac(struct net_device *netdev, int vfidx, u8 *mac) @@ -2905,6 +2918,7 @@ static int liquidio_set_vf_vlan(struct net_device *netdev, int vfidx, struct octeon_device *oct = lio->oct_dev; struct octnic_ctrl_pkt nctrl; u16 vlantci; + int ret = 0; if (vfidx < 0 || vfidx >= oct->sriov_info.num_vfs_alloced) return -EINVAL; @@ -2936,13 +2950,17 @@ static int liquidio_set_vf_vlan(struct net_device *netdev, int vfidx, nctrl.ncmd.s.more = 0; nctrl.iq_no = lio->linfo.txpciq[0].s.q_no; nctrl.cb_fn = NULL; - nctrl.wait_time = LIO_CMD_WAIT_TM; - octnet_send_nic_ctrl_pkt(oct, &nctrl); + ret = octnet_send_nic_ctrl_pkt(oct, &nctrl); + if (ret) { + if (ret > 0) + ret = -EIO; + return ret; + } oct->sriov_info.vf_vlantci[vfidx] = vlantci; - return 0; + return ret; } static int liquidio_get_vf_config(struct net_device *netdev, int vfidx, @@ -3063,6 +3081,7 @@ static int liquidio_set_vf_link_state(struct net_device *netdev, int vfidx, struct lio *lio = GET_LIO(netdev); struct octeon_device *oct = lio->oct_dev; struct octnic_ctrl_pkt nctrl; + int ret = 0; if (vfidx < 0 || vfidx >= oct->sriov_info.num_vfs_alloced) return -EINVAL; @@ -3078,13 +3097,15 @@ static int liquidio_set_vf_link_state(struct net_device *netdev, int vfidx, nctrl.ncmd.s.more = 0; nctrl.iq_no = lio->linfo.txpciq[0].s.q_no; nctrl.cb_fn = NULL; - nctrl.wait_time = LIO_CMD_WAIT_TM; - octnet_send_nic_ctrl_pkt(oct, &nctrl); + ret = octnet_send_nic_ctrl_pkt(oct, &nctrl); - oct->sriov_info.vf_linkstate[vfidx] = linkstate; + if (!ret) + oct->sriov_info.vf_linkstate[vfidx] = linkstate; + else if (ret > 0) + ret = -EIO; - return 0; + return ret; } static int diff --git a/drivers/net/ethernet/cavium/liquidio/lio_vf_main.c b/drivers/net/ethernet/cavium/liquidio/lio_vf_main.c index 59c2dd9..f6bed6e 100644 --- a/drivers/net/ethernet/cavium/liquidio/lio_vf_main.c +++ b/drivers/net/ethernet/cavium/liquidio/lio_vf_main.c @@ -1119,10 +1119,9 @@ static void liquidio_set_mcast_list(struct net_device *netdev) /* Apparently, any activity in this call from the kernel has to * be atomic. So we won't wait for response. */ - nctrl.wait_time = 0; ret = octnet_send_nic_ctrl_pkt(lio->oct_dev, &nctrl); - if (ret < 0) { + if (ret) { dev_err(&oct->pci_dev->dev, "DEVFLAGS change failed in core (ret: 0x%x)\n", ret); } @@ -1159,8 +1158,6 @@ static int liquidio_set_mac(struct net_device *netdev, void *p) nctrl.ncmd.s.more = 1; nctrl.iq_no = lio->linfo.txpciq[0].s.q_no; nctrl.netpndev = (u64)netdev; - nctrl.cb_fn = liquidio_link_ctrl_cmd_completion; - nctrl.wait_time = 100; nctrl.udd[0] = 0; /* The MAC Address is presented in network byte order. */ @@ -1171,6 +1168,7 @@ static int liquidio_set_mac(struct net_device *netdev, void *p) dev_err(&oct->pci_dev->dev, "MAC Address change failed\n"); return -ENOMEM; } + memcpy(netdev->dev_addr, addr->sa_data, netdev->addr_len); ether_addr_copy(((u8 *)&lio->linfo.hw_addr) + 2, addr->sa_data); @@ -1664,8 +1662,6 @@ liquidio_vlan_rx_add_vid(struct net_device *netdev, struct lio *lio = GET_LIO(netdev); struct octeon_device *oct = lio->oct_dev; struct octnic_ctrl_pkt nctrl; - struct completion compl; - u16 response_code; int ret = 0; memset(&nctrl, 0, sizeof(struct octnic_ctrl_pkt)); @@ -1674,26 +1670,15 @@ liquidio_vlan_rx_add_vid(struct net_device *netdev, nctrl.ncmd.s.cmd = OCTNET_CMD_ADD_VLAN_FILTER; nctrl.ncmd.s.param1 = vid; nctrl.iq_no = lio->linfo.txpciq[0].s.q_no; - nctrl.wait_time = 100; nctrl.netpndev = (u64)netdev; nctrl.cb_fn = liquidio_link_ctrl_cmd_completion; - init_completion(&compl); - nctrl.completion = &compl; - nctrl.response_code = &response_code; ret = octnet_send_nic_ctrl_pkt(lio->oct_dev, &nctrl); - if (ret < 0) { + if (ret) { dev_err(&oct->pci_dev->dev, "Add VLAN filter failed in core (ret: 0x%x)\n", ret); - return -EIO; - } - - if (!wait_for_completion_timeout(&compl, - msecs_to_jiffies(nctrl.wait_time))) - return -EPERM; - - if (READ_ONCE(response_code)) return -EPERM; + } return 0; } @@ -1713,14 +1698,15 @@ liquidio_vlan_rx_kill_vid(struct net_device *netdev, nctrl.ncmd.s.cmd = OCTNET_CMD_DEL_VLAN_FILTER; nctrl.ncmd.s.param1 = vid; nctrl.iq_no = lio->linfo.txpciq[0].s.q_no; - nctrl.wait_time = 100; nctrl.netpndev = (u64)netdev; nctrl.cb_fn = liquidio_link_ctrl_cmd_completion; ret = octnet_send_nic_ctrl_pkt(lio->oct_dev, &nctrl); - if (ret < 0) { + if (ret) { dev_err(&oct->pci_dev->dev, "Del VLAN filter failed in core (ret: 0x%x)\n", ret); + if (ret > 0) + ret = -EIO; } return ret; } @@ -1746,14 +1732,15 @@ static int liquidio_set_rxcsum_command(struct net_device *netdev, int command, nctrl.ncmd.s.cmd = command; nctrl.ncmd.s.param1 = rx_cmd; nctrl.iq_no = lio->linfo.txpciq[0].s.q_no; - nctrl.wait_time = 100; nctrl.netpndev = (u64)netdev; nctrl.cb_fn = liquidio_link_ctrl_cmd_completion; ret = octnet_send_nic_ctrl_pkt(lio->oct_dev, &nctrl); - if (ret < 0) { + if (ret) { dev_err(&oct->pci_dev->dev, "DEVFLAGS RXCSUM change failed in core (ret:0x%x)\n", ret); + if (ret > 0) + ret = -EIO; } return ret; } @@ -1781,15 +1768,16 @@ static int liquidio_vxlan_port_command(struct net_device *netdev, int command, nctrl.ncmd.s.more = vxlan_cmd_bit; nctrl.ncmd.s.param1 = vxlan_port; nctrl.iq_no = lio->linfo.txpciq[0].s.q_no; - nctrl.wait_time = 100; nctrl.netpndev = (u64)netdev; nctrl.cb_fn = liquidio_link_ctrl_cmd_completion; ret = octnet_send_nic_ctrl_pkt(lio->oct_dev, &nctrl); - if (ret < 0) { + if (ret) { dev_err(&oct->pci_dev->dev, "DEVFLAGS VxLAN port add/delete failed in core (ret : 0x%x)\n", ret); + if (ret > 0) + ret = -EIO; } return ret; } diff --git a/drivers/net/ethernet/cavium/liquidio/octeon_nic.c b/drivers/net/ethernet/cavium/liquidio/octeon_nic.c index b7364bb..676fe0b 100644 --- a/drivers/net/ethernet/cavium/liquidio/octeon_nic.c +++ b/drivers/net/ethernet/cavium/liquidio/octeon_nic.c @@ -91,29 +91,6 @@ int octnet_send_nic_data_pkt(struct octeon_device *oct, ndata->reqtype); } -static void octnet_link_ctrl_callback(struct octeon_device *oct, - u32 status, - void *sc_ptr) -{ - struct octeon_soft_command *sc = (struct octeon_soft_command *)sc_ptr; - struct octnic_ctrl_pkt *nctrl; - - nctrl = (struct octnic_ctrl_pkt *)sc->ctxptr; - - /* Call the callback function if status is zero (meaning OK) or status - * contains a firmware status code bigger than zero (meaning the - * firmware is reporting an error). - * If no response was expected, status is OK if the command was posted - * successfully. - */ - if ((!status || status > FIRMWARE_STATUS_CODE(0)) && nctrl->cb_fn) { - nctrl->status = status; - nctrl->cb_fn(nctrl); - } - - octeon_free_soft_command(oct, sc); -} - static inline struct octeon_soft_command *octnic_alloc_ctrl_pkt_sc(struct octeon_device *oct, struct octnic_ctrl_pkt *nctrl) @@ -126,17 +103,14 @@ static inline struct octeon_soft_command uddsize = (u32)(nctrl->ncmd.s.more * 8); datasize = OCTNET_CMD_SIZE + uddsize; - rdatasize = (nctrl->wait_time) ? 16 : 0; + rdatasize = 16; sc = (struct octeon_soft_command *) - octeon_alloc_soft_command(oct, datasize, rdatasize, - sizeof(struct octnic_ctrl_pkt)); + octeon_alloc_soft_command(oct, datasize, rdatasize, 0); if (!sc) return NULL; - memcpy(sc->ctxptr, nctrl, sizeof(struct octnic_ctrl_pkt)); - data = (u8 *)sc->virtdptr; memcpy(data, &nctrl->ncmd, OCTNET_CMD_SIZE); @@ -153,9 +127,8 @@ static inline struct octeon_soft_command octeon_prepare_soft_command(oct, sc, OPCODE_NIC, OPCODE_NIC_CMD, 0, 0, 0); - sc->callback = octnet_link_ctrl_callback; - sc->callback_arg = sc; - sc->wait_time = nctrl->wait_time; + init_completion(&sc->complete); + sc->sc_status = OCTEON_REQUEST_PENDING; return sc; } @@ -198,5 +171,26 @@ octnet_send_nic_ctrl_pkt(struct octeon_device *oct, } spin_unlock_bh(&oct->cmd_resp_wqlock); + + switch (nctrl->ncmd.s.cmd) { + /* caller holds lock, can not sleep */ + case OCTNET_CMD_CHANGE_DEVFLAGS: + case OCTNET_CMD_SET_MULTI_LIST: + case OCTNET_CMD_SET_UC_LIST: + WRITE_ONCE(sc->caller_is_done, true); + return retval; + } + + retval = wait_for_sc_completion_timeout(oct, sc, 0); + if (retval) + return (retval); + + nctrl->sc_status = sc->sc_status; + retval = nctrl->sc_status; + if (nctrl->cb_fn) + nctrl->cb_fn(nctrl); + + WRITE_ONCE(sc->caller_is_done, true); + return retval; } diff --git a/drivers/net/ethernet/cavium/liquidio/octeon_nic.h b/drivers/net/ethernet/cavium/liquidio/octeon_nic.h index de4130d..87dd6f8 100644 --- a/drivers/net/ethernet/cavium/liquidio/octeon_nic.h +++ b/drivers/net/ethernet/cavium/liquidio/octeon_nic.h @@ -52,20 +52,13 @@ struct octnic_ctrl_pkt { /** Input queue to use to send this command. */ u64 iq_no; - /** Time to wait for Octeon software to respond to this control command. - * If wait_time is 0, OSI assumes no response is expected. - */ - size_t wait_time; - /** The network device that issued the control command. */ u64 netpndev; /** Callback function called when the command has been fetched */ octnic_ctrl_pkt_cb_fn_t cb_fn; - u32 status; - u16 *response_code; - struct completion *completion; + u32 sc_status; }; #define MAX_UDD_SIZE(nctrl) (sizeof((nctrl)->udd))