| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130 |
- // SPDX-License-Identifier: GPL-2.0
- /* Copyright (c) 2018, Intel Corporation. */
- #include "ice_common.h"
- #include "ice_adminq_cmd.h"
- /**
- * ice_debug_cq
- * @hw: pointer to the hardware structure
- * @mask: debug mask
- * @desc: pointer to control queue descriptor
- * @buf: pointer to command buffer
- * @buf_len: max length of buf
- *
- * Dumps debug log about control command with descriptor contents.
- */
- void ice_debug_cq(struct ice_hw *hw, u32 __maybe_unused mask, void *desc,
- void *buf, u16 buf_len)
- {
- struct ice_aq_desc *cq_desc = (struct ice_aq_desc *)desc;
- u16 len;
- #ifndef CONFIG_DYNAMIC_DEBUG
- if (!(mask & hw->debug_mask))
- return;
- #endif
- if (!desc)
- return;
- len = le16_to_cpu(cq_desc->datalen);
- ice_debug(hw, mask,
- "CQ CMD: opcode 0x%04X, flags 0x%04X, datalen 0x%04X, retval 0x%04X\n",
- le16_to_cpu(cq_desc->opcode),
- le16_to_cpu(cq_desc->flags),
- le16_to_cpu(cq_desc->datalen), le16_to_cpu(cq_desc->retval));
- ice_debug(hw, mask, "\tcookie (h,l) 0x%08X 0x%08X\n",
- le32_to_cpu(cq_desc->cookie_high),
- le32_to_cpu(cq_desc->cookie_low));
- ice_debug(hw, mask, "\tparam (0,1) 0x%08X 0x%08X\n",
- le32_to_cpu(cq_desc->params.generic.param0),
- le32_to_cpu(cq_desc->params.generic.param1));
- ice_debug(hw, mask, "\taddr (h,l) 0x%08X 0x%08X\n",
- le32_to_cpu(cq_desc->params.generic.addr_high),
- le32_to_cpu(cq_desc->params.generic.addr_low));
- if (buf && cq_desc->datalen != 0) {
- ice_debug(hw, mask, "Buffer:\n");
- if (buf_len < len)
- len = buf_len;
- ice_debug_array(hw, mask, 16, 1, (u8 *)buf, len);
- }
- }
- /* FW Admin Queue command wrappers */
- /**
- * ice_aq_send_cmd - send FW Admin Queue command to FW Admin Queue
- * @hw: pointer to the hw struct
- * @desc: descriptor describing the command
- * @buf: buffer to use for indirect commands (NULL for direct commands)
- * @buf_size: size of buffer for indirect commands (0 for direct commands)
- * @cd: pointer to command details structure
- *
- * Helper function to send FW Admin Queue commands to the FW Admin Queue.
- */
- enum ice_status
- ice_aq_send_cmd(struct ice_hw *hw, struct ice_aq_desc *desc, void *buf,
- u16 buf_size, struct ice_sq_cd *cd)
- {
- return ice_sq_send_cmd(hw, &hw->adminq, desc, buf, buf_size, cd);
- }
- /**
- * ice_aq_get_fw_ver
- * @hw: pointer to the hw struct
- * @cd: pointer to command details structure or NULL
- *
- * Get the firmware version (0x0001) from the admin queue commands
- */
- enum ice_status ice_aq_get_fw_ver(struct ice_hw *hw, struct ice_sq_cd *cd)
- {
- struct ice_aqc_get_ver *resp;
- struct ice_aq_desc desc;
- enum ice_status status;
- resp = &desc.params.get_ver;
- ice_fill_dflt_direct_cmd_desc(&desc, ice_aqc_opc_get_ver);
- status = ice_aq_send_cmd(hw, &desc, NULL, 0, cd);
- if (!status) {
- hw->fw_branch = resp->fw_branch;
- hw->fw_maj_ver = resp->fw_major;
- hw->fw_min_ver = resp->fw_minor;
- hw->fw_patch = resp->fw_patch;
- hw->fw_build = le32_to_cpu(resp->fw_build);
- hw->api_branch = resp->api_branch;
- hw->api_maj_ver = resp->api_major;
- hw->api_min_ver = resp->api_minor;
- hw->api_patch = resp->api_patch;
- }
- return status;
- }
- /**
- * ice_aq_q_shutdown
- * @hw: pointer to the hw struct
- * @unloading: is the driver unloading itself
- *
- * Tell the Firmware that we're shutting down the AdminQ and whether
- * or not the driver is unloading as well (0x0003).
- */
- enum ice_status ice_aq_q_shutdown(struct ice_hw *hw, bool unloading)
- {
- struct ice_aqc_q_shutdown *cmd;
- struct ice_aq_desc desc;
- cmd = &desc.params.q_shutdown;
- ice_fill_dflt_direct_cmd_desc(&desc, ice_aqc_opc_q_shutdown);
- if (unloading)
- cmd->driver_unloading = cpu_to_le32(ICE_AQC_DRIVER_UNLOADING);
- return ice_aq_send_cmd(hw, &desc, NULL, 0, NULL);
- }
|