mirror of
https://github.com/edk2-porting/linux-next.git
synced 2024-12-23 04:34:11 +08:00
be2net: move async cmd processing to a separate routine
For some FW cmds, the caller just issues the cmd and doesn't wait for a response. The response handling is done in the MCCQ compl processing context only. Move this code into a separate routine to make be_mcc_compl_process() more manageable. Signed-off-by: Sathya Perla <sathya.perla@emulex.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
4c60005fe7
commit
559b633f42
@ -132,6 +132,58 @@ static bool be_skip_err_log(u8 opcode, u16 base_status, u16 addl_status)
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Place holder for all the async MCC cmds wherein the caller is not in a busy
|
||||||
|
* loop (has not issued be_mcc_notify_wait())
|
||||||
|
*/
|
||||||
|
static void be_async_cmd_process(struct be_adapter *adapter,
|
||||||
|
struct be_mcc_compl *compl,
|
||||||
|
struct be_cmd_resp_hdr *resp_hdr)
|
||||||
|
{
|
||||||
|
enum mcc_base_status base_status = base_status(compl->status);
|
||||||
|
u8 opcode = 0, subsystem = 0;
|
||||||
|
|
||||||
|
if (resp_hdr) {
|
||||||
|
opcode = resp_hdr->opcode;
|
||||||
|
subsystem = resp_hdr->subsystem;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (opcode == OPCODE_LOWLEVEL_LOOPBACK_TEST &&
|
||||||
|
subsystem == CMD_SUBSYSTEM_LOWLEVEL) {
|
||||||
|
complete(&adapter->et_cmd_compl);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((opcode == OPCODE_COMMON_WRITE_FLASHROM ||
|
||||||
|
opcode == OPCODE_COMMON_WRITE_OBJECT) &&
|
||||||
|
subsystem == CMD_SUBSYSTEM_COMMON) {
|
||||||
|
adapter->flash_status = compl->status;
|
||||||
|
complete(&adapter->et_cmd_compl);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((opcode == OPCODE_ETH_GET_STATISTICS ||
|
||||||
|
opcode == OPCODE_ETH_GET_PPORT_STATS) &&
|
||||||
|
subsystem == CMD_SUBSYSTEM_ETH &&
|
||||||
|
base_status == MCC_STATUS_SUCCESS) {
|
||||||
|
be_parse_stats(adapter);
|
||||||
|
adapter->stats_cmd_sent = false;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (opcode == OPCODE_COMMON_GET_CNTL_ADDITIONAL_ATTRIBUTES &&
|
||||||
|
subsystem == CMD_SUBSYSTEM_COMMON) {
|
||||||
|
if (base_status == MCC_STATUS_SUCCESS) {
|
||||||
|
struct be_cmd_resp_get_cntl_addnl_attribs *resp =
|
||||||
|
(void *)resp_hdr;
|
||||||
|
adapter->drv_stats.be_on_die_temperature =
|
||||||
|
resp->on_die_temperature;
|
||||||
|
} else {
|
||||||
|
adapter->be_get_temp_freq = 0;
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static int be_mcc_compl_process(struct be_adapter *adapter,
|
static int be_mcc_compl_process(struct be_adapter *adapter,
|
||||||
struct be_mcc_compl *compl)
|
struct be_mcc_compl *compl)
|
||||||
{
|
{
|
||||||
@ -148,45 +200,15 @@ static int be_mcc_compl_process(struct be_adapter *adapter,
|
|||||||
addl_status = addl_status(compl->status);
|
addl_status = addl_status(compl->status);
|
||||||
|
|
||||||
resp_hdr = be_decode_resp_hdr(compl->tag0, compl->tag1);
|
resp_hdr = be_decode_resp_hdr(compl->tag0, compl->tag1);
|
||||||
|
|
||||||
if (resp_hdr) {
|
if (resp_hdr) {
|
||||||
opcode = resp_hdr->opcode;
|
opcode = resp_hdr->opcode;
|
||||||
subsystem = resp_hdr->subsystem;
|
subsystem = resp_hdr->subsystem;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (opcode == OPCODE_LOWLEVEL_LOOPBACK_TEST &&
|
be_async_cmd_process(adapter, compl, resp_hdr);
|
||||||
subsystem == CMD_SUBSYSTEM_LOWLEVEL) {
|
|
||||||
complete(&adapter->et_cmd_compl);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (((opcode == OPCODE_COMMON_WRITE_FLASHROM) ||
|
if (base_status != MCC_STATUS_SUCCESS &&
|
||||||
(opcode == OPCODE_COMMON_WRITE_OBJECT)) &&
|
!be_skip_err_log(opcode, base_status, addl_status)) {
|
||||||
(subsystem == CMD_SUBSYSTEM_COMMON)) {
|
|
||||||
adapter->flash_status = compl->status;
|
|
||||||
complete(&adapter->et_cmd_compl);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (base_status == MCC_STATUS_SUCCESS) {
|
|
||||||
if (((opcode == OPCODE_ETH_GET_STATISTICS) ||
|
|
||||||
(opcode == OPCODE_ETH_GET_PPORT_STATS)) &&
|
|
||||||
(subsystem == CMD_SUBSYSTEM_ETH)) {
|
|
||||||
be_parse_stats(adapter);
|
|
||||||
adapter->stats_cmd_sent = false;
|
|
||||||
}
|
|
||||||
if (opcode == OPCODE_COMMON_GET_CNTL_ADDITIONAL_ATTRIBUTES &&
|
|
||||||
subsystem == CMD_SUBSYSTEM_COMMON) {
|
|
||||||
struct be_cmd_resp_get_cntl_addnl_attribs *resp =
|
|
||||||
(void *)resp_hdr;
|
|
||||||
adapter->drv_stats.be_on_die_temperature =
|
|
||||||
resp->on_die_temperature;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if (opcode == OPCODE_COMMON_GET_CNTL_ADDITIONAL_ATTRIBUTES)
|
|
||||||
adapter->be_get_temp_freq = 0;
|
|
||||||
|
|
||||||
if (be_skip_err_log(opcode, base_status, addl_status))
|
|
||||||
return compl->status;
|
|
||||||
|
|
||||||
if (base_status == MCC_STATUS_UNAUTHORIZED_REQUEST) {
|
if (base_status == MCC_STATUS_UNAUTHORIZED_REQUEST) {
|
||||||
dev_warn(&adapter->pdev->dev,
|
dev_warn(&adapter->pdev->dev,
|
||||||
|
Loading…
Reference in New Issue
Block a user