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