Lines Matching refs:qmi

16 #include <linux/soc/qcom/qmi.h>
18 static struct socket *qmi_sock_create(struct qmi_handle *qmi,
23 * @qmi: qmi handle
32 static void qmi_recv_new_server(struct qmi_handle *qmi,
36 struct qmi_ops *ops = &qmi->ops;
57 ret = ops->new_server(qmi, svc);
61 list_add(&svc->list_node, &qmi->lookup_results);
66 * @qmi: qmi handle
73 static void qmi_recv_del_server(struct qmi_handle *qmi,
76 struct qmi_ops *ops = &qmi->ops;
80 list_for_each_entry_safe(svc, tmp, &qmi->lookup_results, list_node) {
87 ops->del_server(qmi, svc);
96 * @qmi: qmi handle
103 static void qmi_recv_bye(struct qmi_handle *qmi,
106 struct qmi_ops *ops = &qmi->ops;
108 qmi_recv_del_server(qmi, node, -1);
111 ops->bye(qmi, node);
116 * @qmi: qmi handle
122 static void qmi_recv_del_client(struct qmi_handle *qmi,
125 struct qmi_ops *ops = &qmi->ops;
128 ops->del_client(qmi, node, port);
131 static void qmi_recv_ctrl_pkt(struct qmi_handle *qmi,
143 qmi_recv_bye(qmi, le32_to_cpu(pkt->client.node));
146 qmi_recv_new_server(qmi,
153 qmi_recv_del_server(qmi,
158 qmi_recv_del_client(qmi,
165 static void qmi_send_new_lookup(struct qmi_handle *qmi, struct qmi_service *svc)
178 sq.sq_family = qmi->sq.sq_family;
179 sq.sq_node = qmi->sq.sq_node;
185 mutex_lock(&qmi->sock_lock);
186 if (qmi->sock) {
187 ret = kernel_sendmsg(qmi->sock, &msg, &iv, 1, sizeof(pkt));
191 mutex_unlock(&qmi->sock_lock);
196 * @qmi: qmi handle
207 int qmi_add_lookup(struct qmi_handle *qmi, unsigned int service,
220 list_add(&svc->list_node, &qmi->lookups);
222 qmi_send_new_lookup(qmi, svc);
228 static void qmi_send_new_server(struct qmi_handle *qmi, struct qmi_service *svc)
240 pkt.server.node = cpu_to_le32(qmi->sq.sq_node);
241 pkt.server.port = cpu_to_le32(qmi->sq.sq_port);
243 sq.sq_family = qmi->sq.sq_family;
244 sq.sq_node = qmi->sq.sq_node;
250 mutex_lock(&qmi->sock_lock);
251 if (qmi->sock) {
252 ret = kernel_sendmsg(qmi->sock, &msg, &iv, 1, sizeof(pkt));
256 mutex_unlock(&qmi->sock_lock);
261 * @qmi: qmi handle
267 * and start sending messages to the client associated with @qmi.
271 int qmi_add_server(struct qmi_handle *qmi, unsigned int service,
284 list_add(&svc->list_node, &qmi->services);
286 qmi_send_new_server(qmi, svc);
294 * @qmi: QMI handle
308 int qmi_txn_init(struct qmi_handle *qmi, struct qmi_txn *txn,
317 txn->qmi = qmi;
321 mutex_lock(&qmi->txn_lock);
322 ret = idr_alloc_cyclic(&qmi->txns, txn, 0, U16_MAX, GFP_KERNEL);
327 mutex_unlock(&qmi->txn_lock);
346 struct qmi_handle *qmi = txn->qmi;
351 mutex_lock(&qmi->txn_lock);
353 idr_remove(&qmi->txns, txn->id);
355 mutex_unlock(&qmi->txn_lock);
370 struct qmi_handle *qmi = txn->qmi;
372 mutex_lock(&qmi->txn_lock);
374 idr_remove(&qmi->txns, txn->id);
376 mutex_unlock(&qmi->txn_lock);
382 * @qmi: qmi handle
390 static void qmi_invoke_handler(struct qmi_handle *qmi, struct sockaddr_qrtr *sq,
398 if (!qmi->handlers)
401 for (handler = qmi->handlers; handler->fn; handler++) {
418 handler->fn(qmi, sq, txn, dest);
425 * @qmi: the QMI context
440 static void qmi_handle_net_reset(struct qmi_handle *qmi)
446 sock = qmi_sock_create(qmi, &sq);
450 mutex_lock(&qmi->sock_lock);
451 sock_release(qmi->sock);
452 qmi->sock = NULL;
453 mutex_unlock(&qmi->sock_lock);
455 qmi_recv_del_server(qmi, -1, -1);
457 if (qmi->ops.net_reset)
458 qmi->ops.net_reset(qmi);
460 mutex_lock(&qmi->sock_lock);
461 qmi->sock = sock;
462 qmi->sq = sq;
463 mutex_unlock(&qmi->sock_lock);
465 list_for_each_entry(svc, &qmi->lookups, list_node)
466 qmi_send_new_lookup(qmi, svc);
468 list_for_each_entry(svc, &qmi->services, list_node)
469 qmi_send_new_server(qmi, svc);
472 static void qmi_handle_message(struct qmi_handle *qmi,
490 mutex_lock(&qmi->txn_lock);
491 txn = idr_find(&qmi->txns, hdr->txn_id);
495 mutex_unlock(&qmi->txn_lock);
500 mutex_unlock(&qmi->txn_lock);
510 qmi_invoke_handler(qmi, sq, txn, buf, len);
519 qmi_invoke_handler(qmi, sq, &tmp_txn, buf, len);
525 struct qmi_handle *qmi = container_of(work, struct qmi_handle, work);
526 struct qmi_ops *ops = &qmi->ops;
533 iv.iov_base = qmi->recv_buf;
534 iv.iov_len = qmi->recv_buf_size;
536 mutex_lock(&qmi->sock_lock);
537 if (qmi->sock)
538 msglen = kernel_recvmsg(qmi->sock, &msg, &iv, 1,
542 mutex_unlock(&qmi->sock_lock);
547 qmi_handle_net_reset(qmi);
549 /* The old qmi->sock is gone, our work is done */
554 pr_err("qmi recvmsg failed: %zd\n", msglen);
558 if (sq.sq_node == qmi->sq.sq_node &&
560 qmi_recv_ctrl_pkt(qmi, qmi->recv_buf, msglen);
562 ops->msg_handler(qmi, &sq, qmi->recv_buf, msglen);
564 qmi_handle_message(qmi, &sq, qmi->recv_buf, msglen);
571 struct qmi_handle *qmi = sk->sk_user_data;
579 if (!qmi)
582 queue_work(qmi->wq, &qmi->work);
585 static struct socket *qmi_sock_create(struct qmi_handle *qmi,
602 sock->sk->sk_user_data = qmi;
611 * @qmi: QMI handle to initialize
621 int qmi_handle_init(struct qmi_handle *qmi, size_t recv_buf_size,
627 mutex_init(&qmi->txn_lock);
628 mutex_init(&qmi->sock_lock);
630 idr_init(&qmi->txns);
632 INIT_LIST_HEAD(&qmi->lookups);
633 INIT_LIST_HEAD(&qmi->lookup_results);
634 INIT_LIST_HEAD(&qmi->services);
636 INIT_WORK(&qmi->work, qmi_data_ready_work);
638 qmi->handlers = handlers;
640 qmi->ops = *ops;
648 qmi->recv_buf_size = recv_buf_size;
649 qmi->recv_buf = kzalloc(recv_buf_size, GFP_KERNEL);
650 if (!qmi->recv_buf)
653 qmi->wq = alloc_ordered_workqueue("qmi_msg_handler", 0);
654 if (!qmi->wq) {
659 qmi->sock = qmi_sock_create(qmi, &qmi->sq);
660 if (IS_ERR(qmi->sock)) {
661 if (PTR_ERR(qmi->sock) == -EAFNOSUPPORT) {
665 ret = PTR_ERR(qmi->sock);
673 destroy_workqueue(qmi->wq);
675 kfree(qmi->recv_buf);
683 * @qmi: QMI client handle
687 void qmi_handle_release(struct qmi_handle *qmi)
689 struct socket *sock = qmi->sock;
693 cancel_work_sync(&qmi->work);
695 qmi_recv_del_server(qmi, -1, -1);
697 mutex_lock(&qmi->sock_lock);
699 qmi->sock = NULL;
700 mutex_unlock(&qmi->sock_lock);
702 destroy_workqueue(qmi->wq);
704 idr_destroy(&qmi->txns);
706 kfree(qmi->recv_buf);
709 list_for_each_entry_safe(svc, tmp, &qmi->lookups, list_node) {
715 list_for_each_entry_safe(svc, tmp, &qmi->services, list_node) {
724 * @qmi: QMI client handle
739 static ssize_t qmi_send_message(struct qmi_handle *qmi,
765 mutex_lock(&qmi->sock_lock);
766 if (qmi->sock) {
767 ret = kernel_sendmsg(qmi->sock, &msghdr, &iv, 1, len);
773 mutex_unlock(&qmi->sock_lock);
782 * @qmi: QMI client handle
792 ssize_t qmi_send_request(struct qmi_handle *qmi, struct sockaddr_qrtr *sq,
796 return qmi_send_message(qmi, sq, txn, QMI_REQUEST, msg_id, len, ei,
803 * @qmi: QMI client handle
813 ssize_t qmi_send_response(struct qmi_handle *qmi, struct sockaddr_qrtr *sq,
817 return qmi_send_message(qmi, sq, txn, QMI_RESPONSE, msg_id, len, ei,
824 * @qmi: QMI client handle
833 ssize_t qmi_send_indication(struct qmi_handle *qmi, struct sockaddr_qrtr *sq,
842 ret = qmi_txn_init(qmi, &txn, NULL, NULL);
846 rval = qmi_send_message(qmi, sq, &txn, QMI_INDICATION, msg_id, len, ei,