1e24c1f86SMichael Straube // SPDX-License-Identifier: GPL-2.0 22865d42cSLarry Finger /****************************************************************************** 32865d42cSLarry Finger * usb_ops.c 42865d42cSLarry Finger * 52865d42cSLarry Finger * Copyright(c) 2007 - 2010 Realtek Corporation. All rights reserved. 62865d42cSLarry Finger * Linux device driver for RTL8192SU 72865d42cSLarry Finger * 82865d42cSLarry Finger * Modifications for inclusion into the Linux staging tree are 92865d42cSLarry Finger * Copyright(c) 2010 Larry Finger. All rights reserved. 102865d42cSLarry Finger * 112865d42cSLarry Finger * Contact information: 122865d42cSLarry Finger * WLAN FAE <wlanfae@realtek.com> 132865d42cSLarry Finger * Larry Finger <Larry.Finger@lwfinger.net> 142865d42cSLarry Finger * 152865d42cSLarry Finger ******************************************************************************/ 162865d42cSLarry Finger 172865d42cSLarry Finger #define _HCI_OPS_C_ 182865d42cSLarry Finger 192865d42cSLarry Finger #include "osdep_service.h" 202865d42cSLarry Finger #include "drv_types.h" 212865d42cSLarry Finger #include "osdep_intf.h" 222865d42cSLarry Finger #include "usb_ops.h" 232865d42cSLarry Finger #include "recv_osdep.h" 242865d42cSLarry Finger 252370b876SNishka Dasgupta static u8 usb_read8(struct intf_hdl *intfhdl, u32 addr) 262865d42cSLarry Finger { 272865d42cSLarry Finger u8 request; 282865d42cSLarry Finger u8 requesttype; 292865d42cSLarry Finger u16 wvalue; 302865d42cSLarry Finger u16 index; 312865d42cSLarry Finger u16 len; 32b596f548SJannik Becher __le32 data; 332370b876SNishka Dasgupta struct intf_priv *intfpriv = intfhdl->pintfpriv; 342865d42cSLarry Finger 352865d42cSLarry Finger request = 0x05; 362865d42cSLarry Finger requesttype = 0x01; /* read_in */ 372865d42cSLarry Finger index = 0; 382865d42cSLarry Finger wvalue = (u16)(addr & 0x0000ffff); 392865d42cSLarry Finger len = 1; 402370b876SNishka Dasgupta r8712_usbctrl_vendorreq(intfpriv, request, wvalue, index, &data, len, 412865d42cSLarry Finger requesttype); 422865d42cSLarry Finger return (u8)(le32_to_cpu(data) & 0x0ff); 432865d42cSLarry Finger } 442865d42cSLarry Finger 452370b876SNishka Dasgupta static u16 usb_read16(struct intf_hdl *intfhdl, u32 addr) 462865d42cSLarry Finger { 472865d42cSLarry Finger u8 request; 482865d42cSLarry Finger u8 requesttype; 492865d42cSLarry Finger u16 wvalue; 502865d42cSLarry Finger u16 index; 512865d42cSLarry Finger u16 len; 52b596f548SJannik Becher __le32 data; 532370b876SNishka Dasgupta struct intf_priv *intfpriv = intfhdl->pintfpriv; 542865d42cSLarry Finger 552865d42cSLarry Finger request = 0x05; 562865d42cSLarry Finger requesttype = 0x01; /* read_in */ 572865d42cSLarry Finger index = 0; 582865d42cSLarry Finger wvalue = (u16)(addr & 0x0000ffff); 592865d42cSLarry Finger len = 2; 602370b876SNishka Dasgupta r8712_usbctrl_vendorreq(intfpriv, request, wvalue, index, &data, len, 612865d42cSLarry Finger requesttype); 622865d42cSLarry Finger return (u16)(le32_to_cpu(data) & 0xffff); 632865d42cSLarry Finger } 642865d42cSLarry Finger 652370b876SNishka Dasgupta static u32 usb_read32(struct intf_hdl *intfhdl, u32 addr) 662865d42cSLarry Finger { 672865d42cSLarry Finger u8 request; 682865d42cSLarry Finger u8 requesttype; 692865d42cSLarry Finger u16 wvalue; 702865d42cSLarry Finger u16 index; 712865d42cSLarry Finger u16 len; 72b596f548SJannik Becher __le32 data; 732370b876SNishka Dasgupta struct intf_priv *intfpriv = intfhdl->pintfpriv; 742865d42cSLarry Finger 752865d42cSLarry Finger request = 0x05; 762865d42cSLarry Finger requesttype = 0x01; /* read_in */ 772865d42cSLarry Finger index = 0; 782865d42cSLarry Finger wvalue = (u16)(addr & 0x0000ffff); 792865d42cSLarry Finger len = 4; 802370b876SNishka Dasgupta r8712_usbctrl_vendorreq(intfpriv, request, wvalue, index, &data, len, 812865d42cSLarry Finger requesttype); 822865d42cSLarry Finger return le32_to_cpu(data); 832865d42cSLarry Finger } 842865d42cSLarry Finger 852370b876SNishka Dasgupta static void usb_write8(struct intf_hdl *intfhdl, u32 addr, u8 val) 862865d42cSLarry Finger { 872865d42cSLarry Finger u8 request; 882865d42cSLarry Finger u8 requesttype; 892865d42cSLarry Finger u16 wvalue; 902865d42cSLarry Finger u16 index; 912865d42cSLarry Finger u16 len; 92b596f548SJannik Becher __le32 data; 932370b876SNishka Dasgupta struct intf_priv *intfpriv = intfhdl->pintfpriv; 942865d42cSLarry Finger 952865d42cSLarry Finger request = 0x05; 962865d42cSLarry Finger requesttype = 0x00; /* write_out */ 972865d42cSLarry Finger index = 0; 982865d42cSLarry Finger wvalue = (u16)(addr & 0x0000ffff); 992865d42cSLarry Finger len = 1; 100b596f548SJannik Becher data = cpu_to_le32((u32)val & 0x000000ff); 1012370b876SNishka Dasgupta r8712_usbctrl_vendorreq(intfpriv, request, wvalue, index, &data, len, 1022865d42cSLarry Finger requesttype); 1032865d42cSLarry Finger } 1042865d42cSLarry Finger 1052370b876SNishka Dasgupta static void usb_write16(struct intf_hdl *intfhdl, u32 addr, u16 val) 1062865d42cSLarry Finger { 1072865d42cSLarry Finger u8 request; 1082865d42cSLarry Finger u8 requesttype; 1092865d42cSLarry Finger u16 wvalue; 1102865d42cSLarry Finger u16 index; 1112865d42cSLarry Finger u16 len; 112b596f548SJannik Becher __le32 data; 1132370b876SNishka Dasgupta struct intf_priv *intfpriv = intfhdl->pintfpriv; 1142865d42cSLarry Finger 1152865d42cSLarry Finger request = 0x05; 1162865d42cSLarry Finger requesttype = 0x00; /* write_out */ 1172865d42cSLarry Finger index = 0; 1182865d42cSLarry Finger wvalue = (u16)(addr & 0x0000ffff); 1192865d42cSLarry Finger len = 2; 120b596f548SJannik Becher data = cpu_to_le32((u32)val & 0x0000ffff); 1212370b876SNishka Dasgupta r8712_usbctrl_vendorreq(intfpriv, request, wvalue, index, &data, len, 1222865d42cSLarry Finger requesttype); 1232865d42cSLarry Finger } 1242865d42cSLarry Finger 1252370b876SNishka Dasgupta static void usb_write32(struct intf_hdl *intfhdl, u32 addr, u32 val) 1262865d42cSLarry Finger { 1272865d42cSLarry Finger u8 request; 1282865d42cSLarry Finger u8 requesttype; 1292865d42cSLarry Finger u16 wvalue; 1302865d42cSLarry Finger u16 index; 1312865d42cSLarry Finger u16 len; 132b596f548SJannik Becher __le32 data; 1332370b876SNishka Dasgupta struct intf_priv *intfpriv = intfhdl->pintfpriv; 1342865d42cSLarry Finger 1352865d42cSLarry Finger request = 0x05; 1362865d42cSLarry Finger requesttype = 0x00; /* write_out */ 1372865d42cSLarry Finger index = 0; 1382865d42cSLarry Finger wvalue = (u16)(addr & 0x0000ffff); 1392865d42cSLarry Finger len = 4; 1402865d42cSLarry Finger data = cpu_to_le32(val); 1412370b876SNishka Dasgupta r8712_usbctrl_vendorreq(intfpriv, request, wvalue, index, &data, len, 1422865d42cSLarry Finger requesttype); 1432865d42cSLarry Finger } 1442865d42cSLarry Finger 1452370b876SNishka Dasgupta void r8712_usb_set_intf_option(u32 *option) 1462865d42cSLarry Finger { 1472370b876SNishka Dasgupta *option = ((*option) | _INTF_ASYNC_); 1482865d42cSLarry Finger } 1492865d42cSLarry Finger 1502865d42cSLarry Finger static void usb_intf_hdl_init(u8 *priv) 1512865d42cSLarry Finger { 1522865d42cSLarry Finger } 1532865d42cSLarry Finger 1542865d42cSLarry Finger static void usb_intf_hdl_unload(u8 *priv) 1552865d42cSLarry Finger { 1562865d42cSLarry Finger } 1572865d42cSLarry Finger 1582865d42cSLarry Finger static void usb_intf_hdl_open(u8 *priv) 1592865d42cSLarry Finger { 1602865d42cSLarry Finger } 1612865d42cSLarry Finger 1622865d42cSLarry Finger static void usb_intf_hdl_close(u8 *priv) 1632865d42cSLarry Finger { 1642865d42cSLarry Finger } 1652865d42cSLarry Finger 1662370b876SNishka Dasgupta void r8712_usb_set_intf_funs(struct intf_hdl *intfhdl) 1672865d42cSLarry Finger { 1682370b876SNishka Dasgupta intfhdl->intf_hdl_init = usb_intf_hdl_init; 1692370b876SNishka Dasgupta intfhdl->intf_hdl_unload = usb_intf_hdl_unload; 1702370b876SNishka Dasgupta intfhdl->intf_hdl_open = usb_intf_hdl_open; 1712370b876SNishka Dasgupta intfhdl->intf_hdl_close = usb_intf_hdl_close; 1722865d42cSLarry Finger } 1732865d42cSLarry Finger 1742370b876SNishka Dasgupta void r8712_usb_set_intf_ops(struct _io_ops *ops) 1752865d42cSLarry Finger { 1762370b876SNishka Dasgupta memset((u8 *)ops, 0, sizeof(struct _io_ops)); 1772370b876SNishka Dasgupta ops->_read8 = usb_read8; 1782370b876SNishka Dasgupta ops->_read16 = usb_read16; 1792370b876SNishka Dasgupta ops->_read32 = usb_read32; 1802370b876SNishka Dasgupta ops->_read_port = r8712_usb_read_port; 1812370b876SNishka Dasgupta ops->_write8 = usb_write8; 1822370b876SNishka Dasgupta ops->_write16 = usb_write16; 1832370b876SNishka Dasgupta ops->_write32 = usb_write32; 1842370b876SNishka Dasgupta ops->_write_mem = r8712_usb_write_mem; 1852370b876SNishka Dasgupta ops->_write_port = r8712_usb_write_port; 1862865d42cSLarry Finger } 187