串口驱动问题讨论

关于QNX串口驱动devc-ser8250代码分析:
驱动里面关于串口发送采用了定时机制,发送一个字节后如果在150ms时间内没有收到发送中断信号,那么驱动定时就自动进行数据发送(发送过程是先判断发送环形缓冲区内是否有数据,有则取数发送,无则啥也不作推出)。但是关于驱动里面的timer.c里面的time_tick()函数(就是定时触发函数)有一个疑问:里面有个for循环,好象找不到推出的条件,即可能陷入死循环。
代码如下:
int timer_tick(message_context_t *msgctp, int code, unsigned flags, void *handle) {
TTYCTRL *ctlp = &ttyctrl;
TTYDEV *dev, *prev, *tip;
struct _itimer itime;
resmgr_context_t *ctp = (resmgr_context_t *)msgctp;

for(prev = NULL; (tip = (prev ? prev->timer : ctlp->timer_list)) ; prev = tip) {
dev = tip;

// Input timer
if(dev->timeout && --dev->timeout == 0) {
atomic_set(&dev->flags, EVENT_TIMEOUT);
check_waiting(ctp, dev, &dev->waiting_read);
}

// Output and Control timers
if(dev->un.tmrs) {
// End a break.
if(dev->un.s.brk_tmr && --dev->un.s.brk_tmr == 0) {
tto(dev, TTO_CTRL, _CTL_BRK_CHG | 0);
}

// End a dropline.
if(dev->un.s.dtr_tmr && --dev->un.s.dtr_tmr == 0) {
tto(dev, TTO_CTRL, _CTL_DTR_CHG | _CTL_DTR);
}

// End a drain timed event.
if(dev->un.s.drn_tmr && --dev->un.s.drn_tmr == 0) {
if (dev->flags & EVENT_DRAIN)
#ifdef PM_DEBUG
printf(“timer: calling check_drain\n”);
#endif
check_drain(ctp, dev);
}

// End a spare timed event - driver use ONLY.
if(dev->un.s.spare_tmr && --dev->un.s.spare_tmr == 0) {
tto(dev, TTO_CTRL, _CTL_TIMED_CHG | 0);
}

// Work around bug in some parts which loose transmit interrupts.
if(dev->un.s.tx_tmr && --dev->un.s.tx_tmr == 0) {
tto(dev, TTO_DATA, 0);
}
}

// Remove the timer when all counts are zero and it is not being kept.
if(dev->obuf.cnt==0 && dev->timeout==0 && dev->un.tmrs==0 && (dev->flags & TIMER_KEEP)==0) {

atomic_clr(&dev->flags, TIMER_ACTIVE);
if (prev)
prev->timer = tip->timer;
else
ctlp->timer_list = tip->timer;

tip = prev;
}
}

// If the list is empty disable kernel periodic timer
if(ctlp->timer_list == NULL) {
memset(&itime, 0, sizeof(itime));
TimerSettime(ctlp->timerid, 0, &itime, NULL);
}
return 0;
}