diff options
Diffstat (limited to 'drivers/net/can/c_can/c_can.c')
-rw-r--r-- | drivers/net/can/c_can/c_can.c | 13 |
1 files changed, 10 insertions, 3 deletions
diff --git a/drivers/net/can/c_can/c_can.c b/drivers/net/can/c_can/c_can.c index c1a8684ed1c8..5d43c5a0e2d9 100644 --- a/drivers/net/can/c_can/c_can.c +++ b/drivers/net/can/c_can/c_can.c | |||
@@ -647,6 +647,10 @@ static int c_can_start(struct net_device *dev) | |||
647 | if (err) | 647 | if (err) |
648 | return err; | 648 | return err; |
649 | 649 | ||
650 | /* Setup the command for new messages */ | ||
651 | priv->comm_rcv_high = priv->type != BOSCH_D_CAN ? | ||
652 | IF_COMM_RCV_LOW : IF_COMM_RCV_HIGH; | ||
653 | |||
650 | priv->can.state = CAN_STATE_ERROR_ACTIVE; | 654 | priv->can.state = CAN_STATE_ERROR_ACTIVE; |
651 | 655 | ||
652 | /* reset tx helper pointers and the rx mask */ | 656 | /* reset tx helper pointers and the rx mask */ |
@@ -791,14 +795,15 @@ static u32 c_can_adjust_pending(u32 pend) | |||
791 | return pend & ~((1 << lasts) - 1); | 795 | return pend & ~((1 << lasts) - 1); |
792 | } | 796 | } |
793 | 797 | ||
794 | static inline void c_can_rx_object_get(struct net_device *dev, u32 obj) | 798 | static inline void c_can_rx_object_get(struct net_device *dev, |
799 | struct c_can_priv *priv, u32 obj) | ||
795 | { | 800 | { |
796 | #ifdef CONFIG_CAN_C_CAN_STRICT_FRAME_ORDERING | 801 | #ifdef CONFIG_CAN_C_CAN_STRICT_FRAME_ORDERING |
797 | if (obj < C_CAN_MSG_RX_LOW_LAST) | 802 | if (obj < C_CAN_MSG_RX_LOW_LAST) |
798 | c_can_object_get(dev, IF_RX, obj, IF_COMM_RCV_LOW); | 803 | c_can_object_get(dev, IF_RX, obj, IF_COMM_RCV_LOW); |
799 | else | 804 | else |
800 | #endif | 805 | #endif |
801 | c_can_object_get(dev, IF_RX, obj, IF_COMM_RCV_HIGH); | 806 | c_can_object_get(dev, IF_RX, obj, priv->comm_rcv_high); |
802 | } | 807 | } |
803 | 808 | ||
804 | static inline void c_can_rx_finalize(struct net_device *dev, | 809 | static inline void c_can_rx_finalize(struct net_device *dev, |
@@ -813,6 +818,8 @@ static inline void c_can_rx_finalize(struct net_device *dev, | |||
813 | c_can_activate_all_lower_rx_msg_obj(dev, IF_RX); | 818 | c_can_activate_all_lower_rx_msg_obj(dev, IF_RX); |
814 | } | 819 | } |
815 | #endif | 820 | #endif |
821 | if (priv->type != BOSCH_D_CAN) | ||
822 | c_can_object_get(dev, IF_RX, obj, IF_COMM_CLR_NEWDAT); | ||
816 | } | 823 | } |
817 | 824 | ||
818 | static int c_can_read_objects(struct net_device *dev, struct c_can_priv *priv, | 825 | static int c_can_read_objects(struct net_device *dev, struct c_can_priv *priv, |
@@ -823,7 +830,7 @@ static int c_can_read_objects(struct net_device *dev, struct c_can_priv *priv, | |||
823 | while ((obj = ffs(pend)) && quota > 0) { | 830 | while ((obj = ffs(pend)) && quota > 0) { |
824 | pend &= ~BIT(obj - 1); | 831 | pend &= ~BIT(obj - 1); |
825 | 832 | ||
826 | c_can_rx_object_get(dev, obj); | 833 | c_can_rx_object_get(dev, priv, obj); |
827 | ctrl = priv->read_reg(priv, C_CAN_IFACE(MSGCTRL_REG, IF_RX)); | 834 | ctrl = priv->read_reg(priv, C_CAN_IFACE(MSGCTRL_REG, IF_RX)); |
828 | 835 | ||
829 | if (ctrl & IF_MCONT_MSGLST) { | 836 | if (ctrl & IF_MCONT_MSGLST) { |