554 lines · c
1/* SPDX-License-Identifier: GPL-2.02 *3 * Copyright (c) 2023, 2024 Pengutronix,4 * Marc Kleine-Budde <kernel@pengutronix.de>5 */6 7#ifndef _ROCKCHIP_CANFD_H8#define _ROCKCHIP_CANFD_H9 10#include <linux/bitfield.h>11#include <linux/can/dev.h>12#include <linux/can/rx-offload.h>13#include <linux/clk.h>14#include <linux/io.h>15#include <linux/netdevice.h>16#include <linux/reset.h>17#include <linux/skbuff.h>18#include <linux/timecounter.h>19#include <linux/types.h>20#include <linux/u64_stats_sync.h>21#include <linux/units.h>22 23#define RKCANFD_REG_MODE 0x00024#define RKCANFD_REG_MODE_CAN_FD_MODE_ENABLE BIT(15)25#define RKCANFD_REG_MODE_DPEE BIT(14)26#define RKCANFD_REG_MODE_BRSD BIT(13)27#define RKCANFD_REG_MODE_SPACE_RX_MODE BIT(12)28#define RKCANFD_REG_MODE_AUTO_BUS_ON BIT(11)29#define RKCANFD_REG_MODE_AUTO_RETX_MODE BIT(10)30#define RKCANFD_REG_MODE_OVLD_MODE BIT(9)31#define RKCANFD_REG_MODE_COVER_MODE BIT(8)32#define RKCANFD_REG_MODE_RXSORT_MODE BIT(7)33#define RKCANFD_REG_MODE_TXORDER_MODE BIT(6)34#define RKCANFD_REG_MODE_RXSTX_MODE BIT(5)35#define RKCANFD_REG_MODE_LBACK_MODE BIT(4)36#define RKCANFD_REG_MODE_SILENT_MODE BIT(3)37#define RKCANFD_REG_MODE_SELF_TEST BIT(2)38#define RKCANFD_REG_MODE_SLEEP_MODE BIT(1)39#define RKCANFD_REG_MODE_WORK_MODE BIT(0)40 41#define RKCANFD_REG_CMD 0x00442#define RKCANFD_REG_CMD_TX1_REQ BIT(1)43#define RKCANFD_REG_CMD_TX0_REQ BIT(0)44#define RKCANFD_REG_CMD_TX_REQ(i) (RKCANFD_REG_CMD_TX0_REQ << (i))45 46#define RKCANFD_REG_STATE 0x00847#define RKCANFD_REG_STATE_SLEEP_STATE BIT(6)48#define RKCANFD_REG_STATE_BUS_OFF_STATE BIT(5)49#define RKCANFD_REG_STATE_ERROR_WARNING_STATE BIT(4)50#define RKCANFD_REG_STATE_TX_PERIOD BIT(3)51#define RKCANFD_REG_STATE_RX_PERIOD BIT(2)52#define RKCANFD_REG_STATE_TX_BUFFER_FULL BIT(1)53#define RKCANFD_REG_STATE_RX_BUFFER_FULL BIT(0)54 55#define RKCANFD_REG_INT 0x00c56#define RKCANFD_REG_INT_WAKEUP_INT BIT(14)57#define RKCANFD_REG_INT_TXE_FIFO_FULL_INT BIT(13)58#define RKCANFD_REG_INT_TXE_FIFO_OV_INT BIT(12)59#define RKCANFD_REG_INT_TIMESTAMP_COUNTER_OVERFLOW_INT BIT(11)60#define RKCANFD_REG_INT_BUS_OFF_RECOVERY_INT BIT(10)61#define RKCANFD_REG_INT_BUS_OFF_INT BIT(9)62#define RKCANFD_REG_INT_RX_FIFO_OVERFLOW_INT BIT(8)63#define RKCANFD_REG_INT_RX_FIFO_FULL_INT BIT(7)64#define RKCANFD_REG_INT_ERROR_INT BIT(6)65#define RKCANFD_REG_INT_TX_ARBIT_FAIL_INT BIT(5)66#define RKCANFD_REG_INT_PASSIVE_ERROR_INT BIT(4)67#define RKCANFD_REG_INT_OVERLOAD_INT BIT(3)68#define RKCANFD_REG_INT_ERROR_WARNING_INT BIT(2)69#define RKCANFD_REG_INT_TX_FINISH_INT BIT(1)70#define RKCANFD_REG_INT_RX_FINISH_INT BIT(0)71 72#define RKCANFD_REG_INT_ALL \73 (RKCANFD_REG_INT_WAKEUP_INT | \74 RKCANFD_REG_INT_TXE_FIFO_FULL_INT | \75 RKCANFD_REG_INT_TXE_FIFO_OV_INT | \76 RKCANFD_REG_INT_TIMESTAMP_COUNTER_OVERFLOW_INT | \77 RKCANFD_REG_INT_BUS_OFF_RECOVERY_INT | \78 RKCANFD_REG_INT_BUS_OFF_INT | \79 RKCANFD_REG_INT_RX_FIFO_OVERFLOW_INT | \80 RKCANFD_REG_INT_RX_FIFO_FULL_INT | \81 RKCANFD_REG_INT_ERROR_INT | \82 RKCANFD_REG_INT_TX_ARBIT_FAIL_INT | \83 RKCANFD_REG_INT_PASSIVE_ERROR_INT | \84 RKCANFD_REG_INT_OVERLOAD_INT | \85 RKCANFD_REG_INT_ERROR_WARNING_INT | \86 RKCANFD_REG_INT_TX_FINISH_INT | \87 RKCANFD_REG_INT_RX_FINISH_INT)88 89#define RKCANFD_REG_INT_ALL_ERROR \90 (RKCANFD_REG_INT_BUS_OFF_INT | \91 RKCANFD_REG_INT_ERROR_INT | \92 RKCANFD_REG_INT_PASSIVE_ERROR_INT | \93 RKCANFD_REG_INT_ERROR_WARNING_INT)94 95#define RKCANFD_REG_INT_MASK 0x01096 97#define RKCANFD_REG_DMA_CTL 0x01498#define RKCANFD_REG_DMA_CTL_DMA_RX_MODE BIT(1)99#define RKCANFD_REG_DMA_CTL_DMA_TX_MODE BIT(9)100 101#define RKCANFD_REG_BITTIMING 0x018102#define RKCANFD_REG_BITTIMING_SAMPLE_MODE BIT(16)103#define RKCANFD_REG_BITTIMING_SJW GENMASK(15, 14)104#define RKCANFD_REG_BITTIMING_BRP GENMASK(13, 8)105#define RKCANFD_REG_BITTIMING_TSEG2 GENMASK(6, 4)106#define RKCANFD_REG_BITTIMING_TSEG1 GENMASK(3, 0)107 108#define RKCANFD_REG_ARBITFAIL 0x028109#define RKCANFD_REG_ARBITFAIL_ARBIT_FAIL_CODE GENMASK(6, 0)110 111/* Register seems to be clear or read */112#define RKCANFD_REG_ERROR_CODE 0x02c113#define RKCANFD_REG_ERROR_CODE_PHASE BIT(29)114#define RKCANFD_REG_ERROR_CODE_TYPE GENMASK(28, 26)115#define RKCANFD_REG_ERROR_CODE_TYPE_BIT 0x0116#define RKCANFD_REG_ERROR_CODE_TYPE_STUFF 0x1117#define RKCANFD_REG_ERROR_CODE_TYPE_FORM 0x2118#define RKCANFD_REG_ERROR_CODE_TYPE_ACK 0x3119#define RKCANFD_REG_ERROR_CODE_TYPE_CRC 0x4120#define RKCANFD_REG_ERROR_CODE_DIRECTION_RX BIT(25)121#define RKCANFD_REG_ERROR_CODE_TX GENMASK(24, 16)122#define RKCANFD_REG_ERROR_CODE_TX_OVERLOAD BIT(24)123#define RKCANFD_REG_ERROR_CODE_TX_ERROR BIT(23)124#define RKCANFD_REG_ERROR_CODE_TX_ACK BIT(22)125#define RKCANFD_REG_ERROR_CODE_TX_ACK_EOF BIT(21)126#define RKCANFD_REG_ERROR_CODE_TX_CRC BIT(20)127#define RKCANFD_REG_ERROR_CODE_TX_STUFF_COUNT BIT(19)128#define RKCANFD_REG_ERROR_CODE_TX_DATA BIT(18)129#define RKCANFD_REG_ERROR_CODE_TX_SOF_DLC BIT(17)130#define RKCANFD_REG_ERROR_CODE_TX_IDLE BIT(16)131#define RKCANFD_REG_ERROR_CODE_RX GENMASK(15, 0)132#define RKCANFD_REG_ERROR_CODE_RX_BUF_INT BIT(15)133#define RKCANFD_REG_ERROR_CODE_RX_SPACE BIT(14)134#define RKCANFD_REG_ERROR_CODE_RX_EOF BIT(13)135#define RKCANFD_REG_ERROR_CODE_RX_ACK_LIM BIT(12)136#define RKCANFD_REG_ERROR_CODE_RX_ACK BIT(11)137#define RKCANFD_REG_ERROR_CODE_RX_CRC_LIM BIT(10)138#define RKCANFD_REG_ERROR_CODE_RX_CRC BIT(9)139#define RKCANFD_REG_ERROR_CODE_RX_STUFF_COUNT BIT(8)140#define RKCANFD_REG_ERROR_CODE_RX_DATA BIT(7)141#define RKCANFD_REG_ERROR_CODE_RX_DLC BIT(6)142#define RKCANFD_REG_ERROR_CODE_RX_BRS_ESI BIT(5)143#define RKCANFD_REG_ERROR_CODE_RX_RES BIT(4)144#define RKCANFD_REG_ERROR_CODE_RX_FDF BIT(3)145#define RKCANFD_REG_ERROR_CODE_RX_ID2_RTR BIT(2)146#define RKCANFD_REG_ERROR_CODE_RX_SOF_IDE BIT(1)147#define RKCANFD_REG_ERROR_CODE_RX_IDLE BIT(0)148 149#define RKCANFD_REG_ERROR_CODE_NOACK \150 (FIELD_PREP(RKCANFD_REG_ERROR_CODE_TYPE, \151 RKCANFD_REG_ERROR_CODE_TYPE_ACK) | \152 RKCANFD_REG_ERROR_CODE_TX_ACK_EOF | \153 RKCANFD_REG_ERROR_CODE_RX_ACK)154 155#define RKCANFD_REG_RXERRORCNT 0x034156#define RKCANFD_REG_RXERRORCNT_RX_ERR_CNT GENMASK(7, 0)157 158#define RKCANFD_REG_TXERRORCNT 0x038159#define RKCANFD_REG_TXERRORCNT_TX_ERR_CNT GENMASK(8, 0)160 161#define RKCANFD_REG_IDCODE 0x03c162#define RKCANFD_REG_IDCODE_STANDARD_FRAME_ID GENMASK(10, 0)163#define RKCANFD_REG_IDCODE_EXTENDED_FRAME_ID GENMASK(28, 0)164 165#define RKCANFD_REG_IDMASK 0x040166 167#define RKCANFD_REG_TXFRAMEINFO 0x050168#define RKCANFD_REG_FRAMEINFO_FRAME_FORMAT BIT(7)169#define RKCANFD_REG_FRAMEINFO_RTR BIT(6)170#define RKCANFD_REG_FRAMEINFO_DATA_LENGTH GENMASK(3, 0)171 172#define RKCANFD_REG_TXID 0x054173#define RKCANFD_REG_TXID_TX_ID GENMASK(28, 0)174 175#define RKCANFD_REG_TXDATA0 0x058176#define RKCANFD_REG_TXDATA1 0x05C177#define RKCANFD_REG_RXFRAMEINFO 0x060178#define RKCANFD_REG_RXID 0x064179#define RKCANFD_REG_RXDATA0 0x068180#define RKCANFD_REG_RXDATA1 0x06c181 182#define RKCANFD_REG_RTL_VERSION 0x070183#define RKCANFD_REG_RTL_VERSION_MAJOR GENMASK(7, 4)184#define RKCANFD_REG_RTL_VERSION_MINOR GENMASK(3, 0)185 186#define RKCANFD_REG_FD_NOMINAL_BITTIMING 0x100187#define RKCANFD_REG_FD_NOMINAL_BITTIMING_SAMPLE_MODE BIT(31)188#define RKCANFD_REG_FD_NOMINAL_BITTIMING_SJW GENMASK(30, 24)189#define RKCANFD_REG_FD_NOMINAL_BITTIMING_BRP GENMASK(23, 16)190#define RKCANFD_REG_FD_NOMINAL_BITTIMING_TSEG2 GENMASK(14, 8)191#define RKCANFD_REG_FD_NOMINAL_BITTIMING_TSEG1 GENMASK(7, 0)192 193#define RKCANFD_REG_FD_DATA_BITTIMING 0x104194#define RKCANFD_REG_FD_DATA_BITTIMING_SAMPLE_MODE BIT(21)195#define RKCANFD_REG_FD_DATA_BITTIMING_SJW GENMASK(20, 17)196#define RKCANFD_REG_FD_DATA_BITTIMING_BRP GENMASK(16, 9)197#define RKCANFD_REG_FD_DATA_BITTIMING_TSEG2 GENMASK(8, 5)198#define RKCANFD_REG_FD_DATA_BITTIMING_TSEG1 GENMASK(4, 0)199 200#define RKCANFD_REG_TRANSMIT_DELAY_COMPENSATION 0x108201#define RKCANFD_REG_TRANSMIT_DELAY_COMPENSATION_TDC_OFFSET GENMASK(6, 1)202#define RKCANFD_REG_TRANSMIT_DELAY_COMPENSATION_TDC_ENABLE BIT(0)203 204#define RKCANFD_REG_TIMESTAMP_CTRL 0x10c205/* datasheet says 6:1, which is wrong */206#define RKCANFD_REG_TIMESTAMP_CTRL_TIME_BASE_COUNTER_PRESCALE GENMASK(5, 1)207#define RKCANFD_REG_TIMESTAMP_CTRL_TIME_BASE_COUNTER_ENABLE BIT(0)208 209#define RKCANFD_REG_TIMESTAMP 0x110210 211#define RKCANFD_REG_TXEVENT_FIFO_CTRL 0x114212#define RKCANFD_REG_TXEVENT_FIFO_CTRL_TXE_FIFO_CNT GENMASK(8, 5)213#define RKCANFD_REG_TXEVENT_FIFO_CTRL_TXE_FIFO_WATERMARK GENMASK(4, 1)214#define RKCANFD_REG_TXEVENT_FIFO_CTRL_TXE_FIFO_ENABLE BIT(0)215 216#define RKCANFD_REG_RX_FIFO_CTRL 0x118217#define RKCANFD_REG_RX_FIFO_CTRL_RX_FIFO_CNT GENMASK(6, 4)218#define RKCANFD_REG_RX_FIFO_CTRL_RX_FIFO_FULL_WATERMARK GENMASK(3, 1)219#define RKCANFD_REG_RX_FIFO_CTRL_RX_FIFO_ENABLE BIT(0)220 221#define RKCANFD_REG_AFC_CTRL 0x11c222#define RKCANFD_REG_AFC_CTRL_UAF5 BIT(4)223#define RKCANFD_REG_AFC_CTRL_UAF4 BIT(3)224#define RKCANFD_REG_AFC_CTRL_UAF3 BIT(2)225#define RKCANFD_REG_AFC_CTRL_UAF2 BIT(1)226#define RKCANFD_REG_AFC_CTRL_UAF1 BIT(0)227 228#define RKCANFD_REG_IDCODE0 0x120229#define RKCANFD_REG_IDMASK0 0x124230#define RKCANFD_REG_IDCODE1 0x128231#define RKCANFD_REG_IDMASK1 0x12c232#define RKCANFD_REG_IDCODE2 0x130233#define RKCANFD_REG_IDMASK2 0x134234#define RKCANFD_REG_IDCODE3 0x138235#define RKCANFD_REG_IDMASK3 0x13c236#define RKCANFD_REG_IDCODE4 0x140237#define RKCANFD_REG_IDMASK4 0x144238 239#define RKCANFD_REG_FD_TXFRAMEINFO 0x200240#define RKCANFD_REG_FD_FRAMEINFO_FRAME_FORMAT BIT(7)241#define RKCANFD_REG_FD_FRAMEINFO_RTR BIT(6)242#define RKCANFD_REG_FD_FRAMEINFO_FDF BIT(5)243#define RKCANFD_REG_FD_FRAMEINFO_BRS BIT(4)244#define RKCANFD_REG_FD_FRAMEINFO_DATA_LENGTH GENMASK(3, 0)245 246#define RKCANFD_REG_FD_TXID 0x204247#define RKCANFD_REG_FD_ID_EFF GENMASK(28, 0)248#define RKCANFD_REG_FD_ID_SFF GENMASK(11, 0)249 250#define RKCANFD_REG_FD_TXDATA0 0x208251#define RKCANFD_REG_FD_TXDATA1 0x20c252#define RKCANFD_REG_FD_TXDATA2 0x210253#define RKCANFD_REG_FD_TXDATA3 0x214254#define RKCANFD_REG_FD_TXDATA4 0x218255#define RKCANFD_REG_FD_TXDATA5 0x21c256#define RKCANFD_REG_FD_TXDATA6 0x220257#define RKCANFD_REG_FD_TXDATA7 0x224258#define RKCANFD_REG_FD_TXDATA8 0x228259#define RKCANFD_REG_FD_TXDATA9 0x22c260#define RKCANFD_REG_FD_TXDATA10 0x230261#define RKCANFD_REG_FD_TXDATA11 0x234262#define RKCANFD_REG_FD_TXDATA12 0x238263#define RKCANFD_REG_FD_TXDATA13 0x23c264#define RKCANFD_REG_FD_TXDATA14 0x240265#define RKCANFD_REG_FD_TXDATA15 0x244266 267#define RKCANFD_REG_FD_RXFRAMEINFO 0x300268#define RKCANFD_REG_FD_RXID 0x304269#define RKCANFD_REG_FD_RXTIMESTAMP 0x308270#define RKCANFD_REG_FD_RXDATA0 0x30c271#define RKCANFD_REG_FD_RXDATA1 0x310272#define RKCANFD_REG_FD_RXDATA2 0x314273#define RKCANFD_REG_FD_RXDATA3 0x318274#define RKCANFD_REG_FD_RXDATA4 0x31c275#define RKCANFD_REG_FD_RXDATA5 0x320276#define RKCANFD_REG_FD_RXDATA6 0x320277#define RKCANFD_REG_FD_RXDATA7 0x328278#define RKCANFD_REG_FD_RXDATA8 0x32c279#define RKCANFD_REG_FD_RXDATA9 0x330280#define RKCANFD_REG_FD_RXDATA10 0x334281#define RKCANFD_REG_FD_RXDATA11 0x338282#define RKCANFD_REG_FD_RXDATA12 0x33c283#define RKCANFD_REG_FD_RXDATA13 0x340284#define RKCANFD_REG_FD_RXDATA14 0x344285#define RKCANFD_REG_FD_RXDATA15 0x348286 287#define RKCANFD_REG_RX_FIFO_RDATA 0x400288#define RKCANFD_REG_TXE_FIFO_RDATA 0x500289 290#define DEVICE_NAME "rockchip_canfd"291#define RKCANFD_NAPI_WEIGHT 32292#define RKCANFD_TXFIFO_DEPTH 2293#define RKCANFD_TX_STOP_THRESHOLD 1294#define RKCANFD_TX_START_THRESHOLD 1295 296#define RKCANFD_TIMESTAMP_WORK_MAX_DELAY_SEC 60297#define RKCANFD_ERRATUM_5_SYSCLOCK_HZ_MIN (300 * MEGA)298 299/* rk3568 CAN-FD Errata, as of Tue 07 Nov 2023 11:25:31 +08:00 */300 301/* Erratum 1: The error frame sent by the CAN controller has an302 * abnormal format.303 */304#define RKCANFD_QUIRK_RK3568_ERRATUM_1 BIT(0)305 306/* Erratum 2: The error frame sent after detecting a CRC error has an307 * abnormal position.308 */309#define RKCANFD_QUIRK_RK3568_ERRATUM_2 BIT(1)310 311/* Erratum 3: Intermittent CRC calculation errors. */312#define RKCANFD_QUIRK_RK3568_ERRATUM_3 BIT(2)313 314/* Erratum 4: Intermittent occurrence of stuffing errors. */315#define RKCANFD_QUIRK_RK3568_ERRATUM_4 BIT(3)316 317/* Erratum 5: Counters related to the TXFIFO and RXFIFO exhibit318 * abnormal counting behavior.319 *320 * The rk3568 CAN-FD errata sheet as of Tue 07 Nov 2023 11:25:31 +08:00321 * states that only the rk3568v2 is affected by this erratum, but322 * tests with the rk3568v2 and rk3568v3 show that the RX_FIFO_CNT is323 * sometimes too high. This leads to CAN frames being read from the324 * FIFO, which is then already empty.325 *326 * Further tests on the rk3568v2 and rk3568v3 show that in this327 * situation (i.e. empty FIFO) all elements of the FIFO header328 * (frameinfo, id, ts) contain the same data.329 *330 * On the rk3568v2 and rk3568v3, this problem only occurs extremely331 * rarely with the standard clock of 300 MHz, but almost immediately332 * at 80 MHz.333 *334 * To workaround this problem, check for empty FIFO with335 * rkcanfd_fifo_header_empty() in rkcanfd_handle_rx_int_one() and exit336 * early.337 *338 * To reproduce:339 * assigned-clocks = <&cru CLK_CANx>;340 * assigned-clock-rates = <80000000>;341 */342#define RKCANFD_QUIRK_RK3568_ERRATUM_5 BIT(4)343 344/* Erratum 6: The CAN controller's transmission of extended frames may345 * intermittently change into standard frames346 *347 * Work around this issue by activating self reception (RXSTX). If we348 * have pending TX CAN frames, check all RX'ed CAN frames in349 * rkcanfd_rxstx_filter().350 *351 * If it's a frame we've send and it's OK, call the TX complete352 * handler: rkcanfd_handle_tx_done_one(). Mask the TX complete IRQ.353 *354 * If it's a frame we've send, but the CAN-ID is mangled, resend the355 * original extended frame.356 *357 * To reproduce:358 * host:359 * canfdtest -evx -g can0360 * candump any,0:80000000 -cexdtA361 * dut:362 * canfdtest -evx can0363 * ethtool -S can0364 */365#define RKCANFD_QUIRK_RK3568_ERRATUM_6 BIT(5)366 367/* Erratum 7: In the passive error state, the CAN controller's368 * interframe space segment counting is inaccurate.369 */370#define RKCANFD_QUIRK_RK3568_ERRATUM_7 BIT(6)371 372/* Erratum 8: The Format-Error error flag is transmitted one bit373 * later.374 */375#define RKCANFD_QUIRK_RK3568_ERRATUM_8 BIT(7)376 377/* Erratum 9: In the arbitration segment, the CAN controller will378 * identify stuffing errors as arbitration failures.379 */380#define RKCANFD_QUIRK_RK3568_ERRATUM_9 BIT(8)381 382/* Erratum 10: Does not support the BUSOFF slow recovery mechanism. */383#define RKCANFD_QUIRK_RK3568_ERRATUM_10 BIT(9)384 385/* Erratum 11: Arbitration error. */386#define RKCANFD_QUIRK_RK3568_ERRATUM_11 BIT(10)387 388/* Erratum 12: A dominant bit at the third bit of the intermission may389 * cause a transmission error.390 */391#define RKCANFD_QUIRK_RK3568_ERRATUM_12 BIT(11)392 393/* Tests on the rk3568v2 and rk3568v3 show that receiving certain394 * CAN-FD frames trigger an Error Interrupt.395 *396 * - Form Error in RX Arbitration Phase: TX_IDLE RX_STUFF_COUNT (0x0a010100) CMD=0 RX=0 TX=0397 * Error-Warning=1 Bus-Off=0398 * To reproduce:399 * host:400 * cansend can0 002##01f401 * DUT:402 * candump any,0:0,#FFFFFFFF -cexdHtA403 *404 * - Form Error in RX Arbitration Phase: TX_IDLE RX_CRC (0x0a010200) CMD=0 RX=0 TX=0405 * Error-Warning=1 Bus-Off=0406 * To reproduce:407 * host:408 * cansend can0 002##07217010000000000409 * DUT:410 * candump any,0:0,#FFFFFFFF -cexdHtA411 */412#define RKCANFD_QUIRK_CANFD_BROKEN BIT(12)413 414/* known issues with rk3568v3:415 *416 * - Overload situation during high bus load417 * To reproduce:418 * host:419 * # add a 2nd CAN adapter to the CAN bus420 * cangen can0 -I 1 -Li -Di -p10 -g 0.3421 * cansequence -rve422 * DUT:423 * cangen can0 -I2 -L1 -Di -p10 -c10 -g 1 -e424 * cansequence -rv -i 1425 *426 * - TX starvation after repeated Bus-Off427 * To reproduce:428 * host:429 * sleep 3 && cangen can0 -I2 -Li -Di -p10 -g 0.0430 * DUT:431 * cangen can0 -I2 -Li -Di -p10 -g 0.05432 */433 434enum rkcanfd_model {435 RKCANFD_MODEL_RK3568V2 = 0x35682,436 RKCANFD_MODEL_RK3568V3 = 0x35683,437};438 439struct rkcanfd_devtype_data {440 enum rkcanfd_model model;441 u32 quirks;442};443 444struct rkcanfd_fifo_header {445 u32 frameinfo;446 u32 id;447 u32 ts;448};449 450struct rkcanfd_stats {451 struct u64_stats_sync syncp;452 453 /* Erratum 5 */454 u64_stats_t rx_fifo_empty_errors;455 456 /* Erratum 6 */457 u64_stats_t tx_extended_as_standard_errors;458};459 460struct rkcanfd_priv {461 struct can_priv can;462 struct can_rx_offload offload;463 struct net_device *ndev;464 465 void __iomem *regs;466 unsigned int tx_head;467 unsigned int tx_tail;468 469 u32 reg_mode_default;470 u32 reg_int_mask_default;471 struct rkcanfd_devtype_data devtype_data;472 473 struct cyclecounter cc;474 struct timecounter tc;475 struct delayed_work timestamp;476 unsigned long work_delay_jiffies;477 478 struct can_berr_counter bec;479 480 struct rkcanfd_stats stats;481 482 struct reset_control *reset;483 struct clk_bulk_data *clks;484 int clks_num;485};486 487static inline u32488rkcanfd_read(const struct rkcanfd_priv *priv, u32 reg)489{490 return readl(priv->regs + reg);491}492 493static inline void494rkcanfd_read_rep(const struct rkcanfd_priv *priv, u32 reg,495 void *buf, unsigned int len)496{497 readsl(priv->regs + reg, buf, len / sizeof(u32));498}499 500static inline void501rkcanfd_write(const struct rkcanfd_priv *priv, u32 reg, u32 val)502{503 writel(val, priv->regs + reg);504}505 506static inline u32507rkcanfd_get_timestamp(const struct rkcanfd_priv *priv)508{509 return rkcanfd_read(priv, RKCANFD_REG_TIMESTAMP);510}511 512static inline unsigned int513rkcanfd_get_tx_head(const struct rkcanfd_priv *priv)514{515 return READ_ONCE(priv->tx_head) & (RKCANFD_TXFIFO_DEPTH - 1);516}517 518static inline unsigned int519rkcanfd_get_tx_tail(const struct rkcanfd_priv *priv)520{521 return READ_ONCE(priv->tx_tail) & (RKCANFD_TXFIFO_DEPTH - 1);522}523 524static inline unsigned int525rkcanfd_get_tx_pending(const struct rkcanfd_priv *priv)526{527 return READ_ONCE(priv->tx_head) - READ_ONCE(priv->tx_tail);528}529 530static inline unsigned int531rkcanfd_get_tx_free(const struct rkcanfd_priv *priv)532{533 return RKCANFD_TXFIFO_DEPTH - rkcanfd_get_tx_pending(priv);534}535 536void rkcanfd_ethtool_init(struct rkcanfd_priv *priv);537 538int rkcanfd_handle_rx_int(struct rkcanfd_priv *priv);539 540void rkcanfd_skb_set_timestamp(const struct rkcanfd_priv *priv,541 struct sk_buff *skb, const u32 timestamp);542void rkcanfd_timestamp_init(struct rkcanfd_priv *priv);543void rkcanfd_timestamp_start(struct rkcanfd_priv *priv);544void rkcanfd_timestamp_stop(struct rkcanfd_priv *priv);545void rkcanfd_timestamp_stop_sync(struct rkcanfd_priv *priv);546 547unsigned int rkcanfd_get_effective_tx_free(const struct rkcanfd_priv *priv);548void rkcanfd_xmit_retry(struct rkcanfd_priv *priv);549netdev_tx_t rkcanfd_start_xmit(struct sk_buff *skb, struct net_device *ndev);550void rkcanfd_handle_tx_done_one(struct rkcanfd_priv *priv, const u32 ts,551 unsigned int *frame_len_p);552 553#endif554