]> git.baikalelectronics.ru Git - kernel.git/commitdiff
scsi: ufs-bsg: Add support for uic commands in ufs_bsg_request()
authorAvri Altman <avri.altman@wdc.com>
Sun, 7 Oct 2018 14:30:39 +0000 (17:30 +0300)
committerMartin K. Petersen <martin.petersen@oracle.com>
Thu, 11 Oct 2018 03:09:47 +0000 (23:09 -0400)
Make ufshcd_send_uic_cmd() public for that.

Signed-off-by: Avri Altman <avri.altman@wdc.com>
Reviewed-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Bart Van Assche <Bart.VanAssche@wdc.com>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
drivers/scsi/ufs/ufs_bsg.c
drivers/scsi/ufs/ufshcd.c
drivers/scsi/ufs/ufshcd.h
include/uapi/scsi/scsi_bsg_ufs.h

index 306e5f11a818ae200b6fe50c408340d5378ddb28..e5f8e54bf6442f708f15ddb2b47eed2dc7adcf6b 100644 (file)
@@ -84,6 +84,7 @@ static int ufs_bsg_request(struct bsg_job *job)
        struct ufs_hba *hba = shost_priv(dev_to_shost(job->dev->parent));
        unsigned int req_len = job->request_len;
        unsigned int reply_len = job->reply_len;
+       struct uic_command uc = {};
        int msgcode;
        uint8_t *desc_buff = NULL;
        int desc_len = 0;
@@ -116,6 +117,16 @@ static int ufs_bsg_request(struct bsg_job *job)
                        dev_err(hba->dev,
                                "exe raw upiu: error code %d\n", ret);
 
+               break;
+       case UPIU_TRANSACTION_UIC_CMD:
+               memcpy(&uc, &bsg_request->upiu_req.uc, UIC_CMD_SIZE);
+               ret = ufshcd_send_uic_cmd(hba, &uc);
+               if (ret)
+                       dev_dbg(hba->dev,
+                               "send uic cmd: error code %d\n", ret);
+
+               memcpy(&bsg_reply->upiu_rsp.uc, &uc, UIC_CMD_SIZE);
+
                break;
        default:
                ret = -ENOTSUPP;
index 3be14bfd25d40214e9f9c3a644902f0517f729ba..02280dbf4a2d1539ddc6360d7f8863e870c107ca 100644 (file)
@@ -2059,8 +2059,7 @@ __ufshcd_send_uic_cmd(struct ufs_hba *hba, struct uic_command *uic_cmd,
  *
  * Returns 0 only if success.
  */
-static int
-ufshcd_send_uic_cmd(struct ufs_hba *hba, struct uic_command *uic_cmd)
+int ufshcd_send_uic_cmd(struct ufs_hba *hba, struct uic_command *uic_cmd)
 {
        int ret;
        unsigned long flags;
index 087813417a71e8c2bc1b9be146b81072c7167f47..1a1c2b487a4eb267a296a13d85344e3377bac763 100644 (file)
@@ -895,6 +895,8 @@ int ufshcd_map_desc_id_to_length(struct ufs_hba *hba, enum desc_idn desc_id,
 
 u32 ufshcd_get_local_unipro_ver(struct ufs_hba *hba);
 
+int ufshcd_send_uic_cmd(struct ufs_hba *hba, struct uic_command *uic_cmd);
+
 int ufshcd_exec_raw_upiu_cmd(struct ufs_hba *hba,
                             struct utp_upiu_req *req_upiu,
                             struct utp_upiu_req *rsp_upiu,
index e426204ec15c80a5a3196db8a06d96b8124e39c7..1b25930688bce4f974c95c32f2528347272a93d6 100644 (file)
@@ -13,6 +13,9 @@
  */
 
 #define UFS_CDB_SIZE   16
+#define UPIU_TRANSACTION_UIC_CMD 0x1F
+/* uic commands are 4DW long, per UFSHCI V2.1 paragraph 5.6.1 */
+#define UIC_CMD_SIZE (sizeof(u32) * 4)
 
 /**
  * struct utp_upiu_header - UPIU header structure