aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/can
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/net/can')
-rw-r--r--drivers/net/can/dev.c48
-rw-r--r--drivers/net/can/flexcan.c108
-rw-r--r--drivers/net/can/rcar/rcar_can.c5
-rw-r--r--drivers/net/can/rx-offload.c51
-rw-r--r--drivers/net/can/spi/hi311x.c2
-rw-r--r--drivers/net/can/usb/kvaser_usb/kvaser_usb_core.c4
-rw-r--r--drivers/net/can/usb/kvaser_usb/kvaser_usb_hydra.c10
-rw-r--r--drivers/net/can/usb/ucan.c7
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}
478EXPORT_SYMBOL_GPL(can_put_echo_skb); 478EXPORT_SYMBOL_GPL(can_put_echo_skb);
479 479
480struct 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 */
487unsigned int can_get_echo_skb(struct net_device *dev, unsigned int idx) 515unsigned 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}
506EXPORT_SYMBOL_GPL(can_get_echo_skb); 528EXPORT_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,
515static netdev_tx_t flexcan_start_xmit(struct sk_buff *skb, struct net_device *dev) 512static 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, &regs->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, &regs->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, &regs->mb[FLEXCAN_TX_MB].can_id);
550 priv->write(ctrl, &priv->tx_mb->can_ctrl); 548 priv->write(ctrl, &regs->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
563static void flexcan_irq_bus_err(struct net_device *dev, u32 reg_esr) 561static 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(&regs->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
618static void flexcan_irq_state(struct net_device *dev, u32 reg_esr) 620static 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(&regs->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
658static inline struct flexcan_priv *rx_offload_to_priv(struct can_rx_offload *offload) 664static 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), &regs->iflag2); 726 priv->write(BIT(n - 32), &regs->iflag2);
721 } else { 727 } else {
722 priv->write(FLEXCAN_IFLAG_RX_FIFO_AVAILABLE, &regs->iflag1); 728 priv->write(FLEXCAN_IFLAG_RX_FIFO_AVAILABLE, &regs->iflag1);
723 priv->read(&regs->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(&regs->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(&regs->iflag2) & priv->reg_imask2_default; 746 iflag2 = priv->read(&regs->iflag2) & priv->reg_imask2_default &
736 iflag1 = priv->read(&regs->iflag1) & priv->reg_imask1_default & 747 ~FLEXCAN_IFLAG_MB(FLEXCAN_TX_MB);
737 ~FLEXCAN_IFLAG_MB(priv->tx_mb_idx); 748 iflag1 = priv->read(&regs->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(&regs->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(&regs->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(&regs->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(&regs->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 &regs->mb[FLEXCAN_TX_MB].can_ctrl);
792 priv->write(FLEXCAN_IFLAG_MB(priv->tx_mb_idx), &regs->iflag1); 809 priv->write(FLEXCAN_IFLAG_MB(FLEXCAN_TX_MB), &regs->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, &regs->mcr); 959 priv->write(reg_mcr, &regs->mcr);
945 960
@@ -982,16 +997,17 @@ static int flexcan_chip_start(struct net_device *dev)
982 priv->write(reg_ctrl2, &regs->ctrl2); 997 priv->write(reg_ctrl2, &regs->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 &regs->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 &regs->mb[i].can_ctrl); 1003 &regs->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 &regs->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 &regs->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, &regs->rxgmask); 1022 priv->write(0x0, &regs->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 = &regs->mb[FLEXCAN_TX_MB_RESERVED_OFF_TIMESTAMP]; 1375 priv->tx_mb_reserved = &regs->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 = &regs->mb[FLEXCAN_TX_MB_RESERVED_OFF_FIFO]; 1377 priv->tx_mb_reserved = &regs->mb[FLEXCAN_TX_MB_RESERVED_OFF_FIFO];
1364 }
1365 priv->tx_mb = &regs->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}
212EXPORT_SYMBOL_GPL(can_rx_offload_irq_offload_fifo); 212EXPORT_SYMBOL_GPL(can_rx_offload_irq_offload_fifo);
213 213
214int can_rx_offload_irq_queue_err_skb(struct can_rx_offload *offload, struct sk_buff *skb) 214int 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}
235EXPORT_SYMBOL_GPL(can_rx_offload_queue_sorted);
236
237unsigned 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}
258EXPORT_SYMBOL_GPL(can_rx_offload_get_echo_skb);
259
260int 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}
225EXPORT_SYMBOL_GPL(can_rx_offload_irq_queue_err_skb); 272EXPORT_SYMBOL_GPL(can_rx_offload_queue_tail);
226 273
227static int can_rx_offload_init_queue(struct net_device *dev, struct can_rx_offload *offload, unsigned int weight) 274static 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 */
1576static void ucan_disconnect(struct usb_interface *intf) 1572static 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) {