scsi: hisi_sas: Rollback some operations if FLR failed
[ Upstream commit 7ea3e7763c50b20a8bd25cf524ea0c6463de69be ]
We obtain the semaphore and set HISI_SAS_RESETTING_BIT in
hisi_sas_reset_prepare_v3_hw(), block the scsi host and set
HISI_SAS_REJECT_CMD_BIT in hisi_sas_controller_reset_prepare(), released
them in hisi_sas_controller_reset_done(). However, if the HW reset failure
in FLR results in early return, the semaphore and flag bits will not be
release.
Rollback some operations including clearing flags / releasing semaphore
when FLR is failed.
Fixes: e5ea48014a
("scsi: hisi_sas: Implement handlers of PCIe FLR for v3 hw")
Signed-off-by: Yihang Li <liyihang9@huawei.com>
Signed-off-by: Xiang Chen <chenxiang66@hisilicon.com>
Link: https://lore.kernel.org/r/1702525516-51258-5-git-send-email-chenxiang66@hisilicon.com
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:
parent
3d5a4fa56d
commit
6491d9ea93
@ -4946,6 +4946,7 @@ static void hisi_sas_reset_done_v3_hw(struct pci_dev *pdev)
|
|||||||
{
|
{
|
||||||
struct sas_ha_struct *sha = pci_get_drvdata(pdev);
|
struct sas_ha_struct *sha = pci_get_drvdata(pdev);
|
||||||
struct hisi_hba *hisi_hba = sha->lldd_ha;
|
struct hisi_hba *hisi_hba = sha->lldd_ha;
|
||||||
|
struct Scsi_Host *shost = hisi_hba->shost;
|
||||||
struct device *dev = hisi_hba->dev;
|
struct device *dev = hisi_hba->dev;
|
||||||
int rc;
|
int rc;
|
||||||
|
|
||||||
@ -4954,6 +4955,10 @@ static void hisi_sas_reset_done_v3_hw(struct pci_dev *pdev)
|
|||||||
rc = hw_init_v3_hw(hisi_hba);
|
rc = hw_init_v3_hw(hisi_hba);
|
||||||
if (rc) {
|
if (rc) {
|
||||||
dev_err(dev, "FLR: hw init failed rc=%d\n", rc);
|
dev_err(dev, "FLR: hw init failed rc=%d\n", rc);
|
||||||
|
clear_bit(HISI_SAS_REJECT_CMD_BIT, &hisi_hba->flags);
|
||||||
|
scsi_unblock_requests(shost);
|
||||||
|
clear_bit(HISI_SAS_RESETTING_BIT, &hisi_hba->flags);
|
||||||
|
up(&hisi_hba->sem);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user