Lines Matching full:cmd

31 static void cdx_mcdi_cancel_cmd(struct cdx_mcdi *cdx, struct cdx_mcdi_cmd *cmd);
34 struct cdx_mcdi_cmd *cmd,
39 struct cdx_mcdi_cmd *cmd);
41 struct cdx_mcdi_cmd *cmd,
46 struct cdx_mcdi_cmd *cmd,
50 static void _cdx_mcdi_display_error(struct cdx_mcdi *cdx, unsigned int cmd,
53 static bool cdx_cmd_cancelled(struct cdx_mcdi_cmd *cmd) in cdx_cmd_cancelled() argument
55 return cmd->state == MCDI_STATE_RUNNING_CANCELLED; in cdx_cmd_cancelled()
63 static unsigned int cdx_mcdi_cmd_handle(struct cdx_mcdi_cmd *cmd) in cdx_mcdi_cmd_handle() argument
65 return cmd->handle; in cdx_mcdi_cmd_handle()
69 struct cdx_mcdi_cmd *cmd, in _cdx_mcdi_remove_cmd() argument
73 if (cdx_cmd_cancelled(cmd)) in _cdx_mcdi_remove_cmd()
76 if (cmd->completer) { in _cdx_mcdi_remove_cmd()
77 list_add_tail(&cmd->cleanup_list, cleanup_list); in _cdx_mcdi_remove_cmd()
79 kref_get(&cmd->ref); in _cdx_mcdi_remove_cmd()
84 struct cdx_mcdi_cmd *cmd, in cdx_mcdi_remove_cmd() argument
87 list_del(&cmd->list); in cdx_mcdi_remove_cmd()
88 _cdx_mcdi_remove_cmd(mcdi, cmd, cleanup_list); in cdx_mcdi_remove_cmd()
89 cmd->state = MCDI_STATE_FINISHED; in cdx_mcdi_remove_cmd()
90 kref_put(&cmd->ref, cdx_mcdi_cmd_release); in cdx_mcdi_remove_cmd()
95 static unsigned long cdx_mcdi_rpc_timeout(struct cdx_mcdi *cdx, unsigned int cmd) in cdx_mcdi_rpc_timeout() argument
100 return cdx->mcdi_ops->mcdi_rpc_timeout(cdx, cmd); in cdx_mcdi_rpc_timeout()
243 struct cdx_mcdi_cmd *cmd) in cdx_mcdi_send_request() argument
246 const struct cdx_dword *inbuf = cmd->inbuf; in cdx_mcdi_send_request()
247 size_t inlen = cmd->inlen; in cdx_mcdi_send_request()
256 mcdi->prev_seq = cmd->seq; in cdx_mcdi_send_request()
257 mcdi->seq_held_by[cmd->seq] = cmd; in cdx_mcdi_send_request()
258 mcdi->db_held_by = cmd; in cdx_mcdi_send_request()
259 cmd->started = jiffies; in cdx_mcdi_send_request()
271 MCDI_HEADER_SEQ, cmd->seq, in cdx_mcdi_send_request()
275 MC_CMD_V2_EXTN_IN_EXTENDED_CMD, cmd->cmd, in cdx_mcdi_send_request()
349 struct cdx_mcdi_cmd *cmd = in cdx_mcdi_process_cleanup_list() local
352 cmd->completer(cdx, cmd->cookie, cmd->rc, in cdx_mcdi_process_cleanup_list()
353 cmd->outbuf, cmd->outlen); in cdx_mcdi_process_cleanup_list()
354 list_del(&cmd->cleanup_list); in cdx_mcdi_process_cleanup_list()
355 kref_put(&cmd->ref, cdx_mcdi_cmd_release); in cdx_mcdi_process_cleanup_list()
375 struct cdx_mcdi_cmd *cmd; in _cdx_mcdi_cancel_cmd() local
377 list_for_each_entry(cmd, &mcdi->cmd_list, list) in _cdx_mcdi_cancel_cmd()
378 if (cdx_mcdi_cmd_handle(cmd) == handle) { in _cdx_mcdi_cancel_cmd()
379 switch (cmd->state) { in _cdx_mcdi_cancel_cmd()
383 cmd->cmd, cmd->inlen); in _cdx_mcdi_cancel_cmd()
385 cmd->rc = -EPIPE; in _cdx_mcdi_cancel_cmd()
386 cdx_mcdi_remove_cmd(mcdi, cmd, cleanup_list); in _cdx_mcdi_cancel_cmd()
399 static void cdx_mcdi_cancel_cmd(struct cdx_mcdi *cdx, struct cdx_mcdi_cmd *cmd) in cdx_mcdi_cancel_cmd() argument
408 cdx_mcdi_timeout_cmd(mcdi, cmd, &cleanup_list); in cdx_mcdi_cancel_cmd()
446 static int cdx_mcdi_rpc_sync(struct cdx_mcdi *cdx, unsigned int cmd, in cdx_mcdi_rpc_sync() argument
479 cmd_item->cmd = cmd; in cdx_mcdi_rpc_sync()
492 cdx_mcdi_rpc_timeout(cdx, cmd)) && in cdx_mcdi_rpc_sync()
495 cmd, inlen); in cdx_mcdi_rpc_sync()
523 struct cdx_mcdi_cmd *cmd, in cdx_mcdi_rpc_async_internal() argument
530 kref_put(&cmd->ref, cdx_mcdi_cmd_release); in cdx_mcdi_rpc_async_internal()
535 kref_put(&cmd->ref, cdx_mcdi_cmd_release); in cdx_mcdi_rpc_async_internal()
539 cmd->mcdi = mcdi; in cdx_mcdi_rpc_async_internal()
540 INIT_WORK(&cmd->work, cdx_mcdi_cmd_work); in cdx_mcdi_rpc_async_internal()
541 INIT_LIST_HEAD(&cmd->list); in cdx_mcdi_rpc_async_internal()
542 INIT_LIST_HEAD(&cmd->cleanup_list); in cdx_mcdi_rpc_async_internal()
543 cmd->rc = 0; in cdx_mcdi_rpc_async_internal()
544 cmd->outbuf = NULL; in cdx_mcdi_rpc_async_internal()
545 cmd->outlen = 0; in cdx_mcdi_rpc_async_internal()
547 queue_work(mcdi->workqueue, &cmd->work); in cdx_mcdi_rpc_async_internal()
552 struct cdx_mcdi_cmd *cmd) in cdx_mcdi_cmd_start_or_queue() argument
559 cmd->seq = seq; in cdx_mcdi_cmd_start_or_queue()
560 cmd->reboot_seen = false; in cdx_mcdi_cmd_start_or_queue()
561 cdx_mcdi_send_request(cdx, cmd); in cdx_mcdi_cmd_start_or_queue()
562 cmd->state = MCDI_STATE_RUNNING; in cdx_mcdi_cmd_start_or_queue()
564 cmd->state = MCDI_STATE_QUEUED; in cdx_mcdi_cmd_start_or_queue()
572 struct cdx_mcdi_cmd *cmd, *tmp; in cdx_mcdi_start_or_queue() local
574 list_for_each_entry_safe(cmd, tmp, &mcdi->cmd_list, list) in cdx_mcdi_start_or_queue()
575 if (cmd->state == MCDI_STATE_QUEUED || in cdx_mcdi_start_or_queue()
576 (cmd->state == MCDI_STATE_RETRY && allow_retry)) in cdx_mcdi_start_or_queue()
577 cdx_mcdi_cmd_start_or_queue(mcdi, cmd); in cdx_mcdi_start_or_queue()
596 struct cdx_mcdi_cmd *cmd; in cdx_mcdi_process_cmd() local
612 cmd = mcdi->seq_held_by[respseq]; in cdx_mcdi_process_cmd()
614 if (cmd) { in cdx_mcdi_process_cmd()
615 if (cmd->state == MCDI_STATE_FINISHED) { in cdx_mcdi_process_cmd()
617 kref_put(&cmd->ref, cdx_mcdi_cmd_release); in cdx_mcdi_process_cmd()
621 cdx_mcdi_complete_cmd(mcdi, cmd, outbuf, len, &cleanup_list); in cdx_mcdi_process_cmd()
634 struct cdx_mcdi_cmd *cmd = in cdx_mcdi_cmd_work() local
636 struct cdx_mcdi_iface *mcdi = cmd->mcdi; in cdx_mcdi_cmd_work()
640 cmd->handle = mcdi->prev_handle++; in cdx_mcdi_cmd_work()
641 list_add_tail(&cmd->list, &mcdi->cmd_list); in cdx_mcdi_cmd_work()
642 cdx_mcdi_cmd_start_or_queue(mcdi, cmd); in cdx_mcdi_cmd_work()
653 struct cdx_mcdi_cmd *cmd, in cdx_mcdi_complete_cmd() argument
665 kref_get(&cmd->ref); in cdx_mcdi_complete_cmd()
700 if (!cmd->quiet) { in cdx_mcdi_complete_cmd()
709 _cdx_mcdi_display_error(cdx, cmd->cmd, in cdx_mcdi_complete_cmd()
710 cmd->inlen, rc, err_arg, in cdx_mcdi_complete_cmd()
720 if (mcdi->db_held_by == cmd) in cdx_mcdi_complete_cmd()
723 if (cdx_cmd_cancelled(cmd)) { in cdx_mcdi_complete_cmd()
724 list_del(&cmd->list); in cdx_mcdi_complete_cmd()
725 kref_put(&cmd->ref, cdx_mcdi_cmd_release); in cdx_mcdi_complete_cmd()
728 cmd->state = MCDI_STATE_RETRY; in cdx_mcdi_complete_cmd()
730 cmd->rc = rc; in cdx_mcdi_complete_cmd()
731 cmd->outbuf = outbuf + DIV_ROUND_UP(resp_hdr_len, 4); in cdx_mcdi_complete_cmd()
732 cmd->outlen = resp_data_len; in cdx_mcdi_complete_cmd()
733 cdx_mcdi_remove_cmd(mcdi, cmd, cleanup_list); in cdx_mcdi_complete_cmd()
738 mcdi->seq_held_by[cmd->seq] = NULL; in cdx_mcdi_complete_cmd()
745 kref_put(&cmd->ref, cdx_mcdi_cmd_release); in cdx_mcdi_complete_cmd()
751 struct cdx_mcdi_cmd *cmd, in cdx_mcdi_timeout_cmd() argument
757 cmd->cmd, cmd->inlen, cmd->state, in cdx_mcdi_timeout_cmd()
758 jiffies_to_msecs(jiffies - cmd->started)); in cdx_mcdi_timeout_cmd()
760 cmd->rc = -ETIMEDOUT; in cdx_mcdi_timeout_cmd()
761 cdx_mcdi_remove_cmd(mcdi, cmd, cleanup_list); in cdx_mcdi_timeout_cmd()
769 * @cmd: Command type number
790 int cdx_mcdi_rpc(struct cdx_mcdi *cdx, unsigned int cmd, in cdx_mcdi_rpc() argument
795 return cdx_mcdi_rpc_sync(cdx, cmd, inbuf, inlen, outbuf, outlen, in cdx_mcdi_rpc()
803 * @cmd: Command type number
819 cdx_mcdi_rpc_async(struct cdx_mcdi *cdx, unsigned int cmd, in cdx_mcdi_rpc_async() argument
833 cmd_item->cmd = cmd; in cdx_mcdi_rpc_async()
842 static void _cdx_mcdi_display_error(struct cdx_mcdi *cdx, unsigned int cmd, in _cdx_mcdi_display_error() argument
846 cmd, (int)inlen, err_no, raw, arg); in _cdx_mcdi_display_error()
864 struct cdx_mcdi_cmd *cmd; in cdx_mcdi_mode_fail() local
866 cmd = list_first_entry(&mcdi->cmd_list, struct cdx_mcdi_cmd, in cdx_mcdi_mode_fail()
868 _cdx_mcdi_cancel_cmd(mcdi, cdx_mcdi_cmd_handle(cmd), cleanup_list); in cdx_mcdi_mode_fail()