vserver 2.0 rc7
[linux-2.6.git] / drivers / macintosh / macserial.c
index 2ac2b91..0be3ac6 100644 (file)
@@ -32,6 +32,7 @@
 #include <linux/console.h>
 #endif
 #include <linux/slab.h>
+#include <linux/bitops.h>
 
 #include <asm/sections.h>
 #include <asm/io.h>
@@ -40,7 +41,6 @@
 #include <asm/prom.h>
 #include <asm/system.h>
 #include <asm/segment.h>
-#include <asm/bitops.h>
 #include <asm/machdep.h>
 #include <asm/pmac_feature.h>
 #include <linux/adb.h>
@@ -155,13 +155,9 @@ static void dbdma_flush(volatile struct dbdma_regs *dma);
 static irqreturn_t rs_txdma_irq(int irq, void *dev_id, struct pt_regs *regs);
 static irqreturn_t rs_rxdma_irq(int irq, void *dev_id, struct pt_regs *regs);
 static void dma_init(struct mac_serial * info);
-static void rxdma_start(struct mac_serial * info, int current);
+static void rxdma_start(struct mac_serial * info, int curr);
 static void rxdma_to_tty(struct mac_serial * info);
 
-#ifndef MIN
-#define MIN(a,b)       ((a) < (b) ? (a) : (b))
-#endif
-
 /*
  * tmp_buf is used as a temporary buffer by serial_write.  We need to
  * lock it in case the copy_from_user blocks while swapping in a page,
@@ -717,12 +713,8 @@ static void do_softint(void *private_)
        if (!tty)
                return;
 
-       if (test_and_clear_bit(RS_EVENT_WRITE_WAKEUP, &info->event)) {
-               if ((tty->flags & (1 << TTY_DO_WRITE_WAKEUP)) &&
-                   tty->ldisc.write_wakeup)
-                       (tty->ldisc.write_wakeup)(tty);
-               wake_up_interruptible(&tty->write_wait);
-       }
+       if (test_and_clear_bit(RS_EVENT_WRITE_WAKEUP, &info->event))
+               tty_wakeup(tty);
 }
 
 static int startup(struct mac_serial * info)
@@ -770,10 +762,10 @@ static int startup(struct mac_serial * info)
        return 0;
 }
 
-static _INLINE_ void rxdma_start(struct mac_serial * info, int current)
+static _INLINE_ void rxdma_start(struct mac_serial * info, int curr)
 {
        volatile struct dbdma_regs *rd = &info->rx->dma;
-       volatile struct dbdma_cmd *cd = info->rx_cmds[current];
+       volatile struct dbdma_cmd *cd = info->rx_cmds[curr];
 
 //printk(KERN_DEBUG "SCC: rxdma_start\n");
 
@@ -1469,7 +1461,7 @@ static void rs_flush_chars(struct tty_struct *tty)
        spin_unlock_irqrestore(&info->lock, flags);
 }
 
-static int rs_write(struct tty_struct * tty, int from_user,
+static int rs_write(struct tty_struct * tty,
                    const unsigned char *buf, int count)
 {
        int     c, ret = 0;
@@ -1482,53 +1474,22 @@ static int rs_write(struct tty_struct * tty, int from_user,
        if (!tty || !info->xmit_buf || !tmp_buf)
                return 0;
 
-       if (from_user) {
-               down(&tmp_buf_sem);
-               while (1) {
-                       c = MIN(count,
-                               MIN(SERIAL_XMIT_SIZE - info->xmit_cnt - 1,
-                                   SERIAL_XMIT_SIZE - info->xmit_head));
-                       if (c <= 0)
-                               break;
-
-                       c -= copy_from_user(tmp_buf, buf, c);
-                       if (!c) {
-                               if (!ret)
-                                       ret = -EFAULT;
-                               break;
-                       }
-                       spin_lock_irqsave(&info->lock, flags);
-                       c = MIN(c, MIN(SERIAL_XMIT_SIZE - info->xmit_cnt - 1,
-                                      SERIAL_XMIT_SIZE - info->xmit_head));
-                       memcpy(info->xmit_buf + info->xmit_head, tmp_buf, c);
-                       info->xmit_head = ((info->xmit_head + c) &
-                                          (SERIAL_XMIT_SIZE-1));
-                       info->xmit_cnt += c;
-                       spin_unlock_irqrestore(&info->lock, flags);
-                       buf += c;
-                       count -= c;
-                       ret += c;
-               }
-               up(&tmp_buf_sem);
-       } else {
-               while (1) {
-                       spin_lock_irqsave(&info->lock, flags);
-                       c = MIN(count,
-                               MIN(SERIAL_XMIT_SIZE - info->xmit_cnt - 1,
-                                   SERIAL_XMIT_SIZE - info->xmit_head));
-                       if (c <= 0) {
-                               spin_unlock_irqrestore(&info->lock, flags);
-                               break;
-                       }
-                       memcpy(info->xmit_buf + info->xmit_head, buf, c);
-                       info->xmit_head = ((info->xmit_head + c) &
-                                          (SERIAL_XMIT_SIZE-1));
-                       info->xmit_cnt += c;
+       while (1) {
+               spin_lock_irqsave(&info->lock, flags);
+               c = min_t(int, count, min(SERIAL_XMIT_SIZE - info->xmit_cnt - 1,
+                                         SERIAL_XMIT_SIZE - info->xmit_head));
+               if (c <= 0) {
                        spin_unlock_irqrestore(&info->lock, flags);
-                       buf += c;
-                       count -= c;
-                       ret += c;
+                       break;
                }
+               memcpy(info->xmit_buf + info->xmit_head, buf, c);
+               info->xmit_head = ((info->xmit_head + c) &
+                                  (SERIAL_XMIT_SIZE-1));
+               info->xmit_cnt += c;
+               spin_unlock_irqrestore(&info->lock, flags);
+               buf += c;
+               count -= c;
+               ret += c;
        }
        spin_lock_irqsave(&info->lock, flags);
        if (info->xmit_cnt && !tty->stopped && !info->tx_stopped
@@ -1570,10 +1531,7 @@ static void rs_flush_buffer(struct tty_struct *tty)
        spin_lock_irqsave(&info->lock, flags);
        info->xmit_cnt = info->xmit_head = info->xmit_tail = 0;
        spin_unlock_irqrestore(&info->lock, flags);
-       wake_up_interruptible(&tty->write_wait);
-       if ((tty->flags & (1 << TTY_DO_WRITE_WAKEUP)) &&
-           tty->ldisc.write_wakeup)
-               (tty->ldisc.write_wakeup)(tty);
+       tty_wakeup(tty);
 }
 
 /*
@@ -2000,16 +1958,14 @@ static void rs_close(struct tty_struct *tty, struct file * filp)
 
        if (tty->driver->flush_buffer)
                tty->driver->flush_buffer(tty);
-       if (tty->ldisc.flush_buffer)
-               tty->ldisc.flush_buffer(tty);
+       tty_ldisc_flush(tty);
        tty->closing = 0;
        info->event = 0;
        info->tty = 0;
 
        if (info->blocked_open) {
                if (info->close_delay) {
-                       current->state = TASK_INTERRUPTIBLE;
-                       schedule_timeout(info->close_delay);
+                       msleep_interruptible(jiffies_to_msecs(info->close_delay));
                }
                wake_up_interruptible(&info->open_wait);
        }
@@ -2052,10 +2008,9 @@ static void rs_wait_until_sent(struct tty_struct *tty, int timeout)
        } else if (char_time == 0)
                char_time = 1;
        if (timeout)
-               char_time = MIN(char_time, timeout);
+               char_time = min_t(unsigned long, char_time, timeout);
        while ((read_zsreg(info->zs_channel, 1) & ALL_SNT) == 0) {
-               current->state = TASK_INTERRUPTIBLE;
-               schedule_timeout(char_time);
+               msleep_interruptible(jiffies_to_msecs(char_time));
                if (signal_pending(current))
                        break;
                if (timeout && time_after(jiffies, orig_jiffies + timeout))