Commit ef10bd49 authored by Venkata Sudheer Kumar Bhavaraju's avatar Venkata Sudheer Kumar Bhavaraju Committed by Jakub Kicinski

qed: use msleep() in qed_mcp_cmd() and add qed_mcp_cmd_nosleep() for udelay.

Change qed_mcp_cmd() to use msleep() (by setting QED_MB_FLAG_CAN_SLEEP
flag) and add new nosleep() version of the api. These api are used to
issue cmds to management fw and the change affects how driver
behaves while waiting for a response/resource.

All sleepable callers of the existing api now use msleep() version. For
non-sleepable callers, the new nosleep() version is explicitly used.
Signed-off-by: default avatarVenkata Sudheer Kumar Bhavaraju <vbhavaraju@marvell.com>
Signed-off-by: default avatarAlok Prasad <palok@marvell.com>
Signed-off-by: default avatarAriel Elior <aelior@marvell.com>
Link: https://lore.kernel.org/r/20220131005235.1647881-1-vbhavaraju@marvell.comSigned-off-by: default avatarJakub Kicinski <kuba@kernel.org>
parent b43471cc
...@@ -614,12 +614,13 @@ static int qed_mcp_cmd_and_union(struct qed_hwfn *p_hwfn, ...@@ -614,12 +614,13 @@ static int qed_mcp_cmd_and_union(struct qed_hwfn *p_hwfn,
usecs); usecs);
} }
int qed_mcp_cmd(struct qed_hwfn *p_hwfn, static int _qed_mcp_cmd(struct qed_hwfn *p_hwfn,
struct qed_ptt *p_ptt, struct qed_ptt *p_ptt,
u32 cmd, u32 cmd,
u32 param, u32 param,
u32 *o_mcp_resp, u32 *o_mcp_resp,
u32 *o_mcp_param) u32 *o_mcp_param,
bool can_sleep)
{ {
struct qed_mcp_mb_params mb_params; struct qed_mcp_mb_params mb_params;
int rc; int rc;
...@@ -627,6 +628,7 @@ int qed_mcp_cmd(struct qed_hwfn *p_hwfn, ...@@ -627,6 +628,7 @@ int qed_mcp_cmd(struct qed_hwfn *p_hwfn,
memset(&mb_params, 0, sizeof(mb_params)); memset(&mb_params, 0, sizeof(mb_params));
mb_params.cmd = cmd; mb_params.cmd = cmd;
mb_params.param = param; mb_params.param = param;
mb_params.flags = can_sleep ? QED_MB_FLAG_CAN_SLEEP : 0;
rc = qed_mcp_cmd_and_union(p_hwfn, p_ptt, &mb_params); rc = qed_mcp_cmd_and_union(p_hwfn, p_ptt, &mb_params);
if (rc) if (rc)
...@@ -638,6 +640,28 @@ int qed_mcp_cmd(struct qed_hwfn *p_hwfn, ...@@ -638,6 +640,28 @@ int qed_mcp_cmd(struct qed_hwfn *p_hwfn,
return 0; return 0;
} }
int qed_mcp_cmd(struct qed_hwfn *p_hwfn,
struct qed_ptt *p_ptt,
u32 cmd,
u32 param,
u32 *o_mcp_resp,
u32 *o_mcp_param)
{
return (_qed_mcp_cmd(p_hwfn, p_ptt, cmd, param,
o_mcp_resp, o_mcp_param, true));
}
int qed_mcp_cmd_nosleep(struct qed_hwfn *p_hwfn,
struct qed_ptt *p_ptt,
u32 cmd,
u32 param,
u32 *o_mcp_resp,
u32 *o_mcp_param)
{
return (_qed_mcp_cmd(p_hwfn, p_ptt, cmd, param,
o_mcp_resp, o_mcp_param, false));
}
static int static int
qed_mcp_nvm_wr_cmd(struct qed_hwfn *p_hwfn, qed_mcp_nvm_wr_cmd(struct qed_hwfn *p_hwfn,
struct qed_ptt *p_ptt, struct qed_ptt *p_ptt,
...@@ -1728,7 +1752,7 @@ static void qed_mcp_update_bw(struct qed_hwfn *p_hwfn, struct qed_ptt *p_ptt) ...@@ -1728,7 +1752,7 @@ static void qed_mcp_update_bw(struct qed_hwfn *p_hwfn, struct qed_ptt *p_ptt)
qed_configure_pf_max_bandwidth(p_hwfn->cdev, p_info->bandwidth_max); qed_configure_pf_max_bandwidth(p_hwfn->cdev, p_info->bandwidth_max);
/* Acknowledge the MFW */ /* Acknowledge the MFW */
qed_mcp_cmd(p_hwfn, p_ptt, DRV_MSG_CODE_BW_UPDATE_ACK, 0, &resp, qed_mcp_cmd_nosleep(p_hwfn, p_ptt, DRV_MSG_CODE_BW_UPDATE_ACK, 0, &resp,
&param); &param);
} }
...@@ -1766,7 +1790,7 @@ static void qed_mcp_update_stag(struct qed_hwfn *p_hwfn, struct qed_ptt *p_ptt) ...@@ -1766,7 +1790,7 @@ static void qed_mcp_update_stag(struct qed_hwfn *p_hwfn, struct qed_ptt *p_ptt)
p_hwfn->mcp_info->func_info.ovlan, p_hwfn->hw_info.hw_mode); p_hwfn->mcp_info->func_info.ovlan, p_hwfn->hw_info.hw_mode);
/* Acknowledge the MFW */ /* Acknowledge the MFW */
qed_mcp_cmd(p_hwfn, p_ptt, DRV_MSG_CODE_S_TAG_UPDATE_ACK, 0, qed_mcp_cmd_nosleep(p_hwfn, p_ptt, DRV_MSG_CODE_S_TAG_UPDATE_ACK, 0,
&resp, &param); &resp, &param);
} }
...@@ -3675,8 +3699,8 @@ static int qed_mcp_resource_cmd(struct qed_hwfn *p_hwfn, ...@@ -3675,8 +3699,8 @@ static int qed_mcp_resource_cmd(struct qed_hwfn *p_hwfn,
{ {
int rc; int rc;
rc = qed_mcp_cmd(p_hwfn, p_ptt, DRV_MSG_CODE_RESOURCE_CMD, param, rc = qed_mcp_cmd_nosleep(p_hwfn, p_ptt, DRV_MSG_CODE_RESOURCE_CMD,
p_mcp_resp, p_mcp_param); param, p_mcp_resp, p_mcp_param);
if (rc) if (rc)
return rc; return rc;
......
...@@ -393,11 +393,12 @@ int qed_mcp_get_board_config(struct qed_hwfn *p_hwfn, ...@@ -393,11 +393,12 @@ int qed_mcp_get_board_config(struct qed_hwfn *p_hwfn,
struct qed_ptt *p_ptt, u32 *p_board_config); struct qed_ptt *p_ptt, u32 *p_board_config);
/** /**
* qed_mcp_cmd(): General function for sending commands to the MCP * qed_mcp_cmd(): Sleepable function for sending commands to the MCP
* mailbox. It acquire mutex lock for the entire * mailbox. It acquire mutex lock for the entire
* operation, from sending the request until the MCP * operation, from sending the request until the MCP
* response. Waiting for MCP response will be checked up * response. Waiting for MCP response will be checked up
* to 5 seconds every 5ms. * to 5 seconds every 10ms. Should not be called from atomic
* context.
* *
* @p_hwfn: HW device data. * @p_hwfn: HW device data.
* @p_ptt: PTT required for register access. * @p_ptt: PTT required for register access.
...@@ -416,6 +417,31 @@ int qed_mcp_cmd(struct qed_hwfn *p_hwfn, ...@@ -416,6 +417,31 @@ int qed_mcp_cmd(struct qed_hwfn *p_hwfn,
u32 *o_mcp_resp, u32 *o_mcp_resp,
u32 *o_mcp_param); u32 *o_mcp_param);
/**
* qed_mcp_cmd_nosleep(): Function for sending commands to the MCP
* mailbox. It acquire mutex lock for the entire
* operation, from sending the request until the MCP
* response. Waiting for MCP response will be checked up
* to 5 seconds every 10us. Should be called when sleep
* is not allowed.
*
* @p_hwfn: HW device data.
* @p_ptt: PTT required for register access.
* @cmd: command to be sent to the MCP.
* @param: Optional param
* @o_mcp_resp: The MCP response code (exclude sequence).
* @o_mcp_param: Optional parameter provided by the MCP
* response
*
* Return: Int - 0 - Operation was successul.
*/
int qed_mcp_cmd_nosleep(struct qed_hwfn *p_hwfn,
struct qed_ptt *p_ptt,
u32 cmd,
u32 param,
u32 *o_mcp_resp,
u32 *o_mcp_param);
/** /**
* qed_mcp_drain(): drains the nig, allowing completion to pass in * qed_mcp_drain(): drains the nig, allowing completion to pass in
* case of pauses. * case of pauses.
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment