Lines Matching +full:channel +full:- +full:fifo +full:- +full:len
1 // SPDX-License-Identifier: GPL-2.0+
2 /* Renesas R-Car CAN FD device driver
7 /* The R-Car CAN FD controller can operate in either one of the below two modes
8 * - CAN FD only mode
9 * - Classical CAN (CAN 2.0) only mode
16 * "renesas,no-can-fd" optional property to the device tree node. A h/w reset is
73 /* Non-operational status */
88 ((gpriv)->fdmode ? RCANFD_GERFL_CMPOF : 0)))
95 (reg_gen4(gpriv, 16, 24) - ((n) & 1) * reg_gen4(gpriv, 16, 8)))
98 (((x) >> (reg_gen4(gpriv, 16, 24) - ((n) & 1) * reg_gen4(gpriv, 16, 8))) & \
111 /* Channel register bits */
113 /* RSCFDnCmCFG - Classical CAN only */
119 /* RSCFDnCFDCmNCFG - CAN FD only */
233 /* Common FIFO bits */
314 /* Common FIFO Control registers */
396 /* RSCFDnRMXXXq -> RCANFD_C_RMXXX(q) */
402 /* RSCFDnRFXXx -> RCANFD_C_RFXX(x) */
409 /* RSCFDnCFXXk -> RCANFD_C_CFXX(ch, k) */
421 /* RSCFDnTMXXp -> RCANFD_C_TMXX(p) */
432 /* R-Car Gen4 Classical and CAN FD mode specific register map */
439 /* RSCFDnCFDCmXXX -> RCANFD_F_XXX(m) */
449 /* RSCFDnCFDRMXXXq -> RCANFD_F_RMXXX(q) */
455 /* RSCFDnCFDRFXXx -> RCANFD_F_RFXX(x) */
463 /* RSCFDnCFDCFXXk -> RCANFD_F_CFXX(ch, k) */
479 /* RSCFDnCFDTMXXp -> RCANFD_F_TMXX(p) */
491 #define RCANFD_FIFO_DEPTH 8 /* Tx FIFO depth */
495 #define RCANFD_CHANNELS_MASK BIT((RCANFD_NUM_CHANNELS) - 1)
498 #define RCANFD_CHANNEL_NUMRULES 1 /* only one rule per channel */
500 /* Rx FIFO is a global resource of the controller. There are 8 such FIFOs
501 * available. Each channel gets a dedicated Rx FIFO (i.e.) the channel
506 /* Tx/Rx or Common FIFO is a per channel resource. Each channel has 3 Common
507 * FIFOs dedicated to them. Use the first (index 0) FIFO out of the 3 for Tx.
518 unsigned multi_channel_irqs:1; /* Has multiple channel irqs */
521 /* Channel priv data */
531 u32 channel; /* Channel number */ member
610 return gpriv->info == &rcar_gen4_hw_info; in is_gen4()
659 lwords = DIV_ROUND_UP(cf->len, sizeof(u32)); in rcar_canfd_get_data()
661 *((u32 *)cf->data + i) = in rcar_canfd_get_data()
662 rcar_canfd_read(priv->base, off + i * sizeof(u32)); in rcar_canfd_get_data()
670 lwords = DIV_ROUND_UP(cf->len, sizeof(u32)); in rcar_canfd_put_data()
672 rcar_canfd_write(priv->base, off + i * sizeof(u32), in rcar_canfd_put_data()
673 *((u32 *)cf->data + i)); in rcar_canfd_put_data()
687 u32 ch, val = gpriv->fdmode ? RCANFD_GEN4_FDCFG_FDOE in rcar_canfd_set_mode()
690 for_each_set_bit(ch, &gpriv->channels_mask, in rcar_canfd_set_mode()
691 gpriv->info->max_channels) in rcar_canfd_set_mode()
692 rcar_canfd_set_bit(gpriv->base, RCANFD_GEN4_FDCFG(ch), in rcar_canfd_set_mode()
695 if (gpriv->fdmode) in rcar_canfd_set_mode()
696 rcar_canfd_set_bit(gpriv->base, RCANFD_GRMCFG, in rcar_canfd_set_mode()
699 rcar_canfd_clear_bit(gpriv->base, RCANFD_GRMCFG, in rcar_canfd_set_mode()
712 err = readl_poll_timeout((gpriv->base + RCANFD_GSTS), sts, in rcar_canfd_reset_controller()
715 dev_dbg(&gpriv->pdev->dev, "global raminit failed\n"); in rcar_canfd_reset_controller()
720 rcar_canfd_clear_bit(gpriv->base, RCANFD_GCTR, RCANFD_GCTR_GSLPR); in rcar_canfd_reset_controller()
721 rcar_canfd_update_bit(gpriv->base, RCANFD_GCTR, in rcar_canfd_reset_controller()
725 err = readl_poll_timeout((gpriv->base + RCANFD_GSTS), sts, in rcar_canfd_reset_controller()
728 dev_dbg(&gpriv->pdev->dev, "global reset failed\n"); in rcar_canfd_reset_controller()
733 rcar_canfd_write(gpriv->base, RCANFD_GERFL, 0x0); in rcar_canfd_reset_controller()
739 for_each_set_bit(ch, &gpriv->channels_mask, gpriv->info->max_channels) { in rcar_canfd_reset_controller()
740 rcar_canfd_clear_bit(gpriv->base, in rcar_canfd_reset_controller()
743 rcar_canfd_update_bit(gpriv->base, RCANFD_CCTR(ch), in rcar_canfd_reset_controller()
747 /* Ensure Channel reset mode */ in rcar_canfd_reset_controller()
748 err = readl_poll_timeout((gpriv->base + RCANFD_CSTS(ch)), sts, in rcar_canfd_reset_controller()
752 dev_dbg(&gpriv->pdev->dev, in rcar_canfd_reset_controller()
753 "channel %u reset failed\n", ch); in rcar_canfd_reset_controller()
769 if (gpriv->fdmode) in rcar_canfd_configure_controller()
774 if (gpriv->extclk) in rcar_canfd_configure_controller()
777 rcar_canfd_set_bit(gpriv->base, RCANFD_GCFG, cfg); in rcar_canfd_configure_controller()
779 /* Channel configuration settings */ in rcar_canfd_configure_controller()
780 for_each_set_bit(ch, &gpriv->channels_mask, gpriv->info->max_channels) { in rcar_canfd_configure_controller()
781 rcar_canfd_set_bit(gpriv->base, RCANFD_CCTR(ch), in rcar_canfd_configure_controller()
783 rcar_canfd_update_bit(gpriv->base, RCANFD_CCTR(ch), in rcar_canfd_configure_controller()
798 rcar_canfd_set_bit(gpriv->base, RCANFD_GAFLECTR, in rcar_canfd_configure_afl_rules()
802 /* Write number of rules for channel */ in rcar_canfd_configure_afl_rules()
803 rcar_canfd_set_bit(gpriv->base, RCANFD_GAFLCFG(ch), in rcar_canfd_configure_afl_rules()
807 else if (gpriv->fdmode) in rcar_canfd_configure_afl_rules()
813 rcar_canfd_write(gpriv->base, RCANFD_GAFLID(offset, rule_entry_index), 0); in rcar_canfd_configure_afl_rules()
815 rcar_canfd_write(gpriv->base, RCANFD_GAFLM(offset, rule_entry_index), 0); in rcar_canfd_configure_afl_rules()
817 rcar_canfd_write(gpriv->base, RCANFD_GAFLP0(offset, rule_entry_index), 0); in rcar_canfd_configure_afl_rules()
818 /* Place the msg in corresponding Rx FIFO entry */ in rcar_canfd_configure_afl_rules()
819 rcar_canfd_set_bit(gpriv->base, RCANFD_GAFLP1(offset, rule_entry_index), in rcar_canfd_configure_afl_rules()
823 rcar_canfd_clear_bit(gpriv->base, in rcar_canfd_configure_afl_rules()
829 /* Rx FIFO is used for reception */ in rcar_canfd_configure_rx()
833 /* Select Rx FIFO based on channel */ in rcar_canfd_configure_rx()
836 rfdc = 2; /* b010 - 8 messages Rx FIFO depth */ in rcar_canfd_configure_rx()
837 if (gpriv->fdmode) in rcar_canfd_configure_rx()
838 rfpls = 7; /* b111 - Max 64 bytes payload */ in rcar_canfd_configure_rx()
840 rfpls = 0; /* b000 - Max 8 bytes payload */ in rcar_canfd_configure_rx()
844 rcar_canfd_write(gpriv->base, RCANFD_RFCC(gpriv, ridx), cfg); in rcar_canfd_configure_rx()
849 /* Tx/Rx(Common) FIFO configured in Tx mode is in rcar_canfd_configure_tx()
852 * Each channel has 3 Common FIFO dedicated to them. in rcar_canfd_configure_tx()
859 cfm = 1; /* b01 - Transmit mode */ in rcar_canfd_configure_tx()
860 cfdc = 2; /* b010 - 8 messages Tx FIFO depth */ in rcar_canfd_configure_tx()
861 if (gpriv->fdmode) in rcar_canfd_configure_tx()
862 cfpls = 7; /* b111 - Max 64 bytes payload */ in rcar_canfd_configure_tx()
864 cfpls = 0; /* b000 - Max 8 bytes payload */ in rcar_canfd_configure_tx()
869 rcar_canfd_write(gpriv->base, RCANFD_CFCC(gpriv, ch, RCANFD_CFFIFO_IDX), cfg); in rcar_canfd_configure_tx()
871 if (gpriv->fdmode) in rcar_canfd_configure_tx()
873 rcar_canfd_write(gpriv->base, in rcar_canfd_configure_tx()
882 rcar_canfd_write(gpriv->base, RCANFD_GERFL, 0); in rcar_canfd_enable_global_interrupts()
886 if (gpriv->fdmode) in rcar_canfd_enable_global_interrupts()
889 rcar_canfd_set_bit(gpriv->base, RCANFD_GCTR, ctr); in rcar_canfd_enable_global_interrupts()
896 rcar_canfd_write(gpriv->base, RCANFD_GCTR, 0); in rcar_canfd_disable_global_interrupts()
899 rcar_canfd_write(gpriv->base, RCANFD_GERFL, 0); in rcar_canfd_disable_global_interrupts()
905 u32 ctr, ch = priv->channel; in rcar_canfd_enable_channel_interrupts()
908 rcar_canfd_write(priv->base, RCANFD_CERFL(ch), 0); in rcar_canfd_enable_channel_interrupts()
910 /* Channel interrupts setup */ in rcar_canfd_enable_channel_interrupts()
916 rcar_canfd_set_bit(priv->base, RCANFD_CCTR(ch), ctr); in rcar_canfd_enable_channel_interrupts()
922 u32 ctr, ch = priv->channel; in rcar_canfd_disable_channel_interrupts()
929 rcar_canfd_clear_bit(priv->base, RCANFD_CCTR(ch), ctr); in rcar_canfd_disable_channel_interrupts()
932 rcar_canfd_write(priv->base, RCANFD_CERFL(ch), 0); in rcar_canfd_disable_channel_interrupts()
938 struct rcar_canfd_global *gpriv = priv->gpriv; in rcar_canfd_global_error()
939 struct net_device_stats *stats = &ndev->stats; in rcar_canfd_global_error()
940 u32 ch = priv->channel; in rcar_canfd_global_error()
944 gerfl = rcar_canfd_read(priv->base, RCANFD_GERFL); in rcar_canfd_global_error()
947 stats->tx_dropped++; in rcar_canfd_global_error()
950 sts = rcar_canfd_read(priv->base, in rcar_canfd_global_error()
954 stats->tx_dropped++; in rcar_canfd_global_error()
955 rcar_canfd_write(priv->base, in rcar_canfd_global_error()
960 sts = rcar_canfd_read(priv->base, RCANFD_RFSTS(gpriv, ridx)); in rcar_canfd_global_error()
963 stats->rx_dropped++; in rcar_canfd_global_error()
964 rcar_canfd_write(priv->base, RCANFD_RFSTS(gpriv, ridx), in rcar_canfd_global_error()
968 if (gpriv->fdmode && gerfl & RCANFD_GERFL_CMPOF) { in rcar_canfd_global_error()
969 /* Message Lost flag will be set for respective channel in rcar_canfd_global_error()
979 rcar_canfd_write(priv->base, RCANFD_GERFL, 0); in rcar_canfd_global_error()
986 struct net_device_stats *stats = &ndev->stats; in rcar_canfd_error()
989 u32 ch = priv->channel; in rcar_canfd_error()
996 stats->rx_dropped++; in rcar_canfd_error()
1000 /* Channel error interrupts */ in rcar_canfd_error()
1003 cf->can_id |= CAN_ERR_BUSERROR | CAN_ERR_PROT; in rcar_canfd_error()
1004 cf->data[2] = CAN_ERR_PROT_UNSPEC; in rcar_canfd_error()
1005 priv->can.can_stats.bus_error++; in rcar_canfd_error()
1009 stats->tx_errors++; in rcar_canfd_error()
1010 cf->data[3] |= CAN_ERR_PROT_LOC_ACK_DEL; in rcar_canfd_error()
1014 stats->tx_errors++; in rcar_canfd_error()
1015 cf->data[2] |= CAN_ERR_PROT_BIT0; in rcar_canfd_error()
1019 stats->tx_errors++; in rcar_canfd_error()
1020 cf->data[2] |= CAN_ERR_PROT_BIT1; in rcar_canfd_error()
1024 stats->rx_errors++; in rcar_canfd_error()
1025 cf->data[3] |= CAN_ERR_PROT_LOC_CRC_SEQ; in rcar_canfd_error()
1029 stats->tx_errors++; in rcar_canfd_error()
1030 cf->can_id |= CAN_ERR_ACK; in rcar_canfd_error()
1031 cf->data[3] |= CAN_ERR_PROT_LOC_ACK; in rcar_canfd_error()
1035 stats->rx_errors++; in rcar_canfd_error()
1036 cf->data[2] |= CAN_ERR_PROT_FORM; in rcar_canfd_error()
1040 stats->rx_errors++; in rcar_canfd_error()
1041 cf->data[2] |= CAN_ERR_PROT_STUFF; in rcar_canfd_error()
1045 priv->can.can_stats.arbitration_lost++; in rcar_canfd_error()
1046 cf->can_id |= CAN_ERR_LOSTARB; in rcar_canfd_error()
1047 cf->data[0] |= CAN_ERR_LOSTARB_UNSPEC; in rcar_canfd_error()
1051 stats->rx_errors++; in rcar_canfd_error()
1052 cf->can_id |= CAN_ERR_BUSERROR; in rcar_canfd_error()
1056 priv->can.state = CAN_STATE_ERROR_WARNING; in rcar_canfd_error()
1057 priv->can.can_stats.error_warning++; in rcar_canfd_error()
1058 cf->can_id |= CAN_ERR_CRTL | CAN_ERR_CNT; in rcar_canfd_error()
1059 cf->data[1] = txerr > rxerr ? CAN_ERR_CRTL_TX_WARNING : in rcar_canfd_error()
1061 cf->data[6] = txerr; in rcar_canfd_error()
1062 cf->data[7] = rxerr; in rcar_canfd_error()
1066 priv->can.state = CAN_STATE_ERROR_PASSIVE; in rcar_canfd_error()
1067 priv->can.can_stats.error_passive++; in rcar_canfd_error()
1068 cf->can_id |= CAN_ERR_CRTL | CAN_ERR_CNT; in rcar_canfd_error()
1069 cf->data[1] = txerr > rxerr ? CAN_ERR_CRTL_TX_PASSIVE : in rcar_canfd_error()
1071 cf->data[6] = txerr; in rcar_canfd_error()
1072 cf->data[7] = rxerr; in rcar_canfd_error()
1075 netdev_dbg(ndev, "Bus-off entry interrupt\n"); in rcar_canfd_error()
1077 priv->can.state = CAN_STATE_BUS_OFF; in rcar_canfd_error()
1078 priv->can.can_stats.bus_off++; in rcar_canfd_error()
1080 cf->can_id |= CAN_ERR_BUSOFF; in rcar_canfd_error()
1085 stats->tx_errors++; in rcar_canfd_error()
1086 cf->can_id |= CAN_ERR_PROT; in rcar_canfd_error()
1087 cf->data[2] |= CAN_ERR_PROT_OVERLOAD; in rcar_canfd_error()
1090 /* Clear channel error interrupts that are handled */ in rcar_canfd_error()
1091 rcar_canfd_write(priv->base, RCANFD_CERFL(ch), in rcar_canfd_error()
1099 struct rcar_canfd_global *gpriv = priv->gpriv; in rcar_canfd_tx_done()
1100 struct net_device_stats *stats = &ndev->stats; in rcar_canfd_tx_done()
1103 u32 ch = priv->channel; in rcar_canfd_tx_done()
1108 sent = priv->tx_tail % RCANFD_FIFO_DEPTH; in rcar_canfd_tx_done()
1109 stats->tx_packets++; in rcar_canfd_tx_done()
1110 stats->tx_bytes += can_get_echo_skb(ndev, sent, NULL); in rcar_canfd_tx_done()
1112 spin_lock_irqsave(&priv->tx_lock, flags); in rcar_canfd_tx_done()
1113 priv->tx_tail++; in rcar_canfd_tx_done()
1114 sts = rcar_canfd_read(priv->base, in rcar_canfd_tx_done()
1122 if (priv->tx_head - priv->tx_tail <= unsent) { in rcar_canfd_tx_done()
1123 spin_unlock_irqrestore(&priv->tx_lock, flags); in rcar_canfd_tx_done()
1126 spin_unlock_irqrestore(&priv->tx_lock, flags); in rcar_canfd_tx_done()
1131 rcar_canfd_write(priv->base, RCANFD_CFSTS(gpriv, ch, RCANFD_CFFIFO_IDX), in rcar_canfd_tx_done()
1137 struct rcar_canfd_channel *priv = gpriv->ch[ch]; in rcar_canfd_handle_global_err()
1138 struct net_device *ndev = priv->ndev; in rcar_canfd_handle_global_err()
1142 gerfl = rcar_canfd_read(priv->base, RCANFD_GERFL); in rcar_canfd_handle_global_err()
1152 for_each_set_bit(ch, &gpriv->channels_mask, gpriv->info->max_channels) in rcar_canfd_global_err_interrupt()
1160 struct rcar_canfd_channel *priv = gpriv->ch[ch]; in rcar_canfd_handle_global_receive()
1165 sts = rcar_canfd_read(priv->base, RCANFD_RFSTS(gpriv, ridx)); in rcar_canfd_handle_global_receive()
1166 cc = rcar_canfd_read(priv->base, RCANFD_RFCC(gpriv, ridx)); in rcar_canfd_handle_global_receive()
1169 if (napi_schedule_prep(&priv->napi)) { in rcar_canfd_handle_global_receive()
1170 /* Disable Rx FIFO interrupts */ in rcar_canfd_handle_global_receive()
1171 rcar_canfd_clear_bit(priv->base, in rcar_canfd_handle_global_receive()
1174 __napi_schedule(&priv->napi); in rcar_canfd_handle_global_receive()
1184 for_each_set_bit(ch, &gpriv->channels_mask, gpriv->info->max_channels) in rcar_canfd_global_receive_fifo_interrupt()
1196 * to a channel. RxFIFO interrupt is a global interrupt. in rcar_canfd_global_interrupt()
1198 for_each_set_bit(ch, &gpriv->channels_mask, gpriv->info->max_channels) { in rcar_canfd_global_interrupt()
1209 struct net_device_stats *stats = &ndev->stats; in rcar_canfd_state_change()
1210 enum can_state rx_state, tx_state, state = priv->can.state; in rcar_canfd_state_change()
1220 if (state != priv->can.state) { in rcar_canfd_state_change()
1222 state, priv->can.state, txerr, rxerr); in rcar_canfd_state_change()
1225 stats->rx_dropped++; in rcar_canfd_state_change()
1238 struct rcar_canfd_channel *priv = gpriv->ch[ch]; in rcar_canfd_handle_channel_tx()
1239 struct net_device *ndev = priv->ndev; in rcar_canfd_handle_channel_tx()
1243 sts = rcar_canfd_read(priv->base, in rcar_canfd_handle_channel_tx()
1253 rcar_canfd_handle_channel_tx(priv->gpriv, priv->channel); in rcar_canfd_channel_tx_interrupt()
1260 struct rcar_canfd_channel *priv = gpriv->ch[ch]; in rcar_canfd_handle_channel_err()
1261 struct net_device *ndev = priv->ndev; in rcar_canfd_handle_channel_err()
1265 /* Handle channel error interrupts */ in rcar_canfd_handle_channel_err()
1266 cerfl = rcar_canfd_read(priv->base, RCANFD_CERFL(ch)); in rcar_canfd_handle_channel_err()
1267 sts = rcar_canfd_read(priv->base, RCANFD_CSTS(ch)); in rcar_canfd_handle_channel_err()
1274 if (unlikely(priv->can.state != CAN_STATE_ERROR_ACTIVE && in rcar_canfd_handle_channel_err()
1275 priv->can.state != CAN_STATE_BUS_OFF)) in rcar_canfd_handle_channel_err()
1283 rcar_canfd_handle_channel_err(priv->gpriv, priv->channel); in rcar_canfd_channel_err_interrupt()
1293 /* Common FIFO is a per channel resource */ in rcar_canfd_channel_interrupt()
1294 for_each_set_bit(ch, &gpriv->channels_mask, gpriv->info->max_channels) { in rcar_canfd_channel_interrupt()
1305 struct rcar_canfd_global *gpriv = priv->gpriv; in rcar_canfd_set_bittiming()
1306 const struct can_bittiming *bt = &priv->can.bittiming; in rcar_canfd_set_bittiming()
1307 const struct can_bittiming *dbt = &priv->can.data_bittiming; in rcar_canfd_set_bittiming()
1310 u32 ch = priv->channel; in rcar_canfd_set_bittiming()
1313 brp = bt->brp - 1; in rcar_canfd_set_bittiming()
1314 sjw = bt->sjw - 1; in rcar_canfd_set_bittiming()
1315 tseg1 = bt->prop_seg + bt->phase_seg1 - 1; in rcar_canfd_set_bittiming()
1316 tseg2 = bt->phase_seg2 - 1; in rcar_canfd_set_bittiming()
1318 if (priv->can.ctrlmode & CAN_CTRLMODE_FD) { in rcar_canfd_set_bittiming()
1323 rcar_canfd_write(priv->base, RCANFD_CCFG(ch), cfg); in rcar_canfd_set_bittiming()
1324 netdev_dbg(priv->ndev, "nrate: brp %u, sjw %u, tseg1 %u, tseg2 %u\n", in rcar_canfd_set_bittiming()
1328 brp = dbt->brp - 1; in rcar_canfd_set_bittiming()
1329 sjw = dbt->sjw - 1; in rcar_canfd_set_bittiming()
1330 tseg1 = dbt->prop_seg + dbt->phase_seg1 - 1; in rcar_canfd_set_bittiming()
1331 tseg2 = dbt->phase_seg2 - 1; in rcar_canfd_set_bittiming()
1336 rcar_canfd_write(priv->base, RCANFD_F_DCFG(gpriv, ch), cfg); in rcar_canfd_set_bittiming()
1337 netdev_dbg(priv->ndev, "drate: brp %u, sjw %u, tseg1 %u, tseg2 %u\n", in rcar_canfd_set_bittiming()
1353 rcar_canfd_write(priv->base, RCANFD_CCFG(ch), cfg); in rcar_canfd_set_bittiming()
1354 netdev_dbg(priv->ndev, in rcar_canfd_set_bittiming()
1363 struct rcar_canfd_global *gpriv = priv->gpriv; in rcar_canfd_start()
1364 int err = -EOPNOTSUPP; in rcar_canfd_start()
1365 u32 sts, ch = priv->channel; in rcar_canfd_start()
1372 /* Set channel to Operational mode */ in rcar_canfd_start()
1373 rcar_canfd_update_bit(priv->base, RCANFD_CCTR(ch), in rcar_canfd_start()
1376 /* Verify channel mode change */ in rcar_canfd_start()
1377 err = readl_poll_timeout((priv->base + RCANFD_CSTS(ch)), sts, in rcar_canfd_start()
1380 netdev_err(ndev, "channel %u communication state failed\n", ch); in rcar_canfd_start()
1384 /* Enable Common & Rx FIFO */ in rcar_canfd_start()
1385 rcar_canfd_set_bit(priv->base, RCANFD_CFCC(gpriv, ch, RCANFD_CFFIFO_IDX), in rcar_canfd_start()
1387 rcar_canfd_set_bit(priv->base, RCANFD_RFCC(gpriv, ridx), RCANFD_RFCC_RFE); in rcar_canfd_start()
1389 priv->can.state = CAN_STATE_ERROR_ACTIVE; in rcar_canfd_start()
1400 struct rcar_canfd_global *gpriv = priv->gpriv; in rcar_canfd_open()
1403 err = phy_power_on(priv->transceiver); in rcar_canfd_open()
1410 err = clk_prepare_enable(gpriv->can_clk); in rcar_canfd_open()
1422 napi_enable(&priv->napi); in rcar_canfd_open()
1429 napi_disable(&priv->napi); in rcar_canfd_open()
1432 clk_disable_unprepare(gpriv->can_clk); in rcar_canfd_open()
1434 phy_power_off(priv->transceiver); in rcar_canfd_open()
1441 struct rcar_canfd_global *gpriv = priv->gpriv; in rcar_canfd_stop()
1443 u32 sts, ch = priv->channel; in rcar_canfd_stop()
1446 /* Transition to channel reset mode */ in rcar_canfd_stop()
1447 rcar_canfd_update_bit(priv->base, RCANFD_CCTR(ch), in rcar_canfd_stop()
1450 /* Check Channel reset mode */ in rcar_canfd_stop()
1451 err = readl_poll_timeout((priv->base + RCANFD_CSTS(ch)), sts, in rcar_canfd_stop()
1454 netdev_err(ndev, "channel %u reset failed\n", ch); in rcar_canfd_stop()
1458 /* Disable Common & Rx FIFO */ in rcar_canfd_stop()
1459 rcar_canfd_clear_bit(priv->base, RCANFD_CFCC(gpriv, ch, RCANFD_CFFIFO_IDX), in rcar_canfd_stop()
1461 rcar_canfd_clear_bit(priv->base, RCANFD_RFCC(gpriv, ridx), RCANFD_RFCC_RFE); in rcar_canfd_stop()
1464 priv->can.state = CAN_STATE_STOPPED; in rcar_canfd_stop()
1470 struct rcar_canfd_global *gpriv = priv->gpriv; in rcar_canfd_close()
1474 napi_disable(&priv->napi); in rcar_canfd_close()
1475 clk_disable_unprepare(gpriv->can_clk); in rcar_canfd_close()
1477 phy_power_off(priv->transceiver); in rcar_canfd_close()
1485 struct rcar_canfd_global *gpriv = priv->gpriv; in rcar_canfd_start_xmit()
1486 struct canfd_frame *cf = (struct canfd_frame *)skb->data; in rcar_canfd_start_xmit()
1489 u32 ch = priv->channel; in rcar_canfd_start_xmit()
1494 if (cf->can_id & CAN_EFF_FLAG) { in rcar_canfd_start_xmit()
1495 id = cf->can_id & CAN_EFF_MASK; in rcar_canfd_start_xmit()
1498 id = cf->can_id & CAN_SFF_MASK; in rcar_canfd_start_xmit()
1501 if (cf->can_id & CAN_RTR_FLAG) in rcar_canfd_start_xmit()
1504 dlc = RCANFD_CFPTR_CFDLC(can_fd_len2dlc(cf->len)); in rcar_canfd_start_xmit()
1506 if ((priv->can.ctrlmode & CAN_CTRLMODE_FD) || is_gen4(gpriv)) { in rcar_canfd_start_xmit()
1507 rcar_canfd_write(priv->base, in rcar_canfd_start_xmit()
1509 rcar_canfd_write(priv->base, in rcar_canfd_start_xmit()
1515 if (cf->flags & CANFD_BRS) in rcar_canfd_start_xmit()
1518 if (priv->can.state == CAN_STATE_ERROR_PASSIVE) in rcar_canfd_start_xmit()
1522 rcar_canfd_write(priv->base, in rcar_canfd_start_xmit()
1528 rcar_canfd_write(priv->base, in rcar_canfd_start_xmit()
1530 rcar_canfd_write(priv->base, in rcar_canfd_start_xmit()
1536 can_put_echo_skb(skb, ndev, priv->tx_head % RCANFD_FIFO_DEPTH, 0); in rcar_canfd_start_xmit()
1538 spin_lock_irqsave(&priv->tx_lock, flags); in rcar_canfd_start_xmit()
1539 priv->tx_head++; in rcar_canfd_start_xmit()
1541 /* Stop the queue if we've filled all FIFO entries */ in rcar_canfd_start_xmit()
1542 if (priv->tx_head - priv->tx_tail >= RCANFD_FIFO_DEPTH) in rcar_canfd_start_xmit()
1545 /* Start Tx: Write 0xff to CFPC to increment the CPU-side in rcar_canfd_start_xmit()
1546 * pointer for the Common FIFO in rcar_canfd_start_xmit()
1548 rcar_canfd_write(priv->base, in rcar_canfd_start_xmit()
1551 spin_unlock_irqrestore(&priv->tx_lock, flags); in rcar_canfd_start_xmit()
1557 struct net_device_stats *stats = &priv->ndev->stats; in rcar_canfd_rx_pkt()
1558 struct rcar_canfd_global *gpriv = priv->gpriv; in rcar_canfd_rx_pkt()
1562 u32 ch = priv->channel; in rcar_canfd_rx_pkt()
1565 if ((priv->can.ctrlmode & CAN_CTRLMODE_FD) || is_gen4(gpriv)) { in rcar_canfd_rx_pkt()
1566 id = rcar_canfd_read(priv->base, RCANFD_F_RFID(gpriv, ridx)); in rcar_canfd_rx_pkt()
1567 dlc = rcar_canfd_read(priv->base, RCANFD_F_RFPTR(gpriv, ridx)); in rcar_canfd_rx_pkt()
1569 sts = rcar_canfd_read(priv->base, RCANFD_F_RFFDSTS(gpriv, ridx)); in rcar_canfd_rx_pkt()
1571 if ((priv->can.ctrlmode & CAN_CTRLMODE_FD) && in rcar_canfd_rx_pkt()
1573 skb = alloc_canfd_skb(priv->ndev, &cf); in rcar_canfd_rx_pkt()
1575 skb = alloc_can_skb(priv->ndev, in rcar_canfd_rx_pkt()
1578 id = rcar_canfd_read(priv->base, RCANFD_C_RFID(ridx)); in rcar_canfd_rx_pkt()
1579 dlc = rcar_canfd_read(priv->base, RCANFD_C_RFPTR(ridx)); in rcar_canfd_rx_pkt()
1580 skb = alloc_can_skb(priv->ndev, (struct can_frame **)&cf); in rcar_canfd_rx_pkt()
1584 stats->rx_dropped++; in rcar_canfd_rx_pkt()
1589 cf->can_id = (id & CAN_EFF_MASK) | CAN_EFF_FLAG; in rcar_canfd_rx_pkt()
1591 cf->can_id = id & CAN_SFF_MASK; in rcar_canfd_rx_pkt()
1593 if (priv->can.ctrlmode & CAN_CTRLMODE_FD) { in rcar_canfd_rx_pkt()
1595 cf->len = can_fd_dlc2len(RCANFD_RFPTR_RFDLC(dlc)); in rcar_canfd_rx_pkt()
1597 cf->len = can_cc_dlc2len(RCANFD_RFPTR_RFDLC(dlc)); in rcar_canfd_rx_pkt()
1600 cf->flags |= CANFD_ESI; in rcar_canfd_rx_pkt()
1601 netdev_dbg(priv->ndev, "ESI Error\n"); in rcar_canfd_rx_pkt()
1605 cf->can_id |= CAN_RTR_FLAG; in rcar_canfd_rx_pkt()
1608 cf->flags |= CANFD_BRS; in rcar_canfd_rx_pkt()
1613 cf->len = can_cc_dlc2len(RCANFD_RFPTR_RFDLC(dlc)); in rcar_canfd_rx_pkt()
1615 cf->can_id |= CAN_RTR_FLAG; in rcar_canfd_rx_pkt()
1622 /* Write 0xff to RFPC to increment the CPU-side in rcar_canfd_rx_pkt()
1623 * pointer of the Rx FIFO in rcar_canfd_rx_pkt()
1625 rcar_canfd_write(priv->base, RCANFD_RFPCTR(gpriv, ridx), 0xff); in rcar_canfd_rx_pkt()
1627 if (!(cf->can_id & CAN_RTR_FLAG)) in rcar_canfd_rx_pkt()
1628 stats->rx_bytes += cf->len; in rcar_canfd_rx_pkt()
1629 stats->rx_packets++; in rcar_canfd_rx_pkt()
1637 struct rcar_canfd_global *gpriv = priv->gpriv; in rcar_canfd_rx_poll()
1640 u32 ch = priv->channel; in rcar_canfd_rx_poll()
1644 sts = rcar_canfd_read(priv->base, RCANFD_RFSTS(gpriv, ridx)); in rcar_canfd_rx_poll()
1645 /* Check FIFO empty condition */ in rcar_canfd_rx_poll()
1653 rcar_canfd_write(priv->base, RCANFD_RFSTS(gpriv, ridx), in rcar_canfd_rx_poll()
1660 /* Enable Rx FIFO interrupts */ in rcar_canfd_rx_poll()
1661 rcar_canfd_set_bit(priv->base, RCANFD_RFCC(gpriv, ridx), in rcar_canfd_rx_poll()
1680 return -EOPNOTSUPP; in rcar_canfd_do_set_mode()
1688 u32 val, ch = priv->channel; in rcar_canfd_get_berr_counter()
1691 val = rcar_canfd_read(priv->base, RCANFD_CSTS(ch)); in rcar_canfd_get_berr_counter()
1692 bec->txerr = RCANFD_CSTS_TECCNT(val); in rcar_canfd_get_berr_counter()
1693 bec->rxerr = RCANFD_CSTS_RECCNT(val); in rcar_canfd_get_berr_counter()
1711 const struct rcar_canfd_hw_info *info = gpriv->info; in rcar_canfd_channel_probe()
1712 struct platform_device *pdev = gpriv->pdev; in rcar_canfd_channel_probe()
1713 struct device *dev = &pdev->dev; in rcar_canfd_channel_probe()
1716 int err = -ENODEV; in rcar_canfd_channel_probe()
1720 return -ENOMEM; in rcar_canfd_channel_probe()
1724 ndev->netdev_ops = &rcar_canfd_netdev_ops; in rcar_canfd_channel_probe()
1725 ndev->ethtool_ops = &rcar_canfd_ethtool_ops; in rcar_canfd_channel_probe()
1726 ndev->flags |= IFF_ECHO; in rcar_canfd_channel_probe()
1727 priv->ndev = ndev; in rcar_canfd_channel_probe()
1728 priv->base = gpriv->base; in rcar_canfd_channel_probe()
1729 priv->transceiver = transceiver; in rcar_canfd_channel_probe()
1730 priv->channel = ch; in rcar_canfd_channel_probe()
1731 priv->gpriv = gpriv; in rcar_canfd_channel_probe()
1733 priv->can.bitrate_max = transceiver->attrs.max_link_rate; in rcar_canfd_channel_probe()
1734 priv->can.clock.freq = fcan_freq; in rcar_canfd_channel_probe()
1735 dev_info(dev, "can_clk rate is %u\n", priv->can.clock.freq); in rcar_canfd_channel_probe()
1737 if (info->multi_channel_irqs) { in rcar_canfd_channel_probe()
1757 err = -ENOMEM; in rcar_canfd_channel_probe()
1771 err = -ENOMEM; in rcar_canfd_channel_probe()
1784 if (gpriv->fdmode) { in rcar_canfd_channel_probe()
1785 priv->can.bittiming_const = &rcar_canfd_nom_bittiming_const; in rcar_canfd_channel_probe()
1786 priv->can.data_bittiming_const = in rcar_canfd_channel_probe()
1793 priv->can.ctrlmode_supported = CAN_CTRLMODE_BERR_REPORTING; in rcar_canfd_channel_probe()
1796 priv->can.bittiming_const = &rcar_canfd_bittiming_const; in rcar_canfd_channel_probe()
1797 priv->can.ctrlmode_supported = CAN_CTRLMODE_BERR_REPORTING; in rcar_canfd_channel_probe()
1800 priv->can.do_set_mode = rcar_canfd_do_set_mode; in rcar_canfd_channel_probe()
1801 priv->can.do_get_berr_counter = rcar_canfd_get_berr_counter; in rcar_canfd_channel_probe()
1804 netif_napi_add_weight(ndev, &priv->napi, rcar_canfd_rx_poll, in rcar_canfd_channel_probe()
1806 spin_lock_init(&priv->tx_lock); in rcar_canfd_channel_probe()
1807 gpriv->ch[priv->channel] = priv; in rcar_canfd_channel_probe()
1813 dev_info(dev, "device registered (channel %u)\n", priv->channel); in rcar_canfd_channel_probe()
1817 netif_napi_del(&priv->napi); in rcar_canfd_channel_probe()
1825 struct rcar_canfd_channel *priv = gpriv->ch[ch]; in rcar_canfd_channel_remove()
1828 unregister_candev(priv->ndev); in rcar_canfd_channel_remove()
1829 netif_napi_del(&priv->napi); in rcar_canfd_channel_remove()
1830 free_candev(priv->ndev); in rcar_canfd_channel_remove()
1838 struct device *dev = &pdev->dev; in rcar_canfd_probe()
1847 bool fdmode = true; /* CAN FD only mode - default */ in rcar_canfd_probe()
1853 if (of_property_read_bool(dev->of_node, "renesas,no-can-fd")) in rcar_canfd_probe()
1856 for (i = 0; i < info->max_channels; ++i) { in rcar_canfd_probe()
1858 of_child = of_get_child_by_name(dev->of_node, name); in rcar_canfd_probe()
1869 if (info->shared_global_irqs) { in rcar_canfd_probe()
1898 return -ENOMEM; in rcar_canfd_probe()
1900 gpriv->pdev = pdev; in rcar_canfd_probe()
1901 gpriv->channels_mask = channels_mask; in rcar_canfd_probe()
1902 gpriv->fdmode = fdmode; in rcar_canfd_probe()
1903 gpriv->info = info; in rcar_canfd_probe()
1905 gpriv->rstc1 = devm_reset_control_get_optional_exclusive(dev, "rstp_n"); in rcar_canfd_probe()
1906 if (IS_ERR(gpriv->rstc1)) in rcar_canfd_probe()
1907 return dev_err_probe(dev, PTR_ERR(gpriv->rstc1), in rcar_canfd_probe()
1910 gpriv->rstc2 = devm_reset_control_get_optional_exclusive(dev, "rstc_n"); in rcar_canfd_probe()
1911 if (IS_ERR(gpriv->rstc2)) in rcar_canfd_probe()
1912 return dev_err_probe(dev, PTR_ERR(gpriv->rstc2), in rcar_canfd_probe()
1916 gpriv->clkp = devm_clk_get(dev, "fck"); in rcar_canfd_probe()
1917 if (IS_ERR(gpriv->clkp)) in rcar_canfd_probe()
1918 return dev_err_probe(dev, PTR_ERR(gpriv->clkp), in rcar_canfd_probe()
1924 gpriv->can_clk = devm_clk_get(dev, "can_clk"); in rcar_canfd_probe()
1925 if (IS_ERR(gpriv->can_clk) || (clk_get_rate(gpriv->can_clk) == 0)) { in rcar_canfd_probe()
1926 gpriv->can_clk = devm_clk_get(dev, "canfd"); in rcar_canfd_probe()
1927 if (IS_ERR(gpriv->can_clk)) in rcar_canfd_probe()
1928 return dev_err_probe(dev, PTR_ERR(gpriv->can_clk), in rcar_canfd_probe()
1932 fcan_freq = clk_get_rate(gpriv->can_clk) / info->postdiv; in rcar_canfd_probe()
1934 fcan_freq = clk_get_rate(gpriv->can_clk); in rcar_canfd_probe()
1935 gpriv->extclk = true; in rcar_canfd_probe()
1943 gpriv->base = addr; in rcar_canfd_probe()
1946 if (info->shared_global_irqs) { in rcar_canfd_probe()
1984 err = reset_control_reset(gpriv->rstc1); in rcar_canfd_probe()
1987 err = reset_control_reset(gpriv->rstc2); in rcar_canfd_probe()
1989 reset_control_assert(gpriv->rstc1); in rcar_canfd_probe()
1994 err = clk_prepare_enable(gpriv->clkp); in rcar_canfd_probe()
2007 /* Controller in Global reset & Channel reset mode */ in rcar_canfd_probe()
2010 /* Configure per channel attributes */ in rcar_canfd_probe()
2011 for_each_set_bit(ch, &gpriv->channels_mask, info->max_channels) { in rcar_canfd_probe()
2012 /* Configure Channel's Rx fifo */ in rcar_canfd_probe()
2015 /* Configure Channel's Tx (Common) fifo */ in rcar_canfd_probe()
2027 rcar_canfd_update_bit(gpriv->base, RCANFD_GCTR, RCANFD_GCTR_GMDC_MASK, in rcar_canfd_probe()
2031 err = readl_poll_timeout((gpriv->base + RCANFD_GSTS), sts, in rcar_canfd_probe()
2038 for_each_set_bit(ch, &gpriv->channels_mask, info->max_channels) { in rcar_canfd_probe()
2047 gpriv->extclk ? "ext" : "canfd", in rcar_canfd_probe()
2048 gpriv->fdmode ? "fd" : "classical"); in rcar_canfd_probe()
2052 for_each_set_bit(ch, &gpriv->channels_mask, info->max_channels) in rcar_canfd_probe()
2057 clk_disable_unprepare(gpriv->clkp); in rcar_canfd_probe()
2059 reset_control_assert(gpriv->rstc1); in rcar_canfd_probe()
2060 reset_control_assert(gpriv->rstc2); in rcar_canfd_probe()
2073 for_each_set_bit(ch, &gpriv->channels_mask, gpriv->info->max_channels) { in rcar_canfd_remove()
2074 rcar_canfd_disable_channel_interrupts(gpriv->ch[ch]); in rcar_canfd_remove()
2079 rcar_canfd_set_bit(gpriv->base, RCANFD_GCTR, RCANFD_GCTR_GSLPR); in rcar_canfd_remove()
2080 clk_disable_unprepare(gpriv->clkp); in rcar_canfd_remove()
2081 reset_control_assert(gpriv->rstc1); in rcar_canfd_remove()
2082 reset_control_assert(gpriv->rstc2); in rcar_canfd_remove()
2099 { .compatible = "renesas,r8a779a0-canfd", .data = &rcar_gen4_hw_info },
2100 { .compatible = "renesas,rcar-gen3-canfd", .data = &rcar_gen3_hw_info },
2101 { .compatible = "renesas,rcar-gen4-canfd", .data = &rcar_gen4_hw_info },
2102 { .compatible = "renesas,rzg2l-canfd", .data = &rzg2l_hw_info },
2122 MODULE_DESCRIPTION("CAN FD driver for Renesas R-Car SoC");