xref: /OK3568_Linux_fs/kernel/drivers/s390/block/dasd_eckd.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0 */
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun  * Author(s)......: Holger Smolinski <Holger.Smolinski@de.ibm.com>
4*4882a593Smuzhiyun  *		    Horst Hummel <Horst.Hummel@de.ibm.com>
5*4882a593Smuzhiyun  * Bugreports.to..: <Linux390@de.ibm.com>
6*4882a593Smuzhiyun  * Copyright IBM Corp. 1999, 2000
7*4882a593Smuzhiyun  *
8*4882a593Smuzhiyun  */
9*4882a593Smuzhiyun 
10*4882a593Smuzhiyun #ifndef DASD_ECKD_H
11*4882a593Smuzhiyun #define DASD_ECKD_H
12*4882a593Smuzhiyun 
13*4882a593Smuzhiyun /*****************************************************************************
14*4882a593Smuzhiyun  * SECTION: CCW Definitions
15*4882a593Smuzhiyun  ****************************************************************************/
16*4882a593Smuzhiyun #define DASD_ECKD_CCW_WRITE		 0x05
17*4882a593Smuzhiyun #define DASD_ECKD_CCW_READ		 0x06
18*4882a593Smuzhiyun #define DASD_ECKD_CCW_WRITE_HOME_ADDRESS 0x09
19*4882a593Smuzhiyun #define DASD_ECKD_CCW_READ_HOME_ADDRESS	 0x0a
20*4882a593Smuzhiyun #define DASD_ECKD_CCW_WRITE_KD		 0x0d
21*4882a593Smuzhiyun #define DASD_ECKD_CCW_READ_KD		 0x0e
22*4882a593Smuzhiyun #define DASD_ECKD_CCW_ERASE		 0x11
23*4882a593Smuzhiyun #define DASD_ECKD_CCW_READ_COUNT	 0x12
24*4882a593Smuzhiyun #define DASD_ECKD_CCW_SLCK		 0x14
25*4882a593Smuzhiyun #define DASD_ECKD_CCW_WRITE_RECORD_ZERO	 0x15
26*4882a593Smuzhiyun #define DASD_ECKD_CCW_READ_RECORD_ZERO	 0x16
27*4882a593Smuzhiyun #define DASD_ECKD_CCW_WRITE_CKD		 0x1d
28*4882a593Smuzhiyun #define DASD_ECKD_CCW_READ_CKD		 0x1e
29*4882a593Smuzhiyun #define DASD_ECKD_CCW_PSF		 0x27
30*4882a593Smuzhiyun #define DASD_ECKD_CCW_SNID		 0x34
31*4882a593Smuzhiyun #define DASD_ECKD_CCW_RSSD		 0x3e
32*4882a593Smuzhiyun #define DASD_ECKD_CCW_LOCATE_RECORD	 0x47
33*4882a593Smuzhiyun #define DASD_ECKD_CCW_LOCATE_RECORD_EXT	 0x4b
34*4882a593Smuzhiyun #define DASD_ECKD_CCW_SNSS		 0x54
35*4882a593Smuzhiyun #define DASD_ECKD_CCW_DEFINE_EXTENT	 0x63
36*4882a593Smuzhiyun #define DASD_ECKD_CCW_WRITE_MT		 0x85
37*4882a593Smuzhiyun #define DASD_ECKD_CCW_READ_MT		 0x86
38*4882a593Smuzhiyun #define DASD_ECKD_CCW_WRITE_KD_MT	 0x8d
39*4882a593Smuzhiyun #define DASD_ECKD_CCW_READ_KD_MT	 0x8e
40*4882a593Smuzhiyun #define DASD_ECKD_CCW_READ_COUNT_MT	 0x92
41*4882a593Smuzhiyun #define DASD_ECKD_CCW_RELEASE		 0x94
42*4882a593Smuzhiyun #define DASD_ECKD_CCW_WRITE_FULL_TRACK	 0x95
43*4882a593Smuzhiyun #define DASD_ECKD_CCW_READ_CKD_MT	 0x9e
44*4882a593Smuzhiyun #define DASD_ECKD_CCW_WRITE_CKD_MT	 0x9d
45*4882a593Smuzhiyun #define DASD_ECKD_CCW_WRITE_TRACK_DATA	 0xA5
46*4882a593Smuzhiyun #define DASD_ECKD_CCW_READ_TRACK_DATA	 0xA6
47*4882a593Smuzhiyun #define DASD_ECKD_CCW_RESERVE		 0xB4
48*4882a593Smuzhiyun #define DASD_ECKD_CCW_READ_TRACK	 0xDE
49*4882a593Smuzhiyun #define DASD_ECKD_CCW_PFX		 0xE7
50*4882a593Smuzhiyun #define DASD_ECKD_CCW_PFX_READ		 0xEA
51*4882a593Smuzhiyun #define DASD_ECKD_CCW_RSCK		 0xF9
52*4882a593Smuzhiyun #define DASD_ECKD_CCW_RCD		 0xFA
53*4882a593Smuzhiyun #define DASD_ECKD_CCW_DSO		 0xF7
54*4882a593Smuzhiyun 
55*4882a593Smuzhiyun /* Define Subssystem Function / Orders */
56*4882a593Smuzhiyun #define DSO_ORDER_RAS			 0x81
57*4882a593Smuzhiyun 
58*4882a593Smuzhiyun /*
59*4882a593Smuzhiyun  * Perform Subsystem Function / Orders
60*4882a593Smuzhiyun  */
61*4882a593Smuzhiyun #define PSF_ORDER_PRSSD			 0x18
62*4882a593Smuzhiyun #define PSF_ORDER_CUIR_RESPONSE		 0x1A
63*4882a593Smuzhiyun #define PSF_ORDER_SSC			 0x1D
64*4882a593Smuzhiyun 
65*4882a593Smuzhiyun /*
66*4882a593Smuzhiyun  * Perform Subsystem Function / Sub-Orders
67*4882a593Smuzhiyun  */
68*4882a593Smuzhiyun #define PSF_SUBORDER_QHA		 0x1C /* Query Host Access */
69*4882a593Smuzhiyun #define PSF_SUBORDER_VSQ		 0x52 /* Volume Storage Query */
70*4882a593Smuzhiyun #define PSF_SUBORDER_LCQ		 0x53 /* Logical Configuration Query */
71*4882a593Smuzhiyun 
72*4882a593Smuzhiyun /*
73*4882a593Smuzhiyun  * CUIR response condition codes
74*4882a593Smuzhiyun  */
75*4882a593Smuzhiyun #define PSF_CUIR_INVALID		 0x00
76*4882a593Smuzhiyun #define PSF_CUIR_COMPLETED		 0x01
77*4882a593Smuzhiyun #define PSF_CUIR_NOT_SUPPORTED		 0x02
78*4882a593Smuzhiyun #define PSF_CUIR_ERROR_IN_REQ		 0x03
79*4882a593Smuzhiyun #define PSF_CUIR_DENIED			 0x04
80*4882a593Smuzhiyun #define PSF_CUIR_LAST_PATH		 0x05
81*4882a593Smuzhiyun #define PSF_CUIR_DEVICE_ONLINE		 0x06
82*4882a593Smuzhiyun #define PSF_CUIR_VARY_FAILURE		 0x07
83*4882a593Smuzhiyun #define PSF_CUIR_SOFTWARE_FAILURE	 0x08
84*4882a593Smuzhiyun #define PSF_CUIR_NOT_RECOGNIZED		 0x09
85*4882a593Smuzhiyun 
86*4882a593Smuzhiyun /*
87*4882a593Smuzhiyun  * CUIR codes
88*4882a593Smuzhiyun  */
89*4882a593Smuzhiyun #define CUIR_QUIESCE			 0x01
90*4882a593Smuzhiyun #define CUIR_RESUME			 0x02
91*4882a593Smuzhiyun 
92*4882a593Smuzhiyun /*
93*4882a593Smuzhiyun  * Out-of-space (OOS) Codes
94*4882a593Smuzhiyun  */
95*4882a593Smuzhiyun #define REPO_WARN			 0x01
96*4882a593Smuzhiyun #define REPO_EXHAUST			 0x02
97*4882a593Smuzhiyun #define POOL_WARN			 0x03
98*4882a593Smuzhiyun #define POOL_EXHAUST			 0x04
99*4882a593Smuzhiyun #define REPO_RELIEVE			 0x05
100*4882a593Smuzhiyun #define POOL_RELIEVE			 0x06
101*4882a593Smuzhiyun 
102*4882a593Smuzhiyun /*
103*4882a593Smuzhiyun  * attention message definitions
104*4882a593Smuzhiyun  */
105*4882a593Smuzhiyun #define ATTENTION_LENGTH_CUIR		 0x0e
106*4882a593Smuzhiyun #define ATTENTION_FORMAT_CUIR		 0x01
107*4882a593Smuzhiyun #define ATTENTION_LENGTH_OOS		 0x10
108*4882a593Smuzhiyun #define ATTENTION_FORMAT_OOS		 0x06
109*4882a593Smuzhiyun 
110*4882a593Smuzhiyun #define DASD_ECKD_PG_GROUPED		 0x10
111*4882a593Smuzhiyun 
112*4882a593Smuzhiyun /*
113*4882a593Smuzhiyun  * Size that is reportet for large volumes in the old 16-bit no_cyl field
114*4882a593Smuzhiyun  */
115*4882a593Smuzhiyun #define LV_COMPAT_CYL 0xFFFE
116*4882a593Smuzhiyun 
117*4882a593Smuzhiyun 
118*4882a593Smuzhiyun #define FCX_MAX_DATA_FACTOR 65536
119*4882a593Smuzhiyun #define DASD_ECKD_RCD_DATA_SIZE 256
120*4882a593Smuzhiyun 
121*4882a593Smuzhiyun #define DASD_ECKD_PATH_THRHLD		 256
122*4882a593Smuzhiyun #define DASD_ECKD_PATH_INTERVAL		 300
123*4882a593Smuzhiyun 
124*4882a593Smuzhiyun /*
125*4882a593Smuzhiyun  * Maximum number of blocks to be chained
126*4882a593Smuzhiyun  */
127*4882a593Smuzhiyun #define DASD_ECKD_MAX_BLOCKS		 190
128*4882a593Smuzhiyun #define DASD_ECKD_MAX_BLOCKS_RAW	 256
129*4882a593Smuzhiyun 
130*4882a593Smuzhiyun /*****************************************************************************
131*4882a593Smuzhiyun  * SECTION: Type Definitions
132*4882a593Smuzhiyun  ****************************************************************************/
133*4882a593Smuzhiyun 
134*4882a593Smuzhiyun struct eckd_count {
135*4882a593Smuzhiyun 	__u16 cyl;
136*4882a593Smuzhiyun 	__u16 head;
137*4882a593Smuzhiyun 	__u8 record;
138*4882a593Smuzhiyun 	__u8 kl;
139*4882a593Smuzhiyun 	__u16 dl;
140*4882a593Smuzhiyun } __attribute__ ((packed));
141*4882a593Smuzhiyun 
142*4882a593Smuzhiyun struct ch_t {
143*4882a593Smuzhiyun 	__u16 cyl;
144*4882a593Smuzhiyun 	__u16 head;
145*4882a593Smuzhiyun } __attribute__ ((packed));
146*4882a593Smuzhiyun 
147*4882a593Smuzhiyun struct chr_t {
148*4882a593Smuzhiyun 	__u16 cyl;
149*4882a593Smuzhiyun 	__u16 head;
150*4882a593Smuzhiyun 	__u8 record;
151*4882a593Smuzhiyun } __attribute__ ((packed));
152*4882a593Smuzhiyun 
153*4882a593Smuzhiyun struct DE_eckd_data {
154*4882a593Smuzhiyun 	struct {
155*4882a593Smuzhiyun 		unsigned char perm:2;	/* Permissions on this extent */
156*4882a593Smuzhiyun 		unsigned char reserved:1;
157*4882a593Smuzhiyun 		unsigned char seek:2;	/* Seek control */
158*4882a593Smuzhiyun 		unsigned char auth:2;	/* Access authorization */
159*4882a593Smuzhiyun 		unsigned char pci:1;	/* PCI Fetch mode */
160*4882a593Smuzhiyun 	} __attribute__ ((packed)) mask;
161*4882a593Smuzhiyun 	struct {
162*4882a593Smuzhiyun 		unsigned char mode:2;	/* Architecture mode */
163*4882a593Smuzhiyun 		unsigned char ckd:1;	/* CKD Conversion */
164*4882a593Smuzhiyun 		unsigned char operation:3;	/* Operation mode */
165*4882a593Smuzhiyun 		unsigned char cfw:1;	/* Cache fast write */
166*4882a593Smuzhiyun 		unsigned char dfw:1;	/* DASD fast write */
167*4882a593Smuzhiyun 	} __attribute__ ((packed)) attributes;
168*4882a593Smuzhiyun 	__u16 blk_size;		/* Blocksize */
169*4882a593Smuzhiyun 	__u16 fast_write_id;
170*4882a593Smuzhiyun 	__u8 ga_additional;	/* Global Attributes Additional */
171*4882a593Smuzhiyun 	__u8 ga_extended;	/* Global Attributes Extended	*/
172*4882a593Smuzhiyun 	struct ch_t beg_ext;
173*4882a593Smuzhiyun 	struct ch_t end_ext;
174*4882a593Smuzhiyun 	unsigned long ep_sys_time; /* Ext Parameter - System Time Stamp */
175*4882a593Smuzhiyun 	__u8 ep_format;        /* Extended Parameter format byte       */
176*4882a593Smuzhiyun 	__u8 ep_prio;          /* Extended Parameter priority I/O byte */
177*4882a593Smuzhiyun 	__u8 ep_reserved1;     /* Extended Parameter Reserved	       */
178*4882a593Smuzhiyun 	__u8 ep_rec_per_track; /* Number of records on a track	       */
179*4882a593Smuzhiyun 	__u8 ep_reserved[4];   /* Extended Parameter Reserved	       */
180*4882a593Smuzhiyun } __attribute__ ((packed));
181*4882a593Smuzhiyun 
182*4882a593Smuzhiyun struct LO_eckd_data {
183*4882a593Smuzhiyun 	struct {
184*4882a593Smuzhiyun 		unsigned char orientation:2;
185*4882a593Smuzhiyun 		unsigned char operation:6;
186*4882a593Smuzhiyun 	} __attribute__ ((packed)) operation;
187*4882a593Smuzhiyun 	struct {
188*4882a593Smuzhiyun 		unsigned char last_bytes_used:1;
189*4882a593Smuzhiyun 		unsigned char reserved:6;
190*4882a593Smuzhiyun 		unsigned char read_count_suffix:1;
191*4882a593Smuzhiyun 	} __attribute__ ((packed)) auxiliary;
192*4882a593Smuzhiyun 	__u8 unused;
193*4882a593Smuzhiyun 	__u8 count;
194*4882a593Smuzhiyun 	struct ch_t seek_addr;
195*4882a593Smuzhiyun 	struct chr_t search_arg;
196*4882a593Smuzhiyun 	__u8 sector;
197*4882a593Smuzhiyun 	__u16 length;
198*4882a593Smuzhiyun } __attribute__ ((packed));
199*4882a593Smuzhiyun 
200*4882a593Smuzhiyun struct LRE_eckd_data {
201*4882a593Smuzhiyun 	struct {
202*4882a593Smuzhiyun 		unsigned char orientation:2;
203*4882a593Smuzhiyun 		unsigned char operation:6;
204*4882a593Smuzhiyun 	} __attribute__ ((packed)) operation;
205*4882a593Smuzhiyun 	struct {
206*4882a593Smuzhiyun 		unsigned char length_valid:1;
207*4882a593Smuzhiyun 		unsigned char length_scope:1;
208*4882a593Smuzhiyun 		unsigned char imbedded_ccw_valid:1;
209*4882a593Smuzhiyun 		unsigned char check_bytes:2;
210*4882a593Smuzhiyun 		unsigned char imbedded_count_valid:1;
211*4882a593Smuzhiyun 		unsigned char reserved:1;
212*4882a593Smuzhiyun 		unsigned char read_count_suffix:1;
213*4882a593Smuzhiyun 	} __attribute__ ((packed)) auxiliary;
214*4882a593Smuzhiyun 	__u8 imbedded_ccw;
215*4882a593Smuzhiyun 	__u8 count;
216*4882a593Smuzhiyun 	struct ch_t seek_addr;
217*4882a593Smuzhiyun 	struct chr_t search_arg;
218*4882a593Smuzhiyun 	__u8 sector;
219*4882a593Smuzhiyun 	__u16 length;
220*4882a593Smuzhiyun 	__u8 imbedded_count;
221*4882a593Smuzhiyun 	__u8 extended_operation;
222*4882a593Smuzhiyun 	__u16 extended_parameter_length;
223*4882a593Smuzhiyun 	__u8 extended_parameter[];
224*4882a593Smuzhiyun } __attribute__ ((packed));
225*4882a593Smuzhiyun 
226*4882a593Smuzhiyun /* Prefix data for format 0x00 and 0x01 */
227*4882a593Smuzhiyun struct PFX_eckd_data {
228*4882a593Smuzhiyun 	unsigned char format;
229*4882a593Smuzhiyun 	struct {
230*4882a593Smuzhiyun 		unsigned char define_extent:1;
231*4882a593Smuzhiyun 		unsigned char time_stamp:1;
232*4882a593Smuzhiyun 		unsigned char verify_base:1;
233*4882a593Smuzhiyun 		unsigned char hyper_pav:1;
234*4882a593Smuzhiyun 		unsigned char reserved:4;
235*4882a593Smuzhiyun 	} __attribute__ ((packed)) validity;
236*4882a593Smuzhiyun 	__u8 base_address;
237*4882a593Smuzhiyun 	__u8 aux;
238*4882a593Smuzhiyun 	__u8 base_lss;
239*4882a593Smuzhiyun 	__u8 reserved[7];
240*4882a593Smuzhiyun 	struct DE_eckd_data define_extent;
241*4882a593Smuzhiyun 	struct LRE_eckd_data locate_record;
242*4882a593Smuzhiyun } __attribute__ ((packed));
243*4882a593Smuzhiyun 
244*4882a593Smuzhiyun struct dasd_eckd_characteristics {
245*4882a593Smuzhiyun 	__u16 cu_type;
246*4882a593Smuzhiyun 	struct {
247*4882a593Smuzhiyun 		unsigned char support:2;
248*4882a593Smuzhiyun 		unsigned char async:1;
249*4882a593Smuzhiyun 		unsigned char reserved:1;
250*4882a593Smuzhiyun 		unsigned char cache_info:1;
251*4882a593Smuzhiyun 		unsigned char model:3;
252*4882a593Smuzhiyun 	} __attribute__ ((packed)) cu_model;
253*4882a593Smuzhiyun 	__u16 dev_type;
254*4882a593Smuzhiyun 	__u8 dev_model;
255*4882a593Smuzhiyun 	struct {
256*4882a593Smuzhiyun 		unsigned char mult_burst:1;
257*4882a593Smuzhiyun 		unsigned char RT_in_LR:1;
258*4882a593Smuzhiyun 		unsigned char reserved1:1;
259*4882a593Smuzhiyun 		unsigned char RD_IN_LR:1;
260*4882a593Smuzhiyun 		unsigned char reserved2:4;
261*4882a593Smuzhiyun 		unsigned char reserved3:8;
262*4882a593Smuzhiyun 		unsigned char defect_wr:1;
263*4882a593Smuzhiyun 		unsigned char XRC_supported:1;
264*4882a593Smuzhiyun 		unsigned char reserved4:1;
265*4882a593Smuzhiyun 		unsigned char striping:1;
266*4882a593Smuzhiyun 		unsigned char reserved5:4;
267*4882a593Smuzhiyun 		unsigned char cfw:1;
268*4882a593Smuzhiyun 		unsigned char reserved6:2;
269*4882a593Smuzhiyun 		unsigned char cache:1;
270*4882a593Smuzhiyun 		unsigned char dual_copy:1;
271*4882a593Smuzhiyun 		unsigned char dfw:1;
272*4882a593Smuzhiyun 		unsigned char reset_alleg:1;
273*4882a593Smuzhiyun 		unsigned char sense_down:1;
274*4882a593Smuzhiyun 	} __attribute__ ((packed)) facilities;
275*4882a593Smuzhiyun 	__u8 dev_class;
276*4882a593Smuzhiyun 	__u8 unit_type;
277*4882a593Smuzhiyun 	__u16 no_cyl;
278*4882a593Smuzhiyun 	__u16 trk_per_cyl;
279*4882a593Smuzhiyun 	__u8 sec_per_trk;
280*4882a593Smuzhiyun 	__u8 byte_per_track[3];
281*4882a593Smuzhiyun 	__u16 home_bytes;
282*4882a593Smuzhiyun 	__u8 formula;
283*4882a593Smuzhiyun 	union {
284*4882a593Smuzhiyun 		struct {
285*4882a593Smuzhiyun 			__u8 f1;
286*4882a593Smuzhiyun 			__u16 f2;
287*4882a593Smuzhiyun 			__u16 f3;
288*4882a593Smuzhiyun 		} __attribute__ ((packed)) f_0x01;
289*4882a593Smuzhiyun 		struct {
290*4882a593Smuzhiyun 			__u8 f1;
291*4882a593Smuzhiyun 			__u8 f2;
292*4882a593Smuzhiyun 			__u8 f3;
293*4882a593Smuzhiyun 			__u8 f4;
294*4882a593Smuzhiyun 			__u8 f5;
295*4882a593Smuzhiyun 		} __attribute__ ((packed)) f_0x02;
296*4882a593Smuzhiyun 	} __attribute__ ((packed)) factors;
297*4882a593Smuzhiyun 	__u16 first_alt_trk;
298*4882a593Smuzhiyun 	__u16 no_alt_trk;
299*4882a593Smuzhiyun 	__u16 first_dia_trk;
300*4882a593Smuzhiyun 	__u16 no_dia_trk;
301*4882a593Smuzhiyun 	__u16 first_sup_trk;
302*4882a593Smuzhiyun 	__u16 no_sup_trk;
303*4882a593Smuzhiyun 	__u8 MDR_ID;
304*4882a593Smuzhiyun 	__u8 OBR_ID;
305*4882a593Smuzhiyun 	__u8 director;
306*4882a593Smuzhiyun 	__u8 rd_trk_set;
307*4882a593Smuzhiyun 	__u16 max_rec_zero;
308*4882a593Smuzhiyun 	__u8 reserved1;
309*4882a593Smuzhiyun 	__u8 RWANY_in_LR;
310*4882a593Smuzhiyun 	__u8 factor6;
311*4882a593Smuzhiyun 	__u8 factor7;
312*4882a593Smuzhiyun 	__u8 factor8;
313*4882a593Smuzhiyun 	__u8 reserved2[3];
314*4882a593Smuzhiyun 	__u8 reserved3[6];
315*4882a593Smuzhiyun 	__u32 long_no_cyl;
316*4882a593Smuzhiyun } __attribute__ ((packed));
317*4882a593Smuzhiyun 
318*4882a593Smuzhiyun /* elements of the configuration data */
319*4882a593Smuzhiyun struct dasd_ned {
320*4882a593Smuzhiyun 	struct {
321*4882a593Smuzhiyun 		__u8 identifier:2;
322*4882a593Smuzhiyun 		__u8 token_id:1;
323*4882a593Smuzhiyun 		__u8 sno_valid:1;
324*4882a593Smuzhiyun 		__u8 subst_sno:1;
325*4882a593Smuzhiyun 		__u8 recNED:1;
326*4882a593Smuzhiyun 		__u8 emuNED:1;
327*4882a593Smuzhiyun 		__u8 reserved:1;
328*4882a593Smuzhiyun 	} __attribute__ ((packed)) flags;
329*4882a593Smuzhiyun 	__u8 descriptor;
330*4882a593Smuzhiyun 	__u8 dev_class;
331*4882a593Smuzhiyun 	__u8 reserved;
332*4882a593Smuzhiyun 	__u8 dev_type[6];
333*4882a593Smuzhiyun 	__u8 dev_model[3];
334*4882a593Smuzhiyun 	__u8 HDA_manufacturer[3];
335*4882a593Smuzhiyun 	__u8 HDA_location[2];
336*4882a593Smuzhiyun 	__u8 HDA_seqno[12];
337*4882a593Smuzhiyun 	__u8 ID;
338*4882a593Smuzhiyun 	__u8 unit_addr;
339*4882a593Smuzhiyun } __attribute__ ((packed));
340*4882a593Smuzhiyun 
341*4882a593Smuzhiyun struct dasd_sneq {
342*4882a593Smuzhiyun 	struct {
343*4882a593Smuzhiyun 		__u8 identifier:2;
344*4882a593Smuzhiyun 		__u8 reserved:6;
345*4882a593Smuzhiyun 	} __attribute__ ((packed)) flags;
346*4882a593Smuzhiyun 	__u8 res1;
347*4882a593Smuzhiyun 	__u16 format;
348*4882a593Smuzhiyun 	__u8 res2[4];		/* byte  4- 7 */
349*4882a593Smuzhiyun 	__u8 sua_flags;		/* byte  8    */
350*4882a593Smuzhiyun 	__u8 base_unit_addr;	/* byte  9    */
351*4882a593Smuzhiyun 	__u8 res3[22];		/* byte 10-31 */
352*4882a593Smuzhiyun } __attribute__ ((packed));
353*4882a593Smuzhiyun 
354*4882a593Smuzhiyun struct vd_sneq {
355*4882a593Smuzhiyun 	struct {
356*4882a593Smuzhiyun 		__u8 identifier:2;
357*4882a593Smuzhiyun 		__u8 reserved:6;
358*4882a593Smuzhiyun 	} __attribute__ ((packed)) flags;
359*4882a593Smuzhiyun 	__u8 res1;
360*4882a593Smuzhiyun 	__u16 format;
361*4882a593Smuzhiyun 	__u8 res2[4];	/* byte  4- 7 */
362*4882a593Smuzhiyun 	__u8 uit[16];	/* byte  8-23 */
363*4882a593Smuzhiyun 	__u8 res3[8];	/* byte 24-31 */
364*4882a593Smuzhiyun } __attribute__ ((packed));
365*4882a593Smuzhiyun 
366*4882a593Smuzhiyun struct dasd_gneq {
367*4882a593Smuzhiyun 	struct {
368*4882a593Smuzhiyun 		__u8 identifier:2;
369*4882a593Smuzhiyun 		__u8 reserved:6;
370*4882a593Smuzhiyun 	} __attribute__ ((packed)) flags;
371*4882a593Smuzhiyun 	__u8 record_selector;
372*4882a593Smuzhiyun 	__u8 reserved[4];
373*4882a593Smuzhiyun 	struct {
374*4882a593Smuzhiyun 		__u8 value:2;
375*4882a593Smuzhiyun 		__u8 number:6;
376*4882a593Smuzhiyun 	} __attribute__ ((packed)) timeout;
377*4882a593Smuzhiyun 	__u8 reserved3;
378*4882a593Smuzhiyun 	__u16 subsystemID;
379*4882a593Smuzhiyun 	__u8 reserved2[22];
380*4882a593Smuzhiyun } __attribute__ ((packed));
381*4882a593Smuzhiyun 
382*4882a593Smuzhiyun struct dasd_rssd_features {
383*4882a593Smuzhiyun 	char feature[256];
384*4882a593Smuzhiyun } __attribute__((packed));
385*4882a593Smuzhiyun 
386*4882a593Smuzhiyun struct dasd_rssd_messages {
387*4882a593Smuzhiyun 	__u16 length;
388*4882a593Smuzhiyun 	__u8 format;
389*4882a593Smuzhiyun 	__u8 code;
390*4882a593Smuzhiyun 	__u32 message_id;
391*4882a593Smuzhiyun 	__u8 flags;
392*4882a593Smuzhiyun 	char messages[4087];
393*4882a593Smuzhiyun } __packed;
394*4882a593Smuzhiyun 
395*4882a593Smuzhiyun /*
396*4882a593Smuzhiyun  * Read Subsystem Data - Volume Storage Query
397*4882a593Smuzhiyun  */
398*4882a593Smuzhiyun struct dasd_rssd_vsq {
399*4882a593Smuzhiyun 	struct {
400*4882a593Smuzhiyun 		__u8 tse:1;
401*4882a593Smuzhiyun 		__u8 space_not_available:1;
402*4882a593Smuzhiyun 		__u8 ese:1;
403*4882a593Smuzhiyun 		__u8 unused:5;
404*4882a593Smuzhiyun 	} __packed vol_info;
405*4882a593Smuzhiyun 	__u8 unused1;
406*4882a593Smuzhiyun 	__u16 extent_pool_id;
407*4882a593Smuzhiyun 	__u8 warn_cap_limit;
408*4882a593Smuzhiyun 	__u8 warn_cap_guaranteed;
409*4882a593Smuzhiyun 	__u16 unused2;
410*4882a593Smuzhiyun 	__u32 limit_capacity;
411*4882a593Smuzhiyun 	__u32 guaranteed_capacity;
412*4882a593Smuzhiyun 	__u32 space_allocated;
413*4882a593Smuzhiyun 	__u32 space_configured;
414*4882a593Smuzhiyun 	__u32 logical_capacity;
415*4882a593Smuzhiyun } __packed;
416*4882a593Smuzhiyun 
417*4882a593Smuzhiyun /*
418*4882a593Smuzhiyun  * Extent Pool Summary
419*4882a593Smuzhiyun  */
420*4882a593Smuzhiyun struct dasd_ext_pool_sum {
421*4882a593Smuzhiyun 	__u16 pool_id;
422*4882a593Smuzhiyun 	__u8 repo_warn_thrshld;
423*4882a593Smuzhiyun 	__u8 warn_thrshld;
424*4882a593Smuzhiyun 	struct {
425*4882a593Smuzhiyun 		__u8 type:1;			/* 0 - CKD / 1 - FB */
426*4882a593Smuzhiyun 		__u8 track_space_efficient:1;
427*4882a593Smuzhiyun 		__u8 extent_space_efficient:1;
428*4882a593Smuzhiyun 		__u8 standard_volume:1;
429*4882a593Smuzhiyun 		__u8 extent_size_valid:1;
430*4882a593Smuzhiyun 		__u8 capacity_at_warnlevel:1;
431*4882a593Smuzhiyun 		__u8 pool_oos:1;
432*4882a593Smuzhiyun 		__u8 unused0:1;
433*4882a593Smuzhiyun 		__u8 unused1;
434*4882a593Smuzhiyun 	} __packed flags;
435*4882a593Smuzhiyun 	struct {
436*4882a593Smuzhiyun 		__u8 reserved0:1;
437*4882a593Smuzhiyun 		__u8 size_1G:1;
438*4882a593Smuzhiyun 		__u8 reserved1:5;
439*4882a593Smuzhiyun 		__u8 size_16M:1;
440*4882a593Smuzhiyun 	} __packed extent_size;
441*4882a593Smuzhiyun 	__u8 unused;
442*4882a593Smuzhiyun } __packed;
443*4882a593Smuzhiyun 
444*4882a593Smuzhiyun /*
445*4882a593Smuzhiyun  * Read Subsystem Data-Response - Logical Configuration Query - Header
446*4882a593Smuzhiyun  */
447*4882a593Smuzhiyun struct dasd_rssd_lcq {
448*4882a593Smuzhiyun 	__u16 data_length;		/* Length of data returned */
449*4882a593Smuzhiyun 	__u16 pool_count;		/* Count of extent pools returned - Max: 448 */
450*4882a593Smuzhiyun 	struct {
451*4882a593Smuzhiyun 		__u8 pool_info_valid:1;	/* Detailed Information valid */
452*4882a593Smuzhiyun 		__u8 pool_id_volume:1;
453*4882a593Smuzhiyun 		__u8 pool_id_cec:1;
454*4882a593Smuzhiyun 		__u8 unused0:5;
455*4882a593Smuzhiyun 		__u8 unused1;
456*4882a593Smuzhiyun 	} __packed header_flags;
457*4882a593Smuzhiyun 	char sfi_type[6];		/* Storage Facility Image Type (EBCDIC) */
458*4882a593Smuzhiyun 	char sfi_model[3];		/* Storage Facility Image Model (EBCDIC) */
459*4882a593Smuzhiyun 	__u8 sfi_seq_num[10];		/* Storage Facility Image Sequence Number */
460*4882a593Smuzhiyun 	__u8 reserved[7];
461*4882a593Smuzhiyun 	struct dasd_ext_pool_sum ext_pool_sum[448];
462*4882a593Smuzhiyun } __packed;
463*4882a593Smuzhiyun 
464*4882a593Smuzhiyun struct dasd_oos_message {
465*4882a593Smuzhiyun 	__u16 length;
466*4882a593Smuzhiyun 	__u8 format;
467*4882a593Smuzhiyun 	__u8 code;
468*4882a593Smuzhiyun 	__u8 percentage_empty;
469*4882a593Smuzhiyun 	__u8 reserved;
470*4882a593Smuzhiyun 	__u16 ext_pool_id;
471*4882a593Smuzhiyun 	__u16 token;
472*4882a593Smuzhiyun 	__u8 unused[6];
473*4882a593Smuzhiyun } __packed;
474*4882a593Smuzhiyun 
475*4882a593Smuzhiyun struct dasd_cuir_message {
476*4882a593Smuzhiyun 	__u16 length;
477*4882a593Smuzhiyun 	__u8 format;
478*4882a593Smuzhiyun 	__u8 code;
479*4882a593Smuzhiyun 	__u32 message_id;
480*4882a593Smuzhiyun 	__u8 flags;
481*4882a593Smuzhiyun 	__u8 neq_map[3];
482*4882a593Smuzhiyun 	__u8 ned_map;
483*4882a593Smuzhiyun 	__u8 record_selector;
484*4882a593Smuzhiyun } __packed;
485*4882a593Smuzhiyun 
486*4882a593Smuzhiyun struct dasd_psf_cuir_response {
487*4882a593Smuzhiyun 	__u8 order;
488*4882a593Smuzhiyun 	__u8 flags;
489*4882a593Smuzhiyun 	__u8 cc;
490*4882a593Smuzhiyun 	__u8 chpid;
491*4882a593Smuzhiyun 	__u16 device_nr;
492*4882a593Smuzhiyun 	__u16 reserved;
493*4882a593Smuzhiyun 	__u32 message_id;
494*4882a593Smuzhiyun 	__u64 system_id;
495*4882a593Smuzhiyun 	__u8 cssid;
496*4882a593Smuzhiyun 	__u8 ssid;
497*4882a593Smuzhiyun } __packed;
498*4882a593Smuzhiyun 
499*4882a593Smuzhiyun struct dasd_ckd_path_group_entry {
500*4882a593Smuzhiyun 	__u8 status_flags;
501*4882a593Smuzhiyun 	__u8 pgid[11];
502*4882a593Smuzhiyun 	__u8 sysplex_name[8];
503*4882a593Smuzhiyun 	__u32 timestamp;
504*4882a593Smuzhiyun 	__u32 cylinder;
505*4882a593Smuzhiyun 	__u8 reserved[4];
506*4882a593Smuzhiyun } __packed;
507*4882a593Smuzhiyun 
508*4882a593Smuzhiyun struct dasd_ckd_host_information {
509*4882a593Smuzhiyun 	__u8 access_flags;
510*4882a593Smuzhiyun 	__u8 entry_size;
511*4882a593Smuzhiyun 	__u16 entry_count;
512*4882a593Smuzhiyun 	__u8 entry[16390];
513*4882a593Smuzhiyun } __packed;
514*4882a593Smuzhiyun 
515*4882a593Smuzhiyun struct dasd_psf_query_host_access {
516*4882a593Smuzhiyun 	__u8 access_flag;
517*4882a593Smuzhiyun 	__u8 version;
518*4882a593Smuzhiyun 	__u16 CKD_length;
519*4882a593Smuzhiyun 	__u16 SCSI_length;
520*4882a593Smuzhiyun 	__u8 unused[10];
521*4882a593Smuzhiyun 	__u8 host_access_information[16394];
522*4882a593Smuzhiyun } __packed;
523*4882a593Smuzhiyun 
524*4882a593Smuzhiyun /*
525*4882a593Smuzhiyun  * Perform Subsystem Function - Prepare for Read Subsystem Data
526*4882a593Smuzhiyun  */
527*4882a593Smuzhiyun struct dasd_psf_prssd_data {
528*4882a593Smuzhiyun 	unsigned char order;
529*4882a593Smuzhiyun 	unsigned char flags;
530*4882a593Smuzhiyun 	unsigned char reserved1;
531*4882a593Smuzhiyun 	unsigned char reserved2;
532*4882a593Smuzhiyun 	unsigned char lss;
533*4882a593Smuzhiyun 	unsigned char volume;
534*4882a593Smuzhiyun 	unsigned char suborder;
535*4882a593Smuzhiyun 	unsigned char varies[5];
536*4882a593Smuzhiyun } __attribute__ ((packed));
537*4882a593Smuzhiyun 
538*4882a593Smuzhiyun /*
539*4882a593Smuzhiyun  * Perform Subsystem Function - Set Subsystem Characteristics
540*4882a593Smuzhiyun  */
541*4882a593Smuzhiyun struct dasd_psf_ssc_data {
542*4882a593Smuzhiyun 	unsigned char order;
543*4882a593Smuzhiyun 	unsigned char flags;
544*4882a593Smuzhiyun 	unsigned char cu_type[4];
545*4882a593Smuzhiyun 	unsigned char suborder;
546*4882a593Smuzhiyun 	unsigned char reserved[59];
547*4882a593Smuzhiyun } __attribute__((packed));
548*4882a593Smuzhiyun 
549*4882a593Smuzhiyun /* Maximum number of extents for a single Release Allocated Space command */
550*4882a593Smuzhiyun #define DASD_ECKD_RAS_EXTS_MAX		110U
551*4882a593Smuzhiyun 
552*4882a593Smuzhiyun struct dasd_dso_ras_ext_range {
553*4882a593Smuzhiyun 	struct ch_t beg_ext;
554*4882a593Smuzhiyun 	struct ch_t end_ext;
555*4882a593Smuzhiyun } __packed;
556*4882a593Smuzhiyun 
557*4882a593Smuzhiyun /*
558*4882a593Smuzhiyun  * Define Subsytem Operation - Release Allocated Space
559*4882a593Smuzhiyun  */
560*4882a593Smuzhiyun struct dasd_dso_ras_data {
561*4882a593Smuzhiyun 	__u8 order;
562*4882a593Smuzhiyun 	struct {
563*4882a593Smuzhiyun 		__u8 message:1;		/* Must be zero */
564*4882a593Smuzhiyun 		__u8 reserved1:2;
565*4882a593Smuzhiyun 		__u8 vol_type:1;	/* 0 - CKD/FBA, 1 - FB */
566*4882a593Smuzhiyun 		__u8 reserved2:4;
567*4882a593Smuzhiyun 	} __packed flags;
568*4882a593Smuzhiyun 	/* Operation Flags to specify scope */
569*4882a593Smuzhiyun 	struct {
570*4882a593Smuzhiyun 		__u8 reserved1:2;
571*4882a593Smuzhiyun 		/* Release Space by Extent */
572*4882a593Smuzhiyun 		__u8 by_extent:1;	/* 0 - entire volume, 1 - specified extents */
573*4882a593Smuzhiyun 		__u8 guarantee_init:1;
574*4882a593Smuzhiyun 		__u8 force_release:1;	/* Internal - will be ignored */
575*4882a593Smuzhiyun 		__u16 reserved2:11;
576*4882a593Smuzhiyun 	} __packed op_flags;
577*4882a593Smuzhiyun 	__u8 lss;
578*4882a593Smuzhiyun 	__u8 dev_addr;
579*4882a593Smuzhiyun 	__u32 reserved1;
580*4882a593Smuzhiyun 	__u8 reserved2[10];
581*4882a593Smuzhiyun 	__u16 nr_exts;			/* Defines number of ext_scope - max 110 */
582*4882a593Smuzhiyun 	__u16 reserved3;
583*4882a593Smuzhiyun } __packed;
584*4882a593Smuzhiyun 
585*4882a593Smuzhiyun 
586*4882a593Smuzhiyun /*
587*4882a593Smuzhiyun  * some structures and definitions for alias handling
588*4882a593Smuzhiyun  */
589*4882a593Smuzhiyun struct dasd_unit_address_configuration {
590*4882a593Smuzhiyun 	struct {
591*4882a593Smuzhiyun 		char ua_type;
592*4882a593Smuzhiyun 		char base_ua;
593*4882a593Smuzhiyun 	} unit[256];
594*4882a593Smuzhiyun } __attribute__((packed));
595*4882a593Smuzhiyun 
596*4882a593Smuzhiyun 
597*4882a593Smuzhiyun #define MAX_DEVICES_PER_LCU 256
598*4882a593Smuzhiyun 
599*4882a593Smuzhiyun /* flags on the LCU  */
600*4882a593Smuzhiyun #define NEED_UAC_UPDATE  0x01
601*4882a593Smuzhiyun #define UPDATE_PENDING	0x02
602*4882a593Smuzhiyun 
603*4882a593Smuzhiyun enum pavtype {NO_PAV, BASE_PAV, HYPER_PAV};
604*4882a593Smuzhiyun 
605*4882a593Smuzhiyun 
606*4882a593Smuzhiyun struct alias_root {
607*4882a593Smuzhiyun 	struct list_head serverlist;
608*4882a593Smuzhiyun 	spinlock_t lock;
609*4882a593Smuzhiyun };
610*4882a593Smuzhiyun 
611*4882a593Smuzhiyun struct alias_server {
612*4882a593Smuzhiyun 	struct list_head server;
613*4882a593Smuzhiyun 	struct dasd_uid uid;
614*4882a593Smuzhiyun 	struct list_head lculist;
615*4882a593Smuzhiyun };
616*4882a593Smuzhiyun 
617*4882a593Smuzhiyun struct summary_unit_check_work_data {
618*4882a593Smuzhiyun 	char reason;
619*4882a593Smuzhiyun 	struct dasd_device *device;
620*4882a593Smuzhiyun 	struct work_struct worker;
621*4882a593Smuzhiyun };
622*4882a593Smuzhiyun 
623*4882a593Smuzhiyun struct read_uac_work_data {
624*4882a593Smuzhiyun 	struct dasd_device *device;
625*4882a593Smuzhiyun 	struct delayed_work dwork;
626*4882a593Smuzhiyun };
627*4882a593Smuzhiyun 
628*4882a593Smuzhiyun struct alias_lcu {
629*4882a593Smuzhiyun 	struct list_head lcu;
630*4882a593Smuzhiyun 	struct dasd_uid uid;
631*4882a593Smuzhiyun 	enum pavtype pav;
632*4882a593Smuzhiyun 	char flags;
633*4882a593Smuzhiyun 	spinlock_t lock;
634*4882a593Smuzhiyun 	struct list_head grouplist;
635*4882a593Smuzhiyun 	struct list_head active_devices;
636*4882a593Smuzhiyun 	struct list_head inactive_devices;
637*4882a593Smuzhiyun 	struct dasd_unit_address_configuration *uac;
638*4882a593Smuzhiyun 	struct summary_unit_check_work_data suc_data;
639*4882a593Smuzhiyun 	struct read_uac_work_data ruac_data;
640*4882a593Smuzhiyun 	struct dasd_ccw_req *rsu_cqr;
641*4882a593Smuzhiyun 	struct completion lcu_setup;
642*4882a593Smuzhiyun };
643*4882a593Smuzhiyun 
644*4882a593Smuzhiyun struct alias_pav_group {
645*4882a593Smuzhiyun 	struct list_head group;
646*4882a593Smuzhiyun 	struct dasd_uid uid;
647*4882a593Smuzhiyun 	struct alias_lcu *lcu;
648*4882a593Smuzhiyun 	struct list_head baselist;
649*4882a593Smuzhiyun 	struct list_head aliaslist;
650*4882a593Smuzhiyun 	struct dasd_device *next;
651*4882a593Smuzhiyun };
652*4882a593Smuzhiyun 
653*4882a593Smuzhiyun struct dasd_conf_data {
654*4882a593Smuzhiyun 	struct dasd_ned neds[5];
655*4882a593Smuzhiyun 	u8 reserved[64];
656*4882a593Smuzhiyun 	struct dasd_gneq gneq;
657*4882a593Smuzhiyun } __packed;
658*4882a593Smuzhiyun 
659*4882a593Smuzhiyun struct dasd_eckd_private {
660*4882a593Smuzhiyun 	struct dasd_eckd_characteristics rdc_data;
661*4882a593Smuzhiyun 	u8 *conf_data;
662*4882a593Smuzhiyun 	int conf_len;
663*4882a593Smuzhiyun 
664*4882a593Smuzhiyun 	/* pointers to specific parts in the conf_data */
665*4882a593Smuzhiyun 	struct dasd_ned *ned;
666*4882a593Smuzhiyun 	struct dasd_sneq *sneq;
667*4882a593Smuzhiyun 	struct vd_sneq *vdsneq;
668*4882a593Smuzhiyun 	struct dasd_gneq *gneq;
669*4882a593Smuzhiyun 
670*4882a593Smuzhiyun 	struct eckd_count count_area[5];
671*4882a593Smuzhiyun 	int init_cqr_status;
672*4882a593Smuzhiyun 	int uses_cdl;
673*4882a593Smuzhiyun 	struct attrib_data_t attrib;	/* e.g. cache operations */
674*4882a593Smuzhiyun 	struct dasd_rssd_features features;
675*4882a593Smuzhiyun 	struct dasd_rssd_vsq vsq;
676*4882a593Smuzhiyun 	struct dasd_ext_pool_sum eps;
677*4882a593Smuzhiyun 	u32 real_cyl;
678*4882a593Smuzhiyun 
679*4882a593Smuzhiyun 	/* alias managemnet */
680*4882a593Smuzhiyun 	struct dasd_uid uid;
681*4882a593Smuzhiyun 	struct alias_pav_group *pavgroup;
682*4882a593Smuzhiyun 	struct alias_lcu *lcu;
683*4882a593Smuzhiyun 	int count;
684*4882a593Smuzhiyun 
685*4882a593Smuzhiyun 	u32 fcx_max_data;
686*4882a593Smuzhiyun 	char suc_reason;
687*4882a593Smuzhiyun };
688*4882a593Smuzhiyun 
689*4882a593Smuzhiyun 
690*4882a593Smuzhiyun 
691*4882a593Smuzhiyun int dasd_alias_make_device_known_to_lcu(struct dasd_device *);
692*4882a593Smuzhiyun void dasd_alias_disconnect_device_from_lcu(struct dasd_device *);
693*4882a593Smuzhiyun int dasd_alias_add_device(struct dasd_device *);
694*4882a593Smuzhiyun int dasd_alias_remove_device(struct dasd_device *);
695*4882a593Smuzhiyun struct dasd_device *dasd_alias_get_start_dev(struct dasd_device *);
696*4882a593Smuzhiyun void dasd_alias_handle_summary_unit_check(struct work_struct *);
697*4882a593Smuzhiyun void dasd_eckd_reset_ccw_to_base_io(struct dasd_ccw_req *);
698*4882a593Smuzhiyun int dasd_alias_update_add_device(struct dasd_device *);
699*4882a593Smuzhiyun #endif				/* DASD_ECKD_H */
700