static void dasd_profile_exit(struct dasd_profile *);
 static void dasd_hosts_init(struct dentry *, struct dasd_device *);
 static void dasd_hosts_exit(struct dasd_device *);
-
+static int dasd_handle_autoquiesce(struct dasd_device *, struct dasd_ccw_req *,
+                                  unsigned int);
 /*
  * SECTION: Operations on the device structure.
  */
                /* Non-temporary stop condition will trigger fail fast */
                if (device->stopped & ~DASD_STOPPED_PENDING &&
                    test_bit(DASD_CQR_FLAGS_FAILFAST, &cqr->flags) &&
-                   (!dasd_eer_enabled(device))) {
+                   !dasd_eer_enabled(device) && device->aq_mask == 0) {
                        cqr->status = DASD_CQR_FAILED;
                        cqr->intrc = -ENOLINK;
                        continue;
                        dasd_log_sense(cqr, &cqr->irb);
                }
 
-               /* First of all call extended error reporting. */
-               if (dasd_eer_enabled(base) &&
-                   cqr->status == DASD_CQR_FAILED) {
-                       dasd_eer_write(base, cqr, DASD_EER_FATALERROR);
-
-                       /* restart request  */
+               /*
+                * First call extended error reporting and check for autoquiesce
+                */
+               spin_lock_irqsave(get_ccwdev_lock(base->cdev), flags);
+               if (cqr->status == DASD_CQR_FAILED &&
+                   dasd_handle_autoquiesce(base, cqr, DASD_EER_FATALERROR)) {
                        cqr->status = DASD_CQR_FILLED;
                        cqr->retries = 255;
-                       spin_lock_irqsave(get_ccwdev_lock(base->cdev), flags);
-                       dasd_device_set_stop_bits(base, DASD_STOPPED_QUIESCE);
-                       spin_unlock_irqrestore(get_ccwdev_lock(base->cdev),
-                                              flags);
+                       spin_unlock_irqrestore(get_ccwdev_lock(base->cdev), flags);
                        goto restart;
                }
+               spin_unlock_irqrestore(get_ccwdev_lock(base->cdev), flags);
 
                /* Process finished ERP request. */
                if (cqr->refers) {
                /* Non-temporary stop condition will trigger fail fast */
                if (block->base->stopped & ~DASD_STOPPED_PENDING &&
                    test_bit(DASD_CQR_FLAGS_FAILFAST, &cqr->flags) &&
-                   (!dasd_eer_enabled(block->base))) {
+                   !dasd_eer_enabled(block->base) && block->base->aq_mask == 0) {
                        cqr->status = DASD_CQR_FAILED;
                        cqr->intrc = -ENOLINK;
                        dasd_schedule_block_bh(block);
        dev_warn(&device->cdev->dev, "No operational channel path is left "
                 "for the device\n");
        DBF_DEV_EVENT(DBF_WARNING, device, "%s", "last path gone");
-       /* First of all call extended error reporting. */
-       dasd_eer_write(device, NULL, DASD_EER_NOPATH);
+       /* First call extended error reporting and check for autoquiesce. */
+       dasd_handle_autoquiesce(device, NULL, DASD_EER_NOPATH);
 
        if (device->state < DASD_STATE_BASIC)
                return 0;
                         "No verified channel paths remain for the device\n");
                DBF_DEV_EVENT(DBF_WARNING, device,
                              "%s", "last verified path gone");
-               dasd_eer_write(device, NULL, DASD_EER_NOPATH);
+               /* First call extended error reporting and check for autoquiesce. */
+               dasd_handle_autoquiesce(device, NULL, DASD_EER_NOPATH);
                dasd_device_set_stop_bits(device,
                                          DASD_STOPPED_DC_WAIT);
        }
 void dasd_generic_space_exhaust(struct dasd_device *device,
                                struct dasd_ccw_req *cqr)
 {
-       dasd_eer_write(device, NULL, DASD_EER_NOSPC);
+       /* First call extended error reporting and check for autoquiesce. */
+       dasd_handle_autoquiesce(device, NULL, DASD_EER_NOSPC);
 
        if (device->state < DASD_STATE_BASIC)
                return;
 }
 EXPORT_SYMBOL(dasd_schedule_requeue);
 
+static int dasd_handle_autoquiesce(struct dasd_device *device,
+                                  struct dasd_ccw_req *cqr,
+                                  unsigned int reason)
+{
+       /* in any case write eer message with reason */
+       if (dasd_eer_enabled(device))
+               dasd_eer_write(device, cqr, reason);
+
+       if (!test_bit(reason, &device->aq_mask))
+               return 0;
+
+       /* notify eer about autoquiesce */
+       if (dasd_eer_enabled(device))
+               dasd_eer_write(device, NULL, DASD_EER_AUTOQUIESCE);
+
+       pr_info("%s: The DASD has been put in the quiesce state\n",
+               dev_name(&device->cdev->dev));
+       dasd_device_set_stop_bits(device, DASD_STOPPED_QUIESCE);
+
+       if (device->features & DASD_FEATURE_REQUEUEQUIESCE)
+               dasd_schedule_requeue(device);
+
+       return 1;
+}
+
 static struct dasd_ccw_req *dasd_generic_build_rdc(struct dasd_device *device,
                                                   int rdc_buffer_size,
                                                   int magic)