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: Venkata Sudheer Kumar Bhavaraju <vbhavaraju@marvell.com> Signed-off-by: Alok Prasad <palok@marvell.com> Signed-off-by: Ariel Elior <aelior@marvell.com> Link: https://lore.kernel.org/r/20220131005235.1647881-1-vbhavaraju@marvell.com Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
parent
b43471cc10
commit
ef10bd49df
@ -614,12 +614,13 @@ static int qed_mcp_cmd_and_union(struct qed_hwfn *p_hwfn,
|
||||
usecs);
|
||||
}
|
||||
|
||||
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)
|
||||
static 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,
|
||||
bool can_sleep)
|
||||
{
|
||||
struct qed_mcp_mb_params mb_params;
|
||||
int rc;
|
||||
@ -627,6 +628,7 @@ int qed_mcp_cmd(struct qed_hwfn *p_hwfn,
|
||||
memset(&mb_params, 0, sizeof(mb_params));
|
||||
mb_params.cmd = cmd;
|
||||
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);
|
||||
if (rc)
|
||||
@ -638,6 +640,28 @@ int qed_mcp_cmd(struct qed_hwfn *p_hwfn,
|
||||
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
|
||||
qed_mcp_nvm_wr_cmd(struct qed_hwfn *p_hwfn,
|
||||
struct qed_ptt *p_ptt,
|
||||
@ -1728,8 +1752,8 @@ 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);
|
||||
|
||||
/* Acknowledge the MFW */
|
||||
qed_mcp_cmd(p_hwfn, p_ptt, DRV_MSG_CODE_BW_UPDATE_ACK, 0, &resp,
|
||||
¶m);
|
||||
qed_mcp_cmd_nosleep(p_hwfn, p_ptt, DRV_MSG_CODE_BW_UPDATE_ACK, 0, &resp,
|
||||
¶m);
|
||||
}
|
||||
|
||||
static void qed_mcp_update_stag(struct qed_hwfn *p_hwfn, struct qed_ptt *p_ptt)
|
||||
@ -1766,8 +1790,8 @@ 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);
|
||||
|
||||
/* Acknowledge the MFW */
|
||||
qed_mcp_cmd(p_hwfn, p_ptt, DRV_MSG_CODE_S_TAG_UPDATE_ACK, 0,
|
||||
&resp, ¶m);
|
||||
qed_mcp_cmd_nosleep(p_hwfn, p_ptt, DRV_MSG_CODE_S_TAG_UPDATE_ACK, 0,
|
||||
&resp, ¶m);
|
||||
}
|
||||
|
||||
static void qed_mcp_handle_fan_failure(struct qed_hwfn *p_hwfn,
|
||||
@ -3675,8 +3699,8 @@ static int qed_mcp_resource_cmd(struct qed_hwfn *p_hwfn,
|
||||
{
|
||||
int rc;
|
||||
|
||||
rc = qed_mcp_cmd(p_hwfn, p_ptt, DRV_MSG_CODE_RESOURCE_CMD, param,
|
||||
p_mcp_resp, p_mcp_param);
|
||||
rc = qed_mcp_cmd_nosleep(p_hwfn, p_ptt, DRV_MSG_CODE_RESOURCE_CMD,
|
||||
param, p_mcp_resp, p_mcp_param);
|
||||
if (rc)
|
||||
return rc;
|
||||
|
||||
|
@ -393,11 +393,12 @@ int qed_mcp_get_board_config(struct qed_hwfn *p_hwfn,
|
||||
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
|
||||
* operation, from sending the request until the MCP
|
||||
* 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_ptt: PTT required for register access.
|
||||
@ -416,6 +417,31 @@ int qed_mcp_cmd(struct qed_hwfn *p_hwfn,
|
||||
u32 *o_mcp_resp,
|
||||
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
|
||||
* case of pauses.
|
||||
|
Loading…
Reference in New Issue
Block a user