cregit-Linux how code gets into the kernel

Release 4.11 drivers/scsi/ipr.h

Directory: drivers/scsi
/*
 * ipr.h -- driver for IBM Power Linux RAID adapters
 *
 * Written By: Brian King <brking@us.ibm.com>, IBM Corporation
 *
 * Copyright (C) 2003, 2004 IBM Corporation
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 *
 * Alan Cox <alan@lxorguk.ukuu.org.uk> - Removed several careless u32/dma_addr_t errors
 *                              that broke 64bit platforms.
 */

#ifndef _IPR_H

#define _IPR_H

#include <asm/unaligned.h>
#include <linux/types.h>
#include <linux/completion.h>
#include <linux/libata.h>
#include <linux/list.h>
#include <linux/kref.h>
#include <linux/irq_poll.h>
#include <scsi/scsi.h>
#include <scsi/scsi_cmnd.h>

/*
 * Literals
 */

#define IPR_DRIVER_VERSION "2.6.3"

#define IPR_DRIVER_DATE "(October 17, 2015)"

/*
 * IPR_MAX_CMD_PER_LUN: This defines the maximum number of outstanding
 *      ops per device for devices not running tagged command queuing.
 *      This can be adjusted at runtime through sysfs device attributes.
 */

#define IPR_MAX_CMD_PER_LUN				6

#define IPR_MAX_CMD_PER_ATA_LUN			1

/*
 * IPR_NUM_BASE_CMD_BLKS: This defines the maximum number of
 *      ops the mid-layer can send to the adapter.
 */

#define IPR_NUM_BASE_CMD_BLKS			(ioa_cfg->max_cmds)


#define PCI_DEVICE_ID_IBM_OBSIDIAN_E	0x0339


#define PCI_DEVICE_ID_IBM_CROC_FPGA_E2          0x033D

#define PCI_DEVICE_ID_IBM_CROCODILE             0x034A

#define PCI_DEVICE_ID_IBM_RATTLESNAKE		0x04DA


#define IPR_SUBS_DEV_ID_2780	0x0264

#define IPR_SUBS_DEV_ID_5702	0x0266

#define IPR_SUBS_DEV_ID_5703	0x0278

#define IPR_SUBS_DEV_ID_572E	0x028D

#define IPR_SUBS_DEV_ID_573E	0x02D3

#define IPR_SUBS_DEV_ID_573D	0x02D4

#define IPR_SUBS_DEV_ID_571A	0x02C0

#define IPR_SUBS_DEV_ID_571B	0x02BE

#define IPR_SUBS_DEV_ID_571E	0x02BF

#define IPR_SUBS_DEV_ID_571F	0x02D5

#define IPR_SUBS_DEV_ID_572A	0x02C1

#define IPR_SUBS_DEV_ID_572B	0x02C2

#define IPR_SUBS_DEV_ID_572F	0x02C3

#define IPR_SUBS_DEV_ID_574E	0x030A

#define IPR_SUBS_DEV_ID_575B	0x030D

#define IPR_SUBS_DEV_ID_575C	0x0338

#define IPR_SUBS_DEV_ID_57B3	0x033A

#define IPR_SUBS_DEV_ID_57B7	0x0360

#define IPR_SUBS_DEV_ID_57B8	0x02C2


#define IPR_SUBS_DEV_ID_57B4    0x033B

#define IPR_SUBS_DEV_ID_57B2    0x035F

#define IPR_SUBS_DEV_ID_57C0    0x0352

#define IPR_SUBS_DEV_ID_57C3    0x0353

#define IPR_SUBS_DEV_ID_57C4    0x0354

#define IPR_SUBS_DEV_ID_57C6    0x0357

#define IPR_SUBS_DEV_ID_57CC    0x035C


#define IPR_SUBS_DEV_ID_57B5    0x033C

#define IPR_SUBS_DEV_ID_57CE    0x035E

#define IPR_SUBS_DEV_ID_57B1    0x0355


#define IPR_SUBS_DEV_ID_574D    0x0356

#define IPR_SUBS_DEV_ID_57C8    0x035D


#define IPR_SUBS_DEV_ID_57D5    0x03FB

#define IPR_SUBS_DEV_ID_57D6    0x03FC

#define IPR_SUBS_DEV_ID_57D7    0x03FF

#define IPR_SUBS_DEV_ID_57D8    0x03FE

#define IPR_SUBS_DEV_ID_57D9    0x046D

#define IPR_SUBS_DEV_ID_57DA    0x04CA

#define IPR_SUBS_DEV_ID_57EB    0x0474

#define IPR_SUBS_DEV_ID_57EC    0x0475

#define IPR_SUBS_DEV_ID_57ED    0x0499

#define IPR_SUBS_DEV_ID_57EE    0x049A

#define IPR_SUBS_DEV_ID_57EF    0x049B

#define IPR_SUBS_DEV_ID_57F0    0x049C

#define IPR_SUBS_DEV_ID_2CCA	0x04C7

#define IPR_SUBS_DEV_ID_2CD2	0x04C8

#define IPR_SUBS_DEV_ID_2CCD	0x04C9

#define IPR_SUBS_DEV_ID_580A	0x04FC

#define IPR_SUBS_DEV_ID_580B	0x04FB

#define IPR_NAME				"ipr"

/*
 * Return codes
 */

#define IPR_RC_JOB_CONTINUE		1

#define IPR_RC_JOB_RETURN		2

/*
 * IOASCs
 */

#define IPR_IOASC_NR_INIT_CMD_REQUIRED		0x02040200

#define IPR_IOASC_NR_IOA_RESET_REQUIRED		0x02048000

#define IPR_IOASC_SYNC_REQUIRED			0x023f0000

#define IPR_IOASC_MED_DO_NOT_REALLOC		0x03110C00

#define IPR_IOASC_HW_SEL_TIMEOUT			0x04050000

#define IPR_IOASC_HW_DEV_BUS_STATUS			0x04448500

#define	IPR_IOASC_IOASC_MASK			0xFFFFFF00

#define	IPR_IOASC_SCSI_STATUS_MASK		0x000000FF

#define IPR_IOASC_HW_CMD_FAILED			0x046E0000

#define IPR_IOASC_IR_INVALID_REQ_TYPE_OR_PKT	0x05240000

#define IPR_IOASC_IR_RESOURCE_HANDLE		0x05250000

#define IPR_IOASC_IR_NO_CMDS_TO_2ND_IOA		0x05258100

#define IPR_IOASA_IR_DUAL_IOA_DISABLED		0x052C8000

#define IPR_IOASC_BUS_WAS_RESET			0x06290000

#define IPR_IOASC_BUS_WAS_RESET_BY_OTHER		0x06298000

#define IPR_IOASC_ABORTED_CMD_TERM_BY_HOST	0x0B5A0000

#define IPR_IOASC_IR_NON_OPTIMIZED		0x05258200


#define IPR_FIRST_DRIVER_IOASC			0x10000000

#define IPR_IOASC_IOA_WAS_RESET			0x10000001

#define IPR_IOASC_PCI_ACCESS_ERROR			0x10000002

/* Driver data flags */

#define IPR_USE_LONG_TRANSOP_TIMEOUT		0x00000001

#define IPR_USE_PCI_WARM_RESET			0x00000002


#define IPR_DEFAULT_MAX_ERROR_DUMP			984

#define IPR_NUM_LOG_HCAMS				2

#define IPR_NUM_CFG_CHG_HCAMS				2

#define IPR_NUM_HCAM_QUEUE				12

#define IPR_NUM_HCAMS	(IPR_NUM_LOG_HCAMS + IPR_NUM_CFG_CHG_HCAMS)

#define IPR_MAX_HCAMS	(IPR_NUM_HCAMS + IPR_NUM_HCAM_QUEUE)


#define IPR_MAX_SIS64_TARGETS_PER_BUS			1024

#define IPR_MAX_SIS64_LUNS_PER_TARGET			0xffffffff


#define IPR_MAX_NUM_TARGETS_PER_BUS			256

#define IPR_MAX_NUM_LUNS_PER_TARGET			256

#define IPR_VSET_BUS					0xff

#define IPR_IOA_BUS						0xff

#define IPR_IOA_TARGET					0xff

#define IPR_IOA_LUN						0xff

#define IPR_MAX_NUM_BUSES				16


#define IPR_NUM_RESET_RELOAD_RETRIES		3

/* We need resources for HCAMS, IOA reset, IOA bringdown, and ERP */

#define IPR_NUM_INTERNAL_CMD_BLKS	(IPR_NUM_HCAMS + \
                                     ((IPR_NUM_RESET_RELOAD_RETRIES + 1) * 2) + 4)


#define IPR_MAX_COMMANDS		100

#define IPR_NUM_CMD_BLKS		(IPR_NUM_BASE_CMD_BLKS + \
                                                IPR_NUM_INTERNAL_CMD_BLKS)


#define IPR_MAX_PHYSICAL_DEVS				192

#define IPR_DEFAULT_SIS64_DEVS				1024

#define IPR_MAX_SIS64_DEVS				4096


#define IPR_MAX_SGLIST					64

#define IPR_IOA_MAX_SECTORS				32767

#define IPR_VSET_MAX_SECTORS				512

#define IPR_MAX_CDB_LEN					16

#define IPR_MAX_HRRQ_RETRIES				3


#define IPR_DEFAULT_BUS_WIDTH				16

#define IPR_80MBs_SCSI_RATE		((80 * 10) / (IPR_DEFAULT_BUS_WIDTH / 8))

#define IPR_U160_SCSI_RATE	((160 * 10) / (IPR_DEFAULT_BUS_WIDTH / 8))

#define IPR_U320_SCSI_RATE	((320 * 10) / (IPR_DEFAULT_BUS_WIDTH / 8))

#define IPR_MAX_SCSI_RATE(width) ((320 * 10) / ((width) / 8))


#define IPR_IOA_RES_HANDLE				0xffffffff

#define IPR_INVALID_RES_HANDLE			0

#define IPR_IOA_RES_ADDR				0x00ffffff

/*
 * Adapter Commands
 */

#define IPR_CANCEL_REQUEST				0xC0

#define	IPR_CANCEL_64BIT_IOARCB			0x01

#define IPR_QUERY_RSRC_STATE				0xC2

#define IPR_RESET_DEVICE				0xC3

#define	IPR_RESET_TYPE_SELECT				0x80

#define	IPR_LUN_RESET					0x40

#define	IPR_TARGET_RESET					0x20

#define	IPR_BUS_RESET					0x10

#define	IPR_ATA_PHY_RESET					0x80

#define IPR_ID_HOST_RR_Q				0xC4

#define IPR_QUERY_IOA_CONFIG				0xC5

#define IPR_CANCEL_ALL_REQUESTS			0xCE

#define IPR_HOST_CONTROLLED_ASYNC			0xCF

#define	IPR_HCAM_CDB_OP_CODE_CONFIG_CHANGE	0x01

#define	IPR_HCAM_CDB_OP_CODE_LOG_DATA		0x02

#define IPR_SET_SUPPORTED_DEVICES			0xFB

#define IPR_SET_ALL_SUPPORTED_DEVICES			0x80

#define IPR_IOA_SHUTDOWN				0xF7

#define	IPR_WR_BUF_DOWNLOAD_AND_SAVE			0x05

#define IPR_IOA_SERVICE_ACTION				0xD2

/* IOA Service Actions */

#define IPR_IOA_SA_CHANGE_CACHE_PARAMS			0x14

/*
 * Timeouts
 */

#define IPR_SHUTDOWN_TIMEOUT			(ipr_fastfail ? 60 * HZ : 10 * 60 * HZ)

#define IPR_VSET_RW_TIMEOUT			(ipr_fastfail ? 30 * HZ : 2 * 60 * HZ)

#define IPR_ABBREV_SHUTDOWN_TIMEOUT		(10 * HZ)

#define IPR_DUAL_IOA_ABBR_SHUTDOWN_TO	(2 * 60 * HZ)

#define IPR_DEVICE_RESET_TIMEOUT		(ipr_fastfail ? 10 * HZ : 30 * HZ)

#define IPR_CANCEL_TIMEOUT			(ipr_fastfail ? 10 * HZ : 30 * HZ)

#define IPR_CANCEL_ALL_TIMEOUT		(ipr_fastfail ? 10 * HZ : 30 * HZ)

#define IPR_ABORT_TASK_TIMEOUT		(ipr_fastfail ? 10 * HZ : 30 * HZ)

#define IPR_INTERNAL_TIMEOUT			(ipr_fastfail ? 10 * HZ : 30 * HZ)

#define IPR_WRITE_BUFFER_TIMEOUT		(30 * 60 * HZ)

#define IPR_SET_SUP_DEVICE_TIMEOUT		(2 * 60 * HZ)

#define IPR_REQUEST_SENSE_TIMEOUT		(10 * HZ)

#define IPR_OPERATIONAL_TIMEOUT		(5 * 60)

#define IPR_LONG_OPERATIONAL_TIMEOUT	(12 * 60)

#define IPR_WAIT_FOR_RESET_TIMEOUT		(2 * HZ)

#define IPR_CHECK_FOR_RESET_TIMEOUT		(HZ / 10)

#define IPR_WAIT_FOR_BIST_TIMEOUT		(2 * HZ)

#define IPR_PCI_ERROR_RECOVERY_TIMEOUT	(120 * HZ)

#define IPR_PCI_RESET_TIMEOUT			(HZ / 2)

#define IPR_SIS32_DUMP_TIMEOUT			(15 * HZ)

#define IPR_SIS64_DUMP_TIMEOUT			(40 * HZ)

#define IPR_DUMP_DELAY_SECONDS			4

#define IPR_DUMP_DELAY_TIMEOUT			(IPR_DUMP_DELAY_SECONDS * HZ)

/*
 * SCSI Literals
 */

#define IPR_VENDOR_ID_LEN			8

#define IPR_PROD_ID_LEN				16

#define IPR_SERIAL_NUM_LEN			8

/*
 * Hardware literals
 */

#define IPR_FMT2_MBX_ADDR_MASK				0x0fffffff

#define IPR_FMT2_MBX_BAR_SEL_MASK			0xf0000000

#define IPR_FMT2_MKR_BAR_SEL_SHIFT			28

#define IPR_GET_FMT2_BAR_SEL(mbx) \
(((mbx) & IPR_FMT2_MBX_BAR_SEL_MASK) >> IPR_FMT2_MKR_BAR_SEL_SHIFT)

#define IPR_SDT_FMT2_BAR0_SEL				0x0

#define IPR_SDT_FMT2_BAR1_SEL				0x1

#define IPR_SDT_FMT2_BAR2_SEL				0x2

#define IPR_SDT_FMT2_BAR3_SEL				0x3

#define IPR_SDT_FMT2_BAR4_SEL				0x4

#define IPR_SDT_FMT2_BAR5_SEL				0x5

#define IPR_SDT_FMT2_EXP_ROM_SEL			0x8

#define IPR_FMT2_SDT_READY_TO_USE			0xC4D4E3F2

#define IPR_FMT3_SDT_READY_TO_USE			0xC4D4E3F3

#define IPR_DOORBELL					0x82800000

#define IPR_RUNTIME_RESET				0x40000000


#define IPR_IPL_INIT_MIN_STAGE_TIME			5

#define IPR_IPL_INIT_DEFAULT_STAGE_TIME                 30

#define IPR_IPL_INIT_STAGE_UNKNOWN			0x0

#define IPR_IPL_INIT_STAGE_TRANSOP			0xB0000000

#define IPR_IPL_INIT_STAGE_MASK				0xff000000

#define IPR_IPL_INIT_STAGE_TIME_MASK			0x0000ffff

#define IPR_PCII_IPL_STAGE_CHANGE			(0x80000000 >> 0)


#define IPR_PCII_MAILBOX_STABLE				(0x80000000 >> 4)

#define IPR_WAIT_FOR_MAILBOX				(2 * HZ)


#define IPR_PCII_IOA_TRANS_TO_OPER			(0x80000000 >> 0)

#define IPR_PCII_IOARCB_XFER_FAILED			(0x80000000 >> 3)

#define IPR_PCII_IOA_UNIT_CHECKED			(0x80000000 >> 4)

#define IPR_PCII_NO_HOST_RRQ				(0x80000000 >> 5)

#define IPR_PCII_CRITICAL_OPERATION			(0x80000000 >> 6)

#define IPR_PCII_IO_DEBUG_ACKNOWLEDGE		(0x80000000 >> 7)

#define IPR_PCII_IOARRIN_LOST				(0x80000000 >> 27)

#define IPR_PCII_MMIO_ERROR				(0x80000000 >> 28)

#define IPR_PCII_PROC_ERR_STATE			(0x80000000 >> 29)

#define IPR_PCII_HRRQ_UPDATED				(0x80000000 >> 30)

#define IPR_PCII_CORE_ISSUED_RST_REQ		(0x80000000 >> 31)


#define IPR_PCII_ERROR_INTERRUPTS \
(IPR_PCII_IOARCB_XFER_FAILED | IPR_PCII_IOA_UNIT_CHECKED | \
IPR_PCII_NO_HOST_RRQ | IPR_PCII_IOARRIN_LOST | IPR_PCII_MMIO_ERROR)


#define IPR_PCII_OPER_INTERRUPTS \
(IPR_PCII_ERROR_INTERRUPTS | IPR_PCII_HRRQ_UPDATED | IPR_PCII_IOA_TRANS_TO_OPER)


#define IPR_UPROCI_RESET_ALERT			(0x80000000 >> 7)

#define IPR_UPROCI_IO_DEBUG_ALERT			(0x80000000 >> 9)

#define IPR_UPROCI_SIS64_START_BIST			(0x80000000 >> 23)


#define IPR_LDUMP_MAX_LONG_ACK_DELAY_IN_USEC		200000	
/* 200 ms */

#define IPR_LDUMP_MAX_SHORT_ACK_DELAY_IN_USEC		200000	
/* 200 ms */

/*
 * Dump literals
 */

#define IPR_FMT2_MAX_IOA_DUMP_SIZE			(4 * 1024 * 1024)

#define IPR_FMT3_MAX_IOA_DUMP_SIZE			(80 * 1024 * 1024)

#define IPR_FMT2_NUM_SDT_ENTRIES			511

#define IPR_FMT3_NUM_SDT_ENTRIES			0xFFF

#define IPR_FMT2_MAX_NUM_DUMP_PAGES	((IPR_FMT2_MAX_IOA_DUMP_SIZE / PAGE_SIZE) + 1)

#define IPR_FMT3_MAX_NUM_DUMP_PAGES	((IPR_FMT3_MAX_IOA_DUMP_SIZE / PAGE_SIZE) + 1)

/*
 * Misc literals
 */

#define IPR_NUM_IOADL_ENTRIES			IPR_MAX_SGLIST

#define IPR_MAX_MSIX_VECTORS		0x10

#define IPR_MAX_HRRQ_NUM		0x10

#define IPR_INIT_HRRQ			0x0

/*
 * Adapter interface types
 */


struct ipr_res_addr {
	
u8 reserved;
	
u8 bus;
	
u8 target;
	
u8 lun;

#define IPR_GET_PHYS_LOC(res_addr) \
	(((res_addr).bus << 16) | ((res_addr).target << 8) | (res_addr).lun)
}__attribute__((packed, aligned (4)));


struct ipr_std_inq_vpids {
	
u8 vendor_id[IPR_VENDOR_ID_LEN];
	
u8 product_id[IPR_PROD_ID_LEN];
}__attribute__((packed));


struct ipr_vpd {
	
struct ipr_std_inq_vpids vpids;
	
u8 sn[IPR_SERIAL_NUM_LEN];
}__attribute__((packed));


struct ipr_ext_vpd {
	
struct ipr_vpd vpd;
	
__be32 wwid[2];
}__attribute__((packed));


struct ipr_ext_vpd64 {
	
struct ipr_vpd vpd;
	
__be32 wwid[4];
}__attribute__((packed));


struct ipr_std_inq_data {
	
u8 peri_qual_dev_type;

#define IPR_STD_INQ_PERI_QUAL(peri) ((peri) >> 5)

#define IPR_STD_INQ_PERI_DEV_TYPE(peri) ((peri) & 0x1F)

	
u8 removeable_medium_rsvd;

#define IPR_STD_INQ_REMOVEABLE_MEDIUM 0x80


#define IPR_IS_DASD_DEVICE(std_inq) \
((IPR_STD_INQ_PERI_DEV_TYPE((std_inq).peri_qual_dev_type) == TYPE_DISK) && \
!(((std_inq).removeable_medium_rsvd) & IPR_STD_INQ_REMOVEABLE_MEDIUM))


#define IPR_IS_SES_DEVICE(std_inq) \
(IPR_STD_INQ_PERI_DEV_TYPE((std_inq).peri_qual_dev_type) == TYPE_ENCLOSURE)

	
u8 version;
	
u8 aen_naca_fmt;
	
u8 additional_len;
	
u8 sccs_rsvd;
	
u8 bq_enc_multi;
	
u8 sync_cmdq_flags;

	
struct ipr_std_inq_vpids vpids;

	
u8 ros_rsvd_ram_rsvd[4];

	
u8 serial_num[IPR_SERIAL_NUM_LEN];
}__attribute__ ((packed));


#define IPR_RES_TYPE_AF_DASD		0x00

#define IPR_RES_TYPE_GENERIC_SCSI	0x01

#define IPR_RES_TYPE_VOLUME_SET		0x02

#define IPR_RES_TYPE_REMOTE_AF_DASD	0x03

#define IPR_RES_TYPE_GENERIC_ATA	0x04

#define IPR_RES_TYPE_ARRAY		0x05

#define IPR_RES_TYPE_IOAFP		0xff


struct ipr_config_table_entry {
	
u8 proto;

#define IPR_PROTO_SATA			0x02

#define IPR_PROTO_SATA_ATAPI		0x03

#define IPR_PROTO_SAS_STP		0x06

#define IPR_PROTO_SAS_STP_ATAPI		0x07
	
u8 array_id;
	
u8 flags;

#define IPR_IS_IOA_RESOURCE		0x80
	
u8 rsvd_subtype;


#define IPR_QUEUEING_MODEL(res)	((((res)->flags) & 0x70) >> 4)

#define IPR_QUEUE_FROZEN_MODEL		0

#define IPR_QUEUE_NACA_MODEL		1

	
struct ipr_res_addr res_addr;
	
__be32 res_handle;
	
__be32 lun_wwn[2];
	
struct ipr_std_inq_data std_inq_data;
}__attribute__ ((packed, aligned (4)));


struct ipr_config_table_entry64 {
	
u8 res_type;
	
u8 proto;
	
u8 vset_num;
	
u8 array_id;
	
__be16 flags;
	
__be16 res_flags;

#define IPR_QUEUEING_MODEL64(res) ((((res)->res_flags) & 0x7000) >> 12)
	
__be32 res_handle;
	
u8 dev_id_type;
	
u8 reserved[3];
	
__be64 dev_id;
	
__be64 lun;
	
__be64 lun_wwn[2];

#define IPR_MAX_RES_PATH_LENGTH		48
	
__be64 res_path;
	
struct ipr_std_inq_data std_inq_data;
	
u8 reserved2[4];
	
__be64 reserved3[2];
	
u8 reserved4[8];
}__attribute__ ((packed, aligned (8)));


struct ipr_config_table_hdr {
	
u8 num_entries;
	
u8 flags;

#define IPR_UCODE_DOWNLOAD_REQ	0x10
	
__be16 reserved;
}__attribute__((packed, aligned (4)));


struct ipr_config_table_hdr64 {
	
__be16 num_entries;
	
__be16 reserved;
	
u8 flags;
	
u8 reserved2[11];
}__attribute__((packed, aligned (4)));


struct ipr_config_table {
	
struct ipr_config_table_hdr hdr;
	
struct ipr_config_table_entry dev[0];
}__attribute__((packed, aligned (4)));


struct ipr_config_table64 {
	
struct ipr_config_table_hdr64 hdr64;
	
struct ipr_config_table_entry64 dev[0];
}__attribute__((packed, aligned (8)));


struct ipr_config_table_entry_wrapper {
	union {
		
struct ipr_config_table_entry *cfgte;
		
struct ipr_config_table_entry64 *cfgte64;
	} 
u;
};


struct ipr_hostrcb_cfg_ch_not {
	union {
		
struct ipr_config_table_entry cfgte;
		
struct ipr_config_table_entry64 cfgte64;
	} 
u;
	
u8 reserved[936];
}__attribute__((packed, aligned (4)));


struct ipr_supported_device {
	
__be16 data_length;
	
u8 reserved;
	
u8 num_records;
	
struct ipr_std_inq_vpids vpids;
	
u8 reserved2[16];
}__attribute__((packed, aligned (4)));


struct ipr_hrr_queue {
	
struct ipr_ioa_cfg *ioa_cfg;
	
__be32 *host_rrq;
	
dma_addr_t host_rrq_dma;

#define IPR_HRRQ_REQ_RESP_HANDLE_MASK	0xfffffffc

#define IPR_HRRQ_RESP_BIT_SET		0x00000002

#define IPR_HRRQ_TOGGLE_BIT		0x00000001

#define IPR_HRRQ_REQ_RESP_HANDLE_SHIFT	2

#define IPR_ID_HRRQ_SELE_ENABLE		0x02
	
volatile __be32 *hrrq_start;
	
volatile __be32 *hrrq_end;
	
volatile __be32 *hrrq_curr;

	
struct list_head hrrq_free_q;
	
struct list_head hrrq_pending_q;
	
spinlock_t _lock;
	
spinlock_t *lock;

	
volatile u32 toggle_bit;
	
u32 size;
	
u32 min_cmd_id;
	
u32 max_cmd_id;
	
u8 allow_interrupts:1;
	
u8 ioa_is_dead:1;
	
u8 allow_cmds:1;
	
u8 removing_ioa:1;

	
struct irq_poll iopoll;
};

/* Command packet structure */

struct ipr_cmd_pkt {
	
u8 reserved;		/* Reserved by IOA */
	
u8 hrrq_id;
	
u8 request_type;

#define IPR_RQTYPE_SCSICDB		0x00

#define IPR_RQTYPE_IOACMD		0x01

#define IPR_RQTYPE_HCAM			0x02

#define IPR_RQTYPE_ATA_PASSTHRU	0x04

#define IPR_RQTYPE_PIPE			0x05

	
u8 reserved2;

	
u8 flags_hi;

#define IPR_FLAGS_HI_WRITE_NOT_READ		0x80

#define IPR_FLAGS_HI_NO_ULEN_CHK		0x20

#define IPR_FLAGS_HI_SYNC_OVERRIDE		0x10

#define IPR_FLAGS_HI_SYNC_COMPLETE		0x08

#define IPR_FLAGS_HI_NO_LINK_DESC		0x04

	
u8 flags_lo;

#define IPR_FLAGS_LO_ALIGNED_BFR		0x20

#define IPR_FLAGS_LO_DELAY_AFTER_RST		0x10

#define IPR_FLAGS_LO_UNTAGGED_TASK		0x00

#define IPR_FLAGS_LO_SIMPLE_TASK		0x02

#define IPR_FLAGS_LO_ORDERED_TASK		0x04

#define IPR_FLAGS_LO_HEAD_OF_Q_TASK		0x06

#define IPR_FLAGS_LO_ACA_TASK			0x08

	
u8 cdb[16];
	
__be16 timeout;
}__attribute__ ((packed, aligned(4)));


struct ipr_ioarcb_ata_regs {	/* 22 bytes */
	
u8 flags;

#define IPR_ATA_FLAG_PACKET_CMD			0x80

#define IPR_ATA_FLAG_XFER_TYPE_DMA			0x40

#define IPR_ATA_FLAG_STATUS_ON_GOOD_COMPLETION	0x20
	
u8 reserved[3];

	
__be16 data;
	
u8 feature;
	
u8 nsect;
	
u8 lbal;
	
u8 lbam;
	
u8 lbah;
	
u8 device;
	
u8 command;
	
u8 reserved2[3];
	
u8 hob_feature;
	
u8 hob_nsect;
	
u8 hob_lbal;
	
u8 hob_lbam;
	
u8 hob_lbah;
	
u8 ctl;
}__attribute__ ((packed, aligned(2)));


struct ipr_ioadl_desc {
	
__be32 flags_and_data_len;

#define IPR_IOADL_FLAGS_MASK		0xff000000

#define IPR_IOADL_GET_FLAGS(x) (be32_to_cpu(x) & IPR_IOADL_FLAGS_MASK)

#define IPR_IOADL_DATA_LEN_MASK		0x00ffffff

#define IPR_IOADL_GET_DATA_LEN(x) (be32_to_cpu(x) & IPR_IOADL_DATA_LEN_MASK)

#define IPR_IOADL_FLAGS_READ		0x48000000

#define IPR_IOADL_FLAGS_READ_LAST	0x49000000

#define IPR_IOADL_FLAGS_WRITE		0x68000000

#define IPR_IOADL_FLAGS_WRITE_LAST	0x69000000

#define IPR_IOADL_FLAGS_LAST		0x01000000

	
__be32 address;
}__attribute__((packed, aligned (8)));


struct ipr_ioadl64_desc {
	
__be32 flags;
	
__be32 data_len;
	
__be64 address;
}__attribute__((packed, aligned (16)));


struct ipr_ata64_ioadl {
	
struct ipr_ioarcb_ata_regs regs;
	
u16 reserved[5];
	
struct ipr_ioadl64_desc ioadl64[IPR_NUM_IOADL_ENTRIES];
}__attribute__((packed, aligned (16)));


struct ipr_ioarcb_add_data {
	union {
		
struct ipr_ioarcb_ata_regs regs;
		
struct ipr_ioadl_desc ioadl[5];
		
__be32 add_cmd_parms[10];
	} 
u;
}__attribute__ ((packed, aligned (4)));


struct ipr_ioarcb_sis64_add_addr_ecb {
	
__be64 ioasa_host_pci_addr;
	
__be64 data_ioadl_addr;
	
__be64 reserved;
	
__be32 ext_control_buf[4];
}__attribute__((packed, aligned (8)));

/* IOA Request Control Block    128 bytes  */

struct ipr_ioarcb {
	union {
		
__be32 ioarcb_host_pci_addr;
		
__be64 ioarcb_host_pci_addr64;
	} 
a;
	
__be32 res_handle;
	
__be32 host_response_handle;
	
__be32 reserved1;
	
__be32 reserved2;
	
__be32 reserved3;

	
__be32 data_transfer_length;
	
__be32 read_data_transfer_length;
	
__be32 write_ioadl_addr;
	
__be32 ioadl_len;
	
__be32 read_ioadl_addr;
	
__be32 read_ioadl_len;

	
__be32 ioasa_host_pci_addr;
	
__be16 ioasa_len;
	
__be16 reserved4;

	
struct ipr_cmd_pkt cmd_pkt;

	
__be16 add_cmd_parms_offset;
	
__be16 add_cmd_parms_len;

	union {
		
struct ipr_ioarcb_add_data add_data;
		
struct ipr_ioarcb_sis64_add_addr_ecb sis64_addr_data;
	} 
u;

}__attribute__((packed, aligned (4)));


struct ipr_ioasa_vset {
	
__be32 failing_lba_hi;
	
__be32 failing_lba_lo;
	
__be32 reserved;
}__attribute__((packed, aligned (4)));


struct ipr_ioasa_af_dasd {
	
__be32 failing_lba;
	
__be32 reserved[2];
}__attribute__((packed, aligned (4)));


struct ipr_ioasa_gpdd {
	
u8 end_state;
	
u8 bus_phase;
	
__be16 reserved;
	
__be32 ioa_data[2];
}__attribute__((packed, aligned (4)));


struct ipr_ioasa_gata {
	
u8 error;
	
u8 nsect;		/* Interrupt reason */
	
u8 lbal;
	
u8 lbam;
	
u8 lbah;
	
u8 device;
	
u8 status;
	
u8 alt_status;	/* ATA CTL */
	
u8 hob_nsect;
	
u8 hob_lbal;
	
u8 hob_lbam;
	
u8 hob_lbah;
}__attribute__((packed, aligned (4)));


struct ipr_auto_sense {
	
__be16 auto_sense_len;
	
__be16 ioa_data_len;
	
__be32 data[SCSI_SENSE_BUFFERSIZE/sizeof(__be32)];
};


struct ipr_ioasa_hdr {
	
__be32 ioasc;

#define IPR_IOASC_SENSE_KEY(ioasc) ((ioasc) >> 24)

#define IPR_IOASC_SENSE_CODE(ioasc) (((ioasc) & 0x00ff0000) >> 16)

#define IPR_IOASC_SENSE_QUAL(ioasc) (((ioasc) & 0x0000ff00) >> 8)

#define IPR_IOASC_SENSE_STATUS(ioasc) ((ioasc) & 0x000000ff)

	
__be16 ret_stat_len;	/* Length of the returned IOASA */

	
__be16 avail_stat_len;	/* Total Length of status available. */

	
__be32 residual_data_len;	/* number of bytes in the host data */
	/* buffers that were not used by the IOARCB command. */

	
__be32 ilid;

#define IPR_NO_ILID			0

#define IPR_DRIVER_ILID		0xffffffff

	
__be32 fd_ioasc;

	
__be32 fd_phys_locator;

	
__be32 fd_res_handle;

	
__be32 ioasc_specific;	/* status code specific field */

#define IPR_ADDITIONAL_STATUS_FMT		0x80000000

#define IPR_AUTOSENSE_VALID			0x40000000

#define IPR_ATA_DEVICE_WAS_RESET		0x20000000

#define IPR_IOASC_SPECIFIC_MASK		0x00ffffff

#define IPR_FIELD_POINTER_VALID		(0x80000000 >> 8)

#define IPR_FIELD_POINTER_MASK		0x0000ffff

}__attribute__((packed, aligned (4)));


struct ipr_ioasa {
	
struct ipr_ioasa_hdr hdr;

	union {
		
struct ipr_ioasa_vset vset;
		
struct ipr_ioasa_af_dasd dasd;
		
struct ipr_ioasa_gpdd gpdd;
		
struct ipr_ioasa_gata gata;
	} 
u;

	
struct ipr_auto_sense auto_sense;
}__attribute__((packed, aligned (4)));


struct ipr_ioasa64 {
	
struct ipr_ioasa_hdr hdr;
	
u8 fd_res_path[8];

	union {
		
struct ipr_ioasa_vset vset;
		
struct ipr_ioasa_af_dasd dasd;
		
struct ipr_ioasa_gpdd gpdd;
		
struct ipr_ioasa_gata gata;
	} 
u;

	
struct ipr_auto_sense auto_sense;
}__attribute__((packed, aligned (4)));


struct ipr_mode_parm_hdr {
	
u8 length;
	
u8 medium_type;
	
u8 device_spec_parms;
	
u8 block_desc_len;
}__attribute__((packed));


struct ipr_mode_pages {
	
struct ipr_mode_parm_hdr hdr;
	
u8 data[255 - sizeof(struct ipr_mode_parm_hdr)];
}__attribute__((packed));


struct ipr_mode_page_hdr {
	
u8 ps_page_code;

#define IPR_MODE_PAGE_PS	0x80

#define IPR_GET_MODE_PAGE_CODE(hdr) ((hdr)->ps_page_code & 0x3F)
	
u8 page_length;
}__attribute__ ((packed));


struct ipr_dev_bus_entry {
	
struct ipr_res_addr res_addr;
	
u8 flags;

#define IPR_SCSI_ATTR_ENABLE_QAS			0x80

#define IPR_SCSI_ATTR_DISABLE_QAS			0x40

#define IPR_SCSI_ATTR_QAS_MASK				0xC0

#define IPR_SCSI_ATTR_ENABLE_TM				0x20

#define IPR_SCSI_ATTR_NO_TERM_PWR			0x10

#define IPR_SCSI_ATTR_TM_SUPPORTED			0x08

#define IPR_SCSI_ATTR_LVD_TO_SE_NOT_ALLOWED	0x04

	
u8 scsi_id;
	
u8 bus_width;
	
u8 extended_reset_delay;

#define IPR_EXTENDED_RESET_DELAY	7

	
__be32 max_xfer_rate;

	
u8 spinup_delay;
	
u8 reserved3;
	
__be16 reserved4;
}__attribute__((packed, aligned (4)));


struct ipr_mode_page28 {
	
struct ipr_mode_page_hdr hdr;
	
u8 num_entries;
	
u8 entry_length;
	
struct ipr_dev_bus_entry bus[0];