[PATCH] rio (This time with patch)
Hi alan, This patches fixes several isues with the rio driver: - Implemented breaks - Fixed a DCD up/down crash - Added kmalloc return value check Sorry for the late moment we submit this: the DCD bug was very, very hard to find. Patrick diff -u -r linux-2.2.18-pre24.clean/drivers/char/rio/rio_linux.c linux-2.2.18-pre24.rio_break/drivers/char/rio/rio_linux.c --- linux-2.2.18-pre24.clean/drivers/char/rio/rio_linux.c Wed Nov 29 11:10:01 2000 +++ linux-2.2.18-pre24.rio_break/drivers/char/rio/rio_linux.c Fri Dec 1 09:33:23 +2000 @@ -165,7 +165,7 @@ /* startuptime */ HZ*2, /* how long to wait for card to run */ /* slowcook */0, /* TRUE -> always use line disc. */ /* intrpolltime */1, /* The frequency of OUR polls */ - /* breakinterval */ 25, /* x10 mS */ + /* breakinterval */ 25, /* x10 mS XXX: units seem to be 1ms not 10! +-- REW*/ /* timer */ 10, /* mS */ /* RtaLoadBase */ 0x7000, /* HostLoadBase */0x7C00, @@ -205,11 +205,8 @@ static INT rio_fw_release(struct inode *inode, struct file *filp); static int rio_init_drivers(void); - void my_hd (void *addr, int len); - - static struct tty_driver rio_driver, rio_callout_driver; static struct tty_driver rio_driver2, rio_callout_driver2; @@ -458,7 +455,6 @@ func_enter (); HostP = (struct Host*)ptr; /* >RIOHosts[(long)ptr]; */ - rio_dprintk (RIO_DEBUG_IFLOW, "rio: enter rio_interrupt (%d/%d)\n", irq, HostP->Ivec); @@ -519,7 +515,7 @@ RIOServiceHost(p, HostP, irq); - rio_dprintk ( RIO_DEBUG_IFLOW, "riointr() doing host %d type %d\n", + rio_dprintk ( RIO_DEBUG_IFLOW, "riointr() doing host %p type %d\n", (int) ptr, HostP->Type); clear_bit (RIO_BOARD_INTR_LOCK, >locks); @@ -627,8 +623,12 @@ /* Nothing special here... */ static void rio_shutdown_port (void * ptr) { + struct Port *PortP; + func_enter(); + PortP = (struct Port *)ptr; + PortP->gs.tty = NULL; #if 0 port->gs.flags &= ~ GS_ACTIVE; if (!port->gs.tty) { @@ -681,8 +681,14 @@ exit minicom. I expect an "oops". -- REW */ static void rio_hungup (void *ptr) { - func_enter (); + struct Port *PortP; + + func_enter(); + + PortP = (struct Port *)ptr; + PortP->gs.tty = NULL; rio_dec_mod_count (); + func_exit (); } @@ -706,9 +712,8 @@ PortP->gs.count = 0; } - + PortP->gs.tty = NULL; rio_dec_mod_count (); - func_exit (); } @@ -756,10 +761,36 @@ (ival ? CLOCAL : 0); } break; + case TIOCGSERIAL: if ((rc = verify_area(VERIFY_WRITE, (void *) arg, sizeof(struct serial_struct))) == 0) gs_getserial(>gs, (struct serial_struct *) arg); +break; + case TCSBRK: +if ( PortP->State & RIO_DELETED ) { + rio_dprintk (RIO_DEBUG_TTY, "BREAK on deleted RTA\n"); + rc = -EIO; +} else { + if (RIOShortCommand(p, PortP, SBREAK, 2, 250) == RIO_FAIL) { + rio_dprintk (RIO_DEBUG_INTR, "SBREAK RIOShortCommand failed\n"); + rc = -EIO; + } +} +break; + case TCSBRKP: +if ( PortP->State & RIO_DELETED ) { + rio_dprintk (RIO_DEBUG_TTY, "BREAK on deleted RTA\n"); + rc = -EIO; +} else { + int l; + l = arg?arg*100:250; + if (l > 255) l = 255; + if (RIOShortCommand(p, PortP, SBREAK, 2, arg?arg*100:250) == RIO_FAIL) { + rio_dprintk (RIO_DEBUG_INTR, "SBREAK RIOShortCommand failed\n"); + rc = -EIO; + } +} break; case TIOCSSERIAL: if ((rc = verify_area(VERIFY_READ, (void *) arg, diff -u -r linux-2.2.18-pre24.clean/drivers/char/rio/rio_linux.h linux-2.2.18-pre24.rio_break/drivers/char/rio/rio_linux.h --- linux-2.2.18-pre24.clean/drivers/char/rio/rio_linux.h Wed Nov 29 11:10:01 2000 +++ linux-2.2.18-pre24.rio_break/drivers/char/rio/rio_linux.h Fri Dec 1 09:59:56 +2000 @@ -165,7 +165,7 @@ #define rio_memcpy_fromio memcpy_fromio #endif -#define DEBUG +#define DEBUG 1 /* diff -u -r linux-2.2.18-pre24.clean/drivers/char/rio/riointr.c linux-2.2.18-pre24.rio_break/drivers/char/rio/riointr.c --- linux-2.2.18-pre24.clean/drivers/char/rio/riointr.c Thu Oct 19 15:27:27 2000 +++ linux-2.2.18-pre24.rio_break/drivers/char/rio/riointr.c Fri Dec 1 09:25:16 +2000 @@ -273,7 +273,7 @@ for ( host=0; hostRIONumHosts; host++ ) { struct Host *HostP = >RIOHosts[host]; - rio_dprintk (RIO_DEBUG_INTR, "riointr() doing host %d type %d\n", host, HostP->Type); + rio_dprintk (RIO_DEBUG_INTR, "riointr() doing host %p type %d\n", +host, HostP->Type); switch( HostP->Type ) { case RIO_AT: diff -u -r linux-2.2.18-pre24.clean/drivers/char/rio/riotty.c linux-2.2.18-pre24.rio_break/drivers/char/rio/riotty.c ---
[PATCH] rio (This time with patch)
Hi alan, This patches fixes several isues with the rio driver: - Implemented breaks - Fixed a DCD up/down crash - Added kmalloc return value check Sorry for the late moment we submit this: the DCD bug was very, very hard to find. Patrick diff -u -r linux-2.2.18-pre24.clean/drivers/char/rio/rio_linux.c linux-2.2.18-pre24.rio_break/drivers/char/rio/rio_linux.c --- linux-2.2.18-pre24.clean/drivers/char/rio/rio_linux.c Wed Nov 29 11:10:01 2000 +++ linux-2.2.18-pre24.rio_break/drivers/char/rio/rio_linux.c Fri Dec 1 09:33:23 +2000 @@ -165,7 +165,7 @@ /* startuptime */ HZ*2, /* how long to wait for card to run */ /* slowcook */0, /* TRUE - always use line disc. */ /* intrpolltime */1, /* The frequency of OUR polls */ - /* breakinterval */ 25, /* x10 mS */ + /* breakinterval */ 25, /* x10 mS XXX: units seem to be 1ms not 10! +-- REW*/ /* timer */ 10, /* mS */ /* RtaLoadBase */ 0x7000, /* HostLoadBase */0x7C00, @@ -205,11 +205,8 @@ static INT rio_fw_release(struct inode *inode, struct file *filp); static int rio_init_drivers(void); - void my_hd (void *addr, int len); - - static struct tty_driver rio_driver, rio_callout_driver; static struct tty_driver rio_driver2, rio_callout_driver2; @@ -458,7 +455,6 @@ func_enter (); HostP = (struct Host*)ptr; /* p-RIOHosts[(long)ptr]; */ - rio_dprintk (RIO_DEBUG_IFLOW, "rio: enter rio_interrupt (%d/%d)\n", irq, HostP-Ivec); @@ -519,7 +515,7 @@ RIOServiceHost(p, HostP, irq); - rio_dprintk ( RIO_DEBUG_IFLOW, "riointr() doing host %d type %d\n", + rio_dprintk ( RIO_DEBUG_IFLOW, "riointr() doing host %p type %d\n", (int) ptr, HostP-Type); clear_bit (RIO_BOARD_INTR_LOCK, HostP-locks); @@ -627,8 +623,12 @@ /* Nothing special here... */ static void rio_shutdown_port (void * ptr) { + struct Port *PortP; + func_enter(); + PortP = (struct Port *)ptr; + PortP-gs.tty = NULL; #if 0 port-gs.flags = ~ GS_ACTIVE; if (!port-gs.tty) { @@ -681,8 +681,14 @@ exit minicom. I expect an "oops". -- REW */ static void rio_hungup (void *ptr) { - func_enter (); + struct Port *PortP; + + func_enter(); + + PortP = (struct Port *)ptr; + PortP-gs.tty = NULL; rio_dec_mod_count (); + func_exit (); } @@ -706,9 +712,8 @@ PortP-gs.count = 0; } - + PortP-gs.tty = NULL; rio_dec_mod_count (); - func_exit (); } @@ -756,10 +761,36 @@ (ival ? CLOCAL : 0); } break; + case TIOCGSERIAL: if ((rc = verify_area(VERIFY_WRITE, (void *) arg, sizeof(struct serial_struct))) == 0) gs_getserial(PortP-gs, (struct serial_struct *) arg); +break; + case TCSBRK: +if ( PortP-State RIO_DELETED ) { + rio_dprintk (RIO_DEBUG_TTY, "BREAK on deleted RTA\n"); + rc = -EIO; +} else { + if (RIOShortCommand(p, PortP, SBREAK, 2, 250) == RIO_FAIL) { + rio_dprintk (RIO_DEBUG_INTR, "SBREAK RIOShortCommand failed\n"); + rc = -EIO; + } +} +break; + case TCSBRKP: +if ( PortP-State RIO_DELETED ) { + rio_dprintk (RIO_DEBUG_TTY, "BREAK on deleted RTA\n"); + rc = -EIO; +} else { + int l; + l = arg?arg*100:250; + if (l 255) l = 255; + if (RIOShortCommand(p, PortP, SBREAK, 2, arg?arg*100:250) == RIO_FAIL) { + rio_dprintk (RIO_DEBUG_INTR, "SBREAK RIOShortCommand failed\n"); + rc = -EIO; + } +} break; case TIOCSSERIAL: if ((rc = verify_area(VERIFY_READ, (void *) arg, diff -u -r linux-2.2.18-pre24.clean/drivers/char/rio/rio_linux.h linux-2.2.18-pre24.rio_break/drivers/char/rio/rio_linux.h --- linux-2.2.18-pre24.clean/drivers/char/rio/rio_linux.h Wed Nov 29 11:10:01 2000 +++ linux-2.2.18-pre24.rio_break/drivers/char/rio/rio_linux.h Fri Dec 1 09:59:56 +2000 @@ -165,7 +165,7 @@ #define rio_memcpy_fromio memcpy_fromio #endif -#define DEBUG +#define DEBUG 1 /* diff -u -r linux-2.2.18-pre24.clean/drivers/char/rio/riointr.c linux-2.2.18-pre24.rio_break/drivers/char/rio/riointr.c --- linux-2.2.18-pre24.clean/drivers/char/rio/riointr.c Thu Oct 19 15:27:27 2000 +++ linux-2.2.18-pre24.rio_break/drivers/char/rio/riointr.c Fri Dec 1 09:25:16 +2000 @@ -273,7 +273,7 @@ for ( host=0; hostp-RIONumHosts; host++ ) { struct Host *HostP = p-RIOHosts[host]; - rio_dprintk (RIO_DEBUG_INTR, "riointr() doing host %d type %d\n", host, HostP-Type); + rio_dprintk (RIO_DEBUG_INTR, "riointr() doing host %p type %d\n", +host, HostP-Type); switch( HostP-Type ) { case RIO_AT: diff -u -r linux-2.2.18-pre24.clean/drivers/char/rio/riotty.c linux-2.2.18-pre24.rio_break/drivers/char/rio/riotty.c ---