Lines Matching refs:qmi
15 #include <linux/soc/qcom/qmi.h>
17 static struct socket *qmi_sock_create(struct qmi_handle *qmi,
22 * @qmi: qmi handle
31 static void qmi_recv_new_server(struct qmi_handle *qmi,
35 struct qmi_ops *ops = &qmi->ops;
56 ret = ops->new_server(qmi, svc);
60 list_add(&svc->list_node, &qmi->lookup_results);
65 * @qmi: qmi handle
72 static void qmi_recv_del_server(struct qmi_handle *qmi,
75 struct qmi_ops *ops = &qmi->ops;
79 list_for_each_entry_safe(svc, tmp, &qmi->lookup_results, list_node) {
86 ops->del_server(qmi, svc);
95 * @qmi: qmi handle
102 static void qmi_recv_bye(struct qmi_handle *qmi,
105 struct qmi_ops *ops = &qmi->ops;
107 qmi_recv_del_server(qmi, node, -1);
110 ops->bye(qmi, node);
115 * @qmi: qmi handle
121 static void qmi_recv_del_client(struct qmi_handle *qmi,
124 struct qmi_ops *ops = &qmi->ops;
127 ops->del_client(qmi, node, port);
130 static void qmi_recv_ctrl_pkt(struct qmi_handle *qmi,
142 qmi_recv_bye(qmi, le32_to_cpu(pkt->client.node));
145 qmi_recv_new_server(qmi,
152 qmi_recv_del_server(qmi,
157 qmi_recv_del_client(qmi,
164 static void qmi_send_new_lookup(struct qmi_handle *qmi, struct qmi_service *svc)
177 sq.sq_family = qmi->sq.sq_family;
178 sq.sq_node = qmi->sq.sq_node;
184 mutex_lock(&qmi->sock_lock);
185 if (qmi->sock) {
186 ret = kernel_sendmsg(qmi->sock, &msg, &iv, 1, sizeof(pkt));
190 mutex_unlock(&qmi->sock_lock);
195 * @qmi: qmi handle
206 int qmi_add_lookup(struct qmi_handle *qmi, unsigned int service,
219 list_add(&svc->list_node, &qmi->lookups);
221 qmi_send_new_lookup(qmi, svc);
227 static void qmi_send_new_server(struct qmi_handle *qmi, struct qmi_service *svc)
239 pkt.server.node = cpu_to_le32(qmi->sq.sq_node);
240 pkt.server.port = cpu_to_le32(qmi->sq.sq_port);
242 sq.sq_family = qmi->sq.sq_family;
243 sq.sq_node = qmi->sq.sq_node;
249 mutex_lock(&qmi->sock_lock);
250 if (qmi->sock) {
251 ret = kernel_sendmsg(qmi->sock, &msg, &iv, 1, sizeof(pkt));
255 mutex_unlock(&qmi->sock_lock);
260 * @qmi: qmi handle
266 * and start sending messages to the client associated with @qmi.
270 int qmi_add_server(struct qmi_handle *qmi, unsigned int service,
283 list_add(&svc->list_node, &qmi->services);
285 qmi_send_new_server(qmi, svc);
293 * @qmi: QMI handle
307 int qmi_txn_init(struct qmi_handle *qmi, struct qmi_txn *txn,
316 txn->qmi = qmi;
320 mutex_lock(&qmi->txn_lock);
321 ret = idr_alloc_cyclic(&qmi->txns, txn, 0, U16_MAX, GFP_KERNEL);
326 mutex_unlock(&qmi->txn_lock);
345 struct qmi_handle *qmi = txn->qmi;
350 mutex_lock(&qmi->txn_lock);
352 idr_remove(&qmi->txns, txn->id);
354 mutex_unlock(&qmi->txn_lock);
369 struct qmi_handle *qmi = txn->qmi;
371 mutex_lock(&qmi->txn_lock);
373 idr_remove(&qmi->txns, txn->id);
375 mutex_unlock(&qmi->txn_lock);
381 * @qmi: qmi handle
389 static void qmi_invoke_handler(struct qmi_handle *qmi, struct sockaddr_qrtr *sq,
397 if (!qmi->handlers)
400 for (handler = qmi->handlers; handler->fn; handler++) {
417 handler->fn(qmi, sq, txn, dest);
424 * @qmi: the QMI context
439 static void qmi_handle_net_reset(struct qmi_handle *qmi)
445 sock = qmi_sock_create(qmi, &sq);
449 mutex_lock(&qmi->sock_lock);
450 sock_release(qmi->sock);
451 qmi->sock = NULL;
452 mutex_unlock(&qmi->sock_lock);
454 qmi_recv_del_server(qmi, -1, -1);
456 if (qmi->ops.net_reset)
457 qmi->ops.net_reset(qmi);
459 mutex_lock(&qmi->sock_lock);
460 qmi->sock = sock;
461 qmi->sq = sq;
462 mutex_unlock(&qmi->sock_lock);
464 list_for_each_entry(svc, &qmi->lookups, list_node)
465 qmi_send_new_lookup(qmi, svc);
467 list_for_each_entry(svc, &qmi->services, list_node)
468 qmi_send_new_server(qmi, svc);
471 static void qmi_handle_message(struct qmi_handle *qmi,
489 mutex_lock(&qmi->txn_lock);
490 txn = idr_find(&qmi->txns, hdr->txn_id);
494 mutex_unlock(&qmi->txn_lock);
499 mutex_unlock(&qmi->txn_lock);
509 qmi_invoke_handler(qmi, sq, txn, buf, len);
518 qmi_invoke_handler(qmi, sq, &tmp_txn, buf, len);
524 struct qmi_handle *qmi = container_of(work, struct qmi_handle, work);
525 struct qmi_ops *ops = &qmi->ops;
532 iv.iov_base = qmi->recv_buf;
533 iv.iov_len = qmi->recv_buf_size;
535 mutex_lock(&qmi->sock_lock);
536 if (qmi->sock)
537 msglen = kernel_recvmsg(qmi->sock, &msg, &iv, 1,
541 mutex_unlock(&qmi->sock_lock);
546 qmi_handle_net_reset(qmi);
548 /* The old qmi->sock is gone, our work is done */
553 pr_err("qmi recvmsg failed: %zd\n", msglen);
557 if (sq.sq_node == qmi->sq.sq_node &&
559 qmi_recv_ctrl_pkt(qmi, qmi->recv_buf, msglen);
561 ops->msg_handler(qmi, &sq, qmi->recv_buf, msglen);
563 qmi_handle_message(qmi, &sq, qmi->recv_buf, msglen);
570 struct qmi_handle *qmi = sk->sk_user_data;
576 if (!qmi)
579 queue_work(qmi->wq, &qmi->work);
582 static struct socket *qmi_sock_create(struct qmi_handle *qmi,
599 sock->sk->sk_user_data = qmi;
608 * @qmi: QMI handle to initialize
618 int qmi_handle_init(struct qmi_handle *qmi, size_t recv_buf_size,
624 mutex_init(&qmi->txn_lock);
625 mutex_init(&qmi->sock_lock);
627 idr_init(&qmi->txns);
629 INIT_LIST_HEAD(&qmi->lookups);
630 INIT_LIST_HEAD(&qmi->lookup_results);
631 INIT_LIST_HEAD(&qmi->services);
633 INIT_WORK(&qmi->work, qmi_data_ready_work);
635 qmi->handlers = handlers;
637 qmi->ops = *ops;
645 qmi->recv_buf_size = recv_buf_size;
646 qmi->recv_buf = kzalloc(recv_buf_size, GFP_KERNEL);
647 if (!qmi->recv_buf)
650 qmi->wq = alloc_workqueue("qmi_msg_handler", WQ_UNBOUND, 1);
651 if (!qmi->wq) {
656 qmi->sock = qmi_sock_create(qmi, &qmi->sq);
657 if (IS_ERR(qmi->sock)) {
658 if (PTR_ERR(qmi->sock) == -EAFNOSUPPORT) {
662 ret = PTR_ERR(qmi->sock);
670 destroy_workqueue(qmi->wq);
672 kfree(qmi->recv_buf);
680 * @qmi: QMI client handle
684 void qmi_handle_release(struct qmi_handle *qmi)
686 struct socket *sock = qmi->sock;
690 cancel_work_sync(&qmi->work);
692 qmi_recv_del_server(qmi, -1, -1);
694 mutex_lock(&qmi->sock_lock);
696 qmi->sock = NULL;
697 mutex_unlock(&qmi->sock_lock);
699 destroy_workqueue(qmi->wq);
701 idr_destroy(&qmi->txns);
703 kfree(qmi->recv_buf);
706 list_for_each_entry_safe(svc, tmp, &qmi->lookups, list_node) {
712 list_for_each_entry_safe(svc, tmp, &qmi->services, list_node) {
721 * @qmi: QMI client handle
736 static ssize_t qmi_send_message(struct qmi_handle *qmi,
761 mutex_lock(&qmi->sock_lock);
762 if (qmi->sock) {
763 ret = kernel_sendmsg(qmi->sock, &msghdr, &iv, 1, len);
769 mutex_unlock(&qmi->sock_lock);
778 * @qmi: QMI client handle
788 ssize_t qmi_send_request(struct qmi_handle *qmi, struct sockaddr_qrtr *sq,
792 return qmi_send_message(qmi, sq, txn, QMI_REQUEST, msg_id, len, ei,
799 * @qmi: QMI client handle
809 ssize_t qmi_send_response(struct qmi_handle *qmi, struct sockaddr_qrtr *sq,
813 return qmi_send_message(qmi, sq, txn, QMI_RESPONSE, msg_id, len, ei,
820 * @qmi: QMI client handle
829 ssize_t qmi_send_indication(struct qmi_handle *qmi, struct sockaddr_qrtr *sq,
837 ret = qmi_txn_init(qmi, &txn, NULL, NULL);
841 rval = qmi_send_message(qmi, sq, &txn, QMI_INDICATION, msg_id, len, ei,