mirror of https://gitee.com/openkylin/linux.git
131 lines
3.6 KiB
C
131 lines
3.6 KiB
C
|
// 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);
|
||
|
}
|