From patchwork Wed Aug 29 01:51:35 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Manlunas, Felix" X-Patchwork-Id: 963210 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="EDKinFGL"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 420TBp5p55z9s4s for ; Wed, 29 Aug 2018 11:52:02 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727182AbeH2FqY (ORCPT ); Wed, 29 Aug 2018 01:46:24 -0400 Received: from mail-bn3nam01on0054.outbound.protection.outlook.com ([104.47.33.54]:7776 "EHLO NAM01-BN3-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1726858AbeH2FqY (ORCPT ); Wed, 29 Aug 2018 01:46:24 -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=C6nOuHJGG1QTyJyd2krAfcTcL0/eTlsI1wiewdhgg4k=; b=EDKinFGLrPPlxv14wXfFneqbiQg51NmgI2QGGPMsHM/adQbelsRTrKCQ1t+oi3RuiwWnSXQW+GX7POfbmhfEKGufJ1EgaxEH/vpWofa6gpp3nBo+Ba0tpYMUUWptfS5lf9Nf2e2SLvvpx0Df+0ZpTyi4vXyaVeg2Qh0XgpPr3AI= Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=Felix.Manlunas@cavium.com; Received: from localhost (50.233.148.155) by BN6PR07MB2817.namprd07.prod.outlook.com (2603:10b6:404:40::11) 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:38 +0000 Date: Tue, 28 Aug 2018 18:51:35 -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 2/4] liquidio: make soft command calls synchronous Message-ID: <20180829015135.GA7926@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: SN6PR0102CA0029.prod.exchangelabs.com (2603:10b6:805:1::42) To BN6PR07MB2817.namprd07.prod.outlook.com (2603:10b6:404:40::11) X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: f8a583ad-54a2-4ebb-cf05-08d60d51f600 X-Microsoft-Antispam: BCL:0; PCL:0; RULEID:(7020095)(4652040)(8989137)(5600074)(711020)(4534165)(4627221)(201703031133081)(201702281549075)(8990107)(2017052603328)(7153060)(7193020); SRVR:BN6PR07MB2817; X-Microsoft-Exchange-Diagnostics: 1; BN6PR07MB2817; 3:ZUF+SZqFGfsnc4il5b/mQBNSkq5rFZMqIeof3yHmDbhcBJT+h/ou2AY3J1mUw409c4ciI/6ZL8RH/bOvfuFi0oivj+RjJnsTzlWuBqmnK/ifh/DXmugNR3bK2I/h8KePUPbc2BIn1PIL/ZUlpdF2EvPx1Ss8CrkWPPgq6QPpM0cbnIrobCarPl1qbSW0z8qttGbJkHha+8ng74GPJ3ixdrYwkiLa5ScAsSBhIi0kGQ8mcjBa4KJfWGOCYztra42r; 25:pJjTZUcclScPmqigdj0oaEzJd+rhrNaxIBy4Q5F+AqlYIfX8fx3K023S2CshpesYj9BqSDbUYDn7gFc7pJ9UpZxYjKOrPt6hd59djld4s4zPIG6rJ2iTKPMbln05fgjXWi+AHiUaFnpxu2OBHRGWRn/8Z+22CFpSR0du+u3H6LqcjUyxw+tBlg5LbG8UEO7Cw+F2cUxGQez4x+h+COYxtPG4Uz9lf4yK9ipafA9KDvwgznvMWgtR6BXpdfhJHpwo85iWm05yWDAjZ3YovB8JbcldTdwNzeBSHtBSaDs9lQYsXTdLjCDw6TjhGaznM/NyyNahyy/1Cd/svvbftUa2qQ==; 31:TogiMG+OqtPNFMnaCIHZ1sXy5nUNz1TIg2aoI8xsSw0nmwQFdPkMAw0jsGrmuGB68NBRReFr7GY7mRRdQoanwi1SLa3MIJ1oVfWJBHGVHnF6WMZvjo16FS0dFi9lys/CsQWomBjk0uRs+CFW0Ajbyf3c+Ua9gcRCXCz/holOAHDLQCT4v4biaEUioq42By84IGhZWBrKlZy9bXlttqnRevfqCwGt91Or1lhd39TdLqM= X-MS-TrafficTypeDiagnostic: BN6PR07MB2817: X-Microsoft-Exchange-Diagnostics: 1; BN6PR07MB2817; 20:GYERwBYilldOyT0OrowHJ+JgqjCjEgDWuqor0oEOkYyByrvc+pCg8IK18yKkNDENFhMyt5agmyKHBpg7BYRx1cdRCMEPScsBe94ZaOjK7DD7Y0arG1Kcz5hmGA4hD8caD9k9bhkmAc8SVBw8jfvXxRwfosWlS5vr0A4Y1zrlcZAQ/cEPI9JIU17NtkQTd1faHfH/kZU0IdcWu2FsTIqHy+C8Y2uzkBsUQTQYTSLOm7RE8IEi7KaL81z/CTFdN0dAngFG4khM3bYn4fmXV/k7U0qNGDZLboOD2CWOsoiGdOTcEB0zQxV1bgt0UyohfXigxtb9NIxnSJsHFZPy03NbFqnpf1jTtdi9s8QiZ9zSORofw9I1+iVVWV/5mJkWTVyt08xb/xwkHDCrzKybsmKwTgmTMwoETaP7OVtiBdNHnHEzb+Re4B/D3zR5X+wwZd1u4HOZWPHjqTMb8t3aF9k588CmJaEMY36p79aejIrLbDkVbxGGAmQxY4Dhb9Y9zzFV; 4:2GyptkB2+PvVJdbyo6SLGsLOqlX5+3pQZ/BAO9TqwlspNz+Tvbg6Wn0RsQY5oTIY/+mgcNkYeV8qFJWZHt9zNhRmjYqQd1+sESmfKQbMrMqQ5F8UM73tSkFf4zUKqv2155Mk2Y4yjCQNBteqRbTHMEmR3p9l9OEgV9U/hvZW+3pA9UrFmOKoxtqPoc/CeIaJv4jqeGmkpzj6zsywp14PF3rcNkPnrVhaehHHLWfJBID3qjbSzBBwRwZyGdrZW2soQYehiDK19DoFW+XV1+8skw== 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)(3231311)(944501410)(52105095)(93006095)(93001095)(10201501046)(3002001)(149027)(150027)(6041310)(20161123560045)(20161123558120)(20161123564045)(20161123562045)(201703131423095)(201702281528075)(20161123555045)(201703061421075)(201703061406153)(201708071742011)(7699016); SRVR:BN6PR07MB2817; BCL:0; PCL:0; RULEID:; SRVR:BN6PR07MB2817; X-Forefront-PRVS: 077929D941 X-Forefront-Antispam-Report: SFV:NSPM; SFS:(10009020)(6069001)(366004)(376002)(346002)(39860400002)(136003)(396003)(199004)(189003)(86362001)(3846002)(476003)(26005)(478600001)(6916009)(81156014)(66066001)(105586002)(5660300001)(47776003)(2361001)(486006)(44832011)(107886003)(6666003)(53936002)(7736002)(8676002)(2351001)(8936002)(81166006)(305945005)(68736007)(58126008)(16526019)(316002)(186003)(33656002)(25786009)(106356001)(72206003)(97736004)(52116002)(14444005)(4326008)(16586007)(6496006)(50466002)(76506005)(23726003)(386003)(76176011)(575784001)(6116002)(6486002)(956004)(11346002)(2906002)(1076002)(446003)(18370500001); DIR:OUT; SFP:1101; SCL:1; SRVR:BN6PR07MB2817; 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; BN6PR07MB2817; 23:yP7E+30v+7xcDefveDvft1WY1NLE+4Q0m8F1z9ngp9pAz5Ch+JKh1ClRQ73372bBcRtbml9K6l6iLtNezTAiUbHvuTQWAHss8cbzCvG0A33UwxX5iIEe1U4cOokYUh9ehhdF3BYb0G+2ZSb6UC2NQ6bUMxFYRFaHJ7Dq6qESwdSB5Aq/x/dQ+LGIs90FCe+IAIf3EykMchqNWAWyi5gd+gNM5otv2uhUFdr8mtAirS9bYrtFcdskqvy8gEApa5+7uNonaMJp/t9k1khQ8seDmENdHjzKn4ny5TdRC3z1G6xzdXJPPG4BsgZSPUvxO48ULer/vpt0BurD+MgXtvJCxK/VL6E1iaGhnb0zCW9UwxvT2tyc0WHE0M1LI7dxqzj+MvbA6MmCJsRPYLxStSwWw/YNK5ejlxdo2Vm3jg4VJJ5CF9tmzZA+OpwCiVgAnifOUJlQ0rEBKKoRX4hFacoViAzL/1n/7nYkJNf2D7g8ocwoEW4H2lzT23/bKUS4SgQPnLUjXMBO2vTlVzf8J9pxi57mEzPmq+8a5uv+DEuyX+V5qrnrWqsk7MIhkVZwPJ7ZFGfdpVXhepIYWBUFUa2WGYXqaT7rAGpb1xBSS1jyliYgX9old2gXVF7l5QvrFfe4+m2JwAGEDuTZEW6RZjQf8uUOA3rI2bFtRC8MQ2AEleJ/2TVcyNmTkG+dyWn/qTykHbxZM8nI6j6tdAWry6vi+iZeKqzaBtgHLL2z6kxArEMBD4QC17SPFMX8wTNXdXgj8myjblpIwJOkpLXNCIc/W8jVjvbn2B58DpiSUrHFtbT+e5hFPYVWtUWJ7xVX47P/w25X1MW/kzTRC6lsc5Aupf50T5EIYDG7AO7VP39RjCDMfXI69oHp2Pf7o+Jr1AR0e+sCUk0nH8v65qVQktmH7JzF2AN6UXnVeZjOvjZ+Bj7jtgw16DlaJPRTCkGspwoIzI7YXvCe1JtlzM7nBG2Htb9L3xdguNA3TDVD4bfPEo2kca3pSHCBgLjWQvtgY0gm7QwOa+tikrguMtnReoE4L2Qyzi6ws/k3hm0YTco9jZkLblv78Xaj29jw70rC6Npuo4fwwhgUH4gCSpbR5xVq0Lr1cJQHIRk/H/RrvlYNyJpkN74fzVMtSkPth7/+4ibH5cjxugQS+KU0QsRc9TWiRC6hRXNQt//HW5RGAw0sYWI66KdZE6HaMmpl2+FZI70uN02A4oZpKcL3fHfW6uAsw/cxmUML5FJItNphy6s+l4J5yA9ZgwUXAZYxAu/JGNVT/U1gsBKQ8K21eZgsznXlvOA2liBsaNYWYBgO8zVn/ZrN/C3ZLYVdEfklEXDZwiHc X-Microsoft-Antispam-Message-Info: 52xZmroEUPyFU9ChabE+ZVw1nQE988eT3m6vygpaNXMq8pjIeszo7AhMk8KW3zyri6nEAvm4ml4yS0baYzHr0I5QQ/W+VfUDrTa3tkUVRho/q4RV70FmI+YUnPEa9M7J1te3NQgeVnv+dNAE/QilFGsAXtExo3zBzOmIgg3JM9iCLq0kFGRwAzqrWp3itJ/BVcwTDD6v2oVhBprfxdpbprrrEZuVk6Cj20UiPsHrxuwxBM6v7ejlGb3cFqj+4iU/KyE4yoVK/VB//HCnSFbYVWvm0pbcbkBHTTi/HUwIs+5SHdbNgke9dXJ6jra4oZI7QRCno3RwB6HfuFRdPSoy57s2ka9Eb5D/xswFP7GWOBQ= X-Microsoft-Exchange-Diagnostics: 1; BN6PR07MB2817; 6:aFeh9wFaZMa5yEI4DCVmmp7ajSUN/s+BZyOzsSWsoVsAhR29kQmEHz9SwUMZoukcNYEn3H4N4sf6ecIpkPljov7ZSdzb2XDx/UxX2GOsT6WCi0tEjzy9K7CExvmV8dsMd48ABYgnEiMF3iwC/4GZBeMdPnkHdkK46HZGAtbolpXunKZ6FHNnKq9z0Zh0AJPjsxoZv1G2ou0aDKJQq/M9PnuqP4b8kJTK7nvp3uAnqScXkJH+3zX78J9causvs1mtwOV2VScxntECQmn0DfsVxHKC44DjQOz60llRStxJX03P0rNiprGUqexagdQS4Mg3ewCdykr7N/54J13ZhZb6XSxNl9d/3PfGHbMKl/XQGG00f17vElQEBjrhCStS4sA3QpH3/vR+xNkDzwkWe623BoVKMoopCbe019SlVwyJxvrAcIdqfEKsqMcm9MrtIeXI4Xq8oIwVFBEoYmNbi2mm/A==; 5:uQTCoFYeVcEiGzp0JRcWu6XFTaI2DLZxkmJTx9BB3nglx4SR3y2O9XvS0ODCchTKpF20mrxqJkp6vHGMT8ZKVHAPccwCpj9NiCW2Th+a1phS3RV8L6ToIUpSoMDVJTLKyYVgpLD1SCssFQ6GYLaHHAcfngSbMQA3lKG6wTOP0M8=; 7:ETAxO4+P5tYpq2nsVKcbzV79uCcg+sJtlMzwh1SkgXTQIV75wIyzI/J2/Rh0ST271Vb6f1NIvtb8hCDqSkq5JuTzpLuneNf2OgmEevUDK/sxDo3EY6LHhcwtoO2tznnYrTZ9LfLHGh4y6M2OePT9RCHovt4xmEHa4o1GL/GeL9KqHCSJ2C3pdI5TM4Q5pXGBujoZYKK0skzORIUEZhkEbQ08Xeid5cE6yqoLldE7xGwHE9/IsgQDWnCqNZrQFhsI SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-OriginatorOrg: cavium.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 29 Aug 2018 01:51:38.8272 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: f8a583ad-54a2-4ebb-cf05-08d60d51f600 X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 711e4ccf-2e9b-4bcf-a551-4094005b6194 X-MS-Exchange-Transport-CrossTenantHeadersStamped: BN6PR07MB2817 Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org 1. Add wait_for_sc_completion_timeout() for waiting the response and handling common response errors 2. Send sc's synchronously: remove unused callback function, and context structure; use wait_for_sc_completion_timeout() to wait its response. Signed-off-by: Weilin Chang Signed-off-by: Felix Manlunas --- drivers/net/ethernet/cavium/liquidio/lio_core.c | 134 ++++++--------------- drivers/net/ethernet/cavium/liquidio/lio_main.c | 42 ++----- drivers/net/ethernet/cavium/liquidio/lio_vf_rep.c | 42 ++----- drivers/net/ethernet/cavium/liquidio/octeon_main.h | 66 ++++++++++ .../net/ethernet/cavium/liquidio/octeon_network.h | 6 - 5 files changed, 129 insertions(+), 161 deletions(-) diff --git a/drivers/net/ethernet/cavium/liquidio/lio_core.c b/drivers/net/ethernet/cavium/liquidio/lio_core.c index 8093c5e..822ce0f 100644 --- a/drivers/net/ethernet/cavium/liquidio/lio_core.c +++ b/drivers/net/ethernet/cavium/liquidio/lio_core.c @@ -1333,8 +1333,6 @@ octnet_nic_stats_callback(struct octeon_device *oct_dev, struct octeon_soft_command *sc = (struct octeon_soft_command *)ptr; struct oct_nic_stats_resp *resp = (struct oct_nic_stats_resp *)sc->virtrptr; - struct oct_nic_stats_ctrl *ctrl = - (struct oct_nic_stats_ctrl *)sc->ctxptr; struct nic_rx_stats *rsp_rstats = &resp->stats.fromwire; struct nic_tx_stats *rsp_tstats = &resp->stats.fromhost; struct nic_rx_stats *rstats = &oct_dev->link_stats.fromwire; @@ -1424,7 +1422,6 @@ octnet_nic_stats_callback(struct octeon_device *oct_dev, } else { resp->status = -1; } - complete(&ctrl->complete); } int octnet_get_link_stats(struct net_device *netdev) @@ -1432,7 +1429,6 @@ int octnet_get_link_stats(struct net_device *netdev) struct lio *lio = GET_LIO(netdev); struct octeon_device *oct_dev = lio->oct_dev; struct octeon_soft_command *sc; - struct oct_nic_stats_ctrl *ctrl; struct oct_nic_stats_resp *resp; int retval; @@ -1441,7 +1437,7 @@ int octnet_get_link_stats(struct net_device *netdev) octeon_alloc_soft_command(oct_dev, 0, sizeof(struct oct_nic_stats_resp), - sizeof(struct octnic_ctrl_pkt)); + 0); if (!sc) return -ENOMEM; @@ -1449,66 +1445,39 @@ int octnet_get_link_stats(struct net_device *netdev) resp = (struct oct_nic_stats_resp *)sc->virtrptr; memset(resp, 0, sizeof(struct oct_nic_stats_resp)); - ctrl = (struct oct_nic_stats_ctrl *)sc->ctxptr; - memset(ctrl, 0, sizeof(struct oct_nic_stats_ctrl)); - ctrl->netdev = netdev; - init_completion(&ctrl->complete); + init_completion(&sc->complete); + sc->sc_status = OCTEON_REQUEST_PENDING; sc->iq_no = lio->linfo.txpciq[0].s.q_no; octeon_prepare_soft_command(oct_dev, sc, OPCODE_NIC, OPCODE_NIC_PORT_STATS, 0, 0, 0); - sc->callback = octnet_nic_stats_callback; - sc->callback_arg = sc; - sc->wait_time = 500; /*in milli seconds*/ - retval = octeon_send_soft_command(oct_dev, sc); if (retval == IQ_SEND_FAILED) { octeon_free_soft_command(oct_dev, sc); return -EINVAL; } - wait_for_completion_timeout(&ctrl->complete, msecs_to_jiffies(1000)); - - if (resp->status != 1) { - octeon_free_soft_command(oct_dev, sc); - - return -EINVAL; + retval = wait_for_sc_completion_timeout(oct_dev, sc, + (2 * LIO_SC_MAX_TMO_MS)); + if (retval) { + dev_err(&oct_dev->pci_dev->dev, "sc OPCODE_NIC_PORT_STATS command failed\n"); + return retval; } - octeon_free_soft_command(oct_dev, sc); + octnet_nic_stats_callback(oct_dev, sc->sc_status, sc); + WRITE_ONCE(sc->caller_is_done, true); 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; @@ -1521,21 +1490,18 @@ int liquidio_set_speed(struct lio *lio, int speed) 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); + 0); 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); + init_completion(&sc->complete); + sc->sc_status = OCTEON_REQUEST_PENDING; ncmd->u64 = 0; ncmd->s.cmd = SEAPI_CMD_SPEED_SET; @@ -1548,30 +1514,24 @@ int liquidio_set_speed(struct lio *lio, int speed) 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"); + octeon_free_soft_command(oct, sc); 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 = wait_for_sc_completion_timeout(oct, sc, 0); + if (retval) + return retval; retval = resp->status; if (retval) { dev_err(&oct->pci_dev->dev, "%s failed, retval=%d\n", __func__, retval); - octeon_free_soft_command(oct, sc); + WRITE_ONCE(sc->caller_is_done, true); + return -EIO; } @@ -1583,38 +1543,32 @@ int liquidio_set_speed(struct lio *lio, int speed) } oct->speed_setting = var; + WRITE_ONCE(sc->caller_is_done, true); } - 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); + 0); 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); + init_completion(&sc->complete); + sc->sc_status = OCTEON_REQUEST_PENDING; ncmd->u64 = 0; ncmd->s.cmd = SEAPI_CMD_SPEED_GET; @@ -1626,37 +1580,20 @@ int liquidio_get_speed(struct lio *lio) 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; + octeon_free_soft_command(oct, sc); + retval = -EIO; } 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; + retval = wait_for_sc_completion_timeout(oct, sc, 0); + if (retval) + return retval; - 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; @@ -1664,16 +1601,23 @@ int liquidio_get_speed(struct lio *lio) 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; + if (oct->subsystem_id == + OCTEON_CN2350_25GB_SUBSYS_ID || + oct->subsystem_id == + OCTEON_CN2360_25GB_SUBSYS_ID) { + oct->no_speed_setting = 1; + oct->speed_setting = 25; + } else { + oct->speed_setting = 10; + } } + } + WRITE_ONCE(sc->caller_is_done, true); } - octeon_free_soft_command(oct, sc); - return retval; } diff --git a/drivers/net/ethernet/cavium/liquidio/lio_main.c b/drivers/net/ethernet/cavium/liquidio/lio_main.c index 6663749..8ddc191 100644 --- a/drivers/net/ethernet/cavium/liquidio/lio_main.c +++ b/drivers/net/ethernet/cavium/liquidio/lio_main.c @@ -2969,30 +2969,15 @@ static int liquidio_get_vf_config(struct net_device *netdev, int vfidx, return 0; } -static void trusted_vf_callback(struct octeon_device *oct_dev, - u32 status, void *ptr) -{ - struct octeon_soft_command *sc = (struct octeon_soft_command *)ptr; - struct lio_trusted_vf_ctx *ctx; - - ctx = (struct lio_trusted_vf_ctx *)sc->ctxptr; - ctx->status = status; - - complete(&ctx->complete); -} - static int liquidio_send_vf_trust_cmd(struct lio *lio, int vfidx, bool trusted) { struct octeon_device *oct = lio->oct_dev; - struct lio_trusted_vf_ctx *ctx; struct octeon_soft_command *sc; - int ctx_size, retval; - - ctx_size = sizeof(struct lio_trusted_vf_ctx); - sc = octeon_alloc_soft_command(oct, 0, 0, ctx_size); + int retval; - ctx = (struct lio_trusted_vf_ctx *)sc->ctxptr; - init_completion(&ctx->complete); + sc = octeon_alloc_soft_command(oct, 0, 16, 0); + if (!sc) + return -ENOMEM; sc->iq_no = lio->linfo.txpciq[0].s.q_no; @@ -3001,23 +2986,21 @@ static int liquidio_send_vf_trust_cmd(struct lio *lio, int vfidx, bool trusted) OPCODE_NIC_SET_TRUSTED_VF, 0, vfidx + 1, trusted); - sc->callback = trusted_vf_callback; - sc->callback_arg = sc; - sc->wait_time = 1000; + init_completion(&sc->complete); + sc->sc_status = OCTEON_REQUEST_PENDING; retval = octeon_send_soft_command(oct, sc); if (retval == IQ_SEND_FAILED) { + octeon_free_soft_command(oct, sc); retval = -1; } else { /* Wait for response or timeout */ - if (wait_for_completion_timeout(&ctx->complete, - msecs_to_jiffies(2000))) - retval = ctx->status; - else - retval = -1; - } + retval = wait_for_sc_completion_timeout(oct, sc, 0); + if (retval) + return (retval); - octeon_free_soft_command(oct, sc); + WRITE_ONCE(sc->caller_is_done, true); + } return retval; } @@ -3733,7 +3716,6 @@ static int setup_nic_devices(struct octeon_device *octeon_dev) 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_rep.c b/drivers/net/ethernet/cavium/liquidio/lio_vf_rep.c index ddd7431..dfd4d10 100644 --- a/drivers/net/ethernet/cavium/liquidio/lio_vf_rep.c +++ b/drivers/net/ethernet/cavium/liquidio/lio_vf_rep.c @@ -49,44 +49,25 @@ static const struct net_device_ops lio_vf_rep_ndev_ops = { .ndo_change_mtu = lio_vf_rep_change_mtu, }; -static void -lio_vf_rep_send_sc_complete(struct octeon_device *oct, - u32 status, void *ptr) -{ - struct octeon_soft_command *sc = (struct octeon_soft_command *)ptr; - struct lio_vf_rep_sc_ctx *ctx = - (struct lio_vf_rep_sc_ctx *)sc->ctxptr; - struct lio_vf_rep_resp *resp = - (struct lio_vf_rep_resp *)sc->virtrptr; - - if (status != OCTEON_REQUEST_TIMEOUT && READ_ONCE(resp->status)) - WRITE_ONCE(resp->status, 0); - - complete(&ctx->complete); -} - static int lio_vf_rep_send_soft_command(struct octeon_device *oct, void *req, int req_size, void *resp, int resp_size) { int tot_resp_size = sizeof(struct lio_vf_rep_resp) + resp_size; - int ctx_size = sizeof(struct lio_vf_rep_sc_ctx); struct octeon_soft_command *sc = NULL; struct lio_vf_rep_resp *rep_resp; - struct lio_vf_rep_sc_ctx *ctx; void *sc_req; int err; sc = (struct octeon_soft_command *) octeon_alloc_soft_command(oct, req_size, - tot_resp_size, ctx_size); + tot_resp_size, 0); if (!sc) return -ENOMEM; - ctx = (struct lio_vf_rep_sc_ctx *)sc->ctxptr; - memset(ctx, 0, ctx_size); - init_completion(&ctx->complete); + init_completion(&sc->complete); + sc->sc_status = OCTEON_REQUEST_PENDING; sc_req = (struct lio_vf_rep_req *)sc->virtdptr; memcpy(sc_req, req, req_size); @@ -98,23 +79,24 @@ lio_vf_rep_send_soft_command(struct octeon_device *oct, sc->iq_no = 0; octeon_prepare_soft_command(oct, sc, OPCODE_NIC, OPCODE_NIC_VF_REP_CMD, 0, 0, 0); - sc->callback = lio_vf_rep_send_sc_complete; - sc->callback_arg = sc; - sc->wait_time = LIO_VF_REP_REQ_TMO_MS; err = octeon_send_soft_command(oct, sc); if (err == IQ_SEND_FAILED) goto free_buff; - wait_for_completion_timeout(&ctx->complete, - msecs_to_jiffies - (2 * LIO_VF_REP_REQ_TMO_MS)); + err = wait_for_sc_completion_timeout(oct, sc, 0); + if (err) + return err; + err = READ_ONCE(rep_resp->status) ? -EBUSY : 0; if (err) dev_err(&oct->pci_dev->dev, "VF rep send config failed\n"); - - if (resp) + else if (resp) memcpy(resp, (rep_resp + 1), resp_size); + + WRITE_ONCE(sc->caller_is_done, true); + return err; + free_buff: octeon_free_soft_command(oct, sc); diff --git a/drivers/net/ethernet/cavium/liquidio/octeon_main.h b/drivers/net/ethernet/cavium/liquidio/octeon_main.h index c846eec..de2a229 100644 --- a/drivers/net/ethernet/cavium/liquidio/octeon_main.h +++ b/drivers/net/ethernet/cavium/liquidio/octeon_main.h @@ -188,6 +188,72 @@ sleep_timeout_cond(wait_queue_head_t *wait_queue, remove_wait_queue(wait_queue, &we); } +/* input parameter: + * sc: pointer to a soft request + * timeout: milli sec which an application wants to wait for the + response of the request. + * 0: the request will wait until its response gets back + * from the firmware within LIO_SC_MAX_TMO_MS milli sec. + * It the response does not return within + * LIO_SC_MAX_TMO_MS milli sec, lio_process_ordered_list() + * will move the request to zombie response list. + * + * return value: + * 0: got the response from firmware for the sc request. + * errno -EINTR: user abort the command. + * errno -ETIME: user spefified timeout value has been expired. + * errno -EBUSY: the response of the request does not return in + * resonable time (LIO_SC_MAX_TMO_MS). + * the sc wll be move to zombie response list by + * lio_process_ordered_list() + * + * A request with non-zero return value, the sc->caller_is_done + * will be marked 1. + * When getting a request with zero return value, the requestor + * should mark sc->caller_is_done with 1 after examing the + * response of sc. + * lio_process_ordered_list() will free the soft command on behalf + * of the soft command requestor. + * This is to fix the possible race condition of both timeout process + * and lio_process_ordered_list()/callback function to free a + * sc strucutre. + */ +static inline int +wait_for_sc_completion_timeout(struct octeon_device *oct_dev, + struct octeon_soft_command *sc, + unsigned long timeout) +{ + int errno = 0; + long timeout_jiff; + + if (timeout) + timeout_jiff = msecs_to_jiffies(timeout); + else + timeout_jiff = MAX_SCHEDULE_TIMEOUT; + + timeout_jiff = + wait_for_completion_interruptible_timeout(&sc->complete, + timeout_jiff); + if (timeout_jiff == 0) { + dev_err(&oct_dev->pci_dev->dev, "%s: sc is timeout\n", + __func__); + WRITE_ONCE(sc->caller_is_done, true); + errno = -ETIME; + } else if (timeout_jiff == -ERESTARTSYS) { + dev_err(&oct_dev->pci_dev->dev, "%s: sc is interrupted\n", + __func__); + WRITE_ONCE(sc->caller_is_done, true); + errno = -EINTR; + } else if (sc->sc_status == OCTEON_REQUEST_TIMEOUT) { + dev_err(&oct_dev->pci_dev->dev, "%s: sc has fatal timeout\n", + __func__); + WRITE_ONCE(sc->caller_is_done, true); + errno = -EBUSY; + } + + return errno; +} + #ifndef ROUNDUP4 #define ROUNDUP4(val) (((val) + 3) & 0xfffffffc) #endif diff --git a/drivers/net/ethernet/cavium/liquidio/octeon_network.h b/drivers/net/ethernet/cavium/liquidio/octeon_network.h index d7a3916..a62826a 100644 --- a/drivers/net/ethernet/cavium/liquidio/octeon_network.h +++ b/drivers/net/ethernet/cavium/liquidio/octeon_network.h @@ -87,12 +87,6 @@ struct oct_nic_seapi_resp { 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. */