if (dir == SG_DXFER_TO_DEV) {
                io_hdr_v4.dout_xfer_len = (uint32_t)byte_cnt;
                io_hdr_v4.dout_xferp = (uintptr_t)(__u64)buff;
+       } else {
+               io_hdr_v4.din_xfer_len = (uint32_t)byte_cnt;
+               io_hdr_v4.din_xferp = (uintptr_t)(__u64)buff;
        }
 
-If you wish to write a descriptor, use the dout_xferp sg_io_v4.
+If you wish to read or write a descriptor, use the appropriate xferp of
+sg_io_v4.
+
 
 UFS Specifications can be found at,
 UFS - http://www.jedec.org/sites/default/files/docs/JESD220.pdf
 
        struct utp_upiu_query *qr;
        u8 *descp;
 
-       if (desc_op == UPIU_QUERY_OPCODE_READ_DESC) {
-               dev_err(hba->dev, "unsupported opcode %d\n", desc_op);
-               return -ENOTSUPP;
-       }
-
-       if (desc_op != UPIU_QUERY_OPCODE_WRITE_DESC)
+       if (desc_op != UPIU_QUERY_OPCODE_WRITE_DESC &&
+           desc_op != UPIU_QUERY_OPCODE_READ_DESC)
                goto out;
 
        qr = &bsg_request->upiu_req.qr;
        if (!descp)
                return -ENOMEM;
 
-       sg_copy_to_buffer(job->request_payload.sg_list,
-                         job->request_payload.sg_cnt, descp, *desc_len);
+       if (desc_op == UPIU_QUERY_OPCODE_WRITE_DESC)
+               sg_copy_to_buffer(job->request_payload.sg_list,
+                                 job->request_payload.sg_cnt, descp,
+                                 *desc_len);
 
        *desc_buff = descp;
 
        if (!desc_buff)
                goto out;
 
+       if (desc_op == UPIU_QUERY_OPCODE_READ_DESC && desc_len)
+               bsg_reply->reply_payload_rcv_len =
+                       sg_copy_from_buffer(job->request_payload.sg_list,
+                                           job->request_payload.sg_cnt,
+                                           desc_buff, desc_len);
+
        kfree(desc_buff);
 
 out: