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