162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */
262306a36Sopenharmony_ci#ifndef _ACENIC_H_
362306a36Sopenharmony_ci#define _ACENIC_H_
462306a36Sopenharmony_ci#include <linux/interrupt.h>
562306a36Sopenharmony_ci
662306a36Sopenharmony_ci
762306a36Sopenharmony_ci/*
862306a36Sopenharmony_ci * Generate TX index update each time, when TX ring is closed.
962306a36Sopenharmony_ci * Normally, this is not useful, because results in more dma (and irqs
1062306a36Sopenharmony_ci * without TX_COAL_INTS_ONLY).
1162306a36Sopenharmony_ci */
1262306a36Sopenharmony_ci#define USE_TX_COAL_NOW	 0
1362306a36Sopenharmony_ci
1462306a36Sopenharmony_ci/*
1562306a36Sopenharmony_ci * Addressing:
1662306a36Sopenharmony_ci *
1762306a36Sopenharmony_ci * The Tigon uses 64-bit host addresses, regardless of their actual
1862306a36Sopenharmony_ci * length, and it expects a big-endian format. For 32 bit systems the
1962306a36Sopenharmony_ci * upper 32 bits of the address are simply ignored (zero), however for
2062306a36Sopenharmony_ci * little endian 64 bit systems (Alpha) this looks strange with the
2162306a36Sopenharmony_ci * two parts of the address word being swapped.
2262306a36Sopenharmony_ci *
2362306a36Sopenharmony_ci * The addresses are split in two 32 bit words for all architectures
2462306a36Sopenharmony_ci * as some of them are in PCI shared memory and it is necessary to use
2562306a36Sopenharmony_ci * readl/writel to access them.
2662306a36Sopenharmony_ci *
2762306a36Sopenharmony_ci * The addressing code is derived from Pete Wyckoff's work, but
2862306a36Sopenharmony_ci * modified to deal properly with readl/writel usage.
2962306a36Sopenharmony_ci */
3062306a36Sopenharmony_ci
3162306a36Sopenharmony_cistruct ace_regs {
3262306a36Sopenharmony_ci	u32	pad0[16];	/* PCI control registers */
3362306a36Sopenharmony_ci
3462306a36Sopenharmony_ci	u32	HostCtrl;	/* 0x40 */
3562306a36Sopenharmony_ci	u32	LocalCtrl;
3662306a36Sopenharmony_ci
3762306a36Sopenharmony_ci	u32	pad1[2];
3862306a36Sopenharmony_ci
3962306a36Sopenharmony_ci	u32	MiscCfg;	/* 0x50 */
4062306a36Sopenharmony_ci
4162306a36Sopenharmony_ci	u32	pad2[2];
4262306a36Sopenharmony_ci
4362306a36Sopenharmony_ci	u32	PciState;
4462306a36Sopenharmony_ci
4562306a36Sopenharmony_ci	u32	pad3[2];	/* 0x60 */
4662306a36Sopenharmony_ci
4762306a36Sopenharmony_ci	u32	WinBase;
4862306a36Sopenharmony_ci	u32	WinData;
4962306a36Sopenharmony_ci
5062306a36Sopenharmony_ci	u32	pad4[12];	/* 0x70 */
5162306a36Sopenharmony_ci
5262306a36Sopenharmony_ci	u32	DmaWriteState;	/* 0xa0 */
5362306a36Sopenharmony_ci	u32	pad5[3];
5462306a36Sopenharmony_ci	u32	DmaReadState;	/* 0xb0 */
5562306a36Sopenharmony_ci
5662306a36Sopenharmony_ci	u32	pad6[26];
5762306a36Sopenharmony_ci
5862306a36Sopenharmony_ci	u32	AssistState;
5962306a36Sopenharmony_ci
6062306a36Sopenharmony_ci	u32	pad7[8];	/* 0x120 */
6162306a36Sopenharmony_ci
6262306a36Sopenharmony_ci	u32	CpuCtrl;	/* 0x140 */
6362306a36Sopenharmony_ci	u32	Pc;
6462306a36Sopenharmony_ci
6562306a36Sopenharmony_ci	u32	pad8[3];
6662306a36Sopenharmony_ci
6762306a36Sopenharmony_ci	u32	SramAddr;	/* 0x154 */
6862306a36Sopenharmony_ci	u32	SramData;
6962306a36Sopenharmony_ci
7062306a36Sopenharmony_ci	u32	pad9[49];
7162306a36Sopenharmony_ci
7262306a36Sopenharmony_ci	u32	MacRxState;	/* 0x220 */
7362306a36Sopenharmony_ci
7462306a36Sopenharmony_ci	u32	pad10[7];
7562306a36Sopenharmony_ci
7662306a36Sopenharmony_ci	u32	CpuBCtrl;	/* 0x240 */
7762306a36Sopenharmony_ci	u32	PcB;
7862306a36Sopenharmony_ci
7962306a36Sopenharmony_ci	u32	pad11[3];
8062306a36Sopenharmony_ci
8162306a36Sopenharmony_ci	u32	SramBAddr;	/* 0x254 */
8262306a36Sopenharmony_ci	u32	SramBData;
8362306a36Sopenharmony_ci
8462306a36Sopenharmony_ci	u32	pad12[105];
8562306a36Sopenharmony_ci
8662306a36Sopenharmony_ci	u32	pad13[32];	/* 0x400 */
8762306a36Sopenharmony_ci	u32	Stats[32];
8862306a36Sopenharmony_ci
8962306a36Sopenharmony_ci	u32	Mb0Hi;		/* 0x500 */
9062306a36Sopenharmony_ci	u32	Mb0Lo;
9162306a36Sopenharmony_ci	u32	Mb1Hi;
9262306a36Sopenharmony_ci	u32	CmdPrd;
9362306a36Sopenharmony_ci	u32	Mb2Hi;
9462306a36Sopenharmony_ci	u32	TxPrd;
9562306a36Sopenharmony_ci	u32	Mb3Hi;
9662306a36Sopenharmony_ci	u32	RxStdPrd;
9762306a36Sopenharmony_ci	u32	Mb4Hi;
9862306a36Sopenharmony_ci	u32	RxJumboPrd;
9962306a36Sopenharmony_ci	u32	Mb5Hi;
10062306a36Sopenharmony_ci	u32	RxMiniPrd;
10162306a36Sopenharmony_ci	u32	Mb6Hi;
10262306a36Sopenharmony_ci	u32	Mb6Lo;
10362306a36Sopenharmony_ci	u32	Mb7Hi;
10462306a36Sopenharmony_ci	u32	Mb7Lo;
10562306a36Sopenharmony_ci	u32	Mb8Hi;
10662306a36Sopenharmony_ci	u32	Mb8Lo;
10762306a36Sopenharmony_ci	u32	Mb9Hi;
10862306a36Sopenharmony_ci	u32	Mb9Lo;
10962306a36Sopenharmony_ci	u32	MbAHi;
11062306a36Sopenharmony_ci	u32	MbALo;
11162306a36Sopenharmony_ci	u32	MbBHi;
11262306a36Sopenharmony_ci	u32	MbBLo;
11362306a36Sopenharmony_ci	u32	MbCHi;
11462306a36Sopenharmony_ci	u32	MbCLo;
11562306a36Sopenharmony_ci	u32	MbDHi;
11662306a36Sopenharmony_ci	u32	MbDLo;
11762306a36Sopenharmony_ci	u32	MbEHi;
11862306a36Sopenharmony_ci	u32	MbELo;
11962306a36Sopenharmony_ci	u32	MbFHi;
12062306a36Sopenharmony_ci	u32	MbFLo;
12162306a36Sopenharmony_ci
12262306a36Sopenharmony_ci	u32	pad14[32];
12362306a36Sopenharmony_ci
12462306a36Sopenharmony_ci	u32	MacAddrHi;	/* 0x600 */
12562306a36Sopenharmony_ci	u32	MacAddrLo;
12662306a36Sopenharmony_ci	u32	InfoPtrHi;
12762306a36Sopenharmony_ci	u32	InfoPtrLo;
12862306a36Sopenharmony_ci	u32	MultiCastHi;	/* 0x610 */
12962306a36Sopenharmony_ci	u32	MultiCastLo;
13062306a36Sopenharmony_ci	u32	ModeStat;
13162306a36Sopenharmony_ci	u32	DmaReadCfg;
13262306a36Sopenharmony_ci	u32	DmaWriteCfg;	/* 0x620 */
13362306a36Sopenharmony_ci	u32	TxBufRat;
13462306a36Sopenharmony_ci	u32	EvtCsm;
13562306a36Sopenharmony_ci	u32	CmdCsm;
13662306a36Sopenharmony_ci	u32	TuneRxCoalTicks;/* 0x630 */
13762306a36Sopenharmony_ci	u32	TuneTxCoalTicks;
13862306a36Sopenharmony_ci	u32	TuneStatTicks;
13962306a36Sopenharmony_ci	u32	TuneMaxTxDesc;
14062306a36Sopenharmony_ci	u32	TuneMaxRxDesc;	/* 0x640 */
14162306a36Sopenharmony_ci	u32	TuneTrace;
14262306a36Sopenharmony_ci	u32	TuneLink;
14362306a36Sopenharmony_ci	u32	TuneFastLink;
14462306a36Sopenharmony_ci	u32	TracePtr;	/* 0x650 */
14562306a36Sopenharmony_ci	u32	TraceStrt;
14662306a36Sopenharmony_ci	u32	TraceLen;
14762306a36Sopenharmony_ci	u32	IfIdx;
14862306a36Sopenharmony_ci	u32	IfMtu;		/* 0x660 */
14962306a36Sopenharmony_ci	u32	MaskInt;
15062306a36Sopenharmony_ci	u32	GigLnkState;
15162306a36Sopenharmony_ci	u32	FastLnkState;
15262306a36Sopenharmony_ci	u32	pad16[4];	/* 0x670 */
15362306a36Sopenharmony_ci	u32	RxRetCsm;	/* 0x680 */
15462306a36Sopenharmony_ci
15562306a36Sopenharmony_ci	u32	pad17[31];
15662306a36Sopenharmony_ci
15762306a36Sopenharmony_ci	u32	CmdRng[64];	/* 0x700 */
15862306a36Sopenharmony_ci	u32	Window[0x200];
15962306a36Sopenharmony_ci};
16062306a36Sopenharmony_ci
16162306a36Sopenharmony_ci
16262306a36Sopenharmony_citypedef struct {
16362306a36Sopenharmony_ci	u32 addrhi;
16462306a36Sopenharmony_ci	u32 addrlo;
16562306a36Sopenharmony_ci} aceaddr;
16662306a36Sopenharmony_ci
16762306a36Sopenharmony_ci
16862306a36Sopenharmony_ci#define ACE_WINDOW_SIZE	0x800
16962306a36Sopenharmony_ci
17062306a36Sopenharmony_ci#define ACE_JUMBO_MTU 9000
17162306a36Sopenharmony_ci#define ACE_STD_MTU 1500
17262306a36Sopenharmony_ci
17362306a36Sopenharmony_ci#define ACE_TRACE_SIZE 0x8000
17462306a36Sopenharmony_ci
17562306a36Sopenharmony_ci/*
17662306a36Sopenharmony_ci * Host control register bits.
17762306a36Sopenharmony_ci */
17862306a36Sopenharmony_ci
17962306a36Sopenharmony_ci#define IN_INT		0x01
18062306a36Sopenharmony_ci#define CLR_INT		0x02
18162306a36Sopenharmony_ci#define HW_RESET	0x08
18262306a36Sopenharmony_ci#define BYTE_SWAP	0x10
18362306a36Sopenharmony_ci#define WORD_SWAP	0x20
18462306a36Sopenharmony_ci#define MASK_INTS	0x40
18562306a36Sopenharmony_ci
18662306a36Sopenharmony_ci/*
18762306a36Sopenharmony_ci * Local control register bits.
18862306a36Sopenharmony_ci */
18962306a36Sopenharmony_ci
19062306a36Sopenharmony_ci#define EEPROM_DATA_IN		0x800000
19162306a36Sopenharmony_ci#define EEPROM_DATA_OUT		0x400000
19262306a36Sopenharmony_ci#define EEPROM_WRITE_ENABLE	0x200000
19362306a36Sopenharmony_ci#define EEPROM_CLK_OUT		0x100000
19462306a36Sopenharmony_ci
19562306a36Sopenharmony_ci#define EEPROM_BASE		0xa0000000
19662306a36Sopenharmony_ci
19762306a36Sopenharmony_ci#define EEPROM_WRITE_SELECT	0xa0
19862306a36Sopenharmony_ci#define EEPROM_READ_SELECT	0xa1
19962306a36Sopenharmony_ci
20062306a36Sopenharmony_ci#define SRAM_BANK_512K		0x200
20162306a36Sopenharmony_ci
20262306a36Sopenharmony_ci
20362306a36Sopenharmony_ci/*
20462306a36Sopenharmony_ci * udelay() values for when clocking the eeprom
20562306a36Sopenharmony_ci */
20662306a36Sopenharmony_ci#define ACE_SHORT_DELAY		2
20762306a36Sopenharmony_ci#define ACE_LONG_DELAY		4
20862306a36Sopenharmony_ci
20962306a36Sopenharmony_ci
21062306a36Sopenharmony_ci/*
21162306a36Sopenharmony_ci * Misc Config bits
21262306a36Sopenharmony_ci */
21362306a36Sopenharmony_ci
21462306a36Sopenharmony_ci#define SYNC_SRAM_TIMING	0x100000
21562306a36Sopenharmony_ci
21662306a36Sopenharmony_ci
21762306a36Sopenharmony_ci/*
21862306a36Sopenharmony_ci * CPU state bits.
21962306a36Sopenharmony_ci */
22062306a36Sopenharmony_ci
22162306a36Sopenharmony_ci#define CPU_RESET		0x01
22262306a36Sopenharmony_ci#define CPU_TRACE		0x02
22362306a36Sopenharmony_ci#define CPU_PROM_FAILED		0x10
22462306a36Sopenharmony_ci#define CPU_HALT		0x00010000
22562306a36Sopenharmony_ci#define CPU_HALTED		0xffff0000
22662306a36Sopenharmony_ci
22762306a36Sopenharmony_ci
22862306a36Sopenharmony_ci/*
22962306a36Sopenharmony_ci * PCI State bits.
23062306a36Sopenharmony_ci */
23162306a36Sopenharmony_ci
23262306a36Sopenharmony_ci#define DMA_READ_MAX_4		0x04
23362306a36Sopenharmony_ci#define DMA_READ_MAX_16		0x08
23462306a36Sopenharmony_ci#define DMA_READ_MAX_32		0x0c
23562306a36Sopenharmony_ci#define DMA_READ_MAX_64		0x10
23662306a36Sopenharmony_ci#define DMA_READ_MAX_128	0x14
23762306a36Sopenharmony_ci#define DMA_READ_MAX_256	0x18
23862306a36Sopenharmony_ci#define DMA_READ_MAX_1K		0x1c
23962306a36Sopenharmony_ci#define DMA_WRITE_MAX_4		0x20
24062306a36Sopenharmony_ci#define DMA_WRITE_MAX_16	0x40
24162306a36Sopenharmony_ci#define DMA_WRITE_MAX_32	0x60
24262306a36Sopenharmony_ci#define DMA_WRITE_MAX_64	0x80
24362306a36Sopenharmony_ci#define DMA_WRITE_MAX_128	0xa0
24462306a36Sopenharmony_ci#define DMA_WRITE_MAX_256	0xc0
24562306a36Sopenharmony_ci#define DMA_WRITE_MAX_1K	0xe0
24662306a36Sopenharmony_ci#define DMA_READ_WRITE_MASK	0xfc
24762306a36Sopenharmony_ci#define MEM_READ_MULTIPLE	0x00020000
24862306a36Sopenharmony_ci#define PCI_66MHZ		0x00080000
24962306a36Sopenharmony_ci#define PCI_32BIT		0x00100000
25062306a36Sopenharmony_ci#define DMA_WRITE_ALL_ALIGN	0x00800000
25162306a36Sopenharmony_ci#define READ_CMD_MEM		0x06000000
25262306a36Sopenharmony_ci#define WRITE_CMD_MEM		0x70000000
25362306a36Sopenharmony_ci
25462306a36Sopenharmony_ci
25562306a36Sopenharmony_ci/*
25662306a36Sopenharmony_ci * Mode status
25762306a36Sopenharmony_ci */
25862306a36Sopenharmony_ci
25962306a36Sopenharmony_ci#define ACE_BYTE_SWAP_BD	0x02
26062306a36Sopenharmony_ci#define ACE_WORD_SWAP_BD	0x04		/* not actually used */
26162306a36Sopenharmony_ci#define ACE_WARN		0x08
26262306a36Sopenharmony_ci#define ACE_BYTE_SWAP_DMA	0x10
26362306a36Sopenharmony_ci#define ACE_NO_JUMBO_FRAG	0x200
26462306a36Sopenharmony_ci#define ACE_FATAL		0x40000000
26562306a36Sopenharmony_ci
26662306a36Sopenharmony_ci
26762306a36Sopenharmony_ci/*
26862306a36Sopenharmony_ci * DMA config
26962306a36Sopenharmony_ci */
27062306a36Sopenharmony_ci
27162306a36Sopenharmony_ci#define DMA_THRESH_1W		0x10
27262306a36Sopenharmony_ci#define DMA_THRESH_2W		0x20
27362306a36Sopenharmony_ci#define DMA_THRESH_4W		0x40
27462306a36Sopenharmony_ci#define DMA_THRESH_8W		0x80
27562306a36Sopenharmony_ci#define DMA_THRESH_16W		0x100
27662306a36Sopenharmony_ci#define DMA_THRESH_32W		0x0	/* not described in doc, but exists. */
27762306a36Sopenharmony_ci
27862306a36Sopenharmony_ci
27962306a36Sopenharmony_ci/*
28062306a36Sopenharmony_ci * Tuning parameters
28162306a36Sopenharmony_ci */
28262306a36Sopenharmony_ci
28362306a36Sopenharmony_ci#define TICKS_PER_SEC		1000000
28462306a36Sopenharmony_ci
28562306a36Sopenharmony_ci
28662306a36Sopenharmony_ci/*
28762306a36Sopenharmony_ci * Link bits
28862306a36Sopenharmony_ci */
28962306a36Sopenharmony_ci
29062306a36Sopenharmony_ci#define LNK_PREF		0x00008000
29162306a36Sopenharmony_ci#define LNK_10MB		0x00010000
29262306a36Sopenharmony_ci#define LNK_100MB		0x00020000
29362306a36Sopenharmony_ci#define LNK_1000MB		0x00040000
29462306a36Sopenharmony_ci#define LNK_FULL_DUPLEX		0x00080000
29562306a36Sopenharmony_ci#define LNK_HALF_DUPLEX		0x00100000
29662306a36Sopenharmony_ci#define LNK_TX_FLOW_CTL_Y	0x00200000
29762306a36Sopenharmony_ci#define LNK_NEG_ADVANCED	0x00400000
29862306a36Sopenharmony_ci#define LNK_RX_FLOW_CTL_Y	0x00800000
29962306a36Sopenharmony_ci#define LNK_NIC			0x01000000
30062306a36Sopenharmony_ci#define LNK_JAM			0x02000000
30162306a36Sopenharmony_ci#define LNK_JUMBO		0x04000000
30262306a36Sopenharmony_ci#define LNK_ALTEON		0x08000000
30362306a36Sopenharmony_ci#define LNK_NEG_FCTL		0x10000000
30462306a36Sopenharmony_ci#define LNK_NEGOTIATE		0x20000000
30562306a36Sopenharmony_ci#define LNK_ENABLE		0x40000000
30662306a36Sopenharmony_ci#define LNK_UP			0x80000000
30762306a36Sopenharmony_ci
30862306a36Sopenharmony_ci
30962306a36Sopenharmony_ci/*
31062306a36Sopenharmony_ci * Event definitions
31162306a36Sopenharmony_ci */
31262306a36Sopenharmony_ci
31362306a36Sopenharmony_ci#define EVT_RING_ENTRIES	256
31462306a36Sopenharmony_ci#define EVT_RING_SIZE	(EVT_RING_ENTRIES * sizeof(struct event))
31562306a36Sopenharmony_ci
31662306a36Sopenharmony_cistruct event {
31762306a36Sopenharmony_ci#ifdef __LITTLE_ENDIAN_BITFIELD
31862306a36Sopenharmony_ci	u32	idx:12;
31962306a36Sopenharmony_ci	u32	code:12;
32062306a36Sopenharmony_ci	u32	evt:8;
32162306a36Sopenharmony_ci#else
32262306a36Sopenharmony_ci	u32	evt:8;
32362306a36Sopenharmony_ci	u32	code:12;
32462306a36Sopenharmony_ci	u32	idx:12;
32562306a36Sopenharmony_ci#endif
32662306a36Sopenharmony_ci	u32     pad;
32762306a36Sopenharmony_ci};
32862306a36Sopenharmony_ci
32962306a36Sopenharmony_ci
33062306a36Sopenharmony_ci/*
33162306a36Sopenharmony_ci * Events
33262306a36Sopenharmony_ci */
33362306a36Sopenharmony_ci
33462306a36Sopenharmony_ci#define E_FW_RUNNING		0x01
33562306a36Sopenharmony_ci#define E_STATS_UPDATED		0x04
33662306a36Sopenharmony_ci
33762306a36Sopenharmony_ci#define E_STATS_UPDATE		0x04
33862306a36Sopenharmony_ci
33962306a36Sopenharmony_ci#define E_LNK_STATE		0x06
34062306a36Sopenharmony_ci#define E_C_LINK_UP		0x01
34162306a36Sopenharmony_ci#define E_C_LINK_DOWN		0x02
34262306a36Sopenharmony_ci#define E_C_LINK_10_100		0x03
34362306a36Sopenharmony_ci
34462306a36Sopenharmony_ci#define E_ERROR			0x07
34562306a36Sopenharmony_ci#define E_C_ERR_INVAL_CMD	0x01
34662306a36Sopenharmony_ci#define E_C_ERR_UNIMP_CMD	0x02
34762306a36Sopenharmony_ci#define E_C_ERR_BAD_CFG		0x03
34862306a36Sopenharmony_ci
34962306a36Sopenharmony_ci#define E_MCAST_LIST		0x08
35062306a36Sopenharmony_ci#define E_C_MCAST_ADDR_ADD	0x01
35162306a36Sopenharmony_ci#define E_C_MCAST_ADDR_DEL	0x02
35262306a36Sopenharmony_ci
35362306a36Sopenharmony_ci#define E_RESET_JUMBO_RNG	0x09
35462306a36Sopenharmony_ci
35562306a36Sopenharmony_ci
35662306a36Sopenharmony_ci/*
35762306a36Sopenharmony_ci * Commands
35862306a36Sopenharmony_ci */
35962306a36Sopenharmony_ci
36062306a36Sopenharmony_ci#define CMD_RING_ENTRIES	64
36162306a36Sopenharmony_ci
36262306a36Sopenharmony_cistruct cmd {
36362306a36Sopenharmony_ci#ifdef __LITTLE_ENDIAN_BITFIELD
36462306a36Sopenharmony_ci	u32	idx:12;
36562306a36Sopenharmony_ci	u32	code:12;
36662306a36Sopenharmony_ci	u32	evt:8;
36762306a36Sopenharmony_ci#else
36862306a36Sopenharmony_ci	u32	evt:8;
36962306a36Sopenharmony_ci	u32	code:12;
37062306a36Sopenharmony_ci	u32	idx:12;
37162306a36Sopenharmony_ci#endif
37262306a36Sopenharmony_ci};
37362306a36Sopenharmony_ci
37462306a36Sopenharmony_ci
37562306a36Sopenharmony_ci#define C_HOST_STATE		0x01
37662306a36Sopenharmony_ci#define C_C_STACK_UP		0x01
37762306a36Sopenharmony_ci#define C_C_STACK_DOWN		0x02
37862306a36Sopenharmony_ci
37962306a36Sopenharmony_ci#define C_FDR_FILTERING		0x02
38062306a36Sopenharmony_ci#define C_C_FDR_FILT_ENABLE	0x01
38162306a36Sopenharmony_ci#define C_C_FDR_FILT_DISABLE	0x02
38262306a36Sopenharmony_ci
38362306a36Sopenharmony_ci#define C_SET_RX_PRD_IDX	0x03
38462306a36Sopenharmony_ci#define C_UPDATE_STATS		0x04
38562306a36Sopenharmony_ci#define C_RESET_JUMBO_RNG	0x05
38662306a36Sopenharmony_ci#define C_ADD_MULTICAST_ADDR	0x08
38762306a36Sopenharmony_ci#define C_DEL_MULTICAST_ADDR	0x09
38862306a36Sopenharmony_ci
38962306a36Sopenharmony_ci#define C_SET_PROMISC_MODE	0x0a
39062306a36Sopenharmony_ci#define C_C_PROMISC_ENABLE	0x01
39162306a36Sopenharmony_ci#define C_C_PROMISC_DISABLE	0x02
39262306a36Sopenharmony_ci
39362306a36Sopenharmony_ci#define C_LNK_NEGOTIATION	0x0b
39462306a36Sopenharmony_ci#define C_C_NEGOTIATE_BOTH	0x00
39562306a36Sopenharmony_ci#define C_C_NEGOTIATE_GIG	0x01
39662306a36Sopenharmony_ci#define C_C_NEGOTIATE_10_100	0x02
39762306a36Sopenharmony_ci
39862306a36Sopenharmony_ci#define C_SET_MAC_ADDR		0x0c
39962306a36Sopenharmony_ci#define C_CLEAR_PROFILE		0x0d
40062306a36Sopenharmony_ci
40162306a36Sopenharmony_ci#define C_SET_MULTICAST_MODE	0x0e
40262306a36Sopenharmony_ci#define C_C_MCAST_ENABLE	0x01
40362306a36Sopenharmony_ci#define C_C_MCAST_DISABLE	0x02
40462306a36Sopenharmony_ci
40562306a36Sopenharmony_ci#define C_CLEAR_STATS		0x0f
40662306a36Sopenharmony_ci#define C_SET_RX_JUMBO_PRD_IDX	0x10
40762306a36Sopenharmony_ci#define C_REFRESH_STATS		0x11
40862306a36Sopenharmony_ci
40962306a36Sopenharmony_ci
41062306a36Sopenharmony_ci/*
41162306a36Sopenharmony_ci * Descriptor flags
41262306a36Sopenharmony_ci */
41362306a36Sopenharmony_ci#define BD_FLG_TCP_UDP_SUM	0x01
41462306a36Sopenharmony_ci#define BD_FLG_IP_SUM		0x02
41562306a36Sopenharmony_ci#define BD_FLG_END		0x04
41662306a36Sopenharmony_ci#define BD_FLG_MORE		0x08
41762306a36Sopenharmony_ci#define BD_FLG_JUMBO		0x10
41862306a36Sopenharmony_ci#define BD_FLG_UCAST		0x20
41962306a36Sopenharmony_ci#define BD_FLG_MCAST		0x40
42062306a36Sopenharmony_ci#define BD_FLG_BCAST		0x60
42162306a36Sopenharmony_ci#define BD_FLG_TYP_MASK		0x60
42262306a36Sopenharmony_ci#define BD_FLG_IP_FRAG		0x80
42362306a36Sopenharmony_ci#define BD_FLG_IP_FRAG_END	0x100
42462306a36Sopenharmony_ci#define BD_FLG_VLAN_TAG		0x200
42562306a36Sopenharmony_ci#define BD_FLG_FRAME_ERROR	0x400
42662306a36Sopenharmony_ci#define BD_FLG_COAL_NOW		0x800
42762306a36Sopenharmony_ci#define BD_FLG_MINI		0x1000
42862306a36Sopenharmony_ci
42962306a36Sopenharmony_ci
43062306a36Sopenharmony_ci/*
43162306a36Sopenharmony_ci * Ring Control block flags
43262306a36Sopenharmony_ci */
43362306a36Sopenharmony_ci#define RCB_FLG_TCP_UDP_SUM	0x01
43462306a36Sopenharmony_ci#define RCB_FLG_IP_SUM		0x02
43562306a36Sopenharmony_ci#define RCB_FLG_NO_PSEUDO_HDR	0x08
43662306a36Sopenharmony_ci#define RCB_FLG_VLAN_ASSIST	0x10
43762306a36Sopenharmony_ci#define RCB_FLG_COAL_INT_ONLY	0x20
43862306a36Sopenharmony_ci#define RCB_FLG_TX_HOST_RING	0x40
43962306a36Sopenharmony_ci#define RCB_FLG_IEEE_SNAP_SUM	0x80
44062306a36Sopenharmony_ci#define RCB_FLG_EXT_RX_BD	0x100
44162306a36Sopenharmony_ci#define RCB_FLG_RNG_DISABLE	0x200
44262306a36Sopenharmony_ci
44362306a36Sopenharmony_ci
44462306a36Sopenharmony_ci/*
44562306a36Sopenharmony_ci * TX ring - maximum TX ring entries for Tigon I's is 128
44662306a36Sopenharmony_ci */
44762306a36Sopenharmony_ci#define MAX_TX_RING_ENTRIES	256
44862306a36Sopenharmony_ci#define TIGON_I_TX_RING_ENTRIES	128
44962306a36Sopenharmony_ci#define TX_RING_SIZE		(MAX_TX_RING_ENTRIES * sizeof(struct tx_desc))
45062306a36Sopenharmony_ci#define TX_RING_BASE		0x3800
45162306a36Sopenharmony_ci
45262306a36Sopenharmony_cistruct tx_desc{
45362306a36Sopenharmony_ci        aceaddr	addr;
45462306a36Sopenharmony_ci	u32	flagsize;
45562306a36Sopenharmony_ci#if 0
45662306a36Sopenharmony_ci/*
45762306a36Sopenharmony_ci * This is in PCI shared mem and must be accessed with readl/writel
45862306a36Sopenharmony_ci * real layout is:
45962306a36Sopenharmony_ci */
46062306a36Sopenharmony_ci#if __LITTLE_ENDIAN
46162306a36Sopenharmony_ci	u16	flags;
46262306a36Sopenharmony_ci	u16	size;
46362306a36Sopenharmony_ci	u16	vlan;
46462306a36Sopenharmony_ci	u16	reserved;
46562306a36Sopenharmony_ci#else
46662306a36Sopenharmony_ci	u16	size;
46762306a36Sopenharmony_ci	u16	flags;
46862306a36Sopenharmony_ci	u16	reserved;
46962306a36Sopenharmony_ci	u16	vlan;
47062306a36Sopenharmony_ci#endif
47162306a36Sopenharmony_ci#endif
47262306a36Sopenharmony_ci	u32	vlanres;
47362306a36Sopenharmony_ci};
47462306a36Sopenharmony_ci
47562306a36Sopenharmony_ci
47662306a36Sopenharmony_ci#define RX_STD_RING_ENTRIES	512
47762306a36Sopenharmony_ci#define RX_STD_RING_SIZE	(RX_STD_RING_ENTRIES * sizeof(struct rx_desc))
47862306a36Sopenharmony_ci
47962306a36Sopenharmony_ci#define RX_JUMBO_RING_ENTRIES	256
48062306a36Sopenharmony_ci#define RX_JUMBO_RING_SIZE	(RX_JUMBO_RING_ENTRIES *sizeof(struct rx_desc))
48162306a36Sopenharmony_ci
48262306a36Sopenharmony_ci#define RX_MINI_RING_ENTRIES	1024
48362306a36Sopenharmony_ci#define RX_MINI_RING_SIZE	(RX_MINI_RING_ENTRIES *sizeof(struct rx_desc))
48462306a36Sopenharmony_ci
48562306a36Sopenharmony_ci#define RX_RETURN_RING_ENTRIES	2048
48662306a36Sopenharmony_ci#define RX_RETURN_RING_SIZE	(RX_MAX_RETURN_RING_ENTRIES * \
48762306a36Sopenharmony_ci				 sizeof(struct rx_desc))
48862306a36Sopenharmony_ci
48962306a36Sopenharmony_cistruct rx_desc{
49062306a36Sopenharmony_ci	aceaddr	addr;
49162306a36Sopenharmony_ci#ifdef __LITTLE_ENDIAN
49262306a36Sopenharmony_ci	u16	size;
49362306a36Sopenharmony_ci	u16	idx;
49462306a36Sopenharmony_ci#else
49562306a36Sopenharmony_ci	u16	idx;
49662306a36Sopenharmony_ci	u16	size;
49762306a36Sopenharmony_ci#endif
49862306a36Sopenharmony_ci#ifdef __LITTLE_ENDIAN
49962306a36Sopenharmony_ci	u16	flags;
50062306a36Sopenharmony_ci	u16	type;
50162306a36Sopenharmony_ci#else
50262306a36Sopenharmony_ci	u16	type;
50362306a36Sopenharmony_ci	u16	flags;
50462306a36Sopenharmony_ci#endif
50562306a36Sopenharmony_ci#ifdef __LITTLE_ENDIAN
50662306a36Sopenharmony_ci	u16	tcp_udp_csum;
50762306a36Sopenharmony_ci	u16	ip_csum;
50862306a36Sopenharmony_ci#else
50962306a36Sopenharmony_ci	u16	ip_csum;
51062306a36Sopenharmony_ci	u16	tcp_udp_csum;
51162306a36Sopenharmony_ci#endif
51262306a36Sopenharmony_ci#ifdef __LITTLE_ENDIAN
51362306a36Sopenharmony_ci	u16	vlan;
51462306a36Sopenharmony_ci	u16	err_flags;
51562306a36Sopenharmony_ci#else
51662306a36Sopenharmony_ci	u16	err_flags;
51762306a36Sopenharmony_ci	u16	vlan;
51862306a36Sopenharmony_ci#endif
51962306a36Sopenharmony_ci	u32	reserved;
52062306a36Sopenharmony_ci	u32	opague;
52162306a36Sopenharmony_ci};
52262306a36Sopenharmony_ci
52362306a36Sopenharmony_ci
52462306a36Sopenharmony_ci/*
52562306a36Sopenharmony_ci * This struct is shared with the NIC firmware.
52662306a36Sopenharmony_ci */
52762306a36Sopenharmony_cistruct ring_ctrl {
52862306a36Sopenharmony_ci	aceaddr	rngptr;
52962306a36Sopenharmony_ci#ifdef __LITTLE_ENDIAN
53062306a36Sopenharmony_ci	u16	flags;
53162306a36Sopenharmony_ci	u16	max_len;
53262306a36Sopenharmony_ci#else
53362306a36Sopenharmony_ci	u16	max_len;
53462306a36Sopenharmony_ci	u16	flags;
53562306a36Sopenharmony_ci#endif
53662306a36Sopenharmony_ci	u32	pad;
53762306a36Sopenharmony_ci};
53862306a36Sopenharmony_ci
53962306a36Sopenharmony_ci
54062306a36Sopenharmony_cistruct ace_mac_stats {
54162306a36Sopenharmony_ci	u32 excess_colls;
54262306a36Sopenharmony_ci	u32 coll_1;
54362306a36Sopenharmony_ci	u32 coll_2;
54462306a36Sopenharmony_ci	u32 coll_3;
54562306a36Sopenharmony_ci	u32 coll_4;
54662306a36Sopenharmony_ci	u32 coll_5;
54762306a36Sopenharmony_ci	u32 coll_6;
54862306a36Sopenharmony_ci	u32 coll_7;
54962306a36Sopenharmony_ci	u32 coll_8;
55062306a36Sopenharmony_ci	u32 coll_9;
55162306a36Sopenharmony_ci	u32 coll_10;
55262306a36Sopenharmony_ci	u32 coll_11;
55362306a36Sopenharmony_ci	u32 coll_12;
55462306a36Sopenharmony_ci	u32 coll_13;
55562306a36Sopenharmony_ci	u32 coll_14;
55662306a36Sopenharmony_ci	u32 coll_15;
55762306a36Sopenharmony_ci	u32 late_coll;
55862306a36Sopenharmony_ci	u32 defers;
55962306a36Sopenharmony_ci	u32 crc_err;
56062306a36Sopenharmony_ci	u32 underrun;
56162306a36Sopenharmony_ci	u32 crs_err;
56262306a36Sopenharmony_ci	u32 pad[3];
56362306a36Sopenharmony_ci	u32 drop_ula;
56462306a36Sopenharmony_ci	u32 drop_mc;
56562306a36Sopenharmony_ci	u32 drop_fc;
56662306a36Sopenharmony_ci	u32 drop_space;
56762306a36Sopenharmony_ci	u32 coll;
56862306a36Sopenharmony_ci	u32 kept_bc;
56962306a36Sopenharmony_ci	u32 kept_mc;
57062306a36Sopenharmony_ci	u32 kept_uc;
57162306a36Sopenharmony_ci};
57262306a36Sopenharmony_ci
57362306a36Sopenharmony_ci
57462306a36Sopenharmony_cistruct ace_info {
57562306a36Sopenharmony_ci	union {
57662306a36Sopenharmony_ci		u32 stats[256];
57762306a36Sopenharmony_ci	} s;
57862306a36Sopenharmony_ci	struct ring_ctrl	evt_ctrl;
57962306a36Sopenharmony_ci	struct ring_ctrl	cmd_ctrl;
58062306a36Sopenharmony_ci	struct ring_ctrl	tx_ctrl;
58162306a36Sopenharmony_ci	struct ring_ctrl	rx_std_ctrl;
58262306a36Sopenharmony_ci	struct ring_ctrl	rx_jumbo_ctrl;
58362306a36Sopenharmony_ci	struct ring_ctrl	rx_mini_ctrl;
58462306a36Sopenharmony_ci	struct ring_ctrl	rx_return_ctrl;
58562306a36Sopenharmony_ci	aceaddr	evt_prd_ptr;
58662306a36Sopenharmony_ci	aceaddr	rx_ret_prd_ptr;
58762306a36Sopenharmony_ci	aceaddr	tx_csm_ptr;
58862306a36Sopenharmony_ci	aceaddr	stats2_ptr;
58962306a36Sopenharmony_ci};
59062306a36Sopenharmony_ci
59162306a36Sopenharmony_ci
59262306a36Sopenharmony_cistruct ring_info {
59362306a36Sopenharmony_ci	struct sk_buff		*skb;
59462306a36Sopenharmony_ci	DEFINE_DMA_UNMAP_ADDR(mapping);
59562306a36Sopenharmony_ci};
59662306a36Sopenharmony_ci
59762306a36Sopenharmony_ci
59862306a36Sopenharmony_ci/*
59962306a36Sopenharmony_ci * Funny... As soon as we add maplen on alpha, it starts to work
60062306a36Sopenharmony_ci * much slower. Hmm... is it because struct does not fit to one cacheline?
60162306a36Sopenharmony_ci * So, split tx_ring_info.
60262306a36Sopenharmony_ci */
60362306a36Sopenharmony_cistruct tx_ring_info {
60462306a36Sopenharmony_ci	struct sk_buff		*skb;
60562306a36Sopenharmony_ci	DEFINE_DMA_UNMAP_ADDR(mapping);
60662306a36Sopenharmony_ci	DEFINE_DMA_UNMAP_LEN(maplen);
60762306a36Sopenharmony_ci};
60862306a36Sopenharmony_ci
60962306a36Sopenharmony_ci
61062306a36Sopenharmony_ci/*
61162306a36Sopenharmony_ci * struct ace_skb holding the rings of skb's. This is an awful lot of
61262306a36Sopenharmony_ci * pointers, but I don't see any other smart mode to do this in an
61362306a36Sopenharmony_ci * efficient manner ;-(
61462306a36Sopenharmony_ci */
61562306a36Sopenharmony_cistruct ace_skb
61662306a36Sopenharmony_ci{
61762306a36Sopenharmony_ci	struct tx_ring_info	tx_skbuff[MAX_TX_RING_ENTRIES];
61862306a36Sopenharmony_ci	struct ring_info	rx_std_skbuff[RX_STD_RING_ENTRIES];
61962306a36Sopenharmony_ci	struct ring_info	rx_mini_skbuff[RX_MINI_RING_ENTRIES];
62062306a36Sopenharmony_ci	struct ring_info	rx_jumbo_skbuff[RX_JUMBO_RING_ENTRIES];
62162306a36Sopenharmony_ci};
62262306a36Sopenharmony_ci
62362306a36Sopenharmony_ci
62462306a36Sopenharmony_ci/*
62562306a36Sopenharmony_ci * Struct private for the AceNIC.
62662306a36Sopenharmony_ci *
62762306a36Sopenharmony_ci * Elements are grouped so variables used by the tx handling goes
62862306a36Sopenharmony_ci * together, and will go into the same cache lines etc. in order to
62962306a36Sopenharmony_ci * avoid cache line contention between the rx and tx handling on SMP.
63062306a36Sopenharmony_ci *
63162306a36Sopenharmony_ci * Frequently accessed variables are put at the beginning of the
63262306a36Sopenharmony_ci * struct to help the compiler generate better/shorter code.
63362306a36Sopenharmony_ci */
63462306a36Sopenharmony_cistruct ace_private
63562306a36Sopenharmony_ci{
63662306a36Sopenharmony_ci	struct net_device	*ndev;		/* backpointer */
63762306a36Sopenharmony_ci	struct ace_info		*info;
63862306a36Sopenharmony_ci	struct ace_regs	__iomem	*regs;		/* register base */
63962306a36Sopenharmony_ci	struct ace_skb		*skb;
64062306a36Sopenharmony_ci	dma_addr_t		info_dma;	/* 32/64 bit */
64162306a36Sopenharmony_ci
64262306a36Sopenharmony_ci	int			version, link;
64362306a36Sopenharmony_ci	int			promisc, mcast_all;
64462306a36Sopenharmony_ci
64562306a36Sopenharmony_ci	/*
64662306a36Sopenharmony_ci	 * TX elements
64762306a36Sopenharmony_ci	 */
64862306a36Sopenharmony_ci	struct tx_desc		*tx_ring;
64962306a36Sopenharmony_ci	u32			tx_prd;
65062306a36Sopenharmony_ci	volatile u32		tx_ret_csm;
65162306a36Sopenharmony_ci	int			tx_ring_entries;
65262306a36Sopenharmony_ci
65362306a36Sopenharmony_ci	/*
65462306a36Sopenharmony_ci	 * RX elements
65562306a36Sopenharmony_ci	 */
65662306a36Sopenharmony_ci	unsigned long		std_refill_busy
65762306a36Sopenharmony_ci				__attribute__ ((aligned (SMP_CACHE_BYTES)));
65862306a36Sopenharmony_ci	unsigned long		mini_refill_busy, jumbo_refill_busy;
65962306a36Sopenharmony_ci	atomic_t		cur_rx_bufs;
66062306a36Sopenharmony_ci	atomic_t		cur_mini_bufs;
66162306a36Sopenharmony_ci	atomic_t		cur_jumbo_bufs;
66262306a36Sopenharmony_ci	u32			rx_std_skbprd, rx_mini_skbprd, rx_jumbo_skbprd;
66362306a36Sopenharmony_ci	u32			cur_rx;
66462306a36Sopenharmony_ci
66562306a36Sopenharmony_ci	struct rx_desc		*rx_std_ring;
66662306a36Sopenharmony_ci	struct rx_desc		*rx_jumbo_ring;
66762306a36Sopenharmony_ci	struct rx_desc		*rx_mini_ring;
66862306a36Sopenharmony_ci	struct rx_desc		*rx_return_ring;
66962306a36Sopenharmony_ci
67062306a36Sopenharmony_ci	int			tasklet_pending, jumbo;
67162306a36Sopenharmony_ci	struct tasklet_struct	ace_tasklet;
67262306a36Sopenharmony_ci
67362306a36Sopenharmony_ci	struct event		*evt_ring;
67462306a36Sopenharmony_ci
67562306a36Sopenharmony_ci	volatile u32		*evt_prd, *rx_ret_prd, *tx_csm;
67662306a36Sopenharmony_ci
67762306a36Sopenharmony_ci	dma_addr_t		tx_ring_dma;	/* 32/64 bit */
67862306a36Sopenharmony_ci	dma_addr_t		rx_ring_base_dma;
67962306a36Sopenharmony_ci	dma_addr_t		evt_ring_dma;
68062306a36Sopenharmony_ci	dma_addr_t		evt_prd_dma, rx_ret_prd_dma, tx_csm_dma;
68162306a36Sopenharmony_ci
68262306a36Sopenharmony_ci	unsigned char		*trace_buf;
68362306a36Sopenharmony_ci	struct pci_dev		*pdev;
68462306a36Sopenharmony_ci	struct net_device	*next;
68562306a36Sopenharmony_ci	volatile int		fw_running;
68662306a36Sopenharmony_ci	int			board_idx;
68762306a36Sopenharmony_ci	u16			pci_command;
68862306a36Sopenharmony_ci	u8			pci_latency;
68962306a36Sopenharmony_ci	const char		*name;
69062306a36Sopenharmony_ci#ifdef INDEX_DEBUG
69162306a36Sopenharmony_ci	spinlock_t		debug_lock
69262306a36Sopenharmony_ci				__attribute__ ((aligned (SMP_CACHE_BYTES)));
69362306a36Sopenharmony_ci	u32			last_tx, last_std_rx, last_mini_rx;
69462306a36Sopenharmony_ci#endif
69562306a36Sopenharmony_ci	u8			firmware_major;
69662306a36Sopenharmony_ci	u8			firmware_minor;
69762306a36Sopenharmony_ci	u8			firmware_fix;
69862306a36Sopenharmony_ci	u32			firmware_start;
69962306a36Sopenharmony_ci};
70062306a36Sopenharmony_ci
70162306a36Sopenharmony_ci
70262306a36Sopenharmony_ci#define TX_RESERVED	MAX_SKB_FRAGS
70362306a36Sopenharmony_ci
70462306a36Sopenharmony_cistatic inline int tx_space (struct ace_private *ap, u32 csm, u32 prd)
70562306a36Sopenharmony_ci{
70662306a36Sopenharmony_ci	return (csm - prd - 1) & (ACE_TX_RING_ENTRIES(ap) - 1);
70762306a36Sopenharmony_ci}
70862306a36Sopenharmony_ci
70962306a36Sopenharmony_ci#define tx_free(ap) 		tx_space((ap)->tx_ret_csm, (ap)->tx_prd, ap)
71062306a36Sopenharmony_ci#define tx_ring_full(ap, csm, prd)	(tx_space(ap, csm, prd) <= TX_RESERVED)
71162306a36Sopenharmony_ci
71262306a36Sopenharmony_cistatic inline void set_aceaddr(aceaddr *aa, dma_addr_t addr)
71362306a36Sopenharmony_ci{
71462306a36Sopenharmony_ci	u64 baddr = (u64) addr;
71562306a36Sopenharmony_ci	aa->addrlo = baddr & 0xffffffff;
71662306a36Sopenharmony_ci	aa->addrhi = baddr >> 32;
71762306a36Sopenharmony_ci	wmb();
71862306a36Sopenharmony_ci}
71962306a36Sopenharmony_ci
72062306a36Sopenharmony_ci
72162306a36Sopenharmony_cistatic inline void ace_set_txprd(struct ace_regs __iomem *regs,
72262306a36Sopenharmony_ci				 struct ace_private *ap, u32 value)
72362306a36Sopenharmony_ci{
72462306a36Sopenharmony_ci#ifdef INDEX_DEBUG
72562306a36Sopenharmony_ci	unsigned long flags;
72662306a36Sopenharmony_ci	spin_lock_irqsave(&ap->debug_lock, flags);
72762306a36Sopenharmony_ci	writel(value, &regs->TxPrd);
72862306a36Sopenharmony_ci	if (value == ap->last_tx)
72962306a36Sopenharmony_ci		printk(KERN_ERR "AceNIC RACE ALERT! writing identical value "
73062306a36Sopenharmony_ci		       "to tx producer (%i)\n", value);
73162306a36Sopenharmony_ci	ap->last_tx = value;
73262306a36Sopenharmony_ci	spin_unlock_irqrestore(&ap->debug_lock, flags);
73362306a36Sopenharmony_ci#else
73462306a36Sopenharmony_ci	writel(value, &regs->TxPrd);
73562306a36Sopenharmony_ci#endif
73662306a36Sopenharmony_ci	wmb();
73762306a36Sopenharmony_ci}
73862306a36Sopenharmony_ci
73962306a36Sopenharmony_ci
74062306a36Sopenharmony_cistatic inline void ace_mask_irq(struct net_device *dev)
74162306a36Sopenharmony_ci{
74262306a36Sopenharmony_ci	struct ace_private *ap = netdev_priv(dev);
74362306a36Sopenharmony_ci	struct ace_regs __iomem *regs = ap->regs;
74462306a36Sopenharmony_ci
74562306a36Sopenharmony_ci	if (ACE_IS_TIGON_I(ap))
74662306a36Sopenharmony_ci		writel(1, &regs->MaskInt);
74762306a36Sopenharmony_ci	else
74862306a36Sopenharmony_ci		writel(readl(&regs->HostCtrl) | MASK_INTS, &regs->HostCtrl);
74962306a36Sopenharmony_ci
75062306a36Sopenharmony_ci	ace_sync_irq(dev->irq);
75162306a36Sopenharmony_ci}
75262306a36Sopenharmony_ci
75362306a36Sopenharmony_ci
75462306a36Sopenharmony_cistatic inline void ace_unmask_irq(struct net_device *dev)
75562306a36Sopenharmony_ci{
75662306a36Sopenharmony_ci	struct ace_private *ap = netdev_priv(dev);
75762306a36Sopenharmony_ci	struct ace_regs __iomem *regs = ap->regs;
75862306a36Sopenharmony_ci
75962306a36Sopenharmony_ci	if (ACE_IS_TIGON_I(ap))
76062306a36Sopenharmony_ci		writel(0, &regs->MaskInt);
76162306a36Sopenharmony_ci	else
76262306a36Sopenharmony_ci		writel(readl(&regs->HostCtrl) & ~MASK_INTS, &regs->HostCtrl);
76362306a36Sopenharmony_ci}
76462306a36Sopenharmony_ci
76562306a36Sopenharmony_ci
76662306a36Sopenharmony_ci/*
76762306a36Sopenharmony_ci * Prototypes
76862306a36Sopenharmony_ci */
76962306a36Sopenharmony_cistatic int ace_init(struct net_device *dev);
77062306a36Sopenharmony_cistatic void ace_load_std_rx_ring(struct net_device *dev, int nr_bufs);
77162306a36Sopenharmony_cistatic void ace_load_mini_rx_ring(struct net_device *dev, int nr_bufs);
77262306a36Sopenharmony_cistatic void ace_load_jumbo_rx_ring(struct net_device *dev, int nr_bufs);
77362306a36Sopenharmony_cistatic irqreturn_t ace_interrupt(int irq, void *dev_id);
77462306a36Sopenharmony_cistatic int ace_load_firmware(struct net_device *dev);
77562306a36Sopenharmony_cistatic int ace_open(struct net_device *dev);
77662306a36Sopenharmony_cistatic netdev_tx_t ace_start_xmit(struct sk_buff *skb,
77762306a36Sopenharmony_ci				  struct net_device *dev);
77862306a36Sopenharmony_cistatic int ace_close(struct net_device *dev);
77962306a36Sopenharmony_cistatic void ace_tasklet(struct tasklet_struct *t);
78062306a36Sopenharmony_cistatic void ace_dump_trace(struct ace_private *ap);
78162306a36Sopenharmony_cistatic void ace_set_multicast_list(struct net_device *dev);
78262306a36Sopenharmony_cistatic int ace_change_mtu(struct net_device *dev, int new_mtu);
78362306a36Sopenharmony_cistatic int ace_set_mac_addr(struct net_device *dev, void *p);
78462306a36Sopenharmony_cistatic void ace_set_rxtx_parms(struct net_device *dev, int jumbo);
78562306a36Sopenharmony_cistatic int ace_allocate_descriptors(struct net_device *dev);
78662306a36Sopenharmony_cistatic void ace_free_descriptors(struct net_device *dev);
78762306a36Sopenharmony_cistatic void ace_init_cleanup(struct net_device *dev);
78862306a36Sopenharmony_cistatic struct net_device_stats *ace_get_stats(struct net_device *dev);
78962306a36Sopenharmony_cistatic int read_eeprom_byte(struct net_device *dev, unsigned long offset);
79062306a36Sopenharmony_ci
79162306a36Sopenharmony_ci#endif /* _ACENIC_H_ */
792