• Home
  • Raw
  • Download

Lines Matching full:channel

63  * @in_use: To mark if intent is already in use for the channel
88 * @lcids: idr of all channels with a known local channel id
89 * @rcids: idr of all channels with a known remote channel id
128 * struct glink_channel - internal representation of a channel
130 * @ept: rpmsg endpoint this channel is associated with
132 * @refcount: refcount for the channel object
134 * @name: unique channel name/identifier
135 * @lcid: channel id, in local space
136 * @rcid: channel id, in remote space
217 struct glink_channel *channel; in qcom_glink_alloc_channel() local
219 channel = kzalloc(sizeof(*channel), GFP_KERNEL); in qcom_glink_alloc_channel()
220 if (!channel) in qcom_glink_alloc_channel()
224 spin_lock_init(&channel->recv_lock); in qcom_glink_alloc_channel()
225 spin_lock_init(&channel->intent_lock); in qcom_glink_alloc_channel()
226 mutex_init(&channel->intent_req_lock); in qcom_glink_alloc_channel()
228 channel->glink = glink; in qcom_glink_alloc_channel()
229 channel->name = kstrdup(name, GFP_KERNEL); in qcom_glink_alloc_channel()
230 if (!channel->name) { in qcom_glink_alloc_channel()
231 kfree(channel); in qcom_glink_alloc_channel()
235 init_completion(&channel->open_req); in qcom_glink_alloc_channel()
236 init_completion(&channel->open_ack); in qcom_glink_alloc_channel()
237 init_waitqueue_head(&channel->intent_req_wq); in qcom_glink_alloc_channel()
239 INIT_LIST_HEAD(&channel->done_intents); in qcom_glink_alloc_channel()
240 INIT_WORK(&channel->intent_work, qcom_glink_rx_done_work); in qcom_glink_alloc_channel()
242 idr_init(&channel->liids); in qcom_glink_alloc_channel()
243 idr_init(&channel->riids); in qcom_glink_alloc_channel()
244 kref_init(&channel->refcount); in qcom_glink_alloc_channel()
246 return channel; in qcom_glink_alloc_channel()
251 struct glink_channel *channel = container_of(ref, struct glink_channel, in qcom_glink_channel_release() local
259 cancel_work_sync(&channel->intent_work); in qcom_glink_channel_release()
261 spin_lock_irqsave(&channel->intent_lock, flags); in qcom_glink_channel_release()
263 list_for_each_entry_safe(intent, tmp, &channel->done_intents, node) { in qcom_glink_channel_release()
270 idr_for_each_entry(&channel->liids, tmp, iid) { in qcom_glink_channel_release()
274 idr_destroy(&channel->liids); in qcom_glink_channel_release()
276 idr_for_each_entry(&channel->riids, tmp, iid) in qcom_glink_channel_release()
278 idr_destroy(&channel->riids); in qcom_glink_channel_release()
279 spin_unlock_irqrestore(&channel->intent_lock, flags); in qcom_glink_channel_release()
281 kfree(channel->name); in qcom_glink_channel_release()
282 kfree(channel); in qcom_glink_channel_release()
410 struct glink_channel *channel) in qcom_glink_send_open_ack() argument
415 msg.param1 = cpu_to_le16(channel->rcid); in qcom_glink_send_open_ack()
424 struct glink_channel *channel; in qcom_glink_handle_intent_req_ack() local
428 channel = idr_find(&glink->rcids, cid); in qcom_glink_handle_intent_req_ack()
430 if (!channel) { in qcom_glink_handle_intent_req_ack()
431 dev_err(glink->dev, "unable to find channel\n"); in qcom_glink_handle_intent_req_ack()
435 WRITE_ONCE(channel->intent_req_result, granted); in qcom_glink_handle_intent_req_ack()
436 wake_up_all(&channel->intent_req_wq); in qcom_glink_handle_intent_req_ack()
439 static void qcom_glink_intent_req_abort(struct glink_channel *channel) in qcom_glink_intent_req_abort() argument
441 WRITE_ONCE(channel->intent_req_result, 0); in qcom_glink_intent_req_abort()
442 wake_up_all(&channel->intent_req_wq); in qcom_glink_intent_req_abort()
448 * @channel: Ptr to the channel that the open req is sent
450 * Allocates a local channel id and sends a GLINK_CMD_OPEN message to the remote.
456 struct glink_channel *channel) in qcom_glink_send_open_req() argument
462 int name_len = strlen(channel->name) + 1; in qcom_glink_send_open_req()
467 kref_get(&channel->refcount); in qcom_glink_send_open_req()
470 ret = idr_alloc_cyclic(&glink->lcids, channel, in qcom_glink_send_open_req()
477 channel->lcid = ret; in qcom_glink_send_open_req()
480 req.msg.param1 = cpu_to_le16(channel->lcid); in qcom_glink_send_open_req()
482 strcpy(req.name, channel->name); in qcom_glink_send_open_req()
492 idr_remove(&glink->lcids, channel->lcid); in qcom_glink_send_open_req()
493 channel->lcid = 0; in qcom_glink_send_open_req()
500 struct glink_channel *channel) in qcom_glink_send_close_req() argument
505 req.param1 = cpu_to_le16(channel->lcid); in qcom_glink_send_close_req()
525 struct glink_channel *channel = container_of(work, struct glink_channel, in qcom_glink_rx_done_work() local
527 struct qcom_glink *glink = channel->glink; in qcom_glink_rx_done_work()
535 unsigned int cid = channel->lcid; in qcom_glink_rx_done_work()
540 spin_lock_irqsave(&channel->intent_lock, flags); in qcom_glink_rx_done_work()
541 list_for_each_entry_safe(intent, tmp, &channel->done_intents, node) { in qcom_glink_rx_done_work()
543 spin_unlock_irqrestore(&channel->intent_lock, flags); in qcom_glink_rx_done_work()
556 spin_lock_irqsave(&channel->intent_lock, flags); in qcom_glink_rx_done_work()
558 spin_unlock_irqrestore(&channel->intent_lock, flags); in qcom_glink_rx_done_work()
562 struct glink_channel *channel, in qcom_glink_rx_done() argument
574 spin_lock(&channel->intent_lock); in qcom_glink_rx_done()
575 idr_remove(&channel->liids, intent->id); in qcom_glink_rx_done()
576 spin_unlock(&channel->intent_lock); in qcom_glink_rx_done()
580 spin_lock(&channel->intent_lock); in qcom_glink_rx_done()
581 list_add_tail(&intent->node, &channel->done_intents); in qcom_glink_rx_done()
582 spin_unlock(&channel->intent_lock); in qcom_glink_rx_done()
584 schedule_work(&channel->intent_work); in qcom_glink_rx_done()
648 * @channel: The glink channel
654 struct glink_channel *channel, in qcom_glink_send_intent_req_ack() argument
660 msg.param1 = cpu_to_le16(channel->lcid); in qcom_glink_send_intent_req_ack()
672 * @channel: The local channel
678 struct glink_channel *channel, in qcom_glink_advertise_intent() argument
691 cmd.lcid = cpu_to_le16(channel->lcid); in qcom_glink_advertise_intent()
703 struct glink_channel *channel, in qcom_glink_alloc_intent() argument
719 spin_lock_irqsave(&channel->intent_lock, flags); in qcom_glink_alloc_intent()
720 ret = idr_alloc_cyclic(&channel->liids, intent, 1, -1, GFP_ATOMIC); in qcom_glink_alloc_intent()
722 spin_unlock_irqrestore(&channel->intent_lock, flags); in qcom_glink_alloc_intent()
725 spin_unlock_irqrestore(&channel->intent_lock, flags); in qcom_glink_alloc_intent()
745 struct glink_channel *channel; in qcom_glink_handle_rx_done() local
749 channel = idr_find(&glink->rcids, cid); in qcom_glink_handle_rx_done()
751 if (!channel) { in qcom_glink_handle_rx_done()
752 dev_err(glink->dev, "invalid channel id received\n"); in qcom_glink_handle_rx_done()
756 spin_lock_irqsave(&channel->intent_lock, flags); in qcom_glink_handle_rx_done()
757 intent = idr_find(&channel->riids, iid); in qcom_glink_handle_rx_done()
760 spin_unlock_irqrestore(&channel->intent_lock, flags); in qcom_glink_handle_rx_done()
768 idr_remove(&channel->riids, intent->id); in qcom_glink_handle_rx_done()
771 spin_unlock_irqrestore(&channel->intent_lock, flags); in qcom_glink_handle_rx_done()
774 WRITE_ONCE(channel->intent_received, true); in qcom_glink_handle_rx_done()
775 wake_up_all(&channel->intent_req_wq); in qcom_glink_handle_rx_done()
783 * @cid: Remote channel ID
786 * The function searches for the local channel to which the request for
793 struct glink_channel *channel; in qcom_glink_handle_intent_req() local
797 channel = idr_find(&glink->rcids, cid); in qcom_glink_handle_intent_req()
800 if (!channel) { in qcom_glink_handle_intent_req()
801 pr_err("%s channel not found for cid %d\n", __func__, cid); in qcom_glink_handle_intent_req()
805 intent = qcom_glink_alloc_intent(glink, channel, size, false); in qcom_glink_handle_intent_req()
807 qcom_glink_advertise_intent(glink, channel, intent); in qcom_glink_handle_intent_req()
809 qcom_glink_send_intent_req_ack(glink, channel, !!intent); in qcom_glink_handle_intent_req()
844 struct glink_channel *channel; in qcom_glink_rx_data() local
873 channel = idr_find(&glink->rcids, rcid); in qcom_glink_rx_data()
875 if (!channel) { in qcom_glink_rx_data()
876 dev_dbg(glink->dev, "Data on non-existing channel\n"); in qcom_glink_rx_data()
884 if (!channel->buf) { in qcom_glink_rx_data()
900 channel->buf = intent; in qcom_glink_rx_data()
902 intent = channel->buf; in qcom_glink_rx_data()
907 spin_lock_irqsave(&channel->intent_lock, flags); in qcom_glink_rx_data()
908 intent = idr_find(&channel->liids, liid); in qcom_glink_rx_data()
909 spin_unlock_irqrestore(&channel->intent_lock, flags); in qcom_glink_rx_data()
913 "no intent found for channel %s intent %d", in qcom_glink_rx_data()
914 channel->name, liid); in qcom_glink_rx_data()
933 spin_lock(&channel->recv_lock); in qcom_glink_rx_data()
934 if (channel->ept.cb) { in qcom_glink_rx_data()
935 channel->ept.cb(channel->ept.rpdev, in qcom_glink_rx_data()
938 channel->ept.priv, in qcom_glink_rx_data()
941 spin_unlock(&channel->recv_lock); in qcom_glink_rx_data()
944 channel->buf = NULL; in qcom_glink_rx_data()
946 qcom_glink_rx_done(glink, channel, intent); in qcom_glink_rx_data()
961 struct glink_channel *channel; in qcom_glink_handle_intent() local
983 channel = idr_find(&glink->rcids, cid); in qcom_glink_handle_intent()
985 if (!channel) { in qcom_glink_handle_intent()
986 dev_err(glink->dev, "intents for non-existing channel\n"); in qcom_glink_handle_intent()
1005 spin_lock_irqsave(&channel->intent_lock, flags); in qcom_glink_handle_intent()
1006 ret = idr_alloc(&channel->riids, intent, in qcom_glink_handle_intent()
1008 spin_unlock_irqrestore(&channel->intent_lock, flags); in qcom_glink_handle_intent()
1014 WRITE_ONCE(channel->intent_received, true); in qcom_glink_handle_intent()
1015 wake_up_all(&channel->intent_req_wq); in qcom_glink_handle_intent()
1023 struct glink_channel *channel; in qcom_glink_rx_open_ack() local
1026 channel = idr_find(&glink->lcids, lcid); in qcom_glink_rx_open_ack()
1028 if (!channel) { in qcom_glink_rx_open_ack()
1033 complete_all(&channel->open_ack); in qcom_glink_rx_open_ack()
1040 * @ept: Rpmsg endpoint for channel.
1048 struct glink_channel *channel = to_glink_channel(ept); in qcom_glink_set_flow_control() local
1049 struct qcom_glink *glink = channel->glink; in qcom_glink_set_flow_control()
1057 msg.param1 = cpu_to_le16(channel->lcid); in qcom_glink_set_flow_control()
1066 struct glink_channel *channel; in qcom_glink_handle_signals() local
1071 channel = idr_find(&glink->rcids, rcid); in qcom_glink_handle_signals()
1073 if (!channel) { in qcom_glink_handle_signals()
1074 dev_err(glink->dev, "signal for non-existing channel\n"); in qcom_glink_handle_signals()
1080 if (channel->ept.flow_cb) in qcom_glink_handle_signals()
1081 channel->ept.flow_cb(channel->ept.rpdev, channel->ept.priv, enable); in qcom_glink_handle_signals()
1166 struct glink_channel *channel; in qcom_glink_create_local() local
1170 channel = qcom_glink_alloc_channel(glink, name); in qcom_glink_create_local()
1171 if (IS_ERR(channel)) in qcom_glink_create_local()
1172 return ERR_CAST(channel); in qcom_glink_create_local()
1174 ret = qcom_glink_send_open_req(glink, channel); in qcom_glink_create_local()
1178 ret = wait_for_completion_timeout(&channel->open_ack, 5 * HZ); in qcom_glink_create_local()
1182 ret = wait_for_completion_timeout(&channel->open_req, 5 * HZ); in qcom_glink_create_local()
1186 qcom_glink_send_open_ack(glink, channel); in qcom_glink_create_local()
1188 return channel; in qcom_glink_create_local()
1191 /* qcom_glink_send_open_req() did register the channel in lcids*/ in qcom_glink_create_local()
1193 idr_remove(&glink->lcids, channel->lcid); in qcom_glink_create_local()
1198 kref_put(&channel->refcount, qcom_glink_channel_release); in qcom_glink_create_local()
1200 kref_put(&channel->refcount, qcom_glink_channel_release); in qcom_glink_create_local()
1207 struct glink_channel *channel) in qcom_glink_create_remote() argument
1211 qcom_glink_send_open_ack(glink, channel); in qcom_glink_create_remote()
1213 ret = qcom_glink_send_open_req(glink, channel); in qcom_glink_create_remote()
1217 ret = wait_for_completion_timeout(&channel->open_ack, 5 * HZ); in qcom_glink_create_remote()
1232 qcom_glink_send_close_req(glink, channel); in qcom_glink_create_remote()
1244 struct glink_channel *channel; in qcom_glink_create_ept() local
1253 idr_for_each_entry(&glink->rcids, channel, cid) { in qcom_glink_create_ept()
1254 if (!strcmp(channel->name, name)) in qcom_glink_create_ept()
1259 if (!channel) { in qcom_glink_create_ept()
1260 channel = qcom_glink_create_local(glink, name); in qcom_glink_create_ept()
1261 if (IS_ERR(channel)) in qcom_glink_create_ept()
1264 ret = qcom_glink_create_remote(glink, channel); in qcom_glink_create_ept()
1269 ept = &channel->ept; in qcom_glink_create_ept()
1280 struct glink_channel *channel = to_glink_channel(rpdev->ept); in qcom_glink_announce_create() local
1282 struct qcom_glink *glink = channel->glink; in qcom_glink_announce_create()
1291 if (glink->intentless || !completion_done(&channel->open_ack)) in qcom_glink_announce_create()
1300 /* Channel is now open, advertise base set of intents */ in qcom_glink_announce_create()
1305 intent = qcom_glink_alloc_intent(glink, channel, size, in qcom_glink_announce_create()
1310 qcom_glink_advertise_intent(glink, channel, intent); in qcom_glink_announce_create()
1318 struct glink_channel *channel = to_glink_channel(ept); in qcom_glink_destroy_ept() local
1319 struct qcom_glink *glink = channel->glink; in qcom_glink_destroy_ept()
1322 spin_lock_irqsave(&channel->recv_lock, flags); in qcom_glink_destroy_ept()
1323 channel->ept.cb = NULL; in qcom_glink_destroy_ept()
1324 spin_unlock_irqrestore(&channel->recv_lock, flags); in qcom_glink_destroy_ept()
1326 /* Decouple the potential rpdev from the channel */ in qcom_glink_destroy_ept()
1327 channel->rpdev = NULL; in qcom_glink_destroy_ept()
1329 qcom_glink_send_close_req(glink, channel); in qcom_glink_destroy_ept()
1333 struct glink_channel *channel, in qcom_glink_request_intent() argument
1344 mutex_lock(&channel->intent_req_lock); in qcom_glink_request_intent()
1346 WRITE_ONCE(channel->intent_req_result, -1); in qcom_glink_request_intent()
1347 WRITE_ONCE(channel->intent_received, false); in qcom_glink_request_intent()
1350 cmd.cid = channel->lcid; in qcom_glink_request_intent()
1357 ret = wait_event_timeout(channel->intent_req_wq, in qcom_glink_request_intent()
1358 READ_ONCE(channel->intent_req_result) == 0 || in qcom_glink_request_intent()
1359 (READ_ONCE(channel->intent_req_result) > 0 && in qcom_glink_request_intent()
1360 READ_ONCE(channel->intent_received)) || in qcom_glink_request_intent()
1369 ret = READ_ONCE(channel->intent_req_result) ? 0 : -EAGAIN; in qcom_glink_request_intent()
1373 mutex_unlock(&channel->intent_req_lock); in qcom_glink_request_intent()
1377 static int __qcom_glink_send(struct glink_channel *channel, in __qcom_glink_send() argument
1380 struct qcom_glink *glink = channel->glink; in __qcom_glink_send()
1396 spin_lock_irqsave(&channel->intent_lock, flags); in __qcom_glink_send()
1397 idr_for_each_entry(&channel->riids, tmp, iid) { in __qcom_glink_send()
1409 spin_unlock_irqrestore(&channel->intent_lock, flags); in __qcom_glink_send()
1418 ret = qcom_glink_request_intent(glink, channel, len); in __qcom_glink_send()
1432 req.msg.param1 = cpu_to_le16(channel->lcid); in __qcom_glink_send()
1453 struct glink_channel *channel = to_glink_channel(ept); in qcom_glink_send() local
1455 return __qcom_glink_send(channel, data, len, true); in qcom_glink_send()
1460 struct glink_channel *channel = to_glink_channel(ept); in qcom_glink_trysend() local
1462 return __qcom_glink_send(channel, data, len, false); in qcom_glink_trysend()
1467 struct glink_channel *channel = to_glink_channel(ept); in qcom_glink_sendto() local
1469 return __qcom_glink_send(channel, data, len, true); in qcom_glink_sendto()
1474 struct glink_channel *channel = to_glink_channel(ept); in qcom_glink_trysendto() local
1476 return __qcom_glink_send(channel, data, len, false); in qcom_glink_trysendto()
1480 * Finds the device_node for the glink child interested in this channel.
1483 const char *channel) in qcom_glink_match_channel() argument
1496 if (strcmp(name, channel) == 0) in qcom_glink_match_channel()
1528 struct glink_channel *channel; in qcom_glink_rx_open() local
1537 idr_for_each_entry(&glink->lcids, channel, lcid) { in qcom_glink_rx_open()
1538 if (!strcmp(channel->name, name)) in qcom_glink_rx_open()
1543 if (!channel) { in qcom_glink_rx_open()
1544 channel = qcom_glink_alloc_channel(glink, name); in qcom_glink_rx_open()
1545 if (IS_ERR(channel)) in qcom_glink_rx_open()
1546 return PTR_ERR(channel); in qcom_glink_rx_open()
1553 ret = idr_alloc(&glink->rcids, channel, rcid, rcid + 1, GFP_ATOMIC); in qcom_glink_rx_open()
1555 dev_err(glink->dev, "Unable to insert channel into rcid list\n"); in qcom_glink_rx_open()
1559 channel->rcid = ret; in qcom_glink_rx_open()
1562 complete_all(&channel->open_req); in qcom_glink_rx_open()
1571 rpdev->ept = &channel->ept; in qcom_glink_rx_open()
1586 channel->rpdev = rpdev; in qcom_glink_rx_open()
1593 idr_remove(&glink->rcids, channel->rcid); in qcom_glink_rx_open()
1594 channel->rcid = 0; in qcom_glink_rx_open()
1599 kref_put(&channel->refcount, qcom_glink_channel_release); in qcom_glink_rx_open()
1607 struct glink_channel *channel; in qcom_glink_rx_close() local
1611 channel = idr_find(&glink->rcids, rcid); in qcom_glink_rx_close()
1613 if (WARN(!channel, "close request on unknown channel\n")) in qcom_glink_rx_close()
1617 cancel_work_sync(&channel->intent_work); in qcom_glink_rx_close()
1619 if (channel->rpdev) { in qcom_glink_rx_close()
1620 strscpy_pad(chinfo.name, channel->name, sizeof(chinfo.name)); in qcom_glink_rx_close()
1626 channel->rpdev = NULL; in qcom_glink_rx_close()
1628 qcom_glink_send_close_ack(glink, channel->rcid); in qcom_glink_rx_close()
1631 idr_remove(&glink->rcids, channel->rcid); in qcom_glink_rx_close()
1632 channel->rcid = 0; in qcom_glink_rx_close()
1635 kref_put(&channel->refcount, qcom_glink_channel_release); in qcom_glink_rx_close()
1641 struct glink_channel *channel; in qcom_glink_rx_close_ack() local
1648 channel = idr_find(&glink->lcids, lcid); in qcom_glink_rx_close_ack()
1649 if (WARN(!channel, "close ack on unknown channel\n")) { in qcom_glink_rx_close_ack()
1654 idr_remove(&glink->lcids, channel->lcid); in qcom_glink_rx_close_ack()
1655 channel->lcid = 0; in qcom_glink_rx_close_ack()
1658 /* Decouple the potential rpdev from the channel */ in qcom_glink_rx_close_ack()
1659 if (channel->rpdev) { in qcom_glink_rx_close_ack()
1660 strscpy(chinfo.name, channel->name, sizeof(chinfo.name)); in qcom_glink_rx_close_ack()
1666 channel->rpdev = NULL; in qcom_glink_rx_close_ack()
1668 kref_put(&channel->refcount, qcom_glink_channel_release); in qcom_glink_rx_close_ack()
1761 struct glink_channel *channel = to_glink_channel(rpdev->ept); in qcom_glink_device_release() local
1764 kref_put(&channel->refcount, qcom_glink_channel_release); in qcom_glink_device_release()
1772 struct glink_channel *channel; in qcom_glink_create_chrdev() local
1778 channel = qcom_glink_alloc_channel(glink, "rpmsg_chrdev"); in qcom_glink_create_chrdev()
1779 if (IS_ERR(channel)) { in qcom_glink_create_chrdev()
1781 return PTR_ERR(channel); in qcom_glink_create_chrdev()
1783 channel->rpdev = rpdev; in qcom_glink_create_chrdev()
1785 rpdev->ept = &channel->ept; in qcom_glink_create_chrdev()
1850 struct glink_channel *channel; in qcom_glink_native_remove() local
1865 idr_for_each_entry(&glink->lcids, channel, cid) in qcom_glink_native_remove()
1866 qcom_glink_intent_req_abort(channel); in qcom_glink_native_remove()
1874 idr_for_each_entry(&glink->lcids, channel, cid) in qcom_glink_native_remove()
1875 kref_put(&channel->refcount, qcom_glink_channel_release); in qcom_glink_native_remove()
1878 idr_for_each_entry(&glink->rcids, channel, cid) in qcom_glink_native_remove()
1879 kref_put(&channel->refcount, qcom_glink_channel_release); in qcom_glink_native_remove()