From: Bob Bell <bbell@users.sourceforge.net>
To: Theodore Ts'o <tytso@mit.edu>
Cc: linux-serial@vger.kernel.org
Subject: Re: Serial driver related problems on Linux
Date: Wed, 30 Mar 2005 07:49:19 -0500 [thread overview]
Message-ID: <20050330124919.GA25704@newbie.macroped.net> (raw)
In-Reply-To: <20050317180703.GA30572@newbie.macroped.net>
I don't recall seeing a reply to my email below (note that I'm not
subscribed to linux-serial, so if the reply went only to the list,
I missed it). Is there more information that I can provide? I don't
know how to interpret the output from SERIAL_DEBUG_INTR.
On Thu, Mar 17, 2005 at 01:07:03PM -0500, Bob Bell <bbell@users.sourceforge.net> wrote:
> On Mon, Mar 14, 2005 at 09:11:28PM -0500, Theodore Ts'o <tytso@mit.edu> wrote:
> > On Thu, Mar 10, 2005 at 10:41:27AM -0500, Bob Bell wrote:
> > > The user-visible symptoms of this problem are that after typing in a
> > > username and hitting enter, the serial login prompt hangs. I've traced
> > > this hang to an ioctl in the login code (TCSETSF, a result of calling
> > > tcsetattr(,TCSAFLUSH,)). I've further traced that ioctl to being stuck
> > > in tty_wait_until_sent().
> >
> > It's possible this was caused by a lost transmitter interrupt, so the
> > transmit queue never drained; it's also possible that some UART's are
> > wired to not signal a transmitter interrupt while the serial port is
> > flow controlled. In order to figure out what is going on, you'd have
> > to add debugging logic into the interrupt handler as well (i.e.,
> > #define SERIAL_DEBUG_INTR).
>
> I've #defined SERIAL_DEBUG_INTR as you indicated. In order to minimize
> the impact that might cause, I also #defined printk() to be equivalent
> to my debugging routine, dbg_addmsg(). The following was captured
> starting after I typing in my username, but before I hit enter:
> rs_interrupt_single(4)...status = 61...DR0d:61...IIR = c1...end.
> rs_interrupt_single(4)...status = 60...THRE...IIR = c1...end.
> <7>ttyS wait until sent...
> <7>waiting ttyS...(1)
> rs_interrupt_single(4)...status = 0...IIR = c1...end.
> [ the preceding line repeats another 28x, about once every 10 seconds ]
> <7>waiting ttyS...(62)
> <7>waiting on ttyS interrupted
>
> I've attached a complete log, starting at boot time, as
> log_complete.out. I've also attached my updated patch to the Linux
> kernel that I used to capture the debugging output, just for
> completeness.
>
> Thanks for the guidance. I'm not sure what this output demonstrates,
> but I hope it gets us at least one step closer to the cause...
>
> --
> Bob Bell <bbell@users.sourceforge.net>
> <6>Serial driver version 5.05c (2001-07-08) with MANY_PORTS SHARE_IRQ SERIAL_PCI enabled
> <6>ttyS00 at 0x03f8 (irq = 4) is a 16550A
> <7>ttyS wait until sent...
> <7>waiting ttyS...(0)
> done waiting ttyS...(0)
> In rs_wait_until_sent(6) check=1...jiff=1799...lsr = 96 (jiff=1799)...done
> In rs_wait_until_sent(3) check=1...jiff=1799...lsr = 96 (jiff=1799)...done
> <7>ttyS wait until sent...
> <7>waiting ttyS...(0)
> done waiting ttyS...(0)
> In rs_wait_until_sent(6) check=1...jiff=1799...lsr = 96 (jiff=1799)...done
> <7>ttyS wait until sent...
> <7>waiting ttyS...(0)
> done waiting ttyS...(0)
> In rs_wait_until_sent(6) check=1...jiff=1799...lsr = 96 (jiff=1799)...done
> In rs_wait_until_sent(3) check=1...jiff=1799...lsr = 96 (jiff=1799)...done
> rs_interrupt_single(4)...status = 60...THRE...IIR = c1...end.
> <7>ttyS wait until sent...
> <7>waiting ttyS...(0)
> done waiting ttyS...(0)
> In rs_wait_until_sent(6) check=1...jiff=1802...lsr = 0 (jiff=1802)...lsr = 96 (jiff=1803)...done
> In rs_wait_until_sent(3) check=1...jiff=1803...lsr = 96 (jiff=1803)...done
> rs_interrupt_single(4)...status = 60...THRE...IIR = c1...end.
> <7>ttyS wait until sent...
> <7>waiting ttyS...(4)
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> <7>waiting ttyS...(0)
> done waiting ttyS...(0)
> In rs_wait_until_sent(6) check=1...jiff=1804...lsr = 0 (jiff=1804)...lsr = 0 (jiff=1805)...lsr = 96 (jiff=1806)...done
> In rs_wait_until_sent(3) check=1...jiff=1806...lsr = 96 (jiff=1806)...done
> rs_interrupt_single(4)...status = 60...THRE...IIR = c1...end.
> <7>ttyS wait until sent...
> <7>waiting ttyS...(0)
> done waiting ttyS...(0)
> In rs_wait_until_sent(6) check=1...jiff=1806...lsr = 0 (jiff=1806)...lsr = 96 (jiff=1807)...done
> In rs_wait_until_sent(3) check=1...jiff=1807...lsr = 96 (jiff=1807)...done
> <7>ttyS wait until sent...
> <7>waiting ttyS...(0)
> done waiting ttyS...(0)
> In rs_wait_until_sent(6) check=1...jiff=1809...lsr = 96 (jiff=1809)...done
> rs_interrupt_single(4)...status = 60...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 60...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 60...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> <7>ttyS wait until sent...
> <7>waiting ttyS...(0)
> done waiting ttyS...(0)
> rs_interrupt_single(4)...status = 60...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 60...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> <7>ttyS wait until sent...
> <7>waiting ttyS...(0)
> done waiting ttyS...(0)
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 60...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 60...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 60...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 60...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 60...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 60...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 60...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...IIR = c1...end.
> rs_interrupt_single(4)...status = 60...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 60...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 60...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 60...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 60...IIR = c1...end.
> rs_interrupt_single(4)...status = 60...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 60...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 60...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 60...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 60...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 60...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 60...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 60...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 60...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 60...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 60...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 60...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 60...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 60...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 60...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 60...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 60...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 60...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 60...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 60...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 60...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 60...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 60...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 60...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 60...IIR = c1...end.
> rs_interrupt_single(4)...status = 60...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 60...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 60...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 60...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 60...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 60...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 60...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 60...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 60...IIR = c1...end.
> rs_interrupt_single(4)...status = 60...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 60...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 60...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 60...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 60...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 60...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 60...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 60...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 60...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 60...IIR = c1...end.
> rs_interrupt_single(4)...status = 60...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 60...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 60...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 60...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 60...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 60...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 60...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 60...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 60...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 60...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 60...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 60...IIR = c1...end.
> rs_interrupt_single(4)...status = 60...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 60...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 60...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 60...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 60...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 60...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 60...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 60...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 60...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 60...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 60...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 60...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> <7>ttyS wait until sent...
> <7>waiting ttyS...(0)
> done waiting ttyS...(0)
> rs_interrupt_single(4)...status = 60...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 60...IIR = c1...end.
> rs_interrupt_single(4)...status = 60...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 60...IIR = c1...end.
> rs_interrupt_single(4)...status = 60...IIR = c1...end.
> rs_interrupt_single(4)...status = 60...IIR = c1...end.
> rs_interrupt_single(4)...status = 60...IIR = c1...end.
> rs_interrupt_single(4)...status = 60...IIR = c1...end.
> rs_interrupt_single(4)...status = 60...IIR = c1...end.
> rs_interrupt_single(4)...status = 60...IIR = c1...end.
> rs_interrupt_single(4)...status = 60...IIR = c1...end.
> rs_interrupt_single(4)...status = 60...IIR = c1...end.
> rs_interrupt_single(4)...status = 60...IIR = c1...end.
> rs_interrupt_single(4)...status = 60...IIR = c1...end.
> rs_interrupt_single(4)...status = 60...IIR = c1...end.
> rs_interrupt_single(4)...status = 60...IIR = c1...end.
> rs_interrupt_single(4)...status = 60...IIR = c1...end.
> rs_interrupt_single(4)...status = 60...IIR = c1...end.
> rs_interrupt_single(4)...status = 60...IIR = c1...end.
> rs_interrupt_single(4)...status = 60...IIR = c1...end.
> rs_interrupt_single(4)...status = 60...IIR = c1...end.
> rs_interrupt_single(4)...status = 60...IIR = c1...end.
> rs_interrupt_single(4)...status = 60...IIR = c1...end.
> rs_interrupt_single(4)...status = 60...IIR = c1...end.
> rs_interrupt_single(4)...status = 60...IIR = c1...end.
> rs_interrupt_single(4)...status = 60...IIR = c1...end.
> rs_interrupt_single(4)...status = 60...IIR = c1...end.
> rs_interrupt_single(4)...status = 60...IIR = c1...end.
> rs_interrupt_single(4)...status = 60...IIR = c1...end.
> rs_interrupt_single(4)...status = 60...IIR = c1...end.
> rs_interrupt_single(4)...status = 60...IIR = c1...end.
> rs_interrupt_single(4)...status = 60...IIR = c1...end.
> rs_interrupt_single(4)...status = 60...IIR = c1...end.
> rs_interrupt_single(4)...status = 60...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 60...IIR = c1...end.
> rs_interrupt_single(4)...status = 60...IIR = c1...end.
> rs_interrupt_single(4)...status = 60...IIR = c1...end.
> rs_interrupt_single(4)...status = 60...IIR = c1...end.
> rs_interrupt_single(4)...status = 60...IIR = c1...end.
> rs_interrupt_single(4)...status = 60...IIR = c1...end.
> rs_interrupt_single(4)...status = 60...IIR = c1...end.
> rs_interrupt_single(4)...status = 60...IIR = c1...end.
> rs_interrupt_single(4)...status = 60...IIR = c1...end.
> rs_interrupt_single(4)...status = 60...IIR = c1...end.
> rs_interrupt_single(4)...status = 60...IIR = c1...end.
> rs_interrupt_single(4)...status = 60...IIR = c1...end.
> rs_interrupt_single(4)...status = 60...IIR = c1...end.
> rs_interrupt_single(4)...status = 60...IIR = c1...end.
> rs_interrupt_single(4)...status = 60...IIR = c1...end.
> rs_interrupt_single(4)...status = 60...IIR = c1...end.
> rs_interrupt_single(4)...status = 60...IIR = c1...end.
> rs_interrupt_single(4)...status = 60...IIR = c1...end.
> rs_interrupt_single(4)...status = 60...IIR = c1...end.
> rs_interrupt_single(4)...status = 60...IIR = c1...end.
> rs_interrupt_single(4)...status = 60...IIR = c1...end.
> rs_interrupt_single(4)...status = 60...IIR = c1...end.
> rs_interrupt_single(4)...status = 60...IIR = c1...end.
> rs_interrupt_single(4)...status = 60...IIR = c1...end.
> rs_interrupt_single(4)...status = 60...IIR = c1...end.
> rs_interrupt_single(4)...status = 60...IIR = c1...end.
> rs_interrupt_single(4)...status = 60...IIR = c1...end.
> rs_interrupt_single(4)...status = 60...IIR = c1...end.
> rs_interrupt_single(4)...status = 60...IIR = c1...end.
> rs_interrupt_single(4)...status = 60...IIR = c1...end.
> rs_interrupt_single(4)...status = 60...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 60...IIR = c1...end.
> rs_interrupt_single(4)...status = 60...IIR = c1...end.
> rs_interrupt_single(4)...status = 60...IIR = c1...end.
> rs_interrupt_single(4)...status = 60...IIR = c1...end.
> rs_interrupt_single(4)...status = 60...IIR = c1...end.
> rs_interrupt_single(4)...status = 60...IIR = c1...end.
> rs_interrupt_single(4)...status = 60...IIR = c1...end.
> rs_interrupt_single(4)...status = 60...IIR = c1...end.
> rs_interrupt_single(4)...status = 60...IIR = c1...end.
> rs_interrupt_single(4)...status = 60...IIR = c1...end.
> rs_interrupt_single(4)...status = 60...IIR = c1...end.
> rs_interrupt_single(4)...status = 60...IIR = c1...end.
> rs_interrupt_single(4)...status = 60...IIR = c1...end.
> rs_interrupt_single(4)...status = 61...DR0d:61...IIR = c1...end.
> rs_interrupt_single(4)...status = 60...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 20...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 61...DR72:61...IIR = c1...end.
> rs_interrupt_single(4)...status = 60...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 61...DR6f:61...IIR = c1...end.
> rs_interrupt_single(4)...status = 60...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 61...DR6f:61...IIR = c1...end.
> rs_interrupt_single(4)...status = 60...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 61...DR74:61...IIR = c1...end.
> rs_interrupt_single(4)...status = 60...THRE...IIR = c1...end.
> rs_interrupt_single(4)...status = 60...IIR = c1...end.
> rs_interrupt_single(4)...status = 61...DR0d:61...IIR = c1...end.
> rs_interrupt_single(4)...status = 60...THRE...IIR = c1...end.
> <7>ttyS wait until sent...
> <7>waiting ttyS...(1)
> rs_interrupt_single(4)...status = 0...IIR = c1...end.
> rs_interrupt_single(4)...status = 0...IIR = c1...end.
> rs_interrupt_single(4)...status = 0...IIR = c1...end.
> rs_interrupt_single(4)...status = 0...IIR = c1...end.
> rs_interrupt_single(4)...status = 0...IIR = c1...end.
> rs_interrupt_single(4)...status = 0...IIR = c1...end.
> rs_interrupt_single(4)...status = 0...IIR = c1...end.
> rs_interrupt_single(4)...status = 0...IIR = c1...end.
> rs_interrupt_single(4)...status = 0...IIR = c1...end.
> rs_interrupt_single(4)...status = 0...IIR = c1...end.
> rs_interrupt_single(4)...status = 0...IIR = c1...end.
> rs_interrupt_single(4)...status = 0...IIR = c1...end.
> rs_interrupt_single(4)...status = 0...IIR = c1...end.
> rs_interrupt_single(4)...status = 0...IIR = c1...end.
> rs_interrupt_single(4)...status = 0...IIR = c1...end.
> rs_interrupt_single(4)...status = 0...IIR = c1...end.
> rs_interrupt_single(4)...status = 0...IIR = c1...end.
> rs_interrupt_single(4)...status = 0...IIR = c1...end.
> rs_interrupt_single(4)...status = 0...IIR = c1...end.
> rs_interrupt_single(4)...status = 0...IIR = c1...end.
> rs_interrupt_single(4)...status = 0...IIR = c1...end.
> rs_interrupt_single(4)...status = 0...IIR = c1...end.
> rs_interrupt_single(4)...status = 0...IIR = c1...end.
> rs_interrupt_single(4)...status = 0...IIR = c1...end.
> rs_interrupt_single(4)...status = 0...IIR = c1...end.
> rs_interrupt_single(4)...status = 0...IIR = c1...end.
> rs_interrupt_single(4)...status = 0...IIR = c1...end.
> rs_interrupt_single(4)...status = 0...IIR = c1...end.
> rs_interrupt_single(4)...status = 0...IIR = c1...end.
> rs_interrupt_single(4)...status = 0...IIR = c1...end.
> <7>waiting ttyS...(62)
> <7>waiting on ttyS interrupted
> diff -rup --exclude '*SCCS*' --exclude BitKeeper linux.orig/drivers/char/serial.c linux/drivers/char/serial.c
> --- linux.orig/drivers/char/serial.c Wed Mar 9 17:47:18 2005
> +++ linux/drivers/char/serial.c Thu Mar 17 12:04:54 2005
> @@ -140,10 +140,10 @@ static char *serial_revdate = "2001-07-0
>
> /* Set of debugging defines */
>
> -#undef SERIAL_DEBUG_INTR
> +#define SERIAL_DEBUG_INTR
> #undef SERIAL_DEBUG_OPEN
> #undef SERIAL_DEBUG_FLOW
> -#undef SERIAL_DEBUG_RS_WAIT_UNTIL_SENT
> +#define SERIAL_DEBUG_RS_WAIT_UNTIL_SENT
> #undef SERIAL_DEBUG_PCI
> #undef SERIAL_DEBUG_AUTOCONF
>
> @@ -265,6 +265,10 @@ static int serial_refcount;
>
> static struct timer_list serial_timer;
>
> +extern pid_t watched_pid;
> +extern void dbg_addmsg(char *fmt, ...);
> +#define printk(...) dbg_addmsg(__VA_ARGS__)
> +
> /* serial subtype definitions */
> #ifndef SERIAL_TYPE_NORMAL
> #define SERIAL_TYPE_NORMAL 1
> @@ -927,7 +931,7 @@ static void rs_interrupt_single(int irq,
> ((iir & UART_IIR_ID) == UART_IIR_THRI))
> transmit_chars(info, 0);
> if (pass_counter++ > RS_ISR_PASS_LIMIT) {
> -#if SERIAL_DEBUG_INTR
> +#ifdef SERIAL_DEBUG_INTR
> printk("rs_single loop break.\n");
> #endif
> break;
> @@ -2942,12 +2946,12 @@ static void rs_wait_until_sent(struct tt
> if (!timeout || timeout > 2*info->timeout)
> timeout = 2*info->timeout;
> #ifdef SERIAL_DEBUG_RS_WAIT_UNTIL_SENT
> - printk("In rs_wait_until_sent(%d) check=%lu...", timeout, char_time);
> - printk("jiff=%lu...", jiffies);
> + if (tty->driver.type != TTY_DRIVER_TYPE_PTY) printk("In rs_wait_until_sent(%d) check=%lu...", timeout, char_time);
> + if (tty->driver.type != TTY_DRIVER_TYPE_PTY) printk("jiff=%lu...", jiffies);
> #endif
> while (!((lsr = serial_inp(info, UART_LSR)) & UART_LSR_TEMT)) {
> #ifdef SERIAL_DEBUG_RS_WAIT_UNTIL_SENT
> - printk("lsr = %d (jiff=%lu)...", lsr, jiffies);
> + if (tty->driver.type != TTY_DRIVER_TYPE_PTY) printk("lsr = %d (jiff=%lu)...", lsr, jiffies);
> #endif
> set_current_state(TASK_INTERRUPTIBLE);
> schedule_timeout(char_time);
> @@ -2957,7 +2961,7 @@ static void rs_wait_until_sent(struct tt
> break;
> }
> #ifdef SERIAL_DEBUG_RS_WAIT_UNTIL_SENT
> - printk("lsr = %d (jiff=%lu)...done\n", lsr, jiffies);
> + if (tty->driver.type != TTY_DRIVER_TYPE_PTY) printk("lsr = %d (jiff=%lu)...done\n", lsr, jiffies);
> #endif
> }
>
> diff -rup --exclude '*SCCS*' --exclude BitKeeper linux.orig/drivers/char/tty_ioctl.c linux/drivers/char/tty_ioctl.c
> --- linux.orig/drivers/char/tty_ioctl.c Wed Mar 9 17:47:18 2005
> +++ linux/drivers/char/tty_ioctl.c Thu Mar 17 12:04:56 2005
> @@ -25,7 +25,21 @@
> #include <asm/uaccess.h>
> #include <asm/system.h>
>
> -#undef TTY_DEBUG_WAIT_UNTIL_SENT
> +char dbg_msgbuf[1024*256] = { '\0' };
> +char *dbg_msgcur = dbg_msgbuf;
> +void dbg_addmsg(char *fmt, ...) {
> + va_list args;
> + va_start(args, fmt);
> + dbg_msgcur += vsprintf(dbg_msgcur, fmt, args);
> + va_end(args);
> + if (dbg_msgcur >= (dbg_msgbuf + sizeof(dbg_msgbuf))) {
> + panic("debug message buffer overflow");
> + }
> +}
> +
> +
> +#define TTY_DEBUG_WAIT_UNTIL_SENT
> +#define printk(...) dbg_addmsg(__VA_ARGS__)
>
> #undef DEBUG
>
> @@ -43,7 +57,7 @@ void tty_wait_until_sent(struct tty_stru
> #ifdef TTY_DEBUG_WAIT_UNTIL_SENT
> char buf[64];
>
> - printk(KERN_DEBUG "%s wait until sent...\n", tty_name(tty, buf));
> + if (tty->driver.type != TTY_DRIVER_TYPE_PTY) printk(KERN_DEBUG "%s wait until sent...\n", tty_name(tty, buf));
> #endif
> if (!tty->driver.chars_in_buffer)
> return;
> @@ -52,16 +66,21 @@ void tty_wait_until_sent(struct tty_stru
> timeout = MAX_SCHEDULE_TIMEOUT;
> do {
> #ifdef TTY_DEBUG_WAIT_UNTIL_SENT
> - printk(KERN_DEBUG "waiting %s...(%d)\n", tty_name(tty, buf),
> + if (tty->driver.type != TTY_DRIVER_TYPE_PTY) printk(KERN_DEBUG "waiting %s...(%d)\n", tty_name(tty, buf),
> tty->driver.chars_in_buffer(tty));
> #endif
> set_current_state(TASK_INTERRUPTIBLE);
> - if (signal_pending(current))
> + if (signal_pending(current)) {
> + if (tty->driver.type != TTY_DRIVER_TYPE_PTY) printk(KERN_DEBUG "waiting on %s interrupted\n", tty_name(tty, buf));
> goto stop_waiting;
> + }
> if (!tty->driver.chars_in_buffer(tty))
> break;
> timeout = schedule_timeout(timeout);
> } while (timeout);
> +#ifdef TTY_DEBUG_WAIT_UNTIL_SENT
> + if (tty->driver.type != TTY_DRIVER_TYPE_PTY) printk("done waiting %s...(%d)\n", tty_name(tty, buf), tty->driver.chars_in_buffer(tty));
> +#endif
> if (tty->driver.wait_until_sent)
> tty->driver.wait_until_sent(tty, timeout);
> stop_waiting:
--
Bob Bell <bbell@users.sourceforge.net>
prev parent reply other threads:[~2005-03-30 12:49 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2005-03-10 15:41 Serial driver related problems on Linux Bob Bell
2005-03-15 2:11 ` Theodore Ts'o
2005-03-17 18:07 ` Bob Bell
2005-03-30 12:49 ` Bob Bell [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20050330124919.GA25704@newbie.macroped.net \
--to=bbell@users.sourceforge.net \
--cc=linux-serial@vger.kernel.org \
--cc=tytso@mit.edu \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.