/* * Function to start a delayed output after RAW3215_TIMEOUT seconds */ static void raw3215_timeout(unsigned long __data) { raw3215_info *raw = (raw3215_info *) __data; unsigned long flags; s390irq_spin_lock_irqsave(raw->irq, flags); if (raw->flags & RAW3215_TIMER_RUNS) { del_timer(&raw->timer); raw->flags &= ~RAW3215_TIMER_RUNS; raw3215_mk_write_req(raw); raw3215_start_io(raw); } s390irq_spin_unlock_irqrestore(raw->irq, flags); }
/* * Function to start a delayed output after RAW3215_TIMEOUT seconds */ static void raw3215_timeout(unsigned long __data) { struct raw3215_info *raw = (struct raw3215_info *) __data; unsigned long flags; spin_lock_irqsave(get_ccwdev_lock(raw->cdev), flags); if (raw->flags & RAW3215_TIMER_RUNS) { del_timer(&raw->timer); raw->flags &= ~RAW3215_TIMER_RUNS; raw3215_mk_write_req(raw); raw3215_start_io(raw); } spin_unlock_irqrestore(get_ccwdev_lock(raw->cdev), flags); }
/* * Function to conditionally start an IO. A read is started immediately, * a write is only started immediately if the flush flag is on or the * amount of data is bigger than RAW3215_MIN_WRITE. If a write is not * done immediately a timer is started with a delay of RAW3215_TIMEOUT. */ static inline void raw3215_try_io(struct raw3215_info *raw) { if (!(raw->flags & RAW3215_ACTIVE) || (raw->flags & RAW3215_FROZEN)) return; if (raw->queued_read != NULL) raw3215_start_io(raw); else if (raw->queued_write != NULL) { if ((raw->queued_write->delayable == 0) || (raw->flags & RAW3215_FLUSHING)) { /* execute write requests bigger than minimum size */ raw3215_start_io(raw); } } if ((raw->queued_read || raw->queued_write) && !(raw->flags & RAW3215_WORKING) && !(raw->flags & RAW3215_TIMER_RUNS)) { init_timer(&raw->timer); raw->timer.expires = RAW3215_TIMEOUT + jiffies; raw->timer.data = (unsigned long) raw; raw->timer.function = raw3215_timeout; add_timer(&raw->timer); raw->flags |= RAW3215_TIMER_RUNS; } }
/* * Function to conditionally start an IO. A read is started immediately, * a write is only started immediately if the flush flag is on or the * amount of data is bigger than RAW3215_MIN_WRITE. If a write is not * done immediately a timer is started with a delay of RAW3215_TIMEOUT. */ static inline void raw3215_try_io(struct raw3215_info *raw) { if (!(raw->port.flags & ASYNC_INITIALIZED) || (raw->port.flags & ASYNC_SUSPENDED)) return; if (raw->queued_read != NULL) raw3215_start_io(raw); else if (raw->queued_write != NULL) { if ((raw->queued_write->delayable == 0) || (raw->flags & RAW3215_FLUSHING)) { /* execute write requests bigger than minimum size */ raw3215_start_io(raw); if (raw->flags & RAW3215_TIMER_RUNS) { del_timer(&raw->timer); raw->flags &= ~RAW3215_TIMER_RUNS; } } else if (!(raw->flags & RAW3215_TIMER_RUNS)) { /* delay small writes */ raw->timer.expires = RAW3215_TIMEOUT + jiffies; add_timer(&raw->timer); raw->flags |= RAW3215_TIMER_RUNS; } } }
/* * Function to start a delayed output after RAW3215_TIMEOUT seconds */ static void raw3215_timeout(unsigned long __data) { struct raw3215_info *raw = (struct raw3215_info *) __data; unsigned long flags; spin_lock_irqsave(get_ccwdev_lock(raw->cdev), flags); raw->flags &= ~RAW3215_TIMER_RUNS; if (!(raw->port.flags & ASYNC_SUSPENDED)) { raw3215_mk_write_req(raw); raw3215_start_io(raw); if ((raw->queued_read || raw->queued_write) && !(raw->flags & RAW3215_WORKING) && !(raw->flags & RAW3215_TIMER_RUNS)) { raw->timer.expires = RAW3215_TIMEOUT + jiffies; add_timer(&raw->timer); raw->flags |= RAW3215_TIMER_RUNS; } } spin_unlock_irqrestore(get_ccwdev_lock(raw->cdev), flags); }