1 /*-
2 * Copyright (c) 2025, Samsung Electronics Co., Ltd.
3 * Written by Jaeyoon Choi
4 *
5 * SPDX-License-Identifier: BSD-2-Clause
6 */
7
8 #include "ufshci_private.h"
9
10 void
ufshci_ctrlr_cmd_send_task_mgmt_request(struct ufshci_controller * ctrlr,ufshci_cb_fn_t cb_fn,void * cb_arg,uint8_t function,uint8_t lun,uint8_t task_tag,uint8_t iid)11 ufshci_ctrlr_cmd_send_task_mgmt_request(struct ufshci_controller *ctrlr,
12 ufshci_cb_fn_t cb_fn, void *cb_arg, uint8_t function, uint8_t lun,
13 uint8_t task_tag, uint8_t iid)
14 {
15 struct ufshci_request *req;
16 struct ufshci_task_mgmt_request_upiu *upiu;
17
18 req = ufshci_allocate_request_vaddr(NULL, 0, M_WAITOK, cb_fn, cb_arg);
19
20 req->request_size = sizeof(struct ufshci_task_mgmt_request_upiu);
21 req->response_size = sizeof(struct ufshci_task_mgmt_response_upiu);
22
23 upiu = (struct ufshci_task_mgmt_request_upiu *)&req->request_upiu;
24 memset(upiu, 0, req->request_size);
25 upiu->header.trans_type =
26 UFSHCI_UPIU_TRANSACTION_CODE_TASK_MANAGEMENT_REQUEST;
27 upiu->header.lun = lun;
28 upiu->header.ext_iid_or_function = function;
29 upiu->input_param1 = lun;
30 upiu->input_param2 = task_tag;
31 upiu->input_param3 = iid;
32
33 ufshci_ctrlr_submit_task_mgmt_request(ctrlr, req);
34 }
35
36 void
ufshci_ctrlr_cmd_send_nop(struct ufshci_controller * ctrlr,ufshci_cb_fn_t cb_fn,void * cb_arg)37 ufshci_ctrlr_cmd_send_nop(struct ufshci_controller *ctrlr, ufshci_cb_fn_t cb_fn,
38 void *cb_arg)
39 {
40 struct ufshci_request *req;
41 struct ufshci_nop_out_upiu *upiu;
42
43 req = ufshci_allocate_request_vaddr(NULL, 0, M_WAITOK, cb_fn, cb_arg);
44
45 req->request_size = sizeof(struct ufshci_nop_out_upiu);
46 req->response_size = sizeof(struct ufshci_nop_in_upiu);
47
48 upiu = (struct ufshci_nop_out_upiu *)&req->request_upiu;
49 memset(upiu, 0, req->request_size);
50 upiu->header.trans_type = UFSHCI_UPIU_TRANSACTION_CODE_NOP_OUT;
51
52 ufshci_ctrlr_submit_admin_request(ctrlr, req);
53 }
54
55 void
ufshci_ctrlr_cmd_send_query_request(struct ufshci_controller * ctrlr,ufshci_cb_fn_t cb_fn,void * cb_arg,struct ufshci_query_param param)56 ufshci_ctrlr_cmd_send_query_request(struct ufshci_controller *ctrlr,
57 ufshci_cb_fn_t cb_fn, void *cb_arg, struct ufshci_query_param param)
58 {
59 struct ufshci_request *req;
60 struct ufshci_query_request_upiu *upiu;
61
62 req = ufshci_allocate_request_vaddr(NULL, 0, M_WAITOK, cb_fn, cb_arg);
63
64 req->request_size = sizeof(struct ufshci_query_request_upiu);
65 req->response_size = sizeof(struct ufshci_query_response_upiu);
66
67 upiu = (struct ufshci_query_request_upiu *)&req->request_upiu;
68 memset(upiu, 0, req->request_size);
69 upiu->header.trans_type = UFSHCI_UPIU_TRANSACTION_CODE_QUERY_REQUEST;
70 upiu->header.ext_iid_or_function = param.function;
71 upiu->opcode = param.opcode;
72 upiu->idn = param.type;
73 upiu->index = param.index;
74 upiu->selector = param.selector;
75 upiu->value_64 = param.value;
76 upiu->length = param.desc_size;
77
78 ufshci_ctrlr_submit_admin_request(ctrlr, req);
79 }
80