test_bit(DASD_CQR_FLAGS_FAILFAST, &cqr->flags) &&
                    (!dasd_eer_enabled(device))) {
                        cqr->status = DASD_CQR_FAILED;
-                       cqr->intrc = -EAGAIN;
+                       cqr->intrc = -ENOLINK;
                        continue;
                }
                /* Don't try to start requests if device is stopped */
        req = (struct request *) cqr->callback_data;
        dasd_profile_end(cqr->block, cqr, req);
        status = cqr->block->base->discipline->free_cp(cqr, req);
-       if (status <= 0)
-               error = status ? status : -EIO;
+       if (status < 0)
+               error = status;
+       else if (status == 0) {
+               if (cqr->intrc == -EPERM)
+                       error = -EBADE;
+               else if (cqr->intrc == -ENOLINK ||
+                        cqr->intrc == -ETIMEDOUT)
+                       error = cqr->intrc;
+               else
+                       error = -EIO;
+       }
        __blk_end_request_all(req, error);
 }
 
                    test_bit(DASD_CQR_FLAGS_FAILFAST, &cqr->flags) &&
                    (!dasd_eer_enabled(block->base))) {
                        cqr->status = DASD_CQR_FAILED;
+                       cqr->intrc = -ENOLINK;
                        dasd_schedule_block_bh(block);
                        continue;
                }