1 /******************************************************************************
2 *
3 * Copyright(c) 2007 - 2017 Realtek Corporation.
4 *
5 * This program is free software; you can redistribute it and/or modify it
6 * under the terms of version 2 of the GNU General Public License as
7 * published by the Free Software Foundation.
8 *
9 * This program is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12 * more details.
13 *
14 *****************************************************************************/
15 #ifndef __SDIO_OPS_H__
16 #define __SDIO_OPS_H__
17
18
19 /* Follow mac team suggestion, default I/O fail return value is 0xFF */
20 #define SDIO_ERR_VAL8 0xFF
21 #define SDIO_ERR_VAL16 0xFFFF
22 #define SDIO_ERR_VAL32 0xFFFFFFFF
23
24 #ifdef PLATFORM_LINUX
25 #include <sdio_ops_linux.h>
26 #endif
27
28 extern void sdio_set_intf_ops(_adapter *padapter, struct _io_ops *pops);
29 void dump_sdio_card_info(void *sel, struct dvobj_priv *dvobj);
30
31 u32 sdio_init(struct dvobj_priv *dvobj);
32 void sdio_deinit(struct dvobj_priv *dvobj);
33 int sdio_alloc_irq(struct dvobj_priv *dvobj);
34 void sdio_free_irq(struct dvobj_priv *dvobj);
35 u8 sdio_get_num_of_func(struct dvobj_priv *dvobj);
36
37 #if 0
38 extern void sdio_func1cmd52_read(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, u8 *rmem);
39 extern void sdio_func1cmd52_write(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, u8 *wmem);
40 #endif
41 extern u8 SdioLocalCmd52Read1Byte(PADAPTER padapter, u32 addr);
42 extern void SdioLocalCmd52Write1Byte(PADAPTER padapter, u32 addr, u8 v);
43 extern s32 _sdio_local_read(PADAPTER padapter, u32 addr, u32 cnt, u8 *pbuf);
44 extern s32 sdio_local_read(PADAPTER padapter, u32 addr, u32 cnt, u8 *pbuf);
45 extern s32 _sdio_local_write(PADAPTER padapter, u32 addr, u32 cnt, u8 *pbuf);
46 extern s32 sdio_local_write(PADAPTER padapter, u32 addr, u32 cnt, u8 *pbuf);
47
48 u32 _sdio_read32(PADAPTER padapter, u32 addr);
49 s32 _sdio_write32(PADAPTER padapter, u32 addr, u32 val);
50
51 extern void sd_int_hdl(PADAPTER padapter);
52 extern u8 CheckIPSStatus(PADAPTER padapter);
53
54 #ifdef CONFIG_RTL8188E
55 extern void InitInterrupt8188ESdio(PADAPTER padapter);
56 extern void EnableInterrupt8188ESdio(PADAPTER padapter);
57 extern void DisableInterrupt8188ESdio(PADAPTER padapter);
58 extern void UpdateInterruptMask8188ESdio(PADAPTER padapter, u32 AddMSR, u32 RemoveMSR);
59 extern u8 HalQueryTxBufferStatus8189ESdio(PADAPTER padapter);
60 extern u8 HalQueryTxOQTBufferStatus8189ESdio(PADAPTER padapter);
61 extern void ClearInterrupt8188ESdio(PADAPTER padapter);
62 #endif /* CONFIG_RTL8188E */
63
64 #ifdef CONFIG_RTL8821A
65 extern void InitInterrupt8821AS(PADAPTER padapter);
66 extern void EnableInterrupt8821AS(PADAPTER padapter);
67 extern void DisableInterrupt8821AS(PADAPTER padapter);
68 extern u8 HalQueryTxBufferStatus8821AS(PADAPTER padapter);
69 extern u8 HalQueryTxOQTBufferStatus8821ASdio(PADAPTER padapter);
70 #if defined(CONFIG_WOWLAN) || defined(CONFIG_AP_WOWLAN)
71 void ClearInterrupt8821AS(PADAPTER padapter);
72 #endif /* defined(CONFIG_WOWLAN) || defined(CONFIG_AP_WOWLAN) */
73 #endif /* CONFIG_RTL8821A */
74
75 #if defined(CONFIG_WOWLAN) || defined(CONFIG_AP_WOWLAN)
76 #if defined(CONFIG_RTL8821C) || defined(CONFIG_RTL8822B) || defined(CONFIG_RTL8822C) \
77 || defined(CONFIG_RTL8723F)
78 u8 rtw_hal_enable_cpwm2(_adapter *adapter);
79 #endif
80 extern u8 RecvOnePkt(PADAPTER padapter);
81 #endif /* CONFIG_WOWLAN */
82 #ifdef CONFIG_RTL8723B
83 extern void InitInterrupt8723BSdio(PADAPTER padapter);
84 extern void InitSysInterrupt8723BSdio(PADAPTER padapter);
85 extern void EnableInterrupt8723BSdio(PADAPTER padapter);
86 extern void DisableInterrupt8723BSdio(PADAPTER padapter);
87 extern u8 HalQueryTxBufferStatus8723BSdio(PADAPTER padapter);
88 extern u8 HalQueryTxOQTBufferStatus8723BSdio(PADAPTER padapter);
89 #if defined(CONFIG_WOWLAN) || defined(CONFIG_AP_WOWLAN)
90 extern void DisableInterruptButCpwm28723BSdio(PADAPTER padapter);
91 extern void ClearInterrupt8723BSdio(PADAPTER padapter);
92 #endif /* CONFIG_WOWLAN */
93 #endif
94
95
96 #ifdef CONFIG_RTL8192E
97 extern void InitInterrupt8192ESdio(PADAPTER padapter);
98 extern void EnableInterrupt8192ESdio(PADAPTER padapter);
99 extern void DisableInterrupt8192ESdio(PADAPTER padapter);
100 extern void UpdateInterruptMask8192ESdio(PADAPTER padapter, u32 AddMSR, u32 RemoveMSR);
101 extern u8 HalQueryTxBufferStatus8192ESdio(PADAPTER padapter);
102 extern u8 HalQueryTxOQTBufferStatus8192ESdio(PADAPTER padapter);
103 extern void ClearInterrupt8192ESdio(PADAPTER padapter);
104 #endif /* CONFIG_RTL8192E */
105
106 #ifdef CONFIG_RTL8703B
107 extern void InitInterrupt8703BSdio(PADAPTER padapter);
108 extern void InitSysInterrupt8703BSdio(PADAPTER padapter);
109 extern void EnableInterrupt8703BSdio(PADAPTER padapter);
110 extern void DisableInterrupt8703BSdio(PADAPTER padapter);
111 extern u8 HalQueryTxBufferStatus8703BSdio(PADAPTER padapter);
112 extern u8 HalQueryTxOQTBufferStatus8703BSdio(PADAPTER padapter);
113 #if defined(CONFIG_WOWLAN) || defined(CONFIG_AP_WOWLAN)
114 extern void DisableInterruptButCpwm28703BSdio(PADAPTER padapter);
115 extern void ClearInterrupt8703BSdio(PADAPTER padapter);
116 #endif /* CONFIG_WOWLAN */
117 #endif
118
119 #ifdef CONFIG_RTL8723D
120 extern void InitInterrupt8723DSdio(PADAPTER padapter);
121 extern void InitSysInterrupt8723DSdio(PADAPTER padapter);
122 extern void EnableInterrupt8723DSdio(PADAPTER padapter);
123 extern void DisableInterrupt8723DSdio(PADAPTER padapter);
124 extern u8 HalQueryTxBufferStatus8723DSdio(PADAPTER padapter);
125 extern u8 HalQueryTxOQTBufferStatus8723DSdio(PADAPTER padapter);
126 #if defined(CONFIG_WOWLAN) || defined(CONFIG_AP_WOWLAN)
127 extern void DisableInterruptButCpwm28723dSdio(PADAPTER padapter);
128 extern void ClearInterrupt8723DSdio(PADAPTER padapter);
129 #endif /* CONFIG_WOWLAN */
130 #endif
131
132 #ifdef CONFIG_RTL8192F
133 extern void InitInterrupt8192FSdio(PADAPTER padapter);
134 extern void InitSysInterrupt8192FSdio(PADAPTER padapter);
135 extern void EnableInterrupt8192FSdio(PADAPTER padapter);
136 extern void DisableInterrupt8192FSdio(PADAPTER padapter);
137 extern void UpdateInterruptMask8192FSdio(PADAPTER padapter, u32 AddMSR, u32 RemoveMSR);
138 extern u8 HalQueryTxBufferStatus8192FSdio(PADAPTER padapter);
139 extern u8 HalQueryTxOQTBufferStatus8192FSdio(PADAPTER padapter);
140 #if defined(CONFIG_WOWLAN) || defined(CONFIG_AP_WOWLAN)
141 extern void DisableInterruptButCpwm2192fSdio(PADAPTER padapter);
142 extern void ClearInterrupt8192FSdio(PADAPTER padapter);
143 #endif /* CONFIG_WOWLAN */
144 #endif
145
146 #ifdef CONFIG_RTL8188F
147 extern void InitInterrupt8188FSdio(PADAPTER padapter);
148 extern void InitSysInterrupt8188FSdio(PADAPTER padapter);
149 extern void EnableInterrupt8188FSdio(PADAPTER padapter);
150 extern void DisableInterrupt8188FSdio(PADAPTER padapter);
151 extern u8 HalQueryTxBufferStatus8188FSdio(PADAPTER padapter);
152 extern u8 HalQueryTxOQTBufferStatus8188FSdio(PADAPTER padapter);
153 #if defined(CONFIG_WOWLAN) || defined(CONFIG_AP_WOWLAN)
154 extern void DisableInterruptButCpwm28188FSdio(PADAPTER padapter);
155 extern void ClearInterrupt8188FSdio(PADAPTER padapter);
156 #endif /* defined(CONFIG_WOWLAN) || defined(CONFIG_AP_WOWLAN) */
157 #endif
158
159 #ifdef CONFIG_RTL8188GTV
160 extern void InitInterrupt8188GTVSdio(PADAPTER padapter);
161 extern void InitSysInterrupt8188GTVSdio(PADAPTER padapter);
162 extern void EnableInterrupt8188GTVSdio(PADAPTER padapter);
163 extern void DisableInterrupt8188GTVSdio(PADAPTER padapter);
164 extern u8 HalQueryTxBufferStatus8188GTVSdio(PADAPTER padapter);
165 extern u8 HalQueryTxOQTBufferStatus8188GTVSdio(PADAPTER padapter);
166 #if defined(CONFIG_WOWLAN) || defined(CONFIG_AP_WOWLAN)
167 extern void DisableInterruptButCpwm28188GTVSdio(PADAPTER padapter);
168 extern void ClearInterrupt8188GTVSdio(PADAPTER padapter);
169 #endif /* defined(CONFIG_WOWLAN) || defined(CONFIG_AP_WOWLAN) */
170 #endif
171
172 /**
173 * rtw_sdio_get_block_size() - Get block size of SDIO transfer
174 * @d struct dvobj_priv*
175 *
176 * The unit of return value is byte.
177 */
rtw_sdio_get_block_size(struct dvobj_priv * d)178 static inline u32 rtw_sdio_get_block_size(struct dvobj_priv *d)
179 {
180 return d->intf_data.block_transfer_len;
181 }
182
183 /**
184 * rtw_sdio_cmd53_align_size() - Align size to one CMD53 could complete
185 * @d struct dvobj_priv*
186 * @len length to align
187 *
188 * Adjust len to align block size, and the new size could be transfered by one
189 * CMD53.
190 * If len < block size, it would keep original value, otherwise the value
191 * would be rounded up by block size.
192 *
193 * Return adjusted length.
194 */
rtw_sdio_cmd53_align_size(struct dvobj_priv * d,size_t len)195 static inline size_t rtw_sdio_cmd53_align_size(struct dvobj_priv *d, size_t len)
196 {
197 u32 blk_sz;
198
199
200 blk_sz = rtw_sdio_get_block_size(d);
201 if (len <= blk_sz)
202 return len;
203
204 return _RND(len, blk_sz);
205 }
206
207 #endif /* !__SDIO_OPS_H__ */
208