12865d42c78a9121caad52cb02d1fbb7f5cdbc4efLarry Finger/******************************************************************************
22865d42c78a9121caad52cb02d1fbb7f5cdbc4efLarry Finger * rtl8712_io.c
32865d42c78a9121caad52cb02d1fbb7f5cdbc4efLarry Finger *
42865d42c78a9121caad52cb02d1fbb7f5cdbc4efLarry Finger * Copyright(c) 2007 - 2010 Realtek Corporation. All rights reserved.
52865d42c78a9121caad52cb02d1fbb7f5cdbc4efLarry Finger * Linux device driver for RTL8192SU
62865d42c78a9121caad52cb02d1fbb7f5cdbc4efLarry Finger *
72865d42c78a9121caad52cb02d1fbb7f5cdbc4efLarry Finger * This program is free software; you can redistribute it and/or modify it
82865d42c78a9121caad52cb02d1fbb7f5cdbc4efLarry Finger * under the terms of version 2 of the GNU General Public License as
92865d42c78a9121caad52cb02d1fbb7f5cdbc4efLarry Finger * published by the Free Software Foundation.
102865d42c78a9121caad52cb02d1fbb7f5cdbc4efLarry Finger *
112865d42c78a9121caad52cb02d1fbb7f5cdbc4efLarry Finger * This program is distributed in the hope that it will be useful, but WITHOUT
122865d42c78a9121caad52cb02d1fbb7f5cdbc4efLarry Finger * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
132865d42c78a9121caad52cb02d1fbb7f5cdbc4efLarry Finger * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
142865d42c78a9121caad52cb02d1fbb7f5cdbc4efLarry Finger * more details.
152865d42c78a9121caad52cb02d1fbb7f5cdbc4efLarry Finger *
162865d42c78a9121caad52cb02d1fbb7f5cdbc4efLarry Finger * You should have received a copy of the GNU General Public License along with
172865d42c78a9121caad52cb02d1fbb7f5cdbc4efLarry Finger * this program; if not, write to the Free Software Foundation, Inc.,
182865d42c78a9121caad52cb02d1fbb7f5cdbc4efLarry Finger * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
192865d42c78a9121caad52cb02d1fbb7f5cdbc4efLarry Finger *
202865d42c78a9121caad52cb02d1fbb7f5cdbc4efLarry Finger * Modifications for inclusion into the Linux staging tree are
212865d42c78a9121caad52cb02d1fbb7f5cdbc4efLarry Finger * Copyright(c) 2010 Larry Finger. All rights reserved.
222865d42c78a9121caad52cb02d1fbb7f5cdbc4efLarry Finger *
232865d42c78a9121caad52cb02d1fbb7f5cdbc4efLarry Finger * Contact information:
242865d42c78a9121caad52cb02d1fbb7f5cdbc4efLarry Finger * WLAN FAE <wlanfae@realtek.com>.
252865d42c78a9121caad52cb02d1fbb7f5cdbc4efLarry Finger * Larry Finger <Larry.Finger@lwfinger.net>
262865d42c78a9121caad52cb02d1fbb7f5cdbc4efLarry Finger *
272865d42c78a9121caad52cb02d1fbb7f5cdbc4efLarry Finger ******************************************************************************/
282865d42c78a9121caad52cb02d1fbb7f5cdbc4efLarry Finger
292865d42c78a9121caad52cb02d1fbb7f5cdbc4efLarry Finger#define _RTL8712_IO_C_
302865d42c78a9121caad52cb02d1fbb7f5cdbc4efLarry Finger
312865d42c78a9121caad52cb02d1fbb7f5cdbc4efLarry Finger#include "osdep_service.h"
322865d42c78a9121caad52cb02d1fbb7f5cdbc4efLarry Finger#include "drv_types.h"
332865d42c78a9121caad52cb02d1fbb7f5cdbc4efLarry Finger#include "rtl871x_io.h"
342865d42c78a9121caad52cb02d1fbb7f5cdbc4efLarry Finger#include "osdep_intf.h"
352865d42c78a9121caad52cb02d1fbb7f5cdbc4efLarry Finger#include "usb_ops.h"
362865d42c78a9121caad52cb02d1fbb7f5cdbc4efLarry Finger
372865d42c78a9121caad52cb02d1fbb7f5cdbc4efLarry Fingeru8 r8712_read8(struct _adapter *adapter, u32 addr)
382865d42c78a9121caad52cb02d1fbb7f5cdbc4efLarry Finger{
392865d42c78a9121caad52cb02d1fbb7f5cdbc4efLarry Finger	struct io_queue *pio_queue = (struct io_queue *)adapter->pio_queue;
402865d42c78a9121caad52cb02d1fbb7f5cdbc4efLarry Finger	struct intf_hdl *pintfhdl = &(pio_queue->intf);
412865d42c78a9121caad52cb02d1fbb7f5cdbc4efLarry Finger	u8 (*_read8)(struct intf_hdl *pintfhdl, u32 addr);
422865d42c78a9121caad52cb02d1fbb7f5cdbc4efLarry Finger	u8 r_val;
432865d42c78a9121caad52cb02d1fbb7f5cdbc4efLarry Finger
442865d42c78a9121caad52cb02d1fbb7f5cdbc4efLarry Finger	_read8 = pintfhdl->io_ops._read8;
452865d42c78a9121caad52cb02d1fbb7f5cdbc4efLarry Finger	r_val = _read8(pintfhdl, addr);
462865d42c78a9121caad52cb02d1fbb7f5cdbc4efLarry Finger	return r_val;
472865d42c78a9121caad52cb02d1fbb7f5cdbc4efLarry Finger}
482865d42c78a9121caad52cb02d1fbb7f5cdbc4efLarry Finger
492865d42c78a9121caad52cb02d1fbb7f5cdbc4efLarry Fingeru16 r8712_read16(struct _adapter *adapter, u32 addr)
502865d42c78a9121caad52cb02d1fbb7f5cdbc4efLarry Finger{
512865d42c78a9121caad52cb02d1fbb7f5cdbc4efLarry Finger	struct io_queue *pio_queue = (struct io_queue *)adapter->pio_queue;
522865d42c78a9121caad52cb02d1fbb7f5cdbc4efLarry Finger	struct intf_hdl *pintfhdl = &(pio_queue->intf);
532865d42c78a9121caad52cb02d1fbb7f5cdbc4efLarry Finger	u16 (*_read16)(struct intf_hdl *pintfhdl, u32 addr);
542865d42c78a9121caad52cb02d1fbb7f5cdbc4efLarry Finger	u16 r_val;
552865d42c78a9121caad52cb02d1fbb7f5cdbc4efLarry Finger
562865d42c78a9121caad52cb02d1fbb7f5cdbc4efLarry Finger	_read16 = pintfhdl->io_ops._read16;
572865d42c78a9121caad52cb02d1fbb7f5cdbc4efLarry Finger	r_val = _read16(pintfhdl, addr);
582865d42c78a9121caad52cb02d1fbb7f5cdbc4efLarry Finger	return r_val;
592865d42c78a9121caad52cb02d1fbb7f5cdbc4efLarry Finger}
602865d42c78a9121caad52cb02d1fbb7f5cdbc4efLarry Finger
612865d42c78a9121caad52cb02d1fbb7f5cdbc4efLarry Fingeru32 r8712_read32(struct _adapter *adapter, u32 addr)
622865d42c78a9121caad52cb02d1fbb7f5cdbc4efLarry Finger{
632865d42c78a9121caad52cb02d1fbb7f5cdbc4efLarry Finger	struct io_queue *pio_queue = (struct io_queue *)adapter->pio_queue;
642865d42c78a9121caad52cb02d1fbb7f5cdbc4efLarry Finger	struct intf_hdl *pintfhdl = &(pio_queue->intf);
652865d42c78a9121caad52cb02d1fbb7f5cdbc4efLarry Finger	u32 (*_read32)(struct intf_hdl *pintfhdl, u32 addr);
662865d42c78a9121caad52cb02d1fbb7f5cdbc4efLarry Finger	u32 r_val;
672865d42c78a9121caad52cb02d1fbb7f5cdbc4efLarry Finger
682865d42c78a9121caad52cb02d1fbb7f5cdbc4efLarry Finger	_read32 = pintfhdl->io_ops._read32;
692865d42c78a9121caad52cb02d1fbb7f5cdbc4efLarry Finger	r_val = _read32(pintfhdl, addr);
702865d42c78a9121caad52cb02d1fbb7f5cdbc4efLarry Finger	return r_val;
712865d42c78a9121caad52cb02d1fbb7f5cdbc4efLarry Finger}
722865d42c78a9121caad52cb02d1fbb7f5cdbc4efLarry Finger
732865d42c78a9121caad52cb02d1fbb7f5cdbc4efLarry Fingervoid r8712_write8(struct _adapter *adapter, u32 addr, u8 val)
742865d42c78a9121caad52cb02d1fbb7f5cdbc4efLarry Finger{
752865d42c78a9121caad52cb02d1fbb7f5cdbc4efLarry Finger	struct io_queue *pio_queue = (struct io_queue *)adapter->pio_queue;
762865d42c78a9121caad52cb02d1fbb7f5cdbc4efLarry Finger	struct intf_hdl *pintfhdl = &(pio_queue->intf);
772865d42c78a9121caad52cb02d1fbb7f5cdbc4efLarry Finger	void (*_write8)(struct intf_hdl *pintfhdl, u32 addr, u8 val);
782865d42c78a9121caad52cb02d1fbb7f5cdbc4efLarry Finger
792865d42c78a9121caad52cb02d1fbb7f5cdbc4efLarry Finger	_write8 = pintfhdl->io_ops._write8;
802865d42c78a9121caad52cb02d1fbb7f5cdbc4efLarry Finger	_write8(pintfhdl, addr, val);
812865d42c78a9121caad52cb02d1fbb7f5cdbc4efLarry Finger}
822865d42c78a9121caad52cb02d1fbb7f5cdbc4efLarry Finger
832865d42c78a9121caad52cb02d1fbb7f5cdbc4efLarry Fingervoid r8712_write16(struct _adapter *adapter, u32 addr, u16 val)
842865d42c78a9121caad52cb02d1fbb7f5cdbc4efLarry Finger{
852865d42c78a9121caad52cb02d1fbb7f5cdbc4efLarry Finger	struct io_queue *pio_queue = (struct io_queue *)adapter->pio_queue;
862865d42c78a9121caad52cb02d1fbb7f5cdbc4efLarry Finger	struct intf_hdl *pintfhdl = &(pio_queue->intf);
872865d42c78a9121caad52cb02d1fbb7f5cdbc4efLarry Finger
882865d42c78a9121caad52cb02d1fbb7f5cdbc4efLarry Finger	void (*_write16)(struct intf_hdl *pintfhdl, u32 addr, u16 val);
892865d42c78a9121caad52cb02d1fbb7f5cdbc4efLarry Finger	_write16 = pintfhdl->io_ops._write16;
902865d42c78a9121caad52cb02d1fbb7f5cdbc4efLarry Finger	_write16(pintfhdl, addr, val);
912865d42c78a9121caad52cb02d1fbb7f5cdbc4efLarry Finger}
922865d42c78a9121caad52cb02d1fbb7f5cdbc4efLarry Finger
932865d42c78a9121caad52cb02d1fbb7f5cdbc4efLarry Fingervoid r8712_write32(struct _adapter *adapter, u32 addr, u32 val)
942865d42c78a9121caad52cb02d1fbb7f5cdbc4efLarry Finger{
952865d42c78a9121caad52cb02d1fbb7f5cdbc4efLarry Finger	struct io_queue *pio_queue = (struct io_queue *)adapter->pio_queue;
962865d42c78a9121caad52cb02d1fbb7f5cdbc4efLarry Finger	struct intf_hdl *pintfhdl = (struct intf_hdl *)(&(pio_queue->intf));
972865d42c78a9121caad52cb02d1fbb7f5cdbc4efLarry Finger
982865d42c78a9121caad52cb02d1fbb7f5cdbc4efLarry Finger	void (*_write32)(struct intf_hdl *pintfhdl, u32 addr, u32 val);
992865d42c78a9121caad52cb02d1fbb7f5cdbc4efLarry Finger	_write32 = pintfhdl->io_ops._write32;
1002865d42c78a9121caad52cb02d1fbb7f5cdbc4efLarry Finger	_write32(pintfhdl, addr, val);
1012865d42c78a9121caad52cb02d1fbb7f5cdbc4efLarry Finger}
1022865d42c78a9121caad52cb02d1fbb7f5cdbc4efLarry Finger
1032865d42c78a9121caad52cb02d1fbb7f5cdbc4efLarry Fingervoid r8712_read_mem(struct _adapter *adapter, u32 addr, u32 cnt, u8 *pmem)
1042865d42c78a9121caad52cb02d1fbb7f5cdbc4efLarry Finger{
1052865d42c78a9121caad52cb02d1fbb7f5cdbc4efLarry Finger	struct io_queue *pio_queue = (struct io_queue *)adapter->pio_queue;
1062865d42c78a9121caad52cb02d1fbb7f5cdbc4efLarry Finger	struct intf_hdl *pintfhdl = &(pio_queue->intf);
1072865d42c78a9121caad52cb02d1fbb7f5cdbc4efLarry Finger
1082865d42c78a9121caad52cb02d1fbb7f5cdbc4efLarry Finger	void (*_read_mem)(struct intf_hdl *pintfhdl, u32 addr, u32 cnt,
1092865d42c78a9121caad52cb02d1fbb7f5cdbc4efLarry Finger			  u8 *pmem);
1102865d42c78a9121caad52cb02d1fbb7f5cdbc4efLarry Finger	if ((adapter->bDriverStopped == true) ||
1112865d42c78a9121caad52cb02d1fbb7f5cdbc4efLarry Finger	    (adapter->bSurpriseRemoved == true))
1122865d42c78a9121caad52cb02d1fbb7f5cdbc4efLarry Finger		return;
1132865d42c78a9121caad52cb02d1fbb7f5cdbc4efLarry Finger	_read_mem = pintfhdl->io_ops._read_mem;
1142865d42c78a9121caad52cb02d1fbb7f5cdbc4efLarry Finger	_read_mem(pintfhdl, addr, cnt, pmem);
1152865d42c78a9121caad52cb02d1fbb7f5cdbc4efLarry Finger}
1162865d42c78a9121caad52cb02d1fbb7f5cdbc4efLarry Finger
1172865d42c78a9121caad52cb02d1fbb7f5cdbc4efLarry Fingervoid r8712_write_mem(struct _adapter *adapter, u32 addr, u32 cnt, u8 *pmem)
1182865d42c78a9121caad52cb02d1fbb7f5cdbc4efLarry Finger{
1192865d42c78a9121caad52cb02d1fbb7f5cdbc4efLarry Finger	struct io_queue *pio_queue = (struct io_queue *)adapter->pio_queue;
1202865d42c78a9121caad52cb02d1fbb7f5cdbc4efLarry Finger	struct intf_hdl *pintfhdl = &(pio_queue->intf);
1212865d42c78a9121caad52cb02d1fbb7f5cdbc4efLarry Finger	void (*_write_mem)(struct intf_hdl *pintfhdl, u32 addr, u32 cnt,
1222865d42c78a9121caad52cb02d1fbb7f5cdbc4efLarry Finger			   u8 *pmem);
1232865d42c78a9121caad52cb02d1fbb7f5cdbc4efLarry Finger
1242865d42c78a9121caad52cb02d1fbb7f5cdbc4efLarry Finger	_write_mem = pintfhdl->io_ops._write_mem;
1252865d42c78a9121caad52cb02d1fbb7f5cdbc4efLarry Finger	_write_mem(pintfhdl, addr, cnt, pmem);
1262865d42c78a9121caad52cb02d1fbb7f5cdbc4efLarry Finger}
1272865d42c78a9121caad52cb02d1fbb7f5cdbc4efLarry Finger
1282865d42c78a9121caad52cb02d1fbb7f5cdbc4efLarry Fingervoid r8712_read_port(struct _adapter *adapter, u32 addr, u32 cnt, u8 *pmem)
1292865d42c78a9121caad52cb02d1fbb7f5cdbc4efLarry Finger{
1302865d42c78a9121caad52cb02d1fbb7f5cdbc4efLarry Finger	struct io_queue *pio_queue = (struct io_queue *)adapter->pio_queue;
1312865d42c78a9121caad52cb02d1fbb7f5cdbc4efLarry Finger	struct intf_hdl	*pintfhdl = &(pio_queue->intf);
1322865d42c78a9121caad52cb02d1fbb7f5cdbc4efLarry Finger
1332865d42c78a9121caad52cb02d1fbb7f5cdbc4efLarry Finger	u32 (*_read_port)(struct intf_hdl *pintfhdl, u32 addr, u32 cnt,
1342865d42c78a9121caad52cb02d1fbb7f5cdbc4efLarry Finger			  u8 *pmem);
1352865d42c78a9121caad52cb02d1fbb7f5cdbc4efLarry Finger	if ((adapter->bDriverStopped == true) ||
1362865d42c78a9121caad52cb02d1fbb7f5cdbc4efLarry Finger	    (adapter->bSurpriseRemoved == true))
1372865d42c78a9121caad52cb02d1fbb7f5cdbc4efLarry Finger		return;
1382865d42c78a9121caad52cb02d1fbb7f5cdbc4efLarry Finger	_read_port = pintfhdl->io_ops._read_port;
1392865d42c78a9121caad52cb02d1fbb7f5cdbc4efLarry Finger	_read_port(pintfhdl, addr, cnt, pmem);
1402865d42c78a9121caad52cb02d1fbb7f5cdbc4efLarry Finger}
1412865d42c78a9121caad52cb02d1fbb7f5cdbc4efLarry Finger
1422865d42c78a9121caad52cb02d1fbb7f5cdbc4efLarry Fingervoid r8712_write_port(struct _adapter *adapter, u32 addr, u32 cnt, u8 *pmem)
1432865d42c78a9121caad52cb02d1fbb7f5cdbc4efLarry Finger{
1442865d42c78a9121caad52cb02d1fbb7f5cdbc4efLarry Finger	struct io_queue *pio_queue = (struct io_queue *)adapter->pio_queue;
1452865d42c78a9121caad52cb02d1fbb7f5cdbc4efLarry Finger	struct intf_hdl *pintfhdl = &(pio_queue->intf);
1462865d42c78a9121caad52cb02d1fbb7f5cdbc4efLarry Finger
1472865d42c78a9121caad52cb02d1fbb7f5cdbc4efLarry Finger	u32 (*_write_port)(struct intf_hdl *pintfhdl, u32 addr, u32 cnt,
1482865d42c78a9121caad52cb02d1fbb7f5cdbc4efLarry Finger			   u8 *pmem);
1492865d42c78a9121caad52cb02d1fbb7f5cdbc4efLarry Finger	_write_port = pintfhdl->io_ops._write_port;
1502865d42c78a9121caad52cb02d1fbb7f5cdbc4efLarry Finger	_write_port(pintfhdl, addr, cnt, pmem);
1512865d42c78a9121caad52cb02d1fbb7f5cdbc4efLarry Finger}
152