X-Git-Url: https://gerrit.opnfv.org/gerrit/gitweb?a=blobdiff_plain;f=kernel%2Fdrivers%2Fstaging%2Frtl8712%2Frtl871x_io.h;fp=kernel%2Fdrivers%2Fstaging%2Frtl8712%2Frtl871x_io.h;h=070cc03ce3746b6bdf65c69089619d7082710ea5;hb=9ca8dbcc65cfc63d6f5ef3312a33184e1d726e00;hp=0000000000000000000000000000000000000000;hpb=98260f3884f4a202f9ca5eabed40b1354c489b29;p=kvmfornfv.git diff --git a/kernel/drivers/staging/rtl8712/rtl871x_io.h b/kernel/drivers/staging/rtl8712/rtl871x_io.h new file mode 100644 index 000000000..070cc03ce --- /dev/null +++ b/kernel/drivers/staging/rtl8712/rtl871x_io.h @@ -0,0 +1,258 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2010 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. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * Modifications for inclusion into the Linux staging tree are + * Copyright(c) 2010 Larry Finger. All rights reserved. + * + * Contact information: + * WLAN FAE + * Larry Finger + * + ******************************************************************************/ +#ifndef _IO_H_ +#define _IO_H_ + +#include "osdep_service.h" +#include "osdep_intf.h" + +#define NUM_IOREQ 8 + +#define MAX_PROT_SZ (64-16) + +#define _IOREADY 0 +#define _IO_WAIT_COMPLETE 1 +#define _IO_WAIT_RSP 2 + +/* IO COMMAND TYPE */ +#define _IOSZ_MASK_ (0x7F) +#define _IO_WRITE_ BIT(7) +#define _IO_FIXED_ BIT(8) +#define _IO_BURST_ BIT(9) +#define _IO_BYTE_ BIT(10) +#define _IO_HW_ BIT(11) +#define _IO_WORD_ BIT(12) +#define _IO_SYNC_ BIT(13) +#define _IO_CMDMASK_ (0x1F80) + +/* + For prompt mode accessing, caller shall free io_req + Otherwise, io_handler will free io_req +*/ +/* IO STATUS TYPE */ +#define _IO_ERR_ BIT(2) +#define _IO_SUCCESS_ BIT(1) +#define _IO_DONE_ BIT(0) +#define IO_RD32 (_IO_SYNC_ | _IO_WORD_) +#define IO_RD16 (_IO_SYNC_ | _IO_HW_) +#define IO_RD8 (_IO_SYNC_ | _IO_BYTE_) +#define IO_RD32_ASYNC (_IO_WORD_) +#define IO_RD16_ASYNC (_IO_HW_) +#define IO_RD8_ASYNC (_IO_BYTE_) +#define IO_WR32 (_IO_WRITE_ | _IO_SYNC_ | _IO_WORD_) +#define IO_WR16 (_IO_WRITE_ | _IO_SYNC_ | _IO_HW_) +#define IO_WR8 (_IO_WRITE_ | _IO_SYNC_ | _IO_BYTE_) +#define IO_WR32_ASYNC (_IO_WRITE_ | _IO_WORD_) +#define IO_WR16_ASYNC (_IO_WRITE_ | _IO_HW_) +#define IO_WR8_ASYNC (_IO_WRITE_ | _IO_BYTE_) +/* + Only Sync. burst accessing is provided. +*/ +#define IO_WR_BURST(x) (IO_WRITE_ | _IO_SYNC_ | _IO_BURST_ | \ + ((x) & _IOSZ_MASK_)) +#define IO_RD_BURST(x) (_IO_SYNC_ | _IO_BURST_ | ((x) & _IOSZ_MASK_)) +/*below is for the intf_option bit defition...*/ +#define _INTF_ASYNC_ BIT(0) /*support async io*/ +struct intf_priv; +struct intf_hdl; +struct io_queue; +struct _io_ops { + uint (*_sdbus_read_bytes_to_membuf)(struct intf_priv *pintfpriv, + u32 addr, u32 cnt, u8 *pbuf); + uint (*_sdbus_read_blocks_to_membuf)(struct intf_priv *pintfpriv, + u32 addr, u32 cnt, u8 *pbuf); + u8 (*_read8)(struct intf_hdl *pintfhdl, u32 addr); + u16 (*_read16)(struct intf_hdl *pintfhdl, u32 addr); + u32 (*_read32)(struct intf_hdl *pintfhdl, u32 addr); + uint (*_sdbus_write_blocks_from_membuf)(struct intf_priv *pintfpriv, + u32 addr, u32 cnt, u8 *pbuf, + u8 async); + uint (*_sdbus_write_bytes_from_membuf)(struct intf_priv *pintfpriv, + u32 addr, u32 cnt, u8 *pbuf); + u8 (*_cmd52r)(struct intf_priv *pintfpriv, u32 addr); + void (*_cmd52w)(struct intf_priv *pintfpriv, u32 addr, u8 val8); + u8 (*_cmdfunc152r)(struct intf_priv *pintfpriv, u32 addr); + void (*_cmdfunc152w)(struct intf_priv *pintfpriv, u32 addr, u8 val8); + void (*_write8)(struct intf_hdl *pintfhdl, u32 addr, u8 val); + void (*_write16)(struct intf_hdl *pintfhdl, u32 addr, u16 val); + void (*_write32)(struct intf_hdl *pintfhdl, u32 addr, u32 val); + void (*_read_mem)(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, + u8 *pmem); + void (*_write_mem)(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, + u8 *pmem); + void (*_sync_irp_protocol_rw)(struct io_queue *pio_q); + u32 (*_read_port)(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, + u8 *pmem); + u32 (*_write_port)(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, + u8 *pmem); +}; + +struct io_req { + struct list_head list; + u32 addr; + /*volatile*/ u32 val; + u32 command; + u32 status; + u8 *pbuf; + void (*_async_io_callback)(struct _adapter *padapter, + struct io_req *pio_req, u8 *cnxt); + u8 *cnxt; +}; + +struct intf_hdl { + u32 intf_option; + u8 *adapter; + u8 *intf_dev; + struct intf_priv *pintfpriv; + void (*intf_hdl_init)(u8 *priv); + void (*intf_hdl_unload)(u8 *priv); + void (*intf_hdl_open)(u8 *priv); + void (*intf_hdl_close)(u8 *priv); + struct _io_ops io_ops; +}; + +struct reg_protocol_rd { + +#ifdef __LITTLE_ENDIAN + /* DW1 */ + u32 NumOfTrans:4; + u32 Reserved1:4; + u32 Reserved2:24; + /* DW2 */ + u32 ByteCount:7; + u32 WriteEnable:1; /*0:read, 1:write*/ + u32 FixOrContinuous:1; /*0:continuous, 1: Fix*/ + u32 BurstMode:1; + u32 Byte1Access:1; + u32 Byte2Access:1; + u32 Byte4Access:1; + u32 Reserved3:3; + u32 Reserved4:16; + /*DW3*/ + u32 BusAddress; + /*DW4*/ +#else +/*DW1*/ + u32 Reserved1:4; + u32 NumOfTrans:4; + u32 Reserved2:24; + /*DW2*/ + u32 WriteEnable:1; + u32 ByteCount:7; + u32 Reserved3:3; + u32 Byte4Access:1; + u32 Byte2Access:1; + u32 Byte1Access:1; + u32 BurstMode:1; + u32 FixOrContinuous:1; + u32 Reserved4:16; + /*DW3*/ + u32 BusAddress; + /*DW4*/ +#endif +}; + +struct reg_protocol_wt { +#ifdef __LITTLE_ENDIAN + /*DW1*/ + u32 NumOfTrans:4; + u32 Reserved1:4; + u32 Reserved2:24; + /*DW2*/ + u32 ByteCount:7; + u32 WriteEnable:1; /*0:read, 1:write*/ + u32 FixOrContinuous:1; /*0:continuous, 1: Fix*/ + u32 BurstMode:1; + u32 Byte1Access:1; + u32 Byte2Access:1; + u32 Byte4Access:1; + u32 Reserved3:3; + u32 Reserved4:16; + /*DW3*/ + u32 BusAddress; + /*DW4*/ + u32 Value; +#else + /*DW1*/ + u32 Reserved1:4; + u32 NumOfTrans:4; + u32 Reserved2:24; + /*DW2*/ + u32 WriteEnable:1; + u32 ByteCount:7; + u32 Reserved3:3; + u32 Byte4Access:1; + u32 Byte2Access:1; + u32 Byte1Access:1; + u32 BurstMode:1; + u32 FixOrContinuous:1; + u32 Reserved4:16; + /*DW3*/ + u32 BusAddress; + /*DW4*/ + u32 Value; +#endif +}; + +/* +Below is the data structure used by _io_handler +*/ + +struct io_queue { + spinlock_t lock; + struct list_head free_ioreqs; + /*The io_req list that will be served in the single protocol r/w.*/ + struct list_head pending; + struct list_head processing; + u8 *free_ioreqs_buf; /* 4-byte aligned */ + u8 *pallocated_free_ioreqs_buf; + struct intf_hdl intf; +}; + +static inline u32 _RND4(u32 sz) +{ + u32 val; + + val = ((sz >> 2) + ((sz & 3) ? 1 : 0)) << 2; + return val; +} + +u8 r8712_read8(struct _adapter *adapter, u32 addr); +u16 r8712_read16(struct _adapter *adapter, u32 addr); +u32 r8712_read32(struct _adapter *adapter, u32 addr); +void r8712_read_mem(struct _adapter *adapter, u32 addr, u32 cnt, u8 *pmem); +void r8712_read_port(struct _adapter *adapter, u32 addr, u32 cnt, u8 *pmem); +void r8712_write8(struct _adapter *adapter, u32 addr, u8 val); +void r8712_write16(struct _adapter *adapter, u32 addr, u16 val); +void r8712_write32(struct _adapter *adapter, u32 addr, u32 val); +void r8712_write_mem(struct _adapter *adapter, u32 addr, u32 cnt, u8 *pmem); +void r8712_write_port(struct _adapter *adapter, u32 addr, u32 cnt, u8 *pmem); +/*ioreq */ +uint r8712_alloc_io_queue(struct _adapter *adapter); +void r8712_free_io_queue(struct _adapter *adapter); + +#endif /*_RTL8711_IO_H_*/ +