72 lines
2.9 KiB
Diff
72 lines
2.9 KiB
Diff
|
|
From 450b67a5dd3954db8441a1ad65a5e4594ba2e405 Mon Sep 17 00:00:00 2001
|
||
|
|
From: dinglimin <dinglimin@cmss.chinamobile.com>
|
||
|
|
Date: Mon, 16 Sep 2024 17:34:34 +0800
|
||
|
|
Subject: [PATCH] hw/ufs: add basic info of query response upiu cherry picked
|
||
|
|
from de2cc4078240f8b745a7caeed461b02f2577e2d2 Modify to fill the opcode, idn,
|
||
|
|
index, selector information of all Query Response UPIU. because attr and flag
|
||
|
|
operation of query response upiu need these information too.
|
||
|
|
|
||
|
|
Signed-off-by: KyoungrulKim <k831.kim@samsung.com>
|
||
|
|
Reviewed-by: Minwoo Im <minwoo.im@samsung.com>
|
||
|
|
Reviewed-by: Jeuk Kim <jeuk20.kim@samsung.com>
|
||
|
|
Signed-off-by: Jeuk Kim <jeuk20.kim@samsung.com>
|
||
|
|
Signed-off-by: dinglimin <dinglimin@cmss.chinamobile.com>
|
||
|
|
---
|
||
|
|
hw/ufs/ufs.c | 13 +++++++++----
|
||
|
|
hw/ufs/ufs.h | 1 +
|
||
|
|
2 files changed, 10 insertions(+), 4 deletions(-)
|
||
|
|
|
||
|
|
diff --git a/hw/ufs/ufs.c b/hw/ufs/ufs.c
|
||
|
|
index bac78a32bb..068895b27b 100644
|
||
|
|
--- a/hw/ufs/ufs.c
|
||
|
|
+++ b/hw/ufs/ufs.c
|
||
|
|
@@ -455,6 +455,14 @@ void ufs_build_upiu_header(UfsRequest *req, uint8_t trans_type, uint8_t flags,
|
||
|
|
req->rsp_upiu.header.data_segment_length = cpu_to_be16(data_segment_length);
|
||
|
|
}
|
||
|
|
|
||
|
|
+void ufs_build_query_response(UfsRequest *req)
|
||
|
|
+{
|
||
|
|
+ req->rsp_upiu.qr.opcode = req->req_upiu.qr.opcode;
|
||
|
|
+ req->rsp_upiu.qr.idn = req->req_upiu.qr.idn;
|
||
|
|
+ req->rsp_upiu.qr.index = req->req_upiu.qr.index;
|
||
|
|
+ req->rsp_upiu.qr.selector = req->req_upiu.qr.selector;
|
||
|
|
+}
|
||
|
|
+
|
||
|
|
static UfsReqResult ufs_exec_scsi_cmd(UfsRequest *req)
|
||
|
|
{
|
||
|
|
UfsHc *u = req->hc;
|
||
|
|
@@ -931,10 +939,6 @@ static QueryRespCode ufs_read_desc(UfsRequest *req)
|
||
|
|
if (length > req->rsp_upiu.qr.data[0]) {
|
||
|
|
length = req->rsp_upiu.qr.data[0];
|
||
|
|
}
|
||
|
|
- req->rsp_upiu.qr.opcode = req->req_upiu.qr.opcode;
|
||
|
|
- req->rsp_upiu.qr.idn = req->req_upiu.qr.idn;
|
||
|
|
- req->rsp_upiu.qr.index = req->req_upiu.qr.index;
|
||
|
|
- req->rsp_upiu.qr.selector = req->req_upiu.qr.selector;
|
||
|
|
req->rsp_upiu.qr.length = cpu_to_be16(length);
|
||
|
|
|
||
|
|
return status;
|
||
|
|
@@ -1015,6 +1019,7 @@ static UfsReqResult ufs_exec_query_cmd(UfsRequest *req)
|
||
|
|
data_segment_length = be16_to_cpu(req->rsp_upiu.qr.length);
|
||
|
|
ufs_build_upiu_header(req, UFS_UPIU_TRANSACTION_QUERY_RSP, 0, status, 0,
|
||
|
|
data_segment_length);
|
||
|
|
+ ufs_build_query_response(req);
|
||
|
|
|
||
|
|
if (status != UFS_QUERY_RESULT_SUCCESS) {
|
||
|
|
return UFS_REQUEST_FAIL;
|
||
|
|
diff --git a/hw/ufs/ufs.h b/hw/ufs/ufs.h
|
||
|
|
index 8fda94f4ef..8a74b4c2ab 100644
|
||
|
|
--- a/hw/ufs/ufs.h
|
||
|
|
+++ b/hw/ufs/ufs.h
|
||
|
|
@@ -132,6 +132,7 @@ static inline bool is_wlun(uint8_t lun)
|
||
|
|
void ufs_build_upiu_header(UfsRequest *req, uint8_t trans_type, uint8_t flags,
|
||
|
|
uint8_t response, uint8_t scsi_status,
|
||
|
|
uint16_t data_segment_length);
|
||
|
|
+void ufs_build_query_response(UfsRequest *req);
|
||
|
|
void ufs_complete_req(UfsRequest *req, UfsReqResult req_result);
|
||
|
|
void ufs_init_wlu(UfsLu *wlu, uint8_t wlun);
|
||
|
|
#endif /* HW_UFS_UFS_H */
|
||
|
|
--
|
||
|
|
2.41.0.windows.1
|
||
|
|
|