|
@@ -2169,6 +2169,14 @@ static int natsemi_poll(struct net_device *dev, int *budget)
|
|
dev->name, np->intr_status,
|
|
dev->name, np->intr_status,
|
|
readl(ioaddr + IntrMask));
|
|
readl(ioaddr + IntrMask));
|
|
|
|
|
|
|
|
+ /* netdev_rx() may read IntrStatus again if the RX state
|
|
|
|
+ * machine falls over so do it first. */
|
|
|
|
+ if (np->intr_status &
|
|
|
|
+ (IntrRxDone | IntrRxIntr | RxStatusFIFOOver |
|
|
|
|
+ IntrRxErr | IntrRxOverrun)) {
|
|
|
|
+ netdev_rx(dev, &work_done, work_to_do);
|
|
|
|
+ }
|
|
|
|
+
|
|
if (np->intr_status &
|
|
if (np->intr_status &
|
|
(IntrTxDone | IntrTxIntr | IntrTxIdle | IntrTxErr)) {
|
|
(IntrTxDone | IntrTxIntr | IntrTxIdle | IntrTxErr)) {
|
|
spin_lock(&np->lock);
|
|
spin_lock(&np->lock);
|
|
@@ -2180,12 +2188,6 @@ static int natsemi_poll(struct net_device *dev, int *budget)
|
|
if (np->intr_status & IntrAbnormalSummary)
|
|
if (np->intr_status & IntrAbnormalSummary)
|
|
netdev_error(dev, np->intr_status);
|
|
netdev_error(dev, np->intr_status);
|
|
|
|
|
|
- if (np->intr_status &
|
|
|
|
- (IntrRxDone | IntrRxIntr | RxStatusFIFOOver |
|
|
|
|
- IntrRxErr | IntrRxOverrun)) {
|
|
|
|
- netdev_rx(dev, &work_done, work_to_do);
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
*budget -= work_done;
|
|
*budget -= work_done;
|
|
dev->quota -= work_done;
|
|
dev->quota -= work_done;
|
|
|
|
|