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