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

janz-ican3.c (50955B)


      1// SPDX-License-Identifier: GPL-2.0-or-later
      2/*
      3 * Janz MODULbus VMOD-ICAN3 CAN Interface Driver
      4 *
      5 * Copyright (c) 2010 Ira W. Snyder <iws@ovro.caltech.edu>
      6 */
      7
      8#include <linux/kernel.h>
      9#include <linux/module.h>
     10#include <linux/interrupt.h>
     11#include <linux/delay.h>
     12#include <linux/platform_device.h>
     13
     14#include <linux/netdevice.h>
     15#include <linux/can.h>
     16#include <linux/can/dev.h>
     17#include <linux/can/skb.h>
     18#include <linux/can/error.h>
     19
     20#include <linux/mfd/janz.h>
     21#include <asm/io.h>
     22
     23/* the DPM has 64k of memory, organized into 256x 256 byte pages */
     24#define DPM_NUM_PAGES		256
     25#define DPM_PAGE_SIZE		256
     26#define DPM_PAGE_ADDR(p)	((p) * DPM_PAGE_SIZE)
     27
     28/* JANZ ICAN3 "old-style" host interface queue page numbers */
     29#define QUEUE_OLD_CONTROL	0
     30#define QUEUE_OLD_RB0		1
     31#define QUEUE_OLD_RB1		2
     32#define QUEUE_OLD_WB0		3
     33#define QUEUE_OLD_WB1		4
     34
     35/* Janz ICAN3 "old-style" host interface control registers */
     36#define MSYNC_PEER		0x00		/* ICAN only */
     37#define MSYNC_LOCL		0x01		/* host only */
     38#define TARGET_RUNNING		0x02
     39#define FIRMWARE_STAMP		0x60		/* big endian firmware stamp */
     40
     41#define MSYNC_RB0		0x01
     42#define MSYNC_RB1		0x02
     43#define MSYNC_RBLW		0x04
     44#define MSYNC_RB_MASK		(MSYNC_RB0 | MSYNC_RB1)
     45
     46#define MSYNC_WB0		0x10
     47#define MSYNC_WB1		0x20
     48#define MSYNC_WBLW		0x40
     49#define MSYNC_WB_MASK		(MSYNC_WB0 | MSYNC_WB1)
     50
     51/* Janz ICAN3 "new-style" host interface queue page numbers */
     52#define QUEUE_TOHOST		5
     53#define QUEUE_FROMHOST_MID	6
     54#define QUEUE_FROMHOST_HIGH	7
     55#define QUEUE_FROMHOST_LOW	8
     56
     57/* The first free page in the DPM is #9 */
     58#define DPM_FREE_START		9
     59
     60/* Janz ICAN3 "new-style" and "fast" host interface descriptor flags */
     61#define DESC_VALID		0x80
     62#define DESC_WRAP		0x40
     63#define DESC_INTERRUPT		0x20
     64#define DESC_IVALID		0x10
     65#define DESC_LEN(len)		(len)
     66
     67/* Janz ICAN3 Firmware Messages */
     68#define MSG_CONNECTI		0x02
     69#define MSG_DISCONNECT		0x03
     70#define MSG_IDVERS		0x04
     71#define MSG_MSGLOST		0x05
     72#define MSG_NEWHOSTIF		0x08
     73#define MSG_INQUIRY		0x0a
     74#define MSG_SETAFILMASK		0x10
     75#define MSG_INITFDPMQUEUE	0x11
     76#define MSG_HWCONF		0x12
     77#define MSG_FMSGLOST		0x15
     78#define MSG_CEVTIND		0x37
     79#define MSG_CBTRREQ		0x41
     80#define MSG_COFFREQ		0x42
     81#define MSG_CONREQ		0x43
     82#define MSG_CCONFREQ		0x47
     83#define MSG_NMTS		0xb0
     84#define MSG_LMTS		0xb4
     85
     86/*
     87 * Janz ICAN3 CAN Inquiry Message Types
     88 *
     89 * NOTE: there appears to be a firmware bug here. You must send
     90 * NOTE: INQUIRY_STATUS and expect to receive an INQUIRY_EXTENDED
     91 * NOTE: response. The controller never responds to a message with
     92 * NOTE: the INQUIRY_EXTENDED subspec :(
     93 */
     94#define INQUIRY_STATUS		0x00
     95#define INQUIRY_TERMINATION	0x01
     96#define INQUIRY_EXTENDED	0x04
     97
     98/* Janz ICAN3 CAN Set Acceptance Filter Mask Message Types */
     99#define SETAFILMASK_REJECT	0x00
    100#define SETAFILMASK_FASTIF	0x02
    101
    102/* Janz ICAN3 CAN Hardware Configuration Message Types */
    103#define HWCONF_TERMINATE_ON	0x01
    104#define HWCONF_TERMINATE_OFF	0x00
    105
    106/* Janz ICAN3 CAN Event Indication Message Types */
    107#define CEVTIND_EI		0x01
    108#define CEVTIND_DOI		0x02
    109#define CEVTIND_LOST		0x04
    110#define CEVTIND_FULL		0x08
    111#define CEVTIND_BEI		0x10
    112
    113#define CEVTIND_CHIP_SJA1000	0x02
    114
    115#define ICAN3_BUSERR_QUOTA_MAX	255
    116
    117/* Janz ICAN3 CAN Frame Conversion */
    118#define ICAN3_SNGL	0x02
    119#define ICAN3_ECHO	0x10
    120#define ICAN3_EFF_RTR	0x40
    121#define ICAN3_SFF_RTR	0x10
    122#define ICAN3_EFF	0x80
    123
    124#define ICAN3_CAN_TYPE_MASK	0x0f
    125#define ICAN3_CAN_TYPE_SFF	0x00
    126#define ICAN3_CAN_TYPE_EFF	0x01
    127
    128#define ICAN3_CAN_DLC_MASK	0x0f
    129
    130/* Janz ICAN3 NMTS subtypes */
    131#define NMTS_CREATE_NODE_REQ	0x0
    132#define NMTS_SLAVE_STATE_IND	0x8
    133#define NMTS_SLAVE_EVENT_IND	0x9
    134
    135/* Janz ICAN3 LMTS subtypes */
    136#define LMTS_BUSON_REQ		0x0
    137#define LMTS_BUSOFF_REQ		0x1
    138#define LMTS_CAN_CONF_REQ	0x2
    139
    140/* Janz ICAN3 NMTS Event indications */
    141#define NE_LOCAL_OCCURRED	0x3
    142#define NE_LOCAL_RESOLVED	0x2
    143#define NE_REMOTE_OCCURRED	0xc
    144#define NE_REMOTE_RESOLVED	0x8
    145
    146/*
    147 * SJA1000 Status and Error Register Definitions
    148 *
    149 * Copied from drivers/net/can/sja1000/sja1000.h
    150 */
    151
    152/* status register content */
    153#define SR_BS		0x80
    154#define SR_ES		0x40
    155#define SR_TS		0x20
    156#define SR_RS		0x10
    157#define SR_TCS		0x08
    158#define SR_TBS		0x04
    159#define SR_DOS		0x02
    160#define SR_RBS		0x01
    161
    162#define SR_CRIT (SR_BS|SR_ES)
    163
    164/* ECC register */
    165#define ECC_SEG		0x1F
    166#define ECC_DIR		0x20
    167#define ECC_ERR		6
    168#define ECC_BIT		0x00
    169#define ECC_FORM	0x40
    170#define ECC_STUFF	0x80
    171#define ECC_MASK	0xc0
    172
    173/* Number of buffers for use in the "new-style" host interface */
    174#define ICAN3_NEW_BUFFERS	16
    175
    176/* Number of buffers for use in the "fast" host interface */
    177#define ICAN3_TX_BUFFERS	512
    178#define ICAN3_RX_BUFFERS	1024
    179
    180/* SJA1000 Clock Input */
    181#define ICAN3_CAN_CLOCK		8000000
    182
    183/* Janz ICAN3 firmware types */
    184enum ican3_fwtype {
    185	ICAN3_FWTYPE_ICANOS,
    186	ICAN3_FWTYPE_CAL_CANOPEN,
    187};
    188
    189/* Driver Name */
    190#define DRV_NAME "janz-ican3"
    191
    192/* DPM Control Registers -- starts at offset 0x100 in the MODULbus registers */
    193struct ican3_dpm_control {
    194	/* window address register */
    195	u8 window_address;
    196	u8 unused1;
    197
    198	/*
    199	 * Read access: clear interrupt from microcontroller
    200	 * Write access: send interrupt to microcontroller
    201	 */
    202	u8 interrupt;
    203	u8 unused2;
    204
    205	/* write-only: reset all hardware on the module */
    206	u8 hwreset;
    207	u8 unused3;
    208
    209	/* write-only: generate an interrupt to the TPU */
    210	u8 tpuinterrupt;
    211};
    212
    213struct ican3_dev {
    214
    215	/* must be the first member */
    216	struct can_priv can;
    217
    218	/* CAN network device */
    219	struct net_device *ndev;
    220	struct napi_struct napi;
    221
    222	/* module number */
    223	unsigned int num;
    224
    225	/* base address of registers and IRQ */
    226	struct janz_cmodio_onboard_regs __iomem *ctrl;
    227	struct ican3_dpm_control __iomem *dpmctrl;
    228	void __iomem *dpm;
    229	int irq;
    230
    231	/* CAN bus termination status */
    232	struct completion termination_comp;
    233	bool termination_enabled;
    234
    235	/* CAN bus error status registers */
    236	struct completion buserror_comp;
    237	struct can_berr_counter bec;
    238
    239	/* firmware type */
    240	enum ican3_fwtype fwtype;
    241	char fwinfo[32];
    242
    243	/* old and new style host interface */
    244	unsigned int iftype;
    245
    246	/* queue for echo packets */
    247	struct sk_buff_head echoq;
    248
    249	/*
    250	 * Any function which changes the current DPM page must hold this
    251	 * lock while it is performing data accesses. This ensures that the
    252	 * function will not be preempted and end up reading data from a
    253	 * different DPM page than it expects.
    254	 */
    255	spinlock_t lock;
    256
    257	/* new host interface */
    258	unsigned int rx_int;
    259	unsigned int rx_num;
    260	unsigned int tx_num;
    261
    262	/* fast host interface */
    263	unsigned int fastrx_start;
    264	unsigned int fastrx_num;
    265	unsigned int fasttx_start;
    266	unsigned int fasttx_num;
    267
    268	/* first free DPM page */
    269	unsigned int free_page;
    270};
    271
    272struct ican3_msg {
    273	u8 control;
    274	u8 spec;
    275	__le16 len;
    276	u8 data[252];
    277};
    278
    279struct ican3_new_desc {
    280	u8 control;
    281	u8 pointer;
    282};
    283
    284struct ican3_fast_desc {
    285	u8 control;
    286	u8 command;
    287	u8 data[14];
    288};
    289
    290/* write to the window basic address register */
    291static inline void ican3_set_page(struct ican3_dev *mod, unsigned int page)
    292{
    293	BUG_ON(page >= DPM_NUM_PAGES);
    294	iowrite8(page, &mod->dpmctrl->window_address);
    295}
    296
    297/*
    298 * ICAN3 "old-style" host interface
    299 */
    300
    301/*
    302 * Receive a message from the ICAN3 "old-style" firmware interface
    303 *
    304 * LOCKING: must hold mod->lock
    305 *
    306 * returns 0 on success, -ENOMEM when no message exists
    307 */
    308static int ican3_old_recv_msg(struct ican3_dev *mod, struct ican3_msg *msg)
    309{
    310	unsigned int mbox, mbox_page;
    311	u8 locl, peer, xord;
    312
    313	/* get the MSYNC registers */
    314	ican3_set_page(mod, QUEUE_OLD_CONTROL);
    315	peer = ioread8(mod->dpm + MSYNC_PEER);
    316	locl = ioread8(mod->dpm + MSYNC_LOCL);
    317	xord = locl ^ peer;
    318
    319	if ((xord & MSYNC_RB_MASK) == 0x00) {
    320		netdev_dbg(mod->ndev, "no mbox for reading\n");
    321		return -ENOMEM;
    322	}
    323
    324	/* find the first free mbox to read */
    325	if ((xord & MSYNC_RB_MASK) == MSYNC_RB_MASK)
    326		mbox = (xord & MSYNC_RBLW) ? MSYNC_RB0 : MSYNC_RB1;
    327	else
    328		mbox = (xord & MSYNC_RB0) ? MSYNC_RB0 : MSYNC_RB1;
    329
    330	/* copy the message */
    331	mbox_page = (mbox == MSYNC_RB0) ? QUEUE_OLD_RB0 : QUEUE_OLD_RB1;
    332	ican3_set_page(mod, mbox_page);
    333	memcpy_fromio(msg, mod->dpm, sizeof(*msg));
    334
    335	/*
    336	 * notify the firmware that the read buffer is available
    337	 * for it to fill again
    338	 */
    339	locl ^= mbox;
    340
    341	ican3_set_page(mod, QUEUE_OLD_CONTROL);
    342	iowrite8(locl, mod->dpm + MSYNC_LOCL);
    343	return 0;
    344}
    345
    346/*
    347 * Send a message through the "old-style" firmware interface
    348 *
    349 * LOCKING: must hold mod->lock
    350 *
    351 * returns 0 on success, -ENOMEM when no free space exists
    352 */
    353static int ican3_old_send_msg(struct ican3_dev *mod, struct ican3_msg *msg)
    354{
    355	unsigned int mbox, mbox_page;
    356	u8 locl, peer, xord;
    357
    358	/* get the MSYNC registers */
    359	ican3_set_page(mod, QUEUE_OLD_CONTROL);
    360	peer = ioread8(mod->dpm + MSYNC_PEER);
    361	locl = ioread8(mod->dpm + MSYNC_LOCL);
    362	xord = locl ^ peer;
    363
    364	if ((xord & MSYNC_WB_MASK) == MSYNC_WB_MASK) {
    365		netdev_err(mod->ndev, "no mbox for writing\n");
    366		return -ENOMEM;
    367	}
    368
    369	/* calculate a free mbox to use */
    370	mbox = (xord & MSYNC_WB0) ? MSYNC_WB1 : MSYNC_WB0;
    371
    372	/* copy the message to the DPM */
    373	mbox_page = (mbox == MSYNC_WB0) ? QUEUE_OLD_WB0 : QUEUE_OLD_WB1;
    374	ican3_set_page(mod, mbox_page);
    375	memcpy_toio(mod->dpm, msg, sizeof(*msg));
    376
    377	locl ^= mbox;
    378	if (mbox == MSYNC_WB1)
    379		locl |= MSYNC_WBLW;
    380
    381	ican3_set_page(mod, QUEUE_OLD_CONTROL);
    382	iowrite8(locl, mod->dpm + MSYNC_LOCL);
    383	return 0;
    384}
    385
    386/*
    387 * ICAN3 "new-style" Host Interface Setup
    388 */
    389
    390static void ican3_init_new_host_interface(struct ican3_dev *mod)
    391{
    392	struct ican3_new_desc desc;
    393	unsigned long flags;
    394	void __iomem *dst;
    395	int i;
    396
    397	spin_lock_irqsave(&mod->lock, flags);
    398
    399	/* setup the internal datastructures for RX */
    400	mod->rx_num = 0;
    401	mod->rx_int = 0;
    402
    403	/* tohost queue descriptors are in page 5 */
    404	ican3_set_page(mod, QUEUE_TOHOST);
    405	dst = mod->dpm;
    406
    407	/* initialize the tohost (rx) queue descriptors: pages 9-24 */
    408	for (i = 0; i < ICAN3_NEW_BUFFERS; i++) {
    409		desc.control = DESC_INTERRUPT | DESC_LEN(1); /* I L=1 */
    410		desc.pointer = mod->free_page;
    411
    412		/* set wrap flag on last buffer */
    413		if (i == ICAN3_NEW_BUFFERS - 1)
    414			desc.control |= DESC_WRAP;
    415
    416		memcpy_toio(dst, &desc, sizeof(desc));
    417		dst += sizeof(desc);
    418		mod->free_page++;
    419	}
    420
    421	/* fromhost (tx) mid queue descriptors are in page 6 */
    422	ican3_set_page(mod, QUEUE_FROMHOST_MID);
    423	dst = mod->dpm;
    424
    425	/* setup the internal datastructures for TX */
    426	mod->tx_num = 0;
    427
    428	/* initialize the fromhost mid queue descriptors: pages 25-40 */
    429	for (i = 0; i < ICAN3_NEW_BUFFERS; i++) {
    430		desc.control = DESC_VALID | DESC_LEN(1); /* V L=1 */
    431		desc.pointer = mod->free_page;
    432
    433		/* set wrap flag on last buffer */
    434		if (i == ICAN3_NEW_BUFFERS - 1)
    435			desc.control |= DESC_WRAP;
    436
    437		memcpy_toio(dst, &desc, sizeof(desc));
    438		dst += sizeof(desc);
    439		mod->free_page++;
    440	}
    441
    442	/* fromhost hi queue descriptors are in page 7 */
    443	ican3_set_page(mod, QUEUE_FROMHOST_HIGH);
    444	dst = mod->dpm;
    445
    446	/* initialize only a single buffer in the fromhost hi queue (unused) */
    447	desc.control = DESC_VALID | DESC_WRAP | DESC_LEN(1); /* VW L=1 */
    448	desc.pointer = mod->free_page;
    449	memcpy_toio(dst, &desc, sizeof(desc));
    450	mod->free_page++;
    451
    452	/* fromhost low queue descriptors are in page 8 */
    453	ican3_set_page(mod, QUEUE_FROMHOST_LOW);
    454	dst = mod->dpm;
    455
    456	/* initialize only a single buffer in the fromhost low queue (unused) */
    457	desc.control = DESC_VALID | DESC_WRAP | DESC_LEN(1); /* VW L=1 */
    458	desc.pointer = mod->free_page;
    459	memcpy_toio(dst, &desc, sizeof(desc));
    460	mod->free_page++;
    461
    462	spin_unlock_irqrestore(&mod->lock, flags);
    463}
    464
    465/*
    466 * ICAN3 Fast Host Interface Setup
    467 */
    468
    469static void ican3_init_fast_host_interface(struct ican3_dev *mod)
    470{
    471	struct ican3_fast_desc desc;
    472	unsigned long flags;
    473	unsigned int addr;
    474	void __iomem *dst;
    475	int i;
    476
    477	spin_lock_irqsave(&mod->lock, flags);
    478
    479	/* save the start recv page */
    480	mod->fastrx_start = mod->free_page;
    481	mod->fastrx_num = 0;
    482
    483	/* build a single fast tohost queue descriptor */
    484	memset(&desc, 0, sizeof(desc));
    485	desc.control = 0x00;
    486	desc.command = 1;
    487
    488	/* build the tohost queue descriptor ring in memory */
    489	addr = 0;
    490	for (i = 0; i < ICAN3_RX_BUFFERS; i++) {
    491
    492		/* set the wrap bit on the last buffer */
    493		if (i == ICAN3_RX_BUFFERS - 1)
    494			desc.control |= DESC_WRAP;
    495
    496		/* switch to the correct page */
    497		ican3_set_page(mod, mod->free_page);
    498
    499		/* copy the descriptor to the DPM */
    500		dst = mod->dpm + addr;
    501		memcpy_toio(dst, &desc, sizeof(desc));
    502		addr += sizeof(desc);
    503
    504		/* move to the next page if necessary */
    505		if (addr >= DPM_PAGE_SIZE) {
    506			addr = 0;
    507			mod->free_page++;
    508		}
    509	}
    510
    511	/* make sure we page-align the next queue */
    512	if (addr != 0)
    513		mod->free_page++;
    514
    515	/* save the start xmit page */
    516	mod->fasttx_start = mod->free_page;
    517	mod->fasttx_num = 0;
    518
    519	/* build a single fast fromhost queue descriptor */
    520	memset(&desc, 0, sizeof(desc));
    521	desc.control = DESC_VALID;
    522	desc.command = 1;
    523
    524	/* build the fromhost queue descriptor ring in memory */
    525	addr = 0;
    526	for (i = 0; i < ICAN3_TX_BUFFERS; i++) {
    527
    528		/* set the wrap bit on the last buffer */
    529		if (i == ICAN3_TX_BUFFERS - 1)
    530			desc.control |= DESC_WRAP;
    531
    532		/* switch to the correct page */
    533		ican3_set_page(mod, mod->free_page);
    534
    535		/* copy the descriptor to the DPM */
    536		dst = mod->dpm + addr;
    537		memcpy_toio(dst, &desc, sizeof(desc));
    538		addr += sizeof(desc);
    539
    540		/* move to the next page if necessary */
    541		if (addr >= DPM_PAGE_SIZE) {
    542			addr = 0;
    543			mod->free_page++;
    544		}
    545	}
    546
    547	spin_unlock_irqrestore(&mod->lock, flags);
    548}
    549
    550/*
    551 * ICAN3 "new-style" Host Interface Message Helpers
    552 */
    553
    554/*
    555 * LOCKING: must hold mod->lock
    556 */
    557static int ican3_new_send_msg(struct ican3_dev *mod, struct ican3_msg *msg)
    558{
    559	struct ican3_new_desc desc;
    560	void __iomem *desc_addr = mod->dpm + (mod->tx_num * sizeof(desc));
    561
    562	/* switch to the fromhost mid queue, and read the buffer descriptor */
    563	ican3_set_page(mod, QUEUE_FROMHOST_MID);
    564	memcpy_fromio(&desc, desc_addr, sizeof(desc));
    565
    566	if (!(desc.control & DESC_VALID)) {
    567		netdev_dbg(mod->ndev, "%s: no free buffers\n", __func__);
    568		return -ENOMEM;
    569	}
    570
    571	/* switch to the data page, copy the data */
    572	ican3_set_page(mod, desc.pointer);
    573	memcpy_toio(mod->dpm, msg, sizeof(*msg));
    574
    575	/* switch back to the descriptor, set the valid bit, write it back */
    576	ican3_set_page(mod, QUEUE_FROMHOST_MID);
    577	desc.control ^= DESC_VALID;
    578	memcpy_toio(desc_addr, &desc, sizeof(desc));
    579
    580	/* update the tx number */
    581	mod->tx_num = (desc.control & DESC_WRAP) ? 0 : (mod->tx_num + 1);
    582	return 0;
    583}
    584
    585/*
    586 * LOCKING: must hold mod->lock
    587 */
    588static int ican3_new_recv_msg(struct ican3_dev *mod, struct ican3_msg *msg)
    589{
    590	struct ican3_new_desc desc;
    591	void __iomem *desc_addr = mod->dpm + (mod->rx_num * sizeof(desc));
    592
    593	/* switch to the tohost queue, and read the buffer descriptor */
    594	ican3_set_page(mod, QUEUE_TOHOST);
    595	memcpy_fromio(&desc, desc_addr, sizeof(desc));
    596
    597	if (!(desc.control & DESC_VALID)) {
    598		netdev_dbg(mod->ndev, "%s: no buffers to recv\n", __func__);
    599		return -ENOMEM;
    600	}
    601
    602	/* switch to the data page, copy the data */
    603	ican3_set_page(mod, desc.pointer);
    604	memcpy_fromio(msg, mod->dpm, sizeof(*msg));
    605
    606	/* switch back to the descriptor, toggle the valid bit, write it back */
    607	ican3_set_page(mod, QUEUE_TOHOST);
    608	desc.control ^= DESC_VALID;
    609	memcpy_toio(desc_addr, &desc, sizeof(desc));
    610
    611	/* update the rx number */
    612	mod->rx_num = (desc.control & DESC_WRAP) ? 0 : (mod->rx_num + 1);
    613	return 0;
    614}
    615
    616/*
    617 * Message Send / Recv Helpers
    618 */
    619
    620static int ican3_send_msg(struct ican3_dev *mod, struct ican3_msg *msg)
    621{
    622	unsigned long flags;
    623	int ret;
    624
    625	spin_lock_irqsave(&mod->lock, flags);
    626
    627	if (mod->iftype == 0)
    628		ret = ican3_old_send_msg(mod, msg);
    629	else
    630		ret = ican3_new_send_msg(mod, msg);
    631
    632	spin_unlock_irqrestore(&mod->lock, flags);
    633	return ret;
    634}
    635
    636static int ican3_recv_msg(struct ican3_dev *mod, struct ican3_msg *msg)
    637{
    638	unsigned long flags;
    639	int ret;
    640
    641	spin_lock_irqsave(&mod->lock, flags);
    642
    643	if (mod->iftype == 0)
    644		ret = ican3_old_recv_msg(mod, msg);
    645	else
    646		ret = ican3_new_recv_msg(mod, msg);
    647
    648	spin_unlock_irqrestore(&mod->lock, flags);
    649	return ret;
    650}
    651
    652/*
    653 * Quick Pre-constructed Messages
    654 */
    655
    656static int ican3_msg_connect(struct ican3_dev *mod)
    657{
    658	struct ican3_msg msg;
    659
    660	memset(&msg, 0, sizeof(msg));
    661	msg.spec = MSG_CONNECTI;
    662	msg.len = cpu_to_le16(0);
    663
    664	return ican3_send_msg(mod, &msg);
    665}
    666
    667static int ican3_msg_disconnect(struct ican3_dev *mod)
    668{
    669	struct ican3_msg msg;
    670
    671	memset(&msg, 0, sizeof(msg));
    672	msg.spec = MSG_DISCONNECT;
    673	msg.len = cpu_to_le16(0);
    674
    675	return ican3_send_msg(mod, &msg);
    676}
    677
    678static int ican3_msg_newhostif(struct ican3_dev *mod)
    679{
    680	struct ican3_msg msg;
    681	int ret;
    682
    683	memset(&msg, 0, sizeof(msg));
    684	msg.spec = MSG_NEWHOSTIF;
    685	msg.len = cpu_to_le16(0);
    686
    687	/* If we're not using the old interface, switching seems bogus */
    688	WARN_ON(mod->iftype != 0);
    689
    690	ret = ican3_send_msg(mod, &msg);
    691	if (ret)
    692		return ret;
    693
    694	/* mark the module as using the new host interface */
    695	mod->iftype = 1;
    696	return 0;
    697}
    698
    699static int ican3_msg_fasthostif(struct ican3_dev *mod)
    700{
    701	struct ican3_msg msg;
    702	unsigned int addr;
    703
    704	memset(&msg, 0, sizeof(msg));
    705	msg.spec = MSG_INITFDPMQUEUE;
    706	msg.len = cpu_to_le16(8);
    707
    708	/* write the tohost queue start address */
    709	addr = DPM_PAGE_ADDR(mod->fastrx_start);
    710	msg.data[0] = addr & 0xff;
    711	msg.data[1] = (addr >> 8) & 0xff;
    712	msg.data[2] = (addr >> 16) & 0xff;
    713	msg.data[3] = (addr >> 24) & 0xff;
    714
    715	/* write the fromhost queue start address */
    716	addr = DPM_PAGE_ADDR(mod->fasttx_start);
    717	msg.data[4] = addr & 0xff;
    718	msg.data[5] = (addr >> 8) & 0xff;
    719	msg.data[6] = (addr >> 16) & 0xff;
    720	msg.data[7] = (addr >> 24) & 0xff;
    721
    722	/* If we're not using the new interface yet, we cannot do this */
    723	WARN_ON(mod->iftype != 1);
    724
    725	return ican3_send_msg(mod, &msg);
    726}
    727
    728/*
    729 * Setup the CAN filter to either accept or reject all
    730 * messages from the CAN bus.
    731 */
    732static int ican3_set_id_filter(struct ican3_dev *mod, bool accept)
    733{
    734	struct ican3_msg msg;
    735	int ret;
    736
    737	/* Standard Frame Format */
    738	memset(&msg, 0, sizeof(msg));
    739	msg.spec = MSG_SETAFILMASK;
    740	msg.len = cpu_to_le16(5);
    741	msg.data[0] = 0x00; /* IDLo LSB */
    742	msg.data[1] = 0x00; /* IDLo MSB */
    743	msg.data[2] = 0xff; /* IDHi LSB */
    744	msg.data[3] = 0x07; /* IDHi MSB */
    745
    746	/* accept all frames for fast host if, or reject all frames */
    747	msg.data[4] = accept ? SETAFILMASK_FASTIF : SETAFILMASK_REJECT;
    748
    749	ret = ican3_send_msg(mod, &msg);
    750	if (ret)
    751		return ret;
    752
    753	/* Extended Frame Format */
    754	memset(&msg, 0, sizeof(msg));
    755	msg.spec = MSG_SETAFILMASK;
    756	msg.len = cpu_to_le16(13);
    757	msg.data[0] = 0;    /* MUX = 0 */
    758	msg.data[1] = 0x00; /* IDLo LSB */
    759	msg.data[2] = 0x00;
    760	msg.data[3] = 0x00;
    761	msg.data[4] = 0x20; /* IDLo MSB */
    762	msg.data[5] = 0xff; /* IDHi LSB */
    763	msg.data[6] = 0xff;
    764	msg.data[7] = 0xff;
    765	msg.data[8] = 0x3f; /* IDHi MSB */
    766
    767	/* accept all frames for fast host if, or reject all frames */
    768	msg.data[9] = accept ? SETAFILMASK_FASTIF : SETAFILMASK_REJECT;
    769
    770	return ican3_send_msg(mod, &msg);
    771}
    772
    773/*
    774 * Bring the CAN bus online or offline
    775 */
    776static int ican3_set_bus_state(struct ican3_dev *mod, bool on)
    777{
    778	struct can_bittiming *bt = &mod->can.bittiming;
    779	struct ican3_msg msg;
    780	u8 btr0, btr1;
    781	int res;
    782
    783	/* This algorithm was stolen from drivers/net/can/sja1000/sja1000.c      */
    784	/* The bittiming register command for the ICAN3 just sets the bit timing */
    785	/* registers on the SJA1000 chip directly                                */
    786	btr0 = ((bt->brp - 1) & 0x3f) | (((bt->sjw - 1) & 0x3) << 6);
    787	btr1 = ((bt->prop_seg + bt->phase_seg1 - 1) & 0xf) |
    788		(((bt->phase_seg2 - 1) & 0x7) << 4);
    789	if (mod->can.ctrlmode & CAN_CTRLMODE_3_SAMPLES)
    790		btr1 |= 0x80;
    791
    792	if (mod->fwtype == ICAN3_FWTYPE_ICANOS) {
    793		if (on) {
    794			/* set bittiming */
    795			memset(&msg, 0, sizeof(msg));
    796			msg.spec = MSG_CBTRREQ;
    797			msg.len = cpu_to_le16(4);
    798			msg.data[0] = 0x00;
    799			msg.data[1] = 0x00;
    800			msg.data[2] = btr0;
    801			msg.data[3] = btr1;
    802
    803			res = ican3_send_msg(mod, &msg);
    804			if (res)
    805				return res;
    806		}
    807
    808		/* can-on/off request */
    809		memset(&msg, 0, sizeof(msg));
    810		msg.spec = on ? MSG_CONREQ : MSG_COFFREQ;
    811		msg.len = cpu_to_le16(0);
    812
    813		return ican3_send_msg(mod, &msg);
    814
    815	} else if (mod->fwtype == ICAN3_FWTYPE_CAL_CANOPEN) {
    816		/* bittiming + can-on/off request */
    817		memset(&msg, 0, sizeof(msg));
    818		msg.spec = MSG_LMTS;
    819		if (on) {
    820			msg.len = cpu_to_le16(4);
    821			msg.data[0] = LMTS_BUSON_REQ;
    822			msg.data[1] = 0;
    823			msg.data[2] = btr0;
    824			msg.data[3] = btr1;
    825		} else {
    826			msg.len = cpu_to_le16(2);
    827			msg.data[0] = LMTS_BUSOFF_REQ;
    828			msg.data[1] = 0;
    829		}
    830		res = ican3_send_msg(mod, &msg);
    831		if (res)
    832			return res;
    833
    834		if (on) {
    835			/* create NMT Slave Node for error processing
    836			 *   class 2 (with error capability, see CiA/DS203-1)
    837			 *   id    1
    838			 *   name  locnod1 (must be exactly 7 bytes)
    839			 */
    840			memset(&msg, 0, sizeof(msg));
    841			msg.spec = MSG_NMTS;
    842			msg.len = cpu_to_le16(11);
    843			msg.data[0] = NMTS_CREATE_NODE_REQ;
    844			msg.data[1] = 0;
    845			msg.data[2] = 2;                 /* node class */
    846			msg.data[3] = 1;                 /* node id */
    847			strcpy(msg.data + 4, "locnod1"); /* node name  */
    848			return ican3_send_msg(mod, &msg);
    849		}
    850		return 0;
    851	}
    852	return -ENOTSUPP;
    853}
    854
    855static int ican3_set_termination(struct ican3_dev *mod, bool on)
    856{
    857	struct ican3_msg msg;
    858
    859	memset(&msg, 0, sizeof(msg));
    860	msg.spec = MSG_HWCONF;
    861	msg.len = cpu_to_le16(2);
    862	msg.data[0] = 0x00;
    863	msg.data[1] = on ? HWCONF_TERMINATE_ON : HWCONF_TERMINATE_OFF;
    864
    865	return ican3_send_msg(mod, &msg);
    866}
    867
    868static int ican3_send_inquiry(struct ican3_dev *mod, u8 subspec)
    869{
    870	struct ican3_msg msg;
    871
    872	memset(&msg, 0, sizeof(msg));
    873	msg.spec = MSG_INQUIRY;
    874	msg.len = cpu_to_le16(2);
    875	msg.data[0] = subspec;
    876	msg.data[1] = 0x00;
    877
    878	return ican3_send_msg(mod, &msg);
    879}
    880
    881static int ican3_set_buserror(struct ican3_dev *mod, u8 quota)
    882{
    883	struct ican3_msg msg;
    884
    885	if (mod->fwtype == ICAN3_FWTYPE_ICANOS) {
    886		memset(&msg, 0, sizeof(msg));
    887		msg.spec = MSG_CCONFREQ;
    888		msg.len = cpu_to_le16(2);
    889		msg.data[0] = 0x00;
    890		msg.data[1] = quota;
    891	} else if (mod->fwtype == ICAN3_FWTYPE_CAL_CANOPEN) {
    892		memset(&msg, 0, sizeof(msg));
    893		msg.spec = MSG_LMTS;
    894		msg.len = cpu_to_le16(4);
    895		msg.data[0] = LMTS_CAN_CONF_REQ;
    896		msg.data[1] = 0x00;
    897		msg.data[2] = 0x00;
    898		msg.data[3] = quota;
    899	} else {
    900		return -ENOTSUPP;
    901	}
    902	return ican3_send_msg(mod, &msg);
    903}
    904
    905/*
    906 * ICAN3 to Linux CAN Frame Conversion
    907 */
    908
    909static void ican3_to_can_frame(struct ican3_dev *mod,
    910			       struct ican3_fast_desc *desc,
    911			       struct can_frame *cf)
    912{
    913	if ((desc->command & ICAN3_CAN_TYPE_MASK) == ICAN3_CAN_TYPE_SFF) {
    914		if (desc->data[1] & ICAN3_SFF_RTR)
    915			cf->can_id |= CAN_RTR_FLAG;
    916
    917		cf->can_id |= desc->data[0] << 3;
    918		cf->can_id |= (desc->data[1] & 0xe0) >> 5;
    919		cf->len = can_cc_dlc2len(desc->data[1] & ICAN3_CAN_DLC_MASK);
    920		memcpy(cf->data, &desc->data[2], cf->len);
    921	} else {
    922		cf->len = can_cc_dlc2len(desc->data[0] & ICAN3_CAN_DLC_MASK);
    923		if (desc->data[0] & ICAN3_EFF_RTR)
    924			cf->can_id |= CAN_RTR_FLAG;
    925
    926		if (desc->data[0] & ICAN3_EFF) {
    927			cf->can_id |= CAN_EFF_FLAG;
    928			cf->can_id |= desc->data[2] << 21; /* 28-21 */
    929			cf->can_id |= desc->data[3] << 13; /* 20-13 */
    930			cf->can_id |= desc->data[4] << 5;  /* 12-5  */
    931			cf->can_id |= (desc->data[5] & 0xf8) >> 3;
    932		} else {
    933			cf->can_id |= desc->data[2] << 3;  /* 10-3  */
    934			cf->can_id |= desc->data[3] >> 5;  /* 2-0   */
    935		}
    936
    937		memcpy(cf->data, &desc->data[6], cf->len);
    938	}
    939}
    940
    941static void can_frame_to_ican3(struct ican3_dev *mod,
    942			       struct can_frame *cf,
    943			       struct ican3_fast_desc *desc)
    944{
    945	/* clear out any stale data in the descriptor */
    946	memset(desc->data, 0, sizeof(desc->data));
    947
    948	/* we always use the extended format, with the ECHO flag set */
    949	desc->command = ICAN3_CAN_TYPE_EFF;
    950	desc->data[0] |= cf->len;
    951	desc->data[1] |= ICAN3_ECHO;
    952
    953	/* support single transmission (no retries) mode */
    954	if (mod->can.ctrlmode & CAN_CTRLMODE_ONE_SHOT)
    955		desc->data[1] |= ICAN3_SNGL;
    956
    957	if (cf->can_id & CAN_RTR_FLAG)
    958		desc->data[0] |= ICAN3_EFF_RTR;
    959
    960	/* pack the id into the correct places */
    961	if (cf->can_id & CAN_EFF_FLAG) {
    962		desc->data[0] |= ICAN3_EFF;
    963		desc->data[2] = (cf->can_id & 0x1fe00000) >> 21; /* 28-21 */
    964		desc->data[3] = (cf->can_id & 0x001fe000) >> 13; /* 20-13 */
    965		desc->data[4] = (cf->can_id & 0x00001fe0) >> 5;  /* 12-5  */
    966		desc->data[5] = (cf->can_id & 0x0000001f) << 3;  /* 4-0   */
    967	} else {
    968		desc->data[2] = (cf->can_id & 0x7F8) >> 3; /* bits 10-3 */
    969		desc->data[3] = (cf->can_id & 0x007) << 5; /* bits 2-0  */
    970	}
    971
    972	/* copy the data bits into the descriptor */
    973	memcpy(&desc->data[6], cf->data, cf->len);
    974}
    975
    976/*
    977 * Interrupt Handling
    978 */
    979
    980/*
    981 * Handle an ID + Version message response from the firmware. We never generate
    982 * this message in production code, but it is very useful when debugging to be
    983 * able to display this message.
    984 */
    985static void ican3_handle_idvers(struct ican3_dev *mod, struct ican3_msg *msg)
    986{
    987	netdev_dbg(mod->ndev, "IDVERS response: %s\n", msg->data);
    988}
    989
    990static void ican3_handle_msglost(struct ican3_dev *mod, struct ican3_msg *msg)
    991{
    992	struct net_device *dev = mod->ndev;
    993	struct net_device_stats *stats = &dev->stats;
    994	struct can_frame *cf;
    995	struct sk_buff *skb;
    996
    997	/*
    998	 * Report that communication messages with the microcontroller firmware
    999	 * are being lost. These are never CAN frames, so we do not generate an
   1000	 * error frame for userspace
   1001	 */
   1002	if (msg->spec == MSG_MSGLOST) {
   1003		netdev_err(mod->ndev, "lost %d control messages\n", msg->data[0]);
   1004		return;
   1005	}
   1006
   1007	/*
   1008	 * Oops, this indicates that we have lost messages in the fast queue,
   1009	 * which are exclusively CAN messages. Our driver isn't reading CAN
   1010	 * frames fast enough.
   1011	 *
   1012	 * We'll pretend that the SJA1000 told us that it ran out of buffer
   1013	 * space, because there is not a better message for this.
   1014	 */
   1015	skb = alloc_can_err_skb(dev, &cf);
   1016	if (skb) {
   1017		cf->can_id |= CAN_ERR_CRTL;
   1018		cf->data[1] = CAN_ERR_CRTL_RX_OVERFLOW;
   1019		stats->rx_over_errors++;
   1020		stats->rx_errors++;
   1021		netif_rx(skb);
   1022	}
   1023}
   1024
   1025/*
   1026 * Handle CAN Event Indication Messages from the firmware
   1027 *
   1028 * The ICAN3 firmware provides the values of some SJA1000 registers when it
   1029 * generates this message. The code below is largely copied from the
   1030 * drivers/net/can/sja1000/sja1000.c file, and adapted as necessary
   1031 */
   1032static int ican3_handle_cevtind(struct ican3_dev *mod, struct ican3_msg *msg)
   1033{
   1034	struct net_device *dev = mod->ndev;
   1035	struct net_device_stats *stats = &dev->stats;
   1036	enum can_state state = mod->can.state;
   1037	u8 isrc, ecc, status, rxerr, txerr;
   1038	struct can_frame *cf;
   1039	struct sk_buff *skb;
   1040
   1041	/* we can only handle the SJA1000 part */
   1042	if (msg->data[1] != CEVTIND_CHIP_SJA1000) {
   1043		netdev_err(mod->ndev, "unable to handle errors on non-SJA1000\n");
   1044		return -ENODEV;
   1045	}
   1046
   1047	/* check the message length for sanity */
   1048	if (le16_to_cpu(msg->len) < 6) {
   1049		netdev_err(mod->ndev, "error message too short\n");
   1050		return -EINVAL;
   1051	}
   1052
   1053	isrc = msg->data[0];
   1054	ecc = msg->data[2];
   1055	status = msg->data[3];
   1056	rxerr = msg->data[4];
   1057	txerr = msg->data[5];
   1058
   1059	/*
   1060	 * This hardware lacks any support other than bus error messages to
   1061	 * determine if packet transmission has failed.
   1062	 *
   1063	 * When TX errors happen, one echo skb needs to be dropped from the
   1064	 * front of the queue.
   1065	 *
   1066	 * A small bit of code is duplicated here and below, to avoid error
   1067	 * skb allocation when it will just be freed immediately.
   1068	 */
   1069	if (isrc == CEVTIND_BEI) {
   1070		int ret;
   1071		netdev_dbg(mod->ndev, "bus error interrupt\n");
   1072
   1073		/* TX error */
   1074		if (!(ecc & ECC_DIR)) {
   1075			kfree_skb(skb_dequeue(&mod->echoq));
   1076			stats->tx_errors++;
   1077		} else {
   1078			stats->rx_errors++;
   1079		}
   1080
   1081		/*
   1082		 * The controller automatically disables bus-error interrupts
   1083		 * and therefore we must re-enable them.
   1084		 */
   1085		ret = ican3_set_buserror(mod, 1);
   1086		if (ret) {
   1087			netdev_err(mod->ndev, "unable to re-enable bus-error\n");
   1088			return ret;
   1089		}
   1090
   1091		/* bus error reporting is off, return immediately */
   1092		if (!(mod->can.ctrlmode & CAN_CTRLMODE_BERR_REPORTING))
   1093			return 0;
   1094	}
   1095
   1096	skb = alloc_can_err_skb(dev, &cf);
   1097	if (skb == NULL)
   1098		return -ENOMEM;
   1099
   1100	/* data overrun interrupt */
   1101	if (isrc == CEVTIND_DOI || isrc == CEVTIND_LOST) {
   1102		netdev_dbg(mod->ndev, "data overrun interrupt\n");
   1103		cf->can_id |= CAN_ERR_CRTL;
   1104		cf->data[1] = CAN_ERR_CRTL_RX_OVERFLOW;
   1105		stats->rx_over_errors++;
   1106		stats->rx_errors++;
   1107	}
   1108
   1109	/* error warning + passive interrupt */
   1110	if (isrc == CEVTIND_EI) {
   1111		netdev_dbg(mod->ndev, "error warning + passive interrupt\n");
   1112		if (status & SR_BS) {
   1113			state = CAN_STATE_BUS_OFF;
   1114			cf->can_id |= CAN_ERR_BUSOFF;
   1115			mod->can.can_stats.bus_off++;
   1116			can_bus_off(dev);
   1117		} else if (status & SR_ES) {
   1118			if (rxerr >= 128 || txerr >= 128)
   1119				state = CAN_STATE_ERROR_PASSIVE;
   1120			else
   1121				state = CAN_STATE_ERROR_WARNING;
   1122		} else {
   1123			state = CAN_STATE_ERROR_ACTIVE;
   1124		}
   1125	}
   1126
   1127	/* bus error interrupt */
   1128	if (isrc == CEVTIND_BEI) {
   1129		mod->can.can_stats.bus_error++;
   1130		cf->can_id |= CAN_ERR_PROT | CAN_ERR_BUSERROR;
   1131
   1132		switch (ecc & ECC_MASK) {
   1133		case ECC_BIT:
   1134			cf->data[2] |= CAN_ERR_PROT_BIT;
   1135			break;
   1136		case ECC_FORM:
   1137			cf->data[2] |= CAN_ERR_PROT_FORM;
   1138			break;
   1139		case ECC_STUFF:
   1140			cf->data[2] |= CAN_ERR_PROT_STUFF;
   1141			break;
   1142		default:
   1143			cf->data[3] = ecc & ECC_SEG;
   1144			break;
   1145		}
   1146
   1147		if (!(ecc & ECC_DIR))
   1148			cf->data[2] |= CAN_ERR_PROT_TX;
   1149
   1150		cf->data[6] = txerr;
   1151		cf->data[7] = rxerr;
   1152	}
   1153
   1154	if (state != mod->can.state && (state == CAN_STATE_ERROR_WARNING ||
   1155					state == CAN_STATE_ERROR_PASSIVE)) {
   1156		cf->can_id |= CAN_ERR_CRTL;
   1157		if (state == CAN_STATE_ERROR_WARNING) {
   1158			mod->can.can_stats.error_warning++;
   1159			cf->data[1] = (txerr > rxerr) ?
   1160				CAN_ERR_CRTL_TX_WARNING :
   1161				CAN_ERR_CRTL_RX_WARNING;
   1162		} else {
   1163			mod->can.can_stats.error_passive++;
   1164			cf->data[1] = (txerr > rxerr) ?
   1165				CAN_ERR_CRTL_TX_PASSIVE :
   1166				CAN_ERR_CRTL_RX_PASSIVE;
   1167		}
   1168
   1169		cf->data[6] = txerr;
   1170		cf->data[7] = rxerr;
   1171	}
   1172
   1173	mod->can.state = state;
   1174	netif_rx(skb);
   1175	return 0;
   1176}
   1177
   1178static void ican3_handle_inquiry(struct ican3_dev *mod, struct ican3_msg *msg)
   1179{
   1180	switch (msg->data[0]) {
   1181	case INQUIRY_STATUS:
   1182	case INQUIRY_EXTENDED:
   1183		mod->bec.rxerr = msg->data[5];
   1184		mod->bec.txerr = msg->data[6];
   1185		complete(&mod->buserror_comp);
   1186		break;
   1187	case INQUIRY_TERMINATION:
   1188		mod->termination_enabled = msg->data[6] & HWCONF_TERMINATE_ON;
   1189		complete(&mod->termination_comp);
   1190		break;
   1191	default:
   1192		netdev_err(mod->ndev, "received an unknown inquiry response\n");
   1193		break;
   1194	}
   1195}
   1196
   1197/* Handle NMTS Slave Event Indication Messages from the firmware */
   1198static void ican3_handle_nmtsind(struct ican3_dev *mod, struct ican3_msg *msg)
   1199{
   1200	u16 subspec;
   1201
   1202	subspec = msg->data[0] + msg->data[1] * 0x100;
   1203	if (subspec == NMTS_SLAVE_EVENT_IND) {
   1204		switch (msg->data[2]) {
   1205		case NE_LOCAL_OCCURRED:
   1206		case NE_LOCAL_RESOLVED:
   1207			/* now follows the same message as Raw ICANOS CEVTIND
   1208			 * shift the data at the same place and call this method
   1209			 */
   1210			le16_add_cpu(&msg->len, -3);
   1211			memmove(msg->data, msg->data + 3, le16_to_cpu(msg->len));
   1212			ican3_handle_cevtind(mod, msg);
   1213			break;
   1214		case NE_REMOTE_OCCURRED:
   1215		case NE_REMOTE_RESOLVED:
   1216			/* should not occurre, ignore */
   1217			break;
   1218		default:
   1219			netdev_warn(mod->ndev, "unknown NMTS event indication %x\n",
   1220				    msg->data[2]);
   1221			break;
   1222		}
   1223	} else if (subspec == NMTS_SLAVE_STATE_IND) {
   1224		/* ignore state indications */
   1225	} else {
   1226		netdev_warn(mod->ndev, "unhandled NMTS indication %x\n",
   1227			    subspec);
   1228		return;
   1229	}
   1230}
   1231
   1232static void ican3_handle_unknown_message(struct ican3_dev *mod,
   1233					struct ican3_msg *msg)
   1234{
   1235	netdev_warn(mod->ndev, "received unknown message: spec 0x%.2x length %d\n",
   1236			   msg->spec, le16_to_cpu(msg->len));
   1237}
   1238
   1239/*
   1240 * Handle a control message from the firmware
   1241 */
   1242static void ican3_handle_message(struct ican3_dev *mod, struct ican3_msg *msg)
   1243{
   1244	netdev_dbg(mod->ndev, "%s: modno %d spec 0x%.2x len %d bytes\n", __func__,
   1245			   mod->num, msg->spec, le16_to_cpu(msg->len));
   1246
   1247	switch (msg->spec) {
   1248	case MSG_IDVERS:
   1249		ican3_handle_idvers(mod, msg);
   1250		break;
   1251	case MSG_MSGLOST:
   1252	case MSG_FMSGLOST:
   1253		ican3_handle_msglost(mod, msg);
   1254		break;
   1255	case MSG_CEVTIND:
   1256		ican3_handle_cevtind(mod, msg);
   1257		break;
   1258	case MSG_INQUIRY:
   1259		ican3_handle_inquiry(mod, msg);
   1260		break;
   1261	case MSG_NMTS:
   1262		ican3_handle_nmtsind(mod, msg);
   1263		break;
   1264	default:
   1265		ican3_handle_unknown_message(mod, msg);
   1266		break;
   1267	}
   1268}
   1269
   1270/*
   1271 * The ican3 needs to store all echo skbs, and therefore cannot
   1272 * use the generic infrastructure for this.
   1273 */
   1274static void ican3_put_echo_skb(struct ican3_dev *mod, struct sk_buff *skb)
   1275{
   1276	skb = can_create_echo_skb(skb);
   1277	if (!skb)
   1278		return;
   1279
   1280	/* save this skb for tx interrupt echo handling */
   1281	skb_queue_tail(&mod->echoq, skb);
   1282}
   1283
   1284static unsigned int ican3_get_echo_skb(struct ican3_dev *mod)
   1285{
   1286	struct sk_buff *skb = skb_dequeue(&mod->echoq);
   1287	struct can_frame *cf;
   1288	u8 dlc = 0;
   1289
   1290	/* this should never trigger unless there is a driver bug */
   1291	if (!skb) {
   1292		netdev_err(mod->ndev, "BUG: echo skb not occupied\n");
   1293		return 0;
   1294	}
   1295
   1296	cf = (struct can_frame *)skb->data;
   1297	if (!(cf->can_id & CAN_RTR_FLAG))
   1298		dlc = cf->len;
   1299
   1300	/* check flag whether this packet has to be looped back */
   1301	if (skb->pkt_type != PACKET_LOOPBACK) {
   1302		kfree_skb(skb);
   1303		return dlc;
   1304	}
   1305
   1306	skb->protocol = htons(ETH_P_CAN);
   1307	skb->pkt_type = PACKET_BROADCAST;
   1308	skb->ip_summed = CHECKSUM_UNNECESSARY;
   1309	skb->dev = mod->ndev;
   1310	netif_receive_skb(skb);
   1311	return dlc;
   1312}
   1313
   1314/*
   1315 * Compare an skb with an existing echo skb
   1316 *
   1317 * This function will be used on devices which have a hardware loopback.
   1318 * On these devices, this function can be used to compare a received skb
   1319 * with the saved echo skbs so that the hardware echo skb can be dropped.
   1320 *
   1321 * Returns true if the skb's are identical, false otherwise.
   1322 */
   1323static bool ican3_echo_skb_matches(struct ican3_dev *mod, struct sk_buff *skb)
   1324{
   1325	struct can_frame *cf = (struct can_frame *)skb->data;
   1326	struct sk_buff *echo_skb = skb_peek(&mod->echoq);
   1327	struct can_frame *echo_cf;
   1328
   1329	if (!echo_skb)
   1330		return false;
   1331
   1332	echo_cf = (struct can_frame *)echo_skb->data;
   1333	if (cf->can_id != echo_cf->can_id)
   1334		return false;
   1335
   1336	if (cf->len != echo_cf->len)
   1337		return false;
   1338
   1339	return memcmp(cf->data, echo_cf->data, cf->len) == 0;
   1340}
   1341
   1342/*
   1343 * Check that there is room in the TX ring to transmit another skb
   1344 *
   1345 * LOCKING: must hold mod->lock
   1346 */
   1347static bool ican3_txok(struct ican3_dev *mod)
   1348{
   1349	struct ican3_fast_desc __iomem *desc;
   1350	u8 control;
   1351
   1352	/* check that we have echo queue space */
   1353	if (skb_queue_len(&mod->echoq) >= ICAN3_TX_BUFFERS)
   1354		return false;
   1355
   1356	/* copy the control bits of the descriptor */
   1357	ican3_set_page(mod, mod->fasttx_start + (mod->fasttx_num / 16));
   1358	desc = mod->dpm + ((mod->fasttx_num % 16) * sizeof(*desc));
   1359	control = ioread8(&desc->control);
   1360
   1361	/* if the control bits are not valid, then we have no more space */
   1362	if (!(control & DESC_VALID))
   1363		return false;
   1364
   1365	return true;
   1366}
   1367
   1368/*
   1369 * Receive one CAN frame from the hardware
   1370 *
   1371 * CONTEXT: must be called from user context
   1372 */
   1373static int ican3_recv_skb(struct ican3_dev *mod)
   1374{
   1375	struct net_device *ndev = mod->ndev;
   1376	struct net_device_stats *stats = &ndev->stats;
   1377	struct ican3_fast_desc desc;
   1378	void __iomem *desc_addr;
   1379	struct can_frame *cf;
   1380	struct sk_buff *skb;
   1381	unsigned long flags;
   1382
   1383	spin_lock_irqsave(&mod->lock, flags);
   1384
   1385	/* copy the whole descriptor */
   1386	ican3_set_page(mod, mod->fastrx_start + (mod->fastrx_num / 16));
   1387	desc_addr = mod->dpm + ((mod->fastrx_num % 16) * sizeof(desc));
   1388	memcpy_fromio(&desc, desc_addr, sizeof(desc));
   1389
   1390	spin_unlock_irqrestore(&mod->lock, flags);
   1391
   1392	/* check that we actually have a CAN frame */
   1393	if (!(desc.control & DESC_VALID))
   1394		return -ENOBUFS;
   1395
   1396	/* allocate an skb */
   1397	skb = alloc_can_skb(ndev, &cf);
   1398	if (unlikely(skb == NULL)) {
   1399		stats->rx_dropped++;
   1400		goto err_noalloc;
   1401	}
   1402
   1403	/* convert the ICAN3 frame into Linux CAN format */
   1404	ican3_to_can_frame(mod, &desc, cf);
   1405
   1406	/*
   1407	 * If this is an ECHO frame received from the hardware loopback
   1408	 * feature, use the skb saved in the ECHO stack instead. This allows
   1409	 * the Linux CAN core to support CAN_RAW_RECV_OWN_MSGS correctly.
   1410	 *
   1411	 * Since this is a confirmation of a successfully transmitted packet
   1412	 * sent from this host, update the transmit statistics.
   1413	 *
   1414	 * Also, the netdevice queue needs to be allowed to send packets again.
   1415	 */
   1416	if (ican3_echo_skb_matches(mod, skb)) {
   1417		stats->tx_packets++;
   1418		stats->tx_bytes += ican3_get_echo_skb(mod);
   1419		kfree_skb(skb);
   1420		goto err_noalloc;
   1421	}
   1422
   1423	/* update statistics, receive the skb */
   1424	stats->rx_packets++;
   1425	if (!(cf->can_id & CAN_RTR_FLAG))
   1426		stats->rx_bytes += cf->len;
   1427	netif_receive_skb(skb);
   1428
   1429err_noalloc:
   1430	/* toggle the valid bit and return the descriptor to the ring */
   1431	desc.control ^= DESC_VALID;
   1432
   1433	spin_lock_irqsave(&mod->lock, flags);
   1434
   1435	ican3_set_page(mod, mod->fastrx_start + (mod->fastrx_num / 16));
   1436	memcpy_toio(desc_addr, &desc, 1);
   1437
   1438	/* update the next buffer pointer */
   1439	mod->fastrx_num = (desc.control & DESC_WRAP) ? 0
   1440						     : (mod->fastrx_num + 1);
   1441
   1442	/* there are still more buffers to process */
   1443	spin_unlock_irqrestore(&mod->lock, flags);
   1444	return 0;
   1445}
   1446
   1447static int ican3_napi(struct napi_struct *napi, int budget)
   1448{
   1449	struct ican3_dev *mod = container_of(napi, struct ican3_dev, napi);
   1450	unsigned long flags;
   1451	int received = 0;
   1452	int ret;
   1453
   1454	/* process all communication messages */
   1455	while (true) {
   1456		struct ican3_msg msg;
   1457		ret = ican3_recv_msg(mod, &msg);
   1458		if (ret)
   1459			break;
   1460
   1461		ican3_handle_message(mod, &msg);
   1462	}
   1463
   1464	/* process all CAN frames from the fast interface */
   1465	while (received < budget) {
   1466		ret = ican3_recv_skb(mod);
   1467		if (ret)
   1468			break;
   1469
   1470		received++;
   1471	}
   1472
   1473	/* We have processed all packets that the adapter had, but it
   1474	 * was less than our budget, stop polling */
   1475	if (received < budget)
   1476		napi_complete_done(napi, received);
   1477
   1478	spin_lock_irqsave(&mod->lock, flags);
   1479
   1480	/* Wake up the transmit queue if necessary */
   1481	if (netif_queue_stopped(mod->ndev) && ican3_txok(mod))
   1482		netif_wake_queue(mod->ndev);
   1483
   1484	spin_unlock_irqrestore(&mod->lock, flags);
   1485
   1486	/* re-enable interrupt generation */
   1487	iowrite8(1 << mod->num, &mod->ctrl->int_enable);
   1488	return received;
   1489}
   1490
   1491static irqreturn_t ican3_irq(int irq, void *dev_id)
   1492{
   1493	struct ican3_dev *mod = dev_id;
   1494	u8 stat;
   1495
   1496	/*
   1497	 * The interrupt status register on this device reports interrupts
   1498	 * as zeroes instead of using ones like most other devices
   1499	 */
   1500	stat = ioread8(&mod->ctrl->int_disable) & (1 << mod->num);
   1501	if (stat == (1 << mod->num))
   1502		return IRQ_NONE;
   1503
   1504	/* clear the MODULbus interrupt from the microcontroller */
   1505	ioread8(&mod->dpmctrl->interrupt);
   1506
   1507	/* disable interrupt generation, schedule the NAPI poller */
   1508	iowrite8(1 << mod->num, &mod->ctrl->int_disable);
   1509	napi_schedule(&mod->napi);
   1510	return IRQ_HANDLED;
   1511}
   1512
   1513/*
   1514 * Firmware reset, startup, and shutdown
   1515 */
   1516
   1517/*
   1518 * Reset an ICAN module to its power-on state
   1519 *
   1520 * CONTEXT: no network device registered
   1521 */
   1522static int ican3_reset_module(struct ican3_dev *mod)
   1523{
   1524	unsigned long start;
   1525	u8 runold, runnew;
   1526
   1527	/* disable interrupts so no more work is scheduled */
   1528	iowrite8(1 << mod->num, &mod->ctrl->int_disable);
   1529
   1530	/* the first unallocated page in the DPM is #9 */
   1531	mod->free_page = DPM_FREE_START;
   1532
   1533	ican3_set_page(mod, QUEUE_OLD_CONTROL);
   1534	runold = ioread8(mod->dpm + TARGET_RUNNING);
   1535
   1536	/* reset the module */
   1537	iowrite8(0x00, &mod->dpmctrl->hwreset);
   1538
   1539	/* wait until the module has finished resetting and is running */
   1540	start = jiffies;
   1541	do {
   1542		ican3_set_page(mod, QUEUE_OLD_CONTROL);
   1543		runnew = ioread8(mod->dpm + TARGET_RUNNING);
   1544		if (runnew == (runold ^ 0xff))
   1545			return 0;
   1546
   1547		msleep(10);
   1548	} while (time_before(jiffies, start + HZ / 2));
   1549
   1550	netdev_err(mod->ndev, "failed to reset CAN module\n");
   1551	return -ETIMEDOUT;
   1552}
   1553
   1554static void ican3_shutdown_module(struct ican3_dev *mod)
   1555{
   1556	ican3_msg_disconnect(mod);
   1557	ican3_reset_module(mod);
   1558}
   1559
   1560/*
   1561 * Startup an ICAN module, bringing it into fast mode
   1562 */
   1563static int ican3_startup_module(struct ican3_dev *mod)
   1564{
   1565	int ret;
   1566
   1567	ret = ican3_reset_module(mod);
   1568	if (ret) {
   1569		netdev_err(mod->ndev, "unable to reset module\n");
   1570		return ret;
   1571	}
   1572
   1573	/* detect firmware */
   1574	memcpy_fromio(mod->fwinfo, mod->dpm + FIRMWARE_STAMP, sizeof(mod->fwinfo) - 1);
   1575	if (strncmp(mod->fwinfo, "JANZ-ICAN3", 10)) {
   1576		netdev_err(mod->ndev, "ICAN3 not detected (found %s)\n", mod->fwinfo);
   1577		return -ENODEV;
   1578	}
   1579	if (strstr(mod->fwinfo, "CAL/CANopen"))
   1580		mod->fwtype = ICAN3_FWTYPE_CAL_CANOPEN;
   1581	else
   1582		mod->fwtype = ICAN3_FWTYPE_ICANOS;
   1583
   1584	/* re-enable interrupts so we can send messages */
   1585	iowrite8(1 << mod->num, &mod->ctrl->int_enable);
   1586
   1587	ret = ican3_msg_connect(mod);
   1588	if (ret) {
   1589		netdev_err(mod->ndev, "unable to connect to module\n");
   1590		return ret;
   1591	}
   1592
   1593	ican3_init_new_host_interface(mod);
   1594	ret = ican3_msg_newhostif(mod);
   1595	if (ret) {
   1596		netdev_err(mod->ndev, "unable to switch to new-style interface\n");
   1597		return ret;
   1598	}
   1599
   1600	/* default to "termination on" */
   1601	ret = ican3_set_termination(mod, true);
   1602	if (ret) {
   1603		netdev_err(mod->ndev, "unable to enable termination\n");
   1604		return ret;
   1605	}
   1606
   1607	/* default to "bus errors enabled" */
   1608	ret = ican3_set_buserror(mod, 1);
   1609	if (ret) {
   1610		netdev_err(mod->ndev, "unable to set bus-error\n");
   1611		return ret;
   1612	}
   1613
   1614	ican3_init_fast_host_interface(mod);
   1615	ret = ican3_msg_fasthostif(mod);
   1616	if (ret) {
   1617		netdev_err(mod->ndev, "unable to switch to fast host interface\n");
   1618		return ret;
   1619	}
   1620
   1621	ret = ican3_set_id_filter(mod, true);
   1622	if (ret) {
   1623		netdev_err(mod->ndev, "unable to set acceptance filter\n");
   1624		return ret;
   1625	}
   1626
   1627	return 0;
   1628}
   1629
   1630/*
   1631 * CAN Network Device
   1632 */
   1633
   1634static int ican3_open(struct net_device *ndev)
   1635{
   1636	struct ican3_dev *mod = netdev_priv(ndev);
   1637	int ret;
   1638
   1639	/* open the CAN layer */
   1640	ret = open_candev(ndev);
   1641	if (ret) {
   1642		netdev_err(mod->ndev, "unable to start CAN layer\n");
   1643		return ret;
   1644	}
   1645
   1646	/* bring the bus online */
   1647	ret = ican3_set_bus_state(mod, true);
   1648	if (ret) {
   1649		netdev_err(mod->ndev, "unable to set bus-on\n");
   1650		close_candev(ndev);
   1651		return ret;
   1652	}
   1653
   1654	/* start up the network device */
   1655	mod->can.state = CAN_STATE_ERROR_ACTIVE;
   1656	netif_start_queue(ndev);
   1657
   1658	return 0;
   1659}
   1660
   1661static int ican3_stop(struct net_device *ndev)
   1662{
   1663	struct ican3_dev *mod = netdev_priv(ndev);
   1664	int ret;
   1665
   1666	/* stop the network device xmit routine */
   1667	netif_stop_queue(ndev);
   1668	mod->can.state = CAN_STATE_STOPPED;
   1669
   1670	/* bring the bus offline, stop receiving packets */
   1671	ret = ican3_set_bus_state(mod, false);
   1672	if (ret) {
   1673		netdev_err(mod->ndev, "unable to set bus-off\n");
   1674		return ret;
   1675	}
   1676
   1677	/* drop all outstanding echo skbs */
   1678	skb_queue_purge(&mod->echoq);
   1679
   1680	/* close the CAN layer */
   1681	close_candev(ndev);
   1682	return 0;
   1683}
   1684
   1685static netdev_tx_t ican3_xmit(struct sk_buff *skb, struct net_device *ndev)
   1686{
   1687	struct ican3_dev *mod = netdev_priv(ndev);
   1688	struct can_frame *cf = (struct can_frame *)skb->data;
   1689	struct ican3_fast_desc desc;
   1690	void __iomem *desc_addr;
   1691	unsigned long flags;
   1692
   1693	if (can_dropped_invalid_skb(ndev, skb))
   1694		return NETDEV_TX_OK;
   1695
   1696	spin_lock_irqsave(&mod->lock, flags);
   1697
   1698	/* check that we can actually transmit */
   1699	if (!ican3_txok(mod)) {
   1700		netdev_err(mod->ndev, "BUG: no free descriptors\n");
   1701		spin_unlock_irqrestore(&mod->lock, flags);
   1702		return NETDEV_TX_BUSY;
   1703	}
   1704
   1705	/* copy the control bits of the descriptor */
   1706	ican3_set_page(mod, mod->fasttx_start + (mod->fasttx_num / 16));
   1707	desc_addr = mod->dpm + ((mod->fasttx_num % 16) * sizeof(desc));
   1708	memset(&desc, 0, sizeof(desc));
   1709	memcpy_fromio(&desc, desc_addr, 1);
   1710
   1711	/* convert the Linux CAN frame into ICAN3 format */
   1712	can_frame_to_ican3(mod, cf, &desc);
   1713
   1714	/*
   1715	 * This hardware doesn't have TX-done notifications, so we'll try and
   1716	 * emulate it the best we can using ECHO skbs. Add the skb to the ECHO
   1717	 * stack. Upon packet reception, check if the ECHO skb and received
   1718	 * skb match, and use that to wake the queue.
   1719	 */
   1720	ican3_put_echo_skb(mod, skb);
   1721
   1722	/*
   1723	 * the programming manual says that you must set the IVALID bit, then
   1724	 * interrupt, then set the valid bit. Quite weird, but it seems to be
   1725	 * required for this to work
   1726	 */
   1727	desc.control |= DESC_IVALID;
   1728	memcpy_toio(desc_addr, &desc, sizeof(desc));
   1729
   1730	/* generate a MODULbus interrupt to the microcontroller */
   1731	iowrite8(0x01, &mod->dpmctrl->interrupt);
   1732
   1733	desc.control ^= DESC_VALID;
   1734	memcpy_toio(desc_addr, &desc, sizeof(desc));
   1735
   1736	/* update the next buffer pointer */
   1737	mod->fasttx_num = (desc.control & DESC_WRAP) ? 0
   1738						     : (mod->fasttx_num + 1);
   1739
   1740	/* if there is no free descriptor space, stop the transmit queue */
   1741	if (!ican3_txok(mod))
   1742		netif_stop_queue(ndev);
   1743
   1744	spin_unlock_irqrestore(&mod->lock, flags);
   1745	return NETDEV_TX_OK;
   1746}
   1747
   1748static const struct net_device_ops ican3_netdev_ops = {
   1749	.ndo_open	= ican3_open,
   1750	.ndo_stop	= ican3_stop,
   1751	.ndo_start_xmit	= ican3_xmit,
   1752	.ndo_change_mtu = can_change_mtu,
   1753};
   1754
   1755/*
   1756 * Low-level CAN Device
   1757 */
   1758
   1759/* This structure was stolen from drivers/net/can/sja1000/sja1000.c */
   1760static const struct can_bittiming_const ican3_bittiming_const = {
   1761	.name = DRV_NAME,
   1762	.tseg1_min = 1,
   1763	.tseg1_max = 16,
   1764	.tseg2_min = 1,
   1765	.tseg2_max = 8,
   1766	.sjw_max = 4,
   1767	.brp_min = 1,
   1768	.brp_max = 64,
   1769	.brp_inc = 1,
   1770};
   1771
   1772static int ican3_set_mode(struct net_device *ndev, enum can_mode mode)
   1773{
   1774	struct ican3_dev *mod = netdev_priv(ndev);
   1775	int ret;
   1776
   1777	if (mode != CAN_MODE_START)
   1778		return -ENOTSUPP;
   1779
   1780	/* bring the bus online */
   1781	ret = ican3_set_bus_state(mod, true);
   1782	if (ret) {
   1783		netdev_err(ndev, "unable to set bus-on\n");
   1784		return ret;
   1785	}
   1786
   1787	/* start up the network device */
   1788	mod->can.state = CAN_STATE_ERROR_ACTIVE;
   1789
   1790	if (netif_queue_stopped(ndev))
   1791		netif_wake_queue(ndev);
   1792
   1793	return 0;
   1794}
   1795
   1796static int ican3_get_berr_counter(const struct net_device *ndev,
   1797				  struct can_berr_counter *bec)
   1798{
   1799	struct ican3_dev *mod = netdev_priv(ndev);
   1800	int ret;
   1801
   1802	ret = ican3_send_inquiry(mod, INQUIRY_STATUS);
   1803	if (ret)
   1804		return ret;
   1805
   1806	if (!wait_for_completion_timeout(&mod->buserror_comp, HZ)) {
   1807		netdev_info(mod->ndev, "%s timed out\n", __func__);
   1808		return -ETIMEDOUT;
   1809	}
   1810
   1811	bec->rxerr = mod->bec.rxerr;
   1812	bec->txerr = mod->bec.txerr;
   1813	return 0;
   1814}
   1815
   1816/*
   1817 * Sysfs Attributes
   1818 */
   1819
   1820static ssize_t termination_show(struct device *dev,
   1821				struct device_attribute *attr,
   1822				char *buf)
   1823{
   1824	struct ican3_dev *mod = netdev_priv(to_net_dev(dev));
   1825	int ret;
   1826
   1827	ret = ican3_send_inquiry(mod, INQUIRY_TERMINATION);
   1828	if (ret)
   1829		return ret;
   1830
   1831	if (!wait_for_completion_timeout(&mod->termination_comp, HZ)) {
   1832		netdev_info(mod->ndev, "%s timed out\n", __func__);
   1833		return -ETIMEDOUT;
   1834	}
   1835
   1836	return sysfs_emit(buf, "%u\n", mod->termination_enabled);
   1837}
   1838
   1839static ssize_t termination_store(struct device *dev,
   1840				 struct device_attribute *attr,
   1841				 const char *buf, size_t count)
   1842{
   1843	struct ican3_dev *mod = netdev_priv(to_net_dev(dev));
   1844	unsigned long enable;
   1845	int ret;
   1846
   1847	if (kstrtoul(buf, 0, &enable))
   1848		return -EINVAL;
   1849
   1850	ret = ican3_set_termination(mod, enable);
   1851	if (ret)
   1852		return ret;
   1853
   1854	return count;
   1855}
   1856
   1857static ssize_t fwinfo_show(struct device *dev,
   1858			   struct device_attribute *attr,
   1859			   char *buf)
   1860{
   1861	struct ican3_dev *mod = netdev_priv(to_net_dev(dev));
   1862
   1863	return scnprintf(buf, PAGE_SIZE, "%s\n", mod->fwinfo);
   1864}
   1865
   1866static DEVICE_ATTR_RW(termination);
   1867static DEVICE_ATTR_RO(fwinfo);
   1868
   1869static struct attribute *ican3_sysfs_attrs[] = {
   1870	&dev_attr_termination.attr,
   1871	&dev_attr_fwinfo.attr,
   1872	NULL,
   1873};
   1874
   1875static const struct attribute_group ican3_sysfs_attr_group = {
   1876	.attrs = ican3_sysfs_attrs,
   1877};
   1878
   1879/*
   1880 * PCI Subsystem
   1881 */
   1882
   1883static int ican3_probe(struct platform_device *pdev)
   1884{
   1885	struct janz_platform_data *pdata;
   1886	struct net_device *ndev;
   1887	struct ican3_dev *mod;
   1888	struct resource *res;
   1889	struct device *dev;
   1890	int ret;
   1891
   1892	pdata = dev_get_platdata(&pdev->dev);
   1893	if (!pdata)
   1894		return -ENXIO;
   1895
   1896	dev_dbg(&pdev->dev, "probe: module number %d\n", pdata->modno);
   1897
   1898	/* save the struct device for printing */
   1899	dev = &pdev->dev;
   1900
   1901	/* allocate the CAN device and private data */
   1902	ndev = alloc_candev(sizeof(*mod), 0);
   1903	if (!ndev) {
   1904		dev_err(dev, "unable to allocate CANdev\n");
   1905		ret = -ENOMEM;
   1906		goto out_return;
   1907	}
   1908
   1909	platform_set_drvdata(pdev, ndev);
   1910	mod = netdev_priv(ndev);
   1911	mod->ndev = ndev;
   1912	mod->num = pdata->modno;
   1913	netif_napi_add_weight(ndev, &mod->napi, ican3_napi, ICAN3_RX_BUFFERS);
   1914	skb_queue_head_init(&mod->echoq);
   1915	spin_lock_init(&mod->lock);
   1916	init_completion(&mod->termination_comp);
   1917	init_completion(&mod->buserror_comp);
   1918
   1919	/* setup device-specific sysfs attributes */
   1920	ndev->sysfs_groups[0] = &ican3_sysfs_attr_group;
   1921
   1922	/* the first unallocated page in the DPM is 9 */
   1923	mod->free_page = DPM_FREE_START;
   1924
   1925	ndev->netdev_ops = &ican3_netdev_ops;
   1926	ndev->flags |= IFF_ECHO;
   1927	SET_NETDEV_DEV(ndev, &pdev->dev);
   1928
   1929	mod->can.clock.freq = ICAN3_CAN_CLOCK;
   1930	mod->can.bittiming_const = &ican3_bittiming_const;
   1931	mod->can.do_set_mode = ican3_set_mode;
   1932	mod->can.do_get_berr_counter = ican3_get_berr_counter;
   1933	mod->can.ctrlmode_supported = CAN_CTRLMODE_3_SAMPLES
   1934				    | CAN_CTRLMODE_BERR_REPORTING
   1935				    | CAN_CTRLMODE_ONE_SHOT;
   1936
   1937	/* find our IRQ number */
   1938	mod->irq = platform_get_irq(pdev, 0);
   1939	if (mod->irq < 0) {
   1940		ret = -ENODEV;
   1941		goto out_free_ndev;
   1942	}
   1943
   1944	ndev->irq = mod->irq;
   1945
   1946	/* get access to the MODULbus registers for this module */
   1947	res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
   1948	if (!res) {
   1949		dev_err(dev, "MODULbus registers not found\n");
   1950		ret = -ENODEV;
   1951		goto out_free_ndev;
   1952	}
   1953
   1954	mod->dpm = ioremap(res->start, resource_size(res));
   1955	if (!mod->dpm) {
   1956		dev_err(dev, "MODULbus registers not ioremap\n");
   1957		ret = -ENOMEM;
   1958		goto out_free_ndev;
   1959	}
   1960
   1961	mod->dpmctrl = mod->dpm + DPM_PAGE_SIZE;
   1962
   1963	/* get access to the control registers for this module */
   1964	res = platform_get_resource(pdev, IORESOURCE_MEM, 1);
   1965	if (!res) {
   1966		dev_err(dev, "CONTROL registers not found\n");
   1967		ret = -ENODEV;
   1968		goto out_iounmap_dpm;
   1969	}
   1970
   1971	mod->ctrl = ioremap(res->start, resource_size(res));
   1972	if (!mod->ctrl) {
   1973		dev_err(dev, "CONTROL registers not ioremap\n");
   1974		ret = -ENOMEM;
   1975		goto out_iounmap_dpm;
   1976	}
   1977
   1978	/* disable our IRQ, then hookup the IRQ handler */
   1979	iowrite8(1 << mod->num, &mod->ctrl->int_disable);
   1980	ret = request_irq(mod->irq, ican3_irq, IRQF_SHARED, DRV_NAME, mod);
   1981	if (ret) {
   1982		dev_err(dev, "unable to request IRQ\n");
   1983		goto out_iounmap_ctrl;
   1984	}
   1985
   1986	/* reset and initialize the CAN controller into fast mode */
   1987	napi_enable(&mod->napi);
   1988	ret = ican3_startup_module(mod);
   1989	if (ret) {
   1990		dev_err(dev, "%s: unable to start CANdev\n", __func__);
   1991		goto out_free_irq;
   1992	}
   1993
   1994	/* register with the Linux CAN layer */
   1995	ret = register_candev(ndev);
   1996	if (ret) {
   1997		dev_err(dev, "%s: unable to register CANdev\n", __func__);
   1998		goto out_free_irq;
   1999	}
   2000
   2001	netdev_info(mod->ndev, "module %d: registered CAN device\n", pdata->modno);
   2002	return 0;
   2003
   2004out_free_irq:
   2005	napi_disable(&mod->napi);
   2006	iowrite8(1 << mod->num, &mod->ctrl->int_disable);
   2007	free_irq(mod->irq, mod);
   2008out_iounmap_ctrl:
   2009	iounmap(mod->ctrl);
   2010out_iounmap_dpm:
   2011	iounmap(mod->dpm);
   2012out_free_ndev:
   2013	free_candev(ndev);
   2014out_return:
   2015	return ret;
   2016}
   2017
   2018static int ican3_remove(struct platform_device *pdev)
   2019{
   2020	struct net_device *ndev = platform_get_drvdata(pdev);
   2021	struct ican3_dev *mod = netdev_priv(ndev);
   2022
   2023	/* unregister the netdevice, stop interrupts */
   2024	unregister_netdev(ndev);
   2025	napi_disable(&mod->napi);
   2026	iowrite8(1 << mod->num, &mod->ctrl->int_disable);
   2027	free_irq(mod->irq, mod);
   2028
   2029	/* put the module into reset */
   2030	ican3_shutdown_module(mod);
   2031
   2032	/* unmap all registers */
   2033	iounmap(mod->ctrl);
   2034	iounmap(mod->dpm);
   2035
   2036	free_candev(ndev);
   2037
   2038	return 0;
   2039}
   2040
   2041static struct platform_driver ican3_driver = {
   2042	.driver		= {
   2043		.name	= DRV_NAME,
   2044	},
   2045	.probe		= ican3_probe,
   2046	.remove		= ican3_remove,
   2047};
   2048
   2049module_platform_driver(ican3_driver);
   2050
   2051MODULE_AUTHOR("Ira W. Snyder <iws@ovro.caltech.edu>");
   2052MODULE_DESCRIPTION("Janz MODULbus VMOD-ICAN3 Driver");
   2053MODULE_LICENSE("GPL");
   2054MODULE_ALIAS("platform:janz-ican3");