Received: by 2002:a05:6a10:206:0:0:0:0 with SMTP id 6csp2745515pxj; Mon, 31 May 2021 09:40:06 -0700 (PDT) X-Google-Smtp-Source: ABdhPJzGdIMBwDWFGEjBtVCiC2iEqL9pBDOUJNEhIAUnyHeyBtxjuNE5MC23++hqVtH3dQok1hXl X-Received: by 2002:a17:906:22c6:: with SMTP id q6mr24027141eja.275.1622479205835; Mon, 31 May 2021 09:40:05 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1622479205; cv=none; d=google.com; s=arc-20160816; b=piLkkOnQIuDtN8K8mUhOYINt/oZ1rpPbbgwkelccBaRXaNln80OwmHN8n+FSEWpABG /xS06jOgzh3CebMszBnjlqO+1mCWUek0TybtfYE6fKUWDApVxrWTVzlz4TJxMO0CPV0z 4FE4HwRl/6yrCJH3jS01Mdq4k8NA4mJE9G25Xk338L44uGYWUF27TJ3b/SbeQhgesYJs gqSqcWB1f8b/H70v7K/ttK3x/k6FD3luMvbO79VsOfv85SAYrxF3m8Bg4W4MoHSQXGdC gMLm5FyS9OJ8dUdBMZGBohMwRPbZ7x0gXXotWAzeLZb0R59t+2JAYpo8y0GgLi2UQWBn aUOA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :user-agent:references:in-reply-to:message-id:date:subject:cc:to :from:dkim-signature; bh=RZBJTC/2Tqiciv0dtMH3pDXvIRXdFwCJEA81A2iz3VQ=; b=VFzxRkQgsKvXnQ8Vd/SVItaKnkbNM5w2R+m/pvcmlXpY+YoA5nYeQwlh8GcEwUBVSR Yr2AAbFnzSLbIaBmiPAomEUn5unI80M71hsw7VffNGATKdzCNr9vzMVALWLaM/W5TuFl hlGi4SL0tUA/oY0oYWFWU7g6XvS/Y/cxE3ya6xoSe98U4dxjJnpc2hEykXoum0r1Vq6M QKZ3rrJdHMrKqe0yymcjdFo+TfvpwjjOHavB/oJtsXZUONjPCCsMGqfdJgy/yjji//UV qQcmYxntYGSLohL5t4A9Fx2JbfySa5EWcTPNOXVhswFt1zZT1iY2mz5rLYR7bU/Emp/i CSnA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linuxfoundation.org header.s=korg header.b=M+AdPqd6; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linuxfoundation.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id q17si12532947edt.177.2021.05.31.09.39.43; Mon, 31 May 2021 09:40:05 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=pass header.i=@linuxfoundation.org header.s=korg header.b=M+AdPqd6; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linuxfoundation.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S234010AbhEaQkY (ORCPT + 99 others); Mon, 31 May 2021 12:40:24 -0400 Received: from mail.kernel.org ([198.145.29.99]:47898 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S233193AbhEaOvQ (ORCPT ); Mon, 31 May 2021 10:51:16 -0400 Received: by mail.kernel.org (Postfix) with ESMTPSA id 1AA3A61C9E; Mon, 31 May 2021 13:57:37 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=linuxfoundation.org; s=korg; t=1622469458; bh=YZdjdvbmdTz5Fwy5bEjqDiN+V6oQ4S0iDBQsYYdQba0=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=M+AdPqd6owjMPfnoLDWZR9pPmrnarxpd2memyznj0jUu/JuhKnVFMJxIwidmtBRLU 2lQuY3GjTiSPzDeAU3qQs008rykEspjHfm37tjKVD6X/BBXmtW/D2SGXnRJsdnPifI X6POLf1RLoaVFUll4sd91lRfWm39DJFNbRpIGXYc= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Ajish Koshy , Viswas G , "Martin K. Petersen" , Sasha Levin Subject: [PATCH 5.12 204/296] scsi: pm80xx: Fix drives missing during rmmod/insmod loop Date: Mon, 31 May 2021 15:14:19 +0200 Message-Id: <20210531130710.736374396@linuxfoundation.org> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20210531130703.762129381@linuxfoundation.org> References: <20210531130703.762129381@linuxfoundation.org> User-Agent: quilt/0.66 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Ajish Koshy [ Upstream commit d1acd81bd6eb685aa9fef25624fb36d297f6404e ] When driver is loaded after rmmod some drives are not showing up during discovery. SATA drives are directly attached to the controller connected phys. During device discovery, the IDENTIFY command (qc timeout (cmd 0xec)) is timing out during revalidation. This will trigger abort from host side and controller successfully aborts the command and returns success. Post this successful abort response ATA library decides to mark the disk as NODEV. To overcome this, inside pm8001_scan_start() after phy_start() call, add get start response and wait for few milliseconds to trigger next phy start. This millisecond delay will give sufficient time for the controller state machine to accept next phy start. Link: https://lore.kernel.org/r/20210505120103.24497-1-ajish.koshy@microchip.com Signed-off-by: Ajish Koshy Signed-off-by: Viswas G Signed-off-by: Martin K. Petersen Signed-off-by: Sasha Levin --- drivers/scsi/pm8001/pm8001_hwi.c | 10 ++++++---- drivers/scsi/pm8001/pm8001_init.c | 2 +- drivers/scsi/pm8001/pm8001_sas.c | 7 ++++++- drivers/scsi/pm8001/pm80xx_hwi.c | 12 ++++++------ 4 files changed, 19 insertions(+), 12 deletions(-) diff --git a/drivers/scsi/pm8001/pm8001_hwi.c b/drivers/scsi/pm8001/pm8001_hwi.c index 1b1a57f46989..c2a38a172904 100644 --- a/drivers/scsi/pm8001/pm8001_hwi.c +++ b/drivers/scsi/pm8001/pm8001_hwi.c @@ -3709,11 +3709,13 @@ static int mpi_hw_event(struct pm8001_hba_info *pm8001_ha, void* piomb) case HW_EVENT_PHY_START_STATUS: pm8001_dbg(pm8001_ha, MSG, "HW_EVENT_PHY_START_STATUS status = %x\n", status); - if (status == 0) { + if (status == 0) phy->phy_state = 1; - if (pm8001_ha->flags == PM8001F_RUN_TIME && - phy->enable_completion != NULL) - complete(phy->enable_completion); + + if (pm8001_ha->flags == PM8001F_RUN_TIME && + phy->enable_completion != NULL) { + complete(phy->enable_completion); + phy->enable_completion = NULL; } break; case HW_EVENT_SAS_PHY_UP: diff --git a/drivers/scsi/pm8001/pm8001_init.c b/drivers/scsi/pm8001/pm8001_init.c index bd626ef876da..4f3ec2bba8c9 100644 --- a/drivers/scsi/pm8001/pm8001_init.c +++ b/drivers/scsi/pm8001/pm8001_init.c @@ -1144,8 +1144,8 @@ static int pm8001_pci_probe(struct pci_dev *pdev, goto err_out_shost; } list_add_tail(&pm8001_ha->list, &hba_list); - scsi_scan_host(pm8001_ha->shost); pm8001_ha->flags = PM8001F_RUN_TIME; + scsi_scan_host(pm8001_ha->shost); return 0; err_out_shost: diff --git a/drivers/scsi/pm8001/pm8001_sas.c b/drivers/scsi/pm8001/pm8001_sas.c index a98d4496ff8b..0a637609504e 100644 --- a/drivers/scsi/pm8001/pm8001_sas.c +++ b/drivers/scsi/pm8001/pm8001_sas.c @@ -264,12 +264,17 @@ void pm8001_scan_start(struct Scsi_Host *shost) int i; struct pm8001_hba_info *pm8001_ha; struct sas_ha_struct *sha = SHOST_TO_SAS_HA(shost); + DECLARE_COMPLETION_ONSTACK(completion); pm8001_ha = sha->lldd_ha; /* SAS_RE_INITIALIZATION not available in SPCv/ve */ if (pm8001_ha->chip_id == chip_8001) PM8001_CHIP_DISP->sas_re_init_req(pm8001_ha); - for (i = 0; i < pm8001_ha->chip->n_phy; ++i) + for (i = 0; i < pm8001_ha->chip->n_phy; ++i) { + pm8001_ha->phy[i].enable_completion = &completion; PM8001_CHIP_DISP->phy_start_req(pm8001_ha, i); + wait_for_completion(&completion); + msleep(300); + } } int pm8001_scan_finished(struct Scsi_Host *shost, unsigned long time) diff --git a/drivers/scsi/pm8001/pm80xx_hwi.c b/drivers/scsi/pm8001/pm80xx_hwi.c index c6b0834e3806..5de7adfabd57 100644 --- a/drivers/scsi/pm8001/pm80xx_hwi.c +++ b/drivers/scsi/pm8001/pm80xx_hwi.c @@ -3485,13 +3485,13 @@ static int mpi_phy_start_resp(struct pm8001_hba_info *pm8001_ha, void *piomb) pm8001_dbg(pm8001_ha, INIT, "phy start resp status:0x%x, phyid:0x%x\n", status, phy_id); - if (status == 0) { + if (status == 0) phy->phy_state = PHY_LINK_DOWN; - if (pm8001_ha->flags == PM8001F_RUN_TIME && - phy->enable_completion != NULL) { - complete(phy->enable_completion); - phy->enable_completion = NULL; - } + + if (pm8001_ha->flags == PM8001F_RUN_TIME && + phy->enable_completion != NULL) { + complete(phy->enable_completion); + phy->enable_completion = NULL; } return 0; -- 2.30.2