static DEVICE_ATTR(expires, 0644, dasd_expires_show, dasd_expires_store);
 
+static ssize_t
+dasd_retries_show(struct device *dev, struct device_attribute *attr, char *buf)
+{
+       struct dasd_device *device;
+       int len;
+
+       device = dasd_device_from_cdev(to_ccwdev(dev));
+       if (IS_ERR(device))
+               return -ENODEV;
+       len = snprintf(buf, PAGE_SIZE, "%lu\n", device->default_retries);
+       dasd_put_device(device);
+       return len;
+}
+
+static ssize_t
+dasd_retries_store(struct device *dev, struct device_attribute *attr,
+                  const char *buf, size_t count)
+{
+       struct dasd_device *device;
+       unsigned long val;
+
+       device = dasd_device_from_cdev(to_ccwdev(dev));
+       if (IS_ERR(device))
+               return -ENODEV;
+
+       if ((strict_strtoul(buf, 10, &val) != 0) ||
+           (val > DASD_RETRIES_MAX)) {
+               dasd_put_device(device);
+               return -EINVAL;
+       }
+
+       if (val)
+               device->default_retries = val;
+
+       dasd_put_device(device);
+       return count;
+}
+
+static DEVICE_ATTR(retries, 0644, dasd_retries_show, dasd_retries_store);
+
 static ssize_t dasd_reservation_policy_show(struct device *dev,
                                            struct device_attribute *attr,
                                            char *buf)
        &dev_attr_erplog.attr,
        &dev_attr_failfast.attr,
        &dev_attr_expires.attr,
+       &dev_attr_retries.attr,
        &dev_attr_reservation_policy.attr,
        &dev_attr_last_known_reservation_state.attr,
        &dev_attr_safe_offline.attr,
 
        }
 
        device->default_expires = DIAG_TIMEOUT;
+       device->default_retries = DIAG_MAX_RETRIES;
 
        /* Figure out position of label block */
        switch (private->rdc_data.vdev_class) {
                        recid++;
                }
        }
-       cqr->retries = DIAG_MAX_RETRIES;
+       cqr->retries = memdev->default_retries;
        cqr->buildclk = get_tod_clock();
        if (blk_noretry_request(req) ||
            block->base->features & DASD_FEATURE_FAILFAST)
 
 
        /* set default timeout */
        device->default_expires = DASD_EXPIRES;
+       /* set default retry count */
+       device->default_retries = DASD_RETRIES;
+
        if (private->gneq) {
                value = 1;
                for (i = 0; i < private->gneq->timeout.value; i++)
        cqr->block = block;
        cqr->expires = startdev->default_expires * HZ;  /* default 5 minutes */
        cqr->lpm = startdev->path_data.ppm;
-       cqr->retries = 256;
+       cqr->retries = startdev->default_retries;
        cqr->buildclk = get_tod_clock();
        cqr->status = DASD_CQR_FILLED;
        return cqr;
        cqr->block = block;
        cqr->expires = startdev->default_expires * HZ;  /* default 5 minutes */
        cqr->lpm = startdev->path_data.ppm;
-       cqr->retries = 256;
+       cqr->retries = startdev->default_retries;
        cqr->buildclk = get_tod_clock();
        cqr->status = DASD_CQR_FILLED;
        return cqr;
        cqr->block = block;
        cqr->expires = startdev->default_expires * HZ;  /* default 5 minutes */
        cqr->lpm = startdev->path_data.ppm;
-       cqr->retries = 256;
+       cqr->retries = startdev->default_retries;
        cqr->buildclk = get_tod_clock();
        cqr->status = DASD_CQR_FILLED;
        return cqr;
        cqr->block = block;
        cqr->expires = startdev->default_expires * HZ;
        cqr->lpm = startdev->path_data.ppm;
-       cqr->retries = 256;
+       cqr->retries = startdev->default_retries;
        cqr->buildclk = get_tod_clock();
        cqr->status = DASD_CQR_FILLED;
 
 
 #endif                         /* PRINTK_HEADER */
 #define PRINTK_HEADER "dasd(fba):"
 
+#define FBA_DEFAULT_RETRIES 32
+
 #define DASD_FBA_CCW_WRITE 0x41
 #define DASD_FBA_CCW_READ 0x42
 #define DASD_FBA_CCW_LOCATE 0x43
        }
 
        device->default_expires = DASD_EXPIRES;
+       device->default_retries = FBA_DEFAULT_RETRIES;
        device->path_data.opm = LPM_ANYPATH;
 
        readonly = dasd_device_is_ro(device);
        cqr->memdev = memdev;
        cqr->block = block;
        cqr->expires = memdev->default_expires * HZ;    /* default 5 minutes */
-       cqr->retries = 32;
+       cqr->retries = memdev->default_retries;
        cqr->buildclk = get_tod_clock();
        cqr->status = DASD_CQR_FILLED;
        return cqr;
 
 /* default expiration time*/
 #define DASD_EXPIRES     300
 #define DASD_EXPIRES_MAX  40000000
+#define DASD_RETRIES     256
+#define DASD_RETRIES_MAX  32768
 
 /* per dasd_ccw_req flags */
 #define DASD_CQR_FLAGS_USE_ERP   0     /* use ERP for this request */
 
        /* default expiration time in s */
        unsigned long default_expires;
+       unsigned long default_retries;
 
        struct dentry *debugfs_dentry;
        struct dasd_profile profile;