scsi: lpfc: Add enablement of multiple adapter dumps
authorJames Smart <jsmart2021@gmail.com>
Tue, 5 Nov 2019 00:57:07 +0000 (16:57 -0800)
committerMartin K. Petersen <martin.petersen@oracle.com>
Wed, 6 Nov 2019 05:04:04 +0000 (00:04 -0500)
Some adapters support the ability to hold multiple adapter dumps on the
adapter flash. Some adapters default to enabling this feature while others
default to single-dump.

Make support uniform by enabling dual dump by default.

Link: https://lore.kernel.org/r/20191105005708.7399-11-jsmart2021@gmail.com
Signed-off-by: Dick Kennedy <dick.kennedy@broadcom.com>
Signed-off-by: James Smart <jsmart2021@gmail.com>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
drivers/scsi/lpfc/lpfc_hw4.h
drivers/scsi/lpfc/lpfc_sli.c

index 9daa2b4..25cdcbc 100644 (file)
@@ -3530,6 +3530,7 @@ struct lpfc_sli4_parameters {
 
 #define LPFC_SET_UE_RECOVERY           0x10
 #define LPFC_SET_MDS_DIAGS             0x11
+#define LPFC_SET_DUAL_DUMP             0x1e
 struct lpfc_mbx_set_feature {
        struct mbox_header header;
        uint32_t feature;
@@ -3544,6 +3545,15 @@ struct lpfc_mbx_set_feature {
 #define lpfc_mbx_set_feature_mds_deep_loopbk_SHIFT  1
 #define lpfc_mbx_set_feature_mds_deep_loopbk_MASK   0x00000001
 #define lpfc_mbx_set_feature_mds_deep_loopbk_WORD   word6
+#define lpfc_mbx_set_feature_dd_SHIFT          0
+#define lpfc_mbx_set_feature_dd_MASK           0x00000001
+#define lpfc_mbx_set_feature_dd_WORD           word6
+#define lpfc_mbx_set_feature_ddquery_SHIFT     1
+#define lpfc_mbx_set_feature_ddquery_MASK      0x00000001
+#define lpfc_mbx_set_feature_ddquery_WORD      word6
+#define LPFC_DISABLE_DUAL_DUMP         0
+#define LPFC_ENABLE_DUAL_DUMP          1
+#define LPFC_QUERY_OP_DUAL_DUMP                2
        uint32_t word7;
 #define lpfc_mbx_set_feature_UERP_SHIFT 0
 #define lpfc_mbx_set_feature_UERP_MASK  0x0000ffff
index f8de313..fad890c 100644 (file)
@@ -6203,6 +6203,14 @@ lpfc_set_features(struct lpfc_hba *phba, LPFC_MBOXQ_t *mbox,
                mbox->u.mqe.un.set_feature.feature = LPFC_SET_MDS_DIAGS;
                mbox->u.mqe.un.set_feature.param_len = 8;
                break;
+       case LPFC_SET_DUAL_DUMP:
+               bf_set(lpfc_mbx_set_feature_dd,
+                      &mbox->u.mqe.un.set_feature, LPFC_ENABLE_DUAL_DUMP);
+               bf_set(lpfc_mbx_set_feature_ddquery,
+                      &mbox->u.mqe.un.set_feature, 0);
+               mbox->u.mqe.un.set_feature.feature = LPFC_SET_DUAL_DUMP;
+               mbox->u.mqe.un.set_feature.param_len = 4;
+               break;
        }
 
        return;
@@ -7200,7 +7208,7 @@ lpfc_post_rq_buffer(struct lpfc_hba *phba, struct lpfc_queue *hrq,
 int
 lpfc_sli4_hba_setup(struct lpfc_hba *phba)
 {
-       int rc, i, cnt, len;
+       int rc, i, cnt, len, dd;
        LPFC_MBOXQ_t *mboxq;
        struct lpfc_mqe *mqe;
        uint8_t *vpd;
@@ -7451,6 +7459,23 @@ lpfc_sli4_hba_setup(struct lpfc_hba *phba)
        phba->sli3_options |= (LPFC_SLI3_NPIV_ENABLED | LPFC_SLI3_HBQ_ENABLED);
        spin_unlock_irq(&phba->hbalock);
 
+       /* Always try to enable dual dump feature if we can */
+       lpfc_set_features(phba, mboxq, LPFC_SET_DUAL_DUMP);
+       rc = lpfc_sli_issue_mbox(phba, mboxq, MBX_POLL);
+       dd = bf_get(lpfc_mbx_set_feature_dd, &mboxq->u.mqe.un.set_feature);
+       if ((rc == MBX_SUCCESS) && (dd == LPFC_ENABLE_DUAL_DUMP))
+               lpfc_printf_log(phba, KERN_ERR, LOG_SLI | LOG_INIT,
+                               "6448 Dual Dump is enabled\n");
+       else
+               lpfc_printf_log(phba, KERN_INFO, LOG_SLI | LOG_INIT,
+                               "6447 Dual Dump Mailbox x%x (x%x/x%x) failed, "
+                               "rc:x%x dd:x%x\n",
+                               bf_get(lpfc_mqe_command, &mboxq->u.mqe),
+                               lpfc_sli_config_mbox_subsys_get(
+                                       phba, mboxq),
+                               lpfc_sli_config_mbox_opcode_get(
+                                       phba, mboxq),
+                               rc, dd);
        /*
         * Allocate all resources (xri,rpi,vpi,vfi) now.  Subsequent
         * calls depends on these resources to complete port setup.