cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

ifi_canfd.c (29643B)


      1/*
      2 * CAN bus driver for IFI CANFD controller
      3 *
      4 * Copyright (C) 2016 Marek Vasut <marex@denx.de>
      5 *
      6 * Details about this controller can be found at
      7 * http://www.ifi-pld.de/IP/CANFD/canfd.html
      8 *
      9 * This file is licensed under the terms of the GNU General Public
     10 * License version 2. This program is licensed "as is" without any
     11 * warranty of any kind, whether express or implied.
     12 */
     13
     14#include <linux/clk.h>
     15#include <linux/delay.h>
     16#include <linux/interrupt.h>
     17#include <linux/io.h>
     18#include <linux/kernel.h>
     19#include <linux/module.h>
     20#include <linux/netdevice.h>
     21#include <linux/of.h>
     22#include <linux/of_device.h>
     23#include <linux/platform_device.h>
     24
     25#include <linux/can/dev.h>
     26
     27#define IFI_CANFD_STCMD				0x0
     28#define IFI_CANFD_STCMD_HARDRESET		0xDEADCAFD
     29#define IFI_CANFD_STCMD_ENABLE			BIT(0)
     30#define IFI_CANFD_STCMD_ERROR_ACTIVE		BIT(2)
     31#define IFI_CANFD_STCMD_ERROR_PASSIVE		BIT(3)
     32#define IFI_CANFD_STCMD_BUSOFF			BIT(4)
     33#define IFI_CANFD_STCMD_ERROR_WARNING		BIT(5)
     34#define IFI_CANFD_STCMD_BUSMONITOR		BIT(16)
     35#define IFI_CANFD_STCMD_LOOPBACK		BIT(18)
     36#define IFI_CANFD_STCMD_DISABLE_CANFD		BIT(24)
     37#define IFI_CANFD_STCMD_ENABLE_ISO		BIT(25)
     38#define IFI_CANFD_STCMD_ENABLE_7_9_8_8_TIMING	BIT(26)
     39#define IFI_CANFD_STCMD_NORMAL_MODE		((u32)BIT(31))
     40
     41#define IFI_CANFD_RXSTCMD			0x4
     42#define IFI_CANFD_RXSTCMD_REMOVE_MSG		BIT(0)
     43#define IFI_CANFD_RXSTCMD_RESET			BIT(7)
     44#define IFI_CANFD_RXSTCMD_EMPTY			BIT(8)
     45#define IFI_CANFD_RXSTCMD_OVERFLOW		BIT(13)
     46
     47#define IFI_CANFD_TXSTCMD			0x8
     48#define IFI_CANFD_TXSTCMD_ADD_MSG		BIT(0)
     49#define IFI_CANFD_TXSTCMD_HIGH_PRIO		BIT(1)
     50#define IFI_CANFD_TXSTCMD_RESET			BIT(7)
     51#define IFI_CANFD_TXSTCMD_EMPTY			BIT(8)
     52#define IFI_CANFD_TXSTCMD_FULL			BIT(12)
     53#define IFI_CANFD_TXSTCMD_OVERFLOW		BIT(13)
     54
     55#define IFI_CANFD_INTERRUPT			0xc
     56#define IFI_CANFD_INTERRUPT_ERROR_BUSOFF	BIT(0)
     57#define IFI_CANFD_INTERRUPT_ERROR_WARNING	BIT(1)
     58#define IFI_CANFD_INTERRUPT_ERROR_STATE_CHG	BIT(2)
     59#define IFI_CANFD_INTERRUPT_ERROR_REC_TEC_INC	BIT(3)
     60#define IFI_CANFD_INTERRUPT_ERROR_COUNTER	BIT(10)
     61#define IFI_CANFD_INTERRUPT_TXFIFO_EMPTY	BIT(16)
     62#define IFI_CANFD_INTERRUPT_TXFIFO_REMOVE	BIT(22)
     63#define IFI_CANFD_INTERRUPT_RXFIFO_NEMPTY	BIT(24)
     64#define IFI_CANFD_INTERRUPT_RXFIFO_NEMPTY_PER	BIT(25)
     65#define IFI_CANFD_INTERRUPT_SET_IRQ		((u32)BIT(31))
     66
     67#define IFI_CANFD_IRQMASK			0x10
     68#define IFI_CANFD_IRQMASK_ERROR_BUSOFF		BIT(0)
     69#define IFI_CANFD_IRQMASK_ERROR_WARNING		BIT(1)
     70#define IFI_CANFD_IRQMASK_ERROR_STATE_CHG	BIT(2)
     71#define IFI_CANFD_IRQMASK_ERROR_REC_TEC_INC	BIT(3)
     72#define IFI_CANFD_IRQMASK_SET_ERR		BIT(7)
     73#define IFI_CANFD_IRQMASK_SET_TS		BIT(15)
     74#define IFI_CANFD_IRQMASK_TXFIFO_EMPTY		BIT(16)
     75#define IFI_CANFD_IRQMASK_SET_TX		BIT(23)
     76#define IFI_CANFD_IRQMASK_RXFIFO_NEMPTY		BIT(24)
     77#define IFI_CANFD_IRQMASK_SET_RX		((u32)BIT(31))
     78
     79#define IFI_CANFD_TIME				0x14
     80#define IFI_CANFD_FTIME				0x18
     81#define IFI_CANFD_TIME_TIMEB_OFF		0
     82#define IFI_CANFD_TIME_TIMEA_OFF		8
     83#define IFI_CANFD_TIME_PRESCALE_OFF		16
     84#define IFI_CANFD_TIME_SJW_OFF_7_9_8_8		25
     85#define IFI_CANFD_TIME_SJW_OFF_4_12_6_6		28
     86#define IFI_CANFD_TIME_SET_SJW_4_12_6_6		BIT(6)
     87#define IFI_CANFD_TIME_SET_TIMEB_4_12_6_6	BIT(7)
     88#define IFI_CANFD_TIME_SET_PRESC_4_12_6_6	BIT(14)
     89#define IFI_CANFD_TIME_SET_TIMEA_4_12_6_6	BIT(15)
     90
     91#define IFI_CANFD_TDELAY			0x1c
     92#define IFI_CANFD_TDELAY_DEFAULT		0xb
     93#define IFI_CANFD_TDELAY_MASK			0x3fff
     94#define IFI_CANFD_TDELAY_ABS			BIT(14)
     95#define IFI_CANFD_TDELAY_EN			BIT(15)
     96
     97#define IFI_CANFD_ERROR				0x20
     98#define IFI_CANFD_ERROR_TX_OFFSET		0
     99#define IFI_CANFD_ERROR_TX_MASK			0xff
    100#define IFI_CANFD_ERROR_RX_OFFSET		16
    101#define IFI_CANFD_ERROR_RX_MASK			0xff
    102
    103#define IFI_CANFD_ERRCNT			0x24
    104
    105#define IFI_CANFD_SUSPEND			0x28
    106
    107#define IFI_CANFD_REPEAT			0x2c
    108
    109#define IFI_CANFD_TRAFFIC			0x30
    110
    111#define IFI_CANFD_TSCONTROL			0x34
    112
    113#define IFI_CANFD_TSC				0x38
    114
    115#define IFI_CANFD_TST				0x3c
    116
    117#define IFI_CANFD_RES1				0x40
    118
    119#define IFI_CANFD_ERROR_CTR			0x44
    120#define IFI_CANFD_ERROR_CTR_UNLOCK_MAGIC	0x21302899
    121#define IFI_CANFD_ERROR_CTR_OVERLOAD_FIRST	BIT(0)
    122#define IFI_CANFD_ERROR_CTR_ACK_ERROR_FIRST	BIT(1)
    123#define IFI_CANFD_ERROR_CTR_BIT0_ERROR_FIRST	BIT(2)
    124#define IFI_CANFD_ERROR_CTR_BIT1_ERROR_FIRST	BIT(3)
    125#define IFI_CANFD_ERROR_CTR_STUFF_ERROR_FIRST	BIT(4)
    126#define IFI_CANFD_ERROR_CTR_CRC_ERROR_FIRST	BIT(5)
    127#define IFI_CANFD_ERROR_CTR_FORM_ERROR_FIRST	BIT(6)
    128#define IFI_CANFD_ERROR_CTR_OVERLOAD_ALL	BIT(8)
    129#define IFI_CANFD_ERROR_CTR_ACK_ERROR_ALL	BIT(9)
    130#define IFI_CANFD_ERROR_CTR_BIT0_ERROR_ALL	BIT(10)
    131#define IFI_CANFD_ERROR_CTR_BIT1_ERROR_ALL	BIT(11)
    132#define IFI_CANFD_ERROR_CTR_STUFF_ERROR_ALL	BIT(12)
    133#define IFI_CANFD_ERROR_CTR_CRC_ERROR_ALL	BIT(13)
    134#define IFI_CANFD_ERROR_CTR_FORM_ERROR_ALL	BIT(14)
    135#define IFI_CANFD_ERROR_CTR_BITPOSITION_OFFSET	16
    136#define IFI_CANFD_ERROR_CTR_BITPOSITION_MASK	0xff
    137#define IFI_CANFD_ERROR_CTR_ER_RESET		BIT(30)
    138#define IFI_CANFD_ERROR_CTR_ER_ENABLE		((u32)BIT(31))
    139
    140#define IFI_CANFD_PAR				0x48
    141
    142#define IFI_CANFD_CANCLOCK			0x4c
    143
    144#define IFI_CANFD_SYSCLOCK			0x50
    145
    146#define IFI_CANFD_VER				0x54
    147#define IFI_CANFD_VER_REV_MASK			0xff
    148#define IFI_CANFD_VER_REV_MIN_SUPPORTED		0x15
    149
    150#define IFI_CANFD_IP_ID				0x58
    151#define IFI_CANFD_IP_ID_VALUE			0xD073CAFD
    152
    153#define IFI_CANFD_TEST				0x5c
    154
    155#define IFI_CANFD_RXFIFO_TS_63_32		0x60
    156
    157#define IFI_CANFD_RXFIFO_TS_31_0		0x64
    158
    159#define IFI_CANFD_RXFIFO_DLC			0x68
    160#define IFI_CANFD_RXFIFO_DLC_DLC_OFFSET		0
    161#define IFI_CANFD_RXFIFO_DLC_DLC_MASK		0xf
    162#define IFI_CANFD_RXFIFO_DLC_RTR		BIT(4)
    163#define IFI_CANFD_RXFIFO_DLC_EDL		BIT(5)
    164#define IFI_CANFD_RXFIFO_DLC_BRS		BIT(6)
    165#define IFI_CANFD_RXFIFO_DLC_ESI		BIT(7)
    166#define IFI_CANFD_RXFIFO_DLC_OBJ_OFFSET		8
    167#define IFI_CANFD_RXFIFO_DLC_OBJ_MASK		0x1ff
    168#define IFI_CANFD_RXFIFO_DLC_FNR_OFFSET		24
    169#define IFI_CANFD_RXFIFO_DLC_FNR_MASK		0xff
    170
    171#define IFI_CANFD_RXFIFO_ID			0x6c
    172#define IFI_CANFD_RXFIFO_ID_ID_OFFSET		0
    173#define IFI_CANFD_RXFIFO_ID_ID_STD_MASK		CAN_SFF_MASK
    174#define IFI_CANFD_RXFIFO_ID_ID_STD_OFFSET	0
    175#define IFI_CANFD_RXFIFO_ID_ID_STD_WIDTH	10
    176#define IFI_CANFD_RXFIFO_ID_ID_XTD_MASK		CAN_EFF_MASK
    177#define IFI_CANFD_RXFIFO_ID_ID_XTD_OFFSET	11
    178#define IFI_CANFD_RXFIFO_ID_ID_XTD_WIDTH	18
    179#define IFI_CANFD_RXFIFO_ID_IDE			BIT(29)
    180
    181#define IFI_CANFD_RXFIFO_DATA			0x70	/* 0x70..0xac */
    182
    183#define IFI_CANFD_TXFIFO_SUSPEND_US		0xb0
    184
    185#define IFI_CANFD_TXFIFO_REPEATCOUNT		0xb4
    186
    187#define IFI_CANFD_TXFIFO_DLC			0xb8
    188#define IFI_CANFD_TXFIFO_DLC_DLC_OFFSET		0
    189#define IFI_CANFD_TXFIFO_DLC_DLC_MASK		0xf
    190#define IFI_CANFD_TXFIFO_DLC_RTR		BIT(4)
    191#define IFI_CANFD_TXFIFO_DLC_EDL		BIT(5)
    192#define IFI_CANFD_TXFIFO_DLC_BRS		BIT(6)
    193#define IFI_CANFD_TXFIFO_DLC_FNR_OFFSET		24
    194#define IFI_CANFD_TXFIFO_DLC_FNR_MASK		0xff
    195
    196#define IFI_CANFD_TXFIFO_ID			0xbc
    197#define IFI_CANFD_TXFIFO_ID_ID_OFFSET		0
    198#define IFI_CANFD_TXFIFO_ID_ID_STD_MASK		CAN_SFF_MASK
    199#define IFI_CANFD_TXFIFO_ID_ID_STD_OFFSET	0
    200#define IFI_CANFD_TXFIFO_ID_ID_STD_WIDTH	10
    201#define IFI_CANFD_TXFIFO_ID_ID_XTD_MASK		CAN_EFF_MASK
    202#define IFI_CANFD_TXFIFO_ID_ID_XTD_OFFSET	11
    203#define IFI_CANFD_TXFIFO_ID_ID_XTD_WIDTH	18
    204#define IFI_CANFD_TXFIFO_ID_IDE			BIT(29)
    205
    206#define IFI_CANFD_TXFIFO_DATA			0xc0	/* 0xb0..0xfc */
    207
    208#define IFI_CANFD_FILTER_MASK(n)		(0x800 + ((n) * 8) + 0)
    209#define IFI_CANFD_FILTER_MASK_EXT		BIT(29)
    210#define IFI_CANFD_FILTER_MASK_EDL		BIT(30)
    211#define IFI_CANFD_FILTER_MASK_VALID		((u32)BIT(31))
    212
    213#define IFI_CANFD_FILTER_IDENT(n)		(0x800 + ((n) * 8) + 4)
    214#define IFI_CANFD_FILTER_IDENT_IDE		BIT(29)
    215#define IFI_CANFD_FILTER_IDENT_CANFD		BIT(30)
    216#define IFI_CANFD_FILTER_IDENT_VALID		((u32)BIT(31))
    217
    218/* IFI CANFD private data structure */
    219struct ifi_canfd_priv {
    220	struct can_priv		can;	/* must be the first member */
    221	struct napi_struct	napi;
    222	struct net_device	*ndev;
    223	void __iomem		*base;
    224};
    225
    226static void ifi_canfd_irq_enable(struct net_device *ndev, bool enable)
    227{
    228	struct ifi_canfd_priv *priv = netdev_priv(ndev);
    229	u32 enirq = 0;
    230
    231	if (enable) {
    232		enirq = IFI_CANFD_IRQMASK_TXFIFO_EMPTY |
    233			IFI_CANFD_IRQMASK_RXFIFO_NEMPTY |
    234			IFI_CANFD_IRQMASK_ERROR_STATE_CHG |
    235			IFI_CANFD_IRQMASK_ERROR_WARNING |
    236			IFI_CANFD_IRQMASK_ERROR_BUSOFF;
    237		if (priv->can.ctrlmode & CAN_CTRLMODE_BERR_REPORTING)
    238			enirq |= IFI_CANFD_INTERRUPT_ERROR_COUNTER;
    239	}
    240
    241	writel(IFI_CANFD_IRQMASK_SET_ERR |
    242	       IFI_CANFD_IRQMASK_SET_TS |
    243	       IFI_CANFD_IRQMASK_SET_TX |
    244	       IFI_CANFD_IRQMASK_SET_RX | enirq,
    245	       priv->base + IFI_CANFD_IRQMASK);
    246}
    247
    248static void ifi_canfd_read_fifo(struct net_device *ndev)
    249{
    250	struct net_device_stats *stats = &ndev->stats;
    251	struct ifi_canfd_priv *priv = netdev_priv(ndev);
    252	struct canfd_frame *cf;
    253	struct sk_buff *skb;
    254	const u32 rx_irq_mask = IFI_CANFD_INTERRUPT_RXFIFO_NEMPTY |
    255				IFI_CANFD_INTERRUPT_RXFIFO_NEMPTY_PER;
    256	u32 rxdlc, rxid;
    257	u32 dlc, id;
    258	int i;
    259
    260	rxdlc = readl(priv->base + IFI_CANFD_RXFIFO_DLC);
    261	if (rxdlc & IFI_CANFD_RXFIFO_DLC_EDL)
    262		skb = alloc_canfd_skb(ndev, &cf);
    263	else
    264		skb = alloc_can_skb(ndev, (struct can_frame **)&cf);
    265
    266	if (!skb) {
    267		stats->rx_dropped++;
    268		return;
    269	}
    270
    271	dlc = (rxdlc >> IFI_CANFD_RXFIFO_DLC_DLC_OFFSET) &
    272	      IFI_CANFD_RXFIFO_DLC_DLC_MASK;
    273	if (rxdlc & IFI_CANFD_RXFIFO_DLC_EDL)
    274		cf->len = can_fd_dlc2len(dlc);
    275	else
    276		cf->len = can_cc_dlc2len(dlc);
    277
    278	rxid = readl(priv->base + IFI_CANFD_RXFIFO_ID);
    279	id = (rxid >> IFI_CANFD_RXFIFO_ID_ID_OFFSET);
    280	if (id & IFI_CANFD_RXFIFO_ID_IDE) {
    281		id &= IFI_CANFD_RXFIFO_ID_ID_XTD_MASK;
    282		/*
    283		 * In case the Extended ID frame is received, the standard
    284		 * and extended part of the ID are swapped in the register,
    285		 * so swap them back to obtain the correct ID.
    286		 */
    287		id = (id >> IFI_CANFD_RXFIFO_ID_ID_XTD_OFFSET) |
    288		     ((id & IFI_CANFD_RXFIFO_ID_ID_STD_MASK) <<
    289		       IFI_CANFD_RXFIFO_ID_ID_XTD_WIDTH);
    290		id |= CAN_EFF_FLAG;
    291	} else {
    292		id &= IFI_CANFD_RXFIFO_ID_ID_STD_MASK;
    293	}
    294	cf->can_id = id;
    295
    296	if (rxdlc & IFI_CANFD_RXFIFO_DLC_ESI) {
    297		cf->flags |= CANFD_ESI;
    298		netdev_dbg(ndev, "ESI Error\n");
    299	}
    300
    301	if (!(rxdlc & IFI_CANFD_RXFIFO_DLC_EDL) &&
    302	    (rxdlc & IFI_CANFD_RXFIFO_DLC_RTR)) {
    303		cf->can_id |= CAN_RTR_FLAG;
    304	} else {
    305		if (rxdlc & IFI_CANFD_RXFIFO_DLC_BRS)
    306			cf->flags |= CANFD_BRS;
    307
    308		for (i = 0; i < cf->len; i += 4) {
    309			*(u32 *)(cf->data + i) =
    310				readl(priv->base + IFI_CANFD_RXFIFO_DATA + i);
    311		}
    312
    313		stats->rx_bytes += cf->len;
    314	}
    315	stats->rx_packets++;
    316
    317	/* Remove the packet from FIFO */
    318	writel(IFI_CANFD_RXSTCMD_REMOVE_MSG, priv->base + IFI_CANFD_RXSTCMD);
    319	writel(rx_irq_mask, priv->base + IFI_CANFD_INTERRUPT);
    320
    321	netif_receive_skb(skb);
    322}
    323
    324static int ifi_canfd_do_rx_poll(struct net_device *ndev, int quota)
    325{
    326	struct ifi_canfd_priv *priv = netdev_priv(ndev);
    327	u32 pkts = 0;
    328	u32 rxst;
    329
    330	rxst = readl(priv->base + IFI_CANFD_RXSTCMD);
    331	if (rxst & IFI_CANFD_RXSTCMD_EMPTY) {
    332		netdev_dbg(ndev, "No messages in RX FIFO\n");
    333		return 0;
    334	}
    335
    336	for (;;) {
    337		if (rxst & IFI_CANFD_RXSTCMD_EMPTY)
    338			break;
    339		if (quota <= 0)
    340			break;
    341
    342		ifi_canfd_read_fifo(ndev);
    343		quota--;
    344		pkts++;
    345		rxst = readl(priv->base + IFI_CANFD_RXSTCMD);
    346	}
    347
    348	return pkts;
    349}
    350
    351static int ifi_canfd_handle_lost_msg(struct net_device *ndev)
    352{
    353	struct net_device_stats *stats = &ndev->stats;
    354	struct sk_buff *skb;
    355	struct can_frame *frame;
    356
    357	netdev_err(ndev, "RX FIFO overflow, message(s) lost.\n");
    358
    359	stats->rx_errors++;
    360	stats->rx_over_errors++;
    361
    362	skb = alloc_can_err_skb(ndev, &frame);
    363	if (unlikely(!skb))
    364		return 0;
    365
    366	frame->can_id |= CAN_ERR_CRTL;
    367	frame->data[1] = CAN_ERR_CRTL_RX_OVERFLOW;
    368
    369	netif_receive_skb(skb);
    370
    371	return 1;
    372}
    373
    374static int ifi_canfd_handle_lec_err(struct net_device *ndev)
    375{
    376	struct ifi_canfd_priv *priv = netdev_priv(ndev);
    377	struct net_device_stats *stats = &ndev->stats;
    378	struct can_frame *cf;
    379	struct sk_buff *skb;
    380	u32 errctr = readl(priv->base + IFI_CANFD_ERROR_CTR);
    381	const u32 errmask = IFI_CANFD_ERROR_CTR_OVERLOAD_FIRST |
    382			    IFI_CANFD_ERROR_CTR_ACK_ERROR_FIRST |
    383			    IFI_CANFD_ERROR_CTR_BIT0_ERROR_FIRST |
    384			    IFI_CANFD_ERROR_CTR_BIT1_ERROR_FIRST |
    385			    IFI_CANFD_ERROR_CTR_STUFF_ERROR_FIRST |
    386			    IFI_CANFD_ERROR_CTR_CRC_ERROR_FIRST |
    387			    IFI_CANFD_ERROR_CTR_FORM_ERROR_FIRST;
    388
    389	if (!(errctr & errmask))	/* No error happened. */
    390		return 0;
    391
    392	priv->can.can_stats.bus_error++;
    393	stats->rx_errors++;
    394
    395	/* Propagate the error condition to the CAN stack. */
    396	skb = alloc_can_err_skb(ndev, &cf);
    397	if (unlikely(!skb))
    398		return 0;
    399
    400	/* Read the error counter register and check for new errors. */
    401	cf->can_id |= CAN_ERR_PROT | CAN_ERR_BUSERROR;
    402
    403	if (errctr & IFI_CANFD_ERROR_CTR_OVERLOAD_FIRST)
    404		cf->data[2] |= CAN_ERR_PROT_OVERLOAD;
    405
    406	if (errctr & IFI_CANFD_ERROR_CTR_ACK_ERROR_FIRST)
    407		cf->data[3] = CAN_ERR_PROT_LOC_ACK;
    408
    409	if (errctr & IFI_CANFD_ERROR_CTR_BIT0_ERROR_FIRST)
    410		cf->data[2] |= CAN_ERR_PROT_BIT0;
    411
    412	if (errctr & IFI_CANFD_ERROR_CTR_BIT1_ERROR_FIRST)
    413		cf->data[2] |= CAN_ERR_PROT_BIT1;
    414
    415	if (errctr & IFI_CANFD_ERROR_CTR_STUFF_ERROR_FIRST)
    416		cf->data[2] |= CAN_ERR_PROT_STUFF;
    417
    418	if (errctr & IFI_CANFD_ERROR_CTR_CRC_ERROR_FIRST)
    419		cf->data[3] = CAN_ERR_PROT_LOC_CRC_SEQ;
    420
    421	if (errctr & IFI_CANFD_ERROR_CTR_FORM_ERROR_FIRST)
    422		cf->data[2] |= CAN_ERR_PROT_FORM;
    423
    424	/* Reset the error counter, ack the IRQ and re-enable the counter. */
    425	writel(IFI_CANFD_ERROR_CTR_ER_RESET, priv->base + IFI_CANFD_ERROR_CTR);
    426	writel(IFI_CANFD_INTERRUPT_ERROR_COUNTER,
    427	       priv->base + IFI_CANFD_INTERRUPT);
    428	writel(IFI_CANFD_ERROR_CTR_ER_ENABLE, priv->base + IFI_CANFD_ERROR_CTR);
    429
    430	netif_receive_skb(skb);
    431
    432	return 1;
    433}
    434
    435static int ifi_canfd_get_berr_counter(const struct net_device *ndev,
    436				      struct can_berr_counter *bec)
    437{
    438	struct ifi_canfd_priv *priv = netdev_priv(ndev);
    439	u32 err;
    440
    441	err = readl(priv->base + IFI_CANFD_ERROR);
    442	bec->rxerr = (err >> IFI_CANFD_ERROR_RX_OFFSET) &
    443		     IFI_CANFD_ERROR_RX_MASK;
    444	bec->txerr = (err >> IFI_CANFD_ERROR_TX_OFFSET) &
    445		     IFI_CANFD_ERROR_TX_MASK;
    446
    447	return 0;
    448}
    449
    450static int ifi_canfd_handle_state_change(struct net_device *ndev,
    451					 enum can_state new_state)
    452{
    453	struct ifi_canfd_priv *priv = netdev_priv(ndev);
    454	struct can_frame *cf;
    455	struct sk_buff *skb;
    456	struct can_berr_counter bec;
    457
    458	switch (new_state) {
    459	case CAN_STATE_ERROR_ACTIVE:
    460		/* error active state */
    461		priv->can.can_stats.error_warning++;
    462		priv->can.state = CAN_STATE_ERROR_ACTIVE;
    463		break;
    464	case CAN_STATE_ERROR_WARNING:
    465		/* error warning state */
    466		priv->can.can_stats.error_warning++;
    467		priv->can.state = CAN_STATE_ERROR_WARNING;
    468		break;
    469	case CAN_STATE_ERROR_PASSIVE:
    470		/* error passive state */
    471		priv->can.can_stats.error_passive++;
    472		priv->can.state = CAN_STATE_ERROR_PASSIVE;
    473		break;
    474	case CAN_STATE_BUS_OFF:
    475		/* bus-off state */
    476		priv->can.state = CAN_STATE_BUS_OFF;
    477		ifi_canfd_irq_enable(ndev, 0);
    478		priv->can.can_stats.bus_off++;
    479		can_bus_off(ndev);
    480		break;
    481	default:
    482		break;
    483	}
    484
    485	/* propagate the error condition to the CAN stack */
    486	skb = alloc_can_err_skb(ndev, &cf);
    487	if (unlikely(!skb))
    488		return 0;
    489
    490	ifi_canfd_get_berr_counter(ndev, &bec);
    491
    492	switch (new_state) {
    493	case CAN_STATE_ERROR_WARNING:
    494		/* error warning state */
    495		cf->can_id |= CAN_ERR_CRTL;
    496		cf->data[1] = (bec.txerr > bec.rxerr) ?
    497			CAN_ERR_CRTL_TX_WARNING :
    498			CAN_ERR_CRTL_RX_WARNING;
    499		cf->data[6] = bec.txerr;
    500		cf->data[7] = bec.rxerr;
    501		break;
    502	case CAN_STATE_ERROR_PASSIVE:
    503		/* error passive state */
    504		cf->can_id |= CAN_ERR_CRTL;
    505		cf->data[1] |= CAN_ERR_CRTL_RX_PASSIVE;
    506		if (bec.txerr > 127)
    507			cf->data[1] |= CAN_ERR_CRTL_TX_PASSIVE;
    508		cf->data[6] = bec.txerr;
    509		cf->data[7] = bec.rxerr;
    510		break;
    511	case CAN_STATE_BUS_OFF:
    512		/* bus-off state */
    513		cf->can_id |= CAN_ERR_BUSOFF;
    514		break;
    515	default:
    516		break;
    517	}
    518
    519	netif_receive_skb(skb);
    520
    521	return 1;
    522}
    523
    524static int ifi_canfd_handle_state_errors(struct net_device *ndev)
    525{
    526	struct ifi_canfd_priv *priv = netdev_priv(ndev);
    527	u32 stcmd = readl(priv->base + IFI_CANFD_STCMD);
    528	int work_done = 0;
    529
    530	if ((stcmd & IFI_CANFD_STCMD_ERROR_ACTIVE) &&
    531	    (priv->can.state != CAN_STATE_ERROR_ACTIVE)) {
    532		netdev_dbg(ndev, "Error, entered active state\n");
    533		work_done += ifi_canfd_handle_state_change(ndev,
    534						CAN_STATE_ERROR_ACTIVE);
    535	}
    536
    537	if ((stcmd & IFI_CANFD_STCMD_ERROR_WARNING) &&
    538	    (priv->can.state != CAN_STATE_ERROR_WARNING)) {
    539		netdev_dbg(ndev, "Error, entered warning state\n");
    540		work_done += ifi_canfd_handle_state_change(ndev,
    541						CAN_STATE_ERROR_WARNING);
    542	}
    543
    544	if ((stcmd & IFI_CANFD_STCMD_ERROR_PASSIVE) &&
    545	    (priv->can.state != CAN_STATE_ERROR_PASSIVE)) {
    546		netdev_dbg(ndev, "Error, entered passive state\n");
    547		work_done += ifi_canfd_handle_state_change(ndev,
    548						CAN_STATE_ERROR_PASSIVE);
    549	}
    550
    551	if ((stcmd & IFI_CANFD_STCMD_BUSOFF) &&
    552	    (priv->can.state != CAN_STATE_BUS_OFF)) {
    553		netdev_dbg(ndev, "Error, entered bus-off state\n");
    554		work_done += ifi_canfd_handle_state_change(ndev,
    555						CAN_STATE_BUS_OFF);
    556	}
    557
    558	return work_done;
    559}
    560
    561static int ifi_canfd_poll(struct napi_struct *napi, int quota)
    562{
    563	struct net_device *ndev = napi->dev;
    564	struct ifi_canfd_priv *priv = netdev_priv(ndev);
    565	u32 rxstcmd = readl(priv->base + IFI_CANFD_RXSTCMD);
    566	int work_done = 0;
    567
    568	/* Handle bus state changes */
    569	work_done += ifi_canfd_handle_state_errors(ndev);
    570
    571	/* Handle lost messages on RX */
    572	if (rxstcmd & IFI_CANFD_RXSTCMD_OVERFLOW)
    573		work_done += ifi_canfd_handle_lost_msg(ndev);
    574
    575	/* Handle lec errors on the bus */
    576	if (priv->can.ctrlmode & CAN_CTRLMODE_BERR_REPORTING)
    577		work_done += ifi_canfd_handle_lec_err(ndev);
    578
    579	/* Handle normal messages on RX */
    580	if (!(rxstcmd & IFI_CANFD_RXSTCMD_EMPTY))
    581		work_done += ifi_canfd_do_rx_poll(ndev, quota - work_done);
    582
    583	if (work_done < quota) {
    584		napi_complete_done(napi, work_done);
    585		ifi_canfd_irq_enable(ndev, 1);
    586	}
    587
    588	return work_done;
    589}
    590
    591static irqreturn_t ifi_canfd_isr(int irq, void *dev_id)
    592{
    593	struct net_device *ndev = (struct net_device *)dev_id;
    594	struct ifi_canfd_priv *priv = netdev_priv(ndev);
    595	struct net_device_stats *stats = &ndev->stats;
    596	const u32 rx_irq_mask = IFI_CANFD_INTERRUPT_RXFIFO_NEMPTY |
    597				IFI_CANFD_INTERRUPT_RXFIFO_NEMPTY_PER |
    598				IFI_CANFD_INTERRUPT_ERROR_COUNTER |
    599				IFI_CANFD_INTERRUPT_ERROR_STATE_CHG |
    600				IFI_CANFD_INTERRUPT_ERROR_WARNING |
    601				IFI_CANFD_INTERRUPT_ERROR_BUSOFF;
    602	const u32 tx_irq_mask = IFI_CANFD_INTERRUPT_TXFIFO_EMPTY |
    603				IFI_CANFD_INTERRUPT_TXFIFO_REMOVE;
    604	const u32 clr_irq_mask = ~((u32)IFI_CANFD_INTERRUPT_SET_IRQ);
    605	u32 isr;
    606
    607	isr = readl(priv->base + IFI_CANFD_INTERRUPT);
    608
    609	/* No interrupt */
    610	if (isr == 0)
    611		return IRQ_NONE;
    612
    613	/* Clear all pending interrupts but ErrWarn */
    614	writel(clr_irq_mask, priv->base + IFI_CANFD_INTERRUPT);
    615
    616	/* RX IRQ or bus warning, start NAPI */
    617	if (isr & rx_irq_mask) {
    618		ifi_canfd_irq_enable(ndev, 0);
    619		napi_schedule(&priv->napi);
    620	}
    621
    622	/* TX IRQ */
    623	if (isr & IFI_CANFD_INTERRUPT_TXFIFO_REMOVE) {
    624		stats->tx_bytes += can_get_echo_skb(ndev, 0, NULL);
    625		stats->tx_packets++;
    626	}
    627
    628	if (isr & tx_irq_mask)
    629		netif_wake_queue(ndev);
    630
    631	return IRQ_HANDLED;
    632}
    633
    634static const struct can_bittiming_const ifi_canfd_bittiming_const = {
    635	.name		= KBUILD_MODNAME,
    636	.tseg1_min	= 1,	/* Time segment 1 = prop_seg + phase_seg1 */
    637	.tseg1_max	= 256,
    638	.tseg2_min	= 2,	/* Time segment 2 = phase_seg2 */
    639	.tseg2_max	= 256,
    640	.sjw_max	= 128,
    641	.brp_min	= 2,
    642	.brp_max	= 512,
    643	.brp_inc	= 1,
    644};
    645
    646static void ifi_canfd_set_bittiming(struct net_device *ndev)
    647{
    648	struct ifi_canfd_priv *priv = netdev_priv(ndev);
    649	const struct can_bittiming *bt = &priv->can.bittiming;
    650	const struct can_bittiming *dbt = &priv->can.data_bittiming;
    651	u16 brp, sjw, tseg1, tseg2, tdc;
    652
    653	/* Configure bit timing */
    654	brp = bt->brp - 2;
    655	sjw = bt->sjw - 1;
    656	tseg1 = bt->prop_seg + bt->phase_seg1 - 1;
    657	tseg2 = bt->phase_seg2 - 2;
    658	writel((tseg2 << IFI_CANFD_TIME_TIMEB_OFF) |
    659	       (tseg1 << IFI_CANFD_TIME_TIMEA_OFF) |
    660	       (brp << IFI_CANFD_TIME_PRESCALE_OFF) |
    661	       (sjw << IFI_CANFD_TIME_SJW_OFF_7_9_8_8),
    662	       priv->base + IFI_CANFD_TIME);
    663
    664	/* Configure data bit timing */
    665	brp = dbt->brp - 2;
    666	sjw = dbt->sjw - 1;
    667	tseg1 = dbt->prop_seg + dbt->phase_seg1 - 1;
    668	tseg2 = dbt->phase_seg2 - 2;
    669	writel((tseg2 << IFI_CANFD_TIME_TIMEB_OFF) |
    670	       (tseg1 << IFI_CANFD_TIME_TIMEA_OFF) |
    671	       (brp << IFI_CANFD_TIME_PRESCALE_OFF) |
    672	       (sjw << IFI_CANFD_TIME_SJW_OFF_7_9_8_8),
    673	       priv->base + IFI_CANFD_FTIME);
    674
    675	/* Configure transmitter delay */
    676	tdc = dbt->brp * (dbt->prop_seg + dbt->phase_seg1);
    677	tdc &= IFI_CANFD_TDELAY_MASK;
    678	writel(IFI_CANFD_TDELAY_EN | tdc, priv->base + IFI_CANFD_TDELAY);
    679}
    680
    681static void ifi_canfd_set_filter(struct net_device *ndev, const u32 id,
    682				 const u32 mask, const u32 ident)
    683{
    684	struct ifi_canfd_priv *priv = netdev_priv(ndev);
    685
    686	writel(mask, priv->base + IFI_CANFD_FILTER_MASK(id));
    687	writel(ident, priv->base + IFI_CANFD_FILTER_IDENT(id));
    688}
    689
    690static void ifi_canfd_set_filters(struct net_device *ndev)
    691{
    692	/* Receive all CAN frames (standard ID) */
    693	ifi_canfd_set_filter(ndev, 0,
    694			     IFI_CANFD_FILTER_MASK_VALID |
    695			     IFI_CANFD_FILTER_MASK_EXT,
    696			     IFI_CANFD_FILTER_IDENT_VALID);
    697
    698	/* Receive all CAN frames (extended ID) */
    699	ifi_canfd_set_filter(ndev, 1,
    700			     IFI_CANFD_FILTER_MASK_VALID |
    701			     IFI_CANFD_FILTER_MASK_EXT,
    702			     IFI_CANFD_FILTER_IDENT_VALID |
    703			     IFI_CANFD_FILTER_IDENT_IDE);
    704
    705	/* Receive all CANFD frames */
    706	ifi_canfd_set_filter(ndev, 2,
    707			     IFI_CANFD_FILTER_MASK_VALID |
    708			     IFI_CANFD_FILTER_MASK_EDL |
    709			     IFI_CANFD_FILTER_MASK_EXT,
    710			     IFI_CANFD_FILTER_IDENT_VALID |
    711			     IFI_CANFD_FILTER_IDENT_CANFD |
    712			     IFI_CANFD_FILTER_IDENT_IDE);
    713}
    714
    715static void ifi_canfd_start(struct net_device *ndev)
    716{
    717	struct ifi_canfd_priv *priv = netdev_priv(ndev);
    718	u32 stcmd;
    719
    720	/* Reset the IP */
    721	writel(IFI_CANFD_STCMD_HARDRESET, priv->base + IFI_CANFD_STCMD);
    722	writel(IFI_CANFD_STCMD_ENABLE_7_9_8_8_TIMING,
    723	       priv->base + IFI_CANFD_STCMD);
    724
    725	ifi_canfd_set_bittiming(ndev);
    726	ifi_canfd_set_filters(ndev);
    727
    728	/* Reset FIFOs */
    729	writel(IFI_CANFD_RXSTCMD_RESET, priv->base + IFI_CANFD_RXSTCMD);
    730	writel(0, priv->base + IFI_CANFD_RXSTCMD);
    731	writel(IFI_CANFD_TXSTCMD_RESET, priv->base + IFI_CANFD_TXSTCMD);
    732	writel(0, priv->base + IFI_CANFD_TXSTCMD);
    733
    734	/* Repeat transmission until successful */
    735	writel(0, priv->base + IFI_CANFD_REPEAT);
    736	writel(0, priv->base + IFI_CANFD_SUSPEND);
    737
    738	/* Clear all pending interrupts */
    739	writel((u32)(~IFI_CANFD_INTERRUPT_SET_IRQ),
    740	       priv->base + IFI_CANFD_INTERRUPT);
    741
    742	stcmd = IFI_CANFD_STCMD_ENABLE | IFI_CANFD_STCMD_NORMAL_MODE |
    743		IFI_CANFD_STCMD_ENABLE_7_9_8_8_TIMING;
    744
    745	if (priv->can.ctrlmode & CAN_CTRLMODE_LISTENONLY)
    746		stcmd |= IFI_CANFD_STCMD_BUSMONITOR;
    747
    748	if (priv->can.ctrlmode & CAN_CTRLMODE_LOOPBACK)
    749		stcmd |= IFI_CANFD_STCMD_LOOPBACK;
    750
    751	if ((priv->can.ctrlmode & CAN_CTRLMODE_FD) &&
    752	    !(priv->can.ctrlmode & CAN_CTRLMODE_FD_NON_ISO))
    753		stcmd |= IFI_CANFD_STCMD_ENABLE_ISO;
    754
    755	if (!(priv->can.ctrlmode & CAN_CTRLMODE_FD))
    756		stcmd |= IFI_CANFD_STCMD_DISABLE_CANFD;
    757
    758	priv->can.state = CAN_STATE_ERROR_ACTIVE;
    759
    760	ifi_canfd_irq_enable(ndev, 1);
    761
    762	/* Unlock, reset and enable the error counter. */
    763	writel(IFI_CANFD_ERROR_CTR_UNLOCK_MAGIC,
    764	       priv->base + IFI_CANFD_ERROR_CTR);
    765	writel(IFI_CANFD_ERROR_CTR_ER_RESET, priv->base + IFI_CANFD_ERROR_CTR);
    766	writel(IFI_CANFD_ERROR_CTR_ER_ENABLE, priv->base + IFI_CANFD_ERROR_CTR);
    767
    768	/* Enable controller */
    769	writel(stcmd, priv->base + IFI_CANFD_STCMD);
    770}
    771
    772static void ifi_canfd_stop(struct net_device *ndev)
    773{
    774	struct ifi_canfd_priv *priv = netdev_priv(ndev);
    775
    776	/* Reset and disable the error counter. */
    777	writel(IFI_CANFD_ERROR_CTR_ER_RESET, priv->base + IFI_CANFD_ERROR_CTR);
    778	writel(0, priv->base + IFI_CANFD_ERROR_CTR);
    779
    780	/* Reset the IP */
    781	writel(IFI_CANFD_STCMD_HARDRESET, priv->base + IFI_CANFD_STCMD);
    782
    783	/* Mask all interrupts */
    784	writel(~0, priv->base + IFI_CANFD_IRQMASK);
    785
    786	/* Clear all pending interrupts */
    787	writel((u32)(~IFI_CANFD_INTERRUPT_SET_IRQ),
    788	       priv->base + IFI_CANFD_INTERRUPT);
    789
    790	/* Set the state as STOPPED */
    791	priv->can.state = CAN_STATE_STOPPED;
    792}
    793
    794static int ifi_canfd_set_mode(struct net_device *ndev, enum can_mode mode)
    795{
    796	switch (mode) {
    797	case CAN_MODE_START:
    798		ifi_canfd_start(ndev);
    799		netif_wake_queue(ndev);
    800		break;
    801	default:
    802		return -EOPNOTSUPP;
    803	}
    804
    805	return 0;
    806}
    807
    808static int ifi_canfd_open(struct net_device *ndev)
    809{
    810	struct ifi_canfd_priv *priv = netdev_priv(ndev);
    811	int ret;
    812
    813	ret = open_candev(ndev);
    814	if (ret) {
    815		netdev_err(ndev, "Failed to open CAN device\n");
    816		return ret;
    817	}
    818
    819	/* Register interrupt handler */
    820	ret = request_irq(ndev->irq, ifi_canfd_isr, IRQF_SHARED,
    821			  ndev->name, ndev);
    822	if (ret < 0) {
    823		netdev_err(ndev, "Failed to request interrupt\n");
    824		goto err_irq;
    825	}
    826
    827	ifi_canfd_start(ndev);
    828
    829	napi_enable(&priv->napi);
    830	netif_start_queue(ndev);
    831
    832	return 0;
    833err_irq:
    834	close_candev(ndev);
    835	return ret;
    836}
    837
    838static int ifi_canfd_close(struct net_device *ndev)
    839{
    840	struct ifi_canfd_priv *priv = netdev_priv(ndev);
    841
    842	netif_stop_queue(ndev);
    843	napi_disable(&priv->napi);
    844
    845	ifi_canfd_stop(ndev);
    846
    847	free_irq(ndev->irq, ndev);
    848
    849	close_candev(ndev);
    850
    851	return 0;
    852}
    853
    854static netdev_tx_t ifi_canfd_start_xmit(struct sk_buff *skb,
    855					struct net_device *ndev)
    856{
    857	struct ifi_canfd_priv *priv = netdev_priv(ndev);
    858	struct canfd_frame *cf = (struct canfd_frame *)skb->data;
    859	u32 txst, txid, txdlc;
    860	int i;
    861
    862	if (can_dropped_invalid_skb(ndev, skb))
    863		return NETDEV_TX_OK;
    864
    865	/* Check if the TX buffer is full */
    866	txst = readl(priv->base + IFI_CANFD_TXSTCMD);
    867	if (txst & IFI_CANFD_TXSTCMD_FULL) {
    868		netif_stop_queue(ndev);
    869		netdev_err(ndev, "BUG! TX FIFO full when queue awake!\n");
    870		return NETDEV_TX_BUSY;
    871	}
    872
    873	netif_stop_queue(ndev);
    874
    875	if (cf->can_id & CAN_EFF_FLAG) {
    876		txid = cf->can_id & CAN_EFF_MASK;
    877		/*
    878		 * In case the Extended ID frame is transmitted, the
    879		 * standard and extended part of the ID are swapped
    880		 * in the register, so swap them back to send the
    881		 * correct ID.
    882		 */
    883		txid = (txid >> IFI_CANFD_TXFIFO_ID_ID_XTD_WIDTH) |
    884		       ((txid & IFI_CANFD_TXFIFO_ID_ID_XTD_MASK) <<
    885		         IFI_CANFD_TXFIFO_ID_ID_XTD_OFFSET);
    886		txid |= IFI_CANFD_TXFIFO_ID_IDE;
    887	} else {
    888		txid = cf->can_id & CAN_SFF_MASK;
    889	}
    890
    891	txdlc = can_fd_len2dlc(cf->len);
    892	if ((priv->can.ctrlmode & CAN_CTRLMODE_FD) && can_is_canfd_skb(skb)) {
    893		txdlc |= IFI_CANFD_TXFIFO_DLC_EDL;
    894		if (cf->flags & CANFD_BRS)
    895			txdlc |= IFI_CANFD_TXFIFO_DLC_BRS;
    896	}
    897
    898	if (cf->can_id & CAN_RTR_FLAG)
    899		txdlc |= IFI_CANFD_TXFIFO_DLC_RTR;
    900
    901	/* message ram configuration */
    902	writel(txid, priv->base + IFI_CANFD_TXFIFO_ID);
    903	writel(txdlc, priv->base + IFI_CANFD_TXFIFO_DLC);
    904
    905	for (i = 0; i < cf->len; i += 4) {
    906		writel(*(u32 *)(cf->data + i),
    907		       priv->base + IFI_CANFD_TXFIFO_DATA + i);
    908	}
    909
    910	writel(0, priv->base + IFI_CANFD_TXFIFO_REPEATCOUNT);
    911	writel(0, priv->base + IFI_CANFD_TXFIFO_SUSPEND_US);
    912
    913	can_put_echo_skb(skb, ndev, 0, 0);
    914
    915	/* Start the transmission */
    916	writel(IFI_CANFD_TXSTCMD_ADD_MSG, priv->base + IFI_CANFD_TXSTCMD);
    917
    918	return NETDEV_TX_OK;
    919}
    920
    921static const struct net_device_ops ifi_canfd_netdev_ops = {
    922	.ndo_open	= ifi_canfd_open,
    923	.ndo_stop	= ifi_canfd_close,
    924	.ndo_start_xmit	= ifi_canfd_start_xmit,
    925	.ndo_change_mtu	= can_change_mtu,
    926};
    927
    928static int ifi_canfd_plat_probe(struct platform_device *pdev)
    929{
    930	struct device *dev = &pdev->dev;
    931	struct net_device *ndev;
    932	struct ifi_canfd_priv *priv;
    933	void __iomem *addr;
    934	int irq, ret;
    935	u32 id, rev;
    936
    937	addr = devm_platform_ioremap_resource(pdev, 0);
    938	if (IS_ERR(addr))
    939		return PTR_ERR(addr);
    940
    941	irq = platform_get_irq(pdev, 0);
    942	if (irq < 0)
    943		return -EINVAL;
    944
    945	id = readl(addr + IFI_CANFD_IP_ID);
    946	if (id != IFI_CANFD_IP_ID_VALUE) {
    947		dev_err(dev, "This block is not IFI CANFD, id=%08x\n", id);
    948		return -EINVAL;
    949	}
    950
    951	rev = readl(addr + IFI_CANFD_VER) & IFI_CANFD_VER_REV_MASK;
    952	if (rev < IFI_CANFD_VER_REV_MIN_SUPPORTED) {
    953		dev_err(dev, "This block is too old (rev %i), minimum supported is rev %i\n",
    954			rev, IFI_CANFD_VER_REV_MIN_SUPPORTED);
    955		return -EINVAL;
    956	}
    957
    958	ndev = alloc_candev(sizeof(*priv), 1);
    959	if (!ndev)
    960		return -ENOMEM;
    961
    962	ndev->irq = irq;
    963	ndev->flags |= IFF_ECHO;	/* we support local echo */
    964	ndev->netdev_ops = &ifi_canfd_netdev_ops;
    965
    966	priv = netdev_priv(ndev);
    967	priv->ndev = ndev;
    968	priv->base = addr;
    969
    970	netif_napi_add(ndev, &priv->napi, ifi_canfd_poll, 64);
    971
    972	priv->can.state = CAN_STATE_STOPPED;
    973
    974	priv->can.clock.freq = readl(addr + IFI_CANFD_CANCLOCK);
    975
    976	priv->can.bittiming_const	= &ifi_canfd_bittiming_const;
    977	priv->can.data_bittiming_const	= &ifi_canfd_bittiming_const;
    978	priv->can.do_set_mode		= ifi_canfd_set_mode;
    979	priv->can.do_get_berr_counter	= ifi_canfd_get_berr_counter;
    980
    981	/* IFI CANFD can do both Bosch FD and ISO FD */
    982	priv->can.ctrlmode = CAN_CTRLMODE_FD;
    983
    984	/* IFI CANFD can do both Bosch FD and ISO FD */
    985	priv->can.ctrlmode_supported = CAN_CTRLMODE_LOOPBACK |
    986				       CAN_CTRLMODE_LISTENONLY |
    987				       CAN_CTRLMODE_FD |
    988				       CAN_CTRLMODE_FD_NON_ISO |
    989				       CAN_CTRLMODE_BERR_REPORTING;
    990
    991	platform_set_drvdata(pdev, ndev);
    992	SET_NETDEV_DEV(ndev, dev);
    993
    994	ret = register_candev(ndev);
    995	if (ret) {
    996		dev_err(dev, "Failed to register (ret=%d)\n", ret);
    997		goto err_reg;
    998	}
    999
   1000	dev_info(dev, "Driver registered: regs=%p, irq=%d, clock=%d\n",
   1001		 priv->base, ndev->irq, priv->can.clock.freq);
   1002
   1003	return 0;
   1004
   1005err_reg:
   1006	free_candev(ndev);
   1007	return ret;
   1008}
   1009
   1010static int ifi_canfd_plat_remove(struct platform_device *pdev)
   1011{
   1012	struct net_device *ndev = platform_get_drvdata(pdev);
   1013
   1014	unregister_candev(ndev);
   1015	platform_set_drvdata(pdev, NULL);
   1016	free_candev(ndev);
   1017
   1018	return 0;
   1019}
   1020
   1021static const struct of_device_id ifi_canfd_of_table[] = {
   1022	{ .compatible = "ifi,canfd-1.0", .data = NULL },
   1023	{ /* sentinel */ },
   1024};
   1025MODULE_DEVICE_TABLE(of, ifi_canfd_of_table);
   1026
   1027static struct platform_driver ifi_canfd_plat_driver = {
   1028	.driver = {
   1029		.name		= KBUILD_MODNAME,
   1030		.of_match_table	= ifi_canfd_of_table,
   1031	},
   1032	.probe	= ifi_canfd_plat_probe,
   1033	.remove	= ifi_canfd_plat_remove,
   1034};
   1035
   1036module_platform_driver(ifi_canfd_plat_driver);
   1037
   1038MODULE_AUTHOR("Marek Vasut <marex@denx.de>");
   1039MODULE_LICENSE("GPL v2");
   1040MODULE_DESCRIPTION("CAN bus driver for IFI CANFD controller");