diff options
author | Tomoya <tomoya-linux@dsn.okisemi.com> | 2010-12-12 15:24:23 -0500 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2010-12-13 15:24:27 -0500 |
commit | 3332bc5446e034566e8a56bf7a7cd479ca35bd6d (patch) | |
tree | 05ca7dffb9bb91ccf5a3d7a895dacafe7afcc3b9 | |
parent | a6f6d6b51b110e661ae5f862d60c27da4970bec6 (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.c | 19 |
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 | ||
783 | static int pch_set_bittiming(struct net_device *ndev) | 784 | static int pch_set_bittiming(struct net_device *ndev) |