Lines Matching refs:msg
184 struct scmi_vio_msg *msg;
192 msg = list_first_entry(&vioch->free_list, typeof(*msg), list);
193 list_del_init(&msg->list);
197 msg->poll_status = VIO_MSG_NOT_POLLED;
198 refcount_set(&msg->users, 1);
200 return msg;
203 static inline bool scmi_vio_msg_acquire(struct scmi_vio_msg *msg)
205 return refcount_inc_not_zero(&msg->users);
210 struct scmi_vio_msg *msg)
214 ret = refcount_dec_and_test(&msg->users);
219 list_add_tail(&msg->list, &vioch->free_list);
232 struct scmi_vio_msg *msg)
239 sg_init_one(&sg_in, msg->input, msg->max_len);
243 rc = virtqueue_add_inbuf(vioch->vqueue, &sg_in, 1, msg, GFP_ATOMIC);
259 struct scmi_vio_msg *msg)
262 scmi_vio_feed_vq_rx(vioch, msg);
264 scmi_vio_msg_release(vioch, msg);
272 struct scmi_vio_msg *msg;
289 msg = virtqueue_get_buf(vqueue, &length);
290 if (!msg) {
300 if (msg) {
301 msg->rx_len = length;
303 core->msg->read_header(msg->input),
304 msg);
306 scmi_finalize_message(vioch, msg);
324 struct scmi_vio_msg *msg, *tmp;
340 list_for_each_entry_safe(msg, tmp, &vioch->pending_cmds_list, list) {
341 list_del(&msg->list);
347 if (msg->poll_status == VIO_MSG_NOT_POLLED)
349 core->msg->read_header(msg->input),
350 msg);
353 scmi_vio_msg_release(vioch, msg);
438 struct scmi_vio_msg *msg;
440 msg = devm_kzalloc(dev, sizeof(*msg), GFP_KERNEL);
441 if (!msg)
444 msg->max_len = VIRTIO_SCMI_MAX_PDU_SIZE(cinfo);
446 msg->request = devm_kzalloc(dev, msg->max_len,
448 if (!msg->request)
450 spin_lock_init(&msg->poll_lock);
451 refcount_set(&msg->users, 1);
454 msg->input = devm_kzalloc(dev, msg->max_len, GFP_KERNEL);
455 if (!msg->input)
458 scmi_finalize_message(vioch, msg);
491 struct scmi_vio_msg *msg;
496 msg = scmi_virtio_get_free_msg(vioch);
497 if (!msg) {
502 core->msg->tx_prepare(msg->request, xfer);
504 sg_init_one(&sg_out, msg->request, core->msg->command_size(xfer));
505 sg_init_one(&sg_in, msg->input, core->msg->response_size(xfer));
513 * - grab an additional msg refcount for the poll-path
516 msg->poll_idx = virtqueue_enable_cb_prepare(vioch->vqueue);
518 msg->poll_status = VIO_MSG_POLLING;
519 scmi_vio_msg_acquire(msg);
520 /* Ensure initialized msg is visibly bound to xfer */
521 smp_store_mb(xfer->priv, msg);
524 rc = virtqueue_add_sgs(vioch->vqueue, sgs, 1, 1, msg, GFP_ATOMIC);
537 scmi_vio_msg_release(vioch, msg);
538 scmi_vio_msg_release(vioch, msg);
549 struct scmi_vio_msg *msg = xfer->priv;
551 if (msg)
552 core->msg->fetch_response(msg->input, msg->rx_len, xfer);
558 struct scmi_vio_msg *msg = xfer->priv;
560 if (msg)
561 core->msg->fetch_notification(msg->input, msg->rx_len,
605 struct scmi_vio_msg *msg = xfer->priv;
607 if (!msg || !scmi_vio_channel_acquire(vioch))
610 /* Ensure msg is unbound from xfer anyway at this point */
614 if (!xfer->hdr.poll_completion || scmi_vio_msg_release(vioch, msg)) {
619 spin_lock_irqsave(&msg->poll_lock, flags);
621 if (ret != -ETIMEDOUT || msg->poll_status == VIO_MSG_POLL_DONE)
622 scmi_vio_msg_release(vioch, msg);
623 else if (msg->poll_status == VIO_MSG_POLLING)
624 msg->poll_status = VIO_MSG_POLL_TIMEOUT;
625 spin_unlock_irqrestore(&msg->poll_lock, flags);
673 struct scmi_vio_msg *next_msg, *msg = xfer->priv;
676 if (!msg)
694 if (msg->poll_status == VIO_MSG_POLL_DONE)
701 pending = virtqueue_poll(vioch->vqueue, msg->poll_idx);
730 if (next_msg == msg) {
734 /* Skip the rest if this was another polled msg */
768 msg->poll_idx = virtqueue_enable_cb_prepare(vioch->vqueue);
769 pending = virtqueue_poll(vioch->vqueue, msg->poll_idx);