diff options
Diffstat (limited to 'drivers/scsi/lpfc/lpfc.h')
| -rw-r--r-- | drivers/scsi/lpfc/lpfc.h | 261 | 
1 files changed, 218 insertions, 43 deletions
diff --git a/drivers/scsi/lpfc/lpfc.h b/drivers/scsi/lpfc/lpfc.h index 196de40b906..434e9037908 100644 --- a/drivers/scsi/lpfc/lpfc.h +++ b/drivers/scsi/lpfc/lpfc.h @@ -1,7 +1,7 @@  /*******************************************************************   * This file is part of the Emulex Linux Device Driver for         *   * Fibre Channel Host Bus Adapters.                                * - * Copyright (C) 2004-2010 Emulex.  All rights reserved.           * + * Copyright (C) 2004-2014 Emulex.  All rights reserved.           *   * EMULEX and SLI are trademarks of Emulex.                        *   * www.emulex.com                                                  *   * Portions Copyright (C) 2004-2005 Christoph Hellwig              * @@ -20,8 +20,15 @@   *******************************************************************/  #include <scsi/scsi_host.h> + +#if defined(CONFIG_DEBUG_FS) && !defined(CONFIG_SCSI_LPFC_DEBUG_FS) +#define CONFIG_SCSI_LPFC_DEBUG_FS +#endif +  struct lpfc_sli2_slim; +#define ELX_MODEL_NAME_SIZE	80 +  #define LPFC_PCI_DEV_LP		0x1  #define LPFC_PCI_DEV_OC		0x2 @@ -39,9 +46,15 @@ struct lpfc_sli2_slim;  #define LPFC_DEFAULT_MENLO_SG_SEG_CNT 128	/* sg element count per scsi  		cmnd for menlo needs nearly twice as for firmware  		downloads using bsg */ -#define LPFC_DEFAULT_PROT_SG_SEG_CNT 4096 /* sg protection elements count */ + +#define LPFC_MIN_SG_SLI4_BUF_SZ	0x800	/* based on LPFC_DEFAULT_SG_SEG_CNT */ +#define LPFC_MAX_SG_SLI4_SEG_CNT_DIF 128 /* sg element count per scsi cmnd */ +#define LPFC_MAX_SG_SEG_CNT_DIF 512	/* sg element count per scsi cmnd  */  #define LPFC_MAX_SG_SEG_CNT	4096	/* sg element count per scsi cmnd */ -#define LPFC_MAX_PROT_SG_SEG_CNT 4096	/* prot sg element count per scsi cmd*/ +#define LPFC_MAX_SGL_SEG_CNT	512	/* SGL element count per scsi cmnd */ +#define LPFC_MAX_BPL_SEG_CNT	4096	/* BPL element count per scsi cmnd */ + +#define LPFC_MAX_SGE_SIZE       0x80000000 /* Maximum data allowed in a SGE */  #define LPFC_IOCB_LIST_CNT	2250	/* list of IOCBs for fast-path usage. */  #define LPFC_Q_RAMP_UP_INTERVAL 120     /* lun q_depth ramp up interval */  #define LPFC_VNAME_LEN		100	/* vport symbolic name length */ @@ -58,8 +71,8 @@ struct lpfc_sli2_slim;   * queue depths when there are driver resource error or Firmware   * resource error.   */ -#define QUEUE_RAMP_DOWN_INTERVAL	(1 * HZ)   /* 1 Second */ -#define QUEUE_RAMP_UP_INTERVAL		(300 * HZ) /* 5 minutes */ +/* 1 Second */ +#define QUEUE_RAMP_DOWN_INTERVAL	(msecs_to_jiffies(1000 * 1))  /* Number of exchanges reserved for discovery to complete */  #define LPFC_DISC_IOCB_BUFF_COUNT 20 @@ -67,6 +80,8 @@ struct lpfc_sli2_slim;  #define LPFC_HB_MBOX_INTERVAL   5	/* Heart beat interval in seconds. */  #define LPFC_HB_MBOX_TIMEOUT    30	/* Heart beat timeout  in seconds. */ +#define LPFC_LOOK_AHEAD_OFF	0	/* Look ahead logic is turned off */ +  /* Error Attention event polling interval */  #define LPFC_ERATT_POLL_INTERVAL	5 /* EATT poll interval in seconds */ @@ -87,6 +102,13 @@ struct lpfc_sli2_slim;  /* lpfc wait event data ready flag */  #define LPFC_DATA_READY		(1<<0) +/* queue dump line buffer size */ +#define LPFC_LBUF_SZ		128 + +/* mailbox system shutdown options */ +#define LPFC_MBX_NO_WAIT	0 +#define LPFC_MBX_WAIT		1 +  enum lpfc_polling_flags {  	ENABLE_FCP_RING_POLLING = 0x1,  	DISABLE_FCP_RING_INT    = 0x2 @@ -241,18 +263,6 @@ struct lpfc_stats {  	uint32_t fcpLocalErr;  }; -enum sysfs_mbox_state { -	SMBOX_IDLE, -	SMBOX_WRITING, -	SMBOX_READING -}; - -struct lpfc_sysfs_mbox { -	enum sysfs_mbox_state state; -	size_t                offset; -	struct lpfcMboxq *    mbox; -}; -  struct lpfc_hba; @@ -325,6 +335,7 @@ struct lpfc_vport {  #define FC_VPORT_CVL_RCVD	0x400000 /* VLink failed due to CVL	 */  #define FC_VFI_REGISTERED	0x800000 /* VFI is registered */  #define FC_FDISC_COMPLETED	0x1000000/* FDISC completed */ +#define FC_DISC_DELAYED		0x2000000/* Delay NPort discovery */  	uint32_t ct_flags;  #define FC_CT_RFF_ID		0x1	 /* RFF_ID accepted by switch */ @@ -348,6 +359,8 @@ struct lpfc_vport {  	uint32_t fc_myDID;	/* fibre channel S_ID */  	uint32_t fc_prevDID;	/* previous fibre channel S_ID */ +	struct lpfc_name fabric_portname; +	struct lpfc_name fabric_nodename;  	int32_t stopped;   /* HBA has not been restarted since last ERATT */  	uint8_t fc_linkspeed;	/* Link speed after last READ_LA */ @@ -372,6 +385,7 @@ struct lpfc_vport {  #define WORKER_DISC_TMO                0x1	/* vport: Discovery timeout */  #define WORKER_ELS_TMO                 0x2	/* vport: ELS timeout */  #define WORKER_FDMI_TMO                0x4	/* vport: FDMI timeout */ +#define WORKER_DELAYED_DISC_TMO        0x8	/* vport: delayed discovery */  #define WORKER_MBOX_TMO                0x100	/* hba: MBOX timeout */  #define WORKER_HB_TMO                  0x200	/* hba: Heart beat timeout */ @@ -382,6 +396,7 @@ struct lpfc_vport {  	struct timer_list fc_fdmitmo;  	struct timer_list els_tmofunc; +	struct timer_list delayed_disc_tmo;  	int unreg_vpi_cmpl; @@ -404,6 +419,7 @@ struct lpfc_vport {  	uint32_t cfg_enable_da_id;  	uint32_t cfg_max_scsicmpl_time;  	uint32_t cfg_tgt_queue_depth; +	uint32_t cfg_first_burst_size;  	uint32_t dev_loss_tmo_changed; @@ -456,12 +472,68 @@ enum intr_type_t {  	MSIX,  }; +#define LPFC_CT_CTX_MAX		64  struct unsol_rcv_ct_ctx {  	uint32_t ctxt_id;  	uint32_t SID; -	uint32_t oxid; -	uint32_t flags; -#define UNSOL_VALID	0x00000001 +	uint32_t valid; +#define UNSOL_INVALID		0 +#define UNSOL_VALID		1 +	uint16_t oxid; +	uint16_t rxid; +}; + +#define LPFC_USER_LINK_SPEED_AUTO	0	/* auto select (default)*/ +#define LPFC_USER_LINK_SPEED_1G		1	/* 1 Gigabaud */ +#define LPFC_USER_LINK_SPEED_2G		2	/* 2 Gigabaud */ +#define LPFC_USER_LINK_SPEED_4G		4	/* 4 Gigabaud */ +#define LPFC_USER_LINK_SPEED_8G		8	/* 8 Gigabaud */ +#define LPFC_USER_LINK_SPEED_10G	10	/* 10 Gigabaud */ +#define LPFC_USER_LINK_SPEED_16G	16	/* 16 Gigabaud */ +#define LPFC_USER_LINK_SPEED_MAX	LPFC_USER_LINK_SPEED_16G +#define LPFC_USER_LINK_SPEED_BITMAP ((1 << LPFC_USER_LINK_SPEED_16G) | \ +				     (1 << LPFC_USER_LINK_SPEED_10G) | \ +				     (1 << LPFC_USER_LINK_SPEED_8G) | \ +				     (1 << LPFC_USER_LINK_SPEED_4G) | \ +				     (1 << LPFC_USER_LINK_SPEED_2G) | \ +				     (1 << LPFC_USER_LINK_SPEED_1G) | \ +				     (1 << LPFC_USER_LINK_SPEED_AUTO)) +#define LPFC_LINK_SPEED_STRING "0, 1, 2, 4, 8, 10, 16" + +enum nemb_type { +	nemb_mse = 1, +	nemb_hbd +}; + +enum mbox_type { +	mbox_rd = 1, +	mbox_wr +}; + +enum dma_type { +	dma_mbox = 1, +	dma_ebuf +}; + +enum sta_type { +	sta_pre_addr = 1, +	sta_pos_addr +}; + +struct lpfc_mbox_ext_buf_ctx { +	uint32_t state; +#define LPFC_BSG_MBOX_IDLE		0 +#define LPFC_BSG_MBOX_HOST              1 +#define LPFC_BSG_MBOX_PORT		2 +#define LPFC_BSG_MBOX_DONE		3 +#define LPFC_BSG_MBOX_ABTS		4 +	enum nemb_type nembType; +	enum mbox_type mboxType; +	uint32_t numBuf; +	uint32_t mbxTag; +	uint32_t seqNum; +	struct lpfc_dmabuf *mbx_dmabuf; +	struct list_head ext_dmabuf_list;  };  struct lpfc_hba { @@ -469,7 +541,7 @@ struct lpfc_hba {  	int (*lpfc_new_scsi_buf)  		(struct lpfc_vport *, int);  	struct lpfc_scsi_buf * (*lpfc_get_scsi_buf) -		(struct lpfc_hba *); +		(struct lpfc_hba *, struct lpfc_nodelist *);  	int (*lpfc_scsi_prep_dma_buf)  		(struct lpfc_hba *, struct lpfc_scsi_buf *);  	void (*lpfc_scsi_unprep_dma_buf) @@ -481,6 +553,7 @@ struct lpfc_hba {  	void (*lpfc_scsi_prep_cmnd)  		(struct lpfc_vport *, struct lpfc_scsi_buf *,  		 struct lpfc_nodelist *); +  	/* IOCB interface function jump table entries */  	int (*__lpfc_sli_issue_iocb)  		(struct lpfc_hba *, uint32_t, @@ -488,8 +561,6 @@ struct lpfc_hba {  	void (*__lpfc_sli_release_iocbq)(struct lpfc_hba *,  			 struct lpfc_iocbq *);  	int (*lpfc_hba_down_post)(struct lpfc_hba *phba); - -  	IOCB_t * (*lpfc_get_iocb_from_iocbq)  		(struct lpfc_iocbq *);  	void (*lpfc_scsi_cmd_iocb_cmpl) @@ -498,10 +569,12 @@ struct lpfc_hba {  	/* MBOX interface function jump table entries */  	int (*lpfc_sli_issue_mbox)  		(struct lpfc_hba *, LPFC_MBOXQ_t *, uint32_t); +  	/* Slow-path IOCB process function jump table entries */  	void (*lpfc_sli_handle_slow_ring_event)  		(struct lpfc_hba *phba, struct lpfc_sli_ring *pring,  		 uint32_t mask); +  	/* INIT device interface function jump table entries */  	int (*lpfc_sli_hbq_to_firmware)  		(struct lpfc_hba *, uint32_t, struct hbq_dmabuf *); @@ -517,6 +590,12 @@ struct lpfc_hba {  		(struct lpfc_hba *, uint32_t);  	int (*lpfc_hba_down_link)  		(struct lpfc_hba *, uint32_t); +	int (*lpfc_selective_reset) +		(struct lpfc_hba *); + +	int (*lpfc_bg_scsi_prep_dma_buf) +		(struct lpfc_hba *, struct lpfc_scsi_buf *); +	/* Add new entries here */  	/* SLI4 specific HBA data structure */  	struct lpfc_sli4_hba sli4_hba; @@ -531,6 +610,8 @@ struct lpfc_hba {  #define LPFC_SLI3_CRP_ENABLED		0x08  #define LPFC_SLI3_BG_ENABLED		0x20  #define LPFC_SLI3_DSS_ENABLED		0x40 +#define LPFC_SLI4_PERFH_ENABLED		0x80 +#define LPFC_SLI4_PHWQ_ENABLED		0x100  	uint32_t iocb_cmd_size;  	uint32_t iocb_rsp_size; @@ -545,7 +626,7 @@ struct lpfc_hba {  	uint32_t hba_flag;	/* hba generic flags */  #define HBA_ERATT_HANDLED	0x1 /* This flag is set when eratt handled */  #define DEFER_ERATT		0x2 /* Deferred error attention in progress */ -#define HBA_FCOE_SUPPORT	0x4 /* HBA function supports FCOE */ +#define HBA_FCOE_MODE		0x4 /* HBA function in FCoE Mode */  #define HBA_SP_QUEUE_EVT	0x8 /* Slow-path qevt posted to worker thread*/  #define HBA_POST_RECEIVE_BUFFER 0x10 /* Rcv buffers need to be posted */  #define FCP_XRI_ABORT_EVENT	0x20 @@ -557,11 +638,15 @@ struct lpfc_hba {  #define HBA_FIP_SUPPORT		0x800 /* FIP support in HBA */  #define HBA_AER_ENABLED		0x1000 /* AER enabled with HBA */  #define HBA_DEVLOSS_TMO         0x2000 /* HBA in devloss timeout */ +#define HBA_RRQ_ACTIVE		0x4000 /* process the rrq active list */ +#define HBA_FCP_IOQ_FLUSH	0x8000 /* FCP I/O queues being flushed */ +#define HBA_FW_DUMP_OP		0x10000 /* Skips fn reset before FW dump */  	uint32_t fcp_ring_in_use; /* When polling test if intr-hndlr active*/  	struct lpfc_dmabuf slim2p;  	MAILBOX_t *mbox;  	uint32_t *mbox_ext; +	struct lpfc_mbox_ext_buf_ctx mbox_ext_buf_ctx;  	uint32_t ha_copy;  	struct _PCB *pcb;  	struct _IOCB *IOCBs; @@ -593,6 +678,7 @@ struct lpfc_hba {  	uint32_t lmt;  	uint32_t fc_topology;	/* link topology, from LINK INIT */ +	uint32_t fc_topology_changed;	/* link topology, from LINK INIT */  	struct lpfc_stats fc_stat; @@ -606,8 +692,14 @@ struct lpfc_hba {  	/* HBA Config Parameters */  	uint32_t cfg_ack0;  	uint32_t cfg_enable_npiv; +	uint32_t cfg_enable_rrq;  	uint32_t cfg_topology;  	uint32_t cfg_link_speed; +#define LPFC_FCF_FOV 1		/* Fast fcf failover */ +#define LPFC_FCF_PRIORITY 2	/* Priority fcf failover */ +	uint32_t cfg_fcf_failover_policy; +	uint32_t cfg_fcp_io_sched; +	uint32_t cfg_fcp2_no_tgt_reset;  	uint32_t cfg_cr_delay;  	uint32_t cfg_cr_count;  	uint32_t cfg_multi_ring_support; @@ -615,10 +707,12 @@ struct lpfc_hba {  	uint32_t cfg_multi_ring_type;  	uint32_t cfg_poll;  	uint32_t cfg_poll_tmo; +	uint32_t cfg_task_mgmt_tmo;  	uint32_t cfg_use_msi;  	uint32_t cfg_fcp_imax; -	uint32_t cfg_fcp_wq_count; -	uint32_t cfg_fcp_eq_count; +	uint32_t cfg_fcp_cpu_map; +	uint32_t cfg_fcp_io_channel; +	uint32_t cfg_total_seg_cnt;  	uint32_t cfg_sg_seg_cnt;  	uint32_t cfg_prot_sg_seg_cnt;  	uint32_t cfg_sg_dma_buf_size; @@ -627,16 +721,33 @@ struct lpfc_hba {  	uint32_t cfg_hba_queue_depth;  	uint32_t cfg_enable_hba_reset;  	uint32_t cfg_enable_hba_heartbeat; +	uint32_t cfg_fof; +	uint32_t cfg_EnableXLane; +	uint8_t cfg_oas_tgt_wwpn[8]; +	uint8_t cfg_oas_vpt_wwpn[8]; +	uint32_t cfg_oas_lun_state; +#define OAS_LUN_ENABLE	1 +#define OAS_LUN_DISABLE	0 +	uint32_t cfg_oas_lun_status; +#define OAS_LUN_STATUS_EXISTS	0x01 +	uint32_t cfg_oas_flags; +#define OAS_FIND_ANY_VPORT	0x01 +#define OAS_FIND_ANY_TARGET	0x02 +#define OAS_LUN_VALID	0x04 +	uint32_t cfg_XLanePriority;  	uint32_t cfg_enable_bg;  	uint32_t cfg_hostmem_hgp;  	uint32_t cfg_log_verbose;  	uint32_t cfg_aer_support; +	uint32_t cfg_sriov_nr_virtfn; +	uint32_t cfg_request_firmware_upgrade;  	uint32_t cfg_iocb_cnt;  	uint32_t cfg_suppress_link_up; +	uint32_t cfg_rrq_xri_bitmap_sz;  #define LPFC_INITIALIZE_LINK              0	/* do normal init_link mbox */  #define LPFC_DELAY_INIT_LINK              1	/* layered driver hold off */  #define LPFC_DELAY_INIT_LINK_INDEFINITELY 2	/* wait, manual intervention */ - +	uint32_t cfg_enable_dss;  	lpfc_vpd_t vpd;		/* vital product data */  	struct pci_dev *pcidev; @@ -655,7 +766,7 @@ struct lpfc_hba {  	uint32_t hbq_count;	        /* Count of configured HBQs */  	struct hbq_s hbqs[LPFC_MAX_HBQS]; /* local copy of hbq indicies  */ -	uint32_t fcp_qidx;		/* next work queue to post work to */ +	atomic_t fcp_qidx;		/* next work queue to post work to */  	unsigned long pci_bar0_map;     /* Physical address for PCI BAR0 */  	unsigned long pci_bar1_map;     /* Physical address for PCI BAR1 */ @@ -665,6 +776,15 @@ struct lpfc_hba {  	void __iomem *ctrl_regs_memmap_p;/* Kernel memory mapped address for  					    PCI BAR2 */ +	void __iomem *pci_bar0_memmap_p; /* Kernel memory mapped address for +					    PCI BAR0 with dual-ULP support */ +	void __iomem *pci_bar2_memmap_p; /* Kernel memory mapped address for +					    PCI BAR2 with dual-ULP support */ +	void __iomem *pci_bar4_memmap_p; /* Kernel memory mapped address for +					    PCI BAR4 with dual-ULP support */ +#define PCI_64BIT_BAR0	0 +#define PCI_64BIT_BAR2	2 +#define PCI_64BIT_BAR4	4  	void __iomem *MBslimaddr;	/* virtual address for mbox cmds */  	void __iomem *HAregaddr;	/* virtual address for host attn reg */  	void __iomem *CAregaddr;	/* virtual address for chip attn reg */ @@ -678,7 +798,6 @@ struct lpfc_hba {  	uint32_t          *hbq_get;     /* Host mem address of HBQ get ptrs */  	int brd_no;			/* FC board number */ -  	char SerialNumber[32];		/* adapter Serial Number */  	char OptionROMVersion[32];	/* adapter BIOS / Fcode version */  	char ModelDesc[256];		/* Model Description */ @@ -708,14 +827,15 @@ struct lpfc_hba {  	uint64_t bg_apptag_err_cnt;  	uint64_t bg_reftag_err_cnt; -	struct lpfc_sysfs_mbox sysfs_mbox; -  	/* fastpath list. */ -	spinlock_t scsi_buf_list_lock; -	struct list_head lpfc_scsi_buf_list; +	spinlock_t scsi_buf_list_get_lock;  /* SCSI buf alloc list lock */ +	spinlock_t scsi_buf_list_put_lock;  /* SCSI buf free list lock */ +	struct list_head lpfc_scsi_buf_list_get; +	struct list_head lpfc_scsi_buf_list_put;  	uint32_t total_scsi_bufs;  	struct list_head lpfc_iocb_list;  	uint32_t total_iocbq_bufs; +	struct list_head active_rrq_list;  	spinlock_t hbalock;  	/* pci_mem_pools */ @@ -728,6 +848,8 @@ struct lpfc_hba {  	mempool_t *mbox_mem_pool;  	mempool_t *nlp_mem_pool; +	mempool_t *rrq_pool; +	mempool_t *active_rrq_pool;  	struct fc_host_statistics link_stats;  	enum intr_type_t intr_type; @@ -748,6 +870,9 @@ struct lpfc_hba {  	uint16_t vpi_base;  	uint16_t vfi_base;  	unsigned long *vpi_bmask;	/* vpi allocation table */ +	uint16_t *vpi_ids; +	uint16_t vpi_count; +	struct list_head lpfc_vpi_blk_list;  	/* Data structure used by fabric iocb scheduler */  	struct list_head fabric_iocb_list; @@ -759,18 +884,49 @@ struct lpfc_hba {  	atomic_t num_cmd_success;  	unsigned long last_rsrc_error_time;  	unsigned long last_ramp_down_time; -	unsigned long last_ramp_up_time;  #ifdef CONFIG_SCSI_LPFC_DEBUG_FS  	struct dentry *hba_debugfs_root;  	atomic_t debugfs_vport_count;  	struct dentry *debug_hbqinfo;  	struct dentry *debug_dumpHostSlim;  	struct dentry *debug_dumpHBASlim; -	struct dentry *debug_dumpData;   /* BlockGuard BPL*/ -	struct dentry *debug_dumpDif;    /* BlockGuard BPL*/ +	struct dentry *debug_dumpData;   /* BlockGuard BPL */ +	struct dentry *debug_dumpDif;    /* BlockGuard BPL */ +	struct dentry *debug_InjErrLBA;  /* LBA to inject errors at */ +	struct dentry *debug_InjErrNPortID;  /* NPortID to inject errors at */ +	struct dentry *debug_InjErrWWPN;  /* WWPN to inject errors at */ +	struct dentry *debug_writeGuard; /* inject write guard_tag errors */ +	struct dentry *debug_writeApp;   /* inject write app_tag errors */ +	struct dentry *debug_writeRef;   /* inject write ref_tag errors */ +	struct dentry *debug_readGuard;  /* inject read guard_tag errors */ +	struct dentry *debug_readApp;    /* inject read app_tag errors */ +	struct dentry *debug_readRef;    /* inject read ref_tag errors */ + +	/* T10 DIF error injection */ +	uint32_t lpfc_injerr_wgrd_cnt; +	uint32_t lpfc_injerr_wapp_cnt; +	uint32_t lpfc_injerr_wref_cnt; +	uint32_t lpfc_injerr_rgrd_cnt; +	uint32_t lpfc_injerr_rapp_cnt; +	uint32_t lpfc_injerr_rref_cnt; +	uint32_t lpfc_injerr_nportid; +	struct lpfc_name lpfc_injerr_wwpn; +	sector_t lpfc_injerr_lba; +#define LPFC_INJERR_LBA_OFF	(sector_t)(-1) +  	struct dentry *debug_slow_ring_trc;  	struct lpfc_debugfs_trc *slow_ring_trc;  	atomic_t slow_ring_trc_cnt; +	/* iDiag debugfs sub-directory */ +	struct dentry *idiag_root; +	struct dentry *idiag_pci_cfg; +	struct dentry *idiag_bar_acc; +	struct dentry *idiag_que_info; +	struct dentry *idiag_que_acc; +	struct dentry *idiag_drb_acc; +	struct dentry *idiag_ctl_acc; +	struct dentry *idiag_mbx_acc; +	struct dentry *idiag_ext_acc;  #endif  	/* Used for deferred freeing of ELS data buffers */ @@ -784,6 +940,7 @@ struct lpfc_hba {  	unsigned long skipped_hb;  	struct timer_list hb_tmofunc;  	uint8_t hb_outstanding; +	struct timer_list rrq_tmr;  	enum hba_temp_state over_temp_state;  	/* ndlp reference management */  	spinlock_t ndlp_lock; @@ -808,6 +965,8 @@ struct lpfc_hba {  	atomic_t fast_event_count;  	uint32_t fcoe_eventtag;  	uint32_t fcoe_eventtag_at_fcf_scan; +	uint32_t fcoe_cvl_eventtag; +	uint32_t fcoe_cvl_eventtag_attn;  	struct lpfc_fcf fcf;  	uint8_t fc_map[3];  	uint8_t valid_vlan; @@ -816,7 +975,7 @@ struct lpfc_hba {  	spinlock_t ct_ev_lock; /* synchronize access to ct_ev_waiters */  	struct list_head ct_ev_waiters; -	struct unsol_rcv_ct_ctx ct_ctx[64]; +	struct unsol_rcv_ct_ctx ct_ctx[LPFC_CT_CTX_MAX];  	uint32_t ctx_idx;  	uint8_t menlo_flag;	/* menlo generic flags */ @@ -826,6 +985,9 @@ struct lpfc_hba {  	atomic_t sdev_cnt;  	uint8_t fips_spec_rev;  	uint8_t fips_level; +	spinlock_t devicelock;	/* lock for luns list */ +	mempool_t *device_data_mem_pool; +	struct list_head luns;  };  static inline struct Scsi_Host * @@ -862,7 +1024,18 @@ lpfc_worker_wake_up(struct lpfc_hba *phba)  	return;  } -static inline void +static inline int +lpfc_readl(void __iomem *addr, uint32_t *data) +{ +	uint32_t temp; +	temp = readl(addr); +	if (temp == 0xffffffff) +		return -EIO; +	*data = temp; +	return 0; +} + +static inline int  lpfc_sli_read_hs(struct lpfc_hba *phba)  {  	/* @@ -871,15 +1044,17 @@ lpfc_sli_read_hs(struct lpfc_hba *phba)  	 */  	phba->sli.slistat.err_attn_event++; -	/* Save status info */ -	phba->work_hs = readl(phba->HSregaddr); -	phba->work_status[0] = readl(phba->MBslimaddr + 0xa8); -	phba->work_status[1] = readl(phba->MBslimaddr + 0xac); +	/* Save status info and check for unplug error */ +	if (lpfc_readl(phba->HSregaddr, &phba->work_hs) || +		lpfc_readl(phba->MBslimaddr + 0xa8, &phba->work_status[0]) || +		lpfc_readl(phba->MBslimaddr + 0xac, &phba->work_status[1])) { +		return -EIO; +	}  	/* Clear chip Host Attention error bit */  	writel(HA_ERATT, phba->HAregaddr);  	readl(phba->HAregaddr); /* flush */  	phba->pport->stopped = 1; -	return; +	return 0;  }  | 
