xref: /openbmc/linux/drivers/scsi/ipr.h (revision 1ac731c529cd4d6adbce134754b51ff7d822b145)
11a59d1b8SThomas Gleixner /* SPDX-License-Identifier: GPL-2.0-or-later */
21da177e4SLinus Torvalds /*
31da177e4SLinus Torvalds  * ipr.h -- driver for IBM Power Linux RAID adapters
41da177e4SLinus Torvalds  *
51da177e4SLinus Torvalds  * Written By: Brian King <brking@us.ibm.com>, IBM Corporation
61da177e4SLinus Torvalds  *
71da177e4SLinus Torvalds  * Copyright (C) 2003, 2004 IBM Corporation
81da177e4SLinus Torvalds  *
9fa195afeSAlan Cox  * Alan Cox <alan@lxorguk.ukuu.org.uk> - Removed several careless u32/dma_addr_t errors
101da177e4SLinus Torvalds  *				that broke 64bit platforms.
111da177e4SLinus Torvalds  */
121da177e4SLinus Torvalds 
131da177e4SLinus Torvalds #ifndef _IPR_H
141da177e4SLinus Torvalds #define _IPR_H
151da177e4SLinus Torvalds 
1646d74563SWayne Boyer #include <asm/unaligned.h>
171da177e4SLinus Torvalds #include <linux/types.h>
181da177e4SLinus Torvalds #include <linux/completion.h>
191da177e4SLinus Torvalds #include <linux/list.h>
201da177e4SLinus Torvalds #include <linux/kref.h>
21511cbce2SChristoph Hellwig #include <linux/irq_poll.h>
221da177e4SLinus Torvalds #include <scsi/scsi.h>
231da177e4SLinus Torvalds #include <scsi/scsi_cmnd.h>
241da177e4SLinus Torvalds 
251da177e4SLinus Torvalds /*
261da177e4SLinus Torvalds  * Literals
271da177e4SLinus Torvalds  */
2816a20b52SBrian King #define IPR_DRIVER_VERSION "2.6.4"
2916a20b52SBrian King #define IPR_DRIVER_DATE "(March 14, 2017)"
301da177e4SLinus Torvalds 
311da177e4SLinus Torvalds /*
321da177e4SLinus Torvalds  * IPR_MAX_CMD_PER_LUN: This defines the maximum number of outstanding
331da177e4SLinus Torvalds  *	ops per device for devices not running tagged command queuing.
341da177e4SLinus Torvalds  *	This can be adjusted at runtime through sysfs device attributes.
351da177e4SLinus Torvalds  */
361da177e4SLinus Torvalds #define IPR_MAX_CMD_PER_LUN				6
371da177e4SLinus Torvalds 
381da177e4SLinus Torvalds /*
391da177e4SLinus Torvalds  * IPR_NUM_BASE_CMD_BLKS: This defines the maximum number of
401da177e4SLinus Torvalds  *	ops the mid-layer can send to the adapter.
411da177e4SLinus Torvalds  */
4289aad428SBrian King #define IPR_NUM_BASE_CMD_BLKS			(ioa_cfg->max_cmds)
431da177e4SLinus Torvalds 
4460e7486bSBrian King #define PCI_DEVICE_ID_IBM_OBSIDIAN_E	0x0339
45d7b4627fSWayne Boyer 
46d7b4627fSWayne Boyer #define PCI_DEVICE_ID_IBM_CROC_FPGA_E2          0x033D
47cd9b3d04SWayne Boyer #define PCI_DEVICE_ID_IBM_CROCODILE             0x034A
4800da9ffaSWen Xiong #define PCI_DEVICE_ID_IBM_RATTLESNAKE		0x04DA
4960e7486bSBrian King 
501da177e4SLinus Torvalds #define IPR_SUBS_DEV_ID_2780	0x0264
511da177e4SLinus Torvalds #define IPR_SUBS_DEV_ID_5702	0x0266
521da177e4SLinus Torvalds #define IPR_SUBS_DEV_ID_5703	0x0278
531da177e4SLinus Torvalds #define IPR_SUBS_DEV_ID_572E	0x028D
541da177e4SLinus Torvalds #define IPR_SUBS_DEV_ID_573E	0x02D3
551da177e4SLinus Torvalds #define IPR_SUBS_DEV_ID_573D	0x02D4
561da177e4SLinus Torvalds #define IPR_SUBS_DEV_ID_571A	0x02C0
571da177e4SLinus Torvalds #define IPR_SUBS_DEV_ID_571B	0x02BE
581da177e4SLinus Torvalds #define IPR_SUBS_DEV_ID_571E	0x02BF
5986f51436Sbrking@us.ibm.com #define IPR_SUBS_DEV_ID_571F	0x02D5
6086f51436Sbrking@us.ibm.com #define IPR_SUBS_DEV_ID_572A	0x02C1
6186f51436Sbrking@us.ibm.com #define IPR_SUBS_DEV_ID_572B	0x02C2
6260e7486bSBrian King #define IPR_SUBS_DEV_ID_572F	0x02C3
63185eb31cSBrian King #define IPR_SUBS_DEV_ID_574E	0x030A
6486f51436Sbrking@us.ibm.com #define IPR_SUBS_DEV_ID_575B	0x030D
6560e7486bSBrian King #define IPR_SUBS_DEV_ID_575C	0x0338
66185eb31cSBrian King #define IPR_SUBS_DEV_ID_57B3	0x033A
6760e7486bSBrian King #define IPR_SUBS_DEV_ID_57B7	0x0360
6860e7486bSBrian King #define IPR_SUBS_DEV_ID_57B8	0x02C2
691da177e4SLinus Torvalds 
70d7b4627fSWayne Boyer #define IPR_SUBS_DEV_ID_57B4    0x033B
71d7b4627fSWayne Boyer #define IPR_SUBS_DEV_ID_57B2    0x035F
72b8d5d568Swenxiong@linux.vnet.ibm.com #define IPR_SUBS_DEV_ID_57C0    0x0352
735a918353SWayne Boyer #define IPR_SUBS_DEV_ID_57C3    0x0353
7432622bdeSWayne Boyer #define IPR_SUBS_DEV_ID_57C4    0x0354
75d7b4627fSWayne Boyer #define IPR_SUBS_DEV_ID_57C6    0x0357
76b0f56d3dSWayne Boyer #define IPR_SUBS_DEV_ID_57CC    0x035C
77d7b4627fSWayne Boyer 
78d7b4627fSWayne Boyer #define IPR_SUBS_DEV_ID_57B5    0x033C
79d7b4627fSWayne Boyer #define IPR_SUBS_DEV_ID_57CE    0x035E
80d7b4627fSWayne Boyer #define IPR_SUBS_DEV_ID_57B1    0x0355
81d7b4627fSWayne Boyer 
82d7b4627fSWayne Boyer #define IPR_SUBS_DEV_ID_574D    0x0356
83cd9b3d04SWayne Boyer #define IPR_SUBS_DEV_ID_57C8    0x035D
84d7b4627fSWayne Boyer 
85b8d5d568Swenxiong@linux.vnet.ibm.com #define IPR_SUBS_DEV_ID_57D5    0x03FB
86b8d5d568Swenxiong@linux.vnet.ibm.com #define IPR_SUBS_DEV_ID_57D6    0x03FC
87b8d5d568Swenxiong@linux.vnet.ibm.com #define IPR_SUBS_DEV_ID_57D7    0x03FF
88b8d5d568Swenxiong@linux.vnet.ibm.com #define IPR_SUBS_DEV_ID_57D8    0x03FE
8943c5fdafSwenxiong@linux.vnet.ibm.com #define IPR_SUBS_DEV_ID_57D9    0x046D
90f94d9964SWendy Xiong #define IPR_SUBS_DEV_ID_57DA    0x04CA
9143c5fdafSwenxiong@linux.vnet.ibm.com #define IPR_SUBS_DEV_ID_57EB    0x0474
9243c5fdafSwenxiong@linux.vnet.ibm.com #define IPR_SUBS_DEV_ID_57EC    0x0475
9343c5fdafSwenxiong@linux.vnet.ibm.com #define IPR_SUBS_DEV_ID_57ED    0x0499
9443c5fdafSwenxiong@linux.vnet.ibm.com #define IPR_SUBS_DEV_ID_57EE    0x049A
9543c5fdafSwenxiong@linux.vnet.ibm.com #define IPR_SUBS_DEV_ID_57EF    0x049B
9643c5fdafSwenxiong@linux.vnet.ibm.com #define IPR_SUBS_DEV_ID_57F0    0x049C
975eeac3e9SWendy Xiong #define IPR_SUBS_DEV_ID_2CCA	0x04C7
985eeac3e9SWendy Xiong #define IPR_SUBS_DEV_ID_2CD2	0x04C8
995eeac3e9SWendy Xiong #define IPR_SUBS_DEV_ID_2CCD	0x04C9
10000da9ffaSWen Xiong #define IPR_SUBS_DEV_ID_580A	0x04FC
10100da9ffaSWen Xiong #define IPR_SUBS_DEV_ID_580B	0x04FB
1021da177e4SLinus Torvalds #define IPR_NAME				"ipr"
1031da177e4SLinus Torvalds 
1041da177e4SLinus Torvalds /*
1051da177e4SLinus Torvalds  * Return codes
1061da177e4SLinus Torvalds  */
1071da177e4SLinus Torvalds #define IPR_RC_JOB_CONTINUE		1
1081da177e4SLinus Torvalds #define IPR_RC_JOB_RETURN		2
1091da177e4SLinus Torvalds 
1101da177e4SLinus Torvalds /*
1111da177e4SLinus Torvalds  * IOASCs
1121da177e4SLinus Torvalds  */
1131da177e4SLinus Torvalds #define IPR_IOASC_NR_INIT_CMD_REQUIRED		0x02040200
11465f56475SBrian King #define IPR_IOASC_NR_IOA_RESET_REQUIRED		0x02048000
1151da177e4SLinus Torvalds #define IPR_IOASC_SYNC_REQUIRED			0x023f0000
1161da177e4SLinus Torvalds #define IPR_IOASC_MED_DO_NOT_REALLOC		0x03110C00
1171da177e4SLinus Torvalds #define IPR_IOASC_HW_SEL_TIMEOUT			0x04050000
1181da177e4SLinus Torvalds #define IPR_IOASC_HW_DEV_BUS_STATUS			0x04448500
1191da177e4SLinus Torvalds #define	IPR_IOASC_IOASC_MASK			0xFFFFFF00
1201da177e4SLinus Torvalds #define	IPR_IOASC_SCSI_STATUS_MASK		0x000000FF
121d247a70aSChristoph Hellwig #define IPR_IOASC_HW_CMD_FAILED			0x046E0000
122dfed823eSbrking@us.ibm.com #define IPR_IOASC_IR_INVALID_REQ_TYPE_OR_PKT	0x05240000
1231da177e4SLinus Torvalds #define IPR_IOASC_IR_RESOURCE_HANDLE		0x05250000
124b0df54bbSbrking@us.ibm.com #define IPR_IOASC_IR_NO_CMDS_TO_2ND_IOA		0x05258100
125b0df54bbSbrking@us.ibm.com #define IPR_IOASA_IR_DUAL_IOA_DISABLED		0x052C8000
1261da177e4SLinus Torvalds #define IPR_IOASC_BUS_WAS_RESET			0x06290000
1271da177e4SLinus Torvalds #define IPR_IOASC_BUS_WAS_RESET_BY_OTHER		0x06298000
1281da177e4SLinus Torvalds #define IPR_IOASC_ABORTED_CMD_TERM_BY_HOST	0x0B5A0000
129f8ee25d7SWen Xiong #define IPR_IOASC_IR_NON_OPTIMIZED		0x05258200
1301da177e4SLinus Torvalds 
1311da177e4SLinus Torvalds #define IPR_FIRST_DRIVER_IOASC			0x10000000
1321da177e4SLinus Torvalds #define IPR_IOASC_IOA_WAS_RESET			0x10000001
1331da177e4SLinus Torvalds #define IPR_IOASC_PCI_ACCESS_ERROR			0x10000002
1341da177e4SLinus Torvalds 
1355469cb5bSBrian King /* Driver data flags */
1365469cb5bSBrian King #define IPR_USE_LONG_TRANSOP_TIMEOUT		0x00000001
137463fc696SBrian King #define IPR_USE_PCI_WARM_RESET			0x00000002
1385469cb5bSBrian King 
139ac719abaSBrian King #define IPR_DEFAULT_MAX_ERROR_DUMP			984
1401da177e4SLinus Torvalds #define IPR_NUM_LOG_HCAMS				2
1411da177e4SLinus Torvalds #define IPR_NUM_CFG_CHG_HCAMS				2
142afc3f83cSBrian King #define IPR_NUM_HCAM_QUEUE				12
1431da177e4SLinus Torvalds #define IPR_NUM_HCAMS	(IPR_NUM_LOG_HCAMS + IPR_NUM_CFG_CHG_HCAMS)
144afc3f83cSBrian King #define IPR_MAX_HCAMS	(IPR_NUM_HCAMS + IPR_NUM_HCAM_QUEUE)
1453e7ebdfaSWayne Boyer 
1463e7ebdfaSWayne Boyer #define IPR_MAX_SIS64_TARGETS_PER_BUS			1024
1473e7ebdfaSWayne Boyer #define IPR_MAX_SIS64_LUNS_PER_TARGET			0xffffffff
1483e7ebdfaSWayne Boyer 
149d71a8b0cSbrking@us.ibm.com #define IPR_MAX_NUM_TARGETS_PER_BUS			256
1501da177e4SLinus Torvalds #define IPR_MAX_NUM_LUNS_PER_TARGET			256
1511da177e4SLinus Torvalds #define IPR_VSET_BUS					0xff
1521da177e4SLinus Torvalds #define IPR_IOA_BUS						0xff
1531da177e4SLinus Torvalds #define IPR_IOA_TARGET					0xff
1541da177e4SLinus Torvalds #define IPR_IOA_LUN						0xff
155b5145d25SBrian King #define IPR_MAX_NUM_BUSES				16
1561da177e4SLinus Torvalds 
1571da177e4SLinus Torvalds #define IPR_NUM_RESET_RELOAD_RETRIES		3
1581da177e4SLinus Torvalds 
1591da177e4SLinus Torvalds /* We need resources for HCAMS, IOA reset, IOA bringdown, and ERP */
1601da177e4SLinus Torvalds #define IPR_NUM_INTERNAL_CMD_BLKS	(IPR_NUM_HCAMS + \
161f72919ecSWayne Boyer                                      ((IPR_NUM_RESET_RELOAD_RETRIES + 1) * 2) + 4)
1621da177e4SLinus Torvalds 
16389aad428SBrian King #define IPR_MAX_COMMANDS		100
1641da177e4SLinus Torvalds #define IPR_NUM_CMD_BLKS		(IPR_NUM_BASE_CMD_BLKS + \
1651da177e4SLinus Torvalds 						IPR_NUM_INTERNAL_CMD_BLKS)
1661da177e4SLinus Torvalds 
1671da177e4SLinus Torvalds #define IPR_MAX_PHYSICAL_DEVS				192
1683e7ebdfaSWayne Boyer #define IPR_DEFAULT_SIS64_DEVS				1024
1693e7ebdfaSWayne Boyer #define IPR_MAX_SIS64_DEVS				4096
1701da177e4SLinus Torvalds 
1711da177e4SLinus Torvalds #define IPR_MAX_SGLIST					64
1721da177e4SLinus Torvalds #define IPR_IOA_MAX_SECTORS				32767
1731da177e4SLinus Torvalds #define IPR_VSET_MAX_SECTORS				512
1741da177e4SLinus Torvalds #define IPR_MAX_CDB_LEN					16
1753feeb89dSWayne Boyer #define IPR_MAX_HRRQ_RETRIES				3
1761da177e4SLinus Torvalds 
1771da177e4SLinus Torvalds #define IPR_DEFAULT_BUS_WIDTH				16
1781da177e4SLinus Torvalds #define IPR_80MBs_SCSI_RATE		((80 * 10) / (IPR_DEFAULT_BUS_WIDTH / 8))
1791da177e4SLinus Torvalds #define IPR_U160_SCSI_RATE	((160 * 10) / (IPR_DEFAULT_BUS_WIDTH / 8))
1801da177e4SLinus Torvalds #define IPR_U320_SCSI_RATE	((320 * 10) / (IPR_DEFAULT_BUS_WIDTH / 8))
1811da177e4SLinus Torvalds #define IPR_MAX_SCSI_RATE(width) ((320 * 10) / ((width) / 8))
1821da177e4SLinus Torvalds 
1831da177e4SLinus Torvalds #define IPR_IOA_RES_HANDLE				0xffffffff
1841121b794SBrian King #define IPR_INVALID_RES_HANDLE			0
1851da177e4SLinus Torvalds #define IPR_IOA_RES_ADDR				0x00ffffff
1861da177e4SLinus Torvalds 
1871da177e4SLinus Torvalds /*
1881da177e4SLinus Torvalds  * Adapter Commands
1891da177e4SLinus Torvalds  */
1904fdd7c7aSBrian King #define IPR_CANCEL_REQUEST				0xC0
1914fdd7c7aSBrian King #define	IPR_CANCEL_64BIT_IOARCB			0x01
1921da177e4SLinus Torvalds #define IPR_QUERY_RSRC_STATE				0xC2
1931da177e4SLinus Torvalds #define IPR_RESET_DEVICE				0xC3
1941da177e4SLinus Torvalds #define	IPR_RESET_TYPE_SELECT				0x80
1951da177e4SLinus Torvalds #define	IPR_LUN_RESET					0x40
1961da177e4SLinus Torvalds #define	IPR_TARGET_RESET					0x20
1971da177e4SLinus Torvalds #define	IPR_BUS_RESET					0x10
1981da177e4SLinus Torvalds #define IPR_ID_HOST_RR_Q				0xC4
1991da177e4SLinus Torvalds #define IPR_QUERY_IOA_CONFIG				0xC5
2001da177e4SLinus Torvalds #define IPR_CANCEL_ALL_REQUESTS			0xCE
2011da177e4SLinus Torvalds #define IPR_HOST_CONTROLLED_ASYNC			0xCF
2021da177e4SLinus Torvalds #define	IPR_HCAM_CDB_OP_CODE_CONFIG_CHANGE	0x01
2031da177e4SLinus Torvalds #define	IPR_HCAM_CDB_OP_CODE_LOG_DATA		0x02
2041da177e4SLinus Torvalds #define IPR_SET_SUPPORTED_DEVICES			0xFB
2053e7ebdfaSWayne Boyer #define IPR_SET_ALL_SUPPORTED_DEVICES			0x80
2061da177e4SLinus Torvalds #define IPR_IOA_SHUTDOWN				0xF7
2071da177e4SLinus Torvalds #define	IPR_WR_BUF_DOWNLOAD_AND_SAVE			0x05
2081a47af26SGabriel Krisman Bertazi #define IPR_IOA_SERVICE_ACTION				0xD2
2091a47af26SGabriel Krisman Bertazi 
2101a47af26SGabriel Krisman Bertazi /* IOA Service Actions */
2111a47af26SGabriel Krisman Bertazi #define IPR_IOA_SA_CHANGE_CACHE_PARAMS			0x14
2121da177e4SLinus Torvalds 
2131da177e4SLinus Torvalds /*
2141da177e4SLinus Torvalds  * Timeouts
2151da177e4SLinus Torvalds  */
2161da177e4SLinus Torvalds #define IPR_SHUTDOWN_TIMEOUT			(ipr_fastfail ? 60 * HZ : 10 * 60 * HZ)
2171da177e4SLinus Torvalds #define IPR_VSET_RW_TIMEOUT			(ipr_fastfail ? 30 * HZ : 2 * 60 * HZ)
2181da177e4SLinus Torvalds #define IPR_ABBREV_SHUTDOWN_TIMEOUT		(10 * HZ)
219ac09c349SBrian King #define IPR_DUAL_IOA_ABBR_SHUTDOWN_TO	(2 * 60 * HZ)
2201da177e4SLinus Torvalds #define IPR_DEVICE_RESET_TIMEOUT		(ipr_fastfail ? 10 * HZ : 30 * HZ)
2214fdd7c7aSBrian King #define IPR_CANCEL_TIMEOUT			(ipr_fastfail ? 10 * HZ : 30 * HZ)
2221da177e4SLinus Torvalds #define IPR_CANCEL_ALL_TIMEOUT		(ipr_fastfail ? 10 * HZ : 30 * HZ)
2231da177e4SLinus Torvalds #define IPR_ABORT_TASK_TIMEOUT		(ipr_fastfail ? 10 * HZ : 30 * HZ)
2241da177e4SLinus Torvalds #define IPR_INTERNAL_TIMEOUT			(ipr_fastfail ? 10 * HZ : 30 * HZ)
22514ed9cc7SWayne Boyer #define IPR_WRITE_BUFFER_TIMEOUT		(30 * 60 * HZ)
2261da177e4SLinus Torvalds #define IPR_SET_SUP_DEVICE_TIMEOUT		(2 * 60 * HZ)
2271da177e4SLinus Torvalds #define IPR_REQUEST_SENSE_TIMEOUT		(10 * HZ)
2281da177e4SLinus Torvalds #define IPR_OPERATIONAL_TIMEOUT		(5 * 60)
2295469cb5bSBrian King #define IPR_LONG_OPERATIONAL_TIMEOUT	(12 * 60)
2301da177e4SLinus Torvalds #define IPR_WAIT_FOR_RESET_TIMEOUT		(2 * HZ)
2311da177e4SLinus Torvalds #define IPR_CHECK_FOR_RESET_TIMEOUT		(HZ / 10)
2321da177e4SLinus Torvalds #define IPR_WAIT_FOR_BIST_TIMEOUT		(2 * HZ)
2336270e593SBrian King #define IPR_PCI_ERROR_RECOVERY_TIMEOUT	(120 * HZ)
234463fc696SBrian King #define IPR_PCI_RESET_TIMEOUT			(HZ / 2)
2354d4dd706SKleber Sacilotto de Souza #define IPR_SIS32_DUMP_TIMEOUT			(15 * HZ)
2364d4dd706SKleber Sacilotto de Souza #define IPR_SIS64_DUMP_TIMEOUT			(40 * HZ)
237110def85SWayne Boyer #define IPR_DUMP_DELAY_SECONDS			4
238110def85SWayne Boyer #define IPR_DUMP_DELAY_TIMEOUT			(IPR_DUMP_DELAY_SECONDS * HZ)
2391da177e4SLinus Torvalds 
2401da177e4SLinus Torvalds /*
2411da177e4SLinus Torvalds  * SCSI Literals
2421da177e4SLinus Torvalds  */
2431da177e4SLinus Torvalds #define IPR_VENDOR_ID_LEN			8
2441da177e4SLinus Torvalds #define IPR_PROD_ID_LEN				16
2451da177e4SLinus Torvalds #define IPR_SERIAL_NUM_LEN			8
2461da177e4SLinus Torvalds 
2471da177e4SLinus Torvalds /*
2481da177e4SLinus Torvalds  * Hardware literals
2491da177e4SLinus Torvalds  */
2501da177e4SLinus Torvalds #define IPR_FMT2_MBX_ADDR_MASK				0x0fffffff
2511da177e4SLinus Torvalds #define IPR_FMT2_MBX_BAR_SEL_MASK			0xf0000000
2521da177e4SLinus Torvalds #define IPR_FMT2_MKR_BAR_SEL_SHIFT			28
2531da177e4SLinus Torvalds #define IPR_GET_FMT2_BAR_SEL(mbx) \
2541da177e4SLinus Torvalds (((mbx) & IPR_FMT2_MBX_BAR_SEL_MASK) >> IPR_FMT2_MKR_BAR_SEL_SHIFT)
2551da177e4SLinus Torvalds #define IPR_SDT_FMT2_BAR0_SEL				0x0
2561da177e4SLinus Torvalds #define IPR_SDT_FMT2_BAR1_SEL				0x1
2571da177e4SLinus Torvalds #define IPR_SDT_FMT2_BAR2_SEL				0x2
2581da177e4SLinus Torvalds #define IPR_SDT_FMT2_BAR3_SEL				0x3
2591da177e4SLinus Torvalds #define IPR_SDT_FMT2_BAR4_SEL				0x4
2601da177e4SLinus Torvalds #define IPR_SDT_FMT2_BAR5_SEL				0x5
2611da177e4SLinus Torvalds #define IPR_SDT_FMT2_EXP_ROM_SEL			0x8
2621da177e4SLinus Torvalds #define IPR_FMT2_SDT_READY_TO_USE			0xC4D4E3F2
263dcbad00eSWayne Boyer #define IPR_FMT3_SDT_READY_TO_USE			0xC4D4E3F3
2641da177e4SLinus Torvalds #define IPR_DOORBELL					0x82800000
2653d1d0da6Sbrking@us.ibm.com #define IPR_RUNTIME_RESET				0x40000000
2661da177e4SLinus Torvalds 
267214777baSWayne Boyer #define IPR_IPL_INIT_MIN_STAGE_TIME			5
26845c44b5fSBrian King #define IPR_IPL_INIT_DEFAULT_STAGE_TIME                 30
269214777baSWayne Boyer #define IPR_IPL_INIT_STAGE_UNKNOWN			0x0
270214777baSWayne Boyer #define IPR_IPL_INIT_STAGE_TRANSOP			0xB0000000
271214777baSWayne Boyer #define IPR_IPL_INIT_STAGE_MASK				0xff000000
272214777baSWayne Boyer #define IPR_IPL_INIT_STAGE_TIME_MASK			0x0000ffff
273214777baSWayne Boyer #define IPR_PCII_IPL_STAGE_CHANGE			(0x80000000 >> 0)
274214777baSWayne Boyer 
275f41f1d99SGabriel Krisman Bertazi #define IPR_PCII_MAILBOX_STABLE				(0x80000000 >> 4)
276f41f1d99SGabriel Krisman Bertazi #define IPR_WAIT_FOR_MAILBOX				(2 * HZ)
277f41f1d99SGabriel Krisman Bertazi 
2781da177e4SLinus Torvalds #define IPR_PCII_IOA_TRANS_TO_OPER			(0x80000000 >> 0)
2791da177e4SLinus Torvalds #define IPR_PCII_IOARCB_XFER_FAILED			(0x80000000 >> 3)
2801da177e4SLinus Torvalds #define IPR_PCII_IOA_UNIT_CHECKED			(0x80000000 >> 4)
2811da177e4SLinus Torvalds #define IPR_PCII_NO_HOST_RRQ				(0x80000000 >> 5)
2821da177e4SLinus Torvalds #define IPR_PCII_CRITICAL_OPERATION			(0x80000000 >> 6)
2831da177e4SLinus Torvalds #define IPR_PCII_IO_DEBUG_ACKNOWLEDGE		(0x80000000 >> 7)
2841da177e4SLinus Torvalds #define IPR_PCII_IOARRIN_LOST				(0x80000000 >> 27)
2851da177e4SLinus Torvalds #define IPR_PCII_MMIO_ERROR				(0x80000000 >> 28)
2861da177e4SLinus Torvalds #define IPR_PCII_PROC_ERR_STATE			(0x80000000 >> 29)
2871da177e4SLinus Torvalds #define IPR_PCII_HRRQ_UPDATED				(0x80000000 >> 30)
2881da177e4SLinus Torvalds #define IPR_PCII_CORE_ISSUED_RST_REQ		(0x80000000 >> 31)
2891da177e4SLinus Torvalds 
2901da177e4SLinus Torvalds #define IPR_PCII_ERROR_INTERRUPTS \
2911da177e4SLinus Torvalds (IPR_PCII_IOARCB_XFER_FAILED | IPR_PCII_IOA_UNIT_CHECKED | \
2921da177e4SLinus Torvalds IPR_PCII_NO_HOST_RRQ | IPR_PCII_IOARRIN_LOST | IPR_PCII_MMIO_ERROR)
2931da177e4SLinus Torvalds 
2941da177e4SLinus Torvalds #define IPR_PCII_OPER_INTERRUPTS \
2951da177e4SLinus Torvalds (IPR_PCII_ERROR_INTERRUPTS | IPR_PCII_HRRQ_UPDATED | IPR_PCII_IOA_TRANS_TO_OPER)
2961da177e4SLinus Torvalds 
2971da177e4SLinus Torvalds #define IPR_UPROCI_RESET_ALERT			(0x80000000 >> 7)
2981da177e4SLinus Torvalds #define IPR_UPROCI_IO_DEBUG_ALERT			(0x80000000 >> 9)
299cb237ef7SWayne Boyer #define IPR_UPROCI_SIS64_START_BIST			(0x80000000 >> 23)
3001da177e4SLinus Torvalds 
3011da177e4SLinus Torvalds #define IPR_LDUMP_MAX_LONG_ACK_DELAY_IN_USEC		200000	/* 200 ms */
3021da177e4SLinus Torvalds #define IPR_LDUMP_MAX_SHORT_ACK_DELAY_IN_USEC		200000	/* 200 ms */
3031da177e4SLinus Torvalds 
3041da177e4SLinus Torvalds /*
3051da177e4SLinus Torvalds  * Dump literals
3061da177e4SLinus Torvalds  */
3074d4dd706SKleber Sacilotto de Souza #define IPR_FMT2_MAX_IOA_DUMP_SIZE			(4 * 1024 * 1024)
30895d8a25bSwenxiong@linux.vnet.ibm.com #define IPR_FMT3_MAX_IOA_DUMP_SIZE			(80 * 1024 * 1024)
3094d4dd706SKleber Sacilotto de Souza #define IPR_FMT2_NUM_SDT_ENTRIES			511
3104d4dd706SKleber Sacilotto de Souza #define IPR_FMT3_NUM_SDT_ENTRIES			0xFFF
3114d4dd706SKleber Sacilotto de Souza #define IPR_FMT2_MAX_NUM_DUMP_PAGES	((IPR_FMT2_MAX_IOA_DUMP_SIZE / PAGE_SIZE) + 1)
3124d4dd706SKleber Sacilotto de Souza #define IPR_FMT3_MAX_NUM_DUMP_PAGES	((IPR_FMT3_MAX_IOA_DUMP_SIZE / PAGE_SIZE) + 1)
3131da177e4SLinus Torvalds 
3141da177e4SLinus Torvalds /*
3151da177e4SLinus Torvalds  * Misc literals
3161da177e4SLinus Torvalds  */
3171da177e4SLinus Torvalds #define IPR_NUM_IOADL_ENTRIES			IPR_MAX_SGLIST
3186634ff7cSwenxiong@linux.vnet.ibm.com #define IPR_MAX_MSIX_VECTORS		0x10
31905a6538aSwenxiong@linux.vnet.ibm.com #define IPR_MAX_HRRQ_NUM		0x10
32005a6538aSwenxiong@linux.vnet.ibm.com #define IPR_INIT_HRRQ			0x0
3211da177e4SLinus Torvalds 
3221da177e4SLinus Torvalds /*
3231da177e4SLinus Torvalds  * Adapter interface types
3241da177e4SLinus Torvalds  */
3251da177e4SLinus Torvalds 
3261da177e4SLinus Torvalds struct ipr_res_addr {
3271da177e4SLinus Torvalds 	u8 reserved;
3281da177e4SLinus Torvalds 	u8 bus;
3291da177e4SLinus Torvalds 	u8 target;
3301da177e4SLinus Torvalds 	u8 lun;
3311da177e4SLinus Torvalds #define IPR_GET_PHYS_LOC(res_addr) \
3321da177e4SLinus Torvalds 	(((res_addr).bus << 16) | ((res_addr).target << 8) | (res_addr).lun)
3331da177e4SLinus Torvalds }__attribute__((packed, aligned (4)));
3341da177e4SLinus Torvalds 
3351da177e4SLinus Torvalds struct ipr_std_inq_vpids {
3361da177e4SLinus Torvalds 	u8 vendor_id[IPR_VENDOR_ID_LEN];
3371da177e4SLinus Torvalds 	u8 product_id[IPR_PROD_ID_LEN];
3381da177e4SLinus Torvalds }__attribute__((packed));
3391da177e4SLinus Torvalds 
340cfc32139Sbrking@us.ibm.com struct ipr_vpd {
341cfc32139Sbrking@us.ibm.com 	struct ipr_std_inq_vpids vpids;
342cfc32139Sbrking@us.ibm.com 	u8 sn[IPR_SERIAL_NUM_LEN];
343cfc32139Sbrking@us.ibm.com }__attribute__((packed));
344cfc32139Sbrking@us.ibm.com 
345ee0f05b8Sbrking@us.ibm.com struct ipr_ext_vpd {
346ee0f05b8Sbrking@us.ibm.com 	struct ipr_vpd vpd;
347ee0f05b8Sbrking@us.ibm.com 	__be32 wwid[2];
348ee0f05b8Sbrking@us.ibm.com }__attribute__((packed));
349ee0f05b8Sbrking@us.ibm.com 
3507262026fSWayne Boyer struct ipr_ext_vpd64 {
3517262026fSWayne Boyer 	struct ipr_vpd vpd;
3527262026fSWayne Boyer 	__be32 wwid[4];
3537262026fSWayne Boyer }__attribute__((packed));
3547262026fSWayne Boyer 
3551da177e4SLinus Torvalds struct ipr_std_inq_data {
3561da177e4SLinus Torvalds 	u8 peri_qual_dev_type;
3571da177e4SLinus Torvalds #define IPR_STD_INQ_PERI_QUAL(peri) ((peri) >> 5)
3581da177e4SLinus Torvalds #define IPR_STD_INQ_PERI_DEV_TYPE(peri) ((peri) & 0x1F)
3591da177e4SLinus Torvalds 
3601da177e4SLinus Torvalds 	u8 removeable_medium_rsvd;
3611da177e4SLinus Torvalds #define IPR_STD_INQ_REMOVEABLE_MEDIUM 0x80
3621da177e4SLinus Torvalds 
3631da177e4SLinus Torvalds #define IPR_IS_DASD_DEVICE(std_inq) \
3641da177e4SLinus Torvalds ((IPR_STD_INQ_PERI_DEV_TYPE((std_inq).peri_qual_dev_type) == TYPE_DISK) && \
3651da177e4SLinus Torvalds !(((std_inq).removeable_medium_rsvd) & IPR_STD_INQ_REMOVEABLE_MEDIUM))
3661da177e4SLinus Torvalds 
3671da177e4SLinus Torvalds #define IPR_IS_SES_DEVICE(std_inq) \
3681da177e4SLinus Torvalds (IPR_STD_INQ_PERI_DEV_TYPE((std_inq).peri_qual_dev_type) == TYPE_ENCLOSURE)
3691da177e4SLinus Torvalds 
3701da177e4SLinus Torvalds 	u8 version;
3711da177e4SLinus Torvalds 	u8 aen_naca_fmt;
3721da177e4SLinus Torvalds 	u8 additional_len;
3731da177e4SLinus Torvalds 	u8 sccs_rsvd;
3741da177e4SLinus Torvalds 	u8 bq_enc_multi;
3751da177e4SLinus Torvalds 	u8 sync_cmdq_flags;
3761da177e4SLinus Torvalds 
3771da177e4SLinus Torvalds 	struct ipr_std_inq_vpids vpids;
3781da177e4SLinus Torvalds 
3791da177e4SLinus Torvalds 	u8 ros_rsvd_ram_rsvd[4];
3801da177e4SLinus Torvalds 
3811da177e4SLinus Torvalds 	u8 serial_num[IPR_SERIAL_NUM_LEN];
3821da177e4SLinus Torvalds }__attribute__ ((packed));
3831da177e4SLinus Torvalds 
3843e7ebdfaSWayne Boyer #define IPR_RES_TYPE_AF_DASD		0x00
3853e7ebdfaSWayne Boyer #define IPR_RES_TYPE_GENERIC_SCSI	0x01
3863e7ebdfaSWayne Boyer #define IPR_RES_TYPE_VOLUME_SET		0x02
3873e7ebdfaSWayne Boyer #define IPR_RES_TYPE_REMOTE_AF_DASD	0x03
3883e7ebdfaSWayne Boyer #define IPR_RES_TYPE_GENERIC_ATA	0x04
3893e7ebdfaSWayne Boyer #define IPR_RES_TYPE_ARRAY		0x05
3903e7ebdfaSWayne Boyer #define IPR_RES_TYPE_IOAFP		0xff
3913e7ebdfaSWayne Boyer 
3921da177e4SLinus Torvalds struct ipr_config_table_entry {
393b5145d25SBrian King 	u8 proto;
394b5145d25SBrian King #define IPR_PROTO_SATA			0x02
395b5145d25SBrian King #define IPR_PROTO_SATA_ATAPI		0x03
396b5145d25SBrian King #define IPR_PROTO_SAS_STP		0x06
397b5145d25SBrian King #define IPR_PROTO_SAS_STP_ATAPI		0x07
3981da177e4SLinus Torvalds 	u8 array_id;
3991da177e4SLinus Torvalds 	u8 flags;
4001da177e4SLinus Torvalds #define IPR_IS_IOA_RESOURCE		0x80
4011da177e4SLinus Torvalds 	u8 rsvd_subtype;
4021da177e4SLinus Torvalds 
4033e7ebdfaSWayne Boyer #define IPR_QUEUEING_MODEL(res)	((((res)->flags) & 0x70) >> 4)
404ee0a90faSbrking@us.ibm.com #define IPR_QUEUE_FROZEN_MODEL		0
405ee0a90faSbrking@us.ibm.com #define IPR_QUEUE_NACA_MODEL		1
406ee0a90faSbrking@us.ibm.com 
4071da177e4SLinus Torvalds 	struct ipr_res_addr res_addr;
4081da177e4SLinus Torvalds 	__be32 res_handle;
40946d74563SWayne Boyer 	__be32 lun_wwn[2];
4101da177e4SLinus Torvalds 	struct ipr_std_inq_data std_inq_data;
4111da177e4SLinus Torvalds }__attribute__ ((packed, aligned (4)));
4121da177e4SLinus Torvalds 
4133e7ebdfaSWayne Boyer struct ipr_config_table_entry64 {
4143e7ebdfaSWayne Boyer 	u8 res_type;
4153e7ebdfaSWayne Boyer 	u8 proto;
4163e7ebdfaSWayne Boyer 	u8 vset_num;
4173e7ebdfaSWayne Boyer 	u8 array_id;
4183e7ebdfaSWayne Boyer 	__be16 flags;
4193e7ebdfaSWayne Boyer 	__be16 res_flags;
4203e7ebdfaSWayne Boyer #define IPR_QUEUEING_MODEL64(res) ((((res)->res_flags) & 0x7000) >> 12)
4213e7ebdfaSWayne Boyer 	__be32 res_handle;
4223e7ebdfaSWayne Boyer 	u8 dev_id_type;
4233e7ebdfaSWayne Boyer 	u8 reserved[3];
4243e7ebdfaSWayne Boyer 	__be64 dev_id;
4253e7ebdfaSWayne Boyer 	__be64 lun;
4263e7ebdfaSWayne Boyer 	__be64 lun_wwn[2];
427b3b3b407SBrian King #define IPR_MAX_RES_PATH_LENGTH		48
428*7df47cdfSWen Xiong #define IPR_RES_PATH_BYTES		8
4293e7ebdfaSWayne Boyer 	__be64 res_path;
4303e7ebdfaSWayne Boyer 	struct ipr_std_inq_data std_inq_data;
4313e7ebdfaSWayne Boyer 	u8 reserved2[4];
4327262026fSWayne Boyer 	__be64 reserved3[2];
4333e7ebdfaSWayne Boyer 	u8 reserved4[8];
4343e7ebdfaSWayne Boyer }__attribute__ ((packed, aligned (8)));
4353e7ebdfaSWayne Boyer 
4361da177e4SLinus Torvalds struct ipr_config_table_hdr {
4371da177e4SLinus Torvalds 	u8 num_entries;
4381da177e4SLinus Torvalds 	u8 flags;
4391da177e4SLinus Torvalds #define IPR_UCODE_DOWNLOAD_REQ	0x10
4401da177e4SLinus Torvalds 	__be16 reserved;
4411da177e4SLinus Torvalds }__attribute__((packed, aligned (4)));
4421da177e4SLinus Torvalds 
4433e7ebdfaSWayne Boyer struct ipr_config_table_hdr64 {
4443e7ebdfaSWayne Boyer 	__be16 num_entries;
4453e7ebdfaSWayne Boyer 	__be16 reserved;
4463e7ebdfaSWayne Boyer 	u8 flags;
4473e7ebdfaSWayne Boyer 	u8 reserved2[11];
4481da177e4SLinus Torvalds }__attribute__((packed, aligned (4)));
4491da177e4SLinus Torvalds 
4503e7ebdfaSWayne Boyer struct ipr_config_table {
4513e7ebdfaSWayne Boyer 	struct ipr_config_table_hdr hdr;
4525febf6d6SGustavo A. R. Silva 	struct ipr_config_table_entry dev[];
4533e7ebdfaSWayne Boyer }__attribute__((packed, aligned (4)));
4543e7ebdfaSWayne Boyer 
4553e7ebdfaSWayne Boyer struct ipr_config_table64 {
4563e7ebdfaSWayne Boyer 	struct ipr_config_table_hdr64 hdr64;
4575febf6d6SGustavo A. R. Silva 	struct ipr_config_table_entry64 dev[];
4583e7ebdfaSWayne Boyer }__attribute__((packed, aligned (8)));
4593e7ebdfaSWayne Boyer 
4603e7ebdfaSWayne Boyer struct ipr_config_table_entry_wrapper {
4613e7ebdfaSWayne Boyer 	union {
4623e7ebdfaSWayne Boyer 		struct ipr_config_table_entry *cfgte;
4633e7ebdfaSWayne Boyer 		struct ipr_config_table_entry64 *cfgte64;
4643e7ebdfaSWayne Boyer 	} u;
4653e7ebdfaSWayne Boyer };
4663e7ebdfaSWayne Boyer 
4671da177e4SLinus Torvalds struct ipr_hostrcb_cfg_ch_not {
4683e7ebdfaSWayne Boyer 	union {
4691da177e4SLinus Torvalds 		struct ipr_config_table_entry cfgte;
4703e7ebdfaSWayne Boyer 		struct ipr_config_table_entry64 cfgte64;
4713e7ebdfaSWayne Boyer 	} u;
4721da177e4SLinus Torvalds 	u8 reserved[936];
4731da177e4SLinus Torvalds }__attribute__((packed, aligned (4)));
4741da177e4SLinus Torvalds 
4751da177e4SLinus Torvalds struct ipr_supported_device {
4761da177e4SLinus Torvalds 	__be16 data_length;
4771da177e4SLinus Torvalds 	u8 reserved;
4781da177e4SLinus Torvalds 	u8 num_records;
4791da177e4SLinus Torvalds 	struct ipr_std_inq_vpids vpids;
4801da177e4SLinus Torvalds 	u8 reserved2[16];
4811da177e4SLinus Torvalds }__attribute__((packed, aligned (4)));
4821da177e4SLinus Torvalds 
48305a6538aSwenxiong@linux.vnet.ibm.com struct ipr_hrr_queue {
48405a6538aSwenxiong@linux.vnet.ibm.com 	struct ipr_ioa_cfg *ioa_cfg;
48505a6538aSwenxiong@linux.vnet.ibm.com 	__be32 *host_rrq;
48605a6538aSwenxiong@linux.vnet.ibm.com 	dma_addr_t host_rrq_dma;
48705a6538aSwenxiong@linux.vnet.ibm.com #define IPR_HRRQ_REQ_RESP_HANDLE_MASK	0xfffffffc
48805a6538aSwenxiong@linux.vnet.ibm.com #define IPR_HRRQ_RESP_BIT_SET		0x00000002
48905a6538aSwenxiong@linux.vnet.ibm.com #define IPR_HRRQ_TOGGLE_BIT		0x00000001
49005a6538aSwenxiong@linux.vnet.ibm.com #define IPR_HRRQ_REQ_RESP_HANDLE_SHIFT	2
49105a6538aSwenxiong@linux.vnet.ibm.com #define IPR_ID_HRRQ_SELE_ENABLE		0x02
49205a6538aSwenxiong@linux.vnet.ibm.com 	volatile __be32 *hrrq_start;
49305a6538aSwenxiong@linux.vnet.ibm.com 	volatile __be32 *hrrq_end;
49405a6538aSwenxiong@linux.vnet.ibm.com 	volatile __be32 *hrrq_curr;
49505a6538aSwenxiong@linux.vnet.ibm.com 
49605a6538aSwenxiong@linux.vnet.ibm.com 	struct list_head hrrq_free_q;
49705a6538aSwenxiong@linux.vnet.ibm.com 	struct list_head hrrq_pending_q;
49856d6aa33Swenxiong@linux.vnet.ibm.com 	spinlock_t _lock;
49956d6aa33Swenxiong@linux.vnet.ibm.com 	spinlock_t *lock;
50005a6538aSwenxiong@linux.vnet.ibm.com 
50105a6538aSwenxiong@linux.vnet.ibm.com 	volatile u32 toggle_bit;
50205a6538aSwenxiong@linux.vnet.ibm.com 	u32 size;
50305a6538aSwenxiong@linux.vnet.ibm.com 	u32 min_cmd_id;
50405a6538aSwenxiong@linux.vnet.ibm.com 	u32 max_cmd_id;
50556d6aa33Swenxiong@linux.vnet.ibm.com 	u8 allow_interrupts:1;
50656d6aa33Swenxiong@linux.vnet.ibm.com 	u8 ioa_is_dead:1;
50756d6aa33Swenxiong@linux.vnet.ibm.com 	u8 allow_cmds:1;
508bfae7820SBrian King 	u8 removing_ioa:1;
509b53d124aSwenxiong@linux.vnet.ibm.com 
510511cbce2SChristoph Hellwig 	struct irq_poll iopoll;
51105a6538aSwenxiong@linux.vnet.ibm.com };
51205a6538aSwenxiong@linux.vnet.ibm.com 
5131da177e4SLinus Torvalds /* Command packet structure */
5141da177e4SLinus Torvalds struct ipr_cmd_pkt {
51505a6538aSwenxiong@linux.vnet.ibm.com 	u8 reserved;		/* Reserved by IOA */
51605a6538aSwenxiong@linux.vnet.ibm.com 	u8 hrrq_id;
5171da177e4SLinus Torvalds 	u8 request_type;
5181da177e4SLinus Torvalds #define IPR_RQTYPE_SCSICDB		0x00
5191da177e4SLinus Torvalds #define IPR_RQTYPE_IOACMD		0x01
5201da177e4SLinus Torvalds #define IPR_RQTYPE_HCAM			0x02
521f8ee25d7SWen Xiong #define IPR_RQTYPE_PIPE			0x05
5221da177e4SLinus Torvalds 
523a32c055fSWayne Boyer 	u8 reserved2;
5241da177e4SLinus Torvalds 
5251da177e4SLinus Torvalds 	u8 flags_hi;
5261da177e4SLinus Torvalds #define IPR_FLAGS_HI_WRITE_NOT_READ		0x80
5271da177e4SLinus Torvalds #define IPR_FLAGS_HI_NO_ULEN_CHK		0x20
5281da177e4SLinus Torvalds #define IPR_FLAGS_HI_SYNC_OVERRIDE		0x10
5291da177e4SLinus Torvalds #define IPR_FLAGS_HI_SYNC_COMPLETE		0x08
5301da177e4SLinus Torvalds #define IPR_FLAGS_HI_NO_LINK_DESC		0x04
5311da177e4SLinus Torvalds 
5321da177e4SLinus Torvalds 	u8 flags_lo;
5331da177e4SLinus Torvalds #define IPR_FLAGS_LO_ALIGNED_BFR		0x20
5341da177e4SLinus Torvalds #define IPR_FLAGS_LO_DELAY_AFTER_RST		0x10
5351da177e4SLinus Torvalds #define IPR_FLAGS_LO_UNTAGGED_TASK		0x00
5361da177e4SLinus Torvalds #define IPR_FLAGS_LO_SIMPLE_TASK		0x02
5371da177e4SLinus Torvalds #define IPR_FLAGS_LO_ORDERED_TASK		0x04
5381da177e4SLinus Torvalds #define IPR_FLAGS_LO_HEAD_OF_Q_TASK		0x06
5391da177e4SLinus Torvalds #define IPR_FLAGS_LO_ACA_TASK			0x08
5401da177e4SLinus Torvalds 
5411da177e4SLinus Torvalds 	u8 cdb[16];
5421da177e4SLinus Torvalds 	__be16 timeout;
5431da177e4SLinus Torvalds }__attribute__ ((packed, aligned(4)));
5441da177e4SLinus Torvalds 
54551b1c7e1SBrian King struct ipr_ioadl_desc {
54651b1c7e1SBrian King 	__be32 flags_and_data_len;
54751b1c7e1SBrian King #define IPR_IOADL_FLAGS_MASK		0xff000000
54851b1c7e1SBrian King #define IPR_IOADL_GET_FLAGS(x) (be32_to_cpu(x) & IPR_IOADL_FLAGS_MASK)
54951b1c7e1SBrian King #define IPR_IOADL_DATA_LEN_MASK		0x00ffffff
55051b1c7e1SBrian King #define IPR_IOADL_GET_DATA_LEN(x) (be32_to_cpu(x) & IPR_IOADL_DATA_LEN_MASK)
55151b1c7e1SBrian King #define IPR_IOADL_FLAGS_READ		0x48000000
55251b1c7e1SBrian King #define IPR_IOADL_FLAGS_READ_LAST	0x49000000
55351b1c7e1SBrian King #define IPR_IOADL_FLAGS_WRITE		0x68000000
55451b1c7e1SBrian King #define IPR_IOADL_FLAGS_WRITE_LAST	0x69000000
55551b1c7e1SBrian King #define IPR_IOADL_FLAGS_LAST		0x01000000
55651b1c7e1SBrian King 
55751b1c7e1SBrian King 	__be32 address;
55851b1c7e1SBrian King }__attribute__((packed, aligned (8)));
55951b1c7e1SBrian King 
560a32c055fSWayne Boyer struct ipr_ioadl64_desc {
561a32c055fSWayne Boyer 	__be32 flags;
562a32c055fSWayne Boyer 	__be32 data_len;
563a32c055fSWayne Boyer 	__be64 address;
564a32c055fSWayne Boyer }__attribute__((packed, aligned (16)));
565a32c055fSWayne Boyer 
566b5145d25SBrian King struct ipr_ioarcb_add_data {
567b5145d25SBrian King 	union {
56851b1c7e1SBrian King 		struct ipr_ioadl_desc ioadl[5];
569b5145d25SBrian King 		__be32 add_cmd_parms[10];
570b5145d25SBrian King 	} u;
571b5145d25SBrian King }__attribute__ ((packed, aligned (4)));
572b5145d25SBrian King 
573a32c055fSWayne Boyer struct ipr_ioarcb_sis64_add_addr_ecb {
574a32c055fSWayne Boyer 	__be64 ioasa_host_pci_addr;
575a32c055fSWayne Boyer 	__be64 data_ioadl_addr;
576a32c055fSWayne Boyer 	__be64 reserved;
577a32c055fSWayne Boyer 	__be32 ext_control_buf[4];
578a32c055fSWayne Boyer }__attribute__((packed, aligned (8)));
579a32c055fSWayne Boyer 
5801da177e4SLinus Torvalds /* IOA Request Control Block    128 bytes  */
5811da177e4SLinus Torvalds struct ipr_ioarcb {
582a32c055fSWayne Boyer 	union {
5831da177e4SLinus Torvalds 		__be32 ioarcb_host_pci_addr;
584a32c055fSWayne Boyer 		__be64 ioarcb_host_pci_addr64;
585a32c055fSWayne Boyer 	} a;
5861da177e4SLinus Torvalds 	__be32 res_handle;
5871da177e4SLinus Torvalds 	__be32 host_response_handle;
5881da177e4SLinus Torvalds 	__be32 reserved1;
5891da177e4SLinus Torvalds 	__be32 reserved2;
5901da177e4SLinus Torvalds 	__be32 reserved3;
5911da177e4SLinus Torvalds 
592a32c055fSWayne Boyer 	__be32 data_transfer_length;
5931da177e4SLinus Torvalds 	__be32 read_data_transfer_length;
5941da177e4SLinus Torvalds 	__be32 write_ioadl_addr;
595a32c055fSWayne Boyer 	__be32 ioadl_len;
5961da177e4SLinus Torvalds 	__be32 read_ioadl_addr;
5971da177e4SLinus Torvalds 	__be32 read_ioadl_len;
5981da177e4SLinus Torvalds 
5991da177e4SLinus Torvalds 	__be32 ioasa_host_pci_addr;
6001da177e4SLinus Torvalds 	__be16 ioasa_len;
6011da177e4SLinus Torvalds 	__be16 reserved4;
6021da177e4SLinus Torvalds 
6031da177e4SLinus Torvalds 	struct ipr_cmd_pkt cmd_pkt;
6041da177e4SLinus Torvalds 
605a32c055fSWayne Boyer 	__be16 add_cmd_parms_offset;
606a32c055fSWayne Boyer 	__be16 add_cmd_parms_len;
607a32c055fSWayne Boyer 
608a32c055fSWayne Boyer 	union {
609b5145d25SBrian King 		struct ipr_ioarcb_add_data add_data;
610a32c055fSWayne Boyer 		struct ipr_ioarcb_sis64_add_addr_ecb sis64_addr_data;
611a32c055fSWayne Boyer 	} u;
612a32c055fSWayne Boyer 
6131da177e4SLinus Torvalds }__attribute__((packed, aligned (4)));
6141da177e4SLinus Torvalds 
6151da177e4SLinus Torvalds struct ipr_ioasa_vset {
6161da177e4SLinus Torvalds 	__be32 failing_lba_hi;
6171da177e4SLinus Torvalds 	__be32 failing_lba_lo;
618c8f74892Sbrking@us.ibm.com 	__be32 reserved;
6191da177e4SLinus Torvalds }__attribute__((packed, aligned (4)));
6201da177e4SLinus Torvalds 
6211da177e4SLinus Torvalds struct ipr_ioasa_af_dasd {
6221da177e4SLinus Torvalds 	__be32 failing_lba;
623c8f74892Sbrking@us.ibm.com 	__be32 reserved[2];
6241da177e4SLinus Torvalds }__attribute__((packed, aligned (4)));
6251da177e4SLinus Torvalds 
6261da177e4SLinus Torvalds struct ipr_ioasa_gpdd {
6271da177e4SLinus Torvalds 	u8 end_state;
6281da177e4SLinus Torvalds 	u8 bus_phase;
6291da177e4SLinus Torvalds 	__be16 reserved;
630c8f74892Sbrking@us.ibm.com 	__be32 ioa_data[2];
6311da177e4SLinus Torvalds }__attribute__((packed, aligned (4)));
6321da177e4SLinus Torvalds 
633c8f74892Sbrking@us.ibm.com struct ipr_auto_sense {
634c8f74892Sbrking@us.ibm.com 	__be16 auto_sense_len;
635c8f74892Sbrking@us.ibm.com 	__be16 ioa_data_len;
636c8f74892Sbrking@us.ibm.com 	__be32 data[SCSI_SENSE_BUFFERSIZE/sizeof(__be32)];
637c8f74892Sbrking@us.ibm.com };
6381da177e4SLinus Torvalds 
63996d21f00SWayne Boyer struct ipr_ioasa_hdr {
6401da177e4SLinus Torvalds 	__be32 ioasc;
6411da177e4SLinus Torvalds #define IPR_IOASC_SENSE_KEY(ioasc) ((ioasc) >> 24)
6421da177e4SLinus Torvalds #define IPR_IOASC_SENSE_CODE(ioasc) (((ioasc) & 0x00ff0000) >> 16)
6431da177e4SLinus Torvalds #define IPR_IOASC_SENSE_QUAL(ioasc) (((ioasc) & 0x0000ff00) >> 8)
6441da177e4SLinus Torvalds #define IPR_IOASC_SENSE_STATUS(ioasc) ((ioasc) & 0x000000ff)
6451da177e4SLinus Torvalds 
6461da177e4SLinus Torvalds 	__be16 ret_stat_len;	/* Length of the returned IOASA */
6471da177e4SLinus Torvalds 
6481da177e4SLinus Torvalds 	__be16 avail_stat_len;	/* Total Length of status available. */
6491da177e4SLinus Torvalds 
6501da177e4SLinus Torvalds 	__be32 residual_data_len;	/* number of bytes in the host data */
6511da177e4SLinus Torvalds 	/* buffers that were not used by the IOARCB command. */
6521da177e4SLinus Torvalds 
6531da177e4SLinus Torvalds 	__be32 ilid;
6541da177e4SLinus Torvalds #define IPR_NO_ILID			0
6551da177e4SLinus Torvalds #define IPR_DRIVER_ILID		0xffffffff
6561da177e4SLinus Torvalds 
6571da177e4SLinus Torvalds 	__be32 fd_ioasc;
6581da177e4SLinus Torvalds 
6591da177e4SLinus Torvalds 	__be32 fd_phys_locator;
6601da177e4SLinus Torvalds 
6611da177e4SLinus Torvalds 	__be32 fd_res_handle;
6621da177e4SLinus Torvalds 
6631da177e4SLinus Torvalds 	__be32 ioasc_specific;	/* status code specific field */
664c8f74892Sbrking@us.ibm.com #define IPR_ADDITIONAL_STATUS_FMT		0x80000000
665c8f74892Sbrking@us.ibm.com #define IPR_AUTOSENSE_VALID			0x40000000
6661da177e4SLinus Torvalds #define IPR_IOASC_SPECIFIC_MASK		0x00ffffff
6671da177e4SLinus Torvalds #define IPR_FIELD_POINTER_VALID		(0x80000000 >> 8)
6681da177e4SLinus Torvalds #define IPR_FIELD_POINTER_MASK		0x0000ffff
6691da177e4SLinus Torvalds 
67096d21f00SWayne Boyer }__attribute__((packed, aligned (4)));
67196d21f00SWayne Boyer 
67296d21f00SWayne Boyer struct ipr_ioasa {
67396d21f00SWayne Boyer 	struct ipr_ioasa_hdr hdr;
67496d21f00SWayne Boyer 
67596d21f00SWayne Boyer 	union {
67696d21f00SWayne Boyer 		struct ipr_ioasa_vset vset;
67796d21f00SWayne Boyer 		struct ipr_ioasa_af_dasd dasd;
67896d21f00SWayne Boyer 		struct ipr_ioasa_gpdd gpdd;
67996d21f00SWayne Boyer 	} u;
68096d21f00SWayne Boyer 
68196d21f00SWayne Boyer 	struct ipr_auto_sense auto_sense;
68296d21f00SWayne Boyer }__attribute__((packed, aligned (4)));
68396d21f00SWayne Boyer 
68496d21f00SWayne Boyer struct ipr_ioasa64 {
68596d21f00SWayne Boyer 	struct ipr_ioasa_hdr hdr;
68696d21f00SWayne Boyer 	u8 fd_res_path[8];
68796d21f00SWayne Boyer 
6881da177e4SLinus Torvalds 	union {
6891da177e4SLinus Torvalds 		struct ipr_ioasa_vset vset;
6901da177e4SLinus Torvalds 		struct ipr_ioasa_af_dasd dasd;
6911da177e4SLinus Torvalds 		struct ipr_ioasa_gpdd gpdd;
6921da177e4SLinus Torvalds 	} u;
693c8f74892Sbrking@us.ibm.com 
694c8f74892Sbrking@us.ibm.com 	struct ipr_auto_sense auto_sense;
6951da177e4SLinus Torvalds }__attribute__((packed, aligned (4)));
6961da177e4SLinus Torvalds 
6971da177e4SLinus Torvalds struct ipr_mode_parm_hdr {
6981da177e4SLinus Torvalds 	u8 length;
6991da177e4SLinus Torvalds 	u8 medium_type;
7001da177e4SLinus Torvalds 	u8 device_spec_parms;
7011da177e4SLinus Torvalds 	u8 block_desc_len;
7021da177e4SLinus Torvalds }__attribute__((packed));
7031da177e4SLinus Torvalds 
7041da177e4SLinus Torvalds struct ipr_mode_pages {
7051da177e4SLinus Torvalds 	struct ipr_mode_parm_hdr hdr;
7061da177e4SLinus Torvalds 	u8 data[255 - sizeof(struct ipr_mode_parm_hdr)];
7071da177e4SLinus Torvalds }__attribute__((packed));
7081da177e4SLinus Torvalds 
7091da177e4SLinus Torvalds struct ipr_mode_page_hdr {
7101da177e4SLinus Torvalds 	u8 ps_page_code;
7111da177e4SLinus Torvalds #define IPR_MODE_PAGE_PS	0x80
7121da177e4SLinus Torvalds #define IPR_GET_MODE_PAGE_CODE(hdr) ((hdr)->ps_page_code & 0x3F)
7131da177e4SLinus Torvalds 	u8 page_length;
7141da177e4SLinus Torvalds }__attribute__ ((packed));
7151da177e4SLinus Torvalds 
7161da177e4SLinus Torvalds struct ipr_dev_bus_entry {
7171da177e4SLinus Torvalds 	struct ipr_res_addr res_addr;
7181da177e4SLinus Torvalds 	u8 flags;
7191da177e4SLinus Torvalds #define IPR_SCSI_ATTR_ENABLE_QAS			0x80
7201da177e4SLinus Torvalds #define IPR_SCSI_ATTR_DISABLE_QAS			0x40
7211da177e4SLinus Torvalds #define IPR_SCSI_ATTR_QAS_MASK				0xC0
7221da177e4SLinus Torvalds #define IPR_SCSI_ATTR_ENABLE_TM				0x20
7231da177e4SLinus Torvalds #define IPR_SCSI_ATTR_NO_TERM_PWR			0x10
7241da177e4SLinus Torvalds #define IPR_SCSI_ATTR_TM_SUPPORTED			0x08
7251da177e4SLinus Torvalds #define IPR_SCSI_ATTR_LVD_TO_SE_NOT_ALLOWED	0x04
7261da177e4SLinus Torvalds 
7271da177e4SLinus Torvalds 	u8 scsi_id;
7281da177e4SLinus Torvalds 	u8 bus_width;
7291da177e4SLinus Torvalds 	u8 extended_reset_delay;
7301da177e4SLinus Torvalds #define IPR_EXTENDED_RESET_DELAY	7
7311da177e4SLinus Torvalds 
7321da177e4SLinus Torvalds 	__be32 max_xfer_rate;
7331da177e4SLinus Torvalds 
7341da177e4SLinus Torvalds 	u8 spinup_delay;
7351da177e4SLinus Torvalds 	u8 reserved3;
7361da177e4SLinus Torvalds 	__be16 reserved4;
7371da177e4SLinus Torvalds }__attribute__((packed, aligned (4)));
7381da177e4SLinus Torvalds 
7391da177e4SLinus Torvalds struct ipr_mode_page28 {
7401da177e4SLinus Torvalds 	struct ipr_mode_page_hdr hdr;
7411da177e4SLinus Torvalds 	u8 num_entries;
7421da177e4SLinus Torvalds 	u8 entry_length;
7435febf6d6SGustavo A. R. Silva 	struct ipr_dev_bus_entry bus[];
7441da177e4SLinus Torvalds }__attribute__((packed));
7451da177e4SLinus Torvalds 
746ac09c349SBrian King struct ipr_mode_page24 {
747ac09c349SBrian King 	struct ipr_mode_page_hdr hdr;
748ac09c349SBrian King 	u8 flags;
749ac09c349SBrian King #define IPR_ENABLE_DUAL_IOA_AF 0x80
750ac09c349SBrian King }__attribute__((packed));
751ac09c349SBrian King 
7521da177e4SLinus Torvalds struct ipr_ioa_vpd {
7531da177e4SLinus Torvalds 	struct ipr_std_inq_data std_inq_data;
7541da177e4SLinus Torvalds 	u8 ascii_part_num[12];
7551da177e4SLinus Torvalds 	u8 reserved[40];
7561da177e4SLinus Torvalds 	u8 ascii_plant_code[4];
7571da177e4SLinus Torvalds }__attribute__((packed));
7581da177e4SLinus Torvalds 
7591da177e4SLinus Torvalds struct ipr_inquiry_page3 {
7601da177e4SLinus Torvalds 	u8 peri_qual_dev_type;
7611da177e4SLinus Torvalds 	u8 page_code;
7621da177e4SLinus Torvalds 	u8 reserved1;
7631da177e4SLinus Torvalds 	u8 page_length;
7641da177e4SLinus Torvalds 	u8 ascii_len;
7651da177e4SLinus Torvalds 	u8 reserved2[3];
7661da177e4SLinus Torvalds 	u8 load_id[4];
7671da177e4SLinus Torvalds 	u8 major_release;
7681da177e4SLinus Torvalds 	u8 card_type;
7691da177e4SLinus Torvalds 	u8 minor_release[2];
7701da177e4SLinus Torvalds 	u8 ptf_number[4];
7711da177e4SLinus Torvalds 	u8 patch_number[4];
7721da177e4SLinus Torvalds }__attribute__((packed));
7731da177e4SLinus Torvalds 
774ac09c349SBrian King struct ipr_inquiry_cap {
775ac09c349SBrian King 	u8 peri_qual_dev_type;
776ac09c349SBrian King 	u8 page_code;
777ac09c349SBrian King 	u8 reserved1;
778ac09c349SBrian King 	u8 page_length;
779ac09c349SBrian King 	u8 ascii_len;
780ac09c349SBrian King 	u8 reserved2;
781ac09c349SBrian King 	u8 sis_version[2];
782ac09c349SBrian King 	u8 cap;
783ac09c349SBrian King #define IPR_CAP_DUAL_IOA_RAID		0x80
784ac09c349SBrian King 	u8 reserved3[15];
785ac09c349SBrian King }__attribute__((packed));
786ac09c349SBrian King 
78762275040Sbrking@us.ibm.com #define IPR_INQUIRY_PAGE0_ENTRIES 20
78862275040Sbrking@us.ibm.com struct ipr_inquiry_page0 {
78962275040Sbrking@us.ibm.com 	u8 peri_qual_dev_type;
79062275040Sbrking@us.ibm.com 	u8 page_code;
79162275040Sbrking@us.ibm.com 	u8 reserved1;
79262275040Sbrking@us.ibm.com 	u8 len;
79362275040Sbrking@us.ibm.com 	u8 page[IPR_INQUIRY_PAGE0_ENTRIES];
79462275040Sbrking@us.ibm.com }__attribute__((packed));
79562275040Sbrking@us.ibm.com 
7961021b3ffSGabriel Krisman Bertazi struct ipr_inquiry_pageC4 {
7971021b3ffSGabriel Krisman Bertazi 	u8 peri_qual_dev_type;
7981021b3ffSGabriel Krisman Bertazi 	u8 page_code;
7991021b3ffSGabriel Krisman Bertazi 	u8 reserved1;
8001021b3ffSGabriel Krisman Bertazi 	u8 len;
8011021b3ffSGabriel Krisman Bertazi 	u8 cache_cap[4];
8021021b3ffSGabriel Krisman Bertazi #define IPR_CAP_SYNC_CACHE		0x08
8031021b3ffSGabriel Krisman Bertazi 	u8 reserved2[20];
8041021b3ffSGabriel Krisman Bertazi } __packed;
8051021b3ffSGabriel Krisman Bertazi 
8061da177e4SLinus Torvalds struct ipr_hostrcb_device_data_entry {
807cfc32139Sbrking@us.ibm.com 	struct ipr_vpd vpd;
8081da177e4SLinus Torvalds 	struct ipr_res_addr dev_res_addr;
809cfc32139Sbrking@us.ibm.com 	struct ipr_vpd new_vpd;
810cfc32139Sbrking@us.ibm.com 	struct ipr_vpd ioa_last_with_dev_vpd;
811cfc32139Sbrking@us.ibm.com 	struct ipr_vpd cfc_last_with_dev_vpd;
8121da177e4SLinus Torvalds 	__be32 ioa_data[5];
8131da177e4SLinus Torvalds }__attribute__((packed, aligned (4)));
8141da177e4SLinus Torvalds 
815ee0f05b8Sbrking@us.ibm.com struct ipr_hostrcb_device_data_entry_enhanced {
816ee0f05b8Sbrking@us.ibm.com 	struct ipr_ext_vpd vpd;
817ee0f05b8Sbrking@us.ibm.com 	u8 ccin[4];
818ee0f05b8Sbrking@us.ibm.com 	struct ipr_res_addr dev_res_addr;
819ee0f05b8Sbrking@us.ibm.com 	struct ipr_ext_vpd new_vpd;
820ee0f05b8Sbrking@us.ibm.com 	u8 new_ccin[4];
821ee0f05b8Sbrking@us.ibm.com 	struct ipr_ext_vpd ioa_last_with_dev_vpd;
822ee0f05b8Sbrking@us.ibm.com 	struct ipr_ext_vpd cfc_last_with_dev_vpd;
823ee0f05b8Sbrking@us.ibm.com }__attribute__((packed, aligned (4)));
824ee0f05b8Sbrking@us.ibm.com 
8254565e370SWayne Boyer struct ipr_hostrcb64_device_data_entry_enhanced {
8264565e370SWayne Boyer 	struct ipr_ext_vpd vpd;
8274565e370SWayne Boyer 	u8 ccin[4];
8284565e370SWayne Boyer 	u8 res_path[8];
8294565e370SWayne Boyer 	struct ipr_ext_vpd new_vpd;
8304565e370SWayne Boyer 	u8 new_ccin[4];
8314565e370SWayne Boyer 	struct ipr_ext_vpd ioa_last_with_dev_vpd;
8324565e370SWayne Boyer 	struct ipr_ext_vpd cfc_last_with_dev_vpd;
8334565e370SWayne Boyer }__attribute__((packed, aligned (4)));
8344565e370SWayne Boyer 
8351da177e4SLinus Torvalds struct ipr_hostrcb_array_data_entry {
836cfc32139Sbrking@us.ibm.com 	struct ipr_vpd vpd;
8371da177e4SLinus Torvalds 	struct ipr_res_addr expected_dev_res_addr;
8381da177e4SLinus Torvalds 	struct ipr_res_addr dev_res_addr;
8391da177e4SLinus Torvalds }__attribute__((packed, aligned (4)));
8401da177e4SLinus Torvalds 
8414565e370SWayne Boyer struct ipr_hostrcb64_array_data_entry {
8424565e370SWayne Boyer 	struct ipr_ext_vpd vpd;
8434565e370SWayne Boyer 	u8 ccin[4];
8444565e370SWayne Boyer 	u8 expected_res_path[8];
8454565e370SWayne Boyer 	u8 res_path[8];
8464565e370SWayne Boyer }__attribute__((packed, aligned (4)));
8474565e370SWayne Boyer 
848ee0f05b8Sbrking@us.ibm.com struct ipr_hostrcb_array_data_entry_enhanced {
849ee0f05b8Sbrking@us.ibm.com 	struct ipr_ext_vpd vpd;
850ee0f05b8Sbrking@us.ibm.com 	u8 ccin[4];
851ee0f05b8Sbrking@us.ibm.com 	struct ipr_res_addr expected_dev_res_addr;
852ee0f05b8Sbrking@us.ibm.com 	struct ipr_res_addr dev_res_addr;
853ee0f05b8Sbrking@us.ibm.com }__attribute__((packed, aligned (4)));
854ee0f05b8Sbrking@us.ibm.com 
8551da177e4SLinus Torvalds struct ipr_hostrcb_type_ff_error {
856438b0331SWayne Boyer 	__be32 ioa_data[758];
8571da177e4SLinus Torvalds }__attribute__((packed, aligned (4)));
8581da177e4SLinus Torvalds 
8591da177e4SLinus Torvalds struct ipr_hostrcb_type_01_error {
8601da177e4SLinus Torvalds 	__be32 seek_counter;
8611da177e4SLinus Torvalds 	__be32 read_counter;
8621da177e4SLinus Torvalds 	u8 sense_data[32];
8631da177e4SLinus Torvalds 	__be32 ioa_data[236];
8641da177e4SLinus Torvalds }__attribute__((packed, aligned (4)));
8651da177e4SLinus Torvalds 
866169b9ec8SWendy Xiong struct ipr_hostrcb_type_21_error {
867169b9ec8SWendy Xiong 	__be32 wwn[4];
868169b9ec8SWendy Xiong 	u8 res_path[8];
869169b9ec8SWendy Xiong 	u8 primary_problem_desc[32];
870169b9ec8SWendy Xiong 	u8 second_problem_desc[32];
871169b9ec8SWendy Xiong 	__be32 sense_data[8];
872169b9ec8SWendy Xiong 	__be32 cdb[4];
873169b9ec8SWendy Xiong 	__be32 residual_trans_length;
874169b9ec8SWendy Xiong 	__be32 length_of_error;
875169b9ec8SWendy Xiong 	__be32 ioa_data[236];
876169b9ec8SWendy Xiong }__attribute__((packed, aligned (4)));
877169b9ec8SWendy Xiong 
8781da177e4SLinus Torvalds struct ipr_hostrcb_type_02_error {
879cfc32139Sbrking@us.ibm.com 	struct ipr_vpd ioa_vpd;
880cfc32139Sbrking@us.ibm.com 	struct ipr_vpd cfc_vpd;
881cfc32139Sbrking@us.ibm.com 	struct ipr_vpd ioa_last_attached_to_cfc_vpd;
882cfc32139Sbrking@us.ibm.com 	struct ipr_vpd cfc_last_attached_to_ioa_vpd;
8831da177e4SLinus Torvalds 	__be32 ioa_data[3];
8841da177e4SLinus Torvalds }__attribute__((packed, aligned (4)));
8851da177e4SLinus Torvalds 
886ee0f05b8Sbrking@us.ibm.com struct ipr_hostrcb_type_12_error {
887ee0f05b8Sbrking@us.ibm.com 	struct ipr_ext_vpd ioa_vpd;
888ee0f05b8Sbrking@us.ibm.com 	struct ipr_ext_vpd cfc_vpd;
889ee0f05b8Sbrking@us.ibm.com 	struct ipr_ext_vpd ioa_last_attached_to_cfc_vpd;
890ee0f05b8Sbrking@us.ibm.com 	struct ipr_ext_vpd cfc_last_attached_to_ioa_vpd;
891ee0f05b8Sbrking@us.ibm.com 	__be32 ioa_data[3];
892ee0f05b8Sbrking@us.ibm.com }__attribute__((packed, aligned (4)));
893ee0f05b8Sbrking@us.ibm.com 
8941da177e4SLinus Torvalds struct ipr_hostrcb_type_03_error {
895cfc32139Sbrking@us.ibm.com 	struct ipr_vpd ioa_vpd;
896cfc32139Sbrking@us.ibm.com 	struct ipr_vpd cfc_vpd;
8971da177e4SLinus Torvalds 	__be32 errors_detected;
8981da177e4SLinus Torvalds 	__be32 errors_logged;
8991da177e4SLinus Torvalds 	u8 ioa_data[12];
900cfc32139Sbrking@us.ibm.com 	struct ipr_hostrcb_device_data_entry dev[3];
9011da177e4SLinus Torvalds }__attribute__((packed, aligned (4)));
9021da177e4SLinus Torvalds 
903ee0f05b8Sbrking@us.ibm.com struct ipr_hostrcb_type_13_error {
904ee0f05b8Sbrking@us.ibm.com 	struct ipr_ext_vpd ioa_vpd;
905ee0f05b8Sbrking@us.ibm.com 	struct ipr_ext_vpd cfc_vpd;
906ee0f05b8Sbrking@us.ibm.com 	__be32 errors_detected;
907ee0f05b8Sbrking@us.ibm.com 	__be32 errors_logged;
908ee0f05b8Sbrking@us.ibm.com 	struct ipr_hostrcb_device_data_entry_enhanced dev[3];
909ee0f05b8Sbrking@us.ibm.com }__attribute__((packed, aligned (4)));
910ee0f05b8Sbrking@us.ibm.com 
9114565e370SWayne Boyer struct ipr_hostrcb_type_23_error {
9124565e370SWayne Boyer 	struct ipr_ext_vpd ioa_vpd;
9134565e370SWayne Boyer 	struct ipr_ext_vpd cfc_vpd;
9144565e370SWayne Boyer 	__be32 errors_detected;
9154565e370SWayne Boyer 	__be32 errors_logged;
9164565e370SWayne Boyer 	struct ipr_hostrcb64_device_data_entry_enhanced dev[3];
9174565e370SWayne Boyer }__attribute__((packed, aligned (4)));
9184565e370SWayne Boyer 
9191da177e4SLinus Torvalds struct ipr_hostrcb_type_04_error {
920cfc32139Sbrking@us.ibm.com 	struct ipr_vpd ioa_vpd;
921cfc32139Sbrking@us.ibm.com 	struct ipr_vpd cfc_vpd;
9221da177e4SLinus Torvalds 	u8 ioa_data[12];
9231da177e4SLinus Torvalds 	struct ipr_hostrcb_array_data_entry array_member[10];
9241da177e4SLinus Torvalds 	__be32 exposed_mode_adn;
9251da177e4SLinus Torvalds 	__be32 array_id;
926cfc32139Sbrking@us.ibm.com 	struct ipr_vpd incomp_dev_vpd;
9271da177e4SLinus Torvalds 	__be32 ioa_data2;
9281da177e4SLinus Torvalds 	struct ipr_hostrcb_array_data_entry array_member2[8];
9291da177e4SLinus Torvalds 	struct ipr_res_addr last_func_vset_res_addr;
9301da177e4SLinus Torvalds 	u8 vset_serial_num[IPR_SERIAL_NUM_LEN];
9311da177e4SLinus Torvalds 	u8 protection_level[8];
9321da177e4SLinus Torvalds }__attribute__((packed, aligned (4)));
9331da177e4SLinus Torvalds 
934ee0f05b8Sbrking@us.ibm.com struct ipr_hostrcb_type_14_error {
935ee0f05b8Sbrking@us.ibm.com 	struct ipr_ext_vpd ioa_vpd;
936ee0f05b8Sbrking@us.ibm.com 	struct ipr_ext_vpd cfc_vpd;
937ee0f05b8Sbrking@us.ibm.com 	__be32 exposed_mode_adn;
938ee0f05b8Sbrking@us.ibm.com 	__be32 array_id;
939ee0f05b8Sbrking@us.ibm.com 	struct ipr_res_addr last_func_vset_res_addr;
940ee0f05b8Sbrking@us.ibm.com 	u8 vset_serial_num[IPR_SERIAL_NUM_LEN];
941ee0f05b8Sbrking@us.ibm.com 	u8 protection_level[8];
942ee0f05b8Sbrking@us.ibm.com 	__be32 num_entries;
943ee0f05b8Sbrking@us.ibm.com 	struct ipr_hostrcb_array_data_entry_enhanced array_member[18];
944ee0f05b8Sbrking@us.ibm.com }__attribute__((packed, aligned (4)));
945ee0f05b8Sbrking@us.ibm.com 
9464565e370SWayne Boyer struct ipr_hostrcb_type_24_error {
9474565e370SWayne Boyer 	struct ipr_ext_vpd ioa_vpd;
9484565e370SWayne Boyer 	struct ipr_ext_vpd cfc_vpd;
9494565e370SWayne Boyer 	u8 reserved[2];
9504565e370SWayne Boyer 	u8 exposed_mode_adn;
9514565e370SWayne Boyer #define IPR_INVALID_ARRAY_DEV_NUM		0xff
9524565e370SWayne Boyer 	u8 array_id;
9534565e370SWayne Boyer 	u8 last_res_path[8];
9544565e370SWayne Boyer 	u8 protection_level[8];
9557262026fSWayne Boyer 	struct ipr_ext_vpd64 array_vpd;
9564565e370SWayne Boyer 	u8 description[16];
9574565e370SWayne Boyer 	u8 reserved2[3];
9584565e370SWayne Boyer 	u8 num_entries;
9594565e370SWayne Boyer 	struct ipr_hostrcb64_array_data_entry array_member[32];
9604565e370SWayne Boyer }__attribute__((packed, aligned (4)));
9614565e370SWayne Boyer 
962b0df54bbSbrking@us.ibm.com struct ipr_hostrcb_type_07_error {
963b0df54bbSbrking@us.ibm.com 	u8 failure_reason[64];
964b0df54bbSbrking@us.ibm.com 	struct ipr_vpd vpd;
965359d96e7SBrian King 	__be32 data[222];
966b0df54bbSbrking@us.ibm.com }__attribute__((packed, aligned (4)));
967b0df54bbSbrking@us.ibm.com 
968ee0f05b8Sbrking@us.ibm.com struct ipr_hostrcb_type_17_error {
969ee0f05b8Sbrking@us.ibm.com 	u8 failure_reason[64];
970ee0f05b8Sbrking@us.ibm.com 	struct ipr_ext_vpd vpd;
971359d96e7SBrian King 	__be32 data[476];
972ee0f05b8Sbrking@us.ibm.com }__attribute__((packed, aligned (4)));
973ee0f05b8Sbrking@us.ibm.com 
97449dc6a18SBrian King struct ipr_hostrcb_config_element {
97549dc6a18SBrian King 	u8 type_status;
97649dc6a18SBrian King #define IPR_PATH_CFG_TYPE_MASK	0xF0
97749dc6a18SBrian King #define IPR_PATH_CFG_NOT_EXIST	0x00
97849dc6a18SBrian King #define IPR_PATH_CFG_IOA_PORT		0x10
97949dc6a18SBrian King #define IPR_PATH_CFG_EXP_PORT		0x20
98049dc6a18SBrian King #define IPR_PATH_CFG_DEVICE_PORT	0x30
98149dc6a18SBrian King #define IPR_PATH_CFG_DEVICE_LUN	0x40
98249dc6a18SBrian King 
98349dc6a18SBrian King #define IPR_PATH_CFG_STATUS_MASK	0x0F
98449dc6a18SBrian King #define IPR_PATH_CFG_NO_PROB		0x00
98549dc6a18SBrian King #define IPR_PATH_CFG_DEGRADED		0x01
98649dc6a18SBrian King #define IPR_PATH_CFG_FAILED		0x02
98749dc6a18SBrian King #define IPR_PATH_CFG_SUSPECT		0x03
98849dc6a18SBrian King #define IPR_PATH_NOT_DETECTED		0x04
98949dc6a18SBrian King #define IPR_PATH_INCORRECT_CONN	0x05
99049dc6a18SBrian King 
99149dc6a18SBrian King 	u8 cascaded_expander;
99249dc6a18SBrian King 	u8 phy;
99349dc6a18SBrian King 	u8 link_rate;
99449dc6a18SBrian King #define IPR_PHY_LINK_RATE_MASK	0x0F
99549dc6a18SBrian King 
99649dc6a18SBrian King 	__be32 wwid[2];
99749dc6a18SBrian King }__attribute__((packed, aligned (4)));
99849dc6a18SBrian King 
9994565e370SWayne Boyer struct ipr_hostrcb64_config_element {
10004565e370SWayne Boyer 	__be16 length;
10014565e370SWayne Boyer 	u8 descriptor_id;
10024565e370SWayne Boyer #define IPR_DESCRIPTOR_MASK		0xC0
10034565e370SWayne Boyer #define IPR_DESCRIPTOR_SIS64		0x00
10044565e370SWayne Boyer 
10054565e370SWayne Boyer 	u8 reserved;
10064565e370SWayne Boyer 	u8 type_status;
10074565e370SWayne Boyer 
10084565e370SWayne Boyer 	u8 reserved2[2];
10094565e370SWayne Boyer 	u8 link_rate;
10104565e370SWayne Boyer 
10114565e370SWayne Boyer 	u8 res_path[8];
10124565e370SWayne Boyer 	__be32 wwid[2];
10134565e370SWayne Boyer }__attribute__((packed, aligned (8)));
10144565e370SWayne Boyer 
101549dc6a18SBrian King struct ipr_hostrcb_fabric_desc {
101649dc6a18SBrian King 	__be16 length;
101749dc6a18SBrian King 	u8 ioa_port;
101849dc6a18SBrian King 	u8 cascaded_expander;
101949dc6a18SBrian King 	u8 phy;
102049dc6a18SBrian King 	u8 path_state;
102149dc6a18SBrian King #define IPR_PATH_ACTIVE_MASK		0xC0
102249dc6a18SBrian King #define IPR_PATH_NO_INFO		0x00
102349dc6a18SBrian King #define IPR_PATH_ACTIVE			0x40
102449dc6a18SBrian King #define IPR_PATH_NOT_ACTIVE		0x80
102549dc6a18SBrian King 
102649dc6a18SBrian King #define IPR_PATH_STATE_MASK		0x0F
102749dc6a18SBrian King #define IPR_PATH_STATE_NO_INFO	0x00
102849dc6a18SBrian King #define IPR_PATH_HEALTHY		0x01
102949dc6a18SBrian King #define IPR_PATH_DEGRADED		0x02
103049dc6a18SBrian King #define IPR_PATH_FAILED			0x03
103149dc6a18SBrian King 
103249dc6a18SBrian King 	__be16 num_entries;
103349dc6a18SBrian King 	struct ipr_hostrcb_config_element elem[1];
103449dc6a18SBrian King }__attribute__((packed, aligned (4)));
103549dc6a18SBrian King 
10364565e370SWayne Boyer struct ipr_hostrcb64_fabric_desc {
10374565e370SWayne Boyer 	__be16 length;
10384565e370SWayne Boyer 	u8 descriptor_id;
10394565e370SWayne Boyer 
10408701f185SWayne Boyer 	u8 reserved[2];
10414565e370SWayne Boyer 	u8 path_state;
10424565e370SWayne Boyer 
10434565e370SWayne Boyer 	u8 reserved2[2];
10444565e370SWayne Boyer 	u8 res_path[8];
10454565e370SWayne Boyer 	u8 reserved3[6];
10464565e370SWayne Boyer 	__be16 num_entries;
10474565e370SWayne Boyer 	struct ipr_hostrcb64_config_element elem[1];
10484565e370SWayne Boyer }__attribute__((packed, aligned (8)));
10494565e370SWayne Boyer 
105056d6aa33Swenxiong@linux.vnet.ibm.com #define for_each_hrrq(hrrq, ioa_cfg) \
105156d6aa33Swenxiong@linux.vnet.ibm.com 		for (hrrq = (ioa_cfg)->hrrq; \
105256d6aa33Swenxiong@linux.vnet.ibm.com 			hrrq < ((ioa_cfg)->hrrq + (ioa_cfg)->hrrq_num); hrrq++)
105356d6aa33Swenxiong@linux.vnet.ibm.com 
105449dc6a18SBrian King #define for_each_fabric_cfg(fabric, cfg) \
105549dc6a18SBrian King 		for (cfg = (fabric)->elem; \
105649dc6a18SBrian King 			cfg < ((fabric)->elem + be16_to_cpu((fabric)->num_entries)); \
105749dc6a18SBrian King 			cfg++)
105849dc6a18SBrian King 
105949dc6a18SBrian King struct ipr_hostrcb_type_20_error {
106049dc6a18SBrian King 	u8 failure_reason[64];
106149dc6a18SBrian King 	u8 reserved[3];
106249dc6a18SBrian King 	u8 num_entries;
106349dc6a18SBrian King 	struct ipr_hostrcb_fabric_desc desc[1];
106449dc6a18SBrian King }__attribute__((packed, aligned (4)));
106549dc6a18SBrian King 
10664565e370SWayne Boyer struct ipr_hostrcb_type_30_error {
10674565e370SWayne Boyer 	u8 failure_reason[64];
10684565e370SWayne Boyer 	u8 reserved[3];
10694565e370SWayne Boyer 	u8 num_entries;
10704565e370SWayne Boyer 	struct ipr_hostrcb64_fabric_desc desc[1];
10714565e370SWayne Boyer }__attribute__((packed, aligned (4)));
10724565e370SWayne Boyer 
107315c5a5e0SWen Xiong struct ipr_hostrcb_type_41_error {
107415c5a5e0SWen Xiong 	u8 failure_reason[64];
107515c5a5e0SWen Xiong 	 __be32 data[200];
107615c5a5e0SWen Xiong }__attribute__((packed, aligned (4)));
107715c5a5e0SWen Xiong 
10781da177e4SLinus Torvalds struct ipr_hostrcb_error {
10794565e370SWayne Boyer 	__be32 fd_ioasc;
10804565e370SWayne Boyer 	struct ipr_res_addr fd_res_addr;
10814565e370SWayne Boyer 	__be32 fd_res_handle;
10821da177e4SLinus Torvalds 	__be32 prc;
10831da177e4SLinus Torvalds 	union {
10841da177e4SLinus Torvalds 		struct ipr_hostrcb_type_ff_error type_ff_error;
10851da177e4SLinus Torvalds 		struct ipr_hostrcb_type_01_error type_01_error;
10861da177e4SLinus Torvalds 		struct ipr_hostrcb_type_02_error type_02_error;
10871da177e4SLinus Torvalds 		struct ipr_hostrcb_type_03_error type_03_error;
10881da177e4SLinus Torvalds 		struct ipr_hostrcb_type_04_error type_04_error;
1089b0df54bbSbrking@us.ibm.com 		struct ipr_hostrcb_type_07_error type_07_error;
1090ee0f05b8Sbrking@us.ibm.com 		struct ipr_hostrcb_type_12_error type_12_error;
1091ee0f05b8Sbrking@us.ibm.com 		struct ipr_hostrcb_type_13_error type_13_error;
1092ee0f05b8Sbrking@us.ibm.com 		struct ipr_hostrcb_type_14_error type_14_error;
1093ee0f05b8Sbrking@us.ibm.com 		struct ipr_hostrcb_type_17_error type_17_error;
109449dc6a18SBrian King 		struct ipr_hostrcb_type_20_error type_20_error;
10951da177e4SLinus Torvalds 	} u;
10961da177e4SLinus Torvalds }__attribute__((packed, aligned (4)));
10971da177e4SLinus Torvalds 
10984565e370SWayne Boyer struct ipr_hostrcb64_error {
10994565e370SWayne Boyer 	__be32 fd_ioasc;
11004565e370SWayne Boyer 	__be32 ioa_fw_level;
11014565e370SWayne Boyer 	__be32 fd_res_handle;
11024565e370SWayne Boyer 	__be32 prc;
11034565e370SWayne Boyer 	__be64 fd_dev_id;
11044565e370SWayne Boyer 	__be64 fd_lun;
11054565e370SWayne Boyer 	u8 fd_res_path[8];
11064565e370SWayne Boyer 	__be64 time_stamp;
11078701f185SWayne Boyer 	u8 reserved[16];
11084565e370SWayne Boyer 	union {
11094565e370SWayne Boyer 		struct ipr_hostrcb_type_ff_error type_ff_error;
11104565e370SWayne Boyer 		struct ipr_hostrcb_type_12_error type_12_error;
11114565e370SWayne Boyer 		struct ipr_hostrcb_type_17_error type_17_error;
1112169b9ec8SWendy Xiong 		struct ipr_hostrcb_type_21_error type_21_error;
11134565e370SWayne Boyer 		struct ipr_hostrcb_type_23_error type_23_error;
11144565e370SWayne Boyer 		struct ipr_hostrcb_type_24_error type_24_error;
11154565e370SWayne Boyer 		struct ipr_hostrcb_type_30_error type_30_error;
111615c5a5e0SWen Xiong 		struct ipr_hostrcb_type_41_error type_41_error;
11174565e370SWayne Boyer 	} u;
11184565e370SWayne Boyer }__attribute__((packed, aligned (8)));
11194565e370SWayne Boyer 
11201da177e4SLinus Torvalds struct ipr_hostrcb_raw {
11211da177e4SLinus Torvalds 	__be32 data[sizeof(struct ipr_hostrcb_error)/sizeof(__be32)];
11221da177e4SLinus Torvalds }__attribute__((packed, aligned (4)));
11231da177e4SLinus Torvalds 
11241da177e4SLinus Torvalds struct ipr_hcam {
11251da177e4SLinus Torvalds 	u8 op_code;
11261da177e4SLinus Torvalds #define IPR_HOST_RCB_OP_CODE_CONFIG_CHANGE			0xE1
11271da177e4SLinus Torvalds #define IPR_HOST_RCB_OP_CODE_LOG_DATA				0xE2
11281da177e4SLinus Torvalds 
11291da177e4SLinus Torvalds 	u8 notify_type;
11301da177e4SLinus Torvalds #define IPR_HOST_RCB_NOTIF_TYPE_EXISTING_CHANGED	0x00
11311da177e4SLinus Torvalds #define IPR_HOST_RCB_NOTIF_TYPE_NEW_ENTRY			0x01
11321da177e4SLinus Torvalds #define IPR_HOST_RCB_NOTIF_TYPE_REM_ENTRY			0x02
11331da177e4SLinus Torvalds #define IPR_HOST_RCB_NOTIF_TYPE_ERROR_LOG_ENTRY		0x10
11341da177e4SLinus Torvalds #define IPR_HOST_RCB_NOTIF_TYPE_INFORMATION_ENTRY	0x11
11351da177e4SLinus Torvalds 
11361da177e4SLinus Torvalds 	u8 notifications_lost;
11371da177e4SLinus Torvalds #define IPR_HOST_RCB_NO_NOTIFICATIONS_LOST			0
11381da177e4SLinus Torvalds #define IPR_HOST_RCB_NOTIFICATIONS_LOST				0x80
11391da177e4SLinus Torvalds 
11401da177e4SLinus Torvalds 	u8 flags;
11411da177e4SLinus Torvalds #define IPR_HOSTRCB_INTERNAL_OPER	0x80
11421da177e4SLinus Torvalds #define IPR_HOSTRCB_ERR_RESP_SENT	0x40
11431da177e4SLinus Torvalds 
11441da177e4SLinus Torvalds 	u8 overlay_id;
11451da177e4SLinus Torvalds #define IPR_HOST_RCB_OVERLAY_ID_1				0x01
11461da177e4SLinus Torvalds #define IPR_HOST_RCB_OVERLAY_ID_2				0x02
11471da177e4SLinus Torvalds #define IPR_HOST_RCB_OVERLAY_ID_3				0x03
11481da177e4SLinus Torvalds #define IPR_HOST_RCB_OVERLAY_ID_4				0x04
11491da177e4SLinus Torvalds #define IPR_HOST_RCB_OVERLAY_ID_6				0x06
1150b0df54bbSbrking@us.ibm.com #define IPR_HOST_RCB_OVERLAY_ID_7				0x07
1151ee0f05b8Sbrking@us.ibm.com #define IPR_HOST_RCB_OVERLAY_ID_12				0x12
1152ee0f05b8Sbrking@us.ibm.com #define IPR_HOST_RCB_OVERLAY_ID_13				0x13
1153ee0f05b8Sbrking@us.ibm.com #define IPR_HOST_RCB_OVERLAY_ID_14				0x14
1154ee0f05b8Sbrking@us.ibm.com #define IPR_HOST_RCB_OVERLAY_ID_16				0x16
1155ee0f05b8Sbrking@us.ibm.com #define IPR_HOST_RCB_OVERLAY_ID_17				0x17
115649dc6a18SBrian King #define IPR_HOST_RCB_OVERLAY_ID_20				0x20
1157169b9ec8SWendy Xiong #define IPR_HOST_RCB_OVERLAY_ID_21				0x21
11584565e370SWayne Boyer #define IPR_HOST_RCB_OVERLAY_ID_23				0x23
11594565e370SWayne Boyer #define IPR_HOST_RCB_OVERLAY_ID_24				0x24
11604565e370SWayne Boyer #define IPR_HOST_RCB_OVERLAY_ID_26				0x26
11614565e370SWayne Boyer #define IPR_HOST_RCB_OVERLAY_ID_30				0x30
116215c5a5e0SWen Xiong #define IPR_HOST_RCB_OVERLAY_ID_41				0x41
11631da177e4SLinus Torvalds #define IPR_HOST_RCB_OVERLAY_ID_DEFAULT				0xFF
11641da177e4SLinus Torvalds 
11651da177e4SLinus Torvalds 	u8 reserved1[3];
11661da177e4SLinus Torvalds 	__be32 ilid;
11671da177e4SLinus Torvalds 	__be32 time_since_last_ioa_reset;
11681da177e4SLinus Torvalds 	__be32 reserved2;
11691da177e4SLinus Torvalds 	__be32 length;
11701da177e4SLinus Torvalds 
11711da177e4SLinus Torvalds 	union {
11721da177e4SLinus Torvalds 		struct ipr_hostrcb_error error;
11734565e370SWayne Boyer 		struct ipr_hostrcb64_error error64;
11741da177e4SLinus Torvalds 		struct ipr_hostrcb_cfg_ch_not ccn;
11751da177e4SLinus Torvalds 		struct ipr_hostrcb_raw raw;
11761da177e4SLinus Torvalds 	} u;
11771da177e4SLinus Torvalds }__attribute__((packed, aligned (4)));
11781da177e4SLinus Torvalds 
11791da177e4SLinus Torvalds struct ipr_hostrcb {
11801da177e4SLinus Torvalds 	struct ipr_hcam hcam;
11811da177e4SLinus Torvalds 	dma_addr_t hostrcb_dma;
11821da177e4SLinus Torvalds 	struct list_head queue;
118349dc6a18SBrian King 	struct ipr_ioa_cfg *ioa_cfg;
11844565e370SWayne Boyer 	char rp_buffer[IPR_MAX_RES_PATH_LENGTH];
11851da177e4SLinus Torvalds };
11861da177e4SLinus Torvalds 
11871da177e4SLinus Torvalds /* IPR smart dump table structures */
11881da177e4SLinus Torvalds struct ipr_sdt_entry {
1189dcbad00eSWayne Boyer 	__be32 start_token;
1190dcbad00eSWayne Boyer 	__be32 end_token;
1191dcbad00eSWayne Boyer 	u8 reserved[4];
11921da177e4SLinus Torvalds 
11931da177e4SLinus Torvalds 	u8 flags;
11941da177e4SLinus Torvalds #define IPR_SDT_ENDIAN		0x80
11951da177e4SLinus Torvalds #define IPR_SDT_VALID_ENTRY	0x20
11961da177e4SLinus Torvalds 
11971da177e4SLinus Torvalds 	u8 resv;
11981da177e4SLinus Torvalds 	__be16 priority;
11991da177e4SLinus Torvalds }__attribute__((packed, aligned (4)));
12001da177e4SLinus Torvalds 
12011da177e4SLinus Torvalds struct ipr_sdt_header {
12021da177e4SLinus Torvalds 	__be32 state;
12031da177e4SLinus Torvalds 	__be32 num_entries;
12041da177e4SLinus Torvalds 	__be32 num_entries_used;
12051da177e4SLinus Torvalds 	__be32 dump_size;
12061da177e4SLinus Torvalds }__attribute__((packed, aligned (4)));
12071da177e4SLinus Torvalds 
12081da177e4SLinus Torvalds struct ipr_sdt {
12091da177e4SLinus Torvalds 	struct ipr_sdt_header hdr;
12104d4dd706SKleber Sacilotto de Souza 	struct ipr_sdt_entry entry[IPR_FMT3_NUM_SDT_ENTRIES];
12111da177e4SLinus Torvalds }__attribute__((packed, aligned (4)));
12121da177e4SLinus Torvalds 
12131da177e4SLinus Torvalds struct ipr_uc_sdt {
12141da177e4SLinus Torvalds 	struct ipr_sdt_header hdr;
12151da177e4SLinus Torvalds 	struct ipr_sdt_entry entry[1];
12161da177e4SLinus Torvalds }__attribute__((packed, aligned (4)));
12171da177e4SLinus Torvalds 
12181da177e4SLinus Torvalds /*
12191da177e4SLinus Torvalds  * Driver types
12201da177e4SLinus Torvalds  */
12211da177e4SLinus Torvalds struct ipr_bus_attributes {
12221da177e4SLinus Torvalds 	u8 bus;
12231da177e4SLinus Torvalds 	u8 qas_enabled;
12241da177e4SLinus Torvalds 	u8 bus_width;
12251da177e4SLinus Torvalds 	u8 reserved;
12261da177e4SLinus Torvalds 	u32 max_xfer_rate;
12271da177e4SLinus Torvalds };
12281da177e4SLinus Torvalds 
12291da177e4SLinus Torvalds struct ipr_resource_entry {
12301da177e4SLinus Torvalds 	u8 needs_sync_complete:1;
12311da177e4SLinus Torvalds 	u8 in_erp:1;
12321da177e4SLinus Torvalds 	u8 add_to_ml:1;
12331da177e4SLinus Torvalds 	u8 del_from_ml:1;
12341da177e4SLinus Torvalds 	u8 resetting_device:1;
12350b1f8d44SWendy Xiong 	u8 reset_occurred:1;
1236f8ee25d7SWen Xiong 	u8 raw_mode:1;
12371da177e4SLinus Torvalds 
12383e7ebdfaSWayne Boyer 	u32 bus;		/* AKA channel */
12393e7ebdfaSWayne Boyer 	u32 target;		/* AKA id */
12403e7ebdfaSWayne Boyer 	u32 lun;
12413e7ebdfaSWayne Boyer #define IPR_ARRAY_VIRTUAL_BUS			0x1
12423e7ebdfaSWayne Boyer #define IPR_VSET_VIRTUAL_BUS			0x2
12433e7ebdfaSWayne Boyer #define IPR_IOAFP_VIRTUAL_BUS			0x3
1244394b6171SWen Xiong #define IPR_MAX_SIS64_BUSES			0x4
12453e7ebdfaSWayne Boyer 
12463e7ebdfaSWayne Boyer #define IPR_GET_RES_PHYS_LOC(res) \
12473e7ebdfaSWayne Boyer 	(((res)->bus << 24) | ((res)->target << 8) | (res)->lun)
12483e7ebdfaSWayne Boyer 
12493e7ebdfaSWayne Boyer 	u8 ata_class;
12507be96900SWayne Boyer 	u8 type;
12513e7ebdfaSWayne Boyer 
1252359d96e7SBrian King 	u16 flags;
1253359d96e7SBrian King 	u16 res_flags;
1254359d96e7SBrian King 
12553e7ebdfaSWayne Boyer 	u8 qmodel;
12563e7ebdfaSWayne Boyer 	struct ipr_std_inq_data std_inq_data;
12573e7ebdfaSWayne Boyer 
12583e7ebdfaSWayne Boyer 	__be32 res_handle;
12593e7ebdfaSWayne Boyer 	__be64 dev_id;
1260359d96e7SBrian King 	u64 lun_wwn;
12613e7ebdfaSWayne Boyer 	struct scsi_lun dev_lun;
12623e7ebdfaSWayne Boyer 	u8 res_path[8];
12633e7ebdfaSWayne Boyer 
12643e7ebdfaSWayne Boyer 	struct ipr_ioa_cfg *ioa_cfg;
12651da177e4SLinus Torvalds 	struct scsi_device *sdev;
12661da177e4SLinus Torvalds 	struct list_head queue;
12673e7ebdfaSWayne Boyer }; /* struct ipr_resource_entry */
12681da177e4SLinus Torvalds 
12691da177e4SLinus Torvalds struct ipr_resource_hdr {
12701da177e4SLinus Torvalds 	u16 num_entries;
12711da177e4SLinus Torvalds 	u16 reserved;
12721da177e4SLinus Torvalds };
12731da177e4SLinus Torvalds 
12741da177e4SLinus Torvalds struct ipr_misc_cbs {
12751da177e4SLinus Torvalds 	struct ipr_ioa_vpd ioa_vpd;
127662275040Sbrking@us.ibm.com 	struct ipr_inquiry_page0 page0_data;
12771da177e4SLinus Torvalds 	struct ipr_inquiry_page3 page3_data;
1278ac09c349SBrian King 	struct ipr_inquiry_cap cap;
12791021b3ffSGabriel Krisman Bertazi 	struct ipr_inquiry_pageC4 pageC4_data;
12801da177e4SLinus Torvalds 	struct ipr_mode_pages mode_pages;
12811da177e4SLinus Torvalds 	struct ipr_supported_device supp_dev;
12821da177e4SLinus Torvalds };
12831da177e4SLinus Torvalds 
12841da177e4SLinus Torvalds struct ipr_interrupt_offsets {
12851da177e4SLinus Torvalds 	unsigned long set_interrupt_mask_reg;
12861da177e4SLinus Torvalds 	unsigned long clr_interrupt_mask_reg;
1287214777baSWayne Boyer 	unsigned long clr_interrupt_mask_reg32;
12881da177e4SLinus Torvalds 	unsigned long sense_interrupt_mask_reg;
1289214777baSWayne Boyer 	unsigned long sense_interrupt_mask_reg32;
12901da177e4SLinus Torvalds 	unsigned long clr_interrupt_reg;
1291214777baSWayne Boyer 	unsigned long clr_interrupt_reg32;
12921da177e4SLinus Torvalds 
12931da177e4SLinus Torvalds 	unsigned long sense_interrupt_reg;
1294214777baSWayne Boyer 	unsigned long sense_interrupt_reg32;
12951da177e4SLinus Torvalds 	unsigned long ioarrin_reg;
12961da177e4SLinus Torvalds 	unsigned long sense_uproc_interrupt_reg;
1297214777baSWayne Boyer 	unsigned long sense_uproc_interrupt_reg32;
12981da177e4SLinus Torvalds 	unsigned long set_uproc_interrupt_reg;
1299214777baSWayne Boyer 	unsigned long set_uproc_interrupt_reg32;
13001da177e4SLinus Torvalds 	unsigned long clr_uproc_interrupt_reg;
1301214777baSWayne Boyer 	unsigned long clr_uproc_interrupt_reg32;
1302214777baSWayne Boyer 
1303214777baSWayne Boyer 	unsigned long init_feedback_reg;
1304dcbad00eSWayne Boyer 
1305dcbad00eSWayne Boyer 	unsigned long dump_addr_reg;
1306dcbad00eSWayne Boyer 	unsigned long dump_data_reg;
13078701f185SWayne Boyer 
13084289a086SWayne Boyer #define IPR_ENDIAN_SWAP_KEY		0x00080800
13098701f185SWayne Boyer 	unsigned long endian_swap_reg;
13101da177e4SLinus Torvalds };
13111da177e4SLinus Torvalds 
13121da177e4SLinus Torvalds struct ipr_interrupts {
13131da177e4SLinus Torvalds 	void __iomem *set_interrupt_mask_reg;
13141da177e4SLinus Torvalds 	void __iomem *clr_interrupt_mask_reg;
1315214777baSWayne Boyer 	void __iomem *clr_interrupt_mask_reg32;
13161da177e4SLinus Torvalds 	void __iomem *sense_interrupt_mask_reg;
1317214777baSWayne Boyer 	void __iomem *sense_interrupt_mask_reg32;
13181da177e4SLinus Torvalds 	void __iomem *clr_interrupt_reg;
1319214777baSWayne Boyer 	void __iomem *clr_interrupt_reg32;
13201da177e4SLinus Torvalds 
13211da177e4SLinus Torvalds 	void __iomem *sense_interrupt_reg;
1322214777baSWayne Boyer 	void __iomem *sense_interrupt_reg32;
13231da177e4SLinus Torvalds 	void __iomem *ioarrin_reg;
13241da177e4SLinus Torvalds 	void __iomem *sense_uproc_interrupt_reg;
1325214777baSWayne Boyer 	void __iomem *sense_uproc_interrupt_reg32;
13261da177e4SLinus Torvalds 	void __iomem *set_uproc_interrupt_reg;
1327214777baSWayne Boyer 	void __iomem *set_uproc_interrupt_reg32;
13281da177e4SLinus Torvalds 	void __iomem *clr_uproc_interrupt_reg;
1329214777baSWayne Boyer 	void __iomem *clr_uproc_interrupt_reg32;
1330214777baSWayne Boyer 
1331214777baSWayne Boyer 	void __iomem *init_feedback_reg;
1332dcbad00eSWayne Boyer 
1333dcbad00eSWayne Boyer 	void __iomem *dump_addr_reg;
1334dcbad00eSWayne Boyer 	void __iomem *dump_data_reg;
13358701f185SWayne Boyer 
13368701f185SWayne Boyer 	void __iomem *endian_swap_reg;
13371da177e4SLinus Torvalds };
13381da177e4SLinus Torvalds 
13391da177e4SLinus Torvalds struct ipr_chip_cfg_t {
13401da177e4SLinus Torvalds 	u32 mailbox;
134189aad428SBrian King 	u16 max_cmds;
13421da177e4SLinus Torvalds 	u8 cache_line_size;
13437dd21308SBrian King 	u8 clear_isr;
1344b53d124aSwenxiong@linux.vnet.ibm.com 	u32 iopoll_weight;
13451da177e4SLinus Torvalds 	struct ipr_interrupt_offsets regs;
13461da177e4SLinus Torvalds };
13471da177e4SLinus Torvalds 
13481da177e4SLinus Torvalds struct ipr_chip_t {
13491da177e4SLinus Torvalds 	u16 vendor;
13501da177e4SLinus Torvalds 	u16 device;
1351a299ee62SChristoph Hellwig 	bool has_msi;
1352a32c055fSWayne Boyer 	u16 sis_type;
1353a32c055fSWayne Boyer #define IPR_SIS32			0x00
1354a32c055fSWayne Boyer #define IPR_SIS64			0x01
1355cb237ef7SWayne Boyer 	u16 bist_method;
1356cb237ef7SWayne Boyer #define IPR_PCI_CFG			0x00
1357cb237ef7SWayne Boyer #define IPR_MMIO			0x01
13581da177e4SLinus Torvalds 	const struct ipr_chip_cfg_t *cfg;
13591da177e4SLinus Torvalds };
13601da177e4SLinus Torvalds 
13611da177e4SLinus Torvalds enum ipr_shutdown_type {
13621da177e4SLinus Torvalds 	IPR_SHUTDOWN_NORMAL = 0x00,
13631da177e4SLinus Torvalds 	IPR_SHUTDOWN_PREPARE_FOR_NORMAL = 0x40,
13641da177e4SLinus Torvalds 	IPR_SHUTDOWN_ABBREV = 0x80,
13654fdd7c7aSBrian King 	IPR_SHUTDOWN_NONE = 0x100,
13664fdd7c7aSBrian King 	IPR_SHUTDOWN_QUIESCE = 0x101,
13671da177e4SLinus Torvalds };
13681da177e4SLinus Torvalds 
13691da177e4SLinus Torvalds struct ipr_trace_entry {
13701da177e4SLinus Torvalds 	u32 time;
13711da177e4SLinus Torvalds 
13721da177e4SLinus Torvalds 	u8 op_code;
137335a39691SBrian King 	u8 ata_op_code;
13741da177e4SLinus Torvalds 	u8 type;
13751da177e4SLinus Torvalds #define IPR_TRACE_START			0x00
13761da177e4SLinus Torvalds #define IPR_TRACE_FINISH		0xff
137735a39691SBrian King 	u8 cmd_index;
13781da177e4SLinus Torvalds 
13791da177e4SLinus Torvalds 	__be32 res_handle;
13801da177e4SLinus Torvalds 	union {
13811da177e4SLinus Torvalds 		u32 ioasc;
13821da177e4SLinus Torvalds 		u32 add_data;
13831da177e4SLinus Torvalds 		u32 res_addr;
13841da177e4SLinus Torvalds 	} u;
13851da177e4SLinus Torvalds };
13861da177e4SLinus Torvalds 
13871da177e4SLinus Torvalds struct ipr_sglist {
13881da177e4SLinus Torvalds 	u32 order;
13891da177e4SLinus Torvalds 	u32 num_sg;
139012baa420Sbrking@us.ibm.com 	u32 num_dma_sg;
13911da177e4SLinus Torvalds 	u32 buffer_len;
1392f95dc1bbSBart Van Assche 	struct scatterlist *scatterlist;
13931da177e4SLinus Torvalds };
13941da177e4SLinus Torvalds 
13951da177e4SLinus Torvalds enum ipr_sdt_state {
13961da177e4SLinus Torvalds 	INACTIVE,
13971da177e4SLinus Torvalds 	WAIT_FOR_DUMP,
13981da177e4SLinus Torvalds 	GET_DUMP,
139941e9a696SBrian King 	READ_DUMP,
14001da177e4SLinus Torvalds 	ABORT_DUMP,
14011da177e4SLinus Torvalds 	DUMP_OBTAINED
14021da177e4SLinus Torvalds };
14031da177e4SLinus Torvalds 
14041da177e4SLinus Torvalds /* Per-controller data */
14051da177e4SLinus Torvalds struct ipr_ioa_cfg {
14061da177e4SLinus Torvalds 	char eye_catcher[8];
14071da177e4SLinus Torvalds #define IPR_EYECATCHER			"iprcfg"
14081da177e4SLinus Torvalds 
14091da177e4SLinus Torvalds 	struct list_head queue;
14101da177e4SLinus Torvalds 
14111da177e4SLinus Torvalds 	u8 in_reset_reload:1;
14121da177e4SLinus Torvalds 	u8 in_ioa_bringdown:1;
14131da177e4SLinus Torvalds 	u8 ioa_unit_checked:1;
14141da177e4SLinus Torvalds 	u8 dump_taken:1;
1415b195d5e2SBrian King 	u8 scan_enabled:1;
1416f688f96dSBrian King 	u8 scan_done:1;
1417ce155cceSbrking@us.ibm.com 	u8 needs_hard_reset:1;
1418ac09c349SBrian King 	u8 dual_raid:1;
1419463fc696SBrian King 	u8 needs_warm_reset:1;
142095fecd90SWayne Boyer 	u8 msi_received:1;
1421a32c055fSWayne Boyer 	u8 sis64:1;
14224c647e90SBrian King 	u8 dump_timeout:1;
1423fb51ccbfSJan Kiszka 	u8 cfg_locked:1;
14247dd21308SBrian King 	u8 clear_isr:1;
14256270e593SBrian King 	u8 probe_done:1;
1426b0e17a9bSBrian King 	u8 scsi_unblock:1;
1427b0e17a9bSBrian King 	u8 scsi_blocked:1;
1428463fc696SBrian King 
1429463fc696SBrian King 	u8 revid;
14301da177e4SLinus Torvalds 
14313e7ebdfaSWayne Boyer 	/*
14323e7ebdfaSWayne Boyer 	 * Bitmaps for SIS64 generated target values
14333e7ebdfaSWayne Boyer 	 */
1434222ab594Swenxiong@linux.vnet.ibm.com 	unsigned long target_ids[BITS_TO_LONGS(IPR_MAX_SIS64_DEVS)];
1435222ab594Swenxiong@linux.vnet.ibm.com 	unsigned long array_ids[BITS_TO_LONGS(IPR_MAX_SIS64_DEVS)];
1436222ab594Swenxiong@linux.vnet.ibm.com 	unsigned long vset_ids[BITS_TO_LONGS(IPR_MAX_SIS64_DEVS)];
14373e7ebdfaSWayne Boyer 
14381da177e4SLinus Torvalds 	u16 type; /* CCIN of the card */
14391da177e4SLinus Torvalds 
14401da177e4SLinus Torvalds 	u8 log_level;
14411da177e4SLinus Torvalds #define IPR_MAX_LOG_LEVEL			4
14421da177e4SLinus Torvalds #define IPR_DEFAULT_LOG_LEVEL		2
14437b3871fdSBrian King #define IPR_DEBUG_LOG_LEVEL		3
14441da177e4SLinus Torvalds 
14451da177e4SLinus Torvalds #define IPR_NUM_TRACE_INDEX_BITS	8
14461da177e4SLinus Torvalds #define IPR_NUM_TRACE_ENTRIES		(1 << IPR_NUM_TRACE_INDEX_BITS)
1447bb7c5433SBrian King #define IPR_TRACE_INDEX_MASK		(IPR_NUM_TRACE_ENTRIES - 1)
14481da177e4SLinus Torvalds #define IPR_TRACE_SIZE	(sizeof(struct ipr_trace_entry) * IPR_NUM_TRACE_ENTRIES)
14491da177e4SLinus Torvalds 	char trace_start[8];
14501da177e4SLinus Torvalds #define IPR_TRACE_START_LABEL			"trace"
14511da177e4SLinus Torvalds 	struct ipr_trace_entry *trace;
145256d6aa33Swenxiong@linux.vnet.ibm.com 	atomic_t trace_index;
14531da177e4SLinus Torvalds 
14541da177e4SLinus Torvalds 	char cfg_table_start[8];
14551da177e4SLinus Torvalds #define IPR_CFG_TBL_START		"cfg"
14563e7ebdfaSWayne Boyer 	union {
14571da177e4SLinus Torvalds 		struct ipr_config_table *cfg_table;
14583e7ebdfaSWayne Boyer 		struct ipr_config_table64 *cfg_table64;
14593e7ebdfaSWayne Boyer 	} u;
14601da177e4SLinus Torvalds 	dma_addr_t cfg_table_dma;
14613e7ebdfaSWayne Boyer 	u32 cfg_table_size;
14623e7ebdfaSWayne Boyer 	u32 max_devs_supported;
14631da177e4SLinus Torvalds 
14641da177e4SLinus Torvalds 	char resource_table_label[8];
14651da177e4SLinus Torvalds #define IPR_RES_TABLE_LABEL		"res_tbl"
14661da177e4SLinus Torvalds 	struct ipr_resource_entry *res_entries;
14671da177e4SLinus Torvalds 	struct list_head free_res_q;
14681da177e4SLinus Torvalds 	struct list_head used_res_q;
14691da177e4SLinus Torvalds 
14701da177e4SLinus Torvalds 	char ipr_hcam_label[8];
14711da177e4SLinus Torvalds #define IPR_HCAM_LABEL			"hcams"
1472afc3f83cSBrian King 	struct ipr_hostrcb *hostrcb[IPR_MAX_HCAMS];
1473afc3f83cSBrian King 	dma_addr_t hostrcb_dma[IPR_MAX_HCAMS];
14741da177e4SLinus Torvalds 	struct list_head hostrcb_free_q;
14751da177e4SLinus Torvalds 	struct list_head hostrcb_pending_q;
1476afc3f83cSBrian King 	struct list_head hostrcb_report_q;
14771da177e4SLinus Torvalds 
147805a6538aSwenxiong@linux.vnet.ibm.com 	struct ipr_hrr_queue hrrq[IPR_MAX_HRRQ_NUM];
147905a6538aSwenxiong@linux.vnet.ibm.com 	u32 hrrq_num;
148056d6aa33Swenxiong@linux.vnet.ibm.com 	atomic_t  hrrq_index;
148156d6aa33Swenxiong@linux.vnet.ibm.com 	u16 identify_hrrq_index;
14821da177e4SLinus Torvalds 
14831da177e4SLinus Torvalds 	struct ipr_bus_attributes bus_attr[IPR_MAX_NUM_BUSES];
14841da177e4SLinus Torvalds 
14855469cb5bSBrian King 	unsigned int transop_timeout;
14861da177e4SLinus Torvalds 	const struct ipr_chip_cfg_t *chip_cfg;
14871be7bd82SWayne Boyer 	const struct ipr_chip_t *ipr_chip;
14881da177e4SLinus Torvalds 
14891da177e4SLinus Torvalds 	void __iomem *hdw_dma_regs;	/* iomapped PCI memory space */
14901da177e4SLinus Torvalds 	unsigned long hdw_dma_regs_pci;	/* raw PCI memory space */
14911da177e4SLinus Torvalds 	void __iomem *ioa_mailbox;
14921da177e4SLinus Torvalds 	struct ipr_interrupts regs;
14931da177e4SLinus Torvalds 
14941da177e4SLinus Torvalds 	u16 saved_pcix_cmd_reg;
14951da177e4SLinus Torvalds 	u16 reset_retries;
14961da177e4SLinus Torvalds 
14971da177e4SLinus Torvalds 	u32 errors_logged;
14983d1d0da6Sbrking@us.ibm.com 	u32 doorbell;
14991da177e4SLinus Torvalds 
15001da177e4SLinus Torvalds 	struct Scsi_Host *host;
15011da177e4SLinus Torvalds 	struct pci_dev *pdev;
15021da177e4SLinus Torvalds 	struct ipr_sglist *ucode_sglist;
15031da177e4SLinus Torvalds 	u8 saved_mode_page_len;
15041da177e4SLinus Torvalds 
15051da177e4SLinus Torvalds 	struct work_struct work_q;
1506318ddb34SWen Xiong 	struct work_struct scsi_add_work_q;
15072796ca5eSBrian King 	struct workqueue_struct *reset_work_q;
15081da177e4SLinus Torvalds 
15091da177e4SLinus Torvalds 	wait_queue_head_t reset_wait_q;
151095fecd90SWayne Boyer 	wait_queue_head_t msi_wait_q;
15116270e593SBrian King 	wait_queue_head_t eeh_wait_q;
15121da177e4SLinus Torvalds 
15131da177e4SLinus Torvalds 	struct ipr_dump *dump;
15141da177e4SLinus Torvalds 	enum ipr_sdt_state sdt_state;
15151da177e4SLinus Torvalds 
15161da177e4SLinus Torvalds 	struct ipr_misc_cbs *vpd_cbs;
15171da177e4SLinus Torvalds 	dma_addr_t vpd_cbs_dma;
15181da177e4SLinus Torvalds 
1519d73341bfSAnton Blanchard 	struct dma_pool *ipr_cmd_pool;
15201da177e4SLinus Torvalds 
15211da177e4SLinus Torvalds 	struct ipr_cmnd *reset_cmd;
1522463fc696SBrian King 	int (*reset) (struct ipr_cmnd *);
15231da177e4SLinus Torvalds 
15241da177e4SLinus Torvalds 	char ipr_cmd_label[8];
15250124ca9dSBrian King #define IPR_CMD_LABEL		"ipr_cmd"
152689aad428SBrian King 	u32 max_cmds;
152789aad428SBrian King 	struct ipr_cmnd **ipr_cmnd_list;
152889aad428SBrian King 	dma_addr_t *ipr_cmnd_list_dma;
152905a6538aSwenxiong@linux.vnet.ibm.com 
153005a6538aSwenxiong@linux.vnet.ibm.com 	unsigned int nvectors;
153105a6538aSwenxiong@linux.vnet.ibm.com 
153205a6538aSwenxiong@linux.vnet.ibm.com 	struct {
153305a6538aSwenxiong@linux.vnet.ibm.com 		char desc[22];
153405a6538aSwenxiong@linux.vnet.ibm.com 	} vectors_info[IPR_MAX_MSIX_VECTORS];
153505a6538aSwenxiong@linux.vnet.ibm.com 
1536b53d124aSwenxiong@linux.vnet.ibm.com 	u32 iopoll_weight;
1537b53d124aSwenxiong@linux.vnet.ibm.com 
15383e7ebdfaSWayne Boyer }; /* struct ipr_ioa_cfg */
15391da177e4SLinus Torvalds 
15401da177e4SLinus Torvalds struct ipr_cmnd {
15411da177e4SLinus Torvalds 	struct ipr_ioarcb ioarcb;
1542a32c055fSWayne Boyer 	union {
15431da177e4SLinus Torvalds 		struct ipr_ioadl_desc ioadl[IPR_NUM_IOADL_ENTRIES];
1544a32c055fSWayne Boyer 		struct ipr_ioadl64_desc ioadl64[IPR_NUM_IOADL_ENTRIES];
1545a32c055fSWayne Boyer 	} i;
154696d21f00SWayne Boyer 	union {
1547a32c055fSWayne Boyer 		struct ipr_ioasa ioasa;
154896d21f00SWayne Boyer 		struct ipr_ioasa64 ioasa64;
154996d21f00SWayne Boyer 	} s;
15501da177e4SLinus Torvalds 	struct list_head queue;
15511da177e4SLinus Torvalds 	struct scsi_cmnd *scsi_cmd;
15521da177e4SLinus Torvalds 	struct completion completion;
15531da177e4SLinus Torvalds 	struct timer_list timer;
15542796ca5eSBrian King 	struct work_struct work;
1555172cd6e1SBrian King 	void (*fast_done) (struct ipr_cmnd *);
15561da177e4SLinus Torvalds 	void (*done) (struct ipr_cmnd *);
15571da177e4SLinus Torvalds 	int (*job_step) (struct ipr_cmnd *);
1558dfed823eSbrking@us.ibm.com 	int (*job_step_failed) (struct ipr_cmnd *);
15591da177e4SLinus Torvalds 	u16 cmd_index;
15601da177e4SLinus Torvalds 	u8 sense_buffer[SCSI_SENSE_BUFFERSIZE];
15611da177e4SLinus Torvalds 	dma_addr_t sense_buffer_dma;
15621da177e4SLinus Torvalds 	unsigned short dma_use_sg;
1563a32c055fSWayne Boyer 	dma_addr_t dma_addr;
15641da177e4SLinus Torvalds 	struct ipr_cmnd *sibling;
15651da177e4SLinus Torvalds 	union {
15661da177e4SLinus Torvalds 		enum ipr_shutdown_type shutdown_type;
15671da177e4SLinus Torvalds 		struct ipr_hostrcb *hostrcb;
15681da177e4SLinus Torvalds 		unsigned long time_left;
15691da177e4SLinus Torvalds 		unsigned long scratch;
15701da177e4SLinus Torvalds 		struct ipr_resource_entry *res;
15711da177e4SLinus Torvalds 		struct scsi_device *sdev;
15721da177e4SLinus Torvalds 	} u;
15731da177e4SLinus Torvalds 
15746cdb0817SBrian King 	struct completion *eh_comp;
157505a6538aSwenxiong@linux.vnet.ibm.com 	struct ipr_hrr_queue *hrrq;
15761da177e4SLinus Torvalds 	struct ipr_ioa_cfg *ioa_cfg;
15771da177e4SLinus Torvalds };
15781da177e4SLinus Torvalds 
15791da177e4SLinus Torvalds struct ipr_ses_table_entry {
15801da177e4SLinus Torvalds 	char product_id[17];
15811da177e4SLinus Torvalds 	char compare_product_id_byte[17];
15821da177e4SLinus Torvalds 	u32 max_bus_speed_limit;	/* MB/sec limit for this backplane */
15831da177e4SLinus Torvalds };
15841da177e4SLinus Torvalds 
15851da177e4SLinus Torvalds struct ipr_dump_header {
15861da177e4SLinus Torvalds 	u32 eye_catcher;
15871da177e4SLinus Torvalds #define IPR_DUMP_EYE_CATCHER		0xC5D4E3F2
15881da177e4SLinus Torvalds 	u32 len;
15891da177e4SLinus Torvalds 	u32 num_entries;
15901da177e4SLinus Torvalds 	u32 first_entry_offset;
15911da177e4SLinus Torvalds 	u32 status;
15921da177e4SLinus Torvalds #define IPR_DUMP_STATUS_SUCCESS			0
15931da177e4SLinus Torvalds #define IPR_DUMP_STATUS_QUAL_SUCCESS		2
15941da177e4SLinus Torvalds #define IPR_DUMP_STATUS_FAILED			0xffffffff
15951da177e4SLinus Torvalds 	u32 os;
15961da177e4SLinus Torvalds #define IPR_DUMP_OS_LINUX	0x4C4E5558
15971da177e4SLinus Torvalds 	u32 driver_name;
15981da177e4SLinus Torvalds #define IPR_DUMP_DRIVER_NAME	0x49505232
15991da177e4SLinus Torvalds }__attribute__((packed, aligned (4)));
16001da177e4SLinus Torvalds 
16011da177e4SLinus Torvalds struct ipr_dump_entry_header {
16021da177e4SLinus Torvalds 	u32 eye_catcher;
16031da177e4SLinus Torvalds #define IPR_DUMP_EYE_CATCHER		0xC5D4E3F2
16041da177e4SLinus Torvalds 	u32 len;
16051da177e4SLinus Torvalds 	u32 num_elems;
16061da177e4SLinus Torvalds 	u32 offset;
16071da177e4SLinus Torvalds 	u32 data_type;
16081da177e4SLinus Torvalds #define IPR_DUMP_DATA_TYPE_ASCII	0x41534349
16091da177e4SLinus Torvalds #define IPR_DUMP_DATA_TYPE_BINARY	0x42494E41
16101da177e4SLinus Torvalds 	u32 id;
16111da177e4SLinus Torvalds #define IPR_DUMP_IOA_DUMP_ID		0x494F4131
16121da177e4SLinus Torvalds #define IPR_DUMP_LOCATION_ID		0x4C4F4341
16131da177e4SLinus Torvalds #define IPR_DUMP_TRACE_ID		0x54524143
16141da177e4SLinus Torvalds #define IPR_DUMP_DRIVER_VERSION_ID	0x44525652
16151da177e4SLinus Torvalds #define IPR_DUMP_DRIVER_TYPE_ID	0x54595045
16161da177e4SLinus Torvalds #define IPR_DUMP_IOA_CTRL_BLK		0x494F4342
16171da177e4SLinus Torvalds #define IPR_DUMP_PEND_OPS		0x414F5053
16181da177e4SLinus Torvalds 	u32 status;
16191da177e4SLinus Torvalds }__attribute__((packed, aligned (4)));
16201da177e4SLinus Torvalds 
16211da177e4SLinus Torvalds struct ipr_dump_location_entry {
16221da177e4SLinus Torvalds 	struct ipr_dump_entry_header hdr;
162371610f55SKay Sievers 	u8 location[20];
1624f3bdc59fSLee Jones }__attribute__((packed, aligned (4)));
16251da177e4SLinus Torvalds 
16261da177e4SLinus Torvalds struct ipr_dump_trace_entry {
16271da177e4SLinus Torvalds 	struct ipr_dump_entry_header hdr;
16281da177e4SLinus Torvalds 	u32 trace[IPR_TRACE_SIZE / sizeof(u32)];
16291da177e4SLinus Torvalds }__attribute__((packed, aligned (4)));
16301da177e4SLinus Torvalds 
16311da177e4SLinus Torvalds struct ipr_dump_version_entry {
16321da177e4SLinus Torvalds 	struct ipr_dump_entry_header hdr;
16331da177e4SLinus Torvalds 	u8 version[sizeof(IPR_DRIVER_VERSION)];
16341da177e4SLinus Torvalds };
16351da177e4SLinus Torvalds 
16361da177e4SLinus Torvalds struct ipr_dump_ioa_type_entry {
16371da177e4SLinus Torvalds 	struct ipr_dump_entry_header hdr;
16381da177e4SLinus Torvalds 	u32 type;
16391da177e4SLinus Torvalds 	u32 fw_version;
16401da177e4SLinus Torvalds };
16411da177e4SLinus Torvalds 
16421da177e4SLinus Torvalds struct ipr_driver_dump {
16431da177e4SLinus Torvalds 	struct ipr_dump_header hdr;
16441da177e4SLinus Torvalds 	struct ipr_dump_version_entry version_entry;
16451da177e4SLinus Torvalds 	struct ipr_dump_location_entry location_entry;
16461da177e4SLinus Torvalds 	struct ipr_dump_ioa_type_entry ioa_type_entry;
16471da177e4SLinus Torvalds 	struct ipr_dump_trace_entry trace_entry;
1648f3bdc59fSLee Jones }__attribute__((packed, aligned (4)));
16491da177e4SLinus Torvalds 
16501da177e4SLinus Torvalds struct ipr_ioa_dump {
16511da177e4SLinus Torvalds 	struct ipr_dump_entry_header hdr;
16521da177e4SLinus Torvalds 	struct ipr_sdt sdt;
16534d4dd706SKleber Sacilotto de Souza 	__be32 **ioa_data;
16541da177e4SLinus Torvalds 	u32 reserved;
16551da177e4SLinus Torvalds 	u32 next_page_index;
16561da177e4SLinus Torvalds 	u32 page_offset;
16571da177e4SLinus Torvalds 	u32 format;
16581da177e4SLinus Torvalds }__attribute__((packed, aligned (4)));
16591da177e4SLinus Torvalds 
16601da177e4SLinus Torvalds struct ipr_dump {
16611da177e4SLinus Torvalds 	struct kref kref;
16621da177e4SLinus Torvalds 	struct ipr_ioa_cfg *ioa_cfg;
16631da177e4SLinus Torvalds 	struct ipr_driver_dump driver_dump;
16641da177e4SLinus Torvalds 	struct ipr_ioa_dump ioa_dump;
16651da177e4SLinus Torvalds };
16661da177e4SLinus Torvalds 
16671da177e4SLinus Torvalds struct ipr_error_table_t {
16681da177e4SLinus Torvalds 	u32 ioasc;
16691da177e4SLinus Torvalds 	int log_ioasa;
16701da177e4SLinus Torvalds 	int log_hcam;
16711da177e4SLinus Torvalds 	char *error;
16721da177e4SLinus Torvalds };
16731da177e4SLinus Torvalds 
16741da177e4SLinus Torvalds struct ipr_software_inq_lid_info {
16751da177e4SLinus Torvalds 	__be32 load_id;
16761da177e4SLinus Torvalds 	__be32 timestamp[3];
16771da177e4SLinus Torvalds }__attribute__((packed, aligned (4)));
16781da177e4SLinus Torvalds 
16791da177e4SLinus Torvalds struct ipr_ucode_image_header {
16801da177e4SLinus Torvalds 	__be32 header_length;
16811da177e4SLinus Torvalds 	__be32 lid_table_offset;
16821da177e4SLinus Torvalds 	u8 major_release;
16831da177e4SLinus Torvalds 	u8 card_type;
16841da177e4SLinus Torvalds 	u8 minor_release[2];
16851da177e4SLinus Torvalds 	u8 reserved[20];
16861da177e4SLinus Torvalds 	char eyecatcher[16];
16871da177e4SLinus Torvalds 	__be32 num_lids;
16881da177e4SLinus Torvalds 	struct ipr_software_inq_lid_info lid[1];
16891da177e4SLinus Torvalds }__attribute__((packed, aligned (4)));
16901da177e4SLinus Torvalds 
16911da177e4SLinus Torvalds /*
16921da177e4SLinus Torvalds  * Macros
16931da177e4SLinus Torvalds  */
1694d3c74871Sbrking@us.ibm.com #define IPR_DBG_CMD(CMD) if (ipr_debug) { CMD; }
16951da177e4SLinus Torvalds 
16961da177e4SLinus Torvalds #ifdef CONFIG_SCSI_IPR_TRACE
16971da177e4SLinus Torvalds #define ipr_create_trace_file(kobj, attr) sysfs_create_bin_file(kobj, attr)
16981da177e4SLinus Torvalds #define ipr_remove_trace_file(kobj, attr) sysfs_remove_bin_file(kobj, attr)
16991da177e4SLinus Torvalds #else
17001da177e4SLinus Torvalds #define ipr_create_trace_file(kobj, attr) 0
17011da177e4SLinus Torvalds #define ipr_remove_trace_file(kobj, attr) do { } while(0)
17021da177e4SLinus Torvalds #endif
17031da177e4SLinus Torvalds 
17041da177e4SLinus Torvalds #ifdef CONFIG_SCSI_IPR_DUMP
17051da177e4SLinus Torvalds #define ipr_create_dump_file(kobj, attr) sysfs_create_bin_file(kobj, attr)
17061da177e4SLinus Torvalds #define ipr_remove_dump_file(kobj, attr) sysfs_remove_bin_file(kobj, attr)
17071da177e4SLinus Torvalds #else
17081da177e4SLinus Torvalds #define ipr_create_dump_file(kobj, attr) 0
17091da177e4SLinus Torvalds #define ipr_remove_dump_file(kobj, attr) do { } while(0)
17101da177e4SLinus Torvalds #endif
17111da177e4SLinus Torvalds 
17121da177e4SLinus Torvalds /*
17131da177e4SLinus Torvalds  * Error logging macros
17141da177e4SLinus Torvalds  */
17151da177e4SLinus Torvalds #define ipr_err(...) printk(KERN_ERR IPR_NAME ": "__VA_ARGS__)
17161da177e4SLinus Torvalds #define ipr_info(...) printk(KERN_INFO IPR_NAME ": "__VA_ARGS__)
17171da177e4SLinus Torvalds #define ipr_dbg(...) IPR_DBG_CMD(printk(KERN_INFO IPR_NAME ": "__VA_ARGS__))
17181da177e4SLinus Torvalds 
17193e7ebdfaSWayne Boyer #define ipr_res_printk(level, ioa_cfg, bus, target, lun, fmt, ...) \
17203e7ebdfaSWayne Boyer 	printk(level IPR_NAME ": %d:%d:%d:%d: " fmt, (ioa_cfg)->host->host_no, \
17213e7ebdfaSWayne Boyer 		bus, target, lun, ##__VA_ARGS__)
17223e7ebdfaSWayne Boyer 
17233e7ebdfaSWayne Boyer #define ipr_res_err(ioa_cfg, res, fmt, ...) \
17243e7ebdfaSWayne Boyer 	ipr_res_printk(KERN_ERR, ioa_cfg, (res)->bus, (res)->target, (res)->lun, fmt, ##__VA_ARGS__)
17253e7ebdfaSWayne Boyer 
1726fb3ed3cbSBrian King #define ipr_ra_printk(level, ioa_cfg, ra, fmt, ...) \
1727fb3ed3cbSBrian King 	printk(level IPR_NAME ": %d:%d:%d:%d: " fmt, (ioa_cfg)->host->host_no, \
1728fb3ed3cbSBrian King 		(ra).bus, (ra).target, (ra).lun, ##__VA_ARGS__)
17291da177e4SLinus Torvalds 
1730fb3ed3cbSBrian King #define ipr_ra_err(ioa_cfg, ra, fmt, ...) \
1731fb3ed3cbSBrian King 	ipr_ra_printk(KERN_ERR, ioa_cfg, ra, fmt, ##__VA_ARGS__)
17321da177e4SLinus Torvalds 
1733fa15b1f6Sbrking@us.ibm.com #define ipr_phys_res_err(ioa_cfg, res, fmt, ...)			\
1734fa15b1f6Sbrking@us.ibm.com {									\
1735fa15b1f6Sbrking@us.ibm.com 	if ((res).bus >= IPR_MAX_NUM_BUSES) {				\
1736fa15b1f6Sbrking@us.ibm.com 		ipr_err(fmt": unknown\n", ##__VA_ARGS__);		\
1737fa15b1f6Sbrking@us.ibm.com 	} else {							\
1738fa15b1f6Sbrking@us.ibm.com 		ipr_err(fmt": %d:%d:%d:%d\n",				\
1739fa15b1f6Sbrking@us.ibm.com 			##__VA_ARGS__, (ioa_cfg)->host->host_no,	\
1740fa15b1f6Sbrking@us.ibm.com 			(res).bus, (res).target, (res).lun);		\
1741fa15b1f6Sbrking@us.ibm.com 	}								\
1742fa15b1f6Sbrking@us.ibm.com }
1743fa15b1f6Sbrking@us.ibm.com 
174449dc6a18SBrian King #define ipr_hcam_err(hostrcb, fmt, ...)					\
174549dc6a18SBrian King {									\
17464565e370SWayne Boyer 	if (ipr_is_device(hostrcb)) {					\
17474565e370SWayne Boyer 		if ((hostrcb)->ioa_cfg->sis64) {			\
17484565e370SWayne Boyer 			printk(KERN_ERR IPR_NAME ": %s: " fmt, 		\
1749b3b3b407SBrian King 				ipr_format_res_path(hostrcb->ioa_cfg,	\
1750b3b3b407SBrian King 					hostrcb->hcam.u.error64.fd_res_path, \
17515adcbeb3SWayne Boyer 					hostrcb->rp_buffer,		\
17525adcbeb3SWayne Boyer 					sizeof(hostrcb->rp_buffer)),	\
17534565e370SWayne Boyer 				__VA_ARGS__);				\
175449dc6a18SBrian King 		} else {						\
17554565e370SWayne Boyer 			ipr_ra_err((hostrcb)->ioa_cfg,			\
17564565e370SWayne Boyer 				(hostrcb)->hcam.u.error.fd_res_addr,	\
17574565e370SWayne Boyer 				fmt, __VA_ARGS__);			\
17584565e370SWayne Boyer 		}							\
17594565e370SWayne Boyer 	} else {							\
17604565e370SWayne Boyer 		dev_err(&(hostrcb)->ioa_cfg->pdev->dev, fmt, __VA_ARGS__); \
176149dc6a18SBrian King 	}								\
176249dc6a18SBrian King }
176349dc6a18SBrian King 
17641da177e4SLinus Torvalds #define ipr_trace ipr_dbg("%s: %s: Line: %d\n",\
1765cadbd4a5SHarvey Harrison 	__FILE__, __func__, __LINE__)
17661da177e4SLinus Torvalds 
1767cadbd4a5SHarvey Harrison #define ENTER IPR_DBG_CMD(printk(KERN_INFO IPR_NAME": Entering %s\n", __func__))
1768cadbd4a5SHarvey Harrison #define LEAVE IPR_DBG_CMD(printk(KERN_INFO IPR_NAME": Leaving %s\n", __func__))
17691da177e4SLinus Torvalds 
17701da177e4SLinus Torvalds #define ipr_err_separator \
17711da177e4SLinus Torvalds ipr_err("----------------------------------------------------------\n")
17721da177e4SLinus Torvalds 
17731da177e4SLinus Torvalds 
17741da177e4SLinus Torvalds /*
17751da177e4SLinus Torvalds  * Inlines
17761da177e4SLinus Torvalds  */
17771da177e4SLinus Torvalds 
17781da177e4SLinus Torvalds /**
17791da177e4SLinus Torvalds  * ipr_is_ioa_resource - Determine if a resource is the IOA
17801da177e4SLinus Torvalds  * @res:	resource entry struct
17811da177e4SLinus Torvalds  *
17821da177e4SLinus Torvalds  * Return value:
17831da177e4SLinus Torvalds  * 	1 if IOA / 0 if not IOA
17841da177e4SLinus Torvalds  **/
ipr_is_ioa_resource(struct ipr_resource_entry * res)17851da177e4SLinus Torvalds static inline int ipr_is_ioa_resource(struct ipr_resource_entry *res)
17861da177e4SLinus Torvalds {
17873e7ebdfaSWayne Boyer 	return res->type == IPR_RES_TYPE_IOAFP;
17881da177e4SLinus Torvalds }
17891da177e4SLinus Torvalds 
17901da177e4SLinus Torvalds /**
17911da177e4SLinus Torvalds  * ipr_is_af_dasd_device - Determine if a resource is an AF DASD
17921da177e4SLinus Torvalds  * @res:	resource entry struct
17931da177e4SLinus Torvalds  *
17941da177e4SLinus Torvalds  * Return value:
17951da177e4SLinus Torvalds  * 	1 if AF DASD / 0 if not AF DASD
17961da177e4SLinus Torvalds  **/
ipr_is_af_dasd_device(struct ipr_resource_entry * res)17971da177e4SLinus Torvalds static inline int ipr_is_af_dasd_device(struct ipr_resource_entry *res)
17981da177e4SLinus Torvalds {
17993e7ebdfaSWayne Boyer 	return res->type == IPR_RES_TYPE_AF_DASD ||
18003e7ebdfaSWayne Boyer 		res->type == IPR_RES_TYPE_REMOTE_AF_DASD;
18011da177e4SLinus Torvalds }
18021da177e4SLinus Torvalds 
18031da177e4SLinus Torvalds /**
18041da177e4SLinus Torvalds  * ipr_is_vset_device - Determine if a resource is a VSET
18051da177e4SLinus Torvalds  * @res:	resource entry struct
18061da177e4SLinus Torvalds  *
18071da177e4SLinus Torvalds  * Return value:
18081da177e4SLinus Torvalds  * 	1 if VSET / 0 if not VSET
18091da177e4SLinus Torvalds  **/
ipr_is_vset_device(struct ipr_resource_entry * res)18101da177e4SLinus Torvalds static inline int ipr_is_vset_device(struct ipr_resource_entry *res)
18111da177e4SLinus Torvalds {
18123e7ebdfaSWayne Boyer 	return res->type == IPR_RES_TYPE_VOLUME_SET;
18131da177e4SLinus Torvalds }
18141da177e4SLinus Torvalds 
18151da177e4SLinus Torvalds /**
18161da177e4SLinus Torvalds  * ipr_is_gscsi - Determine if a resource is a generic scsi resource
18171da177e4SLinus Torvalds  * @res:	resource entry struct
18181da177e4SLinus Torvalds  *
18191da177e4SLinus Torvalds  * Return value:
18201da177e4SLinus Torvalds  * 	1 if GSCSI / 0 if not GSCSI
18211da177e4SLinus Torvalds  **/
ipr_is_gscsi(struct ipr_resource_entry * res)18221da177e4SLinus Torvalds static inline int ipr_is_gscsi(struct ipr_resource_entry *res)
18231da177e4SLinus Torvalds {
18243e7ebdfaSWayne Boyer 	return res->type == IPR_RES_TYPE_GENERIC_SCSI;
18251da177e4SLinus Torvalds }
18261da177e4SLinus Torvalds 
18271da177e4SLinus Torvalds /**
1828e4fbf44eSBrian King  * ipr_is_scsi_disk - Determine if a resource is a SCSI disk
1829e4fbf44eSBrian King  * @res:	resource entry struct
1830e4fbf44eSBrian King  *
1831e4fbf44eSBrian King  * Return value:
1832e4fbf44eSBrian King  * 	1 if SCSI disk / 0 if not SCSI disk
1833e4fbf44eSBrian King  **/
ipr_is_scsi_disk(struct ipr_resource_entry * res)1834e4fbf44eSBrian King static inline int ipr_is_scsi_disk(struct ipr_resource_entry *res)
1835e4fbf44eSBrian King {
1836e4fbf44eSBrian King 	if (ipr_is_af_dasd_device(res) ||
18373e7ebdfaSWayne Boyer 	    (ipr_is_gscsi(res) && IPR_IS_DASD_DEVICE(res->std_inq_data)))
1838e4fbf44eSBrian King 		return 1;
1839e4fbf44eSBrian King 	else
1840e4fbf44eSBrian King 		return 0;
1841e4fbf44eSBrian King }
1842e4fbf44eSBrian King 
1843e4fbf44eSBrian King /**
1844b5145d25SBrian King  * ipr_is_gata - Determine if a resource is a generic ATA resource
1845b5145d25SBrian King  * @res:	resource entry struct
1846b5145d25SBrian King  *
1847b5145d25SBrian King  * Return value:
1848b5145d25SBrian King  * 	1 if GATA / 0 if not GATA
1849b5145d25SBrian King  **/
ipr_is_gata(struct ipr_resource_entry * res)1850b5145d25SBrian King static inline int ipr_is_gata(struct ipr_resource_entry *res)
1851b5145d25SBrian King {
18523e7ebdfaSWayne Boyer 	return res->type == IPR_RES_TYPE_GENERIC_ATA;
1853b5145d25SBrian King }
1854b5145d25SBrian King 
1855b5145d25SBrian King /**
1856ee0a90faSbrking@us.ibm.com  * ipr_is_naca_model - Determine if a resource is using NACA queueing model
1857ee0a90faSbrking@us.ibm.com  * @res:	resource entry struct
1858ee0a90faSbrking@us.ibm.com  *
1859ee0a90faSbrking@us.ibm.com  * Return value:
1860ee0a90faSbrking@us.ibm.com  * 	1 if NACA queueing model / 0 if not NACA queueing model
1861ee0a90faSbrking@us.ibm.com  **/
ipr_is_naca_model(struct ipr_resource_entry * res)1862ee0a90faSbrking@us.ibm.com static inline int ipr_is_naca_model(struct ipr_resource_entry *res)
1863ee0a90faSbrking@us.ibm.com {
18643e7ebdfaSWayne Boyer 	if (ipr_is_gscsi(res) && res->qmodel == IPR_QUEUE_NACA_MODEL)
1865ee0a90faSbrking@us.ibm.com 		return 1;
1866ee0a90faSbrking@us.ibm.com 	return 0;
1867ee0a90faSbrking@us.ibm.com }
1868ee0a90faSbrking@us.ibm.com 
1869ee0a90faSbrking@us.ibm.com /**
18704565e370SWayne Boyer  * ipr_is_device - Determine if the hostrcb structure is related to a device
18714565e370SWayne Boyer  * @hostrcb:	host resource control blocks struct
18721da177e4SLinus Torvalds  *
18731da177e4SLinus Torvalds  * Return value:
18741da177e4SLinus Torvalds  * 	1 if AF / 0 if not AF
18751da177e4SLinus Torvalds  **/
ipr_is_device(struct ipr_hostrcb * hostrcb)18764565e370SWayne Boyer static inline int ipr_is_device(struct ipr_hostrcb *hostrcb)
18771da177e4SLinus Torvalds {
18784565e370SWayne Boyer 	struct ipr_res_addr *res_addr;
18794565e370SWayne Boyer 	u8 *res_path;
18804565e370SWayne Boyer 
18814565e370SWayne Boyer 	if (hostrcb->ioa_cfg->sis64) {
18824565e370SWayne Boyer 		res_path = &hostrcb->hcam.u.error64.fd_res_path[0];
18834565e370SWayne Boyer 		if ((res_path[0] == 0x00 || res_path[0] == 0x80 ||
18844565e370SWayne Boyer 		    res_path[0] == 0x81) && res_path[2] != 0xFF)
18854565e370SWayne Boyer 			return 1;
18864565e370SWayne Boyer 	} else {
18874565e370SWayne Boyer 		res_addr = &hostrcb->hcam.u.error.fd_res_addr;
18884565e370SWayne Boyer 
18891da177e4SLinus Torvalds 		if ((res_addr->bus < IPR_MAX_NUM_BUSES) &&
1890d71a8b0cSbrking@us.ibm.com 		    (res_addr->target < (IPR_MAX_NUM_TARGETS_PER_BUS - 1)))
18911da177e4SLinus Torvalds 			return 1;
18924565e370SWayne Boyer 	}
18931da177e4SLinus Torvalds 	return 0;
18941da177e4SLinus Torvalds }
18951da177e4SLinus Torvalds 
18961da177e4SLinus Torvalds /**
18971da177e4SLinus Torvalds  * ipr_sdt_is_fmt2 - Determine if a SDT address is in format 2
18981da177e4SLinus Torvalds  * @sdt_word:	SDT address
18991da177e4SLinus Torvalds  *
19001da177e4SLinus Torvalds  * Return value:
19011da177e4SLinus Torvalds  * 	1 if format 2 / 0 if not
19021da177e4SLinus Torvalds  **/
ipr_sdt_is_fmt2(u32 sdt_word)19031da177e4SLinus Torvalds static inline int ipr_sdt_is_fmt2(u32 sdt_word)
19041da177e4SLinus Torvalds {
19051da177e4SLinus Torvalds 	u32 bar_sel = IPR_GET_FMT2_BAR_SEL(sdt_word);
19061da177e4SLinus Torvalds 
19071da177e4SLinus Torvalds 	switch (bar_sel) {
19081da177e4SLinus Torvalds 	case IPR_SDT_FMT2_BAR0_SEL:
19091da177e4SLinus Torvalds 	case IPR_SDT_FMT2_BAR1_SEL:
19101da177e4SLinus Torvalds 	case IPR_SDT_FMT2_BAR2_SEL:
19111da177e4SLinus Torvalds 	case IPR_SDT_FMT2_BAR3_SEL:
19121da177e4SLinus Torvalds 	case IPR_SDT_FMT2_BAR4_SEL:
19131da177e4SLinus Torvalds 	case IPR_SDT_FMT2_BAR5_SEL:
19141da177e4SLinus Torvalds 	case IPR_SDT_FMT2_EXP_ROM_SEL:
19151da177e4SLinus Torvalds 		return 1;
19161da177e4SLinus Torvalds 	};
19171da177e4SLinus Torvalds 
19181da177e4SLinus Torvalds 	return 0;
19191da177e4SLinus Torvalds }
19201da177e4SLinus Torvalds 
1921c5f10187SWayne Boyer #ifndef writeq
writeq(u64 val,void __iomem * addr)1922c5f10187SWayne Boyer static inline void writeq(u64 val, void __iomem *addr)
1923c5f10187SWayne Boyer {
1924c5f10187SWayne Boyer         writel(((u32) (val >> 32)), addr);
1925c5f10187SWayne Boyer         writel(((u32) (val)), (addr + 4));
1926c5f10187SWayne Boyer }
19271da177e4SLinus Torvalds #endif
1928c5f10187SWayne Boyer 
1929c5f10187SWayne Boyer #endif /* _IPR_H */
1930