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