diff options
Diffstat (limited to 'drivers/ipack/devices')
-rw-r--r-- | drivers/ipack/devices/ipoctal.c | 10 |
1 files changed, 8 insertions, 2 deletions
diff --git a/drivers/ipack/devices/ipoctal.c b/drivers/ipack/devices/ipoctal.c index 34fcfce0cdd9..8666d2d05eef 100644 --- a/drivers/ipack/devices/ipoctal.c +++ b/drivers/ipack/devices/ipoctal.c | |||
@@ -43,6 +43,7 @@ struct ipoctal_channel { | |||
43 | unsigned int board_id; | 43 | unsigned int board_id; |
44 | u8 isr_rx_rdy_mask; | 44 | u8 isr_rx_rdy_mask; |
45 | u8 isr_tx_rdy_mask; | 45 | u8 isr_tx_rdy_mask; |
46 | unsigned int rx_enable; | ||
46 | }; | 47 | }; |
47 | 48 | ||
48 | struct ipoctal { | 49 | struct ipoctal { |
@@ -65,6 +66,7 @@ static int ipoctal_port_activate(struct tty_port *port, struct tty_struct *tty) | |||
65 | * there is something to send | 66 | * there is something to send |
66 | */ | 67 | */ |
67 | iowrite8(CR_ENABLE_RX, &channel->regs->w.cr); | 68 | iowrite8(CR_ENABLE_RX, &channel->regs->w.cr); |
69 | channel->rx_enable = 1; | ||
68 | return 0; | 70 | return 0; |
69 | } | 71 | } |
70 | 72 | ||
@@ -309,6 +311,7 @@ static int ipoctal_inst_slot(struct ipoctal *ipoctal, unsigned int bus_nr, | |||
309 | } | 311 | } |
310 | 312 | ||
311 | iowrite8(CR_DISABLE_RX | CR_DISABLE_TX, &channel->regs->w.cr); | 313 | iowrite8(CR_DISABLE_RX | CR_DISABLE_TX, &channel->regs->w.cr); |
314 | channel->rx_enable = 0; | ||
312 | iowrite8(CR_CMD_RESET_RX, &channel->regs->w.cr); | 315 | iowrite8(CR_CMD_RESET_RX, &channel->regs->w.cr); |
313 | iowrite8(CR_CMD_RESET_TX, &channel->regs->w.cr); | 316 | iowrite8(CR_CMD_RESET_TX, &channel->regs->w.cr); |
314 | iowrite8(MR1_CHRL_8_BITS | MR1_ERROR_CHAR | MR1_RxINT_RxRDY, | 317 | iowrite8(MR1_CHRL_8_BITS | MR1_ERROR_CHAR | MR1_RxINT_RxRDY, |
@@ -430,6 +433,7 @@ static int ipoctal_write_tty(struct tty_struct *tty, | |||
430 | /* As the IP-OCTAL 485 only supports half duplex, do it manually */ | 433 | /* As the IP-OCTAL 485 only supports half duplex, do it manually */ |
431 | if (channel->board_id == IPACK1_DEVICE_ID_SBS_OCTAL_485) { | 434 | if (channel->board_id == IPACK1_DEVICE_ID_SBS_OCTAL_485) { |
432 | iowrite8(CR_DISABLE_RX, &channel->regs->w.cr); | 435 | iowrite8(CR_DISABLE_RX, &channel->regs->w.cr); |
436 | channel->rx_enable = 0; | ||
433 | iowrite8(CR_CMD_ASSERT_RTSN, &channel->regs->w.cr); | 437 | iowrite8(CR_CMD_ASSERT_RTSN, &channel->regs->w.cr); |
434 | } | 438 | } |
435 | 439 | ||
@@ -589,8 +593,9 @@ static void ipoctal_set_termios(struct tty_struct *tty, | |||
589 | iowrite8(mr2, &channel->regs->w.mr); | 593 | iowrite8(mr2, &channel->regs->w.mr); |
590 | iowrite8(csr, &channel->regs->w.csr); | 594 | iowrite8(csr, &channel->regs->w.csr); |
591 | 595 | ||
592 | /* Enable again the RX */ | 596 | /* Enable again the RX, if it was before */ |
593 | iowrite8(CR_ENABLE_RX, &channel->regs->w.cr); | 597 | if (channel->rx_enable) |
598 | iowrite8(CR_ENABLE_RX, &channel->regs->w.cr); | ||
594 | } | 599 | } |
595 | 600 | ||
596 | static void ipoctal_hangup(struct tty_struct *tty) | 601 | static void ipoctal_hangup(struct tty_struct *tty) |
@@ -610,6 +615,7 @@ static void ipoctal_hangup(struct tty_struct *tty) | |||
610 | tty_port_hangup(&channel->tty_port); | 615 | tty_port_hangup(&channel->tty_port); |
611 | 616 | ||
612 | iowrite8(CR_DISABLE_RX | CR_DISABLE_TX, &channel->regs->w.cr); | 617 | iowrite8(CR_DISABLE_RX | CR_DISABLE_TX, &channel->regs->w.cr); |
618 | channel->rx_enable = 0; | ||
613 | iowrite8(CR_CMD_RESET_RX, &channel->regs->w.cr); | 619 | iowrite8(CR_CMD_RESET_RX, &channel->regs->w.cr); |
614 | iowrite8(CR_CMD_RESET_TX, &channel->regs->w.cr); | 620 | iowrite8(CR_CMD_RESET_TX, &channel->regs->w.cr); |
615 | iowrite8(CR_CMD_RESET_ERR_STATUS, &channel->regs->w.cr); | 621 | iowrite8(CR_CMD_RESET_ERR_STATUS, &channel->regs->w.cr); |