xref: /OK3568_Linux_fs/external/rkwifibt/drivers/bcmdhd/include/sbsdpcmdev.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /*
2*4882a593Smuzhiyun  * Broadcom SiliconBackplane SDIO/PCMCIA hardware-specific
3*4882a593Smuzhiyun  * device core support
4*4882a593Smuzhiyun  *
5*4882a593Smuzhiyun  * Copyright (C) 2020, Broadcom.
6*4882a593Smuzhiyun  *
7*4882a593Smuzhiyun  *      Unless you and Broadcom execute a separate written software license
8*4882a593Smuzhiyun  * agreement governing use of this software, this software is licensed to you
9*4882a593Smuzhiyun  * under the terms of the GNU General Public License version 2 (the "GPL"),
10*4882a593Smuzhiyun  * available at http://www.broadcom.com/licenses/GPLv2.php, with the
11*4882a593Smuzhiyun  * following added to such license:
12*4882a593Smuzhiyun  *
13*4882a593Smuzhiyun  *      As a special exception, the copyright holders of this software give you
14*4882a593Smuzhiyun  * permission to link this software with independent modules, and to copy and
15*4882a593Smuzhiyun  * distribute the resulting executable under terms of your choice, provided that
16*4882a593Smuzhiyun  * you also meet, for each linked independent module, the terms and conditions of
17*4882a593Smuzhiyun  * the license of that module.  An independent module is a module which is not
18*4882a593Smuzhiyun  * derived from this software.  The special exception does not apply to any
19*4882a593Smuzhiyun  * modifications of the software.
20*4882a593Smuzhiyun  *
21*4882a593Smuzhiyun  *
22*4882a593Smuzhiyun  * <<Broadcom-WL-IPTag/Dual:>>
23*4882a593Smuzhiyun  */
24*4882a593Smuzhiyun 
25*4882a593Smuzhiyun #ifndef	_sbsdpcmdev_h_
26*4882a593Smuzhiyun #define	_sbsdpcmdev_h_
27*4882a593Smuzhiyun 
28*4882a593Smuzhiyun /* cpp contortions to concatenate w/arg prescan */
29*4882a593Smuzhiyun #ifndef PAD
30*4882a593Smuzhiyun #define	_PADLINE(line)	pad ## line
31*4882a593Smuzhiyun #define	_XSTR(line)	_PADLINE(line)
32*4882a593Smuzhiyun #define	PAD		_XSTR(__LINE__)
33*4882a593Smuzhiyun #endif	/* PAD */
34*4882a593Smuzhiyun 
35*4882a593Smuzhiyun typedef volatile struct {
36*4882a593Smuzhiyun 	dma64regs_t	xmt;		/* dma tx */
37*4882a593Smuzhiyun 	uint32 PAD[2];
38*4882a593Smuzhiyun 	dma64regs_t	rcv;		/* dma rx */
39*4882a593Smuzhiyun 	uint32 PAD[2];
40*4882a593Smuzhiyun } dma64p_t;
41*4882a593Smuzhiyun 
42*4882a593Smuzhiyun /* dma64 sdiod corerev >= 1 */
43*4882a593Smuzhiyun typedef volatile struct {
44*4882a593Smuzhiyun 	dma64p_t dma64regs[2];
45*4882a593Smuzhiyun 	dma64diag_t dmafifo;		/* DMA Diagnostic Regs, 0x280-0x28c */
46*4882a593Smuzhiyun 	uint32 PAD[92];
47*4882a593Smuzhiyun } sdiodma64_t;
48*4882a593Smuzhiyun 
49*4882a593Smuzhiyun /* dma32 sdiod corerev == 0 */
50*4882a593Smuzhiyun typedef volatile struct {
51*4882a593Smuzhiyun 	dma32regp_t dma32regs[2];	/* dma tx & rx, 0x200-0x23c */
52*4882a593Smuzhiyun 	dma32diag_t dmafifo;		/* DMA Diagnostic Regs, 0x240-0x24c */
53*4882a593Smuzhiyun 	uint32 PAD[108];
54*4882a593Smuzhiyun } sdiodma32_t;
55*4882a593Smuzhiyun 
56*4882a593Smuzhiyun /* dma32 regs for pcmcia core */
57*4882a593Smuzhiyun typedef volatile struct {
58*4882a593Smuzhiyun 	dma32regp_t dmaregs;		/* DMA Regs, 0x200-0x21c, rev8 */
59*4882a593Smuzhiyun 	dma32diag_t dmafifo;		/* DMA Diagnostic Regs, 0x220-0x22c */
60*4882a593Smuzhiyun 	uint32 PAD[116];
61*4882a593Smuzhiyun } pcmdma32_t;
62*4882a593Smuzhiyun 
63*4882a593Smuzhiyun /* core registers */
64*4882a593Smuzhiyun typedef volatile struct {
65*4882a593Smuzhiyun 	uint32 corecontrol;		/* CoreControl, 0x000, rev8 */
66*4882a593Smuzhiyun 	uint32 corestatus;		/* CoreStatus, 0x004, rev8  */
67*4882a593Smuzhiyun 	uint32 PAD[1];
68*4882a593Smuzhiyun 	uint32 biststatus;		/* BistStatus, 0x00c, rev8  */
69*4882a593Smuzhiyun 
70*4882a593Smuzhiyun 	/* PCMCIA access */
71*4882a593Smuzhiyun 	uint16 pcmciamesportaladdr;	/* PcmciaMesPortalAddr, 0x010, rev8   */
72*4882a593Smuzhiyun 	uint16 PAD[1];
73*4882a593Smuzhiyun 	uint16 pcmciamesportalmask;	/* PcmciaMesPortalMask, 0x014, rev8   */
74*4882a593Smuzhiyun 	uint16 PAD[1];
75*4882a593Smuzhiyun 	uint16 pcmciawrframebc;		/* PcmciaWrFrameBC, 0x018, rev8   */
76*4882a593Smuzhiyun 	uint16 PAD[1];
77*4882a593Smuzhiyun 	uint16 pcmciaunderflowtimer;	/* PcmciaUnderflowTimer, 0x01c, rev8   */
78*4882a593Smuzhiyun 	uint16 PAD[1];
79*4882a593Smuzhiyun 
80*4882a593Smuzhiyun 	/* interrupt */
81*4882a593Smuzhiyun 	uint32 intstatus;		/* IntStatus, 0x020, rev8   */
82*4882a593Smuzhiyun 	uint32 hostintmask;		/* IntHostMask, 0x024, rev8   */
83*4882a593Smuzhiyun 	uint32 intmask;			/* IntSbMask, 0x028, rev8   */
84*4882a593Smuzhiyun 	uint32 sbintstatus;		/* SBIntStatus, 0x02c, rev8   */
85*4882a593Smuzhiyun 	uint32 sbintmask;		/* SBIntMask, 0x030, rev8   */
86*4882a593Smuzhiyun 	uint32 funcintmask;		/* SDIO Function Interrupt Mask, SDIO rev4 */
87*4882a593Smuzhiyun 	uint32 PAD[2];
88*4882a593Smuzhiyun 	uint32 tosbmailbox;		/* ToSBMailbox, 0x040, rev8   */
89*4882a593Smuzhiyun 	uint32 tohostmailbox;		/* ToHostMailbox, 0x044, rev8   */
90*4882a593Smuzhiyun 	uint32 tosbmailboxdata;		/* ToSbMailboxData, 0x048, rev8   */
91*4882a593Smuzhiyun 	uint32 tohostmailboxdata;	/* ToHostMailboxData, 0x04c, rev8   */
92*4882a593Smuzhiyun 
93*4882a593Smuzhiyun 	/* synchronized access to registers in SDIO clock domain */
94*4882a593Smuzhiyun 	uint32 sdioaccess;		/* SdioAccess, 0x050, rev8   */
95*4882a593Smuzhiyun 	uint32 PAD[1];
96*4882a593Smuzhiyun 	uint32 MiscHostAccessIntEn;
97*4882a593Smuzhiyun 	uint32 PAD[1];
98*4882a593Smuzhiyun 
99*4882a593Smuzhiyun 	/* PCMCIA frame control */
100*4882a593Smuzhiyun 	uint8 pcmciaframectrl;		/* pcmciaFrameCtrl, 0x060, rev8   */
101*4882a593Smuzhiyun 	uint8 PAD[3];
102*4882a593Smuzhiyun 	uint8 pcmciawatermark;		/* pcmciaWaterMark, 0x064, rev8   */
103*4882a593Smuzhiyun 	uint8 PAD[155];
104*4882a593Smuzhiyun 
105*4882a593Smuzhiyun 	/* interrupt batching control */
106*4882a593Smuzhiyun 	uint32 intrcvlazy;		/* IntRcvLazy, 0x100, rev8 */
107*4882a593Smuzhiyun 	uint32 PAD[3];
108*4882a593Smuzhiyun 
109*4882a593Smuzhiyun 	/* counters */
110*4882a593Smuzhiyun 	uint32 cmd52rd;			/* Cmd52RdCount, 0x110, rev8, SDIO: cmd52 reads */
111*4882a593Smuzhiyun 	uint32 cmd52wr;			/* Cmd52WrCount, 0x114, rev8, SDIO: cmd52 writes */
112*4882a593Smuzhiyun 	uint32 cmd53rd;			/* Cmd53RdCount, 0x118, rev8, SDIO: cmd53 reads */
113*4882a593Smuzhiyun 	uint32 cmd53wr;			/* Cmd53WrCount, 0x11c, rev8, SDIO: cmd53 writes */
114*4882a593Smuzhiyun 	uint32 abort;			/* AbortCount, 0x120, rev8, SDIO: aborts */
115*4882a593Smuzhiyun 	uint32 datacrcerror;		/* DataCrcErrorCount, 0x124, rev8, SDIO: frames w/bad CRC */
116*4882a593Smuzhiyun 	uint32 rdoutofsync;		/* RdOutOfSyncCount, 0x128, rev8, SDIO/PCMCIA: Rd Frm OOS */
117*4882a593Smuzhiyun 	uint32 wroutofsync;		/* RdOutOfSyncCount, 0x12c, rev8, SDIO/PCMCIA: Wr Frm OOS */
118*4882a593Smuzhiyun 	uint32 writebusy;		/* WriteBusyCount, 0x130, rev8, SDIO: dev asserted "busy" */
119*4882a593Smuzhiyun 	uint32 readwait;		/* ReadWaitCount, 0x134, rev8, SDIO: read: no data avail */
120*4882a593Smuzhiyun 	uint32 readterm;		/* ReadTermCount, 0x138, rev8, SDIO: rd frm terminates */
121*4882a593Smuzhiyun 	uint32 writeterm;		/* WriteTermCount, 0x13c, rev8, SDIO: wr frm terminates */
122*4882a593Smuzhiyun 	uint32 PAD[40];
123*4882a593Smuzhiyun 	uint32 clockctlstatus;		/* ClockCtlStatus, 0x1e0, rev8 */
124*4882a593Smuzhiyun 	uint32 PAD[1];
125*4882a593Smuzhiyun 	uint32 powerctl;		/* 0x1e8 */
126*4882a593Smuzhiyun 	uint32 PAD[5];
127*4882a593Smuzhiyun 
128*4882a593Smuzhiyun 	/* DMA engines */
129*4882a593Smuzhiyun 	volatile union {
130*4882a593Smuzhiyun 		pcmdma32_t pcm32;
131*4882a593Smuzhiyun 		sdiodma32_t sdiod32;
132*4882a593Smuzhiyun 		sdiodma64_t sdiod64;
133*4882a593Smuzhiyun 	} dma;
134*4882a593Smuzhiyun 
135*4882a593Smuzhiyun 	/* SDIO/PCMCIA CIS region */
136*4882a593Smuzhiyun 	char cis[512];			/* 512 byte CIS, 0x400-0x5ff, rev6 */
137*4882a593Smuzhiyun 
138*4882a593Smuzhiyun 	/* PCMCIA function control registers */
139*4882a593Smuzhiyun 	char pcmciafcr[256];		/* PCMCIA FCR, 0x600-6ff, rev6 */
140*4882a593Smuzhiyun 	uint16 PAD[55];
141*4882a593Smuzhiyun 
142*4882a593Smuzhiyun 	/* PCMCIA backplane access */
143*4882a593Smuzhiyun 	uint16 backplanecsr;		/* BackplaneCSR, 0x76E, rev6 */
144*4882a593Smuzhiyun 	uint16 backplaneaddr0;		/* BackplaneAddr0, 0x770, rev6 */
145*4882a593Smuzhiyun 	uint16 backplaneaddr1;		/* BackplaneAddr1, 0x772, rev6 */
146*4882a593Smuzhiyun 	uint16 backplaneaddr2;		/* BackplaneAddr2, 0x774, rev6 */
147*4882a593Smuzhiyun 	uint16 backplaneaddr3;		/* BackplaneAddr3, 0x776, rev6 */
148*4882a593Smuzhiyun 	uint16 backplanedata0;		/* BackplaneData0, 0x778, rev6 */
149*4882a593Smuzhiyun 	uint16 backplanedata1;		/* BackplaneData1, 0x77a, rev6 */
150*4882a593Smuzhiyun 	uint16 backplanedata2;		/* BackplaneData2, 0x77c, rev6 */
151*4882a593Smuzhiyun 	uint16 backplanedata3;		/* BackplaneData3, 0x77e, rev6 */
152*4882a593Smuzhiyun 	uint16 PAD[31];
153*4882a593Smuzhiyun 
154*4882a593Smuzhiyun 	/* sprom "size" & "blank" info */
155*4882a593Smuzhiyun 	uint16 spromstatus;		/* SPROMStatus, 0x7BE, rev2 */
156*4882a593Smuzhiyun 	uint32 PAD[464];
157*4882a593Smuzhiyun 
158*4882a593Smuzhiyun 	/* Sonics SiliconBackplane registers */
159*4882a593Smuzhiyun 	sbconfig_t sbconfig;		/* SbConfig Regs, 0xf00-0xfff, rev8 */
160*4882a593Smuzhiyun } sdpcmd_regs_t;
161*4882a593Smuzhiyun 
162*4882a593Smuzhiyun /* corecontrol */
163*4882a593Smuzhiyun #define CC_CISRDY		(1 << 0)	/* CIS Ready */
164*4882a593Smuzhiyun #define CC_BPRESEN		(1 << 1)	/* CCCR RES signal causes backplane reset */
165*4882a593Smuzhiyun #define CC_F2RDY		(1 << 2)	/* set CCCR IOR2 bit */
166*4882a593Smuzhiyun #define CC_CLRPADSISO		(1 << 3)	/* clear SDIO pads isolation bit (rev 11) */
167*4882a593Smuzhiyun #define CC_XMTDATAAVAIL_MODE	(1 << 4)	/* data avail generates an interrupt */
168*4882a593Smuzhiyun #define CC_XMTDATAAVAIL_CTRL	(1 << 5)	/* data avail interrupt ctrl */
169*4882a593Smuzhiyun 
170*4882a593Smuzhiyun /* corestatus */
171*4882a593Smuzhiyun #define CS_PCMCIAMODE	(1 << 0)	/* Device Mode; 0=SDIO, 1=PCMCIA */
172*4882a593Smuzhiyun #define CS_SMARTDEV	(1 << 1)	/* 1=smartDev enabled */
173*4882a593Smuzhiyun #define CS_F2ENABLED	(1 << 2)	/* 1=host has enabled the device */
174*4882a593Smuzhiyun 
175*4882a593Smuzhiyun #define PCMCIA_MES_PA_MASK	0x7fff	/* PCMCIA Message Portal Address Mask */
176*4882a593Smuzhiyun #define PCMCIA_MES_PM_MASK	0x7fff	/* PCMCIA Message Portal Mask Mask */
177*4882a593Smuzhiyun #define PCMCIA_WFBC_MASK	0xffff	/* PCMCIA Write Frame Byte Count Mask */
178*4882a593Smuzhiyun #define PCMCIA_UT_MASK		0x07ff	/* PCMCIA Underflow Timer Mask */
179*4882a593Smuzhiyun 
180*4882a593Smuzhiyun /* intstatus */
181*4882a593Smuzhiyun #define I_SMB_SW0	(1 << 0)	/* To SB Mail S/W interrupt 0 */
182*4882a593Smuzhiyun #define I_SMB_SW1	(1 << 1)	/* To SB Mail S/W interrupt 1 */
183*4882a593Smuzhiyun #define I_SMB_SW2	(1 << 2)	/* To SB Mail S/W interrupt 2 */
184*4882a593Smuzhiyun #define I_SMB_SW3	(1 << 3)	/* To SB Mail S/W interrupt 3 */
185*4882a593Smuzhiyun #define I_SMB_SW_MASK	0x0000000f	/* To SB Mail S/W interrupts mask */
186*4882a593Smuzhiyun #define I_SMB_SW_SHIFT	0		/* To SB Mail S/W interrupts shift */
187*4882a593Smuzhiyun #define I_HMB_SW0	(1 << 4)	/* To Host Mail S/W interrupt 0 */
188*4882a593Smuzhiyun #define I_HMB_SW1	(1 << 5)	/* To Host Mail S/W interrupt 1 */
189*4882a593Smuzhiyun #define I_HMB_SW2	(1 << 6)	/* To Host Mail S/W interrupt 2 */
190*4882a593Smuzhiyun #define I_HMB_SW3	(1 << 7)	/* To Host Mail S/W interrupt 3 */
191*4882a593Smuzhiyun #define I_HMB_SW_MASK	0x000000f0	/* To Host Mail S/W interrupts mask */
192*4882a593Smuzhiyun #define I_HMB_SW_SHIFT	4		/* To Host Mail S/W interrupts shift */
193*4882a593Smuzhiyun #define I_WR_OOSYNC	(1 << 8)	/* Write Frame Out Of Sync */
194*4882a593Smuzhiyun #define I_RD_OOSYNC	(1 << 9)	/* Read Frame Out Of Sync */
195*4882a593Smuzhiyun #define	I_PC		(1 << 10)	/* descriptor error */
196*4882a593Smuzhiyun #define	I_PD		(1 << 11)	/* data error */
197*4882a593Smuzhiyun #define	I_DE		(1 << 12)	/* Descriptor protocol Error */
198*4882a593Smuzhiyun #define	I_RU		(1 << 13)	/* Receive descriptor Underflow */
199*4882a593Smuzhiyun #define	I_RO		(1 << 14)	/* Receive fifo Overflow */
200*4882a593Smuzhiyun #define	I_XU		(1 << 15)	/* Transmit fifo Underflow */
201*4882a593Smuzhiyun #define	I_RI		(1 << 16)	/* Receive Interrupt */
202*4882a593Smuzhiyun #define I_BUSPWR	(1 << 17)	/* SDIO Bus Power Change (rev 9) */
203*4882a593Smuzhiyun #define I_XMTDATA_AVAIL (1 << 23)	/* bits in fifo */
204*4882a593Smuzhiyun #define	I_XI		(1 << 24)	/* Transmit Interrupt */
205*4882a593Smuzhiyun #define I_RF_TERM	(1 << 25)	/* Read Frame Terminate */
206*4882a593Smuzhiyun #define I_WF_TERM	(1 << 26)	/* Write Frame Terminate */
207*4882a593Smuzhiyun #define I_PCMCIA_XU	(1 << 27)	/* PCMCIA Transmit FIFO Underflow */
208*4882a593Smuzhiyun #define I_SBINT		(1 << 28)	/* sbintstatus Interrupt */
209*4882a593Smuzhiyun #define I_CHIPACTIVE	(1 << 29)	/* chip transitioned from doze to active state */
210*4882a593Smuzhiyun #define I_SRESET	(1 << 30)	/* CCCR RES interrupt */
211*4882a593Smuzhiyun #define I_IOE2		(1U << 31)	/* CCCR IOE2 Bit Changed */
212*4882a593Smuzhiyun #define	I_ERRORS	(I_PC | I_PD | I_DE | I_RU | I_RO | I_XU)	/* DMA Errors */
213*4882a593Smuzhiyun #define I_DMA		(I_RI | I_XI | I_ERRORS)
214*4882a593Smuzhiyun 
215*4882a593Smuzhiyun /* sbintstatus */
216*4882a593Smuzhiyun #define I_SB_SERR	(1 << 8)	/* Backplane SError (write) */
217*4882a593Smuzhiyun #define I_SB_RESPERR	(1 << 9)	/* Backplane Response Error (read) */
218*4882a593Smuzhiyun #define I_SB_SPROMERR	(1 << 10)	/* Error accessing the sprom */
219*4882a593Smuzhiyun 
220*4882a593Smuzhiyun /* sdioaccess */
221*4882a593Smuzhiyun #define SDA_DATA_MASK	0x000000ff	/* Read/Write Data Mask */
222*4882a593Smuzhiyun #define SDA_ADDR_MASK	0x000fff00	/* Read/Write Address Mask */
223*4882a593Smuzhiyun #define SDA_ADDR_SHIFT	8		/* Read/Write Address Shift */
224*4882a593Smuzhiyun #define SDA_WRITE	0x01000000	/* Write bit  */
225*4882a593Smuzhiyun #define SDA_READ	0x00000000	/* Write bit cleared for Read */
226*4882a593Smuzhiyun #define SDA_BUSY	0x80000000	/* Busy bit */
227*4882a593Smuzhiyun 
228*4882a593Smuzhiyun /* sdioaccess-accessible register address spaces */
229*4882a593Smuzhiyun #define SDA_CCCR_SPACE		0x000	/* sdioAccess CCCR register space */
230*4882a593Smuzhiyun #define SDA_F1_FBR_SPACE	0x100	/* sdioAccess F1 FBR register space */
231*4882a593Smuzhiyun #define SDA_F2_FBR_SPACE	0x200	/* sdioAccess F2 FBR register space */
232*4882a593Smuzhiyun #define SDA_F1_REG_SPACE	0x300	/* sdioAccess F1 core-specific register space */
233*4882a593Smuzhiyun #define SDA_F3_FBR_SPACE	0x400	/* sdioAccess F3 FBR register space */
234*4882a593Smuzhiyun 
235*4882a593Smuzhiyun /* SDA_F1_REG_SPACE sdioaccess-accessible F1 reg space register offsets */
236*4882a593Smuzhiyun #define SDA_CHIPCONTROLDATA	0x006	/* ChipControlData */
237*4882a593Smuzhiyun #define SDA_CHIPCONTROLENAB	0x007	/* ChipControlEnable */
238*4882a593Smuzhiyun #define SDA_F2WATERMARK		0x008	/* Function 2 Watermark */
239*4882a593Smuzhiyun #define SDA_DEVICECONTROL	0x009	/* DeviceControl */
240*4882a593Smuzhiyun #define SDA_SBADDRLOW		0x00a	/* SbAddrLow */
241*4882a593Smuzhiyun #define SDA_SBADDRMID		0x00b	/* SbAddrMid */
242*4882a593Smuzhiyun #define SDA_SBADDRHIGH		0x00c	/* SbAddrHigh */
243*4882a593Smuzhiyun #define SDA_FRAMECTRL		0x00d	/* FrameCtrl */
244*4882a593Smuzhiyun #define SDA_CHIPCLOCKCSR	0x00e	/* ChipClockCSR */
245*4882a593Smuzhiyun #define SDA_SDIOPULLUP		0x00f	/* SdioPullUp */
246*4882a593Smuzhiyun #define SDA_SDIOWRFRAMEBCLOW	0x019	/* SdioWrFrameBCLow */
247*4882a593Smuzhiyun #define SDA_SDIOWRFRAMEBCHIGH	0x01a	/* SdioWrFrameBCHigh */
248*4882a593Smuzhiyun #define SDA_SDIORDFRAMEBCLOW	0x01b	/* SdioRdFrameBCLow */
249*4882a593Smuzhiyun #define SDA_SDIORDFRAMEBCHIGH	0x01c	/* SdioRdFrameBCHigh */
250*4882a593Smuzhiyun #define SDA_MESBUSYCNTRL	0x01d	/* mesBusyCntrl */
251*4882a593Smuzhiyun #define SDA_WAKEUPCTRL		0x01e	/* WakeupCtrl */
252*4882a593Smuzhiyun #define SDA_SLEEPCSR		0x01f	/* sleepCSR */
253*4882a593Smuzhiyun 
254*4882a593Smuzhiyun /* SDA_F1_REG_SPACE register bits */
255*4882a593Smuzhiyun /* sleepCSR register */
256*4882a593Smuzhiyun #define SDA_SLEEPCSR_KEEP_SDIO_ON	0x1
257*4882a593Smuzhiyun 
258*4882a593Smuzhiyun /* SDA_F2WATERMARK */
259*4882a593Smuzhiyun #define SDA_F2WATERMARK_MASK	0x7f	/* F2Watermark Mask */
260*4882a593Smuzhiyun 
261*4882a593Smuzhiyun /* SDA_SBADDRLOW */
262*4882a593Smuzhiyun #define SDA_SBADDRLOW_MASK	0x80	/* SbAddrLow Mask */
263*4882a593Smuzhiyun 
264*4882a593Smuzhiyun /* SDA_SBADDRMID */
265*4882a593Smuzhiyun #define SDA_SBADDRMID_MASK	0xff	/* SbAddrMid Mask */
266*4882a593Smuzhiyun 
267*4882a593Smuzhiyun /* SDA_SBADDRHIGH */
268*4882a593Smuzhiyun #define SDA_SBADDRHIGH_MASK	0xff	/* SbAddrHigh Mask */
269*4882a593Smuzhiyun 
270*4882a593Smuzhiyun /* SDA_FRAMECTRL */
271*4882a593Smuzhiyun #define SFC_RF_TERM	(1 << 0)	/* Read Frame Terminate */
272*4882a593Smuzhiyun #define SFC_WF_TERM	(1 << 1)	/* Write Frame Terminate */
273*4882a593Smuzhiyun #define SFC_CRC4WOOS	(1 << 2)	/* HW reports CRC error for write out of sync */
274*4882a593Smuzhiyun #define SFC_ABORTALL	(1 << 3)	/* Abort cancels all in-progress frames */
275*4882a593Smuzhiyun 
276*4882a593Smuzhiyun /* pcmciaframectrl */
277*4882a593Smuzhiyun #define PFC_RF_TERM	(1 << 0)	/* Read Frame Terminate */
278*4882a593Smuzhiyun #define PFC_WF_TERM	(1 << 1)	/* Write Frame Terminate */
279*4882a593Smuzhiyun 
280*4882a593Smuzhiyun /* intrcvlazy */
281*4882a593Smuzhiyun #define	IRL_TO_MASK	0x00ffffff	/* timeout */
282*4882a593Smuzhiyun #define	IRL_FC_MASK	0xff000000	/* frame count */
283*4882a593Smuzhiyun #define	IRL_FC_SHIFT	24		/* frame count */
284*4882a593Smuzhiyun 
285*4882a593Smuzhiyun /* rx header */
286*4882a593Smuzhiyun typedef volatile struct {
287*4882a593Smuzhiyun 	uint16 len;
288*4882a593Smuzhiyun 	uint16 flags;
289*4882a593Smuzhiyun } sdpcmd_rxh_t;
290*4882a593Smuzhiyun 
291*4882a593Smuzhiyun /* rx header flags */
292*4882a593Smuzhiyun #define RXF_CRC		0x0001		/* CRC error detected */
293*4882a593Smuzhiyun #define RXF_WOOS	0x0002		/* write frame out of sync */
294*4882a593Smuzhiyun #define RXF_WF_TERM	0x0004		/* write frame terminated */
295*4882a593Smuzhiyun #define RXF_ABORT	0x0008		/* write frame aborted */
296*4882a593Smuzhiyun #define RXF_DISCARD	(RXF_CRC | RXF_WOOS | RXF_WF_TERM | RXF_ABORT)	/* bad frame */
297*4882a593Smuzhiyun 
298*4882a593Smuzhiyun /* HW frame tag */
299*4882a593Smuzhiyun #define SDPCM_FRAMETAG_LEN	4	/* HW frametag: 2 bytes len, 2 bytes check val */
300*4882a593Smuzhiyun 
301*4882a593Smuzhiyun #if !defined(NDISVER) || (NDISVER < 0x0630)
302*4882a593Smuzhiyun #define SDPCM_HWEXT_LEN	8
303*4882a593Smuzhiyun #else
304*4882a593Smuzhiyun #define SDPCM_HWEXT_LEN	0
305*4882a593Smuzhiyun #endif /* !defined(NDISVER) || (NDISVER < 0x0630) */
306*4882a593Smuzhiyun 
307*4882a593Smuzhiyun #endif	/* _sbsdpcmdev_h_ */
308