Lines Matching refs:msg
182 struct scmi_vio_msg *msg; in scmi_virtio_get_free_msg() local
190 msg = list_first_entry(&vioch->free_list, typeof(*msg), list); in scmi_virtio_get_free_msg()
191 list_del_init(&msg->list); in scmi_virtio_get_free_msg()
195 msg->poll_status = VIO_MSG_NOT_POLLED; in scmi_virtio_get_free_msg()
196 refcount_set(&msg->users, 1); in scmi_virtio_get_free_msg()
198 return msg; in scmi_virtio_get_free_msg()
201 static inline bool scmi_vio_msg_acquire(struct scmi_vio_msg *msg) in scmi_vio_msg_acquire() argument
203 return refcount_inc_not_zero(&msg->users); in scmi_vio_msg_acquire()
208 struct scmi_vio_msg *msg) in scmi_vio_msg_release() argument
212 ret = refcount_dec_and_test(&msg->users); in scmi_vio_msg_release()
217 list_add_tail(&msg->list, &vioch->free_list); in scmi_vio_msg_release()
230 struct scmi_vio_msg *msg) in scmi_vio_feed_vq_rx() argument
237 sg_init_one(&sg_in, msg->input, VIRTIO_SCMI_MAX_PDU_SIZE); in scmi_vio_feed_vq_rx()
241 rc = virtqueue_add_inbuf(vioch->vqueue, &sg_in, 1, msg, GFP_ATOMIC); in scmi_vio_feed_vq_rx()
257 struct scmi_vio_msg *msg) in scmi_finalize_message() argument
260 scmi_vio_feed_vq_rx(vioch, msg); in scmi_finalize_message()
262 scmi_vio_msg_release(vioch, msg); in scmi_finalize_message()
270 struct scmi_vio_msg *msg; in scmi_vio_complete_cb() local
287 msg = virtqueue_get_buf(vqueue, &length); in scmi_vio_complete_cb()
288 if (!msg) { in scmi_vio_complete_cb()
298 if (msg) { in scmi_vio_complete_cb()
299 msg->rx_len = length; in scmi_vio_complete_cb()
301 core->msg->read_header(msg->input), in scmi_vio_complete_cb()
302 msg); in scmi_vio_complete_cb()
304 scmi_finalize_message(vioch, msg); in scmi_vio_complete_cb()
322 struct scmi_vio_msg *msg, *tmp; in scmi_vio_deferred_tx_worker() local
338 list_for_each_entry_safe(msg, tmp, &vioch->pending_cmds_list, list) { in scmi_vio_deferred_tx_worker()
339 list_del(&msg->list); in scmi_vio_deferred_tx_worker()
345 if (msg->poll_status == VIO_MSG_NOT_POLLED) in scmi_vio_deferred_tx_worker()
347 core->msg->read_header(msg->input), in scmi_vio_deferred_tx_worker()
348 msg); in scmi_vio_deferred_tx_worker()
351 scmi_vio_msg_release(vioch, msg); in scmi_vio_deferred_tx_worker()
436 struct scmi_vio_msg *msg; in virtio_chan_setup() local
438 msg = devm_kzalloc(dev, sizeof(*msg), GFP_KERNEL); in virtio_chan_setup()
439 if (!msg) in virtio_chan_setup()
443 msg->request = devm_kzalloc(dev, in virtio_chan_setup()
446 if (!msg->request) in virtio_chan_setup()
448 spin_lock_init(&msg->poll_lock); in virtio_chan_setup()
449 refcount_set(&msg->users, 1); in virtio_chan_setup()
452 msg->input = devm_kzalloc(dev, VIRTIO_SCMI_MAX_PDU_SIZE, in virtio_chan_setup()
454 if (!msg->input) in virtio_chan_setup()
457 scmi_finalize_message(vioch, msg); in virtio_chan_setup()
490 struct scmi_vio_msg *msg; in virtio_send_message() local
495 msg = scmi_virtio_get_free_msg(vioch); in virtio_send_message()
496 if (!msg) { in virtio_send_message()
501 core->msg->tx_prepare(msg->request, xfer); in virtio_send_message()
503 sg_init_one(&sg_out, msg->request, core->msg->command_size(xfer)); in virtio_send_message()
504 sg_init_one(&sg_in, msg->input, core->msg->response_size(xfer)); in virtio_send_message()
515 msg->poll_idx = virtqueue_enable_cb_prepare(vioch->vqueue); in virtio_send_message()
517 msg->poll_status = VIO_MSG_POLLING; in virtio_send_message()
518 scmi_vio_msg_acquire(msg); in virtio_send_message()
520 smp_store_mb(xfer->priv, msg); in virtio_send_message()
523 rc = virtqueue_add_sgs(vioch->vqueue, sgs, 1, 1, msg, GFP_ATOMIC); in virtio_send_message()
536 scmi_vio_msg_release(vioch, msg); in virtio_send_message()
537 scmi_vio_msg_release(vioch, msg); in virtio_send_message()
548 struct scmi_vio_msg *msg = xfer->priv; in virtio_fetch_response() local
550 if (msg) in virtio_fetch_response()
551 core->msg->fetch_response(msg->input, msg->rx_len, xfer); in virtio_fetch_response()
557 struct scmi_vio_msg *msg = xfer->priv; in virtio_fetch_notification() local
559 if (msg) in virtio_fetch_notification()
560 core->msg->fetch_notification(msg->input, msg->rx_len, in virtio_fetch_notification()
604 struct scmi_vio_msg *msg = xfer->priv; in virtio_mark_txdone() local
606 if (!msg || !scmi_vio_channel_acquire(vioch)) in virtio_mark_txdone()
613 if (!xfer->hdr.poll_completion || scmi_vio_msg_release(vioch, msg)) { in virtio_mark_txdone()
618 spin_lock_irqsave(&msg->poll_lock, flags); in virtio_mark_txdone()
620 if (ret != -ETIMEDOUT || msg->poll_status == VIO_MSG_POLL_DONE) in virtio_mark_txdone()
621 scmi_vio_msg_release(vioch, msg); in virtio_mark_txdone()
622 else if (msg->poll_status == VIO_MSG_POLLING) in virtio_mark_txdone()
623 msg->poll_status = VIO_MSG_POLL_TIMEOUT; in virtio_mark_txdone()
624 spin_unlock_irqrestore(&msg->poll_lock, flags); in virtio_mark_txdone()
672 struct scmi_vio_msg *next_msg, *msg = xfer->priv; in virtio_poll_done() local
675 if (!msg) in virtio_poll_done()
693 if (msg->poll_status == VIO_MSG_POLL_DONE) in virtio_poll_done()
700 pending = virtqueue_poll(vioch->vqueue, msg->poll_idx); in virtio_poll_done()
729 if (next_msg == msg) { in virtio_poll_done()
767 msg->poll_idx = virtqueue_enable_cb_prepare(vioch->vqueue); in virtio_poll_done()
768 pending = virtqueue_poll(vioch->vqueue, msg->poll_idx); in virtio_poll_done()