[SCSI] lpfc 8.3.32: Fix error reporting of misconfigured ports
authorJames Smart <james.smart@emulex.com>
Tue, 12 Jun 2012 17:55:07 +0000 (13:55 -0400)
committerJames Bottomley <JBottomley@Parallels.com>
Fri, 20 Jul 2012 07:58:30 +0000 (08:58 +0100)
Signed-off-by: Alex Iannicelli <alex.iannicelli@emulex.com>
Signed-off-by: James Smart <james.smart@emulex.com>
Signed-off-by: James Bottomley <JBottomley@Parallels.com>
drivers/scsi/lpfc/lpfc_hw4.h
drivers/scsi/lpfc/lpfc_init.c

index a631ebf..953603a 100644 (file)
@@ -3106,6 +3106,28 @@ struct lpfc_acqe_fc_la {
 #define LPFC_FC_LA_EVENT_TYPE_SHARED_LINK      0x2
 };
 
+struct lpfc_acqe_misconfigured_event {
+       struct {
+       uint32_t word0;
+#define lpfc_sli_misconfigured_port0_SHIFT     0
+#define lpfc_sli_misconfigured_port0_MASK      0x000000FF
+#define lpfc_sli_misconfigured_port0_WORD      word0
+#define lpfc_sli_misconfigured_port1_SHIFT     8
+#define lpfc_sli_misconfigured_port1_MASK      0x000000FF
+#define lpfc_sli_misconfigured_port1_WORD      word0
+#define lpfc_sli_misconfigured_port2_SHIFT     16
+#define lpfc_sli_misconfigured_port2_MASK      0x000000FF
+#define lpfc_sli_misconfigured_port2_WORD      word0
+#define lpfc_sli_misconfigured_port3_SHIFT     24
+#define lpfc_sli_misconfigured_port3_MASK      0x000000FF
+#define lpfc_sli_misconfigured_port3_WORD      word0
+       } theEvent;
+#define LPFC_SLI_EVENT_STATUS_VALID                    0x00
+#define LPFC_SLI_EVENT_STATUS_NOT_PRESENT      0x01
+#define LPFC_SLI_EVENT_STATUS_WRONG_TYPE       0x02
+#define LPFC_SLI_EVENT_STATUS_UNSUPPORTED      0x03
+};
+
 struct lpfc_acqe_sli {
        uint32_t event_data1;
        uint32_t event_data2;
@@ -3116,6 +3138,7 @@ struct lpfc_acqe_sli {
 #define LPFC_SLI_EVENT_TYPE_NORM_TEMP          0x3
 #define LPFC_SLI_EVENT_TYPE_NVLOG_POST         0x4
 #define LPFC_SLI_EVENT_TYPE_DIAG_DUMP          0x5
+#define LPFC_SLI_EVENT_TYPE_MISCONFIGURED      0x9
 };
 
 /*
index 374c102..45c1520 100644 (file)
@@ -3726,12 +3726,76 @@ out_free_pmb:
 static void
 lpfc_sli4_async_sli_evt(struct lpfc_hba *phba, struct lpfc_acqe_sli *acqe_sli)
 {
-       lpfc_printf_log(phba, KERN_INFO, LOG_SLI,
-                       "2901 Async SLI event - Event Data1:x%08x Event Data2:"
-                       "x%08x SLI Event Type:%d",
-                       acqe_sli->event_data1, acqe_sli->event_data2,
-                       bf_get(lpfc_trailer_type, acqe_sli));
-       return;
+       char port_name;
+       char message[80];
+       uint8_t status;
+       struct lpfc_acqe_misconfigured_event *misconfigured;
+
+       /* special case misconfigured event as it contains data for all ports */
+       if ((bf_get(lpfc_sli_intf_if_type, &phba->sli4_hba.sli_intf) !=
+                LPFC_SLI_INTF_IF_TYPE_2) ||
+               (bf_get(lpfc_trailer_type, acqe_sli) !=
+                       LPFC_SLI_EVENT_TYPE_MISCONFIGURED)) {
+               lpfc_printf_log(phba, KERN_INFO, LOG_SLI,
+                               "2901 Async SLI event - Event Data1:x%08x Event Data2:"
+                               "x%08x SLI Event Type:%d\n",
+                               acqe_sli->event_data1, acqe_sli->event_data2,
+                               bf_get(lpfc_trailer_type, acqe_sli));
+               return;
+       }
+
+       port_name = phba->Port[0];
+       if (port_name == 0x00)
+               port_name = '?'; /* get port name is empty */
+
+       misconfigured = (struct lpfc_acqe_misconfigured_event *)
+                                       &acqe_sli->event_data1;
+
+       /* fetch the status for this port */
+       switch (phba->sli4_hba.lnk_info.lnk_no) {
+       case LPFC_LINK_NUMBER_0:
+               status = bf_get(lpfc_sli_misconfigured_port0,
+                                       &misconfigured->theEvent);
+               break;
+       case LPFC_LINK_NUMBER_1:
+               status = bf_get(lpfc_sli_misconfigured_port1,
+                                       &misconfigured->theEvent);
+               break;
+       case LPFC_LINK_NUMBER_2:
+               status = bf_get(lpfc_sli_misconfigured_port2,
+                                       &misconfigured->theEvent);
+               break;
+       case LPFC_LINK_NUMBER_3:
+               status = bf_get(lpfc_sli_misconfigured_port3,
+                                       &misconfigured->theEvent);
+               break;
+       default:
+               status = ~LPFC_SLI_EVENT_STATUS_VALID;
+               break;
+       }
+
+       switch (status) {
+       case LPFC_SLI_EVENT_STATUS_VALID:
+               return; /* no message if the sfp is okay */
+       case LPFC_SLI_EVENT_STATUS_NOT_PRESENT:
+               sprintf(message, "Not installed");
+               break;
+       case LPFC_SLI_EVENT_STATUS_WRONG_TYPE:
+               sprintf(message,
+                       "Optics of two types installed");
+               break;
+       case LPFC_SLI_EVENT_STATUS_UNSUPPORTED:
+               sprintf(message, "Incompatible optics");
+               break;
+       default:
+               /* firmware is reporting a status we don't know about */
+               sprintf(message, "Unknown event status x%02x", status);
+               break;
+       }
+
+       lpfc_printf_log(phba, KERN_ERR, LOG_SLI,
+                       "3176 Misconfigured Physical Port - "
+                       "Port Name %c %s\n", port_name, message);
 }
 
 /**