#include <linux/module.h>
#include <linux/mmc/host.h>
#include <linux/mmc/sdio_func.h>
#include "main.h"
#include "debug.h"
#include "fw.h"
#include "ps.h"
#include "reg.h"
#include "rx.h"
#include "sdio.h"
#include "tx.h"
#define RTW_SDIO_INDIRECT_RW_RETRIES …
static bool rtw_sdio_is_bus_addr(u32 addr)
{ … }
static bool rtw_sdio_bus_claim_needed(struct rtw_sdio *rtwsdio)
{ … }
static u32 rtw_sdio_to_bus_offset(struct rtw_dev *rtwdev, u32 addr)
{ … }
static bool rtw_sdio_use_memcpy_io(struct rtw_dev *rtwdev, u32 addr,
u8 alignment)
{ … }
static void rtw_sdio_writel(struct rtw_dev *rtwdev, u32 val, u32 addr,
int *err_ret)
{ … }
static void rtw_sdio_writew(struct rtw_dev *rtwdev, u16 val, u32 addr,
int *err_ret)
{ … }
static u32 rtw_sdio_readl(struct rtw_dev *rtwdev, u32 addr, int *err_ret)
{ … }
static u16 rtw_sdio_readw(struct rtw_dev *rtwdev, u32 addr, int *err_ret)
{ … }
static u32 rtw_sdio_to_io_address(struct rtw_dev *rtwdev, u32 addr,
bool direct)
{ … }
static bool rtw_sdio_use_direct_io(struct rtw_dev *rtwdev, u32 addr)
{ … }
static int rtw_sdio_indirect_reg_cfg(struct rtw_dev *rtwdev, u32 addr, u32 cfg)
{ … }
static u8 rtw_sdio_indirect_read8(struct rtw_dev *rtwdev, u32 addr,
int *err_ret)
{ … }
static int rtw_sdio_indirect_read_bytes(struct rtw_dev *rtwdev, u32 addr,
u8 *buf, int count)
{ … }
static u16 rtw_sdio_indirect_read16(struct rtw_dev *rtwdev, u32 addr,
int *err_ret)
{ … }
static u32 rtw_sdio_indirect_read32(struct rtw_dev *rtwdev, u32 addr,
int *err_ret)
{ … }
static u8 rtw_sdio_read8(struct rtw_dev *rtwdev, u32 addr)
{ … }
static u16 rtw_sdio_read16(struct rtw_dev *rtwdev, u32 addr)
{ … }
static u32 rtw_sdio_read32(struct rtw_dev *rtwdev, u32 addr)
{ … }
static void rtw_sdio_indirect_write8(struct rtw_dev *rtwdev, u8 val, u32 addr,
int *err_ret)
{ … }
static void rtw_sdio_indirect_write16(struct rtw_dev *rtwdev, u16 val, u32 addr,
int *err_ret)
{ … }
static void rtw_sdio_indirect_write32(struct rtw_dev *rtwdev, u32 val,
u32 addr, int *err_ret)
{ … }
static void rtw_sdio_write8(struct rtw_dev *rtwdev, u32 addr, u8 val)
{ … }
static void rtw_sdio_write16(struct rtw_dev *rtwdev, u32 addr, u16 val)
{ … }
static void rtw_sdio_write32(struct rtw_dev *rtwdev, u32 addr, u32 val)
{ … }
static u32 rtw_sdio_get_tx_addr(struct rtw_dev *rtwdev, size_t size,
enum rtw_tx_queue_type queue)
{
u32 txaddr;
switch (queue) {
case RTW_TX_QUEUE_BCN:
case RTW_TX_QUEUE_H2C:
case RTW_TX_QUEUE_HI0:
txaddr = FIELD_PREP(REG_SDIO_CMD_ADDR_MSK,
REG_SDIO_CMD_ADDR_TXFF_HIGH);
break;
case RTW_TX_QUEUE_VI:
case RTW_TX_QUEUE_VO:
txaddr = FIELD_PREP(REG_SDIO_CMD_ADDR_MSK,
REG_SDIO_CMD_ADDR_TXFF_NORMAL);
break;
case RTW_TX_QUEUE_BE:
case RTW_TX_QUEUE_BK:
txaddr = FIELD_PREP(REG_SDIO_CMD_ADDR_MSK,
REG_SDIO_CMD_ADDR_TXFF_LOW);
break;
case RTW_TX_QUEUE_MGMT:
txaddr = FIELD_PREP(REG_SDIO_CMD_ADDR_MSK,
REG_SDIO_CMD_ADDR_TXFF_EXTRA);
break;
default:
rtw_warn(rtwdev, "Unsupported queue for TX addr: 0x%02x\n",
queue);
return 0;
}
txaddr += DIV_ROUND_UP(size, 4);
return txaddr;
};
static int rtw_sdio_read_port(struct rtw_dev *rtwdev, u8 *buf, size_t count)
{ … }
static int rtw_sdio_check_free_txpg(struct rtw_dev *rtwdev, u8 queue,
size_t count)
{ … }
static int rtw_sdio_write_port(struct rtw_dev *rtwdev, struct sk_buff *skb,
enum rtw_tx_queue_type queue)
{ … }
static void rtw_sdio_init(struct rtw_dev *rtwdev)
{ … }
static void rtw_sdio_enable_rx_aggregation(struct rtw_dev *rtwdev)
{ … }
static void rtw_sdio_enable_interrupt(struct rtw_dev *rtwdev)
{ … }
static void rtw_sdio_disable_interrupt(struct rtw_dev *rtwdev)
{ … }
static u8 rtw_sdio_get_tx_qsel(struct rtw_dev *rtwdev, struct sk_buff *skb,
u8 queue)
{ … }
static int rtw_sdio_setup(struct rtw_dev *rtwdev)
{ … }
static int rtw_sdio_start(struct rtw_dev *rtwdev)
{ … }
static void rtw_sdio_stop(struct rtw_dev *rtwdev)
{ … }
static void rtw_sdio_deep_ps_enter(struct rtw_dev *rtwdev)
{ … }
static void rtw_sdio_deep_ps_leave(struct rtw_dev *rtwdev)
{ … }
static void rtw_sdio_deep_ps(struct rtw_dev *rtwdev, bool enter)
{ … }
static void rtw_sdio_tx_kick_off(struct rtw_dev *rtwdev)
{ … }
static void rtw_sdio_link_ps(struct rtw_dev *rtwdev, bool enter)
{ … }
static void rtw_sdio_interface_cfg(struct rtw_dev *rtwdev)
{ … }
static struct rtw_sdio_tx_data *rtw_sdio_get_tx_data(struct sk_buff *skb)
{ … }
static void rtw_sdio_tx_skb_prepare(struct rtw_dev *rtwdev,
struct rtw_tx_pkt_info *pkt_info,
struct sk_buff *skb,
enum rtw_tx_queue_type queue)
{ … }
static int rtw_sdio_write_data(struct rtw_dev *rtwdev,
struct rtw_tx_pkt_info *pkt_info,
struct sk_buff *skb,
enum rtw_tx_queue_type queue)
{ … }
static int rtw_sdio_write_data_rsvd_page(struct rtw_dev *rtwdev, u8 *buf,
u32 size)
{ … }
static int rtw_sdio_write_data_h2c(struct rtw_dev *rtwdev, u8 *buf, u32 size)
{ … }
static int rtw_sdio_tx_write(struct rtw_dev *rtwdev,
struct rtw_tx_pkt_info *pkt_info,
struct sk_buff *skb)
{ … }
static void rtw_sdio_tx_err_isr(struct rtw_dev *rtwdev)
{ … }
static void rtw_sdio_rx_skb(struct rtw_dev *rtwdev, struct sk_buff *skb,
u32 pkt_offset, struct rtw_rx_pkt_stat *pkt_stat,
struct ieee80211_rx_status *rx_status)
{ … }
static void rtw_sdio_rxfifo_recv(struct rtw_dev *rtwdev, u32 rx_len)
{ … }
static void rtw_sdio_rx_isr(struct rtw_dev *rtwdev)
{ … }
static void rtw_sdio_handle_interrupt(struct sdio_func *sdio_func)
{ … }
static int __maybe_unused rtw_sdio_suspend(struct device *dev)
{ … }
static int __maybe_unused rtw_sdio_resume(struct device *dev)
{ … }
SIMPLE_DEV_PM_OPS(rtw_sdio_pm_ops, rtw_sdio_suspend, rtw_sdio_resume);
EXPORT_SYMBOL(…);
static int rtw_sdio_claim(struct rtw_dev *rtwdev, struct sdio_func *sdio_func)
{ … }
static void rtw_sdio_declaim(struct rtw_dev *rtwdev,
struct sdio_func *sdio_func)
{ … }
static struct rtw_hci_ops rtw_sdio_ops = …;
static int rtw_sdio_request_irq(struct rtw_dev *rtwdev,
struct sdio_func *sdio_func)
{ … }
static void rtw_sdio_indicate_tx_status(struct rtw_dev *rtwdev,
struct sk_buff *skb)
{ … }
static void rtw_sdio_process_tx_queue(struct rtw_dev *rtwdev,
enum rtw_tx_queue_type queue)
{ … }
static void rtw_sdio_tx_handler(struct work_struct *work)
{ … }
static void rtw_sdio_free_irq(struct rtw_dev *rtwdev,
struct sdio_func *sdio_func)
{ … }
static int rtw_sdio_init_tx(struct rtw_dev *rtwdev)
{ … }
static void rtw_sdio_deinit_tx(struct rtw_dev *rtwdev)
{ … }
int rtw_sdio_probe(struct sdio_func *sdio_func,
const struct sdio_device_id *id)
{ … }
EXPORT_SYMBOL(…);
void rtw_sdio_remove(struct sdio_func *sdio_func)
{ … }
EXPORT_SYMBOL(…);
void rtw_sdio_shutdown(struct device *dev)
{ … }
EXPORT_SYMBOL(…);
MODULE_AUTHOR(…) …;
MODULE_AUTHOR(…) …;
MODULE_DESCRIPTION(…) …;
MODULE_LICENSE(…) …;