diff options
Diffstat (limited to 'drivers/net/can')
-rw-r--r-- | drivers/net/can/dev.c | 48 | ||||
-rw-r--r-- | drivers/net/can/flexcan.c | 108 | ||||
-rw-r--r-- | drivers/net/can/rcar/rcar_can.c | 5 | ||||
-rw-r--r-- | drivers/net/can/rx-offload.c | 51 | ||||
-rw-r--r-- | drivers/net/can/spi/hi311x.c | 2 | ||||
-rw-r--r-- | drivers/net/can/usb/kvaser_usb/kvaser_usb_core.c | 4 | ||||
-rw-r--r-- | drivers/net/can/usb/kvaser_usb/kvaser_usb_hydra.c | 10 | ||||
-rw-r--r-- | drivers/net/can/usb/ucan.c | 7 |
8 files changed, 156 insertions, 79 deletions
diff --git a/drivers/net/can/dev.c b/drivers/net/can/dev.c index 49163570a63a..3b3f88ffab53 100644 --- a/drivers/net/can/dev.c +++ b/drivers/net/can/dev.c | |||
@@ -477,6 +477,34 @@ void can_put_echo_skb(struct sk_buff *skb, struct net_device *dev, | |||
477 | } | 477 | } |
478 | EXPORT_SYMBOL_GPL(can_put_echo_skb); | 478 | EXPORT_SYMBOL_GPL(can_put_echo_skb); |
479 | 479 | ||
480 | struct sk_buff *__can_get_echo_skb(struct net_device *dev, unsigned int idx, u8 *len_ptr) | ||
481 | { | ||
482 | struct can_priv *priv = netdev_priv(dev); | ||
483 | struct sk_buff *skb = priv->echo_skb[idx]; | ||
484 | struct canfd_frame *cf; | ||
485 | |||
486 | if (idx >= priv->echo_skb_max) { | ||
487 | netdev_err(dev, "%s: BUG! Trying to access can_priv::echo_skb out of bounds (%u/max %u)\n", | ||
488 | __func__, idx, priv->echo_skb_max); | ||
489 | return NULL; | ||
490 | } | ||
491 | |||
492 | if (!skb) { | ||
493 | netdev_err(dev, "%s: BUG! Trying to echo non existing skb: can_priv::echo_skb[%u]\n", | ||
494 | __func__, idx); | ||
495 | return NULL; | ||
496 | } | ||
497 | |||
498 | /* Using "struct canfd_frame::len" for the frame | ||
499 | * length is supported on both CAN and CANFD frames. | ||
500 | */ | ||
501 | cf = (struct canfd_frame *)skb->data; | ||
502 | *len_ptr = cf->len; | ||
503 | priv->echo_skb[idx] = NULL; | ||
504 | |||
505 | return skb; | ||
506 | } | ||
507 | |||
480 | /* | 508 | /* |
481 | * Get the skb from the stack and loop it back locally | 509 | * Get the skb from the stack and loop it back locally |
482 | * | 510 | * |
@@ -486,22 +514,16 @@ EXPORT_SYMBOL_GPL(can_put_echo_skb); | |||
486 | */ | 514 | */ |
487 | unsigned int can_get_echo_skb(struct net_device *dev, unsigned int idx) | 515 | unsigned int can_get_echo_skb(struct net_device *dev, unsigned int idx) |
488 | { | 516 | { |
489 | struct can_priv *priv = netdev_priv(dev); | 517 | struct sk_buff *skb; |
490 | 518 | u8 len; | |
491 | BUG_ON(idx >= priv->echo_skb_max); | ||
492 | |||
493 | if (priv->echo_skb[idx]) { | ||
494 | struct sk_buff *skb = priv->echo_skb[idx]; | ||
495 | struct can_frame *cf = (struct can_frame *)skb->data; | ||
496 | u8 dlc = cf->can_dlc; | ||
497 | 519 | ||
498 | netif_rx(priv->echo_skb[idx]); | 520 | skb = __can_get_echo_skb(dev, idx, &len); |
499 | priv->echo_skb[idx] = NULL; | 521 | if (!skb) |
522 | return 0; | ||
500 | 523 | ||
501 | return dlc; | 524 | netif_rx(skb); |
502 | } | ||
503 | 525 | ||
504 | return 0; | 526 | return len; |
505 | } | 527 | } |
506 | EXPORT_SYMBOL_GPL(can_get_echo_skb); | 528 | EXPORT_SYMBOL_GPL(can_get_echo_skb); |
507 | 529 | ||
diff --git a/drivers/net/can/flexcan.c b/drivers/net/can/flexcan.c index 8e972ef08637..75ce11395ee8 100644 --- a/drivers/net/can/flexcan.c +++ b/drivers/net/can/flexcan.c | |||
@@ -135,13 +135,12 @@ | |||
135 | 135 | ||
136 | /* FLEXCAN interrupt flag register (IFLAG) bits */ | 136 | /* FLEXCAN interrupt flag register (IFLAG) bits */ |
137 | /* Errata ERR005829 step7: Reserve first valid MB */ | 137 | /* Errata ERR005829 step7: Reserve first valid MB */ |
138 | #define FLEXCAN_TX_MB_RESERVED_OFF_FIFO 8 | 138 | #define FLEXCAN_TX_MB_RESERVED_OFF_FIFO 8 |
139 | #define FLEXCAN_TX_MB_OFF_FIFO 9 | ||
140 | #define FLEXCAN_TX_MB_RESERVED_OFF_TIMESTAMP 0 | 139 | #define FLEXCAN_TX_MB_RESERVED_OFF_TIMESTAMP 0 |
141 | #define FLEXCAN_TX_MB_OFF_TIMESTAMP 1 | 140 | #define FLEXCAN_TX_MB 63 |
142 | #define FLEXCAN_RX_MB_OFF_TIMESTAMP_FIRST (FLEXCAN_TX_MB_OFF_TIMESTAMP + 1) | 141 | #define FLEXCAN_RX_MB_OFF_TIMESTAMP_FIRST (FLEXCAN_TX_MB_RESERVED_OFF_TIMESTAMP + 1) |
143 | #define FLEXCAN_RX_MB_OFF_TIMESTAMP_LAST 63 | 142 | #define FLEXCAN_RX_MB_OFF_TIMESTAMP_LAST (FLEXCAN_TX_MB - 1) |
144 | #define FLEXCAN_IFLAG_MB(x) BIT(x) | 143 | #define FLEXCAN_IFLAG_MB(x) BIT(x & 0x1f) |
145 | #define FLEXCAN_IFLAG_RX_FIFO_OVERFLOW BIT(7) | 144 | #define FLEXCAN_IFLAG_RX_FIFO_OVERFLOW BIT(7) |
146 | #define FLEXCAN_IFLAG_RX_FIFO_WARN BIT(6) | 145 | #define FLEXCAN_IFLAG_RX_FIFO_WARN BIT(6) |
147 | #define FLEXCAN_IFLAG_RX_FIFO_AVAILABLE BIT(5) | 146 | #define FLEXCAN_IFLAG_RX_FIFO_AVAILABLE BIT(5) |
@@ -259,9 +258,7 @@ struct flexcan_priv { | |||
259 | struct can_rx_offload offload; | 258 | struct can_rx_offload offload; |
260 | 259 | ||
261 | struct flexcan_regs __iomem *regs; | 260 | struct flexcan_regs __iomem *regs; |
262 | struct flexcan_mb __iomem *tx_mb; | ||
263 | struct flexcan_mb __iomem *tx_mb_reserved; | 261 | struct flexcan_mb __iomem *tx_mb_reserved; |
264 | u8 tx_mb_idx; | ||
265 | u32 reg_ctrl_default; | 262 | u32 reg_ctrl_default; |
266 | u32 reg_imask1_default; | 263 | u32 reg_imask1_default; |
267 | u32 reg_imask2_default; | 264 | u32 reg_imask2_default; |
@@ -515,6 +512,7 @@ static int flexcan_get_berr_counter(const struct net_device *dev, | |||
515 | static netdev_tx_t flexcan_start_xmit(struct sk_buff *skb, struct net_device *dev) | 512 | static netdev_tx_t flexcan_start_xmit(struct sk_buff *skb, struct net_device *dev) |
516 | { | 513 | { |
517 | const struct flexcan_priv *priv = netdev_priv(dev); | 514 | const struct flexcan_priv *priv = netdev_priv(dev); |
515 | struct flexcan_regs __iomem *regs = priv->regs; | ||
518 | struct can_frame *cf = (struct can_frame *)skb->data; | 516 | struct can_frame *cf = (struct can_frame *)skb->data; |
519 | u32 can_id; | 517 | u32 can_id; |
520 | u32 data; | 518 | u32 data; |
@@ -537,17 +535,17 @@ static netdev_tx_t flexcan_start_xmit(struct sk_buff *skb, struct net_device *de | |||
537 | 535 | ||
538 | if (cf->can_dlc > 0) { | 536 | if (cf->can_dlc > 0) { |
539 | data = be32_to_cpup((__be32 *)&cf->data[0]); | 537 | data = be32_to_cpup((__be32 *)&cf->data[0]); |
540 | priv->write(data, &priv->tx_mb->data[0]); | 538 | priv->write(data, ®s->mb[FLEXCAN_TX_MB].data[0]); |
541 | } | 539 | } |
542 | if (cf->can_dlc > 4) { | 540 | if (cf->can_dlc > 4) { |
543 | data = be32_to_cpup((__be32 *)&cf->data[4]); | 541 | data = be32_to_cpup((__be32 *)&cf->data[4]); |
544 | priv->write(data, &priv->tx_mb->data[1]); | 542 | priv->write(data, ®s->mb[FLEXCAN_TX_MB].data[1]); |
545 | } | 543 | } |
546 | 544 | ||
547 | can_put_echo_skb(skb, dev, 0); | 545 | can_put_echo_skb(skb, dev, 0); |
548 | 546 | ||
549 | priv->write(can_id, &priv->tx_mb->can_id); | 547 | priv->write(can_id, ®s->mb[FLEXCAN_TX_MB].can_id); |
550 | priv->write(ctrl, &priv->tx_mb->can_ctrl); | 548 | priv->write(ctrl, ®s->mb[FLEXCAN_TX_MB].can_ctrl); |
551 | 549 | ||
552 | /* Errata ERR005829 step8: | 550 | /* Errata ERR005829 step8: |
553 | * Write twice INACTIVE(0x8) code to first MB. | 551 | * Write twice INACTIVE(0x8) code to first MB. |
@@ -563,9 +561,13 @@ static netdev_tx_t flexcan_start_xmit(struct sk_buff *skb, struct net_device *de | |||
563 | static void flexcan_irq_bus_err(struct net_device *dev, u32 reg_esr) | 561 | static void flexcan_irq_bus_err(struct net_device *dev, u32 reg_esr) |
564 | { | 562 | { |
565 | struct flexcan_priv *priv = netdev_priv(dev); | 563 | struct flexcan_priv *priv = netdev_priv(dev); |
564 | struct flexcan_regs __iomem *regs = priv->regs; | ||
566 | struct sk_buff *skb; | 565 | struct sk_buff *skb; |
567 | struct can_frame *cf; | 566 | struct can_frame *cf; |
568 | bool rx_errors = false, tx_errors = false; | 567 | bool rx_errors = false, tx_errors = false; |
568 | u32 timestamp; | ||
569 | |||
570 | timestamp = priv->read(®s->timer) << 16; | ||
569 | 571 | ||
570 | skb = alloc_can_err_skb(dev, &cf); | 572 | skb = alloc_can_err_skb(dev, &cf); |
571 | if (unlikely(!skb)) | 573 | if (unlikely(!skb)) |
@@ -612,17 +614,21 @@ static void flexcan_irq_bus_err(struct net_device *dev, u32 reg_esr) | |||
612 | if (tx_errors) | 614 | if (tx_errors) |
613 | dev->stats.tx_errors++; | 615 | dev->stats.tx_errors++; |
614 | 616 | ||
615 | can_rx_offload_irq_queue_err_skb(&priv->offload, skb); | 617 | can_rx_offload_queue_sorted(&priv->offload, skb, timestamp); |
616 | } | 618 | } |
617 | 619 | ||
618 | static void flexcan_irq_state(struct net_device *dev, u32 reg_esr) | 620 | static void flexcan_irq_state(struct net_device *dev, u32 reg_esr) |
619 | { | 621 | { |
620 | struct flexcan_priv *priv = netdev_priv(dev); | 622 | struct flexcan_priv *priv = netdev_priv(dev); |
623 | struct flexcan_regs __iomem *regs = priv->regs; | ||
621 | struct sk_buff *skb; | 624 | struct sk_buff *skb; |
622 | struct can_frame *cf; | 625 | struct can_frame *cf; |
623 | enum can_state new_state, rx_state, tx_state; | 626 | enum can_state new_state, rx_state, tx_state; |
624 | int flt; | 627 | int flt; |
625 | struct can_berr_counter bec; | 628 | struct can_berr_counter bec; |
629 | u32 timestamp; | ||
630 | |||
631 | timestamp = priv->read(®s->timer) << 16; | ||
626 | 632 | ||
627 | flt = reg_esr & FLEXCAN_ESR_FLT_CONF_MASK; | 633 | flt = reg_esr & FLEXCAN_ESR_FLT_CONF_MASK; |
628 | if (likely(flt == FLEXCAN_ESR_FLT_CONF_ACTIVE)) { | 634 | if (likely(flt == FLEXCAN_ESR_FLT_CONF_ACTIVE)) { |
@@ -652,7 +658,7 @@ static void flexcan_irq_state(struct net_device *dev, u32 reg_esr) | |||
652 | if (unlikely(new_state == CAN_STATE_BUS_OFF)) | 658 | if (unlikely(new_state == CAN_STATE_BUS_OFF)) |
653 | can_bus_off(dev); | 659 | can_bus_off(dev); |
654 | 660 | ||
655 | can_rx_offload_irq_queue_err_skb(&priv->offload, skb); | 661 | can_rx_offload_queue_sorted(&priv->offload, skb, timestamp); |
656 | } | 662 | } |
657 | 663 | ||
658 | static inline struct flexcan_priv *rx_offload_to_priv(struct can_rx_offload *offload) | 664 | static inline struct flexcan_priv *rx_offload_to_priv(struct can_rx_offload *offload) |
@@ -720,9 +726,14 @@ static unsigned int flexcan_mailbox_read(struct can_rx_offload *offload, | |||
720 | priv->write(BIT(n - 32), ®s->iflag2); | 726 | priv->write(BIT(n - 32), ®s->iflag2); |
721 | } else { | 727 | } else { |
722 | priv->write(FLEXCAN_IFLAG_RX_FIFO_AVAILABLE, ®s->iflag1); | 728 | priv->write(FLEXCAN_IFLAG_RX_FIFO_AVAILABLE, ®s->iflag1); |
723 | priv->read(®s->timer); | ||
724 | } | 729 | } |
725 | 730 | ||
731 | /* Read the Free Running Timer. It is optional but recommended | ||
732 | * to unlock Mailbox as soon as possible and make it available | ||
733 | * for reception. | ||
734 | */ | ||
735 | priv->read(®s->timer); | ||
736 | |||
726 | return 1; | 737 | return 1; |
727 | } | 738 | } |
728 | 739 | ||
@@ -732,9 +743,9 @@ static inline u64 flexcan_read_reg_iflag_rx(struct flexcan_priv *priv) | |||
732 | struct flexcan_regs __iomem *regs = priv->regs; | 743 | struct flexcan_regs __iomem *regs = priv->regs; |
733 | u32 iflag1, iflag2; | 744 | u32 iflag1, iflag2; |
734 | 745 | ||
735 | iflag2 = priv->read(®s->iflag2) & priv->reg_imask2_default; | 746 | iflag2 = priv->read(®s->iflag2) & priv->reg_imask2_default & |
736 | iflag1 = priv->read(®s->iflag1) & priv->reg_imask1_default & | 747 | ~FLEXCAN_IFLAG_MB(FLEXCAN_TX_MB); |
737 | ~FLEXCAN_IFLAG_MB(priv->tx_mb_idx); | 748 | iflag1 = priv->read(®s->iflag1) & priv->reg_imask1_default; |
738 | 749 | ||
739 | return (u64)iflag2 << 32 | iflag1; | 750 | return (u64)iflag2 << 32 | iflag1; |
740 | } | 751 | } |
@@ -746,11 +757,9 @@ static irqreturn_t flexcan_irq(int irq, void *dev_id) | |||
746 | struct flexcan_priv *priv = netdev_priv(dev); | 757 | struct flexcan_priv *priv = netdev_priv(dev); |
747 | struct flexcan_regs __iomem *regs = priv->regs; | 758 | struct flexcan_regs __iomem *regs = priv->regs; |
748 | irqreturn_t handled = IRQ_NONE; | 759 | irqreturn_t handled = IRQ_NONE; |
749 | u32 reg_iflag1, reg_esr; | 760 | u32 reg_iflag2, reg_esr; |
750 | enum can_state last_state = priv->can.state; | 761 | enum can_state last_state = priv->can.state; |
751 | 762 | ||
752 | reg_iflag1 = priv->read(®s->iflag1); | ||
753 | |||
754 | /* reception interrupt */ | 763 | /* reception interrupt */ |
755 | if (priv->devtype_data->quirks & FLEXCAN_QUIRK_USE_OFF_TIMESTAMP) { | 764 | if (priv->devtype_data->quirks & FLEXCAN_QUIRK_USE_OFF_TIMESTAMP) { |
756 | u64 reg_iflag; | 765 | u64 reg_iflag; |
@@ -764,6 +773,9 @@ static irqreturn_t flexcan_irq(int irq, void *dev_id) | |||
764 | break; | 773 | break; |
765 | } | 774 | } |
766 | } else { | 775 | } else { |
776 | u32 reg_iflag1; | ||
777 | |||
778 | reg_iflag1 = priv->read(®s->iflag1); | ||
767 | if (reg_iflag1 & FLEXCAN_IFLAG_RX_FIFO_AVAILABLE) { | 779 | if (reg_iflag1 & FLEXCAN_IFLAG_RX_FIFO_AVAILABLE) { |
768 | handled = IRQ_HANDLED; | 780 | handled = IRQ_HANDLED; |
769 | can_rx_offload_irq_offload_fifo(&priv->offload); | 781 | can_rx_offload_irq_offload_fifo(&priv->offload); |
@@ -779,17 +791,22 @@ static irqreturn_t flexcan_irq(int irq, void *dev_id) | |||
779 | } | 791 | } |
780 | } | 792 | } |
781 | 793 | ||
794 | reg_iflag2 = priv->read(®s->iflag2); | ||
795 | |||
782 | /* transmission complete interrupt */ | 796 | /* transmission complete interrupt */ |
783 | if (reg_iflag1 & FLEXCAN_IFLAG_MB(priv->tx_mb_idx)) { | 797 | if (reg_iflag2 & FLEXCAN_IFLAG_MB(FLEXCAN_TX_MB)) { |
798 | u32 reg_ctrl = priv->read(®s->mb[FLEXCAN_TX_MB].can_ctrl); | ||
799 | |||
784 | handled = IRQ_HANDLED; | 800 | handled = IRQ_HANDLED; |
785 | stats->tx_bytes += can_get_echo_skb(dev, 0); | 801 | stats->tx_bytes += can_rx_offload_get_echo_skb(&priv->offload, |
802 | 0, reg_ctrl << 16); | ||
786 | stats->tx_packets++; | 803 | stats->tx_packets++; |
787 | can_led_event(dev, CAN_LED_EVENT_TX); | 804 | can_led_event(dev, CAN_LED_EVENT_TX); |
788 | 805 | ||
789 | /* after sending a RTR frame MB is in RX mode */ | 806 | /* after sending a RTR frame MB is in RX mode */ |
790 | priv->write(FLEXCAN_MB_CODE_TX_INACTIVE, | 807 | priv->write(FLEXCAN_MB_CODE_TX_INACTIVE, |
791 | &priv->tx_mb->can_ctrl); | 808 | ®s->mb[FLEXCAN_TX_MB].can_ctrl); |
792 | priv->write(FLEXCAN_IFLAG_MB(priv->tx_mb_idx), ®s->iflag1); | 809 | priv->write(FLEXCAN_IFLAG_MB(FLEXCAN_TX_MB), ®s->iflag2); |
793 | netif_wake_queue(dev); | 810 | netif_wake_queue(dev); |
794 | } | 811 | } |
795 | 812 | ||
@@ -931,15 +948,13 @@ static int flexcan_chip_start(struct net_device *dev) | |||
931 | reg_mcr &= ~FLEXCAN_MCR_MAXMB(0xff); | 948 | reg_mcr &= ~FLEXCAN_MCR_MAXMB(0xff); |
932 | reg_mcr |= FLEXCAN_MCR_FRZ | FLEXCAN_MCR_HALT | FLEXCAN_MCR_SUPV | | 949 | reg_mcr |= FLEXCAN_MCR_FRZ | FLEXCAN_MCR_HALT | FLEXCAN_MCR_SUPV | |
933 | FLEXCAN_MCR_WRN_EN | FLEXCAN_MCR_SRX_DIS | FLEXCAN_MCR_IRMQ | | 950 | FLEXCAN_MCR_WRN_EN | FLEXCAN_MCR_SRX_DIS | FLEXCAN_MCR_IRMQ | |
934 | FLEXCAN_MCR_IDAM_C; | 951 | FLEXCAN_MCR_IDAM_C | FLEXCAN_MCR_MAXMB(FLEXCAN_TX_MB); |
935 | 952 | ||
936 | if (priv->devtype_data->quirks & FLEXCAN_QUIRK_USE_OFF_TIMESTAMP) { | 953 | if (priv->devtype_data->quirks & FLEXCAN_QUIRK_USE_OFF_TIMESTAMP) |
937 | reg_mcr &= ~FLEXCAN_MCR_FEN; | 954 | reg_mcr &= ~FLEXCAN_MCR_FEN; |
938 | reg_mcr |= FLEXCAN_MCR_MAXMB(priv->offload.mb_last); | 955 | else |
939 | } else { | 956 | reg_mcr |= FLEXCAN_MCR_FEN; |
940 | reg_mcr |= FLEXCAN_MCR_FEN | | 957 | |
941 | FLEXCAN_MCR_MAXMB(priv->tx_mb_idx); | ||
942 | } | ||
943 | netdev_dbg(dev, "%s: writing mcr=0x%08x", __func__, reg_mcr); | 958 | netdev_dbg(dev, "%s: writing mcr=0x%08x", __func__, reg_mcr); |
944 | priv->write(reg_mcr, ®s->mcr); | 959 | priv->write(reg_mcr, ®s->mcr); |
945 | 960 | ||
@@ -982,16 +997,17 @@ static int flexcan_chip_start(struct net_device *dev) | |||
982 | priv->write(reg_ctrl2, ®s->ctrl2); | 997 | priv->write(reg_ctrl2, ®s->ctrl2); |
983 | } | 998 | } |
984 | 999 | ||
985 | /* clear and invalidate all mailboxes first */ | ||
986 | for (i = priv->tx_mb_idx; i < ARRAY_SIZE(regs->mb); i++) { | ||
987 | priv->write(FLEXCAN_MB_CODE_RX_INACTIVE, | ||
988 | ®s->mb[i].can_ctrl); | ||
989 | } | ||
990 | |||
991 | if (priv->devtype_data->quirks & FLEXCAN_QUIRK_USE_OFF_TIMESTAMP) { | 1000 | if (priv->devtype_data->quirks & FLEXCAN_QUIRK_USE_OFF_TIMESTAMP) { |
992 | for (i = priv->offload.mb_first; i <= priv->offload.mb_last; i++) | 1001 | for (i = priv->offload.mb_first; i <= priv->offload.mb_last; i++) { |
993 | priv->write(FLEXCAN_MB_CODE_RX_EMPTY, | 1002 | priv->write(FLEXCAN_MB_CODE_RX_EMPTY, |
994 | ®s->mb[i].can_ctrl); | 1003 | ®s->mb[i].can_ctrl); |
1004 | } | ||
1005 | } else { | ||
1006 | /* clear and invalidate unused mailboxes first */ | ||
1007 | for (i = FLEXCAN_TX_MB_RESERVED_OFF_FIFO; i <= ARRAY_SIZE(regs->mb); i++) { | ||
1008 | priv->write(FLEXCAN_MB_CODE_RX_INACTIVE, | ||
1009 | ®s->mb[i].can_ctrl); | ||
1010 | } | ||
995 | } | 1011 | } |
996 | 1012 | ||
997 | /* Errata ERR005829: mark first TX mailbox as INACTIVE */ | 1013 | /* Errata ERR005829: mark first TX mailbox as INACTIVE */ |
@@ -1000,7 +1016,7 @@ static int flexcan_chip_start(struct net_device *dev) | |||
1000 | 1016 | ||
1001 | /* mark TX mailbox as INACTIVE */ | 1017 | /* mark TX mailbox as INACTIVE */ |
1002 | priv->write(FLEXCAN_MB_CODE_TX_INACTIVE, | 1018 | priv->write(FLEXCAN_MB_CODE_TX_INACTIVE, |
1003 | &priv->tx_mb->can_ctrl); | 1019 | ®s->mb[FLEXCAN_TX_MB].can_ctrl); |
1004 | 1020 | ||
1005 | /* acceptance mask/acceptance code (accept everything) */ | 1021 | /* acceptance mask/acceptance code (accept everything) */ |
1006 | priv->write(0x0, ®s->rxgmask); | 1022 | priv->write(0x0, ®s->rxgmask); |
@@ -1355,17 +1371,13 @@ static int flexcan_probe(struct platform_device *pdev) | |||
1355 | priv->devtype_data = devtype_data; | 1371 | priv->devtype_data = devtype_data; |
1356 | priv->reg_xceiver = reg_xceiver; | 1372 | priv->reg_xceiver = reg_xceiver; |
1357 | 1373 | ||
1358 | if (priv->devtype_data->quirks & FLEXCAN_QUIRK_USE_OFF_TIMESTAMP) { | 1374 | if (priv->devtype_data->quirks & FLEXCAN_QUIRK_USE_OFF_TIMESTAMP) |
1359 | priv->tx_mb_idx = FLEXCAN_TX_MB_OFF_TIMESTAMP; | ||
1360 | priv->tx_mb_reserved = ®s->mb[FLEXCAN_TX_MB_RESERVED_OFF_TIMESTAMP]; | 1375 | priv->tx_mb_reserved = ®s->mb[FLEXCAN_TX_MB_RESERVED_OFF_TIMESTAMP]; |
1361 | } else { | 1376 | else |
1362 | priv->tx_mb_idx = FLEXCAN_TX_MB_OFF_FIFO; | ||
1363 | priv->tx_mb_reserved = ®s->mb[FLEXCAN_TX_MB_RESERVED_OFF_FIFO]; | 1377 | priv->tx_mb_reserved = ®s->mb[FLEXCAN_TX_MB_RESERVED_OFF_FIFO]; |
1364 | } | ||
1365 | priv->tx_mb = ®s->mb[priv->tx_mb_idx]; | ||
1366 | 1378 | ||
1367 | priv->reg_imask1_default = FLEXCAN_IFLAG_MB(priv->tx_mb_idx); | 1379 | priv->reg_imask1_default = 0; |
1368 | priv->reg_imask2_default = 0; | 1380 | priv->reg_imask2_default = FLEXCAN_IFLAG_MB(FLEXCAN_TX_MB); |
1369 | 1381 | ||
1370 | priv->offload.mailbox_read = flexcan_mailbox_read; | 1382 | priv->offload.mailbox_read = flexcan_mailbox_read; |
1371 | 1383 | ||
diff --git a/drivers/net/can/rcar/rcar_can.c b/drivers/net/can/rcar/rcar_can.c index 11662f479e76..771a46083739 100644 --- a/drivers/net/can/rcar/rcar_can.c +++ b/drivers/net/can/rcar/rcar_can.c | |||
@@ -24,6 +24,9 @@ | |||
24 | 24 | ||
25 | #define RCAR_CAN_DRV_NAME "rcar_can" | 25 | #define RCAR_CAN_DRV_NAME "rcar_can" |
26 | 26 | ||
27 | #define RCAR_SUPPORTED_CLOCKS (BIT(CLKR_CLKP1) | BIT(CLKR_CLKP2) | \ | ||
28 | BIT(CLKR_CLKEXT)) | ||
29 | |||
27 | /* Mailbox configuration: | 30 | /* Mailbox configuration: |
28 | * mailbox 60 - 63 - Rx FIFO mailboxes | 31 | * mailbox 60 - 63 - Rx FIFO mailboxes |
29 | * mailbox 56 - 59 - Tx FIFO mailboxes | 32 | * mailbox 56 - 59 - Tx FIFO mailboxes |
@@ -789,7 +792,7 @@ static int rcar_can_probe(struct platform_device *pdev) | |||
789 | goto fail_clk; | 792 | goto fail_clk; |
790 | } | 793 | } |
791 | 794 | ||
792 | if (clock_select >= ARRAY_SIZE(clock_names)) { | 795 | if (!(BIT(clock_select) & RCAR_SUPPORTED_CLOCKS)) { |
793 | err = -EINVAL; | 796 | err = -EINVAL; |
794 | dev_err(&pdev->dev, "invalid CAN clock selected\n"); | 797 | dev_err(&pdev->dev, "invalid CAN clock selected\n"); |
795 | goto fail_clk; | 798 | goto fail_clk; |
diff --git a/drivers/net/can/rx-offload.c b/drivers/net/can/rx-offload.c index c7d05027a7a0..2ce4fa8698c7 100644 --- a/drivers/net/can/rx-offload.c +++ b/drivers/net/can/rx-offload.c | |||
@@ -211,7 +211,54 @@ int can_rx_offload_irq_offload_fifo(struct can_rx_offload *offload) | |||
211 | } | 211 | } |
212 | EXPORT_SYMBOL_GPL(can_rx_offload_irq_offload_fifo); | 212 | EXPORT_SYMBOL_GPL(can_rx_offload_irq_offload_fifo); |
213 | 213 | ||
214 | int can_rx_offload_irq_queue_err_skb(struct can_rx_offload *offload, struct sk_buff *skb) | 214 | int can_rx_offload_queue_sorted(struct can_rx_offload *offload, |
215 | struct sk_buff *skb, u32 timestamp) | ||
216 | { | ||
217 | struct can_rx_offload_cb *cb; | ||
218 | unsigned long flags; | ||
219 | |||
220 | if (skb_queue_len(&offload->skb_queue) > | ||
221 | offload->skb_queue_len_max) | ||
222 | return -ENOMEM; | ||
223 | |||
224 | cb = can_rx_offload_get_cb(skb); | ||
225 | cb->timestamp = timestamp; | ||
226 | |||
227 | spin_lock_irqsave(&offload->skb_queue.lock, flags); | ||
228 | __skb_queue_add_sort(&offload->skb_queue, skb, can_rx_offload_compare); | ||
229 | spin_unlock_irqrestore(&offload->skb_queue.lock, flags); | ||
230 | |||
231 | can_rx_offload_schedule(offload); | ||
232 | |||
233 | return 0; | ||
234 | } | ||
235 | EXPORT_SYMBOL_GPL(can_rx_offload_queue_sorted); | ||
236 | |||
237 | unsigned int can_rx_offload_get_echo_skb(struct can_rx_offload *offload, | ||
238 | unsigned int idx, u32 timestamp) | ||
239 | { | ||
240 | struct net_device *dev = offload->dev; | ||
241 | struct net_device_stats *stats = &dev->stats; | ||
242 | struct sk_buff *skb; | ||
243 | u8 len; | ||
244 | int err; | ||
245 | |||
246 | skb = __can_get_echo_skb(dev, idx, &len); | ||
247 | if (!skb) | ||
248 | return 0; | ||
249 | |||
250 | err = can_rx_offload_queue_sorted(offload, skb, timestamp); | ||
251 | if (err) { | ||
252 | stats->rx_errors++; | ||
253 | stats->tx_fifo_errors++; | ||
254 | } | ||
255 | |||
256 | return len; | ||
257 | } | ||
258 | EXPORT_SYMBOL_GPL(can_rx_offload_get_echo_skb); | ||
259 | |||
260 | int can_rx_offload_queue_tail(struct can_rx_offload *offload, | ||
261 | struct sk_buff *skb) | ||
215 | { | 262 | { |
216 | if (skb_queue_len(&offload->skb_queue) > | 263 | if (skb_queue_len(&offload->skb_queue) > |
217 | offload->skb_queue_len_max) | 264 | offload->skb_queue_len_max) |
@@ -222,7 +269,7 @@ int can_rx_offload_irq_queue_err_skb(struct can_rx_offload *offload, struct sk_b | |||
222 | 269 | ||
223 | return 0; | 270 | return 0; |
224 | } | 271 | } |
225 | EXPORT_SYMBOL_GPL(can_rx_offload_irq_queue_err_skb); | 272 | EXPORT_SYMBOL_GPL(can_rx_offload_queue_tail); |
226 | 273 | ||
227 | static int can_rx_offload_init_queue(struct net_device *dev, struct can_rx_offload *offload, unsigned int weight) | 274 | static int can_rx_offload_init_queue(struct net_device *dev, struct can_rx_offload *offload, unsigned int weight) |
228 | { | 275 | { |
diff --git a/drivers/net/can/spi/hi311x.c b/drivers/net/can/spi/hi311x.c index 53e320c92a8b..ddaf46239e39 100644 --- a/drivers/net/can/spi/hi311x.c +++ b/drivers/net/can/spi/hi311x.c | |||
@@ -760,7 +760,7 @@ static int hi3110_open(struct net_device *net) | |||
760 | { | 760 | { |
761 | struct hi3110_priv *priv = netdev_priv(net); | 761 | struct hi3110_priv *priv = netdev_priv(net); |
762 | struct spi_device *spi = priv->spi; | 762 | struct spi_device *spi = priv->spi; |
763 | unsigned long flags = IRQF_ONESHOT | IRQF_TRIGGER_RISING; | 763 | unsigned long flags = IRQF_ONESHOT | IRQF_TRIGGER_HIGH; |
764 | int ret; | 764 | int ret; |
765 | 765 | ||
766 | ret = open_candev(net); | 766 | ret = open_candev(net); |
diff --git a/drivers/net/can/usb/kvaser_usb/kvaser_usb_core.c b/drivers/net/can/usb/kvaser_usb/kvaser_usb_core.c index b939a4c10b84..c89c7d4900d7 100644 --- a/drivers/net/can/usb/kvaser_usb/kvaser_usb_core.c +++ b/drivers/net/can/usb/kvaser_usb/kvaser_usb_core.c | |||
@@ -528,7 +528,6 @@ static netdev_tx_t kvaser_usb_start_xmit(struct sk_buff *skb, | |||
528 | context = &priv->tx_contexts[i]; | 528 | context = &priv->tx_contexts[i]; |
529 | 529 | ||
530 | context->echo_index = i; | 530 | context->echo_index = i; |
531 | can_put_echo_skb(skb, netdev, context->echo_index); | ||
532 | ++priv->active_tx_contexts; | 531 | ++priv->active_tx_contexts; |
533 | if (priv->active_tx_contexts >= (int)dev->max_tx_urbs) | 532 | if (priv->active_tx_contexts >= (int)dev->max_tx_urbs) |
534 | netif_stop_queue(netdev); | 533 | netif_stop_queue(netdev); |
@@ -553,7 +552,6 @@ static netdev_tx_t kvaser_usb_start_xmit(struct sk_buff *skb, | |||
553 | dev_kfree_skb(skb); | 552 | dev_kfree_skb(skb); |
554 | spin_lock_irqsave(&priv->tx_contexts_lock, flags); | 553 | spin_lock_irqsave(&priv->tx_contexts_lock, flags); |
555 | 554 | ||
556 | can_free_echo_skb(netdev, context->echo_index); | ||
557 | context->echo_index = dev->max_tx_urbs; | 555 | context->echo_index = dev->max_tx_urbs; |
558 | --priv->active_tx_contexts; | 556 | --priv->active_tx_contexts; |
559 | netif_wake_queue(netdev); | 557 | netif_wake_queue(netdev); |
@@ -564,6 +562,8 @@ static netdev_tx_t kvaser_usb_start_xmit(struct sk_buff *skb, | |||
564 | 562 | ||
565 | context->priv = priv; | 563 | context->priv = priv; |
566 | 564 | ||
565 | can_put_echo_skb(skb, netdev, context->echo_index); | ||
566 | |||
567 | usb_fill_bulk_urb(urb, dev->udev, | 567 | usb_fill_bulk_urb(urb, dev->udev, |
568 | usb_sndbulkpipe(dev->udev, | 568 | usb_sndbulkpipe(dev->udev, |
569 | dev->bulk_out->bEndpointAddress), | 569 | dev->bulk_out->bEndpointAddress), |
diff --git a/drivers/net/can/usb/kvaser_usb/kvaser_usb_hydra.c b/drivers/net/can/usb/kvaser_usb/kvaser_usb_hydra.c index c084bae5ec0a..5fc0be564274 100644 --- a/drivers/net/can/usb/kvaser_usb/kvaser_usb_hydra.c +++ b/drivers/net/can/usb/kvaser_usb/kvaser_usb_hydra.c | |||
@@ -1019,6 +1019,11 @@ kvaser_usb_hydra_error_frame(struct kvaser_usb_net_priv *priv, | |||
1019 | new_state : CAN_STATE_ERROR_ACTIVE; | 1019 | new_state : CAN_STATE_ERROR_ACTIVE; |
1020 | 1020 | ||
1021 | can_change_state(netdev, cf, tx_state, rx_state); | 1021 | can_change_state(netdev, cf, tx_state, rx_state); |
1022 | |||
1023 | if (priv->can.restart_ms && | ||
1024 | old_state >= CAN_STATE_BUS_OFF && | ||
1025 | new_state < CAN_STATE_BUS_OFF) | ||
1026 | cf->can_id |= CAN_ERR_RESTARTED; | ||
1022 | } | 1027 | } |
1023 | 1028 | ||
1024 | if (new_state == CAN_STATE_BUS_OFF) { | 1029 | if (new_state == CAN_STATE_BUS_OFF) { |
@@ -1028,11 +1033,6 @@ kvaser_usb_hydra_error_frame(struct kvaser_usb_net_priv *priv, | |||
1028 | 1033 | ||
1029 | can_bus_off(netdev); | 1034 | can_bus_off(netdev); |
1030 | } | 1035 | } |
1031 | |||
1032 | if (priv->can.restart_ms && | ||
1033 | old_state >= CAN_STATE_BUS_OFF && | ||
1034 | new_state < CAN_STATE_BUS_OFF) | ||
1035 | cf->can_id |= CAN_ERR_RESTARTED; | ||
1036 | } | 1036 | } |
1037 | 1037 | ||
1038 | if (!skb) { | 1038 | if (!skb) { |
diff --git a/drivers/net/can/usb/ucan.c b/drivers/net/can/usb/ucan.c index 0678a38b1af4..f3d5bda012a1 100644 --- a/drivers/net/can/usb/ucan.c +++ b/drivers/net/can/usb/ucan.c | |||
@@ -35,10 +35,6 @@ | |||
35 | #include <linux/slab.h> | 35 | #include <linux/slab.h> |
36 | #include <linux/usb.h> | 36 | #include <linux/usb.h> |
37 | 37 | ||
38 | #include <linux/can.h> | ||
39 | #include <linux/can/dev.h> | ||
40 | #include <linux/can/error.h> | ||
41 | |||
42 | #define UCAN_DRIVER_NAME "ucan" | 38 | #define UCAN_DRIVER_NAME "ucan" |
43 | #define UCAN_MAX_RX_URBS 8 | 39 | #define UCAN_MAX_RX_URBS 8 |
44 | /* the CAN controller needs a while to enable/disable the bus */ | 40 | /* the CAN controller needs a while to enable/disable the bus */ |
@@ -1575,11 +1571,8 @@ err_firmware_needs_update: | |||
1575 | /* disconnect the device */ | 1571 | /* disconnect the device */ |
1576 | static void ucan_disconnect(struct usb_interface *intf) | 1572 | static void ucan_disconnect(struct usb_interface *intf) |
1577 | { | 1573 | { |
1578 | struct usb_device *udev; | ||
1579 | struct ucan_priv *up = usb_get_intfdata(intf); | 1574 | struct ucan_priv *up = usb_get_intfdata(intf); |
1580 | 1575 | ||
1581 | udev = interface_to_usbdev(intf); | ||
1582 | |||
1583 | usb_set_intfdata(intf, NULL); | 1576 | usb_set_intfdata(intf, NULL); |
1584 | 1577 | ||
1585 | if (up) { | 1578 | if (up) { |