Commit ccfea3c9 authored by Jiri Slaby's avatar Jiri Slaby Committed by Linus Torvalds

Char: stallion, remove bottomhalf

- tty_hangup schedules a bottomhalf itself, tty_wakeup doesn't need it
- call the CD code (part of work handler previously) directly from the code
  (it wakes somebody up or calls tty_hangup at worse)
Signed-off-by: default avatarJiri Slaby <jirislaby@gmail.com>
Acked-by: default avatarAlan Cox <alan@redhat.com>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent d0d4e1c0
...@@ -145,8 +145,7 @@ static struct stlbrd *stl_brds[STL_MAXBRDS]; ...@@ -145,8 +145,7 @@ static struct stlbrd *stl_brds[STL_MAXBRDS];
*/ */
#define ASYI_TXBUSY 1 #define ASYI_TXBUSY 1
#define ASYI_TXLOW 2 #define ASYI_TXLOW 2
#define ASYI_DCDCHANGE 3 #define ASYI_TXFLOWED 3
#define ASYI_TXFLOWED 4
/* /*
* Define an array of board names as printable strings. Handy for * Define an array of board names as printable strings. Handy for
...@@ -610,6 +609,23 @@ static const struct file_operations stl_fsiomem = { ...@@ -610,6 +609,23 @@ static const struct file_operations stl_fsiomem = {
static struct class *stallion_class; static struct class *stallion_class;
static void stl_cd_change(struct stlport *portp)
{
unsigned int oldsigs = portp->sigs;
if (!portp->tty)
return;
portp->sigs = stl_getsignals(portp);
if ((portp->sigs & TIOCM_CD) && ((oldsigs & TIOCM_CD) == 0))
wake_up_interruptible(&portp->open_wait);
if ((oldsigs & TIOCM_CD) && ((portp->sigs & TIOCM_CD) == 0))
if (portp->flags & ASYNC_CHECK_CD)
tty_hangup(portp->tty);
}
/* /*
* Check for any arguments passed in on the module load command line. * Check for any arguments passed in on the module load command line.
*/ */
...@@ -1770,41 +1786,6 @@ static int stl_echpci64intr(struct stlbrd *brdp) ...@@ -1770,41 +1786,6 @@ static int stl_echpci64intr(struct stlbrd *brdp)
/*****************************************************************************/ /*****************************************************************************/
/*
* Service an off-level request for some channel.
*/
static void stl_offintr(struct work_struct *work)
{
struct stlport *portp = container_of(work, struct stlport, tqueue);
struct tty_struct *tty;
unsigned int oldsigs;
pr_debug("stl_offintr(portp=%p)\n", portp);
if (portp == NULL)
return;
tty = portp->tty;
if (tty == NULL)
return;
if (test_bit(ASYI_TXLOW, &portp->istate))
tty_wakeup(tty);
if (test_bit(ASYI_DCDCHANGE, &portp->istate)) {
clear_bit(ASYI_DCDCHANGE, &portp->istate);
oldsigs = portp->sigs;
portp->sigs = stl_getsignals(portp);
if ((portp->sigs & TIOCM_CD) && ((oldsigs & TIOCM_CD) == 0))
wake_up_interruptible(&portp->open_wait);
if ((oldsigs & TIOCM_CD) && ((portp->sigs & TIOCM_CD) == 0))
if (portp->flags & ASYNC_CHECK_CD)
tty_hangup(tty); /* FIXME: module removal race here - AKPM */
}
}
/*****************************************************************************/
/* /*
* Initialize all the ports on a panel. * Initialize all the ports on a panel.
*/ */
...@@ -1840,7 +1821,6 @@ static int __devinit stl_initports(struct stlbrd *brdp, struct stlpanel *panelp) ...@@ -1840,7 +1821,6 @@ static int __devinit stl_initports(struct stlbrd *brdp, struct stlpanel *panelp)
portp->baud_base = STL_BAUDBASE; portp->baud_base = STL_BAUDBASE;
portp->close_delay = STL_CLOSEDELAY; portp->close_delay = STL_CLOSEDELAY;
portp->closing_wait = 30 * HZ; portp->closing_wait = 30 * HZ;
INIT_WORK(&portp->tqueue, stl_offintr);
init_waitqueue_head(&portp->open_wait); init_waitqueue_head(&portp->open_wait);
init_waitqueue_head(&portp->close_wait); init_waitqueue_head(&portp->close_wait);
portp->stats.brd = portp->brdnr; portp->stats.brd = portp->brdnr;
...@@ -3530,7 +3510,8 @@ static void stl_cd1400txisr(struct stlpanel *panelp, int ioaddr) ...@@ -3530,7 +3510,8 @@ static void stl_cd1400txisr(struct stlpanel *panelp, int ioaddr)
if ((len == 0) || ((len < STL_TXBUFLOW) && if ((len == 0) || ((len < STL_TXBUFLOW) &&
(test_bit(ASYI_TXLOW, &portp->istate) == 0))) { (test_bit(ASYI_TXLOW, &portp->istate) == 0))) {
set_bit(ASYI_TXLOW, &portp->istate); set_bit(ASYI_TXLOW, &portp->istate);
schedule_work(&portp->tqueue); if (portp->tty)
tty_wakeup(portp->tty);
} }
if (len == 0) { if (len == 0) {
...@@ -3693,8 +3674,7 @@ static void stl_cd1400mdmisr(struct stlpanel *panelp, int ioaddr) ...@@ -3693,8 +3674,7 @@ static void stl_cd1400mdmisr(struct stlpanel *panelp, int ioaddr)
outb((MISR + portp->uartaddr), ioaddr); outb((MISR + portp->uartaddr), ioaddr);
misr = inb(ioaddr + EREG_DATA); misr = inb(ioaddr + EREG_DATA);
if (misr & MISR_DCD) { if (misr & MISR_DCD) {
set_bit(ASYI_DCDCHANGE, &portp->istate); stl_cd_change(portp);
schedule_work(&portp->tqueue);
portp->stats.modem++; portp->stats.modem++;
} }
...@@ -4448,7 +4428,8 @@ static void stl_sc26198txisr(struct stlport *portp) ...@@ -4448,7 +4428,8 @@ static void stl_sc26198txisr(struct stlport *portp)
if ((len == 0) || ((len < STL_TXBUFLOW) && if ((len == 0) || ((len < STL_TXBUFLOW) &&
(test_bit(ASYI_TXLOW, &portp->istate) == 0))) { (test_bit(ASYI_TXLOW, &portp->istate) == 0))) {
set_bit(ASYI_TXLOW, &portp->istate); set_bit(ASYI_TXLOW, &portp->istate);
schedule_work(&portp->tqueue); if (portp->tty)
tty_wakeup(portp->tty);
} }
if (len == 0) { if (len == 0) {
...@@ -4649,8 +4630,7 @@ static void stl_sc26198otherisr(struct stlport *portp, unsigned int iack) ...@@ -4649,8 +4630,7 @@ static void stl_sc26198otherisr(struct stlport *portp, unsigned int iack)
case CIR_SUBCOS: case CIR_SUBCOS:
ipr = stl_sc26198getreg(portp, IPR); ipr = stl_sc26198getreg(portp, IPR);
if (ipr & IPR_DCDCHANGE) { if (ipr & IPR_DCDCHANGE) {
set_bit(ASYI_DCDCHANGE, &portp->istate); stl_cd_change(portp);
schedule_work(&portp->tqueue);
portp->stats.modem++; portp->stats.modem++;
} }
break; break;
......
...@@ -95,7 +95,6 @@ struct stlport { ...@@ -95,7 +95,6 @@ struct stlport {
struct tty_struct *tty; struct tty_struct *tty;
wait_queue_head_t open_wait; wait_queue_head_t open_wait;
wait_queue_head_t close_wait; wait_queue_head_t close_wait;
struct work_struct tqueue;
comstats_t stats; comstats_t stats;
struct stlrq tx; struct stlrq tx;
}; };
......
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