struct net_device *dev = napi->dev;
        struct mscan_regs __iomem *regs = priv->reg_base;
        struct net_device_stats *stats = &dev->stats;
-       int npackets = 0;
-       int ret = 1;
+       int work_done = 0;
        struct sk_buff *skb;
        struct can_frame *frame;
        u8 canrflg;
 
-       while (npackets < quota) {
+       while (work_done < quota) {
                canrflg = in_8(®s->canrflg);
                if (!(canrflg & (MSCAN_RXF | MSCAN_ERR_IF)))
                        break;
 
                stats->rx_packets++;
                stats->rx_bytes += frame->can_dlc;
-               npackets++;
+               work_done++;
                netif_receive_skb(skb);
        }
 
-       if (!(in_8(®s->canrflg) & (MSCAN_RXF | MSCAN_ERR_IF))) {
-               napi_complete(&priv->napi);
-               clear_bit(F_RX_PROGRESS, &priv->flags);
-               if (priv->can.state < CAN_STATE_BUS_OFF)
-                       out_8(®s->canrier, priv->shadow_canrier);
-               ret = 0;
+       if (work_done < quota) {
+               if (likely(napi_complete_done(&priv->napi, work_done))) {
+                       clear_bit(F_RX_PROGRESS, &priv->flags);
+                       if (priv->can.state < CAN_STATE_BUS_OFF)
+                               out_8(®s->canrier, priv->shadow_canrier);
+               }
        }
-       return ret;
+       return work_done;
 }
 
 static irqreturn_t mscan_isr(int irq, void *dev_id)