Lines Matching refs:channel

212 	struct glink_channel *channel;  in qcom_glink_alloc_channel()  local
214 channel = kzalloc(sizeof(*channel), GFP_KERNEL); in qcom_glink_alloc_channel()
215 if (!channel) in qcom_glink_alloc_channel()
219 spin_lock_init(&channel->recv_lock); in qcom_glink_alloc_channel()
220 spin_lock_init(&channel->intent_lock); in qcom_glink_alloc_channel()
221 mutex_init(&channel->intent_req_lock); in qcom_glink_alloc_channel()
223 channel->glink = glink; in qcom_glink_alloc_channel()
224 channel->name = kstrdup(name, GFP_KERNEL); in qcom_glink_alloc_channel()
226 init_completion(&channel->open_req); in qcom_glink_alloc_channel()
227 init_completion(&channel->open_ack); in qcom_glink_alloc_channel()
228 init_completion(&channel->intent_req_comp); in qcom_glink_alloc_channel()
230 INIT_LIST_HEAD(&channel->done_intents); in qcom_glink_alloc_channel()
231 INIT_WORK(&channel->intent_work, qcom_glink_rx_done_work); in qcom_glink_alloc_channel()
233 idr_init(&channel->liids); in qcom_glink_alloc_channel()
234 idr_init(&channel->riids); in qcom_glink_alloc_channel()
235 kref_init(&channel->refcount); in qcom_glink_alloc_channel()
237 return channel; in qcom_glink_alloc_channel()
242 struct glink_channel *channel = container_of(ref, struct glink_channel, in qcom_glink_channel_release() local
250 cancel_work_sync(&channel->intent_work); in qcom_glink_channel_release()
252 spin_lock_irqsave(&channel->intent_lock, flags); in qcom_glink_channel_release()
254 list_for_each_entry_safe(intent, tmp, &channel->done_intents, node) { in qcom_glink_channel_release()
261 idr_for_each_entry(&channel->liids, tmp, iid) { in qcom_glink_channel_release()
265 idr_destroy(&channel->liids); in qcom_glink_channel_release()
267 idr_for_each_entry(&channel->riids, tmp, iid) in qcom_glink_channel_release()
269 idr_destroy(&channel->riids); in qcom_glink_channel_release()
270 spin_unlock_irqrestore(&channel->intent_lock, flags); in qcom_glink_channel_release()
272 kfree(channel->name); in qcom_glink_channel_release()
273 kfree(channel); in qcom_glink_channel_release()
366 struct glink_channel *channel) in qcom_glink_send_open_ack() argument
371 msg.param1 = cpu_to_le16(channel->rcid); in qcom_glink_send_open_ack()
380 struct glink_channel *channel; in qcom_glink_handle_intent_req_ack() local
384 channel = idr_find(&glink->rcids, cid); in qcom_glink_handle_intent_req_ack()
386 if (!channel) { in qcom_glink_handle_intent_req_ack()
391 channel->intent_req_result = granted; in qcom_glink_handle_intent_req_ack()
392 complete(&channel->intent_req_comp); in qcom_glink_handle_intent_req_ack()
406 struct glink_channel *channel) in qcom_glink_send_open_req() argument
412 int name_len = strlen(channel->name) + 1; in qcom_glink_send_open_req()
417 kref_get(&channel->refcount); in qcom_glink_send_open_req()
420 ret = idr_alloc_cyclic(&glink->lcids, channel, in qcom_glink_send_open_req()
427 channel->lcid = ret; in qcom_glink_send_open_req()
430 req.msg.param1 = cpu_to_le16(channel->lcid); in qcom_glink_send_open_req()
432 strcpy(req.name, channel->name); in qcom_glink_send_open_req()
442 idr_remove(&glink->lcids, channel->lcid); in qcom_glink_send_open_req()
443 channel->lcid = 0; in qcom_glink_send_open_req()
450 struct glink_channel *channel) in qcom_glink_send_close_req() argument
455 req.param1 = cpu_to_le16(channel->lcid); in qcom_glink_send_close_req()
475 struct glink_channel *channel = container_of(work, struct glink_channel, in qcom_glink_rx_done_work() local
477 struct qcom_glink *glink = channel->glink; in qcom_glink_rx_done_work()
485 unsigned int cid = channel->lcid; in qcom_glink_rx_done_work()
490 spin_lock_irqsave(&channel->intent_lock, flags); in qcom_glink_rx_done_work()
491 list_for_each_entry_safe(intent, tmp, &channel->done_intents, node) { in qcom_glink_rx_done_work()
493 spin_unlock_irqrestore(&channel->intent_lock, flags); in qcom_glink_rx_done_work()
506 spin_lock_irqsave(&channel->intent_lock, flags); in qcom_glink_rx_done_work()
508 spin_unlock_irqrestore(&channel->intent_lock, flags); in qcom_glink_rx_done_work()
512 struct glink_channel *channel, in qcom_glink_rx_done() argument
524 spin_lock(&channel->intent_lock); in qcom_glink_rx_done()
525 idr_remove(&channel->liids, intent->id); in qcom_glink_rx_done()
526 spin_unlock(&channel->intent_lock); in qcom_glink_rx_done()
530 spin_lock(&channel->intent_lock); in qcom_glink_rx_done()
531 list_add_tail(&intent->node, &channel->done_intents); in qcom_glink_rx_done()
532 spin_unlock(&channel->intent_lock); in qcom_glink_rx_done()
534 schedule_work(&channel->intent_work); in qcom_glink_rx_done()
604 struct glink_channel *channel, in qcom_glink_send_intent_req_ack() argument
610 msg.param1 = cpu_to_le16(channel->lcid); in qcom_glink_send_intent_req_ack()
628 struct glink_channel *channel, in qcom_glink_advertise_intent() argument
641 cmd.lcid = cpu_to_le16(channel->lcid); in qcom_glink_advertise_intent()
653 struct glink_channel *channel, in qcom_glink_alloc_intent() argument
669 spin_lock_irqsave(&channel->intent_lock, flags); in qcom_glink_alloc_intent()
670 ret = idr_alloc_cyclic(&channel->liids, intent, 1, -1, GFP_ATOMIC); in qcom_glink_alloc_intent()
672 spin_unlock_irqrestore(&channel->intent_lock, flags); in qcom_glink_alloc_intent()
675 spin_unlock_irqrestore(&channel->intent_lock, flags); in qcom_glink_alloc_intent()
695 struct glink_channel *channel; in qcom_glink_handle_rx_done() local
699 channel = idr_find(&glink->rcids, cid); in qcom_glink_handle_rx_done()
701 if (!channel) { in qcom_glink_handle_rx_done()
706 spin_lock_irqsave(&channel->intent_lock, flags); in qcom_glink_handle_rx_done()
707 intent = idr_find(&channel->riids, iid); in qcom_glink_handle_rx_done()
710 spin_unlock_irqrestore(&channel->intent_lock, flags); in qcom_glink_handle_rx_done()
718 idr_remove(&channel->riids, intent->id); in qcom_glink_handle_rx_done()
721 spin_unlock_irqrestore(&channel->intent_lock, flags); in qcom_glink_handle_rx_done()
738 struct glink_channel *channel; in qcom_glink_handle_intent_req() local
742 channel = idr_find(&glink->rcids, cid); in qcom_glink_handle_intent_req()
745 if (!channel) { in qcom_glink_handle_intent_req()
750 intent = qcom_glink_alloc_intent(glink, channel, size, false); in qcom_glink_handle_intent_req()
752 qcom_glink_advertise_intent(glink, channel, intent); in qcom_glink_handle_intent_req()
754 qcom_glink_send_intent_req_ack(glink, channel, !!intent); in qcom_glink_handle_intent_req()
789 struct glink_channel *channel; in qcom_glink_rx_data() local
818 channel = idr_find(&glink->rcids, rcid); in qcom_glink_rx_data()
820 if (!channel) { in qcom_glink_rx_data()
829 if (!channel->buf) { in qcom_glink_rx_data()
845 channel->buf = intent; in qcom_glink_rx_data()
847 intent = channel->buf; in qcom_glink_rx_data()
852 spin_lock_irqsave(&channel->intent_lock, flags); in qcom_glink_rx_data()
853 intent = idr_find(&channel->liids, liid); in qcom_glink_rx_data()
854 spin_unlock_irqrestore(&channel->intent_lock, flags); in qcom_glink_rx_data()
859 channel->name, liid); in qcom_glink_rx_data()
878 spin_lock(&channel->recv_lock); in qcom_glink_rx_data()
879 if (channel->ept.cb) { in qcom_glink_rx_data()
880 channel->ept.cb(channel->ept.rpdev, in qcom_glink_rx_data()
883 channel->ept.priv, in qcom_glink_rx_data()
886 spin_unlock(&channel->recv_lock); in qcom_glink_rx_data()
889 channel->buf = NULL; in qcom_glink_rx_data()
891 qcom_glink_rx_done(glink, channel, intent); in qcom_glink_rx_data()
906 struct glink_channel *channel; in qcom_glink_handle_intent() local
928 channel = idr_find(&glink->rcids, cid); in qcom_glink_handle_intent()
930 if (!channel) { in qcom_glink_handle_intent()
949 spin_lock_irqsave(&channel->intent_lock, flags); in qcom_glink_handle_intent()
950 ret = idr_alloc(&channel->riids, intent, in qcom_glink_handle_intent()
952 spin_unlock_irqrestore(&channel->intent_lock, flags); in qcom_glink_handle_intent()
964 struct glink_channel *channel; in qcom_glink_rx_open_ack() local
967 channel = idr_find(&glink->lcids, lcid); in qcom_glink_rx_open_ack()
969 if (!channel) { in qcom_glink_rx_open_ack()
974 complete_all(&channel->open_ack); in qcom_glink_rx_open_ack()
1057 struct glink_channel *channel; in qcom_glink_create_local() local
1061 channel = qcom_glink_alloc_channel(glink, name); in qcom_glink_create_local()
1062 if (IS_ERR(channel)) in qcom_glink_create_local()
1063 return ERR_CAST(channel); in qcom_glink_create_local()
1065 ret = qcom_glink_send_open_req(glink, channel); in qcom_glink_create_local()
1069 ret = wait_for_completion_timeout(&channel->open_ack, 5 * HZ); in qcom_glink_create_local()
1073 ret = wait_for_completion_timeout(&channel->open_req, 5 * HZ); in qcom_glink_create_local()
1077 qcom_glink_send_open_ack(glink, channel); in qcom_glink_create_local()
1079 return channel; in qcom_glink_create_local()
1084 idr_remove(&glink->lcids, channel->lcid); in qcom_glink_create_local()
1089 kref_put(&channel->refcount, qcom_glink_channel_release); in qcom_glink_create_local()
1091 kref_put(&channel->refcount, qcom_glink_channel_release); in qcom_glink_create_local()
1098 struct glink_channel *channel) in qcom_glink_create_remote() argument
1102 qcom_glink_send_open_ack(glink, channel); in qcom_glink_create_remote()
1104 ret = qcom_glink_send_open_req(glink, channel); in qcom_glink_create_remote()
1108 ret = wait_for_completion_timeout(&channel->open_ack, 5 * HZ); in qcom_glink_create_remote()
1123 qcom_glink_send_close_req(glink, channel); in qcom_glink_create_remote()
1135 struct glink_channel *channel; in qcom_glink_create_ept() local
1144 idr_for_each_entry(&glink->rcids, channel, cid) { in qcom_glink_create_ept()
1145 if (!strcmp(channel->name, name)) in qcom_glink_create_ept()
1150 if (!channel) { in qcom_glink_create_ept()
1151 channel = qcom_glink_create_local(glink, name); in qcom_glink_create_ept()
1152 if (IS_ERR(channel)) in qcom_glink_create_ept()
1155 ret = qcom_glink_create_remote(glink, channel); in qcom_glink_create_ept()
1160 ept = &channel->ept; in qcom_glink_create_ept()
1171 struct glink_channel *channel = to_glink_channel(rpdev->ept); in qcom_glink_announce_create() local
1173 struct qcom_glink *glink = channel->glink; in qcom_glink_announce_create()
1182 if (glink->intentless || !completion_done(&channel->open_ack)) in qcom_glink_announce_create()
1196 intent = qcom_glink_alloc_intent(glink, channel, size, in qcom_glink_announce_create()
1201 qcom_glink_advertise_intent(glink, channel, intent); in qcom_glink_announce_create()
1209 struct glink_channel *channel = to_glink_channel(ept); in qcom_glink_destroy_ept() local
1210 struct qcom_glink *glink = channel->glink; in qcom_glink_destroy_ept()
1213 spin_lock_irqsave(&channel->recv_lock, flags); in qcom_glink_destroy_ept()
1214 channel->ept.cb = NULL; in qcom_glink_destroy_ept()
1215 spin_unlock_irqrestore(&channel->recv_lock, flags); in qcom_glink_destroy_ept()
1218 channel->rpdev = NULL; in qcom_glink_destroy_ept()
1220 qcom_glink_send_close_req(glink, channel); in qcom_glink_destroy_ept()
1224 struct glink_channel *channel, in qcom_glink_request_intent() argument
1235 mutex_lock(&channel->intent_req_lock); in qcom_glink_request_intent()
1237 reinit_completion(&channel->intent_req_comp); in qcom_glink_request_intent()
1240 cmd.cid = channel->lcid; in qcom_glink_request_intent()
1247 ret = wait_for_completion_timeout(&channel->intent_req_comp, 10 * HZ); in qcom_glink_request_intent()
1252 ret = channel->intent_req_result ? 0 : -ECANCELED; in qcom_glink_request_intent()
1256 mutex_unlock(&channel->intent_req_lock); in qcom_glink_request_intent()
1260 static int __qcom_glink_send(struct glink_channel *channel, in __qcom_glink_send() argument
1263 struct qcom_glink *glink = channel->glink; in __qcom_glink_send()
1277 spin_lock_irqsave(&channel->intent_lock, flags); in __qcom_glink_send()
1278 idr_for_each_entry(&channel->riids, tmp, iid) { in __qcom_glink_send()
1290 spin_unlock_irqrestore(&channel->intent_lock, flags); in __qcom_glink_send()
1299 ret = qcom_glink_request_intent(glink, channel, len); in __qcom_glink_send()
1308 req.msg.param1 = cpu_to_le16(channel->lcid); in __qcom_glink_send()
1324 struct glink_channel *channel = to_glink_channel(ept); in qcom_glink_send() local
1326 return __qcom_glink_send(channel, data, len, true); in qcom_glink_send()
1331 struct glink_channel *channel = to_glink_channel(ept); in qcom_glink_trysend() local
1333 return __qcom_glink_send(channel, data, len, false); in qcom_glink_trysend()
1340 const char *channel) in qcom_glink_match_channel() argument
1353 if (strcmp(name, channel) == 0) in qcom_glink_match_channel()
1374 struct glink_channel *channel = to_glink_channel(rpdev->ept); in qcom_glink_rpdev_release() local
1376 channel->rpdev = NULL; in qcom_glink_rpdev_release()
1383 struct glink_channel *channel; in qcom_glink_rx_open() local
1392 idr_for_each_entry(&glink->lcids, channel, lcid) { in qcom_glink_rx_open()
1393 if (!strcmp(channel->name, name)) in qcom_glink_rx_open()
1398 if (!channel) { in qcom_glink_rx_open()
1399 channel = qcom_glink_alloc_channel(glink, name); in qcom_glink_rx_open()
1400 if (IS_ERR(channel)) in qcom_glink_rx_open()
1401 return PTR_ERR(channel); in qcom_glink_rx_open()
1408 ret = idr_alloc(&glink->rcids, channel, rcid, rcid + 1, GFP_ATOMIC); in qcom_glink_rx_open()
1414 channel->rcid = ret; in qcom_glink_rx_open()
1417 complete_all(&channel->open_req); in qcom_glink_rx_open()
1426 rpdev->ept = &channel->ept; in qcom_glink_rx_open()
1441 channel->rpdev = rpdev; in qcom_glink_rx_open()
1448 idr_remove(&glink->rcids, channel->rcid); in qcom_glink_rx_open()
1449 channel->rcid = 0; in qcom_glink_rx_open()
1454 kref_put(&channel->refcount, qcom_glink_channel_release); in qcom_glink_rx_open()
1462 struct glink_channel *channel; in qcom_glink_rx_close() local
1466 channel = idr_find(&glink->rcids, rcid); in qcom_glink_rx_close()
1468 if (WARN(!channel, "close request on unknown channel\n")) in qcom_glink_rx_close()
1472 cancel_work_sync(&channel->intent_work); in qcom_glink_rx_close()
1474 if (channel->rpdev) { in qcom_glink_rx_close()
1475 strscpy_pad(chinfo.name, channel->name, sizeof(chinfo.name)); in qcom_glink_rx_close()
1482 qcom_glink_send_close_ack(glink, channel->rcid); in qcom_glink_rx_close()
1485 idr_remove(&glink->rcids, channel->rcid); in qcom_glink_rx_close()
1486 channel->rcid = 0; in qcom_glink_rx_close()
1489 kref_put(&channel->refcount, qcom_glink_channel_release); in qcom_glink_rx_close()
1494 struct glink_channel *channel; in qcom_glink_rx_close_ack() local
1498 channel = idr_find(&glink->lcids, lcid); in qcom_glink_rx_close_ack()
1499 if (WARN(!channel, "close ack on unknown channel\n")) { in qcom_glink_rx_close_ack()
1504 idr_remove(&glink->lcids, channel->lcid); in qcom_glink_rx_close_ack()
1505 channel->lcid = 0; in qcom_glink_rx_close_ack()
1508 kref_put(&channel->refcount, qcom_glink_channel_release); in qcom_glink_rx_close_ack()
1601 struct glink_channel *channel = to_glink_channel(rpdev->ept); in qcom_glink_device_release() local
1604 kref_put(&channel->refcount, qcom_glink_channel_release); in qcom_glink_device_release()
1611 struct glink_channel *channel; in qcom_glink_create_chrdev() local
1617 channel = qcom_glink_alloc_channel(glink, "rpmsg_chrdev"); in qcom_glink_create_chrdev()
1618 if (IS_ERR(channel)) { in qcom_glink_create_chrdev()
1620 return PTR_ERR(channel); in qcom_glink_create_chrdev()
1622 channel->rpdev = rpdev; in qcom_glink_create_chrdev()
1624 rpdev->ept = &channel->ept; in qcom_glink_create_chrdev()
1714 struct glink_channel *channel; in qcom_glink_native_remove() local
1726 idr_for_each_entry(&glink->lcids, channel, cid) in qcom_glink_native_remove()
1727 kref_put(&channel->refcount, qcom_glink_channel_release); in qcom_glink_native_remove()
1730 idr_for_each_entry(&glink->rcids, channel, cid) in qcom_glink_native_remove()
1731 kref_put(&channel->refcount, qcom_glink_channel_release); in qcom_glink_native_remove()