Back to home page

OSCL-LXR

 
 

    


0001 // SPDX-License-Identifier: GPL-2.0
0002 /******************************************************************************
0003  * usb_ops.c
0004  *
0005  * Copyright(c) 2007 - 2010 Realtek Corporation. All rights reserved.
0006  * Linux device driver for RTL8192SU
0007  *
0008  * Modifications for inclusion into the Linux staging tree are
0009  * Copyright(c) 2010 Larry Finger. All rights reserved.
0010  *
0011  * Contact information:
0012  * WLAN FAE <wlanfae@realtek.com>
0013  * Larry Finger <Larry.Finger@lwfinger.net>
0014  *
0015  ******************************************************************************/
0016 
0017 #define _HCI_OPS_C_
0018 
0019 #include "osdep_service.h"
0020 #include "drv_types.h"
0021 #include "osdep_intf.h"
0022 #include "usb_ops.h"
0023 #include "recv_osdep.h"
0024 
0025 static u8 usb_read8(struct intf_hdl *intfhdl, u32 addr)
0026 {
0027     u8 request;
0028     u8 requesttype;
0029     u16 wvalue;
0030     u16 index;
0031     u16 len;
0032     int status;
0033     __le32 data = 0;
0034     struct intf_priv *intfpriv = intfhdl->pintfpriv;
0035 
0036     request = 0x05;
0037     requesttype = 0x01; /* read_in */
0038     index = 0;
0039     wvalue = (u16)(addr & 0x0000ffff);
0040     len = 1;
0041     status = r8712_usbctrl_vendorreq(intfpriv, request, wvalue, index,
0042                      &data, len, requesttype);
0043     if (status < 0)
0044         return 0;
0045     return (u8)(le32_to_cpu(data) & 0x0ff);
0046 }
0047 
0048 static u16 usb_read16(struct intf_hdl *intfhdl, u32 addr)
0049 {
0050     u8 request;
0051     u8 requesttype;
0052     u16 wvalue;
0053     u16 index;
0054     u16 len;
0055     int status;
0056     __le32 data = 0;
0057     struct intf_priv *intfpriv = intfhdl->pintfpriv;
0058 
0059     request = 0x05;
0060     requesttype = 0x01; /* read_in */
0061     index = 0;
0062     wvalue = (u16)(addr & 0x0000ffff);
0063     len = 2;
0064     status = r8712_usbctrl_vendorreq(intfpriv, request, wvalue, index,
0065                      &data, len, requesttype);
0066     if (status < 0)
0067         return 0;
0068     return (u16)(le32_to_cpu(data) & 0xffff);
0069 }
0070 
0071 static u32 usb_read32(struct intf_hdl *intfhdl, u32 addr)
0072 {
0073     u8 request;
0074     u8 requesttype;
0075     u16 wvalue;
0076     u16 index;
0077     u16 len;
0078     int status;
0079     __le32 data = 0;
0080     struct intf_priv *intfpriv = intfhdl->pintfpriv;
0081 
0082     request = 0x05;
0083     requesttype = 0x01; /* read_in */
0084     index = 0;
0085     wvalue = (u16)(addr & 0x0000ffff);
0086     len = 4;
0087     status = r8712_usbctrl_vendorreq(intfpriv, request, wvalue, index,
0088                      &data, len, requesttype);
0089     if (status < 0)
0090         return 0;
0091     return le32_to_cpu(data);
0092 }
0093 
0094 static void usb_write8(struct intf_hdl *intfhdl, u32 addr, u8 val)
0095 {
0096     u8 request;
0097     u8 requesttype;
0098     u16 wvalue;
0099     u16 index;
0100     u16 len;
0101     __le32 data;
0102     struct intf_priv *intfpriv = intfhdl->pintfpriv;
0103 
0104     request = 0x05;
0105     requesttype = 0x00; /* write_out */
0106     index = 0;
0107     wvalue = (u16)(addr & 0x0000ffff);
0108     len = 1;
0109     data = cpu_to_le32((u32)val & 0x000000ff);
0110     r8712_usbctrl_vendorreq(intfpriv, request, wvalue, index, &data, len,
0111                 requesttype);
0112 }
0113 
0114 static void usb_write16(struct intf_hdl *intfhdl, u32 addr, u16 val)
0115 {
0116     u8 request;
0117     u8 requesttype;
0118     u16 wvalue;
0119     u16 index;
0120     u16 len;
0121     __le32 data;
0122     struct intf_priv *intfpriv = intfhdl->pintfpriv;
0123 
0124     request = 0x05;
0125     requesttype = 0x00; /* write_out */
0126     index = 0;
0127     wvalue = (u16)(addr & 0x0000ffff);
0128     len = 2;
0129     data = cpu_to_le32((u32)val & 0x0000ffff);
0130     r8712_usbctrl_vendorreq(intfpriv, request, wvalue, index, &data, len,
0131                 requesttype);
0132 }
0133 
0134 static void usb_write32(struct intf_hdl *intfhdl, u32 addr, u32 val)
0135 {
0136     u8 request;
0137     u8 requesttype;
0138     u16 wvalue;
0139     u16 index;
0140     u16 len;
0141     __le32 data;
0142     struct intf_priv *intfpriv = intfhdl->pintfpriv;
0143 
0144     request = 0x05;
0145     requesttype = 0x00; /* write_out */
0146     index = 0;
0147     wvalue = (u16)(addr & 0x0000ffff);
0148     len = 4;
0149     data = cpu_to_le32(val);
0150     r8712_usbctrl_vendorreq(intfpriv, request, wvalue, index, &data, len,
0151                 requesttype);
0152 }
0153 
0154 void r8712_usb_set_intf_option(u32 *option)
0155 {
0156     *option = ((*option) | _INTF_ASYNC_);
0157 }
0158 
0159 static void usb_intf_hdl_init(u8 *priv)
0160 {
0161 }
0162 
0163 static void usb_intf_hdl_unload(u8 *priv)
0164 {
0165 }
0166 
0167 static void usb_intf_hdl_open(u8 *priv)
0168 {
0169 }
0170 
0171 static void usb_intf_hdl_close(u8 *priv)
0172 {
0173 }
0174 
0175 void r8712_usb_set_intf_funs(struct intf_hdl *intfhdl)
0176 {
0177     intfhdl->intf_hdl_init = usb_intf_hdl_init;
0178     intfhdl->intf_hdl_unload = usb_intf_hdl_unload;
0179     intfhdl->intf_hdl_open = usb_intf_hdl_open;
0180     intfhdl->intf_hdl_close = usb_intf_hdl_close;
0181 }
0182 
0183 void r8712_usb_set_intf_ops(struct _io_ops *ops)
0184 {
0185     memset((u8 *)ops, 0, sizeof(struct _io_ops));
0186     ops->_read8 = usb_read8;
0187     ops->_read16 = usb_read16;
0188     ops->_read32 = usb_read32;
0189     ops->_read_port = r8712_usb_read_port;
0190     ops->_write8 = usb_write8;
0191     ops->_write16 = usb_write16;
0192     ops->_write32 = usb_write32;
0193     ops->_write_mem = r8712_usb_write_mem;
0194     ops->_write_port = r8712_usb_write_port;
0195 }