]> git.karo-electronics.de Git - karo-tx-linux.git/blob - drivers/staging/rtl8723au/include/rtw_io.h
Merge branches 'for-3.16/i2c-hid', 'for-3.16/rmi4', 'for-3.16/sony' and 'for-3.16...
[karo-tx-linux.git] / drivers / staging / rtl8723au / 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  ******************************************************************************/
15
16 #ifndef _RTW_IO_H_
17 #define _RTW_IO_H_
18
19 #include <osdep_service.h>
20 #include <osdep_intf.h>
21
22 #include <asm/byteorder.h>
23 #include <linux/semaphore.h>
24 #include <linux/list.h>
25 /* include <linux/smp_lock.h> */
26 #include <linux/spinlock.h>
27 #include <asm/atomic.h>
28
29 #include <linux/usb.h>
30 #include <linux/usb/ch9.h>
31
32 #define rtw_usb_buffer_alloc(dev, size, dma) usb_alloc_coherent((dev), (size), (in_interrupt() ? GFP_ATOMIC : GFP_KERNEL), (dma))
33 #define rtw_usb_buffer_free(dev, size, addr, dma) usb_free_coherent((dev), (size), (addr), (dma))
34
35 #define NUM_IOREQ               8
36
37 #define MAX_PROT_SZ     (64-16)
38
39 #define _IOREADY                        0
40 #define _IO_WAIT_COMPLETE   1
41 #define _IO_WAIT_RSP        2
42
43 /*  IO COMMAND TYPE */
44 #define _IOSZ_MASK_             (0x7F)
45 #define _IO_WRITE_              BIT(7)
46 #define _IO_FIXED_              BIT(8)
47 #define _IO_BURST_              BIT(9)
48 #define _IO_BYTE_               BIT(10)
49 #define _IO_HW_                 BIT(11)
50 #define _IO_WORD_               BIT(12)
51 #define _IO_SYNC_               BIT(13)
52 #define _IO_CMDMASK_    (0x1F80)
53
54
55 /*
56         For prompt mode accessing, caller shall free io_req
57         Otherwise, io_handler will free io_req
58 */
59
60
61
62 /*  IO STATUS TYPE */
63 #define _IO_ERR_                BIT(2)
64 #define _IO_SUCCESS_    BIT(1)
65 #define _IO_DONE_               BIT(0)
66
67
68 #define IO_RD32                 (_IO_SYNC_ | _IO_WORD_)
69 #define IO_RD16                 (_IO_SYNC_ | _IO_HW_)
70 #define IO_RD8                  (_IO_SYNC_ | _IO_BYTE_)
71
72 #define IO_RD32_ASYNC   (_IO_WORD_)
73 #define IO_RD16_ASYNC   (_IO_HW_)
74 #define IO_RD8_ASYNC    (_IO_BYTE_)
75
76 #define IO_WR32                 (_IO_WRITE_ | _IO_SYNC_ | _IO_WORD_)
77 #define IO_WR16                 (_IO_WRITE_ | _IO_SYNC_ | _IO_HW_)
78 #define IO_WR8                  (_IO_WRITE_ | _IO_SYNC_ | _IO_BYTE_)
79
80 #define IO_WR32_ASYNC   (_IO_WRITE_ | _IO_WORD_)
81 #define IO_WR16_ASYNC   (_IO_WRITE_ | _IO_HW_)
82 #define IO_WR8_ASYNC    (_IO_WRITE_ | _IO_BYTE_)
83
84 /*
85
86         Only Sync. burst accessing is provided.
87
88 */
89
90 #define IO_WR_BURST(x)          (_IO_WRITE_ | _IO_SYNC_ | _IO_BURST_ | ( (x) & _IOSZ_MASK_))
91 #define IO_RD_BURST(x)          (_IO_SYNC_ | _IO_BURST_ | ( (x) & _IOSZ_MASK_))
92
93
94
95 /* below is for the intf_option bit defition... */
96
97 #define _INTF_ASYNC_    BIT(0)  /* support async io */
98
99 struct intf_priv;
100 struct intf_hdl;
101 struct io_queue;
102
103 struct _io_ops
104 {
105                 u8 (*_read8)(struct intf_hdl *pintfhdl, u32 addr);
106                 u16 (*_read16)(struct intf_hdl *pintfhdl, u32 addr);
107                 u32 (*_read32)(struct intf_hdl *pintfhdl, u32 addr);
108
109                 int (*_write8)(struct intf_hdl *pintfhdl, u32 addr, u8 val);
110                 int (*_write16)(struct intf_hdl *pintfhdl, u32 addr, u16 val);
111                 int (*_write32)(struct intf_hdl *pintfhdl, u32 addr, u32 val);
112                 int (*_writeN)(struct intf_hdl *pintfhdl, u32 addr, u32 length, u8 *pdata);
113
114                 int (*_write8_async)(struct intf_hdl *pintfhdl, u32 addr, u8 val);
115                 int (*_write16_async)(struct intf_hdl *pintfhdl, u32 addr, u16 val);
116                 int (*_write32_async)(struct intf_hdl *pintfhdl, u32 addr, u32 val);
117
118                 void (*_read_mem)(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, u8 *pmem);
119                 void (*_write_mem)(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, u8 *pmem);
120
121                 void (*_sync_irp_protocol_rw)(struct io_queue *pio_q);
122
123                 u32 (*_read_interrupt)(struct intf_hdl *pintfhdl, u32 addr);
124
125                 u32 (*_read_port)(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, struct recv_buf *rbuf);
126                 u32 (*_write_port)(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, struct xmit_buf *pmem);
127
128                 u32 (*_write_scsi)(struct intf_hdl *pintfhdl,u32 cnt, u8 *pmem);
129
130                 void (*_read_port_cancel)(struct intf_hdl *pintfhdl);
131                 void (*_write_port_cancel)(struct intf_hdl *pintfhdl);
132
133 };
134
135 struct io_req {
136         struct list_head        list;
137         u32     addr;
138         volatile u32    val;
139         u32     command;
140         u32     status;
141         u8      *pbuf;
142         struct semaphore        sema;
143
144         void (*_async_io_callback)(struct rtw_adapter *padater, struct io_req *pio_req, u8 *cnxt);
145         u8 *cnxt;
146 };
147
148 struct  intf_hdl {
149         struct rtw_adapter *padapter;
150         struct dvobj_priv *pintf_dev;/*         pointer to &(padapter->dvobjpriv); */
151
152         struct _io_ops  io_ops;
153
154 };
155
156 struct reg_protocol_rd {
157
158 #ifdef __LITTLE_ENDIAN
159
160         /* DW1 */
161         u32             NumOfTrans:4;
162         u32             Reserved1:4;
163         u32             Reserved2:24;
164         /* DW2 */
165         u32             ByteCount:7;
166         u32             WriteEnable:1;          /* 0:read, 1:write */
167         u32             FixOrContinuous:1;      /* 0:continuous, 1: Fix */
168         u32             BurstMode:1;
169         u32             Byte1Access:1;
170         u32             Byte2Access:1;
171         u32             Byte4Access:1;
172         u32             Reserved3:3;
173         u32             Reserved4:16;
174         /* DW3 */
175         u32             BusAddress;
176         /* DW4 */
177         /* u32          Value; */
178 #else
179
180
181 /* DW1 */
182         u32 Reserved1  :4;
183         u32 NumOfTrans :4;
184
185         u32 Reserved2  :24;
186
187         /* DW2 */
188         u32 WriteEnable : 1;
189         u32 ByteCount :7;
190
191
192         u32 Reserved3 : 3;
193         u32 Byte4Access : 1;
194
195         u32 Byte2Access : 1;
196         u32 Byte1Access : 1;
197         u32 BurstMode :1 ;
198         u32 FixOrContinuous : 1;
199
200         u32 Reserved4 : 16;
201
202         /* DW3 */
203         u32             BusAddress;
204
205         /* DW4 */
206         /* u32          Value; */
207
208 #endif
209
210 };
211
212
213 struct reg_protocol_wt {
214
215
216 #ifdef __LITTLE_ENDIAN
217
218         /* DW1 */
219         u32             NumOfTrans:4;
220         u32             Reserved1:4;
221         u32             Reserved2:24;
222         /* DW2 */
223         u32             ByteCount:7;
224         u32             WriteEnable:1;          /* 0:read, 1:write */
225         u32             FixOrContinuous:1;      /* 0:continuous, 1: Fix */
226         u32             BurstMode:1;
227         u32             Byte1Access:1;
228         u32             Byte2Access:1;
229         u32             Byte4Access:1;
230         u32             Reserved3:3;
231         u32             Reserved4:16;
232         /* DW3 */
233         u32             BusAddress;
234         /* DW4 */
235         u32             Value;
236
237 #else
238         /* DW1 */
239         u32 Reserved1  :4;
240         u32 NumOfTrans :4;
241
242         u32 Reserved2  :24;
243
244         /* DW2 */
245         u32 WriteEnable : 1;
246         u32 ByteCount :7;
247
248         u32 Reserved3 : 3;
249         u32 Byte4Access : 1;
250
251         u32 Byte2Access : 1;
252         u32 Byte1Access : 1;
253         u32 BurstMode :1 ;
254         u32 FixOrContinuous : 1;
255
256         u32 Reserved4 : 16;
257
258         /* DW3 */
259         u32             BusAddress;
260
261         /* DW4 */
262         u32             Value;
263
264 #endif
265
266 };
267
268
269
270 /*
271 Below is the data structure used by _io_handler
272
273 */
274
275 struct io_queue {
276         spinlock_t      lock;
277         struct list_head free_ioreqs;
278         struct list_head pending;               /* The io_req list that will be served in the single protocol read/write. */
279         struct list_head processing;
280         u8      *free_ioreqs_buf; /*  4-byte aligned */
281         u8      *pallocated_free_ioreqs_buf;
282         struct  intf_hdl        intf;
283 };
284
285 struct io_priv{
286
287         struct rtw_adapter *padapter;
288
289         struct intf_hdl intf;
290
291 };
292
293 uint ioreq_flush(struct rtw_adapter *adapter, struct io_queue *ioqueue);
294 void sync_ioreq_enqueue(struct io_req *preq,struct io_queue *ioqueue);
295 uint sync_ioreq_flush(struct rtw_adapter *adapter, struct io_queue *ioqueue);
296
297 uint free_ioreq(struct io_req *preq, struct io_queue *pio_queue);
298 struct io_req *alloc_ioreq(struct io_queue *pio_q);
299
300 uint register_intf_hdl(u8 *dev, struct intf_hdl *pintfhdl);
301 void unregister_intf_hdl(struct intf_hdl *pintfhdl);
302
303 void _rtw_attrib_read(struct rtw_adapter *adapter, u32 addr, u32 cnt, u8 *pmem);
304 void _rtw_attrib_write(struct rtw_adapter *adapter, u32 addr, u32 cnt, u8 *pmem);
305
306 u8 _rtw_read823a(struct rtw_adapter *adapter, u32 addr);
307 u16 _rtw_read1623a(struct rtw_adapter *adapter, u32 addr);
308 u32 _rtw_read3223a(struct rtw_adapter *adapter, u32 addr);
309 void _rtw_read_mem23a(struct rtw_adapter *adapter, u32 addr, u32 cnt, u8 *pmem);
310 void _rtw_read_port23a(struct rtw_adapter *adapter, u32 addr, u32 cnt, struct recv_buf *rbuf);
311 void _rtw_read_port23a_cancel(struct rtw_adapter *adapter);
312
313 int _rtw_write823a(struct rtw_adapter *adapter, u32 addr, u8 val);
314 int _rtw_write1623a(struct rtw_adapter *adapter, u32 addr, u16 val);
315 int _rtw_write3223a(struct rtw_adapter *adapter, u32 addr, u32 val);
316 int _rtw_writeN23a(struct rtw_adapter *adapter, u32 addr, u32 length, u8 *pdata);
317
318 int _rtw_write823a_async23a(struct rtw_adapter *adapter, u32 addr, u8 val);
319 int _rtw_write1623a_async(struct rtw_adapter *adapter, u32 addr, u16 val);
320 int _rtw_write3223a_async23a(struct rtw_adapter *adapter, u32 addr, u32 val);
321
322 void _rtw_write_mem23a(struct rtw_adapter *adapter, u32 addr, u32 cnt, u8 *pmem);
323 u32 _rtw_write_port23a(struct rtw_adapter *adapter, u32 addr, u32 cnt, struct xmit_buf *pmem);
324 u32 _rtw_write_port23a_and_wait23a(struct rtw_adapter *adapter, u32 addr, u32 cnt, struct xmit_buf *pmem, int timeout_ms);
325 void _rtw_write_port23a_cancel(struct rtw_adapter *adapter);
326
327 #ifdef DBG_IO
328 bool match_read_sniff_ranges(u16 addr, u16 len);
329 bool match_write_sniff_ranges(u16 addr, u16 len);
330
331 u8 dbg_rtw_read823a(struct rtw_adapter *adapter, u32 addr, const char *caller, const int line);
332 u16 dbg_rtw_read1623a(struct rtw_adapter *adapter, u32 addr, const char *caller, const int line);
333 u32 dbg_rtw_read3223a(struct rtw_adapter *adapter, u32 addr, const char *caller, const int line);
334
335 int dbg_rtw_write823a(struct rtw_adapter *adapter, u32 addr, u8 val, const char *caller, const int line);
336 int dbg_rtw_write1623a(struct rtw_adapter *adapter, u32 addr, u16 val, const char *caller, const int line);
337 int dbg_rtw_write3223a(struct rtw_adapter *adapter, u32 addr, u32 val, const char *caller, const int line);
338 int dbg_rtw_writeN23a(struct rtw_adapter *adapter, u32 addr ,u32 length , u8 *data, const char *caller, const int line);
339
340 #define rtw_read8(adapter, addr) dbg_rtw_read823a((adapter), (addr), __FUNCTION__, __LINE__)
341 #define rtw_read16(adapter, addr) dbg_rtw_read1623a((adapter), (addr), __FUNCTION__, __LINE__)
342 #define rtw_read32(adapter, addr) dbg_rtw_read3223a((adapter), (addr), __FUNCTION__, __LINE__)
343 #define rtw_read_mem(adapter, addr, cnt, mem) _rtw_read_mem23a((adapter), (addr), (cnt), (mem))
344 #define rtw_read_port(adapter, addr, cnt, mem) _rtw_read_port23a((adapter), (addr), (cnt), (mem))
345 #define rtw_read_port_cancel(adapter) _rtw_read_port23a_cancel((adapter))
346
347 #define  rtw_write8(adapter, addr, val) dbg_rtw_write823a((adapter), (addr), (val), __FUNCTION__, __LINE__)
348 #define  rtw_write16(adapter, addr, val) dbg_rtw_write1623a((adapter), (addr), (val), __FUNCTION__, __LINE__)
349 #define  rtw_write32(adapter, addr, val) dbg_rtw_write3223a((adapter), (addr), (val), __FUNCTION__, __LINE__)
350 #define  rtw_writeN(adapter, addr, length, data) dbg_rtw_writeN23a((adapter), (addr), (length), (data), __FUNCTION__, __LINE__)
351
352 #define rtw_write8_async(adapter, addr, val) _rtw_write823a_async23a((adapter), (addr), (val))
353 #define rtw_write16_async(adapter, addr, val) _rtw_write1623a_async((adapter), (addr), (val))
354 #define rtw_write32_async(adapter, addr, val) _rtw_write3223a_async23a((adapter), (addr), (val))
355
356 #define rtw_write_mem(adapter, addr, cnt, mem) _rtw_write_mem23a((adapter), addr, cnt, mem)
357 #define rtw_write_port(adapter, addr, cnt, mem) _rtw_write_port23a(adapter, addr, cnt, mem)
358 #define rtw_write_port_and_wait(adapter, addr, cnt, mem, timeout_ms) _rtw_write_port23a_and_wait23a((adapter), (addr), (cnt), (mem), (timeout_ms))
359 #define rtw_write_port_cancel(adapter) _rtw_write_port23a_cancel(adapter)
360 #else /* DBG_IO */
361 #define rtw_read8(adapter, addr) _rtw_read823a((adapter), (addr))
362 #define rtw_read16(adapter, addr) _rtw_read1623a((adapter), (addr))
363 #define rtw_read32(adapter, addr) _rtw_read3223a((adapter), (addr))
364 #define rtw_read_mem(adapter, addr, cnt, mem) _rtw_read_mem23a((adapter), (addr), (cnt), (mem))
365 #define rtw_read_port(adapter, addr, cnt, mem) _rtw_read_port23a((adapter), (addr), (cnt), (mem))
366 #define rtw_read_port_cancel(adapter) _rtw_read_port23a_cancel((adapter))
367
368 #define  rtw_write8(adapter, addr, val) _rtw_write823a((adapter), (addr), (val))
369 #define  rtw_write16(adapter, addr, val) _rtw_write1623a((adapter), (addr), (val))
370 #define  rtw_write32(adapter, addr, val) _rtw_write3223a((adapter), (addr), (val))
371 #define  rtw_writeN(adapter, addr, length, data) _rtw_writeN23a((adapter), (addr), (length), (data))
372
373 #define rtw_write8_async(adapter, addr, val) _rtw_write823a_async23a((adapter), (addr), (val))
374 #define rtw_write16_async(adapter, addr, val) _rtw_write1623a_async((adapter), (addr), (val))
375 #define rtw_write32_async(adapter, addr, val) _rtw_write3223a_async23a((adapter), (addr), (val))
376
377 #define rtw_write_mem(adapter, addr, cnt, mem) _rtw_write_mem23a((adapter), (addr), (cnt), (mem))
378 #define rtw_write_port(adapter, addr, cnt, mem) _rtw_write_port23a((adapter), (addr), (cnt), (mem))
379 #define rtw_write_port_and_wait(adapter, addr, cnt, mem, timeout_ms) _rtw_write_port23a_and_wait23a((adapter), (addr), (cnt), (mem), (timeout_ms))
380 #define rtw_write_port_cancel(adapter) _rtw_write_port23a_cancel((adapter))
381 #endif /* DBG_IO */
382
383 void rtw_write_scsi(struct rtw_adapter *adapter, u32 cnt, u8 *pmem);
384
385 /* ioreq */
386 void ioreq_read8(struct rtw_adapter *adapter, u32 addr, u8 *pval);
387 void ioreq_read16(struct rtw_adapter *adapter, u32 addr, u16 *pval);
388 void ioreq_read32(struct rtw_adapter *adapter, u32 addr, u32 *pval);
389 void ioreq_write8(struct rtw_adapter *adapter, u32 addr, u8 val);
390 void ioreq_write16(struct rtw_adapter *adapter, u32 addr, u16 val);
391 void ioreq_write32(struct rtw_adapter *adapter, u32 addr, u32 val);
392
393 int rtw_init_io_priv23a(struct rtw_adapter *padapter, void (*set_intf_ops)(struct _io_ops *pops));
394
395 uint alloc_io_queue(struct rtw_adapter *adapter);
396 void free_io_queue(struct rtw_adapter *adapter);
397 void async_bus_io(struct io_queue *pio_q);
398 void bus_sync_io(struct io_queue *pio_q);
399 u32 _ioreq2rwmem(struct io_queue *pio_q);
400 void dev_power_down(struct rtw_adapter * Adapter, u8 bpwrup);
401
402 #define PlatformEFIOWrite1Byte(_a,_b,_c)                \
403         rtw_write8(_a,_b,_c)
404 #define PlatformEFIOWrite2Byte(_a,_b,_c)                \
405         rtw_write16(_a,_b,_c)
406 #define PlatformEFIOWrite4Byte(_a,_b,_c)                \
407         rtw_write32(_a,_b,_c)
408
409 #define PlatformEFIORead1Byte(_a,_b)            \
410                 rtw_read8(_a,_b)
411 #define PlatformEFIORead2Byte(_a,_b)            \
412                 rtw_read16(_a,_b)
413 #define PlatformEFIORead4Byte(_a,_b)            \
414                 rtw_read32(_a,_b)
415
416 #endif  /* _RTL8711_IO_H_ */