Received: by 2002:ac0:a582:0:0:0:0:0 with SMTP id m2-v6csp1327877imm; Tue, 2 Oct 2018 06:35:48 -0700 (PDT) X-Google-Smtp-Source: ACcGV60oq9M9ylGVv1R7h4oMFSIUTUoC5CLnlN4FtaI3XAkx4bci5P1BLmxrSKSiYwE9GTsQkccz X-Received: by 2002:a63:1c64:: with SMTP id c36-v6mr1801448pgm.354.1538487348865; Tue, 02 Oct 2018 06:35:48 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1538487348; cv=none; d=google.com; s=arc-20160816; b=kY7pjx9NlJrSKM8MTNORF7fMZH5JL0AudZUzapVJGjFNIKVoEjP3+MDKXlOoNAjRCl 76rFLmsSPPxXPo0BIkzKbWu4X7TMn/J540AcGir7R0uzw7eUNw0t4pKtd7VvmHmikKRw XPQd74eXPL639AaGyVmIdfpiJfC2XIG14EiHYW8HT+F4pJTnZgLUp4zlyw2VEY38D/qt cyEWyQsGXDNDB1KYXq5Afdtj+dJaY+hL0Ma9iCiI8qZA9zYMUEbl3j69u2Zo3OYLiZx4 4kmSJfDK0iTE5tmDPoA8Pnb4UpZzSrbt1xq5FWvH70s0usVzeihiSoWu+wvueGFDwYe6 ab6w== 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=ySAQGLTxuWdhFnwRvG0jzOabx/ju7eWRw8lgzJ4JM1M=; b=RNPwDwHDWGgfqVvHIn4LFgLmvhO6ISG8/vU4t2yernTxWZeUiArxtzYK3E/53NT5oz Y1mhUo+9pdnO/QYqgBseawsoE4HFtXVoCJrERdrYgmk3OYRewGAO/4FNPBpqdM6YIw+6 oRsaz8f4eL811QfCqji2PiOCeP5PyJHeBsrectt1s+GORi1W2ra4GNCG6EAauDYyh1ml zj/kwBfMklcEXDpiCQ/t4T9+sIQBAMA0+G9MvbMbWO01/pr5S4PIb8025p1CVEIjC0IA JQyNKeanmZysdR066GG/cZWlMAzvSGN4fHm+03OF8Is//1Vr5yuOVmSzR+cJb9fFaSIW H07w== 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 r25-v6si16053953pga.489.2018.10.02.06.35.33; Tue, 02 Oct 2018 06:35:48 -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 S1731292AbeJBUR7 (ORCPT + 99 others); Tue, 2 Oct 2018 16:17:59 -0400 Received: from mail.linuxfoundation.org ([140.211.169.12]:35312 "EHLO mail.linuxfoundation.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1730846AbeJBUR6 (ORCPT ); Tue, 2 Oct 2018 16:17:58 -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 4E1D85AA; Tue, 2 Oct 2018 13:34:34 +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 113/137] qed: Wait for ready indication before rereading the shmem Date: Tue, 2 Oct 2018 06:25:14 -0700 Message-Id: <20181002132506.430572784@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 f00d25f3154b676fcea4502a25b94bd7f142ca74 ] The MFW might be reset and re-update its shared memory. Upon the detection of such a reset the driver rereads this memory, but it has to wait till the data is valid. This patch adds the missing wait for a data ready indication. 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 | 50 ++++++++++++++++++++++++------ 1 file changed, 41 insertions(+), 9 deletions(-) --- a/drivers/net/ethernet/qlogic/qed/qed_mcp.c +++ b/drivers/net/ethernet/qlogic/qed/qed_mcp.c @@ -182,18 +182,57 @@ int qed_mcp_free(struct qed_hwfn *p_hwfn return 0; } +/* Maximum of 1 sec to wait for the SHMEM ready indication */ +#define QED_MCP_SHMEM_RDY_MAX_RETRIES 20 +#define QED_MCP_SHMEM_RDY_ITER_MS 50 + static int qed_load_mcp_offsets(struct qed_hwfn *p_hwfn, struct qed_ptt *p_ptt) { struct qed_mcp_info *p_info = p_hwfn->mcp_info; + u8 cnt = QED_MCP_SHMEM_RDY_MAX_RETRIES; + u8 msec = QED_MCP_SHMEM_RDY_ITER_MS; u32 drv_mb_offsize, mfw_mb_offsize; u32 mcp_pf_id = MCP_PF_ID(p_hwfn); p_info->public_base = qed_rd(p_hwfn, p_ptt, MISC_REG_SHARED_MEM_ADDR); - if (!p_info->public_base) - return 0; + if (!p_info->public_base) { + DP_NOTICE(p_hwfn, + "The address of the MCP scratch-pad is not configured\n"); + return -EINVAL; + } p_info->public_base |= GRCBASE_MCP; + /* Get the MFW MB address and number of supported messages */ + mfw_mb_offsize = qed_rd(p_hwfn, p_ptt, + SECTION_OFFSIZE_ADDR(p_info->public_base, + PUBLIC_MFW_MB)); + p_info->mfw_mb_addr = SECTION_ADDR(mfw_mb_offsize, mcp_pf_id); + p_info->mfw_mb_length = (u16)qed_rd(p_hwfn, p_ptt, + p_info->mfw_mb_addr + + offsetof(struct public_mfw_mb, + sup_msgs)); + + /* The driver can notify that there was an MCP reset, and might read the + * SHMEM values before the MFW has completed initializing them. + * To avoid this, the "sup_msgs" field in the MFW mailbox is used as a + * data ready indication. + */ + while (!p_info->mfw_mb_length && --cnt) { + msleep(msec); + p_info->mfw_mb_length = + (u16)qed_rd(p_hwfn, p_ptt, + p_info->mfw_mb_addr + + offsetof(struct public_mfw_mb, sup_msgs)); + } + + if (!cnt) { + DP_NOTICE(p_hwfn, + "Failed to get the SHMEM ready notification after %d msec\n", + QED_MCP_SHMEM_RDY_MAX_RETRIES * msec); + return -EBUSY; + } + /* Calculate the driver and MFW mailbox address */ drv_mb_offsize = qed_rd(p_hwfn, p_ptt, SECTION_OFFSIZE_ADDR(p_info->public_base, @@ -203,13 +242,6 @@ static int qed_load_mcp_offsets(struct q "drv_mb_offsiz = 0x%x, drv_mb_addr = 0x%x mcp_pf_id = 0x%x\n", drv_mb_offsize, p_info->drv_mb_addr, mcp_pf_id); - /* Set the MFW MB address */ - mfw_mb_offsize = qed_rd(p_hwfn, p_ptt, - SECTION_OFFSIZE_ADDR(p_info->public_base, - PUBLIC_MFW_MB)); - p_info->mfw_mb_addr = SECTION_ADDR(mfw_mb_offsize, mcp_pf_id); - p_info->mfw_mb_length = (u16)qed_rd(p_hwfn, p_ptt, p_info->mfw_mb_addr); - /* Get the current driver mailbox sequence before sending * the first command */