1/******************************************************************************
2 * usb_ops.c
3 *
4 * Copyright(c) 2007 - 2010 Realtek Corporation. All rights reserved.
5 * Linux device driver for RTL8192SU
6 *
7 * This program is free software; you can redistribute it and/or modify it
8 * under the terms of version 2 of the GNU General Public License as
9 * published by the Free Software Foundation.
10 *
11 * This program is distributed in the hope that it will be useful, but WITHOUT
12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
14 * more details.
15 *
16 * You should have received a copy of the GNU General Public License along with
17 * this program; if not, write to the Free Software Foundation, Inc.,
18 * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
19 *
20 * Modifications for inclusion into the Linux staging tree are
21 * Copyright(c) 2010 Larry Finger. All rights reserved.
22 *
23 * Contact information:
24 * WLAN FAE <wlanfae@realtek.com>
25 * Larry Finger <Larry.Finger@lwfinger.net>
26 *
27 ******************************************************************************/
28
29#define _HCI_OPS_C_
30
31#include "osdep_service.h"
32#include "drv_types.h"
33#include "osdep_intf.h"
34#include "usb_ops.h"
35#include "recv_osdep.h"
36
37static u8 usb_read8(struct intf_hdl *pintfhdl, u32 addr)
38{
39	u8 request;
40	u8 requesttype;
41	u16 wvalue;
42	u16 index;
43	u16 len;
44	u32 data;
45	struct intf_priv *pintfpriv = pintfhdl->pintfpriv;
46
47	request = 0x05;
48	requesttype = 0x01; /* read_in */
49	index = 0;
50	wvalue = (u16)(addr&0x0000ffff);
51	len = 1;
52	r8712_usbctrl_vendorreq(pintfpriv, request, wvalue, index, &data, len,
53			  requesttype);
54	return (u8)(le32_to_cpu(data)&0x0ff);
55}
56
57static u16 usb_read16(struct intf_hdl *pintfhdl, u32 addr)
58{
59	u8 request;
60	u8 requesttype;
61	u16 wvalue;
62	u16 index;
63	u16 len;
64	u32 data;
65	struct intf_priv *pintfpriv = pintfhdl->pintfpriv;
66
67	request = 0x05;
68	requesttype = 0x01; /* read_in */
69	index = 0;
70	wvalue = (u16)(addr&0x0000ffff);
71	len = 2;
72	r8712_usbctrl_vendorreq(pintfpriv, request, wvalue, index, &data, len,
73			  requesttype);
74	return (u16)(le32_to_cpu(data)&0xffff);
75}
76
77static u32 usb_read32(struct intf_hdl *pintfhdl, u32 addr)
78{
79	u8 request;
80	u8 requesttype;
81	u16 wvalue;
82	u16 index;
83	u16 len;
84	u32 data;
85	struct intf_priv *pintfpriv = pintfhdl->pintfpriv;
86
87	request = 0x05;
88	requesttype = 0x01; /* read_in */
89	index = 0;
90	wvalue = (u16)(addr&0x0000ffff);
91	len = 4;
92	r8712_usbctrl_vendorreq(pintfpriv, request, wvalue, index, &data, len,
93			  requesttype);
94	return le32_to_cpu(data);
95}
96
97static void usb_write8(struct intf_hdl *pintfhdl, u32 addr, u8 val)
98{
99	u8 request;
100	u8 requesttype;
101	u16 wvalue;
102	u16 index;
103	u16 len;
104	u32 data;
105	struct intf_priv *pintfpriv = pintfhdl->pintfpriv;
106
107	request = 0x05;
108	requesttype = 0x00; /* write_out */
109	index = 0;
110	wvalue = (u16)(addr&0x0000ffff);
111	len = 1;
112	data = val;
113	data = cpu_to_le32(data&0x000000ff);
114	r8712_usbctrl_vendorreq(pintfpriv, request, wvalue, index, &data, len,
115			  requesttype);
116}
117
118static void usb_write16(struct intf_hdl *pintfhdl, u32 addr, u16 val)
119{
120	u8 request;
121	u8 requesttype;
122	u16 wvalue;
123	u16 index;
124	u16 len;
125	u32 data;
126	struct intf_priv *pintfpriv = pintfhdl->pintfpriv;
127
128	request = 0x05;
129	requesttype = 0x00; /* write_out */
130	index = 0;
131	wvalue = (u16)(addr&0x0000ffff);
132	len = 2;
133	data = val;
134	data = cpu_to_le32(data&0x0000ffff);
135	r8712_usbctrl_vendorreq(pintfpriv, request, wvalue, index, &data, len,
136			  requesttype);
137}
138
139static void usb_write32(struct intf_hdl *pintfhdl, u32 addr, u32 val)
140{
141	u8 request;
142	u8 requesttype;
143	u16 wvalue;
144	u16 index;
145	u16 len;
146	u32 data;
147	struct intf_priv *pintfpriv = pintfhdl->pintfpriv;
148
149	request = 0x05;
150	requesttype = 0x00; /* write_out */
151	index = 0;
152	wvalue = (u16)(addr&0x0000ffff);
153	len = 4;
154	data = cpu_to_le32(val);
155	r8712_usbctrl_vendorreq(pintfpriv, request, wvalue, index, &data, len,
156			  requesttype);
157}
158
159void r8712_usb_set_intf_option(u32 *poption)
160{
161	*poption = ((*poption) | _INTF_ASYNC_);
162}
163
164static void usb_intf_hdl_init(u8 *priv)
165{
166}
167
168static void usb_intf_hdl_unload(u8 *priv)
169{
170}
171
172static void usb_intf_hdl_open(u8 *priv)
173{
174}
175
176static void usb_intf_hdl_close(u8 *priv)
177{
178}
179
180void r8712_usb_set_intf_funs(struct intf_hdl *pintf_hdl)
181{
182	pintf_hdl->intf_hdl_init = &usb_intf_hdl_init;
183	pintf_hdl->intf_hdl_unload = &usb_intf_hdl_unload;
184	pintf_hdl->intf_hdl_open = &usb_intf_hdl_open;
185	pintf_hdl->intf_hdl_close = &usb_intf_hdl_close;
186}
187
188void r8712_usb_set_intf_ops(struct _io_ops	*pops)
189{
190	memset((u8 *)pops, 0, sizeof(struct _io_ops));
191	pops->_read8 = &usb_read8;
192	pops->_read16 = &usb_read16;
193	pops->_read32 = &usb_read32;
194	pops->_read_port = &r8712_usb_read_port;
195	pops->_write8 = &usb_write8;
196	pops->_write16 = &usb_write16;
197	pops->_write32 = &usb_write32;
198	pops->_write_mem = &r8712_usb_write_mem;
199	pops->_write_port = &r8712_usb_write_port;
200}
201