be2net: move async cmd processing to a separate routine
authorSathya Perla <sathya.perla@emulex.com>
Fri, 30 May 2014 13:36:27 +0000 (19:06 +0530)
committerDavid S. Miller <davem@davemloft.net>
Sat, 31 May 2014 00:27:33 +0000 (17:27 -0700)
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>
drivers/net/ethernet/emulex/benet/be_cmds.c

index a2ecdffbb5174c77190db875630588b48affb125..0538c0b4abeb4264a5a27d0dc3d88248d39b2bec 100644 (file)
@@ -132,6 +132,58 @@ static bool be_skip_err_log(u8 opcode, u16 base_status, u16 addl_status)
                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,
                                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);
 
        resp_hdr = be_decode_resp_hdr(compl->tag0, compl->tag1);
-
        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 0;
-       }
-
-       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);
-       }
-
-       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;
+       be_async_cmd_process(adapter, compl, resp_hdr);
 
-               if (be_skip_err_log(opcode, base_status, addl_status))
-                       return compl->status;
+       if (base_status != MCC_STATUS_SUCCESS &&
+           !be_skip_err_log(opcode, base_status, addl_status)) {
 
                if (base_status == MCC_STATUS_UNAUTHORIZED_REQUEST) {
                        dev_warn(&adapter->pdev->dev,