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
246 spin_lock_irqsave(&channel->intent_lock, flags); in qcom_glink_channel_release()
247 idr_destroy(&channel->liids); in qcom_glink_channel_release()
248 idr_destroy(&channel->riids); in qcom_glink_channel_release()
249 spin_unlock_irqrestore(&channel->intent_lock, flags); in qcom_glink_channel_release()
251 kfree(channel->name); in qcom_glink_channel_release()
252 kfree(channel); in qcom_glink_channel_release()
345 struct glink_channel *channel) in qcom_glink_send_open_ack() argument
350 msg.param1 = cpu_to_le16(channel->rcid); in qcom_glink_send_open_ack()
359 struct glink_channel *channel; in qcom_glink_handle_intent_req_ack() local
363 channel = idr_find(&glink->rcids, cid); in qcom_glink_handle_intent_req_ack()
365 if (!channel) { in qcom_glink_handle_intent_req_ack()
370 channel->intent_req_result = granted; in qcom_glink_handle_intent_req_ack()
371 complete(&channel->intent_req_comp); in qcom_glink_handle_intent_req_ack()
385 struct glink_channel *channel) in qcom_glink_send_open_req() argument
391 int name_len = strlen(channel->name) + 1; in qcom_glink_send_open_req()
396 kref_get(&channel->refcount); in qcom_glink_send_open_req()
399 ret = idr_alloc_cyclic(&glink->lcids, channel, in qcom_glink_send_open_req()
406 channel->lcid = ret; in qcom_glink_send_open_req()
409 req.msg.param1 = cpu_to_le16(channel->lcid); in qcom_glink_send_open_req()
411 strcpy(req.name, channel->name); in qcom_glink_send_open_req()
421 idr_remove(&glink->lcids, channel->lcid); in qcom_glink_send_open_req()
422 channel->lcid = 0; in qcom_glink_send_open_req()
429 struct glink_channel *channel) in qcom_glink_send_close_req() argument
434 req.param1 = cpu_to_le16(channel->lcid); in qcom_glink_send_close_req()
454 struct glink_channel *channel = container_of(work, struct glink_channel, in qcom_glink_rx_done_work() local
456 struct qcom_glink *glink = channel->glink; in qcom_glink_rx_done_work()
464 unsigned int cid = channel->lcid; in qcom_glink_rx_done_work()
469 spin_lock_irqsave(&channel->intent_lock, flags); in qcom_glink_rx_done_work()
470 list_for_each_entry_safe(intent, tmp, &channel->done_intents, node) { in qcom_glink_rx_done_work()
472 spin_unlock_irqrestore(&channel->intent_lock, flags); in qcom_glink_rx_done_work()
485 spin_lock_irqsave(&channel->intent_lock, flags); in qcom_glink_rx_done_work()
487 spin_unlock_irqrestore(&channel->intent_lock, flags); in qcom_glink_rx_done_work()
491 struct glink_channel *channel, in qcom_glink_rx_done() argument
503 spin_lock(&channel->intent_lock); in qcom_glink_rx_done()
504 idr_remove(&channel->liids, intent->id); in qcom_glink_rx_done()
505 spin_unlock(&channel->intent_lock); in qcom_glink_rx_done()
509 spin_lock(&channel->intent_lock); in qcom_glink_rx_done()
510 list_add_tail(&intent->node, &channel->done_intents); in qcom_glink_rx_done()
511 spin_unlock(&channel->intent_lock); in qcom_glink_rx_done()
513 schedule_work(&channel->intent_work); in qcom_glink_rx_done()
583 struct glink_channel *channel, in qcom_glink_send_intent_req_ack() argument
589 msg.param1 = cpu_to_le16(channel->lcid); in qcom_glink_send_intent_req_ack()
607 struct glink_channel *channel, in qcom_glink_advertise_intent() argument
620 cmd.lcid = cpu_to_le16(channel->lcid); in qcom_glink_advertise_intent()
632 struct glink_channel *channel, in qcom_glink_alloc_intent() argument
648 spin_lock_irqsave(&channel->intent_lock, flags); in qcom_glink_alloc_intent()
649 ret = idr_alloc_cyclic(&channel->liids, intent, 1, -1, GFP_ATOMIC); in qcom_glink_alloc_intent()
651 spin_unlock_irqrestore(&channel->intent_lock, flags); in qcom_glink_alloc_intent()
654 spin_unlock_irqrestore(&channel->intent_lock, flags); in qcom_glink_alloc_intent()
674 struct glink_channel *channel; in qcom_glink_handle_rx_done() local
678 channel = idr_find(&glink->rcids, cid); in qcom_glink_handle_rx_done()
680 if (!channel) { in qcom_glink_handle_rx_done()
685 spin_lock_irqsave(&channel->intent_lock, flags); in qcom_glink_handle_rx_done()
686 intent = idr_find(&channel->riids, iid); in qcom_glink_handle_rx_done()
689 spin_unlock_irqrestore(&channel->intent_lock, flags); in qcom_glink_handle_rx_done()
697 idr_remove(&channel->riids, intent->id); in qcom_glink_handle_rx_done()
700 spin_unlock_irqrestore(&channel->intent_lock, flags); in qcom_glink_handle_rx_done()
717 struct glink_channel *channel; in qcom_glink_handle_intent_req() local
721 channel = idr_find(&glink->rcids, cid); in qcom_glink_handle_intent_req()
724 if (!channel) { in qcom_glink_handle_intent_req()
729 intent = qcom_glink_alloc_intent(glink, channel, size, false); in qcom_glink_handle_intent_req()
731 qcom_glink_advertise_intent(glink, channel, intent); in qcom_glink_handle_intent_req()
733 qcom_glink_send_intent_req_ack(glink, channel, !!intent); in qcom_glink_handle_intent_req()
768 struct glink_channel *channel; in qcom_glink_rx_data() local
800 channel = idr_find(&glink->rcids, rcid); in qcom_glink_rx_data()
802 if (!channel) { in qcom_glink_rx_data()
811 if (!channel->buf) { in qcom_glink_rx_data()
827 channel->buf = intent; in qcom_glink_rx_data()
829 intent = channel->buf; in qcom_glink_rx_data()
834 spin_lock_irqsave(&channel->intent_lock, flags); in qcom_glink_rx_data()
835 intent = idr_find(&channel->liids, liid); in qcom_glink_rx_data()
836 spin_unlock_irqrestore(&channel->intent_lock, flags); in qcom_glink_rx_data()
841 channel->name, liid); in qcom_glink_rx_data()
859 spin_lock(&channel->recv_lock); in qcom_glink_rx_data()
860 if (channel->ept.cb) { in qcom_glink_rx_data()
861 channel->ept.cb(channel->ept.rpdev, in qcom_glink_rx_data()
864 channel->ept.priv, in qcom_glink_rx_data()
867 spin_unlock(&channel->recv_lock); in qcom_glink_rx_data()
870 channel->buf = NULL; in qcom_glink_rx_data()
872 qcom_glink_rx_done(glink, channel, intent); in qcom_glink_rx_data()
887 struct glink_channel *channel; in qcom_glink_handle_intent() local
909 channel = idr_find(&glink->rcids, cid); in qcom_glink_handle_intent()
911 if (!channel) { in qcom_glink_handle_intent()
930 spin_lock_irqsave(&channel->intent_lock, flags); in qcom_glink_handle_intent()
931 ret = idr_alloc(&channel->riids, intent, in qcom_glink_handle_intent()
933 spin_unlock_irqrestore(&channel->intent_lock, flags); in qcom_glink_handle_intent()
945 struct glink_channel *channel; in qcom_glink_rx_open_ack() local
948 channel = idr_find(&glink->lcids, lcid); in qcom_glink_rx_open_ack()
950 if (!channel) { in qcom_glink_rx_open_ack()
955 complete(&channel->open_ack); in qcom_glink_rx_open_ack()
1038 struct glink_channel *channel; in qcom_glink_create_local() local
1042 channel = qcom_glink_alloc_channel(glink, name); in qcom_glink_create_local()
1043 if (IS_ERR(channel)) in qcom_glink_create_local()
1044 return ERR_CAST(channel); in qcom_glink_create_local()
1046 ret = qcom_glink_send_open_req(glink, channel); in qcom_glink_create_local()
1050 ret = wait_for_completion_timeout(&channel->open_ack, 5 * HZ); in qcom_glink_create_local()
1054 ret = wait_for_completion_timeout(&channel->open_req, 5 * HZ); in qcom_glink_create_local()
1058 qcom_glink_send_open_ack(glink, channel); in qcom_glink_create_local()
1060 return channel; in qcom_glink_create_local()
1065 idr_remove(&glink->lcids, channel->lcid); in qcom_glink_create_local()
1070 kref_put(&channel->refcount, qcom_glink_channel_release); in qcom_glink_create_local()
1072 kref_put(&channel->refcount, qcom_glink_channel_release); in qcom_glink_create_local()
1079 struct glink_channel *channel) in qcom_glink_create_remote() argument
1083 qcom_glink_send_open_ack(glink, channel); in qcom_glink_create_remote()
1085 ret = qcom_glink_send_open_req(glink, channel); in qcom_glink_create_remote()
1089 ret = wait_for_completion_timeout(&channel->open_ack, 5 * HZ); in qcom_glink_create_remote()
1102 qcom_glink_send_close_req(glink, channel); in qcom_glink_create_remote()
1105 kref_put(&channel->refcount, qcom_glink_channel_release); in qcom_glink_create_remote()
1117 struct glink_channel *channel; in qcom_glink_create_ept() local
1126 idr_for_each_entry(&glink->rcids, channel, cid) { in qcom_glink_create_ept()
1127 if (!strcmp(channel->name, name)) in qcom_glink_create_ept()
1132 if (!channel) { in qcom_glink_create_ept()
1133 channel = qcom_glink_create_local(glink, name); in qcom_glink_create_ept()
1134 if (IS_ERR(channel)) in qcom_glink_create_ept()
1137 ret = qcom_glink_create_remote(glink, channel); in qcom_glink_create_ept()
1142 ept = &channel->ept; in qcom_glink_create_ept()
1153 struct glink_channel *channel = to_glink_channel(rpdev->ept); in qcom_glink_announce_create() local
1155 struct qcom_glink *glink = channel->glink; in qcom_glink_announce_create()
1178 intent = qcom_glink_alloc_intent(glink, channel, size, in qcom_glink_announce_create()
1183 qcom_glink_advertise_intent(glink, channel, intent); in qcom_glink_announce_create()
1191 struct glink_channel *channel = to_glink_channel(ept); in qcom_glink_destroy_ept() local
1192 struct qcom_glink *glink = channel->glink; in qcom_glink_destroy_ept()
1195 spin_lock_irqsave(&channel->recv_lock, flags); in qcom_glink_destroy_ept()
1196 channel->ept.cb = NULL; in qcom_glink_destroy_ept()
1197 spin_unlock_irqrestore(&channel->recv_lock, flags); in qcom_glink_destroy_ept()
1200 channel->rpdev = NULL; in qcom_glink_destroy_ept()
1202 qcom_glink_send_close_req(glink, channel); in qcom_glink_destroy_ept()
1206 struct glink_channel *channel, in qcom_glink_request_intent() argument
1217 mutex_lock(&channel->intent_req_lock); in qcom_glink_request_intent()
1219 reinit_completion(&channel->intent_req_comp); in qcom_glink_request_intent()
1222 cmd.cid = channel->lcid; in qcom_glink_request_intent()
1229 ret = wait_for_completion_timeout(&channel->intent_req_comp, 10 * HZ); in qcom_glink_request_intent()
1234 ret = channel->intent_req_result ? 0 : -ECANCELED; in qcom_glink_request_intent()
1238 mutex_unlock(&channel->intent_req_lock); in qcom_glink_request_intent()
1242 static int __qcom_glink_send(struct glink_channel *channel, in __qcom_glink_send() argument
1245 struct qcom_glink *glink = channel->glink; in __qcom_glink_send()
1259 spin_lock_irqsave(&channel->intent_lock, flags); in __qcom_glink_send()
1260 idr_for_each_entry(&channel->riids, tmp, iid) { in __qcom_glink_send()
1272 spin_unlock_irqrestore(&channel->intent_lock, flags); in __qcom_glink_send()
1281 ret = qcom_glink_request_intent(glink, channel, len); in __qcom_glink_send()
1290 req.msg.param1 = cpu_to_le16(channel->lcid); in __qcom_glink_send()
1306 struct glink_channel *channel = to_glink_channel(ept); in qcom_glink_send() local
1308 return __qcom_glink_send(channel, data, len, true); in qcom_glink_send()
1313 struct glink_channel *channel = to_glink_channel(ept); in qcom_glink_trysend() local
1315 return __qcom_glink_send(channel, data, len, false); in qcom_glink_trysend()
1322 const char *channel) in qcom_glink_match_channel() argument
1335 if (strcmp(name, channel) == 0) in qcom_glink_match_channel()
1356 struct glink_channel *channel = to_glink_channel(rpdev->ept); in qcom_glink_rpdev_release() local
1358 channel->rpdev = NULL; in qcom_glink_rpdev_release()
1365 struct glink_channel *channel; in qcom_glink_rx_open() local
1374 idr_for_each_entry(&glink->lcids, channel, lcid) { in qcom_glink_rx_open()
1375 if (!strcmp(channel->name, name)) in qcom_glink_rx_open()
1380 if (!channel) { in qcom_glink_rx_open()
1381 channel = qcom_glink_alloc_channel(glink, name); in qcom_glink_rx_open()
1382 if (IS_ERR(channel)) in qcom_glink_rx_open()
1383 return PTR_ERR(channel); in qcom_glink_rx_open()
1390 ret = idr_alloc(&glink->rcids, channel, rcid, rcid + 1, GFP_ATOMIC); in qcom_glink_rx_open()
1396 channel->rcid = ret; in qcom_glink_rx_open()
1399 complete(&channel->open_req); in qcom_glink_rx_open()
1408 rpdev->ept = &channel->ept; in qcom_glink_rx_open()
1423 channel->rpdev = rpdev; in qcom_glink_rx_open()
1432 idr_remove(&glink->rcids, channel->rcid); in qcom_glink_rx_open()
1433 channel->rcid = 0; in qcom_glink_rx_open()
1438 kref_put(&channel->refcount, qcom_glink_channel_release); in qcom_glink_rx_open()
1446 struct glink_channel *channel; in qcom_glink_rx_close() local
1450 channel = idr_find(&glink->rcids, rcid); in qcom_glink_rx_close()
1452 if (WARN(!channel, "close request on unknown channel\n")) in qcom_glink_rx_close()
1456 cancel_work_sync(&channel->intent_work); in qcom_glink_rx_close()
1458 if (channel->rpdev) { in qcom_glink_rx_close()
1459 strncpy(chinfo.name, channel->name, sizeof(chinfo.name)); in qcom_glink_rx_close()
1466 qcom_glink_send_close_ack(glink, channel->rcid); in qcom_glink_rx_close()
1469 idr_remove(&glink->rcids, channel->rcid); in qcom_glink_rx_close()
1470 channel->rcid = 0; in qcom_glink_rx_close()
1473 kref_put(&channel->refcount, qcom_glink_channel_release); in qcom_glink_rx_close()
1478 struct glink_channel *channel; in qcom_glink_rx_close_ack() local
1482 channel = idr_find(&glink->lcids, lcid); in qcom_glink_rx_close_ack()
1483 if (WARN(!channel, "close ack on unknown channel\n")) { in qcom_glink_rx_close_ack()
1488 idr_remove(&glink->lcids, channel->lcid); in qcom_glink_rx_close_ack()
1489 channel->lcid = 0; in qcom_glink_rx_close_ack()
1492 kref_put(&channel->refcount, qcom_glink_channel_release); in qcom_glink_rx_close_ack()
1622 struct glink_channel *channel; in qcom_glink_native_remove() local
1636 idr_for_each_entry(&glink->lcids, channel, cid) in qcom_glink_native_remove()
1637 kref_put(&channel->refcount, qcom_glink_channel_release); in qcom_glink_native_remove()