]> rtime.felk.cvut.cz Git - hercules2020/nv-tegra/linux-4.4.git/commitdiff
scsi: ufs: Add Support for UFS version2 UTRD commands
authorNaveen Kumar Arepalli <naveenk@nvidia.com>
Thu, 21 Apr 2016 11:05:22 +0000 (16:35 +0530)
committerLaxman Dewangan <ldewangan@nvidia.com>
Fri, 22 Apr 2016 12:56:36 +0000 (05:56 -0700)
-UFS Host version2 supports UTP packets which has command type of
only UFS_STORAGE(0x1)

Bug 200091472

Change-Id: I551bdae71ddd25caffe744808a9ec973dd2184c2
Signed-off-by: Naveen Kumar Arepalli <naveenk@nvidia.com>
Reviewed-on: http://git-master/r/733186
Reviewed-on: http://git-master/r/1131076
Reviewed-by: Laxman Dewangan <ldewangan@nvidia.com>
drivers/scsi/ufs/ufshcd.c

index bace83e460143a1c734fd9aeaa98b16c06a7d251..0ba7dda1678d4b3889a47fca1601f0368af492b3 100644 (file)
@@ -1099,12 +1099,14 @@ static void ufshcd_disable_intr(struct ufs_hba *hba, u32 intrs)
  * @upiu_flags: flags required in the header
  * @cmd_dir: requests data direction
  */
-static void ufshcd_prepare_req_desc_hdr(struct ufshcd_lrb *lrbp,
-               u32 *upiu_flags, enum dma_data_direction cmd_dir)
+static void ufshcd_prepare_req_desc_hdr(struct ufs_hba *hba,
+               struct ufshcd_lrb *lrbp, u32 *upiu_flags,
+               enum dma_data_direction cmd_dir)
 {
        struct utp_transfer_req_desc *req_desc = lrbp->utr_descriptor_ptr;
        u32 data_direction;
        u32 dword_0;
+       int utrd_command_type;
 
        if (cmd_dir == DMA_FROM_DEVICE) {
                data_direction = UTP_DEVICE_TO_HOST;
@@ -1117,7 +1119,11 @@ static void ufshcd_prepare_req_desc_hdr(struct ufshcd_lrb *lrbp,
                *upiu_flags = UPIU_CMD_FLAGS_NONE;
        }
 
-       dword_0 = data_direction | (lrbp->command_type
+       if (hba->ufs_version == UFSHCI_VERSION_20)
+               utrd_command_type = UTP_CMD_TYPE_UFS;
+       else
+               utrd_command_type = lrbp->command_type;
+       dword_0 = data_direction | (utrd_command_type
                                << UPIU_COMMAND_TYPE_OFFSET);
        if (lrbp->intr_cmd)
                dword_0 |= UTP_REQ_DESC_INT_CMD;
@@ -1223,7 +1229,7 @@ static int ufshcd_compose_upiu(struct ufs_hba *hba, struct ufshcd_lrb *lrbp)
        switch (lrbp->command_type) {
        case UTP_CMD_TYPE_SCSI:
                if (likely(lrbp->cmd)) {
-                       ufshcd_prepare_req_desc_hdr(lrbp, &upiu_flags,
+                       ufshcd_prepare_req_desc_hdr(hba, lrbp, &upiu_flags,
                                        lrbp->cmd->sc_data_direction);
                        ufshcd_prepare_utp_scsi_cmd_upiu(lrbp, upiu_flags);
                } else {
@@ -1231,7 +1237,7 @@ static int ufshcd_compose_upiu(struct ufs_hba *hba, struct ufshcd_lrb *lrbp)
                }
                break;
        case UTP_CMD_TYPE_DEV_MANAGE:
-               ufshcd_prepare_req_desc_hdr(lrbp, &upiu_flags, DMA_NONE);
+               ufshcd_prepare_req_desc_hdr(hba, lrbp, &upiu_flags, DMA_NONE);
                if (hba->dev_cmd.type == DEV_CMD_TYPE_QUERY)
                        ufshcd_prepare_utp_query_req_upiu(
                                        hba, lrbp, upiu_flags);