2011年9月8日 星期四

timer using msleep

最近在改之前寫的slic driver,在送DTMF tone的時候會發生crash,如下:

To send DTMF CID sequence [A11111CR]
POL_FORWARD
getOffhook = 0
Freq1 : 13990
Freq2 : 4657
BUG: scheduling while atomic: ash/0x00000100/2020
Call Trace:
[<800074cc>] dump_stack+0x8/0x34
[<80219a04>] schedule+0x778/0x920
[<8021a7c4>] schedule_timeout+0x70/0xdc
[<80030a18>] msleep+0x24/0x34
[] playDtmfTone+0x148/0x6a4 [slic3217x]
[] playDtmfTone+0x598/0x6a4 [slic3217x]


看來root cause是因為在timer中用了msleep

造成它reschedule就crash

解決方式就是透過將timer的call時間拉長
讓Oscillators播放時間p_cid->dtmf_on_ms拉長一點

init_timer(&cid_dtmf_timer);
cid_dtmf_timer.function = cid_dtmf_do_timer;
cid_dtmf_timer.expires = jiffies + ms2jiffies(p_cid->dtmf_on_ms);
add_timer(&cid_dtmf_timer);


才不會造成dtmf signal lost