Lines Matching refs:channel

216 	struct glink_channel *channel;  in qcom_glink_alloc_channel()  local
218 channel = kzalloc(sizeof(*channel), GFP_KERNEL); in qcom_glink_alloc_channel()
219 if (!channel) in qcom_glink_alloc_channel()
223 spin_lock_init(&channel->recv_lock); in qcom_glink_alloc_channel()
224 spin_lock_init(&channel->intent_lock); in qcom_glink_alloc_channel()
225 mutex_init(&channel->intent_req_lock); in qcom_glink_alloc_channel()
227 channel->glink = glink; in qcom_glink_alloc_channel()
228 channel->name = kstrdup(name, GFP_KERNEL); in qcom_glink_alloc_channel()
230 init_completion(&channel->open_req); in qcom_glink_alloc_channel()
231 init_completion(&channel->open_ack); in qcom_glink_alloc_channel()
232 init_completion(&channel->intent_req_comp); in qcom_glink_alloc_channel()
234 INIT_LIST_HEAD(&channel->done_intents); in qcom_glink_alloc_channel()
235 INIT_WORK(&channel->intent_work, qcom_glink_rx_done_work); in qcom_glink_alloc_channel()
237 idr_init(&channel->liids); in qcom_glink_alloc_channel()
238 idr_init(&channel->riids); in qcom_glink_alloc_channel()
239 kref_init(&channel->refcount); in qcom_glink_alloc_channel()
241 return channel; in qcom_glink_alloc_channel()
246 struct glink_channel *channel = container_of(ref, struct glink_channel, in qcom_glink_channel_release() local
254 cancel_work_sync(&channel->intent_work); in qcom_glink_channel_release()
256 spin_lock_irqsave(&channel->intent_lock, flags); in qcom_glink_channel_release()
258 list_for_each_entry_safe(intent, tmp, &channel->done_intents, node) { in qcom_glink_channel_release()
265 idr_for_each_entry(&channel->liids, tmp, iid) { in qcom_glink_channel_release()
269 idr_destroy(&channel->liids); in qcom_glink_channel_release()
271 idr_for_each_entry(&channel->riids, tmp, iid) in qcom_glink_channel_release()
273 idr_destroy(&channel->riids); in qcom_glink_channel_release()
274 spin_unlock_irqrestore(&channel->intent_lock, flags); in qcom_glink_channel_release()
276 kfree(channel->name); in qcom_glink_channel_release()
277 kfree(channel); in qcom_glink_channel_release()
393 struct glink_channel *channel) in qcom_glink_send_open_ack() argument
398 msg.param1 = cpu_to_le16(channel->rcid); in qcom_glink_send_open_ack()
407 struct glink_channel *channel; in qcom_glink_handle_intent_req_ack() local
411 channel = idr_find(&glink->rcids, cid); in qcom_glink_handle_intent_req_ack()
413 if (!channel) { in qcom_glink_handle_intent_req_ack()
418 channel->intent_req_result = granted; in qcom_glink_handle_intent_req_ack()
419 complete(&channel->intent_req_comp); in qcom_glink_handle_intent_req_ack()
433 struct glink_channel *channel) in qcom_glink_send_open_req() argument
439 int name_len = strlen(channel->name) + 1; in qcom_glink_send_open_req()
444 kref_get(&channel->refcount); in qcom_glink_send_open_req()
447 ret = idr_alloc_cyclic(&glink->lcids, channel, in qcom_glink_send_open_req()
454 channel->lcid = ret; in qcom_glink_send_open_req()
457 req.msg.param1 = cpu_to_le16(channel->lcid); in qcom_glink_send_open_req()
459 strcpy(req.name, channel->name); in qcom_glink_send_open_req()
469 idr_remove(&glink->lcids, channel->lcid); in qcom_glink_send_open_req()
470 channel->lcid = 0; in qcom_glink_send_open_req()
477 struct glink_channel *channel) in qcom_glink_send_close_req() argument
482 req.param1 = cpu_to_le16(channel->lcid); in qcom_glink_send_close_req()
502 struct glink_channel *channel = container_of(work, struct glink_channel, in qcom_glink_rx_done_work() local
504 struct qcom_glink *glink = channel->glink; in qcom_glink_rx_done_work()
512 unsigned int cid = channel->lcid; in qcom_glink_rx_done_work()
517 spin_lock_irqsave(&channel->intent_lock, flags); in qcom_glink_rx_done_work()
518 list_for_each_entry_safe(intent, tmp, &channel->done_intents, node) { in qcom_glink_rx_done_work()
520 spin_unlock_irqrestore(&channel->intent_lock, flags); in qcom_glink_rx_done_work()
533 spin_lock_irqsave(&channel->intent_lock, flags); in qcom_glink_rx_done_work()
535 spin_unlock_irqrestore(&channel->intent_lock, flags); in qcom_glink_rx_done_work()
539 struct glink_channel *channel, in qcom_glink_rx_done() argument
551 spin_lock(&channel->intent_lock); in qcom_glink_rx_done()
552 idr_remove(&channel->liids, intent->id); in qcom_glink_rx_done()
553 spin_unlock(&channel->intent_lock); in qcom_glink_rx_done()
557 spin_lock(&channel->intent_lock); in qcom_glink_rx_done()
558 list_add_tail(&intent->node, &channel->done_intents); in qcom_glink_rx_done()
559 spin_unlock(&channel->intent_lock); in qcom_glink_rx_done()
561 schedule_work(&channel->intent_work); in qcom_glink_rx_done()
631 struct glink_channel *channel, in qcom_glink_send_intent_req_ack() argument
637 msg.param1 = cpu_to_le16(channel->lcid); in qcom_glink_send_intent_req_ack()
655 struct glink_channel *channel, in qcom_glink_advertise_intent() argument
668 cmd.lcid = cpu_to_le16(channel->lcid); in qcom_glink_advertise_intent()
680 struct glink_channel *channel, in qcom_glink_alloc_intent() argument
696 spin_lock_irqsave(&channel->intent_lock, flags); in qcom_glink_alloc_intent()
697 ret = idr_alloc_cyclic(&channel->liids, intent, 1, -1, GFP_ATOMIC); in qcom_glink_alloc_intent()
699 spin_unlock_irqrestore(&channel->intent_lock, flags); in qcom_glink_alloc_intent()
702 spin_unlock_irqrestore(&channel->intent_lock, flags); in qcom_glink_alloc_intent()
722 struct glink_channel *channel; in qcom_glink_handle_rx_done() local
726 channel = idr_find(&glink->rcids, cid); in qcom_glink_handle_rx_done()
728 if (!channel) { in qcom_glink_handle_rx_done()
733 spin_lock_irqsave(&channel->intent_lock, flags); in qcom_glink_handle_rx_done()
734 intent = idr_find(&channel->riids, iid); in qcom_glink_handle_rx_done()
737 spin_unlock_irqrestore(&channel->intent_lock, flags); in qcom_glink_handle_rx_done()
745 idr_remove(&channel->riids, intent->id); in qcom_glink_handle_rx_done()
748 spin_unlock_irqrestore(&channel->intent_lock, flags); in qcom_glink_handle_rx_done()
765 struct glink_channel *channel; in qcom_glink_handle_intent_req() local
769 channel = idr_find(&glink->rcids, cid); in qcom_glink_handle_intent_req()
772 if (!channel) { in qcom_glink_handle_intent_req()
777 intent = qcom_glink_alloc_intent(glink, channel, size, false); in qcom_glink_handle_intent_req()
779 qcom_glink_advertise_intent(glink, channel, intent); in qcom_glink_handle_intent_req()
781 qcom_glink_send_intent_req_ack(glink, channel, !!intent); in qcom_glink_handle_intent_req()
816 struct glink_channel *channel; in qcom_glink_rx_data() local
845 channel = idr_find(&glink->rcids, rcid); in qcom_glink_rx_data()
847 if (!channel) { in qcom_glink_rx_data()
856 if (!channel->buf) { in qcom_glink_rx_data()
872 channel->buf = intent; in qcom_glink_rx_data()
874 intent = channel->buf; in qcom_glink_rx_data()
879 spin_lock_irqsave(&channel->intent_lock, flags); in qcom_glink_rx_data()
880 intent = idr_find(&channel->liids, liid); in qcom_glink_rx_data()
881 spin_unlock_irqrestore(&channel->intent_lock, flags); in qcom_glink_rx_data()
886 channel->name, liid); in qcom_glink_rx_data()
905 spin_lock(&channel->recv_lock); in qcom_glink_rx_data()
906 if (channel->ept.cb) { in qcom_glink_rx_data()
907 channel->ept.cb(channel->ept.rpdev, in qcom_glink_rx_data()
910 channel->ept.priv, in qcom_glink_rx_data()
913 spin_unlock(&channel->recv_lock); in qcom_glink_rx_data()
916 channel->buf = NULL; in qcom_glink_rx_data()
918 qcom_glink_rx_done(glink, channel, intent); in qcom_glink_rx_data()
933 struct glink_channel *channel; in qcom_glink_handle_intent() local
955 channel = idr_find(&glink->rcids, cid); in qcom_glink_handle_intent()
957 if (!channel) { in qcom_glink_handle_intent()
976 spin_lock_irqsave(&channel->intent_lock, flags); in qcom_glink_handle_intent()
977 ret = idr_alloc(&channel->riids, intent, in qcom_glink_handle_intent()
979 spin_unlock_irqrestore(&channel->intent_lock, flags); in qcom_glink_handle_intent()
991 struct glink_channel *channel; in qcom_glink_rx_open_ack() local
994 channel = idr_find(&glink->lcids, lcid); in qcom_glink_rx_open_ack()
996 if (!channel) { in qcom_glink_rx_open_ack()
1001 complete_all(&channel->open_ack); in qcom_glink_rx_open_ack()
1087 struct glink_channel *channel; in qcom_glink_create_local() local
1091 channel = qcom_glink_alloc_channel(glink, name); in qcom_glink_create_local()
1092 if (IS_ERR(channel)) in qcom_glink_create_local()
1093 return ERR_CAST(channel); in qcom_glink_create_local()
1095 ret = qcom_glink_send_open_req(glink, channel); in qcom_glink_create_local()
1099 ret = wait_for_completion_timeout(&channel->open_ack, 5 * HZ); in qcom_glink_create_local()
1103 ret = wait_for_completion_timeout(&channel->open_req, 5 * HZ); in qcom_glink_create_local()
1107 qcom_glink_send_open_ack(glink, channel); in qcom_glink_create_local()
1109 return channel; in qcom_glink_create_local()
1114 idr_remove(&glink->lcids, channel->lcid); in qcom_glink_create_local()
1119 kref_put(&channel->refcount, qcom_glink_channel_release); in qcom_glink_create_local()
1121 kref_put(&channel->refcount, qcom_glink_channel_release); in qcom_glink_create_local()
1128 struct glink_channel *channel) in qcom_glink_create_remote() argument
1132 qcom_glink_send_open_ack(glink, channel); in qcom_glink_create_remote()
1134 ret = qcom_glink_send_open_req(glink, channel); in qcom_glink_create_remote()
1138 ret = wait_for_completion_timeout(&channel->open_ack, 5 * HZ); in qcom_glink_create_remote()
1153 qcom_glink_send_close_req(glink, channel); in qcom_glink_create_remote()
1165 struct glink_channel *channel; in qcom_glink_create_ept() local
1174 idr_for_each_entry(&glink->rcids, channel, cid) { in qcom_glink_create_ept()
1175 if (!strcmp(channel->name, name)) in qcom_glink_create_ept()
1180 if (!channel) { in qcom_glink_create_ept()
1181 channel = qcom_glink_create_local(glink, name); in qcom_glink_create_ept()
1182 if (IS_ERR(channel)) in qcom_glink_create_ept()
1185 ret = qcom_glink_create_remote(glink, channel); in qcom_glink_create_ept()
1190 ept = &channel->ept; in qcom_glink_create_ept()
1201 struct glink_channel *channel = to_glink_channel(rpdev->ept); in qcom_glink_announce_create() local
1203 struct qcom_glink *glink = channel->glink; in qcom_glink_announce_create()
1212 if (glink->intentless || !completion_done(&channel->open_ack)) in qcom_glink_announce_create()
1226 intent = qcom_glink_alloc_intent(glink, channel, size, in qcom_glink_announce_create()
1231 qcom_glink_advertise_intent(glink, channel, intent); in qcom_glink_announce_create()
1239 struct glink_channel *channel = to_glink_channel(ept); in qcom_glink_destroy_ept() local
1240 struct qcom_glink *glink = channel->glink; in qcom_glink_destroy_ept()
1243 spin_lock_irqsave(&channel->recv_lock, flags); in qcom_glink_destroy_ept()
1244 channel->ept.cb = NULL; in qcom_glink_destroy_ept()
1245 spin_unlock_irqrestore(&channel->recv_lock, flags); in qcom_glink_destroy_ept()
1248 channel->rpdev = NULL; in qcom_glink_destroy_ept()
1250 qcom_glink_send_close_req(glink, channel); in qcom_glink_destroy_ept()
1254 struct glink_channel *channel, in qcom_glink_request_intent() argument
1265 mutex_lock(&channel->intent_req_lock); in qcom_glink_request_intent()
1267 reinit_completion(&channel->intent_req_comp); in qcom_glink_request_intent()
1270 cmd.cid = channel->lcid; in qcom_glink_request_intent()
1277 ret = wait_for_completion_timeout(&channel->intent_req_comp, 10 * HZ); in qcom_glink_request_intent()
1282 ret = channel->intent_req_result ? 0 : -ECANCELED; in qcom_glink_request_intent()
1286 mutex_unlock(&channel->intent_req_lock); in qcom_glink_request_intent()
1290 static int __qcom_glink_send(struct glink_channel *channel, in __qcom_glink_send() argument
1293 struct qcom_glink *glink = channel->glink; in __qcom_glink_send()
1309 spin_lock_irqsave(&channel->intent_lock, flags); in __qcom_glink_send()
1310 idr_for_each_entry(&channel->riids, tmp, iid) { in __qcom_glink_send()
1322 spin_unlock_irqrestore(&channel->intent_lock, flags); in __qcom_glink_send()
1331 ret = qcom_glink_request_intent(glink, channel, len); in __qcom_glink_send()
1344 req.msg.param1 = cpu_to_le16(channel->lcid); in __qcom_glink_send()
1365 req.msg.param1 = cpu_to_le16(channel->lcid); in __qcom_glink_send()
1384 struct glink_channel *channel = to_glink_channel(ept); in qcom_glink_send() local
1386 return __qcom_glink_send(channel, data, len, true); in qcom_glink_send()
1391 struct glink_channel *channel = to_glink_channel(ept); in qcom_glink_trysend() local
1393 return __qcom_glink_send(channel, data, len, false); in qcom_glink_trysend()
1398 struct glink_channel *channel = to_glink_channel(ept); in qcom_glink_sendto() local
1400 return __qcom_glink_send(channel, data, len, true); in qcom_glink_sendto()
1405 struct glink_channel *channel = to_glink_channel(ept); in qcom_glink_trysendto() local
1407 return __qcom_glink_send(channel, data, len, false); in qcom_glink_trysendto()
1414 const char *channel) in qcom_glink_match_channel() argument
1427 if (strcmp(name, channel) == 0) in qcom_glink_match_channel()
1457 struct glink_channel *channel; in qcom_glink_rx_open() local
1466 idr_for_each_entry(&glink->lcids, channel, lcid) { in qcom_glink_rx_open()
1467 if (!strcmp(channel->name, name)) in qcom_glink_rx_open()
1472 if (!channel) { in qcom_glink_rx_open()
1473 channel = qcom_glink_alloc_channel(glink, name); in qcom_glink_rx_open()
1474 if (IS_ERR(channel)) in qcom_glink_rx_open()
1475 return PTR_ERR(channel); in qcom_glink_rx_open()
1482 ret = idr_alloc(&glink->rcids, channel, rcid, rcid + 1, GFP_ATOMIC); in qcom_glink_rx_open()
1488 channel->rcid = ret; in qcom_glink_rx_open()
1491 complete_all(&channel->open_req); in qcom_glink_rx_open()
1500 rpdev->ept = &channel->ept; in qcom_glink_rx_open()
1515 channel->rpdev = rpdev; in qcom_glink_rx_open()
1522 idr_remove(&glink->rcids, channel->rcid); in qcom_glink_rx_open()
1523 channel->rcid = 0; in qcom_glink_rx_open()
1528 kref_put(&channel->refcount, qcom_glink_channel_release); in qcom_glink_rx_open()
1536 struct glink_channel *channel; in qcom_glink_rx_close() local
1540 channel = idr_find(&glink->rcids, rcid); in qcom_glink_rx_close()
1542 if (WARN(!channel, "close request on unknown channel\n")) in qcom_glink_rx_close()
1546 cancel_work_sync(&channel->intent_work); in qcom_glink_rx_close()
1548 if (channel->rpdev) { in qcom_glink_rx_close()
1549 strncpy(chinfo.name, channel->name, sizeof(chinfo.name)); in qcom_glink_rx_close()
1555 channel->rpdev = NULL; in qcom_glink_rx_close()
1557 qcom_glink_send_close_ack(glink, channel->rcid); in qcom_glink_rx_close()
1560 idr_remove(&glink->rcids, channel->rcid); in qcom_glink_rx_close()
1561 channel->rcid = 0; in qcom_glink_rx_close()
1564 kref_put(&channel->refcount, qcom_glink_channel_release); in qcom_glink_rx_close()
1570 struct glink_channel *channel; in qcom_glink_rx_close_ack() local
1577 channel = idr_find(&glink->lcids, lcid); in qcom_glink_rx_close_ack()
1578 if (WARN(!channel, "close ack on unknown channel\n")) { in qcom_glink_rx_close_ack()
1583 idr_remove(&glink->lcids, channel->lcid); in qcom_glink_rx_close_ack()
1584 channel->lcid = 0; in qcom_glink_rx_close_ack()
1588 if (channel->rpdev) { in qcom_glink_rx_close_ack()
1589 strscpy(chinfo.name, channel->name, sizeof(chinfo.name)); in qcom_glink_rx_close_ack()
1595 channel->rpdev = NULL; in qcom_glink_rx_close_ack()
1597 kref_put(&channel->refcount, qcom_glink_channel_release); in qcom_glink_rx_close_ack()
1690 struct glink_channel *channel = to_glink_channel(rpdev->ept); in qcom_glink_device_release() local
1693 kref_put(&channel->refcount, qcom_glink_channel_release); in qcom_glink_device_release()
1700 struct glink_channel *channel; in qcom_glink_create_chrdev() local
1706 channel = qcom_glink_alloc_channel(glink, "rpmsg_chrdev"); in qcom_glink_create_chrdev()
1707 if (IS_ERR(channel)) { in qcom_glink_create_chrdev()
1709 return PTR_ERR(channel); in qcom_glink_create_chrdev()
1711 channel->rpdev = rpdev; in qcom_glink_create_chrdev()
1713 rpdev->ept = &channel->ept; in qcom_glink_create_chrdev()
1804 struct glink_channel *channel; in qcom_glink_native_remove() local
1816 idr_for_each_entry(&glink->lcids, channel, cid) in qcom_glink_native_remove()
1817 kref_put(&channel->refcount, qcom_glink_channel_release); in qcom_glink_native_remove()
1820 idr_for_each_entry(&glink->rcids, channel, cid) in qcom_glink_native_remove()
1821 kref_put(&channel->refcount, qcom_glink_channel_release); in qcom_glink_native_remove()