xref: /openbmc/linux/drivers/s390/block/dasd_eckd.c (revision 9ac8d3fb)
1 /*
2  * File...........: linux/drivers/s390/block/dasd_eckd.c
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  * (C) IBM Corporation, IBM Deutschland Entwicklung GmbH, 1999,2000
9  * EMC Symmetrix ioctl Copyright EMC Corporation, 2008
10  * Author.........: Nigel Hislop <hislop_nigel@emc.com>
11  *
12  */
13 
14 #include <linux/stddef.h>
15 #include <linux/kernel.h>
16 #include <linux/slab.h>
17 #include <linux/hdreg.h>	/* HDIO_GETGEO			    */
18 #include <linux/bio.h>
19 #include <linux/module.h>
20 #include <linux/init.h>
21 
22 #include <asm/debug.h>
23 #include <asm/idals.h>
24 #include <asm/ebcdic.h>
25 #include <asm/io.h>
26 #include <asm/todclk.h>
27 #include <asm/uaccess.h>
28 #include <asm/cio.h>
29 #include <asm/ccwdev.h>
30 
31 #include "dasd_int.h"
32 #include "dasd_eckd.h"
33 
34 #ifdef PRINTK_HEADER
35 #undef PRINTK_HEADER
36 #endif				/* PRINTK_HEADER */
37 #define PRINTK_HEADER "dasd(eckd):"
38 
39 #define ECKD_C0(i) (i->home_bytes)
40 #define ECKD_F(i) (i->formula)
41 #define ECKD_F1(i) (ECKD_F(i)==0x01?(i->factors.f_0x01.f1):\
42 		    (i->factors.f_0x02.f1))
43 #define ECKD_F2(i) (ECKD_F(i)==0x01?(i->factors.f_0x01.f2):\
44 		    (i->factors.f_0x02.f2))
45 #define ECKD_F3(i) (ECKD_F(i)==0x01?(i->factors.f_0x01.f3):\
46 		    (i->factors.f_0x02.f3))
47 #define ECKD_F4(i) (ECKD_F(i)==0x02?(i->factors.f_0x02.f4):0)
48 #define ECKD_F5(i) (ECKD_F(i)==0x02?(i->factors.f_0x02.f5):0)
49 #define ECKD_F6(i) (i->factor6)
50 #define ECKD_F7(i) (i->factor7)
51 #define ECKD_F8(i) (i->factor8)
52 
53 MODULE_LICENSE("GPL");
54 
55 static struct dasd_discipline dasd_eckd_discipline;
56 
57 /* The ccw bus type uses this table to find devices that it sends to
58  * dasd_eckd_probe */
59 static struct ccw_device_id dasd_eckd_ids[] = {
60 	{ CCW_DEVICE_DEVTYPE (0x3990, 0, 0x3390, 0), .driver_info = 0x1},
61 	{ CCW_DEVICE_DEVTYPE (0x2105, 0, 0x3390, 0), .driver_info = 0x2},
62 	{ CCW_DEVICE_DEVTYPE (0x3880, 0, 0x3390, 0), .driver_info = 0x3},
63 	{ CCW_DEVICE_DEVTYPE (0x3990, 0, 0x3380, 0), .driver_info = 0x4},
64 	{ CCW_DEVICE_DEVTYPE (0x2105, 0, 0x3380, 0), .driver_info = 0x5},
65 	{ CCW_DEVICE_DEVTYPE (0x9343, 0, 0x9345, 0), .driver_info = 0x6},
66 	{ CCW_DEVICE_DEVTYPE (0x2107, 0, 0x3390, 0), .driver_info = 0x7},
67 	{ CCW_DEVICE_DEVTYPE (0x2107, 0, 0x3380, 0), .driver_info = 0x8},
68 	{ CCW_DEVICE_DEVTYPE (0x1750, 0, 0x3390, 0), .driver_info = 0x9},
69 	{ CCW_DEVICE_DEVTYPE (0x1750, 0, 0x3380, 0), .driver_info = 0xa},
70 	{ /* end of list */ },
71 };
72 
73 MODULE_DEVICE_TABLE(ccw, dasd_eckd_ids);
74 
75 static struct ccw_driver dasd_eckd_driver; /* see below */
76 
77 /* initial attempt at a probe function. this can be simplified once
78  * the other detection code is gone */
79 static int
80 dasd_eckd_probe (struct ccw_device *cdev)
81 {
82 	int ret;
83 
84 	/* set ECKD specific ccw-device options */
85 	ret = ccw_device_set_options(cdev, CCWDEV_ALLOW_FORCE);
86 	if (ret) {
87 		printk(KERN_WARNING
88 		       "dasd_eckd_probe: could not set ccw-device options "
89 		       "for %s\n", dev_name(&cdev->dev));
90 		return ret;
91 	}
92 	ret = dasd_generic_probe(cdev, &dasd_eckd_discipline);
93 	return ret;
94 }
95 
96 static int
97 dasd_eckd_set_online(struct ccw_device *cdev)
98 {
99 	return dasd_generic_set_online(cdev, &dasd_eckd_discipline);
100 }
101 
102 static struct ccw_driver dasd_eckd_driver = {
103 	.name        = "dasd-eckd",
104 	.owner       = THIS_MODULE,
105 	.ids         = dasd_eckd_ids,
106 	.probe       = dasd_eckd_probe,
107 	.remove      = dasd_generic_remove,
108 	.set_offline = dasd_generic_set_offline,
109 	.set_online  = dasd_eckd_set_online,
110 	.notify      = dasd_generic_notify,
111 };
112 
113 static const int sizes_trk0[] = { 28, 148, 84 };
114 #define LABEL_SIZE 140
115 
116 static inline unsigned int
117 round_up_multiple(unsigned int no, unsigned int mult)
118 {
119 	int rem = no % mult;
120 	return (rem ? no - rem + mult : no);
121 }
122 
123 static inline unsigned int
124 ceil_quot(unsigned int d1, unsigned int d2)
125 {
126 	return (d1 + (d2 - 1)) / d2;
127 }
128 
129 static unsigned int
130 recs_per_track(struct dasd_eckd_characteristics * rdc,
131 	       unsigned int kl, unsigned int dl)
132 {
133 	int dn, kn;
134 
135 	switch (rdc->dev_type) {
136 	case 0x3380:
137 		if (kl)
138 			return 1499 / (15 + 7 + ceil_quot(kl + 12, 32) +
139 				       ceil_quot(dl + 12, 32));
140 		else
141 			return 1499 / (15 + ceil_quot(dl + 12, 32));
142 	case 0x3390:
143 		dn = ceil_quot(dl + 6, 232) + 1;
144 		if (kl) {
145 			kn = ceil_quot(kl + 6, 232) + 1;
146 			return 1729 / (10 + 9 + ceil_quot(kl + 6 * kn, 34) +
147 				       9 + ceil_quot(dl + 6 * dn, 34));
148 		} else
149 			return 1729 / (10 + 9 + ceil_quot(dl + 6 * dn, 34));
150 	case 0x9345:
151 		dn = ceil_quot(dl + 6, 232) + 1;
152 		if (kl) {
153 			kn = ceil_quot(kl + 6, 232) + 1;
154 			return 1420 / (18 + 7 + ceil_quot(kl + 6 * kn, 34) +
155 				       ceil_quot(dl + 6 * dn, 34));
156 		} else
157 			return 1420 / (18 + 7 + ceil_quot(dl + 6 * dn, 34));
158 	}
159 	return 0;
160 }
161 
162 static int
163 check_XRC (struct ccw1         *de_ccw,
164            struct DE_eckd_data *data,
165            struct dasd_device  *device)
166 {
167         struct dasd_eckd_private *private;
168 	int rc;
169 
170         private = (struct dasd_eckd_private *) device->private;
171 	if (!private->rdc_data.facilities.XRC_supported)
172 		return 0;
173 
174         /* switch on System Time Stamp - needed for XRC Support */
175 	data->ga_extended |= 0x08; /* switch on 'Time Stamp Valid'   */
176 	data->ga_extended |= 0x02; /* switch on 'Extended Parameter' */
177 
178 	rc = get_sync_clock(&data->ep_sys_time);
179 	/* Ignore return code if sync clock is switched off. */
180 	if (rc == -ENOSYS || rc == -EACCES)
181 		rc = 0;
182 
183 	de_ccw->count = sizeof(struct DE_eckd_data);
184 	de_ccw->flags |= CCW_FLAG_SLI;
185 	return rc;
186 }
187 
188 static int
189 define_extent(struct ccw1 * ccw, struct DE_eckd_data * data, int trk,
190 	      int totrk, int cmd, struct dasd_device * device)
191 {
192 	struct dasd_eckd_private *private;
193 	struct ch_t geo, beg, end;
194 	int rc = 0;
195 
196 	private = (struct dasd_eckd_private *) device->private;
197 
198 	ccw->cmd_code = DASD_ECKD_CCW_DEFINE_EXTENT;
199 	ccw->flags = 0;
200 	ccw->count = 16;
201 	ccw->cda = (__u32) __pa(data);
202 
203 	memset(data, 0, sizeof(struct DE_eckd_data));
204 	switch (cmd) {
205 	case DASD_ECKD_CCW_READ_HOME_ADDRESS:
206 	case DASD_ECKD_CCW_READ_RECORD_ZERO:
207 	case DASD_ECKD_CCW_READ:
208 	case DASD_ECKD_CCW_READ_MT:
209 	case DASD_ECKD_CCW_READ_CKD:
210 	case DASD_ECKD_CCW_READ_CKD_MT:
211 	case DASD_ECKD_CCW_READ_KD:
212 	case DASD_ECKD_CCW_READ_KD_MT:
213 	case DASD_ECKD_CCW_READ_COUNT:
214 		data->mask.perm = 0x1;
215 		data->attributes.operation = private->attrib.operation;
216 		break;
217 	case DASD_ECKD_CCW_WRITE:
218 	case DASD_ECKD_CCW_WRITE_MT:
219 	case DASD_ECKD_CCW_WRITE_KD:
220 	case DASD_ECKD_CCW_WRITE_KD_MT:
221 		data->mask.perm = 0x02;
222 		data->attributes.operation = private->attrib.operation;
223 		rc = check_XRC (ccw, data, device);
224 		break;
225 	case DASD_ECKD_CCW_WRITE_CKD:
226 	case DASD_ECKD_CCW_WRITE_CKD_MT:
227 		data->attributes.operation = DASD_BYPASS_CACHE;
228 		rc = check_XRC (ccw, data, device);
229 		break;
230 	case DASD_ECKD_CCW_ERASE:
231 	case DASD_ECKD_CCW_WRITE_HOME_ADDRESS:
232 	case DASD_ECKD_CCW_WRITE_RECORD_ZERO:
233 		data->mask.perm = 0x3;
234 		data->mask.auth = 0x1;
235 		data->attributes.operation = DASD_BYPASS_CACHE;
236 		rc = check_XRC (ccw, data, device);
237 		break;
238 	default:
239 		DEV_MESSAGE(KERN_ERR, device, "unknown opcode 0x%x", cmd);
240 		break;
241 	}
242 
243 	data->attributes.mode = 0x3;	/* ECKD */
244 
245 	if ((private->rdc_data.cu_type == 0x2105 ||
246 	     private->rdc_data.cu_type == 0x2107 ||
247 	     private->rdc_data.cu_type == 0x1750)
248 	    && !(private->uses_cdl && trk < 2))
249 		data->ga_extended |= 0x40; /* Regular Data Format Mode */
250 
251 	geo.cyl = private->rdc_data.no_cyl;
252 	geo.head = private->rdc_data.trk_per_cyl;
253 	beg.cyl = trk / geo.head;
254 	beg.head = trk % geo.head;
255 	end.cyl = totrk / geo.head;
256 	end.head = totrk % geo.head;
257 
258 	/* check for sequential prestage - enhance cylinder range */
259 	if (data->attributes.operation == DASD_SEQ_PRESTAGE ||
260 	    data->attributes.operation == DASD_SEQ_ACCESS) {
261 
262 		if (end.cyl + private->attrib.nr_cyl < geo.cyl)
263 			end.cyl += private->attrib.nr_cyl;
264 		else
265 			end.cyl = (geo.cyl - 1);
266 	}
267 
268 	data->beg_ext.cyl = beg.cyl;
269 	data->beg_ext.head = beg.head;
270 	data->end_ext.cyl = end.cyl;
271 	data->end_ext.head = end.head;
272 	return rc;
273 }
274 
275 static int check_XRC_on_prefix(struct PFX_eckd_data *pfxdata,
276 			       struct dasd_device  *device)
277 {
278 	struct dasd_eckd_private *private;
279 	int rc;
280 
281 	private = (struct dasd_eckd_private *) device->private;
282 	if (!private->rdc_data.facilities.XRC_supported)
283 		return 0;
284 
285 	/* switch on System Time Stamp - needed for XRC Support */
286 	pfxdata->define_extend.ga_extended |= 0x08; /* 'Time Stamp Valid'   */
287 	pfxdata->define_extend.ga_extended |= 0x02; /* 'Extended Parameter' */
288 	pfxdata->validity.time_stamp = 1;	    /* 'Time Stamp Valid'   */
289 
290 	rc = get_sync_clock(&pfxdata->define_extend.ep_sys_time);
291 	/* Ignore return code if sync clock is switched off. */
292 	if (rc == -ENOSYS || rc == -EACCES)
293 		rc = 0;
294 	return rc;
295 }
296 
297 static int prefix(struct ccw1 *ccw, struct PFX_eckd_data *pfxdata, int trk,
298 		  int totrk, int cmd, struct dasd_device *basedev,
299 		  struct dasd_device *startdev)
300 {
301 	struct dasd_eckd_private *basepriv, *startpriv;
302 	struct DE_eckd_data *data;
303 	struct ch_t geo, beg, end;
304 	int rc = 0;
305 
306 	basepriv = (struct dasd_eckd_private *) basedev->private;
307 	startpriv = (struct dasd_eckd_private *) startdev->private;
308 	data = &pfxdata->define_extend;
309 
310 	ccw->cmd_code = DASD_ECKD_CCW_PFX;
311 	ccw->flags = 0;
312 	ccw->count = sizeof(*pfxdata);
313 	ccw->cda = (__u32) __pa(pfxdata);
314 
315 	memset(pfxdata, 0, sizeof(*pfxdata));
316 	/* prefix data */
317 	pfxdata->format = 0;
318 	pfxdata->base_address = basepriv->ned->unit_addr;
319 	pfxdata->base_lss = basepriv->ned->ID;
320 	pfxdata->validity.define_extend = 1;
321 
322 	/* private uid is kept up to date, conf_data may be outdated */
323 	if (startpriv->uid.type != UA_BASE_DEVICE) {
324 		pfxdata->validity.verify_base = 1;
325 		if (startpriv->uid.type == UA_HYPER_PAV_ALIAS)
326 			pfxdata->validity.hyper_pav = 1;
327 	}
328 
329 	/* define extend data (mostly)*/
330 	switch (cmd) {
331 	case DASD_ECKD_CCW_READ_HOME_ADDRESS:
332 	case DASD_ECKD_CCW_READ_RECORD_ZERO:
333 	case DASD_ECKD_CCW_READ:
334 	case DASD_ECKD_CCW_READ_MT:
335 	case DASD_ECKD_CCW_READ_CKD:
336 	case DASD_ECKD_CCW_READ_CKD_MT:
337 	case DASD_ECKD_CCW_READ_KD:
338 	case DASD_ECKD_CCW_READ_KD_MT:
339 	case DASD_ECKD_CCW_READ_COUNT:
340 		data->mask.perm = 0x1;
341 		data->attributes.operation = basepriv->attrib.operation;
342 		break;
343 	case DASD_ECKD_CCW_WRITE:
344 	case DASD_ECKD_CCW_WRITE_MT:
345 	case DASD_ECKD_CCW_WRITE_KD:
346 	case DASD_ECKD_CCW_WRITE_KD_MT:
347 		data->mask.perm = 0x02;
348 		data->attributes.operation = basepriv->attrib.operation;
349 		rc = check_XRC_on_prefix(pfxdata, basedev);
350 		break;
351 	case DASD_ECKD_CCW_WRITE_CKD:
352 	case DASD_ECKD_CCW_WRITE_CKD_MT:
353 		data->attributes.operation = DASD_BYPASS_CACHE;
354 		rc = check_XRC_on_prefix(pfxdata, basedev);
355 		break;
356 	case DASD_ECKD_CCW_ERASE:
357 	case DASD_ECKD_CCW_WRITE_HOME_ADDRESS:
358 	case DASD_ECKD_CCW_WRITE_RECORD_ZERO:
359 		data->mask.perm = 0x3;
360 		data->mask.auth = 0x1;
361 		data->attributes.operation = DASD_BYPASS_CACHE;
362 		rc = check_XRC_on_prefix(pfxdata, basedev);
363 		break;
364 	default:
365 		DEV_MESSAGE(KERN_ERR, basedev, "unknown opcode 0x%x", cmd);
366 		break;
367 	}
368 
369 	data->attributes.mode = 0x3;	/* ECKD */
370 
371 	if ((basepriv->rdc_data.cu_type == 0x2105 ||
372 	     basepriv->rdc_data.cu_type == 0x2107 ||
373 	     basepriv->rdc_data.cu_type == 0x1750)
374 	    && !(basepriv->uses_cdl && trk < 2))
375 		data->ga_extended |= 0x40; /* Regular Data Format Mode */
376 
377 	geo.cyl = basepriv->rdc_data.no_cyl;
378 	geo.head = basepriv->rdc_data.trk_per_cyl;
379 	beg.cyl = trk / geo.head;
380 	beg.head = trk % geo.head;
381 	end.cyl = totrk / geo.head;
382 	end.head = totrk % geo.head;
383 
384 	/* check for sequential prestage - enhance cylinder range */
385 	if (data->attributes.operation == DASD_SEQ_PRESTAGE ||
386 	    data->attributes.operation == DASD_SEQ_ACCESS) {
387 
388 		if (end.cyl + basepriv->attrib.nr_cyl < geo.cyl)
389 			end.cyl += basepriv->attrib.nr_cyl;
390 		else
391 			end.cyl = (geo.cyl - 1);
392 	}
393 
394 	data->beg_ext.cyl = beg.cyl;
395 	data->beg_ext.head = beg.head;
396 	data->end_ext.cyl = end.cyl;
397 	data->end_ext.head = end.head;
398 	return rc;
399 }
400 
401 static void
402 locate_record(struct ccw1 *ccw, struct LO_eckd_data *data, int trk,
403 	      int rec_on_trk, int no_rec, int cmd,
404 	      struct dasd_device * device, int reclen)
405 {
406 	struct dasd_eckd_private *private;
407 	int sector;
408 	int dn, d;
409 
410 	private = (struct dasd_eckd_private *) device->private;
411 
412 	DBF_DEV_EVENT(DBF_INFO, device,
413 		  "Locate: trk %d, rec %d, no_rec %d, cmd %d, reclen %d",
414 		  trk, rec_on_trk, no_rec, cmd, reclen);
415 
416 	ccw->cmd_code = DASD_ECKD_CCW_LOCATE_RECORD;
417 	ccw->flags = 0;
418 	ccw->count = 16;
419 	ccw->cda = (__u32) __pa(data);
420 
421 	memset(data, 0, sizeof(struct LO_eckd_data));
422 	sector = 0;
423 	if (rec_on_trk) {
424 		switch (private->rdc_data.dev_type) {
425 		case 0x3390:
426 			dn = ceil_quot(reclen + 6, 232);
427 			d = 9 + ceil_quot(reclen + 6 * (dn + 1), 34);
428 			sector = (49 + (rec_on_trk - 1) * (10 + d)) / 8;
429 			break;
430 		case 0x3380:
431 			d = 7 + ceil_quot(reclen + 12, 32);
432 			sector = (39 + (rec_on_trk - 1) * (8 + d)) / 7;
433 			break;
434 		}
435 	}
436 	data->sector = sector;
437 	data->count = no_rec;
438 	switch (cmd) {
439 	case DASD_ECKD_CCW_WRITE_HOME_ADDRESS:
440 		data->operation.orientation = 0x3;
441 		data->operation.operation = 0x03;
442 		break;
443 	case DASD_ECKD_CCW_READ_HOME_ADDRESS:
444 		data->operation.orientation = 0x3;
445 		data->operation.operation = 0x16;
446 		break;
447 	case DASD_ECKD_CCW_WRITE_RECORD_ZERO:
448 		data->operation.orientation = 0x1;
449 		data->operation.operation = 0x03;
450 		data->count++;
451 		break;
452 	case DASD_ECKD_CCW_READ_RECORD_ZERO:
453 		data->operation.orientation = 0x3;
454 		data->operation.operation = 0x16;
455 		data->count++;
456 		break;
457 	case DASD_ECKD_CCW_WRITE:
458 	case DASD_ECKD_CCW_WRITE_MT:
459 	case DASD_ECKD_CCW_WRITE_KD:
460 	case DASD_ECKD_CCW_WRITE_KD_MT:
461 		data->auxiliary.last_bytes_used = 0x1;
462 		data->length = reclen;
463 		data->operation.operation = 0x01;
464 		break;
465 	case DASD_ECKD_CCW_WRITE_CKD:
466 	case DASD_ECKD_CCW_WRITE_CKD_MT:
467 		data->auxiliary.last_bytes_used = 0x1;
468 		data->length = reclen;
469 		data->operation.operation = 0x03;
470 		break;
471 	case DASD_ECKD_CCW_READ:
472 	case DASD_ECKD_CCW_READ_MT:
473 	case DASD_ECKD_CCW_READ_KD:
474 	case DASD_ECKD_CCW_READ_KD_MT:
475 		data->auxiliary.last_bytes_used = 0x1;
476 		data->length = reclen;
477 		data->operation.operation = 0x06;
478 		break;
479 	case DASD_ECKD_CCW_READ_CKD:
480 	case DASD_ECKD_CCW_READ_CKD_MT:
481 		data->auxiliary.last_bytes_used = 0x1;
482 		data->length = reclen;
483 		data->operation.operation = 0x16;
484 		break;
485 	case DASD_ECKD_CCW_READ_COUNT:
486 		data->operation.operation = 0x06;
487 		break;
488 	case DASD_ECKD_CCW_ERASE:
489 		data->length = reclen;
490 		data->auxiliary.last_bytes_used = 0x1;
491 		data->operation.operation = 0x0b;
492 		break;
493 	default:
494 		DEV_MESSAGE(KERN_ERR, device, "unknown opcode 0x%x", cmd);
495 	}
496 	data->seek_addr.cyl = data->search_arg.cyl =
497 		trk / private->rdc_data.trk_per_cyl;
498 	data->seek_addr.head = data->search_arg.head =
499 		trk % private->rdc_data.trk_per_cyl;
500 	data->search_arg.record = rec_on_trk;
501 }
502 
503 /*
504  * Returns 1 if the block is one of the special blocks that needs
505  * to get read/written with the KD variant of the command.
506  * That is DASD_ECKD_READ_KD_MT instead of DASD_ECKD_READ_MT and
507  * DASD_ECKD_WRITE_KD_MT instead of DASD_ECKD_WRITE_MT.
508  * Luckily the KD variants differ only by one bit (0x08) from the
509  * normal variant. So don't wonder about code like:
510  * if (dasd_eckd_cdl_special(blk_per_trk, recid))
511  *         ccw->cmd_code |= 0x8;
512  */
513 static inline int
514 dasd_eckd_cdl_special(int blk_per_trk, int recid)
515 {
516 	if (recid < 3)
517 		return 1;
518 	if (recid < blk_per_trk)
519 		return 0;
520 	if (recid < 2 * blk_per_trk)
521 		return 1;
522 	return 0;
523 }
524 
525 /*
526  * Returns the record size for the special blocks of the cdl format.
527  * Only returns something useful if dasd_eckd_cdl_special is true
528  * for the recid.
529  */
530 static inline int
531 dasd_eckd_cdl_reclen(int recid)
532 {
533 	if (recid < 3)
534 		return sizes_trk0[recid];
535 	return LABEL_SIZE;
536 }
537 
538 /*
539  * Generate device unique id that specifies the physical device.
540  */
541 static int dasd_eckd_generate_uid(struct dasd_device *device,
542 				  struct dasd_uid *uid)
543 {
544 	struct dasd_eckd_private *private;
545 	int count;
546 
547 	private = (struct dasd_eckd_private *) device->private;
548 	if (!private)
549 		return -ENODEV;
550 	if (!private->ned || !private->gneq)
551 		return -ENODEV;
552 
553 	memset(uid, 0, sizeof(struct dasd_uid));
554 	memcpy(uid->vendor, private->ned->HDA_manufacturer,
555 	       sizeof(uid->vendor) - 1);
556 	EBCASC(uid->vendor, sizeof(uid->vendor) - 1);
557 	memcpy(uid->serial, private->ned->HDA_location,
558 	       sizeof(uid->serial) - 1);
559 	EBCASC(uid->serial, sizeof(uid->serial) - 1);
560 	uid->ssid = private->gneq->subsystemID;
561 	uid->real_unit_addr = private->ned->unit_addr;;
562 	if (private->sneq) {
563 		uid->type = private->sneq->sua_flags;
564 		if (uid->type == UA_BASE_PAV_ALIAS)
565 			uid->base_unit_addr = private->sneq->base_unit_addr;
566 	} else {
567 		uid->type = UA_BASE_DEVICE;
568 	}
569 	if (private->vdsneq) {
570 		for (count = 0; count < 16; count++) {
571 			sprintf(uid->vduit+2*count, "%02x",
572 				private->vdsneq->uit[count]);
573 		}
574 	}
575 	return 0;
576 }
577 
578 static struct dasd_ccw_req *dasd_eckd_build_rcd_lpm(struct dasd_device *device,
579 						    void *rcd_buffer,
580 						    struct ciw *ciw, __u8 lpm)
581 {
582 	struct dasd_ccw_req *cqr;
583 	struct ccw1 *ccw;
584 
585 	cqr = dasd_smalloc_request("ECKD", 1 /* RCD */, ciw->count, device);
586 
587 	if (IS_ERR(cqr)) {
588 		DEV_MESSAGE(KERN_WARNING, device, "%s",
589 			    "Could not allocate RCD request");
590 		return cqr;
591 	}
592 
593 	ccw = cqr->cpaddr;
594 	ccw->cmd_code = ciw->cmd;
595 	ccw->cda = (__u32)(addr_t)rcd_buffer;
596 	ccw->count = ciw->count;
597 
598 	cqr->startdev = device;
599 	cqr->memdev = device;
600 	cqr->block = NULL;
601 	cqr->expires = 10*HZ;
602 	cqr->lpm = lpm;
603 	clear_bit(DASD_CQR_FLAGS_USE_ERP, &cqr->flags);
604 	cqr->retries = 2;
605 	cqr->buildclk = get_clock();
606 	cqr->status = DASD_CQR_FILLED;
607 	return cqr;
608 }
609 
610 static int dasd_eckd_read_conf_lpm(struct dasd_device *device,
611 				   void **rcd_buffer,
612 				   int *rcd_buffer_size, __u8 lpm)
613 {
614 	struct ciw *ciw;
615 	char *rcd_buf = NULL;
616 	int ret;
617 	struct dasd_ccw_req *cqr;
618 
619 	/*
620 	 * scan for RCD command in extended SenseID data
621 	 */
622 	ciw = ccw_device_get_ciw(device->cdev, CIW_TYPE_RCD);
623 	if (!ciw || ciw->cmd == 0) {
624 		ret = -EOPNOTSUPP;
625 		goto out_error;
626 	}
627 	rcd_buf = kzalloc(ciw->count, GFP_KERNEL | GFP_DMA);
628 	if (!rcd_buf) {
629 		ret = -ENOMEM;
630 		goto out_error;
631 	}
632 
633 	/*
634 	 * buffer has to start with EBCDIC "V1.0" to show
635 	 * support for virtual device SNEQ
636 	 */
637 	rcd_buf[0] = 0xE5;
638 	rcd_buf[1] = 0xF1;
639 	rcd_buf[2] = 0x4B;
640 	rcd_buf[3] = 0xF0;
641 	cqr = dasd_eckd_build_rcd_lpm(device, rcd_buf, ciw, lpm);
642 	if (IS_ERR(cqr)) {
643 		ret =  PTR_ERR(cqr);
644 		goto out_error;
645 	}
646 	ret = dasd_sleep_on(cqr);
647 	/*
648 	 * on success we update the user input parms
649 	 */
650 	dasd_sfree_request(cqr, cqr->memdev);
651 	if (ret)
652 		goto out_error;
653 
654 	*rcd_buffer_size = ciw->count;
655 	*rcd_buffer = rcd_buf;
656 	return 0;
657 out_error:
658 	kfree(rcd_buf);
659 	*rcd_buffer = NULL;
660 	*rcd_buffer_size = 0;
661 	return ret;
662 }
663 
664 static int dasd_eckd_identify_conf_parts(struct dasd_eckd_private *private)
665 {
666 
667 	struct dasd_sneq *sneq;
668 	int i, count;
669 
670 	private->ned = NULL;
671 	private->sneq = NULL;
672 	private->vdsneq = NULL;
673 	private->gneq = NULL;
674 	count = private->conf_len / sizeof(struct dasd_sneq);
675 	sneq = (struct dasd_sneq *)private->conf_data;
676 	for (i = 0; i < count; ++i) {
677 		if (sneq->flags.identifier == 1 && sneq->format == 1)
678 			private->sneq = sneq;
679 		else if (sneq->flags.identifier == 1 && sneq->format == 4)
680 			private->vdsneq = (struct vd_sneq *)sneq;
681 		else if (sneq->flags.identifier == 2)
682 			private->gneq = (struct dasd_gneq *)sneq;
683 		else if (sneq->flags.identifier == 3 && sneq->res1 == 1)
684 			private->ned = (struct dasd_ned *)sneq;
685 		sneq++;
686 	}
687 	if (!private->ned || !private->gneq) {
688 		private->ned = NULL;
689 		private->sneq = NULL;
690 		private->vdsneq = NULL;
691 		private->gneq = NULL;
692 		return -EINVAL;
693 	}
694 	return 0;
695 
696 };
697 
698 static unsigned char dasd_eckd_path_access(void *conf_data, int conf_len)
699 {
700 	struct dasd_gneq *gneq;
701 	int i, count, found;
702 
703 	count = conf_len / sizeof(*gneq);
704 	gneq = (struct dasd_gneq *)conf_data;
705 	found = 0;
706 	for (i = 0; i < count; ++i) {
707 		if (gneq->flags.identifier == 2) {
708 			found = 1;
709 			break;
710 		}
711 		gneq++;
712 	}
713 	if (found)
714 		return ((char *)gneq)[18] & 0x07;
715 	else
716 		return 0;
717 }
718 
719 static int dasd_eckd_read_conf(struct dasd_device *device)
720 {
721 	void *conf_data;
722 	int conf_len, conf_data_saved;
723 	int rc;
724 	__u8 lpm;
725 	struct dasd_eckd_private *private;
726 	struct dasd_eckd_path *path_data;
727 
728 	private = (struct dasd_eckd_private *) device->private;
729 	path_data = (struct dasd_eckd_path *) &private->path_data;
730 	path_data->opm = ccw_device_get_path_mask(device->cdev);
731 	lpm = 0x80;
732 	conf_data_saved = 0;
733 	/* get configuration data per operational path */
734 	for (lpm = 0x80; lpm; lpm>>= 1) {
735 		if (lpm & path_data->opm){
736 			rc = dasd_eckd_read_conf_lpm(device, &conf_data,
737 						     &conf_len, lpm);
738 			if (rc && rc != -EOPNOTSUPP) {	/* -EOPNOTSUPP is ok */
739 				MESSAGE(KERN_WARNING,
740 					"Read configuration data returned "
741 					"error %d", rc);
742 				return rc;
743 			}
744 			if (conf_data == NULL) {
745 				MESSAGE(KERN_WARNING, "%s", "No configuration "
746 					"data retrieved");
747 				continue;	/* no error */
748 			}
749 			/* save first valid configuration data */
750 			if (!conf_data_saved) {
751 				kfree(private->conf_data);
752 				private->conf_data = conf_data;
753 				private->conf_len = conf_len;
754 				if (dasd_eckd_identify_conf_parts(private)) {
755 					private->conf_data = NULL;
756 					private->conf_len = 0;
757 					kfree(conf_data);
758 					continue;
759 				}
760 				conf_data_saved++;
761 			}
762 			switch (dasd_eckd_path_access(conf_data, conf_len)) {
763 			case 0x02:
764 				path_data->npm |= lpm;
765 				break;
766 			case 0x03:
767 				path_data->ppm |= lpm;
768 				break;
769 			}
770 			if (conf_data != private->conf_data)
771 				kfree(conf_data);
772 		}
773 	}
774 	return 0;
775 }
776 
777 static int dasd_eckd_read_features(struct dasd_device *device)
778 {
779 	struct dasd_psf_prssd_data *prssdp;
780 	struct dasd_rssd_features *features;
781 	struct dasd_ccw_req *cqr;
782 	struct ccw1 *ccw;
783 	int rc;
784 	struct dasd_eckd_private *private;
785 
786 	private = (struct dasd_eckd_private *) device->private;
787 	cqr = dasd_smalloc_request(dasd_eckd_discipline.name,
788 				   1 /* PSF */	+ 1 /* RSSD */ ,
789 				   (sizeof(struct dasd_psf_prssd_data) +
790 				    sizeof(struct dasd_rssd_features)),
791 				   device);
792 	if (IS_ERR(cqr)) {
793 		DEV_MESSAGE(KERN_WARNING, device, "%s",
794 			    "Could not allocate initialization request");
795 		return PTR_ERR(cqr);
796 	}
797 	cqr->startdev = device;
798 	cqr->memdev = device;
799 	cqr->block = NULL;
800 	clear_bit(DASD_CQR_FLAGS_USE_ERP, &cqr->flags);
801 	cqr->retries = 5;
802 	cqr->expires = 10 * HZ;
803 
804 	/* Prepare for Read Subsystem Data */
805 	prssdp = (struct dasd_psf_prssd_data *) cqr->data;
806 	memset(prssdp, 0, sizeof(struct dasd_psf_prssd_data));
807 	prssdp->order = PSF_ORDER_PRSSD;
808 	prssdp->suborder = 0x41;	/* Read Feature Codes */
809 	/* all other bytes of prssdp must be zero */
810 
811 	ccw = cqr->cpaddr;
812 	ccw->cmd_code = DASD_ECKD_CCW_PSF;
813 	ccw->count = sizeof(struct dasd_psf_prssd_data);
814 	ccw->flags |= CCW_FLAG_CC;
815 	ccw->cda = (__u32)(addr_t) prssdp;
816 
817 	/* Read Subsystem Data - feature codes */
818 	features = (struct dasd_rssd_features *) (prssdp + 1);
819 	memset(features, 0, sizeof(struct dasd_rssd_features));
820 
821 	ccw++;
822 	ccw->cmd_code = DASD_ECKD_CCW_RSSD;
823 	ccw->count = sizeof(struct dasd_rssd_features);
824 	ccw->cda = (__u32)(addr_t) features;
825 
826 	cqr->buildclk = get_clock();
827 	cqr->status = DASD_CQR_FILLED;
828 	rc = dasd_sleep_on(cqr);
829 	if (rc == 0) {
830 		prssdp = (struct dasd_psf_prssd_data *) cqr->data;
831 		features = (struct dasd_rssd_features *) (prssdp + 1);
832 		memcpy(&private->features, features,
833 		       sizeof(struct dasd_rssd_features));
834 	}
835 	dasd_sfree_request(cqr, cqr->memdev);
836 	return rc;
837 }
838 
839 
840 /*
841  * Build CP for Perform Subsystem Function - SSC.
842  */
843 static struct dasd_ccw_req *dasd_eckd_build_psf_ssc(struct dasd_device *device)
844 {
845 	struct dasd_ccw_req *cqr;
846 	struct dasd_psf_ssc_data *psf_ssc_data;
847 	struct ccw1 *ccw;
848 
849 	cqr = dasd_smalloc_request("ECKD", 1 /* PSF */ ,
850 				  sizeof(struct dasd_psf_ssc_data),
851 				  device);
852 
853 	if (IS_ERR(cqr)) {
854 		DEV_MESSAGE(KERN_WARNING, device, "%s",
855 			   "Could not allocate PSF-SSC request");
856 		return cqr;
857 	}
858 	psf_ssc_data = (struct dasd_psf_ssc_data *)cqr->data;
859 	psf_ssc_data->order = PSF_ORDER_SSC;
860 	psf_ssc_data->suborder = 0x88;
861 	psf_ssc_data->reserved[0] = 0x88;
862 
863 	ccw = cqr->cpaddr;
864 	ccw->cmd_code = DASD_ECKD_CCW_PSF;
865 	ccw->cda = (__u32)(addr_t)psf_ssc_data;
866 	ccw->count = 66;
867 
868 	cqr->startdev = device;
869 	cqr->memdev = device;
870 	cqr->block = NULL;
871 	cqr->expires = 10*HZ;
872 	cqr->buildclk = get_clock();
873 	cqr->status = DASD_CQR_FILLED;
874 	return cqr;
875 }
876 
877 /*
878  * Perform Subsystem Function.
879  * It is necessary to trigger CIO for channel revalidation since this
880  * call might change behaviour of DASD devices.
881  */
882 static int
883 dasd_eckd_psf_ssc(struct dasd_device *device)
884 {
885 	struct dasd_ccw_req *cqr;
886 	int rc;
887 
888 	cqr = dasd_eckd_build_psf_ssc(device);
889 	if (IS_ERR(cqr))
890 		return PTR_ERR(cqr);
891 
892 	rc = dasd_sleep_on(cqr);
893 	if (!rc)
894 		/* trigger CIO to reprobe devices */
895 		css_schedule_reprobe();
896 	dasd_sfree_request(cqr, cqr->memdev);
897 	return rc;
898 }
899 
900 /*
901  * Valide storage server of current device.
902  */
903 static int dasd_eckd_validate_server(struct dasd_device *device)
904 {
905 	int rc;
906 	struct dasd_eckd_private *private;
907 
908 	/* Currently PAV is the only reason to 'validate' server on LPAR */
909 	if (dasd_nopav || MACHINE_IS_VM)
910 		return 0;
911 
912 	rc = dasd_eckd_psf_ssc(device);
913 	/* may be requested feature is not available on server,
914 	 * therefore just report error and go ahead */
915 	private = (struct dasd_eckd_private *) device->private;
916 	DEV_MESSAGE(KERN_INFO, device,
917 		    "PSF-SSC on storage subsystem %s.%s.%04x returned rc=%d",
918 		    private->uid.vendor, private->uid.serial,
919 		    private->uid.ssid, rc);
920 	/* RE-Read Configuration Data */
921 	return dasd_eckd_read_conf(device);
922 }
923 
924 /*
925  * Check device characteristics.
926  * If the device is accessible using ECKD discipline, the device is enabled.
927  */
928 static int
929 dasd_eckd_check_characteristics(struct dasd_device *device)
930 {
931 	struct dasd_eckd_private *private;
932 	struct dasd_block *block;
933 	void *rdc_data;
934 	int is_known, rc;
935 
936 	private = (struct dasd_eckd_private *) device->private;
937 	if (private == NULL) {
938 		private = kzalloc(sizeof(struct dasd_eckd_private),
939 				  GFP_KERNEL | GFP_DMA);
940 		if (private == NULL) {
941 			DEV_MESSAGE(KERN_WARNING, device, "%s",
942 				    "memory allocation failed for private "
943 				    "data");
944 			return -ENOMEM;
945 		}
946 		device->private = (void *) private;
947 	}
948 	/* Invalidate status of initial analysis. */
949 	private->init_cqr_status = -1;
950 	/* Set default cache operations. */
951 	private->attrib.operation = DASD_NORMAL_CACHE;
952 	private->attrib.nr_cyl = 0;
953 
954 	/* Read Configuration Data */
955 	rc = dasd_eckd_read_conf(device);
956 	if (rc)
957 		goto out_err1;
958 
959 	/* Generate device unique id and register in devmap */
960 	rc = dasd_eckd_generate_uid(device, &private->uid);
961 	if (rc)
962 		goto out_err1;
963 	dasd_set_uid(device->cdev, &private->uid);
964 
965 	if (private->uid.type == UA_BASE_DEVICE) {
966 		block = dasd_alloc_block();
967 		if (IS_ERR(block)) {
968 			DEV_MESSAGE(KERN_WARNING, device, "%s",
969 				    "could not allocate dasd block structure");
970 			rc = PTR_ERR(block);
971 			goto out_err1;
972 		}
973 		device->block = block;
974 		block->base = device;
975 	}
976 
977 	/* register lcu with alias handling, enable PAV if this is a new lcu */
978 	is_known = dasd_alias_make_device_known_to_lcu(device);
979 	if (is_known < 0) {
980 		rc = is_known;
981 		goto out_err2;
982 	}
983 	if (!is_known) {
984 		/* new lcu found */
985 		rc = dasd_eckd_validate_server(device); /* will switch pav on */
986 		if (rc)
987 			goto out_err3;
988 	}
989 
990 	/* Read Feature Codes */
991 	rc = dasd_eckd_read_features(device);
992 	if (rc)
993 		goto out_err3;
994 
995 	/* Read Device Characteristics */
996 	rdc_data = (void *) &(private->rdc_data);
997 	memset(rdc_data, 0, sizeof(rdc_data));
998 	rc = dasd_generic_read_dev_chars(device, "ECKD", &rdc_data, 64);
999 	if (rc) {
1000 		DEV_MESSAGE(KERN_WARNING, device,
1001 			    "Read device characteristics returned "
1002 			    "rc=%d", rc);
1003 		goto out_err3;
1004 	}
1005 	DEV_MESSAGE(KERN_INFO, device,
1006 		    "%04X/%02X(CU:%04X/%02X) Cyl:%d Head:%d Sec:%d",
1007 		    private->rdc_data.dev_type,
1008 		    private->rdc_data.dev_model,
1009 		    private->rdc_data.cu_type,
1010 		    private->rdc_data.cu_model.model,
1011 		    private->rdc_data.no_cyl,
1012 		    private->rdc_data.trk_per_cyl,
1013 		    private->rdc_data.sec_per_trk);
1014 	return 0;
1015 
1016 out_err3:
1017 	dasd_alias_disconnect_device_from_lcu(device);
1018 out_err2:
1019 	dasd_free_block(device->block);
1020 	device->block = NULL;
1021 out_err1:
1022 	kfree(private->conf_data);
1023 	kfree(device->private);
1024 	device->private = NULL;
1025 	return rc;
1026 }
1027 
1028 static void dasd_eckd_uncheck_device(struct dasd_device *device)
1029 {
1030 	struct dasd_eckd_private *private;
1031 
1032 	private = (struct dasd_eckd_private *) device->private;
1033 	dasd_alias_disconnect_device_from_lcu(device);
1034 	private->ned = NULL;
1035 	private->sneq = NULL;
1036 	private->vdsneq = NULL;
1037 	private->gneq = NULL;
1038 	private->conf_len = 0;
1039 	kfree(private->conf_data);
1040 	private->conf_data = NULL;
1041 }
1042 
1043 static struct dasd_ccw_req *
1044 dasd_eckd_analysis_ccw(struct dasd_device *device)
1045 {
1046 	struct dasd_eckd_private *private;
1047 	struct eckd_count *count_data;
1048 	struct LO_eckd_data *LO_data;
1049 	struct dasd_ccw_req *cqr;
1050 	struct ccw1 *ccw;
1051 	int cplength, datasize;
1052 	int i;
1053 
1054 	private = (struct dasd_eckd_private *) device->private;
1055 
1056 	cplength = 8;
1057 	datasize = sizeof(struct DE_eckd_data) + 2*sizeof(struct LO_eckd_data);
1058 	cqr = dasd_smalloc_request(dasd_eckd_discipline.name,
1059 				   cplength, datasize, device);
1060 	if (IS_ERR(cqr))
1061 		return cqr;
1062 	ccw = cqr->cpaddr;
1063 	/* Define extent for the first 3 tracks. */
1064 	define_extent(ccw++, cqr->data, 0, 2,
1065 		      DASD_ECKD_CCW_READ_COUNT, device);
1066 	LO_data = cqr->data + sizeof(struct DE_eckd_data);
1067 	/* Locate record for the first 4 records on track 0. */
1068 	ccw[-1].flags |= CCW_FLAG_CC;
1069 	locate_record(ccw++, LO_data++, 0, 0, 4,
1070 		      DASD_ECKD_CCW_READ_COUNT, device, 0);
1071 
1072 	count_data = private->count_area;
1073 	for (i = 0; i < 4; i++) {
1074 		ccw[-1].flags |= CCW_FLAG_CC;
1075 		ccw->cmd_code = DASD_ECKD_CCW_READ_COUNT;
1076 		ccw->flags = 0;
1077 		ccw->count = 8;
1078 		ccw->cda = (__u32)(addr_t) count_data;
1079 		ccw++;
1080 		count_data++;
1081 	}
1082 
1083 	/* Locate record for the first record on track 2. */
1084 	ccw[-1].flags |= CCW_FLAG_CC;
1085 	locate_record(ccw++, LO_data++, 2, 0, 1,
1086 		      DASD_ECKD_CCW_READ_COUNT, device, 0);
1087 	/* Read count ccw. */
1088 	ccw[-1].flags |= CCW_FLAG_CC;
1089 	ccw->cmd_code = DASD_ECKD_CCW_READ_COUNT;
1090 	ccw->flags = 0;
1091 	ccw->count = 8;
1092 	ccw->cda = (__u32)(addr_t) count_data;
1093 
1094 	cqr->block = NULL;
1095 	cqr->startdev = device;
1096 	cqr->memdev = device;
1097 	cqr->retries = 0;
1098 	cqr->buildclk = get_clock();
1099 	cqr->status = DASD_CQR_FILLED;
1100 	return cqr;
1101 }
1102 
1103 /*
1104  * This is the callback function for the init_analysis cqr. It saves
1105  * the status of the initial analysis ccw before it frees it and kicks
1106  * the device to continue the startup sequence. This will call
1107  * dasd_eckd_do_analysis again (if the devices has not been marked
1108  * for deletion in the meantime).
1109  */
1110 static void
1111 dasd_eckd_analysis_callback(struct dasd_ccw_req *init_cqr, void *data)
1112 {
1113 	struct dasd_eckd_private *private;
1114 	struct dasd_device *device;
1115 
1116 	device = init_cqr->startdev;
1117 	private = (struct dasd_eckd_private *) device->private;
1118 	private->init_cqr_status = init_cqr->status;
1119 	dasd_sfree_request(init_cqr, device);
1120 	dasd_kick_device(device);
1121 }
1122 
1123 static int
1124 dasd_eckd_start_analysis(struct dasd_block *block)
1125 {
1126 	struct dasd_eckd_private *private;
1127 	struct dasd_ccw_req *init_cqr;
1128 
1129 	private = (struct dasd_eckd_private *) block->base->private;
1130 	init_cqr = dasd_eckd_analysis_ccw(block->base);
1131 	if (IS_ERR(init_cqr))
1132 		return PTR_ERR(init_cqr);
1133 	init_cqr->callback = dasd_eckd_analysis_callback;
1134 	init_cqr->callback_data = NULL;
1135 	init_cqr->expires = 5*HZ;
1136 	dasd_add_request_head(init_cqr);
1137 	return -EAGAIN;
1138 }
1139 
1140 static int
1141 dasd_eckd_end_analysis(struct dasd_block *block)
1142 {
1143 	struct dasd_device *device;
1144 	struct dasd_eckd_private *private;
1145 	struct eckd_count *count_area;
1146 	unsigned int sb, blk_per_trk;
1147 	int status, i;
1148 
1149 	device = block->base;
1150 	private = (struct dasd_eckd_private *) device->private;
1151 	status = private->init_cqr_status;
1152 	private->init_cqr_status = -1;
1153 	if (status != DASD_CQR_DONE) {
1154 		DEV_MESSAGE(KERN_WARNING, device, "%s",
1155 			    "volume analysis returned unformatted disk");
1156 		return -EMEDIUMTYPE;
1157 	}
1158 
1159 	private->uses_cdl = 1;
1160 	/* Calculate number of blocks/records per track. */
1161 	blk_per_trk = recs_per_track(&private->rdc_data, 0, block->bp_block);
1162 	/* Check Track 0 for Compatible Disk Layout */
1163 	count_area = NULL;
1164 	for (i = 0; i < 3; i++) {
1165 		if (private->count_area[i].kl != 4 ||
1166 		    private->count_area[i].dl != dasd_eckd_cdl_reclen(i) - 4) {
1167 			private->uses_cdl = 0;
1168 			break;
1169 		}
1170 	}
1171 	if (i == 3)
1172 		count_area = &private->count_area[4];
1173 
1174 	if (private->uses_cdl == 0) {
1175 		for (i = 0; i < 5; i++) {
1176 			if ((private->count_area[i].kl != 0) ||
1177 			    (private->count_area[i].dl !=
1178 			     private->count_area[0].dl))
1179 				break;
1180 		}
1181 		if (i == 5)
1182 			count_area = &private->count_area[0];
1183 	} else {
1184 		if (private->count_area[3].record == 1)
1185 			DEV_MESSAGE(KERN_WARNING, device, "%s",
1186 				    "Trk 0: no records after VTOC!");
1187 	}
1188 	if (count_area != NULL && count_area->kl == 0) {
1189 		/* we found notthing violating our disk layout */
1190 		if (dasd_check_blocksize(count_area->dl) == 0)
1191 			block->bp_block = count_area->dl;
1192 	}
1193 	if (block->bp_block == 0) {
1194 		DEV_MESSAGE(KERN_WARNING, device, "%s",
1195 			    "Volume has incompatible disk layout");
1196 		return -EMEDIUMTYPE;
1197 	}
1198 	block->s2b_shift = 0;	/* bits to shift 512 to get a block */
1199 	for (sb = 512; sb < block->bp_block; sb = sb << 1)
1200 		block->s2b_shift++;
1201 
1202 	blk_per_trk = recs_per_track(&private->rdc_data, 0, block->bp_block);
1203 	block->blocks = (private->rdc_data.no_cyl *
1204 			  private->rdc_data.trk_per_cyl *
1205 			  blk_per_trk);
1206 
1207 	DEV_MESSAGE(KERN_INFO, device,
1208 		    "(%dkB blks): %dkB at %dkB/trk %s",
1209 		    (block->bp_block >> 10),
1210 		    ((private->rdc_data.no_cyl *
1211 		      private->rdc_data.trk_per_cyl *
1212 		      blk_per_trk * (block->bp_block >> 9)) >> 1),
1213 		    ((blk_per_trk * block->bp_block) >> 10),
1214 		    private->uses_cdl ?
1215 		    "compatible disk layout" : "linux disk layout");
1216 
1217 	return 0;
1218 }
1219 
1220 static int dasd_eckd_do_analysis(struct dasd_block *block)
1221 {
1222 	struct dasd_eckd_private *private;
1223 
1224 	private = (struct dasd_eckd_private *) block->base->private;
1225 	if (private->init_cqr_status < 0)
1226 		return dasd_eckd_start_analysis(block);
1227 	else
1228 		return dasd_eckd_end_analysis(block);
1229 }
1230 
1231 static int dasd_eckd_ready_to_online(struct dasd_device *device)
1232 {
1233 	return dasd_alias_add_device(device);
1234 };
1235 
1236 static int dasd_eckd_online_to_ready(struct dasd_device *device)
1237 {
1238 	return dasd_alias_remove_device(device);
1239 };
1240 
1241 static int
1242 dasd_eckd_fill_geometry(struct dasd_block *block, struct hd_geometry *geo)
1243 {
1244 	struct dasd_eckd_private *private;
1245 
1246 	private = (struct dasd_eckd_private *) block->base->private;
1247 	if (dasd_check_blocksize(block->bp_block) == 0) {
1248 		geo->sectors = recs_per_track(&private->rdc_data,
1249 					      0, block->bp_block);
1250 	}
1251 	geo->cylinders = private->rdc_data.no_cyl;
1252 	geo->heads = private->rdc_data.trk_per_cyl;
1253 	return 0;
1254 }
1255 
1256 static struct dasd_ccw_req *
1257 dasd_eckd_format_device(struct dasd_device * device,
1258 			struct format_data_t * fdata)
1259 {
1260 	struct dasd_eckd_private *private;
1261 	struct dasd_ccw_req *fcp;
1262 	struct eckd_count *ect;
1263 	struct ccw1 *ccw;
1264 	void *data;
1265 	int rpt, cyl, head;
1266 	int cplength, datasize;
1267 	int i;
1268 
1269 	private = (struct dasd_eckd_private *) device->private;
1270 	rpt = recs_per_track(&private->rdc_data, 0, fdata->blksize);
1271 	cyl = fdata->start_unit / private->rdc_data.trk_per_cyl;
1272 	head = fdata->start_unit % private->rdc_data.trk_per_cyl;
1273 
1274 	/* Sanity checks. */
1275 	if (fdata->start_unit >=
1276 	    (private->rdc_data.no_cyl * private->rdc_data.trk_per_cyl)) {
1277 		DEV_MESSAGE(KERN_INFO, device, "Track no %d too big!",
1278 			    fdata->start_unit);
1279 		return ERR_PTR(-EINVAL);
1280 	}
1281 	if (fdata->start_unit > fdata->stop_unit) {
1282 		DEV_MESSAGE(KERN_INFO, device, "Track %d reached! ending.",
1283 			    fdata->start_unit);
1284 		return ERR_PTR(-EINVAL);
1285 	}
1286 	if (dasd_check_blocksize(fdata->blksize) != 0) {
1287 		DEV_MESSAGE(KERN_WARNING, device,
1288 			    "Invalid blocksize %d...terminating!",
1289 			    fdata->blksize);
1290 		return ERR_PTR(-EINVAL);
1291 	}
1292 
1293 	/*
1294 	 * fdata->intensity is a bit string that tells us what to do:
1295 	 *   Bit 0: write record zero
1296 	 *   Bit 1: write home address, currently not supported
1297 	 *   Bit 2: invalidate tracks
1298 	 *   Bit 3: use OS/390 compatible disk layout (cdl)
1299 	 * Only some bit combinations do make sense.
1300 	 */
1301 	switch (fdata->intensity) {
1302 	case 0x00:	/* Normal format */
1303 	case 0x08:	/* Normal format, use cdl. */
1304 		cplength = 2 + rpt;
1305 		datasize = sizeof(struct DE_eckd_data) +
1306 			sizeof(struct LO_eckd_data) +
1307 			rpt * sizeof(struct eckd_count);
1308 		break;
1309 	case 0x01:	/* Write record zero and format track. */
1310 	case 0x09:	/* Write record zero and format track, use cdl. */
1311 		cplength = 3 + rpt;
1312 		datasize = sizeof(struct DE_eckd_data) +
1313 			sizeof(struct LO_eckd_data) +
1314 			sizeof(struct eckd_count) +
1315 			rpt * sizeof(struct eckd_count);
1316 		break;
1317 	case 0x04:	/* Invalidate track. */
1318 	case 0x0c:	/* Invalidate track, use cdl. */
1319 		cplength = 3;
1320 		datasize = sizeof(struct DE_eckd_data) +
1321 			sizeof(struct LO_eckd_data) +
1322 			sizeof(struct eckd_count);
1323 		break;
1324 	default:
1325 		DEV_MESSAGE(KERN_WARNING, device, "Invalid flags 0x%x.",
1326 			    fdata->intensity);
1327 		return ERR_PTR(-EINVAL);
1328 	}
1329 	/* Allocate the format ccw request. */
1330 	fcp = dasd_smalloc_request(dasd_eckd_discipline.name,
1331 				   cplength, datasize, device);
1332 	if (IS_ERR(fcp))
1333 		return fcp;
1334 
1335 	data = fcp->data;
1336 	ccw = fcp->cpaddr;
1337 
1338 	switch (fdata->intensity & ~0x08) {
1339 	case 0x00: /* Normal format. */
1340 		define_extent(ccw++, (struct DE_eckd_data *) data,
1341 			      fdata->start_unit, fdata->start_unit,
1342 			      DASD_ECKD_CCW_WRITE_CKD, device);
1343 		data += sizeof(struct DE_eckd_data);
1344 		ccw[-1].flags |= CCW_FLAG_CC;
1345 		locate_record(ccw++, (struct LO_eckd_data *) data,
1346 			      fdata->start_unit, 0, rpt,
1347 			      DASD_ECKD_CCW_WRITE_CKD, device,
1348 			      fdata->blksize);
1349 		data += sizeof(struct LO_eckd_data);
1350 		break;
1351 	case 0x01: /* Write record zero + format track. */
1352 		define_extent(ccw++, (struct DE_eckd_data *) data,
1353 			      fdata->start_unit, fdata->start_unit,
1354 			      DASD_ECKD_CCW_WRITE_RECORD_ZERO,
1355 			      device);
1356 		data += sizeof(struct DE_eckd_data);
1357 		ccw[-1].flags |= CCW_FLAG_CC;
1358 		locate_record(ccw++, (struct LO_eckd_data *) data,
1359 			      fdata->start_unit, 0, rpt + 1,
1360 			      DASD_ECKD_CCW_WRITE_RECORD_ZERO, device,
1361 			      device->block->bp_block);
1362 		data += sizeof(struct LO_eckd_data);
1363 		break;
1364 	case 0x04: /* Invalidate track. */
1365 		define_extent(ccw++, (struct DE_eckd_data *) data,
1366 			      fdata->start_unit, fdata->start_unit,
1367 			      DASD_ECKD_CCW_WRITE_CKD, device);
1368 		data += sizeof(struct DE_eckd_data);
1369 		ccw[-1].flags |= CCW_FLAG_CC;
1370 		locate_record(ccw++, (struct LO_eckd_data *) data,
1371 			      fdata->start_unit, 0, 1,
1372 			      DASD_ECKD_CCW_WRITE_CKD, device, 8);
1373 		data += sizeof(struct LO_eckd_data);
1374 		break;
1375 	}
1376 	if (fdata->intensity & 0x01) {	/* write record zero */
1377 		ect = (struct eckd_count *) data;
1378 		data += sizeof(struct eckd_count);
1379 		ect->cyl = cyl;
1380 		ect->head = head;
1381 		ect->record = 0;
1382 		ect->kl = 0;
1383 		ect->dl = 8;
1384 		ccw[-1].flags |= CCW_FLAG_CC;
1385 		ccw->cmd_code = DASD_ECKD_CCW_WRITE_RECORD_ZERO;
1386 		ccw->flags = CCW_FLAG_SLI;
1387 		ccw->count = 8;
1388 		ccw->cda = (__u32)(addr_t) ect;
1389 		ccw++;
1390 	}
1391 	if ((fdata->intensity & ~0x08) & 0x04) {	/* erase track */
1392 		ect = (struct eckd_count *) data;
1393 		data += sizeof(struct eckd_count);
1394 		ect->cyl = cyl;
1395 		ect->head = head;
1396 		ect->record = 1;
1397 		ect->kl = 0;
1398 		ect->dl = 0;
1399 		ccw[-1].flags |= CCW_FLAG_CC;
1400 		ccw->cmd_code = DASD_ECKD_CCW_WRITE_CKD;
1401 		ccw->flags = CCW_FLAG_SLI;
1402 		ccw->count = 8;
1403 		ccw->cda = (__u32)(addr_t) ect;
1404 	} else {		/* write remaining records */
1405 		for (i = 0; i < rpt; i++) {
1406 			ect = (struct eckd_count *) data;
1407 			data += sizeof(struct eckd_count);
1408 			ect->cyl = cyl;
1409 			ect->head = head;
1410 			ect->record = i + 1;
1411 			ect->kl = 0;
1412 			ect->dl = fdata->blksize;
1413 			/* Check for special tracks 0-1 when formatting CDL */
1414 			if ((fdata->intensity & 0x08) &&
1415 			    fdata->start_unit == 0) {
1416 				if (i < 3) {
1417 					ect->kl = 4;
1418 					ect->dl = sizes_trk0[i] - 4;
1419 				}
1420 			}
1421 			if ((fdata->intensity & 0x08) &&
1422 			    fdata->start_unit == 1) {
1423 				ect->kl = 44;
1424 				ect->dl = LABEL_SIZE - 44;
1425 			}
1426 			ccw[-1].flags |= CCW_FLAG_CC;
1427 			ccw->cmd_code = DASD_ECKD_CCW_WRITE_CKD;
1428 			ccw->flags = CCW_FLAG_SLI;
1429 			ccw->count = 8;
1430 			ccw->cda = (__u32)(addr_t) ect;
1431 			ccw++;
1432 		}
1433 	}
1434 	fcp->startdev = device;
1435 	fcp->memdev = device;
1436 	clear_bit(DASD_CQR_FLAGS_USE_ERP, &fcp->flags);
1437 	fcp->retries = 5;	/* set retry counter to enable default ERP */
1438 	fcp->buildclk = get_clock();
1439 	fcp->status = DASD_CQR_FILLED;
1440 	return fcp;
1441 }
1442 
1443 static void dasd_eckd_handle_terminated_request(struct dasd_ccw_req *cqr)
1444 {
1445 	cqr->status = DASD_CQR_FILLED;
1446 	if (cqr->block && (cqr->startdev != cqr->block->base)) {
1447 		dasd_eckd_reset_ccw_to_base_io(cqr);
1448 		cqr->startdev = cqr->block->base;
1449 	}
1450 };
1451 
1452 static dasd_erp_fn_t
1453 dasd_eckd_erp_action(struct dasd_ccw_req * cqr)
1454 {
1455 	struct dasd_device *device = (struct dasd_device *) cqr->startdev;
1456 	struct ccw_device *cdev = device->cdev;
1457 
1458 	switch (cdev->id.cu_type) {
1459 	case 0x3990:
1460 	case 0x2105:
1461 	case 0x2107:
1462 	case 0x1750:
1463 		return dasd_3990_erp_action;
1464 	case 0x9343:
1465 	case 0x3880:
1466 	default:
1467 		return dasd_default_erp_action;
1468 	}
1469 }
1470 
1471 static dasd_erp_fn_t
1472 dasd_eckd_erp_postaction(struct dasd_ccw_req * cqr)
1473 {
1474 	return dasd_default_erp_postaction;
1475 }
1476 
1477 
1478 static void dasd_eckd_handle_unsolicited_interrupt(struct dasd_device *device,
1479 						   struct irb *irb)
1480 {
1481 	char mask;
1482 
1483 	/* first of all check for state change pending interrupt */
1484 	mask = DEV_STAT_ATTENTION | DEV_STAT_DEV_END | DEV_STAT_UNIT_EXCEP;
1485 	if ((irb->scsw.cmd.dstat & mask) == mask) {
1486 		dasd_generic_handle_state_change(device);
1487 		return;
1488 	}
1489 
1490 	/* summary unit check */
1491 	if ((irb->scsw.cmd.dstat & DEV_STAT_UNIT_CHECK) &&
1492 	    (irb->ecw[7] == 0x0D)) {
1493 		dasd_alias_handle_summary_unit_check(device, irb);
1494 		return;
1495 	}
1496 
1497 
1498 	/* service information message SIM */
1499 	if (irb->esw.esw0.erw.cons && (irb->ecw[27] & DASD_SENSE_BIT_0) &&
1500 	    ((irb->ecw[6] & DASD_SIM_SENSE) == DASD_SIM_SENSE)) {
1501 		dasd_3990_erp_handle_sim(device, irb->ecw);
1502 		dasd_schedule_device_bh(device);
1503 		return;
1504 	}
1505 
1506 	if ((irb->scsw.cmd.cc == 1) &&
1507 	    (irb->scsw.cmd.fctl & SCSW_FCTL_START_FUNC) &&
1508 	    (irb->scsw.cmd.actl & SCSW_ACTL_START_PEND) &&
1509 	    (irb->scsw.cmd.stctl & SCSW_STCTL_STATUS_PEND)) {
1510 		/* fake irb do nothing, they are handled elsewhere */
1511 		dasd_schedule_device_bh(device);
1512 		return;
1513 	}
1514 
1515 	if (!(irb->esw.esw0.erw.cons)) {
1516 		/* just report other unsolicited interrupts */
1517 		DEV_MESSAGE(KERN_ERR, device, "%s",
1518 			    "unsolicited interrupt received");
1519 	} else {
1520 		DEV_MESSAGE(KERN_ERR, device, "%s",
1521 			    "unsolicited interrupt received "
1522 			    "(sense available)");
1523 		device->discipline->dump_sense(device, NULL, irb);
1524 	}
1525 
1526 	dasd_schedule_device_bh(device);
1527 	return;
1528 };
1529 
1530 static struct dasd_ccw_req *dasd_eckd_build_cp(struct dasd_device *startdev,
1531 					       struct dasd_block *block,
1532 					       struct request *req)
1533 {
1534 	struct dasd_eckd_private *private;
1535 	unsigned long *idaws;
1536 	struct LO_eckd_data *LO_data;
1537 	struct dasd_ccw_req *cqr;
1538 	struct ccw1 *ccw;
1539 	struct req_iterator iter;
1540 	struct bio_vec *bv;
1541 	char *dst;
1542 	unsigned int blksize, blk_per_trk, off;
1543 	int count, cidaw, cplength, datasize;
1544 	sector_t recid, first_rec, last_rec;
1545 	sector_t first_trk, last_trk;
1546 	unsigned int first_offs, last_offs;
1547 	unsigned char cmd, rcmd;
1548 	int use_prefix;
1549 	struct dasd_device *basedev;
1550 
1551 	basedev = block->base;
1552 	private = (struct dasd_eckd_private *) basedev->private;
1553 	if (rq_data_dir(req) == READ)
1554 		cmd = DASD_ECKD_CCW_READ_MT;
1555 	else if (rq_data_dir(req) == WRITE)
1556 		cmd = DASD_ECKD_CCW_WRITE_MT;
1557 	else
1558 		return ERR_PTR(-EINVAL);
1559 	/* Calculate number of blocks/records per track. */
1560 	blksize = block->bp_block;
1561 	blk_per_trk = recs_per_track(&private->rdc_data, 0, blksize);
1562 	/* Calculate record id of first and last block. */
1563 	first_rec = first_trk = req->sector >> block->s2b_shift;
1564 	first_offs = sector_div(first_trk, blk_per_trk);
1565 	last_rec = last_trk =
1566 		(req->sector + req->nr_sectors - 1) >> block->s2b_shift;
1567 	last_offs = sector_div(last_trk, blk_per_trk);
1568 	/* Check struct bio and count the number of blocks for the request. */
1569 	count = 0;
1570 	cidaw = 0;
1571 	rq_for_each_segment(bv, req, iter) {
1572 		if (bv->bv_len & (blksize - 1))
1573 			/* Eckd can only do full blocks. */
1574 			return ERR_PTR(-EINVAL);
1575 		count += bv->bv_len >> (block->s2b_shift + 9);
1576 #if defined(CONFIG_64BIT)
1577 		if (idal_is_needed (page_address(bv->bv_page), bv->bv_len))
1578 			cidaw += bv->bv_len >> (block->s2b_shift + 9);
1579 #endif
1580 	}
1581 	/* Paranoia. */
1582 	if (count != last_rec - first_rec + 1)
1583 		return ERR_PTR(-EINVAL);
1584 
1585 	/* use the prefix command if available */
1586 	use_prefix = private->features.feature[8] & 0x01;
1587 	if (use_prefix) {
1588 		/* 1x prefix + number of blocks */
1589 		cplength = 2 + count;
1590 		/* 1x prefix + cidaws*sizeof(long) */
1591 		datasize = sizeof(struct PFX_eckd_data) +
1592 			sizeof(struct LO_eckd_data) +
1593 			cidaw * sizeof(unsigned long);
1594 	} else {
1595 		/* 1x define extent + 1x locate record + number of blocks */
1596 		cplength = 2 + count;
1597 		/* 1x define extent + 1x locate record + cidaws*sizeof(long) */
1598 		datasize = sizeof(struct DE_eckd_data) +
1599 			sizeof(struct LO_eckd_data) +
1600 			cidaw * sizeof(unsigned long);
1601 	}
1602 	/* Find out the number of additional locate record ccws for cdl. */
1603 	if (private->uses_cdl && first_rec < 2*blk_per_trk) {
1604 		if (last_rec >= 2*blk_per_trk)
1605 			count = 2*blk_per_trk - first_rec;
1606 		cplength += count;
1607 		datasize += count*sizeof(struct LO_eckd_data);
1608 	}
1609 	/* Allocate the ccw request. */
1610 	cqr = dasd_smalloc_request(dasd_eckd_discipline.name,
1611 				   cplength, datasize, startdev);
1612 	if (IS_ERR(cqr))
1613 		return cqr;
1614 	ccw = cqr->cpaddr;
1615 	/* First ccw is define extent or prefix. */
1616 	if (use_prefix) {
1617 		if (prefix(ccw++, cqr->data, first_trk,
1618 			   last_trk, cmd, basedev, startdev) == -EAGAIN) {
1619 			/* Clock not in sync and XRC is enabled.
1620 			 * Try again later.
1621 			 */
1622 			dasd_sfree_request(cqr, startdev);
1623 			return ERR_PTR(-EAGAIN);
1624 		}
1625 		idaws = (unsigned long *) (cqr->data +
1626 					   sizeof(struct PFX_eckd_data));
1627 	} else {
1628 		if (define_extent(ccw++, cqr->data, first_trk,
1629 				  last_trk, cmd, startdev) == -EAGAIN) {
1630 			/* Clock not in sync and XRC is enabled.
1631 			 * Try again later.
1632 			 */
1633 			dasd_sfree_request(cqr, startdev);
1634 			return ERR_PTR(-EAGAIN);
1635 		}
1636 		idaws = (unsigned long *) (cqr->data +
1637 					   sizeof(struct DE_eckd_data));
1638 	}
1639 	/* Build locate_record+read/write/ccws. */
1640 	LO_data = (struct LO_eckd_data *) (idaws + cidaw);
1641 	recid = first_rec;
1642 	if (private->uses_cdl == 0 || recid > 2*blk_per_trk) {
1643 		/* Only standard blocks so there is just one locate record. */
1644 		ccw[-1].flags |= CCW_FLAG_CC;
1645 		locate_record(ccw++, LO_data++, first_trk, first_offs + 1,
1646 			      last_rec - recid + 1, cmd, basedev, blksize);
1647 	}
1648 	rq_for_each_segment(bv, req, iter) {
1649 		dst = page_address(bv->bv_page) + bv->bv_offset;
1650 		if (dasd_page_cache) {
1651 			char *copy = kmem_cache_alloc(dasd_page_cache,
1652 						      GFP_DMA | __GFP_NOWARN);
1653 			if (copy && rq_data_dir(req) == WRITE)
1654 				memcpy(copy + bv->bv_offset, dst, bv->bv_len);
1655 			if (copy)
1656 				dst = copy + bv->bv_offset;
1657 		}
1658 		for (off = 0; off < bv->bv_len; off += blksize) {
1659 			sector_t trkid = recid;
1660 			unsigned int recoffs = sector_div(trkid, blk_per_trk);
1661 			rcmd = cmd;
1662 			count = blksize;
1663 			/* Locate record for cdl special block ? */
1664 			if (private->uses_cdl && recid < 2*blk_per_trk) {
1665 				if (dasd_eckd_cdl_special(blk_per_trk, recid)){
1666 					rcmd |= 0x8;
1667 					count = dasd_eckd_cdl_reclen(recid);
1668 					if (count < blksize &&
1669 					    rq_data_dir(req) == READ)
1670 						memset(dst + count, 0xe5,
1671 						       blksize - count);
1672 				}
1673 				ccw[-1].flags |= CCW_FLAG_CC;
1674 				locate_record(ccw++, LO_data++,
1675 					      trkid, recoffs + 1,
1676 					      1, rcmd, basedev, count);
1677 			}
1678 			/* Locate record for standard blocks ? */
1679 			if (private->uses_cdl && recid == 2*blk_per_trk) {
1680 				ccw[-1].flags |= CCW_FLAG_CC;
1681 				locate_record(ccw++, LO_data++,
1682 					      trkid, recoffs + 1,
1683 					      last_rec - recid + 1,
1684 					      cmd, basedev, count);
1685 			}
1686 			/* Read/write ccw. */
1687 			ccw[-1].flags |= CCW_FLAG_CC;
1688 			ccw->cmd_code = rcmd;
1689 			ccw->count = count;
1690 			if (idal_is_needed(dst, blksize)) {
1691 				ccw->cda = (__u32)(addr_t) idaws;
1692 				ccw->flags = CCW_FLAG_IDA;
1693 				idaws = idal_create_words(idaws, dst, blksize);
1694 			} else {
1695 				ccw->cda = (__u32)(addr_t) dst;
1696 				ccw->flags = 0;
1697 			}
1698 			ccw++;
1699 			dst += blksize;
1700 			recid++;
1701 		}
1702 	}
1703 	if (blk_noretry_request(req))
1704 		set_bit(DASD_CQR_FLAGS_FAILFAST, &cqr->flags);
1705 	cqr->startdev = startdev;
1706 	cqr->memdev = startdev;
1707 	cqr->block = block;
1708 	cqr->expires = 5 * 60 * HZ;	/* 5 minutes */
1709 	cqr->lpm = private->path_data.ppm;
1710 	cqr->retries = 256;
1711 	cqr->buildclk = get_clock();
1712 	cqr->status = DASD_CQR_FILLED;
1713 	return cqr;
1714 }
1715 
1716 static int
1717 dasd_eckd_free_cp(struct dasd_ccw_req *cqr, struct request *req)
1718 {
1719 	struct dasd_eckd_private *private;
1720 	struct ccw1 *ccw;
1721 	struct req_iterator iter;
1722 	struct bio_vec *bv;
1723 	char *dst, *cda;
1724 	unsigned int blksize, blk_per_trk, off;
1725 	sector_t recid;
1726 	int status;
1727 
1728 	if (!dasd_page_cache)
1729 		goto out;
1730 	private = (struct dasd_eckd_private *) cqr->block->base->private;
1731 	blksize = cqr->block->bp_block;
1732 	blk_per_trk = recs_per_track(&private->rdc_data, 0, blksize);
1733 	recid = req->sector >> cqr->block->s2b_shift;
1734 	ccw = cqr->cpaddr;
1735 	/* Skip over define extent & locate record. */
1736 	ccw++;
1737 	if (private->uses_cdl == 0 || recid > 2*blk_per_trk)
1738 		ccw++;
1739 	rq_for_each_segment(bv, req, iter) {
1740 		dst = page_address(bv->bv_page) + bv->bv_offset;
1741 		for (off = 0; off < bv->bv_len; off += blksize) {
1742 			/* Skip locate record. */
1743 			if (private->uses_cdl && recid <= 2*blk_per_trk)
1744 				ccw++;
1745 			if (dst) {
1746 				if (ccw->flags & CCW_FLAG_IDA)
1747 					cda = *((char **)((addr_t) ccw->cda));
1748 				else
1749 					cda = (char *)((addr_t) ccw->cda);
1750 				if (dst != cda) {
1751 					if (rq_data_dir(req) == READ)
1752 						memcpy(dst, cda, bv->bv_len);
1753 					kmem_cache_free(dasd_page_cache,
1754 					    (void *)((addr_t)cda & PAGE_MASK));
1755 				}
1756 				dst = NULL;
1757 			}
1758 			ccw++;
1759 			recid++;
1760 		}
1761 	}
1762 out:
1763 	status = cqr->status == DASD_CQR_DONE;
1764 	dasd_sfree_request(cqr, cqr->memdev);
1765 	return status;
1766 }
1767 
1768 /*
1769  * Modify ccw chain in cqr so it can be started on a base device.
1770  *
1771  * Note that this is not enough to restart the cqr!
1772  * Either reset cqr->startdev as well (summary unit check handling)
1773  * or restart via separate cqr (as in ERP handling).
1774  */
1775 void dasd_eckd_reset_ccw_to_base_io(struct dasd_ccw_req *cqr)
1776 {
1777 	struct ccw1 *ccw;
1778 	struct PFX_eckd_data *pfxdata;
1779 
1780 	ccw = cqr->cpaddr;
1781 	pfxdata = cqr->data;
1782 
1783 	if (ccw->cmd_code == DASD_ECKD_CCW_PFX) {
1784 		pfxdata->validity.verify_base = 0;
1785 		pfxdata->validity.hyper_pav = 0;
1786 	}
1787 }
1788 
1789 #define DASD_ECKD_CHANQ_MAX_SIZE 4
1790 
1791 static struct dasd_ccw_req *dasd_eckd_build_alias_cp(struct dasd_device *base,
1792 						     struct dasd_block *block,
1793 						     struct request *req)
1794 {
1795 	struct dasd_eckd_private *private;
1796 	struct dasd_device *startdev;
1797 	unsigned long flags;
1798 	struct dasd_ccw_req *cqr;
1799 
1800 	startdev = dasd_alias_get_start_dev(base);
1801 	if (!startdev)
1802 		startdev = base;
1803 	private = (struct dasd_eckd_private *) startdev->private;
1804 	if (private->count >= DASD_ECKD_CHANQ_MAX_SIZE)
1805 		return ERR_PTR(-EBUSY);
1806 
1807 	spin_lock_irqsave(get_ccwdev_lock(startdev->cdev), flags);
1808 	private->count++;
1809 	cqr = dasd_eckd_build_cp(startdev, block, req);
1810 	if (IS_ERR(cqr))
1811 		private->count--;
1812 	spin_unlock_irqrestore(get_ccwdev_lock(startdev->cdev), flags);
1813 	return cqr;
1814 }
1815 
1816 static int dasd_eckd_free_alias_cp(struct dasd_ccw_req *cqr,
1817 				   struct request *req)
1818 {
1819 	struct dasd_eckd_private *private;
1820 	unsigned long flags;
1821 
1822 	spin_lock_irqsave(get_ccwdev_lock(cqr->memdev->cdev), flags);
1823 	private = (struct dasd_eckd_private *) cqr->memdev->private;
1824 	private->count--;
1825 	spin_unlock_irqrestore(get_ccwdev_lock(cqr->memdev->cdev), flags);
1826 	return dasd_eckd_free_cp(cqr, req);
1827 }
1828 
1829 static int
1830 dasd_eckd_fill_info(struct dasd_device * device,
1831 		    struct dasd_information2_t * info)
1832 {
1833 	struct dasd_eckd_private *private;
1834 
1835 	private = (struct dasd_eckd_private *) device->private;
1836 	info->label_block = 2;
1837 	info->FBA_layout = private->uses_cdl ? 0 : 1;
1838 	info->format = private->uses_cdl ? DASD_FORMAT_CDL : DASD_FORMAT_LDL;
1839 	info->characteristics_size = sizeof(struct dasd_eckd_characteristics);
1840 	memcpy(info->characteristics, &private->rdc_data,
1841 	       sizeof(struct dasd_eckd_characteristics));
1842 	info->confdata_size = min((unsigned long)private->conf_len,
1843 				  sizeof(info->configuration_data));
1844 	memcpy(info->configuration_data, private->conf_data,
1845 	       info->confdata_size);
1846 	return 0;
1847 }
1848 
1849 /*
1850  * SECTION: ioctl functions for eckd devices.
1851  */
1852 
1853 /*
1854  * Release device ioctl.
1855  * Buils a channel programm to releases a prior reserved
1856  * (see dasd_eckd_reserve) device.
1857  */
1858 static int
1859 dasd_eckd_release(struct dasd_device *device)
1860 {
1861 	struct dasd_ccw_req *cqr;
1862 	int rc;
1863 
1864 	if (!capable(CAP_SYS_ADMIN))
1865 		return -EACCES;
1866 
1867 	cqr = dasd_smalloc_request(dasd_eckd_discipline.name,
1868 				   1, 32, device);
1869 	if (IS_ERR(cqr)) {
1870 		DEV_MESSAGE(KERN_WARNING, device, "%s",
1871 			    "Could not allocate initialization request");
1872 		return PTR_ERR(cqr);
1873 	}
1874 	cqr->cpaddr->cmd_code = DASD_ECKD_CCW_RELEASE;
1875         cqr->cpaddr->flags |= CCW_FLAG_SLI;
1876         cqr->cpaddr->count = 32;
1877 	cqr->cpaddr->cda = (__u32)(addr_t) cqr->data;
1878 	cqr->startdev = device;
1879 	cqr->memdev = device;
1880 	clear_bit(DASD_CQR_FLAGS_USE_ERP, &cqr->flags);
1881 	set_bit(DASD_CQR_FLAGS_FAILFAST, &cqr->flags);
1882 	cqr->retries = 2;	/* set retry counter to enable basic ERP */
1883 	cqr->expires = 2 * HZ;
1884 	cqr->buildclk = get_clock();
1885 	cqr->status = DASD_CQR_FILLED;
1886 
1887 	rc = dasd_sleep_on_immediatly(cqr);
1888 
1889 	dasd_sfree_request(cqr, cqr->memdev);
1890 	return rc;
1891 }
1892 
1893 /*
1894  * Reserve device ioctl.
1895  * Options are set to 'synchronous wait for interrupt' and
1896  * 'timeout the request'. This leads to a terminate IO if
1897  * the interrupt is outstanding for a certain time.
1898  */
1899 static int
1900 dasd_eckd_reserve(struct dasd_device *device)
1901 {
1902 	struct dasd_ccw_req *cqr;
1903 	int rc;
1904 
1905 	if (!capable(CAP_SYS_ADMIN))
1906 		return -EACCES;
1907 
1908 	cqr = dasd_smalloc_request(dasd_eckd_discipline.name,
1909 				   1, 32, device);
1910 	if (IS_ERR(cqr)) {
1911 		DEV_MESSAGE(KERN_WARNING, device, "%s",
1912 			    "Could not allocate initialization request");
1913 		return PTR_ERR(cqr);
1914 	}
1915 	cqr->cpaddr->cmd_code = DASD_ECKD_CCW_RESERVE;
1916         cqr->cpaddr->flags |= CCW_FLAG_SLI;
1917         cqr->cpaddr->count = 32;
1918 	cqr->cpaddr->cda = (__u32)(addr_t) cqr->data;
1919 	cqr->startdev = device;
1920 	cqr->memdev = device;
1921 	clear_bit(DASD_CQR_FLAGS_USE_ERP, &cqr->flags);
1922 	set_bit(DASD_CQR_FLAGS_FAILFAST, &cqr->flags);
1923 	cqr->retries = 2;	/* set retry counter to enable basic ERP */
1924 	cqr->expires = 2 * HZ;
1925 	cqr->buildclk = get_clock();
1926 	cqr->status = DASD_CQR_FILLED;
1927 
1928 	rc = dasd_sleep_on_immediatly(cqr);
1929 
1930 	dasd_sfree_request(cqr, cqr->memdev);
1931 	return rc;
1932 }
1933 
1934 /*
1935  * Steal lock ioctl - unconditional reserve device.
1936  * Buils a channel programm to break a device's reservation.
1937  * (unconditional reserve)
1938  */
1939 static int
1940 dasd_eckd_steal_lock(struct dasd_device *device)
1941 {
1942 	struct dasd_ccw_req *cqr;
1943 	int rc;
1944 
1945 	if (!capable(CAP_SYS_ADMIN))
1946 		return -EACCES;
1947 
1948 	cqr = dasd_smalloc_request(dasd_eckd_discipline.name,
1949 				   1, 32, device);
1950 	if (IS_ERR(cqr)) {
1951 		DEV_MESSAGE(KERN_WARNING, device, "%s",
1952 			    "Could not allocate initialization request");
1953 		return PTR_ERR(cqr);
1954 	}
1955 	cqr->cpaddr->cmd_code = DASD_ECKD_CCW_SLCK;
1956         cqr->cpaddr->flags |= CCW_FLAG_SLI;
1957         cqr->cpaddr->count = 32;
1958 	cqr->cpaddr->cda = (__u32)(addr_t) cqr->data;
1959 	cqr->startdev = device;
1960 	cqr->memdev = device;
1961 	clear_bit(DASD_CQR_FLAGS_USE_ERP, &cqr->flags);
1962 	set_bit(DASD_CQR_FLAGS_FAILFAST, &cqr->flags);
1963 	cqr->retries = 2;	/* set retry counter to enable basic ERP */
1964 	cqr->expires = 2 * HZ;
1965 	cqr->buildclk = get_clock();
1966 	cqr->status = DASD_CQR_FILLED;
1967 
1968 	rc = dasd_sleep_on_immediatly(cqr);
1969 
1970 	dasd_sfree_request(cqr, cqr->memdev);
1971 	return rc;
1972 }
1973 
1974 /*
1975  * Read performance statistics
1976  */
1977 static int
1978 dasd_eckd_performance(struct dasd_device *device, void __user *argp)
1979 {
1980 	struct dasd_psf_prssd_data *prssdp;
1981 	struct dasd_rssd_perf_stats_t *stats;
1982 	struct dasd_ccw_req *cqr;
1983 	struct ccw1 *ccw;
1984 	int rc;
1985 
1986 	cqr = dasd_smalloc_request(dasd_eckd_discipline.name,
1987 				   1 /* PSF */  + 1 /* RSSD */ ,
1988 				   (sizeof(struct dasd_psf_prssd_data) +
1989 				    sizeof(struct dasd_rssd_perf_stats_t)),
1990 				   device);
1991 	if (IS_ERR(cqr)) {
1992 		DEV_MESSAGE(KERN_WARNING, device, "%s",
1993 			    "Could not allocate initialization request");
1994 		return PTR_ERR(cqr);
1995 	}
1996 	cqr->startdev = device;
1997 	cqr->memdev = device;
1998 	cqr->retries = 0;
1999 	cqr->expires = 10 * HZ;
2000 
2001 	/* Prepare for Read Subsystem Data */
2002 	prssdp = (struct dasd_psf_prssd_data *) cqr->data;
2003 	memset(prssdp, 0, sizeof(struct dasd_psf_prssd_data));
2004 	prssdp->order = PSF_ORDER_PRSSD;
2005 	prssdp->suborder = 0x01;	/* Performance Statistics */
2006 	prssdp->varies[1] = 0x01;	/* Perf Statistics for the Subsystem */
2007 
2008 	ccw = cqr->cpaddr;
2009 	ccw->cmd_code = DASD_ECKD_CCW_PSF;
2010 	ccw->count = sizeof(struct dasd_psf_prssd_data);
2011 	ccw->flags |= CCW_FLAG_CC;
2012 	ccw->cda = (__u32)(addr_t) prssdp;
2013 
2014 	/* Read Subsystem Data - Performance Statistics */
2015 	stats = (struct dasd_rssd_perf_stats_t *) (prssdp + 1);
2016 	memset(stats, 0, sizeof(struct dasd_rssd_perf_stats_t));
2017 
2018 	ccw++;
2019 	ccw->cmd_code = DASD_ECKD_CCW_RSSD;
2020 	ccw->count = sizeof(struct dasd_rssd_perf_stats_t);
2021 	ccw->cda = (__u32)(addr_t) stats;
2022 
2023 	cqr->buildclk = get_clock();
2024 	cqr->status = DASD_CQR_FILLED;
2025 	rc = dasd_sleep_on(cqr);
2026 	if (rc == 0) {
2027 		prssdp = (struct dasd_psf_prssd_data *) cqr->data;
2028 		stats = (struct dasd_rssd_perf_stats_t *) (prssdp + 1);
2029 		if (copy_to_user(argp, stats,
2030 				 sizeof(struct dasd_rssd_perf_stats_t)))
2031 			rc = -EFAULT;
2032 	}
2033 	dasd_sfree_request(cqr, cqr->memdev);
2034 	return rc;
2035 }
2036 
2037 /*
2038  * Get attributes (cache operations)
2039  * Returnes the cache attributes used in Define Extend (DE).
2040  */
2041 static int
2042 dasd_eckd_get_attrib(struct dasd_device *device, void __user *argp)
2043 {
2044 	struct dasd_eckd_private *private =
2045 		(struct dasd_eckd_private *)device->private;
2046 	struct attrib_data_t attrib = private->attrib;
2047 	int rc;
2048 
2049         if (!capable(CAP_SYS_ADMIN))
2050                 return -EACCES;
2051 	if (!argp)
2052                 return -EINVAL;
2053 
2054 	rc = 0;
2055 	if (copy_to_user(argp, (long *) &attrib,
2056 			 sizeof(struct attrib_data_t)))
2057 		rc = -EFAULT;
2058 
2059 	return rc;
2060 }
2061 
2062 /*
2063  * Set attributes (cache operations)
2064  * Stores the attributes for cache operation to be used in Define Extend (DE).
2065  */
2066 static int
2067 dasd_eckd_set_attrib(struct dasd_device *device, void __user *argp)
2068 {
2069 	struct dasd_eckd_private *private =
2070 		(struct dasd_eckd_private *)device->private;
2071 	struct attrib_data_t attrib;
2072 
2073 	if (!capable(CAP_SYS_ADMIN))
2074 		return -EACCES;
2075 	if (!argp)
2076 		return -EINVAL;
2077 
2078 	if (copy_from_user(&attrib, argp, sizeof(struct attrib_data_t)))
2079 		return -EFAULT;
2080 	private->attrib = attrib;
2081 
2082 	DEV_MESSAGE(KERN_INFO, device,
2083 		    "cache operation mode set to %x (%i cylinder prestage)",
2084 		    private->attrib.operation, private->attrib.nr_cyl);
2085 	return 0;
2086 }
2087 
2088 /*
2089  * Issue syscall I/O to EMC Symmetrix array.
2090  * CCWs are PSF and RSSD
2091  */
2092 static int dasd_symm_io(struct dasd_device *device, void __user *argp)
2093 {
2094 	struct dasd_symmio_parms usrparm;
2095 	char *psf_data, *rssd_result;
2096 	struct dasd_ccw_req *cqr;
2097 	struct ccw1 *ccw;
2098 	int rc;
2099 
2100 	/* Copy parms from caller */
2101 	rc = -EFAULT;
2102 	if (copy_from_user(&usrparm, argp, sizeof(usrparm)))
2103 		goto out;
2104 #ifndef CONFIG_64BIT
2105 	/* Make sure pointers are sane even on 31 bit. */
2106 	if ((usrparm.psf_data >> 32) != 0 || (usrparm.rssd_result >> 32) != 0) {
2107 		rc = -EINVAL;
2108 		goto out;
2109 	}
2110 #endif
2111 	/* alloc I/O data area */
2112 	psf_data = kzalloc(usrparm.psf_data_len, GFP_KERNEL | GFP_DMA);
2113 	rssd_result = kzalloc(usrparm.rssd_result_len, GFP_KERNEL | GFP_DMA);
2114 	if (!psf_data || !rssd_result) {
2115 		rc = -ENOMEM;
2116 		goto out_free;
2117 	}
2118 
2119 	/* get syscall header from user space */
2120 	rc = -EFAULT;
2121 	if (copy_from_user(psf_data,
2122 			   (void __user *)(unsigned long) usrparm.psf_data,
2123 			   usrparm.psf_data_len))
2124 		goto out_free;
2125 
2126 	/* sanity check on syscall header */
2127 	if (psf_data[0] != 0x17 && psf_data[1] != 0xce) {
2128 		rc = -EINVAL;
2129 		goto out_free;
2130 	}
2131 
2132 	/* setup CCWs for PSF + RSSD */
2133 	cqr = dasd_smalloc_request("ECKD", 2 , 0, device);
2134 	if (IS_ERR(cqr)) {
2135 		DEV_MESSAGE(KERN_WARNING, device, "%s",
2136 			"Could not allocate initialization request");
2137 		rc = PTR_ERR(cqr);
2138 		goto out_free;
2139 	}
2140 
2141 	cqr->startdev = device;
2142 	cqr->memdev = device;
2143 	cqr->retries = 3;
2144 	cqr->expires = 10 * HZ;
2145 	cqr->buildclk = get_clock();
2146 	cqr->status = DASD_CQR_FILLED;
2147 
2148 	/* Build the ccws */
2149 	ccw = cqr->cpaddr;
2150 
2151 	/* PSF ccw */
2152 	ccw->cmd_code = DASD_ECKD_CCW_PSF;
2153 	ccw->count = usrparm.psf_data_len;
2154 	ccw->flags |= CCW_FLAG_CC;
2155 	ccw->cda = (__u32)(addr_t) psf_data;
2156 
2157 	ccw++;
2158 
2159 	/* RSSD ccw  */
2160 	ccw->cmd_code = DASD_ECKD_CCW_RSSD;
2161 	ccw->count = usrparm.rssd_result_len;
2162 	ccw->flags = CCW_FLAG_SLI ;
2163 	ccw->cda = (__u32)(addr_t) rssd_result;
2164 
2165 	rc = dasd_sleep_on(cqr);
2166 	if (rc)
2167 		goto out_sfree;
2168 
2169 	rc = -EFAULT;
2170 	if (copy_to_user((void __user *)(unsigned long) usrparm.rssd_result,
2171 			   rssd_result, usrparm.rssd_result_len))
2172 		goto out_sfree;
2173 	rc = 0;
2174 
2175 out_sfree:
2176 	dasd_sfree_request(cqr, cqr->memdev);
2177 out_free:
2178 	kfree(rssd_result);
2179 	kfree(psf_data);
2180 out:
2181 	DBF_DEV_EVENT(DBF_WARNING, device, "Symmetrix ioctl: rc=%d", rc);
2182 	return rc;
2183 }
2184 
2185 static int
2186 dasd_eckd_ioctl(struct dasd_block *block, unsigned int cmd, void __user *argp)
2187 {
2188 	struct dasd_device *device = block->base;
2189 
2190 	switch (cmd) {
2191 	case BIODASDGATTR:
2192 		return dasd_eckd_get_attrib(device, argp);
2193 	case BIODASDSATTR:
2194 		return dasd_eckd_set_attrib(device, argp);
2195 	case BIODASDPSRD:
2196 		return dasd_eckd_performance(device, argp);
2197 	case BIODASDRLSE:
2198 		return dasd_eckd_release(device);
2199 	case BIODASDRSRV:
2200 		return dasd_eckd_reserve(device);
2201 	case BIODASDSLCK:
2202 		return dasd_eckd_steal_lock(device);
2203 	case BIODASDSYMMIO:
2204 		return dasd_symm_io(device, argp);
2205 	default:
2206 		return -ENOIOCTLCMD;
2207 	}
2208 }
2209 
2210 /*
2211  * Dump the range of CCWs into 'page' buffer
2212  * and return number of printed chars.
2213  */
2214 static int
2215 dasd_eckd_dump_ccw_range(struct ccw1 *from, struct ccw1 *to, char *page)
2216 {
2217 	int len, count;
2218 	char *datap;
2219 
2220 	len = 0;
2221 	while (from <= to) {
2222 		len += sprintf(page + len, KERN_ERR PRINTK_HEADER
2223 			       " CCW %p: %08X %08X DAT:",
2224 			       from, ((int *) from)[0], ((int *) from)[1]);
2225 
2226 		/* get pointer to data (consider IDALs) */
2227 		if (from->flags & CCW_FLAG_IDA)
2228 			datap = (char *) *((addr_t *) (addr_t) from->cda);
2229 		else
2230 			datap = (char *) ((addr_t) from->cda);
2231 
2232 		/* dump data (max 32 bytes) */
2233 		for (count = 0; count < from->count && count < 32; count++) {
2234 			if (count % 8 == 0) len += sprintf(page + len, " ");
2235 			if (count % 4 == 0) len += sprintf(page + len, " ");
2236 			len += sprintf(page + len, "%02x", datap[count]);
2237 		}
2238 		len += sprintf(page + len, "\n");
2239 		from++;
2240 	}
2241 	return len;
2242 }
2243 
2244 /*
2245  * Print sense data and related channel program.
2246  * Parts are printed because printk buffer is only 1024 bytes.
2247  */
2248 static void dasd_eckd_dump_sense(struct dasd_device *device,
2249 				 struct dasd_ccw_req *req, struct irb *irb)
2250 {
2251 	char *page;
2252 	struct ccw1 *first, *last, *fail, *from, *to;
2253 	int len, sl, sct;
2254 
2255 	page = (char *) get_zeroed_page(GFP_ATOMIC);
2256 	if (page == NULL) {
2257 		DEV_MESSAGE(KERN_ERR, device, " %s",
2258 			    "No memory to dump sense data");
2259 		return;
2260 	}
2261 	/* dump the sense data */
2262 	len = sprintf(page,  KERN_ERR PRINTK_HEADER
2263 		      " I/O status report for device %s:\n",
2264 		      dev_name(&device->cdev->dev));
2265 	len += sprintf(page + len, KERN_ERR PRINTK_HEADER
2266 		       " in req: %p CS: 0x%02X DS: 0x%02X\n", req,
2267 		       irb->scsw.cmd.cstat, irb->scsw.cmd.dstat);
2268 	len += sprintf(page + len, KERN_ERR PRINTK_HEADER
2269 		       " device %s: Failing CCW: %p\n",
2270 		       dev_name(&device->cdev->dev),
2271 		       (void *) (addr_t) irb->scsw.cmd.cpa);
2272 	if (irb->esw.esw0.erw.cons) {
2273 		for (sl = 0; sl < 4; sl++) {
2274 			len += sprintf(page + len, KERN_ERR PRINTK_HEADER
2275 				       " Sense(hex) %2d-%2d:",
2276 				       (8 * sl), ((8 * sl) + 7));
2277 
2278 			for (sct = 0; sct < 8; sct++) {
2279 				len += sprintf(page + len, " %02x",
2280 					       irb->ecw[8 * sl + sct]);
2281 			}
2282 			len += sprintf(page + len, "\n");
2283 		}
2284 
2285 		if (irb->ecw[27] & DASD_SENSE_BIT_0) {
2286 			/* 24 Byte Sense Data */
2287 			sprintf(page + len, KERN_ERR PRINTK_HEADER
2288 				" 24 Byte: %x MSG %x, "
2289 				"%s MSGb to SYSOP\n",
2290 				irb->ecw[7] >> 4, irb->ecw[7] & 0x0f,
2291 				irb->ecw[1] & 0x10 ? "" : "no");
2292 		} else {
2293 			/* 32 Byte Sense Data */
2294 			sprintf(page + len, KERN_ERR PRINTK_HEADER
2295 				" 32 Byte: Format: %x "
2296 				"Exception class %x\n",
2297 				irb->ecw[6] & 0x0f, irb->ecw[22] >> 4);
2298 		}
2299 	} else {
2300 		sprintf(page + len, KERN_ERR PRINTK_HEADER
2301 			" SORRY - NO VALID SENSE AVAILABLE\n");
2302 	}
2303 	printk("%s", page);
2304 
2305 	if (req) {
2306 		/* req == NULL for unsolicited interrupts */
2307 		/* dump the Channel Program (max 140 Bytes per line) */
2308 		/* Count CCW and print first CCWs (maximum 1024 % 140 = 7) */
2309 		first = req->cpaddr;
2310 		for (last = first; last->flags & (CCW_FLAG_CC | CCW_FLAG_DC); last++);
2311 		to = min(first + 6, last);
2312 		len = sprintf(page,  KERN_ERR PRINTK_HEADER
2313 			      " Related CP in req: %p\n", req);
2314 		dasd_eckd_dump_ccw_range(first, to, page + len);
2315 		printk("%s", page);
2316 
2317 		/* print failing CCW area (maximum 4) */
2318 		/* scsw->cda is either valid or zero  */
2319 		len = 0;
2320 		from = ++to;
2321 		fail = (struct ccw1 *)(addr_t)
2322 				irb->scsw.cmd.cpa; /* failing CCW */
2323 		if (from <  fail - 2) {
2324 			from = fail - 2;     /* there is a gap - print header */
2325 			len += sprintf(page, KERN_ERR PRINTK_HEADER "......\n");
2326 		}
2327 		to = min(fail + 1, last);
2328 		len += dasd_eckd_dump_ccw_range(from, to, page + len);
2329 
2330 		/* print last CCWs (maximum 2) */
2331 		from = max(from, ++to);
2332 		if (from < last - 1) {
2333 			from = last - 1;     /* there is a gap - print header */
2334 			len += sprintf(page + len, KERN_ERR PRINTK_HEADER "......\n");
2335 		}
2336 		len += dasd_eckd_dump_ccw_range(from, last, page + len);
2337 		if (len > 0)
2338 			printk("%s", page);
2339 	}
2340 	free_page((unsigned long) page);
2341 }
2342 
2343 /*
2344  * max_blocks is dependent on the amount of storage that is available
2345  * in the static io buffer for each device. Currently each device has
2346  * 8192 bytes (=2 pages). For 64 bit one dasd_mchunkt_t structure has
2347  * 24 bytes, the struct dasd_ccw_req has 136 bytes and each block can use
2348  * up to 16 bytes (8 for the ccw and 8 for the idal pointer). In
2349  * addition we have one define extent ccw + 16 bytes of data and one
2350  * locate record ccw + 16 bytes of data. That makes:
2351  * (8192 - 24 - 136 - 8 - 16 - 8 - 16) / 16 = 499 blocks at maximum.
2352  * We want to fit two into the available memory so that we can immediately
2353  * start the next request if one finishes off. That makes 249.5 blocks
2354  * for one request. Give a little safety and the result is 240.
2355  */
2356 static struct dasd_discipline dasd_eckd_discipline = {
2357 	.owner = THIS_MODULE,
2358 	.name = "ECKD",
2359 	.ebcname = "ECKD",
2360 	.max_blocks = 240,
2361 	.check_device = dasd_eckd_check_characteristics,
2362 	.uncheck_device = dasd_eckd_uncheck_device,
2363 	.do_analysis = dasd_eckd_do_analysis,
2364 	.ready_to_online = dasd_eckd_ready_to_online,
2365 	.online_to_ready = dasd_eckd_online_to_ready,
2366 	.fill_geometry = dasd_eckd_fill_geometry,
2367 	.start_IO = dasd_start_IO,
2368 	.term_IO = dasd_term_IO,
2369 	.handle_terminated_request = dasd_eckd_handle_terminated_request,
2370 	.format_device = dasd_eckd_format_device,
2371 	.erp_action = dasd_eckd_erp_action,
2372 	.erp_postaction = dasd_eckd_erp_postaction,
2373 	.handle_unsolicited_interrupt = dasd_eckd_handle_unsolicited_interrupt,
2374 	.build_cp = dasd_eckd_build_alias_cp,
2375 	.free_cp = dasd_eckd_free_alias_cp,
2376 	.dump_sense = dasd_eckd_dump_sense,
2377 	.fill_info = dasd_eckd_fill_info,
2378 	.ioctl = dasd_eckd_ioctl,
2379 };
2380 
2381 static int __init
2382 dasd_eckd_init(void)
2383 {
2384 	ASCEBC(dasd_eckd_discipline.ebcname, 4);
2385 	return ccw_driver_register(&dasd_eckd_driver);
2386 }
2387 
2388 static void __exit
2389 dasd_eckd_cleanup(void)
2390 {
2391 	ccw_driver_unregister(&dasd_eckd_driver);
2392 }
2393 
2394 module_init(dasd_eckd_init);
2395 module_exit(dasd_eckd_cleanup);
2396