lpfc: Add logging for misconfigured optics.
authorJames Smart <james.smart@avagotech.com>
Wed, 16 Dec 2015 23:12:05 +0000 (18:12 -0500)
committerMartin K. Petersen <martin.petersen@oracle.com>
Tue, 22 Dec 2015 03:06:09 +0000 (22:06 -0500)
Add logging for misconfigured optics acqe reported by fw.

Signed-off-by: Dick Kennedy <dick.kennedy@avagotech.com>
Signed-off-by: James Smart <james.smart@avagotech.com>
Reviewed-by: Hannes Reinicke <hare@suse.de>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
drivers/scsi/lpfc/lpfc_hw4.h
drivers/scsi/lpfc/lpfc_init.c
drivers/scsi/lpfc/lpfc_sli4.h

index f13a76ad2c9c0b4dafd5340b7f33988b0614b9a6..608f9415fb08d9994754411d03d66d1a20273686 100644 (file)
@@ -3448,23 +3448,50 @@ struct lpfc_acqe_fc_la {
 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
+#define lpfc_sli_misconfigured_port0_state_SHIFT       0
+#define lpfc_sli_misconfigured_port0_state_MASK                0x000000FF
+#define lpfc_sli_misconfigured_port0_state_WORD                word0
+#define lpfc_sli_misconfigured_port1_state_SHIFT       8
+#define lpfc_sli_misconfigured_port1_state_MASK                0x000000FF
+#define lpfc_sli_misconfigured_port1_state_WORD                word0
+#define lpfc_sli_misconfigured_port2_state_SHIFT       16
+#define lpfc_sli_misconfigured_port2_state_MASK                0x000000FF
+#define lpfc_sli_misconfigured_port2_state_WORD                word0
+#define lpfc_sli_misconfigured_port3_state_SHIFT       24
+#define lpfc_sli_misconfigured_port3_state_MASK                0x000000FF
+#define lpfc_sli_misconfigured_port3_state_WORD                word0
+       uint32_t word1;
+#define lpfc_sli_misconfigured_port0_op_SHIFT          0
+#define lpfc_sli_misconfigured_port0_op_MASK           0x00000001
+#define lpfc_sli_misconfigured_port0_op_WORD           word1
+#define lpfc_sli_misconfigured_port0_severity_SHIFT    1
+#define lpfc_sli_misconfigured_port0_severity_MASK     0x00000003
+#define lpfc_sli_misconfigured_port0_severity_WORD     word1
+#define lpfc_sli_misconfigured_port1_op_SHIFT          8
+#define lpfc_sli_misconfigured_port1_op_MASK           0x00000001
+#define lpfc_sli_misconfigured_port1_op_WORD           word1
+#define lpfc_sli_misconfigured_port1_severity_SHIFT    9
+#define lpfc_sli_misconfigured_port1_severity_MASK     0x00000003
+#define lpfc_sli_misconfigured_port1_severity_WORD     word1
+#define lpfc_sli_misconfigured_port2_op_SHIFT          16
+#define lpfc_sli_misconfigured_port2_op_MASK           0x00000001
+#define lpfc_sli_misconfigured_port2_op_WORD           word1
+#define lpfc_sli_misconfigured_port2_severity_SHIFT    17
+#define lpfc_sli_misconfigured_port2_severity_MASK     0x00000003
+#define lpfc_sli_misconfigured_port2_severity_WORD     word1
+#define lpfc_sli_misconfigured_port3_op_SHIFT          24
+#define lpfc_sli_misconfigured_port3_op_MASK           0x00000001
+#define lpfc_sli_misconfigured_port3_op_WORD           word1
+#define lpfc_sli_misconfigured_port3_severity_SHIFT    25
+#define lpfc_sli_misconfigured_port3_severity_MASK     0x00000003
+#define lpfc_sli_misconfigured_port3_severity_WORD     word1
        } 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
+#define LPFC_SLI_EVENT_STATUS_UNQUALIFIED      0x04
+#define LPFC_SLI_EVENT_STATUS_UNCERTIFIED      0x05
 };
 
 struct lpfc_acqe_sli {
index 614f357dfb8afefd6d08d274bffd39907a0fdc72..a544366a367e3e079062ec5c7f17351db91ff395 100644 (file)
@@ -4079,22 +4079,18 @@ lpfc_sli4_async_sli_evt(struct lpfc_hba *phba, struct lpfc_acqe_sli *acqe_sli)
        char message[128];
        uint8_t status;
        uint8_t evt_type;
+       uint8_t operational = 0;
        struct temp_event temp_event_data;
        struct lpfc_acqe_misconfigured_event *misconfigured;
        struct Scsi_Host  *shost;
 
        evt_type = bf_get(lpfc_trailer_type, acqe_sli);
 
-       /* Special case Lancer */
-       if (bf_get(lpfc_sli_intf_if_type, &phba->sli4_hba.sli_intf) !=
-                LPFC_SLI_INTF_IF_TYPE_2) {
-               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,
-                               evt_type);
-               return;
-       }
+       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,
+                       evt_type);
 
        port_name = phba->Port[0];
        if (port_name == 0x00)
@@ -4140,29 +4136,46 @@ lpfc_sli4_async_sli_evt(struct lpfc_hba *phba, struct lpfc_acqe_sli *acqe_sli)
                /* 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,
+                       status = bf_get(lpfc_sli_misconfigured_port0_state,
+                                       &misconfigured->theEvent);
+                       operational = bf_get(lpfc_sli_misconfigured_port0_op,
                                        &misconfigured->theEvent);
                        break;
                case LPFC_LINK_NUMBER_1:
-                       status = bf_get(lpfc_sli_misconfigured_port1,
+                       status = bf_get(lpfc_sli_misconfigured_port1_state,
+                                       &misconfigured->theEvent);
+                       operational = bf_get(lpfc_sli_misconfigured_port1_op,
                                        &misconfigured->theEvent);
                        break;
                case LPFC_LINK_NUMBER_2:
-                       status = bf_get(lpfc_sli_misconfigured_port2,
+                       status = bf_get(lpfc_sli_misconfigured_port2_state,
+                                       &misconfigured->theEvent);
+                       operational = bf_get(lpfc_sli_misconfigured_port2_op,
                                        &misconfigured->theEvent);
                        break;
                case LPFC_LINK_NUMBER_3:
-                       status = bf_get(lpfc_sli_misconfigured_port3,
+                       status = bf_get(lpfc_sli_misconfigured_port3_state,
+                                       &misconfigured->theEvent);
+                       operational = bf_get(lpfc_sli_misconfigured_port3_op,
                                        &misconfigured->theEvent);
                        break;
                default:
-                       status = ~LPFC_SLI_EVENT_STATUS_VALID;
-                       break;
+                       lpfc_printf_log(phba, KERN_ERR, LOG_SLI,
+                                       "3296 "
+                                       "LPFC_SLI_EVENT_TYPE_MISCONFIGURED "
+                                       "event: Invalid link %d",
+                                       phba->sli4_hba.lnk_info.lnk_no);
+                       return;
                }
 
+               /* Skip if optic state unchanged */
+               if (phba->sli4_hba.lnk_info.optic_state == status)
+                       return;
+
                switch (status) {
                case LPFC_SLI_EVENT_STATUS_VALID:
-                       return; /* no message if the sfp is okay */
+                       sprintf(message, "Physical Link is functional");
+                       break;
                case LPFC_SLI_EVENT_STATUS_NOT_PRESENT:
                        sprintf(message, "Optics faulted/incorrectly "
                                "installed/not installed - Reseat optics, "
@@ -4177,15 +4190,26 @@ lpfc_sli4_async_sli_evt(struct lpfc_hba *phba, struct lpfc_acqe_sli *acqe_sli)
                        sprintf(message, "Incompatible optics - Replace with "
                                "compatible optics for card to function.");
                        break;
+               case LPFC_SLI_EVENT_STATUS_UNQUALIFIED:
+                       sprintf(message, "Unqualified optics - Replace with "
+                               "Avago optics for Warranty and Technical "
+                               "Support - Link is%s operational",
+                               (operational) ? "" : " not");
+                       break;
+               case LPFC_SLI_EVENT_STATUS_UNCERTIFIED:
+                       sprintf(message, "Uncertified optics - Replace with "
+                               "Avago-certified optics to enable link "
+                               "operation - Link is%s operational",
+                               (operational) ? "" : " not");
+                       break;
                default:
                        /* firmware is reporting a status we don't know about */
                        sprintf(message, "Unknown event status x%02x", status);
                        break;
                }
-
+               phba->sli4_hba.lnk_info.optic_state = status;
                lpfc_printf_log(phba, KERN_ERR, LOG_SLI,
-                               "3176 Misconfigured Physical Port - "
-                               "Port Name %c %s\n", port_name, message);
+                               "3176 Port Name %c %s\n", port_name, message);
                break;
        case LPFC_SLI_EVENT_TYPE_REMOTE_DPORT:
                lpfc_printf_log(phba, KERN_INFO, LOG_SLI,
@@ -5259,6 +5283,9 @@ lpfc_sli4_driver_resource_setup(struct lpfc_hba *phba)
        INIT_LIST_HEAD(&phba->sli4_hba.lpfc_vfi_blk_list);
        INIT_LIST_HEAD(&phba->lpfc_vpi_blk_list);
 
+       /* initialize optic_state to 0xFF */
+       phba->sli4_hba.lnk_info.optic_state = 0xff;
+
        /* Initialize the driver internal SLI layer lists. */
        lpfc_sli_setup(phba);
        lpfc_sli_queue_setup(phba);
index 1e916e16ce989beb47b4c3d13db70619407047aa..cd780c29495aa6eddedafa34367c315fa9813e84 100644 (file)
@@ -442,6 +442,7 @@ struct lpfc_sli4_lnk_info {
 #define LPFC_LNK_GE    0x0 /* FCoE */
 #define LPFC_LNK_FC    0x1 /* FC   */
        uint8_t lnk_no;
+       uint8_t optic_state;
 };
 
 #define LPFC_SLI4_HANDLER_CNT          (LPFC_FCP_IO_CHAN_MAX+ \