ipack/devices/ipoctal: add rx_enable flag
[firefly-linux-kernel-4.4.55.git] / drivers / ipack / devices / ipoctal.c
index 34fcfce0cdd9a8e8d7981dec284a573ae5a2be71..8666d2d05eef9ab30bfe8f62d5f28ac35e7cfe9e 100644 (file)
@@ -43,6 +43,7 @@ struct ipoctal_channel {
        unsigned int                    board_id;
        u8                              isr_rx_rdy_mask;
        u8                              isr_tx_rdy_mask;
+       unsigned int                    rx_enable;
 };
 
 struct ipoctal {
@@ -65,6 +66,7 @@ static int ipoctal_port_activate(struct tty_port *port, struct tty_struct *tty)
         * there is something to send
         */
        iowrite8(CR_ENABLE_RX, &channel->regs->w.cr);
+       channel->rx_enable = 1;
        return 0;
 }
 
@@ -309,6 +311,7 @@ static int ipoctal_inst_slot(struct ipoctal *ipoctal, unsigned int bus_nr,
                }
 
                iowrite8(CR_DISABLE_RX | CR_DISABLE_TX, &channel->regs->w.cr);
+               channel->rx_enable = 0;
                iowrite8(CR_CMD_RESET_RX, &channel->regs->w.cr);
                iowrite8(CR_CMD_RESET_TX, &channel->regs->w.cr);
                iowrite8(MR1_CHRL_8_BITS | MR1_ERROR_CHAR | MR1_RxINT_RxRDY,
@@ -430,6 +433,7 @@ static int ipoctal_write_tty(struct tty_struct *tty,
        /* As the IP-OCTAL 485 only supports half duplex, do it manually */
        if (channel->board_id == IPACK1_DEVICE_ID_SBS_OCTAL_485) {
                iowrite8(CR_DISABLE_RX, &channel->regs->w.cr);
+               channel->rx_enable = 0;
                iowrite8(CR_CMD_ASSERT_RTSN, &channel->regs->w.cr);
        }
 
@@ -589,8 +593,9 @@ static void ipoctal_set_termios(struct tty_struct *tty,
        iowrite8(mr2, &channel->regs->w.mr);
        iowrite8(csr, &channel->regs->w.csr);
 
-       /* Enable again the RX */
-       iowrite8(CR_ENABLE_RX, &channel->regs->w.cr);
+       /* Enable again the RX, if it was before */
+       if (channel->rx_enable)
+               iowrite8(CR_ENABLE_RX, &channel->regs->w.cr);
 }
 
 static void ipoctal_hangup(struct tty_struct *tty)
@@ -610,6 +615,7 @@ static void ipoctal_hangup(struct tty_struct *tty)
        tty_port_hangup(&channel->tty_port);
 
        iowrite8(CR_DISABLE_RX | CR_DISABLE_TX, &channel->regs->w.cr);
+       channel->rx_enable = 0;
        iowrite8(CR_CMD_RESET_RX, &channel->regs->w.cr);
        iowrite8(CR_CMD_RESET_TX, &channel->regs->w.cr);
        iowrite8(CR_CMD_RESET_ERR_STATUS, &channel->regs->w.cr);