Lines Matching refs:xfer

365 			       struct scmi_xfer *xfer)  in scmi_xfer_token_set()  argument
377 next_token = (xfer->transfer_id & (MSG_TOKEN_MAX - 1)); in scmi_xfer_token_set()
403 xfer->hdr.seq = (u16)xfer_id; in scmi_xfer_token_set()
415 struct scmi_xfer *xfer) in scmi_xfer_token_clear() argument
417 clear_bit(xfer->hdr.seq, minfo->xfer_alloc_table); in scmi_xfer_token_clear()
433 scmi_xfer_inflight_register_unlocked(struct scmi_xfer *xfer, in scmi_xfer_inflight_register_unlocked() argument
437 set_bit(xfer->hdr.seq, minfo->xfer_alloc_table); in scmi_xfer_inflight_register_unlocked()
438 hash_add(minfo->pending_xfers, &xfer->node, xfer->hdr.seq); in scmi_xfer_inflight_register_unlocked()
439 xfer->pending = true; in scmi_xfer_inflight_register_unlocked()
456 static int scmi_xfer_inflight_register(struct scmi_xfer *xfer, in scmi_xfer_inflight_register() argument
463 if (!test_bit(xfer->hdr.seq, minfo->xfer_alloc_table)) in scmi_xfer_inflight_register()
464 scmi_xfer_inflight_register_unlocked(xfer, minfo); in scmi_xfer_inflight_register()
482 struct scmi_xfer *xfer) in scmi_xfer_raw_inflight_register() argument
486 return scmi_xfer_inflight_register(xfer, &info->tx_minfo); in scmi_xfer_raw_inflight_register()
498 static inline int scmi_xfer_pending_set(struct scmi_xfer *xfer, in scmi_xfer_pending_set() argument
506 ret = scmi_xfer_token_set(minfo, xfer); in scmi_xfer_pending_set()
508 scmi_xfer_inflight_register_unlocked(xfer, minfo); in scmi_xfer_pending_set()
539 struct scmi_xfer *xfer; in scmi_xfer_get() local
548 xfer = hlist_entry(minfo->free_xfers.first, struct scmi_xfer, node); in scmi_xfer_get()
549 hlist_del_init(&xfer->node); in scmi_xfer_get()
555 xfer->transfer_id = atomic_inc_return(&transfer_last_id); in scmi_xfer_get()
557 refcount_set(&xfer->users, 1); in scmi_xfer_get()
558 atomic_set(&xfer->busy, SCMI_XFER_FREE); in scmi_xfer_get()
561 return xfer; in scmi_xfer_get()
575 struct scmi_xfer *xfer; in scmi_xfer_raw_get() local
578 xfer = scmi_xfer_get(handle, &info->tx_minfo); in scmi_xfer_raw_get()
579 if (!IS_ERR(xfer)) in scmi_xfer_raw_get()
580 xfer->flags |= SCMI_XFER_FLAG_IS_RAW; in scmi_xfer_raw_get()
582 return xfer; in scmi_xfer_raw_get()
633 __scmi_xfer_put(struct scmi_xfers_info *minfo, struct scmi_xfer *xfer) in __scmi_xfer_put() argument
638 if (refcount_dec_and_test(&xfer->users)) { in __scmi_xfer_put()
639 if (xfer->pending) { in __scmi_xfer_put()
640 scmi_xfer_token_clear(minfo, xfer); in __scmi_xfer_put()
641 hash_del(&xfer->node); in __scmi_xfer_put()
642 xfer->pending = false; in __scmi_xfer_put()
644 hlist_add_head(&xfer->node, &minfo->free_xfers); in __scmi_xfer_put()
658 void scmi_xfer_raw_put(const struct scmi_handle *handle, struct scmi_xfer *xfer) in scmi_xfer_raw_put() argument
662 xfer->flags &= ~SCMI_XFER_FLAG_IS_RAW; in scmi_xfer_raw_put()
663 xfer->flags &= ~SCMI_XFER_FLAG_CHAN_SET; in scmi_xfer_raw_put()
664 return __scmi_xfer_put(&info->tx_minfo, xfer); in scmi_xfer_raw_put()
682 struct scmi_xfer *xfer = NULL; in scmi_xfer_lookup_unlocked() local
685 xfer = XFER_FIND(minfo->pending_xfers, xfer_id); in scmi_xfer_lookup_unlocked()
687 return xfer ?: ERR_PTR(-EINVAL); in scmi_xfer_lookup_unlocked()
711 struct scmi_xfer *xfer) in scmi_msg_response_validate() argument
719 if (msg_type == MSG_TYPE_DELAYED_RESP && !xfer->async_done) { in scmi_msg_response_validate()
722 xfer->hdr.seq); in scmi_msg_response_validate()
726 switch (xfer->state) { in scmi_msg_response_validate()
733 xfer->hdr.status = SCMI_SUCCESS; in scmi_msg_response_validate()
734 xfer->state = SCMI_XFER_RESP_OK; in scmi_msg_response_validate()
735 complete(&xfer->done); in scmi_msg_response_validate()
738 xfer->hdr.seq); in scmi_msg_response_validate()
765 static inline void scmi_xfer_state_update(struct scmi_xfer *xfer, u8 msg_type) in scmi_xfer_state_update() argument
767 xfer->hdr.type = msg_type; in scmi_xfer_state_update()
770 if (xfer->hdr.type == MSG_TYPE_COMMAND) in scmi_xfer_state_update()
771 xfer->state = SCMI_XFER_RESP_OK; in scmi_xfer_state_update()
773 xfer->state = SCMI_XFER_DRESP_OK; in scmi_xfer_state_update()
776 static bool scmi_xfer_acquired(struct scmi_xfer *xfer) in scmi_xfer_acquired() argument
780 ret = atomic_cmpxchg(&xfer->busy, SCMI_XFER_FREE, SCMI_XFER_BUSY); in scmi_xfer_acquired()
802 struct scmi_xfer *xfer; in scmi_xfer_command_acquire() local
810 xfer = scmi_xfer_lookup_unlocked(minfo, xfer_id); in scmi_xfer_command_acquire()
811 if (IS_ERR(xfer)) { in scmi_xfer_command_acquire()
816 return xfer; in scmi_xfer_command_acquire()
818 refcount_inc(&xfer->users); in scmi_xfer_command_acquire()
821 spin_lock_irqsave(&xfer->lock, flags); in scmi_xfer_command_acquire()
822 ret = scmi_msg_response_validate(cinfo, msg_type, xfer); in scmi_xfer_command_acquire()
831 spin_until_cond(scmi_xfer_acquired(xfer)); in scmi_xfer_command_acquire()
832 scmi_xfer_state_update(xfer, msg_type); in scmi_xfer_command_acquire()
834 spin_unlock_irqrestore(&xfer->lock, flags); in scmi_xfer_command_acquire()
839 msg_type, xfer_id, msg_hdr, xfer->state); in scmi_xfer_command_acquire()
841 __scmi_xfer_put(minfo, xfer); in scmi_xfer_command_acquire()
842 xfer = ERR_PTR(-EINVAL); in scmi_xfer_command_acquire()
845 return xfer; in scmi_xfer_command_acquire()
849 struct scmi_xfer *xfer) in scmi_xfer_command_release() argument
851 atomic_set(&xfer->busy, SCMI_XFER_FREE); in scmi_xfer_command_release()
852 __scmi_xfer_put(&info->tx_minfo, xfer); in scmi_xfer_command_release()
865 struct scmi_xfer *xfer; in scmi_handle_notification() local
872 xfer = scmi_xfer_get(cinfo->handle, minfo); in scmi_handle_notification()
873 if (IS_ERR(xfer)) { in scmi_handle_notification()
875 PTR_ERR(xfer)); in scmi_handle_notification()
880 unpack_scmi_header(msg_hdr, &xfer->hdr); in scmi_handle_notification()
883 smp_store_mb(xfer->priv, priv); in scmi_handle_notification()
885 xfer); in scmi_handle_notification()
887 trace_scmi_msg_dump(info->id, cinfo->id, xfer->hdr.protocol_id, in scmi_handle_notification()
888 xfer->hdr.id, "NOTI", xfer->hdr.seq, in scmi_handle_notification()
889 xfer->hdr.status, xfer->rx.buf, xfer->rx.len); in scmi_handle_notification()
891 scmi_notify(cinfo->handle, xfer->hdr.protocol_id, in scmi_handle_notification()
892 xfer->hdr.id, xfer->rx.buf, xfer->rx.len, ts); in scmi_handle_notification()
894 trace_scmi_rx_done(xfer->transfer_id, xfer->hdr.id, in scmi_handle_notification()
895 xfer->hdr.protocol_id, xfer->hdr.seq, in scmi_handle_notification()
899 xfer->hdr.seq = MSG_XTRACT_TOKEN(msg_hdr); in scmi_handle_notification()
900 scmi_raw_message_report(info->raw, xfer, SCMI_RAW_NOTIF_QUEUE, in scmi_handle_notification()
904 __scmi_xfer_put(minfo, xfer); in scmi_handle_notification()
912 struct scmi_xfer *xfer; in scmi_handle_response() local
915 xfer = scmi_xfer_command_acquire(cinfo, msg_hdr); in scmi_handle_response()
916 if (IS_ERR(xfer)) { in scmi_handle_response()
926 if (xfer->hdr.type == MSG_TYPE_DELAYED_RESP) in scmi_handle_response()
927 xfer->rx.len = info->desc->max_msg_size; in scmi_handle_response()
931 smp_store_mb(xfer->priv, priv); in scmi_handle_response()
932 info->desc->ops->fetch_response(cinfo, xfer); in scmi_handle_response()
934 trace_scmi_msg_dump(info->id, cinfo->id, xfer->hdr.protocol_id, in scmi_handle_response()
935 xfer->hdr.id, in scmi_handle_response()
936 xfer->hdr.type == MSG_TYPE_DELAYED_RESP ? in scmi_handle_response()
937 (!SCMI_XFER_IS_RAW(xfer) ? "DLYD" : "dlyd") : in scmi_handle_response()
938 (!SCMI_XFER_IS_RAW(xfer) ? "RESP" : "resp"), in scmi_handle_response()
939 xfer->hdr.seq, xfer->hdr.status, in scmi_handle_response()
940 xfer->rx.buf, xfer->rx.len); in scmi_handle_response()
942 trace_scmi_rx_done(xfer->transfer_id, xfer->hdr.id, in scmi_handle_response()
943 xfer->hdr.protocol_id, xfer->hdr.seq, in scmi_handle_response()
944 xfer->hdr.type); in scmi_handle_response()
946 if (xfer->hdr.type == MSG_TYPE_DELAYED_RESP) { in scmi_handle_response()
948 complete(xfer->async_done); in scmi_handle_response()
950 complete(&xfer->done); in scmi_handle_response()
959 if (!xfer->hdr.poll_completion) in scmi_handle_response()
960 scmi_raw_message_report(info->raw, xfer, in scmi_handle_response()
965 scmi_xfer_command_release(info, xfer); in scmi_handle_response()
1006 struct scmi_xfer *xfer) in xfer_put() argument
1011 __scmi_xfer_put(&info->tx_minfo, xfer); in xfer_put()
1015 struct scmi_xfer *xfer, ktime_t stop) in scmi_xfer_done_no_timeout() argument
1023 return info->desc->ops->poll_done(cinfo, xfer) || in scmi_xfer_done_no_timeout()
1024 try_wait_for_completion(&xfer->done) || in scmi_xfer_done_no_timeout()
1030 struct scmi_xfer *xfer, unsigned int timeout_ms) in scmi_wait_for_reply() argument
1034 if (xfer->hdr.poll_completion) { in scmi_wait_for_reply()
1047 xfer, stop)); in scmi_wait_for_reply()
1065 spin_lock_irqsave(&xfer->lock, flags); in scmi_wait_for_reply()
1066 if (xfer->state == SCMI_XFER_SENT_OK) { in scmi_wait_for_reply()
1067 desc->ops->fetch_response(cinfo, xfer); in scmi_wait_for_reply()
1068 xfer->state = SCMI_XFER_RESP_OK; in scmi_wait_for_reply()
1070 spin_unlock_irqrestore(&xfer->lock, flags); in scmi_wait_for_reply()
1074 xfer->hdr.protocol_id, xfer->hdr.id, in scmi_wait_for_reply()
1075 !SCMI_XFER_IS_RAW(xfer) ? in scmi_wait_for_reply()
1077 xfer->hdr.seq, xfer->hdr.status, in scmi_wait_for_reply()
1078 xfer->rx.buf, xfer->rx.len); in scmi_wait_for_reply()
1084 scmi_raw_message_report(info->raw, xfer, in scmi_wait_for_reply()
1091 if (!wait_for_completion_timeout(&xfer->done, in scmi_wait_for_reply()
1115 struct scmi_xfer *xfer) in scmi_wait_for_message_response() argument
1120 trace_scmi_xfer_response_wait(xfer->transfer_id, xfer->hdr.id, in scmi_wait_for_message_response()
1121 xfer->hdr.protocol_id, xfer->hdr.seq, in scmi_wait_for_message_response()
1123 xfer->hdr.poll_completion); in scmi_wait_for_message_response()
1125 return scmi_wait_for_reply(dev, info->desc, cinfo, xfer, in scmi_wait_for_message_response()
1140 struct scmi_xfer *xfer, in scmi_xfer_raw_wait_for_message_response() argument
1147 ret = scmi_wait_for_reply(dev, info->desc, cinfo, xfer, timeout_ms); in scmi_xfer_raw_wait_for_message_response()
1150 pack_scmi_header(&xfer->hdr)); in scmi_xfer_raw_wait_for_message_response()
1166 struct scmi_xfer *xfer) in do_xfer() argument
1175 if (xfer->hdr.poll_completion && in do_xfer()
1188 xfer->hdr.poll_completion = true; in do_xfer()
1195 xfer->hdr.protocol_id = pi->proto->id; in do_xfer()
1196 reinit_completion(&xfer->done); in do_xfer()
1198 trace_scmi_xfer_begin(xfer->transfer_id, xfer->hdr.id, in do_xfer()
1199 xfer->hdr.protocol_id, xfer->hdr.seq, in do_xfer()
1200 xfer->hdr.poll_completion); in do_xfer()
1203 xfer->hdr.status = SCMI_SUCCESS; in do_xfer()
1204 xfer->state = SCMI_XFER_SENT_OK; in do_xfer()
1214 ret = info->desc->ops->send_message(cinfo, xfer); in do_xfer()
1220 trace_scmi_msg_dump(info->id, cinfo->id, xfer->hdr.protocol_id, in do_xfer()
1221 xfer->hdr.id, "CMND", xfer->hdr.seq, in do_xfer()
1222 xfer->hdr.status, xfer->tx.buf, xfer->tx.len); in do_xfer()
1224 ret = scmi_wait_for_message_response(cinfo, xfer); in do_xfer()
1225 if (!ret && xfer->hdr.status) in do_xfer()
1226 ret = scmi_to_linux_errno(xfer->hdr.status); in do_xfer()
1229 info->desc->ops->mark_txdone(cinfo, ret, xfer); in do_xfer()
1231 trace_scmi_xfer_end(xfer->transfer_id, xfer->hdr.id, in do_xfer()
1232 xfer->hdr.protocol_id, xfer->hdr.seq, ret); in do_xfer()
1238 struct scmi_xfer *xfer) in reset_rx_to_maxsz() argument
1243 xfer->rx.len = info->desc->max_msg_size; in reset_rx_to_maxsz()
1271 struct scmi_xfer *xfer) in do_xfer_with_response() argument
1276 xfer->async_done = &async_response; in do_xfer_with_response()
1284 WARN_ON_ONCE(xfer->hdr.poll_completion); in do_xfer_with_response()
1286 ret = do_xfer(ph, xfer); in do_xfer_with_response()
1288 if (!wait_for_completion_timeout(xfer->async_done, timeout)) { in do_xfer_with_response()
1293 } else if (xfer->hdr.status) { in do_xfer_with_response()
1294 ret = scmi_to_linux_errno(xfer->hdr.status); in do_xfer_with_response()
1298 xfer->async_done = NULL; in do_xfer_with_response()
1322 struct scmi_xfer *xfer; in xfer_get_init() local
1333 xfer = scmi_xfer_get(pi->handle, minfo); in xfer_get_init()
1334 if (IS_ERR(xfer)) { in xfer_get_init()
1335 ret = PTR_ERR(xfer); in xfer_get_init()
1341 ret = scmi_xfer_pending_set(xfer, minfo); in xfer_get_init()
1345 __scmi_xfer_put(minfo, xfer); in xfer_get_init()
1349 xfer->tx.len = tx_size; in xfer_get_init()
1350 xfer->rx.len = rx_size ? : info->desc->max_msg_size; in xfer_get_init()
1351 xfer->hdr.type = MSG_TYPE_COMMAND; in xfer_get_init()
1352 xfer->hdr.id = msg_id; in xfer_get_init()
1353 xfer->hdr.poll_completion = false; in xfer_get_init()
1355 *p = xfer; in xfer_get_init()
2209 struct scmi_xfer *xfer; in __scmi_xfer_info_init() local
2236 xfer = devm_kzalloc(dev, sizeof(*xfer), GFP_KERNEL); in __scmi_xfer_info_init()
2237 if (!xfer) in __scmi_xfer_info_init()
2240 xfer->rx.buf = devm_kcalloc(dev, sizeof(u8), desc->max_msg_size, in __scmi_xfer_info_init()
2242 if (!xfer->rx.buf) in __scmi_xfer_info_init()
2245 xfer->tx.buf = xfer->rx.buf; in __scmi_xfer_info_init()
2246 init_completion(&xfer->done); in __scmi_xfer_info_init()
2247 spin_lock_init(&xfer->lock); in __scmi_xfer_info_init()
2250 hlist_add_head(&xfer->node, &info->free_xfers); in __scmi_xfer_info_init()