Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 28 Feb 2003 17:02:01 -0500
From:      Don Bowman <don@sandvine.com>
To:        "'freebsd-current@freebsd.org'" <freebsd-current@freebsd.org>
Subject:   problem with if_em and polling with RXSEQ interrupt? (and patch)
Message-ID:  <FE045D4D9F7AED4CBFF1B3B813C8533701B35BDE@mail.sandvine.com>

next in thread | raw e-mail | index | archive | help
In the if_em driver, it appears there is a possibility of 
a system crash when POLLING is enabled in conjunction with
a link change.

em_disable_intr leaves the RXSEQ interrupt enabled (which
occurs when a link goes up or down). THe em_intr routine,
when in polling mode, just returns (with the interrupt
still active), which then re-enters it. the kern_poll
will never get a chance to do its POLL_AND_CHECK_STATUS in
this case.

I'm proposing to add to em_intr a call to em_poll with
POLL_AND_CHECK_STATUS if there is an interrupt pending
and we are in polling mode:

1086c1086,1087
<       if (ifp->if_ipending & IFF_POLLING)
---
>       if (ifp->if_ipending & IFF_POLLING) {
>               em_poll(ifp, POLL_AND_CHECK_STATUS, 1);
1087a1089
>       }

I also propose to enable the link status change interrupt in
em_disable_intr():
2259c2261
<                       (0xffffffff & ~E1000_IMC_RXSEQ));
---
>                       (0xffffffff & ~(E1000_IMC_RXSEQ | E1000_ICR_LSC)));

Does anybody have any comments on this?

To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-current" in the body of the message




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?FE045D4D9F7AED4CBFF1B3B813C8533701B35BDE>