+ /* Request active. Set running indication. */
+ set_bit(SCLP_RUNNING, &sclp_status);
+ break;
+ }
+ if (rc == -EBUSY) {
+ /**
+ * SCLP is busy but no request is running.
+ * Try again later.
+ */
+ if (!timer_pending(&sclp_busy_timer) ||
+ !mod_timer(&sclp_busy_timer,
+ jiffies + SCLP_BUSY_POLL_INTERVAL*HZ)) {
+ sclp_busy_timer.function =
+ (void *) sclp_start_request;
+ sclp_busy_timer.expires =
+ jiffies + SCLP_BUSY_POLL_INTERVAL*HZ;
+ add_timer(&sclp_busy_timer);
+ }
+ break;
+ }
+ /* Request failed. */
+ req->status = SCLP_REQ_FAILED;
+ list_del(&req->list);
+ if (req->callback) {
+ spin_unlock_irqrestore(&sclp_lock, flags);
+ req->callback(req, req->callback_data);
+ spin_lock_irqsave(&sclp_lock, flags);
+ }
+ }