xref: /openbmc/linux/drivers/s390/block/dasd_eckd.c (revision 09a4f6f5)
1 // SPDX-License-Identifier: GPL-2.0
2 /*
3  * Author(s)......: Holger Smolinski <Holger.Smolinski@de.ibm.com>
4  *		    Horst Hummel <Horst.Hummel@de.ibm.com>
5  *		    Carsten Otte <Cotte@de.ibm.com>
6  *		    Martin Schwidefsky <schwidefsky@de.ibm.com>
7  * Bugreports.to..: <Linux390@de.ibm.com>
8  * Copyright IBM Corp. 1999, 2009
9  * EMC Symmetrix ioctl Copyright EMC Corporation, 2008
10  * Author.........: Nigel Hislop <hislop_nigel@emc.com>
11  */
12 
13 #define KMSG_COMPONENT "dasd-eckd"
14 
15 #include <linux/stddef.h>
16 #include <linux/kernel.h>
17 #include <linux/slab.h>
18 #include <linux/hdreg.h>	/* HDIO_GETGEO			    */
19 #include <linux/bio.h>
20 #include <linux/module.h>
21 #include <linux/compat.h>
22 #include <linux/init.h>
23 #include <linux/seq_file.h>
24 
25 #include <asm/css_chars.h>
26 #include <asm/debug.h>
27 #include <asm/idals.h>
28 #include <asm/ebcdic.h>
29 #include <asm/io.h>
30 #include <linux/uaccess.h>
31 #include <asm/cio.h>
32 #include <asm/ccwdev.h>
33 #include <asm/itcw.h>
34 #include <asm/schid.h>
35 #include <asm/chpid.h>
36 
37 #include "dasd_int.h"
38 #include "dasd_eckd.h"
39 
40 #ifdef PRINTK_HEADER
41 #undef PRINTK_HEADER
42 #endif				/* PRINTK_HEADER */
43 #define PRINTK_HEADER "dasd(eckd):"
44 
45 /*
46  * raw track access always map to 64k in memory
47  * so it maps to 16 blocks of 4k per track
48  */
49 #define DASD_RAW_BLOCK_PER_TRACK 16
50 #define DASD_RAW_BLOCKSIZE 4096
51 /* 64k are 128 x 512 byte sectors  */
52 #define DASD_RAW_SECTORS_PER_TRACK 128
53 
54 MODULE_LICENSE("GPL");
55 
56 static struct dasd_discipline dasd_eckd_discipline;
57 
58 /* The ccw bus type uses this table to find devices that it sends to
59  * dasd_eckd_probe */
60 static struct ccw_device_id dasd_eckd_ids[] = {
61 	{ CCW_DEVICE_DEVTYPE (0x3990, 0, 0x3390, 0), .driver_info = 0x1},
62 	{ CCW_DEVICE_DEVTYPE (0x2105, 0, 0x3390, 0), .driver_info = 0x2},
63 	{ CCW_DEVICE_DEVTYPE (0x3880, 0, 0x3380, 0), .driver_info = 0x3},
64 	{ CCW_DEVICE_DEVTYPE (0x3990, 0, 0x3380, 0), .driver_info = 0x4},
65 	{ CCW_DEVICE_DEVTYPE (0x2105, 0, 0x3380, 0), .driver_info = 0x5},
66 	{ CCW_DEVICE_DEVTYPE (0x9343, 0, 0x9345, 0), .driver_info = 0x6},
67 	{ CCW_DEVICE_DEVTYPE (0x2107, 0, 0x3390, 0), .driver_info = 0x7},
68 	{ CCW_DEVICE_DEVTYPE (0x2107, 0, 0x3380, 0), .driver_info = 0x8},
69 	{ CCW_DEVICE_DEVTYPE (0x1750, 0, 0x3390, 0), .driver_info = 0x9},
70 	{ CCW_DEVICE_DEVTYPE (0x1750, 0, 0x3380, 0), .driver_info = 0xa},
71 	{ /* end of list */ },
72 };
73 
74 MODULE_DEVICE_TABLE(ccw, dasd_eckd_ids);
75 
76 static struct ccw_driver dasd_eckd_driver; /* see below */
77 
78 static void *rawpadpage;
79 
80 #define INIT_CQR_OK 0
81 #define INIT_CQR_UNFORMATTED 1
82 #define INIT_CQR_ERROR 2
83 
84 /* emergency request for reserve/release */
85 static struct {
86 	struct dasd_ccw_req cqr;
87 	struct ccw1 ccw;
88 	char data[32];
89 } *dasd_reserve_req;
90 static DEFINE_MUTEX(dasd_reserve_mutex);
91 
92 static struct {
93 	struct dasd_ccw_req cqr;
94 	struct ccw1 ccw[2];
95 	char data[40];
96 } *dasd_vol_info_req;
97 static DEFINE_MUTEX(dasd_vol_info_mutex);
98 
99 struct ext_pool_exhaust_work_data {
100 	struct work_struct worker;
101 	struct dasd_device *device;
102 	struct dasd_device *base;
103 };
104 
105 /* definitions for the path verification worker */
106 struct pe_handler_work_data {
107 	struct work_struct worker;
108 	struct dasd_device *device;
109 	struct dasd_ccw_req cqr;
110 	struct ccw1 ccw;
111 	__u8 rcd_buffer[DASD_ECKD_RCD_DATA_SIZE];
112 	int isglobal;
113 	__u8 tbvpm;
114 	__u8 fcsecpm;
115 };
116 static struct pe_handler_work_data *pe_handler_worker;
117 static DEFINE_MUTEX(dasd_pe_handler_mutex);
118 
119 struct check_attention_work_data {
120 	struct work_struct worker;
121 	struct dasd_device *device;
122 	__u8 lpum;
123 };
124 
125 static int dasd_eckd_ext_pool_id(struct dasd_device *);
126 static int prepare_itcw(struct itcw *, unsigned int, unsigned int, int,
127 			struct dasd_device *, struct dasd_device *,
128 			unsigned int, int, unsigned int, unsigned int,
129 			unsigned int, unsigned int);
130 
131 /* initial attempt at a probe function. this can be simplified once
132  * the other detection code is gone */
133 static int
134 dasd_eckd_probe (struct ccw_device *cdev)
135 {
136 	int ret;
137 
138 	/* set ECKD specific ccw-device options */
139 	ret = ccw_device_set_options(cdev, CCWDEV_ALLOW_FORCE |
140 				     CCWDEV_DO_PATHGROUP | CCWDEV_DO_MULTIPATH);
141 	if (ret) {
142 		DBF_EVENT_DEVID(DBF_WARNING, cdev, "%s",
143 				"dasd_eckd_probe: could not set "
144 				"ccw-device options");
145 		return ret;
146 	}
147 	ret = dasd_generic_probe(cdev);
148 	return ret;
149 }
150 
151 static int
152 dasd_eckd_set_online(struct ccw_device *cdev)
153 {
154 	return dasd_generic_set_online(cdev, &dasd_eckd_discipline);
155 }
156 
157 static const int sizes_trk0[] = { 28, 148, 84 };
158 #define LABEL_SIZE 140
159 
160 /* head and record addresses of count_area read in analysis ccw */
161 static const int count_area_head[] = { 0, 0, 0, 0, 1 };
162 static const int count_area_rec[] = { 1, 2, 3, 4, 1 };
163 
164 static inline unsigned int
165 ceil_quot(unsigned int d1, unsigned int d2)
166 {
167 	return (d1 + (d2 - 1)) / d2;
168 }
169 
170 static unsigned int
171 recs_per_track(struct dasd_eckd_characteristics * rdc,
172 	       unsigned int kl, unsigned int dl)
173 {
174 	int dn, kn;
175 
176 	switch (rdc->dev_type) {
177 	case 0x3380:
178 		if (kl)
179 			return 1499 / (15 + 7 + ceil_quot(kl + 12, 32) +
180 				       ceil_quot(dl + 12, 32));
181 		else
182 			return 1499 / (15 + ceil_quot(dl + 12, 32));
183 	case 0x3390:
184 		dn = ceil_quot(dl + 6, 232) + 1;
185 		if (kl) {
186 			kn = ceil_quot(kl + 6, 232) + 1;
187 			return 1729 / (10 + 9 + ceil_quot(kl + 6 * kn, 34) +
188 				       9 + ceil_quot(dl + 6 * dn, 34));
189 		} else
190 			return 1729 / (10 + 9 + ceil_quot(dl + 6 * dn, 34));
191 	case 0x9345:
192 		dn = ceil_quot(dl + 6, 232) + 1;
193 		if (kl) {
194 			kn = ceil_quot(kl + 6, 232) + 1;
195 			return 1420 / (18 + 7 + ceil_quot(kl + 6 * kn, 34) +
196 				       ceil_quot(dl + 6 * dn, 34));
197 		} else
198 			return 1420 / (18 + 7 + ceil_quot(dl + 6 * dn, 34));
199 	}
200 	return 0;
201 }
202 
203 static void set_ch_t(struct ch_t *geo, __u32 cyl, __u8 head)
204 {
205 	geo->cyl = (__u16) cyl;
206 	geo->head = cyl >> 16;
207 	geo->head <<= 4;
208 	geo->head |= head;
209 }
210 
211 /*
212  * calculate failing track from sense data depending if
213  * it is an EAV device or not
214  */
215 static int dasd_eckd_track_from_irb(struct irb *irb, struct dasd_device *device,
216 				    sector_t *track)
217 {
218 	struct dasd_eckd_private *private = device->private;
219 	u8 *sense = NULL;
220 	u32 cyl;
221 	u8 head;
222 
223 	sense = dasd_get_sense(irb);
224 	if (!sense) {
225 		DBF_DEV_EVENT(DBF_WARNING, device, "%s",
226 			      "ESE error no sense data\n");
227 		return -EINVAL;
228 	}
229 	if (!(sense[27] & DASD_SENSE_BIT_2)) {
230 		DBF_DEV_EVENT(DBF_WARNING, device, "%s",
231 			      "ESE error no valid track data\n");
232 		return -EINVAL;
233 	}
234 
235 	if (sense[27] & DASD_SENSE_BIT_3) {
236 		/* enhanced addressing */
237 		cyl = sense[30] << 20;
238 		cyl |= (sense[31] & 0xF0) << 12;
239 		cyl |= sense[28] << 8;
240 		cyl |= sense[29];
241 	} else {
242 		cyl = sense[29] << 8;
243 		cyl |= sense[30];
244 	}
245 	head = sense[31] & 0x0F;
246 	*track = cyl * private->rdc_data.trk_per_cyl + head;
247 	return 0;
248 }
249 
250 static int set_timestamp(struct ccw1 *ccw, struct DE_eckd_data *data,
251 		     struct dasd_device *device)
252 {
253 	struct dasd_eckd_private *private = device->private;
254 	int rc;
255 
256 	rc = get_phys_clock(&data->ep_sys_time);
257 	/*
258 	 * Ignore return code if XRC is not supported or
259 	 * sync clock is switched off
260 	 */
261 	if ((rc && !private->rdc_data.facilities.XRC_supported) ||
262 	    rc == -EOPNOTSUPP || rc == -EACCES)
263 		return 0;
264 
265 	/* switch on System Time Stamp - needed for XRC Support */
266 	data->ga_extended |= 0x08; /* switch on 'Time Stamp Valid'   */
267 	data->ga_extended |= 0x02; /* switch on 'Extended Parameter' */
268 
269 	if (ccw) {
270 		ccw->count = sizeof(struct DE_eckd_data);
271 		ccw->flags |= CCW_FLAG_SLI;
272 	}
273 
274 	return rc;
275 }
276 
277 static int
278 define_extent(struct ccw1 *ccw, struct DE_eckd_data *data, unsigned int trk,
279 	      unsigned int totrk, int cmd, struct dasd_device *device,
280 	      int blksize)
281 {
282 	struct dasd_eckd_private *private = device->private;
283 	u16 heads, beghead, endhead;
284 	u32 begcyl, endcyl;
285 	int rc = 0;
286 
287 	if (ccw) {
288 		ccw->cmd_code = DASD_ECKD_CCW_DEFINE_EXTENT;
289 		ccw->flags = 0;
290 		ccw->count = 16;
291 		ccw->cda = (__u32)__pa(data);
292 	}
293 
294 	memset(data, 0, sizeof(struct DE_eckd_data));
295 	switch (cmd) {
296 	case DASD_ECKD_CCW_READ_HOME_ADDRESS:
297 	case DASD_ECKD_CCW_READ_RECORD_ZERO:
298 	case DASD_ECKD_CCW_READ:
299 	case DASD_ECKD_CCW_READ_MT:
300 	case DASD_ECKD_CCW_READ_CKD:
301 	case DASD_ECKD_CCW_READ_CKD_MT:
302 	case DASD_ECKD_CCW_READ_KD:
303 	case DASD_ECKD_CCW_READ_KD_MT:
304 		data->mask.perm = 0x1;
305 		data->attributes.operation = private->attrib.operation;
306 		break;
307 	case DASD_ECKD_CCW_READ_COUNT:
308 		data->mask.perm = 0x1;
309 		data->attributes.operation = DASD_BYPASS_CACHE;
310 		break;
311 	case DASD_ECKD_CCW_READ_TRACK:
312 	case DASD_ECKD_CCW_READ_TRACK_DATA:
313 		data->mask.perm = 0x1;
314 		data->attributes.operation = private->attrib.operation;
315 		data->blk_size = 0;
316 		break;
317 	case DASD_ECKD_CCW_WRITE:
318 	case DASD_ECKD_CCW_WRITE_MT:
319 	case DASD_ECKD_CCW_WRITE_KD:
320 	case DASD_ECKD_CCW_WRITE_KD_MT:
321 		data->mask.perm = 0x02;
322 		data->attributes.operation = private->attrib.operation;
323 		rc = set_timestamp(ccw, data, device);
324 		break;
325 	case DASD_ECKD_CCW_WRITE_CKD:
326 	case DASD_ECKD_CCW_WRITE_CKD_MT:
327 		data->attributes.operation = DASD_BYPASS_CACHE;
328 		rc = set_timestamp(ccw, data, device);
329 		break;
330 	case DASD_ECKD_CCW_ERASE:
331 	case DASD_ECKD_CCW_WRITE_HOME_ADDRESS:
332 	case DASD_ECKD_CCW_WRITE_RECORD_ZERO:
333 		data->mask.perm = 0x3;
334 		data->mask.auth = 0x1;
335 		data->attributes.operation = DASD_BYPASS_CACHE;
336 		rc = set_timestamp(ccw, data, device);
337 		break;
338 	case DASD_ECKD_CCW_WRITE_FULL_TRACK:
339 		data->mask.perm = 0x03;
340 		data->attributes.operation = private->attrib.operation;
341 		data->blk_size = 0;
342 		break;
343 	case DASD_ECKD_CCW_WRITE_TRACK_DATA:
344 		data->mask.perm = 0x02;
345 		data->attributes.operation = private->attrib.operation;
346 		data->blk_size = blksize;
347 		rc = set_timestamp(ccw, data, device);
348 		break;
349 	default:
350 		dev_err(&device->cdev->dev,
351 			"0x%x is not a known command\n", cmd);
352 		break;
353 	}
354 
355 	data->attributes.mode = 0x3;	/* ECKD */
356 
357 	if ((private->rdc_data.cu_type == 0x2105 ||
358 	     private->rdc_data.cu_type == 0x2107 ||
359 	     private->rdc_data.cu_type == 0x1750)
360 	    && !(private->uses_cdl && trk < 2))
361 		data->ga_extended |= 0x40; /* Regular Data Format Mode */
362 
363 	heads = private->rdc_data.trk_per_cyl;
364 	begcyl = trk / heads;
365 	beghead = trk % heads;
366 	endcyl = totrk / heads;
367 	endhead = totrk % heads;
368 
369 	/* check for sequential prestage - enhance cylinder range */
370 	if (data->attributes.operation == DASD_SEQ_PRESTAGE ||
371 	    data->attributes.operation == DASD_SEQ_ACCESS) {
372 
373 		if (endcyl + private->attrib.nr_cyl < private->real_cyl)
374 			endcyl += private->attrib.nr_cyl;
375 		else
376 			endcyl = (private->real_cyl - 1);
377 	}
378 
379 	set_ch_t(&data->beg_ext, begcyl, beghead);
380 	set_ch_t(&data->end_ext, endcyl, endhead);
381 	return rc;
382 }
383 
384 
385 static void locate_record_ext(struct ccw1 *ccw, struct LRE_eckd_data *data,
386 			      unsigned int trk, unsigned int rec_on_trk,
387 			      int count, int cmd, struct dasd_device *device,
388 			      unsigned int reclen, unsigned int tlf)
389 {
390 	struct dasd_eckd_private *private = device->private;
391 	int sector;
392 	int dn, d;
393 
394 	if (ccw) {
395 		ccw->cmd_code = DASD_ECKD_CCW_LOCATE_RECORD_EXT;
396 		ccw->flags = 0;
397 		if (cmd == DASD_ECKD_CCW_WRITE_FULL_TRACK)
398 			ccw->count = 22;
399 		else
400 			ccw->count = 20;
401 		ccw->cda = (__u32)__pa(data);
402 	}
403 
404 	memset(data, 0, sizeof(*data));
405 	sector = 0;
406 	if (rec_on_trk) {
407 		switch (private->rdc_data.dev_type) {
408 		case 0x3390:
409 			dn = ceil_quot(reclen + 6, 232);
410 			d = 9 + ceil_quot(reclen + 6 * (dn + 1), 34);
411 			sector = (49 + (rec_on_trk - 1) * (10 + d)) / 8;
412 			break;
413 		case 0x3380:
414 			d = 7 + ceil_quot(reclen + 12, 32);
415 			sector = (39 + (rec_on_trk - 1) * (8 + d)) / 7;
416 			break;
417 		}
418 	}
419 	data->sector = sector;
420 	/* note: meaning of count depends on the operation
421 	 *	 for record based I/O it's the number of records, but for
422 	 *	 track based I/O it's the number of tracks
423 	 */
424 	data->count = count;
425 	switch (cmd) {
426 	case DASD_ECKD_CCW_WRITE_HOME_ADDRESS:
427 		data->operation.orientation = 0x3;
428 		data->operation.operation = 0x03;
429 		break;
430 	case DASD_ECKD_CCW_READ_HOME_ADDRESS:
431 		data->operation.orientation = 0x3;
432 		data->operation.operation = 0x16;
433 		break;
434 	case DASD_ECKD_CCW_WRITE_RECORD_ZERO:
435 		data->operation.orientation = 0x1;
436 		data->operation.operation = 0x03;
437 		data->count++;
438 		break;
439 	case DASD_ECKD_CCW_READ_RECORD_ZERO:
440 		data->operation.orientation = 0x3;
441 		data->operation.operation = 0x16;
442 		data->count++;
443 		break;
444 	case DASD_ECKD_CCW_WRITE:
445 	case DASD_ECKD_CCW_WRITE_MT:
446 	case DASD_ECKD_CCW_WRITE_KD:
447 	case DASD_ECKD_CCW_WRITE_KD_MT:
448 		data->auxiliary.length_valid = 0x1;
449 		data->length = reclen;
450 		data->operation.operation = 0x01;
451 		break;
452 	case DASD_ECKD_CCW_WRITE_CKD:
453 	case DASD_ECKD_CCW_WRITE_CKD_MT:
454 		data->auxiliary.length_valid = 0x1;
455 		data->length = reclen;
456 		data->operation.operation = 0x03;
457 		break;
458 	case DASD_ECKD_CCW_WRITE_FULL_TRACK:
459 		data->operation.orientation = 0x0;
460 		data->operation.operation = 0x3F;
461 		data->extended_operation = 0x11;
462 		data->length = 0;
463 		data->extended_parameter_length = 0x02;
464 		if (data->count > 8) {
465 			data->extended_parameter[0] = 0xFF;
466 			data->extended_parameter[1] = 0xFF;
467 			data->extended_parameter[1] <<= (16 - count);
468 		} else {
469 			data->extended_parameter[0] = 0xFF;
470 			data->extended_parameter[0] <<= (8 - count);
471 			data->extended_parameter[1] = 0x00;
472 		}
473 		data->sector = 0xFF;
474 		break;
475 	case DASD_ECKD_CCW_WRITE_TRACK_DATA:
476 		data->auxiliary.length_valid = 0x1;
477 		data->length = reclen;	/* not tlf, as one might think */
478 		data->operation.operation = 0x3F;
479 		data->extended_operation = 0x23;
480 		break;
481 	case DASD_ECKD_CCW_READ:
482 	case DASD_ECKD_CCW_READ_MT:
483 	case DASD_ECKD_CCW_READ_KD:
484 	case DASD_ECKD_CCW_READ_KD_MT:
485 		data->auxiliary.length_valid = 0x1;
486 		data->length = reclen;
487 		data->operation.operation = 0x06;
488 		break;
489 	case DASD_ECKD_CCW_READ_CKD:
490 	case DASD_ECKD_CCW_READ_CKD_MT:
491 		data->auxiliary.length_valid = 0x1;
492 		data->length = reclen;
493 		data->operation.operation = 0x16;
494 		break;
495 	case DASD_ECKD_CCW_READ_COUNT:
496 		data->operation.operation = 0x06;
497 		break;
498 	case DASD_ECKD_CCW_READ_TRACK:
499 		data->operation.orientation = 0x1;
500 		data->operation.operation = 0x0C;
501 		data->extended_parameter_length = 0;
502 		data->sector = 0xFF;
503 		break;
504 	case DASD_ECKD_CCW_READ_TRACK_DATA:
505 		data->auxiliary.length_valid = 0x1;
506 		data->length = tlf;
507 		data->operation.operation = 0x0C;
508 		break;
509 	case DASD_ECKD_CCW_ERASE:
510 		data->length = reclen;
511 		data->auxiliary.length_valid = 0x1;
512 		data->operation.operation = 0x0b;
513 		break;
514 	default:
515 		DBF_DEV_EVENT(DBF_ERR, device,
516 			    "fill LRE unknown opcode 0x%x", cmd);
517 		BUG();
518 	}
519 	set_ch_t(&data->seek_addr,
520 		 trk / private->rdc_data.trk_per_cyl,
521 		 trk % private->rdc_data.trk_per_cyl);
522 	data->search_arg.cyl = data->seek_addr.cyl;
523 	data->search_arg.head = data->seek_addr.head;
524 	data->search_arg.record = rec_on_trk;
525 }
526 
527 static int prefix_LRE(struct ccw1 *ccw, struct PFX_eckd_data *pfxdata,
528 		      unsigned int trk, unsigned int totrk, int cmd,
529 		      struct dasd_device *basedev, struct dasd_device *startdev,
530 		      unsigned int format, unsigned int rec_on_trk, int count,
531 		      unsigned int blksize, unsigned int tlf)
532 {
533 	struct dasd_eckd_private *basepriv, *startpriv;
534 	struct LRE_eckd_data *lredata;
535 	struct DE_eckd_data *dedata;
536 	int rc = 0;
537 
538 	basepriv = basedev->private;
539 	startpriv = startdev->private;
540 	dedata = &pfxdata->define_extent;
541 	lredata = &pfxdata->locate_record;
542 
543 	ccw->cmd_code = DASD_ECKD_CCW_PFX;
544 	ccw->flags = 0;
545 	if (cmd == DASD_ECKD_CCW_WRITE_FULL_TRACK) {
546 		ccw->count = sizeof(*pfxdata) + 2;
547 		ccw->cda = (__u32) __pa(pfxdata);
548 		memset(pfxdata, 0, sizeof(*pfxdata) + 2);
549 	} else {
550 		ccw->count = sizeof(*pfxdata);
551 		ccw->cda = (__u32) __pa(pfxdata);
552 		memset(pfxdata, 0, sizeof(*pfxdata));
553 	}
554 
555 	/* prefix data */
556 	if (format > 1) {
557 		DBF_DEV_EVENT(DBF_ERR, basedev,
558 			      "PFX LRE unknown format 0x%x", format);
559 		BUG();
560 		return -EINVAL;
561 	}
562 	pfxdata->format = format;
563 	pfxdata->base_address = basepriv->ned->unit_addr;
564 	pfxdata->base_lss = basepriv->ned->ID;
565 	pfxdata->validity.define_extent = 1;
566 
567 	/* private uid is kept up to date, conf_data may be outdated */
568 	if (startpriv->uid.type == UA_BASE_PAV_ALIAS)
569 		pfxdata->validity.verify_base = 1;
570 
571 	if (startpriv->uid.type == UA_HYPER_PAV_ALIAS) {
572 		pfxdata->validity.verify_base = 1;
573 		pfxdata->validity.hyper_pav = 1;
574 	}
575 
576 	rc = define_extent(NULL, dedata, trk, totrk, cmd, basedev, blksize);
577 
578 	/*
579 	 * For some commands the System Time Stamp is set in the define extent
580 	 * data when XRC is supported. The validity of the time stamp must be
581 	 * reflected in the prefix data as well.
582 	 */
583 	if (dedata->ga_extended & 0x08 && dedata->ga_extended & 0x02)
584 		pfxdata->validity.time_stamp = 1; /* 'Time Stamp Valid'   */
585 
586 	if (format == 1) {
587 		locate_record_ext(NULL, lredata, trk, rec_on_trk, count, cmd,
588 				  basedev, blksize, tlf);
589 	}
590 
591 	return rc;
592 }
593 
594 static int prefix(struct ccw1 *ccw, struct PFX_eckd_data *pfxdata,
595 		  unsigned int trk, unsigned int totrk, int cmd,
596 		  struct dasd_device *basedev, struct dasd_device *startdev)
597 {
598 	return prefix_LRE(ccw, pfxdata, trk, totrk, cmd, basedev, startdev,
599 			  0, 0, 0, 0, 0);
600 }
601 
602 static void
603 locate_record(struct ccw1 *ccw, struct LO_eckd_data *data, unsigned int trk,
604 	      unsigned int rec_on_trk, int no_rec, int cmd,
605 	      struct dasd_device * device, int reclen)
606 {
607 	struct dasd_eckd_private *private = device->private;
608 	int sector;
609 	int dn, d;
610 
611 	DBF_DEV_EVENT(DBF_INFO, device,
612 		  "Locate: trk %d, rec %d, no_rec %d, cmd %d, reclen %d",
613 		  trk, rec_on_trk, no_rec, cmd, reclen);
614 
615 	ccw->cmd_code = DASD_ECKD_CCW_LOCATE_RECORD;
616 	ccw->flags = 0;
617 	ccw->count = 16;
618 	ccw->cda = (__u32) __pa(data);
619 
620 	memset(data, 0, sizeof(struct LO_eckd_data));
621 	sector = 0;
622 	if (rec_on_trk) {
623 		switch (private->rdc_data.dev_type) {
624 		case 0x3390:
625 			dn = ceil_quot(reclen + 6, 232);
626 			d = 9 + ceil_quot(reclen + 6 * (dn + 1), 34);
627 			sector = (49 + (rec_on_trk - 1) * (10 + d)) / 8;
628 			break;
629 		case 0x3380:
630 			d = 7 + ceil_quot(reclen + 12, 32);
631 			sector = (39 + (rec_on_trk - 1) * (8 + d)) / 7;
632 			break;
633 		}
634 	}
635 	data->sector = sector;
636 	data->count = no_rec;
637 	switch (cmd) {
638 	case DASD_ECKD_CCW_WRITE_HOME_ADDRESS:
639 		data->operation.orientation = 0x3;
640 		data->operation.operation = 0x03;
641 		break;
642 	case DASD_ECKD_CCW_READ_HOME_ADDRESS:
643 		data->operation.orientation = 0x3;
644 		data->operation.operation = 0x16;
645 		break;
646 	case DASD_ECKD_CCW_WRITE_RECORD_ZERO:
647 		data->operation.orientation = 0x1;
648 		data->operation.operation = 0x03;
649 		data->count++;
650 		break;
651 	case DASD_ECKD_CCW_READ_RECORD_ZERO:
652 		data->operation.orientation = 0x3;
653 		data->operation.operation = 0x16;
654 		data->count++;
655 		break;
656 	case DASD_ECKD_CCW_WRITE:
657 	case DASD_ECKD_CCW_WRITE_MT:
658 	case DASD_ECKD_CCW_WRITE_KD:
659 	case DASD_ECKD_CCW_WRITE_KD_MT:
660 		data->auxiliary.last_bytes_used = 0x1;
661 		data->length = reclen;
662 		data->operation.operation = 0x01;
663 		break;
664 	case DASD_ECKD_CCW_WRITE_CKD:
665 	case DASD_ECKD_CCW_WRITE_CKD_MT:
666 		data->auxiliary.last_bytes_used = 0x1;
667 		data->length = reclen;
668 		data->operation.operation = 0x03;
669 		break;
670 	case DASD_ECKD_CCW_READ:
671 	case DASD_ECKD_CCW_READ_MT:
672 	case DASD_ECKD_CCW_READ_KD:
673 	case DASD_ECKD_CCW_READ_KD_MT:
674 		data->auxiliary.last_bytes_used = 0x1;
675 		data->length = reclen;
676 		data->operation.operation = 0x06;
677 		break;
678 	case DASD_ECKD_CCW_READ_CKD:
679 	case DASD_ECKD_CCW_READ_CKD_MT:
680 		data->auxiliary.last_bytes_used = 0x1;
681 		data->length = reclen;
682 		data->operation.operation = 0x16;
683 		break;
684 	case DASD_ECKD_CCW_READ_COUNT:
685 		data->operation.operation = 0x06;
686 		break;
687 	case DASD_ECKD_CCW_ERASE:
688 		data->length = reclen;
689 		data->auxiliary.last_bytes_used = 0x1;
690 		data->operation.operation = 0x0b;
691 		break;
692 	default:
693 		DBF_DEV_EVENT(DBF_ERR, device, "unknown locate record "
694 			      "opcode 0x%x", cmd);
695 	}
696 	set_ch_t(&data->seek_addr,
697 		 trk / private->rdc_data.trk_per_cyl,
698 		 trk % private->rdc_data.trk_per_cyl);
699 	data->search_arg.cyl = data->seek_addr.cyl;
700 	data->search_arg.head = data->seek_addr.head;
701 	data->search_arg.record = rec_on_trk;
702 }
703 
704 /*
705  * Returns 1 if the block is one of the special blocks that needs
706  * to get read/written with the KD variant of the command.
707  * That is DASD_ECKD_READ_KD_MT instead of DASD_ECKD_READ_MT and
708  * DASD_ECKD_WRITE_KD_MT instead of DASD_ECKD_WRITE_MT.
709  * Luckily the KD variants differ only by one bit (0x08) from the
710  * normal variant. So don't wonder about code like:
711  * if (dasd_eckd_cdl_special(blk_per_trk, recid))
712  *         ccw->cmd_code |= 0x8;
713  */
714 static inline int
715 dasd_eckd_cdl_special(int blk_per_trk, int recid)
716 {
717 	if (recid < 3)
718 		return 1;
719 	if (recid < blk_per_trk)
720 		return 0;
721 	if (recid < 2 * blk_per_trk)
722 		return 1;
723 	return 0;
724 }
725 
726 /*
727  * Returns the record size for the special blocks of the cdl format.
728  * Only returns something useful if dasd_eckd_cdl_special is true
729  * for the recid.
730  */
731 static inline int
732 dasd_eckd_cdl_reclen(int recid)
733 {
734 	if (recid < 3)
735 		return sizes_trk0[recid];
736 	return LABEL_SIZE;
737 }
738 /* create unique id from private structure. */
739 static void create_uid(struct dasd_eckd_private *private)
740 {
741 	int count;
742 	struct dasd_uid *uid;
743 
744 	uid = &private->uid;
745 	memset(uid, 0, sizeof(struct dasd_uid));
746 	memcpy(uid->vendor, private->ned->HDA_manufacturer,
747 	       sizeof(uid->vendor) - 1);
748 	EBCASC(uid->vendor, sizeof(uid->vendor) - 1);
749 	memcpy(uid->serial, private->ned->HDA_location,
750 	       sizeof(uid->serial) - 1);
751 	EBCASC(uid->serial, sizeof(uid->serial) - 1);
752 	uid->ssid = private->gneq->subsystemID;
753 	uid->real_unit_addr = private->ned->unit_addr;
754 	if (private->sneq) {
755 		uid->type = private->sneq->sua_flags;
756 		if (uid->type == UA_BASE_PAV_ALIAS)
757 			uid->base_unit_addr = private->sneq->base_unit_addr;
758 	} else {
759 		uid->type = UA_BASE_DEVICE;
760 	}
761 	if (private->vdsneq) {
762 		for (count = 0; count < 16; count++) {
763 			sprintf(uid->vduit+2*count, "%02x",
764 				private->vdsneq->uit[count]);
765 		}
766 	}
767 }
768 
769 /*
770  * Generate device unique id that specifies the physical device.
771  */
772 static int dasd_eckd_generate_uid(struct dasd_device *device)
773 {
774 	struct dasd_eckd_private *private = device->private;
775 	unsigned long flags;
776 
777 	if (!private)
778 		return -ENODEV;
779 	if (!private->ned || !private->gneq)
780 		return -ENODEV;
781 	spin_lock_irqsave(get_ccwdev_lock(device->cdev), flags);
782 	create_uid(private);
783 	spin_unlock_irqrestore(get_ccwdev_lock(device->cdev), flags);
784 	return 0;
785 }
786 
787 static int dasd_eckd_get_uid(struct dasd_device *device, struct dasd_uid *uid)
788 {
789 	struct dasd_eckd_private *private = device->private;
790 	unsigned long flags;
791 
792 	if (private) {
793 		spin_lock_irqsave(get_ccwdev_lock(device->cdev), flags);
794 		*uid = private->uid;
795 		spin_unlock_irqrestore(get_ccwdev_lock(device->cdev), flags);
796 		return 0;
797 	}
798 	return -EINVAL;
799 }
800 
801 /*
802  * compare device UID with data of a given dasd_eckd_private structure
803  * return 0 for match
804  */
805 static int dasd_eckd_compare_path_uid(struct dasd_device *device,
806 				      struct dasd_eckd_private *private)
807 {
808 	struct dasd_uid device_uid;
809 
810 	create_uid(private);
811 	dasd_eckd_get_uid(device, &device_uid);
812 
813 	return memcmp(&device_uid, &private->uid, sizeof(struct dasd_uid));
814 }
815 
816 static void dasd_eckd_fill_rcd_cqr(struct dasd_device *device,
817 				   struct dasd_ccw_req *cqr,
818 				   __u8 *rcd_buffer,
819 				   __u8 lpm)
820 {
821 	struct ccw1 *ccw;
822 	/*
823 	 * buffer has to start with EBCDIC "V1.0" to show
824 	 * support for virtual device SNEQ
825 	 */
826 	rcd_buffer[0] = 0xE5;
827 	rcd_buffer[1] = 0xF1;
828 	rcd_buffer[2] = 0x4B;
829 	rcd_buffer[3] = 0xF0;
830 
831 	ccw = cqr->cpaddr;
832 	ccw->cmd_code = DASD_ECKD_CCW_RCD;
833 	ccw->flags = 0;
834 	ccw->cda = (__u32)(addr_t)rcd_buffer;
835 	ccw->count = DASD_ECKD_RCD_DATA_SIZE;
836 	cqr->magic = DASD_ECKD_MAGIC;
837 
838 	cqr->startdev = device;
839 	cqr->memdev = device;
840 	cqr->block = NULL;
841 	cqr->expires = 10*HZ;
842 	cqr->lpm = lpm;
843 	cqr->retries = 256;
844 	cqr->buildclk = get_tod_clock();
845 	cqr->status = DASD_CQR_FILLED;
846 	set_bit(DASD_CQR_VERIFY_PATH, &cqr->flags);
847 }
848 
849 /*
850  * Wakeup helper for read_conf
851  * if the cqr is not done and needs some error recovery
852  * the buffer has to be re-initialized with the EBCDIC "V1.0"
853  * to show support for virtual device SNEQ
854  */
855 static void read_conf_cb(struct dasd_ccw_req *cqr, void *data)
856 {
857 	struct ccw1 *ccw;
858 	__u8 *rcd_buffer;
859 
860 	if (cqr->status !=  DASD_CQR_DONE) {
861 		ccw = cqr->cpaddr;
862 		rcd_buffer = (__u8 *)((addr_t) ccw->cda);
863 		memset(rcd_buffer, 0, sizeof(*rcd_buffer));
864 
865 		rcd_buffer[0] = 0xE5;
866 		rcd_buffer[1] = 0xF1;
867 		rcd_buffer[2] = 0x4B;
868 		rcd_buffer[3] = 0xF0;
869 	}
870 	dasd_wakeup_cb(cqr, data);
871 }
872 
873 static int dasd_eckd_read_conf_immediately(struct dasd_device *device,
874 					   struct dasd_ccw_req *cqr,
875 					   __u8 *rcd_buffer,
876 					   __u8 lpm)
877 {
878 	struct ciw *ciw;
879 	int rc;
880 	/*
881 	 * sanity check: scan for RCD command in extended SenseID data
882 	 * some devices do not support RCD
883 	 */
884 	ciw = ccw_device_get_ciw(device->cdev, CIW_TYPE_RCD);
885 	if (!ciw || ciw->cmd != DASD_ECKD_CCW_RCD)
886 		return -EOPNOTSUPP;
887 
888 	dasd_eckd_fill_rcd_cqr(device, cqr, rcd_buffer, lpm);
889 	clear_bit(DASD_CQR_FLAGS_USE_ERP, &cqr->flags);
890 	set_bit(DASD_CQR_ALLOW_SLOCK, &cqr->flags);
891 	cqr->retries = 5;
892 	cqr->callback = read_conf_cb;
893 	rc = dasd_sleep_on_immediatly(cqr);
894 	return rc;
895 }
896 
897 static int dasd_eckd_read_conf_lpm(struct dasd_device *device,
898 				   void **rcd_buffer,
899 				   int *rcd_buffer_size, __u8 lpm)
900 {
901 	struct ciw *ciw;
902 	char *rcd_buf = NULL;
903 	int ret;
904 	struct dasd_ccw_req *cqr;
905 
906 	/*
907 	 * sanity check: scan for RCD command in extended SenseID data
908 	 * some devices do not support RCD
909 	 */
910 	ciw = ccw_device_get_ciw(device->cdev, CIW_TYPE_RCD);
911 	if (!ciw || ciw->cmd != DASD_ECKD_CCW_RCD) {
912 		ret = -EOPNOTSUPP;
913 		goto out_error;
914 	}
915 	rcd_buf = kzalloc(DASD_ECKD_RCD_DATA_SIZE, GFP_KERNEL | GFP_DMA);
916 	if (!rcd_buf) {
917 		ret = -ENOMEM;
918 		goto out_error;
919 	}
920 	cqr = dasd_smalloc_request(DASD_ECKD_MAGIC, 1 /* RCD */,
921 				   0, /* use rcd_buf as data ara */
922 				   device, NULL);
923 	if (IS_ERR(cqr)) {
924 		DBF_DEV_EVENT(DBF_WARNING, device, "%s",
925 			      "Could not allocate RCD request");
926 		ret = -ENOMEM;
927 		goto out_error;
928 	}
929 	dasd_eckd_fill_rcd_cqr(device, cqr, rcd_buf, lpm);
930 	cqr->callback = read_conf_cb;
931 	ret = dasd_sleep_on(cqr);
932 	/*
933 	 * on success we update the user input parms
934 	 */
935 	dasd_sfree_request(cqr, cqr->memdev);
936 	if (ret)
937 		goto out_error;
938 
939 	*rcd_buffer_size = DASD_ECKD_RCD_DATA_SIZE;
940 	*rcd_buffer = rcd_buf;
941 	return 0;
942 out_error:
943 	kfree(rcd_buf);
944 	*rcd_buffer = NULL;
945 	*rcd_buffer_size = 0;
946 	return ret;
947 }
948 
949 static int dasd_eckd_identify_conf_parts(struct dasd_eckd_private *private)
950 {
951 
952 	struct dasd_sneq *sneq;
953 	int i, count;
954 
955 	private->ned = NULL;
956 	private->sneq = NULL;
957 	private->vdsneq = NULL;
958 	private->gneq = NULL;
959 	count = private->conf_len / sizeof(struct dasd_sneq);
960 	sneq = (struct dasd_sneq *)private->conf_data;
961 	for (i = 0; i < count; ++i) {
962 		if (sneq->flags.identifier == 1 && sneq->format == 1)
963 			private->sneq = sneq;
964 		else if (sneq->flags.identifier == 1 && sneq->format == 4)
965 			private->vdsneq = (struct vd_sneq *)sneq;
966 		else if (sneq->flags.identifier == 2)
967 			private->gneq = (struct dasd_gneq *)sneq;
968 		else if (sneq->flags.identifier == 3 && sneq->res1 == 1)
969 			private->ned = (struct dasd_ned *)sneq;
970 		sneq++;
971 	}
972 	if (!private->ned || !private->gneq) {
973 		private->ned = NULL;
974 		private->sneq = NULL;
975 		private->vdsneq = NULL;
976 		private->gneq = NULL;
977 		return -EINVAL;
978 	}
979 	return 0;
980 
981 };
982 
983 static unsigned char dasd_eckd_path_access(void *conf_data, int conf_len)
984 {
985 	struct dasd_gneq *gneq;
986 	int i, count, found;
987 
988 	count = conf_len / sizeof(*gneq);
989 	gneq = (struct dasd_gneq *)conf_data;
990 	found = 0;
991 	for (i = 0; i < count; ++i) {
992 		if (gneq->flags.identifier == 2) {
993 			found = 1;
994 			break;
995 		}
996 		gneq++;
997 	}
998 	if (found)
999 		return ((char *)gneq)[18] & 0x07;
1000 	else
1001 		return 0;
1002 }
1003 
1004 static void dasd_eckd_store_conf_data(struct dasd_device *device,
1005 				      struct dasd_conf_data *conf_data, int chp)
1006 {
1007 	struct channel_path_desc_fmt0 *chp_desc;
1008 	struct subchannel_id sch_id;
1009 
1010 	ccw_device_get_schid(device->cdev, &sch_id);
1011 	/*
1012 	 * path handling and read_conf allocate data
1013 	 * free it before replacing the pointer
1014 	 */
1015 	kfree(device->path[chp].conf_data);
1016 	device->path[chp].conf_data = conf_data;
1017 	device->path[chp].cssid = sch_id.cssid;
1018 	device->path[chp].ssid = sch_id.ssid;
1019 	chp_desc = ccw_device_get_chp_desc(device->cdev, chp);
1020 	if (chp_desc)
1021 		device->path[chp].chpid = chp_desc->chpid;
1022 	kfree(chp_desc);
1023 }
1024 
1025 static void dasd_eckd_clear_conf_data(struct dasd_device *device)
1026 {
1027 	struct dasd_eckd_private *private = device->private;
1028 	int i;
1029 
1030 	private->conf_data = NULL;
1031 	private->conf_len = 0;
1032 	for (i = 0; i < 8; i++) {
1033 		kfree(device->path[i].conf_data);
1034 		device->path[i].conf_data = NULL;
1035 		device->path[i].cssid = 0;
1036 		device->path[i].ssid = 0;
1037 		device->path[i].chpid = 0;
1038 		dasd_path_notoper(device, i);
1039 		dasd_path_remove_kobj(device, i);
1040 	}
1041 }
1042 
1043 static void dasd_eckd_read_fc_security(struct dasd_device *device)
1044 {
1045 	struct dasd_eckd_private *private = device->private;
1046 	u8 esm_valid;
1047 	u8 esm[8];
1048 	int chp;
1049 	int rc;
1050 
1051 	rc = chsc_scud(private->uid.ssid, (u64 *)esm, &esm_valid);
1052 	if (rc) {
1053 		for (chp = 0; chp < 8; chp++)
1054 			device->path[chp].fc_security = 0;
1055 		return;
1056 	}
1057 
1058 	for (chp = 0; chp < 8; chp++) {
1059 		if (esm_valid & (0x80 >> chp))
1060 			device->path[chp].fc_security = esm[chp];
1061 		else
1062 			device->path[chp].fc_security = 0;
1063 	}
1064 }
1065 
1066 static int dasd_eckd_read_conf(struct dasd_device *device)
1067 {
1068 	void *conf_data;
1069 	int conf_len, conf_data_saved;
1070 	int rc, path_err, pos;
1071 	__u8 lpm, opm;
1072 	struct dasd_eckd_private *private, path_private;
1073 	struct dasd_uid *uid;
1074 	char print_path_uid[60], print_device_uid[60];
1075 
1076 	private = device->private;
1077 	opm = ccw_device_get_path_mask(device->cdev);
1078 	conf_data_saved = 0;
1079 	path_err = 0;
1080 	/* get configuration data per operational path */
1081 	for (lpm = 0x80; lpm; lpm>>= 1) {
1082 		if (!(lpm & opm))
1083 			continue;
1084 		rc = dasd_eckd_read_conf_lpm(device, &conf_data,
1085 					     &conf_len, lpm);
1086 		if (rc && rc != -EOPNOTSUPP) {	/* -EOPNOTSUPP is ok */
1087 			DBF_EVENT_DEVID(DBF_WARNING, device->cdev,
1088 					"Read configuration data returned "
1089 					"error %d", rc);
1090 			return rc;
1091 		}
1092 		if (conf_data == NULL) {
1093 			DBF_EVENT_DEVID(DBF_WARNING, device->cdev, "%s",
1094 					"No configuration data "
1095 					"retrieved");
1096 			/* no further analysis possible */
1097 			dasd_path_add_opm(device, opm);
1098 			continue;	/* no error */
1099 		}
1100 		/* save first valid configuration data */
1101 		if (!conf_data_saved) {
1102 			/* initially clear previously stored conf_data */
1103 			dasd_eckd_clear_conf_data(device);
1104 			private->conf_data = conf_data;
1105 			private->conf_len = conf_len;
1106 			if (dasd_eckd_identify_conf_parts(private)) {
1107 				private->conf_data = NULL;
1108 				private->conf_len = 0;
1109 				kfree(conf_data);
1110 				continue;
1111 			}
1112 			/*
1113 			 * build device UID that other path data
1114 			 * can be compared to it
1115 			 */
1116 			dasd_eckd_generate_uid(device);
1117 			conf_data_saved++;
1118 		} else {
1119 			path_private.conf_data = conf_data;
1120 			path_private.conf_len = DASD_ECKD_RCD_DATA_SIZE;
1121 			if (dasd_eckd_identify_conf_parts(
1122 				    &path_private)) {
1123 				path_private.conf_data = NULL;
1124 				path_private.conf_len = 0;
1125 				kfree(conf_data);
1126 				continue;
1127 			}
1128 			if (dasd_eckd_compare_path_uid(
1129 				    device, &path_private)) {
1130 				uid = &path_private.uid;
1131 				if (strlen(uid->vduit) > 0)
1132 					snprintf(print_path_uid,
1133 						 sizeof(print_path_uid),
1134 						 "%s.%s.%04x.%02x.%s",
1135 						 uid->vendor, uid->serial,
1136 						 uid->ssid, uid->real_unit_addr,
1137 						 uid->vduit);
1138 				else
1139 					snprintf(print_path_uid,
1140 						 sizeof(print_path_uid),
1141 						 "%s.%s.%04x.%02x",
1142 						 uid->vendor, uid->serial,
1143 						 uid->ssid,
1144 						 uid->real_unit_addr);
1145 				uid = &private->uid;
1146 				if (strlen(uid->vduit) > 0)
1147 					snprintf(print_device_uid,
1148 						 sizeof(print_device_uid),
1149 						 "%s.%s.%04x.%02x.%s",
1150 						 uid->vendor, uid->serial,
1151 						 uid->ssid, uid->real_unit_addr,
1152 						 uid->vduit);
1153 				else
1154 					snprintf(print_device_uid,
1155 						 sizeof(print_device_uid),
1156 						 "%s.%s.%04x.%02x",
1157 						 uid->vendor, uid->serial,
1158 						 uid->ssid,
1159 						 uid->real_unit_addr);
1160 				dev_err(&device->cdev->dev,
1161 					"Not all channel paths lead to "
1162 					"the same device, path %02X leads to "
1163 					"device %s instead of %s\n", lpm,
1164 					print_path_uid, print_device_uid);
1165 				path_err = -EINVAL;
1166 				dasd_path_add_cablepm(device, lpm);
1167 				continue;
1168 			}
1169 			path_private.conf_data = NULL;
1170 			path_private.conf_len = 0;
1171 		}
1172 
1173 		pos = pathmask_to_pos(lpm);
1174 		dasd_eckd_store_conf_data(device, conf_data, pos);
1175 
1176 		switch (dasd_eckd_path_access(conf_data, conf_len)) {
1177 		case 0x02:
1178 			dasd_path_add_nppm(device, lpm);
1179 			break;
1180 		case 0x03:
1181 			dasd_path_add_ppm(device, lpm);
1182 			break;
1183 		}
1184 		if (!dasd_path_get_opm(device)) {
1185 			dasd_path_set_opm(device, lpm);
1186 			dasd_generic_path_operational(device);
1187 		} else {
1188 			dasd_path_add_opm(device, lpm);
1189 		}
1190 	}
1191 
1192 	dasd_eckd_read_fc_security(device);
1193 
1194 	return path_err;
1195 }
1196 
1197 static u32 get_fcx_max_data(struct dasd_device *device)
1198 {
1199 	struct dasd_eckd_private *private = device->private;
1200 	int fcx_in_css, fcx_in_gneq, fcx_in_features;
1201 	unsigned int mdc;
1202 	int tpm;
1203 
1204 	if (dasd_nofcx)
1205 		return 0;
1206 	/* is transport mode supported? */
1207 	fcx_in_css = css_general_characteristics.fcx;
1208 	fcx_in_gneq = private->gneq->reserved2[7] & 0x04;
1209 	fcx_in_features = private->features.feature[40] & 0x80;
1210 	tpm = fcx_in_css && fcx_in_gneq && fcx_in_features;
1211 
1212 	if (!tpm)
1213 		return 0;
1214 
1215 	mdc = ccw_device_get_mdc(device->cdev, 0);
1216 	if (mdc == 0) {
1217 		dev_warn(&device->cdev->dev, "Detecting the maximum supported data size for zHPF requests failed\n");
1218 		return 0;
1219 	} else {
1220 		return (u32)mdc * FCX_MAX_DATA_FACTOR;
1221 	}
1222 }
1223 
1224 static int verify_fcx_max_data(struct dasd_device *device, __u8 lpm)
1225 {
1226 	struct dasd_eckd_private *private = device->private;
1227 	unsigned int mdc;
1228 	u32 fcx_max_data;
1229 
1230 	if (private->fcx_max_data) {
1231 		mdc = ccw_device_get_mdc(device->cdev, lpm);
1232 		if (mdc == 0) {
1233 			dev_warn(&device->cdev->dev,
1234 				 "Detecting the maximum data size for zHPF "
1235 				 "requests failed (rc=%d) for a new path %x\n",
1236 				 mdc, lpm);
1237 			return mdc;
1238 		}
1239 		fcx_max_data = (u32)mdc * FCX_MAX_DATA_FACTOR;
1240 		if (fcx_max_data < private->fcx_max_data) {
1241 			dev_warn(&device->cdev->dev,
1242 				 "The maximum data size for zHPF requests %u "
1243 				 "on a new path %x is below the active maximum "
1244 				 "%u\n", fcx_max_data, lpm,
1245 				 private->fcx_max_data);
1246 			return -EACCES;
1247 		}
1248 	}
1249 	return 0;
1250 }
1251 
1252 static int rebuild_device_uid(struct dasd_device *device,
1253 			      struct pe_handler_work_data *data)
1254 {
1255 	struct dasd_eckd_private *private = device->private;
1256 	__u8 lpm, opm = dasd_path_get_opm(device);
1257 	int rc = -ENODEV;
1258 
1259 	for (lpm = 0x80; lpm; lpm >>= 1) {
1260 		if (!(lpm & opm))
1261 			continue;
1262 		memset(&data->rcd_buffer, 0, sizeof(data->rcd_buffer));
1263 		memset(&data->cqr, 0, sizeof(data->cqr));
1264 		data->cqr.cpaddr = &data->ccw;
1265 		rc = dasd_eckd_read_conf_immediately(device, &data->cqr,
1266 						     data->rcd_buffer,
1267 						     lpm);
1268 
1269 		if (rc) {
1270 			if (rc == -EOPNOTSUPP) /* -EOPNOTSUPP is ok */
1271 				continue;
1272 			DBF_EVENT_DEVID(DBF_WARNING, device->cdev,
1273 					"Read configuration data "
1274 					"returned error %d", rc);
1275 			break;
1276 		}
1277 		memcpy(private->conf_data, data->rcd_buffer,
1278 		       DASD_ECKD_RCD_DATA_SIZE);
1279 		if (dasd_eckd_identify_conf_parts(private)) {
1280 			rc = -ENODEV;
1281 		} else /* first valid path is enough */
1282 			break;
1283 	}
1284 
1285 	if (!rc)
1286 		rc = dasd_eckd_generate_uid(device);
1287 
1288 	return rc;
1289 }
1290 
1291 static void dasd_eckd_path_available_action(struct dasd_device *device,
1292 					    struct pe_handler_work_data *data)
1293 {
1294 	struct dasd_eckd_private path_private;
1295 	struct dasd_uid *uid;
1296 	__u8 path_rcd_buf[DASD_ECKD_RCD_DATA_SIZE];
1297 	__u8 lpm, opm, npm, ppm, epm, hpfpm, cablepm;
1298 	struct dasd_conf_data *conf_data;
1299 	unsigned long flags;
1300 	char print_uid[60];
1301 	int rc, pos;
1302 
1303 	opm = 0;
1304 	npm = 0;
1305 	ppm = 0;
1306 	epm = 0;
1307 	hpfpm = 0;
1308 	cablepm = 0;
1309 
1310 	for (lpm = 0x80; lpm; lpm >>= 1) {
1311 		if (!(lpm & data->tbvpm))
1312 			continue;
1313 		memset(&data->rcd_buffer, 0, sizeof(data->rcd_buffer));
1314 		memset(&data->cqr, 0, sizeof(data->cqr));
1315 		data->cqr.cpaddr = &data->ccw;
1316 		rc = dasd_eckd_read_conf_immediately(device, &data->cqr,
1317 						     data->rcd_buffer,
1318 						     lpm);
1319 		if (!rc) {
1320 			switch (dasd_eckd_path_access(data->rcd_buffer,
1321 						      DASD_ECKD_RCD_DATA_SIZE)
1322 				) {
1323 			case 0x02:
1324 				npm |= lpm;
1325 				break;
1326 			case 0x03:
1327 				ppm |= lpm;
1328 				break;
1329 			}
1330 			opm |= lpm;
1331 		} else if (rc == -EOPNOTSUPP) {
1332 			DBF_EVENT_DEVID(DBF_WARNING, device->cdev, "%s",
1333 					"path verification: No configuration "
1334 					"data retrieved");
1335 			opm |= lpm;
1336 		} else if (rc == -EAGAIN) {
1337 			DBF_EVENT_DEVID(DBF_WARNING, device->cdev, "%s",
1338 					"path verification: device is stopped,"
1339 					" try again later");
1340 			epm |= lpm;
1341 		} else {
1342 			dev_warn(&device->cdev->dev,
1343 				 "Reading device feature codes failed "
1344 				 "(rc=%d) for new path %x\n", rc, lpm);
1345 			continue;
1346 		}
1347 		if (verify_fcx_max_data(device, lpm)) {
1348 			opm &= ~lpm;
1349 			npm &= ~lpm;
1350 			ppm &= ~lpm;
1351 			hpfpm |= lpm;
1352 			continue;
1353 		}
1354 
1355 		/*
1356 		 * save conf_data for comparison after
1357 		 * rebuild_device_uid may have changed
1358 		 * the original data
1359 		 */
1360 		memcpy(&path_rcd_buf, data->rcd_buffer,
1361 		       DASD_ECKD_RCD_DATA_SIZE);
1362 		path_private.conf_data = (void *) &path_rcd_buf;
1363 		path_private.conf_len = DASD_ECKD_RCD_DATA_SIZE;
1364 		if (dasd_eckd_identify_conf_parts(&path_private)) {
1365 			path_private.conf_data = NULL;
1366 			path_private.conf_len = 0;
1367 			continue;
1368 		}
1369 
1370 		/*
1371 		 * compare path UID with device UID only if at least
1372 		 * one valid path is left
1373 		 * in other case the device UID may have changed and
1374 		 * the first working path UID will be used as device UID
1375 		 */
1376 		if (dasd_path_get_opm(device) &&
1377 		    dasd_eckd_compare_path_uid(device, &path_private)) {
1378 			/*
1379 			 * the comparison was not successful
1380 			 * rebuild the device UID with at least one
1381 			 * known path in case a z/VM hyperswap command
1382 			 * has changed the device
1383 			 *
1384 			 * after this compare again
1385 			 *
1386 			 * if either the rebuild or the recompare fails
1387 			 * the path can not be used
1388 			 */
1389 			if (rebuild_device_uid(device, data) ||
1390 			    dasd_eckd_compare_path_uid(
1391 				    device, &path_private)) {
1392 				uid = &path_private.uid;
1393 				if (strlen(uid->vduit) > 0)
1394 					snprintf(print_uid, sizeof(print_uid),
1395 						 "%s.%s.%04x.%02x.%s",
1396 						 uid->vendor, uid->serial,
1397 						 uid->ssid, uid->real_unit_addr,
1398 						 uid->vduit);
1399 				else
1400 					snprintf(print_uid, sizeof(print_uid),
1401 						 "%s.%s.%04x.%02x",
1402 						 uid->vendor, uid->serial,
1403 						 uid->ssid,
1404 						 uid->real_unit_addr);
1405 				dev_err(&device->cdev->dev,
1406 					"The newly added channel path %02X "
1407 					"will not be used because it leads "
1408 					"to a different device %s\n",
1409 					lpm, print_uid);
1410 				opm &= ~lpm;
1411 				npm &= ~lpm;
1412 				ppm &= ~lpm;
1413 				cablepm |= lpm;
1414 				continue;
1415 			}
1416 		}
1417 
1418 		conf_data = kzalloc(DASD_ECKD_RCD_DATA_SIZE, GFP_KERNEL);
1419 		if (conf_data) {
1420 			memcpy(conf_data, data->rcd_buffer,
1421 			       DASD_ECKD_RCD_DATA_SIZE);
1422 		}
1423 		pos = pathmask_to_pos(lpm);
1424 		dasd_eckd_store_conf_data(device, conf_data, pos);
1425 
1426 		/*
1427 		 * There is a small chance that a path is lost again between
1428 		 * above path verification and the following modification of
1429 		 * the device opm mask. We could avoid that race here by using
1430 		 * yet another path mask, but we rather deal with this unlikely
1431 		 * situation in dasd_start_IO.
1432 		 */
1433 		spin_lock_irqsave(get_ccwdev_lock(device->cdev), flags);
1434 		if (!dasd_path_get_opm(device) && opm) {
1435 			dasd_path_set_opm(device, opm);
1436 			dasd_generic_path_operational(device);
1437 		} else {
1438 			dasd_path_add_opm(device, opm);
1439 		}
1440 		dasd_path_add_nppm(device, npm);
1441 		dasd_path_add_ppm(device, ppm);
1442 		dasd_path_add_tbvpm(device, epm);
1443 		dasd_path_add_cablepm(device, cablepm);
1444 		dasd_path_add_nohpfpm(device, hpfpm);
1445 		spin_unlock_irqrestore(get_ccwdev_lock(device->cdev), flags);
1446 
1447 		dasd_path_create_kobj(device, pos);
1448 	}
1449 }
1450 
1451 static void do_pe_handler_work(struct work_struct *work)
1452 {
1453 	struct pe_handler_work_data *data;
1454 	struct dasd_device *device;
1455 
1456 	data = container_of(work, struct pe_handler_work_data, worker);
1457 	device = data->device;
1458 
1459 	/* delay path verification until device was resumed */
1460 	if (test_bit(DASD_FLAG_SUSPENDED, &device->flags)) {
1461 		schedule_work(work);
1462 		return;
1463 	}
1464 	/* check if path verification already running and delay if so */
1465 	if (test_and_set_bit(DASD_FLAG_PATH_VERIFY, &device->flags)) {
1466 		schedule_work(work);
1467 		return;
1468 	}
1469 
1470 	if (data->tbvpm)
1471 		dasd_eckd_path_available_action(device, data);
1472 	if (data->fcsecpm)
1473 		dasd_eckd_read_fc_security(device);
1474 
1475 	clear_bit(DASD_FLAG_PATH_VERIFY, &device->flags);
1476 	dasd_put_device(device);
1477 	if (data->isglobal)
1478 		mutex_unlock(&dasd_pe_handler_mutex);
1479 	else
1480 		kfree(data);
1481 }
1482 
1483 static int dasd_eckd_pe_handler(struct dasd_device *device,
1484 				__u8 tbvpm, __u8 fcsecpm)
1485 {
1486 	struct pe_handler_work_data *data;
1487 
1488 	data = kmalloc(sizeof(*data), GFP_ATOMIC | GFP_DMA);
1489 	if (!data) {
1490 		if (mutex_trylock(&dasd_pe_handler_mutex)) {
1491 			data = pe_handler_worker;
1492 			data->isglobal = 1;
1493 		} else {
1494 			return -ENOMEM;
1495 		}
1496 	} else {
1497 		memset(data, 0, sizeof(*data));
1498 		data->isglobal = 0;
1499 	}
1500 	INIT_WORK(&data->worker, do_pe_handler_work);
1501 	dasd_get_device(device);
1502 	data->device = device;
1503 	data->tbvpm = tbvpm;
1504 	data->fcsecpm = fcsecpm;
1505 	schedule_work(&data->worker);
1506 	return 0;
1507 }
1508 
1509 static void dasd_eckd_reset_path(struct dasd_device *device, __u8 pm)
1510 {
1511 	struct dasd_eckd_private *private = device->private;
1512 	unsigned long flags;
1513 
1514 	if (!private->fcx_max_data)
1515 		private->fcx_max_data = get_fcx_max_data(device);
1516 	spin_lock_irqsave(get_ccwdev_lock(device->cdev), flags);
1517 	dasd_path_set_tbvpm(device, pm ? : dasd_path_get_notoperpm(device));
1518 	dasd_schedule_device_bh(device);
1519 	spin_unlock_irqrestore(get_ccwdev_lock(device->cdev), flags);
1520 }
1521 
1522 static int dasd_eckd_read_features(struct dasd_device *device)
1523 {
1524 	struct dasd_eckd_private *private = device->private;
1525 	struct dasd_psf_prssd_data *prssdp;
1526 	struct dasd_rssd_features *features;
1527 	struct dasd_ccw_req *cqr;
1528 	struct ccw1 *ccw;
1529 	int rc;
1530 
1531 	memset(&private->features, 0, sizeof(struct dasd_rssd_features));
1532 	cqr = dasd_smalloc_request(DASD_ECKD_MAGIC, 1 /* PSF */	+ 1 /* RSSD */,
1533 				   (sizeof(struct dasd_psf_prssd_data) +
1534 				    sizeof(struct dasd_rssd_features)),
1535 				   device, NULL);
1536 	if (IS_ERR(cqr)) {
1537 		DBF_EVENT_DEVID(DBF_WARNING, device->cdev, "%s", "Could not "
1538 				"allocate initialization request");
1539 		return PTR_ERR(cqr);
1540 	}
1541 	cqr->startdev = device;
1542 	cqr->memdev = device;
1543 	cqr->block = NULL;
1544 	cqr->retries = 256;
1545 	cqr->expires = 10 * HZ;
1546 
1547 	/* Prepare for Read Subsystem Data */
1548 	prssdp = (struct dasd_psf_prssd_data *) cqr->data;
1549 	memset(prssdp, 0, sizeof(struct dasd_psf_prssd_data));
1550 	prssdp->order = PSF_ORDER_PRSSD;
1551 	prssdp->suborder = 0x41;	/* Read Feature Codes */
1552 	/* all other bytes of prssdp must be zero */
1553 
1554 	ccw = cqr->cpaddr;
1555 	ccw->cmd_code = DASD_ECKD_CCW_PSF;
1556 	ccw->count = sizeof(struct dasd_psf_prssd_data);
1557 	ccw->flags |= CCW_FLAG_CC;
1558 	ccw->cda = (__u32)(addr_t) prssdp;
1559 
1560 	/* Read Subsystem Data - feature codes */
1561 	features = (struct dasd_rssd_features *) (prssdp + 1);
1562 	memset(features, 0, sizeof(struct dasd_rssd_features));
1563 
1564 	ccw++;
1565 	ccw->cmd_code = DASD_ECKD_CCW_RSSD;
1566 	ccw->count = sizeof(struct dasd_rssd_features);
1567 	ccw->cda = (__u32)(addr_t) features;
1568 
1569 	cqr->buildclk = get_tod_clock();
1570 	cqr->status = DASD_CQR_FILLED;
1571 	rc = dasd_sleep_on(cqr);
1572 	if (rc == 0) {
1573 		prssdp = (struct dasd_psf_prssd_data *) cqr->data;
1574 		features = (struct dasd_rssd_features *) (prssdp + 1);
1575 		memcpy(&private->features, features,
1576 		       sizeof(struct dasd_rssd_features));
1577 	} else
1578 		dev_warn(&device->cdev->dev, "Reading device feature codes"
1579 			 " failed with rc=%d\n", rc);
1580 	dasd_sfree_request(cqr, cqr->memdev);
1581 	return rc;
1582 }
1583 
1584 /* Read Volume Information - Volume Storage Query */
1585 static int dasd_eckd_read_vol_info(struct dasd_device *device)
1586 {
1587 	struct dasd_eckd_private *private = device->private;
1588 	struct dasd_psf_prssd_data *prssdp;
1589 	struct dasd_rssd_vsq *vsq;
1590 	struct dasd_ccw_req *cqr;
1591 	struct ccw1 *ccw;
1592 	int useglobal;
1593 	int rc;
1594 
1595 	/* This command cannot be executed on an alias device */
1596 	if (private->uid.type == UA_BASE_PAV_ALIAS ||
1597 	    private->uid.type == UA_HYPER_PAV_ALIAS)
1598 		return 0;
1599 
1600 	useglobal = 0;
1601 	cqr = dasd_smalloc_request(DASD_ECKD_MAGIC, 2 /* PSF + RSSD */,
1602 				   sizeof(*prssdp) + sizeof(*vsq), device, NULL);
1603 	if (IS_ERR(cqr)) {
1604 		DBF_EVENT_DEVID(DBF_WARNING, device->cdev, "%s",
1605 				"Could not allocate initialization request");
1606 		mutex_lock(&dasd_vol_info_mutex);
1607 		useglobal = 1;
1608 		cqr = &dasd_vol_info_req->cqr;
1609 		memset(cqr, 0, sizeof(*cqr));
1610 		memset(dasd_vol_info_req, 0, sizeof(*dasd_vol_info_req));
1611 		cqr->cpaddr = &dasd_vol_info_req->ccw;
1612 		cqr->data = &dasd_vol_info_req->data;
1613 		cqr->magic = DASD_ECKD_MAGIC;
1614 	}
1615 
1616 	/* Prepare for Read Subsystem Data */
1617 	prssdp = cqr->data;
1618 	prssdp->order = PSF_ORDER_PRSSD;
1619 	prssdp->suborder = PSF_SUBORDER_VSQ;	/* Volume Storage Query */
1620 	prssdp->lss = private->ned->ID;
1621 	prssdp->volume = private->ned->unit_addr;
1622 
1623 	ccw = cqr->cpaddr;
1624 	ccw->cmd_code = DASD_ECKD_CCW_PSF;
1625 	ccw->count = sizeof(*prssdp);
1626 	ccw->flags |= CCW_FLAG_CC;
1627 	ccw->cda = (__u32)(addr_t)prssdp;
1628 
1629 	/* Read Subsystem Data - Volume Storage Query */
1630 	vsq = (struct dasd_rssd_vsq *)(prssdp + 1);
1631 	memset(vsq, 0, sizeof(*vsq));
1632 
1633 	ccw++;
1634 	ccw->cmd_code = DASD_ECKD_CCW_RSSD;
1635 	ccw->count = sizeof(*vsq);
1636 	ccw->flags |= CCW_FLAG_SLI;
1637 	ccw->cda = (__u32)(addr_t)vsq;
1638 
1639 	cqr->buildclk = get_tod_clock();
1640 	cqr->status = DASD_CQR_FILLED;
1641 	cqr->startdev = device;
1642 	cqr->memdev = device;
1643 	cqr->block = NULL;
1644 	cqr->retries = 256;
1645 	cqr->expires = device->default_expires * HZ;
1646 	/* The command might not be supported. Suppress the error output */
1647 	__set_bit(DASD_CQR_SUPPRESS_CR, &cqr->flags);
1648 
1649 	rc = dasd_sleep_on_interruptible(cqr);
1650 	if (rc == 0) {
1651 		memcpy(&private->vsq, vsq, sizeof(*vsq));
1652 	} else {
1653 		DBF_EVENT_DEVID(DBF_WARNING, device->cdev,
1654 				"Reading the volume storage information failed with rc=%d", rc);
1655 	}
1656 
1657 	if (useglobal)
1658 		mutex_unlock(&dasd_vol_info_mutex);
1659 	else
1660 		dasd_sfree_request(cqr, cqr->memdev);
1661 
1662 	return rc;
1663 }
1664 
1665 static int dasd_eckd_is_ese(struct dasd_device *device)
1666 {
1667 	struct dasd_eckd_private *private = device->private;
1668 
1669 	return private->vsq.vol_info.ese;
1670 }
1671 
1672 static int dasd_eckd_ext_pool_id(struct dasd_device *device)
1673 {
1674 	struct dasd_eckd_private *private = device->private;
1675 
1676 	return private->vsq.extent_pool_id;
1677 }
1678 
1679 /*
1680  * This value represents the total amount of available space. As more space is
1681  * allocated by ESE volumes, this value will decrease.
1682  * The data for this value is therefore updated on any call.
1683  */
1684 static int dasd_eckd_space_configured(struct dasd_device *device)
1685 {
1686 	struct dasd_eckd_private *private = device->private;
1687 	int rc;
1688 
1689 	rc = dasd_eckd_read_vol_info(device);
1690 
1691 	return rc ? : private->vsq.space_configured;
1692 }
1693 
1694 /*
1695  * The value of space allocated by an ESE volume may have changed and is
1696  * therefore updated on any call.
1697  */
1698 static int dasd_eckd_space_allocated(struct dasd_device *device)
1699 {
1700 	struct dasd_eckd_private *private = device->private;
1701 	int rc;
1702 
1703 	rc = dasd_eckd_read_vol_info(device);
1704 
1705 	return rc ? : private->vsq.space_allocated;
1706 }
1707 
1708 static int dasd_eckd_logical_capacity(struct dasd_device *device)
1709 {
1710 	struct dasd_eckd_private *private = device->private;
1711 
1712 	return private->vsq.logical_capacity;
1713 }
1714 
1715 static void dasd_eckd_ext_pool_exhaust_work(struct work_struct *work)
1716 {
1717 	struct ext_pool_exhaust_work_data *data;
1718 	struct dasd_device *device;
1719 	struct dasd_device *base;
1720 
1721 	data = container_of(work, struct ext_pool_exhaust_work_data, worker);
1722 	device = data->device;
1723 	base = data->base;
1724 
1725 	if (!base)
1726 		base = device;
1727 	if (dasd_eckd_space_configured(base) != 0) {
1728 		dasd_generic_space_avail(device);
1729 	} else {
1730 		dev_warn(&device->cdev->dev, "No space left in the extent pool\n");
1731 		DBF_DEV_EVENT(DBF_WARNING, device, "%s", "out of space");
1732 	}
1733 
1734 	dasd_put_device(device);
1735 	kfree(data);
1736 }
1737 
1738 static int dasd_eckd_ext_pool_exhaust(struct dasd_device *device,
1739 				      struct dasd_ccw_req *cqr)
1740 {
1741 	struct ext_pool_exhaust_work_data *data;
1742 
1743 	data = kzalloc(sizeof(*data), GFP_ATOMIC);
1744 	if (!data)
1745 		return -ENOMEM;
1746 	INIT_WORK(&data->worker, dasd_eckd_ext_pool_exhaust_work);
1747 	dasd_get_device(device);
1748 	data->device = device;
1749 
1750 	if (cqr->block)
1751 		data->base = cqr->block->base;
1752 	else if (cqr->basedev)
1753 		data->base = cqr->basedev;
1754 	else
1755 		data->base = NULL;
1756 
1757 	schedule_work(&data->worker);
1758 
1759 	return 0;
1760 }
1761 
1762 static void dasd_eckd_cpy_ext_pool_data(struct dasd_device *device,
1763 					struct dasd_rssd_lcq *lcq)
1764 {
1765 	struct dasd_eckd_private *private = device->private;
1766 	int pool_id = dasd_eckd_ext_pool_id(device);
1767 	struct dasd_ext_pool_sum eps;
1768 	int i;
1769 
1770 	for (i = 0; i < lcq->pool_count; i++) {
1771 		eps = lcq->ext_pool_sum[i];
1772 		if (eps.pool_id == pool_id) {
1773 			memcpy(&private->eps, &eps,
1774 			       sizeof(struct dasd_ext_pool_sum));
1775 		}
1776 	}
1777 }
1778 
1779 /* Read Extent Pool Information - Logical Configuration Query */
1780 static int dasd_eckd_read_ext_pool_info(struct dasd_device *device)
1781 {
1782 	struct dasd_eckd_private *private = device->private;
1783 	struct dasd_psf_prssd_data *prssdp;
1784 	struct dasd_rssd_lcq *lcq;
1785 	struct dasd_ccw_req *cqr;
1786 	struct ccw1 *ccw;
1787 	int rc;
1788 
1789 	/* This command cannot be executed on an alias device */
1790 	if (private->uid.type == UA_BASE_PAV_ALIAS ||
1791 	    private->uid.type == UA_HYPER_PAV_ALIAS)
1792 		return 0;
1793 
1794 	cqr = dasd_smalloc_request(DASD_ECKD_MAGIC, 2 /* PSF + RSSD */,
1795 				   sizeof(*prssdp) + sizeof(*lcq), device, NULL);
1796 	if (IS_ERR(cqr)) {
1797 		DBF_EVENT_DEVID(DBF_WARNING, device->cdev, "%s",
1798 				"Could not allocate initialization request");
1799 		return PTR_ERR(cqr);
1800 	}
1801 
1802 	/* Prepare for Read Subsystem Data */
1803 	prssdp = cqr->data;
1804 	memset(prssdp, 0, sizeof(*prssdp));
1805 	prssdp->order = PSF_ORDER_PRSSD;
1806 	prssdp->suborder = PSF_SUBORDER_LCQ;	/* Logical Configuration Query */
1807 
1808 	ccw = cqr->cpaddr;
1809 	ccw->cmd_code = DASD_ECKD_CCW_PSF;
1810 	ccw->count = sizeof(*prssdp);
1811 	ccw->flags |= CCW_FLAG_CC;
1812 	ccw->cda = (__u32)(addr_t)prssdp;
1813 
1814 	lcq = (struct dasd_rssd_lcq *)(prssdp + 1);
1815 	memset(lcq, 0, sizeof(*lcq));
1816 
1817 	ccw++;
1818 	ccw->cmd_code = DASD_ECKD_CCW_RSSD;
1819 	ccw->count = sizeof(*lcq);
1820 	ccw->flags |= CCW_FLAG_SLI;
1821 	ccw->cda = (__u32)(addr_t)lcq;
1822 
1823 	cqr->buildclk = get_tod_clock();
1824 	cqr->status = DASD_CQR_FILLED;
1825 	cqr->startdev = device;
1826 	cqr->memdev = device;
1827 	cqr->block = NULL;
1828 	cqr->retries = 256;
1829 	cqr->expires = device->default_expires * HZ;
1830 	/* The command might not be supported. Suppress the error output */
1831 	__set_bit(DASD_CQR_SUPPRESS_CR, &cqr->flags);
1832 
1833 	rc = dasd_sleep_on_interruptible(cqr);
1834 	if (rc == 0) {
1835 		dasd_eckd_cpy_ext_pool_data(device, lcq);
1836 	} else {
1837 		DBF_EVENT_DEVID(DBF_WARNING, device->cdev,
1838 				"Reading the logical configuration failed with rc=%d", rc);
1839 	}
1840 
1841 	dasd_sfree_request(cqr, cqr->memdev);
1842 
1843 	return rc;
1844 }
1845 
1846 /*
1847  * Depending on the device type, the extent size is specified either as
1848  * cylinders per extent (CKD) or size per extent (FBA)
1849  * A 1GB size corresponds to 1113cyl, and 16MB to 21cyl.
1850  */
1851 static int dasd_eckd_ext_size(struct dasd_device *device)
1852 {
1853 	struct dasd_eckd_private *private = device->private;
1854 	struct dasd_ext_pool_sum eps = private->eps;
1855 
1856 	if (!eps.flags.extent_size_valid)
1857 		return 0;
1858 	if (eps.extent_size.size_1G)
1859 		return 1113;
1860 	if (eps.extent_size.size_16M)
1861 		return 21;
1862 
1863 	return 0;
1864 }
1865 
1866 static int dasd_eckd_ext_pool_warn_thrshld(struct dasd_device *device)
1867 {
1868 	struct dasd_eckd_private *private = device->private;
1869 
1870 	return private->eps.warn_thrshld;
1871 }
1872 
1873 static int dasd_eckd_ext_pool_cap_at_warnlevel(struct dasd_device *device)
1874 {
1875 	struct dasd_eckd_private *private = device->private;
1876 
1877 	return private->eps.flags.capacity_at_warnlevel;
1878 }
1879 
1880 /*
1881  * Extent Pool out of space
1882  */
1883 static int dasd_eckd_ext_pool_oos(struct dasd_device *device)
1884 {
1885 	struct dasd_eckd_private *private = device->private;
1886 
1887 	return private->eps.flags.pool_oos;
1888 }
1889 
1890 /*
1891  * Build CP for Perform Subsystem Function - SSC.
1892  */
1893 static struct dasd_ccw_req *dasd_eckd_build_psf_ssc(struct dasd_device *device,
1894 						    int enable_pav)
1895 {
1896 	struct dasd_ccw_req *cqr;
1897 	struct dasd_psf_ssc_data *psf_ssc_data;
1898 	struct ccw1 *ccw;
1899 
1900 	cqr = dasd_smalloc_request(DASD_ECKD_MAGIC, 1 /* PSF */ ,
1901 				  sizeof(struct dasd_psf_ssc_data),
1902 				   device, NULL);
1903 
1904 	if (IS_ERR(cqr)) {
1905 		DBF_DEV_EVENT(DBF_WARNING, device, "%s",
1906 			   "Could not allocate PSF-SSC request");
1907 		return cqr;
1908 	}
1909 	psf_ssc_data = (struct dasd_psf_ssc_data *)cqr->data;
1910 	psf_ssc_data->order = PSF_ORDER_SSC;
1911 	psf_ssc_data->suborder = 0xc0;
1912 	if (enable_pav) {
1913 		psf_ssc_data->suborder |= 0x08;
1914 		psf_ssc_data->reserved[0] = 0x88;
1915 	}
1916 	ccw = cqr->cpaddr;
1917 	ccw->cmd_code = DASD_ECKD_CCW_PSF;
1918 	ccw->cda = (__u32)(addr_t)psf_ssc_data;
1919 	ccw->count = 66;
1920 
1921 	cqr->startdev = device;
1922 	cqr->memdev = device;
1923 	cqr->block = NULL;
1924 	cqr->retries = 256;
1925 	cqr->expires = 10*HZ;
1926 	cqr->buildclk = get_tod_clock();
1927 	cqr->status = DASD_CQR_FILLED;
1928 	return cqr;
1929 }
1930 
1931 /*
1932  * Perform Subsystem Function.
1933  * It is necessary to trigger CIO for channel revalidation since this
1934  * call might change behaviour of DASD devices.
1935  */
1936 static int
1937 dasd_eckd_psf_ssc(struct dasd_device *device, int enable_pav,
1938 		  unsigned long flags)
1939 {
1940 	struct dasd_ccw_req *cqr;
1941 	int rc;
1942 
1943 	cqr = dasd_eckd_build_psf_ssc(device, enable_pav);
1944 	if (IS_ERR(cqr))
1945 		return PTR_ERR(cqr);
1946 
1947 	/*
1948 	 * set flags e.g. turn on failfast, to prevent blocking
1949 	 * the calling function should handle failed requests
1950 	 */
1951 	cqr->flags |= flags;
1952 
1953 	rc = dasd_sleep_on(cqr);
1954 	if (!rc)
1955 		/* trigger CIO to reprobe devices */
1956 		css_schedule_reprobe();
1957 	else if (cqr->intrc == -EAGAIN)
1958 		rc = -EAGAIN;
1959 
1960 	dasd_sfree_request(cqr, cqr->memdev);
1961 	return rc;
1962 }
1963 
1964 /*
1965  * Valide storage server of current device.
1966  */
1967 static int dasd_eckd_validate_server(struct dasd_device *device,
1968 				     unsigned long flags)
1969 {
1970 	struct dasd_eckd_private *private = device->private;
1971 	int enable_pav, rc;
1972 
1973 	if (private->uid.type == UA_BASE_PAV_ALIAS ||
1974 	    private->uid.type == UA_HYPER_PAV_ALIAS)
1975 		return 0;
1976 	if (dasd_nopav || MACHINE_IS_VM)
1977 		enable_pav = 0;
1978 	else
1979 		enable_pav = 1;
1980 	rc = dasd_eckd_psf_ssc(device, enable_pav, flags);
1981 
1982 	/* may be requested feature is not available on server,
1983 	 * therefore just report error and go ahead */
1984 	DBF_EVENT_DEVID(DBF_WARNING, device->cdev, "PSF-SSC for SSID %04x "
1985 			"returned rc=%d", private->uid.ssid, rc);
1986 	return rc;
1987 }
1988 
1989 /*
1990  * worker to do a validate server in case of a lost pathgroup
1991  */
1992 static void dasd_eckd_do_validate_server(struct work_struct *work)
1993 {
1994 	struct dasd_device *device = container_of(work, struct dasd_device,
1995 						  kick_validate);
1996 	unsigned long flags = 0;
1997 
1998 	set_bit(DASD_CQR_FLAGS_FAILFAST, &flags);
1999 	if (dasd_eckd_validate_server(device, flags)
2000 	    == -EAGAIN) {
2001 		/* schedule worker again if failed */
2002 		schedule_work(&device->kick_validate);
2003 		return;
2004 	}
2005 
2006 	dasd_put_device(device);
2007 }
2008 
2009 static void dasd_eckd_kick_validate_server(struct dasd_device *device)
2010 {
2011 	dasd_get_device(device);
2012 	/* exit if device not online or in offline processing */
2013 	if (test_bit(DASD_FLAG_OFFLINE, &device->flags) ||
2014 	   device->state < DASD_STATE_ONLINE) {
2015 		dasd_put_device(device);
2016 		return;
2017 	}
2018 	/* queue call to do_validate_server to the kernel event daemon. */
2019 	if (!schedule_work(&device->kick_validate))
2020 		dasd_put_device(device);
2021 }
2022 
2023 /*
2024  * Check device characteristics.
2025  * If the device is accessible using ECKD discipline, the device is enabled.
2026  */
2027 static int
2028 dasd_eckd_check_characteristics(struct dasd_device *device)
2029 {
2030 	struct dasd_eckd_private *private = device->private;
2031 	struct dasd_block *block;
2032 	struct dasd_uid temp_uid;
2033 	int rc, i;
2034 	int readonly;
2035 	unsigned long value;
2036 
2037 	/* setup work queue for validate server*/
2038 	INIT_WORK(&device->kick_validate, dasd_eckd_do_validate_server);
2039 	/* setup work queue for summary unit check */
2040 	INIT_WORK(&device->suc_work, dasd_alias_handle_summary_unit_check);
2041 
2042 	if (!ccw_device_is_pathgroup(device->cdev)) {
2043 		dev_warn(&device->cdev->dev,
2044 			 "A channel path group could not be established\n");
2045 		return -EIO;
2046 	}
2047 	if (!ccw_device_is_multipath(device->cdev)) {
2048 		dev_info(&device->cdev->dev,
2049 			 "The DASD is not operating in multipath mode\n");
2050 	}
2051 	if (!private) {
2052 		private = kzalloc(sizeof(*private), GFP_KERNEL | GFP_DMA);
2053 		if (!private) {
2054 			dev_warn(&device->cdev->dev,
2055 				 "Allocating memory for private DASD data "
2056 				 "failed\n");
2057 			return -ENOMEM;
2058 		}
2059 		device->private = private;
2060 	} else {
2061 		memset(private, 0, sizeof(*private));
2062 	}
2063 	/* Invalidate status of initial analysis. */
2064 	private->init_cqr_status = -1;
2065 	/* Set default cache operations. */
2066 	private->attrib.operation = DASD_NORMAL_CACHE;
2067 	private->attrib.nr_cyl = 0;
2068 
2069 	/* Read Configuration Data */
2070 	rc = dasd_eckd_read_conf(device);
2071 	if (rc)
2072 		goto out_err1;
2073 
2074 	/* set some default values */
2075 	device->default_expires = DASD_EXPIRES;
2076 	device->default_retries = DASD_RETRIES;
2077 	device->path_thrhld = DASD_ECKD_PATH_THRHLD;
2078 	device->path_interval = DASD_ECKD_PATH_INTERVAL;
2079 
2080 	if (private->gneq) {
2081 		value = 1;
2082 		for (i = 0; i < private->gneq->timeout.value; i++)
2083 			value = 10 * value;
2084 		value = value * private->gneq->timeout.number;
2085 		/* do not accept useless values */
2086 		if (value != 0 && value <= DASD_EXPIRES_MAX)
2087 			device->default_expires = value;
2088 	}
2089 
2090 	dasd_eckd_get_uid(device, &temp_uid);
2091 	if (temp_uid.type == UA_BASE_DEVICE) {
2092 		block = dasd_alloc_block();
2093 		if (IS_ERR(block)) {
2094 			DBF_EVENT_DEVID(DBF_WARNING, device->cdev, "%s",
2095 					"could not allocate dasd "
2096 					"block structure");
2097 			rc = PTR_ERR(block);
2098 			goto out_err1;
2099 		}
2100 		device->block = block;
2101 		block->base = device;
2102 	}
2103 
2104 	/* register lcu with alias handling, enable PAV */
2105 	rc = dasd_alias_make_device_known_to_lcu(device);
2106 	if (rc)
2107 		goto out_err2;
2108 
2109 	dasd_eckd_validate_server(device, 0);
2110 
2111 	/* device may report different configuration data after LCU setup */
2112 	rc = dasd_eckd_read_conf(device);
2113 	if (rc)
2114 		goto out_err3;
2115 
2116 	dasd_path_create_kobjects(device);
2117 
2118 	/* Read Feature Codes */
2119 	dasd_eckd_read_features(device);
2120 
2121 	/* Read Volume Information */
2122 	dasd_eckd_read_vol_info(device);
2123 
2124 	/* Read Extent Pool Information */
2125 	dasd_eckd_read_ext_pool_info(device);
2126 
2127 	/* Read Device Characteristics */
2128 	rc = dasd_generic_read_dev_chars(device, DASD_ECKD_MAGIC,
2129 					 &private->rdc_data, 64);
2130 	if (rc) {
2131 		DBF_EVENT_DEVID(DBF_WARNING, device->cdev,
2132 				"Read device characteristic failed, rc=%d", rc);
2133 		goto out_err3;
2134 	}
2135 
2136 	if ((device->features & DASD_FEATURE_USERAW) &&
2137 	    !(private->rdc_data.facilities.RT_in_LR)) {
2138 		dev_err(&device->cdev->dev, "The storage server does not "
2139 			"support raw-track access\n");
2140 		rc = -EINVAL;
2141 		goto out_err3;
2142 	}
2143 
2144 	/* find the valid cylinder size */
2145 	if (private->rdc_data.no_cyl == LV_COMPAT_CYL &&
2146 	    private->rdc_data.long_no_cyl)
2147 		private->real_cyl = private->rdc_data.long_no_cyl;
2148 	else
2149 		private->real_cyl = private->rdc_data.no_cyl;
2150 
2151 	private->fcx_max_data = get_fcx_max_data(device);
2152 
2153 	readonly = dasd_device_is_ro(device);
2154 	if (readonly)
2155 		set_bit(DASD_FLAG_DEVICE_RO, &device->flags);
2156 
2157 	dev_info(&device->cdev->dev, "New DASD %04X/%02X (CU %04X/%02X) "
2158 		 "with %d cylinders, %d heads, %d sectors%s\n",
2159 		 private->rdc_data.dev_type,
2160 		 private->rdc_data.dev_model,
2161 		 private->rdc_data.cu_type,
2162 		 private->rdc_data.cu_model.model,
2163 		 private->real_cyl,
2164 		 private->rdc_data.trk_per_cyl,
2165 		 private->rdc_data.sec_per_trk,
2166 		 readonly ? ", read-only device" : "");
2167 	return 0;
2168 
2169 out_err3:
2170 	dasd_alias_disconnect_device_from_lcu(device);
2171 out_err2:
2172 	dasd_free_block(device->block);
2173 	device->block = NULL;
2174 out_err1:
2175 	dasd_eckd_clear_conf_data(device);
2176 	kfree(device->private);
2177 	device->private = NULL;
2178 	return rc;
2179 }
2180 
2181 static void dasd_eckd_uncheck_device(struct dasd_device *device)
2182 {
2183 	struct dasd_eckd_private *private = device->private;
2184 
2185 	if (!private)
2186 		return;
2187 
2188 	dasd_alias_disconnect_device_from_lcu(device);
2189 	private->ned = NULL;
2190 	private->sneq = NULL;
2191 	private->vdsneq = NULL;
2192 	private->gneq = NULL;
2193 	dasd_eckd_clear_conf_data(device);
2194 }
2195 
2196 static struct dasd_ccw_req *
2197 dasd_eckd_analysis_ccw(struct dasd_device *device)
2198 {
2199 	struct dasd_eckd_private *private = device->private;
2200 	struct eckd_count *count_data;
2201 	struct LO_eckd_data *LO_data;
2202 	struct dasd_ccw_req *cqr;
2203 	struct ccw1 *ccw;
2204 	int cplength, datasize;
2205 	int i;
2206 
2207 	cplength = 8;
2208 	datasize = sizeof(struct DE_eckd_data) + 2*sizeof(struct LO_eckd_data);
2209 	cqr = dasd_smalloc_request(DASD_ECKD_MAGIC, cplength, datasize, device,
2210 				   NULL);
2211 	if (IS_ERR(cqr))
2212 		return cqr;
2213 	ccw = cqr->cpaddr;
2214 	/* Define extent for the first 2 tracks. */
2215 	define_extent(ccw++, cqr->data, 0, 1,
2216 		      DASD_ECKD_CCW_READ_COUNT, device, 0);
2217 	LO_data = cqr->data + sizeof(struct DE_eckd_data);
2218 	/* Locate record for the first 4 records on track 0. */
2219 	ccw[-1].flags |= CCW_FLAG_CC;
2220 	locate_record(ccw++, LO_data++, 0, 0, 4,
2221 		      DASD_ECKD_CCW_READ_COUNT, device, 0);
2222 
2223 	count_data = private->count_area;
2224 	for (i = 0; i < 4; i++) {
2225 		ccw[-1].flags |= CCW_FLAG_CC;
2226 		ccw->cmd_code = DASD_ECKD_CCW_READ_COUNT;
2227 		ccw->flags = 0;
2228 		ccw->count = 8;
2229 		ccw->cda = (__u32)(addr_t) count_data;
2230 		ccw++;
2231 		count_data++;
2232 	}
2233 
2234 	/* Locate record for the first record on track 1. */
2235 	ccw[-1].flags |= CCW_FLAG_CC;
2236 	locate_record(ccw++, LO_data++, 1, 0, 1,
2237 		      DASD_ECKD_CCW_READ_COUNT, device, 0);
2238 	/* Read count ccw. */
2239 	ccw[-1].flags |= CCW_FLAG_CC;
2240 	ccw->cmd_code = DASD_ECKD_CCW_READ_COUNT;
2241 	ccw->flags = 0;
2242 	ccw->count = 8;
2243 	ccw->cda = (__u32)(addr_t) count_data;
2244 
2245 	cqr->block = NULL;
2246 	cqr->startdev = device;
2247 	cqr->memdev = device;
2248 	cqr->retries = 255;
2249 	cqr->buildclk = get_tod_clock();
2250 	cqr->status = DASD_CQR_FILLED;
2251 	/* Set flags to suppress output for expected errors */
2252 	set_bit(DASD_CQR_SUPPRESS_NRF, &cqr->flags);
2253 
2254 	return cqr;
2255 }
2256 
2257 /* differentiate between 'no record found' and any other error */
2258 static int dasd_eckd_analysis_evaluation(struct dasd_ccw_req *init_cqr)
2259 {
2260 	char *sense;
2261 	if (init_cqr->status == DASD_CQR_DONE)
2262 		return INIT_CQR_OK;
2263 	else if (init_cqr->status == DASD_CQR_NEED_ERP ||
2264 		 init_cqr->status == DASD_CQR_FAILED) {
2265 		sense = dasd_get_sense(&init_cqr->irb);
2266 		if (sense && (sense[1] & SNS1_NO_REC_FOUND))
2267 			return INIT_CQR_UNFORMATTED;
2268 		else
2269 			return INIT_CQR_ERROR;
2270 	} else
2271 		return INIT_CQR_ERROR;
2272 }
2273 
2274 /*
2275  * This is the callback function for the init_analysis cqr. It saves
2276  * the status of the initial analysis ccw before it frees it and kicks
2277  * the device to continue the startup sequence. This will call
2278  * dasd_eckd_do_analysis again (if the devices has not been marked
2279  * for deletion in the meantime).
2280  */
2281 static void dasd_eckd_analysis_callback(struct dasd_ccw_req *init_cqr,
2282 					void *data)
2283 {
2284 	struct dasd_device *device = init_cqr->startdev;
2285 	struct dasd_eckd_private *private = device->private;
2286 
2287 	private->init_cqr_status = dasd_eckd_analysis_evaluation(init_cqr);
2288 	dasd_sfree_request(init_cqr, device);
2289 	dasd_kick_device(device);
2290 }
2291 
2292 static int dasd_eckd_start_analysis(struct dasd_block *block)
2293 {
2294 	struct dasd_ccw_req *init_cqr;
2295 
2296 	init_cqr = dasd_eckd_analysis_ccw(block->base);
2297 	if (IS_ERR(init_cqr))
2298 		return PTR_ERR(init_cqr);
2299 	init_cqr->callback = dasd_eckd_analysis_callback;
2300 	init_cqr->callback_data = NULL;
2301 	init_cqr->expires = 5*HZ;
2302 	/* first try without ERP, so we can later handle unformatted
2303 	 * devices as special case
2304 	 */
2305 	clear_bit(DASD_CQR_FLAGS_USE_ERP, &init_cqr->flags);
2306 	init_cqr->retries = 0;
2307 	dasd_add_request_head(init_cqr);
2308 	return -EAGAIN;
2309 }
2310 
2311 static int dasd_eckd_end_analysis(struct dasd_block *block)
2312 {
2313 	struct dasd_device *device = block->base;
2314 	struct dasd_eckd_private *private = device->private;
2315 	struct eckd_count *count_area;
2316 	unsigned int sb, blk_per_trk;
2317 	int status, i;
2318 	struct dasd_ccw_req *init_cqr;
2319 
2320 	status = private->init_cqr_status;
2321 	private->init_cqr_status = -1;
2322 	if (status == INIT_CQR_ERROR) {
2323 		/* try again, this time with full ERP */
2324 		init_cqr = dasd_eckd_analysis_ccw(device);
2325 		dasd_sleep_on(init_cqr);
2326 		status = dasd_eckd_analysis_evaluation(init_cqr);
2327 		dasd_sfree_request(init_cqr, device);
2328 	}
2329 
2330 	if (device->features & DASD_FEATURE_USERAW) {
2331 		block->bp_block = DASD_RAW_BLOCKSIZE;
2332 		blk_per_trk = DASD_RAW_BLOCK_PER_TRACK;
2333 		block->s2b_shift = 3;
2334 		goto raw;
2335 	}
2336 
2337 	if (status == INIT_CQR_UNFORMATTED) {
2338 		dev_warn(&device->cdev->dev, "The DASD is not formatted\n");
2339 		return -EMEDIUMTYPE;
2340 	} else if (status == INIT_CQR_ERROR) {
2341 		dev_err(&device->cdev->dev,
2342 			"Detecting the DASD disk layout failed because "
2343 			"of an I/O error\n");
2344 		return -EIO;
2345 	}
2346 
2347 	private->uses_cdl = 1;
2348 	/* Check Track 0 for Compatible Disk Layout */
2349 	count_area = NULL;
2350 	for (i = 0; i < 3; i++) {
2351 		if (private->count_area[i].kl != 4 ||
2352 		    private->count_area[i].dl != dasd_eckd_cdl_reclen(i) - 4 ||
2353 		    private->count_area[i].cyl != 0 ||
2354 		    private->count_area[i].head != count_area_head[i] ||
2355 		    private->count_area[i].record != count_area_rec[i]) {
2356 			private->uses_cdl = 0;
2357 			break;
2358 		}
2359 	}
2360 	if (i == 3)
2361 		count_area = &private->count_area[3];
2362 
2363 	if (private->uses_cdl == 0) {
2364 		for (i = 0; i < 5; i++) {
2365 			if ((private->count_area[i].kl != 0) ||
2366 			    (private->count_area[i].dl !=
2367 			     private->count_area[0].dl) ||
2368 			    private->count_area[i].cyl !=  0 ||
2369 			    private->count_area[i].head != count_area_head[i] ||
2370 			    private->count_area[i].record != count_area_rec[i])
2371 				break;
2372 		}
2373 		if (i == 5)
2374 			count_area = &private->count_area[0];
2375 	} else {
2376 		if (private->count_area[3].record == 1)
2377 			dev_warn(&device->cdev->dev,
2378 				 "Track 0 has no records following the VTOC\n");
2379 	}
2380 
2381 	if (count_area != NULL && count_area->kl == 0) {
2382 		/* we found notthing violating our disk layout */
2383 		if (dasd_check_blocksize(count_area->dl) == 0)
2384 			block->bp_block = count_area->dl;
2385 	}
2386 	if (block->bp_block == 0) {
2387 		dev_warn(&device->cdev->dev,
2388 			 "The disk layout of the DASD is not supported\n");
2389 		return -EMEDIUMTYPE;
2390 	}
2391 	block->s2b_shift = 0;	/* bits to shift 512 to get a block */
2392 	for (sb = 512; sb < block->bp_block; sb = sb << 1)
2393 		block->s2b_shift++;
2394 
2395 	blk_per_trk = recs_per_track(&private->rdc_data, 0, block->bp_block);
2396 
2397 raw:
2398 	block->blocks = ((unsigned long) private->real_cyl *
2399 			  private->rdc_data.trk_per_cyl *
2400 			  blk_per_trk);
2401 
2402 	dev_info(&device->cdev->dev,
2403 		 "DASD with %u KB/block, %lu KB total size, %u KB/track, "
2404 		 "%s\n", (block->bp_block >> 10),
2405 		 (((unsigned long) private->real_cyl *
2406 		   private->rdc_data.trk_per_cyl *
2407 		   blk_per_trk * (block->bp_block >> 9)) >> 1),
2408 		 ((blk_per_trk * block->bp_block) >> 10),
2409 		 private->uses_cdl ?
2410 		 "compatible disk layout" : "linux disk layout");
2411 
2412 	return 0;
2413 }
2414 
2415 static int dasd_eckd_do_analysis(struct dasd_block *block)
2416 {
2417 	struct dasd_eckd_private *private = block->base->private;
2418 
2419 	if (private->init_cqr_status < 0)
2420 		return dasd_eckd_start_analysis(block);
2421 	else
2422 		return dasd_eckd_end_analysis(block);
2423 }
2424 
2425 static int dasd_eckd_basic_to_ready(struct dasd_device *device)
2426 {
2427 	return dasd_alias_add_device(device);
2428 };
2429 
2430 static int dasd_eckd_online_to_ready(struct dasd_device *device)
2431 {
2432 	if (cancel_work_sync(&device->reload_device))
2433 		dasd_put_device(device);
2434 	if (cancel_work_sync(&device->kick_validate))
2435 		dasd_put_device(device);
2436 
2437 	return 0;
2438 };
2439 
2440 static int dasd_eckd_basic_to_known(struct dasd_device *device)
2441 {
2442 	return dasd_alias_remove_device(device);
2443 };
2444 
2445 static int
2446 dasd_eckd_fill_geometry(struct dasd_block *block, struct hd_geometry *geo)
2447 {
2448 	struct dasd_eckd_private *private = block->base->private;
2449 
2450 	if (dasd_check_blocksize(block->bp_block) == 0) {
2451 		geo->sectors = recs_per_track(&private->rdc_data,
2452 					      0, block->bp_block);
2453 	}
2454 	geo->cylinders = private->rdc_data.no_cyl;
2455 	geo->heads = private->rdc_data.trk_per_cyl;
2456 	return 0;
2457 }
2458 
2459 /*
2460  * Build the TCW request for the format check
2461  */
2462 static struct dasd_ccw_req *
2463 dasd_eckd_build_check_tcw(struct dasd_device *base, struct format_data_t *fdata,
2464 			  int enable_pav, struct eckd_count *fmt_buffer,
2465 			  int rpt)
2466 {
2467 	struct dasd_eckd_private *start_priv;
2468 	struct dasd_device *startdev = NULL;
2469 	struct tidaw *last_tidaw = NULL;
2470 	struct dasd_ccw_req *cqr;
2471 	struct itcw *itcw;
2472 	int itcw_size;
2473 	int count;
2474 	int rc;
2475 	int i;
2476 
2477 	if (enable_pav)
2478 		startdev = dasd_alias_get_start_dev(base);
2479 
2480 	if (!startdev)
2481 		startdev = base;
2482 
2483 	start_priv = startdev->private;
2484 
2485 	count = rpt * (fdata->stop_unit - fdata->start_unit + 1);
2486 
2487 	/*
2488 	 * we're adding 'count' amount of tidaw to the itcw.
2489 	 * calculate the corresponding itcw_size
2490 	 */
2491 	itcw_size = itcw_calc_size(0, count, 0);
2492 
2493 	cqr = dasd_fmalloc_request(DASD_ECKD_MAGIC, 0, itcw_size, startdev);
2494 	if (IS_ERR(cqr))
2495 		return cqr;
2496 
2497 	start_priv->count++;
2498 
2499 	itcw = itcw_init(cqr->data, itcw_size, ITCW_OP_READ, 0, count, 0);
2500 	if (IS_ERR(itcw)) {
2501 		rc = -EINVAL;
2502 		goto out_err;
2503 	}
2504 
2505 	cqr->cpaddr = itcw_get_tcw(itcw);
2506 	rc = prepare_itcw(itcw, fdata->start_unit, fdata->stop_unit,
2507 			  DASD_ECKD_CCW_READ_COUNT_MT, base, startdev, 0, count,
2508 			  sizeof(struct eckd_count),
2509 			  count * sizeof(struct eckd_count), 0, rpt);
2510 	if (rc)
2511 		goto out_err;
2512 
2513 	for (i = 0; i < count; i++) {
2514 		last_tidaw = itcw_add_tidaw(itcw, 0, fmt_buffer++,
2515 					    sizeof(struct eckd_count));
2516 		if (IS_ERR(last_tidaw)) {
2517 			rc = -EINVAL;
2518 			goto out_err;
2519 		}
2520 	}
2521 
2522 	last_tidaw->flags |= TIDAW_FLAGS_LAST;
2523 	itcw_finalize(itcw);
2524 
2525 	cqr->cpmode = 1;
2526 	cqr->startdev = startdev;
2527 	cqr->memdev = startdev;
2528 	cqr->basedev = base;
2529 	cqr->retries = startdev->default_retries;
2530 	cqr->expires = startdev->default_expires * HZ;
2531 	cqr->buildclk = get_tod_clock();
2532 	cqr->status = DASD_CQR_FILLED;
2533 	/* Set flags to suppress output for expected errors */
2534 	set_bit(DASD_CQR_SUPPRESS_FP, &cqr->flags);
2535 	set_bit(DASD_CQR_SUPPRESS_IL, &cqr->flags);
2536 
2537 	return cqr;
2538 
2539 out_err:
2540 	dasd_sfree_request(cqr, startdev);
2541 
2542 	return ERR_PTR(rc);
2543 }
2544 
2545 /*
2546  * Build the CCW request for the format check
2547  */
2548 static struct dasd_ccw_req *
2549 dasd_eckd_build_check(struct dasd_device *base, struct format_data_t *fdata,
2550 		      int enable_pav, struct eckd_count *fmt_buffer, int rpt)
2551 {
2552 	struct dasd_eckd_private *start_priv;
2553 	struct dasd_eckd_private *base_priv;
2554 	struct dasd_device *startdev = NULL;
2555 	struct dasd_ccw_req *cqr;
2556 	struct ccw1 *ccw;
2557 	void *data;
2558 	int cplength, datasize;
2559 	int use_prefix;
2560 	int count;
2561 	int i;
2562 
2563 	if (enable_pav)
2564 		startdev = dasd_alias_get_start_dev(base);
2565 
2566 	if (!startdev)
2567 		startdev = base;
2568 
2569 	start_priv = startdev->private;
2570 	base_priv = base->private;
2571 
2572 	count = rpt * (fdata->stop_unit - fdata->start_unit + 1);
2573 
2574 	use_prefix = base_priv->features.feature[8] & 0x01;
2575 
2576 	if (use_prefix) {
2577 		cplength = 1;
2578 		datasize = sizeof(struct PFX_eckd_data);
2579 	} else {
2580 		cplength = 2;
2581 		datasize = sizeof(struct DE_eckd_data) +
2582 			sizeof(struct LO_eckd_data);
2583 	}
2584 	cplength += count;
2585 
2586 	cqr = dasd_fmalloc_request(DASD_ECKD_MAGIC, cplength, datasize, startdev);
2587 	if (IS_ERR(cqr))
2588 		return cqr;
2589 
2590 	start_priv->count++;
2591 	data = cqr->data;
2592 	ccw = cqr->cpaddr;
2593 
2594 	if (use_prefix) {
2595 		prefix_LRE(ccw++, data, fdata->start_unit, fdata->stop_unit,
2596 			   DASD_ECKD_CCW_READ_COUNT, base, startdev, 1, 0,
2597 			   count, 0, 0);
2598 	} else {
2599 		define_extent(ccw++, data, fdata->start_unit, fdata->stop_unit,
2600 			      DASD_ECKD_CCW_READ_COUNT, startdev, 0);
2601 
2602 		data += sizeof(struct DE_eckd_data);
2603 		ccw[-1].flags |= CCW_FLAG_CC;
2604 
2605 		locate_record(ccw++, data, fdata->start_unit, 0, count,
2606 			      DASD_ECKD_CCW_READ_COUNT, base, 0);
2607 	}
2608 
2609 	for (i = 0; i < count; i++) {
2610 		ccw[-1].flags |= CCW_FLAG_CC;
2611 		ccw->cmd_code = DASD_ECKD_CCW_READ_COUNT;
2612 		ccw->flags = CCW_FLAG_SLI;
2613 		ccw->count = 8;
2614 		ccw->cda = (__u32)(addr_t) fmt_buffer;
2615 		ccw++;
2616 		fmt_buffer++;
2617 	}
2618 
2619 	cqr->startdev = startdev;
2620 	cqr->memdev = startdev;
2621 	cqr->basedev = base;
2622 	cqr->retries = DASD_RETRIES;
2623 	cqr->expires = startdev->default_expires * HZ;
2624 	cqr->buildclk = get_tod_clock();
2625 	cqr->status = DASD_CQR_FILLED;
2626 	/* Set flags to suppress output for expected errors */
2627 	set_bit(DASD_CQR_SUPPRESS_NRF, &cqr->flags);
2628 
2629 	return cqr;
2630 }
2631 
2632 static struct dasd_ccw_req *
2633 dasd_eckd_build_format(struct dasd_device *base, struct dasd_device *startdev,
2634 		       struct format_data_t *fdata, int enable_pav)
2635 {
2636 	struct dasd_eckd_private *base_priv;
2637 	struct dasd_eckd_private *start_priv;
2638 	struct dasd_ccw_req *fcp;
2639 	struct eckd_count *ect;
2640 	struct ch_t address;
2641 	struct ccw1 *ccw;
2642 	void *data;
2643 	int rpt;
2644 	int cplength, datasize;
2645 	int i, j;
2646 	int intensity = 0;
2647 	int r0_perm;
2648 	int nr_tracks;
2649 	int use_prefix;
2650 
2651 	if (enable_pav)
2652 		startdev = dasd_alias_get_start_dev(base);
2653 
2654 	if (!startdev)
2655 		startdev = base;
2656 
2657 	start_priv = startdev->private;
2658 	base_priv = base->private;
2659 
2660 	rpt = recs_per_track(&base_priv->rdc_data, 0, fdata->blksize);
2661 
2662 	nr_tracks = fdata->stop_unit - fdata->start_unit + 1;
2663 
2664 	/*
2665 	 * fdata->intensity is a bit string that tells us what to do:
2666 	 *   Bit 0: write record zero
2667 	 *   Bit 1: write home address, currently not supported
2668 	 *   Bit 2: invalidate tracks
2669 	 *   Bit 3: use OS/390 compatible disk layout (cdl)
2670 	 *   Bit 4: do not allow storage subsystem to modify record zero
2671 	 * Only some bit combinations do make sense.
2672 	 */
2673 	if (fdata->intensity & 0x10) {
2674 		r0_perm = 0;
2675 		intensity = fdata->intensity & ~0x10;
2676 	} else {
2677 		r0_perm = 1;
2678 		intensity = fdata->intensity;
2679 	}
2680 
2681 	use_prefix = base_priv->features.feature[8] & 0x01;
2682 
2683 	switch (intensity) {
2684 	case 0x00:	/* Normal format */
2685 	case 0x08:	/* Normal format, use cdl. */
2686 		cplength = 2 + (rpt*nr_tracks);
2687 		if (use_prefix)
2688 			datasize = sizeof(struct PFX_eckd_data) +
2689 				sizeof(struct LO_eckd_data) +
2690 				rpt * nr_tracks * sizeof(struct eckd_count);
2691 		else
2692 			datasize = sizeof(struct DE_eckd_data) +
2693 				sizeof(struct LO_eckd_data) +
2694 				rpt * nr_tracks * sizeof(struct eckd_count);
2695 		break;
2696 	case 0x01:	/* Write record zero and format track. */
2697 	case 0x09:	/* Write record zero and format track, use cdl. */
2698 		cplength = 2 + rpt * nr_tracks;
2699 		if (use_prefix)
2700 			datasize = sizeof(struct PFX_eckd_data) +
2701 				sizeof(struct LO_eckd_data) +
2702 				sizeof(struct eckd_count) +
2703 				rpt * nr_tracks * sizeof(struct eckd_count);
2704 		else
2705 			datasize = sizeof(struct DE_eckd_data) +
2706 				sizeof(struct LO_eckd_data) +
2707 				sizeof(struct eckd_count) +
2708 				rpt * nr_tracks * sizeof(struct eckd_count);
2709 		break;
2710 	case 0x04:	/* Invalidate track. */
2711 	case 0x0c:	/* Invalidate track, use cdl. */
2712 		cplength = 3;
2713 		if (use_prefix)
2714 			datasize = sizeof(struct PFX_eckd_data) +
2715 				sizeof(struct LO_eckd_data) +
2716 				sizeof(struct eckd_count);
2717 		else
2718 			datasize = sizeof(struct DE_eckd_data) +
2719 				sizeof(struct LO_eckd_data) +
2720 				sizeof(struct eckd_count);
2721 		break;
2722 	default:
2723 		dev_warn(&startdev->cdev->dev,
2724 			 "An I/O control call used incorrect flags 0x%x\n",
2725 			 fdata->intensity);
2726 		return ERR_PTR(-EINVAL);
2727 	}
2728 
2729 	fcp = dasd_fmalloc_request(DASD_ECKD_MAGIC, cplength, datasize, startdev);
2730 	if (IS_ERR(fcp))
2731 		return fcp;
2732 
2733 	start_priv->count++;
2734 	data = fcp->data;
2735 	ccw = fcp->cpaddr;
2736 
2737 	switch (intensity & ~0x08) {
2738 	case 0x00: /* Normal format. */
2739 		if (use_prefix) {
2740 			prefix(ccw++, (struct PFX_eckd_data *) data,
2741 			       fdata->start_unit, fdata->stop_unit,
2742 			       DASD_ECKD_CCW_WRITE_CKD, base, startdev);
2743 			/* grant subsystem permission to format R0 */
2744 			if (r0_perm)
2745 				((struct PFX_eckd_data *)data)
2746 					->define_extent.ga_extended |= 0x04;
2747 			data += sizeof(struct PFX_eckd_data);
2748 		} else {
2749 			define_extent(ccw++, (struct DE_eckd_data *) data,
2750 				      fdata->start_unit, fdata->stop_unit,
2751 				      DASD_ECKD_CCW_WRITE_CKD, startdev, 0);
2752 			/* grant subsystem permission to format R0 */
2753 			if (r0_perm)
2754 				((struct DE_eckd_data *) data)
2755 					->ga_extended |= 0x04;
2756 			data += sizeof(struct DE_eckd_data);
2757 		}
2758 		ccw[-1].flags |= CCW_FLAG_CC;
2759 		locate_record(ccw++, (struct LO_eckd_data *) data,
2760 			      fdata->start_unit, 0, rpt*nr_tracks,
2761 			      DASD_ECKD_CCW_WRITE_CKD, base,
2762 			      fdata->blksize);
2763 		data += sizeof(struct LO_eckd_data);
2764 		break;
2765 	case 0x01: /* Write record zero + format track. */
2766 		if (use_prefix) {
2767 			prefix(ccw++, (struct PFX_eckd_data *) data,
2768 			       fdata->start_unit, fdata->stop_unit,
2769 			       DASD_ECKD_CCW_WRITE_RECORD_ZERO,
2770 			       base, startdev);
2771 			data += sizeof(struct PFX_eckd_data);
2772 		} else {
2773 			define_extent(ccw++, (struct DE_eckd_data *) data,
2774 			       fdata->start_unit, fdata->stop_unit,
2775 			       DASD_ECKD_CCW_WRITE_RECORD_ZERO, startdev, 0);
2776 			data += sizeof(struct DE_eckd_data);
2777 		}
2778 		ccw[-1].flags |= CCW_FLAG_CC;
2779 		locate_record(ccw++, (struct LO_eckd_data *) data,
2780 			      fdata->start_unit, 0, rpt * nr_tracks + 1,
2781 			      DASD_ECKD_CCW_WRITE_RECORD_ZERO, base,
2782 			      base->block->bp_block);
2783 		data += sizeof(struct LO_eckd_data);
2784 		break;
2785 	case 0x04: /* Invalidate track. */
2786 		if (use_prefix) {
2787 			prefix(ccw++, (struct PFX_eckd_data *) data,
2788 			       fdata->start_unit, fdata->stop_unit,
2789 			       DASD_ECKD_CCW_WRITE_CKD, base, startdev);
2790 			data += sizeof(struct PFX_eckd_data);
2791 		} else {
2792 			define_extent(ccw++, (struct DE_eckd_data *) data,
2793 			       fdata->start_unit, fdata->stop_unit,
2794 			       DASD_ECKD_CCW_WRITE_CKD, startdev, 0);
2795 			data += sizeof(struct DE_eckd_data);
2796 		}
2797 		ccw[-1].flags |= CCW_FLAG_CC;
2798 		locate_record(ccw++, (struct LO_eckd_data *) data,
2799 			      fdata->start_unit, 0, 1,
2800 			      DASD_ECKD_CCW_WRITE_CKD, base, 8);
2801 		data += sizeof(struct LO_eckd_data);
2802 		break;
2803 	}
2804 
2805 	for (j = 0; j < nr_tracks; j++) {
2806 		/* calculate cylinder and head for the current track */
2807 		set_ch_t(&address,
2808 			 (fdata->start_unit + j) /
2809 			 base_priv->rdc_data.trk_per_cyl,
2810 			 (fdata->start_unit + j) %
2811 			 base_priv->rdc_data.trk_per_cyl);
2812 		if (intensity & 0x01) {	/* write record zero */
2813 			ect = (struct eckd_count *) data;
2814 			data += sizeof(struct eckd_count);
2815 			ect->cyl = address.cyl;
2816 			ect->head = address.head;
2817 			ect->record = 0;
2818 			ect->kl = 0;
2819 			ect->dl = 8;
2820 			ccw[-1].flags |= CCW_FLAG_CC;
2821 			ccw->cmd_code = DASD_ECKD_CCW_WRITE_RECORD_ZERO;
2822 			ccw->flags = CCW_FLAG_SLI;
2823 			ccw->count = 8;
2824 			ccw->cda = (__u32)(addr_t) ect;
2825 			ccw++;
2826 		}
2827 		if ((intensity & ~0x08) & 0x04) {	/* erase track */
2828 			ect = (struct eckd_count *) data;
2829 			data += sizeof(struct eckd_count);
2830 			ect->cyl = address.cyl;
2831 			ect->head = address.head;
2832 			ect->record = 1;
2833 			ect->kl = 0;
2834 			ect->dl = 0;
2835 			ccw[-1].flags |= CCW_FLAG_CC;
2836 			ccw->cmd_code = DASD_ECKD_CCW_WRITE_CKD;
2837 			ccw->flags = CCW_FLAG_SLI;
2838 			ccw->count = 8;
2839 			ccw->cda = (__u32)(addr_t) ect;
2840 		} else {		/* write remaining records */
2841 			for (i = 0; i < rpt; i++) {
2842 				ect = (struct eckd_count *) data;
2843 				data += sizeof(struct eckd_count);
2844 				ect->cyl = address.cyl;
2845 				ect->head = address.head;
2846 				ect->record = i + 1;
2847 				ect->kl = 0;
2848 				ect->dl = fdata->blksize;
2849 				/*
2850 				 * Check for special tracks 0-1
2851 				 * when formatting CDL
2852 				 */
2853 				if ((intensity & 0x08) &&
2854 				    address.cyl == 0 && address.head == 0) {
2855 					if (i < 3) {
2856 						ect->kl = 4;
2857 						ect->dl = sizes_trk0[i] - 4;
2858 					}
2859 				}
2860 				if ((intensity & 0x08) &&
2861 				    address.cyl == 0 && address.head == 1) {
2862 					ect->kl = 44;
2863 					ect->dl = LABEL_SIZE - 44;
2864 				}
2865 				ccw[-1].flags |= CCW_FLAG_CC;
2866 				if (i != 0 || j == 0)
2867 					ccw->cmd_code =
2868 						DASD_ECKD_CCW_WRITE_CKD;
2869 				else
2870 					ccw->cmd_code =
2871 						DASD_ECKD_CCW_WRITE_CKD_MT;
2872 				ccw->flags = CCW_FLAG_SLI;
2873 				ccw->count = 8;
2874 				ccw->cda = (__u32)(addr_t) ect;
2875 				ccw++;
2876 			}
2877 		}
2878 	}
2879 
2880 	fcp->startdev = startdev;
2881 	fcp->memdev = startdev;
2882 	fcp->basedev = base;
2883 	fcp->retries = 256;
2884 	fcp->expires = startdev->default_expires * HZ;
2885 	fcp->buildclk = get_tod_clock();
2886 	fcp->status = DASD_CQR_FILLED;
2887 
2888 	return fcp;
2889 }
2890 
2891 /*
2892  * Wrapper function to build a CCW request depending on input data
2893  */
2894 static struct dasd_ccw_req *
2895 dasd_eckd_format_build_ccw_req(struct dasd_device *base,
2896 			       struct format_data_t *fdata, int enable_pav,
2897 			       int tpm, struct eckd_count *fmt_buffer, int rpt)
2898 {
2899 	struct dasd_ccw_req *ccw_req;
2900 
2901 	if (!fmt_buffer) {
2902 		ccw_req = dasd_eckd_build_format(base, NULL, fdata, enable_pav);
2903 	} else {
2904 		if (tpm)
2905 			ccw_req = dasd_eckd_build_check_tcw(base, fdata,
2906 							    enable_pav,
2907 							    fmt_buffer, rpt);
2908 		else
2909 			ccw_req = dasd_eckd_build_check(base, fdata, enable_pav,
2910 							fmt_buffer, rpt);
2911 	}
2912 
2913 	return ccw_req;
2914 }
2915 
2916 /*
2917  * Sanity checks on format_data
2918  */
2919 static int dasd_eckd_format_sanity_checks(struct dasd_device *base,
2920 					  struct format_data_t *fdata)
2921 {
2922 	struct dasd_eckd_private *private = base->private;
2923 
2924 	if (fdata->start_unit >=
2925 	    (private->real_cyl * private->rdc_data.trk_per_cyl)) {
2926 		dev_warn(&base->cdev->dev,
2927 			 "Start track number %u used in formatting is too big\n",
2928 			 fdata->start_unit);
2929 		return -EINVAL;
2930 	}
2931 	if (fdata->stop_unit >=
2932 	    (private->real_cyl * private->rdc_data.trk_per_cyl)) {
2933 		dev_warn(&base->cdev->dev,
2934 			 "Stop track number %u used in formatting is too big\n",
2935 			 fdata->stop_unit);
2936 		return -EINVAL;
2937 	}
2938 	if (fdata->start_unit > fdata->stop_unit) {
2939 		dev_warn(&base->cdev->dev,
2940 			 "Start track %u used in formatting exceeds end track\n",
2941 			 fdata->start_unit);
2942 		return -EINVAL;
2943 	}
2944 	if (dasd_check_blocksize(fdata->blksize) != 0) {
2945 		dev_warn(&base->cdev->dev,
2946 			 "The DASD cannot be formatted with block size %u\n",
2947 			 fdata->blksize);
2948 		return -EINVAL;
2949 	}
2950 	return 0;
2951 }
2952 
2953 /*
2954  * This function will process format_data originally coming from an IOCTL
2955  */
2956 static int dasd_eckd_format_process_data(struct dasd_device *base,
2957 					 struct format_data_t *fdata,
2958 					 int enable_pav, int tpm,
2959 					 struct eckd_count *fmt_buffer, int rpt,
2960 					 struct irb *irb)
2961 {
2962 	struct dasd_eckd_private *private = base->private;
2963 	struct dasd_ccw_req *cqr, *n;
2964 	struct list_head format_queue;
2965 	struct dasd_device *device;
2966 	char *sense = NULL;
2967 	int old_start, old_stop, format_step;
2968 	int step, retry;
2969 	int rc;
2970 
2971 	rc = dasd_eckd_format_sanity_checks(base, fdata);
2972 	if (rc)
2973 		return rc;
2974 
2975 	INIT_LIST_HEAD(&format_queue);
2976 
2977 	old_start = fdata->start_unit;
2978 	old_stop = fdata->stop_unit;
2979 
2980 	if (!tpm && fmt_buffer != NULL) {
2981 		/* Command Mode / Format Check */
2982 		format_step = 1;
2983 	} else if (tpm && fmt_buffer != NULL) {
2984 		/* Transport Mode / Format Check */
2985 		format_step = DASD_CQR_MAX_CCW / rpt;
2986 	} else {
2987 		/* Normal Formatting */
2988 		format_step = DASD_CQR_MAX_CCW /
2989 			recs_per_track(&private->rdc_data, 0, fdata->blksize);
2990 	}
2991 
2992 	do {
2993 		retry = 0;
2994 		while (fdata->start_unit <= old_stop) {
2995 			step = fdata->stop_unit - fdata->start_unit + 1;
2996 			if (step > format_step) {
2997 				fdata->stop_unit =
2998 					fdata->start_unit + format_step - 1;
2999 			}
3000 
3001 			cqr = dasd_eckd_format_build_ccw_req(base, fdata,
3002 							     enable_pav, tpm,
3003 							     fmt_buffer, rpt);
3004 			if (IS_ERR(cqr)) {
3005 				rc = PTR_ERR(cqr);
3006 				if (rc == -ENOMEM) {
3007 					if (list_empty(&format_queue))
3008 						goto out;
3009 					/*
3010 					 * not enough memory available, start
3011 					 * requests retry after first requests
3012 					 * were finished
3013 					 */
3014 					retry = 1;
3015 					break;
3016 				}
3017 				goto out_err;
3018 			}
3019 			list_add_tail(&cqr->blocklist, &format_queue);
3020 
3021 			if (fmt_buffer) {
3022 				step = fdata->stop_unit - fdata->start_unit + 1;
3023 				fmt_buffer += rpt * step;
3024 			}
3025 			fdata->start_unit = fdata->stop_unit + 1;
3026 			fdata->stop_unit = old_stop;
3027 		}
3028 
3029 		rc = dasd_sleep_on_queue(&format_queue);
3030 
3031 out_err:
3032 		list_for_each_entry_safe(cqr, n, &format_queue, blocklist) {
3033 			device = cqr->startdev;
3034 			private = device->private;
3035 
3036 			if (cqr->status == DASD_CQR_FAILED) {
3037 				/*
3038 				 * Only get sense data if called by format
3039 				 * check
3040 				 */
3041 				if (fmt_buffer && irb) {
3042 					sense = dasd_get_sense(&cqr->irb);
3043 					memcpy(irb, &cqr->irb, sizeof(*irb));
3044 				}
3045 				rc = -EIO;
3046 			}
3047 			list_del_init(&cqr->blocklist);
3048 			dasd_ffree_request(cqr, device);
3049 			private->count--;
3050 		}
3051 
3052 		if (rc && rc != -EIO)
3053 			goto out;
3054 		if (rc == -EIO) {
3055 			/*
3056 			 * In case fewer than the expected records are on the
3057 			 * track, we will most likely get a 'No Record Found'
3058 			 * error (in command mode) or a 'File Protected' error
3059 			 * (in transport mode). Those particular cases shouldn't
3060 			 * pass the -EIO to the IOCTL, therefore reset the rc
3061 			 * and continue.
3062 			 */
3063 			if (sense &&
3064 			    (sense[1] & SNS1_NO_REC_FOUND ||
3065 			     sense[1] & SNS1_FILE_PROTECTED))
3066 				retry = 1;
3067 			else
3068 				goto out;
3069 		}
3070 
3071 	} while (retry);
3072 
3073 out:
3074 	fdata->start_unit = old_start;
3075 	fdata->stop_unit = old_stop;
3076 
3077 	return rc;
3078 }
3079 
3080 static int dasd_eckd_format_device(struct dasd_device *base,
3081 				   struct format_data_t *fdata, int enable_pav)
3082 {
3083 	return dasd_eckd_format_process_data(base, fdata, enable_pav, 0, NULL,
3084 					     0, NULL);
3085 }
3086 
3087 static bool test_and_set_format_track(struct dasd_format_entry *to_format,
3088 				      struct dasd_block *block)
3089 {
3090 	struct dasd_format_entry *format;
3091 	unsigned long flags;
3092 	bool rc = false;
3093 
3094 	spin_lock_irqsave(&block->format_lock, flags);
3095 	list_for_each_entry(format, &block->format_list, list) {
3096 		if (format->track == to_format->track) {
3097 			rc = true;
3098 			goto out;
3099 		}
3100 	}
3101 	list_add_tail(&to_format->list, &block->format_list);
3102 
3103 out:
3104 	spin_unlock_irqrestore(&block->format_lock, flags);
3105 	return rc;
3106 }
3107 
3108 static void clear_format_track(struct dasd_format_entry *format,
3109 			      struct dasd_block *block)
3110 {
3111 	unsigned long flags;
3112 
3113 	spin_lock_irqsave(&block->format_lock, flags);
3114 	list_del_init(&format->list);
3115 	spin_unlock_irqrestore(&block->format_lock, flags);
3116 }
3117 
3118 /*
3119  * Callback function to free ESE format requests.
3120  */
3121 static void dasd_eckd_ese_format_cb(struct dasd_ccw_req *cqr, void *data)
3122 {
3123 	struct dasd_device *device = cqr->startdev;
3124 	struct dasd_eckd_private *private = device->private;
3125 	struct dasd_format_entry *format = data;
3126 
3127 	clear_format_track(format, cqr->basedev->block);
3128 	private->count--;
3129 	dasd_ffree_request(cqr, device);
3130 }
3131 
3132 static struct dasd_ccw_req *
3133 dasd_eckd_ese_format(struct dasd_device *startdev, struct dasd_ccw_req *cqr,
3134 		     struct irb *irb)
3135 {
3136 	struct dasd_eckd_private *private;
3137 	struct dasd_format_entry *format;
3138 	struct format_data_t fdata;
3139 	unsigned int recs_per_trk;
3140 	struct dasd_ccw_req *fcqr;
3141 	struct dasd_device *base;
3142 	struct dasd_block *block;
3143 	unsigned int blksize;
3144 	struct request *req;
3145 	sector_t first_trk;
3146 	sector_t last_trk;
3147 	sector_t curr_trk;
3148 	int rc;
3149 
3150 	req = cqr->callback_data;
3151 	block = cqr->block;
3152 	base = block->base;
3153 	private = base->private;
3154 	blksize = block->bp_block;
3155 	recs_per_trk = recs_per_track(&private->rdc_data, 0, blksize);
3156 	format = &startdev->format_entry;
3157 
3158 	first_trk = blk_rq_pos(req) >> block->s2b_shift;
3159 	sector_div(first_trk, recs_per_trk);
3160 	last_trk =
3161 		(blk_rq_pos(req) + blk_rq_sectors(req) - 1) >> block->s2b_shift;
3162 	sector_div(last_trk, recs_per_trk);
3163 	rc = dasd_eckd_track_from_irb(irb, base, &curr_trk);
3164 	if (rc)
3165 		return ERR_PTR(rc);
3166 
3167 	if (curr_trk < first_trk || curr_trk > last_trk) {
3168 		DBF_DEV_EVENT(DBF_WARNING, startdev,
3169 			      "ESE error track %llu not within range %llu - %llu\n",
3170 			      curr_trk, first_trk, last_trk);
3171 		return ERR_PTR(-EINVAL);
3172 	}
3173 	format->track = curr_trk;
3174 	/* test if track is already in formatting by another thread */
3175 	if (test_and_set_format_track(format, block))
3176 		return ERR_PTR(-EEXIST);
3177 
3178 	fdata.start_unit = curr_trk;
3179 	fdata.stop_unit = curr_trk;
3180 	fdata.blksize = blksize;
3181 	fdata.intensity = private->uses_cdl ? DASD_FMT_INT_COMPAT : 0;
3182 
3183 	rc = dasd_eckd_format_sanity_checks(base, &fdata);
3184 	if (rc)
3185 		return ERR_PTR(-EINVAL);
3186 
3187 	/*
3188 	 * We're building the request with PAV disabled as we're reusing
3189 	 * the former startdev.
3190 	 */
3191 	fcqr = dasd_eckd_build_format(base, startdev, &fdata, 0);
3192 	if (IS_ERR(fcqr))
3193 		return fcqr;
3194 
3195 	fcqr->callback = dasd_eckd_ese_format_cb;
3196 	fcqr->callback_data = (void *) format;
3197 
3198 	return fcqr;
3199 }
3200 
3201 /*
3202  * When data is read from an unformatted area of an ESE volume, this function
3203  * returns zeroed data and thereby mimics a read of zero data.
3204  *
3205  * The first unformatted track is the one that got the NRF error, the address is
3206  * encoded in the sense data.
3207  *
3208  * All tracks before have returned valid data and should not be touched.
3209  * All tracks after the unformatted track might be formatted or not. This is
3210  * currently not known, remember the processed data and return the remainder of
3211  * the request to the blocklayer in __dasd_cleanup_cqr().
3212  */
3213 static int dasd_eckd_ese_read(struct dasd_ccw_req *cqr, struct irb *irb)
3214 {
3215 	struct dasd_eckd_private *private;
3216 	sector_t first_trk, last_trk;
3217 	sector_t first_blk, last_blk;
3218 	unsigned int blksize, off;
3219 	unsigned int recs_per_trk;
3220 	struct dasd_device *base;
3221 	struct req_iterator iter;
3222 	struct dasd_block *block;
3223 	unsigned int skip_block;
3224 	unsigned int blk_count;
3225 	struct request *req;
3226 	struct bio_vec bv;
3227 	sector_t curr_trk;
3228 	sector_t end_blk;
3229 	char *dst;
3230 	int rc;
3231 
3232 	req = (struct request *) cqr->callback_data;
3233 	base = cqr->block->base;
3234 	blksize = base->block->bp_block;
3235 	block =  cqr->block;
3236 	private = base->private;
3237 	skip_block = 0;
3238 	blk_count = 0;
3239 
3240 	recs_per_trk = recs_per_track(&private->rdc_data, 0, blksize);
3241 	first_trk = first_blk = blk_rq_pos(req) >> block->s2b_shift;
3242 	sector_div(first_trk, recs_per_trk);
3243 	last_trk = last_blk =
3244 		(blk_rq_pos(req) + blk_rq_sectors(req) - 1) >> block->s2b_shift;
3245 	sector_div(last_trk, recs_per_trk);
3246 	rc = dasd_eckd_track_from_irb(irb, base, &curr_trk);
3247 	if (rc)
3248 		return rc;
3249 
3250 	/* sanity check if the current track from sense data is valid */
3251 	if (curr_trk < first_trk || curr_trk > last_trk) {
3252 		DBF_DEV_EVENT(DBF_WARNING, base,
3253 			      "ESE error track %llu not within range %llu - %llu\n",
3254 			      curr_trk, first_trk, last_trk);
3255 		return -EINVAL;
3256 	}
3257 
3258 	/*
3259 	 * if not the first track got the NRF error we have to skip over valid
3260 	 * blocks
3261 	 */
3262 	if (curr_trk != first_trk)
3263 		skip_block = curr_trk * recs_per_trk - first_blk;
3264 
3265 	/* we have no information beyond the current track */
3266 	end_blk = (curr_trk + 1) * recs_per_trk;
3267 
3268 	rq_for_each_segment(bv, req, iter) {
3269 		dst = page_address(bv.bv_page) + bv.bv_offset;
3270 		for (off = 0; off < bv.bv_len; off += blksize) {
3271 			if (first_blk + blk_count >= end_blk) {
3272 				cqr->proc_bytes = blk_count * blksize;
3273 				return 0;
3274 			}
3275 			if (dst && !skip_block) {
3276 				dst += off;
3277 				memset(dst, 0, blksize);
3278 			} else {
3279 				skip_block--;
3280 			}
3281 			blk_count++;
3282 		}
3283 	}
3284 	return 0;
3285 }
3286 
3287 /*
3288  * Helper function to count consecutive records of a single track.
3289  */
3290 static int dasd_eckd_count_records(struct eckd_count *fmt_buffer, int start,
3291 				   int max)
3292 {
3293 	int head;
3294 	int i;
3295 
3296 	head = fmt_buffer[start].head;
3297 
3298 	/*
3299 	 * There are 3 conditions where we stop counting:
3300 	 * - if data reoccurs (same head and record may reoccur), which may
3301 	 *   happen due to the way DASD_ECKD_CCW_READ_COUNT works
3302 	 * - when the head changes, because we're iterating over several tracks
3303 	 *   then (DASD_ECKD_CCW_READ_COUNT_MT)
3304 	 * - when we've reached the end of sensible data in the buffer (the
3305 	 *   record will be 0 then)
3306 	 */
3307 	for (i = start; i < max; i++) {
3308 		if (i > start) {
3309 			if ((fmt_buffer[i].head == head &&
3310 			    fmt_buffer[i].record == 1) ||
3311 			    fmt_buffer[i].head != head ||
3312 			    fmt_buffer[i].record == 0)
3313 				break;
3314 		}
3315 	}
3316 
3317 	return i - start;
3318 }
3319 
3320 /*
3321  * Evaluate a given range of tracks. Data like number of records, blocksize,
3322  * record ids, and key length are compared with expected data.
3323  *
3324  * If a mismatch occurs, the corresponding error bit is set, as well as
3325  * additional information, depending on the error.
3326  */
3327 static void dasd_eckd_format_evaluate_tracks(struct eckd_count *fmt_buffer,
3328 					     struct format_check_t *cdata,
3329 					     int rpt_max, int rpt_exp,
3330 					     int trk_per_cyl, int tpm)
3331 {
3332 	struct ch_t geo;
3333 	int max_entries;
3334 	int count = 0;
3335 	int trkcount;
3336 	int blksize;
3337 	int pos = 0;
3338 	int i, j;
3339 	int kl;
3340 
3341 	trkcount = cdata->expect.stop_unit - cdata->expect.start_unit + 1;
3342 	max_entries = trkcount * rpt_max;
3343 
3344 	for (i = cdata->expect.start_unit; i <= cdata->expect.stop_unit; i++) {
3345 		/* Calculate the correct next starting position in the buffer */
3346 		if (tpm) {
3347 			while (fmt_buffer[pos].record == 0 &&
3348 			       fmt_buffer[pos].dl == 0) {
3349 				if (pos++ > max_entries)
3350 					break;
3351 			}
3352 		} else {
3353 			if (i != cdata->expect.start_unit)
3354 				pos += rpt_max - count;
3355 		}
3356 
3357 		/* Calculate the expected geo values for the current track */
3358 		set_ch_t(&geo, i / trk_per_cyl, i % trk_per_cyl);
3359 
3360 		/* Count and check number of records */
3361 		count = dasd_eckd_count_records(fmt_buffer, pos, pos + rpt_max);
3362 
3363 		if (count < rpt_exp) {
3364 			cdata->result = DASD_FMT_ERR_TOO_FEW_RECORDS;
3365 			break;
3366 		}
3367 		if (count > rpt_exp) {
3368 			cdata->result = DASD_FMT_ERR_TOO_MANY_RECORDS;
3369 			break;
3370 		}
3371 
3372 		for (j = 0; j < count; j++, pos++) {
3373 			blksize = cdata->expect.blksize;
3374 			kl = 0;
3375 
3376 			/*
3377 			 * Set special values when checking CDL formatted
3378 			 * devices.
3379 			 */
3380 			if ((cdata->expect.intensity & 0x08) &&
3381 			    geo.cyl == 0 && geo.head == 0) {
3382 				if (j < 3) {
3383 					blksize = sizes_trk0[j] - 4;
3384 					kl = 4;
3385 				}
3386 			}
3387 			if ((cdata->expect.intensity & 0x08) &&
3388 			    geo.cyl == 0 && geo.head == 1) {
3389 				blksize = LABEL_SIZE - 44;
3390 				kl = 44;
3391 			}
3392 
3393 			/* Check blocksize */
3394 			if (fmt_buffer[pos].dl != blksize) {
3395 				cdata->result = DASD_FMT_ERR_BLKSIZE;
3396 				goto out;
3397 			}
3398 			/* Check if key length is 0 */
3399 			if (fmt_buffer[pos].kl != kl) {
3400 				cdata->result = DASD_FMT_ERR_KEY_LENGTH;
3401 				goto out;
3402 			}
3403 			/* Check if record_id is correct */
3404 			if (fmt_buffer[pos].cyl != geo.cyl ||
3405 			    fmt_buffer[pos].head != geo.head ||
3406 			    fmt_buffer[pos].record != (j + 1)) {
3407 				cdata->result = DASD_FMT_ERR_RECORD_ID;
3408 				goto out;
3409 			}
3410 		}
3411 	}
3412 
3413 out:
3414 	/*
3415 	 * In case of no errors, we need to decrease by one
3416 	 * to get the correct positions.
3417 	 */
3418 	if (!cdata->result) {
3419 		i--;
3420 		pos--;
3421 	}
3422 
3423 	cdata->unit = i;
3424 	cdata->num_records = count;
3425 	cdata->rec = fmt_buffer[pos].record;
3426 	cdata->blksize = fmt_buffer[pos].dl;
3427 	cdata->key_length = fmt_buffer[pos].kl;
3428 }
3429 
3430 /*
3431  * Check the format of a range of tracks of a DASD.
3432  */
3433 static int dasd_eckd_check_device_format(struct dasd_device *base,
3434 					 struct format_check_t *cdata,
3435 					 int enable_pav)
3436 {
3437 	struct dasd_eckd_private *private = base->private;
3438 	struct eckd_count *fmt_buffer;
3439 	struct irb irb;
3440 	int rpt_max, rpt_exp;
3441 	int fmt_buffer_size;
3442 	int trk_per_cyl;
3443 	int trkcount;
3444 	int tpm = 0;
3445 	int rc;
3446 
3447 	trk_per_cyl = private->rdc_data.trk_per_cyl;
3448 
3449 	/* Get maximum and expected amount of records per track */
3450 	rpt_max = recs_per_track(&private->rdc_data, 0, 512) + 1;
3451 	rpt_exp = recs_per_track(&private->rdc_data, 0, cdata->expect.blksize);
3452 
3453 	trkcount = cdata->expect.stop_unit - cdata->expect.start_unit + 1;
3454 	fmt_buffer_size = trkcount * rpt_max * sizeof(struct eckd_count);
3455 
3456 	fmt_buffer = kzalloc(fmt_buffer_size, GFP_KERNEL | GFP_DMA);
3457 	if (!fmt_buffer)
3458 		return -ENOMEM;
3459 
3460 	/*
3461 	 * A certain FICON feature subset is needed to operate in transport
3462 	 * mode. Additionally, the support for transport mode is implicitly
3463 	 * checked by comparing the buffer size with fcx_max_data. As long as
3464 	 * the buffer size is smaller we can operate in transport mode and
3465 	 * process multiple tracks. If not, only one track at once is being
3466 	 * processed using command mode.
3467 	 */
3468 	if ((private->features.feature[40] & 0x04) &&
3469 	    fmt_buffer_size <= private->fcx_max_data)
3470 		tpm = 1;
3471 
3472 	rc = dasd_eckd_format_process_data(base, &cdata->expect, enable_pav,
3473 					   tpm, fmt_buffer, rpt_max, &irb);
3474 	if (rc && rc != -EIO)
3475 		goto out;
3476 	if (rc == -EIO) {
3477 		/*
3478 		 * If our first attempt with transport mode enabled comes back
3479 		 * with an incorrect length error, we're going to retry the
3480 		 * check with command mode.
3481 		 */
3482 		if (tpm && scsw_cstat(&irb.scsw) == 0x40) {
3483 			tpm = 0;
3484 			rc = dasd_eckd_format_process_data(base, &cdata->expect,
3485 							   enable_pav, tpm,
3486 							   fmt_buffer, rpt_max,
3487 							   &irb);
3488 			if (rc)
3489 				goto out;
3490 		} else {
3491 			goto out;
3492 		}
3493 	}
3494 
3495 	dasd_eckd_format_evaluate_tracks(fmt_buffer, cdata, rpt_max, rpt_exp,
3496 					 trk_per_cyl, tpm);
3497 
3498 out:
3499 	kfree(fmt_buffer);
3500 
3501 	return rc;
3502 }
3503 
3504 static void dasd_eckd_handle_terminated_request(struct dasd_ccw_req *cqr)
3505 {
3506 	if (cqr->retries < 0) {
3507 		cqr->status = DASD_CQR_FAILED;
3508 		return;
3509 	}
3510 	cqr->status = DASD_CQR_FILLED;
3511 	if (cqr->block && (cqr->startdev != cqr->block->base)) {
3512 		dasd_eckd_reset_ccw_to_base_io(cqr);
3513 		cqr->startdev = cqr->block->base;
3514 		cqr->lpm = dasd_path_get_opm(cqr->block->base);
3515 	}
3516 };
3517 
3518 static dasd_erp_fn_t
3519 dasd_eckd_erp_action(struct dasd_ccw_req * cqr)
3520 {
3521 	struct dasd_device *device = (struct dasd_device *) cqr->startdev;
3522 	struct ccw_device *cdev = device->cdev;
3523 
3524 	switch (cdev->id.cu_type) {
3525 	case 0x3990:
3526 	case 0x2105:
3527 	case 0x2107:
3528 	case 0x1750:
3529 		return dasd_3990_erp_action;
3530 	case 0x9343:
3531 	case 0x3880:
3532 	default:
3533 		return dasd_default_erp_action;
3534 	}
3535 }
3536 
3537 static dasd_erp_fn_t
3538 dasd_eckd_erp_postaction(struct dasd_ccw_req * cqr)
3539 {
3540 	return dasd_default_erp_postaction;
3541 }
3542 
3543 static void dasd_eckd_check_for_device_change(struct dasd_device *device,
3544 					      struct dasd_ccw_req *cqr,
3545 					      struct irb *irb)
3546 {
3547 	char mask;
3548 	char *sense = NULL;
3549 	struct dasd_eckd_private *private = device->private;
3550 
3551 	/* first of all check for state change pending interrupt */
3552 	mask = DEV_STAT_ATTENTION | DEV_STAT_DEV_END | DEV_STAT_UNIT_EXCEP;
3553 	if ((scsw_dstat(&irb->scsw) & mask) == mask) {
3554 		/*
3555 		 * for alias only, not in offline processing
3556 		 * and only if not suspended
3557 		 */
3558 		if (!device->block && private->lcu &&
3559 		    device->state == DASD_STATE_ONLINE &&
3560 		    !test_bit(DASD_FLAG_OFFLINE, &device->flags) &&
3561 		    !test_bit(DASD_FLAG_SUSPENDED, &device->flags)) {
3562 			/* schedule worker to reload device */
3563 			dasd_reload_device(device);
3564 		}
3565 		dasd_generic_handle_state_change(device);
3566 		return;
3567 	}
3568 
3569 	sense = dasd_get_sense(irb);
3570 	if (!sense)
3571 		return;
3572 
3573 	/* summary unit check */
3574 	if ((sense[27] & DASD_SENSE_BIT_0) && (sense[7] == 0x0D) &&
3575 	    (scsw_dstat(&irb->scsw) & DEV_STAT_UNIT_CHECK)) {
3576 		if (test_and_set_bit(DASD_FLAG_SUC, &device->flags)) {
3577 			DBF_DEV_EVENT(DBF_WARNING, device, "%s",
3578 				      "eckd suc: device already notified");
3579 			return;
3580 		}
3581 		sense = dasd_get_sense(irb);
3582 		if (!sense) {
3583 			DBF_DEV_EVENT(DBF_WARNING, device, "%s",
3584 				      "eckd suc: no reason code available");
3585 			clear_bit(DASD_FLAG_SUC, &device->flags);
3586 			return;
3587 
3588 		}
3589 		private->suc_reason = sense[8];
3590 		DBF_DEV_EVENT(DBF_NOTICE, device, "%s %x",
3591 			      "eckd handle summary unit check: reason",
3592 			      private->suc_reason);
3593 		dasd_get_device(device);
3594 		if (!schedule_work(&device->suc_work))
3595 			dasd_put_device(device);
3596 
3597 		return;
3598 	}
3599 
3600 	/* service information message SIM */
3601 	if (!cqr && !(sense[27] & DASD_SENSE_BIT_0) &&
3602 	    ((sense[6] & DASD_SIM_SENSE) == DASD_SIM_SENSE)) {
3603 		dasd_3990_erp_handle_sim(device, sense);
3604 		return;
3605 	}
3606 
3607 	/* loss of device reservation is handled via base devices only
3608 	 * as alias devices may be used with several bases
3609 	 */
3610 	if (device->block && (sense[27] & DASD_SENSE_BIT_0) &&
3611 	    (sense[7] == 0x3F) &&
3612 	    (scsw_dstat(&irb->scsw) & DEV_STAT_UNIT_CHECK) &&
3613 	    test_bit(DASD_FLAG_IS_RESERVED, &device->flags)) {
3614 		if (device->features & DASD_FEATURE_FAILONSLCK)
3615 			set_bit(DASD_FLAG_LOCK_STOLEN, &device->flags);
3616 		clear_bit(DASD_FLAG_IS_RESERVED, &device->flags);
3617 		dev_err(&device->cdev->dev,
3618 			"The device reservation was lost\n");
3619 	}
3620 }
3621 
3622 static int dasd_eckd_ras_sanity_checks(struct dasd_device *device,
3623 				       unsigned int first_trk,
3624 				       unsigned int last_trk)
3625 {
3626 	struct dasd_eckd_private *private = device->private;
3627 	unsigned int trks_per_vol;
3628 	int rc = 0;
3629 
3630 	trks_per_vol = private->real_cyl * private->rdc_data.trk_per_cyl;
3631 
3632 	if (first_trk >= trks_per_vol) {
3633 		dev_warn(&device->cdev->dev,
3634 			 "Start track number %u used in the space release command is too big\n",
3635 			 first_trk);
3636 		rc = -EINVAL;
3637 	} else if (last_trk >= trks_per_vol) {
3638 		dev_warn(&device->cdev->dev,
3639 			 "Stop track number %u used in the space release command is too big\n",
3640 			 last_trk);
3641 		rc = -EINVAL;
3642 	} else if (first_trk > last_trk) {
3643 		dev_warn(&device->cdev->dev,
3644 			 "Start track %u used in the space release command exceeds the end track\n",
3645 			 first_trk);
3646 		rc = -EINVAL;
3647 	}
3648 	return rc;
3649 }
3650 
3651 /*
3652  * Helper function to count the amount of involved extents within a given range
3653  * with extent alignment in mind.
3654  */
3655 static int count_exts(unsigned int from, unsigned int to, int trks_per_ext)
3656 {
3657 	int cur_pos = 0;
3658 	int count = 0;
3659 	int tmp;
3660 
3661 	if (from == to)
3662 		return 1;
3663 
3664 	/* Count first partial extent */
3665 	if (from % trks_per_ext != 0) {
3666 		tmp = from + trks_per_ext - (from % trks_per_ext) - 1;
3667 		if (tmp > to)
3668 			tmp = to;
3669 		cur_pos = tmp - from + 1;
3670 		count++;
3671 	}
3672 	/* Count full extents */
3673 	if (to - (from + cur_pos) + 1 >= trks_per_ext) {
3674 		tmp = to - ((to - trks_per_ext + 1) % trks_per_ext);
3675 		count += (tmp - (from + cur_pos) + 1) / trks_per_ext;
3676 		cur_pos = tmp;
3677 	}
3678 	/* Count last partial extent */
3679 	if (cur_pos < to)
3680 		count++;
3681 
3682 	return count;
3683 }
3684 
3685 /*
3686  * Release allocated space for a given range or an entire volume.
3687  */
3688 static struct dasd_ccw_req *
3689 dasd_eckd_dso_ras(struct dasd_device *device, struct dasd_block *block,
3690 		  struct request *req, unsigned int first_trk,
3691 		  unsigned int last_trk, int by_extent)
3692 {
3693 	struct dasd_eckd_private *private = device->private;
3694 	struct dasd_dso_ras_ext_range *ras_range;
3695 	struct dasd_rssd_features *features;
3696 	struct dasd_dso_ras_data *ras_data;
3697 	u16 heads, beg_head, end_head;
3698 	int cur_to_trk, cur_from_trk;
3699 	struct dasd_ccw_req *cqr;
3700 	u32 beg_cyl, end_cyl;
3701 	struct ccw1 *ccw;
3702 	int trks_per_ext;
3703 	size_t ras_size;
3704 	size_t size;
3705 	int nr_exts;
3706 	void *rq;
3707 	int i;
3708 
3709 	if (dasd_eckd_ras_sanity_checks(device, first_trk, last_trk))
3710 		return ERR_PTR(-EINVAL);
3711 
3712 	rq = req ? blk_mq_rq_to_pdu(req) : NULL;
3713 
3714 	features = &private->features;
3715 
3716 	trks_per_ext = dasd_eckd_ext_size(device) * private->rdc_data.trk_per_cyl;
3717 	nr_exts = 0;
3718 	if (by_extent)
3719 		nr_exts = count_exts(first_trk, last_trk, trks_per_ext);
3720 	ras_size = sizeof(*ras_data);
3721 	size = ras_size + (nr_exts * sizeof(*ras_range));
3722 
3723 	cqr = dasd_smalloc_request(DASD_ECKD_MAGIC, 1, size, device, rq);
3724 	if (IS_ERR(cqr)) {
3725 		DBF_EVENT_DEVID(DBF_WARNING, device->cdev, "%s",
3726 				"Could not allocate RAS request");
3727 		return cqr;
3728 	}
3729 
3730 	ras_data = cqr->data;
3731 	memset(ras_data, 0, size);
3732 
3733 	ras_data->order = DSO_ORDER_RAS;
3734 	ras_data->flags.vol_type = 0; /* CKD volume */
3735 	/* Release specified extents or entire volume */
3736 	ras_data->op_flags.by_extent = by_extent;
3737 	/*
3738 	 * This bit guarantees initialisation of tracks within an extent that is
3739 	 * not fully specified, but is only supported with a certain feature
3740 	 * subset.
3741 	 */
3742 	ras_data->op_flags.guarantee_init = !!(features->feature[56] & 0x01);
3743 	ras_data->lss = private->ned->ID;
3744 	ras_data->dev_addr = private->ned->unit_addr;
3745 	ras_data->nr_exts = nr_exts;
3746 
3747 	if (by_extent) {
3748 		heads = private->rdc_data.trk_per_cyl;
3749 		cur_from_trk = first_trk;
3750 		cur_to_trk = first_trk + trks_per_ext -
3751 			(first_trk % trks_per_ext) - 1;
3752 		if (cur_to_trk > last_trk)
3753 			cur_to_trk = last_trk;
3754 		ras_range = (struct dasd_dso_ras_ext_range *)(cqr->data + ras_size);
3755 
3756 		for (i = 0; i < nr_exts; i++) {
3757 			beg_cyl = cur_from_trk / heads;
3758 			beg_head = cur_from_trk % heads;
3759 			end_cyl = cur_to_trk / heads;
3760 			end_head = cur_to_trk % heads;
3761 
3762 			set_ch_t(&ras_range->beg_ext, beg_cyl, beg_head);
3763 			set_ch_t(&ras_range->end_ext, end_cyl, end_head);
3764 
3765 			cur_from_trk = cur_to_trk + 1;
3766 			cur_to_trk = cur_from_trk + trks_per_ext - 1;
3767 			if (cur_to_trk > last_trk)
3768 				cur_to_trk = last_trk;
3769 			ras_range++;
3770 		}
3771 	}
3772 
3773 	ccw = cqr->cpaddr;
3774 	ccw->cda = (__u32)(addr_t)cqr->data;
3775 	ccw->cmd_code = DASD_ECKD_CCW_DSO;
3776 	ccw->count = size;
3777 
3778 	cqr->startdev = device;
3779 	cqr->memdev = device;
3780 	cqr->block = block;
3781 	cqr->retries = 256;
3782 	cqr->expires = device->default_expires * HZ;
3783 	cqr->buildclk = get_tod_clock();
3784 	cqr->status = DASD_CQR_FILLED;
3785 
3786 	return cqr;
3787 }
3788 
3789 static int dasd_eckd_release_space_full(struct dasd_device *device)
3790 {
3791 	struct dasd_ccw_req *cqr;
3792 	int rc;
3793 
3794 	cqr = dasd_eckd_dso_ras(device, NULL, NULL, 0, 0, 0);
3795 	if (IS_ERR(cqr))
3796 		return PTR_ERR(cqr);
3797 
3798 	rc = dasd_sleep_on_interruptible(cqr);
3799 
3800 	dasd_sfree_request(cqr, cqr->memdev);
3801 
3802 	return rc;
3803 }
3804 
3805 static int dasd_eckd_release_space_trks(struct dasd_device *device,
3806 					unsigned int from, unsigned int to)
3807 {
3808 	struct dasd_eckd_private *private = device->private;
3809 	struct dasd_block *block = device->block;
3810 	struct dasd_ccw_req *cqr, *n;
3811 	struct list_head ras_queue;
3812 	unsigned int device_exts;
3813 	int trks_per_ext;
3814 	int stop, step;
3815 	int cur_pos;
3816 	int rc = 0;
3817 	int retry;
3818 
3819 	INIT_LIST_HEAD(&ras_queue);
3820 
3821 	device_exts = private->real_cyl / dasd_eckd_ext_size(device);
3822 	trks_per_ext = dasd_eckd_ext_size(device) * private->rdc_data.trk_per_cyl;
3823 
3824 	/* Make sure device limits are not exceeded */
3825 	step = trks_per_ext * min(device_exts, DASD_ECKD_RAS_EXTS_MAX);
3826 	cur_pos = from;
3827 
3828 	do {
3829 		retry = 0;
3830 		while (cur_pos < to) {
3831 			stop = cur_pos + step -
3832 				((cur_pos + step) % trks_per_ext) - 1;
3833 			if (stop > to)
3834 				stop = to;
3835 
3836 			cqr = dasd_eckd_dso_ras(device, NULL, NULL, cur_pos, stop, 1);
3837 			if (IS_ERR(cqr)) {
3838 				rc = PTR_ERR(cqr);
3839 				if (rc == -ENOMEM) {
3840 					if (list_empty(&ras_queue))
3841 						goto out;
3842 					retry = 1;
3843 					break;
3844 				}
3845 				goto err_out;
3846 			}
3847 
3848 			spin_lock_irq(&block->queue_lock);
3849 			list_add_tail(&cqr->blocklist, &ras_queue);
3850 			spin_unlock_irq(&block->queue_lock);
3851 			cur_pos = stop + 1;
3852 		}
3853 
3854 		rc = dasd_sleep_on_queue_interruptible(&ras_queue);
3855 
3856 err_out:
3857 		list_for_each_entry_safe(cqr, n, &ras_queue, blocklist) {
3858 			device = cqr->startdev;
3859 			private = device->private;
3860 
3861 			spin_lock_irq(&block->queue_lock);
3862 			list_del_init(&cqr->blocklist);
3863 			spin_unlock_irq(&block->queue_lock);
3864 			dasd_sfree_request(cqr, device);
3865 			private->count--;
3866 		}
3867 	} while (retry);
3868 
3869 out:
3870 	return rc;
3871 }
3872 
3873 static int dasd_eckd_release_space(struct dasd_device *device,
3874 				   struct format_data_t *rdata)
3875 {
3876 	if (rdata->intensity & DASD_FMT_INT_ESE_FULL)
3877 		return dasd_eckd_release_space_full(device);
3878 	else if (rdata->intensity == 0)
3879 		return dasd_eckd_release_space_trks(device, rdata->start_unit,
3880 						    rdata->stop_unit);
3881 	else
3882 		return -EINVAL;
3883 }
3884 
3885 static struct dasd_ccw_req *dasd_eckd_build_cp_cmd_single(
3886 					       struct dasd_device *startdev,
3887 					       struct dasd_block *block,
3888 					       struct request *req,
3889 					       sector_t first_rec,
3890 					       sector_t last_rec,
3891 					       sector_t first_trk,
3892 					       sector_t last_trk,
3893 					       unsigned int first_offs,
3894 					       unsigned int last_offs,
3895 					       unsigned int blk_per_trk,
3896 					       unsigned int blksize)
3897 {
3898 	struct dasd_eckd_private *private;
3899 	unsigned long *idaws;
3900 	struct LO_eckd_data *LO_data;
3901 	struct dasd_ccw_req *cqr;
3902 	struct ccw1 *ccw;
3903 	struct req_iterator iter;
3904 	struct bio_vec bv;
3905 	char *dst;
3906 	unsigned int off;
3907 	int count, cidaw, cplength, datasize;
3908 	sector_t recid;
3909 	unsigned char cmd, rcmd;
3910 	int use_prefix;
3911 	struct dasd_device *basedev;
3912 
3913 	basedev = block->base;
3914 	private = basedev->private;
3915 	if (rq_data_dir(req) == READ)
3916 		cmd = DASD_ECKD_CCW_READ_MT;
3917 	else if (rq_data_dir(req) == WRITE)
3918 		cmd = DASD_ECKD_CCW_WRITE_MT;
3919 	else
3920 		return ERR_PTR(-EINVAL);
3921 
3922 	/* Check struct bio and count the number of blocks for the request. */
3923 	count = 0;
3924 	cidaw = 0;
3925 	rq_for_each_segment(bv, req, iter) {
3926 		if (bv.bv_len & (blksize - 1))
3927 			/* Eckd can only do full blocks. */
3928 			return ERR_PTR(-EINVAL);
3929 		count += bv.bv_len >> (block->s2b_shift + 9);
3930 		if (idal_is_needed (page_address(bv.bv_page), bv.bv_len))
3931 			cidaw += bv.bv_len >> (block->s2b_shift + 9);
3932 	}
3933 	/* Paranoia. */
3934 	if (count != last_rec - first_rec + 1)
3935 		return ERR_PTR(-EINVAL);
3936 
3937 	/* use the prefix command if available */
3938 	use_prefix = private->features.feature[8] & 0x01;
3939 	if (use_prefix) {
3940 		/* 1x prefix + number of blocks */
3941 		cplength = 2 + count;
3942 		/* 1x prefix + cidaws*sizeof(long) */
3943 		datasize = sizeof(struct PFX_eckd_data) +
3944 			sizeof(struct LO_eckd_data) +
3945 			cidaw * sizeof(unsigned long);
3946 	} else {
3947 		/* 1x define extent + 1x locate record + number of blocks */
3948 		cplength = 2 + count;
3949 		/* 1x define extent + 1x locate record + cidaws*sizeof(long) */
3950 		datasize = sizeof(struct DE_eckd_data) +
3951 			sizeof(struct LO_eckd_data) +
3952 			cidaw * sizeof(unsigned long);
3953 	}
3954 	/* Find out the number of additional locate record ccws for cdl. */
3955 	if (private->uses_cdl && first_rec < 2*blk_per_trk) {
3956 		if (last_rec >= 2*blk_per_trk)
3957 			count = 2*blk_per_trk - first_rec;
3958 		cplength += count;
3959 		datasize += count*sizeof(struct LO_eckd_data);
3960 	}
3961 	/* Allocate the ccw request. */
3962 	cqr = dasd_smalloc_request(DASD_ECKD_MAGIC, cplength, datasize,
3963 				   startdev, blk_mq_rq_to_pdu(req));
3964 	if (IS_ERR(cqr))
3965 		return cqr;
3966 	ccw = cqr->cpaddr;
3967 	/* First ccw is define extent or prefix. */
3968 	if (use_prefix) {
3969 		if (prefix(ccw++, cqr->data, first_trk,
3970 			   last_trk, cmd, basedev, startdev) == -EAGAIN) {
3971 			/* Clock not in sync and XRC is enabled.
3972 			 * Try again later.
3973 			 */
3974 			dasd_sfree_request(cqr, startdev);
3975 			return ERR_PTR(-EAGAIN);
3976 		}
3977 		idaws = (unsigned long *) (cqr->data +
3978 					   sizeof(struct PFX_eckd_data));
3979 	} else {
3980 		if (define_extent(ccw++, cqr->data, first_trk,
3981 				  last_trk, cmd, basedev, 0) == -EAGAIN) {
3982 			/* Clock not in sync and XRC is enabled.
3983 			 * Try again later.
3984 			 */
3985 			dasd_sfree_request(cqr, startdev);
3986 			return ERR_PTR(-EAGAIN);
3987 		}
3988 		idaws = (unsigned long *) (cqr->data +
3989 					   sizeof(struct DE_eckd_data));
3990 	}
3991 	/* Build locate_record+read/write/ccws. */
3992 	LO_data = (struct LO_eckd_data *) (idaws + cidaw);
3993 	recid = first_rec;
3994 	if (private->uses_cdl == 0 || recid > 2*blk_per_trk) {
3995 		/* Only standard blocks so there is just one locate record. */
3996 		ccw[-1].flags |= CCW_FLAG_CC;
3997 		locate_record(ccw++, LO_data++, first_trk, first_offs + 1,
3998 			      last_rec - recid + 1, cmd, basedev, blksize);
3999 	}
4000 	rq_for_each_segment(bv, req, iter) {
4001 		dst = page_address(bv.bv_page) + bv.bv_offset;
4002 		if (dasd_page_cache) {
4003 			char *copy = kmem_cache_alloc(dasd_page_cache,
4004 						      GFP_DMA | __GFP_NOWARN);
4005 			if (copy && rq_data_dir(req) == WRITE)
4006 				memcpy(copy + bv.bv_offset, dst, bv.bv_len);
4007 			if (copy)
4008 				dst = copy + bv.bv_offset;
4009 		}
4010 		for (off = 0; off < bv.bv_len; off += blksize) {
4011 			sector_t trkid = recid;
4012 			unsigned int recoffs = sector_div(trkid, blk_per_trk);
4013 			rcmd = cmd;
4014 			count = blksize;
4015 			/* Locate record for cdl special block ? */
4016 			if (private->uses_cdl && recid < 2*blk_per_trk) {
4017 				if (dasd_eckd_cdl_special(blk_per_trk, recid)){
4018 					rcmd |= 0x8;
4019 					count = dasd_eckd_cdl_reclen(recid);
4020 					if (count < blksize &&
4021 					    rq_data_dir(req) == READ)
4022 						memset(dst + count, 0xe5,
4023 						       blksize - count);
4024 				}
4025 				ccw[-1].flags |= CCW_FLAG_CC;
4026 				locate_record(ccw++, LO_data++,
4027 					      trkid, recoffs + 1,
4028 					      1, rcmd, basedev, count);
4029 			}
4030 			/* Locate record for standard blocks ? */
4031 			if (private->uses_cdl && recid == 2*blk_per_trk) {
4032 				ccw[-1].flags |= CCW_FLAG_CC;
4033 				locate_record(ccw++, LO_data++,
4034 					      trkid, recoffs + 1,
4035 					      last_rec - recid + 1,
4036 					      cmd, basedev, count);
4037 			}
4038 			/* Read/write ccw. */
4039 			ccw[-1].flags |= CCW_FLAG_CC;
4040 			ccw->cmd_code = rcmd;
4041 			ccw->count = count;
4042 			if (idal_is_needed(dst, blksize)) {
4043 				ccw->cda = (__u32)(addr_t) idaws;
4044 				ccw->flags = CCW_FLAG_IDA;
4045 				idaws = idal_create_words(idaws, dst, blksize);
4046 			} else {
4047 				ccw->cda = (__u32)(addr_t) dst;
4048 				ccw->flags = 0;
4049 			}
4050 			ccw++;
4051 			dst += blksize;
4052 			recid++;
4053 		}
4054 	}
4055 	if (blk_noretry_request(req) ||
4056 	    block->base->features & DASD_FEATURE_FAILFAST)
4057 		set_bit(DASD_CQR_FLAGS_FAILFAST, &cqr->flags);
4058 	cqr->startdev = startdev;
4059 	cqr->memdev = startdev;
4060 	cqr->block = block;
4061 	cqr->expires = startdev->default_expires * HZ;	/* default 5 minutes */
4062 	cqr->lpm = dasd_path_get_ppm(startdev);
4063 	cqr->retries = startdev->default_retries;
4064 	cqr->buildclk = get_tod_clock();
4065 	cqr->status = DASD_CQR_FILLED;
4066 
4067 	/* Set flags to suppress output for expected errors */
4068 	if (dasd_eckd_is_ese(basedev)) {
4069 		set_bit(DASD_CQR_SUPPRESS_FP, &cqr->flags);
4070 		set_bit(DASD_CQR_SUPPRESS_IL, &cqr->flags);
4071 		set_bit(DASD_CQR_SUPPRESS_NRF, &cqr->flags);
4072 	}
4073 
4074 	return cqr;
4075 }
4076 
4077 static struct dasd_ccw_req *dasd_eckd_build_cp_cmd_track(
4078 					       struct dasd_device *startdev,
4079 					       struct dasd_block *block,
4080 					       struct request *req,
4081 					       sector_t first_rec,
4082 					       sector_t last_rec,
4083 					       sector_t first_trk,
4084 					       sector_t last_trk,
4085 					       unsigned int first_offs,
4086 					       unsigned int last_offs,
4087 					       unsigned int blk_per_trk,
4088 					       unsigned int blksize)
4089 {
4090 	unsigned long *idaws;
4091 	struct dasd_ccw_req *cqr;
4092 	struct ccw1 *ccw;
4093 	struct req_iterator iter;
4094 	struct bio_vec bv;
4095 	char *dst, *idaw_dst;
4096 	unsigned int cidaw, cplength, datasize;
4097 	unsigned int tlf;
4098 	sector_t recid;
4099 	unsigned char cmd;
4100 	struct dasd_device *basedev;
4101 	unsigned int trkcount, count, count_to_trk_end;
4102 	unsigned int idaw_len, seg_len, part_len, len_to_track_end;
4103 	unsigned char new_track, end_idaw;
4104 	sector_t trkid;
4105 	unsigned int recoffs;
4106 
4107 	basedev = block->base;
4108 	if (rq_data_dir(req) == READ)
4109 		cmd = DASD_ECKD_CCW_READ_TRACK_DATA;
4110 	else if (rq_data_dir(req) == WRITE)
4111 		cmd = DASD_ECKD_CCW_WRITE_TRACK_DATA;
4112 	else
4113 		return ERR_PTR(-EINVAL);
4114 
4115 	/* Track based I/O needs IDAWs for each page, and not just for
4116 	 * 64 bit addresses. We need additional idals for pages
4117 	 * that get filled from two tracks, so we use the number
4118 	 * of records as upper limit.
4119 	 */
4120 	cidaw = last_rec - first_rec + 1;
4121 	trkcount = last_trk - first_trk + 1;
4122 
4123 	/* 1x prefix + one read/write ccw per track */
4124 	cplength = 1 + trkcount;
4125 
4126 	datasize = sizeof(struct PFX_eckd_data) + cidaw * sizeof(unsigned long);
4127 
4128 	/* Allocate the ccw request. */
4129 	cqr = dasd_smalloc_request(DASD_ECKD_MAGIC, cplength, datasize,
4130 				   startdev, blk_mq_rq_to_pdu(req));
4131 	if (IS_ERR(cqr))
4132 		return cqr;
4133 	ccw = cqr->cpaddr;
4134 	/* transfer length factor: how many bytes to read from the last track */
4135 	if (first_trk == last_trk)
4136 		tlf = last_offs - first_offs + 1;
4137 	else
4138 		tlf = last_offs + 1;
4139 	tlf *= blksize;
4140 
4141 	if (prefix_LRE(ccw++, cqr->data, first_trk,
4142 		       last_trk, cmd, basedev, startdev,
4143 		       1 /* format */, first_offs + 1,
4144 		       trkcount, blksize,
4145 		       tlf) == -EAGAIN) {
4146 		/* Clock not in sync and XRC is enabled.
4147 		 * Try again later.
4148 		 */
4149 		dasd_sfree_request(cqr, startdev);
4150 		return ERR_PTR(-EAGAIN);
4151 	}
4152 
4153 	/*
4154 	 * The translation of request into ccw programs must meet the
4155 	 * following conditions:
4156 	 * - all idaws but the first and the last must address full pages
4157 	 *   (or 2K blocks on 31-bit)
4158 	 * - the scope of a ccw and it's idal ends with the track boundaries
4159 	 */
4160 	idaws = (unsigned long *) (cqr->data + sizeof(struct PFX_eckd_data));
4161 	recid = first_rec;
4162 	new_track = 1;
4163 	end_idaw = 0;
4164 	len_to_track_end = 0;
4165 	idaw_dst = NULL;
4166 	idaw_len = 0;
4167 	rq_for_each_segment(bv, req, iter) {
4168 		dst = page_address(bv.bv_page) + bv.bv_offset;
4169 		seg_len = bv.bv_len;
4170 		while (seg_len) {
4171 			if (new_track) {
4172 				trkid = recid;
4173 				recoffs = sector_div(trkid, blk_per_trk);
4174 				count_to_trk_end = blk_per_trk - recoffs;
4175 				count = min((last_rec - recid + 1),
4176 					    (sector_t)count_to_trk_end);
4177 				len_to_track_end = count * blksize;
4178 				ccw[-1].flags |= CCW_FLAG_CC;
4179 				ccw->cmd_code = cmd;
4180 				ccw->count = len_to_track_end;
4181 				ccw->cda = (__u32)(addr_t)idaws;
4182 				ccw->flags = CCW_FLAG_IDA;
4183 				ccw++;
4184 				recid += count;
4185 				new_track = 0;
4186 				/* first idaw for a ccw may start anywhere */
4187 				if (!idaw_dst)
4188 					idaw_dst = dst;
4189 			}
4190 			/* If we start a new idaw, we must make sure that it
4191 			 * starts on an IDA_BLOCK_SIZE boundary.
4192 			 * If we continue an idaw, we must make sure that the
4193 			 * current segment begins where the so far accumulated
4194 			 * idaw ends
4195 			 */
4196 			if (!idaw_dst) {
4197 				if (__pa(dst) & (IDA_BLOCK_SIZE-1)) {
4198 					dasd_sfree_request(cqr, startdev);
4199 					return ERR_PTR(-ERANGE);
4200 				} else
4201 					idaw_dst = dst;
4202 			}
4203 			if ((idaw_dst + idaw_len) != dst) {
4204 				dasd_sfree_request(cqr, startdev);
4205 				return ERR_PTR(-ERANGE);
4206 			}
4207 			part_len = min(seg_len, len_to_track_end);
4208 			seg_len -= part_len;
4209 			dst += part_len;
4210 			idaw_len += part_len;
4211 			len_to_track_end -= part_len;
4212 			/* collected memory area ends on an IDA_BLOCK border,
4213 			 * -> create an idaw
4214 			 * idal_create_words will handle cases where idaw_len
4215 			 * is larger then IDA_BLOCK_SIZE
4216 			 */
4217 			if (!(__pa(idaw_dst + idaw_len) & (IDA_BLOCK_SIZE-1)))
4218 				end_idaw = 1;
4219 			/* We also need to end the idaw at track end */
4220 			if (!len_to_track_end) {
4221 				new_track = 1;
4222 				end_idaw = 1;
4223 			}
4224 			if (end_idaw) {
4225 				idaws = idal_create_words(idaws, idaw_dst,
4226 							  idaw_len);
4227 				idaw_dst = NULL;
4228 				idaw_len = 0;
4229 				end_idaw = 0;
4230 			}
4231 		}
4232 	}
4233 
4234 	if (blk_noretry_request(req) ||
4235 	    block->base->features & DASD_FEATURE_FAILFAST)
4236 		set_bit(DASD_CQR_FLAGS_FAILFAST, &cqr->flags);
4237 	cqr->startdev = startdev;
4238 	cqr->memdev = startdev;
4239 	cqr->block = block;
4240 	cqr->expires = startdev->default_expires * HZ;	/* default 5 minutes */
4241 	cqr->lpm = dasd_path_get_ppm(startdev);
4242 	cqr->retries = startdev->default_retries;
4243 	cqr->buildclk = get_tod_clock();
4244 	cqr->status = DASD_CQR_FILLED;
4245 
4246 	/* Set flags to suppress output for expected errors */
4247 	if (dasd_eckd_is_ese(basedev))
4248 		set_bit(DASD_CQR_SUPPRESS_NRF, &cqr->flags);
4249 
4250 	return cqr;
4251 }
4252 
4253 static int prepare_itcw(struct itcw *itcw,
4254 			unsigned int trk, unsigned int totrk, int cmd,
4255 			struct dasd_device *basedev,
4256 			struct dasd_device *startdev,
4257 			unsigned int rec_on_trk, int count,
4258 			unsigned int blksize,
4259 			unsigned int total_data_size,
4260 			unsigned int tlf,
4261 			unsigned int blk_per_trk)
4262 {
4263 	struct PFX_eckd_data pfxdata;
4264 	struct dasd_eckd_private *basepriv, *startpriv;
4265 	struct DE_eckd_data *dedata;
4266 	struct LRE_eckd_data *lredata;
4267 	struct dcw *dcw;
4268 
4269 	u32 begcyl, endcyl;
4270 	u16 heads, beghead, endhead;
4271 	u8 pfx_cmd;
4272 
4273 	int rc = 0;
4274 	int sector = 0;
4275 	int dn, d;
4276 
4277 
4278 	/* setup prefix data */
4279 	basepriv = basedev->private;
4280 	startpriv = startdev->private;
4281 	dedata = &pfxdata.define_extent;
4282 	lredata = &pfxdata.locate_record;
4283 
4284 	memset(&pfxdata, 0, sizeof(pfxdata));
4285 	pfxdata.format = 1; /* PFX with LRE */
4286 	pfxdata.base_address = basepriv->ned->unit_addr;
4287 	pfxdata.base_lss = basepriv->ned->ID;
4288 	pfxdata.validity.define_extent = 1;
4289 
4290 	/* private uid is kept up to date, conf_data may be outdated */
4291 	if (startpriv->uid.type == UA_BASE_PAV_ALIAS)
4292 		pfxdata.validity.verify_base = 1;
4293 
4294 	if (startpriv->uid.type == UA_HYPER_PAV_ALIAS) {
4295 		pfxdata.validity.verify_base = 1;
4296 		pfxdata.validity.hyper_pav = 1;
4297 	}
4298 
4299 	switch (cmd) {
4300 	case DASD_ECKD_CCW_READ_TRACK_DATA:
4301 		dedata->mask.perm = 0x1;
4302 		dedata->attributes.operation = basepriv->attrib.operation;
4303 		dedata->blk_size = blksize;
4304 		dedata->ga_extended |= 0x42;
4305 		lredata->operation.orientation = 0x0;
4306 		lredata->operation.operation = 0x0C;
4307 		lredata->auxiliary.check_bytes = 0x01;
4308 		pfx_cmd = DASD_ECKD_CCW_PFX_READ;
4309 		break;
4310 	case DASD_ECKD_CCW_WRITE_TRACK_DATA:
4311 		dedata->mask.perm = 0x02;
4312 		dedata->attributes.operation = basepriv->attrib.operation;
4313 		dedata->blk_size = blksize;
4314 		rc = set_timestamp(NULL, dedata, basedev);
4315 		dedata->ga_extended |= 0x42;
4316 		lredata->operation.orientation = 0x0;
4317 		lredata->operation.operation = 0x3F;
4318 		lredata->extended_operation = 0x23;
4319 		lredata->auxiliary.check_bytes = 0x2;
4320 		/*
4321 		 * If XRC is supported the System Time Stamp is set. The
4322 		 * validity of the time stamp must be reflected in the prefix
4323 		 * data as well.
4324 		 */
4325 		if (dedata->ga_extended & 0x08 && dedata->ga_extended & 0x02)
4326 			pfxdata.validity.time_stamp = 1; /* 'Time Stamp Valid' */
4327 		pfx_cmd = DASD_ECKD_CCW_PFX;
4328 		break;
4329 	case DASD_ECKD_CCW_READ_COUNT_MT:
4330 		dedata->mask.perm = 0x1;
4331 		dedata->attributes.operation = DASD_BYPASS_CACHE;
4332 		dedata->ga_extended |= 0x42;
4333 		dedata->blk_size = blksize;
4334 		lredata->operation.orientation = 0x2;
4335 		lredata->operation.operation = 0x16;
4336 		lredata->auxiliary.check_bytes = 0x01;
4337 		pfx_cmd = DASD_ECKD_CCW_PFX_READ;
4338 		break;
4339 	default:
4340 		DBF_DEV_EVENT(DBF_ERR, basedev,
4341 			      "prepare itcw, unknown opcode 0x%x", cmd);
4342 		BUG();
4343 		break;
4344 	}
4345 	if (rc)
4346 		return rc;
4347 
4348 	dedata->attributes.mode = 0x3;	/* ECKD */
4349 
4350 	heads = basepriv->rdc_data.trk_per_cyl;
4351 	begcyl = trk / heads;
4352 	beghead = trk % heads;
4353 	endcyl = totrk / heads;
4354 	endhead = totrk % heads;
4355 
4356 	/* check for sequential prestage - enhance cylinder range */
4357 	if (dedata->attributes.operation == DASD_SEQ_PRESTAGE ||
4358 	    dedata->attributes.operation == DASD_SEQ_ACCESS) {
4359 
4360 		if (endcyl + basepriv->attrib.nr_cyl < basepriv->real_cyl)
4361 			endcyl += basepriv->attrib.nr_cyl;
4362 		else
4363 			endcyl = (basepriv->real_cyl - 1);
4364 	}
4365 
4366 	set_ch_t(&dedata->beg_ext, begcyl, beghead);
4367 	set_ch_t(&dedata->end_ext, endcyl, endhead);
4368 
4369 	dedata->ep_format = 0x20; /* records per track is valid */
4370 	dedata->ep_rec_per_track = blk_per_trk;
4371 
4372 	if (rec_on_trk) {
4373 		switch (basepriv->rdc_data.dev_type) {
4374 		case 0x3390:
4375 			dn = ceil_quot(blksize + 6, 232);
4376 			d = 9 + ceil_quot(blksize + 6 * (dn + 1), 34);
4377 			sector = (49 + (rec_on_trk - 1) * (10 + d)) / 8;
4378 			break;
4379 		case 0x3380:
4380 			d = 7 + ceil_quot(blksize + 12, 32);
4381 			sector = (39 + (rec_on_trk - 1) * (8 + d)) / 7;
4382 			break;
4383 		}
4384 	}
4385 
4386 	if (cmd == DASD_ECKD_CCW_READ_COUNT_MT) {
4387 		lredata->auxiliary.length_valid = 0;
4388 		lredata->auxiliary.length_scope = 0;
4389 		lredata->sector = 0xff;
4390 	} else {
4391 		lredata->auxiliary.length_valid = 1;
4392 		lredata->auxiliary.length_scope = 1;
4393 		lredata->sector = sector;
4394 	}
4395 	lredata->auxiliary.imbedded_ccw_valid = 1;
4396 	lredata->length = tlf;
4397 	lredata->imbedded_ccw = cmd;
4398 	lredata->count = count;
4399 	set_ch_t(&lredata->seek_addr, begcyl, beghead);
4400 	lredata->search_arg.cyl = lredata->seek_addr.cyl;
4401 	lredata->search_arg.head = lredata->seek_addr.head;
4402 	lredata->search_arg.record = rec_on_trk;
4403 
4404 	dcw = itcw_add_dcw(itcw, pfx_cmd, 0,
4405 		     &pfxdata, sizeof(pfxdata), total_data_size);
4406 	return PTR_ERR_OR_ZERO(dcw);
4407 }
4408 
4409 static struct dasd_ccw_req *dasd_eckd_build_cp_tpm_track(
4410 					       struct dasd_device *startdev,
4411 					       struct dasd_block *block,
4412 					       struct request *req,
4413 					       sector_t first_rec,
4414 					       sector_t last_rec,
4415 					       sector_t first_trk,
4416 					       sector_t last_trk,
4417 					       unsigned int first_offs,
4418 					       unsigned int last_offs,
4419 					       unsigned int blk_per_trk,
4420 					       unsigned int blksize)
4421 {
4422 	struct dasd_ccw_req *cqr;
4423 	struct req_iterator iter;
4424 	struct bio_vec bv;
4425 	char *dst;
4426 	unsigned int trkcount, ctidaw;
4427 	unsigned char cmd;
4428 	struct dasd_device *basedev;
4429 	unsigned int tlf;
4430 	struct itcw *itcw;
4431 	struct tidaw *last_tidaw = NULL;
4432 	int itcw_op;
4433 	size_t itcw_size;
4434 	u8 tidaw_flags;
4435 	unsigned int seg_len, part_len, len_to_track_end;
4436 	unsigned char new_track;
4437 	sector_t recid, trkid;
4438 	unsigned int offs;
4439 	unsigned int count, count_to_trk_end;
4440 	int ret;
4441 
4442 	basedev = block->base;
4443 	if (rq_data_dir(req) == READ) {
4444 		cmd = DASD_ECKD_CCW_READ_TRACK_DATA;
4445 		itcw_op = ITCW_OP_READ;
4446 	} else if (rq_data_dir(req) == WRITE) {
4447 		cmd = DASD_ECKD_CCW_WRITE_TRACK_DATA;
4448 		itcw_op = ITCW_OP_WRITE;
4449 	} else
4450 		return ERR_PTR(-EINVAL);
4451 
4452 	/* trackbased I/O needs address all memory via TIDAWs,
4453 	 * not just for 64 bit addresses. This allows us to map
4454 	 * each segment directly to one tidaw.
4455 	 * In the case of write requests, additional tidaws may
4456 	 * be needed when a segment crosses a track boundary.
4457 	 */
4458 	trkcount = last_trk - first_trk + 1;
4459 	ctidaw = 0;
4460 	rq_for_each_segment(bv, req, iter) {
4461 		++ctidaw;
4462 	}
4463 	if (rq_data_dir(req) == WRITE)
4464 		ctidaw += (last_trk - first_trk);
4465 
4466 	/* Allocate the ccw request. */
4467 	itcw_size = itcw_calc_size(0, ctidaw, 0);
4468 	cqr = dasd_smalloc_request(DASD_ECKD_MAGIC, 0, itcw_size, startdev,
4469 				   blk_mq_rq_to_pdu(req));
4470 	if (IS_ERR(cqr))
4471 		return cqr;
4472 
4473 	/* transfer length factor: how many bytes to read from the last track */
4474 	if (first_trk == last_trk)
4475 		tlf = last_offs - first_offs + 1;
4476 	else
4477 		tlf = last_offs + 1;
4478 	tlf *= blksize;
4479 
4480 	itcw = itcw_init(cqr->data, itcw_size, itcw_op, 0, ctidaw, 0);
4481 	if (IS_ERR(itcw)) {
4482 		ret = -EINVAL;
4483 		goto out_error;
4484 	}
4485 	cqr->cpaddr = itcw_get_tcw(itcw);
4486 	if (prepare_itcw(itcw, first_trk, last_trk,
4487 			 cmd, basedev, startdev,
4488 			 first_offs + 1,
4489 			 trkcount, blksize,
4490 			 (last_rec - first_rec + 1) * blksize,
4491 			 tlf, blk_per_trk) == -EAGAIN) {
4492 		/* Clock not in sync and XRC is enabled.
4493 		 * Try again later.
4494 		 */
4495 		ret = -EAGAIN;
4496 		goto out_error;
4497 	}
4498 	len_to_track_end = 0;
4499 	/*
4500 	 * A tidaw can address 4k of memory, but must not cross page boundaries
4501 	 * We can let the block layer handle this by setting
4502 	 * blk_queue_segment_boundary to page boundaries and
4503 	 * blk_max_segment_size to page size when setting up the request queue.
4504 	 * For write requests, a TIDAW must not cross track boundaries, because
4505 	 * we have to set the CBC flag on the last tidaw for each track.
4506 	 */
4507 	if (rq_data_dir(req) == WRITE) {
4508 		new_track = 1;
4509 		recid = first_rec;
4510 		rq_for_each_segment(bv, req, iter) {
4511 			dst = page_address(bv.bv_page) + bv.bv_offset;
4512 			seg_len = bv.bv_len;
4513 			while (seg_len) {
4514 				if (new_track) {
4515 					trkid = recid;
4516 					offs = sector_div(trkid, blk_per_trk);
4517 					count_to_trk_end = blk_per_trk - offs;
4518 					count = min((last_rec - recid + 1),
4519 						    (sector_t)count_to_trk_end);
4520 					len_to_track_end = count * blksize;
4521 					recid += count;
4522 					new_track = 0;
4523 				}
4524 				part_len = min(seg_len, len_to_track_end);
4525 				seg_len -= part_len;
4526 				len_to_track_end -= part_len;
4527 				/* We need to end the tidaw at track end */
4528 				if (!len_to_track_end) {
4529 					new_track = 1;
4530 					tidaw_flags = TIDAW_FLAGS_INSERT_CBC;
4531 				} else
4532 					tidaw_flags = 0;
4533 				last_tidaw = itcw_add_tidaw(itcw, tidaw_flags,
4534 							    dst, part_len);
4535 				if (IS_ERR(last_tidaw)) {
4536 					ret = -EINVAL;
4537 					goto out_error;
4538 				}
4539 				dst += part_len;
4540 			}
4541 		}
4542 	} else {
4543 		rq_for_each_segment(bv, req, iter) {
4544 			dst = page_address(bv.bv_page) + bv.bv_offset;
4545 			last_tidaw = itcw_add_tidaw(itcw, 0x00,
4546 						    dst, bv.bv_len);
4547 			if (IS_ERR(last_tidaw)) {
4548 				ret = -EINVAL;
4549 				goto out_error;
4550 			}
4551 		}
4552 	}
4553 	last_tidaw->flags |= TIDAW_FLAGS_LAST;
4554 	last_tidaw->flags &= ~TIDAW_FLAGS_INSERT_CBC;
4555 	itcw_finalize(itcw);
4556 
4557 	if (blk_noretry_request(req) ||
4558 	    block->base->features & DASD_FEATURE_FAILFAST)
4559 		set_bit(DASD_CQR_FLAGS_FAILFAST, &cqr->flags);
4560 	cqr->cpmode = 1;
4561 	cqr->startdev = startdev;
4562 	cqr->memdev = startdev;
4563 	cqr->block = block;
4564 	cqr->expires = startdev->default_expires * HZ;	/* default 5 minutes */
4565 	cqr->lpm = dasd_path_get_ppm(startdev);
4566 	cqr->retries = startdev->default_retries;
4567 	cqr->buildclk = get_tod_clock();
4568 	cqr->status = DASD_CQR_FILLED;
4569 
4570 	/* Set flags to suppress output for expected errors */
4571 	if (dasd_eckd_is_ese(basedev)) {
4572 		set_bit(DASD_CQR_SUPPRESS_FP, &cqr->flags);
4573 		set_bit(DASD_CQR_SUPPRESS_IL, &cqr->flags);
4574 		set_bit(DASD_CQR_SUPPRESS_NRF, &cqr->flags);
4575 	}
4576 
4577 	return cqr;
4578 out_error:
4579 	dasd_sfree_request(cqr, startdev);
4580 	return ERR_PTR(ret);
4581 }
4582 
4583 static struct dasd_ccw_req *dasd_eckd_build_cp(struct dasd_device *startdev,
4584 					       struct dasd_block *block,
4585 					       struct request *req)
4586 {
4587 	int cmdrtd, cmdwtd;
4588 	int use_prefix;
4589 	int fcx_multitrack;
4590 	struct dasd_eckd_private *private;
4591 	struct dasd_device *basedev;
4592 	sector_t first_rec, last_rec;
4593 	sector_t first_trk, last_trk;
4594 	unsigned int first_offs, last_offs;
4595 	unsigned int blk_per_trk, blksize;
4596 	int cdlspecial;
4597 	unsigned int data_size;
4598 	struct dasd_ccw_req *cqr;
4599 
4600 	basedev = block->base;
4601 	private = basedev->private;
4602 
4603 	/* Calculate number of blocks/records per track. */
4604 	blksize = block->bp_block;
4605 	blk_per_trk = recs_per_track(&private->rdc_data, 0, blksize);
4606 	if (blk_per_trk == 0)
4607 		return ERR_PTR(-EINVAL);
4608 	/* Calculate record id of first and last block. */
4609 	first_rec = first_trk = blk_rq_pos(req) >> block->s2b_shift;
4610 	first_offs = sector_div(first_trk, blk_per_trk);
4611 	last_rec = last_trk =
4612 		(blk_rq_pos(req) + blk_rq_sectors(req) - 1) >> block->s2b_shift;
4613 	last_offs = sector_div(last_trk, blk_per_trk);
4614 	cdlspecial = (private->uses_cdl && first_rec < 2*blk_per_trk);
4615 
4616 	fcx_multitrack = private->features.feature[40] & 0x20;
4617 	data_size = blk_rq_bytes(req);
4618 	if (data_size % blksize)
4619 		return ERR_PTR(-EINVAL);
4620 	/* tpm write request add CBC data on each track boundary */
4621 	if (rq_data_dir(req) == WRITE)
4622 		data_size += (last_trk - first_trk) * 4;
4623 
4624 	/* is read track data and write track data in command mode supported? */
4625 	cmdrtd = private->features.feature[9] & 0x20;
4626 	cmdwtd = private->features.feature[12] & 0x40;
4627 	use_prefix = private->features.feature[8] & 0x01;
4628 
4629 	cqr = NULL;
4630 	if (cdlspecial || dasd_page_cache) {
4631 		/* do nothing, just fall through to the cmd mode single case */
4632 	} else if ((data_size <= private->fcx_max_data)
4633 		   && (fcx_multitrack || (first_trk == last_trk))) {
4634 		cqr = dasd_eckd_build_cp_tpm_track(startdev, block, req,
4635 						    first_rec, last_rec,
4636 						    first_trk, last_trk,
4637 						    first_offs, last_offs,
4638 						    blk_per_trk, blksize);
4639 		if (IS_ERR(cqr) && (PTR_ERR(cqr) != -EAGAIN) &&
4640 		    (PTR_ERR(cqr) != -ENOMEM))
4641 			cqr = NULL;
4642 	} else if (use_prefix &&
4643 		   (((rq_data_dir(req) == READ) && cmdrtd) ||
4644 		    ((rq_data_dir(req) == WRITE) && cmdwtd))) {
4645 		cqr = dasd_eckd_build_cp_cmd_track(startdev, block, req,
4646 						   first_rec, last_rec,
4647 						   first_trk, last_trk,
4648 						   first_offs, last_offs,
4649 						   blk_per_trk, blksize);
4650 		if (IS_ERR(cqr) && (PTR_ERR(cqr) != -EAGAIN) &&
4651 		    (PTR_ERR(cqr) != -ENOMEM))
4652 			cqr = NULL;
4653 	}
4654 	if (!cqr)
4655 		cqr = dasd_eckd_build_cp_cmd_single(startdev, block, req,
4656 						    first_rec, last_rec,
4657 						    first_trk, last_trk,
4658 						    first_offs, last_offs,
4659 						    blk_per_trk, blksize);
4660 	return cqr;
4661 }
4662 
4663 static struct dasd_ccw_req *dasd_eckd_build_cp_raw(struct dasd_device *startdev,
4664 						   struct dasd_block *block,
4665 						   struct request *req)
4666 {
4667 	sector_t start_padding_sectors, end_sector_offset, end_padding_sectors;
4668 	unsigned int seg_len, len_to_track_end;
4669 	unsigned int cidaw, cplength, datasize;
4670 	sector_t first_trk, last_trk, sectors;
4671 	struct dasd_eckd_private *base_priv;
4672 	struct dasd_device *basedev;
4673 	struct req_iterator iter;
4674 	struct dasd_ccw_req *cqr;
4675 	unsigned int first_offs;
4676 	unsigned int trkcount;
4677 	unsigned long *idaws;
4678 	unsigned int size;
4679 	unsigned char cmd;
4680 	struct bio_vec bv;
4681 	struct ccw1 *ccw;
4682 	int use_prefix;
4683 	void *data;
4684 	char *dst;
4685 
4686 	/*
4687 	 * raw track access needs to be mutiple of 64k and on 64k boundary
4688 	 * For read requests we can fix an incorrect alignment by padding
4689 	 * the request with dummy pages.
4690 	 */
4691 	start_padding_sectors = blk_rq_pos(req) % DASD_RAW_SECTORS_PER_TRACK;
4692 	end_sector_offset = (blk_rq_pos(req) + blk_rq_sectors(req)) %
4693 		DASD_RAW_SECTORS_PER_TRACK;
4694 	end_padding_sectors = (DASD_RAW_SECTORS_PER_TRACK - end_sector_offset) %
4695 		DASD_RAW_SECTORS_PER_TRACK;
4696 	basedev = block->base;
4697 	if ((start_padding_sectors || end_padding_sectors) &&
4698 	    (rq_data_dir(req) == WRITE)) {
4699 		DBF_DEV_EVENT(DBF_ERR, basedev,
4700 			      "raw write not track aligned (%llu,%llu) req %p",
4701 			      start_padding_sectors, end_padding_sectors, req);
4702 		return ERR_PTR(-EINVAL);
4703 	}
4704 
4705 	first_trk = blk_rq_pos(req) / DASD_RAW_SECTORS_PER_TRACK;
4706 	last_trk = (blk_rq_pos(req) + blk_rq_sectors(req) - 1) /
4707 		DASD_RAW_SECTORS_PER_TRACK;
4708 	trkcount = last_trk - first_trk + 1;
4709 	first_offs = 0;
4710 
4711 	if (rq_data_dir(req) == READ)
4712 		cmd = DASD_ECKD_CCW_READ_TRACK;
4713 	else if (rq_data_dir(req) == WRITE)
4714 		cmd = DASD_ECKD_CCW_WRITE_FULL_TRACK;
4715 	else
4716 		return ERR_PTR(-EINVAL);
4717 
4718 	/*
4719 	 * Raw track based I/O needs IDAWs for each page,
4720 	 * and not just for 64 bit addresses.
4721 	 */
4722 	cidaw = trkcount * DASD_RAW_BLOCK_PER_TRACK;
4723 
4724 	/*
4725 	 * struct PFX_eckd_data and struct LRE_eckd_data can have up to 2 bytes
4726 	 * of extended parameter. This is needed for write full track.
4727 	 */
4728 	base_priv = basedev->private;
4729 	use_prefix = base_priv->features.feature[8] & 0x01;
4730 	if (use_prefix) {
4731 		cplength = 1 + trkcount;
4732 		size = sizeof(struct PFX_eckd_data) + 2;
4733 	} else {
4734 		cplength = 2 + trkcount;
4735 		size = sizeof(struct DE_eckd_data) +
4736 			sizeof(struct LRE_eckd_data) + 2;
4737 	}
4738 	size = ALIGN(size, 8);
4739 
4740 	datasize = size + cidaw * sizeof(unsigned long);
4741 
4742 	/* Allocate the ccw request. */
4743 	cqr = dasd_smalloc_request(DASD_ECKD_MAGIC, cplength,
4744 				   datasize, startdev, blk_mq_rq_to_pdu(req));
4745 	if (IS_ERR(cqr))
4746 		return cqr;
4747 
4748 	ccw = cqr->cpaddr;
4749 	data = cqr->data;
4750 
4751 	if (use_prefix) {
4752 		prefix_LRE(ccw++, data, first_trk, last_trk, cmd, basedev,
4753 			   startdev, 1, first_offs + 1, trkcount, 0, 0);
4754 	} else {
4755 		define_extent(ccw++, data, first_trk, last_trk, cmd, basedev, 0);
4756 		ccw[-1].flags |= CCW_FLAG_CC;
4757 
4758 		data += sizeof(struct DE_eckd_data);
4759 		locate_record_ext(ccw++, data, first_trk, first_offs + 1,
4760 				  trkcount, cmd, basedev, 0, 0);
4761 	}
4762 
4763 	idaws = (unsigned long *)(cqr->data + size);
4764 	len_to_track_end = 0;
4765 	if (start_padding_sectors) {
4766 		ccw[-1].flags |= CCW_FLAG_CC;
4767 		ccw->cmd_code = cmd;
4768 		/* maximum 3390 track size */
4769 		ccw->count = 57326;
4770 		/* 64k map to one track */
4771 		len_to_track_end = 65536 - start_padding_sectors * 512;
4772 		ccw->cda = (__u32)(addr_t)idaws;
4773 		ccw->flags |= CCW_FLAG_IDA;
4774 		ccw->flags |= CCW_FLAG_SLI;
4775 		ccw++;
4776 		for (sectors = 0; sectors < start_padding_sectors; sectors += 8)
4777 			idaws = idal_create_words(idaws, rawpadpage, PAGE_SIZE);
4778 	}
4779 	rq_for_each_segment(bv, req, iter) {
4780 		dst = page_address(bv.bv_page) + bv.bv_offset;
4781 		seg_len = bv.bv_len;
4782 		if (cmd == DASD_ECKD_CCW_READ_TRACK)
4783 			memset(dst, 0, seg_len);
4784 		if (!len_to_track_end) {
4785 			ccw[-1].flags |= CCW_FLAG_CC;
4786 			ccw->cmd_code = cmd;
4787 			/* maximum 3390 track size */
4788 			ccw->count = 57326;
4789 			/* 64k map to one track */
4790 			len_to_track_end = 65536;
4791 			ccw->cda = (__u32)(addr_t)idaws;
4792 			ccw->flags |= CCW_FLAG_IDA;
4793 			ccw->flags |= CCW_FLAG_SLI;
4794 			ccw++;
4795 		}
4796 		len_to_track_end -= seg_len;
4797 		idaws = idal_create_words(idaws, dst, seg_len);
4798 	}
4799 	for (sectors = 0; sectors < end_padding_sectors; sectors += 8)
4800 		idaws = idal_create_words(idaws, rawpadpage, PAGE_SIZE);
4801 	if (blk_noretry_request(req) ||
4802 	    block->base->features & DASD_FEATURE_FAILFAST)
4803 		set_bit(DASD_CQR_FLAGS_FAILFAST, &cqr->flags);
4804 	cqr->startdev = startdev;
4805 	cqr->memdev = startdev;
4806 	cqr->block = block;
4807 	cqr->expires = startdev->default_expires * HZ;
4808 	cqr->lpm = dasd_path_get_ppm(startdev);
4809 	cqr->retries = startdev->default_retries;
4810 	cqr->buildclk = get_tod_clock();
4811 	cqr->status = DASD_CQR_FILLED;
4812 
4813 	return cqr;
4814 }
4815 
4816 
4817 static int
4818 dasd_eckd_free_cp(struct dasd_ccw_req *cqr, struct request *req)
4819 {
4820 	struct dasd_eckd_private *private;
4821 	struct ccw1 *ccw;
4822 	struct req_iterator iter;
4823 	struct bio_vec bv;
4824 	char *dst, *cda;
4825 	unsigned int blksize, blk_per_trk, off;
4826 	sector_t recid;
4827 	int status;
4828 
4829 	if (!dasd_page_cache)
4830 		goto out;
4831 	private = cqr->block->base->private;
4832 	blksize = cqr->block->bp_block;
4833 	blk_per_trk = recs_per_track(&private->rdc_data, 0, blksize);
4834 	recid = blk_rq_pos(req) >> cqr->block->s2b_shift;
4835 	ccw = cqr->cpaddr;
4836 	/* Skip over define extent & locate record. */
4837 	ccw++;
4838 	if (private->uses_cdl == 0 || recid > 2*blk_per_trk)
4839 		ccw++;
4840 	rq_for_each_segment(bv, req, iter) {
4841 		dst = page_address(bv.bv_page) + bv.bv_offset;
4842 		for (off = 0; off < bv.bv_len; off += blksize) {
4843 			/* Skip locate record. */
4844 			if (private->uses_cdl && recid <= 2*blk_per_trk)
4845 				ccw++;
4846 			if (dst) {
4847 				if (ccw->flags & CCW_FLAG_IDA)
4848 					cda = *((char **)((addr_t) ccw->cda));
4849 				else
4850 					cda = (char *)((addr_t) ccw->cda);
4851 				if (dst != cda) {
4852 					if (rq_data_dir(req) == READ)
4853 						memcpy(dst, cda, bv.bv_len);
4854 					kmem_cache_free(dasd_page_cache,
4855 					    (void *)((addr_t)cda & PAGE_MASK));
4856 				}
4857 				dst = NULL;
4858 			}
4859 			ccw++;
4860 			recid++;
4861 		}
4862 	}
4863 out:
4864 	status = cqr->status == DASD_CQR_DONE;
4865 	dasd_sfree_request(cqr, cqr->memdev);
4866 	return status;
4867 }
4868 
4869 /*
4870  * Modify ccw/tcw in cqr so it can be started on a base device.
4871  *
4872  * Note that this is not enough to restart the cqr!
4873  * Either reset cqr->startdev as well (summary unit check handling)
4874  * or restart via separate cqr (as in ERP handling).
4875  */
4876 void dasd_eckd_reset_ccw_to_base_io(struct dasd_ccw_req *cqr)
4877 {
4878 	struct ccw1 *ccw;
4879 	struct PFX_eckd_data *pfxdata;
4880 	struct tcw *tcw;
4881 	struct tccb *tccb;
4882 	struct dcw *dcw;
4883 
4884 	if (cqr->cpmode == 1) {
4885 		tcw = cqr->cpaddr;
4886 		tccb = tcw_get_tccb(tcw);
4887 		dcw = (struct dcw *)&tccb->tca[0];
4888 		pfxdata = (struct PFX_eckd_data *)&dcw->cd[0];
4889 		pfxdata->validity.verify_base = 0;
4890 		pfxdata->validity.hyper_pav = 0;
4891 	} else {
4892 		ccw = cqr->cpaddr;
4893 		pfxdata = cqr->data;
4894 		if (ccw->cmd_code == DASD_ECKD_CCW_PFX) {
4895 			pfxdata->validity.verify_base = 0;
4896 			pfxdata->validity.hyper_pav = 0;
4897 		}
4898 	}
4899 }
4900 
4901 #define DASD_ECKD_CHANQ_MAX_SIZE 4
4902 
4903 static struct dasd_ccw_req *dasd_eckd_build_alias_cp(struct dasd_device *base,
4904 						     struct dasd_block *block,
4905 						     struct request *req)
4906 {
4907 	struct dasd_eckd_private *private;
4908 	struct dasd_device *startdev;
4909 	unsigned long flags;
4910 	struct dasd_ccw_req *cqr;
4911 
4912 	startdev = dasd_alias_get_start_dev(base);
4913 	if (!startdev)
4914 		startdev = base;
4915 	private = startdev->private;
4916 	if (private->count >= DASD_ECKD_CHANQ_MAX_SIZE)
4917 		return ERR_PTR(-EBUSY);
4918 
4919 	spin_lock_irqsave(get_ccwdev_lock(startdev->cdev), flags);
4920 	private->count++;
4921 	if ((base->features & DASD_FEATURE_USERAW))
4922 		cqr = dasd_eckd_build_cp_raw(startdev, block, req);
4923 	else
4924 		cqr = dasd_eckd_build_cp(startdev, block, req);
4925 	if (IS_ERR(cqr))
4926 		private->count--;
4927 	spin_unlock_irqrestore(get_ccwdev_lock(startdev->cdev), flags);
4928 	return cqr;
4929 }
4930 
4931 static int dasd_eckd_free_alias_cp(struct dasd_ccw_req *cqr,
4932 				   struct request *req)
4933 {
4934 	struct dasd_eckd_private *private;
4935 	unsigned long flags;
4936 
4937 	spin_lock_irqsave(get_ccwdev_lock(cqr->memdev->cdev), flags);
4938 	private = cqr->memdev->private;
4939 	private->count--;
4940 	spin_unlock_irqrestore(get_ccwdev_lock(cqr->memdev->cdev), flags);
4941 	return dasd_eckd_free_cp(cqr, req);
4942 }
4943 
4944 static int
4945 dasd_eckd_fill_info(struct dasd_device * device,
4946 		    struct dasd_information2_t * info)
4947 {
4948 	struct dasd_eckd_private *private = device->private;
4949 
4950 	info->label_block = 2;
4951 	info->FBA_layout = private->uses_cdl ? 0 : 1;
4952 	info->format = private->uses_cdl ? DASD_FORMAT_CDL : DASD_FORMAT_LDL;
4953 	info->characteristics_size = sizeof(private->rdc_data);
4954 	memcpy(info->characteristics, &private->rdc_data,
4955 	       sizeof(private->rdc_data));
4956 	info->confdata_size = min((unsigned long)private->conf_len,
4957 				  sizeof(info->configuration_data));
4958 	memcpy(info->configuration_data, private->conf_data,
4959 	       info->confdata_size);
4960 	return 0;
4961 }
4962 
4963 /*
4964  * SECTION: ioctl functions for eckd devices.
4965  */
4966 
4967 /*
4968  * Release device ioctl.
4969  * Buils a channel programm to releases a prior reserved
4970  * (see dasd_eckd_reserve) device.
4971  */
4972 static int
4973 dasd_eckd_release(struct dasd_device *device)
4974 {
4975 	struct dasd_ccw_req *cqr;
4976 	int rc;
4977 	struct ccw1 *ccw;
4978 	int useglobal;
4979 
4980 	if (!capable(CAP_SYS_ADMIN))
4981 		return -EACCES;
4982 
4983 	useglobal = 0;
4984 	cqr = dasd_smalloc_request(DASD_ECKD_MAGIC, 1, 32, device, NULL);
4985 	if (IS_ERR(cqr)) {
4986 		mutex_lock(&dasd_reserve_mutex);
4987 		useglobal = 1;
4988 		cqr = &dasd_reserve_req->cqr;
4989 		memset(cqr, 0, sizeof(*cqr));
4990 		memset(&dasd_reserve_req->ccw, 0,
4991 		       sizeof(dasd_reserve_req->ccw));
4992 		cqr->cpaddr = &dasd_reserve_req->ccw;
4993 		cqr->data = &dasd_reserve_req->data;
4994 		cqr->magic = DASD_ECKD_MAGIC;
4995 	}
4996 	ccw = cqr->cpaddr;
4997 	ccw->cmd_code = DASD_ECKD_CCW_RELEASE;
4998 	ccw->flags |= CCW_FLAG_SLI;
4999 	ccw->count = 32;
5000 	ccw->cda = (__u32)(addr_t) cqr->data;
5001 	cqr->startdev = device;
5002 	cqr->memdev = device;
5003 	clear_bit(DASD_CQR_FLAGS_USE_ERP, &cqr->flags);
5004 	set_bit(DASD_CQR_FLAGS_FAILFAST, &cqr->flags);
5005 	cqr->retries = 2;	/* set retry counter to enable basic ERP */
5006 	cqr->expires = 2 * HZ;
5007 	cqr->buildclk = get_tod_clock();
5008 	cqr->status = DASD_CQR_FILLED;
5009 
5010 	rc = dasd_sleep_on_immediatly(cqr);
5011 	if (!rc)
5012 		clear_bit(DASD_FLAG_IS_RESERVED, &device->flags);
5013 
5014 	if (useglobal)
5015 		mutex_unlock(&dasd_reserve_mutex);
5016 	else
5017 		dasd_sfree_request(cqr, cqr->memdev);
5018 	return rc;
5019 }
5020 
5021 /*
5022  * Reserve device ioctl.
5023  * Options are set to 'synchronous wait for interrupt' and
5024  * 'timeout the request'. This leads to a terminate IO if
5025  * the interrupt is outstanding for a certain time.
5026  */
5027 static int
5028 dasd_eckd_reserve(struct dasd_device *device)
5029 {
5030 	struct dasd_ccw_req *cqr;
5031 	int rc;
5032 	struct ccw1 *ccw;
5033 	int useglobal;
5034 
5035 	if (!capable(CAP_SYS_ADMIN))
5036 		return -EACCES;
5037 
5038 	useglobal = 0;
5039 	cqr = dasd_smalloc_request(DASD_ECKD_MAGIC, 1, 32, device, NULL);
5040 	if (IS_ERR(cqr)) {
5041 		mutex_lock(&dasd_reserve_mutex);
5042 		useglobal = 1;
5043 		cqr = &dasd_reserve_req->cqr;
5044 		memset(cqr, 0, sizeof(*cqr));
5045 		memset(&dasd_reserve_req->ccw, 0,
5046 		       sizeof(dasd_reserve_req->ccw));
5047 		cqr->cpaddr = &dasd_reserve_req->ccw;
5048 		cqr->data = &dasd_reserve_req->data;
5049 		cqr->magic = DASD_ECKD_MAGIC;
5050 	}
5051 	ccw = cqr->cpaddr;
5052 	ccw->cmd_code = DASD_ECKD_CCW_RESERVE;
5053 	ccw->flags |= CCW_FLAG_SLI;
5054 	ccw->count = 32;
5055 	ccw->cda = (__u32)(addr_t) cqr->data;
5056 	cqr->startdev = device;
5057 	cqr->memdev = device;
5058 	clear_bit(DASD_CQR_FLAGS_USE_ERP, &cqr->flags);
5059 	set_bit(DASD_CQR_FLAGS_FAILFAST, &cqr->flags);
5060 	cqr->retries = 2;	/* set retry counter to enable basic ERP */
5061 	cqr->expires = 2 * HZ;
5062 	cqr->buildclk = get_tod_clock();
5063 	cqr->status = DASD_CQR_FILLED;
5064 
5065 	rc = dasd_sleep_on_immediatly(cqr);
5066 	if (!rc)
5067 		set_bit(DASD_FLAG_IS_RESERVED, &device->flags);
5068 
5069 	if (useglobal)
5070 		mutex_unlock(&dasd_reserve_mutex);
5071 	else
5072 		dasd_sfree_request(cqr, cqr->memdev);
5073 	return rc;
5074 }
5075 
5076 /*
5077  * Steal lock ioctl - unconditional reserve device.
5078  * Buils a channel programm to break a device's reservation.
5079  * (unconditional reserve)
5080  */
5081 static int
5082 dasd_eckd_steal_lock(struct dasd_device *device)
5083 {
5084 	struct dasd_ccw_req *cqr;
5085 	int rc;
5086 	struct ccw1 *ccw;
5087 	int useglobal;
5088 
5089 	if (!capable(CAP_SYS_ADMIN))
5090 		return -EACCES;
5091 
5092 	useglobal = 0;
5093 	cqr = dasd_smalloc_request(DASD_ECKD_MAGIC, 1, 32, device, NULL);
5094 	if (IS_ERR(cqr)) {
5095 		mutex_lock(&dasd_reserve_mutex);
5096 		useglobal = 1;
5097 		cqr = &dasd_reserve_req->cqr;
5098 		memset(cqr, 0, sizeof(*cqr));
5099 		memset(&dasd_reserve_req->ccw, 0,
5100 		       sizeof(dasd_reserve_req->ccw));
5101 		cqr->cpaddr = &dasd_reserve_req->ccw;
5102 		cqr->data = &dasd_reserve_req->data;
5103 		cqr->magic = DASD_ECKD_MAGIC;
5104 	}
5105 	ccw = cqr->cpaddr;
5106 	ccw->cmd_code = DASD_ECKD_CCW_SLCK;
5107 	ccw->flags |= CCW_FLAG_SLI;
5108 	ccw->count = 32;
5109 	ccw->cda = (__u32)(addr_t) cqr->data;
5110 	cqr->startdev = device;
5111 	cqr->memdev = device;
5112 	clear_bit(DASD_CQR_FLAGS_USE_ERP, &cqr->flags);
5113 	set_bit(DASD_CQR_FLAGS_FAILFAST, &cqr->flags);
5114 	cqr->retries = 2;	/* set retry counter to enable basic ERP */
5115 	cqr->expires = 2 * HZ;
5116 	cqr->buildclk = get_tod_clock();
5117 	cqr->status = DASD_CQR_FILLED;
5118 
5119 	rc = dasd_sleep_on_immediatly(cqr);
5120 	if (!rc)
5121 		set_bit(DASD_FLAG_IS_RESERVED, &device->flags);
5122 
5123 	if (useglobal)
5124 		mutex_unlock(&dasd_reserve_mutex);
5125 	else
5126 		dasd_sfree_request(cqr, cqr->memdev);
5127 	return rc;
5128 }
5129 
5130 /*
5131  * SNID - Sense Path Group ID
5132  * This ioctl may be used in situations where I/O is stalled due to
5133  * a reserve, so if the normal dasd_smalloc_request fails, we use the
5134  * preallocated dasd_reserve_req.
5135  */
5136 static int dasd_eckd_snid(struct dasd_device *device,
5137 			  void __user *argp)
5138 {
5139 	struct dasd_ccw_req *cqr;
5140 	int rc;
5141 	struct ccw1 *ccw;
5142 	int useglobal;
5143 	struct dasd_snid_ioctl_data usrparm;
5144 
5145 	if (!capable(CAP_SYS_ADMIN))
5146 		return -EACCES;
5147 
5148 	if (copy_from_user(&usrparm, argp, sizeof(usrparm)))
5149 		return -EFAULT;
5150 
5151 	useglobal = 0;
5152 	cqr = dasd_smalloc_request(DASD_ECKD_MAGIC, 1,
5153 				   sizeof(struct dasd_snid_data), device,
5154 				   NULL);
5155 	if (IS_ERR(cqr)) {
5156 		mutex_lock(&dasd_reserve_mutex);
5157 		useglobal = 1;
5158 		cqr = &dasd_reserve_req->cqr;
5159 		memset(cqr, 0, sizeof(*cqr));
5160 		memset(&dasd_reserve_req->ccw, 0,
5161 		       sizeof(dasd_reserve_req->ccw));
5162 		cqr->cpaddr = &dasd_reserve_req->ccw;
5163 		cqr->data = &dasd_reserve_req->data;
5164 		cqr->magic = DASD_ECKD_MAGIC;
5165 	}
5166 	ccw = cqr->cpaddr;
5167 	ccw->cmd_code = DASD_ECKD_CCW_SNID;
5168 	ccw->flags |= CCW_FLAG_SLI;
5169 	ccw->count = 12;
5170 	ccw->cda = (__u32)(addr_t) cqr->data;
5171 	cqr->startdev = device;
5172 	cqr->memdev = device;
5173 	clear_bit(DASD_CQR_FLAGS_USE_ERP, &cqr->flags);
5174 	set_bit(DASD_CQR_FLAGS_FAILFAST, &cqr->flags);
5175 	set_bit(DASD_CQR_ALLOW_SLOCK, &cqr->flags);
5176 	cqr->retries = 5;
5177 	cqr->expires = 10 * HZ;
5178 	cqr->buildclk = get_tod_clock();
5179 	cqr->status = DASD_CQR_FILLED;
5180 	cqr->lpm = usrparm.path_mask;
5181 
5182 	rc = dasd_sleep_on_immediatly(cqr);
5183 	/* verify that I/O processing didn't modify the path mask */
5184 	if (!rc && usrparm.path_mask && (cqr->lpm != usrparm.path_mask))
5185 		rc = -EIO;
5186 	if (!rc) {
5187 		usrparm.data = *((struct dasd_snid_data *)cqr->data);
5188 		if (copy_to_user(argp, &usrparm, sizeof(usrparm)))
5189 			rc = -EFAULT;
5190 	}
5191 
5192 	if (useglobal)
5193 		mutex_unlock(&dasd_reserve_mutex);
5194 	else
5195 		dasd_sfree_request(cqr, cqr->memdev);
5196 	return rc;
5197 }
5198 
5199 /*
5200  * Read performance statistics
5201  */
5202 static int
5203 dasd_eckd_performance(struct dasd_device *device, void __user *argp)
5204 {
5205 	struct dasd_psf_prssd_data *prssdp;
5206 	struct dasd_rssd_perf_stats_t *stats;
5207 	struct dasd_ccw_req *cqr;
5208 	struct ccw1 *ccw;
5209 	int rc;
5210 
5211 	cqr = dasd_smalloc_request(DASD_ECKD_MAGIC, 1 /* PSF */  + 1 /* RSSD */,
5212 				   (sizeof(struct dasd_psf_prssd_data) +
5213 				    sizeof(struct dasd_rssd_perf_stats_t)),
5214 				   device, NULL);
5215 	if (IS_ERR(cqr)) {
5216 		DBF_DEV_EVENT(DBF_WARNING, device, "%s",
5217 			    "Could not allocate initialization request");
5218 		return PTR_ERR(cqr);
5219 	}
5220 	cqr->startdev = device;
5221 	cqr->memdev = device;
5222 	cqr->retries = 0;
5223 	clear_bit(DASD_CQR_FLAGS_USE_ERP, &cqr->flags);
5224 	cqr->expires = 10 * HZ;
5225 
5226 	/* Prepare for Read Subsystem Data */
5227 	prssdp = (struct dasd_psf_prssd_data *) cqr->data;
5228 	memset(prssdp, 0, sizeof(struct dasd_psf_prssd_data));
5229 	prssdp->order = PSF_ORDER_PRSSD;
5230 	prssdp->suborder = 0x01;	/* Performance Statistics */
5231 	prssdp->varies[1] = 0x01;	/* Perf Statistics for the Subsystem */
5232 
5233 	ccw = cqr->cpaddr;
5234 	ccw->cmd_code = DASD_ECKD_CCW_PSF;
5235 	ccw->count = sizeof(struct dasd_psf_prssd_data);
5236 	ccw->flags |= CCW_FLAG_CC;
5237 	ccw->cda = (__u32)(addr_t) prssdp;
5238 
5239 	/* Read Subsystem Data - Performance Statistics */
5240 	stats = (struct dasd_rssd_perf_stats_t *) (prssdp + 1);
5241 	memset(stats, 0, sizeof(struct dasd_rssd_perf_stats_t));
5242 
5243 	ccw++;
5244 	ccw->cmd_code = DASD_ECKD_CCW_RSSD;
5245 	ccw->count = sizeof(struct dasd_rssd_perf_stats_t);
5246 	ccw->cda = (__u32)(addr_t) stats;
5247 
5248 	cqr->buildclk = get_tod_clock();
5249 	cqr->status = DASD_CQR_FILLED;
5250 	rc = dasd_sleep_on(cqr);
5251 	if (rc == 0) {
5252 		prssdp = (struct dasd_psf_prssd_data *) cqr->data;
5253 		stats = (struct dasd_rssd_perf_stats_t *) (prssdp + 1);
5254 		if (copy_to_user(argp, stats,
5255 				 sizeof(struct dasd_rssd_perf_stats_t)))
5256 			rc = -EFAULT;
5257 	}
5258 	dasd_sfree_request(cqr, cqr->memdev);
5259 	return rc;
5260 }
5261 
5262 /*
5263  * Get attributes (cache operations)
5264  * Returnes the cache attributes used in Define Extend (DE).
5265  */
5266 static int
5267 dasd_eckd_get_attrib(struct dasd_device *device, void __user *argp)
5268 {
5269 	struct dasd_eckd_private *private = device->private;
5270 	struct attrib_data_t attrib = private->attrib;
5271 	int rc;
5272 
5273         if (!capable(CAP_SYS_ADMIN))
5274                 return -EACCES;
5275 	if (!argp)
5276                 return -EINVAL;
5277 
5278 	rc = 0;
5279 	if (copy_to_user(argp, (long *) &attrib,
5280 			 sizeof(struct attrib_data_t)))
5281 		rc = -EFAULT;
5282 
5283 	return rc;
5284 }
5285 
5286 /*
5287  * Set attributes (cache operations)
5288  * Stores the attributes for cache operation to be used in Define Extend (DE).
5289  */
5290 static int
5291 dasd_eckd_set_attrib(struct dasd_device *device, void __user *argp)
5292 {
5293 	struct dasd_eckd_private *private = device->private;
5294 	struct attrib_data_t attrib;
5295 
5296 	if (!capable(CAP_SYS_ADMIN))
5297 		return -EACCES;
5298 	if (!argp)
5299 		return -EINVAL;
5300 
5301 	if (copy_from_user(&attrib, argp, sizeof(struct attrib_data_t)))
5302 		return -EFAULT;
5303 	private->attrib = attrib;
5304 
5305 	dev_info(&device->cdev->dev,
5306 		 "The DASD cache mode was set to %x (%i cylinder prestage)\n",
5307 		 private->attrib.operation, private->attrib.nr_cyl);
5308 	return 0;
5309 }
5310 
5311 /*
5312  * Issue syscall I/O to EMC Symmetrix array.
5313  * CCWs are PSF and RSSD
5314  */
5315 static int dasd_symm_io(struct dasd_device *device, void __user *argp)
5316 {
5317 	struct dasd_symmio_parms usrparm;
5318 	char *psf_data, *rssd_result;
5319 	struct dasd_ccw_req *cqr;
5320 	struct ccw1 *ccw;
5321 	char psf0, psf1;
5322 	int rc;
5323 
5324 	if (!capable(CAP_SYS_ADMIN) && !capable(CAP_SYS_RAWIO))
5325 		return -EACCES;
5326 	psf0 = psf1 = 0;
5327 
5328 	/* Copy parms from caller */
5329 	rc = -EFAULT;
5330 	if (copy_from_user(&usrparm, argp, sizeof(usrparm)))
5331 		goto out;
5332 	if (is_compat_task()) {
5333 		/* Make sure pointers are sane even on 31 bit. */
5334 		rc = -EINVAL;
5335 		if ((usrparm.psf_data >> 32) != 0)
5336 			goto out;
5337 		if ((usrparm.rssd_result >> 32) != 0)
5338 			goto out;
5339 		usrparm.psf_data &= 0x7fffffffULL;
5340 		usrparm.rssd_result &= 0x7fffffffULL;
5341 	}
5342 	/* at least 2 bytes are accessed and should be allocated */
5343 	if (usrparm.psf_data_len < 2) {
5344 		DBF_DEV_EVENT(DBF_WARNING, device,
5345 			      "Symmetrix ioctl invalid data length %d",
5346 			      usrparm.psf_data_len);
5347 		rc = -EINVAL;
5348 		goto out;
5349 	}
5350 	/* alloc I/O data area */
5351 	psf_data = kzalloc(usrparm.psf_data_len, GFP_KERNEL | GFP_DMA);
5352 	rssd_result = kzalloc(usrparm.rssd_result_len, GFP_KERNEL | GFP_DMA);
5353 	if (!psf_data || !rssd_result) {
5354 		rc = -ENOMEM;
5355 		goto out_free;
5356 	}
5357 
5358 	/* get syscall header from user space */
5359 	rc = -EFAULT;
5360 	if (copy_from_user(psf_data,
5361 			   (void __user *)(unsigned long) usrparm.psf_data,
5362 			   usrparm.psf_data_len))
5363 		goto out_free;
5364 	psf0 = psf_data[0];
5365 	psf1 = psf_data[1];
5366 
5367 	/* setup CCWs for PSF + RSSD */
5368 	cqr = dasd_smalloc_request(DASD_ECKD_MAGIC, 2, 0, device, NULL);
5369 	if (IS_ERR(cqr)) {
5370 		DBF_DEV_EVENT(DBF_WARNING, device, "%s",
5371 			"Could not allocate initialization request");
5372 		rc = PTR_ERR(cqr);
5373 		goto out_free;
5374 	}
5375 
5376 	cqr->startdev = device;
5377 	cqr->memdev = device;
5378 	cqr->retries = 3;
5379 	cqr->expires = 10 * HZ;
5380 	cqr->buildclk = get_tod_clock();
5381 	cqr->status = DASD_CQR_FILLED;
5382 
5383 	/* Build the ccws */
5384 	ccw = cqr->cpaddr;
5385 
5386 	/* PSF ccw */
5387 	ccw->cmd_code = DASD_ECKD_CCW_PSF;
5388 	ccw->count = usrparm.psf_data_len;
5389 	ccw->flags |= CCW_FLAG_CC;
5390 	ccw->cda = (__u32)(addr_t) psf_data;
5391 
5392 	ccw++;
5393 
5394 	/* RSSD ccw  */
5395 	ccw->cmd_code = DASD_ECKD_CCW_RSSD;
5396 	ccw->count = usrparm.rssd_result_len;
5397 	ccw->flags = CCW_FLAG_SLI ;
5398 	ccw->cda = (__u32)(addr_t) rssd_result;
5399 
5400 	rc = dasd_sleep_on(cqr);
5401 	if (rc)
5402 		goto out_sfree;
5403 
5404 	rc = -EFAULT;
5405 	if (copy_to_user((void __user *)(unsigned long) usrparm.rssd_result,
5406 			   rssd_result, usrparm.rssd_result_len))
5407 		goto out_sfree;
5408 	rc = 0;
5409 
5410 out_sfree:
5411 	dasd_sfree_request(cqr, cqr->memdev);
5412 out_free:
5413 	kfree(rssd_result);
5414 	kfree(psf_data);
5415 out:
5416 	DBF_DEV_EVENT(DBF_WARNING, device,
5417 		      "Symmetrix ioctl (0x%02x 0x%02x): rc=%d",
5418 		      (int) psf0, (int) psf1, rc);
5419 	return rc;
5420 }
5421 
5422 static int
5423 dasd_eckd_ioctl(struct dasd_block *block, unsigned int cmd, void __user *argp)
5424 {
5425 	struct dasd_device *device = block->base;
5426 
5427 	switch (cmd) {
5428 	case BIODASDGATTR:
5429 		return dasd_eckd_get_attrib(device, argp);
5430 	case BIODASDSATTR:
5431 		return dasd_eckd_set_attrib(device, argp);
5432 	case BIODASDPSRD:
5433 		return dasd_eckd_performance(device, argp);
5434 	case BIODASDRLSE:
5435 		return dasd_eckd_release(device);
5436 	case BIODASDRSRV:
5437 		return dasd_eckd_reserve(device);
5438 	case BIODASDSLCK:
5439 		return dasd_eckd_steal_lock(device);
5440 	case BIODASDSNID:
5441 		return dasd_eckd_snid(device, argp);
5442 	case BIODASDSYMMIO:
5443 		return dasd_symm_io(device, argp);
5444 	default:
5445 		return -ENOTTY;
5446 	}
5447 }
5448 
5449 /*
5450  * Dump the range of CCWs into 'page' buffer
5451  * and return number of printed chars.
5452  */
5453 static int
5454 dasd_eckd_dump_ccw_range(struct ccw1 *from, struct ccw1 *to, char *page)
5455 {
5456 	int len, count;
5457 	char *datap;
5458 
5459 	len = 0;
5460 	while (from <= to) {
5461 		len += sprintf(page + len, PRINTK_HEADER
5462 			       " CCW %p: %08X %08X DAT:",
5463 			       from, ((int *) from)[0], ((int *) from)[1]);
5464 
5465 		/* get pointer to data (consider IDALs) */
5466 		if (from->flags & CCW_FLAG_IDA)
5467 			datap = (char *) *((addr_t *) (addr_t) from->cda);
5468 		else
5469 			datap = (char *) ((addr_t) from->cda);
5470 
5471 		/* dump data (max 32 bytes) */
5472 		for (count = 0; count < from->count && count < 32; count++) {
5473 			if (count % 8 == 0) len += sprintf(page + len, " ");
5474 			if (count % 4 == 0) len += sprintf(page + len, " ");
5475 			len += sprintf(page + len, "%02x", datap[count]);
5476 		}
5477 		len += sprintf(page + len, "\n");
5478 		from++;
5479 	}
5480 	return len;
5481 }
5482 
5483 static void
5484 dasd_eckd_dump_sense_dbf(struct dasd_device *device, struct irb *irb,
5485 			 char *reason)
5486 {
5487 	u64 *sense;
5488 	u64 *stat;
5489 
5490 	sense = (u64 *) dasd_get_sense(irb);
5491 	stat = (u64 *) &irb->scsw;
5492 	if (sense) {
5493 		DBF_DEV_EVENT(DBF_EMERG, device, "%s: %016llx %08x : "
5494 			      "%016llx %016llx %016llx %016llx",
5495 			      reason, *stat, *((u32 *) (stat + 1)),
5496 			      sense[0], sense[1], sense[2], sense[3]);
5497 	} else {
5498 		DBF_DEV_EVENT(DBF_EMERG, device, "%s: %016llx %08x : %s",
5499 			      reason, *stat, *((u32 *) (stat + 1)),
5500 			      "NO VALID SENSE");
5501 	}
5502 }
5503 
5504 /*
5505  * Print sense data and related channel program.
5506  * Parts are printed because printk buffer is only 1024 bytes.
5507  */
5508 static void dasd_eckd_dump_sense_ccw(struct dasd_device *device,
5509 				 struct dasd_ccw_req *req, struct irb *irb)
5510 {
5511 	char *page;
5512 	struct ccw1 *first, *last, *fail, *from, *to;
5513 	int len, sl, sct;
5514 
5515 	page = (char *) get_zeroed_page(GFP_ATOMIC);
5516 	if (page == NULL) {
5517 		DBF_DEV_EVENT(DBF_WARNING, device, "%s",
5518 			      "No memory to dump sense data\n");
5519 		return;
5520 	}
5521 	/* dump the sense data */
5522 	len = sprintf(page, PRINTK_HEADER
5523 		      " I/O status report for device %s:\n",
5524 		      dev_name(&device->cdev->dev));
5525 	len += sprintf(page + len, PRINTK_HEADER
5526 		       " in req: %p CC:%02X FC:%02X AC:%02X SC:%02X DS:%02X "
5527 		       "CS:%02X RC:%d\n",
5528 		       req, scsw_cc(&irb->scsw), scsw_fctl(&irb->scsw),
5529 		       scsw_actl(&irb->scsw), scsw_stctl(&irb->scsw),
5530 		       scsw_dstat(&irb->scsw), scsw_cstat(&irb->scsw),
5531 		       req ? req->intrc : 0);
5532 	len += sprintf(page + len, PRINTK_HEADER
5533 		       " device %s: Failing CCW: %p\n",
5534 		       dev_name(&device->cdev->dev),
5535 		       (void *) (addr_t) irb->scsw.cmd.cpa);
5536 	if (irb->esw.esw0.erw.cons) {
5537 		for (sl = 0; sl < 4; sl++) {
5538 			len += sprintf(page + len, PRINTK_HEADER
5539 				       " Sense(hex) %2d-%2d:",
5540 				       (8 * sl), ((8 * sl) + 7));
5541 
5542 			for (sct = 0; sct < 8; sct++) {
5543 				len += sprintf(page + len, " %02x",
5544 					       irb->ecw[8 * sl + sct]);
5545 			}
5546 			len += sprintf(page + len, "\n");
5547 		}
5548 
5549 		if (irb->ecw[27] & DASD_SENSE_BIT_0) {
5550 			/* 24 Byte Sense Data */
5551 			sprintf(page + len, PRINTK_HEADER
5552 				" 24 Byte: %x MSG %x, "
5553 				"%s MSGb to SYSOP\n",
5554 				irb->ecw[7] >> 4, irb->ecw[7] & 0x0f,
5555 				irb->ecw[1] & 0x10 ? "" : "no");
5556 		} else {
5557 			/* 32 Byte Sense Data */
5558 			sprintf(page + len, PRINTK_HEADER
5559 				" 32 Byte: Format: %x "
5560 				"Exception class %x\n",
5561 				irb->ecw[6] & 0x0f, irb->ecw[22] >> 4);
5562 		}
5563 	} else {
5564 		sprintf(page + len, PRINTK_HEADER
5565 			" SORRY - NO VALID SENSE AVAILABLE\n");
5566 	}
5567 	printk(KERN_ERR "%s", page);
5568 
5569 	if (req) {
5570 		/* req == NULL for unsolicited interrupts */
5571 		/* dump the Channel Program (max 140 Bytes per line) */
5572 		/* Count CCW and print first CCWs (maximum 1024 % 140 = 7) */
5573 		first = req->cpaddr;
5574 		for (last = first; last->flags & (CCW_FLAG_CC | CCW_FLAG_DC); last++);
5575 		to = min(first + 6, last);
5576 		len = sprintf(page, PRINTK_HEADER
5577 			      " Related CP in req: %p\n", req);
5578 		dasd_eckd_dump_ccw_range(first, to, page + len);
5579 		printk(KERN_ERR "%s", page);
5580 
5581 		/* print failing CCW area (maximum 4) */
5582 		/* scsw->cda is either valid or zero  */
5583 		len = 0;
5584 		from = ++to;
5585 		fail = (struct ccw1 *)(addr_t)
5586 				irb->scsw.cmd.cpa; /* failing CCW */
5587 		if (from <  fail - 2) {
5588 			from = fail - 2;     /* there is a gap - print header */
5589 			len += sprintf(page, PRINTK_HEADER "......\n");
5590 		}
5591 		to = min(fail + 1, last);
5592 		len += dasd_eckd_dump_ccw_range(from, to, page + len);
5593 
5594 		/* print last CCWs (maximum 2) */
5595 		from = max(from, ++to);
5596 		if (from < last - 1) {
5597 			from = last - 1;     /* there is a gap - print header */
5598 			len += sprintf(page + len, PRINTK_HEADER "......\n");
5599 		}
5600 		len += dasd_eckd_dump_ccw_range(from, last, page + len);
5601 		if (len > 0)
5602 			printk(KERN_ERR "%s", page);
5603 	}
5604 	free_page((unsigned long) page);
5605 }
5606 
5607 
5608 /*
5609  * Print sense data from a tcw.
5610  */
5611 static void dasd_eckd_dump_sense_tcw(struct dasd_device *device,
5612 				 struct dasd_ccw_req *req, struct irb *irb)
5613 {
5614 	char *page;
5615 	int len, sl, sct, residual;
5616 	struct tsb *tsb;
5617 	u8 *sense, *rcq;
5618 
5619 	page = (char *) get_zeroed_page(GFP_ATOMIC);
5620 	if (page == NULL) {
5621 		DBF_DEV_EVENT(DBF_WARNING, device, " %s",
5622 			    "No memory to dump sense data");
5623 		return;
5624 	}
5625 	/* dump the sense data */
5626 	len = sprintf(page, PRINTK_HEADER
5627 		      " I/O status report for device %s:\n",
5628 		      dev_name(&device->cdev->dev));
5629 	len += sprintf(page + len, PRINTK_HEADER
5630 		       " in req: %p CC:%02X FC:%02X AC:%02X SC:%02X DS:%02X "
5631 		       "CS:%02X fcxs:%02X schxs:%02X RC:%d\n",
5632 		       req, scsw_cc(&irb->scsw), scsw_fctl(&irb->scsw),
5633 		       scsw_actl(&irb->scsw), scsw_stctl(&irb->scsw),
5634 		       scsw_dstat(&irb->scsw), scsw_cstat(&irb->scsw),
5635 		       irb->scsw.tm.fcxs,
5636 		       (irb->scsw.tm.ifob << 7) | irb->scsw.tm.sesq,
5637 		       req ? req->intrc : 0);
5638 	len += sprintf(page + len, PRINTK_HEADER
5639 		       " device %s: Failing TCW: %p\n",
5640 		       dev_name(&device->cdev->dev),
5641 		       (void *) (addr_t) irb->scsw.tm.tcw);
5642 
5643 	tsb = NULL;
5644 	sense = NULL;
5645 	if (irb->scsw.tm.tcw && (irb->scsw.tm.fcxs & 0x01))
5646 		tsb = tcw_get_tsb(
5647 			(struct tcw *)(unsigned long)irb->scsw.tm.tcw);
5648 
5649 	if (tsb) {
5650 		len += sprintf(page + len, PRINTK_HEADER
5651 			       " tsb->length %d\n", tsb->length);
5652 		len += sprintf(page + len, PRINTK_HEADER
5653 			       " tsb->flags %x\n", tsb->flags);
5654 		len += sprintf(page + len, PRINTK_HEADER
5655 			       " tsb->dcw_offset %d\n", tsb->dcw_offset);
5656 		len += sprintf(page + len, PRINTK_HEADER
5657 			       " tsb->count %d\n", tsb->count);
5658 		residual = tsb->count - 28;
5659 		len += sprintf(page + len, PRINTK_HEADER
5660 			       " residual %d\n", residual);
5661 
5662 		switch (tsb->flags & 0x07) {
5663 		case 1:	/* tsa_iostat */
5664 			len += sprintf(page + len, PRINTK_HEADER
5665 			       " tsb->tsa.iostat.dev_time %d\n",
5666 				       tsb->tsa.iostat.dev_time);
5667 			len += sprintf(page + len, PRINTK_HEADER
5668 			       " tsb->tsa.iostat.def_time %d\n",
5669 				       tsb->tsa.iostat.def_time);
5670 			len += sprintf(page + len, PRINTK_HEADER
5671 			       " tsb->tsa.iostat.queue_time %d\n",
5672 				       tsb->tsa.iostat.queue_time);
5673 			len += sprintf(page + len, PRINTK_HEADER
5674 			       " tsb->tsa.iostat.dev_busy_time %d\n",
5675 				       tsb->tsa.iostat.dev_busy_time);
5676 			len += sprintf(page + len, PRINTK_HEADER
5677 			       " tsb->tsa.iostat.dev_act_time %d\n",
5678 				       tsb->tsa.iostat.dev_act_time);
5679 			sense = tsb->tsa.iostat.sense;
5680 			break;
5681 		case 2: /* ts_ddpc */
5682 			len += sprintf(page + len, PRINTK_HEADER
5683 			       " tsb->tsa.ddpc.rc %d\n", tsb->tsa.ddpc.rc);
5684 			for (sl = 0; sl < 2; sl++) {
5685 				len += sprintf(page + len, PRINTK_HEADER
5686 					       " tsb->tsa.ddpc.rcq %2d-%2d: ",
5687 					       (8 * sl), ((8 * sl) + 7));
5688 				rcq = tsb->tsa.ddpc.rcq;
5689 				for (sct = 0; sct < 8; sct++) {
5690 					len += sprintf(page + len, " %02x",
5691 						       rcq[8 * sl + sct]);
5692 				}
5693 				len += sprintf(page + len, "\n");
5694 			}
5695 			sense = tsb->tsa.ddpc.sense;
5696 			break;
5697 		case 3: /* tsa_intrg */
5698 			len += sprintf(page + len, PRINTK_HEADER
5699 				      " tsb->tsa.intrg.: not supported yet\n");
5700 			break;
5701 		}
5702 
5703 		if (sense) {
5704 			for (sl = 0; sl < 4; sl++) {
5705 				len += sprintf(page + len, PRINTK_HEADER
5706 					       " Sense(hex) %2d-%2d:",
5707 					       (8 * sl), ((8 * sl) + 7));
5708 				for (sct = 0; sct < 8; sct++) {
5709 					len += sprintf(page + len, " %02x",
5710 						       sense[8 * sl + sct]);
5711 				}
5712 				len += sprintf(page + len, "\n");
5713 			}
5714 
5715 			if (sense[27] & DASD_SENSE_BIT_0) {
5716 				/* 24 Byte Sense Data */
5717 				sprintf(page + len, PRINTK_HEADER
5718 					" 24 Byte: %x MSG %x, "
5719 					"%s MSGb to SYSOP\n",
5720 					sense[7] >> 4, sense[7] & 0x0f,
5721 					sense[1] & 0x10 ? "" : "no");
5722 			} else {
5723 				/* 32 Byte Sense Data */
5724 				sprintf(page + len, PRINTK_HEADER
5725 					" 32 Byte: Format: %x "
5726 					"Exception class %x\n",
5727 					sense[6] & 0x0f, sense[22] >> 4);
5728 			}
5729 		} else {
5730 			sprintf(page + len, PRINTK_HEADER
5731 				" SORRY - NO VALID SENSE AVAILABLE\n");
5732 		}
5733 	} else {
5734 		sprintf(page + len, PRINTK_HEADER
5735 			" SORRY - NO TSB DATA AVAILABLE\n");
5736 	}
5737 	printk(KERN_ERR "%s", page);
5738 	free_page((unsigned long) page);
5739 }
5740 
5741 static void dasd_eckd_dump_sense(struct dasd_device *device,
5742 				 struct dasd_ccw_req *req, struct irb *irb)
5743 {
5744 	u8 *sense = dasd_get_sense(irb);
5745 
5746 	if (scsw_is_tm(&irb->scsw)) {
5747 		/*
5748 		 * In some cases the 'File Protected' or 'Incorrect Length'
5749 		 * error might be expected and log messages shouldn't be written
5750 		 * then. Check if the according suppress bit is set.
5751 		 */
5752 		if (sense && (sense[1] & SNS1_FILE_PROTECTED) &&
5753 		    test_bit(DASD_CQR_SUPPRESS_FP, &req->flags))
5754 			return;
5755 		if (scsw_cstat(&irb->scsw) == 0x40 &&
5756 		    test_bit(DASD_CQR_SUPPRESS_IL, &req->flags))
5757 			return;
5758 
5759 		dasd_eckd_dump_sense_tcw(device, req, irb);
5760 	} else {
5761 		/*
5762 		 * In some cases the 'Command Reject' or 'No Record Found'
5763 		 * error might be expected and log messages shouldn't be
5764 		 * written then. Check if the according suppress bit is set.
5765 		 */
5766 		if (sense && sense[0] & SNS0_CMD_REJECT &&
5767 		    test_bit(DASD_CQR_SUPPRESS_CR, &req->flags))
5768 			return;
5769 
5770 		if (sense && sense[1] & SNS1_NO_REC_FOUND &&
5771 		    test_bit(DASD_CQR_SUPPRESS_NRF, &req->flags))
5772 			return;
5773 
5774 		dasd_eckd_dump_sense_ccw(device, req, irb);
5775 	}
5776 }
5777 
5778 static int dasd_eckd_reload_device(struct dasd_device *device)
5779 {
5780 	struct dasd_eckd_private *private = device->private;
5781 	int rc, old_base;
5782 	char print_uid[60];
5783 	struct dasd_uid uid;
5784 	unsigned long flags;
5785 
5786 	/*
5787 	 * remove device from alias handling to prevent new requests
5788 	 * from being scheduled on the wrong alias device
5789 	 */
5790 	dasd_alias_remove_device(device);
5791 
5792 	spin_lock_irqsave(get_ccwdev_lock(device->cdev), flags);
5793 	old_base = private->uid.base_unit_addr;
5794 	spin_unlock_irqrestore(get_ccwdev_lock(device->cdev), flags);
5795 
5796 	/* Read Configuration Data */
5797 	rc = dasd_eckd_read_conf(device);
5798 	if (rc)
5799 		goto out_err;
5800 
5801 	rc = dasd_eckd_generate_uid(device);
5802 	if (rc)
5803 		goto out_err;
5804 	/*
5805 	 * update unit address configuration and
5806 	 * add device to alias management
5807 	 */
5808 	dasd_alias_update_add_device(device);
5809 
5810 	dasd_eckd_get_uid(device, &uid);
5811 
5812 	if (old_base != uid.base_unit_addr) {
5813 		if (strlen(uid.vduit) > 0)
5814 			snprintf(print_uid, sizeof(print_uid),
5815 				 "%s.%s.%04x.%02x.%s", uid.vendor, uid.serial,
5816 				 uid.ssid, uid.base_unit_addr, uid.vduit);
5817 		else
5818 			snprintf(print_uid, sizeof(print_uid),
5819 				 "%s.%s.%04x.%02x", uid.vendor, uid.serial,
5820 				 uid.ssid, uid.base_unit_addr);
5821 
5822 		dev_info(&device->cdev->dev,
5823 			 "An Alias device was reassigned to a new base device "
5824 			 "with UID: %s\n", print_uid);
5825 	}
5826 	return 0;
5827 
5828 out_err:
5829 	return -1;
5830 }
5831 
5832 static int dasd_eckd_read_message_buffer(struct dasd_device *device,
5833 					 struct dasd_rssd_messages *messages,
5834 					 __u8 lpum)
5835 {
5836 	struct dasd_rssd_messages *message_buf;
5837 	struct dasd_psf_prssd_data *prssdp;
5838 	struct dasd_ccw_req *cqr;
5839 	struct ccw1 *ccw;
5840 	int rc;
5841 
5842 	cqr = dasd_smalloc_request(DASD_ECKD_MAGIC, 1 /* PSF */	+ 1 /* RSSD */,
5843 				   (sizeof(struct dasd_psf_prssd_data) +
5844 				    sizeof(struct dasd_rssd_messages)),
5845 				   device, NULL);
5846 	if (IS_ERR(cqr)) {
5847 		DBF_EVENT_DEVID(DBF_WARNING, device->cdev, "%s",
5848 				"Could not allocate read message buffer request");
5849 		return PTR_ERR(cqr);
5850 	}
5851 
5852 	cqr->lpm = lpum;
5853 retry:
5854 	cqr->startdev = device;
5855 	cqr->memdev = device;
5856 	cqr->block = NULL;
5857 	cqr->expires = 10 * HZ;
5858 	set_bit(DASD_CQR_VERIFY_PATH, &cqr->flags);
5859 	/* dasd_sleep_on_immediatly does not do complex error
5860 	 * recovery so clear erp flag and set retry counter to
5861 	 * do basic erp */
5862 	clear_bit(DASD_CQR_FLAGS_USE_ERP, &cqr->flags);
5863 	cqr->retries = 256;
5864 
5865 	/* Prepare for Read Subsystem Data */
5866 	prssdp = (struct dasd_psf_prssd_data *) cqr->data;
5867 	memset(prssdp, 0, sizeof(struct dasd_psf_prssd_data));
5868 	prssdp->order = PSF_ORDER_PRSSD;
5869 	prssdp->suborder = 0x03;	/* Message Buffer */
5870 	/* all other bytes of prssdp must be zero */
5871 
5872 	ccw = cqr->cpaddr;
5873 	ccw->cmd_code = DASD_ECKD_CCW_PSF;
5874 	ccw->count = sizeof(struct dasd_psf_prssd_data);
5875 	ccw->flags |= CCW_FLAG_CC;
5876 	ccw->flags |= CCW_FLAG_SLI;
5877 	ccw->cda = (__u32)(addr_t) prssdp;
5878 
5879 	/* Read Subsystem Data - message buffer */
5880 	message_buf = (struct dasd_rssd_messages *) (prssdp + 1);
5881 	memset(message_buf, 0, sizeof(struct dasd_rssd_messages));
5882 
5883 	ccw++;
5884 	ccw->cmd_code = DASD_ECKD_CCW_RSSD;
5885 	ccw->count = sizeof(struct dasd_rssd_messages);
5886 	ccw->flags |= CCW_FLAG_SLI;
5887 	ccw->cda = (__u32)(addr_t) message_buf;
5888 
5889 	cqr->buildclk = get_tod_clock();
5890 	cqr->status = DASD_CQR_FILLED;
5891 	rc = dasd_sleep_on_immediatly(cqr);
5892 	if (rc == 0) {
5893 		prssdp = (struct dasd_psf_prssd_data *) cqr->data;
5894 		message_buf = (struct dasd_rssd_messages *)
5895 			(prssdp + 1);
5896 		memcpy(messages, message_buf,
5897 		       sizeof(struct dasd_rssd_messages));
5898 	} else if (cqr->lpm) {
5899 		/*
5900 		 * on z/VM we might not be able to do I/O on the requested path
5901 		 * but instead we get the required information on any path
5902 		 * so retry with open path mask
5903 		 */
5904 		cqr->lpm = 0;
5905 		goto retry;
5906 	} else
5907 		DBF_EVENT_DEVID(DBF_WARNING, device->cdev,
5908 				"Reading messages failed with rc=%d\n"
5909 				, rc);
5910 	dasd_sfree_request(cqr, cqr->memdev);
5911 	return rc;
5912 }
5913 
5914 static int dasd_eckd_query_host_access(struct dasd_device *device,
5915 				       struct dasd_psf_query_host_access *data)
5916 {
5917 	struct dasd_eckd_private *private = device->private;
5918 	struct dasd_psf_query_host_access *host_access;
5919 	struct dasd_psf_prssd_data *prssdp;
5920 	struct dasd_ccw_req *cqr;
5921 	struct ccw1 *ccw;
5922 	int rc;
5923 
5924 	/* not available for HYPER PAV alias devices */
5925 	if (!device->block && private->lcu->pav == HYPER_PAV)
5926 		return -EOPNOTSUPP;
5927 
5928 	/* may not be supported by the storage server */
5929 	if (!(private->features.feature[14] & 0x80))
5930 		return -EOPNOTSUPP;
5931 
5932 	cqr = dasd_smalloc_request(DASD_ECKD_MAGIC, 1 /* PSF */	+ 1 /* RSSD */,
5933 				   sizeof(struct dasd_psf_prssd_data) + 1,
5934 				   device, NULL);
5935 	if (IS_ERR(cqr)) {
5936 		DBF_EVENT_DEVID(DBF_WARNING, device->cdev, "%s",
5937 				"Could not allocate read message buffer request");
5938 		return PTR_ERR(cqr);
5939 	}
5940 	host_access = kzalloc(sizeof(*host_access), GFP_KERNEL | GFP_DMA);
5941 	if (!host_access) {
5942 		dasd_sfree_request(cqr, device);
5943 		DBF_EVENT_DEVID(DBF_WARNING, device->cdev, "%s",
5944 				"Could not allocate host_access buffer");
5945 		return -ENOMEM;
5946 	}
5947 	cqr->startdev = device;
5948 	cqr->memdev = device;
5949 	cqr->block = NULL;
5950 	cqr->retries = 256;
5951 	cqr->expires = 10 * HZ;
5952 
5953 	/* Prepare for Read Subsystem Data */
5954 	prssdp = (struct dasd_psf_prssd_data *) cqr->data;
5955 	memset(prssdp, 0, sizeof(struct dasd_psf_prssd_data));
5956 	prssdp->order = PSF_ORDER_PRSSD;
5957 	prssdp->suborder = PSF_SUBORDER_QHA;	/* query host access */
5958 	/* LSS and Volume that will be queried */
5959 	prssdp->lss = private->ned->ID;
5960 	prssdp->volume = private->ned->unit_addr;
5961 	/* all other bytes of prssdp must be zero */
5962 
5963 	ccw = cqr->cpaddr;
5964 	ccw->cmd_code = DASD_ECKD_CCW_PSF;
5965 	ccw->count = sizeof(struct dasd_psf_prssd_data);
5966 	ccw->flags |= CCW_FLAG_CC;
5967 	ccw->flags |= CCW_FLAG_SLI;
5968 	ccw->cda = (__u32)(addr_t) prssdp;
5969 
5970 	/* Read Subsystem Data - query host access */
5971 	ccw++;
5972 	ccw->cmd_code = DASD_ECKD_CCW_RSSD;
5973 	ccw->count = sizeof(struct dasd_psf_query_host_access);
5974 	ccw->flags |= CCW_FLAG_SLI;
5975 	ccw->cda = (__u32)(addr_t) host_access;
5976 
5977 	cqr->buildclk = get_tod_clock();
5978 	cqr->status = DASD_CQR_FILLED;
5979 	/* the command might not be supported, suppress error message */
5980 	__set_bit(DASD_CQR_SUPPRESS_CR, &cqr->flags);
5981 	rc = dasd_sleep_on_interruptible(cqr);
5982 	if (rc == 0) {
5983 		*data = *host_access;
5984 	} else {
5985 		DBF_EVENT_DEVID(DBF_WARNING, device->cdev,
5986 				"Reading host access data failed with rc=%d\n",
5987 				rc);
5988 		rc = -EOPNOTSUPP;
5989 	}
5990 
5991 	dasd_sfree_request(cqr, cqr->memdev);
5992 	kfree(host_access);
5993 	return rc;
5994 }
5995 /*
5996  * return number of grouped devices
5997  */
5998 static int dasd_eckd_host_access_count(struct dasd_device *device)
5999 {
6000 	struct dasd_psf_query_host_access *access;
6001 	struct dasd_ckd_path_group_entry *entry;
6002 	struct dasd_ckd_host_information *info;
6003 	int count = 0;
6004 	int rc, i;
6005 
6006 	access = kzalloc(sizeof(*access), GFP_NOIO);
6007 	if (!access) {
6008 		DBF_EVENT_DEVID(DBF_WARNING, device->cdev, "%s",
6009 				"Could not allocate access buffer");
6010 		return -ENOMEM;
6011 	}
6012 	rc = dasd_eckd_query_host_access(device, access);
6013 	if (rc) {
6014 		kfree(access);
6015 		return rc;
6016 	}
6017 
6018 	info = (struct dasd_ckd_host_information *)
6019 		access->host_access_information;
6020 	for (i = 0; i < info->entry_count; i++) {
6021 		entry = (struct dasd_ckd_path_group_entry *)
6022 			(info->entry + i * info->entry_size);
6023 		if (entry->status_flags & DASD_ECKD_PG_GROUPED)
6024 			count++;
6025 	}
6026 
6027 	kfree(access);
6028 	return count;
6029 }
6030 
6031 /*
6032  * write host access information to a sequential file
6033  */
6034 static int dasd_hosts_print(struct dasd_device *device, struct seq_file *m)
6035 {
6036 	struct dasd_psf_query_host_access *access;
6037 	struct dasd_ckd_path_group_entry *entry;
6038 	struct dasd_ckd_host_information *info;
6039 	char sysplex[9] = "";
6040 	int rc, i;
6041 
6042 	access = kzalloc(sizeof(*access), GFP_NOIO);
6043 	if (!access) {
6044 		DBF_EVENT_DEVID(DBF_WARNING, device->cdev, "%s",
6045 				"Could not allocate access buffer");
6046 		return -ENOMEM;
6047 	}
6048 	rc = dasd_eckd_query_host_access(device, access);
6049 	if (rc) {
6050 		kfree(access);
6051 		return rc;
6052 	}
6053 
6054 	info = (struct dasd_ckd_host_information *)
6055 		access->host_access_information;
6056 	for (i = 0; i < info->entry_count; i++) {
6057 		entry = (struct dasd_ckd_path_group_entry *)
6058 			(info->entry + i * info->entry_size);
6059 		/* PGID */
6060 		seq_printf(m, "pgid %*phN\n", 11, entry->pgid);
6061 		/* FLAGS */
6062 		seq_printf(m, "status_flags %02x\n", entry->status_flags);
6063 		/* SYSPLEX NAME */
6064 		memcpy(&sysplex, &entry->sysplex_name, sizeof(sysplex) - 1);
6065 		EBCASC(sysplex, sizeof(sysplex));
6066 		seq_printf(m, "sysplex_name %8s\n", sysplex);
6067 		/* SUPPORTED CYLINDER */
6068 		seq_printf(m, "supported_cylinder %d\n", entry->cylinder);
6069 		/* TIMESTAMP */
6070 		seq_printf(m, "timestamp %lu\n", (unsigned long)
6071 			   entry->timestamp);
6072 	}
6073 	kfree(access);
6074 
6075 	return 0;
6076 }
6077 
6078 /*
6079  * Perform Subsystem Function - CUIR response
6080  */
6081 static int
6082 dasd_eckd_psf_cuir_response(struct dasd_device *device, int response,
6083 			    __u32 message_id, __u8 lpum)
6084 {
6085 	struct dasd_psf_cuir_response *psf_cuir;
6086 	int pos = pathmask_to_pos(lpum);
6087 	struct dasd_ccw_req *cqr;
6088 	struct ccw1 *ccw;
6089 	int rc;
6090 
6091 	cqr = dasd_smalloc_request(DASD_ECKD_MAGIC, 1 /* PSF */ ,
6092 				   sizeof(struct dasd_psf_cuir_response),
6093 				   device, NULL);
6094 
6095 	if (IS_ERR(cqr)) {
6096 		DBF_DEV_EVENT(DBF_WARNING, device, "%s",
6097 			   "Could not allocate PSF-CUIR request");
6098 		return PTR_ERR(cqr);
6099 	}
6100 
6101 	psf_cuir = (struct dasd_psf_cuir_response *)cqr->data;
6102 	psf_cuir->order = PSF_ORDER_CUIR_RESPONSE;
6103 	psf_cuir->cc = response;
6104 	psf_cuir->chpid = device->path[pos].chpid;
6105 	psf_cuir->message_id = message_id;
6106 	psf_cuir->cssid = device->path[pos].cssid;
6107 	psf_cuir->ssid = device->path[pos].ssid;
6108 	ccw = cqr->cpaddr;
6109 	ccw->cmd_code = DASD_ECKD_CCW_PSF;
6110 	ccw->cda = (__u32)(addr_t)psf_cuir;
6111 	ccw->flags = CCW_FLAG_SLI;
6112 	ccw->count = sizeof(struct dasd_psf_cuir_response);
6113 
6114 	cqr->startdev = device;
6115 	cqr->memdev = device;
6116 	cqr->block = NULL;
6117 	cqr->retries = 256;
6118 	cqr->expires = 10*HZ;
6119 	cqr->buildclk = get_tod_clock();
6120 	cqr->status = DASD_CQR_FILLED;
6121 	set_bit(DASD_CQR_VERIFY_PATH, &cqr->flags);
6122 
6123 	rc = dasd_sleep_on(cqr);
6124 
6125 	dasd_sfree_request(cqr, cqr->memdev);
6126 	return rc;
6127 }
6128 
6129 /*
6130  * return configuration data that is referenced by record selector
6131  * if a record selector is specified or per default return the
6132  * conf_data pointer for the path specified by lpum
6133  */
6134 static struct dasd_conf_data *dasd_eckd_get_ref_conf(struct dasd_device *device,
6135 						     __u8 lpum,
6136 						     struct dasd_cuir_message *cuir)
6137 {
6138 	struct dasd_conf_data *conf_data;
6139 	int path, pos;
6140 
6141 	if (cuir->record_selector == 0)
6142 		goto out;
6143 	for (path = 0x80, pos = 0; path; path >>= 1, pos++) {
6144 		conf_data = device->path[pos].conf_data;
6145 		if (conf_data->gneq.record_selector ==
6146 		    cuir->record_selector)
6147 			return conf_data;
6148 	}
6149 out:
6150 	return device->path[pathmask_to_pos(lpum)].conf_data;
6151 }
6152 
6153 /*
6154  * This function determines the scope of a reconfiguration request by
6155  * analysing the path and device selection data provided in the CUIR request.
6156  * Returns a path mask containing CUIR affected paths for the give device.
6157  *
6158  * If the CUIR request does not contain the required information return the
6159  * path mask of the path the attention message for the CUIR request was reveived
6160  * on.
6161  */
6162 static int dasd_eckd_cuir_scope(struct dasd_device *device, __u8 lpum,
6163 				struct dasd_cuir_message *cuir)
6164 {
6165 	struct dasd_conf_data *ref_conf_data;
6166 	unsigned long bitmask = 0, mask = 0;
6167 	struct dasd_conf_data *conf_data;
6168 	unsigned int pos, path;
6169 	char *ref_gneq, *gneq;
6170 	char *ref_ned, *ned;
6171 	int tbcpm = 0;
6172 
6173 	/* if CUIR request does not specify the scope use the path
6174 	   the attention message was presented on */
6175 	if (!cuir->ned_map ||
6176 	    !(cuir->neq_map[0] | cuir->neq_map[1] | cuir->neq_map[2]))
6177 		return lpum;
6178 
6179 	/* get reference conf data */
6180 	ref_conf_data = dasd_eckd_get_ref_conf(device, lpum, cuir);
6181 	/* reference ned is determined by ned_map field */
6182 	pos = 8 - ffs(cuir->ned_map);
6183 	ref_ned = (char *)&ref_conf_data->neds[pos];
6184 	ref_gneq = (char *)&ref_conf_data->gneq;
6185 	/* transfer 24 bit neq_map to mask */
6186 	mask = cuir->neq_map[2];
6187 	mask |= cuir->neq_map[1] << 8;
6188 	mask |= cuir->neq_map[0] << 16;
6189 
6190 	for (path = 0; path < 8; path++) {
6191 		/* initialise data per path */
6192 		bitmask = mask;
6193 		conf_data = device->path[path].conf_data;
6194 		pos = 8 - ffs(cuir->ned_map);
6195 		ned = (char *) &conf_data->neds[pos];
6196 		/* compare reference ned and per path ned */
6197 		if (memcmp(ref_ned, ned, sizeof(*ned)) != 0)
6198 			continue;
6199 		gneq = (char *)&conf_data->gneq;
6200 		/* compare reference gneq and per_path gneq under
6201 		   24 bit mask where mask bit 0 equals byte 7 of
6202 		   the gneq and mask bit 24 equals byte 31 */
6203 		while (bitmask) {
6204 			pos = ffs(bitmask) - 1;
6205 			if (memcmp(&ref_gneq[31 - pos], &gneq[31 - pos], 1)
6206 			    != 0)
6207 				break;
6208 			clear_bit(pos, &bitmask);
6209 		}
6210 		if (bitmask)
6211 			continue;
6212 		/* device and path match the reference values
6213 		   add path to CUIR scope */
6214 		tbcpm |= 0x80 >> path;
6215 	}
6216 	return tbcpm;
6217 }
6218 
6219 static void dasd_eckd_cuir_notify_user(struct dasd_device *device,
6220 				       unsigned long paths, int action)
6221 {
6222 	int pos;
6223 
6224 	while (paths) {
6225 		/* get position of bit in mask */
6226 		pos = 8 - ffs(paths);
6227 		/* get channel path descriptor from this position */
6228 		if (action == CUIR_QUIESCE)
6229 			pr_warn("Service on the storage server caused path %x.%02x to go offline",
6230 				device->path[pos].cssid,
6231 				device->path[pos].chpid);
6232 		else if (action == CUIR_RESUME)
6233 			pr_info("Path %x.%02x is back online after service on the storage server",
6234 				device->path[pos].cssid,
6235 				device->path[pos].chpid);
6236 		clear_bit(7 - pos, &paths);
6237 	}
6238 }
6239 
6240 static int dasd_eckd_cuir_remove_path(struct dasd_device *device, __u8 lpum,
6241 				      struct dasd_cuir_message *cuir)
6242 {
6243 	unsigned long tbcpm;
6244 
6245 	tbcpm = dasd_eckd_cuir_scope(device, lpum, cuir);
6246 	/* nothing to do if path is not in use */
6247 	if (!(dasd_path_get_opm(device) & tbcpm))
6248 		return 0;
6249 	if (!(dasd_path_get_opm(device) & ~tbcpm)) {
6250 		/* no path would be left if the CUIR action is taken
6251 		   return error */
6252 		return -EINVAL;
6253 	}
6254 	/* remove device from operational path mask */
6255 	dasd_path_remove_opm(device, tbcpm);
6256 	dasd_path_add_cuirpm(device, tbcpm);
6257 	return tbcpm;
6258 }
6259 
6260 /*
6261  * walk through all devices and build a path mask to quiesce them
6262  * return an error if the last path to a device would be removed
6263  *
6264  * if only part of the devices are quiesced and an error
6265  * occurs no onlining necessary, the storage server will
6266  * notify the already set offline devices again
6267  */
6268 static int dasd_eckd_cuir_quiesce(struct dasd_device *device, __u8 lpum,
6269 				  struct dasd_cuir_message *cuir)
6270 {
6271 	struct dasd_eckd_private *private = device->private;
6272 	struct alias_pav_group *pavgroup, *tempgroup;
6273 	struct dasd_device *dev, *n;
6274 	unsigned long paths = 0;
6275 	unsigned long flags;
6276 	int tbcpm;
6277 
6278 	/* active devices */
6279 	list_for_each_entry_safe(dev, n, &private->lcu->active_devices,
6280 				 alias_list) {
6281 		spin_lock_irqsave(get_ccwdev_lock(dev->cdev), flags);
6282 		tbcpm = dasd_eckd_cuir_remove_path(dev, lpum, cuir);
6283 		spin_unlock_irqrestore(get_ccwdev_lock(dev->cdev), flags);
6284 		if (tbcpm < 0)
6285 			goto out_err;
6286 		paths |= tbcpm;
6287 	}
6288 	/* inactive devices */
6289 	list_for_each_entry_safe(dev, n, &private->lcu->inactive_devices,
6290 				 alias_list) {
6291 		spin_lock_irqsave(get_ccwdev_lock(dev->cdev), flags);
6292 		tbcpm = dasd_eckd_cuir_remove_path(dev, lpum, cuir);
6293 		spin_unlock_irqrestore(get_ccwdev_lock(dev->cdev), flags);
6294 		if (tbcpm < 0)
6295 			goto out_err;
6296 		paths |= tbcpm;
6297 	}
6298 	/* devices in PAV groups */
6299 	list_for_each_entry_safe(pavgroup, tempgroup,
6300 				 &private->lcu->grouplist, group) {
6301 		list_for_each_entry_safe(dev, n, &pavgroup->baselist,
6302 					 alias_list) {
6303 			spin_lock_irqsave(get_ccwdev_lock(dev->cdev), flags);
6304 			tbcpm = dasd_eckd_cuir_remove_path(dev, lpum, cuir);
6305 			spin_unlock_irqrestore(
6306 				get_ccwdev_lock(dev->cdev), flags);
6307 			if (tbcpm < 0)
6308 				goto out_err;
6309 			paths |= tbcpm;
6310 		}
6311 		list_for_each_entry_safe(dev, n, &pavgroup->aliaslist,
6312 					 alias_list) {
6313 			spin_lock_irqsave(get_ccwdev_lock(dev->cdev), flags);
6314 			tbcpm = dasd_eckd_cuir_remove_path(dev, lpum, cuir);
6315 			spin_unlock_irqrestore(
6316 				get_ccwdev_lock(dev->cdev), flags);
6317 			if (tbcpm < 0)
6318 				goto out_err;
6319 			paths |= tbcpm;
6320 		}
6321 	}
6322 	/* notify user about all paths affected by CUIR action */
6323 	dasd_eckd_cuir_notify_user(device, paths, CUIR_QUIESCE);
6324 	return 0;
6325 out_err:
6326 	return tbcpm;
6327 }
6328 
6329 static int dasd_eckd_cuir_resume(struct dasd_device *device, __u8 lpum,
6330 				 struct dasd_cuir_message *cuir)
6331 {
6332 	struct dasd_eckd_private *private = device->private;
6333 	struct alias_pav_group *pavgroup, *tempgroup;
6334 	struct dasd_device *dev, *n;
6335 	unsigned long paths = 0;
6336 	int tbcpm;
6337 
6338 	/*
6339 	 * the path may have been added through a generic path event before
6340 	 * only trigger path verification if the path is not already in use
6341 	 */
6342 	list_for_each_entry_safe(dev, n,
6343 				 &private->lcu->active_devices,
6344 				 alias_list) {
6345 		tbcpm = dasd_eckd_cuir_scope(dev, lpum, cuir);
6346 		paths |= tbcpm;
6347 		if (!(dasd_path_get_opm(dev) & tbcpm)) {
6348 			dasd_path_add_tbvpm(dev, tbcpm);
6349 			dasd_schedule_device_bh(dev);
6350 		}
6351 	}
6352 	list_for_each_entry_safe(dev, n,
6353 				 &private->lcu->inactive_devices,
6354 				 alias_list) {
6355 		tbcpm = dasd_eckd_cuir_scope(dev, lpum, cuir);
6356 		paths |= tbcpm;
6357 		if (!(dasd_path_get_opm(dev) & tbcpm)) {
6358 			dasd_path_add_tbvpm(dev, tbcpm);
6359 			dasd_schedule_device_bh(dev);
6360 		}
6361 	}
6362 	/* devices in PAV groups */
6363 	list_for_each_entry_safe(pavgroup, tempgroup,
6364 				 &private->lcu->grouplist,
6365 				 group) {
6366 		list_for_each_entry_safe(dev, n,
6367 					 &pavgroup->baselist,
6368 					 alias_list) {
6369 			tbcpm = dasd_eckd_cuir_scope(dev, lpum, cuir);
6370 			paths |= tbcpm;
6371 			if (!(dasd_path_get_opm(dev) & tbcpm)) {
6372 				dasd_path_add_tbvpm(dev, tbcpm);
6373 				dasd_schedule_device_bh(dev);
6374 			}
6375 		}
6376 		list_for_each_entry_safe(dev, n,
6377 					 &pavgroup->aliaslist,
6378 					 alias_list) {
6379 			tbcpm = dasd_eckd_cuir_scope(dev, lpum, cuir);
6380 			paths |= tbcpm;
6381 			if (!(dasd_path_get_opm(dev) & tbcpm)) {
6382 				dasd_path_add_tbvpm(dev, tbcpm);
6383 				dasd_schedule_device_bh(dev);
6384 			}
6385 		}
6386 	}
6387 	/* notify user about all paths affected by CUIR action */
6388 	dasd_eckd_cuir_notify_user(device, paths, CUIR_RESUME);
6389 	return 0;
6390 }
6391 
6392 static void dasd_eckd_handle_cuir(struct dasd_device *device, void *messages,
6393 				 __u8 lpum)
6394 {
6395 	struct dasd_cuir_message *cuir = messages;
6396 	int response;
6397 
6398 	DBF_DEV_EVENT(DBF_WARNING, device,
6399 		      "CUIR request: %016llx %016llx %016llx %08x",
6400 		      ((u64 *)cuir)[0], ((u64 *)cuir)[1], ((u64 *)cuir)[2],
6401 		      ((u32 *)cuir)[3]);
6402 
6403 	if (cuir->code == CUIR_QUIESCE) {
6404 		/* quiesce */
6405 		if (dasd_eckd_cuir_quiesce(device, lpum, cuir))
6406 			response = PSF_CUIR_LAST_PATH;
6407 		else
6408 			response = PSF_CUIR_COMPLETED;
6409 	} else if (cuir->code == CUIR_RESUME) {
6410 		/* resume */
6411 		dasd_eckd_cuir_resume(device, lpum, cuir);
6412 		response = PSF_CUIR_COMPLETED;
6413 	} else
6414 		response = PSF_CUIR_NOT_SUPPORTED;
6415 
6416 	dasd_eckd_psf_cuir_response(device, response,
6417 				    cuir->message_id, lpum);
6418 	DBF_DEV_EVENT(DBF_WARNING, device,
6419 		      "CUIR response: %d on message ID %08x", response,
6420 		      cuir->message_id);
6421 	/* to make sure there is no attention left schedule work again */
6422 	device->discipline->check_attention(device, lpum);
6423 }
6424 
6425 static void dasd_eckd_oos_resume(struct dasd_device *device)
6426 {
6427 	struct dasd_eckd_private *private = device->private;
6428 	struct alias_pav_group *pavgroup, *tempgroup;
6429 	struct dasd_device *dev, *n;
6430 	unsigned long flags;
6431 
6432 	spin_lock_irqsave(&private->lcu->lock, flags);
6433 	list_for_each_entry_safe(dev, n, &private->lcu->active_devices,
6434 				 alias_list) {
6435 		if (dev->stopped & DASD_STOPPED_NOSPC)
6436 			dasd_generic_space_avail(dev);
6437 	}
6438 	list_for_each_entry_safe(dev, n, &private->lcu->inactive_devices,
6439 				 alias_list) {
6440 		if (dev->stopped & DASD_STOPPED_NOSPC)
6441 			dasd_generic_space_avail(dev);
6442 	}
6443 	/* devices in PAV groups */
6444 	list_for_each_entry_safe(pavgroup, tempgroup,
6445 				 &private->lcu->grouplist,
6446 				 group) {
6447 		list_for_each_entry_safe(dev, n, &pavgroup->baselist,
6448 					 alias_list) {
6449 			if (dev->stopped & DASD_STOPPED_NOSPC)
6450 				dasd_generic_space_avail(dev);
6451 		}
6452 		list_for_each_entry_safe(dev, n, &pavgroup->aliaslist,
6453 					 alias_list) {
6454 			if (dev->stopped & DASD_STOPPED_NOSPC)
6455 				dasd_generic_space_avail(dev);
6456 		}
6457 	}
6458 	spin_unlock_irqrestore(&private->lcu->lock, flags);
6459 }
6460 
6461 static void dasd_eckd_handle_oos(struct dasd_device *device, void *messages,
6462 				 __u8 lpum)
6463 {
6464 	struct dasd_oos_message *oos = messages;
6465 
6466 	switch (oos->code) {
6467 	case REPO_WARN:
6468 	case POOL_WARN:
6469 		dev_warn(&device->cdev->dev,
6470 			 "Extent pool usage has reached a critical value\n");
6471 		dasd_eckd_oos_resume(device);
6472 		break;
6473 	case REPO_EXHAUST:
6474 	case POOL_EXHAUST:
6475 		dev_warn(&device->cdev->dev,
6476 			 "Extent pool is exhausted\n");
6477 		break;
6478 	case REPO_RELIEVE:
6479 	case POOL_RELIEVE:
6480 		dev_info(&device->cdev->dev,
6481 			 "Extent pool physical space constraint has been relieved\n");
6482 		break;
6483 	}
6484 
6485 	/* In any case, update related data */
6486 	dasd_eckd_read_ext_pool_info(device);
6487 
6488 	/* to make sure there is no attention left schedule work again */
6489 	device->discipline->check_attention(device, lpum);
6490 }
6491 
6492 static void dasd_eckd_check_attention_work(struct work_struct *work)
6493 {
6494 	struct check_attention_work_data *data;
6495 	struct dasd_rssd_messages *messages;
6496 	struct dasd_device *device;
6497 	int rc;
6498 
6499 	data = container_of(work, struct check_attention_work_data, worker);
6500 	device = data->device;
6501 	messages = kzalloc(sizeof(*messages), GFP_KERNEL);
6502 	if (!messages) {
6503 		DBF_DEV_EVENT(DBF_WARNING, device, "%s",
6504 			      "Could not allocate attention message buffer");
6505 		goto out;
6506 	}
6507 	rc = dasd_eckd_read_message_buffer(device, messages, data->lpum);
6508 	if (rc)
6509 		goto out;
6510 
6511 	if (messages->length == ATTENTION_LENGTH_CUIR &&
6512 	    messages->format == ATTENTION_FORMAT_CUIR)
6513 		dasd_eckd_handle_cuir(device, messages, data->lpum);
6514 	if (messages->length == ATTENTION_LENGTH_OOS &&
6515 	    messages->format == ATTENTION_FORMAT_OOS)
6516 		dasd_eckd_handle_oos(device, messages, data->lpum);
6517 
6518 out:
6519 	dasd_put_device(device);
6520 	kfree(messages);
6521 	kfree(data);
6522 }
6523 
6524 static int dasd_eckd_check_attention(struct dasd_device *device, __u8 lpum)
6525 {
6526 	struct check_attention_work_data *data;
6527 
6528 	data = kzalloc(sizeof(*data), GFP_ATOMIC);
6529 	if (!data)
6530 		return -ENOMEM;
6531 	INIT_WORK(&data->worker, dasd_eckd_check_attention_work);
6532 	dasd_get_device(device);
6533 	data->device = device;
6534 	data->lpum = lpum;
6535 	schedule_work(&data->worker);
6536 	return 0;
6537 }
6538 
6539 static int dasd_eckd_disable_hpf_path(struct dasd_device *device, __u8 lpum)
6540 {
6541 	if (~lpum & dasd_path_get_opm(device)) {
6542 		dasd_path_add_nohpfpm(device, lpum);
6543 		dasd_path_remove_opm(device, lpum);
6544 		dev_err(&device->cdev->dev,
6545 			"Channel path %02X lost HPF functionality and is disabled\n",
6546 			lpum);
6547 		return 1;
6548 	}
6549 	return 0;
6550 }
6551 
6552 static void dasd_eckd_disable_hpf_device(struct dasd_device *device)
6553 {
6554 	struct dasd_eckd_private *private = device->private;
6555 
6556 	dev_err(&device->cdev->dev,
6557 		"High Performance FICON disabled\n");
6558 	private->fcx_max_data = 0;
6559 }
6560 
6561 static int dasd_eckd_hpf_enabled(struct dasd_device *device)
6562 {
6563 	struct dasd_eckd_private *private = device->private;
6564 
6565 	return private->fcx_max_data ? 1 : 0;
6566 }
6567 
6568 static void dasd_eckd_handle_hpf_error(struct dasd_device *device,
6569 				       struct irb *irb)
6570 {
6571 	struct dasd_eckd_private *private = device->private;
6572 
6573 	if (!private->fcx_max_data) {
6574 		/* sanity check for no HPF, the error makes no sense */
6575 		DBF_DEV_EVENT(DBF_WARNING, device, "%s",
6576 			      "Trying to disable HPF for a non HPF device");
6577 		return;
6578 	}
6579 	if (irb->scsw.tm.sesq == SCSW_SESQ_DEV_NOFCX) {
6580 		dasd_eckd_disable_hpf_device(device);
6581 	} else if (irb->scsw.tm.sesq == SCSW_SESQ_PATH_NOFCX) {
6582 		if (dasd_eckd_disable_hpf_path(device, irb->esw.esw1.lpum))
6583 			return;
6584 		dasd_eckd_disable_hpf_device(device);
6585 		dasd_path_set_tbvpm(device,
6586 				  dasd_path_get_hpfpm(device));
6587 	}
6588 	/*
6589 	 * prevent that any new I/O ist started on the device and schedule a
6590 	 * requeue of existing requests
6591 	 */
6592 	dasd_device_set_stop_bits(device, DASD_STOPPED_NOT_ACC);
6593 	dasd_schedule_requeue(device);
6594 }
6595 
6596 /*
6597  * Initialize block layer request queue.
6598  */
6599 static void dasd_eckd_setup_blk_queue(struct dasd_block *block)
6600 {
6601 	unsigned int logical_block_size = block->bp_block;
6602 	struct request_queue *q = block->request_queue;
6603 	struct dasd_device *device = block->base;
6604 	int max;
6605 
6606 	if (device->features & DASD_FEATURE_USERAW) {
6607 		/*
6608 		 * the max_blocks value for raw_track access is 256
6609 		 * it is higher than the native ECKD value because we
6610 		 * only need one ccw per track
6611 		 * so the max_hw_sectors are
6612 		 * 2048 x 512B = 1024kB = 16 tracks
6613 		 */
6614 		max = DASD_ECKD_MAX_BLOCKS_RAW << block->s2b_shift;
6615 	} else {
6616 		max = DASD_ECKD_MAX_BLOCKS << block->s2b_shift;
6617 	}
6618 	blk_queue_flag_set(QUEUE_FLAG_NONROT, q);
6619 	q->limits.max_dev_sectors = max;
6620 	blk_queue_logical_block_size(q, logical_block_size);
6621 	blk_queue_max_hw_sectors(q, max);
6622 	blk_queue_max_segments(q, USHRT_MAX);
6623 	/* With page sized segments each segment can be translated into one idaw/tidaw */
6624 	blk_queue_max_segment_size(q, PAGE_SIZE);
6625 	blk_queue_segment_boundary(q, PAGE_SIZE - 1);
6626 }
6627 
6628 static struct ccw_driver dasd_eckd_driver = {
6629 	.driver = {
6630 		.name	= "dasd-eckd",
6631 		.owner	= THIS_MODULE,
6632 	},
6633 	.ids	     = dasd_eckd_ids,
6634 	.probe	     = dasd_eckd_probe,
6635 	.remove      = dasd_generic_remove,
6636 	.set_offline = dasd_generic_set_offline,
6637 	.set_online  = dasd_eckd_set_online,
6638 	.notify      = dasd_generic_notify,
6639 	.path_event  = dasd_generic_path_event,
6640 	.shutdown    = dasd_generic_shutdown,
6641 	.uc_handler  = dasd_generic_uc_handler,
6642 	.int_class   = IRQIO_DAS,
6643 };
6644 
6645 static struct dasd_discipline dasd_eckd_discipline = {
6646 	.owner = THIS_MODULE,
6647 	.name = "ECKD",
6648 	.ebcname = "ECKD",
6649 	.check_device = dasd_eckd_check_characteristics,
6650 	.uncheck_device = dasd_eckd_uncheck_device,
6651 	.do_analysis = dasd_eckd_do_analysis,
6652 	.pe_handler = dasd_eckd_pe_handler,
6653 	.basic_to_ready = dasd_eckd_basic_to_ready,
6654 	.online_to_ready = dasd_eckd_online_to_ready,
6655 	.basic_to_known = dasd_eckd_basic_to_known,
6656 	.setup_blk_queue = dasd_eckd_setup_blk_queue,
6657 	.fill_geometry = dasd_eckd_fill_geometry,
6658 	.start_IO = dasd_start_IO,
6659 	.term_IO = dasd_term_IO,
6660 	.handle_terminated_request = dasd_eckd_handle_terminated_request,
6661 	.format_device = dasd_eckd_format_device,
6662 	.check_device_format = dasd_eckd_check_device_format,
6663 	.erp_action = dasd_eckd_erp_action,
6664 	.erp_postaction = dasd_eckd_erp_postaction,
6665 	.check_for_device_change = dasd_eckd_check_for_device_change,
6666 	.build_cp = dasd_eckd_build_alias_cp,
6667 	.free_cp = dasd_eckd_free_alias_cp,
6668 	.dump_sense = dasd_eckd_dump_sense,
6669 	.dump_sense_dbf = dasd_eckd_dump_sense_dbf,
6670 	.fill_info = dasd_eckd_fill_info,
6671 	.ioctl = dasd_eckd_ioctl,
6672 	.reload = dasd_eckd_reload_device,
6673 	.get_uid = dasd_eckd_get_uid,
6674 	.kick_validate = dasd_eckd_kick_validate_server,
6675 	.check_attention = dasd_eckd_check_attention,
6676 	.host_access_count = dasd_eckd_host_access_count,
6677 	.hosts_print = dasd_hosts_print,
6678 	.handle_hpf_error = dasd_eckd_handle_hpf_error,
6679 	.disable_hpf = dasd_eckd_disable_hpf_device,
6680 	.hpf_enabled = dasd_eckd_hpf_enabled,
6681 	.reset_path = dasd_eckd_reset_path,
6682 	.is_ese = dasd_eckd_is_ese,
6683 	.space_allocated = dasd_eckd_space_allocated,
6684 	.space_configured = dasd_eckd_space_configured,
6685 	.logical_capacity = dasd_eckd_logical_capacity,
6686 	.release_space = dasd_eckd_release_space,
6687 	.ext_pool_id = dasd_eckd_ext_pool_id,
6688 	.ext_size = dasd_eckd_ext_size,
6689 	.ext_pool_cap_at_warnlevel = dasd_eckd_ext_pool_cap_at_warnlevel,
6690 	.ext_pool_warn_thrshld = dasd_eckd_ext_pool_warn_thrshld,
6691 	.ext_pool_oos = dasd_eckd_ext_pool_oos,
6692 	.ext_pool_exhaust = dasd_eckd_ext_pool_exhaust,
6693 	.ese_format = dasd_eckd_ese_format,
6694 	.ese_read = dasd_eckd_ese_read,
6695 };
6696 
6697 static int __init
6698 dasd_eckd_init(void)
6699 {
6700 	int ret;
6701 
6702 	ASCEBC(dasd_eckd_discipline.ebcname, 4);
6703 	dasd_reserve_req = kmalloc(sizeof(*dasd_reserve_req),
6704 				   GFP_KERNEL | GFP_DMA);
6705 	if (!dasd_reserve_req)
6706 		return -ENOMEM;
6707 	dasd_vol_info_req = kmalloc(sizeof(*dasd_vol_info_req),
6708 				    GFP_KERNEL | GFP_DMA);
6709 	if (!dasd_vol_info_req)
6710 		return -ENOMEM;
6711 	pe_handler_worker = kmalloc(sizeof(*pe_handler_worker),
6712 				    GFP_KERNEL | GFP_DMA);
6713 	if (!pe_handler_worker) {
6714 		kfree(dasd_reserve_req);
6715 		kfree(dasd_vol_info_req);
6716 		return -ENOMEM;
6717 	}
6718 	rawpadpage = (void *)__get_free_page(GFP_KERNEL);
6719 	if (!rawpadpage) {
6720 		kfree(pe_handler_worker);
6721 		kfree(dasd_reserve_req);
6722 		kfree(dasd_vol_info_req);
6723 		return -ENOMEM;
6724 	}
6725 	ret = ccw_driver_register(&dasd_eckd_driver);
6726 	if (!ret)
6727 		wait_for_device_probe();
6728 	else {
6729 		kfree(pe_handler_worker);
6730 		kfree(dasd_reserve_req);
6731 		kfree(dasd_vol_info_req);
6732 		free_page((unsigned long)rawpadpage);
6733 	}
6734 	return ret;
6735 }
6736 
6737 static void __exit
6738 dasd_eckd_cleanup(void)
6739 {
6740 	ccw_driver_unregister(&dasd_eckd_driver);
6741 	kfree(pe_handler_worker);
6742 	kfree(dasd_reserve_req);
6743 	free_page((unsigned long)rawpadpage);
6744 }
6745 
6746 module_init(dasd_eckd_init);
6747 module_exit(dasd_eckd_cleanup);
6748