aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorbroonie@sirena.org.uk <broonie@sirena.org.uk>2007-03-14 15:49:15 -0400
committerJeff Garzik <jeff@garzik.org>2007-03-15 10:59:54 -0400
commitd2a900365b8963d7ca46f05d8e7176d1be3cc71d (patch)
tree0b9d41bd52d414bdc75dab81a746b2c0d9175cc9
parent069f8256362b7a17da532f0631cee73b4cfee65b (diff)
natsemi: Avoid IntrStatus lossage if RX state machine resets.
This patch fixes the poll routine for the natsemi driver so that if the driver detects an RX state machine lockup then no interrupts will be lost while the driver recovers from that. Signed-Off-By: Mark Brown <broonie@sirena.org.uk> Signed-off-by: Jeff Garzik <jeff@garzik.org>
-rw-r--r--drivers/net/natsemi.c14
1 files changed, 8 insertions, 6 deletions
diff --git a/drivers/net/natsemi.c b/drivers/net/natsemi.c
index 5f88200724e6..349b96a3ec4c 100644
--- a/drivers/net/natsemi.c
+++ b/drivers/net/natsemi.c
@@ -2169,6 +2169,14 @@ static int natsemi_poll(struct net_device *dev, int *budget)
2169 dev->name, np->intr_status, 2169 dev->name, np->intr_status,
2170 readl(ioaddr + IntrMask)); 2170 readl(ioaddr + IntrMask));
2171 2171
2172 /* netdev_rx() may read IntrStatus again if the RX state
2173 * machine falls over so do it first. */
2174 if (np->intr_status &
2175 (IntrRxDone | IntrRxIntr | RxStatusFIFOOver |
2176 IntrRxErr | IntrRxOverrun)) {
2177 netdev_rx(dev, &work_done, work_to_do);
2178 }
2179
2172 if (np->intr_status & 2180 if (np->intr_status &
2173 (IntrTxDone | IntrTxIntr | IntrTxIdle | IntrTxErr)) { 2181 (IntrTxDone | IntrTxIntr | IntrTxIdle | IntrTxErr)) {
2174 spin_lock(&np->lock); 2182 spin_lock(&np->lock);
@@ -2180,12 +2188,6 @@ static int natsemi_poll(struct net_device *dev, int *budget)
2180 if (np->intr_status & IntrAbnormalSummary) 2188 if (np->intr_status & IntrAbnormalSummary)
2181 netdev_error(dev, np->intr_status); 2189 netdev_error(dev, np->intr_status);
2182 2190
2183 if (np->intr_status &
2184 (IntrRxDone | IntrRxIntr | RxStatusFIFOOver |
2185 IntrRxErr | IntrRxOverrun)) {
2186 netdev_rx(dev, &work_done, work_to_do);
2187 }
2188
2189 *budget -= work_done; 2191 *budget -= work_done;
2190 dev->quota -= work_done; 2192 dev->quota -= work_done;
2191 2193