diff mbox

[14/17] lpfc: Add logging for misconfigured optics.

Message ID 5671efc5.BjzS3MZMgzpO419g%james.smart@avagotech.com (mailing list archive)
State Accepted, archived
Headers show

Commit Message

James Smart Dec. 16, 2015, 11:12 p.m. UTC
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>
---
 drivers/scsi/lpfc/lpfc_hw4.h  | 51 ++++++++++++++++++++++++--------
 drivers/scsi/lpfc/lpfc_init.c | 67 ++++++++++++++++++++++++++++++-------------
 drivers/scsi/lpfc/lpfc_sli4.h |  1 +
 3 files changed, 87 insertions(+), 32 deletions(-)

Comments

Hannes Reinecke Dec. 17, 2015, 8:38 a.m. UTC | #1
On 12/17/2015 12:12 AM, James Smart wrote:
>
> 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>
> ---
>   drivers/scsi/lpfc/lpfc_hw4.h  | 51 ++++++++++++++++++++++++--------
>   drivers/scsi/lpfc/lpfc_init.c | 67 ++++++++++++++++++++++++++++++-------------
>   drivers/scsi/lpfc/lpfc_sli4.h |  1 +
>   3 files changed, 87 insertions(+), 32 deletions(-)
>
> diff --git a/drivers/scsi/lpfc/lpfc_hw4.h b/drivers/scsi/lpfc/lpfc_hw4.h
> index f13a76a..608f941 100644
> --- a/drivers/scsi/lpfc/lpfc_hw4.h
> +++ b/drivers/scsi/lpfc/lpfc_hw4.h
> @@ -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 {
> diff --git a/drivers/scsi/lpfc/lpfc_init.c b/drivers/scsi/lpfc/lpfc_init.c
> index fdf750e..b94d114 100644
> --- a/drivers/scsi/lpfc/lpfc_init.c
> +++ b/drivers/scsi/lpfc/lpfc_init.c
> @@ -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)
Why isn't this special cased anymore? Is it now supported by all HBAs?

> @@ -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,

Hmm. How does this pan out on older cards?
Does every card sending out this event support the optic 
misconfiguration detection? Or is there a chance that we lose the 
link just because the event isn't properly implemented and we detect 
it as non-operational?

Cheers,

Hannes
James Smart Dec. 17, 2015, 3:51 p.m. UTC | #2
On 12/17/2015 12:38 AM, Hannes Reinecke wrote:
> On 12/17/2015 12:12 AM, James Smart wrote:
>>
> Why isn't this special cased anymore? Is it now supported by all HBAs?


Yes - if and when/where an async event is generated by the adapter is in 
the fw. The special casing wasn't needed in the first place.


>
> Hmm. How does this pan out on older cards?
> Does every card sending out this event support the optic 
> misconfiguration detection? Or is there a chance that we lose the link 
> just because the event isn't properly implemented and we detect it as 
> non-operational?
>

Every card could - but whether it does is specific to the card and how 
it was built and the restrictions made on that card type. The adapter 
itself manages that. The event to the driver is solely for reporting.  
The driver can't influence optics behavior.

-- james s
--
To unsubscribe from this list: send the line "unsubscribe linux-scsi" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Hannes Reinecke Dec. 17, 2015, 4:03 p.m. UTC | #3
On Thursday, December 17, 2015 07:51:36 AM James Smart wrote:
> On 12/17/2015 12:38 AM, Hannes Reinecke wrote:
> > On 12/17/2015 12:12 AM, James Smart wrote:
> > 
> > Why isn't this special cased anymore? Is it now supported by all HBAs?
> 
> Yes - if and when/where an async event is generated by the adapter is in
> the fw. The special casing wasn't needed in the first place.
> 
> > Hmm. How does this pan out on older cards?
> > Does every card sending out this event support the optic
> > misconfiguration detection? Or is there a chance that we lose the link
> > just because the event isn't properly implemented and we detect it as
> > non-operational?
> 
> Every card could - but whether it does is specific to the card and how
> it was built and the restrictions made on that card type. The adapter
> itself manages that. The event to the driver is solely for reporting.
> The driver can't influence optics behavior.
> 
Okay, fair enough. Just wanted to clarify this.

Reviewed-by: Hannes Reinecke <hare@suse.com>

Cheers,

Hannes
diff mbox

Patch

diff --git a/drivers/scsi/lpfc/lpfc_hw4.h b/drivers/scsi/lpfc/lpfc_hw4.h
index f13a76a..608f941 100644
--- a/drivers/scsi/lpfc/lpfc_hw4.h
+++ b/drivers/scsi/lpfc/lpfc_hw4.h
@@ -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 {
diff --git a/drivers/scsi/lpfc/lpfc_init.c b/drivers/scsi/lpfc/lpfc_init.c
index fdf750e..b94d114 100644
--- a/drivers/scsi/lpfc/lpfc_init.c
+++ b/drivers/scsi/lpfc/lpfc_init.c
@@ -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);
diff --git a/drivers/scsi/lpfc/lpfc_sli4.h b/drivers/scsi/lpfc/lpfc_sli4.h
index 1e916e1..cd780c2 100644
--- a/drivers/scsi/lpfc/lpfc_sli4.h
+++ b/drivers/scsi/lpfc/lpfc_sli4.h
@@ -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+ \