提交 bdc04e31 编写于 作者: A Alan Cox 提交者: Live-CD User

serial: move delta_msr_wait into the tty_port

This is used by various drivers not just serial and can be extracted
as commonality
Signed-off-by: NAlan Cox <alan@linux.intel.com>
上级 a2bceae0
...@@ -729,7 +729,7 @@ static void cyy_chip_modem(struct cyclades_card *cinfo, int chip, ...@@ -729,7 +729,7 @@ static void cyy_chip_modem(struct cyclades_card *cinfo, int chip,
if (mdm_change & CyRI) if (mdm_change & CyRI)
info->icount.rng++; 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)) { if ((mdm_change & CyDCD) && (info->port.flags & ASYNC_CHECK_CD)) {
...@@ -1197,7 +1197,7 @@ static void cyz_handle_cmd(struct cyclades_card *cinfo) ...@@ -1197,7 +1197,7 @@ static void cyz_handle_cmd(struct cyclades_card *cinfo)
break; break;
} }
if (delta_count) if (delta_count)
wake_up_interruptible(&info->delta_msr_wait); wake_up_interruptible(&info->port.delta_msr_wait);
if (special_count) if (special_count)
tty_schedule_flip(tty); tty_schedule_flip(tty);
tty_kref_put(tty); tty_kref_put(tty);
...@@ -1464,7 +1464,7 @@ static void cy_shutdown(struct cyclades_port *info, struct tty_struct *tty) ...@@ -1464,7 +1464,7 @@ static void cy_shutdown(struct cyclades_port *info, struct tty_struct *tty)
spin_lock_irqsave(&card->card_lock, flags); spin_lock_irqsave(&card->card_lock, flags);
/* Clear delta_msr_wait queue to avoid mem leaks. */ /* 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) { if (info->port.xmit_buf) {
unsigned char *temp; unsigned char *temp;
...@@ -2788,7 +2788,7 @@ cy_ioctl(struct tty_struct *tty, struct file *file, ...@@ -2788,7 +2788,7 @@ cy_ioctl(struct tty_struct *tty, struct file *file,
/* note the counters on entry */ /* note the counters on entry */
cnow = info->icount; cnow = info->icount;
spin_unlock_irqrestore(&info->card->card_lock, flags); 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)); cy_cflags_changed(info, arg, &cnow));
break; break;
...@@ -3153,7 +3153,6 @@ static int __devinit cy_init_card(struct cyclades_card *cinfo) ...@@ -3153,7 +3153,6 @@ static int __devinit cy_init_card(struct cyclades_card *cinfo)
info->port.close_delay = 5 * HZ / 10; info->port.close_delay = 5 * HZ / 10;
info->port.flags = STD_COM_FLAGS; info->port.flags = STD_COM_FLAGS;
init_completion(&info->shutdown_wait); init_completion(&info->shutdown_wait);
init_waitqueue_head(&info->delta_msr_wait);
if (cy_is_Z(cinfo)) { if (cy_is_Z(cinfo)) {
struct FIRM_ID *firm_id = cinfo->base_addr + ID_ADDRESS; struct FIRM_ID *firm_id = cinfo->base_addr + ID_ADDRESS;
......
...@@ -572,7 +572,7 @@ static void check_modem_status(struct esp_struct *info) ...@@ -572,7 +572,7 @@ static void check_modem_status(struct esp_struct *info)
info->icount.dcd++; info->icount.dcd++;
if (status & UART_MSR_DCTS) if (status & UART_MSR_DCTS)
info->icount.cts++; info->icount.cts++;
wake_up_interruptible(&info->delta_msr_wait); wake_up_interruptible(&info->port.delta_msr_wait);
} }
if ((info->port.flags & ASYNC_CHECK_CD) && (status & UART_MSR_DDCD)) { if ((info->port.flags & ASYNC_CHECK_CD) && (status & UART_MSR_DDCD)) {
...@@ -927,7 +927,7 @@ static void shutdown(struct esp_struct *info) ...@@ -927,7 +927,7 @@ static void shutdown(struct esp_struct *info)
* clear delta_msr_wait queue to avoid mem leaks: we may free the irq * clear delta_msr_wait queue to avoid mem leaks: we may free the irq
* here so the queue might never be waken up * here so the queue might never be waken up
*/ */
wake_up_interruptible(&info->delta_msr_wait); wake_up_interruptible(&info->port.delta_msr_wait);
wake_up_interruptible(&info->break_wait); wake_up_interruptible(&info->break_wait);
/* stop a DMA transfer on the port being closed */ /* stop a DMA transfer on the port being closed */
...@@ -1800,7 +1800,7 @@ static int rs_ioctl(struct tty_struct *tty, struct file *file, ...@@ -1800,7 +1800,7 @@ static int rs_ioctl(struct tty_struct *tty, struct file *file,
spin_unlock_irqrestore(&info->lock, flags); spin_unlock_irqrestore(&info->lock, flags);
while (1) { while (1) {
/* FIXME: convert to new style wakeup */ /* FIXME: convert to new style wakeup */
interruptible_sleep_on(&info->delta_msr_wait); interruptible_sleep_on(&info->port.delta_msr_wait);
/* see if a signal did it */ /* see if a signal did it */
if (signal_pending(current)) if (signal_pending(current))
return -ERESTARTSYS; return -ERESTARTSYS;
...@@ -2452,7 +2452,6 @@ static int __init espserial_init(void) ...@@ -2452,7 +2452,6 @@ static int __init espserial_init(void)
info->config.flow_off = flow_off; info->config.flow_off = flow_off;
info->config.pio_threshold = pio_threshold; info->config.pio_threshold = pio_threshold;
info->next_port = ports; info->next_port = ports;
init_waitqueue_head(&info->delta_msr_wait);
init_waitqueue_head(&info->break_wait); init_waitqueue_head(&info->break_wait);
ports = info; ports = info;
printk(KERN_INFO "ttyP%d at 0x%04x (irq = %d) is an ESP ", printk(KERN_INFO "ttyP%d at 0x%04x (irq = %d) is an ESP ",
......
...@@ -258,7 +258,6 @@ struct mxser_port { ...@@ -258,7 +258,6 @@ struct mxser_port {
struct mxser_mon mon_data; struct mxser_mon mon_data;
spinlock_t slock; spinlock_t slock;
wait_queue_head_t delta_msr_wait;
}; };
struct mxser_board { struct mxser_board {
...@@ -818,7 +817,7 @@ static void mxser_check_modem_status(struct tty_struct *tty, ...@@ -818,7 +817,7 @@ static void mxser_check_modem_status(struct tty_struct *tty,
if (status & UART_MSR_DCTS) if (status & UART_MSR_DCTS)
port->icount.cts++; port->icount.cts++;
port->mon_data.modem_status = status; port->mon_data.modem_status = status;
wake_up_interruptible(&port->delta_msr_wait); wake_up_interruptible(&port->port.delta_msr_wait);
if ((port->port.flags & ASYNC_CHECK_CD) && (status & UART_MSR_DDCD)) { if ((port->port.flags & ASYNC_CHECK_CD) && (status & UART_MSR_DDCD)) {
if (status & UART_MSR_DCD) if (status & UART_MSR_DCD)
...@@ -973,7 +972,7 @@ static void mxser_shutdown(struct tty_struct *tty) ...@@ -973,7 +972,7 @@ static void mxser_shutdown(struct tty_struct *tty)
* clear delta_msr_wait queue to avoid mem leaks: we may free the irq * clear delta_msr_wait queue to avoid mem leaks: we may free the irq
* here so the queue might never be waken up * here so the queue might never be waken up
*/ */
wake_up_interruptible(&info->delta_msr_wait); wake_up_interruptible(&info->port.delta_msr_wait);
/* /*
* Free the IRQ, if necessary * Free the IRQ, if necessary
...@@ -1762,7 +1761,7 @@ static int mxser_ioctl(struct tty_struct *tty, struct file *file, ...@@ -1762,7 +1761,7 @@ static int mxser_ioctl(struct tty_struct *tty, struct file *file,
cnow = info->icount; /* note the counters on entry */ cnow = info->icount; /* note the counters on entry */
spin_unlock_irqrestore(&info->slock, flags); spin_unlock_irqrestore(&info->slock, flags);
return wait_event_interruptible(info->delta_msr_wait, return wait_event_interruptible(info->port.delta_msr_wait,
mxser_cflags_changed(info, arg, &cnow)); mxser_cflags_changed(info, arg, &cnow));
/* /*
* Get counter of input serial line interrupts (DCD,RI,DSR,CTS) * Get counter of input serial line interrupts (DCD,RI,DSR,CTS)
...@@ -2414,7 +2413,6 @@ static int __devinit mxser_initbrd(struct mxser_board *brd, ...@@ -2414,7 +2413,6 @@ static int __devinit mxser_initbrd(struct mxser_board *brd,
info->port.close_delay = 5 * HZ / 10; info->port.close_delay = 5 * HZ / 10;
info->port.closing_wait = 30 * HZ; info->port.closing_wait = 30 * HZ;
info->normal_termios = mxvar_sdriver->init_termios; info->normal_termios = mxvar_sdriver->init_termios;
init_waitqueue_head(&info->delta_msr_wait);
memset(&info->mon_data, 0, sizeof(struct mxser_mon)); memset(&info->mon_data, 0, sizeof(struct mxser_mon));
info->err_shadow = 0; info->err_shadow = 0;
spin_lock_init(&info->slock); spin_lock_init(&info->slock);
......
...@@ -23,6 +23,7 @@ void tty_port_init(struct tty_port *port) ...@@ -23,6 +23,7 @@ void tty_port_init(struct tty_port *port)
memset(port, 0, sizeof(*port)); memset(port, 0, sizeof(*port));
init_waitqueue_head(&port->open_wait); init_waitqueue_head(&port->open_wait);
init_waitqueue_head(&port->close_wait); init_waitqueue_head(&port->close_wait);
init_waitqueue_head(&port->delta_msr_wait);
mutex_init(&port->mutex); mutex_init(&port->mutex);
spin_lock_init(&port->lock); spin_lock_init(&port->lock);
port->close_delay = (50 * HZ) / 100; port->close_delay = (50 * HZ) / 100;
...@@ -124,6 +125,7 @@ void tty_port_hangup(struct tty_port *port) ...@@ -124,6 +125,7 @@ void tty_port_hangup(struct tty_port *port)
port->tty = NULL; port->tty = NULL;
spin_unlock_irqrestore(&port->lock, flags); spin_unlock_irqrestore(&port->lock, flags);
wake_up_interruptible(&port->open_wait); wake_up_interruptible(&port->open_wait);
wake_up_interruptible(&port->delta_msr_wait);
tty_port_shutdown(port); tty_port_shutdown(port);
} }
EXPORT_SYMBOL(tty_port_hangup); EXPORT_SYMBOL(tty_port_hangup);
......
...@@ -1510,7 +1510,7 @@ static unsigned int check_modem_status(struct uart_8250_port *up) ...@@ -1510,7 +1510,7 @@ static unsigned int check_modem_status(struct uart_8250_port *up)
if (status & UART_MSR_DCTS) if (status & UART_MSR_DCTS)
uart_handle_cts_change(&up->port, status & UART_MSR_CTS); uart_handle_cts_change(&up->port, status & UART_MSR_CTS);
wake_up_interruptible(&up->port.state->delta_msr_wait); wake_up_interruptible(&up->port.state->port.delta_msr_wait);
} }
return status; return status;
......
...@@ -225,7 +225,7 @@ static void pl010_modem_status(struct uart_amba_port *uap) ...@@ -225,7 +225,7 @@ static void pl010_modem_status(struct uart_amba_port *uap)
if (delta & UART01x_FR_CTS) if (delta & UART01x_FR_CTS)
uart_handle_cts_change(&uap->port, status & UART01x_FR_CTS); uart_handle_cts_change(&uap->port, status & UART01x_FR_CTS);
wake_up_interruptible(&uap->port.state->delta_msr_wait); wake_up_interruptible(&uap->port.state->port.delta_msr_wait);
} }
static irqreturn_t pl010_int(int irq, void *dev_id) static irqreturn_t pl010_int(int irq, void *dev_id)
......
...@@ -226,7 +226,7 @@ static void pl011_modem_status(struct uart_amba_port *uap) ...@@ -226,7 +226,7 @@ static void pl011_modem_status(struct uart_amba_port *uap)
if (delta & UART01x_FR_CTS) if (delta & UART01x_FR_CTS)
uart_handle_cts_change(&uap->port, status & UART01x_FR_CTS); uart_handle_cts_change(&uap->port, status & UART01x_FR_CTS);
wake_up_interruptible(&uap->port.state->delta_msr_wait); wake_up_interruptible(&uap->port.state->port.delta_msr_wait);
} }
static irqreturn_t pl011_int(int irq, void *dev_id) static irqreturn_t pl011_int(int irq, void *dev_id)
......
...@@ -776,7 +776,7 @@ static void atmel_tasklet_func(unsigned long data) ...@@ -776,7 +776,7 @@ static void atmel_tasklet_func(unsigned long data)
if (status_change & ATMEL_US_CTS) if (status_change & ATMEL_US_CTS)
uart_handle_cts_change(port, !(status & ATMEL_US_CTS)); uart_handle_cts_change(port, !(status & ATMEL_US_CTS));
wake_up_interruptible(&port->state->delta_msr_wait); wake_up_interruptible(&port->state->port.delta_msr_wait);
atmel_port->irq_status_prev = status; atmel_port->irq_status_prev = status;
} }
......
...@@ -695,7 +695,7 @@ static inline void check_modem_status(struct icom_port *icom_port) ...@@ -695,7 +695,7 @@ static inline void check_modem_status(struct icom_port *icom_port)
delta_status & ICOM_CTS); delta_status & ICOM_CTS);
wake_up_interruptible(&icom_port->uart_port.state-> wake_up_interruptible(&icom_port->uart_port.state->
delta_msr_wait); port.delta_msr_wait);
old_status = status; old_status = status;
} }
spin_unlock(&icom_port->uart_port.lock); spin_unlock(&icom_port->uart_port.lock);
......
...@@ -224,7 +224,7 @@ static void imx_mctrl_check(struct imx_port *sport) ...@@ -224,7 +224,7 @@ static void imx_mctrl_check(struct imx_port *sport)
if (changed & TIOCM_CTS) if (changed & TIOCM_CTS)
uart_handle_cts_change(&sport->port, status & TIOCM_CTS); uart_handle_cts_change(&sport->port, status & TIOCM_CTS);
wake_up_interruptible(&sport->port.state->delta_msr_wait); wake_up_interruptible(&sport->port.state->port.delta_msr_wait);
} }
/* /*
...@@ -388,7 +388,7 @@ static irqreturn_t imx_rtsint(int irq, void *dev_id) ...@@ -388,7 +388,7 @@ static irqreturn_t imx_rtsint(int irq, void *dev_id)
writel(USR1_RTSD, sport->port.membase + USR1); writel(USR1_RTSD, sport->port.membase + USR1);
uart_handle_cts_change(&sport->port, !!val); uart_handle_cts_change(&sport->port, !!val);
wake_up_interruptible(&sport->port.state->delta_msr_wait); wake_up_interruptible(&sport->port.state->port.delta_msr_wait);
spin_unlock_irqrestore(&sport->port.lock, flags); spin_unlock_irqrestore(&sport->port.lock, flags);
return IRQ_HANDLED; return IRQ_HANDLED;
......
...@@ -1287,7 +1287,7 @@ static inline int do_read(struct uart_port *the_port, char *buf, int len) ...@@ -1287,7 +1287,7 @@ static inline int do_read(struct uart_port *the_port, char *buf, int len)
(port->ip_port, 0); (port->ip_port, 0);
wake_up_interruptible wake_up_interruptible
(&the_port->state-> (&the_port->state->
delta_msr_wait); port.delta_msr_wait);
} }
/* If we had any data to return, we /* If we had any data to return, we
...@@ -1491,7 +1491,7 @@ ioc3uart_intr_one(struct ioc3_submodule *is, ...@@ -1491,7 +1491,7 @@ ioc3uart_intr_one(struct ioc3_submodule *is,
uart_handle_dcd_change(the_port, uart_handle_dcd_change(the_port,
shadow & SHADOW_DCD); shadow & SHADOW_DCD);
wake_up_interruptible wake_up_interruptible
(&the_port->state->delta_msr_wait); (&the_port->state->port.delta_msr_wait);
} else if ((port->ip_notify & N_DDCD) } else if ((port->ip_notify & N_DDCD)
&& !(shadow & SHADOW_DCD)) { && !(shadow & SHADOW_DCD)) {
/* Flag delta DCD/no DCD */ /* Flag delta DCD/no DCD */
...@@ -1511,7 +1511,7 @@ ioc3uart_intr_one(struct ioc3_submodule *is, ...@@ -1511,7 +1511,7 @@ ioc3uart_intr_one(struct ioc3_submodule *is,
uart_handle_cts_change(the_port, shadow uart_handle_cts_change(the_port, shadow
& SHADOW_CTS); & SHADOW_CTS);
wake_up_interruptible wake_up_interruptible
(&the_port->state->delta_msr_wait); (&the_port->state->port.delta_msr_wait);
} }
} }
...@@ -1728,7 +1728,7 @@ static void ic3_shutdown(struct uart_port *the_port) ...@@ -1728,7 +1728,7 @@ static void ic3_shutdown(struct uart_port *the_port)
return; return;
state = the_port->state; state = the_port->state;
wake_up_interruptible(&state->delta_msr_wait); wake_up_interruptible(&state->port.delta_msr_wait);
spin_lock_irqsave(&the_port->lock, port_flags); spin_lock_irqsave(&the_port->lock, port_flags);
set_notification(port, N_ALL, 0); set_notification(port, N_ALL, 0);
......
...@@ -1882,7 +1882,7 @@ static void handle_intr(void *arg, uint32_t sio_ir) ...@@ -1882,7 +1882,7 @@ static void handle_intr(void *arg, uint32_t sio_ir)
the_port = port->ip_port; the_port = port->ip_port;
the_port->icount.dcd = 1; the_port->icount.dcd = 1;
wake_up_interruptible wake_up_interruptible
(&the_port->state->delta_msr_wait); (&the_port->state->port.delta_msr_wait);
} else if ((port->ip_notify & N_DDCD) } else if ((port->ip_notify & N_DDCD)
&& !(shadow & IOC4_SHADOW_DCD)) { && !(shadow & IOC4_SHADOW_DCD)) {
/* Flag delta DCD/no DCD */ /* Flag delta DCD/no DCD */
...@@ -1904,7 +1904,7 @@ static void handle_intr(void *arg, uint32_t sio_ir) ...@@ -1904,7 +1904,7 @@ static void handle_intr(void *arg, uint32_t sio_ir)
the_port->icount.cts = the_port->icount.cts =
(shadow & IOC4_SHADOW_CTS) ? 1 : 0; (shadow & IOC4_SHADOW_CTS) ? 1 : 0;
wake_up_interruptible wake_up_interruptible
(&the_port->state->delta_msr_wait); (&the_port->state->port.delta_msr_wait);
} }
} }
...@@ -2237,7 +2237,7 @@ static inline int do_read(struct uart_port *the_port, unsigned char *buf, ...@@ -2237,7 +2237,7 @@ static inline int do_read(struct uart_port *the_port, unsigned char *buf,
the_port->icount.dcd = 0; the_port->icount.dcd = 0;
wake_up_interruptible wake_up_interruptible
(&the_port->state-> (&the_port->state->
delta_msr_wait); port.delta_msr_wait);
} }
/* If we had any data to return, we /* If we had any data to return, we
...@@ -2439,7 +2439,7 @@ static void ic4_shutdown(struct uart_port *the_port) ...@@ -2439,7 +2439,7 @@ static void ic4_shutdown(struct uart_port *the_port)
state = the_port->state; state = the_port->state;
port->ip_port = NULL; port->ip_port = NULL;
wake_up_interruptible(&state->delta_msr_wait); wake_up_interruptible(&state->port.delta_msr_wait);
if (state->port.tty) if (state->port.tty)
set_bit(TTY_IO_ERROR, &state->port.tty->flags); set_bit(TTY_IO_ERROR, &state->port.tty->flags);
......
...@@ -354,7 +354,7 @@ static void ip22zilog_status_handle(struct uart_ip22zilog_port *up, ...@@ -354,7 +354,7 @@ static void ip22zilog_status_handle(struct uart_ip22zilog_port *up,
uart_handle_cts_change(&up->port, uart_handle_cts_change(&up->port,
(status & CTS)); (status & CTS));
wake_up_interruptible(&up->port.state->delta_msr_wait); wake_up_interruptible(&up->port.state->port.delta_msr_wait);
} }
up->prev_status = status; up->prev_status = status;
......
...@@ -169,7 +169,7 @@ static void handle_delta_cts(struct uart_port *port) ...@@ -169,7 +169,7 @@ static void handle_delta_cts(struct uart_port *port)
{ {
msm_write(port, UART_CR_CMD_RESET_CTS, UART_CR); msm_write(port, UART_CR_CMD_RESET_CTS, UART_CR);
port->icount.cts++; port->icount.cts++;
wake_up_interruptible(&port->state->delta_msr_wait); wake_up_interruptible(&port->state->port.delta_msr_wait);
} }
static irqreturn_t msm_irq(int irq, void *dev_id) static irqreturn_t msm_irq(int irq, void *dev_id)
......
...@@ -369,7 +369,7 @@ static void pmz_status_handle(struct uart_pmac_port *uap) ...@@ -369,7 +369,7 @@ static void pmz_status_handle(struct uart_pmac_port *uap)
uart_handle_cts_change(&uap->port, uart_handle_cts_change(&uap->port,
!(status & CTS)); !(status & CTS));
wake_up_interruptible(&uap->port.state->delta_msr_wait); wake_up_interruptible(&uap->port.state->port.delta_msr_wait);
} }
if (status & BRK_ABRT) if (status & BRK_ABRT)
......
...@@ -100,7 +100,7 @@ static void pnx8xxx_mctrl_check(struct pnx8xxx_port *sport) ...@@ -100,7 +100,7 @@ static void pnx8xxx_mctrl_check(struct pnx8xxx_port *sport)
if (changed & TIOCM_CTS) if (changed & TIOCM_CTS)
uart_handle_cts_change(&sport->port, status & TIOCM_CTS); uart_handle_cts_change(&sport->port, status & TIOCM_CTS);
wake_up_interruptible(&sport->port.state->delta_msr_wait); wake_up_interruptible(&sport->port.state->port.delta_msr_wait);
} }
/* /*
......
...@@ -220,7 +220,7 @@ static inline void check_modem_status(struct uart_pxa_port *up) ...@@ -220,7 +220,7 @@ static inline void check_modem_status(struct uart_pxa_port *up)
if (status & UART_MSR_DCTS) if (status & UART_MSR_DCTS)
uart_handle_cts_change(&up->port, status & UART_MSR_CTS); uart_handle_cts_change(&up->port, status & UART_MSR_CTS);
wake_up_interruptible(&up->port.state->delta_msr_wait); wake_up_interruptible(&up->port.state->port.delta_msr_wait);
} }
/* /*
......
...@@ -117,7 +117,7 @@ static void sa1100_mctrl_check(struct sa1100_port *sport) ...@@ -117,7 +117,7 @@ static void sa1100_mctrl_check(struct sa1100_port *sport)
if (changed & TIOCM_CTS) if (changed & TIOCM_CTS)
uart_handle_cts_change(&sport->port, status & TIOCM_CTS); uart_handle_cts_change(&sport->port, status & TIOCM_CTS);
wake_up_interruptible(&sport->port.state->delta_msr_wait); wake_up_interruptible(&sport->port.state->port.delta_msr_wait);
} }
/* /*
......
...@@ -440,7 +440,7 @@ static void sbd_status_handle(struct sbd_port *sport) ...@@ -440,7 +440,7 @@ static void sbd_status_handle(struct sbd_port *sport)
if (delta & ((M_DUART_IN_PIN2_VAL | M_DUART_IN_PIN0_VAL) << if (delta & ((M_DUART_IN_PIN2_VAL | M_DUART_IN_PIN0_VAL) <<
S_DUART_IN_PIN_CHNG)) S_DUART_IN_PIN_CHNG))
wake_up_interruptible(&uport->state->delta_msr_wait); wake_up_interruptible(&uport->state->port.delta_msr_wait);
} }
static irqreturn_t sbd_interrupt(int irq, void *dev_id) static irqreturn_t sbd_interrupt(int irq, void *dev_id)
......
...@@ -215,7 +215,8 @@ static int uart_startup(struct uart_state *state, int init_hw) ...@@ -215,7 +215,8 @@ static int uart_startup(struct uart_state *state, int init_hw)
static void uart_shutdown(struct uart_state *state) static void uart_shutdown(struct uart_state *state)
{ {
struct uart_port *uport = state->uart_port; struct uart_port *uport = state->uart_port;
struct tty_struct *tty = state->port.tty; struct tty_port *port = &state->port;
struct tty_struct *tty = port->tty;
/* /*
* Set the TTY IO error marker * Set the TTY IO error marker
...@@ -223,7 +224,7 @@ static void uart_shutdown(struct uart_state *state) ...@@ -223,7 +224,7 @@ static void uart_shutdown(struct uart_state *state)
if (tty) if (tty)
set_bit(TTY_IO_ERROR, &tty->flags); set_bit(TTY_IO_ERROR, &tty->flags);
if (test_and_clear_bit(ASYNCB_INITIALIZED, &state->port.flags)) { if (test_and_clear_bit(ASYNCB_INITIALIZED, &port->flags)) {
/* /*
* Turn off DTR and RTS early. * Turn off DTR and RTS early.
*/ */
...@@ -237,7 +238,7 @@ static void uart_shutdown(struct uart_state *state) ...@@ -237,7 +238,7 @@ static void uart_shutdown(struct uart_state *state)
* any outstanding file descriptors should be pointing at * any outstanding file descriptors should be pointing at
* hung_up_tty_fops now. * hung_up_tty_fops now.
*/ */
wake_up_interruptible(&state->delta_msr_wait); wake_up_interruptible(&port->delta_msr_wait);
/* /*
* Free the IRQ and disable the port. * Free the IRQ and disable the port.
...@@ -1004,11 +1005,15 @@ static int uart_do_autoconfig(struct uart_state *state) ...@@ -1004,11 +1005,15 @@ static int uart_do_autoconfig(struct uart_state *state)
* - mask passed in arg for lines of interest * - mask passed in arg for lines of interest
* (use |'ed TIOCM_RNG/DSR/CD/CTS for masking) * (use |'ed TIOCM_RNG/DSR/CD/CTS for masking)
* Caller should use TIOCGICOUNT to see which one it was * Caller should use TIOCGICOUNT to see which one it was
*
* FIXME: This wants extracting into a common all driver implementation
* of TIOCMWAIT using tty_port.
*/ */
static int static int
uart_wait_modem_status(struct uart_state *state, unsigned long arg) uart_wait_modem_status(struct uart_state *state, unsigned long arg)
{ {
struct uart_port *uport = state->uart_port; struct uart_port *uport = state->uart_port;
struct tty_port *port = &state->port;
DECLARE_WAITQUEUE(wait, current); DECLARE_WAITQUEUE(wait, current);
struct uart_icount cprev, cnow; struct uart_icount cprev, cnow;
int ret; int ret;
...@@ -1025,7 +1030,7 @@ uart_wait_modem_status(struct uart_state *state, unsigned long arg) ...@@ -1025,7 +1030,7 @@ uart_wait_modem_status(struct uart_state *state, unsigned long arg)
uport->ops->enable_ms(uport); uport->ops->enable_ms(uport);
spin_unlock_irq(&uport->lock); spin_unlock_irq(&uport->lock);
add_wait_queue(&state->delta_msr_wait, &wait); add_wait_queue(&port->delta_msr_wait, &wait);
for (;;) { for (;;) {
spin_lock_irq(&uport->lock); spin_lock_irq(&uport->lock);
memcpy(&cnow, &uport->icount, sizeof(struct uart_icount)); memcpy(&cnow, &uport->icount, sizeof(struct uart_icount));
...@@ -1053,7 +1058,7 @@ uart_wait_modem_status(struct uart_state *state, unsigned long arg) ...@@ -1053,7 +1058,7 @@ uart_wait_modem_status(struct uart_state *state, unsigned long arg)
} }
current->state = TASK_RUNNING; current->state = TASK_RUNNING;
remove_wait_queue(&state->delta_msr_wait, &wait); remove_wait_queue(&port->delta_msr_wait, &wait);
return ret; return ret;
} }
...@@ -1430,7 +1435,7 @@ static void uart_hangup(struct tty_struct *tty) ...@@ -1430,7 +1435,7 @@ static void uart_hangup(struct tty_struct *tty)
clear_bit(ASYNCB_NORMAL_ACTIVE, &port->flags); clear_bit(ASYNCB_NORMAL_ACTIVE, &port->flags);
port->tty = NULL; port->tty = NULL;
wake_up_interruptible(&port->open_wait); wake_up_interruptible(&port->open_wait);
wake_up_interruptible(&state->delta_msr_wait); wake_up_interruptible(&port->delta_msr_wait);
} }
mutex_unlock(&port->mutex); mutex_unlock(&port->mutex);
} }
...@@ -2378,7 +2383,6 @@ int uart_register_driver(struct uart_driver *drv) ...@@ -2378,7 +2383,6 @@ int uart_register_driver(struct uart_driver *drv)
tty_port_init(port); tty_port_init(port);
port->close_delay = 500; /* .5 seconds */ port->close_delay = 500; /* .5 seconds */
port->closing_wait = 30000; /* 30 seconds */ port->closing_wait = 30000; /* 30 seconds */
init_waitqueue_head(&state->delta_msr_wait);
tasklet_init(&state->tlet, uart_tasklet_action, tasklet_init(&state->tlet, uart_tasklet_action,
(unsigned long)state); (unsigned long)state);
} }
......
...@@ -266,7 +266,7 @@ static irqreturn_t ks8695uart_modem_status(int irq, void *dev_id) ...@@ -266,7 +266,7 @@ static irqreturn_t ks8695uart_modem_status(int irq, void *dev_id)
if (status & URMS_URTERI) if (status & URMS_URTERI)
port->icount.rng++; port->icount.rng++;
wake_up_interruptible(&port->state->delta_msr_wait); wake_up_interruptible(&port->state->port.delta_msr_wait);
return IRQ_HANDLED; return IRQ_HANDLED;
} }
......
...@@ -241,7 +241,7 @@ static void lh7a40xuart_modem_status (struct uart_port* port) ...@@ -241,7 +241,7 @@ static void lh7a40xuart_modem_status (struct uart_port* port)
if (delta & CTS) if (delta & CTS)
uart_handle_cts_change (port, status & CTS); uart_handle_cts_change (port, status & CTS);
wake_up_interruptible (&port->state->delta_msr_wait); wake_up_interruptible (&port->state->port.delta_msr_wait);
} }
static irqreturn_t lh7a40xuart_int (int irq, void* dev_id) static irqreturn_t lh7a40xuart_int (int irq, void* dev_id)
......
...@@ -297,7 +297,7 @@ static void check_status(struct uart_sunsab_port *up, ...@@ -297,7 +297,7 @@ static void check_status(struct uart_sunsab_port *up,
up->port.icount.dsr++; up->port.icount.dsr++;
} }
wake_up_interruptible(&up->port.state->delta_msr_wait); wake_up_interruptible(&up->port.state->port.delta_msr_wait);
} }
static irqreturn_t sunsab_interrupt(int irq, void *dev_id) static irqreturn_t sunsab_interrupt(int irq, void *dev_id)
......
...@@ -441,7 +441,7 @@ static void check_modem_status(struct uart_sunsu_port *up) ...@@ -441,7 +441,7 @@ static void check_modem_status(struct uart_sunsu_port *up)
if (status & UART_MSR_DCTS) if (status & UART_MSR_DCTS)
uart_handle_cts_change(&up->port, status & UART_MSR_CTS); uart_handle_cts_change(&up->port, status & UART_MSR_CTS);
wake_up_interruptible(&up->port.state->delta_msr_wait); wake_up_interruptible(&up->port.state->port.delta_msr_wait);
} }
static irqreturn_t sunsu_serial_interrupt(int irq, void *dev_id) static irqreturn_t sunsu_serial_interrupt(int irq, void *dev_id)
......
...@@ -451,7 +451,7 @@ static void sunzilog_status_handle(struct uart_sunzilog_port *up, ...@@ -451,7 +451,7 @@ static void sunzilog_status_handle(struct uart_sunzilog_port *up,
uart_handle_cts_change(&up->port, uart_handle_cts_change(&up->port,
(status & CTS)); (status & CTS));
wake_up_interruptible(&up->port.state->delta_msr_wait); wake_up_interruptible(&up->port.state->port.delta_msr_wait);
} }
up->prev_status = status; up->prev_status = status;
......
...@@ -231,7 +231,7 @@ static void timbuart_mctrl_check(struct uart_port *port, u32 isr, u32 *ier) ...@@ -231,7 +231,7 @@ static void timbuart_mctrl_check(struct uart_port *port, u32 isr, u32 *ier)
iowrite32(CTS_DELTA, port->membase + TIMBUART_ISR); iowrite32(CTS_DELTA, port->membase + TIMBUART_ISR);
cts = timbuart_get_mctrl(port); cts = timbuart_get_mctrl(port);
uart_handle_cts_change(port, cts & TIOCM_CTS); uart_handle_cts_change(port, cts & TIOCM_CTS);
wake_up_interruptible(&port->state->delta_msr_wait); wake_up_interruptible(&port->state->port.delta_msr_wait);
} }
*ier |= CTS_DELTA; *ier |= CTS_DELTA;
......
...@@ -386,7 +386,7 @@ static inline void check_modem_status(struct uart_port *port) ...@@ -386,7 +386,7 @@ static inline void check_modem_status(struct uart_port *port)
if (msr & UART_MSR_DCTS) if (msr & UART_MSR_DCTS)
uart_handle_cts_change(port, msr & UART_MSR_CTS); uart_handle_cts_change(port, msr & UART_MSR_CTS);
wake_up_interruptible(&port->state->delta_msr_wait); wake_up_interruptible(&port->state->port.delta_msr_wait);
} }
static inline void transmit_chars(struct uart_port *port) static inline void transmit_chars(struct uart_port *port)
......
...@@ -686,7 +686,7 @@ static void zs_status_handle(struct zs_port *zport, struct zs_port *zport_a) ...@@ -686,7 +686,7 @@ static void zs_status_handle(struct zs_port *zport, struct zs_port *zport_a)
uport->icount.rng++; uport->icount.rng++;
if (delta) if (delta)
wake_up_interruptible(&uport->state->delta_msr_wait); wake_up_interruptible(&uport->state->port.delta_msr_wait);
spin_lock(&scc->zlock); spin_lock(&scc->zlock);
} }
......
...@@ -578,7 +578,6 @@ struct cyclades_port { ...@@ -578,7 +578,6 @@ struct cyclades_port {
struct cyclades_idle_stats idle_stats; struct cyclades_idle_stats idle_stats;
struct cyclades_icount icount; struct cyclades_icount icount;
struct completion shutdown_wait; struct completion shutdown_wait;
wait_queue_head_t delta_msr_wait;
int throttle; int throttle;
}; };
......
...@@ -96,7 +96,6 @@ struct esp_struct { ...@@ -96,7 +96,6 @@ struct esp_struct {
int xmit_head; int xmit_head;
int xmit_tail; int xmit_tail;
int xmit_cnt; int xmit_cnt;
wait_queue_head_t delta_msr_wait;
wait_queue_head_t break_wait; wait_queue_head_t break_wait;
struct async_icount icount; /* kernel counters for the 4 input interrupts */ struct async_icount icount; /* kernel counters for the 4 input interrupts */
struct hayes_esp_config config; /* port configuration */ struct hayes_esp_config config; /* port configuration */
......
...@@ -349,7 +349,6 @@ struct uart_state { ...@@ -349,7 +349,6 @@ struct uart_state {
struct circ_buf xmit; struct circ_buf xmit;
struct tasklet_struct tlet; struct tasklet_struct tlet;
wait_queue_head_t delta_msr_wait;
struct uart_port *uart_port; struct uart_port *uart_port;
}; };
......
...@@ -203,6 +203,7 @@ struct tty_port { ...@@ -203,6 +203,7 @@ struct tty_port {
int count; /* Usage count */ int count; /* Usage count */
wait_queue_head_t open_wait; /* Open waiters */ wait_queue_head_t open_wait; /* Open waiters */
wait_queue_head_t close_wait; /* Close waiters */ wait_queue_head_t close_wait; /* Close waiters */
wait_queue_head_t delta_msr_wait; /* Modem status change */
unsigned long flags; /* TTY flags ASY_*/ unsigned long flags; /* TTY flags ASY_*/
struct mutex mutex; /* Locking */ struct mutex mutex; /* Locking */
unsigned char *xmit_buf; /* Optional buffer */ unsigned char *xmit_buf; /* Optional buffer */
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册