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