staging: dgap: re-factor some code for 80+ lines as reported by checkpatch
[firefly-linux-kernel-4.4.55.git] / drivers / staging / dgap / dgap.c
index 992c18d0ff29a33728ac52e5c4eaebd1b84e4423..160774b1bfd280866951e43c338cbf6e1d4a9345 100644 (file)
@@ -5567,6 +5567,33 @@ static void dgap_parity_scan(struct channel_t *ch, unsigned char *cbuf,
        *len = count;
 }
 
+static void dgap_write_wakeup(struct board_t *bd, struct channel_t *ch,
+                             struct un_t *un, u32 mask,
+                             unsigned long *irq_flags1,
+                             unsigned long *irq_flags2)
+{
+       if (!(un->un_flags & mask))
+               return;
+
+       un->un_flags &= ~mask;
+
+       if (!(un->un_flags & UN_ISOPEN))
+               return;
+
+       if ((un->un_tty->flags & (1 << TTY_DO_WRITE_WAKEUP)) &&
+           un->un_tty->ldisc->ops->write_wakeup) {
+               spin_unlock_irqrestore(&ch->ch_lock, *irq_flags2);
+               spin_unlock_irqrestore(&bd->bd_lock, *irq_flags1);
+
+               (un->un_tty->ldisc->ops->write_wakeup)(un->un_tty);
+
+               spin_lock_irqsave(&bd->bd_lock, *irq_flags1);
+               spin_lock_irqsave(&ch->ch_lock, *irq_flags2);
+       }
+       wake_up_interruptible(&un->un_tty->write_wait);
+       wake_up_interruptible(&un->un_flags_wait);
+}
+
 /*=======================================================================
  *
  *      dgap_event - FEP to host event processing routine.
@@ -5721,42 +5748,10 @@ static int dgap_event(struct board_t *bd)
                 * Process Transmit low.
                 */
                if (reason & IFTLW) {
-
-                       if (ch->ch_tun.un_flags & UN_LOW) {
-                               ch->ch_tun.un_flags &= ~UN_LOW;
-
-                               if (ch->ch_tun.un_flags & UN_ISOPEN) {
-                                       if ((ch->ch_tun.un_tty->flags &
-                                          (1 << TTY_DO_WRITE_WAKEUP)) &&
-                                               ch->ch_tun.un_tty->ldisc->ops->write_wakeup) {
-                                               DGAP_UNLOCK(ch->ch_lock, lock_flags2);
-                                               DGAP_UNLOCK(bd->bd_lock, lock_flags);
-                                               (ch->ch_tun.un_tty->ldisc->ops->write_wakeup)(ch->ch_tun.un_tty);
-                                               DGAP_LOCK(bd->bd_lock, lock_flags);
-                                               DGAP_LOCK(ch->ch_lock, lock_flags2);
-                                       }
-                                       wake_up_interruptible(&ch->ch_tun.un_tty->write_wait);
-                                       wake_up_interruptible(&ch->ch_tun.un_flags_wait);
-                               }
-                       }
-
-                       if (ch->ch_pun.un_flags & UN_LOW) {
-                               ch->ch_pun.un_flags &= ~UN_LOW;
-                               if (ch->ch_pun.un_flags & UN_ISOPEN) {
-                                       if ((ch->ch_pun.un_tty->flags &
-                                          (1 << TTY_DO_WRITE_WAKEUP)) &&
-                                               ch->ch_pun.un_tty->ldisc->ops->write_wakeup) {
-                                               DGAP_UNLOCK(ch->ch_lock, lock_flags2);
-                                               DGAP_UNLOCK(bd->bd_lock, lock_flags);
-                                               (ch->ch_pun.un_tty->ldisc->ops->write_wakeup)(ch->ch_pun.un_tty);
-                                               DGAP_LOCK(bd->bd_lock, lock_flags);
-                                               DGAP_LOCK(ch->ch_lock, lock_flags2);
-                                       }
-                                       wake_up_interruptible(&ch->ch_pun.un_tty->write_wait);
-                                       wake_up_interruptible(&ch->ch_pun.un_flags_wait);
-                               }
-                       }
-
+                       dgap_write_wakeup(bd, ch, &ch->ch_tun, UN_LOW,
+                                         &lock_flags, &lock_flags2);
+                       dgap_write_wakeup(bd, ch, &ch->ch_pun, UN_LOW,
+                                         &lock_flags, &lock_flags2);
                        if (ch->ch_flags & CH_WLOW) {
                                ch->ch_flags &= ~CH_WLOW;
                                wake_up_interruptible(&ch->ch_flags_wait);
@@ -5767,42 +5762,10 @@ static int dgap_event(struct board_t *bd)
                 * Process Transmit empty.
                 */
                if (reason & IFTEM) {
-                       if (ch->ch_tun.un_flags & UN_EMPTY) {
-                               ch->ch_tun.un_flags &= ~UN_EMPTY;
-                               if (ch->ch_tun.un_flags & UN_ISOPEN) {
-                                       if ((ch->ch_tun.un_tty->flags &
-                                          (1 << TTY_DO_WRITE_WAKEUP)) &&
-                                               ch->ch_tun.un_tty->ldisc->ops->write_wakeup) {
-                                               DGAP_UNLOCK(ch->ch_lock, lock_flags2);
-                                               DGAP_UNLOCK(bd->bd_lock, lock_flags);
-
-                                               (ch->ch_tun.un_tty->ldisc->ops->write_wakeup)(ch->ch_tun.un_tty);
-                                               DGAP_LOCK(bd->bd_lock, lock_flags);
-                                               DGAP_LOCK(ch->ch_lock, lock_flags2);
-                                       }
-                                       wake_up_interruptible(&ch->ch_tun.un_tty->write_wait);
-                                       wake_up_interruptible(&ch->ch_tun.un_flags_wait);
-                               }
-                       }
-
-                       if (ch->ch_pun.un_flags & UN_EMPTY) {
-                               ch->ch_pun.un_flags &= ~UN_EMPTY;
-                               if (ch->ch_pun.un_flags & UN_ISOPEN) {
-                                       if ((ch->ch_pun.un_tty->flags &
-                                          (1 << TTY_DO_WRITE_WAKEUP)) &&
-                                               ch->ch_pun.un_tty->ldisc->ops->write_wakeup) {
-                                               DGAP_UNLOCK(ch->ch_lock, lock_flags2);
-                                               DGAP_UNLOCK(bd->bd_lock, lock_flags);
-                                               (ch->ch_pun.un_tty->ldisc->ops->write_wakeup)(ch->ch_pun.un_tty);
-                                               DGAP_LOCK(bd->bd_lock, lock_flags);
-                                               DGAP_LOCK(ch->ch_lock, lock_flags2);
-                                       }
-                                       wake_up_interruptible(&ch->ch_pun.un_tty->write_wait);
-                                       wake_up_interruptible(&ch->ch_pun.un_flags_wait);
-                               }
-                       }
-
-
+                       dgap_write_wakeup(bd, ch, &ch->ch_tun, UN_EMPTY,
+                                         &lock_flags, &lock_flags2);
+                       dgap_write_wakeup(bd, ch, &ch->ch_pun, UN_EMPTY,
+                                         &lock_flags, &lock_flags2);
                        if (ch->ch_flags & CH_WEMPTY) {
                                ch->ch_flags &= ~CH_WEMPTY;
                                wake_up_interruptible(&ch->ch_flags_wait);