162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci * Author(s)......: Holger Smolinski <Holger.Smolinski@de.ibm.com>
462306a36Sopenharmony_ci *		    Horst Hummel <Horst.Hummel@de.ibm.com>
562306a36Sopenharmony_ci * Bugreports.to..: <Linux390@de.ibm.com>
662306a36Sopenharmony_ci * Copyright IBM Corp. 1999, 2000
762306a36Sopenharmony_ci *
862306a36Sopenharmony_ci */
962306a36Sopenharmony_ci
1062306a36Sopenharmony_ci#ifndef DASD_ECKD_H
1162306a36Sopenharmony_ci#define DASD_ECKD_H
1262306a36Sopenharmony_ci
1362306a36Sopenharmony_ci/*****************************************************************************
1462306a36Sopenharmony_ci * SECTION: CCW Definitions
1562306a36Sopenharmony_ci ****************************************************************************/
1662306a36Sopenharmony_ci#define DASD_ECKD_CCW_NOP		 0x03
1762306a36Sopenharmony_ci#define DASD_ECKD_CCW_WRITE		 0x05
1862306a36Sopenharmony_ci#define DASD_ECKD_CCW_READ		 0x06
1962306a36Sopenharmony_ci#define DASD_ECKD_CCW_WRITE_HOME_ADDRESS 0x09
2062306a36Sopenharmony_ci#define DASD_ECKD_CCW_READ_HOME_ADDRESS	 0x0a
2162306a36Sopenharmony_ci#define DASD_ECKD_CCW_WRITE_KD		 0x0d
2262306a36Sopenharmony_ci#define DASD_ECKD_CCW_READ_KD		 0x0e
2362306a36Sopenharmony_ci#define DASD_ECKD_CCW_ERASE		 0x11
2462306a36Sopenharmony_ci#define DASD_ECKD_CCW_READ_COUNT	 0x12
2562306a36Sopenharmony_ci#define DASD_ECKD_CCW_SLCK		 0x14
2662306a36Sopenharmony_ci#define DASD_ECKD_CCW_WRITE_RECORD_ZERO	 0x15
2762306a36Sopenharmony_ci#define DASD_ECKD_CCW_READ_RECORD_ZERO	 0x16
2862306a36Sopenharmony_ci#define DASD_ECKD_CCW_WRITE_CKD		 0x1d
2962306a36Sopenharmony_ci#define DASD_ECKD_CCW_READ_CKD		 0x1e
3062306a36Sopenharmony_ci#define DASD_ECKD_CCW_PSF		 0x27
3162306a36Sopenharmony_ci#define DASD_ECKD_CCW_SNID		 0x34
3262306a36Sopenharmony_ci#define DASD_ECKD_CCW_RSSD		 0x3e
3362306a36Sopenharmony_ci#define DASD_ECKD_CCW_LOCATE_RECORD	 0x47
3462306a36Sopenharmony_ci#define DASD_ECKD_CCW_LOCATE_RECORD_EXT	 0x4b
3562306a36Sopenharmony_ci#define DASD_ECKD_CCW_SNSS		 0x54
3662306a36Sopenharmony_ci#define DASD_ECKD_CCW_DEFINE_EXTENT	 0x63
3762306a36Sopenharmony_ci#define DASD_ECKD_CCW_WRITE_MT		 0x85
3862306a36Sopenharmony_ci#define DASD_ECKD_CCW_READ_MT		 0x86
3962306a36Sopenharmony_ci#define DASD_ECKD_CCW_WRITE_KD_MT	 0x8d
4062306a36Sopenharmony_ci#define DASD_ECKD_CCW_READ_KD_MT	 0x8e
4162306a36Sopenharmony_ci#define DASD_ECKD_CCW_READ_COUNT_MT	 0x92
4262306a36Sopenharmony_ci#define DASD_ECKD_CCW_RELEASE		 0x94
4362306a36Sopenharmony_ci#define DASD_ECKD_CCW_WRITE_FULL_TRACK	 0x95
4462306a36Sopenharmony_ci#define DASD_ECKD_CCW_READ_CKD_MT	 0x9e
4562306a36Sopenharmony_ci#define DASD_ECKD_CCW_WRITE_CKD_MT	 0x9d
4662306a36Sopenharmony_ci#define DASD_ECKD_CCW_WRITE_TRACK_DATA	 0xA5
4762306a36Sopenharmony_ci#define DASD_ECKD_CCW_READ_TRACK_DATA	 0xA6
4862306a36Sopenharmony_ci#define DASD_ECKD_CCW_RESERVE		 0xB4
4962306a36Sopenharmony_ci#define DASD_ECKD_CCW_READ_TRACK	 0xDE
5062306a36Sopenharmony_ci#define DASD_ECKD_CCW_PFX		 0xE7
5162306a36Sopenharmony_ci#define DASD_ECKD_CCW_PFX_READ		 0xEA
5262306a36Sopenharmony_ci#define DASD_ECKD_CCW_RSCK		 0xF9
5362306a36Sopenharmony_ci#define DASD_ECKD_CCW_RCD		 0xFA
5462306a36Sopenharmony_ci#define DASD_ECKD_CCW_DSO		 0xF7
5562306a36Sopenharmony_ci
5662306a36Sopenharmony_ci/* Define Subsystem Function / Orders */
5762306a36Sopenharmony_ci#define DSO_ORDER_RAS			 0x81
5862306a36Sopenharmony_ci
5962306a36Sopenharmony_ci/*
6062306a36Sopenharmony_ci * Perform Subsystem Function / Orders
6162306a36Sopenharmony_ci */
6262306a36Sopenharmony_ci#define PSF_ORDER_PRSSD			 0x18
6362306a36Sopenharmony_ci#define PSF_ORDER_CUIR_RESPONSE		 0x1A
6462306a36Sopenharmony_ci#define PSF_ORDER_SSC			 0x1D
6562306a36Sopenharmony_ci
6662306a36Sopenharmony_ci/*
6762306a36Sopenharmony_ci * Perform Subsystem Function / Sub-Orders
6862306a36Sopenharmony_ci */
6962306a36Sopenharmony_ci#define PSF_SUBORDER_QHA		 0x1C /* Query Host Access */
7062306a36Sopenharmony_ci#define PSF_SUBORDER_PPRCEQ		 0x50 /* PPRC Extended Query */
7162306a36Sopenharmony_ci#define PSF_SUBORDER_VSQ		 0x52 /* Volume Storage Query */
7262306a36Sopenharmony_ci#define PSF_SUBORDER_LCQ		 0x53 /* Logical Configuration Query */
7362306a36Sopenharmony_ci
7462306a36Sopenharmony_ci/*
7562306a36Sopenharmony_ci * PPRC Extended Query Scopes
7662306a36Sopenharmony_ci */
7762306a36Sopenharmony_ci#define PPRCEQ_SCOPE_4			 0x04 /* Scope 4 for PPRC Extended Query */
7862306a36Sopenharmony_ci
7962306a36Sopenharmony_ci/*
8062306a36Sopenharmony_ci * CUIR response condition codes
8162306a36Sopenharmony_ci */
8262306a36Sopenharmony_ci#define PSF_CUIR_INVALID		 0x00
8362306a36Sopenharmony_ci#define PSF_CUIR_COMPLETED		 0x01
8462306a36Sopenharmony_ci#define PSF_CUIR_NOT_SUPPORTED		 0x02
8562306a36Sopenharmony_ci#define PSF_CUIR_ERROR_IN_REQ		 0x03
8662306a36Sopenharmony_ci#define PSF_CUIR_DENIED			 0x04
8762306a36Sopenharmony_ci#define PSF_CUIR_LAST_PATH		 0x05
8862306a36Sopenharmony_ci#define PSF_CUIR_DEVICE_ONLINE		 0x06
8962306a36Sopenharmony_ci#define PSF_CUIR_VARY_FAILURE		 0x07
9062306a36Sopenharmony_ci#define PSF_CUIR_SOFTWARE_FAILURE	 0x08
9162306a36Sopenharmony_ci#define PSF_CUIR_NOT_RECOGNIZED		 0x09
9262306a36Sopenharmony_ci
9362306a36Sopenharmony_ci/*
9462306a36Sopenharmony_ci * CUIR codes
9562306a36Sopenharmony_ci */
9662306a36Sopenharmony_ci#define CUIR_QUIESCE			 0x01
9762306a36Sopenharmony_ci#define CUIR_RESUME			 0x02
9862306a36Sopenharmony_ci
9962306a36Sopenharmony_ci/*
10062306a36Sopenharmony_ci * Out-of-space (OOS) Codes
10162306a36Sopenharmony_ci */
10262306a36Sopenharmony_ci#define REPO_WARN			 0x01
10362306a36Sopenharmony_ci#define REPO_EXHAUST			 0x02
10462306a36Sopenharmony_ci#define POOL_WARN			 0x03
10562306a36Sopenharmony_ci#define POOL_EXHAUST			 0x04
10662306a36Sopenharmony_ci#define REPO_RELIEVE			 0x05
10762306a36Sopenharmony_ci#define POOL_RELIEVE			 0x06
10862306a36Sopenharmony_ci
10962306a36Sopenharmony_ci/*
11062306a36Sopenharmony_ci * attention message definitions
11162306a36Sopenharmony_ci */
11262306a36Sopenharmony_ci#define ATTENTION_LENGTH_CUIR		 0x0e
11362306a36Sopenharmony_ci#define ATTENTION_FORMAT_CUIR		 0x01
11462306a36Sopenharmony_ci#define ATTENTION_LENGTH_OOS		 0x10
11562306a36Sopenharmony_ci#define ATTENTION_FORMAT_OOS		 0x06
11662306a36Sopenharmony_ci
11762306a36Sopenharmony_ci#define DASD_ECKD_PG_GROUPED		 0x10
11862306a36Sopenharmony_ci
11962306a36Sopenharmony_ci/*
12062306a36Sopenharmony_ci * Size that is reported for large volumes in the old 16-bit no_cyl field
12162306a36Sopenharmony_ci */
12262306a36Sopenharmony_ci#define LV_COMPAT_CYL 0xFFFE
12362306a36Sopenharmony_ci
12462306a36Sopenharmony_ci
12562306a36Sopenharmony_ci#define FCX_MAX_DATA_FACTOR 65536
12662306a36Sopenharmony_ci#define DASD_ECKD_RCD_DATA_SIZE 256
12762306a36Sopenharmony_ci
12862306a36Sopenharmony_ci#define DASD_ECKD_PATH_THRHLD		 256
12962306a36Sopenharmony_ci#define DASD_ECKD_PATH_INTERVAL		 300
13062306a36Sopenharmony_ci
13162306a36Sopenharmony_ci/*
13262306a36Sopenharmony_ci * Maximum number of blocks to be chained
13362306a36Sopenharmony_ci */
13462306a36Sopenharmony_ci#define DASD_ECKD_MAX_BLOCKS		 190
13562306a36Sopenharmony_ci#define DASD_ECKD_MAX_BLOCKS_RAW	 256
13662306a36Sopenharmony_ci
13762306a36Sopenharmony_ci/*****************************************************************************
13862306a36Sopenharmony_ci * SECTION: Type Definitions
13962306a36Sopenharmony_ci ****************************************************************************/
14062306a36Sopenharmony_ci
14162306a36Sopenharmony_cistruct eckd_count {
14262306a36Sopenharmony_ci	__u16 cyl;
14362306a36Sopenharmony_ci	__u16 head;
14462306a36Sopenharmony_ci	__u8 record;
14562306a36Sopenharmony_ci	__u8 kl;
14662306a36Sopenharmony_ci	__u16 dl;
14762306a36Sopenharmony_ci} __attribute__ ((packed));
14862306a36Sopenharmony_ci
14962306a36Sopenharmony_cistruct ch_t {
15062306a36Sopenharmony_ci	__u16 cyl;
15162306a36Sopenharmony_ci	__u16 head;
15262306a36Sopenharmony_ci} __attribute__ ((packed));
15362306a36Sopenharmony_ci
15462306a36Sopenharmony_cistruct chr_t {
15562306a36Sopenharmony_ci	__u16 cyl;
15662306a36Sopenharmony_ci	__u16 head;
15762306a36Sopenharmony_ci	__u8 record;
15862306a36Sopenharmony_ci} __attribute__ ((packed));
15962306a36Sopenharmony_ci
16062306a36Sopenharmony_cistruct DE_eckd_data {
16162306a36Sopenharmony_ci	struct {
16262306a36Sopenharmony_ci		unsigned char perm:2;	/* Permissions on this extent */
16362306a36Sopenharmony_ci		unsigned char reserved:1;
16462306a36Sopenharmony_ci		unsigned char seek:2;	/* Seek control */
16562306a36Sopenharmony_ci		unsigned char auth:2;	/* Access authorization */
16662306a36Sopenharmony_ci		unsigned char pci:1;	/* PCI Fetch mode */
16762306a36Sopenharmony_ci	} __attribute__ ((packed)) mask;
16862306a36Sopenharmony_ci	struct {
16962306a36Sopenharmony_ci		unsigned char mode:2;	/* Architecture mode */
17062306a36Sopenharmony_ci		unsigned char ckd:1;	/* CKD Conversion */
17162306a36Sopenharmony_ci		unsigned char operation:3;	/* Operation mode */
17262306a36Sopenharmony_ci		unsigned char cfw:1;	/* Cache fast write */
17362306a36Sopenharmony_ci		unsigned char dfw:1;	/* DASD fast write */
17462306a36Sopenharmony_ci	} __attribute__ ((packed)) attributes;
17562306a36Sopenharmony_ci	__u16 blk_size;		/* Blocksize */
17662306a36Sopenharmony_ci	__u16 fast_write_id;
17762306a36Sopenharmony_ci	__u8 ga_additional;	/* Global Attributes Additional */
17862306a36Sopenharmony_ci	__u8 ga_extended;	/* Global Attributes Extended	*/
17962306a36Sopenharmony_ci	struct ch_t beg_ext;
18062306a36Sopenharmony_ci	struct ch_t end_ext;
18162306a36Sopenharmony_ci	unsigned long ep_sys_time; /* Ext Parameter - System Time Stamp */
18262306a36Sopenharmony_ci	__u8 ep_format;        /* Extended Parameter format byte       */
18362306a36Sopenharmony_ci	__u8 ep_prio;          /* Extended Parameter priority I/O byte */
18462306a36Sopenharmony_ci	__u8 ep_reserved1;     /* Extended Parameter Reserved	       */
18562306a36Sopenharmony_ci	__u8 ep_rec_per_track; /* Number of records on a track	       */
18662306a36Sopenharmony_ci	__u8 ep_reserved[4];   /* Extended Parameter Reserved	       */
18762306a36Sopenharmony_ci} __attribute__ ((packed));
18862306a36Sopenharmony_ci
18962306a36Sopenharmony_cistruct LO_eckd_data {
19062306a36Sopenharmony_ci	struct {
19162306a36Sopenharmony_ci		unsigned char orientation:2;
19262306a36Sopenharmony_ci		unsigned char operation:6;
19362306a36Sopenharmony_ci	} __attribute__ ((packed)) operation;
19462306a36Sopenharmony_ci	struct {
19562306a36Sopenharmony_ci		unsigned char last_bytes_used:1;
19662306a36Sopenharmony_ci		unsigned char reserved:6;
19762306a36Sopenharmony_ci		unsigned char read_count_suffix:1;
19862306a36Sopenharmony_ci	} __attribute__ ((packed)) auxiliary;
19962306a36Sopenharmony_ci	__u8 unused;
20062306a36Sopenharmony_ci	__u8 count;
20162306a36Sopenharmony_ci	struct ch_t seek_addr;
20262306a36Sopenharmony_ci	struct chr_t search_arg;
20362306a36Sopenharmony_ci	__u8 sector;
20462306a36Sopenharmony_ci	__u16 length;
20562306a36Sopenharmony_ci} __attribute__ ((packed));
20662306a36Sopenharmony_ci
20762306a36Sopenharmony_cistruct LRE_eckd_data {
20862306a36Sopenharmony_ci	struct {
20962306a36Sopenharmony_ci		unsigned char orientation:2;
21062306a36Sopenharmony_ci		unsigned char operation:6;
21162306a36Sopenharmony_ci	} __attribute__ ((packed)) operation;
21262306a36Sopenharmony_ci	struct {
21362306a36Sopenharmony_ci		unsigned char length_valid:1;
21462306a36Sopenharmony_ci		unsigned char length_scope:1;
21562306a36Sopenharmony_ci		unsigned char imbedded_ccw_valid:1;
21662306a36Sopenharmony_ci		unsigned char check_bytes:2;
21762306a36Sopenharmony_ci		unsigned char imbedded_count_valid:1;
21862306a36Sopenharmony_ci		unsigned char reserved:1;
21962306a36Sopenharmony_ci		unsigned char read_count_suffix:1;
22062306a36Sopenharmony_ci	} __attribute__ ((packed)) auxiliary;
22162306a36Sopenharmony_ci	__u8 imbedded_ccw;
22262306a36Sopenharmony_ci	__u8 count;
22362306a36Sopenharmony_ci	struct ch_t seek_addr;
22462306a36Sopenharmony_ci	struct chr_t search_arg;
22562306a36Sopenharmony_ci	__u8 sector;
22662306a36Sopenharmony_ci	__u16 length;
22762306a36Sopenharmony_ci	__u8 imbedded_count;
22862306a36Sopenharmony_ci	__u8 extended_operation;
22962306a36Sopenharmony_ci	__u16 extended_parameter_length;
23062306a36Sopenharmony_ci	__u8 extended_parameter[];
23162306a36Sopenharmony_ci} __attribute__ ((packed));
23262306a36Sopenharmony_ci
23362306a36Sopenharmony_ci/* Prefix data for format 0x00 and 0x01 */
23462306a36Sopenharmony_cistruct PFX_eckd_data {
23562306a36Sopenharmony_ci	unsigned char format;
23662306a36Sopenharmony_ci	struct {
23762306a36Sopenharmony_ci		unsigned char define_extent:1;
23862306a36Sopenharmony_ci		unsigned char time_stamp:1;
23962306a36Sopenharmony_ci		unsigned char verify_base:1;
24062306a36Sopenharmony_ci		unsigned char hyper_pav:1;
24162306a36Sopenharmony_ci		unsigned char reserved:4;
24262306a36Sopenharmony_ci	} __attribute__ ((packed)) validity;
24362306a36Sopenharmony_ci	__u8 base_address;
24462306a36Sopenharmony_ci	__u8 aux;
24562306a36Sopenharmony_ci	__u8 base_lss;
24662306a36Sopenharmony_ci	__u8 reserved[7];
24762306a36Sopenharmony_ci	struct DE_eckd_data define_extent;
24862306a36Sopenharmony_ci	struct LRE_eckd_data locate_record;
24962306a36Sopenharmony_ci} __attribute__ ((packed));
25062306a36Sopenharmony_ci
25162306a36Sopenharmony_cistruct dasd_eckd_characteristics {
25262306a36Sopenharmony_ci	__u16 cu_type;
25362306a36Sopenharmony_ci	struct {
25462306a36Sopenharmony_ci		unsigned char support:2;
25562306a36Sopenharmony_ci		unsigned char async:1;
25662306a36Sopenharmony_ci		unsigned char reserved:1;
25762306a36Sopenharmony_ci		unsigned char cache_info:1;
25862306a36Sopenharmony_ci		unsigned char model:3;
25962306a36Sopenharmony_ci	} __attribute__ ((packed)) cu_model;
26062306a36Sopenharmony_ci	__u16 dev_type;
26162306a36Sopenharmony_ci	__u8 dev_model;
26262306a36Sopenharmony_ci	struct {
26362306a36Sopenharmony_ci		unsigned char mult_burst:1;
26462306a36Sopenharmony_ci		unsigned char RT_in_LR:1;
26562306a36Sopenharmony_ci		unsigned char reserved1:1;
26662306a36Sopenharmony_ci		unsigned char RD_IN_LR:1;
26762306a36Sopenharmony_ci		unsigned char reserved2:4;
26862306a36Sopenharmony_ci		unsigned char reserved3:8;
26962306a36Sopenharmony_ci		unsigned char defect_wr:1;
27062306a36Sopenharmony_ci		unsigned char XRC_supported:1;
27162306a36Sopenharmony_ci		unsigned char PPRC_enabled:1;
27262306a36Sopenharmony_ci		unsigned char striping:1;
27362306a36Sopenharmony_ci		unsigned char reserved5:4;
27462306a36Sopenharmony_ci		unsigned char cfw:1;
27562306a36Sopenharmony_ci		unsigned char reserved6:2;
27662306a36Sopenharmony_ci		unsigned char cache:1;
27762306a36Sopenharmony_ci		unsigned char dual_copy:1;
27862306a36Sopenharmony_ci		unsigned char dfw:1;
27962306a36Sopenharmony_ci		unsigned char reset_alleg:1;
28062306a36Sopenharmony_ci		unsigned char sense_down:1;
28162306a36Sopenharmony_ci	} __attribute__ ((packed)) facilities;
28262306a36Sopenharmony_ci	__u8 dev_class;
28362306a36Sopenharmony_ci	__u8 unit_type;
28462306a36Sopenharmony_ci	__u16 no_cyl;
28562306a36Sopenharmony_ci	__u16 trk_per_cyl;
28662306a36Sopenharmony_ci	__u8 sec_per_trk;
28762306a36Sopenharmony_ci	__u8 byte_per_track[3];
28862306a36Sopenharmony_ci	__u16 home_bytes;
28962306a36Sopenharmony_ci	__u8 formula;
29062306a36Sopenharmony_ci	union {
29162306a36Sopenharmony_ci		struct {
29262306a36Sopenharmony_ci			__u8 f1;
29362306a36Sopenharmony_ci			__u16 f2;
29462306a36Sopenharmony_ci			__u16 f3;
29562306a36Sopenharmony_ci		} __attribute__ ((packed)) f_0x01;
29662306a36Sopenharmony_ci		struct {
29762306a36Sopenharmony_ci			__u8 f1;
29862306a36Sopenharmony_ci			__u8 f2;
29962306a36Sopenharmony_ci			__u8 f3;
30062306a36Sopenharmony_ci			__u8 f4;
30162306a36Sopenharmony_ci			__u8 f5;
30262306a36Sopenharmony_ci		} __attribute__ ((packed)) f_0x02;
30362306a36Sopenharmony_ci	} __attribute__ ((packed)) factors;
30462306a36Sopenharmony_ci	__u16 first_alt_trk;
30562306a36Sopenharmony_ci	__u16 no_alt_trk;
30662306a36Sopenharmony_ci	__u16 first_dia_trk;
30762306a36Sopenharmony_ci	__u16 no_dia_trk;
30862306a36Sopenharmony_ci	__u16 first_sup_trk;
30962306a36Sopenharmony_ci	__u16 no_sup_trk;
31062306a36Sopenharmony_ci	__u8 MDR_ID;
31162306a36Sopenharmony_ci	__u8 OBR_ID;
31262306a36Sopenharmony_ci	__u8 director;
31362306a36Sopenharmony_ci	__u8 rd_trk_set;
31462306a36Sopenharmony_ci	__u16 max_rec_zero;
31562306a36Sopenharmony_ci	__u8 reserved1;
31662306a36Sopenharmony_ci	__u8 RWANY_in_LR;
31762306a36Sopenharmony_ci	__u8 factor6;
31862306a36Sopenharmony_ci	__u8 factor7;
31962306a36Sopenharmony_ci	__u8 factor8;
32062306a36Sopenharmony_ci	__u8 reserved2[3];
32162306a36Sopenharmony_ci	__u8 reserved3[6];
32262306a36Sopenharmony_ci	__u32 long_no_cyl;
32362306a36Sopenharmony_ci} __attribute__ ((packed));
32462306a36Sopenharmony_ci
32562306a36Sopenharmony_ci/* elements of the configuration data */
32662306a36Sopenharmony_cistruct dasd_ned {
32762306a36Sopenharmony_ci	struct {
32862306a36Sopenharmony_ci		__u8 identifier:2;
32962306a36Sopenharmony_ci		__u8 token_id:1;
33062306a36Sopenharmony_ci		__u8 sno_valid:1;
33162306a36Sopenharmony_ci		__u8 subst_sno:1;
33262306a36Sopenharmony_ci		__u8 recNED:1;
33362306a36Sopenharmony_ci		__u8 emuNED:1;
33462306a36Sopenharmony_ci		__u8 reserved:1;
33562306a36Sopenharmony_ci	} __attribute__ ((packed)) flags;
33662306a36Sopenharmony_ci	__u8 descriptor;
33762306a36Sopenharmony_ci	__u8 dev_class;
33862306a36Sopenharmony_ci	__u8 reserved;
33962306a36Sopenharmony_ci	__u8 dev_type[6];
34062306a36Sopenharmony_ci	__u8 dev_model[3];
34162306a36Sopenharmony_ci	__u8 HDA_manufacturer[3];
34262306a36Sopenharmony_ci	struct {
34362306a36Sopenharmony_ci		__u8 HDA_location[2];
34462306a36Sopenharmony_ci		__u8 HDA_seqno[12];
34562306a36Sopenharmony_ci	} serial;
34662306a36Sopenharmony_ci	__u8 ID;
34762306a36Sopenharmony_ci	__u8 unit_addr;
34862306a36Sopenharmony_ci} __attribute__ ((packed));
34962306a36Sopenharmony_ci
35062306a36Sopenharmony_cistruct dasd_sneq {
35162306a36Sopenharmony_ci	struct {
35262306a36Sopenharmony_ci		__u8 identifier:2;
35362306a36Sopenharmony_ci		__u8 reserved:6;
35462306a36Sopenharmony_ci	} __attribute__ ((packed)) flags;
35562306a36Sopenharmony_ci	__u8 res1;
35662306a36Sopenharmony_ci	__u16 format;
35762306a36Sopenharmony_ci	__u8 res2[4];		/* byte  4- 7 */
35862306a36Sopenharmony_ci	__u8 sua_flags;		/* byte  8    */
35962306a36Sopenharmony_ci	__u8 base_unit_addr;	/* byte  9    */
36062306a36Sopenharmony_ci	__u8 res3[22];		/* byte 10-31 */
36162306a36Sopenharmony_ci} __attribute__ ((packed));
36262306a36Sopenharmony_ci
36362306a36Sopenharmony_cistruct vd_sneq {
36462306a36Sopenharmony_ci	struct {
36562306a36Sopenharmony_ci		__u8 identifier:2;
36662306a36Sopenharmony_ci		__u8 reserved:6;
36762306a36Sopenharmony_ci	} __attribute__ ((packed)) flags;
36862306a36Sopenharmony_ci	__u8 res1;
36962306a36Sopenharmony_ci	__u16 format;
37062306a36Sopenharmony_ci	__u8 res2[4];	/* byte  4- 7 */
37162306a36Sopenharmony_ci	__u8 uit[16];	/* byte  8-23 */
37262306a36Sopenharmony_ci	__u8 res3[8];	/* byte 24-31 */
37362306a36Sopenharmony_ci} __attribute__ ((packed));
37462306a36Sopenharmony_ci
37562306a36Sopenharmony_cistruct dasd_gneq {
37662306a36Sopenharmony_ci	struct {
37762306a36Sopenharmony_ci		__u8 identifier:2;
37862306a36Sopenharmony_ci		__u8 reserved:6;
37962306a36Sopenharmony_ci	} __attribute__ ((packed)) flags;
38062306a36Sopenharmony_ci	__u8 record_selector;
38162306a36Sopenharmony_ci	__u8 reserved[4];
38262306a36Sopenharmony_ci	struct {
38362306a36Sopenharmony_ci		__u8 value:2;
38462306a36Sopenharmony_ci		__u8 number:6;
38562306a36Sopenharmony_ci	} __attribute__ ((packed)) timeout;
38662306a36Sopenharmony_ci	__u8 reserved3;
38762306a36Sopenharmony_ci	__u16 subsystemID;
38862306a36Sopenharmony_ci	__u8 reserved2[22];
38962306a36Sopenharmony_ci} __attribute__ ((packed));
39062306a36Sopenharmony_ci
39162306a36Sopenharmony_cistruct dasd_rssd_features {
39262306a36Sopenharmony_ci	char feature[256];
39362306a36Sopenharmony_ci} __attribute__((packed));
39462306a36Sopenharmony_ci
39562306a36Sopenharmony_cistruct dasd_rssd_messages {
39662306a36Sopenharmony_ci	__u16 length;
39762306a36Sopenharmony_ci	__u8 format;
39862306a36Sopenharmony_ci	__u8 code;
39962306a36Sopenharmony_ci	__u32 message_id;
40062306a36Sopenharmony_ci	__u8 flags;
40162306a36Sopenharmony_ci	char messages[4087];
40262306a36Sopenharmony_ci} __packed;
40362306a36Sopenharmony_ci
40462306a36Sopenharmony_ci/*
40562306a36Sopenharmony_ci * Read Subsystem Data - Volume Storage Query
40662306a36Sopenharmony_ci */
40762306a36Sopenharmony_cistruct dasd_rssd_vsq {
40862306a36Sopenharmony_ci	struct {
40962306a36Sopenharmony_ci		__u8 tse:1;
41062306a36Sopenharmony_ci		__u8 space_not_available:1;
41162306a36Sopenharmony_ci		__u8 ese:1;
41262306a36Sopenharmony_ci		__u8 unused:5;
41362306a36Sopenharmony_ci	} __packed vol_info;
41462306a36Sopenharmony_ci	__u8 unused1;
41562306a36Sopenharmony_ci	__u16 extent_pool_id;
41662306a36Sopenharmony_ci	__u8 warn_cap_limit;
41762306a36Sopenharmony_ci	__u8 warn_cap_guaranteed;
41862306a36Sopenharmony_ci	__u16 unused2;
41962306a36Sopenharmony_ci	__u32 limit_capacity;
42062306a36Sopenharmony_ci	__u32 guaranteed_capacity;
42162306a36Sopenharmony_ci	__u32 space_allocated;
42262306a36Sopenharmony_ci	__u32 space_configured;
42362306a36Sopenharmony_ci	__u32 logical_capacity;
42462306a36Sopenharmony_ci} __packed;
42562306a36Sopenharmony_ci
42662306a36Sopenharmony_ci/*
42762306a36Sopenharmony_ci * Extent Pool Summary
42862306a36Sopenharmony_ci */
42962306a36Sopenharmony_cistruct dasd_ext_pool_sum {
43062306a36Sopenharmony_ci	__u16 pool_id;
43162306a36Sopenharmony_ci	__u8 repo_warn_thrshld;
43262306a36Sopenharmony_ci	__u8 warn_thrshld;
43362306a36Sopenharmony_ci	struct {
43462306a36Sopenharmony_ci		__u8 type:1;			/* 0 - CKD / 1 - FB */
43562306a36Sopenharmony_ci		__u8 track_space_efficient:1;
43662306a36Sopenharmony_ci		__u8 extent_space_efficient:1;
43762306a36Sopenharmony_ci		__u8 standard_volume:1;
43862306a36Sopenharmony_ci		__u8 extent_size_valid:1;
43962306a36Sopenharmony_ci		__u8 capacity_at_warnlevel:1;
44062306a36Sopenharmony_ci		__u8 pool_oos:1;
44162306a36Sopenharmony_ci		__u8 unused0:1;
44262306a36Sopenharmony_ci		__u8 unused1;
44362306a36Sopenharmony_ci	} __packed flags;
44462306a36Sopenharmony_ci	struct {
44562306a36Sopenharmony_ci		__u8 reserved0:1;
44662306a36Sopenharmony_ci		__u8 size_1G:1;
44762306a36Sopenharmony_ci		__u8 reserved1:5;
44862306a36Sopenharmony_ci		__u8 size_16M:1;
44962306a36Sopenharmony_ci	} __packed extent_size;
45062306a36Sopenharmony_ci	__u8 unused;
45162306a36Sopenharmony_ci} __packed;
45262306a36Sopenharmony_ci
45362306a36Sopenharmony_ci/*
45462306a36Sopenharmony_ci * Read Subsystem Data-Response - Logical Configuration Query - Header
45562306a36Sopenharmony_ci */
45662306a36Sopenharmony_cistruct dasd_rssd_lcq {
45762306a36Sopenharmony_ci	__u16 data_length;		/* Length of data returned */
45862306a36Sopenharmony_ci	__u16 pool_count;		/* Count of extent pools returned - Max: 448 */
45962306a36Sopenharmony_ci	struct {
46062306a36Sopenharmony_ci		__u8 pool_info_valid:1;	/* Detailed Information valid */
46162306a36Sopenharmony_ci		__u8 pool_id_volume:1;
46262306a36Sopenharmony_ci		__u8 pool_id_cec:1;
46362306a36Sopenharmony_ci		__u8 unused0:5;
46462306a36Sopenharmony_ci		__u8 unused1;
46562306a36Sopenharmony_ci	} __packed header_flags;
46662306a36Sopenharmony_ci	char sfi_type[6];		/* Storage Facility Image Type (EBCDIC) */
46762306a36Sopenharmony_ci	char sfi_model[3];		/* Storage Facility Image Model (EBCDIC) */
46862306a36Sopenharmony_ci	__u8 sfi_seq_num[10];		/* Storage Facility Image Sequence Number */
46962306a36Sopenharmony_ci	__u8 reserved[7];
47062306a36Sopenharmony_ci	struct dasd_ext_pool_sum ext_pool_sum[448];
47162306a36Sopenharmony_ci} __packed;
47262306a36Sopenharmony_ci
47362306a36Sopenharmony_cistruct dasd_oos_message {
47462306a36Sopenharmony_ci	__u16 length;
47562306a36Sopenharmony_ci	__u8 format;
47662306a36Sopenharmony_ci	__u8 code;
47762306a36Sopenharmony_ci	__u8 percentage_empty;
47862306a36Sopenharmony_ci	__u8 reserved;
47962306a36Sopenharmony_ci	__u16 ext_pool_id;
48062306a36Sopenharmony_ci	__u16 token;
48162306a36Sopenharmony_ci	__u8 unused[6];
48262306a36Sopenharmony_ci} __packed;
48362306a36Sopenharmony_ci
48462306a36Sopenharmony_cistruct dasd_cuir_message {
48562306a36Sopenharmony_ci	__u16 length;
48662306a36Sopenharmony_ci	__u8 format;
48762306a36Sopenharmony_ci	__u8 code;
48862306a36Sopenharmony_ci	__u32 message_id;
48962306a36Sopenharmony_ci	__u8 flags;
49062306a36Sopenharmony_ci	__u8 neq_map[3];
49162306a36Sopenharmony_ci	__u8 ned_map;
49262306a36Sopenharmony_ci	__u8 record_selector;
49362306a36Sopenharmony_ci} __packed;
49462306a36Sopenharmony_ci
49562306a36Sopenharmony_cistruct dasd_psf_cuir_response {
49662306a36Sopenharmony_ci	__u8 order;
49762306a36Sopenharmony_ci	__u8 flags;
49862306a36Sopenharmony_ci	__u8 cc;
49962306a36Sopenharmony_ci	__u8 chpid;
50062306a36Sopenharmony_ci	__u16 device_nr;
50162306a36Sopenharmony_ci	__u16 reserved;
50262306a36Sopenharmony_ci	__u32 message_id;
50362306a36Sopenharmony_ci	__u64 system_id;
50462306a36Sopenharmony_ci	__u8 cssid;
50562306a36Sopenharmony_ci	__u8 ssid;
50662306a36Sopenharmony_ci} __packed;
50762306a36Sopenharmony_ci
50862306a36Sopenharmony_cistruct dasd_ckd_path_group_entry {
50962306a36Sopenharmony_ci	__u8 status_flags;
51062306a36Sopenharmony_ci	__u8 pgid[11];
51162306a36Sopenharmony_ci	__u8 sysplex_name[8];
51262306a36Sopenharmony_ci	__u32 timestamp;
51362306a36Sopenharmony_ci	__u32 cylinder;
51462306a36Sopenharmony_ci	__u8 reserved[4];
51562306a36Sopenharmony_ci} __packed;
51662306a36Sopenharmony_ci
51762306a36Sopenharmony_cistruct dasd_ckd_host_information {
51862306a36Sopenharmony_ci	__u8 access_flags;
51962306a36Sopenharmony_ci	__u8 entry_size;
52062306a36Sopenharmony_ci	__u16 entry_count;
52162306a36Sopenharmony_ci	__u8 entry[16390];
52262306a36Sopenharmony_ci} __packed;
52362306a36Sopenharmony_ci
52462306a36Sopenharmony_cistruct dasd_psf_query_host_access {
52562306a36Sopenharmony_ci	__u8 access_flag;
52662306a36Sopenharmony_ci	__u8 version;
52762306a36Sopenharmony_ci	__u16 CKD_length;
52862306a36Sopenharmony_ci	__u16 SCSI_length;
52962306a36Sopenharmony_ci	__u8 unused[10];
53062306a36Sopenharmony_ci	__u8 host_access_information[16394];
53162306a36Sopenharmony_ci} __packed;
53262306a36Sopenharmony_ci
53362306a36Sopenharmony_ci/*
53462306a36Sopenharmony_ci * Perform Subsystem Function - Prepare for Read Subsystem Data
53562306a36Sopenharmony_ci */
53662306a36Sopenharmony_cistruct dasd_psf_prssd_data {
53762306a36Sopenharmony_ci	unsigned char order;
53862306a36Sopenharmony_ci	unsigned char flags;
53962306a36Sopenharmony_ci	unsigned char reserved1;
54062306a36Sopenharmony_ci	unsigned char reserved2;
54162306a36Sopenharmony_ci	unsigned char lss;
54262306a36Sopenharmony_ci	unsigned char volume;
54362306a36Sopenharmony_ci	unsigned char suborder;
54462306a36Sopenharmony_ci	unsigned char varies[5];
54562306a36Sopenharmony_ci} __attribute__ ((packed));
54662306a36Sopenharmony_ci
54762306a36Sopenharmony_ci/*
54862306a36Sopenharmony_ci * Perform Subsystem Function - Set Subsystem Characteristics
54962306a36Sopenharmony_ci */
55062306a36Sopenharmony_cistruct dasd_psf_ssc_data {
55162306a36Sopenharmony_ci	unsigned char order;
55262306a36Sopenharmony_ci	unsigned char flags;
55362306a36Sopenharmony_ci	unsigned char cu_type[4];
55462306a36Sopenharmony_ci	unsigned char suborder;
55562306a36Sopenharmony_ci	unsigned char reserved[59];
55662306a36Sopenharmony_ci} __attribute__((packed));
55762306a36Sopenharmony_ci
55862306a36Sopenharmony_ci/* Maximum number of extents for a single Release Allocated Space command */
55962306a36Sopenharmony_ci#define DASD_ECKD_RAS_EXTS_MAX		110U
56062306a36Sopenharmony_ci
56162306a36Sopenharmony_cistruct dasd_dso_ras_ext_range {
56262306a36Sopenharmony_ci	struct ch_t beg_ext;
56362306a36Sopenharmony_ci	struct ch_t end_ext;
56462306a36Sopenharmony_ci} __packed;
56562306a36Sopenharmony_ci
56662306a36Sopenharmony_ci/*
56762306a36Sopenharmony_ci * Define Subsystem Operation - Release Allocated Space
56862306a36Sopenharmony_ci */
56962306a36Sopenharmony_cistruct dasd_dso_ras_data {
57062306a36Sopenharmony_ci	__u8 order;
57162306a36Sopenharmony_ci	struct {
57262306a36Sopenharmony_ci		__u8 message:1;		/* Must be zero */
57362306a36Sopenharmony_ci		__u8 reserved1:2;
57462306a36Sopenharmony_ci		__u8 vol_type:1;	/* 0 - CKD/FBA, 1 - FB */
57562306a36Sopenharmony_ci		__u8 reserved2:4;
57662306a36Sopenharmony_ci	} __packed flags;
57762306a36Sopenharmony_ci	/* Operation Flags to specify scope */
57862306a36Sopenharmony_ci	struct {
57962306a36Sopenharmony_ci		__u8 reserved1:2;
58062306a36Sopenharmony_ci		/* Release Space by Extent */
58162306a36Sopenharmony_ci		__u8 by_extent:1;	/* 0 - entire volume, 1 - specified extents */
58262306a36Sopenharmony_ci		__u8 guarantee_init:1;
58362306a36Sopenharmony_ci		__u8 force_release:1;	/* Internal - will be ignored */
58462306a36Sopenharmony_ci		__u16 reserved2:11;
58562306a36Sopenharmony_ci	} __packed op_flags;
58662306a36Sopenharmony_ci	__u8 lss;
58762306a36Sopenharmony_ci	__u8 dev_addr;
58862306a36Sopenharmony_ci	__u32 reserved1;
58962306a36Sopenharmony_ci	__u8 reserved2[10];
59062306a36Sopenharmony_ci	__u16 nr_exts;			/* Defines number of ext_scope - max 110 */
59162306a36Sopenharmony_ci	__u16 reserved3;
59262306a36Sopenharmony_ci} __packed;
59362306a36Sopenharmony_ci
59462306a36Sopenharmony_ci
59562306a36Sopenharmony_ci/*
59662306a36Sopenharmony_ci * some structures and definitions for alias handling
59762306a36Sopenharmony_ci */
59862306a36Sopenharmony_cistruct dasd_unit_address_configuration {
59962306a36Sopenharmony_ci	struct {
60062306a36Sopenharmony_ci		char ua_type;
60162306a36Sopenharmony_ci		char base_ua;
60262306a36Sopenharmony_ci	} unit[256];
60362306a36Sopenharmony_ci} __attribute__((packed));
60462306a36Sopenharmony_ci
60562306a36Sopenharmony_ci
60662306a36Sopenharmony_ci#define MAX_DEVICES_PER_LCU 256
60762306a36Sopenharmony_ci
60862306a36Sopenharmony_ci/* flags on the LCU  */
60962306a36Sopenharmony_ci#define NEED_UAC_UPDATE  0x01
61062306a36Sopenharmony_ci#define UPDATE_PENDING	0x02
61162306a36Sopenharmony_ci
61262306a36Sopenharmony_cienum pavtype {NO_PAV, BASE_PAV, HYPER_PAV};
61362306a36Sopenharmony_ci
61462306a36Sopenharmony_ci
61562306a36Sopenharmony_cistruct alias_root {
61662306a36Sopenharmony_ci	struct list_head serverlist;
61762306a36Sopenharmony_ci	spinlock_t lock;
61862306a36Sopenharmony_ci};
61962306a36Sopenharmony_ci
62062306a36Sopenharmony_cistruct alias_server {
62162306a36Sopenharmony_ci	struct list_head server;
62262306a36Sopenharmony_ci	struct dasd_uid uid;
62362306a36Sopenharmony_ci	struct list_head lculist;
62462306a36Sopenharmony_ci};
62562306a36Sopenharmony_ci
62662306a36Sopenharmony_cistruct summary_unit_check_work_data {
62762306a36Sopenharmony_ci	char reason;
62862306a36Sopenharmony_ci	struct dasd_device *device;
62962306a36Sopenharmony_ci	struct work_struct worker;
63062306a36Sopenharmony_ci};
63162306a36Sopenharmony_ci
63262306a36Sopenharmony_cistruct read_uac_work_data {
63362306a36Sopenharmony_ci	struct dasd_device *device;
63462306a36Sopenharmony_ci	struct delayed_work dwork;
63562306a36Sopenharmony_ci};
63662306a36Sopenharmony_ci
63762306a36Sopenharmony_cistruct alias_lcu {
63862306a36Sopenharmony_ci	struct list_head lcu;
63962306a36Sopenharmony_ci	struct dasd_uid uid;
64062306a36Sopenharmony_ci	enum pavtype pav;
64162306a36Sopenharmony_ci	char flags;
64262306a36Sopenharmony_ci	spinlock_t lock;
64362306a36Sopenharmony_ci	struct list_head grouplist;
64462306a36Sopenharmony_ci	struct list_head active_devices;
64562306a36Sopenharmony_ci	struct list_head inactive_devices;
64662306a36Sopenharmony_ci	struct dasd_unit_address_configuration *uac;
64762306a36Sopenharmony_ci	struct summary_unit_check_work_data suc_data;
64862306a36Sopenharmony_ci	struct read_uac_work_data ruac_data;
64962306a36Sopenharmony_ci	struct dasd_ccw_req *rsu_cqr;
65062306a36Sopenharmony_ci	struct completion lcu_setup;
65162306a36Sopenharmony_ci};
65262306a36Sopenharmony_ci
65362306a36Sopenharmony_cistruct alias_pav_group {
65462306a36Sopenharmony_ci	struct list_head group;
65562306a36Sopenharmony_ci	struct dasd_uid uid;
65662306a36Sopenharmony_ci	struct alias_lcu *lcu;
65762306a36Sopenharmony_ci	struct list_head baselist;
65862306a36Sopenharmony_ci	struct list_head aliaslist;
65962306a36Sopenharmony_ci	struct dasd_device *next;
66062306a36Sopenharmony_ci};
66162306a36Sopenharmony_ci
66262306a36Sopenharmony_cistruct dasd_conf_data {
66362306a36Sopenharmony_ci	struct dasd_ned neds[5];
66462306a36Sopenharmony_ci	u8 reserved[64];
66562306a36Sopenharmony_ci	struct dasd_gneq gneq;
66662306a36Sopenharmony_ci} __packed;
66762306a36Sopenharmony_ci
66862306a36Sopenharmony_cistruct dasd_conf {
66962306a36Sopenharmony_ci	u8 *data;
67062306a36Sopenharmony_ci	int len;
67162306a36Sopenharmony_ci	/* pointers to specific parts in the conf_data */
67262306a36Sopenharmony_ci	struct dasd_ned *ned;
67362306a36Sopenharmony_ci	struct dasd_sneq *sneq;
67462306a36Sopenharmony_ci	struct vd_sneq *vdsneq;
67562306a36Sopenharmony_ci	struct dasd_gneq *gneq;
67662306a36Sopenharmony_ci};
67762306a36Sopenharmony_ci
67862306a36Sopenharmony_cistruct dasd_eckd_private {
67962306a36Sopenharmony_ci	struct dasd_eckd_characteristics rdc_data;
68062306a36Sopenharmony_ci	struct dasd_conf conf;
68162306a36Sopenharmony_ci
68262306a36Sopenharmony_ci	struct eckd_count count_area[5];
68362306a36Sopenharmony_ci	int init_cqr_status;
68462306a36Sopenharmony_ci	int uses_cdl;
68562306a36Sopenharmony_ci	struct attrib_data_t attrib;	/* e.g. cache operations */
68662306a36Sopenharmony_ci	struct dasd_rssd_features features;
68762306a36Sopenharmony_ci	struct dasd_rssd_vsq vsq;
68862306a36Sopenharmony_ci	struct dasd_ext_pool_sum eps;
68962306a36Sopenharmony_ci	u32 real_cyl;
69062306a36Sopenharmony_ci
69162306a36Sopenharmony_ci	/* alias management */
69262306a36Sopenharmony_ci	struct dasd_uid uid;
69362306a36Sopenharmony_ci	struct alias_pav_group *pavgroup;
69462306a36Sopenharmony_ci	struct alias_lcu *lcu;
69562306a36Sopenharmony_ci	int count;
69662306a36Sopenharmony_ci
69762306a36Sopenharmony_ci	u32 fcx_max_data;
69862306a36Sopenharmony_ci	char suc_reason;
69962306a36Sopenharmony_ci};
70062306a36Sopenharmony_ci
70162306a36Sopenharmony_ci
70262306a36Sopenharmony_ci
70362306a36Sopenharmony_ciint dasd_alias_make_device_known_to_lcu(struct dasd_device *);
70462306a36Sopenharmony_civoid dasd_alias_disconnect_device_from_lcu(struct dasd_device *);
70562306a36Sopenharmony_ciint dasd_alias_add_device(struct dasd_device *);
70662306a36Sopenharmony_ciint dasd_alias_remove_device(struct dasd_device *);
70762306a36Sopenharmony_cistruct dasd_device *dasd_alias_get_start_dev(struct dasd_device *);
70862306a36Sopenharmony_civoid dasd_alias_handle_summary_unit_check(struct work_struct *);
70962306a36Sopenharmony_civoid dasd_eckd_reset_ccw_to_base_io(struct dasd_ccw_req *);
71062306a36Sopenharmony_ciint dasd_alias_update_add_device(struct dasd_device *);
71162306a36Sopenharmony_ci#endif				/* DASD_ECKD_H */
712