Date: Tue, 15 Dec 2009 09:57:59 -0800 From: Marcel Moolenaar <xcllnt@mac.com> To: Karl Denninger <karl@denninger.net> Cc: freebsd-stable@freebsd.org, Juergen Lock <nox@jelal.kn-bremen.de>, Jeremy Chadwick <freebsd@jdc.parodius.com> Subject: Re: PUC Serial I/O problem - copy of gnats-filed bug report (as [SB QUAR: Sun Dec 13 10:50:06 2009] discussed previously) Message-ID: <E3C14EC6-4F90-4438-84E6-0C1AA031454A@mac.com> In-Reply-To: <4B27A539.808@denninger.net> References: <4B100262.6000900@denninger.net> <4B102059.6040003@denninger.net> <20091127190319.GA12437@icarus.home.lan> <4B102C41.6040205@denninger.net> <4B11EDDD.8060108@denninger.net> <20091129205814.GB77530@icarus.home.lan> <200912131646.nBDGkiPX010830@triton8.kn-bremen.de> <4B27A539.808@denninger.net>
next in thread | previous in thread | raw e-mail | index | archive | help
On Dec 15, 2009, at 7:03 AM, Karl Denninger wrote: > This is now marked fixed and it appears (after limited testing thus far) > that it indeed is. The bug existed in 7 as well. It's not a regression introduced in 8. The reason why this didn't come up in the 7 time frame is that sio(4) was still the default. Jeremy has been an early adopter of uart(4) and if I'm not mistaken, he always loaded the driver(s) as modules. This, due to a "lucky" bug, avoided the problem for him. In depth: With uart(4) I created the serdev I/F. This is an interface that allows umbrella drivers like puc(4) and scc(4) to obtain pending interrupt status and invoke interrupt source specific handlers. This puts the umbrella driver in control over what gets handled in what order *across* multiple interfaces. As such, with puc(4), you can service all receive interrupts for all ports before you service, say, the transmit interrupt across the ports. When a serial device does not implement the serdev I/F, then puc(4) won't be involved in interrupt handling at all. This is why puc(4)+sio(4) had no problem. Since uart(4) does implement the serdev I/F, the interrupt handler of puc(4) would be in control and since it was this interrupt handler that was broken, exhibit the stalls. But, when puc(4) and/or uart(4) were loaded as modules, puc(4) would not see uart(4) as implementing the serdev I/F. This is to do with linker sets, etc. Consequently, uart(4) would handle its own interrupts and puc(4) would not be involved (just as with the sio(4) setup). In that scenario puc(4)+uart(4) also just worked. In any case: puc(4) has been fixed and I'll deal with the linker set bug later. For best results: compile puc(4) and uart(4) into the kernel and don't load them as modules for now... FYI, -- Marcel Moolenaar xcllnt@mac.com
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?E3C14EC6-4F90-4438-84E6-0C1AA031454A>