综上所述:引起watchdog timeout的主要原因为:1、缓冲区不够大,前面的没发完后面的又跟的来了。2、内核的内存分配出现问题,此情况比较少发生。3、卡的质量(在IO时的吞吐量)。如何解决些问题:
首先我们必须查出导致出现该问题的原因,即是这问题中的哪个引起的,我们来修改if.h中定义一全局变量:
u_int8_t myerror; /*意思是出错的原因代码,按我列的来吧,1是缓冲区不够...*/
在函数static void rl_start(ifp)中加入:
static void rl_start(ifp)
struct ifnet *ifp;
{
struct rl_softc *sc;
struct mbuf *m_head = NULL;
sc = ifp->if_softc;
u_int8_t tmperror;
if (RL_CUR_TXMBUF(sc) != NULL) {/*新加,如果是缓冲区不够问题*/
myerror=1;
}
while(RL_CUR_TXMBUF(sc) == NULL) {
IF_DEQUEUE(&ifp->if_snd, m_head);
if (m_head == NULL)
{
myerror=2; /*内存分配出错*/
break;
}
if (rl_encap(sc, m_head)) {
IF_PREPEND(&ifp->if_snd, m_head);
ifp->if_flags |= IFF_OACTIVE;
break;
}
if (ifp->if_bpf)
bpf_mtap(ifp, RL_CUR_TXMBUF(sc));
tmperror=myerror;/*在进行写IO口前先保存前面出错的原因*/
CSR_WR99vE_4(sc, RL_CUR_TXADDR(sc),
vtophys(mtod(RL_CUR_TXMBUF(sc), caddr_t)));
CSR_WR99vE_4(sc, RL_CUR_TXSTAT(sc),
RL_TXTHRESH(sc->rl_txthresh) |
RL_CUR_TXMBUF(sc)->m_pkthdr.len);
myerror=tmperror;/*上面两句没问题的话再还原前面的出错原因*/
RL_INC(sc->rl_cdata.cur_tx);
}
if (RL_CUR_TXMBUF(sc) != NULL)
ifp->if_flags |= IFF_OACTIVE;
ifp->if_timer = 5;
return;
}
最后再改一下rl_watchdog中的显示部分
printf("rl%d: watchdog timeout:error number is %x\n", sc->rl_unit,myerror); 当然这只是我个人的见解,可能有许多不足或没考虑到的地方,也希望大家能提出更好、更容易的方法。