[PATCH 10/13] pcxx: remove cli()/sti() in drivers/char/pcxx.c

From: James Nelson
Date: Sun Jan 16 2005 - 09:13:28 EST


Signed-off-by: James Nelson <james4765@xxxxxxxxx>

diff -urN --exclude='*~' linux-2.6.11-rc1-mm1-original/drivers/char/pcxx.c linux-2.6.11-rc1-mm1/drivers/char/pcxx.c
--- linux-2.6.11-rc1-mm1-original/drivers/char/pcxx.c 2004-12-24 16:35:00.000000000 -0500
+++ linux-2.6.11-rc1-mm1/drivers/char/pcxx.c 2005-01-16 07:32:19.508528433 -0500
@@ -209,8 +209,7 @@

printk(KERN_NOTICE "Unloading PC/Xx version %s\n", VERSION);

- save_flags(flags);
- cli();
+ local_irq_save(flags);
del_timer_sync(&pcxx_timer);

if ((e1 = tty_unregister_driver(pcxe_driver)))
@@ -219,7 +218,7 @@
put_tty_driver(pcxe_driver);
cleanup_board_resources();
kfree(digi_channels);
- restore_flags(flags);
+ local_irq_restore(flags);
}

static inline struct channel *chan(register struct tty_struct *tty)
@@ -323,12 +322,12 @@
info->blocked_open++;

for (;;) {
- cli();
+ local_irq_disable();
globalwinon(info);
info->omodem |= DTR|RTS;
fepcmd(info, SETMODEM, DTR|RTS, 0, 10, 1);
memoff(info);
- sti();
+ local_irq_enable();
set_current_state(TASK_INTERRUPTIBLE);
if(tty_hung_up_p(filp) || (info->asyncflags & ASYNC_INITIALIZED) == 0) {
if(info->asyncflags & ASYNC_HUP_NOTIFY)
@@ -404,8 +403,7 @@
return -ERESTARTSYS;
}

- save_flags(flags);
- cli();
+ local_irq_save(flags);
ch->count++;
tty->driver_data = ch;
ch->tty = tty;
@@ -428,7 +426,7 @@
memoff(ch);
ch->asyncflags |= ASYNC_INITIALIZED;
}
- restore_flags(flags);
+ local_irq_restore(flags);

if(ch->asyncflags & ASYNC_CLOSING) {
interruptible_sleep_on(&ch->close_wait);
@@ -463,8 +461,7 @@
if (!(info->asyncflags & ASYNC_INITIALIZED))
return;

- save_flags(flags);
- cli();
+ local_irq_save(flags);
globalwinon(info);

bc = info->brdchan;
@@ -483,7 +480,7 @@

memoff(info);
info->asyncflags &= ~ASYNC_INITIALIZED;
- restore_flags(flags);
+ local_irq_restore(flags);
}


@@ -493,14 +490,12 @@

if ((info=chan(tty))!=NULL) {
unsigned long flags;
- save_flags(flags);
- cli();
+ local_irq_save(flags);

- if(tty_hung_up_p(filp)) {
+ if(tty_hung_up_p(filp))
/* flag that somebody is done with this module */
- restore_flags(flags);
- return;
- }
+ goto out;
+
/* this check is in serial.c, it won't hurt to do it here too */
if ((tty->count == 1) && (info->count != 1)) {
/*
@@ -513,10 +508,9 @@
printk("pcxe_close: bad serial port count; tty->count is 1, info->count is %d\n", info->count);
info->count = 1;
}
- if (info->count-- > 1) {
- restore_flags(flags);
- return;
- }
+ if (info->count-- > 1)
+ goto out;
+
if (info->count < 0) {
info->count = 0;
}
@@ -544,7 +538,7 @@
}
info->asyncflags &= ~(ASYNC_NORMAL_ACTIVE|ASYNC_CLOSING);
wake_up_interruptible(&info->close_wait);
- restore_flags(flags);
+out: local_irq_restore(flags);
}
}

@@ -556,15 +550,14 @@
if ((ch=chan(tty))!=NULL) {
unsigned long flags;

- save_flags(flags);
- cli();
+ local_irq_save(flags);
shutdown(ch);
ch->event = 0;
ch->count = 0;
ch->tty = NULL;
ch->asyncflags &= ~ASYNC_NORMAL_ACTIVE;
wake_up_interruptible(&ch->open_wait);
- restore_flags(flags);
+ local_irq_restore(flags);
}
}

@@ -590,8 +583,7 @@
*/

total = 0;
- save_flags(flags);
- cli();
+ local_irq_save(flags);
globalwinon(ch);
head = bc->tin & (size - 1);
tail = bc->tout;
@@ -629,7 +621,7 @@
bc->ilow = 1;
}
memoff(ch);
- restore_flags(flags);
+ local_irq_restore(flags);

return(total);
}
@@ -653,8 +645,7 @@
unsigned int head, tail;
unsigned long flags;

- save_flags(flags);
- cli();
+ local_irq_save(flags);
globalwinon(ch);

bc = ch->brdchan;
@@ -672,7 +663,7 @@
bc->ilow = 1;
}
memoff(ch);
- restore_flags(flags);
+ local_irq_restore(flags);
}

return remain;
@@ -691,8 +682,7 @@
if ((ch=chan(tty))==NULL)
return(0);

- save_flags(flags);
- cli();
+ local_irq_save(flags);
globalwinon(ch);

bc = ch->brdchan;
@@ -718,7 +708,7 @@
}

memoff(ch);
- restore_flags(flags);
+ local_irq_restore(flags);

return(chars);
}
@@ -734,8 +724,7 @@
if ((ch=chan(tty))==NULL)
return;

- save_flags(flags);
- cli();
+ local_irq_save(flags);

globalwinon(ch);
bc = ch->brdchan;
@@ -743,7 +732,7 @@
fepcmd(ch, STOUT, (unsigned) tail, 0, 0, 0);

memoff(ch);
- restore_flags(flags);
+ local_irq_restore(flags);

tty_wakeup(tty);
}
@@ -755,11 +744,10 @@
if ((ch=chan(tty))!=NULL) {
unsigned long flags;

- save_flags(flags);
- cli();
+ local_irq_save(flags);
if ((ch->statusflags & TXBUSY) && !(ch->statusflags & EMPTYWAIT))
setup_empty_event(tty,ch);
- restore_flags(flags);
+ local_irq_restore(flags);
}
}

@@ -1512,8 +1500,7 @@
struct channel *ch;
struct board_info *bd;

- save_flags(flags);
- cli();
+ local_irq_save(flags);

for(crd=0; crd < numcards; crd++) {
bd = &boards[crd];
@@ -1536,7 +1523,7 @@
}

mod_timer(&pcxx_timer, jiffies + HZ/25);
- restore_flags(flags);
+ local_irq_restore(flags);
}

static void doevent(int crd)
@@ -1940,12 +1927,11 @@
return(-EINVAL);
}

- save_flags(flags);
- cli();
+ local_irq_save(flags);
globalwinon(ch);
mstat = bc->mstat;
memoff(ch);
- restore_flags(flags);
+ local_irq_restore(flags);

if(mstat & DTR)
mflag |= TIOCM_DTR;
@@ -1978,8 +1964,7 @@
return(-EINVAL);
}

- save_flags(flags);
- cli();
+ local_irq_save(flags);
/*
* I think this modemfake stuff is broken. It doesn't
* correctly reflect the behaviour desired by the TIOCM*
@@ -2005,7 +1990,7 @@
globalwinon(ch);
pcxxparam(tty,ch);
memoff(ch);
- restore_flags(flags);
+ local_irq_restore(flags);
return 0;
}

@@ -2028,8 +2013,6 @@
return(-EINVAL);
}

- save_flags(flags);
-
switch(cmd) {
case TCSBRK: /* SVID version: non-zero arg --> no break */
retval = tty_check_change(tty);
@@ -2074,21 +2057,21 @@
return pcxe_tiocmset(tty, file, mstat, ~mstat);

case TIOCSDTR:
- cli();
+ local_irq_save(flags);
ch->omodem |= DTR;
globalwinon(ch);
fepcmd(ch, SETMODEM, DTR, 0, 10, 1);
memoff(ch);
- restore_flags(flags);
+ local_irq_restore(flags);
break;

case TIOCCDTR:
ch->omodem &= ~DTR;
- cli();
+ local_irq_save(flags);
globalwinon(ch);
fepcmd(ch, SETMODEM, 0, DTR, 10, 1);
memoff(ch);
- restore_flags(flags);
+ local_irq_restore(flags);
break;

case DIGI_GETA:
@@ -2123,16 +2106,16 @@
ch->dsr = DSR;
}

- cli();
+ local_irq_save(flags);
globalwinon(ch);
pcxxparam(tty,ch);
memoff(ch);
- restore_flags(flags);
+ local_irq_restore(flags);
break;

case DIGI_GETFLOW:
case DIGI_GETAFLOW:
- cli();
+ local_irq_save(flags);
globalwinon(ch);
if(cmd == DIGI_GETFLOW) {
dflow.startc = bc->startc;
@@ -2142,7 +2125,7 @@
dflow.stopc = bc->stopca;
}
memoff(ch);
- restore_flags(flags);
+ local_irq_restore(flags);

if (copy_to_user((char*)arg, &dflow, sizeof(dflow)))
return -EFAULT;
@@ -2162,7 +2145,7 @@
return -EFAULT;

if(dflow.startc != startc || dflow.stopc != stopc) {
- cli();
+ local_irq_save(flags);
globalwinon(ch);

if(cmd == DIGI_SETFLOW) {
@@ -2179,7 +2162,7 @@
pcxe_start(tty);

memoff(ch);
- restore_flags(flags);
+ local_irq_restore(flags);
}
break;

@@ -2196,8 +2179,7 @@

if ((info=chan(tty))!=NULL) {
unsigned long flags;
- save_flags(flags);
- cli();
+ local_irq_save(flags);
globalwinon(info);
pcxxparam(tty,info);
memoff(info);
@@ -2208,7 +2190,7 @@
if(!(old_termios->c_cflag & CLOCAL) &&
(tty->termios->c_cflag & CLOCAL))
wake_up_interruptible(&info->open_wait);
- restore_flags(flags);
+ local_irq_restore(flags);
}
}

@@ -2237,15 +2219,14 @@

if ((info=chan(tty))!=NULL) {
unsigned long flags;
- save_flags(flags);
- cli();
+ local_irq_save(flags);
if ((info->statusflags & TXSTOPPED) == 0) {
globalwinon(info);
fepcmd(info, PAUSETX, 0, 0, 0, 0);
info->statusflags |= TXSTOPPED;
memoff(info);
}
- restore_flags(flags);
+ local_irq_restore(flags);
}
}

@@ -2255,15 +2236,14 @@

if ((info=chan(tty))!=NULL) {
unsigned long flags;
- save_flags(flags);
- cli();
+ local_irq_save(flags);
if ((info->statusflags & RXSTOPPED) == 0) {
globalwinon(info);
fepcmd(info, PAUSERX, 0, 0, 0, 0);
info->statusflags |= RXSTOPPED;
memoff(info);
}
- restore_flags(flags);
+ local_irq_restore(flags);
}
}

@@ -2275,8 +2255,7 @@
unsigned long flags;

/* Just in case output was resumed because of a change in Digi-flow */
- save_flags(flags);
- cli();
+ local_irq_save(flags);
if(info->statusflags & RXSTOPPED) {
volatile struct board_chan *bc;
globalwinon(info);
@@ -2285,7 +2264,7 @@
info->statusflags &= ~RXSTOPPED;
memoff(info);
}
- restore_flags(flags);
+ local_irq_restore(flags);
}
}

@@ -2297,8 +2276,7 @@
if ((info=chan(tty))!=NULL) {
unsigned long flags;

- save_flags(flags);
- cli();
+ local_irq_save(flags);
/* Just in case output was resumed because of a change in Digi-flow */
if(info->statusflags & TXSTOPPED) {
volatile struct board_chan *bc;
@@ -2310,7 +2288,7 @@
info->statusflags &= ~TXSTOPPED;
memoff(info);
}
- restore_flags(flags);
+ local_irq_restore(flags);
}
}

@@ -2319,8 +2297,7 @@
{
unsigned long flags;

- save_flags(flags);
- cli();
+ local_irq_save(flags);
globalwinon(ch);

/*
@@ -2334,7 +2311,7 @@
fepcmd(ch, SENDBREAK, msec, 0, 10, 0);
memoff(ch);

- restore_flags(flags);
+ local_irq_restore(flags);
}

static void setup_empty_event(struct tty_struct *tty, struct channel *ch)
@@ -2342,12 +2319,11 @@
volatile struct board_chan *bc;
unsigned long flags;

- save_flags(flags);
- cli();
+ local_irq_save(flags);
globalwinon(ch);
ch->statusflags |= EMPTYWAIT;
bc = ch->brdchan;
bc->iempty = 1;
memoff(ch);
- restore_flags(flags);
+ local_irq_restore(flags);
}
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/