Orange Pi5 kernel

Deprecated Linux kernel 5.10.110 for OrangePi 5/5B/5+ boards

3 Commits   0 Branches   0 Tags
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   1) /* SPDX-License-Identifier: GPL-2.0 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   2) #ifndef _ACENIC_H_
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   3) #define _ACENIC_H_
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   4) #include <linux/interrupt.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   5) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   6) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   7) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   8)  * Generate TX index update each time, when TX ring is closed.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   9)  * Normally, this is not useful, because results in more dma (and irqs
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  10)  * without TX_COAL_INTS_ONLY).
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  11)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  12) #define USE_TX_COAL_NOW	 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  13) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  14) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  15)  * Addressing:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  16)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  17)  * The Tigon uses 64-bit host addresses, regardless of their actual
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  18)  * length, and it expects a big-endian format. For 32 bit systems the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  19)  * upper 32 bits of the address are simply ignored (zero), however for
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  20)  * little endian 64 bit systems (Alpha) this looks strange with the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  21)  * two parts of the address word being swapped.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  22)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  23)  * The addresses are split in two 32 bit words for all architectures
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  24)  * as some of them are in PCI shared memory and it is necessary to use
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  25)  * readl/writel to access them.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  26)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  27)  * The addressing code is derived from Pete Wyckoff's work, but
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  28)  * modified to deal properly with readl/writel usage.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  29)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  30) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  31) struct ace_regs {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  32) 	u32	pad0[16];	/* PCI control registers */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  33) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  34) 	u32	HostCtrl;	/* 0x40 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  35) 	u32	LocalCtrl;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  36) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  37) 	u32	pad1[2];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  38) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  39) 	u32	MiscCfg;	/* 0x50 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  40) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  41) 	u32	pad2[2];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  42) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  43) 	u32	PciState;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  44) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  45) 	u32	pad3[2];	/* 0x60 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  46) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  47) 	u32	WinBase;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  48) 	u32	WinData;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  49) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  50) 	u32	pad4[12];	/* 0x70 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  51) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  52) 	u32	DmaWriteState;	/* 0xa0 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  53) 	u32	pad5[3];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  54) 	u32	DmaReadState;	/* 0xb0 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  55) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  56) 	u32	pad6[26];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  57) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  58) 	u32	AssistState;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  59) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  60) 	u32	pad7[8];	/* 0x120 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  61) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  62) 	u32	CpuCtrl;	/* 0x140 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  63) 	u32	Pc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  64) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  65) 	u32	pad8[3];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  66) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  67) 	u32	SramAddr;	/* 0x154 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  68) 	u32	SramData;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  69) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  70) 	u32	pad9[49];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  71) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  72) 	u32	MacRxState;	/* 0x220 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  73) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  74) 	u32	pad10[7];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  75) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  76) 	u32	CpuBCtrl;	/* 0x240 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  77) 	u32	PcB;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  78) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  79) 	u32	pad11[3];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  80) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  81) 	u32	SramBAddr;	/* 0x254 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  82) 	u32	SramBData;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  83) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  84) 	u32	pad12[105];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  85) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  86) 	u32	pad13[32];	/* 0x400 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  87) 	u32	Stats[32];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  88) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  89) 	u32	Mb0Hi;		/* 0x500 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  90) 	u32	Mb0Lo;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  91) 	u32	Mb1Hi;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  92) 	u32	CmdPrd;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  93) 	u32	Mb2Hi;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  94) 	u32	TxPrd;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  95) 	u32	Mb3Hi;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  96) 	u32	RxStdPrd;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  97) 	u32	Mb4Hi;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  98) 	u32	RxJumboPrd;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  99) 	u32	Mb5Hi;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) 	u32	RxMiniPrd;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) 	u32	Mb6Hi;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) 	u32	Mb6Lo;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) 	u32	Mb7Hi;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) 	u32	Mb7Lo;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) 	u32	Mb8Hi;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) 	u32	Mb8Lo;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) 	u32	Mb9Hi;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) 	u32	Mb9Lo;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) 	u32	MbAHi;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) 	u32	MbALo;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) 	u32	MbBHi;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) 	u32	MbBLo;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) 	u32	MbCHi;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) 	u32	MbCLo;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) 	u32	MbDHi;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) 	u32	MbDLo;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) 	u32	MbEHi;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) 	u32	MbELo;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) 	u32	MbFHi;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) 	u32	MbFLo;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) 	u32	pad14[32];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) 	u32	MacAddrHi;	/* 0x600 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) 	u32	MacAddrLo;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126) 	u32	InfoPtrHi;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) 	u32	InfoPtrLo;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128) 	u32	MultiCastHi;	/* 0x610 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) 	u32	MultiCastLo;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130) 	u32	ModeStat;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131) 	u32	DmaReadCfg;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132) 	u32	DmaWriteCfg;	/* 0x620 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133) 	u32	TxBufRat;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134) 	u32	EvtCsm;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135) 	u32	CmdCsm;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136) 	u32	TuneRxCoalTicks;/* 0x630 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137) 	u32	TuneTxCoalTicks;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138) 	u32	TuneStatTicks;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139) 	u32	TuneMaxTxDesc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140) 	u32	TuneMaxRxDesc;	/* 0x640 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141) 	u32	TuneTrace;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142) 	u32	TuneLink;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143) 	u32	TuneFastLink;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144) 	u32	TracePtr;	/* 0x650 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145) 	u32	TraceStrt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146) 	u32	TraceLen;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147) 	u32	IfIdx;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148) 	u32	IfMtu;		/* 0x660 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149) 	u32	MaskInt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150) 	u32	GigLnkState;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151) 	u32	FastLnkState;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152) 	u32	pad16[4];	/* 0x670 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153) 	u32	RxRetCsm;	/* 0x680 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155) 	u32	pad17[31];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157) 	u32	CmdRng[64];	/* 0x700 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158) 	u32	Window[0x200];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 162) typedef struct {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 163) 	u32 addrhi;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 164) 	u32 addrlo;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 165) } aceaddr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 166) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 167) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 168) #define ACE_WINDOW_SIZE	0x800
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 169) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 170) #define ACE_JUMBO_MTU 9000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 171) #define ACE_STD_MTU 1500
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 172) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 173) #define ACE_TRACE_SIZE 0x8000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 174) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 175) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 176)  * Host control register bits.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 177)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 178) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 179) #define IN_INT		0x01
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 180) #define CLR_INT		0x02
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 181) #define HW_RESET	0x08
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 182) #define BYTE_SWAP	0x10
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 183) #define WORD_SWAP	0x20
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 184) #define MASK_INTS	0x40
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 185) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 186) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 187)  * Local control register bits.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 188)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 189) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 190) #define EEPROM_DATA_IN		0x800000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 191) #define EEPROM_DATA_OUT		0x400000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 192) #define EEPROM_WRITE_ENABLE	0x200000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 193) #define EEPROM_CLK_OUT		0x100000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 194) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 195) #define EEPROM_BASE		0xa0000000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 196) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 197) #define EEPROM_WRITE_SELECT	0xa0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 198) #define EEPROM_READ_SELECT	0xa1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 199) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 200) #define SRAM_BANK_512K		0x200
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 201) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 202) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 203) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 204)  * udelay() values for when clocking the eeprom
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 205)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 206) #define ACE_SHORT_DELAY		2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 207) #define ACE_LONG_DELAY		4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 208) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 209) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 210) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 211)  * Misc Config bits
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 212)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 213) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 214) #define SYNC_SRAM_TIMING	0x100000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 215) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 216) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 217) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 218)  * CPU state bits.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 219)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 220) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 221) #define CPU_RESET		0x01
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 222) #define CPU_TRACE		0x02
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 223) #define CPU_PROM_FAILED		0x10
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 224) #define CPU_HALT		0x00010000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 225) #define CPU_HALTED		0xffff0000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 226) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 227) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 228) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 229)  * PCI State bits.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 230)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 231) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 232) #define DMA_READ_MAX_4		0x04
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 233) #define DMA_READ_MAX_16		0x08
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 234) #define DMA_READ_MAX_32		0x0c
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 235) #define DMA_READ_MAX_64		0x10
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 236) #define DMA_READ_MAX_128	0x14
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 237) #define DMA_READ_MAX_256	0x18
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 238) #define DMA_READ_MAX_1K		0x1c
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 239) #define DMA_WRITE_MAX_4		0x20
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 240) #define DMA_WRITE_MAX_16	0x40
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 241) #define DMA_WRITE_MAX_32	0x60
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 242) #define DMA_WRITE_MAX_64	0x80
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 243) #define DMA_WRITE_MAX_128	0xa0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 244) #define DMA_WRITE_MAX_256	0xc0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 245) #define DMA_WRITE_MAX_1K	0xe0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 246) #define DMA_READ_WRITE_MASK	0xfc
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 247) #define MEM_READ_MULTIPLE	0x00020000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 248) #define PCI_66MHZ		0x00080000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 249) #define PCI_32BIT		0x00100000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 250) #define DMA_WRITE_ALL_ALIGN	0x00800000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 251) #define READ_CMD_MEM		0x06000000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 252) #define WRITE_CMD_MEM		0x70000000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 253) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 254) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 255) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 256)  * Mode status
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 257)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 258) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 259) #define ACE_BYTE_SWAP_BD	0x02
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 260) #define ACE_WORD_SWAP_BD	0x04		/* not actually used */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 261) #define ACE_WARN		0x08
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 262) #define ACE_BYTE_SWAP_DMA	0x10
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 263) #define ACE_NO_JUMBO_FRAG	0x200
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 264) #define ACE_FATAL		0x40000000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 265) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 266) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 267) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 268)  * DMA config
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 269)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 270) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 271) #define DMA_THRESH_1W		0x10
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 272) #define DMA_THRESH_2W		0x20
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 273) #define DMA_THRESH_4W		0x40
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 274) #define DMA_THRESH_8W		0x80
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 275) #define DMA_THRESH_16W		0x100
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 276) #define DMA_THRESH_32W		0x0	/* not described in doc, but exists. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 277) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 278) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 279) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 280)  * Tuning parameters
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 281)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 282) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 283) #define TICKS_PER_SEC		1000000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 284) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 285) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 286) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 287)  * Link bits
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 288)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 289) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 290) #define LNK_PREF		0x00008000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 291) #define LNK_10MB		0x00010000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 292) #define LNK_100MB		0x00020000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 293) #define LNK_1000MB		0x00040000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 294) #define LNK_FULL_DUPLEX		0x00080000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 295) #define LNK_HALF_DUPLEX		0x00100000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 296) #define LNK_TX_FLOW_CTL_Y	0x00200000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 297) #define LNK_NEG_ADVANCED	0x00400000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 298) #define LNK_RX_FLOW_CTL_Y	0x00800000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 299) #define LNK_NIC			0x01000000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 300) #define LNK_JAM			0x02000000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 301) #define LNK_JUMBO		0x04000000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 302) #define LNK_ALTEON		0x08000000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 303) #define LNK_NEG_FCTL		0x10000000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 304) #define LNK_NEGOTIATE		0x20000000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 305) #define LNK_ENABLE		0x40000000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 306) #define LNK_UP			0x80000000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 307) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 308) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 309) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 310)  * Event definitions
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 311)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 312) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 313) #define EVT_RING_ENTRIES	256
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 314) #define EVT_RING_SIZE	(EVT_RING_ENTRIES * sizeof(struct event))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 315) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 316) struct event {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 317) #ifdef __LITTLE_ENDIAN_BITFIELD
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 318) 	u32	idx:12;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 319) 	u32	code:12;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 320) 	u32	evt:8;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 321) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 322) 	u32	evt:8;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 323) 	u32	code:12;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 324) 	u32	idx:12;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 325) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 326) 	u32     pad;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 327) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 328) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 329) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 330) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 331)  * Events
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 332)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 333) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 334) #define E_FW_RUNNING		0x01
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 335) #define E_STATS_UPDATED		0x04
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 336) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 337) #define E_STATS_UPDATE		0x04
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 338) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 339) #define E_LNK_STATE		0x06
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 340) #define E_C_LINK_UP		0x01
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 341) #define E_C_LINK_DOWN		0x02
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 342) #define E_C_LINK_10_100		0x03
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 343) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 344) #define E_ERROR			0x07
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 345) #define E_C_ERR_INVAL_CMD	0x01
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 346) #define E_C_ERR_UNIMP_CMD	0x02
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 347) #define E_C_ERR_BAD_CFG		0x03
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 348) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 349) #define E_MCAST_LIST		0x08
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 350) #define E_C_MCAST_ADDR_ADD	0x01
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 351) #define E_C_MCAST_ADDR_DEL	0x02
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 352) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 353) #define E_RESET_JUMBO_RNG	0x09
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 354) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 355) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 356) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 357)  * Commands
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 358)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 359) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 360) #define CMD_RING_ENTRIES	64
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 361) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 362) struct cmd {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 363) #ifdef __LITTLE_ENDIAN_BITFIELD
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 364) 	u32	idx:12;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 365) 	u32	code:12;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 366) 	u32	evt:8;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 367) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 368) 	u32	evt:8;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 369) 	u32	code:12;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 370) 	u32	idx:12;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 371) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 372) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 373) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 374) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 375) #define C_HOST_STATE		0x01
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 376) #define C_C_STACK_UP		0x01
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 377) #define C_C_STACK_DOWN		0x02
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 378) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 379) #define C_FDR_FILTERING		0x02
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 380) #define C_C_FDR_FILT_ENABLE	0x01
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 381) #define C_C_FDR_FILT_DISABLE	0x02
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 382) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 383) #define C_SET_RX_PRD_IDX	0x03
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 384) #define C_UPDATE_STATS		0x04
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 385) #define C_RESET_JUMBO_RNG	0x05
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 386) #define C_ADD_MULTICAST_ADDR	0x08
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 387) #define C_DEL_MULTICAST_ADDR	0x09
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 388) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 389) #define C_SET_PROMISC_MODE	0x0a
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 390) #define C_C_PROMISC_ENABLE	0x01
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 391) #define C_C_PROMISC_DISABLE	0x02
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 392) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 393) #define C_LNK_NEGOTIATION	0x0b
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 394) #define C_C_NEGOTIATE_BOTH	0x00
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 395) #define C_C_NEGOTIATE_GIG	0x01
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 396) #define C_C_NEGOTIATE_10_100	0x02
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 397) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 398) #define C_SET_MAC_ADDR		0x0c
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 399) #define C_CLEAR_PROFILE		0x0d
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 400) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 401) #define C_SET_MULTICAST_MODE	0x0e
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 402) #define C_C_MCAST_ENABLE	0x01
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 403) #define C_C_MCAST_DISABLE	0x02
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 404) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 405) #define C_CLEAR_STATS		0x0f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 406) #define C_SET_RX_JUMBO_PRD_IDX	0x10
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 407) #define C_REFRESH_STATS		0x11
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 408) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 409) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 410) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 411)  * Descriptor flags
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 412)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 413) #define BD_FLG_TCP_UDP_SUM	0x01
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 414) #define BD_FLG_IP_SUM		0x02
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 415) #define BD_FLG_END		0x04
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 416) #define BD_FLG_MORE		0x08
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 417) #define BD_FLG_JUMBO		0x10
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 418) #define BD_FLG_UCAST		0x20
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 419) #define BD_FLG_MCAST		0x40
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 420) #define BD_FLG_BCAST		0x60
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 421) #define BD_FLG_TYP_MASK		0x60
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 422) #define BD_FLG_IP_FRAG		0x80
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 423) #define BD_FLG_IP_FRAG_END	0x100
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 424) #define BD_FLG_VLAN_TAG		0x200
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 425) #define BD_FLG_FRAME_ERROR	0x400
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 426) #define BD_FLG_COAL_NOW		0x800
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 427) #define BD_FLG_MINI		0x1000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 428) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 429) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 430) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 431)  * Ring Control block flags
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 432)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 433) #define RCB_FLG_TCP_UDP_SUM	0x01
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 434) #define RCB_FLG_IP_SUM		0x02
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 435) #define RCB_FLG_NO_PSEUDO_HDR	0x08
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 436) #define RCB_FLG_VLAN_ASSIST	0x10
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 437) #define RCB_FLG_COAL_INT_ONLY	0x20
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 438) #define RCB_FLG_TX_HOST_RING	0x40
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 439) #define RCB_FLG_IEEE_SNAP_SUM	0x80
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 440) #define RCB_FLG_EXT_RX_BD	0x100
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 441) #define RCB_FLG_RNG_DISABLE	0x200
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 442) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 443) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 444) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 445)  * TX ring - maximum TX ring entries for Tigon I's is 128
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 446)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 447) #define MAX_TX_RING_ENTRIES	256
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 448) #define TIGON_I_TX_RING_ENTRIES	128
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 449) #define TX_RING_SIZE		(MAX_TX_RING_ENTRIES * sizeof(struct tx_desc))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 450) #define TX_RING_BASE		0x3800
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 451) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 452) struct tx_desc{
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 453)         aceaddr	addr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 454) 	u32	flagsize;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 455) #if 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 456) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 457)  * This is in PCI shared mem and must be accessed with readl/writel
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 458)  * real layout is:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 459)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 460) #if __LITTLE_ENDIAN
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 461) 	u16	flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 462) 	u16	size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 463) 	u16	vlan;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 464) 	u16	reserved;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 465) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 466) 	u16	size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 467) 	u16	flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 468) 	u16	reserved;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 469) 	u16	vlan;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 470) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 471) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 472) 	u32	vlanres;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 473) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 474) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 475) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 476) #define RX_STD_RING_ENTRIES	512
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 477) #define RX_STD_RING_SIZE	(RX_STD_RING_ENTRIES * sizeof(struct rx_desc))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 478) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 479) #define RX_JUMBO_RING_ENTRIES	256
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 480) #define RX_JUMBO_RING_SIZE	(RX_JUMBO_RING_ENTRIES *sizeof(struct rx_desc))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 481) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 482) #define RX_MINI_RING_ENTRIES	1024
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 483) #define RX_MINI_RING_SIZE	(RX_MINI_RING_ENTRIES *sizeof(struct rx_desc))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 484) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 485) #define RX_RETURN_RING_ENTRIES	2048
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 486) #define RX_RETURN_RING_SIZE	(RX_MAX_RETURN_RING_ENTRIES * \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 487) 				 sizeof(struct rx_desc))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 488) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 489) struct rx_desc{
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 490) 	aceaddr	addr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 491) #ifdef __LITTLE_ENDIAN
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 492) 	u16	size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 493) 	u16	idx;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 494) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 495) 	u16	idx;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 496) 	u16	size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 497) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 498) #ifdef __LITTLE_ENDIAN
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 499) 	u16	flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 500) 	u16	type;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 501) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 502) 	u16	type;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 503) 	u16	flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 504) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 505) #ifdef __LITTLE_ENDIAN
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 506) 	u16	tcp_udp_csum;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 507) 	u16	ip_csum;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 508) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 509) 	u16	ip_csum;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 510) 	u16	tcp_udp_csum;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 511) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 512) #ifdef __LITTLE_ENDIAN
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 513) 	u16	vlan;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 514) 	u16	err_flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 515) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 516) 	u16	err_flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 517) 	u16	vlan;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 518) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 519) 	u32	reserved;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 520) 	u32	opague;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 521) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 522) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 523) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 524) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 525)  * This struct is shared with the NIC firmware.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 526)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 527) struct ring_ctrl {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 528) 	aceaddr	rngptr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 529) #ifdef __LITTLE_ENDIAN
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 530) 	u16	flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 531) 	u16	max_len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 532) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 533) 	u16	max_len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 534) 	u16	flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 535) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 536) 	u32	pad;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 537) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 538) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 539) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 540) struct ace_mac_stats {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 541) 	u32 excess_colls;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 542) 	u32 coll_1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 543) 	u32 coll_2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 544) 	u32 coll_3;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 545) 	u32 coll_4;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 546) 	u32 coll_5;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 547) 	u32 coll_6;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 548) 	u32 coll_7;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 549) 	u32 coll_8;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 550) 	u32 coll_9;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 551) 	u32 coll_10;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 552) 	u32 coll_11;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 553) 	u32 coll_12;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 554) 	u32 coll_13;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 555) 	u32 coll_14;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 556) 	u32 coll_15;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 557) 	u32 late_coll;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 558) 	u32 defers;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 559) 	u32 crc_err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 560) 	u32 underrun;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 561) 	u32 crs_err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 562) 	u32 pad[3];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 563) 	u32 drop_ula;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 564) 	u32 drop_mc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 565) 	u32 drop_fc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 566) 	u32 drop_space;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 567) 	u32 coll;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 568) 	u32 kept_bc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 569) 	u32 kept_mc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 570) 	u32 kept_uc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 571) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 572) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 573) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 574) struct ace_info {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 575) 	union {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 576) 		u32 stats[256];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 577) 	} s;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 578) 	struct ring_ctrl	evt_ctrl;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 579) 	struct ring_ctrl	cmd_ctrl;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 580) 	struct ring_ctrl	tx_ctrl;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 581) 	struct ring_ctrl	rx_std_ctrl;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 582) 	struct ring_ctrl	rx_jumbo_ctrl;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 583) 	struct ring_ctrl	rx_mini_ctrl;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 584) 	struct ring_ctrl	rx_return_ctrl;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 585) 	aceaddr	evt_prd_ptr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 586) 	aceaddr	rx_ret_prd_ptr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 587) 	aceaddr	tx_csm_ptr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 588) 	aceaddr	stats2_ptr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 589) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 590) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 591) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 592) struct ring_info {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 593) 	struct sk_buff		*skb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 594) 	DEFINE_DMA_UNMAP_ADDR(mapping);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 595) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 596) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 597) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 598) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 599)  * Funny... As soon as we add maplen on alpha, it starts to work
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 600)  * much slower. Hmm... is it because struct does not fit to one cacheline?
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 601)  * So, split tx_ring_info.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 602)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 603) struct tx_ring_info {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 604) 	struct sk_buff		*skb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 605) 	DEFINE_DMA_UNMAP_ADDR(mapping);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 606) 	DEFINE_DMA_UNMAP_LEN(maplen);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 607) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 608) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 609) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 610) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 611)  * struct ace_skb holding the rings of skb's. This is an awful lot of
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 612)  * pointers, but I don't see any other smart mode to do this in an
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 613)  * efficient manner ;-(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 614)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 615) struct ace_skb
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 616) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 617) 	struct tx_ring_info	tx_skbuff[MAX_TX_RING_ENTRIES];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 618) 	struct ring_info	rx_std_skbuff[RX_STD_RING_ENTRIES];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 619) 	struct ring_info	rx_mini_skbuff[RX_MINI_RING_ENTRIES];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 620) 	struct ring_info	rx_jumbo_skbuff[RX_JUMBO_RING_ENTRIES];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 621) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 622) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 623) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 624) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 625)  * Struct private for the AceNIC.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 626)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 627)  * Elements are grouped so variables used by the tx handling goes
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 628)  * together, and will go into the same cache lines etc. in order to
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 629)  * avoid cache line contention between the rx and tx handling on SMP.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 630)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 631)  * Frequently accessed variables are put at the beginning of the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 632)  * struct to help the compiler generate better/shorter code.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 633)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 634) struct ace_private
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 635) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 636) 	struct net_device	*ndev;		/* backpointer */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 637) 	struct ace_info		*info;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 638) 	struct ace_regs	__iomem	*regs;		/* register base */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 639) 	struct ace_skb		*skb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 640) 	dma_addr_t		info_dma;	/* 32/64 bit */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 641) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 642) 	int			version, link;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 643) 	int			promisc, mcast_all;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 644) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 645) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 646) 	 * TX elements
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 647) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 648) 	struct tx_desc		*tx_ring;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 649) 	u32			tx_prd;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 650) 	volatile u32		tx_ret_csm;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 651) 	int			tx_ring_entries;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 652) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 653) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 654) 	 * RX elements
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 655) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 656) 	unsigned long		std_refill_busy
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 657) 				__attribute__ ((aligned (SMP_CACHE_BYTES)));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 658) 	unsigned long		mini_refill_busy, jumbo_refill_busy;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 659) 	atomic_t		cur_rx_bufs;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 660) 	atomic_t		cur_mini_bufs;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 661) 	atomic_t		cur_jumbo_bufs;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 662) 	u32			rx_std_skbprd, rx_mini_skbprd, rx_jumbo_skbprd;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 663) 	u32			cur_rx;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 664) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 665) 	struct rx_desc		*rx_std_ring;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 666) 	struct rx_desc		*rx_jumbo_ring;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 667) 	struct rx_desc		*rx_mini_ring;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 668) 	struct rx_desc		*rx_return_ring;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 669) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 670) 	int			tasklet_pending, jumbo;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 671) 	struct tasklet_struct	ace_tasklet;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 672) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 673) 	struct event		*evt_ring;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 674) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 675) 	volatile u32		*evt_prd, *rx_ret_prd, *tx_csm;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 676) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 677) 	dma_addr_t		tx_ring_dma;	/* 32/64 bit */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 678) 	dma_addr_t		rx_ring_base_dma;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 679) 	dma_addr_t		evt_ring_dma;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 680) 	dma_addr_t		evt_prd_dma, rx_ret_prd_dma, tx_csm_dma;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 681) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 682) 	unsigned char		*trace_buf;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 683) 	struct pci_dev		*pdev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 684) 	struct net_device	*next;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 685) 	volatile int		fw_running;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 686) 	int			board_idx;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 687) 	u16			pci_command;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 688) 	u8			pci_latency;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 689) 	const char		*name;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 690) #ifdef INDEX_DEBUG
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 691) 	spinlock_t		debug_lock
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 692) 				__attribute__ ((aligned (SMP_CACHE_BYTES)));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 693) 	u32			last_tx, last_std_rx, last_mini_rx;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 694) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 695) 	int			pci_using_dac;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 696) 	u8			firmware_major;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 697) 	u8			firmware_minor;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 698) 	u8			firmware_fix;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 699) 	u32			firmware_start;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 700) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 701) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 702) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 703) #define TX_RESERVED	MAX_SKB_FRAGS
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 704) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 705) static inline int tx_space (struct ace_private *ap, u32 csm, u32 prd)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 706) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 707) 	return (csm - prd - 1) & (ACE_TX_RING_ENTRIES(ap) - 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 708) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 709) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 710) #define tx_free(ap) 		tx_space((ap)->tx_ret_csm, (ap)->tx_prd, ap)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 711) #define tx_ring_full(ap, csm, prd)	(tx_space(ap, csm, prd) <= TX_RESERVED)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 712) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 713) static inline void set_aceaddr(aceaddr *aa, dma_addr_t addr)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 714) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 715) 	u64 baddr = (u64) addr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 716) 	aa->addrlo = baddr & 0xffffffff;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 717) 	aa->addrhi = baddr >> 32;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 718) 	wmb();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 719) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 720) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 721) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 722) static inline void ace_set_txprd(struct ace_regs __iomem *regs,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 723) 				 struct ace_private *ap, u32 value)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 724) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 725) #ifdef INDEX_DEBUG
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 726) 	unsigned long flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 727) 	spin_lock_irqsave(&ap->debug_lock, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 728) 	writel(value, &regs->TxPrd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 729) 	if (value == ap->last_tx)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 730) 		printk(KERN_ERR "AceNIC RACE ALERT! writing identical value "
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 731) 		       "to tx producer (%i)\n", value);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 732) 	ap->last_tx = value;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 733) 	spin_unlock_irqrestore(&ap->debug_lock, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 734) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 735) 	writel(value, &regs->TxPrd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 736) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 737) 	wmb();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 738) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 739) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 740) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 741) static inline void ace_mask_irq(struct net_device *dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 742) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 743) 	struct ace_private *ap = netdev_priv(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 744) 	struct ace_regs __iomem *regs = ap->regs;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 745) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 746) 	if (ACE_IS_TIGON_I(ap))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 747) 		writel(1, &regs->MaskInt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 748) 	else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 749) 		writel(readl(&regs->HostCtrl) | MASK_INTS, &regs->HostCtrl);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 750) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 751) 	ace_sync_irq(dev->irq);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 752) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 753) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 754) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 755) static inline void ace_unmask_irq(struct net_device *dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 756) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 757) 	struct ace_private *ap = netdev_priv(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 758) 	struct ace_regs __iomem *regs = ap->regs;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 759) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 760) 	if (ACE_IS_TIGON_I(ap))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 761) 		writel(0, &regs->MaskInt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 762) 	else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 763) 		writel(readl(&regs->HostCtrl) & ~MASK_INTS, &regs->HostCtrl);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 764) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 765) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 766) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 767) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 768)  * Prototypes
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 769)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 770) static int ace_init(struct net_device *dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 771) static void ace_load_std_rx_ring(struct net_device *dev, int nr_bufs);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 772) static void ace_load_mini_rx_ring(struct net_device *dev, int nr_bufs);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 773) static void ace_load_jumbo_rx_ring(struct net_device *dev, int nr_bufs);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 774) static irqreturn_t ace_interrupt(int irq, void *dev_id);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 775) static int ace_load_firmware(struct net_device *dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 776) static int ace_open(struct net_device *dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 777) static netdev_tx_t ace_start_xmit(struct sk_buff *skb,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 778) 				  struct net_device *dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 779) static int ace_close(struct net_device *dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 780) static void ace_tasklet(struct tasklet_struct *t);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 781) static void ace_dump_trace(struct ace_private *ap);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 782) static void ace_set_multicast_list(struct net_device *dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 783) static int ace_change_mtu(struct net_device *dev, int new_mtu);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 784) static int ace_set_mac_addr(struct net_device *dev, void *p);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 785) static void ace_set_rxtx_parms(struct net_device *dev, int jumbo);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 786) static int ace_allocate_descriptors(struct net_device *dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 787) static void ace_free_descriptors(struct net_device *dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 788) static void ace_init_cleanup(struct net_device *dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 789) static struct net_device_stats *ace_get_stats(struct net_device *dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 790) static int read_eeprom_byte(struct net_device *dev, unsigned long offset);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 791) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 792) #endif /* _ACENIC_H_ */