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 
usb_read8(struct intf_hdl * intfhdl,u32 addr)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;
3295b0f54fSWang Cheng 	int status;
3395b0f54fSWang Cheng 	__le32 data = 0;
342370b876SNishka Dasgupta 	struct intf_priv *intfpriv = intfhdl->pintfpriv;
352865d42cSLarry Finger 
362865d42cSLarry Finger 	request = 0x05;
372865d42cSLarry Finger 	requesttype = 0x01; /* read_in */
382865d42cSLarry Finger 	index = 0;
392865d42cSLarry Finger 	wvalue = (u16)(addr & 0x0000ffff);
402865d42cSLarry Finger 	len = 1;
4195b0f54fSWang Cheng 	status = r8712_usbctrl_vendorreq(intfpriv, request, wvalue, index,
4295b0f54fSWang Cheng 					 &data, len, requesttype);
4395b0f54fSWang Cheng 	if (status < 0)
4495b0f54fSWang Cheng 		return 0;
452865d42cSLarry Finger 	return (u8)(le32_to_cpu(data) & 0x0ff);
462865d42cSLarry Finger }
472865d42cSLarry Finger 
usb_read16(struct intf_hdl * intfhdl,u32 addr)482370b876SNishka Dasgupta static u16 usb_read16(struct intf_hdl *intfhdl, u32 addr)
492865d42cSLarry Finger {
502865d42cSLarry Finger 	u8 request;
512865d42cSLarry Finger 	u8 requesttype;
522865d42cSLarry Finger 	u16 wvalue;
532865d42cSLarry Finger 	u16 index;
542865d42cSLarry Finger 	u16 len;
5595b0f54fSWang Cheng 	int status;
5695b0f54fSWang Cheng 	__le32 data = 0;
572370b876SNishka Dasgupta 	struct intf_priv *intfpriv = intfhdl->pintfpriv;
582865d42cSLarry Finger 
592865d42cSLarry Finger 	request = 0x05;
602865d42cSLarry Finger 	requesttype = 0x01; /* read_in */
612865d42cSLarry Finger 	index = 0;
622865d42cSLarry Finger 	wvalue = (u16)(addr & 0x0000ffff);
632865d42cSLarry Finger 	len = 2;
6495b0f54fSWang Cheng 	status = r8712_usbctrl_vendorreq(intfpriv, request, wvalue, index,
6595b0f54fSWang Cheng 					 &data, len, requesttype);
6695b0f54fSWang Cheng 	if (status < 0)
6795b0f54fSWang Cheng 		return 0;
682865d42cSLarry Finger 	return (u16)(le32_to_cpu(data) & 0xffff);
692865d42cSLarry Finger }
702865d42cSLarry Finger 
usb_read32(struct intf_hdl * intfhdl,u32 addr)712370b876SNishka Dasgupta static u32 usb_read32(struct intf_hdl *intfhdl, u32 addr)
722865d42cSLarry Finger {
732865d42cSLarry Finger 	u8 request;
742865d42cSLarry Finger 	u8 requesttype;
752865d42cSLarry Finger 	u16 wvalue;
762865d42cSLarry Finger 	u16 index;
772865d42cSLarry Finger 	u16 len;
7895b0f54fSWang Cheng 	int status;
7995b0f54fSWang Cheng 	__le32 data = 0;
802370b876SNishka Dasgupta 	struct intf_priv *intfpriv = intfhdl->pintfpriv;
812865d42cSLarry Finger 
822865d42cSLarry Finger 	request = 0x05;
832865d42cSLarry Finger 	requesttype = 0x01; /* read_in */
842865d42cSLarry Finger 	index = 0;
852865d42cSLarry Finger 	wvalue = (u16)(addr & 0x0000ffff);
862865d42cSLarry Finger 	len = 4;
8795b0f54fSWang Cheng 	status = r8712_usbctrl_vendorreq(intfpriv, request, wvalue, index,
8895b0f54fSWang Cheng 					 &data, len, requesttype);
8995b0f54fSWang Cheng 	if (status < 0)
9095b0f54fSWang Cheng 		return 0;
912865d42cSLarry Finger 	return le32_to_cpu(data);
922865d42cSLarry Finger }
932865d42cSLarry Finger 
usb_write8(struct intf_hdl * intfhdl,u32 addr,u8 val)942370b876SNishka Dasgupta static void usb_write8(struct intf_hdl *intfhdl, u32 addr, u8 val)
952865d42cSLarry Finger {
962865d42cSLarry Finger 	u8 request;
972865d42cSLarry Finger 	u8 requesttype;
982865d42cSLarry Finger 	u16 wvalue;
992865d42cSLarry Finger 	u16 index;
1002865d42cSLarry Finger 	u16 len;
101b596f548SJannik Becher 	__le32 data;
1022370b876SNishka Dasgupta 	struct intf_priv *intfpriv = intfhdl->pintfpriv;
1032865d42cSLarry Finger 
1042865d42cSLarry Finger 	request = 0x05;
1052865d42cSLarry Finger 	requesttype = 0x00; /* write_out */
1062865d42cSLarry Finger 	index = 0;
1072865d42cSLarry Finger 	wvalue = (u16)(addr & 0x0000ffff);
1082865d42cSLarry Finger 	len = 1;
109b596f548SJannik Becher 	data = cpu_to_le32((u32)val & 0x000000ff);
1102370b876SNishka Dasgupta 	r8712_usbctrl_vendorreq(intfpriv, request, wvalue, index, &data, len,
1112865d42cSLarry Finger 				requesttype);
1122865d42cSLarry Finger }
1132865d42cSLarry Finger 
usb_write16(struct intf_hdl * intfhdl,u32 addr,u16 val)1142370b876SNishka Dasgupta static void usb_write16(struct intf_hdl *intfhdl, u32 addr, u16 val)
1152865d42cSLarry Finger {
1162865d42cSLarry Finger 	u8 request;
1172865d42cSLarry Finger 	u8 requesttype;
1182865d42cSLarry Finger 	u16 wvalue;
1192865d42cSLarry Finger 	u16 index;
1202865d42cSLarry Finger 	u16 len;
121b596f548SJannik Becher 	__le32 data;
1222370b876SNishka Dasgupta 	struct intf_priv *intfpriv = intfhdl->pintfpriv;
1232865d42cSLarry Finger 
1242865d42cSLarry Finger 	request = 0x05;
1252865d42cSLarry Finger 	requesttype = 0x00; /* write_out */
1262865d42cSLarry Finger 	index = 0;
1272865d42cSLarry Finger 	wvalue = (u16)(addr & 0x0000ffff);
1282865d42cSLarry Finger 	len = 2;
129b596f548SJannik Becher 	data = cpu_to_le32((u32)val & 0x0000ffff);
1302370b876SNishka Dasgupta 	r8712_usbctrl_vendorreq(intfpriv, request, wvalue, index, &data, len,
1312865d42cSLarry Finger 				requesttype);
1322865d42cSLarry Finger }
1332865d42cSLarry Finger 
usb_write32(struct intf_hdl * intfhdl,u32 addr,u32 val)1342370b876SNishka Dasgupta static void usb_write32(struct intf_hdl *intfhdl, u32 addr, u32 val)
1352865d42cSLarry Finger {
1362865d42cSLarry Finger 	u8 request;
1372865d42cSLarry Finger 	u8 requesttype;
1382865d42cSLarry Finger 	u16 wvalue;
1392865d42cSLarry Finger 	u16 index;
1402865d42cSLarry Finger 	u16 len;
141b596f548SJannik Becher 	__le32 data;
1422370b876SNishka Dasgupta 	struct intf_priv *intfpriv = intfhdl->pintfpriv;
1432865d42cSLarry Finger 
1442865d42cSLarry Finger 	request = 0x05;
1452865d42cSLarry Finger 	requesttype = 0x00; /* write_out */
1462865d42cSLarry Finger 	index = 0;
1472865d42cSLarry Finger 	wvalue = (u16)(addr & 0x0000ffff);
1482865d42cSLarry Finger 	len = 4;
1492865d42cSLarry Finger 	data = cpu_to_le32(val);
1502370b876SNishka Dasgupta 	r8712_usbctrl_vendorreq(intfpriv, request, wvalue, index, &data, len,
1512865d42cSLarry Finger 				requesttype);
1522865d42cSLarry Finger }
1532865d42cSLarry Finger 
r8712_usb_set_intf_option(u32 * option)1542370b876SNishka Dasgupta void r8712_usb_set_intf_option(u32 *option)
1552865d42cSLarry Finger {
1562370b876SNishka Dasgupta 	*option = ((*option) | _INTF_ASYNC_);
1572865d42cSLarry Finger }
1582865d42cSLarry Finger 
usb_intf_hdl_init(u8 * priv)1592865d42cSLarry Finger static void usb_intf_hdl_init(u8 *priv)
1602865d42cSLarry Finger {
1612865d42cSLarry Finger }
1622865d42cSLarry Finger 
usb_intf_hdl_unload(u8 * priv)1632865d42cSLarry Finger static void usb_intf_hdl_unload(u8 *priv)
1642865d42cSLarry Finger {
1652865d42cSLarry Finger }
1662865d42cSLarry Finger 
usb_intf_hdl_open(u8 * priv)1672865d42cSLarry Finger static void usb_intf_hdl_open(u8 *priv)
1682865d42cSLarry Finger {
1692865d42cSLarry Finger }
1702865d42cSLarry Finger 
usb_intf_hdl_close(u8 * priv)1712865d42cSLarry Finger static void usb_intf_hdl_close(u8 *priv)
1722865d42cSLarry Finger {
1732865d42cSLarry Finger }
1742865d42cSLarry Finger 
r8712_usb_set_intf_funs(struct intf_hdl * intfhdl)1752370b876SNishka Dasgupta void r8712_usb_set_intf_funs(struct intf_hdl *intfhdl)
1762865d42cSLarry Finger {
1772370b876SNishka Dasgupta 	intfhdl->intf_hdl_init = usb_intf_hdl_init;
1782370b876SNishka Dasgupta 	intfhdl->intf_hdl_unload = usb_intf_hdl_unload;
1792370b876SNishka Dasgupta 	intfhdl->intf_hdl_open = usb_intf_hdl_open;
1802370b876SNishka Dasgupta 	intfhdl->intf_hdl_close = usb_intf_hdl_close;
1812865d42cSLarry Finger }
1822865d42cSLarry Finger 
r8712_usb_set_intf_ops(struct _io_ops * ops)1832370b876SNishka Dasgupta void r8712_usb_set_intf_ops(struct _io_ops *ops)
1842865d42cSLarry Finger {
1852370b876SNishka Dasgupta 	memset((u8 *)ops, 0, sizeof(struct _io_ops));
1862370b876SNishka Dasgupta 	ops->_read8 = usb_read8;
1872370b876SNishka Dasgupta 	ops->_read16 = usb_read16;
1882370b876SNishka Dasgupta 	ops->_read32 = usb_read32;
1892370b876SNishka Dasgupta 	ops->_read_port = r8712_usb_read_port;
1902370b876SNishka Dasgupta 	ops->_write8 = usb_write8;
1912370b876SNishka Dasgupta 	ops->_write16 = usb_write16;
1922370b876SNishka Dasgupta 	ops->_write32 = usb_write32;
1932370b876SNishka Dasgupta 	ops->_write_mem = r8712_usb_write_mem;
1942370b876SNishka Dasgupta 	ops->_write_port = r8712_usb_write_port;
1952865d42cSLarry Finger }
196