static void ps_tq_int( void *data);
-enum action {Fail = 0, Ok = 1, Claim, Hold, Wait};
+enum action {Fail = 0, Ok = 1, Hold, Wait};
static enum action (*phase)(void);
static unsigned long ps_timeout;
static struct pd_unit *pd_current; /* current request's drive */
static PIA *pi_current; /* current request's PIA */
static struct request *pd_req; /* current request */
+static enum action do_pd_io_start(void);
static struct request_queue *pd_queue;
static void run_fsm(void)
unsigned long saved_flags;
int stop = 0;
+ if (!phase) {
+ pd_current = pd_req->rq_disk->private_data;
+ pi_current = pd_current->pi;
+ phase = do_pd_io_start;
+ if (!pi_schedule_claimed(pi_current, run_fsm))
+ return;
+ }
+
switch(res = phase()) {
case Ok: case Fail:
pi_unclaim(pi_current);
+ phase = NULL;
spin_lock_irqsave(&pd_lock, saved_flags);
end_request(pd_req, res);
pd_req = elv_next_request(pd_queue);
spin_unlock_irqrestore(&pd_lock, saved_flags);
if (stop)
return;
- phase = do_pd_io;
+ case Hold:
ps_set_intr();
return;
case Wait:
pi_unclaim(pi_current);
- /* fallthrough */
- case Claim:
if (!pi_schedule_claimed(pi_current, run_fsm))
return;
break;
- case Hold:
- ps_set_intr();
- return;
}
}
}
static int pd_release(struct inode *inode, struct file *file);
static int pd_revalidate(struct gendisk *p);
static int pd_detect(void);
-static enum action do_pd_io(void);
-static enum action do_pd_io_start(void);
static enum action do_pd_read_start(void);
static enum action do_pd_write_start(void);
static enum action do_pd_read_drq(void);
if (!pd_req)
return;
- phase = do_pd_io;
ps_set_intr();
}
return 0;
}
-static enum action do_pd_io(void)
-{
- pd_current = pd_req->rq_disk->private_data;
- pi_current = pd_current->pi;
- phase = do_pd_io_start;
- return Claim;
-}
-
static enum action do_pd_io_start(void)
{
pd_block = pd_req->sector;