]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
scsi: megaraid_sas: Return the DCMD status from megasas_get_seq_num
authorShivasharan S <shivasharan.srikanteshwara@broadcom.com>
Fri, 5 Jan 2018 13:27:38 +0000 (05:27 -0800)
committerJack Vogel <jack.vogel@oracle.com>
Thu, 8 Mar 2018 02:44:09 +0000 (18:44 -0800)
In megasas_get_seq_num, the status of the DCMD fired to FW is not
returned, it always returns success.  We could end up registering AEN
request with incorrect sequence number if the DCMD failed.  Return the
DCMD status back to caller.  This was discovered during code review and
very rare to see issue in field to see AEN request failed bt FW.

Signed-off-by: Shivasharan S <shivasharan.srikanteshwara@broadcom.com>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
Orabug: 27625001
Signed-off-by: Jack Vogel <jack.vogel@oracle.com>
Reviewed-by: Martin K. Petersen <martin.petersen@oracle.com>
drivers/scsi/megaraid/megaraid_sas_base.c

index b6ced51d5c7bd73ebc442cf679c23c19cba9a55a..c84946071eaa1e1f77b72766cd00aa845ac5ffb5 100644 (file)
@@ -5591,6 +5591,7 @@ megasas_get_seq_num(struct megasas_instance *instance,
        struct megasas_dcmd_frame *dcmd;
        struct megasas_evt_log_info *el_info;
        dma_addr_t el_info_h = 0;
+       int ret;
 
        cmd = megasas_get_cmd(instance);
 
@@ -5623,26 +5624,29 @@ megasas_get_seq_num(struct megasas_instance *instance,
        megasas_set_dma_settings(instance, dcmd, el_info_h,
                                 sizeof(struct megasas_evt_log_info));
 
-       if (megasas_issue_blocked_cmd(instance, cmd, MFI_IO_TIMEOUT_SECS) ==
-               DCMD_SUCCESS) {
-               /*
-                * Copy the data back into callers buffer
-                */
-               eli->newest_seq_num = el_info->newest_seq_num;
-               eli->oldest_seq_num = el_info->oldest_seq_num;
-               eli->clear_seq_num = el_info->clear_seq_num;
-               eli->shutdown_seq_num = el_info->shutdown_seq_num;
-               eli->boot_seq_num = el_info->boot_seq_num;
-       } else
-               dev_err(&instance->pdev->dev, "DCMD failed "
-                       "from %s\n", __func__);
+       ret = megasas_issue_blocked_cmd(instance, cmd, MFI_IO_TIMEOUT_SECS);
+       if (ret != DCMD_SUCCESS) {
+               dev_err(&instance->pdev->dev, "Failed from %s %d\n",
+                       __func__, __LINE__);
+               goto dcmd_failed;
+       }
+
+       /*
+        * Copy the data back into callers buffer
+        */
+       eli->newest_seq_num = el_info->newest_seq_num;
+       eli->oldest_seq_num = el_info->oldest_seq_num;
+       eli->clear_seq_num = el_info->clear_seq_num;
+       eli->shutdown_seq_num = el_info->shutdown_seq_num;
+       eli->boot_seq_num = el_info->boot_seq_num;
 
+dcmd_failed:
        pci_free_consistent(instance->pdev, sizeof(struct megasas_evt_log_info),
                            el_info, el_info_h);
 
        megasas_return_cmd(instance, cmd);
 
-       return 0;
+       return ret;
 }
 
 /**