summaryrefslogtreecommitdiff
path: root/drivers/scsi/ufs/ufshcd.c
diff options
context:
space:
mode:
authorSubhash Jadavani <subhashj@codeaurora.org>2015-10-05 16:22:38 -0700
committerDavid Keitel <dkeitel@codeaurora.org>2016-03-22 11:00:42 -0700
commitbe361c995c1af8e6766cbc27a46c32489d2f0116 (patch)
tree8d3a967a9e6045a876ff5a580071c87357c20e9d /drivers/scsi/ufs/ufshcd.c
parenta2f12c798729973c286a7af79f24be09f87e7d7f (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.c35
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 */