| /* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */ |
| /* |
| * Copyright (C) 2024-2025 Intel Corporation |
| */ |
| #ifndef __iwl_mld_hcmd_h__ |
| #define __iwl_mld_hcmd_h__ |
| |
| static inline int iwl_mld_send_cmd(struct iwl_mld *mld, struct iwl_host_cmd *cmd) |
| { |
| /* No commands, including the d3 related commands, should be sent |
| * after entering d3 |
| */ |
| #ifdef CONFIG_PM_SLEEP |
| if (WARN_ON(mld->fw_status.in_d3)) |
| return -EIO; |
| #endif |
| |
| if (!(cmd->flags & CMD_ASYNC)) |
| lockdep_assert_wiphy(mld->wiphy); |
| |
| /* Devices that need to shutdown immediately on rfkill are not |
| * supported, so we can send all the cmds in rfkill |
| */ |
| cmd->flags |= CMD_SEND_IN_RFKILL; |
| |
| return iwl_trans_send_cmd(mld->trans, cmd); |
| } |
| |
| static inline int |
| __iwl_mld_send_cmd_with_flags_pdu(struct iwl_mld *mld, u32 id, |
| u32 flags, const void *data, u16 len) |
| { |
| struct iwl_host_cmd cmd = { |
| .id = id, |
| .len = { data ? len : 0, }, |
| .data = { data, }, |
| .flags = flags, |
| }; |
| |
| return iwl_mld_send_cmd(mld, &cmd); |
| } |
| |
| #define _iwl_mld_send_cmd_with_flags_pdu(mld, id, flags, data, len, \ |
| ignored...) \ |
| __iwl_mld_send_cmd_with_flags_pdu(mld, id, flags, data, len) |
| #define iwl_mld_send_cmd_with_flags_pdu(mld, id, flags, data, len...) \ |
| _iwl_mld_send_cmd_with_flags_pdu(mld, id, flags, data, ##len, \ |
| sizeof(*(data))) |
| |
| #define iwl_mld_send_cmd_pdu(mld, id, ...) \ |
| iwl_mld_send_cmd_with_flags_pdu(mld, id, 0, __VA_ARGS__) |
| |
| #define iwl_mld_send_cmd_empty(mld, id) \ |
| iwl_mld_send_cmd_with_flags_pdu(mld, id, 0, NULL, 0) |
| |
| #endif /* __iwl_mld_hcmd_h__ */ |