On Tue, 26 Apr 2005, Michael Marxmeier wrote:
> I've encountered a hang (during boot) with the 126.96.36.199 kernel (SUSE 9.3)
> if IRDA is enabled.
> >From the sysrq P output it seems to cycle in sir_kthread.c
strange - irda_tx_complete_fsm doesn't call delay_pmtmr directly. It calls
some delays, yes, but it seems these are done using some special PM timer
in your case - personally, I haven't seen this yet. Please try with
CONFIG_X86_PM_TIMER disabled (somewhere in the ACPI-section).
And im wondering why it hangs there in the first place. delay_pmtmr seems
to be just a busy loop waiting for some special timer providing the delay.
So I think this can only happen if the loop parameter gets miscalculated
there. I think the very idea of this timer is to get independent from
PM and cpufreq time warps, so I don't see why it might fail here...
Wait, I'm just spotting delay_pmtmr is calling rdtscl() - shouldn't this
just call read_pmtmr() instead!? Maybe the patch below would help then...
> Hardware: HP nx7010 laptop
What kind of irda-hardware: onboard-uart (ttySx) or some usb-to-serial
bridge (i.e. serial dongle on usb, maybe combined casing like ma620)?
> IRDA works ok when the boot is completed
> Any ideas/pointers?
> What debug output would be useful (enable IRDA_DEBUG ?)
Yes, enable it in the kernel config and set /proc/sys/net/irda/debug to 3.
Must be something special during boot - sounds like some odd interaction
with this special timer (acpi-related?). I don't have this hardware to
reproduce, so if the above doesn't help, we need to find out, how it
happens to get into delay_pmtmr from irda sir_kthread. Please send the
recorded SysRq+P output (maybe catched from serial console, if not
But first, lets see if the above suggestions help. Please try:
1) With CONFIG_X86_PM_TIMER disabled
2) With CONFIG_X86_PM_TIMER enabled and the patch below applied
--- linux-2.6.11/arch/i386/kernel/timers/timer_pm.c 2005-03-02 08:37:48.000000000 +0100
+++ v2.6.11-md/arch/i386/kernel/timers/timer_pm.c 2005-04-27 21:50:03.730926256 +0200
@@ -214,11 +214,11 @@ static void delay_pmtmr(unsigned long lo
unsigned long bclock, now;
+ bclock = read_pmtmr();
+ now = read_pmtmr();
} while ((now-bclock) < loops);