Commit 448193b5 authored by James Smart's avatar James Smart Committed by Martin K. Petersen

lpfc: Add logging for misconfigured optics.

Add logging for misconfigured optics acqe reported by fw.
Signed-off-by: default avatarDick Kennedy <dick.kennedy@avagotech.com>
Signed-off-by: default avatarJames Smart <james.smart@avagotech.com>
Reviewed-by: default avatarHannes Reinicke <hare@suse.de>
Signed-off-by: default avatarMartin K. Petersen <martin.petersen@oracle.com>
parent 4360ca9c
...@@ -3448,23 +3448,50 @@ struct lpfc_acqe_fc_la { ...@@ -3448,23 +3448,50 @@ struct lpfc_acqe_fc_la {
struct lpfc_acqe_misconfigured_event { struct lpfc_acqe_misconfigured_event {
struct { struct {
uint32_t word0; uint32_t word0;
#define lpfc_sli_misconfigured_port0_SHIFT 0 #define lpfc_sli_misconfigured_port0_state_SHIFT 0
#define lpfc_sli_misconfigured_port0_MASK 0x000000FF #define lpfc_sli_misconfigured_port0_state_MASK 0x000000FF
#define lpfc_sli_misconfigured_port0_WORD word0 #define lpfc_sli_misconfigured_port0_state_WORD word0
#define lpfc_sli_misconfigured_port1_SHIFT 8 #define lpfc_sli_misconfigured_port1_state_SHIFT 8
#define lpfc_sli_misconfigured_port1_MASK 0x000000FF #define lpfc_sli_misconfigured_port1_state_MASK 0x000000FF
#define lpfc_sli_misconfigured_port1_WORD word0 #define lpfc_sli_misconfigured_port1_state_WORD word0
#define lpfc_sli_misconfigured_port2_SHIFT 16 #define lpfc_sli_misconfigured_port2_state_SHIFT 16
#define lpfc_sli_misconfigured_port2_MASK 0x000000FF #define lpfc_sli_misconfigured_port2_state_MASK 0x000000FF
#define lpfc_sli_misconfigured_port2_WORD word0 #define lpfc_sli_misconfigured_port2_state_WORD word0
#define lpfc_sli_misconfigured_port3_SHIFT 24 #define lpfc_sli_misconfigured_port3_state_SHIFT 24
#define lpfc_sli_misconfigured_port3_MASK 0x000000FF #define lpfc_sli_misconfigured_port3_state_MASK 0x000000FF
#define lpfc_sli_misconfigured_port3_WORD word0 #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; } theEvent;
#define LPFC_SLI_EVENT_STATUS_VALID 0x00 #define LPFC_SLI_EVENT_STATUS_VALID 0x00
#define LPFC_SLI_EVENT_STATUS_NOT_PRESENT 0x01 #define LPFC_SLI_EVENT_STATUS_NOT_PRESENT 0x01
#define LPFC_SLI_EVENT_STATUS_WRONG_TYPE 0x02 #define LPFC_SLI_EVENT_STATUS_WRONG_TYPE 0x02
#define LPFC_SLI_EVENT_STATUS_UNSUPPORTED 0x03 #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 { struct lpfc_acqe_sli {
......
...@@ -4079,22 +4079,18 @@ lpfc_sli4_async_sli_evt(struct lpfc_hba *phba, struct lpfc_acqe_sli *acqe_sli) ...@@ -4079,22 +4079,18 @@ lpfc_sli4_async_sli_evt(struct lpfc_hba *phba, struct lpfc_acqe_sli *acqe_sli)
char message[128]; char message[128];
uint8_t status; uint8_t status;
uint8_t evt_type; uint8_t evt_type;
uint8_t operational = 0;
struct temp_event temp_event_data; struct temp_event temp_event_data;
struct lpfc_acqe_misconfigured_event *misconfigured; struct lpfc_acqe_misconfigured_event *misconfigured;
struct Scsi_Host *shost; struct Scsi_Host *shost;
evt_type = bf_get(lpfc_trailer_type, acqe_sli); evt_type = bf_get(lpfc_trailer_type, acqe_sli);
/* Special case Lancer */ lpfc_printf_log(phba, KERN_INFO, LOG_SLI,
if (bf_get(lpfc_sli_intf_if_type, &phba->sli4_hba.sli_intf) != "2901 Async SLI event - Event Data1:x%08x Event Data2:"
LPFC_SLI_INTF_IF_TYPE_2) { "x%08x SLI Event Type:%d\n",
lpfc_printf_log(phba, KERN_INFO, LOG_SLI, acqe_sli->event_data1, acqe_sli->event_data2,
"2901 Async SLI event - Event Data1:x%08x Event Data2:" evt_type);
"x%08x SLI Event Type:%d\n",
acqe_sli->event_data1, acqe_sli->event_data2,
evt_type);
return;
}
port_name = phba->Port[0]; port_name = phba->Port[0];
if (port_name == 0x00) if (port_name == 0x00)
...@@ -4140,29 +4136,46 @@ lpfc_sli4_async_sli_evt(struct lpfc_hba *phba, struct lpfc_acqe_sli *acqe_sli) ...@@ -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 */ /* fetch the status for this port */
switch (phba->sli4_hba.lnk_info.lnk_no) { switch (phba->sli4_hba.lnk_info.lnk_no) {
case LPFC_LINK_NUMBER_0: 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); &misconfigured->theEvent);
break; break;
case LPFC_LINK_NUMBER_1: 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); &misconfigured->theEvent);
break; break;
case LPFC_LINK_NUMBER_2: 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); &misconfigured->theEvent);
break; break;
case LPFC_LINK_NUMBER_3: 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); &misconfigured->theEvent);
break; break;
default: default:
status = ~LPFC_SLI_EVENT_STATUS_VALID; lpfc_printf_log(phba, KERN_ERR, LOG_SLI,
break; "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) { switch (status) {
case LPFC_SLI_EVENT_STATUS_VALID: 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: case LPFC_SLI_EVENT_STATUS_NOT_PRESENT:
sprintf(message, "Optics faulted/incorrectly " sprintf(message, "Optics faulted/incorrectly "
"installed/not installed - Reseat optics, " "installed/not installed - Reseat optics, "
...@@ -4177,15 +4190,26 @@ lpfc_sli4_async_sli_evt(struct lpfc_hba *phba, struct lpfc_acqe_sli *acqe_sli) ...@@ -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 " sprintf(message, "Incompatible optics - Replace with "
"compatible optics for card to function."); "compatible optics for card to function.");
break; 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: default:
/* firmware is reporting a status we don't know about */ /* firmware is reporting a status we don't know about */
sprintf(message, "Unknown event status x%02x", status); sprintf(message, "Unknown event status x%02x", status);
break; break;
} }
phba->sli4_hba.lnk_info.optic_state = status;
lpfc_printf_log(phba, KERN_ERR, LOG_SLI, lpfc_printf_log(phba, KERN_ERR, LOG_SLI,
"3176 Misconfigured Physical Port - " "3176 Port Name %c %s\n", port_name, message);
"Port Name %c %s\n", port_name, message);
break; break;
case LPFC_SLI_EVENT_TYPE_REMOTE_DPORT: case LPFC_SLI_EVENT_TYPE_REMOTE_DPORT:
lpfc_printf_log(phba, KERN_INFO, LOG_SLI, lpfc_printf_log(phba, KERN_INFO, LOG_SLI,
...@@ -5259,6 +5283,9 @@ lpfc_sli4_driver_resource_setup(struct lpfc_hba *phba) ...@@ -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->sli4_hba.lpfc_vfi_blk_list);
INIT_LIST_HEAD(&phba->lpfc_vpi_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. */ /* Initialize the driver internal SLI layer lists. */
lpfc_sli_setup(phba); lpfc_sli_setup(phba);
lpfc_sli_queue_setup(phba); lpfc_sli_queue_setup(phba);
......
...@@ -442,6 +442,7 @@ struct lpfc_sli4_lnk_info { ...@@ -442,6 +442,7 @@ struct lpfc_sli4_lnk_info {
#define LPFC_LNK_GE 0x0 /* FCoE */ #define LPFC_LNK_GE 0x0 /* FCoE */
#define LPFC_LNK_FC 0x1 /* FC */ #define LPFC_LNK_FC 0x1 /* FC */
uint8_t lnk_no; uint8_t lnk_no;
uint8_t optic_state;
}; };
#define LPFC_SLI4_HANDLER_CNT (LPFC_FCP_IO_CHAN_MAX+ \ #define LPFC_SLI4_HANDLER_CNT (LPFC_FCP_IO_CHAN_MAX+ \
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment