drivers/char/mxser.c, 2.4.23-pre5, fix TIOCSBRK/TIOCCBRK.
Subsystems (2)
PATCH 1/1 drivers/char/mxser.c, 2.4.23-pre5, fix TIOCSBRK/TIOCCBRK.
Problem:drivers/char/mxser.c doesn't handle TIOCSBRK/TIOCCBRK ioctls.
Fix: The patch below fixes TIOCSBRK/TIOCCBRK handling in 'mxser.c' by means of defining break_ctl routine for tty_driver thus lets upper-level tty driver handle all break related ioctls.
drivers/char/mxser.c +16 -29
@@ -29,11 +29,14 @@* * for : LINUX 2.0.X, 2.2.X, 2.4.X * date : 2001/05/01 -* version : 1.2 +* version : 1.2 * * Fixes for C104H/PCI by Tim Hockin <[email protected]> * Added support for: C102, CI-132, CI-134, CP-132, CP-114, CT-114 cards * by Damian Wrobel <[email protected]> +* 09/03: Use tty_driver.break_ctl for break control. This fixes handling +* of TIOCSBRK/TIOCCBRK by the driver. +* by Sergei Organov <[email protected]> * */
@@ -65,7 +68,7 @@#include <asm/bitops.h> #include <asm/uaccess.h> -#define MXSER_VERSION "1.2.1" +#define MXSER_VERSION "1.2.2"#define MXSERMAJOR 174#define MXSERCUMAJOR 175
@@ -368,7 +371,7 @@static int mxser_get_serial_info (struct mxser_struct *,struct serial_struct *);static int mxser_set_serial_info (struct mxser_struct *,struct serial_struct *);static int mxser_get_lsr_info (struct mxser_struct *,unsigned int *); -static void mxser_send_break (struct mxser_struct *,int ); +static void mxser_break_ctl (struct tty_struct *,int );static int mxser_get_modem_info (struct mxser_struct *,unsigned int *);static int mxser_set_modem_info (struct mxser_struct *,unsigned int ,unsigned int *);
@@ -556,6 +559,7 @@ mxvar_sdriver.stop = mxser_stop; mxvar_sdriver.start = mxser_start; mxvar_sdriver.hangup = mxser_hangup; + mxvar_sdriver.break_ctl = mxser_break_ctl;/* * The callout device is just like normal device except for
@@ -1061,7 +1065,6 @@ {unsigned long flags;struct mxser_struct *info = (struct mxser_struct *) tty->driver_data; -int retval;struct async_icount cprev, cnow;/* kernel counter temps */ struct serial_icounter_struct *p_cuser;/* user space */ unsigned long templ;
@@ -1074,21 +1077,6 @@return (-EIO ); }switch (cmd) { -case TCSBRK :/* SVID version: non-zero arg --> no break */ - retval =tty_check_change (tty); -if (retval) -return (retval); -tty_wait_until_sent (tty,0 ); -if (!arg) -mxser_send_break (info,HZ /4 );/* 1/4 second */ -return (0 ); -case TCSBRKP :/* support for POSIX tcsendbreak() */ - retval =tty_check_change (tty); -if (retval) -return (retval); -tty_wait_until_sent (tty,0 ); -mxser_send_break (info, arg ? arg * (HZ /10 ) :HZ /4 ); -return (0 );case TIOCGSOFTCAR :return put_user (C_CLOCAL (tty) ?1 :0 , (unsigned long *) arg);case TIOCSSOFTCAR :
@@ -2253,19 +2241,18 @@ }/* -* This routine sends a break character out the serial port. +* This routine turns the break condition on or off */ -static void mxser_send_break (struct mxser_struct *info,int duration) +static void mxser_break_ctl (struct tty_struct *tty,int break_state) { +struct mxser_struct *info = (struct mxser_struct *) tty->driver_data;unsigned long flags; -if (!info->base) -return ; -set_current_state (TASK_INTERRUPTIBLE ); -save_flags (flags); -cli (); -outb (inb (info->base +UART_LCR ) |UART_LCR_SBC , info->base +UART_LCR ); -schedule_timeout (duration); -outb (inb (info->base +UART_LCR ) & ~UART_LCR_SBC , info->base +UART_LCR ); + +save_flags (flags);cli (); +if (break_state ==-1 ) +outb (inb (info->base +UART_LCR ) |UART_LCR_SBC , info->base +UART_LCR ); +else +outb (inb (info->base +UART_LCR ) & ~UART_LCR_SBC , info->base +UART_LCR );restore_flags (flags); }