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