Lines Matching refs:cmd

30 static void cdx_mcdi_cancel_cmd(struct cdx_mcdi *cdx, struct cdx_mcdi_cmd *cmd);
33 struct cdx_mcdi_cmd *cmd,
38 struct cdx_mcdi_cmd *cmd);
40 struct cdx_mcdi_cmd *cmd,
45 struct cdx_mcdi_cmd *cmd,
49 static void _cdx_mcdi_display_error(struct cdx_mcdi *cdx, unsigned int cmd,
52 static bool cdx_cmd_cancelled(struct cdx_mcdi_cmd *cmd) in cdx_cmd_cancelled() argument
54 return cmd->state == MCDI_STATE_RUNNING_CANCELLED; in cdx_cmd_cancelled()
62 static unsigned int cdx_mcdi_cmd_handle(struct cdx_mcdi_cmd *cmd) in cdx_mcdi_cmd_handle() argument
64 return cmd->handle; in cdx_mcdi_cmd_handle()
68 struct cdx_mcdi_cmd *cmd, in _cdx_mcdi_remove_cmd() argument
72 if (cdx_cmd_cancelled(cmd)) in _cdx_mcdi_remove_cmd()
75 if (cmd->completer) { in _cdx_mcdi_remove_cmd()
76 list_add_tail(&cmd->cleanup_list, cleanup_list); in _cdx_mcdi_remove_cmd()
78 kref_get(&cmd->ref); in _cdx_mcdi_remove_cmd()
83 struct cdx_mcdi_cmd *cmd, in cdx_mcdi_remove_cmd() argument
86 list_del(&cmd->list); in cdx_mcdi_remove_cmd()
87 _cdx_mcdi_remove_cmd(mcdi, cmd, cleanup_list); in cdx_mcdi_remove_cmd()
88 cmd->state = MCDI_STATE_FINISHED; in cdx_mcdi_remove_cmd()
89 kref_put(&cmd->ref, cdx_mcdi_cmd_release); in cdx_mcdi_remove_cmd()
94 static unsigned long cdx_mcdi_rpc_timeout(struct cdx_mcdi *cdx, unsigned int cmd) in cdx_mcdi_rpc_timeout() argument
99 return cdx->mcdi_ops->mcdi_rpc_timeout(cdx, cmd); in cdx_mcdi_rpc_timeout()
219 struct cdx_mcdi_cmd *cmd) in cdx_mcdi_send_request() argument
222 const struct cdx_dword *inbuf = cmd->inbuf; in cdx_mcdi_send_request()
223 size_t inlen = cmd->inlen; in cdx_mcdi_send_request()
232 mcdi->prev_seq = cmd->seq; in cdx_mcdi_send_request()
233 mcdi->seq_held_by[cmd->seq] = cmd; in cdx_mcdi_send_request()
234 mcdi->db_held_by = cmd; in cdx_mcdi_send_request()
235 cmd->started = jiffies; in cdx_mcdi_send_request()
247 MCDI_HEADER_SEQ, cmd->seq, in cdx_mcdi_send_request()
251 MC_CMD_V2_EXTN_IN_EXTENDED_CMD, cmd->cmd, in cdx_mcdi_send_request()
325 struct cdx_mcdi_cmd *cmd = in cdx_mcdi_process_cleanup_list() local
328 cmd->completer(cdx, cmd->cookie, cmd->rc, in cdx_mcdi_process_cleanup_list()
329 cmd->outbuf, cmd->outlen); in cdx_mcdi_process_cleanup_list()
330 list_del(&cmd->cleanup_list); in cdx_mcdi_process_cleanup_list()
331 kref_put(&cmd->ref, cdx_mcdi_cmd_release); in cdx_mcdi_process_cleanup_list()
351 struct cdx_mcdi_cmd *cmd; in _cdx_mcdi_cancel_cmd() local
353 list_for_each_entry(cmd, &mcdi->cmd_list, list) in _cdx_mcdi_cancel_cmd()
354 if (cdx_mcdi_cmd_handle(cmd) == handle) { in _cdx_mcdi_cancel_cmd()
355 switch (cmd->state) { in _cdx_mcdi_cancel_cmd()
359 cmd->cmd, cmd->inlen); in _cdx_mcdi_cancel_cmd()
361 cmd->rc = -EPIPE; in _cdx_mcdi_cancel_cmd()
362 cdx_mcdi_remove_cmd(mcdi, cmd, cleanup_list); in _cdx_mcdi_cancel_cmd()
375 static void cdx_mcdi_cancel_cmd(struct cdx_mcdi *cdx, struct cdx_mcdi_cmd *cmd) in cdx_mcdi_cancel_cmd() argument
384 cdx_mcdi_timeout_cmd(mcdi, cmd, &cleanup_list); in cdx_mcdi_cancel_cmd()
422 static int cdx_mcdi_rpc_sync(struct cdx_mcdi *cdx, unsigned int cmd, in cdx_mcdi_rpc_sync() argument
455 cmd_item->cmd = cmd; in cdx_mcdi_rpc_sync()
468 cdx_mcdi_rpc_timeout(cdx, cmd)) && in cdx_mcdi_rpc_sync()
471 cmd, inlen); in cdx_mcdi_rpc_sync()
499 struct cdx_mcdi_cmd *cmd, in cdx_mcdi_rpc_async_internal() argument
506 kref_put(&cmd->ref, cdx_mcdi_cmd_release); in cdx_mcdi_rpc_async_internal()
511 kref_put(&cmd->ref, cdx_mcdi_cmd_release); in cdx_mcdi_rpc_async_internal()
515 cmd->mcdi = mcdi; in cdx_mcdi_rpc_async_internal()
516 INIT_WORK(&cmd->work, cdx_mcdi_cmd_work); in cdx_mcdi_rpc_async_internal()
517 INIT_LIST_HEAD(&cmd->list); in cdx_mcdi_rpc_async_internal()
518 INIT_LIST_HEAD(&cmd->cleanup_list); in cdx_mcdi_rpc_async_internal()
519 cmd->rc = 0; in cdx_mcdi_rpc_async_internal()
520 cmd->outbuf = NULL; in cdx_mcdi_rpc_async_internal()
521 cmd->outlen = 0; in cdx_mcdi_rpc_async_internal()
523 queue_work(mcdi->workqueue, &cmd->work); in cdx_mcdi_rpc_async_internal()
528 struct cdx_mcdi_cmd *cmd) in cdx_mcdi_cmd_start_or_queue() argument
535 cmd->seq = seq; in cdx_mcdi_cmd_start_or_queue()
536 cmd->reboot_seen = false; in cdx_mcdi_cmd_start_or_queue()
537 cdx_mcdi_send_request(cdx, cmd); in cdx_mcdi_cmd_start_or_queue()
538 cmd->state = MCDI_STATE_RUNNING; in cdx_mcdi_cmd_start_or_queue()
540 cmd->state = MCDI_STATE_QUEUED; in cdx_mcdi_cmd_start_or_queue()
548 struct cdx_mcdi_cmd *cmd, *tmp; in cdx_mcdi_start_or_queue() local
550 list_for_each_entry_safe(cmd, tmp, &mcdi->cmd_list, list) in cdx_mcdi_start_or_queue()
551 if (cmd->state == MCDI_STATE_QUEUED || in cdx_mcdi_start_or_queue()
552 (cmd->state == MCDI_STATE_RETRY && allow_retry)) in cdx_mcdi_start_or_queue()
553 cdx_mcdi_cmd_start_or_queue(mcdi, cmd); in cdx_mcdi_start_or_queue()
559 struct cdx_mcdi_cmd *cmd; in cdx_mcdi_process_cmd() local
575 cmd = mcdi->seq_held_by[respseq]; in cdx_mcdi_process_cmd()
577 if (cmd) { in cdx_mcdi_process_cmd()
578 if (cmd->state == MCDI_STATE_FINISHED) { in cdx_mcdi_process_cmd()
580 kref_put(&cmd->ref, cdx_mcdi_cmd_release); in cdx_mcdi_process_cmd()
584 cdx_mcdi_complete_cmd(mcdi, cmd, outbuf, len, &cleanup_list); in cdx_mcdi_process_cmd()
596 struct cdx_mcdi_cmd *cmd = in cdx_mcdi_cmd_work() local
598 struct cdx_mcdi_iface *mcdi = cmd->mcdi; in cdx_mcdi_cmd_work()
602 cmd->handle = mcdi->prev_handle++; in cdx_mcdi_cmd_work()
603 list_add_tail(&cmd->list, &mcdi->cmd_list); in cdx_mcdi_cmd_work()
604 cdx_mcdi_cmd_start_or_queue(mcdi, cmd); in cdx_mcdi_cmd_work()
615 struct cdx_mcdi_cmd *cmd, in cdx_mcdi_complete_cmd() argument
627 kref_get(&cmd->ref); in cdx_mcdi_complete_cmd()
662 if (!cmd->quiet) { in cdx_mcdi_complete_cmd()
671 _cdx_mcdi_display_error(cdx, cmd->cmd, in cdx_mcdi_complete_cmd()
672 cmd->inlen, rc, err_arg, in cdx_mcdi_complete_cmd()
682 if (mcdi->db_held_by == cmd) in cdx_mcdi_complete_cmd()
685 if (cdx_cmd_cancelled(cmd)) { in cdx_mcdi_complete_cmd()
686 list_del(&cmd->list); in cdx_mcdi_complete_cmd()
687 kref_put(&cmd->ref, cdx_mcdi_cmd_release); in cdx_mcdi_complete_cmd()
690 cmd->state = MCDI_STATE_RETRY; in cdx_mcdi_complete_cmd()
692 cmd->rc = rc; in cdx_mcdi_complete_cmd()
693 cmd->outbuf = outbuf + DIV_ROUND_UP(resp_hdr_len, 4); in cdx_mcdi_complete_cmd()
694 cmd->outlen = resp_data_len; in cdx_mcdi_complete_cmd()
695 cdx_mcdi_remove_cmd(mcdi, cmd, cleanup_list); in cdx_mcdi_complete_cmd()
700 mcdi->seq_held_by[cmd->seq] = NULL; in cdx_mcdi_complete_cmd()
707 kref_put(&cmd->ref, cdx_mcdi_cmd_release); in cdx_mcdi_complete_cmd()
713 struct cdx_mcdi_cmd *cmd, in cdx_mcdi_timeout_cmd() argument
719 cmd->cmd, cmd->inlen, cmd->state, in cdx_mcdi_timeout_cmd()
720 jiffies_to_msecs(jiffies - cmd->started)); in cdx_mcdi_timeout_cmd()
722 cmd->rc = -ETIMEDOUT; in cdx_mcdi_timeout_cmd()
723 cdx_mcdi_remove_cmd(mcdi, cmd, cleanup_list); in cdx_mcdi_timeout_cmd()
752 int cdx_mcdi_rpc(struct cdx_mcdi *cdx, unsigned int cmd, in cdx_mcdi_rpc() argument
757 return cdx_mcdi_rpc_sync(cdx, cmd, inbuf, inlen, outbuf, outlen, in cdx_mcdi_rpc()
780 cdx_mcdi_rpc_async(struct cdx_mcdi *cdx, unsigned int cmd, in cdx_mcdi_rpc_async() argument
794 cmd_item->cmd = cmd; in cdx_mcdi_rpc_async()
803 static void _cdx_mcdi_display_error(struct cdx_mcdi *cdx, unsigned int cmd, in _cdx_mcdi_display_error() argument
807 cmd, (int)inlen, err_no, raw, arg); in _cdx_mcdi_display_error()
825 struct cdx_mcdi_cmd *cmd; in cdx_mcdi_mode_fail() local
827 cmd = list_first_entry(&mcdi->cmd_list, struct cdx_mcdi_cmd, in cdx_mcdi_mode_fail()
829 _cdx_mcdi_cancel_cmd(mcdi, cdx_mcdi_cmd_handle(cmd), cleanup_list); in cdx_mcdi_mode_fail()