158391efdSNathan Chancellor /* SPDX-License-Identifier: GPL-2.0 */ 2554c0a3aSHans de Goede /****************************************************************************** 3554c0a3aSHans de Goede * 4554c0a3aSHans de Goede * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. 5554c0a3aSHans de Goede * 6554c0a3aSHans de Goede ******************************************************************************/ 7554c0a3aSHans de Goede 8554c0a3aSHans de Goede #ifndef _RTW_IO_H_ 9554c0a3aSHans de Goede #define _RTW_IO_H_ 10554c0a3aSHans de Goede 11554c0a3aSHans de Goede #define NUM_IOREQ 8 12554c0a3aSHans de Goede 13554c0a3aSHans de Goede #define MAX_PROT_SZ (64-16) 14554c0a3aSHans de Goede 15554c0a3aSHans de Goede #define _IOREADY 0 16554c0a3aSHans de Goede #define _IO_WAIT_COMPLETE 1 17554c0a3aSHans de Goede #define _IO_WAIT_RSP 2 18554c0a3aSHans de Goede 19554c0a3aSHans de Goede /* IO COMMAND TYPE */ 20554c0a3aSHans de Goede #define _IOSZ_MASK_ (0x7F) 21554c0a3aSHans de Goede #define _IO_WRITE_ BIT(7) 22554c0a3aSHans de Goede #define _IO_FIXED_ BIT(8) 23554c0a3aSHans de Goede #define _IO_BURST_ BIT(9) 24554c0a3aSHans de Goede #define _IO_BYTE_ BIT(10) 25554c0a3aSHans de Goede #define _IO_HW_ BIT(11) 26554c0a3aSHans de Goede #define _IO_WORD_ BIT(12) 27554c0a3aSHans de Goede #define _IO_SYNC_ BIT(13) 28554c0a3aSHans de Goede #define _IO_CMDMASK_ (0x1F80) 29554c0a3aSHans de Goede 30554c0a3aSHans de Goede 31554c0a3aSHans de Goede /* 32554c0a3aSHans de Goede For prompt mode accessing, caller shall free io_req 33554c0a3aSHans de Goede Otherwise, io_handler will free io_req 34554c0a3aSHans de Goede */ 35554c0a3aSHans de Goede 36554c0a3aSHans de Goede 37554c0a3aSHans de Goede 38554c0a3aSHans de Goede /* IO STATUS TYPE */ 39554c0a3aSHans de Goede #define _IO_ERR_ BIT(2) 40554c0a3aSHans de Goede #define _IO_SUCCESS_ BIT(1) 41554c0a3aSHans de Goede #define _IO_DONE_ BIT(0) 42554c0a3aSHans de Goede 43554c0a3aSHans de Goede 44554c0a3aSHans de Goede #define IO_RD32 (_IO_SYNC_ | _IO_WORD_) 45554c0a3aSHans de Goede #define IO_RD16 (_IO_SYNC_ | _IO_HW_) 46554c0a3aSHans de Goede #define IO_RD8 (_IO_SYNC_ | _IO_BYTE_) 47554c0a3aSHans de Goede 48554c0a3aSHans de Goede #define IO_RD32_ASYNC (_IO_WORD_) 49554c0a3aSHans de Goede #define IO_RD16_ASYNC (_IO_HW_) 50554c0a3aSHans de Goede #define IO_RD8_ASYNC (_IO_BYTE_) 51554c0a3aSHans de Goede 52554c0a3aSHans de Goede #define IO_WR32 (_IO_WRITE_ | _IO_SYNC_ | _IO_WORD_) 53554c0a3aSHans de Goede #define IO_WR16 (_IO_WRITE_ | _IO_SYNC_ | _IO_HW_) 54554c0a3aSHans de Goede #define IO_WR8 (_IO_WRITE_ | _IO_SYNC_ | _IO_BYTE_) 55554c0a3aSHans de Goede 56554c0a3aSHans de Goede #define IO_WR32_ASYNC (_IO_WRITE_ | _IO_WORD_) 57554c0a3aSHans de Goede #define IO_WR16_ASYNC (_IO_WRITE_ | _IO_HW_) 58554c0a3aSHans de Goede #define IO_WR8_ASYNC (_IO_WRITE_ | _IO_BYTE_) 59554c0a3aSHans de Goede 60554c0a3aSHans de Goede /* 61554c0a3aSHans de Goede 62554c0a3aSHans de Goede Only Sync. burst accessing is provided. 63554c0a3aSHans de Goede 64554c0a3aSHans de Goede */ 65554c0a3aSHans de Goede 66554c0a3aSHans de Goede #define IO_WR_BURST(x) (_IO_WRITE_ | _IO_SYNC_ | _IO_BURST_ | ((x) & _IOSZ_MASK_)) 67554c0a3aSHans de Goede #define IO_RD_BURST(x) (_IO_SYNC_ | _IO_BURST_ | ((x) & _IOSZ_MASK_)) 68554c0a3aSHans de Goede 69554c0a3aSHans de Goede 70554c0a3aSHans de Goede 71554c0a3aSHans de Goede /* below is for the intf_option bit defition... */ 72554c0a3aSHans de Goede 73554c0a3aSHans de Goede #define _INTF_ASYNC_ BIT(0) /* support async io */ 74554c0a3aSHans de Goede 75554c0a3aSHans de Goede struct intf_priv; 76554c0a3aSHans de Goede struct intf_hdl; 77554c0a3aSHans de Goede struct io_queue; 78554c0a3aSHans de Goede 79554c0a3aSHans de Goede struct _io_ops { 80554c0a3aSHans de Goede u8 (*_read8)(struct intf_hdl *pintfhdl, u32 addr); 81554c0a3aSHans de Goede u16 (*_read16)(struct intf_hdl *pintfhdl, u32 addr); 82554c0a3aSHans de Goede u32 (*_read32)(struct intf_hdl *pintfhdl, u32 addr); 83554c0a3aSHans de Goede 84554c0a3aSHans de Goede int (*_write8)(struct intf_hdl *pintfhdl, u32 addr, u8 val); 85554c0a3aSHans de Goede int (*_write16)(struct intf_hdl *pintfhdl, u32 addr, u16 val); 86554c0a3aSHans de Goede int (*_write32)(struct intf_hdl *pintfhdl, u32 addr, u32 val); 87554c0a3aSHans de Goede int (*_writeN)(struct intf_hdl *pintfhdl, u32 addr, u32 length, u8 *pdata); 88554c0a3aSHans de Goede 89554c0a3aSHans de Goede int (*_write8_async)(struct intf_hdl *pintfhdl, u32 addr, u8 val); 90554c0a3aSHans de Goede int (*_write16_async)(struct intf_hdl *pintfhdl, u32 addr, u16 val); 91554c0a3aSHans de Goede int (*_write32_async)(struct intf_hdl *pintfhdl, u32 addr, u32 val); 92554c0a3aSHans de Goede 93554c0a3aSHans de Goede void (*_read_mem)(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, u8 *pmem); 94554c0a3aSHans de Goede void (*_write_mem)(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, u8 *pmem); 95554c0a3aSHans de Goede 96554c0a3aSHans de Goede void (*_sync_irp_protocol_rw)(struct io_queue *pio_q); 97554c0a3aSHans de Goede 98554c0a3aSHans de Goede u32 (*_read_interrupt)(struct intf_hdl *pintfhdl, u32 addr); 99554c0a3aSHans de Goede 100554c0a3aSHans de Goede u32 (*_read_port)(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, u8 *pmem); 101554c0a3aSHans de Goede u32 (*_write_port)(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, u8 *pmem); 102554c0a3aSHans de Goede 103554c0a3aSHans de Goede u32 (*_write_scsi)(struct intf_hdl *pintfhdl, u32 cnt, u8 *pmem); 104554c0a3aSHans de Goede 105554c0a3aSHans de Goede void (*_read_port_cancel)(struct intf_hdl *pintfhdl); 106554c0a3aSHans de Goede void (*_write_port_cancel)(struct intf_hdl *pintfhdl); 107554c0a3aSHans de Goede }; 108554c0a3aSHans de Goede 109554c0a3aSHans de Goede struct io_req { 110554c0a3aSHans de Goede struct list_head list; 111554c0a3aSHans de Goede u32 addr; 112554c0a3aSHans de Goede volatile u32 val; 113554c0a3aSHans de Goede u32 command; 114554c0a3aSHans de Goede u32 status; 115554c0a3aSHans de Goede u8 *pbuf; 116554c0a3aSHans de Goede 117554c0a3aSHans de Goede void (*_async_io_callback)(struct adapter *padater, struct io_req *pio_req, u8 *cnxt); 118554c0a3aSHans de Goede u8 *cnxt; 119554c0a3aSHans de Goede }; 120554c0a3aSHans de Goede 121554c0a3aSHans de Goede struct intf_hdl { 122554c0a3aSHans de Goede struct adapter *padapter; 123554c0a3aSHans de Goede struct dvobj_priv *pintf_dev;/* pointer to &(padapter->dvobjpriv); */ 124554c0a3aSHans de Goede 125554c0a3aSHans de Goede struct _io_ops io_ops; 126554c0a3aSHans de Goede }; 127554c0a3aSHans de Goede 128554c0a3aSHans de Goede #define SD_IO_TRY_CNT (8) 129554c0a3aSHans de Goede #define MAX_CONTINUAL_IO_ERR SD_IO_TRY_CNT 130554c0a3aSHans de Goede 131554c0a3aSHans de Goede int rtw_inc_and_chk_continual_io_error(struct dvobj_priv *dvobj); 132554c0a3aSHans de Goede void rtw_reset_continual_io_error(struct dvobj_priv *dvobj); 133554c0a3aSHans de Goede 134554c0a3aSHans de Goede /* 135554c0a3aSHans de Goede Below is the data structure used by _io_handler 136554c0a3aSHans de Goede 137554c0a3aSHans de Goede */ 138554c0a3aSHans de Goede 139554c0a3aSHans de Goede struct io_queue { 14000d5865cSMarco Cesati spinlock_t lock; 141554c0a3aSHans de Goede struct list_head free_ioreqs; 142554c0a3aSHans de Goede struct list_head pending; /* The io_req list that will be served in the single protocol read/write. */ 143554c0a3aSHans de Goede struct list_head processing; 144554c0a3aSHans de Goede u8 *free_ioreqs_buf; /* 4-byte aligned */ 145554c0a3aSHans de Goede u8 *pallocated_free_ioreqs_buf; 146554c0a3aSHans de Goede struct intf_hdl intf; 147554c0a3aSHans de Goede }; 148554c0a3aSHans de Goede 149554c0a3aSHans de Goede struct io_priv { 150554c0a3aSHans de Goede 151554c0a3aSHans de Goede struct adapter *padapter; 152554c0a3aSHans de Goede 153554c0a3aSHans de Goede struct intf_hdl intf; 154554c0a3aSHans de Goede 155554c0a3aSHans de Goede }; 156554c0a3aSHans de Goede 157554c0a3aSHans de Goede extern uint ioreq_flush(struct adapter *adapter, struct io_queue *ioqueue); 158554c0a3aSHans de Goede extern void sync_ioreq_enqueue(struct io_req *preq, struct io_queue *ioqueue); 159554c0a3aSHans de Goede extern uint sync_ioreq_flush(struct adapter *adapter, struct io_queue *ioqueue); 160554c0a3aSHans de Goede 161554c0a3aSHans de Goede 162554c0a3aSHans de Goede extern uint free_ioreq(struct io_req *preq, struct io_queue *pio_queue); 163554c0a3aSHans de Goede extern struct io_req *alloc_ioreq(struct io_queue *pio_q); 164554c0a3aSHans de Goede 165554c0a3aSHans de Goede extern uint register_intf_hdl(u8 *dev, struct intf_hdl *pintfhdl); 166554c0a3aSHans de Goede extern void unregister_intf_hdl(struct intf_hdl *pintfhdl); 167554c0a3aSHans de Goede 168554c0a3aSHans de Goede extern void _rtw_attrib_read(struct adapter *adapter, u32 addr, u32 cnt, u8 *pmem); 169554c0a3aSHans de Goede extern void _rtw_attrib_write(struct adapter *adapter, u32 addr, u32 cnt, u8 *pmem); 170554c0a3aSHans de Goede 17151d4aa6dSBryan Brattlof extern u8 rtw_read8(struct adapter *adapter, u32 addr); 1728ff74e43SBryan Brattlof extern u16 rtw_read16(struct adapter *adapter, u32 addr); 17316b1b3c8SBryan Brattlof extern u32 rtw_read32(struct adapter *adapter, u32 addr); 174554c0a3aSHans de Goede 1757f06caf9SBryan Brattlof extern int rtw_write8(struct adapter *adapter, u32 addr, u8 val); 1761c42d72eSBryan Brattlof extern int rtw_write16(struct adapter *adapter, u32 addr, u16 val); 1774d6bfc6fSBryan Brattlof extern int rtw_write32(struct adapter *adapter, u32 addr, u32 val); 178554c0a3aSHans de Goede 179*3bdc1bc6SBryan Brattlof extern u32 rtw_write_port(struct adapter *adapter, u32 addr, u32 cnt, u8 *pmem); 180554c0a3aSHans de Goede 181554c0a3aSHans de Goede extern void rtw_write_scsi(struct adapter *adapter, u32 cnt, u8 *pmem); 182554c0a3aSHans de Goede 183554c0a3aSHans de Goede /* ioreq */ 184554c0a3aSHans de Goede extern void ioreq_read8(struct adapter *adapter, u32 addr, u8 *pval); 185554c0a3aSHans de Goede extern void ioreq_read16(struct adapter *adapter, u32 addr, u16 *pval); 186554c0a3aSHans de Goede extern void ioreq_read32(struct adapter *adapter, u32 addr, u32 *pval); 187554c0a3aSHans de Goede extern void ioreq_write8(struct adapter *adapter, u32 addr, u8 val); 188554c0a3aSHans de Goede extern void ioreq_write16(struct adapter *adapter, u32 addr, u16 val); 189554c0a3aSHans de Goede extern void ioreq_write32(struct adapter *adapter, u32 addr, u32 val); 190554c0a3aSHans de Goede 191554c0a3aSHans de Goede 192554c0a3aSHans de Goede extern uint async_read8(struct adapter *adapter, u32 addr, u8 *pbuff, 193554c0a3aSHans de Goede void (*_async_io_callback)(struct adapter *padater, struct io_req *pio_req, u8 *cnxt), u8 *cnxt); 194554c0a3aSHans de Goede extern uint async_read16(struct adapter *adapter, u32 addr, u8 *pbuff, 195554c0a3aSHans de Goede void (*_async_io_callback)(struct adapter *padater, struct io_req *pio_req, u8 *cnxt), u8 *cnxt); 196554c0a3aSHans de Goede extern uint async_read32(struct adapter *adapter, u32 addr, u8 *pbuff, 197554c0a3aSHans de Goede void (*_async_io_callback)(struct adapter *padater, struct io_req *pio_req, u8 *cnxt), u8 *cnxt); 198554c0a3aSHans de Goede 199554c0a3aSHans de Goede extern void async_read_mem(struct adapter *adapter, u32 addr, u32 cnt, u8 *pmem); 200554c0a3aSHans de Goede extern void async_read_port(struct adapter *adapter, u32 addr, u32 cnt, u8 *pmem); 201554c0a3aSHans de Goede 202554c0a3aSHans de Goede extern void async_write8(struct adapter *adapter, u32 addr, u8 val, 203554c0a3aSHans de Goede void (*_async_io_callback)(struct adapter *padater, struct io_req *pio_req, u8 *cnxt), u8 *cnxt); 204554c0a3aSHans de Goede extern void async_write16(struct adapter *adapter, u32 addr, u16 val, 205554c0a3aSHans de Goede void (*_async_io_callback)(struct adapter *padater, struct io_req *pio_req, u8 *cnxt), u8 *cnxt); 206554c0a3aSHans de Goede extern void async_write32(struct adapter *adapter, u32 addr, u32 val, 207554c0a3aSHans de Goede void (*_async_io_callback)(struct adapter *padater, struct io_req *pio_req, u8 *cnxt), u8 *cnxt); 208554c0a3aSHans de Goede 209554c0a3aSHans de Goede extern void async_write_mem(struct adapter *adapter, u32 addr, u32 cnt, u8 *pmem); 210554c0a3aSHans de Goede extern void async_write_port(struct adapter *adapter, u32 addr, u32 cnt, u8 *pmem); 211554c0a3aSHans de Goede 212554c0a3aSHans de Goede 213554c0a3aSHans de Goede int rtw_init_io_priv(struct adapter *padapter, void (*set_intf_ops)(struct adapter *padapter, struct _io_ops *pops)); 214554c0a3aSHans de Goede 215554c0a3aSHans de Goede 216554c0a3aSHans de Goede extern uint alloc_io_queue(struct adapter *adapter); 217554c0a3aSHans de Goede extern void free_io_queue(struct adapter *adapter); 218554c0a3aSHans de Goede extern void async_bus_io(struct io_queue *pio_q); 219554c0a3aSHans de Goede extern void bus_sync_io(struct io_queue *pio_q); 220554c0a3aSHans de Goede extern u32 _ioreq2rwmem(struct io_queue *pio_q); 221554c0a3aSHans de Goede extern void dev_power_down(struct adapter *Adapter, u8 bpwrup); 222554c0a3aSHans de Goede 223554c0a3aSHans de Goede #endif /* _RTL8711_IO_H_ */ 224