Path: blob/master/ALFA-W1F1/RTL8814AU/core/rtw_sdio.c
1307 views
/******************************************************************************1*2* Copyright(c) 2015 - 2019 Realtek Corporation.3*4* This program is free software; you can redistribute it and/or modify it5* under the terms of version 2 of the GNU General Public License as6* published by the Free Software Foundation.7*8* This program is distributed in the hope that it will be useful, but WITHOUT9* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or10* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for11* more details.12*13*****************************************************************************/14#define _RTW_SDIO_C_1516#include <drv_types.h> /* struct dvobj_priv and etc. */17#include <drv_types_sdio.h> /* RTW_SDIO_ADDR_CMD52_GEN */1819/*20* Description:21* Use SDIO cmd52 or cmd53 to read/write data22*23* Parameters:24* d pointer of device object(struct dvobj_priv)25* addr SDIO address, 17 bits26* buf buffer for I/O27* len length28* write 0:read, 1:write29* cmd52 0:cmd52, 1:cmd5330*31* Return:32* _SUCCESS I/O ok.33* _FAIL I/O fail.34*/35static u8 sdio_io(struct dvobj_priv *d, u32 addr, void *buf, size_t len, u8 write, u8 cmd52)36{37#ifdef DBG_SDIO38#if (DBG_SDIO >= 3)39struct sdio_data *sdio;40#endif /* DBG_SDIO >= 3 */41#endif /* DBG_SDIO */42u32 addr_drv; /* address with driver defined bit */43int err;44u8 retry = 0;45u8 stop_retry = _FALSE; /* flag for stopping retry or not */464748#ifdef DBG_SDIO49#if (DBG_SDIO >= 3)50sdio = &d->intf_data;51#endif /* DBG_SDIO >= 3 */52#endif /* DBG_SDIO */5354if (rtw_is_surprise_removed(dvobj_get_primary_adapter(d))) {55RTW_ERR("%s: bSurpriseRemoved, skip %s 0x%05x, %zu bytes\n",56__FUNCTION__, write?"write":"read", addr, len);57return _FAIL;58}5960addr_drv = addr;61if (cmd52)62addr_drv = RTW_SDIO_ADDR_CMD52_GEN(addr_drv);6364do {65if (write)66err = d->intf_ops->write(d, addr_drv, buf, len, 0);67else68err = d->intf_ops->read(d, addr_drv, buf, len, 0);69if (!err) {70if (retry) {71RTW_INFO("%s: Retry %s OK! addr=0x%05x %zu bytes, retry=%u,%u\n",72__FUNCTION__, write?"write":"read",73addr, len, retry, ATOMIC_READ(&d->continual_io_error));74RTW_INFO_DUMP("Data: ", buf, len);75}76rtw_reset_continual_io_error(d);77break;78}79RTW_ERR("%s: %s FAIL! error(%d) addr=0x%05x %zu bytes, retry=%u,%u\n",80__FUNCTION__, write?"write":"read", err, addr, len,81retry, ATOMIC_READ(&d->continual_io_error));8283#ifdef DBG_SDIO84#if (DBG_SDIO >= 3)85if (sdio->dbg_enable) {86if (sdio->err_test && sdio->err_test_triggered)87sdio->err_test = 0;8889if (sdio->err_stop) {90RTW_ERR("%s: I/O error! Set surprise remove flag ON!\n",91__FUNCTION__);92rtw_set_surprise_removed(dvobj_get_primary_adapter(d));93return _FAIL;94}95}96#endif /* DBG_SDIO >= 3 */97#endif /* DBG_SDIO */9899retry++;100stop_retry = rtw_inc_and_chk_continual_io_error(d);101if ((err == -1) || (stop_retry == _TRUE) || (retry > SD_IO_TRY_CNT)) {102/* critical error, unrecoverable */103RTW_ERR("%s: Fatal error! Set surprise remove flag ON! (retry=%u,%u)\n",104__FUNCTION__, retry, ATOMIC_READ(&d->continual_io_error));105rtw_set_surprise_removed(dvobj_get_primary_adapter(d));106return _FAIL;107}108109/* WLAN IOREG or SDIO Local */110if ((addr & 0x10000) || !(addr & 0xE000)) {111RTW_WARN("%s: Retry %s addr=0x%05x %zu bytes, retry=%u,%u\n",112__FUNCTION__, write?"write":"read", addr, len,113retry, ATOMIC_READ(&d->continual_io_error));114continue;115}116return _FAIL;117} while (1);118119return _SUCCESS;120}121122u8 rtw_sdio_read_cmd52(struct dvobj_priv *d, u32 addr, void *buf, size_t len)123{124return sdio_io(d, addr, buf, len, 0, 1);125}126127u8 rtw_sdio_read_cmd53(struct dvobj_priv *d, u32 addr, void *buf, size_t len)128{129return sdio_io(d, addr, buf, len, 0, 0);130}131132u8 rtw_sdio_write_cmd52(struct dvobj_priv *d, u32 addr, void *buf, size_t len)133{134return sdio_io(d, addr, buf, len, 1, 1);135}136137u8 rtw_sdio_write_cmd53(struct dvobj_priv *d, u32 addr, void *buf, size_t len)138{139return sdio_io(d, addr, buf, len, 1, 0);140}141142u8 rtw_sdio_f0_read(struct dvobj_priv *d, u32 addr, void *buf, size_t len)143{144int err;145u8 ret;146147148ret = _SUCCESS;149addr = RTW_SDIO_ADDR_F0_GEN(addr);150151err = d->intf_ops->read(d, addr, buf, len, 0);152if (err)153ret = _FAIL;154155return ret;156}157158159