diff options
Diffstat (limited to 'drivers/staging/rtl8723au/core/rtw_io.c')
-rw-r--r-- | drivers/staging/rtl8723au/core/rtw_io.c | 266 |
1 files changed, 266 insertions, 0 deletions
diff --git a/drivers/staging/rtl8723au/core/rtw_io.c b/drivers/staging/rtl8723au/core/rtw_io.c new file mode 100644 index 000000000000..1cae8d7659b9 --- /dev/null +++ b/drivers/staging/rtl8723au/core/rtw_io.c @@ -0,0 +1,266 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + ******************************************************************************/ +/* + +The purpose of rtw_io.c + +a. provides the API + +b. provides the protocol engine + +c. provides the software interface between caller and the hardware interface + +Compiler Flag Option: + +1. For USB: + a. USE_ASYNC_IRP: Both sync/async operations are provided. + +Only sync read/rtw_write_mem operations are provided. + +jackson@realtek.com.tw + +*/ + +#define _RTW_IO_C_ +#include <osdep_service.h> +#include <drv_types.h> +#include <rtw_io.h> +#include <osdep_intf.h> + +#include <usb_ops.h> + +u8 _rtw_read823a(struct rtw_adapter *adapter, u32 addr) +{ + u8 r_val; + struct io_priv *pio_priv = &adapter->iopriv; + struct intf_hdl *pintfhdl = &pio_priv->intf; + + r_val = pintfhdl->io_ops._read8(pintfhdl, addr); + + return r_val; +} + +u16 _rtw_read1623a(struct rtw_adapter *adapter, u32 addr) +{ + u16 r_val; + struct io_priv *pio_priv = &adapter->iopriv; + struct intf_hdl *pintfhdl = &pio_priv->intf; + + r_val = pintfhdl->io_ops._read16(pintfhdl, addr); + + return le16_to_cpu(r_val); +} + +u32 _rtw_read3223a(struct rtw_adapter *adapter, u32 addr) +{ + u32 r_val; + struct io_priv *pio_priv = &adapter->iopriv; + struct intf_hdl *pintfhdl = &pio_priv->intf; + + r_val = pintfhdl->io_ops._read32(pintfhdl, addr); + + return le32_to_cpu(r_val); +} + +int _rtw_write823a(struct rtw_adapter *adapter, u32 addr, u8 val) +{ + struct io_priv *pio_priv = &adapter->iopriv; + struct intf_hdl *pintfhdl = &pio_priv->intf; + int ret; + + ret = pintfhdl->io_ops._write8(pintfhdl, addr, val); + + return RTW_STATUS_CODE23a(ret); +} + +int _rtw_write1623a(struct rtw_adapter *adapter, u32 addr, u16 val) +{ + struct io_priv *pio_priv = &adapter->iopriv; + struct intf_hdl *pintfhdl = &pio_priv->intf; + int ret; + + val = cpu_to_le16(val); + ret = pintfhdl->io_ops._write16(pintfhdl, addr, val); + + return RTW_STATUS_CODE23a(ret); +} +int _rtw_write3223a(struct rtw_adapter *adapter, u32 addr, u32 val) +{ + struct io_priv *pio_priv = &adapter->iopriv; + struct intf_hdl *pintfhdl = &pio_priv->intf; + int ret; + + val = cpu_to_le32(val); + ret = pintfhdl->io_ops._write32(pintfhdl, addr, val); + + return RTW_STATUS_CODE23a(ret); +} + +int _rtw_writeN23a(struct rtw_adapter *adapter, u32 addr , u32 length , u8 *pdata) +{ + struct io_priv *pio_priv = &adapter->iopriv; + struct intf_hdl *pintfhdl = (struct intf_hdl*)&pio_priv->intf; + int ret; + + ret = pintfhdl->io_ops._writeN(pintfhdl, addr, length, pdata); + + return RTW_STATUS_CODE23a(ret); +} +int _rtw_write823a_async23a(struct rtw_adapter *adapter, u32 addr, u8 val) +{ + struct io_priv *pio_priv = &adapter->iopriv; + struct intf_hdl *pintfhdl = &pio_priv->intf; + int ret; + + ret = pintfhdl->io_ops._write8_async(pintfhdl, addr, val); + + return RTW_STATUS_CODE23a(ret); +} +int _rtw_write1623a_async(struct rtw_adapter *adapter, u32 addr, u16 val) +{ + struct io_priv *pio_priv = &adapter->iopriv; + struct intf_hdl *pintfhdl = &pio_priv->intf; + int ret; + + val = cpu_to_le16(val); + ret = pintfhdl->io_ops._write16_async(pintfhdl, addr, val); + + return RTW_STATUS_CODE23a(ret); +} +int _rtw_write3223a_async23a(struct rtw_adapter *adapter, u32 addr, u32 val) +{ + struct io_priv *pio_priv = &adapter->iopriv; + struct intf_hdl *pintfhdl = &pio_priv->intf; + int ret; + + val = cpu_to_le32(val); + ret = pintfhdl->io_ops._write32_async(pintfhdl, addr, val); + + return RTW_STATUS_CODE23a(ret); +} + +void _rtw_read_mem23a(struct rtw_adapter *adapter, u32 addr, u32 cnt, u8 *pmem) +{ + struct io_priv *pio_priv = &adapter->iopriv; + struct intf_hdl *pintfhdl = &pio_priv->intf; + + if ((adapter->bDriverStopped == true) || + (adapter->bSurpriseRemoved == true)) { + RT_TRACE(_module_rtl871x_io_c_, _drv_info_, + ("rtw_read_mem:bDriverStopped(%d) OR " + "bSurpriseRemoved(%d)", adapter->bDriverStopped, + adapter->bSurpriseRemoved)); + return; + } + + pintfhdl->io_ops._read_mem(pintfhdl, addr, cnt, pmem); +} + +void _rtw_write_mem23a(struct rtw_adapter *adapter, u32 addr, u32 cnt, u8 *pmem) +{ + struct io_priv *pio_priv = &adapter->iopriv; + struct intf_hdl *pintfhdl = &pio_priv->intf; + + pintfhdl->io_ops._write_mem(pintfhdl, addr, cnt, pmem); +} + +void _rtw_read_port23a(struct rtw_adapter *adapter, u32 addr, u32 cnt, + struct recv_buf *rbuf) +{ + struct io_priv *pio_priv = &adapter->iopriv; + struct intf_hdl *pintfhdl = &pio_priv->intf; + + if ((adapter->bDriverStopped == true) || + (adapter->bSurpriseRemoved == true)) { + RT_TRACE(_module_rtl871x_io_c_, _drv_info_, + ("rtw_read_port:bDriverStopped(%d) OR " + "bSurpriseRemoved(%d)", adapter->bDriverStopped, + adapter->bSurpriseRemoved)); + return; + } + + pintfhdl->io_ops._read_port(pintfhdl, addr, cnt, rbuf); +} + +void _rtw_read_port23a_cancel(struct rtw_adapter *adapter) +{ + void (*_read_port_cancel)(struct intf_hdl *pintfhdl); + struct io_priv *pio_priv = &adapter->iopriv; + struct intf_hdl *pintfhdl = &pio_priv->intf; + + _read_port_cancel = pintfhdl->io_ops._read_port_cancel; + + if (_read_port_cancel) + _read_port_cancel(pintfhdl); +} + +u32 _rtw_write_port23a(struct rtw_adapter *adapter, u32 addr, u32 cnt, + struct xmit_buf *xbuf) +{ + struct io_priv *pio_priv = &adapter->iopriv; + struct intf_hdl *pintfhdl = &pio_priv->intf; + u32 ret = _SUCCESS; + + ret = pintfhdl->io_ops._write_port(pintfhdl, addr, cnt, xbuf); + + return ret; +} + +u32 _rtw_write_port23a_and_wait23a(struct rtw_adapter *adapter, u32 addr, u32 cnt, + struct xmit_buf *pxmitbuf, int timeout_ms) +{ + int ret = _SUCCESS; + struct submit_ctx sctx; + + rtw_sctx_init23a(&sctx, timeout_ms); + pxmitbuf->sctx = &sctx; + + ret = _rtw_write_port23a(adapter, addr, cnt, pxmitbuf); + + if (ret == _SUCCESS) + ret = rtw_sctx_wait23a(&sctx); + + return ret; +} + +void _rtw_write_port23a_cancel(struct rtw_adapter *adapter) +{ + void (*_write_port_cancel)(struct intf_hdl *pintfhdl); + struct io_priv *pio_priv = &adapter->iopriv; + struct intf_hdl *pintfhdl = &pio_priv->intf; + + _write_port_cancel = pintfhdl->io_ops._write_port_cancel; + + if (_write_port_cancel) + _write_port_cancel(pintfhdl); +} + +int rtw_init_io_priv23a(struct rtw_adapter *padapter, + void (*set_intf_ops)(struct _io_ops *pops)) +{ + struct io_priv *piopriv = &padapter->iopriv; + struct intf_hdl *pintf = &piopriv->intf; + + if (set_intf_ops == NULL) + return _FAIL; + + piopriv->padapter = padapter; + pintf->padapter = padapter; + pintf->pintf_dev = adapter_to_dvobj(padapter); + + set_intf_ops(&pintf->io_ops); + + return _SUCCESS; +} |