aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTomoya <tomoya-linux@dsn.okisemi.com>2010-12-12 15:24:23 -0500
committerDavid S. Miller <davem@davemloft.net>2010-12-13 15:24:27 -0500
commit3332bc5446e034566e8a56bf7a7cd479ca35bd6d (patch)
tree05ca7dffb9bb91ccf5a3d7a895dacafe7afcc3b9
parenta6f6d6b51b110e661ae5f862d60c27da4970bec6 (diff)
pch_can: Fix incorrect return processing
Fix incorrect return processing. Signed-off-by: Tomoya MORINAGA <tomoya-linux@dsn.okisemi.com> Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r--drivers/net/can/pch_can.c19
1 files changed, 10 insertions, 9 deletions
diff --git a/drivers/net/can/pch_can.c b/drivers/net/can/pch_can.c
index ace1fe790ce0..8efbe359ba2a 100644
--- a/drivers/net/can/pch_can.c
+++ b/drivers/net/can/pch_can.c
@@ -580,9 +580,11 @@ static irqreturn_t pch_can_interrupt(int irq, void *dev_id)
580 struct net_device *ndev = (struct net_device *)dev_id; 580 struct net_device *ndev = (struct net_device *)dev_id;
581 struct pch_can_priv *priv = netdev_priv(ndev); 581 struct pch_can_priv *priv = netdev_priv(ndev);
582 582
583 if (!pch_can_int_pending(priv))
584 return IRQ_NONE;
585
583 pch_can_set_int_enables(priv, PCH_CAN_NONE); 586 pch_can_set_int_enables(priv, PCH_CAN_NONE);
584 napi_schedule(&priv->napi); 587 napi_schedule(&priv->napi);
585
586 return IRQ_HANDLED; 588 return IRQ_HANDLED;
587} 589}
588 590
@@ -671,8 +673,10 @@ static int pch_can_rx_normal(struct net_device *ndev, u32 obj_num, int quota)
671 } 673 }
672 674
673 skb = alloc_can_skb(priv->ndev, &cf); 675 skb = alloc_can_skb(priv->ndev, &cf);
674 if (!skb) 676 if (!skb) {
675 return -ENOMEM; 677 netdev_err(ndev, "alloc_can_skb Failed\n");
678 return rcv_pkts;
679 }
676 680
677 /* Get Received data */ 681 /* Get Received data */
678 id2 = ioread32(&priv->regs->ifregs[0].id2); 682 id2 = ioread32(&priv->regs->ifregs[0].id2);
@@ -733,8 +737,8 @@ static int pch_can_poll(struct napi_struct *napi, int quota)
733 struct net_device *ndev = napi->dev; 737 struct net_device *ndev = napi->dev;
734 struct pch_can_priv *priv = netdev_priv(ndev); 738 struct pch_can_priv *priv = netdev_priv(ndev);
735 u32 int_stat; 739 u32 int_stat;
736 int rcv_pkts = 0;
737 u32 reg_stat; 740 u32 reg_stat;
741 int quota_save = quota;
738 742
739 int_stat = pch_can_int_pending(priv); 743 int_stat = pch_can_int_pending(priv);
740 if (!int_stat) 744 if (!int_stat)
@@ -763,10 +767,7 @@ static int pch_can_poll(struct napi_struct *napi, int quota)
763 goto end; 767 goto end;
764 768
765 if ((int_stat >= PCH_RX_OBJ_START) && (int_stat <= PCH_RX_OBJ_END)) { 769 if ((int_stat >= PCH_RX_OBJ_START) && (int_stat <= PCH_RX_OBJ_END)) {
766 rcv_pkts += pch_can_rx_normal(ndev, int_stat, quota); 770 quota -= pch_can_rx_normal(ndev, int_stat, quota);
767 quota -= rcv_pkts;
768 if (quota < 0)
769 goto end;
770 } else if ((int_stat >= PCH_TX_OBJ_START) && 771 } else if ((int_stat >= PCH_TX_OBJ_START) &&
771 (int_stat <= PCH_TX_OBJ_END)) { 772 (int_stat <= PCH_TX_OBJ_END)) {
772 /* Handle transmission interrupt */ 773 /* Handle transmission interrupt */
@@ -777,7 +778,7 @@ end:
777 napi_complete(napi); 778 napi_complete(napi);
778 pch_can_set_int_enables(priv, PCH_CAN_ALL); 779 pch_can_set_int_enables(priv, PCH_CAN_ALL);
779 780
780 return rcv_pkts; 781 return quota_save - quota;
781} 782}
782 783
783static int pch_set_bittiming(struct net_device *ndev) 784static int pch_set_bittiming(struct net_device *ndev)