Commit 0757f041 authored by Xiang Chen's avatar Xiang Chen Committed by Martin K. Petersen

scsi: hisi_sas: fix probe ordering problem

There is a potential probe issue in how we trigger the hw initialisation.
Although we use 1s timer to delay hw initialisation, there is still a
potential that sas_register_ha() is not be finished before we start
the PHY init from hw->hw_init().
To avoid this issue, initialise the hw after sas_register_ha() in the
same probe context.
Note: it is not necessary to use 1s timer now (modified v2 hw only).
Signed-off-by: default avatarXiang Chen <chenxiang66@hisilicon.com>
Signed-off-by: default avatarJohn Garry <john.garry@huawei.com>
Reviewed-by: default avatarJohannes Thumshirn <jthumshirn@suse.de>
Signed-off-by: default avatarMartin K. Petersen <martin.petersen@oracle.com>
parent 297d7302
...@@ -1552,10 +1552,6 @@ int hisi_sas_probe(struct platform_device *pdev, ...@@ -1552,10 +1552,6 @@ int hisi_sas_probe(struct platform_device *pdev,
hisi_sas_init_add(hisi_hba); hisi_sas_init_add(hisi_hba);
rc = hisi_hba->hw->hw_init(hisi_hba);
if (rc)
goto err_out_ha;
rc = scsi_add_host(shost, &pdev->dev); rc = scsi_add_host(shost, &pdev->dev);
if (rc) if (rc)
goto err_out_ha; goto err_out_ha;
...@@ -1564,6 +1560,10 @@ int hisi_sas_probe(struct platform_device *pdev, ...@@ -1564,6 +1560,10 @@ int hisi_sas_probe(struct platform_device *pdev,
if (rc) if (rc)
goto err_out_register_ha; goto err_out_register_ha;
rc = hisi_hba->hw->hw_init(hisi_hba);
if (rc)
goto err_out_register_ha;
scsi_scan_host(shost); scsi_scan_host(shost);
return 0; return 0;
......
...@@ -1093,9 +1093,8 @@ static void phy_hard_reset_v2_hw(struct hisi_hba *hisi_hba, int phy_no) ...@@ -1093,9 +1093,8 @@ static void phy_hard_reset_v2_hw(struct hisi_hba *hisi_hba, int phy_no)
start_phy_v2_hw(hisi_hba, phy_no); start_phy_v2_hw(hisi_hba, phy_no);
} }
static void start_phys_v2_hw(unsigned long data) static void start_phys_v2_hw(struct hisi_hba *hisi_hba)
{ {
struct hisi_hba *hisi_hba = (struct hisi_hba *)data;
int i; int i;
for (i = 0; i < hisi_hba->n_phy; i++) for (i = 0; i < hisi_hba->n_phy; i++)
...@@ -1104,10 +1103,7 @@ static void start_phys_v2_hw(unsigned long data) ...@@ -1104,10 +1103,7 @@ static void start_phys_v2_hw(unsigned long data)
static void phys_init_v2_hw(struct hisi_hba *hisi_hba) static void phys_init_v2_hw(struct hisi_hba *hisi_hba)
{ {
struct timer_list *timer = &hisi_hba->timer; start_phys_v2_hw(hisi_hba);
setup_timer(timer, start_phys_v2_hw, (unsigned long)hisi_hba);
mod_timer(timer, jiffies + HZ);
} }
static void sl_notify_v2_hw(struct hisi_hba *hisi_hba, int phy_no) static void sl_notify_v2_hw(struct hisi_hba *hisi_hba, int phy_no)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment