scsi: ufs: continue to boot even with Boot LUN is disabled
authorHuanlin Ke <chgokhl@gmail.com>
Fri, 22 Sep 2017 10:31:47 +0000 (18:31 +0800)
committerMartin K. Petersen <martin.petersen@oracle.com>
Thu, 28 Sep 2017 01:45:46 +0000 (21:45 -0400)
Several configurable fields of the Device Descriptor and the Unit
Descriptors determine the Boot LUN status. The bBootEnable field and the
bBootLunEn attribute is set to zero by default, so the Boot LUN is
disabled by default.

At which point the scsi device add for Boot LUN will fail, but we can
continue to use the ufs device in fact. This failure shouldn't abort the
device boot.

Signed-off-by: Huanlin Ke <kehuanlin@pinecone.net>
Reviewed-by: Subhash Jadavani <subhashj@codeaurora.org>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
drivers/scsi/ufs/ufshcd.c

index 3a03641e5f4e2bd292c2a11e2f654f90313a7316..d4d8ea3b6ca0f6a2a117b6e2d47ee5cc1f9164e9 100644 (file)
@@ -6003,25 +6003,22 @@ static int ufshcd_scsi_add_wlus(struct ufs_hba *hba)
        }
        scsi_device_put(hba->sdev_ufs_device);
 
-       sdev_boot = __scsi_add_device(hba->host, 0, 0,
-               ufshcd_upiu_wlun_to_scsi_wlun(UFS_UPIU_BOOT_WLUN), NULL);
-       if (IS_ERR(sdev_boot)) {
-               ret = PTR_ERR(sdev_boot);
-               goto remove_sdev_ufs_device;
-       }
-       scsi_device_put(sdev_boot);
-
        sdev_rpmb = __scsi_add_device(hba->host, 0, 0,
                ufshcd_upiu_wlun_to_scsi_wlun(UFS_UPIU_RPMB_WLUN), NULL);
        if (IS_ERR(sdev_rpmb)) {
                ret = PTR_ERR(sdev_rpmb);
-               goto remove_sdev_boot;
+               goto remove_sdev_ufs_device;
        }
        scsi_device_put(sdev_rpmb);
+
+       sdev_boot = __scsi_add_device(hba->host, 0, 0,
+               ufshcd_upiu_wlun_to_scsi_wlun(UFS_UPIU_BOOT_WLUN), NULL);
+       if (IS_ERR(sdev_boot))
+               dev_err(hba->dev, "%s: BOOT WLUN not found\n", __func__);
+       else
+               scsi_device_put(sdev_boot);
        goto out;
 
-remove_sdev_boot:
-       scsi_remove_device(sdev_boot);
 remove_sdev_ufs_device:
        scsi_remove_device(hba->sdev_ufs_device);
 out: