All of lore.kernel.org
 help / color / mirror / Atom feed
From: Hannes Reinecke <hare@suse.de>
To: James Smart <james.smart@avagotech.com>, linux-scsi@vger.kernel.org
Subject: Re: [PATCH 14/17] lpfc: Add logging for misconfigured optics.
Date: Thu, 17 Dec 2015 09:38:28 +0100	[thread overview]
Message-ID: <56727484.9070903@suse.de> (raw)
In-Reply-To: <5671efc5.BjzS3MZMgzpO419g%james.smart@avagotech.com>

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
-- 
Dr. Hannes Reinecke		               zSeries & Storage
hare@suse.de			               +49 911 74053 688
SUSE LINUX GmbH, Maxfeldstr. 5, 90409 Nürnberg
GF: F. Imendörffer, J. Smithard, J. Guild, D. Upmanyu, G. Norton
HRB 21284 (AG Nürnberg)
--
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

  reply	other threads:[~2015-12-17  8:38 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-12-16 23:12 [PATCH 14/17] lpfc: Add logging for misconfigured optics James Smart
2015-12-17  8:38 ` Hannes Reinecke [this message]
2015-12-17 15:51   ` James Smart
2015-12-17 16:03     ` Hannes Reinecke

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=56727484.9070903@suse.de \
    --to=hare@suse.de \
    --cc=james.smart@avagotech.com \
    --cc=linux-scsi@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.