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 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_NOWAIT, 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 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 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