diff options
Diffstat (limited to 'drivers/scsi/pm8001/pm8001_sas.h')
| -rw-r--r-- | drivers/scsi/pm8001/pm8001_sas.h | 95 | 
1 files changed, 91 insertions, 4 deletions
diff --git a/drivers/scsi/pm8001/pm8001_sas.h b/drivers/scsi/pm8001/pm8001_sas.h index 570819464d9..1ee06f21803 100644 --- a/drivers/scsi/pm8001/pm8001_sas.h +++ b/drivers/scsi/pm8001/pm8001_sas.h @@ -104,6 +104,9 @@ do {						\  #define DEV_IS_EXPANDER(type)	((type == SAS_EDGE_EXPANDER_DEVICE) || (type == SAS_FANOUT_EXPANDER_DEVICE)) +#define IS_SPCV_12G(dev)	((dev->device == 0X8074)		\ +				|| (dev->device == 0X8076)		\ +				|| (dev->device == 0X8077))  #define PM8001_NAME_LENGTH		32/* generic length of strings */  extern struct list_head hba_list; @@ -129,6 +132,61 @@ struct pm8001_ioctl_payload {  	u8	*func_specific;  }; +#define MPI_FATAL_ERROR_TABLE_OFFSET_MASK 0xFFFFFF +#define MPI_FATAL_ERROR_TABLE_SIZE(value) ((0xFF000000 & value) >> SHIFT24) +#define MPI_FATAL_EDUMP_TABLE_LO_OFFSET            0x00     /* HNFBUFL */ +#define MPI_FATAL_EDUMP_TABLE_HI_OFFSET            0x04     /* HNFBUFH */ +#define MPI_FATAL_EDUMP_TABLE_LENGTH               0x08     /* HNFBLEN */ +#define MPI_FATAL_EDUMP_TABLE_HANDSHAKE            0x0C     /* FDDHSHK */ +#define MPI_FATAL_EDUMP_TABLE_STATUS               0x10     /* FDDTSTAT */ +#define MPI_FATAL_EDUMP_TABLE_ACCUM_LEN            0x14     /* ACCDDLEN */ +#define MPI_FATAL_EDUMP_HANDSHAKE_RDY              0x1 +#define MPI_FATAL_EDUMP_HANDSHAKE_BUSY             0x0 +#define MPI_FATAL_EDUMP_TABLE_STAT_RSVD                 0x0 +#define MPI_FATAL_EDUMP_TABLE_STAT_DMA_FAILED           0x1 +#define MPI_FATAL_EDUMP_TABLE_STAT_NF_SUCCESS_MORE_DATA 0x2 +#define MPI_FATAL_EDUMP_TABLE_STAT_NF_SUCCESS_DONE      0x3 +#define TYPE_GSM_SPACE        1 +#define TYPE_QUEUE            2 +#define TYPE_FATAL            3 +#define TYPE_NON_FATAL        4 +#define TYPE_INBOUND          1 +#define TYPE_OUTBOUND         2 +struct forensic_data { +	u32  data_type; +	union { +		struct { +			u32  direct_len; +			u32  direct_offset; +			void  *direct_data; +		} gsm_buf; +		struct { +			u16  queue_type; +			u16  queue_index; +			u32  direct_len; +			void  *direct_data; +		} queue_buf; +		struct { +			u32  direct_len; +			u32  direct_offset; +			u32  read_len; +			void  *direct_data; +		} data_buf; +	}; +}; + +/* bit31-26 - mask bar */ +#define SCRATCH_PAD0_BAR_MASK                    0xFC000000 +/* bit25-0  - offset mask */ +#define SCRATCH_PAD0_OFFSET_MASK                 0x03FFFFFF +/* if AAP error state */ +#define SCRATCH_PAD0_AAPERR_MASK                 0xFFFFFFFF +/* Inbound doorbell bit7 */ +#define SPCv_MSGU_CFG_TABLE_NONFATAL_DUMP	 0x80 +/* Inbound doorbell bit7 SPCV */ +#define SPCV_MSGU_CFG_TABLE_TRANSFER_DEBUG_INFO  0x80 +#define MAIN_MERRDCTO_MERRDCES		         0xA0/* DWORD 0x28) */ +  struct pm8001_dispatch {  	char *name;  	int (*chip_init)(struct pm8001_hba_info *pm8001_ha); @@ -343,6 +401,7 @@ union main_cfg_table {  	u32			phy_attr_table_offset;  	u32			port_recovery_timer;  	u32			interrupt_reassertion_delay; +	u32			fatal_n_non_fatal_dump;	        /* 0x28 */  	} pm80xx_tbl;  }; @@ -407,6 +466,10 @@ struct pm8001_hba_memspace {  	u64			membase;  	u32			memsize;  }; +struct isr_param { +	struct pm8001_hba_info *drv_inst; +	u32 irq_id; +};  struct pm8001_hba_info {  	char			name[PM8001_NAME_LENGTH];  	struct list_head	list; @@ -417,6 +480,13 @@ struct pm8001_hba_info {  	struct pm8001_hba_memspace io_mem[6];  	struct mpi_mem_req	memoryMap;  	struct encrypt		encrypt_info; /* support encryption */ +	struct forensic_data	forensic_info; +	u32			fatal_bar_loc; +	u32			forensic_last_offset; +	u32			fatal_forensic_shift_offset; +	u32			forensic_fatal_step; +	u32			evtlog_ib_offset; +	u32			evtlog_ob_offset;  	void __iomem	*msg_unit_tbl_addr;/*Message Unit Table Addr*/  	void __iomem	*main_cfg_tbl_addr;/*Main Config Table Addr*/  	void __iomem	*general_stat_tbl_addr;/*General Status Table Addr*/ @@ -425,6 +495,7 @@ struct pm8001_hba_info {  	void __iomem	*pspa_q_tbl_addr;  			/*MPI SAS PHY attributes Queue Config Table Addr*/  	void __iomem	*ivt_tbl_addr; /*MPI IVT Table Addr */ +	void __iomem	*fatal_tbl_addr; /*MPI IVT Table Addr */  	union main_cfg_table	main_cfg_tbl;  	union general_status_table	gs_tbl;  	struct inbound_queue_table	inbnd_q_tbl[PM8001_MAX_SPCV_INB_NUM]; @@ -452,14 +523,13 @@ struct pm8001_hba_info {  	int			number_of_intr;/*will be used in remove()*/  #endif  #ifdef PM8001_USE_TASKLET -	struct tasklet_struct	tasklet; +	struct tasklet_struct	tasklet[PM8001_MAX_MSIX_VEC];  #endif  	u32			logging_level;  	u32			fw_status;  	u32			smp_exp_mode; -	u32			int_vector;  	const struct firmware 	*fw_image; -	u8			outq[PM8001_MAX_MSIX_VEC]; +	struct isr_param irq_vector[PM8001_MAX_MSIX_VEC];  };  struct pm8001_work { @@ -629,9 +699,26 @@ struct pm8001_device *pm8001_find_dev(struct pm8001_hba_info *pm8001_ha,  int pm80xx_set_thermal_config(struct pm8001_hba_info *pm8001_ha);  int pm8001_bar4_shift(struct pm8001_hba_info *pm8001_ha, u32 shiftValue); - +void pm8001_set_phy_profile(struct pm8001_hba_info *pm8001_ha, +	u32 length, u8 *buf); +int pm80xx_bar4_shift(struct pm8001_hba_info *pm8001_ha, u32 shiftValue); +ssize_t pm80xx_get_fatal_dump(struct device *cdev, +		struct device_attribute *attr, char *buf); +ssize_t pm8001_get_gsm_dump(struct device *cdev, u32, char *buf);  /* ctl shared API */  extern struct device_attribute *pm8001_host_attrs[]; +static inline void +pm8001_ccb_task_free_done(struct pm8001_hba_info *pm8001_ha, +			struct sas_task *task, struct pm8001_ccb_info *ccb, +			u32 ccb_idx) +{ +	pm8001_ccb_task_free(pm8001_ha, task, ccb, ccb_idx); +	smp_mb(); /*in order to force CPU ordering*/ +	spin_unlock(&pm8001_ha->lock); +	task->task_done(task); +	spin_lock(&pm8001_ha->lock); +} +  #endif  | 
