Commit 04da6b90 authored by Alexander Viro's avatar Alexander Viro Committed by Linus Torvalds

[PATCH] callout removal: ip2

callout removal: ip2
parent 8c368f33
...@@ -92,8 +92,6 @@ typedef struct _i2ChanStr ...@@ -92,8 +92,6 @@ typedef struct _i2ChanStr
int throttled; // Set if upper layer can take no data int throttled; // Set if upper layer can take no data
int flags; // Defined in tty.h int flags; // Defined in tty.h
int session; // Defined in tty.h
int pgrp; // Defined in tty.h
PWAITQ open_wait; // Pointer for OS sleep function. PWAITQ open_wait; // Pointer for OS sleep function.
PWAITQ close_wait; // Pointer for OS sleep function. PWAITQ close_wait; // Pointer for OS sleep function.
...@@ -104,7 +102,6 @@ typedef struct _i2ChanStr ...@@ -104,7 +102,6 @@ typedef struct _i2ChanStr
wait_queue_head_t pBookmarkWait; // Used by i2DrainOutput wait_queue_head_t pBookmarkWait; // Used by i2DrainOutput
struct termios NormalTermios; struct termios NormalTermios;
struct termios CalloutTermios;
int BaudBase; int BaudBase;
int BaudDivisor; int BaudDivisor;
......
...@@ -194,7 +194,6 @@ ...@@ -194,7 +194,6 @@
#define ioremap(a,b) vremap((a),(b)) #define ioremap(a,b) vremap((a),(b))
#define iounmap(a) vfree((a)) #define iounmap(a) vfree((a))
#define SERIAL_TYPE_NORMAL 1 #define SERIAL_TYPE_NORMAL 1
#define SERIAL_TYPE_CALLOUT 2
#define schedule_timeout(a){current->timeout = jiffies + (a); schedule();} #define schedule_timeout(a){current->timeout = jiffies + (a); schedule();}
#define signal_pending(a) ((a)->signal & ~(a)->blocked) #define signal_pending(a) ((a)->signal & ~(a)->blocked)
#define in_interrupt() intr_count #define in_interrupt() intr_count
...@@ -232,16 +231,13 @@ static char *pcVersion = "1.2.14"; ...@@ -232,16 +231,13 @@ static char *pcVersion = "1.2.14";
static char *pcDriver_name = "ip2"; static char *pcDriver_name = "ip2";
#ifdef CONFIG_DEVFS_FS #ifdef CONFIG_DEVFS_FS
static char *pcTty = "tts/F%d"; static char *pcTty = "tts/F%d";
static char *pcCallout = "cua/F%d";
#else #else
static char *pcTty = "ttyF"; static char *pcTty = "ttyF";
static char *pcCallout = "cuf";
#endif #endif
static char *pcIpl = "ip2ipl"; static char *pcIpl = "ip2ipl";
/* Serial subtype definitions */ /* Serial subtype definitions */
#define SERIAL_TYPE_NORMAL 1 #define SERIAL_TYPE_NORMAL 1
#define SERIAL_TYPE_CALLOUT 2
// cheezy kludge or genius - you decide? // cheezy kludge or genius - you decide?
int ip2_loadmain(int *, int *, unsigned char *, int); int ip2_loadmain(int *, int *, unsigned char *, int);
...@@ -307,7 +303,6 @@ static unsigned short find_eisa_board(int); ...@@ -307,7 +303,6 @@ static unsigned short find_eisa_board(int);
/***************/ /***************/
static struct tty_driver ip2_tty_driver; static struct tty_driver ip2_tty_driver;
static struct tty_driver ip2_callout_driver;
static int ref_count; static int ref_count;
...@@ -523,9 +518,6 @@ cleanup_module(void) ...@@ -523,9 +518,6 @@ cleanup_module(void)
if ( ( err = tty_unregister_driver ( &ip2_tty_driver ) ) ) { if ( ( err = tty_unregister_driver ( &ip2_tty_driver ) ) ) {
printk(KERN_ERR "IP2: failed to unregister tty driver (%d)\n", err); printk(KERN_ERR "IP2: failed to unregister tty driver (%d)\n", err);
} }
if ( ( err = tty_unregister_driver ( &ip2_callout_driver ) ) ) {
printk(KERN_ERR "IP2: failed to unregister callout driver (%d)\n", err);
}
if ( ( err = unregister_chrdev ( IP2_IPL_MAJOR, pcIpl ) ) ) { if ( ( err = unregister_chrdev ( IP2_IPL_MAJOR, pcIpl ) ) ) {
printk(KERN_ERR "IP2: failed to unregister IPL driver (%d)\n", err); printk(KERN_ERR "IP2: failed to unregister IPL driver (%d)\n", err);
} }
...@@ -834,27 +826,12 @@ ip2_loadmain(int *iop, int *irqp, unsigned char *firmware, int firmsize) ...@@ -834,27 +826,12 @@ ip2_loadmain(int *iop, int *irqp, unsigned char *firmware, int firmsize)
ip2_tty_driver.start = ip2_start; ip2_tty_driver.start = ip2_start;
ip2_tty_driver.hangup = ip2_hangup; ip2_tty_driver.hangup = ip2_hangup;
/* Initialise the callout driver structure from the tty driver, and
* make the needed adjustments.
*/
ip2_callout_driver = ip2_tty_driver;
ip2_callout_driver.name = pcCallout;
#if LINUX_VERSION_CODE > KERNEL_VERSION(2,1,0)
ip2_callout_driver.driver_name = pcDriver_name;
ip2_callout_driver.read_proc = NULL;
#endif
ip2_callout_driver.major = IP2_CALLOUT_MAJOR;
ip2_callout_driver.subtype = SERIAL_TYPE_CALLOUT;
ip2trace (ITRC_NO_PORT, ITRC_INIT, 3, 0 ); ip2trace (ITRC_NO_PORT, ITRC_INIT, 3, 0 );
/* Register the tty devices. */ /* Register the tty devices. */
if ( ( err = tty_register_driver ( &ip2_tty_driver ) ) ) { if ( ( err = tty_register_driver ( &ip2_tty_driver ) ) ) {
printk(KERN_ERR "IP2: failed to register tty driver (%d)\n", err); printk(KERN_ERR "IP2: failed to register tty driver (%d)\n", err);
} else } else
if ( ( err = tty_register_driver ( &ip2_callout_driver ) ) ) {
printk(KERN_ERR "IP2: failed to register callout driver (%d)\n", err);
} else
/* Register the IPL driver. */ /* Register the IPL driver. */
if ( ( err = register_chrdev ( IP2_IPL_MAJOR, pcIpl, &ip2_ipl ) ) ) { if ( ( err = register_chrdev ( IP2_IPL_MAJOR, pcIpl, &ip2_ipl ) ) ) {
printk(KERN_ERR "IP2: failed to register IPL device (%d)\n", err ); printk(KERN_ERR "IP2: failed to register IPL device (%d)\n", err );
...@@ -893,9 +870,6 @@ ip2_loadmain(int *iop, int *irqp, unsigned char *firmware, int firmsize) ...@@ -893,9 +870,6 @@ ip2_loadmain(int *iop, int *irqp, unsigned char *firmware, int firmsize)
tty_register_device(&ip2_tty_driver, tty_register_device(&ip2_tty_driver,
j + ABS_BIGGEST_BOX * j + ABS_BIGGEST_BOX *
(box+i*ABS_MAX_BOXES), NULL); (box+i*ABS_MAX_BOXES), NULL);
tty_register_device(&ip2_callout_driver,
j + ABS_BIGGEST_BOX *
(box+i*ABS_MAX_BOXES), NULL);
} }
} }
} }
...@@ -1497,7 +1471,7 @@ static void do_status(void *p) ...@@ -1497,7 +1471,7 @@ static void do_status(void *p)
if ( pCh->wopen ) { if ( pCh->wopen ) {
wake_up_interruptible ( &pCh->open_wait ); wake_up_interruptible ( &pCh->open_wait );
} }
} else if ( !(pCh->flags & ASYNC_CALLOUT_ACTIVE) ) { } else {
if (pCh->pTTY && (!(pCh->pTTY->termios->c_cflag & CLOCAL)) ) { if (pCh->pTTY && (!(pCh->pTTY->termios->c_cflag & CLOCAL)) ) {
tty_hangup( pCh->pTTY ); tty_hangup( pCh->pTTY );
} }
...@@ -1602,36 +1576,10 @@ ip2_open( PTTY tty, struct file *pFile ) ...@@ -1602,36 +1576,10 @@ ip2_open( PTTY tty, struct file *pFile )
set_current_state( TASK_RUNNING ); set_current_state( TASK_RUNNING );
remove_wait_queue(&pCh->close_wait, &wait); remove_wait_queue(&pCh->close_wait, &wait);
/*
* 2. If this is a callout device, make sure the normal port is not in
* use, and that someone else doesn't have the callout device locked.
* (These are the only tests the standard serial driver makes for
* callout devices.)
*/
if ( tty->driver->subtype == SERIAL_TYPE_CALLOUT ) {
if ( pCh->flags & ASYNC_NORMAL_ACTIVE ) {
return -EBUSY;
}
if ( ( pCh->flags & ASYNC_CALLOUT_ACTIVE ) &&
( pCh->flags & ASYNC_SESSION_LOCKOUT ) &&
( pCh->session != current->session ) ) {
return -EBUSY;
}
if ( ( pCh->flags & ASYNC_CALLOUT_ACTIVE ) &&
( pCh->flags & ASYNC_PGRP_LOCKOUT ) &&
( pCh->pgrp != current->pgrp ) ) {
return -EBUSY;
}
pCh->flags |= ASYNC_CALLOUT_ACTIVE;
goto noblock;
}
/* /*
* 3. Handle a non-blocking open of a normal port. * 3. Handle a non-blocking open of a normal port.
*/ */
if ( (pFile->f_flags & O_NONBLOCK) || (tty->flags & (1<<TTY_IO_ERROR) )) { if ( (pFile->f_flags & O_NONBLOCK) || (tty->flags & (1<<TTY_IO_ERROR) )) {
if ( pCh->flags & ASYNC_CALLOUT_ACTIVE ) {
return -EBUSY;
}
pCh->flags |= ASYNC_NORMAL_ACTIVE; pCh->flags |= ASYNC_NORMAL_ACTIVE;
goto noblock; goto noblock;
} }
...@@ -1639,15 +1587,8 @@ ip2_open( PTTY tty, struct file *pFile ) ...@@ -1639,15 +1587,8 @@ ip2_open( PTTY tty, struct file *pFile )
* 4. Now loop waiting for the port to be free and carrier present * 4. Now loop waiting for the port to be free and carrier present
* (if required). * (if required).
*/ */
if ( pCh->flags & ASYNC_CALLOUT_ACTIVE ) { if ( tty->termios->c_cflag & CLOCAL )
if ( pCh->NormalTermios.c_cflag & CLOCAL ) { do_clocal = 1;
do_clocal = 1;
}
} else {
if ( tty->termios->c_cflag & CLOCAL ) {
do_clocal = 1;
}
}
#ifdef IP2DEBUG_OPEN #ifdef IP2DEBUG_OPEN
printk(KERN_DEBUG "OpenBlock: do_clocal = %d\n", do_clocal); printk(KERN_DEBUG "OpenBlock: do_clocal = %d\n", do_clocal);
...@@ -1659,32 +1600,27 @@ ip2_open( PTTY tty, struct file *pFile ) ...@@ -1659,32 +1600,27 @@ ip2_open( PTTY tty, struct file *pFile )
add_wait_queue(&pCh->open_wait, &wait); add_wait_queue(&pCh->open_wait, &wait);
for(;;) { for(;;) {
if ( !(pCh->flags & ASYNC_CALLOUT_ACTIVE)) { i2QueueCommands(PTYPE_INLINE, pCh, 100, 2, CMD_DTRUP, CMD_RTSUP);
i2QueueCommands(PTYPE_INLINE, pCh, 100, 2, CMD_DTRUP, CMD_RTSUP); pCh->dataSetOut |= (I2_DTR | I2_RTS);
pCh->dataSetOut |= (I2_DTR | I2_RTS); set_current_state( TASK_INTERRUPTIBLE );
set_current_state( TASK_INTERRUPTIBLE ); serviceOutgoingFifo( pCh->pMyBord );
serviceOutgoingFifo( pCh->pMyBord );
}
if ( tty_hung_up_p(pFile) ) { if ( tty_hung_up_p(pFile) ) {
set_current_state( TASK_RUNNING ); set_current_state( TASK_RUNNING );
remove_wait_queue(&pCh->open_wait, &wait); remove_wait_queue(&pCh->open_wait, &wait);
return ( pCh->flags & ASYNC_HUP_NOTIFY ) ? -EBUSY : -ERESTARTSYS; return ( pCh->flags & ASYNC_HUP_NOTIFY ) ? -EBUSY : -ERESTARTSYS;
} }
if ( !(pCh->flags & ASYNC_CALLOUT_ACTIVE) && if (!(pCh->flags & ASYNC_CLOSING) &&
!(pCh->flags & ASYNC_CLOSING) &&
(do_clocal || (pCh->dataSetIn & I2_DCD) )) { (do_clocal || (pCh->dataSetIn & I2_DCD) )) {
rc = 0; rc = 0;
break; break;
} }
#ifdef IP2DEBUG_OPEN #ifdef IP2DEBUG_OPEN
printk(KERN_DEBUG "ASYNC_CALLOUT_ACTIVE = %s\n",
(pCh->flags & ASYNC_CALLOUT_ACTIVE)?"True":"False");
printk(KERN_DEBUG "ASYNC_CLOSING = %s\n", printk(KERN_DEBUG "ASYNC_CLOSING = %s\n",
(pCh->flags & ASYNC_CLOSING)?"True":"False"); (pCh->flags & ASYNC_CLOSING)?"True":"False");
printk(KERN_DEBUG "OpenBlock: waiting for CD or signal\n"); printk(KERN_DEBUG "OpenBlock: waiting for CD or signal\n");
#endif #endif
ip2trace (CHANN, ITRC_OPEN, 3, 2, (pCh->flags & ASYNC_CALLOUT_ACTIVE), ip2trace (CHANN, ITRC_OPEN, 3, 2, 0,
(pCh->flags & ASYNC_CLOSING) ); (pCh->flags & ASYNC_CLOSING) );
/* check for signal */ /* check for signal */
if (signal_pending(current)) { if (signal_pending(current)) {
...@@ -1711,20 +1647,12 @@ ip2_open( PTTY tty, struct file *pFile ) ...@@ -1711,20 +1647,12 @@ ip2_open( PTTY tty, struct file *pFile )
if ( tty->count == 1 ) { if ( tty->count == 1 ) {
i2QueueCommands(PTYPE_INLINE, pCh, 0, 2, CMD_CTSFL_DSAB, CMD_RTSFL_DSAB); i2QueueCommands(PTYPE_INLINE, pCh, 0, 2, CMD_CTSFL_DSAB, CMD_RTSFL_DSAB);
if ( pCh->flags & ASYNC_SPLIT_TERMIOS ) { if ( pCh->flags & ASYNC_SPLIT_TERMIOS ) {
if ( tty->driver->subtype == SERIAL_TYPE_NORMAL ) { *tty->termios = pCh->NormalTermios;
*tty->termios = pCh->NormalTermios;
} else {
*tty->termios = pCh->CalloutTermios;
}
} }
/* Now we must send the termios settings to the loadware */ /* Now we must send the termios settings to the loadware */
set_params( pCh, NULL ); set_params( pCh, NULL );
} }
/* override previous and never reset ??? */
pCh->session = current->session;
pCh->pgrp = current->pgrp;
/* /*
* Now set any i2lib options. These may go away if the i2lib code ends * Now set any i2lib options. These may go away if the i2lib code ends
* up rolled into the mainline. * up rolled into the mainline.
...@@ -1786,8 +1714,6 @@ ip2_close( PTTY tty, struct file *pFile ) ...@@ -1786,8 +1714,6 @@ ip2_close( PTTY tty, struct file *pFile )
*/ */
if (pCh->flags & ASYNC_NORMAL_ACTIVE) if (pCh->flags & ASYNC_NORMAL_ACTIVE)
pCh->NormalTermios = *tty->termios; pCh->NormalTermios = *tty->termios;
if (pCh->flags & ASYNC_CALLOUT_ACTIVE)
pCh->CalloutTermios = *tty->termios;
tty->closing = 1; tty->closing = 1;
...@@ -1833,7 +1759,7 @@ ip2_close( PTTY tty, struct file *pFile ) ...@@ -1833,7 +1759,7 @@ ip2_close( PTTY tty, struct file *pFile )
wake_up_interruptible(&pCh->open_wait); wake_up_interruptible(&pCh->open_wait);
} }
pCh->flags &=~(ASYNC_NORMAL_ACTIVE|ASYNC_CALLOUT_ACTIVE|ASYNC_CLOSING); pCh->flags &=~(ASYNC_NORMAL_ACTIVE|ASYNC_CLOSING);
wake_up_interruptible(&pCh->close_wait); wake_up_interruptible(&pCh->close_wait);
#ifdef IP2DEBUG_OPEN #ifdef IP2DEBUG_OPEN
...@@ -1883,7 +1809,7 @@ ip2_hangup ( PTTY tty ) ...@@ -1883,7 +1809,7 @@ ip2_hangup ( PTTY tty )
wake_up_interruptible ( &pCh->delta_msr_wait ); wake_up_interruptible ( &pCh->delta_msr_wait );
pCh->flags &= ~(ASYNC_NORMAL_ACTIVE|ASYNC_CALLOUT_ACTIVE); pCh->flags &= ~ASYNC_NORMAL_ACTIVE;
pCh->pTTY = NULL; pCh->pTTY = NULL;
wake_up_interruptible ( &pCh->open_wait ); wake_up_interruptible ( &pCh->open_wait );
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment