162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-only */
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci * Definitions of consts/structs to drive the Freescale MSCAN.
462306a36Sopenharmony_ci *
562306a36Sopenharmony_ci * Copyright (C) 2005-2006 Andrey Volkov <avolkov@varma-el.com>,
662306a36Sopenharmony_ci *                         Varma Electronics Oy
762306a36Sopenharmony_ci */
862306a36Sopenharmony_ci
962306a36Sopenharmony_ci#ifndef __MSCAN_H__
1062306a36Sopenharmony_ci#define __MSCAN_H__
1162306a36Sopenharmony_ci
1262306a36Sopenharmony_ci#include <linux/clk.h>
1362306a36Sopenharmony_ci#include <linux/types.h>
1462306a36Sopenharmony_ci
1562306a36Sopenharmony_ci/* MSCAN control register 0 (CANCTL0) bits */
1662306a36Sopenharmony_ci#define MSCAN_RXFRM		0x80
1762306a36Sopenharmony_ci#define MSCAN_RXACT		0x40
1862306a36Sopenharmony_ci#define MSCAN_CSWAI		0x20
1962306a36Sopenharmony_ci#define MSCAN_SYNCH		0x10
2062306a36Sopenharmony_ci#define MSCAN_TIME		0x08
2162306a36Sopenharmony_ci#define MSCAN_WUPE		0x04
2262306a36Sopenharmony_ci#define MSCAN_SLPRQ		0x02
2362306a36Sopenharmony_ci#define MSCAN_INITRQ		0x01
2462306a36Sopenharmony_ci
2562306a36Sopenharmony_ci/* MSCAN control register 1 (CANCTL1) bits */
2662306a36Sopenharmony_ci#define MSCAN_CANE		0x80
2762306a36Sopenharmony_ci#define MSCAN_CLKSRC		0x40
2862306a36Sopenharmony_ci#define MSCAN_LOOPB		0x20
2962306a36Sopenharmony_ci#define MSCAN_LISTEN		0x10
3062306a36Sopenharmony_ci#define MSCAN_BORM		0x08
3162306a36Sopenharmony_ci#define MSCAN_WUPM		0x04
3262306a36Sopenharmony_ci#define MSCAN_SLPAK		0x02
3362306a36Sopenharmony_ci#define MSCAN_INITAK		0x01
3462306a36Sopenharmony_ci
3562306a36Sopenharmony_ci/* Use the MPC5XXX MSCAN variant? */
3662306a36Sopenharmony_ci#ifdef CONFIG_PPC
3762306a36Sopenharmony_ci#define MSCAN_FOR_MPC5XXX
3862306a36Sopenharmony_ci#endif
3962306a36Sopenharmony_ci
4062306a36Sopenharmony_ci#ifdef MSCAN_FOR_MPC5XXX
4162306a36Sopenharmony_ci#define MSCAN_CLKSRC_BUS	0
4262306a36Sopenharmony_ci#define MSCAN_CLKSRC_XTAL	MSCAN_CLKSRC
4362306a36Sopenharmony_ci#define MSCAN_CLKSRC_IPS	MSCAN_CLKSRC
4462306a36Sopenharmony_ci#else
4562306a36Sopenharmony_ci#define MSCAN_CLKSRC_BUS	MSCAN_CLKSRC
4662306a36Sopenharmony_ci#define MSCAN_CLKSRC_XTAL	0
4762306a36Sopenharmony_ci#endif
4862306a36Sopenharmony_ci
4962306a36Sopenharmony_ci/* MSCAN receiver flag register (CANRFLG) bits */
5062306a36Sopenharmony_ci#define MSCAN_WUPIF		0x80
5162306a36Sopenharmony_ci#define MSCAN_CSCIF		0x40
5262306a36Sopenharmony_ci#define MSCAN_RSTAT1		0x20
5362306a36Sopenharmony_ci#define MSCAN_RSTAT0		0x10
5462306a36Sopenharmony_ci#define MSCAN_TSTAT1		0x08
5562306a36Sopenharmony_ci#define MSCAN_TSTAT0		0x04
5662306a36Sopenharmony_ci#define MSCAN_OVRIF		0x02
5762306a36Sopenharmony_ci#define MSCAN_RXF		0x01
5862306a36Sopenharmony_ci#define MSCAN_ERR_IF 		(MSCAN_OVRIF | MSCAN_CSCIF)
5962306a36Sopenharmony_ci#define MSCAN_RSTAT_MSK		(MSCAN_RSTAT1 | MSCAN_RSTAT0)
6062306a36Sopenharmony_ci#define MSCAN_TSTAT_MSK		(MSCAN_TSTAT1 | MSCAN_TSTAT0)
6162306a36Sopenharmony_ci#define MSCAN_STAT_MSK		(MSCAN_RSTAT_MSK | MSCAN_TSTAT_MSK)
6262306a36Sopenharmony_ci
6362306a36Sopenharmony_ci#define MSCAN_STATE_BUS_OFF	(MSCAN_RSTAT1 | MSCAN_RSTAT0 | \
6462306a36Sopenharmony_ci				 MSCAN_TSTAT1 | MSCAN_TSTAT0)
6562306a36Sopenharmony_ci#define MSCAN_STATE_TX(canrflg)	(((canrflg)&MSCAN_TSTAT_MSK)>>2)
6662306a36Sopenharmony_ci#define MSCAN_STATE_RX(canrflg)	(((canrflg)&MSCAN_RSTAT_MSK)>>4)
6762306a36Sopenharmony_ci#define MSCAN_STATE_ACTIVE	0
6862306a36Sopenharmony_ci#define MSCAN_STATE_WARNING	1
6962306a36Sopenharmony_ci#define MSCAN_STATE_PASSIVE	2
7062306a36Sopenharmony_ci#define MSCAN_STATE_BUSOFF	3
7162306a36Sopenharmony_ci
7262306a36Sopenharmony_ci/* MSCAN receiver interrupt enable register (CANRIER) bits */
7362306a36Sopenharmony_ci#define MSCAN_WUPIE		0x80
7462306a36Sopenharmony_ci#define MSCAN_CSCIE		0x40
7562306a36Sopenharmony_ci#define MSCAN_RSTATE1		0x20
7662306a36Sopenharmony_ci#define MSCAN_RSTATE0		0x10
7762306a36Sopenharmony_ci#define MSCAN_TSTATE1		0x08
7862306a36Sopenharmony_ci#define MSCAN_TSTATE0		0x04
7962306a36Sopenharmony_ci#define MSCAN_OVRIE		0x02
8062306a36Sopenharmony_ci#define MSCAN_RXFIE		0x01
8162306a36Sopenharmony_ci
8262306a36Sopenharmony_ci/* MSCAN transmitter flag register (CANTFLG) bits */
8362306a36Sopenharmony_ci#define MSCAN_TXE2		0x04
8462306a36Sopenharmony_ci#define MSCAN_TXE1		0x02
8562306a36Sopenharmony_ci#define MSCAN_TXE0		0x01
8662306a36Sopenharmony_ci#define MSCAN_TXE		(MSCAN_TXE2 | MSCAN_TXE1 | MSCAN_TXE0)
8762306a36Sopenharmony_ci
8862306a36Sopenharmony_ci/* MSCAN transmitter interrupt enable register (CANTIER) bits */
8962306a36Sopenharmony_ci#define MSCAN_TXIE2		0x04
9062306a36Sopenharmony_ci#define MSCAN_TXIE1		0x02
9162306a36Sopenharmony_ci#define MSCAN_TXIE0		0x01
9262306a36Sopenharmony_ci#define MSCAN_TXIE		(MSCAN_TXIE2 | MSCAN_TXIE1 | MSCAN_TXIE0)
9362306a36Sopenharmony_ci
9462306a36Sopenharmony_ci/* MSCAN transmitter message abort request (CANTARQ) bits */
9562306a36Sopenharmony_ci#define MSCAN_ABTRQ2		0x04
9662306a36Sopenharmony_ci#define MSCAN_ABTRQ1		0x02
9762306a36Sopenharmony_ci#define MSCAN_ABTRQ0		0x01
9862306a36Sopenharmony_ci
9962306a36Sopenharmony_ci/* MSCAN transmitter message abort ack (CANTAAK) bits */
10062306a36Sopenharmony_ci#define MSCAN_ABTAK2		0x04
10162306a36Sopenharmony_ci#define MSCAN_ABTAK1		0x02
10262306a36Sopenharmony_ci#define MSCAN_ABTAK0		0x01
10362306a36Sopenharmony_ci
10462306a36Sopenharmony_ci/* MSCAN transmit buffer selection (CANTBSEL) bits */
10562306a36Sopenharmony_ci#define MSCAN_TX2		0x04
10662306a36Sopenharmony_ci#define MSCAN_TX1		0x02
10762306a36Sopenharmony_ci#define MSCAN_TX0		0x01
10862306a36Sopenharmony_ci
10962306a36Sopenharmony_ci/* MSCAN ID acceptance control register (CANIDAC) bits */
11062306a36Sopenharmony_ci#define MSCAN_IDAM1		0x20
11162306a36Sopenharmony_ci#define MSCAN_IDAM0		0x10
11262306a36Sopenharmony_ci#define MSCAN_IDHIT2		0x04
11362306a36Sopenharmony_ci#define MSCAN_IDHIT1		0x02
11462306a36Sopenharmony_ci#define MSCAN_IDHIT0		0x01
11562306a36Sopenharmony_ci
11662306a36Sopenharmony_ci#define MSCAN_AF_32BIT		0x00
11762306a36Sopenharmony_ci#define MSCAN_AF_16BIT		MSCAN_IDAM0
11862306a36Sopenharmony_ci#define MSCAN_AF_8BIT		MSCAN_IDAM1
11962306a36Sopenharmony_ci#define MSCAN_AF_CLOSED		(MSCAN_IDAM0|MSCAN_IDAM1)
12062306a36Sopenharmony_ci#define MSCAN_AF_MASK		(~(MSCAN_IDAM0|MSCAN_IDAM1))
12162306a36Sopenharmony_ci
12262306a36Sopenharmony_ci/* MSCAN Miscellaneous Register (CANMISC) bits */
12362306a36Sopenharmony_ci#define MSCAN_BOHOLD		0x01
12462306a36Sopenharmony_ci
12562306a36Sopenharmony_ci/* MSCAN Identifier Register (IDR) bits */
12662306a36Sopenharmony_ci#define MSCAN_SFF_RTR_SHIFT	4
12762306a36Sopenharmony_ci#define MSCAN_EFF_RTR_SHIFT	0
12862306a36Sopenharmony_ci#define MSCAN_EFF_FLAGS		0x18	/* IDE + SRR */
12962306a36Sopenharmony_ci
13062306a36Sopenharmony_ci#ifdef MSCAN_FOR_MPC5XXX
13162306a36Sopenharmony_ci#define _MSCAN_RESERVED_(n, num) u8 _res##n[num]
13262306a36Sopenharmony_ci#define _MSCAN_RESERVED_DSR_SIZE	2
13362306a36Sopenharmony_ci#else
13462306a36Sopenharmony_ci#define _MSCAN_RESERVED_(n, num)
13562306a36Sopenharmony_ci#define _MSCAN_RESERVED_DSR_SIZE	0
13662306a36Sopenharmony_ci#endif
13762306a36Sopenharmony_ci
13862306a36Sopenharmony_ci/* Structure of the hardware registers */
13962306a36Sopenharmony_cistruct mscan_regs {
14062306a36Sopenharmony_ci	/* (see doc S12MSCANV3/D)		  MPC5200    MSCAN */
14162306a36Sopenharmony_ci	u8 canctl0;				/* + 0x00     0x00 */
14262306a36Sopenharmony_ci	u8 canctl1;				/* + 0x01     0x01 */
14362306a36Sopenharmony_ci	_MSCAN_RESERVED_(1, 2);			/* + 0x02          */
14462306a36Sopenharmony_ci	u8 canbtr0;				/* + 0x04     0x02 */
14562306a36Sopenharmony_ci	u8 canbtr1;				/* + 0x05     0x03 */
14662306a36Sopenharmony_ci	_MSCAN_RESERVED_(2, 2);			/* + 0x06          */
14762306a36Sopenharmony_ci	u8 canrflg;				/* + 0x08     0x04 */
14862306a36Sopenharmony_ci	u8 canrier;				/* + 0x09     0x05 */
14962306a36Sopenharmony_ci	_MSCAN_RESERVED_(3, 2);			/* + 0x0a          */
15062306a36Sopenharmony_ci	u8 cantflg;				/* + 0x0c     0x06 */
15162306a36Sopenharmony_ci	u8 cantier;				/* + 0x0d     0x07 */
15262306a36Sopenharmony_ci	_MSCAN_RESERVED_(4, 2);			/* + 0x0e          */
15362306a36Sopenharmony_ci	u8 cantarq;				/* + 0x10     0x08 */
15462306a36Sopenharmony_ci	u8 cantaak;				/* + 0x11     0x09 */
15562306a36Sopenharmony_ci	_MSCAN_RESERVED_(5, 2);			/* + 0x12          */
15662306a36Sopenharmony_ci	u8 cantbsel;				/* + 0x14     0x0a */
15762306a36Sopenharmony_ci	u8 canidac;				/* + 0x15     0x0b */
15862306a36Sopenharmony_ci	u8 reserved;				/* + 0x16     0x0c */
15962306a36Sopenharmony_ci	_MSCAN_RESERVED_(6, 2);			/* + 0x17          */
16062306a36Sopenharmony_ci	u8 canmisc;				/* + 0x19     0x0d */
16162306a36Sopenharmony_ci	_MSCAN_RESERVED_(7, 2);			/* + 0x1a          */
16262306a36Sopenharmony_ci	u8 canrxerr;				/* + 0x1c     0x0e */
16362306a36Sopenharmony_ci	u8 cantxerr;				/* + 0x1d     0x0f */
16462306a36Sopenharmony_ci	_MSCAN_RESERVED_(8, 2);			/* + 0x1e          */
16562306a36Sopenharmony_ci	u16 canidar1_0;				/* + 0x20     0x10 */
16662306a36Sopenharmony_ci	_MSCAN_RESERVED_(9, 2);			/* + 0x22          */
16762306a36Sopenharmony_ci	u16 canidar3_2;				/* + 0x24     0x12 */
16862306a36Sopenharmony_ci	_MSCAN_RESERVED_(10, 2);		/* + 0x26          */
16962306a36Sopenharmony_ci	u16 canidmr1_0;				/* + 0x28     0x14 */
17062306a36Sopenharmony_ci	_MSCAN_RESERVED_(11, 2);		/* + 0x2a          */
17162306a36Sopenharmony_ci	u16 canidmr3_2;				/* + 0x2c     0x16 */
17262306a36Sopenharmony_ci	_MSCAN_RESERVED_(12, 2);		/* + 0x2e          */
17362306a36Sopenharmony_ci	u16 canidar5_4;				/* + 0x30     0x18 */
17462306a36Sopenharmony_ci	_MSCAN_RESERVED_(13, 2);		/* + 0x32          */
17562306a36Sopenharmony_ci	u16 canidar7_6;				/* + 0x34     0x1a */
17662306a36Sopenharmony_ci	_MSCAN_RESERVED_(14, 2);		/* + 0x36          */
17762306a36Sopenharmony_ci	u16 canidmr5_4;				/* + 0x38     0x1c */
17862306a36Sopenharmony_ci	_MSCAN_RESERVED_(15, 2);		/* + 0x3a          */
17962306a36Sopenharmony_ci	u16 canidmr7_6;				/* + 0x3c     0x1e */
18062306a36Sopenharmony_ci	_MSCAN_RESERVED_(16, 2);		/* + 0x3e          */
18162306a36Sopenharmony_ci	struct {
18262306a36Sopenharmony_ci		u16 idr1_0;			/* + 0x40     0x20 */
18362306a36Sopenharmony_ci		_MSCAN_RESERVED_(17, 2);	/* + 0x42          */
18462306a36Sopenharmony_ci		u16 idr3_2;			/* + 0x44     0x22 */
18562306a36Sopenharmony_ci		_MSCAN_RESERVED_(18, 2);	/* + 0x46          */
18662306a36Sopenharmony_ci		u16 dsr1_0;			/* + 0x48     0x24 */
18762306a36Sopenharmony_ci		_MSCAN_RESERVED_(19, 2);	/* + 0x4a          */
18862306a36Sopenharmony_ci		u16 dsr3_2;			/* + 0x4c     0x26 */
18962306a36Sopenharmony_ci		_MSCAN_RESERVED_(20, 2);	/* + 0x4e          */
19062306a36Sopenharmony_ci		u16 dsr5_4;			/* + 0x50     0x28 */
19162306a36Sopenharmony_ci		_MSCAN_RESERVED_(21, 2);	/* + 0x52          */
19262306a36Sopenharmony_ci		u16 dsr7_6;			/* + 0x54     0x2a */
19362306a36Sopenharmony_ci		_MSCAN_RESERVED_(22, 2);	/* + 0x56          */
19462306a36Sopenharmony_ci		u8 dlr;				/* + 0x58     0x2c */
19562306a36Sopenharmony_ci		u8 reserved;			/* + 0x59     0x2d */
19662306a36Sopenharmony_ci		_MSCAN_RESERVED_(23, 2);	/* + 0x5a          */
19762306a36Sopenharmony_ci		u16 time;			/* + 0x5c     0x2e */
19862306a36Sopenharmony_ci	} rx;
19962306a36Sopenharmony_ci	_MSCAN_RESERVED_(24, 2);		/* + 0x5e          */
20062306a36Sopenharmony_ci	struct {
20162306a36Sopenharmony_ci		u16 idr1_0;			/* + 0x60     0x30 */
20262306a36Sopenharmony_ci		_MSCAN_RESERVED_(25, 2);	/* + 0x62          */
20362306a36Sopenharmony_ci		u16 idr3_2;			/* + 0x64     0x32 */
20462306a36Sopenharmony_ci		_MSCAN_RESERVED_(26, 2);	/* + 0x66          */
20562306a36Sopenharmony_ci		u16 dsr1_0;			/* + 0x68     0x34 */
20662306a36Sopenharmony_ci		_MSCAN_RESERVED_(27, 2);	/* + 0x6a          */
20762306a36Sopenharmony_ci		u16 dsr3_2;			/* + 0x6c     0x36 */
20862306a36Sopenharmony_ci		_MSCAN_RESERVED_(28, 2);	/* + 0x6e          */
20962306a36Sopenharmony_ci		u16 dsr5_4;			/* + 0x70     0x38 */
21062306a36Sopenharmony_ci		_MSCAN_RESERVED_(29, 2);	/* + 0x72          */
21162306a36Sopenharmony_ci		u16 dsr7_6;			/* + 0x74     0x3a */
21262306a36Sopenharmony_ci		_MSCAN_RESERVED_(30, 2);	/* + 0x76          */
21362306a36Sopenharmony_ci		u8 dlr;				/* + 0x78     0x3c */
21462306a36Sopenharmony_ci		u8 tbpr;			/* + 0x79     0x3d */
21562306a36Sopenharmony_ci		_MSCAN_RESERVED_(31, 2);	/* + 0x7a          */
21662306a36Sopenharmony_ci		u16 time;			/* + 0x7c     0x3e */
21762306a36Sopenharmony_ci	} tx;
21862306a36Sopenharmony_ci	_MSCAN_RESERVED_(32, 2);		/* + 0x7e          */
21962306a36Sopenharmony_ci} __packed;
22062306a36Sopenharmony_ci
22162306a36Sopenharmony_ci#undef _MSCAN_RESERVED_
22262306a36Sopenharmony_ci#define MSCAN_REGION 	sizeof(struct mscan)
22362306a36Sopenharmony_ci
22462306a36Sopenharmony_ci#define MSCAN_NORMAL_MODE	0
22562306a36Sopenharmony_ci#define MSCAN_SLEEP_MODE	MSCAN_SLPRQ
22662306a36Sopenharmony_ci#define MSCAN_INIT_MODE		(MSCAN_INITRQ | MSCAN_SLPRQ)
22762306a36Sopenharmony_ci#define MSCAN_POWEROFF_MODE	(MSCAN_CSWAI | MSCAN_SLPRQ)
22862306a36Sopenharmony_ci#define MSCAN_SET_MODE_RETRIES	255
22962306a36Sopenharmony_ci#define MSCAN_ECHO_SKB_MAX	3
23062306a36Sopenharmony_ci#define MSCAN_RX_INTS_ENABLE	(MSCAN_OVRIE | MSCAN_RXFIE | MSCAN_CSCIE | \
23162306a36Sopenharmony_ci				 MSCAN_RSTATE1 | MSCAN_RSTATE0 | \
23262306a36Sopenharmony_ci				 MSCAN_TSTATE1 | MSCAN_TSTATE0)
23362306a36Sopenharmony_ci
23462306a36Sopenharmony_ci/* MSCAN type variants */
23562306a36Sopenharmony_cienum {
23662306a36Sopenharmony_ci	MSCAN_TYPE_MPC5200,
23762306a36Sopenharmony_ci	MSCAN_TYPE_MPC5121
23862306a36Sopenharmony_ci};
23962306a36Sopenharmony_ci
24062306a36Sopenharmony_ci#define BTR0_BRP_MASK		0x3f
24162306a36Sopenharmony_ci#define BTR0_SJW_SHIFT		6
24262306a36Sopenharmony_ci#define BTR0_SJW_MASK		(0x3 << BTR0_SJW_SHIFT)
24362306a36Sopenharmony_ci
24462306a36Sopenharmony_ci#define BTR1_TSEG1_MASK 	0xf
24562306a36Sopenharmony_ci#define BTR1_TSEG2_SHIFT	4
24662306a36Sopenharmony_ci#define BTR1_TSEG2_MASK 	(0x7 << BTR1_TSEG2_SHIFT)
24762306a36Sopenharmony_ci#define BTR1_SAM_SHIFT  	7
24862306a36Sopenharmony_ci
24962306a36Sopenharmony_ci#define BTR0_SET_BRP(brp)	(((brp) - 1) & BTR0_BRP_MASK)
25062306a36Sopenharmony_ci#define BTR0_SET_SJW(sjw)	((((sjw) - 1) << BTR0_SJW_SHIFT) & \
25162306a36Sopenharmony_ci				 BTR0_SJW_MASK)
25262306a36Sopenharmony_ci
25362306a36Sopenharmony_ci#define BTR1_SET_TSEG1(tseg1)	(((tseg1) - 1) &  BTR1_TSEG1_MASK)
25462306a36Sopenharmony_ci#define BTR1_SET_TSEG2(tseg2)	((((tseg2) - 1) << BTR1_TSEG2_SHIFT) & \
25562306a36Sopenharmony_ci				 BTR1_TSEG2_MASK)
25662306a36Sopenharmony_ci#define BTR1_SET_SAM(sam)	((sam) ? 1 << BTR1_SAM_SHIFT : 0)
25762306a36Sopenharmony_ci
25862306a36Sopenharmony_ci#define F_RX_PROGRESS	0
25962306a36Sopenharmony_ci#define F_TX_PROGRESS	1
26062306a36Sopenharmony_ci#define F_TX_WAIT_ALL	2
26162306a36Sopenharmony_ci
26262306a36Sopenharmony_ci#define TX_QUEUE_SIZE	3
26362306a36Sopenharmony_ci
26462306a36Sopenharmony_cistruct tx_queue_entry {
26562306a36Sopenharmony_ci	struct list_head list;
26662306a36Sopenharmony_ci	u8 mask;
26762306a36Sopenharmony_ci	u8 id;
26862306a36Sopenharmony_ci};
26962306a36Sopenharmony_ci
27062306a36Sopenharmony_cistruct mscan_priv {
27162306a36Sopenharmony_ci	struct can_priv can;	/* must be the first member */
27262306a36Sopenharmony_ci	unsigned int type; 	/* MSCAN type variants */
27362306a36Sopenharmony_ci	unsigned long flags;
27462306a36Sopenharmony_ci	void __iomem *reg_base;	/* ioremap'ed address to registers */
27562306a36Sopenharmony_ci	struct clk *clk_ipg;	/* clock for registers */
27662306a36Sopenharmony_ci	struct clk *clk_can;	/* clock for bitrates */
27762306a36Sopenharmony_ci	u8 shadow_statflg;
27862306a36Sopenharmony_ci	u8 shadow_canrier;
27962306a36Sopenharmony_ci	u8 cur_pri;
28062306a36Sopenharmony_ci	u8 prev_buf_id;
28162306a36Sopenharmony_ci	u8 tx_active;
28262306a36Sopenharmony_ci
28362306a36Sopenharmony_ci	struct list_head tx_head;
28462306a36Sopenharmony_ci	struct tx_queue_entry tx_queue[TX_QUEUE_SIZE];
28562306a36Sopenharmony_ci	struct napi_struct napi;
28662306a36Sopenharmony_ci};
28762306a36Sopenharmony_ci
28862306a36Sopenharmony_cistruct net_device *alloc_mscandev(void);
28962306a36Sopenharmony_ciint register_mscandev(struct net_device *dev, int mscan_clksrc);
29062306a36Sopenharmony_civoid unregister_mscandev(struct net_device *dev);
29162306a36Sopenharmony_ci
29262306a36Sopenharmony_ci#endif /* __MSCAN_H__ */
293