Commit 5c17f87a authored by Avri Altman's avatar Avri Altman Committed by Martin K. Petersen

scsi: ufs-bsg: Allow reading descriptors

Add this functionality, placing the descriptor being read in the actual
data buffer in the bio.

That is, for both read and write descriptors query upiu, we are using the
job's request_payload.  This in turn, is mapped back in user land to the
applicable sg_io_v4 xferp: dout_xferp for write descriptor, and din_xferp
for read descriptor.
Signed-off-by: default avatarAvri Altman <avri.altman@wdc.com>
Reviewed-by: default avatarEvan Green <evgreen@chromium.org>
Reviewed-by: default avatarBean Huo <beanhuo@micron.com>
Signed-off-by: default avatarMartin K. Petersen <martin.petersen@oracle.com>
parent 4bbbe242
...@@ -150,9 +150,14 @@ send SG_IO with the applicable sg_io_v4: ...@@ -150,9 +150,14 @@ send SG_IO with the applicable sg_io_v4:
if (dir == SG_DXFER_TO_DEV) { if (dir == SG_DXFER_TO_DEV) {
io_hdr_v4.dout_xfer_len = (uint32_t)byte_cnt; io_hdr_v4.dout_xfer_len = (uint32_t)byte_cnt;
io_hdr_v4.dout_xferp = (uintptr_t)(__u64)buff; 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 Specifications can be found at,
UFS - http://www.jedec.org/sites/default/files/docs/JESD220.pdf UFS - http://www.jedec.org/sites/default/files/docs/JESD220.pdf
......
...@@ -48,12 +48,8 @@ static int ufs_bsg_alloc_desc_buffer(struct ufs_hba *hba, struct bsg_job *job, ...@@ -48,12 +48,8 @@ static int ufs_bsg_alloc_desc_buffer(struct ufs_hba *hba, struct bsg_job *job,
struct utp_upiu_query *qr; struct utp_upiu_query *qr;
u8 *descp; u8 *descp;
if (desc_op == UPIU_QUERY_OPCODE_READ_DESC) { if (desc_op != UPIU_QUERY_OPCODE_WRITE_DESC &&
dev_err(hba->dev, "unsupported opcode %d\n", desc_op); desc_op != UPIU_QUERY_OPCODE_READ_DESC)
return -ENOTSUPP;
}
if (desc_op != UPIU_QUERY_OPCODE_WRITE_DESC)
goto out; goto out;
qr = &bsg_request->upiu_req.qr; qr = &bsg_request->upiu_req.qr;
...@@ -71,8 +67,10 @@ static int ufs_bsg_alloc_desc_buffer(struct ufs_hba *hba, struct bsg_job *job, ...@@ -71,8 +67,10 @@ static int ufs_bsg_alloc_desc_buffer(struct ufs_hba *hba, struct bsg_job *job,
if (!descp) if (!descp)
return -ENOMEM; return -ENOMEM;
sg_copy_to_buffer(job->request_payload.sg_list, if (desc_op == UPIU_QUERY_OPCODE_WRITE_DESC)
job->request_payload.sg_cnt, descp, *desc_len); sg_copy_to_buffer(job->request_payload.sg_list,
job->request_payload.sg_cnt, descp,
*desc_len);
*desc_buff = descp; *desc_buff = descp;
...@@ -140,6 +138,12 @@ static int ufs_bsg_request(struct bsg_job *job) ...@@ -140,6 +138,12 @@ static int ufs_bsg_request(struct bsg_job *job)
if (!desc_buff) if (!desc_buff)
goto out; 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); kfree(desc_buff);
out: out:
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment