if (mdm_change & CyRI)
info->icount.rng++;
- wake_up_interruptible(&info->delta_msr_wait);
+ wake_up_interruptible(&info->port.delta_msr_wait);
}
if ((mdm_change & CyDCD) && (info->port.flags & ASYNC_CHECK_CD)) {
break;
}
if (delta_count)
- wake_up_interruptible(&info->delta_msr_wait);
+ wake_up_interruptible(&info->port.delta_msr_wait);
if (special_count)
tty_schedule_flip(tty);
tty_kref_put(tty);
spin_lock_irqsave(&card->card_lock, flags);
/* Clear delta_msr_wait queue to avoid mem leaks. */
- wake_up_interruptible(&info->delta_msr_wait);
+ wake_up_interruptible(&info->port.delta_msr_wait);
if (info->port.xmit_buf) {
unsigned char *temp;
} /* cy_flush_buffer */
-/*
- * This routine is called when a particular tty device is closed.
- */
-static void cy_close(struct tty_struct *tty, struct file *filp)
+static void cy_do_close(struct tty_port *port)
{
- struct cyclades_port *info = tty->driver_data;
+ struct cyclades_port *info = container_of(port, struct cyclades_port,
+ port);
struct cyclades_card *card;
unsigned long flags;
int channel;
- if (!info || serial_paranoia_check(info, tty->name, "cy_close"))
- return;
-
card = info->card;
-
- if (!tty_port_close_start(&info->port, tty, filp))
- return;
-
channel = info->line - card->first_line;
spin_lock_irqsave(&card->card_lock, flags);
/* Waiting for on-board buffers to be empty before
closing the port */
spin_unlock_irqrestore(&card->card_lock, flags);
- cy_wait_until_sent(tty, info->timeout);
+ cy_wait_until_sent(port->tty, info->timeout);
spin_lock_irqsave(&card->card_lock, flags);
}
} else {
}
#endif
}
-
spin_unlock_irqrestore(&card->card_lock, flags);
- cy_shutdown(info, tty);
- cy_flush_buffer(tty);
-
- tty_port_tty_set(&info->port, NULL);
+ cy_shutdown(info, port->tty);
+}
- tty_port_close_end(&info->port, tty);
+/*
+ * This routine is called when a particular tty device is closed.
+ */
+static void cy_close(struct tty_struct *tty, struct file *filp)
+{
+ struct cyclades_port *info = tty->driver_data;
+ if (!info || serial_paranoia_check(info, tty->name, "cy_close"))
+ return;
+ tty_port_close(&info->port, tty, filp);
} /* cy_close */
/* This routine gets called when tty_write has put something into
channel = info->line - card->first_line;
if (!cy_is_Z(card)) {
+ u32 cflags;
+
/* baud rate */
baud = tty_get_baud_rate(tty);
if (baud == 38400 && (info->port.flags & ASYNC_SPD_MASK) ==
(info->default_timeout ? info->default_timeout : 0x02));
/* 10ms rx timeout */
- if (C_CLOCAL(tty)) {
- /* without modem intr */
- cyy_writeb(info, CySRER,
- cyy_readb(info, CySRER) | CyMdmCh);
- /* act on 1->0 modem transitions */
- if ((cflag & CRTSCTS) && info->rflow) {
- cyy_writeb(info, CyMCOR1,
- (CyCTS | rflow_thr[i]));
- } else {
- cyy_writeb(info, CyMCOR1,
- CyCTS);
- }
- /* act on 0->1 modem transitions */
- cyy_writeb(info, CyMCOR2, CyCTS);
- } else {
- /* without modem intr */
- cyy_writeb(info, CySRER,
- cyy_readb(info, CySRER) | CyMdmCh);
- /* act on 1->0 modem transitions */
- if ((cflag & CRTSCTS) && info->rflow) {
- cyy_writeb(info, CyMCOR1,
- (CyDSR | CyCTS | CyRI | CyDCD |
- rflow_thr[i]));
- } else {
- cyy_writeb(info, CyMCOR1,
- CyDSR | CyCTS | CyRI | CyDCD);
- }
- /* act on 0->1 modem transitions */
- cyy_writeb(info, CyMCOR2,
- CyDSR | CyCTS | CyRI | CyDCD);
- }
+ cflags = CyCTS;
+ if (!C_CLOCAL(tty))
+ cflags |= CyDSR | CyRI | CyDCD;
+ /* without modem intr */
+ cyy_writeb(info, CySRER, cyy_readb(info, CySRER) | CyMdmCh);
+ /* act on 1->0 modem transitions */
+ if ((cflag & CRTSCTS) && info->rflow)
+ cyy_writeb(info, CyMCOR1, cflags | rflow_thr[i]);
+ else
+ cyy_writeb(info, CyMCOR1, cflags);
+ /* act on 0->1 modem transitions */
+ cyy_writeb(info, CyMCOR2, cflags);
if (i == 0) /* baud rate is zero, turn off line */
cyy_change_rts_dtr(info, 0, TIOCM_DTR);
/* note the counters on entry */
cnow = info->icount;
spin_unlock_irqrestore(&info->card->card_lock, flags);
- ret_val = wait_event_interruptible(info->delta_msr_wait,
+ ret_val = wait_event_interruptible(info->port.delta_msr_wait,
cy_cflags_changed(info, arg, &cnow));
break;
static const struct tty_port_operations cyy_port_ops = {
.carrier_raised = cyy_carrier_raised,
.dtr_rts = cyy_dtr_rts,
+ .shutdown = cy_do_close,
};
static const struct tty_port_operations cyz_port_ops = {
.carrier_raised = cyz_carrier_raised,
.dtr_rts = cyz_dtr_rts,
+ .shutdown = cy_do_close,
};
/*
info->port.close_delay = 5 * HZ / 10;
info->port.flags = STD_COM_FLAGS;
init_completion(&info->shutdown_wait);
- init_waitqueue_head(&info->delta_msr_wait);
if (cy_is_Z(cinfo)) {
struct FIRM_ID *firm_id = cinfo->base_addr + ID_ADDRESS;
continue;
}
#ifdef MODULE
- if (isparam && irq[i])
+ if (isparam && i < NR_CARDS && irq[i])
cy_isa_irq = irq[i];
else
#endif