staging: comedi: serial2002: factor (*poll) busy wait out of tty_read()
authorH Hartley Sweeten <hsweeten@visionengravers.com>
Fri, 5 Apr 2013 23:08:13 +0000 (16:08 -0700)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Mon, 8 Apr 2013 17:27:43 +0000 (10:27 -0700)
Factor the (*poll) busy wait code out of tty_read() so the indent
level can be reduced and tty_read() is a bit cleaner.

Signed-off-by: H Hartley Sweeten <hsweeten@visionengravers.com>
Cc: Ian Abbott <abbotti@mev.co.uk>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/staging/comedi/drivers/serial2002.c

index 75c86ae6f84433ef647693640a35496ab38f0117..ecf8ca2080f01ffc0a669ce7b5c2e8456e232aa7 100644 (file)
@@ -102,6 +102,33 @@ static int __tty_readb(struct file *f, unsigned char *buf)
        return f->f_op->read(f, p, 1, &f->f_pos);
 }
 
+static void tty_read_poll_wait(struct file *f, int timeout)
+{
+       struct poll_wqueues table;
+       struct timeval start, now;
+
+       do_gettimeofday(&start);
+       poll_initwait(&table);
+       while (1) {
+               long elapsed;
+               int mask;
+
+               mask = f->f_op->poll(f, &table.pt);
+               if (mask & (POLLRDNORM | POLLRDBAND | POLLIN |
+                           POLLHUP | POLLERR)) {
+                       break;
+               }
+               do_gettimeofday(&now);
+               elapsed = (1000000 * (now.tv_sec - start.tv_sec) +
+                         now.tv_usec - start.tv_usec);
+               if (elapsed > timeout)
+                       break;
+               set_current_state(TASK_INTERRUPTIBLE);
+               schedule_timeout(((timeout - elapsed) * HZ) / 10000);
+       }
+       poll_freewait(&table);
+}
+
 #if 0
 /*
  * On 2.6.26.3 this occaisonally gave me page faults, worked around by
@@ -132,31 +159,7 @@ static int tty_read(struct file *f, int timeout)
                oldfs = get_fs();
                set_fs(KERNEL_DS);
                if (f->f_op->poll) {
-                       struct poll_wqueues table;
-                       struct timeval start, now;
-
-                       do_gettimeofday(&start);
-                       poll_initwait(&table);
-                       while (1) {
-                               long elapsed;
-                               int mask;
-
-                               mask = f->f_op->poll(f, &table.pt);
-                               if (mask & (POLLRDNORM | POLLRDBAND | POLLIN |
-                                           POLLHUP | POLLERR)) {
-                                       break;
-                               }
-                               do_gettimeofday(&now);
-                               elapsed =
-                                   (1000000 * (now.tv_sec - start.tv_sec) +
-                                    now.tv_usec - start.tv_usec);
-                               if (elapsed > timeout)
-                                       break;
-                               set_current_state(TASK_INTERRUPTIBLE);
-                               schedule_timeout(((timeout -
-                                                  elapsed) * HZ) / 10000);
-                       }
-                       poll_freewait(&table);
+                       tty_read_poll_wait(f, timeout);
 
                        if (__tty_readb(f, &ch) == 1)
                                result = ch;