]> git.proxmox.com Git - mirror_ubuntu-zesty-kernel.git/blob - drivers/net/wireless/realtek/rtl8192cu/include/rtw_io.h
net: Add non-mainline source for rtl8192cu wlan
[mirror_ubuntu-zesty-kernel.git] / drivers / net / wireless / realtek / rtl8192cu / include / rtw_io.h
1 /******************************************************************************
2 *
3 * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
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 * You should have received a copy of the GNU General Public License along with
15 * this program; if not, write to the Free Software Foundation, Inc.,
16 * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
17 *
18 *
19 ******************************************************************************/
20
21 #ifndef _RTW_IO_H_
22 #define _RTW_IO_H_
23
24 #include <drv_conf.h>
25 #include <osdep_service.h>
26 #include <osdep_intf.h>
27
28 #ifdef PLATFORM_LINUX
29 #include <asm/byteorder.h>
30 #if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,26))
31 #include <asm/semaphore.h>
32 #else
33 #include <linux/semaphore.h>
34 #endif
35 #include <linux/list.h>
36 //#include <linux/smp_lock.h>
37 #include <linux/spinlock.h>
38 #include <asm/atomic.h>
39
40 #ifdef CONFIG_USB_HCI
41 #include <linux/usb.h>
42 #if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,21))
43 #include <linux/usb_ch9.h>
44 #else
45 #include <linux/usb/ch9.h>
46 #endif
47 #endif //CONFIG_USB_HCI
48
49 #endif //PLATFORM_LINUX
50
51
52 #define NUM_IOREQ 8
53
54 #ifdef PLATFORM_WINDOWS
55 #define MAX_PROT_SZ 64
56 #endif
57 #ifdef PLATFORM_LINUX
58 #define MAX_PROT_SZ (64-16)
59 #endif
60
61 #define _IOREADY 0
62 #define _IO_WAIT_COMPLETE 1
63 #define _IO_WAIT_RSP 2
64
65 // IO COMMAND TYPE
66 #define _IOSZ_MASK_ (0x7F)
67 #define _IO_WRITE_ BIT(7)
68 #define _IO_FIXED_ BIT(8)
69 #define _IO_BURST_ BIT(9)
70 #define _IO_BYTE_ BIT(10)
71 #define _IO_HW_ BIT(11)
72 #define _IO_WORD_ BIT(12)
73 #define _IO_SYNC_ BIT(13)
74 #define _IO_CMDMASK_ (0x1F80)
75
76
77 /*
78 For prompt mode accessing, caller shall free io_req
79 Otherwise, io_handler will free io_req
80 */
81
82
83
84 // IO STATUS TYPE
85 #define _IO_ERR_ BIT(2)
86 #define _IO_SUCCESS_ BIT(1)
87 #define _IO_DONE_ BIT(0)
88
89
90 #define IO_RD32 (_IO_SYNC_ | _IO_WORD_)
91 #define IO_RD16 (_IO_SYNC_ | _IO_HW_)
92 #define IO_RD8 (_IO_SYNC_ | _IO_BYTE_)
93
94 #define IO_RD32_ASYNC (_IO_WORD_)
95 #define IO_RD16_ASYNC (_IO_HW_)
96 #define IO_RD8_ASYNC (_IO_BYTE_)
97
98 #define IO_WR32 (_IO_WRITE_ | _IO_SYNC_ | _IO_WORD_)
99 #define IO_WR16 (_IO_WRITE_ | _IO_SYNC_ | _IO_HW_)
100 #define IO_WR8 (_IO_WRITE_ | _IO_SYNC_ | _IO_BYTE_)
101
102 #define IO_WR32_ASYNC (_IO_WRITE_ | _IO_WORD_)
103 #define IO_WR16_ASYNC (_IO_WRITE_ | _IO_HW_)
104 #define IO_WR8_ASYNC (_IO_WRITE_ | _IO_BYTE_)
105
106 /*
107
108 Only Sync. burst accessing is provided.
109
110 */
111
112 #define IO_WR_BURST(x) (_IO_WRITE_ | _IO_SYNC_ | _IO_BURST_ | ( (x) & _IOSZ_MASK_))
113 #define IO_RD_BURST(x) (_IO_SYNC_ | _IO_BURST_ | ( (x) & _IOSZ_MASK_))
114
115
116
117 //below is for the intf_option bit defition...
118
119 #define _INTF_ASYNC_ BIT(0) //support async io
120
121 struct intf_priv;
122 struct intf_hdl;
123 struct io_queue;
124
125 struct _io_ops
126 {
127 u8 (*_read8)(struct intf_hdl *pintfhdl, u32 addr);
128 u16 (*_read16)(struct intf_hdl *pintfhdl, u32 addr);
129 u32 (*_read32)(struct intf_hdl *pintfhdl, u32 addr);
130
131 int (*_write8)(struct intf_hdl *pintfhdl, u32 addr, u8 val);
132 int (*_write16)(struct intf_hdl *pintfhdl, u32 addr, u16 val);
133 int (*_write32)(struct intf_hdl *pintfhdl, u32 addr, u32 val);
134 int (*_writeN)(struct intf_hdl *pintfhdl, u32 addr, u32 length, u8 *pdata);
135
136 int (*_write8_async)(struct intf_hdl *pintfhdl, u32 addr, u8 val);
137 int (*_write16_async)(struct intf_hdl *pintfhdl, u32 addr, u16 val);
138 int (*_write32_async)(struct intf_hdl *pintfhdl, u32 addr, u32 val);
139
140 void (*_read_mem)(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, u8 *pmem);
141 void (*_write_mem)(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, u8 *pmem);
142
143 void (*_sync_irp_protocol_rw)(struct io_queue *pio_q);
144
145 u32 (*_read_interrupt)(struct intf_hdl *pintfhdl, u32 addr);
146
147 u32 (*_read_port)(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, u8 *pmem);
148 u32 (*_write_port)(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, u8 *pmem);
149
150 u32 (*_write_scsi)(struct intf_hdl *pintfhdl,u32 cnt, u8 *pmem);
151
152 void (*_read_port_cancel)(struct intf_hdl *pintfhdl);
153 void (*_write_port_cancel)(struct intf_hdl *pintfhdl);
154
155 };
156
157 struct io_req {
158 _list list;
159 u32 addr;
160 volatile u32 val;
161 u32 command;
162 u32 status;
163 u8 *pbuf;
164 _sema sema;
165
166 #ifdef PLATFORM_OS_CE
167 #ifdef CONFIG_USB_HCI
168 // URB handler for rtw_write_mem
169 USB_TRANSFER usb_transfer_write_mem;
170 #endif
171 #endif
172
173 void (*_async_io_callback)(_adapter *padater, struct io_req *pio_req, u8 *cnxt);
174 u8 *cnxt;
175
176 #ifdef PLATFORM_OS_XP
177 PMDL pmdl;
178 PIRP pirp;
179
180 #ifdef CONFIG_SDIO_HCI
181 PSDBUS_REQUEST_PACKET sdrp;
182 #endif
183
184 #endif
185
186
187 };
188
189 struct intf_hdl {
190
191 /*
192 u32 intf_option;
193 u32 bus_status;
194 u32 do_flush;
195 u8 *adapter;
196 u8 *intf_dev;
197 struct intf_priv *pintfpriv;
198 u8 cnt;
199 void (*intf_hdl_init)(u8 *priv);
200 void (*intf_hdl_unload)(u8 *priv);
201 void (*intf_hdl_open)(u8 *priv);
202 void (*intf_hdl_close)(u8 *priv);
203 struct _io_ops io_ops;
204 //u8 intf_status;//moved to struct intf_priv
205 u16 len;
206 u16 done_len;
207 */
208 _adapter *padapter;
209 struct dvobj_priv *pintf_dev;// pointer to &(padapter->dvobjpriv);
210
211 struct _io_ops io_ops;
212
213 };
214
215 struct reg_protocol_rd {
216
217 #ifdef CONFIG_LITTLE_ENDIAN
218
219 //DW1
220 u32 NumOfTrans:4;
221 u32 Reserved1:4;
222 u32 Reserved2:24;
223 //DW2
224 u32 ByteCount:7;
225 u32 WriteEnable:1; //0:read, 1:write
226 u32 FixOrContinuous:1; //0:continuous, 1: Fix
227 u32 BurstMode:1;
228 u32 Byte1Access:1;
229 u32 Byte2Access:1;
230 u32 Byte4Access:1;
231 u32 Reserved3:3;
232 u32 Reserved4:16;
233 //DW3
234 u32 BusAddress;
235 //DW4
236 //u32 Value;
237 #else
238
239
240 //DW1
241 u32 Reserved1 :4;
242 u32 NumOfTrans :4;
243
244 u32 Reserved2 :24;
245
246 //DW2
247 u32 WriteEnable : 1;
248 u32 ByteCount :7;
249
250
251 u32 Reserved3 : 3;
252 u32 Byte4Access : 1;
253
254 u32 Byte2Access : 1;
255 u32 Byte1Access : 1;
256 u32 BurstMode :1 ;
257 u32 FixOrContinuous : 1;
258
259 u32 Reserved4 : 16;
260
261 //DW3
262 u32 BusAddress;
263
264 //DW4
265 //u32 Value;
266
267 #endif
268
269 };
270
271
272 struct reg_protocol_wt {
273
274
275 #ifdef CONFIG_LITTLE_ENDIAN
276
277 //DW1
278 u32 NumOfTrans:4;
279 u32 Reserved1:4;
280 u32 Reserved2:24;
281 //DW2
282 u32 ByteCount:7;
283 u32 WriteEnable:1; //0:read, 1:write
284 u32 FixOrContinuous:1; //0:continuous, 1: Fix
285 u32 BurstMode:1;
286 u32 Byte1Access:1;
287 u32 Byte2Access:1;
288 u32 Byte4Access:1;
289 u32 Reserved3:3;
290 u32 Reserved4:16;
291 //DW3
292 u32 BusAddress;
293 //DW4
294 u32 Value;
295
296 #else
297 //DW1
298 u32 Reserved1 :4;
299 u32 NumOfTrans :4;
300
301 u32 Reserved2 :24;
302
303 //DW2
304 u32 WriteEnable : 1;
305 u32 ByteCount :7;
306
307 u32 Reserved3 : 3;
308 u32 Byte4Access : 1;
309
310 u32 Byte2Access : 1;
311 u32 Byte1Access : 1;
312 u32 BurstMode :1 ;
313 u32 FixOrContinuous : 1;
314
315 u32 Reserved4 : 16;
316
317 //DW3
318 u32 BusAddress;
319
320 //DW4
321 u32 Value;
322
323 #endif
324
325 };
326
327
328
329 /*
330 Below is the data structure used by _io_handler
331
332 */
333
334 struct io_queue {
335 _lock lock;
336 _list free_ioreqs;
337 _list pending; //The io_req list that will be served in the single protocol read/write.
338 _list processing;
339 u8 *free_ioreqs_buf; // 4-byte aligned
340 u8 *pallocated_free_ioreqs_buf;
341 struct intf_hdl intf;
342 };
343
344 struct io_priv{
345
346 _adapter *padapter;
347
348 struct intf_hdl intf;
349
350 };
351
352 extern uint ioreq_flush(_adapter *adapter, struct io_queue *ioqueue);
353 extern void sync_ioreq_enqueue(struct io_req *preq,struct io_queue *ioqueue);
354 extern uint sync_ioreq_flush(_adapter *adapter, struct io_queue *ioqueue);
355
356
357 extern uint free_ioreq(struct io_req *preq, struct io_queue *pio_queue);
358 extern struct io_req *alloc_ioreq(struct io_queue *pio_q);
359
360 extern uint register_intf_hdl(u8 *dev, struct intf_hdl *pintfhdl);
361 extern void unregister_intf_hdl(struct intf_hdl *pintfhdl);
362
363 extern void _rtw_attrib_read(_adapter *adapter, u32 addr, u32 cnt, u8 *pmem);
364 extern void _rtw_attrib_write(_adapter *adapter, u32 addr, u32 cnt, u8 *pmem);
365
366 extern u8 _rtw_read8(_adapter *adapter, u32 addr);
367 extern u16 _rtw_read16(_adapter *adapter, u32 addr);
368 extern u32 _rtw_read32(_adapter *adapter, u32 addr);
369 extern void _rtw_read_mem(_adapter *adapter, u32 addr, u32 cnt, u8 *pmem);
370 extern void _rtw_read_port(_adapter *adapter, u32 addr, u32 cnt, u8 *pmem);
371 extern void _rtw_read_port_cancel(_adapter *adapter);
372
373
374 extern int _rtw_write8(_adapter *adapter, u32 addr, u8 val);
375 extern int _rtw_write16(_adapter *adapter, u32 addr, u16 val);
376 extern int _rtw_write32(_adapter *adapter, u32 addr, u32 val);
377 extern int _rtw_writeN(_adapter *adapter, u32 addr, u32 length, u8 *pdata);
378
379 extern int _rtw_write8_async(_adapter *adapter, u32 addr, u8 val);
380 extern int _rtw_write16_async(_adapter *adapter, u32 addr, u16 val);
381 extern int _rtw_write32_async(_adapter *adapter, u32 addr, u32 val);
382
383 extern void _rtw_write_mem(_adapter *adapter, u32 addr, u32 cnt, u8 *pmem);
384 extern u32 _rtw_write_port(_adapter *adapter, u32 addr, u32 cnt, u8 *pmem);
385 u32 _rtw_write_port_and_wait(_adapter *adapter, u32 addr, u32 cnt, u8 *pmem, int timeout_ms);
386 extern void _rtw_write_port_cancel(_adapter *adapter);
387
388 #ifdef DBG_IO
389 bool match_read_sniff_ranges(u16 addr, u16 len);
390 bool match_write_sniff_ranges(u16 addr, u16 len);
391
392 extern u8 dbg_rtw_read8(_adapter *adapter, u32 addr, const char *caller, const int line);
393 extern u16 dbg_rtw_read16(_adapter *adapter, u32 addr, const char *caller, const int line);
394 extern u32 dbg_rtw_read32(_adapter *adapter, u32 addr, const char *caller, const int line);
395
396 extern int dbg_rtw_write8(_adapter *adapter, u32 addr, u8 val, const char *caller, const int line);
397 extern int dbg_rtw_write16(_adapter *adapter, u32 addr, u16 val, const char *caller, const int line);
398 extern int dbg_rtw_write32(_adapter *adapter, u32 addr, u32 val, const char *caller, const int line);
399 extern int dbg_rtw_writeN(_adapter *adapter, u32 addr ,u32 length , u8 *data, const char *caller, const int line);
400
401 #define rtw_read8(adapter, addr) dbg_rtw_read8((adapter), (addr), __FUNCTION__, __LINE__)
402 #define rtw_read16(adapter, addr) dbg_rtw_read16((adapter), (addr), __FUNCTION__, __LINE__)
403 #define rtw_read32(adapter, addr) dbg_rtw_read32((adapter), (addr), __FUNCTION__, __LINE__)
404 #define rtw_read_mem(adapter, addr, cnt, mem) _rtw_read_mem((adapter), (addr), (cnt), (mem))
405 #define rtw_read_port(adapter, addr, cnt, mem) _rtw_read_port((adapter), (addr), (cnt), (mem))
406 #define rtw_read_port_cancel(adapter) _rtw_read_port_cancel((adapter))
407
408 #define rtw_write8(adapter, addr, val) dbg_rtw_write8((adapter), (addr), (val), __FUNCTION__, __LINE__)
409 #define rtw_write16(adapter, addr, val) dbg_rtw_write16((adapter), (addr), (val), __FUNCTION__, __LINE__)
410 #define rtw_write32(adapter, addr, val) dbg_rtw_write32((adapter), (addr), (val), __FUNCTION__, __LINE__)
411 #define rtw_writeN(adapter, addr, length, data) dbg_rtw_writeN((adapter), (addr), (length), (data), __FUNCTION__, __LINE__)
412
413 #define rtw_write8_async(adapter, addr, val) _rtw_write8_async((adapter), (addr), (val))
414 #define rtw_write16_async(adapter, addr, val) _rtw_write16_async((adapter), (addr), (val))
415 #define rtw_write32_async(adapter, addr, val) _rtw_write32_async((adapter), (addr), (val))
416
417 #define rtw_write_mem(adapter, addr, cnt, mem) _rtw_write_mem((adapter), addr, cnt, mem)
418 #define rtw_write_port(adapter, addr, cnt, mem) _rtw_write_port(adapter, addr, cnt, mem)
419 #define rtw_write_port_and_wait(adapter, addr, cnt, mem, timeout_ms) _rtw_write_port_and_wait((adapter), (addr), (cnt), (mem), (timeout_ms))
420 #define rtw_write_port_cancel(adapter) _rtw_write_port_cancel(adapter)
421 #else //DBG_IO
422 #define rtw_read8(adapter, addr) _rtw_read8((adapter), (addr))
423 #define rtw_read16(adapter, addr) _rtw_read16((adapter), (addr))
424 #define rtw_read32(adapter, addr) _rtw_read32((adapter), (addr))
425 #define rtw_read_mem(adapter, addr, cnt, mem) _rtw_read_mem((adapter), (addr), (cnt), (mem))
426 #define rtw_read_port(adapter, addr, cnt, mem) _rtw_read_port((adapter), (addr), (cnt), (mem))
427 #define rtw_read_port_cancel(adapter) _rtw_read_port_cancel((adapter))
428
429 #define rtw_write8(adapter, addr, val) _rtw_write8((adapter), (addr), (val))
430 #define rtw_write16(adapter, addr, val) _rtw_write16((adapter), (addr), (val))
431 #define rtw_write32(adapter, addr, val) _rtw_write32((adapter), (addr), (val))
432 #define rtw_writeN(adapter, addr, length, data) _rtw_writeN((adapter), (addr), (length), (data))
433
434 #define rtw_write8_async(adapter, addr, val) _rtw_write8_async((adapter), (addr), (val))
435 #define rtw_write16_async(adapter, addr, val) _rtw_write16_async((adapter), (addr), (val))
436 #define rtw_write32_async(adapter, addr, val) _rtw_write32_async((adapter), (addr), (val))
437
438 #define rtw_write_mem(adapter, addr, cnt, mem) _rtw_write_mem((adapter), (addr), (cnt), (mem))
439 #define rtw_write_port(adapter, addr, cnt, mem) _rtw_write_port((adapter), (addr), (cnt), (mem))
440 #define rtw_write_port_and_wait(adapter, addr, cnt, mem, timeout_ms) _rtw_write_port_and_wait((adapter), (addr), (cnt), (mem), (timeout_ms))
441 #define rtw_write_port_cancel(adapter) _rtw_write_port_cancel((adapter))
442 #endif //DBG_IO
443
444 extern void rtw_write_scsi(_adapter *adapter, u32 cnt, u8 *pmem);
445
446 //ioreq
447 extern void ioreq_read8(_adapter *adapter, u32 addr, u8 *pval);
448 extern void ioreq_read16(_adapter *adapter, u32 addr, u16 *pval);
449 extern void ioreq_read32(_adapter *adapter, u32 addr, u32 *pval);
450 extern void ioreq_write8(_adapter *adapter, u32 addr, u8 val);
451 extern void ioreq_write16(_adapter *adapter, u32 addr, u16 val);
452 extern void ioreq_write32(_adapter *adapter, u32 addr, u32 val);
453
454
455 extern uint async_read8(_adapter *adapter, u32 addr, u8 *pbuff,
456 void (*_async_io_callback)(_adapter *padater, struct io_req *pio_req, u8 *cnxt), u8 *cnxt);
457 extern uint async_read16(_adapter *adapter, u32 addr, u8 *pbuff,
458 void (*_async_io_callback)(_adapter *padater, struct io_req *pio_req, u8 *cnxt), u8 *cnxt);
459 extern uint async_read32(_adapter *adapter, u32 addr, u8 *pbuff,
460 void (*_async_io_callback)(_adapter *padater, struct io_req *pio_req, u8 *cnxt), u8 *cnxt);
461
462 extern void async_read_mem(_adapter *adapter, u32 addr, u32 cnt, u8 *pmem);
463 extern void async_read_port(_adapter *adapter, u32 addr, u32 cnt, u8 *pmem);
464
465 extern void async_write8(_adapter *adapter, u32 addr, u8 val,
466 void (*_async_io_callback)(_adapter *padater, struct io_req *pio_req, u8 *cnxt), u8 *cnxt);
467 extern void async_write16(_adapter *adapter, u32 addr, u16 val,
468 void (*_async_io_callback)(_adapter *padater, struct io_req *pio_req, u8 *cnxt), u8 *cnxt);
469 extern void async_write32(_adapter *adapter, u32 addr, u32 val,
470 void (*_async_io_callback)(_adapter *padater, struct io_req *pio_req, u8 *cnxt), u8 *cnxt);
471
472 extern void async_write_mem(_adapter *adapter, u32 addr, u32 cnt, u8 *pmem);
473 extern void async_write_port(_adapter *adapter, u32 addr, u32 cnt, u8 *pmem);
474
475
476 int rtw_init_io_priv(_adapter *padapter, void (*set_intf_ops)(struct _io_ops *pops));
477
478
479 extern uint alloc_io_queue(_adapter *adapter);
480 extern void free_io_queue(_adapter *adapter);
481 extern void async_bus_io(struct io_queue *pio_q);
482 extern void bus_sync_io(struct io_queue *pio_q);
483 extern u32 _ioreq2rwmem(struct io_queue *pio_q);
484 extern void dev_power_down(_adapter * Adapter, u8 bpwrup);
485
486 /*
487 #define RTL_R8(reg) rtw_read8(padapter, reg)
488 #define RTL_R16(reg) rtw_read16(padapter, reg)
489 #define RTL_R32(reg) rtw_read32(padapter, reg)
490 #define RTL_W8(reg, val8) rtw_write8(padapter, reg, val8)
491 #define RTL_W16(reg, val16) rtw_write16(padapter, reg, val16)
492 #define RTL_W32(reg, val32) rtw_write32(padapter, reg, val32)
493 */
494
495 /*
496 #define RTL_W8_ASYNC(reg, val8) rtw_write32_async(padapter, reg, val8)
497 #define RTL_W16_ASYNC(reg, val16) rtw_write32_async(padapter, reg, val16)
498 #define RTL_W32_ASYNC(reg, val32) rtw_write32_async(padapter, reg, val32)
499
500 #define RTL_WRITE_BB(reg, val32) phy_SetUsbBBReg(padapter, reg, val32)
501 #define RTL_READ_BB(reg) phy_QueryUsbBBReg(padapter, reg)
502 */
503
504 #endif //_RTL8711_IO_H_