if_bwfm_sdio.h revision 1.1 1 1.1 mlelstv /* $OpenBSD: if_bwfm_sdio.h,v 1.2 2018/05/19 10:43:10 patrick Exp $ */
2 1.1 mlelstv /*
3 1.1 mlelstv * Copyright (c) 2010-2016 Broadcom Corporation
4 1.1 mlelstv * Copyright (c) 2018 Patrick Wildt <patrick (at) blueri.se>
5 1.1 mlelstv *
6 1.1 mlelstv * Permission to use, copy, modify, and/or distribute this software for any
7 1.1 mlelstv * purpose with or without fee is hereby granted, provided that the above
8 1.1 mlelstv * copyright notice and this permission notice appear in all copies.
9 1.1 mlelstv *
10 1.1 mlelstv * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11 1.1 mlelstv * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12 1.1 mlelstv * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13 1.1 mlelstv * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14 1.1 mlelstv * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
15 1.1 mlelstv * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
16 1.1 mlelstv * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17 1.1 mlelstv */
18 1.1 mlelstv
19 1.1 mlelstv /* Registers */
20 1.1 mlelstv #define BWFM_SDIO_CCCR_CARDCAP 0xf0
21 1.1 mlelstv #define BWFM_SDIO_CCCR_CARDCAP_CMD14_SUPPORT (1 << 1)
22 1.1 mlelstv #define BWFM_SDIO_CCCR_CARDCAP_CMD14_EXT (1 << 2)
23 1.1 mlelstv #define BWFM_SDIO_CCCR_CARDCAP_CMD_NODEC (1 << 3)
24 1.1 mlelstv #define BWFM_SDIO_CCCR_CARDCTRL 0xf1
25 1.1 mlelstv #define BWFM_SDIO_CCCR_CARDCTRL_WLANRESET (1 << 1)
26 1.1 mlelstv #define BWFM_SDIO_CCCR_SEPINT 0xf2
27 1.1 mlelstv #define BWFM_SDIO_CCCR_SEPINT_MASK 0x01
28 1.1 mlelstv #define BWFM_SDIO_CCCR_SEPINT_OE (1 << 1)
29 1.1 mlelstv #define BWFM_SDIO_CCCR_SEPINT_ACT_HI (1 << 2)
30 1.1 mlelstv
31 1.1 mlelstv #define BWFM_SDIO_WATERMARK 0x10008
32 1.1 mlelstv #define BWFM_SDIO_DEVICE_CTL 0x10009
33 1.1 mlelstv #define BWFM_SDIO_DEVICE_CTL_SETBUSY 0x01
34 1.1 mlelstv #define BWFM_SDIO_DEVICE_CTL_SPI_INTR_SYNC 0x02
35 1.1 mlelstv #define BWFM_SDIO_DEVICE_CTL_CA_INT_ONLY 0x04
36 1.1 mlelstv #define BWFM_SDIO_DEVICE_CTL_PADS_ISO 0x08
37 1.1 mlelstv #define BWFM_SDIO_DEVICE_CTL_SB_RST_CTL 0x30
38 1.1 mlelstv #define BWFM_SDIO_DEVICE_CTL_RST_CORECTL 0x00
39 1.1 mlelstv #define BWFM_SDIO_DEVICE_CTL_RST_BPRESET 0x10
40 1.1 mlelstv #define BWFM_SDIO_DEVICE_CTL_RST_NOBPRESET 0x20
41 1.1 mlelstv #define BWFM_SDIO_FUNC1_SBADDRLOW 0x1000A
42 1.1 mlelstv #define BWFM_SDIO_FUNC1_SBADDRMID 0x1000B
43 1.1 mlelstv #define BWFM_SDIO_FUNC1_SBADDRHIGH 0x1000C
44 1.1 mlelstv #define BWFM_SDIO_FUNC1_CHIPCLKCSR 0x1000E
45 1.1 mlelstv #define BWFM_SDIO_FUNC1_CHIPCLKCSR_FORCE_ALP 0x01
46 1.1 mlelstv #define BWFM_SDIO_FUNC1_CHIPCLKCSR_FORCE_HT 0x02
47 1.1 mlelstv #define BWFM_SDIO_FUNC1_CHIPCLKCSR_FORCE_ILP 0x04
48 1.1 mlelstv #define BWFM_SDIO_FUNC1_CHIPCLKCSR_ALP_AVAIL_REQ 0x08
49 1.1 mlelstv #define BWFM_SDIO_FUNC1_CHIPCLKCSR_HT_AVAIL_REQ 0x10
50 1.1 mlelstv #define BWFM_SDIO_FUNC1_CHIPCLKCSR_FORCE_HW_CLKREQ_OFF 0x20
51 1.1 mlelstv #define BWFM_SDIO_FUNC1_CHIPCLKCSR_ALP_AVAIL 0x40
52 1.1 mlelstv #define BWFM_SDIO_FUNC1_CHIPCLKCSR_HT_AVAIL 0x80
53 1.1 mlelstv #define BWFM_SDIO_FUNC1_CHIPCLKCSR_CSR_MASK 0x1F
54 1.1 mlelstv #define BWFM_SDIO_FUNC1_CHIPCLKCSR_AVBITS \
55 1.1 mlelstv (BWFM_SDIO_FUNC1_CHIPCLKCSR_HT_AVAIL | \
56 1.1 mlelstv BWFM_SDIO_FUNC1_CHIPCLKCSR_ALP_AVAIL)
57 1.1 mlelstv #define BWFM_SDIO_FUNC1_CHIPCLKCSR_ALPAV(regval) \
58 1.1 mlelstv ((regval) & BWFM_SDIO_FUNC1_CHIPCLKCSR_AVBITS)
59 1.1 mlelstv #define BWFM_SDIO_FUNC1_CHIPCLKCSR_HTAV(regval) \
60 1.1 mlelstv (((regval) & BWFM_SDIO_FUNC1_CHIPCLKCSR_AVBITS) == BWFM_SDIO_FUNC1_CHIPCLKCSR_AVBITS)
61 1.1 mlelstv #define BWFM_SDIO_FUNC1_CHIPCLKCSR_ALPONLY(regval) \
62 1.1 mlelstv (BWFM_SDIO_FUNC1_CHIPCLKCSR_ALPAV(regval) && \
63 1.1 mlelstv !BWFM_SDIO_FUNC1_CHIPCLKCSR_HTAV(regval))
64 1.1 mlelstv #define BWFM_SDIO_FUNC1_CHIPCLKCSR_CLKAV(regval, alponly) \
65 1.1 mlelstv (BWFM_SDIO_FUNC1_CHIPCLKCSR_ALPAV(regval) && \
66 1.1 mlelstv (alponly ? 1 : BWFM_SDIO_FUNC1_CHIPCLKCSR_HTAV(regval)))
67 1.1 mlelstv #define BWFM_SDIO_FUNC1_SDIOPULLUP 0x1000F
68 1.1 mlelstv #define BWFM_SDIO_FUNC1_WAKEUPCTRL 0x1001E
69 1.1 mlelstv #define BWFM_SDIO_FUNC1_WAKEUPCTRL_HTWAIT (1 << 1)
70 1.1 mlelstv #define BWFM_SDIO_FUNC1_SLEEPCSR 0x1001F
71 1.1 mlelstv #define BWFM_SDIO_FUNC1_SLEEPCSR_KSO (1 << 0)
72 1.1 mlelstv #define BWFM_SDIO_FUNC1_SLEEPCSR_DEVON (1 << 2)
73 1.1 mlelstv
74 1.1 mlelstv #define BWFM_SDIO_SB_OFT_ADDR_PAGE 0x08000
75 1.1 mlelstv #define BWFM_SDIO_SB_OFT_ADDR_MASK 0x07FFF
76 1.1 mlelstv #define BWFM_SDIO_SB_ACCESS_2_4B_FLAG 0x08000
77 1.1 mlelstv
78 1.1 mlelstv /* Protocol defines */
79 1.1 mlelstv #define SDPCM_PROT_VERSION 4
80 1.1 mlelstv #define SDPCM_PROT_VERSION_SHIFT 16
81 1.1 mlelstv #define SDPCM_PROT_VERSION_MASK 0x00ff0000
82 1.1 mlelstv #define SDPCM_SHARED_VERSION 0x0003
83 1.1 mlelstv #define SDPCM_SHARED_VERSION_MASK 0x00FF
84 1.1 mlelstv #define SDPCM_SHARED_ASSERT_BUILT 0x0100
85 1.1 mlelstv #define SDPCM_SHARED_ASSERT 0x0200
86 1.1 mlelstv #define SDPCM_SHARED_TRAP 0x0400
87 1.1 mlelstv
88 1.1 mlelstv #define SDPCMD_INTSTATUS 0x020
89 1.1 mlelstv #define SDPCMD_INTSTATUS_SMB_SW0 (1 << 0) /* To SB Mail S/W interrupt 0 */
90 1.1 mlelstv #define SDPCMD_INTSTATUS_SMB_SW1 (1 << 1) /* To SB Mail S/W interrupt 1 */
91 1.1 mlelstv #define SDPCMD_INTSTATUS_SMB_SW2 (1 << 2) /* To SB Mail S/W interrupt 2 */
92 1.1 mlelstv #define SDPCMD_INTSTATUS_SMB_SW3 (1 << 3) /* To SB Mail S/W interrupt 3 */
93 1.1 mlelstv #define SDPCMD_INTSTATUS_SMB_SW_MASK 0x0000000f /* To SB Mail S/W interrupts mask */
94 1.1 mlelstv #define SDPCMD_INTSTATUS_SMB_SW_SHIFT 0 /* To SB Mail S/W interrupts shift */
95 1.1 mlelstv #define SDPCMD_INTSTATUS_HMB_SW0 (1 << 4) /* To Host Mail S/W interrupt 0 */
96 1.1 mlelstv #define SDPCMD_INTSTATUS_HMB_SW1 (1 << 5) /* To Host Mail S/W interrupt 1 */
97 1.1 mlelstv #define SDPCMD_INTSTATUS_HMB_SW2 (1 << 6) /* To Host Mail S/W interrupt 2 */
98 1.1 mlelstv #define SDPCMD_INTSTATUS_HMB_SW3 (1 << 7) /* To Host Mail S/W interrupt 3 */
99 1.1 mlelstv #define SDPCMD_INTSTATUS_HMB_FC_STATE SDPCMD_INTSTATUS_HMB_SW0
100 1.1 mlelstv #define SDPCMD_INTSTATUS_HMB_FC_CHANGE SDPCMD_INTSTATUS_HMB_SW1
101 1.1 mlelstv #define SDPCMD_INTSTATUS_HMB_FRAME_IND SDPCMD_INTSTATUS_HMB_SW2
102 1.1 mlelstv #define SDPCMD_INTSTATUS_HMB_HOST_INT SDPCMD_INTSTATUS_HMB_SW3
103 1.1 mlelstv #define SDPCMD_INTSTATUS_HMB_SW_MASK 0x000000f0 /* To Host Mail S/W interrupts mask */
104 1.1 mlelstv #define SDPCMD_INTSTATUS_HMB_SW_SHIFT 4 /* To Host Mail S/W interrupts shift */
105 1.1 mlelstv #define SDPCMD_INTSTATUS_WR_OOSYNC (1 << 8) /* Write Frame Out Of Sync */
106 1.1 mlelstv #define SDPCMD_INTSTATUS_RD_OOSYNC (1 << 9) /* Read Frame Out Of Sync */
107 1.1 mlelstv #define SDPCMD_INTSTATUS_PC (1 << 10)/* descriptor error */
108 1.1 mlelstv #define SDPCMD_INTSTATUS_PD (1 << 11)/* data error */
109 1.1 mlelstv #define SDPCMD_INTSTATUS_DE (1 << 12)/* Descriptor protocol Error */
110 1.1 mlelstv #define SDPCMD_INTSTATUS_RU (1 << 13)/* Receive descriptor Underflow */
111 1.1 mlelstv #define SDPCMD_INTSTATUS_RO (1 << 14)/* Receive fifo Overflow */
112 1.1 mlelstv #define SDPCMD_INTSTATUS_XU (1 << 15)/* Transmit fifo Underflow */
113 1.1 mlelstv #define SDPCMD_INTSTATUS_RI (1 << 16)/* Receive Interrupt */
114 1.1 mlelstv #define SDPCMD_INTSTATUS_BUSPWR (1 << 17)/* SDIO Bus Power Change (rev 9) */
115 1.1 mlelstv #define SDPCMD_INTSTATUS_XMTDATA_AVAIL (1 << 23)/* bits in fifo */
116 1.1 mlelstv #define SDPCMD_INTSTATUS_XI (1 << 24)/* Transmit Interrupt */
117 1.1 mlelstv #define SDPCMD_INTSTATUS_RF_TERM (1 << 25)/* Read Frame Terminate */
118 1.1 mlelstv #define SDPCMD_INTSTATUS_WF_TERM (1 << 26)/* Write Frame Terminate */
119 1.1 mlelstv #define SDPCMD_INTSTATUS_PCMCIA_XU (1 << 27)/* PCMCIA Transmit FIFO Underflow */
120 1.1 mlelstv #define SDPCMD_INTSTATUS_SBINT (1 << 28)/* sbintstatus Interrupt */
121 1.1 mlelstv #define SDPCMD_INTSTATUS_CHIPACTIVE (1 << 29)/* chip from doze to active state */
122 1.1 mlelstv #define SDPCMD_INTSTATUS_SRESET (1 << 30)/* CCCR RES interrupt */
123 1.1 mlelstv #define SDPCMD_INTSTATUS_IOE2 (1U << 31)/* CCCR IOE2 Bit Changed */
124 1.1 mlelstv #define SDPCMD_INTSTATUS_ERRORS (SDPCMD_INTSTATUS_PC | \
125 1.1 mlelstv SDPCMD_INTSTATUS_PD | \
126 1.1 mlelstv SDPCMD_INTSTATUS_DE | \
127 1.1 mlelstv SDPCMD_INTSTATUS_RU | \
128 1.1 mlelstv SDPCMD_INTSTATUS_RO | \
129 1.1 mlelstv SDPCMD_INTSTATUS_XU)
130 1.1 mlelstv #define SDPCMD_INTSTATUS_DMA (SDPCMD_INTSTATUS_RI | \
131 1.1 mlelstv SDPCMD_INTSTATUS_XI | \
132 1.1 mlelstv SDPCMD_INTSTATUS_ERRORS)
133 1.1 mlelstv #define SDPCMD_HOSTINTMASK 0x024
134 1.1 mlelstv #define SDPCMD_INTMASK 0x028
135 1.1 mlelstv #define SDPCMD_SBINTSTATUS 0x02c
136 1.1 mlelstv #define SDPCMD_SBINTMASK 0x030
137 1.1 mlelstv #define SDPCMD_FUNCTINTMASK 0x034
138 1.1 mlelstv #define SDPCMD_TOSBMAILBOX 0x040
139 1.1 mlelstv #define SDPCMD_TOSBMAILBOX_NAK (1 << 0)
140 1.1 mlelstv #define SDPCMD_TOSBMAILBOX_INT_ACK (1 << 1)
141 1.1 mlelstv #define SDPCMD_TOSBMAILBOX_USE_OOB (1 << 2)
142 1.1 mlelstv #define SDPCMD_TOSBMAILBOX_DEV_INT (1 << 3)
143 1.1 mlelstv #define SDPCMD_TOHOSTMAILBOX 0x044
144 1.1 mlelstv #define SDPCMD_TOSBMAILBOXDATA 0x048
145 1.1 mlelstv #define SDPCMD_TOHOSTMAILBOXDATA 0x04C
146 1.1 mlelstv #define SDPCMD_TOHOSTMAILBOXDATA_NAKHANDLED (1 << 0)
147 1.1 mlelstv #define SDPCMD_TOHOSTMAILBOXDATA_DEVREADY (1 << 1)
148 1.1 mlelstv #define SDPCMD_TOHOSTMAILBOXDATA_FC (1 << 2)
149 1.1 mlelstv #define SDPCMD_TOHOSTMAILBOXDATA_FWREADY (1 << 3)
150 1.1 mlelstv #define SDPCMD_TOHOSTMAILBOXDATA_FWHALT (1 << 4)
151 1.1 mlelstv
152 1.1 mlelstv struct bwfm_sdio_hwhdr {
153 1.1 mlelstv uint16_t frmlen;
154 1.1 mlelstv uint16_t cksum;
155 1.1 mlelstv };
156 1.1 mlelstv
157 1.1 mlelstv struct bwfm_sdio_hwexthdr {
158 1.1 mlelstv uint16_t pktlen;
159 1.1 mlelstv uint8_t res0;
160 1.1 mlelstv uint8_t flags;
161 1.1 mlelstv uint16_t res1;
162 1.1 mlelstv uint16_t padlen;
163 1.1 mlelstv };
164 1.1 mlelstv
165 1.1 mlelstv struct bwfm_sdio_swhdr {
166 1.1 mlelstv uint8_t seqnr;
167 1.1 mlelstv uint8_t chanflag; /* channel + flag */
168 1.1 mlelstv #define BWFM_SDIO_SWHDR_CHANNEL_CONTROL 0x00
169 1.1 mlelstv #define BWFM_SDIO_SWHDR_CHANNEL_EVENT 0x01
170 1.1 mlelstv #define BWFM_SDIO_SWHDR_CHANNEL_DATA 0x02
171 1.1 mlelstv #define BWFM_SDIO_SWHDR_CHANNEL_GLOM 0x03
172 1.1 mlelstv #define BWFM_SDIO_SWHDR_CHANNEL_TEST 0x0F
173 1.1 mlelstv #define BWFM_SDIO_SWHDR_CHANNEL_MASK 0x0F
174 1.1 mlelstv uint8_t nextlen;
175 1.1 mlelstv uint8_t dataoff;
176 1.1 mlelstv uint8_t flowctl;
177 1.1 mlelstv uint8_t maxseqnr;
178 1.1 mlelstv uint16_t res0;
179 1.1 mlelstv };
180 1.1 mlelstv
181 1.1 mlelstv struct bwfm_sdio_sdpcm {
182 1.1 mlelstv uint32_t flags;
183 1.1 mlelstv uint32_t trap_addr;
184 1.1 mlelstv uint32_t assert_exp_addr;
185 1.1 mlelstv uint32_t assert_file_addr;
186 1.1 mlelstv uint32_t assert_line;
187 1.1 mlelstv uint32_t console_addr;
188 1.1 mlelstv uint32_t msgtrace_addr;
189 1.1 mlelstv uint8_t tag[32];
190 1.1 mlelstv uint32_t brpt_addr;
191 1.1 mlelstv };
192 1.1 mlelstv
193 1.1 mlelstv struct bwfm_sdio_console {
194 1.1 mlelstv uint32_t vcons_in;
195 1.1 mlelstv uint32_t vcons_out;
196 1.1 mlelstv uint32_t log_buf;
197 1.1 mlelstv uint32_t log_bufsz;
198 1.1 mlelstv uint32_t log_idx;
199 1.1 mlelstv };
200