Lines Matching defs:req

269 	struct scmi_req *req;
275 req = malloc(sizeof(*req) + max_payld_sz,
278 req->dev = dev;
279 req->tsk.ta_context = &req->tsk;
280 req->tsk.ta_func = scmi_req_async_waiter;
282 mtx_init(&req->mtx, "req", "SCMI", MTX_SPIN);
283 LIST_INSERT_HEAD(&rp->head, req, next);
294 struct scmi_req *req;
296 LIST_FOREACH(req, &rp->head, next) {
297 mtx_destroy(&req->mtx);
298 free(req, M_DEVBUF);
379 struct scmi_req *req;
390 req = scmi_req_alloc(sc, SCMI_CHAN_A2P);
391 if (req == NULL)
394 req->msg.tx_len = sizeof(req->msg.hdr) + tx_payld_sz;
395 req->msg.rx_len = rx_payld_sz ?
398 return (req);
405 struct scmi_req *req = NULL;
410 req = LIST_FIRST(&rp->head);
415 if (req != NULL) {
416 refcount_init(&req->cnt, 1);
418 req, refcount_load(&req->cnt), -1);
421 return (req);
426 struct scmi_req *req)
432 req->timed_out = false;
433 req->done = false;
434 req->is_raw = false;
435 refcount_init(&req->cnt, 0);
436 LIST_INSERT_HEAD(&rp->head, req, next);
440 req, refcount_load(&req->cnt), -1);
444 scmi_req_get(struct scmi_softc *sc, struct scmi_req *req)
448 mtx_lock_spin(&req->mtx);
449 ok = refcount_acquire_if_not_zero(&req->cnt);
450 mtx_unlock_spin(&req->mtx);
456 req, refcount_load(&req->cnt), SCMI_MSG_TOKEN(req->msg.hdr));
462 scmi_req_put(struct scmi_softc *sc, struct scmi_req *req)
464 mtx_lock_spin(&req->mtx);
465 if (!refcount_release_if_not_last(&req->cnt)) {
466 req->protocol_id = 0;
467 req->message_id = 0;
468 req->token = 0;
469 req->header = 0;
470 bzero(&req->msg, sizeof(req->msg) + SCMI_MAX_MSG_PAYLD_SIZE(sc));
471 scmi_req_free_unlocked(sc, SCMI_CHAN_A2P, req);
474 req, refcount_load(&req->cnt), SCMI_MSG_TOKEN(req->msg.hdr));
476 mtx_unlock_spin(&req->mtx);
537 scmi_finalize_req(struct scmi_softc *sc, struct scmi_req *req)
539 if (!req->is_raw)
540 req->token = scmi_token_pick(sc);
542 req->token = scmi_token_reserve(sc, SCMI_MSG_TOKEN(req->msg.hdr));
544 if (req->token < 0)
547 if (!req->is_raw) {
548 req->msg.hdr = req->message_id;
549 req->msg.hdr |= SCMI_MSG_TYPE_CMD << SCMI_HDR_MESSAGE_TYPE_S;
550 req->msg.hdr |= req->protocol_id << SCMI_HDR_PROTOCOL_ID_S;
551 req->msg.hdr |= req->token << SCMI_HDR_TOKEN_S;
555 req->header = req->msg.hdr;
561 scmi_req_track_inflight(struct scmi_softc *sc, struct scmi_req *req)
566 error = scmi_finalize_req(sc, req);
571 scmi_req_get(sc, req);
574 LIST_INSERT_HEAD(REQHASH(sc, req->token), req, next);
581 scmi_req_drop_inflight(struct scmi_softc *sc, struct scmi_req *req)
586 LIST_REMOVE(req, next);
587 scmi_token_release_unlocked(sc, req->token);
589 /* ...and drop refcount..potentially releasing *req */
590 scmi_req_put(sc, req);
598 struct scmi_req *req = NULL;
603 LIST_FOREACH(req, REQHASH(sc, token), next) {
604 if (req->token == token)
609 return (req);
616 struct scmi_req *req;
618 req = scmi_req_lookup_inflight(sc, hdr);
619 if (req == NULL) {
626 SDT_PROBE5(scmi, func, scmi_process_response, xfer_track, req,
627 SCMI_MSG_PROTOCOL_ID(req->msg.hdr), SCMI_MSG_MESSAGE_ID(req->msg.hdr),
628 SCMI_MSG_TOKEN(req->msg.hdr), req->timed_out);
630 mtx_lock_spin(&req->mtx);
631 req->done = true;
632 req->msg.rx_len = rx_len;
633 if (!req->timed_out) {
639 if (!req->msg.polling)
640 wakeup(req);
642 atomic_store_rel_int(&req->msg.poll_done, 1);
646 mtx_unlock_spin(&req->mtx);
651 req->token);
657 scmi_req_drop_inflight(sc, req);
679 scmi_wait_for_response(struct scmi_softc *sc, struct scmi_req *req, void **out)
684 SDT_PROBE5(scmi, entry, scmi_wait_for_response, xfer_track, req,
685 SCMI_MSG_PROTOCOL_ID(req->msg.hdr), SCMI_MSG_MESSAGE_ID(req->msg.hdr),
686 SCMI_MSG_TOKEN(req->msg.hdr), reply_timo_ms);
688 if (req->msg.polling) {
691 ret = SCMI_POLL_MSG(sc->dev, &req->msg, reply_timo_ms);
693 * Drop reference to successfully polled req unless it had
698 mtx_lock_spin(&req->mtx);
699 needs_drop = (ret == 0) && !req->done;
700 req->timed_out = ret != 0;
701 mtx_unlock_spin(&req->mtx);
703 scmi_req_drop_inflight(sc, req);
704 if (ret == 0 && req->msg.hdr != req->header) {
707 le32toh(req->msg.hdr), le32toh(req->header));
710 ret = tsleep(req, 0, "scmi_wait4", (reply_timo_ms * hz) / 1000);
712 mtx_lock_spin(&req->mtx);
713 if (ret != 0 && req->done)
715 req->timed_out = ret != 0;
716 mtx_unlock_spin(&req->mtx);
720 SCMI_COLLECT_REPLY(sc->dev, &req->msg);
721 if (req->msg.payld[0] != 0)
722 ret = req->msg.payld[0];
724 *out = &req->msg.payld[SCMI_MSG_HDR_SIZE];
727 "Request for token 0x%X timed-out.\n", req->token);
732 SDT_PROBE5(scmi, exit, scmi_wait_for_response, xfer_track, req,
733 SCMI_MSG_PROTOCOL_ID(req->msg.hdr), SCMI_MSG_MESSAGE_ID(req->msg.hdr),
734 SCMI_MSG_TOKEN(req->msg.hdr), req->timed_out);
743 struct scmi_req *req;
745 /* Pick a pre-built req */
746 req = scmi_req_initialized_alloc(dev, tx_payld_sz, rx_payld_sz);
747 if (req == NULL)
750 req->protocol_id = protocol_id & SCMI_HDR_PROTOCOL_ID_BF;
751 req->message_id = message_id & SCMI_HDR_MESSAGE_ID_BF;
753 return (&req->msg.payld[0]);
760 struct scmi_req *req;
764 req = buf_to_req(buf);
765 scmi_req_put(sc, req);
771 struct scmi_req *req;
773 /* Pick a pre-built req */
774 req = scmi_req_initialized_alloc(dev, tx_payld_sz, rx_payld_sz);
775 if (req == NULL)
778 req->is_raw = true;
780 return (&req->msg);
788 struct scmi_req *req;
790 req = tsk_to_req(ta);
791 sc = device_get_softc(req->dev);
792 scmi_wait_for_response(sc, req, NULL);
794 scmi_msg_put(req->dev, &req->msg);
801 struct scmi_req *req;
805 req = msg_to_req(msg);
807 scmi_req_put(sc, req);
814 struct scmi_req *req;
819 req = buf_to_req(in);
821 req->msg.polling =
822 (cold || sc->trs_desc.no_completion_irq || req->use_polling);
825 error = scmi_req_track_inflight(sc, req);
827 device_printf(dev, "Failed to build req with HDR |%0X|\n",
828 req->msg.hdr);
832 error = SCMI_XFER_MSG(sc->dev, &req->msg);
834 scmi_req_drop_inflight(sc, req);
838 SDT_PROBE5(scmi, func, scmi_request_tx, xfer_track, req,
839 SCMI_MSG_PROTOCOL_ID(req->msg.hdr), SCMI_MSG_MESSAGE_ID(req->msg.hdr),
840 SCMI_MSG_TOKEN(req->msg.hdr), req->msg.polling);
849 struct scmi_req *req;
857 req = buf_to_req(in);
859 return (scmi_wait_for_response(sc, req, out));
865 struct scmi_req *req;
867 req = msg_to_req(msg);
869 return taskqueue_enqueue_flags(taskqueue_thread, &req->tsk,