Lines Matching full:pdr
43 /* control access to pdr lookup/indack lists */
75 struct pdr_handle *pdr = container_of(qmi, struct pdr_handle, in pdr_locator_new_server() local
79 mutex_lock(&pdr->lock); in pdr_locator_new_server()
81 pdr->locator_addr.sq_family = AF_QIPCRTR; in pdr_locator_new_server()
82 pdr->locator_addr.sq_node = svc->node; in pdr_locator_new_server()
83 pdr->locator_addr.sq_port = svc->port; in pdr_locator_new_server()
85 pdr->locator_init_complete = true; in pdr_locator_new_server()
86 mutex_unlock(&pdr->lock); in pdr_locator_new_server()
89 mutex_lock(&pdr->list_lock); in pdr_locator_new_server()
90 list_for_each_entry(pds, &pdr->lookups, node) { in pdr_locator_new_server()
92 schedule_work(&pdr->locator_work); in pdr_locator_new_server()
94 mutex_unlock(&pdr->list_lock); in pdr_locator_new_server()
102 struct pdr_handle *pdr = container_of(qmi, struct pdr_handle, in pdr_locator_del_server() local
105 mutex_lock(&pdr->lock); in pdr_locator_del_server()
106 pdr->locator_init_complete = false; in pdr_locator_del_server()
108 pdr->locator_addr.sq_node = 0; in pdr_locator_del_server()
109 pdr->locator_addr.sq_port = 0; in pdr_locator_del_server()
110 mutex_unlock(&pdr->lock); in pdr_locator_del_server()
118 static int pdr_register_listener(struct pdr_handle *pdr, in pdr_register_listener() argument
127 ret = qmi_txn_init(&pdr->notifier_hdl, &txn, in pdr_register_listener()
136 ret = qmi_send_request(&pdr->notifier_hdl, &pds->addr, in pdr_register_listener()
148 pr_err("PDR: %s register listener txn wait failed: %d\n", in pdr_register_listener()
154 pr_err("PDR: %s register listener failed: 0x%x\n", in pdr_register_listener()
166 struct pdr_handle *pdr = container_of(work, struct pdr_handle, in pdr_notifier_work() local
171 mutex_lock(&pdr->list_lock); in pdr_notifier_work()
172 list_for_each_entry(pds, &pdr->lookups, node) { in pdr_notifier_work()
178 ret = pdr_register_listener(pdr, pds, true); in pdr_notifier_work()
189 mutex_lock(&pdr->status_lock); in pdr_notifier_work()
190 pdr->status(pds->state, pds->service_path, pdr->priv); in pdr_notifier_work()
191 mutex_unlock(&pdr->status_lock); in pdr_notifier_work()
193 mutex_unlock(&pdr->list_lock); in pdr_notifier_work()
199 struct pdr_handle *pdr = container_of(qmi, struct pdr_handle, in pdr_notifier_new_server() local
203 mutex_lock(&pdr->list_lock); in pdr_notifier_new_server()
204 list_for_each_entry(pds, &pdr->lookups, node) { in pdr_notifier_new_server()
212 queue_work(pdr->notifier_wq, &pdr->notifier_work); in pdr_notifier_new_server()
215 mutex_unlock(&pdr->list_lock); in pdr_notifier_new_server()
223 struct pdr_handle *pdr = container_of(qmi, struct pdr_handle, in pdr_notifier_del_server() local
227 mutex_lock(&pdr->list_lock); in pdr_notifier_del_server()
228 list_for_each_entry(pds, &pdr->lookups, node) { in pdr_notifier_del_server()
235 queue_work(pdr->notifier_wq, &pdr->notifier_work); in pdr_notifier_del_server()
238 mutex_unlock(&pdr->list_lock); in pdr_notifier_del_server()
246 static int pdr_send_indack_msg(struct pdr_handle *pdr, struct pdr_service *pds, in pdr_send_indack_msg() argument
254 ret = qmi_txn_init(&pdr->notifier_hdl, &txn, servreg_set_ack_resp_ei, in pdr_send_indack_msg()
262 ret = qmi_send_request(&pdr->notifier_hdl, &pds->addr, in pdr_send_indack_msg()
275 struct pdr_handle *pdr = container_of(work, struct pdr_handle, in pdr_indack_work() local
280 list_for_each_entry_safe(ind, tmp, &pdr->indack_list, node) { in pdr_indack_work()
283 mutex_lock(&pdr->status_lock); in pdr_indack_work()
285 pdr->status(pds->state, pds->service_path, pdr->priv); in pdr_indack_work()
286 mutex_unlock(&pdr->status_lock); in pdr_indack_work()
289 pdr_send_indack_msg(pdr, pds, ind->transaction_id); in pdr_indack_work()
291 mutex_lock(&pdr->list_lock); in pdr_indack_work()
293 mutex_unlock(&pdr->list_lock); in pdr_indack_work()
303 struct pdr_handle *pdr = container_of(qmi, struct pdr_handle, in pdr_indication_cb() local
313 mutex_lock(&pdr->list_lock); in pdr_indication_cb()
314 list_for_each_entry(iter, &pdr->lookups, node) { in pdr_indication_cb()
321 mutex_unlock(&pdr->list_lock); in pdr_indication_cb()
326 pr_info("PDR: Indication received from %s, state: 0x%x, trans-id: %d\n", in pdr_indication_cb()
338 mutex_lock(&pdr->list_lock); in pdr_indication_cb()
339 list_add_tail(&ind->node, &pdr->indack_list); in pdr_indication_cb()
340 mutex_unlock(&pdr->list_lock); in pdr_indication_cb()
342 queue_work(pdr->indack_wq, &pdr->indack_work); in pdr_indication_cb()
358 struct pdr_handle *pdr) in pdr_get_domain_list() argument
363 ret = qmi_txn_init(&pdr->locator_hdl, &txn, in pdr_get_domain_list()
368 mutex_lock(&pdr->lock); in pdr_get_domain_list()
369 ret = qmi_send_request(&pdr->locator_hdl, in pdr_get_domain_list()
370 &pdr->locator_addr, in pdr_get_domain_list()
375 mutex_unlock(&pdr->lock); in pdr_get_domain_list()
383 pr_err("PDR: %s get domain list txn wait failed: %d\n", in pdr_get_domain_list()
389 pr_err("PDR: %s get domain list failed: 0x%x\n", in pdr_get_domain_list()
397 static int pdr_locate_service(struct pdr_handle *pdr, struct pdr_service *pds) in pdr_locate_service() argument
416 ret = pdr_get_domain_list(&req, resp, pdr); in pdr_locate_service()
448 static void pdr_notify_lookup_failure(struct pdr_handle *pdr, in pdr_notify_lookup_failure() argument
452 pr_err("PDR: service lookup for %s failed: %d\n", in pdr_notify_lookup_failure()
460 mutex_lock(&pdr->status_lock); in pdr_notify_lookup_failure()
461 pdr->status(pds->state, pds->service_path, pdr->priv); in pdr_notify_lookup_failure()
462 mutex_unlock(&pdr->status_lock); in pdr_notify_lookup_failure()
468 struct pdr_handle *pdr = container_of(work, struct pdr_handle, in pdr_locator_work() local
474 mutex_lock(&pdr->lock); in pdr_locator_work()
475 if (!pdr->locator_init_complete) { in pdr_locator_work()
476 mutex_unlock(&pdr->lock); in pdr_locator_work()
477 pr_debug("PDR: SERVICE LOCATOR service not available\n"); in pdr_locator_work()
480 mutex_unlock(&pdr->lock); in pdr_locator_work()
482 mutex_lock(&pdr->list_lock); in pdr_locator_work()
483 list_for_each_entry_safe(pds, tmp, &pdr->lookups, node) { in pdr_locator_work()
487 ret = pdr_locate_service(pdr, pds); in pdr_locator_work()
489 pdr_notify_lookup_failure(pdr, pds, ret); in pdr_locator_work()
493 ret = qmi_add_lookup(&pdr->notifier_hdl, pds->service, 1, in pdr_locator_work()
496 pdr_notify_lookup_failure(pdr, pds, ret); in pdr_locator_work()
502 mutex_unlock(&pdr->list_lock); in pdr_locator_work()
507 * @pdr: PDR client handle
511 * Registering a pdr lookup allows for tracking the life cycle of the PD.
516 struct pdr_service *pdr_add_lookup(struct pdr_handle *pdr, in pdr_add_lookup() argument
523 if (IS_ERR_OR_NULL(pdr)) in pdr_add_lookup()
539 mutex_lock(&pdr->list_lock); in pdr_add_lookup()
540 list_for_each_entry(tmp, &pdr->lookups, node) { in pdr_add_lookup()
544 mutex_unlock(&pdr->list_lock); in pdr_add_lookup()
549 list_add(&pds->node, &pdr->lookups); in pdr_add_lookup()
550 mutex_unlock(&pdr->list_lock); in pdr_add_lookup()
552 schedule_work(&pdr->locator_work); in pdr_add_lookup()
563 * @pdr: PDR client handle
566 * Restarts the PD tracked by the PDR client handle for a given service path.
570 int pdr_restart_pd(struct pdr_handle *pdr, struct pdr_service *pds) in pdr_restart_pd() argument
579 if (IS_ERR_OR_NULL(pdr) || IS_ERR_OR_NULL(pds)) in pdr_restart_pd()
582 mutex_lock(&pdr->list_lock); in pdr_restart_pd()
583 list_for_each_entry(tmp, &pdr->lookups, node) { in pdr_restart_pd()
595 mutex_unlock(&pdr->list_lock); in pdr_restart_pd()
600 ret = qmi_txn_init(&pdr->notifier_hdl, &txn, in pdr_restart_pd()
606 ret = qmi_send_request(&pdr->notifier_hdl, &addr, in pdr_restart_pd()
617 pr_err("PDR: %s PD restart txn wait failed: %d\n", in pdr_restart_pd()
622 /* Check response if PDR is disabled */ in pdr_restart_pd()
625 pr_err("PDR: %s PD restart is disabled: 0x%x\n", in pdr_restart_pd()
632 pr_err("PDR: %s request for PD restart failed: 0x%x\n", in pdr_restart_pd()
642 * pdr_handle_alloc() - initialize the PDR client handle
646 * Initializes the PDR client handle to allow for tracking/restart of PDs.
654 struct pdr_handle *pdr; in pdr_handle_alloc() local
660 pdr = kzalloc(sizeof(*pdr), GFP_KERNEL); in pdr_handle_alloc()
661 if (!pdr) in pdr_handle_alloc()
664 pdr->status = status; in pdr_handle_alloc()
665 pdr->priv = priv; in pdr_handle_alloc()
667 mutex_init(&pdr->status_lock); in pdr_handle_alloc()
668 mutex_init(&pdr->list_lock); in pdr_handle_alloc()
669 mutex_init(&pdr->lock); in pdr_handle_alloc()
671 INIT_LIST_HEAD(&pdr->lookups); in pdr_handle_alloc()
672 INIT_LIST_HEAD(&pdr->indack_list); in pdr_handle_alloc()
674 INIT_WORK(&pdr->locator_work, pdr_locator_work); in pdr_handle_alloc()
675 INIT_WORK(&pdr->notifier_work, pdr_notifier_work); in pdr_handle_alloc()
676 INIT_WORK(&pdr->indack_work, pdr_indack_work); in pdr_handle_alloc()
678 pdr->notifier_wq = create_singlethread_workqueue("pdr_notifier_wq"); in pdr_handle_alloc()
679 if (!pdr->notifier_wq) { in pdr_handle_alloc()
684 pdr->indack_wq = alloc_ordered_workqueue("pdr_indack_wq", WQ_HIGHPRI); in pdr_handle_alloc()
685 if (!pdr->indack_wq) { in pdr_handle_alloc()
690 ret = qmi_handle_init(&pdr->locator_hdl, in pdr_handle_alloc()
696 ret = qmi_add_lookup(&pdr->locator_hdl, SERVREG_LOCATOR_SERVICE, 1, 1); in pdr_handle_alloc()
700 ret = qmi_handle_init(&pdr->notifier_hdl, in pdr_handle_alloc()
707 return pdr; in pdr_handle_alloc()
710 qmi_handle_release(&pdr->locator_hdl); in pdr_handle_alloc()
712 destroy_workqueue(pdr->indack_wq); in pdr_handle_alloc()
714 destroy_workqueue(pdr->notifier_wq); in pdr_handle_alloc()
716 kfree(pdr); in pdr_handle_alloc()
723 * pdr_handle_release() - release the PDR client handle
724 * @pdr: PDR client handle
728 void pdr_handle_release(struct pdr_handle *pdr) in pdr_handle_release() argument
732 if (IS_ERR_OR_NULL(pdr)) in pdr_handle_release()
735 mutex_lock(&pdr->list_lock); in pdr_handle_release()
736 list_for_each_entry_safe(pds, tmp, &pdr->lookups, node) { in pdr_handle_release()
740 mutex_unlock(&pdr->list_lock); in pdr_handle_release()
742 cancel_work_sync(&pdr->locator_work); in pdr_handle_release()
743 cancel_work_sync(&pdr->notifier_work); in pdr_handle_release()
744 cancel_work_sync(&pdr->indack_work); in pdr_handle_release()
746 destroy_workqueue(pdr->notifier_wq); in pdr_handle_release()
747 destroy_workqueue(pdr->indack_wq); in pdr_handle_release()
749 qmi_handle_release(&pdr->locator_hdl); in pdr_handle_release()
750 qmi_handle_release(&pdr->notifier_hdl); in pdr_handle_release()
752 kfree(pdr); in pdr_handle_release()