diff options
author | Subhash Jadavani <subhashj@codeaurora.org> | 2015-10-05 16:22:38 -0700 |
---|---|---|
committer | David Keitel <dkeitel@codeaurora.org> | 2016-03-22 11:00:42 -0700 |
commit | be361c995c1af8e6766cbc27a46c32489d2f0116 (patch) | |
tree | 8d3a967a9e6045a876ff5a580071c87357c20e9d /drivers/scsi/ufs/ufshcd.c | |
parent | a2f12c798729973c286a7af79f24be09f87e7d7f (diff) |
scsi: ufs: allow updating bBootLunEn via ioctl
"bBootLunEn" attribute value decides the active Boot LUN but there could
be a case where userspace may want to change it during image update.
This change allows writing to this parameter.
Change-Id: I6e8d630606d8caf6197ef662003ec1ee646afe81
Signed-off-by: Subhash Jadavani <subhashj@codeaurora.org>
Diffstat (limited to 'drivers/scsi/ufs/ufshcd.c')
-rw-r--r-- | drivers/scsi/ufs/ufshcd.c | 35 |
1 files changed, 34 insertions, 1 deletions
diff --git a/drivers/scsi/ufs/ufshcd.c b/drivers/scsi/ufs/ufshcd.c index 024d913cf248..eeed0e858290 100644 --- a/drivers/scsi/ufs/ufshcd.c +++ b/drivers/scsi/ufs/ufshcd.c @@ -6777,6 +6777,37 @@ static int ufshcd_query_ioctl(struct ufs_hba *hba, u8 lun, void __user *buffer) err = ufshcd_query_attr(hba, ioctl_data->opcode, ioctl_data->idn, index, 0, &att); break; + + case UPIU_QUERY_OPCODE_WRITE_ATTR: + err = copy_from_user(&att, + buffer + sizeof(struct ufs_ioctl_query_data), + sizeof(u32)); + if (err) { + dev_err(hba->dev, + "%s: Failed copying buffer from user, err %d\n", + __func__, err); + goto out_release_mem; + } + + switch (ioctl_data->idn) { + case QUERY_ATTR_IDN_BOOT_LU_EN: + index = 0; + if (att > QUERY_ATTR_IDN_BOOT_LU_EN_MAX) { + dev_err(hba->dev, + "%s: Illegal ufs query ioctl data, opcode 0x%x, idn 0x%x, att 0x%x\n", + __func__, ioctl_data->opcode, + (unsigned int)ioctl_data->idn, att); + err = -EINVAL; + goto out_release_mem; + } + break; + default: + goto out_einval; + } + err = ufshcd_query_attr(hba, ioctl_data->opcode, + ioctl_data->idn, index, 0, &att); + break; + case UPIU_QUERY_OPCODE_READ_FLAG: switch (ioctl_data->idn) { case QUERY_FLAG_IDN_FDEVICEINIT: @@ -6822,8 +6853,10 @@ static int ufshcd_query_ioctl(struct ufs_hba *hba, u8 lun, void __user *buffer) ioctl_data->buf_size = 1; data_ptr = &flag; break; + case UPIU_QUERY_OPCODE_WRITE_ATTR: + goto out_release_mem; default: - BUG_ON(true); + goto out_einval; } /* copy to user */ |