Received: by 2002:ac0:a582:0:0:0:0:0 with SMTP id m2-v6csp1327909imm; Tue, 2 Oct 2018 06:35:50 -0700 (PDT) X-Google-Smtp-Source: ACcGV61z0gnyIW/owaCak1nHjY/E0rPnSwEXV4h8gDr0CR/ZMEuE6nWQ3Eat1enibC/rB1kB7JZW X-Received: by 2002:a17:902:369:: with SMTP id 96-v6mr16517306pld.120.1538487350365; Tue, 02 Oct 2018 06:35:50 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1538487350; cv=none; d=google.com; s=arc-20160816; b=L+ZgpZjsBk30bXIIyKpgAdhSnvheJh/xHuFZXuxHr8cxP7bHKXE9RiZkOnbO31KTHR rSnjiZFJ4YkQM0DwiPYoOZlJ85S2MJ7iXwd8a3fdt+TbDYYQpi2KN8LXU47T0JMisEok dQI+/Ow6I/IUhKqXNFko4blgFXpk+RzqG0wby70jLQKkhMLmYOhrqT6ell9bDtbCTVJM I8pfYaaWF/sT5mCBPmq+jhuIZ/cmUtEhc0YDlouYCo40Ggg5lTpLz06afsloLk5uL7sq Royoqyj/6mpgsOcEGmO3JBKqXn57QV80UOHiYJH2e5Lu6p5PUdi4l0h/cf/OP/O9F8Hx vYJw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :user-agent:references:in-reply-to:message-id:date:subject:cc:to :from; bh=2C9fjJ7bibNDlKK6G/gD9bJ2yts71sF7f34iGJs1o3U=; b=CQVy9tyyRBR8O0sDT0CqmC3eocc9X0FxzRJVisj45R8YAcKXJHp5wMAXPIcl/w09Ef o0dToK/JQBde7Hzf5OG3AR0O5+K7uMdbhGAZq/x1CU9QOFl30i7OMutp3Udc/sLyHTLL wwT9A0jftYii+YzG2ClF2j4T6IG6SgbXyw4WRsCSyNBLiO9+tLmhYiLxPT3m3ZXoeDbr rs5c1S++gmFMUraKxj/xS0nF/Aa6J6nPMUDoGNNJjtvSr0HSf3ol5nRAWlN3h0m2sxDf Q0gabLgCyJ9xSkq3QzNpxYjmEX8FBEEeVfE4M/iGC7/eJ6l/i0w/aJA/jw3Dxn1SvQmS bvIg== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id d16-v6si3442662pgd.555.2018.10.02.06.35.35; Tue, 02 Oct 2018 06:35:50 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1732310AbeJBUSC (ORCPT + 99 others); Tue, 2 Oct 2018 16:18:02 -0400 Received: from mail.linuxfoundation.org ([140.211.169.12]:35326 "EHLO mail.linuxfoundation.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1730846AbeJBUSC (ORCPT ); Tue, 2 Oct 2018 16:18:02 -0400 Received: from localhost (24-104-73-23-ip-static.hfc.comcastbusiness.net [24.104.73.23]) by mail.linuxfoundation.org (Postfix) with ESMTPSA id 40D9B5AA; Tue, 2 Oct 2018 13:34:37 +0000 (UTC) From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Tomer Tayar , Ariel Elior , "David S. Miller" , Sasha Levin Subject: [PATCH 4.14 114/137] qed: Wait for MCP halt and resume commands to take place Date: Tue, 2 Oct 2018 06:25:15 -0700 Message-Id: <20181002132506.487253236@linuxfoundation.org> X-Mailer: git-send-email 2.19.0 In-Reply-To: <20181002132458.446916963@linuxfoundation.org> References: <20181002132458.446916963@linuxfoundation.org> User-Agent: quilt/0.65 X-stable: review MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org 4.14-stable review patch. If anyone has any objections, please let me know. ------------------ From: Tomer Tayar [ Upstream commit 76271809f49056f079e202bf6513d17b0d6dd34d ] Successive iterations of halting and resuming the management chip (MCP) might fail, since currently the driver doesn't wait for these operations to actually take place. This patch prevents the driver from moving forward before the operations are reflected in the state register. Signed-off-by: Tomer Tayar Signed-off-by: Ariel Elior Signed-off-by: David S. Miller Signed-off-by: Sasha Levin Signed-off-by: Greg Kroah-Hartman --- drivers/net/ethernet/qlogic/qed/qed_mcp.c | 46 ++++++++++++++++++++----- drivers/net/ethernet/qlogic/qed/qed_reg_addr.h | 1 2 files changed, 39 insertions(+), 8 deletions(-) --- a/drivers/net/ethernet/qlogic/qed/qed_mcp.c +++ b/drivers/net/ethernet/qlogic/qed/qed_mcp.c @@ -1998,31 +1998,61 @@ qed_mcp_send_drv_version(struct qed_hwfn return rc; } +/* A maximal 100 msec waiting time for the MCP to halt */ +#define QED_MCP_HALT_SLEEP_MS 10 +#define QED_MCP_HALT_MAX_RETRIES 10 + int qed_mcp_halt(struct qed_hwfn *p_hwfn, struct qed_ptt *p_ptt) { - u32 resp = 0, param = 0; + u32 resp = 0, param = 0, cpu_state, cnt = 0; int rc; rc = qed_mcp_cmd(p_hwfn, p_ptt, DRV_MSG_CODE_MCP_HALT, 0, &resp, ¶m); - if (rc) + if (rc) { DP_ERR(p_hwfn, "MCP response failure, aborting\n"); + return rc; + } - return rc; + do { + msleep(QED_MCP_HALT_SLEEP_MS); + cpu_state = qed_rd(p_hwfn, p_ptt, MCP_REG_CPU_STATE); + if (cpu_state & MCP_REG_CPU_STATE_SOFT_HALTED) + break; + } while (++cnt < QED_MCP_HALT_MAX_RETRIES); + + if (cnt == QED_MCP_HALT_MAX_RETRIES) { + DP_NOTICE(p_hwfn, + "Failed to halt the MCP [CPU_MODE = 0x%08x, CPU_STATE = 0x%08x]\n", + qed_rd(p_hwfn, p_ptt, MCP_REG_CPU_MODE), cpu_state); + return -EBUSY; + } + + return 0; } +#define QED_MCP_RESUME_SLEEP_MS 10 + int qed_mcp_resume(struct qed_hwfn *p_hwfn, struct qed_ptt *p_ptt) { - u32 value, cpu_mode; + u32 cpu_mode, cpu_state; qed_wr(p_hwfn, p_ptt, MCP_REG_CPU_STATE, 0xffffffff); - value = qed_rd(p_hwfn, p_ptt, MCP_REG_CPU_MODE); - value &= ~MCP_REG_CPU_MODE_SOFT_HALT; - qed_wr(p_hwfn, p_ptt, MCP_REG_CPU_MODE, value); cpu_mode = qed_rd(p_hwfn, p_ptt, MCP_REG_CPU_MODE); + cpu_mode &= ~MCP_REG_CPU_MODE_SOFT_HALT; + qed_wr(p_hwfn, p_ptt, MCP_REG_CPU_MODE, cpu_mode); + msleep(QED_MCP_RESUME_SLEEP_MS); + cpu_state = qed_rd(p_hwfn, p_ptt, MCP_REG_CPU_STATE); + + if (cpu_state & MCP_REG_CPU_STATE_SOFT_HALTED) { + DP_NOTICE(p_hwfn, + "Failed to resume the MCP [CPU_MODE = 0x%08x, CPU_STATE = 0x%08x]\n", + cpu_mode, cpu_state); + return -EBUSY; + } - return (cpu_mode & MCP_REG_CPU_MODE_SOFT_HALT) ? -EAGAIN : 0; + return 0; } int qed_mcp_ov_update_current_config(struct qed_hwfn *p_hwfn, --- a/drivers/net/ethernet/qlogic/qed/qed_reg_addr.h +++ b/drivers/net/ethernet/qlogic/qed/qed_reg_addr.h @@ -554,6 +554,7 @@ 0 #define MCP_REG_CPU_STATE \ 0xe05004UL +#define MCP_REG_CPU_STATE_SOFT_HALTED (0x1UL << 10) #define MCP_REG_CPU_EVENT_MASK \ 0xe05008UL #define PGLUE_B_REG_PF_BAR0_SIZE \