xref: /wlan-driver/qcacld-3.0/os_if/qmi/src/os_if_qmi.c (revision 5113495b16420b49004c444715d2daae2066e7dc)
1*5113495bSYour Name /*
2*5113495bSYour Name  * Copyright (c) 2022-2023 Qualcomm Innovation Center, Inc. All rights reserved.
3*5113495bSYour Name  *
4*5113495bSYour Name  * Permission to use, copy, modify, and/or distribute this software for any
5*5113495bSYour Name  * purpose with or without fee is hereby granted, provided that the above
6*5113495bSYour Name  * copyright notice and this permission notice appear in all copies.
7*5113495bSYour Name  *
8*5113495bSYour Name  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
9*5113495bSYour Name  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
10*5113495bSYour Name  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
11*5113495bSYour Name  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
12*5113495bSYour Name  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
13*5113495bSYour Name  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
14*5113495bSYour Name  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
15*5113495bSYour Name  */
16*5113495bSYour Name 
17*5113495bSYour Name /**
18*5113495bSYour Name  * DOC: os_if_qmi.c
19*5113495bSYour Name  *
20*5113495bSYour Name  * This file contains definitions of wrapper APIs for QMI HLOS APIs
21*5113495bSYour Name  */
22*5113495bSYour Name 
23*5113495bSYour Name #include "os_if_qmi.h"
24*5113495bSYour Name #include "wlan_qmi_ucfg_api.h"
25*5113495bSYour Name 
os_if_qmi_handle_init(struct qmi_handle * qmi_hdl,qdf_size_t recv_buf_size,const struct qmi_ops * ops,const struct qmi_msg_handler * qmi_msg_handlers)26*5113495bSYour Name QDF_STATUS os_if_qmi_handle_init(struct qmi_handle *qmi_hdl,
27*5113495bSYour Name 				 qdf_size_t recv_buf_size,
28*5113495bSYour Name 				 const struct qmi_ops *ops,
29*5113495bSYour Name 				 const struct qmi_msg_handler *qmi_msg_handlers)
30*5113495bSYour Name {
31*5113495bSYour Name 	int ret;
32*5113495bSYour Name 
33*5113495bSYour Name 	ret = qmi_handle_init(qmi_hdl, recv_buf_size, ops, qmi_msg_handlers);
34*5113495bSYour Name 	if (ret < 0) {
35*5113495bSYour Name 		osif_err("QMI handle initialization failed %d", ret);
36*5113495bSYour Name 		return qdf_status_from_os_return(ret);
37*5113495bSYour Name 	}
38*5113495bSYour Name 
39*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
40*5113495bSYour Name }
41*5113495bSYour Name 
os_if_qmi_handle_release(struct qmi_handle * qmi_hdl)42*5113495bSYour Name void os_if_qmi_handle_release(struct qmi_handle *qmi_hdl)
43*5113495bSYour Name {
44*5113495bSYour Name 	qmi_handle_release(qmi_hdl);
45*5113495bSYour Name }
46*5113495bSYour Name 
os_if_qmi_add_lookup(struct qmi_handle * qmi_hdl,unsigned int service,unsigned int version,unsigned int instance)47*5113495bSYour Name QDF_STATUS os_if_qmi_add_lookup(struct qmi_handle *qmi_hdl,
48*5113495bSYour Name 				unsigned int service, unsigned int version,
49*5113495bSYour Name 				unsigned int instance)
50*5113495bSYour Name {
51*5113495bSYour Name 	int ret;
52*5113495bSYour Name 
53*5113495bSYour Name 	ret = qmi_add_lookup(qmi_hdl, service, version, instance);
54*5113495bSYour Name 	if (ret < 0) {
55*5113495bSYour Name 		osif_err("QMI add lookup failed %d", ret);
56*5113495bSYour Name 		return qdf_status_from_os_return(ret);
57*5113495bSYour Name 	}
58*5113495bSYour Name 
59*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
60*5113495bSYour Name }
61*5113495bSYour Name 
os_if_qmi_connect_to_svc(struct qmi_handle * qmi_hdl,struct qmi_service * qmi_svc)62*5113495bSYour Name QDF_STATUS os_if_qmi_connect_to_svc(struct qmi_handle *qmi_hdl,
63*5113495bSYour Name 				    struct qmi_service *qmi_svc)
64*5113495bSYour Name {
65*5113495bSYour Name 	struct sockaddr_qrtr sq = { 0 };
66*5113495bSYour Name 	int ret;
67*5113495bSYour Name 
68*5113495bSYour Name 	osif_debug("QMI server arriving: node %u port %u", qmi_svc->node,
69*5113495bSYour Name 		   qmi_svc->port);
70*5113495bSYour Name 
71*5113495bSYour Name 	sq.sq_family = AF_QIPCRTR;
72*5113495bSYour Name 	sq.sq_node = qmi_svc->node;
73*5113495bSYour Name 	sq.sq_port = qmi_svc->port;
74*5113495bSYour Name 
75*5113495bSYour Name 	ret = kernel_connect(qmi_hdl->sock, (struct sockaddr *)&sq,
76*5113495bSYour Name 			     sizeof(sq), 0);
77*5113495bSYour Name 	if (ret < 0) {
78*5113495bSYour Name 		osif_err("Failed to connect to QMI remote service %d", ret);
79*5113495bSYour Name 		return qdf_status_from_os_return(ret);
80*5113495bSYour Name 	}
81*5113495bSYour Name 
82*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
83*5113495bSYour Name }
84*5113495bSYour Name 
os_if_qmi_txn_init(struct qmi_handle * qmi_hdl,struct qmi_txn * qmi_txn,struct qmi_elem_info * qmi_ei,void * resp)85*5113495bSYour Name QDF_STATUS os_if_qmi_txn_init(struct qmi_handle *qmi_hdl,
86*5113495bSYour Name 			      struct qmi_txn *qmi_txn,
87*5113495bSYour Name 			      struct qmi_elem_info *qmi_ei, void *resp)
88*5113495bSYour Name {
89*5113495bSYour Name 	int ret;
90*5113495bSYour Name 
91*5113495bSYour Name 	ret = qmi_txn_init(qmi_hdl, qmi_txn, qmi_ei, resp);
92*5113495bSYour Name 	if (ret < 0)
93*5113495bSYour Name 		return qdf_status_from_os_return(ret);
94*5113495bSYour Name 
95*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
96*5113495bSYour Name }
97*5113495bSYour Name 
os_if_qmi_send_request(struct qmi_handle * qmi_hdl,struct sockaddr_qrtr * sq,struct qmi_txn * qmi_txn,int msg_id,uint32_t len,struct qmi_elem_info * ei,const void * req)98*5113495bSYour Name QDF_STATUS os_if_qmi_send_request(struct qmi_handle *qmi_hdl,
99*5113495bSYour Name 				  struct sockaddr_qrtr *sq,
100*5113495bSYour Name 				  struct qmi_txn *qmi_txn, int msg_id,
101*5113495bSYour Name 				  uint32_t len, struct qmi_elem_info *ei,
102*5113495bSYour Name 				  const void *req)
103*5113495bSYour Name {
104*5113495bSYour Name 	int ret;
105*5113495bSYour Name 
106*5113495bSYour Name 	ret = qmi_send_request(qmi_hdl, sq, qmi_txn, msg_id, len, ei, req);
107*5113495bSYour Name 	if (ret < 0)
108*5113495bSYour Name 		return qdf_status_from_os_return(ret);
109*5113495bSYour Name 
110*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
111*5113495bSYour Name }
112*5113495bSYour Name 
os_if_qmi_txn_wait(struct qmi_txn * qmi_txn,unsigned long timeout)113*5113495bSYour Name QDF_STATUS os_if_qmi_txn_wait(struct qmi_txn *qmi_txn, unsigned long timeout)
114*5113495bSYour Name {
115*5113495bSYour Name 	int ret;
116*5113495bSYour Name 
117*5113495bSYour Name 	ret = qmi_txn_wait(qmi_txn, timeout);
118*5113495bSYour Name 	if (ret < 0)
119*5113495bSYour Name 		return qdf_status_from_os_return(ret);
120*5113495bSYour Name 
121*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
122*5113495bSYour Name }
123*5113495bSYour Name 
os_if_qmi_txn_cancel(struct qmi_txn * qmi_txn)124*5113495bSYour Name void os_if_qmi_txn_cancel(struct qmi_txn *qmi_txn)
125*5113495bSYour Name {
126*5113495bSYour Name 	qmi_txn_cancel(qmi_txn);
127*5113495bSYour Name }
128*5113495bSYour Name 
os_if_qmi_register_callbacks(struct wlan_objmgr_psoc * psoc,struct wlan_qmi_psoc_callbacks * cb_obj)129*5113495bSYour Name void os_if_qmi_register_callbacks(struct wlan_objmgr_psoc *psoc,
130*5113495bSYour Name 				  struct wlan_qmi_psoc_callbacks *cb_obj)
131*5113495bSYour Name {
132*5113495bSYour Name 	os_if_qmi_wfds_register_callbacks(cb_obj);
133*5113495bSYour Name 	ucfg_qmi_register_os_if_callbacks(psoc, cb_obj);
134*5113495bSYour Name }
135