Commit 70f3c073 authored by James Smart's avatar James Smart Committed by James Bottomley
Browse files

[SCSI] lpfc 8.3.20: Implement the FC and SLI async event handlers



Implement the FC and SLI async event handlers:

- Updated MQ_CREATE_EXT mailbox structure to include fc and SLI async events.
- Added the SLI trailer code.
- Split physical field into type and number to reflect latest SLI spec.
- Changed lpfc_acqe_fcoe to lpfc_acqe_fip to reflect latest Spec changes.
- Added lpfc_acqe_fc_la structure for FC link attention async events.
- Added lpfc_acqe_sli structure for sli async events.
- Added lpfc_sli4_async_fc_evt routine to handle fc la async events.
- Added lpfc_sli4_async_sli routine to handle sli async events.
- Moved LPFC_TRAILER_CODE_FC to be handled by its own handler function.

Signed-off-by: default avatarAlex Iannicelli <alex.iannicelli@emulex.com>
Signed-off-by: default avatarJames Smart <james.smart@emulex.com>
Signed-off-by: default avatarJames Bottomley <James.Bottomley@suse.de>
parent be858b65
Loading
Loading
Loading
Loading
+102 −27
Original line number Original line Diff line number Diff line
@@ -1134,12 +1134,18 @@ struct lpfc_mbx_mq_create_ext {
#define lpfc_mbx_mq_create_ext_async_evt_link_SHIFT	LPFC_TRAILER_CODE_LINK
#define lpfc_mbx_mq_create_ext_async_evt_link_SHIFT	LPFC_TRAILER_CODE_LINK
#define lpfc_mbx_mq_create_ext_async_evt_link_MASK	0x00000001
#define lpfc_mbx_mq_create_ext_async_evt_link_MASK	0x00000001
#define lpfc_mbx_mq_create_ext_async_evt_link_WORD	async_evt_bmap
#define lpfc_mbx_mq_create_ext_async_evt_link_WORD	async_evt_bmap
#define lpfc_mbx_mq_create_ext_async_evt_fcfste_SHIFT	LPFC_TRAILER_CODE_FCOE
#define lpfc_mbx_mq_create_ext_async_evt_fip_SHIFT	LPFC_TRAILER_CODE_FCOE
#define lpfc_mbx_mq_create_ext_async_evt_fcfste_MASK	0x00000001
#define lpfc_mbx_mq_create_ext_async_evt_fip_MASK	0x00000001
#define lpfc_mbx_mq_create_ext_async_evt_fcfste_WORD	async_evt_bmap
#define lpfc_mbx_mq_create_ext_async_evt_fip_WORD	async_evt_bmap
#define lpfc_mbx_mq_create_ext_async_evt_group5_SHIFT	LPFC_TRAILER_CODE_GRP5
#define lpfc_mbx_mq_create_ext_async_evt_group5_SHIFT	LPFC_TRAILER_CODE_GRP5
#define lpfc_mbx_mq_create_ext_async_evt_group5_MASK	0x00000001
#define lpfc_mbx_mq_create_ext_async_evt_group5_MASK	0x00000001
#define lpfc_mbx_mq_create_ext_async_evt_group5_WORD	async_evt_bmap
#define lpfc_mbx_mq_create_ext_async_evt_group5_WORD	async_evt_bmap
#define lpfc_mbx_mq_create_ext_async_evt_fc_SHIFT	LPFC_TRAILER_CODE_FC
#define lpfc_mbx_mq_create_ext_async_evt_fc_MASK	0x00000001
#define lpfc_mbx_mq_create_ext_async_evt_fc_WORD	async_evt_bmap
#define lpfc_mbx_mq_create_ext_async_evt_sli_SHIFT	LPFC_TRAILER_CODE_SLI
#define lpfc_mbx_mq_create_ext_async_evt_sli_MASK	0x00000001
#define lpfc_mbx_mq_create_ext_async_evt_sli_WORD	async_evt_bmap
			struct mq_context context;
			struct mq_context context;
			struct dma_address page[LPFC_MAX_MQ_PAGE];
			struct dma_address page[LPFC_MAX_MQ_PAGE];
		} request;
		} request;
@@ -1393,7 +1399,7 @@ struct lpfc_mbx_query_fw_cfg {
#define lpfc_function_mode_dal_WORD		function_mode
#define lpfc_function_mode_dal_WORD		function_mode
#define lpfc_function_mode_lro_SHIFT		9
#define lpfc_function_mode_lro_SHIFT		9
#define lpfc_function_mode_lro_MASK		0x00000001
#define lpfc_function_mode_lro_MASK		0x00000001
#define lpfc_function_mode_lro_WORD		function_mode9
#define lpfc_function_mode_lro_WORD		function_mode
#define lpfc_function_mode_flex10_SHIFT		10
#define lpfc_function_mode_flex10_SHIFT		10
#define lpfc_function_mode_flex10_MASK		0x00000001
#define lpfc_function_mode_flex10_MASK		0x00000001
#define lpfc_function_mode_flex10_WORD		function_mode
#define lpfc_function_mode_flex10_WORD		function_mode
@@ -2162,6 +2168,7 @@ struct lpfc_mcqe {
#define LPFC_TRAILER_CODE_DCBX	0x3
#define LPFC_TRAILER_CODE_DCBX	0x3
#define LPFC_TRAILER_CODE_GRP5	0x5
#define LPFC_TRAILER_CODE_GRP5	0x5
#define LPFC_TRAILER_CODE_FC	0x10
#define LPFC_TRAILER_CODE_FC	0x10
#define LPFC_TRAILER_CODE_SLI	0x11
};
};


struct lpfc_acqe_link {
struct lpfc_acqe_link {
@@ -2187,11 +2194,12 @@ struct lpfc_acqe_link {
#define LPFC_ASYNC_LINK_STATUS_UP		0x1
#define LPFC_ASYNC_LINK_STATUS_UP		0x1
#define LPFC_ASYNC_LINK_STATUS_LOGICAL_DOWN	0x2
#define LPFC_ASYNC_LINK_STATUS_LOGICAL_DOWN	0x2
#define LPFC_ASYNC_LINK_STATUS_LOGICAL_UP	0x3
#define LPFC_ASYNC_LINK_STATUS_LOGICAL_UP	0x3
#define lpfc_acqe_link_physical_SHIFT		0
#define lpfc_acqe_link_type_SHIFT		6
#define lpfc_acqe_link_physical_MASK		0x000000FF
#define lpfc_acqe_link_type_MASK		0x00000003
#define lpfc_acqe_link_physical_WORD		word0
#define lpfc_acqe_link_type_WORD		word0
#define LPFC_ASYNC_LINK_PORT_A			0x0
#define lpfc_acqe_link_number_SHIFT		0
#define LPFC_ASYNC_LINK_PORT_B			0x1
#define lpfc_acqe_link_number_MASK		0x0000003F
#define lpfc_acqe_link_number_WORD		word0
	uint32_t word1;
	uint32_t word1;
#define lpfc_acqe_link_fault_SHIFT	0
#define lpfc_acqe_link_fault_SHIFT	0
#define lpfc_acqe_link_fault_MASK	0x000000FF
#define lpfc_acqe_link_fault_MASK	0x000000FF
@@ -2199,29 +2207,31 @@ struct lpfc_acqe_link {
#define LPFC_ASYNC_LINK_FAULT_NONE	0x0
#define LPFC_ASYNC_LINK_FAULT_NONE	0x0
#define LPFC_ASYNC_LINK_FAULT_LOCAL	0x1
#define LPFC_ASYNC_LINK_FAULT_LOCAL	0x1
#define LPFC_ASYNC_LINK_FAULT_REMOTE	0x2
#define LPFC_ASYNC_LINK_FAULT_REMOTE	0x2
#define lpfc_acqe_qos_link_speed_SHIFT	16
#define lpfc_acqe_logical_link_speed_SHIFT	16
#define lpfc_acqe_qos_link_speed_MASK	0x0000FFFF
#define lpfc_acqe_logical_link_speed_MASK	0x0000FFFF
#define lpfc_acqe_qos_link_speed_WORD	word1
#define lpfc_acqe_logical_link_speed_WORD	word1
	uint32_t event_tag;
	uint32_t event_tag;
	uint32_t trailer;
	uint32_t trailer;
#define LPFC_LINK_EVENT_TYPE_PHYSICAL	0x0
#define LPFC_LINK_EVENT_TYPE_VIRTUAL	0x1
};
};


struct lpfc_acqe_fcoe {
struct lpfc_acqe_fip {
	uint32_t index;
	uint32_t index;
	uint32_t word1;
	uint32_t word1;
#define lpfc_acqe_fcoe_fcf_count_SHIFT		0
#define lpfc_acqe_fip_fcf_count_SHIFT		0
#define lpfc_acqe_fcoe_fcf_count_MASK		0x0000FFFF
#define lpfc_acqe_fip_fcf_count_MASK		0x0000FFFF
#define lpfc_acqe_fcoe_fcf_count_WORD		word1
#define lpfc_acqe_fip_fcf_count_WORD		word1
#define lpfc_acqe_fcoe_event_type_SHIFT		16
#define lpfc_acqe_fip_event_type_SHIFT		16
#define lpfc_acqe_fcoe_event_type_MASK		0x0000FFFF
#define lpfc_acqe_fip_event_type_MASK		0x0000FFFF
#define lpfc_acqe_fcoe_event_type_WORD		word1
#define lpfc_acqe_fip_event_type_WORD		word1
#define LPFC_FCOE_EVENT_TYPE_NEW_FCF		0x1
#define LPFC_FCOE_EVENT_TYPE_FCF_TABLE_FULL	0x2
#define LPFC_FCOE_EVENT_TYPE_FCF_DEAD		0x3
#define LPFC_FCOE_EVENT_TYPE_CVL		0x4
#define LPFC_FCOE_EVENT_TYPE_FCF_PARAM_MOD	0x5
	uint32_t event_tag;
	uint32_t event_tag;
	uint32_t trailer;
	uint32_t trailer;
#define LPFC_FIP_EVENT_TYPE_NEW_FCF		0x1
#define LPFC_FIP_EVENT_TYPE_FCF_TABLE_FULL	0x2
#define LPFC_FIP_EVENT_TYPE_FCF_DEAD		0x3
#define LPFC_FIP_EVENT_TYPE_CVL			0x4
#define LPFC_FIP_EVENT_TYPE_FCF_PARAM_MOD	0x5
};
};


struct lpfc_acqe_dcbx {
struct lpfc_acqe_dcbx {
@@ -2233,9 +2243,12 @@ struct lpfc_acqe_dcbx {


struct lpfc_acqe_grp5 {
struct lpfc_acqe_grp5 {
	uint32_t word0;
	uint32_t word0;
#define lpfc_acqe_grp5_pport_SHIFT	0
#define lpfc_acqe_grp5_type_SHIFT		6
#define lpfc_acqe_grp5_pport_MASK	0x000000FF
#define lpfc_acqe_grp5_type_MASK		0x00000003
#define lpfc_acqe_grp5_pport_WORD	word0
#define lpfc_acqe_grp5_type_WORD		word0
#define lpfc_acqe_grp5_number_SHIFT		0
#define lpfc_acqe_grp5_number_MASK		0x0000003F
#define lpfc_acqe_grp5_number_WORD		word0
	uint32_t word1;
	uint32_t word1;
#define lpfc_acqe_grp5_llink_spd_SHIFT	16
#define lpfc_acqe_grp5_llink_spd_SHIFT	16
#define lpfc_acqe_grp5_llink_spd_MASK	0x0000FFFF
#define lpfc_acqe_grp5_llink_spd_MASK	0x0000FFFF
@@ -2244,6 +2257,68 @@ struct lpfc_acqe_grp5 {
	uint32_t trailer;
	uint32_t trailer;
};
};


struct lpfc_acqe_fc_la {
	uint32_t word0;
#define lpfc_acqe_fc_la_speed_SHIFT		24
#define lpfc_acqe_fc_la_speed_MASK		0x000000FF
#define lpfc_acqe_fc_la_speed_WORD		word0
#define LPFC_FC_LA_SPEED_UNKOWN		0x0
#define LPFC_FC_LA_SPEED_1G		0x1
#define LPFC_FC_LA_SPEED_2G		0x2
#define LPFC_FC_LA_SPEED_4G		0x4
#define LPFC_FC_LA_SPEED_8G		0x8
#define LPFC_FC_LA_SPEED_10G		0xA
#define LPFC_FC_LA_SPEED_16G		0x10
#define lpfc_acqe_fc_la_topology_SHIFT		16
#define lpfc_acqe_fc_la_topology_MASK		0x000000FF
#define lpfc_acqe_fc_la_topology_WORD		word0
#define LPFC_FC_LA_TOP_UNKOWN		0x0
#define LPFC_FC_LA_TOP_P2P		0x1
#define LPFC_FC_LA_TOP_FCAL		0x2
#define LPFC_FC_LA_TOP_INTERNAL_LOOP	0x3
#define LPFC_FC_LA_TOP_SERDES_LOOP	0x4
#define lpfc_acqe_fc_la_att_type_SHIFT		8
#define lpfc_acqe_fc_la_att_type_MASK		0x000000FF
#define lpfc_acqe_fc_la_att_type_WORD		word0
#define LPFC_FC_LA_TYPE_LINK_UP		0x1
#define LPFC_FC_LA_TYPE_LINK_DOWN	0x2
#define LPFC_FC_LA_TYPE_NO_HARD_ALPA	0x3
#define lpfc_acqe_fc_la_port_type_SHIFT		6
#define lpfc_acqe_fc_la_port_type_MASK		0x00000003
#define lpfc_acqe_fc_la_port_type_WORD		word0
#define LPFC_LINK_TYPE_ETHERNET		0x0
#define LPFC_LINK_TYPE_FC		0x1
#define lpfc_acqe_fc_la_port_number_SHIFT	0
#define lpfc_acqe_fc_la_port_number_MASK	0x0000003F
#define lpfc_acqe_fc_la_port_number_WORD	word0
	uint32_t word1;
#define lpfc_acqe_fc_la_llink_spd_SHIFT		16
#define lpfc_acqe_fc_la_llink_spd_MASK		0x0000FFFF
#define lpfc_acqe_fc_la_llink_spd_WORD		word1
#define lpfc_acqe_fc_la_fault_SHIFT		0
#define lpfc_acqe_fc_la_fault_MASK		0x000000FF
#define lpfc_acqe_fc_la_fault_WORD		word1
#define LPFC_FC_LA_FAULT_NONE		0x0
#define LPFC_FC_LA_FAULT_LOCAL		0x1
#define LPFC_FC_LA_FAULT_REMOTE		0x2
	uint32_t event_tag;
	uint32_t trailer;
#define LPFC_FC_LA_EVENT_TYPE_FC_LINK		0x1
#define LPFC_FC_LA_EVENT_TYPE_SHARED_LINK	0x2
};

struct lpfc_acqe_sli {
	uint32_t event_data1;
	uint32_t event_data2;
	uint32_t reserved;
	uint32_t trailer;
#define LPFC_SLI_EVENT_TYPE_PORT_ERROR		0x1
#define LPFC_SLI_EVENT_TYPE_OVER_TEMP		0x2
#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 the bootstrap mailbox (bmbx) region used to communicate
 * Define the bootstrap mailbox (bmbx) region used to communicate
 * mailbox command between the host and port. The mailbox consists
 * mailbox command between the host and port. The mailbox consists
+164 −35
Original line number Original line Diff line number Diff line
@@ -3149,11 +3149,11 @@ lpfc_sli4_parse_latt_link_speed(struct lpfc_hba *phba,
}
}


/**
/**
 * lpfc_sli4_async_link_evt - Process the asynchronous FC or FCoE link event
 * lpfc_sli4_async_link_evt - Process the asynchronous FCoE link event
 * @phba: pointer to lpfc hba data structure.
 * @phba: pointer to lpfc hba data structure.
 * @acqe_link: pointer to the async link completion queue entry.
 * @acqe_link: pointer to the async link completion queue entry.
 *
 *
 * This routine is to handle the SLI4 asynchronous link event.
 * This routine is to handle the SLI4 asynchronous FCoE link event.
 **/
 **/
static void
static void
lpfc_sli4_async_link_evt(struct lpfc_hba *phba,
lpfc_sli4_async_link_evt(struct lpfc_hba *phba,
@@ -3210,12 +3210,25 @@ lpfc_sli4_async_link_evt(struct lpfc_hba *phba,
				bf_get(lpfc_acqe_link_duplex, acqe_link);
				bf_get(lpfc_acqe_link_duplex, acqe_link);
	phba->sli4_hba.link_state.status =
	phba->sli4_hba.link_state.status =
				bf_get(lpfc_acqe_link_status, acqe_link);
				bf_get(lpfc_acqe_link_status, acqe_link);
	phba->sli4_hba.link_state.physical =
	phba->sli4_hba.link_state.type =
				bf_get(lpfc_acqe_link_physical, acqe_link);
				bf_get(lpfc_acqe_link_type, acqe_link);
	phba->sli4_hba.link_state.number =
				bf_get(lpfc_acqe_link_number, acqe_link);
	phba->sli4_hba.link_state.fault =
	phba->sli4_hba.link_state.fault =
				bf_get(lpfc_acqe_link_fault, acqe_link);
				bf_get(lpfc_acqe_link_fault, acqe_link);
	phba->sli4_hba.link_state.logical_speed =
	phba->sli4_hba.link_state.logical_speed =
				bf_get(lpfc_acqe_qos_link_speed, acqe_link);
			bf_get(lpfc_acqe_logical_link_speed, acqe_link);
	lpfc_printf_log(phba, KERN_INFO, LOG_SLI,
			"2900 Async FCoE Link event - Speed:%dGBit duplex:x%x "
			"LA Type:x%x Port Type:%d Port Number:%d Logical "
			"speed:%dMbps Fault:%d\n",
			phba->sli4_hba.link_state.speed,
			phba->sli4_hba.link_state.topology,
			phba->sli4_hba.link_state.status,
			phba->sli4_hba.link_state.type,
			phba->sli4_hba.link_state.number,
			phba->sli4_hba.link_state.logical_speed * 10,
			phba->sli4_hba.link_state.fault);
	/*
	/*
	 * For FC Mode: issue the READ_TOPOLOGY mailbox command to fetch
	 * For FC Mode: issue the READ_TOPOLOGY mailbox command to fetch
	 * topology info. Note: Optional for non FC-AL ports.
	 * topology info. Note: Optional for non FC-AL ports.
@@ -3261,6 +3274,118 @@ out_free_pmb:
	mempool_free(pmb, phba->mbox_mem_pool);
	mempool_free(pmb, phba->mbox_mem_pool);
}
}


/**
 * lpfc_sli4_async_fc_evt - Process the asynchronous FC link event
 * @phba: pointer to lpfc hba data structure.
 * @acqe_fc: pointer to the async fc completion queue entry.
 *
 * This routine is to handle the SLI4 asynchronous FC event. It will simply log
 * that the event was received and then issue a read_topology mailbox command so
 * that the rest of the driver will treat it the same as SLI3.
 **/
static void
lpfc_sli4_async_fc_evt(struct lpfc_hba *phba, struct lpfc_acqe_fc_la *acqe_fc)
{
	struct lpfc_dmabuf *mp;
	LPFC_MBOXQ_t *pmb;
	int rc;

	if (bf_get(lpfc_trailer_type, acqe_fc) !=
	    LPFC_FC_LA_EVENT_TYPE_FC_LINK) {
		lpfc_printf_log(phba, KERN_ERR, LOG_SLI,
				"2895 Non FC link Event detected.(%d)\n",
				bf_get(lpfc_trailer_type, acqe_fc));
		return;
	}
	/* Keep the link status for extra SLI4 state machine reference */
	phba->sli4_hba.link_state.speed =
				bf_get(lpfc_acqe_fc_la_speed, acqe_fc);
	phba->sli4_hba.link_state.duplex = LPFC_ASYNC_LINK_DUPLEX_FULL;
	phba->sli4_hba.link_state.topology =
				bf_get(lpfc_acqe_fc_la_topology, acqe_fc);
	phba->sli4_hba.link_state.status =
				bf_get(lpfc_acqe_fc_la_att_type, acqe_fc);
	phba->sli4_hba.link_state.type =
				bf_get(lpfc_acqe_fc_la_port_type, acqe_fc);
	phba->sli4_hba.link_state.number =
				bf_get(lpfc_acqe_fc_la_port_number, acqe_fc);
	phba->sli4_hba.link_state.fault =
				bf_get(lpfc_acqe_link_fault, acqe_fc);
	phba->sli4_hba.link_state.logical_speed =
				bf_get(lpfc_acqe_fc_la_llink_spd, acqe_fc);
	lpfc_printf_log(phba, KERN_INFO, LOG_SLI,
			"2896 Async FC event - Speed:%dGBaud Topology:x%x "
			"LA Type:x%x Port Type:%d Port Number:%d Logical speed:"
			"%dMbps Fault:%d\n",
			phba->sli4_hba.link_state.speed,
			phba->sli4_hba.link_state.topology,
			phba->sli4_hba.link_state.status,
			phba->sli4_hba.link_state.type,
			phba->sli4_hba.link_state.number,
			phba->sli4_hba.link_state.logical_speed * 10,
			phba->sli4_hba.link_state.fault);
	pmb = (LPFC_MBOXQ_t *)mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL);
	if (!pmb) {
		lpfc_printf_log(phba, KERN_ERR, LOG_SLI,
				"2897 The mboxq allocation failed\n");
		return;
	}
	mp = kmalloc(sizeof(struct lpfc_dmabuf), GFP_KERNEL);
	if (!mp) {
		lpfc_printf_log(phba, KERN_ERR, LOG_SLI,
				"2898 The lpfc_dmabuf allocation failed\n");
		goto out_free_pmb;
	}
	mp->virt = lpfc_mbuf_alloc(phba, 0, &mp->phys);
	if (!mp->virt) {
		lpfc_printf_log(phba, KERN_ERR, LOG_SLI,
				"2899 The mbuf allocation failed\n");
		goto out_free_dmabuf;
	}

	/* Cleanup any outstanding ELS commands */
	lpfc_els_flush_all_cmd(phba);

	/* Block ELS IOCBs until we have done process link event */
	phba->sli.ring[LPFC_ELS_RING].flag |= LPFC_STOP_IOCB_EVENT;

	/* Update link event statistics */
	phba->sli.slistat.link_event++;

	/* Create lpfc_handle_latt mailbox command from link ACQE */
	lpfc_read_topology(phba, pmb, mp);
	pmb->mbox_cmpl = lpfc_mbx_cmpl_read_topology;
	pmb->vport = phba->pport;

	rc = lpfc_sli_issue_mbox(phba, pmb, MBX_NOWAIT);
	if (rc == MBX_NOT_FINISHED)
		goto out_free_dmabuf;
	return;

out_free_dmabuf:
	kfree(mp);
out_free_pmb:
	mempool_free(pmb, phba->mbox_mem_pool);
}

/**
 * lpfc_sli4_async_sli_evt - Process the asynchronous SLI link event
 * @phba: pointer to lpfc hba data structure.
 * @acqe_fc: pointer to the async SLI completion queue entry.
 *
 * This routine is to handle the SLI4 asynchronous SLI events.
 **/
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;
}

/**
/**
 * lpfc_sli4_perform_vport_cvl - Perform clear virtual link on a vport
 * lpfc_sli4_perform_vport_cvl - Perform clear virtual link on a vport
 * @vport: pointer to vport data structure.
 * @vport: pointer to vport data structure.
@@ -3348,9 +3473,9 @@ lpfc_sli4_perform_all_vport_cvl(struct lpfc_hba *phba)
 **/
 **/
static void
static void
lpfc_sli4_async_fip_evt(struct lpfc_hba *phba,
lpfc_sli4_async_fip_evt(struct lpfc_hba *phba,
			struct lpfc_acqe_fcoe *acqe_fcoe)
			struct lpfc_acqe_fip *acqe_fip)
{
{
	uint8_t event_type = bf_get(lpfc_acqe_fcoe_event_type, acqe_fcoe);
	uint8_t event_type = bf_get(lpfc_trailer_type, acqe_fip);
	int rc;
	int rc;
	struct lpfc_vport *vport;
	struct lpfc_vport *vport;
	struct lpfc_nodelist *ndlp;
	struct lpfc_nodelist *ndlp;
@@ -3359,25 +3484,25 @@ lpfc_sli4_async_fip_evt(struct lpfc_hba *phba,
	struct lpfc_vport **vports;
	struct lpfc_vport **vports;
	int i;
	int i;


	phba->fc_eventTag = acqe_fcoe->event_tag;
	phba->fc_eventTag = acqe_fip->event_tag;
	phba->fcoe_eventtag = acqe_fcoe->event_tag;
	phba->fcoe_eventtag = acqe_fip->event_tag;
	switch (event_type) {
	switch (event_type) {
	case LPFC_FCOE_EVENT_TYPE_NEW_FCF:
	case LPFC_FIP_EVENT_TYPE_NEW_FCF:
	case LPFC_FCOE_EVENT_TYPE_FCF_PARAM_MOD:
	case LPFC_FIP_EVENT_TYPE_FCF_PARAM_MOD:
		if (event_type == LPFC_FCOE_EVENT_TYPE_NEW_FCF)
		if (event_type == LPFC_FIP_EVENT_TYPE_NEW_FCF)
			lpfc_printf_log(phba, KERN_ERR, LOG_FIP |
			lpfc_printf_log(phba, KERN_ERR, LOG_FIP |
					LOG_DISCOVERY,
					LOG_DISCOVERY,
					"2546 New FCF event, evt_tag:x%x, "
					"2546 New FCF event, evt_tag:x%x, "
					"index:x%x\n",
					"index:x%x\n",
					acqe_fcoe->event_tag,
					acqe_fip->event_tag,
					acqe_fcoe->index);
					acqe_fip->index);
		else
		else
			lpfc_printf_log(phba, KERN_WARNING, LOG_FIP |
			lpfc_printf_log(phba, KERN_WARNING, LOG_FIP |
					LOG_DISCOVERY,
					LOG_DISCOVERY,
					"2788 FCF param modified event, "
					"2788 FCF param modified event, "
					"evt_tag:x%x, index:x%x\n",
					"evt_tag:x%x, index:x%x\n",
					acqe_fcoe->event_tag,
					acqe_fip->event_tag,
					acqe_fcoe->index);
					acqe_fip->index);
		if (phba->fcf.fcf_flag & FCF_DISCOVERY) {
		if (phba->fcf.fcf_flag & FCF_DISCOVERY) {
			/*
			/*
			 * During period of FCF discovery, read the FCF
			 * During period of FCF discovery, read the FCF
@@ -3388,8 +3513,8 @@ lpfc_sli4_async_fip_evt(struct lpfc_hba *phba,
					LOG_DISCOVERY,
					LOG_DISCOVERY,
					"2779 Read FCF (x%x) for updating "
					"2779 Read FCF (x%x) for updating "
					"roundrobin FCF failover bmask\n",
					"roundrobin FCF failover bmask\n",
					acqe_fcoe->index);
					acqe_fip->index);
			rc = lpfc_sli4_read_fcf_rec(phba, acqe_fcoe->index);
			rc = lpfc_sli4_read_fcf_rec(phba, acqe_fip->index);
		}
		}


		/* If the FCF discovery is in progress, do nothing. */
		/* If the FCF discovery is in progress, do nothing. */
@@ -3415,7 +3540,7 @@ lpfc_sli4_async_fip_evt(struct lpfc_hba *phba,
		lpfc_printf_log(phba, KERN_INFO, LOG_FIP | LOG_DISCOVERY,
		lpfc_printf_log(phba, KERN_INFO, LOG_FIP | LOG_DISCOVERY,
				"2770 Start FCF table scan per async FCF "
				"2770 Start FCF table scan per async FCF "
				"event, evt_tag:x%x, index:x%x\n",
				"event, evt_tag:x%x, index:x%x\n",
				acqe_fcoe->event_tag, acqe_fcoe->index);
				acqe_fip->event_tag, acqe_fip->index);
		rc = lpfc_sli4_fcf_scan_read_fcf_rec(phba,
		rc = lpfc_sli4_fcf_scan_read_fcf_rec(phba,
						     LPFC_FCOE_FCF_GET_FIRST);
						     LPFC_FCOE_FCF_GET_FIRST);
		if (rc)
		if (rc)
@@ -3424,17 +3549,17 @@ lpfc_sli4_async_fip_evt(struct lpfc_hba *phba,
					"command failed (x%x)\n", rc);
					"command failed (x%x)\n", rc);
		break;
		break;


	case LPFC_FCOE_EVENT_TYPE_FCF_TABLE_FULL:
	case LPFC_FIP_EVENT_TYPE_FCF_TABLE_FULL:
		lpfc_printf_log(phba, KERN_ERR, LOG_SLI,
		lpfc_printf_log(phba, KERN_ERR, LOG_SLI,
			"2548 FCF Table full count 0x%x tag 0x%x\n",
			"2548 FCF Table full count 0x%x tag 0x%x\n",
			bf_get(lpfc_acqe_fcoe_fcf_count, acqe_fcoe),
			bf_get(lpfc_acqe_fip_fcf_count, acqe_fip),
			acqe_fcoe->event_tag);
			acqe_fip->event_tag);
		break;
		break;


	case LPFC_FCOE_EVENT_TYPE_FCF_DEAD:
	case LPFC_FIP_EVENT_TYPE_FCF_DEAD:
		lpfc_printf_log(phba, KERN_ERR, LOG_FIP | LOG_DISCOVERY,
		lpfc_printf_log(phba, KERN_ERR, LOG_FIP | LOG_DISCOVERY,
			"2549 FCF (x%x) disconnected from network, "
			"2549 FCF (x%x) disconnected from network, "
			"tag:x%x\n", acqe_fcoe->index, acqe_fcoe->event_tag);
			"tag:x%x\n", acqe_fip->index, acqe_fip->event_tag);
		/*
		/*
		 * If we are in the middle of FCF failover process, clear
		 * If we are in the middle of FCF failover process, clear
		 * the corresponding FCF bit in the roundrobin bitmap.
		 * the corresponding FCF bit in the roundrobin bitmap.
@@ -3443,13 +3568,13 @@ lpfc_sli4_async_fip_evt(struct lpfc_hba *phba,
		if (phba->fcf.fcf_flag & FCF_DISCOVERY) {
		if (phba->fcf.fcf_flag & FCF_DISCOVERY) {
			spin_unlock_irq(&phba->hbalock);
			spin_unlock_irq(&phba->hbalock);
			/* Update FLOGI FCF failover eligible FCF bmask */
			/* Update FLOGI FCF failover eligible FCF bmask */
			lpfc_sli4_fcf_rr_index_clear(phba, acqe_fcoe->index);
			lpfc_sli4_fcf_rr_index_clear(phba, acqe_fip->index);
			break;
			break;
		}
		}
		spin_unlock_irq(&phba->hbalock);
		spin_unlock_irq(&phba->hbalock);


		/* If the event is not for currently used fcf do nothing */
		/* If the event is not for currently used fcf do nothing */
		if (phba->fcf.current_rec.fcf_indx != acqe_fcoe->index)
		if (phba->fcf.current_rec.fcf_indx != acqe_fip->index)
			break;
			break;


		/*
		/*
@@ -3466,7 +3591,7 @@ lpfc_sli4_async_fip_evt(struct lpfc_hba *phba,
		lpfc_printf_log(phba, KERN_INFO, LOG_FIP | LOG_DISCOVERY,
		lpfc_printf_log(phba, KERN_INFO, LOG_FIP | LOG_DISCOVERY,
				"2771 Start FCF fast failover process due to "
				"2771 Start FCF fast failover process due to "
				"FCF DEAD event: evt_tag:x%x, fcf_index:x%x "
				"FCF DEAD event: evt_tag:x%x, fcf_index:x%x "
				"\n", acqe_fcoe->event_tag, acqe_fcoe->index);
				"\n", acqe_fip->event_tag, acqe_fip->index);
		rc = lpfc_sli4_redisc_fcf_table(phba);
		rc = lpfc_sli4_redisc_fcf_table(phba);
		if (rc) {
		if (rc) {
			lpfc_printf_log(phba, KERN_ERR, LOG_FIP |
			lpfc_printf_log(phba, KERN_ERR, LOG_FIP |
@@ -3493,12 +3618,12 @@ lpfc_sli4_async_fip_evt(struct lpfc_hba *phba,
			lpfc_sli4_perform_all_vport_cvl(phba);
			lpfc_sli4_perform_all_vport_cvl(phba);
		}
		}
		break;
		break;
	case LPFC_FCOE_EVENT_TYPE_CVL:
	case LPFC_FIP_EVENT_TYPE_CVL:
		lpfc_printf_log(phba, KERN_ERR, LOG_FIP | LOG_DISCOVERY,
		lpfc_printf_log(phba, KERN_ERR, LOG_FIP | LOG_DISCOVERY,
			"2718 Clear Virtual Link Received for VPI 0x%x"
			"2718 Clear Virtual Link Received for VPI 0x%x"
			" tag 0x%x\n", acqe_fcoe->index, acqe_fcoe->event_tag);
			" tag 0x%x\n", acqe_fip->index, acqe_fip->event_tag);
		vport = lpfc_find_vport_by_vpid(phba,
		vport = lpfc_find_vport_by_vpid(phba,
				acqe_fcoe->index - phba->vpi_base);
				acqe_fip->index - phba->vpi_base);
		ndlp = lpfc_sli4_perform_vport_cvl(vport);
		ndlp = lpfc_sli4_perform_vport_cvl(vport);
		if (!ndlp)
		if (!ndlp)
			break;
			break;
@@ -3549,7 +3674,7 @@ lpfc_sli4_async_fip_evt(struct lpfc_hba *phba,
			lpfc_printf_log(phba, KERN_INFO, LOG_FIP |
			lpfc_printf_log(phba, KERN_INFO, LOG_FIP |
					LOG_DISCOVERY,
					LOG_DISCOVERY,
					"2773 Start FCF failover per CVL, "
					"2773 Start FCF failover per CVL, "
					"evt_tag:x%x\n", acqe_fcoe->event_tag);
					"evt_tag:x%x\n", acqe_fip->event_tag);
			rc = lpfc_sli4_redisc_fcf_table(phba);
			rc = lpfc_sli4_redisc_fcf_table(phba);
			if (rc) {
			if (rc) {
				lpfc_printf_log(phba, KERN_ERR, LOG_FIP |
				lpfc_printf_log(phba, KERN_ERR, LOG_FIP |
@@ -3577,7 +3702,7 @@ lpfc_sli4_async_fip_evt(struct lpfc_hba *phba,
	default:
	default:
		lpfc_printf_log(phba, KERN_ERR, LOG_SLI,
		lpfc_printf_log(phba, KERN_ERR, LOG_SLI,
			"0288 Unknown FCoE event type 0x%x event tag "
			"0288 Unknown FCoE event type 0x%x event tag "
			"0x%x\n", event_type, acqe_fcoe->event_tag);
			"0x%x\n", event_type, acqe_fip->event_tag);
		break;
		break;
	}
	}
}
}
@@ -3650,13 +3775,11 @@ void lpfc_sli4_async_event_proc(struct lpfc_hba *phba)
		/* Process the asynchronous event */
		/* Process the asynchronous event */
		switch (bf_get(lpfc_trailer_code, &cq_event->cqe.mcqe_cmpl)) {
		switch (bf_get(lpfc_trailer_code, &cq_event->cqe.mcqe_cmpl)) {
		case LPFC_TRAILER_CODE_LINK:
		case LPFC_TRAILER_CODE_LINK:
		case LPFC_TRAILER_CODE_FC:
			lpfc_sli4_async_link_evt(phba,
			lpfc_sli4_async_link_evt(phba,
						 &cq_event->cqe.acqe_link);
						 &cq_event->cqe.acqe_link);
			break;
			break;
		case LPFC_TRAILER_CODE_FCOE:
		case LPFC_TRAILER_CODE_FCOE:
			lpfc_sli4_async_fip_evt(phba,
			lpfc_sli4_async_fip_evt(phba, &cq_event->cqe.acqe_fip);
						&cq_event->cqe.acqe_fcoe);
			break;
			break;
		case LPFC_TRAILER_CODE_DCBX:
		case LPFC_TRAILER_CODE_DCBX:
			lpfc_sli4_async_dcbx_evt(phba,
			lpfc_sli4_async_dcbx_evt(phba,
@@ -3666,6 +3789,12 @@ void lpfc_sli4_async_event_proc(struct lpfc_hba *phba)
			lpfc_sli4_async_grp5_evt(phba,
			lpfc_sli4_async_grp5_evt(phba,
						 &cq_event->cqe.acqe_grp5);
						 &cq_event->cqe.acqe_grp5);
			break;
			break;
		case LPFC_TRAILER_CODE_FC:
			lpfc_sli4_async_fc_evt(phba, &cq_event->cqe.acqe_fc);
			break;
		case LPFC_TRAILER_CODE_SLI:
			lpfc_sli4_async_sli_evt(phba, &cq_event->cqe.acqe_sli);
			break;
		default:
		default:
			lpfc_printf_log(phba, KERN_ERR, LOG_SLI,
			lpfc_printf_log(phba, KERN_ERR, LOG_SLI,
					"1804 Invalid asynchrous event code: "
					"1804 Invalid asynchrous event code: "
+11 −7
Original line number Original line Diff line number Diff line
@@ -10561,16 +10561,20 @@ lpfc_mq_create(struct lpfc_hba *phba, struct lpfc_queue *mq,
			 length, LPFC_SLI4_MBX_EMBED);
			 length, LPFC_SLI4_MBX_EMBED);


	mq_create_ext = &mbox->u.mqe.un.mq_create_ext;
	mq_create_ext = &mbox->u.mqe.un.mq_create_ext;
	bf_set(lpfc_mbx_mq_create_ext_num_pages, &mq_create_ext->u.request,
	bf_set(lpfc_mbx_mq_create_ext_num_pages,
		    mq->page_count);
	       &mq_create_ext->u.request, mq->page_count);
	bf_set(lpfc_mbx_mq_create_ext_async_evt_link, &mq_create_ext->u.request,
	bf_set(lpfc_mbx_mq_create_ext_async_evt_link,
	       1);
	       &mq_create_ext->u.request, 1);
	bf_set(lpfc_mbx_mq_create_ext_async_evt_fcfste,
	bf_set(lpfc_mbx_mq_create_ext_async_evt_fip,
	       &mq_create_ext->u.request, 1);
	       &mq_create_ext->u.request, 1);
	bf_set(lpfc_mbx_mq_create_ext_async_evt_group5,
	bf_set(lpfc_mbx_mq_create_ext_async_evt_group5,
	       &mq_create_ext->u.request, 1);
	       &mq_create_ext->u.request, 1);
	bf_set(lpfc_mq_context_cq_id, &mq_create_ext->u.request.context,
	bf_set(lpfc_mbx_mq_create_ext_async_evt_fc,
	       cq->queue_id);
	       &mq_create_ext->u.request, 1);
	bf_set(lpfc_mbx_mq_create_ext_async_evt_sli,
	       &mq_create_ext->u.request, 1);
	bf_set(lpfc_mq_context_cq_id,
	       &mq_create_ext->u.request.context, cq->queue_id);
	bf_set(lpfc_mq_context_valid, &mq_create_ext->u.request.context, 1);
	bf_set(lpfc_mq_context_valid, &mq_create_ext->u.request.context, 1);
	switch (mq->entry_count) {
	switch (mq->entry_count) {
	default:
	default:
+3 −1
Original line number Original line Diff line number Diff line
@@ -34,9 +34,11 @@ struct lpfc_cq_event {
	union {
	union {
		struct lpfc_mcqe		mcqe_cmpl;
		struct lpfc_mcqe		mcqe_cmpl;
		struct lpfc_acqe_link		acqe_link;
		struct lpfc_acqe_link		acqe_link;
		struct lpfc_acqe_fcoe		acqe_fcoe;
		struct lpfc_acqe_fip		acqe_fip;
		struct lpfc_acqe_dcbx		acqe_dcbx;
		struct lpfc_acqe_dcbx		acqe_dcbx;
		struct lpfc_acqe_grp5		acqe_grp5;
		struct lpfc_acqe_grp5		acqe_grp5;
		struct lpfc_acqe_fc_la		acqe_fc;
		struct lpfc_acqe_sli		acqe_sli;
		struct lpfc_rcqe		rcqe_cmpl;
		struct lpfc_rcqe		rcqe_cmpl;
		struct sli4_wcqe_xri_aborted	wcqe_axri;
		struct sli4_wcqe_xri_aborted	wcqe_axri;
		struct lpfc_wcqe_complete	wcqe_cmpl;
		struct lpfc_wcqe_complete	wcqe_cmpl;
+3 −1
Original line number Original line Diff line number Diff line
@@ -137,9 +137,11 @@ struct lpfc_sli4_link {
	uint8_t speed;
	uint8_t speed;
	uint8_t duplex;
	uint8_t duplex;
	uint8_t status;
	uint8_t status;
	uint8_t physical;
	uint8_t type;
	uint8_t number;
	uint8_t fault;
	uint8_t fault;
	uint16_t logical_speed;
	uint16_t logical_speed;
	uint16_t topology;
};
};


struct lpfc_fcf_rec {
struct lpfc_fcf_rec {